« 2009年09月 | メイン | 2009年11月 »

2009年10月26日

PHPからMySQLにデータをINSERTする時の文字化け対処法

MacOSでは問題なかったんだけど、
CentOSでPHPからMySQLにデータをINSERTしたら日本語が文字化けした。

基本的には沖縄のプログラミング生活さんとか、WEB系電脳技術日記さんとかを見て、
php.ini とか my.cnf とかの設定を見直したんですが、それでも治らない。

結局、PHPのコードの中に、mysql_query('set character set utf8') を入れて解決。
日本語を扱う時はおまじないとして書いておいた方がいいかもね。
$con = mysql_connect("サーバー名" , "ユーザー名" , "パスワード") or die("接続失敗");
mysql_select_db("データベース名");
mysql_query('set character set utf8');

2009年10月25日

CentOS5にてPHPからMySQLに接続できない時の対処法

前回のエントリーでApache2もPHP5も入れたことだし、
じゃあ早速PHPからMySQLへの接続確認してみよー!ということでやったんですけれども。

call to undefined function mysql_connect()

ってなエラーが表示されてしまう。
え〜、何で?と思ったら、tomoyamkungの日記さんとこに情報が。
どうやらPHP5以降はphp-mysqlをインストールしないと接続できないんだって。
そんな訳で php-mysql を yum install 。
インストール完了!実行実行!
call to undefined function mysql_connect()

ダメですか…orz
もっかいphpinfo()見てみたら、そもそもMySQLの欄?が無いんだよね…
ここでもうおかしい訳ですよ。
tomoyamkungの日記さんとこだとapache再起動で動くようになったとか言ってるけど、
一応もう一回 php をインストールしなおしてみようかな〜と思って configure してみる。
$ ./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --with-mysql=/usr/local/mysql

そうすると何かエラーが吐かれてた訳ですよ。前の時は見逃してたけど。
configure: error: Cannot find MySQL header files under /var/lib/mysql.

う〜ん、パス合ってるっぽいしなー。
と思ってグーグルで調べまくってたら、public static void mainさんとこに解決方法が!
どうやら mysql-devel をインストールする必要があるみたい。
$ yum -y install mysql-devel

で、apacheを再起動したら、接続できた!!

2009年10月23日

CentOS5にApache2とPHP5.2.11をインストール

参考サイト:
[linux][apache]Apache2.0.63インストール方法 on CentOS5.1
[linux][php]PHP5.2.5インストール方法 on CentOS5.1

ここに書いてある通りにやって終了。
あとは詳しくはセキュリティとかログ的なことでこことかこことかこことかを参考にすればOK。

で、phpinfo()してきちんと表示も出たのでOKOK。

2009年10月22日

JavaScriptでプルダウンメニューの表示を変える

なるべくjavascriptは使いたくなかったんですけど、
複数のプルダウンメニューを用意して、片方を選ぶともう片方のメニューが変わるってなことをしたくて
悩んだあげく結局使っちゃいました。

やってることはどうってことなくて、サンプルを改造した程度です。
>参考:選択肢によってドロップダウンのメニュー項目を変えるには

ただ、上の参考だとjavascriptのコードをhtml内に記述しなきゃいけなくて嫌だったので、
外部ファイル化しました。
外部ファイル化は、
<script type = "text/javascript">
 ↓
<script type = "text/javascript" src = "ファイルのパス"></script>
のように記述を変えるだけです。

複数のjavascriptを読み込みたい場合は、
BODYのonLoadの所でカンマで区切ってあげればOK。
<head>
 <script type = "text/javascript" src = "ファイル1のパス"></script>
 <script type = "text/javascript" src = "ファイル2のパス"></script>
<head>

…

<body bgcolor onLoad="functionName1() , functionName2()">


2009年10月21日

MySQLでの複数語句検索のまとめ

PHPからMySQLにアクセスしデータを検索するコードを書いています。
複数の検索語句からデータベース検索する時のメモ。

▼完全一致
まず、普通に完全一致検索する場合は、
MySQL> SELECT * FROM table_name WHERE column_name='こんにちは'
っていうのをsql_query()を使って書けば良い。

▼部分一致
次に、部分一致検索をしたい場合。「LIKE」と「%」を使います。
「%」が一致させたいキーワード以外の部分を役割ってくれます。
//行頭に「こん」がある場合にヒット
MySQL> SELECT * FROM table_name WHERE column_name LIKE 'こん%';

//行末に「ちは」がある場合にヒット
MySQL> SELECT * FROM table_name WHERE column_name LIKE '%ちは';

//途中に「にち」がある場合にヒット
MySQL> SELECT * FROM table_name WHERE column_name LIKE '%にち%';
あともっと詳しいワイルドカードについてはこことか参考に。

▼複数の語句で部分検索
現実的には、複数の語句をスペース区切りで入力してもらって、
その語句が入っているものを検索することが多いので、最後にそのPHPのサンプルを。
//必ず真という条件での検索で、検索条件がないのと同じ意味
$where = " WHERE 1";

