エンジニアになりたい

エンジニアです

BulletがN+1を検出してくれない事があってそれが分からない

Bulletというgemがある。この人は無駄にクエリが流れていないか、いわゆるN+1になっていないかを見つけて報告してくれる。

github.com

使っていて「あ、N+1になってたんだ。解決しないと」ってなってとても便利。

しかし、ある時Railsのログを見ていたら、明らかにN+1っぽいクエリが流れていたのにBulletがそれを検出出来ていない感じだった。

そしてこのブログを書こうか迷ったのだけど・・・ 結局なぜ検出出来ていないのか分かっていない。 (分かったらまたブログ書く。。)

なので、このブログは「Bulletでも検出出来ない事がある」ということが分かった程度の内容だ。

今回のようなケースがあるので、投げているSQLに不安があるような場合は、下の様に監視しながら開発をした方が良いかもしれない。

$ tail -f development.loog | grep SELECT

cinnamon-2.8.4にバージョンアップした

手元のgentoo環境でcinnamon-2.6.13が動いていたが、通知が機能してくれなかったりしたので「バージョンアップしたら機能してくれるかも?」と思いバージョンアップを図った。

packages.gentoo.org

記事を書いている時点(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では無いので、何があっても自己責任ということで。。

f:id:pro_shunsuke:20151124033817p:plain

無事出てくれて良かった。

Railsにおけるストリーミングによるダウンロード処理について

大容量のCSVファイルなどをRuby on Rails側からダウンロードしようとする際に、ストリーミングでやり取りをしたくなる事がある。それは、直接ダウンロードしようとするとメモリを圧迫しすぎてしまい、上手く行かないからだ。少しずつデータを受け取り、それを少しずつファイルシステムに書き込むように処理をしたい。

rubyにおけるストリーミング処理についてとても丁寧に解説している記事があった。

qiita.com

要約すると次のようになる。

  • 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としてストリーミングのサポートが挙げられており、出来ない。

github.com

Ruby on Rails チュートリアルにコントリビュートした話

最近Railsチュートリアルをやっている。とても学びやすいので、Rails初心者にとてもおすすめ。ちなみに私も初心者。

railstutorial.jp

ある日

Railsチュートリアルを進めていて、日本語の誤字を発見したので、以下の「誤訳を報告する」から報告した。(右の方にある)

f:id:pro_shunsuke:20151027012247p:plain

こんな風に送った。

そうすると、すぐに反応していただいた!

誤字があった箇所を確認したところ、確かに直っていた。早速のご対応ありがとうございましたm( )m

最後に

たとえ中身の技術の事が分からなくても、今回の様に小さな事で貢献出来ることはある。

積極的に貢献していこう。

PHPカンファレンス2015に行ってきた

PHPカンファレンス2015に参加してきた。開催日からだいぶ過ぎてしまったが、その時の自分のツイートをちょっとまとめてみる。

こわくないSymfony2 - 業務で使って気づいた7つの良いところ - @gomachan46

speakerdeck.com

しっかりとしたメンテナンス

徹底した粗結合設計

便利な構造や機能の提供

質疑応答など

聞いた感想

Symfony2の良さがよく分かる発表だった。特に、巨大なフレームワークだけど、徹底的に粗結合にしていることで、フレームワークに流されない構成を作れるところは良いな〜と思った。

発表後も良い感じの質疑応答がなされていて、発表資料を見るだけだと勿体無い!と思った。資料自体も実はSymfony2で出来ていて、そのままDEMOが見れるのはすごかった。

Visual Studio Code - @ayatokura

www.slideshare.net

Visual Studio Codeの特徴など

VSCodeが出来た背景

聞いた感想

クラウディアさんは前に一度見たことがあった。今回はコスプレしてなかった。

Visual Studio Codeって何?どういう機能があるの?といった発表だった。時間いっぱいまで発表だったので、質疑応答が無かったのは残念。VSCodeの中身の説明をしてくれるのかな?と思っていたので、ちょっと残念だった。

あと、前から思っていたのだけれど

これって出来るのでしょうか?知っている人がいたら情弱の私に教えてください・・・。

まとめ

諸事情で前日にかなり遅くまで起きていたため、当日すごく眠かった・・・。午前中は聞けたけど、午後は途中ギブアップして帰ってきた。会場の1Fにはたくさんブースが出ていて、さすがデカいカンファレンスだ、と思った。おみやげもいろいろもらった。

来年は全部ちゃんと聞いて、懇親会まで出たい。

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)

以下を参考に

qiita.com

それで、何でこの問題が起きてしまうのかがよく分かっていない!

誰か教えて欲しい。

とにかく今まではフォントが変更出来なかったことでまともにemacsを使う気になれなかったのだけれど、これでやっと使おうと思えるようになった。本当に良かった。

ちなみに今はMyricaというフォントを使っている。

github.com

Electron, React, Redux, Redux-DevTools, Bootstrapを使ったBoilerplateを自分なりに書いてみた

Electronを使ったアプリケーションを書く時にReduxを使ってReactを書きたい、その時にRedux-DevToolsも動かしたい。見た目が味気ないのでBootstrapを導入したい。

という意図で、雛形を作ってみた。

github.com

使い方はレポジトリ先を参考に。

以下のように表示されるはず。

f:id:pro_shunsuke:20150907001809p:plain

これは、フォームに文字を打つとWelcomeの後の文字が変わるというもの。

こちらは以下を大いに参考にした。

github.com

この generator-redux はちょっとバグが含んであるので、自分のやつは改良してある。

ちなみに私以外で、ElectronとReactとReduxの雛形を作った方がいらっしゃる。

pompopo.hatenablog.com