2014年1月9日木曜日

Mac Book Air に VirtualBox で Windows8.1 をインストールした感想

VirtualBoxを使ってMac Book AirにWindows8.1(64bit)をインストールしてみた。

インストール

環境

・Mac Book Air(2011年のモデル)
・VirtualBox4.3.6
・Windows8.1(64bit)

仮想マシン

VirtualBoxの新規マシン作成時にWindows8.1をプラットフォームに選ぶと、強制でHDDは25GB以上、メモリは2GB以上にされる。Macのメモリが4GBなので半分持ってかれていしまうorz
使用CPUコアを2に引き上げて表示関連の最適化オプション付ける以外はデフォルトの状態ですんなりインストールできた。

とりあえず数時間使った感想

ユーザーインタフェース

ボロクソに叩かれている新しいユーザーインタフェースだが、僕としては悪くない。
Windows8の頃はどうだかしらないけれど。
情報を見せる場所(スタート画面)と作業場所(デスクトップ)は分かれてていい。

Chromeが動かない

インストールはできるものの起動すると画面が乱れまくって使い物にならない。
ChromeはGPUを使い倒すために色々やってるのが原因と思われる。
結局IEを使うハメになりげんなりする。

Windowsストアのアプリが微妙

「エディタ」で検索しても無料アプリではまともなものがない。diffで検索しても日本語のアプリすらでてこない。
検索結果にでてきたアプリも結局作者のウェブサイトにいかないとダウンロードできなかったりする。
他サイトの記事ではアプリも増えてきたという記述もあるが、まだゲーム探すくらいにしかWindowsストアは役に立たなそう。

遅い

VirtualBox上で動作させているせいもあるだろうがCPUを使いまくる上に、それなりにイライラできるレベルでもたつく。
Mac Book Airのファンも唸りっぱなしである。

まとめ

VirtualBoxがWindows8.1対応したとはいえ、Mac Air + VirtualBox + Windows8 な環境はかなりフラストレーションが貯まる。
どうしてもWindowsじゃないと動かないアプリがあるとかじゃない限り、おすすめできない。



PlanexのMZK-EX300D(WiFi中継器)を使ってみた感想

部屋にある複数のネットワーク危機がありまとめて無線化したかったため、約半年くらい前にMZK-EX300Dを購入して使っていたので、使用した感想をまとめてみる。

無線使用のPS3と共存が面倒

対応している無線の暗号化方式がPS3と異なることが原因で無線接続のPS3と共存するための設定に苦戦した。
PS3はAESという方式にだけ対応しており、MZK-EX300DはTKIPという方式にだけ対応している。
このため、ルーターは両方の方式に対応するために仕方なく、2GHzのバンドをAES、5GHzのバンドをTKIPで接続できるように設定しなければならなかった。
たぶん、初心者の方にはこういった設定は辛いだろう。
無線ルーターの種類によってはそもそも対応できない可能性すらある。
いまどきTKIPしか対応していないMZK-EX300Dにかなり問題があると言える。

長時間使用しているとときどき停止する

特に高負荷をかけていなくても、ときどき停止する。
すべてのランプが完全に表示されたままになり、アダプタを抜いて再起動すると直る。
徐々に頻度が上がっているように感じられ、最近は1~2日に1回くらいの割合で発生。

動作していれば快適

ルーターまではドア2枚を隔てており、直線でも7~8メートルくらいあるが、快適に通信が行える。

まとめ

動作不安定なので、他がどうであろうとおすすめできる製品ではない。
良いレビューも悪いレビューもそれなりにあるみたいで、安定度には個体差があるのかもしれない。
TKIPしか対応していないのも痛すぎる。



2014年1月8日水曜日

CSS3のrotateY/rotateXをするとマウスオーバーの判定ができなくなる問題

rotateY()した要素のマウスオーバー判定がおかしい

CSS3でY軸回転させた要素をマウスオーバー時に回転を戻すという処理を行いたかったのだが、どうもrotateY()で回転させた要素に対してマウスオーバーの判定がうまくいかない。
まったく効かないのではなく、回転によって奥側になった部分だけ判定が効かない。
また、Firefoxではこの問題が発生しない。

下記のコードで再現できる。

再現HTML
<div id="container">
    <div class="rect"></div>
</div>

再現CSS
.rect {
    display: inline-block;
    background-color: red;
    width: 200px;
    height: 200px;
    -webkit-transition: -webkit-transform 0.2s;
    -webkit-transform: perspective(300px) rotateY(30deg);
}
.rect:hover {
    -webkit-transform: perspective(300px) rotateY(0deg);
}

translateZ()とscale()で無理やり解決

