WEB開発のあれこれ
PHP,JAVA,Javascript,objective-c,Ajax,Flex,Air,Linuxなどなど
最近雑記帳になりつつある・・・
2011.10.23より忍者ブログより移転
2008年11月9日日曜日
[雑記]Zend Framework+YUI+smarty
今の仕事内容は表題の環境のWEB業務アプリ開発です。
YUIでAJAXバリバリのUI組んだり
ZendのFWでMVCのVへのデータの受け渡しを簡素化したりと
なかなか面白い案件で、気づいたら夜9時回ってたーなんて事もざらw
ここんところ休日鯖構築も止まってて、自主的な技術勉強もする意欲がなかったんですが
ほかのFWやらUIの勉強もしたいなーと思う今日この頃。。。
2008年9月30日火曜日
sudo
多くなってきたのでsudoを使ってみようかな・・と
それのメモ
#visudo
sudoの設定ファイルを書き換える。
標準では
/etc/sudoers (FreeBSD では /usr/local/etc/sudoers)
に設定ファイルは配置されているのだが、それを直接viなどで編集してはいけないらしい。
visudoを実行すると(rootで)コメントがずらずらと出てくる。
※visudoの操作はviとはちょっと異なる
コマンド実行時に下にヘルプが出るので、保存、終了はそれを参考に
Ctrl+X:終了 Ctrl+O:保存
編集箇所は一番下の行
# User privilege specification
root ALL=(ALL) ALL
の部分に
[ユーザー名] ホスト=(権限ユーザー) コマンド
の書式で追記していけば良いみたい
2008年9月27日土曜日
Swapの設定について
以下takaichi501011さんのtaka_lifeブログからの記事を参照しています。
http://ameblo.jp/takaichi501011/entry-10126486962.html
スワップ領域の追加方法
①任意の場所にディレクトリ作成
#mkdir /mnt/swap
#cd /mnt/swap
②ddコマンドでswapファイルを作成
#dd if=/dev/zero of=swap bs=1024 count=任意のサイズ
③スワップ領域を拡張する
#/sbin/mkswap swap(デバイス)
④スワップ領域を有効にする
#/sbin/swapon swap(デバイス)
※無効にする際は/sbin/swapoff デバイス
⑤再起動後にこのままでは消えてしまうのでrc.localファイルに
起動後に有効にするコマンドを記述
#vi /etc/rc.local
/sbin/swapon swap(デバイス)を追加
《終了》
メモリオーバーコミット設定
※swap使用量が100%に達しない為の設定です。ハングアップを防ぐため
①/etc/sysctl.confを編集します。
#vi /etc/sysctl.conf
#/sbin/sysctl -p
下記を追加
vm.overcommit_ratio = 99
vm.overcommit_memory = 2
overcommit_ratioは物理メモリの割合を指定します。
99だと99%使用して1%は常に空けれるようにしておくということになります。
overcommit_memoryを2にするとメモリオーバーコミットを許さなくなります。
swappinessの設定
swappnessは1~100まで設定できて大きいほどSwapしまくるみたい。
①/etc/sysctl.confを編集します。
#vi /etc/sysctl.conf
下記を追加
デフォルトは60なので50に設定
vm.swappiness = 50
#/sbin/sysctl -p
overcommit_memory 2
だと
webminとapacheを同時起動するとどちらかがメモリ不足で落ちてしまう。
ので
overcommit_memory 1とした。
今のところ、多少もっさりだが共存出来ているよう at2008.10.04
Xのアンインストール
http://singlese.blog.shinobi.jp/Entry/65/
上記2つの理由からGUI環境をアンインストールすることにした。
インストール済みパッケージリストの取得
#dpkg -l > pkg.list
リストを眺めてXに関係ありそうなもの(何てアバウトなw)を削除
apt-get remove icewm
apt-get remove apt-spy
apt-get remove icewm-common
apt-get remove kdm
apt-get remove w3m
apt-get remove x-window-system
apt-get remove x-window-system-core
apt-get remove x11-common
apt-get remove vnc-common
ランレベルの設定
vi /etc/inittab
id:2:initdefault:
に変更
2008年9月26日金曜日
費用対効果
ふと
・公開するならずっとマシンの電源入れっぱなしにしなきゃいけないんだよな・・・
・電気代どれくらいかかるんかな
・ってか今でも結構切り詰めてるのに、コンスタントに出て行く金はなるべく抑えないとと決めたばかりじゃないか!w
・どれどれ、調べてみるか
という流れで自宅サーバーを公開する場合の電気代を調べてみたのですが
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=19789&forum=3&16
結構するもんですねぃ・・・
ちょっと家計にやさしくないので、自宅WEBサーバーは諦めモードですorz
これじゃあ安価な共用のレンタルサーバー借りたほうが安い・・・
��仕事の予習や環境構築の練習、自分専用のWEBアプリは作るかもしれないけど)
2008年9月24日水曜日
webmin導入
まずはダウンロード
wget http://prdownloads.sourceforge.net/webadmin/webmin_1.430_all.deb
次にdebファイルのインストール
dpkg -i webmin_1.430_all.deb
ライブラリ不足のため、エラーが出る。
apt-get -f install
再度インストールを試みるも途中でハングアップしてしまった。
スペック不足か・・・
と思いきや
SWAP設定をしたらなんとかインストール出来た。
で次はポートの開放
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT
設定保存
/etc/init.d/iptables save
再起動
service iptables restart
※ソースからインストールする場合
・必要なパッケージのインストール
apt-get install perl libnet-ssleay-perl openssl libauthen-pam-perl libpam-runtime libio-pty-perl libmd5-perl
・ソースダウンロード
http://jp.webmin.com/download
ここから最新版をダウンロード
・解凍とセットアップ
tar zxvf webmin-*
cd webmin-*
./setup.sh
[php] file_get_contentsでのUA詐称
php.ini の user_agent を設定することで file_get_contents などのアクセス時のUserAgentを変更できるようですね。
��デフォルトは PHP という文字列とバージョンがUserAgentとして設定されています)
次のように ini_set 関数でも設定が可能のようです。
ini_set('user_agent', 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)');
2008年9月19日金曜日
atコマンド
処理結果はメールで届く。
5分後にシェルスクリプトを実行
$ at -f test.sh now + 5minute
03:50にシェルスクリプトを実行
$ at -f test.sh 03:50
1分後にコマンドを実行。コマンドは直接入力する。
$ at now + 1minute
warning: commands will be executed using (in order) a) $SHELL b) login shell c)
/bin/sh
at> echo 'hello'
at> date
at> <EOT>
job 7 at 2003-10-29 13:11
2分後にperlスクリプトを実行
$ echo './test.pl' | at now + 2minute
キューに入っているジョブの表示
$ atq
6 2003-09-11 04:10 a foobar
未実行のジョブを消す。
$ atq
6 2003-09-11 04:10 a foobar
$ atrm 6
$ atq
$
http://discypus.jp/wiki/?Linux%2Fat%A5%B3%A5%DE%A5%F3%A5%C9
2008年9月18日木曜日
2008年9月17日水曜日
[PHP] phpをコマンドラインから使う
処理バッチとしては使った事があったけど、Cやperlみたく標準入力から対話型のプログラムも作れるみたい
http://www.spencernetwork.org/memo/tips-6.php
2008年9月11日木曜日
mb_send_mailのCC、BCC設定
$header .= "
From: 送信元
Cc: CCのメールアドレス
Bcc: BCCのメールアドレス
";
/* メール送信 */
mb_send_mail($email, $subject, $body, "$header");
http://lab.z-nix.jp/2005/12/mb_send_mail_ccbcc.html
2008年9月7日日曜日
PHPインストール
最新版の5.2.6をオフィシャルからダウンロードして展開
展開したフォルダにcdして
'./configure' '--prefix=/usr/local/php5' '--enable-pic' '--disable-rpath' '--enable-inline-optimization' '--with-bz2' '--with-curl' '--with-gd' '--enable-gd-native-ttf' '--with-gdbm' '--with-gettext' '--with-ncurses' '--with-gmp' '--with-iconv' '--with-openssl' '--with-png' '--with-jpeg' '--with-regex=system' '--with-xml' '--with-xsl' '--with-xmlrpc=shared' '--with-pcre' '--with-zlib' '--with-layout=GNU' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-safe-mode' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-wddx' '--with-pear=/usr/share/pear' '--with-mysqli=/usr/local/mysql/bin/mysql_config' '--with-mysql=/usr/local/mysql' '--enable-soap' '--enable-spl' '--enable-memory-limit' '--enable-shmop' '--enable-calendar' '--enable-dbx' '--enable-dio' '--enable-mcal' '--enable-mbstring' '--enable-discard-path' '--with-ttf' '--enable-xslt' '--enable-zend-multibyte' '--with-apxs2=/usr/local/apache2/bin/apxs' '--with-libjpeg-dir=/usr' '--enable-so' '--enable-gd-imgstrttf' '--with-jpeg-dir=usr/lib' '--with-freetype-dir=/usr'
いつもながら長っ!w
libxml2が無いよーと怒られるので
apt-get install libxml2-dev
opensslが無いよーと若干本気で切れられるので
apt-get install libssl-dev
bzip2が無いよーと半ば投げやりに呆れられるので
apt-get install libbz2-dev
ここからMDB関連のエラーでにっちもさっちもいかん状態に:;
↓に解決法があります。
libjpeg libpng libfreetype6 libgmp3 libxslt1
それぞれのdevを求められるので、これもaptでインストールしておく
で
make
rootにsuして
make install
↓DBA(QDBM)エラーの解決法
やっと対応策が判明したので追記
configure: error: DBA: Could not find necessary header file(s).
このエラーでコンパイル停止してしまう。
原因?と思われるものが書いてあるページ(英語)
http://bugs.php.net/bug.php?id=31585&edit=1
どうもQDBMのエラーと思っていたがGDBMのdevelが無いのが原因らしい
��色々試した結果)
やった事
- qdbm関連モジュールのインストール
apt-cache search qdbm
で出てきたパッケージを片っ端からインストール - Tru64関連モジュールのインストール
apt-cache search Tru64
で出てきたパッケージを片っ端からインストール - GDBM関連モジュールのインストール
apt-cache search gdbm
で出てきたパッケージを片っ端からインストール
結局以上の事をしたが、おそらく必要だったのは以下のパッケージ
libgdbm-dev
tdb-dev
debianだからだろうか・・・
こんなエラー実務では見たことなかった。
ってかこれだけエラー内容が不明瞭でわかりずりーっつーの
09/04/26現在最新の5.2.9のコンパイルオプションは以下
'./configure' '--prefix=/usr/local/php5' '--with-pic' '--disable-rpath' '--enable-inline-optimization' '--with-bz2' '--with-curl' '--with-gd' '--enable-gd-native-ttf' '--with-gdbm' '--with-gettext' '--with-ncurses' '--with-gmp' '--with-iconv' '--with-openssl' '--with-png-dir=/usr/lib' '--with-regex=system' '--with-xml-dir=/usr' '--with-xsl' '--with-xmlrpc=shared' '--with-zlib' '--with-layout=GNU' '--enable-bcmath' '--enable-exif' '--enable-ftp' '--enable-safe-mode' '--enable-sockets' '--enable-sysvsem' '--enable-sysvshm' '--enable-wddx' '--with-pear=/usr/share/pear' '--with-mysqli=/usr/local/mysql/bin/mysql_config' '--with-mysql=/usr/local/mysql' '--enable-soap' '--enable-spl' '--enable-shmop' '--enable-calendar' '--enable-mbstring' '--enable-discard-path' '--with-ttf' ' '--enable-zend-multibyte' '--with-apxs2=/usr/local/apache2/bin/apxs' '--enable-gd-native-ttf '--with-jpeg-dir=usr/lib' '--with-freetype-dir=/usr' '--with-pgsql=/usr/local/pgsql'
postgresをPHPから操作する場合は
/etc/ld.so.conf
に
/usr/local/pgsql/lib
を追記しておく。
※これをやっていないとapacheの起動でコケる
WEB鯖を立ち上げる時のインストールの順番は以下
・Apache
・(qmail)
・MySQL or Postgres
・PHP
2008年9月1日月曜日
vistaからsambaにアクセスできなくなる
セキュリティなどの設定をしていたら急にsambaにつながらなくなった。
色々ぐぐってみると、ローカルセキュリティポリシーの設定が必要とか出てきたが
そもそもクライアントの設定は変更してないのに、クライアントの設定を変更してもしゃーない気がして
とりあえずsambaをapt-get install sambaでアップデート
最新版は3.2.3らしいのだが、リポジトリが指したバージョンは3.0.24
まぁとりあえず入れてみるかとインストールしてみるとあっけなくアクセス成功
ぐぐった情報は1年前の記事や結構新しめの情報だったのだが、samba自体のアップデートが結構頻繁に行われているようで、時期によってはWEB上に信用できる情報が無い状態があるそうな。。
困られた方はとりあえず対象のプログラムをアップデートをお勧めします。
DDNS
http://www.stackasterisk.jp/tech/systemManagement/ddns01_01.jsp
外部から自宅サーバーへのアクセスができることが判明したので、変動するIPにドメインを割り振るため上記のサイトを参考にDDNSの設定を行う。
まだ導入は出来てないけど、あと少しで念願の自前のWEBサーバ公開だv
(その前にPHP位はインストールせんとねw)
後懸念材料としてsambaを導入して、そこまで見ない重要でない動画や画像ファイルを一気に移動したもんだからサーバーの容量をすでに1/4程占めてしまったw
2008年8月31日日曜日
2008年8月29日金曜日
2008年8月28日木曜日
スタティックIPアドレス設定
この記事を参考にしてルータの設定をし、反映する前にサーバー側の設定。
/etc/network/interfaceを下記の様に変更
��ルータIP:192.168.1.1)
auto eth0 ←これが無いとネットワークにすらつながらなくなります。
iface eth0 inet static
address 192.168.1.90
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.1
終わったらネットワーク再起動
/etc/init.d/networking restart
これでおk
apacheインストール
・samba導入してファイルサーバーとして
・LAMPPを導入してWEBサーバーとして(仕事でも役立てるかなと)
��つ思いついた
sambaの方は案外簡単に導入することができたので
LAMPPの方をやってみよう(スペック不足になりそうだがw)と言う事に
で、apacheの安定版の2.0.63のソースを取得し
./configure --prefix=/usr/local/apache2 --enable-so --enable-rewrite
でコンパイルしようとするとエラー
checking for C compiler default output file name... configure: error: C compiler cannot create executables
See `config.log' for more details.
configure failed for srclib/apr
むむむ、C、C++関連は入っているのだが・・・
と思ったらaptのリポジトリの設定が古いサイトだったらしくgccの最新版がダウソ出来なかったせいらしいorz
��これに一時間かけたよw)
前日記の設定を見直して
apt-get install gcc
でとりあえずコンパイルは通った
aptリポジトリ設定
aptの成功率?が悪いので良いリポジトリサイトが乗っているページをぐぐってみた。
結果/etc/apt/source.listは下記に決定
deb-src http://http.us.debian.org/debian testing main contrib non-free
deb-src http://http.us.debian.org/debian unstable main contrib non-free
deb ftp://ftp.dti.ad.jp/pub/Linux/debian/ stable main contrib non-free
deb-src ftp://ftp.dti.ad.jp/pub/Linux/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main contrib non-free適切なリポジトリを設定してくれるapt-spyなるものがあるらしいので、これもインストールapt-spyは失敗したときにsource.listを真っ白にしてくれるという凄技をもっていたので
#apt-get install apt-spy
使い方は下記
#apt-spy -d stable -s JP
お払い箱決定w
2008年8月27日水曜日
KDE構築
# yum groupinstall "KDE (K Desktop Environment)"
# yum install kde-i18n-Japanese
シェルの確認、変更
- 利用できるシェルの確認
$cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/ash
/bin/bsh
/bin/ksh
/usr/bin/ksh
/usr/bin/pdksh
/bin/tcsh
/bin/csh
- ログインシェルを変える (例 ここではtcshに設定
$chsh
hoge のシェルを変更します。
Password:
新しいシェル [/bin/bash]: /bin/tcsh
シェルを変更しました。
- 表示行数や桁数を変更
現在の設定を表示
$echo $LINES,$COLUMNS
24,80
行数、桁数を変更
$export LINES=30
$export COLUMNS=100
確認してみる
$echo $LINES,$COLUMNS
30,100
- シェル変数の一覧表示
$set
- 環境変数の一覧表示
$env
- コマンド履歴の表示
$history
- リソース制限の表示
$ulimit -a
- 現在、起動しているプログラムの表示
#ps ax
- システムの負荷を表示
$top
終了するにはCtrlとc を押す。
2008年8月26日火曜日
ランレベルの設定、変更
いっつも忘れてググル羽目になるのでメモ
/etc/inittab
id:3:initdefault:
の数値を変える事で変更可能
0 システム停止(予約)
1 シングルユーザーモード
2 テキストログイン・NFSなし
3 テキストログイン
4 未定義(一部のバージョンでインストーラが使用)
5 X Window System の起動
6 システム再起動(予約)
一時的に変更する場合
telinit 5
ランレベルの確認
/sbin/runlevel
debian ファイアウォール設定
iptables
以下rootにsuしてから行う
# iptables -P INPUT ACCEPT
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
FORWARD以外まずはACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT //http
# iptables -A INPUT -p tcp --dport 443 -j ACCEPT //https
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT //FTP
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT //POP
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT //SMTP
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT //SSH
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 5901 -j ACCEPT //VNCSERVER
sambaポートの開放
# iptables -A INPUT -i eth0 -s 192.168.24.0/24 -d 192.168.24.0/24 -p udp --dport 137:138 -j ACCEPT
# iptables -A INPUT -i eth0 -s 192.168.24.0/24 -d 192.168.24.0/24 -p tcp --dport 139 -j ACCEPT
最後にINPUTポリシーをDROP
# iptables -P INPUT DROP
# vi /etc/init.d/iptables
下記内容を記述
#!/bin/bash
start(){
iptables -F
iptables-restore < /etc/iptables.save
return 0
}
stop(){
iptables-save > /etc/iptables.save
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
save)
stop
;;
restore)
start
;;
restart)
stop
start
;;
esac
その後
# chmod 755 /etc/init.d/iptables
# update-rc.d iptables defaults 18
# /etc/init.d/iptables save
これでファイアウォールの設定は完了
2008年8月25日月曜日
2008年8月22日金曜日
qmail + vpopmail + tcpserver
phpからのメール送信(mail,mb_send_mail)がうまくいかない
/var/log/mallogを見ると実行ユーザーでの認証が掛かってて、存在しないユーザーだから送信を拒否されてるみたい。
以前はこんなの気にした覚えなかったんだけどなぁ
vpopのせいかしら・・・
2008年8月19日火曜日
Linuxコマンド
自分用メモ
cd
カレントディレクトリを移動する
windowsのcdと同じですね。
用法
$cd フォルダパス(フルでも相対でも可)
pwd
カレントディレクトリを表示する。
実は役に立つコマンドだったり・・
用法
$pwd
->カレントディレクトリのフルパスを出力
cp
ファイルやディレクトリをコピーする。
これは慣れてない人だとGUIに軍配があがりますかね・・・
用法
$cp コピー元ファイルパス コピー先ファイルパス
オプション
-rf ディレクトリの構造そのまま丸ごとコピー
ps
稼動プロセスの一覧を表示
windowsでいうタスクマネージャーみたいなもの
用法
$ps ← ユーザーが実行したフォワードプロセスを表示
$ps aux | grep apache ← 全ユーザーのプロセスの中から'apache'という文字が入ったものを表示
オプション
色々あるのでman psで調べるべし
とりあえずaux覚えておけば問題ない
man
マニュアルを参照する。
割と便利です。新たなコマンドをインストールしたら一度は目を通しましょう。
用法
$man コマンド名
※対応してないコマンドもあるので、そのときは[cmd]--helpなどで調べましょう。
mv
ファイルやフォルダを移動、リネームする。
用法
$mv リネーム対象ファイルパス リネーム後ファイルパス
rm
ファイルやフォルダを削除する
用法
$rm 削除対象ファイルパス
オプション
-rf ディレクトリ内すべてのファイルを削除する。
rootでrmを使うときは注意しましょう。
rm -rf / とかやっちまったら目もあてられまへん
cat
ファイルの中身を出力する。
用法
$cat ファイルパス
私はもっぱらパイプ処理専用です。
grep
ファイルからパターンマッチした行を表示する
用法
$grep パターン ファイルパス
これももっぱらパイプ処理専用。
psやcatと共に使うとgood
less
ファイルビューワー
用法
$less ファイルパス
ファイルの中身を見ます。当然ですがバイナリは化け化けです。
とりあえず良く使われるコマンドは以上(もっとあるようでしたら追加します)
array_merge
array_merge
説明
array_merge() は、前の配列の後ろに配列を追加することにより、ひとつまたは複数の配列の要素をマージし、得られた配列を返します。
入力配列が同じキー文字列を有していた場合、そのキーに関する後に指定された値が、前の値を上書きします。しかし、配列が同じ添字番号を有していても 値は追記されるため、このようなことは起きません。
配列が一つだけ指定され、その配列が数字で添字指定されていた場合、 キーの添字が連続となるように振り直されます。
例 1. array_merge() の例
上の例の出力は以下となります。
|
例 2. 簡単な array_merge() の例
数値添字が振りなおされることに注意!
配列を完全に維持し、単に追加だけしたい場合には、+ 演算子を使用してください:
数値添字は維持され、関連が保持されます。
|
警告 | |||
array_merge() の動作は PHP 5 で変更されました。PHP 4 とは異なり、 array_merge() は、array 型のパラメータのみを受け取るようになりました。しかし、 他の型をマージするために型キャストを使用することも可能です。詳細は以下の例を参照してください。
|
2008年8月12日火曜日
携帯 入力ヘルパー
input要素の属性で文字入力モードを指定する場合、htmlだと
i-modeとez-web
istyle=1 (全角かな)
istyle=2 (半角カナ)
istyle=3 (英字/半角文字)
istyle=4 (数字/半角文字)
softbank
mode="hiragana" (全角かな)
mode="katakana" (半角カナ)
mode="alphabet" (英字/半角文字)
mode="numeric" (数字/半角文字)
で良かったのですが、xhtmlではこれが機能しません。
そこで登場するのが-wap-input-formatです。
i-modeとsoftbank
style="-wap-input-format:'*
→エスケープすると style="-wap-input-format:"*<ja:h>""
style="-wap-input-format:'*
→エスケープすると style="-wap-input-format:"*<ja:hk>""
style="-wap-input-format:'*
→エスケープすると style="-wap-input-format:"*<ja:en>""
style="-wap-input-format:'*
→エスケープすると style="-wap-input-format:"*<ja:n>""
ez-web
style="-wap-input-format:*M;"(全角かな)
style="-wap-input-format:*m;"(英字/半角文字)
style="-wap-input-format:*N;"(数字/半角文字)
という具合になります。
これを3キャリア共通にするためには;;で区切ってひとつながりに書くと大丈夫のようです。
style="-wap-input-format:"*<ja:h>";-wap-input-format:*M;"(全角かな)
style="-wap-input-format:"*<ja:hk>";-wap-input-format:*M;"(半角カナ)(ez-webは半角カナはなし)
style="-wap-input-format:"*<ja:en>";-wap-input-format:*m;"(英字/半角文字)
style="-wap-input-format:"*<ja:n>";-wap-input-format:*N;"(数字/半角文字)
2008年8月11日月曜日
携帯UA まとめ
- パソコンのブラウザと同様に、ドコモ、au、ソフトバンクの各携帯電話のブラウザのユーザーエージェントをプログラムで取得することができます。
- ユーザーエージェントを利用して機種判別やキャリア判別を行うことができます。
- ユーザーエージェントには、ドコモなら「DoCoMo」、au・TU-KAなら「UP.Browser」、ソフトバンクなら「J-PHONE」、「Vodafone」、「SoftBank」という文字が含まれてます。
これでキャリア判別を行います。
ただし、Vodafoneの一部の機種に「UP.Browser」という文字がユーザーエージェントの途中に含まれています。
「先頭の文字が何で始まるか」で判別した方が良いと思います。 - ユーザーエージェントには、機種名が含まれています。
- ユーザーエージェントのサンプル
ユーザーエージェントは、機種ごとにたくさんありますが、書き方のパターンは以下のどれかに当てはまります。
詳細は、各キャリア公式サイトを参照。- ドコモの例
- タイプ1(MOVA)
DoCoMo/1.0/N503i/c10
個体識別情報を得た場合は、
DoCoMo/1.0/N503i/c10/ser12345678901 - タイプ2(FOMA)
DoCoMo/2.0 N901iS(c100;TB;W24H12)
個体識別情報を得た場合は、
DoCoMo/2.0 N901iS(c100;TB;W24H12;ser123456789012345;icc12345678901234567890) - /c10や(c100)が付かず、機種名で終わる場合もある。
- 個体識別情報は、個体識別情報を参照。
- タイプ1(MOVA)
- auの例
- 旧タイプ
UP.Browser/3.04-SN12 UP.Link/3.4.4 - 新タイプ
KDDI-HI21 UP.Browser/6.0.2.254 (GUI) MMP/1.1 - auは機種名ではなく、デバイスタイプ(SN12など)で表記されている。
デバイスタイプと製品名の対応表は、キャリアのサイトにある。
- 旧タイプ
- ソフトバンクの例
- SoftBank 4-2 Series(Jフォン時代のもの)
J-PHONE/3.0/J-SH07 - SoftBank 6-5 Series(Jフォン時代のもの)
J-PHONE/4.0/J-SH51/SN12345678901 SH/0001a Profile/MIDP-1.0 Configuration/CLDC-1.0 - SoftBank 3G Series(ボーダフォン時代のもの)
Vodafone/1.0/V904SH/SHJ001/SN123456789012345 Browser/VF-NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 - SoftBank 3G Series(ソフトバンク時代のもの)
SoftBank/1.0/910T/TJ001/SN123456789012345 Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 - 基本的に、J-PHONE(or Vodafone or SoftBank)/ブラウザバージョン/機種名/その他、になってます。
- SoftBank 4-2 Series(Jフォン時代のもの)
- ドコモの例
- IP帯域
パソコンのブラウザでは、任意のユーザーエージェントに設定できるものがあります。
ユーザーエージェントを携帯電話と同じにして、携帯サイトへアクセスされることも予想されます。
完璧にパソコンからのアクセスを防ぐには、.htaccessなどで携帯電話で使われるIPアドレスの帯域を指定し、パソコンからのアクセスを防ぎます。
各キャリアが使用しているIPの帯域は、公式サイトで公開されています。 - ホスト名
ユーザーエージェントは、偽装できてもリモートのホスト名は、偽装できません。
ユーザーエージェントの他にホスト名も判別に入れれば、より精度が高くなります。- ドコモ
- docomo.ne.jp
- au
- ezweb.ne.jp
- ソフトバンク
- jp-d.ne.jp
jp-h.ne.jp
jp-t.ne.jp
jp-c.ne.jp
jp-k.ne.jp
jp-r.ne.jp
jp-n.ne.jp
jp-s.ne.jp
jp-q.ne.jp - jp-t などは、Jフォン東京などの名残。
- jp-d.ne.jp
- ドコモ
■キャリア判別のサンプルソース
- Perlの場合
#ユーザーエージェントのみで判別する場合
$agent = $ENV{'HTTP_USER_AGENT'};
if($agent =~ /^DoCoMo/){
}elsif($agent =~ /^J-PHONE|^Vodafone|^SoftBank/){
}elsif($agent =~ /^UP.Browser|^KDDI/){
}
#ホスト名も判別する場合
$agent = $ENV{'HTTP_USER_AGENT'};
$host = $ENV{'REMOTE_HOST'};
if($agent =~ /^DoCoMo/ && $host =~ /.+docomo\.ne\.jp$/){
}elsif($agent =~ /^J-PHONE|^Vodafone|^SoftBank/ && $host =~ /.+jp-.\.ne\.jp$/){
}elsif($agent =~ /^UP.Browser|^KDDI/ && $host =~ /.+ezweb\.ne\.jp$/){
} - PHPの場合
$agent = $_SERVER['HTTP_USER_AGENT'];
if(ereg("^DoCoMo", $agent)){
}else if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){
}else if(ereg("^UP.Browser|^KDDI", $agent)){
} - Javaの場合
String agent = request.getHeader("user-agent");
if(agent.indexOf("DoCoMo") == 0){
}else if(agent.indexOf("J-PHONE") == 0 || agent.indexOf("Vodafone") == 0 || agent.indexOf("SoftBank") == 0){
}else if(agent.indexOf("UP.Browser") == 0 || agent.indexOf("KDDI") == 0){
}
■機種判別のサンプルソース(機種名を取得する)
- Perlの場合
- ドコモ
$agent = $ENV{'HTTP_USER_AGENT'};
if(index($agent, "DoCoMo/1.0") >= 0 && index($agent, "/", 11) >= 0){
$device = substr($agent, 11, (index($agent, "/", 11) - 11));
}elsif(index($agent, "DoCoMo/2.0") >= 0 && index($agent, "(", 11) >= 0){
$device = substr($agent, 11, (index($agent, "(", 11) - 11));
}else{
$device = substr($agent, 11);
} - au(エージェントは、2タイプとも取得できる)
$agent = $ENV{'HTTP_USER_AGENT'};
$device = substr($agent, (index($agent, "-") + 1), (index($agent, " ") - index($agent, "-") - 1)); - ソフトバンク(x-jphone-msnameで機種名だけ取得できる)
$device = $ENV{'HTTP_X_JPHONE_MSNAME'};
- ドコモ
- PHPの場合
- ドコモ
$agent = $_SERVER{'HTTP_USER_AGENT'};
if(strpos($agent, "DoCoMo/1.0") >= 0 && strpos($agent, "/", 11) >= 0){
$device = substr($agent, 11, (strpos($agent, "/", 11) - 11));
}elsif(strpos($agent, "DoCoMo/2.0") >= 0 && strpos($agent, "(", 11) >= 0){
$device = substr($agent, 11, (strpos($agent, "(", 11) - 11));
}else{
$device = substr($agent, 11);
} - au(エージェントは、2タイプとも取得できる)
$agent = $_SERVER{'HTTP_USER_AGENT'};
$device = substr($agent, (strpos($agent, "-") + 1), (strpos($agent, " ") - strpos($agent, "-") - 1)); - ソフトバンク(x-jphone-msnameで機種名だけ取得できる)
$device = $_SERVER{'HTTP_X_JPHONE_MSNAME'};
- ドコモ
- Javaの場合
- ドコモ
String agent = request.getHeader("user-agent");
String device = "";
if(agent.indexOf("DoCoMo/1.0") >= 0 && agent.indexOf("/", 11) >= 0){
device = agent.substring(11, agent.indexOf("/", 11));
}else if(agent.indexOf("DoCoMo/2.0") >= 0 && agent.indexOf("(", 11) >= 0){
device = agent.substring(11, agent.indexOf("(", 11));
}else{
device = agent.substring(11);
} - au(エージェントは、2タイプとも取得できる)
String agent = request.getHeader("user-agent");
String device = agent.substring(agent.indexOf("-") + 1, agent.indexOf(" ")); - ソフトバンク(x-jphone-msnameで機種名だけ取得できる)
String device = request.getHeader("x-jphone-msname");
- ドコモ
携帯UA 振り分け
MOVA ブラウザフォン
DoCoMo/1.0で始まる。
DoCoMo/1.0/N505iS/c20/TB/W20H10
FOMA (XHTML)
DoCoMo/2.0で始まる。
DoCoMo/2.0 F901iC(c100;TB;W23H12)
SoftBank
1G, 2G
J-PHONEで始まる。
J-PHONE/5.0/V801SH/SN000000000 SH/0005aa Profile
/MIDP-1.0 Configuration/CLDC-1.0 Ext-Profile/JSCL-1.1.0
3G (XHTML)
MOT-C980かMOT-V980で始まる。
MOT-C980/80.2F.2E. MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1
MOT-V980/80.2F.2E. MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1
3G (XHTML)
Vodafoneで始まるが、AUと同じUP.Browserが含まれる場合がある。
Vodafone/1.0/V802SH/SHJ000 Browser/UP.Browser/7.0.2.1 Profile
/MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Profile/JSCL-1.2.2
3G (XHTML)
SoftBankで始まる。
SoftBank/1.0/910T/TJ001/SN Browser/NetFront/3.3 Profile
/MIDP-2.0 Configuration/CLDC-1.1
AU
WAP1 (HDML)
UP.Browserが含まれる。
UP.Browser/3.04-CA14 UP.Link/3.4.5.8
SIE-M65/12 UP.Browser/7.0.0.1.c.3 (GUI) MMP/2.0 Profile
/MIDP-2.0 Configuration/CLDC-1.1
WAP2 (XHTML)
KDDI-で始まる。
KDDI-CA23 UP.Browser/5.2.0.1.126 (GUI) MMP/2.0
WILLCOM
EDGE LINK
PDXGWで始まる。
PDXGW/1.0 (TX=8;TY=7;GX=96;GY=84;C=C256;G=BF;GI=2)
Air EDGE PHONE
DDIPOCKETが含まれる。
Mozilla/3.0 (DDIPOCKET;KYOCERA/AH-K3001V/1.5.2.8.000/0.1
/C100) Opera 7.0
Mozilla/3.0 (DDIPOCKET;JRC/AH-J3001V,AH-J3002V/1.0/0100
/c50) CNF/2.0
WILLCOM
WILLCOMが含まれる。
Mozilla/3.0(WILLCOM;SANYO/WX310SA/2;1/1/C128) NetFront/3.3
Mozilla/3.0(WILLCOM;KYOCERA/WX300K/1;1.0.2.8.000000/0.1/C100) Opera/7.0
携帯UAの固体識別番号
// MOVA
DoCoMo/1.0/X503i/c10/ser12345678901
serの後に11桁英数字
// FOMA
DoCoMo/2.0 N2001(c10;ser12345678901;
icc12345678901234567890)
serの後に15桁英数字
iccの後に20桁英数字
改行が含まれます。
PLAIN TEXTPHP: // ser以降で判別$agent = $_SERVER['HTTP_USER_AGENT'];$hasSubno = preg_match('/ser[0-9A-Za-z]{11,15}/', $agent);
SoftBank
// Vodafone
Vodafone/1.0/V802SH/SHJ002/SN123456789012345 Browser/UP.Browser/7.0.2.1 Profile/
MIDP-2.0 Configuration/CLDC-1.1 Ext-J-Pr
// SoftBank
SoftBank/1.0/705P/PJP10/SN123456789012345 Browser/Teleca-Browser/3.1 Profile/
MIDP-2.0 Configuration/CLDC-1.1
いずれも/SNの後に15桁英数字
PLAIN TEXTPHP: // /SN以降で判別$agent = $_SERVER['HTTP_USER_AGENT'];$hasSubno = preg_match('/\/SN[0-9A-Za-z]{15}/', $agent);
AU
AUの場合だけ先にユーザーエージェントに番号を付けます。
PLAIN TEXTPHP: // 05051234567890_ae.ezweb.ne.jp// 4桁地域コードと10桁端末コード$subno = $_SERVER['HTTP_X_UP_SUBNO'];// KDDI-CA23 UP.Browser/5.1 (GUI) MMP/2.0/SUB05051234567890_ae$_SERVER['HTTP_USER_AGENT'] .= '/SUB'.substr($subno, 0, -12);
PLAIN TEXTPHP: // 連結した末尾で判別$agent = $_SERVER['HTTP_USER_AGENT'];$hasSubno = preg_match('/\/SUB0\d0\d\d{10}_[a-z\d]{2}$/', $agent);