2013-05-23

今更canvas使った描画やってみた


昔から画面に描画する系の事をやってみたかったので、ちょうど良かったからcanvas使って色々書いてみたよ。

hello world

その1

ハートのドット絵を根性で描いてみた。それを1コマ1コマ横と縦にずらしてアニメーションさせてる。
アニメーションさせるときは、setIntervalとか使うコードを良く見たけど、あとで出てくる最適化の話の通り、requestAnimationFrameと使ってみてる。




その2

それを画像として書きだして表示してみた。次に続く。




その3

画像をくるっと回してぴよんっと止めてみた。なんで画像かというと、Rectで矩形描いてきっちり並べたハートをそのまま回そうとしたら、斜めになった時隙間が空いちゃって、キレイなハートじゃなくなってしまったから。
後はプリレンダリング的な最適化処理にもなって良いらしい。




その4

回したり縮小〜拡大してみた!
回すのは画像座標の左上からぐるぐる回ってしまうので、座標を毎回中心で回るようにずらす必要がある。詳しくはソースコードを見てみてください!なるほどって感じ。




arcを使ったartっぽい描画やってみた

tumblrで似たようなGIFアニメ見つけて、試しに作ってみたら結構それっぽく動いた!jsdo.itのhot codeとかにもあがってちょっと嬉しかったよ(*´ω`*)



ただまぁすごく重かったわけです。描画中はしばらく見てるとPCのファンが回りだしてしまったり、iPhoneとかで見るとホッカイロとして活用できるようになります。

で、HTML5 canvas のパフォーマンスの改善という記事を見つけ、これを見ながら頑張ってパフォーマンス改善してみました…!!

改善その1

まぁつまりは動かない背景までアニメ書いてたら大変てのと同じで、動いてない背景まで毎回書き出してたわけです。
それをcanvasタグを2つおいて、position: absoluteで重ねる事でcanvasのレイヤー化をやってみました。



これだけでかなりパフォーマンスは改善したのですが、まだなんか出来そう。
そして次です。


改善その2

次は、描画する指定座標に浮動小数点を使うを重くなるっていうのを直してみました。
ぐるぐる回る点は、単純にMath.cos, Math.sinで指定した座標なのでお構いなしに浮動小数点を使いまくっています。
なので、座標指定するところを

(浮動小数点座標 + 0.5) | 0

というビット演算を使って丸めてみました。あとから仕組みを調べたら頭の良い人は世の中に沢山いるんだなぁという感じでした。恩恵に預かります。。

で、直したのがこれ。



小数点を丸めちゃったらなんかガクガクしちゃったりしないかなーと思ったのですが、人間はそんなに目が良くなかったみたいで見た目も問題ありませんでした。
そして全然ファンが唸らないww


まとめ

色々描画すんのめっちゃたのしい!
最適化とかも、このあとしばらくやってみていて、教えてもらったLUTみたいな前処理をいれてみたり(ブラウザ落ちたw)、var sin = Math.sinみたいに参照が軽くなるみたいな細かい事をやってみたりしていました。

今回、円弧を描くようなアニメーションをさせるときに、sin, cosとかθとか数学でやったわーっていうのを久々に思い出して、それを扱えてるのがなんだか楽しかったです。

最近おすすめされたBeyond InteractionっていうOpenFrameworksの本を読んでるんですが、canvasではないが、これには図形の描き方の初歩から書いてあるので結構勉強になる。

何を目指してるんじゃwwって感じですが、まぁ現状は趣味程度に色々作って遊んでみますね^^


2013-05-11

「UPを使い始めてから、女の子にモテ始めたし、宝くじもあたるしウハウハですよ」渋谷系Webエンジニア 27歳


UP by Jawboneを買って2週間くらい経ったので感想とかよく聞かれるのでブログに書いてみますね。タイトルは心無い友だちが考えてくれました。

UPってなんなの?

手首につけて日々の活動や睡眠時間を管理したりできるライフログガジェット。防水性なのでそのままシャワー浴びれます。
詳しい説明とかはappbankさんの記事見るといいかも。
Jawbone UP: 手首に装着するだけ! iPhoneアプリで健康管理できる注目のアクセサリー!!

なんで買ったの?


似たようなのにFuelbandfitbitがあります。
Fuelbandはカッコイイし、Nike+も使ってランニングしてるので良いなーと思ってましたが、時計を2つつけることになってしまったり、バッテリーの持ちがそんなに良くないぽい。あと睡眠状態が取れなかったり。
fitbitはあんまり周りに使ってる人がいないからわからないのだけど、ガジェットがクリップ式なので、付け替えたりめんどくさそう?よくわかりません^q^

それに比べれば(おしゃれかどうかはおいておいて)アクセサリーとして手首に付けられるし、風呂でも外すことなく使えるので、24時間、バッテリーも持つ10日間ずっとつけっぱなしでいられます。
UPはライフログ系のガジェットとしてつけっぱなしにできるってのが手間がなくて良いかなぁという印象。少しでもめんどくさいと途中でやめちゃいそう。

どんな使い方してるの?

1日の目標に向かって活動していく


UPの初期設定では、1日の活動目標が決められています。大体おすすめの6時間睡眠と10000歩を目標にしておけば十分ぽいのでそのまま使ってます。
真ん中の"Did you know?"には、過去の自分のログを元にUPのアプリが睡眠時間や活動についてアドバイスをくれたり、警告してくれたりします。(現在は英語のみ)

とある平日の日中の活動記録

一日の歩いた歩数や運動の記録を残してくれます。記録は結構正確で、下記URLのグラフでは朝の通勤、ランチタイム、帰ってからのランニングなどがグラフ化されています。
https://jawbone.com/up/activity/moves/BXM3Lg0tIY3HR3_W57NZAQ

・ストップウォッチモード

ランニングやジムでのウェイトトレーニングではストップウォッチモードを使って、正しく活動時間を区切って、後からアプリでどんな運動をしたか設定できたりします。ちゃんと運動したってログをつけると、ただ歩いた時より目標達成しやすいかも。

・アイドルアラート

普段デスクに座ってる時に1時間とか設定した時間動かないでいると「ご主人!動いたほうがいいですぜ!」っていうアラートで運動を促してくれます。
集中してる時に、だんだんパフォーマンスが下がるのを防げたりして、個人的には好きな機能。

とある平日の睡眠記録

寝る前にUPについてるボタンを長押しすると睡眠モードに代わり、それから寝れば記録が開始されます。(あとから手動でも入れられる)
下記リンクのグラフではちゃんと6時くらいに起きたのに2度寝に突入、UPに設定してあった目覚ましで起きて、モードを切り替えずに横になりながらアニメを見ていたことがわかります。
https://jawbone.com/up/activity/sleeps/BXM3Lg0tIY2OSx7HV78x9w

目覚まし機能が結構良くて、深い眠りと浅い眠りを記録してくれている中でも、ちゃんと浅い眠りの時にバイブレーションで起こしてくれるので心なしか気持よく起きれます。

・パワーナップモード

もう一つ、パワーナップ(昼寝)モードってのがあって、まだ会社で使ったことは無いんですが決まった時間内でほんとにちょうどよい時間まで寝かせてくれるので重宝しそうです。(最大睡眠時間の設定もできる)


API連動でもっとself-hack!


最近UPがAPIを公開したので、ランニング情報を記録できるRunKeeperやアプリ連動した体重計のWithingsなどと連携できるようになりました。

個人的に熱いのはWithingsとIFTTTで、Withingsは毎日の活動にプラスして、体重と体脂肪がUP上に記録されていくのは比較しやすくてすごく良いと思ってます。(もうすぐ届く)
IFTTTは10000歩歩いたらtwitterに投稿したり、Evernoteに記録してほげほげしたり、レストランにfoursquareでチェックインしたら食事した記録をとってくれたり…APIを直接使わずともいろいろできそうなワクワクサービスです。


まとめ

最近身体を鍛えるのが趣味なんですが、UPを使ってさらにそれが助長された感じです。
一日のふとした時にUPをアプリに同期させて(ここまで書いてないけどイヤホンジャックをiPhoneに刺すだけで同期できる!)、「やべ、今日あんまり動いてねーな。筋トレするか。」とか、睡眠時間を見れるので「最近ちゃんと寝れてないし、今日はもう寝ようかしら」とか思えるようになったのは実はすげーいいことだなと感じております。

買うときの注意点はサイズを間違えると悲しくなりそうなので、ちゃんと調べてから買うのをおすすめします。
この記事を参考にするといいかも。ただ、買ったばかりの時はちょっと締め付けられる感じがしますが、つけてると少しゆるくなっていくので少しくらいきつくても時期に慣れると思います。

買ったのはこちらです。
色は汚れると嫌だから黒で、手首めっちゃ細いのでSサイズ。Withingsは新しくなってWS-30て型番でbluetooth対応したらしいのでそっちを買ったお。

2013-05-08

JavaScript環境性能比較してみた - indexOf と RegExp の速度比較 (2013/05/08版) +α

















JavaScript初めたばかりで、やっと正規表現に出会ったので速度比較とかやってみたく色々調べてたら下記サイト様を見つけました。大変参考になりました!ありがとうございます。

indexOf と RegExp の速度比較

これが2010/03/30の記事でしたので、サクッと2013/05/08版をやってみた次第でございます。二番煎じ企画。乙!!

ベンチマーク

ベンチマーク用のhtmlベタ書きのJavaScriptソースはこんな感じで実装されています。ボタン押すだけ。

今回はChromeと同じV8で動いているNode.jsでも試してみたのでそちらのソースはこんな感じ。


結果

PCブラウザ+Node.js

グラフの番号は 
(1)indexOf : str.indexOf('item:9999')
(2)静的な正規表現 : /item:9999/.exec(str)
(3)動的生成の正規表現 : new RegExp('item:9999').exec(str)
(4)正規表現 : /item:9999$/.exec(str)
となっています。

Figure 1. PCブラウザとNode.jsの正規表現性能比較

Chromeェ…すげぇ…。4に関しては1msとかでした。
マジか…。

おまけ:iOSでの比較


Figure 2. iPhone標準ブラウザとアプリ内ブラウザの正規表現性能比較

こちらはちょっとおまけで調べたiPhoneでの性能比較。
アプリ内ブラウザにはChromeのiOS版を使ったんですが、Chromeって名前なだけなんですね。。というかAppleのネイティブにブラウザ埋め込んだアプリ締め出しの裏構図が見えてコワイ。。。


まとめ

Node.jsでの性能が知りたかっただけなんですが、色々やったら色々わかって面白かったです。
NodeはChromeと同じくらいのパフォーマンスがでるというのがわかったので、カリカリに作る必要がなければどんなやり方でも行けそうですね。
ただ、$つかった時みたいに明らかな正規表現をするときは速度に差が出るみたいなので、適時パフォーマンス見るのが良さそうです。

iPhoneの結果は面白いくらいアプリ内ブラウザ開発やる気見えなくてコワイですね。
ブラウザアプリラップしただけのネイティブアプリが、一時期締め出し食らったりしてるみたいですし、不便さが勝ってみんな撤退しろー…なんてことを考えてるんですかね?
くわばらくわばら。

Androidは貸してもらえなかったのでまた今度出来ればやります。

えっIE…?おや、誰か来たみたいなのでこの辺で。

2013-05-07

Node.js (express)で使うConnectみたいに使えるミドルウェアをつくる (UserAgent編)



express使ってて、Connectに代表されるbodyParser, session, cookiePerser, compress, errorHandlerみたいな、全ルート処理に対するfilterみたいな実装がしたくてメモ。
具体的に言うとuserAgent判別とか。

※あくまでやり方のメモ!実際の実装ではもっとちゃんとuseragent判定等を書く必要があります。

Connectって?


connect
https://github.com/senchalabs/connect

上記に書いたようなhttpServerの機能をexpressに提供してくれてるライブラリという認識。ひと通りnode.js入門してからgithub読めば大体分かる。readmeにMiddlewareに各種機能とその説明、ソースがある。

※参考
http://d.hatena.ne.jp/hokaccha/20110719/1311053590
hokaccha氏の読んでみた記事



何したいの?

express入門でおまじないのように書いてるapp.configure()内のapp.use()で使えるミドルウェアを自作します。



実装

使い方と作り方。使う方は適当です。

使う方


ミドルウェア(userAgent.js)


実際の処理はreturn function(req, res, next)辺りから始まって、next()を実行することで次のapp.use()のルート処理にexpressが引き継いでくれてる。

適当すぎて申し訳ないのだけど、ここではiPhone以外のUserAgentが来た時は302にstatusを変えてヘッダ変更後、next()しないでres.end()することでredirectしました。



2013-03-26

redisのデータ型の概要と利用例まとめ











RDBMSの代替としてredisを使うことになり、DB設計する上で考慮すべき型の概要と利用法をまとめる。
間違いやもっと良い使い方があれば教えてください^^


■String - 文字列型

・概要

1つのkeyに対して1GBまでの文字列を1つ持つことが出来る。基本。

・使いどころ

JPEGイメージ、シリアライズされたオブジェクト情報など単体で持つ時。
(他の型の基本になってるので、これ単体で使うと言うより応用する感じ?単体で十分なとき等で使う?)



■List - リスト型

・概要

文字列型のリスト。値を追加した順序が保持される。値は重複OK!
リスト前後からの出し入れ、リストの範囲指定での取り出し等の操作ができる。


・使いどころ

時刻または日付を保持するような情報。TwitterのTLの様な追加順に並ぶ一連のデータ。
要素の追加削除がリストの先頭や末尾(そうでない場合は適さない)に高頻度に発生する情報。追加順・時系列順のデータはリスト型に適している。


■Set - セット型

・概要

文字列型のセット。順番を持たないデータの集合。
重複の無い値、または重複をチェックする必要の無い値を格納するのに適している。
セットの検索、セット同士の比較、結合が出来る。

・使いどころ

集合計算を行うような集合した情報。タグ検索が有名。カテゴリに対するユーザーの属性集計などにも使える。



■Sorted set - ソート済みセット型

・概要

setの各要素にソート用の値(Score)を付けたセット。Scoreで自動的にソート。
Scoreは重複可能だが、setの各要素はセット型と同じく重複出来ない。
Scoreを評価して値を取り出す事ができる。Scoreのランキングも取得可能。

・使いどころ

ランキングのような機能を作るために生まれてきたんじゃないかくらい、ランキング作りやすい。
アクセスカウンタ、最新更新順表示など、特定の順序で参照される様なデータ。
※リスト型との使い分けとして、リスト型に対するSORTコマンドを高い頻度で使わなければならない場合は負荷が高くなるのでSorted setを使う。時系列ソートでなければこっち。


■Hash - ハッシュ型

・概要

1つのkeyに対して、field-value型のMapを格納する。
key名はもちろん、key内でのfield名も重複付加。key名が違う場合はfield重複出来る。


・使いどころ

会員情報など、ユーザー名・パスワード・最終ログイン時刻などの構造化されたフィールドを保持させたりできる。




それぞれにクセがあるのでMySQL脳から頭切り替えないとアカン。


※参考
公式日本語リファレンス - データ型
http://redis.shibu.jp/datatypes.html

ニコニコ生放送に見るRedis活用ノウハウ
http://gihyo.jp/dev/feature/01/redis


2013-03-14

expect.jsでNode.jsのテストで色々試した

Node.jsでBDD / TDDするときに必要なモジュール


テストを書くときにも便利なモジュールが沢山あります。
メインで使うのはJasmineとかも良く使われてるみたいだけど、visionmedia製のmochaが扱いやすい。

mocha上では色んなアサーション系モジュールが使える。
(調べたらAssertionは断言、断定するって意味だた。なるほど。)
基本はNode.js自体で持っているAssertで良いハズなんだけども、should.jsとかexpect.jsとかchaiとか色んなものがある。

それぞれはこんなふうに書ける。(requireとかは省略)

それぞれに特徴があって、どれ使ってもなんとかなる感じ。
should => きっと〜だろう。
expect => 〜だと予想する。
みたいに、こうあって欲しいなという英語が使われていて、英語がわかれば使いやすい作りになってる。(''.should.be.empty => ""は空でなければならない。みたいな)

今使っているのはshould.jsをベースにしたexpect.js。
クロスブラウザ対応してたりどんな環境でも特に問題なく動くそうだ。


expect.jsの使い方。


色んな使い方があるけど殆どはドキュメント見ればそのとおりに動く。

基本的な所だと

aはanにも出来るくらい自然言語に近く扱えるらしい。英語出来ないと恩恵ないけどw


ちょっと詰まったのでメモ。
複数のErrorをthrowしちゃうメソッドをチェックするときはちょっと工夫が必要だった。

引数によってthrow結果が変わる場合、そのまま
expect(targetMethod(null)).to.throwError(/param is empty/);
とか書きたくなるけど、これだとtargetMethodが実行されて普通にErrorがthrowされてテストが止まってしまう。

それを回避するためにクロージャを使ってErrorの出し分けをやってみたら上手く行ったわけです。

ただテストに慣れてないだけっていう噂もあるけど、JavaScriptでテストを書くときはexpect.js使って大体のことが出来そうです。

間違ってたり、もっと良い使い方、書き方があれば勉強中なので教えてください〜〜。
よろしくお願い致します。


2013-02-23

SpookyJS & mochaでnode.jsのクライアントサイドテスト

SpookyJS + Mocha


MochaはNode.jsでも動くJavaScriptテストフレームワーク。
SpookyJSとは、PhantomJSというHeadless Webkit(GUIのないWebkit的なもの)を、クライアントサイドのテストUtilityとして使えるCasperJSをNode.jsで使えるようにしたモノです。

やりたいことと構成

Node.jsのプロジェクト(express)上でMocha使ってやってるBackendのテストと一緒に、FrontendのテストもSpookyJS経由で行う。


経緯

この前試したZombie.jsがうまくいかないみたいなので別の方法を探したというわけです。。


やってみよう!!

Mocha

Mochaのインストールとか簡単なhello world



導入としてこのサイトも参考にしました。
http://d.hatena.ne.jp/hokaccha/20111202/1322840375
今回はassertionをshouldでやってるけど、元々使ってるのもあってexpectを採用してます。

PhantomJS

インストールはmacなのでHomebrew。
$ brew install phantomjs

実行とかは公式なQuickStartが良かった。
https://github.com/ariya/phantomjs/wiki/Quick-Start

CasperJS

こちらもHomebrewで。

$ brew install casperjs

APIなどはSpookyJSで使えるものと大体同じ、というかこちらが本家なのでAPIリファレンスをちゃんと見ておくと良いです。むしろSpookyの方にドキュメントが殆ど無い。。

http://casperjs.org/api.html#casper

SpookyJS 

インストールはnpmでできます。
$ npm install spooky

入れた時にnode_module/spooky/template?だったかにsampleがあったのでnodeコマンドで実行して試せます。

その他環境

SpookyJSでunderscoreなど必要みたいなので、package.jsのdependenciesをこんな感じで書く。

"dependencies": {
 "express": "3.0.6",
 "jade": "*",
 "mocha": "*",
 "expect": "*",
 "spooky": "*",
 "underscore": "*"
}


spookyHelper.js

ヘルパーを作っておいて、テストスクリプトから呼べるようにしておきます。



spookyMochaTest.js

spookyHelper.jsを使って、spooky + mochaを実現してるコード。



こっからは、SpookyJS(CasperJS)のAPIゴリゴリ使って、テストを書いてく感じ。
CasperJSの使い方については、また書けたら書きます。