2009年12月22日火曜日
弱ったなぁ

弱った。
というか、困った。

ケータイサイトを作れ、だとさ。

うーん。
ぼちぼちPHP使ってるけどなぁ、ケータイサイトはどうしたらいいか判らんなあ。



0 コメント | コメントを書く | コメントの表示
2009年11月5日木曜日
webalizerの画像が文字化けする

調べれば結構出てくるんだけど、僕の場合の対応策をメモっとく。

HTML自体は文字化けしてなくても、画像が文字化けする場合、TrueTypeFontがないかららしい。
なので、とりあえずフォントを探してみる。

OSによって違いがあるかもしれないけど、/usr/share/fonts/あたりを探してみる。

で、どこかにTrueTypeってディレクトリがあると思うので、日本語のTTFのパスをチェックして、webalizerのconfファイルに書く。

TrueTypeFont 日本語TTFのパス

こいつを追記してやればOK。



0 コメント | コメントを書く | コメントの表示
2009年10月28日水曜日
httpd.confのSetEnvIfの定義

ログ採取の条件を変更したかったので、あれこれ弄繰り回してたんだけど、なかなか…

自社のIPアドレスは除外
画像へのリクエストも除外

この条件があらかじめ設定されている状態だった。

SetEnvIf Remote_Addr XXX.XXX.XXX.XXX no_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" no_log

CustomLog /home/www/logs/access_log combined env=!no_log

これで指定されたIPアドレス、画像の拡張子以外をaccess_logに書き込むようになる。

問題はここから。

ある特定のディレクトリだけは、別のログに書きたい。
なので、こうしてみた。

SetEnvIf Remote_Addr XXX.XXX.XXX.XXX no_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" no_log
SetEnvIf Request_URI "^/abc/" no_log
SetEnvIf Request_URI "^/abc/" abc_log

CustomLog /home/www/logs/access_log combined env=!no_log
CustomLog /home/www/logs/abc_access_log combined env=abc_log

でもこれじゃダメ。
アクセスログでは除外してあったIPアドレスと画像のリクエストが抜かれていない。

ってことで色々調べてみたけど、なんだか上手くいかない。
正規表現だろってことで、"^/abc/"を否定してみたかったんだけど、上手くいかない(多分、僕の正規表現がまずかったのかな)。
そもそもenv=(env=!)が複数指定できないのが痛い。

mod_setenvif - Apache HTTP サーバ
ここにSetEnvIfの構文について書いてある。

SetEnvIf attribute regex [!]env-variable[=value] [[!]env-variable[=value]] ...

このenv-variableの指定の仕方について、こう書いてある。
これは、

varname
!varname
varname=value
のどれかの形式になります。

最初の形式では、値は "1" に設定されます。 二つ目はもし値が定義されていればそれを取り除きます。 三つ目は変数を value の与えられた値に設定します。 2.0.51 以降では、regex 内に $1..$9 が存在すればそれを認識し、regex の対応する丸括弧で囲まれた部分で 置換します。mod_setenvif - Apache HTTP サーバ


「!」をつけると単純に否定されるワケではなくて、あらかじめセットされているものから除外されるようになるってことかな?

まずはこれで、おおまかに採取したいログを定義する。
SetEnvIf Request_URI "^/abc/" abc_log

そのabc_logから除外したいものを選択する。
SetEnvIf Remote_Addr XXX.XXX.XXX.XXX !abc_log
SetEnvIf Request_URI "\.(swf)|(jpeg)|(jpg)|(gif)|(css)|(txt)|(ico)$" !no_log

そうすれば「/abc/」にあったリクエストから、特定のIPアドレスやURLが除外される、と。

ただ、このRequest_URIって、QUERY_STRINGが読めないみたいで、例えば画像を呼び出すだけのようなxxxx.php?image=test.jpgとかって来られると困るんだよなぁ。
これはmod_rewriteで対処できるようだけど、そこまでする必要があるのかどうか…



0 コメント | コメントを書く | コメントの表示
2009年10月26日月曜日
CPANで苦労してみたり

先日のエントリは言わばテストであって、本日本番環境へインストールを試みたワケです。

今日はこのあたりのサイトを参考にさせていただきました。
[ヅラド] FTP が利用できない環境で Perl CPAN の環境を設定する on Linux
http://www.nilab.info/zurazure2/000246.html

CPANのダウンロードサイトにローカルを追加する - azrizの日記
http://d.hatena.ne.jp/azriz/20090815/1250311032#


まずはCPANを実行する。

