page_adsence

2011年5月31日火曜日

UserAgent一覧

スマートフォンとPCの見分けをつけるために、UserAgentの一覧を調べてみた。

■PCブラウザのUserAgent一覧
http://www.openspc2.org/userAgent/ ← 詳細なとこまで書いてあるがちょっと古いので微妙…
http://pst.co.jp/powersoft/html/index.php?f=5311 ← 簡単にしか書いてない

■スマホのUserAgent一覧
http://www.kagua.biz/android/ualist.html

■携帯のUserAgent一覧
・ドコモ
http://www.nttdocomo.co.jp/service/imode/make/content/spec/useragent/index.html

・au
http://www.au.kddi.com/ezfactory/tec/spec/4_4.html

・Softbank
http://creation.mb.softbank.jp/terminal/?lup=y&cat=ua

・WILLCOM
http://www.willcom-inc.com/ja/service/contents_service/common/pdf/user_agent.pdf

スマホの方は更新されてるみたいなんで、それなりに利用できますが、
PCブラウザのUserAgentの一覧は去年の6月以降更新されていないみたいです。
もろもろ最新のブラウザのUserAgentが入っていないので、
微妙に使いづらい…。

どっかが公式でUserAgentの一覧作ってくれないかなー。

2011年5月30日月曜日

PHPUnit3の使い方

前回に引き続きPHPUnit3に関してのメモ。

早速PHPUnit3を使ってみた。

$ vi ArrayTest.php
<?php
require_once 'PHPUnit/Framework.php';

class ArrayTest extends PHPUnit_Framework_TestCase
{
    public function testNewArrayIsEmpty()
    {
        // 配列を作成します。
        $arr= array();

        // 配列のサイズは 0 です。
        $this->assertEquals(0, count($arr));
    }

    /**
     * メソッド名がtestで始まっていないが,「@test」
     * アノテーションを使用していることに注意
     *
     * @test
     */
    public function arrayContainsAnElementTest()
    {
        // 配列を作成します。
        $arr= array();
 
        // 配列にひとつの要素を追加します。
        $arr[] = 'hoge';
 
        // 配列のサイズは 1 です。
        $this->assertEquals(1, count($arr));
    }
}

んで、保存してテストしてみる。
$ phpunit ArrayTest
PHP Notice:  Please no longer include "PHPUnit/Framework.php". in /usr/share/pear/PHPUnit/Framework.php on line 50
PHPUnit 3.5.13 by Sebastian Bergmann.

..

Time: 1 second, Memory: 3.25Mb

OK (2 tests, 2 assertions)

テスト自体に問題はなさそうだけど、PHP Noticeが出てる…。
なんでだろうと思って調べてみたら、Framework.phpからAutoload.phpに変ったらしい。
「Framework.php」をrequireしても動くが、上記のようにNoticeが出る。
Noticeが出てるのもいやなので、「require_once 'PHPUnit/Framework.php';」→「require_once 'PHPUnit/Autoload.php';」に書き換えてやる。

$ vi ArrayTest.php
<?php
require_once 'PHPUnit/Framework.php';
               ↓
require_once 'PHPUnit/Autoload.php';

class ArrayTest extends PHPUnit_Framework_TestCase
{
    public function testNewArrayIsEmpty()
    {
        // 配列を作成します。
        $arr= array();

        // 配列のサイズは 0 です。
        $this->assertEquals(0, count($arr));
    }

    /**
     * メソッド名がtestで始まっていないが,「@test」
     * アノテーションを使用していることに注意
     *
     * @test
     */
    public function arrayContainsAnElementTest()
    {
        // 配列を作成します。
        $arr= array();
 
        // 配列にひとつの要素を追加します。
        $arr[] = 'hoge';
 
        // 配列のサイズは 1 です。
        $this->assertEquals(1, count($arr));
    }
}

$ phpunit ArrayTest
PHPUnit 3.5.13 by Sebastian Bergmann.

..

Time: 1 second, Memory: 3.25Mb

OK (2 tests, 2 assertions)

するとNoticeが出なくなる。
これで気持ちよく使えそうだ。

2011年5月25日水曜日

au端末の「リクエストされたページ表示できません」に関して

今回やっている案件で、該当するCSVファイルがなかった場合にエラーのメッセージだけ出力する(echo $error_msgのみ)という実装をしていたのですが、Docomo,Softbank,FireMobileSimulaterのDocomo、Au、Softbankはいずれも問題なかったが、Auの実機の場合にみ「リクエストされたページが表示できません」というメッセージが出てきてしまった。

ググってみたら原因はすぐに判明した。

どうやらAu端末はHTMLのヘッダ部分の記述をきちんと書いてあげないといけないらしい。
なので、エラーの場合はエラー用のテンプレートを作ってそこにエラーメッセージを渡すように修正した。

