ホーム > タグ > tips

tips

Linux(Ubuntu Server 8.10) でファイルを探す(例えば php.ini)

Linux で(この場合は Ubuntu Server version 8.10)ファイル名からファイルを探す場合。

先にファイル一覧のデータベースを更新しておく

$ sudo updatedb

locate を使って、ファイルを探す(例として、この場合は php.ini)

$ locate php.ini
/etc/php5/apache2/php.ini
/etc/php5/cli/php.ini
/usr/share/doc/php5-common/examples/php.ini-dist
/usr/share/doc/php5-common/examples/php.ini-paranoid
/usr/share/doc/php5-common/examples/php.ini-recommended
/usr/share/php5/php.ini-dist
/usr/share/php5/php.ini-dist.cli

これのおかげで php.ini が php5/apache2 配下と、php5/cli 配下の二箇所にあることがわかったけど、詳しいことはよく分からない。いまんところ。
(なんで二つあるのか、違いはあるのか、対象が違うのか、内容は違うのか、違うんだったらどこが違うのか等)

モバイルサイト制作にあたってのphp.iniの設定

ローカルでの、自分で php.ini を編集できる環境ではいいけれど、レンタルサーバではそれが出来ないので、以下のように .htaccess を使って、モバイルサイトを制作するにあたっての各項目の設定を変更する。

.htaccessで設定した項目

(これは php4 の場合。5の場合は mod_php5.c とすればいい)

<IfModule mod_php4.c>

# セッションIDを保存するのにCookieを使用するかどうか
# 携帯では基本的にCookieを利用出来ないのでオフに
php_value session.use_cookies 0

# URLにセッションIDを付加するかどうかを指定
# 携帯ではCookieにセッションIDを保存できないので、これはオン
php_value session.use_trans_sid 1

# 内部文字エンコーディングの設定
# 携帯の特殊文字にも対応出来るようにeucJP-winを使用する
php_value mbstring.internal_encoding eucJP-win

# 自動文字エンコーディングの検出の順番を設定
# モバイルサイトは幅広い文字に対応する必要があるので、eucJP-winとSJIS-winを利用する
# そのために検出の順番を明確に定義しておく
php_value mbstring.detect_order SJIS-win,eucJP-win,JIS,UTF-8,ASCII

</IfModule>

以下の5つの項目については、ホスティング先の設定がすでにそうだったので、今回はとくに指定しなかった。(イコールは、あくまでもphp.ini上での表記で、この.htaccessでの設定では使わない)

  • session.use_only_cookie = 0
  • mbstring.language = Japanese
  • mbstring.http_input = pass
  • mbstring.http_output = pass
  • mbstring.encoding_translation = Off

*注意:
mbstring.detect_order のところは、文字コード名を繋ぐカンマの後に半角スペースとか入れてはだめ(エラーになる)

i モードHTMLとiモードXHTMLを切り替える

iモードHTMLとiモードXHTMLを正しく切り替える方法より引用。

『ちなみに、ドコモ向け端末において、XHTMLモード(iモードXHTML)で表示させる場合、
拡張子は「xhtml」でなければならないという解説をしているところもありますが、それは間違いです。
Webサーバーにおいては拡張子はそれほど重要ではなく、
問題はその拡張子がどのようなコンテンツMIMEタイプであり、どんなHTTPヘッダが出力されるか
ということのほうが重要です。

上記例(htaccess)では、「.html」という拡張子においてはHTTPヘッダ
は「application/xhtml+xml」にせよ、という明示なので、この設定がなされていれば、Webサーバーは拡張子htmlで、「application/xhtml+xml」というHTTPヘッダを出力するようになるので、
ドコモの機種はXHTMLモードに切り替わります。』

3キャリア対応のモバイル向けサイトを作るにあたって

自分のような初心者には丁度よくまとまっている blog エントリがあったので、これを元に自分用にさらにまとめ、整理してメモ。

ちょっと詳しいモバイルサイトの作り方
お世話になりました。ありがとうございました。
続きを読む

XHTMLでモバイルサイトを制作する際の注意とtips

とくに、PHP での開発において、ざっとメモ。
PHP×携帯サイト デベロッパーズバイブルを参考に)

1. XML 宣言が必要

<?xml version=”1.0″ encoding=”Shift_JIS” ?>

2. キャリア、端末によって DOCTYPE 宣言を書き換える必要がある

Docomo / iモードXHTML1.0
<!DOCTYPE html PUBLIC “-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN” “i-xhtml_4ja_10.dtd”>

Docomo / iモードXHTML1.1
<!DOCTYPE html PUBLIC “-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN” “i-xhtml_4ja_10.dtd”>

Docomo / iモードXHTML2.0
<!DOCTYPE html PUBLIC “-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.0) 1.0//EN” “i-xhtml_4ja_10.dtd”>

