GitHubのプロフィールにアニメーションを描く方法

この記事は、SYSKEN Advent Calendar 2024年12月22日の記事です。

はじめに

システム研究部のNotoです。

今年も残るところ80万秒程度となってきましたが皆様いかがお過ごしでしょうか?クリスマスが近づきイルミネーションが蔓延る昨今、研究室に落ちていたArduinoのテープライトでピカピカイルミネーションを作成したところ思いのほか愉快で楽しくなっている始末でございます。

常にゲーミングで面白さを探求している情報系高専生はGitHubのプロフィールもゴテゴテのピカピカになっているに違いません。そこで今回は、より楽しく愉快になるようGitHubのプロフィールにアニメーションを載せる方法を解説します。

作ったもの

GitHubプロフィールに動的なアニメーションを追加します。

  • GitHubのコントリビューション(活動記録)に合わせて波紋が広がるアニメーション
  • SVGを動的に生成して表示
  • 波紋の大きさはコントリビューション数に応じて変化
  • ランダムな位置に波紋が出現

完成品は以下のような感じです:

GitHub Contribution Animation

作り方

使用技術

  • Node.js
  • GitHub Actions
  • GitHub GraphQL API
  • SVG アニメーション

フォルダ構成

.
├── .github
│ └── workflows
│ └── animation.yml
├── script
│ └── generate-animation.js
├── package.json
└── README.md

ファイルの内容と役割

animation.yml

  • GitHub Actionsの設定ファイル
  • 24時間ごとにアニメーションを自動生成
  • GitHub Pagesへの自動デプロイを担当

generate-animation.js

  • アニメーションのSVGを生成するメインスクリプト
  • GitHub GraphQL APIを使用してコントリビューションデータを取得
  • 波紋アニメーションのSVGを生成

README.md

  • プロフィールページの表示内容
  • 生成したアニメーションの表示

手順

1. リポジトリの作成

  • ユーザー名と同じ名前のリポジトリを作成(例:username/username)
  • このリポジトリがGitHubプロフィールとして表示される

2. 必要なファイルの設置

  • 上記のフォルダ構成に従ってファイルを配置
  • package.jsonに必要な依存関係を追加

3. GitHub Actionsの設定

  • Personal Access Tokenの発行(repo権限必要)
  • リポジトリのSecretsにトークンを設定

4. GitHub Pagesの有効化

  • リポジトリの設定からGitHub Pagesを有効化
  • デプロイ元をgh-pagesブランチに設定

主要なコード

1. Rippleクラスの実装

class Ripple {
  constructor(x, y, contributionCount, duration, delay) {
    this.x = x;
    this.y = y;
    this.size = 20 + contributionCount * 3;  // コントリビューション数に応じてサイズを決定
    this.duration = duration;
    this.delay = delay;
    this.fillColor = "none";
    this.isMultiCircle = false;

    // ランダムに塗りつぶすかどうかを決定
    if(Math.floor(Math.random() * 2) > 0) {
        this.fillColor = "#4B9EF9";
    }

    // 大きな波紋の場合、複数の円を重ねる
    if (this.size >= 80 && this.fillColor === "none") {
      this.isMultiCircle = true;
    }
  }
}

2. GitHubのコントリビューションデータ取得

async function getContributions(username) {
  const query = `
    query($username: String!) {
      user(login: $username) {
        contributionsCollection {
          contributionCalendar {
            totalContributions
            weeks {
              contributionDays {
                contributionCount
                date
              }
            }
          }
        }
      }
    }
  `;

  const response = await graphqlWithAuth(query, { username });
  return response.user.contributionsCollection.contributionCalendar;
}

3. アニメーションの生成ロジック

async function generateAnimation() {
  const username = process.env.GITHUB_REPOSITORY.split('/')[0];
  const contributionData = await getContributions(username);
  const width = 800;
  const height = 400;
  const duration = 2; // 波紋が広がるまでの時間(秒)
  let delay = 0;

  // コントリビューションがある日のみ波紋を生成
  const ripples = contributionData.weeks.flatMap((week) =>
    week.contributionDays.filter(day => day.contributionCount > 0)
      .map((day) => {
        const { x, y } = getRandomPosition(width, height);
        delay += Math.random() * 0.3;  // 波紋の出現タイミングをずらす
        return new Ripple(x, y, day.contributionCount, duration, delay);
      })
  );

  // SVGの生成
  const rippleSVGs = ripples.map(ripple => ripple.toSVG()).join('');

  const svg = `
    <svg 
      viewBox="0 0 ${width} ${height}" 
      xmlns="http://www.w3.org/2000/svg"
      style="background: #0D1117">
      <rect width="100%" height="100%" fill="#0D1117"></rect>
      <g>${rippleSVGs}</g>
    </svg>
  `;
}

