SeleniumDriverのエラー(unable to connect to chromedriver 127.0.0.1:9515)

新年早々、seleniumでscrapeしようとしたら、タイトルのエラーとなった。

一般的な解決方法は

ググると結構見つかって、chromedriver-helper をuninstallして homebrew で chromedriver入れろとのこと。
 
現時点ではchromedriverはhomebrewでは扱っていないため(homebrew caskにはある)以下からdownloadしてpathを通した場所に置いてやる。
Downloads - ChromeDriver - WebDriver for Chrome
 
しかし、chromedriver単体では動作するが、ruby経由では動作しない。

原因

chromedriver-helper の古いバージョン(1.2.0)はchromedriver を同梱していたようで、 rbenv環境だとshims以下にwrapperファイルが作られていた。
これがgemのuninstall時に消えていなかった。

$ which chromedriver
/Users/rochefort/.anyenv/envs/rbenv/shims/chromedriver

とりあえず、こいつを消して解決。
 

shims以下のファイルとは?

rbenv側の問題にも思えるが、そもそもshimsとは何だろう?
ググってみると以下が詳しい。
rbenvコードリーディング

shimファイルとは各バージョン差異を埋めるためのファイルであり、rbenvの場合は、ruby・irb・gemなどのファイル名で作成されるシェルスクリプトになります。

なるほど、rbenv内のrubyから該当の実行ファイルが消えたかどうかを管理するのが面倒なので、削除はしていないのかも。

2018買ってすごく良かったもの

色々向き合うべきものが多く、1年ちょっとブログの更新が滞っていました。
2019年はもう少し更新して行きたいです。
まずはリハビリ程度に書きやすい題材で書いてみます。
 

LOWYAのテレビボード

引越しついでにテレビボードを買い換えたのですが、このLOWYAという家具屋さんがおしゃれかつ安くて とても気に入りました。


公式リンクの方が写真たくさんあるので載せます。
国産ローテレビ台 70V型対応 木製 半完成品 ヴィンテージ調 [幅178.6] [日祝配送不可] | 【公式】LOWYA(ロウヤ)|家具・インテリアのオンライン通販

個人的には、上段が空いているところにPS4を置きたい、下にお掃除ロボを収納したいという点を満たしつつ、 見た目もおしゃれな上、ケーブル収納などの日本製の家具特有の細かいこだわりがあり大満足の一品です。

Philips Hue スターターセット

Alexa 連携させたくて購入。
お値段がそこそこするので(これプラス照明も買い替えが必要だったり追加のランプ買ったりで)ので1or2年ほど悩みましたが、欲しい思いが変わらないので購入しました。
電球色や明るさの変更など、その時の気分に合わせて操作できる点はとても良いです。
「アレクサ、電気を電球色にして」、「アレクサ、電気を暗くして」などといった感じで利用。
ちなみに追加で購入した電球はiKea製のものを利用しています。それほど変わらないし、若干安いのでこちらも個人的には満足。

おしゃれ照明

なんとなく安く売っていたシーリングライトを使い続けてい他のですが、Hue購入ついでに念願のおしゃれ照明デビュー。

お掃除ロボ

これも引越しついでに購入。
床にモノを置かない状態でしか利用できないので、必然的に床にモノを直置きすることが減りました。
たまにケーブル類に絡まったりしますが、そこら辺も含めて可愛らしくて良いです。
ルンバ使ったことないので比較しようがないですが、今の所これで満足。

iPad Pro

Paypay祭りで購入。
絵はそんな書かないのでpro必要ないかもしれませんが、漫画を横向きでめくりながら見たりyoutube見たりするのに使っています。 購入時に触って見たFolio(キーボード&カバー)の出来が素晴らしいので、paypayの割引で購入しようか検討中。
apple pencilも使って見た所良さそうなので、こちらも検討中。

Apple iPad Pro (12.9インチ, Wi-Fi, 64GB) - スペースグレイ

Apple iPad Pro (12.9インチ, Wi-Fi, 64GB) - スペースグレイ

Ruby throwの使いどころ

例外ではなく、制御構造の話。

Effective Ruby

Effective Ruby

項目27 スコープから飛び出したい時にはraiseではなくthrowを使おう

catchとthrowはgotoの安全バージョン。

StopIterationを使った例

begin
  @characters.each do |character|
    @colors.each do |color|
      if player.valid?(character, color)
        raise(StopIteration)
      end
    end
  end
rescue StopIteration
  # ...
end

catchを使うと

よりsimpleに書ける。throwの第二引数に値を渡せるのも良いね。これ知らなかったな。

match = catch(:jump) do
  @characters.each do |character|
    @colors.each do |color|
      if player.valid?(character, color)
        throw(:jump, [charcter, color])
      end
    end
  end
end

覚えておくべき事項

  • 複雑な制御フローが必要な時には、raiseではなく、throwを使うようにしよう。throwを使うと、ボーナスとしてスタックの上にオブジェクトを送ることができる。catchの戻り値はそのオブジェクトだ。
  • できる限り単純な制御構造を使おう。catchとthrowの組み合わせは、単純にreturnでスコープから抜け出すメソッドとそれに対する呼び出しで置き換えられることが多い。