全国各地の漁港データをJSONデータ化したお話🦾。#php #map

2022.12.07

Logging

おはようございます、昨日は晴れていましたね☼。

そんなお天気な日に漁港座標データXMLをJSONデータ化しておりました。国土交通省のデータを加工しJSONデータに加工するのはそんな難しい問題じゃないかなって思っていたのですが、データが重たい、中身のXMLデータは名前空間使っているなどという面倒くさい仕様になっておりました。名前空間の対応は、こちらのQiitaの記事を参照してほぼコピペで自分のコードに追加しました。

だた追加しただけでは、あんなツイートしたJSON構造にならないので細工しています。自分が必要なのは漁港名と座標軸だけなので、これだけで良い感じです。

preg_grep("/".$val->{"@attributes"}->id."/",$name);

因みにXMLファイルが重いので自分はデータを分割しました(エラーが出力されるので)。php.iniの設定は変えたくなかったので分割と加工をしたわけです。座標データと漁港名に分割して上記のコード等を使用しJSONファイルを出力。このJSONコードを元にオープンストリートマップ(OpenStreetMap)とかでサービスを作ることが出来ますが、このデータは非商用なので使い物にならないかな…🤔。データの販売等や二次配布は禁止だけど、データ活用は禁止していないように取れるので詳しく調べてみます🙄。

追記:都道府県を追加してみました

タグ

attributes, grep, gt, ID, json, map, name, php, preg, qiita, quot, val, xml, お話, コード, こちら, コピペ, これだけ, ツイート, データ, ファイル, 中身, 仕様, 全国, 分割, 加工, 参照, 各地, 名前, 問題, 国土交通省, 天気, 対応, 座標, 座標軸, 必要, 感じ, , 昨日, 構造, 漁港, 空間, 細工, 自分, 記事, 追加,

びっくり髭剃りスムースが凄い! #ニベアメンシェービングフォームスムース

2022.12.06

Logging

おはようございます、高知県はどんより曇り空が続きますね🙄今日はどうかな?

今日は昨日、使用したシェービングフォームスムースの話を書きます。女性には全然関係ない話なのでスルーしてください。今までシェービングフォームスムースは外国製のスムースを使用していましたが、この度、日本製のシェービングフォームスムースを使用してみようかなって思って使ってみました。

使用してみてめちゃ驚きです😳、泡が今までと全然違うし本当に泡が分厚いです!!。髭を剃った感覚も今までよりも綺麗に剃れたような気がします。

そして、何だか理髪店のシェービングフォームスムースのような香りもするし、なんかすごいよコレ。因みに自分は一昔前までは電動髭剃りで剃ってたのだけど、この頃は自分で剃るようになりました、その理由は肌荒れがあるから仕方無く剃るようになったですが、今ではそれ程苦にならないぐらいになりました。

タグ

アメン, コレ, シェービング, スムーズ, スルー, ニベ, びっくり, フォーム, , , 今日, 使用, 外国, 女性, , 感覚, 日本, , 昨日, 曇り空, 本当, , , 理由, 理髪店, 綺麗, 肌荒れ, 自分, , , 電動, , 高知県, , 髭剃り,

Excelでは読み込むことができないような大容量のデータもPowerQueryでは処理できます😤。 #PowerQueryExcel #30万件

2022.12.02

Logging

おはようございます、昨日からいきなり寒くなりましたね。🍃

30万件のダミーデータの作り方を記載します、まずは1万件のダミーデータをこちらのサイトで生成します。後はフォルダを構えてその中にダウンロードしてきたファイルを置き、そのファイルを30回複製します、その後PowerQueryで操作する(フォルダを開く)ことにより、簡単に30万件のダミーデータが作れます、なお、一つのエクセルファイルをPowerQueryで開き1万行をコピーアンドペーストする事を繰り返すことでも同じくダミーデータは作れます。

PowerQueryはこちらから無料でダウンロードできますので、ご使用ください。操作手順等はYOUTUBEでPowerQueryと検索するといろいろな解説がありますのでそちらを参照くださいませ。例えばこちらの動画など🙄

【データベースを一瞬で作れるPowerQueryが神】Excelパワークエリの使い方・メリット

タグ

, 30, Excel, PowerQuery, PowerQueryExcel, youtube, アンド, いろいろ, エクセル, こちら, こと, コピー, サイト, そちら, ダウンロード, ダミー, データ, ファイル, フォルダ, ペースト, 一つ, , , , 作り方, 使用, 処理, 動画, 参照, 容量, , 手順, 操作, 昨日, 検索, 無料, 簡単, 複製, 解説, 記載,

理詰め。そんなに変わるだろうかと思う反面。 #人工知能 #シンギュラリティ

2022.11.25

Logging

おはようございます、祝日の昨日は雨でしたね😗。今日は3記事ほど予約投稿出来ました。

そんな中、PIVOTの対談を朝(夜も)から観ていました。佐々木さんと対談された落合陽一さん。落合陽一さん曰く、シンギュラリティは再来年にはやってくるだそうです。

【落合陽一のシンギュラリティ論】シンギュラリティは2025年に来る/ディフュージョンモデルの衝撃/知的ホワイトカラーが没落する/最新版デジタルネイチャー/音楽と論文が数秒でできる

落合陽一さんが得意ではない方もいるかと思いますが、聞いていて日本は遅れているなというのは良くわかります。英語圏の方は人工知能を使用して絵を作成したり、音楽を作成したりすることが容易に出来るけど、日本人は英語力がない人が多いのでテキストで思い通りに人工知能に指示することが出来ない。

【落合陽一の未来予測】シンギュラリティ後の世界と人間/大恋愛時代が来る/国家意識が薄れ、戦争が増える/自分以外は死なない/ロボットが消費者に/体を鍛えて、感じよく生きよ/ビジネス書は意味がない
デジタルネイチャー時代

そんな感じなので、絵を創作するならstability.ai、音楽を創作するならmubert(Mubert-Text-to-Music)を落合陽一さんが使用していたように海外の人たちは、もうこういうツールを使い始めています。日本だけが特殊な環境にあるなって思うところはあります。いろいろな分野にAI(人工知能)が浸透していくのは時間の問題かもしれないと思います。

特にホワイトカラー職は大手から変わるじゃないかと思います。下請けに外注していた単純作業などは恐らくAIに取って代わられる運命に有ると思います。猫も杓子もAIを使いだしたら、世の中は大きく変わるじゃないかな・・・。

タグ

, AI, mubert, Mubert-Text-to-Music, PIVOT, stability, こと, シンギュラリティ, ツール, テキスト, デジタル, ネイチャー, , 予約, , 人工, 今日, 佐々木, 作成, 使用, 再来年, 創作, 反面, , 容易, 対談, 得意, 思い通り, 感じ, 投稿, 指示, , 日本, 日本人, 昨日, 時代, 曰く, , 海外, 理詰め, 知能, 祝日, , 英語力, 英語圏, 落合, 記事, 陽一, , 音楽,

諦めたいと思った時が続ける時だ。 #KeepGoing

2022.11.24

Logging

おはようございます、昨日はPM4時頃から晴れましたね、高知県の話ですけどw。

さて祝日後の仕事は憂鬱かもですね。そんなモチベーションを下がった時に見る動画。動画でも強調している継続(努力)出来ない人が多い、継続は力なんだと思いますよ。

継続こそ最大の力なり -KEEP GOING-【モチベーション動画・継続系】- Motivational Speech

因みに、仕事で大事なのは何かと言えば気持ちです。前向きな気持ちになれる環境が大事になります、人を貶しているような環境の職場ヤバい、そんな環境では生産性は上がりません。そういうのは伝染します、そうなったら足の引っ張り合いが始まり大きな発展はしません。

環境作りは大事だということ、皆がやるぞという環境を作るのが上司の役割なのかなって思います、ダメなものはダメだという意識付けが大事なんだと思います。

