2011年10月6日木曜日

携帯とPCからアクセスの振り分け方法


振り分け方法:
PC用向けのページにアクセスされた場合に、iPhone(iPod Touch)向けのページへとリダイレクトさせたい場合には、サーバやプログラムでユーザーエージェントを判別して振り分ける方法があります。

PHPでおこなう場合:
		if(strpos($_SERVER['HTTP_USER_AGENT'],"iPhone")){
			$is_iphone=true;
		} elseif(strpos($_SERVER['HTTP_USER_AGENT'],"iPod")){
			$is_ipod=true;
		} elseif(strpos($_SERVER['HTTP_USER_AGENT'],"Android")){
			$is_ipod=true;
		} else {
			$is_pc=true;
		}
 
.htaccessの場合:
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} iPod [OR] 
RewriteCond %{HTTP_USER_AGENT} iPhone [OR] 
RewriteCond %{HTTP_USER_AGENT} UP.Browser
RewriteRule ^$ /iphone.html [R] これらの方法は強制的にiPhone向けのページへとリダイレクトする方法になるので、iPhoneでもPC向けのデザインでサイトをみたいユーザーを考慮したい場合は、別途PC向けのデザインで閲覧できるようにした方が良いでしょう。

 参照:
http://designblog.ecstudio.jp/htmlcss/iphone-master.html
http://xoops.kudok.com/branchoffice/index.php?iPhone%E3%81%A8%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AD%E3%82%A4%E3%83%89%E6%90%BA%E5%B8%AF%E3%81%AB%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%99%E3%82%8B
 
 

2011年10月2日日曜日

iphone 4.1越狱解锁全过程(升基带)

iphone 4.1越狱解锁全过程
softbank的合同到期了,于是昨天去shop里解了约,这回可以放心大胆的对iphone动手了.

越狱解锁前状态:
dev: iphone 3g
OS: iOS 4.1 (8b117)
基带ver: 05.14.00
※了解的人看了以上步骤,估计要皱下眉头,因为这个基带很多工具是无法解锁的,解决办法就是要升基带到06.15.00,再来解锁!

过程概述:
第一步:对原来设备备份(利用itunes)
第二步:定制自己的固件os文件,即ipsw文件(利用PwnageTool)
第三步:导入自做的ipsw文件(利用itunes) ←←←←←←←←←越狱完成
第四步:解锁(利用iphone上的ultrasn0w)

要点介绍:
事前准备:
下载一下工具和文件;
1.PwnageTool 4.1.3 Unlock Edition(Only for Mac)
※因为要升基带,因此要用该版本,4.1.2版本无基带升级选项,无法升基带.
不需要升基带的iphone可以选用4.1.2版本.
2.Download iPad iOS 3.2.2
※用于升基带,该文件中包含06.15.00基带
3.Download iOS 4.2.1 for iPhone 3G/iPhone 3GS

第一步:  
利用ituns的备份功能,将当前设备进行备份;
第二步:
参照一下文章的步骤,定制自己的os. 其实就是把越狱的os文件和基带文件一起重新build一下.
使用PwnageTool 4.1.3进行build的步骤;
使用PwnageTool 4.1.2进行build的步骤(详细);
第三步:
第二步里已经定制好了自己的os,就可以通过DFU模式引导系统来导入这个os了,具体步骤参照上面介绍4.1.2的文章中的Step3 : DFUモード.
如果导入成功,则到此为止越狱成功.

第四步:
因为已经越狱,就可以通过iphone上的Cydia软件来安装解锁工具ultrasn0w并进行解锁,步骤参照下文.
Unlock iPhone 4 iOS 4.1 With Ultrasn0w

最后确认自己的iphone状态:
OS: iOS 4.1 (8b117)
基带ver: 06.15.00
插入其它公司的sim卡,看看是否可以用了,到此应该是可以用了的.

最后:
以上操作后,手机只是出厂初期的陌生的状态,自己以前的电话本等数据都没有.因此需要恢复.
利用itunes的恢复功能,把越狱前的备份恢复回来,你会看到你熟悉的手机又回来了.

2011年9月11日日曜日

directshow開発--问题篇

最近,通过开发一个视频音频实时网络传送(类似视频聊天)的项目,对directshow有了一些了解,遇到以下问题并解决方法.
1.音频采样数据大小的控制
现象:
程序中音频采样正确,通过tcp传送没有问题,通过udp先发送(sendto)头数据,发送成功,紧接着发送音频数据始终出错.
分析:
数据头sendto可以成功,说明发送代码没问题,问题应该就是数据大小问题.先打印出数据大小为88200,然后通过以下代码可知道udp所能传输包的最大数据大小
int optlen = sizeof(int);
int optvalmax;
getsockopt(sock, SOL_SOCKET, SO_MAX_MSG_SIZE, (char *)&optvalmax, &optlen);
结果知道最大为65507,显然正如我们所分析的,是数据包太大一起发送失败.
解决:
通过以上分析,知道要缩小音频数据,才有可能udp发送成功.
通过网上了解到,通过修改以下接口的属性,可实现采样数据量大小的控制
参照url:http://www.pcdog.com/edu/sjjg-sffx/2006/10/q146793_2.html
1.1通过IAMStreamConfig接口,修改的音频采样属性
注:该接口只针对输入pin

