Elasticsearchのコードを読んでみる① 検索編

検索のリクエストを受けてからレスポンスを返すまでざっくり追ってみた。
過去何回か追ってみて、時間が経つとすぐ忘れちゃうので備忘録的ななにか。


検索リクエスト処理

RestSearchAction : 検索リクエストを処理する
- client.search NodeClient#search()を実行。いろいろまわってNodeClient#execute()が実行される。


NodeClient : 各ノード内部の検索リクエストを実行するクライアントクラス
- transportAction.execute TransportSearchAction#execute()を実行している。


TransportSearchAction : ノード間で分散検索を行うためのクラス
- doExecute()が実行される。
- 検索タイプによって処理が分かれる。デフォルトでqueryThenFetch(検索後にFetch)。TransportSearchQueryThenFetchAction#execute()が実行される。


TransportSearchQueryThenFetchAction : queryThenFetchを処理するクラス
- doExecute()が実行される。
- AsyncAction#start()を実行。検索対象がなければここでレスポンス返す。


AsyncAction : 各シャードへのリクエストを行う。
- コンストラクタで対象シャードを作成
- startで各シャード毎に処理する。
- performFirstPhase() sendExecuteFirstPhase()でシャードごとに検索処理。SearchServiceTransportAction#sendExecuteQuery()を実行。