マインドが大事、それは技術よりもです、技術は熟していくと最低限の技術は付きます。人を称えない会社に未来あるのかな🤔。

頑張りましょう、いってらっしゃい!!。

タグ

4, KeepGoing, PM, , こと, それ, ため, マインド, モチベーション, もの, 上司, , 仕事, 会社, 伝染, , 前向き, , 努力, 動画, 大事, 強調, 役割, 意識, 憂鬱, 技術, 昨日, , 最低限, 未来, 気持ち, 環境, 生産性, 発展, , 祝日, 継続, 職場, , , 高知県,

映画、イントゥ・ザ・スカイ~気球でみらいを変えたふたり #アマプラ

2022.11.13

Logging

おはようございます、昨日は晴天でしたね、この頃、暖かい日が続きます。

さて、遅ればせながら映画、イントゥ・ザ・スカイ~気球でみらいを変えたふたりを観ましたので感想を残しときます。実話を着色した映画になっていますが、よく出来ている映画。映画をあまり観ない人には悪くない評価を得そうな映画です。

【公式】『イントゥ・ザ・スカイ 気球で未来を変えたふたり』2020年1月17日(金)公開/本予告
イントゥ・ザ・スカイ~気球でみらいを変えたふたり~

自分の場合、映画をよく観ているので、ストーリー展開が在り来りかなと思えてしまってどうも見応えたっぷりだったとは言えなかったですが、これは自分の主観なので一般人とはズレているのかなと思います。

まとめ、映画の予告を観て観たいと思った方は観てみても良いじゃないかと思います。

タグ

アマ, イントゥ, これ, , スカイ, ストーリー, ズレ, , ふたり, プラ, ミライ, 一般人, 主観, 予告, , 場合, 実話, 展開, 感想, , , 映画, 昨日, 晴天, 気球, 着色, 自分, 見応え, 評価, ,

データからページネーションが出来る。 #jscode

2022.11.10

Logging

おはようございます、昨日は朝が寒く昼間は暑い日でしたね😗。

さて、データからページネーションが出来るライブラリがある事を知りましたのでそちらの紹介と使い方です。今回、使用したのはPagination.jsというライブラリです。使い方は簡単、下記のようなデータがあった場合、このようなソースコードを書いて使用します😮。

[
  {
    "id": 1,
    "name": "白川 正人",
    "hiragana": "しらかわ まさと",
    "age": "45",
    "bday": "1977年04月10日"
  },
  {
    "id": 2,
    "name": "大村 麻衣子",
    "hiragana": "おおむら まいこ",
    "age": "42",
    "bday": "1979年12月11日"
  },
  {
    "id": 3,
    "name": "大原 静香",
    "hiragana": "おおはら しずか",
    "age": "53",
    "bday": "1969年06月20日"
  },
  {
    "id": 4,
    "name": "吉田 佐代子",
    "hiragana": "よしだ さよこ",
    "age": "40",
    "bday": "1982年05月24日"
  },
  {
    "id": 5,
    "name": "宮原 和弘",
    "hiragana": "みやはら かずひろ",
    "age": "22",
    "bday": "2000年04月29日"
  },
  {
    "id": 6,
    "name": "伊藤 二郎",
    "hiragana": "いとう じろう",
    "age": "27",
    "bday": "1995年02月18日"
  },
  {
    "id": 7,
    "name": "井上 明子",
    "hiragana": "いのうえ あきこ",
    "age": "55",
    "bday": "1967年06月26日"
  },
  {
    "id": 8,
    "name": "恩田 雄",
    "hiragana": "おんだ ゆう",
    "age": "37",
    "bday": "1985年09月25日"
  },
  {
    "id": 9,
    "name": "山崎 幸志",
    "hiragana": "やまざき こうじ",
    "age": "29",
    "bday": "1993年03月24日"
  }
]
        $.extend($.fn.pagination.defaults, {
            className: 'paginationjs-theme-blue',
            pageSize: 3
        });
        let url = "json data のurl";
        (async () => {
            await fetch(url).then((result) => result.json()).then(
                (data) => {
                    data.reverse();
                    $('#demo').pagination({
                        dataSource: data,
                        callback: function (data, pagination) {
                            var html = table_make(data);
                            document.querySelector("#tbl").innerHTML = html;
                        }
                    })
                }
            )
        })();

        function table_make(data) {
            return (data.map((element) => {
                let str = "";
                str += "<tr>";
                str += ((Object.keys(element).map(el => "<td>" + element[el] + "</td>")).join(""));
                str += "</tr>";
                return str;
            })).join("\n");
        }
            <div class="col-12" id="demo">
                <table class="table table-dark" id="tbl"></table>
            </div>

コードを抜粋して書きましたが、このコードを書く事とjsのライブラリとcssファイルもダウンロードするようにして下さいね🫠。

因みに自分はこのライブラリを初めて使用しましたが、結構使いやすいですね。今まで開発ではLaravelなんかのページネーションを使用していた事はありますが、フロント側で出来る事を知り驚きを隠せませんというのは大袈裟ですけど使い道は有るなって思います。

タグ

04, , 10, 1977, 2, 45, age, bday, hiragana, ID, JS, jscode, name, Pagination, qu, quot, コード, しらかわ, ソース, そちら, データ, ネーション, ページ, まさと, ライブラリ, 下記, , 今回, 使い方, 使用, 場合, , 昨日, 昼間, , 正人, 白川, 簡単, 紹介,

Gドライブの画像仕分けがGASを使うと楽すぎでした! #gas #jscode

2022.11.09

Logging

おはようございます。昨日は暖か陽気でしたね~?、今日はどうかな?🤔

今日はGoogleドライブで画像仕分けが楽すぎた件を書いていきます。GASとはgoogle apps scriptの略です、このGASを使用するとGmailやスプレッドシート、Googleドキュメント等をプログラムで操作出来ちゃうサービスです。尚、プログラムコードはjavascriptベースになっていてとても書きやすいです。

function imagesDrive() {
  //画像を仕分けフォルダID googleドライブURL->adaoiujxzouaunWxz33oam__ (ランダム英数字記号の部分)
  const folder = DriveApp.getFolderById('画像を仕分けフォルダID'); 
 //移動先のフォルダID googleドライブURL-> UQIJjaoskamlqaxalp98swq--e (ランダム英数字記号の部分)
  const imgfolder = DriveApp.getFolderById('移動先のフォルダID');
  let hasfiles = folder.getFiles();
  while(hasfiles.hasNext()){
    let hasfile = hasfiles.next();
    if(/(\.png|\.jpg)$/.test(hasfile.getName())){
      hasfile.moveTo(imgfolder);
    }
  }
}

今回、上記のようなコードを書いてサクサクと画像の仕分けを行いました。正規表現パターンを変えたりする事で任意の文字列ファイルだけを別フォルダに移動したりコピー、または削除したりすることも可能です(※コードの追加や変更が必要)。GASのエディタではコード補完機能もあるので初めての方でもプログラマーなら何とかなると思います。

プログラム初心者の方へ、jpg,png,gif等をそれぞれのフォルダに別けたい場合はどのようなコードを書いたら良いでしょうか?上記のコードをヒントにコードを書いてみて下さい。回答に関しては下記に一つの答えとして書いています。

function imagesDrive() {
  //画像を仕分けフォルダID googleドライブURL->adaoiujxzouaunWxz33oam__ (ランダム英数字記号の部分)
  const folder = DriveApp.getFolderById('画像を仕分けフォルダID'); 
 //移動先のフォルダID googleドライブURL-> UQIJjaoskamlqaxalp98swq--e (ランダム英数字記号の部分)
  let folderId = {png:'移動先のフォルダID1',jpg:"移動先のフォルダID2",gif:"移動先のフォルダID3"};
  Object.keys(folderId).forEach((keyname)=>{
    let imgfolder = DriveApp.getFolderById(folderId[keyname]);
    let hasfiles = folder.getFiles();
    while(hasfiles.hasNext()){
      let hasfile = hasfiles.next();
      let r = new RegExp("(\."+ keyname + ")$");
      if(r.test(hasfile.getName())){
        hasfile.moveTo(imgfolder);
      }
    }
  });
}

