GeminiCliGitHubAction【ジェミナイしぃーえるあいギットハブアクション】が出ましたね.

2025.08.11

Logging

おはようございます.GeminiCliGitHubAction【ジェミナイしぃーえるあいギットハブアクション】が出ましたね.無料枠でも使えるらしいので無料枠で使ってみました、いやーGemini Cliと同じぐらい良いかなと思うのだけども、これは無料枠では使いこなす事が出来ない.

有料枠に切り替えればそれなりに出来そうだけども無料枠は厳しい.イシュー(Issue)やプルリクエストのレビュー(Review)を1、2回ぐらいすればかなりトークンを消費します、それがGemini Cliよりアクション版のほうが多いかも知れない.

有料枠だったらサクサク進みそうな気がしているけど、定額が存在しないようなので使用した分支払いが来るかも知れないので恐いですね.

ただ、そろそろAIに課金しようかなと思い出したので、そろそろ課金します.候補はClaudePro【クロードプロ】に課金すると思います.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

あい, アクション, イシュー, ギットハブアクション, クロード, これ, ジェミナイ, そう, それ, それなり, トーク, プルリクエスト, プロ, ほう, よう, レビュー, 使用, 候補, 存在, 定額, 支払い, 明日, 有料, 消費, 無料, 課金,

Photo by Khanh Le on Pexels.com

今日からよさこい祭りですね.前夜祭という奴です、自分が運営しているサイトも

2025.08.09

Logging

おはようございます.今日からよさこい祭りですね.前夜祭という奴です、自分が運営しているサイトも今年はアクセス数がかなり増加傾向にあるので11日、12日はリソースブーストを使用するつもりでいます.

因みにアクセス数が多くなったのだけど、広告が安い広告しか表示させない為か収益的にはまだ赤字なサイトです、これがもう少し時間が経過すると良い広告が表示されるようになるのかなと思っています.

広告表示に関して明後日詳しく別記事で書いたものを投稿予定です.

よさこい祭りですが、今年よさこい祭りを見に行くかは分かりません.もしかしたら見に行くかもしれませんが、昔よさこい祭りを一人で見に行ったことがあったのですが、やはりお祭りは一人で行くより複数人で行ったほうが良いと思ったのでどうなるかは分かりません(考え中🤔).

よさこい祭りの時期は年々気温が上がっていくような気がしています.見に行く方も踊る人も熱中症にはお気をつけてください.もし、よさこい祭りで見かけたらスルーでお願い致します☺.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アクセス, お気, お願い, こと, これ, サイト, スルー, つもり, ほう, もの, よう, リソースブースト, 予定, 今年, 今日, 使用, 傾向, 前夜祭, 収益, 増加, 年々, 広告, 投稿, 明後日, 明日, 時期, 時間, 気温, 熱中, 祭り, 経過, 考え, 自分, 表示, 複数, 記事, 赤字, 運営,

無料枠使い倒してGeminiCLIでEC管理サイトの土台はどうも出来たぽっい.

2025.08.08

Logging

おはようございます.無料枠使い倒してGeminiCLIでEC管理サイトの土台はどうも出来たぽっい、いやーこれは便利なんだけども自分は確認してコード修正とかをすれば良いだけになって少々肩透かし感があります.

今朝(先日)、GeminiCLIを使用する前にClaudeProに加入するか凄く悩んだのですが、結局、仕事で使用しているので、そこで何やらはわかる感じなので今回は断念しました.Claudeを使用するとgithubと連携できる訳です.それもClaudeProでも連携できる形なのでClaude Code Actionが出来る訳です、月に3000円ぐらい支払えばClaudeProでもかなり出来ます.個人開発や零細企業、小規模開発などは使用して良いらしいのでまぁ全自動で開発できます.

https://github.com/apps/claude ←リンクをアドレスバーへ貼り付けエンター

人はClaudeが生成したものを確認し再度指示を出すという事を繰り返して製品(サービス)を作り上げていくというサイクルで大丈夫.

多分、近い将来起こり得るのは上流工程の人材しか要らなくなるという図式ですね.現段階でも全自動化は可能だと思います.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アドレス, エンター, コード, これ, サービス, サイクル, サイト, それ, バー, もの, リンク, 上流, 人材, 今回, 今朝, 仕事, 付け, 企業, 使い, 使用, 便利, 修正, 個人, 先日, 加入, 可能, 図式, 土台, 大丈夫, 将来, 小規模, 工程, 感じ, 指示, 断念, 明日, 段階, 無料, 生成, 確認, 管理, 結局, 肩透かし, 自分, 自動, 製品, 連携, 開発, 零細,

Photo by Pixabay on Pexels.com

サブスクリプションというのは怖いなーと思うわけだけども

2025.08.04

Logging

おはようございます.サブスクリプションというのは怖いなーと思うわけだけども使用する側するからすると美味しいツールだと思います.殆どの人が使い倒すことが出来ないまま毎月お金を支払っている.

自分もネトフリ契約しているけど全く使用しないぐらいこの頃は観ていないのだけども毎月お金を支払っている.そんなサブスクリプションで、この頃恐いサブスクリプションを見つけてしまった.

それがmyIQというIQテストや性格診断や何やら出来るサイトだけども、IQテストを行ったあと結果を知りたい場合、料金を支払うことになる.その時、自動的にサブスクリプションにも同時加入になるので恐い(それが7日間で自動更新だとか怖くない?).その他にもIQテストを結果を見るまでにもその他のサービスを勧めてくるので、全部キャンセルで良いのに人によっては加入する人もいるだろうと.

自分が思うにIQテストの結果は他のIQテストと同等だったので、それなりに合っているとは思います、これが詐欺的だと多分、サブスクリプションの契約は通らないだろうけどそこはちゃんとしているだと思います.

因みにIQテストはまぁまぁになるのだけど自分は賢くはないと思っています.知識もそんなに無いし何せ、面白い話も出来ないしましてや饒舌多弁でもないのだから.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

あと, ぁまぁになるのだけど, お金, キャンセル, こと, これ, サービス, サイト, サブスクリプション, そこ, その他, それ, それなり, ツール, テスト, ネトフリ, まま, わけ, 使用, 全部, 加入, 同時, 同等, 場合, 多弁, 契約, 性格, 料金, 明日, 更新, 殆ど, 毎月, 知識, 結果, 自分, 自動, 自動的, 診断, 詐欺, 饒舌,

Scraper API(スクレイパーAPI)という物を使用すればJS駆動のサイトでもサイトを解析

2025.08.02

Logging

おはようございます.Scraper API(スクレイパーAPI)という物を使用すればJS駆動のサイトでもサイトを解析出来るようですね.殆どの近年作られたサイトはどこかしらでJavascriptのコードで動いている部分があるのでスクレイピングが出来ない.

またジャバスクリプトがオンになっていないとページ(サイト)の読み込みが出来ないサイトもあるのが現状だと思います.

そこでScraper API(スクレイパーAPI)というサービスを使用すればそういう解析が出来る.因みにVPSやAWSなどのサーバーだったらNodeJsを導入すれば簡単に解析が出来るのだけど、国内のレンタルサーバーなどでは、そもそもNodeJsがインストール出来ないのである.

スクレイパーAPIの使い方は簡単でPHP言語で使用したい場合はこんな感じです.

<?php

// APIキーと対象URL
$apiKey = 'xxxxxx';
$targetUrl = 'https://example.com?var1=value1&var2=value2';

// GET用のScraperAPIリクエストURLを構築(render=trueでJS有効)
$scraperApiUrl = 'https://api.scraperapi.com?' . http_build_query([
    'api_key' => $apiKey,
    'url' => $targetUrl,
    'render' => 'true' // JavaScriptを有効にする
]);

// cURLでGETリクエスト送信
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $scraperApiUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

// レスポンス出力
print_r($response);