どうもwebkitの動作でZ座標が0以下の要素にはマウスオーバーの判定が発生しないよう。
仕方ないのでtranslateZ()で回転しても要素のz座標がすべて0以上に収まるように要素を移動し、scale()でサイズを調整することで対応した。

修正後のCSS
.rect {
    display: inline-block;
    background-color: red;
    width: 200px;
    height: 200px;
    -webkit-transition: -webkit-transform 0.2s;
    -webkit-transform: perspective(300px) rotateY(30deg) translateZ(100px) scale(0.8);
}
.rect:hover {
    -webkit-transform: perspective(300px) rotateY(0deg) scale(0.8);
}


2014年1月4日土曜日

やっぱりJavaScriptが流行っている

JavaScriptが使いやすい言語とは思えないけれどやっぱり流行っている。

GitHubのトレンドリポジトリにおける言語別の内訳

JavaScript: 9
C/C++: 3
Objective C: 3
Ruby: 2
Lua: 1
Go: 1
(2013/1/4)

圧倒的にJavaScriptが多い。

https://github.com/trending

こんなニュースも

PayPal社がバックエンドをJavaからJavaScriptへ移行


2013年12月6日金曜日

AS3.0 で [Embed]で埋め込んだ動画(FLVなど)の再生と終了を検知する方法

データ(ByteArray)からの動画再生

Flash10からデータ(ByteArray)を直接実行する機能がNetStreamクラスに追加されている。
NetStream.play()にnullを渡すことで、データ生成モードとなり、appendBytes()というメソッドを使ってデータ(ByteArray)から再生できる。
Flash10からの機能なのでFlash9向けのAPIリファレンスを見ると載っていないので注意。

動画の終了検知

データ生成モードの場合、通常の再生と異なり色々とイベントが発生しないようである。
通常はVideoクラスのEvent.COMPLETEイベントで終了を検知できるようだが、データ生成モードの場合はできない。

動画の終了を検知するには、NetStreamクラスのNetStatusEvent.NET_STATUSイベントを使用する。
NetStatusEventのinfoプロパティのcodeに 'NetStream.Buffer.Empty' が入っていたらappendBytes()で追加したデータをすべて使い切ったということなので、終了を検知できる。

netStream.addEventListener( NetStatusEvent.NET_STATUS, handler );

function handler(e:NetStatusEvent):void {

    if ( e.info.code == 'NetStream.Buffer.Empty' ) {
        // 動画終了時処理
    }
}

参考サイト

ビデオ再生方法
http://stackoverflow.com/questions/10579142/how-to-embed-flv-in-flash-and-play-it-with-as3

終了を検知してループ再生する方法
http://stackoverflow.com/questions/11891852/how-to-loop-video-using-netstream-in-data-generation-mode

2013年12月4日水曜日

[AS3]BreakOpportunity.ANYでTLF Markupの明示的な改行(
)が効かなくなる。

いつも直感的な動作をしてくれないAdobeのフレームワーク。
またひとつやらかしてくれました。

問題発生

コンテナに沿って一文字ずつ文字を表示したかったため、TextFlowをBreakOppotunity.ANYに設定していたのですが、TextConverter.importToFlow()で読み込んだTLF Markupの<br/>が効かないという事象が発生しました。
BreakOppotunity.AUTOに戻すと効きます。BreakOppotunity.AUTOにしておかないとたとえ<br/>タグ(内部的には改行コード)であろうと改行してくれないようです。

なお、発生した環境は MacOSX Flex4.6/Air3.1

解決策

TextConverter.importToFlow()は<br/>を見つけると<span>\u2028</span>という形式に変換するようです。直前までのspanを一度区切って、一個専用のspan要素を作ります。
そこで、importToFlow()が返したTextFlowの子要素を再帰的に辿り、<br/>から変換されたspan要素のbreakOppotunityだけをBreakOppotunity.AUTOに書き換えることで問題を解決することができました。

private function fixLineBreak(elem:FlowGroupElement):void {
 var num:int = elem.numChildren;
 for ( var i:int = 0; i < num; i++ ) {
  var child:FlowElement = elem.getChildAt(i);
  if ( child is SpanElement ) {
   var span:SpanElement = SpanElement(child);
   if ( span.text == "\u2028" ) {
    span.breakOpportunity = BreakOpportunity.AUTO;
   }
  }
  if ( child is FlowGroupElement ) {
   fixLineBreak(FlowGroupElement(child));
  }
 }
}


2013年12月2日月曜日

Flexでゲーム開発するならuse-gpu=trueを設定しないといけない

色々事情があってAdobe 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にしておくと高速化されるかもしれない。

コンパイラオプションの一覧(英語)
http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7a92.html