「Applet」を含む日記 RSS

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

2023-07-31

anond:20230731210135

その前にはFLASHによるRIAというものもあったのじゃ。さらにその前には JAVA APPLET というものもあったがね。みんな消えてしまったゾイ。

2022-09-11

anond:20220911230426

まあねぇ

あと、ネイティブ医療画像ビューアと連携したいとか、

ネイティブと直接やりとりしたい場合Webブラウザセキュリティが逆に邪魔になるからなぁ

ActiveXとかJava AppletとかFlashとか死んでしまったけど、

Webブラウザに穴をあけるのにActiveXとかSilverlightとか便利だった気がする

難しいねぇ…

2020-05-22

anond:20200521225730

プログラミング言語を印象批評している記事に触発されて、自分も印象批評してみようと思う。

JavaScript以外にもブラウザ上でぐりぐりするのにはJava AppletとかFlashとかSilverlightかいろいろあったけれど、結局標準化を成し遂げたHTML5に淘汰されちゃった感じがする。LiveScriptからJavaScript改名されたり、規格を話すときECMA Scriptだったりといろんな別名を持つ。一応、プロトタイプベースオブジェクト指向言語なんだけれど、それを意識してコードを書く人がどれくらいいるかは謎。

Pythonは小さいコードを書くのには楽だけど、これで大きなコードを書くと思わぬ変更で思わぬことが起きるのでつらい。しばらく使うとPythonイヤイヤ病にり患し、goを使うようになるらしいとか、ならないとか。pythonで大規模なコードを万一書こうと思うなら、カバレッジが高いテストを書いてくれと思う。

Javaは初期のころオートボクシング / アンボクシングもなく、ストイックオブジェクト指向言語だった記憶がある。ただ、staticを多用してオブジェクト指向とは程遠いコード簡単に書けるので、Javaで書いているからと言ってオブジェクト指向だと思うのは禁物である

PHPWebネイティブ言語で、初期のころHTTP POST/GETなどで渡された変数がそのままプログラム中に出てくる機能初期化していない変数最初に使うと空文字列あるいは0で初期化するという機能があった。また、文字列数字臨機応変に切り替える機能もあり(今もそうかは知らん)、数字文字比較比較演算子(==)でシームレスにできる。パスワードチェックみたいなコードで===ではなく、==を使っているとPHPを知らないバカ扱いされる。

C#Hello Worldくらいしかいたことないから知らん。monoのような互換環境があるのは知っているけれど、わざわざPC Unix上でmonoを使う気分にはなれなかった。

C++黎明期に使った感じと、C++11以降に使った感じが驚くほど違う言語。今はかゆいところには大抵STLで手が届くし、autoを使えばイテレーション腱鞘炎になることもない。PC Unixにも最初から環境インストールされているか簡単インストールできるので毛嫌いせず使うとよいと思う。

Rubyはぎょっとする変更をよくやるというイメージ。これで書かれたプログラムを長年愛用してきたが、ぎょっとした変更を入れられて動かなくなったのでgoで書き直した。その点ではpythonも3でおいていかれたので嫌い。

CSS...はプログラミング言語なのか?そうか。

TypeScriptは書いたことないから知らない。JavaScriptだと大規模コードを書くとつらいのでTypeScriptを使おうという人がいるのは知っている。大規模なコードを書くとしたら、インタフェースに合った呼び出しかコンパイル時にチェックしてくれるような強く片付けされた言語のほうがよくなってくるというのはわかる。

Cは片付けし、構造化したプログラムを書きやすくしたアセンブラ...というイメージだったんだけど、C99くらいから便利機能がいろいろ入ってそうでもない感じになった印象。昔はCのコードを見たら最適化した後のx86アセンブリが見えていたんだけれど、最近は見えなくなってしまった。子供のころ、本屋で秘伝C言語問答 ポインタ編に出会ったのがこの業界に入るきっかけだったのかもしれない。ほかの言語でいろいろ楽に書けるからカーネルをいじるか、システムコールをたたくかするときくらいしか自分の中では出番がなくなってしまった。

これ以下のランキングのもその気になったら書こうかな。

2018-11-12

あの日administrator1974を雑魚呼ばわりした奴

administrator1974が誹謗中傷理由にBANされたらしい。

もう魚拓読んでもコメント欄は見れないけれど

https://web.archive.org/web/20181107010136/https://qiita.com/administrator1974/items/387aab2a42bf57e3b215

確かこの記事最初のほうのコメントで「JavaJSは違うとN回言われてるんですががが」とか「いまだにJava Applet使ってる雑魚おる?」みたいなコメントあったんだけど、こいつらはBANされないわけ?特に後者は「雑魚」という言葉で明らかに誹謗中傷してたわけだけど。

JavaJavaScriptは別物ですよ」「Java Appletは既に廃止されているので今後必要になると思いません」と言えばいいもの上記のような言い方しかできなかった奴らに非はないのかね。明らかにこいつらが火付けでadministrator1974が荒れだしたんだが。

エンジニア云々じゃなくてよ、インターネットで顔も見れない誰かに対する言葉遣いには気を付けたほうがいいよ。人として。確かにJavaJavaScriptの違いがわかってるお前が正義だけど、なーんで人を小ばかにするような言い方しかできないのかね。

あと荒れだした後に「祭りに乗り遅れた」とか「ワードサラダ」とか「統合失調症」とか言ってるやつらいたけど、こいつら明らかに「荒れてるし間違えてるのはadministrator1974だから何言ってもいい」って感じの思考回路のやつらでしょ。まぁ傍からみたらadministrator1974が難解意味不明コメントを連投してたのは明らかだし2ch思考を持ってるやつらなら祭り感覚コメントちゃうのかもしれないけれど、SNSと紐づいたアイコン丸出しで上記みたいなコメントする奴らがいるなんてビビったね。

