Web系プログラマに贈るCoronaSDKの始め方
仕事でCoronaSDKを使ってゲームを作り始めたので、これから始める同僚の為にまとめ。
概要
米anscamobile社の開発しているiPhone/Android両対応のスマートフォンゲーム用SDK
以下特徴など
- 軽量スクリプト言語luaでコード書ける
- OpenGLで動いてるから動作軽い、Effectとか作ってみた感じではブラウザ上のJSよりは遥かに高速。得手不得手はあるとは思うけど。
- 2D専用で3Dはできない…その替わり手軽
- 無料でもSDKのバージョンがちょっと古いぐらいで開発には支障が無い。但し、ビルドするときにtrialである旨が表示されるのでリリース時には購入必須。
- anscaモバイル社のサーバでしか実機で動作するビルドができないという驚異的なシステム。今まで落ちていた事は無いけどこれは怖い。サービス終了したときに資産が無になるのは覚悟せざるを得ない。
なんでlua?
WEB系やってるとTokyo Cabinet: a modern implementation of DBMで組み込みに使ってる…ぐらいしか聞いた事無かったですし、みんなそんなもんかなーとは思います。
ですが、ゲーム/組み込みだとよく使われてるようです。動作が早い事が重要なところではJSとかよりも色んな意味で軽いのが高評価となるようです。
- Cとの連携がやりやすい
- Cで実装系が小さくて軽い(ソースコードで200kb程度らしいhttp://blog.livedoor.jp/dankogai/archives/51227421.html)
- スクリプトのわりに早い
luaどうなの?
ほぼJavaScriptなのですっきりしてて良いです。
良い(と思う)点
- 憎い「;」がいらない
- 改行とスペースが文法的に等価なので一行に詰め込むも良し、分割するも良し。
- クロージャもあるよ。
- metatable(めんどいので上部dankogaiさん解説を参照の事)もあるのでできる事は多い。
- クロージャ、metatable使えばObjectぽい事もできる。
悪い(と思う)点
- ライブラリ探しづらい(Project Catalogもあるけど、検索しづらい…)JSONとか基本的なやつは見つかるけど。
- ソース整理しづらい。requireするluaファイルはプロジェクトトップに全て存在する必要がある(ここはluaじゃなくてCoronaの制限、ローカルのシミュレータなら設定いじれば動くけど、実機で動かないので意味無し)
- 他色々あるけど、枝葉末節。
蛇足
- 配列が1から始まる!えー
情報源
書籍
- CoronaSDK ハンドブック
iOS/Android対応アプリ開発ツール「Corona SDK」ハンドブック2011 (CD+冊子)
- 作者: 山本直也,坂本俊之,藤川佑介
- 出版社/メーカー: インプレスR&D(インプレス)
- 発売日: 2011/01/27
- メディア: 単行本(ソフトカバー)
- クリック: 72回
- この商品を含むブログ (1件) を見る
どこで見たレビューかうろ覚え(見つからず)ですが、基本的には公式ドキュメントの邦訳との事。
まあ英語だけど公式読んだ方が良いです。7万だし。
- 基礎から学ぶ CoronaSDK
- 作者: 坂本俊之,藤川佑介,山本直也,中原智博
- 出版社/メーカー: シーアンドアール研究所
- 発売日: 2012/02/25
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 38回
- この商品を含むブログ (2件) を見る
概要から、luaの基本、kwik、Spriteloq等の使える3rd Partyツールの紹介もされてる。
はじめる! Corona SDK - 達人出版会
こちらはよりプログラム初心者にオススメ。windows環境への導入から初まってるので。
基礎から学ぶ…と同じような構成で全般的に薄いのでざっくり把握したいならこっちの方がラクに読めるはず。
あ、そもそも800円と圧倒的に安いし達人出版会なのでpdfでダウンロードできるし、利便性は凄い。
web
- 公式ドキュメント
anscamobile公式ドキュメント Overview
ここが基本、まずはビデオあたりから。開発初めるAPIリファレンス見まくる事に。
あと、CoronaSDK自体に入ってるSampleは全てmain.luaをシミュレータに渡せばすぐ動く状態で大量に入ってるのでこちらを見るのがわかりやすい。
- 日本Coronaの会
http://j-corona-group.jimdo.com/
残念ながら現在活発に活動してる様子は見られず…
ただ、google groupsにて質疑応答されていたりはするので、死んではいない様子。地方では勉強会やったりもしてるようで…
関東でやって欲しい!
- ブログ
たくさん見てはいるが特に参考になったところだけ紹介。
Growth Curve: Director Class 入門 [Corona SDK]
Director Classという画面遷移ライブラリの入門資料あり。これが概要わかりました。ありがとうございます。
http://nijibox.jp/smap/
たぶん一番世話になってるブログ。最近はUnityも追ってるようですが、CoronaSDK関連の更新も活発です。毎度ありがとうございます。
3rd Partyツール/ライブラリ
使ってるものの概要
- Kwik
Kwiksher: Mobile Application Development Plugins for Photoshop
photoshopプラグイン。photoshopからレイヤーグループ毎に画像を書きだし、CoronaSDK用の座標指定したluaファイルを出力してくれる。
基本はPhotoshopだけ使って写真アルバムみたいなの作れるよ!なツールなので音楽とか簡単なアニメとか色々できます。
ただ、ウチではレイアウトにしか使ってないので邪魔な事(勝手にフリップしたら画面遷移するようになるとか、画像名に勝手にページ名prefixつけるとか…)を色々するのが難点。
ちなみに前述したDirectorClassを使用している前提のコードを吐く。
また、レイヤ名に日本語が使われていると問答無用で固まったり、設定いじってると出力されないようになったり…とかなりじゃじゃ馬なので注意。
disってばかりのように見えますが、Photoshopから直接動くものが出るのは素晴しいです。
- Spriteloq
Animo - Flash SWF Exporter for Platino
Flashプラグイン…といってもAdobe Flash…作る方のソフトのプラグインです。
Flashアニメーション全体を一枚のSpriteSheet(パラパラ漫画みたいなもの)にしてくれて、アニメーションを簡単に組み込めます。
SpriteSheetのサイズ制限はあるけど、同じ画像をまとめてくれるので案外小さくなる。
- Particle Candy
:: X-PRESSIVE.COM :: - PARTICLE CANDY FOR CORONA® & GIDEROS® iOS / ANDROID SDK
これは凄い!エフェクトを作るのに便利なライブラリ。ちょっとしたコードによる設定
- 画面全体に霧がかったようなエフェクト
- 炎が燃えて揺れているようなエフェクト
- 銃を乱射して薬莢が飛び散る表現…
などなどが簡単に実現できます。
コードサンプルとか色々足りないような気もしますが熟練WEBプログラマ向けなんでこれで大丈夫!
社内scala勉強会#3まとめ
今の会社内でScala勉強会が開催されてるのでまとめ。
twitterから公開されているScala Schoolを使っています。
http://twitter.github.com/scala_school/
今回はCollectionsの前半。
http://twitter.github.com/scala_school/collections.html
以下のコードの引用はほとんどScala Schoolのものです。
バックナンバー
#1 @satococoaさん
http://www.223soft.net/56
#2 @netwillnetさん
http://d.hatena.ne.jp/willnet/
Lists
ふつーに配列
val numbers = List(1, 2, 3, 4) numbers: List[Int] = List(1, 2, 3, 4)
Sets
重複しない配列。JavaのListとSetの関係と同様
scala> Set(1, 1, 2) res0: scala.collection.immutable.Set[Int] = Set(1, 2)
Tuple
これはあんまり見ない概念でした。
何が配列と違うんや!と思ったし、実際機能上はほぼ変わらない。
色々いじって調べた結果、配列は「複数の同じ種類のモノを格納」に対し、タプルは「複数の値で表現される一つのデータを格納」するっぽい。
それクラスでできんじゃね?とも思いますが、Javaでデータだけ入れるちょっとしたクラスを作るシチュエーションを想定してるようです。
他で調べた結果、タプルの2値限定はPair、3値限定はTripleという別名があるらしい。
scala> val hostPort = ("localhost", 80) hostPort: (String, Int) = (localhost, 80)
まあわかってからこの例を見れば一目瞭然。
scala> hostPort._1 res0: String = localhost
scala> hostPort._2 res1: Int = 80
アクセスするには「_n」というアクセサを使用。
hostPort match { case ("localhost", port) => ... case (host, port) => ... }
パターンマッチにも使える。便利そう。
scala> 1 -> 2 res0: (Int, Int) = (1,2)
こういう書き方もある。要素一個のMapっぽい。
Maps
Map(1 -> 2) Map("foo" -> "bar")
=>はFunctionに取られてるのでC言語でおなじみアロー演算子を使うらしい。
Map(1 -> Map("foo" -> "bar")) Map("timesTwo" -> timesTwo(_))
マップの中にマップもアリ。
後者はどうやっても動かなかったので
Map("timesTwo" -> timesTwo _ )
の誤記じゃないか?という結論でした。
Functionの部分適用も入るよーということ。まあ要は何でも入ると。
ちなみに
val m = Map("key" -> "value" ) m.get("key")
した結果はvalueではありません。後述のOptionです。
m.get("key").get
で"value"が取得できます。
Option
で、Option。Optionはこんなtraitのようなモノ…らしい。
trait Option[T] { def isDefined: Boolean def get: T def getOrElse(t: T): T }
scala> val numbers = Map(1 -> "one", 2 -> "two") numbers: scala.collection.immutable.Map[Int,String] = Map((1,one), (2,two))
scala> numbers.get(2) res0: Option[java.lang.String] = Some(two)
値があるときはSome
scala> numbers.get(3) res1: Option[java.lang.String] = None
値が無いときはNone
が返る。
Some[T]とNoneはOptionのサブクラス。
val result = if (res1.isDefined()) { res1.get * 2 } else { 0 }
こんなときや
scala> numbers.get(3).getOrElse("default") res6: java.lang.String = default
こんなときもぬるぽを心配せずに書けるよ!
TDDBCに参加しました
TDDをペアプロで経験できるTDD boot campに参加してきました。
http://devtesting.jp/tddbc/?TDDBC%E6%A8%AA%E6%B5%9C
存在は知ってはいたものの、参加する機会はありませんでしたが、参加しているyokohama.rbでスタッフ募集があったため思い切って参加することにしました。
その後で聞きましたが一般参加枠は募集後数時間締め切り、今回は抽選になるという人気イベントだったそうで…スタッフで参加できたのは幸運でした。
今会社で使ってるJavaにしようかと思いましが、一応スタッフなので奇数のRubyに参加しました。
詳細レポートは様々な方が書いているので簡単に感想と気づきを。
特にshinyaさんのレポート充実し過ぎワロタw
http://d.hatena.ne.jp/absj31/20111105/1320547155
なおTDDについては入門記事等で概要は把握して、UnitTestは場合によって書いてる程度で、TDDレベル的にはまさに新兵です。
感想
- ペアプロ楽しい!
@kotakanbeさんとペアプロしました。Javaメイン、Vimmer、英語キーボード、Rubyの使用はツール作るレベル、Rspecほぼ未経験…とびっくりする程私と同じ状況ながらコードを書くとやっぱり全然違う発想をしてたり…色々発見がありました。おかげさまでどうにか用意さらた課題6問クリアできました。@kotakanbeさんありがとうございました!
- 多言語での参加、レビューが面白い
JavaScriptやC++、果てはGroovyのテストまで。異文化のテストコードがとても興味深かった。
特にGroobyはRubyと比べてもとてもすっきりしたテストコードで驚きました。spockというテストライブラリを使ってるそうです。
http://code.google.com/p/spock/
気づき
- テストは日本語を使うのをためらわなくて良い
Java,PHPのように許されるなら関数名に日本語をける事もアリ。
- 一旦失敗させる意味
Red→Green→Refactorのサイクルで一旦Redにする意味がずっと腑に落ちなかったが、「テストのテストをしている」という事で納得。
- 学習テスト
今回の課題にあった四捨五入とか、ちょっと調べればわかるけど、覚えていないものをテスト化しておく。
テストする事によって覚えやすくなるし、使い方の理解も深まる。
- テストデータ選定
実データ、もしくは近いデータを使うのは重要…だけど、境界値等レアケースのテストは抜けている事が多いので注意。
- テストクラス内に入れ子を使って管理すると良い。
Rspecでできるのは知ってたけど、java JUnitでも static classを使う事によってクラス内に入れ子を作れる。
- パラレルチェンジ
テストの変更が必要な大きいリファクタするとき、テストと実装同時に変えると変化が大きすぎて危険。
じゃあどうするか?
古い実装、テストを残しつつ新しいテスト、実装を書き、両方通るようになって初めて古いテストを消す。
…うーん、理論は納得しつつ、両方通るようにするときに余計なコストかかるときどーすんだろ?とか、若干疑問は残った。
しかし、理念としては「変更を小さくする」事で安全に開発する事だと思うのでそこらへんは臨機黄変で良いのかなという理解にしておく。
- パラメタライズドテスト
テストの実行を共通化して、データのインプット、アウトプットの組を複数作って冗長なテスト記述を避ける手法。
JUnitでもできる。
@shuji_w6eさんのサンプル
https://twitter.com/#!/shuji_w6e/status/132731935083593730
注意点としてはどこでエラーが起こったかわかりづらいところ。データ内にテスト名を含める等工夫が必要。
- テストしやすくする為に実装を工夫する。
テスト結果がわかりづらい時に、実装に本来必要無い名称データを入れる事によってログを見やすくした。
恐らくこの事によってログも綺麗になって運用時にも役立つと思う。
- ぺけま
せとあずさ♂(@setoazusa)さんが「るびま」にあやかって作ったウェブ雑誌。xUnitについての情報が載るようで期待したいです。
http://devtesting.jp/pekema/
まとめ
多言語開発者が集まるので懇親会も非常に多用なメンバーで日頃の勉強会と違った楽しみもありました。
楽しいという点、勉強になる点両方の観点で両方予想以上に良いイベントでした。
機会があればもう一回出たい! そのときにはTAで参加できるようになっておきたいものです。
実際の業務で使いこなせるよう頑張ります。
福岡出身者が北部九州の観光地をまとめてみた。
※技術ブログですが今回技術的な話は一切ありませんのでご注意ください。
友人が福岡、大分、熊本にレンタカー旅行するらしいので彼の旅行ルート近辺の個人的に好きな観光モノをまとめてみた。
福岡
中州屋台
観光用と化してるところは高いけど、まあ面白いから良いかも。
昔行ってたところは無いし、大体地元民に連れられて行くから具体的にココってところは残念ながら無い。
よくあるオススメ屋台メニューは焼きラーメン。
個人的には屋台で食べる必要は無いけど、那珂川沿いの屋台街の見物はするべし。
居酒屋
福岡独特の居酒屋メニューがあるから普通の居酒屋も面白い(チェーン・除く)。
ゴマサバ、豚足、酢モツとか…魚の種類が関東と結構違うしフツーの居酒屋でも鮮度良いから美味い。
小ネタだと焼き鳥、必ず豚バラがあるのとモモ肉が四つ身とか一部呼び方が違う。
鉄なべ
餃子好きなら個人的に好きな店。一口サイズの餃子が鉄鍋で出てくる。ゴマサバとか居酒屋つまみメニューも置いてる。
ぐるなび - 味自慢 餃子の店 鉄なべ であい橋店 http://r.gnavi.co.jp/f039300/
元祖長浜屋
天神から車で10分くらい。
本当に長浜ラーメンの元祖らしい。メニューラーメンしか無く、座れば出てくる。
今同じかわからんけど、ラーメン400円、替え玉50円と激安。
味はこだわってるわけじゃないけど、素朴な長浜ラーメンで美味い。
元祖長浜屋 がんそながはまや - 赤坂/ラーメン [食べログ] http://r.tabelog.com/fukuoka/A4001/A400104/40006844/
柳川
柳川といえば川下り。昔の水路で数十分とかなり長いルートを下れる。
船頭さんが説明してくれるので退屈はしない。
柳川は観光と美味いものがセットであるのが良い。
水郷のまち柳川(川下り) http://www.chibaphoto.jp/yanagawa/kawakudari.html
うなぎのせいろ蒸し
柳川名物。福岡でも食えるけど関東ではほぼ見ない。
簡単に言うと甘めのタレでご飯ごと蒸したうな丼。
関東に来るまでうな丼とはコレのことだと思ってました…
うなぎめし 柳川鍋 古蓮 うなぎめし やながわなべ これん - 西鉄柳川/郷土料理(その他) [食べログ] http://r.tabelog.com/fukuoka/A4008/A400806/40004960/
(実際行った店では無いけど…行った店名忘れた…)
水城
でかいので高速道路からチラ見がオススメw
まあ丘にしか見えないので見つけられたら事前に場所把握しとかないと厳しいけどねw
[その他の史跡]水城跡 - 福岡 - goo 地域 http://local.goo.ne.jp/leisure/spotID_TO-40002052/
大分
湯布院
湯布院に行ったら金鱗湖に行って亀の井別荘の庭が素晴しい。
亀の井別荘は死ぬまでに一回は泊まりたい宿。
天井桟敷というのはこの旅館が経営してる喫茶店。中の雰囲気も良いし庭の景色も良い。
隣の亀の井別荘の土産物屋も良い品揃えで、よく自家製の柚子胡椒を買ってる。
由布院|亀の井別荘|天井桟敷 http://www.kamenoi-bessou.jp/tenjo/
あと、ウチの家族行き付けで湯布院行くと必ず寄るうどん屋がココ。
あ、九州ではうどんの基本は「ごぼ天」。ここも当然ごぼ天がオススメ。
田舎庵 - 由布院/そば [食べログ] http://r.tabelog.com/oita/A4402/A440201/44001717/
熊本
黒川温泉
全国的に有名。どの旅館もこだわりな露天風呂がある素晴しい温泉街。
個人的には「山みず木」の川沿いの露天が素晴らしかった。露天に入りながら手で触れそうなところに川が流れてるのですよ。
黒川温泉 山みず木 名湯・秘湯・立ち寄り湯300 http://www4.kcn.ne.jp/~t-yoko/74-kumamoto/74-kurokawa-yamamizuki.html
小国そば街道
かなりレベルの高いそば屋が田舎道になぜか集まってるところ。
一番有名な「戸無のそば屋」とか山の中っぷりが楽しい。
山の中だけど休日昼は一時間待ちとかにもなる…のでそば街道の他の店に行くのがパターンw
阿蘇小国郷そば街道 http://www.tonashinosobaya.info/
小国ジャージー牛乳
小国近辺なら道の駅とかで牛乳とか飲むヨーグルトは売ってる。
個人的飲むヨーグルトランク一位。すげえ濃厚。
ソフトクリーム | ジャージー牧場 カップル [阿蘇郡小国町 | ジャージー牛/牛乳/ヨーグルトレストラン/ランチ] http://websp01.com/couple/soft.html
やまなみハイウェイ
定番ドライブコース。
別府から阿蘇方面の移動時にはこの道を選択するように。
野焼きしてる牧草地帯があるので全般的に視界が開けていて景色が良い。大学のときにバイク買って初のツーリング目的地。
菊池渓谷
夏場でも涼しくて散策も快適。
何より水がめちゃめちゃ綺麗!
トップの写真が証拠写真。私が撮りました。
菊池観光協会 - 菊池渓谷は、日本名水百選です。 http://www.kikuchikanko.ne.jp/modules/group/index.php?cid=7
馬刺し
熊本に泊まるなら食うべき。まあホテルでも出ると思うけど…
市内に寄るならここは結構いい値段するけど馬肉尽くしで美味い!
馬刺し経験少なければ認識が変わると思う。
菅乃屋 上通店 すがのや - 通町筋/馬肉料理 [食べログ] http://r.tabelog.com/kumamoto/A4301/A430101/43000189/
いきなり団子
薄いモチモチな皮、でかいさつまいも、控えめな餡。
素朴で安いけど美味い!
熊本まわりのいろんなとこで売ってる。
おわり
こんなとこかなー。
ここらへんの地域でこの店が良いとかあったら指摘ください!
RubyKaigi2011で気になった事メモ
最後のRubyKaigiに行ってきました。
Ruby初心者の私としては最初で最後でしたが、本当に素晴しいイベントでした。
参加者の方、特に運営、発表者の方々は本当にお疲れ様でした。
よく知らなかった一昨年以前はともかく、去年はつくばで遠いからと行かなかったので凄い後悔です…
レポート:RubyKaigi2011 スペシャルレポート|gihyo.jp … 技術評論社 http://gihyo.jp/news/report/01/rubykaigi2011
レポートは素晴しいまとめが公式でまとまってるので、自分用すぐにでも押さえなきゃと思ったキーワードを自分用メモでまとめてみた。
Ruby初心者で、WEBプログラマ歴10年ぐらいなのですごく偏ってると思います。
lokka
herokuにデプロイできるクラウド環境向けCMS。打倒wordpress!らしいです。
クラウドを意識して作成してあり、例えばアップロードファイルの保存をDBにする等でスケールアウト時もちゃんと動くようになってるとのこと。
herokuや、後述するfluxflexで使えば簡単に無料で自分が好きにいじれるブログシステムができるので使ってみたい。
このブログlokkaに移行してみようかな…
Lokka - CMS for Cloud http://lokka.org/
ちなみに国産ですので日本語環境は当然安心。`
fluxflex
herokuやdotcloudのようなPaasで国産。
特徴的なのはOneClickInstaller。
前述のlokkaが用意されてたのでインストールして動かしてみました。
- twitterアカウントでログイン
- 管理画面でプロジェクトを作る
- lokkaを選んでインストール
え?これだけ?って手順で動きました。
凄いのが価格。FREEでも3プロジェクト作れるんだけど、当然有料もあります…がなんと月額1$と9$!9$でSUPER GEEKプランっで50プロジェクト作れるとかwww
EC2ベースなので、当然QUOTAはリソース毎にありますが、それにしたって安い。
ほとんどはそんなにリソースを使わないものばっかりなんでしょうけど、これでペイするのかちょっと心配。
上記でインストールしたlokka - http://u1tnk-lokka.fluxflex.com/
fluxflex https://www.fluxflex.com/
gem
Gemも気になったのがあるけど、ほぼ以下のサイトで紹介されてたので手を抜いて概要だけ
#RubyKaigi 2011で気になったgem 13選 - 床のトルストイ、ゲイとするとのこと
http://d.hatena.ne.jp/mirakui/20110718/gems_in_rubykaigi2011
Fabrication, factory girl, machinist
fixture代替のテストデータ作成機能。
普通のRubyistなら常識のようですが個人的に--よくわかっていなかったので。
Fabricationが最後発で高機能らしい。
factory_girl | RubyGems.org | your community gem host http://rubygems.org/gems/factory_girl
machinist | RubyGems.org | your community gem host http://rubygems.org/gems/machinist
fabrication | RubyGems.org | your community gem host http://rubygems.org/gems/fabrication
mike, Capybara-webkit
Integration TestでJSも動かした上でテスト可能。
両方ともheadless(画面描画しない)ので高速らしい。
Capybara-webkitは
Ruby を利用した大規模ウェブサービスの開発・運用 – RubyKaigi 2011 発表資料 « クックパッド開発者ブログ http://techlife.cookpad.com/2011/07/19/rubykaigi2011/
でクックパッドで使用していると紹介があったので十分な実績あり。
mikeはV8でJSを動かしていて高速とのこと。
webmock,fakeweb
HTTPレスポンスのモックライブラリ。外部連携のテストに便利とのこと。
小ネタ
(追記あり)最高に便利なGoogle IME SKK サーバをAquaSKKでも落ちないようにしてみた
Google IME SKK サーバでOSが固まった…
ここ一年ほど会社の同僚の変態ギークにそそのかされて、SKKを愛用しています。
もちろん気に入って使ってるんですが、GoogleIMEの圧倒的な語彙に羨望を覚えていたのも事実。辞書だけでも使えねーかなーと常々思ってたら…
Google IME SKK サーバー 作った - hitode909の日記
id:hitode909さんが作成してくれました!SKKのままでGoogleIMEの語彙!これはすげえ!
「秋山澪」も「花京院典明」も「僕と契約して魔法少女になってよ!」も一発で変換できるぜッ!
長文一発変換とか全然SKKらしく無いけど、どっちもできるのが最強だろッ!ヒャッハー!
…あれ、「かおもじ」を変換した途端見たくも無いレインボーカーソルが…しかも何分経っても止まらない…ああ…orz
原因調査
変換する度にGoogleにリクエストを投げるのでネットワークが不通な場合に変換できない,また,AquaSKKを使っているとOSがフリーズする
Rubyのプロセスが何かしたくらいではOSがフリーズしないと思うので,AquaSKKに変な入力を渡すとだめみたいだけど,よく分からなかった
おいおい、強制終了させりゃあ動くんだろとか甘く見てたら「IMEが止まってて入力も出きないから強制終了もできない」ウボァー…
これはキツい。タッチパッドぐらい使わせてくれよ…
で、調査。電源ブチ切って再起動後に同じく「かおもじ」でフリーズ。
再現率100%です。本当にあり(略
まあGemってことはRubyのソースあるはずだし、ちょっとソース見てみるか。お、これは意外と短かい。google-ime-skk/google-ime-skk.rb at master · hitode909/google-ime-skk · GitHub
ああ、Net::HTTPで取得してんだ、あータイムアウトとか無いからここらへんで固まってんのかな?「かおもじ」とか候補多そうだしね。
と思ってログ入れてみたところ違いました。顔文字の変換候補が4つしか無い…
原因判明
結局は原因は文字コード。
ま た お ま え か
skkservの通信にeuc-jpを使用しているため、「かおもじ」を変換しようとすると☹をeuc-jpに変換しようとして、euc-jpには対応する文字コードが無いため、
#
が発生していた…というオチ。
最近utf-8ばっかでこういうのも見なくなったけど、skk昔からあるもんな…
固まる原因は、おそらく例外時に変な文字列をAquaSKKに返してAquaSKKが解釈しようとして固まるんだと思います。
修正内容
施した対策は以下。
- 変換失敗しても?に無理矢理変換するようにした。
- bigin-rescueつけてリクエスト時に例外発生しても空文字を返すようにした。
- read/open_timeoutつけて固まらないようにした。
変換だからタイムアウトは短かめに1秒。そもそもこれ例外返すと固まるみたいなので例外処理入れてエラーが発生したらとにかく空文字返して、「単に辞書にありませんでした!」って挙動にした。これで安心安心。
以下変更点のdiff。
ソースはここgoogle-ime-skk/google-ime-skk.rb at master · u1tnk/google-ime-skk · GitHub
diff --git a/lib/google-ime-skk.rb b/lib/google-ime-skk.rb index 8593c9e..fd8bc41 100644 --- a/lib/google-ime-skk.rb +++ b/lib/google-ime-skk.rb @@ -17,7 +17,7 @@ class GoogleImeSkk < SocialSKK def encode_to_eucjp(text) if String.new.respond_to?(:encode) - text.encode('euc-jp', 'utf-8') + text.encode('euc-jp', 'utf-8', {:invaild => true, :replace => '?'}) else require 'kconv' Kconv.toeuc(text) @@ -30,10 +30,19 @@ class GoogleImeSkk < SocialSKK uri = URI.parse 'http://www.google.com/transliterate' http = Net::HTTP.new(uri.host, uri.port) http = Net::HTTP.new(uri.host, uri.port, @proxy.host, @proxy.port) if @proxy - http.start do |h| - res = h.get("/transliterate?langpair=ja-Hira%7Cja&text=" + URI.escape(text)) - obj = JSON.parse(res.body.to_s) - encode_to_eucjp(obj[0][1].join('/')) + begin + http.read_timeout = 1 + http.open_timeout = 1 + http.start do |h| + res = h.get("/transliterate?langpair=ja-Hira%7Cja&text=" + URI.escape(text)) + obj = JSON.parse(res.body.to_s) + encode_to_eucjp(obj[0][1].join('/')) + end + rescue => e + p e + return "" end end end<del></del> :
正直大した修正はしてないけど、OSが固まるのは致命的過ぎるから役には立つはず!
と産まれて始めててのpull requestを送ってみた。id:hitode909さん、取りこんで頂けると助かります。
あ、待てない方はgemのインストールパスに行って、上記のファイルを修正or上書きすれば問題無く動きますので良かったらお使いください。
まとめ
これで単文節変換に加え、長文一発変換も可能なキモ素晴しいSKKが安心して楽しめますね!
長文はともかく、固有名詞とかはマジに便利なのでお試しください。長文入れる前に細かく変換すればちょっと辞書の豊富な普通のSKKとして使えますしね。
速度が心配な方もいると思いますが、私の環境は自宅ADSL、さくらのVPSにskkサーバ立てて試してますが、たまに引っ掛かるかな??という程度で普通に入力しています。もちろん今も使っていますので、是非一度使ってみてください!
追記
早速修正を取りこんで頂きました!
Google IME SKK サーバーを更新 - hitode909の日記
Google IME SKK サーバーをAquaSKKで使うとたまにOSがフリーズするバグが直りました.
とのことなので、普通にgem install/updateすれば上記の修正が取り込まれててます。
しかし、深夜のpull requestして朝起きたら、返信きてて、mergeされてて、gemの更新されてて、ブログ書いてあって…仕事早い!
id:hitode909さん迅速な対応ありがとうございました!
VLCのスキップ(フラッシュ)機能を侮ってた…
VLC Media Playerで動画を見るときに役立つショートカット厳選9個 - 凡人プログラマのエントリですげー便利な機能として
opt + cmd + → 10秒スキップ(→だけ複数回押すと押した数×10秒スキップ)
opt + cmd + ← 10秒前へ戻るスキップ(→だけ複数回押すと押した数×10秒スキップ)
を紹介しましたが、実は他のキーでもっと細かい制御ができることが判明!
shift + cmd + → 1分スキップ(→だけ複数回押すと押した数×1分スキップ)
shift + cmd + ← 1分前へ戻るスキップ(→だけ複数回押すと押した数×1分スキップ)
ctrl + cmd + → 3秒スキップ(→だけ複数回押すと押した数×3秒スキップ)
ctrl + cmd + ← 3秒前へ戻るスキップ(→だけ複数回押すと押した数×3秒スキップ)
押し間違って気づきましたよw
これで更に便利ですね!