x.gdのURL短縮機能を利用するためのコードを作りましたので、お裾分け.

2025.06.08

Logging

おはようございます.x.gdのURL短縮機能を利用するためのコードを作りましたので、お裾分けです、コードは下記になります.ドキュメントをぱぱっと見て作った感じなので不具合などが潜んでいるかもしれないけど恐らく大丈夫そうという事で木曜日の早朝にXでコードをシェアした形になります.

なお、x.gdからAPIの発行を行う作業をお忘れなく(こちらからAPIを発行).

因みに自分はt2t.jpというドメインを私有していて、こちらで自分専用の短縮URLを発行出来るようにしています.この頃は自分が作った短縮URLをあまり使ってないので、こちらをサービス化しようかな等と考えていたりします.

因みにどうするかは未定ですけどね.もしみんなが使用出来るようにしたら、このサイトでも告知します.

<?php
require 'config.php';

class ShortUrl
{

    public $apiKey = null;
    public $endPoint = 'https://xgd.io/V1/shorten?';

    public function __construct($api_key = null)
    {
        $this->apiKey = $api_key;
        return $this;
    }

    public function getShortUrl($url = null, $shortid = null, $analytics = true, $filterbots = false)
    {
        if (empty($this->apiKey)) {
            return json_encode(['status' => 0, 'message' => 'api-keyがありません']);
        }
        if (empty($url)) {
            return json_encode(['status' => 0, 'message' => 'URLがありません']);
        }

        if (isset($url) && !preg_match('/^http[s]?:\/\/(www\.)?/', $url)) {
            return json_encode(['status' => 0, 'message' => 'URLが無効です']);
        }

        if (isset($shortid) && !preg_match('/^([0-9a-zA-Z_]{6,15})$/', $shortid)) {
            return json_encode(['status' => 0, 'message' => '短縮コードが無効です']);
        }

        if (!is_bool($analytics)) {
            $analytics = true;
        }

        if (!is_bool($filterbots)) {
            $filterbots = false;
        }

        $parameter = [
            'key' => $this->apiKey,
            'url' => $url,
            'shortid' => $shortid,
            'analytics' => $analytics ? 'true' : 'false',
            'filterbots' => $filterbots ? 'true' : 'false'
        ];

        $response = @file_get_contents($this->endPoint . http_build_query($parameter));
        return $response;
    }
}

if($argv[1]){
    $url = $argv[1];
    $shortid = isset($argv[2]) ? $argv[2] : null;
    $analytics = isset($argv[3]) && $argv[3] === 'true' ? true : false;
    $filterbots = isset($argv[4]) && $argv[4] === 'true' ? true : false;   
    echo (new ShortUrl(APIKEY))->getShortUrl($url, $shortid, $analytics, $filterbots);
}

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, お裾分け, コード, こちら, サービス, サイト, シェア, そう, ため, ドキュメント, ドメイン, みんな, よう, 下記, 不具合, 作業, 使用, 利用, 告知, 大丈夫, 専用, 感じ, 早朝, 明日, 木曜日, 未定, 機能, 無効, 発行, 短縮, 私有, 自分,

Devin(でびん)とかいう生成AIが凄いらしいのは知っていたけど知らんけど

2025.06.06

Logging

おはようございます.Devin(でびん)とかいう生成AIが凄いらしいのは知っていたけどついに自分が勤めている会社でもDevinを導入したみたいです.ひとつのリポジトリはDevinさんがほぼコードを書いていて何だか悲しい気持ちになりました?.

逆に言えばこういうDevinみたいな高性能な生成AIを使えば自分一人でも高機能なwebサービスが出来るだなって言う思いがあります、でも高機能なサービスが作れたとしてもそれを営業するノウハウ等がないので自分には結局意味がないのではないかと思います.

Devinさんに負けない高度なコードを書いても生産性では確実に劣っている気がします、ものの数秒で数千行のコードを書くことは人は出来そうにないので、正直なところDevinの性能が上がったら本当に必要なエンジニアは少なくなるでしょうね.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

エンジニア, コード, サービス, すひとつ, ところ, ノウハウ, びん, リポジトリ, 会社, 性能, 悲しい気持ち, 意味, 数千行, 数秒, , 生成, 生産性, 自分, 自分一人, 高性能,

Photo by Adil on Pexels.com

AIでレコメンド記事が表示させるロジックを作りました.#機械学習って

2025.06.04

Logging

おはようございます.AIでレコメンド記事が表示させるロジックを作りました、前からそのような事を考えていたのですが、あまり機械学習のことを分かっていなかったのですが、以前、地域の商品券で「実務で役立つPython機械学習入門」を購入していたのを先日の休みにパラパラと捲っていたら、これだったらなんか出来そうだなって思いたち.

昨日の休みに生成AIともに作りました.生成AIが出力したコードに対して再度指示を出したり自分で直したりして上手く処理される形に落ち着きました.

Pythonコードは昨日の記事がある程度役に立つと思います、あのコードを元にブラッシュアップ(改善)した形になります.

自分で機械学習のことに手を出すことになるとは思っていなかったけど、これからはPythonの事もたまに試していこうと思います.

因みに過去記事を参照してもらったら分かるかもですが何度か機械学習にトライして挫折した経緯がありますが、今回は生成AIという物があるので生成AIよって噛み砕いた言葉とコードで何とか自分でも初級か中級ぐらいのことは出来そうな気もします.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

コード, ブラッシュアップ, レコメンド記事, ロジック, 中級, 休み, 何度か機械学習, , 再度指示, 初級, 実務, , 改善, 機械学習, 機械学習入門, 生成, 生成とも, 程度役, 経緯, 言葉,

AIレコメンド機能を乗せれるかもしれない.VPSだから微妙 #TFIDFベクトライザ

2025.06.03

Logging

おはようございます.AIレコメンド機能を乗せれるかもしれないけど無理かもしれないということで、まだ試してはいないのだけど機械学習で学習済みのモデルをVPSに乗せ動かすことが出来れば、AIレコメンド機能が出来そうです.

いまある記事のデータのタグ付け部分をTF-IDFベクトライザの学習させれば案外簡単に学習させることが出来そうなので生成AIにコードを書いてもらいました.

尚、この方法はECサイトの商品のレコメンド機能にも同じような感じでデータを与えるとレコメンドしてくれたりします.

最後にPythonコードを貼っときます.VPSサーバで再学習できれば良いだけども難しいかもしれない、、、.

import pickle
import os

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd

# モデル保存ファイル名
MODEL_PATH = "tfidf_vectorizer.pkl"  # TfidfVectorizer
DATA_PATH = "article_tags.pkl"       # 記事IDとタグ

