2008年12月27日土曜日

正規表現で配列の要素を検索 [PHP]

正規表現のパターンマッチで配列の要素を取得出来ないかなぁって考えてたらそういう関数がすでに用意されていた。。


例えば配列のキーの中にimageに関するキーがないかを調べるときとか。
if(preg_grep('/^image_[a-n]{1}/',array_keys($array)) {
 ・・・・
 ・・・
みたいな。

本日の.htaccess 正規表現を使ったリダイレクト処理 [APACHE]

正規表現を用いてリダイレクト処理が出来たらなぁと思ったところで発見しました。
RedirectMatch
これすごい便利です。



2008年12月25日木曜日

phpの宣言?タグ(short_open_tag)[PHP] [APACHE]

とある案件でphp4からphp5に変更したところ、コードがほとんど丸々表示されてしまい、これまで動いてたスクリプトが動かなくなった。
色々調べたり試した結果、phpの宣言をする際に、「
php.iniの設定の「short_open_tag」をoffにするとそうなるみたい。
xmlなどの宣言の際、phpと認識されないように使ったりするみたい。

サーバの管理は別会社なので、.htaccessに「php_flag short_open_tag on」を追記して一時的に回避した。

2008年11月11日火曜日

MYSQLでrootログイン&パスワード設定 [SQL]

多分だけど、mysqlをインストールしたばっかりの状態だとパスワードなしでrootでログイン出来る。
なので、まずはrootでログイン後にrootにパスワードを設定してやる必要があるが、たまにエラーが出る。
--------------------------------------------------------------------
mysql> set password for root=password('password');
ERROR 1133 (42000): Can't find any matching row in the user table
--------------------------------------------------------------------

むぅ、と思っていろいろ試した結果、以下のようにやったらうまくいった。
--------------------------------------------------------------------
mysql> set password for root@localhost=password('password');
Query OK, 0 rows affected (0.01 sec)
--------------------------------------------------------------------

おそらくデフォルトではrootユーザはhostが違うものが複数(2つ?)あるためhostまで指定してやらないとだめなのだ。
--------------------------------------------------------------------
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> 
mysql> 
mysql> select user,password,host from user;
+-------+------------------+-----------------------+
| user  | password         | host                  |
+-------+------------------+-----------------------+
| root  |                  | localhost             |
| root  |                  | localhost.localdomain |
|       |                  | localhost.localdomain |
|       |                  | localhost             |
+-------+------------------+-----------------------+
5 rows in set (0.02 sec)
--------------------------------------------------------------------

上述のようにrootにパスワードを設定したならば、userが空欄だったりパスワードのないrootもいらないので以下のコマンドでそれらを削除。
--------------------------------------------------------------------
mysql> 
mysql> delete from user where user = '';
Query OK, 2 rows affected (0.00 sec)
mysql> 
mysql> delete from user where host = 'localhost.localdomain';
Query OK, 1 row affected (0.00 sec)
--------------------------------------------------------------------

それから使用するユーザを作ってやればいい。
## ユーザ作成(ユーザ名:username、パスワード:password)
--------------------------------------------------------------------
mysql> grant select,insert,delete,update,create,drop,file,alter,index on *.* to username identified by 'password';
--------------------------------------------------------------------

検索してみたら以下の[参考]にほとんど書いてありました。
ありがとうございます。

[参考]
いろいろメモ

2008年11月9日日曜日

apache再起動失敗 [APACHE]

telnetは出来るし、psでhttpdプロセスがあるのだが、webアクセスが出来ない。
※ブラウザから見れない、繋がらない。

とりあえず、apache再起動だな、と思って、コマンドをうつと、
# apachectl restart
(125)Address already in use: make_sock: could not bind to address [::]:80
no listening sockets available, shutting down
Unable to open logs

すでにポートは使われてます、みたいなエラーっぽい。
ネットで調べてみるけどなんかちょっと違う、というか解決出来そうなのが見付からない。
stopもstartもきかない。

結局プロセスをkillしてから起動したらうまくいった。
kill -9 PID

なんでこういう状態になったんだろう。
中途半端起動状態みたいな。

2008年11月7日金曜日

データをinsertすると文字化けが起こる [SQL] [PHP]

PHPからmysqlにデータ投入すると、投入されたデータが文字化けしている。
プログラムファイルはUTF8、テーブルもUTF8で生成。
なんでだろうと思って色々調べたところ、以下の方法で解決。

## 文字コード変更
$sql = "SET NAMES utf8";
$res =& $mdb2->query($sql);
if (PEAR::isError($res)) {
die($res->getMessage());
}

ただ、SQLインジェクションに脆弱ということでアプリケーションでは使用しない方がいいと書いてある記事を見付けた。。
しかし、レンタルサーバでmysqlの再インストールも出来ずconfも変更することが出来ないから、とりあえずこれで今回は終わり。
phpMyAdminがインストールされていて、これを使えってことなんだと思うけど、どこまで出来るのかな。。
なんだか設定ファイルが編集出来ないとここから先には進めない気がして来た。。

[参考]

PEAR::DBからPEAR::MDB2 [SQL] [PHP]

CSVデータを読み込んで配列にし、エラーチェック後テーブルに挿入する、という管理ツールを作ることになって、これまでPEAR::DBを使っていたがPEAR::MDB2に乗り換えようと思い、今回試しに使ってみました。

データベースはmysql、言語はphp。

まずは接続。
$dsn = dbType://user:password@host/database
$mdb2 =& MDB2::factory($dsn);
$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);

これでいいはずなのに全然接続できない。
調べてみたらmysql用のドライバーが必要ということでそれをダウンロードして再接続。
無事接続できたみたいだ。
http://pear.php.net/package/MDB2_Driver_mysql/

次にinsert。
これはPEAR::DBとほとんど同じだった。
## PHP5
$mdb2->loadModule('Extended');
$in_result = $mdb2->autoExecute($table, $data, MDB2_AUTOQUERY_INSERT);
## PHP4はこっち
$mdb2->extended->autoExecute($table, $data, MDB2_AUTOQUERY_INSERT);

最後に切断。
$mdb2->disconnect();

これからいろいろ使ってみよう。

(この作業中にDBに投入したデータが文字化けしてた。)
(その解消については次の記事に書く。)

[参考]

2008年10月23日木曜日

XML パースエラー: 整形式になっていません。 [HTML][PHP]

画像ファイルへの直リンクを防ぐためプログラムを通して表示しようとしてたのだが、そのプログラムへパラメータを渡す際にエラーが出てたみたい。

XML パースエラー: 整形式になっていません。
URL: http://domain/path/index.php?id=1&type=jpg&title=test
行番号: 11, 列番号: 31: <img src="http://domain/path/image.php?id=1&type=jpg&title=test" />

XMLでは以下の文字は置換しないとエラーになるみたい。
全然気づかなかった。。

> 引用
文字名     エンティティ参照   文字参照    数値参照
アンパサンド   &amp        &        &#38;#38;
左山かっこ    &lt;         <       &#38;#60;
右山かっこ    &gt;         >       &#62;
二重引用符    &quot;        "       &#39;
アポストロフィ  &apos;        '       &#34;


2008年10月7日火曜日

PHPでブラウザのキャッシュを残さない小技 [PHP]

マイページのキャッシュが残ってしまって、応募履歴などの処理内容が反映されない、なんてことがあった。
どうやらキャッシュというのはURLに依存するようなので、マイページへのリンクに変動するパラメータを与えるとよいみたい。


<a href=”mypage.php?t=<?=$param?>>マイページ</a>

メモ。




2008年10月4日土曜日

本日の.htaccess 特定のファイルのみアクセスを許可する [APACHE]

テスト中だったりして特定のIP以外コンテンツを見せなかったり、Basic認証をかけたりなどするけど、そのディレクトリ以下で特定のファイルや特定のディレクトリのみ表示を可能にしたい場合があった。
色々調べてたらこんな風に.htaccessに書くといいみたい。
※sample.phpのみアクセス許可する場合

## アクセス不可部分
Order deny,allow
Deny from all

## 特定IPのみ許可
allow from ***.***.***.***

# Basic認証
AuthUserFile /export/html/*******/.htpasswd
AuthGroupFile /dev/null
AuthName "Please input your ID & password"
AuthType Basic
require valid-user

##### ↓ここから #####
<files>
Satisfy Any
Allow from all
</files>
##### ↑ここまで #####

あんまり必要な機会はないかも知れないけど。

2008年9月30日火曜日

携帯の入力文字種類を設定 [携帯][HTML]

<input type="text" ****** />場合に以下の属性を入力するとデフォルトの入力文字種類が設定可能。

1)全角:istyle="1" mode="hiragana"
2)半角カナ:istyle="2" mode="hankakukana"
3)英字:istyle="3" mode="alphabet"
4)数字:istyle="4" mode="numeric"

