[時間割:Perl]『ミニマルPerl』その7
2008/10/31 02:40 posted by kunkichi
今日も外で勉強してきました。やっぱり外はいいですね。ということで木曜日は『Perl』です。今回からsedをPerlで置き換えてみようというところです。
Tim Maher
オライリージャパン
売り上げランキング: 96883
- おなじみの置換。sedとほとんど同じ。
$ echo "abcde" | perl -wpl -e 's/abc/ABC/g;'
ABCde
- 複数の置換を一気に。まずはsed。これは知らなかった。
$ cat example.sed
s/a/A/g
s/b/B/g
s/c/C/g$ echo "abcde" | sed -f example.sed
ABCdeこれをPerlで。コマンドラインだとこんな感じ。$ echo "abcde" | perl -wpl -e '
> s/a/A/g;
> s/b/B/g;
> s/c/C/g;'
ABCdeスクリプトだと以下。$ cat example.pl
#!/usr/bin/perl -wpl
s/a/A/g;
s/b/B/g;
s/c/C/g;$ echo "abcde" | ./example.pl
ABCde
- 行を指定して置換。sedの場合。
$ cat sample.txt
This is sentence 1.
This is sentence 2.
This is sentence 3.$ sed '1s/sentence/REVISED_SENTENCE/g;' sample.txt
This is REVISED_SENTENCE 1.
This is sentence 2.
This is sentence 3.Perlだと行番号を表す$.を使う。$ perl -wpl -e '$. == 1 and s/sentence/REVISED_SENTENCE/g;' sample.txt
This is REVISED_SENTENCE 1.
This is sentence 2.
This is sentence 3.
- -0digitを使って、段落単位、ファイル単位もできる。
$ cat sample2.txt
This is paragraph 1.
And, this is a sentence for paragraph 1.
This is paragraph 2.
And, this is a sentence for paragraph 2.
This is paragraph 3.
And, this is a sentence for paragraph 3.$ perl -00 -wpl -e '$. == 1 and s/paragraph/PARAGRAPH/g;' sample2.txt
This is PARAGRAPH 1.
And, this is a sentence for PARAGRAPH 1.
This is paragraph 2.
And, this is a sentence for paragraph 2.
This is paragraph 3.
And, this is a sentence for paragraph 3.
- 後方参照。sedとPerlだとマッチ部分のカッコのエスケープが逆なので注意。まずsed。
$ echo "This is a sample sentence." | sed 's/^\(.*\) \(sentence\.\)$/\1 REVISED \2/g'
This is a sample REVISED sentence.sedはカッコにエスケープをつけると正規表現の部分マッチ用のカッコとなる。次にPerl。$ echo "This is a sample sentence." | perl -wpl -e 's/^(.*) (sentence\.)$/$1 REVISED $2/g'
This is a sample REVISED sentence.Perlの場合は逆にエスケープをつけない場合が正規表現のマッチ用カッコとなる。
- 行番号で表示を指定。例として2行目以降を出力してみる。
$ sed -n '2,$p' sample.txt
This is sentence 2.
This is sentence 3.Perlだとこんな感じ。$ perl -wnl -e '$. > 1 and print;' sample.txt
This is sentence 2.
This is sentence 3.
- もちろん、さっきとおんなじように、-0digitを使えば、段落単位・ファイル単位とかも可能
sedで後方参照する時っていつもカッコのエスケープ忘れてハマるんだよね、苦笑。行番号の箇所なんかもキー入力はPerlのほうが少し多くなるけど、直感的。
Category: Programming, Perl | コメント&トラックバック(0)
[s21ht]梅田某所より
2008/10/28 21:24 posted by kunkichi

