ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示
ラベル 正規表現 の投稿を表示しています。 すべての投稿を表示
2013/12/30

2013年に @wada811 が読んだ技術書まとめ

2013年も終わりに近づいているので@wada811が読んだ技術書を振り返ってみようかと思います。
2012年はこちら→2012年に @wada811 が読んだ技術書まとめ | DevAchieve(約40冊)

2013/03/02 [書評]正規表現辞典 | DevAchieve

正規表現辞典は本当に良い。
通読しても良し、かいつまんで読んでも良し、辞書としても良しの三拍子揃った素晴らしい書籍です。
正規表現が使えれば大抵のテキスト処理は簡単にできるのでエンジニアもそうでない人も読んだほうが良いです。
ついでに僕の Amazon リンクから買うとアフィリエイト料が入ってなお良しです。
(最近、アフィリエイト料率が下がって全然儲からないです。つらい。)

2013/05/31 [書評]モバイルデザインパターン | DevAchieve

デザイン系の書籍は [書評]iPhoneアプリ設計の極意 ―思わずタップしたくなるアプリのデザイン に続いて2冊目。
会社にあったので読んでみた。内容的にはiPhoneアプリ設計の極意とそんなに変わらないかも。
それぞれのデザインパターンについて簡潔な説明でまとめた付録がわかりやすかった。どちらか一冊で良さそう。
もう一冊読むなら一味変えてインタフェースデザインの心理学を読んだほうが得るものありそう。
あと、ユーザビリティで有名っぽいニールセン博士のモバイル・ユーザビリティも微妙に気になってる。
へいしゃー!買ってくれー!間に合わなくなっても知らんぞー!!

2013/08/25 [書評]HTTPの教科書 | DevAchieve

概要を知るには良い感じの本です。挿絵とか文体とか読みやすくてわかりやすかったです。
Web 関連の技術や必要な知識についてHTTPの教科書のテイストで解説している本があったら
Web 系プログラマの新人教育に使えそうな気がします。
Web への攻撃技術という章でセキュリティ関連の解説もわかりやすく行われているので大変良いです。
(引越に際して売ろうかと思っていたけど取っておこうかな)

2013/08/29 [書評]達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ | DevAchieve

データベース初心者がSQLを極めるためのオススメ書籍6冊の本のうち、読んだ本3冊目です。
ちなみに達人に学ぶ SQL徹底指南書は読んでません。
結構 SQL は書けるようになって複雑なのとか行けるようになったから
そこまで切羽詰まってないので達人に学ぶ SQL徹底指南書はいいかなぁって感じです。
それより DB 設計とかパフォーマンスチューニング的な所を身につけていきたいです。
DB 設計については達人に学ぶDB設計 徹底指南書が良かったので何とかなりましたが、
パフォーマンスチューニングはどこから知識を得ればいいんでしょうね?
数十万件規模のテーブルをジョインジョイントキィするとサービスをKOしてしまって
開発第二ラウンドが発生してしまうので勘弁願いたいんですよねぇ。

1年で書籍4冊の書評を書いた!

2012年は約40冊読んで25冊くらい書評書いたのに今年少なすぎじゃないか?アカン…。
まぁその分DevCameraの開発にかなりの時間を割いたし、
書籍を読む以上に Androider としての技術力が上がったから良いかな?
Android の NDK とか OpenGL, OpenCV のような特殊な事以外だったら
書籍無くてもリファレンスとか見てだいたい実装できそうな気がする。
まぁアニメーションとか UX 的な気持ちよさみたいな部分の実装能力はまだまだだけど。

