PHP ctype_digitの変な挙動


http://jp.php.net/ctype_digit

整数の判別をするのに使われるであろう関数 ctype_digit()
エラーが起きたり起きなかったりする現象に遭遇

この関数を活用するには string を渡さなければなりません。 たとえば integer を渡すと常に FALSE を返します。


ということだったので、問題の箇所をトレースしてみたらintegerで渡っていることが判明
さくっと文字列で渡すことで解決…
しかし、trueを返すこともあったので気になって以下のようなスクリプトで確認すると

php 5.2.13

for ($i=-10; $i<=1000 ; $i++) {
    var_dump($i);
    var_dump(ctype_digit($i));
}

256上はtrueになる。ググッたところ 256以上は自動で文字列キャストするらしい
が、48~57もtrueになる… なんだか気持ち悪い結果になってしまったが
型がゆるいPHPならではな感じもしなくもない

PHPカンファレンス2010 テックデイに行って来た

PHPカンファレンス2010 テックデイに初参加してきたよー

PHPの生みの親のRasmus LerdorfさんとFacebookのScott MacVicar話が直接聞けたことが感動した訳ですが
あんまり機会がないからね。それより、自分の英語力の無さに絶望した!

結果:参加してよかった。
来年もあれば是非行こうと思います。


では、興味をあったことをつらつらと…

PHP Then and Now

http://talks.php.net/show/phpjp10

・Rasmus Lerdorfさん登場
・PHPバージョン1から今までの歴史
・PHP6で、多くの機能を取り込みすぎて失敗した
 php5.4になるよ
・DateTime機能が強化されたよ
 ここで2,3行でしたが生コーディングが見れた。

フレームワークアップデートLT
CakePHP
・リファクタリング中
・PHP4の部分を削除
詳細は PHPMatsuriで(ビデオレターあり)

http://2010.phpmatsuri.net/blog/guest-interviews 

Lithiumを始めるには?
チュートリアルを読む
ブログ、認証機能、フィルター を使ってみよう
MongoDBベースだよ。
1.0にはドキュメンを整えるよ
それまではソース読んでね
Ethna → えすにゃん
Codeignitor

http://codeigniter.jp/archives/196

BigWaveがくるよ

HiPHoP for PHP
PHPをC++言語に変換して高速化するよ
ライブデモでは、4倍高速化されたが実際は2倍程度
evalや正規表現の/eとdefine()とか描き直さないと使えないよ。

Microsoft ♥ PHP ~ 2nd Stage ~ WebMatrix 登場!http://www.slideshare.net/hirookun/php-conference-2010-final-5283700
Windowsに簡単にPHP環境を整えられるよ!
デフォルトブラウザはIEです。当たり前です!
MySQLもOBDC経由でつかえちゃったりするよ!
WordpressみたいなCMSはボタンひとつでインストールできちゃうよ

文字コードに起因する脆弱性とその対策

http://www.slideshare.net/ockeghem/ss-5283574

htmlspecialcharsは必ずエンコード指定すること!
なるべくUTF-8を使う?
バグを直したことにより、別のセキュリティホールが生まれるってことも

PHPストリーム概説

http://hnw.sakura.ne.jp/documents/phpcon-20100925.pdf

ローカルファイルも、HTTPでも、透過的にあつかえるよ
cURLもいいけどfopenもね!

新潟アクセス修飾子のご提案

http://prezi.com/2r6wmrriyeqb/niigata/

新潟←よめないけど、書けない
PHPコアをいじるのはたのしいよ!


PHPの中の人によるパネルディスカッション
ラスマスさんを中心に
Facebookの人途中参加

次期PHPはパフォーマンスがよくなるよ
Scalar Type Hintingは、入らないかもしれない
マルチバイト関係は、もっと日本のエンジニアに増えて欲しい的な感じでした。?

ライトニングトークス
究極のPHP本完成 これは期待したい。

Mantis 1.2.xに(やっと)バージョンアップしてみた

MantisBT 1.1.8から 1.2.xにバージョンアップしようとした所、なぜかSQLエラーで止まる。
そんな感じで半年くらいすぎて、先日 1.2.2がリリースされた&ちょっと時間ができたのでもう一回アップグレードに挑戦。

が、何度やっても、ダメ。結果は変わらず、、、

試しに、1.1.8を素でインストールした後、1.2.2をインストールしたら出来た。
※当たり前ですが…


いろいろとデータの差分を眺めていたらふと、configの「database_version」の項目のproject_idが、20になってる。。。

もしや?と思い database_versionを0にしてアップグレード処理を走らせたら
さっきまでとは違いなにやら処理が走ってる感じがあり、、、無事完了したっ

それにしてもなぜproject_idが20に成っていたかは謎。
そもそも、結果できたけど0にしていいかも分からずw

WordPress 3.0 リリース&アップデートしてみた

WP3.0正式版がリリースされましたね!
日本語版を待っていたのですがこないので英語版でアップデートしちゃいました。
WP3.0RC2の時の日本語ファイル(/wp-content/languages/ja.*)を上書きしたら問題なく日本語になりました。

