素晴らしい曲と素晴らしいWEBサイト。 #cool #site

20221010

Logging

おはようございます。いきなり寒くなってきましたね🐙。

さて、素晴らしい曲と素晴らしいWEBサイトを紹介します。Ayako TaniguchiさんのWEBサイト、そして流れる曲も素晴らしいな、自分はこういうサイトを作りたいと思っていても、何処をどうすれば良いのか分からない。おそらくjavascriptかnode.jsなど動いているだろうなって想像は付くのだけど。

そうではないだよね。それは技術的な話で実際にそんな技術があっても、こういうのはセンスの問題が大きく伸し掛かるだなって思います。映像+WEB+音楽が全てレベルが高いサイトってあまり見かけない中、このサイトは秀でる才能の塊だと思います。こういうサイトを見ると自分も頑張ろうって気になります👍。

最後にリンクを貼っときます。

https://ayakotaniguchi.jp/

タグ

Ayako, cool, javascript, JS, node, site, Taniguchi, web, サイト, センス, それ, リンク, レベル, , 何処, 全て, 問題, , 実際, 想像, 才能, 技術, 映像, , 最後, , 紹介, 自分, , 音楽,


何気なく書いていた事が結構な確率で当たる。#未来予知 #高的中か?

20221009

Logging

おはようございます、コロナが収まりそうなのに戦争はまだ収まりそうにないです。ロシアは領土を奪って何得なんでしょうか。意味が分かりません。

さて、過去のブログ記事を定期的に見たり修正したりしています。これを行う理由は一つだけ意味不明な文章表現があり本人しか意味がわからないモノが存在します。その為、定期的に変な文章は直したりしています。

Tesla AI Day in 23 Minutes (Supercut) (2022)

毎日書けば文章力や表現力は、どんな人でもUPします。泥臭いことですが技術力を上げようと思ったらひたすら真っすぐ頑張るしか無いです。必要な知識は日々の勉強でしか埋め合わせは出来ないです、技術や知識を身につける方法はひたすら覚える事から始まります。覚えて基礎が身につけば応用学習するその反復を行って身につく。この方法しかなく脳にデータをインストールは今のところ出来ない、記憶力は人それぞれなので、身につく事が早い人と遅い人がいるけれど反復学習をすれば身につきます(脳に障害がある人は難しいけども)。

タイトルの話になりますが、結構な確率で自分の未来予想があたっているなって最近思います。特に科学的な進歩や社会にどう浸透していくなどは、結構、的を得た予想をしているなと自画自賛😐。未来予測が当たっても何の得にもならないけれどもアタルのは良いことです。

此処で一つ未来予想を書きます、昨日きな臭い記事の書いたけど、来年の夏までにはロシアVSウクライナの戦争は終わるじゃないかって思っています、なんかそんな気がします。

タグ

UP, インストール, こと, これ, コロナ, それぞれ, データ, ところ, ブログ, もの, ロシア, 一つ, 不明, 予知, , , , 修正, 勉強, 反復, 基礎, , 存在, 学習, , 必要, 応用, 意味, 戦争, 技術, 技術力, 文章, 文章力, 方法, 日々, 未来, 本人, 毎日, , 理由, 的中, 知識, 確率, 結構, , 表現, 表現力, 記事, 記憶力, , 過去, 障害, 領土,


戦争や何か物騒なことが今にも起こりそうな気配だった #war #きな臭い

20221008

Logging

おはようございます。この頃、北朝鮮ミサイルが飛んでくるようになりました。

これが戦争にならないことを切に願うと共にウクライナとロシアの戦争も年内に終止符になって欲しい所です。戦争して何も生まれない、生まれるのは憎しみ合う気持ちだと思います。独裁国家は滅びる、どんな国でも独裁国家は滅びてきました。一個人が権力を持つとろくなことが起きない。そしてその人物がどんなに賢くても国は滅びます。

映画『囚われた国家』予告篇|4.3[金]全国公開

映画、囚われた国家に描かれているような国が世界に何ヶ国かあると思いますが、時間はかかると思いますが諦めずに戦うしか無いのだと。まだ日本は戦争になってない国ではあるものの、今後、どうなるのか本当に読めないです。ただ、中国は最後の最後まで動かないと思います。

タグ

war, ウクライナ, こと, これ, ミサイル, ロシア, 一個人, 世界, 中国, 人物, , 今後, , 何ヶ国, 北朝鮮, , 国家, 年内, 憎しみ, 戦争, , 日本, 映画, 時間, 最後, 本当, 権力, 気持ち, 気配, 物騒, 独裁, 終止符, ,


数珠繋ぎのツイートシステムに予約機能を付けました😂 #php #code

20221007

Logging

おはようございます、偏頭痛持ちは雨が降るが一番大変です☔。

先日、数珠繋ぎのツイートシステムを作ったのですが、そのシステムに予約機能を付けました。尚、TwitterAPIのバージョン2でスケジュールのパラメーターが今のところ無いですね。これから先、機能が付くかも知れないですが今のところ無いようです。因みにソースコードは近日中にQiitaGithubにUPします。此処ではソースコードの一部を掲載します(※記事を更新しました下へスクロール🫠)。

Twitter API v2 ツイート数珠繋ぎ

尚、crontabでPHPファイルを叩くようにしています、あと注意事項ですが予約を一度した投稿については変更等は出来ません、編集機能等の機能追加の予定はないです。また、予約管理はsqlite3を使用して管理しています。

<?php
date_default_timezone_set('Asia/Tokyo');
ini_set("display_errors",0);
require_once "./data/tw-config-v2.php";
require_once "../vendor/autoload.php";

use Abraham\TwitterOAuth\TwitterOAuth;