# 類似度モデル構築(再学習対応)
def build_similarity_model(article_tags_input, save_model=True, retrain=False):
    # 再学習時は既存データを読み込んで結合する
    if retrain and os.path.exists(DATA_PATH):
        with open(DATA_PATH, "rb") as f:
            existing_data = pickle.load(f)
        existing_data.update(article_tags_input)  # 新しいデータを追加
        article_tags_input = existing_data

    article_ids = list(article_tags_input.keys())
    processed_corpus = [" ".join(tags) for tags in article_tags_input.values()]

    # 再学習またはモデル未保存時に新たにモデルを学習・保存
    if retrain or not os.path.exists(MODEL_PATH):
        vectorizer = TfidfVectorizer()
        tfidf_matrix = vectorizer.fit_transform(processed_corpus)

        if save_model:
            with open(MODEL_PATH, "wb") as f:
                pickle.dump(vectorizer, f)  # ← ここでモデルを保存
            with open(DATA_PATH, "wb") as f:
                pickle.dump(article_tags_input, f)  # ← ここで元データを保存

    else:
        # 保存済みモデルを使って変換する
        with open(MODEL_PATH, "rb") as f:
            vectorizer = pickle.load(f)
        tfidf_matrix = vectorizer.transform(processed_corpus)

    cosine_sim_matrix = cosine_similarity(tfidf_matrix)
    cosine_sim_df = pd.DataFrame(cosine_sim_matrix, index=article_ids, columns=article_ids)

    return cosine_sim_df, article_ids

