yamicha.com's Blog - Presented by yamicha.com
Blog yamicha.com's Blog - 2017/11 の記事
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]

yamicha.com's Blog
 諸事情により、現在更新休止中。ご了承ください。もし今後ブログを再開することがあるとすれば、その際にはこのブログスクリプトではなく、新しく開発したものによるかもしれません。
 当ブログ管理者についてはこちらをご参照。
開発魔法(737)
社会問題(733)
お知らせ(11)
質問・バトン回答(15)
ゲスト出演(8)
経済・知的財産(150)
ゲーム開発(182)
[Ada] 勝手に補足
- Note
- 金配りの次の一手


- Endless Ultimate Diary
- 銃世界

漢字バトン
- うるる雑記帳
- 漢字接力棒

ツキアイゲノムバトン
- ブログ@うにうに画像倉庫
- あぶ内閣

縺イ縺セ縺、縺カ縺励ヰ繝医Φ
- 月夜のボヤキ
- 騎士サーラバトン
パスワードを使う
名無し (2012/02/27)


開発者解放裁判
yamicha.com (2010/03/14)
Winnyに関しては、私も「純白」とまでは考えておりませんし、使用し..

開発者解放裁判
通りすがり (2010/03/08)
winnyに関しては「ダウンロードソフト板」なんてところを拠点に開発..

新型インフルエンザの恐怖
いげ太 (2009/11/03)
> C#などの「int Some(int , int)」は、F#では「(int * int) ->..

