破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

RubyのArrayとかHashのuniqueに関する挙動のメモ

RubyのArrayにはuniqってメソッドがあるじゃん?

irb(main):001:0> [:foo, :bar, :baz, :foo]
=>  [:foo, :bar, :baz, :foo]

irb(main):002:0> [:foo, :bar, :baz, :foo].uniq
=> [:foo, :bar, :baz]

この辺はあたりまえだが、 たまにお世話になる多重配列になると脳内インタプリタの挙動が怪しかった。

irb(main):003:0> [[:foo, 1], [:foo, 2]].uniq
=> [[:foo, 1], [:foo, 2]]
irb(main):004:0> [[:foo, 1], [:bar, 1]].uniq
=> [[:foo, 1], [:bar, 1]]
irb(main):005:0> [[:foo, 1], [:foo, 1]].uniq
=> [[:foo, 1]]

結果を見れば当たり前といった感じだった。 ちなみに、Hashはこんな風に動くらしいっす。

# 当たり前
irb(main):006:0> { foo: 1, bar: 2, foo: 1 }
=> {:foo=>1, :bar=>2}

# ココ重要
irb(main):007:0> { foo: 1, bar: 2, foo: 2 }
=> {:foo=>2, :bar=>2}
# もう一回
irb(main):008:0> { foo: 1, bar: 2, foo: 2 }
=> {:foo=>2, :bar=>2}

keyとvalueがともに重複する場合は、ランダムではなく後方の値に上書きされるらしい(?)

ちなみに、どうしても1つにkeyに複数のvalueを持たせたかったら、

irb(main):009:0> h = Hash.new { |h, k| h[k] = [] }
=> {}
irb(main):010:0> h[:foo] << :bar
=> [:bar]
irb(main):011:0> h[:foo] << :baz
=> [:bar, :baz]
irb(main):012:0> h
=> {:foo=>[:bar, :baz]}

って書けばいいらしいよ!

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

.irbrcを使って、irb起動時によく使用するコードをメソッド化する

意外と知られていないようですが、irb コマンドは起動時に.irbrc というファイルを読み込みます(*1)。ここに様々な設定やメソッドを書くことができます。

例えば、自分はrails consoleでよく

irb(main):001:0> User.find_by_user_name 'yachibit'

というコードをよく書きます。毎回これをタイプしてもいいのですが、面倒なので.irbrcに以下のようなメソッドを書いています。

def me
  User.find_by_user_name 'yachibit'
end

こうしておくと、

irb(main):001:0> me

だけで目当てのレコードを引くことができます。 他にももっと便利な使い方ができそうですね。 便利な使い方がありましたら、ぜひ教えて下さい。

※1: 最初にホームディレクトリを読み込み、ホームディレクトリに .irbrc が存在しない場合は、カレントディレクトリの .irbrc, irb.rc, _irbrc, $irbrc を順番にロードしようと試みるそうです。

ref: http://docs.ruby-lang.org/ja/2.1.0/library/irb.html

初めてのRuby

初めてのRuby

「達人プログラマー」を読み始めました

言わずとしれた古典的名著「達人プログラマー」を読んだ。(今更?というツッコミはご容赦頂きたい。) ページをめくるたびに次々とアンダーラインを引きたくなる箇所が出てるく。 気を抜くとアンダーラインで溢れ返ってしまう、そんな本だった。

本書は方法論が書かれた技術書であると同時に、プログラマーとしての心構えが記された哲学書でもある。まえがきにはこうある。

達人プログラマーになるためには、常に自分自身が何をやっているかということを考え続ける必要があります。これは、今行っている作業をどこかで1度だけ検証するということではありませんー日々の意志決定、あるいは各開発での意志決定すべてに対する継続的かつ批判的な評価です。絶対に漫然と行ってはいけません。絶え間なく考え続け、リアルタイムで自身の作業を批判するのです。

こういった一文一文から、著者のプログラミングや仕事への真摯で情熱的な姿勢がひしひしと伝わってきて、襟を正される。
以下は本書を読んだ中で、特に筆者の心に響いた箇所をまとめたい。

責任を持つこと

他人や他の何かを非難したり言い訳をしてはいけません。すべての問題をベンダー、プログラミング言語、管理、同僚のせいにしてはいけません。(中略)彼らは問題を解決するためにあなたに従事しているのであって、弁解のためにいるわけではないのです。

まず悪いニュースを報告する前に、何かできることはないでしょうか? おそらく追加のリソースが必要となるかも知れません。しかし、こういった助けが必要であることを要求したり認めることを恐れてはいけません。

大きく声を上げる前に中途半端な言い訳を無くすことです。もし何か言わないと気が収まらないのであれば、猫にでも言うことです。

