2012年7月29日日曜日

Bancha0.9.5 はCake2.1.5を食べるときにのむ。2.2.Xではない。

warningが出てるparseParamsでおきる+うまくいかない。Viewが無いとか言ってうまくいかない。。

(Cakeのバージョンがちがうよこれ。:後日談)


(後日追記):
CakeのDispatcherの実装がかなりかわってて
Banchaがそれにあわせて実装してあったからそもそも
うまく動きませんでした。よ。。。っていうオチです。

2.1.X系はDispatcherでinvoke呼び出しているからBanchaのinvokeが
呼び出されてバンザイなんだけど、

2.2.X系は_invoke呼び出されないし、それ以前にいろんなところで
関数のIF違うわなんだで動きません。

以下はリーディングした際のログ。
結局どうこういう以前のバージョン確認しろよお前。という
どうしようもなく目も当てられないミスを犯したのですが。。


疎通させている時の話

うまくいきません。うーまーくーいーかーなーいーよー。
帰宅後の僅かな時間しか取れない自分にとってほんのちょっとの疎通障害は
もうかなりきついのであーだこーだ言う前に急がば回れということで
ざっとソースをみてみます。。

warning発生箇所はBanchaSingleDispatchのparseParamsで第一引数はCakeRequestじゃなきゃダメだ。
みたいなこと言われてるっぽい。

perseParamのWarningは。。。

$dispatcher->dispatch($request, new CakeResponse(array('charset' => Configure::read('App.encoding'))), array('return' => true)), // second argument is expected to be overwritten by BanchaSingleDisptacher::_invoke

この第三引数のreturn=>trueが重要。
これは最後の方にBanchaSingleDispatchの_invokeで番茶用にカスタマイズしたロジックを
通らなくなってしまう。。
このarray(‘return’ => true)をrequest->param[‘return’]として追加する機構が
perseParamで行なっている

$request->addParams($additionalParams);

となります。。
さて、、、
ダンプしてみるとCakeEventがわたってきてる。
(これが例外のWarningの原因)

perseParamを追って見ることにする

grepしてみるとCakeのDispatcherのimplementedEventsに

return array('Dispatcher.beforeDispatch' => 'parseParams');

のようにあって、イベント名とメソッド名を結びつけているような実装がある。
もう一つはその設定のイベントを生成してコールしている部分ぽい実装として
BanchaDispatch::dispatch内の実装がある。
このBanchaDispatch::dispatchはbancha.phpから
呼び出されるBanchaの最初の関数(今後追加するブログのBanchaを使うところでも言っているけど)。

BanchaDispatch::dispatch内はというと、、

BanchaSingleDispach::がインスタンス化されて、そのBachaSingleDispatchのdispatchをしている。
BanchaSingleDispachはCakeのDispacherを継承しているので実際に呼ばれるdispacherはcakeのDispatcherになる。
基底Dispachでイベントが生成される(Dispatcher.beforeDispatch)。