$words = $_POST["words"];
	if($words){
		//全角空白があったら半角空白にそろえる
		$words = str_replace(" ", " ", $words);	
		//空白文字で検索ワードを分割	
		$word_array = preg_split("/[ ]+/",$words);	
		//ワードごとに検索条件を追加
		foreach( $word_array as $word_array_element ){
			$where .= " AND `column_name` LIKE '%{$word_array_element}%'";
		}
	}
//データベース検索開始
$sql=<<<eof
	SELECT *
	FROM `table_name`
	{$where}
eof;
$sql_result = mysql_query($sql);


2009年10月20日

MySQLでの日付検索に関して

MySQLにデータを格納する際に,日付の型をint型でunixタイムを入れることにした。

最初はdate型かdate-time型にしようと思っていたんだけど,
ちょっと調べてみたら,こんなエントリーを発見したので。
MySQLでDATETIME型のデータを高速に検索する方法

レコード数が100万件合った場合,
date-time型に比べてint型の方が検索時間が3~4倍短縮されるらしい。
まぁまだデータは10万件しかないからあれだけど,unixタイムだと計算とか何かと便利かなと思って。

PHPでのtimestamp⇔unixtime変換は、以下でOK。
//timestamp→unixtime
$date = "2009-10-20 12:34:56";
echo strtotime($date);

//unixtime→timestamp
$date = "1256009696";
echo date("Y-m-d H:i:s",$date);

余談だけどこういったWebサービスもあるんですね。
Unixtime相互変換ツール

2009年10月17日

sendmailでヘッダに独自の情報を付ける

sendmailでヘッダに独自の情報を付加する場合は、
以下のように「X-」で始まるように付けてあげればOK。
参考はこことか??

X-hogehoge: hogehoge


2009年10月16日

POPFileの「X-Text-Classification」の表記変更

POPFileを二回通すので,
X-Text-Classification: hogehoge
ではなく,
X-Text-Classification-1: hogehoge
X-Text-Classification-2: hogehoge
に変更しなおした。

POPFIle>classifier>Bays.pm

2009年10月14日

いつの間にかPOPFileが破れていたよ…

何かPOPFileのUIで履歴が表示されないなぁ、と思っていたら。

もしかして、と思って調べてみた。
参考:コーパスの破損 - POPFile

とりあえず公式にあるように、データベースが壊れているかどうかチェックしてみようと。
1. cd でチェックしたい popfile.db がある場所へ移動。
2. sqliteを起動

しかしここでつまずく。
# sqlite popfile.db
---
-bash : sqlite: command not found

なにー。sqliteが無いって。
調べてみたら、私が入れたのは sqlite3の模様。というわけで、
# sqlite3 popfile.db
---
'SQLite version 3.3.6'
Enter ".help" for instructions
sqlite>

3. 整合性チェック
sqlite> pragma integrity_check;
---
SQL error: file is encrypted or is not a database

あれ?これってコーパスが壊れてるってこと??
エラーメッセージをググってみたら,どうやらファイルのバージョンが対応してない時に出るみたい。うーむ。
とりあえずバックアップしてあったpopfile.dbを置き換えてみたけど,それでも動かない。
おかしいなぁ。。。

結局,popfile.dbとpopfile.cfgをコピーしておいて,
新しいPOPFileをダウンロードしてきてこの二つを突っ込んだら,正常に動きました。
POPFile本体が壊れていたってことなんですかね。

2009年10月13日

CentOSでrootでsshログインをできなくする設定

今更ですけど。

1. sshd_configを書き換える。
$vi /etc/sshd/sshd_config
---
#PermitRootLogin yes
 ↓
PermitRootLogin no

2. sshの再起動
rootで行うこと。
$ /etc/rc.d/init.d/sshd restart

MySQLでのパスワード設定ができないとき

基本的に、MySQLでパスワードを設定するときは
mysql> set password for root@localhost=password('hogehoge');
でいいんだけど、以下みたいにホスト名に「ー(ハイフン)」が入っているとエラーが返ってくる。
mysql> set password for root@aaa-bbb.co.jp=password('hogehoge');
---
ERROR 1064 (42000): You have an error in your SQL syntax;
 check the manual that corresponds to your MySQL server version for the right syntax
 to use near '-bbb.co.jp=password('hogehoge')' at line 1

これを解決するには、以下のようにホスト名の部分をシングルクォーテーションで囲ってやること。
mysql> set password for root@'aaa-bbb.co.jp'=password('hogehoge');

PHP内に sql query 書く時に似てますね。基本文法かぁ、勉強しないと。。。
うちは miyakyo-u.ac.jp なのでガッツリ該当したわけですね笑

参考:№733 MySQLでパスワード設定できない(‘-’含むホスト名)

CentOSにもMySQLをインストール

CentOSの方にMySQLをインストールしたのでメモ。

