2010年12月31日金曜日

転職活動中です。



WEB屋さんに戻る(?)予定


某企業さんの1次面接に受かりました。嬉しい。
転職活動1社目なんですが、ここに入りたいなぁと思ってます。


勤務中の会社


社員数5桁の超まったり企業。
皮算用ですが、もし会社を定年まで勤め上げ、かつ会社の業績も今のままだとすると、退職金は2000万円以上は確実に貰えた。


なぜ辞めるの


最終製品に興味がなさすぎた。
製品・サービスの工程すべてに携わりたい。
開発スピードが遅い。
WEBが好き。自分は人が好きで、WEBは人が交わる大舞台だから。


安定生活を捨てるに至った思考


何日延命したいの?

1日8時間の時間を切り売りした分で、自分は何日分の将来を買えるのか。
今の8時間を充実したものにする方がよくないか。


いつか死ぬ

将来のことを考えると人間は保守的になりますが、「いつか死ぬ」という基本的なことを意識し始めると、
今この瞬間がとても大事だと思えてきて、未来のほうが霞み始めてきました。
いつかはすぐそこにあるかもしれない。


定年なんてヤダよ


いつまでだって面白い事、面白い人と絡んでいたい。





2010年12月25日土曜日

AnyEventでイベント駆動プログラミング



参考


AnyEventとPlackの社内勉強会資料
Perl 非同期プログラミング


イベント駆動とは


割り込み処理。


AnyEventとは


イベント駆動プログラム用モジュール。他のイベント駆動モジュールのラッパーとしても動作するので、これ1つで良いとか。まぁ、なんか争ってるみたいですが。


割り込み処理なので、マルチプロセスじゃないです。


AnyEvent vs AE


牧さんのスライドではスタイルが違うだけとあるけど、どっかのblogではAEのほうが速いとあった。
AEは短く書けるけど引数の順番覚えないといけないから、引数がハッシュのAnyEventを使うよ。


書いてみた



#instant_noodle.pl
use strict;
use AnyEvent::Util qw(fh_nonblocking);

fh_nonblocking( \*STDIN, 1 );


my $CPS_for_noodle = 0;

sub input_time_from_STDIN {
my $cv = AnyEvent->condvar;
my $w;

print "自然数を入力してください\n";
$w = AnyEvent->io(
fh => \*STDIN,
poll => 'r',
cb => sub {
undef $w;
my $line = <STDIN>;
$cv->send($line);
}
);
return $cv;
}

sub count_timer {
my $cv = AnyEvent->condvar;
my $w;
$w = AnyEvent->timer(
after => $CPS_for_noodle,
cb => sub {
print $CPS_for_noodle / 60, "分経ちました!\n";
undef $w;
$cv->send;

}
);
return $cv;
}


my $main_cv = AnyEvent->condvar;
{
my $cv = input_time_from_STDIN();
$cv->cb(
sub {
($CPS_for_noodle) = $_[0]->recv;
print "set ", $CPS_for_noodle / 60, " minutes\n\n";
print "出来たら呼ぶから、とりあえず机の上を片付けろ!\n";
$main_cv->send;
}
);

}
$main_cv->recv;

$main_cv = AnyEvent->condvar;
{
my $cv = count_timer($CPS_for_noodle);
$cv->cb(
sub {
print "\a";
print "ラーメンできたよ!\n";
$main_cv->send;
}
);

}
$main_cv->recv;



ださい



#毎回、このスタイルで書くのか・・・・
$main_cv = AnyEvent->condvar;
{
・・・・・・
}
$main_cv->recv;



とりあえず、他の人のソースをちゃんと読まないうちにゴリ押しで書くと
大変なことになりそうだと思いました。





2010年12月20日月曜日

さくらインターネットVPSを申し込んだよ



メモメモ。


はじめに


さくらのVPSのデフォルトでは、多くのデーモンを停止済みにしているほか、selinuxもdisabledとなっています。


VSPコントロールパネル


まず登録後に送られてくるアドレスから「VPSコントロールパネル」にいく。
「仮想サーバ操作」の起動をクリック。


次にマニュアルをクリックして、ちょっとお勉強にいく。
さくらのVPS OSセットアップ情報
ざっと眺める。


SELinuxってよく聞くけどなんだっけ?


セキュアOS機能



SELinuxは,各プロセスがアクセスできるリソース(この場合のリソースとは,個々のファイルやディレクトリ全体など)を制限し,本当に必要なリソースにだけアクセスできるようにする。例えば,Webサーバーの場合は,Webページにだけアクセスできるようにする。Sambaサーバーなら,Sambaの共有ファイルにだけアクセスできるようにするわけだ。そして,関係ないファイルへのアクセスは一切拒否するようにしておく。
(略)
プロセスのリソースへのアクセス制限は,OSレベルで強制されており,抜け道は無い。たとえroot権限で動作するプロセスであっても強制されるので,攻撃者にroot権限を奪取されても操作可能な範囲は限定される




