2008年8月28日木曜日

スタティックIPアドレス設定

サーバーのプライベートIPアドレスがDHCPになっていたため静的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

linux用アンチウイルスソフト

http://www.clamav.net/download/sources

自宅鯖には無理かな・・・

NTT加入者網終端装置(CTU)詳細設定例

http://sakaguch.com/SetCTUsyousai.html

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-get install apt-spy



使い方は下記

#apt-spy -d stable -s JP



apt-spyは失敗したときにsource.listを真っ白にしてくれるという凄技をもっていたので

お払い箱決定w


2008年8月27日水曜日

apache + ssl 起動時パスワードの解除

http://vine.1-max.net/apache-ssl.html

.htaccessによるhttpアクセスをhttpsにリダイレクト

RewriteRule ^[公開フォルダまでのフルパス](.*)$ https://%{HTTP_HOST}/$1

KDE構築

 KDEのパッケージグループの他にKDE日本語化パッケージ(kde-i18n-Japanese)もインストールします。



# 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



これでファイアウォールの設定は完了



/etc/hosts.allow

ALL: 127.0.0.1

sshd: 192.168.1.

を追記

SSHはネットワーク内からのみアクセス可能に設定

2008年8月22日金曜日

pearコマンド プロキシ経由の使い方

pear config-set http_proxy YOUR_PROXY

qmail + vpopmail + tcpserver

この組み合わせでメールサーバーを構築したんだけど

phpからのメール送信(mail,mb_send_mail)がうまくいかない

/var/log/mallogを見ると実行ユーザーでの認証が掛かってて、存在しないユーザーだから送信を拒否されてるみたい。

以前はこんなの気にした覚えなかったんだけどなぁ

vpopのせいかしら・・・

2008年8月19日火曜日

Linuxコマンド

サーバー構築をGUIでする機会も増え、あまりCUIの恩恵を感じられなくなったので

自分用メモ



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 ディレクトリ内すべてのファイルを削除する。

rootrmを使うとき注意しましょう。

rm -rf / とかやっちまったら目もあてられまへん





cat



ファイルの中身を出力する。



用法

$cat ファイルパス



私はもっぱらパイプ処理専用です。



grep



ファイルからパターンマッチした行を表示する



用法

$grep パターン ファイルパス

これももっぱらパイプ処理専用。

psやcatと共に使うとgood



less



ファイルビューワー



用法

$less ファイルパス

ファイルの中身を見ます。当然ですがバイナリは化け化けです。



とりあえず良く使われるコマンドは以上(もっとあるようでしたら追加します)

array_merge

配列の結合に使われる

array_merge







(PHP 4, PHP 5)


array_merge -- ひとつまたは複数の配列をマージする




説明


array array_merge ( array array1 [, array array2 [, array ...]] )

array_merge() は、前の配列の後ろに配列を追加することにより、ひとつまたは複数の配列の要素をマージし、得られた配列を返します。


入力配列が同じキー文字列を有していた場合、そのキーに関する後に指定された値が、前の値を上書きします。しかし、配列が同じ添字番号を有していても 値は追記されるため、このようなことは起きません。


配列が一つだけ指定され、その配列が数字で添字指定されていた場合、 キーの添字が連続となるように振り直されます。


 











例 1. array_merge() の例








<?php

$array1 
= array("color" => "red"24);

$array2 = array("a""b""color" => "green""shape" => "trapezoid"4);

$result array_merge($array1$array2);

print_r($result);

?>

上の例の出力は以下となります。








Array

(

    [color] => green

    [0] => 2

    [1] => 4

    [2] => a

    [3] => b

    [shape] => trapezoid

    [4] => 4

)



 











例 2. 簡単な array_merge() の例








<?php

$array1 
= array();

$array2 = array(=> "data");

$result array_merge($array1$array2);

?>

数値添字が振りなおされることに注意!








Array

(

    [0] => data

)

配列を完全に維持し、単に追加だけしたい場合には、+ 演算子を使用してください:








<?php

$array1 
= array();

$array2 = array(=> "data");

$result $array1 $array2;

?>

数値添字は維持され、関連が保持されます。








Array

(

    [1] => data

)













警告

array_merge() の動作は PHP 5 で変更されました。PHP 4 とは異なり、 array_merge() は、array 型のパラメータのみを受け取るようになりました。しかし、 他の型をマージするために型キャストを使用することも可能です。詳細は以下の例を参照してください。


 











例 3. array_merge() PHP 5 の例








<?php

$beginning 
'foo';

$end = array(=> 'bar');

$result array_merge((array)$beginning, (array)$end);

print_r($result);

?>

上の例の出力は以下となります。








Array

(

    [0] => foo

    [1] => bar

)







2008年8月12日火曜日

携帯 入力ヘルパー

携帯サイトでフォーム入力をする際、入力モードが自動的に変わるのはPCサイト以上に大切だと思っています。

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;"(数字/半角文字)

smarty プラグイン作成法

http://www.y2sunlight.com/ground/?PHP5.0%2F8.Smarty%A4%F2%CD%FD%B2%F2%A4%B9%A4%EB

2008年8月11日月曜日

携帯UA まとめ

携帯ブラウザのユーザーエージェント

  1. パソコンのブラウザと同様に、ドコモ、au、ソフトバンクの各携帯電話のブラウザのユーザーエージェントをプログラムで取得することができます。

  2. ユーザーエージェントを利用して機種判別やキャリア判別を行うことができます。

  3. ユーザーエージェントには、ドコモなら「DoCoMo」、au・TU-KAなら「UP.Browser」、ソフトバンクなら「J-PHONE」、「Vodafone」、「SoftBank」という文字が含まれてます。

    これでキャリア判別を行います。

    ただし、Vodafoneの一部の機種に「UP.Browser」という文字がユーザーエージェントの途中に含まれています。

    「先頭の文字が何で始まるか」で判別した方が良いと思います。

  4. ユーザーエージェントには、機種名が含まれています。

  5. ユーザーエージェントのサンプル

    ユーザーエージェントは、機種ごとにたくさんありますが、書き方のパターンは以下のどれかに当てはまります。

    詳細は、各キャリア公式サイトを参照。

    • ドコモの例

      • タイプ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)が付かず、機種名で終わる場合もある。

      • 個体識別情報は、個体識別情報を参照。



    • 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)/ブラウザバージョン/機種名/その他、になってます。





  6. IP帯域

    パソコンのブラウザでは、任意のユーザーエージェントに設定できるものがあります。

    ユーザーエージェントを携帯電話と同じにして、携帯サイトへアクセスされることも予想されます。

    完璧にパソコンからのアクセスを防ぐには、.htaccessなどで携帯電話で使われるIPアドレスの帯域を指定し、パソコンからのアクセスを防ぎます。

    各キャリアが使用しているIPの帯域は、公式サイトで公開されています。

  7. ホスト名

    ユーザーエージェントは、偽装できてもリモートのホスト名は、偽装できません。

    ユーザーエージェントの他にホスト名も判別に入れれば、より精度が高くなります。

    • ドコモ

      • 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フォン東京などの名残。






キャリア判別のサンプルソース

  • 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 振り分け

NTT DoCoMo
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の固体識別番号

oCoMo
// 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);