log.ソフトウェア関連の技術系記事やウェブサービスに関する話題が中心。[Embed]で埋め込んだ動画(FLVなど)の再生と終了を検知する方法データ(ByteArray)からの動画再生Flash10からデータ(ByteArray)を直接実行する機能がNetStreamクラスに追加されている。NetStream.play()にnullを渡すことで、データ生成モードとなり、appendBytes()というメソッドを使ってデータ(ByteArray)から再生できる。Flash10からの機能なのでFlash9向けのAPIリファレンスを見ると載っていないので注意。動画の終了検知データ生成モードの場合、通常の再生と異なり色々とイベントが発生しないようである。通常はVideoクラスのEvent.COMPLETEイベントで終了を検知できるようだが、データ生成モードの場合はできない。動画の終了を検知するには、NetStreamクラスのNetStatusEvent.NET_STATUSイベントを使用する。入っていたらappendBytes()で追加したデータをすべて使い切ったということなので、終了を検知できる。Markupの明示的な改行()が効かなくなる。いつも直感的な動作をしてくれないAdobeのフレームワーク。ひとつやらかしてくれました。Markupの<br/>が効かないという事象が発生しました。BreakOppotunity.AUTOに戻すと効きます。BreakOppotunity.AUTOにしておかないとたとえ<br/>タグ(内部的には改行コード)であろうと改行してくれないようです。Flex4.6/Air3.1解決策TextConverter.importToFlow()は<br/>を見つけると<span>\u2028</span>という形式に変換するようです。直前までのspanを一度区切って、一個専用のspan要素を作ります。そこで、importToFlow()が返したTextFlowの子要素を再帰的に辿り、<br/>から変換されたspan要素のbreakOppotunityだけをBreakOppotunity.AUTOに書き換えることで問題を解決することができました。Air/Flex環境でゲームを作っていたところ、描画にCPUリソースを使いまくることに気づいた。埋め込みSWFなんかをそこそこの大きさで描画するとすぐに50%くらいCPUを消費してしまう。コンパイラオプションにuse-gpu=trueを設定しないと描画がすべてCPUで行われてしまうらしい。Air/FlexでStarlingも使わずにゲーム開発なんてなかなかしないだろうからか、そういった情報が全然なかったのでだいぶ悩んだ。Flexの設定ファイルに記述するrenderModeについては多く情報が存在する。renderModeにgpuを設定するだけでは無駄で、コンパイラオプションを設定しない限りGPUが使われることはない。GPUを使う場合は色々制約があり、下記に記載がある。http://help.adobe.com/ja_JP/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffd.htmlその他、あまり理解していないがuse-direct-blitというオプションもGPU描画に関連しているらしいのでtrueにしておくと高速化されるかもしれない。共有2013年11月10日日曜日wineでSuzuka0.8.1を動かす最新版のSuzukaでは下記の記事の内容にプラスして作業が必要だった。いうのが足りなかったのが原因のようで下記からDLした。mscomct2.ocxこれでひとまずSuzukaが起動しました。今後のビジネスモデル今後は出店料や手数料ではなく、広告により収益をあげる予定とのこと。・楽天オークションの落札時手数料は6.3%であるのに対して、ヤフオクは5.25%なので、ヤフオクの方が安い・楽天市場は出店料(月額)やロイヤルティがある。Yahoo!ショッピングは両方無料。出品者にかかる金銭的負担に関して、楽天と比べるとYahoo!が圧倒的に有利な形に変わったといえる。楽天の動き次第ではあるが、このままなら急速に楽天からYahooに出品者が移行する可能性が高いのではないだろうか。Extensionsについて調べたのでメモ。W3Cのドラフトhttp://www.w3.org/TR/encrypted-media/・クライアント(ブラウザ)はwebサーバーとのみ通信を行う・webサーバー(つまりアプリケーション)はライセンス管理サーバーと通信を行う。クライアントはメディアの復号に必要なキーをwebサーバーを経由して取得する。・暗号化の形式は規定しない。Decryptionという平文キーによる暗号化はマストでサポートするけれど、デバッグ用途などを想定しているもののようで、実システムで使うべきものじゃない。・JavaScriptのAPIを通じてコンテンツ復号モジュール(CDM)へアクセスできる海外ではこのDRMの承認や仕組みに関して批判が多い。共有PHP初級者におすすめ。Wayという今時のPHP開発についてのチュートリアルサイトを見つけたのだが、これが素晴らしい。http://ja.phptherightway.com/サイトに書いてあるとおり、PHPはどんどん進化していて古い情報が多い。初級者(初心者ではない)やモダンなPHP開発をあまり知らない中級者が間違えずにステップアップするためのチュートリアルとしてこの記事は本当に有用だ。コーディングやテスト、ツール周りを一通り説明してくれている。・最近いっぱい進化したから最新版(PHP5.5)を使いましょう。・コーディング規約はPSR-0,PSR-1,PSR-2など標準的な規約があるので使うといいよ。・最近のPHPはオブジェクト指向や関数プログラミング、メタプログラミングができます。Library(SPL)としてまとめられてます。・依存関係の管理にはcomposerとpearが便利です。composerはプロジェクト単位、pearはシステム単位の依存関係の管理に使います。・DB接続にはPDOを使おう。DBALなどがあるよ。・例外を使ってエラーを補足しやすくしよう。・ユニットテストしよう。PHPUnit、SimpleUnitなど便利なライブラリがいっぱいあります。・ビルドやデプロイを自動化しよう。php版Antであるphingやchef(ruby製)などで自動化できます。・継続的インテグレーションをしよう。TravisCIやJenkins、PHP-CIなどのツールが便利。・バイトコードキャッシュしよう。OPcache(PHP5.5に組み込まれている)やAPCでPHPバイトコードをキャッシュして高速化できる。・オブジェクトキャッシュしよう。単一サーバーでキャッシュするならAPCu、複数のサーバーでキャッシュを共有するならmemcachedなどを検討しましょう。php2013年9月21日土曜日コマンドラインからHTMLサニタイズするソースコードをブログに貼付ける際に、簡単なサンプルコードをコマンドラインからHTMLサニタイズしたくなりました。そこで、方法を調べたところ、perlやphpをコマンドラインから呼ぶ方法や、recodeコマンドを使う方法が見つかりました。htmlspecialchars($line);'php5.4を前提にしたコードになっていたので、少し修正しました。5.4の場合はHTML5などに対応したオプションフラグが容易されているため、php5.4環境が前提ならばhtmlspecialcharsにフラグを追加するとよいかもしれません。root権限で下記を実行してライブラリを追加する必要がありました。recodeコマンドを使うあまり聞き慣れないコマンドですが、代表的なLinuxディストリビューションのaptやyumパッケージには含まれているようです。様々なテキストコードの変換が可能なので、勉強しておくと結構役立つかもしれません。recodeのインストールrecodeはroot権限にて下記を実行してインストールできます。utf8..htmlutf8のところは文字エンコーディングによって変える必要があります。共有JavaのMapに同じキーの要素を含めるにはJavaのMapに同じキーに対して複数の要素を含めたくなる場合があります。Javaの標準ライブラリに含まれるMapの実装にはHashMapやTreeMapがありますが、これらは重複したキーの要素を単純に登録することはできません。対策1.HashMapなどの要素をコレクション型(ArrayListなど)にするもっとも単純な解決策は要素をコレクション型にすることです。}}対策2.guava-librariesのようなサードパーティライブラリを使用する重複キーをうまく取り扱うことができるサードパーティ製の信頼できるライブラリが公開されています。Guavaプロジェクトのページhttps://code.google.com/p/guava-libraries/重複キーを扱えるMap実装(ArrayListMultiMap)http://guava-libraries.googlecode.com/svn/tags/release03/javadoc/com/google/common/collect/ArrayListMultimap.html下記のサンプルコードを見ると登録がとても簡潔にできるようになっているのが分かるかと思います。共有2013年9月20日金曜日Bloggerでクッキーを使用して初回表示の判定を行うJavaScript(JS)とクッキーを使用して、Bloggerで初回表示の判定をして表示分けをしてみました。BloggerでJSのライブラリを使うためには、どこかのサイトにJSのライブラリを配置する必要がありますが、この2つを配置したCDNサービスが見つかったので、CDNサービスから呼び出すことにしました。テンプレートを修正し、<head>にJSを記述。初回表示エリアに表示内容を記述します。1.<head>部分にJSをロードするタグと追加のスクリプトを記述します。</script>2.次に、<body>の初回表示を行いたい場所に下記のようにブロックを追加して完了です。Componentsという仕様群が作成されている最中です。これには、外部HTMLの読み込み、テンプレートバインディング、カスタムタグなどの機能が含まれており、Web標準の仕様だけで容易にWebコンポーネントの作成を行えるようになります。Componentsを動作させることができます。コンポーネント化のサンプル(BMI計算フォーム)サンプルはBMIを計算するフォームをコンポーネント化しています。フォームのUIと動作はメインのHTML(index.html)とは切り離された外部HTML(gadgets/bmicalc.hml)に記述されています。メインのHTMLからは新たに定義されたカスタムタグをひとつ記述するだけでコンポーネントを表示できます。同じパスに置かないと動作しません。Importsを使ってコンポーネントを定義したHTMLを読み込みます。>3.コンポーネントを表示するカスタムタグを記述します。gadgets/bmicalc.htmlコンポーネントを定義します。1.カスタムタグの名称をpolymer-elementのname属性に指定します。name="devneko-bmicalc">カスタムタグ名はハイフンで区切られている必要があります。2.template要素内にコンポーネントのUIを記述します。3.scriptでPolymer関数を使いカスタムタグを登録します。Polymer('devneko-bmicalc',{Polymer関数の第二引数にはカスタムタグのインスタンスに紐づけるパラメータを指定します。いう属性を使ってハンドラー関数を指定します。gadgets/bmicalc.cssコンポーネントの見た目を定義します。CSSの名前空間が呼び出し元と分離されているわけではないので、呼び出し元や他のコンポーネントと被らないようにクラス名などを指定する必要があります。(Atom)プロフィール@santa128bitdotneet主にウェブ・モバイルアプリの開発をしているソフトウェアエンジニアです。Extensions(HTML5におけるDRMの扱い)についてのメモ...PHP初級者におすすめ。