class tw
{
    var $connection = null;
    var $pdo = null;
    function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET, ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }
    function db_connection()
    {
        try {
            //code...
            $res = $this->pdo = new PDO("sqlite:./data/tw-tweets-db.sqlite3");
        } catch (\Throwable $th) {
            //throw $th;
            //print $th->getMessage();
            $res = false;
        }
        return $res;
    }

    function timecheck($timeonoff, $times)
    {
        if (!$timeonoff) return true;
        $n = new DateTime();
        $t = new DateTime($times);
        return $t <= $n ? true : false;
    }

    function pickup_tweets(mixed $tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        if (!$times) return false;
        $obj = (object)[];
        $times = preg_replace("/\-/", "/", $times);
        $times = preg_replace("/T/", " ", $times);

        if ($this->timecheck($timeonoff, $times)) {
            if (isset($tw_text) && is_array($tw_text)) {
                foreach ($tw_text as $key => $value) {
                    if (preg_replace("/[ | ]/", "", $value)) {
                        $obj = !$key ? ($this->connection->post("tweets", ["text" => $value], true)
                        ) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $value], true)
                        );
                    }
                }
                return true;
            }
        } else {
            return $timeonoff ? $this->save_sqlite($tw_text, $timeonoff, $times, $id): true;
        }
    }

    function save_sqlite($tw_text = null, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        if ($this->db_connection()) {
            try {
                //code...
                if (isset($tw_text) && is_array($tw_text)) {
                    foreach ($tw_text as $key => &$value) {
                        if (preg_replace("/[ | ]/", "", $value)) {
                            $stmt = $this->pdo->prepare("insert into tweets (tw_id,user,times,tw_text)values(:tw_id,:user,:times,:tw_text)");
                            $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                            $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                            $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                            $stmt->bindValue(":tw_text", $value, PDO::PARAM_STR);
                            $stmt->execute();
                        }
                    }
                }
                $this->pdo = null;
                return true;
            } catch (\Throwable $th) {
                //throw $th;
                return false;
            }
        }
    }
    function tweets_load(string $id = "")
    {
        if (!$id) return false;
        try {
            //code...
            $value = null;
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("select * from tweets where user = :user order by times,tw_id asc;");
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $res = $stmt->execute();
                $value = $res ? $stmt->fetchAll() : false;
                $this->pdo = null;
            }
            return $value;            
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
    }
    function tweets_update(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "",mixed $tw_text="")
    {
        try {
            //code...
            if(!preg_replace("/[ | ]{0,}/","",$tw_text))return false;
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("update tweets set tw_text = :tw_text where tw_id = :tw_id and user = :user and times = :times");
                $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                $stmt->bindValue(":tw_text", $tw_text, PDO::PARAM_STR);
                $stmt->execute();
                $this->pdo = null;
            }
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
        return true;

    }

    function tweets_delete(int $key = 0, int $timeonoff = 0, mixed $times = null, string $id = "")
    {
        try {
            //code...
            if ($this->db_connection()) {
                $stmt = $this->pdo->prepare("delete from tweets where tw_id = :tw_id and user = :user and times = :times");
                $stmt->bindValue(":tw_id", $key, PDO::PARAM_INT);
                $stmt->bindValue(":user", $id, PDO::PARAM_STR);
                $stmt->bindValue(":times", $times, PDO::PARAM_STR);
                $stmt->execute();
                $this->pdo = null;
            }
        } catch (\Throwable $th) {
            //throw $th;
            return false;
        }
        return true;
    }

    function bat_tweets(mixed $value = null)
    {
        if (!$value) return false;
        $obj = (object)[];
        $t = "";
        foreach ($value as $key => $val) {
            if ($this->timecheck(1, $val["times"])) {
                $obj = ($val["times"]<>$t)? ($this->connection->post("tweets", ["text" => $val["tw_text"]], true)
                ) : ($this->connection->post("tweets", ["reply" => ["in_reply_to_tweet_id" => $obj->data->id], "text" => $val["tw_text"]], true)
                );
                $this->tweets_delete($val["tw_id"], 1, $val["times"], $val["user"]);
                $t = $val["times"];
            } else {
              //  var_dump($val);
              //  break;
            }
        }
    }
}

if ($argv[0]) {
    $tw = new tw();
    $value = $tw->tweets_load(xss_d($argv[1]));
    $tw->bat_tweets($value);
}
function xss_d($val = false)
{
    if (is_array($val)) {
        foreach ($val as $key => $value) {
            $val[$key]  = strip_tags($value);
            $val[$key]  = htmlspecialchars($val[$key]);
        }
    } else {
        $val  = strip_tags($val);
        $val  = htmlspecialchars($val);
    }
    return $val;
}

追記:予約編集機能なども付けました🙄。

GithubとQittaのリンクはこちらです。
Github:https://github.com/taoka-toshiaki/tweets-system-box1
Qitta:https://qiita.com/taoka-toshiaki/items/5ef12b60b267742bf584

タグ

2, , 39, Asia, Code, crontab, date, default, github, ini, lt, php, qiita, Se, set, Sqlite, timezone, Tokyo, TwitterAPI, UP, コード, これ, システム, スクロール, スケジュール, ソース, ツイート, ところ, バージョン, パラメーター, ファイル, 一部, , 予定, 予約, 事項, , 使用, 偏頭痛, , 先日, 変更等, 大変, 投稿, 掲載, 数珠繋ぎ, 更新, 機能, 機能等, 此処, 注意, 管理, 編集, 記事, 近日, 追加, ,


基本情報技術者試験ワード集と単語帳作りアプリで学習の下準備をする方法! #FE #英語 #効率

20221006

Logging

おはようございます、朝、3時半頃から起きています😪。

先日から英語の勉強をアプリではじめました、自分が使用しているのはモノグサというアプリです。このアプリをインストールしたのは二年前の話です、そのアプリを使用して効率良く英単語を覚えていってます、なんかよく分からないけど覚えて行けている🙄。

さて、それとは別に本題のお話です、単語帳作りアプリを使って基本情報技術者試験に出てくるワードを再学習しています。ワードの方は基本情報技術者試験ドットコムから引っ張ってきています、そのワードをCSV化してアプリに入れました。個人的に使用している分にはOKですが、これを公開や共有するとNGになりますので使用時はお気をつけてください🙇。

ワードを収取する方法はブラウザのコンソール画面に下記のコードを貼り付けて収集しました。
基本情報技術者試験ドットコムのキーワード集「あ」から「ん」までのリンクページをそれぞれ開きコンソール画面でコードを実行して、それをUTF8のファイルにペーストして一つのファイルにしてCSV保存。本当はnode.jsでコードを書いて実行でもしようかなと思っていたのですが、それすら面倒くさいと思ったので、こちらの地味な方法を選択しました。尚、行末に必要なカンマを追加して上げてくださいね🙄。