4. SVGアニメーションの実装

toSVG() {
  return `
    <circle
      cx="${this.x}"
      cy="${this.y}"
      r="0"
      fill="${this.fillColor}"
      stroke="#4B9EF9"
      stroke-width="1"
      opacity="0.8">
      <animate
        attributeName="r"
        begin="${this.delay}s"
        from="0"
        to="${this.size}"
        dur="${this.duration}s"
        fill="freeze"
        values="0; ${this.size}"
        keyTimes="0; 1" 
        keySplines="0 0.8 0.5 1"
        calcMode="spline"></animate>
      <animate
        attributeName="opacity"
        begin="${this.delay}s"
        from="0.8"
        to="0.2"
        dur="${this.duration}s"
        fill="freeze"></animate>
    </circle>
  `;
}

5. GitHub Actionsの設定詳細

name: Generate GitHub Animation
on:
  schedule:
    - cron: "0 */24 * * *"  # 24時間ごとに実行
  workflow_dispatch:  # 手動実行も可能
  push:
    branches:
      - main  # mainブランチへのプッシュでも実行

jobs:
  generate:
    permissions:
      contents: write  # リポジトリへの書き込み権限
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'
      - name: Install dependencies
        run: npm install
      - name: Create Animation
        run: |
          mkdir -p dist
          npm run generate
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

これらのコードが組み合わさることで、GitHubの活動状況に基づいた動的なアニメーションが生成され、自動的にプロフィールページに反映する事ができるようになります。

おわりに

GitHubプロフィールをアニメーションで彩ることで、より魅力的な自己表現が可能になります。このような動的な要素を加えることで、プロフィールページが単なる情報の羅列ではなく、見る人の興味を引く展示になる事でしょう。

SVGアニメーションについては、より自分らしく楽しいものを作成しましょう!皆様も、ぜひ自分なりのアニメーションを作ってGitHubプロフィールを華やかにしてみてはいかがでしょうか。

参考資料

QWERTY何それおいしいの?

この記事は、SYSKEN Advent Calendar 2023年12月22日の記事です。

やっほー!システム研究部の部長を務めています、Notoです。
最近は後輩たちの目覚ましい成長と日々のしかかってくるタスクに押しつぶされそうになっています。

今年も、クリスマスが近づいてまいりましたが皆さん予定はございますでしょうか。ファンキーでロックで毎日が充実している高専生諸君は、さぞ楽しい予定が入っていることでしょう。私は、クリスマスが楽しみすぎて夜も眠れないので、コーヒーを片手に看板を横に流していく作業をしております。

今年はいったい何を書こうか迷ったのですが、やはり情報系高専生たるもの作業効率を極限まで良くしたいといつも考えているはずなので、少しでもレポートの生成とコーディング作業が高速になるようキーボードの配列について書いていこうと思います。

目次

  1. みんなキーボード何使ってる?
  2. 意外とたくさんあるキー配列
  3. カスタマイズしよう!
  4. おしまいに

みんなキーボード何使ってる?

皆様は、キーボード何を使っていますか。
ノートパソコンであれば備え付けのものだったり、ぴかぴか光る自宅イルミネーションでおなじみのゲーミングキーボードだったり、プログラマーご用達のHHKBだったり、キーボードにはたくさんの選択肢があるでしょう。

しかし、皆様方のキーボードにはある共通点があります。それはキー配列です。おそらく、おおくの人は以下のようなキー配列のキーボードを使用しているのではないでしょうか。

qwerty配列

心当たりのある人は正直に手を挙げてください。先生は決して怒ったりしません。画像のようなキー配列のことをQWERTY配列と呼びます。このキー配列は、世界で一番使用されディファクトスタンダードとなっています。

しかし、皆さん一度は、一度くらいは「この並び使いにくくない?」と思ったことはないでしょうか。レポートを生成しているときに明らかに片方の手に負担がかかっていると感じたことでしょう!!!!!!