Docomo / iモードXHTML2.1
<!DOCTYPE html PUBLIC “-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.1) 1.0//EN” “i-xhtml_4ja_10.dtd”>

Docomo / iモードXHTML2.2
<!DOCTYPE html PUBLIC “-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.2) 1.0//EN” “i-xhtml_4ja_10.dtd”>

Docomo / iモードXHTML2.3
<!DOCTYPE html PUBLIC “-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.3) 1.0//EN” “i-xhtml_4ja_10.dtd”>

au
<!DOCTYPE html PUBLIC “-//OPENWAVE//DTD XHTML 1.0//EN” “http://www.openwave.com/DTD/xhtml-basic.dtd”>

SoftBank
<!DOCTYPE html PUBLIC “-//JPHONE//DTD XHTML Basic 1.0 plus//EN” “xhtml-basic10-plus.dtd”>

3. Content-Type の書き換えも必要

通常(デフォルト)では、Content-Type は text/html になる。
XHTML を使用する場合はこれを application/xhtml+xml としないといけない。
対応する部分は以下の二箇所。

  • meta タグによる Content-Type の指定
  • HTTP レスポンスの Content-Type フィールドにおける指定

具体的には、

meta タグでは以下を記述

HTTP レスポンスヘッダーに以下のような Content-Type を指定(これは PHP の場合)

header(‘Content-Type: application/xhtml+xml;’);

この PHP の header 関数は、全ての出力の「前」に呼び出される必要がある。

4. mb_output_handler に注意(文字化け)

PHP での開発において mb_output_handler(出力時の文字コードの変換を行ってくれる関数)を使うことが出来ない。
HTTP レスポンスヘッダーの Content-Type に application/xhtml+xml が記述されているときは、この関数は機能しないので使うことが出来ないので注意。(ようするに、XHTML を使おうとするときは、この関数は使えないということ)

5. mb_output_handler を利用せずに文字コード変換

以下のスクリプトを使用して、内部文字コードを出力文字コードに一括変換する。

詳しい実例は初めてのXHTMLによるモバイル向けページの作成を参照。

*この際、mb_output_handler を無効にしておくこと。
(php.ini の mbstring.http_output = pass にしておく)

*プログラム内で一時的に mb_output_handler を無効にするには
ini_set(‘mbstring.http_output’, ‘pass’);

// 出力バッファリングを有効に
ob_start();

// バッファにためた出力データを取得する
$str = ob_get_contents();

// 文字コードを出力文字コードに変換する
$output_str = mb_convert_encoding($str, 'SJIS-win', mb_internal_encoding());

// バッファリングをクリア
ob_end_clean();

// 内容を出力する
echo $output_str;

主要3キャリアにおけるキャリア判別について

主要3キャリアを判別するにあたって、何に注意するべきかのメモ。
PHP×携帯サイト デベロッパーズバイブルを参考に)

docomoのユーザーエージェント

基本的にブラウザのiモード対応HTMLごとにフォーマットが異なる。

詳細は割愛。(詳しくは『デベロッパーズバイブル』参照のこと)

auのキャリア判別法

auはHDMLブラウザとWAP2.0ブラウザの二種類のフォーマット。
「UP.Browser」という文字列が先頭につくかどうか。(auは先頭につく)
※UP.BrowserはSoftBankでも採用されている(SoftBankでは文字列中央部に記述される)

auの機種判別法

auでは機種名を直接取得することができない。デバイスIDを取得することは出来るが、これは機種名とは異なる情報。

ただし、デバイスIDと機種名は一意にひもづけられる情報のため、デバイスIDから実際の機種名を取得することは可能。(この場合は、両者をひもづけるための別のデータが必要)

SoftBankのキャリア判別法

SoftBankはキャリア名が複数混在している。(J-Phone, Vodafone, モトローラ等)

キャリア名はユーザーエージェントの文字列の先頭に必ず来る。

SoftBankとして分類するキャリア名は、J-PHONE, Vodafone, SoftBank。モトローラの場合のみ、キャリア名は表記されずに MOT- という特殊な記述になる。

Disney MobileはSoftBankと同じ扱い。ユーザーエージェントにもSoftBankと記述される。そのため、Disney Mobileのみを判別したい場合は機種名で区別する必要がある。

※SoftBankのエミュレータ(ウェブコンテンツビューア)でアクセスした場合には実機とは異なるキャリア名でアクセスされるので注意。

.htaccessでIPアドレスによるアクセス制限をかける

この記事は
.htaccessでIPアドレスによるアクセス制限をかける
に引っ越しました。

PEAR::Net_UserAgent_Mobileを使ってキャリア判別によるリダイレクト