時効に関する思考
yamicha.com (2009/08/31)
>いげ太さんコメントありがとうございます。手元にドキュメントが少..
Homepage
Blog Top
Normal View
List View
Search
Calendar
Comment List
Trackback List
Blog RSS
Send Trackback
Phone Mode
Administrator
yamicha.com
Blog
るううるる。
Source
法令データ提供システム
FindLaw
Development
Java2 Platform SE 6
Java EE 6 API
MySQL Developer Zone
PHP Reference
MSDN Library
Ada Reference Manual
Objective Caml
Python Documentation
Erlang
Prolog Documents
恐怖のタレント候補
2008/01/30(Wed)23:18:23
 大変残念なことに、大阪府知事選で橋下氏が当選してしまいました。橋下氏がいかなる党の推薦であろうと、絶対に当選して欲しくないと考えていましたが、結果は2位に倍近い差をつけるほどの圧勝でした。強い懸念を覚えます。
 言うまでもなく、提示した政策を支持する人が氏に投票する行為に対しては、これといった懸念はありません。問題は知名度や人気などによって氏に投票した人々です。簡単に言えば、「どの政策を支持して投票したのか」を明確に答えられる人であれば問題はありませんが、実際にはこの質問に対して「人気があるから」「知っているから」「何かやってくれそうだから」などという抽象的または知名度任せの理由を述べる人が非常に多いと考えられるのです。
 この結果を見て、自民党はかなり安堵していることでしょう。これは決して民主党系候補が敗れたからでも、自党側の候補者が勝ったからでもなく、「ポスト福田」、すなわち麻生氏の戦略が通じることが証明されたも同然であるためです。タレントや人気者を立てたところで、国民がそのようなものには見向きもせずに、あくまで政策本位で投票先を選ぶのであればタレント選挙は無意味ということになりますが、残念ながら今回の大阪府知事選はそうでないことを証明してしまいました。したがって、自民党以外の政党、または自民党で麻生氏と競う他の総裁候補がいくら政策を必死で訴えたとしても、麻生氏の「アキバ発の総理大臣を誕生させよう」「脳内メーカーやったことある人」などという演説1つで全部パーになるのです。
 タレント候補で成功した例としては宮崎の東国原氏が存在しますが、徴兵制発言など無視できない発言はそれなりに多いようですし、何より今回のケースとは状況が違います。過疎化が進んでおり、観光資源があり、かつ第一次産業の比率が比較的大きい宮崎が、しかも鳥インフルエンザの風評から立ち直らなければならない時だからこそ成功したケースであって、全く性質の異なる大阪には当てはまりません。しかも観光業者は「東国原後」のこともすでに懸念しているようで、もし氏が知事の座を退いた後に宮崎も没落するようなら、結果的に氏の知事活動は失敗であったということになります。つまり宮崎はレアケースであり、しかもまだ確実に成功したとは言い切れません。一方、大阪府のタレント候補といえば、どうしても連想してしまうのがノック氏です。
 候補者に人気さえあれば、別に政策など無関係に当選してしまうというのでは、選挙の人気投票化は避けられません。この悪しき計画が国政に持ち込まれれば、タレントをひたすら立てた党の方が勝つなどという不適切な状況が発生しかねません。小泉内閣時代の総選挙では、まず小泉氏自体がタレントのような政治家であり、しかも堀江氏、料理研究家を立てるなど、到底選挙と呼べる代物ではありませんでした。結果、「郵政なんか分からないけど小泉さんがカッコイイ」といった意味不明な理屈で自民党が大量の票を獲得し、これで与党が2/3を獲得してしまったことにより、その余波は首相が2度変わった今でも残っています。あの時に1人でも多くの人が立ち止まって冷静に考え、この選挙が不適切なタレント選挙であると認識していれば、今の与党が再可決を連発しようとすることもなかったはずなのです。
 ただし、これは自民党に限ったことではありません。確かに自民党の方がこの卑劣な戦略を多用する傾向にはありますが、民主党も「さくらのパパ」などというタレントを持ち出すなど、やはり卑劣な戦略に出ています。これでは人気者を集めた方が勝ちであり、もはや選挙とは呼べません。このような選挙を行うのであれば、「国政選挙」ではなく「日本人気者投票」に名称を変更すべきです。
 国民がこうした選挙を見抜き、候補者が誰であろうと政策本位で投票するのであれば、このような戦略は自然になくなることでしょう。しかし、実際には衆院選といい参院選といいこの戦略が全く使われない選挙はなく、地方選でも長崎市長選のように政策ではなく情に訴える選挙が横行したり、今回の大阪府知事選のように知名度に訴える選挙が行われ、しかもそれが成功しています。そして、今回の大阪府知事選が「タレント選挙の成功例」を見せ付けた以上、次の国政選挙において同等の戦略が実行される恐れは非常に高くなります。
 私が恐れるのはこの点です。大阪府知事選は地方選挙であり、これによる影響は限定的なのですが、国政選挙となるとそうはいきません。もし政策が捨て去られ、党首なり候補者なりのタレント活動で勝負を左右する小泉選挙の悪夢が再来すれば、参院選の与党敗北及びそれによって生じた国会状況によって多少なりとも根付きつつあった「政策本位の価値観」は完全に崩壊します。そうなると、再び政治を望ましい形に修復するまでには何年もの時間が必要です。これは、衆院選から数年経ったにもかかわらず、小泉タレント選挙の議席が未だに副作用をもたらしていることを見ての通りです。
 タレント候補がすべて悪いのではありません。タレント候補の中にも、まじめに考えている人は少数ながらも存在するでしょう。しかし、もしそのタレントが本気で政治家を目指しているのであれば、政策を検討もせずに人気だけで投票するのは、その人に対しても極めて失礼というものです。「なぜその人に投票するのか」を具体的な理由で説明できないのであれば、人気投票と何が違うというのでしょうか。
 私は今回のタレント選挙の成功に強い危機感を抱いています。また、「ポスト福田」が麻生氏である可能性が高いことが、その危機感をさらに強めています。実際、もし麻生氏が次期総裁となる可能性が低ければ、今回の結果をここまで懸念する必要はありませんでした。
 次期衆院選またはその次の衆院選で麻生氏が自民党総裁となり、小泉流低IQ選挙の再来とも呼べるような選挙で圧勝、二大政党制による競争原理、国民に根付きつつあった「選挙の結果は変えられる」という意識、また何より政策本位の選挙などといったものが残らずぶち壊しになり、「アキバ発の総理大臣」が誕生してしまうことを、私は何より恐れています。

 ウイルス作成行為によって大阪の被疑者が逮捕されました。とはいえ、日本ではウイルス作成罪が定められていないため、ウイルス内でアニメ画像を使用したことによる著作権法違反が直接の容疑となっているようです。つまり、アニメ画像を使っていなければ逮捕できなかったのでしょうか。
 ウイルス作成を禁じる刑法の制定は検討されたことがありますが、未だに実現はされていません。この刑法の中身や問題点については後で論じるとして、まずはここでウイルスについて考えてみましょう。できるだけ読みやすくしたつもりではありますが、一部専門用語が出ていることをお許し願います。また、一見すると「ウイルス作成指南」のようになっている部分がありますが、これは「敵を知る」ことで意識を高めていただくのが狙いです。
 まず今回のウイルスですが、手口を見る限りにおいて、どうも被疑者には高い技術力があるようには見えません。高い技術力がありながら、ウイルス作成では逮捕されないからとタカをくくり、ウイルスをおざなりに作った可能性もありますが、ともかくこのウイルスだけでは被疑者の技術の証明にはなりません。
 それというのも、表示されるというアニメ画像はわざわざ自分のWebサイトからダウンロードして表示するようにしていたというのです。Webサーバーにアクセスするウイルス自体は特に珍しいわけではありませんが、これの多くはDoS攻撃(攻撃対象のサーバーに大量のリクエストを送って処理不能にしてしまう攻撃)などを目的としています。なお、自分が開設したサイトにアクセスし、ウイルスのパーツをダウンロードするようなウイルスも以前に出回ったことがありますが、あっという間にウイルスが解析されて当該サイトが公となり、作成者と見られる人物またはグループはそれを閉鎖しなければならなくなりました。
 ましてや、今回の画像は単なる演出であり、パーツをダウンロードするなどという大それたものではありません。アクセスログを解析して感染状況を調査するためであるとしても、画像ではなく空白のWebページにリクエストを送るだけで可能です。表示する画像をわざわざダウンロードするようにしていては、接続不良またはサーバー業者がページを閉鎖した際に画像を表示することができなくなります。しかも、無料・有料を問わずWebスペース提供サーバーの多くはログを保管しており、またISPもログを保管しているため、サイト作成者はあっという間に突き止められます。つまり、インターネットや技術を十分に知る者であれば、このような手口は用いません。
 今回のウイルス作者は自分でWikipediaの同ウイルスの項を作成または編集していた疑いもあり、一部には「自己顕示欲」によるものであるという見方もあります。実際、今回のウイルス問題に限らず、スパイウェアやバックドアなど特定の目的があるものを除けば、ウイルス作成の動機の多くは自己顕示欲であると考えられます。ウイルス自体は上記の通り大したものではなく、自己顕示が完全に裏目に出ているといえなくもありませんが、ここで重要なのは「さほどの技術がなくてもウイルスを作ること自体はできる」という事実です。
 最近は「ワーム」や「トロイの木馬」と呼ばれるウイルスが非常に多く発見されていますが、これらのウイルスは単独で動作するプログラムであり、他の実行ファイルのバイナリを加工して潜む必要がないため、かなり作りやすい部類に入ります。システムの裏に常駐し、望みの動作を行うプログラムさえ書けるなら簡単に実装できるのです。さらに、スタートアップにそのプログラムを加えておけば、PCを起動するたびにウイルスが実行されるようになります。後は「発病」時の動作と拡散動作を加えれば、これだけで立派なウイルスとなります。
 発病時の動作を書くのは比較的簡単です。特定のファイルを削除したければ、OSが提供している標準APIでファイルを探して消すだけですし、バックドアも初歩的なものなら非常に簡単に作成できます。例えば、インターネットでWebサイトを閲覧する際、多くの人はブラウザを使用しており、ブラウザが裏で一体何を行っているかを知る必要はありません。これを少々詳しく書くなら、まずブラウザはサーバーに対して特定のURLのデータを渡して欲しいとリクエストし、それを受け取ったサーバーはそのURLに存在するデータを返します。この際の通信に用いられる決まりごとを「HTTP」といい、これに準拠さえしていれば、いかなるサーバーもブラウザからのリクエストを受け付けることができます。各通信は「ポート」と呼ばれるもので管理され、HTTPの標準ポートは80番と定められていますので、普通に「http://〜」というURLを読み込むと、サーバーのポート80に対してリクエストが送られます。一方、「http://example.com:8080/」のように80以外のポートを明示的に指定することもできます。ウイルスが何らかのポートを開いた上、そこでHTTP通信を受け付けるサーバーの役割を果たし、PC上のデータを取得できるようにすれば、悪意の利用者はブラウザ上から感染したPCのデータを盗み取ることができるようになるのです。
 ウイルス拡散に関しても同様です。難解なセキュリティホールを突くことで流行するものもありますが、その多くはセキュリティホールがふさがれるまでの一過性の流行に終わります。メール送付などの初歩的な手段の方が、かえって終息しづらい傾向にあります。メール送付にはSMTPと呼ばれる決まりごとがあり、これに準拠さえしていれば、誰でも自由にメールを送信できます。つまり、ウイルスがSMTPを使って他人にウイルスを送りつければ、これで感染拡大が可能なのです。
 ちなみにメールの場合、最近は多くのISPがSMTPに使われるポート25をブロックするなど、風当たりがかなり厳しくなっているため、メールソフトからアカウント情報を盗んで使用するという動作が不可欠です。また、メールアドレス収集にしても、例えばインターネットキャッシュやPC上のファイルからそれらしいものを抽出するなど、様々な手を尽くす必要があります。しかし、私はWinnyを使ったこともなければ使う気もないため何ともいえませんが、もし比較的容易にウイルスを送り込むことができるのであれば、メールで拡散する際のような少々複雑な実装をする必要もなくなります。
 このように、ウイルスを作る行為はさほど難しくありません。ある程度熟練した技術者であれば、その気になれば誰でもウイルスを作ることができますし、ファイル削除やSMTPの使い方といった「それ自体はまともに使えば便利なコード」はちまたのサイトで公開されていますので、技術者としてさほど熟練していなくても、そうしたコードを丸写しして組み合わせることはできます。
 しかし、いくらウイルスを作るのが簡単だからといっても、簡単に感染するようでは困ります。幸い、Winny関係のウイルスについては対策法がはっきりしています。私も音楽及び放送業界が「著作権」を振りかざす姿勢には極めて辟易しており、そもそも「著作権」はこのような腐りきった使われ方をするためのものではないと考えていますし、Winnyの作者が逮捕されたのは明らかに不当であるとも考えていますが、Winnyは使わないのが最も安全確実です。「君子危うきに近づかず」はインターネット上でも真理です。

 それではもう1つ、ここで「ウイルス作成罪」についても考えてみましょう。実際には漢字でややこしい名前が定められているのですが、言っていることは同じです。これは以前、共謀罪とともに制定が検討されたのですが、共謀罪が多数の反対を受けて成立見送りとなったことにより、同罪も一緒に成立を見ませんでした。一部には「共謀罪と切り離してこの罪のみを成立すべき」との声がありますが、法務省が難色を示しているようです。
 日本にはウイルス作成を罰する罪がないため、これの成立を求める声は少なくありません。しかし、確かに共謀罪と切り離して成立させることを検討できるものであるとはいえ、ある意味で共謀罪と同じ問題を抱えていると考えることもできます。ここでは同罪の問題点について検証してみます。
 まず同罪は未だに成立していないため、実際に成立する際にどのような内容になるのかは分かりません。また、これが実際に成立したとしても、法の内容が本当に定義されるには判例を待たなければならず、現時点で内容を詳細に論じることは困難です。国会内で「このような場合には適用しない」などといった答弁が行われたとしても、このようなリップサービスに何の信頼性もないことは、「心情の自由を侵害しない」などという大嘘答弁の末に成立した国旗国家法案を見ての通りです。唯一信用できるのは、法の条文と判例だけです。
 すなわち、おそらく最初に起こるのが「どこまでがウイルスか」という論争でしょう。何らかの方法で他人のPCに感染し、ファイルを削除する不正プログラムは、確かに典型的なウイルスです。それでは、破壊活動を行わずに情報を流出するものはどうでしょう。自己増殖機能を持たない不正プログラムはウイルスでしょうか。ソニーBMGのルートキットウイルスのように、ユーザーに対して簡単な同意画面を出しておいて、その上で悪質な活動を行うものはウイルスなのでしょうか。最後のケースがウイルスであれば、CCCDにおいてコーデックをインストールする行為はウイルスの疑いがあります。
 時にウイルスとみなされるものの中には、特定のソフトウェアをインストールする際に付属のソフトも同時にインストールされることがご丁寧にも明示されており、実はそれがウイルスに近い悪質プログラムである、という場合があります。これはウイルスでしょうか。「利用者が想定しない動作を勝手に行う」プログラムを問題とするなら、今のプログラムは勝手にアップデートのチェックなり、何らかのインターネット通信なりを行う場合がありますが、これはウイルスなのでしょうか。
 つまり、どこまでがウイルスとみなされるのかが全く分からないのです。スパイウェアやボットが規制対象でなければ、大した意味はありません。かといって、様々なスパイウェアなどを規制しようとすると、正常なプログラムにも因縁をつけられかねません。ソニーBMGのケースは明らかにウイルスであると私は考えており、ウイルス対策ベンダーもこれをウイルスとみなしている場合がありますが、これと同種のものは取り締まりつつ、「産業界の都合」でこうしたものは除外される恐れもあります
 このように、共謀罪と同質ではないにせよ、似たような危険を潜在的に持つのがこの罪です。これを恣意的に運用すれば、ファイルを削除するツールを作っただけでウイルスとみなされる場合もないとはいえません。さすがに考えすぎと信じたいところですが、一連のWinny問題では警察・検察が著作権をかなり強引に解釈し、ある意味無理ともいえる逮捕を行っていることを考えれば、あながち考えすぎとも言い切れません。
 さらにもう1つ懸念があります。この罪の内容は今のところ良く分かりませんが、法案の様態や性質から察するに、おそらく抽象的危険犯でしょう。刑法の「危険犯」の考え方には「抽象的危険犯」と「具体的危険犯」の2つがあり、後者が実際になされた危険・侵害を裁くのに対し、前者は「具体的な危険につながる可能性が高い」行為を罰するものであり、実際に具体的な危険が発生する必要はありません。
 例えば殺人は「人を殺した」ことに対する罪であり、強盗は「人を暴行・脅迫して物品を盗った」ことに対する罪です。一方、この理屈で考えるなら、放火は「火を放った罪」なのですが、現住建造物と非現住建造物では罰則が全く違います(前者が死刑、無期懲役、5年以上の懲役であり、後者が2年以上の有期懲役)。これは現住建造物を放火すれば死傷者が出る可能性が非常に高いためであり、もし火事がボヤで済んだり、家人が全員逃げて無事であったとしても、現住建造物放火を適用できます。
 ウイルス作成罪はこの点が問題となります。もしこれを具体的危険犯とするなら、実際にウイルスが何らかの機械に感染し、不正な動作を行わせない限りは罪になりません。一方、これを抽象的危険犯とするなら、法の内容にもよりますが、ウイルスを作成なり拡散するなりした段階で犯罪であり、その結果として被害が出る必要はありません。そして、ウイルスという存在の性質から考えて、この種の法では抽象的危険犯の形式が取られる可能性が高いです。
 抽象的危険犯はその性質上、まだ危険が生じてもいない行為を罪としたり、または特に重い罰を科したりするものですので、より慎重である必要があります。大げさに言えば、デパートで包丁を買っただけで「殺傷事件の恐れがある」と称したり、コンロに火をつけただけで「延焼で公共の危険を生じる可能性がある」と称して逮捕されるようではたまりません。
 また、先に述べた通り、そもそも「ウイルス」や「不正プログラム」の定義があいまいであるため、「警察・検察が不正プログラムと称するもの」を「実害が生じてもいない」のに取り締まって逮捕してしまうことが可能となってしまう恐れもあります。
 悪質なウイルス作者を罰することに異存はありませんし、ウイルスの範囲はある程度広く取らなければ悪質なスパイウェアやマルウェアを取り締まれないのも事実です。また、被害が拡大してからでは遅いため、抽象的危険犯とすることも理解できないわけではありません。しかし、この罪は上記のような問題をはらんでいます。これらの点を考慮すると、条件がいい加減なまま成立するようでは、「ウイルス作者を取り締まれるようになって一件落着」とはとても言えません。ウイルス作者を逮捕するのは捜査の上でも難しいことですが、法の上でも難しいのです。

 以前にGroovyでXMLを扱ってみたりしましたが、今度は他の言語でもXMLを扱ってみましょう。とはいえ、SAX、DOM、StAXのすべてを使用しているJAXPをまたしても習得する意味はありませんし、PerlではXMLを扱うどころか自分でパーサを作成してしまいました。PHPはDOMこそ比較的まともに使えますが、StAXの仕様は涙が出るほどひどいものでした。Groovy固有のXML機能はこの前使用したばかりです。RubyにもDOMはありそうなものですが、あの言語はどうもやる気が起きません。となると、やはりPythonでしょう。
 それでは早速DOMを、と言いたいところですが、Pythonには演算子オーバーロードの機能があるとのこと。DOMとは全く関係ありませんが、一応習得しておきます。ちなみに、オーバーロードの際に役立ちそうなこととして、isinstance()による型チェックがあります。Pythonでは関数オーバーロードができないらしいため、時としてこれで判定することが必要になるでしょう。リストやタプル、辞書などの組み込み型も判定できます。
