🏠️Top Page

🖊️おもしろき こともなき世をおもしろく 住みなすものは 心なりけり.

⏩️強制アプリ開発します.8月半ばまでに作らないとアカウントが停止.

おはようございます.強制的にアプリ開発します.8月半ばまでに作らないとアカウントが停止されるので解除条件として定義されている、既存のアプリをアップデートさせるか、新たなアプリをリリースするか.

既存のアプリは非公開にしているので自分の場合、無条件で何でも良いのでアプリをひとつリリースの選択肢しかない.

まだ一ヶ月ぐらい先なので余裕はあるものの、アイデアが出ないので今の既存のサービスをアプリ化しようと思っています.

今回は広告掲載とか出来ればしたいなと思っているのだけども審査を通過するかは未知数ですね.ちなみに今回はReact Nativeで作ろうと思っています.少しだけReactを触ったことがあるのでReactNativeは開発するに当たって学習コストがかなり低いという事もありリアクトネイティブで開発します.

明日へ続く

⏩️カゴヤ・ジャパンさんのVPSのスナップショット有料何だね.

おはようございます.カゴヤ・ジャパンさんのVPSのスナップショット有料何だね.無料だと思ってスナップショットをONにしていたらサーバー代が倍になってた.そう言えば何だか警告が出ていた気もする🤔.

「そうでもないか・・・警告なかったかな.」

先月の請求が来るまで管理画面を覗かなかったのが悪いだけどもちょっと痛い出費です、再来月から支払いが安くなる感じですね.

VPSの話はここまでで余談です、9月には一年間分支払っていたディズニープラスの更新月になるのですが、エイリアンアースがその前ぐらいから始まるらしく、そして将軍の続編も決まっているのだとかで将軍を観たので一年後には解約しようと思っていたのが悩ましい状態になってます.

なかなか商売上手だなって思います、あまり観ないけどネトフリも何だかんだ継続していてサブスクっていうのは怖いなーって思いますね.

明日へ続く

⏩️日本語形態素解析ライブラリをVibratoに切り替えました.自動タブ生成プラグインの話.

おはようございます.日本語形態素解析ライブラリをVibratoに切り替えました.今までYahoo!APIを使用して日本語形態素解析を行って自動でタブ生成を行っていましたが、脱APIの一環としてVPSサーバにデータを送信して日本語文章を日本語形態素解析しタブ生成するように変更を加えました.

サーバが落ちていない限り動作する感じですね.

特に苦労した点は無いのですが、この頃さくらレンタルサーバーの通信が良くないのか分からないのですが通信エラーで処理が頻繁にエラーを出力するようになっています.

どうも、同時接続が多発するとなるようです、ちょっと困りものです、でもまぁ、660円で動いているですからね、あまり文句は言えないのですが困っています.

尚、ユーザーが管理画面からApacheサービスを再起動する唯一無二の方法はphp.iniを再保存することです、そうするとアパッチサービスが再起動します.そうすることにより原因不明の通信エラーが直ることもあります.

最後に日本語形態素解析ライブラリの参考にしたサイトを貼っときます.

明日へ続く

⏩️iphoneとAndroidがフィフティ・フィフティになりつつある日本.

おはようございます.iphoneとAndroidがフィフティ・フィフティになりつつある日本.自分のサイトの訪問者も五分五分感があります、昔に比べてAndroidの性能が飛躍的に上がったって言う感覚はあるでコスパの良いAndroidへ移行する人の気持ちもよくわかります.

安い志向と高級志向、どちらが悪いとか良いとかは無いですが、経済的に日本は貧しくなってきている気がしています、格差が広がってきている社会になりつつあるとも思います.

中間層もだいぶ減ってきている感覚があります、地方経済もかなりヤバメかなって特に高知県の求人を見ると数年前から給料の額が全く変わっていません.

殆どの企業は賃上げで大変な状況が続いているように思います.これから数年でこの景気が上向くとはあまり考えられないです.これに大震災でも起こったら日本は大変な状況になることは間違いないと思いますが、政治の対応が遅い感があります.

もう少し全体的にスピーディーに対応して間違っていれば改善するというような政治に移行してほしいものです.

明日へ続く

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

おはようございます.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);
}

明日へ続く

⏩️映画、国宝を観てきましたので感想を書いていきます.

おはようございます.昨日の映画、国宝を観てきましたので感想を書いていきます.まずこの映画、国宝になるまでの話を丁寧に描いている映画です、3時間と長丁場な映画ですが納得がいく映画だと思います.この映画を観て国宝という人のイメージが変わったと思う人もいると思います.

この国宝は吉田修一の小説『国宝』が基になっているそうです.だだ、その小説の基となった人物像はいるみたいなので其処から着想を得て、映画が『国宝』制作されているだと思います.

役者さんの演技はめちゃ良かったです、かなり大変な役作りだったと思いますが臨場感がありとても良かったです. 改めて映画を通して自分は仕事とや生き方を考えていました.

作った人達は是非、劇場で観てと告知している理由は、歌舞伎の舞などの迫力は映画館でしか味わえない作りになっています、これはかなり圧巻なので劇場で観れる人は観るべしです.

最後に観て良かったです👍️

明日へ続く

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

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

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

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

明日へ続く

⏩️自前のAPIでほぼ動かしている.利点はサービスの終了が無いところ

おはようございます.自前のAPIでほぼ動かしている.利点はサービスの終了が無いところですが、VPSサーバー等でしか動かない代物なのでそこが難でサーバー代がかさみます.

そこを何とか低予算で運用したいのだけどもなかなか難しいのが現状です.因みにいまはVPSサーバーとレンタルサーバーを合わして1300円ぐらいを毎月支払っています.

自分にとっては1300円は高いし未だに生成AIの有料版は高いので無料版でしのいでいます.もっと稼げるように慣れば有料版とかを使ってみたいなって思います.

お給与が今の倍以上に慣れば良いのだけども、なかなか難しいそうと言う想いもあります.何時までこのような状況が続くか分からないのであまりお金の掛かることは控えています.

最近読んだ記事で老後2000万円では足りないとか言う記事を読んで絶望しています、老後が心配でいまをあまり楽しんでいないような気もしています.今を楽しみたいなーって!

明日へ続く

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

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

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

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

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

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

明日へ続く

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

おはようございます.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})")

明日へ続く