Monthly Archive for March, 2007

taskMapの紹介screenCastをYouTubeに

アップしました。


作成には、

を使用しました。2時間くらいの作業でした。

Mac OSXで使えるキャプチャソフトは、SnapProXやiShowUといった商用のものが有名どころのようです。 今回は、ちゃちゃっとつくってさっさとアップしたかったので、フリーのものを探してCapture Me で済ませました。

Capture Meには、

  • 1度に60秒しかキャプチャできない
  • マウスポインタが記録されない

といった点があります。 もっとばりばりとscreenCastをするようになれば、商用のものを検討してもよさそうです。

キャプチャした素材をiMovieに放りこんで、クリップをつないでタイトルをつけて共有 → Quicktime → CD-ROM とすると、YouTubeへのアップロードに適した形式になるみたいです。

YouTubeに投稿するのは初めての体験でした。存外簡単にアップできるのですね。 若干のタイムラグがあるのは、致し方ないところでしょうか。

リサとガスパールのおかいものエコバッグ

img_2967.JPG

来ました。到着まで2〜3週間とあったのですが、1週間もしないうちに届きました。 これで快適素敵なエコライフを送るのです。


Pasconet

taskMap 0.1.0

cartesianTaskを公開してみます。 ほんとまだまだの出来なんですけれど、公開することに意味があると思うので。

既知のバグがたくさんあるので、多少のことには目をつぶれる寛容な方のみお試しください。

cartesiantask専用ページ → こちら

(x,y)の属性 → Note

どうやって(x,y)の値を保持するか? と考えた結果、各TaskのNoteを用いることにしました。

  • すべてのTaskに(taskMapX, taskMapY)という2つのタイトルのNoteを追加します。
  • taskMapを試して、もういいやと思ったら menu にある reset を押してください。

注意事項

  • 初回起動時がもの凄く遅い (すべてのTaskにNoteを加えるため)
  • resetがものもの凄く遅い (すべてのTaskからNoteをはぎとるため) 。タイムアウトしてしまうと、いくつかのTaskにNoteが残ったままになってしまう場合がある

懸念事項

すべてのTaskのNoteにアクセスを行うため、RTMから怒られるかもしれません。 RTM APIの注意事項には、平均して1秒間に1回のAPIアクセスにせよとあるので。

このへんは、0.2.0リリースあたりでうまく解決する予定です。

関連エントリ

追記

  • 公開してから6時間で22アクセス、少しでも試して頂いた人は2人。
  • 1日たち、69アクセス、試して頂いた人は12人。

cartesianTask

cartesianTask は、Remember the MilkのTaskを二次元座標にドラッグアンドドロップで配置することにより、重要度や緊急度をひとめで分かるようにするものです。

旧名称 : taskMap

紹介ビデオ

YouTube::cartesianTask introduction

更新情報

0.1.0 を公開しました。

免責

自分ではたくさんテストを行っていますが、いかんせん1人で行っているので漏れがあると思います。

TaskやListを消したりはしませんが、Noteのadd/deleteは行っています。 cartesianTaskの管理外のNoteは触れていませんが、万が一NoteやTask、Listが消失しても勘弁してください。

2007.05/26 追記

taskMapという名称は、商標登録されているとのことなので、名前を変更しました。 taskMap → cartesianTask

rtmProgress 復活

ここ数日、rtmProgressがダウンしていましたが、復活させました。

ダウンしていた理由は、rtmProgressがbackendで用いているrtmilkというライブラリのバージョンを0.3.0に上げたからです。rtmilk 0.3.0 では、それまでのバージョンとの互換性をぶったぎってしまったので、rtmProgressが動かなくなってしまっていたという不恰好な顛末でした。

契約による設計 in C++

オブジェクト指向入門 第2版 原則・コンセプト を読んでいます。 契約による設計という考えに触発され、自分でもやってみようと思いたちました。

単純なマクロ

さっそく、C++でやってみようということで、

#define REQUIRE
#define ENSURE

といった空マクロを用意しました。

int square10(int x) { // 10 以下の正数のみを対象とする二乗関数
  REQUIRE {
    assert(0 < x);
    assert(10 > x);
  }

  int ret(x * x);

  ENSURE {
    assert(x == sqrt(ret));
  }
  return ret;
}

と、一応は書けます。

しかし、本来ならヘッダファイル内の宣言に含めて インターフェイスとしてクライアントに提示したいものです。 さらに欲を言えば、Doxygenなどで自動的に抽出してほしい。

実現のために

  1. それぞれの関数の入口/出口に、制約条件をチェックするhookを仕掛ける
  2. 制約条件を関数/クラス宣言内に書ける
  3. Doxygenのタグを拡張