郵便番号は4)、フリガナは2)など。


2010/08/02追記

XHTMLに関してはdocomoは上記のタイプだと有効にならないため以下の属性を使う必要がある。
style="-wap-input-format:&quot;*&lt;ja:h&gt;&quot;" 全角かなモード
style="-wap-input-format:&quot;*&lt;ja:hk&gt;&quot;" 半角カナモード
style="-wap-input-format:&quot;*&lt;ja:en&gt;&quot;" 半角英字モード
style="-wap-input-format:&quot;*&lt;ja:n&gt;&quot;" 半角数字モード
AUはどうするのかな、ということでWAP2.0の仕様では
style="-wap-input-format:*M;" 全角かな
style="-wap-input-format:*m;" 半角英字
style="-wap-input-format:*N;" 半角数字
と記入するようです。

そこで3キャリア共通として
format="*N" mode="numeric" style="-wap-input-format:&quot;*&lt;ja:n&gt;&quot;"
とか
style="-wap-input-format:&quot;*&lt;ja:n&gt;&quot;;-wap-input-format:*N;"
とかにしてしまうとSoftbankで入力制限モードになってしまうらしい。

なので、結局キャリアごとに振り分けるのがベストかと。。

CEATEC JAPAN 2008 開催中 [blogger]

CEATEC JAPAN 2008 開催中
僕は第4ホールにいます。
http://www.ceatec.com/