タグ

33, 39, adaoiujxzouaunWxz, apps, const, DriveApp, folder, function, GAS, getFolderById, Gmail, Google, gt, ID, imagesDrive, javascript, jscode, oam, script, UQIJjao, url, コード, サービス, シート, スプレッド, ドキュメント, ドライブ, フォルダ, プログラム, ベース, ランダム, 今日, , 使用, 操作, 昨日, 画像, , 移動, 英数字, 記号, 部分, 陽気,

The Peripheral:接続された未来。 #アマプラ

2022.11.08

Logging

おはようございます、昨日の朝はなんだか寒かったですね🫠。

ペリフェラル -接続された未来のシーズン1の一話だけ観ました、一話だけなのでココから面白くなるかも知れませんが、ちょっとグロいシーンが一話の最後あたりにあったりして自分はこれからもこういうシーンが出てくるのかなと思い一話観ただけでお腹いっぱいになり観るのが止まっています。

The Peripheral Season 1 – Teaser Trailer | Prime Video
The Peripheral:接続された未来

ストーリーは面白いけど、結末は現実か仮想なのかが分からなくなって主人公が潰れてしまう気がします。もし自分が現実と仮想世界か見分けがつかないゲームにハマったら多分、一話目で潰れて人格が崩壊してしまいそうです😨。

でも、その内、そういう世界になるという事だけは確かな事です。脳にダイレクトに信号を送り仮想ゲームを楽しめるようになると・・・(何故、言い切れるかといえばこういう事が出来だしたからです「脳波から言葉を生成するAI「Brain-to-Text」 “声道”への指令を解読、言葉に変換」)。

そういう事への警鐘を鳴らす作品だと思います。

トイウコトデ、二話以降は時間の合間、合間に見ていこおうと思っています。

タグ

, AI, Brain, Peripheral, The, アマ, ゲーム, ココ, これ, シーズン, シーン, ストーリー, ダイレクト, プラ, ペリフェラル, , 世界, 主人公, , 人格, 仮想, 信号, , 崩壊, 接続, 昨日, 最後, , 未来, , 現実, 生成, 結末, , 脳波, 腹いっぱい, 自分, 言葉,

htmlとcssとjavascript-初学フロント側-No.1#code

2022.11.07

Logging

おはようございます。今年もあと2ヶ月もないわけですよね早いものですね😮

htmlとcssとjavascript-初学フロント側-No.1という動画をYOUTUBEにUPしたのが昨日の9時のこと。これで理解出来るか、どうか分からない。解説もない教えもない、唯コードを書いているところを見せてるだけです。ソースコードは下記のサイトから参照できますが、次の動画作成のためにデザインや処理が変わっていたり、動作しなくなってたりするので注意が必要です。

https://358tool.com/sample-site/

自分はHtmlやcssはあまり覚えていないのですが、分かるのはそれなりに基本ベースがあるからだと思ってます。今からHtmlやcssを学ぶ人は全部を覚えようとはせずに、手を動かしてコードを書くことから始めて下さい。そのうち基本ベースは身につくことになると思います。

因みに自分が書いているclassの名前付けなどの書き方は駄目な書き方ですので、そういう所、お仕事として書く場合は会社によってキマりなんかが有りますので、そういう事まで知りたい人はこちらの動画を参照ください。

実戦マークアップ

タグ

, 2, 358, , cl, Code, com, css, html, https, javascript, no, sample-site, tool, UP, youtube, うち, コード, こと, これ, サイト, ソース, それなり, ため, デザイン, ところ, フロント, ベース, もの, 下記, , , 今年, 作成, 全部, 処理, 初学, 動作, 動画, 参照, 基本, 必要, , 昨日, , 注意, 理解, 自分, 解説, ,

Qiitaのfeedを取得して表示するだけのコード非同期編? #phpcode

2022.11.06

Logging

おはようございます。昨日の続きのお話ですコードは金曜日に書きました😗。

動画を見ていただければわかるかと思いますが即興で書いたコードです、最後の最後でエラーってる!?ところなんかも編集していない所が伝わってくるかと思います。ちなみに画質HDのフル画面で見ないとコードは見えないかなって思います。

任意のユーザーのQiita、feedを取得して表示するだけのコード😋非同期編?
任意のユーザーのQiita、feedを取得して表示するだけのコード😋非同期編?

音声も今後入れていくかもしれません。

任意のユーザーのQiita、feedを取得して表示するだけのコード😋非同期編?

任意のユーザーを増やしたい場合はmain.jsの先頭行(2行目?)のqiitaIDに任意のIDを追加するだけで取得可能です。解説はなしですけど一応、何をやっているのかそれなりに、わかるように心がけたつもりです。あとは盗んで覚えてください😂。

ソースコードはこちらになります。

<?php
session_start();
$toke_byte = openssl_random_pseudo_bytes(16);
$csrf_token = bin2hex($toke_byte);
$_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
    <style>
        .qiita_feed-list>li {
            /* font-weight: bold; */
            color: aliceblue;
        }

        .qiita_feed-list>li>a {
            color: aliceblue;
        }

        body {
            background-color: #60b111;
        }

        .shadow-lg {
            box-shadow: 0 1rem 3rem rgba(255, 255, 255, .195) !important;
        }
    </style>
    <title>Qiita-feed</title>
    <?php
    require $_SERVER['DOCUMENT_ROOT'] . "/header_script.php";
    ?>
</head>

<body>
    <input type="hidden" id="csrf_token" value="<?= $csrf_token ?>">
    <div class="container">
        <div class="row">
            <div class="col-12">
                <h1 class="text-light">Qiita-feed</h1>
            </div>
        </div>
    </div>
    <div class="container mt-2">
        <span id="view"></span>
        Copyright <?= date("Y") ?>  <a href="https://358tool.com">358tool.com</a>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
    <script src="./js/main.js?<?= time() ?>"></script>
</body>

</html>
//qiita feed
["taoka-toshiaki","mpyw","suin"].forEach(id=>{
    let data = {
        csrf_token:document.getElementById("csrf_token").value,
        feedid:[id]
    };
    let url = "./qiita-feed.php";
    qiita_feed(url,data);
});

async function qiita_feed(url, data) {
    const options = {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        },
        body: JSON.stringify(data)
    }
    await fetch(url, options).then(response =>
        response.json()
    ).then(resultdata => {
        document.getElementById("view").insertAdjacentHTML("beforeend",resultdata.reshtmlcode)
    }
    ).catch(error => {
        console.log(error);
    }
    );
}
<?php
session_start();
$obj = json_decode(strip_tags(@file_get_contents("php://input")));

if (isset($obj)) {

    if (isset($obj->csrf_token)  && $_SESSION["csrf_token"] === $obj->csrf_token) {
        $str ="";
        foreach ($obj->feedid as $key => $id) {
            $str.= '
        <div class="row shadow-lg p-3 mb-5 bg-body rounded">
            <div class="col-12">
            🌿<span class="text-light">://qiita.com/' . xss_d($id) . '/feed :[引用]</span>';
            $str .= get_Qiitafeed("https://qiita.com/" . xss_d($id) . "/feed");
            $str .= '
             </div>
        </div>      ';
        }
        $res["reshtmlcode"] = $str;
        print json_encode($res);
    }
}


function xss_d(mixed $val): mixed
{
    if (is_array($val)) {
        foreach ($val as $key => $value) {
            $val[$key] = htmlentities($value, ENT_QUOTES);
        }
    } else {
        $val = htmlentities($val, ENT_QUOTES);
    }
    return $val;
}

