はてなキーワード: javaとは
http://www.jmiu-ibm.org/2008/11/209.html
で話題になってるみたいなので、1OBとして会社の感想を書いておきます。
私は新卒で入社し5-6年ぐらい在籍して辞めました。辞めたのは数年前でしたが、中に残っている人の話を聞く限り、状況はそんな変わってないように思います。
IBMはすごく良い会社でした。特に仕事面ではいい仕事をたくさんさせてもらい、随分成長できたと思います。
このような形で、若手が仕事をする上ではかなり良い環境だったと思っております。((あくまで若いうちは、ですが。昇進して上になるとまた変わるのですがそのあたりは割愛いたします))
大変充実し、恵まれている環境でしたが、嫌な事も多かったです。その一つが、何も仕事をしていない50代以上の年寄りスタッフが多すぎることでした。
彼らは、かつてはIBMが主力のビジネスにしていたメインフレームの営業さんであったり、それら周りのエンジニア等でした。
IBMは90年代初頭に業績が悪化しましたが、ガースナーという経営者を外部から招聘し、彼のもとで大きな改革が行われました。それにあわせて、日本以外の国ではそのような今後のビジネスに必要の無い従業員はあらかたいなくなりました。
しかし、日本だけは特別で、中々クビを切れないということで、「配置転換」や「再教育」が行われたのです。
自分の顧客資産を生かして再度サービスの販売でのし上がった人もいますし、40過ぎてjavaを覚えて新しい領域のエンジニアになり今でも前線で活躍している人もいます。工場勤務時代の経験を生かして、最先端の工場運営についてコンサルティングをしている人もいます。
しかし、そのように再チャレンジすることを拒否し、ただ会社にいて高い給料をもらうという選択をした人たちもたくさんおりました。
仕事が無いので現場において置けないので、ビジネスマネジメントとかクオリティコントロールなどという間接部門(正確な名前はもう忘れました。意味不明な横文字言葉が多すぎるのも悪いところです)が置かれ、そこに大量の使えない人があぶれていました。
彼らは9時5時でネットを見たりマインスイーパを一日中やってて帰る生活を送り、しかも彼らは長年勤務しているだけあってかなり給料があがっていました。
正直言って自分が稼いだ金を奴らに吸われているという感覚はありましたし「あいつら全員首にしたら絶対この会社は良くなるのに」という話を若手同士でよくしていた記憶があります。
そんな彼らの代弁者になっているのが今回の記事を書いた組合なのでしょう。元記事も随分過激な内容になっています。
しかし、私がみると「またか、いい加減にしろ」としか思えません。私にとって組合は、毎週のように意味不明な内容をエキセントリックに書き散らすチラシを配る存在であり、毎週オフィスをうろうろ回ってカンパを募りに来るだけの存在でした。彼らの目は死んでおり、チラシはそのままゴミ箱に捨てられ、誰もカンパに応じていなかった。少なくとも私の周りで組合員だった者を知りません。
よく組合の幹部で、役員と交渉することがエリートコースというようなことが普通の日本企業では言われてるそうです。少なくともあの会社に関してはそのような雰囲気は微塵も感じられず、終わっている集団という認識でした。
そんなに社内で存在感の無い人たちの寝言が、ネットで話題になっていることには、率直に言って悔しいですし怒りを覚えます。こんな人たちの目線で見たIBMがネットで有名になるのには我慢なりません。IT業界に身を置いたなら生涯勉強だろうが。それもやらないでダラダラくだらない仕事して不当に給料もらってやれ降格だクビだといわれてギャーギャー騒ぐんじゃねえよ。
今回の大元となったリストラ報道を聞いたときは、ようやく日本のIBMもまともな会社に生まれ変わることができそうと思いました。むしろ、元記事にあるような低評価、降格人事、退職強要なるものを行ってこなかったことが今の業績不振を招いており、若干遅きに失したかなとも思います。30代、40代前半の優秀な方々で見切りをつけて出て行ってしまった方もたくさんおります。ただ、これで少しでも本当にまともに金を稼いでいる人への還元がなされればよいと思います。
以上1個人の意見ですが、中にはこう考えている人もいたということで何かの参考になればと思います。
それでは。
僕はMacユーザだ。最初に買ったのはスケルトンのiMac。FirewireとDVD-ROMがついているやつで、色はグリーンだった。OSはMacOS9.0.2。もう10年近く前の話だ。
僕がMacを買ったのは、ひとえに絵が描きたいからだった。正直Windowsにするかどうか、とても悩んだ。でもその頃買った色彩王国という色の塗り方をプロにインタビューした本では、CG塗りをしている人はMacを使っていた。だから僕もMacを買った。その頃は絵のプロになる気満々だったから、A3までプリントでき、カートリッジを交換すれば同じくA3までスキャンできるプリンターと、とても高かったけどPhotoshop 5.5J、そしてタブレットも一緒に買った。さすがにタブレットまではお金が回らなくて、Favoの一番安い奴になっちゃったけど。本を読んでPhotoshopでの絵の塗り方を勉強した。自分なりにいろいろいじって、デジタルトーンのかけ方を覚えたりもした。それで僕は満足していた。その頃に描いた絵は今もちゃんととってあってpixivにアップしてあったりする。
でもMacに不満がないわけでもなかった。興味本位でプログラミングをやってみたいと思っていたけど、ネット環境もなく大型書店もない田舎住まいの僕にはMacでのプログラミング方法なんて分かんなかった。それに、爆弾がよく出たりとか、どこにファイルを置いたのかすぐ忘れてしまったりとか、そういうところでも不満があった。
そして、絵のプロを目指すとか思っていたのに、いろいろ思う所あって実家を離れ大学に進学した。学科はプログラミングが出来そうな情報系を選んだ。そして大学で、コンピュータ室の管理のアルバイトをすることになった。
そのアルバイトでは、大学で使っているUNIXシステムのユーザサポートと、その他の雑用をやった。雑用用にはWindowsXPだったか2000だったかのマシンを使わせてもらえることになった。そして驚いた。WindowsはMacよりも使いやすかったことに。
ユーザのホームがあってその下にマイドキュメントがあって、とどこにファイルを保存すればいいのか簡単に分かったし、それゆえ作ったファイルが行方不明になってしまうこともなかった。安定性も高かった。
ただ、プログラミングに関しては大学の授業とバイトの兼ね合いで、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を使ってすぐにインストールできる。ブラウザでの表示確認にはSafari、Firefoxをはじめとしたモダンブラウザが使えるし、Parallels Desktopを使えばWindowsもインストールでき、そのブラウザからMac側で動かしているWebアプリの表示確認をすることだって出来る(たいていはIEに失望することになるが)。
絵を描きたいというところから始まった僕のMac人生だけれど、Web屋もどきになった今でも重宝している。これからもよっぽどのことがない限り変えることはないだろう。非常に長く主観的な思い入ればっかりの文章を書き連ねてきたけど、これが僕がMacユーザを続けてるわけ。
つい最近Google App Engine Oilに処女を捧げたばかりの増田ですが。
ドキュメントの量?
そんなもんネーよ。App Engine自体、pythonのドキュメントに比べたらヘみたいな物だよ。ドキュメントよりコードだよコード。
HTMLがピロ?
それで十分じゃネーか。パラメータだ?クッキーだ?セッションだ?そんな物に構ってられるか。
対応してる奴使え。対応してなきゃ捨ててしまえ。
知るか。SQLなんか捨てちまえ。そんな高尚な物なんて必要ねー。
業務?
そんなもん使えるかボケ。
ってのはおいといて。
結局、定型処理の標準化なんで、設計もフレームワークに合わせて標準化するなら有用でしょう。
Cでやってたのをjavaで標準化したような物。
ちまたじゃ、みんなフレームワークのことを当たり前のように論じててすごいなーと思うんだ。尊敬するぜ。だから、ミーハーなオレもフレームワークが気になって仕方ない!
だから、30歳近いプログラマのオレがプライドを捨てて優秀なハテナ住人に聞くが、
だが、そこまでだ。
Javaだと、Struts、Spring、Seasar、Wicket等をよく目にするけどよぉ、ドキュメントの量どんだけだよ。
入門ドキュメントだけ見ると簡単そうに思えるけど、仕事で使えるレベルまで理解が深まるまでどんだけ時間かかんだよ。
起動遅い、動き遅い、定型パターンを外れたら、やる方法が見つかんねー。
で、苦労して作ってもよぉ、結局は、HTMLがピロッって出力されるだけで、見てくれが変わるわけでもなく、全然努力が報われん。
これって、どゆこと?
Servlet+JSP+簡単なライブラリ 程度で十分じゃね?
PHPだと、Zend Framework、CakePHP、symfony等をよく目にするけどよぉ、ドキュメントの量どんだけだよ。
入門ドキュメントだけ見ると簡単そうに思えるけど、仕事で使えるレベルまで理解が深まるまでどんだけ時間かかんだよ。
デバッガの使い方分かってねーオレが悪いとは思うんだが、開発効率悪いぞ。(フレームワーク以前の話だが…)
統合開発環境何使えばいいの?わざわざクラス名や関数名覚えてられんぞ。(フレームワーク以前の話だが…)
何で、拡張子変えたがる。何で、変なテンプレートエンジン使う。エディタで認識されねーから開発効率悪いじゃねーか。デザイナがコーディングした分かりくいHTMLコードをよ、何で編集してるわけ?
ついでに聞くけどよぉ、ORマッピングライブラリって使えるの?
確かに書くコード量は少なくなっていいんだがよぉ、目に見えて遅いと思うのはオレだけか?
ディスクアクセスは明らかにボトルネックになるのに、巨大なライブラリのコードを毎回走らせるんだよ。普通のサーバじゃ余裕なの?
話題がそれたが、
実は、みんな、上司や先輩に言われて使ってるだけなんじゃないの?
ハテナ住人の優秀なエンジニアは、どんな目的でフレームワーク使ってんだ?教えて偉い人!
ま、誰も見ないんだろうけど。
興味のある方、ご返信頂ければ嬉しいです。
端的に言えば、Java系エンジニアの自宅での開発環境を教えて頂きたいです。
家にあるのがノートPC1台だけなのですが、この環境ではなかなか開発する気になれません・・・。
以下、補足。
就職するまではプログラミングは一切したことがなく、就職して初めてプログラミングするようになりました。
会社ではWindowsで、Eclipseを使ってJavaばかり書いてます。
会社の開発環境はとても快適で、ディスプレイも大きいのが2つあるし割と楽しくプログラミングさせて貰ってます。
が、最近自宅でも開発してみたいなーという想いがふつふつと沸いてきました。
興味があるのはやっぱりJava、それからGroovy, Pythonです。
ところが、家では殆どインターネットしかしないので、我が家のPCは1年前のMacbookがあるだけです。
JavaやGroovyはやっぱり会社の環境(マルチディスプレイ + Eclipse)に慣れているとMacbookではとても不便です。
また、MacbookだとEclipseの様々なショートカットも使えません・・・(これがかなり致命的)。
持っているのが新型のMacbookなら、先日発表されたCinema Displayを使えば解決するのかなと思いますが、旧型では使えないし・・・。
Javaエンジニアの人で、ノートPCでEclipseを使っている方って居られるんでしょうか?
諦めてiMacを買うか、Macbook + Cinema Displayを買い直すか、どちらかしかないのかなぁ・・・。
皆さんの自宅での開発環境、良かったら教えて下さい。
「IE8」「Firefox」「Safari」「Google Chrome」… 激化するブラウザー競争:アルファルファモザイク
http://alfalfa.livedoor.biz/archives/51386857.html
自分はFirefox 3をゴリゴリにカスタマイズして使っています。
ですがFirefoxが他ブラウザに比べてそれほどに素晴らしいとおもっているわけではありません。
『特定アドオンが便利すぎてやめたくてもやめられない』
からFirefoxユーザーをやめられないのではないでしょうか。
自分はブラウザ比較で取りざたされるJava ScriptやFlashの実効速度だの
レンダリング性能だのはブラウザ選びにそれほど重視しません(Acid Testの実行結果も)
記事であげられているブラウザのいくつかはテスト版からそれぞれ使用していますが、
いずれもソフトのユーザー(そのブラウザのファン)からの要望をきちんと取り入れて今のような形になっているということが伺えます。
「○○が糞」という評価の仕方や「Proxomitronとの組み合わせ」をブラウザ比較で上げるのは
やはりあまり適切ではないのでは無いかと思います。
これは余談となります。
たんなる事実の一つですが、自分の周りの長くインターネットに携わっている、いわゆる上級者は
めぐりめぐってIEをタブなしで使うという結論に至る人が多いようです。
少なくともIEで見られないような設計をしてるサイトはないですから、それももちろん正解なのでしょう。
必要でないところに無用な労力を払わないというのも『できる奴』の条件ですし。
もしIE以外のブラウザをこれから使ってみようかという方は、ネット上での意見だけを頼りにせず自分で色々と試していただきたいです。
その結果IE 6が一番使いやすいと思ったとしてもそれは不正解でもなんでもありません。
きちんと自分にとって必要なソフトウェアを見極められたという証明と言って良いはずです。
IBMって、こういうプログラミングに関する記事を書いていて、javaの他、javascriptやその他LL、他にもMySQLとかlinuxだったり、サーバ管理の話だったり、そういう記事を沢山書いていて、そして日本語訳しています。
MicrosoftやSunも、自社製品に関してが中心ですが、MSDNとかSDCといったサイトをもっています。
それにひきかえ日本はどうでしょう。
もちろん、中の人達は論文や雑誌、書籍などを出しているでしょう。
しかし、だからこそ、会社として公開の場をもつ事が、技術者を育て、集める事につながると思うのです。
はてなだってやっているのです。
文系でもその気になれば身につくの?
情報科学って
何とかなると思うよ。
wikipediaの情報工学の「基礎的な理論」とか「ソフトウェア技術」とかを一通り読んで、
「そういうものがあるんだ」と引き出しに確保しておく。理解するのは年単位の後回しでも十分。
何かプログラム言語を使って、Fizzbuzz問題とかの簡単な課題を解く。
手っ取り早く仕事にしたいなら、JavaでDBを使ったWEB掲示板でも作ってみてもいい。
入門サイトなんて世の中にあふれてるから、学習コストは低いお!!
いまさらだがFizzBuzz。
1から100まで、3の倍数5の倍数云々って、全部定数の計算じゃね?
というところに気付き、自称メタプログラマー(略してメタグラマー)俺の血が騒いだ。
定数計算なら、それは実行時ではなくコンパイル時に行なわれるべきだ……。
#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言語はコンパイル時に関数が実行でき、その結果をソースコードとして取り込める!
ただし実行できるのは簡単な関数だけだけど……。
import std.stdio; // これでFizzBuzzを全部出力するコードを作るぜ! string makeFizzBuzzCode() { string code; for(int i = 1; i <= 100; ++i) { // 効率? コンパイル時にそんな配慮は要らん! if(i % 3 == 0 && 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++やJavaやC#にできない事を平然とやってのけるッ
そこにシビれる!あこがれるゥ!
というか、
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 && 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言語!
http://www.kmonos.net/alang/d/1.0/index.html(1.0。こっちの方が安定してる?)
この仕事辞めようと思っている。
学校でC++とかJAVAとかVBとか…色々ごちゃごちゃ習ってたけど、正直現場のノウハウなんぞサパーリな状態だった。
だから、その会社にプログラマが居なかった事は物凄く不幸だった。
WEBシステム開発部門を作るという事で、私を含めプログラム未経験者が二人採用されたんだ。
細かいこと言うと、私と一緒に入社した人は、一応PHPやPerlは組んだことが有るけど、「現場のノウハウを知らない」という点は私と同じだった。
入社してからは、もう全部手探り。
開発環境の整え方なんぞ全然分かってない。
取り敢えずPHPやれ、と言われたから、結構必死で勉強しながらメールフォームとか簡単なコード書いた。
当時は画面が切り替わる度に変数が初期化されたりするのが不思議だった。
一緒に入った同僚は、「Postgre専門だからMySQLはよく分からん」と言う。
仕事の渡され方は大概丸投げ。
その仕様ってのが結構曖昧。何というか、「流れ」だけ説明される。
「管理画面で商品を登録すると、商品一覧に追加されるんだけど、登録する時に一緒にカテゴリを設定できるように…」
「カテゴリは大カテゴリ・中カテゴリ・小カテゴリがあって、管理画面で登録できるように…」
とか、そんな感じ。
こういうのを聞いてプログラミング出来るのが当たり前なんだろうけど、私は凄く苦手だった。
苦手だからってやらない訳にはいかないからやってたけど、難しく考えるからだろう、時間がかかった。
後、基本的に画面イメージがない。
仕事を渡されると、全部任される。
テーブルの設計をしながら仕様を確定していって、画面イメージを作成していく。
最初の内は、正規化すら全然知らなかったからぐだぐだなテーブルばっかり設計して、コードを組む段階になってヒーヒー言ってた。
最初から書き直す事もしばしばだった。
もっと効率良くやりたい、と助言を乞おうにも、先輩なんて居ない。
同僚はその辺の作業進行は上手いものの、開発レベルは私と同じぐらい。コードはスパゲッティ。
友人達もプログラムやってたりするけど、WEBプログラムじゃないから相談しても色々と噛み合わない。
仕方がないから、うまいやり方は無いか、とひたすら暗中模索でやってきた。
で、そんな事を1年程続けた辺りで、長年プログラミングしてきた人と交流する機会が有った。
短い間だったけど、その人が教えてくれた知識でかなりショックを受けた。
開発環境の整え方とか、テストケースとか、フレームワークの事とか、えーと、まぁ、なんて言うか、プログラミングの考え方(みたいなもん)とか。
(ちょっと上手く言えない。現時点でも私は、とてもじゃないが自分の事をプログラマだなんて胸を張って言えない程未熟だと思っているし)
そして、ショックを受けたのは同僚も同じだった。
正直今まで自分がやってきた事の全部をひっくり返された気分だった。
全部が全部無駄だったという訳じゃないが、今まで非効率的で馬鹿で遠回りな事ばかりしていた。
その後はSubversionやTracが導入された。
同時期に私は新しい案件を任された。
その案件の規模は小さめで、私は今まで不安定だった開発スタイルを整えようと、半分賭けでその案件をcakePHPで構築しようと決めた。
無論、全然分からないから参考書とか公開されてるソース見たりとか、ネットの情報とかで勉強しながら、だけど。
symfonyとかZend Frameworkとかでも良かったと思うんだけど、
たまたま先のプログラマの人がcakePHP使ってる、と言ってたから「じゃあそれにするか」とcakePHPを選んだ。
違いも分からんから最初は何でもいいや、と思ったってのも有る。
何度も躓いたり挫折しかけたりしたが、なんとか構築しきった。
つたないものでは有るが使い回しの効くメソッドなりを作れたし、正直凄く嬉しかった。
その頃には、ある程度ではあるがフレームワークでの開発が手に馴染んでいた。
そんでも一人でじめじめコーディングするスタイルは変わらなかったから、コードの中身はお察しくださいなスパゲッティ。
もうこの会社に居続けても意味が無い、と思った。ひとりよがりなコードを量産するだけだ。
だから、「今年いっぱいで会社を辞めようかと思います」と告げた。
それが大体半年前。
今年が終わるまで@2ヶ月ぐらい。
こんな経験年数半端な人材って、需要有るんかなぁ。女だしなぁ…、というかそもそも転職回数が多いのが一番痛い。ブラック企業ひきすぎ。
無知を乗り越えるという性質のやる気はあるから、がらっと業種を変えても良いかもしれない。
というか、ぶっちゃけ残業時間がえらい事になってたから、IT業界はもうしたくないな、と思う一方で、
やっぱりプログラム好きだからプログラマやりたいという思いが有る。
でもプライベートでやりたい事あるから、あんまり仕事で時間を割かれるのも困る。
後、親が元気な内に孝行しときたい。
こないだ、カーチャンのスレ見てたのがかなり効いてる。
「あんた転職するんでしょ? 転職前に休み作ってよ。一緒に旅行行きたいから」とか言ってるし…
「仕事が忙しいから」とか「疲れてるんだから休ませてくれ…」とか言って全然孝行出来なかったから、そろそろ生活における仕事の割合を減らしていきたいところ。
でも、
難しいよなぁ。
転職、どうしたもんだかなぁ。
JavaScriptのほうがJavaよりもずっと不細工でデブくて醜くて重すぎるんだけどな。
Javaは周辺含めるといろいろ汚いんだろう。
CLDCばっかり使ってる俺にはそういうところは関係ないので、
中途半端に優秀なプログラマが「正しいプログラミングテクニック」だと妄信しがちな3つポイント
ちょっと囓っただけの素人が自分を過信して陥る三つの罠?
d:id:fromdusktildawn:20081026さんは「共通化とか抽象化ができるようになった中途半端に優秀な』人を対象にしているのに対して、d:id:JavaBlack:20081026さんは『ちょっと齧っただけの素人』を対象(元記事に対してかもしれない)にしているので、適用対象のレベルがそれぞれ違う気もするけど。
d:id:JavaBlack:20081026さんの記事に対するブクマコメントの幾つかやトラックバック先において、『Java屋らしい』との書き込みがあるけれど、具体的に『Java屋らしい』とはどんなことを指すのでしょう?
当方嫌われ者のエンタープライズ開発withJavaな人間ですが、Javaがよく使われるエンタープライズ向け開発などを行っていると、プログラミングは企業入ってから覚えました、っていう人の方がマジョリティだから、こういう“プログラミングのセオリー”のようなものは知る機会がないと言っていい。よほどいい先輩に当たらないと、こういうことすら教えてくれないことの方が多い。
プログラマなら自分で調べて当然、という意見もあるだろうけど、上記“マジョリティ”の彼らは、自宅でコーディングなんてするはずがないし、早くコーディングなんて卒業したい、と考えている人種。
そんな人たちは、こういうことを『知らない』し、『知ろう』とも思っていない。
そういう現場にとっては、
とある程度型にはめて指導することは、とりあえず『最低限のレベル』を守るためには有効だと思うのだけれど。まぁ元記事では『中途半端に優秀な』とわざわざ断っているから、こういうことを最低限知っていて、杓子定規になんでもかんでも共通化したりローカル変数ばっかり使っている人に対しての進言なんだろうとは思いますが。
『Java屋らしい』とは、Javaが静的型付け言語だけに、なんでもかんでも「こうしなければいけない、ならない」と断定してしまう点を指して『堅い(硬い?)』ことを言っているのでしょうか?
あと、『Java屋は長ーいメソッド名が見やすいと感じるらしい』というコメントについては、Java屋がCOBOLerに対して、
なんて書くのは冗長だよなー。とか、xx区分みたいな項目が横並びに何十項目もあるRDBなんて作るんじゃねぇ、とか思う心理と似たようなものなんでしょうか。
そもそもJavaがこんなにdisられるようになったそもそもの理由も知りたい。
教えてLLな人。
遅レスでスマソ。
確かにC言語とかJavaを完全に理解していてもそれだけでLinuxやGoogleが作れる訳じゃないもんなあ。
世の中のニーズを取材して、どうハードウェア(世間)を叩いて動かすか勉強して、どんなライセンス(媒体)でリリース(発表)するか選択する、とか色々。当然協力者もかき集めないといけないし。
文章を読むのだって「読解力」なんて一括りにできないに決まってる。
スポーツ関連の文章を読むときは体育の経験が必要だし、動物や生物の文章を読むときは理科の知識が少しは必要になる。
(逆に、そういう前提条件を取っ払った上で読める文章を書けるかどうか、というのは作者の側の責任)
文章を読んだり書いたりすることは、本当は「国語」なんて一教科に任せきれないところがあるのかもしれない。
生徒の「読解力」を否定するのはつまり生徒の全人間性を否定する部分があって、
ぶっちゃけ「お前は人の気持ちが分からない奴だッ!!」と頭ごなしに罵倒するのに近い気がする。
そんなことして教師は責任取れるのか、と言われれば多分取れない。
取れないけど他に良い方法も浮かばないのでやってる。というところなんだろうか。
文学鑑賞は拙く教えるほかないかもしれないけど、
小論文を突破できない点は論理的な文章の読み書きを訓練すればどうにかなりそうな気がする。
小中を振り返って、ロジカルな文章の読み書きなんてロクに教わった覚えがない。
(もう十年くらい昔の話なので今は改善されてるかもしれないが)
高校を出た頃にようやく「理科系の作文技術」(アメリカ云々の元ネタ)とかを自分で読んで、
文章とはこうやって書くものだったのか! とかなりびっくりしてしまった……。
なんでこれを日本の中学はやらねーんだチクショー、授業料返せ! とか思ったよ。
結局自分で読みまくって書きまくって身に付けるほかないのよね……と諦めたら負けだと教育者の方々は思ってるか。(汗)
ところでこの話、オレとしては遠い昔に2chの学校板でした議論の蒸し返し+発展形なんだけど、あんたってまさかあんときのアンタじゃないよね?
2chには出入りしていないので別人だな。(汗)
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-modeでGmailを読もうとしたら何回クリックしないといけないのか、そもそもIMAPやPOPにアクセスしようと思うと自分でサーバー立てたりJAVAでアプリ作ったりしないと何も出来ないのに対して(どこか他人のサーバーを一度介せばいいんであれば携帯電話でもIMAPやPOP読めるサービスやアプリあるけどね)、
それに対してアカウントさえ設定すれば、常にアクセスしたらメールが簡単に読めるこの端末のどこがメール機能が弱いのか、全く分からない。
「はじめての正規表現」がホッテントリ入りしていますが、
導入としては、何に使うのかがわかりやすくて良いのではないかと思います。
あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。
(正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)
例では「検索」か「置換」をするものとして話を進めていきます。
(「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)
正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。
(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)
メタ文字とは機能を持つ文字で、『.
』『*
』『*?
』といったものが当てはまります。
リテラル文字は「文字それ自体」と解釈される文字で、『
』『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回以上繰り返す(非欲張り) |
「欲張り」とは、「なるべく多くの文字に適用しようとする」、
「非欲張り」とは、「なるべく少ない文字に適用しようとする」という意味です。
すると、検索する文字列が『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 にマッチしないのは、「*」がドットファイルにマッチしないっていう特殊ルールがあるから・・・ですよね?
ファイルグロブの《*
》は、「0回以上繰り返す(ただし例外として、一番最初のドットは表せない)」ということのようです。
《*.*
》とほぼ等価な表現は、正しくは『(?!\.).*\..*
』となります。
正規表現を使うにあたっては、検索対象がどのようなものか知っておくことが重要です。
『\d{4}[-/]\d{1,2}[-/]\d{1,2}
』で日付と思われる文字列を検索することができますが、
これは『00-0000-00-00
』というものにもマッチしてしまいます。(『00-0000-00-00
』)
しかしこれを厳密にしようと思えばかなり複雑な正規表現になってしまうので、
どの程度の厳密さが必要かを把握しておくことが肝要と言えるでしょう。
冒頭にも書きましたが、正規表現は、言語やツールによって微妙な違いがあるので、
その辺りについては各言語、ツールの説明を参照してください。
本格的に学びたい場合はオライリーの「詳説 正規表現」がおすすめです。
(ただ、この本はプログラミングのことを多少は知らないと難しいかもしれません)
また、PHP正規表現チェッカーですぐに試せるようです。
b:id:K-Onoさんの
について。
実ははてなダイアリーもある(d:id:sleepwlk)んですが、長いこと書いてなかったので、
匿名ダイアリーのほうが多くの人に見てもらえるのではないかと思ってこちらに書いてみました。
*2008-09-23 誤記の修正と、一部加筆しました。
*2008-09-24 ワイルドカードの記述を修正しました。
*2008-09-24 文字クラスの記述の間違いを修正しました。b:id:FunnyBunnyDizzyさんご指摘ありがとうございます。