2015年の FUJI ROCK に出演するアーティストの動画を閲覧出来るサイト作った

徐々に、今年の FUJI ROCK の出演者が発表されていますね。

自分の知らないアーティストを視聴したいので、 出演者の youtube 動画を一覧で閲覧出来るサイトを作成しました。

FUJI ROCK のアーティストページから youtube へのリンクを一覧にしました。

2015 FES LINEUP

課題

  • 全アーティストではない(youtube へのリンクがあるアーティストのみ)

  • youtube のリンクでもチャンネルページへのリンクは除外している(watch へのリンクのみ)

  • soundcloud も取り込みたい

  • FUJI ROCK 以外も取り込みたい

Ruby の case 文でクラスの所属関係をチェックすることが出来る

Ruby の case 文って クラスとオブジェクトの判定が出来る。

target = 'abc'
case target
when Array
  puts 'Array'
when Hash
  puts 'Hash'
when String
  puts 'String'
else
  puts 'else'
end

このプログラムを実行した結果は

String

となる

なんで?

マニュアルを読むと

case は一つの式に対する一致判定による分岐を行います。when 節で指定された値と最初の式を評価した結果とを演算子 === を用いて 比較して、一致する場合には when 節の本体を評価します。

http://docs.ruby-lang.org/ja/2.2.0/doc/spec=2fcontrol.html#case

となっている。

つまり、

Array === target
=> false

Hash === target
=> false

String === target
=> true

ふむふむ。この結果から String クラスだと判定してるのか。

さらにマニュアルにはこうある

また === がどのような条件で真になるかは、各クラスの === メソッ ドの動作についてのドキュメントを参照して下さい。

String クラスのマニュアルを読む。

self === other -> bool other が文字列の場合、String#eql? と同様に文字列の内容を比較します。

other が文字列でない場合、 other.to_str が定義されていれば other == self の結果を返します。(ただし、 other.to_str は実行されません。) そうでなければ false を返します。

http://docs.ruby-lang.org/ja/2.2.0/class/String.html#I_--3D--3D

え。同値判定!?

さっきの

String === target

って同値じゃないよね。

そもそも String ってクラスだよな。 String クラスのマニュアルのってインスタンスメソッドの説明なんだよなー。

。。

。。。

ふと、昔ブクマした Ruby の クラスの説明を思い出す。

クラス名というのは実は定数で(だから大文字から始まる名前じゃないといけない)、そのクラスを表すClassクラスのインスタンスへの参照を値として持つらしいです。つまり、あらゆるクラス名は実はインスタンスであり、属するクラスはClassクラスであるというわけです。

http://blog.livedoor.jp/sasata299/archives/51276137.html

つまり、String クラスは Class クラスのインスタンスであると。

じゃあ Class クラスの インスタンスメソッドをマニュアルで確認してみる。

ない。。。

じゃあ親クラスの Module クラスのマニュアルを確認してみる。

指定された obj が自身かそのサブクラスのインスタンスであるとき真を返します。 また、obj が自身をインクルードしたクラスかそのサブクラスのインスタンスである場合にも 真を返します。上記のいずれでもない場合に false を返します。

言い替えると obj.kind_of?(self) が true の場合、 true を返します。

このメソッドは主に case 文での比較に用いられます。 case ではクラス、モジュールの所属関係をチェックすることになります。

http://docs.ruby-lang.org/ja/2.2.0/class/Module.html#I_--3D--3D--3D

あった!あった!

つまり、

