2013年12月26日木曜日

enchant.js でもインスタンスがどのクラスから作られたか知りたい

enchant.js では JavaScript の一風変わったオブジェクトシステムの上にクラスの仕組みを実装しています。これはこれで便利なのですが、表題に書いた点は不満です。

JavaScript の処理系は、インスタンスがどのコンストラクタから作られたかを表示する機能があります。例えば、次のようなコンストラクタ Dog と Cat を宣言し、それぞれのインスタンスを作り、変数 dog と cat に代入します。

function Dog () {}
function Cat () {}
var dog = new Dog();
var cat = new Cat();

変数 dog と cat をコンソールで見ると、次のようにコンストラクタ名が表示されています。

enchant.js でクラスとして作ると、こうはなりません。同じようにクラス(のコンストラクタ)を作り、それらのインスタンスを作ります。

var Dog = Class.create(Sprite, {
  // 省略
});
var Cat = Class.create(Sprite, {
  // 省略
});
var dog = new Dog();
var cat = new Cat();

コンソールで見ると、(Google Chrome の場合)Constructor と表示され、どんなオブジェクトなのか判然としません。Safari では、Object と表示されるので、これまた判然としません。

ここはやはり、最初に見たように表示してもらえる方が、デバッグの時は助かります。特に、配列などのデータの中にしまった時の差は顕著です。

当座の解決策

結構根が深い問題で、JavaScript の限界とも言えます。

enchant.js の enchant.Class.create メソッドを次のように(赤字の部分を)書き足します。

enchant.Class.create = function(superclass, definition, constructor) {
    // 省略
    var Constructor = typeof constructor === 'function' ? constructor :
      function () {
          if (this instanceof Constructor) {
              Constructor.prototype.initialize.apply(this, arguments);
          } else {
              return new Constructor();
          }
      };
    // 省略
    return Constructor;
};

コンストラクタが匿名関数であると、このような現象が発生します。関数は後から名前を変えることができません。そこで、名前を付けた関数を作ってそれを引数として渡せるように、引数 constructor を追加します。constructor に関数が渡されたときはそれを使い、それでない場合は、従前通りに動作するように作ります。

使い方は、次のようになります。

var Dog = Class.create(Sprite, {
  // 省略
}, function Dog () {
  Dog.prototype.initialize.apply(this, arguments);
});
var Cat = Class.create(Sprite, {
  // 省略
}, function Cat () {
  if (this instanceof Cat) {
    Cat.prototype.initialize.apply(this, arguments);
  } else {
    return new Cat();
  }
});
var dog = new Dog();
var cat = new Cat();

一番最初の例と同様に、どのコンストラクタから作られたかが表示されるようになりました。

第三引数に、enchant.Class.create のはらわたの一部が出てしまっていて見苦しいのですが、この辺が限界のように思います。enchant.js が作るコンストラクタでは、initialize メソッドを呼んでいるので、それを手で書いてあげます。オリジナルのコンストラクタでは、else 句の方に new を付け忘れた場合の救済措置ではないかと推察されるコードがあります(違うかも)。Dog の例のように、その部分を省略しても動きます。心配性な人は、Cat の方のように全部書いてもいいでしょう。

enchant.js で定義されている他のクラスも、同じように書き換えれば、ちゃんとコンストラクタの名前が表示されるようになります。例えば、Sprite を書き換えるならば、次のようにします。

enchant.Sprite = enchant.Class.create(enchant.Entity, {
  // 省略
}, function Sprite () {
  enchant.Sprite.prototype.initialize.apply(this, arguments);
});

あんまりきれいではないですが、一応これでデバッグの苦痛が少し緩和されます。もっとこうした方がいい、などのコメントをお待ちしています。

2013年12月7日土曜日

ssh し続ける(要管理者権限)

あるサーバに ssh のコネクションを貼り続ける必要があったので、ちょっと設定してみました。

前提

ssh の設定(鍵交換によるパスワードなしのログインなど)は済んでいるものと仮定します。やり方が分からない人は、ググって調べてください。

設定

青で書いているところは、パラメータなので、適宜変更して使用してください。