if isinstance(args , tuple):
	# タプルの処理
else:
	# それ以外の処理
 辞書の場合は「dict」がクラス名になるようです。リストなら「list」なのですが、ここで1つ注意を。listという関数か何かがあるらしく、そのまま「list」と書くと空のリスト型が返されるようです。したがって、このように書くことが必要です。
if isinstance(args , type(list)):
	# ...
# または
if isinstance(args , type([])):
	# ...
 Pythonの演算子オーバーロードは「operator +」でも「+」でもなく、「plus」「minus」などのある意味「そのまま」の名前でもありません。先頭と末尾にアンダーバーが2つ付加される特殊な関数です。足し算は「__add__」、引き算は「__sub__」、掛け算は「__mul__」などといった名前になります。1つ目の引数がself、2つ目の引数が演算を実行する相手です。
class ArrayOperator:
	def __init__(self , list = []):
		self.__list = list
	def __add__(self , data):
		self.__list.insert(len(self.__list) , data)
		return self
	def __sub__(self , data):
		self.__list.remove(data)
		return self
	def iterator(self):
		for element in self.__list:
			yield element

a = ArrayOperator(["Spam!" , "Monty" , "Python"])
a = a + "Interpriter" + "Language"
a = a - "Monty"
for element in a.iterator():
	print element
 Pythonに+=などはありませんので、これらについて考える必要はありません。なお、上記実装は(例によって)データの中身そのものを変更しているため、代入せずともデータの中身が変わってしまう(例えば「a = a + "Spam!"」ではなく「a + "Spam!"」や「b = a + "Spam!"」と書くだけでもaのデータが変更される)点に注意が必要です。
 せっかくですからもういくつかの機能を。Pythonではラムダが使用できるのですが、そればかりかローカル関数もサポートしています。普通に書いている文にはラムダの方が楽ですが、ラムダでは多くのコードを書くことができませんので、場合によってはローカル関数を使うことになるでしょう。
