[金曜日]
Githubでのユーザープロファイルアクティビティのスケジュールを常に作成したかったのです。 たとえば、52×7平方ピクセル(年52週×年7日)のサイズ制限があるにもかかわらず、1年でこのグラフが何らかの画像になるように、毎日コミットをレイアウトします。
問題は、プロセスを完全に自動化しても、それでも1年待つことでした。 そして、Githubのドキュメントを読んで、タスクが一度に簡単に、そしてさらに解決されることに気付きました。 したがって、遅滞なくそれを行う必要があります。 通常、プロジェクトの名前を思い付くのは難しいですが、ここではそれだけで生まれました。 カイは氷でペイントされ、 ゲルダはコミットで描画します!
仕組み
クライアントが提供するコミットのローカル日付を考慮に入れて、アクティビティスケジュールを作成するときに既存の(意図的?)Githubの動作を使用します。 このトピックの詳細については、 サービスのヘルプをご覧ください。
また、Githubはコミットで指定されたローカル日付を信頼するため、任意の日付で任意の数のコミットを送信できます。
echo " , +3!" >> gerda.md git add gerda.md git commit -m " " --date="0001-01-01T00:00:00+0300"
したがって、私たちのタスクは、正しい日付でコミットを作成するプロセスを自動化することです。 簡単に言えば、必要なコミットを作成するスクリプトを生成するスクリプトを作成する必要があります。 途中で、プロファイルチャートでは週の最初の日が月曜日ではなく日曜日であることを忘れないでください。
スクリプトには、文字列の配列や一般的な実際の画像ファイルなど、多少なりとも人間が読める形式で画像をフィードするのが最適です。 解析を簡単にするために、行を作成しました。 Githubでは、5つの異なる色の濃淡がグラフに表示され、濃いほど、特定の日のユーザーのアクティビティが大きくなります。 例として3つ挙げます。
- スペース␣-日陰なし-特定の日にアクティビティなし、
- アスタリスク* -薄い色-特定の日の平均アクティビティ、
- グリル# -暗い色合い-特定の日に多くのアクティビティ。
たとえば、「HELLO」という単語を作成します(「スムーズ」なトランジションのアンチエイリアスとしてアスタリスクを使用します)。
$commits = [ /* columns ' 10→| 20→| 30→| 40→| 50→| ' ← exactly 52 characters */ ' ####### #####* # # ##### ###### ####### ', // Sun ' # # # # # ## # # # # ', // Mon ' # # # # # # # # * # # ', // Tue ' # # #####* # # # ##### ##### # ', // Wed ' # # # # # # # # # # ', // Thu ' # # # ## # # # # # ', // Fri ' # # # # # #####* ###### # ', // Sat ];
現在のアクティビティによる干渉が少なくなるように、左右に数週間(スペース)残しておくことをお勧めします。
今最も難しいのは、この配列を解析して、その中の各文字を特定の日と関連付けることです。 次のようになりました。
/** * . * * @param string[] $map 7 52 * @param \DateTime $firstSunday * @return array */ function generateCommits($map, $firstSunday) { $commits = []; $count = 7 * 52; $date = clone $firstSunday; // , for ($day = 0, $weekDay = 0; $day < $count; $day++) { $week = intval($day / 7); $char = substr($map[$weekDay], $week, 1); if ($char !== ' ') { $commits[$date->format('Ym-d')] = $char === '#' ? 20 : 10; } // $date->add(new DateInterval('P1D')); $weekDay = ($weekDay + 1) % 7; } return $commits; }
結果として、キーは曜日であり、値はその日に必要なコミットの数である連想配列(辞書)を取得します。
$commits = [ // ... '2016-01-31' => 10, '2016-02-01' => 20, '2016-02-02' => 20, '2016-02-03' => 10, // ... ]
その後、すべてが非常に簡単です。この辞書を調べて、結果のシェルスクリプトに必要な数の毎日のコミットを書き込みます(タイムゾーンにはモスクワの時間を使用しました)。 実験ファイルとして、マークダウンドキュメントを使用します。そのテキストには、コミットごとに1日またはその他の情報を追加します(その日のコミット数を示す箇条書きリストがあります)。
git init echo "# Gerda" > gerda.md echo "\n## 2016-01-31" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-01-31T12:00:00+0300" # ... 10 ... echo "\n## 2016-02-01" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-02-01T12:00:00+0300" # ... 20 ... echo "\n## 2016-02-02" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-02-02T12:00:00+0300" # ... 20 ... echo "\n## 2016-02-03" >> gerda.md echo "* Gerda №1" >> gerda.md git add gerda.md git commit -m "Gerda №1" --date="2016-02-03T12:00:00+0300" # ... 10 ...
プログラミングロジックが完了しました。 必要なすべての設定を1つのsettings.php
ファイルに入れて、データをロジックから分離します。
// Streak graph picture $commits = [ ... ]; // Repository origin $origin = 'https://github.com/maximal/gerda.git'; // Output shell file $commandFile = 'repo' . DIRECTORY_SEPARATOR . 'make-commits.sh';
もちろん、Githubがどのユーザーからコミットが行われたかを理解するには、ログインとメールボックスがGita設定にある必要があります。
# ~/.gitconfig [user] name = my_github_username email = my_github_email@ya.ru ### ...
必要な活動スケジュールを考えます。 設定に目的の画像を書き込みます。 起こったことを実行する:
ああ、金曜日は52文字の制限のために喜びから飛び出しました。 正解:
コミット付きのスクリプトが作成されました。実行します:
cd repo ./make-commits.sh
スクリプトの最後に(原則として、数千のコミットがあります。1分待つ必要があります)、Githubはパスワードを要求します。 他の人の(そして時にはあなた自身の)スクリプトにパスワードを入力するのはクールではないので、必要に応じてこのステップでスクリプトを終了し、それを自分で実行できます(生成されたスクリプトでは、正直、正直、 git push
コマンドのみ):
git remote add origin https://github.com/<MY>/<REPO>.git git push -u origin master -f
数分待っています(このデータがGithubによってキャッシュされていると仮定するのは合理的です)。プロファイルページを更新しています。
できた
参照資料
すべてのソースコードとその説明は(サプライズ!)Githubにあります: https : //github.com/sijeko/gerda
プルクエストがあります-光に行きます。
私のプロフィールの例の活動のライブ写真: https : //github.com/maximal
短所
プログラムがどのように知らないのか、改善できるもの:
- このスクリプトでは、既存のgithubアクティビティを考慮していないため、現在の雇用が密集しているため、
ほとんどの場合、機能しないか、せいぜいぼやけているだけです。 - すべての「アクティビティ」は、1つのリポジトリと1つのファイルに集中して取得されます。
したがって、目標が最大のステルスである場合、このスクリプトはオプションではありません。 - 画像を再描画する必要がある場合は、Githubで最初にリポジトリを削除する必要があります
そして、同じ名前で新しいものを作成することはあまり便利ではありません。 - プログラムは色の3つのグラデーションを認識し、Githubは5つを表示します-改善することができます。
- 固定タイムゾーン(+3:モスクワ時間)-構成可能にすることができます。
- コミットには、Gita構成のデフォルトのユーザーが使用されます-設定で変更可能にすることができます。