2008年3月22日土曜日

次の中で好きなプログラム言語は?の投票結果

PHP 17 (44%)
Java 9 (23%)
Ruby 7 (18%)
JavaScript 7 (18%)
C++ 7 (18%)
C# 5 (13%)
Perl 4 (10%)
Python 3 (7%)


ブログの内容からしてPHPが多いことは想像できたが、JavaとC#が思ったより多かったのは意外だった。PythonがゼロじゃなかったのはTracの影響かな?

2008年3月19日水曜日

個人的なPHP用のエディタ ランキング

前々から何か良いものはないかと思っていて、Komodo Editのことを知ったのでついでに調べてみた。

  1. PHPエディタ
    • 用途:PHP専用
    • 起動の早さ:早い
    • 入力補完:Ctrl+スペース
    • PHPマニュアル:F1 (ただし表示されるphpspotのマニュアルは古い。htmlspecialcharsの第2引数の説明が間違ってる。変えられないのかな?)
    • その他:PHPモードの場合、htmlやJavaScript、CSSがハイライトされないのが難点
  2. jEdit
    • 用途:メインはJavaだが、PHP等の他の言語にも対応している
    • 起動の早さ:まあまあ早い
    • 入力補完:Ctrl+b
    • PHPマニュアル:無し(?)
    • その他:JavaのSwingで作ってあるので、少しもっさりする
  3. Komodo Edit
    • 用途:汎用
    • 起動の早さ:遅い
    • 入力補完:Ctrl+スペース
    • PHPマニュアル:Shift+F1 (Webブラウザでphp.netのマニュアルを表示)
    • その他:コードのハイライト等の見た目はとても綺麗
  4. Eclipse
    • 用途:メインはJavaだが、PHPプラグインを使えばPHPにも対応
    • 起動の早さ:とても遅い
  5. VS.Php
    • 有償。お試し版もあるが試してない


総評:
 気軽に使うならPHPエディタで。何より気軽に立ち上げることができるのは何物にも変えがたい。
 もしPCにパワーがあり、かつプログラム量が多いならKomode Editが良さそう。


CentOSに yumで FFmpegをインストール

大変そうなイメージが強かったが、実はyumでできることを知った。

  1. CentOS で構築する自宅サーバ : yum に RPMforge リポジトリを追加するのコマンドをコピー&実行して、RPMforgeリポジトリを追加する。
  2. 眠る開発屋blog » CentOS5にffmpegをインストール(yum)のコマンドをコピー&実行して、yumからFFmpegをインストール。

以上。

config等のシクニチャはこんな感じ。
FFmpeg version SVN-rUNKNOWN, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: --prefix=/usr --libdir=/usr/lib --mandir=/usr/share/man --incdir=/usr/include/ffmpeg --enable-libmp3lame --enable-libogg --enable-libvorbis --enable-libogg --enable-libtheora --enable-libfaad --enable-libfaac --enable-libgsm --enable-xvid --enable-x264 --enable-liba52 --enable-liba52bin --enable-pp --enable-shared --enable-pthreads --enable-gpl --disable-strip
libavutil version: 49.4.0
libavcodec version: 51.40.4
libavformat version: 51.12.1
built on Jun 4 2007 11:02:12, gcc: 4.1.1 20070105 (Red Hat 4.1.1-52)

ただし、このFFmpegは3GPPの音声のAMRに対応していないらしく、対応させようと思ったら少し面倒。
他のツールで事前に変換して逃げるか?


ちなみにWMVの対応状況は、下記の通り。
DEVSD wmv1
DEVSD wmv2
D V wmv3
WMV9をデコードできるようだ。

特選:ちょっと変わった画像関連のJavaScript 16個

skuare.net : 画像関連 アーカイブから選別した。(←それにしても、このサイトのJavaScriptデータは物凄いことになってる。)


2008年3月15日土曜日

「はてな」で見る、IEバージョン別のスクリーンショットの比較

IE7バージョンをさかのぼっていって、IEの変遷を見つつ、はてなのトップページがどのバージョンまで見られるか試してみる。
(最初はYahoo! Japanでスクリーンショットを撮ってみたが、あまりにも無難に対応しているのでやめた。)

実験に使ったIE7は、インストールしてからほとんど設定等を変更していないものを使っている。
IE6以前についてはMultipleIEsのものを使っている。


IE7
以前のIEと比べると上部のUIが大幅に変わった。メニューバーが隠れるのでWindowが広く使える。検索窓が標準で付いている。フィードに対応している。