def f1(a):
	def f2(b):
		return a + b
	return f2

print f1(10)(20)
 これは以下のコードと同じです。
def f1(a):
	return lambda b: a + b

print f1(10)(20)
 これでクロージャ形式のプログラミングも一応可能です。すべきかどうかは別として。
 さらにもう1つ。Perlで次のようなコードを見かけることがあります。
print "Hello" if $data == 0;
 いわゆる倒置法というものでしょうか。CやJavaをはじめとする多くの言語と違い、Perlではコードが1行であっても構文の「{}」を省略することができませんが、この方法を使えば可能です。ただ、私は個人的にこのようなコードは書きません。通常の記法と混在すると明らかに可読性が落ちる上、インデントの先頭を流し読みするだけではifが見つけづらく、ろくなことがありません。もしドキュメントなりブログなり小説なりで表現が全部倒置法にされている状況を想像してみてください。もはや文章としての体をなさなくなります。
 そういえばCやJavaのdo文もある意味似たようなものですか。構文自体は無論知っており、使おうとすれば使うこともできるのですが、使ったためしがありません。中にはこのようなコードを書く人もいるそうですが。
do{
	if(obj.isPrepared())
		break;
	if(obj.prepare())
		break;
	obj = null;
}while(false);
 これ以上do文の中身を実行する必要がなくなったら、即座にスコープ抜けるコードです。しかしこれ、早い話が緩やかなGOTOでしょう。
