BulletがN+1を検出してくれない事があってそれが分からない
Bulletというgemがある。この人は無駄にクエリが流れていないか、いわゆるN+1になっていないかを見つけて報告してくれる。
使っていて「あ、N+1になってたんだ。解決しないと」ってなってとても便利。
しかし、ある時Railsのログを見ていたら、明らかにN+1っぽいクエリが流れていたのにBulletがそれを検出出来ていない感じだった。
そしてこのブログを書こうか迷ったのだけど・・・ 結局なぜ検出出来ていないのか分かっていない。 (分かったらまたブログ書く。。)
なので、このブログは「Bulletでも検出出来ない事がある」ということが分かった程度の内容だ。
今回のようなケースがあるので、投げているSQLに不安があるような場合は、下の様に監視しながら開発をした方が良いかもしれない。
$ tail -f development.loog | grep SELECT
cinnamon-2.8.4にバージョンアップした
手元のgentoo環境でcinnamon-2.6.13が動いていたが、通知が機能してくれなかったりしたので「バージョンアップしたら機能してくれるかも?」と思いバージョンアップを図った。
記事を書いている時点(2015年11月24日)では2.6.13がStableで2.8.4がTestingだった。
普通にemerge cinnamonとやるとStableの方がinstallされてしまうので、バージョンを指定してinstallする。
その際にハンドブックに書かれているように /etc/portage/package.accept_keywords
に追加してinstall可能にする。さらに、マスクされているので /etc/portage/package.unmask
にも追加する。
ハンドブック:X86/Portage/ブランチ - Gentoo Wiki
# /etc/portage/package.accept_keywords/cinnamon # required by =cinnamon-2.8.4 (argument) =gnome-extra/cinnamon-2.8.4 ~amd64
# /etc/portage/package.unmask/cinnamon # required by =cinnamon-2.8.4 (argument) # /var/lib/layman/gentoo/profiles/package.mask: # Pacho Ramos <pacho@gentoo.org> (09 Nov 2015) # GNOME 3.18 mask (#561326) =gnome-extra/cinnamon-2.8.4
バージョンを指定してinstallする時は以下のようにする。
% sudo emerge =cinnamon-2.8.4
もちろんStableでは無いので、何があっても自己責任ということで。。
無事出てくれて良かった。
Railsにおけるストリーミングによるダウンロード処理について
大容量のCSVファイルなどをRuby on Rails側からダウンロードしようとする際に、ストリーミングでやり取りをしたくなる事がある。それは、直接ダウンロードしようとするとメモリを圧迫しすぎてしまい、上手く行かないからだ。少しずつデータを受け取り、それを少しずつファイルシステムに書き込むように処理をしたい。
rubyにおけるストリーミング処理についてとても丁寧に解説している記事があった。
要約すると次のようになる。
- ruby標準のWebサーバライブラリであるWEBrickではメモリにファイルを直接読み込ませてしまい上手くいかない
- PhusionPassenger, Thin, Unicornだと完全に受信するまで待つことはなく処理が出来る
結論WEBrick以外は大丈夫という事だが、その事を知らないと厄介なことになる。
例えばローカル開発環境で動作確認をしようとしてテストを実行するとする。するとruby標準のWebサーバライブラリであるWEBrickが動作し、そのせいで本番環境(Unicornが動作する環境など)では動作するはずのコードがローカルでは動作しないという事態が起こる。ここでコードが間違っていると思い込むと、解決するまでに時間を食ってしまう。
WEBrick以外を使用している場合にストリーミングによるダウンロード処理が可能なコード例を載せる。
uri = URI('http://example.com/large_file') Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == 'https')) do |http| request = Net::HTTP::Get.new uri.request_uri http.request request do |response| File.open 'large_file', 'w' do |io| response.read_body do |chunk| io.write chunk end end end end
ちなみに、HTTPクライアントライブラリであるFaradayでは、TODOとしてストリーミングのサポートが挙げられており、出来ない。
Ruby on Rails チュートリアルにコントリビュートした話
最近Railsチュートリアルをやっている。とても学びやすいので、Rails初心者にとてもおすすめ。ちなみに私も初心者。
ある日
Railsチュートリアルを進めていて、日本語の誤字を発見したので、以下の「誤訳を報告する」から報告した。(右の方にある)
こんな風に送った。
@RailsTutorialJP 【誤字】「4.3.1 配列と範囲演算子」の3つ目のハイライト中の「各かっこ」は「角かっこ」だと思います。 https://t.co/Lt9ve6DnLo #Railsチュートリアル
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 21
そうすると、すぐに反応していただいた!
@pro_shunsuke ご指摘ありがとうございます! 先ほど修正コミットをpushしたので、後ほど更新されるかと思います。引き続き、何か気になる点がありましたらお気軽にご連絡頂けると嬉しいです ;) #Railsチュートリアル
— Railsチュートリアル (@RailsTutorialJP) 2015, 10月 22
誤字があった箇所を確認したところ、確かに直っていた。早速のご対応ありがとうございましたm( )m
最後に
たとえ中身の技術の事が分からなくても、今回の様に小さな事で貢献出来ることはある。
積極的に貢献していこう。
PHPカンファレンス2015に行ってきた
PHPカンファレンス2015に参加してきた。開催日からだいぶ過ぎてしまったが、その時の自分のツイートをちょっとまとめてみる。
こわくないSymfony2 - 業務で使って気づいた7つの良いところ - @gomachan46
しっかりとしたメンテナンス
symfony2は6ヶ月おきにリリースされていて安心感 #phpcon2015
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
非推奨な場合に警告出してくれる(@deprecated)。アップデートの手順を示してくれる #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
徹底した粗結合設計
単体利用可能なコンポーネントが集まっている。疎結合で柔軟な開発が可能。 #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
DIコンテナの標準採用。コンテナへの登録が簡単。柔軟な開発ができるのでフレームワークに振り回されることがない。 #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
便利な構造や機能の提供
共通処理はEventListenerにまかせて便利。コントローラーが呼ばれた時、DBにアクセスした時、HTTPリクエストが来た時など、それぞれにフックポイントが用意されている。 #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
プロファイラーが便利。実行されたSQL見れたり出来る。 #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
質疑応答など
symfony2の入門どうやったの? - ドキュメント読む。t-wadaさんのスライドなど勉強になる #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
スッ / Symfony の学びかた http://t.co/07XUqJLk9X #phpcon2015_4
— Takuto Wada (@t_wada) 2015, 10月 3
2に上げるときは作りなおしになる。EventListerはMVCの外にあるが、コードの管理難しくない? - 1系と2系は全然違うので作り直しになる。EventListenerは共通化したものに絞るなど #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
controllerのテストどうやるの?javascript動かないよね? - jsは別でテスト書いている。E2Eテストはrubyで書いていたりする。 #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
symfony2の導入コストは? - TODOアプリやったりで1,2周間くらいで慣れる #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
EventListernerの単体テスト可能? - 可能。普通にUnit Testかける。PHPUnit単体でおk。 #phpcon2015 #phpcon2015_4
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
聞いた感想
Symfony2の良さがよく分かる発表だった。特に、巨大なフレームワークだけど、徹底的に粗結合にしていることで、フレームワークに流されない構成を作れるところは良いな〜と思った。
発表後も良い感じの質疑応答がなされていて、発表資料を見るだけだと勿体無い!と思った。資料自体も実はSymfony2で出来ていて、そのままDEMOが見れるのはすごかった。
Visual Studio Code - @ayatokura
www.slideshare.net
Visual Studio Codeの特徴など
phpconなのにVisual Studio Codeのセッション見てる #phpcon2015 #phpcon2015_6
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
VSCodeってこんなもの。こうやって使います的な話だなぁ #phpcon2015 #phpcon2015_6
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
TypeScriptっぽく書くと「このファイルはTypeScriptじゃないよ」とか怒ってくれる。 #phpcon2015 #phpcon2015_6
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
VSCodeが出来た背景
Web上でコーディング出来るMonacoを研究していた #phpcon2015 #phpcon2015_6
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
聞いた感想
クラウディアさんは前に一度見たことがあった。今回はコスプレしてなかった。
Visual Studio Codeって何?どういう機能があるの?といった発表だった。時間いっぱいまで発表だったので、質疑応答が無かったのは残念。VSCodeの中身の説明をしてくれるのかな?と思っていたので、ちょっと残念だった。
あと、前から思っていたのだけれど
VSCodeをemacsキーバインドにして使いたいんだけど、Ctrl + spaceでマークしたいのに今の所出来ない気がする。もし出来るなら教えて欲しい。 #phpcon2015 #phpcon2015_6
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
これって出来るのでしょうか?知っている人がいたら情弱の私に教えてください・・・。
まとめ
諸事情で前日にかなり遅くまで起きていたため、当日すごく眠かった・・・。午前中は聞けたけど、午後は途中ギブアップして帰ってきた。会場の1Fにはたくさんブースが出ていて、さすがデカいカンファレンスだ、と思った。おみやげもいろいろもらった。
togetterのタオル貰ったー!! #phpcon2015 pic.twitter.com/Wvv9iCVASx
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
個人的にはこれが嬉しい #phpcon2015 pic.twitter.com/nPjacqJKN5
— プロ@しゅんすけ (@pro_shunsuke) 2015, 10月 3
来年は全部ちゃんと聞いて、懇親会まで出たい。
emacsでfont変更出来なかったけどやっと解決できた
もうほとんど個人的なメモ。
今まで手元のemacsだとフォントを変更することが出来なかった。
というか、/usr/share/fonts/
以下を読んでくれなかった。
なんでだろうと思っていたのだけれど、解決できた。
今まで .emacs.d/
以下の設定ファイルに以下の記述をしていた。
;; Commands History を永久保存 (setq desktop-dirname "~/.emacs.cache/") (setq desktop-path (list desktop-dirname)) (setq desktop-globals-to-save '(extended-command-history)) (setq desktop-files-not-to-save "") (desktop-save-mode 1)
これの以下の部分の組み合わせをすると問題が起きていた事が分かった。
(setq desktop-dirname "~/.emacs.cache/") (setq desktop-path (list desktop-dirname)) (desktop-save-mode 1)
Commands History を永久保存するのが目的なら、以下の組み合わせだけで良いらしい。
(setq desktop-globals-to-save '(extended-command-history)) (setq desktop-files-not-to-save "") (desktop-save-mode 1)
以下を参考に
それで、何でこの問題が起きてしまうのかがよく分かっていない!
誰か教えて欲しい。
とにかく今まではフォントが変更出来なかったことでまともにemacsを使う気になれなかったのだけれど、これでやっと使おうと思えるようになった。本当に良かった。
ちなみに今はMyricaというフォントを使っている。
Electron, React, Redux, Redux-DevTools, Bootstrapを使ったBoilerplateを自分なりに書いてみた
Electronを使ったアプリケーションを書く時にReduxを使ってReactを書きたい、その時にRedux-DevToolsも動かしたい。見た目が味気ないのでBootstrapを導入したい。
という意図で、雛形を作ってみた。
使い方はレポジトリ先を参考に。
以下のように表示されるはず。
これは、フォームに文字を打つとWelcomeの後の文字が変わるというもの。
こちらは以下を大いに参考にした。
この generator-redux
はちょっとバグが含んであるので、自分のやつは改良してある。
ちなみに私以外で、ElectronとReactとReduxの雛形を作った方がいらっしゃる。