また、なぜFireMobileSimulaterのAuはうまく表示できたのかというところだが、
そんな仕様は実装されていないのだと思われる。
やはり実機に代わるツールとまでは言えない。
とはいえ現状でも十分便利ですけどね。

unity3D

会社の人に教えてもらったのですが、unity3Dというのがすごいらしい。
以下のようなプラットフォームへの対応が可能。
iPhone/iPod Touch/iPad、Mac、PC、Web、Wii、Xbox360、Android、PlayStation 3

iPhoneやAndroidだけじゃなく、PCやコンシューマ向けゲーム機用にも作れるみたいです。
ただし、それぞれのプラットフォーム向けに作成するためにはいろいろと制約があるみたいです。
たとえばiPhoneアプリを作りたい場合はintel MacとMacOS 10.6 Snow Leopard以降のOSが必要になります。
Androidの場合はWinXP SP2以降、MacOS 10.5.8以降でAndroid SDKとJava Development Kit(JDK)が必要になります。

全プラットフォーム向けの開発をWinでできれば幸せだったんですが、
さすがにそこまでは面倒見てくれないみたいです。
残念。
とはいえちょっと面白そうなので、いろいろと試してみたいなーと思います。

2011年5月24日火曜日

jslinuxってすげー

なんだか最近ネットにちょくちょく上がってくるjslinux。
なんだろうと思って調べてみた。

なにかというとブラウザ上でLinuxをエミュレートしてるもの。

まじでか!と思ったんですけど、普通に動いてました。
Linuxの全てが使えるわけではなく、一部の機能だけのようです。
また、速度的にも実用的なレベルとは言い難いですね。
以下のURLでデモが動いています。

http://bellard.org/jslinux/

すごいの一言。
そもそもブラウザ上でLinuxを動かそうという発想がすごい。
とりあえず何ができるのかとか全く調べてないので、取り急ぎ紹介だけ。

http://journal.mycom.co.jp/news/2011/05/19/012/index.html

2011年5月20日金曜日

携帯コンテンツ作成にあたって

携帯向けサイトを作成するにあたって気をつけないといけないこと。
今まで携帯向けコンテンツを作ることはめったになかったんですが、
転職したので携帯コンテンツを作ることもしばしば。。。
そこである程度基本的なフォーマットを調べてみました。
ぶっちゃけどこまであってるんだか、よくわからんのですが、指標として一応。

  • 1ページ当たりのファイルサイズは9kb以下に抑える(画像等含む)
  • CSSは外部ファイルではなく、HTMLタグ内にstyleを書くようにする
  • サイトの横幅は240pxか、スクロールバーの分を見込んで228px以内にする
  • 文字コードはやはりShift-JISがいい。(最近の携帯はUTF-8でもいけるが対応機種を広めるのであればShift-JISが無難)
  • 画像形式はJPEGかGIF。ただしGIFは一部の機種でしか使えないので、JPEGに統一するのが望ましい。
  • Tableタグは使わない
  • DOCTYPEの宣言は以下の通り。XHTML Mobileを宣言することが重要。クローラーにモバイルサイトだときちんと伝えるためには必要。
  • フォントサイズの指定はDocomoは普通にHTMLと同様の指定方法でも問題ないが、auとsoftbankは問題あり。ピクセルで指定するのがいいらしい。
  • mailtoを使用する場合、SoftBankはUTF-8のままURLエンコードしても問題ないが、DoCoMoとauはURLエンコード前にShift_JISに変換しておかないと、題名などの文字が化けてしまう。
  • 回り込みはauのみfloat:leftで対応できなかったみたいなので、alignを指定する必要がある。

<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<title>サイトタイトル</title>
</head>

シェルスクリプトで自分自身のパスを調べる方法

PHPで実行しているスクリプトのディレクトリを取得する場合は、

dirname(__FILE__);


と書くことで取得できますが、シェルの場合はどうやって取得するのかわからなかったので調べてみた。
で、取得方法としては以下の通り。

$ vi test.sh
BASE_DIR=`dirname $0`
echo $BASE_DIR


で実行されているシェルのディレクトリを取得することができる。
しかし、これをこのままechoするとなんだか残念な気分にならざるを得ない。
実行すると以下のようなレスポンスが返ってくる

$ ./test.sh
.


なんて残念な…。
「.」だけです。
相対パスで返ってくる。
もうちょっと調べてみると、こういう取り方をすればいいのかという記事がありました。
その方法は、

$ vi test.sh
BASEDIR=`cd \`dirname $0\`; pwd`
echo $BASE_DIR


ものすごく納得しました。
確かにこの方法であれば、シェルが実行されているディレクトリを絶対パスで指定することができます。
これで環境が変わっても、ディレクトリ構成さえ一緒であれば、問題無く使えます。