おお、本領発揮。
Category: Gadget, Diary | コメント&トラックバック(0)
[時間割:読書] 『READING HACKS!』
2008/10/28 02:14 posted by kunkichi
毎日読書を続けていて思うのはいつもこの2点。
- もっと早く読みたい!→たくさん読める
- もっと深く読みたい!→理解力が高まる
- もっと早くたくさんアウトプットしたい!→アクセス数アップ(爆)
ということで、書店でもちらほら見かける読書本を数冊チョイスしたのですが、そのうちの1冊がこれ。
原尻 淳一
東洋経済新報社
売り上げランキング: 1114
先週まで『本を読む本』をずっと読んでたのですが、『READING HACKS!』が久々のHACK本ということで、『本を読む本』はちょっと休憩して、『READING HACKS!』を先に。読みやすさではこっちのほうが読みやすいし、サブタイトルに「趙アウトプット生産のため」とあったので、まさに今の僕のための本!(笑)ということで、一気に読み終えました。
基本的には、いつものHACK本と同じく、小さなHACKがたくさんまとめられてますが、気になったところだけピックアップ。僕の場合は、技術書が読書のメインなのですが、ビジネス書とは多少違う部分があるので技術書の場合のアプローチも併せて考えてみました。
- 集中モードへの切り替えにハーブミスト
買いました。とりあえずamazonで買ったのだけど、梅田ロフトでも売ってることを確認。ちなみに僕はラベンダー系の香りはずっと苦手だったのですがこれは大丈夫。
- インプットとアウトプットは同時にやらない。これまでは勉強しながらメモがてらブログを書いていたけど、やっぱり理解力が足りない気がしていた。メモはメモ、アウトプットはアウトプットにちゃんと分けるように。
- 音楽聞きながら、はモノによってはむしろ加速度を高めてくれる。ということで、僕の場合、クラシックは少し眠くなるので、ボーカルの入っていないJazzのインストもの、特に多少アップテンポなものをチョイス。
- ホームライブラリー化に本棚を検討。部屋が狭くて本棚をおくと圧迫感が出るのが嫌だったのだけど、本が並んでる姿を見て雰囲気を出すのも重要かも。IKEAだと、BILLYのホワイトが安くて良さげ。
- もう少し行きつけのカフェとかは開拓したい。会社帰りだと、丸ビル前のシアトルズ・ベスト、ちょっと足を伸ばして、肥後橋のスタバ(ここは2階が空いていて結構穴場)あたり。ただやっぱり梅田近辺なのでいつも混んでる。京橋近辺で静かでPC立ち上げて長居できそうなところを見つけたい。
- 読書投資基準の70:20:10モデルを僕自身に照らし合わせてみると、サーバ系70、プログラミング系20、その他10って感じにすべきなのかな。ちょっとプログラミング系が多い最近だけど。一応、時間割的に通勤時の読書は技術書以外っていうのを意識してるのでOK。
- 年間読書キャンペーンは、一つのプログラミング言語をきちんと学ぶには最低1年ぐらいは必要だと思うので、ちょうどよし。今年の年末までにはLinuxカーネルソースをなんとか読めるぐらいになりたい!
- 生涯読書ランキング作ろう。ランキングは読書だけに限らず、選ぶ作業自体がかなり楽しい。モチベーションあがる。
- 読書記録をきちんとつけて、自分の読書傾向を分析、自分が今読んでる本のレベルから特定の分野の理解度がどこまで進んでいるか?とか、逆に足りない範囲はどこか?とか、を把握するのは良いかも。メディアマーカーお試し中。
- 目次読書→スキミング→特定の箇所だけピックアップして読む、この流れを忘れずに、要点の把握とスピードアップ。技術書の場合でもこれは使えるはず。伊藤直也さんトークセッションでもあったのだけど、「繰り返し」のスピードを上げて理解力を上げるほうにポイントを置きたい。
- 目的意識は常に念頭に。技術書の場合はもちろんその技術の習得が目的なのだけど、その技術を使って何をするか?を常に考えるようにしないと。
- 読書キット作成しました!100円ショップでほぼ揃います。個人的に失敗したのは、キットを入れる入れ物として布製・メッシュのやつを選んだのだけど、取り出すとき本の重みで形が崩れる。電車の中とかではちょっとつらい。ビニールの多少固めのものを選んだほうがベター。
- アウトプットへのこだわりを持つ。文体とか情報の精度とか。
- ホームグラウンドはやっぱり技術。常に理論から仮説をたてて実践するという日々の運用やトラブル対応の基本を読書の中にも持っておきたい。
- アウトプットが大前提。
うん、小山さんの『STUDY HACKS!』に引き続き、今回も良書でした。『〜 HACKS!』系は読みやすい上に外れを感じないです。とりあえずアウトプットは常に念頭にある状態にはなっているので、もっとアウトプットのスピードとクオリティを上げることが個人的にはテーマかな。
Category: Book | コメント&トラックバック(3)
[時間割:Perl]『ミニマルPerl』その6
2008/10/28 01:49 posted by kunkichi
火曜日は『Perl』の時間です。行をまたがる正規表現のところから。
- 普通は . でニューライン(¥n)はとれないのだけど、シングルラインモードを使えば¥nもマッチ対象とすることができる。これを使って複数行にまたがるマッチングを行う。
$ cat lines.txt
abcde fghij
klmno pqrst
uvwxyz$ perl -00 -wnl -e '/\bfghij\b.*\bklmno\b/si and print $&;' lines.txt
fghij
klmno
- ポイントは以下。
- 入力レコードセパレータを-00とか-0777とか複数行読み込めるものにする。
- マッチ修飾子にシングルラインモード(s)を有効にして、¥nがマッチするような正規表現を書く。*. とか。
- いろいろ試してみる。BINDのqueryログから、問い合わせホスト名が2文字のTLDで終わっているものを参照。
$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
27-Oct-2008 23:54:14.192 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.uniqlo.jp IN A +
27-Oct-2008 23:59:02.339 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.oreilly.co.jp IN A +さらに.jpドメインのものを除外する。$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and ! /query: \S+\.jp /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
- String::Approxを使ってファジーマッチングも可能。
# cat fuzzy_match
----------
#!/usr/bin/perl -s -wnl
use String::Approx 'amatch';
amatch $pattern, [ "i", "20%" ] and print;
----------echo "yafoo" | ./fuzzymatch -pattern='yahoo'
yafoo
- スクレイピングの例。www.php.netの右上にあるStableのバージョンのうち、5.X系のバージョンを取得する。
$ lwp-request -o text www.php.net | perl -wnl -e '/Stable/ and /5\.\d\.\d/ and print $&;'
5.2.6
以下、grep処理のまとめ
| grepコマンド |
Perlでの書き方 |
| grep ‘〜’ |
perl -wnl -e ‘/〜/ and print;’ |
| grep -v ‘〜’ |
perl -wnl -e ‘/〜/ or print;’ |
| grep -i ‘〜’ |
perl -wnl -e ‘/〜/i and print;’ |
| grep -l ‘〜’ |
perl -wnl -e ‘/〜/ and print $ARGV and close ARGV;’ |
| fgrep ‘〜’ |
perl -wnl -e ‘/¥Q〜¥E/ and print;’ |
シチュエーションによってはgrepのほうが簡単な場合もあるけど、まあそこはケースバイケースで。ちょくちょく使って慣れていこう。。
Category: Programming, Perl, Book | コメント&トラックバック(0)
[時間割:C言語]『はじめてのC言語完全入門』その8
2008/10/25 22:49 posted by kunkichi
今週の頭は少しサボっちゃいましたが、気を取り直して。サボりの元凶となったのは Touch Diamond を買ったから(笑)ですが、遊びのために買ったんじゃない、ということを証明するために早速、金曜日の会社帰りに外で勉強しました。やっぱり外ははかどるな〜、3章一気に進んじゃったし。
ということで、木・金のアップです。まずは『C言語』の方から。
塚越 一雄
技術評論社
売り上げランキング: 420963
関数
スコープ
- 関数内の変数は関数内にのみ限定される(ローカル変数)。
- 実際には「ブロック」内、つまり{}で囲まれた範囲内に限定されているのがローカル変数。
- 関数の外側の変数は、関数から見た場合にはグローバル変数となり、参照可能。
- 変数名もブロック内に限定されるので、他の関数内で同じ変数名が使用されていても衝突しない。
- ただし、グローバルな変数名と同じ名前にした場合、関数内ではローカル変数が優先される。
- グローバル変数はファイルスコープ。
配列
- 配列にも型の概念がある。すなわち、同じ型のデータしか入れれない。異なる型のデータを入れるのは構造体。
- 配列は、基本の型とは異なるユーザ定義型の一つ。
- 配列を宣言するには、型・配列名・サイズ(要素数)をあらかじめ定義する。
int ary[10]
- 初期値を与えることもできる。
int ary[] = { 1, 2, 3 };この場合はサイズの指定は不要(自動的に初期値の個数がサイズとなる)
- 配列の要素へのアクセスは、インデックスを使う。
x = ary[0];
- 配列全体のメモリ量を求めるには 配列に対して sizeof を使う。
sum = sizeof ary;
- 配列要素の単体メモリ量を求めるには 配列のインデックス0 に対して sizeof を使う。
each = sizeof ary[0]
- つまり、全体メモリ量を単体メモリで割ると、配列の要素数を求めることができる。
num = sizeof ary / sizeof ary[0];forループの上限値等に設定する場合はこれをつかうとよろし。
- forループの脱出にもbreakが使える。
- ループの脱出にはbreakを使う。
- 配列はあらかじめサイズを指定しておかないといけないため、途中でサイズが大きくなった場合に対応できない。こういう場合は動的メモリが必要となる。
ふぅ、たくさん進んだ分、アウトプットも多くなってしまいましたが、これで教科書の残り3分の1まで来ました。やっと終わりが見えてきたのでがんばります。次はいよいよ「ポインタ」です!
Category: C, Programming, Book | コメント&トラックバック(0)
[s21ht]さらにいれたもの
2008/10/24 00:46 posted by kunkichi
だいぶ Windows Mobile にも慣れてきたので、さらにアプリを追加。メモ。
- SandGrass
タイマー。シンプルな作り。Lifehacksなタイマーからラーメンまで。
- Offisnail Date+ β005
スケジューラ。標準のものよりも見やすく使いやすい。s21htの場合は、新しいベータ版で。
- POsync
スケジューラをGoogleカレンダーと同期。
- Evernote client
evernoteのクライアントソフト。メモはこっちに置き換え。
あとこれをPDA工房で買いました。
これで外でも充電OKです。
Category: Gadget, Diary | コメント&トラックバック(0)
時間割をまた見直しました
2008/10/21 02:10 posted by kunkichi
先月1ヶ月の時間割達成率を見直した結果、またちょっと変更しました。

