Home

ベリラボ

Windows の メモ帳は使用禁止だ!!

個人的には、Unix/Linux上で使うシェルスクリプトや設定ファイルは、vi 等を使ってUnix/Linux上で編集しているが、同じプロジェクトのメンバーには、Windows上で編集してUnix/Linux上にファイル転送をするという面倒なことをやっている人も少なからずいる。

vi等のテキストエディタに慣れていないと使いづらいのも確かにうなづけるが、今回は、「Windows の メモ帳 を 使用禁止 」にさせて頂いた。

文字エンコーディングにUTF-8の文字が入ってテキストファイルをWindows のメモ帳で開き保存すると、ファイルの先頭にBOM(Byte Order Mark)といわれる EF BB BF が付いてしまう。更にBOMを取ることができない。

今回問題となったのは、apacheの設定ファイルである .htaccessファイルをメモ帳で開いて編集後、保存してLinux上にファイル転送したところ、apacheが Internal Server Error で停止してしまった。(.htaccessファイルに日本語が含まれているのも問題ではあるが…)

ちなみに Windows上のTeraPADの場合、UTF-8N で保存すると BOMが付かないし、秀丸でも BOMをつけるというチェックボックスがあるので、こちらを使うとよさげ。もっとよいのは、Window上で編集せずにUnix/Linux上でvi等で直接編集がよいのだが。

LWP::UserAgent で、cookie 保存

Perl LWP::UserAgent で、cookie を保存するサンプルプログラムをwikiに掲載しました。

Perl 5.8.8 上で確認しています。

サンプルプログラム

プロジェクト管理/ソース管理ツール trac インストール手順

Webベースで、プロジェクト管理とソース管理までできてしまうツール trac のインストール手順をwikiに書きました。

是非読んでください。

tracインストール手順

DNS(bind)の誤解

DNS(bind)で誤解していました。(汗)

DNS(bind)で、tcpの53番ポートを使うのは、ゾーン情報の転送時のMaster/Slave間で行うのみと理解していました。

が、よくよく調べてみると、udpでの問い合わせで、応答が 512バイト をこえる場合、tcpで通信するのだそうです。

ちょっと古い文書ですが、IPCHAINS-HOWTO.txt

「 5.2.2. DNS (ネームサーバー) への TCP 接続」 に記述があります。

CentOS 5.2 で、ntp の同期不具合

CentOS 5.2 にしてから、ntp.nict.jp と時刻同期が取れない(reachがゼロ)の状態となっていました。色々調べてみたら、どうやら IPv6が関係しているのが原因だったみたいです。

/etc/ntp.conf に、

server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
server ntp.nict.jp
server ntp.nict.jp
server ntp.nict.jp

と書いていたのですが、

server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp
server -4 ntp.nict.jp
server -4 ntp.nict.jp
server -4 ntp.nict.jp

のように修正したら同期(reach)とれるようになりました。

※追記
nict.jpではmaxpoll 8(256秒間隔)以上にとのことなので、

server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp
server -4 ntp.nict.jp maxpoll 8
server -4 ntp.nict.jp maxpoll 8
server -4 ntp.nict.jp maxpoll 8

ですね。

CentOS 5.2 + fml 4.0 のメモ

いまさらながら FedoraCore 3 (FC3) で動かしていた fml(4.0) をCentOS 5.2 に移行しようとして、makefml のコマンドを打ったら、以下のようなエラーが発生。

$ ./makefml showconf fml4test
Hmm… inspecting your system by config.guess failed?
I failed to inspect your system.
THIS HOST (XXXXXXX.XX.jp) IS [unknown-unknown-unknown]

PLEASE DEFINE $CPU_TYPE_MANUFACTURER_OS IF POSSIBLE
If you cannot define $CPU_TYPE_MANUFACTURER_OS
FML may work with “unknown-unknown-unknown”
(I assume BSD like if “unknown-unknown-unknown”)
cpu-manufacturer-os [unknown-unknown-unknown]

THIS HOST (cent52-154.kissa.ne.jp) IS [unknown-unknown-unknown]

sh -x ./makefml showconf fml4test
と流してみると、ld とか cc とかコンパイル系のコマンドを使っていることが判明。

# yum -y install gcc

で、gccをインストールしてやってから、makefml をやってみたらすんなりうまくいきました。

Googleマップ の ストリートビュー

 Googleマップ の ストリートビュー機能が関東圏でも使えるようになってます。

