仮想通貨で絶対に負けない たった一つの方法
それは買わないことです! 買わなければ、勝つこともありませんが、負けることも絶対にありません!!
仮想通貨で絶対に負けない たった一つの方法 Read More »
それは買わないことです! 買わなければ、勝つこともありませんが、負けることも絶対にありません!!
仮想通貨で絶対に負けない たった一つの方法 Read More »
記念すべき(?)1stシングル。分身の術は見応えがある。確かAdobeのPremierで編集したっけ。やるな15年前の俺。
調子に乗って作った2ndシングル。緑影のしゃくれぐあいは今でも気に入っている。
若気の至りっていいよね。こんなもの作るのに何日もかけてたんだよなあ。ああ、あの頃に戻りたい・・・。
ホームページのホスト先であるnifty@homepageがもうすぐサービス終了するようなので、herokuにホームページを移転させてみた。
http://miracle-sisters.herokuapp.com/
相方の川●、これ見てたら連絡ください。
むかし忍者バンドだったという恥ずかしい過去を公開してみる Read More »
tubetop – The hottest viral YouTube videos in the world.
そこで今回は、開発においての技術的な事とか、各国の人気動画を眺めてて思う事なんかをツラツラと書いていこうと思う。
tubetopとはYouTubeの人気動画を国別に並べてるだけの、それだけと言えばただそれだけのサイト。当初こういったサイトはいくつもあるんだろうと思ってググってみたが、意外にも1つしか見つからなかったので開発することにした。動画に関してはYouTube Data APIというものを利用している。これを使えば人気動画はもちろん、独自の条件で検索した動画情報をJSONとかで受け取ることができる。
使用しているAPIに関しては後述するとして、他の環境周りも一応書いておく。
JS/CSSフレームワークの選定に関しては、多少ひねくれてるのかもしれない。。。
国別の人気動画を取得は以下2つのリソースで実現している。
1.I18nRegionsはYouTube上で使用できる地域を取得することができるリソース。地域コードはISO 3166-1 alpha-2で表される。この地域コードを検索条件にして、2.Videosリソースにて人気の動画(chart=mostPopular)の動画を取得している。これをデイリーバッチとして稼働させている。
人気の動画の取得の仕方を探すのにちょっと手こずったけど、それ以外は特に問題なく進んだかな。しかしData APIのドキュメント、目的のものが探しづらいんだよなぁ・・。
tubetopは一応全世界の人に使って欲しかったので、自分に関連性の高い国の動画が上に来るようにした。関連性が高いかどうかは・・
を基に判断している。例えばイギリスに住んでいる日本人がtubetopを開くと、一番目がUnisted Kingdom、2番目の国がJapanになるようになっている。これを実現するために、ユーザーがいる地域と使用言語を取得する方法がある。
Javascriptでユーザーがいる地域を判断する方法はいくつかある。ググると参考になるサイトが見つかると思う。一番参考になったサイトはここ。tubetopは「さっさと作る」というのが一つの使命だったため、中でも一番お手軽な方法で実現することにした。GoogleのGeo Location APIである。
実装は本当に簡単で、APIキーも要らない。
// headかどこかでapiを読み込んでから <script type="text/javascript" src="//www.google.com/jsapi"></script> # 国コードを取得(万一取れなかったらUSにしとく) # CoffeeScriptでっせ ClientLocation = google?.loader.ClientLocation userRegion = ClientLocation?.address.country_code || 'US'
1行で読み込んで取得は同期処理でサクッとlocation情報が取れるので便利。ただしこのAPI、公式ページもないし、たぶんDeprecatedになってるような気がする・・・。まあこういうことは深く考えてはいけない。
これはブラウザが教えてくれる。
@getUserLanguage = -> window.navigator.userLanguage || window.navigator.language || window.navigator.browserLanguage
厳密に言うと、この結果イコール使用言語となるわけではないが、今回の要求に対してはこれで充分。なお上記JSの結果はブラウザによって返してくる値が異なる。各ブラウザの設定で言語を選べると思うが、その内容を返してきたのはFirefoxだけだった(Mac)。ChromeとSafariはブラウザの言語設定をどう弄っても「ja」を返してきた。(OSの値を取ってきてんのかな?)
さて、ブラウザの言語取得ができたからといって、これで終わりでない。各国が使用している言語が分からなければ、言語による優先ソートは実現できない。最初はWikipediaからスクレイピングしてデータ作成しようか・・と思ってたが、探してみると丁度いいのがあった。いやあ、なんとかなるもんですなあ〜。
The GeoNames geographical database covers all countries and contains over eight million placenames that are available for download free of charge.
大雑把に言うと地名に関するデータベースを提供しているサービス。API提供はもちろん、テキストデータでダウンロードすることも可能。こういうのを見るたびにインターネットって偉大なあと思ってしまう。
私が使用したのはcountryInfo.txtという国別データ。ISOの2桁国コードをキーにした簡単統計情報を付加したデータだ。この中に使用言語sが入ってる。こいつをダウンロードしてActiveRecordにしてテーブルにぶち込むrakeを書いてこの問題はクリア。意外と苦労した・・・。
さて、CSSフレームワークだけど、お約束のBootstrapではなくてSemantic-UIを使用している。なぜこのフレームワークにしたかというと、国旗を表示するのが簡単だから。
http://semantic-ui.com/elements/flag.html
次のように簡単に国旗アイコンを表示することができる。
<i class="jp flag"></i>
jpの部分がISO2桁国コードになってるので、プログラムで出力するには持って来い。この理由だけでこのフレームワークを選んでしまった。まあ新しいことをやるのは新鮮でいいし。
ただSemantic(意味論的な)という名前だけあって、Bootstrap野郎からするとCSSクラスの指定方法が独特。マルチクラス方式になっているのだ。例えば以下はグリッドの例。
four-wide-column じゃなくて、four wide column とマルチクラスで指定して初めてスタイルが効く。なるほど、セマンティックだ。。。
悪くはないんだろうけど、CSSの定義がネスト+複数クラス定義になるので、あまり好きになれない予感がした。複雑なクラス解析が働くため、僅かかもしれないが描画速度も落ちるはずだし。
/* こんな感じの定義になる?(LESS/SASS) */ .ui.grid { .four.column { // 定義 } .five.column { // 定義 } .six.column { // 定義 } ... }
なんにせよLESSやSASS必須だろう。
JSフレームワークにMarionette.jsを使用したのは、以前Backbone.jsを使用したことがあったから。Backboneはシンプルでいいんだけど、本当にシンプル過ぎて、もう少し面倒見てくれよと思う時がある。そんな願いを叶えてくれるのがMarionetteさんだ。
Backbone.jsを理解していれば、基本的につまづくことなくMarionette.jsを使用できると思う。そんなMarionetteの中でも、特に便利だなと思ったことをツラっと書いておこう。
Backboneでは定形作業としてViewにrender関数を定義してあげる必要があった。典型的なコードは次のような感じ。
var MyView = Backbone.View.extend({ render: function(){ var html = $.templates(MyView.template).render({/* data */}); this.$el.append(html); return this; } }, { template: $('#hoge-template').html() }); new MyView().render();
Marionette.jsなら当たり前のrenderは書かなくてもいい。大したことないように思うかもしれないが、これ非常に楽チン。
var MyView = Marionette.ItemView.extend({ template: "#hoge-template" }); new MyView().render();
CompositeViewでmodelとcollectionを同時に描画するのなんて、ほんと楽。
uiを使用するとView内の要素をキャッシュして保持していてくれてアクセスが簡単。
var MyView = Marionette.ItemView.extend({ ... // View内の部品を保持しておく ui: { paragraph: 'p', button: '.my-button' }, // こんなふうに指定したり events: { 'click @ui.button': 'clickedButton' }, ... }); var view = new MyView(); view.render(); // こんな感じでjQueryオブジェクトが取得できる view.ui.paragraph.text(); view.ui.button.trigger('click');
ただし、テンプレートを使用しないViewでも必ずrender()を呼び出しておく必要がある。
Marionette.jsを使った感想は、用意されたレールに乗って行くことが可能なら、随分と楽できるなという感じかな。逆にレールに乗れないと結局はjQueryによるDOM弄りまくり地獄になってしまう可能性がある。あと、パフォーマンスを意識して再描画の際に特定箇所のみ再描画したいって場合がよくあるんだが、レールに乗るなら、その描画単位に合わせてViewを作成してやる必要があるなってこと。
例えば下の画像はtubetopのヘッダーメニューなんだけど、
パッと思いつく感じでViewを作成すると、次のような感じで書いちゃう人はいると思う。(自分もそう)
HeaderView = Marionette.ItemView.extend template: '#このヘッダー全部を描画するテンプレート' ui: filterFavoriteButton: '#お気に入りトグルボタン' autoScrollButton: '#スクロールボタン' events: 'click @ui.filterFavoriteButton': 'onClickFilterFavorite' 'click @ui.autoScrollButton': 'onClickAutoScroll' ...
しかし、ここでお気に入りボタン(♥)をクリックしたら、ボタン色を変更するような場合
ヘッダーのメニュー丸ごとrenderで再描画しちゃうと、TwitterやらFacebookのソーシャルボタンやら、関係のない部分まで再描画されちゃって困る。かといってjQueryのremoveClass/addClassを駆使してハートの色を変更するのは本末転倒で、これだと何のためにMarionette使ってんのか分かんない。
おそらく正解はViewに切り出すことなんだろう。例えばToggleFavoriteFilterViewのようなものを作るとか。とにかくViewを細分化して、それをLayoutにaddRegionして・・とマメにやっていかないと、Marionetteのレールに乗り続けることは難しい。
まあ、それがあるべき姿なんだろうが。もしくはVirtualDOM系のフレームワークに行っちゃうかね。
tubetopは1日1回しかデータを更新しないので、できあがったビューはキャッシュしとくに越したことないでしょうハイそうですねというわけで、Railsのフラグメント・キャッシュを利用してる。Railsのキャッシュ機構はデフォルトではファイルベースのキャッシュ(だったはず)なので、MemCachierを使用することでメモリベースにすることにした。
Herokuのアドオンに登録されているので使用は簡単。25MBまでなら無料で利用できるようだ。枠内に余裕で収まるのでこいつを使用することに。アドオンインスコするだけで使用できて超楽ちんだったな。
ダラダラと技術系のことを書いてきたが、最後にコンテンツの方について思ったことを突然箇条書きで書いてみる。
まあ、こんな感じ。並べてみて分かるということもあるもんだね。日本の動画はほとんど「はじめしゃちょー」と「ヒカキン」が独占してる感じ。しかし残念ながら日本以外でのランクインは全く無い。日本語だから仕方ないんだけど、ちょっと勿体無い気もするな。はじめしゃちょーなんかの動画は外国人にもウケそうだから、せめて字幕だけでも付けたらいいのに、と思ってしまう。
なんやかんや言うとりますが、ネタ探しや暇つぶし、課長に怒られた腹いせなどに、ぜひともtubetopをご利用ください。
【tubetop】YouTubeの国別人気動画を自動集約するサイトを作ってみた Read More »
通常のrspecの出力は 「.(成功)」, 「F(失敗)」, 「*(ペンディング)」となっている。この味気ない出力を、殺伐とした開発現場に咲くひまわりとなるべく、ジョジョ風にアレンジするというプチ・ハックを実施してみようと思う。
rspecではカスタムフォーマッターを簡単に作成できるようになっている。適当な場所にジョジョ・フォーマッターを定義する。ここでは ./lib/jojo_formatter.rbに記述することにする。
require 'rspec/core/formatters/base_text_formatter' class JojoFormatter < RSpec::Core::Formatters::BaseTextFormatter def example_passed(example) super(example) output.print success_color('・') end def example_pending(example) super(example) output.print pending_color('ン~') end def example_failed(example) super(example) output.print failure_color('ゴ') end def start_dump super() output.puts end end
読めば分かると思うが、example_passedはテストが成功した場合、example_pendingexample_failedはそれぞれペンディング/失敗した場合に呼び出されるスタンド・・いやメソッドだ。思う存分、お好みのジョジョ台詞に書き換えればいい。
フォーマッターの定義はこれだけ。早速rspecを実行してみよう。require, formatオプション付きで実行する。
rspec --require ./lib/jojo_formatter.rb --format JojoFormatter spec/
ディ・モールト!(非常に良いぞッ!) こだわるならッツ! .rspecにオプション設定を記述しておきたいッッ!
--color --require ./lib/jojo_formatter.rb --format JojoFormatter
さあ、変更を共有レポジトリにpushして、メンバーの度肝を抜いてやろう。
こんなのも作ってみた。シリーズ化できそうな・・・
rspecの出力結果をジョジョ風にしてみる Read More »
Googleにログインして、Googleアラートのページに飛び立とう。以下のような検索ボックスがあるページだ。
あとはここにキーワードを入力するだけ。ORとか+-“”なんかも使用できる点は、通常のGoogle検索と同じ。例えば以下のように入力しておけば、ツチノコの最新情報が(あれば)毎日お届けされるわけだ。オススメは『件数』を『すべての結果』にしておくこと。結果が多すぎて困ることはないだろう。
使い方はこれだけ。さっそくGoogleアラートの正しい使い方を紹介していこうと思う。
おそらく、最もベタと思われる活用法。だがその効果は計り知れない。音楽マニアになればなるほど、お気に入りのアーティストの数も多い。正直いちいち全部チェックしてられない。Googleアラートはベストなソリューションだ。
もちろん音楽に限らず活用できる。ミステリーが好きなら[東野圭吾 新刊]と入力しておけば良いかもしれない。
心臓と自尊心の強い方におすすめなのがエゴサーチだ。自分の本名やIDなどを登録しておけばよい。誰かが噂をすればクシャミではなく、メールが飛んでくるようになる。
苗字と名前はダブルクォーテーションで囲んでおいたほうがよいみたい。
立ち上げたばかりのサービス・サイトなど、評判が気になって仕方ない。お客さまの生の声をいち早く知るためにも、アラートを活用しよう。
会社なら「評判」、飲食店なら「味」「値段」なんてキーワードを追加してみても面白いかもしれない。
ブログを書いていると「こういう表現はやめておこう」というワードがあったりする。ですます調はやめようとか、「超〜」「ガチで」禁止とか。そういったワードをアラートに登録しておけば、うっかり使ってしまった自分へ警告メールを送ることができる。
siteオプションで自分のブログのドメインを指定するのを忘れずに。
小・中学校時代の恩師のことを「今何してんのかな〜」と思い出す方も多いだろう。Googleに探させるべきだ。
「校」という一文字を付け加えておくことで、ずいぶんとノイズが減る。ちなみに私は、中学校時代の恩師が最近校長先生に昇進したのを知った。
そんなストーキングまがいな行動もGoogleはサポートする。初恋の人ならばフルネームも覚えているだろう。恥ずかしがらず、入力しなさい。
よくあるのが同姓同名の有名人がいるというケース。そういう場合は、有名人の検索結果を除外できるように「-(マイナス)」キーワード指定をしておこう。
ニュースになるのは大きな事件ばかり。地元の事件やグルメ情報など、大手メディアは見向きもしない。しかしジモティーならブログにアップしているかもしれない。
近場でオープンしたレストランなんかの情報も入ってくるので便利。地元のシンボルとなるキーワードをORで繋ぎまくればよい。
使い方はよくわからないが、何やら便利なファイルらしい。販売されているものではなく、誰かが作って配るものなんだとか。よく分からないが漫画の新刊と大変相性がよいらしいので、一応アラートに登録してみている。
まったく使い道が分からないが。
世間に騒がれるゲームなんてほんの一握り。多くの懐ゲーはひっそりとリバイバルされるものだ。ノスタルジーを手に入れるため、電気網を張っておく。
ダイナソアみたいにリザレクション発売されないだろうか。
訃報(ふほう)とは、お亡くなりになった人々の知らせ。お悔やみだ。人間なんていつどうなるかわからない。チェックしておいて損はないと思う。
届いて嬉しいものではないが。しかし、憎き相手の名前を付け加えておくと、逆の楽しみ方ができる。
余に蔓延る【悲報】に通ずることができる。この手のネタ系まとめは好きなので、休憩時間にまとめて読んでる。
なんだかんだいっても、2ちゃんは面白いよね。
以上、Googleアラートの正しい利用方法。もっといい利用方法があったら教えて欲しい。ご清聴ありがとうございました。
Googleアラート 11通りの活用法 Read More »