# 類似記事を取得する関数
def get_recommendations(article_title, similarity_matrix, articles_map, top_n=3):
    if article_title not in articles_map:
        print(f"エラー: 記事 '{article_title}' が見つかりません。")
        return []

    sim_scores = list(enumerate(similarity_matrix[article_title]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)

    recommended_articles = []
    for i, score in sim_scores:
        if articles_map[i] != article_title and len(recommended_articles) < top_n:
            recommended_articles.append((articles_map[i], score))
        if len(recommended_articles) >= top_n:
            break

    return recommended_articles

# 入力記事データ ( 例 )
article_tags_input = {
    "記事1": ["Python", "機械学習", "データサイエンス"],
    "記事2": ["Python", "Web開発", "Django"],
    "記事3": ["機械学習", "自然言語処理"],
    "記事4": ["データサイエンス", "統計学"],
    "記事5": ["Python", "データサイエンス", "可視化"]
}

# 類似度モデル構築 + モデル保存 ( 初回学習 )
cosine_sim_df, article_ids = build_similarity_model(article_tags_input)

# 使用例
target_article = "記事1"
recommendations = get_recommendations(target_article, cosine_sim_df, article_ids, top_n=2)
print(f"\n「{target_article}」へのおすすめ記事 ( 上位2件 ):")
for article, score in recommendations:
    print(f"- {article} (類似度: {score:.4f})")

# 新しい記事を追加して再学習
new_article_id = "記事6"
new_article_tags = ["Python", "統計学"]
article_tags_input = {new_article_id: new_article_tags}

# 再構築+再学習
cosine_sim_df, article_ids = build_similarity_model(article_tags_input, retrain=True)
target_article = new_article_id
recommendations = get_recommendations(target_article, cosine_sim_df, article_ids, top_n=2)
print(f"\n「{target_article}」へのおすすめ記事 ( 上位2件 ):")
for article, score in recommendations:
    print(f"- {article} (類似度: {score:.4f})")

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

エラー, コード, サーバ, タグ, データサイエンス, ベクトライザ, レコメンド機能, 上位件, 初回学習, 学習, 学習済み, 既存データ, 最後, 機械学習, 統計学, 自然言語処理, 良いだけ, 関数, 類似度, 類似度モデル構築,

デジタルアドレスAPIのコードを書いてみました.書いたのは

2025.05.30

Logging

おはようございます.デジタルアドレスAPIのコードを書いてみました.書いたのは生成AIだけど一度で上手く正しいコードが生成出来たわけではなくて二、三回の指示出しを行って下記のコードが生成されました.

デジタルアドレスのAPIを使用するには企業もしくは個人事業者で屋号を登録されている方でないとAPIのアカウント登録は今のところ出来ないので、自分はリファレンスと生成AIが出力したコードを見て恐らく正しく処理されるだろうと思ったのでgist.githubに公開しました.

尚、引数にIPアドレスを渡さないといけない所があるけれど、これはサーバーのIPアドレスになります.


<?php

class JapanPostAPIClient
{
    private string $clientId;
    private string $secretKey;
    private string $clientIp;
    private ?string $accessToken = null;
    private ?array $lastResponse = null;

    public function __construct(string $clientId, string $secretKey, string $clientIp)
    {
        $this->clientId = $clientId;
        $this->secretKey = $secretKey;
        $this->clientIp = $clientIp;
    }

    public function authenticate(): self
    {
        $url = 'https://api.da.pf.japanpost.jp/api/v1/j/token';
        $data = json_encode([
            'grant_type' => 'client_credentials',
            'client_id' => $this->clientId,
            'secret_key' => $this->secretKey
        ]);

        $headers = [
            "Content-Type: application/json",
            "x-forwarded-for: {$this->clientIp}"
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpcode !== 200) {
            throw new Exception("Token request failed with status {$httpcode}: {$response}");
        }

        $responseData = json_decode($response, true);
        $this->accessToken = $responseData['token'] ?? null;
        $this->lastResponse = $responseData;

        return $this;
    }

    public function searchCode(string $searchCode, array $params = []): self
    {
        if (!$this->accessToken) {
            throw new Exception("Access token is not set. Please call authenticate() first.");
        }

        $defaultParams = [
            'page' => 1,
            'limit' => 10,
            'choikitype' => 1,
            'searchtype' => 1
        ];

        $queryParams = http_build_query(array_merge($defaultParams, $params));
        $url = "https://api.da.pf.japanpost.jp/api/v1/searchcode/{$searchCode}?{$queryParams}";

        $headers = [
            "Authorization: Bearer {$this->accessToken}",
            "Accept: application/json"
        ];

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if ($httpCode !== 200) {
            throw new Exception("Search request failed with status {$httpCode}: {$response}");
        }

        $this->lastResponse = json_decode($response, true);
        return $this;
    }

    public function getJson(): string
    {
        return json_encode($this->lastResponse, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    }

    public function getArray(): ?array
    {
        return $this->lastResponse;
    }
}

// 使い方の例:
// $client = new JapanPostAPIClient('YOUR_CLIENT_ID', 'YOUR_SECRET_KEY', 'IPアドレス.xxx.xxx.xxx');
// echo $client->authenticate()->searchCode('1000001')->getJson();

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, アカウント登録, アドレス, コード, サーバー, デジタルアドレス, リファレンス, 下記, 企業, 使い方, , 個人事業者, 屋号, 引数, , 指示出し, 正しいコード, 生成, 自分,

いにしえのサイトの変数の命名を直しました.大部分を生成AIに直してもらった.

2025.05.29

Logging

おはようございます.いにしえのサイトの変数の命名を直しました.大部分を生成AIに直してもらいましたがまだ残ってはいます.因みにいにしえのサイトというのは、このサイトのことを指しています.

生成AIに「変数と関数の命名を直して」と頼むとプログラミングのコードはそのままで変数の命名や関数の命名を直してくれます.

その方法でいにしえのサイトのコードを書き換えて「駆け出し感」は少し消えている感じがします.

命名もそうですがプログラミングには命名規則という物があります.自分はそんな事を知らずにコードを書いてきたのですが、いまやっと命名規則などをちゃんとした職場にいます.

なのですが、今までのなんか癖が抜けきれていない部分があり、ちゃんとしたコードを昔から書いていたらという後悔があります.

最後に命名規則というのは何なのかという人のために命名規則をわかりやすく書いているQiitaの記事を載せておきます.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

いにしえ, コード, プログラミング, 命名, 命名規則, 変数, 大部分, 少し, 後悔, 方法, , 最後, , 生成, , 職場, 自分, 部分, 関数, 駆け出し感,

トランプ大統領の2025年からの任期をカウントするJSコードです.

2025.05.24

Logging

おはようございます.トランプ大統領の2025年からの任期をカウントするコードです.まだまだトランプ政権は始まったばかりなんですが、もう自分としてはあんま嬉しい気持ちはしていません.いま儲かっているのはデイトレードを行っている人達かも知れないです.

// トランプ大統領の2025年からの任期をカウント
const termStart = new Date('2025-01-20');
const termEnd = new Date('2029-01-20');
const today = new Date();

const totalTermDays = Math.floor((termEnd - termStart) / (1000 * 60 * 60 * 24));

if (today < termStart) {
  console.log('任期はまだ始まっていません。');
} else if (today > termEnd) {
  const servedDays = totalTermDays;
  console.log('任期は終了しています。');
  console.log(`トランプ大統領は ${servedDays} 日間、在任しました。`);
} else {
  const servedDays = Math.floor((today - termStart) / (1000 * 60 * 60 * 24));
  const remainingDays = Math.floor((termEnd - today) / (1000 * 60 * 60 * 24));
  console.log(`任期中です。(${today.toISOString().split('T')[0]} 現在)`);
  console.log(`在任日数: ${servedDays} 日`);
  console.log(`残り日数: ${remainingDays} 日`);
  console.log(`任期全体の日数: ${totalTermDays} 日`);
}

秒でウクライナとロシアの戦争を止めると言っていたのに、泥沼化しています.トランプさんになってからアメリカは前より酷くなったのではとか思っていますが、アメリカ国民は満足しているのでしょうか🤔.

知らないけれど、結構たいへんそうな気がしています.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, アメリカ, アメリカ国民, あんま嬉しい気持ち, ウクライナ, カウント, コード, ディトレード, トランプ大統領, トランプ政権, ロシア, 任期, 任期中, 任期全体, 在任日数, 戦争, 日数, , 泥沼化, ,

見るだけでわかる!! 英語ピクト図鑑ってのを購入してみて

2025.05.23

Logging

おはようございます.見るだけでわかる!! 英語ピクト図鑑ってのを購入してみて思ったことを書いていきます.まず、図解は分かりやすいのですが自動詞や前置詞、他動詞とかいう用語が出てきてそこが知らないというか、もう全忘れしている自分にとっては難解でした.

難解でしたが生成AIが解説してくれたので何とかなりそうで、今回はなんか今までよりは続きそうな予感がします.

因みに英語が全く分からないわけでもないのだけど何となく理解できるけど、日本語にちゃんとした和訳が出来ないレベルなんですね、何を言わんとするかは分かるので頭の中で分かると言えば良いのかな.

そんな理由でちゃんとした訳が出来ないや基礎が全く出来ていないまま、生きてきたので結構コードを書くのが大変です.今でもどう書けばよいのやらと不安だらけ…そう言っても命名はしないといけないので命名しているけども自信がないですよね.

この頃は生成AIだよりになっている部分もあり前よりは命名が良くなってきている気がしています.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

コード, 予感, 他動詞, 命名, 和訳, 図解, 基礎, 日本語, , 理由, 生成, 用語, 置詞, 自信, 自動詞, 英語, 英語ピクト図鑑, , 部分, ,

推し記事をXに頻度にポストする「ぷらぐいん」を作りました.

2025.05.20

Logging

おはようございます.昨日から自分の推し記事をXに頻度にポストする「ぷらぐいん」を作りました.コードは使い回し的な要素が多いのですが、上手く動いていたりしてアクセス数も普段より微量に多かったりして作ったのは良かったと思っています.

この頃、生成AIがコードを書いてくれるので、以前よりも早くコードが書けている気がしています.そのままでは使用できない時もあるけれど、良い感じです.ただ、無料枠のGeminiはテストコードやGitHubのgithub Actionなんかを作るのが難しい.

ここらへんは無料枠なので仕方がないかなって思っています.

生成AIが進化していくと人はいらない、ただAIの苦手な部分もあってUIやUXはどうも苦手な部分みたいですね.でもこれも時間の問題なのかも知れないなって思います、何故かというと人の意図を汲み取るのは今からいろいろな人が生成AIを使用する中でデータが蓄積されそれを元に改善されていくと思うので.

そのうち、生成AIとエンジニアの二人三脚でアプリやWEBサービス、ソフトウェアを個人が作り出す時代になるでしょうけど、アプリの飽和が起こりそうな気もしています.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

アプリ, うち, エンジニア, コード, ここらへん, ソフトウェア, データ, テストコード, プラグイン, 二人三脚, , 微量, 意図, 推し記事, 普段, 無料枠, 生成, 要素, 頻度, 飽和,

配列で返して変数で受け取る事を分割代入というであってる.

2025.05.16

Logging

おはようございます.配列で返して変数で受け取る事を分割代入という…どんなコードか具体的に書いたのが下記です.

<?php

function getArray(): array {
  return [10, 20];
}

[$x, $y] = getArray();

echo "x: " . $x . "\n";
echo "y: " . $y . "\n";

// 要素数が合わない場合
function getMoreArray(): array {
  return [100, 200, 300];
}

[$p, $q] = getMoreArray(); // $q には 200 が代入され、300 は無視される
echo "p: " . $p . "\n";
echo "q: " . $q . "\n";

[$m, , $n] = getMoreArray(); // カンマで要素をスキップ
echo "m: " . $m . "\n";
echo "n: " . $n . "\n";

// 連想配列のようなキー指定も可能 (PHP 7.1以降)
function getAssocArray(): array {
  return ['name' => '太郎', 'age' => 30];
}

['name' => $userName, 'age' => $userAge] = getAssocArray();

echo "名前: " . $userName . "\n";
echo "年齢: " . $userAge . "\n";

?>

最初、凄くこれに違和感を覚えたのを覚えています.理由はカッコカッコで括ってあるから、なんだか配列を連想するのですよね.とても便利ですけどね、因みにPHP言語でも比較的に新しいバージョンだったら使用できます.

尚、PHPバージョン7.1以下だった場合はlistを使用すると同じようなことになります.

<?php

function getArray(): array {
  return [10, 20];
}

list($x, $y) = getArray();

echo "x: " . $x . "\n";
echo "y: " . $y . "\n";

// 要素数が合わない場合
function getMoreArray(): array {
  return [100, 200, 300];
}

list($p, $q) = getMoreArray(); // $q には 200 が代入され、300 は無視される
echo "p: " . $p . "\n";
echo "q: " . $q . "\n";

list($m, , $n) = getMoreArray(); // カンマで要素をスキップ
echo "m: " . $m . "\n";
echo "n: " . $n . "\n";

?>

それにしても分割代入って呼び名、直ぐに忘れそう・・・.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, $代, カッコカッコ, カンマ, キー指定, コード, スキップ, バージョン以下, 分割代, 分割代入, 呼び名, 変数, 太郎, 新しいバージョン, 最初, 要素, 言語, 連想配列, 違和感, 配列,

Photo by Amy Chandra on Pexels.com

tMDbのAPIを使用して今まで観た映画をリスト化してみましたよ.

2025.04.27

Logging

おはようございます.tMDbのAPIを使用して今まで観た映画をリスト化してみましたよ.sqliteの構造は下記になります.idはbigintと記載していますが、AUTO_INCREMENTの間違いです🐼.

Xにも呟きましたがAPIを使用して何かするのはこの頃飽きてきて触らなかったのですが、たまには触れてみようとコードを書いているうちに簡単に作れるようになってしまって少々物足りなさを感じています.

次回はAPIを使う側ではなくて作る側になろうと思っています.GW期間になると思いますが600円のレンタルサーバーのフリードメインを使ってツマラナイAPIみたいな失笑系を作ってみます.

なお、ソースコードの解説がなくてすみません、このソースコードを生成AIに投げてどのような処理か説明して言えば恐らく正解を教えてくれます.

明日へ続く

#真相をお話します.
少年と犬
Flow
curl -sS https://getcomposer.org/installer | php
composer require guzzlehttp/guzzle
composer require illuminate/database
<?php
require_once 'config.php';
require_once 'vendor/autoload.php';
use Illuminate\Database\Capsule\Manager as Capsule;
use Illuminate\Database\Capsule\Manager as DB;

class MovieList
{
    public $result = '';
    public $imgBasicUrl = 'https://image.tmdb.org/t/p/w500';
    public $filePath = FILEPATH_DIR_;
    public function __construct($filePath='')
    {
        $filePath = $filePath?$filePath:$this->filePath;
        if (!file_exists($filePath.'/movie-list.db')) {
            exit;
        }        
        $capsule = new Capsule();

        $capsule->addConnection([
            'driver'   => 'sqlite',
            'database' => $filePath.'/movie-list.db',
            'prefix'   => '',
        ]);

        $capsule->setAsGlobal();
        $capsule->bootEloquent();
    }

    public function getMovieList(string $q): void
    {
        $client = new \GuzzleHttp\Client();

        $response = $client->request('GET', 'https://api.themoviedb.org/3/search/multi?query=' . $q . '&include_adult=false&language=ja-JP&page=1', [
            'headers' => [
                'Authorization' => 'Bearer ' . API_KEY,
                'accept' => 'application/json',
            ],
        ]);
        $this->result = $response->getBody();
    }

    public function getResult(): void
    {
        $data = DB::table('list')->get();
        $lists = [];
        foreach ($data as $key => $value) {
           $result = unserialize($value->value);
            if(isset($result?->media_type) && $result->media_type == 'movie'){
                $lists[] = [
                    'id'=>$data[$key]->id,
                    'title'=>$result->title,
                    'img'=>$this->imgBasicUrl . $result->poster_path,
                ];
            }
        }
        print json_encode($lists);
    }

    public function saveCsvlist(): void
    {
        $fileData = explode("\n",file_get_contents('movie-list.csv'));
        $fileData = array_reverse($fileData);
        foreach($fileData as $line)
        {
            foreach(explode(',',$line) as $data){
                $q = urlencode($data);
                $movieList = new MovieList();
                $movieList->getMovieList($q);
                foreach((json_decode($movieList->result))?->results as $result){
                    DB::table('list')->insert([
                        'value' => serialize($result)
                    ]);
                }
            }
        }        
    }

    public function delete($id): void
    {
        
        DB::table('list')->where('id', '=', $id)->delete();
        print json_encode(['res'=>'true']);
    }

}
//(new MovieList())->saveCsvlist();
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    if(!isset($_POST['id'])){
        (new MovieList())->getResult();
    }else{
        //(new MovieList())->delete($_POST['id']);
    }   
}

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, コード, ソースコード, ツマラナイ, フリードメイン, レンタルサーバー, , , 処理, 失笑系, 少年, 構造, 次回, 正解, , 生成, 真相,

404画像をそのまま残しておくとSEOに影響があるのでどうするか?#php

2025.04.23

Logging

おはようございます.404画像をそのまま残しておくとSEOに影響があるのでどうするか?php の場合、下記のコードで404ページに飛んでいるかどうかの確認は出来る.でも毎回、確認しているとページを表示している時に遅延が発生してとても良い処理とは言えないなのでDBに画像あるなしが確認できるテーブルを作ります.

<?php
class HttpCodeChecker
{

    public function getHttpStatusCode(string $url): int|false
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_NOBODY, true);
        curl_exec($ch);

        if (curl_errno($ch)) {
            curl_close($ch);
            return false; // エラーがあった場合
        }

        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        return $httpCode;
    }
}

