2007年12月27日木曜日

rsync+sshでのバックアップが途中で止まってしまう

外部サーバーのファイルを毎晩自宅サーバーにrsyncで自動バックアップしてるのですが、引っ越しをして回線が変わってから2分の1くらいの高い確率でバックアップが失敗しておりました。


ssh: connect to host example.com port 22: Connection timed out
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(453) [receiver=2.6.9]


というエラーメッセージを吐いて止まっています。
いろいろ調べてみたところ、rsyncはサイズの大きいファイルのバックアップが苦手なようで、圧縮オプション(-z)をつけているとさらにその確率が高まるんだそうです。

http://mztaro.agora-mc.com/item/117
http://lists.samba.org/archive/rsync/2006-February/014774.html

自分の場合、まさにこのケースにあてはまります。-z使ってるし、一番大きいファイルは200MB弱あります。
解決のためのキーワードが「bwlimit」と「timeout」であることが分かったので、さっそく調べてみる。
rsyncのマニュアルは、


--bwlimit=KBPS limit I/O bandwidth; KBytes per second
--timeout=TIME set I/O timeout in seconds


とりあえず「--bwlimit=8192 --timeout=600」にして実行してみると、、、成功!!
ひとまずこれでしばらく様子を見てみたいと思います。

※2008.01.08追記
その後、正月休み中も毎日自動でバックアップとっていましたが、すべて成功していました。

2007年12月26日水曜日

正規表現の勉強

自分は正規表現が苦手で、よくつまづくことがあります。
こちらのページに「Java、PHP、.NETではじめる正規表現」という、いい感じの資料があったので印刷して電車の中で読みました。これでちょっとはレベルアップしたかな?
http://module.jp/works.html
第1章 正規表現のいろはにほへと - まずは基本を押さえよう(PDF: 169K)
第3章 PHP編 - preg系関数とereg系関数を学ぶ(PDF: 167K)
Appendix - 各言語正規表現対応表(PDF: 74K)
念のためこちらにもファイル置かせていただきます。


索引
※追記
これなんかも役に立ちそうです
すべての漢字を取り出す正規表現

2007年12月20日木曜日

Apacheで、特定URLへアクセスのみ別ログファイルに記録する

httpd.confをこんな感じに。

SetEnvIf Request_URI "^/aiueo/" aiuoe
CustomLog logs/access.log common env=!aiuoe
CustomLog logs/aiuoe.log common env=aiuoe

これでURLに「/aiueo/」を含むアクセスはaiueo.logに記録されるようになります。

2007年12月13日木曜日

PEAR::Pager で Digg っぽいページャを作る

http://cl.pocari.org/2007-12-02-1.html
Pear::Pagerは自分も愛用してますが、デフォルトだと味気ないデザインなので、こういうサンプルがあると助かります。今度使ってみようと思います。

2007年12月5日水曜日

PearのHTTP_REQUESTは便利だ!と改めて思った

とても便利なPearのHTTP_Request。自分もよく使っています。
今回仕事で、とあるウェブサイトのマイページ(https)にログインして、ログイン後のページの内容を取得する、というのを作ったんですが、HTTP_Requestならクッキーの値の取得、さらにクッキー情報の送信までできてしまう。
以前fsockopenを使って同じようなことをやったんですが、HTTP_REQUESTを使うと圧倒的にカンタンに実装できます。
そんなわけで、あらためてHTTP_REQUESTの便利さを思い知ったというわけです。
http://www.ironhearts.com/diary/archives/001397.html
http://www.bnote.net/php/pear/ref_http_request.shtml

2007年11月22日木曜日

phpでもデータ型を意識する

HTML_QuickFormを使って、

$form->addElement("select","test_select_box","",array(1=>1,2=>2,3=>3,4=>4,5=>5));
$form->setDefaults(array("test_select_box"=>"03"));

という感じのソースコードを過去に書いていたんですが、これが突然機能しなくなっていました。
具体的には、デフォルトが3にならないで、1になってしまうという症状。
最近のphpのバージョンアップで、データ型の判定が厳しくなったのが原因ではないかと推測しています。phpってデータ型の変換とかある程度勝手にやってくれて楽だったんですが、だんだんそのあたりも厳しくなってきたようです。
php3とか4の頃は「phpはコーディングが楽」っていうのがウリになっていましたが、最近はそうでもない感じですね。
適当なソースコードを書いてるとバージョンアップの時に大変なことになる恐れがあるので、そのあたり意識するようにしていきたいと思います。

2007年11月20日火曜日

2007年11月17日土曜日

registerElementTypeでQuickFormを拡張する

HTML_QuickFormを使い、フォームの確認画面(freezeした状態)で、数値にカンマを入れたいと思っていたら、ドンピシャのページを発見。
http://ml.php.gr.jp/pipermail/php-users/2006-September/030839.html
registerElementTypeを使うことでQuickFormのElementを拡張することができます。
これまでけっこうQuickFormを使い込んできましたが、これは知らなかった。こういうこともできるんですねぇ。
覚えておいて損はなさそうです。

2007年11月14日水曜日

スタイルシートの優先順位

CSSの適用には、以下のような基準があるんだそうです。
http://www.stylish-style.com/csstec/base/order.html
なるほど、勉強になります。
#hoge .aiueo .kakikukeko

てな感じでCSSが書かれていることがよくありますが、こうやって優先順位をコントロールしてうまく表示できるようにしてたんですね。勉強になりました。

2007年11月12日月曜日

Windowsでatコマンド

先日Linuxでatコマンドのお勉強をしましたが、今回はwindowsでatコマンドを使いました。
使い方はほぼ同じ。
at 8:30 C:\hoge\hoge.exe

という感じです。
登録したジョブの確認は
at

ジョブの削除は
at 1 /delete

※1はジョブIDを指定
簡単ですね。
今後あまり使うことはないと思いますが、いちおうメモしときます。

2007年11月7日水曜日

atコマンドを勉強

atコマンドを使ってみようと思い、勉強してみました。
使い方は意外と簡単。こんな感じ
・日時を指定して実行
echo "ls -al" |at 17:24 11/06/2007

※mm/dd/YYYYなので注意
・3分後に実行
echo "ps ax" | at now + 3minute

実行結果はメールで届きます。
ジョブの確認は以下の通り。
・キューに入っているジョブの表示
$ atq

・実行待ちのジョブを消す
$ atrm ジョブ番号

参考サイト
http://sonic64.com/2004-08-31.html
http://discypus.jp/wiki/?Linux%2Fat%A5%B3%A5%DE%A5%F3%A5%C9

phpでの暗号化・復号化

http://labs.unoh.net/2007/11/php_de_crypt.html
こちらのページが参考になりました。
mcryptモジュール、PEAR::Crypt_Blowfish、opensslモジュールの3種類を使った暗号化・復号化のやり方が説明されています。

httpsからhttpへのアクセスはリファラーは送出されない

です。
実際にやって試しました。httpsのページからhttpのページにリンクを張り、ジャンプしてもリファラーが出ない。なぜだ。。。
不審に思ってググってみたら、こういうことでした。納得。
http://www.nitoka.net/archives/2006/12/httpshttp.html

2007年11月6日火曜日

mb_send_mailで文字化けする

文字コードUTF-8を使っている環境で、phpによるメール送信で文字化けする現象が起こりました。
mb_language("uni");

を使うと文字化けが解消できます。
詳細はこちらのURLを見てください。
http://www.securehtml.jp/utf-8/php_utf_mail.html
こんな感じになります。

mb_internal_encoding("utf-8");
mb_language("uni");
mb_send_mail(....

QihooBotが来た

webalizerを見ていたら、見慣れないIPからのアクセスが目立っていたのでログを調べてみたところ、
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; QihooBot 1.0 qihoobot@qihoo.net)

というUserAgentだった。
IPアドレスは
221.194.136.22
221.194.136.25
221.194.136.35
221.194.136.28
221.194.136.32
となっている。QihooBotでググってみたところ、他にも同じように迷惑こうむっている方がいらっしゃいました。
http://blog.cles.jp/item/1876
http://www.makizou.com/archives/1154
ただ、こちらの方々と自分のケースではIPアドレスが違っています。
IP変えて巡回してるとしたらちょっと厄介ですね。

2007年10月31日水曜日

rsyncの--dry-runオプションで実際に同期を取る前に確認する

便利なrsyncですが、たまに間違えて同期してはいけないのに同期してしまい、必要なファイルを上書きしたり消してしまったりといったことがあります。

そんなミスを防ぐには、--dry-runのオプションをつけてrsyncを実行します。

このオプションがあると実際にファイルの更新は行わず、更新ファイルのリストだけが表示されるので、同期前に確認ができるというわけです。
便利なので覚えておくと良いと思います。

2007年10月22日月曜日

生年月日から年齢を計算する簡単な計算式

(今日の日付-誕生日)/10000の小数点以下切捨て

これで計算できちゃうそうです。
すごい便利なので覚えておこう。
http://itpro.nikkeibp.co.jp/article/Watcher/20070822/280097/

2007年10月17日水曜日

phpの連想配列の添字は必ずダブルクオートで囲むこと!

以前、どこかのブログで

連想配列の添字は必ずダブルクオートで囲むこと!

というエントリを読んだことがあります。
つまり、こういうことです。

× $row[hoge]
○ $row["hoge"]


ダブルクオートなしとありでは、6倍近くパフォーマンスが変わってくるんだそうです。

というわけで、それを知ってからは必ず連想配列の添字はダブルクオートで囲むようにしていました。


そして今回、あるきっかけでこのダブルクオートの重要さを思い知ることになりました。。

きっかけは、2年近く前に作ったアプリケーションの動作が重たくなってきたことでした。2年の運用によってデータ量が多くなっており、ひとつの処理に数分かかって途中でタイムアウトしちゃったり、、といったことがしばしば。

ずっとDB側を疑っていました。SQLが効率悪いんじゃないか、とか、DBのチューニングが必要なんじゃないか、とか。

そしてある日、「そういえばこのアプリ、配列の添字をダブルクオートで囲んでいないな」ということを思い出しまして、特に重い処理を行うphpプログラムを選んで、添字をダブルクオートで囲んでやると、、、劇的に症状が改善!!

たしかに、このスクリプトでは何百回もループして同じ処理を繰り返しているので、積み重ねでどんどん重くなっていたんでしょう。たかがダブルクオート、されどダブルクオート、、、いい勉強になりました。

phpで使える正規表現

http://phpspot.org/blog/archives/2007/10/php_84.html
これは便利ですね。使わせていただこうと思います

2007年10月16日火曜日

sshパスワード無し公開鍵で接続でエラー(結局パーミッションエラーだった)

