ニコニコ動画の人気動画を配信するtwitter botつくった(Go言語使ってみた)

golang書いてみようとふと思ってみんな大好きTwitter bot作りました。ニコニコ動画の人気動画を配信するという体裁のbotです。

作ったやつ→ニコニコ動画_Fav
ソースは→https://github.com/yfujita/nico-fav-tweet

動作

ニコニコ動画の公開RSSでランキングをXML形式で取れるので、毎時ランキングを定期的に参照して、トップ10で新しいものがあったらツイートしています。

Go言語つかってみた

以前Tour of Goはやったことあったものの、すっかり忘れていてゼロからのgolangでした。構造体とかポインタとか出てくるので、C言語書ける人はとっつきやすい印象でした。
ちょっと触った程度ですけど、復習のためにここまでやったことをまとめておきます。

①なにはともあれTour of Go

A Tour of Goというgolang入門サイトに実際にコードを動かしながら学べるとても丁寧なチュートリアルがあるので、最初は何も考えずにこれやりました。

golangのインストール

http://golang.jp/installなどを参考にインストール。

Mercurialをインストール

go getする時にライブラリによってはMercurialリポジトリを使ってるので、入ってなければインストールが必要です。

④GOPATHの設定

環境変数GOPATHを設定します。

export GOPATH=/hoge/fuga

go getするとGOPATHにライブラリが格納されて、ビルドする際に自動的にGOPATHを参照して依存ライブラリを解決するみたいです。なので設定が必須。複数のディレクトリが設定が可能で、その場合はgo getした時には最初のpathにライブラリが格納されるらしいです。

Hello World!!!

Hello World!!!

package main

import(
	"fmt"
)

func main() {
	fmt.Println("Hello World!!!")
}

という感じのファイルを適当なディレクトリにhello.goという名前で作成して

go run hello.go

で実行できます。かんたん! mainパッケージのmain関数が実行されるみたいです。

⑥ソースファイルを複数に分けたい

package名さえ同じにしておけば複数のファイルに分けてかけます。別ファイルのソースの関数も構造体も自由に参照可能です。

go run *.go

とかで実行出来そう。

オブジェクト指向っぽくしたい

golangにはクラスという型はないですが、構造体にメソッドを定義出来ます。C→Javaの順番でやった人はクラスって構造体にメソッドを定義したものかなという感じで入ると思うのですが、まさにそれなのでクラスよりもこっちのがしっくり来ます!

type Hoge struct {
	Value int
}

func (hg *Hoge)showValue() {
	fmt.Println(hg.Value)
}

みたいな感じで定義して

func main() {
	hg := new(Hoge)
	hg.Value = 10
	hg.showValue()
}

みたいな感じでオブジェクト指向

⑧平行処理したい

golangにはgoroutineというのがあって、chan型と組み合わせて超簡単に平行処理がかけるみたいです。

func main() {
	ch := make(chan int)
	go func(ch chan int) {
		ch <- 1
	}(ch)
	fmt.Println(<-ch)
}

これだけ!(たぶん動く気がする)

「go 関数」と書くと関数が別スレッドで実行されるらしいです。
データの受け渡しはchan型を使うのがいいらしい。メモリ共有されてるので直接他スレッドの変数に値を書き込むことが出来るけどあんまりやらない方がいいっぽい。「ch <- 1」で値を格納。「<-ch」で値の取り出し。「<-ch」の時にまだ値が設定されてなかったら、勝手に実行スレッドをロックして値が設定されるのを待ってくれるらしい!便利!

⑨ビルドしたい。

ソースのあるところでgo build します!

⑩どういうディレクトリ構成にしたらいいのかよく分からない

githubのgoのコードとかみてもなんかすっごくシンプルな構成でよくわからない。というかみんなライブラリなんでmain packageがない。

と思っていたら素敵な記事がありまして

【翻訳】プロダクション環境でのベストプラクティス

SoundCloudではGoをガンガン使っているらしい!ディレクトリ構成についても書いてあって、リポジトリ下にmainパッケージのソースコードをガン置してることが多いらしい。(やっちゃ駄目と書いてある)

⑪パッケージ分けたい

mainパッケージにガン置きやっちゃ駄目となるとディレクトリつくってパッケージを分けるのが良さそうなので、分けてみる。

{project-dir}
 |-main.go
 |-sub
   |-sub.go

こうやっておいてmain.goから「import("sub")」ってやればいけるのかなとも思ったけどsubなんてないって怒られる。
依存ライブラリの解決にはGOPATHを参照しますが、GOPATHにsubなんてないよって言われる。

ってことはこれ毎回GOPATHをカレントに設定してかなきゃいけないのかー詰んだ。

と思っていたら

とのありがたすぎる助言を頂きまして、最初からGOPATHの中で作業してればすべて解決すると。その発想はなかった!