IE6
上部メニューのアイコンがソフト。

IE5.5
シンプル。はてなではここまで対応しているようだ。

IE5.0
はてなではJavaScriptのエラーが発生。(左下の黄色い三角マーク。)また、「注目のキーワード」のところが表示されていない。

IE4
上部メニューにMailがある。もはやはてなは見られない。

IE3
手元のWindowsXPで起動すると、すぐ異常終了してしまうので確認できなかった。

Visio 2003 から PDFへ 変換する方法

  1. Visioの「ファイル」メニューから、「Webページとして保存」を選択し、Webページとして保存する。
  2. このとき作成されるフォルダの中に「gif_1.gif」というGIF画像ファイルがあるが、これがVisioの画面ハードコピー。画像ファイルのままでよいならこのまま使える。
  3. あとはこのGIF画像ファイルを貼り付けて、PDFファイルを作る。やり方はいろいろあるが、例えばGoogleのサービスであるGoogleドキュメントを使ってもできる。
    Googleドキュメントで新規ドキュメントを作成し、先ほどのGIF画像ファイルを挿入(アップロード)する。
  4. 「ファイル」メニューから「PDF形式でエクスポート」を選択し、PDFファイルとしてダウンロードする。
  5. こんな感じでできあがり。

IEでも faviconを表示するためにサーバ側で必要なこと

IEではfaviconがURL入力欄の左側に(IE7ではタブの左側にも)表示される。

(例)



しかし、サイトによってはfaviconの代わりにIEアイコンが表示される。というよりfaviconが表示されないサイトの方が多い。

(例)
Yahoo!でさえも。Firefoxでは表示されるので、faviconが無いわけではない。( http://www.yahoo.co.jp/favicon.ico にある。)


原因は、faviconのファイル形式か、あるいはfaviconの置いてあるドメインらしい。
IEのFaviconに関する仕様は非常に厳格です。
まずWindows icon形式(bmp形式ではないよって拡張子を変えただけではだめ)でなければなりません。
(中略)
またIEはサイト(=ドメイン)のルートにあるfavicon.ico以外は読み込みません。

上記引用元で紹介されている、@icon変換をダウンロードしてfaviconを作成したところ、無事にIEでもfaviconを表示できた。
(@icon変換に読み込ませるために、既存のfaviconをいったんWindowsのbmp形式に変換したが。)

2008年3月13日木曜日

バッチファイルでWindowsのサービスを再起動する方法

Windows上で動いているApacheなどのサービスを、バッチファイルを使って再起動する方法。


SC.exeを使って再起動しようとすると上手くいかない。

set service_name=Apache2
sc stop %service_name%
sc start %service_name%
結果:
C:>set service_name=Apache2

C:>sc stop Apache2

SERVICE_NAME: Apache2
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN))
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x3
WAIT_HINT : 0x7530

C:>sc start Apache2
[SC] StartService FAILED 1056:

サービス インスタンスは既に実行されています。
この結果ではわかり辛いが、SC.exeは処理をフォークして非同期で進めるため、サービスのSTOPが完了する前に処理が戻ってきてしまう。
そのため、STOPが完了する前にSTARTを実行してしまい、その結果STARTに失敗している。


どうすればよいか?


昔ながらのNETコマンドを使えばよい。
set service_name=Apache2
net stop %service_name%
net start %service_name%
結果:
C:>set service_name=Apache2

C:>net stop Apache2
Apache2 サービスを停止中です.
Apache2 サービスは正常に停止されました。


C:>net start Apache2
Apache2 サービスを開始します..
Apache2 サービスは正常に開始されました。
NETコマンドはコマンドの完了まで処理が戻ってこないので、このようなケースでは便利だ。
(待たされたくない場合には不便だが。)

これでタスクに登録して定期的に再起動できる。


SC.exeを使ってApacheを再起動するためにPHPでプログラムを組んでからこれに気付いたことは、内緒だよ。

IEの JavaScriptで リンクの hrefを変えると表示内容が変わる問題

IE6/7のJavaScriptでリンクをいじった時のバグとその対策について。


問題が起きる条件

  • ブラウザはIE6 or IE7
  • 該当のリンクの文字列に、@(アットマーク)が含まれている


上記の条件を満たす場合、JavaScriptを使ってリンク(a要素)のhref属性を変更すると、なぜかリンクとして表示しているテキスト等がURLになってしまう。
このようなリンクを、
<a id="link" href="before.html">foo@bar</a>

