Windows7 64bit環境でScoutを使ってコンパイルしようとするとエラーが出るバグ

Windows7 64bit環境でScoutのバージョン0.5.0を使ってコンパイルしようとするとArgumentErrorが出て停止してしまう。

原因は「C:\Program Files (x86)\Scout\javascripts\app\process_interaction.js」の95行目でjava.exeのパスが32bit環境でのProgram Filesディレクトリを指している箇所。ここを64bit環境のパスに差し替えてやる。

これを

return air.File.applicationDirectory.resolvePath("C:\\Program Files\\Java\\jre6\\bin\\java.exe");

こうする

return air.File.applicationDirectory.resolvePath("C:\\Program Files (x86)\\Java\\jre6\\bin\\java.exe");

詳細は下記参照のこと。
#19: ArgumentError on Windows7 – Issues – mhs/scout-app – GitHub

Posted in TRYOUT | Leave a comment

iOS開発備忘録

定期的に記憶が揮発するので、しばらくここに追加してく。
スクロール中のUITableViewを強制的に停止させる時はcontentOffsetに現在地の座標を突っ込む。
[_tableView setContentOffset:_tableView.contentOffset animated:NO];
iphone – Programmatically force a UIScrollView to stop scrolling, for sharing a table view with multiple data sources – Stack Overflow
[NSMutableArray copy]で返ってくるのはNSArray、NSMutableArrayとしてコピーがしたい時は[NSMutableArray mutableCopy]を使う。
Basilの息子| 「__NSArrayM」と「__NSArrayI」
ホームボタンが押されて、アプリがバックグラウンドに送られたときにアプリを完全に終了させる方法。
projectName-Info.plistに「Application does not run in background」という項目を追加してValueをYESにする。
UIApplicationExitsOnSuspend=YES を Info.plist に設定する – Debian GNU/Linux 3.1 on PowerMac G4
[[UIApplication sharedApplication] beginIgnoringInteractionEvents]でアプリケーション内のすべてのタッチイベントを停止する。
[[UIApplication sharedApplication] endIgnoringInteractionEvents]でタッチイベントの受信再開。
iOSイベント処理ガイド
プロパティの宣言につける型みたいなやつ(セマンティクス)。

  • readwrite: 読み書き可能。デフォルト。
  • readonly: 読み取り専用。
  • strong: 強い参照。
  • weak: 弱い参照。参照先が解放されると自動的にnilが入る。iOS5から。
  • assign: 単純代入。デフォルト。
  • copy: copyを使って参照を保持する。代入前に自動でreleaseを送る。
  • retain: retainを使って参照を保持する。代入前に自動でreleaseを送る。
  • nonatomic: スレッドセーフでない。

Objective-Cプログラミング言語