そんな、あなたにおすすめ!!!!キー配列を変えてみましょう!!!!!!!!!!!!!!!!!!!

意外とたくさんあるキー配列

さて、QWERTY配列に飽き飽きしてしまったあなたに朗報です!キーボードの世界にはまだまだ知られざる多彩なキー配列が存在します。その中でも、一風変わった配列を取り入れることで、作業効率が向上する可能性があります。

例えば、Dvorak Simplified Keyboardは、タイピング時に頻繁に使用される文字を中心に配置を最適化したものです。これにより、指の動きが減少し、タイピングのストレスが軽減されます。また、ColemakWorkmanなども、QWERTYに比べて指の動きが効率的なキー配置を提供しています。

これらの配列は最初は慣れるまでが大変かもしれませんが、慣れれば従来のキー配置よりも迅速かつ楽にタイピングできるようになるでしょう。

配列を変えると、学校のキーボードを使えなくなって困っちゃうっ、という人もいることでしょう。しかし、心配ご無用。最初は、確かにごちゃごちゃになって使いにくくしまいます。でも、慣れてくると問題なくどちらの配列でもタイピングできるようになるので、ぜひ、新しい配列に変えていきましょう。

カスタマイズしよう!

キー配列を変更する方法はいくつかありますが、まずはソフトウェアを活用して変更することが簡単です。WindowsやmacOSでは、設定画面や専用のツールを使用して配列を切り替えることができます。また、一部のゲーミングキーボードでは専用のソフトウェアを使用してキーの機能を変更できるため、自分好みの配置に調整できます。

Windowsであれば、Autohotkeyというフリーソフトを使えば自由に配列を変えることが出来るようになります。

さらに、もし本格的にキー配列を変更したい場合は、新しい物理キーボードを購入することも考えてみましょう。多くの配列が選択肢として存在し、自分の作業スタイルに合ったものを見つけることができます。

トラックボール付きの分離型キーボードへの一歩

最終的な提案として、タイピングとマウス操作を一体化させる画期的なデバイスがあります。それは「トラックボール付きの分離型キーボード」です。これは、キーボードとマウスが分離されており、キーボードの一部にトラックボールが搭載されています。指先の微調整でカーソルを動かすことができ、マウスを使わなくても操作が可能です。

このデバイスを使用することで、キーボードとマウスの切り替えやデスク上のスペースを有効活用でき、作業効率が向上します。是非一度試してみてください!

つくりかけのキーボード
↑つくりかけのキーボード

おしまいに

キーボードの選択肢は多岐にわたり、自分に合ったものを見つけることで日常の作業がより快適になります。新しいキー配列や革新的なデバイスを導入することで、これまでにない快適なタイピング体験が得られるかもしれません。

最近、部室で後輩に「キーボードに刻印っていらなくない?」という話をしたら、誰の同意も得られず悲しい思いをしてしまいました。
是非、キーボードの配列を変えて刻印がある意味をなくしていきましょう。それでは、良いクリスマスを!

やっぱり、ChatGPTって便利ですね。

参考文献

Shirogane Lab
【脱QWERTY配列】Tomisuke配列に移行し、QWERTY配列を卒業せよ
QWERTY配列

Meta Quest 2でつよつよになる

この記事は、SYSKEN Advent Calendar 2022 12月2日の記事です。

はじめに

皆さん、おはようございます。規則正しい生活をしている皆々様は朝早くにこの記事を読んでいると思います。もちろん私も朝4時には目が覚めています。

今年もついにAdvent Calendarの季節がやってまいりました。通称地獄へのカウントダウンです。24日25日になるといたるところで爆発が起こると思われるので外出の際は防弾チョッキやヘルメット、戦車、機関銃、手榴弾などを忘れないようにしましょう。

今回の記事ではProcon33の企業賞でいただいたMeta Quest 2で遊んだよ。という話をしようと思います。

ちなみにこの記事の半分はMeta Quest 2を装着して執筆しています。

Meta Quest 2って何?

Meta Quest 2(Oculus Quest 2)とは

Meta Quest 2メタ クエストツー)は、Meta(旧称Facebook)の一部門「Facebook Technologies」が開発したOculus Questの後継となるバーチャル・リアリティヘッドセット