sshパスワード無し公開鍵接続のやり方については特に難しくないと思います。
ssh パスワード」とか「ssh_keygen」などで検索すると有用なドキュメントがワンサカでてきます。
なので自分の環境でもスンナリ行くかな、、、と思っていたんですが、思わぬ罠にはまりました。
すべてお膳立てしてさあ接続!とやっても
Permission denied (publickey,password,keyboard-interactive).

というエラーが出てしまうのです。
わからん、さっぱりわからん。rsaもdsaもダメだし、sshd_configの記述に間違いは見当たらない、、、
見落としがちな「~/.ssh」と「~/.ssh/authorized_keys」のパーミッションも問題なし。
そのまま悩むこと半日。
http://www.upken.jp/report/cronrsyncssh.html
こちらのページを見て、「そういえば、ログを見てなかった」という超初歩的なことを思い出した。
さっそく/var/log/secureをみてみると、
Authentication refused: bad ownership or modes for directory /home/hoge

というエラーが出ていた。
そう、「~/.ssh」 と 「~/.ssh/authorized_keys」だけじゃなく、ホームディレクトリのパーミッションも適切に設定する必要があったのです(700じゃないとダメ)
パーミッションを直して再度試してみたら、、、無事接続できました!!
トラブったらまずはログを見る。鉄則ですね。
性格の問題なのか、たまーに忘れてしまうんです。。

sshd_configの設定内容にミスがないか確認する

# /usr/sbin/sshd -t


記述にミスがある場合のみ、その旨が表示されます。
リモートから接続している場合、sshd_configの設定が間違っている状態でrestartすると取り返しのつかないことになりかねないので、テストしてからrestartしたほうが安全です。
ちなみにCentOSでのsshd_configのパスは「/etc/ssh/sshd_config」。

2007年10月8日月曜日

mrtgのインストール・設定

mrtgを入れました。
まずはyumでインストール。

# yum install net-snmp
# yum install net-snmp-utils
# yum install mrtg

/etc/snmp/snmpd.confを編集。

# sec.name source community
#com2sec notConfigUser default public
com2sec local localhost private
# groupName securityModel securityName
#group notConfigGroup v1 notConfigUser
#group notConfigGroup v2c notConfigUser
group MYROGroup v1 local
group MYROGroup v2c local
group MYROGroup usm local
# Make at least snmpwalk -v 1 localhost -c public system fast again.
# name incl/excl subtree mask(optional)
#view systemview included .1.3.6.1.2.1.1
#view systemview included .1.3.6.1.2.1.25.1.1
view all included .1 80
# group context sec.model sec.level prefix read write notif
#access notConfigGroup "" any noauth exact systemview none none
access MYROGroup "" any noauth exact all all none
#disk / 10000
disk / 10000

そしてsnmpdを起動。

# /etc/rc.d/init.d/snmpd start
# chkconfig snmpd on

/etc/mrtg.mrtg.cfgの編集。
※以下の例は、メモリは498516、swapは1052248

WorkDir: /var/www/mrtg
Refresh: 300
Language: eucjp
### Traffic Analysis ###
Target[traffic]: 2:private@localhost:
MaxBytes[traffic]: 12500000
Options[traffic]: growright
Title[traffic]: Traffic Analysis
PageTop[traffic]:

Traffic Analysis


###CPU Used###
Target[cpu]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:private@localhost
MaxBytes[cpu]: 100
Unscaled[cpu]: dwmy
Options[cpu]: gauge, absolute, growright, nopercent
YLegend[cpu]: CPU Load Av. (%)
ShortLegend[cpu]:%
LegendI[cpu]: 1minute
LegendO[cpu]: 5minute
Legend1[cpu]: 1minute(%)
Legend2[cpu]: 5minute(%)_
Title[cpu]: CPU Load
PageTop[cpu]:

CPU Load Average


### Memory Used ###
Target[mem]: .1.3.6.1.4.1.2021.4.6.0&.1.3.6.1.4.1.2021.4.4.0:private@localhost
MaxBytes1[mem]: 498516
MaxBytes2[mem]: 1052248
Unscaled[mem]: dwmy
Options[mem]: gauge, absolute, growright
YLegend[mem]: Memory Used (MB)
ShortLegend[mem]:Bytes
kilo[mem]: 1024
kMG[mem]: k,M,G,T,P
LegendI[mem]: Real
LegendO[mem]: Swap
Legend1[mem]: Physics Memory(MB)
Legend2[mem]: Physice Swap(MB)
Title[mem]: Memory Used
PageTop[mem]:

Memory Used


### Disk Used ###
Target[disk]: .1.3.6.1.4.1.2021.9.1.9.1&.1.3.6.1.4.1.2021.9.1.9.1:private@localhost
MaxBytes[disk]: 100
Unscaled[disk]: dwmy
Options[disk]: gauge, absolute, growright, nopercent, noinfo
YLegend[disk]: Disk Used(%)
ShortLegend[disk]: (%)
LegendI[disk]: / Disk used
LegendO[disk]: / Disk Used
Legend1[disk]: / Disk used
Legend2[disk]: / Disk used
Title[disk]: Disk Used
PageTop[disk]:

Disk Used



mrtgを実行。

# mrtg /etc/mrtg/mrtg.cfg
# mrtg /etc/mrtg/mrtg.cfg
# mrtg /etc/mrtg/mrtg.cfg

インデックス作成。
indexmaker /etc/mrtg/mrtg.cfg > /var/www/mrtg/index.html

以上ですべて完了。
今のところはうまく動いているようです。
参考サイト
http://www.k2.dynsite.net/redhat/14.MRTG.htm
http://centossrv.com/net-snmp-mrtg.shtml
http://fedorasrv.com/mrtg.shtml
http://crosss.jugem.jp/?eid=76

2007年10月7日日曜日

ウェブサーバーの設定(ServerTokens,ServerSignature,expose_php)

apache+phpはデフォルトでは第三者に対してサーバーのバージョンを公開する設定になっています。
攻撃者に余計な情報を与えないようにするため、以下のように設定しました。
・httpd.conf
ServerTokens ProductOnly
ServerSignature Off
・php.ini
expose_php = off

2007年10月6日土曜日

mtaをsendmailからpostfixにする

まずはyumを使ってサクサクっとpostfixをインストール。
http://fedorasrv.com/postfix.shtml
↑こちらのページを参考にさせていただきました。
で、MTAの切り替えにはalternativesというコマンドが使えることを知りました。
# alternatives --config mta

これを実行してpostfixをmtaにすると、シンボリックリンクを張ったりしてmta入れかえをしてくれるんです。いやー便利だ。

2007年10月5日金曜日

PECL(PHP拡張モジュール)でモジュールを導入する

jsonモジュールを使おうと思ったら、php5.1系だったのでモジュールが含まれていない。というわけでモジュールを入れようと思い、調べてみたらpeclコマンドで簡単に導入できるとのこと。
こんな感じ。
# pecl install json

pearと全く同じですね。
ただ、自分の環境だと
running: phpize
sh: phpize: command not found

というエラーが出てしまいました。
phpizeが、、ない
phpizeはphp-develというパッケージを入れればOKです。ソースコンパイルの場合はデフォルトで付属します。
# yum install php-devel

やり直したら、見事成功!
で、php.iniに
extension=json.so

を追加して完了です。

2007年10月4日木曜日

Linuxのカーネルバージョンを調べるには

unameコマンドで分かります。
uname -m //CPUのタイプを表示する
uname -n //PCのホスト名を表示する
uname -r //カーネルのバージョンを表示する
uname -s //OS名を表示する
uname -v //OSのリリース日を表示する
uname -a //すべての情報を表示する
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/068infokernelver.html

yumでパッケージを削除するには

新しいサーバーが届いて、現在環境構築中。
yum関係をいじっており、yum list installed したらpostgresが入っていた。
postgresは使わないのでアンインストールしたい。そんなときはグループごとまとめて削除するのが楽です。
# yum groupremove "PostgreSQL Database"
まとめて一気に引っこ抜けるので、すごくさっぱりします。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/678yumgroup.html

2007年10月2日火曜日

selinuxを無効にする

CentOS4.5をインストールすると、selinuxというのがもれなくインストールされます。(インストール時のオプションだったかも)
selinuxについてまったく知らなかったので、軽く調べてみました。
selinuxは「Security Enhanced Linux」の略で、セキュリティを高めるためのものだそうです。しっかり設定すると堅固なセキュリティを組むことができるんだそうです。
なるほど、機会があったらしっかり勉強してみるのもいいかもしれないな、、、とは思うんですが、いまのところまだあまり普及していない様子。また、きちんと理解しておかないとトラブルが起こった時の原因の切り分けにおいて手間がかかってしまうそうです。
導入するのは時期尚早かな、、、という感じ。
というわけで無効にすることに。

# vi /etc/selinux/config
SELINUX=enforcing
 ↓
SELINUX=disabled

これで再起動後にはselinuxは無効になります。
再起動せずに無効にしたい場合は、

# /usr/sbin/setenforce permissive

でOK。

iptablesの勉強

iptablesについて、けっこう頑張って勉強したのでまとめてアップします。
iptablesは多機能でいろんなことができるようですが、この記事では単体サーバーで、外部からのアクセスを全部遮断し、サービスを行うポートのみ特定(または不特定)のユーザーに対して開放するという点のみを書きます。ルーター機能とかについては触れません。
まずiptablesコマンドの使い方ですが、説明は割愛します。この記事の最後に参考サイトをリンクしたのでそちらをごらんください。
さっそくですが、具体例を示します。
以下は入ってくるパケットを全部拒否(DROP)し、80番ポート(http)は全開、22番ポート(ssh)は192.168.1.0/24のみ許可という設定です。

 1. iptables -P OUTPUT ACCEPT
 2. iptables -P FORWARD DROP
 3. iptables -P INPUT DROP
 4. iptables -A INPUT -i lo -j ACCEPT
 5. iptables -A INPUT -p icmp -j ACCEPT
 6. iptables -A INPUT -m state --state ESTABLISHE,RELATED -j ACCEPT
 7. iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 8. iptables -A INPUT -p tcp --sport 80 -j ACCEPT
 9. iptables -A INPUT -p tcp -s 192.168.1.0/24 --sport 22 -j ACCEPT
10. iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -j ACCEPT

行ごとに説明します。
まず1~3行目。「-P」オプションは基本ルールの設定です。後述する「-A」のルールに当てはまらないパケットにはすべて「-P」の処理が行われます。

1. 内部から外部へのパケット(OUTPUT)を許可(ACCEPT)
2. サーバーを経由して転送されるパケット(FORWARD)をすべて破棄(DROP)
3. 外部から内部へのパケット(INPUT)をすべて破棄(DROP)

