2006年12月5日火曜日

rsyncを使ってファイルの同期をとる

ウェブの開発をしていて、「テストサーバーで開発、確認が取れたら本番サーバーへアップ」という流れになることがよくあります。
これまでそういう場合、"いったんテストサーバーからローカルにコピーして、それを本番サーバーへアップ"という非効率なやり方でやっていたのですが、rsyncが使えそうなので導入してみました。
ちなみにこういう場合、cvsを使うのが一般的らしいですが、csv使ったことないし、今のところバージョン管理も必要としていないのでrsyncを使います。
さっそくググってみると、参考になりそうなサイトがたくさんヒットします。
今回は以下のサイトを参考にさせていただきました。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/096dirsync.html
http://landisk.kororo.jp/diary/28_rsync.php
http://www.aconus.com/~oyaji/backup/rsync.htm
http://linux.paken.org/index.php?rsync%A4%C7%A4%AA%BC%EA%B7%DA%A5%D0%A5%C3%A5%AF%A5%A2%A5%C3%A5%D7
http://www.infoscience.co.jp/technical/rsync/rsync.html
一通り見てみたところ、導入は意外と簡単そう。あと、みなさんだいたいバックアップ用途で使っているようです。
そんなわけでさっそく使ってみました。こんな感じ。
rsync -avz --delete -e ssh /path/to/php/dir test.example.com:/path/to/php

今回は非常にオーソドックスな使い方でしたが、必要に応じて--excludeオプションをつけたり、SSHの公開鍵認証を使ったりすればより便利に使えるようです。
※追記
ディレクトリ指定において、「/path/to/php/dir」と「/path/to/php/dir/」では動きが違ってくるので要注意。--excludeオプションにも影響を与えるので注意が必要。

2006年12月2日土曜日

MySQLで年齢,年代,年代別合計を求める

テーブル:USERTABLE
誕生日カラム:user_birthday

◆年齢を求める
select truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, 0) as age from USERTABLE;

◆年代を求める
select truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, -1) as age from USERTABLE;

◆年代別合計を求める
select
truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, -1) as age,
count(*)
from
USERTABLE
group by truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, -1);
※日付に+0することで数値型に変換される

2006年11月20日月曜日

「Windowsはフォーマットを完了できませんでした」というエラーが出る


楽天で買った激安USBメモリ(512MB)がおかしくなってしまいました。



買った当日は普通に使えてたんですが、翌日、再度使おうとするとエラーが。
USBポートにUSBメモリを差し込むと認識はするんですが、アクセスすると「フォーマットしてください」と言われてしまいます。大して大事なデータは入れてなかったので指示に従ってフォーマットしようとするものの「Windowsはフォーマットを完了できませんでした」というエラーが出てしまってフォーマットができない。どういうことだ??




コマンドプロンプトからchkdskしてみると、「RAWデバイスではchkdskは使えません」みたいな感じのことを言われました。よくわからないけど、なんだかやばそうな雰囲気。。



ここで「Windowsはフォーマットを完了できませんでした」でググってみたところ、フロッピーディスクやハードディスクで同じような症状が報告されている。どうやらフォーマットが物理的におかしいらしいです。



HDDでの事例だったんですが、Disk Formatterというソフトを使えば物理フォーマットができるというので、さっそく試してみます。
http://buffalo.jp/download/driver/hd/format.html



インストールして起動し、USBメモリを選択。「物理フォーマットもする」をチェックしてフォーマットを実行すると、2分くらいでフォーマットが完了しました。
このままだとFAT16になってるようなので、マイコンピュータからUSBメモリをFAT32でフォーマット。すると今度はフォーマットが成功し、普通にデータの入出力ができるようになりました。ふぅ。



買った早々にぶっ壊れたかなー、と思って心配でしたが、復活して良かったです。めでたしめでたし。

2006年11月11日土曜日

apache2にmod_deflateを導入


mod_deflateを導入しました。
概要や導入方法は下記が参考になります。
http://www.atmarkit.co.jp/flinux/rensai/apache2_04/apache04a.html



上記ページの通りにapacheを再コンパイル、インストール。設定をして再起動。。。



IEからアクセスしてみると、体感で少し速くなってる気がします。
そしてdeflateのログを見ても圧縮されてる様子。
また、



http://www.port80software.com/support/p80tools



↑で調べてみても「is gziped.」と出ます。う~ん、意外とスンナリ導入できたなぁ。



、、、と思ったんですが、困ったことにhtmlの圧縮はされてるけれど、cssやrdf、xmlが圧縮されていません。
cssやrdf、xmlって意外とアクセスが多いので、これはぜひとも圧縮したいところ。というわけで設定を見直します。



httpd.confをいじっては試し、いじっては試し、、、で動作を確認していくと、@ITに書いてある設定方法がおかしいことがわかりました。



http://d.hatena.ne.jp/kudzu/20060720/1153412166



↑こちらのページでも指摘していますが、「SetEnv gzip-only-text/html 1」があると、「AddOutputFilterByType」で個別に圧縮対象のContent-Typeを指定してもすべてかき消され、text/htmlだけしか圧縮されなくなるようです。




いろいろ試してみましたが、正解はここに書いてある通り。
http://cvs.apache.jp/svn/httpd-docs/2.0/manual/mod/mod_deflate.xml.ja



「せっかちな人向けの簡単な設定例」をそのまんま使えばOKです。
最終的にこんな感じにしました。



<IfModule mod_deflate.c>
DeflateCompressionLevel 5
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rdf+xml

#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio
#LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%) %{User-agent}i' deflate
#CustomLog logs/deflate_log deflate
</IfModule>