-Meta Quest 2 – Wikipedia

だそうです。いわゆるVRヘッドセットというものですね。5~6万円します。

バーチャル空間でゲームをしたり映画を見たりといろいろなことができます。ゲームでいうとBeat Saberが有名です。

気になる人はおすきなブラウザで「Meta Quest 2ってなーに」と調べてみましょう。

(この先Meta Quest 2をQuest2と記載します。)

君は一体何をしていたんだ?

Q.部室に出現するQuest2を被っている人はいったい何をしているのでしょうか?

A.つよつよになっています。

Quest2を使用すると自分だけの空間を獲得し仮想空間にいろいろなものを配置することができます。

また”手”で操作することができます。

例えば

  • ディスプレイを複数置いてつよつよになる
  • 自分だけの空間を用意してつよつよになる
  • 手で操作することでつよつよになる などなど

分かりやすく言えば

なんかかっこいい状態

に浸ることができます。

アニメにたまにいるパソコンつよつよの人になったような気がしてくるので非常にモチベーションが上がります。最近は某アニメのロリがVRゴーグルを被り仮想空間を水泳していました。

さらにパソコンと連携することでパソコンの操作をQuest2上で行うことができるようになります。

Quest2には周囲を表示する機能もあるので安全です。

またスマホと連携することで外の様子をリアルタイムにクリアに把握することができます。

つよつよですね。

しかし、デメリットも存在します

  • VRゴーグルの重量が顔にかかるので非常に顔が痛い
  • 近距離で画面を見ている状態なので目が疲れる
  • 慣れるまで操作が非常に難しい などなど

これらのデメリットを吹き飛ばすほどつよつよで楽しいので問題はないです。

おわりに

この記事の内容を要約すると

  • Quest2を利用するとつよつよになれるよ

ということです。

Quest2ではほかにもゲームをしたり映像を楽しんだりと様々な楽しみ方があります。体を動かして遊ぶこともできるので運動にもなります。全高専生はVRゴーグルを購入してつよつよになりましょう。

戒め:決して試験期間中に遊ばない。

次回のSYSKEN Advent Calendar 2022は12月4日、担当はriver Kです。お楽しみに。

魔法使いになる方法(その1)

この記事はSYSKEN Advent Calendar 2021の21日の記事です。

皆様、おはようございます。Notoです。12月も終わりに近づいてきてもうすぐクリスマスがやってきます。皆様はもちろん予定が入っていると思います。私は寮生なので帰省しなければならず予定を入れることができません。お誘いがないとかではないです。本当ですよ。非常に残念ですがどうしようもないですね。はい。

ということで今回は魔法使いになる方法(その1)を書こうと思います。題名には「魔法使いになろう」と書いてありますが魔法は使いません。エフェクトを作るのが面倒くさいです。なお、(その2)を書く予定はありませんのであしからずご了承ください。

目次

  1. 魔法の使い方
  2. 実際に作ってみよう
  3. 感想

どうやって使うのか

いつものごとくBlenderを使用します。つい最近3.0にアップデートされていろいろな機能が追加されましたがそんなもの使いません。なぜって?使い方が分からないからだよ。

今回はVFXという技術を使っていこうと思います。VFXとは「視覚効果を意味する英語の略で、映像作品において、現実には見ることのできない画面効果を実現するための技術のことを指す。」(wiki参照)というものだそうです。とても分かりやすい説明です。Blenderではとても簡単にVFX作品を作ることができます。この記事ではVFX作品の作り方を説明していきます。

実際に作ってみよう

  1. 素材を生成
  2. トラッキング
  3. CGの配置

の順番で作っていきたいと思います。

1、素材を生成

まずは、素材を生成していきましょう。今回は簡単なものをつくるので素材を少し工夫します。まず、紙を用意しましょう。そこに点を6~9つほど書きます。それを、動画に撮ります。これで素材の完成です。

2、トラッキング

次に、生成した素材をBlenderに移します。Blenderを開いたら最初にテンプレートを選択できる画面が出てくるはずです。その中にある「VFX」を選んでください。そしてドラック&ドロップ又は開くから動画を読み込ませます。動画を読み込むことができたら一度再生します。

そうしたら、トラッキングをしていきます。Ctrl+左クリックでマーカーを設置することができます。動画の最初のフレームに映っている点一つ一つにマーカーを打ってみましょう。設置することができたらAで全選択してトラッキングします。