ある瞬間からある瞬間の時間を計測する方法。終了タイミングのNSDateオブジェクトのtimeIntervalSinceDate:に開始タイミングのNSDateオブジェクトを渡す。
■[iPhone][Objective-C] 時間を計測する方法
AudioServicesPlaySystemSoundで鳴らせるプリインストール済みのサウンドファイル一覧。
AudioServices – iPhone Development Wiki
UIViewのアニメーションをキャンセルするには、アニメーションしているview.layerにremoveAllAnimationsを送る。
[btn.layer removeAllAnimations];
〜:animatedなアニメーションの実行時間はUIViewのanimateWithDuration:animations:で指定できる。その際animetedはNOにしないと反映されないから注意。
SimpleBoxes | ブロックを使ったアニメーション処理 (iPhone/iPad, Objective-C 2.0)
NSArray、NSMutableArrayのソートはsortedArrayUsingDescriptors:を使うとだいぶ楽。
蒼い惑星: NSArrayのソート方法について
CGRectが{0,0,0,0}もしくはNULLかどうかを判定する時はCGRectIsEmpty()。
CGRectのメソッド色々メモ 比較編(iOS SDK)|ふぁのれこそは半角カタカナで
Xcodeのシンタックスハイライトが消えたり、補完が効かなくなったら、[~/Library/Developer/Xcode/DerivedData]にある該当プロジェクトのキャッシュを削除してXcodeを再起動する。
autocomplete – Xcode 4: Auto-complete & Jump to Definition broken in my Xcode 3 Project – Stack Overflow
UILabelはデフォルトだとタッチイベントがオフになってるのでuserInteractionEnabledをYESにする。
UIButton – 福井高専IT研究会OfficialWiki
デバイス回転処理前のタイミングで回転後のサイズを取得したい時はUIViewControllerのwillAnimateRotationToInterfaceOrientation:duration:内でself.viewのframe、boundsを参照する。
Bynomial Code » Handling rotations in UIViewController
pngも含めた透過性のviewはスクロール負荷が高い。
[iOS] TableView スクロールパフォーマンスの改善 – iOS 開発ブログ Natsu's note
UIViewのrecursiveDescriptionメソッドでviewの階層構造を出力できる。
ビュー (UIView) の階層構造をダンプする非公開の便利メソッド – 24/7 twenty-four seven
NSTimerを解放するときのinvalidateはdeallocではなくviewWillDisappear:あたりで行う。
NSTimerのscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:はtarget:で渡されたオブジェクトをretainするからNSTimerをinvalidateするまでtarget:に渡されたオブジェクトは解放されない。よってdealloc外でinvalidateを呼ばないとdeallocが呼ばれなくなってしまうため。
A-Liaison BLOG: NSTimerは基本的にretainせずassignでよい
CALayerの初期化は[CALayer layer]だけど解放時はlayer.contents = nilして[layer release]。
CALayerのメモリ解放(メモ)|UA LABO|ユナイティア株式会社
Xcode4にてOption押しながらナビゲーター内のファイルを選択するとアシスタントエディタにファイルの内容を表示できる。
UIViewControllerのフロー

初期化

  1. alloc
    メモリの確保
  2. init、init〜
    データ類の初期化
  3. loadView
    viewの初期化
  4. viewDidLoad
    viewのレイアウト、データの反映
  5. viewWillAppear:(viewが画面に描画される場合)
    viewが画面に描画される直前の処理
  6. viewDidAppear:(viewが画面に描画される場合)
    viewが画面に描画された直後の処理

メモリ不足

  1. didReceiveMemoryWarning
    不要なデータの解放
  2. viewDidUnload
    viewの解放(変数にnilを代入してアクセスを防ぐ)
デバイス回転時のUIViewController内のフロー

パターン1

  1. デバイスが回転
  2. shouldAutorotateToInterfaceOrientation:
    サポートする角度の確認
  3. willRotateToInterfaceOrientation:duration:
    view回転直前の処理
  4. viewの回転
  5. didRotateFromInterfaceOrientation:
    view回転直後の処理

パターン2

  1. デバイスが回転
  2. shouldAutorotateToInterfaceOrientation:
    サポートする角度の確認
  3. willRotateToInterfaceOrientation:duration:
    view回転直前の処理
  4. willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:
    中間角度直前の処理
  5. 中間の角度
  6. didAnimateFirstHalfOfRotationToInterfaceOrientation:
    中間角度直後の処理
  7. willAnimateSecondHalfOfRotationToInterfaceOrientation:duration:
    回転済み直前の処理
  8. viewの回転
  9. didRotateFromInterfaceOrientation:
    回転直後の処理

iOS View Controller プログラミングガイド

参考書
・図版多めでサクッと読める。Xcode4の使い方、Instrumentsの使い方がサクッと把握できる。
Xcode 4 入門 for iOS/Mac OS X
・公式ドキュメントを和訳したPDF。「Cocoaメモリ管理プログラミングガイド」とか「iOS View Controller プログラミングガイド」、「iOS View プログラミングガイド」は必読。
iOS Developer Library
・実践的な「書き方」が多数掲載されてて勉強になる。安心の木下さん著作。
iOS開発におけるパターンによるオートマティズム
・UIKit各クラスの基礎的な使い方が網羅されてる。分厚いからパラ見してどんなクラスがあるか把握しといて、いざ使うときになったら該当箇所を読み込むって使い方がよさげ。
iPhoneプログラミングUIKit詳解リファレンス