画像のステータス確認できるコードで定期的にページをクロールしてステータスをテーブルに保存(更新)することにより404画像によってSEOに影響を与えない作りになります.

他にも方法はあるけど、レンタルサーバーではこの方法がベストプラクティスな解なのかもしれない.クロールするのが出来ない場合は一度、画像URLをJsonデータで出力してフロントエンド側で画像有無を判断し存在するものだけを表示するという案もあるのだけども、今のSEO的にはあまりオススメはしない.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, エラー, コード, ステータス, データ, テーブル, フロントエンド側, ベストプラクティス, レンタルサーバー, 下記, 保存, 影響, 方法, , 毎回, 画像, 画像有無, 確認, 良い処理, 遅延,

Camera+ recipe? ? scene: Cloudy ? crop: Golden ? effect: Redscale (77%) ? border: Round White

Reactでパスワード生成にバグがあって数値、記号が確実に入らなかったので.

2025.04.22

Logging

おはようございます.Reactでパスワード生成にバグがあって数値、記号が確実に入らなかったのでその修正を先日行いました.そういやそうだなってソースコードを見返して思った次第です…

修正したコードはこちらになります.その話とは別にVScodeにもAI補助が付いてから自分も生成AIと言う物を個人開発するときに使用するようになっただけど…

import RingLoader from "react-spinners/RingLoader";
import { useState } from "react";
import "./App.css";

