プログラミングElixirという本の16章 OTP:サーバというのを読んで写経した
GenServer
の使い方が書いてあるところまでやった。
勉強が進んだら練習用にタイマーアプリを書いてみたい。
余談
帰宅してから晩御飯食べて、洗濯物を干してから始めたので、あんまり時間が取れなかった。
仕事が終わってからもプログラミングをするのは久しぶりだった。
家に帰ってから5分でもいいから、毎日Elixirを触るというのを習慣化したい
以上
プログラミングElixirという本の16章 OTP:サーバというのを読んで写経した
GenServer
の使い方が書いてあるところまでやった。
勉強が進んだら練習用にタイマーアプリを書いてみたい。
帰宅してから晩御飯食べて、洗濯物を干してから始めたので、あんまり時間が取れなかった。
仕事が終わってからもプログラミングをするのは久しぶりだった。
家に帰ってから5分でもいいから、毎日Elixirを触るというのを習慣化したい
以上
今まで気恥ずかしくて音声入力を使っていなかったんだけど試しに使ってみたら案外悪くなかった
この記事では私が音声入力を使ってみたところでの感想を書く
以上、感想でした
このあたりのライブラリを使っているのだけど、iOSの開発をするのも久しぶりだし、Moya
RxSwift
は初めて触るので全然進まない
あと画面構成がほとんどTableViewになってしまった。とりあえず自分用だしいいか。
法事で実家に帰った
ちなみに 9/9 にも法事で実家に帰る予定
法事だから仕方がない
一緒に働いている人がもう使わないというので、ちょっと触らせてもらった。 使ってみると結構いい感じだったので格安で譲ってもらった。
ネット配信がことごとく有料だったので見ていなかったのだけど、ニコニコ動画で期間限定無料配信だったので見てみたらハマってしまった
プリンセスの食えない女感が非常に好きです
アニメ制作会社の制作進行の女の子が主人公の物語。
「納品に間に合うのか、間に合わないのか」というようなカタルシスがあって面白くもあり、胃が痛くもなる。
まだ5話くらいまでしか見ていないので、ネタバレはご遠慮ください。
やっぱり進捗だめですといった感じがする。
帰ったらアニメを見るのを辞めたらたぶんもうちょっと進捗が出ると思うのだけど、気づいたら見ているんだよなぁ・・・
capybaraでは find
メソッドを使うとある一定の時間が経過するまでリトライし続けます。
今回は find
メソッドをターゲットに、どうやってリトライし続ける動作を実現しているのかを見ていこうと思います。
ちなみに私は最初それを知らずに 「ページのロードが終わってないからかな?(適当)」なんてアタリをつけて sleep 1
をテストコードに埋めてたりしていました。
しかしそんなことをするくらいだったら Capybara.default_max_wait_time
の時間を伸ばしたほうがいいです。
Capybara.default_max_wait_time
とは find
や all
メソッドを使用したときに探し続けるのに使用する最大の待ち時間です。
ちなみに調べた時点での capybara のバージョンは2.14.3です
まずはエントリーポイントとなるfindメソッドを見ます
31 def find(*args, &optional_filter_block) 32 query = Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block) 33 synchronize(query.wait) do 34 if (query.match == :smart or query.match == :prefer_exact) and query.supports_exact? 35 result = query.resolve_for(self, true) 36 result = query.resolve_for(self, false) if result.empty? && !query.exact? 37 else 38 result = query.resolve_for(self) 39 end 40 if query.match == :one or query.match == :smart and result.size > 1 41 raise Capybara::Ambiguous.new("Ambiguous match, found #{result.size} elements matching #{query.description}") 42 end 43 if result.empty? 44 raise Capybara::ElementNotFound.new("Unable to find #{query.description}") 45 end 46 result.first 47 end.tap(&:allow_reload!) 48 end
https://github.com/teamcapybara/capybara/blob/2.14.3/lib/capybara/node/finders.rb#L31
要素が見つからない場合、
query.resolve_for
したあとに、下記の行が実行されて Capybara::ElementNotFound
が発生します
43 if result.empty? 44 raise Capybara::ElementNotFound.new("Unable to find #{query.description}") 45 end
じゃあどこでリトライの処理をしているかというと
synchronize
にリトライの実装があります。
77 def synchronize(seconds=Capybara.default_max_wait_time, options = {}) 78 start_time = Capybara::Helpers.monotonic_time 79 80 if session.synchronized 81 yield 82 else 83 session.synchronized = true 84 begin 85 yield 86 rescue => e 87 session.raise_server_error! 88 raise e unless driver.wait? 89 raise e unless catch_error?(e, options[:errors]) 90 raise e if (Capybara::Helpers.monotonic_time - start_time) >= seconds 91 sleep(0.05) 92 raise Capybara::FrozenInTime, "time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead" if Capybara::Helpers.monotonic_time == start_time 93 reload if Capybara.automatic_reload 94 retry 95 ensure 96 session.synchronized = false 97 end 98 end 99 end
https://github.com/teamcapybara/capybara/blob/2.14.3/lib/capybara/node/base.rb#L77
(ドキュメント) http://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Base#synchronize-instance_methodhttp://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Base#synchronize-instance_method
Capybara::ElementNotFoundときには
84 begin 85 yield 86 rescue => e
の yield
を実行中のはずなので、87 ~ 93行目の条件に引っかからない場合には
94 retry
が実行され yield
が再び実行されます。
これが Capybara::ElementNotFound が発生されなくなるまでループするという実装になっているということがわかりました。
余談ですが、 click_link
などのメソッドでも内部的には findメソッドを呼び出しているので結局要素が現れるまで待ってくれてるようです
これを読む
GitHub - chriskite/anemone: Anemone web-spider framework
anemone.gemspec
s.require_path = "lib"
libを読むっぽい
↓
lib/anemone/anemone.rb
require 'rubygems' require 'anemone/core'
anemone/core
ってのを読んでるっぽい
↓
エントリーポイント
def Anemone.crawl(urls, options = {}, &block) Core.crawl(urls, options, &block) end
ここであらためてAnemoneの使い方をおさらい
require 'bundler/setup' require 'anemone' url = 'http://kytiken.hatenablog.com/' Anemone.crawl(url) do |anemone| anemone.on_every_page do |page| if page.doc p page.url.to_s p page.doc.at('title').inner_html end end end
今日はここまで
次は
Anemone.crawl
→ anemone.on_every_page
が動くようになるのかを見ていく
2017年3月までで前の会社を退職して、2017年4月から別の会社で働いてます
いつも忘れるのでメモ
docker run -v /path/to/document_root:/usr/share/nginx/html:ro -p 80 nginx