読んだけど書評を書いていないのは以下の7冊かな。
【改訂新版】 Linuxコマンド ポケットリファレンス
良かった。手元においておきたい感じだけど
普段使うコマンドってそんなに変わらないから使用機会が少ないのが難点。
しかも家に置いてあるという。会社だったらググって解決なので使い所が難しい。
入門UNIXシェルプログラミング
まだ読み途中で積ん読になってる…。
興味はあるし、ちょっとしたシェルスクリプトで手間が省けたら嬉しいから学びたいけど
いかんせん使用機会の少なさがモチベーションの低さになってしまう。
入門 Androidアプリケーションテスト
UnitTest やろうというのが2013年の目標だったので買ってみた。
しかし、開発したアプリがカメラ機能がメインなのでテストがやりにくくて全然やってない。
仕事でカメラとか端末機能を使わないアプリでは UnitTest をやれたので良かったと思う。
Smashing Android UI レスポンシブUIとデザインパターン
デザイン系の書籍3冊目で、珍しく Android をテーマにしたデザインパターン本です。
凄く良い本だったし、ちゃんと書きます。放置しててごめんなさい…!
書きました→[書評]Smashing Android UI レスポンシブUIとデザインパターン | DevAchieve
OpenGL ES 2.0 Androidグラフィックスプログラミング
OpenGL ES を Android から呼び出す方法を解説している本です。コレも記事書きます…!
年をまたいでしまう…!ごめんなさい…!
書きました→[書評]OpenGL ES 2.0 Androidグラフィックスプログラミング | DevAchieve
Effective Java 第2版
ピアソン桐原社の技術書などが在庫限りという事で入手困難に陥る前に買いました。
記事書きます…!読んだらすぐに書評書かないとダメだ…!
書きました→[書評]Effective Java 第2版 | DevAchieve
プレゼンテーションZen 第2版
こちらもピアソン桐原社の書籍で、会社にあったので読みました。
4月になる前にこのへんの書籍の書評を書こう…!

Android も良いけど他のことももっと色々出来るようになっていこう!
そしてちゃんと書評記事を書こう!速さが足りない!
2013/03/12

[PHP]実用的なメールアドレスの正規表現

メールアドレスは仕様がヤバイ

正規表現辞典正規表現辞典を読んでループ展開も覚えた私に怖いものなどない!と
メールアドレスの正規表現を書いてみた。…ものは漏れがあった。
メールアドレスの正規表現なんて決定版があるんじゃないの?と調べてみたら
404 Blog Not Found:「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ
こぶたのラッパ » 「PHP使いはもう正規表現をblogに書くな」のメールアドレスチェック用正規表現をPHP用に書きなおす
「danコガいはもう正規表現をblogに書くな」と言わせないでくれ | へぼい日記
404 Blog Not Found:regexp - 'test@[127.0.0.1' . "¥¥¥x1f]" はRFC2822準拠
などの記事が見つかった。正規表現がヤバイと思ったらまず仕様がヤバイらしい。
Perlメモ
Jeffrey E. F. Friedl氏原著による 「詳説 正規表現」にはメールアドレスはネストしたコメントを持つことができるので正規表現で表わすのは不可能であると書いてあります。
メールアドレス - Wikipedia
Wikipedia 見るとわかるが実は色々と記号を使えたり、" " でくくればなんでもありという凄い仕様なのである。

そこで一番理解できそうな以下の記事の正規表現を使うことにした。
メールアドレス(addr-spec)の正規表現 | へぼい日記
<?php
$wsp           = '[\x20\x09]'; // 半角空白と水平タブ
$vchar         = '[\x21-\x7e]'; // ASCIIコードの ! から ~ まで
$quoted_pair   = "\\\\(?:$vchar|$wsp)"; // \ を前につけた quoted-pair 形式なら \ と " が使用できる
$qtext         = '[\x21\x23-\x5b\x5d-\x7e]'; // $vchar から \ と " を抜いたもの。\x22 は " , \x5c は \
$qcontent      = "(?:$qtext|$quoted_pair)"; // quoted-string 形式の条件分岐
$quoted_string = "\"$qcontent*\""; // " で 囲まれた quoted-string 形式。量指定子が*ということは空文字を許容している
$atext         = '[a-zA-Z0-9!#$%&\'*+\-\/\=?^_`{|}~]'; // 通常、メールアドレスに使用出来る文字
$dot_atom_text = "$atext+(?:[.]$atext+)*"; // ドットが連続しない RFC 準拠形式をループ展開で記述
$dot_atom      = $dot_atom_text; // RFC5322 では dot-atom と呼ぶ
$local_part    = "(?:$dot_atom|$quoted_string)"; // local-part は dot-atom 形式 または quoted-string 形式のどちらか
$domain        = $dot_atom; // ドメインは英数字と記号 を ドット区切りにした文字
$addr_spec     = "${local_part}[@]$domain"; // 変数展開で配列として処理されるため可変変数として書いている