{GOPATH}
 |-bin
 |-pkg
 |-src
   |-{project-dir}
     |-main.go
     |-sub
       |-sub.go

みたいな感じで、main.goからはimport("{project-dir}/sub")とするとsubパッケージがimportできました。この状態で{project-dir}で「go install」するとbinに実行ファイルも作ってくれたりしていたれりつくせりです。

ちなみに、githubにあるgoパッケージをgo getすると「{GOPATH}/src/github.com/userName/repositoryName/packageName」という感じでインストールしてgo installまでしてくれるようで、つまりgithubリポジトリにはpackageディレクトリだけおいとけばgo get可能ということっぽい!だからgithubにあるgolangリポジトリはどれもこれもシンプルな構成になっているんですね。すごくいいですね。

githubにうpしたい

git pushです!

githubにあげる予定のある場合は、最初から{GOPATH}/src/github.com/userName/repositoryNameのディレクトリで作業しておくとそのままgithubにうp出来てgo getもしやすくてすごい。



という感じで今のところやったことをまとめました。
継続して何かしたいけど何をしましょう。
このbotでもロギングとかエラー処理とかでまだ遊べそうかもしれないですが。

botは・・・

ニコニコ動画_Favを見ればわかりますが、1時間に1個くらいしかツイートしていない。。。 ニコ動の毎時ランキングの上位って意外と全然動きがないんですねー。botがあんまり喋ってくれなくてつらいです。それにしても、実況動画が多いですねw 超会議でも実況する人達みんなイケメンで女性ファンがすごかったらしいですし、すごい。

アニメのランキングサイト更新した (AngularJSつかってみた)

仕事の納期がひしひしとせまってきているプレッシャーに押しつぶされて「そうだ、AngularJS一度使ってみよう」と思ったので、もはやただの遊び場となっているアニメランキングのサイトを更新しました。
http://niconico.anirank.info/anirank/

ニコ動の動画の再生数とかをアニメタイトルごとに集計してごにょごにょしてランキングで表示するアプリです。

フロント部分をいじりました。ちなみにレスポンシブデザインつくるのがつらかったので、スマホでアクセスした場合はbootstrapでなんちゃってレスポンシブになってた昔のデザインで表示されます。

構成

  • フロント
    • Twitter Bootstrap
    • AngularJS
    • MAXIMAGE2
  • サーバーサイド
  • ストレージ
    • H2 DB(設定情報)
    • Elasticsearch(コンテンツ情報)

やったこと

AngularJS使ってみた

今まではサーバーサイドでHTML作ったりしてたのをやめて、サーバーからは静的なコンテンツを返してクライアントサイドでAngularJSでごにょごにょして遊ぶ感じにしました。
AngularJS入門を一通り読んで、記載されてるサンプルコードを動かしてみたりするだけで、ランキングサイト作るくらいはすぐに出来るようになりました。

基本的にはcontrollerで変数に値を設定して、HTMLに{{変数名}}って書くと表示される感じです。このAngularJSのHTMLテンプレートが機能豊富で、テンプレートを利用するだけでほぼ簡潔しました。directiveという以下のような属性をHTMLに書く事でいろいろな処理をシンプルにテンプレート内に埋め込めて、標準で用意されてるdirectiveを使うだけでマジいろいろ作れそう。

  • ng-model
    • 入力フィールドの値を指定した変数へ格納
  • ng-repeat
    • 配列などのコレクションを指定すると、ng-repeatを指定した要素を配列要素数分だけ繰り返して生成
  • ng-click
    • 要素がクリックされた時の処理を指定
  • ng-style
    • 要素のstyleの設定を変数で動的に設定
  • ng-show
    • 要素の表示非表示を変数で動的に設定

などなど。たくさんあります→ディレクティブ。自分でオリジナルのdirectiveも作れるみたい。

Web APIからコンテンツの情報をとる時は「$http.jsonp」というサービスが用意されてるのでこれを叩くだけです。(AngularJS ver1.2.1までだとIE11で$http.jsonpが動かないみたいです、、、)
ページ内のコンテンツを動的に表示させる時、jQueryとかだとDOMをごにょごにょしてたのが、AngularJSだと変数に値を設定するだけなので、コードがすっきりするかもしれません。逆にスコープの変数が大量に出来てごちゃごちゃしてくる感じがしなくもないので、controllerは小分けにした方がいいのかも・・・?

MAXIMAGE2使ってみた

氷菓 京アニ公式で使ってるのをみかけてかっちょいいと思って以来、使ってみたかったので使いました。
MAXIMAGE2
背景に画像を設定した場合に、スクロールすると途切れちゃったり、ブラウザの画面サイズによって画像のはじっこしか表示されないなど、背景画像が変な表示のされ方しちゃいますよね。そんな時はMAXIMAGEがすごくよくて、画像のサイズをブラウザのサイズに合わせていい感じに調整してくれます。