4~6行目はそれぞれ以下の意味を持っています。

4. ループバックアドレスからのパケット(自分自身からのパケット)を許可
5. icmp(ping)のパケットを許可
6. ESTABLISHED(確立済みのコネクション)とRELATED(新しいコネクションだがFTPデータ転送やICMPエラーのように既存の接続に関係する)のパケットを許可

7~10行目は特定ポートでのサービスへのパケットの処理です。

7. 80番ポートへのパケットを許可(dportは宛先ポートの指定)
8. 80番ポートへのパケットを許可(dportは送信元ポートの指定)
9. 22番ポートへのパケットを192.168.1.0/24に対してのみ許可(dportは宛先ポートの指定)
10. 22番ポートへのパケットを192.168.1.0/24に対してのみ許可(dportは送信元ポートの指定)

以上でこのサーバーは80と22以外は外部からのアクセスはすべて破棄されるようになりました。
さて、ここでいくつか注意点を。
まず上記のコマンドは、コンソールから実行しないといけません。リモートから実行した場合、3行目を実行した時点で「外部から内部へのパケット(INPUT)をすべて破棄(DROP)」されてしまうので、切断されてしまいます。
というわけなので、リモートからの作業の場合には「iptables -P INPUT DROP」は一番最後に実行してください。
あと6行目の「iptables -A INPUT -m state --state ESTABLISHE,RELATED -j ACCEPT」。
この設定をしておけばたとえ途中で設定を間違えてしまっても、その時点で接続が切れることはなくなります。たとえばsshのルールを間違えて設定したとしても突然接続が切れたりしないので安心です。
だいたいこんなところです。
あと実際に本番機でルールを設定する時は、iptablesコマンドを使うより/etc/sysconfig/iptablesのスクリプトを編集したほうがいいと思います。上の例をスクリプトにすると、

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --sport 22 -j ACCEPT
-A INPUT -s 192.168.1.0/255.255.255.0 -p tcp -m tcp --dport 22 -j ACCEPT

となります。ルールを有効にするには「/etc/init.d/iptables restart」。
コマンドは実行した瞬間にルールが適用されるのでミスが起こりやすいので、その点スクリプトだと安全です。
最後に、iptablesはテスト環境を用意して実際にコマンドを試しながら勉強するのがいいと思います。自分もそうしましたが、習うより慣れろなところがあるので、そうすることをおすすめします。(ぶっつけ本番で失敗したら大変なことになっちゃいますしね)
以下、勉強の参考にさせていただいたサイトです。
http://linux.shoukun.com/security/iptables.htm
http://www.fmmc.or.jp/fm/nwts/rh_linux/ch6/6_2_1_4.html
http://kurosuke.net/linux/iptables.shtml
http://www.linux.or.jp/JF/JFdocs/packet-filtering-HOWTO-7.html
http://cyberam.dip.jp/linux_security/iptables.html
http://www.asahi-net.or.jp/~bk3k-andu/linux/tips/iptables4.html
http://www.d3.dion.ne.jp/~koetaka/router.html
※追記
/etc/sysconfig/iptablesはデフォルトでは存在しません。
# /etc/rc.d/init.d/iptables save
を実行すると保存されます。

2007年10月1日月曜日

特定のパッケージだけyumのアップデート対象から外す

/etc/yum.confの、[main]のセクションに
exclude=アップデートから外したいパッケージ名

とすればOK。
ワイルドカードも使える。
exclude=kernel*

カーネルを更新すると最悪起動しなくなってしまうというリスクもあるので、自分の環境ではこのように設定しています。
参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/596noupyum.html

2007年9月29日土曜日

yumでphp5,mysqlをインストール

centosplusとdagリポジトリの設定が終わったら、php5、mysqlのインストール、アップデートを始めます。
まずは現在のバージョンを確認。
# php -v
PHP 4.3.9 (cgi)
# mysql
入ってない
ではphpから
# yum update php

でOK。他にphp-mysqlとか、gdとか、使うモジュールも入れておきましょう。
続いてmysql
# yum install mysql

これで依存関係もまとめてインストールできます。なお、これだとインストールされるのはmysqlのクライアントだけで、サーバーがインストールされないので
# yum install mysql-server

もやっておきましょう。
以上で完了です。

2007年9月28日金曜日

centosplusとdagを導入

yumでmysqlとかphp5とかを入れる場合はリポジトリにcentosplusやdagを入れる必要があります。
# vi /etc/yum.repos.d/CentOS-Base.repo
まずはcentosplusの記述。
既に[centosplus]があるので、baseurlとenabledを以下のようにします。

baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/$basearch/
enabled=1

続いてdag。
これは新規で記述を追加します。

[dag]
name=Dag RPM Repository for RHEL4/CentOS4
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el4/en/$basearch/dag/
enabled=1
gpgcheck=1

そしてGPG-KEYを取得。
# rpm --import http://ftp.riken.jp/Linux/dag/packages/RPM-GPG-KEY.dag.txt
# rpm --import ftp://ftp.riken.jp/Linux/dag/RPM-GPG-KEY.dag.txt

パソコンおやじさんのページをそのまま使わせていただきました。

よく使うyumコマンド一覧

http://www.atmarkit.co.jp/flinux/rensai/linuxtips/611usefllyum.html

↑こちらのページにあったのを、便利そうなのでコピーさせていただきました。


































































コマンド概要
check-updateアップデート可能なパッケージの一覧を表示
cleanダウンロードしたパッケージと古いヘッダを削除する。clean allと同じ
clean oldheaders古いヘッダを削除
clean packagesダウンロードしたパッケージを削除
info利用可能なパッケージの情報を表示
info パッケージ名指定したパッケージの情報を表示
install パッケージ名指定したパッケージをインストール
list利用可能なパッケージの一覧を表示
list installedインストール済みのパッケージ一覧を表示
list updatesアップデート可能なパッケージの一覧を表示
provides パッケージ名パッケージに含まれるファイルの一覧を表示
remove パッケージ名指定したパッケージをアンインストールする。指定したパッケージと依存関係があるパッケージは、削除するかどうか確認を求める
search キーワードキーワードでパッケージを検索する。検索の対象は、RPMファイルのName、Packager、Dummary、Descriptionの各フィールド
updateアップデート可能な全パッケージをアップデート
update パッケージ名指定したパッケージをアップデート

2007年9月27日木曜日

yumの初期設定

yumを使ったパッケージ更新をしたいと思います。

まずは初期設定。

最初にGPG key をインポートします。これをしないとyumが使えないらしい。

# rpm --import http://ftp.riken.jp/Linux/caos/centos/RPM-GPG-KEY-CentOS-4

続いてパッケージをダウンロードするサーバーをデフォルトからrikenに変更します。
このページのまんまに設定。

http://www.aconus.com/~oyaji/centos/yum_centos.htm

なお、yum-plugin-fastestmirrorという最速のミラーサーバーを探してくれるプラグインもあるみたいなのですが、riken固定で良さそうなので導入は見送りました。

そしてひとまず

# yum update

を実行。

数十分かかってダウンロード(約71MB)&インストールが完了しました。
なお、yumによる自動更新は怖いのでしません。

# chkconfig yum off

としておきます。

phpのセッションIDを引数で保持する

セッションIDはクッキーで保持するのが普通ですが、
session.use_trans_sid
をOnにすることで引数で保持させることも可能です。
これにより、phpが自動でhrefタグの引数やformのhiddenにセッションIDを入れてくれるので、ページを遷移してもセッションが切れることがありません。便利です。
ただし、、
JavaScriptで「onClick=aiueo.php」とか書いたり、スクリプト内で「header("Location: aiueo.php");」とかやってるとその時点でセッションが切れてしまうので注意が必要です。

2007年9月25日火曜日

LANカード(PCC-TXD FEther)を認識してくれない

OSインストールが無事完了したので、次はネットワークにつなげます。
と思ったんですが、LANカードを認識してくれませんでした。
使ってるのはcoregaのPCC-TXD FEtherというカード。
さっそくググってみるとたくさん出てきました。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/485ditctpccard.html
http://network.station.ez-net.jp/common/ethernet/corega/pcctxd.asp
http://pcnikki.exblog.jp/1989120/
このあたりを参考にして「/etc/pcmcia/config」を編集して「/etc/rc.d/init.d/pcmcia restart」するものの、エラーが出てしまう。こんな感じ。
Module pcmcia_core is in use by yenta_socket
このエラーメッセージでググってみるものの、特にめぼしい情報なし。うーん、困った・・・
しばらく試行錯誤してみるもダメ。あきらめかけたそのとき、期待せずに打った
# kudzu
のコマンドで認識してくれました。よくわからないけど、結果オーライってことで。。。
めでたくネットワークにつながったので、次からはyumのお勉強を始めます。

CentOSの勉強開始

突然ですが、CentOSの勉強を始めます。
勉強の過程で得た知識をこのカテゴリで公開していこうと思います。
とりあえず自宅にあまっていたノートPC(セレロン700Mhz、メモリ512MBくらい)にインストールしました。バージョンは4.5です。ファイナルリリースです。
インストールの手順は特に難しいこともないので割愛します。CentOS インストール とかでググればたくさん出てきます。
ちなみにCentOSの読みは「セントス」なんだそうです。「セントオーエス」ではありません。

2007年9月20日木曜日

Pear::DBは古い、これからはPear::MDB2だ

日ごろ愛用してるPear::DBですが、いつのまにか時代遅れになっていたようです。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070827/280396/

今後はPear::MDB2が基本路線になっていくようです。Pear::DBでできることは、Pear::MDB2でもほぼすべてカバーできているようです。

http://www.phpied.com/db-2-mdb2/

移行するにはプログラム全部見直しが必要だし、テストも必要。面倒だなぁ。。。
でもPear::MDB2にして実行速度が速くなるのは魅力だな。と思ったんですが、

http://blog.zuzara.com/2006/09/07/112/

ほとんど変わらないみたいですね。

同じ移行コスト払うならPDOにしちゃったほうが良さそう。

でもPDOってgetOne()とかがないからちょっと面倒なんですよね。ま、それも半年くらい前に調べたことなので今はもう改善されてるのかもしれない。ちょっと調べてみよう。。

2007年9月13日木曜日

ページのメモリ使用量を調べる