// 昔の携帯電話メールアドレス用
$dot_atom_loose   = "$atext+(?:[.]|$atext)*"; // 連続したドットと @ の直前のドットを許容する
$local_part_loose = "(?:$dot_atom_loose|$quoted_string)"; // 昔の携帯電話メールアドレス用。昔の携帯電話は quoted-string 形式のメールアドレスを取得できたのか?
$addr_spec_loose  = "${local_part_loose}[@]$domain"; // 変数展開で配列として処理されるため可変変数として書いている

$input_addr_spec = 'foo@example.com';

if ( preg_match("/\A$addr_spec\z/", $input_addr_spec) ) {
    print "valid addr-spec\n";
}
?>
理解せずにコピペするのは嫌だったのでコメントをつけて理解できるようにした。
リンク先の方針は引用していないけど読んでおいてください。
RFC 5322 準拠で昔の携帯電話のメールアドレスで取得できた
「連続したドット」と「 @ の直前のドット」を持つメールアドレスも許容する正規表現を書いてくれている。
\ が \\\\ と表記されている理由は正規表現事典のP.115を見るべし。
簡単にいえば文字列のエスケープと正規表現のエスケープでそれぞれ倍増するから。

あと 多分バグで quoted-string 形式の正規表現の量指定子が * になっていて ""@domain を通してしまう。

^-^@-.- はRFC準拠のメールアドレスです

メールアドレス(addr-spec)の正規表現 | へぼい日記ではローカルパートのテストは十分行われているけど
ドメイン部分のテストは不十分に感じる。その証拠に ^-^@-.- なども通してしまう。
流石にこんな顔文字みたいなメールアドレスを DB で見かけたら目を疑ってしまう。
その理由はRFC 5322 - Internet Message Formatにほとんどドメインについて書かれていないからである。
ドットとハイフンは連続しないと思われるが連続を許す正規表現だし、記号も色々使えるのでおかしい気がする。
そう思って調べてみると Wikipedia にRFC 5321 - Simple Mail Transfer Protocolにも
メールアドレスについて書かれている、と書いてあった。
軽くキーワードだけ抽出して読んでみた感じでは
ドメインはドット区切りのサブドメインの繰り返しからなり、
サブドメインはハイフン区切りの英数字の繰り返しからなる。
読む人は RFC で使われる ABNF の仕様(RFC 5234 - Augmented BNF for Syntax Specifications: ABNF)が
わからないと読みにくいかも。まぁなんとなく予想はつくだろうけど。

実用的なメールアドレスの形式チェック関数