尚、こちらのコードはGETパターンですがPOSTでも操作出来たりします.SDKもあるのでそちらで対応したほうがやりやすいかもです.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

```, インストール, オン, かしら, カモ, キー, コード, こちら, サーバー, サービス, サイト, ジャバスクリプト, スクレイパー, スクレイピング, そちら, そもそも, どこ, パターン, ページ, ほう, よう, リクエスト, レスポンス, レンタル, 使い方, 使用, 出力, 国内, 場合, 対応, 対象, 導入, 感じ, 操作, 明日, 有効, 構築, 殆ど, 現状, 簡単, 解析, 言語, 読み込み, 近年, 送信, 部分, 駆動,

Photo by Pixabay on Pexels.com

FastApiのコードをgitで管理するように.あとはテストサーバーのymal

2025.07.31

Logging

おはようございます.FastApiのコードをgitで管理するように.あとは自分のテスト環境用のymalもgithub上に置いておこうと思っています.

というのも、そろそろパソコンを買い替えようかなと思っています.もしかしたらウィンドウズ系からサヨナラするかもですが、Apple系は高いからなぁ置き換えるならまずメインのデスクトップから置き換えていかないとどうしようもない.

逆に言えばメインをウィンドウズを使用している間はアップル系には置き換えが難しいということです.今の仕事はWebシステム系なので、どちらかと言えばウィンドウズよりMacが適していると考える人が多いと思う.自分も買い替えたい気持ちがあるのだけども、自作PCの良いところはメンテナンスが自分で出来るところにある.

こういう事はアップル製品には難しい、精々メモリ交換やSSD交換ぐらいのものしか出来ないのが現状かな、なので徐々にアプリやセキュリティ更新に引っかかり新しい製品を購入しないと難しくなる事が多いのだが、自作PC場合は部品交換すると何とかなる事が多い.

そういう事もあって未だにボロパソコンを使用しているだけど、いろいろとガタがでてきているので部品交換するよりもう取っ替えた方が良い感じになりつつある.

そういう訳でウィンドウズかアップル製品にするかを凄く悩んでいます.皆さんならどうしますか?

因みに来年には恐らく買い替えないとどうしようもない感じになりそうです.ギリまで使い倒すとは思うものの…

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アップル, あと, アプリ, ウィンドウズ, ガタ, キリ, コード, こと, サヨナラ, システム, しょう, セキュリティ, そう, デスク, テスト, ところ, どちら, ドップ, パソコン, ボロパソコン, メイン, メモリ, メンテナンス, もの, よう, 交換, 仕事, 使用, 場合, 感じ, 明日, 更新, 来年, 気持ち, 現状, 環境, 皆さん, 管理, 自作, 自分, 製品, 購入, 部品,

台湾旅行へ行ってみたいけど、地元の空港を使うと日帰りは無理みたい

2025.07.29

Logging

おはようございます.高知龍馬空港(高知空港)から台湾へ行くチャーター便が来年の3月まで延長されたそうです.英語も話せないけど、台湾は日本語が結構通じるというので海外旅行初心者には良い国だとされているそうです.

何故、台湾に行きたいと思ったのかは、唯何となく行ってみたいという漠然と思ったから.

高知空港から台湾行きは今のところ週二便しか出ていなくて必然的にホテルに泊まらないといけない.飛行機が台湾に飛ぶのは水曜日と土曜日だけなので仕事も休まないと旅行にはいけない.

これが毎日か頻度が増えて飛ぶようになるらしいので、そうなった時に日帰りで台湾旅行に行ってみたいと思っています.

因みに挿絵動画はいま炎上中のいけちゃんの動画を使用しています(悪意はありません).

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

いま, これ, そう, チャーター便, ところ, ホテル, よう, 仕事, 使用, 初心者, 動画, 台湾, 土曜日, 延長, 必然, 悪意, 挿絵, 旅行, 日帰り, 日本語, 明日, 来年, 毎日, 水曜日, 海外, 炎上, 空港, 英語, 行き, 頻度, 飛行機, 高知, 高知空港,

Threadsのapiを使用して投稿する奴をライブラリ(composer)として作り直しました.

2025.07.26

Logging

おはようございます.Threadsのapiを使用して投稿する奴をライブラリ(composer)として作り直しました、まだリリースしたばかりなので誰も使用していない感じです.

因みにバージョンアップは恐らくしないであろう代物です、誰か引き継いで開発してくれる方をお待ちしています.

パッケージにするのは今回が二回目です、そしてやはり一筋縄ではいかなかったですがバージョンは1.0.0という事で一度リリースして自分でインストールしてみてバグを発見して再度リポジトリを削除して見た目はバージョン1ですが実際はバージョン1.0.3ぐらいです.

パッケージにするのは二回目と書きましたが、初代のパッケージは削除して公開していない感じになります、なので今のところ公開しているパッケージはThreadsだけな感じになります.

最後にこんなリードミーもいい加減なパッケージですが、ご使用いただけたら嬉しいです.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

いい加減, インストール, お待ち, ところ, バージョン, バージョンアップ, バグ, パッケージ, ライブラリ, リードミー, リポジトリ, リリース, 一筋縄, 今回, 代物, 使用, 公開, 初代, 削除, 感じ, 投稿, 明日, 最後, 発見, 自分, 見た目, 開発,

駆け出しエンジニアとつながりたい的なコードを書いてみた.ごっさんです.

2025.07.21

Logging

おはようございます.下記のコードを知っておくと便利ですよ、フレームワークとかなら使わないかもしれないけども素(えいてぃぶコード)のPHP言語で書くと便利ですね.この頃、素のPHP言語で書くことが無くなりつつあります.仕事ではフレームワークやフロントエンドでもライブラリを使用してコードを書くことが多いですね.たまにバニラJSで書くこともありますが.

<?php
$foo = [
	'name' => '山田 太郎',
	'age' => 25,
	'tel' => '09012341234'
	];
var_dump($foo);
var_dump(array_keys($foo));
var_dump(array_values($foo));

駆け出しエンジニアがもういないよなぁ…コードの土台はAIによって書くことが多くなりプロジェクトの改修時に古のコードを見るようになるだろうなぁ.たまに見かける痛いコードを昔は書いていたなぁと思いつつ、今でも痛いコードを書いていると思った方が良いなって.数ヶ月前に書いたコードが痛いコードに見えるので…まだまだ成長過程かなって思っています.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

```, イブ, エンジニア, エンド, ヶ月, コード, こと, たま, バニラ, フレーム, プロジェクト, フロント, よう, ライブラリ, ワーク, 下記, 仕事, 使用, 便利, 土台, 太郎, 山田, 成長, 改修, 明日, 言語, 過程, 駆け出し,

レンダリングのちらつきを無くしました、あとはアップロード際に.

2025.07.20

Logging

おはようございます.レンダリングのちらつきを無くしました、あとはアップロード際に画質劣化するワードプレスの対応を行えばひとまず、このサイトは改善しないつもりでいます.因みにレンダリングのちらつきがどのような時に発生するかと言えば、背景色の切り替えを行っているところです.

ベースは黄緑色の背景色にしているのですがJSで背景色の切り替えが出来るようにしています.切り替えると切り替えた色をローカルで持つって再度訪問された時に切り替えた色にJSでレンダリングしていたのですが、その時にちらつきが発生していました.

理由は分かっていたけど今の今まで放置していました.切り替えて使っているユーザーがどれぐらいいるのか把握していなかっただけど、自分は背景色を黒にしているのでやっぱ気になるという事で先日の休みを使用して切り替えました.