2008年9月29日月曜日

Mysqlでの正規表現と値変換 case regexp [SQL]

正規表現にてマッチングしたものの値を変換して取得したい。
今回は、所定カラム(column_dir)をディレクトリ名として、URLをつけて抽出しようと思った。

column_dirのパターンは二つ。
・'A01'のようにアルファベットの'A'から始まって数字が続いてるパターンと、
・'101'のように数字の場合のパターン

それぞれ、
・'http://sample.com/alpha/'とつなげる
・'http://sample.com/number/'とつなげる

まずはcase文にて条件分岐を行い、条件に応じて抽出された結果にconcatでURLをつける。
条件式には正規表現を用いる。

select title,concat(CASE WHEN column_dir regexp '^A.*' THEN 'http://sample.com/alpha/' ELSE 'http://sample.com/number/' end, column_dir, '/') as CONTENT_URL from table;

regexpを'~'にしたらpostgresでも使えるのかな。


[参考]

2008年9月26日金曜日

鬼子母神 御会式大祭 2008.10.16〜10.18 [blogger]

お祭りに行きたい気がする。

カラフルなかき氷のシロップは蛇口をひねって出すタイプだった。
それがいやに印象的だったな。
あとは普通の下町のお祭りだったけど、踊りが思ったより盛り上がってて近くて、なんだかとてもよかった。
お祭りとか絶対好きそうじゃないって言われるし、正直そんなに好きじゃないけど悪くなかったな。

