[PHP]データの受け渡しについて(Hidden,Cookie,Session)

なんとなくPHPを勉強中。

ページ遷移した際のデータの受け渡しの方法はざっと3種類。

※今回の例としたシチュエーションはメールフォームのようなもの
1ページ目で、メールフォームにデータ入力して確認ボタンを押すと、
2ページ目には1ページ目で入力した内容が表示されている、って感じ。

◆データ受け渡し方法
1)htmlのinput要素で渡す
2)PHP(もしくはJavascript)でcookieに保持する
3)PHPでsessionに保持する

1)はブラウザ内での受け渡しとなるので容易に改ざんできる。
2)はユーザーのHDDにデータが保持されるがデータを抜かれる可能性あり
3)はサーバーのHDDにデータが保持される。sessionIDが盗まれなければデータは抜かれない。

セキュリティ的な効果は、
1) < 2) < 3) ※3)も絶対に安全かといえばそうでもない。 去年やった仕事でsessionIDを読み込んでうんちゃらかんちゃらってのがあったのだけど、意味がよくわかってなかった。 ようは、サーバーのHDDにデータが残せるCookieみたいな仕組みってことなのね。 Javaでもsession管理はできるみたいだから、サーバーサイドのプログラムなら使えるってことなのかな。

[AS]StageQuality.MEDIUM以下の状態で日本語フォントを埋め込んだTextFieldの3Dプロパティを有効にすると拡大される。(ただしムービープレビューのときのみ)

あまり意味のない情報だけど数時間ハマったのメモしとく。

まず結論から書くと、これはムービープレビューのときのみ発生(FlashCS4で確認)
ムービープレビューのときに立ち上がるFlashPlayerはブラウザに埋め込まれてるプレイヤーとは異なるもの。
まれにおかしな挙動をすることがあるのだけど、今回もその類のバグだったわけ。
なので、実際にブラウザ上で確認すれば題記のような現象にはならない。

一応再現手順を書いておく。
1.flaファイルに日本語フォントを埋め込む。(小塚ゴシックProBとする)
2.ASにて、動的にTextFieldを配置(フォントサイズを16とかに)
3.TextFieldに埋め込んだフォントを設定
4.stage.qualityをMedium以下に設定
5.TextFieldの3Dプロパティを変更(z=0とか)
6.ctrl+enterでムービープレビュー
7.指定したフォントサイズよりもでかく表示される

※stage.quailtyをHIGH以上にすれば上記現象はおきません。

まぁ実害はないけど遭遇したら一瞬焦るので一応覚えておいたほうがいいかも。

[AS]FlashCS4、CS5でフォント埋め込みの際、フォント名の指定には要注意(フォントスタイル違いで日本語/ローマ字が違うケース有)

すげー、はまったのでメモ。

↓の問題でした。
[AS]フォント名を指定するときの注意(日本語?英語?)
(今、このを記事書いてるときに上のエントリーに気付いた。アホすぎる。。。)

上の記事では、FlashIDEとFlexSDKでフォント名が異なる?という内容だけど、
FlashIDEでもバージョンによってはフォント名が異なることが発覚。
※windows/mac、Flashの日本語版/英語版で結果が異なるかも
※今回検証したのはwindow、日本語版

例1)小塚ゴシックPro レギュラーの場合
CS3:小塚ゴシック Pro R (日本語で指定)
CS4:Kozuka Gothic Pro R (ローマ字で指定)
CS5:Kozuka Gothic Pro R (ローマ字で指定)

CS3は日本語で指定だったけど、CS4以降はローマ字で指定。

・ちなみにボールドの場合はまた違った感じに。。。
例2)小塚ゴシックPro ボールドの場合
CS3:小塚ゴシック Pro B (日本語で指定)
CS4::Kozuka Gothic Pro B (ローマ字で指定)
CS5:小塚ゴシック Pro B (日本語で指定)

もちろん、日本語で書くべきところをローマ字で書いたりしたら、フォントは指定されない。
同じフォントなのにスタイル違いで、書き方変わるなんてそんなのわからんよ。。。

というわけでフォント名は直接文字列で書くのではなく、FontクラスのfontNameプロパティを使った方が間違いがおきなそう。