Googleマップ http://maps.google.co.jp/

すごいです!!

何がすごいかって、技術的にもさることながら、労力も大変かかってそうです。それと、住所がわかるとその人の住んでる家とか周辺の感じとかが一発でわかってしまいます。

自分の住所とかで検索して試してみてください。

よいプログラム書くために

よいプログラム書くためには、どうすればいいか? を簡単に書きます。

「1から10までの和を求めるプログラムを書け」 という命題にどう書くでしょう。
プログラムを習いたての人に依頼すると、perlだと以下のようなプログラムも多く見かけます。

#!/usr/bin/perl

use strict;

my $n=10;

my $s=0;
for(my $i=1;$i< =$n;$i++) {
$s+=$i;
}

print “s=”,$s,”\n”;

このプログラムで間違いはありません。
でも、このように書くとnが少ない数であればよいのですが、数万や数億のオーダーになった場合や和を求めるだけでなく、多数の項目の平均などを求めようとした場合、ぐっと遅くなってきます。

プログラム上級者であれば、以下のようになります。

#!/usr/bin/perl

use strict;

my $n=10;

my $s=(1+$n)*$n/2;

print “s=”,$s,”\n”;

このように和の公式を使ってnの値によって実行速度に違いがないようにします。

要するに、よいプログラムを書くためには、perlやPHP、Javaなどの言語を学習するだけでは、上達しないということです。色々な知識を学んだ結果としてよいプログラムを書けるようになります。
プログラムを習いたての人は、色々な知識も学習するとよいですよ。

MySQL 5.1 on CentOS 5.2

CentOS 5.2 上にMySQL 5.1 (RC) をインストール&初期設定の手順を作成しました。
MySQL 5.1は、2008/7/8時点で正式リリースではありませんが、リリースされたときのために事前確認も兼ねています。

MySQL 5.1 on CentOS 5.2 手順

s-bit(sビット) と sticky bit(スティキービット)

なぜかわかりませんが、Linux(UNIX)環境で、s-bit(sビット) と sticky bit(スティキービット) を混同している場面を多く見かけます。

s-bit もしくは sビット とは、ファイル/ディレクトリの持ち主権限でファイル実行したい場合に付与します。ls コマンドで表示したとき、以下のように 「s」が出力されます。

$ ls -l hellocmd
-rwsrwxr-x 1 tuser tuser 5304 Jul 8 11:16 hellocmd
$

一方、sticky bit(スティキービット)とは、元々実行プログラムをメモリにsticky(貼り付け)する場合に使うもので、古い時代のUNIXでメモリ常駐させたい場合に使うものでした。最近のLinux(UNIX)では、/tmp ディレクトリのように誰でも読み書きできるけど、ファイル/ディレクトリの持ち主だけ削除できるようにしたい場合などに使われます。ls コマンドで表示したい場合、以下のように 「t」が出力されます。

$ ls -al / | grep tmp
drwxrwxrwt 6 root root 4096 Jul 8 11:16 tmp
$

sビット と stickyビットの混同の原因は、lsコマンドで表示したときの 「s」 と 「stickyのs」がゴチャマゼになっているのかもしれませんが、sビット と stickyビットではできることが全然違います。
「stickyビット付ければいいよっ。」と言われて、「chmod +t ~」してみたものの持ち主権限でプログラムが動かないなどないように使い分けはしっかりしましょ。

Linux(UNIX)であるディレクトリ配下の全ファイルから検索

あるディレクトリにファイルが複数あって検索するとき、grepコマンドで検索できますが、サブディレクトリがあって階層も不明な場合、どうしたらよいでしょうか?

こんなとき、Linuxであれば、以下のようにできます。

$ find あるディレクトリ -type f -exec grep -H  検索文字列 {} \;
たとえば、「/etc」 配下の全ファイルから、「192.168.0.100」 を検索したい場合、

$ find /etc -type f -exec grep -H 192.168.0.100 {} \;

↑こうなります。

ここでのキモは、grepの 「-H」オプションを使うことです。このオプションをつけないと検索した行の表示はされますが、ファイル名が表示されないのでどこのファイルかわからないのです。

さて、Linux系の大多数のOSでは、 grepの 「-H」オプションがつかえますが、AIX等のUNIXでは使えないことが多いです。そのときにどうするかというと、

$ touch ダミーファイル

$ find あるディレクトリ  -type f -exec grep 検索文字 ダミーファイル {} \;