このようなJavaScriptでhrefを変更すると、
var link = document.getElementById("link");
link.href = link.href.replace("before", "after"); //右辺にhref属性が入っていると駄目らしい

このようなリンクになるはず(じっさいFirefoxではこうなる)が、
<a id="link" href="after.html">foo@bar</a>

こうなってしまう。
<a id="link" href="after.html">after.html</a>


対策としては、innerHTMLでリンクのテキスト等を退避しておき、href属性変更後に退避した値をセットする。
var inner = link.innerHTML;
link.href = link.href.replace("before", "after");
link.innerHTML = inner;


参考: アカラボ: javascript: link.href を変更するとリンクテキストが壊れます

PHPの DateTimeオブジェクトの簡易リファレンス

あまり使わない部分は省略。


コンストラクタ
※パラメータの$strTimeは日時を表す文字列。(参考:PHPの日付操作はDateTimeが簡単
 $dateTime = new DateTime($strTime);
  または
 $dateTime = date_create($strTime);


日時を加減算する
※パラメータの$strTimeは日時の加減算表す文字列。(参考:PHPの日付操作はDateTimeが簡単
 $dateTime->modify($strTime);
  または
 date_modify($dateTime, $strTime);


日付をセットする
 $dateTime->setDate($year, $month, $date);
  または
 date_date_set($dateTime, $year, $month, $date);


時刻をセットする
 $dateTime->setTime($hour, $minute, [$second]);
  または
 date_time_set($dateTime, $hour, $minute, [$second]);


指定したフォーマットの文字列にする
※パラメータの$strFormatはdate()などで使うフォーマット。(例:"Y/m/d H:i:s")
 $dateTime->format($strFormat);
  または
 date_format($dateTime, $strFormat);

2008年3月7日金曜日

国内ブログサービスのユーザー数の変遷 (2007 ~ 2008)

国内の大手ブログサービスの、最近1年間でのアクティブユーザー数の変化。
データはブログサービス比較 - ブログファン ブログ総合情報のもの。


2007年

  1. FC2ブログ    289,819
  2. livedoor Blog 276,660
  3. Yahoo!ブログ 209,658
  4. 楽天ブログ   151,438
  5. ヤプログ!    149,629
  6. アメーバブログ 131,776
  7. goo ブログ    124,757
  8. Seesaaブログ 98,652
  9. エキサイトブログ 93,419
  10. JUGEM      89,597



2008年 (カッコ内は2007年の順位からの変動)
  1. FC2ブログ 378,886 (→)
  2. アメーバブログ 325,553 (↑)
  3. livedoor Blog 236,064 (↓)
  4. Yahoo!ブログ 226,906 (↓)
  5. ヤプログ! 168,901 (→)
  6. Seesaaブログ 162,245 (↑)
  7. 楽天ブログ 129,134 (↓)
  8. goo ブログ 123,208 (↓)
  9. JUGEM 109,601 (↑)
  10. ココログ 72,675  (↑)


アメーバブログの躍進が目を引く。Seesaaも意外に頑張ってる。

IE6でダウンロードするファイルのファイル名が指定できない問題の回避方法

PHPでzipファイルを保存時のファイル名を指定して出力ようとしたが、IE6だけ保存時のファイル名が指定したものにならなかった。(FirefoxとIE7は思い通りになった。)

調べてみるとそれらしいのが見つかった。
Internet Explorer 6 でダウンロード ダイアログに正しいファイル名が表示されない

確かにApacheでgzipにしている。圧縮されていて分からないから他のファイル名を付けてしまうのか。
できればgzipするかどうかをContent-Typeで判断させたいが、それらしいのが見つからないのでSetEnvIfで該当のPHPをgzの対象外にした。


それでもまだうまくいかないので調べてみると、もう一つそれらしいのが見つかった。
Content-Disposition: attachemnt と Cache-Control: no-cache によるダウンロードの問題

該当ページはSESSIONを使っているのでデフォルトCache-Controlがno-cacheになっている。
適当な値でCache-Controlを指定したら正しいファイル名で出力できるようになった。

2008年3月4日火曜日

PDOでの PostgreSQLの booleanへの INSERT

PHPのPDOについて。

PDOのPrepared Statementで、PostgreSQLのboolean型の列にデータを登録する場合。

パラメータとしてPHPのbool値のfalseを渡すと、NULLになる。

$pdo = new PDO(省略);
$stmt = $pdo->prepare('INSERT INTO foo(bar) VALUES(?)');
$stmt->execute(array(false)); //=> NULLになる

FALSEを登録したい場合、文字列として"FALSE"を渡す。
$pdo = new PDO(省略);
$stmt = $pdo->prepare('INSERT INTO foo(bar) VALUES(?)');
$stmt->execute(array('FALSE')); //=> FALSEになる

TRUEの場合は、PHPのbool値のtrueでも、文字列の'TRUE'でもどちらでも大丈夫。

Windows 98 SE on VMware インストールメモ

MSDNのCDを使ってインストールする。
MSDNのWin98SEのCDからはブートできない(isoイメージはなく、SETUP.EXEなどのインストーラが入っている)ので、一手間かける必要がある。


インストール手順

  1. MSDNのWin98SEのCDから、JAPANESEフォルダ内のWIN98SE_ATフォルダを別のCD-R等にコピーする。
    • そのままだと9文字以上のファイル名(の重複?)の関係で、MS-DOSからSETUP.EXEを実行できないため。
  2. Windows 98 Boot Disk Download | AllBootDisksから"Windows98.exe"をダウンロードする。
  3. 空のフロッピーディスクをフロッピードライブに入れて2.を実行する。フロッピーディスクにディスクイメージが書き込まれる。
  4. VMX BuilderでWin98用のVMXファイルを作る。
    • やり方はCentOS on VMware 構築メモと同様。
    • HDDは標準インストールでは「最低187.6MB」必要。
    • Win98はFAT32なので、HDDは2Gまでしか認識しないので注意。
  5. 4.のVMXをVMwareで起動し、3.で作ったフロッピーからブートする。(Win98のMS-DOSが起動する。)
  6. 指示に従いfdiskでCドライブのパーティションを作る。
  7. 指示に従いrestart。
  8. 再起動後、Cドライブをフォーマットする。(format c:)
    • フォーマットしないでインストールしようとするとエラーになる。("Windows Setup requires 7340032 bytes available on your C: drive.")
    • 最初はフォーマットがうまくいかなかった("Invalid media type reading drive C:")が、何度かVMX作成をやり直したらなぜかできるようになった。
    • クイックフォーマットはできない。
  9. MS-DOSから、1.で作ったCD(今回はEドライブだった)の中にあるSETUP.EXE(今回は"e:win98sesetup.exe")を実行する。
  10. あとはウィザードに従って進めてゆく。
    • プロダクトキーは自動で入力されるので準備不要。
    • Win98の起動ディスクを作る場合は、フロッピーディスクが2枚必要。
    • 途中で何度か再起動するのでフロッピーディスクは抜いておく。
  11. 途中で何度かWin98SEのインストールCDを求められるので、その時には1.のCDのフォルダ(今回は"D:win98se")を指定する。


懐かしい。初めて買ったWindowsが98SEだった。



参考:
 ブログ跡地: VMwareにWindows 98の環境を作る一つの方法
 コマンドプロンプトを使ってみよう! -ファイル操作-
 AOL Q&A広場 Windows98をインストールしようとしたのですが・・・

Google AdSenseに関するプライバシーポリシー

当サイトではGoogle AdSenseの広告掲載に伴いGoogle AdSenseにクッキー等のユーザー情報を送信している。
(Googleでのそれらの情報に対するポリシーについてはGoogle プライバシー ポリシー ハイライト版を参照。)

Googleにクッキーを送信したくない場合は、ブラウザの設定を変更することによりクッキーを送信しないようにできる。(一部のブラウザを除く)

2009/03/14 追記
ユーザーはAdvertising and Privacy – Google Privacy CenterにアクセスしてGoogleへのクッキー送信についての設定を変更することができる。


参考:
 Google AdSense - 利用規約
 AdSense ヘルプ センター (プライバシーおよびセキュリティについて)
 プライバシー・ポリシーについて - AdSense のガイドライン | Google グループ (AdSense利用者からの意見など)

2008年3月1日土曜日

動画共有サイトOnAirの サムネイル取得API用 PHPクラス

動画共有サイトOnAirサムネイル取得APIのPHPラッパー "Services_OnAir" を作ってみた。
PEAR形式で公開できるといいんだけど、とりあえずソースの掲載だけ。
(Bloggerの都合でインデントは全角スペースにしてある。)

<?php
class Services_OnAir {
 public $apiUrl;
 public $title;
 public $videoUrl;
 public $thumbnailUrl;
 
 /**
  * APIに情報を送信してデータを取得する
  */
 public function sendAndLoad($videoNo, $time, $comment = "") {
  $this->apiUrl = 'http://nowonair.tv/api/thumbnail.page?';
  $this->apiUrl .= "videoNo=$videoNo&time=$time&comment=" . urlencode($comment);
  
  $str = mb_convert_encoding(file_get_contents($this->apiUrl), 'UTF-8', 'SJIS');
  $arr = explode("n", $str, 2);
  $xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>' . $arr[1]);

  if ($xml->success) {
   $title = mb_convert_encoding($xml->video->title, mb_internal_encoding(), 'UTF-8');
   $this->title = html_entity_decode($title, ENT_QUOTES);
   $this->videoUrl = $xml->video->url;
   $this->thumbnailUrl = $xml->thumbnail->url;
  }
  
  return $xml->success;
 }
 
 /**
  * htmlエスケープしたタイトルを取得する
  */
 public function getTitle() {
  return htmlspecialchars($this->title, ENT_QUOTES);
 }
 
 /**
  * サムネイルのimgタグを取得する
  */
 public function getImageTag() {
  return '<img src="' . $this->thumbnailUrl . '" alt="' . $this->getTitle() . '" />';
 }
 
 /**
  * サムネイルの付きのリンクを取得する
  */
 public function getImageLink() {
  return '<a href="' . $this->videoUrl . '">' . $this->getImageTag() . $this->getTitle() . '</a>';
 }
}

使用例は下記のような感じで。
<?php
require('Services/OnAir.php');

$onair = new Services_OnAir();
if ($onair->sendAndLoad(100, 10, 'テスト')) {
 echo $onair->getImageLink();
} else {
 echo 'faild';
}

JavaScriptによる変数型の判定

ほとんどは typeof で判定できるが、一部は instanceof で確認しないと判断できない。
太字のところはひっかかりやすいので注意。RegExpはFirefoxとIEで結果が違う。


Boolean
  typeof true => boolean

Number
  typeof 123 => number

String
  typeof "abc" => string

Object
  typeof {} => object

Array
  typeof [] => object
  [] instanceof Array => true

RegExp
  typeof /regexp/ => (Firefox2の場合) function / (IE7の場合) Object
  /regexp/ instanceof RegExp => true
  /regexp/ instanceof Function => false

Function
  typeof function(){} => function
  (function(){}) instanceof Function => true

undefined
  typeof undefined => undefined
 undefined instanceof Object => false

null
  typeof null => object
  null instanceof Object => false

SimpleXMLでShift_JISを使うには

PHPのSimpleXMLはShift_JISに対応していないので、simplexml_load_string()やsimplexml_load_file()の前にSimpleXML内の文字コードであるUTF-8に変換しておく必要がある。
ただし、SimpleXMLはXMLの先頭にあるXML宣言の中のencoding属性を読み取って、それに基づいて文字コード変換をするので、このencoding属性も変えなければならない。


元のXML(Shift_JIS)

<?xml version="1.0" encoding="Shift_JIS" ?>
<root>
<element>
<child>foo</child>
<child>bar</child>
<child>baz</child>
</element>
</root>

文字コードとXML宣言を変換
$str = mb_convert_encoding(file_get_contents($path), 'UTF-8', 'SJIS');
$arr = explode("n", $str, 2); //この例ではXML宣言の後に改行している場合のでそこで区切った
$xml = simplexml_load_string('<?xml version="1.0" encoding="UTF-8" ?>' . $arr[1]);

できあがったXMLのイメージ
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<element>
<child>foo</child>
<child>bar</child>
<child>baz</child>
</element>
</root>


参考: SJIS、EUC-JP、JISなどの日本語をSimpleXMLで使う方法 - PHP::PEAR - dozo PukiWiki

PHPでファイルを移動するには

rename()で。

rename(old_path, new_path);

PHPでゼロ埋め(ゼロ パディング)


(2011/1/21 追記:もうちょっとスマートな方法をfloatingdays: PHPで文字列をパディング (ゼロ埋め、スペース埋め等)に書いたので、そちらも参考に。)


PHP: sprintf - Manual を読んでも理解できない。C言語と同じ?

シンプルなゼロ埋めなら下記でよさそう。

//5桁の場合の例
$str = sprintf('%05d', $num);
第1引数の説明
  • % ・・・固定で
  • 0 ・・・ゼロで埋めるという指定。(参考:スペースで埋める場合はスペースを指定する)
  • 5 ・・・桁数
  • d ・・・10進数という指定


参考: アクセスカウンタのゼロ埋め(CGI形式)

ブログ アーカイブ

tags