コメント欄はもう見れないけど、コメント欄書き込み時間を見るにあの日administrator1974は多く見積もっても5時間くらいしか寝れてないぞ。翌日16:00くらいまでBotのごとく連投してたし。平日にだぞ。俺はあの日administrator1974を狂わせたのは雑魚呼ばわりした奴だと思ってるからな。コメント欄が見れないのがマジで残念だ。雑魚呼ばわりしたやつのアカウントを思い出せない。

2018-06-04

児童手当現況届の提出がインターネット可能になりました

児童手当現況届の提出がインターネット可能になりました。→ やっとか!でも良い進歩だ。

マイナンバーカード (通知カード不可) が必要です。→ ぐぬ、持ってないが、まあ仕方ない側面あるな。

IC カードリーダもしくは IC カードリーダ内蔵スマホ必要です。→ はい解散

iPhoneカードリーダに対応しておりません。(平成30年5月17日現在) → 未来永劫ないだろ?

データPDF に加工のうえ添付をお願いします。→ 普及させる気ある?

こういうのシステム作るのにかかった金額を利用した人数で割って公表すべきだろ。クッソ勿体ない。まじで効果測定してよ。

まず利用可能な母数が少なすぎる上に、ハードルも高い。使わせる気ないじゃん。

唯一よいと思ったのは、IC カードリーダをウェブから使うのに、ついに Java Applet使用をやめて、Chrome エクステンションに移行していた事かな。Firefox は置き去りだったけども。

2017-12-01

学科教員ブロックされた話

この記事いい話Advent Calendar1日目の記事です。

AdventCalendarに名前があるのにわざわざここで書いているのはハイコンテクストネタです。分かる人には分かります

突然ですが、先日僕の行く大学教員Twitterブロックされていました。

からなんだという話ではあるのですが、いい話っぽいのでまとめたいと思います

原因

いつからブロックされていたかが分からないので原因が詳細には分かりません。

色々と日々Twitterで僕が言っていることに反応したんじゃないかと思います

よっぽど構って貰える人がいないのか、中年おっさんTwitter学生空リプしまくったり、学生同士の会話のコンテクスト無視してクソリプをしているのを見ると悲しくなります

その人の講義はやれXMLデータベースだのJava Appletだのを言っていたので頭が痛くなって履修をやめました。

おそらくこういったことをインターネットバカスカと書いてクソクソ言っていたのでブロックされたのでしょう。

学科教員ブロックされないためには

同じ大学の皆様には教員との良好な関係を築くためにも上記のような心がけが必要だと思います

僕はインターネットクソ野郎なので無理でした。

2016-06-17

1.0から学ぶJava

タイトルを見て釣られクマーな皆さんこんにちは

ホッテントリメーカーで作るような煽りタイトルって、みなさんもう見飽きてると思うんですよね。

今調べたらホッテントリメーカー2008年だそうで。どうりでねー。古臭いなーと思いましたよー。

「一から学ぶJava」ってのをね、1.0にするだけでこんなに素敵なタイトルになるんだから面白いですねー。

タイトルを思いついただけだったんですけど、思いついたらやっぱりちゃんと中身も書かないと行けないじゃないですか。やだー

面倒くさいんですけどね。ちょっと1.0から学んでみましょうか。

Java 1.0 1996年1月23日

Javaの1.0がリリースされたのは1996年1月23日ですね。発表されたのが1995年5月23日でJavaの誕生日といった場合にどちらを取るかで揉めることがあります。

かれこれ20年前なわけで、当時のパソコンというとハードウェアはCPU が Pentium 133MHz メモリ16M とかそんな感じだったかなあ。今どきの携帯電話の例としてiPhone 6sを挙げるとCPUが1.85GHz メモリ 2G ってんだから凄いですね。OSは1995年11月23日リリースされたWindows95とかそんな時代背景です。インターネットがようやく一般に普及し始めたところでしょうか。

今から思うと相当弱いハードウェアですけども、そろそろVM方式を採用しても良さそうな、そんな時代でした。インタープリタだと流石に遅い、でもC言語のようなコンパイル言語だと"Write once, run anywhere"とはいかない、という判断もあったのだろうと思います。Javaが純粋なオブジェクト指向言語ではなくintなどのプリミティブ型を持つというのは、当時のマシンスペックを考えた場合、ある程度妥当な判断だったと言えるでしょう。これが後々苦しくなってくるわけなのですが。

Javaを作った会社はSun Microsystems(サン・マイクロシステムズ)というアメリカの会社で、2010年1月27日オラクルにより吸収合併され今はありません。SolarisというOSとSPARCプロセッサでUNIXサーバーの販売で90年代後半までは一人勝ちのような状況だったと聞きます。当時にすでに「ネットワークこそがコンピュータ」(The Network is the Computer)というモットーを掲げてたんだからおかしい。1996年リリースのJavaが標準でネットワーク機能を備えていたのもこのあたりの思想から来ているのかもしれませんね。

当時のプログラミング言語としてC++が挙げられますが、C++でのプログラマへの負担といいますか、ヒューマンエラーの起きやすさといいますか、その辺を改善する目的で開発されたのがJavaだったわけです。

1996年の時点にこんな言語が登場したのですから革新的でした。

いろんな企業がJavaに賛同します。その中にはMicrosoftもありました。この時期、Microsoftは次期のWindows開発用のプラットフォームにJavaを据えようと考えていました。その後、袂を分かつことになるのですが……。