//ライブラリにフォントを追加
//ASに書き出しにチェック
//クラス名を指定 (仮にMyFontとする)
var myFont:Font = new MyFont();
myFont.fontName;//フォント名

var tfm:TextFormat = new TextFormat();
tfm.font = myFont.fontName;//文字列で指定しない。

[FlashIDE]ダイナミックテキストへのフォント指定について、CS4とCS5では挙動が変わったみたい

ダイナミックテキストへのフォント指定での挙動について。
CS5から挙動が変わってることに気付いたのでメモ。

◆手順
1.FlashIDEにて、ステージにダイナミックテキストを置く。
2.ダイナミックテキストに何か文字(ここでは”あいうえお”とする)を入力。
3.ダイナミックテキストに任意のフォント(ここではA-OTF 新ゴ Pro Bとする)を指定。
(ここでフォント:A-OTF 新ゴ Pro Bは埋め込まない)
4.パブリッシュ
5.フォント(A-OTF 新ゴ Pro B)が入っていないPCで表示を確認。

◆結果
・CS4でパブリッシュした場合
→文字が、デバイスフォントで表示される。
・CS5でパブリッシュした場合
→文字が、指定フォント(A-OTF 新ゴ Pro B )で表示される。

つまり、CS4ではフォントの埋め込みは行われないが、CS5ではフォントが埋め込まれている。
またここでは、入力した文字(あいうえお)のみが埋め込まれているので、動的にtextを変更しようとしても使える文字は”あいうえお”だけとなる。

というわけで、これをCS4でも同様の挙動をさせるには、

1.ダイナミックテキストを選択
2.プロパティパネルの「文字の埋め込み」をクリック
3.「自動読み込み」ボタンをクリック。
→ダイナミックテキストの文字列(ここでは”あいうえお”)が埋め込み対象文字となる。
4.「OK」をクリック
これでOK。

つまりCS5からは、上記の埋め込み作業を自動でやってくれるようになったようだ。
嬉しいような、こんがらがるような。。。

[AS]mouseEnabled=falseで下の階層にあるボタンを有効にするときの注意。

感覚的に勘違いをしていたのでメモしておく。

言葉で書いてもうまく伝えられないので、まずは以下フレームアクションのスクリプト参照。

import flash.display.Sprite;

//1階層目
//コンテナ的sp(塗り無し)
var container01:Sprite = new Sprite();

//コンテナの背景的なもの(赤塗り)
var bg01:Sprite = new Sprite();
bg01.graphics.beginFill(0xFF0000);
bg01.graphics.drawRect(0,0,300,300);
bg01.graphics.endFill();

//ボタン的なもの
var btn01:Sprite = new Sprite();
btn01.graphics.beginFill(0x660000);
btn01.graphics.drawRect(40,40,40,40);
btn01.graphics.endFill();
btn01.buttonMode = true;

//コンテナ的なものをメインのタイムラインに配置
this.addChild(container01);
//背景的なものをコンテナに配置
container01.addChild(bg01);
//ボタン的なものをコンテナに配置
container01.addChild(btn01);

//////////////////////////////////////

//2階層目
//コンテナ的sp(塗り無し)
var container02:Sprite = new Sprite();
//1階層目が見えるように半透明にして配置をずらす
container02.alpha = .5;
container02.x = container02.y = 20;

//コンテナの背景的なもの(青塗り)
var bg02:Sprite = new Sprite();
bg02.graphics.beginFill(0x0000FF);
bg02.graphics.drawRect(0,0,300,300);
bg02.graphics.endFill();

//ボタン的なもの
var btn02:Sprite = new Sprite();
btn02.graphics.beginFill(0x000066);
btn02.graphics.drawRect(40,40,40,40);
btn02.graphics.endFill();
btn02.buttonMode = true;

//コンテナ的なものをメインのタイムラインに配置
this.addChild(container02);
//背景的なものをコンテナに配置
container02.addChild(bg02);
//ボタン的なものをコンテナに配置
container02.addChild(btn02);