WP3.0の変更点は、http://wpdocs.sourceforge.jp/Version_3.0あたりにまとまってるみたい。

アップデート前に一応したことメモ
・バックアップ(全ファイル・DB)
・プラグインをすべて最新にする(3.0対応になっているか確認)
・問題がないように祈る
このくらいです。

さっそくテーマの変更をしてみた。
なにげにHTML5宣言になってますね、headerとかのタグは使われてませんけど。
いままでより横幅が広がっていい感じ。

PHP関数をJavascriptで実現しちゃう「php.js」

PHPの関数をJavascriptで実現しちゃうっていうOpensourceプロジェクト「php.js」

関数一覧
http://phpjs.org/functions/index
かなりの量が作られていますねー。

PHPのコア関数がメインのようですが、
pi()みたいなラッパーからmd5()とかMail()みたいな、え?ってなるようなみっちり計算してますよ系な関数までいろいろと。

実際はPHPとJavascriptの文化が違うのでそのまま使ってPHPのように書くっていうのはやや問題がありそうですが
is**みたいな変数チェックとかnumber_formatみたいな文字列加工な関数など部分的に
PHPならこう書くけどJavascriptだとどう書くんだろう?みたいな参考書的な使いからもできるんではないかと思います。

WordPress3.0RCがリリースされたのでアップデートしてみた

Wordpress(以下、WP)3.0がリリースされましたねっ
早速 WP2.9からバージョンアップテストをしてみました。

1. とりあえずクリーンインストール。 古い方はバックアップ退避
2. 古い方からwp-config.phpを移動
3. /wp-admin/update.php からアップデート処理。 →無事終了
4. 前回使っていたテーマフォルダ・プラグイン・uploadsなどを移動
5. テーマ選択・プラグイン有効にして設定。

で完了。思ったより問題もなく非常にあっさりアップグレードできました。
動作についてはまだちゃんと検証していないので、ぼちぼち。
以前よりCMS系の機能に近づいたっぽいのでその辺とかね。

ついでに以下のプラグインはざっと見たところ問題なく動作してるみたい。
All in One SEO Pack
Google XML Sitemaps
SyntaxHighlighter Evolved
Ultimate Google Analytics
WP Super Cache

WordPress 3.0 ベータ2を使い複数サイトを立ち上げてみる

Wordpress 3.0がWPMuを統合と言う事らしくベータ2になった事だし
ちょっと触ってみようかとおもい試してみた。

1. ワードプレスをダウンロード
2. 普通にインストール。
3. 生成したアカウントでログイン
ここまでは、以前までとあまり変わらない様子

さっそく複数サイト設定をしようと思い設定を探したが見つからない。
こういう時のGoogle先生!ってことでググッてみたところ、複数サイトを作る場合には以下の設定が必要らしい

1. wp-config.php を書き込む。

define('WP_ALLOW_MULTISITE', true);

そうすると、管理画面のツールにネットワークというのが出現する



クリックすると以下の様な設定画面になるので説明通りに作業を進める。
作業が終わったらページ下部のログインボタンを押し再ログインする



再ログインすると特権管理者という新たな項目が増えているので
サイトを増やせるようになります。



以上でディレクトリベースの複数立ち上げる方法でした。

