Scala 2.6.0-RC1 でscala.util.parsing.combinatorが標準パッケージになりました。というわけでリファレンスとちょっとしたサンプルくらしかなかったのだけど、とりあえず書いてみた。

どう書く?org に投稿した、ExcelライクCSVのパーサ。

 1import scala.util.parsing.combinator.{Parsers, ImplicitConversions, ~, mkTilde}
 2import scala.util.parsing.input.CharArrayReader
 3import Character.isISOControl
 4
 5object CSVParser {
 6 trait Base
 7 case class Field(s:String) extends Base {
 8   override def toString = s
 9 }
10 case class Record(fields: List[Field]) extends Base
11 case class File(records :List[Record]) extends Base
12
13 def mkString(cs :List[Any]) = cs.mkString("")
14 class CSVParser extends Parsers {
15   type Elem = Char
16   def notMeta(c:Elem) = c!=',' && c!='\n' && c!='"' && !isISOControl(c)
17
18   lazy val file   = record.*('\n') ^^ File
19   lazy val record = (field|quotedField|nullableField).*(',') ^^ Record
20   lazy val field = chars.+ ^^ {cs => Field(mkString(cs))}
21   lazy val nullableField = chars.* ^^ {cs => Field("")}
22   lazy val quotedField = '"' ~ (charsInQuote|quoteInQuote).* ~ '"' ^^ {cs => Field(mkString(cs))}
23   lazy val charsInQuote = elem("chars in field", _!='"')
24   lazy val quoteInQuote = repN(2, quote) ^^ {cs => '"'}
25   lazy val quote  = '"' ^^ success
26   lazy val chars  = elem("chars", notMeta)
27 }
28}
29
30val data = """
31"aaa","b
32bb","ccc",zzz,"y""Y""y",xxx
33""".trim
34
35(new CSVParser.CSVParser).file(new
36CharArrayReader(data.toCharArray)).map(file => {
37 file.records.map({record =>
38   val fields = record.fields
39   (1 to fields.length).foreach(i => println(i +" => " + fields(i-1)))
40 })
41})

とりあえずこんな感じ。これはダイレクトにParsersクラスを直接継承してるけど、StdTokenParsersってかんじのParserもあるし、StdLexicalってかんじなLexerもあってこれはなかなか。

時間が出来たらもうちょっといじってみよう。よさげな解説してるサイトがあったら是非教えてください。


via つまらなくて役に立つ物を作るということ

実は俺のプログラミングというかクリエイティブなことについての考えはシンプルで、「とにかく作りたいものを作る」それだけだったりする。まぁ結局その作りたいものがゲームだったり、XMLをパースしたりすることだったりするわけなんだろうけど。


もっと突っ込んで言うと、作りたいものを作る、それだけなので別に何も残せなくても俺はぜんぜん気にしない。死ぬまでのなかで、あの人は○○を作った人だ、とかそんな人になりたいとは思わない。

事実、俺が個人で作っているものは好き勝手だ。

このブログに出してる成果物で言えば、あるときはRailsを触っていろいろやっていたり(まぁこれは仕事もあったが)、Javascriptをいじってテンプレートエンジンつくったりいろいろしたり、PythonでNESエミュレータを書いたり。

ma.laさんとは違ってゲームも作る。SDLを使って2Dのも作るし(Ruby/SDLやpygameではない。CあるいはC++、昔だとDXLibかなあ)、最近はIrrlichtも勉強していて3Dゲームも作りたい。

言語とかその他の面でも手を出しまくりだ。普段からC,C++,Java,Ruby,Python,Javascript,Schemeなどを書くし(作りたいものに一番便利な言語を使うだけ)、単に勉強として変な言語にも手を出す。

他にはReasonやハード音源を使って自作の曲をだしてたりもした(別名義)。一応小さいころから音楽はやっていて、しかもきちんと音楽理論も教えてくれるとこだったので、そこそこのクオリティだと思う。DTM特有の技術も、一通りの生楽器の奏法の再現法を勉強したり、エフェクトをいじり倒したりした。

画像もやる。そこまで絵心があるわけじゃないけど、いろいろなソフトを経てGimpに落ち着き、ある程度の画像処理ならできるし、ゲームのマップ作成とか位なら普通にやる(A5のインテュオスほしいなあ・・・)。前にも書いたけど、3Dにも手を出している。


んで、そんなに手を出しまくってお前は何を残せたんだ、と言われたら「何も残してないよ」だ。何も誇れるものなんてない。結局どれも中途半端で役立たずだ。だから、俺はWEBプログラマでもなければ、ゲームプログラマでもなく、プログラマですらなく、ミュージシャンでもなく、絵描きでもない。

実はこれは結構悩んだ。というか悩んでる人は結構いるんじゃないかと思っている。世の中、スペシャリストスペシャリストで、仕事をしようにも俺みたいな器用貧乏タイプの人は困る。だから、無理に自分がほんとに好きなものはどれなんだ、とか何か残せているのか、とか自問したりする。

