2012年5月28日月曜日

僕歪週末号~『得』の指数関数的増加

絶対にキレイな女の子の方が金を持ってるよ。
キレイな女の子はみんな奢ってくれるやん。
クリスマスや誕生日に「欲しいもん、何?」とか聞かれて、答えたもん貰えるやんか。
自分が「あれ買いたい」と思て貯めてたお金が浮くねんな。
ブサイクな子、全部実費や。
なんなら、旅行でも現地集合、現地解散や。全部自腹!
~ 島田紳助 『松本紳助』にて

あ、週末過ぎてた…

今週にかけて散々語り尽くされた話題のWebサービス、studygift
僕のような下郎には、語り尽くされたもの以上の鋭い指摘や独自の見解といったものはハッキリ言ってありません。下郎らしく
「彼女が仮に所謂『ブサイク』クラスタに属していたといたら、このサービス存在しなかっただろうな」
という程度しか語れません。でも恐らく真理ですよね。この話題を目にする度、冒頭の言葉を思い出した。キレイ・カワイイ子というのは、それ自体で得なのに、マネー社会においては冒頭の言葉や上記サービスのように金銭的にも得をしていく、と(※1)。支援者の男女比ってどうなってるんでしょうかね。

僕は学生生活が楽しくなかった部類の人間ということがあってか、物語の主人公がもし「ブサイク」「ハゲ」「コミュ障」「お笑いセンス低すぎ」とかだったら…という妄想というか二次創作を時々していたのだけど…そういう「雑魚」が主人公だと絵にならなくて全然面白くないんですよ。だから「何故(ソーシャルネットワークでは既に成功者の部類に入る)彼女なのか?もっと他の誰にも見向きもされない苦労人を助けるべきでは?」的な意見があったような気がするけど、サービス一発目としてはやはりある程度「絵になる」要素があった方がいいと思うので、個人的には人選はまあ妥当な線だと思う。

結局、「Web上で声を掛けて数百万円を集める」ってのは、ある意味その人の能力とも言えるし(それだけの地位というか状況を築いたという事実)、単純に彼女のサバイバル能力の高さというのを見せつけられた出来事だった、というのが下郎である僕の感想。

あ、だからその「能力」ってのは果たしてブサイクだったら得られたものなのか?って出だしだったっけか…

※1
もちろん苦労も多いでしょうけど(同姓の嫉妬やらストーカー被害とか)、トータルではやっぱり得だよね。まあ彼女は特別美人って訳ではないと思うけど。

『紳助』に『studygift』って、どちらも今となってはあまり使いたくは無いワードだな。

2012年5月27日日曜日

[Selenium 2] Try & Error集

「window is null」例外対処法

確認バージョン:Selenium 2.2
ブラウザ:Firefox 4
対処法:バージョン上げる ※2.15以降検証済

見てお分かりの通り、かなり古いバージョンでのお話ですが…
コードを実行していたら、突然「window is null」的な例外が発生し、キャッチしてfinally節でWebDriver#close()してるのにブラウザ閉じないという現象に遭遇した。
残念ながら例外メッセージはメモが見つからなかったのでお見せできませんが(何分古いバージョンのお話なもので…)、以下みたいなのだったっけな…
Handling “Selenium (WebDriver) Exception: this.getWindow() is null” ~ Nishant Verma
org.openqa.selenium.WebDriverException: this.getWindow() is null

恐らくブラウザウィンドウの参照を見失ってアクセスできなくなったとかそんな感じの事なんでしょう。

発生原因は不明。ただ発生するページ・しないページがハッキリしていたので、ページ構造とかDOCTYPEとかが関係しているのかもしれない。
対処法は見つからず。ただバージョンを2.15に上げたら全く発生しなくなった。

リッチテキスト要素(iframe)スイッチ例外対処法

確認バージョン:Selenium 2.15・2.18
ブラウザ:Firefox 9
対処法:JavaScript使って入力

ブログの記事エディタのような所謂リッチテキストエディタへの文字入力で遭遇したトラブル。
エディタの実態はiframe要素だったので、定石に従って以下のように書いたら…例外発生。

発生した例外は確か以下(「確か」ですみません…)。
org.openqa.selenium.WebDriverException: Permission denied for to get property HTMLDocument.compatMode


発生原因は不明。「compatMode」とかあるので、これももしかしたらDOCTYPEが関係しているのかも(申し訳ないですが未検証)。
対処法は、JavaScriptでinnerHTMLプロパティセットするというNotスマートな方法しか見つからず。

ちなみにSeleniumバージョン2.2だと発生しませんでした。はいそうです、前述の「window is null」対処によるデグレです。

要素クリックでの「Permission denied」対処法