http://www.kishimojin.jp/index.html

2008年9月18日木曜日

サーバの時刻合わせ NTPD NTPDATE [UNIX][ネットワーク]

サーバの時刻は定期的に調整しないとだんだん狂っていってしまうみたいで、実際狂ってました。。
で、色々調べてみたら、ntpdateというコマンドで手動調整が出来るみたいです。
Linuxではntpdを常駐させて定期的に時刻調整が出来ますがセキュリティホールとなる可能性を減らす/任意のタイミングで調整を行うコマンドとしてntpdateがあります。
/usr/sbin/ntpdate -[option] [参照サーバ]

参照サーバは、時刻調整の基準として日本標準時を配信してるNTPサーバを見に行きます。
今回仕込んだのは以下のサーバです。
NTPサーバ名: ntp.nict.jp

また、時刻を見に行くときにポートが開いてないともちろん疎通が出来ないのでポートを開けましょう。
多分、123とかだと思うのですが、以下のコマンドで調べることが出来ます。
# cat /etc/services | grep 'ntp'

また、手動で合わせる場合は、
date -s "01/28 12:15 2008"

[参考]

2008年9月17日水曜日

本日の.htaccess[APACHE]

今日のhtaccessはBasic認証。
他にもやり方があるのかもですが、.htpasswdへのuser:passwordの設定方法でApacheに便利なコマンドがあった。

ID:userで、PW:passwordの場合は以下のようにコマンドを叩くと.htpasswdへID:PWが設定される。

htpasswd -c /パス/.htpasswd user
New password: password
Re-type new password: password

[補足]
コマンドが見つからない場合はwhich htpasswdで探す。

2008年9月11日木曜日

カラムをつなげて(結合して)出力する [SQL]

電話番号や氏名や、別カラムで保存してるけど結合して出力したくて調べてみた。
※「+」とか「||」だと数値として合計値を算出するので文字列に対して処理を行うと「0」という結果が返ってくる。


文字列に対しては、concatという関数を使う。

例)select concat(faminame,firstname) as name from MemberTable;

select concat(faminame, ' ', firstname) as name from MemberTable;

※文字列も挟めるのかな。2行目は未確認。。

2008年9月10日水曜日

サーバまでのネットワークの経路をはかる [ネットワーク][UNIX]

今日あるサーバの表示がすごく重かったので何かしらの大きいプロセスが動いてたり、プロセスがたまってたりしてるのかなと、ssh接続してtopコマンドではかってみたけど、特にそれらしきものはないし、ロードアベレージも正常だった。
そしたら、tracerouteというコマンドを教えてもらった。

traceroute [ドメイン名orIPアドレス]

このコマンドで自分のマシンからそのサーバまでの経路や混み具合などをはかることが出来るらしい。
案の定、混んでいて、どうやらサーバのプロセスではなくネットワーク上でのパケット通信が遅いのが原因のようだった。

[参考]
http://www.atmarkit.co.jp/fnetwork/netcom/traceroute/traceroute.html

2008年9月4日木曜日

テーブルのコピー/複製 [SQL]

カラムの要素などをそのまま継承した同じ形式のテーブルを作りたいと思ったらこのようなやり方がありました。

create table 新テーブル as select * from 元テーブル where ありえない条件;

2008年8月22日金曜日

携帯でのCGIによるページ書き出し、Content-Length[携帯]

CGIでのページ作成時はi-modeでは以下のページに書いてある通り、Content-lengthは必須らしい。

ただし、最近の機種ではLength情報を正確にはきだす必要がある。
Content-Lengthが実際のサイズより大きい値を送信している場合、特定の端末では既にページを表示しきれているにも関わらず、Content-Length情報を優先して全データの受信待ちとなり、サーバーに設定されているKeep-Aliveまで接続をし続け、Maxに達した段階で、強制的にエラーメッセージを表示する仕様になってるかららしい。