例えば、他人のミスが原因でバグが発生したとしよう。そのバグは、他人が原因で発生したものなのか、自分が原因で発生したものなのかなどは関係ない。それは避難すべきものではなく、「自らの問題」として解決を試みるべきものなのである。

  • いい加減な言い訳よりも対策を用意すること

道具に拘ること

道具は職人の考えたこととその作品をつなぐパイプとなり-つまり職人の手の一部となるわけです。(中略)道具はあなたの能力を増幅します。道具が良ければ、より簡単に道具を使いこなせ、より生産的になれるのです。

あなたは一芸に秀でていなければならないのです。単に直線的にタイピングを行い、マウスを使ってカット・アンド・ペーストをしているだけではだめなのです。強力なエディターとあなたの指先を使えば、高い生産性を上げることができるようになるのです。

筆者は普段、テキストを編集する際にvimを使用しているが、"ふつうに使える"程度のレベルであり、熟達しているとはとても言い難い。一方、筆者の周囲の凄腕プログラマー達は、ほぼ例外なくエディターを使いこなし、肉眼で追うことが難しいほどの、まさに思考の速度でテキストを切り刻んでいく。

  • 一つのエディターを熟知すること

誇りと愛着

達人プログラマーは責任逃れを潔しとしません。代わりにチャレンジを受け入れること、技術を発揮することに喜びを感じるのです。我々が設計やコードに対して責任を持てるのであれば、我々自身の仕事に誇りを持てるはずです。

匿名性が、だらしなさ、誤り、無精、まずいコードの温床となり、特にプロジェクトが 大規模になると、それが顕著に現れてくるのです。

我々は所有することによって誇りを持つべきなのです。(中略)それが本当のプロの仕事です。それが本当のプロによって記述されたものなのです。

我々が日々生産するコードはGitに記録されていく。記述者に関する情報はauthorとしてログに記される。我々は日々のコード1行1行、1コミット1コミットに責任と誇りを積み重ねていかなければならないのである。

  • あなたの作品に署名すること

と簡単に纏めてみたものの、筆者はまだ本書を”読んだ"という段階に過ぎない。ここに書かれていることは、無意識に実践できるようになるまで反復し、血肉とせねばならない。
そのためには、本書を常に手元においておく必要があるだろう。日々の仕事の取り組みを批判的に振り返り、本書の記述と照らしあわせて評価し、軌道修正を試みる。そうしたプロセスを、この本がボロボロになるまで(※1)幾度と無く繰り返えさねばなるまい。そういう意味では、本書を”読み終えた”というより、"読み始めた"と表現しておいた方が正確なのだろう。

※1: 電子化したのでボロボロになることはないのだが。

達人プログラマー―システム開発の職人から名匠への道

達人プログラマー―システム開発の職人から名匠への道

  • 作者: アンドリューハント,デビッドトーマス,Andrew Hunt,David Thomas,村上雅章
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/11
  • メディア: 単行本
  • 購入: 42人 クリック: 1,099回
  • この商品を含むブログ (347件) を見る

このコンピュータ書がすごい! Forkwell 版

元ネタは毎年、毎年年始にジュンク堂書店さんで開催されるこのイベント。
弊社の知の賢人達が 、若手社員(主に俺氏)の読むべきコンピュータ書を挙げてくださいました。

f:id:yachibit:20140319212826p:plain

f:id:yachibit:20140319213052p:plain

f:id:yachibit:20140319213150p:plain

f:id:yachibit:20140319214131p:plain

f:id:yachibit:20140319214957p:plain

f:id:yachibit:20140319215004p:plain

f:id:yachibit:20140319215009p:plain

f:id:yachibit:20140319215014p:plain

f:id:yachibit:20140319215021p:plain

f:id:yachibit:20140319215027p:plain

f:id:yachibit:20140319215033p:plain

(参考になったという方は文中のリンクから買って頂けると嬉しいです( ˘ω˘)")

リーン開発の現場

f:id:yachibit:20140314224707p:plain

リーン開発の現場 カンバンによる大規模プロジェクトの運営

リーン開発の現場 カンバンによる大規模プロジェクトの運営

Railsでブラウザ上のエラー表示をdevelopmentとproductionで同じにする

Railsのconfigにはconsider_all_requests_localという設定項目があって、こいつをtrueにすると、すべてのエラーをブラウザに表示をするかことがでいる。逆に、falseに設定すると、ブラウザには詳細情報が表示されない。

デフォルトでは、
development環境はtrue
production環境はfalse
になっている。

エラー時の動作を確認する際、developmentでもproductionと同様の動作をさせたいときは、こいつをconfig.consider_all_requests_local = falseとしてあげればproductionと同様の動作を確認できる。

ちなみに、設定ファイルはここにあります。
- development: config/environments/development.rb
- production: config/environments/production.rb

ref:
http://guides.rubyonrails.org/configuring.html#rails-general-configuration