プログラム言語として構文などを見ると、C++を強く意識した構文なのは間違いなく、しかしポインタ演算を廃してポインタを機能を限定した「参照」に置き換えるなど簡素化が多く見られます。C++からはいろんな機能が削られています。関数ポインタ、構造体、演算子オーバーロードテンプレート((テンプレートについては実装が間に合わなかったという話を聞きます))などなど。そのためC++の劣化であるように揶揄する人もいますが、こうしたものを捨てて言語仕様を比較的小さくシンプルに抑えた点は評価に値すると思います。しかし、今でもこうした削減された機能を愛する人からはJavaを腐す要素として挙げられてしまうのでした。

Java 1.1 1997年2月19日

Wikipediaからピックアップすると1.1での大きな機能追加は

といったところです。当初よりJavaの内部文字コードUnicodeで文字を表すchar型は16bitで設計されていました。Unicodeは当時それほど普及しておらず、Unicode対応のテキストエディタさえ少なかったと記憶しています。時代を先取りしていると言えますが、大きな誤算はUnicodeが当初16bitのコードポイントに世界のあらゆる文字を格納しようとしていたことで、漢字圏の我々からすると16bit=65,536程度の空間に文字が全部入るわけないだろ!というものだったが故に早々に破綻し、Unicodeは21bitのコードポイントに拡張されることになるのです。これはまた後の話。

なんにせよ、日本語が対応されたのは1.1からで、日本でのJavaの採用が始まったのはこの頃からと言えましょう。

当時のJavaのGUIはAWTというものでしたが、これを用いたGUIの開発は当時は結構行われていたイメージですね。Visual BASIC でGUIを作るプロダクトも結構あったと思います。GUIのためのオブジェクト指向言語としてJavaが使われていたイメージがありますね。JavaBeansもそのための仕様でした。件のsetter/getterの話題に繋がっていくのですが。

JDBCはJavaとデータベースをつなぐインターフェースです。RMIではあるJava VMから別のJava VMにオブジェクトを送って実行する、といったことができます。こうした機能が用意されたことで、ソフトウェアフロントとしてのGUI、裏方の実装のためのネットワーク機能、データベース機能、さらにはソフトウェアを配布するためのJava Appletという布陣でJavaでのソフトウェア開発が加速していた時代といえます。

Microsoft Visual J++ もこの時代ですよ。

Java 1.1以降のバージョンのものは互換性確認のためにOracle Java Archiveからダウンロードすることができ、今でも入手することができます。もちろん、Java7ですら2015年4月にEOL(End of Life,サポート終了)となっているので、通常利用するのはJava8としてください(本稿執筆時点)。

当時のドキュメントを見るのも一興です。現在と比べると標準APIがかなり小さい。なお、当時のjavadocは今とはデザインが大きく異なります。

  • java.applet
  • java.awt
  • java.awt.datatransfer
  • java.awt.event
  • java.awt.image
  • java.beans
  • java.io
  • java.lang
  • java.lang.reflect
  • java.math
  • java.net
  • java.rmi
  • java.rmi.dgc
  • java.rmi.registry
  • java.rmi.server
  • java.security
  • java.security.acl
  • java.security.interfaces
  • java.sql
  • java.text
  • java.util
  • java.util.zip

この時代であれば、全パッケージを舐めて標準APIを学ぶこともそう難しくはありませんでした。この時代から触っている人間は新バージョンが出るたびに増えるAPIを順に学んでいけたのです。しかし、現代にJavaを学ぶ場合、どのバージョンでは何があって……というのをいちいち学ぶ必要はほぼありません。Java5以前は一緒くたでいいと思いますし、一部のAPIで歴史的経緯があってねーというのを知っていればおそらく十分ではないでしょうか。

Java 1.2 1998年12月8日

strictfpキーワード浮動小数点演算をやる人は覚えておきましょう。JavaはパフォーマンスのためにCPUの浮動小数点演算を扱うことが許されており、そのため実行するCPUによって精度が異なることがあるんですね。まあ今時のCPUだと大丈夫だとは思うんですが。

リフレクション機能ではJavaのクラスを抽象的に扱うことができます。設定ファイルに書かれたクラス名のclassロードして実行する……みたいなことができるんですね。フレームワーク的なものを作る場合には多用することになります。

1.2からは新しいGUIのSwingが採用されました。AWTがOSごとのGUIパーツを用いていたためデザインに違いがあったのに対し、Swingでは統一的なルック・アンド・フィールが用いられるようになりました。まぁ今ならJavaFXを使うのが良いと思います。

初期のJavaはやはりVM方式の実行速度の遅さが指摘されていました。実行時の構文解析を伴わないだけインタープリタよりは早いものの、実行バイナリを作るC/C++よりは遅い、そうした評価です。ここではサン・マイクロシステムズのVMにJIT(ジャストインタイムコンパイラ)が乗ったことが挙げられていますが、JIT自体は別の会社が先駆けて開発していたことは記しておきたいと思います。

JITコンパイラは実行時にJavaのバイトコードを環境のネイティブコードコンパイルして動かす技術です。この後、JITコンパイラ、動的再コンパイル技術、世代別ガベージコレクションを備えたHotspotといった様にJavaVMは進化していきます。現代では実行時の最適化が進み、大きなスケールで見た場合、Javaの実行速度はC/C++での実装と比べてそれほど遅れるものではありません。遅くても倍の時間は掛からない程度といったところでしょうか。

あとは特記すべきはコレクションフレームワークです。皆が多用しているであろうjava.util.Listやjava.util.Mapといったライブラリが整備されたのがこの時なのです。それ以前はjava.util.Vectorやjava.util.Hachtableというクラスが可変長配列の機能を一手に担っていました。今ではVectorやHashtableは使うべきではありません。

Microsoft 離反