フロントエンドな作り例えばヘッドレスCMS等で作っていたら色の切り替わりを行っても何らちらつきとは無縁ですがね.今回はかなりベターな対応をしたのだけど、もっと良い方法はないかと思っています.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アップ, あと, エンド, サイト, つもり, ところ, どれ, プレス, フロント, ベース, ベター, ヘッド, ユーザー, よう, レス, レンダリング, ローカル, ロード, ワード, 今回, 休み, 作り, 使用, 先日, 切り, 切り替え, 劣化, 対応, 把握, 改善, 放置, 方法, 明日, 替わり, 無縁, 理由, 画質, 発生, 緑色, 背景, 自分, 訪問,

ユーチューバーの成功への道は険しい、可視化してみました.

2025.07.17

Logging

おはようございます.ユーチューバーの成功への道は険しいですね、1000人以上の割合は13%ぐらいだそうです、狭き門だなって正直思いました.因みに自分は一部AIのちからを借りている動画があるので1000人以上になっても恐らく収益は5000円ぐらいじゃないかと思っています.

道半ばでYOUTUBERを諦める人の気持ちがわかります、馬鹿みたいに毎日UPしていてもチャンネル登録者数は増えそうにない、それなりに戦略やニーズに答えていかないと難しいと思います.中身のない内容を毎日UPしても難しいでしょうね.

先日、YOUTUBEを頑張りたいと記載したばかりだけど、心が折れそうな現実をみてしまった…

因みに表などを詳しくみたい人はこちらを参照してください、今回Geminiを使用してウェブ解析した資料になります.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

ウェブ, こちら, そう, それなり, チャンネル, ニーズ, のち, みたい, ユーチューバー, 一部, 中身, 今回, 以上, 使用, 先日, 内容, 割合, 動画, 半ば, 参照, 収益, 成功, 戦略, 明日, 正直, 毎日, 気持ち, 現実, 登録, 自分, 解析, 記載, 資料, 馬鹿,

ワードプレスのテーブルwp_postsデータを取ってきてLaravelで表示.

2025.07.15

Logging

おはようございます.ワードプレスのテーブル(wp_posts)データを取ってきて別サイト(Laravel)にて表示してます.別サイトには広告が付かない感じです.因みにデータは自サイトのブログデータを使用していますが随時去年あたりのデータから取得するようにSQLに記述しています.

尚、どうやって取得しているかをお話するとSQLのコネクション変更する設定をコンフィグフォルダのデータベースファイルに記述してモデルにもその事を明記しています.

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class Blog extends Model
{
    protected $connection = 'second_db';
    protected $table = 'wp_posts';
}

そしてそれらを呼び出しているだけです、とても簡単なコードで動いています.そんな感じなのでブレイドのコードをシェアします、流石にコントローラーは見せられないけどYoutubeのリンクやXのリンクは出力する前に置き換えていることをヒントとしてお伝えしときますね.

<!doctype html>
<html lang="ja" class="transition-colors duration-300">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
    <meta name="robots" content="noindex,nofollow" />
    <title>blog - [taoka toshiaki]</title>
    <link rel="icon" href="https://taoka-toshiaki.com/images/g4DV7mRe_400x400.jpg?t=1752317617"
        sizes="16x16 24x24 32x32 48x48 64x64">
    <!-- Prism CSS -->
    <link id="prism-theme" rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism.css" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1/plugins/line-numbers/prism-line-numbers.css" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.css"
        rel="stylesheet" />
    <style>
        body {
            background-color: #f9fafb;
            color: #1f2937;
            transition: background-color 0.3s, color 0.3s;
            word-wrap: break-word;
            overflow-wrap: break-word;
        }

        .dark body {
            background-color: #242425;
            color: #f9fafb;
        }

        article {
            background-color: #fff;
            transition: background-color 0.3s;
            word-wrap: break-word;
            overflow-wrap: break-word;
        }

        .dark article {
            background-color: #3d3d47;
        }

        time {
            color: #6b7280;
        }

        .dark time {
            color: #9ca3af;
        }

        .prose {
            color: inherit;
            word-wrap: break-word;
            overflow-wrap: break-word;
        }

        pre[class*="language-"] {
            overflow-x: auto;
            padding: 1em;
            border-radius: 0.5rem;
        }

        code[class*="language-"] {
            white-space: pre;
        }

        a,
        a:hover {
            border-bottom: solid 2px #fbf81c;
        }
    </style>
    @include('header_script')
</head>

<body class="transition-colors duration-300">

    <div class="max-w-3xl mx-auto p-6">
        <h1 class="text-2xl font-bold mb-6"><a href="/" class="text-current">🏠️Top Page</a></h1>
        <p class="mb-3 font-bold"><a href="/blog">🖊️</a>おもしろき こともなき世をおもしろく 住みなすものは 心なりけり.</p>
        @if (request()->input('page') == 108)
            <a href="/blog" class="text-[54px]">📖</a>
            <h1 class="text-2xl font-bold text-[108px] mb-6">108🧘️</h1>
        @endif

        <button id="darkModeToggle"
            class="mb-6 px-4 py-2 bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded">
            ダークモード切り替え
        </button>

        <div class="space-y-10">
            @foreach ($items as $item)
                <article class="shadow-md rounded-lg p-6 transition-colors duration-300">
                    <h2 class="text-xl font-semibold mb-2 break-words">⏩️{{ $item->post_title }}</h2>
                    <time class="text-sm block mb-4">{{ $item->post_date }}</time>
                    <div class="prose prose-sm max-w-none break-words">
                        {!! $item->post_content !!}
                    </div>
                </article>
            @endforeach
        </div>

        <div class="mt-10">
            {{ $items->links() }}
        </div>
    </div>
    <!-- トップに戻るボタン -->
    <button id="scrollTopBtn"
        class="fixed bottom-6 right-6 hidden bg-gray-600 text-white px-4 py-2 rounded-full shadow-lg hover:bg-gray-700 transition-opacity">
        ▲ 上へ戻る
    </button>
    <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
    <script src="https://cdn.jsdelivr.net/clipboard.js/1.5.13/clipboard.min.js"></script>
    <!-- Prism.jsのコアファイル -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js"></script>
    <!-- Prism.jsのオートローダ -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
    <!-- Toolbarプラグインのスクリプト -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/toolbar/prism-toolbar.min.js"></script>
    <!-- その他のプラグインのスクリプト -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/highlight-keywords/prism-highlight-keywords.min.js"></script>

    <script>
        const toggleBtn = document.getElementById('darkModeToggle');
        const prismTheme = document.getElementById('prism-theme');
        const darkThemeHref = 'https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism-tomorrow.css';
        const lightThemeHref = 'https://cdn.jsdelivr.net/npm/prismjs@1/themes/prism.css';

        if (localStorage.getItem('darkMode') === 'true') {
            document.documentElement.classList.add('dark');
            prismTheme.href = darkThemeHref;
        }

        toggleBtn.addEventListener('click', () => {
            const isDark = document.documentElement.classList.toggle('dark');
            prismTheme.href = isDark ? darkThemeHref : lightThemeHref;
            localStorage.setItem('darkMode', isDark);
        });

        document.addEventListener("DOMContentLoaded", () => {
            document.querySelectorAll('pre[class*="lang-"]').forEach(pre => {
                const match = pre.className.match(/lang-(\w+)/);
                if (match) {
                    const lang = match[1];
                    pre.className = `language-${lang} line-numbers`;
                    const code = pre.querySelector('code');
                    if (code) code.className = `language-${lang}`;
                }
            });
            // トップへ戻るボタンの処理
            const scrollTopBtn = document.getElementById("scrollTopBtn");
            window.addEventListener("scroll", () => {
                scrollTopBtn.classList.toggle("hidden", window.scrollY < 200);
            });

            scrollTopBtn.addEventListener("click", () => {
                window.scrollTo({
                    top: 0,
                    behavior: "smooth"
                });
            });
        });

        //全選択ボタンを作成&クラス名付与
        Prism.plugins.toolbar.registerButton('select-code', function(env) {
            var newButton = document.createElement('button');
            newButton.className = 'code-select-btn';
            newButton.innerHTML = 'コードを選択';

            newButton.addEventListener('click', function() {
                if (document.body.createTextRange) { // ms
                    var range = document.body.createTextRange();
                    range.moveToElementText(env.element);
                    range.select();
                } else if (window.getSelection) { // moz, opera, webkit
                    var selection = window.getSelection();
                    var range = document.createRange();
                    range.selectNodeContents(env.element);
                    selection.removeAllRanges();
                    selection.addRange(range);
                }
            });
            return newButton;
        });

        //使用言語表示ボタンを作成&クラス名付与
        Prism.plugins.toolbar.registerButton('show-lang-btn', function(env) {
            var newButton2 = document.createElement('button');
            newButton2.className = 'show-lang-btn';
            newButton2.innerHTML = env.language;
            return newButton2;
        });

        $(function() {
            //各ボタン要素の親要素にクラス名付与
            $('.toolbar-item .code-select-btn').parents('.toolbar-item').addClass('code-select');
        });
    </script>