(BanchaDispatch)  
public function dispatch(CakeRequest $request, CakeResponse $response, $additionalParams = array()) {  
    $beforeEvent = new CakeEvent('Dispatcher.beforeDispatch', $this, compact('request', 'response', 'additionalParams'));  

こんな具合で。。
ここで
CakeEventを生成してて、
ここに引き渡すのはそれぞれ、CakeEventクラスのメンバname、subject、dataに格納されるようです。。

CakeEvent->data = array($requestと$responseと$additionalParamsの配列)になる。。  

$beforeEventはEventManagerによってディスパッチされています。
イベント名で紐付けて呼び出されるみたい。。

(Dispach)  
$this->getEventManager()->dispatch($beforeEvent);  

EventManagerを掘り下げてみる。

このgetEventManager()はCakeEventManagerをインスタンス化して、
CakeEventManager->attach($this)になる。。。
この際の$thisはBanchaSingleDispatchになる。。。
BanchaSingleDispatch->Dispache->CakeEventListenerの継承関係だから。
attachのなかのif制御でinstanceof CakeEventListenerのになる
で、

(CakeEventManager->attach内)  
public function attach($callable, $eventKey = null, $options = array()) {  
   .....  
   $this->_attachSubscriber($callable);  

これが呼び出される。。callableはBanchaSingleDispatch。

attachSubscriberが呼び出される

この_attachSubscriber…は

(CakeEventManager->_attachSubscriber)  
protected function _attachSubscriber(CakeEventListener $subscriber) {  
    foreach ($subscriber->implementedEvents() as $eventKey => $function) {  
        $options = array();  
        $method = $function;  
        if (is_array($function) && isset($function['callable'])) {  
            list($method, $options) = $this->_extractCallable($function, $subscriber);  
        } elseif (is_array($function) && is_numeric(key($function))) {  
            foreach ($function as $f) {  
                list($method, $options) = $this->_extractCallable($f, $subscriber);  
                $this->attach($method, $eventKey, $options);  
            }  
            continue;  
        }  
        if (is_string($method)) {  
            $method = array($subscriber, $function);  
        }  
        $this->attach($method, $eventKey, $options);  
    }  
}  

となってて、implementedEventsは継承元のDispatcherとなるから
eventKey = ‘Dispatcher.beforeDispatch'
function = 'parseParams'
となる。

と、、
functionは文字列なので

$method = array( BanchaSingleDispatch, 'parseParams' )  

ということになる。
次にattachが呼び出されている。。。

attachが呼び出される

$this->attach($method, $eventKey, $options);  

この引数はそれぞれ、

$method = array( BanchaSingleDispatch, 'parseParams' )  
$eventKey = 'Dispatcher.beforeDispatch'  
$options = array()  

となる。。

(CakeEventManager->attach)  
   public function attach($callable, $eventKey = null, $options = array()) {  
    if (!$eventKey && !($callable instanceof CakeEventListener)) {  
        throw new InvalidArgumentException(__d('cake_dev', 'The eventKey variable is required'));  
    }  
    if ($callable instanceof CakeEventListener) {  
        $this->_attachSubscriber($callable);  
        return;  
    }  
    $options = $options + array('priority' => self::$defaultPriority, 'passParams' => false);  
    $this->_listeners[$eventKey][$options['priority']][] = array(  
        'callable' => $callable,  
        'passParams' => $options['passParams'],  
    );  
}  

listenerに登録される

ここでCakeEventManagerの_listenersに

['Dispatcher.beforeDispatch'][優先度][] = array('callable' => array(BanchaSingleDispatch,'parseParams'),'passParams'=>false)  

として登録される。
これでCakeEventMangerに登録される仕組みがわかりました。

今度は呼び出し側を追ってみます。

このdispatchの内容は
(CakeEventManager->dispatch内)

foreach ($this->listeners($event->name()) as $listener) {  
    if ($event->isStopped()) {  
        break;  
    }  
    if ($listener['passParams'] === true) {  
        $result = call_user_func_array($listener['callable'], $event->data);  
    } else {  
        $result = call_user_func($listener['callable'], $event);  
    }  
    if ($result === false) {  
        $event->stopPropagation();  
    }  
    if ($result !== null) {  
        $event->result = $result;  
    }  
    continue;  
}  

となってて、気持ちとしては'passParams === trueの制御が効いてほしいんだけど、
前述したように、_listenersにはpassParamsがfalseで登録されているから、
elseのほうに行って

$result = call_user_func($listener['callable'], $event);  

が呼び出されて、parseParamsの引数はCakeEventとしてよびだされているのではないか。

すこしだけ。Banchaを変更してみる。試しにperseParamをCakeEventを受け取る形のものを実装してみます。。

public function parseParams(CakeEvent $event) {  
    if (!empty($event->data['additionalParams'])) {  
        $event->data['request']->addParams($event->data['$additionalParams']);  
    }  
    return $request;  
}  

これだけど、そもそもCakeのDispatchの制御がそもそも違う。

Cake2.1.0だと
dispatchでthis->_invokeとコールされていて、そのさきはBanchaSingleDispatcherとなって
そのなかでreturnした結果をそのままdispatcherの戻り値として返却するからdispatcherとしての
制御ってそこで終わってた。。

Cake2.2.1だと
そもそも_invokeすら呼び出されていない氏ね。

で、ようやっとひと通りの大雑把な流れはつかめた

あれ?詰んだらしい。www
そもそもイベントリスナへ登録する時passParam =がfalseとして登録されてて、
途中どこにも更新される点がない点で詰んでる。

あれ?これはおかしくないかということで過去のソースを追ってみると
あ、あ、あ、あ、あ、あ
これならBanchaの_invokeも動くわな。。という実装。2.1.5で確認してみました。

このあたりの動きは そもそもこれはCakeの実装に依存している箇所だからね。
Cakeのバージョン2.1.0だとテストしたということ書いてあったけどね。
そりゃ2.2系はまだか。

お陰でBanchaと少し友だちになれましたww

ざんねん。
貴重な勉強時間がごっそりと削られました(まぁ、これも勉強になりましたが)。

2012年7月28日土曜日

JSDuckを触ってみた

JSDuckを利用してみる。

FaceBookで@martini3ozさんがシェアしてて
ググったら@kotsutsumiさんがTwitterで
質問に答えてて、
結果、こちらにお世話になりました。
さて何からすればいいのか。という取っ掛かりの部分、
とても助かりました。ありがとうございました。
チュートリアルを実施してみたので ちょっと残しておきます。

目指すゴール

左にメニューがあって 内容が切り替わる。と、 で、内容は都度MarkDownで作成できて任意に増やせればOK。

インストール

$ sudo gem install jsduck

ヘルプを見てみる。–helpで引いたら=fullつければ全て見れるってから全て見てみた。

$ jsduck --help=full                                                                                                                                                        12-06-18
Usage: jsduck [options] files/dirs...

-o, --output=PATH                Directory to output all this amazing documentation.
                                 This option MUST be specified (unless --stdout).
                                 Use dash '-' to write docs to STDOUT (only export).

    --ignore-global              Turns off the creation of global class.

    --external=Foo,Bar,Baz       Declares list of external classes.  These classes
                                 will then not generate warnings when used in type
                                 definitions or inherited from.

    --builtin-classes            Includes docs for JavaScript builtin classes.

    --meta-tags=PATH             Path to Ruby file or directory with custom
                                 meta-tag implementations.

    --encoding=NAME              Input encoding (defaults to UTF-8).

-v, --verbose                    This will fill up your console.

Customizing output:

    --title=TEXT                 Custom title text for the documentation.
                                 Defaults to 'Sencha Docs - Ext JS'

    --footer=TEXT                Custom footer text for the documentation.
                                 Defaults to: 'Generated with JSDuck {VERSION}.'

    --head-html=HTML             HTML to append to the <head> section of index.html.

    --body-html=HTML             HTML to append to the <body> section index.html.

    --welcome=PATH               Path to HTML file with content for welcome page.

    --guides=PATH                Path to JSON file describing the guides. The file
                                 should be in a dir containing the actual guides.
                                 A guide is a dir containing README.md, icon.png,
                                 and other images referenced by the README.md file.

    --videos=PATH                Path to JSON file describing the videos.

    --examples=PATH              Path JSON file describing the examples.

    --categories=PATH            Path to JSON file which defines categories for classes.

    --no-source                  Turns off the output of source files.

    --pretty-json                Turn on pretty-printing of JSON.

    --images=PATH                Search path for including images referenced by
                                 {@img} tag. Several paths can be specified by
                                 using the option multiple times.

    --link=TPL                   HTML template for replacing {@link}.
                                 Possible placeholders:
                                 %c - full class name (e.g. 'Ext.Panel')
                                 %m - class member name prefixed with member type
                                      (e.g. 'method-urlEncode')
                                 %# - inserts '#' if member name present
                                 %- - inserts '-' if member name present
                                 %a - anchor text for link
                                 Default is: '<a href="#!/api/%c%-%m" rel="%c%-%m" class="docClass">%a</a>'

    --img=TPL                    HTML template for replacing {@img}.
                                 Possible placeholders:
                                 %u - URL from @img tag (e.g. 'some/path.png')
                                 %a - alt text for image
                                 Default is: '<p><img src="%u" alt="%a"></p>'

    --export=TYPE                Exports docs in JSON.  TYPE is one of:
                                 * full     - full class docs.
                                 * api      - only class- and member names.
                                 * examples - extracts inline examples from classes.

    --seo                        Creates index.php that handles search engine traffic.

    --eg-iframe=PATH             An HTML file to use inside an iframe
                                 to display inline examples.

    --examples-base-url=URL      Base URL for examples with relative URL-s.

    --tests                      Creates page for testing inline examples.

    --stats                      Creates page with all kinds of statistics. Experimental!
と出力されます。

フォルダの配置を決めよう

作業用ディレクトリ作成
~/UserDir/jsducktest
としてみた。
出力用ディレクトリ指定
~/UserDir/jsducktest/release
としてみた。

テンプレートとなるhtmlを作成してみよう

index.htmlを作成して、下記を記載。
<h1>HELLO WORLD h1</h1>
<h2>HELLO WORLD h2</h2>
<h3>HELLO WORLD h3</h3>
<h4>HELLO WORLD h4</h4>
<h5>HELLO WORLD h5</h5>
<h6>HELLO WORLD h6</h6>
たったこれだけとしておく。
現在の状況
▾ jsducktest/
  ▸ release/
    .DS_Store
    index.html

※releaseはフォルダのみindex.htmlを作成してしてみる

ビルドしてみる。

  • 早速ビルドです。
    $jsduck -o ~/UserDir/jsducktest/release –welcome=~/UserDir/jsducktest/index.html
    ※パスはわざとフルパス指定にしてます。 ※作業用ディレクトリに移動してやると省略できてよいです。

できたらアクセス。

release配下のindex.htmlにブラウザからアクセスしてみます。
こんな感じになりました。

index.html(welcomeページのみ)

次に左のメニュー。

  • 作業用ディレクトリに「guides」ディレクトリを作成
    このディレクトリ配下のサブディレクトリごとにページを作るイメージです。 ですから、、、
「guides」にサブディレクトリを作成
このディレクトリ配下にREADME.md(これが本文になります)作ってあとでビルドして
リンクさせます。
ですので、subdir1,とsubdir2を作ってみました。 その中にREADME.mdを作っておきます。もちろんMarkDownで書いておきます。
現在の状況
▾ jsducktest/
  ▾ guides/
    ▾ subdir1/
        icon-lg.png
        README.md
        sample.png
    ▾ subdir2/
        README.md
  ▸ release/
    .DS_Store
    index.html
ツリーを作ります。
これはTreePanel用のオブジェクトリテラルを書いてあげるんですね。 作業用ディレクトリ直下にguides.jsonファイルを作って、、、下記のような内容で記載。
(guides.json)
[
    {
        "title": "RootNode",
        "items": [{
                "name": "subdir1",
                "title": "サブディレクトリ1",
                "description": "解説1"
            },{
                "name": "subdir2",
                "title": "サブディレクトリ2",
                "description": "解説2"
        }]
    }
]

ビルドしてみる(オプションを別ファイルにしてみる)

早速ビルドです。今度はヘルプにのっている様に、他のパラメタも。 たくさんのオプションが増えてきたので別ファイルで記述してみます。 json形式でオプションを設定して–configで設定します。
(jsduck.jsonの内容:ファイル名は任意)
{
    "--title": "jsducktest!!!",
    "--guides": "guides.json",
    "--welcome": "index.html"
    "--footer": "footer!!!",
    "--head-html": "head",
    "--body-html": "body"
}
ビルドしてみる
jsduck -o release --config=jsduck.json 

できたらアクセス。

release配下のindex.htmlにブラウザからアクセスしてみます。
こんな感じになりました。



色々と試してみました。

(jsduck.jsonファイル名は任意)
{
    "--title": "jsducktest!!!",
    "--guides": "guides.json",
    "--videos":"videos.json",
    "--categories":"categories.json",
    "--welcome": "index.html",
    "--footer": "footer!!!",
    "--head-html":"head",
    "--body-html":"body",
    "--warnings": ["-link", "-no_doc"],
    "--":[
        "src/Hoge/AbstructSample.js",
        "src/sample.js"
    ]
}

jsduck -o release --config=jsduck.json
現在の状況
▾ jsducktest/
  ▾ categories/
    ▸ subdir1/
    ▸ subdir2/
  ▾ guides/
    ▸ subdir1/
    ▸ subdir2/
  ▾ release/
    ▸ extjs/
    ▸ guides/
    ▸ output/
    ▸ resources/
    ▸ source/
      app.js
      data.js
      eg-iframe.html
      favicon.ico
      index.html
  ▾ src/
    ▸ Hoge/
      sample.js
  ▾ videos/
    ▸ subdir1/
    ▸ subdir2/
    .DS_Store
    categories.json
    guides.json
    index.html
    jsduck.json
    videos.json

できたらアクセス。

release配下のindex.htmlにブラウザからアクセスしてみます。
こんな感じになりました。




Gitにのっけました。

release配下のindex.htmlで上の出来上がりが確認できるかと思います。

https://github.com/froggugugugu/jsducktest

ビデオを見てみる

紹介されているように、ビデオを見てみます。
http://vimeo.com/33465319
4分17秒あたりから上記のカスタムパラメタとリンクする各メニュータブの説明
6分27秒あたりからソース内のマークダウン記法について あーそうなんだ。コメントもマークダウンでかけばいいのね。で{@link}とかなわけだ。

インストールについて

16分56秒あたりからインストールです。

タイトルについて

18分42秒あたりからタイトルの変更。
19分あたりからコメントブロック入れようね。
20分あたりからソース内のパラメータに沿ったDocumentの吐き出され方 alternateClassNameとかsingletonとか。 設定するとアイコンが変わったり、とか、こう出るよ。的な。
21分でコメントブロックの記載について。 Ext.define直前のドキュメントコメントはクラス説明文にあたるみたい。

propertyについて

21分50秒付近でのプロパティ直前のドキュメントコメントについては
/**
 * @property {[型]} [名前] [説明]
 */

configオプションについて

22分40秒付近ではコンフィグオプションの説明
config:{
    /**
     * @cfg
     * [説明]
     */
    hogehoge: 0.5
}
だと、0.5を判断して型を表示して、ConfigOptionカテゴリに分類して出力してくれるみたい。

functionについて

23分37秒付近ではfunctionの説明 functionの直前のコメントブロックに
/**
 * [説明]
 * @return {[型]} 説明
 */
とすることでMethodカテゴリに分類して出力してくれる。

functionについて(戻り値Object)

25分07秒付近ではfunctionの説明(Object戻り)
/**
 * [説明]
 * @return {Object}
 * @return {[型]} return.[Objectのメンバ名] 説明
 * @return {[型]} return.[Objectのメンバ名] 説明
 * ...
 */
とすることで戻りがObjectの際の出力をしてくれる。

functionについて(alias)

26分30秒付近ではfunctionの説明(alias)
/**
 * @alias クラス名#メソッド名
 */
で、内容が同一になるし、
/**
 * @alias [クラス名#メソッド名]
 * @duprecated [説明] {@link}
 */
で、重複の警告が出るみたい。 {@link [クラス名#メソッド名]}で本文内リンク。

eventについて

29分20秒付近ではeventの説明
/**
 * @event [イベント名]
 * [説明]
 * @param {[型]} [説明]
 */

/**
 * @event [イベント名] [説明]
 */
でイベントの説明を

privateクラスについて

31分00秒付近ではprivateクラスの説明 Ext.define直前のドキュメントコメントで
/**
 * @private
 */
とするとprivate クラスになります。

exampleコードの機能について

31分36秒付近では例の説明 Ext.define直前のドキュメントコメントで
/**
 * @example
 *     [code....]
 */
と,するわけですが この@exampleがなくても4space入れてるのでmarkdown形式で
コードブロックとなるわけですが、プレビュー機能等をつけるときは
この@exampleをつけます。
この際、eg-iframe.htmlを利用するので
配下にあるeg-iframe.htmlに当該jsファイルを読み込む設定を
しておきます。
ビルドするときはパラメタに–eg-iframe=[eg-iframe.htmlのパス]を設定します。

imageについて

34分00秒付近からイメージの説明 Ext.define直前のドキュメントコメントで {@img [ファイル名]} としておきます。 この際、ビルドするときはパラメタに–images=[画像が入ったフォルダパス]を設定します。

categoriesの設定について

36分00秒付近からイメージの説明 作業用ディレクトリ直下にcategories.jsonファイルを作って、、、下記のような内容で記載。
[
    {
        "name": "Jsducktest.js",
        "groups": [
            {
                "name": "subdir1",
                "classes": [
                    "class1_1",
                    "class1_2"
                ]
            },
            {
                "name": "subdir2",
                "classes": [
                    "class2_1",
                    "class2_2"
                ]
            }
        ]
    }
]
groupsで括って、 classesで括ってクラスの羅列。 この際、ビルドするときはパラメタに–categories=categories.jsonを設定します。

guidesの設定について

39分20秒付近からguidesの説明 作業用ディレクトリ直下にguides.jsonファイルを作って、、、下記のような内容で記載。
[
    {
        "title": "RootNode",
        "items": [
            {
                "name": "subdir1",
                "title": "サブディレクトリ1",
                "description": "解説1"
            },
            {
                "name": "subdir2",
                "title": "サブディレクトリ2",
                "description": "解説2"
            }
        ]
    }
]
itemsで括って、 nameにはguides配下のサブディレクトリ名と合わせる。 で、imageを変えたい場合はREADME.mdの同じ階層にicon-lg.pngを配置。 このあたり見ると良いかも。
https://github.com/senchalabs/jsduck/blob/master/lib/jsduck/guides.rb
この際、ビルドするときはパラメタに–guides=guides.jsonを設定します。

welcomeの設定について

42分22秒付近からwelcomeページの設定について 作業用ディレクトリ直下にwelcome.htmlファイルを作って、、、
この際、ビルドするときはパラメタに--welcome=welcome.htmlを設定します。

videosの設定について

43分18秒付近からvideosの設定について 作業用ディレクトリ直下にvideos.jsonファイルを作って、、、下記のような内容で記載。
[
    {
        "title": "RootNode",
        "items": [
            {
                "id": "9071202",
                "title": "サブディレクトリ1",
                "description": "解説1",
                "thumb": "http://b.vimeocdn.com/ts/439/819/439819_200.jpg"
            }
        ]
    }
]
vimeoのIDを入れるようです。。 この際、ビルドするときはパラメタに–videos=videos.jsonを設定します。

examlesの設定について

44分40秒付近からexamplesの設定について 作業用ディレクトリ直下にexamples.jsonファイルを作って、、、下記のような内容で記載。
[
    {
        "title": "RootNode",
        "items": [
            {
                "text": "例",
                "url": "[index.html]",
                "icon": "[icon]",
                "desc": "解説1"
            }
        ]
    }
]
この際、ビルドするときはパラメタに–examples=examples.jsonと設定します。

なんだよ、、まぁ、ここまで見てアレですが、

47分20秒付近から
https://github.com/senchalabs/jsduck/wiki/Guide
https://github.com/senchalabs/jsduck/wiki/Advanced-Usage
に今までの解説がありました。。。。

パラメタの設定について

コマンドラインパラメタは --configで指定できます。前述でも挙げましたが、こいつは便利ですね。

2012年7月7日土曜日

作業部屋の改修が一段落できた。


作業部屋、スペースの都合上
一度は座卓にして椅子を廃止したんですが、
座卓にすると長居ができず、
椅子の頃よりも長時間の作業がしづらいので
また椅子に戻すことにしました。
ということに着手してから数ヶ月。。
(このネタ書き始めてから半年経つとか、、ありえんわ。。)
数時間で出来る作業を
超細切れの時間でちょこちょこちょこちょこと
作業してようやく形になった。

何をしたか

座卓をやめました。

座卓の頃
こいつを分解します。


座卓の分解

もともと部屋幅ぎりぎりのサイズで買ったPCデスクだったので
組み立てるのはかなりハードでした。
ドライバーが入りませんから。。
で、組み立てるのが大変なら、分解するのも大変です。
ドライバが入らないので。。
とドライバー用ビットを組み合わせて
隙間用ラチェットドライバとして作業をしました。
これがかなり隙間仕事に便利

こんな具合です。

この数センチの隙間作業。。
隙間仕事、大変です。
イライラ度は満点です。
分解して運びました。


再構築

そもそもデスクタイプにしようとした理由の一つとして
足の入場とかスペースが厳しい。などありましたので
PCデスクを分解して天板のみを再利用する。
という方針にしました。


天板の固定

椅子の高さ=身長の1/4
椅子から机までの感覚=身長の1/6
とのことなのでそのようにします。


問題は机の天板が固定できないということ。。
壁板は薄いので、、、
壁板にそのまま天板固定用の土台となる
柱を打ち付けられません。。
ので、部屋加工用(本棚設置用)につけた柱
ベースに作業を行います。
左右にうまい具合に支え板を取り付けることにしました。

本棚設置用の柱(こいつのお陰で好き勝手し放題Adapterだなww)
柱に支えを打ち付けてその上に天板を乗せるサンを載せこむ。と。

材料、材料
バシバシとノコ引きます。

途中、ほぞ?作るのにノミがない無いことに気が付き、
電動ドリルで穴開けまくって、ぶん殴ってほぞを作りました。
これは焦った。

点はつなげると線になりますね。よかった。よかった。

まぁそれらしくなりました。

あとは上に乗せるだけ


ぐちゃぐちゃだけど入れ物は整った。これから整理整頓です。

のせました。
できました!!
子供の相手しながら
隙間をみて買い物して
隙間をみてのこぎり引いて
隙間をみて掃除機かけて
隙間をみて組み立てて
中断するたびにすべて部屋の中に片付けて
再会するときにすべてをへやから出して、、
のループをひたすら繰り返しました。
実作業よりも片づけと用意に割いた時間が
長かった気がする。
まとまった時間がほしいなぁ
と思った作業でした。。
おわり。

2012年7月4日水曜日

MacにRedcarpet環境を作る(Winにも)

MacにRedcarpet環境を作る

Windows環境も作るってことで、 先日のエントリからの切り出しです。

1.MarkDown環境を作る

こちらを参考にさせて頂きました。
やったことは下記。

1.1 blueclothの場合

bluecrothをgemでインストール

sudo gem install bluecloth

1.2 redcarpetの場合

MarkDown拡張(PHP-Markdown style Extra?)であるtableが変換できない。
Tableは利用することがありそうなので必要。
BlueClothに変わるライブラリを探してみます。

で、GitHubでも利用されているRedcarpetを試して見ることにしました。
どうやら2.0以降で拡張に対応しているようです。
こちら

sudo gem install redcarpet

で、Readmeを読むとextensionsにtablesを設定すればいいとかいてあります。

redcarpet --help

で、

Usage: redcarpet [--parse-<extension>...] [--render-<extension>...] [--smarty] [<file>...]

とあるので、動作確認。

redcarpet --parse-table /Users/froggugugugu/Documents/MarkDowntest.md > ./out.html

OK.

1.3 vimの環境を整備

Bundleで追加 Markdown.vim

Bundle 'tpope/vim-markdown'--
Bundle 'tyru/open-browser.vim'--

vimrcに設定を追加

" .mdファイルタイプ指定
autocmd BufNewFile,BufRead *.md set filetype=markdown

" ====================================================================
" quickrun-vim 
" ====================================================================
let g:quickrun_config = {}
let g:quickrun_config['markdown'] = {
      \ 'outputter': 'browser',
      \ 'command': 'redcarpet',
      \ 'cmdopt': '--parse-tables'
      \ }

2.markdown.snip

こちらを参考にさせて頂きました。
で、せっかくなのでtableを追記して。

snippet     table
abbr table
    First Header | Second Header | Third Header
    :----------- | :-----------: | -----------:
    Left         | Center        | Right
    Left         | Center        | Right

windowsにRedcarpet環境を作る(解決)

windows環境も同様にしたいので、、、 Rubyを入れないといけないのですね。。。

Rubyインストール

こちらからから rubyinstaller-1.8.7-p370.exeをダウンロードしてきて、 入れます。

インストーラでインストール(Versionは) コマンドプロンプトから ruby -v でバージョンチェック。インストールされていることを確認。 gem -v でgemがインストールされている事を確認。

このまま、 gem install redcarpet

を実行するとDevkitが無いと怒られる。 ので、

RubyDevkitインストール

こちら をみてdevkit-3.4.5r3-20091110.7zをダウンロード。 解凍した構成をそのまま、上記(多分C:\Ruby187)にかぶせる。

redcarpetインストール

gem install redcarpet

2.1.1がインストールされました。

##検証 redcarpet –parse-table /Users/froggugugugu/Documents/MarkDowntest.md > ./out.html

OK..

2012年7月2日月曜日

GeekToolでデスクトップをいじる

結局、先週日曜大工もできず、 隙間でちょこちょこいじるということから インストールしてずっと放っておいたGeekToolを触ってみることにした。

なにからすりゃいいのかわからんかったけど、 @asano_yukiさんにおおまかな流れをきいてたので助かりました。 あと、「数時間持ってかれますよ。」 って言ってた意味がわかった。 これ、きりがない。 たしかに数時間持ってかれたけど、最近Macにさわれてなかったから それはそれで楽しめました。


GeekToolをインストール。あとは、、

こちらこちらを参考にさせてもらいました。 「あと、日付とかバランバランにして配置するんすよ」と教えてくれた @asano_yukiさんありがとう。

基本

追加したい要素をD&Dしてコマンドを書いて結果を出力させていきます。

壁紙

まず壁紙をー。

http://wallpaperswide.com/

フォントDL

それっぽいフォントをー。

atthewindowPRO.ttf

時間(shell)

date "+%H:%M:%S"

日付(shell)

date "+%m(%B).%d(%a).%Y"

カレンダー(shell)

cal

ネットワーク接続プロセス(shell)

lsof -P -i -n | cut -f 1 -d " " | uniq  

ユーザプロセス(shell)

ps -c -U <username> -o command,%cpu,%mem -r | head -n 20

OS情報(shell)

sw_vers

googlecalenger(shell)

*icalBuddyインストール

/usr/local/bin/icalBuddy -nc eventsToday+7 | sed -e "s/*/-/"

gmail(shell)

curl -u xxxxx@gmail.com:pass --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}'| perl -pe 's/^<title>(.*)<\/title>.*?<name>(.*?)<\/name>.*?<email>(.*?)<\/email>.*$/$2 - $1/'

で、ひとまず、 こんなかんじに落ち着きました。

groupでprivateとかつくってカレンダーとGmailはそっちに入れて 非表示にしてキャプチャとってみました。

そのながれで MarkDownのチートシートとコマンドのチートシートがあったので デスクトップ2と3にそれぞれ設定を。

宇宙もいいけど、 自分で設定するのも楽しいですね。

って随分アップするのに時間が空いたな。

BloggerとTwitterの連携

tweetFeedからいつの間にか連携されてなくて、、、 こまったので 連携サービスを feedBurnerにしてみた。

こちら を参考にさせていただきました。 ありがとうございました。

連携テスト。。