<?php
function isValidEmailFormat($email, $supportPeculiarFormat = true){
    $wsp              = '[\x20\x09]'; // 半角空白と水平タブ
    $vchar            = '[\x21-\x7e]'; // ASCIIコードの ! から ~ まで
    $quoted_pair      = "\\\\(?:{$vchar}|{$wsp})"; // \ を前につけた quoted-pair 形式なら \ と " が使用できる
    $qtext            = '[\x21\x23-\x5b\x5d-\x7e]'; // $vchar から \ と " を抜いたもの。\x22 は " , \x5c は \
    $qcontent         = "(?:{$qtext}|{$quoted_pair})"; // quoted-string 形式の条件分岐
    $quoted_string    = "\"{$qcontent}+\""; // " で 囲まれた quoted-string 形式。
    $atext            = '[a-zA-Z0-9!#$%&\'*+\-\/\=?^_`{|}~]'; // 通常、メールアドレスに使用出来る文字
    $dot_atom         = "{$atext}+(?:[.]{$atext}+)*"; // ドットが連続しない RFC 準拠形式をループ展開で構築
    $local_part       = "(?:{$dot_atom}|{$quoted_string})"; // local-part は dot-atom 形式 または quoted-string 形式のどちらか
    // ドメイン部分の判定強化
    $alnum            = '[a-zA-Z0-9]'; // domain は先頭英数字
    $sub_domain       = "{$alnum}+(?:-{$alnum}+)*"; // hyphenated alnum をループ展開で構築
    $domain           = "(?:{$sub_domain})+(?:[.](?:{$sub_domain})+)+"; // ハイフンとドットが連続しないように $sub_domain をループ展開
    $addr_spec        = "{$local_part}[@]{$domain}"; // 合成
    // 昔の携帯電話メールアドレス用
    $dot_atom_loose   = "{$atext}+(?:[.]|{$atext})*"; // 連続したドットと @ の直前のドットを許容する
    $local_part_loose = $dot_atom_loose; // 昔の携帯電話メールアドレスで quoted-string 形式なんてあるわけない。たぶん。
    $addr_spec_loose  = "{$local_part_loose}[@]{$domain}"; // 合成
    // 昔の携帯電話メールアドレスの形式をサポートするかで使う正規表現を変える
    if($supportPeculiarFormat){
        $regexp = $addr_spec_loose;
    }else{
        $regexp = $addr_spec;
    }
    // \A は常に文字列の先頭にマッチする。\z は常に文字列の末尾にマッチする。
    if(preg_match("/\A{$regexp}\z/", $email)){
        return true;
    }else{
        return false;
    }
}
俺は変数展開は{}でくくる派なんだよお!
あとRFC 5321 - Simple Mail Transfer Protocolではサブドメインは1回でも良いので hoge@fuga を
許容するのだけど感覚として最低でもドットは1回は含まれるだろ?ってことで15行目の量指定子を + にした。

引数で昔の携帯電話のメールアドレスの形式をサポートするか選べるようにした。
なので以下のように書ける。普通こんな事しないだろうけど。
<?php
if(isValidEmailFormat($email)){
    if(isValidEmailFormat($email, false)){
        // RFC準拠の正しいメールアドレスです
    }else{
        // キャリアの独自形式なのでメールが届かない可能性があるよ的な注意書きが出せる
    }
}else{
    // 不正な形式なのでエラーです
}
ちなみに昔の携帯電話のメールアドレスの形式をサポートしないなら filter_var を使うこともできる。
if(filter_var($email, FILTER_VALIDATE_EMAIL)){
    // 正しい(?)形式です
}
(?)をつけたのはドメイン部分のハイフンとドット周りで変なのを許容するから。
処理時間は isValidEmailFormat より 6倍遅い上に、filter_var のメールアドレスチェックは微妙なので
isValidEmailFormat 関数を使って行きましょう!

追記: 2013/08/11

Perl - PHPしか書けないザコがメールアドレス正規表現でガチ勢に挑んでみた - Qiita [キータ]
色々なパターンをテストしてもらいました。
基本的にWebサービスでの利用を想定していたので
はてブコメントにあるようなドメインパートが localhost のメールアドレスや
IPv4, IPv6 のメールアドレスは通らなくても良いかな?
a@a.0, a@0.0, a@0.a が通ってるのが微妙感あるけどどうなんだろ?
他は大体想定通りなので良かった。
文字数チェックは行なっていないので別途チェックしましょう。
2013/03/02

[書評]正規表現辞典

正規表現辞典 メタキャラクタリファレンス&目的別逆引きリファレンス
佐藤竜一
翔泳社
発売日:2005-07-12
ブクログでレビューを見る»
読みやすく様々な処理系に対応した正規表現のリファレンス本。
対応処理系とメタキャラクタの解説、実行結果が
1ページ程度でまとまっていて大変わかり易い。
正規表現自体についての解説と用語リファレンスが40ページくらいあるが
サクッと簡単な解説で正規表現を使いたいだけの人でも十分な説明がある。
複雑な正規表現では動きを理解するために正規表現自体を理解していないと難しいので解説があるのは嬉しい。
また、正規表現を使用するために様々な処理系での利用方法を解説しているので初心者も安心。

