2010年10月18日月曜日

情報セキュリティスペシャリスト試験に行ってきた

10月17日に、平成22年度秋期の情報処理技術者試験があったので、またもや受けてきた。
朝4時に起きて山形会場まで車を走らせ、そこから夕方までずっと試験という、毎度のことながら結構ツラい日程。



前回(22年度春期)に受けた応用情報技術者試験(レベル3)が、午前76.25点、午後58.00点で午後2点足らずという絶妙な具合に不合格だったので、今回は思い切ってそれの上位である高度(レベル4)試験を受験することに。

秋に受験できる高度試験は、ITストラテジスト、システムアーキテクト、ネットワークスペシャリスト、情報セキュリティスペシャリスト、ITサービスマネージャの5つ。
ITストラテジスト、システムアーキテクト、ITサービスマネージャは実務が物凄く絡んでくる上に、午後II試験が論述式でかなり難しいので無理、ネットワークスペシャリストはイマイチ低層の部分が理解出来ていないので避け、一番身近で必要でそれなりに理解できている、情報セキュリティスペシャリストを受験することにした。

上に書いたこと以外にも、はちゅねどっとねっとの運用はほとんど自宅サーバで行なっているので、そのセキュリティ面は全て自分自身が管理しなければならず、その為に一定レベルの知識を揃えておくいい機会になる、というのもあった。



高度試験は、多岐選択式(四肢択一)の午前I(高度共通)、午前II(専門)、記述式の午後I、午後IIとあり、応用情報を取得しているか、一度高度試験を受験し、午前Iを通過していれば、2年間は午前Iが免除になる。
私の場合、春の応用情報で見事に落ちたので、午前Iから全ての試験を受験しなければならなかった。

自己採点結果は、
午前I … 30問中18問正解でギリギリ60点…?
午前II … 25問中21問正解で余裕