function get_Qiitafeed(string $feedUrl): string
{
    $xml = @simplexml_load_file($feedUrl);
    if (isset($xml->entry)) {
        $str = "<ul class='qiita_feed-list'>";
        foreach ($xml->entry as $key => $val) {
            $str .= "<li><a href='{$val->url}'>" . $val->title . "</a></li>";
        }
        $str .= "</ul>";
    }
    return $str;
}

タグ

2, feed, HD, ID, JS, main, PHPCODE, qiita, qiitaID, あと, エラー, お話, コード, こちら, ソース, つもり, ところ, プル, ユーザー, 今後, 任意, , 先頭, 動画, 即興, 取得, 可能, 同期, 場合, , 昨日, 最後, 画質, 画面, 編集, 表示, 解説, 追加, 金曜日, 音声,

休みの日はアクセス数が少ないのを打壊したい人いる!?

2022.11.04

Logging

おはようございます、昨日は文化の日でお休みでしたね🫠。

アクセス数ゼロでも毎日のようにブログを書き続けて今のところ、二桁止まりですがアクセス数を維持しています。たまにプレビュー数だと三桁行く時がありますが、今はあまりですね~😗。

さて、そんな自分がアクセス数の増やし方を教えます。アクセス数を増やすには唯、流行の記事を追い求めるだけではダメです。未来を予想してその記事を書くこと。そしてまだ誰もその記事に付いて書いていない事が重要になります。

技術知見の二番煎じです、個人ブログでは検索サイトが拾ってくれません。なので、書くのはほぼ無駄です。たまに自分も書いたりしていますが検索にヒットすることは少ないです。技術知見を書くのなら出し惜しみせず、全力投球で書くことをオススメしますが、初学者への知見は書いても拾ってくれませんので、中級レベルの知見を書くことをオススメします。

上級者の知見は書いても無駄だと思っています。上級者ではないので分かりませんが、そもそも上級者になると論文やドキュメントで事が足りるから、わざわざそこら編を検索するという事は無くなるのではと思っています。

要約するとニッチな戦略で記事を書くべし!古い記事の上書き記事も有効😗

それらの事を注意して記事を量産すると徐々に記事を拾ってくれる確率は増えてきます✌。

尚、SEO戦略なんてブラックボックスのアルゴリズム=重箱(ブラックボックス)の隅のホコリを見つけてこれは宝石だと喜び合うことだと思います。人工知能が文章を理解するよう事を見据えて、今から人が理解できる文章を書くことをオススメします😋。

タグ

アクセス, あまり, おすすめ, お休み, こと, サイト, たま, ため, ところ, ヒット, プレビュー, ブログ, レベル, , 上級, 上級者, 中級, 予想, , , 二番煎じ, , , 休み, 個人, 全力投球, 初学者, 技術, 数ゼロ, 文化の日, , 昨日, , 未来, 検索, 毎日, 流行, 無駄, 知見, 維持, 自分, 記事, , 重要,

そういやインフラ系やサーバーサイドのYOUTUBERってあまり知らないよね。

2022.10.26

Logging

おはようございます。先日、コロナワクチンを接種して熱が出たので昨日、薬を飲みました。本日は通常と変わらないですという予約投稿を書いている日曜日の夜。

さて、今日はサーバーサイドのYOUTUBERを見かけたのでご紹介です、お名前はうんちゃまさん、何故、そんな名前なのかや動画をまだ三本しか見ていないので、どんな人なのか等は分からない部分は有るものの。そんな悪人さんではないみたいなので、今回、ご紹介します。

マイクラサーバーのセキュリティ対策って何をするの?【マイクラサーバーお悩み相談室】

サーバーを建てるに当ってどういう所を気にしているのかとか、自分の知見はどの程度なのかの答え合わせが出来て良かったと思っています。

因みにうんちゃまさんは、マイクラサーバーを運営している人です、自分も昔、マイクラサーバーを運営したいなと思って友人にマイクラサーバーは儲かるのか質問した事があります。結果、儲からないとの返答を得たので結局、運営せずに今に至っています。うんちゃまさんは、有志などがいて何とかなっているらしいです。自分もそういうITエンジニアの横のつながりが欲しいなというこの頃。

トイウコトデ、うんちゃまさんのYOUTUBEチャンネルはこちら

散財系鯖主うんちゃま

タグ

YOUTUBER, インフラ, うん, コロナ, ご紹介, サーバー, マイクラ, ワクチン, 三本, 予約, , , , 今回, 今日, , 先日, 動画, 友人, 名前, , 悪人, , 投稿, 接種, 日曜日, , 昨日, 有志, 本日, , , 知見, 程度, 答え, 結果, 自分, , 質問, 返答, 通常, 運営, 部分,

iphone14に買い替えたいけどね。#けどが付く。

2022.10.18

Logging

おはようございます、昨日、試験を受けに市内に出かけておりました😤。

さて、iphone14に買い替えたいけど金銭的な余裕はあるにはあるだけど、収入が入ってきている訳では無いので、やはり買わないで置こうと思っているのですが・・・欲しいことは欲しいですね。

iPhone 14 Pro Max | ProRes vs STANDARD vs CINEMATIC MODE

iPhone15になれば、USBタイプCに変わる可能性もあるので此処は我慢、我慢と思っています。因みにiPhone14 PROMAXを余裕で買える金額はあるにはあります。でもなぁ・・・今のiPhoneでも別によくてこの頃、撮影もしないからコレで良いじゃねと思っている所もあります。

でも、iPhone14で撮影した動画等を見ると買いだなって思うですよね🤑。

凄く悩みどころです、、、、。

今日は心のつぶやきをそのまま書いてみました、凄く優柔不断な文章になっています。最後に結論づけると毎月、固定収入が入ってきていたら間違いなくiPhone14購入しています👍。

タグ

14, 15, iPhone, PROMAX, USB, こと, コレ, タイプ, , 今日, 余裕, 優柔不断, 動画, 収入, 可能性, 固定, 市内, , 我慢, , 撮影, 文章, 昨日, 最後, 此処, 毎月, , 試験, 購入, 金額, ,

さくらVPSの仕様なのか、分からないけど。

2022.10.14

Logging

おはようございます、昨日は暖かい陽気でしたね🫠。

さて、昨日ドハマリして数時間、時間を費やしてしまった問題が有りました。結論から言えばOSのバージョンの関係で上手くいかなかった。さくらの中の人(開発者)、OSバージョンアップした際の挙動を確認して無さそうな気がします。

どんなトラブルになったのかと言えば、こんな感じ。

作業用VPSサーバーを設置してWEBのコントロールパネルからssh鍵の設定して作業に取り掛かろうとテラターム(ローカル)でログインした所、エラーが出る。

何度、トライしてもパーミッションが駄目だよと弾かれるので、ウインドウズでユーザーの設定なんかを変更したりしたのだけど駄目だった。

リナックスやMacからだとログインできるだよね、なのでコレはWindowsの問題だと思っていた、パーミッション原因だと思っていたのだけど、前サーバーはssh鍵付きでログイン出来てたので変だなと思い、前サーバーのssh鍵を変更してみたら、こちらはすんなりとログイン出来てしまった。

ここで何が違うかと言えば、OSのバージョンだけ8系と9系の違いでログイン出来なくなる。恐らくこちら側の設定がどうこうではなく、何か・・・の接続時のデータ送受信で変になっている気がします。

この事象をさくらVPSに問い合わせしていないので、原因は分からないだけど恐らくOSのバージョンの違いで今のところ発生している問題だと思います。

タグ