パスワードログイン



$ ssh root@xx.xxx.xxx.xx
The authenticity of host 'xx.xxx.xxx.xx (xx.xxx.xxx.xx)' can't be established.<--- ~/.ssh/known_hosts に登録されていない
RSA key fingerprint is xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)? yes <--- 登録
Warning: Permanently added 'xx.xxx.xxx.xx' (RSA) to the list of known hosts.
root@xx.xxx.xxx.xx's password:



サーバにemacsをインストール



$sudo yum -y install emacs



デフォルトPortから変更


デフォルトのPort22は攻撃対象になり易いので変更。
サーバの/etc/ssh/sshd_configを編集



#Port 22
Port 10022

/etc/init.d/sshd restart


再起動後に有効。


公開鍵と秘密鍵の作成


パスワードログインは突破されやすいので、鍵を作成した後、パスワードログインを無効にする。


その前に公開鍵と秘密鍵の説明

・公開鍵 => Aさんがみんなにばら撒いた鍵
・秘密鍵 => Aさんしか作り方を知らない「宝箱」


Bさんの所に、Aさん(かも知れない人物)から宝箱が届いた時に、
Aさんが公開している鍵で開けることができたのなら、それは確かにAさんからきた宝箱だと証明されたことになる。


というわけで

先ほどのBさんがサーバで、Aさんがローカルです。
予め、ローカルで作成した公開鍵をサーバに渡しておいて、ローカルの秘密鍵(宝箱)でサーバにアクセスする。
これで、私はサーバさんが知っているユーザですよ、という証明となる。


鍵を作成

次のサイトをみて参考に設定。
CentOSをサーバーとして活用するための基本的な設定
ServersMan@VPS :: CentOS5.5 の設定
さくらVPSのsshによる鍵認証の設定
さくらの VPS 契約から作業環境を作るまでの覚書
404 Not Found



DSA方式で作成。
% ssh-keygen -b 1024 -t dsa
//ここでパスフレーズの入力を求められる。後で使用するので忘れないように。
% cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
% chmod 600 ~/.ssh/authorized_keys



作成した公開鍵authorized_keysをサーバにftpで送る


ftpの平文通信はまずいので他のを使う。
2つ選択肢があるが、今回はFTPSを使用してみる。
参考サイト
FTP, FTPS, SFTP
SFTPとFTPSの違い



  • SFTP

    • SSHで暗号化



  • FTPS

    • SSL/TSLで暗号化





ただし、その前にSElinuxを無効にしておく。


SElinuxを無効化


/etc/sysconfig/selinuxのSELINUX=enforceをSELINUX=disabledに。(と思ったらはじめから無効でした)



サーバにvsftpdのインストール

参考サイト
WordPress on CentOS vsftpの設定
FTPサーバ構築(vsftpd)- CentOSで自宅サーバ構築
vsftpによるFTPサーバの構築



$yum -y install vsftpd
/etc/vsftpd/vsftpd.confを編集
anonymous_enable=NO 匿名ユーザのログイン禁止
xferlog_enable=YES   
xferlog_std_format=NO
ascii_upload_enable=YES
ascii_download_enable=YES
use_localtime=YES
ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem サーバー証明書


本当はもっと設定するけど、とりあえずこれだけ。


vsftpdを起動。


$ service vsftpd start


以下のメッセージがでた・・・。



sftpd for vsftpd: 500 OOPS: SSL: cannot load RSA certificate


設定ファイルに記述した/etc/pki/tls/certs/vsftpd.pemがないか、pemはあるが、設定ファイルで指定していないかどちらか。
vsftpd.pemを作成



$cd /etc/pki/tls/certs/
$make vsftpd.pem


質問内容は単純に答える。


ファイルを転送する

sftpコマンドを使ったファイルの転送
ローカルにて、



$sftp -oPort=***** root@xx.xxx.xx.xxx
sftp> put authorized_keys .ssh<ENTER> サーバで.sshディレクトリ作成済みのこと



さぁ、sshでログイン。



Agent admitted failure to sign using the key.


ぐは、すいません。



$ssh-add ~/.ssh/id_dsa
Enter passphrase for /home/**/.ssh/id_dsa: #鍵を作成した時に入力したフレーズ

$ssh root@59.106.183.58 -p 10022


sshでのログインOK


パスワードログインを禁止



/etc/ssh/sshd_configを編集
PermitRootLogin without-password

sshd再起動
$service sshd restart



iptablesを設定


/etc/sysconfig/iptablesを編集
さくらのVPS を使いはじめる 3 – iptables を設定する
CentOSをサーバーとして活用するための基本的な設定
参考に。
自分のIPは、ルータにアクセスして調べる


設定ファイル注意。起動するとエラー。