肝心のメタキャラクタリファレンスも大変わかり易く、メタキャラクタとその動き、
対応処理系(sed|grep|vim|egrep|awk|perl|PHP|Java|ECMAScript(JavaScript)|秀丸エディタ)、
メタキャラクタの解説と実行結果が1ページ程度で書かれている。
逆引きリファレンスは目的を果たすためにどのメタキャラクタを使ってどのように書けば良いか解説されている。
リファレンス本だが書き方の参考になるので一度は通読しておきたい。
正規表現は簡単なものでも使えたらかなり捗るのでプログラマ以外の人も覚えておくと良い。
2012/12/28

Webプログラマーになる前に学ぶべきこと、知っておきたかったこと

新米Webプログラマー@wada811がプログラマーになる前に学ぶべきこと、知っておきたかったことを
これからWebプログラマーになる人に向けてまとめてみました。

心構え

プログラマとして生きるための心構えとして情熱プログラマーを読んでおくのはオススメだと思います。
研修先から帰る新幹線の中で読み終わる程度の分量だったのでぜひ読んでおいて欲しいです。
さらっと読めてしまうけど学ぶことが多いので何度も読んでしまうお気に入りの本です。
コードについてはリーダブルコードを読みましょう。[書評]リーダブルコード The Art of Readable Code
志高く、良いコードを書こうという気概があれば技術者として伸びていけると思っています。こちらもぜひ!
あと、ブログを書こう!私がプログラマとしてブログを書く事をオススメする8つの理由 | DevAchieve

スキル

HTML/CSS

Web系なら基本中の基本です。
HTML5/CSS3とかアツいですし、HTML5の仕様策定も完了したのですが
ユーザーが使用するブラウザが対応していないことも多いのでまずは基本のHTML/CSSを抑えましょう。
ということで、Web標準の教科書―XHTMLとCSSでつくる“正しい”Webサイトはオススメです。
結構習うより慣れろ的なところがあるので既存のページをいじくりまわすだけでも勉強になるかと思います。

プログラミング

あんまり好きじゃないですけど最初はやっぱりC言語からなのかなぁという気がします。
最初はCの絵本新版 明解C言語 入門編なんかを半年くらい挫折を繰り返したり
プログラミングの宝箱 アルゴリズムとデータ構造 第2版でちゃんとアルゴリズムを学んだり
AIZU ONLINE JUDGEのVolume100のものを一通りやったりとある程度できるようになるまで頑張りました。
今は3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストールがあって
通信添削もしてくれるそうですからプログラミング学習については困らなそうですね。

JavaScript/jQuery

軽く知っていると実装に幅が出て捗ります。
ガッツリ習得してなくても何とかなっているけど基本くらいは知っておきたいですね。
プロになるためのJavaScript入門が最近出て、書評とか見る限り良さげだったので読むと良さそうです。
ガチでやるならJavaScript 第6版JavaScriptリファレンス 第6版は役立ちそうです。

正規表現

もしかしたらJavaScriptより先にこっちを習得しておくべきかもしれません。
めんどくさいテキスト処理などを一発で片付けることができたりとかなり捗ります。
習うより慣れろで覚えてしまったのでどの書籍が参考になるとかは挙げられないのですが頑張って覚えましょう!

PHP

全く知らないのでは実務で困ることが多いと思うので概要をプロになるためのWeb技術入門
プロになるための PHPプログラミング入門で抑えておけばなんとかなるはずです。
プログラミング自体が初めてでなければめっちゃ便利なC言語の上位版みたいな感じなので大丈夫だと思います。
あとはPHP: PHP マニュアル - Manualが詳しいので関数とかをマニュアル見れば使いこなせるかと思います。
フレームワークはCakePHPがよく使われているますが、入社時に習得してなくても
CakePHP Cookbookというドキュメントがあるので入社後に習得していけば大丈夫です。

SQL