↑このように、ダミーファイルも一緒にgrepに渡してやることにより複数ファイル検索となり、ファイル名も表示されます。

Linux(UNIX)でファイルやディレクトリの権限変更

Linux(UNIX)でファイルやディレクトリの権限変更をするとき、chmodコマンドを使います。なぜかわかりませんが 「chmod 755 ファイル名」 とモードに数値を使っている場面を多く見かけます。

「chmod u=rwx ファイル名」のように、シンボルモードと呼ばれる人間にわかりやすい指定方法がよりよいです。

u=rwx の”u” の部分は、u:user / g:group / o:other(その他の人)が指定でき、”=” の部分は、=:にする / +:権限付与 / -:権限剥奪 、rwxの部分は、r:read / w:write / x:execute が指定できます。

chmod 755 ファイル名

は、

chmod u=rwx,go=rx ファイル名と同じことです。

シンボルモードのほうが、rwxの権限の値をいちいち頭のなかで変換する必要がなく直感的でよりわかりやすいんです。是非使ってみてください。

755や644のように 数値で指定するほうが、よりプロっぽいから使う人が多いのでしょうか? (笑)

wikiはじめました

  • 2008-06-30 (月)
  • wiki

wikiはじめました

ベリラボwiki

このBlogに書いた内容もどんどん移行していきます。

ご期待ください。(笑)

10進数から16進数の相互変換

10進数から16進数へ変換するときどうやりますか?

MicrosoftWindowsな人は、 電卓アプリケーションを使うってことが多いかもしれませんね。

電卓アプリを使おうとすると…

スタートメニューからアクセサリを探して、さらに、電卓アプリを探して起動。起動したと思ったら16進になっていなかったら、表示メニューから「普通の電卓」から「関数電卓」に切り替えて、やっとのことで入力、変換。

あ~~~めんどい。

Linux(UNIX)使いなら bcコマンドでやりましょ。

10進数の192を16進数に変換するなら。コマンドラインで。

bc

obase=16

192

たったこの3行だけですよ。

是非お試しあれ。

Firefox 3 ダウンロード でギネス世界記録挑戦

 本日(2008/6/17) 、Firefox 3 ダウンロード でギネス世界記録挑戦だそうです。

http://www.spreadfirefox.com/ja/worldrecord/

↑ここから参加表明できます。

IE(Internet Explorer)を駆逐しましょう。(笑)

Fedora 8 で akelos のチュートリアル (その2)

前回は、akelos導入、チュートリアル用のbooklinkをセットアップをしてbook/authorの追加、更新、削除までやりましたが、今回は、book/authorの関連付けです。

【book/authorモデル追記】

$ cd ~/booklink/
$ vi app/models/book.php
以下のようになるように追記
<?php

class Book extends ActiveRecord
{
var $belongs_to = ‘author’; // <- declaring the association
}

?>

$ vi app/models/author.php
以下のようになるように追記
< ?php

class Author extends ActiveRecord
{
var $has_many = ‘books’; // <- declaring the association
}

?>

【bookコントローラー追記】

$ vi app/controllers/book_controller.php
以下のようになるように追記
class BookController extends ApplicationController
{
var $models = 'book, author'; // < - make these models available

// … more BookController code

function show()
{
// Replace “$this->book = $this->Book->find(@$this->params[‘id’]);”
// with this in order to find related authors.
$this->book = $this->Book->find(@$this->params[‘id’], array(‘include’ => ‘author’));
}

// … more BookController code
}

【book form用テンプレート追記】

$ vi app/views/book/_form.tpl
以下のようになるように追記
< ?php echo $active_record_helper->error_messages_for('book');?>

< label for=”author”>_{Author}
< ?=$form_options_helper->select(‘book’, ‘author_id’, $Author->collect($Author->find(), ‘name’, ‘id’));?>

< label for=”book_title”>_{Title}
< ?php echo $active_record_helper->input(‘book’, ‘title’)?>

【book/author関連付け確認】
Webブラウザから http://XXXXXXXX/book にアクセス。
bookのeditを行ったとき、Author がプルダウンで選択できること。
bookのshowを行ったとき、Author の項目が表示されること

ここまでで本家のチュートリアルに出ているところまでできました。

Fedora 8 で akelos のチュートリアル (その1)

PHP のフレームワークをFedora 8で試してみました。試行錯誤しながら動かしたメモです。OS設定の変更ができる権限(いわゆる root)を持っていることを中心に書いていますが、レンタルサーバ等でOS設定変更不可な環境でも参考になるように追記しています。