</body>

</html>

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

```, ;;⏩, あたり, いん, オート, お伝え, お話, クラス, コード, コア, こと, コネクション, コントローラー, コンフィグフォルダ, サイト, シェア, スクリプト, その他, それら, ダーク, データ, データベース, テーブル, ドップ, ヒント, ファイル, フラグ, ブレイド, プレス, ブログデータ, ボタン, モード, モデル, もの, よう, リンク, ローダ, ワード, 付与, 作成, 使用, 処理, 出力, 切り替え, 去年, 取得, 変更, 広告, 感じ, 明日, 明記, 流石, 簡単, 表示, 要素, 言語, 記述, 設定, 選択, 随時,

チャットワークのAPIを使ってみました.プロンプトでほぼ書いています.

2025.07.13

Logging

おはようございます.チャットワークのAPIを使ってみました.プロンプトでほぼ書いたコードになります、チャットGPTの無料版にリファレンスのURLリンクとPHPのクラス化、リターンに$thisで返却出来る所は$thisを使用してスマートにコードを書いてと指示を出しました.

出来上がったコードが下記になります.ソースコードは自分の方でモンキーテスト的に動かしてみましたが、ちゃんと動作するようです.

<?php
class ChatworkClient
{
    private string $apiToken;
    private string $baseUrl = 'https://api.chatwork.com/v2';
    private int $retryCount = 3;
    private int $retryDelay = 1000000; // microseconds

    public function __construct(string $apiToken)
    {
        $this->apiToken = $apiToken;
    }

    public function setRetry(int $count, int $delayMicroseconds): self
    {
        $this->retryCount = $count;
        $this->retryDelay = $delayMicroseconds;
        return $this;
    }

    private function request(string $method, string $path, array $params = []): array
    {
        $attempts = 0;

        while ($attempts < $this->retryCount) {
            $attempts++;

            $ch = curl_init();
            $url = $this->baseUrl . $path;

            if ($method === 'GET' && $params) {
                $url .= '?' . http_build_query($params);
            }

            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            $headers = ['X-ChatWorkToken: ' . $this->apiToken];

            if (in_array($method, ['POST', 'PUT', 'DELETE'])) {
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
                curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
                $headers[] = 'Content-Type: application/x-www-form-urlencoded';
            }

            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

            $body = curl_exec($ch);
            $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            $error = curl_error($ch);
            curl_close($ch);

            if ($error) {
                if ($attempts < $this->retryCount) {
                    usleep($this->retryDelay);
                    continue;
                }
                throw new RuntimeException("cURL error after {$attempts} attempts: {$error}");
            }

            if ($status >= 200 && $status < 300) {
                return [
                    'status' => $status,
                    'body' => $body ? json_decode($body, true) : null,
                ];
            }

            if ($attempts < $this->retryCount && $status >= 500) {
                usleep($this->retryDelay);
                continue;
            }

            return [
                'status' => $status,
                'body' => $body ? json_decode($body, true) : null,
            ];
        }

        throw new RuntimeException("Request failed after {$this->retryCount} attempts");
    }

    public function setToken(string $token): self
    {
        $this->apiToken = $token;
        return $this;
    }

    public function me(): array
    {
        return $this->request('GET', '/me');
    }
    public function getMyStatus(): array
    {
        return $this->request('GET', '/my/status');
    }
    public function getMyTasks(array $filters = []): array
    {
        return $this->request('GET', '/my/tasks', $filters);
    }
    public function getContacts(): array
    {
        return $this->request('GET', '/contacts');
    }
    public function getRooms(): array
    {
        return $this->request('GET', '/rooms');
    }
    public function createRoom(array $params): array
    {
        return $this->request('POST', '/rooms', $params);
    }
    public function getRoom(int $roomId): array
    {
        return $this->request('GET', "/rooms/{$roomId}");
    }
    public function updateRoom(int $roomId, array $params): array
    {
        return $this->request('PUT', "/rooms/{$roomId}", $params);
    }
    public function deleteRoom(int $roomId, string $action = 'leave'): array
    {
        return $this->request('DELETE', "/rooms/{$roomId}", ['action_type' => $action]);
    }

    public function getMembers(int $roomId): array
    {
        return $this->request('GET', "/rooms/{$roomId}/members");
    }
    public function updateMembers(int $roomId, array $params): array
    {
        return $this->request('PUT', "/rooms/{$roomId}/members", $params);
    }

    public function getMessages(int $roomId, bool $force = false): array
    {
        return $this->request('GET', "/rooms/{$roomId}/messages", ['force' => $force ? 1 : 0]);
    }

    public function postMessage(int $roomId, string $body, bool $selfUnread = false): self
    {
        $this->request('POST', "/rooms/{$roomId}/messages", ['body' => $body, 'self_unread' => $selfUnread ? 1 : 0]);
        return $this;
    }

    public function markRead(int $roomId): self
    {
        $this->request('PUT', "/rooms/{$roomId}/messages/read");
        return $this;
    }

    public function markUnread(int $roomId): self
    {
        $this->request('PUT', "/rooms/{$roomId}/messages/unread");
        return $this;
    }

    public function getMessage(int $roomId, int $messageId): array
    {
        return $this->request('GET', "/rooms/{$roomId}/messages/{$messageId}");
    }

    public function getRoomTasks(int $roomId, array $filters = []): array
    {
        return $this->request('GET', "/rooms/{$roomId}/tasks", $filters);
    }

    public function createTask(int $roomId, array $params): array
    {
        return $this->request('POST', "/rooms/{$roomId}/tasks", $params);
    }

    public function uploadFile(int $roomId, string $filePath, string $message = ''): array
    {
        if (!file_exists($filePath)) {
            throw new InvalidArgumentException("File not found: {$filePath}");
        }

        $ch = curl_init();
        $url = $this->baseUrl . "/rooms/{$roomId}/files";
        $cfile = curl_file_create($filePath);

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-ChatWorkToken: ' . $this->apiToken]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, ['file' => $cfile, 'message' => $message]);

        $body = curl_exec($ch);
        $status = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        if (curl_errno($ch)) {
            throw new RuntimeException(curl_error($ch));
        }

        curl_close($ch);
        return ['status' => $status, 'body' => json_decode($body, true)];
    }
}

人が今回のコードを書いた場合、早い人でも10分ぐらいはコードを書かないといけないと思います、どんなに早くてもそれぐらいの時間は必要だと思いますが、生成AIはこれを数十秒で書ける訳ですから、確実に時間短縮になります.

なので人工知能が使える現場は間違いなく最初のコード出力は人工知能に任せた方が良いです.特に新規案件の土台は生成AIに任せると開発コストは削減出来ます.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

```, クラス, コード, コスト, これ, スマート, ソース, それ, チャット, テスト, プロンプト, モンキー, よう, リターン, リファレンス, リンク, ワーク, 下記, 人工, 今回, 使用, 出力, 削減, 動作, 土台, 場合, 必要, 指示, 新規, 明日, 時間, 最初, 案件, 無料, 現場, 生成, 知能, 短縮, 確実, 自分, 返却, 開発, 間違い,