Java の開発はSun Microsystems が主導していたけども、すべてがSunのものだったというわけでもなく。Javaには多くの会社が出資していてその中のひとつMicrosoftだったわけですね。

Microsoft の Visual J++ では delegate とか独自機能拡張もありましたけど、裁判で問題になったのは J++ でコンパイルしたclassファイルMicrosoftのVMでしか動かないという部分ですね(他社製のVMで動くclassファイルを作ることもできる)。classファイルがどこのVMでも動くの大事だろ、"Write once, run anywhere"だろ、お前何してくれてんの!と喧嘩になったわけです。当時のMicrosoftブラウザまわりでも独自拡張がやりたい放題、標準規格?なにそれ美味しいの?みたいなスタンスをあちこちで見せていたものです。

結局、この事件でMicrosoftのJavaはバージョン1.1相当でストップ。好き勝手にやれないなら独自に言語作るわーとばかりに.NET フレームワークと C# といった方向に舵を取ります。

JavaがPC上でのUI開発の主力になろうとした勢いはここで潰えます。

Java EE

Java SE とは別にこの時代に Java EEリリースされていることは特記しておきたいですね。これ以後、それまでのCGIに取って代わって、JavaはWebサービスの開発のプラットフォームとして多用されるようになります。

2000年あたりからはJavaはGUI開発というよりは、Webサービスの開発が主流という流れになっていきます。インターネットサービスが非常に発達していった時代、背後ではとてつもない量のJavaのプログラムが支えていたわけです。ただまあ、こうした産業利用は一般的ユーザーの目にはあまり入らないわけです。一般人からすればJavaといえばJava Appletみたいなイメージはずっと残っていたでしょうが、実体としてはJavaといえばServletという時代になっていたわけです。

企業で用いられる社内システムにもServletは多く採用されました。

理由はいろいろ挙げれると思うのですが

というのが大きな理由だろうと思います。JSPというテンプレートエンジンを用いてHTMLを整形してWebページを作り出す、というアーキテクチャある意味では便利で簡単でした。

もっともHTMLの表現力に足を引きずられるため、GUIの機能性という点では後退したわけなのですが。それでもメリットが大きいと判断されたのでしょう。というか、まともにGUIを組めるプログラマがほとんどいないから、GUIのシステム開発がなかなか成功しないってのもあったんでしょうけどね。

iアプリ Javaアプリ EZアプリ

2000年あたりというと携帯電話の普及も取り上げなければなりません。現代のスマホガラケーに比べれば非常に機能は貧弱で、まさに携帯「電話」でした。要するに電話とメールぐらいしかできなかったんですね。

そこにdocomoiアプリJフォン(ボーダフォンを経て現ソフトバンク)のJavaアプリ、auのEZアプリという携帯電話上でちょっとしたアプリが動くよ!というのが乗るようになってきたんです。これがJavaを組込み用途にコンパクトにしたJava MEというものが土台となっていて(正確にはiアプリちょっと違う)Servletと並ぶJava言語の大きなもうひとつの領域となっていました。

iアプリは当初は容量が10k byteまでといった制約があり、容量制限が非常に厳しかったのですが、新機種が出るたびに容量は緩和されていきました。

docomoiアプリ含めiモードによって一世を風靡します。こうした土台を作ると、その上で商売をしたい人がたくさんやってきて、勝手にコンテンツを作ってくれる。docomoはそれらから手数料を取るので労せずして大金を稼げるというわけです。賭場の胴元というわけです。

この賭場が、将来にAppleiPhone, GoogleAndroidに荒らされることになります。docomoがなかなかiPhoneを出さなかったのもiモードという自前の賭場を失うことを良しとしなかったためです。金づるを失ったdocomoSamsungと組んで独自の携帯向けOSであるTizenの開発に乗り出します。そんなTizenですが鳴かず飛ばず。噂ではインドあたりではリリースされたとか、なんとか。

RIA時代

話を2001年に戻しましょう。

Microsoft離反でGUIのプラットフォームとしてのJavaというものは存在感を弱めていました。この分野の復権に寄与したのはJava 1.4 (2002年2月6日)で導入されたJava Web Startです。

Java Appletブラウザ埋め込みで動作したのに対し、Java Web Startではブラウザから起動しつつも独立したアプリとして起動するのです。

Webシステムが企業の社内システムに採用された話は先に述べたとおりですが、やはりWebシステムのGUIというのはHTMLに引きずられて貧弱だったんですね。

端的に言えば入力値が数字かどうか?みたいなチェックがなかなか難しい。HTML上でJavaScriptでやるわけなんですが、なかなか気持よく入力できるような感じにはならなかったんですね。

また、Ajaxによるブラウザのページ遷移を伴わない通信というのが出てきたのも2005年ぐらいなので、入力値に対してサーバ問い合わせするようなことはできなかった。当時だと一旦画面遷移させないとできなかったわけです。

こうした事情から、クライアントサイド、要するにPC側でもっとリッチなUIが使いたい!という要望があったわけです。Webシステム使いにくい!という不満の噴出と言ってもいい。そこで出てきたのがRIA (Rich Internet Applications)というわけです。

Javaは1.0時代のAppletからそうですが、ネットワークを介して別のPCにプログラムを送り込み、そこで動作させるという能力を持っていました。それこそまさにRIAに求められる機能性だったわけですね。

RIAの代表とされるのは

あたりです。三つ巴の戦い、どこに軍配が上がるのか!?と注目されましたが、勝利したのはHTML / JavaScriptでした。

Google MAP で注目を浴びたAjax技術、それまでブラウザでは不可能と思われていた高級なGUIをHTML / JavaScriptで実現させました。もうやめて欲しいですよね。せっかく脱ブラウザの流れが来たと思ったのにまたWebシステムに逆戻りですよ。