let s = [];
let $moji = function(m){
   return String(m).replace(/[\,|\n|'|"]/g," ");
};
Object.keys(document.querySelectorAll(".big")).forEach((e)=>{
    s[e] = "'" + $moji(document.querySelectorAll(".big")[e].innerText) + "'" + "," + "'" + $moji(document.querySelectorAll("ul > li > div > div")[e].innerText) + "'";
});
copy(s.join("\n"));

タグ

, CSV, FE, NG, OK, アプリ, インストール, お気, お話, キーワード, コード, これ, コンソール, それ, ドットコム, ブラウザ, モノグサ, ワード, 下準備, 下記, , 使用, 先日, 公開, 共有, , 効率, 勉強, , 単語帳, , 収集, , 基本, 学習, 情報, 技術者, , 方法, , 本題, 画面, 自分, 英単語, 英語, 試験, ,


文字数カウントは奥が深いよ。日本語より𓅇エジプト😇 #javascript #code #プログラミング #unicode

20221005

Logging

おはようございます、先日(日曜日のこと)は久しぶりに本屋さん巡りしていました😋。本屋📖は良いですね落ち着きます。

さて、文字コードのカウントは奥が深いなって話を記載していきます。人目線からすれば文字をカウントするという至って簡単な話にですが、PC(コンピューター)にとっては奥が深いです・・・日本語漢字も面倒だけどエジプト系の象形文字系(unicode)は本当に面倒そうです。まだ、作りかけですがツイッターの用な文字コードのカウントするjavascriptコードを書きましたのでサンプルコードとしてご使用ください

※WindowsOSの環境下でChromeブラウザ動作させ検証しました。コピペ文字には対応していません😇。UTF-8 ではない違う文字コードを貼り付けてみてください、変なことになると思います😂。例えばEUC文字コードだとか・・・。

動作サイトはこちらです。

        function moji(o) {
            let m = o.nextElementSibling;
            //ads
            let h = ((o) => {
                let l = o.value.match(/(https?:\/\/[a-z|A-Z|0-9|\-|_|%|\.|\/]{0,})/giu);
                let ml = l ? ((l) => {
                    return sum = l.reduce((s, e) => {
                        return s + e.length;
                    }, 0);
                })(l) : 0;
                return l ? {
                    len: (l.length * 23),
                    mlen: ml
                } : {
                    len: 0,
                    mlen: ml
                };
            })(o);
            //zenkaku            
            let k = ((o) => {
                let l = o.value.match(/[^\x20-\x7e]/giu);
                let ml = l ? ((l) => {
                    return sum = l.reduce((s, e) => {
                        return s + e.length;
                    }, 0);
                })(l) : 0;
                return l ? {
                    len: (l.length * 2),
                    mlen: l.length
                } : {
                    len: 0,
                    mlen: ml
                };
            })(o);
            m.innerHTML = "【 " + (o.value.length + h.len - h.mlen + k.len - k.mlen) + "文字{半角/280} 】";
            if ((o.value.length + h.len - h.mlen + k.len - k.mlen) >= 280) {
                m.innerHTML = "<span class='text-danger'>【 " + (o.value.length + h.len - h.mlen + k.len - k.mlen) + "文字{半角/280} 】</span>";
            }
        }
                    <label for="my-textarea" class="h3">文字を入力してください。</label>
                    <textarea id="my-textarea" class="form-control" oninput="moji(this);" name="" rows="3"></textarea>
                    <span class="h3"></span>

尚、サンプルコードは1バイトを一文字としてカウントしていきます、そしてURL文字はどんなに長くても23文字にカウントされます、これはTwitter社の仕様と合わしています。URL文字はURL短縮が行われ23文字の短縮URLが生成されるからその様にカウントしているのですが、なんか本物と違うですよね挙動が・・・🙇‍♂。因みに絵文字がどのようにカウントされるかは確認していません。

UTF8では絵文字(unicode)を3バイトで表記させているそうです。昔、UTF-8は2バイトで表現しているとか習っていたのですが、それはカナリ古い知識だったみたいです😇。

タグ

8, Chrome, Code, EUC, javascript, PC, Unicode, UTF-, WindowsOS, エジプト, カウント, コード, こと, コピペ, コンピューター, サンプル, ツイッター, ブラウザ, プログラミング, 久しぶり, 人目, 使用, 先日, 動作, , , 対応, , 文字, 日曜日, 日本語, 本屋, 本当, 検証, 漢字, 環境, , 簡単, 記載, , 象形, 面倒,


Twitter-API-v2ツイート数珠繋ぎ #コード公開 #php

20221004

Logging

おはようございます。土日祝も関係なくブログは毎日書いています🤮。

さて、今日はPHP言語でTwitterAPIバージョン2(v2)を使用してツイート数珠繋ぎをする方法を抜粋して記載していきます。こういうコードは今のところ出回っていないようです。少し調べれば公式サイトに記載しているのだけども・・・。まだ、日本語に対応した記事が少ないようです。v2でツイートする方法やリツイートする方法は何故かあるのだけどリプライ(Reply)[/statuses/update]する方法が記事としては記載していなかったので?記載します。

<?php
require_once "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

class tw{
    var $connection = null;
    function __construct()
    {
        $this->connection = new TwitterOAuth(APIKEY, APISECRET,ACCESSTOKEN, ACCESSTOKENSECRET);
        $this->connection->setApiVersion("2");
    }

    function pickup_tweets(mixed $tw_text=null){
         $obj = (object)[];
        if(isset($tw_text) && is_array($tw_text)){
            foreach ($tw_text as $key => $value) {
                if(preg_replace("/[ | ]/","",$value)){
                    $obj = !$key?(
                        $this->connection->post("tweets", ["text" =>$value], true)
                    ):
                    (
                        $this->connection->post("tweets", ["reply"=>["in_reply_to_tweet_id"=>$obj->data->id],"text"=> $value], true)
                    );
                }
            }
            return true;
        }
        return false;
    }
}

最初に結論とコードのアルゴリズムに付いて解説します。まず、tweetsのパラメーターでリプライ出来るように変更されています。v1.1とはそこが変わっているので同じ仕組みを検索しがちですがそれでは検索にヒットしないようです🤔。まずはエンドポイントの変更点の確認が必要みたい👏。

エンドポイントのv1.1からv2への対応表

エンドポイントのv1.1からv2への対応表が公式から出ているので確認してみてください↑。

次にコードの解説ですがまずTwitterOAuthライブラリをインストールを行い、defineなどの設定なども考慮した上で実行してみてください(コードに追記記載が必要)。変数、$tw_textは配列です。また投稿する文字が入っていると考えてください。そしてこのコードを下記のような考え方で実行してみてください。

<?php
       require_once "tw-index.php";
       $tw_text[0] ="test1";
       $tw_text[1] ="test2";
       $tw = new tw();
       if($tw->pickup_tweets($tw_text)){
        $ret["msg"] = "ok";
       }else{
        $ret["msg"] = "NG";
       }
       var_dump($ret);

※前提条件としてtwitter社にAPIの申請を行って受理されている事。

Twitter API v2 ツイート数珠繋ぎ

これで思った通り実行出来たと思います。尚、自分のように管理画面などを作って数珠繋ぎの投稿するのも良いかも知れません🫠。

タグ

2, Abraham, autoload, class, connection, function, lt, null, once, php, quot, Reply, require, statuses, tw, Twitter-API-v, TwitterAPI, TwitterOAuth, UPDATE, use, var, vendor, コード, サイト, ツイート, ところ, バージョン, ブログ, リツイート, リプライ, , 今日, 使用, 公式, 公開, 土日, 対応, 少し, 抜粋, 数珠繋ぎ, 方法, 日本語, 毎日, , 言語, 記事, 記載,


Dockerは楽だなという事を今頃理解しましたよ。 #vbox #docker

20221003

Logging

おはようございます、月曜日の朝はテンション低めな方も多いはず😇。

さて、今日は先週の木曜日と金曜日にふと今後のためにDockerをもう少し触ってみようと思い作業終了後触ってみました、触れて気づいた事は開発環境を作るのがとても楽だということ(気づくの遅い?🫠)。自分は昔の人間なのでvisualboxばかり触っていたのですがDockerは素晴らしい。サーバー周りが得意な人にイメージを作ってもらってそれを共有すれば皆、同じ環境下で開発が出来るので良いという事に今頃気づいた・・・。

 docker run -it -d -v C:\var\www\html\:/var/www/html --privileged -p 80:80 --name こんてな命名 イメージid /sbin/init

※Visualboxでも可能ですけどね。Dockerのだとそこが楽だしマウント(フォルダ共有)もスムーズに行くので自分は良いなと感じました。

ちょっと残念だった点は自宅で作業している中、バッファローのNAS🍆に作業ファイルを入れているのですが、それとは共有出来なかった点です、対応として実PCをrobocopyしてNASと同期を取るという形にしました。これで問題はなくテスト環境下で開発ができます。尚、高級なNASではそういう問題なく上手くいくそうですよ。※NASはバックアップデータになりました。

robocopy <コピー元> <コピー先> /E /DCOPY:DAT

尚、mirのオプションにしなかったのには理由があります。コピー元のファイルが消えたり、ディレクトリが破損した場合、コピー先のファイルやディレクトリが消えて無くなるらしいので・・・。完璧なミラーリングは辞めました。

こんな感じで快適なテスト環境が作れます(上記のコマンド参考に)。

タグ

--privileged, -p, -v, 80, D-, docker, html, ID, init, IT, name, run, sbin, var, vbox, Visualbox, www, イメージ, こと, こんてな, サーバー, スムーズ, そこ, それ, ため, テンション, パス, フォルダ, マウント, , , 人間, 今後, 今日, 今頃, 低め, 作業, 先週, 共有, 可能, 周り, 命名, 得意, , , 月曜日, , 木曜日, 理解, 環境, , 終了, 自分, , 金曜日, 開発,


映画、雨を告げる漂流団地の監督さんの語りを聞いて映画も観てみた。 #雨を告げる漂流団地 #Netflix #Hiroyasu-Ishida

20221002

Logging

おはようございます🫠、社会との接点はブログになっている今日此の頃です。クラウドワークスは何だか質が落ちているような気がします。

さて、作品を社会に公開すると色々な意見を言われる事になると思います。映画が世に出るという事はそこには色々な人々が関わっています。今回「雨を告げる漂流団地」を7回に別けて観ました。もう色々と感性が抜け落ちているので、良し悪し正直な所分からなかったですが、アイディア等は面白いなと感じました。

Hiroyasu Ishida – Being an Animation Film Director

これを小学生や幼い子供が観たら、やっぱ特別な感覚や感情を抱くだろうなと思い、そういう作品を作れるというのは特異な才能(石田祐康 監督)なんだと感じます。

映画『雨を告げる漂流団地』本予告映像【9月16日(金) Netflix全世界独占配信 & 日本全国ロードショー】

こういう作品は大人が観るのではなく子供が観て面白かったと思えば良いですよと、この映画のレビューを見て思いました。そして今回の作品もそうですしペンギン・ハイウェイの作品もそうなんだと思いますが、作品を通して子供が成長して欲しいという想いが伝わる映画でした。

因みにこの映画、自分はネトフリアニメで数回に分けて観ました😌。

タグ

7, Hiroyasu-Ishida, Netflix, アイディア, クラウド, これ, そこ, なん, ブログ, ペンギ, レビュー, ワークス, , 人々, 今回, 今日此の頃, 作品, 公開, 団地, 大人, 子供, 小学生, 意見, 感性, 感情, 感覚, , 才能, 接点, 映画, 正直, , 漂流, 特別, 特異, 監督, 石田, 社会, 祐康, 良し悪し, 色々, , ,


見えないテコ入れ人の感覚。#スキマ時間 #ブログ

20221001

Logging

おはようございます、今日も朝に記事を書いています😌。もう10月ですね、これを書いていたのは9月29日です。この頃、少しリアルとタイムラグのあるモノにしています。

さて、今日はブログを毎日書いて意味があるのかというお話です。最初に回答を記載します、アクセス数にはあまり影響を及ぼす事はありません。YさんやGさんの検索サービスがどの記事を拾ってくれるかなんて分からないです。そういう観点から言えば色々な記事を書いてアクセス数の多い記事へ路線変更するとアクセス数は稼げます。

ただ、好きでもない内容の記事がアクセス数が多くなったりする場合があります。その場合、お金のために記事を書くことになります、そう言うのは続かないので辞めたほうが良いです🫠。自分の記事は好きな事しか書いていないけれど、それなりにアクセスが付くようになりましたが・・・。自分が読んでほしい記事にアクセス数が付くとは限らないのが今の悩みどころですね。

そういう事もあって10月から眠らせていたブログを一つ再活動しようと思っています。再活動の理由は収益化です、そしてこのサイトのYOUTUBEもトライしてみようと思います。この2つの活動の共通点は広告が付いていないということYOUTUBEの登録者数は9人です。ブログに至っては訪問者は10桁いかない日さえあるサイトでが、更新頻度を上げれば半年でそれなりの数は付くという勝算はあります。

明日から我らWEB主義というサイトとYOUTUBE(zip358com)、不定期更新という名目で活動しますので良かったらそちらもよろしくお願いします🙇。

タグ

10, 29, , アクセス, お話, お金, こと, これ, サービス, すきま, タイムラグ, ため, テコ入れ, ブログ, もの, リアル, , , 今日, 内容, 回答, 場合, 変更, 少し, 影響, 意味, 感覚, 時間, 最初, , 検索, 自分, 色々, 観点, 記事, 記載, 路線, ,


有難う🎉一年と七ヶ月と二十九日😌で達成。

20220930

Logging

おはようございます、御機嫌よう😋。

アイキャッチー画像とタイトルでお分かりかと思いますが、振り込み金額の上限を超えた為、振り込まれます。この振り込まれたお金の使い道はまだ決まっていませんが、大切に使います😌。

毎月、大体レンタルサーバー費用と相殺出来る金額を稼いでいるようです。先月からサービスを稼働させて3つのサービスで運用しています。これにより今月からまぁまぁな金額が発生してきましたが、それでもこれだけで生きてはいけません。

毎月、15万ぐらい稼いでいる人は強者ですね。やっぱりYOUTUBE始めた方が良いのかな🤔。昔、1000人の登録者でもYOUTUBEは小学生(高学年)のお年玉ぐらい入ると聞いた事があります。今は広告単価が下がっているようなので、もう少し低いかも知れませんが放っといても稼ぎがでるというのは、素晴らしい事ですね。

自分の今後の運営目標は、毎月、お金が振り込まれるようになる事です。これを達成出来れば何とかなりそうな気がします。今の現状、クラウドワークスの仕事が取れなかったら投資で何とか引き落としペイ出来る感じで生きているので・・・。ちゃんと収入が発生するシステムを構築したいなって切実に思います。

タグ

1000, 15, , youtube, あい, お分かり, お年玉, お金, キャッチー, これ, これだけ, サーバー, サービス, タイトル, レンタル, , , , 上限, , 二十九, , , 今後, 今月, 使い道, 先月, 単価, 大体, 大切, 学年, 小学生, 広告, 強者, , , 毎月, , 画像, 発生, 登録者, 目標, 相殺, 稼働, 自分, 費用, 運営, 運用, 達成, 金額,


人生、レベル20~45の方々。 #人生 #相場下落

20220929

Logging

おはようございます、このサイトのユーザー(訪問者)さんの年齢層はレベル20~45が多いそうです。特にレベル30の方がよく見てくれています。有難うございます🙇。また、性別は男性が圧倒的に多いです、ここは女性が多かったらなと思う所がありますが、リアルと現状は変わりません(笑)🤔。

さて、自分は30代後半から投資に興味を持ち出して今では証券口座をいくつか持っています。最初は株式投資などに興味があり、アプリで仮想投資(シュミレーション)などをして、どんなモノかを試してみました。本当に株を買い出したのは最近の話です💦。いま、日本市場も米国市場も下がっていますね、自分が思うのに緩やかにこれからも下っていくと思っていますが・・・未来は不確定です。

未来は誰も分からない。特に10年後の相場なんて分からないし誰も予想できない、米国株、今後も成長すると言われていますが、それは過去の成長を見てそう予測しているのに過ぎなくて本当に成長するのかは誰にも予測するのは不可能です。

「未来は不確定」この頃、こう思う事がよくあります。株式相場に限らず自分の未来も分からないのです、明日の事を言えば鬼が笑うということわざがある通り、明日すら予測不能なんですね。80%は平凡な一日になるかも知れませんが100%断言する事は不可能です。それは未来は知り得ることが出来ないからです。

当たり前の話ですが、ほとんどの人は明日も同じような日が続くと思っているわけです。でも実際は違います、世界は徐々に変わっていきます。なので、10年後の未来は変わっているのです。日々の少しの変化が未来を変える。

トイウコトデ、何が言いたいかと言えば、自分を変えることで未来は変わっていくという事です😌。何を言わんとしているか分かってもらえれば何よりです😄。

今日も一日頑張りましょう!

タグ

10, 20, 30, 45, アプリ, いくつか, いま, ここ, これ, サイト, シュミレーション, それ, もの, ユーザー, リアル, レベル, 下落, 不確定, 予想, 予測, 人生, , 今後, 仮想, 口座, 女性, 市場, 年齢層, 後半, 性別, 成長, , 投資, , 方々, 日本, 最初, 最近, 未来, 本当, , 株式, 現状, 男性, 相場, , 米国, 自分, 興味, 訪問者, 証券, , , 過去,


WPのapply_filtersとadd_filterの説明が難解に書いているサイトが多い事に🤬。 #php #wordpress

20220928

Logging

おはようございます、今月もそろそろ終わります🤔。

さて、来月から毎月一回しか投稿しなかったブログサイトを不定期更新に変更します。指針の変更にあたってブログデザインもデフォルトのテンプレートから無料のcocoonというテンプレートに変えました。

今までYOUTUBE動画URLを記載しているだけの投稿だったので、アイキャッチー画像等は無い状態でした。その為、テンプレートを変えるとノーイメージという画像が表示されるという事象が発生。これをプラグイン側で解決したかったのですが、独自の関数を多く使用しておりプラグイン側だけでは無理だということで、独自のアイキャッチー画像を処理しているコアの部分にapply_filtersを差し込み、プラグイン側でadd_filterで処理するという流れの対応を行いました。

apply_filtersというのはテンプレート側(他のプラグインでも可能)の関数の中に目印(付箋)を付けることが出来る機能(関数)です。
add_filterは目印(付箋)の部分の処理が走った時に、自分が作った処理を割り込ませることが出来る機能(関数)です。

※まずはカッコの中は読まずに理解してください😌。

巷では、これをややこしい例えで解説している所が多いのですが、それだけの話しです。今回、image-funcs.phpファイル(cocoon)の関数get_original_image_tagにapply_filtersを挿入し独自プラグインから呼び出して、ノーイメージの時にYOUTUBEのサムネイル画像を表示させるという事を行っていました。前、次ページのサムネイル画像は現在のページのサムネ画像が表示されるというバグはあるものの、ちゃんと跡のサムネ画像は変わっています。

サンプルコードを掲載します。ご参考程度に😌。

<?php
//オリジナルサムネイルタグの取得
if (!function_exists('get_original_image_tag')) :
  function get_original_image_tag($image_url, $width, $height, $class, $alt = null)
  {
    $html = '<img src="' . esc_url($image_url) . '" alt="' . esc_attr($alt) . '" class="' . esc_attr($class) . '" width="' . esc_attr($width) . '" height="' . esc_attr($height) . '" />';
    $html = convert_all_lazy_load_tag($html);
    $html = apply_filters("youtubeimage",$html);
    return $html;
  }
endif;
<?php
/*
Plugin Name: youtube image
Description: youtube image chg
Version: 1.0
*/
if (!defined('ABSPATH')) exit;
function youtubeimage_chg($imgurl){
    $url = null;
    if(preg_match("/(https:\/\/www\.youtube\.com\/watch\?v=[\-|_|a-zA-Z|0-9]{1,})/",get_the_content(),$matches)){
        $url = "https://img.youtube.com/vi/".preg_replace("/(https:\/\/www\.youtube\.com\/watch\?v=)/","",$matches[0])."/hqdefault.jpg";
        $url = preg_replace("/(src=\"https:\/\/.*no\-image\-[0-9]{2,3}\.png\")/","src=\"".$url."\"",$imgurl);
     }
     return $url?$url:$imgurl;
}

add_filter("youtubeimage","youtubeimage_chg");

余談:この対応はテンプレートが更新(アップデート)際にファイルが上書きされる可能性があります。その際にページが見えなくなるという問題を秘めています🙇。

タグ

Add, apply, cocoon, filter, filters, php, url, WordPress, wp, youtube, あい, イメージ, キャッチー, コア, こと, これ, サイト, デザイン, デフォルト, テンプレート, ノー, プラグイン, ブログ, , 不定期, , 事象, 今月, 使用, 処理, 動画, 変更, 多く, 対応, 投稿, 指針, 更新, 来月, 毎月, , 無料, 状態, 画像, 発生, 表示, 解決, 記載, 説明, 部分, 関数, 難解,


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

20220927

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, コード, これ, コンシェルジュ, ソース, タイトル, よんでん, 不具合, , 合計, 夕方, 実際, 差異, 感じ, , 料金, 日別, 昨日, , 発生, 表示, 解消, 計算, 記事, 金額, 電力,


検索されなかったワード埋もれた価値について! #javascript #php

20220926

Logging

おはようございます、今日は引き落とし日です🫠。

さて、今日は検索されなかったキーワードの価値のお話です。此処で言う検索されなかったというのは、エンターキーや検索ボタンを押さなかった、キーワードの価値のお話です、たぶん、その情報をGさんは収集してそうな気がします。GサイトやYサイト等のキーワード収集は基本出来ませんが、自サイトの検索フォームの情報を収集出来ます。

此処からは技術的なお話になりますが、検索ボタンを押した時とは別に文字入力をしたときの挙動を感知するプログラムを導入する事により比較的簡単に導入できるかと思います。例えば下記のようなjavascriptコードを検索フォームに導入します。

document.getElementById("sh").addEventListener("input",(e)=>{
    $.ajax({
        type: "post",
        url: "example.com/sh.php",
        data: {text:this.value},
        dataType: "json",
        success: function (response) {
            
        }
    });
});

あとはPHP側でデータを受信しデータベース等に保存すれば良いだけです。この検索されなかったワードは、結構価値があると思います。より細かな情報を取得したい方はIPアドレスどのページからの情報なのかも取得可能です。

これらのデータを元に販路開拓は十分出来ると思います。情報を保存する際に大量の情報が収集されるので、保存先に一工夫必要になります。JSで制御する手段もありますが、それだとあまり情報収集出来ないですからね。

因みにこのサイトに情報収集の処理は導入していません(今後の導入は未定)。

タグ

addEventListener, ajax, document, getElementById, gt, input, javascript, php, quot, sh, エン, お話, キーワード, コード, サイト, ターキー, とき, フォーム, プログラム, ボタン, ワード, 下記, , 今日, 価値, 入力, 収集, 基本, 導入, 情報, 感知, 挙動, 文字, , , 検索, 此処, , 簡単, ,


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

20220925

Logging

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

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

https://yosakoi-video.com/

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

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

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

タグ

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


インターネットが常時接続が当たり前になって数年。

20220924

Logging

おはようございます、予約するのを忘れて今記事を書いています🫠。

先日、ふと思ったことを記載しますね、インターネットの常時接続が当たり前になってから、10年以上の時間が経過しています。

そんな中、この頃TVの劣化が酷いなと感じることもあります、それぐらい劣化している気がします。番組も健康商品などの通販TVが多く感じます、また、コマーシャル(CM)も健康商品か保険のCMが多い気がします。

『天才の頭の中: ビル・ゲイツを解読する』予告編 – Netflix

これはどの局も同じで、どんどんとTVが劣化していっている証拠なのかもしれません。もうTVを見るのは高齢者ばかりになっている気がします。因みに私達の世代ももうインターネットでYOUTUBE等を見る割合が増えているらしいです。

そう思うと自分達が老人になる時にはTVって存在感がますます薄れていくのか、TVがインターネットへ寄り添う形、例えば今、実験的に始まっているTVの放送をインターネットに流す試みを定着させるしか他ならないような気がします。

何にせよ、あと数十年後にはYOUTUBEが老人のプラットホームになることは間違いないでしょう🫠、その頃、若者たちはVR等の違うプラットホームで生きていると思います。

時代の流れを感じる今日此の頃でした。

タグ

10, CM, TV, youtube, インターネット, こと, コマーシャル, これ, それぐらい, 世代, , 予約, , 保険, 健康, 先日, 割合, 劣化, 商品, 存在感, 定着, , 常時, 当たり前, , 接続, 放送, , , 時間, , 番組, , , 経過, 老人, 自分, 記事, 記載, 証拠, 通販, , 高齢者,


ハローワークの求人番号からバーコード生成印刷。#php #WEBサービス

20220923

Logging

おはようございます、今日は三連休の始まりだそうですね🤔。

本日はハローワークの求人番号からバーコード生成&印刷できるWEBサービスを制作したので、そのお知らせ話になります。何故、このようなWEBサービスを作ったのかというと1つ目の理由は無かったから、そして何より自分が欲しかったからに他ならないという理由です。

https://358tool.com/

プログラムの話になりますがバーコードを生成する部分はライブラリを使用していますのでデータだけ渡せば画像データ作ってくれます、そんな訳で開発には時間はかからなかったのですが!。ハローワークが使用しているバーコード形式が何なのかという事を探すのに若干、時間を使いましたが開発自体は数分レベルです🫠。

このWEBサービスは無償で且つ広告などは今のところ掲載していません。このサービスだけは今後も広告無しで運営していくつもりです。尚、358tool.comでは今後もいろいろなツールを提供していきます。起動に乗ったサービスは新たにドメイン取得して運用するスタンスで運営していきます。

話し戻しまして、自分がこのサービスが欲しかった理由はハローワークサイトで求人を探し、その番号をメモして公共職業安定所に出向き、安定所のPC端末から求人票を印刷するのが面倒くさく感じた為、この無駄な作業をひと手間無くそうと思って今回の制作に至りました。

求人番号コピペしてWEBサービスに貼り付けるとバーコードが生成されるので便利。そしてそのページを印刷し職業安定所の人に渡すと職業安定所の人もわざわざ入力する必要もないのでWINWINな関係ですwww。

🙆https://358tool.com/hellowork/

どうぞ、求職中の人はお使いくださいませ。
シェアやRT宜しくお願い致します🙇

タグ

, 358, com, php, tool, web, いろいろ, お知らせ, サービス, ツール, つもり, データ, ところ, バーコード, ハローワーク, プログラム, ライブラリ, レベル, 三連, , , 今後, 今日, , , 使用, 制作, 印刷, 広告, 形式, 掲載, 提供, 数分, 時間, 本日, 求人, 無償, 理由, 生成, 画像, 番号, 自体, 自分, 若干, , , 運営, 部分, 開発,


ページ無限スクロールの作り方 #インフィニティ#InfinityPageScroll #JavaScript

20220922

Logging

おはようございます、台風14号が過ぎ去ってからいきなり秋模様ですね🫠。

さて、先日ツイートしたページ無限ループが出来るJavaScriptコードを書きました。これを作ろうと思ったキッカケは、自分が運営しているWordPressサイトに巷のページ無限スクロールプラグインが尽く(ことごとく)使用出来なかったので自分で自作した訳です。因みにページ無限スクロールプラグインとはページを送りをしなくてもページの最下までスクロールすると次頁を読み込んでくれるプラグインの事を指します。

下記のコードは自サイト専用なのでそのまま使用することは出来ませんが、重要な部分だけ抜き取って再利用すれば、独自のページ無限ループに対応することは可能かと思います。

コードを読んで頂ければ分かることですが、重要なポイントはページを読み込む方法とそれをDomに変換する方法だと思います。まず、ページを読み込む方法は下記のファンクションで可能です。

fetch(next_url).then(
                response => response.text()
            ).then(data => {

そしてDomに置き換えている所はこの部分になります。これら2つの箇所が重要になります。

                const parser = new DOMParser();
                const doc = parser.parseFromString(data, 'text/html');

これらの事に注意して独自コードを書いてみてください。最後に全コードを記載しときます。


let cnt = 2;
let blk = 0;
async function nextpage() {
    if (cnt !== blk) {
        blk = cnt;
        await (async () => {
            let next_url = "https://fox-black.com/blog/page/" + cnt;
            return await fetch(next_url).then(
                response => response.text()
            ).then(data => {
                const parser = new DOMParser();
                const doc = parser.parseFromString(data, 'text/html');
                let blogs = doc.querySelectorAll('.blogpage');
                cnt++;
                if (blogs[0].innerHTML !== undefined) {
                    document.querySelector(".foxpage").insertAdjacentHTML("beforeend", (function (elm) {
                        let str = "";
                        for (const key in elm) {
                            const element = elm[key];
                            if (element.innerHTML !== undefined) {
                                str += "<div class=\"blogpage\">" + element.innerHTML + "</div>";
                            }
                        }
                        return str;
                    })(blogs));
                } else {
                    if (document.querySelector("#fin") === null) {
                        document.querySelector(".foxpage").insertAdjacentHTML("beforeend", "<div id=\"fin\"></div>");
                    }
                }
            }).catch(error => {
                if (document.querySelector("#fin") === null) {
                    document.querySelector(".foxpage").insertAdjacentHTML("beforeend", "<div id=\"fin\"></div>");
                }
            });
        })();
    }
}

if (navigator.userAgent.match(/iPhone|Android.+Mobile/)) {
    window.addEventListener("scroll", async function () {
        let s = (() => {
            let tgt;
            if ('scrollingElement' in document) {
                tgt = document.scrollingElement;
            } else if (this.browser.isWebKit) {
                tgt = document.body;
            } else {
                tgt = document.documentElement;
            }
            return tgt;
        })();
        if (document.querySelector("#fin") === null && s.scrollTop >= (s.clientHeight - 650)) {
            await nextpage();
        }
    });
} else {
    document.querySelector(".foxpage").addEventListener("scroll", async function () {
        if (document.querySelector("#fin") === null && document.querySelector(".foxpage").scrollTop >= (document.querySelector(".foxpage").scrollHeight - 300)) {
            await nextpage();
        }
    });
}


タグ

14, dom, InfinityPageScroll, javascript, WordPress, インフィニティ, キッカケ, コード, こと, これ, サイト, スクロール, それ, ツイート, プラグイン, ページ, ポイント, ループ, 下記, , 作り方, 使用, 先日, 利用, 可能, 台風, 変換, 対応, 専用, , 方法, 最下, 模様, 次頁, 無限, , , 自作, 自分, , 運営, 部分, 重要,


実写映画化されたヘルドッグスを観ましたよ。#実写映画化 #漫画 #小説

20220921

Logging

おはようございます、映画やゲームの批評が出来るねっとも!の様なオマージュサイトを作ろうと思っています🤐。考え中。。。

さて、実写映画化されたヘルドッグスを観ましたので感想を残しときます。

<本予告>映画『ヘルドッグス』9月16日(金)全国公開
https://www.helldogs.jp/

感想:ヘルドッグス 地獄の犬たちという漫画の存在は知っていたのですが読んだことはなく(小説が恐らく先で後から漫画化されたかと思います)、そのまま何の予備知識を入れずに今回、実写映画化されたヘルドッグスを観たのですが、意外にもその世界観に入り込めて良かったです🙆。楽しめました👍。

裏を返せば予備知識を入れると何だか映画が楽しめないかもなって自分は思いました。辛口な批評になっていたかもしれません。何故なら映像も良かったし演技、演出も良くストーリー展開も良かった。特にストーリー展開は小説か漫画がベースになっているだろうし、キャラクターも個性豊かだったことが小説や漫画を読まずして想像出来るので、恐らく小説や漫画は映画に負けない作りになっている事が想像出来るからです。

まとめ、小説や漫画を観ていない人は予備知識ゼロのまま映画館で観てください。そしてエンタメ作品なのであまり深く考えずに映画を楽しんでください😌。尚、12歳以上の作品らしいです、、、まぁ😅。そうでしょうねヤクザVS潜入捜査(闇堕ちした警察)の話ですから・・・(フィクション)。

タグ

オマージュ, キャラクター, ゲーム, こと, サイト, ストーリー, ドッグス, ネット, ベース, ベル, 世界観, 予備知識, 今回, , 個性, , 地獄, 存在, 実写, 小説, 展開, , , 想像, 感想, 批評, 映像, 映画, 演出, 演技, 漫画, , 自分, , 辛口,


Sqliteで作った簡易掲示板のコードを配布致します。#php #code

20220920

Logging

おはようございます。台風は過ぎ去りましたがせっかくの三連休が残念です💦。

今日は先日、Sqliteを使用して簡易掲示板を作ってみましたのでコードを配布致します、尚、PHP8の環境下で動作させています(PHP7系でも動作すると思います)。

Sqliteってnow()関数がなかったりだとか、Deleteする時に、noカラムを昇順しlimitを使用して削除出来ないだとか、いろいろとMysqlとは違う所があり、面倒だなと思いながらコードを書きました、尚、SqliteはWebサーバーの階層に置かないように、置いても良いですが・・・。そのままの状態だと誰でもダウンロードが可能になってしまいますのでご注意ください。自分は地下に眠らしています😅。

一応、二重投稿防止の為に20秒経過しないと再投稿出来ないようにしています😌。トライしていない事は禁止ワード等がありません🤔。つけようと思ったのですがまぁ良いかなと、、、。

動作している環境のリンクはこちら。

https://reborn9.sakura.ne.jp/

軸となるPHPのソースコードを2つ貼っときますね。

<?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">
    <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">
    <link rel="stylesheet" href="assets/css/style.css?<?= time() ?>">
    <title>掲示板</title>
</head>

<body class="p-3 text-white">
    <div class="p-4 shadow rounded" style="background-color:#d6dbdf;">
        <div class="container mt-5">
            <div class="row">
            <div class="col-12 text-center">
                <h1 class="shadow" style="color:#195a57;">掲示板::version 2.5</h1>
            </div>
                <div class="col-12">
                    <div class="input-group shadow rounded">
                        <div class="input-group-append">
                            <span class="input-group-text bg-dark text-white" id="my-addon">ニックネーム</span>
                        </div>
                        <input class="form-control" type="text" name="name" placeholder="ニックネームを入力" aria-describedby="my-addon">
                    </div>
                    <div class="form-group shadow rounded">
                        <label for="my-textarea">コメント</label>
                        <textarea id="my-textarea" class="form-control" name="comment" rows="7"></textarea>
                    </div>
                    <button id="btn" class="mt-2 btn btn-info text-white shadow rounded" type="button">投稿する</button>
                </div>
            </div>
        </div>
        <div class="container mt-5">
            <div class="row">
                <div id="view" class="col-12"></div>
            </div>
        </div>
    </div>
    <footer>
        <a href="/">TOP</a> :: © Reborn9.sakura.ne.jp <?=date("Y")?>
    </footer>
    <input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">
    <script src="https://code.jquery.com/jquery-3.2.1.min.js" crossorigin="anonymous"></script>
    <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>
<?php
class db
{
    var $pdo = null;
    function __construct()
    {
        try {
            $this->pdo = new PDO("sqlite:../../bbs.sqlite3");
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);        //code...
        } catch (\Throwable $th) {
            //throw $th;
            print $th->getMessage();
        }
    }
    function select_limit()
    {
        if($this->pdo){
            $stmt = $this->pdo->prepare('select * from bbs order by no desc limit 0,5');
            $stmt->execute();
            $result = $stmt->fetchAll();
            $stmt = null;
            $this->pdo = null;
            return new view($result);
        }
    }
    function insert($name,$comment,$sns_cnt=0)
    {

        try {
            $stmt = $this->pdo->prepare('INSERT INTO bbs (`time`,`name`,`comment`,sns_cnt)values(strftime(\'%Y年%m月%d日 %H時%M分%S秒\',CURRENT_TIMESTAMP, \'localtime\'),:name,:comment,:sns_cnt)');
            $stmt->bindParam(':name', $name, PDO::PARAM_STR);
            $stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
            $stmt->bindParam(':sns_cnt', $sns_cnt, PDO::PARAM_INT);
            $stmt->execute();
            $stmt = $this->pdo->prepare('DELETE FROM bbs WHERE bbs.no = (SELECT no from bbs ORDER BY no ASC LIMIT 1);');
            $stmt->execute();
            $stmt = null;
            $this->pdo = null;
            return true;
        } catch (\Throwable $th) {
            print $th->getMessage();
            return false;
        }
    }
}

class view{
    var $item = null;
    function __construct($item)
    {
        $this->item = $item;        
    }
    function view_item($item="")
    {
        try {
            $item = $item?$item:$this->item;
            ob_start();
            ?>
            
            <?php
            foreach($item as $key=>$value){
                ?>
                <div class="mt-2 row txtbox shadow rounded">
                <div class="col-3 name_<?=$value["no"]?> rounded-start fs-6">
                    ニックネーム::<?=$value["name"]?>さん
                </div>
                <div class="col-9 time_<?=$value["no"]?> fs-6">
                    投稿日時::<?=$value["time"]?>
                </div>
                <div class="col-12 comment_<?=$value["no"]?>">
                    <?= nl2br($value["comment"])?>
                </div>
                <div class="col-12 sns_cnt_<?=$value["no"]?>">
                    <!-- <?=$value["sns_cnt"]?> -->
                </div>
                </div>
                <?php
            }        
            ?>
                
            <?php
            $ret["view"]= ob_get_clean();
            $ret["msg"]= "done";
    
        } catch (\Throwable $th) {
            //throw $th;
            $ret["msg"] = "error";
        }
        return $ret;
    }
}

session_start();
$ret = null;
$mode =  xss_defence($_POST["mode"]);
// $time =  ;
$name =  xss_defence($_POST["name"]);
$comment =  xss_defence($_POST["comment"]);
$sns_cnt =  (int)xss_defence($_POST["sns_cnt"]);
if (isset($_POST["csrf_token"]) 
 && $_POST["csrf_token"] === $_SESSION['csrf_token'] && (function($t){
    return time() - $t > 20?true:false;
 })($_SESSION["save"])) {
    if($mode==="save"){
        $name = !preg_replace("/[ | ]/","",$name)?"匿名":$name;
        $comment = !preg_replace("/[ | ]/","",$comment)?"":$comment;
        if($comment){
            $db = new db();
            $db->insert($name,$comment);
            $_SESSION["save"] = time();
        }
    }
    $db = null;
    $db = new db();
    $ret = $db->select_limit()->view_item();
    print  json_encode($ret);
}
function xss_defence($value){
    if(is_array($value)){
        foreach($value as $key=>$val){
            $value["$key"] = strip_tags($val);
            $value["$key"] = htmlspecialchars($value["$key"],ENT_QUOTES);
        }

    }else{
        $value = strip_tags($value);
        $value = htmlspecialchars($value);
    }
    return $value;
}

配布コードはこちらです。

タグ

20, 7, 8, Code, Delete, LIMIT, MYSQL, no, Now, php, Sqlite, web, いろいろ, カラム, コード, ご注意, サーバー, せっかく, そのまま, ダウンロード, トライ, ワード, 三連, , , 今日, , 使用, 先日, 削除, 動作, 可能, 台風, 地下, , 投稿, 掲示, 昇順, , 残念, , 状態, 環境, 禁止, 簡易, 経過, 自分, , , 配布, 関数, 防止, 階層, 面倒,


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

20220919

Logging

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

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

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

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

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

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

タグ

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


エゴサーチしますか?しませんか? #世の中 #大変だな

20220918

Logging

おはようございます、今日から明日にかけて超大型台風が来るそうです🫠

さて、エゴサーチしますか?という問いに答えは「します」です、最初は見るのが嫌でしたが今はエゴサーチして何かしている人を見て思うことは、何でしているのだろうかと思うようになってきてます。

SNSの負の側面を見て、これはやってはイケナイ事だなという事が分かりますね、小学生や中学生などのSNSいじめが酷いという話をニュースなどで目にしますが、確かにこれはメンタルが強くないとダメージになるなと思います。

嘘や誹謗中傷などをデジタル上に残すわけですからね。それも殆どは消えないものです、被害者側からすれば一刻も早く消して欲しいものかも知れませんが消えません。

こういうのは警察も動きにくいケースが多いです。じゃどうすれば良いか。それはSNSを自分自身もアカウントを開設する事と発信する事が大事です。発信していると匿名や偽名を使って叩くアカウントもいるでしょうけど、それでも自ら発信していく事が大事になります。

発信するのは自分が思った事から、自分が興味を持ったものでも良いので、そういう事を発信する事です。尚、メンタルが弱い人はエゴサーチしないことも大事です。

昔は無視することが大事だと言われましたが、無視しても嘘や誹謗中傷は消えません。それが今の現実です、SNS運営会社に規約違反を報告しても消えないのが現実です。複数人が報告すれば消えますが、新たなアカウントを開設してのいたちごっこになります。

恨んだり誹謗中傷する人は、そんなに良い環境下にいる人ではないので弱い立場の人を見つけて叩きたくなるものだと思ってください。心に余裕がない人が大体叩いている傾向にあります。

こういう事は社会人になってもあります。自分が子供だった時、大人はもっとちゃんとした者だと思っていましたが、あまり子供と変わりません、子供に少し知恵が付いたのが大人なんだろうと・・・。ちゃんとした大人もいますが、あまりいない様な気もします。

そういう人達が、自分は正義だという斧を振りかざしてきますが、それって本当に正義なのでしょうか?正しいって何だろうかとたまに思います。一切、自分は悪くないと思ってやっているのでしょうかね。そうだったら人の気持ちを理解出来ない人なのかもしれないなって思います。

まぁそういう人とは関わらない方が良いですよ。器が小さい人達です。

そういう事ですので気にせずに前向きに生きてください。

タグ

SNS, アカウント, エゴサーチ, ケース, こと, これ, それ, ダメージ, デジタル, ニュース, メンタル, もの, 一刻, , , 中傷, 中学生, , , , 今日, 側面, 偽名, 匿名, 台風, , 大事, 大変, 小学生, 明日, 最初, 殆ど, 発信, , 自分, 自身, 被害者, , 誹謗, 警察, , 超大型, 開設,


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

20220917

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で伸びそうな人の共通点は何だろうか?

20220916

Logging

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

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

Figma Auto Layout Card Component Tutorial

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

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

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

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

タグ

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