laravelはenvで設定するのがベターですけど、そうではない環境もenvで

2025.07.11

Logging

おはようございます.laravelはenvで設定するのがベターですけど、そうではない環境もenvで構築した方が良いです、なぜかと言えばテスト環境との切り替えが簡単になるということなんです.

使い方はこんな感じまずComposerのライブラリをインストールします.

composer require vlucas/phpdotenv

次に使用方法はこんな感じです.こうしとけば結構楽になりますし使いまわしの時に便利です、Laravel(ララベル)ってライブラリの纏まりで構築されているのでワードプレスの環境でも組み込む事は可能です.自分が使用しているのはenv周りとデータベース周りのライブラリです.

require_once __DIR__ . '/vendor/autoload.php';

use Dotenv\Dotenv;

// .env ファイルを読み込む
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();

// 環境変数の取得
echo getenv('APP_NAME');     // ✅ OK
echo $_ENV['APP_NAME'];      // ✅ OK
echo env('APP_NAME');        // ❌ Laravel外では未定義

そうそう.envをルート上に置いている場合は.htaccessに下記の記述を書くことをお忘れなく!!これを置いていない場合は筒抜けになります(エンジンエックスの場合も記載しときますね).

<Files .env>
 require all denied
</Files>
location ~ /\.env {
    deny all;
}

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