確認バージョン:Selenium 2.15・2.18
ブラウザ:Firefox 9
対処法1:リターンキー送出
対処法2:フォーカス(orマウスホバー)してからクリック ※効き目無い場合あり

ボタンやリンクを普通に「WebDriver#click()」したら発生。例外は前述のiframeのものと同じです。これも発生するページ・しないページはハッキリしていました。
対処法は以下の通り。

ちなみにこれもSeleniumバージョン2.2では発生しませんでした。


2012年5月6日日曜日

僕歪黄金号〜今年も家計が火の鳥

黄金の日々は皆様いかがでしたでしょうか。
私としましては、以前に技術系エントリでも述べた通り、いろいろな出費により今年も家計が火の鳥がために、「ただの土日がループしている」日々を乱舞しておりました。とりあえず伊坂幸太郎作品の乱読がメインでした。あと久しぶりに山村貞子4部作(『リング』『らせん』『ループ』『バースデイ』)も読んだ。

ちなみに出費の内訳は主に
  • 引っ越し(ついでの家具総買い替え)
  • 歯列矯正
です。前者で50万オーバー。後者は実際の出費はまだですが、100万近くが相場ですよね。30歳到達M字型ハゲのおっさんが歯列矯正って何今更色気づいてんだよって言われそうな気もしますが、いやもう外見とかじゃなくて単純に体の歪みの主因のような気がしてずーーーっと直したかったんですよ。でも基本給手取りはずーーーっと17万円で手が出せず、転職が成功してやっとそこそこの収入になったのでやっと手が出せるようになったと思ったら中年スタートしちゃってたんですよ!

そして引っ越し。今までは手取り17万のくせに家賃9万のマンションに住んでたんですけど、やはり「高かろう、良かろう」なのか、昨年の震災時の被害たるやすこぶる軽微でした(もちろん運が良かっただけかもしれませんが)。そんな具合で他にもいろいろと満足させてくれてたマンションですが、やはり完璧なものなどこの世には存在せず、
  • 大通り沿い
    窓開けてられない。テレビや音楽はノイズキャンセリング機器必須。
  • シンクが狭い。流しが小さい。
    まな板とかでかめの鍋・フライパンは風呂場で体とともに洗っていた。故にふた開けたら陰毛発見すること多々あり。
  • 地域の治安が悪い
    警視庁の犯罪情報マップによれば。幸い、実感するような事はなかったけど。あ、『仁義なき戦い』ってプリントされたTシャツ着てエスカレーターの右側ふさいでいるおっさんを見たことはあった。
ってのが結構鬱陶しかった。こうして改めて振り返ってみると、あまり良い物件ではなかったかもね。

なので、収入も増えたことだし、上記の不満を全て解決してプラスその他譲れない条件(南向き、角部屋など)を満たす物件を、許容家賃も13万円台までとかなり高めに設定してゆっくり納得いくまで探そうと動き出したのだけど・・・その矢先、すぐ隣のマンション(角部屋なのでホント目と鼻の先)の解体工事+新規マンション建築が始まることになり、さらに解体するマンションにアスベストが発見されたなんて知らせを聞かされ、心に焦りが生じてしまったのかもしれない。動き出して2週間、最初に訪問した不動産屋にて、事前にネットで調べてブクマしていた物件は悉くクローズしていることを聞かされ(しかも結構前にとの事。データベース更新しといてよ・・・)、うんざり感とアスベスト除去工事開始が近づいている焦りで、「何か違うな、気になるな」と思いつつも一応条件は満たしていたので「まあここでいいか」と妥協。家賃は3万以上アップの12万半ば。

結果は・・・前述の通り条件は満たしていたのだけど、失敗。その主因は「実際住んでみないとわからん」類いのものでした。

本当に鉄筋コンクリートか?

前の引っ越しの時もそうだったけど、譲れない条件の一つとして『鉄筋コンクリート造り』を掲げていた。繰り返すけど昨年の震災時の被害たるやすこぶる軽微だったので(鉄コンの力かどうかはわからんけど)。というわけで当然新居も当然鉄筋コンクリート造りな訳なんですけど・・・あの、4月にものすごい風強い日が2日程あったじゃないですか。あの風で建物が揺れたんですよ。建物揺れるくらいだから、窓も当然ものすごくガタガタガタガタいって夜うるさくて堪りませんでしたよ。前の家賃9万のマンションだと、台風でも建物はもちろん窓が(睡眠妨害されるほど)ガタガタいう事なんてなかったのに・・・本命の地震においても、同一震度でも揺れは前のマンションよりも大きい気がする。

そして、一番認めたくない、気のせいだと思いたいことが一つ。地震や強風などで建物が揺れる現象が発生した後、風呂場などのスライドドアがつっかえて閉まりにくくなる事が発生。毎回ではないし、しばらくすれば元に戻るのだけど、これって要するに揺れの力で建物が変形したってことじゃないのか?大学生の頃の木造ぼろアパートではそういう事多々あったけど、家賃12万の鉄筋コンクリートだぞ!?