主な環境:

OS: Fedora release 8 (Werewolf)
php: 5.2.4
mysql: 5.0.45
apache: 2.2.8
subversion: 1.4.4
上記全て yum よりrpmパッケージで導入し独自コンパイルはなし。

http://xxxxx/book
http://xxxxx/author
でアクセスすることを前提。
akelos自身の導入とアプリケーション作成は、一般ユーザで行うことを前提。

【PHPの設定変更】

# vi /etc/php.ini
allow_call_time_pass_reference = On

↑デフォルトのOffからOnに変更。
akelosは、Onが前提のようです。Offのままだと色々なところでWarnningが出ます。


レンタルサーバ等で/etc/php.iniが変更不可の場合、.htaccess にこの設定をいれることで対応可能です。
また、コマンドラインで setup/migrate/generate 等のコマンドを実行するとき、

$ php --define allow_call_time_pass_reference=on ./script/setup -d ~/booklink

のようにコマンドラインオプションを付ける必要もあります。

【akelos、アプリケーション用のユーザ作成】

# groupadd -g 20000 webgroup
# useradd -u 20001 -g webgroup -G webgroup webuser

【akelos インストール】

# su - webuser
# svn co http://svn.akelos.org/trunk/ akelos

【booklinkアプリケーションのsetup】

$ cd ~/akelos/
$ ./script/setup -d ~/booklink


レンタルサーバ等の場合、ここで以下の設定追加。
$ vi ~/booklink/public/.htaccess
php_flag allow_call_time_pass_reference on

【apacheのVirtualHost追加】

# vi /etc/httpd/conf/httpd.conf
以下、追記する。
<virtualhost >
ServerAdmin webmaster@XXXXXXXX.jp
DocumentRoot /home/webuser/booklink/public
ServerName XXXXXXXX
ErrorLog logs/XXXXXXXX-error_log
CustomLog logs/XXXXXXXX-access_log combined

</virtualhost >
<directory >
Options Indexes FollowSymLinks
AllowOverride All
</directory>


# service httpd configtest < ---- apache設定ファイル文法確認
# service httpd start <---- apacheの起動

【booklink用 mysql データベース作成】

$ mysql -u root -p
CREATE DATABASE booklink;
CREATE DATABASE booklink_dev;
CREATE DATABASE booklink_tests;
GRANT ALL ON booklink.* TO bermi@localhost IDENTIFIED BY "pass";
GRANT ALL ON booklink_dev.* TO bermi@localhost IDENTIFIED BY "pass";
GRANT ALL ON booklink_tests.* TO bermi@localhost IDENTIFIED BY "pass";
flush privileges;
quit;
$ mysqlshow -u root -p

ここで作成したデータベースが表示されることを確認する。

【booklink用 configディレクトリの権限設定】

$ chmod a+rwx ~/booklink/config
↑誰でも読み書き実行できる設定

【ウェブインストーラでbooklink設定】
Webブラウザで、http://XXXXXXXX/ にアクセスし、データベースのユーザ/パスワードを入れる。その他の項目は、デフォルトから変更なし。

【booklink データベース構造定義】
$ cd ~/booklink/
$ vi app/installers/booklink_installer.php
以下、記述

< ?php

class BooklinkInstaller extends AkInstaller
{
function up_1(){

$this->createTable(‘books’,
‘id,’. // the key
‘title,’. // the title of the book
‘description,’. // a description of the book
‘author_id,’. // the author id. This is how Akelos will know how to link
‘published_on’ // the publication date
);

$this->createTable(‘authors’,
‘id,’. // the key
‘name’ // the name of the author
);
}

function down_1(){
$this->dropTables(‘books’,’authors’);
}
}

?>

【booklink データベースインストーラ実行】

$ cd ~/booklink
$ ./script/migrate Booklink install

【booklink(book/author) スキャフォールド】

$ cd ~/booklink
$ ./script/generate scaffold Book
$ ./script/generate scaffold Author

【実行時アクセスディレクトリ権限設定】

$ cd ~/booklink/app/views/
$ find . -type d -exec chmod a+rwx {} \;
$ cd ~/booklink/app/locales/
$ find . -type d -exec chmod a+rwx {} \;

※ここでは取り急ぎざっくり権限設定しています。本番環境ではもうちょっと考慮する必要ありかも。