if(obj.isPrepared())
	goto BANK;
if(obj.prepare())
	goto BANK;
obj = null;
BANK:
 breakやcontinueもGOTOの一種である、などという議論もありますが、ループからこれらをなくすのはかなり困難です。breakをなくせば条件判定部分が無駄に肥大化しますし、continueがなければネストが過剰になるでしょう。
 話がずれましたが、Pythonにもfor文にPerlと似たような構文があります。
list = [d for d in range(1 , 10)]
print list
 これで1〜9までの数値を1つずつ格納したリストが得られます。これは「リスト内包」と呼ばれる機能です。
 先頭部分の値をいじることで、データの加工も可能です。
list = [d * 2 for d in range(1 , 10)]
print list
 必要ならメソッドを呼び出しても構いません。
class Repeat:
	def __init__(self , data):
		self.__data = data
	def repeat(self):
		return self.__data + self.__data

list = [d.repeat() for d in 
	[Repeat("Repeat") , Repeat("+") , Repeat("Spam!")]]
print list
 これの面白いところは、上記構文をそのままイテレータやジェネレータにも適用できる点です。動作もリストの場合と全く変わりません。
 さらに、これと似た機能に「ジェネレータ式」なるものも用意されています。
def letter_join(datas):
	str = ""
	for data in datas:
		str = str + data[0]
	return str