これでcssやjs、rdf、xmlなども圧縮されて転送されるようになりました。モチロン、gifやjpgなどの画像は圧縮されません。
あと、ブラウザごとに細かく設定しようかとも思いましたが、面倒なのでやめました(^-^A



mod_deflate、とりあえず今のところは軽快に動いているようです。手軽に導入できて回線リソースの節約になるので、時間のある人は試してみるといいかもしれません。

2006年11月7日火曜日

PEARのPagerクラスを使う


「前へ 1 2 3 4 5 6 7 8 9 10 次へ」



↑こういう感じのページナビゲーション、いわゆるページング処理を手軽に実装できるのがPEAR::Pagerです。実際使ってみたんですが、かなり便利です。



基本的な使い方は「pear pager」などでググると有用なページがいくつも見つかるのでそちらを参考にするといいと思います。というよりもむしろ実際に試して体で覚えるのがいいと思います。すごく簡単なので。



ちなみにこのページング処理、検索エンジン対策としてPATH_INFOにも対応できるといいな、、、って思っていたら、やってる方がいました。



http://project-p.jp/halt/anubis/blog_show/469



こちらを参考に実装してみました。



<?php

/*** pager.php ***/

//PATH_INFOから現在のページを取得
$tpath = explode("/", $_SERVER['PATH_INFO']);
array_shift($tpath);
if($tpath[0]){ $current_page = $tpath[0]; }else{ $current_page = 1; }


require('Pager/Pager.php');
require('Smarty/Smarty.class.php');

$smarty = new Smarty;
$smarty->template_dir = './smarty/template';
$smarty->compile_dir  = './smarty/template_c';


//ページング処理
$params = array(
    "perPage" => 5,
    "totalItems" => 100,
    'mode' => 'Sliding',
    'delta' => 2,
    'path' => 'http://localhost/pager/',
    'currentPage' => $current_page,
    'fileName' => '%d',
    'append' => false,
    'altPrev' => '前のページ',
    'altNext' => '次のページ',
    'altPage' => 'ページ',
    'firstPageText' => '最初',
    'altFirst' => '最初',
    'lastPageText' => '最後',
    'altLast' => '最後',
    'extraVars' => array("a" => 1),
    'showAllText' => 'show all',
    'importQuery' => true
    );
$pager = Pager::factory($params);
$navi = $pager->getLinks();
$smarty->assign("pageNavi",$navi['all']);

$smarty->display("pager.tpl");

?>



{** pager.tpl **}

<html>
<body>

{$pageNavi}

</body>
</html>


実は extraVars とか、いまいち動作がよく分からない変数があるんですが、その辺はあまり深く追求せずに使ってます。こういうのは自作しないでライブラリ使ったほうが絶対いいので、一度試してみる価値はあると思います。

2006年11月1日水曜日

MySQLのvarchar型はwhereやorderでは大文字小文字を区別しない


php+mysqlのウェブアプリ開発をしてて、where句でIDの検索をしても大文字小文字が区別されずに検索されてしまうことに気付きました。で、調べてみたところそういう仕様なんだそうです。全然知らなかった。。



http://www.physalis.net/ss/space/blog/5;jsessionid=C508160EDC0E3E5E1752A8EADA04D819



ふーむ、まったく知らなかった。



ちなみに解決策はvarchar型にbinary属性を指定すること。phpMyAdmin(2.7)だと「表示する」って項目のセレクトボックスにあります。こいつを選択してやればbinary属性付加が完了。検索で大文字小文字の違いが区別されるようになります。

2006年10月26日木曜日

patchコマンドでパッチを適用する


誰もが当たり前のように使っているpatchコマンド。分かってるようで実は意外と分かってなかったりします。

http://x68000.q-e-d.net/~68user/unix/pickup?patch

こちらのページでpatchコマンドの使い方、つまりパッチ適用のやり方が丁寧に説明されており、参考になります。


それとpatchコマンドはWindowsでも使えます。その解説は下記のページが参考になります。



http://www.koikikukan.com/archives/2006/01/22-235056.php

それからこちらのサイトではpatchコマンドでよく使われる「-p」オプションについても詳しく説明されています。

http://www.koikikukan.com/archives/2006/02/17-235135.php

2006年10月20日金曜日

MySQLチューニングアドバイスツール「mMeasure」


こちらのブログ記事で、MySQLのチューニングアドバイスツール「mMeasure」というものがあることを知りました。



http://www.multiburst.net/project-multiburst/archives/2006/07/31/1119.php




MySQLは仕事でも個人でもバリバリ使ってるのでさっそく導入してみました。



インストール方法は上記のページで詳しく解説されているので割愛します。



インストールは無事完了し、早速稼動開始。



mMeasureが生成するウェブページではMySQLの設定情報や負荷状況がグラフにて分かりやすく見ることができ、また設定と負荷に応じたチューニングのアドバイスも表示されます。



それから1日1回、チューニングアドバイスメールがmMeasureから自動で送信されます。
たとえばこんな感じ。



--------------------------------------



【最大接続率】 6.00 %
 最大接続数に対してmax_connectionsの設定が大きすぎます。



【テーブルキャッシュ使用率】 100.00 %
 table_cacheのサイズを増やすことで性能が改善します。



--------------------------------------




これまでmy.cnfの値をいじることは何度かありましたが、それが果たして正しいのかどうかまで調べるに至っていませんでした。それをmMeasureがやってくれるので、これはすごく助かります。(mMeasureのアドバイスは絶対に正しい、というわけではありませんが)



ウェブアプリのパフォーマンスが悪いなぁ、と感じている方、MySQLのチューニングをやってみたいと思う方、mMeasureを使ってみるといいかもしれません。

2006年10月19日木曜日

Zend Optimizerを導入した


もともと有償だった(と思う)Zend Optimizerが、いつの間にか無償になっていました。調べてみるとかなり手軽に導入できるようなので、早速導入してみます。



具体的な手順は他のサイトが詳しいので割愛します。ていうかむちゃくちゃカンタンです。インストールは対話形式だし。あっという間に導入完了です。
さらに、ご丁寧にもインストーラーがapacheの再起動までやってくれちゃいます。



インストールが完了したので、さっそくチェック。
phpinfoを見ると、powered byのとこに「 with Zend Optimizer v3.0.1, Copyright (c) 1998-2006, by Zend Technologies」が追加されてる。また、Configureの項にも「Zend Optimizer」が追加されてるのを確認。どうやらうまく導入できたようです。



早速、Zend Optimizerの効果のほどを体感してみます。
自分のサイトはほぼすべてのページがphpだったり、htmlにphpを埋め込んであるため「最大で40%の高速化が見込める」というZend Optimizerが機能すれば体感速度はかなり速くなるはず。。。というわけで、自分のサイト内を徘徊してみます。




・・・速くなってる。気がする。。。




そのとき同時にアクセスしてる人数とか、ネットワークの調子とか、いろんな要素が介在するのでZend Optimizerがどのくらい効果があったのかははっきりは分かりません^-^; でも結構速くなってる気がします。(こういう場合、Apache benchとかで導入前・導入後で測定したりすればいいんだろうか?)




何はともあれ、特に害もないようですし、手軽なのでphp使ってる人はぜひ導入するといいと思います。



 




P.S.
ローカルにもZend Optimizer入れてみよう。っと思ってxamppで動いてるphpに組み込もうと思ったんですが、既にデフォルトで入ってました。php.iniのZend Optimizer関連の設定のコメントアウトをはずすだけです。
ついでにeAccelerator(これも高速化のモジュール)などもxampp標準で入ってるみたいです。うーん、xamppすごい。



 



参考ページ:
http://www.zend.co.jp/
http://vine.1-max.net/zend.html
http://gigazine.net/index.php?/news/comments/20060701_loadavarage_battle/

2006年10月18日水曜日

mt-tb.cgiの名前を変えてスパム対策

これ、前からやろうと思ってずっと忘れてたんですが、ようやく実行に移しました。

2006年10月17日火曜日

Baiduspiderのアクセスを拒否する


ここ最近、サーバーの負荷が突然高くなることが何度かあり、おかしいと思ってログを調べてみたところ、「Baiduspider+(+http://www.baidu.com/search/spider.htm)」というユーザーエージェントのアクセスが大量にあることが判明。



さっそくググってみたところ、このBaiduは中華系のサーチエンジンロボットだとか。
中華系サーチエンジンロボットからの大量アクセスなんてリソースの無駄遣いにしかならないので、さっそくアクセス拒否しました。



http://postcard.blog.ocn.ne.jp/itazura/2006/09/baiduspider_5e4c.html



こちらのページを参考に(ていうかそのまんま)してapacheで拒否するようにしました。それから数日経ちましたが、だいぶ負荷が減りました。



追記:
<Location>を使ってbaiduspiderを拒否したんですが、その設定を加えた後、なぜか.htaccessが無効になってしまっていました。<Location>は<Directory>より優先されるようで、それが影響してAllowOverride Allが効かなくなっていたようです。



というわけで、こんな感じに書き直しました。



------------------
SetEnvIf User-Agent Baiduspider baidu_robots



<Directory />
    Options FollowSymLinks...
    AllowOverride All
    <Limit GET POST OPTIONS>
        Order allow,deny
        Allow from all
    </Limit>
    <Files *>
        Deny from env=baidu_robots
    </Files>
</Directory>
------------------



うちのサーバーではcgiやphp等もすべてDocumentRoot以下においてあるのでこの設定でも問題ないと思います。

2006年10月16日月曜日

「タグが閉じられていません」を手軽に解決する方法


MTを3.3にアップグレードすると、サイト内検索が「結果の表示ができません: <MTTagName>タグが閉じられていません。」というエラーが出るようになりました。



このエラーの原因および正当な解決策はGoogleでヒットする他のサイトを参考にしてください。



http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2006-17,GGLG:ja&q=%3cMTTagName%3e%e3%82%bf%e3%82%b0%e3%81%8c%e9%96%89%e3%81%98%e3%82%89%e3%82%8c%e3%81%a6%e3%81%84%e3%81%be%e3%81%9b%e3%82%93%e3%80%82+




さて、このページでは正当な解決策とはちょっと違った、非常に手軽な解決策をご紹介します。
以下、手順です。



---



1.search_templates/default.tmplを、search_templates/default_search.tmplという名前でコピー



2.search_templates/default_search.tmplを開き、Tagに関連する記述を片っ端から削除する



3.mt-config.cgiを開き、 AltTemplate default_search default_search.tmpl という記述を追加



---



以上。



http://your.mt.url/mt-search.cgi?IncludeBlogs=*&search=hoge&Template=default_search



こんな感じで、お尻に「&Template=default_search」をくっつけるとエラーが消えます。
あとは検索フォームに<input type="hidden" name="Template" value="default_search" />を加えればOK。




タグ機能を使っていない人、プラグインのソースをいじるのに抵抗がある人、などにはこの方法が手軽でちょうどいいかもしれません。

2006年10月7日土曜日

postfixとqpopperを入れる


これまでメールサーバーはqmailを使っていましたが、postfixが主流になりつつあるようなので勉強がてら入れ替えてみました。



入れ替える、と言ってもVineLinux3.2では標準でpostfixが入っているのでインストールは必要ありません。有効にするだけです。



# chkconfig postfix on



続いて設定。/etc/postfix/main.cfの編集をします。
以下のサイトを参考にさせていただきました。



http://www.miloweb.net/mail.html
http://hnw.dip.jp/server/postfix.html



これでqmailを止めてpostfixを起動すれば入れ替え完了。
念のため不正中継のテストもしておきます。
http://www.abuse.net/relay.html



もちろんテストは無事通過。



ちなみに、postfixを起動するときに



sendmail: fatal: please use fastforward/newaliases instead



というエラーが出ます。
これはqmailをインストールした際、「/usr/sbin/sendmail」を「/usr/sbin/sendmail.bak」にリネームし、新たに「/var/qmail/bin/sendmail」へのシンボリックリンクとして「/usr/sbin/sendmail」を作っていることが原因です。というわけで、sendmail.bakをsendmailに戻してやれば解決します。



 



続いてpopサーバーを用意します。今回はqpopperを使いました。
例によってapt-getでインストールします。



# apt-get install qpopper



その後の設定はこちらのサイトを参考にさせていただきました。
http://www.miloweb.net/qpopperapop.html



これですべて完了。。。と思ったんですが、メールクライアントからpopサーバーへのアクセスができない。特に間違ってないと思うんだけど、おかしいな。。。



しばらく悩みましたが、原因は/etc/hosts.allowにありました。



ウェブ上のいくつかのページを見たんですが、



pop: 許可したいIP



とか



pop3: 許可したいIP



などのように設定しろ、と書いてあります。
が、この通りに書いてもNG。
ようやく見つけた正解は以下でした。



in.qpopper: 許可したいIP



こちらのサイトを参考にさせていただきました。ありがとうございます。
http://shikichi.ddo.jp/qpopper_set.html




以上で入れ替え完了。意外とすんなりいけました。
以前はqmailをソースから入れていたんですが、それに比べると圧倒的に楽でした。




あとせっかくpostfixにしたのでバーチャルホストも使ってみました。



http://www.miloweb.net/postfix_virtualhost.html



すごく簡単です。確かqmailだと面倒だった記憶があるので、バーチャルホストを使いたい人にはオススメです。



 



◆追記
postfixではメールの振り分けなどでPerl正規表現も使えるようです。
その場合は、



# apt-get install postfix-pcre



でPostfix PCRE サポートのモジュールをインストールします。

2006年10月1日日曜日

xamppを使ってみた


phpspotで紹介されているxamppというツールを使ってみました。



xamppは、Apache、MySQL、PHP、phpMyAdmin、Webalizer、FTPなどなど、Windows上でphpアプリの開発をするために必要なサーバー系ソフトがまとめてインストールできてしまう、という夢のようなソフト。読み方は、、、わかりません。「ザップ」とかかな?




実際に自分のローカルにインストールしてみましたが、素晴らしいの一言。
これまでWindows上で開発環境を作るときはApache、MySQL、PHPをひとつずつダウンロード、インストール、設定、、、とやっていたわけですが、xamppならインストーラでウィザードに従ってるだけで超簡単。さらにxamppコントロールパネルというのが標準で付属しており、これを使えば各サーバーソフトの起動・停止をまとめて管理できます。



xampp、Windowsでphpアプリの開発をするなら絶対オススメです。

2006年9月29日金曜日

Windowsの不要なサービスを削除する


WindowsマシンにApacheやらMySQLやら、開発用にサーバー系ソフトをインストールするとWindowsのサービスとしてそれらを起動することになります。



このサービスですが、ソフトによってアンインストールしても消えずに残ってしまい、キモチワルイことがしばしばあります。



そんなときはコマンドプロンプトから、



C:\Documents and Settings\Administrator>sc delete Apache2



みたいな感じで、「sc delete サービス名」とやるだけで簡単に消えます。



どうってことはないんですが、気分的にさっぱりします。

2006年9月22日金曜日

サムネイル画像作成支援クラス「Thumbnail.inc.php」


phpにはデフォルトでイメージ関数があり、それを使って画像のリサイズ等の加工ができますが、使いこなすのがちょっと大変で、ソースコードがわかりにくくなってしまうという難点がありました。
そうした問題を解決してくれるのがクラス。



http://www.gen-x-design.com/projects/php-thumbnailer-class/



少し試してみましたがかなり使えそうです。

2006年9月21日木曜日

mod_rewriteでアクセスごとに処理を振り分ける


今回やったことは、



hoge.example.com へアクセスがあった場合 /home/homepage/public_html/hoge に



ahe.example.com へアクセスがあった場合 /home/homepage/public_html/ahe に



それぞれ処理を振り分ける、というもの。もちろん「hoge」と「ahe」だけじゃなくて「ufu」でも「oho」でもなんでもあり、/home/homepage/public_html以下にディレクトリが存在していればそちらに処理を振り分けます。



mod_rewriteを使い、httpd.confに以下のように記述します。



    ServerAdmin root@example.com
    DocumentRoot /home/homepage/public_html
    ServerName www.example.com
    ServerAlias *.example.com
    ErrorLog logs/example-error_log
    CustomLog logs/example-access_log combined

    RewriteEngine On
    #RewriteLog logs/test-rewrite.log
    #RewriteLogLevel 3
    RewriteCond %{HTTP_HOST}  ([^\.]+).*
    RewriteRule ^(.*)$ /%1/$1 [L]



※当然ですが、apacheの設定以前にDNSにワイルドカードで登録しておく必要があります。



以上で完了です。なお、mod_rewriteを使わずにphp等でスクリプトを書いて処理を振り分けるやり方もいいと思います。今回は勉強がてらmod_rewriteを使ってみました。 



参考
http://www.net-newbie.com/trans/mod_rewrite.html
http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html
http://www.kobarin.jp/blog/MT3/archives/2005/01/virtualhost_www.html
http://webcraft.jp/asy/linux/mod_rewrite.htm

2006年9月12日火曜日

Smartyテンプレートで直接getやpost、cookieなどの値を参照する


$smartyという特殊変数を利用することで、いちいちphpスクリプト側でassignせず、smartyテンプレート側の記述のみで直接get、post、session、cookieなどの値を参照することができます。






































php

smarty

$_GET[hoge]

{$smarty.get.hoge}

$_POST[hoge]

{$smarty.post.hoge}

$_REQUEST[hoge]

{$smarty.request.hoge}

$_COOKIE[hoge]

{$smarty.cookies.hoge}

$_SESSION[hoge]

{$smarty.session.hoge}

$_ENV[hoge]

{$smarty.env.hoge}

$_SERVER[hoge]

{$smarty.server.hoge}


この機能、これまでずっと知らずいっつもassignしてました。。。

2006年8月25日金曜日

windows版mysqlのmy.iniはインストールパス直下に置く


タイトルの通り。



「C:\windows」とか「C:\windows\system32」あたりに置くもんだと思って少しハマってしまった。



ちなみにmysqlのバージョンは5.0.24です。

2006年8月16日水曜日

設定ファイルを使わず、設定値をDBに格納する


今やっている案件は、DBサーバー1台に対し、ウェブサーバーが複数台あるという構成。
ウェブサーバーは、



・一般ユーザー向けwwwサーバー1号
・一般ユーザー向けwwwサーバー2号(1号とは別のコンテンツを設置)
・管理者向けサーバー
・決済処理用サーバー



となっている。
一応負荷対策ということになっているけどほとんど意味はなく、開発の手間になっているだけという状態。
これら4つのサーバーそれぞれにphpスクリプトが置かれて、稼動しています。



それぞれコンテンツは別物で、スクリプトやテンプレートなどは別々に管理しています。これはまあ問題ないんですが、基本となる設定ファイルはかなりかぶるところが多い。



たとえば、設定ファイルに



$pref = array("01"=>"北海道","02"=>"青森県","03"=>"以下略");



みたいな配列を用意し、各スクリプトから呼び出して使ってます。(もちろん都道府県以外にもいろいろあります)
こうした値が完全に固定なら問題ないんですが、開発中や運用中に増えたり減ったりすることがよくあります。そうなった場合、各サーバーにある設定ファイルをそれぞれ更新しなくちゃいけなくてかなり面倒。



「あー、メンドクセー」なんて思ってたんですが、あるとき「DBは一個だけなんだから、設定はDBに格納しとけばいいんじゃないか?」ということに気がつきました。



今の案件に関しては今からDB格納方式にしてたらものすごい時間かかっちゃうのであきらめますが、今後こういうサーバー沢山案件(あるかな?)が出てきたときはなるべくDBに格納するよう、気をつけようと思います。



忘れないようにメモ。

2006年8月14日月曜日

phpでその月の日数を出力する


echo date("t", mktime());


これで現在の月の日数が表示される。たとえば今は2006年8月なので31になる。



ちょっと応用して、こうやれば指定した月の最後の日数が出せる。




echo date("t", mktime(0, 0, 0, $month, 1, $year));




 



今まで知らなかったけどこりゃ便利だ。カレンダー系の機能を作るときに重宝しそうです。



http://php.s3.to/man/function.date.html

2006年8月4日金曜日

aタグで着メロダウンロードを実現する


着メロのダウンロードは<a>タグでカンタンに実現できる。



<a href="melody.mld" title="曲名">ダウンロード</a>


これでドコモはOK。



auとvodafoneも同じようにできる。



<a href="melody.mmf" title="曲名">ダウンロード</a>


自分の場合、auとvodafoneはこのままではうまくいかなかった。調べてみると、httpd.confもしくは.htaccessにて下記のようにファイルタイプを設定してやる必要があるらしい。



AddType application/x-smaf .mmf


これでうまくダウンロードできるようになった。



あとauの場合はファイルにCRCを付加してやる必要がある。
phpやperlでCRC付加スクリプトを書くこともできるし、また公式サイトで配布されているツールを使えばWindowsローカル環境でCRC付加ができます。
http://www.au.kddi.com/ezfactory/tec/dlcgi/dlcgi_script3.html




こうした携帯の”クセ”は、知っていればなんてことない問題だと思いますが、初めてのことだったので結構てこずってしまいました。



参考
http://mcap.symmetric.jp/document/mcap3SE/401-4.html

2006年8月1日火曜日

.htaccessで画像の直リンを禁止にする


たとえばkawama.jpにある画像ファイルを直リンク禁止にしたい場合は、下記のようなhtaccessを画像フォルダに設置すればOK。




SetEnvIf Referer "^http://kawama\.jp" ref01
order deny,allow
deny from all
allow from env=ref01




最近では「コンテンツは認証かけていたが、画像は認証かけていなくて情報が流出した」なんて話も聞きますが、この方法で直接参照を禁止することで対応もできる(と思う)。



http://www.shtml.jp/htaccess/referer.html
http://lolipop.jp/?mode=manual&state=hp&state2=htaccess_06



 



◆追記
画像呼び出し元のファイルがhttps以下に設置されている時は注意が必要。
呼び出す画像もhttpsでないとRefererが取れないらしい。詳しいことは分からないが、httpとhttpsではRefererの動作に違いがある様子。

MSSQLでの最新のシリアル番号の取得方法


SELECT IDENT_CURRENT('TABLE_NAME');



これで最新のIDENTITY値の取得が可能。よく忘れるのでメモ。

2006年7月25日火曜日

phpの正規表現


正規表現ってややこしくてなかなか覚えられないんですが、このサイトはよくまとまっていてとても参考になりました。



https://ss1.xrea.com/www.mtblue.org/pc/web/regular_expression.php



このサイト、他にもコンテンツがたくさんありますがすべて整然とまとまっていて参考になりそうです。

HTML_QuickFormのaddRule「file」でjpgとgifのみアップさせたい


こうするとできます↓



$form->addRule("TENPU_FILE", "ファイル形式がgifもしくはjpgではありません", "mimetype", array('image/pjpeg', 'image/jpeg', 'image/gif'));


最初、「image/jpeg」とか「image/jpg」とかやってたんですがうまく動かず、ハマってしまいました。「image/pjpeg」にしないと動かないので注意が必要です。(QuickFormとぜんぜん関係ないかも?)

2006年7月19日水曜日

.htaccessでphpの環境設定をする


最近よく使う小技。



<IfModule mod_php5.c>
 php_value include_path ".:/usr/local/lib/php:/home/hoge/public_html/"
 php_value register_globals On
</IfModule>


たとえばこんな感じ。

他にも

php_value auto_prepend_file "hoge.php"
php_value default_charset Shift_JIS

などなど、さまざまな値を設定できます。
いちいちphp.iniをいじってるとapache再起動が面倒だし、また共有サーバーだと設定変えると問題が起こることもあるのでこの方法が役に立ちます。

mt3.2+mysql5.0.22で文字化け


サーバー移行のため、古いバージョンのmysqlから最新バージョンのmysqlへmtのデータを移したところ、日本語文字列が「?????」という具合に文字化けしてしまった。はてなだらけ。



修正はカンタン。mt-config.cgiの57行目にある「SQLSetNames 1」のコメントアウトを外すだけ。



これで大量のハテナはすべて消え、文字化け解消しました。

2006年7月18日火曜日

linuxでzip圧縮し、さらにパスワードもかける

$ zip -e filename.zip filename

プロンプトでパスワードの入力を求められるので、パスワードを設定すれば完了。お手軽です。

http://www.itmedia.co.jp/help/tips/linux/l0246.html


追記
$ zip -P パスワード -e hoge.zip hoge.csv
↑こうすれば一行でパスワード付圧縮をかけることもできます。

2006年7月15日土曜日

logrotateの設定(ログローテート)


ログローテートについて調べてたら、オプション等が分かりやすく解説されてるページを発見。



http://cyberam.dip.jp/linux_foundation/systemlog/logrotate_main.html



オプションとかよく忘れるので、ブックマークさせていただきました。

2006年6月30日金曜日

PEARのパッケージをまとめてインストール

新しくサーバーを立てたときなど、まとめてPEARパッケージを入れるとき用にまとめてみました。この順番だと依存関係もスルーしてスンナリ入れられます。(たぶん)

pear install pear_info
pear install DB
pear install MDB2
pear install MDB2_Driver_mysql
pear install File
pear install Log
pear install Text_Password
pear install Net_SMTP
pear install Mail
pear install Mail_Mime
pear install Auth
pear install HTML_Common
pear install HTML_QuickForm
pear install Net_URL
pear install HTTP_Request
pear install HTTP
pear install HTTP_Header
pear install HTTP_Download
pear install XML_RPC
pear install XML_Parser
pear install Pager
pear install MIME_Type
pear install File_Archive
pear install XML_Tree
pear install XML_RSS

pear install -f HTML_Ajax
pear install channel://pear.php.net/Services_Trackback-0.6.2




※Services_Amazonを入れる場合
(随時アップデートされてるようなので、マメに最新バージョンが出てないかチェックするといいです)

pear install Cache
pear install XML_Util
pear install channel://pear.php.net/XML_Serializer-0.20.2
pear install channel://pear.php.net/Services_Amazon-0.8.0



※2011年7月16日追加。Twitter関連のライブラリのインストール
pear install channel://pear.php.net/Net_URL2-0.3.1
pear install channel://pear.php.net/HTTP_Request2-2.0.0RC1
pear install channel://pear.php.net/Services_Twitter-0.6.3
pear install channel://pear.php.net/HTTP_OAuth-0.2.3

2006年6月21日水曜日

qmailの不正中継対策


http://www.rbl.jp/svcheck.php



ここで自分のメールサーバーをチェックしたら、19のテストのうち6つでrelays accepted.になってしまった。Σ( ̄□ ̄;)



Google調べてみたら、「qmail-smtpd-relay-reject」というパッチを当てればよさそうだったので早速パッチを当てて再構築。



で、qmailを再起動してもう一回チェックをかけたらすべてno relays accepted.になりました。ふぅ。
つか最初から当てとかなきゃいけなかったっぽいです。気をつけましょう。

2006年6月13日火曜日

apache2にmod_sslを組み込む


※注意!
・あくまでも自分用の備忘録として書いているので、あくまで参考程度にとどめてください。
・ベリサインなどの認証局は使いません。テスト用などで使うのを想定しています。



◆opensslとopenssl-develを入れる

# apt-get install openssl-devel

Vine3.2ではopensslはデフォルトで入っているのでdevelのみインストール。

◆apacheインストール

# ./configure --prefix=/usr/local/apache2 --enable-ssl
# make
# make install

# cd /usr/local/apache2/conf
# mkdir ssl.key
# mkdir ssl.crt
# cd ssl.key
# openssl genrsa -out server.key 1024
Generating RSA private key, 1024 bit long modulus
..++++++
.....................++++++
e is 65537 (0x10001)
# chmod 400 server.key
# openssl req -new -key server.key -out csr.pem -sha1
~~質問されるので、適当に答える。ただしCommon Nameのところはドメイン名を入れないとダメっぽい~~
# openssl x509 -in csr.pem -out server.crt -req -signkey server.key -days 365 -sha1
# cp server.crt ../ssl.crt/
# cd ..
# vi httpd.conf

Include conf/extra/httpd-ssl.conf ←コメントアウトをはずす

# vi extra/httpd-ssl.conf

SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt ←パスを修正する
SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key ←パスを修正する

# /usr/local/apache2/bin/httpd start

以上。



参考
http://www.rinzo2.jp/~rinzo/apache_ssl/apache_and_ssl_00.htm

2006年5月31日水曜日

USEN光(ギャオ)が来た!


4月に導入が決定していたUSENのギャオ光がとうとう開通した!



有線ギャオ光



4月初旬にUSENから「遅くとも4月末には開通しますよ」という連絡があったんですが、一ヶ月遅れでようやく開通。
ま、工事の遅れとかあったんでしょう。特に気にしてません。



さっそく繋ごう!



。。。



と思ったんですが、うまくいかない。



モデムに直でPCを繋ぐとうまくいくんだけど、ルーターを介するとダメ。でも、原因はすぐわかりました。



うちはギャオ光マンションVDSLタイプなんですが、このタイプはフレッツADSLのようなPPPoE方式でなく、DHCPで各家庭にIPが割り振られるタイプ。なのでルーターの設定を「自動設定 - DHCP」というのに変更する必要があるのでした。



ちなみにうちで使ってるルーターはLinkSysのBEFSR41C-JPという製品。 すでに購入してから4年くらい経つと思うんですが、まだまだ現役バリバリ。めちゃくちゃ重宝してます。



で、DHCPにしたら無事接続できました。



ブロードバンドスピードテストで計測してみたら、下りで5MBくらい。まあこんなもんかな。
フレッツADSLのときが1~2MBくらいだったので体感で少しだけ早くなった感じです。



そんな感じで、まだ導入して1日しか経っていませんが、今のところ特に問題なし。快適です。



今回の乗換えでは月額1000円くらいの節約になるので、それが一番うれしい。
浮いたお金で回らないお寿司でも食べにいこうかな。

2006年5月30日火曜日

メールアドレスのリストからPC/携帯のアドレスを取り出す


エクセルでやってもいいんですが、SQLのほうが手っ取り早いので、やってみました。



1.テーブルを作る




CREATE TABLE EMAIL_T (
  email_address varchar(255) NOT NULL,
  email_type varchar(10) NOT NULL,
);




2.データ投入



phpMyAdminのインポート機能を使う



3.SQL実行




select
 email_address,
 case when email_address like '%docomo.ne.jp' then 'mobile'
   when email_address like '%.ezweb.ne.jp' then 'mobile'
   when email_address like '%.vodafone.ne.jp' then 'mobile'
 else 'pc' end as pc_or_mobile
from
EMAIL_T




毎回selectしてもいいですが、カラムにpcかmobileかの種別を入れておくと、後々楽になると思います。




update EMAIL_T
 set email_type = case when email_address like '%docomo.ne.jp' then 'mobile'
        when email_address like '%.ezweb.ne.jp' then 'mobile'
        when email_address like '%.vodafone.ne.jp' then 'mobile'
      else 'pc' end




 

トラックバック送信テストフォーム


トラックバック送信のテストをする時用に、ちょっと便利なツールを作ってみました。



トラックバック送信テストフォーム



我ながら、なかなか便利です。
そう頻繁に使うようなものでもないけど、トラックバックのテストをするときにこれを使えば効率よくテストできると思います。

2006年5月19日金曜日

英数字のみのトラックバックを弾く(スパム対策)


TBスパムがどんどん増えてきて、1日100件くらい来るようになってしまった。(TдT;)

というわけで、最近はやり(?)の「英数字のみのトラックバックを弾く」というのを導入しました。



http://blog.matake.jp/archives/mt32_trackbacks.html

こちらのサイトを参考に、ソースにちょこっと手を加えるだけ。あっという間に導入完了。
英語だけのTBと日本語も含むTBを送信してテストし、うまく動くのを確認しました。

とりあえず、これでしばらく様子を見ようと思います。

2006年5月17日水曜日

画像認証コード生成ライブラリ(PEAR::Text_CAPTCHA)

ここ最近、会員登録やログインのフォームなどでよく見かけるようになった「この画像に表示されている文字を入力してください」というやつ(ぐにゃぐにゃっとなってる画像)を生成するPEARのライブラリ。それがこのText_CAPTCHAだ。

とりあえず今のところ使う予定はないんだけど、将来間違いなくお世話になると思うので、備忘録として残しておきます。

http://pear.php.net/package/Text_CAPTCHA
http://blog.poyo.jp/archives.php/categ-1/year-2005/month-1/id-1106990727
http://cl.pocari.org/2006-01-31-1.html
http://www.doyouphp.jp/sample/sample_others_captcha.shtml

2006年5月16日火曜日

MS SQL Serverで日付型の形式を「yyyy-mm-dd」に変換する


SQLサーバーにて、日付型のカラムから値を取り出すと

「05 15 2006 6:00PM」

というような形式で値が出てくることがある。これが非常に迷惑。
「yyyy-mm-dd」形式でないとアプリケーション側での扱いに困るのだ。

これってWindows自体の時計の設定に依存してたような記憶があるんだけど、とりあえず今回はSQLで日付形式を変換した。

こんな感じ。




select
   *,
   convert(varchar,REGIDATE,120) as REGIDATE 
   from TABLE;




120というのはODBC標準形式。つまり「yyyy-mm-dd hh:mi:ss」だ。
地域別に数字があるので、お好みで使い分けましょう。(あまり使う機会もないと思うけど。。)

2006年5月11日木曜日

HTML_QuickFormのsetConstants()


setDefault()を使うとデフォルト値の固定ができる。
これは前から知っていたんだが、setConstants()を使うと値を完全に固定できるようだ。



使い方はsetDefault()とまったくおなじ。



$form->setConstants(array("field_name" => "value"));



「具体的にどんな使い方があるんだ?」といわれてもすぐには出てこないんですが、覚えておけば将来きっと役に立つはず。。

2006年5月10日水曜日

mb_convert_encodingのautoが効かない


$value = mb_convert_encoding($value, 'UTF-8', 'auto');



とやってもうまく文字コードが変換されない。でも、



$value = mb_convert_encoding($value, 'UTF-8', 'EUC-JP,SJIS,ASCII,JIS');



という具合に、直接文字コードを指定してやれば機能する。



うーむ、どうしてだろう。
で、偶然php.iniを眺めていたとき、



mbstring.detect_order = auto



がコメントアウトされているのに気がついた。



「もしかして、このコメントアウトをはずせばいいのか。。?」



と思ってやってみたら、autoが動くようになりました。うーむ、全然気がつかなかった。

Windows,apache,php,MS SQL Server2005の環境での注意事項


やったのは、「Windows+Apache2+php5」と「Windows+MS SQL Server2005」の接続です。
手順をすべて書くとかなり長くなるので、ポイントだけ押さえ、キーワードを交えてメモしておきます。



とりあえず全部インストールされている状態で、パスは自分の環境にあわせて読みかえてください。




◆httpd.conf



httpd.conf にLoadModuleを追加する



LoadModule php5_module d:/php5/php5apache2.dll



あと、もちろんAddTypeも追加。



それと下記の記述を入れておくとphp.iniの設置場所を変更することが可能。



PHPIniDir D:/php5




◆php.ini



extension=php_mbstring.dll
extension=php_mssql.dll



コメントをはずす



mssql.secure_connection をOffにする(OffでダメだったらOnも試す)




◆ntwdblib.dll



※ここ一番重要



http://webzila.com/dll/1/ntwdblib.zip



↑ここからntwdblib.dllをダウンロードし、解凍してc:\windows\system32 と d:\php5 の両方にコピー。

2006年5月9日火曜日

PEAR::DBでDSNを配列で設定する


DSNの指定は、下記のようにやるのが簡単。




$DSN = "mysql://root:root_pass@localhost/dbname";




ただ、この形式だとパスワードに「@」が入っているとうまく接続できずに困ってしまう。そんなときは配列で指定してあげると回避できます。




$DSN = array(
    'phptype'  => 'mysql,
    'username' => 'root',
    'password' => 'root_pass',
    'hostspec' => 'localhost',
    'database' => 'dbname',
);


2006年5月3日水曜日

トラックバックスパム対策?


最近、ブログスパムが多い。特にトラックバックスパムが。
このkawama.jpにも一日20~30件くらいのトラックバックスパムがあり、いちいち消すのがメンドクサイ。サーバーにも負荷がかかるし、本当に困る。
期待された、mt3.2で新たに実装されたスパムフィルターもイマイチ使えないし、いまのところこれといった解決策がないのが現状。

そんな感じでkawama.jpはスパムに悩まされているんですが、なぜか司馬遼太郎を読むにはぜんぜんスパムがこない。
違いといえば、トラックバックURLの表示の方法くらいだ。kawama.jpではURLをそのまま表示しているのだが、司馬遼太郎を読むではURLをフォームのinputフィールドに入れて表示している。
特に手間もかからないし、ダメもとでkawama.jpもinputフィールドを使うようにしてみました。
こんな感じです。



変更前
<p class="techstuff">トラックバックURL:<br /> <$MTEntryTrackbackLink$></p>


 ↓↓↓



変更後
<p class="techstuff">トラックバックURL: <input type="text" name="tburl" size="45" value="<$MTEntryTrackbackLink$>" onfocus="this.select()" /> </p>





これでしばらく様子を見てみます。
古い記事はスパムDBに入ってしまっていると思うのでどうにもなりませんが、新しい記事にスパムが来るかどうか、チェックしてみようと思います。




追記:2006/05/11

この記事を書いたあと、ほどなくして司馬遼太郎を読むにもスパムが来るようになってしまいました。
つまり、効果ナッシングということです。とほほ。。(TдT;)

2006年5月2日火曜日

MTの再構築が重い!てか途中で止まる。


会社で使ってるmtのバージョンを3.17から3.2にあげたら、再構築が劇的に重くなった。



topコマンドで見てみたらロードアベレージが15!!超高負荷状態だ。mt.cgiのSIZEは1600Mになってる!!



調べてみたところ、どうやらmt3.2はmt3.17に比べて再構築がハンパなく重くなっているそうだ。3.2のリビルド時のメモリ使用量は、3.171の約10倍なんだとか。。。
そして、BerkeleyDBをつかってる場合はさらに重くなるらしい。うちの環境にそのまんま当てはまる。。。



で、ググって見たら同じ問題で困っている方が大勢いらっしゃった。いきなり10倍になったら、そりゃみんな困るよね。



とりあえずの対処法として、mt-config.cgiの「EntriesPerRebuild」の設定値をデフォルトの「40」から「10」に下げてみる。
こんな感じ↓




EntriesPerRebuild 10




さっそく再構築する。再構築の小窓とtopコマンドの両方を見てチェックする。



「再構築中 エントリー: 1 - 10 ...」 同時にmt.cgiのSIZEが増えていく。10M、50MB、100MB、300、600、、、



小窓が自動リロードされ、「再構築中 エントリー: 11 - 20 ...」になる。topコマンドのmt.cgiのSIZEがリセット。そしてまたSIZEが増え始める。。



これの繰り返し。遅いけど、なんとか再構築終わるか。
この調子で「再構築中 エントリー: 161 - 170 ...」くらいまで来た。が、topコマンドを見てみたらmt.cgiのSIZEがまたもや1600MBに!!どうやら固まってしまったようだ。10個ずつにしたのに、それでもダメか。とほほ。。。



ここで、いさぎよくBerkeleyDBはあきらめる。MySQLへ移行しよう!



MySQL移行に向けて、再度ググってみる。mt標準の「mt-db2sql.cgi」だとトラックバックデータが参照できないエラーがあるらしいので、Googleで見つけた「mt-db-convert.cgi」というのを使ってみた。さっそく走らせてみる。





SQLエラーが発生しました: 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 '2005-10-10 12:53:30', NULL, '2006-05-02 12:08:32', NULL)' at li




という、意味不明のエラーで止まる。どうやら「MT::Log」のところで止まっているようだ。
ログなんていらないや、ってことで「mt-db-convert.cgi」の32行目「MT::Log」を消したら通った。




続いて、別のエラーに遭遇。今度はテンプレートのところだ。




SQLエラーが発生しました: 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 '\'さん。コメントしてください。 (<a href=\"<$MTRem




探してみたら、個別エントリアーカイブのテンプレートに該当の文字があった。これも不要なので該当の箇所を全部削除。そしたらここも通った。




以上で移行完了。ふぅ。
とりあえず「EntriesPerRebuild」を「20」にして再構築をかけてみたが、そんなに負荷も高くならずに無事完了した。いやぁ、よかったよかった。




しかし、ここまでmtが重いのは正直困りものだ。
実は3年くらい前、仕事で韓国製のCMSを触っていたことがあり、そのときもCMSの高機能化と記事数の増加に比例してHTMLの出版時間が長くなるという問題が発生していた。そのときは、



・ヘッダやフッタなど、共通部品はSSIを使う
rebuild支援ツールを自作して使う



など、運用でなんとか乗り切って(ごまかして?)いたのだけれど、結局それも根本的な解決にはならない。



この問題は静的HTML型CMSの宿命だと思うのだが、mtはこの問題を克服できるんだろうか。。
シックスアパート社はバージョン3.3で何らかの手を打ってくると思いますが、いったいどんな手法になるのか。ちょっと楽しみにしてます。



 



今回お世話になったサイト:
http://www.ec-blog.com/05/000061.html
http://www.ec-blog.com/04movable_type/000060.html
http://as-is.net/wiki/MT_Database_Converter/ja 



 

2006年4月28日金曜日

クッキーをサブドメイン間で共有する

以前から「クッキーはサブドメイン間で共有して使える」というのは聞いてたんですが、今回仕事で使うことになりそうなのでちょっと調べてみました。
以下、 set.example.com で発行したクッキーを get.example.com で呼び出す。というテストです。

http://set.example.com/cookie_set.php
<?php
setcookie("TestCookie", "Test", time() + 3600, "/", ".example.com");
echo "set!";
?>

↑このスクリプトにアクセスするとクッキーが発行される。

http://get.example.com/cookie_get.php
<?php
echo "<hr>";
echo $_COOKIE["TestCookie"];
echo "<hr>";
?>

↑このスクリプトにアクセスすると、クッキーが呼び出される。

実際やってみて、ちゃんと動きました。
「.example.com」としてクッキーを発行しておけば、サブドメイン以下どこからでも参照できます。たとえばhttp://www.example.comhttps://ssl.example.com みたいな感じでサブドメインで分けてサーバーを管理してるような場合でも使えるので、便利だと思います。

なお、クッキーの動きを見るにはFireFoxが便利。ツール→オプション→プライバシー→Cookieでクッキーの状態を確認できます。

2006年4月27日木曜日

OSを再インストールした

愛機Let'snoteY4の調子が悪くなってきた。
具体的には、
・Windowsの起動とシャットダウンが遅い
・IEでウェブページを開くのが非常に重い
といった症状。
IEのキャッシュを消したり、レジストリクリーナーを使ってみたりしてもダメ。
購入してから10ヶ月ほど経つので、だいぶガタがきてるのかも。(使い方荒っぽいし)
というわけでOS再インストールに踏み切った。
購入時にHDDを分割しておいたので必要なファイルはすべてDドライブに退避。CドライブにWindowsを入れ直した。(分割しといてよかったー)
そして、再インストールすると見違えるような速さに!!
起動もシャットダウンも速い。IEもサクサク軽快だ♪やっぱり年に一回くらいは再インストール必要ですな。

2006年4月21日金曜日

LinuxのPHPからWindowsのMSSQLに接続する

仕事でLinuxサーバーのphpからWindowsサーバーのMS SQL Serverに接続するアプリを作る。というのをやりました。
というわけで、接続が確立するまでの手順をメモしておきます。さらっと書いてありますが、半日くらいつぶれました。

〓インストール〓
◆apache2.2.0インストール
~省略~

◆unixODBCインストール
# tar zxvf unixODBC-2.2.11.tar.gz
# cd unixODBC-2.2.11/
# ./configure --enable-gui=no
# make
# make install


◆libiconvインストール
# tar zxvf libiconv-1.9.2.tar.gz
# cd libiconv-1.9.2/
# ./configure
# make
# make install


◆freetds0.63インストール
# tar zxvf freetds-stable.tgz
# cd freetds-0.63/
# ./configure --enable-msdblib --prefix=/usr/local/freetds
# make
# make install


◆php5.1.2インストール
./configure --with-apxs2=/usr/local/apache2/bin/apxs \
--enable-mbstring \
--enable-mbstr-enc-trans \
--enable-trans-sid \
--enable-mbregex \
--with-unixODBC \
--with-mssql=/usr/local \
--with-sybase=/usr/local \
--with-mysql


以上でインストール完了。
ちなみに後で気が付いたんだけど、mssql関数だけ使う(odbc関数を使わない)場合はunixODBCとlibiconvは必要ないらしい。

〓freetdsの設定〓
# vi /usr/local/etc/freetds.conf
[sqlserver]
port = 1433
tds version = 9.0

※MSSQL2005の場合はtds versionを9.0にする

〓接続テスト用スクリプト〓
ここではPEAR::DBを使ってますが、mssql_***関数を使っても普通に動きます。
(というか、PEAR::DBもmssql_***を使ってるみたいなのでどっちでも同じ)
<?php
require_once('DB.php');
$db = DB::connect("mssql://sa:password@192.168.1.100/MSSQLDB");
// エラーチェック
if(DB::isError($db)){echo"DB接続エラー : " . DB::errorMessage( $db ) . "<BR>";}
else{echo "DB接続成功 : " . $db->toString() . "<BR>";}
$sql = "select * from USER_T";
$rs = $db->query($sql);
while($row = $rs->fetchRow(DB_FETCHMODE_ASSOC))
{ echo $row[user_id] . " : " . $row[user_name] . "<br>"; }
exit;
?>


〓その他注意事項〓
普段MySQLを使い慣れてるので、MSSQLはやはり違和感があります。
あとSJISはいろいろと面倒。
特に今回はinsertとupdateのとき、文字列にダブルクオートが入ると文字化けする問題が発生して困りました。
php.iniのmagic_quote関係をいじってみてもうまくいかないので、最終的にhtmlspecialcharを使ってデータ格納前にダブルクオートを無理矢理&quot;に変換。そして表示するときは変換を戻す、という処理を加えてなんとか回避しました。。

〓参考〓
PukiWiki:http://planet-m.dip.jp/index.php?Linux%A4%C8PHP%A4%C7SQLServer%A4%F2%A4%A4%A4%B8%A4%EB
PHP-users ML:http://ns1.php.gr.jp/pipermail/php-users/2002-May/007554.html
PHPマニュアル MSSQL関数:http://php.mirror.netmonic.com/manual/ja/ref.mssql.php
PukiWiki(おさるさん):http://www.magic3.org/sarucast/index.php?PHP-SQL%20Server%C0%DC%C2%B3

2006年4月14日金曜日

PEARのTEXT_Passwordを使う

これまえパスワードをランダムで生成する場合、「makeRandomPassword」みたいな名前で関数を作ってそれを呼び出して使ってたんですが、PEARにText_Passwordという、まさにそれをやってくれるクラスがあるのを知りました。で、早速使ってみる。
インストール
# pear install Text_Password

使う
<?php
require_once('Text/Password.php');
echo Text_Password::create(10,'unpronounceable','alphanumeric');
?>

ううむ、非常に簡単で手軽だ!これからはこいつを使おう。

2006年4月2日日曜日

USEN「GYAO HIKARI」が来る!

とうとう我が家も光ファイバ環境に!
今住んでるマンションのオーナーが重い腰を上げてくれて、USENギャオ光の導入が決まった!工事&開通はいつになるか明示されてないけど、とりあえず申込書を提出。
プロバイダ料込みで月2,980円はADSLに比べると圧倒的に安い。さらに光になれば通信速度は断然早くなると思われる。
いいことずくめの光環境導入。早く開通しないかなー。待ち遠しい。
有線ギャオ光

2006年3月30日木曜日

osCommerceのMo Pics Modificationモジュールでエラーが出る

osCommerceにMo Pics Modificationtというモジュールを入れたらdefault.phpが真っ白になってしまう。という現象に遭遇した。
とりあえずapacheのログを見てみても参考になりそうな情報はない。
仕方ないので、ソースを一行一行調べていくうちに「catalog/includes/functions/html_output.php」に問題があることが判明。さらに「tep_parse_input_field_data」という関数が原因だとわかった。
で、「tep_parse_input_field_data」でググってみると下記のブログに出会った。
http://www.kanalize.com/modules/wordpress/index.php?p=15
なるほど、関数が競合してるのか。
さっそく関数をコメントアウトしてみると、おお、無事動いた。
めでたしめでたし。

2006年3月29日水曜日

ウェブ進化論 本当の大変化はこれから始まる

会社の同僚に勧められて読みました。司馬遼太郎以外の本、特にIT系の本を読むのはすごく久しぶりなのでなかなか新鮮な感じです。
いきなりですけど本書の結論としては
「これから先、ネットによって社会はまだまだ変わってゆく。パラダイムシフトが必要だ!」
というところへいきつく。
で、その結論にたどりつくまでの過程がおもしろくて勉強になります。まずオープンソースプロジェクトとかGoogleやAmazonに代表されるサービスを通して現在のネット社会を分析。そしてそこから未来のネット社会の姿を予想し、その未来に対処するための心構えを示唆してくれます。
あと、作中に頻出する『あちら側』『こちら側』という表現はおもしろいし、使えそう。IT業界用語として定着しそうな気がしました。
この本を読んだおかげで、今後のウェブがもたらす変化した社会について、漠然とですが心構えが身についたような感じです。その心構えは今すぐに効果として現れることはないと思うけど、今後何年・十何年かけてジワジワとボディブローみたいに効いてくるような予感がします。
新書なので読みやすく、ボリュームもちょうど良い。とりあえず読んでおいて損は無い一冊だと思います。

2006年3月24日金曜日

携帯端末のUserAgent

携帯端末用ブラウザにはさまざまな種類があり、それについての情報がウェブ上に沢山ありますが、中でもこのサイトが一番分かりやすかったです。
http://www.mt312.com/php/env.mobile.html
以下、各キャリアのホームページのユーザーエージェント情報。
ドコモのユーザーエージェント
http://www.nttdocomo.co.jp/p_s/imode/xhtml/s1.html#1_2
AUのユーザーエージェント
http://www.au.kddi.com/ezfactory/tec/spec/4_4.html
vodafoneのユーザーエージェント
http://developers.vodafone.jp/dp/tech_svc/info/useragent.php

2006年3月18日土曜日

ファイルアップロード先のパスをデフォルトで指定

MTのファイルアップロードには「アップロード先: (オプション)」というのがある。これを指定すれば「/image/hoge」みたいにアップする先を自分で決められる。
便利なようだけど、毎回入力する手間があるのと、さらに間違えて「/images/hoge」とか指定してしまい、画像格納ディレクトリが複数できてしまって美しくない、というようなことが起こりがちです。
そんなわけで、デフォルトで値を指定するようにしてみました。
/mt/tmpl/cms/upload.tmplの29行目のところを以下のように修正。
修正前
<input name="extra_path_site" />
修正後
<input name="extra_path_site" value="images/archive" />

ENABLE_ARCHIVE_PATHSを有効にしてる場合は21行目も同様の修正が必要だと思います。
すごく単純なことだけど、手間が省けてミスも防げるのでなかなか便利です。

2006年3月17日金曜日

osCommerce→zencartの移行メモ

osCommerceで稼動中のショッピングサイトを、zencartに移行するという仕事をやったので、そのときの注意事項をメモしておきます。

ちなみにoscのバージョンは不明(たぶん2.2)、zenのバージョンはzen-cart-v1.2.0-l10n-jp-6です。

---
◆DB
・oscからデータを抜き出す(dump)ときは、必ず「データのみ」にする。(oscとzenでテーブルのカラム数がだいぶ違うため)
・【address_bookテーブル】oscはプライマリキーが「address_book_id」と「customer_id」に張られている。それに対してzenは「address_book_id」のみ。なので修正が必要。
・【categories_descriptionテーブル】langidが異なっていたので、一括変換。『update `categories_description` set language_id = 2 WHERE language_id = 4;』
・【products_description】langidが異なっていたので、一括変換。『update `products_description` set language_id = 2 WHERE language_id = 4;』

◆画像
・oscのimagesをそのまんまzenのimagesに全コピー

◆その他
・カテゴリ画像をカテゴリページに表示させるために、tpl_index_product_list.phpをカスタマイズした。カテゴリ画像自体はtpl_products_next_previous.phpで出してる。
・クーポンは使わないので、注文合計モジュールからクーポンモジュールをアンインストール
・ソート順を変更するには「追加設定・ツール→ショップ管理用ツール→全商品」の価格ソートを更新。これをやらないとうまくソートできない。

◆httpsの設定は、「includes/configure.php」のENABLE_SSL_*をtrueに。管理画面は別に「admin/includes/configure.php」を設定する。

◆国名非表示&都道府県プルダウンモジュールを導入
http://www.zen-cart.jp/pukiwiki/pukiwiki.php?%A5%B3%A5%F3%A5%C8%A5%EA%A5%D3%A5%E5%A1%BC%A5%B7%A5%E7%A5%F3
---

ほかにもいろいろカスタマイズしたけど、メモし忘れてしまった。。

なお、oscのことはあまり詳しくないので、oscに比べてzenがどうとか、そういう比較はほとんどわかりません。ただ、印象としてはzenのほうがテーブル数も多いし(oscが49個、zenは93個)、ファイル数も多く、includeとrequireも多いのでカスタマイズはやりにくい感じがします。

あと、zencart.jpの掲示板がおおいに役立ちました。

http://www.zen-cart.jp/bbs/

カスタマイズや設定方法について多くの質問と回答が寄せられており、かなり助けられました。
逆に言うと、この掲示板以外にはほとんど有用な情報は見つけられませんでした。。
以上。

2006年3月15日水曜日

携帯の空メール機能を実装

仕事でやったので、次の機会のためにメモしときます。
やること

 1.ユーザーがregist@hoge.comへ空メールを送る
 2.サーバーでメールを受ける
 3.内容をコマンドラインphpに渡す
 4.phpでメール内容を解析し、ユーザーに会員登録用フォームのURLを挿入したメールを返信

aliasesの設定
vi等で/etc/aliasesを開き、おしりのところに以下を追加。
regist: "| /path/to/script/empty_mail_regist.php"
追加や編集をしたらnewaliasesを実行して設定を反映する。(忘れてしまいがちなので注意)

phpスクリプトを用意
/path/to/script/empty_mail_regist.phpを書く。PEARのMail_Mimeクラスを使ってヘッダを解析してます。

#!/usr/local/bin/php -q
<?php
//PEARのライブラリ読み込み
require_once('/path/to/pear/Mail/mimeDecode.php');
//メールソースを標準入力から読み込み
$source = file_get_contents("php://stdin");
if(!$source)
{
  echo "fail!\n";
  exit();
}
//メール解析
$params['include_bodies'] = true;
$params['decode_bodies']  = true;
$params['decode_headers'] = true;
$decoder = new Mail_mimeDecode($source);
$structure = $decoder->decode($params);
$from = mb_convert_encoding(mb_decode_mimeheader($structure->headers['from']), mb_internal_encoding(), "auto");
if( preg_match( '/<([^>]+)>$/', $from, $regs )){ $from=$regs[1]; }
$from = strtolower($from);
//会員登録用URL
$body = "https://hoge.com/user_regist.php?mail=" . rawurlencode($from);
//メール返信
mb_internal_encoding("utf-8");
mb_language("japanese");
mb_send_mail($from, "empty_mail", $body, "From: admin@hoge.com");
?>


以上。

仕組みがわかれば案外簡単です。(やってることが超シンプルってこともありますが)

上記の場合はヘッダからFromを取得してるだけですが、添付ファイルとかサブジェクトなどを取得する場合は日本語関連の問題などが出てきそうな気がします。
参考URL
http://labo0000.jp/maildo/maildo.html

2006年3月14日火曜日

携帯端末用HTMLフォームでの入力補助

携帯端末用のHTMLフォームにて、テキストフィールドで情報を入力する際、下記のような属性を与えれば入力モードの指定ができます。
ひらがな入力:istyle="1" mode="hiragana"
半角カナ入力:istyle="2" mode="katakana"
英字入力:istyle="3" mode="alphabet"
数字入力:istyle="4" mode="numeric"

istyleはiモードとEZwebで、modeはvodafoneで効果がある。下記のように、両方セットで入れとけばどっちにも対応できます。
<input type="text" name="hoge" istyle="1" mode="hiragana"> 

2006年3月12日日曜日

postgresでSQLのログを取得する

「postgres8.0で、SQLのログを取る」という作業をやった。

/var/log/postgres

初期状態ではここにエラーログ等が記録されるようになってるが、今回はここにDML(insert.update.delete)のログも残すようにした。

設定は簡単。postgresql.confにある「log_statement」のところを「log_statement = 'mod'」にするだけ。

そして「pg_ctl reload」で設定を読み込ませればDMLが記録されるようになります。

以上。

http://ml.postgresql.jp/pipermail/pgsql-jp/2003-November/015217.html
http://www.sraoss.co.jp/PostgreSQL/8.0/changes.html
http://www.postgresql.jp/document/pg721doc/reference/app-pg-ctl.html

2006年3月10日金曜日

Smartyのアウトプットフィルタを使ってみる

ウェブサイト(UTF-8)の登録フォームを携帯端末(SJIS)にも対応させるのをやろうと思い、Smartyのアウトプットフィルタを使ってみた。

こんな感じ
$smarty->register_outputfilter("filterSjis");
function filterSjis($buff, &$smarty)
{
return mb_convert_encoding($buff,"SJIS","UTF-8");
}


プリフィルタとポストフィルタはテンプレートに記述されている文字列を変換するだけで、DBなどから動的に出力する文字列には効かない。アウトプットフィルタの場合はブラウザへ出力する直前のデータをフィルタしてくれる。

これで無事解決。。。。と思ったのだけれど、このままでは出力されるヘッダがUTF-8のままのため、文字化けが発生してしまう。さて、どうしたもんか、、、と思いつつGoogleで調べてみたら「ini_set("default_charset", "Shift_JIS");」を入れれば解決できることがわかった。

これが最終形
$smarty->register_outputfilter("filterSjis");
ini_set("default_charset", "Shift_JIS");
function filterSjis($buff, &$smarty)
{
return mb_convert_encoding($buff,"SJIS","UTF-8");
}

MTのトラックバック通知メールのトラックバックを編集URLが改行されてしまう

MTで、トラックバックが入ったら自動でメール通知してくれる機能がある。で、このメールに記載されるトラックバック編集用URLが途中で改行されてしまって困っていた。
こんな感じ↓
「エントリ名 (ブログ: ブログ名、エントリーID: ****)」への未承
認のトラックバックを受け付けました。トラックバックを公開するためには承認を
してください。
トラックバックを承認: <http://mt.kawama.jp/mt.cgi?__mode=view&id=***&_t
ype=ping&blog_id=***>

いろいろ試してみたら、/mt/tmpl/email/new-ping.tmpl を編集すれば簡単に直せることが分かった。
7行目を以下のように変更。見ての通り改行を入れるだけです。ついでに余分な<>も取り除きました。
変更前
<MT_TRANS phrase="Approve this TrackBack:"> <<TMPL_VAR NAME=EDIT_URL>>

変更後
<MT_TRANS phrase="Approve this TrackBack:">
<TMPL_VAR NAME=EDIT_URL>

これでトラックバックの管理がかなりやりやすくなりました。

postgresqlでクエリ実行ログを取る

postgresqlのバージョン7.4以前の場合は、コンパイルオプションでログを取るように明示的に指定しなくてはいけないらしい。
7.4以降はデフォルトでログを取るようになっているが、デフォルトではクエリログは取得しないので、postgresql.confにて設定が必要。
↓ここに詳しい内容が載ってます
http://ml.postgresql.jp/pipermail/pgsql-jp/2003-November/015217.html

2006年3月9日木曜日

mysqlとphpの連携で文字化け。skip-character-set-client-handshakeで解消

だいぶ使い慣れてきたMySQL5.0。

が、しかし!油断していたら文字化けが発生!

新しいサーバーにmysqlとphp、apacheを設置し、いつものようにアプリ開発しようと思ったが、mysqlからselectしてphpでデータ出力する際、日本語が「????」という感じで、はてなマークの羅列になってしまう。

こんな現象初めてだ。。。
しばらく悩んだけど、google先生が解決してくれた。「skip-character-set-client-handshake」というおまじないで文字化け問題解消。my.cnfの[mysqld]の項に以下のような感じで一行追加。

[mysqld]
skip-character-set-client-handshake


mysqldをリスタートしたら日本語が表示できるようになりました。よかったよかった。

ちなみに「skip-character-set-client-handshake」は、『サーバーの文字コード設定をクライアントでもそのまま使う』という意味だとか。

http://puchiko.lowtech.ne.jp/?itemid=349&catid=27

2006年3月8日水曜日

JavaScriptでフォームで参照された画像をリアルタイムに表示する

参考になるサイトを発見したので、忘れないようにブックマーク。
firefoxは仕様上の問題でダメみたいだけど、なかなか使えそう。
http://codeweb.seesaa.net/article/6891945.html

2006年3月3日金曜日

MySQLのcase構文

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_15.htm
これまでcase構文の存在を知らなかったので、目からウロコだった。
case、すんごい使えそう。これからバリバリ活用していきます!

2006年2月24日金曜日

ファイル検索・一括置換ソフト「Devas」

「大量のテキストファイルの中から、目的の文字列を含むファイルを検索したい」
そんなときに役立つのがこのソフト。会社の同僚に教えてもらって使ってみたんですが、とにかく速い!おすすめです。
http://www.vector.co.jp/soft/win95/util/se162621.html

2006年2月17日金曜日

Movabletypeの更新通知メールをカスタマイズ

MTの更新通知メール(エントリが更新された際に、読者向けに送信するメール)の表示内容を、すこしばかりカスタマイズする必要が出てきた。
で、ソースを辿っていくと
/mt/lib/MT/App/CMS.pm
の中に「send_notify」というサブルーチンを発見。どうやらこれっぽい。
変数$bodyの中に文字列をいくつか追加。通知メールを発射してみたら見事に成功!
拍子抜けするほど簡単だった。

2006年2月11日土曜日

汎用jpドメインのレジストラ移管

先日、.comドメインをバリュードメインへレジストラ移管した。
さらにもうひとつ、移管したいドメインがある。このサイトで使っている「kawama.jp」だ。
kawama.jpは5月で有効期限が切れるので更新しなくてはいけないのだが、今のレジストラだとなんと更新に7,140円もかかってしまう。バリュードメインだと3,690円なので約半額。この差は大きい。。。
しかし、バリュードメインで可能なドメイン移管は.com/.net/.orgなどのみ。.jpはリストに入っていない。うーん、移管できないのか、、、
と思っていたのだけれど、よくよく調べてみたら移管できることが分かった。
汎用jpドメインの移管について
なるほど、.jpドメインは.com/.net/.orgなどとは根本的に管理の仕組みが違っているため、それぞれ別の窓口から移管申請をする必要があるらしい。完全に見逃していた。。。
ドキュメントを読んで仕組みを理解し、さっそく「指定業者変更」で申し込む。
申し込み後2日ほどたってから、現在のレジストラからメールで案内が届く。「添付の用紙に署名捺印し、FAXか郵送で返送してください」とのこと。さっそく署名捺印してFAXで送付。折り返し「申し込み受付完了のメール」が届いた。それからさらに2日後くらいに、バリュードメインでログインしてみると、、、おお!取得済みドメインにkawama.jpが増えている!!
shiba-ryo.comとkawama.jp。いずれもはじめてのレジストラ移管でしたが割合スムーズに移管ができました。そして、移管によって節約できた金額はなんと、あわせて6,030円!!
お名○.comとか、料金が高いレジストラ(ほとんどのレジストラはバリュードメインより高いと思う)を使ってる人はぜひ移管するといいと思います。確実に節約できます。バリュードメイン、おすすめです。

2006年2月10日金曜日

gmailバックアップ

1アカウントにつき最大2GBの容量を誇るGmail。
このGmailをバックアップとして使おう、というおもしろいことをしてる方が結構いらっしゃる。よし、いっちょ試してみよう!と思ってやってみました。
「Gmail バックアップ」でググるといくつか参考になりそうなページが見つかりますが、一番参考になったのは下記のサイト。
http://espion.just-size.jp/archives/05/066180448.html
容量がでかい場合のファイル分割もしてくれるスグレモノです。
自分の環境ではmpackが入ってなかったのでmpackのrpm↓を拾ってきてインストール。これでばっちり使えました。
http://www.projectfox.mydns.jp/vinelinux31/vgetty/mpack-1.5-9.i386.rpm
80MB程度のファイルでテストしてみましたが、圧縮・分割・メール送信、そしてファイルダウンロード・結合・複合化まで、すべてうまく動きました。(うちはADSL環境なのでちょっと時間がかかりましたが)
とりあえず、しばらく深夜バッチで動かしてみて様子を伺いたいと思います。

2006年2月9日木曜日

[ウイルス騒ぎ]pingは通るのにウェブにアクセスできない

知り合いの会社で、「突然ネットが繋がらなくなった!」という症状が出た。
調べてみると、どうもおかしい。
・クライアントPCから、ブラウザでyahooとかにアクセスできない
・クライアントPCから、ブラウザでルーターへアクセスすることはできる
・クライアントPCから、yahooとかにpingは通る
という状態。変だ。
モデムやルーターを再起動しても変化なし。IPが競合してたりする様子もない。。
2時間ほど悩んだ末、3台あるクライアントPCの1つを停止してみたところ、ルーターに大量の、あきらかにアヤシイログがだだーーーーっと表示された。
これはもしや。。。と思ってそのクライアントPCを起動し、netstat -aをしてみたら、やはり。。。原因はウイルスだった。
。。。WindowsUpdateとウイルスソフトの導入は、最低限やっておきましょう。

2006年2月8日水曜日

ドメインのレジストラ移管

レジストラから、shiba-ryo.comのドメイン更新案内のメールが届いた。
おお、司馬遼太郎を読むをオープンしてからもう1年経つかぁ。。。などど思いつつ、更新手続きをしようとサイトへ行ってみたら、、、
.comドメインの更新:3,570円(込)
た、高いっ!!!1000円くらいだと思ってたのに!
料金改定で高くなったのか?それとも前からこんなに高かったのか?(だとしたら自分は何を考えてこのレジストラでドメインを取得したんだろう。。。)
というわけで、レジストラ移管を決意。移管先はもちろん、バリュードメインだ。
安いし(com/net/orgなら790円)、ダイナミックDNSなども無料で使えてとても便利。さっそくバリュードメインでレジストラ移管を申し込む。
移管の手続きはこんな感じ。
ドメイン移管方法
。。。
2月1日に手続きを申し込み、移管が完了したのが2月7日だった。
もっと面倒なものだと思っていたけど、非常にスムースで、且つ簡単だった。いやぁ、よかったよかった。

2006年2月7日火曜日

CPAN経由でDBI、DBD::mysqlをインストール

MT用にDBIとDBD::mysqlをインストールしようと思い、ググったら下記のサイトを発見。
http://y-kit.jp/saba/xp/cpan.htm
CPANに関する説明も充実しており、DBD::mysqlのエラー回避法もまとまってて助かりました。
ちなみに、「libmysqlclient.so.15: cannot open shared object file」というエラーが出たがこれはld.so.confにlibmysqlclient.soが入ってるディレクトリのパスを入れて、ldconfigを実行すれば通るようになります。

2006年2月4日土曜日

かきいれどき(×掻き入れ時 ○書き入れ時)

通勤電車で司馬遼太郎の本を読んでいたら、「書き入れ時」という記述があった。
これまでずっと掻き入れ時(お客を店に掻き入れる)だと思ってたけど、違ったようだ。
辞書で調べてみたら、
〔帳簿の記入に忙しい時の意から〕商売が繁盛してもうけの非常に多い時。
とあった。なるほど。
勉強になった。

2006年2月3日金曜日

[Smarty]mb_truncate

Smartyにtruncateという文字列修正の関数がある。指定した文字数で文字列を切り捨てるという便利なものなのだが、マルチバイト文字列に対してこれを使うと文字化けが起こってしまう。
http://www.zend.co.jp/tech/index.php?cmd=read&page=%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%BB%D8%BF%CB%2F%A3%B5%A1%A5Smarty
---
Smartyに標準搭載されているプラグインは、マルチバイト(日本語など)に対応していない。そのため、文字列を分断する動作を持つプラグイン(truncate, wordwrap など)は、マルチバイトに対応した代替プラグインを作成する必要がある。
---
というわけで、自作しようかと思ったが、既に作成して公開してくださってる方が!!
http://bayun.boo.jp/webdev/2005/11/smarty_1.html
いやぁ、助かりました。
◆追記
よく使うので、ここに置いておきます

modifier.mb_truncate.zip

[JavaScript]imgタグでonLoad

<body onLoad="hoge();">

という感じで、ページが読み込まれたら同時にJavaScript関数のhoge()を実行する。というのがよくやるパターン。調べてみたら、これをimgタグでもやることができるのを発見。

こんな感じ↓

<img src="/imgs/spacer.gif" width="0" height="0" onLoad="hoge()">

これをページのどこかに埋め込んでおけばbody onLoadと同じ結果が得られる。同じようにframeタグでも使える。

追記:
imgタグでonLoadなんてするより、普通にページにJavaScriptを埋め込んだほうが楽?(管理しやすい?)なことに気がついた。こんな感じ↓

<script type="text/javascript">
hoge()
</script>


JavaScript例文活用辞典

2006年2月1日水曜日

wgetでphpのバッチプログラムを実行

phpでバッチプログラムを動かす場合、cronに
0 3 * * * /usr/bin/lynx -source http://mydomain.com/batch.php
みたいなことをよくやるのだが、lynxだとhttpsに対応していないので困った。https対応版lynxとかもあるみたいっだけど、インストールが面倒。
。。。
しばらく悩んでいたけど、wgetを使う方法を思いついた。
0 3 * * * /usr/bin/wget https://mydomain.com/batch.php
これだけ。実行するたびにごみファイルがダウンロードされてしまうけど、気にしなければぜんぜんOK。
しかしwgetっていろんな使い道があるなぁ。

2006年1月31日火曜日

[エクセル関数] INDIRECT

INDIRECT関数とは、「文字列として入力したセルの番地や範囲名を、計算式で参照できる形に変換する。参照先を間接的に指定し、切り替えられるようにできる」というもの。
たとえば
・セルA1に「ほげ」と入れる
・セルB1に「A1」と入れる
・セルC1に「=INDIRECT(B1)」と入れる
するとセルC1には「ほげ」と表示される。
GoogleでINDIRECTで検索するといろいろと参考になるページが出てきます。

2006年1月28日土曜日

Smarty&PEAR講習会

会社でSmarty&PEAR講習会(超初級向け)をやりました。
自分のスキルレベルで講習会をやるなんて恐れ多いわけですが、とりあえずレジュメとサンプルコードを公開してみたいと思います。



〓Smarty〓
<概要>
・PHPのテンプレートエンジン
・楽天でも使っているというウワサ
・アプリケーションのロジックとデザインの切り分けが可能
*.php -> ロジックのみ
*.tpl -> デザインとコンテンツのみ
・速い
・変数の修正子(date_formatとか)
・フィルタ
・キャッシング
・HTMLとphpコードの切り分けが可能
  ↓ ↓ ↓
 ソースの可読性が高まる
  ↓ ↓ ↓
 バグ発生の確率が減る!
 (ファイル数は増えちゃうけど。。)
echo "<a href=\"" . $url . "\">" . $linktext . "</a>";
 ↓ ↓ ↓ ↓ 
<a href="{$url}">{$linktext}</a>
<サンプルコード>
smaSample.php
smaSample.tpl
<メモ>
・Smartyを継承したクラスを作っておくと楽。Googleで「MySmarty」で検索
・テンプレートの文字コードはUTF-8かEUCを使う。SJISはダメ!
・Smartyマニュアル(http://sunset.freespace.jp/smarty/)。困ったらここを見る
・[書籍]Smarty入門
〓PEAR〓
<概要>
・PHPのライブラリ集
・Perlで言うCPAN
・読み方は「ぺあー」
・エラーハンドラが便利
・使いこなせば工数大幅削減
・ライブラリ豊富
<主なライブラリ>
◆横綱
HTML_QuickForm
◆大関
DB
◆三役
HTTP_Download
Log
◆その他(まだ使ったことない)
Auth
HTTP_Request
XML_RSS
HTML_Menu
Services_Amazon
<サンプルコード>
QuickFormSample.php
QuickFormSample.tpl
<メモ>
・[書籍]PEAR入門 (とりあえず買うべし!)

2006年1月25日水曜日

Googleから振込が!

Google AdSense アカウントの非承認以来、失意のドン底。
。。。
そして、心の傷が癒えつつあった年明け正月3日、銀行の残高照会をしてみると、ななんと、、、Googleから12,630円の振込が!!!どうやら、アカウントが非承認になる直前に振込手続きが行なわれていたらしい。ラッキー♪
不幸中の幸い、地獄に仏とはまさにこのこと。Adsenseが使えないのはイタイけど、ちょっとしたお年玉でした。いやぁ、よかったよかった。

2006年1月18日水曜日

MovableTypeのGoogle API キー

MT3.2にアップグレードしたら、いくつか見慣れない機能が見つかる。「Google APIキー」というのが気になって調べてみた。
http://www.sixapart.jp/movabletype/manual/mtmanual_weblog_config.html#basic_config_others
http://www.hatayan.org/weblog/archives/2003/08/28/030825.php
さっそくGoogleAPIキーを登録し、MTに仕込んで使ってみた。
キーワード「司馬遼太郎」での結果↓
"><$MTGoogleSearchResult decode_html="1" property="title"$>

。。。なんか中国語のサイトがいっぱい出てきてしまった。言語はどうやって指定するんだろう。。

さらば、Zopeよ

ここ最近サーバーの調子が悪く、何度か再起動をしていたら
Error: The object named by "DBTab.ClassFactories.autoClassFactory" could not be imported
というエラーを吐いて、Zopeが起動しなくなってしまった。ググってみても日本語ページにはほとんど情報はない。がんばって英語ページも少し見てみたものの、どうもこのエラーは簡単には直らなさそうな感じ。。。
そんなわけで、思い切ってZopeをあきらめることにした。
まあ、ポート8080で旧コンテンツとして残しておいただけなので特に問題はない。放置し続けるとセキュリティホールになるリスクもあるのでちょうどいい機会かもしれない。
とりあえず別サーバーでZopeを起動し、wgetでコンテンツをすべて静的HTMLで保存。多少の調整をしつつコンテンツをすべて http://kawama.jp/02_04/に設置して完了。
Zopeはけっこう勉強したんだけど、結局日本ではぜんぜん普及しなかった。
ウェブアプリケーションサーバーとして、CMSとして、開発環境として、、、Zopeはウェブの統合プラットホームという意味で非常に優秀だと思うんだけど、「なんでもできる」のが逆にとっつきにくく感じられてしまっているのかもしれない。
でも、なにかの拍子で一気にブレイクする可能性もあるので、今後もちょくちょくチェックしようと思います。

2006年1月17日火曜日

PentiumとCeleronの差

仕事で数百KBのテキストファイルを20個ほど、秀丸の「全閣下」というマクロで半角カナ→全角カナ変換する、という作業をした。処理を早めるためにPentiumMのノートPCとCeleron2GhzくらいのデスクトップPCでそれぞれ処理をしたのだが、、、
。。。Celeronの処理が遅い。PentiumMの10分の1くらいの処理速度だった。結局Celeronマシンはほとんど役に立たず、9割くらいPentiumマシンで処理する結果になった。
普段PCを使っていてもPentiumとCeleronの違いはあまり実感しないけど、こういうところで差が出るんだなぁ、と勉強になりました。

2006年1月15日日曜日

memtest86

サーバーの調子が悪い。非常に悪い。
症状は、
・OSを起動してから数時間~数日経つと、何の前触れもなくサーバーが劇的に重くなる
・重いけれど、フリーズはしない
・重い間は、時計が止まる(dateコマンドで確認しても、時間が止まったまま)
・ログには特に何も残っていない
という感じ。この状態になるともうどうしようもないので、電源を切るしかない。。。
いろいろな可能性を検討してみた結果、どうもメモリがおかしいような感じだったので、memtest86というソフトでメモリチェックをしてみた。
http://www.memtest86.com/
memtest86でテストするときはメモリは1枚差しにしたほうがいいようです。うちのサーバーはメモリ2枚差しなので、1枚ずつテストしました。
で、テスト結果は、どちらも問題なし。。
その後メモリを差し直してサーバーを起動してみたところ、とりあえず問題なく1週間連続稼動中。
結局何が原因だったかはよくわからないまま。メモリがしっかり差さってなかったんだろうか。。もうしばらく様子を見てみます。

2006年1月12日木曜日

クレジットカードの番号をチェックする関数

クレジットカード番号のチェックデジットを利用した、カード番号チェックの関数を作成しました。

クレジットカード番号の法則は下記の通り。


  1. カード番号の奇数桁目を2倍にし、値が10以上になったら9を引く
  2. それぞれの数字を足す
  3. 2の結果が10の倍数になったら正しい番号。10の倍数で無ければ不正な番号


もちろん、この法則を通ったとしてもカード会社でオーソリかけないと本当に有効かどうかはわかりませんが、単純な入力ミス等を防ぐには役立ちます。
参考ページ:http://life7.2ch.net/test/read.cgi/credit/1089482722/

<?php
$credit_card_no = "4980123456789012";
if(checkCardDigit($credit_card_no)){ echo "OK牧場"; }
else{ echo "だめぽ"; }
function checkCardDigit($card_no)
{
$all = 0;
for ($i = 0; $i < 16; $i++)
{
if($i % 2){ $tmp = $card_no[$i]; }
else
{
$tmp = $card_no[$i] * 2;
if($tmp > 9){ $tmp = $tmp - 9; }
}
$all = $all + $tmp;
}
if($all % 10 == 0){ return true; }
else { return false; }
}
?>


◆2006/09/13追記
http://freeweb.supereva.com/tobiac/index.html?p
ここのページに、より深く作り込まれたクレジットカード番号チェック関数が公開されていました。checkcard.zipというやつです。
念のためこちらにもアップ→checkcard.zip

2006年1月11日水曜日

特定のIPやホストからの接続の場合のみ、コンテンツを表示する

.htaccessやhttpd.confに、
--------------------------------------------
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.012$
RewriteRule .* ___maintenance.html
--------------------------------------------
と書いてあげる。すると、
123.456.789.012からのアクセスの場合は普通にコンテンツを表示。
123.456.789.012以外からのアクセスの場合は___maintenance.htmlを強制的に表示。
ということができます。
正規表現を使えばもっと複雑な設定もできるようです。

2006年1月8日日曜日

MovableType3.2にアップグレード

最近トラックバックスパムとコメントスパムが多いので、スパム対策が施されているという、MovableType3.2にアップグレードしてみた。
アップグレードは意外とすんなり終わった。ただ、アップグレード完了後、エントリ一覧画面へ行くと
Can't handle date (52, 54, 15, 30, 10, 199) at lib/MT/Util.pm
というエラーが出る。どっかで見た事あるなぁ、、と思いつつ検索してみたら、perlのTime::Localモジュールを入れれば直るとのこと。早速
# cpan install Time::Local
で解決。
ちなみに3.2はUIがかなり変わっています。タブが効果的に使われるなどしてなかなか使いやすくなっていました。