午後の手応えとしては、
午後I … G攻撃ワロタ
午後II … ('A`)

ということで、午前Iと午後II次第な感じだろうか…
午後IのG攻撃はどう見てもGumblarさんの問題で、ニヤニヤしながら問題を解いていた。
また、前日に何故か午後対策として初めて触ったperlの問題が全く出ず、思いっきりヤマが外れて泣くハメに。



大学3年の春に初級システムアドミニストレータ、秋に基本情報技術者、4年の春に応用情報技術者、秋に情報セキュリティスペシャリストと、順に情報処理技術者試験を受験してきた訳だが、「よくここまでこれたなぁ…」と思う。
大学自体、情報系でもなく普通の文系大学で、コンピュータ専門に勉強しようとか考えて入った訳でもない。大学2年になるまでプログラミングもしたことは無かったし、ルータの設定すら分からない状態だった。
そんな状態から2年半ぐらいでここまでこれたのだから、やる気出せば結構できるもんなんだなぁと思える。


まぁこれが終着点ってワケでは全く無いので、これからもずーっと続く。
はちゅねさん達と共に。

情報処理推進機構: 情報処理技術者試験
http://www.jitec.jp/

2010年9月30日木曜日

SQLite3-RubyでのSQL文のexecuteについて

よく考えずに適当にSQL文をexecuteするだけでそれなりのものは作れてしまうので、私の場合、ロクに考えずに作ってしまいがちになる。しかし、それなりに大きなもの、重要なものを作ろうとするとそういう訳にはいかないので、executeの基本的な使い方を纏めてみる。


今回サンプルとして利用するテーブルは以下の通り。

db = SQLite3::Database.new("test.db")
db.execute(<<EOS
CREATE TABLE IF NOT EXISTS Vocaloid
(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name CHAR UNIQUE NOT NULL,
Ver INTEGER NOT NULL
);
EOS
)



普通にexecuteする


毎度SQL文を組み立て、executeする。
SQLインジェクション対策を全て手動で行わなければならない為、非効率。

db.execute(<<EOS
INSERT INTO Vocaloid
(Name, Ver)
VALUES ('miku', 2 )

)



引数を渡し、executeする


引数に?に対応する値を順番に渡す。
quote等も自動的に処理してくれる模様。

sql = <<EOS
INSERT INTO Vocaloid
(Name, Ver )
VALUES (?, ?)
EOS
db.execute(sql, "miku", 2)



ハッシュ引数を渡し、executeする



sql = <<EOS
INSERT INTO Vocaloid
(Name, Ver )
VALUES (:Name, :Ver)
EOS
db.execute(sql, :Name => "miku", :Ver => 2)



prepareを利用する


SQL文をテンプレートとして用意しておいて、execute時に変数として渡す。

pre = db.prepare(<<EOS
INSERT INTO Vocaloid
(Name, Ver)
VALUES (?, ? )

)

pre.execute("miku", 2)
pre.execute("rin", 2)
pre.execute("meiko", 1)



prepareでハッシュ引数を使う



pre = db.prepare(<<EOS
INSERT INTO Vocaloid
(Name, Ver)
VALUES (:Name, :Ver)
EOS
)

pre.execute(:Name=>"miku", :Ver=>2)
pre.execute(:Name=>"rin", :Ver=>2)
pre.execute(:Name=>"meiko", :Ver=>1)



・参考

http://sqlite-ruby.rubyforge.org/sqlite3/faq.html


http://sqlite-ruby.rubyforge.org/classes/SQLite/Database.html

2010年9月8日水曜日

みくった〜♪のWindows版をMinGWでビルドしてみた

みくった〜♪は、全てのミク廃、そしてTwitter中毒者へ贈る、至高のTwitter Clientを目指すTwitter Client…として@toshi_a氏が開発しているソフトウェアである。

みくった〜♪

主にLinux向けとして開発されているようだが、初公開の時点で「Windows版無いの(´・ω・`)?」と言われたように、Windows版の需要がやはりそれなりに存在する。
そこで、MinGW使ってRuby/GTK2環境を整え、Windowsでもみくった〜♪を動作させることはできないものか?と考え、実際にやってみた。

※ただ使ってみたいだけ、という方はみくった〜♪ for Windowsのページみくった〜♪ for Windows 毎日0,12時に自動ビルドされるバージョンからどうぞ。



ビルドに必要なソフトウェアやライブラリは以下の通り。
MinGW GCC 4.5.0
ftp://ftp.jaist.ac.jp/pub/sourceforge/m/project/mi/mingw/Automated%20MinGW%20Installer/mingw-get-inst/mingw-get-inst-20100831/mingw-get-inst-20100831.exe

ruby 1.8.7-p302
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.7-p302.tar.bz2

ruby-gtk2-0.19.4
http://ftp.jaist.ac.jp/pub/sourceforge/r/project/ru/ruby-gnome2/ruby-gnome2/ruby-gnome2-0.19.4/ruby-gtk2-0.19.4.tar.gz

ruby-hmac-0.3
http://deisui.org/~ueno/ruby/hmac.html
http://deisui.org/~ueno/ruby/ruby-hmac-0.3.tar.gz

iconv
ftp://ftp.gnu.org/gnu/libiconv/libiconv-1.13.1.tar.gz

GTK+
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.20/gtk+-bundle_2.20.0-20100406_win32.zip

Win32 OpenSSL
http://www.slproweb.com/products/Win32OpenSSL.html
http://www.slproweb.com/download/Win32OpenSSL-0_9_8o.exe

Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86) OpenSSL用
http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=ja

可能な限りソースからビルドするようにしたが、OpenSSLとGTK+は面倒だったので、とりあえずWindows用バイナリを利用することにした。…OpenSSLをMinGWでビルドすれば、MSVC++ランタイム要らなくなるのだが…。



MinGWによるビルド環境の構築


以前はMinGW(コンパイラ)とMSYS(サブシステム)を個別に用意し、セットアップする必要があったが、現在はmingw-get-instパッケージに纏められた模様。これをダウンロードし、普通のソフトウェアのインストーラと同じようにウィザードを進めていくだけでビルド環境が整う。
デフォルトでは、Windowsのパス変数もMSYSのパス変数として登録されてしまい、混乱の原因となるので、PATH変数を変更しておく。

$ PATH="/mingw/bin:/usr/local/bin:/bin"




iconvのビルド


一番最初にiconvをビルドする。といっても、普通に

$ ./configure --prefix=/mingw
$ make
$ make install

のような感じでおk。
本当なら/usr/localあたりにprefixを置いて、そこにインストールすべきな筈なのだが、私のCFLAGSやLDFLAGSの認識がおかしいのか、rubyのiconvライブラリのextconf.rbが/usr/localに置いたiconvを見つけられないため、諦めて/mingwにprefixを置く。



必要なライブラリの展開


GTK+のアーカイブを解凍し、そのまま全て/mingwに展開する。
OpenSSLは、インストーラを実行しインストールした先にあるディレクトリを、GTK+同様に/mingwに展開する。
また、OpenSSLを利用するために必要なMicrosoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)もインストールしておく。



Rubyのビルド


いつも通りRubyをビルドする。

$ ./configure --prefix=/ruby
$ make
$ make install

prefixを/rubyにしたが、make installする際にMSYSの/を飛び越えるため(コンパイルしたRubyがインストールに使用されるから?)、Windows側の\rubyにインストールされるので注意が必要。
そして、Windows側にインストールされたRubyを、MinGWの/usr/localあたりに移動しておく。



Ruby/GTK2のビルド


Ruby/GTK2のアーカイブを解凍し、extconf.rbを先程作成したRubyで実行する。

$ /usr/local/bin/ruby extconf.rb

そして後はmake、make installするだけの筈なのだが、MinGWでRuby/GTK2をビルドすると何故か毎度gtkのビルドでコケる。
どうやらこれからビルドされる筈のgtk2.soを、ビルド前にリンクしようとするかららしい。
そこで、gtkのMakefileを編集する。
何らかのエディタでgtk/src/Makefileを開き、LIBS = $(LIBRUBYARG_SHARED)...で始まる行の、-lgtk2を削除。

後はいつも通り。

$ make
$ make install


この時点で、Ruby/GTK2自体の開発/実行環境は整っていることになる。
MSYSでの作業はここで終了。



必要なファイルのみを纏め、最小限のRuby/GTK実行環境を作成


MSYSの/usr/localにはRuby/GTKの実行環境が整っている(ライブラリは足りないが)ので、これを適当なディレクトリにコピーし、rubyディレクトリとする。
rubyディレクトリのbinに、iconv、OpenSSL、GTK+の*.dllをコピー。
そして、RubyのLOAD_PATHのどこかにruby-hmacを展開。
後はみくった〜♪をダウンロードして展開、普通に起動できれば、みくった〜♪実行環境完成となる。



mikutter.exeを作成


毎度コマンドラインでruby mikutter.rbとしたり、バッチファイルを実行するのはどことなく落ち着かない。
また、Rubyの環境すべてがrubyディレクトリに入っているので、配布するにしてもかなりのサイズになってしまう。
そこで、更に必要なファイルだけを纏め、Windowsの実行ファイル形式で配布する形をとる。
exeファイル化には、exerbを利用する。
exerbの使用方法は、
・mkexy mikutter.rbでレシピファイルmikutter.exyを自動生成
・exerb mikutter.exyとすると、mikutter.exeが作成される
という感じである。
ここで作成されたバイナリは、Ruby環境無しで動作するものなので、あとはmikutterのディレクトリ階層とdllの配置をするだけ。

exerbの詳しい使用方法、レシピファイルの書式については、
公式ページ http://exerb.sourceforge.jp/
やmikutter for Windows付属のmikutter.exyを参照して欲しい。



みくった〜♪ 本家
http://toshia.dip.jp/
http://mikutter.d.hachune.net/

みくった〜♪ for Windowsのページ
http://append.hachune.net/mikutter.html

みくった〜♪ for Windows 毎日0,12時に自動ビルドされるバージョン
http://file.hachune.net/mikutter/

2010年8月31日火曜日

今日ははつねさんの誕生日!

ということで、hachune.netとしてもなにかやらないといけないな、と。

それで完成したのがはちゅねドメインサービス!

簡単に言えば、Dynamic DNSとURL転送を切り替えながら使えるホスト名提供サービス、…ってところだろうか。
negi.d.hachune.netみたいなドメイン名を使ってボカロなサイト運営してみたい!って方が居ましたら、どんどん使ってあげてね!


はちゅねドメインサービス
http://www.hachune.net/domain.html


もっと分かりやすく面白い名前、募集中w

2010年7月7日水曜日

Debian LennyなMac MiniをPulseAudioサーバにする

Software Design 6月号やUbuntu Weekly Recipe 第106回 PulseAudioでリモートスピーカを使うで、Ubuntuでのスピーカーサーバの作り方が解説されていた。
UbuntuでできることがDebianでできない筈がねぇ!…ということで、Debianで挑戦してみた。

サーバ側


・alsa関連を入れる
# aptitude install alsa-utils


・PulseAudioとZeroConfモジュールを入れる
かなりパッケージ数が多いので注意。
# aptitude install pulseaudio pulseaudio-module-zeroconf


・サーバ起動時にPulseAudioデーモンが実行されるように設定する
/etc/default/pulseaudioのPULSEAUDIO_SYSTEM_START=0を1に変更。


・/etc/pulse/default.paを変更する

#load-module module-native-protocol-tcp
#load-module module-zeroconf-publish

以上の部分を、以下のように変更する。
auth-ip-acl=10.39.39.0/24は、サーバへのアクセスを許可するサブネットを指定する。

load-module module-native-protocol-tcp auth-ip-acl=10.39.39.0/24
load-module module-zeroconf-publish



・PulseAudioデーモンを起動する
# /etc/init.d/pulseaudio start


クライアント側


・paprefsをインストール
# aptitude install paprefs


・paprefsを起動し、Make disconverable PulseAudio network sound devices available locallyのチェックをOnにする


・「サウンドの設定」を開き、「出力」をpulse@サーバホスト名に設定する



後は、MPlayerやら何やらで再生して、サーバ側から音が出れば成功。
なかなか認識してくれない場合は、サーバをrebootしてみるのも手かもしれない。

2010年6月30日水曜日

RubyのYAMLライブラリで2バイト文字をそのまま扱う

RubyのYAMLライブラリでは、標準では日本語などの2バイト文字列をバイナリとして扱うようになっている。しかし、これでは人間が直接修正するのが非常に面倒である。

技術評論社のYAML解説ページには、Rubyのソースにパッチを当てビルドする方法や、ya2yamlを使用する方法が書いてあった。しかし、パッチを当てた環境をすべてに適用するのは非常に面倒であり、ya2yamlについては標準ライブラリではない上に、少々遅いという問題がある。

そこで、どうにかする方法はないものかとYAMLのソースを眺めていたところ、以下の方法であっさり解決してしまった。



#!/usr/bin/env ruby
# -*- encoding: utf-8 -*-

require "yaml"
require "yaml/encoding"

# String.is_binary_data?で必ずfalseを返すように書き換える
class String
def is_binary_data?
return false
end
end

data = {"はつね"=>"みく", "はちゅね"=>"みく", "かがみね"=>"りん・れん", "めぐりね"=>"るか"}

# 通常どおり表示
puts "Escape:"
puts yaml = YAML.dump(data)

# アンエスケープして表示
puts "Unescape:"
puts yaml = YAML.unescape(yaml)


一度エスケープされたものをまた戻すという、面倒なことになっているが、ソース修正するよりマシかな…と。
これで、YAMLで書き出して手動で編集…なんてことがやりやすくなるかもしれない。

2010年6月3日木曜日

RubyでWebサーバを作る(ベーシック認証/ダイジェスト認証)

WEBrickでベーシック認証を行うには、以下のようにする。


#!/usr/ruby1.9/bin/ruby1.9
#-*- encoding: utf-8 -*-

require "webrick"

# HTTPServerを作成
httpd = WEBrick::HTTPServer.new(:Port => 3939)

# Basic認証の設定(引数にはパスワードファイルへのパスを渡す)
pswd = WEBrick::HTTPAuth::Htpasswd.new("dot.passwd")
pswd.set_passwd("mikubox", "miku", "mikumiku") #realm, user, passwd
auth = WEBrick::HTTPAuth::BasicAuth.new(:UserDB => pswd, :Realm => "mikubox")

# HTTPServerの/loginにBasic認証を設定
httpd.mount_proc("/login"){|req, res|
# 認証
auth.authenticate(req, res)
res.body = "<html><head><title>みくかわいいよみく</title></head><body><p>OK.</p></body></html>"
}

# INTシグナルでサーバを停止
trap("INT"){httpd.stop}
# サーバを開始
httpd.start()



ベーシック認証では、パスワードが簡単に復号可能な状態でネットワーク上を流れるため、重要なものに利用するのは非常に危険。
そこで、ダイジェスト認証を利用する。


#!/usr/ruby1.9/bin/ruby1.9
#-*- encoding: utf-8 -*-

require "webrick"

# HTTPServerを作成
httpd = WEBrick::HTTPServer.new(:Port => 3939)

# ダイジェスト認証の設定(引数にはダイジェスト認証用のデータベースのパスを渡す)
pswd = WEBrick::HTTPAuth::Htdigest.new("dot.digest")
if pswd.get_passwd("mikubox", "miku", false) == nil
pswd.set_passwd("mikubox", "miku", "mikumiku") # realm, user, passwd
pswd.flush # ファイルに書き込む
end
auth = WEBrick::HTTPAuth::DigestAuth.new(:UserDB => pswd, :Realm => "mikubox")

# HTTPServerの/loginにダイジェスト認証を設定
httpd.mount_proc("/login"){|req, res|
# 認証
auth.authenticate(req, res)
res.body = "<html><head><title>みくかわいいよみく</title></head><body><p>OK.</p></body></html>"
}

trap("INT"){httpd.stop}
httpd.start()



どちらも比較的簡単に認証を実現することができた。
ベーシック認証はHTTPAuth::HtpasswdとHTTPAuth::BasicAuth、
ダイジェスト認証はHTTPAuth::HtdigestとHTTPAuth::DigestAuthと覚えておけば良いかと思う。



※ 追記
もっと簡単にベーシック認証を行う方法があった。

#!/usr/ruby1.9/bin/ruby1.9
#-*- encoding: utf-8 -*-
require "webrick"

httpd = WEBrick::HTTPServer.new(:Port => 3939)
httpd.mount_proc('/login') {|req, res|
WEBrick::HTTPAuth.basic_auth(req, res, "mikubox") {|user, pass|
user == 'miku' && pass == 'mikumiku'
}
res.body = "<html><head><title>みくかわいいよみく</title></head><body><p>OK.</p></body>
</html>"
}
trap("INT"){httpd.stop}
httpd.start