function PasswordTmp() {
  const [passwordLength, setPasswordLength] = useState(8);
  const [password, setPassword] = useState("");
  const [includeSymbols, setIncludeSymbols] = useState(false);
  const [includeNumbers, setIncludeNumbers] = useState(false);

  function makePassword(passwordLength, includeSymbols, includeNumbers) {
    const lowercase = "abcdefghijklmnopqrstuvwxyz";
    const uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    const numbers = "0123456789";
    const symbols = "!@#$%^&*()_+[]{}|;:,.<>?";
    let characters = lowercase + uppercase; // 文字のセットを初期化
    if (includeNumbers) {
      characters += numbers; // 数字を追加
    }
    if (includeSymbols) {
      characters += symbols; // 記号を追加
    }
    let result = remakePassword(characters,includeNumbers,includeSymbols);
    setPassword(result);
  }

  function remakePassword(characters,includeNumbers,includeSymbols){
    let passwords = "";
    let NumbersChecking = true;
    let SymbolsChecking = true;
    for (let i = 0; i < passwordLength; i++) {
      const randomIndex = Math.floor(Math.random() * characters.length);
      passwords += characters[randomIndex]; // ランダムな文字を選択
    }
    if (includeNumbers) {
      NumbersChecking = passwords.match(/[0-9]/g) ? true : false;
    }
    if (includeSymbols) {
      SymbolsChecking = passwords.match(/[\!@#\$%\^&\*\(\)_\+\[\]\{\}\|;:\,\.<>\?]/g) ? true :false;
    }
    return NumbersChecking && SymbolsChecking?passwords:remakePassword(characters,includeNumbers,includeSymbols);
  }


  return (
    <>
      <div>
        <h1>パスワード生成</h1>
        <p>
          <input
            type="number"
            value={passwordLength}
            placeholder="パスワードの長さ"
            max={99}
            min={3}
            onChange={(e) => setPasswordLength(e.target.value)}
          />
        </p>
        <p>
          <input id={'Symbols'}
            type="checkbox"
            value={1}
            checked={includeSymbols}
            onChange={(e) => setIncludeSymbols(e.target.checked)}
          />
          <label for={'Symbols'}>記号を含める</label>
        </p>
        <p>
          <input id={'Numbers'}
            type="checkbox"
            value={1}
            checked={includeNumbers}
            onChange={(e) => setIncludeNumbers(e.target.checked)}
          />
          <label for={'Numbers'}>数字を含める</label>
        </p>
        <button
          className="btn"
          onClick={() =>
            makePassword(passwordLength, includeSymbols, includeNumbers)
          }
        >
          パスワードを生成
        </button>
        <button
          className="btn"
          onClick={() => navigator.clipboard.writeText(password)}
        >
          パスワードをコピー
        </button>
        <p>生成されたパスワード: {password}</p>
        <p>パスワードの長さ: {passwordLength}</p>
        <p>記号を含める: {includeSymbols ? "はい" : "いいえ"}</p>
        <p>数字を含める: {includeNumbers ? "はい" : "いいえ"}</p>
      </div>
    </>
  );
}

export default PasswordTmp;

この頃、補完機能がとても「うざったく」思う時と「ありがとう」と思うときが存在していてなんとも言えない.特にウザって思うときは自分が望んでいないコードが出てきた時は正直困る.コードを直打ちしないといけないので今までの補完機能がやはり良いなと思います.

自分としては生成AIの補完機能をOFFに出来る機能がほしいところ、それがあればとてもコードを書くのは快適ですねー.あるのかなぁー🤔調べてみます.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

コード, コピー, セット, ソースコード, バグ, パスワード, パスワード生成, ほしいところ, ランダム, 修正, 初期化, 数値, 数字, 文字, 次第, 生成, 補助, 補完機能, 記号, 選択,

Photo by Adam Fejes on Pexels.com

動画を見て時代だなって思った瞬間.自分、時代って言葉を使いすぎw.

2025.04.19

Logging

おはようございます.以前、少し書いたのですが教育の場ではデジタル機器を使用してきていますよね.もうこんな田舎でもノートパソコンやタブレットを小学校から使用しています.そんな子供達が大人になったとき、社会はどう変わるのだろうかとこの頃おもうことがあります.

iPad | 成功事例:学びが持つ無限の可能性 | Appleと教育

あと20年後といえば自分は仕事を退職して年金暮らしているような年代になるのかと思うですが、その想像が全くというほど想像できない.20年になるまえに恐らく南海トラフ巨大地震も起きていて大きく日本も変わった社会になっているのではないだろうかと思っています.

多分だけど自分はあと20年後も働いているような気がします.その頃にはプログラマーという職ではなくAIの書いたコードを手直しする職として働いている可能性が高いですね.

10年後は何となく今の延長線上にある気がするのだけど、20年後は今の延長線上では予測できない社会になっていそうです.

100年時代と言われている今日(こんにち)ですが、自分たちが老人と言われる時代は老化を止められる時代にもなってくるのだというのが自分の見解です.もしかするとブレイクスルーが起こり老化を止めるどころか、細胞を若返ることが出来るかも知れない.

そういう時代を目にすることが出来ると思うとワクワクしかないですね.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

コード, タブレット, デジタル機器, ノートパソコン, ブレイクスルー, プログラマー, まえ, 南海トラフ巨大地震, 小学校, 年代, 年金, 延長線上, 想像, 教育, 田舎, 細胞, 老人, 老化, , 見解,

一人でスーパーマリオワールドを3D化したツワモノ現る.超再現度高いですね.

2025.03.23

Logging

おはようございます.一人でスーパーマリオワールドを3D化したツワモノ(Bobby Ivar)現る.これを見たときニヤけてしまったぐらい、素人目でもこれ一人で作るの凄すぎだよと.

あの懐かしいスーパーマリオワールドの2Dをここまで忠実に3Dに落とし込むことが出来る人はいない.熱烈なファンっていうのは本当に凄いですね.熱量がないとここまで打ち込めないと思います.

このスーパーマリオワールドを作った人(Bobby Ivar)を任天堂さんがどうするか、自分だったら彼の作ったコードを引き継いで開発します.これぐらい忠実に3D再現しているわけだからこれを駄目だと切り捨てるのは、勿体ないなって思います.

I Spent 365 Days Remaking Super Mario World In 3D!

尚、2Dから3Dにするために開発ツールを自作したりモンスターのAI(アルゴリズム)も新たに構築したそうです.そしてドットテクスチャも自らポチポチと制作したそうです.

マリオファンから称賛の嵐だとか.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

アルゴリズム, コード, スーパーマリオワールド, ツワモノ, ドットテクスチャ, ニヤけ, ファン, マリオファン, モンスター, 一人, 任天堂さん, , , 懐かしいスーパーマリオワールド, 熱量, 称賛, 素人目, 自らポチポチ, 自分, 開発ツール,

クラシックAPIを使用してGitHub APIから草データを取得.

2025.03.12

Logging

おはようございます.クラシックAPIを使用してGitHub APIから草データを取得するコードをAPI使用しつつ手直してモノの数分で完成しました.こういうのを思うと少人数の開発でも希望を持てるなって思います.ちなみに自分は未だに無料枠でコードを生成してもらっています.

正直なところ、無料枠で事が足りるという印象ですね.コードの改善や命名は生成AIにやってもらった方が優秀です、自分の無能がよくわかります.

草データの使用方法はタイトル通りなので特に問題ないかなって思います.コンフィグファイルは書かずしても変数に代入してあげれば良いわけですからね.一応、github上にソースコードを掲載しています.

https://github.com/taoka3/GitHubGrass

良かったらいいね👍️(⭐️)宜しくお願い致します.

<?php
class GitHubGrass
{
    private string $token;
    private string $username;
    private array $weeks = [];
    private int $cellSize = 12;
    private int $padding = 2;
    private array $colors = [];

    public function __construct(string $username, string $token)
    {
        $this->username = $username;
        $this->token = $token;

        // 色の設定(GitHub風)
        $this->colors = [
            'level0' => [235, 237, 240],
            'level1' => [155, 233, 168],
            'level2' => [64, 196, 99],
            'level3' => [48, 161, 78],
            'level4' => [33, 110, 57]
        ];
    }

    /**
     * GitHub APIから草データを取得
     */
    public function fetchContributions(): bool
    {
        $url = 'https://api.github.com/graphql';
        $query = <<<'JSON'
        {
          user(login: "USERNAME") {
            contributionsCollection {
              contributionCalendar {
                weeks {
                  contributionDays {
                    contributionCount
                  }
                }
              }
            }
          }
        }
        JSON;

        // ユーザー名を埋め込む
        $query = str_replace("USERNAME", $this->username, $query);

        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $this->token,
            'User-Agent: ContributionsApp'
        ]);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['query' => $query]));

        $response = curl_exec($ch);
        curl_close($ch);
        $data = json_decode($response, true);
        if (!isset($data['data']['user']['contributionsCollection']['contributionCalendar']['weeks'])) {
            $this->weeks = []; // 空の配列を設定
            return false;
        }

        $this->weeks = $data['data']['user']['contributionsCollection']['contributionCalendar']['weeks'];
        return true;
    }

    /**
     * 草画像を生成
     */
    public function generateImage(): string
    {
        if (count($this->weeks)) {
            die('No data available.');
        }

        // 画像サイズ設定
        $width = (count($this->weeks) * ($this->cellSize + $this->padding)) + $this->padding;
        $height = (7 * ($this->cellSize + $this->padding)) + $this->padding;

        // 画像作成
        $image = imagecreatetruecolor($width, $height);
        $bgColor = imagecolorallocate($image, 255, 255, 255);
        imagefill($image, 0, 0, $bgColor);

        // 色の作成
        $colorPalette = [];
        foreach ($this->colors as $key => $rgb) {
            $colorPalette[$key] = imagecolorallocate($image, ...$rgb);
        }

        // セル描画
        foreach ($this->weeks as $x => $week) {
            foreach ($week['contributionDays'] as $y => $day) {
                $count = $day['contributionCount'];
                $color = $this->getColor($count, $colorPalette);

                // 四角形を描画
                imagefilledrectangle(
                    $image,
                    $x * ($this->cellSize + $this->padding) + $this->padding,
                    $y * ($this->cellSize + $this->padding) + $this->padding,
                    ($x + 1) * ($this->cellSize + $this->padding),
                    ($y + 1) * ($this->cellSize + $this->padding),
                    $color
                );
            }
        }

        // 出力
        ob_start();
        imagepng($image);
        $imageData = ob_get_contents();
        ob_end_clean();
        imagedestroy($image);

        $base64 = base64_encode($imageData);

        return $base64;
    }

    /**
     * コントリビューション数に応じた色を取得
     */
    private function getColor(int $count, array $colorPalette)
    {
        if ($count == 0) {
            return $colorPalette['level0'];
        } elseif ($count < 5) {
            return $colorPalette['level1'];
        } elseif ($count < 10) {
            return $colorPalette['level2'];
        } elseif ($count < 20) {
            return $colorPalette['level3'];
        } else {
            return $colorPalette['level4'];
        }
    }
}

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, $代, から草データ, クラシック, コード, コントリビューション数, コンフィグファイル, セル描画, ソースコード, 出力, 命名, 四角形, 変数, 少人数, 手直し, 描画, 未だ, 生成, 配列,