javascriptを使ったページを作っていたら、
「このページのスクリプトがInternet Explorerの実行速度を遅くしています。スクリプトを実行しつづけると、コンピュータが反応しなくなる可能性があります。スクリプトを中断しますか?」
という警告メッセージが出ました。
どうやらこれは重い処理をループするなどしてメモリを大量に使うと出るメッセージのようです。
で、調べてみるとメモリ使用量を調べるアプリがありました。
Drip IE Leak Detector
http://outofhanwell.com/ieleak/index.php?title=Main_Page
こちらはFireFoxのアドオン。
Leak monitor
http://phpspot.org/blog/archives/2006/10/javascriptfiref.html
こちらのアドオンはページを閉じた時にメモリリークがあったらアラートを出してくれるというものです。インストールしても「ツール」などにメニューが出てくるわけでもなく、最初はインストールに失敗したのかと思ってしまいました。

2007年9月11日火曜日

File_Archiveでファイルを圧縮する

仕事で作っているアプリで、効率化のためにテキストファイルZIPで圧縮するようにしました。
PearのFile_Archiveでそれができます。Archive_Zipというのもあるんですが、こっちはメンテされていないみたいです。
使い方はこんな感じ。

require_once('File/Archive.php');
File_Archive::extract(
File_Archive::read("./text.txt"),
File_Archive::toArchive("text.zip", File_Archive::toOutput())
);

かなり簡単です。
なお圧縮をするにはphpを「--with-zlib」オプションでコンパイルする必要があります。

2007年9月10日月曜日

フォームのファイル参照フィールドに値を手入力すると、submitしても何も起こ らない

IEでの話です。FireFoxの場合は手入力した値は無視されます。
MSのページにこの仕様について記述がありました。
http://support.microsoft.com/kb/890981/ja
確かに、「input type="file"」のフィールドをサーバー側、もしくはJavaScriptなどでコントロールできてしまうとローカルのファイルを強制的にアップさせたりなどできちゃうので、セキュリティにかなりやばいです。
なのでこの処理については納得なんですが、submitしてもウンともスンとも言わないというのはちょっと分かりづらいですね。アラート出したりしてくれるといいんですが。

Yeti/0.01からのアクセスを遮断