$ perl -MCPAN -e shell
We have to reconfigure CPAN.pm due to following uninitialized parameters:

cpan_home, keep_source_where, build_dir, build_cache, scan_cache, index_expire, gzip, tar, unzip, make, pager, makepl_arg, make_arg, make_install_arg, urllist, inhibit_startup_message, ftp_proxy, http_proxy, no_proxy, prerequisites_policy, cache_metadata

/usr/lib/perl5/5.8.5/CPAN/Config.pm initialized.
(以下省略)


問題はこのあと。
Your ftp_proxy?  
Your http_proxy?
Your no_proxy?
You have no /root/.cpan/sources/MIRRORED.BY
I'm trying to fetch one
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
Fetching with LWP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY.gz
Fetching with Net::FTP:
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
Fetching with Net::FTP
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY.gz

Trying with "/usr/bin/links -source" to get
ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY
ERROR at dump.c:188: Receive timeout


タイムアウト?

どうもftp.perl.orgが死んでるらしい。
ってことで、FTPをCtrl+cで中断して、別のサイト(http)を追加してみる。
ftp.perl.org|163.143.1.21|:21 に接続しています... Issuing "/usr/kerberos/bin/ftp -n"

Not connected.
Local directory now /root/.cpan/sources
Not connected.
Not connected.
Not connected.
Not connected.
Not connected.
Bad luck... Still failed!
Can't access URL ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY.

Please check, if the URLs I found in your configuration file () are valid.
The urllist can be edited. E.g. with 'o conf urllist push ftp://myurl/'

Could not fetch MIRRORED.BY
CPAN.pm needs at least one URL where it can fetch CPAN files from.

Please enter your CPAN site: [] http://ftp.cpan.jp/
Enter another URL or RETURN to quit: []
New set of picks:
http://ftp.cpan.jp/


commit: wrote /usr/lib/perl5/5.8.5/CPAN/Config.pm
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

cpan>


http://ftp.cpan.jp/を選んだのは、特に意味はない。調べてみたら、一番多く出てくるのできっと使えるサイトなのだろうと思った程度。

