くまりゅう日記

もっと過去の日記
[.NET | BeOS | Blender | COLLADA | fossil | mono | monotone | NPR | OpenGL | PeerCastStation | Riko | Ruby | Silverlight | TRPG | XNA | ゲーム | ゲーム作り | プログラム | | 模型]

2015-12-12

日記

いろいろやってはいるが、書く暇がなかなかとれない。いや暇はあるはずなんだが?

BlackBerry Q10買った

Windows Phoneについて書きまくったのはこれの伏線だった!というわけでBlackBerry Q10を買ってしまった。

Windows Phoneはアプリ全然ねーけど俺の使い方だと問題ねーな……と思ってたんだが、気になる点は文字入力がめんどくさいところだ。 がんばってフリック入力してはいるんだが遅くて、たまに何か入力しようとしてもめんどくさくなって諦める事態が発生していた。 で、そういやBlackBerryとかHWキーボードついてて素敵だなーと思い出して、どうせアプリ無いならBlackBerryでもいいんじゃねぇかと。

調べたらBlackBerry CLASSICてのが日本でも普通に買えるようだが5万円。ちょっとお試しで買うには高すぎるわー。と言ってたらQ10ってやつがちょっと古いけど安く買えるよと教えてもらう。 探すとAmazonのマーケットプレイスで2.5万円くらいで買えそうだ。MADOSMAが3万円だったので2.5万なら安いし、失敗してもなんとか諦めがつくお値段だわ。

とはいえすぐに買おうというほど安い値段でもないのでいろいろと情報を集めた結果、欲しくなったので買うことに。 キーボードに補助文字入ってないやつって明記されてるやつは2.5万円のやつか2.2万円の新古品のやつがあったんだが、2.5万の方は業者が不安。 新規業者で全く評価が入っておらず、Q10を数台出品してるだけだ。えーとそれどっから出てきたやつなんですかね、大丈夫なやつなんですかね。 2.2万円の新古品売ってる業者はそれなりに実績のあるスマホ輸入販売業者のようなので、安いし新古品でもそんなひどいことにはならんだろとこっちにした。 香港から発送と書いてあったのでそのうちいつか届けばいいやぐらいのつもりで買ったのに、翌日にはなぜかうちの近くの郵便局から発送されたことになっており、2日後朝には届いた。東京は香港だった……?

実は前回のWindows Phoneが云々と書いてた時にはもう届いて使っていたので、2週間程使ったことになるが非常に満足している。 ハードウェアの出来が非常によく、これが2万円台で買えるとかおかしいだろ1と言いたくなるくらい使ってて楽しくなる。 アプリはびっくりするくらい無いが、でもWindows Phoneもびっくりするくらいアプリが無かったのでよく考えたら何も変わってなかった。 Windows Phoneからの移行でちょっと困ったのがOneNoteの同期ができないくらいだ。 これは今でも解決してないんだが、そこまで必要じゃないのでまあいいや。 OneDriveの同期はできるのでそこにテキストファイルを置いておけば充分だった。

BlackBerryは初めてなので使い方がわからんよねとか思ったが、チュートリアルが充実しているのでなんの問題もなかった。これすげえよ。 BlackBerry HUBという通知関係まとめて出してくれたり表示してくれたりさらにそこから返信だのの処理もできちゃうやつが便利ですな。 PIMとしての出来はさすがとしか言いようがない。

標準で入ってる以外はいくらかアプリを買ったのと無料のやつを入れた2くらいで、あとは標準で入ってるやつで充分かなぁ。

HWキーボードはやっぱりとても便利なので、なにかとケータイで入力するのが増えた感じ。といっても大して入力することがあるわけでもないんだが。 今までブラウザで検索する文字を入力するのもめんどいからってでかいタブレット取り出してたりしたのも、ケータイだけでやるようになったり。ブラウザも実用的だしね。

好きになったのでなんか無駄にアプリ作りたくなって調べたりしちゃったり。

不安な点としてはBlackBerry自体の今後がどうなのかですな。 どうもAndroid OSでハードウェアキーボードくっつけた新機種が出てたりするようですが、情報を見た感じではまだまだ荒削りなところはあるものの期待は持てそう。 確かにBlackBerry 10 OSの出来も悪くはないけど、使い易い標準アプリがあればAndroidでだめってこともないだろうしね。 今出てるのは高くてでっかい機種みたいだけど、今後小さくて安めの機種も出るなら期待したいところ。 まあべつに今BlackBerry 10 OSで困ってないのでしばらくこれ使うことになるし、これでいいと思うけど。

ちなみにMADOSMAはWindows 10 Mobileが落ちてくるのをWiFiのみで待っている状況です。 Windows 10 Mobileが出たらまたいじりたい。こいつがメインに戻るかってーと怪しいけど、アプリ作るかもしんないしね……。

  1. まあ出たのは結構前っぽいので、今となっては安いというだけなんだろうけど。それにしても豪華で素敵な作りだ。 

  2. 音楽プレイヤーとGoogle Map見るやつを買って、GoogleやMSアカウントのAuthenticatorのかわりになるやつが無料であったので入れた。 

[Ruby][.NET] IronRubyでFiberしたい!

IronRubyでFiber使いたいわけですよ。

ここしばらく、ていうかだいぶ前からIronRuby使ってたんですけど、IronRubyでずっと欲しいなと思ってた機能としてFiberがあるんですよ。 mrubyにはFiberあるようで、いいなーmruby使うようにしようかなーと気になる今日このごろ。

ゲームなんか書く時にFiberあると、プログラムの途中で1フレーム寝て次のフレームでこの動作してまた寝て、なんてことが書きやすくなります。 まあ無ければ無いでなんとかなるし、必要かと言われるとそんなに必要はないんだけど、あったらあったで適当に書ける部分もあるので嬉しい。 というわけでFiberが欲しい。