- 『Python』と『絵』の時間は中止しました。
- 『Python』の方は、さすがに3言語同時に勉強ってのは混乱しちゃってそれぞれが中途半端になってる気がしたので、どれか一つを減らすことにしました。で、C言語はサーバにも絡むし、Perlは仕事上使うことも多い、となると残りは、、、ということでPythonが脱落の憂き目に、、、あぁ、2度目の挫折、、、
- 『絵』の方は、楽しかったんだけど、なんとなく今の時点ではそれほど積極的に勉強できていない感じがしたので。教科書をもう少し工夫すれば良かったかもしれないけど。
- 代わりに、『C言語』と『Perl』を2時間にしました。やっぱり今の仕事や知識に直結する部分が大きいので、モチベーションが出るのは大きい。
ということで、あとは、アウトプットをなんとかせねばだなぁ、、、今も追いついてないし。
Category: Life Hacks, Diary | コメント&トラックバック(0)
[s21ht]とりあえず入れたもの
2008/10/17 21:50 posted by kunkichi
昨日は肩こりがひどくて頭まで痛かったので、今日はカスタマイズの続きを。とりあえずいろいろ試してみました。
- Googleマップ
GPS搭載機って初めてなんですが、これは楽しい。タッチパネルはいいなぁ。
- WMWifiRouter
いやー、苦労しました。最初よくわからないで設定したら全くつながらなくて、1回フォーマットした後に画面の指示通りきっちりやり直したらいけました。WifiとBluetoothのON/OFF、あときちんとExitで終了することに注意した方がいいかもしれません。あと未だにDHCPの払い出しはしてくれません。スタティックでつなげてます。結構クセが強いアプリな印象。
- Diamond TF3D Config Setup
これは必須ですね。レスポンスがかなり変わります。あと言語を英語にするととても雰囲気が良くなります。
- GSFinder+ for HTC Universal
ファイルマネージャ。デフォのは使いにくいので、これがかなりスタンダード、らしい。
- KTCapt
画面キャプチャ。
ということで念願のルーター化に成功したので早速Touch Diamond経由で書いてます。いやぁ、Wilcomに比べるとやっぱり快適です。
で恒例のスピードテスト。自宅から。