PHPに合わせてSQLも学ぶ必要がありますが、入社時にはデータベースの概要がわかっていれば十分でしょう。
マンガでわかるデータベースがわかりやすかったです。[書評]マンガでわかるデータベース | DevAchieve
SQL ゼロからはじめるデータベース操作も読んでガリガリSQL書けるようになっていると凄いです。
[書評]SQL ゼロからはじめるデータベース操作 | DevAchieve

バージョン管理システム

SubversionかGitのどちらかを知っていて軽くでも使ってみていると実務で使う際に理解が早いかと思います。
個人で使うならGitだと思うので入門gitとか読んで実際に使ってみると良いんじゃないでしょうか?
GitならGitHubでソースコードを公開できるので何か作って公開しておくとヘッドハンティングとか来るかも?

資格

資格を持っていなくても基本情報レベルの知識はあった方が良いんじゃないかと思います。
僕は基本情報は入社直後の春に取りました。基本情報技術者試験を受験するまでに使った参考書3冊
基本情報が取れればちょっと勉強すれば応用情報も取れると最近聞いて来春受験に向けて勉強してます。
資格を取ったら祝い金とか貰えるとこなら頑張るのもいいと思います。

おわりに

こう見るとWebプログラマーに求められる技術は結構幅広いですね。
広く深い知識を習得していかなければなりませんので日々勉強が必要です。
万能選手でなければならないけどもスペシャリストでもなくてはならない、
それでいて一番の下手くそでもいたい。(情熱プログラマー)
こんな師匠がいて導いてくれていたらと思い、記事を書いてみました。
僕のWeb系の師匠になってくれる人を探しています!
2012/07/04

[競技プログラミング][PHP][AtCoder]大好き高橋君 ( Love me do )

A - 大好き高橋君 ( Love me do )

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

 高橋君は自分が大好きなので、自分の評判を調べるために自分の名前が入っているツイートを調べたいと考えました。
しかし彼のフォロー数は多いので、タイムラインを 1 つずつ確認して自分に関係あるつぶやきを探すのは面倒です。

 そこで高橋くんを手伝うために、与えられる文から高橋君を表す単語が現れる回数を数えてください。
 ただし、単語の一部に高橋君を表す単語を含んでいた場合も、
高橋君を表す単語と完全に一致しない限り、その単語を高橋君を表す単語として数えないでください。

 以下の3単語が高橋君を表す単語です。
TAKAHASHIKUN(高橋君をヘボン式ローマ字にして、全て大文字にしたもの)
Takahashikun(高橋君をヘボン式ローマ字にして、先頭の 1 文字のみ大文字、残りは小文字にしたもの)
takahashikun(高橋君をヘボン式ローマ字にして、全て小文字にしたもの)

入力

入力は以下の形式で標準入力から与えられる。
N
w0 w1 … wN−1.
入力は 2 行ある。
1 行目には、2 行目に与えられる文に含まれる単語数を表す整数 N(1≦N≦50) が与えられる。
2 行目には 2 文字以上 100 文字以下の 1 文が与えられる。
文は単語 wi(0≦i≦N−1)から成り、各単語は空白で区切られている。
最後の単語 wN−1 の後には空白を挟まず . がある。
単語 wi(0≦i≦N−1) は英字(A-Z, a-z)で成り立っている。

出力

与えられた文の中で高橋君を表す単語が現れる回数を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

A: 大好き高橋君 ( Love me do ) - AtCoder Regular Contest #005 | AtCoder

回答

AtCoder/arc005_1.php at master · wada811/AtCoder · GitHub

<?php
fscanf(STDIN, "%d", $n);
$sentence = fgets(STDIN);
$words = explode(' ', str_replace(".", "", $sentence));
$count = 0;
foreach($words as $word){
    $count += preg_match('/^(TAKAHASHIKUN|Takahashikun|takahashikun)$/', $word, $match);
}
echo $count . PHP_EOL;
?>
PHPで標準入力から一行取得するには3行目のようにする。
4行目でピリオドを消し飛ばして半角スペースで分割する。
単語ごとにマッチするかチェックしつつpreg_matchでマッチした回数をカウントする。
後は出力するだけ。
本当はpreg_match_allでやりたかったけど正規表現パワーが足りなかった…。

タグ(RSS)