RIAが失速した理由として考慮して置かなければいけないのはスマートフォンの台頭です。RIAでは端末を選ばずどこでも同じアプリが動かせる点がポイントひとつでしたが、スマートフォンではそうは行かない。"Write once, run anywhere"を破壊したのはスマートフォンだったというわけです。

しかし、先日インストールなしでアプリを実行するAndroid Instant Appsが発表されたりしまして、結局RIAの思想といいますか、要求というのは今でも息づいているのだなと思った次第です。

Java 5 (2004年9月30日)

1.3 / 1.4 では機能追加はあっても言語構文が大きく変わることはありませんでした。大きく変わったのはJava 5です。この時からバージョニングが変わって1.5ではなく5と表記されるようになりました。

Java5の特徴はなんといってもジェネリクス。それまでjava.util.Listにデータを出し入れするのにはキャストが必須だったわけですが、ようやくキャストから開放され型の安全度がぐっと高まりました。その他に以下のような変更があります。

言語としては随分変わっったわけですが、もうかれこれ10年以上前のことですからこれらの機能が「Java5から導入された」という知識は今となってはあまり必要とされません。これらの機能が使えないJava 1.4で開発をする事案が殆ど無いからです。0ではないのが悲しいところではありますが。

その後

Java 6 (2006年12月11日)がリリースされた後、Java 7 (2011年7月28日) が出るまでJavaは停滞してしまいます。その間にSun Microsystemsという会社がなくなってしまったためです。

Sun Microsystems の経営状況が悪化しており、ついに身売りをすることになりました。身売り先はIBMともGoogleとも噂されましたが結局2010年1月27日オラクル吸収合併されました。

Javaの停滞中にはJava VM上で動く非Java言語も台頭してきました。Scalaなどですね。

やや戻って2007年Androidが発表されます。Androidの開発言語にはJavaが採用されていますが、実行環境はJava VMではなく、ライセンス的な事情でJava(TM)は名乗らない微妙な位置関係にあります。

Java 5 以降で大きく言語仕様に手が入るのは Java 8 (2014年3月18日)です。並列処理を行うためのStream APIと、そのために簡易に関数を定義するためのラムダ式が導入された点が大きいですね。日付APIも刷新されました。

このように、Javaは1.1の黄金時代から今に至るまで利用ジャンルを転戦しながら産業の土台となって支えてきた歴史があります。ジャンルの趨勢により浮き沈みもあります。今後についても決して楽観視はできないでしょう。Javaを学ぶことはプログラミングを学ぶステップとしては意義はあると思いますが、Javaを学べばゴールというわけではありません。プログラム言語次世代へと移りつつあります。業界動向には注視していきましょう。

2013-10-05

プログラミングをしている自分を観察する

私は、しばらく前にプログラミングで根を詰めすぎて精神的に病んでしまい、いまは休職中の身。ただ、貯金も少ないし、そろそろ仕事を再開しようと考えている。ブランクがそれなりにあるので、いま試しに簡単なプログラムを書いて、ウォーミングアップしようとしている。

いまテトリスを作っている。最終的には Android で動かしたいのだが、まずは Applet にして、PC 上で動かすことを目指す。今日は4時間くらい作業をして、400行のプログラムを書いた。半分くらいできた感じ。Java でまともにプログラムを書いたのは少なくとも10年ぶりくらいであることを考えれば、上出来かな。…正直プログラミングにそれほどの情熱は感じないけど、プログラミングに平均より資質があるのは間違いなさそうだ。やれやれ。とりあえずこれでお金を稼いで次の目標に進もう。

2011-12-17

Flash vs HTML5」関連話への反論は まだまだ技術者側の説明不足か

先日「Flashエンジニアが今後10年食べていくには?」というテーマを元に

Flash精通した Web 技術者達のディスカッションが行われる催し物があった。

 http://www.publickey1.jp/blog/11/flash10.html

この記事だけでは内容が省略しすぎているため

時間があれば是非録画の模様もみていただきたい。前半初頭は音量が小さいので注意。

こういった催し物は面白いなと、私はとても楽しく見させていただいた。

 http://www.ustream.tv/recorded/19073524

 http://www.ustream.tv/recorded/19074357

ディスカッションでは Flash だけではなく HTML5 についても触れている。

ディスカッション感想をディレクションや営業を行なっている知人に聞いたり、

ネット上の反応を見てみたところ以下のような意見がいくつかあった。

「『Flash好きな人』だけではなく HTML5 派の人との対談もあればよかった」

Flash 派の人の話だから HTML5 が使えないという話はいまいち参考にならない」

Flash 派』『HTML5 派』という くくりで考えてしまう人は

まだまだ多いと実感する。

パネリスト達は

過去から現在までに様々なプログラミング言語を利用し、あらゆる技術精通している。

Flash という表示媒体/環境開発がベター(時にはベスト)だと考え、

Flash をよく扱っている、という旨を話している。

Flash 以外にも色々やってます、と言っている。

最後の締めとして

Flash よりも優れたものが登場するのであればそちらに移行するでしょう、

とも言っている。

これだけの説明があったのに

ディスカッション内で触れた HTML5 に対する否定的な話は、

Flash 派』とやらのポジショントークだと目に写ってしまったのだ。

Java やら C やら objective-c やら perl やら php やら

サーバサイドからスマホネイティブ言語を用いてのアプリ制作まで

色んな事やってます、と言っても

技術者ではない人達には馴染みのない単語は耳には入らない。

技術的な事はよくわからない。

現在世の中には HTML5 を推し、合わせて Flash を否定する記事が結構出回っている。