まあこんなもんかなぁ。うちの家はなぜか携帯の電波がとても入りにくくて、Softbankだとピンポイントの場所以外では全滅、Wilcomもアンテナ1本立つか立たないか、って感じだったので、まあこれだけ出れば御の字かな。エリアによって差があるみたいなので、今度外で試してみたいと思います。
Category: Gadget, Diary | コメント&トラックバック(0)
Touch Diamond (S21HT)
2008/10/16 01:01 posted by kunkichi
今日はちょっと勉強をお休みしてガジェットいじりを、、、
たまにはカフェとか外で勉強したいということで使ってたウィルコム(ちなみにPC接続のときはDD、普段は9を使ってました)ですが、やっぱりPC接続だと速度がね、、、
ということで、前々から気になっていたイーモバ、やっと契約してきました。機種はTouch Diamond(S21HT)。これで1台でPCも普段もイケる上に速度もアップ。やっと快適なカフェ勉強ができそうです。

ま、いろんなところで既に取り上げられてますが、とりあえずのインプレッション。
- 見た感じは悪くないです。iPhoneとかに比べると質感には若干かけるけど許容範囲内。
- とにかく薄い、軽い。シャツの胸ポケットにちょうど良し。逆に薄すぎてちょっと落としそうで怖いぐらい。
- 覚悟はしてたけど、噂通りの微妙なタッチパネル感度。強くいかないといけないのか弱くいかないといけないのか、まだ計りかねてます。
- レスポンス自体は思ったよりもマシ。ただし、購入前は想像を絶する程のダメっぷりを想定してたので、という意味で。Touch Flo も、Windows Mobile機 ということを踏まえると、よくがんばってる方じゃないかな。
ま、出だしとしては思ったより悪くない印象です。カスタマイズする楽しみがあります。
とりあえずこの後やらないといけないことを備忘録的に。
- このままだと指紋つきまくりなので液晶保護シートを買う→OverLay Brilliant for HTC Touch Diamond(S21HT)
- wifi routerのインストール。このためにTouch Diamond買ったといってもいい。
- 一応Bluetoothでも接続できるように設定。
- ケースが欲しい、ミヤビックスのレザーとかじゃなくて、クリアケースがいいなぁ。
- あとはいろいろアプリ入れたりチューニングしたり。参考になりそうなページをピックアップ。
ちょくちょく暇を見つけてカスタマイズしていきます。
Category: Gadget, Diary | コメント&トラックバック(0)
[時間割:Perl]『ミニマルPerl』その5
2008/10/15 02:05 posted by kunkichi
さて、祝日分のアップをします。まずは『Perl』から。
Tim Maher
オライリージャパン
売り上げランキング: 96883
- 正規表現でこれまでは、デリミタに¥s+、数値に[0-9]とかでベタに指定してたけど、これからは¥bとか¥dとか使おう。
- fgrepみたいな、メタキャラクタをそのままリテラルで使う場合は、¥Q…¥E。
- マッチした部分を取り出す場合は、$&を使う。
$ echo "12345 123 abced abc" | perl -wnl -e '/\b\d\d\d\d\d\b/ and print $&;'
12345
- マッチしない場合(grep -v)は、orを使う。
$ echo "12345
> 123
> abcde
> abc" | perl -wnl -e '/\b\d\d\d\d\d\b/ or print;'
123
abcde
abc
- 合致するファイル名だけを出力する(grep -l)の場合は、$ARGVでファイル名を取得。
perl -wnl -e '/\b\d\d\d\d\d\b/ and print $ARGV and close ARGV;' aaa bbb ccc
aaa最後にcloseしているのは、合致する文字列が複数業あった場合にファイル名が2重に出力されるのを防ぐために、合致した時点でcloseして終わるため。
ちなみに、closeしないとこうなる。$ perl -wnl -e '/\b\d\d\d\d\d\b/ and print $ARGV;' aaa bbb ccc
aaa
aaa
- 大文字小文字を無視する(grep -i)の場合は、マッチ修飾子iを使う。
$ echo "aaa
> AAA
> bbb
> BBB" | perl -wnl -e '/aaa/i and print;'
aaa
AAA
- egrep的だったり、パイプを使った段階的フィルタ、みたいなのはperlだと簡単。
perl -wnl -e '/aaa/ and
/bbb/ and
/ccc/ and
/ddd/ and
print;' sample.txtパイプで書くとgrep "aaa" sample.txt | grep "bbb" | grep "ccc" | grep "ddd"メモリ消費やポータビリティの点でPerlのほうがらくちん。
- 行単位じゃなくて、複数行でのマッチングも簡単。まずは段落。以下のようなldifファイルがあるとして、
$ cat sample.ldif
dn: uid=test1,ou=people,dc=example,dc=com
uid: test1
objectclass: posixAccount
objectclass: account
userPassword:password1
loginshell: /bin/bash
uidNumber: 201
gidNumber: 201
homeDirectory: /home/test2
gecos: test1
description: "Test User 1"
・・・
dn: uid=test3,ou=people,dc=example,dc=com
uid: test3
objectclass: posixAccount
objectclass: account
userPassword:password3
loginshell: /bin/bash
uidNumber: 203
gidNumber: 203
homeDirectory: /home/test3
gecos: test3
description: "Test User 3"uidがtest2のレコードを抽出。$ perl -00 -wnl -e '/uid: test2/ and print;' sample.ldif
dn: uid=test2,ou=people,dc=example,dc=com
uid: test2
objectclass: posixAccount
objectclass: account
userPassword:password2
loginshell: /bin/bash
uidNumber: 202
gidNumber: 202
homeDirectory: /home/test2
gecos: test2
description: "Test User 2"
- 今度はさっきのレコードがそれぞれ独立したldifファイルだった場合。この場合はファイルモードを使う。
$ perl -0777 -wnl -e '/uid: test2/ and print;' test1.ldif test2.ldif test3.ldif結果は上と同じ。
ここまでは今までにも出てきてるので問題ないね。段落モードとか実際に使えそうなシチュエーションを想定してやってみました。
さて、次回は、「行をまたがる正規表現」からです。これは結構必要となるシチュエーションが多いので重要ですね。
Category: Programming, Perl, Book | コメント&トラックバック(0)
2010/09/02/ 09:25
2010/08/13/ 00:45
2010/07/29/ 17:56
2010/07/10/ 01:48
2009/10/21/ 14:08