ReactとVueだったらReactを選択すると思う.間違いないアレはキラキラだ.

2025.03.08

Logging

おはようございます.この頃、米国市場がどんより傾向でここ数週間で一つの口座では10万ぐらいは減ったようです.減った時に株の買い回しをすると景気が回復したときに倍に増える可能性はありますが、何だかトランプ大統領は予測しにくいですね.トランプ大統領の発言で売買システムを構築している人達は大変そうです.AIの精度を上げないとかなり損をしそうです、早く辞めて頂きたい.

さてReactの話を書いています.ReactとVueだったらReactを選択すると思うけれどもVueも大事だという話.シェア率から言えばReactの方が多いと思います.React推しの人はReactで何でもしてしまいますが、実際適材適所で言語を選ぶ方が表示が早くなったりSEOに強くなったりします.

でも、ReactとTypeScriptが大事に成りつつあることは確かです.自分もさえないReactのコードを書いています.イマイチ、使いこなせていない部分があります.もっと洗練したコードを書きたいなって思いますが全然ダメでついついバニラで対応してしまいます.

先日、リリースした掲示板もReactに改修しようと思っていますが、今のところ誰も使用していないので当分バニラJSのまま置いときますが行く行くはReactに対応していきます.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

かなり, コード, ところ誰, トランプ大統領, バニラ, , 傾向, 口座, 売買システム, 実際適材適所, 掲示板, 景気, , 発言, 米国市場, 精度, 言語, 話シェア率, 買い回し, 部分,

AIコードアシスタントを今頃使ってみました.感想などを記載します.

2025.02.28

Logging

おはようございます.AIコードアシスタントを今頃使ってみました.感想などを記載します.面倒くさいコードはAIに任せるのは有りだと思いましたが、仕事では使用できないなっていうのが思いも抱きました.モックアップなどを作るのには最適ですが、それ以上は期待薄ですね.コードを生成してくれはするのだけども意図が違っていたり、無駄なコードを書いていたりと少々使えない.

要するに生成AIが生成してくれるおかげでコード修正が発生します.これだったら一から自分でコードを書いた方が良い気がします.新規ファイルの中で指示するとコードを書かなくて良いのでだいぶ楽できるというメリットはありますが、既存のシステムファイルの修正では使えない.使うと動かなくなる恐れがあるので、殆どの人は使っていないじゃないかな.

これは良いと思ったのはサジェストが良い、これ書こうと思ったサジェストが表示されるのは便利ですね.それぐらいかな.あとはvscodeの横に問い合わせがあるとわざわざブラウザで生成AIに質問することが無くなるので良いなって感じました.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

おかげ, コード, コードアシスタント, コード修正, サジェスト, システムファイル, メリット, モックアップ, わざわざブラウザ, 仕事, 修正, 意図, 感想, 新規ファイル, 既存, 期待薄, , 殆ど, 生成, 面倒くさいコード,

ポケベルコードBBSをリリースです🤔.坊主が屏風に上手に坊主の絵を書いた.

2025.02.24

Logging

おはようございます.ポケベルコードBBSをリリースです.当たるとは思えないけど無かったので制作してみようと思ったのが制作のきっかけになります.ポケベルのConverter(変換)はあったのですが、こういうのは無かった.ツワモノしか使えない可能性が高いかと思います.ポケベルといえば自分が中学生か高校生の時代にあったものだと思います.

ポケベルコードBBS(掲示板)

実際、成人する頃には携帯電話が登場してきたので自分は触る機会もなかったのですが高校生時代には使用していた人がいるような気がします.ポケベルよりたまごっち!が何だか流行っていた時代ですね、アレも持ってはなかったですが、ポケコンでコードを書いて疑似たまごっち!みたいな事をしていました.

そんな時代の世代はもしかしたら使用してくれるかもという事で制作.ちなみにポケットベルコードBBS以外もアイディアがあるのでそちらも順次リリースしていくつもりです.このBBS広場は広告を貼り運用していきます.ちなみにスレを立てることを許すかは考え中です.返信機能はあります、良いねと機能は不必要かなと思ったので付けません.あとシェア機能は付ける予定ですリリース後に付けていきます.

どうぞよろしくお願いします🙇‍♂️⏬️⏬️⏬️
https://bbs-station.start-line-system.com/pocket_bell_code_bbs

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

