「java」を含む日記 RSS

はてなキーワード: javaとは

2008-12-01

元IBMerの思い出




http://www.jmiu-ibm.org/2008/11/209.html

で話題になってるみたいなので、1OBとして会社感想を書いておきます。

仕事については本当に恵まれている

私は新卒で入社し5-6年ぐらい在籍して辞めました。辞めたのは数年前でしたが、中に残っている人の話を聞く限り、状況はそんな変わってないように思います。

IBMはすごく良い会社でした。特に仕事面ではいい仕事をたくさんさせてもらい、随分成長できたと思います。

  • 研修が大変手厚い。入社して最初の半年は研修だけ。その後半年〓1年ぐらいはOJT研修を行ったり来たりの生活
  • 研修終了後本格的にプロジェクトに配属。いきなり下請けさんの部下がついてマネジメントをさせられる。客先に放り出されて1人で会議に出ることもしばしば。そうして早くに独り立ちすることができた
  • 30歳前後の先輩方が皆優秀でよく働く。彼らからいろいろなことを教えてもらった。

このような形で、若手が仕事をする上ではかなり良い環境だったと思っております。((あくまで若いうちは、ですが。昇進して上になるとまた変わるのですがそのあたりは割愛いたします))

老害としか言いようの無い存在

大変充実し、恵まれている環境でしたが、嫌な事も多かったです。その一つが、何も仕事をしていない50代以上の年寄りスタッフが多すぎることでした。

彼らは、かつてはIBMが主力のビジネスにしていたメインフレームの営業さんであったり、それら周りのエンジニア等でした。

IBM90年代初頭に業績が悪化しましたが、ガースナーという経営者を外部から招聘し、彼のもとで大きな改革が行われました。それにあわせて、日本以外の国ではそのような今後のビジネスに必要の無い従業員はあらかたいなくなりました。

しかし、日本だけは特別で、中々クビを切れないということで、「配置転換」や「再教育」が行われたのです。

自分顧客資産を生かして再度サービスの販売でのし上がった人もいますし、40過ぎてjavaを覚えて新しい領域のエンジニアになり今でも前線で活躍している人もいます。工場勤務時代の経験を生かして、最先端工場運営についてコンサルティングをしている人もいます。

しかし、そのように再チャレンジすることを拒否し、ただ会社にいて高い給料をもらうという選択をした人たちもたくさんおりました。

仕事が無いので現場において置けないので、ビジネスマネジメントとかクオリティコントロールなどという間接部門(正確な名前はもう忘れました。意味不明な横文字言葉が多すぎるのも悪いところです)が置かれ、そこに大量の使えない人があぶれていました。

彼らは9時5時でネットを見たりマインスイーパを一日中やってて帰る生活を送り、しかも彼らは長年勤務しているだけあってかなり給料があがっていました。

正直言って自分が稼いだ金を奴らに吸われているという感覚はありましたし「あいつら全員首にしたら絶対この会社は良くなるのに」という話を若手同士でよくしていた記憶があります。

組合?何それ?おいしいの?

そんな彼らの代弁者になっているのが今回の記事を書いた組合なのでしょう。元記事も随分過激な内容になっています。

しかし、私がみると「またか、いい加減にしろ」としか思えません。私にとって組合は、毎週のように意味不明な内容をエキセントリックに書き散らすチラシを配る存在であり、毎週オフィスをうろうろ回ってカンパを募りに来るだけの存在でした。彼らの目は死んでおり、チラシはそのままゴミ箱に捨てられ、誰もカンパに応じていなかった。少なくとも私の周りで組合員だった者を知りません。

よく組合の幹部で、役員と交渉することがエリートコースというようなことが普通日本企業では言われてるそうです。少なくともあの会社に関してはそのような雰囲気は微塵も感じられず、終わっている集団という認識でした。

そんなに社内で存在感の無い人たちの寝言が、ネットで話題になっていることには、率直に言って悔しいですし怒りを覚えます。こんな人たちの目線で見たIBMネットで有名になるのには我慢なりません。IT業界に身を置いたなら生涯勉強だろうが。それもやらないでダラダラくだらない仕事して不当に給料もらってやれ降格だクビだといわれてギャーギャー騒ぐんじゃねえよ。

これから

今回の大元となったリストラ報道を聞いたときは、ようやく日本IBMもまともな会社に生まれ変わることができそうと思いました。むしろ、元記事にあるような低評価、降格人事、退職強要なるものを行ってこなかったことが今の業績不振を招いており、若干遅きに失したかなとも思います。30代、40代前半の優秀な方々で見切りをつけて出て行ってしまった方もたくさんおります。ただ、これで少しでも本当にまともに金を稼いでいる人への還元がなされればよいと思います。

以上1個人の意見ですが、中にはこう考えている人もいたということで何かの参考になればと思います。

それでは。

2008-11-30

プログラミングつまんね

最近Java始めたんだけど、プログラミングってそんなに面白くないもんなのな。

やり始めてどれくらいから楽しく感じるようになるもんなの?

2008-11-28

僕がMacユーザを続けてるわけ

僕はMacユーザだ。最初に買ったのはスケルトンiMacFirewireDVD-ROMがついているやつで、色はグリーンだった。OSはMacOS9.0.2。もう10年近く前の話だ。

僕がMacを買ったのは、ひとえに絵が描きたいからだった。正直Windowsにするかどうか、とても悩んだ。でもその頃買った色彩王国という色の塗り方をプロインタビューした本では、CG塗りをしている人はMacを使っていた。だから僕もMacを買った。その頃は絵のプロになる気満々だったから、A3までプリントでき、カートリッジを交換すれば同じくA3までスキャンできるプリンターと、とても高かったけどPhotoshop 5.5J、そしてタブレットも一緒に買った。さすがにタブレットまではお金が回らなくて、Favoの一番安い奴になっちゃったけど。本を読んでPhotoshopでの絵の塗り方を勉強した。自分なりにいろいろいじって、デジタルトーンのかけ方を覚えたりもした。それで僕は満足していた。その頃に描いた絵は今もちゃんととってあってpixivにアップしてあったりする。

でもMacに不満がないわけでもなかった。興味本位プログラミングをやってみたいと思っていたけど、ネット環境もなく大型書店もない田舎住まいの僕にはMacでのプログラミング方法なんて分かんなかった。それに、爆弾がよく出たりとか、どこにファイルを置いたのかすぐ忘れてしまったりとか、そういうところでも不満があった。

そして、絵のプロを目指すとか思っていたのに、いろいろ思う所あって実家を離れ大学に進学した。学科はプログラミングが出来そうな情報系を選んだ。そして大学で、コンピュータ室の管理のアルバイトをすることになった。

そのアルバイトでは、大学で使っているUNIXシステムユーザサポートと、その他の雑用をやった。雑用用にはWindowsXPだったか2000だったかのマシンを使わせてもらえることになった。そして驚いた。WindowsMacよりも使いやすかったことに。

ユーザのホームがあってその下にマイドキュメントがあって、とどこにファイルを保存すればいいのか簡単に分かったし、それゆえ作ったファイル行方不明になってしまうこともなかった。安定性も高かった。

ただ、プログラミングに関しては大学の授業とバイトの兼ね合いで、WindowsではなくUNIXを使ってやることになった。最初に覚えたのはCだ。UNIX世界に触れたのも、僕にとっては非常に大きなカルチャーショックだった。それまでアイコンクリックして何かが出てきて、といったGUI世界しか体験したことのない僕にとって、コマンドを打ち込んであれこれやるというCUI世界は、なんと言ったらいいんだろうか?効率性とかそういうものも当然感じたけれど、でもそれ以上にコンピュータの原点というか、よりコンピュータの弱いところというか、コンピュータ自分が降りていくというか、そんなことを感じた。変なことを書いたがとにかく、コマンドを使ってファイルを作って消して実行して、自分がどこに居るかということは見た目ではなく自分の頭の中で把握していなければならない、自分の他にもコンピュータユーザが居る、まるでコンピュータの中のマンションに住んでいるような錯覚を覚える文化に、虜になったとまではいわないが非常に感銘を受けた。