2011年5月16日月曜日

Everything

先日会社の同僚の人にEverythingっていうファイル検索のアプリを教えてもらったんですが、
どうやら今の会社では使えないという話を聞いて、その原因を調べてみました。
結論から言うと、

「やっぱ無理!」

ってことに落ち着いてしまいました…。

で、以下が詳細。
「Everything」とはファイル検索ツールで、NTFSでフォーマットされたのローカルドライブのみ対応。

昔一度ファイル検索するためにgoogleデスクトップを使ってみたが、
正直重くて使い物にならなかった。
しかし、この「Everything」というツールはめっちゃ高速らしい。
インストーラー版とZIP版があり、両方とも日本語対応。
但し、ZIP版の場合は、Langファイルも合わせてダウンロードする必要がある。

会社のPCで使用しようと思ってダウンロードしてきてみたが使えなかった。
というのもNTFSのファイルシステムで、ファイルの変更履歴として保存している「USNジャーナル」を直接読み取ることで、
高速なインデックスを可能にしているのだが、
その「USNジャーナル」は管理者しか開けないというもの。

会社のPCで試しにwindowsのコマンドプロンプトでchkdskコマンドを実行してみたのだが、

「アクセスは拒否されました。」

案の定アクセスができない…。
ちなみにchkdskコマンドは指定されたディスクの状態を確認し表示するコマンドで、
USNジャーナルを参照して状態の確認をしている。

2011年5月11日水曜日

jCalendar.jsでは年月日のセレクトボックスが必ずないと挙動がおかしくなる

今までjCalendar使ってましたが、今回初めて年月しかないセレクトボックスを作った際の挙動がおかしかった点。
1ヶ月間の数字の集計をする際に、セレクトボックスで年月を指定するように作ったのだが、
postして次の画面に進んだ後に戻るとHTMLにselectedときちんと書かれているにも関わらず、
別の月が選択されてしまうという現象が起こった。

HTMLの記述は間違ってなさそうだし、そもそも別の部分(年月日)で試した場合は問題ない。
で、Firebugでブレイクポイントを設定してリロードしてみた。
すると、最初はちゃんとした月が選択されているが、

$(要素).jcalendar();

を実行された後に月が当月に変ってしまう状態になっていた。
別のところでは問題なく動いているので、jCalendar自体がバグっているとは考えにくい。
なので、とりあえず日のセレクトボックスを足してみたら、
見事にちゃんとした挙動になりました。

本来ならソース読んでから対応するのが当たり前なのですが、
ちょっと急いで帰りたかったら、とりあえずおk。
後でソース読もう。

2011年5月10日火曜日

メール便使用時には注意が必要

先日注文していた商品がクロネコメール便で届くはずだったんですが、未だに手元に来ず・・・。
伝票番号を元に追跡すると2日前に投函完了になっている。
本日ヤマトに問い合わせをしてみたが、配達員の記憶だけが頼りで、それ以上は調べようがないとのこと。
出てくることを願うばかりです。

今回初めてこういった郵便事故にあったのですが、
気になっていろいろとネットで調べてみたら、記事が出るわ出るわ・・・。
今までクロネコヤマトは結構しっかりしてる印象だったんですけど、それはあくまで宅急便での話しで、
メール便はバイトや嘱託の人達が配ってるみたいで、投函先のポスト間違いやら色々とあるみたいです。
さらには過去にメール便を配達せずに自宅や自家用車に保管してた事件がおきてるみたいです。

皆さん困ってらっしゃる方に対して
「メール便ではなくなっても困らないようなものしか送らないようにしましょう」とか、
「メール便はそういうものだから、最初から入札するな」とか書かれていますが、
そんな届くかどうか確約できないようなサービスを提供しているクロネコヤマトに問題があると思います。

そもそもメール便に配達事故がよくあるなんてこと、一度経験したような人しか知らないだろうし、
実際自分も今回初めてそういうことになってから調べ始めて、メール便ってそういうものなのかって知りました。
クロネコのメール便自体を何とかしてもらわないと、二度と使う気にはなれません。
佐川急便より追跡システムもしっかりしてるから信頼していたのですが、がっかりです。

6/1追記
あれから営業所に電話してクレームを入れてみた。
クロネコ側が指定してきた時間に電話がかかってこなかったりと、
イライラしましたが、最終的には紛失。
代替品を送りますという結果になりました。
代替品の確保ができなかった場合にどうなるのかは未定ですが、
とりあえず弁償はしてくれそうです。

6/10追記
支店長判断で代替品の確保はせずに、代金の弁償のみになった。
多分代替品の確保がめんどくさいからだと思う。
翌日に連絡するって言ってたのに、
こっちから電話をかけるまで何も対応しないヤマト。
最悪・・・。

2011年5月8日日曜日

