はてなキーワード: aaaとは
今年冬以降に発売される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#」と入力すれば取得できてしまう。
送信される番号はどのサイトに対しても共通なので、他のサイトで使うことができる。
そしてなりすましも容易だ。
とか。
ぼくよくわかんない><
プライバシに関する専門家でもないので、補足訂正おねがいしまーす。
あと、この問題を扱うに当たって、何を「個人情報」だとするのかとらえ方が人によって違うことに注意したほうが余計な労力を使わなくて済む、と思いまーす。
レジストリを起動する
レジストリの内容を参照/編集するには[スタート]ボタンをクリックして検索ボックスに「regedit」と入力
HKEY_CLASSES_ROOT\Applications\********.exeまでいく (applicationという似た名前があるので混同に注意)
(規定)を右クリック
その後再起動する
パーティション分割してファイルをDドライブに移動させたりすると関連付けできなくなる。
http://menushowdelay.blog13.fc2.com/blog-entry-302.html
関連付けを設定できません
以前は問題なく動作していたアプリケーションなのですが、ファイルを右クリックから、このアプリケーションで開くことだけができなくなりました。
アプリケーションを開いた後で、ファイルをウインドウ内にドラッグ&ドロップすることならできます。
ファイルを右クリック→プロパティ→全般→プログラム:変更→ファイルを開くプログラムの選択→参照→プログラムから開く
で実行ファイルを選択することで、普通は「ファイルを開くプログラムの選択」ダイアログに戻って一覧に選んだプログラムが表示されるはずなのですが、このプログラムだけが表示されなくて困ってます。
ひょっとして、導入後にフォルダごと移動したりしませんでしたか?
レジストリを一切いじらずにインストールが可能なアプリケーションでも、実はこの「プログラムから開く」の「プログラムの選択」で参照してしまった場合、Windows2000/XPでは
HKEY_USERS\(ユーザー識別子)\Software\Classes\Applications
以下に登録されます。別の見方をすると、こうして登録された後で「レジストリを一切いじらないアプリだから」 という理由でフォルダごとどこかに移動したり、フォルダ名をリネームしてしまうと、先のレジストリの記述に不整合が発生し、以降はその不整合を直接編集によって書き換えたり値のデータを削除したりしない限り、永遠にそのプログラムで開くことができなくなるという不具合を生みます。「ファイルを開くプログラムの選択」ダイアログの「参照」ボタンをたどって移動先やリネーム後のアプリケーションを指定しても、エントリは正常に書き換えられることはありません。直接編集以外に道はないのです。
「スタート」ボタン→「ファイル名を指定して実行」→ regedit と半角で入力してEnterキーを押下します。
HKEY_USERS\(ユーザー識別子)\Software\Classes\Applications
以下に該当アプリケーション名のキーが存在したら、とりあえずバックアップをとってからキーを丸ごと削除します。
バックアップとその書き戻しについてですが、今回の事象の場合はreg saveコマンドを利用する必要はなく、該当キーを選択した状態で、右クリック→エクスポートを選択し、名前は適当に「aaa.reg」とでもつけて、デスクトップあたりにでも保存すればよろしいかと思われます。
該当キーを削除しても、OSが起動しなくなったり、デスクトップ画面までたどり着かないようなことは一切ありません。
HKEY_CLASSES_ROOT\Applications\********.exe
だったという例あり。併せて確認されたし。
答えは、
なぜかというと、
一度も文章読解をせずに人生80年を過ごす事は不可能だからである。
読解能力がなければ説明書きを読めないので一人で手際よく進められない。)
さて、話を戻そう。読書感想文によって、
読書が嫌いな子供が増えているという事実を思い返してもらいたい。
「作文能力を高める訓練」を行えば行うほどに、
「読解能力を高める訓練」から不幸にも子供がどんどん遠ざかっているのである。
まったく本末転倒、これでは何もしない方がマシだ。
読書を嫌いにさせてまで、
すなわち、読解能力を下げてまでして、子供の作文能力を高める必要などあるのだろうか?
(いや、ありはしない!)
まず 「読書を嫌いにさせない」 というのが最優先事項じゃないでしょうか。
こんにちは、音ゲー恋愛マネジメントを専攻しているマリー・アントワネット(黒)です。私は学歴も知識もありませんし七段ですが、机上の音ゲーマーの恋愛論に関してはプロフェッショナル。今回は、モテる音ゲー女子力を磨くための4つの心得を皆さんにお教えしたいと思います。
あえて2~3世代前の音ゲーを遊ぶようにしましょう。ミクやユビはプレイヤー層が比較的若くリア充度が高めなので、十分なルックスがないとただ音ゲー女子であるというだけでは相手にされないためお勧めできません。っていうかあんなヌルい音ゲーよりもデラを遊べ。音ゲーの至高も究極もデラにこそ存在する。デラを遊ぶんだ。
そしてゲーセンで今どきデラで遊んでる時代遅れの男がいたら話しかけ、わざとらしく自分もデラにコインを入れて遊んでみましょう。そして「あ~ん!八段って本当にマジで最後ゲーなんですけどぉぉお~!」と言いながら華麗にギガデリを繋いでSP八段を100%クリアして、男に「なにそれすげえ」と言わせましょう。言わせたらもう大成功。「音ゲーとか詳しくなくてぇ~! ずっとIIDXだけ遊んでるんですけどぉ~! 難しいんですぅ~! ワッツアップオール(顎)」と言いましょう。だいたいの時代遅れ音ゲーマー男は最新のゲームを遊びたがる最近の世代に引け目を感じる習性があるので、最近の音ゲーとしてもせいぜいハローポップンミュージックあたりを遊んでいるはずです。
そこで時代遅れ男が「新しい音ゲーを遊ばないの?」と言ってくるはず(言ってこない空気が読めない音ゲーマーは実は一緒にミクで遊べる可愛くて年下の彼女が居る可能性が高いのでその時点でガン無視OK)。そう言われたらあなたは「なんかなんかぁ~! 最近はビジュアル重視の音ゲーが人気なんでしょー!? あれってどうなんですかぁ? ニコ動系遊びたいけど操作方法わかんなぁぁああい!! 私かわいそーなコ★」と返します。すると男は「ミュージックガンガンでしょ? チュートリアルを使えばいいよ。本当に良くわからないみたいだね。どんな曲が選びたいの?」という話になって、次の休みの日にふたりでHeyに行けるというわけです(ミューガンだけにね)。あなたの女子力が高ければ、男が(そろそろ中古市場にダブついてくるであろう)筐体買ってくれるかも。
「キャー!(家庭用ANOTHERのトラウマが脳内に再来)」とか「恐ろしい!(判定が)」などを表現する「GAMBOL」と戦うと、ギャラリーの男性プレイヤーが「ズズン タン ズズン タン」や「ワォワォワォワォ(GOOD 1)」と思ってくれます。ギャラリーの男性プレイヤーは自力で「GAMBOL(A)」に辿り着くことができないので、男性はあなたを人力リズムマシンのようなすばらしい女の子と勘違いしてくれるのです。そういうキャラクターにするとニコニコ動画で「人外」のようなタグを付けられますが、気にしないようにしましょう。
3. とりあえず男には「えー! なにそれ!? 知りたい知りたーい♪ま、なにはともあれBUCHIAGEってコトで。It's so fabulous!!」と言っておく
飲み会などで音ゲーマー男が女性に話すことといえば20,Novemberを初めてクリアしたときの自慢話や大昔のあるあるネタ「人のプレイ中に2P側で知らない子どもが勝手に練習を始めがち」の話ばかり。よって、女性にとってどうでもいい話ばかりです。でもそこで適当に「山笠があるけん、」とか「博多ったい!」と返してしまうと、さすがの男も上から目線で話されていることに気がついてしまいます。自分も「バックスピンスクラッチを見るとフリーゾーンを勘違いするよね」とか話したいくらいの古参だとバレたら終わりです。そこは無意味にテンションをあげて「we can fly...」と言っておくのが正解。たとえ興味がない話題でも天空脳番長危機十六連打とか昭和企業戦士荒山課長の話題でその場を乗り切りましょう。小難しそうな漢字の羅列に男は弱いのです。
いろいろと話を聞いたあと、「IIDXが日本語版で、DDRが英語版なんですね!覚えたぞぉ!INJECTION OF LOVE!」とコメントすればパーフェクト。続けて野菜を摂りながら「干物でこらしめろ!干物でこらしめろ!」と言って、男に腹筋背筋させるのもアリ。そこで「私のカルロスも泣かなきゃでありますっ☆」と言えば女子力アップ!そこでまた男は「この子おもしろくてカワイイかも!?」と思ってくれます。私は学歴も知識もありませんし改変もとっくに飽きてますが、こういうテクニックを使えば女子音ゲーマーはモテたりするのです。
4. 即売会では初音ミクPROJECT DIVAを知らない女をアピールせよ
男と即売会に行ったら、真っ先にボカロブースを探して「あ~ん!私これよくわからないんですよねぇ~(悲)」といいましょう。するとほぼ100パーセント「どうして?ニコニコ動画見てないの?」と聞かれるので「見てるし遊びたいけど遊べないんですっ><」と返答しましょう。ここでまた100パーセント「ニコニコ動画見てるのにどうして遊べないの?」と聞かれるので、うつむいて3~5秒ほど間をおいてからボソッとこう言います。「……だって、……だって、あの人たちDTMもしてないのにゲームしてるじゃないですかぁっ!クリプトンがかわいそうですぅ!まだパッケージずっと見つめてもいないのにぃぃ~(悲)。みっくみくとすら言えないんですよ……」と身を震わせて言うのです。
その瞬間、あなたの女子力がアップします。きっと男は「なんて気高いガチ音ゲーマーなのだろう!絶対にゲットしてやるぞ!コイツは俺の女だ!」と心の中で誓い、あなたに惚れ込むはずです。意中の音ゲーマーと付き合うことになったら、そんなことは忘れて好きなだけボカロのCDを買って大丈夫です。「ボカロわからないんじゃなかったっけ?」と言われたら「ニコニコ動画で勉強した」とか「歌ってみたデビューした」、「っていうか今度CD出すし」と言っておけばOKです。
(文=弐寺原理主義音ゲーナビゲーター・マリー・アントワネット(黒))
http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/
良いPHPerだって?そんなものは丸めてゴミ箱にでも捨ててしまった方が資源の再利用になる分いくらかマシだ。
つまり俺たちがしなくちゃならないことは「より良いPHPerにならないため」に何ができるかってことなのさ。
それじゃ、始めよう。
?>なんて使っちゃいけない。そう俺たちはBAD PHPer。
無駄なホワイトスペースの出力に悩まされるくらいなら対称性なんて丸めてゴミ箱にでも捨てた方がまだマシだ。非対称性こそが賛美。
require_once("config.php");
未だにこんなことやってるやつがいるのかいベイベー。絶対にダメだ。この一行を見たら俺は悶絶する。
ダメだ、早く何とかしないと。
大抵このconfig.phpの中身はこうなっている。見て絶望だ。
$hoge_path = ''; if (!LOCAL) { define('FOO_FLAG', 1); if (HONBAN) { define('HOGE_FLAG', 1); } else if (TEST) { define('HOGE_FLAG', 2); } } else { $hoge_path = '/local'; define('FOO_FLAG', 2); define('HOGE_FLAG', 3); } define('HOGE_URL', $hoge_path.'/hoge/');
こういうのが延々と続くわけだ。もういやだ。もう見たくない。
本番環境とテスト環境でどういう値の違いがあるのか、ローカル環境だとどうなるのか、まったく把握できる気がしない。
なまじPHPな設定ファイルのせいで、処理をついつい書いてしまう。そしてどんどん複雑になってしまう。
やはり設定データは基本的にYAML等のデータしか定義できない形式のもので用意すべきだ。そして環境ごとに設定ファイルを分けるべきである。
そうすることで何にどういう違いがあるのかすぐにわかるし、diffすれば一度にすべて把握することができる。
# 本番環境設定ファイル foo_flag: 1 hoge_flag: 1 hoge_url: '/hoge/'
# テスト環境設定ファイル foo_flag: 1 hoge_flag: 2 hoge_url: '/hoge/'
# ローカル環境設定ファイル foo_flag: 2 hoge_flag: 3 hoge_url: '/local/hoge/'
// ここで後の処理のためにhogeメソッドを呼び出しておく $q->foo(); // $a['foo']はここに来る時点で真のはず // 2010-03-10 判定がおかしいので修正 // 2010-06-21 やっぱり値が入ってる方が正しい if ( !isset($hoge[0]) ) { }
コメントは保守されない。そう、それは真実。こんなコメントを発見したら即効削除しよう。コメントは基本信じるな。
俺たちにちょっとしたヒントと大きな損害を与えてくれる、それがコメントの役割なのだ。
わかる。いいたい事はとてもわかる。俺たちはしばしばインデントにスペースを使うはずだ。一方でIDEのしっかりした言語ではタブも使うことがある。しかし悪いことに、両者を混同しているプログラマも一定数いるのだ。
タブを画面上で認識しにくいエディタが世の中には存在する(何とは言わないが)
そして画面上で認識しにくいことを理由にタブを気にしないプログラマがいる。
この二つの条件が重なると、タブとスペースの交じり合ったインデントが完成する。もうぐちゃぐちゃだ。これは永遠に続く戦いだ。
私たちが勝利を掴むためにできることなどせいぜい、常にスペースしか使わない。タブを見つけたらその都度スペースに変換する。そういった地道な活動が明日へとつながるのだ。
われわれがプログラムをするとき、何に一番時間がかかってるか。実は変数の命名なのである。ここで拘り過ぎて時間をかけ過ぎては何も進まない。
御託はイイからさっさと書け、だ。しかしとはいっても変数名は重要。日頃からどういうときにどんな名前を使うかを決めておくといい。
そして変数名に型はまったく必要ない。型宣言のないPHPにおいて、型の変数名をつけること自体ナンセンスだ。
$iNumber = 'aaa';
になんの意味もない。コメントを信じるなでも言ったが、これはプログラマを混乱させるだけの害悪なものだ。
変数を使う前に初期化するのは、警告を出さないという意味でも良い癖だ。しかし具体的にどこでやるかが問題だ。
$foo = null; $foo = $q->foo();
こんな初期化に意味はない。よくあるのはやはり、if文で値を振り分けるケースだろう
$foo = null; if ( $hoge ) { $foo = 1; } else if ( $bar ) { $foo = 2; }
このときの初期化はとても有効だ。もしnullの初期化を忘れたまま$fooを使うと警告が出るが、ちゃんと初期化してるので出ない。基本中の基本だ。
function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; return $bReturn; }(中略)
もし、何かしらの理由で、あなたの書いたif文が間違っていたら?
この書き方をしていれば、間違った値に対して、常にfalseが返る。
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。
trueとfalseの条件がいまいち明確ではないが、本当に動かないコードを書けというのであれば以下のようにすべきだ
function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; else if ($i == 1) $bReturn = false; else throw new Exception("bad status! $i"); return $bReturn; }
中途半端にfalseを返して生存させる必要性はまったくない。今すぐ死ね!
連想配列のキーを指定する場合だけ定数と間違わないようにクオートで囲まなければならない。そして逆に定数を使いたい場合はクオートで囲ってはいけない。
更に後世のプログラマが処理を見たときに、定数が使いたかったのか、文字列が使いたかったのかを明確にしたい場合はconstantを使うと良い。
// 定数のFOOを使うよということが明確になる print $a[constant('FOO')];
もし、文字列を変数の値と一緒に出力するとき、PHPではコンマの代わりにprintfを使うことが使える。
printf( “Hello, my name is %s“, $sName);
以下の代わりに上記のコードを使う。
echo “Hello, my name is “, $sName;
出力すべき変数が増えれば増えるほど、有効になっていく。とにかく迷ったならば、printfを使え、だ。
三項演算子はとても有効だ。しかし優先順位に難があるせいで、三項演算子をネストしようとすると以下のようなコードになってしまう
$n = (($i == 1) ? 2 : (($i == 2) ? 3 :$i));
括弧だらけで読みにくいったらありゃしない。三項演算子を使うなら一回まで。約束守れないやつは丸めてゴミ箱にでも捨てちまえ。
if ( $flag ) { }
仕様をちゃんと把握しているなら真偽値のチェックなどこれで十分。
もし事前にbool型だというのが確定してるのなら「$flag === true」を使えばいい。
インクリメント、デクリメント演算子は前に付くか後ろに付くかで意味が変わるので慣れるまでは非常にややこしい。
わけがわからなくなるくらいなら初めから使わないほうが良い。見極められないなら使うな。それがPHPerなのだ。
文句なしだ。これは文句がない。
他にも色々あるので覚えておこう
$a %= 1; $a &= 1; $a |= 1; $a ^= 1; $a <<= 1; $a >>= 1;
てっとり早く画面に表示する際にpreはよく使うが、デザインの関係上画面の文字が見えないときがある。
なのでdivを使って以下のようにしとくと便利だろう。
function p($var) {
echo "<div align='left' style='background-color:white;color:black;'><pre>";
print_r($var);
echo "</pre></div>";
}
君らが通常作るアプリケーションなんぞに、定数なんぞ必要ない。いいか、もう一度言う、お前ら程度のもんが、定数使おう何ぞ、おこがましいわ!
大丈夫。なんでもかんでも定数にする必要はない。結局設定ファイルに定数をずらずら作りまくってわけがわからなくなってるパターンが多い。
貴様みたいなもんに、定数は制御できん。いいか設定ファイルはYAML等のデータで持つようにし、その連想配列のデータ構造を一つ持ってるだけで定数の変わりになる。
このメリットに比べれば、定数だと書き換えられなくて良いという利点などこの歯のカスほどのものだ。そんなものは丸めてゴミ箱へ捨ててしまうといい。
認識を改めろ。俺たちはより良いPHPerにならないために努力している。
class Request { private $parameters; private $method; function __construct () { $this->method = $_SERVER['REQUEST_METHOD']; if ( strtoupper($this->method) === 'POST' ) { $this->parameters = $_POST; } else { $this->parameters = $_GET; } } function param ($key) { return isset($this->parameters[$key]) ? $this->parameters[$key] : null; } }
これだけでもいい。たったこれだけでもとても便利だ。ここから拡張してGETやPOSTを明示的に取るメソッドとかも作ってみるといい。自分の手を動かすのだ!
例が良くない。こんなのは引数が20個ある関数から、setを20回呼ぶオブジェクトに変わっただけではないか。
そもそもこの20個の引数とはなんなのか。何かのデータ構造なんであれば連想配列にして引数一つとして渡すべきだし、それぞれまったく異なる用途の変数なのであればWindowsプログラミングじゃあるまいし、20個も引数取る時点で設計が間違えている。
何がいいたいか。別に関数でもオブジェクトでもどっちでもいいということだ。
そんなことで悩んでる暇があったら設計を見直せ。
スキあらば自分自身を返せ。スキあらばオブジェクトを返せ。配列はArrayObjectのARRAY_AS_PROPSで返せ。
ひたすらメソッドチェイン。来る日も来る日もメソッドチェイン。とにかくメソッドチェインを使い続けろ。そこに未来はある。
どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。
・・・と、いうのはやめなさい。
一見同じように見えた処理でも前後の流れでまったく違うものということが往々にしてある。
まとめ方にも問題があるケースもある。何でもかんでも関数化すると、関数が膨大に増えていく。君は見たことがあるだろうか。common.phpやfunction.phpの恐ろしさを。
確かに細かく関数化はされているが、適切に関数化していないのである。結合度が非常に高い。なんでもかんでも盲目的にまとめれば良いという話ではないのだ!
あまりに極度に意識しすぎると、プログラムそのものができなくなる。そういう状態に陥る。
気を抜いて。そう気を抜いて。所詮あなたのコードなんてすぐに消えてなくなるよ。きっともっと偉い人が作り直すよ。だからまずは思うが侭にやるといい。
結合度を減らすというのは非常に難しい。何度も何度も失敗し続けて、ようやくここは分けた方が良かったんだなと気付く。次に活かそうと心に決める。そしてまた同じ過ちを繰り返していくわけだ。
まずは実装することだ。これが一番の早道だ。まずはがっつり結合した関数をあえて作るといい。何も考えずに作ろう。
そしてその後に、一部分使いまわしたいとおもうことがあるはずだ。その時に関数に切り出そう。それを繰り返すといい。そのうち初めから分けた方が良いと気付く。
何事も経験が必要である!経験を積まないプログラマは丸めてゴミ箱に捨ててしまえ。
さて、先の例で言うならば、私ならadd_result_outputという関数を作ってしまうだろう。だって、addとresultを連続して呼ぶのはめんどくさいんだもん。一連の流れをいつも使うのなら、その流れをやってくれる関数を作ればいいじゃないか。
function add_result_output ($iVar, $iVar2) { $r = add($iVar, $iVar2); echo result($r); }
もっと言えばクラス化してしまってもいいかもしれない。どんな感じになるかは君の手を動かして確認しよう!
このTipsはとてもわかりにくく、ニッチ過ぎる部分も多いかもしれない。
あくまでも「より良いPHPerにならないための20Tips」なのだ。
君はこの記事を鵜呑みにしてはならない。PHPをPHPと見抜けないPHPerはPHPを使うのは難しい。
もし、あなたがPHPプログラマなら、公式のPHPドキュメントはあなたのケツの穴を拭くための紙になるだろう。
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るかなんぞ、歯クソのゴミ程に役に立たないとおもっている。動けばいい。はは。
あなたは、PHPで用意された既製関数で多くのことが実現できることに、(俺の仕事を減らすなと)驚くはずだ。
この記事があなたの役に立たない事を。
ふざけんな!
この記事に書かれている内容は、丸めてゴミ箱に捨てた方が良いレベルです。
これで何が分かるっていうものでもないけど
【民放】
| 出演者 | 曲目 | タイアップ | 備考 |
|---|---|---|---|
| EXILE | 「I Wish For You」 | TBS系「2010世界バレー」 | |
| AAA | 「逢いたい理由」 | NTV「二匹目のどじょう」 | 小室哲哉復帰作としても |
| コブクロ | 「流星」 | CX「流れ星」 | |
| 徳永英明 | 「時の流れに身をまかせ」 | CX「ウチくる!?」 | テレサ・テンのカバー |
| 福山雅治 | 「道標」 | NTV「NEWS ZERO」 | 本人が大河ドラマ「龍馬伝」に主演 |
| FUNKY MONKEY BABYS | 「あとひとつ」 | ABC「夏の高校野球」「熱闘甲子園」 |
【映画】
| 出演者 | 曲目 | タイアップ | 備考 |
|---|---|---|---|
| aiko | 「向かいあわせ」 | 「ダーリンは外国人」 | |
| flumpool | 「君に届け」 | 「君に届け」 | |
| 水樹奈々 | 「PHANTOM MINDS」 | 「魔法少女リリカルなのは The MOVIE 1st」 | 声優のシングル初オリコン1位としても |
【CM】
| 出演者 | 曲目 | タイアップ | 備考 |
|---|---|---|---|
| DREAMS COME TRUE | 「生きてゆくのです♡」 | 大塚製薬「ポカリスエット」 | |
| 西野カナ | 「Best Friend」 | NTTドコモ「ガンバレ受験生」 NTV「音楽戦士 MUSIC FIGHTER」 | |
| Perfume | 「ねぇ」 | サンエー・インターナショナル「NATURAL BEAUTY BASIC」 | |
| 浜崎あゆみ | 「Virgin Road」 | エムティーアイ「music.jp」 | |
| SMAP | 「This is love '10 SPメドレー」 | ロッテ「グリーンガム」/CX「SMAP×SMAP」 | |
| TOKIO | 「advance」 | ヤマト運輸「新!宅急便」 | |
| 坂本冬美 | 「また君に恋してる」 | 三和酒類「いいちこ日田全麹」 | ビリー・バンバンのカバー |
| 出演者 | 曲目 | タイアップ | 備考 |
|---|---|---|---|
| アンジェラ・アキ | 「輝く人」 | 「こころの遺伝子」 | |
| いきものがかり | 「ありがとう」 | 「ゲゲゲの女房」 | |
| HY | 「時をこえ」 | ドキュメント「僕らが伝えなきゃ ~HY沖縄から“命”を歌う~」 | この曲が該当するのかは未確認 |
| 平原綾香 | 「Voyagers」 | 「ダーウィンが来た!生きもの新伝説」 | |
| L'Arc-en-Ciel | 「BLESS」 | 「オリンピック バンクーバー2010」 |
【タイアップ無さそうな曲】
| 出演者 | 曲目 | 備考 |
|---|---|---|
| 植村花菜 | 「トイレの神様」 | 有線とかで話題になった曲 |
| クミコ | 「INORI~祈り~」 | 有線とかで話題になった曲 |
| ポルノグラフィティ | 「君は100%」 | |
| 遊助 | 「ひと」 | ソニーの公式には「マルコメTVCM」とあるけど、この曲じゃなくね? |
【メドレーなので割愛】
| 出演者 | 曲目 | 備考 |
|---|---|---|
| AKB48 | 「紅白2010 AKB48神曲SP」 | |
| 倖田來未 | 「KODA KUMI 2010 Special Medley」 | |
| 和田アキ子 | 「AKKOイイッ! 紅白2010スペシャル」 | |
| 嵐 | 「2010紅白オリジナルメドレー」 | |
| NYC | 「よく遊びよく学べ 100%NYC」 | |
| 加山雄三 | 「若大将50年スペシャルメドレー」 | |
| 郷ひろみ | 「GO! GO!イヤー紅白スペシャルメドレー」 |
【演歌(今期の新作として)】
| 出演者 | 曲目 |
|---|---|
| 五木ひろし | 「おしろい花」 |
| 小林幸子 | 「母ちゃんのひとり言」 |
| 天童よしみ | 「人生みちづれ」 |
| 氷川きよし | 「虹色のバイヨン」 |
| 水森かおり | 「松島紀行」 |
【演歌(定番曲として)】
| 出演者 | 曲目 |
|---|---|
| 石川さゆり | 「天城越え」 |
| 川中美幸 | 「二輪草」 |
| 伍代夏子 | 「ひとり酒」 |
| 中村美律子 | 「河内おとこ節」 |
| 北島三郎 | 「風雪ながれ旅」 |
| 細川たかし | 「浪花節だよ人生は」 |
| 森進一 | 「襟裳岬」 |
ブラジャーのサイズに見られる、B75などの記号についてのお話しをしようじゃないか
このアルファベット部分は一般にカップ数と呼ばれ、トップバストとアンダーバストの差を表す
基本的に10cm差のAから始まり(AAやAAAなども存在はしているが)、2.5cm刻みでサイズが大きくなっていく
Dカップは17.5cm、Eカップは20cmほど、トップとアンダーに差があることになる
アンダーバストとは、おっぱいの下側、一番細い部分の外周。アルファベットの後ろについている数字がそれだ
そしてトップバストとは、おっぱいの頂点部分、一番出っ張っている部分の外周だ
たまにここら辺を混同したキャラ設定で、F100の巨乳ちゃんなどというキャラを見かけるが、
いくらDやEやFカップでも、アンダー100越えなど基本的にドラえもん体型であり、見目麗しい状態ではない
それどころか痩せた際、著しく目減りする可能性を考慮すべきである
C80とD75ではどちらのおっぱいが大きいか。答えは簡単だな。「どちらも同じ」だ
下着はアンダーサイズに応じて収容量が増える仕組みで、サイズをひとつプラスした場合、アンダーをひとつ下げると大体容量が釣り合う
一般的なおっぱいサイズをB75と定義した場合(私調べ)、それはA80、C70、D65なんかと容量的に同じなのだ
ではB75とB80ならどうか。もうわかるな? 正解はB80の方が大きい、だ
ただしアンダーバストが大きいということは、体型に違いがあるわけで、一概にどちらがよいおっぱいかということは言えん
故に紳士諸兄がお好みのおっぱいこそが正義であり、最上至高のおっぱいであると言えよう
以下は回答結果。客観性を担保するために雑音や変な回答も保存し量を確保した。ここから適当に真実を読みとろう。しかし悲惨なものだね。
途中集計へ [ 前の 件 ] ~ 件目の回答 [ 次の 件 ] [ 全件表示 ]
unu ない わかんなぃ 税金でほとんどとられる あ a あ gg か a あ 奴隷社会 たいよう 頑張っても成果は比例しない
わからん 荒波 今北産業 a 色々大変 裏金 給料 すぐに死ねる ヴァンアレン帯 あ 学歴社会 セクハラ うんこ a 安月給
大人の嘘 学歴主義 d 収入が少ない事 zurui やなたまやは 学生より楽 なし ああああ あ ヤフー なし a ぱんつ
メデューサ a 不正 忙しい ない 大人もバカだ 本サイトは無償提供のため、アンケートにご協力ください 格差社会
KY j ブラック企業 ? あ 特にない 理想と現実は違う 付き合い ? sirann . ki ww 不合理 うんこ ko a aaa 裏金
意外と黒い トイレの場所 そーか >< 知りません 適当 か 不倫が横行 労です 自給はうそっぱち 汚い 別にない
aaa 賄賂 あ 軽い 大変 おk unko k 世の中は平等に不平等 夢がない z 分からない 適当さ。 あ 男尊女卑 お金
給料が安い a d ない 出会いがない。 e 大人は汚い にゃー あ a 理想はあくまで理想 サービス残業 わからない r
ない kuso 矛盾 整形が多い あほ ? サービス残業 デスマーチ 学歴社会 sfd 一場 ニート a asda
あ 残業代出ない lg abc 偽装 khb r l まだ学生だから不明 まだ学生 嘘 m 胃痛 / だんどり力 ? n ちんこ 不正
nani 学生 特になし 格差社会 上司がいやだ \(^o^)/ test A 意外に童貞が多いwww s 有給 ラクしてる人は
してる 要領一番 官僚が一番 コネ は 裏口 SIRAN 仕事ができる人が出世できるわけでは無い。大人は意外と子供
cc な 縦社会 しらん p 賄賂 現実 ない 談合の多いことに、びっくり 世の中馬鹿が多すぎる くだらん okane
社会主義 力 k 就職してない I don't know 東大が神 ? 学歴ってホントものいうね 学歴社会 金 キチガイクレーマー
特に無い わかりません 女性蔑視 fusianasan 本音と建て前 秘密 全て 裏事情 医療行為と称した虐待 区別
つつつつつ ? \(^o^)/オワタ ? ? いろいろ 縦社会 zeikinn uso なべやかん ちんぴょろすぽーん ビールうまい
そうか 本当の社会 アンケートに正確に答えてください 談合 接待 さあ 知らない 裏の社会 ゆうせい民営化で得する
のはあめりかだけ かけひき q jkkkk あ ひとによる kane m g opoj わからない 税金の行方 ない ; 税金の正しい
使われ方 あ おまんこ 学生には答えられないのでは? チンコは硬くてうまい >< aaa あ 消費活動は恐怖の植え付
けから生じる free sex 詐欺 乾季値 f ぷるぷる q お客様は神様です 学歴社会 ディズニーランドのキャラクターの中
には人が・・・ わかりません おまんこ あ 知らん ・・・ 分かりません unko うんこ コナン=新一 a z うぇr , , 知らん sya
innhatukaisuterareru 完全週休二日を信じるな わかりません s わからない a l わからない 人を殺しても死刑にはなら
ない あああ lo 努力は必ずしも実らない ま○こ属性 ・・・ 分かりません。 学校のプログラムが国の思惑どおりな事
ない sex don know 福利厚生 bb 主張が出来る奴が勝つ 不明 学歴序列 ytふぃytふぉ この世は亀の背中に乗ってい
る。 高学歴じゃないとクズ fcxv 教師 社会に夢を持ってはいけない ぇ じつは年功序列 不倫 ? この世に夢はない
え dont know 。 i しらないっす かいらく しらね 菅井きんの妊娠 なし 不条理 bbb a 辛い ? 仕事の厳しさ ??
就業時間 no しりません^^ 年収は低い r 人生は辛い お年玉 さあ 整形 a o セックスの神秘 あ すごい 学生なり。
知らん。 赤ちゃんはコウノトリが運んでくる 搾取システム あほ ・・・・ 知らない うん \ わかんない 裏取引
学歴での採用基準の序列 わからん 巨乳はうそ aq 分かりません。 大人って意外と子供 ? ? しらね
SEXは都市伝説 y l 秘密 授業の情報操作 w お金を稼ぐのは大変 a ats e わかりません おおおおおおおおおお
おおおお あ 生涯年収は入社時に決まる 精勤 サンタは実在しない わからない a あ a 人間 kane 学費が高い 努力
しても夢はほぼかなわない 学歴 ない 自殺 特にない あ 天下りが酷い ? 学歴がすべて とくにない このページをみ
た感想を書いて下さい dsa ない 知らん 社会人もいじめをやる 交際費 hdhd 学生 わからない なし e ? 雇用機会均等
は実はない souka souka. ◇未来は自分の夢の素晴らしさを信じる人のものである。 F・ルーズベルト マスゴミ 特にな
し 資本主義社会 税金の無駄遣い 勉強はマジでやっておいたほうがいいが、そんなもんあるか? 政治の問題 アホは
ゴミ 時間 特になし からだ巡り茶 わからない uso ない ないよ 店内のトイレは絶対に利用しない 。 ゆy」 学閥 a 学生
ですから。 あべしの心理 れろれろ a セックスは都市伝説 メンタルマネージメントの重要さ あ まんこ z 学校のプログラ
ムは国の思惑通り gじゅ」@lmn aaa あばば 学生だからしらねぇよw うんちがおいしいという事実 nl 王労 い aaaa
aaaa 警察と暴力団は蜜の関係 wwww 初任給 金金金 ひんこかゆい 格差 ? しね」 を支配しているかが コチニール
デーヴィットロックフェラー 格差 ドラゴンボールは存在しない vguj あ w 酒が飲める A qkあj 道路を舗装すると平米
あたり万円以下がでできる。
つむぎ!Tsumugi!Tsumugi!Tsumugiuuuuuuwaaaaaaaaaaaaaaaaaaaaaaaaaaaah!ahaaaaaa…aa。
ああ、うん、ahaaaaaa! つむぎ!つむぎ!つむぎ!ああ、whinewhine!uuwaaaaaa!
whinewhine!whinewhine!は良いにおいです…おやを愚痴ってください!髪はあやふやであって、柔らかいです!
tsumugikotobuktani!whinewhineの金色ブロンドの髪のにおいのにおいをかぎたいと思う、ああ、!間違ってください、!
あやふやであって、柔らかい状態で欲しい、綿毛で柔らかい、!綿毛で柔らかい、むしばんでください、
あやふやである、柔らかい、… げらげら笑い、げらげら笑い、げらげら笑い!
1ComicのMugichanはすてきでした!ahaaaa…aaa… ああ、aaaaaa!
Mugichan!がすてきであるということであることは、良かったです!決められて、
Mugichananimation用語ahaaaaaa!はすてきです!yeahaaaaah!ahyesh!
アニメーションの2番目の量を市場…noooooooooに置きます!
mewwwwwwww!gyaaaaaaaaaaaaa!ughhhhhhhhhhh!実際、コミックで!おお… アニメーションは良い…
Is牟岐実際--のmewwwwwwwwwwwwwwwwwwwwwwwwwwhであると考えられています!
ughhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh! NOOOOOOOOOO!eeeeeeeeeeeeeeeek!mugiiii!HUWAHUWA!
これ、芳香族縮合炭化水素!停止!et.R.をほんとうは止めてください。
trus!は見ます…カバーの絵のTsumugiが私を見ているというing
カバーの絵の牟岐は私を見ています!牟岐は私を見ています!カバーの絵の牟岐は私を見ています!
アニメーションの牟岐は私に話しています!良かったです…世界はまだあきらめられていません!
Yesssssssssss!私はMugiiiiiiiiiを持っています!利益はwiiでしたか?!それが単独でできます!
うん、comiiiiiiiicsのTsumugi!geeeeeeeeeeeeeeeeeeeeeeeeeeeeee!
Yuiiiiiiii!Miooooooo!Ritsuuuuuuuuuuu!Nodokaaaaaaaa!
Hummmmmm!私の考えはTsumugiへのレポートです!それはsakuragaoka highscoolのTsumugiへのレポートです!
Tsumugi!Tsumugi!Tsumugi!Tsumugiuuuuuuwaaaaaaaaaaaaaaaaaaaaaaaaaaaah!!!
ahaaaaaa...aa..ah!yeah! ahaaaaaa!!! Tsumugi!!Tsumugi!!Tsumugi!!uuwaaaaaa!!!
aah!whinewhine!whinewhine!whinewhine!is a good smell...whine
gosh!i want to smell the smell of the hair of the gold color blond of tsumugikotobuktani!whinewhine!ah!!!
mistook!want fluffy and soft!fluffy and soft!fluffy and soft!hair is fluffy and soft!gnaw,fluffy and soft…haw-haw haw-haw haw-haw!!
Mugichan of 1 Comic was lovely!!ahaaaa…aaa…aha aaaaaa!!yeahaaaaah!!
it was good to be decided the Mugichananimation term!ahaaaaaa!lovely!Mugichan!lovely!ahyesh!
i am glad to put the 2nd volume of a animation on the market…nooooooooo!!!mewwwwwwww!!gyaaaaaaaaaaaaa!!
ughhhhhhhhhhh!!!actual in a comic!!!!oh… animation is considered well…
Is Mugi actual?mewwwwwwwwwwwwwwwwwwwwwwwwwwh!!ughhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!!!
NOOOOOOOOOO!!eeeeeeeeeeeeeeeek!!mugiiii!!HUWAHUWA!!
This!pah!stops!!Stop in reality et.R..trus!?look...ing?Tsumugi of a cover picture is looking at me?
Mugi of a cover picture is looking at me!!!Mugi is looking at me!Mugi of a cover picture is looking at me!!
Mugi of animation is speaking to me!!!was good...world is not given up yet!!!
Yesssssssssss!!!I have Mugiiiiiiiii!!was good wii!!it can do alone!!!
Yeah!Tsumugi of a comiiiiiiiics!!geeeeeeeeeeeeeeeeeeeeeeeeeeeeee!!!!
Yuiiiiiiii!!Miooooooo!!Ritsuuuuuuuuuuu!!!Nodokaaaaaaaa!!
Hummmmmm!!My thought is a report to Tsumugi!!It is a report to Tsumugi of sakuragaoka highscool!!
http://www41.tok2.com/home/unkoumaka/
Rank : AAA
Score : 197285
Max Combo : 120
Complete : 11
Solve : 0
Miss : 6
Minus Score : -2715
Corrected Character : 219/225
Corrected Percent : 97%
Typespeed/min : 305/min
Correct / Miss : 219/225
Corrected Percent (Solve Cut) : 97%
やっぱりこういうの苦手だわ。
http://www41.tok2.com/home/unkoumaka/
Music : vestige
Rank : AAA
Score : 194251
Max Combo : 79
Complete : 30
Solve : 0
Miss : 38
Minus Score : -5749
Corrected Character : 655/693
Corrected Percent : 94%
Typespeed/min : 285/min
Correct / Miss : 655/693
Corrected Percent (Solve Cut) : 94%
ロンドンハーツ「実名アンケート! 芸人リアル好感度調査」(前編,後編)は今が旬のブラマヨとアンタッチャブル山崎が活躍して非常に面白かった。
番組はこんな感じ : 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東野)」。
東野は「さんまさんタイプ」って言ってたけど、こういうカブせ方を見てるとたけしタイプなのかも。
最近までのレッドカーペット的な短いお笑いの流行りが終わった今このタイミングで山崎に注目が集まってるってのが非常に面白い。そんでそれを迷わずすくい上げて放送してくれる番組もありがたい。
C言語ならエラー処理はgoto使った方がスマートだとおもうよ。
GOTOなし
AAA *a = NULL; BBB *b = NULL; CCC *c = NULL; if (mallocA() == error) { return RC_ERROR1; } if (mallocB() == error) { free(a); return RC_ERROR2; } if (mallocC() == error) { free(a); free(b); return RC_ERROR3; } return RC_SSUCCESS;
GOTOあり
AAA *a = NULL; BBB *b = NULL; CCC *c = NULL; int rc = RC_SUCCESS; if (mallocA() == error) { rc = RC_ERROR1; goto END_FUNC; } if (mallocB() == error) { rc = RC_ERROR2; goto END_FUNC; } if (mallocC() == error) { rc = RC_ERROR3; goto END_FUNC; } END_FUNC: free(a); free(b); free(c); return rc;
/* なんとなく思いついたので試してみたら破綻してたよ */ data aaa ; do descending=1 to 2 ; do a=1 to 2 ; output ; end ; end ; run ; proc print ; run ; proc sort ; by descending a ; run ; proc print ; run ; proc sort ; by descending descending a ; run ; proc print ; run ; proc sort ; by descending descending descending a ; run ; proc print ; run ; /* そもそもこんなコード書くなって意見は勿論正しい */
SP用
javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.sp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.sp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[0]+"|"+m.music_list[i].diff[1]+"|"+m.music_list[i].diff[2]+"],"+x.level[0]+","+x.score[0]+","+t[x.flag[0]]+","+x.level[1]+","+x.score[1]+","+t[x.flag[1]]+","+x.level[2]+","+x.score[2]+","+t[x.flag[2]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();
(たぶん)DP用
javascript:(function(){var t={0:"No Play",1:"Failed",2:"Assist Clear",3:"Easy Clear",4:"Clear",5:"Hard Clear",6:"Full Combo"};var f={0:"f0",1:"f1",2:"f2",3:"f3",4:"f4",5:"f5",6:"f6"};var l={AAA:"aaa",AA:"aa",A:"a",B:"b",C:"c",D:"d",E:"e",F:"f"};new frames[0].Ajax.Request('../data/getMusicList.do?'+frames[0].Music.tags,{method:'get',onComplete:function(r){eval("var m="+r.responseText);new frames[0].Ajax.Request('../data/getMusicData.do?'+frames[0].MusicScore.tags,{method:'get',onComplete:function(r){eval("var s="+r.responseText);var h=window.open("about:blank");var d=h.document;d.open();d.write("<title>csv</title><pre>Ver,Title,Difficulty,NRank,NScore,NClear,HRank,HScore,HClear,ARank,AScore,AClear");var r=s.rivalsscore.score.dp;for(var i=0;i<r.length;i++){d.write(","+s.rivalsscore.name.dp[i]+",N/H/A,Score(Clear),,,");}d.write("\n");for(var i in m.music_list){var x=s.myscore[m.music_list[i].mid];d.write(m.version[m.music_list[i].version].name+",\""+m.music_list[i].name+"\",["+m.music_list[i].diff[3]+"|"+m.music_list[i].diff[4]+"|"+m.music_list[i].diff[5]+"],"+x.level[3]+","+x.score[3]+","+t[x.flag[3]]+","+x.level[4]+","+x.score[4]+","+t[x.flag[4]]+","+x.level[5]+","+x.score[5]+","+t[x.flag[5]]);for(var j=0;j<r.length;j++){var z=r[j][m.music_list[i].mid];if(!z){continue;}d.write(","+z.score[0]+","+t[z.flag[0]]+","+z.score[1]+","+t[z.flag[1]]+","+z.score[2]+","+t[z.flag[2]]);}d.write("\n");}d.write("</pre>");d.close();}});}});})();
「はじめての正規表現」がホッテントリ入りしていますが、
導入としては、何に使うのかがわかりやすくて良いのではないかと思います。
あれを見て、基本機能をまとめてみたくなったので、正規表現の基本的な機能について書いてみます。
(正規表現が初めてという人は「はじめての正規表現」を先に見たほうがいいと思います。)
例では「検索」か「置換」をするものとして話を進めていきます。
(「はじめての正規表現」が実例を中心にしたのに対して、こちらは機能を中心に書きます)
正規表現は、プログラミング言語やその他のツールなど、それぞれで微妙な違い(方言)があるので、その点には注意が必要です。
(表記法が違ったり、ここに紹介する機能がサポートされていなかったり、逆に紹介していない機能をサポートしていたりする場合があります)
メタ文字とは機能を持つ文字で、『.』『*』『*?』といったものが当てはまります。
リテラル文字は「文字それ自体」と解釈される文字で、『 』『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さんご指摘ありがとうございます。