さて、次に買うマシンはどうしよう?と思ったとき、僕はWindowsを買おうと思った。UNIXシステム大学にあるし、Linuxを入れるにしてもまずはPCを買わなければならない。そう、このとき僕の中で2代目のマシンMacにするという選択肢は綺麗に消えていた。しかし、そんな僕を変える出来事があった。MacOSXとの出会いだ。

バイト先ではどんな環境ユーザから問い合わせがあるか分からないから出来る限りいろんな環境を揃えなくてはならないという理由で、2台だけだったがMacも置いてあった。僕がMacユーザだと知った技官の方は、そのMacの管理を僕に一任した。そのMacに当時ですら古かったMacOSX10.0が入っていたのだ。

この最初のMacOSXは評判が悪かった。すぐ固まる、落ちる、今までのソフトが使えない、そんな悪評を僕はマック雑誌で沢山目にしてきた。しかし実際にこのMacOSX10.0をみて、それらの評判がそう的外れなものではないということはすぐわかったが、MacOS9に比べると、Windowsのように自分のホームがあって基本的にファイルがそこに置かれるというところは改善点だと思った。だがそれ以上に僕を魅了したものがあった。ターミナル存在だ。今までのようにGUIを使ってファイルを作ったり移動したりすることができる。しかもそれをUNIXのように(実際UNIXなのだが)CUI世界から眺めることもできる。その逆もしかり。それにWindowsでは面倒なUNIXへのログインも、sshを使って簡単にできる。そんなことにとても感動した。そしていろいろ調べているうちに当時最新のMacOSX10.2だったらX11betaも使うことができると知って、技官の方や先生へ直談判した。技術的なことにどん欲な彼らはそれに非常に興味を示し、MacOSX10.2を買ってもらえた。僕は早速それらをインストールし、Mac上でUNIXサーバからEmacsの窓を引っ張ってきた。それだけのことであるが、それがたまらなく楽しかった。いつどこの研究室からどんな問い合わせが来るか分からないから、暇なときはMacを使って勉強しなさい、と言ってもらえ、僕はMacに夢中になった。日本語Texを入れたり、Mac上でCやJava勉強をしたりと、それはとても楽しい時間だった。そんな僕は次のマシンMacにするぞ、と固く心に近い、そしてその通りまたMacを買った。友人達コンピュータ室にこもってプログラミング課題をこなしているとき、僕は早々に家に帰って自宅のMacからサーバログインして課題をこなしたものだ。

今この文章も、当然Macで書いている。今はWeb開発系のバイトをしていて、その上でもMacはいい選択肢だと思っている。ペーペーの僕の遥か上を行く開発チーフ達もうちの会社の場合ほとんどMacだ。ApacheをはじめとしてWeb開発に必要なものはほとんどあらかじめインストールされているし、足りないものはMacPortを使ってすぐにインストールできる。ブラウザでの表示確認にはSafariFirefoxをはじめとしたモダンブラウザが使えるし、Parallels Desktopを使えばWindowsインストールでき、そのブラウザからMac側で動かしているWebアプリの表示確認をすることだって出来る(たいていはIEに失望することになるが)。

絵を描きたいというところから始まった僕のMac人生だけれど、Web屋もどきになった今でも重宝している。これからもよっぽどのことがない限り変えることはないだろう。非常に長く主観的な思い入ればっかりの文章を書き連ねてきたけど、これが僕がMacユーザを続けてるわけ。

2008-11-20

http://anond.hatelabo.jp/20081120233252

98シリーズDOS/Vの前に敗れて、JavaLinuxが出てくる前のMicrosoft一人勝ちの時代を知らないと分からんかもしらんね。

今でも、「世界にはMS製品しかありません」的な商品のネーミングはどうにかしろと時々思う。

2008-11-19

http://anond.hatelabo.jp/20081119000921

つい最近Google App Engine Oilに処女を捧げたばかりの増田ですが。

ドキュメントの量?

そんなもんネーよ。App Engine自体、pythonドキュメントに比べたらヘみたいな物だよ。ドキュメントよりコードだよコード

HTMLがピロ?

それで十分じゃネーか。パラメータだ?クッキーだ?セッションだ?そんな物に構ってられるか。

デバッガ環境エディタ

対応してる奴使え。対応してなきゃ捨ててしまえ。

CPUディスクサーバ

知るか。SQLなんか捨てちまえ。そんな高尚な物なんて必要ねー。

業務?

そんなもん使えるかボケ

ってのはおいといて。

結局、定型処理の標準化なんで、設計フレームワークに合わせて標準化するなら有用でしょう。

Cでやってたのをjavaで標準化したような物。

教えてくれ!Webフレームワークって本当に便利か?

ちまたじゃ、みんなフレームワークのことを当たり前のように論じててすごいなーと思うんだ。尊敬するぜ。だから、ミーハーなオレもフレームワークが気になって仕方ない!

だから、30歳近いプログラマのオレがプライドを捨てて優秀なハテナ住人に聞くが、

Webフレームワークって本当に便利か?

バカなオレだけど、MVCパターンが良い事は理解できるよ。

だが、そこまでだ。

Javaだと、StrutsSpringSeasarWicket等をよく目にするけどよぉ、ドキュメントの量どんだけだよ。

入門ドキュメントだけ見ると簡単そうに思えるけど、仕事で使えるレベルまで理解が深まるまでどんだけ時間かかんだよ。

起動遅い、動き遅い、定型パターンを外れたら、やる方法が見つかんねー。

で、苦労して作ってもよぉ、結局は、HTMLがピロッって出力されるだけで、見てくれが変わるわけでもなく、全然努力が報われん。

これって、どゆこと?

Servlet+JSP+簡単なライブラリ 程度で十分じゃね?

PHPだと、Zend FrameworkCakePHPsymfony等をよく目にするけどよぉ、ドキュメントの量どんだけだよ。

入門ドキュメントだけ見ると簡単そうに思えるけど、仕事で使えるレベルまで理解が深まるまでどんだけ時間かかんだよ。

デバッガの使い方分かってねーオレが悪いとは思うんだが、開発効率悪いぞ。(フレームワーク以前の話だが…)

統合開発環境何使えばいいの?わざわざクラス名や関数名覚えてられんぞ。(フレームワーク以前の話だが…)

何で、拡張子変えたがる。何で、変なテンプレートエンジン使う。エディタ認識されねーから開発効率悪いじゃねーか。デザイナがコーディングした分かりくいHTMLコードをよ、何で編集してるわけ?

PHPフレームワーク使わない方が便利じゃね?

ついでに聞くけどよぉ、ORマッピングライブラリって使えるの?

確かに書くコード量は少なくなっていいんだがよぉ、目に見えて遅いと思うのはオレだけか?

ディスクアクセスは明らかにボトルネックになるのに、巨大なライブラリコードを毎回走らせるんだよ。普通サーバじゃ余裕なの?

話題がそれたが、

Webフレームワークって本当に便利か?

実は、みんな、上司や先輩に言われて使ってるだけなんじゃないの?

ハテナ住人の優秀なエンジニアは、どんな目的フレームワーク使ってんだ?教えて偉い人!

ま、誰も見ないんだろうけど。

2008-11-16

自宅での開発環境

興味のある方、ご返信頂ければ嬉しいです。

端的に言えば、Javaエンジニアの自宅での開発環境を教えて頂きたいです。

