Diary && Record

記録して見る4年間

Github上のリポジトリを検索するアプリを製作した

redosel.hatenablog.com

↑の記事でGithub上で動作するProbotの製作を行おうとして失敗したけど、APIの叩き方は分かってきたからUnity、C#APIを絡めた何かしらのアプリを製作するって言っていたやつが完成しました。


製作期間は2日(この記事書くまでは3日だと勘違いしてました)で22, 23, 24の三連休のうちの二日をガッツリ使いました。


説明はさておき、とりあえず作ったものはこんな感じです。


f:id:redosel:20180927022358g:plain


f:id:redosel:20180927022603g:plain


検索したいリポジトリ名を入力して検索ボタンを押すと、ヒットしたリポジトリ一覧が表示されます。
一番上の"Search Results"はヒットしたリポジトリの数です。
なお、リポジトリは30件ずつ表示されるようになっており、Gif画像を見て分かるように、検索に引っかかるリポジトリ名は完全一致ではなく、部分一致となっています。


では、中身についての説明をしていきます。


リポジトリの検索方法について

Github APIについて調べたところ
https://api.github.com/search/repositories?{{ クエリパラメータ }}
で該当するリポジトリの情報を取得可能ということが分かりました。


もし"Unity"という名前のリポジトリを検索したいのであれば
https://api.github.com/search/repositories?q=Unity
とすることで検索することが可能です。


他にもリポジトリの複数検索や条件検索など、クエリパラメータ次第で検索の幅が広がるようです。
詳しくは公式リファレンスを参照してください。
developer.github.com
ちなみに今回は時間の都合上、条件検索などは実装していないです。

JSONデータの解析

先ほど、リポジトリの情報を取得可能と言いましたが、では実際どのような形で取得できるのか?という話についてです。
Github APIに限らず、APIはアクションに対する答えをJSON形式にして返してくれるようです。


つい先日、不気味な拡張子やらなんやらで話題になっていましたが
JSONとは"JavaScript Object Notation"の略称で、名前に"JavaScript"が入ってあるように、JavaScriptから派生した、データ交換を行うためのデータ記述形式の一種です。


とりあえず僕はJSONに関して

みたいな認識を持っています。


本題の方に戻ると、リポジトリの検索でAPIを叩いた結果、主に検索にヒットしたリポジトリの数と各リポジトリに関する情報がJSON形式で返ってきました。

リポジトリが持つパラメータを確認していくと
"id(リポジトリに割り当てられたID)"、"full_name(親リポジトリ名/子リポジトリ名)"、"html_url(Github上のページURL)"、"stargazers_count(星がつけられた数)"
など、JSONデータを解析することで、欲しいデータのみを取得することが可能であることが分かりました。

C#でのJSONの扱い方について調べると、C#では基本"JsonUtility"や"MiniJSON"を使用するみたいです。

どちらでも良かったのですが今回はMiniJSONを使用することにしました。

この際に一つ苦労したことが、どうやらMiniJSONでは配列は必ず"["、"]"で囲まれていなければならないということでした。

タイプA: エラー発生

{
  name: Taro,
  age: 18,
  favorite_sports: {soccer, baseball}
}


タイプB: 問題なく通る

[
  {
    name: Taro,
    age: 18,
    favorite_sports: [ {soccer, baseball} ]
  }
]


もちろん、取得したJsonは基本"{"で始まり、"}"で終了していたので↑でいうタイプA形式となっているものがほとんどでした。
そのため、こちら側が適切な箇所に"["、"]"をつけてやらなければ解析不可能という少し難儀なものでした。。。(もしかするともっと楽な解決策があるかも?)


MiniJSONの使い方に関しては以下の記事を参考にしました。

www.cho-design-lab.com


感想

良かった点

  • 一番の目的であったGithub APIの叩き方をとりあえずは習得することができた。
  • MiniJSONを使ったJSON解析、WWWクラスを使用した通信、など初めて勉強する内容が多かった。
  • 決めた期間で思い通りのものを制作し、ビルドまで持っていくことができた。

悪かった点

  • コードが汚ない(変数名の付け方が下手。カプセル化ができていない。)
  • 調べものをしている時間が長い。
  • 例となるものがないとまだ書けない(リファレンスのみで書く習慣をつける)