遮音性や断熱性も低い。上下階の部屋のスライドドアのスライディング音が普通に聞こえる。前のマンションでは風呂場で震えるような事はなかったが、現在は前述の木造ぼろアパート時代を思い起こさせる程で、真冬は風呂に入るのが億劫だった(まあ夏は涼しいかもしれんけど)。加えて地味に腹立ったのが、蛇口でお湯をひねって湯がでてくるまでの時間が長い。あんまりにも長いので時間計ってみたら、シャワーで40秒、洗面台に至っては1分10秒という結果!真冬に朝急いでいる時の1分10秒のタイムロスは結構イラつく。

繰り返しますが、家賃12万なんですけど!

本当に東京か?

大都会東京で23区なのに、電車が行きも帰りも10分に1本なんて思ってもみなかった。2・3分に1本に染まりきった精神、そして僕は技術者として周りに遅れをとっていると思っている身なので、このタイムロスには地味にイラつかされる(毎日ってのが辛いね)。

あとは飲食店の少なさ。これは前の地域との比較になってしまうけど、ホント少ない。すき家も松屋も富士そばも無い。オリジン弁当も若菜もない。B級ラーメン・つけ麺屋(味源レベル)も全然無い。ちょっと違うけど徒歩5分圏内のコンビニも無い。昔ながらの飲み屋ばっかり。

手取り17万であった転職前は外食する余裕が無く、まっずい自作カレーをほぼ毎日4年半食してきた反動で、転職して収入が増えた途端外食しまくって幸福感とともに体重も増えて同僚の結婚式二次会で半年前に着られてたスーツが着られず大慌てした身にとっては、選択肢が全然無いこの状況は辛い。「外食ばっかりしてないで自炊しろ」という何者かのお達しかなーと前向きに捉えようとしたけど、一人暮らしの自炊って金銭的コストだけじゃなくて時間的コストも考慮するとそこまでコスパ良くない気がするのだけど。しかも外食の方が確実に美味しいし。

とまあ、これらに関しては事前に調査可能な項目だから、ちゃんと調べとけよって話ですけどね。電車の待ち時間も本読むなりすればいい話だし、そのうち慣れるのだろうけど。でもまさか東京23区で、しかも田舎と呼ばれる区ではなく結構栄えている区の割と大きい駅の周りがこんなんだとは思わなかったですよ。

家計どころか地域一帯が火の鳥に?

くるぞくるぞと言われている首都直下地震。先月、朝日新聞デジタルで以下の記事を発見しました。
上記記事に『首都直下地震の火災被害想定』という画像が記載されていますが、僕の住んでいる地域、真っ赤です。確かに木造家屋がものすごく密集してるわ。地震に対しては『揺れ』の事しか頭になく、火災に関しては完全に見落としてた・・・

他には、駐輪場使用が有料(登録料が必要)だったり、インターネット回線の実効速度が前の物件の3分の1以下だったり・・・もう踏んだり蹴ったりです。
前と比べて確実に良くなったと言えることは、ゴミ捨ては時間・曜日気にせずいつでもOKって事くらい。

皆様、住宅選びは慎重に!

噂には聞いていたけど、角川文庫版望郷編(COM版)のカット具合は半端なかった。太陽編の書き直し具合も然り。でも前述の望郷編を除けば、基本的には角川文庫版の方が好きかな。






[Selenium 2]マウスホバーの実現方法

いい加減にSelenium2ネタを消化してきます。
今回はマウスホバーの実現方法です。ただ最初に断っておきますけど、ページの作りか何かの影響を受けているのか、ページによっては全くマウスホバーイベントが発生しない場合がありました。もし100%確実に成功させる方法をご存じの方がいましたらご教示ください!

試した環境

  • ブラウザ:Firefox 9
  • JDK 6
  • Selenium 2.18
  • Windows 7 64bit
SeleniumとFirefoxのバージョンはちょっと古めとなっていますが、多分バージョン11とかでも大丈夫だと思います。
このエントリ書く当たって自宅PC環境で試してみたんですけど、現時点のSelenium最新バージョン2.21はFirefox12に対応していないようで動かず…

Actionsオブジェクト使用する方法(ただし非推奨)

Actions#moveToElementで実現できます。できるんですけど…

これだとマウスホバーがキープされません。よって「マウスホバーで動的に表示されたメニューをクリック」したい場合、以下のコードではダメです。

正しくは以下のコードです。ホバーとクリックを間髪入れずに連続実行しています。