使い方もとっても簡単で、

<div id="maximage">
    <img src="/anirank/images/back3.jpg" alt=""/>
</div>

とHTMLに書いて、

$(function () {
    $('#maximage').maximage({
        isBackground: true,
        overflow: 'auto',
        verticalAlign: 'top'
    });
});

javascriptを書くだけ。すごい!

今後

  • サーバーサイドをgolangにしたい
    • だがnico-api-clientのGo版を作るところからになったりH2も捨てないといけないかなぁというところで重い腰が上がらない
    • 検索なんとかしたい。一応Elasticsearchつかっているものの、もともとDBの代わりに使い始めた所存、スキーマ設計とかが適当すぎてあんまりよくない。
  • いいかげんランキングのやつ以外にも別のあそべるサービスつくりたい

ニコニコ動画APIのJavaライブラリ

昔作って放置してたやつのリポジトリを変えました。
完全に別のリポジトリになってまつ。

https://github.com/yfujita/nico-api-client


ちょこちょこ直しました。
API叩くたびに毎回HttpClientをクリエイトするとかいう感じになってたので使いまわすようにしたのと、コンストラクタでHttpClientを渡せるようにしました。

あと、検索メソッドとかのパラメータにニコ動のWebAPI用の文字列をそのまま渡してたのをenum化しました。
下でenum化してくれていたforkがあったので、参考にしました。
https://github.com/takryo/nico-api-client/commit/cfff5a9c7180690808496c3e2ce769b1cbac099b


歩行者信号のある横断歩道を渡る時の危険度順位

交通事故には気をつけたい。
横断歩道を渡る時の危険度は以下のような順位になるかと思う。

1位 左右確認せずに赤信号を渡る。
2位 左右確認せずに青信号を渡る。
3位 左右確認して青信号を渡る。
4位 左右確認して赤信号を渡る。


左右確認せずに赤信号を渡る
これは普通に危険。死ねる。

左右確認せずに青信号を渡る & 左右確認して青信号を渡る
この両者にはあんまり差はない。そもそも左右の車は止まっているので。
青信号が危険なのは前後の車が動いている中で、車側がきっと止まってくれるだろうという期待の元でわたらなければならないので、事故る事故らないは左折or右折してくる運転手の手に委ねられる。あんまり歩道確認しないバカが来た場合、アンラッキーと諦めましょう。

左右確認して赤信号を渡る
一番安全。左右からは車は来ていない。前後の車は止まっている。


青信号には気をつけましょう。

2014年 春アニメ ランキング

冬アニメの咲全国編が終わってしまって魂抜けてますが、アニメのランキングサイトを更新して春アニメを追加しました。

http://niconico.anirank.info/anirank/


更新する時は基本的にアニメのタイトルをオンラインでGUIから入力するだけなんですけど、最近はどんどんタイトル数が増えていってそれだけで1時間くらいかかってしまう(;・∀・)

メカクシティアクターズラブライブが強いみたいですね。今後ジョジョがどれだけ伸びてくるかでしょうか。

個人的には一週間フレンズの原作が好きなので楽しみにしています。


あと、今期は咲1期とログ・ホライズンの再放送がやるので、これも楽しみですね。ログホラの序盤はアカツキが大活躍で最高ですね!

【艦これ】4-4卯月ほり

圧倒的に艦これ攻略ブログ!

4-4での卯月狙いの周回、ちまたではきついって言われてるけど、ボスS勝利はそれほど難しくないんですよね。
S勝利きついっていってるのみると雷巡つれてってること多いけど、これがきつい原因ですね。ボス戦では対潜陣形の都合で雷撃が弱くなるし、連撃と先制雷撃の都合で対潜装備も積めないので、砲雷戦で雷巡が全くやくにたたないのです。雷巡やめて戦艦あたりつれてきましょう。あとはルート固定用の駆逐艦2隻に対潜装備ガン積みにしとけばS勝利不可避です!
ルート固定用の重巡晴嵐2積みの航巡とかにして対潜の保険にしとくのもありですかね。まあ駆逐1隻で余裕で潜水艦倒せますけど、事故って2隻とも中破・大破することもありますので。

羅針盤は知りません。

2014年 冬アニメ ランキング

2014年の冬アニメを登録しまったー↓

http://niconico.anirank.info/anirank/index/?kikan=201401


まだ始まったばかりですけど今のランキングは

1位 鬼灯の冷徹
2位 生徒会役員共*
3位 ニセコイ
4位 最近、妹のようすがちょっとおかしいんだが。
5位 となりの関くん

という感じみたいですねー。まだ咲しか見てない体たらくっぷりですけど、、

桜Trickなんなんすかこれ>< http://www.nicovideo.jp/watch/sm22638534