心配なので、テストインストールしてみる。
cpan> test GD
CPAN: Storable loaded ok
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
http://ftp.cpan.jp/authors/01mailrc.txt.gz
LWP failed with code[500] message[Can't connect to ftp.cpan.jp:80 (Bad hostname 'ftp.cpan.jp')]

Trying with "/usr/bin/links -source" to get
http://ftp.cpan.jp/authors/01mailrc.txt.gz
ERROR at dump.c:188: Host not found

System call "/usr/bin/links -source "http://ftp.cpan.jp/authors/01mailrc.txt.gz" > /root/.cpan/sources/authors/01mailrc.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/authors/01mailrc.txt.gz] doesn't exist

Trying with "/usr/bin/wget -O -" to get
http://ftp.cpan.jp/authors/01mailrc.txt.gz
--13:10:55-- http://ftp.cpan.jp/authors/01mailrc.txt.gz
=> `-'
ftp.cpan.jp をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.

System call "/usr/bin/wget -O - "http://ftp.cpan.jp/authors/01mailrc.txt.gz" > /root/.cpan/sources/authors/01mailrc.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/authors/01mailrc.txt.gz] doesn't exist
Please check, if the URLs I found in your configuration file
(http://ftp.cpan.jp/) are valid. The urllist can be edited. E.g. with 'o
conf urllist push ftp://myurl/'

Could not fetch authors/01mailrc.txt.gz
Fetching with LWP:
http://ftp.cpan.jp/modules/02packages.details.txt.gz
LWP failed with code[500] message[Can't connect to ftp.cpan.jp:80 (Bad hostname 'ftp.cpan.jp')]

Trying with "/usr/bin/links -source" to get
http://ftp.cpan.jp/modules/02packages.details.txt.gz
ERROR at dump.c:188: Host not found

System call "/usr/bin/links -source "http://ftp.cpan.jp/modules/02packages.details.txt.gz" > /root/.cpan/sources/modules/02packages.details.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/02packages.details.txt.gz] doesn't exist

Trying with "/usr/bin/wget -O -" to get
http://ftp.cpan.jp/modules/02packages.details.txt.gz
--13:10:58-- http://ftp.cpan.jp/modules/02packages.details.txt.gz
=> `-'
ftp.cpan.jp をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.

System call "/usr/bin/wget -O - "http://ftp.cpan.jp/modules/02packages.details.txt.gz" > /root/.cpan/sources/modules/02packages.details.txt"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/02packages.details.txt.gz] doesn't exist
Please check, if the URLs I found in your configuration file
(http://ftp.cpan.jp/) are valid. The urllist can be edited. E.g. with 'o
conf urllist push ftp://myurl/'

Could not fetch modules/02packages.details.txt.gz
Fetching with LWP:
http://ftp.cpan.jp/modules/03modlist.data.gz
LWP failed with code[500] message[Can't connect to ftp.cpan.jp:80 (Bad hostname 'ftp.cpan.jp')]

Trying with "/usr/bin/links -source" to get
http://ftp.cpan.jp/modules/03modlist.data.gz
ERROR at dump.c:188: Host not found

System call "/usr/bin/links -source "http://ftp.cpan.jp/modules/03modlist.data.gz" > /root/.cpan/sources/modules/03modlist.data"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/03modlist.data.gz] doesn't exist

Trying with "/usr/bin/wget -O -" to get
http://ftp.cpan.jp/modules/03modlist.data.gz
--13:11:00-- http://ftp.cpan.jp/modules/03modlist.data.gz
=> `-'
ftp.cpan.jp をDNSに問いあわせています... 失敗しました: 名前またはサービスが不明です.

System call "/usr/bin/wget -O - "http://ftp.cpan.jp/modules/03modlist.data.gz" > /root/.cpan/sources/modules/03modlist.data"
returned status 1 (wstat 256)
Warning: expected file [/root/.cpan/sources/modules/03modlist.data.gz] doesn't exist
Please check, if the URLs I found in your configuration file
(http://ftp.cpan.jp/) are valid. The urllist can be edited. E.g. with 'o
conf urllist push ftp://myurl/'

Could not fetch modules/03modlist.data.gz
Going to write /root/.cpan/Metadata
Warning: Cannot test GD, don't know what it is.
Try the command

i /GD/

to find objects with matching identifiers.

cpan>


ftp.cpan.jpはダメってこと!?

んじゃぁ、つなぎに行く先を変更したり増やしたりしないといかんなぁ。

対象のサイトはCPAN/SITESからピックアップ。出来ればhttpね。

CPAN/SITES
http://www.perl.com/CPAN/SITES.html


cpan> o conf urllist
urllist
http://ftp.cpan.jp/
Type 'o conf' to view configuration edit options


cpan> o conf urllist unshift http://ftp.jaist.ac.jp/pub/CPAN/

cpan> o conf urllist
urllist
http://ftp.jaist.ac.jp/pub/CPAN/
http://ftp.cpan.jp/
Type 'o conf' to view configuration edit options


cpan>


追加した後に、再度installしてみる(テストすべきでしたね)。

cpan> install GD
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
Warning: Found only 0 objects in /root/.cpan/Metadata
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
http://ftp.jaist.ac.jp/pub/CPAN/authors/01mailrc.txt.gz
Going to read /root/.cpan/sources/authors/01mailrc.txt.gz
Fetching with LWP:
http://ftp.jaist.ac.jp/pub/CPAN/modules/02packages.details.txt.gz
Going to read /root/.cpan/sources/modules/02packages.details.txt.gz
Database was generated on Mon, 26 Oct 2009 02:30:16 GMT

There's a new CPAN.pm version (v1.9402) available!
[Current version is v1.7601]
You might want to try
install Bundle::CPAN
reload cpan
without quitting the current session. It should be a seamless upgrade
while we are running...
(以下省略)


無事、入りました。

確認したサイトとともに、メモを残しておきます。



0 コメント | コメントを書く | コメントの表示
2009年10月20日火曜日
CentOS5 にあれこれインストール

ちょっと別のサーバの環境をいじる機会があったので、忘れないようにメモしておきます。

OSはCentOS5です。

色々とあってPerl+SQLiteの環境が欲しかったので、とりあえずSQLiteのファイルを作って、アクセス確認用のファイルを書いてみた。

SQLite - Perl
http://www.tuyudaku.net/sqlite/perl.html

「PerlでSQLiteに接続」という記事を参考にしてみた。

とりあえずVirtualHostの設定を確認するのも面倒なので、コマンドラインからアクセスしてみる。

# perl -f sqlite.pl
Can't connect to data source SQLite:dbname=test.db, no database driver specified and DBI_DSN env var not set at sqlite.pl line 5
#


まぁ、SQLiteのモジュールがないんだろうなって思って、インストール。
ここを参考にしました。
CPAN経由でLinuxにモジュールを組み込む
http://y-kit.jp/saba/xp/cpan.htm


# perl -MCPAN -e shell
Are you ready for manual configuration? [yes]
CPAN build and cache directory? [/root/.cpan]
Cache size for build directory (in MB)? [10]
Perform cache scanning (atstart or never)? [atstart]
Cache metadata (yes/no)? [yes]
Your terminal expects ISO-8859-1 (yes/no)? [yes]
File to save your history? [/root/.cpan/histfile]
Number of lines to save? [100]
Policy on building prerequisites (follow, ask or ignore)? [ask]


プログラムのパスを指定する箇所が続くけど、いくつかは無視した。

Where is your gzip program? [/bin/gzip]
Where is your tar program? [/bin/tar]
Where is your unzip program? [/usr/bin/unzip]
Where is your make program? [/usr/bin/make]
Where is your links program? [/usr/bin/links]
Where is your wget program? [/usr/bin/wget]
Warning: ncftpget not found in PATH
Where is your ncftpget program? []
Warning: ncftp not found in PATH
Where is your ncftp program? []
Where is your ftp program? [/usr/kerberos/bin/ftp]
Where is your gpg program? [/usr/bin/gpg]
What is your favorite pager program? [/usr/bin/less]
What is your favorite shell? [/bin/bash]

'perl Makefile.PL'コマンドのパラメタ

Your choice: []

今度は'make'コマンドのパラメタ

Your choice: []

今度は'make install'コマンドのパラメタ

Your choice: [] UNINST=1

あと少し…

Timeout for inactivity during Makefile.PL? [0]
Your ftp_proxy?
Your http_proxy?
Your no_proxy?


このあとサイトを探しに行くみたい。
(1) Africa
(2) Asia
(3) Australasia
(4) Central America
(5) Europe
(6) North America
(7) Oceania
(8) South America
Select your continent (or several nearby continents) [] 2
Sorry! since you don't have any existing picks, you must make a
geographic selection.

(1) China
(2) Hong Kong
(3) India
(4) Indonesia
(5) Japan
(6) Kazakhstan
(7) Republic of Korea
(8) Russia
(9) Singapore
(10) Taiwan
(11) Thailand
(12) Turkey
Select your country (or several nearby countries) [] 5
Sorry! since you don't have any existing picks, you must make a
geographic selection.

(1) ftp://ftp.dti.ad.jp/pub/lang/CPAN/
(2) ftp://ftp.jaist.ac.jp/pub/CPAN/
(3) ftp://ftp.kddilabs.jp/CPAN/
(4) ftp://ftp.nara.wide.ad.jp/pub/CPAN/
(5) ftp://ftp.riken.jp/lang/CPAN/
(6) ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
(7) ftp://ftp.u-aizu.ac.jp/pub/CPAN
(8) ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/
Select as many URLs as you like (by number),
put them on one line, separated by blanks, e.g. '1 4 5' [] 1 2 3 4 5 6 7 8

なんか問題あるとイヤだから、全部指定してみた。

Enter another URL or RETURN to quit: []
New set of picks:
ftp://ftp.dti.ad.jp/pub/lang/CPAN/
ftp://ftp.jaist.ac.jp/pub/CPAN/
ftp://ftp.kddilabs.jp/CPAN/
ftp://ftp.nara.wide.ad.jp/pub/CPAN/
ftp://ftp.riken.jp/lang/CPAN/
ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/
ftp://ftp.u-aizu.ac.jp/pub/CPAN
ftp://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/


commit: wrote /usr/lib/perl5/5.8.8/CPAN/Config.pm
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support available (try 'install Bundle::CPAN')

cpan>


これでCPANの準備が終わった。んでDBD::SQLiteをインストールするんだけど…
cpan> install DBD::SQLite
(中略)
CPAN.pm: Going to build A/AD/ADAMK/DBD-SQLite-1.25.tar.gz

DBI 1.57 is required to configure this module, please install it or upgrade your CPAN/CPANPLUS shell
make: *** ターゲットが指定されておらず, makefile も見つかりません. 中止.
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
make had returned bad status, install seems impossible

cpan>


はぁ…
DBIがない(or 古い)ってこと?
じゃぁ
cpan> install DBI
(中略)
gcc -c -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -DVERSION=\"1.609\" -DXS_VERSION=\"1.609\" -fPIC "-I/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE" -W -Wall -Wpointer-arith -Wbad-function-cast -Wno-comment -Wno-sign-compare -Wno-cast-qual -Wmissing-noreturn -Wno-unused-parameter Perl.c
/bin/sh: gcc: command not found
make: *** [Perl.o] エラー 127
/usr/bin/make -- NOT OK
Running make test
Can't test without successful make
Running make install
make had returned bad status, install seems impossible

cpan>


まさか、gccがないなんて!

ってことで、今度はgccを入れるぜ!
いろんなサイトでyumを使ってgccを入れるにはこれだ!みたいなのがあったので、コピペしてみる。
# yum install gcc* compat-gcc* compat-glibc* compat-lib*
Loaded plugins: downloadonly, fastestmirror
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository addons is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Loading mirror speeds from cached hostfile
* epel: ftp.iij.ad.jp
* rpmforge: apt.sw.be
epel | 3.4 kB 00:00
rpmforge | 1.1 kB 00:00
primary.xml.gz | 0 B 00:30
http://apt.sw.be/redhat/el5/en/i386/rpmforge/repodata/primary.xml.gz: [Errno 4] Socket Error: timed out
Trying other mirror.
(以下省略)

つまり、yumがダメ。
管理者に訊いてみると、どうもyumがタイムアウトするらしい。
最初はサイトが悪いのかと思って、yumの設定を変えてみたりするもダメ。

gccのrpmとかって、どこに落ちてんだ?

そろそろ諦めようかと、ちょっとした息抜きの後にグーグル先生に尋ねてみたら、このページに行き当たった。
教えて!Ziddyちゃん gccのダウンロードインストールのやりかたを教えてください。
http://ziddy.japan.zdnet.com/qa5360918.html


そこに、こんなコマンドが書かれていた。
「# yum --disablerepo=\* --enablerepo=base groupinstall "Development Tools"」
とりあえず、実行してみる。
# yum --disablerepo=\* --enablerepo=base groupinstall "Development Tools"
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
base | 1.1 kB 00:00
(中略)
Install 57 Package(s)
Update 0 Package(s)
Remove 0 Package(s)

Total download size: 59 M
Is this ok [y/N]:

あ、動く!?

でも59MBもインストールしてられない。
モノは試しだ。
# yum --disablerepo=\* --enablerepo=base install gcc
(中略)
Installed: gcc.i386 0:4.1.2-44.el5
Dependency Installed: glibc-devel.i386 0:2.5-34 glibc-headers.i386 0:2.5-34 kernel-headers.i386 0:2.6.18-128.el5 libgomp.i386 0:4.3.2-7.el5
Complete!
#

は…入った?
# which gcc
/usr/bin/gcc
#

スゲー。

あとはCPANで「install DBI」やって「install DBD::SQLite」をやればOK。
「perl -f sqlite.pl」で正常にSQLiteのデータが読み出せました。

あー、疲れた。



0 コメント | コメントを書く | コメントの表示
2009年10月16日金曜日
PHP4とSQLite2とか3とか

久しぶりにてこずったので、忘れないようにメモしておく。
てこずったといっても、半分くらいは自分の責任なんだけど…

現在、お仕事でwebサーバのお引越しをしていて、前の環境と新しい環境を同じにしようとあれこれやってました。
んで、phpinfo()を見ると、どうやらSQLITE3が入ってるようなので、同じように入れてみた。

/usr/ports/databases/sqlite3/ に移動して、make config → make install clean を実施。

あれ?
Apache再起動しても、phpinfo()に反映されねー!

よく調べてみたら、PHP用のsqliteは /usr/ports/database/php-sqlite3/ にあるじゃないか。
再びインストール。

テキトーにphpを書いて、動作確認。

Fatal error: Call to undefined function: sqlite_open() in /xxx/xxx/public_html/test.php on line 5

えぇー!!
undefinedって…

元のサーバも、念のために実行してみました。

Fatal error: Call to undefined function: sqlite_open() in /xxx/xxx/public_html/test.php on line 5

あぁ、そういうことですか。
確かにSQLite使ってる箇所がなかったけど、動かないモジュール入れてるとは想像しませんでした。

でも、こうなったらなんとしてもSQLiteを動くようにしてやるってんで、SQLite2を導入することに。


とりあえず /usr/ports/databases/sqlite2/ でインストール!

案の定、phpでSQLiteが動きません。

じゃ、どっかからtgzを落としてこなきゃならないの??とかって検索しまくった結果…

東西社ホームページ -開発日誌-(http://www.tozaisya.jp/archive/200706.html)にこんな記載がありました。

FreeBSD 6で、Apach + PHP 4でsqliteを動かすには、portsのpecl-sqliteをインストールすれば動くようです。

東西社ホームページ -開発日誌- PHP 4とsqlite 2 2007年6月13日


天の助けとはこのことか。

無事動きました。



0 コメント | コメントを書く | コメントの表示
2009年9月18日金曜日
PHPでPOSTの漢字が文字化けっつーか壊れる?

担当しているサイトがボチボチリリースです。

で、社内から文字化けが起きると指摘が。

調べてみると、検索処理のところで漢字を入れると文字化け…というか「??」とかって表示されたり、値そのものが消えてなくなる。

で、かな混じりだと、正常に値が受け取れる。
あれこれ試したり考えたりした結果、に日本語を埋めるというその場しのぎの対応を入れてみた。

仕事が落ち着いたので、Google先生にお伺いを立ててみると、こういうのが出てきた。

[2378] 文字コードの検出に失敗 - PHPの基礎体力掲示板
http://www.sound-uz.jp/php/bbs/thread/2378?view=flat#


どうも、「mbstring.http_input」の設定が悪さしてる可能性があるらしい。
ってことで、お客さんのサーバを確認すると、案の定「auto」になっていた。

XAMPPで実行していたローカル環境はどうかというと、「pass」だった。
じゃ、社内のテストサーバは? と思ったけど、こっちは「auto」で正常に動作してた。
む… テスト環境ではUTF-8で動かしてたのを客先に合わせてEUC-JPに慌てて変換したのがいかんかった?

php.iniの変更をお願いする?
ちょっと難しいなかぁ?
仕方ないから、暫定対応で行くか…
公開は短期間だし、いいよね?



0 コメント | コメントを書く | コメントの表示
2009年7月16日木曜日
C:\fakepath

勢い余って、IE8にアップグレードしてしまった。

でもって、ぼちぼちサイトの開発してたら問題が…

<input type="file"> のvalueが「C:\fakepath\ファイル名」になる。

これって、きちんとアップロードできるの?

そう思って、ググってみると、どうも無理っぽい(サイト構築し始めなので、ディレクトリ作ったりするのが面倒なので、本当に無理かは試してない)。
しかもIE8になってセキュリティ面の強化の賜物だとか。

でもって回避方法をメモっておく。


(1)セキュリティレベルの変更
「インターネットオプション」を開き、「セキュリティ」タブを選択。
ゾーンの中から「インターネット」を選択し、「レベルのカスタマイズ」を押下する。
で、ずーっと下の方の「その他」の中になある「サーバにファイルをアップロードするときにローカルのディレクトリパスを含める」を無効から有効に変更する。

(2)信頼済みサイト
同じく、「セキュリティ」タブのゾーンから「信頼済みサイト」を選択し、ゾーンの右下あたりにある「サイト」ボタンを押下する。
で、アップしたいサイトを信頼済みとして登録する。
「https」ではなく「http」の場合には、きちんとチェックボックスをオフにする、と。

まぁ、どうなんでしょう?

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

ちょっと追記。
PHPとかはフツーにパスが取れるので、誤解なきよう。



0 コメント | コメントを書く | コメントの表示
2009年5月27日水曜日
.htaccessで覚書

ちょっとお手伝いをしたので、忘れないようにメモしておこうと思う。

.htaccessで一時的にアクセス制限をかけたいらしいのだけど、どうも上手くいかないってんで、ちょっと手伝ってみる。

Digest認証のダイアログをキャンセルすると、エラーに飛ばしたいんだけど、どうも上手く動かない。

最初にアレ?と思ったのは、エラーログ(error_log)を確認して「 ErrorDocument not allowed here」というエラーを見つけたとき。
結局犯人はhttpd.conf(を設定した人)だったという話。

ドキュメントルートのディレクトリ設定は
<Directory />
AllowOverride All
</Directory>
となっていたため、OKかと思われたが、実際に適用したいディレクトリにも個別に設定がしてあった。

<Directory "該当するディレクトリ">
AllowOverride AuthConfig
</Directory>

ようするに、認証に関する設定しかダメよってことですか。
これを
<Directory "該当するディレクトリ">
AllowOverride All
</Directory>
に直すことで、正常に動作しました。

あぁ…
ちょっと違うな。
上位ディレクトリ(この場合ドキュメントルート)の設定に上書きできるのが、認証だけよってことか。
AllowOverrideをAuthConfigのままにして、httpd.conf内部にErrorDocumentを追記するのでも、いいのかな?(試してないけど)



137 コメント | コメントを書く | コメントの表示
2009年4月10日金曜日
サニタイジングとは言わないけど

困った困った。

まぁ、基本的に無知なのがいけないんだけどさ。

誰もいなかったから僕がやったっていう発端もどうかって話だけどさ。
それなりにPGできるから、かえっていけなかったね。
たいして知りもしないで、作るものではないってことで。
知ってる人がほとんどいないって時点で、救いの手はどこに求めたらいいのか判らないという…


ユーザの入力に対して、チェックを入れたりするんだけど、これがどーもよく判らなくて。
最初に参考にした本が、SQLにINSERTするための処理として、htmlspecialchars()とmysql_real_escape_string()をかましてたもんだから、そういうもんかと思って…

結局htmlsp(ry は表示の前にやるのがいいというのは、納得できた。
たしかにDBには生のデータ(実際にはエスケープされてるけど)を入れるべきだろうな。

入力

確認表示(表示用にhtmlspecialchars()を入れるけど、実際のデータはそのまま)

登録(INSERTする段階でエスケープ)

リクエスト

表示(DBから引っ張ってきたエスケープ済みの内容をhtmlspcialchars()で表示)

こういうこと?



0 コメント | コメントを書く | コメントの表示
2009年4月6日月曜日
プリペアードクエリ

PHP+PostgreSQLについてのメモ。

本当は、pg_prepareとか使えるといいんだけど、今の環境がPHPのバージョンが5じゃないので
、仕方なく…

pg_query($db, "PREPARE sample (text) AS SELECT hoge FROM hoge_tbl WHERE col_hoge=$1");
$result = pg_query($db, "EXECUTE sample ('{$number}')");
pg_query($db, "DEALLOCATE sample");


まぁ、「PREPARE」でクエリを作成するんだけど、ここで指定する変数の型(ASの前に括弧書きしてるヤツね)が曲者で(自分の確認が不十分なのを責任転嫁)、「EXECUTE」の時に入れる変数の値がintってことに全然気が付かなくて、エライ大変な思いをしたものです。



0 コメント | コメントを書く | コメントの表示
シェルスクリプトとMySQL

忘れないように、メモ。

シェルスクリプトとSQLの合体。

フツーにSQLを実行するの場合は…

mysql -u ユーザ名 --password='パスワード' データベース名<< EOF
SQL文
exit
EOF

ってことで。

で、実行結果を取得したい場合は
RESULT=`mysql -u ユーザ名 --password='パスワード' データベース名<< EOF
SQL文
exit
EOF`

と、コマンドの実行時と同じく「`」で括っておしまい。

SELECTの場合なんかでカラム名まで取得されちゃうので、
RESULT=`mysql -N -u ユーザ名 --password='パスワード' データベース名<< EOF
SQL文
exit
EOF`

と「mysql」に「-N」オプションを付ける。



0 コメント | コメントを書く | コメントの表示
2009年3月25日水曜日
「?param=value」で400エラー

Webサイト構築のお仕事中…

テスト環境での作業が終わったので、本番環境へ移行作業をせっせと実施。

サーバ管理者がダイジェスト認証を設定。

ログイン。

OK。

とりあえず管理画面へアクセス。
でもって、次のページへ…

行けません。

「400」だってさ。
「不正な要求」だってさ。

試してみると「abc.php?param=value」のようなURLがNGで、「abc.php」だと上手く行く。

テスト環境だと問題なかったのに…

GETパラメタの問題かなぁ?
PHPの設定かなぁ?
Apacheの設定かなぁ?

ん?
サーバ管理者のPCだと問題がない?
違いは?
僕のPCがIE6で、彼のがIE7?
なんでだろう?
他のPCでも試してみたけど、IE6だけがNGのようだ。
IE6固有の問題?
でもテストサーバじゃOKだったもんなぁ…

かれこれ2~3時間くらいでしょうか?

ついに突き止めました。

HTTP クライアントを作ってみよう(6) - Digest 認証編 -
http://x68000.q-e-d.net/~68user/net/http-auth-2.html

上記サイトにこう書いてある。

ただし、IE6 では Digest 認証を使って foo.cgi?FOO=BAR のような URL にリクエストすると、誤ったリクエストを送ってしまうバグがあります。以下の URL は Mozilla や FireFox では正しく閲覧できますが、IE6 だと正しいユーザ名・パスワードを送信しても、 400 Bad Request になってしまいます (Windows XP SP2 + IE6 で確認)。

えぇっ!?
どういうこと??

パケットを見てみると、IE が送信した Authorization ヘッダの uri には「?FOO=BAR」の引数部分が含まれていないようです。


はぁ…
たしかにApacheのログを見ると、「?」以降があるのとないのとを比較して、アンマッチとかってなってる。

これは IE のバグですが、いつまでたっても修正されないので、 Apache-2.0.51 からサーバ側で無理矢理対応する仕組みが設けられました。 httpd.conf や .htaccess に以下のように記述しておけば、 IE でも上記のような URL に正しくアクセスできます。


書いてあるとおりに、修正を行う。
他のVirtual Hostに影響を与えないよう、.htaccessに以下を挿入。
# User-Agent ヘッダに MSIE という文字列が含まれていたら、
# 環境変数 AuthDigestEnableQueryStringHack に「On」をセットする。
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On


正常に動きました。
php.iniのdiffを取りました。
httpd.confもdiff取りました。
相違点はここくらかと思ったけど、まさかダイジェスト認証が問題になるとは…
よく考えれば、テスト環境ではダイジェスト認証をかけてなかったわ。

辛いなぁ…



0 コメント | コメントを書く | コメントの表示
2009年3月18日水曜日
文字が化けるのです。

PHPの話題。

最近、PHPをアレコレする仕事が多いのですが…

デザインも上がってきて、僕の作ったロジックと合体!と思って作業を始める。

サーバ管理者が、デザインチームのHTMLをアップしてくれたので、ブラウザから確認。
UTF-8で作ってあるのね。
OK、OK。

でもって、デザインと合体しない管理画面をまずはアップして、アクセスしてみる…

…え?

文字化けしてんじゃん。
正確には、文字コードを正しく認識してない。
ファイルはUTF-8で保存してるし、METAタグでCHARSETをUTF-8にしてるのに。

まずは自分を疑った。
でも結局は、php.iniの問題だと発覚。

default-charsetがSHIFT-JISになってました。
なので、HTMLは正しくUTF-8と認識されて、PHPのファイルだけがSHIFT-JISと認識されるという状態になってました。

あとはmbstring関係とかも確認しておかないとね。



0 コメント | コメントを書く | コメントの表示
2009年2月24日火曜日
EVENTQUERY

久しぶりに投稿してみる。
最後に投稿して以来、仕事ではCとJAVAを併用して、今年に入ってからはPHPをごにょごにょしてたんだけど、今度はAccessになりそう。

で、少し前に居た常駐先で使ってたバッチを、自分の会社でも使おうとしたら、動かなくて…

このテの会社って出勤、退社時間って、自己管理なことが多い。
だけど、毎日Excelにぽちぽち入れてくのって、面倒だし、忘れるんだよね。
ってことで、週末なんかにまとめて入力するんだけど…
そういうときって、PCの起動時間を確認することが多い。

[スタート]→[設定]→[コントロールパネル]→[管理ツール]→[イベントビューア]

システムからeventlogの開始と終了を確認するんだけど、ま、面倒だよね。
なので、バッチを作ってみた。

検索部分だけピックアップすると、こんなイメージ。



CSCRIPT //H:CSCRIPT //S //NOLOGO

EVENTQUERY /FI "ID eq 6005" /FI "Datetime eq %MM%/%DD%/%YYYY%,12:00:00AM-%MM%/%DD%/%YYYY%,11:59:00PM" /L SYSTEM | GREP 6005>> log.txt
EVENTQUERY /FI "ID eq 6006" /FI "Datetime eq %MM%/%DD%/%YYYY%,12:00:00AM-%MM%/%DD%/%YYYY%,11:59:00PM" /L SYSTEM | GREP 6006>> log.txt




ID6005はeventlogの起動、6006は停止のID。
勿論、%YYYY%とかは、変数で設定させるんだけど…

出力結果にはヘッダ部分があるので、log.txtにはGREPで必要な行だけ落としてる。
でもCygwinとか入れないと、GREPは使えないので…

あとはFORとかでまわして、時刻だけ抜き出したりして、整形すればOK。


でも、常駐先の環境ではこれで動いたんだけど、自社に戻ったら、動かない。
CSCRIPT //H:CSCRIPT //S //NOLOGO
してるけど、CSCRIPTで動かせ!とダイアログが表示される。

仕方なく、
CSCRIPT C:\WINDOWS\SYSTEM32\EVENTQUERY.vbs
に書き換え。

なんだろう?



0 コメント | コメントを書く | コメントの表示
Template Design: © 2007 Envy Inc.