技術者が話す専門的な用語の飛び交う話よりも

どこの誰が書いたかもわからない

HTML5 vs Flash 的な読みやすい記事に耳を傾けてしまう人はいる。

Apple 製品を好む人は「ジョブズがそう選択したのだから」と

なおさらこういった記事に目を向けてしまう。

Flash vs HTML5 の話にのせられてしまうのは、よくわかっていない人だ。」

そうあっさり切り捨ててしまうのもいいかもしれないが、

そうもいかない状況にもなってきてしまっているのが最近だ。

ディスカッション内では、

Flash大丈夫なのか?」という

ネット上の煽り記事を読み不安に思ったクライアントから連絡を受け

きちんと状況をゼロから説明するハメになってしまった、という内容があった。

似たような状況になっている人もいるのではないだろうか。

当方周辺では、

Flash は駄目だ」「Flash でなくても HTML5 ならできるはずだ」

HTML5Flash の代わりになるものだと言われている」と

クライアント、あるいは仕事先の関係会社から耳にする機会が増えてきた。

技術者の及ばないところで

ベターではない技術が選択、あるいは勧められてしまう やっかい性。

危惧した技術者達による反論記事は結構出始めているのだが

その記事は世間の目には届かない。

TV CMバンバン流れている iPhoneiPad では Flash を見ることができない

という状況に乗じた

いかげんな煽り記事の効果は絶大だ。

よくわからない人が圧倒的多数なのだ

勘違いを正すためには、今までよりもより一層

からない人達に わかるように説明、

あるいはメッセージを発信するよう心がけていかねばならないと感じる。

技術へ移行は容易い

パネリスト達のような

Flash を扱う事が可能な技術力を持ち合わせている人にとって

Flash が終わろうが、代わりの技術HTML5 やらその他何になろうが

大した影響はない。

「この文章書いている人間Flash 派なのでは?

 Flash 派の人間がそんな事言っても説得力ないな」という

ポジショントークと見られないための判断材料として、

プログラミング』についての話をしてみる事にする。

プログラミングに詳しいすべてのエンジニアはこういうだろう。

「世にあらゆるプログラミング言語があるが

 それらプログラミング言語の違いは記述の仕方が違うだけ」

「何か一つ言語を習得し

 その言語で自由に物を作れるだけのスキルを持ち合わせたならば

 別言語、別環境になろうとも移行は容易い」

Flash の事は全く知らないがプログラミングプロフェッショナルの人』

が近くにいるならば是非上記について伺ってみてほしい。

その通りだと答えてくれるはずだ。

Flash で用いられている言語は何も特別なものはない。

世にある あらゆるプログラミング言語のうちの一つである

プログラミング概念を理解している人ならば

Flash で作ったものを他の言語移植することも、

他の言語で作ったものFlashプログラミング言語移植することも容易いのだ。

ここで上記三行の「他の言語」を「JavaScript」に置き換えてみてほしい。

HTMLDOM 操作に必要な言語JavaScript である

言語は、Flash ならば ActionScriptHTML5 ならば JavaScript を用いる。

画面描画は

Flash ならばグラフィックスシンボル等を作成・配置、

あるいは用意されている描画用 APIActionScript で呼び出し、

HTML5 ならば CSS, HTMLタグ記述

あるいは用意されている描画用 APIJavaScript で呼び出す。

Flash と似たような技術として Java AppletShockwave があるが、

これらも一緒で

言語を変え、その技術に合わせた描画を行う処理を記述するだけだ。

Flash派」「HTML5派」といった具合に

Web 技術者が何かに属していて、何かには属していないかのような区別の仕方は

的がはずれている事を なんとなく感じていただけただろうか。

技術者にとっては要はなんだっていいのだ。

仕事に対し、あるいは表現したい事に対し、ベターな選択を行うだけの事なのである

PC向けゲームなら Flash

スマホ向けサイトなら HTML5

環境や表示内容に合わせ両方を採る選択もあるだろう。

パネリストの中に ActionScript好きだ、という人がいた。

これは別に

Flash が好き(製品のファン)だから ActionScript が好き、と言っているのではない。

現存するあらゆる技術比較した上で

ActionScript が優れたプログラミング言語だと判断しての発言なのだ

将来的に HTML5 が格段に進化する日がくるならば

HTML5 を選択するだけの事であり、

HTML5 が廃れて別の技術が登場するならば

その別の技術を選択し、

Flash より優れた技術が登場しなければ Flash を使い続ける、

ただそれだけの事なのである

対立どころか むしろ近い存在

もう少し突っ込んだ話をすると

Flashプログラミング言語である ActionScript(ActionScript 1.0)と

HTML 表示制御を行う言語 JavaScript は 実は同じ言語仕様である

ECMAScript』という単語で調べてみてほしい。

FlashHTML5 は対立するもの」と考えていた人、

あるいは ActionScriptJavaScript を触れたことがない人にとって

「え?そうなの?」と思う人もいる事だろう。

JavaScript は大規模開発に向いていない、という話は聞いたことがないだろうか。

同様の言語仕様である ActionScript 1.0 はこの問題を解決するため

ActionScript 2.0 から ActionScript 3.0 へと進化していった。

FlashHTML5 とで同等のもの制作する場合

Flash は開発がし易い、という話がよく挙げられるが

その理由の一つがこれである

現行の JavaScriptActionScript 1.0 は ECMAScript 3 準拠に対し、

ActionScript 3.0 は ECMAScript 4 準拠である

言語として進化しているものFlash採用しているので

開発は抜群にし易い。

ECMAScript 4 準拠の JavaScript も登場する日もあったかもしれなかったのだが、

Adobe はここで大失敗してしまった。