家にあるのがノートPC1台だけなのですが、この環境ではなかなか開発する気になれません・・・。

以下、補足。

所謂お仕事エンジニアをしています。SIerです。

就職するまではプログラミングは一切したことがなく、就職して初めてプログラミングするようになりました。

会社ではWindowsで、Eclipseを使ってJavaばかり書いてます。

会社の開発環境はとても快適で、ディスプレイも大きいのが2つあるし割と楽しくプログラミングさせて貰ってます。

が、最近自宅でも開発してみたいなーという想いがふつふつと沸いてきました。

興味があるのはやっぱりJavaそれからGroovy, Pythonです。

ところが、家では殆どインターネットしかしないので、我が家PCは1年前のMacbookがあるだけです。

JavaGroovyはやっぱり会社環境マルチディスプレイ + Eclipse)に慣れているとMacbookではとても不便です。

また、MacbookだとEclipseの様々なショートカットも使えません・・・(これがかなり致命的)。

持っているのが新型のMacbookなら、先日発表されたCinema Displayを使えば解決するのかなと思いますが、旧型では使えないし・・・。

Javaエンジニアの人で、ノートPCEclipseを使っている方って居られるんでしょうか?

諦めてiMacを買うか、Macbook + Cinema Displayを買い直すか、どちらかしかないのかなぁ・・・。

皆さんの自宅での開発環境、良かったら教えて下さい。

特にノートPCEclipseを使っている人が居たら、どのように使用しているか教えて頂きたいです。

2008-11-13

Re: 『Java屋らしい』とは?

http://anond.hatelabo.jp/20081027235614

どちらが正しい、どちらが優れているという話ではないが

ここで言われている「Java屋」らしいという表現は、次のようなニュアンスを含んでいるものと思われる。

  • Javaしか知らないため、相対的な見方ができない。視野が狭い。
  • 少数精鋭時に効果を発揮するタイプの原則よりも、平均的プログラマが多数集まったときに力を発揮するタイプの原則を好む

良く言えば現実主義

悪く言えば求道心が足りない。

ま、ビジネスとして見た場合、Java屋さんの態度のほうが優れていることの方が多いだろうね。

2008-11-07

http://anond.hatelabo.jp/20081102233412

e Job Goっていう、そこよりひどそうなサイトが。

http://www.ejobgo.com/

ここの人材検索を見るとひどすぐる。