IronRubyでFiber作れないかってのはだいぶ前から考えてて、IronRubyのソースを眺めるんだけどその度に難しそうだなーと挫折してきた。 しかし最近またソース眺めて、今度こそ本当にだめっぽいというのがやっとわかったわけだ。だめなのかよ。

IronRubyは.NETのDynamic Language Runtime(DLR)ていうものの上に構築されてる。 ていうか.NET4以降にはだいたい取り込まれてるからわざわざDLRっていうことも今時無いんじゃないかという気もする。 とにかくDLRの実行系で大事なのはSystem.Linq.Expressionsあたり。 System.Linq.Expressions名前空間内のクラスはASTの要素になってんだけど、こいつらを組み立てておいて、呼び出すと実行して値を返してくれるよってやつ。 インタプリタがもう用意されてんですな。インタプリタだけじゃなくてメソッドにコンパイルしたりもできちゃうよ! なんて便利なんでしょう。使ってみようとすると意外と制限きついんだけどな。

一方Fiberなんだけど、こいつの肝はFiber.yieldで止めたところにFiber#resumeで戻ってこれること。

def tyudan
  Fiber.yield
end

fiber = Fiber.new do
  p 'hoge'
  tyudan
  p 'fuga'
  tyudan
  p 'piyo'
end
fiber.resume # => "hoge"
fiber.resume # => "fuga"

こんなん。 これ実装するならどうするかってーと、Fiber.yieldでその時点の環境を保存して、なんならここで止まりましたよーという情報も保存して大域脱出で抜けるわけだ。簡単。 Fiber#resumeの方は?保存されてた止まった場所に飛び込めばいいわけだ。飛び込む?スタックの深い場所にだ。どうやって? というわけでですね、抜けるのは簡単なんだけど飛び込むのはめっちゃ難しいわけですよ。

System.Linq.ExpressionsはASTを実行してから返ってくるだけの機能しかないので、途中のスタック状態を保存したり、保存しといたスタック状態にいきなり飛び込むのはできないわけです。 ていうかSystem.Linq.Expressionsに限らず.NETにそんな機能はねーよ。いや超頑張ればもしかしたらできるかもしれないけど1、少なくとも普通にC#いじってる分には無理なんですよ。 というわけでIronRubyでFiberは普通に実装するのは無理っぽい。あらら。

CRubyはどうやってんのか調べ……るのはめんどくさいんで考えたんだけど、たぶん普通にsetjmp/longjmpなんだろうなぁ。こういう無理が効くところはC言語すげーわ。細かいところ考えると死ねるんだろうけど。

mrubyでどうなってんのかも調べてないんだけど、C言語の関数をまたぐことはできないっていう話をどっかで聞いたので、VMレベルでのRubyのスタック保存と再生(つまりRubyレベルのみのsetjmp/longjmp的なこと)をやってんだろうなと予想。 それならできそう。でもIronRubyはC#のメソッドを普通にまたげるのでした。てか大部分C#実装だしね。

JRuby!そういえばIronRubyの参考になりそうなJRubyさんがFiber実装してるじゃないですか。こいつどうなってんだろ。JVMでFiberがそう簡単に実装できるとは思えん。 ソースを調べてみたところ、Fiber毎にスレッドを立ち上げて、Fiber.yieldでスレッドを寝かして、Fiber#resumeでスレッドを起こしてた。 なるほど!これなら確かに……ん?この方法どっかで……。あー、以前この方法俺も検討したわ。

確かにFiberをスレッドで実行しちゃえば同じような動作はできるんだけどさ。 Fiberのいいところっていっぱい立ち上げてもユーザーレベルだから遅くないってことのはずなんだよね。 以前IronRubyでも(どころかRubyレベルで実装できんじゃないかと)同じこと検討した時には、じゃあこれいっぱい立ち上げたら大変なことにならないか?と試してみたら200程スレッド立ち上げたら案の定大変なことになった。 だいぶ前だからどうなったのかはっきり覚えてないけど、くっそ重くなって全然スレッドが動かんとかそんな感じだったような。 つまりゲームでオブジェクト毎にFiber立ち上げましょうなんてのはちょっと厳しそうだったから諦めたんだった。たぶん立ち上げるだけでも時間かかるしね。

他にC#とかIronPythonのGeneratorを調べようとしたが、いずれも一つのメソッドレベルだけで中断できるやつなので、yieldが書いてあるメソッドだけ変形してやれば事足りる。戻り値も必ずGenerator(?)になるしね。 RubyのFiberはスタックの深いところからでも脱出できるし、深いところから再開できるようになってるが、C#やPythonのGeneratorではそれは無理だから参考にならんてこった。

結論としてはIronRubyで沢山立ち上げられるFiberを実装するのは無理だわ。上の方に既に書いてあったけどな。 やるならばmrubyみたいにすればなんとかなるかもしれないけど、それはもうIronRubyとはだいぶかけ離れた物になるだろうから「IronRubyでは」無理と言い切っちゃってもいいんじゃないかな。 まあそんなに沢山立ち上げるつもりがなければJRuby形式のスレッドでエミュレーションする方法でもいいかもしんない。けどそれは俺の用途には無いのでやらなかった。

なんかこういうそこそこまともな技術ネタ書くのは久々な気がした。

  1. 保存ぐらいならなんとかなるんじゃないかなぁ。再生できない保存に意味があるかってーと無いんだけど。 


ページのトップへ | トップ «前の日記(2015-11-29) 最新 次の日記(2015-12-14)» | 編集 | kumaryu.net by kumaryu