SearchServiceTransportAction : 検索通信のためのクラス
- sendExecuteQueryでクエリーを送信。
- 対象シャードがローカルノードなら自ノードのスレッドプールからスレッドを立ち上げてSearchService#executeQueryPhase()を実行。
- 対象シャー度が他ノードなら対象ノードへリクエストを送信する(TransportService#sendRequest())。 対象ノードでSearchQueryTransportHandlerでリクエストを受け、SearchService#executeQueryPhase()を実行。結果を返す。
- 検索が完了したらlistenerに結果を渡す。


SearchService : 検索とか実行するクラス
- LuceneのIndexSearcherなどつかってごにょごにょ


TransportSearchQueryThenFetchAction
- listenerで結果を受け取り、onFirstPhaseResultで処理。全ノードからレスポンスを受けたらmoveToSecondPhase()を実行して次フェース(Fetch)へ移行。
- SearchServiceTransportAction#sendExecuteFetch()を実行してFetchする。


SearchServiceTransportAction
- SearchService#executeFetchPhase()を実行する。(対象が自ノードなら別スレッド、他ノードならリクエストする)
- 完了したらlistenerに結果を渡す。


TransportSearchQueryThenFetchAction
- listenerで結果を受け取り、全シャードを処理し終えたらfinishHimを実行。
- 検索スレッドプールでマージ(SearchPhaseController#merge())。
- 結果をlistener(RestActionから受け取ったActionListener)に渡す。


RestStatusToXContentListener : RestActionで渡されるListenerクラス
- SearchResponseをいい感じにJsonに直してレスポンスを返す。


めでたしめでたし

Kalafina分析

最近Kalafinaにハマりすぎているので、なんでこんなにハマってるのかを分析してみる。
※かなり主観的な話になりますのでご了承のほどをうんちゃらかんちゃら・・・


結論

結論としては、Hikaruがもたらすグループとしての不協和音が心地いいからこれほどまでにハマっているんじゃないかと思う。

前提

僕は基本的に『歌手』というものが苦手だ。作曲の専門家の人を歌のプロの人が歌うという形式は、一曲一曲を見ると非常にクオリティが高くて好きな曲も多いのだけれど、例えばアルバムなどで全体を見渡してみるとどの曲もクオリティが安定しすぎていて、アルバムとして綺麗にまとまりすぎてしまうのがその理由だ。

そんなわけで、もともとKalafinaも好きな曲はたくさんあったんだけど、『歌手』というものに対する苦手意識からなかなかアルバムを通して聴き込もうとは思わなかった。

ハマるきっかけ

KalafinaのコピーバンドのAnifalakさんのライブにおじゃましたのがきっかけ。僕も昔コピーバンドとかやっていたので実感としてあるのだが、コピーバンドには2種類いると思う。それは、「楽譜をコピーしてる」バンドと、「何もかもコピーし始めちゃってやばい感じになってる」バンド。

そして、Anifalakさんは後者のバンドで、たぶん「~のライブの時」の歌い方とか演奏アレンジとか、細かすぎて誰にも伝わらなさそうなレベルでコピっていると思う。そのレベルでコピーし続けていると、(本家の人達がやりそうな事を予測した)アドリブとかいうよく分からないことまで出来るようになったりするんだけど、とにかくそのくらいKalafinaが大好きなんだなというのが伝わってきて、これほどまでに人を惹きつけているKalafinaに興味がわいた。

ハマった

アルバムを全部聴いて、ライブビデオを全部観た。Wakana美しい・・・。ハマった。2014年6月はほぼほぼKalafinaを聴き続けている。

Kalafinaのいいところ

まず大前提として、曲がかっこいい、メンバーがかっこいい、歌が上手い、というのはあります。もちろん。とはいってもプロのミュージシャンですから、他の方々も皆それぞれ上手いしかっこいいです。そんななかで、なぜKalafinaがいいのか。


最初にも書いたけど、綺麗にまとまりがちな『歌手』というものが苦手なのだが、そういう意味ではKalafinaはちょっとおかしい。

Kalafinaの代表曲というと、知名度的にはMagiaとかstoriaが有名だと思うけど、ザ・Kalafinaというと一番最初の曲であるobliviousなんじゃないかなと思う。obliviousが一番Kalafinaっぽい。そしてここが象徴的な話なんだけど、obliviousというのはWakanaとKeikoだけが参加している曲なのだ。

ちなみにKalafinaのメンバー構成は、すごくざっくりした歌の印象だと
・高音の美しいWakana
・低音の美しいKeiko
・なんでも出来るHikaru
という感じになっている。話をobliviousに戻すと、obliviousをKalafinaのイメージに一番近い曲とするならば、WakanaとKeikoがいればKalafinaの世界観は完成出来るということになる。この2人は非常に美しい歌声をもっていて、この2人によるコーラスワークは完成されている。Kalafinaのイメージというのはこの2人のコーラスワークによって成り立っている。

では、Kalafinaというのはこの2人だけがいればいいのかというと、もちろんそんなことはない。この2人だけだとクオリティが安定しすぎて、前述している綺麗にまとまった歌手になってしまうのではないかと思う。

ここで重要なのがHikaruの存在である。Wakana、Keikoが自身の長所を前面に押し出すパフォーマンスが得意なのに対して、Hikaruは曲によってその歌声を何通りにも変える。『光の旋律』の優しい歌い出し、『Magia』の威圧的な歌声、『sprinter』のキャッチーな歌声、同じ人間が歌っているとは思えないほど、歌によって歌い方を変えている。これはWakanaとKeikoにより作られた完成された世界観であるobliviousには無い要素である。つまり、Kalafinaをoblivious組+Hikaruと捉えても差し支えがないほどに、この3人の中にあってHikaruの存在感は異質だと考えられる。

このHikaruが、WakanaとKeikoによるハイクオリティなKalafina的コーラスワークへの自己批判的な存在になっていて、そこに生まれる絶妙なアンバランスがKalafinaKalafinaとして綺麗にまとまることを許していない。Hikaruがいる限り、Kalafinaの楽曲は常にチャレンジを強いられることになるのである。


そしてこれが、僕がKalafinaにハマっている理由だと考えられるわけです。



という感じでけっこう適当ですけどw
fantasiaっていう曲がけっこう好きなんですが、WakanaとKeikoの美しいコーラスから始まって、サビでHikaruが全く違う世界観に持ってくっていうこの曲は、けっこう上で書いた事の象徴的な曲だなぁと思ったりする。

終わりなき日常の終わり たまこラブストーリーの感想

ようやく、たまこラブストーリー見てきたので感想を書きます。

感想

すごく面白かったです。期待通り、いや期待以上に。

良かった点をつらつら書くと
・話の本筋、たまこのラブストーリーが王道な感じでよかった。
・たまこというキャラクターは本当に魅力的。
・たまこのお母さんが初登場(?)したけど、「たまこ姫」と言ってあやしている姿は本当に良いお母さんで、子供の頃に母親に甘えてる時の間隔なんかをすこし思い出した。
・たまこがもち蔵にラブになっていく際の素敵エピソードが、設定を上手くいかして無理なくもち蔵かっこいい。病院での一幕はちょっとやり過ぎ感あったけれどw
・ギャグ要素も非常にいい塩梅で、観客でくすくす笑っている人がたくさんいた。
・みどり、かんな、しおりの同級生達の物語への絡み方も非常にほどよい。(といっても、みどりちゃんはこの映画では特別な存在だけれど)

という感じで、ラブコメ映画としてとってもよく出来ていたのです。



さて、もともと僕はたまこまーけっとをdisりまくっていたのですが、この『たまこラブストーリー』で180度方向転換です! たまこま最高ですね!!もちろんこの映画の元の作品『たまこまーけっと』も見ていて、全体的にはわりと好きだったのですが、どうしても最終回の結末が納得いかなかったのです。

たまこまーけっとに感じたやるせなさと、たまこラブストーリーをなんでこんな大絶賛なのか説明するためには、まずたまこまーけっとの背景から考える必要があります。

たまこまーけっと』登場までの流れ

ゼロ年代後半は京都アニメーションの黄金時代でした。社会現象にもなった「涼宮ハルヒの憂鬱」、ニコニコ動画との抜群の相性で一世を風靡した「らき☆すた」「けいおん!」など、圧倒的な作画のクオリティやネットスラングを上手く取り入れる手法で、年々を代表するアニメをコンスタントに創出していたお化けみたいな製作会社でした。特に、「らき☆すた」「けいおん!」「けいおん!!」をたてつづけにヒットさせたことで、「京アニの日常系」という絶対的なブランドを確立させました。

また、ゼロ年代後半は京アニ以外にもたくさんの日常系作品が作られていて、まさに日常系全盛期だったわけです。

ところが、10年代に入ると東日本大震災が起こり、あまりにも厳しい現実を見せつけられたアニメ批評界隈では「日常系の終わり」がささやかれるようになりました。まぁこの説には賛否両論あったのですが、現在から見るとこの指摘は現実のものになっていて、2011年を堺に日常系はゼロ年代の勢いを失っていきます。

そんな2011年、京都アニメーションは大々的な広告をうち、満を持して次なる日常系作品『日常』を発表します。この頃までの京都アニメーションブランドの力はとにかくすさまじかったので、多くの人が2011年の代表作はこの『日常』になると考えていました。そして、失敗します。もちろんそれなりに人気のある作品ではあったのですが、「らき☆すた」や「けいおん!」のようなメガヒットにはなりませんでした。結局、2011年のアニメの代表作は『魔法少女まどか☆マギカ』になります。

これにより京都アニメーションのブランド力は、それまでの圧倒的なものではなくなります。その後も、「氷菓」や「中二病でも恋がしたい!」などの人気作品を創出していきますが、ゼロ年代のようなメガヒットには至りません。

そんな中で、2013年冬アニメで放映されたのがこの『たまこまーけっと』なわけです。この作品は「けいおん!」「けいおん!!」をヒットさせ、圧倒的な力を持っていた「日常系の京アニ」ブランドの中心人物だった山田尚子/吉田玲子/堀口悠紀子が集結して、原作なしの完全オリジナルで再び京都アニメーションが日常系にチャレンジするという作品でした。

そして、『たまこまーけっと』は非常にクオリティの高い作品となりましたが、やはり大ヒットに至りませんでした。ちなみに、この年の代表作が「進撃の巨人」という日常系とは真逆の「戦争」状態を描いたものだったことからも、日常系作品の厳しさが分かります。


日常系の枠に縛られた『たまこまーけっと

さて、そんなたまこまーけっとですが、数話見ていくと今までの日常系ではあり得なかったキャラクターが存在していることが分かります。それが、「もち蔵」と「みどり」でした。この2人はたまこに恋しているというキャラクターなのですが、それまでの日常系に存在していたそれとは違って、かなりガチな感じです。この2人はたまこと友達でいることに辛さを感じていることが描かれているので、友達でいることから脱却しようと考えているキャラクターです。

つまり、この2人は日常系アニメたまこまーけっとで描かれている日常を破壊したいという願望を心の奥に持った存在なのです。

僕は、京アニの日常系アニメをもう一度という雰囲気で登場した『たまこまーけっと』にこの2人のキャラクターをあえて登場させた事が本当に素晴らしいと思いました。楽園だけを描く日常系が衰退していく中で、新しい形の日常系というものをあの京都アニメーションがチャレンジするのかと心躍らせました。

特に、「みどり」というキャラクターは本当によく出来ていて、日常系アニメに欠かせない主人公の親友という役割をこなしながらも、たまこへの恋心やもち蔵への嫉妬なども併せ持つという複雑なキャラクターで、みどりがこの物語をどういう方向に導いていくのかとても楽しみでした。


ところが、この期待は完全に裏切られてしまいます。端的に言えば、『たまこまーけっと』という作品の結論は「やっぱり日常系いいよね」っていうことで、日常への破壊願望を持ったこの2人のキャラクターは最終的に完全に黙殺されてしまうのです。

僕はこれがどうしても許せなくて、特にみどりの扱いがひどくて、たまこが「これからも今まで通りみんなで友達でいるのが一番いいよね」という感じで物語を締めて、なんとなく「めでたしめでたし」な雰囲気で『たまこまーけっと』は終わっていくのです。

いやちょっと待ってくれよと。みどりはどうなっちゃってるんだという話です。この最終回観た時に「好きな相手に告白すらさせてくれない日常系こわい」というようなことをツイートしたのですが、本当にそんな感じです。



日常を自ら終わらせた『たまこラブストーリー

ひどい作品だったという感想が残った『たまこまーけっと』でしたが、最終回の後しばらく経つと続編が作られるという噂が聞こえてきます。


どうやら劇場版らしい。ふむふむ。


どうやら「たまこラブストーリー」というタイトルらしい ・・・ふぁっ!?


もうこのタイトルだけでわかります。上でつらつら書いていたような僕のたまこまーけっとへの不満を全て吹き飛ばす作品であることが。
そして、本当に素晴らしい作品でした。

象徴的なのは、作品中でもち蔵が「やっぱりなかったことにしよう」と今まで通りに戻ることを提案し、「今まで通りは嫌だ」とたまこが拒否するところです。これは『たまこまーけっと』へのものすごい自己批判になっていて、「今まで通りが一番さ」というテレビ版最終回からここまで来たのはどうなってるんだという感じはしますねw

特に、インタビューとかを見ている限り、どうやらもともと『たまこラブストーリー』の構想があったわけではないようなので、この方向転換は実に不思議です。



まとめ

上記のように、僕の場合は最低評価から最高評価にジャンプアップというのもありますが、とにかく面白かったです。

Blu-rayかっちゃおっかな!

日本代表 vs コートジボワール代表 の敗因を考える

サッカー大好きなので書かないわけにはいかないな。

①左サイドのDFのバランスがおかしい
日本代表は前半開始直後から左サイド(相手の右サイド)を起点にされてどんどん攻められてしまいました。相手のセンタリングのミスやシュートミスに助けられて失点に至ったのは後半になってからですが、前半からいつ失点してもおかしくな状態でした。長友が負けてたとか香川がDF下手とかいう話ではなく、単に数的優位を作られてましたね。
これは香川真司の諸刃の剣というか、香川は攻撃の時にポジションを中央に寄せるので、日本代表は守備を開始する時に特に左サイドのフォーメーションが大きく崩れた状態からスタートすることになってしまいます。
サッカーでは攻撃する時に基本ポジションからの上下移動だけで攻めるのが一番安定するやり方で、かつてのイタリア代表のカテナチオとかはこういうやり方でした。まあ日本代表が攻撃的サッカーを目指すということは、このリスクと向き合っていかないといけないわけで、コートジボワール戦ではその弱点を本当に上手いことやられてしまいました。(研究されていた!?)
同点弾のシーンもそんな感じで、香川が中央にいる時にボールロストしてから左サイドを1対2にされてフリーでセンタリングを上げられてしまいました。

ここは戦術的に修正可能なところではあります。ストロングポイントどころかウィークポイントにされてしまった日本の左サイド。ギリシャ戦以降、香川真司サイドハーフとしてのタスクをどれだけ任せるのか。興味深いところです。


②ブラジル戦で見えた課題を対策してこなかった
まだ記憶に新しいコンフェデレーションズカップのブラジル戦での完敗。そこで分かったのは、中盤のプレスをドリブルでかわしてくる相手に対して、日本代表の戦術が全く機能しなくなるということでした。コートジボワールの選手たちもみなクオリティが高くてプレスに行っても取れないばかりか抜かれてしまうシーンが多々ありました。
ブラジル戦以降、オランダ等の強豪国相手の強化試合はこなしてきましたが、相手のDFとか守備的MFとかがプレスを抜きにかかってくるような相手とは試合をしてきませんでした。このグループではコートジボワールとコロンビアという個人能力に長けたチームがいるので、何かしら対策しておかなければいけなかったかもしれません。

これは今更どうしようもないので、コロンビアの守備的な選手のドリブルスキルが低い事を期待するしかないですね。


③謎のパスミス問題
これは原因がよくわからないのですが、とにかくイージーなパスミス/ボールロストを連発してしまいました。相手は強豪コートジボワールですから、悪い位置でのボールロストからの鋭いカウンターを仕掛けられまくったわけです。あれで2失点ですんだのは、吉田麻也を中心としたDFラインの奮闘があったからだと思います。この試合で唯一良かった点でしょうか・・・。最終ラインはコンディション良さそうです。
また、サッカーは心理ゲームでもありますから、安易なボールロストが何回も続くと日本代表の最大の長所である味方同士が連動した攻撃というのが出来なくなります。せっかくフリーランニングで前線まで上がったと思ったら味方が簡単にボールを奪われて、今度は全力疾走で自陣まで戻るというのを繰り返していると嫌になってくるものです。

今大会でスペインがオランダに大敗した時の現象ですが、前半はスペイン代表が優位に試合を進めていました。しかし後半になり土砂降りの雨が降り注いでからスペイン代表の様子が明らかにおかしくなり、まさかの5失点での大敗という結果になりました。連日の土砂降りがグラウンダーパス主体のパスサッカーに悪影響を及ぼしているのでしょうか。

まあそれは分かりませんが、とにかく日本代表みんなで「フリーな味方がいて、パスコースもある状態で、自分もある程度フリーになっている状態で、パスミスする」というなんだか大変なことになってしまっていたので、最低でもこの現象を改善しないことにはどのチームを相手にしても勝てないでしょうね。いったいなんだったんでしょう。


コートジボワール強い
つえー


ドログバやばい
まじ半端ない

Kalafinaにハマったんですが何か

KalafinaコピバンのAnifalakさんのライブに行ったりしているうちに、今更ですがすっかりKalafinaにハマってしまいましたー。いやーいいものはいい!

曲も良いしライブでのパフォーマンスも良いし、もともとKalafinaは好きだったのですけれど、ちょっと一段感次元が上がってメンバーのパーソナリティを追ったりとかするレベルまで好きになってしまいましたよ!

知り合いに空の境界を劇場に行って全部見たけどKalafina知らないとかいう意味不明な人もいたので、ちょっとKalafinaを紹介してみようと思います。


Kalafina紹介

Kalafinaは映画『空の境界』の主題歌のために結成された、Wakana/Keiko/Hikaruの3人によるボーカルユニットで、すべての曲をあの梶浦由記がプロデュースしてます。
梶浦由記の曲と歌詞による幻想的で壮大な世界観を、3人のボーカルによるコーラスワークで表現するスタイルが特徴で、非常に完成度の高い楽曲を作り続けています。

メンバーの3人はみな歌唱力が高く、しかも誰が欠けてもKalafinaが成り立たないというくらい、それぞれ強い個性を持っています。

メンバーは以下の3人。

Wakana
Kalafinaの右側にいることが多い人。
美しく透明感があり伸びのある高音が特徴。
Kalafinaのコーラスワークの中心的な存在で、高音パートで楽曲に広がりと美しさを与える。また、いわゆるKalafinaっぽい曲ではWakanaが主旋律を担当してることが多い。

Keiko
Kalafinaの真ん中にいることが多い人。
太くて抜けのいい低音が特徴。
Kalafinaのコーラスワークを低音パートで支えて楽曲に厚みをもたらしている。また、主旋律を担当すると他のメンバーとは一線を画す力強い歌声で曲を表現する。

Hikaru
Kalafinaの左側にいることが多い人。
艶のある歌声と多彩な表現力が特徴。
クラシック風なものからワルツ・ロック・ポップス・バラード調のものまで多様な要素が詰め込まれた梶浦由記の楽曲を抜群の表現力と器用さで歌いこなす。


かなり主観まじりですが、そんな感じの3人組です。
Kalafinaの真骨頂である美しい歌声を奏でるWakana、力強い低音で支えるKeiko、どんな曲でも歌いこなすHikaru、といった感じの構成になっていて、本当に良い3人組だなと思います。

オススメ曲

oblivious

Kalafinaの最初の曲で、Kalafinaのイメージ曲といったらこれですね。

sprinter

Kalafinaの中でも珍しいポップス調の曲で非常に人気の高い曲です。主旋律を3人で次々と歌い回すところがかっこいいです。

Magia

魔法少女まどか☆マギカのED曲で、Kalafinaの中で一番有名な曲だと思います。

光の旋律

個人的にとても好きな曲。ソ・ラ・ノ・ヲ・トという謎のアニメのOP曲。CメロのWakanaとHikaruのユニゾンがやばい。

音楽

Kalafinaの曲には多種多様な曲がありますが、これは1曲に色々な要素を詰め込んだような曲。アップテンポのダンスビートを刻んでいるのでKalafinaの中でも屈指のノリの良い曲。

(番外編)あんなに一緒だったのに

梶浦由記の名曲『あんなに一緒だったのに』のカバー。Hikaruのポテンシャルの高さが光る(!?)



そんな感じです!いつかKalafinaのライブいってみたいなーーーー。

ニコニコ動画の人気動画を配信する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の代わりに使い始めた所存、スキーマ設計とかが適当すぎてあんまりよくない。
  • いいかげんランキングのやつ以外にも別のあそべるサービスつくりたい