【booklink実行確認】
Webブラウザから http://XXXXXXXX/book にアクセス。
追加、更新、削除でエラーとならないこと。
Webブラウザから http://XXXXXXXX/author にアクセス。
追加、更新、削除でエラーとならないこと。

今回はここまで、次回は続きをやります。

ベリサイン + apahce + OpenSSL + mod_ssl ではまり

ベリサイン + apahce + OpenSSL + mod_ssl ではまりました。

秘密鍵作成、CSR作成を行ってベリサインに申請。

戻ってきたServerIDを保存して以下のようにssl.confに設定したのですが、Webブラウザでアクセスすると警告がでました。

SSLCertificateFile /anywhere/XXXXcert.pem ← ServerID
SSLCertificateKeyFile /anywhere/XXXXkey.pem ← 秘密鍵

調べてみるとベリサインのサイトに「2007年6月18日21:00 までにベリサインストアフロントより申請されたセキュア・サーバIDは、中間CA証明書をインストールする必要はありません。」って…
ということは、2007/6/18 21:00以降は中間CA証明書を入れる必要ありってことだったのです。

ということで、ベリサインのWebサイトから中間CA証明書をダウンロードしてファイルに保存し、ssl.confに追記、apache再起動したところ。
Webブラウザからのアクセスで警告はなくなりました。

SSLCertificateChainFile /anywhere/inca.pem ← 中間CA証明書

参考情報 :
ベリサイン サーバIDインストール手順 (新規)

その rpm いつインストールしたんだっけ?

rpm をいつ入れたかを見たいときは、以下のコマンドで表示できます。

$ rpm -qa --last

このコマンド は、rpm をインストールした日付、時刻を新しいものの順番で表示してくれます。

もう一歩踏み込んで整形して表示したい場合、

$ rpm -qa --queryformat '%{INSTALLTIME} %{NAME}\n' | awk '{printf("%-12s: %-60s\n", strftime("%F %T", $1), $2);}' | sort

このように --queryformat オプションで表示したい項目を指定して整形してやります。--queryformat で指定できるオプションは、rpm --querytagsで表示することもできます。

インストール日時といっても rpm -U~などで更新した場合は、更新日時になってしまうので注意です。

fetchmail + procmail でメール転送

どこかのメールサーバに届いたメールをなにも考えず全部別のメールサーバに転送したい場合の設定をgoogle、Technoratiで検索したらなかなかみつからなかったのでまとめてみました。

.forward とか /etc/aliases とかで転送してもよいのですが、この方法だと転送先に届かないとメールを送ったところに転送先の携帯メールアドレスとかが漏れてしまうので、今回は fetchmail + procmail でpopで取ってきて転送する方法です。

確認した環境/条件は、以下のようになってます。

Fedora 7
procmail-3.22-19.fc7
fetchmail-6.3.7-2.fc7
転送元メール(POP3)サーバ : xxx.example.com
転送元POPユーザ : foo
転送元POPパスワード: bar
転送先メールアドレス: xxxxx@donomo.ne.jp
転送に使うメールサーバ(MTA) : localhost

10分間隔で転送元に届いたメールをチェック

転送したメールも転送元のメールサーバに残す

【.fetchmailrc の記述】

set postmaster root
set nobouncemail
set logfile fetchmail.log
defaults
protocol pop3
no rewrite
no mimedecode

poll xxx.example.com
uidl
username “foo”
password “bar”
mda “/usr/bin/procmail”
keep

【.procmailrc の記述】

:0 c
! xxxxx@donomo.ne.jp

【注意事項】

.fetchmailrc と .procmailrc のアクセス権限は、600 (group と otherのread/write/execute権限なし) とする。

$ chmod 600 .fetchmailrc

$ chmod 600 .procmailrc

fetchmail.log を事前に作成しておく

$ touch fetchmail.log

【crontab の設定】

*/10 * * * * /usr/bin/fetchmail > /dev/null 2>&1

fetchmailは、daemon化して一定時間間隔でメールチェックすることもできるのですが、daemon化した fetchmailがもしも何かの理由で異常終了したりするとメールをある日突然取ってこなくなることを想定して、crontab 設定で 10分間隔で fetchmailを起動しています。

この設定で転送できるようになりました。それと、転送先をありえないメールアドレスに設定して確認したところ、メールの発信元にはエラーが返らずfetchmailを起動したユーザにエラーメールが届きます。

Home

Search
Feeds
Meta

Return to page top