アイディア, アレ, きっかけ, コード, ズレ, たまごっち, ツワモノ, ポケコン, ポケットベルコード以外, ポケベル, ポケベルコード, リリース, 世代, 中学生, 制作, 変換, 広場, 機会, 疑似たまごっち, 順次,

ゲームの話ではなくて.勉強とかの話とか学ぶとかの話.

2025.02.22

Logging

おはようございます.ゲームの話ではなくて勉強とかの話とか学ぶとかの話を書いていきます.勉強とか学ぶとか好きでないと出来ないよねって思います.不得意とか得意とかが大きく関わってくると思いますし、それで結構人生変わってくると.

勉強は社会に出ても大事だと思っている人とそうではなく人間関係が良好な関係を築くひとが得をするという人もいる.これどちらも間違っていないのではないかと思います.話術ができるひとが得をすると思っている人もいればそうではない場合もあり、どちらも正解でどちらが間違っているものではないので、悩むひともいると思います.

ただ社会は学校とは違って合う合わないが結構関わってくると思います.合う合わないは自分が何を欲しているかによって変わってくるのだと.そして殆どの人は時間とスキルを売って対価を得ています.自分もその部類です、賢いひとや強い思いを持っている人は会社を起こしたりします😌.

そして社会はひとと人との繋がりで社会が成り立っているわけです、この連鎖(繋がり)が社会を作っているのだと、その繋がりが切れている引きこもりの人も何だかんだで社会と繋がり生きているわけです.そんな籠もっている人でもお金を稼げる時代になってきています.

自分もリモートワークで仕事をしているわけなので平日はほぼ籠もっています.休日も映画を観に行く他はコードを書いたりネトフリみたりでインドア的な生活になっています.

何もせずに籠もっている人は何とも勿体ないと思います、まずはブログに広告を貼ってみるでもNoteに記事を書いて売ってみるでも良いのでお金を稼いでみるから始めてください.そしたらお金を稼ぐということの大変さがわかります.そうすると周りで支えてくれている人の見方が変わってくると思います.

勉強をいろいろな要因で出来なかった人は今からでも良いので自分の興味のある事から始めてみてください.それをブログに公開するでも良いので始めてみることが大事です.

これを書こうと思ったのは、この頃テレビで繋がりが断ち切れたひとを見たからです.悲惨なのは五体満足で何もかも諦めている人です.人生いつどうなるかなんて分かりません.諦めずに続けると道が出来ます.長い事、籠もっているとその道が困難になります.なので籠もっていても何か自分に時間を作ってください、そうすることで道がひらけてきます.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

コード, この頃テレビ, スキル, ネトフリ, ひと, リモートワーク, 人生いつ, 休日, 勿体, 周り, 対価, 平日, 正解, 殆ど, 要因, 見方, 話術, 賢いひと, 連鎖, 部類,

画像の存在有無確認用.NodeJSで動く一式を共有します😌.

2025.02.21

Logging

おはようございます.画像の存在有無確認用.NodeJSで動く一式を共有します😌.先日の朝ポストしたものの一式のファイルになります、URLはダミーです.また、このプログラムコードはあるKサイトの画像の存在有無確認のために作ったものになります.

https://github.com/taoka3/check-images-app

このプログラムコードをカスタマイズすることによって、404ページへリダイレクトするようなページでも画像の存在有無を確認することが可能になります.

因みにこのコードでは大量に画像存在有無を確認する場合には適していない為、修正が必要になります.どこを修正しないといけないかは、ご自身でコードを修正してお試しください.ヒントは同期処理を非同期処理にという事です.また、このコードでコンソールに結果を出力していますが、業務などで使用する場合はCSVなどに出力するのが適切なのかも知れません.

const { loadImage } = require("@napi-rs/canvas");

function checkImages(name,imageUrls)
{
  imageUrls.forEach(async (imgUrl) => {
    try {
      // canvasを使って画像が存在するか確認
      await loadImage(imgUrl); // 画像をロードして存在確認
      console.log(`name: ${name}, url: ${imgUrl}, exists: true`);
    } catch (error) {
      console.log(`name: ${name}, url: ${imgUrl} exists: false `);
    }
  });
}

プログラムコードは、朝にちゃちゃっと作ったものになります.なのでエレメントが無かったら落ちたりします.そういう欠陥はあるものの簡易的に画像の存在有無を確認したい場合などには役立つかと思います.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, エレメント, コード, コンソール, ヒント, ファイル, プログラムコード, 一式, 修正, 同期処理, 存在有無, 存在有無確認, 存在有無確認用, 存在確認, , 業務, 欠陥, 画像存在有無, 結果, 非同期処理,

Not Foundページのある際に画像の存在有無を調べる方法. #画像存在有無

2025.02.18

Logging

おはようございます.Not Foundページのある際に画像の存在有無を調べる方法を書いてみました.これでローカルNode.jsサーバーを走らして画像がちゃんとサーバーにアップしているかなどの確認することが出来ます.下記のコードは画像の存在有無だけの処理ですので画像URLリスト処理が必要なります.

Node.jsでもmysql接続可能ですので例えばPHPで画像のURLを発行しているなどの場合はPHPで書いているコードと同じようなコードをNode.jsでも発行して回してあげればサイト内の画像の存在有無を確認することが出来ます.

function checkImage(url, callback) {
    const img = new Image();
    img.onload = function () {
        callback(true); // 画像が正常にロード
    };
    img.onerror = function () {
        callback(false); // 画像が存在しない(404など)
    };
    img.src = url;
}

checkImage("https://taoka-toshiaki.com/icon.jpg", function (exists) {
    if (exists) {
        console.log("画像が存在します");
    } else {
        console.log("画像が見つかりません(Not Found)");
    }
});

全然関係ない話ですが、阿修羅のごとくはあと三話でコンプリートです、この記事がUPしている頃にはあと二話ぐらいになっている頃だとは思いますが、ドラマは全話7時間とちょっとなので結構見るのに体力が必要になります.観溜めするひとはマジでリスペクトですねー.コードはずっと書いていられるけど、ドラマは1日、一話か二話が限界です.ではでは~.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

コード, コンプリート, サーバー, ドラマ, ひと, リスペクト, ローカルサーバー, ロード, 下記, 体力, 処理, 存在有無, 接続, 画像, 画像リスト処理, , 関係, 阿修羅, 限界, ,

低学年向けの学習サイトを作ってみました. 今のところ無広告で運営中.

2025.02.10

Logging

おはようございます.低学年向けの学習サイトを作ってみました. 今のところ無広告で運営中です、因みにこのサービスは数年前にこのサイトにも存在しているものをlaravelとvueで再構築した形になります.

このサイト制作に費やした時間は1時間ぐらいです、いやー結構かんたんにそれらしい物が出来たので、自分としては満足です.アクセス数が多くなれば広告掲載などを考えています.

楽しんで学ぶ

広告掲載はトップのみに表示させるようにします.学習中に広告があるのは気が散りますからね.尚、このサイトは生成AIのちからを借りて制作したのでものの1時間ぐらいで完成した形になります.これから先こんな感じで自然言語の命令でコードを生成AIに書かして人はソースコードのチェックや動作チェックだけをするようになるのかも知れないなと思いましたが、やはり100%と生成AIが生成したものに対して保証が担保出来ない限り、コーダーさんやプログラマーさんの職が無くなることはなさそうです.

