複数行ある文字列に重複がないかチェックする
テキスト操作のメモ。とあるファイルが以下のようであったとする。
foo bar baz
これに重複がないかチェックしたい。 以下のコマンドでチェックできる。
cat foo.txt | sort | wc -l cat foo.txt | sort | uniq | wc -l
結果
3 3
上記コマンドで出力が同じであれば重複なしと判断できる。
テキストを変更する。
foo bar baz bar
結果
4 3
重複があることが分かる。
ディスプレイの枚数とか
最近デュアルディスプレイとか不要な気がしてきた。視線を動かすのがめんどい。その代わり2560x1440の27インチディスプレイが一枚ほしい。4万以上で手が出ない。
Webアプリケーションの脆弱性、攻撃手法とその対策
今回はWebアプリケーションにおける脆弱性についてまとめる。フレームワークが当たり前の時代とはいえ、脆弱性を生む場面を理解し、正しい処理をしておかなければ必ずウィークポイントを産んでしまう。脆弱性を突かれる突かれない以前に、これは普通に恥ずかしいことである。恥ずかしいことなので、IPAの「セキュア・プログラミング講座」や「安全なウェブサイトの作り方」には一度目を通しておくべき。
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/index.html http://www.ipa.go.jp/security/vuln/documents/website_security.pdf
Webアプリケーションの主たる脆弱性
どのような脆弱性が存在するのか列挙していく。基本的にはこんなものだと思う。
- SQLインジェクション
- OSコマンドインジェクション
- 公共領域への意図しないファイル配置
- ディレクトリトラバーサル
- URLクエリパラメータ推測
- XSS攻撃(クロスサイト・スクリプティング)
- CSRF攻撃(クロスサイト・リクエスト・フォージェリ)
- エラー画面表示・デバッグモード有効状態
- Cookieの改竄
- ヌルバイト文字列
- HTTP ヘッダ・インジェクション
- バッファ・オーバーフロー
攻撃と対策
主要な脆弱性の概要、具体的な攻撃手法とその対策についてまとめる。
SQLインジェクション
- 概要
説明するまでもないと思うけど、SQLインジェクションはフォームやパラメータを通じてSQL文やその一部を入力することで、DBに意図しないクエリを投げられ得る脆弱性。
- 攻撃手法
こんな感じのシーンが考えられる
// 件数設定 var lim = $('input#text').attr('value'); var sql = "SELECT * FROM table ORDER BY id LIMIT lim";
ユーザーの入力値およびSQLクエリに対してvalidationが掛けられていない場合にSQLインジェクションが起こる。もしそのようだとここで仮定したとして、変数limにこんな値を入れてみたい。
var lim = 100000000000000000000000000000000000000; とか var lim = "1'; DROP TABLE table"; など
上はレコードの上限をとにかく増やして負荷をかけることが可能になる。したはクエリを一度切ってしまうことでまた新しく任意のクエリをユーザーが入力できてしまう。最悪データベースが吹っ飛ばされる。「このサイト怪しいなー」とか思ったら、シングルクオートやセミコロンなどで挙動を確認...けど犯罪なのでやめましょう。
- 対策
SQL注入攻撃の対策には、次の4つがある。validation,特殊記号のエスケープ,プレースホルダ採用,ストアドプロシジャによる実装である。採用を考慮する順序は、ストアドプロシジャ、プレースホルダ、特殊記号エスケープの順である。validationは常に行う。
XSS攻撃
CSRF攻撃
未完。徐々にまとめてきます。
金色のMacProが手元に届くという夢を見た
Introduction
夢の話をしようと思う。
MacOSXは僕が過去6年にわたって慣れ親しんできたOSだ。システムは隅から隅まで直感的だし、シンプルかつ必要十分な機能が実現されている。比較的短い期間でアップデートされることで数百もの新機能が追加され、Macはより理想的なコンピューティングに近づく。それはユーザーにとって革新の連続。MountainLionにおいても、OSレベルでソーシャルメディアとのシームレスな連携が実現しているし、細部まで行き届いたジェスチャーの滑らかさ、通知センターというユーザーフレンドリーな機能などが追加されている。MountainLionは、iPhoneで培ったAppleの美学がMacOSXに結実した瞬間だ。それは他の追随を許さない快適さをもたらし、私達の生産性を高めているのだ。アップデートされる度にまったく新しい体験をもたらしてくれるAppleに心を奪われるのは当然のことのように思う。MacOSXは生活を極彩色へと導く強さと美しさを兼ね備えたOSだ。それはまるで、魔法のような存在なのだ。とはいえ、Macは高い。高性能なマシンを買えば20万程度にはなってしまう。すこしばかり貧しい私達も、スターバックスでドヤ顔くらいしたいものだ。
私が見た夢について
今から話すことは、すべて夢の話だ。Macのボディカラーは美しい銀色であり、断じて金色であってはならない。私は日常的に虚言癖があり、しばしば人の迷惑となっているようなので、今回もそのつもりで聞いて頂きたい。
深い霧の中を、一頭の獅子が歩く。
鬣は薄く禿げ上り、痩せこけた姿は幾分みすぼらしくも見えるが、当の本人は存外なんとも思っていないらしい。霧の中を静かに、しかし重々しく進んでいくその様子は、誇り高き山獅子として貫禄を存分に感じさせていた。山獅子とはいえども獅子であることに変わりなく、どうやら百獣の王としてこの里山に君臨しているようだ。
ここで私は一度夢から醒める。そして考えるのだ。「果たして鬣すらないようなただの獅子が、本当に百獣の王として相応しいのか?」と。ましてや山獅子。何度も反芻しても返ってくる答えは「否」であった。また、こうも思う。「あの貫禄と霧の中を歩くその造形の美しさ、これだけは確かである。あれは山獅子などではなく、私の見当違いだったのではないか。」などと考えているうちに、私はまた夢の中へと誘われていく。
時に残月、光冷ややかに、山獅子が岩壁に姿を見せる。荒涼とした岩壁には野草一つ茂ることもなく、周囲にはこの禿げ上がった獣がいるのみである。獣は、東の空に向かって吠える。
東雲も終わりの刻である。やがて地平線より朝の光が里山を照らし始め、照らされるのはこの山獅子とて同様である。山獅子の痩せこけた体を覆う体毛に、一気に光が差し込んでいく。反射した体毛の眩しさに、思わず顔を背ける。
気がつくと、私が先日組み上げた金色の機械に獅子が鎮座していた。私は驚きながらも、その状況を驚くほど自然に受け入れており、このようなことを考えていた。「そうか、この獅子は山獅子であると同時に、実のところ金獅子でもあったのだ。光りに照らされたその毛は、鬣の有無に関わらず何よりも美しい。金獅子こそが百獣の王たりえる存在なのだ。」
私はどうやら未だ夢の中にいるようだ。夢のなかに登場する山獅子について、具体的に語ろうと思う。
OSx86
さて、山獅子は如何にして私の元にやってきたか。OSx86については以下の通りだ。
OSx86を実践するためにお世話になったサイトがこちら。日本語の資料もなくはないが、ここが圧倒的に充実してる。Tonyさんの存在なくして山獅子を手懐けることは難しい。
Hardware
OSXを走らせるためには、特定のハードウェア構成が必要となる。インストール可能な構成や相性については英語ドキュメントになるがTonyさんのブログに任せるとして、私の環境では以下の通りである。
- Intel core-i7 3770K
- nvidia GEFORCE GT640
- Patriot Memory DDR3 PC3-12800 8GB × 4
- Intel SSD 335SEROES 240GB
- GIGABYTE B75M-D3H
ここで重要なのは、CPUとグラフィックボード、マザーボードである。逆に言えば、この3つさえ対応するものを揃えれば基本的にインストール不可、ということはない。このあたりもTonyさんの記事を熟読のこと。
MountainLionのインストール
大まかなフローとしては、普通にappstoreで山獅子を購入、USBメモリにUniBeastおよびMultiBeastというアプリケーションを入れ、MountainLionをUSBに入れる。BIOS設定でUSBブートを行い、MountainLionをインストールする、といった流れになる。とはいえ、ご察しの通りそんなにうまくいくはずがない。UniBeastがbootdiscの用意を、MultiBeastがドライバの用意をしてくれる。
- Purchase the OS X Mountain Lion Application from the Mac App Store
- 適当なMacを用意するか誰かから借りるかしてappstoreにログイン、普通に買いましょう
- Prepare a UniBeast USB flash drive
- USBメモリは8GBか16GBが望ましい。UniBeastはtonyさんのところにいってもらってくる
- Tonyさんのサイトで会員登録が必要
- UniBeastを起動するとよしなにやってくれる
- USBメモリは8GBか16GBが望ましい。UniBeastはtonyさんのところにいってもらってくる
- Install OS X Mountain Lion
- Install the bootloader and drivers using MultiBeast
- UniBeastおよび山獅子を入れたUSBには、同時にMultiBeastというアプリケーションも入れておく必要がある。これもTonyさんのところから頂いておく
ハマりどころ
さて、無事OSXのインストールが終了したと思いきや、戦いはこれからである。そもそもハードウェアが謹製のマシンと全然違うのだから、サウンドやネットワークなど、とにかくデバイスにまつわる機能が使えない。そこで役に立つのがMultiBeastなのだが、こいつが厄介だった。奨励されるドライバを入れて再起動しても、WhiteScreenになってしまいOSXが起動しない、諦めてOSを一から再インストールという手順を10回近く行った。とはいえ、MultiBeastのお陰でサウンド、ネットワーク、グラフィクスに関わるドライバは問題なくインストールできたことは併記しておく。
問題になったのはスリープである。デバイスをインストールしても、スリープをしたら最後、二度と目覚めない状態だったのだ。
スリープを実現する
起動やスリープは、OSがBIOSに含まれるDSDTテーブルを読むことで実現している。OSXの場合、特定のハードウェア構成で起動することを前提としているので問題ないのだが、今回行うOSx86では大問題である。OSが読むハードウェア情報が間違っているためにWhiteScreenや起動失敗といったことが起こる。Linuxでも起きそうだと思っていたら、案の定あるらしい。
DSDTテーブルの取得方法はMacのコマンドやUbuntuのLiveCDを使う方法などがあるが、今回はDSDTSEというツールを用いた。正常起動、デバイスの認識、スリープの実現を目指すためには、結局のところ以下の手順が正解だった。
- スリープをめざす順序
- multibeastでドライバをいくつか入れる
- サウンド、ネットワーク、ブートローダ
- 最後にDSDTSEをつかってextractしたDSDTテーブルをインストール明示的に示す
- multibeastのuserDSDTが間違っているため
- ブート時のconfigファイルである/Extra/org.chameleon.Boot.plitを変更
- multibeastでドライバをいくつか入れる
<key>GraphicsEnabler</key> <string>no</string>
- ここまでの間に再起動してはいけない
一連の手順を踏まえた上で再起動を行い、正常起動ができたらほとんど安心していい。ドライバの名称や画面などは以下に貼ったスクリーンショットを参照のこと。
終わり
これで私は獅子を手懐けることに成功した。備忘録およびこれを読むどなたかの参考になれば幸いだが、あくまで夢の話であって、私の妄言に拠っていることだけは留意していただきたい。
PCを新調しました
もはや1年以上「PCがほしい、PCがほしい」とツイートし続けてきたが、今回ついに新しいPCを新調する運びとなった。今までMacBook(late 2006)という化石のようなPCで戦ってきたわけだけれど、開発者の端くれとしていつまでも貧弱なハードウェア構成のマシンを使うわけにはいかない(白目 加えて、学生時代と異なりPCを外に持っていく機会もほとんどないので、大きなディスプレイに見合ったパワフルなデスクトップPCを1から構築することにした。私が出す要件は以下の通りである。
基本方針
高性能なモデルがほしい
- CPU
- 私のMacBookは、一時代を築いたintel Core 2 duoだった。当時はあまりの速さに感動していたが(その前はamdの廉価モデルの何かを使っていた記憶)、時代の進歩とは残酷なもので、Sandy世代のCPUを搭載した職場のMacBookProを常用するようになってからは不満が募るようになってしまった。どうせ買い換えるのならばIvy世代の最新CPUにしようと思う。
- メモリ
- グラフィクス
- ストレージ
極端な大型化を避ける
- 「なんなんだ、これは...」
- 先日まで、自作PCを組むべきか、MacMiniの上位モデルを買うべきか悩んでいた程度には小型のマシンがほしいと考えていた(しかも新型のMacMiniなら2.6GHzのクアッドcore-i7が78000円とMacにしてはそれほど高くない)。多少の大きさは構わないのだが、秋葉原電気街諸店舗における自作PCのケースコーナーに溢れているような、独特のカルチャーをもった、厨二病というか、「これが俺のマシンや!どやぁ!(LEDで光を帯びたファン「ファンファン」)」みたいなセンスには我慢ならなかったし、何よりあの灯油ケースみたいなサイズが許せない。僕の家は狭いし、ものが多い。自作するのなら、大きさはそこそこに、値段は多少かかってもいいので圧倒的にハイセンスなケースを探すべきだと判断した。
FYI : http://blog-imgs-46.fc2.com/m/o/t/motobuyer45/cosmos22.jpg
- 拡張性や排熱
予算はできれば10万以下
- 悪くないスペックのMacMiniが8万(カスタマイズ入れて10万)で買えるのにわざわざ自作するとなったら、それを超えるスペックで10万以下に抑えたい。とはいえ、今回はコンピュータの勉強的側面もあったのでそこまで気にしない。
ハードウェア構成
お待ちかね、今回このようなわがままな要望を満たす運びとなったハードウェア構成が以下のとおりだ。費用も合わせて明記しておく
- CPU : i7 3770k
- GPU : nvidia GEFORCE GT640
- MSI \6,480
- RAM : 32GB
- Patriot Memory DDR3 PC3-12800 8GB × 4 \9,940
- Storage : SSD240GB + HDD300GB
- OS : windows8 + fuckOSX
- Motherboard : GIGABYTE micro-ATX
- GIGABYTE B75M-D3H \5,980
- PowerSupplyUnit : 玄人志向
- KRPW-P2-650W/85+ \6,480
- ODD
- 謎に満ちた光学ドライブ \1,744
- Case
- abee AS Enclosure ASE-LP210 \19,980
- Trackpad
- Apple MagicTrackpad \6,800
- その他
合計して11~12万程度になるかと思う。ケースが2番目に高い買い物になっている。無駄にケースにお金をかけているし、windowsOSやtrackpadまで購入しているので少し足がでてしまったが、全く問題ない。
ちなみに、これが今まで使ってきたMacBookの技術仕様だ。 http://support.apple.com/kb/SP23?viewlocale=ja_JP&locale=ja_JP
知人の世話になりつつ、実際に組んでみる。マシンとして組む過程や、何度もBIOSを確かめることでコンピュータがどのように動いているのか少なからず理解できたように思う。問題なく起動することができたが、今回windows8はHDDにインストールした。HDDだから多少の遅さがあるとはいえ、動作している。今のところ、音や熱が問題になっている感覚はない。非常に静かで、安定した様子を見せている。
出来上がり
ケース
これが私の探し求めていた、自作PC界隈の文化とは一線を画すセンスフルなケース。黒やシルバーの先行く、ゴールド。金は上質の象徴だ。ケースから黄金の金が鳴っているのが写真で伝えられないのが遺憾である。
全容。完成されたボックスの造形である。これがほんとの、黄金比や!
オーディオ機器としての存在感もばっちりである。これを使うユーザーはまったく新しいGoldExperienceに打ちのめされること請け合いだ。
音・映像
- オーディオ機器に関しては、ソニーの標準サイズのコンポを出力として利用している。音質に関しては既に10年以上前からあるものなのでなんともいえないが、そのあたりの数千円程度のPCステレオよりはよいと思われる。
- 映像に関しては、DELLの23インチフルHDをそのまま利用している。補助ディスプレイとして、32インチの東芝REGZAをHDMIで繋いでいる。以外と問題なく表示できており、GPUのお陰か動画も美しく描画されるので満足である。
スコア
さて、今回組んだPCがどれ程のパフォーマンスを持つのか、試しにテストしてみようと思う。Geekbench2というアプリケーションを用いて測定してみた。測定結果は以下の通りだが、これは32bit版として測っているので、実際にはもっとスコアが高く出るような気もする。
ちなみに往年のMacBookのスコアはこちら
新しいPCが64bitであることを加味すると、ほとんど5倍かそれ以上の速度にはなっているようです。メモリが32GBある安心感が素晴らしい。動画を見ながらIDEどころか、動画を見ながら動画が見れるのではないでしょうか!これでHuluドリブンな開発ができますね!(白
まとめ
- ぱそこん組むって楽しいですね
- 積極的に厨二病になろう!
- 黄金のケースこそ至高
- OSまわりの設定は次エントリ
- 時代の進歩とは
- 6年間使った黒いMacBookには愛着がある
”To be C or not to be C. That is the question.”
半年くらい経ったのでそこそこにまとめる
身につけたこと/今後の展望
身につけたこと、とはいえどれも中途半端だし、自信を持って「できます」といえるレベルは程遠い。上限が見えないからこそ面白くはあるんだけど、みんなどこまでやって「できます」って言えるようになるんだろう...
- UNIX/Linuxの基本的な操作
- 簡単なシェルスクリプトくらいなら
- コンピュータに対する理解が甘いので、もっといじる
- Webアプリケーションへの理解
- テスト
- あまり学べていない
- JavaでSelenium2を使った自動テストをやった程度
- HTML/CSS
- 卒なく組めるようにはなった
- classやname,idの付け方が下手くそ
- CSSの修正にめちゃくちゃ時間がかかる
- floatやalign属性への理解不足
- PHP/template engine
- まあまあ書けるようにはなった
- オブジェクト指向関連の処理系についてまだ良くわかっていない点が多いので、1つずつ潰していく
- javascript
- フリーダム言語なのでとりあえず動くようにはできるけど、まだ全然言語仕様についての理解が足りない
- 言語仕様だけでなく、DOM操作、ライブラリについても学ぶ必要がある
- これらを切り分けて理解していくのが大事
- Database
超ざっくりかつカテゴライズ適当過ぎるけど、こんなものだろうか。んで、次。
今後身につけたいこと
今まで学んできたことの理解を更に深めることに加え、いわゆるスクリプト言語とは別のものをちゃんと学んでおきたいな、と思っている。なぜなら実際にプログラムを実行するコンピュータについてや、プログラムが動く仕組みなどへの理解が足りていないからだ。限られたリソースの中で厳格なコードによって処理が行われる一連の動作、ミニマルな形で学ぶことができる低級言語がいいと思っている(これとは別だが、関数型言語も学びたい)。あと、普段使っているフレームワークの内部実装などを積極的に調べて、コードをちゃんと読む機会を増やしたい。というわけで、今は「新しいサービスを世の中に出したい!」みたいな意識が全然なくて、こんなに意識が低くてよいものかと若干不安ではある。
- 今までの理解を更に深める
- コンピュータ・ネットワーク・セキュリティ全般
- 「なぜ動くのか」シリーズを片っ端から読むといいかもしれない
- 「効率的なWebアプリ~」とかっていう本とか
- UNIX/Linux
- PHP/HTML/CSS/javascript
- 今後も経験積んでいきましょう
- 公式ドキュメントに目を通すようにしましょう
- パーフェクトjavascript読みましょう
- コンピュータ・ネットワーク・セキュリティ全般
- 新しく勉強したいこと
- なにか言語1つ
- 低級言語
- 関数型言語
- コードを読む機会を増やす
- その他
だらだら羅列したものの、今はこれに尽きる。
「C言語を学ぶべきか、死ぬべきか。それが問題だ。」
『フカシギの数え方』 おねえさんといっしょ! PHPで数えてみよう!
おねぇさぁぁぁぁぁん! 日本科学未来館のアニメに狂気が宿っていると話題に
http://nlab.itmedia.co.jp/nl/articles/1209/11/news104.html -ねとらぼ
日本科学未来館のアニメがあまりにも面白かったので触発されて書いてみました。間違ってる可能性も大いにありますので、その辺生暖かい目で見てください。英語で探せばもっといいコードが出てくると思います。
class Explode { private $x = 0; private $y = 0; private $size = 0; private $dest = 0; private $line = array(); function __construct($arg) { $this->size = (int)$arg; $this->x = (int)$arg - 1; $this->y = (int)$arg - 1; for ($i = 0; $i < $this->size; $i++) { for ($j = 0; $j < $this->size; $j++) { $this->line[$i][$j] = 0; } } } function setGoOn($x, $y) { $this->line[$x][$y] = 1; } function walk($x, $y) { $this->line[$x][$y] = 1; if ($x == $this->x && $y == $this->y) { $this->dest++; } else { if ($x < $this->size -1 && $this->line[$x + 1][$y] === 0) { $this->walk($x + 1, $y); } if ($x > 0 && $y < $this->size -1 && $y != 0 && $this->line[$x - 1][$y] === 0) { $this->walk($x - 1, $y); } if ($y < $this->size - 1 && $this->line[$x][$y + 1] == 0) { $this->walk($x, $y + 1); } if ($y > 0 && $x > 0 && $x < $this->size - 1 && $this->line[$x][$y - 1] === 0) { $this->walk($x, $y - 1); } } $this->line[$x][$y] = 0; } function getCount() { return $this->dest; } } $arg = intval($argv[1]) + 1; $oneisan = new Explode($arg); $oneisan->setGoOn(0, 0); $oneisan->walk(1, 0); echo $oneisan->getCount() * 2;
実行してみる。
ちゃんとおねえさんの数えた通りの数字になっていますね!
ただ、おねえさんと違って私たちは手近なところにスーパーコンピューターなんてあるはずがないので5x5か6x6が限界だと思います(5マスのときは20秒くらいかかりました)。
さもないと「あれから25万年がたった・・・」なんて話になるので、実行はお気をつけて!
githubに置いときます