south37の日記

ちょろっとメモりたい事とかを書く用。もうちょっとちゃんとしたブログもあります。http://south37.hatenablog.com/

「エンジニアリング」について

僕はどんなエンジニアになりたいか聞かれた時に、よく「自分で問題を解決出来るエンジニアになりたいです!」とかほざいてた訳ですが、ある時、「そもそもエンジニアリングというのは問題を解決する事そのものなんじゃないの?」とのお言葉を頂きました。

なるほど。

つまり、僕はどんなエンジニアになりたいか聞かれた時に、エンジニアリングをするエンジニアになりたいと答えていた訳ですね。

超絶アホっぽい。

でも、自分がクールだなって思うのは、やっぱり今の自分の環境を自分で改善して行ける事なんですよね。DHHがBasecampを作る為にRailsを作った様に、不便な道具を使うくらいなら自分で作っちゃう、みたいな生き方はかっこいいと思います。

今時は多くのプロダクトがOSSで、自分が使ってるものに不満を感じればPull Req投げるとかが出来る訳で、そういうのはとても良い事だしとても良い文化だと思います。

まとめ

エンジニアリングするエンジニアになろう

ビット演算でオプション

とあるgemのソースを読んでたら、オプションを整数のビット演算で管理していました。 arrayに入れてinclude?で見る場合とどれだけ速度に違いが出るのか、気になったのでベンチとってみた。

                      user     system      total        real
include?: 100000  0.750000   0.000000   0.750000 (  0.755159)
bit: 100000       0.010000   0.000000   0.010000 (  0.011721)

おお、けっこう違う...。こういった高速化が大事なんですかね。

ちなみに、ベンチとったコードは以下。

require 'benchmark'

module Constants
  STRICT      = 0
  RECOVER     = 1 << 0
  NOENT       = 1 << 1
  DTDLOAD     = 1 << 2
  DTDATTR     = 1 << 3
  DTDVALID    = 1 << 4
  NOERROR     = 1 << 5
  NOWARNING   = 1 << 6
  PEDANTIC    = 1 << 7
  NOBLANKS    = 1 << 8
  SAX1        = 1 << 9
  XINCLUDE    = 1 << 10
  NONET       = 1 << 11
  NODICT      = 1 << 12
  NSCLEAN     = 1 << 13
  NOCDATA     = 1 << 14

  options = STRICT | SAX1
  n = 100000
  Benchmark.bm(15) do |x|
    x.report("include?: #{n}") { n.times { Constants.constants.include? :NOENT } }
    x.report("bit: #{n}") { n.times { (options & STRICT) == STRICT } }
  end

rubyのシンボル、特に大文字と小文字について

単純に疑問に思ったんですが。 シンボル生成のリテラルである:を使うとき、定数の先頭に二個続けるとその定数の中身が返ってくるっぽいんですが、これは仕様と思っていいんですかね?

Constant = 10
:Constant  // :Constant (シンボルが返ってくる)
::Constant // 10        (定数の中身が返ってくる)

ちょろっと調べてみても分からない...

ちなみに、普通の変数の場合はエラーが出ました。

a = 10
:a  // :a
::a // SyntaxError: unexpected tIDENTIFIER, expecting tCONSTANT

定数を使えって怒られてますね。

rubyのcase

この記事でも言われてるみたいにクールな訳ですが。

クラスの判定も出来るんですね。

def pattern_match(val)
  case val
  when String  then p 'This is String!'
  when Integer then p 'This is Integer!'
  else              p 'This is not String nor Integer!'
  end
end

pattern_match('1')  // This is String!
pattern_match(1)    // This is Integer!
pattern_match(true) // This is not String nor Integer!

casewhen===メソッドが呼ばれる為、要は[クラス名] === [オブジェクト]でオブジェクトのクラスの判定が出来るってだけですが、書き方がクールだなって思いました。

===Moduleで定義されてるっぽいですね。 http://docs.ruby-lang.org/ja/2.0.0/class/Module.html

psコマンドについて

オプションでxつけると制御端末の無いプロセスの情報も表示してくれる訳ですが、この時psコマンド自体の情報も表示してくれるみたいですね。

というか、psは端末から実行してるのに、デフォルトだと自身が表示されないようにしてるのが特別扱いなのか。

まあ、psでイチイチ今実行したばかりのpsコマンドの情報出て来てもな...

Kobitoが便利

最近、ちょろっとメモるとかはてなブログ書く時とかはKobitoを使ってます。 Markdownが書き易いのと、プレビューを同時に見れるのがめちゃくちゃ便利。

はてなブログもMarkdownで書けるのは嬉しいんだけど、プレビュー見る時にけっこう待たされるのがストレスになる...