@Blog{zip358.com}
日常日誌からプログラムやYOUTUBER紹介、旅日記まで日々更新中です。

クラシックAPIを使用してGitHub APIから草データを取得.
2025.03.12
おはようございます.クラシック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
タグ
```, $代, から草データ, クラシック, コード, コントリビューション数, コンフィグファイル, セル描画, ソースコード, 出力, 命名, 四角形, 変数, 少人数, 手直し, 描画, 未だ, 生成, 配列,

中古のiPhone se2を購入.買う予定はなかったんですが急遽.
2025.03.02
おはようございます.先日、中古のiPhone se2を購入.買う予定はなかったんですが急遽購入しました.理由はご想像にお任せします、iPhone se2は親用です.自分はiphone17の発売後、数カ月後に購入予定です.その頃にはアイフォン貯金が溜まっている頃になるので.
今回のことで人生自分の思っていた通りにはならないなって思います.どんなに準備していても上手くいかないこともあるし、自分だけで生きているわけでもないので予定通りにはいかない.幼い子どもがいると予定通りにはいかないという事があるらしいけども何かそうなんだなぁって思いました.
お給与がアップしないかなぁ.無いよりある方が良いということ、貯金ばかりしていて余裕資金があまりにも無いのでたまには「ぱぁーっと」使いたいなって思いますが行く行くのことを考えるとそんなに散財することも出来ないなぁって思います.20代の時は給料全額使っていた時もありあの頃はある意味、馬鹿でしたが今よりも楽しんでいた気がします.
明日へ続く
著者名
@taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$代, アイフォン貯金, お給与, ご想像, 中古, 予定, 予定通り, 人生自分, 余裕資金, 幼い子ども, 意味, 数カ月後, 気, 理由, 発売後, 給料全額, 親用, 貯金, 購入予定, 通り,

映画、歩いても歩いてもを観ました.
2025.01.10
おはようございます.映画、歩いても歩いてもを観ましたので感想を残しときます.この映画、家族や人を凄く丁寧に描いている.観終わった後に考えさせられる映画でした.ストーリーに浮き沈みというものは無く何処か映画、東京家族(山田洋次監督)にているものを感じました.
これは20代とかで観ると何も響かなったかもしれないけど、いまの年代で観るといろいろと思う所がある.この映画を70代で観たらまた違った捉え方が出来るのかも知れないと思いますね.
是枝裕和監督はこういう映画を撮るのがとても上手だなって感じました.人をとても見ていないとこういう映画は撮れないかと思います.今見れて本当に良かったです.
因みにこの映画はネトフリでもアマプラでも見れます.
明日へ続く
著者名
@taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$代, アマプラ, ストーリー, ネトフリ, 人, 何処か映画, 家族, 山田洋次監督, 年代, 感想, 所, 捉え方, 映画, 是枝裕和監督, 東京家族, 浮き沈み, 観,

40歳でパーカー着てるおじさんっておかしいのか?.えっ!?該当😅
2024.12.08
おはようございます.40歳でパーカー着てるおじさんっておかしいという記事が盛り上がっているので緊急で記事を書きましたw.自分は毎日パーカーを来ているおじさんに該当します、そもそもエンジニアはパーカー着ている率高いですw.

「40代だからこういう格好をしなさい」や「40代だからこうあるべき」とか時代錯誤な気がします.
自分が知っている中ではカルビー元社長?さん、80代か70代の社長さんがパーカー着ていましたよという具合にもう高齢だからこういう格好をしているとかいう時代は10年か20年前に終わっている気がします.
もっというと流行はあるとは思いますが、これからの時代は自分が着たい服を着る時代なんじゃないかなと思います.
明日へ続く
著者名
@taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$代, エンジニア, おじさん, カルビー元社長, パーカー, 代か代, 具合, 年か年前, 時代, 時代錯誤, 服, 格好, 歳, 気, 流行, 率, 社長さん, 自分, 記事, 高齢,

Bladeのinjectという物を使えば独自関数を呼び出せる。#laravel
2023.02.01
おはようございます、週に一個は技術ネタを入れようかなと思っている中の人です。
今回はタイトル通りのお話になります。bladeで独自関数を使用したいなと思ったことはありませんか。そういう時に重宝するのはinjectだというお話になります。使い方は下記の方法で可能です。
@inject('代入される任意の変数名', 'namespaceを含むクラス名')
{{ $代入される任意の変数名->呼び出すメソッド名() }}
これを知ったのは次のサイトになります。因みにbladeとはLaravelで使用できるテンプレートエンジンになります。いうなれば昔、流行ったSmartyという物と同じ位置づけですね。
因みに、この記事はあまりSEOを意識していませんので検索にヒットしないかも知れませんので、是非ともシェアして頂けると有難いです😄。
余談なんですかもう一つ、bladeでHTMLを含む文字を変数に代入するとそのまま表示されてしまいますよね、それをHTMLコードとして認識させたい場合は下記のようにすることでHTMLコードとして認識されます。
{!! 任意の変数名 !!}
追伸、こちらの方が手っ取り早いような気がします.
{{ app()->call('App\Http\Controllers\TestController@test') }}
{{app()->call('App\Http\Controllers\QiitaController@aiueo',['a'=>'test'])}}
著者名
@taoka_toshiaki
※この記事は著者が40代前半に書いたものです.
Profile
高知県在住の@taoka_toshiakiです、記事を読んで頂きありがとうございます.
数十年前から息を吸うように日々記事を書いてます.たまに休んだりする日もありますがほぼ毎日投稿を心掛けています😅.
SNSも使っています、フォロー、いいね、シェア宜しくお願い致します🙇.
SNS::@taoka_toshiaki
タグ
$代, App, AppHttpControllersQiitaController@aiueo', AppHttpControllersTestController@test, blade, call, gt, html, inject, Laravel, namespace, SEO, Smarty, テンプレートエンジン, メソッド名, 余談, 変数, 変数名, 追伸, 関数,