設定したブレイクポイントを右クリックして開いたメニューの[Edit Breakpoint]からブレイクさせる条件を設定できたり、ブレイクさせずにNSLogしたり、音を鳴らしたり、AppleScriptを実行したりできる。
Xcode4でNSLogを過去にする | みるくCocoa
static analyzerで実行前に潜在的なメモリリーク等を検出してくれる。
Cocoaの日々: Xcode – Build And Analyze
Cocoaの日々: Xcode – Build And Analyze 〜 問題の例
[Product]→[Edit Scheme...]→[Run {プロジェクト名}]→[Diagnostics]→[Memory Management]→[Enable Zombie Objects]にチェックを入れると実行時エラーが発生したその場で停止してその場所でエラーを吐いてくれるようになる。
EZ-NET: Xcode4 のデバッグ環境を整える
control+command+Eで[Edit All in Scope]が実行できる
Documentをオンラインで見ると遅いからローカルに保存しておく。
[xcode]→[Preferences...]→[Downloads]→[Documentation]→[Check and Install Now]
xcode4でカラーテーマの変更は[xcode]→[Preferences...]→[Fonts & Colors]→[Theme]
xcode4のRefactor機能
・Renameで変数名の一括変更
・Extractで一部のコードをメソッドに変換
・Create Superclassでスーパークラスの作成→継承
・Move Upで変数、メソッドをスーパークラスに移動
・Move Downでサブクラスに移動
・Encapsulateで変数をプロパティー化
Xcode 4 移行ガイド:テキストの置換とリファクタリング
UIWebViewをdeallocする時はwebView.delegateにnilをつっこんどく。
アプリが落ちないUIWebViewの使い方: iPhoneアプリ開発備忘録
ナビゲーションバーにデフォルトで表示される戻るボタンを非表示にする方法。UINavigationControllerにpushするcontroller内のviewDidLoadで[self.navigationItem setHidesBackButton:YES animated:NO]する。
チーズくんの備忘録 [iOS]戻るボタンを消す方法
プリインストールされていないフォントを使う方法。プロジェクトにttf、otfを読みこんでxxx-Info.plistに「Fonts provided by application」という項目を追加して各ファイル名をStringとして加える。あとはUIFontにフォント名をしてする。フォント名の取得はplistに追加したあと下記のコードを実行してインストール済みのフォントを出力して確認する。

NSEnumerator *e = [[UIFont familyNames] objectEnumerator];
NSString *font;
while(font = [e nextObject])
{
    NSLog(@"%@: %@", font, [UIFont fontNamesForFamilyName:font]);
}

そうだ、プログラミングしよう  フォントを組み込む方法

UINavigationBarのグラデーションを消したい時はカテゴリからdrawRect:を上書きしてCGContextSetFillColorで塗りつぶす。

iOS5以降の場合は[navigationBar setBackgroundImage:]で背景に無地の画像を敷き詰める。

UIImage* bgImage = [UIImage imageNamed: @"black.png"];
[bgImage drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.navigationBar setBackgroundImage:bgImage forBarMetrics:UIBarMetricsDefault];

iphone – Remove Gradient on UINavigationBar – Stack Overflow

UINavigationBarのタイトルのフォント等のスタイルを変えたいときは、好きなUILabelを作ってnavigationItem.titleViewにつっこむ。

iOS5以降の場合は[navigationBar setTitleTextAttributes:]で設定できる。
uinavigationbar – iPhone Navigation Bar Title text color – Stack Overflow

UIScrollViewのscrollViewDidScroll:はcontentSize、contentOffsetが変化した時も呼ばれる。
Cocoaの日々: 簡易スライドビューア [17] モードの切り替え
NSTimerにscheduledTimerWithTimeInterval:のtargetにselfを渡すと、selfがretainされる。NSTimerのinvalidateを呼ぶとreleaseしてくれる。
NSTimerインスタンスは、生成元viewControllerを保持するのは分かっていたのに、
それではまった。

