三流プログラマの雑記

プログラム、ゲーム、株、その他雑記など書いてます。

【Ruby】 楽天証券スクレイピングのGem作成中、、、

楽天証券スクレイピング、、、
Gemの構成をガリゴリやってみた。
必要な処理は各クラスにまとめられたかと。

github.com


ここまで作ったので、サクッと株の詳細情報の取得処理を追加しようかなと
クラス分離したので、処理追加自体はかなり容易な、、、はず、、、

問題は、このGem勉強がてら作成してるけど、使う予定は特にないし、どこを目指しているんだろう、、、(汗
とりあえず保有株の詳細情報の取得まで出来るようにするけど、売買部分までAPI化までするかは悩む。

楽天証券の場合、スクレイピング時、SESSIONIDがURLに入っていたり、クエリパラメータ一部おかしくなるとエラー吐いたりするので、
スクレイピングしてURLを取得 => ベースURLに取得したURLを付加 => 再度スクレイピング、みたいな感じのことをしないといけなかったりする。

最終的に、複数の証券会社で保有している株一覧をまとめて表示したいというのがあったんだけど、
試しに松井証券に登録して、サイトを見てみたら、情報の粒度に違いがあって、作っても実用的ではない感じになりそう。

松井証券の一番困ってしまうのは、詳細ページが外部サイトになっているという、、、

なので、いったんは楽天証券スクレイピング用のGem作って勉強は終了しようかと思う。

mechanizeを用いた、スクレイピングの検証

スクレイピングするなら、「mechanize」を使用するといいよ!

って記事を見かけたので、試しに使ってみることにした。
でも、mechanize だけだとどうにも、スクレイピングしにくい、、、

nokogiri と組み合わせたらいいんじゃない?

ってことで、二つ組み合わせてのスクレイピングを行うことにした。
あとは勉強がてらにGemを作ってみた。
railsの開発とかはやったことあるけど、Gem作成の経験はなかったしね。

bundlerでGemのひな形が作れるなんて、、、知らなかった。
しかもコマンドは以下の一文、チョー簡単!

bundle gem hoge -t
  • t はオプションでテストケースを作成するっていうものらしい。

テストはrspecが採用されてた。
Gitをインストールしておかないとbundleがこけるので注意(実際こけて原因探すのに時間が掛かった、、、)

github.com

題材は楽天証券スクレイピング

取りあえずやりたいこと

  1. 認証のあるページのスクレイピング
  2. 「国内株の保有銘柄」の一覧取得
  3. 特定口座、NISA口座等で情報を別々に取得(普通口座で買うことないのでサンプルが無い!?)

ってな感じを実現してみることに

gemのそれぞれの役割としては、

「mechanize」

  • ログイン処理を行いログイン後のページ情報を取得

「nokogiri」


ってな感じかな?ログイン処理は以下で実装出来る。
ちまちま書かないといけないのかと思うと少し億劫。

    html = agent.get(@url)
    response = html.form_with(name: 'loginform') do |form|
      form.field_with(name: 'loginid').value = @user_id
      form.field_with(name: 'passwd').value = @user_pwd
      form.field_with(name: 'homeid').value = @homeid
    end.submit.content

あとはこのresponseをnokogiriに食わせると操作しやすくなって便利ー!
まあ、、、普通にURLにアクセスしてページ取ってきたのをnokogiriに食わせるのとなんら変わらない感じです。

また、Gemの動作確認も簡単で、「hoge」でGemを作成した場合

hoge/bin/」に移動後「ruby console」を実行するとirbがGemをrequireした状態で起動する。
あとはirb上で動作確認すればOK。
便利だねー、、、

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Ruby+Windows OpenSSLでエラーを吐く|||orz|||

nokogiri触ったついでに「Ruby スクレイピング」なんて調べると「mechanize」を使おうぜ!
って出てきたので触ってみることにした。

    agent = Mechanize.new
    agent.get('https://xxxxx') do |page|
      puts page.title
    end

なんて実行すると、、、

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

とopenSSLのエラーを吐く。
RubyInstallerの証明書が古くてエラーという問題にも関連しているのかもしれないけれど、、、

対処法としては以下を参考にしてみた。
qiita.com

1. 下を右クリックで任意の場所に保存
http://curl.haxx.se/ca/cacert.pem

2. コントロールパネルで、システムから環境変数を設定
SSL_CERT_FILE:任意のパス\cacert.pem」

とりあえず、これで使えるようにはなるんだけど、、、証明書関係ってまた微妙な部分だよね|||orz|||

「setx SSL_CERT_FILE=任意のパス\cacert.pem」をWindows10のコマンドプロンプトで実行するとシステムぬっこわれたんで、無難にコンパネから設定したほうが良い模様。

おかげで、システムの復元からしかもとに戻せないし、システムの復元で戻すとちょいと前の状態に戻って、
RailsのGemの整合性がぶっ壊れるエラー云々、bundleディレクトリ消して入れなおしたら直ったから良かったものの、
システム開発中にこんなこと起きると泣きそうになるよね。

ってことで、Windows10は怖いぞー

【Ruby on Rails】今更ながらにRansackベンリーということを知った。

株を管理するプログラムをちまちま組んでいたわけですが、取りあえず一通り機能は出来たかなーという状態
f:id:morio_1101:20160420081410j:plain
黒塗りの情報は勘弁(笑)
とりあえず、配当+株主優待で収支のバランスを考えてみた。

システム上、このページは必要最低限の情報のみに抑えたかったので、
株主優待の部分はJQueryUIのdialogで制御。

f:id:morio_1101:20160420074918j:plain
最初は登録、更新ページなんて作っていたけれど、、、
使っているとページ遷移が面倒になってきたので、一覧画面完結にした。
Ransackでテーブルソートを入れられたので、見やすいっちゃ見やすくなったかな?
検索フォームとかは、特に必要と感じなかったので、必要になった時に追加する予定。

f:id:morio_1101:20160420074921j:plain
あとは、取得検討株一覧ですね。
楽天証券のお気に入り銘柄もいいんだけど、いかんせん痒い所に手が届かなかった。
なので、パッと必要な情報を見れるようにしてみた。
こちらもRansackを使うことで、テーブルソート楽勝!状態に絞り込み入れた方がいい気がしないでもないので、
またいじくってみようかと。。。

Ransack に関する内容は以下の記事を参考にいたしました。

Railsでransackを使って検索機能を作成する - Rails Webook
wonderwall.hatenablog.com

N+1問題も一応対応する方法もあるらしいので、使い勝手は悪くないのかもしれないですね。
これは「bullet」入れて確認すればいい気もしますが、、、

あとは、サービス登録を、、、と考えていたけれど、
めんどうバッチで何とでもなるかな?という感じだったので、バッチを作って起動すると
ロームのタブでサイトが見れるよ!ってな感じにしてみた。

start /d C:\xxxx\StockList bundle exec thin start -e production

timeout 20 && start chrome.exe --new-tab http://localhost:3000/stocks

【Rails】ハマりどころの多いアセットパイプライン

暇を持て余す状況になったので、株を監理するシステムでも作ろうかと思ったわけです。

f:id:morio_1101:20160417175234p:plain

簡単に作れるように、Rails + Bootstrap + JQueryUIという感じの構成
株のAPIは一般公開されていないので、スクレイピングすることに、とはいえ毎回サイトにリクエスト飛ばすのは微妙なので、SQliteに保持することにしました。
view側で計算式埋め込んだりやらなんやらやってしまっているので、ちょっと構成は考えないといけないですが、取りあえず2日ほどで形には出来たかと。

しかし、Windows環境で無理やり作ったので、BootstrapとJQuery関連はsassのgemを使用することに、
lessってのを使用してみたかったのだけど、残念ながらwindows未対応|||orz|||

せっかくなので、windowsのサービス化してみようかなんて思ったときに、production環境で動かす必要があるのかなーっと。
WEBrickだと微妙なので、軽量化目的で、thinサーバを使用して起動してみたら、、、はいハマりました。

production環境で動かす際のお約束
【アセットパイプライン
Rails 3系から出てきたCSS、JSを結合、圧縮するぜ!!ってやつですね。

bootstrapとJQueryUI関連のファイルを食わず嫌いしないでよ|||orz||| っと言いたくなるんだけど、assetのロード用のパスを通してやらないと、画像やらフォントやらはロードされなかったりするみたい。
とりあえずは、「config/application.rb」もしくは「config/initializers/assets.rb」で【Rails.application.config.assets.precompile】の設定を追加する必要があったりする。

と書いておきながら色々試行錯誤して、、、挫折し、最終的には、、、


Gemfileに以下を追加して、productionを動かすという無念な感じになりましたとさ。

group :production do
  gem 'rails_12factor'
end

heroku今回使用しないんだけどな、、、

qiita.com

アプリケーションがこの12の要素を満たしていることか、、、
しっかり目を通しておこうと思いました(キリッ

MVNO + SIMフリースマートフォン に変更してみた。

毎月の携帯代節約のため、MVNOしてみた。

DoCoMo => BIC SIM(IIJ) に変更

 BIC SIM にした理由
 3GB のところ今は 1GB プラスの 4GB!
 Wi2 300が無料とのことだけど、今のところ入った試しがないので気持ち得?

 音声通話付きで月1,600円(税抜)!

と書いてみるも、自身は業者ではないので、
とりあえずメリット、デメリットをまとめてみる。


◆ MVNOのメリット

・携帯代が8,000円 => 2,000円ぐらいに減る
 (年間の通信費72,000円減はデカいと思う)


◆ MVNOのデメリット

・通話メインだと、結局高くなる
 ※ ただし、通話放題のSIMを提供しているプロバイダもあるので、検討の価値はあるかと
・キャリアアドレスが無くなる
・他の人の携帯にメールを送る際、PCアドレスになるため、迷惑メールの設定がされていると正常に送れなくなる
 (私はSMSで対応しているが、SMSは案外高いので頻繁に使うと微妙)
・キャリアの店舗サービスのような高品質なサポート体制はない
 (お金を出せば、、、あとはネットで調べてが出来ないと辛いかも)


◆ 私の使い方

電話はLINEやスカイプを使用

キャリアアドレスは不要、LINEでやり取りメイン

最終的に、費用面でのメリットを優先して移行することにしました。
あとはビックカメラの店舗で契約して即使えるようになったというのは大きい。

元々がDoCoMoXperia Z3だったので、ビックカメラのカウンタでMVNOの手続き自体は30分ぐらいでスムーズにできました。
auの場合は回線が対応していないので、端末買う必要があるかと

個人的には、nano sim で契約しておくと、simの変換アダプタで端末にあったサイズに変更出来るので、おススメだと思ってます。
※ simサイズ変更するのにも、結構費用が掛かりますからね、、、

MVNO後は、何事もなく携帯自体は使えていましたが、、、

おや? Xperia Z3の様子が、、、

f:id:morio_1101:20160403102344j:plain

開いてはいけない部分が開き始めたので、端末の移行を検討することに|||orz|||

MVNOの場合は、基本的に端末買い替えになるかと思います。
値段もピンからキリまで安いものだと1万を切るし高いものだと青天井。

ミドルクラスのこの端末を購入しました。
Xperia Z3 がハイエンドで10万程したので、お値段3分の1!

メリットとしては電池の容量が5,000mAhなので、一般的なスマホの電池の約2倍相当というところ。
スペックはミドルスペックなので、Xperia Z3よりもっさりしているイメージ。

ゲームでいうと、、、こんな感じ?

・星のドラゴンクエスト
 初期設定のままだと、戦闘シーンがすごくもたつく(倍速プレイすると技選択が辛い)
 省電力、画面解像度低にすると若干マシな動作になるかなというイメージ

・黒猫のウィズ
 たまにもたつくことがあるけど、プレイに支障はない

・白猫
 重いけどプレイ出来なくはない。
 設定変更は必須。

個人的に一番慣れないのがキーボード、、、Sonyのキーボードに慣れるとほかのキーボード使いにくい。
Sonyのキーボード有料アプリでいいから出して欲しいと思う。
右矢印で前の文字コピーとか「、、、」とか打つときに重宝するのでorz

とはいえ、値段的の割には、満足できる一台かと思われます。
バイブレーションの調整があまり出来ないので、バイブの設定した状態で画面を触ると、バイブ音が聞こえてしまうのが難点。
(もうしばらくするともう少し安いZenFone Goが出るけどあまり変わらなそうだよな、、、ゲフゲフ)

iPhoneもSEで日本のSIMフリー端末市場に乗り出したので、今後の携帯市場は荒れそうだなと思ったりしなかったり。

【Ruby on Rails】Windowsで開発するにはどうすればよいか考えてみた。。。

久々に技術的なブログでも書こうかと、、、

Ruby on RailsWindows環境で開発するのは中々骨が折れる作業になったりします。

特にWindows10だと、vagrant環境が上手くいかなかったりで、、、orz

で、どうしたものかと思ったときに、ふと思ったわけです。
クラウドサービス使えばいいんじゃね(・Ǎ・)?

ということで、Cloud9 を使ってみた。

GitHub or Bitbuket のアカウントがあると使えるとのこと

せっかくなので、Bitbuketではなく、GitHubデビューしてみました。

GitHub - rararamorio/c9_sample: cloud9を試すためのリポジトリ

Cloud9はYOUブラウザベースで開発しちゃおうぜ!というスタンスっぽい。

ブラウザベースのbashで日本語のコミットコメント入れようとすると、イラッ☆となるのはご愛敬(^^;

すごい触りレベルでしか試していないけれど、MySQLもCloud9内で作成出来たりするので、
本格的に開発しようと思えば出来なくはないかもしれない。
※とはいえ技術を試すとか、勉強会ぐらいで利用するのがちょうどいいかも

Git flowまで試せていないけど、インストール出来るのかな?
あとはrspec + guardとか回せるのかな?
そうすればテストしやすい環境作れるかもしれない。

あとは、まだプログラム自体は組んでいないので、IDEとしてどれぐらい力があるかかなー

でもブラウザでここまで出来るというのは正直驚いた!

もう少し検証してみようと思えた。