ECMAScript 4 標準化白紙

ECMAScript 4 は無かったことになってしまったのだ。

ActionScript 3.0 で作成したプログラム

そのまま HTML ブラウザで動作する事はなくなった。

技術者にとってコストを削減できるための手段の一つを

政治的な思惑によって潰されてしまった悲しい過去の話である

ちなみに JavaScript は大規模開発に向いていない、という事に対し、

最近では Google が新言語 Dart というものを開発している。

位置づけとしては ActionScript 2.0 に近いと比喩した人もいる。

ActionScript 2.0コンパイルActionScript 1.0 に変換されて出力される。

Dart も同じく JavaScript 変換機能を持つ。

今後

先の事は誰にもわからない。

HTML5 が成長するとは必ずしも言えない。

技術者は身を持って知っている。

ブラウザの足並みが揃ったことは過去一度たりともない。

表示と動作の差異、技術者はずっと苦しめられてきている。

めんどくさい。コストがかかる。

日本では IE6呪いはまだまだ続く事だろう。

現状の HTML がひどい状況なのだから

HTML5 も同じ道を辿るのでは、と言われてしまうのも仕方がない。

実際に HTML5 の各ブラウザの実装具合はバラバラである

Flash はといえば、

今でも 10年以上前スクリプト言語 (ActionScript 1.0 よりも前の言語)で

携帯向け Flash を作るはめになっている開発者が多い。

携帯向け Flash Player 開発中止、とある

Flash が動作するブラウザがいつまで携帯に搭載され続けるのか、

まだ誰にもわからない。

今後も当面携帯向け Flash を作り続ける事になるのかもしれない。

この古い言語での開発はとても苦痛であるが、

携帯向け Flash は一つの容量が小さいというのが救いである。

IE6 対応 HTML サイト制作にせよ、携帯向け Flash 制作にせよ

10年以上前ものが現役とは妙な話である

しか技術者対応するのだ。

状況に応じて何を選択するかを判断できるほどの技術力を身につける事

それが一番重要である

これから Web技術者を目指す、という人は

HTML5 なり Flash なり何を学んだっていい。

選択する技術に何ができて何ができないのか、

どの技術を組み合わせるとよいのか、

自ら判断できるようになった時、一人前の Web 技術者になったと言えるだろう。

一つ何かをモノにしてしまえば前述の通り移行は容易い。

今何かを勉強中の人は周りの声に流されず、

それを極めるくらいまでとことん勉強してほしい。

続けていくと見えてくるはずだ。自信という名の悟りの道が。

ディスカッション感想

気になった点をいくつか。

現状の HTML5 の実装具合のバラバラさに対し、

「(HTML5の)表示の差分を埋めてくれる何かが登場するかもしれない」

と言う発言があった。

言った当人も会場にいる人達も、きっとこう思っただろう。

「それってなんて Flash Player?」と。

HTML5Flash の真似事をしてますよね」

「あれはやめたほうがいい」という発言があった。

おそらく HTML5 canvas の事であろう。

この意見に対し「ムッ」と来てしまった人がいるかもしれない。

勝手に注釈するのであればこの発言は

Flash で作られた重たい WebHTML5 でまた再現するつもりなの?」

という皮肉であろう。

2011-08-25

http://anond.hatelabo.jp/20110824135254

よこから失礼。

As3なら無料FlashDevelopで十分だよ。純正品より使える。FlexSDKも無料から、実質無料コンパイル環境は整う。

Adobeのやつも買ったがFlashDevelopのほうがいい。

あと、HTML5 vs Flashかいってるけどさ、ちょっとWEBにも動きがほしいよねレベルFlashはどうせ消えるでしょ。HTMLコーダーが食えてた時代が終わったみたいなもの。だいたい情報系の言語スキルなんて5年も持たないって。

ばかでもつかえるエディターが出ればすぐ終わるよそんなものHTML5もそう。

生半可な人がそこに活路をもとめて漕ぎ出したところでエディターが出るまでの寸暇のアドバンテージもない。

そんな範囲のことが飯の種になるわけないじゃなぃぃ?

誰かがつくったものを真似して、誰でもできるようなことになっちゃった制作単価下って食い合いになって終わりさ。

Airアプリでも書けって。だいたいHTML5比較するのにFlash語るのにAir含めないってどうかしてるよ。

ただFlexで書くならフルスクラッチゴリゴリ書けるひとじゃないと何もできないから、組み合わせるだけのプログラミングしかできない人はまだお呼びでないだけ。しかScriptなのにコンパイルからネット上でナレッジシェアされないしね。

FlexActiveXApplet比較するべきで、プラットホームHTML比較すんのはどうなのかなと思うよ。

あと、おまえらSilverLight馬鹿にしてるけど、日本にはこれが使えるエンジニアほとんどいか結構需要あるんだぜ?

MS以外の某大手もプッシュしている。

まり、何がいいたいかっていうと、どんな言語、ツール使おうが、その上位10%にでも食い込んでりゃ食えるよ。

というかプログラミングの上位で食ってる人が特定の言語が使えないなんてことはないよね。

もしそう思ってるんだったら、後から来たのに悠々と追いぬかれるよ。

環境のせいにしてちゃ伸びないんだぜ。

いまいるところでまず嚢中の錐になってくだせぇ

結論としてはFlex言語仕様は糞。殺す気か!

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 「意図しないマッチに気をつける」を追加しました。

2008-03-24

ブラウザが乱立するので、IE以外サポートしないという作戦

Type A: 費用対効果重視派

今までIE6で動くように作ってきたし、今さらIE7とか8に対応するなんてコストに見合わないからやらない。

派手なサイト作りこそが肝要。