//1階層目のボタンを押せるようにするには、
//2階層目の背景的なものをmouseEnabled = false
bg02.mouseEnabled = false;
//さらに、コンテナ的なspもmouseEnabled = false;
//にしないとだめ
container02.mouseEnabled = false;

はまったポイントは2階層目のコンテナ自身に対してもmouseEnable=falseを設定してあげないといけないということ。
2階層目のコンテナ自身は塗りを持ってないから、(塗りの実体である)背景だけをmouseEnable=falseにすればいいんじゃね、と思い込んでおりましたが、それだと1階層目のボタンに触れません。
コンテナ自身もmouseEnabled=falseにしてやらないとだめだったのです。
感覚的に、コンテナをmouseEnabled=falseにしちゃったら、コンテナが内包しているボタンもmouseEnabled=false扱いとなってしまうかと思ったら、そんなことは無いというオチ。
mouseChildrenってプロパティもあるし、それぞれの機能をちゃんと理解しとかないとマズイです。。

[iPhone]Objective- Cの勉強メモ:xibファイルとはどういうものなのか

・xibファイルとは、
XML Interface Builderの略。
その名の通り、xml形式のファイル。
これをxcodeから開くとInterfaceBuilder(アプリケーション:以下IB)が立ち上がってビジュアル的にxmlの中身を編集できる。
(ということだと思う)

・Flashでいったらxibファイルって何にあたるの?
とTwitterでつぶやいたら、
エライ人から「FLEXでいうところのMXMLみたいなもの」と教えてもらった。
なるほど、FLEXでもMXMLも表示オブジェクトの配置情報を持っているし、MXMLを使わなくてもASで表示オブジェクトの配置することもできる。
(でもMXMLも使い方をよくわかってない)

ちょっと調べてみようと思ったらかなり分かりやすい素敵記事発見。

iPhone:Xib/Nib ファイル(その1):「支出管理」サポート
iPhone:Xib/Nib ファイル(その2) :「支出管理」サポート

xibファイルは、UIApplicationかUIViewControllerのサブクラスによってロードされるものなのね。
どのクラスにも設定できちゃうから、この辺りの仕組みがよくわからなかった。
ありがたやありがたや。

[iPhone] Objective- Cの勉強メモ:Xcodeショートカット:ヘッダーファイルとソースファイルの切り替え

.h/.mファイルの切り替え
cmd + option + 上キー(交互に切り替わる)

[AS]リスナー関数の弱参照について

避けて通ってきたところを理解できた(気がする)のでメモ。

リスナー関数を弱参照にする場合は、addEvenListener()の第5引数をtrueとする。

//例
//第5引数のデフォルト値はfalse
this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler,false,0,true);

trueを設定することでリスナー関数は弱参照となりガベージコレクション(GC)の対象となる。
※弱参照とGCについては偉い人のサイトがわかりやすいです。
イベントリスナ (AS3) とガーベジコレクション:akihiro kamijo
Tweenのアニメーションが途中で止まる:FumioNonaka.com

はまったのはここで弱参照となるリスナー関数の状態。
どういうことかというと・・・
以下の処理ではリスナー関数が弱参照でGCが発動した際にenterframe処理は停止。
これは認識どおり。

//フレームアクション
//GCが発動するとhogeの出力が止まる。
this.addEventListener(Event.ENTER_FRAME, function(e:Event):void{trace("hoge");},false,0,true);
//※もちろん、第五引数をfalseにした場合はenterframe処理はGCが発動しても動き続ける。

でも以下のように書いた場合は、第五引数をtrueにしてあってもenterframe処理はGCが発動しても動き続ける。

//フレームアクション
//GCが発動してもhogeは出力され続ける。
this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler,false,0,true);
function enterFrameHandler(e:Event):void{
trace("hoge");
}

なんで???参照きれて破棄されるんじゃないのと思ったら・・・
リスナー関数:enterFrameHandlerの自身の参照がthisに残っているから破棄されないということらしい。

なのでこう書けば破棄される。

//フレームアクション
//GCが発動でhogeの出力は止まる。
function init(){
this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler,false,0,true);
//関数init内にenterFrameHandlerを定義することでローカル関数となる。
function enterFrameHandler(e:Event):void{
trace("hoge");
}
}
init();