A-Liaison BLOG: NSTimerは基本的にretainせずassignでよい
NSString → intは[@"123" intValue]。
int → NSStringは[NSString stringWithFormat:@"%i", 123]。
Objective-Cのキャスト(数値⇔文字): iphoneアプリ開発の虎の巻ブログ
BOOLは内部的にはint型なのでNSLogで出力するときはintにキャストして判定
NSLog(@”%i”, (int)b);
Objective-Cでのデバック NSLogについて – k2ダイアリー
copyメソッドを使った時、NSArrayは浅いコピー(shallow copy)、NSMutableArrayは深いコピー(deep copy)が実行される。要はNSArrayは参照を返して、NSMutableArrayは完全にコピーされた実オブジェクトが返される。
iPhoneアプリ開発時のメモリ管理で気をつけること – A Day In The Life
alloc、alloc+init〜、copy〜以外のメソッドで生成したオブジェクトをreleaseすると潜在的に実行されてるautoreleaseが走った瞬間に落ちる。
UIButtonはrelease不要 – 全力で気まぐれ
jsonとかxml、画像なんかを読み込んでblocksで非同期処理が書けるライブラリ。
AFNetworking/AFNetworking – GitHub
Cocoaの日々: [Info] AFNetworking
処理速度求めないシチュエーションならUIWebViewで極力回避。
UIWebViewでつくるUI – yidevで発表してきました | DOTAPON Blog
^から始まる関数はblocksというクロージャ、jsでいうとこの無名関数。
C/Objective-C + Blocks でクロージャ – TrashSUITE
Blocks Programming Topics: Getting Started with Blocks
中身がnilのオブジェクトにメッセージ送ってもEXC_BAD_ACCESSにならないので、releaseしたらすぐにnil突っ込んどく。

[view release], view = nil;
NSStirngのsizeWithFont:forWidth:lineBreakMode:は一行の高さを取得、sizeWithFont:constrainedToSize:lineBreakMode:が複数行の高さを取得。
constrainedToSize:にheightをおっきめに設定したCGRectを突っ込む。
UITableViewCellの高さを内容に合わせて変化させる | アクトインディ技術部隊報告書
NSMutableArrayの初期化の仕方による開放の仕方とその有無
[Objective-C] retain と release の関係について – それはBlog
Posted in OBJECTIVE-C, TRYOUT | Leave a comment

CIDから対応する文字を取得する

わけあってCIDをもとに対応する文字を取得したい。
ざっと調べてみたら、CIDと文字が対になった一覧表はこのへんにあるんだけどプログラムからは使いにくい。

プログラムから使いやすそうな資料を探してみたところ、どうもAcrobat内部ではCIDをUnicodeに変換するようなことをしてるらしいことがわかった。その変換に関する資料がこれ

すかさずこの資料の後半のMapping Fileを拝借。
CIDを投げたらCID→Unicode→String.fromCharCode()で文字を取得ってクラスを作ったんだけど、どうも取得したUnicodeが期待した文字に変換できてない。

この「Unicode」はString.fromCharCodeで変換できる「Unicode」じゃないのかなぁ?

うーん…

と思ったら、FontForgeで使ってるcidmapっていうCIDのマッピングファイルに「Adobe-Japan1-6.cidmap」ってのがあった。これをコンバートして使ってみたらうまく変換できた。ワーイ。
どうも上記のデータはAdobe-Japan2のマッピングデータらしい。なるほろ。

package
{

  public class CharCodeUtil
  {
    static private var list:Array;

    public function CharCodeUtil()
    {

    }

    static public function getCharFromCID(cid:uint):String
    {
      var char:String = "";

      init();

      for each (var obj:Object in list)
      {
        if (cid == uint(obj.c[0]))
        {
          char = String.fromCharCode(uint(obj.u));
          break;
        }
      }

      return char;
    }

    static private function init():void
    {
      if (list) return;

      list = [
        //ここに.cidmapをArray化したデータを
      ];
    }
  }
}
Posted in FLASH, TRYOUT | Leave a comment

macでxampp環境セットアップするメモ

xamppでローカルにサーバー環境を持ってこれれば、dropbox配下でサーバーサイドの編集ができるじゃん、ということでmac(10.7)でxamppセットアップしてみた。

インストール

1. ここからxampp落としてくる。

2. dmgからインスコ

3. Applications/XAMPP/XAMPP Controlを起動。http://localhost/にアクセスしてxamppの「ようこそ」画面が出たらひとまずインスコ成功。

セキュリティの設定

1. Terminalを起動して「$ sudo /applications/xampp/xamppfiles/xampp security」を実行。

