川崎0-1愛媛 (天皇杯…こんなかよ)

久々の等々力。平日夜。新丸子から歩いてどうにかキックオフ前に当日券を買い、中に入った! しかし結果はというと「こんななのかよォ…」

今日のゴールチャンスは最後のポストかバーに当たったやつと、ジェシ(?)のヘッド(GK正面)と小林悠(?)のPKアピールくらいか。いずれもゴールには至らなかった。

サッカー(に限らず、スポーツ全般)見に行くと、嫌でも視力の衰えに気付かされますね。選手の背番号もまともに読み取れねえし、オーロラビジョンのメンバー表も漢字が潰れてる。もしかしてフォントの問題? そんなわけないよね。ここまでの人生を裸眼で過ごして来ました。毎日ずーっとモニタを眺めているコンピュータ業界の人としては珍しいと思いますがこの私の目、そろそろヤバいかもしれないな。

赤外線が見えるサイバネアイはいつ実用化されるんだろう。そんなことを思ったクソ暑い等々力の夜でした。

graphがあったぜSequel

Sequelのjoinの戻り値がどう…というエントリを書いてうだうだ言っていたが、graphというメソッドを使えば一件落着?

[pyg language=”ruby”]
#! /usr/bin/ruby

require ‘sequel’
require ‘pp’

DB=Sequel.sqlite

DB.create_table :tbl1s do
primary_key :id
String :value
end

DB.create_table :tbl2s do
primary_key :id
String :value2
Integer :tbl1_id
end

class Tbl1 < Sequel::Model ; end class Tbl2 < Sequel::Model ; end if $0==__FILE__ Tbl1.insert(:value=>“tbl1data1″) # tbl1s.id=>1
Tbl1.insert(:value=>”tbl1data2″) # tbl1s.id=>2
Tbl2.insert(:value2=>”tbl2data1″, :tbl1_id=>2) # tbl2s.id=>1
Tbl2.insert(:value2=>”tbl2data2″, :tbl1_id=>1) # tbl2s.id=>2
# SELECT * FROM tbl1s INNER JOIN tbl2s ON (tbl2s.tbl1_id = tbl1s.id)
t1=Tbl1.join(Tbl2, :tbl1_id=>:id).first
pp t1 # Tbl1{:id=>1, :value=>”tbl1data2″, :value2=>”tbl2data1″, :tbl1_id=>2}
t2=Tbl1.graph(Tbl2, :tbl1_id=>:id).first
pp t2 # Tbl1{:id=>1, :value=>”tbl1data1″, :tbl2s_id=>2, :value2=>”tbl2data2″, :tbl1_id=>1}
end
[/pyg]

重複するカラム名はTbl1側が普通に使われ、Tbl2側のカラム名は「テーブル名_カラム名」になる。重複しなければそのまま使える。モデルのクラスはTbl1側。joinがこの仕様だったら良かったんだ。

しかしSQL文を見ると、graphメソッドはLEFT OUTER JOINですね。joinメソッドはINNTER JOINですから、当然結果は異なるわけで、joinは両方にデータがなければ出てこず、graphはTbl1にデータがあれば出てくる。

[pyg language=”ruby”]
Tbl1.insert(:value=>”tbl1data3″) # tbl1s.id=>3
Tbl1.join(Tbl2, :tbl1_id=>:id).count # 2(INNNER JOIN)
Tbl1.graph(TBl2, :tbl1_id=>:id).count # 3(LEFT OUTER JOIN)
Tbl1.left_outer_join(Tbl2, :tbl1_id=>:id).count # 3(LEFT OUTER JOIN)
[/pyg]

これまでの結論:やっぱSequelのjoin()の仕様はおかしい。

Suica死すともSuicaポイントクラブは死なず…

個人的な事情があって、1月にSuicaを解約し、精算しました。精算に手数料がかかるのが忌々しいですよね。今はPasmoで生活しています。

ところでSuica時代に登録していたSuicaポイントクラブ。これは特定の店でSuicaを使うことでポイントを貯めていき、溜まってきたらSuicaにチャージすることができるというサービス。Suicaポイントクラブでチャージの設定をした後で、確か1週間以内に券売機でポイントのチャージの操作をするとポイントがチャージされて使えるようになるという、夢のようなサービスだ。しかしながらSuicaのポイントを貯められる店は少なく、例えばBeckersとかで貯まっていた。私はSuica解約までの間、1度だけポイントを交換したことがある。

このSuicaポイントクラブ、登録したSuicaを全て解約したらSuicaポイントクラブも自動解約かと思いきや、解約の操作をしないとデータが残るんですね。最近Suicaポイントクラブのサイトが攻撃を受けたようで、アナウンスのメールが飛んできました。今はメンテナンス中でログインできないですが、次にログインした暁には、きっと退会の申請をしようと思う。

ActiveRecordとSequel