wp-conf.phpに書く定数の中に SUBDOMAIN_INSTALL という設定がありますが、
これを true にするとサブドメインベースの設定が出来るようになるようです。
その際は、サブドメインを設定できる環境にないといけませんが
詳しいことはわかりません(ぇ

PHPの日付の比較って文字列のままできるんだね…

MySQLとPHPでゴリゴリしていた時のことなんです。
MySQLから日付型を取得して比較するときにstrtotime()でUnixタイムスタンプに変換していたのですが
急いでいてそのまま”2009-12-01″の様な文字列でそのまま比較しちゃったんですけど
ちゃんと動いているみたいなのでちょっと調べてみた。

&lt;?php
//PHP 5.2.11

//YYYY-mm-dd MySQL DateType
var_dump(&quot;2009-12-25&quot; &gt; &quot;2009-12-24&quot;);  //bool(true)
var_dump(&quot;2009-12-25&quot; &gt; &quot;2009-12-25&quot;);  //bool(false)
var_dump(&quot;2009-12-25&quot; &gt; &quot;2009-12-26&quot;); //bool(false)

//YYYY-mm-dd MySQL DatetimeType
var_dump(&quot;2009-12-25 13:25:30&quot; &gt; &quot;2009-12-25 13:25:29&quot;); //bool(true) 
var_dump(&quot;2009-12-25 13:25:30&quot; &gt; &quot;2009-12-25 13:25:30&quot;); //bool(false)  
var_dump(&quot;2009-12-25 13:25:30&quot; &gt; &quot;2009-12-25 13:25:31&quot;); //bool(false) 

//ISO 8601
var_dump(&quot;2009-12-20T10:00:00Z&quot; &gt; &quot;2009-12-20T09:59:59Z&quot;); //bool(true)
var_dump(&quot;2009-12-20T10:00:00Z&quot; &gt; &quot;2009-12-20T10:00:01Z&quot;); //bool(false) 
var_dump(&quot;2009-12-20T10:00:00+09:00&quot; &gt; &quot;2009-12-20T09:59:59+09:00&quot;); //bool(true)

var_dump((int)&quot;2009-12-25&quot;); //int(2009) 
?&gt;

おおお?・・・おおお!動いてる。
でも、Unixタイムスタンプに変換する時はちゃんとstrtotime()使いましょうw
うーん、この挙動ってマニュアルに書いてあるのかなぁ・・?

MantisBTとSubversionを連携させてみた。

バグトラッカーのMantisとSubversionを使っているので
Subversionでコミットしたらmantisにコミットログが残ると嬉しなーと思い調べてみた。

基本はここ↓の方法で実現できますが
http://bacons.ddo.jp/wiki/mantis/customize/remote_scm_integration

残念ながら以下の様な理由でそのまま使うことができない
・Mantisが外部レンタルサーバ(Linux系)
・SubversionはローカルのWindowsでのsvnserve運用、外からの参照はできない

具体な部分でいうとpre-commitとpost-commitがWindowsでは使えないので
Windows用に書きなおさなければならない。

ってことでhookスクリプトの部分をWindowsでそのまま使えるであろうcmdとVBSあたりで書いてみた。
※SVNの情報を取得する部分を以下から参考にさせていただきました。
http://www.bnote.net/windows/windows/svn_commitmail.shtml

コミット後の流れとしては
hooks/pre-commit.cmd → ~/pre-commit.vbs
mantis/pre-commit.php
hooks/post-commit.cmd → ~/post-commit.vbs
mantis/post-commit.php
こんな感で

Continue reading

CentOS5でPHP5.2.10をインストール

PHP 5.2.6の環境で作業をしていたのですが
そろそろ 5.2.10にバージョンアップしようかと思いyumで一覧を取得したところ
5.2.6までしかなかった orz
しょうがないのでソースからインストールしようかと思ったのだがそれもなんか面倒なので
なんとかYumでできないかと、ググってみたところremiというリポジトリで5.2.10がインストール
できるみたいだったので早速作業をしてみた。

▼リポジトリの件は、以下を参考にさせていただいた。

http://www.kencom.biz/archives/2009/0623094539.php

早速インストール!
#yum –enablerepo=remi,epel update php

と思ったら↓みたいなエラーがでた。
なにやら言語ファイルがコンフリクトしているみたい?
対応がまったくわからんのでちょっとググってみたけど
やっぱりわからなかった。

Transaction Check Error:
  file /usr/share/mysql/charsets/Index.xml from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/charsets/README from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/charsets/cp1250.xml from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/czech/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/danish/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/dutch/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/english/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/estonian/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/french/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/german/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
  file /usr/share/mysql/greek/errmsg.sys from install of mysql-libs-5.1.37-1.el5.remi conflicts with file from package mysql-5.0.54-jason.2
…略

とりあえずmysqlを削除しようかと思ったのだがテスト用とはいえ稼働中のシステムということもあり
削除するのは怖いのでこのまま強制的に上書きでもする方法はないかなーと、お茶を飲みながら考えていたところ

mysqlを先にインストールしてしまえばいいかな?と思ってやってみた
#yum --enablerepo=remi,epel update mysql*

phpもまとめてアップデートするみたいだったのでとりあえずyしてみた

 mysql                   i386       5.1.37-1.el5.remi  remi              3.8 M
 mysql-devel             i386       5.1.37-1.el5.remi  remi              3.2 M
 mysql-server            i386       5.1.37-1.el5.remi  remi               11 M
Installing for dependencies:
 mysql-libs              i386       5.1.37-1.el5.remi  remi              2.1 M
 mysqlclient15           i386       5.0.67-1.el5.remi  remi              1.3 M
 sqlite2                 i386       2.8.17-2.el5.remi  remi              170 k
 t1lib                   i386       5.1.1-7.el5      epel              194 k
Updating for dependencies:
 perl-DBD-MySQL          i386       3.0007-2.el5     base              148 k
 php                     i386       5.2.10-1.el5.remi  remi              1.2 M
 php-cli                 i386       5.2.10-1.el5.remi  remi              2.4 M
 php-common              i386       5.2.10-1.el5.remi  remi              267 k
 php-devel               i386       5.2.10-1.el5.remi  remi              582 k
 php-gd                  i386       5.2.10-1.el5.remi  remi              124 k
 php-mbstring            i386       5.2.10-1.el5.remi  remi              1.1 M
 php-mysql               i386       5.2.10-1.el5.remi  remi               84 k
 php-pdo                 i386       5.2.10-1.el5.remi  remi               91 k
 php-xml                 i386       5.2.10-1.el5.remi  remi              115 k

したらばなんと!
Complete! って文字がでて正常終了したではないか!
つことでサーバ再起動してアップデートを確認したところ
問題なく動いていたのでよかったよかった!