```, インストール, エックス, エンジン, こと, これ, データベース, テスト, ファイル, プレス, ベター, ライブラリ, ララベル, ルート, ワード, 下記, 使い方, 使用, 便利, 切り替え, 取得, 可能, 周り, 場合, 変数, 定義, 感じ, 方法, 明日, 構築, 環境, 筒抜け, 簡単, 自分, 記載, 記述, 設定,

格安SIMでも4Gから5Gに切り替える事が無料で出来るみたい.

2025.07.07

Logging

おはようございます.格安SIMでも4Gから5Gに切り替える事が無料で出来るみたいだったので、早速切り替えてみました.5G帯域を使用できるようになるには、ちょっと時間が掛かりましたがこれで外で使用するときは5Gで使用出来ます.

5G帯域が役に立つのは自分の場合は当分の間無いかなと思っています、平日はリモートワークなのでwifi環境下にいるのでほぼモバイル通信費がかからないです.

そう思っていたのですが、休みの日に外で勉強する時間を設けようと今思っていてその時にディザリングすることもあるので、そういう時に使用すると結構便利なんじゃないかなって思っていて近日中に試してみたいと思います.

トイウコトで近日中にオーテピア高知図書館に出かけてみます.カーミルでも良かったのですが高知市の方はミリ波もカバーしているようなので速いかなと思っています.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

オーテピア, カー, カバー, こと, これ, ディザリング, トイウコト, とき, みたい, ミリ, ミル, モバイル, よう, リモート, ワーク, 休み, 使用, 便利, 勉強, 図書館, 場合, 帯域, 平日, 当分, 明日, 時間, 格安, 無料, 環境, 自分, 近日, 通信, 高知,

Photo by Aaditya Arora on Pexels.com

検索から離れていく時代になった時の対処法というかこれしか対応策がない.

2025.07.02

Logging

おはようございます.そろそろGさんが日本でも検索から生成AIに切り替えを行いそうな気配がありますというのは、自分でモバイル検索していたら検索が対話型に切り替わった時があったのでそろそろな予感がします.

最初に対話型(AIチャット)に切り替わった時に影響を受けやすいサイトは「何々とは」を教えてくれるアンサーサイトだそう、そういうサイトはかなりアクセス数が激減するとのこと、また広告収益の出てないサイトも同じくアクセス数が減るとのこと、逆に影響を受けにくいサイトは広告収益を生み出しているサイトだそうです.

では、どうやってアクセス数を対話型になった時に補うかの話ですが、もうこれしかないと自分は思っています.SNSのフル活用です、フル活用なので一つのSNSの活動をするのではなく複数のSNSを運用し集客に繋げるしか道のりはないじゃないかと.

あと、ネットで商品を販売しているサイトは大手、例えば楽天やアマゾンと言ったサイトに出店しないと成り立たない時代になると思います.本当に人気商品を持っているサイトはダイレクトに物が売れると思いますが、そうではない他店舗の商品を売っている小売サイトは影響を受けると思います.

なので、大手のサイトに店舗を構えることは必須と言えるでしょう、またSNSにも力を入れることや他店舗よりも安く売らないと厳しい時代になりそうです.

尚、Gさんは人工知能対話型検索に広告を挟むことを検討しているので広告を使用するのも一つの手なのかもしれません.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アクセス, あと, アマゾン, アンサーサイト, こと, これ, サイト, サン, そう, ダイレクト, チャット, ネット, プル, モバイル, 一つ, 予感, 人工, 人気, 使用, 出店, 切り替え, 収益, 商品, 大手, 対話, 小売, 広告, 店舗, 影響, 必須, 日本, 明日, 時代, 最初, 検索, 検討, 楽天, 気配, 活動, 活用, 激減, 生成, 知能, 自分, 複数, 販売, 運用, 道のり, 集客,

AIで今後どうなるだろうな.自然言語処理で指示出し出来てきた今日.

2025.07.01

Logging

おはようございます.何だか梅雨明けした休日にGeminiCliでコードを生成しています.仕事ではまだ自分はChatに分からない事を質問するぐらいの事しかしていないのだけども絶対にCliなどで作業すると時間短縮になるのは間違いです(仕事でも導入しているのですが自分は使用していない).

休日に作業するときはコパイロットとGeminiを使用して開発しているのです、どちらも無料版なのだけど自分は無料板で事足りています.

因みにコパイロットとGemini、どちらが優秀かという問いに関しては今のところコパイロットの方が優秀なソースコードを書いてくれるというイメージが強いです.有料版ではカーソルやデビィンなどが優秀らしいけども余裕資金があんま無いので試していない.

お金に余裕があればいろいろと試したいことはあります.例えばグラボ(グラフィックボード)を取り替えて機械学習の学習をローカルで試してみたいなどがあります.

この頃思うのだけど、何かとこの業界は移り変わりが激しいのと新しい技術を学ぶときにたまに技術投資が必要になります.昔はオープンソース的な感じだったけどこのIT業界ビックテックはお金を取り出して来ています.

その中でMETA社?だけがオープンソースでいろいろと提供してくれていてとても有り難いです.それでもやっぱそれを動かす端末の推奨環境という物があるので古いPCだと動かなかったりします.

今後、Llm(大規模言語モデル)は容量が小さくなっていくということとローカル端末で動かすのが当たり前になる時代が来るそうです.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

あんま, イメージ, オープン, お金, カーソル, グラフィック, グラボ, コード, こと, コパイロット, ソース, そう, それ, たま, デビィン, とき, ところ, どちら, ビックテック, ボード, みたい, モデル, ローカル, 今後, 仕事, 休日, 余裕, 作業, 使用, 優秀, 問い, 学習, 容量, 導入, 当たり前, 必要, 感じ, 技術, 投資, 推奨, 提供, 明け, 明日, 時代, 時間, 有料, 梅雨, 業界, 機械, 無料, 環境, 生成, 短縮, 移り変わり, 端末, 絶対, 自分, 規模, 言語, 資金, 質問, 開発, 間違い,

GeminiCliを使ってみました、まぁまぁ使えるかもしれない.

2025.06.30

Logging

おはようございます.GeminiCliを使ってみました、まぁまぁ使えるかもしれないというのが第一印象です、ただデザイン修正には使えそうにない.デザインを提示すればその通りになおしてくれると思うのだけどテキストだけの指示ではなかなか難しいと感じました.

ディレクトリ配下にあるソースコードを読ます場合は下記のようなプロンプトを一度打つとスムーズに機能追加してくれるので良いですよ.

コードベースを把握して

最初にこの言葉をGeminiに投げることでどんな機能のプログラムコードなのか把握します.これがないと駄目な訳でもないだけどもスムーズに指示出しが出来ます.

特定のコードに対して修正やらを書けたい場合は@(アットマーク)を入力するとソースコードの候補が表示されるので選択をしてプロンプトを指示を出すと良いです.

あとGeminiCliを終了する場合は下記のコマンドを打てば終了します.

/exit

!を入力しls -aなどと入力するとMacの場合は階層のファイル一覧が表示されます的なことも出来ます.

ともあれ、ジェミナイ(ジェミニ)は無料で使用できるトークンも他よりも比較的に多いので自分としてはかなり嬉しいです、休日の個人開発はこれで何とか頑張っていけそうです.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

あっとまーく, あと, コード, こと, コマンド, これ, ジェミナイ, ジェミニ, スムーズ, ソース, そう, ディレクトリ, テキスト, デザイン, トーク, ファイル, プログラム, プロンプト, ベース, よう, 一覧, 下記, 休日, 使用, 修正, 個人, 候補, 入力, 出し, 印象, 場合, 把握, 指示, 提示, 明日, 最初, 機能, 比較, 無料, 特定, 終了, 自分, 表示, 言葉, 追加, 通り, 選択, 配下, 開発, 階層, 駄目,

よさこい祭り動画検索サイトに今ごろ本腰とテコ入れを行うことに.

2025.06.29

Logging

おはようございます.よさこい祭り動画検索サイトに今ごろ本腰とテコ入れを行うことにして先日しごと終わってから対応を行っていました.自分には三本の柱があってその中の一本によさこい祭り動画検索サイトが存在します.

ただ、三本の柱で一番ぐらぐら揺れるよさこい祭り動画検索サイトを何とかアクセス数を増やしたいなと思いいろいろとアクセス数を増やす為の対策を現在試みています.

三本の柱で一番稼ぎが少ないので回転数を上げていろいろとアイデアを取り入れて改善していこうと思っています.

殆どの試みはSNSを使用したものになりますが、数撃ちゃ当たる的に対応を行い、また、よさこい祭り動画検索サイトのデザインも簡素化してなるべく表示を早く表示するように対応を行っています.

因みにEC管理サイトの構築はまだ表面上だけで進んでいませんが気長にお待ち下さい.収益化が出来そうなものから改善や何やらしているので後回しになっているだけです.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アイデア, アクセス, お待ち, こと, ごろ, サイト, そう, テコ入れ, デザイン, もの, よう, 一番, 使用, 先日, 動画, 収益, 回転, 存在, 対応, 対策, 後回し, 改善, 明日, 本腰, 検索, 構築, 殆ど, 気長, 現在, 祭り, 稼ぎ, 管理, 簡素, 自分, 表示, 表面, 試み,

金高堂の決済方法(支払い方法)がHPに記載されていないので困って調べました.

2025.06.24

Logging

おはようございます.よく行く本屋さんに金高堂の山田店や朝倉店などがあるのだけども金高堂店のHPがシンプル過ぎてちょっと困っています.お店の地図や電話番号があるのは有り難いのだけども.決済方法が記載されていないのは、ちょっと困っています.

ニコニコ現金でお支払いが多いかとは思うものの、コロナ以降、高知県でも電子マネーなどで決済する方が増えてきている気がしています.

そんな中で一度、Xで決済方法を聞いた事があります、それ以降に決済方法が増えていたら申し訳ないけども金高堂へ行く皆さんが恐らく知りたい情報の上位にある決済方法は何があるかを記載します.

金高堂本店はQRコード決済は、J-coin Pay、電子マネーはiD、QUICPay、Edyです、他の店舗もこちらは共通で使用可能かと思います.当然、現金決済はどの店舗でも出来ます.QRコード決済方法は良くわからない.図書カードやクオカードは使用できます👍️.

調べていくと金高堂工科大学店はちょっと違うのか、こちらが最新の情報で各店舗、共通の話なのか微妙ですが情報を記載します.

ともあれ、金高堂さんがHPを更新して頂いて決済方法も記載していただければ有り難いなと思いました.それほど難しい話ではない気がしますが・・・.自分としての追加要望はpaypay決済を追加して頂きたいです、何せ日本国内でシェア率No1ですからね.お店側からすると決済手数料が気になるところなのかもですが・・・.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

カード, クオカード, コード, こちら, コロナ, サン, シェア, シンプル, それ, ところ, マネー, 上位, 以降, 使用, 共通, 可能, 図書, 国内, 地図, 大学, 山田, 工科, 店舗, 微妙, 情報, 手数料, 支払い, 方法, 日本, 明日, 更新, 最新, 朝倉, 本屋, 本店, 決済, 現金, 申し訳, 番号, 皆さん, 自分, 要望, 記載, 追加, 金高, 電子, 電話, 高知,

Photo by Victor Dunn on Pexels.com

AIで記事を学習して新たな記事を生み出すにはお金が必要だと思っていたがそうでも.

2025.06.22

Logging

おはようございます.AIで記事を学習して新たな記事を生み出すにはお金が必要だと思っていたがそうでもなくローカルPCでそこら辺に落ちているLlamaモデルを持ってきてチューニングすれば何とかなるじゃねぇという思いに至った.

実はあなたの手元にあるPCと、そこら中に「落ちている」オープンソースのAIモデル、特にLlama 3があれば、十分記事が生成できるんです。


ローカルAI記事生成は、もはや夢物語じゃない

「AIで記事生成」と聞くと、SFのような世界や、大企業だけが使える特権のように感じるかもしれません。しかし、今は違います。オープンソースの強力な言語モデル、特にMetaが公開したLlama 3の登場は、この常識を大きく覆しました。

Llama 3は、その性能の高さにもかかわらず、誰でも無料で利用できるという点が最大の魅力です。さらに、80億パラメータの8Bモデルであれば、最新のゲーミングPCとまではいかなくとも、ある程度の性能を持つPCであれば十分に動作します。これにより、高額なクラウドサービスを利用せずとも、自分のPCでAI記事生成の環境を構築することが現実的になりました。


なぜLlama 3があなたのPCと相性抜群なのか?

Llama 3がローカルPCでの記事生成に適している理由はいくつかあります。

  • 完全無料のオープンソース: 利用に費用がかからないため、予算を気にせずAIを試したり、本格的に導入したりできます。
  • 選べるモデルサイズ: Llama 3には様々なサイズのモデルがあり、PCのスペックに合わせて選べます。特に8Bモデルは、個人利用に最適なバランスを持っています。
  • 活発な開発者コミュニティ: 世界中の開発者がLlama 3を使った新しいツールや効率的なチューニング方法を日々共有しています。困ったときには助けを借りられる心強い味方です。
  • 「量子化」でさらに軽量に: モデルのサイズを大幅に小さくする「量子化」という技術を使えば、より少ないメモリでLlama 3を動かせるようになります。これにより、より多くのPCで利用の道が開けます。

あなたのPCを「記事生成マシン」に変える秘訣

もちろん、いきなりプロのライター並みの記事をAIに書かせるのは難しいかもしれません。しかし、ちょっとした工夫で「何とかなる」レベルの記事生成は十分に可能です。

  1. 少量のデータでファインチューニング: 大量の記事データは不要です。あなたが書きたい記事のテーマやスタイルに合った、質の良い記事を数十〜数百程度集めてLlama 3を学習(ファインチューニング)させれば、その分野に特化した記事生成能力が格段に向上します。
  2. プロンプト(指示文)の工夫: AIへの「指示の出し方」は非常に重要です。具体的で明確なプロンプトを与えることで、チューニングが完璧でなくても、驚くほど質の高い記事が生成できます。これはまるで、優秀なアシスタントに的確な指示を出すようなものです。
  3. 効率的な学習方法の活用: 「LoRA(Low-Rank Adaptation)」のような効率的なファインチューニング手法を使えば、少ないGPUメモリでも短時間でモデルを特定のタスクに最適化できます。

あなたの創造性が、今、AIで加速する

かつては一部の専門家や企業にしか手の届かなかったAIによる記事生成が、今やあなたのPCで実現できる時代になりました。これはまさにAI技術の「民主化」です。

とまぁそういう訳なので何とかしてみますが、ファインチューニングにどれぐらい時間がかかるのかが未知数だったりする.

ファインチューニングPythonコード

以下のPythonコードは、Llama 3モデルをロードし、提供されたテキスト記事でファインチューニング(LoRA使用)を実行し、結果を保存します。 上記の入力値は、このコードに自動的に反映されます。 このコードをPythonファイル(例: `finetune_llama.py`)として保存し、実行してください。

import os
import torch
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training, TaskType

# GPUの利用可能性を確認
print("GPUが利用可能か確認中...")
if not torch.cuda.is_available():
    print("GPUが見つかりません。Fine-tuningにはGPUが強く推奨されます。")
    # GPUがない場合は、ここでスクリプトを終了するか、CPUモードで続行するか選択できます。
    # exit("GPUがないため終了します。")
else:
    print(f"GPUが利用可能です: {torch.cuda.get_device_name(0)}")

# --- 1. モデルとトークナイザーのロード ---
# Llama 3モデルのパスを指定します。Hugging Faceのモデル名(例: "meta-llama/Llama-3-8B")
# またはローカルにダウンロードしたモデルのパスを指定してください。
MODEL_NAME = "meta-llama/Llama-3-8B" # ユーザーが入力したパスがここに挿入されます

print(f"モデルとトークナイザーをロード中: {MODEL_NAME}")

# 4bit量子化設定 (GPUメモリの節約に役立ちます)
# bnb_4bit_compute_dtypeは、Ampere以降のNVIDIA GPUに推奨されるbfloat16を使用しています。
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4", # NF4 (NormalFloat4) 量子化タイプ
    bnb_4bit_compute_dtype=torch.bfloat16 
)

# トークナイザーをロード
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, trust_remote_code=True)
# Llama 3はデフォルトでbos_tokenを付与しないことがあるため、明示的に追加。
# また、padding_side='right'はLlamaモデルに推奨される設定です。
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

# モデルをロードし、量子化設定を適用し、自動的にGPUにマッピングします。
model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    quantization_config=bnb_config,
    device_map="auto", # 利用可能なデバイス(GPU)に自動的にモデルを分散
    trust_remote_code=True # リモートコードの実行を許可
)
print("モデルロード完了。")

# k-bit学習用にモデルを準備 (PEFTライブラリのため)
# gradient_checkpointingを有効にすることで、メモリ使用量をさらに削減できます。
model.gradient_checkpointing_enable()
model = prepare_model_for_kbit_training(model)
print("k-bit学習用にモデルを準備しました。")

# --- 2. データセットの準備 ---
# あなたのテキスト記事ファイルが格納されているディレクトリを指定します。
# 例: 'your_article_data/' の中に 'article1.txt', 'article2.txt', ... と置かれている場合
DATA_DIR = "./your_article_data/" # ユーザーが入力したパスがここに挿入されます

print(f"データセットをロード中: {DATA_DIR}")

# 'text'形式でデータセットをロードします。指定されたディレクトリ内のすべての.txtファイルを読み込みます。
# 各ファイルが1つのエントリとして扱われます。
try:
    dataset = load_dataset('text', data_files={'train': os.path.join(DATA_DIR, '*.txt')})
    print(f"データセットのサンプル数: {len(dataset['train'])}")
except Exception as e:
    print(f"データセットのロード中にエラーが発生しました。ディレクトリとファイル形式を確認してください: {e}")
    exit("データセットロード失敗。")

# データセットをトークン化する関数
# 長い記事をモデルの最大入力長に分割します。
def tokenize_function(examples):
    # Llama 3の最大入力長は通常8192ですが、お使いのGPUのVRAMに合わせて調整してください。
    # ここでは一般的な値として2048を設定しています。
    max_length = 2048 
    # truncate=Trueで最大長を超えるテキストを切り捨てます。
    return tokenizer(examples["text"], truncation=True, max_length=max_length)

# データセットをトークン化します。
# num_procはCPUコア数に応じて並列処理を行い、処理を高速化します。
tokenized_dataset = dataset.map(
    tokenize_function,
    batched=True,
    num_proc=os.cpu_count(),
    remove_columns=["text"] # 元のテキスト列は学習に不要になるため削除します。
)
print("データセットのトークン化が完了しました。")

# --- 3. PEFT (LoRA) の設定 ---
# LoRA (Low-Rank Adaptation) は、元のモデルの重みをフリーズし、
# 小さなアダプター層を追加して学習させることで、効率的にファインチューニングを行います。
# これにより、GPUメモリの使用量を抑えつつ、高い性能を実現できます。
lora_config = LoraConfig(
    r=16, # LoRAのランク。値を大きくすると表現力が増すが、メモリ消費も増える。
    lora_alpha=32, # LoRAのスケーリング係数。rの2倍程度が推奨されることが多いです。
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], # LoRAを適用する層。Llamaモデルで一般的な層。
    bias="none", # バイアスを学習しない設定。
    lora_dropout=0.05, # ドロップアウト率。過学習を防ぐために設定します。
    task_type=TaskType.CAUSAL_LM, # タスクタイプを因果言語モデルに設定。
)

# モデルにLoRAアダプターを追加します。
model = get_peft_model(model, lora_config)
print("モデルにLoRAアダプターを適用しました。")
model.print_trainable_parameters() # 学習可能なパラメータ数を確認します。

# --- 4. 学習の実行 ---
# 学習済みモデルを保存するディレクトリ
OUTPUT_DIR = "./llama3_finetuned_model/" # ユーザーが入力したパスがここに挿入されます

# 学習の設定
training_args = TrainingArguments(
    output_dir=OUTPUT_DIR,
    num_train_epochs=3, # エポック数。データセットのサイズと希望する精度に応じて調整してください。
    per_device_train_batch_size=1, # GPUあたりのバッチサイズ。VRAMが少ない場合は1に設定。
    gradient_accumulation_steps=4, # 勾配を蓄積するステップ数。実質的なバッチサイズは per_device_train_batch_size * gradient_accumulation_steps になります。
    optim="paged_adamw_8bit", # 8bit AdamWオプティマイザを使用し、メモリ効率を向上させます。
    save_steps=500, # 500ステップごとにモデルを保存します。
    logging_steps=100, # 100ステップごとにログを出力します。
    learning_rate=2e-4, # 学習率。
    fp16=True, # 混合精度学習を有効化 (GPUが対応している場合)。VRAM削減と高速化に寄与します。
    max_steps=-1, # num_train_epochsに基づいて学習します。
    group_by_length=True, # 同じ長さのシーケンスをグループ化し、パディングを削減します。
    lr_scheduler_type="cosine", # 学習率スケジューラーのタイプ。
    warmup_ratio=0.03, # ウォームアップ比率。
    report_to="none", # レポート先を指定しない (wandbなどを使用しない場合)。
)

# トレーナーの初期化
# data_collatorは、モデルの入力形式に合わせてデータを整形します。
trainer = Trainer(
    model=model,
    train_dataset=tokenized_dataset["train"],
    args=training_args,
    data_collator=lambda data: {
        'input_ids': torch.stack([f['input_ids'] for f in data]),
        'attention_mask': torch.stack([f['attention_mask'] for f in data]),
        'labels': torch.stack([f['input_ids'] for f in data]), # 因果言語モデルでは、入力自体がラベルとなります。
    },
)

# 学習の開始
print("Fine-tuningを開始します...")
trainer.train()
print("Fine-tuningが完了しました。")

# --- 5. 学習済みモデルの保存 ---
# LoRAアダプターのみを保存します。これにより、ファイルサイズが小さく、効率的に管理できます。
trainer.save_model(OUTPUT_DIR)
print(f"学習済みLoRAアダプターが '{OUTPUT_DIR}' に保存されました。")

# 保存したアダプターを使って推論を行う方法の例 (コメントアウトされています):
# このコードは、ファインチューニング後にモデルをロードして推論を行うための参考例です。
# from peft import PeftModel
#
# # 元のモデルをロード (学習時と同じ量子化設定を使用します)
# base_model = AutoModelForCausalLM.from_pretrained(
#     MODEL_NAME,
#     quantization_config=bnb_config,
#     device_map="auto",
#     trust_remote_code=True
# )
#
# # 保存したLoRAアダプターを元のモデルに結合します。
# peft_model = PeftModel.from_pretrained(base_model, OUTPUT_DIR)
#
# # 推論モードに設定します。
# peft_model.eval()
#
# # テキスト生成の例
# prompt = "ローカルPCでのLlama 3ファインチューニングの利点とは"
# inputs = tokenizer(prompt, return_tensors="pt").to("cuda") # 入力をGPUに移動
#
# with torch.no_grad(): # 勾配計算を無効化し、メモリ使用量を削減
#     outputs = peft_model.generate(
#         **inputs,
#         max_new_tokens=200, # 生成する新しいトークンの最大数
#         do_sample=True, # サンプリングによる生成を有効化
#         top_p=0.9, # Nucleusサンプリングの閾値
#         temperature=0.7, # 生成の多様性を制御する温度
#         eos_token_id=tokenizer.eos_token_id # 終了トークンID
#     )
# print("\n--- 生成されたテキスト ---")
# print(tokenizer.decode(outputs[0], skip_special_tokens=True))

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

```, ;;), )。, アウト, アシスタント, アダプター, あたり, アップ, あなた, いくつ, ウォーム, エポック, エラー, エントリ, オープン, オプティマイザ, お金, クラウドサービス, グループ, クン, ゲーミング, コード, コア, ここ, こと, コミュニティ, コメント, これ, サイズ, サンプリング, サンプル, シーケンス, スクリプト, スケーリング, スケジューラー, スタイル, ステップ, スペック, すべて, ソース, そこら, タイプ, ダウンロード, タスク, ため, チューニング, ツール, データ, データセット, テーマ, ディレクトリ, テキスト, デバイス, デフォルト, トー, トークナイザー, とき, どれ, トレーナー, ドロップ, バイアス, パス, バッチ, パディング, パラメータ, バランス, ファイル, ファイルサイズ, ファインチューニング, ファインチューニングコード, フリーズ, プロ, プロンプト, マシン, マッピング, メモリ, モード, モデル, もの, ユーザー, よう, ライター, ライブラリ, ラベル, ランク, リモート, レベル, レポート, ローカル, ロード, ログ, 一般, 一部, 上記, 不要, 世界, 世界中, 並み, 並列, 予算, 付与, 以下, 以降, 企業, 使い, 使用, 係数, 保存, 個人, 優秀, 入力, 公開, 共有, 具体, 処理, 出力, 分割, 分散, 分野, 初期, 利点, 利用, 制御, 削減, 削除, 創造, 加速, 助け, 効率, 動作, 勾配, 十分, 参考, 反映, 可能, 向上, 味方, 因果, 場合, 多様, 夢物語, 大幅, 大量, 失敗, 学習, 完了, 完全, 完璧, 実現, 実行, 実質, 寄与, 対応, 専門, 導入, 少量, 工夫, 希望, 常識, 強力, 形式, 必要, 思い, 性能, 手元, 手法, 技術, 抜群, 指定, 指示, 挿入, 推奨, 推論, 提供, 整形, 新た, 方法, 日々, 明日, 明確, 明示, 時代, 時間, 最大, 最新, 最適, 有効, 未知数, 本格, 格段, 格納, 構築, 様々, 比率, 民主, 活用, 活発, 消費, 混合, 済み, 温度, 準備, 無効, 無料, 特定, 特権, 現実, 理由, 環境, 生成, 発生, 登場, 的確, 相性, 短時間, 確認, 秘訣, 移動, 程度, 管理, 節約, 精度, 終了, 結合, 結果, 続行, 能力, 自体, 自分, 自動的, 蓄積, 表現, 言語, 計算, 記事, 設定, 許可, 調整, 費用, 軽量, 追加, 通常, 適用, 選択, 重み, 重要, 量子, 開始, 開発, 関数, 閾値, 非常, 高速, 高額, 魅力,