クロネコメール便

今回初めてクロネコメール便を使って商品を送ってもらったのですが、到着するまで結構かかりました。
佐川急便に比べるとクロネコは早いって印象だったんですけど、メール便は別みたいですね。

一応ヤマトのサイトに行って、メール便の配達にかかる日数は同じ都内だと3日と書かれています。
今回のケースでは夕方発送で、ついたのが翌々日の朝。
3日という記述だと丸3日なのか、発送してから3日以内に配達するのかはよく分かりません。

とりあえず今回の場合も正常なんでしょうが、宅急便と比べちゃうので遅く感じてしまいますね。
宅急便とかだと夕方発送してても翌日の昼とかには大体ついてました。
その感覚で待ってたので、ものすごく待った気がします。
まぁ次回からはメール便には気をつけよう。
送料安いのはいいけど、到着が遅いのはもどかしい。

2011年5月7日土曜日

iOSのアップデート

iOS4.3.3がリリースされたので、アップデートをしているのですが、
iOS4位からアップデートにやたら時間がかかるようになった気がする。
iOSのアップデートファイル自体の大きさもだんだんでかくなってきてて、今では666.2MB。
CD-ROM一枚分の容量になってる。
しかもiphoneユーザーが増えたからかも知れないけど、iOSのダウンロードにめちゃくちゃ時間がかかる。
速度は100K出ればいい方。
OSのアップデートに4時間って・・・。
節電節電といっている現在で、無駄に4時間もPC立ち上げてないといけないのは無駄すぎる。
そろそろ差分アップデートの提供を本気で進めて欲しいものです。

iOS5以降からはOTA(Over The Air)に対応するかもみたいな噂も出てきていますが、色々と障害があるようです。
技術的な話ではなく、政治的な話で。

確かに3Gの回線でiOSのアップデートとかされた日には、ソフトバンクの回線がかなり圧迫されることは間違いないですね。
それで電話とか繋がりませんとか、サーバー落ちましたとか、そういったことになりかねません。
AppStoreのアプリも20MB以上はWifi経由でダウンロードするようになっているんだし、
Wifi経由でアップデートしてくださいって言うのじゃだめなんですかねー。
自宅にWifi環境がない人もいると思うので、今までのガラケーの文化から考えるとちょっとなーという気もしますが。

つーかOTAになったところで、4時間も通信してたらバッテリ切れそうなので、
OTAよりも差分アップデートのほうを先に提供して欲しいですね。
差分アップデートで容量が減ったら、通信の帯域的な問題はクリアになる気がするので、
それで解決できそうなんだけどな・・・。

ちなみにOTAというのは、ガラケーのファームウェアアップデートのように携帯端末のみでのアップデートを可能にするものです。

2011年5月6日金曜日

globとopendirの速度に関して

glob vs opendirで速度を検証しているサイトがあった。
最近はglobって便利だし、opendirよりすっきりするからいいなーと思って結構使っていたのですが、
ベンチマークとってるサイトみると、opendirの方が早いみたいですね。

で、試しにソースをコピって自分のVMWare上でベンチマーク取ってみたのですが、

「あれ、globの方が早くね?」

ファイル数の問題かも知れないですが、1K程のcsvを150ファイル程置いて試してみたところ
平均的にはglobの方が早かったです。
requireしてるファイルの容量は関係ないと思うんで、
やっぱファイル数かな。
150ファイルって結構多いと思うんですが、
何ファイルだったらopendirの方が早くなるのかなー。
暇な時にその辺もベンチ取れたらなーと思います。
つっても、opendirよりglobの方が綺麗に書けるから、
自分的にはglob推奨していこうと思います。

ベンチ取ったソースは下記の通り。
<?php

//Waste a little time to offset PHP's startup.
for($i=0; $i<20; $i++) { 
    print ' '; 
}

$start_time = time()+microtime(true);

ob_start();
for($x=0; $x < 20; $x++) {
    $dir = 'cache/';
    if (is_dir($dir)) {
        if ($dh = opendir($dir)) {
            while (($file = readdir($dh)) !== false) {
                //Include the file 
                include($file);
            }
            closedir($dh);
        }
    }
}
ob_end_clean();

print ((time()+microtime(true)) - $start_time). ' (opendir time)<br />';


$start_time = time()+microtime(true);

ob_start();
for($x=0; $x < 20; $x++) {
    //Include the function files
    foreach (glob("cache/*.html") as $file) {
        //Include the file 
        include($file);
    }
}
ob_end_clean();

print ((time()+microtime(true)) - $start_time). ' (glob time)<br />';
?>

bash系のファイルに変更を加えた場合の反映方法

bashファイルに変更を加えた場合、すぐにその設定内容を反映させるためのコマンド。

$ source ~/.bashrc
$ source ~/.bash_profile