/Library/LaunchDaemons/com.example.keeping-ssh.plist を次のように作ります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>com.example.keeping-ssh</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/bin/ssh</string>
                <string>example.com</string>
                <string>ping</string>
                <string>-i</string>
                <string>60</string>
                <string>127.0.0.1</string>
        </array>
        <key>KeepAlive</key>
        <true/>
        <key>UserName</key>
        <string>user</string>
        <key>GroupName</key>
        <string>group</string>
</dict>
</plist>

ファイル名は何でもいいですが、普通は plist の中の Label と同じ名前にします。自分のドメインを持っていない人は、com.example のままで特に問題はないです。肝心の設定項目としては、次の 3ヶ所です。

  • host は ssh でログインしたいホスト名です
  • usergroup は(ローカルの Mac 側で)ssh のプロセスを動かすユーザ名とグループ名です。普段 Mac にログインする時に使っているもので OK です。

ファイルを作ったら、このファイルのオーナーを root:wheel に設定し、launchd に読み込ませます(または Mac を再起動してください)。

$ sudo chown root:wheel /Library/LaunchDaemons/com.example.keeping-ssh.plist
$ sudo launchctl load /Library/LaunchDaemons/com.example.keeping-ssh.plist

ssh でログインした先で、自分に向けて定期的に ping を打って、コネクションを維持しています(ここら辺は、各自用途に応じて適当なコマンドを動かしましょう)。それでも切断されてしまった場合は、KeepAlive を指定しているので、launchd が自動的に再接続を試みます。ログアウトしていても、ssh のコネクションは維持され続けます。

launchd は色々やってくれるので、スクリプトを書かなくても設定だけで済んでしまいます。楽ちんです。

2013年6月30日日曜日

さらば Google Reader

サービス終了寸前! ニーズで選ぶ7つのGoogleリーダー代替候補
http://www.lifehacker.jp/2013/06/130630google_reader_seven.html

私は別の目的もあって、rss2mail を急遽作ったりしたのですが、結局何もする必要はなかったようですね。私は iOS の ByLine を利用していましたが、ByLine と Feedly の組み合わせで、これまでと何ら変わらずに(お気に入りに登録したものを含めて)RSS フィードを読み続けることができました。移行は非常に簡単で、ByLine Free をアップデートし、Feedly にログインするだけです。関係者のご努力に感謝したいと思います。

それにしても、これまでも Google のサービスで打ち切られたものはたくさんありましたが、これほど各方面から悲鳴が聞こえたのは初めてではないでしょうか。

2013年6月8日土曜日

Google Reader 問題 ── 私はこうした

Google Reader が 7月1日に終了するのは皆様ご承知の通りです。ニュースを見た直後に、代替の RSS リーダとして Livedoor Reader や Feedly なども試してみましたが、iPhone で ByLine を愛用していた私にはどうもしっくり来きません。「ま、3ヶ月もあるし、その間に誰かが何か考えるだろう」とタカをくくっているうちに、あと一ヶ月を切ってしまいました。

しっくり来ない原因は、「この記事、あとでゆっくり読みたい ── でも、お気に入りに入れるかどうかはまだ決めない」という操作ができないからです。ByLine はフリックで未読に戻せるので、やや不満ながら、この操作が出来ていました。

後継は自作スクリプトと Mailbox

結局、RSS フィードを読み込んで、自分宛にメール送信するスクリプトを書きました。Node.js で 200行程度です。これを cron で動かして、適当な時間に記事を回収し、自分の GMail アドレスにメールします。GMail のフィルタ機能を使って、受信したメールに [RSS] という感じのラベルを付けておきます。このまま、GMail を Google Reader の代わりにしてしまうというのも手だと思います。

Mailbox は、ご存じの方も多いと思いますが、シンプルな操作でメールをさばき、メールボックスを空にする、という新コンセプトのメールクライアントです。

メールとして受信した記事を Mailbox のフリック操作でさばいていきます。こんな感じになります。

読み捨てる記事は、長めに右フリックします。これでゴミ箱行きです。

お気に入りとして保存しておきたい記事は、短めに右フリックします。これで、GMail のアーカイブに入ります。

後でゆっくり読みたい記事は、短めに左フリックして、読みたいタイミングを指定します。あるいは、長めに左フリックして、To Read に入れても良いでしょう。ここは自分の好みで使い分けます。