2008年8月20日水曜日

本日の.htaccess[APACHE]

今日使用してるのを見掛けた .htaccessの書き方。

【Action action-type cgi-script】
action-typeがリクエストされたときにcgi-scriptが実行されるというものらしい。
action-typeとはMIMEタイプとか。
スクリプトには環境変数「PATH_INFO」と「PATH_TRANSLATED」が送られるらしい。
[参考]

【RewriteEngine】
リダイレクトやアクセス拒否などを制御出来る。
特定のIPは拒否したり、特定のプログラムからのアクセスは許可したり。
[参考]

どちらも特定のユーザにのみアクセスしてほしいhtdocs/より上位のコンテンツを表示するため使用していた内容。
まだ全然把握しきれてない。。

2008年8月19日火曜日

携帯の機種ID取得スクリプト[PHP][携帯]

勝手サイトで携帯でのログイン認証をさっと済ませるために作りました。
全機種対応ではないけど、大体の最近の機種はカバーしてると思います。
大丈夫なはず。。。
※ただしi-modeに関しては、2008年4月から導入されたiモードIDを取得しているのだけど、これはSSL時は利用出来ないらしい。

## 機種IDを取得する
function getMobileId() {
    $ua = getCareer();
    ## SoftBank
    if($ua == 'SoftBank') {
        $id = $_SERVER['HTTP_X_JPHONE_UID'];
    ## Ez
    } elseif($ua == 'Ez') {
        $id = $_SERVER['HTTP_X_UP_SUBNO'];
    ## DoCoMo
    } elseif($ua == 'DoCoMo') {
        $id = $_SERVER['HTTP_X_DCMGUID'];
    } else {
        $id = 'PC';
    }
    return (!empty($id) ? $id : false);
}

## キャリア判別をする
function getCareer() {
    $ua = $_SERVER['HTTP_USER_AGENT'];
    ## SoftBank
    if (preg_match('/(J-PHONE|Vodafone|SoftBank|MOT-)/', $_SERVER['HTTP_USER_AGENT']) || isset($_SERVER['HTTP_X_JPHONE_MSNAME'])) {
        $career = 'SoftBank';
    ## Ezweb
    } else if (preg_match('/(KDDI|UP\.Browser)/', $_SERVER['HTTP_USER_AGENT'])) {
        $career = 'Ez';
    } else if (preg_match('/DoCoMo/', $_SERVER['HTTP_USER_AGENT'])) {
        $career = 'DoCoMo';
    } else {
        $career = 'PC';
    }
    return $career;
}

2008年8月18日月曜日

Sender Policy Framework [セキュリティ]

もしかして常識なのかもしれないけど、最近SPF(センダー・ポリシー・フレームワーク)というのを知った。
「SPFとは、SMTPによるインターネットのメール配送を拡張する、送信ドメイン認証技術のひとつである。SPF、SPF認証とも呼ばれる。」
(出典:フリー百科事典『ウィキペディア(Wikipedia)』)
導入について、送信側の作業としてはDNS上にIPアドレスとかが書いてあるSPFレコードを公開する。
受信側は、受信するメールのドメインのDNSからSPFレコードを取り出し、接続しているサーバとのマッチングを行い、それ次第で認証を判断する。

もともとの目的がなんのためかは分からないけど、これを用いることで、所有ドメインを送信ドメインとしてスパムメールに使われたり、受信側がスパムメールを受信する確率が大幅に減るようだ。

全然知らなかった。

[参考]

2008年8月8日金曜日

日付の差を出すSQL [SQL]

入会日から退会日までの差などを出すときに必要で調べたら、意外とシンプルな結果が出てきました。

【postgres】
select age( (入会日を出すselect文),(退会日を出すselect文) );

