update.イラスト担当:嫁イッヌハブはつくれる?さて、なんだかQiita運営から「内容がないよう」「なので明日夕方には利用規約に基づいて削除しますぞ」と言われてしまいました。良い勉強の機会なので、もしもこういうGitHubっぽいサービス(GitHubクローン)を作るとしたらどうやるのかな?というのをサクッと考えてデモを作ってみようと思います。既存のGitHubクローンの実装いぬ用に限らない汎用的なGitHubクローンは、既にいろいろな言語で出ています。(Go実装)いずれもオープンソースなので、少し実装を参考にしてみましょう。Gitリポジトリーへのアクセス方法の違いこれらGitHubクローンは、どうやってGitリポジトリーのデータをパースしているのでしょうか。大きく2つの方式に分かれるようです。実行環境のgitコマンドを実行して、得られた出力をパースする(つまりgitコマンドのラッパー)GitLabGitLab自作のgitlab_gitというライブラリーを利用しています。GitonomyGitnomy自作のgitlibというライブラリーを利用しています。GogsGogs自作のgit-moduleというライブラリーを利用しています。JavaなGit実装ライブラリーを利用しています。どっちかいうと、私はJGitのようにgitコマンドに依存しない実装の方が好きですね。gitコマンドのラッパーを使う方式だと、運用中にコマンドとラッパーのバージョン不整合が起こりやすそうで心配というのもあるのですが、gitコマンドをexecして別プロセスで動いてしまったものを間違いなく扱う自信があまり無い、というのも強いです。いえ、いずれも利用実績の多いライブラリーです。言語を問わずに自分のコードからGitリポジトリーにアクセスできるというのは、クローンサービスを作るうえでは非常に心強いですね。gitlibで挑戦してみようと思います。gitlibを使ってGitリポジトリーにアクセスしてみる試しに、Gitリポジトリーの中の各コミットの情報を取得して、Webブラウザー上で表示できるかやってみましょう。gitlibのリファレンスマニュアルを見ながらやっていきます。次のような、いぬたちが作り始めたGitリポジトリーがあったとします。masterブランチ1本だけで、コミットも2回だけです。(GitのコミットメッセージにはUnicode絵文字が使えますから、きっと犬の文字3種がよく使われるでしょう)これに、gitlibでアクセスしてみます。オブジェクトをiterableっぽく取得することも可能なのですが、どうも良い感じのコードが書けませんでした。オブジェクトからCommitオブジェクトの配列を取得してみます。何やら取得できますね~コミット日付がなんだかずれちゃうのは謎ですが...ともかく、Gitリポジトリーの内容をWebアプリから参照できるようになりました。アミッコ履歴表示の実装サンプル実装がほどほどにできましたので、ちょっとだけイッヌハブらしい実装をやってみましょう。Gitの「コミット」のように、イッヌハブ上でいぬがリードの続きを継ぎ足して新しいリードを紡いでいく想像上の動作を「アミッコ」と表現しました。(ダジャレとしてはかなり苦しかったのが残念)アミッコの現実的な表現として、リポジトリー内にあるリードの画像をWeb画面上でGitのリビジョングラフの線として利用する、というのをやってみましょう。アミッコのサンプルとして使うのは次の画像ファイル8個です。固定して、次のように同じファイル名でひたすらコミットし続けた状態のリポジトリーを作っておきます。BlobオブジェクトとTreeオブジェクトGitでは、リポジトリーから取得できるファイル実体のことをblobと呼んでいます。blobデータには識別子としてのファイル名が無く、SHA1ハッシュによってのみデータを一意に決めることができます。ファイル名は別途treeデータにより管理されています。オブジェクトを取得することで、リポジトリー内のファイル実体を扱えるようになっています。とコミットメッセージだけ取り出した状態にしましょう。取り出したデータは、この場合ではPNG画像のバイナリーデータそのものです。要素のdataスキームに埋め込んでしまいます。アミッコ投稿の実装よしよし、ではいよいよアミッコを投稿する機能の実装だぞ、と思いきや...なんとgitlibはコミット未対応!!!ここに来て衝撃の事実が発覚するわけですが、gitlabにはcommit、reset、pushなどの、リポジトリーに変更を与える類のAPI実装が2016年10月時点でありませんでした。うむむ...Gitonomyはどうやっているんだろう...その代わりに、Repositoryクラスのメソッドで、run()というGitコマンドを直接何でもexecできるものがあります。これで最低限commitくらいはできるか確認してみましょう。なんでもできてしまうrun()run()は、任意のgitコマンドを実行することができます。なんでもできます!!!一応gitlibの方でエラーハンドリングをしているので、素でexecするよりは1億倍マシと言えるでしょう。引数文字列の配列);addからcommitの流れであれば、次のような感じで動かすことができます。PC上で動作確認して記事を書いています。技術デモとしてWeb上に公開するため、AWSのLinuxサーバーにデプロイしましょう。私はリッチじゃないのでt2.microで様子を見ます。ドメインは先ほど取得しました。アミッコを表示するデモが見られます。しました!コーディングうまくないので恥ずかしい...composer使いたい...イッヌハブ作れました。今回のところは以上です。ここまでやってもこの記事削除されちゃうのかな!!わかんない!!!不足した機能とか見てくれは、この後ゆっくりいじっていきます。upLoginユーザーは見つかりませんでした。