RubyのORMはいくつかあるが、Railsで使われているActiveRecordが最もメジャーで、その次くらいにSequelがあると認識している。

最近ふとしたことで両方を使ってみた感想。どちらも、テーブル名を複数形(sつき)にしなきゃいけなかったり、いろいろ面倒だった。勝手に変化させないで欲しいんだよねー。おれ、プログラム上で語尾を変化させるのは好きじゃないのよね。-erと-orの違いとか、sつけるのつけないの、esやiesになるの、受け身だからedだとか、haveかhasかhadとかhavenとか、isかareか、theをつけるかつけないかとか、datumかdataかなんて、考えたくないじゃん。ただのシンボルなんだから。

そういう細かいアレがあるにせよ、どちらも割と使えたんだけど、ActiveRecordはDB側のconstraintを指定できず、例えばカジュアルにuniqueをつけたいと思ってもできない。Ruby側でvalidationを書くかインデックスにuniqueをつけるかしなければならなかったりして、今のところSequelのほうが使用感は良い。ActiveRecordがモデルの記述を重点しているのに対し、Sequelはモデルがなくてもかなりイイトコまで働ける感じ。

例えばJoinの書き方に関してはSequelのほうが直感的で分かりやすい。現代においてSQLを使うというのはすなわちJoinを使うということであるようなのだが、Sequelはモデルに何も書かなくてもキーをjoinの引数に指定するだけでjoinできる。ActiveRecordはモデルにリレーション(belongs_toだの何だの)をつけないとjoinできない。そもそもjoinじゃなくてjoinsなんだよな…三人称単数現在…そこでそうするか。SQLではJOINSなんて書けないよ。んなこと言うならおめーはActiveRecordsじゃねえのかッコラー!!

ただSequelのjoinは同じカラム名のものがあるときに、間違った(と私が思う)結果が返ってきてしまうことに気づいた。意味的に考えてバグっている気がする。

つまり、こうだ。

[pyg language=”ruby”]
#! /usr/bin/ruby

require ‘sequel’
require ‘pp’

DB=Sequel.sqlite

DB.create_table :tbl1s do
primary_key :id
String :value
end

DB.create_table :tbl2s do
primary_key :id
String :value2
Integer :tbl1_id
end

class Tbl1 < Sequel::Model ; end class Tbl2 < Sequel::Model ; end if $0==__FILE__ Tbl1.insert(:value=>“tbl1data1″) # tbl1s.id=>1
Tbl1.insert(:value=>”tbl1data2″) # tbl1s.id=>2
Tbl2.insert(:value2=>”tbl2data1″, :tbl1_id=>2) # tbl2s.id=>1
Tbl2.insert(:value2=>”tbl2data2″, :tbl1_id=>1) # tbl2s.id=>2
# SELECT * FROM tbl1s INNER JOIN tbl2s ON (tbl2s.tbl1_id = tbl1s.id)
t=Tbl1.join(Tbl2, :tbl1_id=>:id).first
pp t # Tbl1{:id=>1, :value=>”tbl1data2″, :value2=>”tbl2data1”, :tbl1_id=>2}
end
[/pyg]

Tbl1.join(Tbl2)だと、Tbl1のオブジェクトが返るが、その:idはなんとTbl2のものなので、戻ってきたTbl1オブジェクトをそのまま扱っていると大変な事故が起きる。例えばこれで中身を見てdeleteしたら、思ったのと異なるものが削除されてしまう(No!)。これを避けるには、こんなふうに↓書かなければならなかった。

Tbl1.join(Tbl2, :tbl1_id=>:id).select(*Tbl1.columns.map{|m| Sequel.qualify(:tbl1s, m) })

これって、モデルで関連をちゃんと書けばいいという話なんだろうか? 戻るのはTbl2じゃなくてTbl1のオブジェクトなんだから、selectやモデル定義で小細工しなくてもTbl1側のカラム名が優先されるのが当然に思えるんだけど。

川崎1-0新潟 (暑い…)

この、勘弁してほしい暑さ。ビールが飛ぶように売れまくる。しかも客席は満員でコンコースの混み方も半端ない。出遅れてゴール裏のコンコースに立って人垣の後ろから見てました。一人観戦。こんなところに子供たちを連れてこなくて良かった。

始球式の寸劇は暑さもあってちょっとダレましたね。市長挨拶はあろうことか映像のみ。何か大事件でもあったのかい?

ハーフタイムの西城秀樹は良いんだけど、ホントそろそろフロンターレコールのやり方を教えてあげたほうがいいと思う。毎年そう思ってこれまで生きてきた。

試合を迎える状況としては、ワールドカップ後はいつになく好調な川崎。まあ天皇杯で危うくYSCCに負けそうになったり、アウェイ3連戦では痺れる展開で全て勝ち切って3位につけ、等々力に戻ってきた。川崎サポにとっては長く待ち望んだホームゲーム。