/etc/rc.d/init.d/iptables restartでiptables-restore v1.3.5: no command specifiedが出た。
設定ファイルの最終行にCOMMITを記述しているが、ここに改行が入っていなかったせいだった。


めんどくさい


スクリプトを書きましょう。
さくらインターネットVPSの初期設定をまとめてみた


以上


わからないことだらけだけど、やっぱり面白いなぁ。
IT業界で生きていけないかな。





2010年12月18日土曜日

オブジェクト指向を学んだ本たち



まず最初にみたのが、まさかのハッカーと画家





ここで、よくわからないながらも、
・オブジェクト指向は、決まった定義がなくて、いくつかの要素を満たすものだと知る
・オブジェクト指向は魔法じゃない
ということを学ぶ


次に、名前も覚えていない本たちを読むもさっぱりわからず。
・それぞれのコードがほかのコードを汚染しにくいので、多人数での開発に良い
・継承ができる
・物が何をできるかを知っている
などなど・・・


で、記憶に残らないんですよね、読んでも。
なぜそれが必要なのか等のバックグラウンドまで知らないと、上っ面だけ学んでも全然シナプス繋がりません。


そんなときに出会えた最高の本がこちら。
[rakuten:book:13192698:detail]

この中で、松本さんは、犬とか猫とか抽象的な説明してるからわからんのだ、コードはコードでしかねぇ(超意訳)と言っていて、
実際にrubyのコードで説明されていました。
rubyはほとんど触ったことないですが、とてもよくわかりました。


rubyの話になりますが、rubyはほんとに読みやすいですね。
rubyで書かれたgroongaのテストコードもすぐに読めました。


ruby自体が僕の中でメイン言語になることはたぶんないと思いますが、読みやすさなどパクる対象として大いに興味があると思いました。
おしまい。





文と式



JavaScritptではfunctionで始まる文字列は文として認識されて、
文はグローバルとして扱われます。


なので、C言語みたいにプロトタイプ宣言が要らないです。


var test = function (仮引数){ 関数本体 }
は、最初がvarなので、文ではなく、式になります。


似たようなので、最初に混乱するのが、以下。
var test = function (仮引数) {関数本体} (実引数)
と書くと、関数の実行結果が返ってきます。まぁ実引数をとるので、関数が実行されてるんですね。
関数の実行がβ変換にあたるのかなJavaScriptで学ぶ・プログラマのためのラムダ計算


JavaScriptはまだまだわかりませんが、ほぼハッシュと言われているだけあって、読みやすいですね(今のところ)





2010年12月2日木曜日

groongaを使っ・・・えなかった・・・使えた



ドキュメントにしたがって、インストール。
MeCabは先にインストールする。
説明通りに進めて、特に問題なし。nkfcのmakeにめっちゃ時間がかかるくらい。


次にドキュメントのチュートリアルに進む。

$groonga -n t.db
> status
Aborted



おぉ・・・、なんだ・・・


あー、インストール失敗してた。MeCabをインストールした後に、Ubuntuのインストール説明のやつやってた。

以下、チュートリアル通り。

$groonga t.db
> status
[[0,1291307394.09009,0.000188872],{"alloc_count":126,"starttime":1291307387,"uptime":7,"version":"1.0
.4","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default
_command_version":1,"max_command_version":2}]



わいわい


jsonの配列の0番目の要素に、エラーコードや実行時間などの情報が入ります。jsonの配列の1番目の様子に、コマンドの実行結果が入ります。


とのことだけど、詳しくは良くわかんないですね。
と思ってソース見てみる。
proc_status関数で処理されてるけど、うーん、後回しでいっかな。
必要になったらまた見よう。


次、Siteという名前のテーブルの作成
ShortText型の主キー値を持ち、主キーの格納方法はHASH

> table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText
[[0,1291309642.66916,0.049232948],true]



selectでテーブル内容表示。[0]はレコード数。テーブルを作っただけだから0だよね。カラムは2つ自動的に作られていて、_id=自動で割り振られる値を格納するカラム、_key=主キーを格納するカラム。

> select --table Site
[[0,1280378897.62847,0.000124],[[[0],[["_id","UInt32"],["_key","ShortText"]]]]]



カラムの追加。
Siteというテーブルにtitleというカラムを追加する。
COLUMN_SCALARは通常のカラムを示す

> column_create --table Site --name title --flags COLUMN_SCALAR --type ShortText
[[0,1291310090.51808,0.027044456],true]
> select --table Site
[[0,1291310100.15807,0.000200291],[[[0],[["_id","UInt32"],["_key","ShortText"],["title","ShortText"]]]]]



titleというカラムが追加されています。
ドキュメントはcommentカラムを追加するとあるから、間違ってますね・・・。こういうのってどうすればいいのかなぁ。自分で直せるのかな??APIrdにもtypo見っけたんだけど・・・。



続きはまた明日。