IAMStreamConfig *pPinSConfig;

hr = pin->QueryInterface(IID_IAMStreamConfig, (void **)&pPinSConfig);
if (FAILED(hr))
{
ErrorPrint("Get pin pPinSConfig error",hr);
}
else
{
AM_MEDIA_TYPE *pmt={0};
hr = pPinSConfig->GetFormat(&pmt);
if (SUCCEEDED(hr))
{

WAVEFORMATEX *pWF = (WAVEFORMATEX *) pmt->pbFormat;
pWF->nChannels = 1;
//pWF->nSamplesPerSec = 44100;
//pWF->wBitsPerSample = 16;
pWF->nBlockAlign = (WORD) ((pWF->wBitsPerSample * pWF->nChannels) / 8);
pWF->nAvgBytesPerSec = (pWF->nSamplesPerSec * pWF->nBlockAlign);

// Set the new formattype for the output pin
hr = pPinSConfig->SetFormat(pmt);

DeleteMediaType(pmt);
}
// Release interfaces
pPinSConfig->Release();
}

通过以上方法,将采集的声道数(nChannels)由2改为1,数据量减半为44100,测试后确实能发送成功了!
1.2.通过IAMBufferNegotiation接口,改变音频捕捉缓冲的大小,以减少声音播放的延迟。
注:该接口只针对输出pin,且在connect以前有效
以下设置是50ms延时

nFrequency = USE_SAMPLE_RATE;//48000;

// Find number of bytes in one second
long lBytesPerSecond = (long) (nBytesPerSample * nFrequency * nChannels);

// Set to 50ms worth of data
long lBufferSize = (long) ((float) lBytesPerSecond * 0.05);
pCapturePin->QueryInterface(IID_IAMBufferNegotiation, (void **)&pNeg);

// Set the buffer size based on selected settings
ALLOCATOR_PROPERTIES prop={0};
prop.cbBuffer = lBufferSize;
prop.cBuffers = 6;
prop.cbAlign = nBytesPerSample * nChannels;
hr = pNeg->SuggestAllocatorProperties(&prop);
pNeg->Release();

2.本地音频采集,本地播放时的回音问题
这个不是程序问题,是测试方法的问题.
本地音频采集,本地播放时,因为音箱的声音传入麦克,产生回音,不断叠加,出现干扰噪音.
解决办法就是用没有麦克的耳机代替音箱.

2010年1月25日月曜日

だれも教えてくれなかった外部設計の「極意」

http://itpro.nikkeibp.co.jp/article/COLUMN/20080515/301810/?ST=slfsys

【予定】

基本設計2-オブジェクト指向の基本設計を理解する

文章:http://itpro.nikkeibp.co.jp/article/lecture/20070702/276411/?ST=slfsys

   最近はWebシステム開発を中心に,反復型開発プロセスやオブジェクト指向設計を採用するケースが増えている。
    ここでは、オブジェクト指向設計に基づく代表的な反復型開発プロセスであるUP(Unified Process)を例にとって,オブジェクト指向設計における基本設計の勘どころを解説しよう。


  UPでは「方向付け」,「推敲」,「作成」,「移行」という4つのフェーズが定義されており,それぞれのフェーズで「要求」,「分析」,「設計」,「実 装」,「テスト」という5つの作業を実施する。推敲フェーズを2回,作成フェーズを2回というように,あるフェーズを何度か繰り返すこともある。このため に,UPは「反復型開発プロセス」と呼ばれる。

●UPにおける基本設計の流れ
































1、イベントフローが成果物の中心

    UPでは,ユースケースの定義を反復を繰り返しながら徐々に詳細化していく。この作業の前半が,一般的な開発プロセスにおける「要件定義」に当たり,後半が「基本設計」,すなわち「機能要求を仕様化する」作業となる。


 例えば,銀行口座の取引履歴照会というユースケースのイベントフローを次のように記述したとしよう。
  1. ユーザーは表示する期間を指定し,ボタンを押す
  2. システムは,指定された期間の明細と残高の一覧を表示する

 このイベントフローを,アクターとシステムとの具体的な相互作用が明確に表現されるよう,次のように詳細化する。

  1. ユーザーは,ドロップダウンで表示される1日・1週間・1カ月から期間を選択し,[一覧表示]のボタンをクリックする
  2. システムは,[日付],[明細],[残高]について,指定された期間の内容を最大30行まで一覧表示する