webalizerを見ていたら、見慣れないUSERAGENTからの大量のアクセスがあった。
Yeti/0.01 (nhn/1noon, yetibot@naver.com, check robots.txt dai...
とある。どうやら韓国のnaver.comのロボットらしい。
韓国のサーチエンジンにインデックスされてもメリットはないし、サーバーの負荷になるだけなのでアクセスを拒否しておきました。
ちなみに「Yeti/0.01」のほかに「Yeti/0.01i」というロボットもきていました。こっちは携帯コンテンツ用かな?

2007年8月29日水曜日

YodaoBot襲来

IPアドレス「60.191.80.80」からのアクセスが大量にあったので、アクセスログを見てみたら
60.191.80.80 - - [29/Aug/2007:13:39:16 +0900] "GET /robots.txt HTTP/1.1" 200 58 "-" "Mozilla/5.0 (compatible; YodaoBot/1.0; http://www.yodao.com/help/webmaster/spider/; )"
というログが残っていた。
YadaoBot、、、ヨダオって読むのか?
サイトにアクセスしてみると、どうやら中国語のサーチエンジンのようだ。Baiduと同じく、リソースの無駄になるだけなので早速アクセス不可にしておきました。

2007年8月9日木曜日

pear5

仕事でSuSE Linux上にアプリケーションを構築することになった。
phpアプリをサーバーにアップし、pearのライブラリをインストールしようと思って、
# pear install hogehoge
を実行しようとするが、pearコマンドがない!!
ググってみたところ、SuSE環境ではpearではなくpear5というのがあるようだ。
# pear5 install hogehoge
これで使えるようです。
ひとまず
# pear5 upgrade-all
を実行したのですが、そしたらもともとあった
/usr/bin/pear5
にくわえて
/usr/bin/pear
も出てきてしまった。どっちを使えばいいのかよく分からないのですが、とりあえずいつも使ってるpearのほうを使うようにしています。今のところ不具合は出ていません。。。

2007年7月26日木曜日

MySQLメモリ使用量の計算

って、どうやればいいんだろう??
と思って調べてみたらドンピシャのエントリを発見。
http://antas.jp/blog/ina/archives/2007/05/mysql_1.html

max_connections *
(sort_buffer_size
  + join_buffer_size
  + read_buffer_size
  + read_rnd_buffer_size
  + max_allowed_packet) <-- カッコ内は1接続あたりの使用メモリ
+ key_buffer_size
+ query_cache_size
+ innodb_buffer_pool_size
+ innodb_additional_mem_pool_size
+ innodb_log_buffer_size

ということです。参考にさせていただきました。

php.iniのmax_execution_timeとmax_input_time

先日、php.iniのmemory_limitをいじっていたら、そのすぐ上のところに

max_execution_time
max_input_time

という2つのパラメータがあり、気になったので調べてみました。


max_execution_time
スクリプトがパーサにより強制終了されるまでに許容される最大の 時間を秒単位で指定します。この命令は、いい加減に書かれた スクリプトがサーバーの負荷を上げることを防止するのに役立ちます。 デフォルトでは、30 に設定されています。
max_input_time
スクリプトが POST、GET そしてファイルアップロードなどの入力を パースする最大の時間を、秒単位で指定します。


自分が管理してるウェブアプリでは処理のボリュームが大きいスクリプトがいくつかあるので、デフォルト値より大きめの数字にしておきました。

「PHP Fatal error: Allowed memory size of 8388608 bytes exhausted」に遭 遇した

メモリが足りなくなるとこのエラーを吐くようです。
対処方法はメモリ量を増やすこと。
php.iniのmemory_limitの値を調整します。デフォルトで8Mになっているのを32Mにしたらエラーが出なくなりました。
php.iniを編集したら、apache再起動を忘れずに。。

mysqlでバイナリログを記録しない

my.cnfの
log-bin=mysql-bin
の行をコメントアウトするだけです。
大量のSQLを発行する場合など、ログを取るのと取らないのではSQLの実行速度がけっこう変わってくるようです。
あらかじめバックアップを取ってから大容量のバッチを実行する場合や、テスト環境などではバイナリログは取らないほうが効率が上がると思います。

2007年7月15日日曜日

Linuxでコマンドラインからメール送信

たまーに使うときに忘れてることがよくあるのでメモっておきます

$ mail -s 'subject' mailto@example.com
Enter mail body
[Ctrl+D]を2回

2007年7月5日木曜日

スタイルシートのborderピクセル指定の罠

フォントの大きさ、widthにheightなどなど、スタイルシートを使ってピクセル指定をすることはよくあります。
font-size:12px; とか width:100px; などです。

このピクセル指定はpxを記述しなくても問題なく動作します。font-size:12; とか width:100; という感じ。

これと同じように、 border:1 solid #000; なんて具合に使っていたんですが、これはFireFoxではうまく動作しないようです。(IEはOK)

FireFoxでもちゃんと動かすには border:1px solid #000; ってやらないとダメ なようです。
ついさっき気が付きました。。

2007年6月29日金曜日

mysqlsnapshotでバックアップを取る

mysqlのバックアップといえばmysqldump、、、と思っていたんですが、最近はその他にもいろいろあるみたいです。この記事を読んで知りました。

http://opentechpress.jp/developer/article.pl?sid=07/05/31/0155233

mysqlの標準機能でmysqlhotcopyというのがあり、これはMyISAMテーブルをそのままの形でオンラインバックアップできるスクリプト。mysqldumpでsql形式で出力するよりはずっと効率が良いみたいです。

さらにmysqlsnapshotというスクリプトもあります。

mysqlhotcopyの場合データベースをひとつずつ指定してバックアップしなくてはいけないんですが、こちらを使えばサーバ上のすべてのMyISAMテーブルを、DBごとに1つのtarにまとめてバックアップしてくれるというすぐれものです。

日次バックアップはmysqlsnapshot、週次バックアップはmysqldump、みたいな感じで用途に応じて使い分けてもいいかもしれません。

2007年6月22日金曜日

HTML_QuickForm+Smartyで複数のテキストフィールド値を配列で受け取る

たとえば

<input type="text" name="hoge[]" value="111">
<input type="text" name="hoge[]" value="222">

こういうHTMLフォームがあり、送信されたデータをphpで受け取ると、php側ではこれを配列として値を扱うことができます。

print $_REQUEST["hoge"][0]; //←111
print $_REQUEST["hoge"][1]; //←222

これをHTML_QuickForm+Smartyの環境で実現する方法を見つけたのでメモしておきます。
http://ml.php.gr.jp/pipermail/php-users/2005-December/028406.html

2007年6月21日木曜日

phpMyAdminのデフォルトテーマを指定する

config.inc.phpにて、以下の行を追加するだけです。
$cfg['ThemeDefault'] = 'darkblue_orange';

見ての通りです。『$cfg['ThemeDefault'] = 'テーマ名';』とするだけ。簡単です。
もちろん、指定するテーマがインストールされている必要があります。テーマはデフォルトで入っているものの他にも、sourceforgeでリリースされているものから選んで使うこともできます。
phpMyAdminはさまざまな案件で使っているため、複数を同時に開くなんてこともよくあります。案件によってテーマを分けることで単純ミスを防ぐ有効な手段になるんじゃないかと思っています。

2007年6月19日火曜日

ウェブキャンペーン用にシリアルキーを生成する

仕事で「キャンペーン対象ユーザーに対してシリアルキーを配布し、ユーザーがそのシリアルキーを使ってキャンペーンに応募することができる」というLAMPのウェブアプリケーションを作ることになりました。
最近よく見かける、缶コーヒーとかお菓子のキャンペーンみたいなのとほぼ同じ内容です。(規模はぜんぜん違いますが)
シリアルキーというのはWindowsやOfficeなどのPCソフトのシリアルキーのようなもの。たとえば「7RI15XRME8DHRI2F」という感じで、悪用できないようランダムで予測できないものが必要になります。
最初はMySQLの関数やphpの関数(md5とか)を使ってシリアルキーを作ろうと試みていたのですが、どうしても桁数が長くなってしまい(今回の要件では、シリアルコードは12文字以内)うまくいきませんでした。
そこでアプローチを変えて、Windows上で動作するアプリでシリアルキーを生成するソフトがないか捜してみたところ、「シリアルメーカー」というソフトを発見。
http://www.vector.co.jp/soft/win95/util/se154808.html
これだっ!!!
。。。と思ったんですが、シリアル作成にものすごい時間がかかることが判明。1万件の生成で20分以上かかりました。
そこでもう少し探してみたところ、同じ機能で高速な「RANer」というソフトを見つけました。
http://www.vector.co.jp/soft/win95/util/se112992.html
シリアルキー作成ではなくパスワード作成のためのソフトのようですが、問題なく使えます。
こちらは100万件のシリアルキー生成も1分程度で済みました。詳しいことはわかりませんが、たぶんアルゴリズムが根本的に違っているんでしょう。
あとは生成したシリアルキーをファイル保存し、MySQLにインポートして使うだけ。
こうしたキャンペーンアプリ構築は初めてだったので、一時はどうなることかと思いましたがなんとか実装できました。ふぅ

2007年6月8日金曜日

MS Accessのアプリを別PCに移したらMidが見つからないと言われた

仕事で使っているMS Accessのアプリケーションを別PCに移し、処理を実行したところ「Mid関数が見つかりません」というエラーが出た。

ググってみたら、同じようなトラブルの事例を発見。

http://www.accessclub.jp/bbs2/0048/beginter15715.html

どうやら「Eexcelオブジェクト(Microsoft Excel *.* ObjectLibrary)」が足りないようです。

ちなみに、移行元の環境はOffice2003
移行先の環境はOfficeXPで、Accessのみ2003になっています。

ExcelオブジェクトはExcelのバージョンによって内容が違うようなので、Excelを2003にバージョンアップしてみたところ、、、見事問題解決!!

普段Accessはあまり使わないので、解決にかなり時間がかかってしまいました。

2007年5月28日月曜日

PHP at Yahoo!

Yahoo!(米)でphpを採用しているというのは有名な話ですが、このたびPHPのカンファレンスにてYahoo!がどのようにPHPを使っているかのプレゼン資料が公開されたそうです。

以下のサイトにてその邦訳版が読めます。

PHP at Yahoo!を読む

Yahoo!のような世界一のポータルサイトと自分が仕事で関わる小中規模のサイトではまったくスケールが違いますが、高速化や安定運用の考え方からphp.iniの設定内容といった細かいところまで、いろいろな点で参考になりました。

アジェンダのみなのでさっと読むことができます。PHP使いの方は目を通しておくと良さそうです。

2007年5月16日水曜日

PHPでIPアドレスを扱うライブラリ(Pear::Net_IPv4)

実際に使ったわけではないんですが、PHPでIPアドレスの計算などをする場合はPearのNet_IPv4というライブラリが便利そうです。
http://pear.plus-server.net/package.networking.net-ipv4.html
マニュアルをちらっと見ただけでもかなり使えそうな感じが分かります。将来使う可能性大なのでメモしておきます。

MySQLでIPアドレスを扱う(INET_ATONとINET_NTOA)

たとえば以下のようなテーブルがあったとします。A,B,C社はそれぞれ、ip_fromからip_toまでのIPアドレス帯域を持っているという意味です。
company_table
companyip_fromip_to
A社192.168.1.1192.168.1.254
B社192.168.2.1192.168.2.254
C社192.168.3.1192.168.3.254

「192.168.2.123」のIPアドレスが、どの会社の帯域に含まれるのかを検索したい場合、INET_ATONというMySQL関数が使えます。

select * from company_table
where INET_ATON(ip_from) <= INET_ATON("192.168.2.123") and INET_ATON(ip_to) >= INET_ATON("192.168.2.123");

上記のSQLを実行すると、B社が結果で返ってきます。
INET_ATON(たぶんAddressTONumberの略)はネットワークアドレスを10進数に変換してくれる関数です。数値に変換することで、SQLでのネットワークアドレスの扱いがぐっと楽になります。ちなみに逆バージョンのINET_NTOAというのもあります。
http://dev.mysql.com/doc/refman/4.1/ja/miscellaneous-functions.html

2007年4月27日金曜日

PATH_INFOに「%2F」が含まれていると404エラーになる(AllowEncodedSlashesで 解決)

SEO対策として、PATH_INFOを使ってパラメータをphpスクリプトに受け渡す方法が一般的になりつつあります。

参考:phpスクリプトに拡張子なしでアクセスするためには

自分もこれまでさんざんこのやり方を使っていましたが、つい最近、PATH_INFOの中に「%2F」が含まれているとapacheが404エラーを返すことを知りました。ちなみに「%2F」は「/(スラッシュ)」にURLエンコードをかけた後の文字列です。

http://www.example.com/product.php/id/1234/code/ABC%2FDEF

たとえば上記の例。apacheの設定がデフォルト状態だと404エラーになります。
これを解消するにはAllowEncodedSlashesをOnにします。

AllowEncodedSlashes On

httpd.confやVirtualhostディレクティブにこの記述を追加してapache再起動します。
なお、この設定はApache 2.0.46以降でのみ有効だそうです。あとmod_rewriteなどを使うときにもAllowEncodedSlashesをOnにしていないとエラーが起こるようです。

2007年4月24日火曜日

cseでMySQL5に接続する

cse(Common SQL Environment)という、mysql、pgsql、oracleなどのDBMSに接続し、操作できるwindowsアプリケーションがあります。かなり便利なソフトで、以前はよく使っていました。が、このところもっぱらphpMyAdminを使うのでcseはまったく使わなくなっていました。

さて、今回仕事で、開発が完了したWebアプリのテーブル定義書を作ることになりました。ここでcseには右クリック一発でテーブル定義書を作成できるという便利な機能があることを思い出し、久しぶりにcseを起動しました。が、、、

mysqlに接続しようとすると、致命的なエラーを吐いて強制終了。困った・・・

調べてみると、cseはmysql3以下にしか対応していないんだそうです。なるほど。どうりで接続できないわけだ。

さらに調べてみると、ODBCでmysqlに接続すれば問題なく使えるというページを発見。さっそく試してみます。

まずはmysqlのodbcコネクタをダウンロードし、インストール。

http://dev.mysql.com/downloads/connector/odbc/3.51.html

上記ページから、mysql-connector-odbc-3.51.14-win32.msiをダウンロードしてインストール。続いてコントロールパネル>管理ツール>ODBCで接続情報を設定します。

以上で準備完了。cseを立ち上げ、先ほど作ったodbcデータソースを選択すると、、、接続成功!!

もちろん、テーブル定義書もバッチリ作成できました。

テーブル定義書ってまじめに作ると結構大変なので、相当な時間と労力を節約できたと思います。よかったよかった。

2007年4月20日金曜日

RAID対応外付ハードディスク「RHD2-U1.0T」を購入

IO-DATAの「RHD2-U1.0T」を買いました。
500GBのHDDが2基で合計1TB。RAID0(ストライピング)とRAID1(ミラーリング)に対応しています。接続デバイスはUSB2.0。ネットワークには対応していません。
I-O DATA RAID 0・1対応 USB 2.0/1.1 ハードディスク 1.0TB RHD2-U1.0T

価格: 47,250円
アイ・オー・データ
目的はエブリオで撮った0歳の息子の動画データを保管するため。
データが増えていく量はだいたい月2~6GBくらい。何かイベントごとがあったりするとデータ量がぐーんと増えます。これまでは『動画データを一旦余り物の30GBのHDDに格納し、データがたまってきたらDVDに焼く』という方法で保管していたんですが、かなり面倒な上焼くのに時間がかかるのでギブアップ。大容量HDDを買ってそこに放り込んでいくというやり方に変更しました。これで手間がかなり減るはず。
またRAID1ミラーリングを使うので、ディスク故障でデータが飛ぶ危険性も低くなります。非RAID単体ディスクよりかなり値段が高いですが、お金で買えない大切なデータを格納するためということで奮発しました。
なお、RAID1なのでデータの書き込みはやはりかなり遅め。体感速度ですが、普通の単体ディスクに書き込むのより2倍くらい時間がかかっている気がします。それでもDVDに焼くよりは断然早いし、そんなに頻繁に使うわけでもないので特に困ることはないと思います。
なお、普段使っているPCのデータは以前データを復旧した時に買った2.5インチの外付けHDDを使用するようにしています。コンパクトで転送速度も速いので、バックアップなど頻繁に使うのには2.5インチが便利ですね。
ハードディスクは大容量化、低価格化が進み、種類も豊富になっているので、これからは用途に応じて使い分けをするのがいいのかもしれません。
・ ・ ・
それから最後に。
「RHD2-U1.0T」に付属している「Sync with」というフォルダ同期ソフトを使ってみたんですが、何度やっても実行途中にエラーを吐いて落ちてしまいました。
仕方ないので「RealSync」というフリーのソフトを使いましたが、こっちは安定しています。というかシンプルで使いやすいので、こっちのほうが断然良いです(^-^;

2007年4月17日火曜日

PEAR::HTML_QuickFormについて色々

■リンク
addElementの第一引数で「link」というのが指定できる。下記のような感じ。
$form->addElement('link', "link_name", "link_label", 'http://www.yahoo.co.jp/', 'link_text', array("target"=>"_blank"));

これといって使い道は思い浮かばないですけど、一応メモしときます。
■unfreeze
よく使うfreezeのほかに、unfreezeもあるのを発見しました。
フォーム全体を凍結して、特定のフィールドだけ凍結解除、なんてことをやる場合は便利です。
なお、フォーム全体を凍結した後にhierselectフィールドをunfreezeすると、JavaScriptのonChangeが抜けてしまった状態でフォームが表示されるという問題もあるようです。こちらは解決法見つけられず。。
■複数選択セレクトメニュー(multiple select)

$DeptArray = array("1" => "営業部", "2" => "経理部", "3" => "人事部");
$form->addElement("select","user_dept","所属部署",$DeptArray);
$deptObj =& $form->getElement("user_dept");
$deptObj->setMultiple(true);

こんな感じで複数選択可能なセレクトメニューが使えます。
デフォルト値セットで値が複数ある場合は、カンマ区切りで値を渡せばいいみたいです。
■php4の場合は「&=」を使う
$deptObj =& $form->getElement("user_dept");

みたいな感じで、php4の場合「=&」を使わないダメです。(「参照渡し」って名前だったかな?)
いつもphp5で「=」だけで書いてるので、コピペとかするときによく間違えます。要注意

China Unicomからの大量アクセスを拒否

サーバー負荷が高くなっていたので、ログを調べてみたら
220.194.55.47

から大量のアクセスがあることがわかりました。ユーザーエージェントは
KDDI-SA31 UP.Browser/6.2.0.7.3.129 (GUI) MMP/2.0

auの携帯?と思ったんですが、上記IPを調べてみると

inetnum: 220.192.0.0 - 220.207.255.255
netname: UNICOM
descr: China United Telecommunications Corporation
descr: No.133,Taiyun Building,Xidan North Street
descr: Xicheng District,Beijing,China
country: CN   → (中国)

となっています。
中国 China Unicom」でググってみると、KDDIとの技術協力うんぬんというページが見つかります。
なので一瞬「KDDIがUNICOMと共同で検索エンジンロボットのテストでもしているのかな?」と思ったんですが、だったらユーザーエージェントに何かメッセージが入ってると思うので、やっぱり偽装だろうという結論に至りました。
というわけでさっそくアクセス拒否。すぐに効果があらわれて、サーバー負荷も落ち着きました。

2007年4月12日木曜日

mod_rewriteでリダイレクト。ただし画像は対象から外す

以前、「mod_rewriteを使って特定のIPやホストからの接続の場合のみ、コンテンツを表示する」というのをやりました。
今回その条件に加えて「ただし画像(gif,jpg,png)は処理の対象から外す」というのを付け足しました。
こんな感じです。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !^(.*)\.(gif|png|jpg|jpeg)$ [NC]
RewriteCond %{REMOTE_ADDR} !^192.168.1.$
RewriteCond %{REMOTE_ADDR} !^172.0.0.1$
RewriteRule .* ___maintenance.html

この設定の場合、飛ばし先が「___maintenance.html」になります。この「___maintenance.html」にて同一サーバー上の画像の呼び出しをしており、画像をリダイレクト対象から外す必要があったので、このような設定になりました。

2007年3月30日金曜日

mysqlでbigintを使う

現在担当している案件で、11桁の整数をデータベースに入力するという機能があります。
で、int型のフィールドに「12345678901」という数値をinsertすると、登録される値は「2147483647」になってしまう。
調べてみたら「2147483647」はint型の限界なので、bigint型を使う必要があることが分かりました。
以下のページに一覧表があって分かりやすいです。
http://www.javadrive.jp/mysql/datatype/index1.html

2007年3月17日土曜日

21-domainのBハウジングサービス(激安専用サーバー)

21-domainという、激安ドメインレジストラがあります。
http://21-domain.com/
ここはバリュードメインに乗り換える以前に利用していたことがありました。久しぶりにこのサイトを訪れたんですが、Bハウジングサービスというの専用サーバーサービスをやってることを知りました。
http://21-domain.com/html/m2011.html
実は家庭の事情で今年の12月に引越しする予定で、引越し後は現在使っている自宅サーバーが使えなくなってしまうのです。(※引越先のマンションは全戸強制的にJCOMプロバイダーを利用させられることになってます。JCOMは自宅サーバー禁止)
そんなわけで、12月までに安い専用サーバーを契約して移行を済ませておかなくてはいけません。
今のところ第一候補はさくらインターネットの専用サーバーサービス。
お値段は「初期¥29,800、月額¥6,800」です。
他にも安いところはないか探してはいるんですが、専用サーバーはどこも高い。
安くても¥9,800くらいなので検討の余地もほとんどないという状態。なので、さくらでほぼ決まりかな、、、と思っていました。
そこで偶然見つけたこのBハウジングサービス。
お値段は「初期¥5,980、月額¥5,980」。さくらを上回る安さだ!!
OSがWindowsかFreeBSDしか選べないという制限はあるものの、約¥1,000の差は大きい!これは一躍最有力候補になるか?!
・・・と思ったんですが、よくよく見てみると、、、
UPS経由による電源供給は月額1,000円プラスとなります。尚、本体無料貸出サーバではUPS経由により月額は6,980円となります。

とのこと。
結局のところ、さくらとあまり変わらない。初期費用は高いけれど実績を考えてるとさくらのほうがいいかな、、、と思っています。
省電力サーバーを持ち込めれば¥1,000のプラスはなくなるみたいですが、持ち込みだといろいろ面倒そう。まだ時間はあるので、じっくり調査&検討しようと思います。

LIKE検索より断然高速なお手軽日本語全文検索

http://www.tatamilab.jp/rnd/archives/000390.html
こんな手法があるそうです。
「全文検索=LIKEでやるもの」と当たり前のように思っていたので、このやり方は勉強になります。記事中に書かれているように「INSERT/UPDATE処理が遅くなる」という副作用があるのは注意が必要ですが。
ま、自分が作るアプリは小~中規模ばかりなので、LIKEで十分かも。
将来必要になるかもしれないので、念のためメモっておきます。

phpMyAdminの自動ログアウト時間を長くする

phpMyAdminをクッキー認証で使っていると、ログイン状態で何もしない状態がしばらく続くと自動でログアウトされる仕様になっています。この自動ログアウト時間、デフォルトでは1800秒、つまり30分に指定されています。
この30分という時間がなかなか微妙。コーディングをしている時などは30分くらいすぐ経過してしまうので、phpMyAdminでデータを操作する際にはいちいちログインしなおさないといけません。
なので、config.inc.phpに以下の行を追加して自動ログアウトになる時間を延ばしました。
$cfg['LoginCookieValidity'] = '18000';

上記の設定だと18000秒=300分=5時間で自動ログアウトとなります。
お好みで秒数を変えて使えるので、個々の環境にあわせて設定することができます。

2007年3月14日水曜日

PostfixでOP25B対応

会社のプロバイダがOP25Bを実施したため、会社から自宅のSMTPサーバーに接続できなくなってしまった。

ググってみると、さすがPostfix、参考になるページがワンサカ出てきました。

とりあえず、一番手軽なSubmission Port(ポート:587)を利用する方法で対応することに。
自分の環境で必要な作業はmaster.cfに以下の行を追加するだけでした。


#OP25B
submission inet n - n - - smtpd  
    -o smtpd_etrn_restrictions=reject


あとはファイアウォールで587ポートを開放し、メールクライアントの設定を変更して終了です。
もちろんpostfixの再起動も忘れずに。

※2007.12.20追記
最近引越してプロバイダがJCOMになりました。で、上記の設定だけではメールが送信できなかったので、main.cfに

relayhost = [smtp.jcom.home.ne.jp]
を追加することで対応しました。

JCOMに限らず、同じような制限をしてるISPであれば指定のSMTPサーバーを使えばOKだと思います。

2007年3月7日水曜日

まるごとJavaScript & Ajax ! Vol.1

まるごとJavaScript & Ajax ! Vol.1」を読みました。
今まで読んだJavaScript,Ajax関連本の中では一番のおすすめです。特にPrototype.jsの章はすぐにコーディングに使える内容だったので非常に良かったです。
Google Web ToolkitやRuby on Railsのところはひとまず使わないので読み飛ばしましたが、それ以外の部分を読むだけでもかなりのボリュームがあります。実用的なものから、JavaScriptの可能性を探るものまで。読み応えがある一冊でした。
まるごとJavaScript & Ajax ! Vol.1


価格: 1,995円
天野 仁史
インプレスジャパン

2007年3月6日火曜日

mod_rewriteを使うには「Options FollowSymLinks」が必要

mod_rewriteが必要になったので、apacheを「--enable-rewrite」オプションをつけて再コンパイルした。

これで準備OK。さあ、リライトできるかな・・・

と思ったら、エラーが。

.htaccessに記述したんですが、該当ディレクトリ以下すべてのページで「ページが見つかりません」となってしまう。記述は間違ってないはずなんだけど、どうしてだろう。しばらく色々試してみるも、どれもうまくいかない。

そこでapacheのエラーログを見てみると、

Options FollowSymLinks or SymLinksIfOwnerMatch is off which implies that RewriteRule directive is forbidden

というエラーが出ていた。mod_rewriteを使うディレクトリでは「Options FollowSymLinks」が必要らしい。

さっそくhttpd.confに「Options FollowSymLinks」を追加。gracefulリスタートをかけると、今度は成功!!

何はともあれ、エラーが起こったらまずはログを見ましょう。ということですね。

2007年3月2日金曜日

windowsのphpはrequire_onceやinclude_onceで大文字小文字を区別しない

ということらしいです。
http://search.net-newbie.com/php/function.require-once.html
ローカルで開発をしているときにハマってしまい、それで気がつきました。

javascriptでの変数の型変換

javascriptの変数は文字列型と数値型がある。
それぞれ型の変換をするには以下のようにすれば良い。

■数値型→文字列型変換

hoge = 123; //数値型
hoge+=""; //空の文字列をプラスして文字列型に変換
alert(hoge+45); //結果は12345


■文字列型変換→数値型

hoge = "123"; //文字列型
hoge-=0; //マイナスゼロをして数値型に変換
alert(hoge+45); //結果は168


※プラスゼロではダメで、マイナスゼロでないといけないらしい。

※追記
関数を使って明示的にやる方法もあるようです。こっちのほうがわかりやすいですね。
http://blog.goo.ne.jp/kori39/e/03d9ce6a3180e9a553644a763fc42542

※追記2011/08/14
parseInt関数を使って変換する場合、parseInt("08",10)という具合に、第二引数に10進数を指定すると良い。
もしくはNumber関数が一番シンプルでわかりやすいかも。

2007年3月1日木曜日

JavaScriptで連動する2つのセレクトメニューを作る

よく見かけるアレです。例えば不動産系のサイトで、沿線を選択すると駅が選択可能になる、みたいなやつです。

今回はアレをJavaScriptで作ってみました。なお、配列の代わりにJSONを、ライブラリはprototype.jscommon.jsを使ってます。

そして、完成してから気がついたんですが、これってPearのHTML_QuickFormのhierselectを使うと一瞬で作れるんですね。

phpをお使いなら断然そっちを薦めます。自分も結局JavaScriptのはやめてhireselectのにしましたから。。

一応、作ったものをアップしときます。

まだJavaScriptにあまり慣れてないので、かなり手間取ってしまいました。


<html>
<head>
<title>JavaScriptで連動する2つのセレクトメニューを作る</title>
<script type="text/javascript" src="common/prototype.js"></script>
<script type="text/javascript" src="common/common10.js"></script>
</head>
<body>
<script type="text/javascript">
var menuItem = {
        1: [
            {"code": 1, "name": "東京"},
            {"code": 2, "name": "大阪"},
            {"code": 3, "name": "名古屋"}
          ]
        ,
        4: [ 
            {"code": 5, "name": "ニューヨーク"},
            {"code": 6, "name": "ワシントン"},
            {"code": 7, "name": "ロス"}
          ]
        ,
        8: [ 
            {"code": 8, "name": "ロンドン"},
            {"code": 8, "name": "マンチェスター"},
            {"code": 9, "name": "リヴァプール"}
          ]
        };
addEvent(window,'load',init,false);
function init()
{
  addEvent($("form1").country, 'change', setMenuItem, false);
}
function setMenuItem()
{
  //初期化
  var option_cnt = $("form1").city.options.length;
  for(var i=0; i<option_cnt; i++)
  {
    $("form1").city.remove(0);
  }
  var n = $F("country");
  for(var i=0; i<menuItem[n].length; i++)
  {
    $("form1").city.options[i] = new Option(menuItem[n][i]["name"],menuItem[n][i]["code"]);
  }
}
</script>
<form name="form1">
<select name="country">
<option value="1">日本</option>
<option value="4">アメリカ</option>
<option value="8">イギリス</option>
</select>
<select name="city">
</select>
</form>
</body>
</html>

FireBugとFireBugLite

ここ最近話題のJavaScriptのデバッグツール、FireBug。自分も愛用してます。
導入は非常に簡単なので、javascripterならとりあえずインストールしておくといいです。
FireBug
http://www.getfirebug.com/
IEやOperaにはFireBug Liteが使えます。FireBugよりは多少機能的に劣りますが、これがあるとだいぶ楽になります。
FireBug Lite
http://www.getfirebug.com/lite.html
昔はひたすらalertでデバッグしてました(今もしますが)けど、こういうツールがあるとホント助かります。

2007年2月28日水曜日

javascriptでforeachと同等のことをする

「for+in」を使うとできます。なかなか便利。

var hairetsu = [1,2,3,4,5,6];
for (var i in hairetsu){
alert(i);
}


こんな感じになります。

prototype.jsのeach関数などを使っても同様のことが実現できるようです。

2007年2月26日月曜日

バリュードメインで登録済みのドメインを割引価格で更新する

http://www.value-domain.com
ドメイン取得・更新が国内最安値クラス(com/net/org/info/bizが990円)で、さらに無償オプションでDNSサーバー、ダイナミックDNS、サーバースペース(広告付き)まで付いてくるという、激安且つ便利なバリュードメイン。もちろん自分も愛用してます。
そんなバリュードメインがさらなる値下げを断行。なんと、com/net/org/info/bizの登録・更新が790円になりました!!
どうやら上位レジストラを変えることでより安くなったようです。これはもう、国内には敵無しなのではないでしょうか?
ただしこの価格はこの値下げが適用された後に登録されたドメインのみが対象なので、自分のように何年も前に登録したドメインには適用されず、普通に更新しようとすると990円かかってしまいます。
でも説明をよく読んでみると、値下げ前に登録したドメインでも移管の手続きをすることで割引を受けられることが分かります。移管というと、普通「お名前.comからバリュードメインへ移管」みたいな感じでレジストラを変えるイメージがありますが、今回は「バリュードメイン内で、990円のレジストラから790円のレジストラに移管」という処理になります。
手続きはバリュードメイン内のメニュー、割引価格で移管から行うことができます。
なお、自分は移管完了までに3~4回ほどエラーで途中で処理が止まってしまうことがありました。ま、説明をよく読んでいなかった自分が悪いんですが、、、
以下、自分が見落としていたポイントです。これから移管する人は参考にどうぞ。
1.whoisのメールアドレスが自分のものになってることを確認
whoisで確認できるドメイン所有者の連絡先メールアドレスが、利用可能な自分のメールアドレスでないと手続きが進みません。
自分の場合、メール、住所、名前などのwhois情報は全部バリュードメインのものにしており、メールアドレスが「domain-contact@digi-rock.com」になってました。これだと移管確認メールを受け取れないので、whois情報を修正しておく必要があります。
2.認証鍵を確認しておく
移管には認証鍵が必要です。この認証鍵は移管をするとき以外使わないので、そんなものが存在していることすら知らなかったんですが、「メニュー→取得済みドメイン一覧→whois情報修正」の画面の一番下のほうにあります。
3.ドメインロックを外しておく
自分の場合、割引価格で移管しようとしたドメインがロックの状態(whoisで「Status: Locked」)になっていました。このままだと移管できないので、ロックをはずします。「メニュー→ドメインロックの変更」にてロックをはずせます。
自分が移管でつまづいたのはだいたいこんなところです。お気をつけください。
今回自分は5個のドメインを割引価格で移管したので、年間1000円のコスト削減になりました。
浮いたお金でもう一個ドメイン取っちゃおうかと考えてます^-^
http://www.value-domain.com

2007年2月21日水曜日

WEB+DB PRESS Vol.35

WEB+DB PRESS Vol.35

価格: 1,554円
技術評論社
WEB+DB PRESS編集部
Ajaxの定石」という特集目当てで購入。期待通りの内容で、Ajaxを使ったシステム開発の参考になる内容でした。
あと「Smartyプラグインでらくらく開発」という記事も良かったです。これまでSmartyのプラグインってあまり情報がなかったので自分でプラグインを作るって発想がなかったんですが、この記事のおかげでプラグインの概要が分かりました。次の開発ではプラグイン作って使ってみようと思います。
WEB+DBプレスはたまに読んでるんですが、すぐに実践できるような内容が多いので役に立ちますね。

2007年2月18日日曜日

Windowsでシンボリックリンクを使う

Windows上で動作する開発環境ツールxamppにPerlのアドオンツールがあるのを知ったので、早速入れてみました。

インストールは超簡単。インストーラをDLして次へ、次へ、次へ、、、をやるだけ。httpd.confも勝手に書き換えてくれます。

このままスンナリ行くかな、と思っていたけど、問題発生。

アドオンツールでインストールされるPerlのパスが「C:\xampp\perl\bin」なのです。

UNIX上で作ったcgiはみんな「#!/usr/local/bin/perl」とか「#!/usr/bin/perl」なので、このままでは動かないのです。当たり前ですが。

こんなときUNIXならシンボリックリンク一発で解消ですけど、Windowsにはシンボリック機能がない。(ショートカットはあるけど、シンボリックリンクとしては使えない。)

うーん、困った。cgiファイルを一個ずつ開いて一行目を修正するのなんて絶対やりたくないし・・・

そこでグーグルで調べてみたら、Windowsでシンボリックリンクを作成できるツールを発見しました。

リンク作成シェル拡張 for Windows 2000/2003/XP
http://eside.homeip.net/free/symlink2k.html

上記サイトが閉鎖してしまったので、ベクターへのリンクを張っておきます。
http://www.vector.co.jp/soft/winnt/util/se184746.html

さっそくインストール。そして「C:\xampp\perl\bin」へのシンボリックリンクを「C:\usr\local」に作成すると、、、CGIが動いた!!

普通にWindowsをクライアントとして使う上ではシンボリックリンクは必要ないと思いますが、知っておいて損はないと思います。

ちなみに、WindowsVistaではシンボリックリンクは標準装備なんだそうで、将来的にはこのツールも必要なくなりそうです。もっとも、Vistaに乗り換えるのはいつになるかわかりませんけど。

最後に。このツール付属の右クリックメニューはすごく便利です。ファイルのフルパス名をクリップボードに入れてくれたり、選択したフォルダでコマンドプロンプト開いてくれたりなどなど。かゆいところに手が届くツールだと思います。かなりの優れものです。

ツールの使い方
1.シンボリックリンクを作りたいファイルやフォルダを右クリックドラッグし、シンボリックを作りたいフォルダへドロップ
2.表示されるメニューから[リンクを作る(L)]を選択する

忘れやすいのでメモしておきます。

2007年2月17日土曜日

ハードディスクのデータを完全に消去するには

先日、フォーマットしたHDDからデータを復旧した後、気になってデータを完全に消去する方法を調べてみました。
ググってみるといろいろなサイトが見つかりましたが、個人的にこちらのサイトにすごく詳しく、また分かりやすかったです。
http://www.cybernetic-survival.net/w_s.htm
今後、友人にPCを譲ったり、オークションで売ったりする時は必ずデータを消去するようにしようと思います。
ていうか、以前不要になったPCをヤフオクで売ったことがあるんだけど、あの時はOS再インストールしただけでした。もしかしたらあのPCに入ってたデータ、抜き取られてるのかも。お、恐ろしい。。((((;゚Д゚))))

2007年2月15日木曜日

WindowsでUNIX系コマンドを使うツール「NT Tools Framework」

Windwos上でUNIX系コマンドを使うツールとしてはCygwinが有名ですが、個人的にはこちらのツールを愛用してます。
NT Tools Framework
http://www.piedey.co.jp/softs/ntuxtl.html
ls,cp,rmなど、よく使うUNIX系コマンドが、Windowsのコマンドプロンプトで使えるようになります。
普段UNIX系OSを使うと、コマンドプロンプトで「ls」って打って、「あ、いけね。dirだった」みたいなことをやると思うんですが、これを入れておけばlsも通ります。
インストールも簡単。ファイルをDLして解凍し、binディレクトリをどこか適当なパスに置いて、環境変数PATHに追加するだけ。
入れておくと何かと便利なツールです。
こちらのページの解説が詳しいです。
http://qwerty777.s57.xrea.com/winunix/command.htm

2007年2月14日水曜日

xamppのPHP+MySQL文字化けを解消

クライアントマシンのOSを再インストールしたので、現在xampp環境を再設定中。
さて、xamppでインストールされたmysqlをデフォルトのままで使うと、phpと連携した場合に全部の文字が「?」(はてな、ハテナ)になってしまう現象が発生することがあります。
そんなときはphpスクリプトひとつひとつに「set names ...」を入れれば解決!、、、なんて作業は面倒くさくてやってられません。速やかにmy.cnfの設定を変更します。
my.cnfを以下のように編集。
#character-set-server = latin1 ←コメントアウト
#collation-server = latin1_general_ci ←コメントアウト
character-set-server = utf8 ←追加
collation-server = utf8_general_ci ←追加
skip-character-set-client-handshake ←追加

そして忘れずにmysqld再起動。
自分の場合はこれでこれで文字化けがすっきり解消しました。

フォーマットしたHDDからデータ復旧

最近、愛機Let's note CF-Y4の動作(特に起動や終了)が遅くなってきているのが気になっており、この週末を利用してOSのクリーンインストールを実施しました。
そこで悲劇が。
詳しい話は割愛しますが、大ポカをしてバックアップデータを紛失した状態でLet's noteにOSを再インストールしてしまいました。。。
仕事のデータも、mp3も、息子の写真も、、、すべて消えた。
終わった。何もかも終わった。。。
、、、と思ったんですが、そういえばHDDのデータは復旧ツールを使えば戻せるという話を思い出し、早速グーグル先生で調べてみました。
探すと結構いろいろなツールがありました。特にファイナルデータというソフトは名前を聞いたことがあるだけあって、結構有名なものらしい。
それからR-StudioデータレスキューPROというソフトも。こちらは見るのも聞くのも初めてだったんですが、ウイルスソフトで定評のあるNOD32を出しているキャノンシステムソリューションズ社製のものなので、信用できそうな雰囲気。
お値段は、ファイナルデータが8,715円に対し、R-Studioは10,290円。いずれもダウンロード販売です。
とりあえず購入前にこの2つの体験版を落とし、HDDのスキャンをかけてみる。
【限定特価】ファイナルデータ2007 特別復元版
おすすめ度 :
コメント:

R-Studio データレスキュー PRO ダウンロード標準版
おすすめ度 :
コメント:

まずはR-Studioから。スキャンは2時間ほどで完了。しかも、どうやらデータはほとんど復旧できるようだ。すげー
続いてファイナルデータ。スキャンは、、、一晩かかってようやく完了。遅い。。復旧できるデータもR-Studioと大差ない様子。
ちなみに自分の感覚では、ファイナルデータは初級者向け、R-Studioは中上級者向け、って感じがしました。
ファイナルデータはウィザード風のインターフェース。シンプルで分かりやすいですが、かなり大味。
R-Studioはエクスプローラー風のインターフェース。結構とっつきにくくて、操作に手間取りましたが、慣れさえすれば多機能な分、心強いです。
というわけで、R-Studio購入が決定。ベクターのダウンロード販売で買いました。こういうとき、DL販売って便利ですね。
さあ、いよいよデータ復旧です。あたりまえですが、復旧するデータの容量に応じたデータ領域が必要になります。ちょうど空いているハードディスクがなかったので、ダッシュでヨドバシカメラまで行って、これを買ってきました。
HD-PHG80U2/UC USB 耐衝撃/セキュリティ HD

いやあ、最近の外付HDDって便利ですね。コンパクトでかっこいいし、ケーブル細いし、USBから給電できるし、仮想CD/DVD機能とかもついてるし、すごい便利。
気を取り直して、データの吸出し開始!!
フォーマットされたHDDからグングンデータが吸い出され、外付HDDに取り込まれる。一時間ほどで作業は完了。
カテゴリ構造が一部を除いて壊れており、それらを元あった場所へ戻すという作業が発生しましたが、結局データはほぼすべて復旧することができました!
いやー、本当に助かりました。神様、仏様、R-Studio様です。HDD関連でトラブった場合は、焦らず騒がず、まずはデータ復旧ソフトを試してみるといいですね。勉強になりました。
・ ・ ・
余談ですが、興味本位でデジカメで使ってるSDカード(512MB)をR-Studioでスキャンしてみました。すると、出てくる出てくる。削除してゴミ箱に入れた画像データもかなりの量が復旧可能でした。
「データの削除は論理的に削除フラグを立てるだけだから、復旧しようと思えば簡単に復旧できる」っていう話はよく耳にしますけど、実際にこうやって見てみると本当なんだなぁーってのが実感できました。
間違ってファイルを削除しちゃってもR-Studioがあればかなりの高確率で復旧可能ということです。これは便利だ。
でも、逆に言うとPCを他人に譲ったり中古屋に売ったりするときは注意が必要ってことですね。怖い怖い。
今回の騒動ではかなりのお金と時間を費やしてしまいましたが、いろいろな意味で勉強になりました。

2007年2月1日木曜日

Ajax実践テクニック

Ajax実践テクニック

価格: 2,940円

高橋 登史朗
秀和システム
Ajaxのライブラリに特化したリファレンス本です。
prototype.jsからYahoo!UI、Dojoなど、さまざまなライブラリと、その主だった関数やクラスが紹介されています。そして後半部分ではAjaxアプリのソースコードと解説が載っています。
個人的にこの本はおすすめです。リファレンス本なので、まず買って損はないと思います。
ちなみに自分の場合、そもそもprototype.js以外にも優秀なライブラリがたくさんあること自体知らなかったので、読んでいてかなり新鮮味がありました。「そのくらいウェブで情報収集しとけよ」って感じですけど、自分は新しい分野への最初の一歩は本から入るタイプなので、かなり助かりました。
あとはこれらの便利な関数を組み合わせてソースコードを書けるようになれば完璧。ま、それをどうやって身につけるかが問題なわけですが。。
そろそろ実際にソースコード書いて体で覚える頃合かなー、と思いつつも、もう一冊くらいAjax本を読んでみようかと思ってます。

2007年1月30日火曜日

サーバサイドAjax入門

Ajax本3冊目。
正式なタイトルは『サーバサイドAjax入門 Java/PHP/ASP.NET連携でAjaxプログラミングを極める!』。長い。
サーバサイドAjax入門 Java/PHP/ASP.NET連携でAjaxプログラミングを極める!

価格: 2,940円
山田 祥寛
翔泳社
これまで読んだ2冊はクライアントサイドのAjaxがメインの内容だったんですが、この本はサーバーサイドがメイン。Java、PHP、ASP.NETの3つのサーバサイド言語のAjaxライブラリが紹介されています。自分はPHPしか使わないのでJavaとASPは飛ばして読んだため、あっという間に読み終わりました。
とりあえず気になっていたPEAR::HTML_Ajaxの概要がよく分かったのは収穫でした。あとは非常に簡潔ながらもprototype.jsのリファレンスがあったのもうれしい。ていうかprototype.jsってスゴイ。Ajaxのみならず、普通にJavaScriptでコード書くときには絶対必須のライブラリになりそうです。

Vine3.2にGD.pmをインストール

perlのGD.pmをインストールしようと思い、
cpan> install GD

とやったところ、
/usr/bin/ld: cannot find -lXpm

というエラーが。
ググってみたら、Vine3.0で同じような問題を抱えた人を発見。
http://search.luky.org/vine-users.6/msg06835.html
Vine Linuxでは必要最小限以外のdevel系パッケージはCDに収録されないそうで、自分でインストールする必要があるそうです。
# apt-get install XOrg-devel

XOrg-develというのはX Window System関連のライブラリらしい。
これで必要なdevelパッケージがインストールされ、GD.pmのインストールも無事完了しました。

2007年1月26日金曜日

MySQLのバイナリログを削除する

自分が開発したLAMPのシステムに異変発生。

普通にアクセスできるものの、データの登録や更新ができない。つまり、selectはOKだけとinsertやupdateがNG。

この時点でだいたい原因は想像できた。サーバーにログインして「df -h」をしてみると、やっぱり、/varディレクトリが100%になっている。つまりMySQLが更新ログ(バイナリログ)をディスクに書き込めず、処理ができなかったというわけだ。

よく見てみると、「/var/lib/mysql/DB名.log」というファイルが肥大しまくっている。実は、開発時にデバッグ用にmy.cnfでlogオプションを有効にしており、本番運用開始後もずっとそのままだったのが原因。

さっそくログファイルを削除し、my.cnfのlogオプションをコメントアウトしてmysqlを再起動。問題は無事、解消されました。

ひとまず一件落着なんですが、同じディレクトリにあるバイナリログを見てみると、なんと116までログが増えていた。こちらも合計するとかなりのサイズなので、削除することに。

バイナリログ処理関連の構文はこちらに載ってます。
http://dev.mysql.com/doc/refman/4.1/ja/replication-master-sql.html

ひとまず、昨年末までの分を削除。
mysql> PURGE MASTER LOGS BEFORE '2006-12-31 23:59:59';

これでバイナリログがごっそり消えてすっきり。/varディレクトリの空きもぐっと増えました。
ついでに、日付指定をしないで全部のバイナリログを消す場合はRESETを使います。
mysql> RESET MASTER;

それから、今回のようなログ肥大化を防ぐために、my.cnfに下記を追加しました。
expire_logs_days = 7
7日以上経った古いバイナリログは削除する、という設定です。

詳細はこちら↓
http://www.limy.org/program/db/mysql/mysql_variables.html

AJAX Webアプリケーション アイデアブック

Ajax本2冊目。これも超ナナメ読みで済ませました。
AJAX Webアプリケーション アイデアブック


価格: 2,100円

羽田野 太巳
秀和システム
感想は、、ビミョー。。
抽象的な言い方なんですが、良くもなく、悪くもない感じ。延々とサンプルコードが続くので読むのが苦痛なんですが、ところどころで「ナルホド」と思わせるところがあったりもします。あと個人的に気になっているprototype.jsについての解説がほとんどなかったのが残念でした。
参考書に対して高望みしすぎかな?とも思いますが、懲りずに3冊目読み始めてます。

2007年1月24日水曜日

AutoMySQLBackup: MySQLの自動バックアップスクリプト

いいものを発見しました。
http://members.lycos.co.uk/wipe_out/automysqlbackup/
MySQLのバックアップ用シェルスクリプトです。
ダウンロードしたファイルの冒頭でDB名やユーザー、バックアップするDBなどを設定し、サーバーにアップして実行するだけですぐ使えます。
日別、週別、月別でバックアップをとってくれて、gz圧縮もしてくれるのでファイルサイズも小さくて済みます。また、詳しく見てないのですが、ADVANCED OPTIONSというのもあるので複雑なバックアップ設定もできるっぽいです。
今後バックアップが必要な場合はこのスクリプト使おうと思います。

2007年1月23日火曜日

Ajaxを使ったPOSTでのリクエストが失敗する

現在Ajax習得中。
POSTでのデータ送信を試していたところ、なぜかうまくいかない。リクエストは送信できるのだけれど、パラメーターを受け取れないらしい。
失敗した↓
post_data = "param1=aaa&param2=bbb";
httpObj.open("POST","test.php",true);
httpObj.send(post_data);

これはどうもおかしいぞ、と思ってググってみたら解決方法を発見しました。
成功した↓
post_data = "param1=aaa&param2=bbb";
httpObj.open("POST","test.php",true);
httpObj.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");
httpObj.send(post_data);

こちらを参照→http://meiblog.seesaa.net/article/24638899.html
原因はめんどくさいから調べてないんですが、サーバー側の設定ぽい感じです。

2007年1月16日火曜日

入門Ajax

2007年の目標は、Ajaxをマスターして業務でバリバリ使えるようになること。に設定しました。
で、ひとまず会社に置いてあったAjaxの入門書を読んでみることに。
入門 Ajax

価格: 2,709円

高橋登史朗
ソフトバンククリエイティブ
サンプルコードが多かったので、おもいっきり斜め読みして1時間程度で読み終えました。とりあえず、Ajaxがどんなものなのか概要は把握できたのは良かったです。ただ、以下のエントリで指摘されているように、欠点もかなり多いと思います。
入門Ajaxが初心者にオススメできない理由
http://la.ma.la/blog/diary_200511260950.htm
なにぶん古い本(2005年末発売)なので仕方ないところもあるかもしれませんが、Pearとか使って可能な限り効率的に開発を進めたい、と思う自分のような人間にとってはライブラリの紹介や説明がないのは困ります。
、、、と思っていたら、最近増補改訂版が発売されたみたいです。
入門Ajax 増補改訂版

価格: 2,709円

高橋登史朗
ソフトバンククリエイティブ
こっちは読んでないのですが、『本書は前作「入門Ajax」に、基礎知識や旬のライブラリ解説などを大幅増補しました。』とあるのでだいぶ改善されているのかもしれませんね。
とりあえず、あと2~3冊くらいAjax関連本を読んでみようと思ってます。