2. xamppのパスワード設定、MySQLの外部ネットワークからのアクセスを許可するかの設定、MySQLのパスワード設定、phpMyAdminのパスワード設定が順番に実行される。

3. http://localhost/xampp/security.phpでセキュリティのステータスを確認。すべて安全になっていたら完了。
(ちなみに各サービスへのアクセスに必要なIDはxamppに設定されてる)

VirtualHostの設定

1. 「/Applications/XAMPP/xamppfiles/etc/httpd.conf」を開き、

# Include /Applications/XAMPP/etc/extra/httpd-vhosts.conf

をコメントアウトし、httpd-vhosts.confの設定を読み込むようにする。

2. 「/Applications/XAMPP/etc/extra/httpd-vhosts.conf」を開き、httpd.conf内で設定されていたhttp://localhost/xampp/の設定を移す。

<VirtualHost *:80>
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
    ServerName localhost
</VirtualHost>

<Directory "/Applications/XAMPP/xamppfiles/htdocs">
    Options Indexes FollowSymLinks ExecCGI Includes
    AllowOverride All
    Order allow,deny
    Allow from localhost 127.0.0.1
</Directory>

3. 表示したいアドレスとローカルのディレクトリを割り当てる。

<VirtualHost *:80>
    ServerName {表示したいアドレス}
    DocumentRoot "{ローカルディレクトリ}"
</VirtualHost>

4. 設定したアドレスへのアクセス権限を設定する。

<Directory "{3で設定したローカルディレクトリ}">
    Order allow,deny
    Allow from {公開する範囲、Allとかlocalhost}
</Directory>

5. NameVirtualHost *:80がコメントアウトされていたら、これもコメントを外しておく。

6. こんな感じ。

NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot "/Applications/XAMPP/xamppfiles/htdocs"
    ServerName localhost
</VirtualHost>

<Directory "/Applications/XAMPP/xamppfiles/htdocs">
    Options Indexes FollowSymLinks ExecCGI Includes
    AllowOverride All
    Order allow,deny
    Allow from localhost 127.0.0.1
</Directory>

<VirtualHost *:80>
    ServerName hogehoge.local
    DocumentRoot "/Users/bouze/htdocs"
</VirtualHost>

<Directory "/Users/bouze/htdocs">
    Order allow,deny
    Allow from localhost 127.0.0.1
</Directory>

7. hostsファイルにhttpd-vhosts.confで指定したアドレスを追加しておく。GUIでhostファイルを編集できるHosterがよい感じ。

8. 設定したアドレスにアクセスしてローカルのファイルが表示されたら成功。
※「要求されたディレクトリへのアクセス権限がありません。」的なエラーが出る場合はローカルディレクトリをさかのぼってパーミッションが読み取り可能な状態になっているか確認する。

Posted in TRYOUT | Leave a comment

FlashPlayer 11.1.102.55で静止テキストフィールドのサイズがバグる

こんな感じに膨らむ。

Posted in FLASH | Leave a comment

Away3DのWhiteShadingBitmapMaterialでメモリリーク

Away3DのWhiteShadingBitmapMaterialを普通に使ってるとBitmapDataをガンガンキャッシュしてメモリリーク起こすのでclearCache()してね、とのこと。

Issue 95 – away3d – Feature to clear bitmap cache in WhiteShadingBitmapMaterial (or texture setter) – Realtime 3D engine for Flash – Google Project Hosting

取り急ぎ5秒おきにキャッシュクリアして回避。

package wimax.away3d.material
{
    import away3d.materials.WhiteShadingBitmapMaterial;
    import flash.display.BitmapData;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class ImprovedWhiteShadingBitmapMaterial extends WhiteShadingBitmapMaterial
    {
        public var clearCacheInterval:int = 5000;

        public function ImprovedWhiteShadingBitmapMaterial(bitmap:BitmapData, init:Object=null)
        {
            super(bitmap, init);

            var t:Timer = new Timer(clearCacheInterval);
            t.addEventListener(TimerEvent.TIMER, function(e:TimerEvent):void
            {
                clearCache();
            });
            t.start();
        }
    }
}
Posted in FLASH | Leave a comment