それに対しての俺の結論は、「器用貧乏で何が悪い」だ。楽しければそれでいいのだ。俺は作ることすべてが好きなんだ。たとえ何の才能もなくて何も残せなくても作る過程が大好きなんだよ。少なくとも、世の中がスペシャリスト優遇だからといって自分を抑えて、スペシャリストになって生きるよりは、不器用に器用貧乏で生きるほうが絶対楽しい。めざせ最強の器用貧乏。なにかひとつ、スペシャリストになるほど好きなものが持てる人は運が良かっただけなのだ。


ただ、器用貧乏じゃないとできないこともあるんだぜ、とは常々思っている。器用貧乏タイプの人はどうか、負けないでほしい。


via 雑誌記事 「日本のプログラマーの未来時給」を見て人生オワタ\(^o^)/

プログラマの未来自給は651円らしい。

個人的には「そういう職業なんだろうなあ」という感じ。

プログラマとミュージシャン

音楽をやっていたせいか、どうもプログラマとミュージシャンを重ねてしまう。

一般的にプログラマというと、プログラミング言語でなにか書く人。音楽でいうと楽器のプレーヤー。

ギターやってるなら、ベースもOKっていう人も多いはず。ついでにピアノなんかもできたり。もっといっぱい、ドラムもたたけるし、バイオリンもひけまっせ、みたいな人もいるかもしれない。そういう人はあんまりいないから目立つけど、実際はギターとベースくらいがいいところかなあ、と。プログラミング言語でもそうだと思う。

こういう幅広さで有名な人もいれば、その手の演奏者として名をはせる人もいるだろう。ギターがすげー人とか。Perlのすげーハッカーとか。

また、演奏者の中でも楽譜を見て演奏するだけの人もいれば、自分で曲を書く人もいる。プログラマでも確実にある程度の規模の設計をできる人はどれだけいる?10秒程度の音楽なんて誰でもつくれる。5分くらいのいい曲、かけるだろうか?

常に動向をおっているだろうか?小室哲也は嫌いな人もいるだろうが、あの流行への敏感さ、流行を生み出す力はすごいと思う。それでいてある程度の中心がある。「俺はこういう音楽が好きだから、これだけでいいんだ」ってなるのは当然否定しない。、でも最低限、聞いてみるくらいはしたほうがいいと思う。自分の好きな音楽に対しても新しいアプローチとかができると思う。俺はCやってるし、別にHaskellはやっててもどうでもいいよ、もしくはHaskellの存在なんて知りもしないプログラマがほとんどだろう。

基礎は固めているだろうか?「カッコいいから」って自己流でギター始めた人はどれくらいいるだろ。もちろんそれで上手くなる人もいる。そういう人は天才だからほっておいて問題ない。でも大体の人は変な癖がついて、よくない方向へいってしまう。ギターはバイオリンより入りやすい。適当にコードをならせばそれっぽくなる。でも、バイオリンと同じくらい奥が深いものだ。LLはCとかアセンブラより入りやすく、ちょっとやればそれっぽい物が作れる。でも奥深さは相当なもんだと思う。


結局、活躍しているミュージシャンはほんの一握りだ。たくさんの若者が音楽に魅せられて、バンド組んだりしてプロ目指してみちゃったりする。結局、スタジオ付のプレーヤーになるのが関の山で、平凡なプレーヤーとして終わる。しかも、いまやプレーヤーの代わりにはコンピュータがいて、それを上手く操れるやつのほうがえらかったりする。スタジオの録音のエンジニアとかになったほうがまだいいわけだ。プログラマよりSE。

さらにたちの悪いことに、一般ユーザーはそんな名演奏者を求めていなかったりするのだ。実際、喜んで打ち込みのJ-POPを聞いてるでしょ?(ちなみに俺はそれが悪いなんてぜんぜん言わない)。ドラムなんて名演奏者が一発で叩いたほうが速いに決まってる。でも誰かに打ち込ませたほうが安いし、ユーザーも満足なんだよ。PGでもそれは同じで、一般ユーザーは動けばそれで満足なのだ。だいたい、そのサイトがXHTML validかなんて誰が気にする?


有名なプログラマーや技術者はその数少ない売れてるミュージシャンだと思う。これは名曲だ!といわしめる曲とか、もしくは新しい音楽のジャンルを作るような革新さえ起こしそうな、そんな人たちだと思う。そういう人はやっぱりお金も貰えるだろうし、ある程度自由もきくと思う。でもやっぱり、音楽学校を出た人が全員一線級のプロになれないように、多くの人、情報系を出た人でさえそのような才能を持った人はすくない。ホントは熱いロックをやりたくてもそれをやる自由もなくJ-POPのバックでやったりするんだろう。プログラマって、つくづくそんなジャンルの職業なんじゃないかなあ、と思う。きっとこういう音楽に似た部分が俺をプログラミングに引き込んだんだろうな。