何でもやるスタンスです! [評価/テスト系 事務系 ] (東京都

笑顔を絶やさない明るい性格です[評価/テスト系...] (東京都

勤番でまじめ[JavaVB/VC系...] (千葉県

明るくひとなつっこい性格です[Javaデータベース系 ] (東京都

粘り強い[Java系 基盤/構築系 ] (東京都

粘り強いって何だよ。こんなDB使って同業者同士で自社社員の経歴情報を値段付けて交わしてんのか?正気の沙汰じゃねえよ

派遣会社でもこんなこたしねえよ。なんだよこれ誰か嘘だと言ってくれ

2008-11-05

ブラウザ論争について

「IE8」「Firefox」「Safari」「Google Chrome」… 激化するブラウザ競争:アルファルファモザイク

http://alfalfa.livedoor.biz/archives/51386857.html

自分はFirefox 3をゴリゴリカスタマイズして使っています。

ですがFirefoxが他ブラウザに比べてそれほどに素晴らしいとおもっているわけではありません。

おそらく何割かの火狐ユーザーの何割かは

『特定アドオンが便利すぎてやめたくてもやめられない』

からFirefoxユーザーをやめられないのではないでしょうか。

自分はブラウザ比較で取りざたされるJava ScriptFlashの実効速度だの

レンダリング性能だのはブラウザ選びにそれほど重視しません(Acid Testの実行結果も)

記事であげられているブラウザのいくつかはテスト版からそれぞれ使用していますが、

いずれもソフトユーザー(そのブラウザのファン)からの要望をきちんと取り入れて今のような形になっているということが伺えます。

「○○が糞」という評価の仕方や「Proxomitronとの組み合わせ」をブラウザ比較で上げるのは

やはりあまり適切ではないのでは無いかと思います。

これは余談となります。

たんなる事実の一つですが、自分の周りの長くインターネットに携わっている、いわゆる上級者は

めぐりめぐってIEをタブなしで使うという結論に至る人が多いようです。

少なくともIEで見られないような設計をしてるサイトはないですから、それももちろん正解なのでしょう。

必要でないところに無用な労力を払わないというのも『できる奴』の条件ですし。

もしIE以外のブラウザをこれから使ってみようかという方は、ネット上での意見だけを頼りにせず自分で色々と試していただきたいです。

その結果IE 6が一番使いやすいと思ったとしてもそれは不正解でもなんでもありません。

きちんと自分にとって必要なソフトウェアを見極められたという証明と言って良いはずです。

2008-11-02

これがソフト屋の違いなのか

人気エントリIBMが入ってますね。

IBMって、こういうプログラミングに関する記事を書いていて、javaの他、javascriptやその他LL、他にもMySQLとかlinuxだったり、サーバ管理の話だったり、そういう記事を沢山書いていて、そして日本語訳しています。

MicrosoftSunも、自社製品に関してが中心ですが、MSDNとかSDCといったサイトをもっています。

それにひきかえ日本はどうでしょう。

もちろん、中の人達は論文雑誌書籍などを出しているでしょう。

しかし、だからこそ、会社として公開の場をもつ事が、技術者を育て、集める事につながると思うのです。

はてなだってやっているのです。

大企業なら、日本のITのために一肌脱いでみませんか。

2008-10-31

http://anond.hatelabo.jp/20081031131100

情報科学」って曖昧だから、「情報工学」って言おうぜ!

文系でもその気になれば身につくの?

情報科学って

何とかなると思うよ。

wikipediaの情報工学の「基礎的な理論」とか「ソフトウェア技術」とかを一通り読んで、

「そういうものがあるんだ」と引き出しに確保しておく。理解するのは年単位の後回しでも十分。

何かプログラム言語を使って、Fizzbuzz問題とかの簡単な課題を解く。

参考書や入門サイトを見つつ、でも直接答えを見ずに実装する。

手っ取り早く仕事にしたいなら、JavaDBを使ったWEB掲示板でも作ってみてもいい。

入門サイトなんて世の中にあふれてるから、学習コストは低いお!!

経験上、法学をかじった人は飲み込みが早いです。というか負けそうです。

法学プログラムも、定義したルールベースにするシステム論だからね。

2008-10-30

http://anond.hatelabo.jp/20081025202001

いまさらだがFizzBuzz

1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね?

というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。

定数計算なら、それは実行時ではなくコンパイル時に行なわれるべきだ……。

というわけでC++テンプレートメタプログラミング召喚。

#include <iostream>

const int FIZZ_NUM = 3;
const int BUZZ_NUM = 5;
const int BEGIN_NUM = 1;
const int END_NUM = 101;

template<int N> struct Fizz {
    enum {PRINT = 0, NEXT = N + 1};
    static void print() {}
};

template<int N> struct Buzz {
    enum {PRINT = 0, NEXT = N + 1};
    static void print() {}
};

template<int N, bool ForB> struct Number {static void print() {std::cout << N;}};

template<> struct Fizz<FIZZ_NUM> {
    enum {PRINT = 1, NEXT = 1};
    static void print() {std::cout << "Fizz";}
};

template<> struct Buzz<BUZZ_NUM> {
    enum {PRINT = 1, NEXT = 1};
    static void print() {std::cout << "Buzz";}
};

template<int N> struct Number<N, true> {static void print() {}};

template<int N, int F, int B> struct FizzBuzz {
    static void print() {
        typedef ::Fizz<F> Fizz;
        typedef ::Buzz<B> Buzz;
        
        Fizz::print();
        Buzz::print();
        Number<N, Fizz::PRINT || Buzz::PRINT>::print();
        std::cout << std::endl;
        
        FizzBuzz<N + 1, Fizz::NEXT, Buzz::NEXT>::print();
    }
};

template<int F, int B> struct FizzBuzz<END_NUM, F, B> {static void print() {}};

int main(int argc, char **argv)
{
    FizzBuzz<BEGIN_NUM, 1, 1>::print();
    return 0;
}

ifなし%なしループ系なし、しかも実行時オーバーヘッドなし!(多分)

あ、これを見て理解する人間オーバーヘッドは無視ね。

ああ、久しぶりにC++を触ったけど、やっぱC++テンプレートってダメダメだな。20世紀の遺物といわざるを得ない。

君がもし21世紀モテイケメンメタグラマーなら、21世紀プログラミング言語D言語を使うべきだ!

驚くべきことに、D言語コンパイル時に関数が実行でき、その結果をソースコードとして取り込める!

ただし実行できるのは簡単な関数だけだけど……。

以下、それを使ったD言語によるメタプログラミング的実装。

import std.stdio;

// これでFizzBuzzを全部出力するコードを作るぜ!
string makeFizzBuzzCode() {
    string code;
    for(int i = 1; i <= 100; ++i) {
        // 効率? コンパイル時にそんな配慮は要らん!
        if(i % 3 == 0 &amp;&amp; i % 5 == 0) {
            code ~= "writefln(\"FizzBuzz\");\n";
        } else if(i % 3 == 0) {
            code ~= "writefln(\"Fizz\");\n";
        } else if(i % 5 == 0) {
            code ~= "writefln(\"Buzz\");\n";
        } else {
            code ~= "writefln(" ~ static_itoa(i) ~ ");\n";
        }
    }
    return code;
}

int main(string[] args) {
    // おまけで生成されたコードも見せるよ。
    pragma(msg, makeFizzBuzzCode());
    
    // 生成したコードを埋め込む。コピペみたいな感覚
    mixin(makeFizzBuzzCode);
    return 0;
}

// 以下ユーティリティ。このぐらい標準で欲しいな……。

/// 整数文字列変換(コンパイル時)
string static_itoa(int n) {
    if(n == 0) {
        return "0";
    }
    
    // 10で割りながら余りを文字にして追加。桁が逆転した文字列になる。
    string s;
    for(; n; n /= 10) {
        s ~= ("0123456789")[n % 10];
    }
    
    // 桁位置を正常にする。相変わらず効率無視。
    return static_reverse(s);
}

/// 配列リバースコンパイル時)
/// 実行時ならarray.reverseが使えるんだけどね……。
T[] static_reverse(T)(T[] s) {
    T[] result;
    foreach_reverse(c; s) {
        result ~= c;
    }
    return result;
}

// 心配なので静的ユニットテスト(笑)
unittest {
    static assert(static_itoa(0) == "0");
    static assert(static_itoa(10) == "10");
    static assert(static_itoa(999) == "999");
    static assert(static_itoa(9999) == "9999");
    static assert(static_itoa(12345) == "12345");
    static assert(static_itoa(314159265) == "314159265");
}

コンパイル結果

$ dmd -unittest fizz_buzz.d
writefln(1);
writefln(2);
writefln("Fizz");
writefln(4);
writefln("Buzz");
writefln("Fizz");
writefln(7);
writefln(8);
writefln("Fizz");
writefln("Buzz");
writefln(11);
writefln("Fizz");
writefln(13);
writefln(14);
writefln("FizzBu(ry

出力結果は略。

さすがD言語C++JavaC#にできない事を平然とやってのけるッ

そこにシビれる!あこがれるゥ!

というか、

writefln(1);
writefln(2);
writefln("Fizz");
writefln(4);

もうwritefln(出力関数)要らなくね?

修正。

// これでFizzBuzzを全部出力するぜ!
string makeFizzBuzzCode() {
    string code;
    for(int i = 1; i <= 100; ++i) {
        // 効率? コンパイル時にそんな配慮は要らん!
        if(i % 3 == 0 &amp;&amp; i % 5 == 0) {
            code ~= "FizzBuzz\n";
        } else if(i % 3 == 0) {
            code ~= "Fizz\n";
        } else if(i % 5 == 0) {
            code ~= "Buzz\n";
        } else {
            code ~= static_itoa(i) ~ "\n";
        }
    }
    return code;
}

int main(string[] args) {
    // もうコンパイル時のメッセージしか出さない。(笑)
    pragma(msg, makeFizzBuzzCode());
    return 0;
}

コンパイル結果。

$ dmd -unittest fizz_buzz.d
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBu(ry

実行するまでもなく結果が出力された。つまり実行時間ゼロ、ということは……

世 界 最 速

以上、世界最速なD言語宣伝でした。

みんな使おうD言語

D言語リファレンス日本語

http://www.kmonos.net/alang/d/1.0/index.html(1.0。こっちの方が安定してる?)

http://www.kmonos.net/alang/d/2.0/index.html(もっと凄い2.0)

D言語本家配布元(無料コンパイラが入手できます)

http://www.digitalmars.com/

それにしても、ちゃんとD言語シンタックスハイライトを実装しているはてなは偉い。(笑)

2008-10-29

転職の事考える。

WEBプログラマを始めて2年ちょい。

この仕事辞めようと思っている。

入社当時の私はWEBプログラミング経験で、

学校C++とかJAVAとかVBとか…色々ごちゃごちゃ習ってたけど、正直現場ノウハウなんぞサパーリな状態だった。

だから、その会社プログラマが居なかった事は物凄く不幸だった。

WEBシステム開発部門を作るという事で、私を含めプログラム経験者が二人採用されたんだ。

細かいこと言うと、私と一緒に入社した人は、一応PHPPerlは組んだことが有るけど、「現場ノウハウを知らない」という点は私と同じだった。

入社してからは、もう全部手探り。

開発環境の整え方なんぞ全然分かってない。

取り敢えずPHPやれ、と言われたから、結構必死で勉強しながらメールフォームとか簡単なコード書いた。

当時は画面が切り替わる度に変数初期化されたりするのが不思議だった。

MySQLをやれ、と言われて、本気で必死こいて勉強した。

一緒に入った同僚は、「Postgre専門だからMySQLはよく分からん」と言う。

仕事の渡され方は大概丸投げ。

営業がリスニングをして、私は営業から案件の内容を聞く。

その仕様ってのが結構曖昧。何というか、「流れ」だけ説明される。

「管理画面で商品を登録すると、商品一覧に追加されるんだけど、登録する時に一緒にカテゴリを設定できるように…」

カテゴリは大カテゴリ・中カテゴリ・小カテゴリがあって、管理画面で登録できるように…」

とか、そんな感じ。

こういうのを聞いてプログラミング出来るのが当たり前なんだろうけど、私は凄く苦手だった。

苦手だからってやらない訳にはいかないからやってたけど、難しく考えるからだろう、時間がかかった。

後、基本的に画面イメージがない。

仕事を渡されると、全部任される。

テーブルの設計をしながら仕様を確定していって、画面イメージを作成していく。

最初の内は、正規化すら全然知らなかったからぐだぐだなテーブルばっかり設計して、コードを組む段階になってヒーヒー言ってた。

最初から書き直す事もしばしばだった。

もっと効率良くやりたい、と助言を乞おうにも、先輩なんて居ない。

同僚はその辺の作業進行は上手いものの、開発レベルは私と同じぐらい。コードスパゲッティ

人達プログラムやってたりするけど、WEBプログラムじゃないから相談しても色々と噛み合わない。

仕方がないから、うまいやり方は無いか、とひたすら暗中模索でやってきた。

で、そんな事を1年程続けた辺りで、長年プログラミングしてきた人と交流する機会が有った。

短い間だったけど、その人が教えてくれた知識でかなりショックを受けた。

開発環境の整え方とか、テストケースとか、フレームワークの事とか、えーと、まぁ、なんて言うか、プログラミングの考え方(みたいなもん)とか。

(ちょっと上手く言えない。現時点でも私は、とてもじゃないが自分の事をプログラマだなんて胸を張って言えない程未熟だと思っているし)

そして、ショックを受けたのは同僚も同じだった。

正直今まで自分がやってきた事の全部をひっくり返された気分だった。

全部が全部無駄だったという訳じゃないが、今まで非効率的で馬鹿で遠回りな事ばかりしていた。

その後はSubversionTracが導入された。

同時期に私は新しい案件を任された。

その案件の規模は小さめで、私は今まで不安定だった開発スタイルを整えようと、半分賭けでその案件cakePHPで構築しようと決めた。

無論、全然分からないから参考書とか公開されてるソース見たりとか、ネット情報とかで勉強しながら、だけど。

symfonyとかZend Frameworkとかでも良かったと思うんだけど、

たまたま先のプログラマの人がcakePHP使ってる、と言ってたから「じゃあそれにするか」とcakePHPを選んだ。

違いも分からんから最初は何でもいいや、と思ったってのも有る。

何度も躓いたり挫折しかけたりしたが、なんとか構築しきった。

つたないものでは有るが使い回しの効くメソッドなりを作れたし、正直凄く嬉しかった。

その頃には、ある程度ではあるがフレームワークでの開発が手に馴染んでいた。

そんでも一人でじめじめコーディングするスタイルは変わらなかったから、コードの中身はお察しくださいなスパゲッティ

もうこの会社に居続けても意味が無い、と思った。ひとりよがりコードを量産するだけだ。

だから、「今年いっぱいで会社を辞めようかと思います」と告げた。

それが大体半年前。

今年が終わるまで@2ヶ月ぐらい。

こんな経験年数半端な人材って、需要有るんかなぁ。女だしなぁ…、というかそもそも転職回数が多いのが一番痛い。ブラック企業ひきすぎ。

無知を乗り越えるという性質のやる気はあるから、がらっと業種を変えても良いかもしれない。

というか、ぶっちゃけ残業時間がえらい事になってたから、IT業界はもうしたくないな、と思う一方で、

やっぱりプログラム好きだからプログラマやりたいという思いが有る。

でもプライベートでやりたい事あるから、あんまり仕事時間を割かれるのも困る。

後、親が元気な内に孝行しときたい。

こないだ、カーチャンのスレ見てたのがかなり効いてる。

「あんた転職するんでしょ? 転職前に休み作ってよ。一緒に旅行行きたいから」とか言ってるし…

今までサビ残当然の会社ばっかり行ってたもんで、

仕事が忙しいから」とか「疲れてるんだから休ませてくれ…」とか言って全然孝行出来なかったから、そろそろ生活における仕事の割合を減らしていきたいところ。

でも、

難しいよなぁ。

転職、どうしたもんだかなぁ。

2008-10-28

http://anond.hatelabo.jp/20081028003017

それともそーじゃなくて、感覚的にブサイクデブな人を見るのと似たような感覚言語に対して持つ、というようなこと?

言語仕様だけを見れば、

JavaScriptのほうがJavaよりもずっと不細工でデブくて醜くて重すぎるんだけどな。

Javaは周辺含めるといろいろ汚いんだろう。

CLDCばっかり使ってる俺にはそういうところは関係ないので、

JavaもCLDCだったらシンプルで綺麗なんだよといいたいところだが、

CLDCを一番がんばって使ってるゲーム屋のプログラムはとてつもなく醜いのでそこを突かれると反論できん。

じゃばがでぃすられるりゆう

http://anond.hatelabo.jp/20081027235614

そもそもJavaがこんなにdisられるようになったそもそもの理由も知りたい。

まず、醜い。

太りすぎだ。重すぎる。

この業界を牛耳るまでにまでのし上がったと言われるが、性格は最悪。

こんなのを賛美する連中は、既知害か、自分の身が可愛いだけのチキン

まぁ、レイラ様にゴールドビキニを着せるセンスはいい。

2008-10-27

Java屋らしい』とは?

中途半端に優秀なプログラマが「正しいプログラミングテクニック」だと妄信しがちな3つポイント

http://d.hatena.ne.jp/fromdusktildawn/20081026/p1

ちょっと囓っただけの素人が自分を過信して陥る三つの罠?

http://d.hatena.ne.jp/JavaBlack/20081026/p1

d:id:fromdusktildawn:20081026さんは「共通化とか抽象化ができるようになった中途半端に優秀な』人を対象にしているのに対して、d:id:JavaBlack:20081026さんは『ちょっと齧っただけの素人』を対象(元記事に対してかもしれない)にしているので、適用対象レベルがそれぞれ違う気もするけど。

d:id:JavaBlack:20081026さんの記事に対するブクマコメントの幾つかやトラックバック先において、『Java屋らしい』との書き込みがあるけれど、具体的に『Java屋らしい』とはどんなことを指すのでしょう?

当方嫌われ者エンタープライズ開発withJavaな人間ですが、Javaがよく使われるエンタープライズ向け開発などを行っていると、プログラミング企業入ってから覚えました、っていう人の方がマジョリティだから、こういう“プログラミングセオリー”のようなものは知る機会がないと言っていい。よほどいい先輩に当たらないと、こういうことすら教えてくれないことの方が多い。

プログラマなら自分で調べて当然、という意見もあるだろうけど、上記“マジョリティ”の彼らは、自宅でコーディングなんてするはずがないし、早くコーディングなんて卒業したい、と考えている人種

そんな人たちは、こういうことを『知らない』し、『知ろう』とも思っていない。

そういう現場にとっては、

とある程度型にはめて指導することは、とりあえず『最低限のレベル』を守るためには有効だと思うのだけれど。まぁ元記事では『中途半端に優秀な』とわざわざ断っているから、こういうことを最低限知っていて、杓子定規になんでもかんでも共通化したりローカル変数ばっかり使っている人に対しての進言なんだろうとは思いますが。

Java屋らしい』とは、Javaが静的型付け言語だけに、なんでもかんでも「こうしなければいけない、ならない」と断定してしまう点を指して『堅い(硬い?)』ことを言っているのでしょうか?

あと、『Java屋は長ーいメソッド名が見やすいと感じるらしい』というコメントについては、Java屋がCOBOLerに対して、

  • IDENTIFICATION DIVISION.
  • ENVIRONMENT DIVISION.
  • DATA DIVISION.
  • PROCEDURE DIVISION.

なんて書くのは冗長だよなー。とか、xx区分みたいな項目が横並びに何十項目もあるRDBなんて作るんじゃねぇ、とか思う心理と似たようなものなんでしょうか。

そもそもJavaがこんなにdisられるようになったそもそもの理由も知りたい。

教えてLLな人。

http://anond.hatelabo.jp/20081027120608

レスでスマソ。

コンピューター的に喩える(笑)を引き継ぐけれど、

確かにC言語とかJavaを完全に理解していてもそれだけでLinuxGoogleが作れる訳じゃないもんなあ。

世の中のニーズを取材して、どうハードウェア(世間)を叩いて動かすか勉強して、どんなライセンス媒体)でリリース発表)するか選択する、とか色々。当然協力者もかき集めないといけないし。

文章を読むのだって「読解力」なんて一括りにできないに決まってる。

スポーツ関連の文章を読むときは体育の経験が必要だし、動物生物の文章を読むときは理科の知識が少しは必要になる。

恋愛モノを読むときは何かしら恋愛した経験が必要だろうし。

(逆に、そういう前提条件を取っ払った上で読める文章を書けるかどうか、というのは作者の側の責任

文章を読んだり書いたりすることは、本当は「国語」なんて一教科に任せきれないところがあるのかもしれない。

生徒の「読解力」を否定するのはつまり生徒の全人間性を否定する部分があって、

ぶっちゃけ「お前は人の気持ちが分からない奴だッ!!」と頭ごなしに罵倒するのに近い気がする。

そんなことして教師は責任取れるのか、と言われれば多分取れない。

取れないけど他に良い方法も浮かばないのでやってる。というところなんだろうか。

文学鑑賞は拙く教えるほかないかもしれないけど、

小論文突破できない点は論理的な文章の読み書きを訓練すればどうにかなりそうな気がする。

小中を振り返って、ロジカルな文章の読み書きなんてロクに教わった覚えがない。

(もう十年くらい昔の話なので今は改善されてるかもしれないが)

高校を出た頃にようやく「理科系の作文技術」(アメリカ云々の元ネタ)とかを自分で読んで、

文章とはこうやって書くものだったのか! とかなりびっくりしてしまった……。

なんでこれを日本中学はやらねーんだチクショー、授業料返せ! とか思ったよ。

要するに国語の授業に文句がある奴ぁ、教師に文句言ってる間にひたすら教科書読む方がイイよ、ってことだね。


それは激しく同意だな。(笑)

結局自分で読みまくって書きまくって身に付けるほかないのよね……と諦めたら負けだと教育者の方々は思ってるか。(汗)

ところでこの話、オレとしては遠い昔に2ch学校板でした議論の蒸し返し+発展形なんだけど、あんたってまさかあんときのアンタじゃないよね?


2chには出入りしていないので別人だな。(汗)

http://anond.hatelabo.jp/20081027142843

id:happy_ryoJavaやってたからだろうな。

ネットで見かけるJava屋はなんか甘い奴が多い。

世話を焼きたがるし、教えて君とかにもあまり厳しいこと言わない。

他の言語屋と比べるとかなりフレンドリー。

Java最近影が薄いせいかもしれん。

それと、IT業界のことあれこれ言ってるのはいつもJava屋な気がする。

ネットコネ作りたければJavaが良いかもしれない。

2008-10-16

まったくrubyってやつは扱いづらい

javaに移行します

2008-10-10

女子クラスで理解するプログラミング言語

こんなところかな。異論は認める。つか、異論をくれ。

異論ありがとう


あ、元ネタ忘れてた:http://anond.hatelabo.jp/20080729035820

2008-10-04

http://anond.hatelabo.jp/20081004120243

正社員プログラマだけど時給換算したら1300円くらいしかもらってなくて泣いた。

1ヶ月150時間(くらい)労働で20万円くらい。

VBどころか、C、C#JavaコボルアセンブラJavaScriptRubyPerl、あたりなら扱えるのに。

仕事プログラマってか最近設計にシフトし始めたけど。

バイトやってたほうが儲かるとかなんだよ・・・。

2008-09-25

いまさらiPhone

iPhoneが不評な理由を挙げるとき、自分が個人的に一番理解できないのが「メールのプッシュ受信が貧弱」という項目だ。

そもそもメールというかインターネットって「生のままで流されるデーターは情報の正確性と速度は一切保証されない通信方法」なわけで、そのインターネット回線を平分で流れるメールなんて、最初から即時性求めてちゃだめなんじゃない?

実際自分は即時性を求める連絡事項は絶対にメールだけでは済まさないし、相手にもそれを求める。

仕事だとそれはさらに徹底するので、しがな自営業やってると短期的に見てビジネス的に不利になる場面も少なくはないが、

メールという遅延に全く誰も責任が取れないメディアにこちらが即時対応を義務づけられると、それが積もり積もるともしものときにもっと手痛いダメージをこちらが一方的に被ることになるので、こちらに即時対応を求められるときは必ず電話などのリアルタイムで連絡可能なメディアを通じて、その補助としてメールを利用している。

そうするとメールはプッシュである必要は全くない。IMAPであれPOPであれこちらが確認したいときにサーバー接続して都度必要な対応をすればいい。即時対応が求められるなら、その前に必ず電話なり何なりの連絡が来ているはずだから。

これが携帯電話だけしか持っていない層になるとまた話が違ってくるんだろう。

携帯電話メールは、古くはポケベル方式で文字のやり取りを可能にしたPHSデジタルツーカーカシオモデルだったり、確かSMS方式っぽい方法で文字データやりとりしたJSkyメールあたりが発端になってるはずなので、

回線業者に囲い込まれたインターネットしか体験していないユーザーにはメールはプッシュが当たり前なんだろうし、

実際その層で多いのはいつも誰かに存在が確認されていないと自分が消えそうな子供思春期の年代が大半だろうとは思う。

で、iPhoneなんだけど、これはPCを持ってるのが前提なわけで

携帯電話しか持っていない層よりもはるかに少ない、PCで一通りのことは出来る上に自分なりの使い方を持っていて、さらにそれが多少なりとも外に持ち歩ければ、

という現在まだ非常に少ない層にジャストフィットした商品である以上、そこを理解していないと重大な過ちを犯す。

そこに輪を掛けて、スマートフォンというものに過剰な期待を抱いて勝手に舞い上がってた、PDAスマートフォン慣れしてなかった層まで加わって、「がっかりした」の大合唱

iPod touchのときも2chニュースサイトで舞い上がって鼻息荒く「公衆無線LANと組み合わせてライフハック!」を夢見ていた人たちが居たが、その人達の提供するライフスタイルが常に回線ありきでPDA慣れしてないと感じた。

今回iPhone日本携帯市場を揺るがすとか鼻息荒かった人もいて、それを見るたびいつも「あーこの人PDAスマートフォン慣れしてねーなー」と苦々しく思ったものだが、

PDAはそもそも職場や自宅のPCと「同期」させて外にデータを持ち出すと便利になる一部の層のためのツールであって、スマートフォンはそこに外でも回線接続の可能性が増えたに過ぎない。中には外での回線接続に音声通話も可能な物もあって、電話の機能もつけるけどiPhoneはそのうちのひとつにしかない。

思春期あたりの子供が下すiPhoneへの評価はまだ理解できるが、出発点を見誤って息巻いてるPDA慣れしていない自称ライフハッカー達の見当違いな評価はウンザリだ。

いろいろ言いたいことはあるんだけど、とりあえず「iPhoneメール機能が貧弱だ」という意見には全く同意できない。

プッシュが貧弱なのは、携帯PCに限らずメールでの即時性は思春期を過ぎればそんなに対した問題じゃないし、むしろ即時性を求められるほど迷惑になってくるし、

では試しにi-modeGmailを読もうとしたら何回クリックしないといけないのか、そもそもIMAPPOPアクセスしようと思うと自分でサーバー立てたりJAVAアプリ作ったりしないと何も出来ないのに対して(どこか他人のサーバーを一度介せばいいんであれば携帯電話でもIMAPPOP読めるサービスアプリあるけどね)、

それに対してアカウントさえ設定すれば、常にアクセスしたらメールが簡単に読めるこの端末のどこがメール機能が弱いのか、全く分からない。

2008-09-23

正規表現の機能の覚書き

はじめに

「はじめての正規表現」ホッテントリ入りしていますが、

導入としては、何に使うのかがわかりやすくて良いのではないかと思います。

あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。

正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)

例では「検索」か「置換」をするものとして話を進めていきます。

「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)

正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。

(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)

メタ文字とリテラル文字

正規表現には、メタ文字とリテラル文字というものがあります。

メタ文字とは機能を持つ文字で、『.』『*』『*?』といったものが当てはまります。

リテラル文字は「文字それ自体」と解釈される文字で、『 』『a』『<』といったものです。

アルファベットや数字はリテラル文字なので、

「検索する文字列:『egg』 置換する文字列:『chicken』」

などとすれば、正規表現を使わない置換と同じ効果になります。

なお、検索して検索文字列が当てはまることを「マッチする」と言います。

メタ文字に使われている文字を検索したい場合は、直前に『\』を置きます。(これを「エスケープ」と呼びます。)

.*?^$()[]{}』などがメタ文字です。

$100』を検索したければ、『\$100』とすればいいということになります。

(『\』は環境によって、半角の『¥』『\』のどちらかになります。)

言語、ツール、モードなどによっては『@/#』もエスケープが必要です。

また、『\』自体は常にエスケープが必要です。

繰り返しについて

メタ文字意味
?直前の文字を0回または1回繰り返す
*直前の文字を0回以上繰り返す
+直前の文字を1回以上繰り返す
{n}直前の文字をn回繰り返す
{n,}直前の文字をn回以上繰り返す
{n,m}直前の文字をn〜m回繰り返す

これらのメタ文字は「量指定子」といって、直前の文字の繰り返しを意味します。

*』は「任意の文字を0回以上繰り返す」とありますが、

「0回以上繰り返す」とは、「全く何もなくてもいいし、いくらあってもいい」という意味です。

よって、『?』は「あってもなくてもいい」、『+』は「1つ以上あればいい」と解釈できます。

colou?r』は『u』があってもなくてもいいので「colorかcolour」ということになります。

{n}』は、たとえば『-{15}』なら、「ハイフン(-)が15個続くもの」となります。

-{10,}』なら「ハイフン(-)が少なくともは10個続くもの(多いのはいくらでも)」、

-{10,15}』なら「ハイフン(-)が10〜15個続くもの」となります。

また、複数の文字を繰り返したい場合は括弧で囲みます。

(Gang){2}Dance』は『GangGangDance』と同じ意味になります。

欲張りと非欲張り

メタ文字意味
?直前の文字を0回または1回繰り返す(欲張り)
*直前の文字を0回以上繰り返す(欲張り)
+直前の文字を1回以上繰り返す(欲張り)
??直前の文字を0回または1回繰り返す(非欲張り)
*?直前の文字を0回以上繰り返す(非欲張り)
+?直前の文字を1回以上繰り返す(非欲張り)

「欲張り」とは、「なるべく多くの文字に適用しようとする」、

「非欲張り」とは、「なるべく少ない文字に適用しようとする」という意味です。

対象文字列が『aaa bbb ccc』だとします。

すると、検索する文字列が『a+』なら『aaa bbb ccc』、

検索する文字列が『a+?』なら『aaa bbb ccc』が置換対象となります。

(「すべてを検索/置換」する場合は当てはまりません)

「『a』を1回以上繰り返す」ということは、『a』でも『aa』でも『aaa』でもマッチすることになりますが、

「欲張り」かそうでないかで実際のマッチは変わってくるわけです。

文字クラス

文字クラス意味
[abc]a、b、cのいずれか
[a-z]a〜zのいずれか
[^a]a以外の文字(改行文字を含めaを除いた全て)
[^a-z]a〜z以外の文字(改行文字を含めa〜zを除いた全て)

文字クラスは『a』や『<』などの代わりに文字の種類を指定するものです。

a〜eのどれかの1文字という指定をしたい場合に『[abcde]』や『[a-e]』といった指定ができます。

また、文字クラス内の最初に『^』をつけて『[^abc]』などとすれば、

「a、b、c以外の何の文字でもいい」とすることができます。

間違いやすいのが「そこにaもbもcも存在しなければいい」という意味ではないということです。

文字クラスは「なんらかの1文字の身代わり」なので、それは何か1文字を表しています。

-』は範囲を表すのに使用します。そのため、『[;-%]』で「; - %のどれか」を表現することはできません。

-』を含める場合は必ず最初に持ってきます。すると『[-;%]』という風になります。

「; - %以外の文字」としたいならば『[^-;%]』とします。

[』や『]』、『\』を文字クラスに含めたい場合は直前に『\』を置いてエスケープします。

「『[』または『]』」であれば『[\[\]]』となります。

^』やその他の記号は先頭に置かなければいいので、エスケープの必要はありません。

.』は「改行以外のすべての文字」を表しています。

改行は『\n』で表されるため、『.』は『[^\n]』と等価です。

(ただし、正規表現モードによっては「改行も含めすべての文字」を表す場合もあります)

文字クラスにはいくつかの略記法があります。

文字クラス意味同等の表記
\w記号や空白ではない文字すべて[a-zA-Z0-9_]
\W記号や空白ではない文字以外[^a-zA-Z0-9_]
\d数字[0-9]
\D数字以外[^0-9]
\sタブや改行など、空白類とされる文字[ \t\n\r\f\v]
\Sタブや改行など、空白類とされる文字以外[^ \t\n\r\f\v]

(*間違って『\s』の同等の表記にも『^』がついていたのを修正しました)

(『\t』はタブ、『\v』は垂直タブ、『\r』はキャリッジリターン(CR、改行の一種)、『\f』は改ページ)

これらは『[a-fA-F\d]』のようにすることで、文字クラスブラケット角括弧)内に含めることができます。

「同等の表記」と書きましたが、文字をユニコードして扱うツールの場合は、上記が同等の表記にはならず、

たとえば『\d』であれば漢数字が含まれてしまったりするので注意が必要です。

選択

(A|B)』は「AまたはB」という意味です。(これを「選択」と呼びます)

(A|B|C)』なら「A、B、Cのどれか」という意味になります。

(gray|grey)』は『gr[ae]y』とほぼ等価となります。

[ae]』は「1文字のaまたはb」という意味になるので結果的に、ほぼ同じ効果が得られるわけです。

(ただし、これはgrayとgreyの違いが1文字だけだったためで、そうでない場合はこうはなりません)

気をつけなければならないのは、その順番です。

(Java|JavaScript)』で検索すると、対象文字列内に存在する『Java』と『JavaScript』すべてマッチするように思えますが、

JavaScript』は選択肢の前(左)のほうにある『Java』が当てはまってしまうため、

Script』部分にはマッチせず、『JavaScript』というマッチになってしまいます。

選択では左側が優先されるので、『(JavaScript|Java)』とすることでこの問題は防げます。

言語、ツールによっては、この問題が起こらない=順番関係なく長いほうを適用しようとするものもあります)

アンカー

メタ文字意味
^行頭
$行末
\b単語境界
\B単語境界以外

リテラル文字や文字クラスが「文字自体」にマッチするのと違い、アンカーは「位置」にマッチします。

検索する文字列が『^』、置換する文字列が『>』なら、「行頭に『>』を挿入する」という意味になります。

単語境界とは、「単語を構成する文字=『\w』に相当する文字」と「単語を構成しない文字=『\W』に相当する文字」の間の位置のことです。

regular expression.』なら『^regular^ ^expression^.』の4ヶ所に当てはまります。

\b.*?\b』とすれば単語すべてにマッチさせることができます。

しかし、「単語構成文字」が基準なので、『JavaScript』は1単語でも、『L?K?O』は1単語とは見なされません。

アンカーは位置にマッチするので、文字クラス内に含めることはできません。

^』や『$』を文字クラスに含めても、その文字自体という意味になります。

つまり、『[^$]』なら「行頭または行末」ではなくて、「『$』文字以外」ということになります。

また、『\b』は文字クラス内のみ、バックスペース文字を表す場合が多いようです。

大文字と小文字

正規表現には、大抵「大文字と小文字を無視する」というオプションがあります。

これが入っていないと「『to:』で検索しても『To:』にマッチしない」といったことが起こります。

言語、ツールによっては、正規表現の一部にのみ大文字と小文字を無視する機能があるものもあります。

例えばRubyでは『(?i:foo)』という形式を使用できます。

(?i:Ruby) Python』という表現なら、『ruby Python』や『RuBy Python』にはマッチしますが、

RUBY PYTHON』にはマッチしない、ということになります。


キャプチャと後方参照

括弧内に入れた文字列は、ある場所に記憶されます。(「キャプチャ」と呼びます)

これは『\n』という表記を使って呼び出すことができます。(nは数字)

同じ単語が2連続で出てくるもの(『merry merry』みたいなもの)を探すという場合、

\b(\w+)\b \1』とすることができます。(ここで使った『\1』を「後方参照」と呼びます)

こうすると、『\1』の部分は、『(\w+)』を使ってマッチしたものと同じものがあるものとして解釈されることになります。

括弧を何個も使う場合は、左の括弧から順に『\1』、『\2』、『\3』となります。

また、後方参照は置換文字列にも使うことができます。

つまり置換文字列内に『\1』と書けば1番目の括弧、

\2』と書けば2番目の括弧でキャプチャされたものがそこに入ることになります。

この場合、言語、ツールによっては『\n』ではなく『$n』を使う場合もあるようです。

括弧は『(foo|bar)』という選択や、『(humbert){2}』というグループ化など、キャプチャ以外にも使われます。

そのため、キャプチャに使われた数字をわかりやすくするために、キャプチャしない括弧もあります。

それには『(?:foo)』という表記を使います。

前の例であれば『(?:foo|bar)』と『(?:humbert){2}』になります。

先読みと否定先読み

「その位置の続くものを確認する」というのが「先読み」です。

対象文字列を『JavaScript Java Applet』として考えてみましょう。

Java(?=Script)』は「『Script』が後に続く『Java』」にマッチします。

(?=Script)』の部分が、「『Script』が後に続くかどうか」をチェックしているので、

後ろに『Script』が続かない単なる『Java』にはマッチしません。

(?=Script)』の部分は「後に『Script』が続く位置」にマッチしていることになります。

この例のマッチは『JavaScript Java Applet』となります。

逆に、『Java(?!Script)』とすれば、「『Script』が後に続かないかどうか」をチェックするので、

後ろに『Script』が続かない単なる『Java』にマッチさせることができます。

こちらは「否定先読み」と呼びます。

この例のマッチは『JavaScript Java Applet』となります。

言語、ツールによっては、「その位置の前にあるものを確認する」という「戻り読み」「否定戻り読み」がサポートされているものもあります。

(これは『(?<=foo)』『(?<!=bar)』という形で使います)

先読みや否定先読み、戻り読みなどをまとめて「前後読み」と呼びますが、

前後読みは位置にマッチするため、戻り読みは先読みとは通常書くべき位置が逆になります。

(?<Mozilla )Firefox』とすれば、『Mozilla 』に続く『Firefox』のみにマッチします。

強欲な量指定子とアトミックなグループ

メタ文字意味
?+直前の文字を0回または1回繰り返す(強欲)
*+直前の文字を0回以上繰り返す(強欲)
++直前の文字を1回以上繰り返す(強欲)

上のほうで?、*、+は「欲張り」だと書きましたが、「欲張り」な量指定子も“ゆずる”ことがあります。

対象文字列が『"something"』だとして、検索文字列".*"』はこれにマッチします。

しかし、強欲な量指定子*+』に置き換えて『".*+"』とするとマッチしません。

これはなぜかというと、「欲張り」な量指定子を使った『.*』の部分は、

最後の『"がなければ『something"』にマッチすることになりますが、

正規表現の最後に『"』があるために、対象文字列の最後の『"』をゆずっているのです。

しかし、強欲な量指定子*+』はゆずることがないため、

.*+』の部分が『something"』にマッチしてしまい、

正規表現の最後の『"』にはマッチできなくなるのです。

強欲な量指定子サポートしていない言語、ツールでも、「アトミックなグループ」というものが使える場合があります。

アトミックなグループでは『(?>foo)』という表記を使います。

\w?+』なら『(?>w+)』、『\w*+』なら『(?>w*)』、『\w++』なら『(?>w+)』で代替できます。

意図しないマッチに気をつける

*』の「直前の文字の0回以上の繰り返し」はよく気をつけないと、間違ったものにまでマッチしてしまいます。

リテラル文字と文字クラスは「文字自体」にマッチすると書きましたが、

-*』というような表現は、『-』や『--------』だけでなく、

『』つまり、空文字列にもマッチしてしまうのです。

なぜそうなるかというと、「0回以上」ということは「なくてもいい」ということだからです。

文字列へのマッチは、実質上「位置」へのマッチと似たようなものになります。

検索文字列を『-*』として一括置換すると、

-』や『--------』が置換されるだけでなく、

-』が存在しないすべての場所に置換文字列が挿入されてしまうことになります。

正しい正規表現を書くためには、「どう書けばマッチするか」だけでなく、

「どういう場合にマッチしなければいいか」についても考えてみる必要があります。

ワイルドカードの『*』≒正規表現の『.*

「はじめての正規表現」で、

ワイルドカードの『*』=正規表現の『.*

とありますが、これは厳密には微妙に違います。

ファイルグロブでは《*》は「任意の文字を1回以上繰り返す」

つまり、1文字以上あればなんでもいいということになります。

この意味だと、《*.*》は "foo." や ".bar" は当てはまりません。

しかし、「0回以上」であればマッチすることになります。

正規表現では「1回以上繰り返す」は、《+》なので、

「任意の文字を1回以上繰り返す」は『.+』となります。

よって、《*.*》とほぼ等価な表現は『.+\..+』となります。

これは私の勘違いでした。miauさんご指摘ありがとうございます。

「*.*」は foo. にマッチするはずだし、.barマッチしないのは、「*」がドットファイルマッチしないっていう特殊ルールがあるから・・・ですよね?

ワイルドカード(ファイルグロブ)の「*」って - miau's blog


ファイルグロブの《*》は、「0回以上繰り返す(ただし例外として、一番最初のドットは表せない)」ということのようです。

*.*》とほぼ等価な表現は、正しくは『(?!\.).*\..*』となります。


最後に

正規表現を使うにあたっては、検索対象がどのようなものか知っておくことが重要です。

\d{4}[-/]\d{1,2}[-/]\d{1,2}』で日付と思われる文字列を検索することができますが、

これは『00-0000-00-00』というものにもマッチしてしまいます。(『00-0000-00-00』)

かしこれを厳密にしようと思えばかなり複雑な正規表現になってしまうので、

どの程度の厳密さが必要かを把握しておくことが肝要と言えるでしょう。

冒頭にも書きましたが、正規表現は、言語やツールによって微妙な違いがあるので、

その辺りについては各言語、ツールの説明を参照してください。

本格的に学びたい場合はオライリー「詳説 正規表現」おすすめです。

(ただ、この本はプログラミングのことを多少は知らないと難しいかもしれません)

また、PHP正規表現チェッカーですぐに試せるようです。

関連リンク



反応への応答

b:id:K-Onoさんの

なぜ増田? これでidデビューしてもいいんじゃないのか?

について。

実ははてなダイアリーもある(d:id:sleepwlk)んですが、長いこと書いてなかったので、

匿名ダイアリーのほうが多くの人に見てもらえるのではないかと思ってこちらに書いてみました。

*2008-09-23 誤記の修正と、一部加筆しました。

*2008-09-24 ワイルドカード記述を修正しました。

*2008-09-24 文字クラス記述の間違いを修正しました。b:id:FunnyBunnyDizzyさんご指摘ありがとうございます。

*2008-09-24 「意図しないマッチに気をつける」を追加しました。

ログイン ユーザー登録
ようこそ ゲスト さん