悪かった点の二つ目、三つ目に関してはこの記事を読んでから考えさせられるようになりました。

simplearchitect.hatenablog.com


今回制作したアプリのコードはGithub上で公開しています。

github.com

また時間があれば、リポジトリの条件検索などの追加機能の実装や、コードのブラッシュアップなどを行っていきたいです。

Github上で動くBot の「Probot」を制作しようとした話

最近、研究室のイベントで「Probot」というGithub上で動かすBotの制作をしました。
とはいえ、目的はProbotを制作することではなく、今後研究などで使用することもあるためGithubAPIの叩き方を習得することでした。

環境はNode.jsで使用した言語は初の”TypeScript”でしたが まずTypeScriptって聞いたことはあるけどなに?となったので調べたところ

  • 静的型付け
  • クラスベースのオブジェクト指向
  • コンパイルすると自動でJavaScriptソースコードに変換

  • ざっくりこんな感じのようです。
    Microsoftが開発したとかなんとか。

    製作を試みたProbotの概要は

    前回コミット時からの変更したコードの差分とコミット経過時間を取得し、作業効率を計測する。

    といったものです。

    Probotに関しては公式リファレンスも公開されており、プルリクエストを作成する、プッシュする、コミットする、などといったGithub上でのアクセスに対して起動するGithub Webhookを中心に実装していくといった流れです。

    以下は非常に簡単な実装例です

    // 新たにissueが開かれたときに呼び出される
    app.on("issues.opened", async(context: Context)){
        const params = context.issue({body: "Hello, Probot"});
        context.github.issues.createComment(params);
    }
    

    またapp.onには以下のように複数のWebhookをイベントを追加することも可能

    // 新たにissueが開かれたとき, issueが編集されたときに呼び出される
    app.on(['issues.opened', 'issues.edited'], async(context: Context)){
        const params = context.issue({body: "Hello, Probot"});
        context.github.issues.createComment(params);
    }
    


    コミットした人のID、コミットした日時など簡単な情報はうまく取得できたのですが、肝心のコミットしたファイルの 変更点が取得できず、、、

    調べていくと"commits_url"に指定プルリクエスト内での全てのコミット情報が保管されているっぽく、実際にURLに飛んでみるとJSON形式で過去のコミット情報が保管されていました。

    このJSONデータから欲しい情報(今回の場合だと変更したファイル)を取得できればあとは正規表現とかの話になってくると思うので、fetchしてみようと試みたのですが、コンパイルは通るのに実際に使用されると"fetch is not defined"と表示されうまくいかず。

    Stack Overflowで似たような質問をしている人がいたので、回答者の意見を参考に"node-fetch"をrequireしてみたのですが、それでもうまくいかず、、、

    あまりにもProbotの制作に時間をかけすぎていたので、悔しいですが今回は一度手放してみることにしました。  冒頭にも書いてある通り、目的はGithub APIの叩き方を習得することなので、、、

    ただ、APIの叩き方はだいぶ分かってきましたので、現在はTypeScriptと比べるとまだ使い慣れているであろうUnity、C#Github APIを関連づけた何かしらのアプリを制作しています。具体的にどのようなアプリにするかは作りながら考え中です。



    特に成果もなく記事としてはかなり微妙な内容となりましたが、以上になります。
    また時間をあけてProbotの制作のリベンジもしたいなとは思います。

    Unityのアプリは完成し次第、記事&Gihubにでもあげようかなと思います。

    お引越し

    HatenaBlogデビュー!

    実は以前からFC2ブログの方で備忘録的なブログとして活動していたのですが、若干扱い辛かったということと、どうせ技術系のブログを書くのだったら。。。ということでHatenaBlogに引越ししました!

     

    この記事を書くまでにブログのデザインとかをいじっていたのですが、結構良い感じです。

    既に引越しして良かったと思ってる自分がいます。

     

    というわけで、これからまた日々の活動を備忘録として記事にまとめていきたいと思います。(前のブログでは結構サボりがちになっていたので頑張ろう)

     

    自己紹介などはHatenaBlogのアカウントプロフィールと前ブログの

    dooooankurokuro.blog.fc2.com

    に書いてあるので気になった方は是非ご覧になってください。