これが Mailbox の最大の特徴です。日付を指定できるので、少し先のイベントスケジュールなども直前にリマインドするように設定でき、非常に便利です。

いくつか問題点も

現時点で認識している問題点です。

  • エラー処理とか、セキュリティとか、あまり考慮されていません。今はコンセプト検証を優先しています。
  • 一部、文字化けしたり、タイトルの中に変な空白が入ったりすることがあります。
  • うまく受信できない RSS フィードがあるようです。まだあまり調査できていません。
  • Google Reader は rssad のリンクを本来のリンク先に置き換えてくれていました。この機能が欲しいです。
  • RSS で配信される記事だけなので、出来の悪い RSS リーダと同じで、記事全文ではなく、ごく一部だけがメールされてきます。
  • Mailbox の問題だと思うのですが、HTML メールに埋め込まれた画像が小さくなります。iOS 標準のメールアプリでの表示と比べると一目瞭然で、半分くらいの大きさでしょうか(下の画像の左側が iOS 標準のメールアプリ、右側が Mailbox で表示したもの)。これは今後の改善に期待です。

今回はコンセプトだけのご紹介です。要望があればコードを公開するかもしれません。

2013年5月12日日曜日

日の出食堂: さといも麺(五泉市)

先日、当ブログで紹介させていただいたさといも麺ですが、ゴールデンウイークに帰省した折、日の出食堂へ立ち寄ることができ、念願の “さといも麺” を食べてきました。

日の出食堂は、JR磐越西線五泉駅から徒歩3分の場所にあります。鉄道旅行がお好きな方が、ちょっと寄るには絶好のロケーションです。公式サイトによると 3台駐車場があるそうです。付近は駐車場が少ないので、車でお越しの際はお気を付けください。


大きな地図で見る

さといも麺には、ラーメンタイプ、日本蕎麦タイプ、パスタタイプと様々なバリエーションがあります。欲張りな私が選んだのは、2種類のさといも麺が同時に楽しめる“つけ麺”です。さといも麺は茹でるのに少し時間がかかるようで、注文してからしばし待ちました。

麺が太い! 何も付けずに麺だけ食べました。すごいコシです! これはいける! 付け汁の方は、味噌味です。こちらもいい味です。某データベースで高い評価を受けてる都内の人気ラーメン店にも十分対抗できます!

麺を良く見ると、白っぽい麺と黒っぽい麺の 2種類が混ざっていました。2つの麺の違いは ── 私の舌では分かりませんでした(笑)。でも、どちらもおいしかったです。完食しました。ごちそうさまでした。

五泉市はブランドさといも“帛乙女”の産地で、日の出食堂はそれ以外の食材も五泉産にこだわった地産地消のお店です。安心して食べられる地元の食材だけで作られたおいしいお料理が食べられるお店が、ちゃんとこうして残っているのですね。とても嬉しくなりました。店主の柴野さんにご挨拶させていただきました。柴野さんはさといも麺があるじゃない会を主宰されています。他にも新潟名物“へぎ蕎麦”のさといも麺を提供するにのみやなど、市内13店で食べられますので、五泉市のお近くへお越し際には是非お立ち寄り下さい。鉄道で来られた方は、北五泉駅で下車し、五泉駅までのおよそ 2km をぶらりと歩きながら、さといも麺を食べてみるというのはいかがでしょうか?

新潟はラーメン激戦地の一つで、燕市を中心としたこってり背脂のラーメンや、新顔では、麺にモズクを練り込んだ出雲崎ラーメンなども出てきました。これからも応援していきますよ。

2013年5月1日水曜日

はじめての VPS

今まで dotCloud に Trac を建ててありがたく使わせていただいていたのですが、運営会社様から「sandbox flavor(無料)は終わりだ。おめーら金払いやがれ」と言われてしまいました。値段を調べてみると、Python が使える環境でメモリ 320MB を割り当てると、月々 $43.2 …。高っ! データを引き取って、dotCloud は退会することにしました。

