ainameの日記スマートフォン用の表示で見るスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。今回は、自分が今まで利用したRubyでの並列処理を書くためのgemとか知見を紹介します。2016で、Ruby3ではGuildという新しい並列処理のモデル*1が、導入されるというセッションがあったり、concurrent-rubyというgemの開発が流行り初めて居たりと、Ruby界隈でも何となく並列処理がブームきているように感じます。マルチプロセス/スレッドしかしRubyで並列処理するのは言語の仕様としてそれなりに制限があり、他の言語のようにThreadをバンバン立ててマルチコアで計算!爆速化!!みたいなのは難しいです。lock)と呼ばれる仕組みが存在しており、RubyやC拡張の処理自体が1つのプロセス上で同時に実行されることがありません。(逆にいうとGILのおかげでスレッドセーフ性について何も考えずにRubyが書けている!)それでも、並列に処理を実行したいときは普通にRubyでアプリケーションを開発していると訪れて、何とかやっていく必要があります。その場合、以下のような実現方法が考えられます。IO多重化メモリ消費小バグなく動かすためスレッドセーフ性が必要Rubyでの計算処理ではCPU使いきれないのでIO処理と組み合わせる並列処理を書くのは難しい上述のようなプリミティブな実現方法があったとしても、自分で一から全て正しく書くのはとてもハードルが高いことです。async/awaitなど)を利用することが多いです。Rubyの場合は用途に特化した便利な実装がすでにあるのでこの辺を使う所から始めると良いと個人的に思うので紹介と、これまで得た知見を共有します。ParallelSidekiq最初に触れたconcurrent-rubyを使うと他の言語で利用で利用されているような非同期処理の抽象化モデルが利用できますが今回は省略します。Parallelループ処理をめちゃくちゃ簡単に並列化できるライブラリ。プロセスモデル・スレッドモデル両方採用できます。デフォで、マシンのCPU数を調べてその数だけマルチプロセスを起動して処理してくれます。記法も簡単で、Parallel.mapの引数に配列を渡すだけ。各do〜end内の処理が複数のプロセスやスレッドで処理が行われるようになります。mapを利用すればRubyのArray#mapのように処理した結果を配列で受け取ることも可能です(もちろん引数で渡した配列の順番も保持してくれます)。実行内容によってスレッドベースでやると良いのかプロセスベースでやると良いのかは考える(メモリ効率・スレッドセーフ性など)ActiveRecordと組み合わせて使う場合には、connection_pool周りで問題が起きるのでgemのREADME.mdに書いてある再接続処理使うと良いSidekiqいわゆる非同期Jobキューの実装として有名。Sidekiqのプロセスを起動しておいて、RedisにJobを積むと積んだそばからSidekiqのプロセスが随時ワーカーを起動してJobを消化していってくれます。スレッドモデルで並列化をしているので、IO処理などでブロッキングされる場合に効果が出るので、アプリのPush通知を送ったり、メールを送ったり、DBのレコードを更新したりに向いてます。同様のgemにResqueというものがあるが、あちらはプロセスモデルで実現しているのでメモリを余分に食ったりする。Sidekiqでもプロセスモデルで実行した方が良い重い計算処理を行いたい場合は並列数1で複数のプロセスを立てれば良いです。作者の努力によってバージョンが上がるごとにスループットがめちゃ上がったり、gem自身の依存関係が減ったり、エンタープライズ向けの機能も用意されていて徳が高いです。'user_foo_worker_queue')endまとめRubyでも簡単に取り入れられる並列処理の書き方について紹介しました。既存処理を並列化して高速化出来ると気持ち良いので、ぜひ試して見てもらいたいです。来年はconcurrent-rubyやRxRubyを試してみたい。256GBを購入して9月25日に届いて、1ヶ月半ぐらい使ってみての感想。今後海外に行くことも考えてSIMフリー版を購入した。64GBを利用していた。10のスマホを持ち上げたら画面が点灯するのが便利でロック解除のストレスがほぼフリーポートレート撮影が面白くて意外とおしゃれな写真になるので撮影が楽しい6と比べて画面サイズデカくてステレオ音声なので映像見るのが楽しいAbemaTVとかNetflix便利CPUの性能が格段に上がったのを感じる。具体的にこのアプリ使ってる時、というよりはすべてのアプリの初期化処理が早く感じる。Visa系のカードとViewカードを持っていてQUICPayとSuicaのオートチャージが出来ている。コンビニでの支払いは基本iPhone経由で行うようになったし、交通機関もすべてiPhone。昼飯時にはチェーン店系ならQUICPayでいける(ココイチとか)けど、そんなに利用頻度は高くない。Suica支払いのできる店なら利用する程度。系列によってはスーパーでも普通に使えそうなので次、国内で引っ越しを検討するときはその辺も考慮に入れたい。何を購入したかまでは残らないのでちょっと不満がある。いうログがPOSレジ側じゃなくて消費者側にもセキュアに残せるようになったらとても便利だと思う。いうわけで生活の半分ぐらいは現金からiPhoneでの決済になった。Payに集約できるのはとても魅力的。メタ的な存在でかっこいい。ApplePayのおかげでQUICPayという単語を知ったけど、レジにFelicaリーダーが置いてあるところは大体使えるイメージはある。iDでは支払ったことないけど使えるかどうかイマイチわからん。plusはとても満足度高い。英語の勉強を先延ばしにしていた感があるけど、せっかく海外に行くまでにまだ時間があるので少しずつ勉強してみることにした。推測するな計測せよという言葉がある通り、少なくとも今の自分の力量が分からないことには、勉強しようがないなと思ってTOEIC受けようと思った。手っ取り早く本屋に行ってTOEICの公式問題集を買ってきて、帰宅後に解いてみた。ProにBDドライブ繋いでCDをiTunesで取り込みヘッドホン繋いで聞けるようにし、iPhoneのタイマーで時間を正確に図りつつズルとか無しで本番さながらの感じで解いた。リスニング45分、リーディング75分。途中ゆっくり読んでしまったりしたけど残り4問残しぐらいで時間を終えた。問題集だけでは正確な点数はわからないけど、参考スコアで495〜665点のレンジで中間が580点。TOEICを最後に受験したのは学生の頃就活前の5、6年前ぐらいで、当時は500点満たなかった程度だったと思う。今回は自分で思ってたよりは出来ていた気がするけど、海外で仕事で使うには全然足りない。最低限の生活するのは何とかなりそうかも。実際の英語での会話のやり取りを動画とか音声で学習してみようかと思った。家帰ったら毎日1時間ぐらいNetflixで英語字幕つけたり字幕なしで繰り返し海外ドラマ(ゲットダウンが気になる)見続けて、日常会話を聞き取る練習してみたりする。問題集はまだ一回分の試験が残っているので、1ヶ月後にもう一回解いてみて650〜700点ぐらいを目指したい。仕事で使うには800点以上ないと厳しいとのことなので、少なくとも来年実際にTOEICを何回か受ける際には800点ぐらい取れていると嬉しい。最終的にはどっかで会話も練習しないといけないけど、DMM英会話など利用する前に英語話せる妻との会話で練習するという手はありそう。08:30自宅でTOEICの問題を解いてみた広告を非表示にする2016-10-31Swiftでlibwebpラッパーを作っているSwiftでlibwebpラッパーを作っている。試しにMacアプリの練習がてら作ってみるかーというところだった。何も考えずにlibwebpをSwiftのModuleとしてimportして実際に使うアプリを作ってみようとしてみたところ、CのライブラリをSwiftで扱うのが意外と大変なので、一旦ライブラリとして外だししてみようと思い始めた。自分で作るのだるいので誰かいいもの作ってないかと検索してみるとiOS/macOS/Swift周りのWebP界隈は現在こんな状況だった。requests.libwebpのソースコードの中にiOS向けのデコードだけが出来るようになるframeworkをビルドするシェルスクリプトがある。iOSObjective-C製かつiOS向けオンリーのlibwebpラッパー。macで使えないしUIImageに密結合が嫌な感じ。categoryiOS用の老舗のリモート画像表示ライブラリはcocoapodsでlibwebpをとりこんでデコードしているみたい。MacMac向けのOSSの画像変換GUIアプリ。Objective-C製だしWebP対応してない。WebP.最近見つけたSwift製のMacアプリ。シンプルな方のエンコードのAPIしか使ってないので細かい設定が効かない。(Quality以外のパラメーター調整が実務上どれぐらい必要なのか?は知らないけど出来るにこしたことはない。ics-creative/160203_electron_webpこの記事書いてる時に見つけたElectronアプリ。ElectronなのでもちろんJS。いうわけで、以下のような要件でライブラリを作ってみることに。libwebpをラップしてエンコード・デコード出来るmacOS/iOS/Linuxで使えるSwift3ベースでC触ってる感がなくて済むということで色々試行錯誤してv0.0.1のタグを打って、もともと最初に作っていたMacアプリ側でcarthage経由でインストールできた。エンコードしか詳細なAPIに対応してなくてデコードの方は適当。詳細なAPIに対応すると、デコード時にcrop/resizeが出来るらしい。あと、macOS/iOS両方でビルド出来るようにしてあって多分Linuxでもビルドできる状態にも出来そうだけどまだ未対応。github.commacOSだけでよければbrewでインストールしたlibwebpにリンクさえしとけばとりあえず動くけど、iOSでも動かそうとするとlibwebpをiOS端末のCPU向けにビルドしないといけなかったりして、プロジェクト構成作る時点からすでに結構めんどかったりする。Calendarの時に書くのでよろしくお願いします。qiita.com*1:そもそもWebPを使うといいことあるの?って思う人はこの辺を読んでみたりすると良いと思う。ainameの日記この記事を書いたら意外とイギリス行きの5万円程度の格安チケットの話に食いついている人がいたのでまとめておく。そもそも俺自身チケットを買っただけで、普段全然旅行しないしもちろんイギリスにも行ったことない。妻が学生の頃にバックパッカーをやってたりで格安にチケット買う手段に精通していたそうで教えてもらった。いっても特殊なことは全くなくて、単に格安航空券を取り扱うサイトで検索してチケットを買う。それだけのことだった。https://skyticket.jp/international-flights/他にも似たようなサイトを教えてもらったけど自分はskyticket(スマホ向けのUIはよくなかった)が一番使いやすかった。時期によったり出発日によっては値段は上下するけど、適当に検索しても5万付近でチケットが取れる。注意したいのはこのような格安チケットは途中、どこかの国で乗り継ぎが必須だということだ。行程1のように乗り継ぎ時間が45分しかないようなパターンだと、出発の便の離陸が少し遅れたり手続きに戸惑ったりすると乗り継ぎがミスる可能性がある(らしい)。乗り継ぎ間隔は2時間ぐらいあればそこそこ安心できるとのこと。イギリスに行く際にロンドンに近いヒースロー空港に降り立つ場合に注意が必要らしい。厳しい状況になる模様。すれば審査通るのかは各自ググってくれ。行きはヒースロー空港着でも帰りは別の国から出発しても良さそう。その場合は「往復」ではなく「周遊」を選択して検索する。帰りはフランス・パリから帰国しても5万台。各航空会社の旅客機の乗り心地とかは知らんので検索したら良いと思う。タダより高いものはない。Blog|ブログを報告する。