2015年の 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 文でクラス、モジュールの所属関係をチェックすることが出来る。
半兵衛の店名をスクレイピングしてみた
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 へのリンクが設定されているので探してみたらこれでした。
店のコンセプト通りでした。 徹底してるなー。
ソース
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 を試す必要が出てきたので。
環境作る際にメモしたことを書いておきます。
環境
Mac OS X 10.9.5 64bit
自分の Mac が何ビットか調べる方法 http://support.apple.com/ja-jp/HT3696
Java Install
☁ ~ java -version No Java runtime present, requesting install.
http://www.oracle.com/technetwork/java/javase/downloads/index.html から JDK をインストール
- コマンドラインを起動して、インストールを確認
☁ ~ 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
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 が起動する
日本語化は今回しない
Eclipse で GlassFish を使えるようにする
Eclipse を再起動
GlassFish をダウンロードする
- https://glassfish.java.net/download.html
- Web Profile と Full Profile がある
- 違いはここで確認できる http://yoshio3.com/2010/02/03/glassfish-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-2/
- 今回は Web Profile をダウンロード
- 展開する
サーバータブから新規サーバーを作成
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 に貼り付けます。
以上で設定は終了です。
使ってみる
- gist にアップしたいファイルを開く
- cmd + alt + g を押す
- パネルが開くので、Gist の説明を入力する(ファイル名はそのままアップされます)
- Private or Public を選択して Gist it をクリック
以上で gist にアップが完了します。
おわり
- お試しで書いたコードも gist にアップしてこう。
- 一度 gist にアップしようとして、パネルを開いたら閉じることが出来ないみたいです。 これは issues にも上がってました。 no way to cancel panel · Issue #20 · rpowelll/gist-it · GitHub
2015-01-17 追記
- キャンセルボタンが追加になっていました。