String はクラスであり、Class クラスのインスタンスになる。 よって、Class クラスのインスタンスメソッド(Class#=== )が呼ばれている Class#=== は再定義されていないので、 Module#=== (Class クラスの親は Module )が呼ばれている。

target は Sring クラスのインスタンスになるから、target === 'abc' と target をレシーバーにしたら String#=== が呼ばれる

じゃあ Class#=== を再定義したらどうなるか。

class Class
  def ===(other)
    false
  end
end

target = 'abc'
case target
when Array
  puts 'Array'
when Hash
  puts 'Hash'
when String
  puts 'String'
else
  puts 'else'
end

こうなる

else

再定義して false が返るから真にならない。 分かった!!!

結論

Ruby の case 文では、when の 値がレシーバー(左辺)になって比較されるので、 レシーバーのインスタンスメソッドの === メソッドが呼ばれる。

when に クラスを指定した場合は、Class クラスのインスタンスメソッド(Class#=== )が呼ばれているが、 Class#=== は再定義されていないので、 Module#=== (Class クラスの親は Module )が呼ばれている。

というわけで、case 文でクラス、モジュールの所属関係をチェックすることが出来る。

Ruby の case 文調べてたら、Ruby のクラスについても勉強になった。

半兵衛の店名をスクレイピングしてみた

kanazawa.rb meetup #30 の二次会で半兵衛に行ったんですが、 半兵衛の店名がおもしろいと話題になったのでスクレイピングして一覧にしてみた。

店名

札幌すすきのロビンソン向かいかつや隣2階店
旭川買い物公園通り3条7丁目モスバーガービルの向かい店
函館市電五稜郭公園前駅を降りて行啓通りを北に向かった青い山脈の看板が目印店
青森本町ローソン向かい店
弘前かくみ小路にある吉永小百合の看板が目印店
八戸六日町ミスタードーナッツ向かい店
薄利多賣半兵ヱ盛岡大通り末廣ラーメン本舗向かい店
川反四丁目橋店
仙台駅舎前ハピナ名掛町交差点の地下店
国分町ラーメン味よしさんの小路を入った角の地下店
仙台泉中央FEADビル2F店
山形駅舎前すずらん通りサンプラザ向い店
酒田中町たくみ銀座通り店
福島駅舎東口大亀ホテル向かい店
郡山駅舎前アティ向かい店
高崎駅舎前TO-moreビル1F店
大宮駅舎西口を出て左のラーメン日高2階店
所沢西口プロペ通りダイソーさん向かいの2階店
船橋南口FACE向かい不二家隣ビル7F店
津田沼駅舎前にぎわい横丁通り店
柏東口ハウディモール駅前通りモスバーガーの角を左に曲がってすぐ店
水道橋駅舎東口白山通り日大隣店
上野仲町通りローソンのビル地下1階店
高田馬場 早稲田通りエスパスを左に曲がった新中華向かい店
池袋サンシャイン60通り店
池袋東口グリーン大通り最初の路地を左に曲がったビックカメラ裏店
歌舞伎町靖国通りリンガーハット上東海苑ビル3階店
歌舞伎町一番街焼肉安楽亭のビルの5階店
渋谷ハチ公口ランドマーク裏通店
渋谷センター街宇田川町交番隣店
恵比寿西口駒沢通りケンタッキーさんの地下店
江古田南口パチンコ日の丸を右に曲がったすし屋2階店
下北沢南口商店街鳥貴族先の電撃ホルモン斜め向かい青い山脈の看板が目印店
高円寺北口駅舎前ローターリー富士そば地下1階店
吉祥寺駅舎公園口マクドナルド向い店
立川南口すずらんどおり商店街牛丼松屋2階店
薄利多賣半兵ヱJR町田南口109から中央通りに入って5件目のビルの2階店
八王子店
横浜西口ジョイナス向かいスターバックスコーヒー隣店
横須賀中央西口やきとり「さがみ屋」の路地入った2F店
川崎駅舎東口銀柳街(ぎんりゅうがい)アーケード・モアーズビルの斜め向かい地下2階店
相模大野北口 コリド-通り1つ目の十字路を右に曲がったおたから堂書店の隣地下1階店
新潟駅万代口 弁天通りのローソンの斜め向かい店
富山駅舎前桜町交差点店
アパホテル金沢中央隣店
福井駅舎前ガレリア元町商店街なか卯隣店
長野駅舎前千石街通り店
新浜松モール街ザザシティ中央館の東側の地下1階店
静岡両替町シダックスから呉服通に向かってすぐ店
名古屋駅舎東口 大名古屋ビルヂング裏通り店
京都四条大橋先斗町の道路をはさんで向かい店
阪急東通り商店街奥、世界の下着二軒隣、5F店
神戸三ノ宮東急ハンズ前店
和歌山駅舎中央口 出てすぐのつぼ八と同じビル店
岡山本町ビックエコーの5階店
広島袋町パルコ裏店
徳島栄町一丁目アクティー21裏の井上ビル1F店
松山大街道青い山脈の看板が目印店
高知壱番街アーケード東詰めおらんく家本店向い店
丸亀町グリーンからスターバックスの十字路を右へ曲がったいけす道楽手前の青い山脈の看板が目印店
福岡天神ラウンドワン隣り5階店
なんと180席の大宴会場がある薄利多賣半兵ヱ佐賀駅舎南口店
長崎観光通から銅座町通りへ入った三八ラーメン隣の青い山脈の看板が目印店
熊本下通り餃子の王将2階店
大分中央町のアーケードと若草公園の間にある青い山脈の屋上看板が目印店
宮崎一番街アーケード 橘通りから入って青い山脈の看板が目印店
鹿児島天文館路面電車降りてすぐ店

7店舗に目印にされている「青い山脈

半兵衛の店舗紹介には Google Map へのリンクが設定されているので探してみたらこれでした。 f:id:kkabetani:20150308230038p:plain

青い山脈 (映画) - Wikipedia

店のコンセプト通りでした。 徹底してるなー。

ソース

scraping hanbey shop name

JavaEE 7 入門を写経していたときのメモ

Java EE7の初心者向けチュートリアル が用意されていたので、 写経したときにうまく動かなかった時に、対応したメモ。

kkabetani/javaee7-tutorial · GitHub

環境

URL

メモ

  • JUnit によるテストは今回飛ばす
  • WebSocket はしていない

リバースエンジニアリングでDBからエンティティ生成

マッピング・オプションで

  • 関連のフェッチ: 遅延
  • コレクション: java.util.List

に変更

生成されたソースの修正

  • 生成されたソースの finished は Boolean 型(クラス)になっていた
  • getFinished() を isFinished() のみ変更

  • 実行時に todo.finished が定義されていないのエラーになる

  • おそらく Boolean型では isFinished が getter と認識できていない
  • Boolean型の場合 getFinished であれば正常に呼ばれる
  • なので、boolean型に変更

業務処理の実装

  • 例外の作成
    • 作成する例外は RuntimeException を継承する(GUIで指定は出来ない?)

ManagedBean の作成

  • @Named は作成されずに、@ManagedBean が作成された

例外ハンドラの作成

Mac に Java1.7, Eclipse 4.4(Luna), GlassFish 4 を設定する

JavaEE を試す必要が出てきたので。

環境作る際にメモしたことを書いておきます。

環境

Java Install

☁  ~  java -version
No Java runtime present, requesting install.
☁  ~  java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
  • JDK のディレクトリは /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk

Eclipse install

  • https://eclipse.org/downloads/

  • Package Solutions から Eclipse IDE for Java EE Developers 64bit をダウンロード

  • ダウンロードした eclipse-jee-luna-SR1-macosx-cocoa-x86_64.tar.gz を展開する

  • 展開してて出来た eclipse ディレクトリを /Applications に移動

  • eclipse を起動する

  • Eclipse.app”は、アプリケーションで、インターネットからダウンロードされました。開いてもよろしいですか? とメッセージが出るので開くを選択

  • workspace を選択して、Eclispse が起動する

  • 日本語化は今回しない

EclipseGlassFish を使えるようにする

atom から gist にコードをアップする gist-it を試す

年末なんでパソコンの中整理してたら、お試しで書いたコードが出てきて、削除するのも勿体ないので、gist にアップすることにした。

せっかくなんで、最近ちょこちょこと使っている atom を使って、アップしてみる。

Package

今回は "Gist It" という Package を使用します。 一番ダウンロードが多かったので。。 ただ、最近はあまりメンテされていないのかなー。

設定

atom へ Install したら設定をします。 まず、gist への access token を作成します。 https://github.com/settings/tokens/new

作成したら、access token をコピーして settings の User Token に貼り付けます。

f:id:kkabetani:20141229232838p:plain

以上で設定は終了です。

使ってみる

  • gist にアップしたいファイルを開く
  • cmd + alt + g を押す
  • パネルが開くので、Gist の説明を入力する(ファイル名はそのままアップされます)
  • Private or Public を選択して Gist it をクリック

以上で gist にアップが完了します。

おわり

2015-01-17 追記

  • キャンセルボタンが追加になっていました。

Added cancel button · 4901fd5 · rpowelll/gist-it · GitHub