Mac, OS, SSH, VPS, web, Windows, アップ, ウィンドウズ, エラー, コレ, コントロール, サーバー, さくら, ターム, テラ, ドハマリ, トライ, トラブル, バージョン, パーミッション, パネル, ユーザー, リナックス, ローカル, ログイン, , , 仕様, 何度, 作業, 原因, 問題, , 変更, 感じ, , 挙動, , 昨日, 時間, , 確認, 結論, 設定, 設置, , 鍵付き, 開発者, 関係, 陽気, , 駄目,

よんでんコンシェルジュの不具合について考える人。 #日別料金計算

2022.09.27

Logging

おはようございます。タイトルの不具合が解消されていたらゴメンナサイ。これは昨日に書いた記事です🤔。

夕方頃によんでんコンシェルジュの日別の電力と電力料金を見ようとした所、何やら不具合が発生していたらしく、合計金額が見えなくなっていたのでコードを書いてみました😌。

ざっくりとした金額合計が表示するような物ですので、実際の金額とは差異が発生します。ソースコードはこんな感じです。

let kwh =  document.querySelectorAll(".img_area > table > tbody > tr > td");
if(kwh){let s = 0;
    for(let i = 0;i < kwh.length ; i++){
        if(kwh[i].innerText.match(/(kWh)/)){
          s = s + (Number(String(kwh[i].innerText).replace("kWh",""))*100);
          console.log(kwh[i].innerText);
        }
    }
    let r = 0;
    s = Math.floor(s /100);
    if(s >11){
        if(s < 120){
            r = ((s -11) * 20) + 411;
        }
        if(s < 300){
            r = ((s - 120) * 27) + 411 + 2220;
        }
        if(s >= 300){
            r = ((s - 300) * 30) + 411 + 2220 + 4858;
        }
    }
    console.log("合計金額="  + String(s) + "kWh  " + String(r) + "円");
}

尚、消費電力が11kwh以下の人の金額は0円になっていますが、実際は料金が発生します。それにしても四国電力の料金内訳を見ていると何だか、モヤモヤする料金体系になっていて、これは面倒だなと感じました。こんな料金体系じゃなく一律のお値段にして欲しいですね・・・(消費電力によって値段が変動しますし…etc…)。

ソースコードの取り扱い:
上記のソースコードを四国電力(よんでんコンシェルジュ)の日別ページを開いた状態にして、ブラウザのコンソール画面にソースコードを貼り付けて実行してみてください。電力の合計金額などがコンソール画面に表示されます。

タグ

0, area, document, For, gt, if, img, innerText, kwh, length, let, lt, match, querySelectorAll, quot, TABLE, tbody, td, tr, コード, これ, コンシェルジュ, ソース, タイトル, よんでん, 不具合, , 合計, 夕方, 実際, 差異, 感じ, , 料金, 日別, 昨日, , 発生, 表示, 解消, 計算, 記事, 金額, 電力,

あのサイトをリニューアルしました。👏、やっとのことで。 #renew #site #よさこい祭り

2022.09.25

Logging

おはようございます、昼間は暑い日もありますが夜は涼しくなりましたね😄。

今日は昨日、一日かけてよさこい祭り動画検索サイトをリニューアルしました。ソースコード(プログラム)も1からやり直しています。表示するのに結構時間がかかっていた部分は瞬時に表示されるように調整しました。

https://yosakoi-video.com/

以前は検索結果が全て表示されるような仕様でしたが、ページに分割して表示されるように変更しました。また、検索ワードを入力すると検索結果(チーム名)が表示される様に変更しました。チーム名を押すとページへ遷移するようになっています。以前より直感的に操作出来る形になったかと思います。

尚、このサイトを作るにあってYOUTUBEのAPIを使用しているのですが、リアルタイムに動画を検索している訳では無くデータで押さえています。そのデータに関しては数ヶ月置きに更新するように致します。何故、データで押さえている理由はAPIの問い合わせに上限があり、その上限数を超える検索結果が返って来なくなる為です。この上限は申請を行えばある程度増やしてくれるそうですが、それでも上限数量を超えると表示されなくなるというデメリットがあるので、データで押さえています😌。

トイウコトデ、よさこい祭り動画検索サイトよろしくお願いします。

タグ

, API, com, https, renew, site, yosakoi-video, youtube, コード, サイト, ソース, チーム, データ, プログラム, ページ, よさこい祭り, リアルタイム, リニューアル, ワード, , 今日, 仕様, 以前, 使用, 入力, 全て, 分割, 動画, 変更, , , 操作, , , 昨日, 昼間, 時間, 検索, 瞬時, 結果, 表示, , 調整, 遷移, 部分,

一言感想、欲望の資本主義メタバースの衝撃デジタル経済!

2022.09.19

Logging

おはようございます。台風が何事もなく通り過ぎるのを祈りながら日曜日のお昼に書いています✍。

8月31日頃に「欲望の資本主義2022夏メタバースの衝撃デジタル経済のパラドックス」というNHK:BSで放送されていたものを昨日、オンデマンドで購入して視聴しました。尚、単品販売一本120円ぐらいだったと思います(NHKさん、ペイペイ支払いに対応してくださいませ🙇)。

一言で感想を述べるとするならば経済が迷走していて出口が見えていないなという事が分かったぐらいですかね。あと、自分の主観を述べるとするならばメタバースが浸透するのはまだ先の話になると思います。もしかしたら、あと5年、10年先の話になるのではという印象ですね。

なので、今の子供達が大人になる頃に流行るものだと思ったほうが良さそう。スマホが浸透するにもそれぐらい時間がかかったように最初は熱狂的なテクノロジーヲタクから浸透していき、その後、一般人も認知していく様な流れになるのだろうと。

これは前半に登場された佐藤航陽 氏が書かれた書籍、世界2.0にも書かれていることですが・・・、その様に欲望の資本主義を見て思いました。

まとめ、迷走していてこれと言って、答えを見いだせない世の中が後、数年は続きそうです。

タグ

10, 120, 2022, 31, 5, 8, bs, NHK, オンデマンド, お昼, スマホ, それぐらい, テクノロジー, デジタル, バース, パラドックス, ペイ, メタ, もの, ヲタク, , 一般, 一言, 主義, 主観, , , 何事, , 出口, 単品, 印象, 台風, , 大人, 子供, 対応, , 感想, 放送, 日曜日, 昨日, 時間, 最初, 欲望, 浸透, 経済, 自分, 衝撃, 視聴, , 販売, 資本, 購入, 迷走, ,

一週間の予約が出来るデモコードです。良かったらどうぞ😌。 #php #code

2022.09.17

Logging

おはようございます、今日から台風接近らしいですね。この投稿は昨日書きました。

さて、一週間の予約(時刻表から)が出来るデモコードを書きました。これを書いたキッカケは昔の職場の方がこんな感じのUIを作られていたのを見て、自分も書いてみようと思いDEMOコードを朝起きて調べながら書きました。調べたことは選択を解除する方法だけで、後はオリジナルコードです、設計書も何もなく組み立ていきましたので、欠陥があるかもです。また、Qiitaにも記載しましたが、コメントをほぼ書いていません。書かずともプログラマーなら分かるだろうという感覚です。

予約ー時刻表DEMO

肝心の確認部分は記載していないのにも訳があります。営業妨害になっては駄目だからです。そういう理由で確認部分以降は書いていません。

こちらにもソースコードを掲載しときますね。

<?php
ini_set("display_errors",0);
/**
 * @param array $holiday
 * @return string $str
 */
function fn_header($holiday = [])
{
    $str = "";
    $date = new DateTime();
    for ($i = 0; $i < 7; $i++) {
        !$i ? "" : $date->modify('+1 day');
        $w = $date->format("w");
        $tabindex = $i*7;
        $ho = (function ($days, $holiday = []) {
            return (array_search($days, $holiday) !== false) ? "holiday" : "";
        })($date->format("Y-m-d"), $holiday);
        $str .= "
        <th tabindex=$tabindex>
            <span class='header_no week_no_$w $ho'>" . $date->format("Y-m-d") . "</span>
        </th>";
    }
    return $str;
}
/**
 * @param int $h_min
 * @param int $h_max
 * @param int $m_interval
 * @param array $cnt
 * @param array $reserve
 * @param array $holiday
 * @return string $str
 */