ちなみにこれではだめ。

//フレームアクション
//GCが発動でもhogeの出力が止まらない。
function init(){
this.addEventListener(Event.ENTER_FRAME, this.enterFrameHandler,false,0,true);
}
//関数initの外にenterFrameHandlerを定義することで関数自身の参照が保持される。
function enterFrameHandler(e:Event):void{
trace("hoge");
}
init();

ようするに。。。
第五引数をtrueにしても、弱参照になるのは、addEventLisner()とリスナー関数の関係性、と。
リスナー関数自身の参照が残ってる場合はtrueにしてもそれが残って破棄されない、と。
なんとなく、わかったような。。。
リスナー関数自身の参照も残らないようにしないといけないということらしい。

[iPhone] Objective- Cの勉強メモ:NSNotificationCenterでイベント通知の管理

Objective-CはASと違ってデリゲートとという機能がある。
デリゲートとは別に色んなクラスが通知するイベントを一括で管理してくれるクラスがあるみたい。
それが、NSNotificationCenterクラス。

手順としては、
1.NSNotificationCenterのインスタンスを生成
2.通知の登録(インスタンスに通知先、リスナー関数、通知の種類、通知の送信元)
3.通知の開始
4.(通知の終了)
5:(通知の登録解除)

例)

//playerはMPMusicPlayerControllerのインスタンス

//通知センタのインスタンを取得	
NSNotificationCenter* noteCenter = [NSNotificationCenter defaultCenter];
//addObserver:通知先
//selector:リスナー関数
//name:通知してほしい通知の種類?
//object:通知の送信元	
[noteCenter 
addObserver:self 
selector:@selector(hoge:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification 
object:player];
//通知開始を指示
[player beginGeneratingPlaybackNotifications];

nameはnilにすると全ての種類のイベントが取得対象になる。
(そもそも通知の送信元がどのようなイベントを発信してるかを把握してる必要あり?)
(ドキュメントみれば書いてあるのかな?)
objectはnilにすると、全ての送信元からイベントを受け取る。

あとNSNotificationCenterはシングルトンになるので、インスタンス変数の保持はしなくてもいいみたい。

[iPhone] Objective- Cの勉強メモ:カテゴリという概念を使って元クラスの拡張(メソッドの追加)できる

Objective-CにはASにはない機能でカテゴリという概念がある。
これはクラスファイルにメソッドを追加することができる機能。

通常クラスを拡張するにはそのクラスを継承したサブクラスを定義すればいいと思う。
でも根本的に弄りたくなった場合、元のクラスを書き換えちゃうということもできる。
(ASだと、Flash8でAS2のときは直接編集できたけど、AS3ではSWCになってるから無理ぽ)
でも書き換えちゃうと何か不具合がおきたときとかバックアップとってないと元に戻すのが大変。

というわけでカテゴリという概念は、元クラスを簡易的に拡張できるという概念。
ただし追加できるのはメソッドだけ。
変数は追加できない。
手順は拡張用のクラス(?)ファイルを作ってそこで定義する。

例)UIViewを拡張する、UIViewExファイルを生成する場合
//ヘッダーファイル

#import <UIKit/UIKit.h>
//ここでの()の中の名前は任意(ファイル名と同じでなくてよい)
@interface UIView (AnimationExtension) 
//メソッドの定義
//ここに追加したいメソッドを書く
-(void) hoge;
@end

//実行ファイル

#import "UIViewExtention.h"
@implementation UIView(AnimationExtension)
//メソッドの実装
    //ここで定義したメソッドを実装する
 -(void) hoge{
    //処理
}
@end

書き方で注意するのは、ヘッダーファイルでのinterfaceのくだり。
変数は定義できないので、{}は書く必要なし。

これを反映されるには、反映させたいクラスファイルにて

#import "UIViewExtention.h"

を記述すればよい。
これが記述されたクラス内では、UIViewインスタンスにUIViewExで追加したメソッドが普通に使えるようになる。

//例

-(void) init{
//imageViewはUIImageVIewクラスのインスタンス
//(UIImageViewのスーパークラスはUIImageなのでhogeメソッドが使える)
[imageView hoge];
}