因みに自分は生成AIに課金していません.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

アクセス数, コーダーさん, コード, ソースコード, ちから, ところ無広告, プログラマーさん, 低学年向け, 保証, 再構築, 動作チェック, 命令, 学習サイト, 学習中, , , 生成, , 言語, 限り,

Vue.jsでコードを書き直してみたけどバニラJSが良い時もある技術的な話といえばそんな感じ.

2025.02.09

Logging

おはようございます.何もしていないわけではないけど毎日小銭が入ってきた頃を思うといまは前に戻った感じがあります、やっぱり無いよりある方が良いですね.さてHxH-moji.comサービスのバニラJSコードをVue.jsへ置き換えてみたのだけどもレンダリングが遅くなってこれは駄目だなと思ったので元の状態に戻しました.

たまにバックのソースコードがどんな感じに動いているのかを調べている人がいるのだけど、そんなに大したソースコードが動いているわけではないのでお恥ずかしいですね.最近やっと名前付けを変更してソースコードを見たらわかる感じにしたつもりでいます.

因みに下記がレンダリングが遅くてボツにしたコードです.本当ならVue.jsでサクサクと動くコードを作りたいのですがVue.jsはまだまだ初心者さんレベルです..あまりVue.jsもReactもあまり分からないのが現状です、業務で使用することはあるものの一から作るとなるとあんまり上手く作れないです.

トホホ・・・.

この頃思うのは広告掲載だけで何とか回るものを作りたいなとサブスクは個人ではちょっと荷が重い.重いもありますが何せ審査が通りそうにないECサービスはまだ手を付けていないのはそんな理由です.自分のテンション上がるのを待って作りたいと思います.

const { createApp, ref, onMounted, nextTick } = Vue;

const app = createApp({
    setup() {
        const canvas = ref(null);
        const languageInput = ref('');
        const fontsize = ref(16);
        const alertMessage = ref('');
        const mobileText = ref('');
        const isMobile = ref(window.innerWidth <= 768);

        const fetchText = async (flg) => {
            try {
                const body = new FormData();
                body.append('txt', languageInput.value);

                const response = await fetch("/common/jpcvn", {
                    method: "POST",
                    headers: { "X-CSRF-TOKEN": document.querySelector("[name='token']").value },
                    body: body
                });
                const resultdata = await response.json();
                drawCanvas(resultdata.txt);
                mobileHxH(resultdata.txt);

                canvas.value.toBlob((blob) => {
                    const formData = new FormData();
                    formData.append("upload_data", blob, "canvas_image.png");
                    formData.append("name", document.getElementsByName("name")[0].value);
                    formData.append("sns_name", document.getElementById("sns").value);
                    formData.append("text_data", resultdata.txt);
                    if (!flg) formSave(formData);
                }, "image/png");
            } catch (error) {
                console.error(error);
            }
        };

        const drawCanvas = async (text) => {
            await nextTick();
            if (!canvas.value) return;  // canvasがnullの場合は処理を中止
            const ctx = canvas.value.getContext("2d");
            ctx.clearRect(0, 0, canvas.value.clientWidth, canvas.value.clientHeight);

            const background = new Image();
            background.src = "/images/paper_00107.jpg";
            background.onload = () => {
                ctx.drawImage(background, 0, 0, canvas.value.clientWidth, canvas.value.clientHeight);
                ctx.fillStyle = "rgba(0, 0, 0)";
                ctx.font = `${fontsize.value}px HUNTERxHUNTER`;
                const lines = textChange(text, fontsize.value);
                lines.forEach((line, i) => {
                    ctx.fillText(line, 3, 10 + fontsize.value * (1.1618 * i + 1));
                });
            };
        };


        const textChange = (t, f) => {
            let n = parseInt(350 / f);
            let s = t.split("");
            let LLine = 0;
            for (let i = 0; i < s.length; i++) {
                if (LLine && (LLine + 1) % n === 0) {
                    if (s[i] !== "\n") s[i] += "\n";
                    LLine = 0;
                } else {
                    LLine++;
                    if (s[i] === "\n") LLine = 0;
                }
            }
            return s.join("").split("\n");
        };

        const formSave = async (formData) => {
            alertMessage.value = '';
            try {
                const response = await fetch("/common/image_save", {
                    method: "POST",
                    headers: { "X-CSRF-TOKEN": document.querySelector("[name='token']").value },
                    body: formData,
                });
                const result = await response.json();
                if (result.ret === "ok" && result.url) {
                    window.location.href = result.url;
                } else {
                    alertMessage.value = result.txt;
                }
            } catch (error) {
                console.error(error);
            }
        };

        const mobileHxH = (tt) => {
            if (isMobile.value) {
                mobileText.value = tt;
            }
        };

        const adjustTextareaRows = () => {
            isMobile.value = window.innerWidth <= 768;
        };

        onMounted(() => {
            adjustTextareaRows();
            window.addEventListener("resize", adjustTextareaRows);
        });

        return {
            canvas,
            languageInput,
            fetchText,
            alertMessage,
            mobileText,
            isMobile,
            fontsize
        };
    }
});

app.mount('#app');

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

```, コード, サブスク, ソースコード, テンション, トホホ, バニラコード, ボツ, ももあまり, レンダリング, 下記, 中止, 何せ審査, , 処理, 名前付け, 小銭, 業務, 現状, ,

使っていないドメインだけど一番値が高いドメインに暇つぶしでコードを埋め込んでみました.

2025.02.02

Logging

おはようございます.使っていないドメインだけど一番値が高いドメインに暇つぶしでコードを埋め込んでみました.これでソースコードを読める人は少しは楽しめると思います.とくに駆け出しのエンジニアさんには響きそうです.ちなみにドメインは9up.meです、このドメイン更新費用結構お高いけどいま全く使っていなかったドメインです.

少しは活用できたのではと….因みに業者でもないのにドメイン代で年間、1万5千円飛んでいくので自分でも馬鹿だなと思いますが、もっていると何かのとき役に立つのではとか思い込んでいます.恐らくそんな事はないと思いますが心の底あたりにあるですあるです欲が…..w

あと、こちらのドメインに限らずですがSSLのCNが変なんですよねぇ.どうやって直せばよいでしょうか🤔.リニューでもしないといけないのかなぁ?そもそもSSLのCNがFQDN(ドメイン)が不一致でも良いらしいですよねぇなのでまぁ良いかと思っています.

あと続きでVueの読み方はヴューが正しいらしいのですがビューと日本人は読んでいるらしいですよ.そしてそちらが定着していますよね、やっぱ日本人にはヴューは読みづらいですよね.

明日へ続く

著者名  @taoka_toshiaki

※この記事は著者が40代前半に書いたものです.

Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki

OFUSEで応援を送る

タグ

ヴュー, エンジニアさん, コード, ソースコード, ドメイン, ドメイン代, ドメイン更新費用, ビュー, リニュー, 一番値, 不一致, 少し, 年間, 底あたり, , , 業者, , 読み方, 高いドメイン,