list = ["Public" , "yield" , "transaction" , 
	"hash" , "override" , "next"]
print letter_join(s for s in list)
 リスト内包は[...]で記述しましたが、ジェネレータ式は(...)の構文となります。決してタプル内包ではありません。とにかく(...)で囲めばジェネレータ式となりますので、上記呼び出しコードは2行に分けて書くことができます。
generator = (s for s in list)
print letter_join(generator)
 これでなかなか便利そうです。
 それではここでDOMを扱ってみるとしましょう。といっても、DOMの仕様はどの言語でもほとんど同じですから、Pythonの流儀を覚えるだけです。まずは以下のXMLをパースすることを考えてみます。
<?xml version="1.0" ?>
<root:Root xmlns:root="http://www.yamicha.com/root"
	xmlns="http://www.yamicha.com/lang">
	<Language id="1">Python</Language>
	<Language id="2">Perl</Language>
	<Language id="3">PHP</Language>
	<Language id="4">Groovy</Language>
</root:Root>
 比較的単純なXMLですが、アトリビュートとネームスペースを含んでおり、この程度のXMLの方が習得には便利です。
 まず必要となるのがパースを行うコードです。JavaではFactoryからBuilderを取得したり、InputSourceなどを用意したりと、これだけで非常に一苦労です。PHPは比較的容易にパースを開始できます。ではPythonはといいますと、必要なのはメソッド1つです。
 その他の注意点として、Pythonではメソッドとプロパティが混在しています。getElementsByTagNameはメソッドですが、documentElementはプロパティです。十分気をつけましょう。