laravel sailで構築されたDockerコンテナのターミナルに入り新たなパッケージをインストールする方法.

2025.06.13

Logging

おはようございます.laravel sailで構築されたDockerコンテナのターミナルに入り新たなパッケージをインストールする方法は次の通りです.

①ターミナル上でbashと入力しエンターを行いルート権限にする.

bash

②OSのアップデートを行う

apt update

これらの手順を行うことで新たにパッケージをインストールすることが可能になります、覚えとくと便利ですよ.

あと、bash上で操作すると矢印キーなども使用可能になります.知っていると知らないとでは作業パフォーマンスが違うかなと思ったので記事に起こしてみました、ちょっとしたことだけども.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アップデート, あと, インストール, エンター, キー, こと, これら, こんてな, ターミナル, パッケージ, パフォーマンス, ルート, 作業, 使用, 便利, 入力, 可能, 手順, 操作, 新た, 方法, 明日, 構築, 権限, 矢印, 記事, 通り,

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

2025.06.10

Logging

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

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

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

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

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

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

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

アパッチサービス, エラー, こと, サーバ, サーバー, サービス, サイト, さくら, タブ, データ, もの, ユーザー, よう, ライブラリ, レンタル, 一環, 不明, 使用, 保存, 処理, 出力, 動作, 原因, 参考, 同時, 唯一, 変更, 多発, 形態素, 感じ, 接続, 文句, 文章, 方法, 日本語, 明日, 最後, 無二, 生成, 画面, 管理, 自動, 苦労, 解析, 起動, 送信, 通信, 限り, 頻繁,

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で応援を送る