といったことが必要になりそうです。

1を実現するには、auto変数をうまく利用すればいいんじゃない? と思いました。 2を実現するには、それぞれの制約条件を表現するクラスを、クラス内クラスとして定義すればよさそう。 3はどうしたらいいんだろう…

NDEBUG環境では、制約条件のオブジェクトを生成しないように、マクロを使えばよさそうです。

#include <cassert>

// constrain macro.
#ifdef NDEBUG
#define CONSTRAIN(method)
#else // NDEBUG
#define CONSTRAIN(method) 
   method##_constrain _constrain(*this)
#endif // NDEBUG

class Bird {
public:
   Bird() : // awake and not flying at first.
      flying_(false),
      sleeping_(false) {}

   void fly() {
      CONSTRAIN(fly);
      flying_ = true;
   }

   void sleep() {
      CONSTRAIN(sleep);
      sleeping_ = true;
   }

   friend class fly_constrain;
   friend class sleep_constrain;

private:
   bool flying_;
   bool sleeping_;

   // ----------------------------------------------------------------
   // constrains
   class fly_constrain {
   public:
      fly_constrain(Bird &b) : bird_(b) {  // requirement
         assert(false == bird_.flying_);
         assert(false == bird_.sleeping_);
      };

      ~fly_constrain() {                   // ensure
         assert(true == bird_.flying_);
         assert(false == bird_.sleeping_);
      }

   private:
      Bird &bird_;
   }; // fly_constrain

   class sleep_constrain {
   public:
      sleep_constrain(Bird &b) : bird_(b) { // requirement
         assert(false == bird_.sleeping_);
         assert(false == bird_.flying_);
      };

      ~sleep_constrain() {                  // ensure
         assert(true == bird_.sleeping_);
         assert(false == bird_.flying_);
      }

   private:
      Bird &bird_;
   }; // sleep_constrain

}; // Bird

// test
int main(int argc, char *argv[]) {
   Bird piyoko;

   piyoko.fly();
   piyoko.sleep(); // cannot sleep while flying !

   return 0;
}

実行結果

% c++ -Wall -g dbc.cxx
% ./a.out
dbc.cxx:57: failed assertion `false == bird_.flying_'
zsh: abort      ./a.out

鳥は飛びながら眠ることはできないという制約にひっかかっているの図です。

まとめ

C++でも契約による設計は実現できそうです。 しかしC++らしく手間がやたらとかかると。 CONSTRAINマクロは、メソッド名を自動抽出できればもう少しうまく書けそう。

他にも良いアイデアがあればぜひ教えてください。

参考リンク


オブジェクト指向入門 第2版 原則・コンセプト
バートランド・メイヤー 酒匂 寛
翔泳社 (2007/01/10)
売り上げランキング: 13136
おすすめ度の平均: 5.0
5 オブジェクト指向の基礎からみっちり学べる

rtm.lists.delete が追加された

Remember the Milk APIの話題。

これまで、rtm.lists API にadd はあるのに delete がありませんでした。 何が問題かというと、テストが書きづらいということです。 UnitTestで、setup/tearDown にて List の add/delete をしたいわけですが、これまではできませんでした。 なので、addしたListをあとでRTMの設定画面から手動で消して回らなければならないという手間がありました。

request for rtm.lists.delete にて、delete追加してよー、とお願いしてみたら、さっき「追加したよ」と返事があり、さっそくAPIのページを見にいってみたらちゃんとありました。

ゆってみるもんだなぁと感じたというお話でした。英語重要。

Typo -> Wordpress

これまで、長いあいだTypoというBlogエンジンをつかっていたのですが、思いきってWordpressに乗り換えました。 合わせて、MySQLdも4.1 -> 5.0.33 にアップグレードしました。

Motivation

なぜ乗り換えたかというと。

  • Typoがあまりに動作が緩慢だったから
  • めっちゃメモリを食うから
  • どうも開発が滞っているようだから
  • unstable感がいつまでたっても拭えないから
  • MySQL4.1のrootパスワードを壊してしまったから

Typoにもいいところはあって。

  • Live Search
  • Railsの勉強になる

しかし、Wordpressをつかってみると、その完成度の高さに気付きます。

  • テーマ多い
  • 動作速い
  • 管理ページの統一感

乗り換えにつかったツール

Automatic migration from typo to WordPress

Typoのdbをwpのdbにロードして、migartion SQL を走らせるだけ。とっても簡単だけど、見事にmigrationに成功しました。

インストールしたプラグイン