import xml.dom.minidom

dom = xml.dom.minidom.parseString(
"""<?xml version="1.0" ?>
<root:Root xmlns:root="http://www.yamicha.com/root"
	xmlns="http://www.yamicha.com/lang">
	<Language id="1">Python</Language>
	<Language id="2">Perl</Language>
	<Language id="3">PHP</Language>
	<Language id="4">Groovy</Language>
</root:Root>
""")

LANG = "http://www.yamicha.com/lang"

root = dom.documentElement
languages = root.getElementsByTagNameNS(LANG , "Language")
for language in languages:
	print language.getAttribute("id") + "." + language.firstChild.data

dom.unlink()
 PythonのNodeListはイテレータに対応しているため、forでループすることができます。いちいちitemだのlengthだのを調べる必要がなく、しかもPythonのインデックス使用型ループはどうしてもwhileを使わなくてはならないため、forを使えるのはありがたいです。何らかの理由でリスト化したければ、内包表現を使うのも良いでしょう。
 また、当然ではありますが、XMLを生成することもできます。
import xml.dom.minidom

P = "http://www.yamicha.com/python"

impl = xml.dom.minidom.getDOMImplementation()
doc = impl.createDocument(None , None , None)

root = doc.createElementNS(P , "p:Sequences")
doc.appendChild(root)

