銀色うつ時間

思い出すたび何か胸につっかえてるだけ

ChefDevelopmentKit(ChefDK)入れてみた

chefを使ってみたいのだが

最近chefの勉強を始めたのですが、cookbookだとかrecipeだとか言う以前に環境構築するのに手間取って、意外と時間がかかってしまった。特にknife-soloberkshelfは依存ライブラリやrubyのバージョン関連で上手く行かず、一度環境を作り直すことになったりした。非rubyistでrbenvだとかgemだとかなんとなく適当に入ってる、みたいな人は同じような経験をした人が多いと思う。

Chef Development Kit (ChefDK)

インストールがまさに成功したときに見つけたのがこれ、もう1日早く知りたかった。。。

http://www.getchef.com/downloads/chef-dk

chef-dkの名の通り主要なものがだいたい入ったパッケージで、普通にインストールするだけでchefだのknifeだのberkshelfだのがまとめて入る。

Installation

上記ページからダウンロードしてインストールするだけ。macなら/opt/chefdkに一式追加されている。homebrew-caskも使えるっぽい。デフォルトだとsudo権限が必要なので、必要に応じてPermissionは変更する。chefコマンドやknifeコマンドなどは/usr/bin/シンボリックリンクが貼られている。

Settings

ChefDKのシステムを利用する場合はchefコマンドを利用する。knife-soloのインストールは以下。

$ chef gem install knife-solo
$ ~/.chefdk/gem/ruby/2.1.0/bin

上手くいかない場合、PATHを通す必要があるかも。

githubが設定は詳しい。 https://github.com/opscode/chef-dk

ChefDKの環境をデフォルトで利用する場合、以下のPATHを追加する。既存のruby環境の上に来る。

$ /opt/chefdk/embedded/bin
$ ~/.chefdk/gem/ruby/2.1.0/bin

まとめ

初学者が悩むことなく簡単に実行環境を構築できる、という点では非常に優れているし、アップデートで毎回心配することがないのも素晴らしい。「chefの環境構築はここからスタート」でも個人的にはよいと思う。

※残念ながらwindowsはcomming soon。最も待望していると思われるwindows勢の方は首を長くして待つとよさそうです。

ディレクトリ内の特定ファイルをソートして先頭のn件取得したい

詰まったのでメモ。

特定ファイルを削除

.
+-- hoge
       +-- foo3.txt
       +-- foo2.txt
       +-- foo1.tx
       +-- bar3.sh
       +-- bar2.sh
       +-- bar1.sh

こんな感じのディレクトリを想定。 ここから

  • .shファイルのみソートして
  • フルパスで
  • 先頭の2件のみ取得して
  • 削除したい

以下のようなコマンドで実現できる。

DIR=`pwd`
/bin/ls -A ${DIR}/*sh | awk '{print("'${DIR}'"$1)}' | sort | head - 2 | xargs rm

重要なのは以下の事柄。

  • rcファイルでコマンドにオプション付きのaliasを設定している場合にデフォルトだと競合してしまうことがある
  • フルパスでコマンドを記述するか、\lsのようにバッククォートを使う
  • lsの-Aオプションで...のディレクトリを除外できる
  • awkコマンドでシェル変数を展開したい場合は、シングルクォートの外に記述する(少々泥臭いのでfind使ったほうが健全かもしれない。また、パスを環境変数に入れるのが少々駄目っぽいのでやはりfindがよさそう)

おまけ

末尾からの件数を出力する場合は、tailコマンドの-nオプションが便利だ。tail -n 5で末尾から5行分出力してくれる。また、+10といったオプションで先頭10行目から末尾まで出力するすることもできる。例えば、10件中先頭2件を残して削除したい場合は、以下のようにする。

LENGTH=`\ls -A | wc -l` # 10
\ls -A | tail +3 | xargs rm #3行目から出力しxargsに渡す

この手のシェルスクリプトは手を動かして覚えておくべき。

複数行ある文字列に重複がないかチェックする

テキスト操作のメモ。とあるファイルが以下のようであったとする。

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インジェクション
  • 概要

説明するまでもないと思うけど、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については以下の通りだ。

wikipedia http://ja.wikipedia.org/wiki/OSx86

OSx86を実践するためにお世話になったサイトがこちら。日本語の資料もなくはないが、ここが圧倒的に充実してる。Tonyさんの存在なくして山獅子を手懐けることは難しい。

http://tonymacx86.blogspot.jp/

Hardware

OSXを走らせるためには、特定のハードウェア構成が必要となる。インストール可能な構成や相性については英語ドキュメントになるがTonyさんのブログに任せるとして、私の環境では以下の通りである。

ここで重要なのは、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を起動するとよしなにやってくれる
  • Install OS X Mountain Lion
    • BIOSのSATAmodeをAHCIに変更
    • USBブートローダから起動
      • 新しくインストールしたいコンピュータでUSB起動をすることで、対応するハードウェアであればOSXのインストール画面が表示される
      • 対応しないハードウェアであれば、OSカーネルを読んで自分で書き換える必要があるだろう。とにかくググって英語のドキュメントを探し、自分と同じハードウェア構成の人間を探すしかない
  • 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を変更
<key>GraphicsEnabler</key>
<string>no</string>
    • ここまでの間に再起動してはいけない

一連の手順を踏まえた上で再起動を行い、正常起動ができたらほとんど安心していい。ドライバの名称や画面などは以下に貼ったスクリーンショットを参照のこと。

f:id:arerreee:20121113030442p:image:w360

f:id:arerreee:20121113030435p:image:w360

f:id:arerreee:20121113030427p:image:w360

終わり

これで私は獅子を手懐けることに成功した。備忘録およびこれを読むどなたかの参考になれば幸いだが、あくまで夢の話であって、私の妄言に拠っていることだけは留意していただきたい。