「初めてのRuby」 4章 文字列(その2)
4.3 正規表現
メタキャラやオプション、キャプチャなど、Perlで慣れた方法で一通り書ける。
Ruby 1.9から使われている鬼車ライブラリは名前付きキャプチャもできる賢い子!
# -*- coding: utf-8 -*- today = "2012/02/29 Wed 寿司食べたい" if /^\d{4}\/02/ =~ today #=>2月の場合はマッチ puts "February" end if %r!^\d{4}\/02! =~ today #=>↑を%記法で書いた puts "February" end if /wed/i =~ today #=>iオプションで大文字/小文字を無視 puts "水曜日" end if /^(\d{4})\/(\d{2})\/(\d{2}).+寿司/u =~ today #=>uオプションによりUTF-8の"寿司"にマッチ。キャプチャもできる。 puts $1 + " 年 " + $2 + " 月 " + $3 + " 日はお寿司の日!" end if /^(?<year>\d{4})\/(?<mon>\d{2})\/(?<day>\d{2}).+寿司/u =~ today #=>↑をRuby 1.9から使える名前付きキャプチャで書いた puts year + " 年 " + mon + " 月 " + day + " 日はお寿司の日!" end
調べたらPerlも5.10からは名前付きキャプチャが正式サポートされてた。
(仕事じゃ5.8使ってるから使う機会は少なそうだけどw)
4.4 部分文字列へのアクセス
文字列に添字演算子[]を付けることで、文字列の一部を取り出せる。
(面倒なのでRuby 1.9の例のみ)
# -*- coding: utf-8 -*- lunch = <<"EOS" 02/27 タイ料理 02/28 中華料理 02/29 黒豚しゃぶしゃぶ EOS print lunch[6], lunch[7], lunch[8], lunch[9] #=>タイ料理(一文字ずつ位置を指定) print lunch[6, 4] #=>同(開始位置と長さを指定) print lunch[6..9] #=>同(最後の文字を含む範囲指定) print lunch[6...10] #=>同(最後の文字を含まない範囲指定) print lunch[/.{2}料理/u] #=>同(正規表現で指定) print lunch[-9], lunch[-8] #=>黒豚(末尾から一文字ずつ位置を指定) print lunch[-9, 2] #=>同(末尾からの位置と長さを指定)
4.4.1 更新
指定した文字を変更する方法色々。
# -*- coding: utf-8 -*- lunch = "タイ料理,中華料理,しゃぶしゃぶ" lunch["しゃぶしゃぶ"] = "黒豚しゃぶしゃぶ" puts lunch #=>タイ料理,中華料理,黒豚しゃぶしゃぶ(指定した文字列を変更) new_lunch = lunch.gsub(/料理/u, "飯") puts new_lunch #=>タイ飯,中華飯,黒豚しゃぶしゃぶ(全てのマッチする文字列を変更) lunch.gsub!(/料理/u, "飯") puts lunch #=>タイ飯,中華飯,黒豚しゃぶしゃぶ(↑の破壊的なバージョン) lunch.gsub!(/タイ料理/u, "パッキーマオ") lunch.gsub!(/中華料理/u, "ワンタン坦々麺") puts lunch #=>パッキーマオ,ワンタン坦々麺,黒豚しゃぶしゃぶ(今日までの昼飯)
例を書くのに考えすぎて眠くなってきたのでここまで。。
「初めてのRuby」 4章 文字列(その1)
4.1.2 バックスラッシュ記法
ダブルクォートで囲んだ場合はタブ文字が有効で、シングルクォートの場合は無効、と一般的な仕様。
pだと変数展開が無効化されてしまったのでprintで出力。<<はビットシフトと同じ記述だけどここでは文字列の連結を意味している。
print "abc\tdef" << "\n" #=>abcdef<改行> print 'abc\tdef' << "\n" #=>abc\tdef<改行> p "abc\tdef" #=>"abc\tdef"
4.1.3 式展開
ダブルクォート文字列中の#{...}で囲んだ部分は式として解釈され、式の最終的な値が文字列として出力される。
kazu = 5 print "kazu = #{kazu}" #=>kazu = 5(変数を展開) print "kazu = #{5}" #=>kazu = 5(数値オブジェクトをそのまま置いてみた) print "atai = #{atai = 3; atai += 2; atai}" #=>atai = 5("式"とあったのでずらずら書いたらちゃんと最後の結果が出た)
文字列化メソッド
ダブルクォート文字列中の式展開では、対象オブジェクトのto_sメソッドにより文字列オブジェクトに変換した結果が出力される。
print "#{123}" #=>123(数字オブジェクト 123 を文字列オブジェクト "123" に変換に変換した上で出力) print "#{"123"}" #=>123(文字列オブジェクト "123" を出力) print "#{123.to_s}" #=>123(↑と同じ)
他にもオブジェクトの内部状態を把握しやすい形式で出力するinspectメソッドというのもある。
ちょいちょい不思議な挙動を見せていたpの出力もこれによるもの。
print nil.to_s #=><空>(nilオブジェクトを文字列に変換した上で出力) print nil.inspect #=>nil(nilオブジェクトの内部状態を出力) p nil #=>nil(↑と同じ)
4.1.4 バッククォート文字列
Perlと同様にバッククォートで囲んだ内容はシェルにより処理される。
p `date` #=>"Tue Feb 28 01:39:32 JST 2012\n"(dateコマンドを実行) p `date | wc -m` #=>"29\n"(dateコマンドの出力をwcコマンドにパイプ) p `echo $SHELL` #=>"/bin/bash\n"(環境変数 $SHELL を表示)
4.1.5 パーセント記法
Perlでいう q/hoge/ みたいなやつ。
なんとなく/(スラッシュ)で囲んで見たが他の文字も使える点も同じ。
print %q/single\tquote\tdesu!!/ #=>single\tquote\tdesu!!
同じ qq/hoge/ みたいなやつ。
print %/double\tquote\tdesu!!/ #=>doublequote desu!! print %Q/double\tquote\tdesu!!/ #=>double quote desu!!
さらに qw/one two three/ みたいなやつ。
print %w/one two three/ #=>["one", "two", "three"](配列)
さらにさらに qx/date/ みたいなのも。
print %x/date/ #=>Tue Feb 28 02:02:19 JST 2012
4.1.6 ヒアドキュメント
ヒアドキュメントを使ってダブルクォート文字列やシングルクォート文字列を書ける。
egg = "tamago" print <<"ABC" #=>egg = tamago(ダブルクォート文字列) egg = #{egg} ABC print <<'XYZ' #=> egg = #{egg}(シングルクォート文字列) egg = #{egg}
通常、ヒアドキュメントの終端を示す文字列は左に空文字を挟めないが、<<-と指定することで終端の文字列をインデントして揃えることができる。
if true print <<-"TKG" Tamago Kake Gohan !! TKG end
Perlでも終端の文字列にインデントを含めれば・・・
if (1){ print <<" TKG"; Tamago Kake Gohan !! TKG }
4.2 文字と文字リテラル
文字リテラルは?(クエスチョン)に続けて文字を書くことで表現できる。
ただし、Ruby 1.8では文字は「バイト列」、Ruby 1.9では「文字」として扱うため挙動が異なる。
なお、Ruby 1.9で文字を示すクラスが増えたわけではなく、属するクラスはStringとなる。
p ?a #=>97(Ruby 1.8で実行) p ?a.calss #=>Fixnum p ?a #=>"a"(Ruby 1.9で実行) p ?a.calss #=>String p ?abc #=>syntax error, unexpected $end, expecting ':'(怒られた)
とりあえず今日はここまで。この章、地味に長いな・・・
「初めてのRuby」 3章 数値
今日も淡々と読書メモ。
箇条書きばっか使って書くと読みづらいのでスタイルを変えてみた。
3.1.1 整数リテラル
整数をそのまま数字で書いてやればIntegerオブジェクトが作られる。2,8,16進数はPerlと同じ表記が使えるので難しいことはない。
それよりも、なんとなくp使って出力したら(親切にも?)10進数に変換して出力された。
p 255 #=>255 p 0xff #=>255 p 0377 #=>255 p 0b11111111 #=>255 p "0b11111111" #=>"0b11111111"(これは数値じゃなくて文字列)
計算効率を考え、小さい整数は固定長のFixnumオブジェクト, 大きい整数は多倍長のBignumオブジェクトが適宜使い分けられている。環境によって境界線が異なるとのことなので、Scientific Linux 6.1を入れたさくらVPSでためしたところ63ビットと64のところに境界がきていた。
p (0x3FFFFFFFFFFFFFFF).class #=>Fixnum p (0x3FFFFFFFFFFFFFFF + 1).class #=>Bignum
3.1.2 浮動小数点リテラル
Perlの場合、数値は全て倍精度浮動小数点数として扱っているが、Rubyは型を厳密に区別しているので、浮動小数点はFloatオブジェクトとなる。
p 123.class #=>Fixnum(これは整数) p 123.0.class #=>Float(浮動小数) p 123.4.class #=>Float
特殊な浮動小数点数としてInfinity(正の無限大)と-Infinity(負の無限大)、NaN(非数)がある。
判別にはinfinite?メソッド(無限ですか?)とfinite?メソッド(有限ですか?)、nan?メソッド(非数ですか?)が使える。
p ( 1.0 / 1.0).infinite? #=>nil(無限ではない) p ( 1.0 / 1.0).finite? #=>true(有限です) p ( 1.0 / 0.0).infinite? #=>1(正の無限大です) p ( 1.0 / 0.0).finite? #=>false(有限ではない) p (-1.0 / 0.0).infinite? #=>-1(負の無限大です) p (-1.0 / 0.0).finite? #=>false(有限ではない) p ( 1.0 / 1.0).nan? #=>false(非数ではない) p ( 0.0 / 0.0).nan? #=>true(非数です)
3.2.1 除算
加減乗除の書き方はPerlでも見慣れた記法だが、除算だけちょっと挙動が違う。
浮動小数点数としてNaN(非数)が存在するので「ゼロで割ったら必ずエラーになる」とは限らない。
p ( 3 / 0) #=>divided by 0 (ZeroDivisionError) p (3.0 / 0) #=>Infinity p ( 3 / 0.0) #=>Infinity
3.2.4 その他の数値演算
よく使いそうな演算はメソッドが用意されている。これは便利!
p 10.divmod(3) #=>[3, 1](整除と剰余の配列) p -10.abs #=>10(絶対値) p 9.4.ceil #=>10(小数点以下を切り上げ) p 9.4.round #=>9(調べたら四捨五入もあった!)
3.2.5 型と自動変換
Rubyは型を厳密に区別・・・というより数値もオブジェクトなので特定のクラスに属することになるから明示的な変換が必要となる。
p 1 + "2" #=>String can't be coerced into Fixnum (TypeError)(数値に文字列を加算しようとしてエラーになった) p 1 + "2".to_i #=>3(文字列"2"をto_iメソッドで数値に変換した) p 1 + 2.0 #=>3.0(整数オブジェクトと浮動小数点オブジェクトはメソッドを使わないでもよろしく変換してくれる)
3.3 比較
比較演算子もPerlなどと同じ。整数と不動数点についてはここでもよろしく比較してくれている。
p 1 == 1.0 #=>true(整数1と浮動小数点数1.0の比較は一致扱い) p 1 == "1" #=>false(整数1と文字列"1"の比較は不一致)
3.4 数学関数
Mathモジュールを使うと三角関数を使ったり、一般的な定数(円周率、自然対数の底)を扱える・・・ということだけ憶えておく。詳しくは必要になったら調べる。
3.5 ビット演算
こちらもPerlと同様の記法が使える・・・ということだけ憶えておく。詳しくは(ry
今回の「数値」はさらっと終わったけど次の「文字列」は割りとボリュームがある。ずらずら長いと読み返すのに面倒なので、区切りが良い部分を見つけて2回ぐらいに分ける予定。
ちなみに読書メモは復習がてら書いてるので、実際には今日から6章を読み始めたところ。
リアル3日坊主。
はてなブログが良い感じだったので暫くhttp://keme.hatenablog.com/で更新してみます。
Developers Summit 2012に行ってきた!(2日目)
今日もメモと感想の入り混じった誰得なレポートを・・・
正確な情報は順次SlideShareにアップされている資料や各スピーカーさんのブログなどをご参照ください。
- 17-B-1 差別化で未来を生き抜くエンジニアの7つの秘訣
- 幸いJavaは10年使える技術だった。しかし、よく10年先を考えたキャリアプランを・・・と言われているが無理。
- 「いつ辞めるか」ではなく、「このまま自分を差別化できるか」
- 大事に思っていること:学べる(将来役に立つ)?, 楽しい?, 普通(以上?)に稼げる?
- Twitter APIに不満があったので提供側に来た。
- 情報発信を行うことで、情報収集につなげる。「教えたがりを利用する」
- インタレストグラフの構築「(ブログやTwitterで)同じ関心を持っている人と繋がる。」
- (登壇時に着ていた)Twitterパーカーが欲しい!→入社すると買えます!
- 閉鎖空間での貢献へ避ける。オープンな世界で自己顕示。
- 17-C-2 仕事のバトン、渡ってますか?-プロジェクト管理におけるコミュニケーション基盤作り
- 17-A-3 スマートフォンにおけるHTML5実装の最先端
- 描画が遅い
- Cavas(用途:シチュエーション毎のアニメーション, 同時に動くものが多い / イメージ:じゃじゃ馬)
- SVG
- CSS3(用途:一枚もののアニメーション, 同時に動くものが少ない / イメージ:悪女)
- JavaScriptが重い
- メモリとの戦い(王道編)
- 頻繁に使うものは最初に全部ロードしておく。上限が決まってるものは最初に上限まで確保。
- (邪道編)
- iPhoneシミュレーターもUIWebViewも再現弱い。
- リスクを理解した上で○○する。
- 実機でのデバッグ→JsConsole, console.log
- まとめ?
- HTML5の将来→インストールソフトの時代は終わる。
- 10年後も→長いスパンで「こうあるべきた」と思うことを信じ続ける。
- 17-A-4 Scrumで組織改革
- Scrumを全く知らない状態で聞きに行った。
- 需要により急激に組織が大きくなって出てきた問題、という背景の話があるある過ぎる・・・
- すごくボリュームがある仕事のフレームワークのような印象。
- 導入し小さな人数から全社まで拡大していく根気強さが大事なんだろうなぁ。
- 17-C-5 攻めの運用の極意
- 17-E-6 ニフティクラウド~IaaSによる実践的システム構築と運用~
- 法人向けとして個々の要望をしっかり受ける姿勢があった。
- 山口さんのキャラもあってエンジニアのファンが多そう←これ大事
- パネラーの方たちが書いたIaaS全般で使えるNiftyクラウドの本が気になる。
- 17-C-7 From Legacy to Agile~レガシー開発からアジャイル開発へ~
- 心鷲づかみな内容。刺さる言葉も多かった。個人的にベストスピーカー賞><
- (前半はアジャイルの話)
- 挙手アンケートで会場の半数がSI関係者。勉強会も含めこの比率は初体験(汗
- dwangoにおけるアジャイル導入の調査レポート
- 導入しているプラクティスに共通部分は多いが、各チームが工夫を凝らしていた。
- 新卒からアジャイルの英才教育。
- アジャイルの誤解
- 優秀な人たち向け→dwangoの例を参考に。
- モノだけ作る→必要なドキュメントはちゃんと書く。
- お客さんのいいなり→
- 対話とかいらいない→対話のためのプラクティスも多い。
- アジャイルをはじめるには
- 書籍(先人たちが作った高速道路)
- (後半はウェブ業界の話)
- ゲスト:Yoshioriさん
- 書籍チームのルール
- テストを書く
- テストを書かないやつは屑
- 問題を根性で解決しない
- 問題を根性で解決するやつは馬鹿
- 問題をエンジニアリングで解決するのがエンジニア
- 人を殺す以外なら何をやってもいい
- 半分ジョーク, 自分を殺すようなスケジュールを引くのもダメ
- 失敗を引きずらない
- 引きずっていてもいいコードは書けない
- テストを書く
- どのチームにも「コードを憎んで人は憎まず」という文化がある。
- Web業界を目指すには
- ソフトウェア開発は仕事そのものが報酬になる数少ない職業
- 「壷と砂」
- 大きな石を先に入れた後に砂は入るがその逆はできない。
- 大きなタスクを先に置き、細かなタスクは後から配置する。
- 最近やってて面白いのは「フラッグ」
- 今取り組んでるタスクを旗に書いて立てておく。
- メンバーが何をやってるか、どれぐらいタスクを持っているかがわかる。
- (書ききれない&過激で書けないのでここまで!)
終わったあとこのまま帰るのやだなーと思い、sugyanさんのツイートをきっかけにスピーカーさんやNode.js界隈の方たちの飲みに参加したらすげー楽しかった><
Developers Summit 2012に行ってきた!(1日目)
去年に続き今年も行ってきました。今年10年目に対して2年目(2回目)の参加なのでまだまだ新参者だけど良い熱気を貰えました。
内容のまとめを書けるほど個々の内容に通じていないので、印象に残ったことと感想をざっくばらんに書いてみました。
正確な情報は順次SlideShareにアップされている資料や各スピーカーさんのブログなどをご参照ください。
- 16-C-1 HTML5の今と未来~HTML5との正しいつきあい方~
- HTML5の仕様はマークアップ言語の部分よりもAPIの部分の方が圧倒的に大きい。
- HTML4.01が出てから10年以上、その間もウェブは進歩してきたが実はそれはFlashなどプラグインの進歩によるものだった。
- HTML5には全く新しい機能もあるが、これまでプラグインが提供してきた機能を"標準"として提供する意味も大きい。
- 特にモバイル端末では様々な要因からプラグインで実現してきたものがHTML5に置き換わろうとしている。
- ネイティブアプリの開発にHTML5が採用され、タブレットなどの汎用デバイスが様々な分野で使われ始めている。
- つまりHTML5を使うエンジニアの活躍の場はブラウザの上に留まらない!!←ここ大事
- 16-C-2 大規模化するピグライフを支えるインフラ~MongoDBとChefについて~
- 16-C-3 趣味と実益の脆弱性発見
- クリティカルな部分で使われるハードウェアの品質を見てきた、という過去の経緯がセキュリティへの拘りに繋がっている印象。
- どうしても"脆弱性を指摘"というとクリエイティブから遠いイメージだったが、ブラウザの脆弱性がもたらす影響を考えると重要なこと。
- セキュリティの意識は改善されてはきているが、今のネットを使う人や流れる情報の変化を考えるとまだまだ足りない気がする。
- 16-C-4 次世代Internet Explorer、IE10とHTML5 API
- 最初に会場の参加者とIE利用者の差について説明していた。(スタンスを説明するのは大事だよね。)
- 次世代IEの個々の機能を売り込むというよりは、HTML5の魅力を伝えることに注力していた。
- ガンガンIE10を押してくるという期待を良い意味で裏切った内容だった。
- デモで使われたサンプルアプリも気軽に使える次世代のウェブを見せるという感じ。
- 16-C-5 JavaScript 最新事情 -開発者なら知っておきたい次世代JavaScript-
- 16-C-6 kintoneの表と裏~大規模JavaScript開発と非構造データベース
- こっちもJavaScriptのテクニカルな話題にはついていけず・・・
- JavaScriptの固まりと言ってもいいアプリで大容量化したJavaScriptに、コンパイルして1ファイルにまとめるという手が使えることは憶えておきたい。
- 利用者の操作でカラムそのものが増減するという悩ましいアプリにMySQLで挑むとは(汗
- 他の要因もあってMySQLを選び、最終的にはKVSの方が向いてそうな形が落ち着いていたが、試行錯誤の過程と考察が参考になる。
- こっちもJavaScriptのテクニカルな話題にはついていけず・・・
- 16-B-7 デブサミオフィシャルコミュニティから選出のLT大会2012
- 内輪乗りができないこともあり全体的に大人しい感じだった。
- 実践の欠如 / ITで震災に挑む / 技術へのキャッチアップなど、考えさせられるメッセージも多かった。
「初めてのRuby」 2章 配列とハッシュ ※後半のハッシュ
- 2-1 ハッシュ
何でもオブジェクトなRubyなのでハッシュのキーもオブジェクト。で、そのキーと別のオブジェクトの対応付けを詰めたコンテナがハッシュ。
作るには{}(中括弧)で囲い=>でキーと値を対応付けるので、見た目はPerlで無名ハッシュを作るときに似てる。
キーを指定して値を取り出すときは{}(中括弧)ではなく[](大括弧)で値を囲む。
Perlのundefに相当するらしいnilというもの(両者の違いがどの程度あるのかはまだ知らない)があり、Perlのexists相当のkey?メソッドに加え、定義の範囲外を指定すると例外を起こすfetchメソッドがある。
hash = { "ichi" => 1, "ni" => 2, "san" => 3, "yon" => nil, } p hash["ichi"] #=>1 p hash["yon"] #=>nil p hash["go"] #=>nil p hash.key? "yon" #=>true p hash.key? "go" #=>false p hash.fetch("yon") #=>nil p hash.fetch("go") #=>./hash.rb:19:in `fetch': key not found (IndexError) from ./hash.rb:19
fetchメソッド以外をPerlで書くとこんな感じ?
my %hash = ( "ichi" => 1, "ni" => 2, "san" => 3, "yon" => undef, ); print $hash{"ichi"} . "\n"; #=>1 print $hash{"yon"} . "\n"; #=>undef print $hash{"go"} . "\n"; #=>undef print exists ($hash{"yon"}) . "\n"; #=>1(真) print exists ($hash{"go"}) . "\n"; #=>(偽)
Ruby 1.9からオブジェクトではなく"シンボル"というものをキーにしたハッシュを簡単な記法で作れる。(シンボルの正体は4章でわかるらしい・・・)
hash = { ichi: 1, ni: 2, san: 3, yon: nil } p hash #=>{:rin=>5, :kimiko=>7, :kayo=>nil}
Perlのforeachみたいな処理は、配列の時と同じeachメソッドで書ける。
取り出したキーにも値にも名前が付けられるので少し読みやすい気がする。(Perlのkeysとvaluesを同時に使うような)
hash = { "ichi" => 1, "ni" => 2, "san" => 3, "yon" => nil, } hash.each do |wamei, atai| puts "#{wamei} = #{atai}" end
Perlでキーも値も使う場合はこんな感じだよね。
my %hash = ( "ichi" => 1, "ni" => 2, "san" => 3, "yon" => undef, ); foreach my $wamei (keys %hash){ print "$wamei = $hash{$wamei}\n"; }
そういえば癖で最期のペアの終わりにも,(カンマ)を入れちゃったけど構文エラーにはならなかった。ありがたい。
2.3 Enumerableモジュール
なんかよくわからないw
(相対的にみて)シンプルな実装のメソッドをベースに新たなメソッドを作る仕組みと、それらを複数集めて名前を付ける仕組みがモジュールってことでいいのかな?
恐らく1章に書いてあった言語そのものをカスタマイズしたりオレオレ言語を作るのに重宝するものと想像。詳しくは後の章に期待しよう・・・