タグ

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

にこスマでiphone se2 Aグレードを購入しました.ちなみにios18

2025.03.03

Logging

おはようございます.にこスマでiphone se2 Aグレードを購入しました、ちなみにios18に対応しています.対応していなかったら購入していない.もしios19が非対応になっても恐らくそれから7年ぐらいは使用可能だと思います.iphone se2は2020年に発売されたものになるらしい.

ちなみに今じぶんが使用しているiphoneはXSMaxなので2018年に発売されたものになります.次期iphone17は恐らくRAMも16よりは増量すると思います.なので人工知能の処理で欠かせないRAMが多くなったiphone17は買いどきかなと思っているのだけど型落ちのiphone16を購入する可能性はあります.

その理由はiphone17が大幅に一新したモデルなっていた場合、iphone16を買うという選択肢もあります.大幅に一新すると何かしら不具合や欠陥が発生する場合があるので、買うかどうか発売後に決めようと思います.

今回、にこスマで購入したiphone se2は想像通り見た目キレイで申し分ない感じでした、Aグレードで2万6千7百円は結構オトクな感じですね.これからどれぐらい使用できるか分からないけど当分持ちそうな印象です.

明日へ続く

著者名  @taoka_toshiaki

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

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

OFUSEで応援を送る

タグ

グレード, こスマ, じぶん, モデル, 万千百円, 人工知能, 使用, 処理, 印象, 可能性, 増量, , 想像通り見た目キレイ, 欠かせない, 欠陥, 次期, 理由, 発売後, 選択肢, 非対応,