とあるサーバー
Apache 2.2.20
PHP 5.2.17
session.use_trans_sid=0
なんですけど、定数SIDとクッキーが両方定義されているみたいです。
具体的にいいますと、
echo SID
> "PHPSESSID=abcd1234wxyz9876"
echo $_COOKIE['PHOSESSID']
> "abcd1234wxyz987"
てな具合です。
とりあえず、use_trans_sidは設定せずに、携帯等クッキーが設定されていない場合に備えて、SIDの中身が定義されていればURLの後ろにセッションIDを付けるということをしていたので、このケースではPCでも何でもセッションID付きのURLになってしまう。
状況はよく分かりませんが、気持ち悪いのでクッキーが設定されていなくて、かつ、SIDが設定されている場合は・・・という条件分岐を追加しました。
2012年4月3日火曜日
2012年4月1日日曜日
MPMoviePlayerViewController _serverConnectionDiedNotification
MPMoviePlayerViewControllerからのリクエストをサーバで受ける場合に注意が必要であるという件は前回の記事で書きました。
これは、直接関係しているかどうかはわかりませんし、未確定情報ですが、一回の再生で何度もリクエストを送るということで、それぞれに時間のかかる処理を入れてしまうと再生が遅くなるのは当然ですが、ときおり下記のようなエラーが発生する場合があります。
_serverConnectionDiedNotification. Info -- notification=Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo=0xde25730 {NSLocalizedRecoverySuggestion=Try again later., NSLocalizedDescription=Cannot Complete Action}, AVPlayer = <MPQueuePlayer: 0xdef2540>, currentTime = 0.00
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'
*** First throw call stack:
(0x372b688f 0x357bc259 0x367170dd 0x3670dedb 0x3670ec37 0x3450cc59 0x3450eee7 0x372892ad 0x3720c4a5 0x3720c36d 0x32119439 0x33990e7d 0xa9a55 0xa94f0)
これは、実験的にサーバ処理の中にスリープを入れ、スリープをある程度長くすると発生したという結果からの私の推測です。エラーの内容も接続が切れたので処理を完了できなかったというように読めます。
ご参考までに。
MPMoviePlayerViewControllerでプログラムが出力する動画を再生する
MPMoviewPlayerViewControllerでサーバ上の動画を再生する際には注意が必要です。
静的なファイルを直接URLで指定するような場合には特に何も気にする必要はありませんが、JavaやPHPのようにサーバ上のプログラムから動画データを出力するような場合には普通に出力させてもちゃんと再生されません。
というのも、どうやら、MPMoviePlayerViewControllerは指定されたURLに対してバイトレンジを指定してリクエストを送っているようです。
Range: bytes=0-5011
のように。
ここからは推測も入っていますが…
最初のリクエストで
Range: bytes=0-1
を送って、レスポンスヘッダに
Accept-Rages: bytes
が含まれているかをチェックして、バイトレンジのアクセスが許可されていなければ即再生を止めプレイヤーを終了してしまいます。
ですから、プログラムから動画を出力する場合には、リクエストレンジを取得して適切なレスポンスを返す必要があります。確認した限りでは結構頻繁にリクエスト送っています。同時に複数のセッションを張っている可能性もあります。
PHPなら、$_SERVER['HTTP_RANGE']でとれます。
静的なファイルを直接URLで指定するような場合には特に何も気にする必要はありませんが、JavaやPHPのようにサーバ上のプログラムから動画データを出力するような場合には普通に出力させてもちゃんと再生されません。
というのも、どうやら、MPMoviePlayerViewControllerは指定されたURLに対してバイトレンジを指定してリクエストを送っているようです。
Range: bytes=0-5011
のように。
ここからは推測も入っていますが…
最初のリクエストで
Range: bytes=0-1
を送って、レスポンスヘッダに
Accept-Rages: bytes
が含まれているかをチェックして、バイトレンジのアクセスが許可されていなければ即再生を止めプレイヤーを終了してしまいます。
ですから、プログラムから動画を出力する場合には、リクエストレンジを取得して適切なレスポンスを返す必要があります。確認した限りでは結構頻繁にリクエスト送っています。同時に複数のセッションを張っている可能性もあります。
PHPなら、$_SERVER['HTTP_RANGE']でとれます。
2012年3月16日金曜日
CoreData Migration で勘違い
お恥ずかしい話ですが、私、CoreDataのMigrationについて大きく勘違いしておりました。
たとえば、CoreDataのデータモデルのモデルバージョンが1、2、3と3バージョンあるとします。
開発の時間軸で考えると最初に開発してモデルバージョンが1。その後何らかの変更を加えてバージョン2のモデルを作る。そのときには当然、バージョン1からバージョン2のマッピングモデルを作りますよね。
ここまでは、まぁ普通です。
次に、さらにバージョン2にも変更が必要になったので、モデルバージョン3を作ります。このときバージョン2からバージョン3のマッピングモデルを作ります。
これでシステムが自動的に二段階更新をやってくれるのかな?なんて思っていたんです。でもそうではないようです。
モデルバージョン3を作ったら、2から3へのマッピングモデルと1から3へのマッピングモデルが必要です。前に作った1から2のマッピングモデルはもはや必要なし。
開発者側の怠慢というか楽しようという意識からすれば、1から2はもう作ったんだし、今回は2から3でいいでしょうってなもんでしたが、処理の効率から考えれば当然、1から3、もしくは、2から3とする方が効率が良いわけで、ちょっと考えれば分かることなんですが。
とにかく勘違いが解けてよかったです。
たとえば、CoreDataのデータモデルのモデルバージョンが1、2、3と3バージョンあるとします。
開発の時間軸で考えると最初に開発してモデルバージョンが1。その後何らかの変更を加えてバージョン2のモデルを作る。そのときには当然、バージョン1からバージョン2のマッピングモデルを作りますよね。
ここまでは、まぁ普通です。
次に、さらにバージョン2にも変更が必要になったので、モデルバージョン3を作ります。このときバージョン2からバージョン3のマッピングモデルを作ります。
これでシステムが自動的に二段階更新をやってくれるのかな?なんて思っていたんです。でもそうではないようです。
モデルバージョン3を作ったら、2から3へのマッピングモデルと1から3へのマッピングモデルが必要です。前に作った1から2のマッピングモデルはもはや必要なし。
開発者側の怠慢というか楽しようという意識からすれば、1から2はもう作ったんだし、今回は2から3でいいでしょうってなもんでしたが、処理の効率から考えれば当然、1から3、もしくは、2から3とする方が効率が良いわけで、ちょっと考えれば分かることなんですが。
とにかく勘違いが解けてよかったです。
2012年1月18日水曜日
iOSアプリのデフォルト言語
「iTunes Connect: Editing the default language for your app」
Appleからメールが届きました。
これまで、最初(のアプリ申請時)に選択したデフォルトの言語は変更することはできなかった。
最初に日本語を選んだことを後悔したこともあった。
もうひとつ別のデベロッパ契約を結んで英語で登録しようかと思ったが1社1アカウントということから、それもできなかった。
・・・が、ついにデフォルトの言語を変更することができるようになったようです。
しかもアプリごとに、いつでも変更できるということ。
iTunes Connect 除いてみたら、ちゃんと選択するプルダウンがありました。
Appleからメールが届きました。
これまで、最初(のアプリ申請時)に選択したデフォルトの言語は変更することはできなかった。
最初に日本語を選んだことを後悔したこともあった。
もうひとつ別のデベロッパ契約を結んで英語で登録しようかと思ったが1社1アカウントということから、それもできなかった。
・・・が、ついにデフォルトの言語を変更することができるようになったようです。
しかもアプリごとに、いつでも変更できるということ。
iTunes Connect 除いてみたら、ちゃんと選択するプルダウンがありました。
2012年1月5日木曜日
OpenOffice をあきらめ LibreOffice へ
あけましておめでとうございます。
今日、OpenOfficeを使ってデータの整理をしようと思ったら途中でフリーズしてしまいました。
シート数は20シートくらいで、各シート内は平均200~300行くらいのデータです。
環境はWindows 7で、OpenOfficeは3.3です。
何度やってもフリーズします。
ほかのもっと小さなファイルで試してみてもやっぱり暫くするとフリーズします。
マウスホイールでスクロールしている最中のフリーズが多かったのですが、そのほかの作業中でもフリーズすることがありました。
3.2のときにMicrosoft Office IMEとの相性どうこうという話があったみたいなので、IMEを切り替えてMicrosoft IMEに変更しましたが結果は変わらず。
結局あんまり時間をかけて、あれこれ試してみるのもしんどいし、スパッとあきらめてLibreOffceの3.4を入れて試してみましたら今のところ問題なく動いてくれています。
よくわからんけど、しばらくはこれで様子を見てみようと思います。
今日、OpenOfficeを使ってデータの整理をしようと思ったら途中でフリーズしてしまいました。
シート数は20シートくらいで、各シート内は平均200~300行くらいのデータです。
環境はWindows 7で、OpenOfficeは3.3です。
何度やってもフリーズします。
ほかのもっと小さなファイルで試してみてもやっぱり暫くするとフリーズします。
マウスホイールでスクロールしている最中のフリーズが多かったのですが、そのほかの作業中でもフリーズすることがありました。
3.2のときにMicrosoft Office IMEとの相性どうこうという話があったみたいなので、IMEを切り替えてMicrosoft IMEに変更しましたが結果は変わらず。
結局あんまり時間をかけて、あれこれ試してみるのもしんどいし、スパッとあきらめてLibreOffceの3.4を入れて試してみましたら今のところ問題なく動いてくれています。
よくわからんけど、しばらくはこれで様子を見てみようと思います。
2011年12月17日土曜日
androidでボタンがタッチされたときに画像を変更する
androidアプリでandroid.widget.ButtonのBackgroundプロパティに画像を設定したり、android.widget.ImageButtonのSrcプロパティに画像を設定したりすることはよくあると思います。
iOSでは、これだけでボタンがタッチされたら自動的に画像の明度を落としたようにハイライトしてくれるので、それに甘えているのが常なんですが、androidでも同様かと思いきやandroidでは何もしてくれません。
やはり、ボタンが押されているということを視覚的に表現したいと思いますよね。
まず、私が試したのは、通常の画像(仮にnormal.pngとします)と押された状態の画像(仮にpressed.pngとします)の二種類の画像を用意します。
そして、OnTouchListenerを使用して下のようにイベントリスナーで処理します。
注)このときfalseを返さないとOnClickListenerに処理が回ってきません。
ただ、このようにしてもボタンを押したまま指がボタンを外れても画像が戻ってくれませんでした。しかもこのMotionEventの定数は非常に多岐に渡っていて、きちんとやろうと思えばいろいろなケースに対応する必要があり正直面倒そうです。
で、見つけたのがselectorを使うという方法です。drawableの中にselectorというタイプのXMLファイルを作成します。ファイル名が@drawable/...に指定するリソース名になります。
以下のように記述します。
これで、ちゃんと押したまま指がボタンを外れても元の画像に戻ってくれます。
androidでは、いろんな場面でXMLが活躍するみたいですね。とりあえずはここを極めないといけないかもしれませんね。
iOSでは、これだけでボタンがタッチされたら自動的に画像の明度を落としたようにハイライトしてくれるので、それに甘えているのが常なんですが、androidでも同様かと思いきやandroidでは何もしてくれません。
やはり、ボタンが押されているということを視覚的に表現したいと思いますよね。
まず、私が試したのは、通常の画像(仮にnormal.pngとします)と押された状態の画像(仮にpressed.pngとします)の二種類の画像を用意します。
そして、OnTouchListenerを使用して下のようにイベントリスナーで処理します。
((Button)findViewById(R.id.button2)).setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN){ ((Button)v).setBackgroundResource(R.drawable.pressed); }else if(event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_OUTSIDE || event.getAction() == MotionEvent.ACTION_UP){ ((Button)v).setBackgroundResource(R.drawable.normal); } return false; } });
注)このときfalseを返さないとOnClickListenerに処理が回ってきません。
ただ、このようにしてもボタンを押したまま指がボタンを外れても画像が戻ってくれませんでした。しかもこのMotionEventの定数は非常に多岐に渡っていて、きちんとやろうと思えばいろいろなケースに対応する必要があり正直面倒そうです。
で、見つけたのがselectorを使うという方法です。drawableの中にselectorというタイプのXMLファイルを作成します。ファイル名が@drawable/...に指定するリソース名になります。
以下のように記述します。
これで、ちゃんと押したまま指がボタンを外れても元の画像に戻ってくれます。
androidでは、いろんな場面でXMLが活躍するみたいですね。とりあえずはここを極めないといけないかもしれませんね。