サーバ難民となって、一番最初に辿り着いた先が、さくらインターネットのレンタルサーバ。これならスタンダードプランで月々 500円です。初期費用無料キャンペーンをしていたのも後押しになって、早速申し込みました。ちゃっちゃと Trac をインストールしてみると、重っ…。原因は分かってます。Trac を CGI で動かしているからです。対策としては、FastCGI か WSGI で動かせば OK ですが…色々やってみて、レンタルサーバではできないと判明。重たいのを我慢して使うか、別の手を考えるか…。

さくらインターネットでは VPS なら WSGI が使えて root も貰えて月々 980円(メモリ 1GB、HDD 100GB のプラン)。倍かぁ…と思いながらもまずはお試しと思って早速申し込みました。とはいえ、インターネットに露出しているサーバの管理をしないといけないのは、少々面倒ではあります。こちらにも Trac をインストールして、WSGI で動かします。快適に使えます。これなら問題ないです。

色々迷った末、Trac が重たいのは仕事に差し障りがあるので、VPS で運用することに決めました。サーバを管理するのも良い経験になるかもしれません。

2013年4月22日月曜日

さといも麺!

本日、午後 16:00-16:52 放送のL4YOU!『中村孝明が行く!新潟味紀行!』(テレビ東京)で、我らが五泉市の名物、さといも麺が登場するそうです。
恥ずかしながら、私もつい一週間くらい前に知ったのですが、さといも麺とは、五泉名物のブランド里芋 “帛乙女” を粉末にし、麺に練り込んだものだそうです。里芋 10kg を粉末にしても、わずか 1kg しか取れないそうで、大変な貴重品です。ラーメン、そば、焼きそばやパスタに練り込んでもよし、ということで、五泉市内の 13の店舗で様々なメニューが提供されているようです。
まだ食べたことないので、GW に帰ったら、絶対食べに行くぞ! 皆様もお近くへお越しの節は是非!

さといも麺リンク集

2013年1月26日土曜日

iOS オフィシャルウォッチ?

iOS 6 の時計が、スイス連邦鉄道のデザインと酷似しているという件で一時騒がれましたが、そんなにいいデザインの時計ならば、いっそ買ってみよう、ということで問題の懐中時計を手に入れました。iPad mini とともに記念撮影です。

MONDAINE の懐中時計、スイス連邦鉄道オフィシャルウォッチである証明書が付いています。クォーツの懐中時計で、手巻きではありません。デザインは秀逸で非常に見やすいですし、やや小振りな懐中時計で男女関係なく使えると思います。蓋付きのモデルもあります。卒業・就職シーズンを迎えますので、贈り物などにも使える一品だと思います。

ちなみに、私が楽天で探したときは「注文してみたら在庫なし」というお店が結構ありました。安いところではなく、納期をきちんと提示している信用できるお店から買った方がよさそうです。

わずか 9cm 、ポケットに入るボールペン LAMY pico も贈り物としておすすめです。

2013年1月17日木曜日

寒い季節でも朝から行動するために

今年は一段と寒さが厳しいですが、皆様はいかがお過ごしでしょうか。

当地群馬県前橋市は、夏は熱いことで有名ですが、冬もものすごく寒いです。あちこちを転々としてきた私も、こんなに寒いところは初めてです。「豪雪地帯」として知られる新潟県の最低気温を下回る日もかなりあります。新潟は、大陸の冷たい季節風が日本海で暖められ、それが上越国境の山々にぶつかって雪が降る土地なので、実はそれほど寒さは厳しくありません。群馬は上越国境の上空でキンキンに冷えた空っ風が一気に吹き下ろすので、非常に寒いのです。北側の部屋などは、夜は寝ていられないくらい寒くなります。

今年は 2年目ということもあって、対策として寒くなる前に “着る毛布” というものを買っておきました。巷では “ダメ人間製造器” とも言われており、これを着ているととても暖かいのです。おかげで、順調に部屋に引きこもる “ダメ人間” になっていったのですが…。

しばらくして、ふと気付いたこと。去年までは、朝、目が覚めても、エアコンのスイッチを入れてしばらくしないと行動できなかったのが、“着る毛布” があれば大丈夫です。ふとんから取り出した毛布を着ておけば、部屋があったまってなくても全然平気です。こうして、着る毛布は、“ダメ人間製造器” から、“朝の時間を有効活用するための必需品” になりました。

一つ難点を言えば、丈が長いので、トイレに行くときは脱がないといけないことですね…。