【mysql】
datediff関数で日数の差分は出るが年月日の形式ではあるのかな。
未確認。
select datediff('1997-12-31 23:59:59','1997-12-30');
-> 1

2008年7月30日水曜日

vpopmailでユーザ追加&.qmailファイルで転送設定[メール]

いつも忘れてしまうのだけど、サーバにvpopmailが入ってるときは簡単なコマンドでアカウントを追加出来る。

【ユーザ追加】
# /home/vpopmail/bin/vadduser [メールアドレス] [パスワード]
# /home/vpopmail/bin/vadduser sample@demo.com demodemo

【ユーザ削除】
# /home/vpopmail/bin/vdeluser [メールアドレス]
# /home/vpopmail/bin/vdeluser sample@demo.com

転送設定したい場合は、.qmailファイルをアカウントディレクトリ内に作成し中に転送先のメールアドレスを「&」でつなぐ。

2008年7月29日火曜日

phpで便利な関数を発見 glob関数 [PHP]

PHPの関数です。
パターンにマッチしたファイル名を配列で出力します。
使い方は以下の通り。

>> /var/www/image/内のファイル一覧
a.jpg
b.txt
c.gif
d.jpg

foreach (glob("/var/www/image/*.jpg") as $filename) {
    print $filename."\n";
}
exit();


>> 出力結果
a.jpg
d.jpg

http://php.benscom.com/manual/ja/function.glob.php




2008年7月22日火曜日

PDTをMAC OSXに入れてみた[PHP]

Eclipseを使ってみたくて、今日とうとうmacに入れてみました。以下のページを参考にインストールしました。
Mac OS X にPHP開発環境を作る! 〜Eclipseのインストール〜
非常に分かりやすかったです。
ありがとうございます。

試しにサンプルプログラムをEclipse上で書いてみたのですが、
いまいちその便利さやよさが分かってないようです。。
今後、ネットで調べていきます。

2008年7月19日土曜日

フォームとか作るときに考えるユーザビリティ[HTML][JavaScript]

会員登録とかログインとかお問い合わせとかフォームを作る機会が多くて、毎回同じだとパッケージっぽくしたいなぁとか思うけどやらない、みたいな感じですが、ユーザビリティ向上のためにまだまだやれることはあるみたいです。

パッケージ化はもう少し先になりそうです。
※参考
http://woork.blogspot.com/2008/07/useful-tips-to-enrich-your-html-forms.html
※元記事

2008年7月18日金曜日

URLとURIって何が違うんだろう[HTML][ネットワーク]

って思って調べてみました。
結論としてはよくわからなかったです。

僕の解釈としては、URIの概念の中にURLが含まれてて、http:などといった具体的にその場所までのアドレスを指定出来る場合はURLと呼ぶ、みたいにとりました。

以下参考URL。

2008年7月16日水曜日

PHPでCSVファイルを読み込む[PHP]

csvファイルをブラウザからアップロードして配列に入れるときに、エクセル上ではからなのだけど、nullデータが入ってると判断されてしまって空の配列(や要素)が出来てしまうときがある。
なので、空だったら削除みたいな処理を加えた。

==========================
$fp = tmpfile();
fwrite($fp, $row);
rewind($fp);
$i = 0;
while (($data[$i] = fgetcsv($fp, 10000,",")) !== false){
$i++;
}
## 空の配列を削除
foreach($data as $k=>$v) {
if(empty($v)) {
unset($data[$k]);
}
## $data[0]には要素の項目が入ってる
for($j=0;$j
if(!empty($data[$k][$j])) {
$chk[$k] = 1;
}
}
if($chk[$k] != 1) {
unset($data[$k]);
}
}
fclose($fp);
==========================

なんか面倒だなぁって思いました。

2008年7月11日金曜日

はじめます[blogger]

個人的で備忘録的なサイトになればと思います。
文章とか苦手ですが、何かが蓄積されれば。
まずはネットで調べつつカテゴリーを導入しようかと思います。