試合の方は危うい場面もありつつの1-0。1-0なんて川崎らしくない勝ち方だけど、試合内容的には決定機を何度か提供していたのでまあ、普段通りの川崎だったかな。新潟の決定力がなかったということだろう。決定機が何度か…と言っても実際枠内シュートはほとんど受けなかったように記憶している。川崎もレナトや小林悠、大久保が1点ずつ決めてても良かったシーンがあったよね。小林悠は決めたかったろう。決めた森谷も含めてほとんどみんな同じ形の決定機に至っていた。あそこが新潟DFの弱点なのか、川崎の狙いとする形なのか。どうだろう。

この試合を前にしたスポーツ紙の記事で大久保が「こういうときに取りこぼすのがフロンターレ」と言っていたので、だいぶ彼も川崎を深く理解してきたじゃねーか、と嬉しく思っていた。そこでこの勝利。さすがに次は油断してもしょうがない!? 次はアウェイ柏戦、ホーム浦和戦と続きます。

最高の気分!!

ついに会社の近くにあるセブンイレブンでボールペンを交換できた! おめでとうオレ。おめでとうオレの執念。生きててよかった…

会社の近くと言っても、3〜4番目くらいの近さ。最寄りとかはやはり在庫がなく、ダメだった。関東地方のセブンイレブン密度ってのもなかなかスゴイものがありますね。徒歩圏に何個あるんだよ、っていうね。途中にミニストップやローソン等を挟んでなおかつ、この密度。よくこの密度でビジネスをやってけますよね。

このボールペンを得るまでには紆余曲折があったわけだが、自宅から2番目に近いセブンイレブンに交換に行った2回目では哀れんでくれた店員さんが自分の手持ちのジュースの券を使ってジュースを恵んでくれたりもした。

私はいつしかアイスコーヒーすら頼まなくなっていた。セブンイレブンとぺんてるの業ってのも深いもんだぜまったく。

ちなみに来週くらいから、同等の値段のものと交換できるようになるそうです。それまではどんなに似ていても製品が合わないとPOSが通してくれないらしい。

いい気分!!

最近の悩み。

  • 先日、セブンイレブンで買い物をした際にくじを引き、ボールペンの商品無料引換券が当たった!
  • しかし、その店舗に該当のボールペンが用意されていなかったので、後日取りに来てよということになった
  • 何度か行ったが、そのボールペンがなかなか入荷しない
  • シャーペンで妥協する気はない!!
  • 別の店舗に行ったけどなかったよ…
  • これってボールペンを得るまで、行くたびにアイスコーヒーを買うことになるんじゃないか?

…といった事態になっている。

二ヶ領用水の七夕流し

今日は息子たちとビーンズ武蔵中原に買い物に行く途中、たまたま二ヶ領用水を通りがかって、七夕の笹と金魚を二ヶ領用水に流す行事に参加してきました。

政治家がいっぱい来てアイサツしていった。市長は来てなかったけど、けっこういろんな政治家本人が来ててね。協賛企業も何社かあって、子どもたちもおみやげ(ジュースやお絵かき帳など)を貰って満足。参加者はあんまり多いと思わなかったけど、スペースも狭いし混雑はしていた。

いつも川を見ると葉っぱを投げて遊んでるんですけど、あんなに大きな笹を投げ込んだのは初めてかな。金魚を流すというのも新鮮だったようだった。今日は特別に水を多めに流しているみたいなことを言ってた。どっからだろう。円筒分水より前からずっと増水させてたのかな。

いつもいるカメやカモは姿を消していた。金魚、生き延びてくれてるといいけどな。

歌の売り方

妖怪ウォッチの新ED曲(ダン・ダン・ドゥビ・ズバー!)がiTunesで売り出されました…が、アニメED版と称して1分ちょいの長さ。これってワンコーラスのみかな? ED自体は先週変わったらしいので、すぐに買えるようになったのはいいですけど、ワンコーラスかよオイオイ…

ゲラゲラポーようかい体操第一も、アニメOP/ED版は1月に出て、フル版は4月まで引っ張りました(値段は同じで、アニメ版は無価値になった現在でも売られている)。同じ計算であれば、フル版の発売まで3ヶ月以上も待たされることになります。

仮面ライダーやスーパー戦隊のOP/ED曲も、TVで出てきてからずいぶん経ってから発売になるのでイライラさせられますが、こういう売り方もあるんですね。とにかく早出し版をiTunesで売って、3ヶ月後にフル版を売る。しかし3ヶ月先ってのは長いよなぁ。今朝この状況を確認して、どうしようか迷いましたよ。とりあえず朝は買いませんでしたが、この250円。3ヶ月も耐え切れるのかな? ここで買ってしまったらフル版を買うときにまた迷うような気もするし。それも、たった250円のために。まったく罪深いぜ。

ブッダ曰く!……あらゆる防御を越え汝を責めさいなむ力あり!それは汝自身の思考なり!