「正しくは」といったものの、上記はただ連続実行しているだけで結局ホバーキープはできていないので、厳密には正解ではありません。実際、ホバー後のクリックが間に合わずにエラーとなってしまったケースが多々ありました。
補足
もしかしたらActions#clickAndHold()使えばいいかもしれん(厳密にはマウスホバーではないけど)。けど前述の通り自宅環境だとSeleniumが動かないので試せない。

ホバーキープしたい場合はDefaultSeleniumかますのが確実

以下の方法だとホバーキープされました。

ただし、冒頭でも述べましたが、これだとそもそもマウスホバーイベントが全く発生しないケースが少ないですがありました。
あと、z-indexが正しく解釈されないのか、動的表示したメニューをクリックしたとき、メニューではなくその奥にある要素がクリックされてしまうということも。

何かSelenium WebDriverってまだまだバグが多いな…何か忘れたけどびっくりするようなデグレが発生してた事もあったような。

参考

2012年5月5日土曜日

[MySQL]レプリケーション環境構築手順 for メモリかつかつ人 vol2~本題のレプリケーション設定

黄金の日々を皆様いかがお過ごしでしょうか。
私としましては、いろいろと出費が嵩むことがありまして、2年連続で家計は火の鳥となっておりますが故、「ちょっと長めないつもの週末」を謳歌しております。ていうか結婚した輩ってホント付き合ってくれなくなりますね!

さて、「レプリケーション環境構築手順」とかほざいておきながら、レプリケーションのレの字も無かった前回の続きです。Google Analyticsで検索ワード確認してみたら「MySQL レプリケーション」といったワードが幾つか見つかり、非常に心苦しい限りです詐欺師です…

というわけで今回のテーマは「脱・詐欺師」、要するに「タイトルに即した内容を書く」です。
ちなみに人から時々「話が長い」と言われます。

試した環境

  • CentOS 5.6(64bit), 6.2
  • MySQL 5.1.61

マスター

my.cnf設定
最低限、サーバーIDとバイナリログ名を設定。サーバーIDは他のサーバーとかぶらない値に。
[mysqld]
server-id=1
log-bin=mysql-bin
# dataディレクトリ以外に作成したけりゃ以下のように絶対パスで指定
# log-bin=/var/lib/binlog/mysql-bin
設定したら再起動。
レプリケーション専用ユーザー作成

マスターデータのスナップショットを作成
レプリケーションを開始するに当たって、当然マスタとスレーブのデータを同一にしておく必要がある。

まず、設定作業中にマスターデータが更新されてしまわないよう、書き込みロックをかける。
mysql> FLUSH TABLES WITH READ LOCK;

そしてマスターデータのスナップショットを作成。データフォルダをアーカイブしてしまえ。
# cd /var/lib/mysql/
# tar cpf /tmp/master_snapshot.tar .
バイナリログのPositionをメモ
「スレーブが起動した際、バイナリログの読み込み開始位置」を表す。
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |              |                  |
+------------------+----------+--------------+------------------+
書き込みロック解除
バイナリログのPositionさえメモしてしまえば、スレーブの設定完了前にいくら更新かかろうが恐くない。
mysql> UNLOCK TABLES;

スレーブ

マスターデータを展開
展開前にスレーブ停止するのをお忘れ無く。
もしマスターでバイナリログなどをデータフォルダ配下に出力していた場合は、スレーブ側では当然不要なので削除しちゃってください。
# /etc/init.d/mysqld_slave stop
# cd /usr/local/mysql/var
# rm -rf *
# tar xpf /tmp/master_snapshot.tar -C /usr/local/mysql/var/
# rm msyql-bin.00000X mysql-bin.index
my.cnf設定
最低限サーバーIDを設定。
[mysqld]
server-id=2

# スレーブのバイナリログやリレーログの名称やパスを指定したけりゃ以下のように
# log-bin=/usr/local/mysql/mysql-bin
# relay-log=/usr/local/mysql/mysql-relay-bin
# relay-log-index=/usr/local/mysql/mysql-relay-bin
マスター情報セット
ここでの肝は「MASTER_LOG_FILE」と「MASTER_LOG_POS」です。メモした値を設定してください。
mysql> CHANGE MASTER TO
-> MASTER_HOST='localhost'
-> , MASTER_PORT=3306
-> , MASTER_USER='repl'
-> , MASTER_PASSWORD='password'
-> , MASTER_LOG_FILE='mysql-bin.000001'
-> , MASTER_LOG_POS=106;
mysql> START SLAVE;
起動!
mysql> START SLAVE;
動作確認
「Slave_IO_Running」「Slave_SQL_Running」が「Yes」で、「Last_IO_Error」が空ならOKです。
mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.XX.XX
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 257
Relay_Log_File: virtualbox-relay-bin.000002
Relay_Log_Pos: 402
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
…

それでは良きレプリケーションライフを!

参考