iOSで行間調整、カーニングするメモ

UILabelの行間、カーニング調整できないクソ仕様に悶絶したので代替手段としてCoreTextを調べてみたメモ。

・もろもろパラメータ設定したNSAttributedStringを用意する。指定できるパラメータはCoreText.framework内CTStringAttributes.hを参照。

・CTFramesetterCreateWithAttributedString(CFAttributedString*)でCTFramesetterRef取得する。

・CoreFoundationとObjective-Cのデータ型はだいたい互換性があるらしく、引数がCF~のとこに、同名のNS~を(CF~)NS~みたいにキャストしてつっこめれる。

・CGPathCreateMutable()でCGMutablePathRef取得する。

・CGPathAddRect(CGMutablePathRef, NULL, self.bounds)で描画範囲を設定。

・取得したCTFramesetterRefとCGMutablePathRefからCTFramesetterCreateFrame(CTFramesetterRef, CFRange, CGPathRef, NULL)を使ってCTFrameRefを作る。

・UIViewのdrawRect:(CGRect)rect内でUIGraphicsGetCurrentContext()使ってCGContextRef取得。

・CTFrameDraw(CTFrameRef, CGContextRef)でテキスト描画。

・UIViewとCoreGraphicsで座標系が違うので、
CGContextTranslateCTM(CGContextRef, 0, self.bounds.size.height);
CGContextScaleCTM(CGContextRef, 1, -1);
で上下反転させておく。

CoreFoundationとかガチのC言語な上、手続きがめんどすぎるのでよっぽどのことがない限りUIWebViewで描画した方がよい。
あとCoreTextの日本語資料少な過ぎで死ぬ。

参考:
Core Text Programming Guide: Introduction
Text Layout With Core Text
CoreText.framework – iPhone Development Wiki

Posted in OBJECTIVE-C | Leave a comment

動的に生成されるURLに対して固有のOGPを生成する方法メモ

http://hoge.com/#1000 みたいな、ハッシュ以下の値に対してコンテンツを書き換えるサイトで、それぞれのハッシュに応じて異なるOpen Graph Protocol(OGP)を吐き出したい時の対処法。

フェイスブック、ミクシィ、グリーで使われている OGP (Open Graph Protocol) とは何か
http://d.hatena.ne.jp/amachang/20110117/1295233078

1. まず同一ドメイン内に、OGP吐き出し用のPHPを用意する。

ex) http://hoge.com/share.php

2. 元のhtmlと同一のハッシュを受け取ってその値に応じたOGPを吐くようにする。

ex) http://hoge.com/share.php?id=1000

3. html内に設置したShareボタン、Likeボタンの対象URLを上記のshare.phpにする。

 <div data-href="http://hoge.com/share.php?id=1000" data-send=false data-layout="button_count" data-width=450 data-show-faces=false></div>

4. このままだとウォールにshare.phpのURLが投稿されてしまい、ウォールからアクセスしたユーザーがshare.phpに飛んでしまうので、share.php内でfacebookのクローラー以外を元のhtmlにリダイレクトする。
facebookのクローラーはUserAgant内の“facebookexternalhit”の有無で判定する。

Best Practices – Facebook開発者
http://developers.facebook.com/docs/best-practices/

5. 以下share.phpの概要

<?php
$id = $_GET["id"];
$ua = $_SERVER['HTTP_USER_AGENT'];

//facebook crowlerじゃなかったらリダイレクト
if (!preg_match('/facebookexternalhit/i', $ua))
{
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: http://hoge.com/#" . $id);
    exit;
}

//idに応じて情報を取得する
$api = "http://hoge.com/api?id=" . $id;
$json = file_get_contents($api);
$user_data = json_decode($json);
$username = htmlspecialchars($user_data->result->username);
$img_path = htmlspecialchars($user_data->result->img_path);

?><!DOCTYPE html>
<html lang="en" xmlns:og="http://ogp.me/ns#">
    <head>
        <meta charset="utf-8">
        <meta property="og:title" content="<?=$username?>'s page">
        <meta property="og:description" content="SITE DESCRIPTION">
        <meta property="og:url" content="http://hoge.com/#<?=$id?>">
        <meta property="og:image" content="<?=$img_path?>">
        <link rel="image_src" href="<?=$img_path?>">
        <title><?=$username?>'s page</title>
    </head>
    <body>
        <script type="text/javascript">location.replace("http://hoge.com/#<?=$id?>");</script>
    </body>