Javascript/Flash/Java appletの動作がブラウザごとに微妙に違うので、シェアの高いIE6に絞って投資した方が効率がいい。

どうせ一般ユーザはIE6以外使わない。

IE6以外閲覧禁止にすればよいだけの話。

Type B: パレートの法則に従っちゃう派

IE6, IE7で8割近くのシェアらしいので、当面の間はIE6, IE7サポートするだけで素晴らしいコストパフォーマンスを得ることができる。

Type C: 自分でWEBサイト作るの辞めちゃえばいいじゃん、CMS使おうぜ派

○○ブログをわが社の公式サイトにしちゃうぞ。

Type -C: WEBサイト作るの辞めちゃえばいいじゃん派

WEBサイトは○年○月を持って閉鎖いたします。

長い間、本サイトへ御訪問いただきありがとうございました。

会社情報等のパンフレットが御入り用の方は、

封筒に返信用封筒と80円切手を同封の上、弊社広報部までお送りください。

Type -B: ちょっと妥協しちゃうよ派

IE6, IE7, FF2 で9割近くのシェアらしいので、当面の間はIE6, IE7, FF2サポートするだけで素晴らしいコストパフォーマンスを得ることができる。

Type -A: コスト度外視、理想追求派

ブラウザごとに適切に動作するページを作成する。

あるいは、多くのブラウザ上でテストを繰り返し、PC,携帯を問わず、ほとんどの環境で同じように閲覧できるのが望ましい。

アクセシビリティの向上に勤め、コンピュータ端末の操作が不自由な方でも軽快にアクセスできるように勤めたい。

2008年は「Webブラウザ大乱」の予感:ITpro

2007-05-08

Ubuntu Feisty 七つのスゴさ

先月、正式にリリースされたUbuntu Feistyなんですが、これが本当に使いやすい。自分は第一次Linuxブームの頃からずーっとLinuxを使ってきましたが、おそらく現在最高峰ディストリビューションじゃないかと思います。とはいえ、このことは知らない人には伝わらないと思うので、以下、個人的にスゴいと思うところを書き連ねていくことにします。

1. 速いのがスゴい

Ubuntuは、起動が速い・動作が速い・更新が速い、と三拍子揃っている。自動ログインに設定していると、本当にあっという間に立ち上がります。動作速度は、まあWindowsと比べるとまだまだなんですけど、過去に比べてべらぼうに速くなりましたよ。パッケージ管理も速い!一度aptを体験すると、もうyumには戻れません。

2. フォントが綺麗なのがスゴい

いや、OSXと比べるとまだまだなんですけどね。IPA系を入れて、Firefoxを明朝フォントで見ることにしたらびっくりするくらい読みやすい[1]。Windowsの場合、日本語で斜体のページなんてとても読めたものじゃないですからねえ。

3. 最新のEmacsが利用可能でスゴい

みなさん100年のエディタ[2]使ってますか?実は、フリーGnu EmacsフリーGUI環境であるX11上では、TrueTypeフォントの表示が出来ませんでした。WindowsMac OS X上では余裕で出来るのに。これは最新版の開発ブランチで解決されてますが、まだ正式にはリリースされていません。

ところが、Ubuntuには最新版のバイナリパッケージ[3]があって簡単にインストールすることができます。自分でコンパイルしてもいいですが、パッケージで入れると他のElispパッケージAnthy.elとかphysical-line.elとか)が入れやすくていい。最新版なんで不具合が心配ですが、作業してて落ちたことはまだありません。ただし、M+1VM+IPAGフォントを指定すると何故か落ちます。

4. GNOMEが便利でスゴい

GNOMEは本当にどんどん便利になってきています。特に個人的に便利だと思うのは、Deskbar Applet[4]とNautilus g-script[5]の二つ。

前者デスクトップ検索&ランチャ。デフォルトではタスクバーに表示されてないから自分で出す。Alt+F3でなんでも検索できるし、コマンドを打てば実行できる。ウィキペディア検索ができたり何かと便利。

後者GUIシェル拡張NautilusWindowsでいうエクスプローラ)上でコンテキストメニューを好きなように設定できる。これがあれば「フォルダ上でマウスを使ってsvn up」なんて動作をあっというまに書けます。こんな風に。

# .gnome2/nautilus-scripts/SVN_Update*
cd $NAUTILUS_SCRIPT_CURRENT_URI
exec zenity --info --text="`svn up`"

5. マルチメディアが簡単にできてスゴい

レポジトリを有効にして、gstreamer系をインストールするだけ。Adobe Flashも(32bitCPUなら)Firefoxyoutubeを見に行って、指示通りにインストールするだけ。いやあ、いい時代になったものですね。

6. 非フリーアプリが充実しててスゴい

Acrobat Reader, Google Earth, Picasa, Skype, Javaなんかが簡単にインストールできます。いやあ、いい時代になったものですね。個人的にはもっと、Linux上でも商用アプリが増えてもいいと思うけどなあ。

7. PC/AT互換機なのにWindowsじゃないのがスゴい

「他人と違う」ってのはそれだけで素晴らしい。違いすぎると苦痛ですけど、今のUbnutuレベルなら、やせ我慢してしのぐことができます。粋ですねえ。ファッションとしてのLinuxというのはいかがでしょうか。

  1. http://www.pc-souko.jp/deskbbs/linux/bbs/thum/0134.png
  2. バベル案内 http://www.aoky.net/articles/steve_yegge/tour_de_babel.htm
  3. http://debs.peadrop.com/dists/feisty/backports/
  4. http://raphael.slinckx.net/deskbar/
  5. http://g-scripts.sourceforge.net/
 
ログイン ユーザー登録
ようこそ ゲスト さん