function fn_time($h_min, $h_max, $m_interval,$cnt=[],$holiday = [], $reserve = [])
{
    $str= [];
    for ($h = $h_min; $h <= $h_max; $h++) {
        for ($m = 0; $m < 60; $m = $m + $m_interval) {
            print("<tr>\n");
            $date = new DateTime();
            for ($i = 0; $i < 7; $i++) {
                $cnt[$i]=!$cnt[$i]?(((($h_max - $h_min)+1)*(60/$m_interval))*($i))+7:(++$cnt[$i]);
                !$i ? "" : $date->modify('+1 day');
                $w = $date->format("w");
                $ho = (function ($days, $holiday = []) {
                    return (array_search($days, $holiday) !== false) ? "holiday" : "";
                })($date->format("Y-m-d"), $holiday);
                $time = sprintf("%02d:%02d",$h, $m);
                if ($ho) {
                    print("
                        <td class='' tabindex={$cnt[$i]}>
                            <span class='header_no week_no_$w $ho'>" . $time . "</span>
                        </td>");
                } else {
                    $r = (function ($days, $reserve = []) {
                        return (array_search($days, $reserve) !== false) ? "reserve" : "";
                    })($date->format("Y-m-d") . "_" . $time, $reserve);
                    if (!$r) {
                        print("
                            <td class='date_" . $date->format("Y-m-d") . "_{$time}' tabindex={$cnt[$i]} data-date='" . $date->format("Y-m-d") . "_{$time}'>
                                <a class='time_{$m}_" . $date->format("Y-m-d") . "_{$time}' data-sortno={$cnt[$i]}  href='#?data=" . $date->format("Y-m-d") . "_{$time}'><span class='header_no week_no_{$w} {$h}'>{$time}</span></a>
                            </td>");
                    } else {
                        print("
                            <td class='' tabindex={$cnt[$i]}>
                                <span class='header_no week_no_$w $r'>" . $time . "</span>
                            </td>");
                    }
                }
            }
            $date = null;
            print("</tr>\n");
        }
    }
    return "";
}
?>
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <meta name="Description" content="Enter your description here" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
    <title>予約-時刻表(デモ版)</title>
    <style>
        table,tr,td{
            user-select: none;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="row">
            <div class="col-12 text-center">
                <h1 class="display-1">予約-時刻表<br></h1>
                <h5>{予約:時刻をクリックするか、<br>
                    左クリック選択状態で複数選択可能です<br>
                    (日付またぎは禁止しています)}</h5>
                <h5>{ダブルクリックすると予約画面に遷移します。<br>
                    ※DEMO版ですので予約登録画面は御座いません}</h5>
            </div>
        </div>
    </div>
    <div class="container-fluid  text-center">
        <div class="row">
            <div class="col-12">
                <table class="shadow-lg table table-hover table-bordered">
                    <thead>
                        <tr>
                            <?= fn_header() ?>
                        </tr>
                    </thead>
                    <tbody>
                        <?=fn_time(10, 20, 10,[],["2022-09-18","2022-09-23"],["2022-09-19_10:40","2022-09-19_10:50"]) ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/2.9.2/umd/popper.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.0/js/bootstrap.min.js"></script>
    <script src="./assets/js/main.js?<?=time()?>"></script>
</body>
</html>
let date_obj = document.querySelectorAll("td");
let submit_url = "https://example.com";
let is_date_data = [];
let cnt = 0;

date_obj.forEach(function (elm, key) {
    elm.addEventListener("mouseout", select_in_value);
    elm.addEventListener("click", sp_select_in_value);
    elm.addEventListener("touchend", sp_select_in_value);
    elm.addEventListener("dblclick", select_out_value);
});
function check_value(o, e) {
    if (is_date_data.length === 0) {
        return true;
    }
    let d = o.getAttribute("data-date");
    return d ? ((d) => {
        let f = is_date_data.find(element => {
            let pattern = new RegExp(d.split("_")[0]);
            return !element.match(pattern);
        }) ? false : true;
        if (!f) {
            select_clear(o, e);
            is_date_data = [];
            cnt = 0;
        }
        return f;
    })(d) : false;
}
function select_in_value(e) {
    if (e.buttons === 1 && check_value(this, e)) {
        if (this.getAttribute("data-date")) {
            this.style.backgroundColor = "#555";
            this.children[0].style.color = "#fff";
            if (is_date_data.indexOf(this.getAttribute("data-date")) && is_date_data.indexOf(this.getAttribute("data-date"))) {
                is_date_data[cnt] = this.getAttribute("data-date");
                cnt++;
            }
        }
    }
}
function sp_select_in_value(e) {
    if (check_value(this, e)) {
        if (this.getAttribute("data-date")) {
            this.style.backgroundColor = "#555";
            this.children[0].style.color = "#fff";
            if (is_date_data.indexOf(this.getAttribute("data-date")) && is_date_data.indexOf(this.getAttribute("data-date"))) {
                is_date_data[cnt] = this.getAttribute("data-date");
                cnt++;
            }
        }
    }
}
function select_out_value(e) {
    if (is_date_data.length) {
        let is_data = is_date_data.map(function (elm, index) {
            return "date[" + index + "]=" + elm;
        });
        window.location.href = submit_url + "?" + is_data.join("&");
    }
}
function select_clear(o, e) {
    let is_ClassName = [];
    is_ClassName = is_date_data.map(function (d) {
        return "date_" + d;
    });
    is_ClassName.map(class_name => {
        document.getElementsByClassName(class_name)[0].style.backgroundColor = "#fff";
        document.getElementsByClassName(class_name)[0].children[0].style.color = "#0d6efd";
    })
}

タグ

0, Code, com, demo, https, ligaLgY-uZ, php, qiita, UI, watch, www, youtube, オリジナル, キッカケ, コード, こちら, こと, コメント, これ, ソース, デモ, プログラマー, , 予約, 今日, 台風, 営業, 妨害, , 感じ, 感覚, 投稿, 接近, 掲載, , 方法, , 昨日, 時刻表, , 欠陥, 理由, 確認, 職場, 肝心, 自分, 解除, 記載, 設計書, , 選択, 部分, 駄目,

YOUTUBEで伸びそうな人の共通点は何だろうか?

2022.09.16

Logging

おはようございます、昨日は昼から雨でしたね、秋の雨はまだ良いけど冬の雨は辛いですね。

さてYOUTUBEを見ると、この人は伸びそうだなって思える人とこの人は伸びそうにないと思える人がいると思います、どういう作りにしたら再生回数が伸び、チャンネル登録者が増えるのか、この頃、分かってきた事があります。まず、容姿が良い人尚且つ声の良い人でサムネ画像と動画が綺麗だと伸びます。顔出しせずに声と映像が良い場合も再生回数は結構良いですね。

Figma Auto Layout Card Component Tutorial

何だかよく分からないのですが、上記の質が良ければ、語っている内容がそれ程でも再生回数は良いです、そして学習系だと自分でも出来そうな事の方が伸びて難しいことは伸びない感じですね🤔。

駄目なのは、なんかスッキリしていない背景で何か語っている人は伸びない。どんなに良いことを言っていても再生回数は伸びないみたいです。特に汚い部屋より視聴者はオシャレな部屋を好むみたいです。自分の部屋が汚くても他人の部屋の汚い部屋を見たくないようです😌。

そういう所は食事と同じなのかも知れませんね。

因みに自分もYOUTUBEをたまにUPしていますが、サムネ画像も良くなく、滑舌悪いので突出してチャンネル登録数も伸びそうにありませんが、徐々に更新頻度をUPしていくかも知れません。今、考え中です、あとこの頃、コードを記事をあまり書いていませんが来週あたりから、所々に挟んでいきますので、よろしくお願い致します。

タグ

6, com, https, LWp, pOW, R-Q, watch, www, youtube, こと, サムネ, チャンネル, 上記, , , , 作り, 共通点, 内容, 再生, , 動画, 回数, 場合, , 学習, 容姿, 感じ, , 映像, 昨日, , 画像, 登録者, , 綺麗, 背景, 自分, , , , 顔出し, 駄目,

映画、百花を観てきましたので感想を残しときます。

2022.09.15

Logging

おはようございます。昨日は久しぶりに映画を観に行きました。来週も水曜日か火曜日に観に行くつもりです。

さて、百花を観てきましたので感想を残しときますね。この映画、感動というよりは切ない気持ちになったのと、認知症という症状を凄くリアルに描いていましたし、認知症を通して人を描いていたように感じます。人ってなんだろうね本当に…。

『百花』予告【2022年9月9日(金)公開決定】

まとめ。とにかく映画を観て切ない思いになりました、感動するというストーリーではないですが、心に残る映画であり、心に染みる映画になっていると思います。

尚、上映期間中、観えなくともこの映画は耐え得る作品ですので、是非観てみてくださいな😌。

タグ

2, 7, com, https, kacpw, RF-g, watch, www, youtube, ストーリー, つもり, まとめ, リアル, 上映, 久しぶり, , 作品, , 感動, 感想, 映画, 昨日, 期間, 本当, 来週, 気持ち, 水曜日, 火曜日, 症状, 百花, 認知,

ヘンテコな学習ヘンテコな呟き😌。説明不足はいつものこと🤔

2022.09.13

Logging

おはようございます、夜中のほうが学習効率高いです🌃。

昨日、一つ出来そうなことを連続的につぶやいたので、それを皆さんが理解できる内容に文章としてまとめたいと思います。まず昨日の晩に下記のつぶやきをしました。これを追って何をしたいのかや何が理解できたのか、分かった方はこれから書くことを読まなくても良い人です。

まず、次のアイディアが生まれました、アクセス解析を自前してサイトの訪問者の動向を事細かに蓄積する事は出来ないだろうか、もし出来たらどのような事が出来るだろうか🤔?考えた結果、ECサイトなら購入する確率、ページ推移の予測などが出来ること、ページ単位だとどの場所にどんなデザインを置けばクリック率が上がるのかなどそういう事が、アクセス解析のデータから割り出す事が出来るのではないかと。

次にページを可視化するには、どうすれば良いのだろうかという疑問。調べていくうちに隣接行列で可視化(数値化)出来ることがわかった。これからどうすれば予測出来るのだろうかと考えた結果。ページの可視化は隣接行列で表わすことが出来るが、今の自分ではココから予測データを導き出せないなと思い、隣接行列は可視化するために使おうと考えを改める。

では、どうすれば予測できるかを考察した。まず機械学習の予測にはどのような種類があるのか、どのようなデータを与えれば適切な予測を導き出すことが出来るのかを調査。最終的にランダムフォレストという手法で予測するのが今の自分でも出来そうな方法ではないかと判断に至った😌。

尚、機械学習で注意しないといけないのは過学習【過剰適合 / オーバーフィッティング】により上手く予測出来なることがあることを注意しないといけない。

そして思ったことは、自分でも出来そうだなって事🤐。もう機械学習は参考書を買わなくてもYOUTUBEやネットで調べれば、なんちゃって機械学習予測は出来るようになっているということ。後はどんなデータを機械に与えるか、そしてどれぐらい学習させるのか。そういう事が大事になってくる事を理解したのだった。

タグ

EC, アイディア, アクセス, いつも, うち, クリック, こと, これ, サイト, それ, データ, デザイン, ページ, ヘンテコ, 一つ, 下記, 予測, , , , 内容, 効率, 動向, 単位, 可視, 場所, 夜中, 学習, 推移, 数値, 文章, , 昨日, , , 理解, 疑問, 皆さん, 確率, 結果, 自前, 蓄積, 行列, 解析, 訪問者, 説明, 購入, 隣接,

1万件のCSVを読み込みテーブルに保存する雛形コード #PHPCode

2022.09.08

Logging

おはようございます、徐々に秋ぽっい日差しになってきましたね(まだ暑いけども😌)。

今日は、1万件のCSVを読み込みテーブルに保存する雛形コードを昨日、ちょちょっと書きましたので記載します。ファイルをダウンロードして使いたい方はGithubのリンクを下に貼っときますので、ご使用頂けたらと思います。尚、テーブルなどはCSVを参考にご自身で構えてください。

※動作環境はPHP8系です、なのでPHP7系では一部エラーが出ます。fgetcsv…nullを0へ変更。

Githubのリンクはこちら

Qiitaの方に記載しようかどうしようか、迷ったのですが第一弾目がアクセス数がそこそこ伸びたのでこれ以上、注目されるのは嫌なのでブログの方に記載しました。1万件のCSVを簡単に読み込ませる方法はPHPコードを書くのではなく、SQLのコマンドで実行した方が実は早いですけど・・・。

有言実行

早いですけど、その場合、CSVがちゃんとしたファイルではないと上手くテーブルに保存されない場合や、そもそもコマンドラインで操作出来ない場合もあったりしてPHPコードなどで制御しないと駄目な事もあります。そんな時に、このコードをサンプルとして使って頂ければ良いなと思い作りました。

1万件のCSVを読み込ませるPHPコード雛形。

そんなにコードを書かなくてもまぁ動くんですよ。ちなみにソースコードには、あまりコメントを書いていないですが、プログラマーなら大体の人が理解できるレベルかと思います。

<?php
//ini_set("display_errors","On");
session_start();
require "db_config.php";

//読み込みCSVファイル名セット
class csv
{
    /**
     * @param string $filename
     * @param int $cnt
     * @return Object
     */
    public function ini_csv($filename = "", $cnt = 0)
    {
        return new csv_read($filename, $cnt);
    }
}

//CSVデータを読み込ます
class csv_read
{
    var $max = 10000;
    var $cnt = 0;
    var $handle = null;
    /**
     * @param string $filename
     * @param int $cnt
     */
    public function __construct($filename = "", $cnt = 0)
    {
        $this->cnt = $cnt;
        $this->handle =  fopen($filename, "r");
        $_SESSION["offset"] ? fseek($this->handle, $_SESSION["offset"]) : $this->handle;
    }
    /**
     * @param int $header_skip
     * @return Object
     */
    public function reader($header_skip = 0)
    {
        if ($this->handle !== FALSE) {
            $response = null;
            $data = fgetcsv($this->handle, null, ",");
            if (!$header_skip || $_SESSION["offset"]) {
                if ($data !== FALSE) {
                    $_SESSION["offset"] = ftell($this->handle);
                    $response["data"] = $data;
                    $response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
                    $flag = true;
                } else {
                    $_SESSION["offset"] = null;
                    $flag = false;
                }
            } else {
                $_SESSION["offset"] = ftell($this->handle);
                $response["cnt"] = $this->cnt > $this->max ? 0 : ($this->cnt + 1);
                $flag = false;
            }
        } else {
            $_SESSION["offset"] = null;
            $flag = false;
        }
        return new table_save($flag, $response);
    }
}

//tableにCSVデータを保存
class table_save
{
    var $flag = false;
    var $result = null;
    /**
     * @param boolean $flag
     * @param array  $response
     * @return void
     */
    public function __construct($flag, $response)
    {
        $this->flag = $flag;
        $this->result = $response;
        $this->column_name = "name,,...";
    }
    /**
     * @param string  $column_name
     * @return void
     */
    public function tbl_save($column_name = "")
    {
        if ($this->flag) {
            $column = $column_name ? $column_name : $this->column_name;
            $is_column = explode(",", $column);
            foreach ($is_column as $key => $val) {
                $is_value[$val] = $this->result["data"][$key];
            }
            try {
                $pdo = new PDO(DSN, USERNAME, PASSWORD);
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $sql = (function ($is_column) {
                    $INSERTFIRST = null;
                    $INSERTLAST = null;
                    foreach ($is_column as $key => $val) {
                        $INSERTFIRST[] = "$val";
                        $INSERTLAST[] = ":$val";
                    }
                    $INSERTSQL = "(" . implode(",", $INSERTFIRST) . ")values(" . implode(",", $INSERTLAST) . ")";
                    $UPDATESQL = null;
                    foreach ($is_column as $key => $val) {
                        $UPDATESQL[] = "$val = :$val";
                    }
                    return "INSERT INTO " . TABLENAME . $INSERTSQL . " ON DUPLICATE KEY UPDATE " . implode(",", $UPDATESQL) . ";";
                })($is_column);

                $stmt = $pdo->prepare($sql);
                foreach ($is_value as $key => &$value) {
                    $is_type = ($key === "test3" || $key === "test13") ? PDO::PARAM_INT : PDO::PARAM_STR;
                    $stmt->bindValue(":$key", $value, $is_type);
                }
                $this->result["sql"] = $stmt->execute();
            } catch (\Throwable $th) {
                //throw $th;
                $this->result = null;
                print $th->getMessage();
            }
        }
        print json_encode($this->result);
    }
}

//RUN...POST DATA
if (isset($_POST["csrf_token"])  && d_xss($_POST["csrf_token"]) === $_SESSION['csrf_token']) {

    $_SESSION["offset"] = (int)d_xss($_POST["reset_flag"]) === 1 ? null : d_xss($_SESSION["offset"]);
    $filename = d_xss($_POST["filename"]);
    $cnt = (int)d_xss($_POST["cnt"]);

    $column_name = "test1,test2,test3,test4,test5,test6,test7,test8,test9,test10,test11,test12,test13,test14,test15";
    $header_skip = 1;

    $csv = new csv();
    $csv->ini_csv($filename, $cnt)->reader($header_skip)->tbl_save($column_name);
    $csv = null;
} else {
    print "";
}
function d_xss($data){
    $data = strip_tags($data);
    $data = htmlspecialchars($data,ENT_QUOTES);
    return $data;
}
<?php
 // ログインした状態と同等にするためセッションを開始します
 session_start();
 // 暗号学的的に安全なランダムなバイナリを生成し、それを16進数に変換することでASCII文字列に変換します
  $toke_byte = openssl_random_pseudo_bytes(16);
  $csrf_token = bin2hex($toke_byte);
  // 生成したトークンをセッションに保存します
  $_SESSION['csrf_token'] = $csrf_token;
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="Description" content="Enter your description here"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<title>CSV</title>
</head>
<body>
    <input type="hidden" name="csrf_token" value="<?=$csrf_token?>">
    <span class="h3" id="cnt"></span><br><br>
    <span class="h4" id="read_csv"></span><br><br>
    <span class="h4" id="debug"></span><br><br>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.1/umd/popper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.6.0/js/bootstrap.min.js"></script>
<script>
    window.onload = function(){
        read_csv(0,1);
    };
    function read_csv(cnt,reset_flag){
        try{
            $.ajax({
            type: "post",
            url: "./assets/php/class_csv.php",
            async: false,
            data: {csrf_token:document.getElementsByName("csrf_token")[0].value,reset_flag:reset_flag,filename:"dummy.csv",cnt:cnt},
            dataType: "json",
            success: function (response) {
                    if(response){
                        cnt = response.cnt;
                        document.getElementById("cnt").innerText = cnt;
                        if(response.data){
                            document.getElementById("read_csv").innerText = response.data[0] + response.sql;
                            document.getElementById("debug").innerText = cnt ===21?response.data:document.getElementById("debug").innerText;
                        }
                        setTimeout(function(){read_csv(cnt)},0);
                    }
                }
            });
        }catch(e){
            console.warn(e);
            read_csv(cnt);
        }
    }
</script>
</body>
</html>

タグ

0, , 7, 8, CSV, fgetcsv, github, null, php, PHPCODE, qiita, SQL, アクセス, エラー, コード, こちら, コマンド, これ, ご使用, ご自身, ダウンロード, ちょ, テーブル, ファイル, ブログ, リンク, , 一部, , , 今日, 保存, 動作, 参考, 変更, 実行, , 方法, 日差し, 昨日, 有言実行, 注目, 環境, , 簡単, 記載, 雛形,

一部のサービスのアクセス数が極端に増えたことで思うこと。

2022.08.16

Logging

おはようございます。今日は3時に起床してみました。たぶん二度寝することになりそうですが🙄。

さて、一部のサービスでアクセス数が極端に増えてたみたいです、昨日の話。基本的に自分は作るまでが楽しくて作ったものは自分では使用しません。バージョンアップやテスト投稿などはしますが、それ以外の書き込みなどは全くです。

極端にアクセス数が増えたりするというのは、大体、シェアや口コミからの流れが多いことがあります。

自分にとってはアクセス数よりも収益に繋がったのかや皆が楽しく使っているのかなどの方が重要です。今、あるサービスでは匿名での投稿が殆どです、投稿内容の質もイマイチです(似たような投稿ばかり)。このまま匿名投稿を継続させるのか、Twitterのアカウントなどソーシャルなアカウントと結び付けないと使えないようにするか考えています。

アクセス解析ツールで分かることは年代、男女の比率、何処からのアクセスなのかなどは分かります。そういう傾向を見ると何だか偏っている、そして何より自分の思惑とはかなり違った方向に行っている気がします。コレばかりは仕方がない事なのかも知れませんが悩みどころですね。

トイウコトデ、検討中です。

タグ

, Twitter, アカウント, アクセス, アップ, いまいち, こと, このまま, サービス, シェア, ソーシャル, それ, ツール, テスト, バージョン, もの, 一部, , , 今日, 何処, 使用, 内容, 匿名, 収益, 口コミ, 大体, 年代, 投稿, , 昨日, 極端, 殆ど, 比率, 男女, , 継続, 自分, 解析, , , 起床, 重要,

ブログを書いていなかったので、今頃、日誌を書きます。

2022.08.11

Logging

※この記事は2022/08/12に書いた記事ですが投稿日は昨日の日付になっています。

こんにちは、昨日ブログを書いていなかったので埋め合わせの記事を今、書いています。

昨日はよさこい祭りの最終日でしたね。その頃、自分はLaravelで開発をしていました。昼からは体調不良だったので、仮眠を取ってたりして何とか夕方頃から復活して、続きのコードを書いたりしていました。全然、今日までブログを書いていたつもりになっていていました。

まだまだ暑い日が続きますが、熱中症やコロナには気をつけてお過ごしください。

あとこの頃、TikTokとか言うもののアカウントを作りました、一応開設して動画を投稿したりしています。YOUTUBEのショートに上げた内容を今後、TikTokにもUPするつもりでいます。あと、YOUTUBEも実名アカウントも併用しつつ今まで使っていたアカウントもたまに使用しながら活動していきます。

トイウコトデ、近況報告でした🙇。

タグ

08, 12, 2022, Laravel, TikTok, UP, youtube, アカウント, コード, コロナ, ショート, たま, つもり, , ブログ, よさこい祭り, 不良, , 今後, 今日, 今頃, 仮眠, 体調, 併用, 使用, 内容, 動画, 夕方, 実名, 復活, 投稿, , 日付, 日誌, 昨日, , 最終日, , 活動, 熱中症, 自分, 記事, 開発, 開設, ,