何もエラーが出なければ成功です。エラーが出たらGoogle先生に聞いてみましょう。

メインが終わったのであと少しです。横にあるメニューの解析のタブを選択します。マーカーを3つ選んで「床」というボタンを押します。そして、その少し下にある「背景として設定」「トラッキングシーン設定」を押すことで右上の画面にオブジェクトが配置されるはずです。これで完成したも同然です。

3,CGの配置

ここからは各自の自由です。適当にモデルを設置するもよし、アニメーションを作るもよしです。好きなようにしましょう。できたら動画に書き出します。

完成です。

感想

今回は簡単なVFX作品の作り方を紹介しました。これを応用すれば、かめはめ波を撃ったり、火の玉を出したり、変身したりすることだってできます。胸の中にひそめている中二病を存分に発揮していきましょう。注意点としてVFXはとてもメモリを食うので性能の高いパソコンでないと快適に制作を進めることができません。何度も落ちる羽目になるので気をつけましょう。Google先生に「Blender vfx」と聞いてみるとたくさんの情報を獲得できるので活用していきましょう。以上。

次回はmakura先輩です。お楽しみに!!!!!!!!

スプーンを創造してみよう。

この記事は、SYSKEN Advent Calendar 2021 7日目の記事です。

おはようございます、Notoです。12月某日部長先輩から「君たちAdvent Calenderをかかないか」と遅ればせながらお達しがあり少しは部活っぽいことしないとと思い筆を執った次第です。題名にはスプーンの創造と書いてありますがもちろん金属からではなくBlenderという3DCGソフトフェアを使い作っていきます。対戦よろしくお願いします。

目次

  1. Blenderとは?
  2. スプーンを作ってみる
  3. 最後に

1、Blenderとは?

さあ、みなさんBlenderというソフトを知っていますか。インターネットをかじっている高専生諸君は一度ぐらいは聞いたことがあるのでしょう。Blenderは完全無料で使えるオープンソースの総合3DCGソフトフェアです。3DCGはもちろんのこと動画編集やVFX、お絵かきなどいろいろなことができます。すべての機能を完全に網羅することは不可能といわれるほどたくさんの機能を持っています。この記事ではBlenderを使い簡単でそれっぽい割と完成度の高いスプーンを作っていきます。完成図としてはアイキャッチ画像のようなものができる予定です。

2、スプーンを作ってみよう

1、形を作る

まずは簡単に形を作ってみましょう。ベースはUV球を使います。UV球を生成して編集モードに移行。そのあとに上半分を消します。これですくう部分ができましたね。

次に持つ部分を作ってみましょう。真ん中の辺を二つ選択してEキーで押し出しましょう。スプーンの持ち手は途中で折れ曲がっているのでしっかり折り曲げていきましょう。これでもうスプーンはできたも同然です。

少し形を整えていきましょう。実際のスプーンを見ながら直していくとわかりやすいです。すくう部分の先端を長くして、そこを少し浅くします。そのあとに折れ曲がっているところを細くします。もうこれはスプーンです。

ここでモデファイヤーを使います。ソリッド化でスプーンに厚みをつけていきます。適当にこんなものかなーって感じで厚みをつけてそのあとにサブディビジョンサーフェースを使い滑らかにします。これで形は完成です。

2、色を付けよう。

色というか質感をつけていきます。マテリアルについてはGoogleを参照しましょう。その方が分かりやすくたくさんの情報が出てきてくれることでしょう。説明が面倒くさくなってきたわけではありません。

あとは地面を作って、世界を貼って、カメラを設置してそれっぽくすれば完成です。レンダリングして観賞しましょう。やったね!

3、最後に

ここまでBlenderでスプーンを創造する方法を書いてきました。いかがだったでしょうか。授業の休み時間に作ったのでスプーンがとても雑なことになっています。持ち手の部分が短すぎますね。まあ、ご愛嬌ということで。これをきっかけに「Blender触ってみたいなぁ」と思ってもらえれば幸いです。「Blender tutorial」と調べるとたくさんの資料が出てくるので作ってみると楽しいのではないでしょうか。では、また会う日まで。アデュー。

次の担当はtamuaki先輩です。楽しみに待ちましょう。