イベントフローをここまで詳細化したら,補足情報として「画面レイアウト」を作成する。
































   イベントフローを中心的な成果物として作成したうえで,補足的な成果物として「画面レイアウト」(出力先が画面ではなく帳票の場合は「帳票レイアウト」, ファイルや他のシステムの場合は「インタフェース仕様」)と「データ項目」を添付し,これらの成果物一式を「ユースケース仕様書」として扱うことで,分析 /設計での手戻りや再調査を最小化できる。

2、APIを用意したプラットフォーム

基本設計-1:日本IBMの「IBM-DOA」に基づく外部設計フェーズの手順

文章:http://itpro.nikkeibp.co.jp/article/lecture/20070419/268969/?ST=slfsys

DOA(Data Oriented Approach:データ中心型アプローチ)は対象システムの「データの流れ」の把握に重点を置きながら,要件定義や設計を進めていくアプローチである。

中心的な役割果たすDFD
   IBM-DOAで中心的な役割を果たすDFDは,アプリケーションの要求を仕様としてまとめるのに向いており,データを中心に明確であいまいさの残りにくい仕様を作成できる。

●DFD(Data Flow Diagram)の表記法








  




 要件定義では,DFD新論理モデルの中の「データストア」に含まれるデータ項目をリストアップした「データストア記述」,「データフロー」に含まれるデー タ項目をリストアップした「データフロー記述」,「プロセス」の内容をIPO(Input Process Output:入力-処理-出力)形式で記述した「処理機能記述」も作成する。DFD新論理モデルとこれら3つの仕様書を「DFD4点セット」と呼び,外部設計への重要なインプットとなる。

●DFD4点セット














1.複合/構造化設計を知る
複合/構造化設計では,アプリケーションを適切にモジュールに分割する。
(1)モジュール分割の良否を判定する尺度
  ① 「モジュール強度」
  ②「モジュール間結合度」



























(2)基本的なモジュール分割技法

 (1)「STS(源泉/変換/吸収)分割」

  STS分割は最も代表的なもので,設計対象のデータフローを詳細に分析して入力処理,変換処理,出力処理のまとまりに分類したうえで,「入力から変換へ」,「変換から出力へ」と大きく変わる個所(これを「最大抽象点」と呼ぶ)でモジュールを分割する

 (2)「トランザクション分割」

  トランザクション分割は,データフローからトランザクションが分岐する個所を見つけてモジュールを分割する方法である

 (3)「共通機能分割」

   共通機能分割はプログラムの全体構造から共通機能を括り出して1つのモジュールとして切り出す方法だ。






















2、外部設計フェーズの手順






    
   外部設計の目的は,「要件定義書」に基づいて,新システムの「外部仕様」を作成することである。外部仕様とは「システムの外から見える機能やインタフェー ス」のことだ。具体的には,サブシステム構成や各サブシステムの機能仕様,画面や帳票といったユーザー・インタフェース仕様,サブシステム間や他システム とのインタフェース仕様,データベース仕様,移行仕様,運用・障害対策仕様,セキュリティに関する仕様などがある。

(1)サブシステムの定義


   個々のサブシステムは異なるチーム,異なるスケジュールで開発されるため,独立して開発できるように分割すべきであり,サブシステム間は限定されたインタフェースでのみアクセスするようにすべきだ。この考え方は,複合/構造化設計と同じである。  これを実現するためには,システマチックな方法が必要となる。IBM-DOAでは,業務の大まかな括りとオンライン処理/バッチ処理などの区分を考慮しながら,高い抽象度のDFD新論理モデルの中でデータフローが最も簡素な(データの流れが最も少ない)境界で切断する。







   サブシステムを分割した後は,各サブシステムに名称を付けたうえで,サブシステムごとの「処理機能記述」とサブシステム間のインタフェース仕様(データ項目,発生サイクル,トランザクション量など)を記述する。

(2)システム機能仕様の作成   

   サブシステム分割が済んだら,サブシステムごとに「システム機能仕様」を作成する。まず,要件定義で作成したDFD新論理モデルを基に,アーキテクチャな どの物理的な特性を加味した新物理モデルを作成する。具体的には,処理形態(オンライン/バッチ処理など)や処理サイクル(リアルタイム,日次,月次な ど)といった物理的な特性を考慮して,DFD新論理モデルの「データストア」,「データフロー」,「プロセス」を統廃合・分割・追加する。


(3)適用業務フローの作成

   システム機能仕様の作成と並行して,「適用業務フロー」を作成する。適用業務フローは,利用部門の処理の流れを業務フローとして記述したものである。この作業は通常,利用部門が主体となって実施する。
















(4)ユーザー・インタフェース設計

(5)データベースの設計
(6)システム機能の記述
   システム機能仕様の作成,ユーザー・インタフェース設計,データベース設計が終わったら,個々の機能をIPO形式で記述する

以上,日本IBMにおける標準的な外部設計の作業を説明した。要件定義の成果物であるDFDとデータディクショナリをインプットに,標準的かつ定型的な作業で設計を進められることがお分かりいただけただろう。