とりあえずMySQL入ってるかな〜と思ってバージョン確認コマンドを打ってみた。
(そしてこれが混乱の始まり…orz)
$ mysql -V
---
mysql  Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1
何だあるじゃん!(入れた覚えないけど…)
でも ver.14.12 ってどういうこと?ver.5とかだった気がするけど…
まぁあるなら気にしないで起動起動!
$ /etc/rc.d/init.d/mysqld start
しかしここでエラーが起こる。mysqld が見つからないよ!とのこと。
えー、何で!?と思ってここで詰まった。

結局、Mysql server をインストールしたら解決しました。
Mysql と Mysql server の違いがよく分からないけど、インストールできてなかったって事みたい。
あとは上記参考ページ通りにやったらうまく起動できた。

2009年10月09日

受信したメールに対して操作するまとめ

受信したメールを自動的にcsvファイルに書き出したくてやったことのまとめ。

方針としては、以下な感じ。
1. 受信メールをテキストファイルに書き出す@aliase
2.そのファイルをmv(リネーム)して、csvに書き出して、unlink(削除)する@Perlスクリプト
3.そのPerlを定期的に実行する@cron

では以下詳細へ。

1. 受信メールをテキストファイルに書き出す@aliase
/etc/aliases に以下を追加。
username: "|(cd テキストを保存したい場所; /bin/cat >>mail.txt; echo ''>>mail.txt; chmod 666 mail.txt)"
usernameは、メールアドレスの@の左側の部分。ここ宛のメールを処理の対象にする。
あとは、テキストに書き出して、権限を変更してあげる。
その後、newaleasesコマンドにてaliasesを更新。
$ newaliases
ここで注意しなければならないのは、ホームディレクトリからテキストを保存するディレクトリまでの全てのディレクトリに実行権限(x)を付けてあげる必要があること。
じゃないと上のaliasesに書いた移動(cd)ができなくなるので注意。

2.そのファイルをmv(リネーム)して、csvに書き出して、unlink(削除)する@Perlスクリプト
mvするのは、とりあえず現時点で来ているメールに関してcsvに書き出したいから。
新しく来たメールは、aliasesのcatで新しくmail.txtが生成されるので無問題!
メールの途中でmvすると一通が分割されそうに思うけれども、例えばヘッダを書いた後にmvしても、実際は本文部分を書き終えてからmvするらしいので心配はご無用。素晴らしい。
Perlスクリプトは、私はcsvに書き出すけど、やりたいことによって違うのでここでは割愛。
処理しおえたら、そのファイルをunlinkして削除する。

3.そのPerlを定期的に実行する@cron
cronで一定時間でそのPerlスクリプトを実行すれば、自動的にcsvにどんどん書き出されていくわけです。
crontabの書き方は、前のエントリを参考に。


ところで、この状態だとcsvファイルサイズがどんどん大きくなっていきますよね〜。
あとはcsvファイルのデータも別処理後に消していくこともやんないとな。


2009年10月07日

HTMLソース抽出は慎重に

とりあえずコメントアウトしておいて、
時間になったらコメントタグ外してWebページ上に公開しよう、なのか
確認してもらいたくてとりあえず載せておきました、なのか知らないけど
不用意に抽出するとまだ公開したくない情報までも、勝手に公開してしまう恐れがある。

なので、コメント部分は公開したくない情報だと見なして最初に削除しておく必要がありますね。
HTMLコメント部分の削除

私と先生と根本さん以外は何のこっちゃ?なエントリーだなぁ笑
いや〜、それにしても驚いた。怒られたらごめんなさい。でもソースに書く方が悪いよね!!

perl正規表現:htmlコメント部分の削除

ひー!Perl正規表現恐ろしい!!!
正直こんなん自力で書けないですよ。。。

Perlメモ」様々です。多謝多謝。
# コメントアウト部分(<!-- hogehoge -->)を消去
$html =~ s/<!(?:--[^-]*-(?:[^-]+-)*?-(?:[^>-]*(?:-[^>-]+)*?)??)*(?:>|$(?!¥n)|--.*$)//g;

# ¥はバックスラッシュに変えること

#ちなみに上記htmlタグを載せるにあたって、「HTML特殊文字変換ツール」に助けられました。
#タグが多い時は楽!笑

2009年10月04日

PerlプログラムをUNIX→LINUXへ移行する時の注意点

▼文字化け注意
基本的にUnicode::Japaneseとnkfを使っているんだけど、
そのまま移動しただけではコードによって文字化けが起こるのでその都度修正が必要。
原因ははっきりしないけど、内部文字コードの関係??

▼sendmail等のコマンドのパスをきちんと確認
cronで回したいので、コード内のコマンドはきちんとパスを書いてやらないとダメ。
その際、例えばUNIX環境で書いたコマンドがLINUXで動くとは限らないので、
自分のUNIXでのパスとLINUXでのパスを確認すること。