PEAR::Net_UserAgent_Mobileを使ってキャリア判別によるリダイレクト

http://hogehoge.hoge/m

にアクセスすると、DoCoMo, au, SoftBank 端末とそれ以外を判別して、指定したディレクトリ(ページ)にリダイレクト。

PHP の PEAR パッケージのひとつ「Net_UserAgent_Mobile」を利用する。
続きを読む

.htaccess を使ってアクセス端末ごとにリダイレクト

この記事は
.htaccess を使ってアクセス端末ごとにリダイレクト
に引っ越しました。

PEAR::Net_IPv4を利用したIPアドレスによるキャリア判別

PEARライブラリ「Net_IPv4」を利用して、IPアドレスによるキャリアの判別を行う。

まず、キャリアを判別するスクリプトを用意する。
(PCではいいけれど、モバイルの実機ではこのスクリプトをそのまま実行できないため外部スクリプトとしてincludeして利用する)

主要3キャリアの IP アドレス情報は以下より
キャリアごとのIPアドレス情報

mobile_ip_carrier.php

<?php

// Net_IPv4を読み込む
require_once 'Net/IPv4.php';

// IPアドレスからキャリアを判別する
function mobile_ip_carrier()
{
	// IPを設定する配列を準備する
	$ip_table = array();

	// DoCoMoのIP帯域を配列に格納
	$ip_table['docomo'] = array();
	$ip_table['docomo'][] = '210.153.84.0/24';
	$ip_table['docomo'][] = '210.136.161.0/24';
	$ip_table['docomo'][] = '210.153.86.0/24';
	$ip_table['docomo'][] = '210.153.84.0/24';
	// 以下略

	// auのIP帯域を配列に格納
	$ip_table['au'] = array();
	$ip_table['au'][] = '210.230.128.224/28';
	$ip_table['au'][] = '121.111.227.160/27';
	$ip_table['au'][] = '61.117.1.0/28';
	$ip_table['au'][] = '219.108.158.0/27';
	$ip_table['au'][] = '219.125.146.0/28';
	$ip_table['au'][] = '61.117.2.32/29';
	$ip_table['au'][] = '61.117.2.40/29';
	$ip_table['au'][] = '219.108.158.40/29';
	$ip_table['au'][] = '219.125.148.0/25';
	$ip_table['au'][] = '222.5.63.0/25';
	$ip_table['au'][] = '222.5.63.128/25';
	$ip_table['au'][] = '222.5.62.128/25';
	$ip_table['au'][] = '59.135.38.128/25';
	$ip_table['au'][] = '219.108.157.0/25';
	$ip_table['au'][] = '219.125.145.0/25';
	$ip_table['au'][] = '121.111.231.0/25';
	$ip_table['au'][] = '121.111.227.0/25';
	$ip_table['au'][] = '118.152.214.192/25';
	$ip_table['au'][] = '118.159.131.0/25';
	$ip_table['au'][] = '118.159.133.0/25';

	// SoftBankのIP帯域を配列に格納
	$ip_table['softbank'] = array();
	$ip_table['softbank'][] = '123.108.236.0/24';
	$ip_table['softbank'][] = '123.108.237.0/27';
	$ip_table['softbank'][] = '202.179.204.0/24';
	$ip_table['softbank'][] = '202.253.96.224/27';
	// 以下略

	// IPのキャリアを決定する
	$ip_carrier = '';

	// IPアドレスからキャリアを判断する
	if (empty($ip_carrier)) {
		foreach ($ip_table as $ip_table_carrier => $ip_table_value) {
			foreach ($ip_table_value as $value) {
				$value = trim($value);
				if (strcmp($_SERVER["REMOTE_ADDR"], $value) == 0 || Net_IPv4::ipInNetwork($_SERVER["REMOTE_ADDR"], $value)) {
					$ip_carrier = $ip_table_carrier;
					break 2;
				}
			}
		}
	}

	// 携帯のキャリアIPアドレスでない場合はPCからのアクセスとみなす
	if (empty($ip_carrier)) {
		$ip_carrier = 'pc';
	}

	return $ip_carrier;
}

echo mobile_ip_carrier();
?>

つづいて、携帯の実機でアクセスする(キャリア判別の結果を表示する)ページを作成する。

test.php
先に作成した判別用のスクリプトをrequireでincludeして利用。
判別結果を変数$ip_carrier(外部スクリプト内で設定した)を使用して出力。

<?php

// IPアドレスからキャリアを判別する外部スクリプトを読み込む
require_once 'mobile_ip_carrier.php';

?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset='Shift_JIS'" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="Expires" content="-1" />
<title>キャリア判別</title>
</head>
<body>

<?php echo $ip_carrier ?>

</body>
</html>

ホーム > タグ > tips

検索
フィード

ページの上部に戻る