</html>
Posted in INTRODUCTION, PHP | Leave a comment

ActionScript 3 SDK for Facebook Platform API ハマリどころメモ

ActionScript 3 SDK for Facebook Platform APIを使う時に、attributes.nameを指定せずattributes.idだけを指定してswfobject.embedSWFすると、SDK内のExternalInterface.objectIDを参照している箇所でnullが返ってjsの方でエラーが出るブラウザがある。

このままだとjsの処理が止まってFB.loginとかFB.apiでコールバックが呼ばれなくなってしまうので、attributes.idと同じ名前をattributes.nameで指定してExternalInterface.objectIDを参照できるようにする。

var flashvars = {
};

var params = {
    base:'.',
    menu:'false',
    wmode: 'window',
    allowFullScreen:'true',
    allowscriptaccess:'always'
};

var attributes = {
    id:"hoge", //←これと
    name:"hoge" //←これを指定する
};

swfobject.embedSWF('main.swf', 'flashcontent', '100%', '100%', '10.0.0', '', flashvars, params, attributes);
Posted in FLASH, JAVASCRIPT | Leave a comment

Objective-C を強引に AS3 で例えるメモ

全部雰囲気で理解してるので間違ってる可能性大です。

変数宣言

プリミティブ型
int num → var num:int

クラス型
MyClass *myClass → var myClass:MyClass

※プリミティブ型以外の型は変数宣言で*付ける

ディスプレイオブジェクト的な概念

UIView → DisplayObject
UIResponder → InteractiveObject
addSubView → addChild
CGContextRef → Graphics
UIImage → BitmapData
UIImageView → Bitmap

座標指定
view.center = CGPointMake(100, 200)

view.x = 100;
view.y = 200;

リサイズ
view.size = CGSizeMake(100, 200)

view.width = 100;
view.height = 200;

メソッド

[instance method] → instance.method()
method:は:までがメソッド名

イベントハンドラ

[obj addTarget:self action:@selector(nullEventHandler:) forControlEvents:NullEventNull]

obj.addEventListener(NullEvent.NULL, nullEventHandler)

ヌル

nil → null

タイマー

NSTimer → Timer

文字列

@”This is text” → “This is text”

関数の定義

- (void)func: (NSString)arg1 argument2:(NSString)arg2 argument3:(NSString)arg3
{
}
※argument2とargument3は引数名(ラベル)で省略可。

private function func(arg1:String, arg2:String, arg3:String):void
{
}

関数の呼び出し

[obj func:@"引数1" argument2:@"引数2" argument3:@"引数3"];

obj.func(“引数1″, “引数2″, “引数3″);

コンストラクタ呼び出し

[[Class alloc] init] → new Class()

用語

プロトコル → インターフェイス

デリゲート

//インターフェイス(プロトコル)で通知用の関数定義
interface IHoge
{
function onHoge():void;
}

//デリゲートされるクラス
class Hoge implements IHoge
{
public function onHoge():void
{
trace(“called Hoge”);
}
}

/*
イベント(この場合は初期化)が起こったらインターフェイス(プロトコル)に対して通知関数を呼ぶ

デリゲート?
*/
class Main()
{
public Main(hoge:IHoge)
{
hoge.onHoge();
}
}

実行順序

アプリ起動

main()実行

UIApplicationMain()実行

アプリケーションデリゲートオブジェクトを呼び出し
- アプリケーションデリゲートオブジェクト = UIApplicationDelegateプロトコルを採用(継承)したオブジェクト
- didFinishLaunchingWithOptions:

イベントループ
- ユーザーの操作等々
- アプリケーションデリゲートオブジェクト経由で各メソッドを呼び出す

アプリ終了準備 → applicationWillResignActive:

アプリ終了 → applicationDidEnterBackground:

参照:
http://developer.apple.com/jp/devcenter/ios/library/documentation/iPhoneAppProgrammingGuide.pdf

Posted in FLASH, OBJECTIVE-C | Leave a comment