id = 1
for key , value in {"list":"[]" , "tuple":"()" , "dict":"{}"}.iteritems():
	ss = doc.createElementNS(P , "p:SequenceSyntax")

	ss.setAttribute("id" , str(id))

	name = doc.createElementNS(P , "p:Name")
	name.appendChild(doc.createTextNode(key))
	ss.appendChild(name)

	syntax = doc.createElementNS(P , "p:Syntax")
	syntax.appendChild(doc.createTextNode(value))
	ss.appendChild(syntax)

	root.appendChild(ss)

	id = id + 1

print doc.toprettyxml("\t" , "\n")
doc.unlink()
 整形が必要ないなら「toxml()」メソッドが使えます。それにしても「toprettyxml」とはある意味センスがある名前といいましょうか。確かに意味は分かりやすいです。
 このコードでは以下の出力がなされます。
<?xml version="1.0" ?>
<p:Sequences>
	<p:SequenceSyntax id="1">
		<p:Name>
			dict
		</p:Name>
		<p:Syntax>
			{}
		</p:Syntax>
	</p:SequenceSyntax>
	<p:SequenceSyntax id="2">
		<p:Name>
			list
		</p:Name>
		<p:Syntax>
			[]
		</p:Syntax>
	</p:SequenceSyntax>
	<p:SequenceSyntax id="3">
		<p:Name>
			tuple
		</p:Name>
		<p:Syntax>
			()
		</p:Syntax>
	</p:SequenceSyntax>
</p:Sequences>
 DOMは各言語で共通ですので、他の言語に比べてこれといった点はありませんが、Pythonでは全体を通してイテレータが活用されていますので、DOMでも活用しておきましょう。
カテゴリ [開発魔法][社会問題] [トラックバック 0][コメント 1]
<- 前の記事を参照 次の記事を参照 ->

Comments(1)
coolmint - 2008/02/05(Tue)00:07:36
お久しぶりです。遅くなりましたが、大阪府知事選の橋下氏当選は自分もため息しか出ませんでした。
大阪府民が橋下氏に何を求めて票を投じたのかは様々な意見が出るでしょうけど、少なくとも大阪で「第2の東国原知事」を求めるのはお門違いだとは言い切れます。
東国原知事が宮崎ブームを巻き起こしたのは、yamichaさんが仰ることの他に
○元々の宮崎県の知名度が低すぎて、逆に『宮崎はどんなところか』と注目されるようになった
○就任早々の鳥インフルエンザ騒動を逆手に取った知事の頭の回転とタイミングの良さ(事実、現場も感染拡大防止に努めましたし)
というところに尽きるでしょう。
ですから、元から日本有数の都市としての知名度を誇る大阪ではそこまで爆発的なブームを呼ぶことは難しいかと思います。むしろ今の財政危機に瀕している大阪では、大掛かりな財政改革の舵取りをこなせる長期的なビジョンを持った人が望ましかったのではないでしょうか……。そういう意味では橋下氏だけではなく、他の候補も心もとなさそうでしたけど。(他の候補に爆発的な力がなかったというのも橋下氏に有利に働いたのかもしれません。昨年の宮崎県知事選でも、自民党系の立候補者が2人出馬して自民党票が割れたのが、東国原知事当選に大きく影響したはずですし)
……結局のところ、普通の政治家に変革の力が感じられないというのが、タレント政治家を増やす一因なんですよね。自分も宮崎県出身者なので、東国原宮崎県政の2年目の動向をきちんと見据えたいです。宮崎に一通りの注目を集めることに成功した今の期を逃すことなく、改革に向けて動いてもらいたいと期待しています。

- Blog by yamicha.com -