OmniAICreator/Qiita-1.07M huggingface dataset:
Titanium mobileのString.formatを使ってみる

[Titanium mobile "early" Advent Calendar 2012-24日目](http://atnd.org/events/33731)

日付などを表示するのに

```javascript:foo.js
y + '年'  + m + '月' + d + '日'  
```

などとしていませんか？。
もちろんそれでも問題なく動作しますが日本語以外にも対応したい場合はどうでしょう。
そんな時にTitaniumが用意してくれているStringメソッドを使えばいい感じに表示をしてくれます。
例えば日付を表すためのformatDate(date, format)とformatTime(date, format)は

```javascript:foo.js
  date = new Date();
  String.formatDate(date, "long");//iOSのみ
  String.formatDate(date, "medium");
  String.formatDate(date, "short");
  String.formatTime(date, "long");//iOSのみ
  String.formatTime(date, "medium");
  String.formatTime(date, "short");
```

これらは日本語だと

```javascript:foo.js
  //=> 2012年11月23日
  //=> 2012/11/23
  //=> 2012/11/23
  //=> 21:44:21 JST
  //=> 21:44:21
  //=> 21:44
```

端末の言語が英語環境だと

```javascript:foo.js
  //=> November 23, 2012
  //=> Nov 23, 2012
  //=> 11/23/12
  //=> 9:58:31 PM GMT+09:00
  //=> 9:58:31 PM
  //=> 9:58 PM
```

フランス語だと

```javascript:foo.js
  //=> 23 novembre 2012
  //=> 23 nov. 2012
  //=> 23/11/12
  //=> 22:50:09 UTC+09:00
  //=> 22:50:09
  //=> 22:50
```

などに切り替えてくれます。

また通貨だとformatCurrency (value)を使い

```javascript:foo.js
  Ti.API.info(String.formatCurrency(1500));
  //=> $1,500.00  (英語環境)
  //=> ￥1,500    (日本語環境)
  //=> 1 500,00 € (フランス語環境)
```

と切替ることができます。

また数字の桁あわせをしたい場合はformatDecimall (value, locale, pattern)で

```javascript:foo.js
  Ti.API.info(String.formatDecimal(15.678, "en-US", "#"));
  //=> 16
  Ti.API.info(String.formatDecimal(15.678, "en-US", "#.##"));
  //=> 15.68
  Ti.API.info(String.formatDecimal(15, "en-US", "0000"));
  //=> 0015
  Ti.API.info(String.formatDecimal(1500, "en-US", "#,###"));
  //=> 1,500
```

とします。

さらにString.format (formatString, value)はC言語などのprintf型式でフォーマットの型を指定できるので柔軟なフォーマットが可能です。
ただ、iOSではバグがあって、

```javascript:foo.js
  Ti.API.info(String.format("%4d-%2d-%2d %2d:%2d", 2011, 1, 1, 23, 5));
  //=> 2011-01-01 23:05(こう表示されることを期待するのだが)
  //=> 0-1084189696- 0 1072693248: 0(iOSではうまく動作せず)
```

とおかしな表示になってしまいます。
そこで不恰好ですが

```javascript:foo.js
  Ti.API.info(String.format("%04.0f-%02.0f-%02.0f %02.0f:%02.0f", 2011, 1, 1, 23, 5));
  //=> 2011-01-01 23:05
```

とすると期待通りに表示できました。
PHPでPOST送信する方法


Qiita API経由でQiitaのtokenを取得するにあたって、PHPでPOST送信を行う方法を調べてみた。

下記のコードでいけたので、メモしておく。
$url_nameと$passwordを正しく設定してやるとtokenが返ってくると思います。

```php
<?php
$url = "https://qiita.com/api/v1/auth";
$data = array(
    'url_name' => $url_name,
    'password' => $password
);
$content = http_build_query($data);
$options = array('http' => array(
    'method' => 'POST',
    'content' => $content
));
$contents = file_get_contents($url, false, stream_context_create($options));
```

参考URL:
http://blog.totalsoft.co.jp/archives/3847364.html
http://qiita.com/docs
Ruby1.9のイテレータについて勉強した


数年間ずっとPython一筋だったけど、Rubyに手を出している。
Pythonの一番のウリはiterator/generatorだと勝手に思う。
そこで、Rubyでiteratorと呼ばれているモノは何なのか、自分なりにやってみた。
勿論RubyにはRubyならではの書きやすいやり方、考え方があるはずだけど。


## 渡す側

### ブロックを渡すだけなら{...}とdo ... endを使っていればよい

```ruby
(1..3).map {|x| x * 2} # => [2, 4, 6]
```

### ブロック渡さずにnext()とかしたい場合はEnumeratorオブジェクトに変換する

```ruby
a = (1..3).to_enum
a.next() # => 1
```

### 渡すブロックを部品化したい場合

はじめに思いつくこと

```ruby
def f1(x)
  x * 2
end
(1..3).map {|x| f1(x)} # => [2, 4, 6]
```

lambdaやProcを使うと、ブロックをオブジェクトにする

```ruby
f1 = lambda {|x| x * 2}  # f1とf2は同じ意味。f1とf3はスコープの考えがちょっと違う（割愛）
f2 = ->(x) {x * 2}
f3 = Proc.new {|x| x * 2}
(1..3).map &f1 # => [2, 4, 6]
(1..3).map &f2 # => [2, 4, 6]
(1..3).map &f3 # => [2, 4, 6]
```

## 渡される側

### yieldキーワードを使う

```ruby
def itr_func
  (1..3).each {|x| yield x}
end
l = []
itr_func {|x| l << x}
l # => [1, 2, 3]
```

### enumeratorオブジェクトにする

無限リストとかに使う

```ruby
enum = Enumerator.new do |yielder|
  yielder.yield 1
  yielder.yield 2
  yielder.yield 3
end
enum.next() # => 1
enum.next() # => 2
enum.next() # => 3
```

また、既存のイテレータを変更するのにも使う

```ruby
def itr_func
  (1..3).each {|x| yield x}
end
enum = Enumerator.new do |yielder|
  Object.itr_func {|x| yielder.yield x}
end
enum.next() # => 1
enum.next() # => 2
```

## 続けて応用

### ブロックをメソッドチェインみたいに使えるの？

コンテナを渡すのは素直にできる

```ruby
enum = ->(x){x * 2}
(1..3).map(&enum).map(&enum) # => [4, 8, 12]
```

コンテナじゃなくて任意のenumerator(Pythonで言うgenerator)を繋げたい。
つまり、あるイテレータにブロックを渡すと、そのブロックに処理を委譲して、その結果をまた移譲するようなenumeratorを返して欲しい。

```ruby
class Chainer
  attr_reader :enum
  def initialize(enum)
    @enum = enum
  end
  def chain(&block)
    next_enum = Enumerator.new do |yielder|
      loop do
        yielder.yield block.call(enum.next)
      end
    end
    Chainer.new(next_enum)
  end
end

enum = Enumerator.new do |yielder|
  yielder.yield 1
  yielder.yield 2
  yielder.yield 3
end

proder = ->(x) {x * 2}

Chainer.new(enum).chain(&proder).chain(&proder).enum.to_a  # => [4, 8, 12]
```

無理やり作ってみたけど、きっともっといい方法があるはず。
誰か教えてください。

これとは違う例だけど、ピッケル本には色々やりたいならEnumerator自体を拡張すればいいじゃんとか書いてあった。
さすがにそれはキモい。
外側からくるんであげるのが最もお行儀の良い方法だと思うの。


## 結論

* Pythonのgenerator最高
* Rubyだと配列とかハッシュとか作りまくって渡さないと発狂しそうになる。速度とかキニスンナ。
Postfixの受信時に呼ぶスクリプトでBundlerを使う時にハマったこと

Postfixを設定して、メール受信時に任意のスクリプトを実行できる。
これは色々なところで解説されているのでググってもらうとして、その時にスクリプトを`bundle exec`経由で呼びたい、という時にハマったので書いてみます。

ふつう、スクリプトを呼ぶには、Postfixが呼ぶスクリプトの中で

    "|/path/to/script"

ってやると思うんだけど、これを

    "|BUNDLE_GEMFILE=/path/to/Gemfile /usr/local/bin/bundle exec /path/to/script"

って書いてもだめ。`BUNDLE_GEMFILE=/path/to/Gemfile`なんてファイル（実行するスクリプト）はない、って怒られる。
`BUNDLE_GEMFILE=...`を後置することもできないので、

    "cd /path/to/dir && /usr/bin/bundle exec /path/to/script"

って書いてみたり（cdに標準入力＝メールの内容が渡るのでだめ）、
`BUNDLE_GEMFILE`を設定した上でRubyスクリプトを呼ぶだけの簡単なシェルスクリプトを書こうとしたり（シェルスクリプト力が低くて、標準入力をスクリプト、というか`bundle`コマンドに渡す方法が分からなくて断念）
してみたけど、最終的に行き着いたのがこれ。

    "|cat | BUNDLE_GEMFILE=/path/to/Gemfile /usr/local/bin/bundle exec /path/to/script"

自分で標準入力をパスする、なんてことせずに`cat`を経由すればよかったのでした。
分かってみるとなんでもないのだけど、かなりハマった……。

この手の知識はホント乏しいので、もっといい方法があると教えてもらえると嬉しいです。
Intellij IDEAにJUnitのLive templateを追加する。

今回参考にしたのはこちら。
[Adding a JUnit test template in IntelliJ IDEA](http://thomassundberg.wordpress.com/2012/06/01/adding-a-junit-test-template-in-intellij-idea/)

登録するテンプレートはこちら。

JUnit実践入門の付録B.6のテンプレートを参考にいたしました。

test - テストメソッド

```java

@org.junit.Test
public void _$should_assert_a_behaviour$() throws Exception {
    // Setup
    // Exercise
    // Verify
}
```

setUp - 初期化メソッド

```java

@org.junit.Before
public void setUp() throws Exception {
    // Setup
    $END$
}
```

tearDown - 後処理メソッド

```java

@org.junit.After
public void tearDown() throws Exception {
    // After
    $END$
}
```

setUpClass - クラスの初期化メソッド

```java

@org.junit.BeforeClass
public static void setUpClass() throws Exception {
    // Setup
    $END$
}
```

tearDownClass - クラスの後処理メソッド

```java

@org.junit.AfterClass
public static void tearDownClass() throws Exception {
    // After
    $END$
}
```

when - ネストしたテストクラス

```java

public static class _$test_context$の場合 {

    $END$
}
```

instantiation - インスタンス化テスト

```java

public static class インスタンス化テスト {

    @org.junit.Test
    public void デフォルトコンストラクタ() throws Exception {
        // Exercise
        $class$ instance = new $class$();
        // Verify
        assertThat(instance, is(notNullValue()));
    }
    $END$
}
```
phpmyadmin左ブロックの文字を大きくする

#phpmyadmin左ブロックの文字を大きくする

大体50歳ぐらいを過ぎると等し並みに小さい文字が見えにくくなります。

私の場合しょっちゅうphpmyadminを使うので左ブロックの文字が以前に比べずっと見にくくなってきました。

ということで大きくしてみました。

##修正前の左ブロック　文字がちっさい
![修正前左ブロック](http://ryus.co.jp/images/blog/phpmyadmin_before.png "修正前左ブロック")

##修正前の左ブロック　文字がおおきい♪
![修正後左ブロック](http://ryus.co.jp/images/blog/phpmyadmin_after.png "修正後左ブロック")

修正したのはxampp上だとこの辺


c:\xampp\phpmyadmin\themes\original\css\theme_left.css.php

　　　

```
/* general tags */
html {
    font-size: <?php echo (null !== $_SESSION['PMA_Config']->get('fontsize') ? $_SESSION['PMA_Config']->get('fontsize') : $_COOKIE['pma_fontsize']); ?>;
}
```

を以下のように編集した。

```
/* general tags */
html {
    font-size: 1em<?php //echo (null !== $_SESSION['PMA_Config']->get('fontsize') ? $_SESSION['PMA_Config']->get('fontsize') : $_COOKIE['pma_fontsize']); ?>;
}


```

<?phpから以降ざっくり削っても良いんだけど、ちゃんと設定すれば大きくなるのかもしれず、一応とっておいた。とりあえず通常の大きさで表示されるように設定。
PsychとSyckについて

## Syck とは

Ruby 1.8 から標準で付いてきたYamlライブラリ。Cでできている。

* http://gihyo.jp/dev/serial/01/yaml_library/0002

当時は世界一使われていた模様。あと、当時のRubyは文字列が文字コード情報を持たなかったので、日本語文字などを扱う場合色々苦労することもあったようだ。

## Psych とは

libyamlのRubyラッパー。tenderlove氏が中心となって作っているもよう。

* http://doc.ruby-lang.org/ja/1.9.3/library/psych.html
* https://github.com/tenderlove/psych

### 経緯

Ruby 1.9.2 から添付されるようになった（libyaml が利用できる場合一緒にビルドしてくれる）

* http://keijinsonyaban.blogspot.jp/2010/10/ruby192yaml.html

Ruby 1.9.3 からPsychが標準になった。

* http://maeda.farend.ne.jp/blog/2012/03/10/ruby-missing-pysh/

Ruby 2.0.0 から、 **Syckの方が削除される** 予定。

* http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/46348

### 最大の違い

マルチバイト文字列の扱いが異なる。

```bash
$ ruby -rsyck -ryaml -e "puts YAML.dump [1, {hoge: 'foo', fuga: 'つらぽよ'}]"
--- 
- 1
- :hoge: foo
  :fuga: "\xE3\x81\xA4\xE3\x82\x89\xE3\x81\xBD\xE3\x82\x88"
$ ruby -rpsych -ryaml -e "puts YAML.dump [1, {hoge: 'foo', fuga: 'つらぽよ'}]"
---
- 1
- :hoge: foo
  :fuga: つらぽよ
```

なので、Syckで作ったYamlファイルをPsychで読み込むと激しく化ける。つまりRuby1.8時代に作ってしまったYamlファイルは、変換しないとRuby1.9.3以降は扱いに困ることになり、そしてRuby2.0からは標準では扱えなくなる場合がある（多分gemは提供される）。
XMLHTTPRequestとiframeとpostMessageでクロスドメイン通信

http://vps.will-co21.net/test/html5proxy/postMessageCrossDomain.html?/formdatapost/tmp/hoge.png
html5のpostMessageとXMLHTTPRequestとiframeを組み合わせて画像のバイナリをXMLHTTPRequestで取得して
base64エンコードしたものをiframeからpostMessageで別ドメインの親ウィンドウに送って
dataURLにして画像として表示。
親ウィンドウ

```javascript
window.onload = function () {
    require(["base64"], function (lib ) {
        var base64 = lib.base64;
       
        var iframe = document.createElement("iframe");
        iframe.src = "http://habrashi.s351.xrea.com/htmlproxy/proxy.html?" + encodeURIComponent(window.location.search.substr(1));
        iframe.setAttribute("id", "xhrframe");
        document.body.appendChild(iframe);
       
        window.addEventListener("message", function (e) {
            var data = e.data;
            img = document.createElement("img");
            img.src = "data:image/png;base64," + data;
            document.getElementById("content").appendChild(img);
        });
    });
}
```

子ウィンドウ

```javascript
window.onload = function () {
    var target = (parent && parent.postMessage ? parent : (parent && parent.document.postMessage ? parent.document : undefined));
    require(["base64"], function (lib ) {
        var xhr = new XMLHttpRequest();
        var base64 = lib.base64;

        xhr.onreadystatechange = function () {
            if(xhr.readyState == 4){
                var res = xhr.responseText;
                var bytes = [];
               
                for(var i=0, len = res.length; i < len; i++) bytes.push(String.fromCharCode(res.charCodeAt(i) & 0xff));
                var data = bytes.join("");
               
                base64String = base64.encode(data);
               
                if (typeof target != "undefined") {
                    target.postMessage(base64String, '*');
                }
            }
        }
        var url = decodeURIComponent(window.location.search.substr(1));
        xhr.open("GET", url, true);
        xhr.overrideMimeType("text/plain; charset=x-user-defined");
        xhr.send(null);
    });
}
```
uniteでコマンド一覧を呼び出す


```
"" vim command 一覧
noremap :<CR> :<C-u>Unite command mapping<CR>
```

ノーマルモードで「:」＋エンターキーでコマンド一覧　あとはUniteで絞り込めます

ほかに過去に使ったファイル一覧とかunite-railsとかも激しく便利です

```
noremap :: :<C-u>Unite file_mru -buffer-name=file_mru<CR>
```

```
""unite-rails
noremap :rc :<C-u>Unite rails/controller<CR>
noremap :rm :<C-u>Unite rails/model<CR>
noremap :rv :<C-u>Unite rails/view<CR>
noremap :rh :<C-u>Unite rails/helper<CR>
```
sublime 2 install package control


# 安裝 Sublime package control
* Control + ` 輸入以下

````bash
import urllib2,os; pf='Package Control.sublime-package';
ipp=sublime.installed_packages_path();
os.makedirs(ipp) if not os.path.exists(ipp) else None;
urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));
open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());
print 'Please restart Sublime Text to finish installation'
````
Firefox17にアップデートしたら Tab Mix Plus と TiddlyWiki が動かなくなった時の対策


## Tab Mix Plus
![Tab Mix Plud - dev-builds](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20121123/20121123123730_original.jpg?1353641922)

開発版を使いましょう。**tab_mix_plus-0.4.0.4pre.120724a.xpi** を入れたら動きました。

[Index of /dev-builds](http://tmp.garyr.net/dev-builds/)

[本家](https://addons.mozilla.org/ja/firefox/addon/tab-mix-plus/)のバージョンが4.0.4になれば、開発版使わなくても済むはずです。

## TiddlyWiki
![tiddlyfox](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20121123/20121123123710_original.jpg)

デフォルトでは保存が出来なくなってしまいました・・。TiddlyFoxというプラグインを入れれば保存出来るようになります。

[TiddlyFox extension for Firefox :: Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/addon/tiddlyfox/)
破壊的操作が出来る数値クラスもどきを考えた

言う間でもなくRubyの `Fixnum` はイミュータブルで、破壊的変更を許すメソッドを持ち合わせていない。

```ruby
result1 = %w(foo bar buz qiiz).each_with_object(0) do |str, num|
  num += str.length
end
```

上記のようなコードは「`0`」を返す。Rubyのブロックには「オブジェクトの参照のコピー」が渡されるため、`0`自体を直接操作できない以上そうなる（何でこうなるかが分からない人はRubyを沢山勉強しよう！）。

でも、例えばeachでぶん回して操作成功した件数知りたい、とか言う場合、ぶっちゃけ破壊的操作できる数値オブジェクトが欲しくない？

書いてみた。

```ruby:numeric_wrap.rb
class NumericWrap < BasicObject
  def initialize(n)
    @num = n
  end

  def self.regard_as_destructive(*ops)
    ops.each do |op|
      define_method(op) do |other|
        @num = @num.send(op, other)
        self
      end
    end
  end
  # Picked up randomly...
  regard_as_destructive :+, :-, :*, :/, :%, :**, :&, :|

  def method_missing(*a)
    @num.send(*a)
  end
end

result1 = %w(foo bar buz qiiz).each_with_object(0) do |str, num|
  num += str.length
end

result2 = %w(foo bar buz qiiz).each_with_object(NumericWrap.new(0)) do |str, num|
  num += str.length
end

p result1
#=> 0

p result2
#=> 13
```

`BasicObject` を継承したクラスをラッパーにして、必要なメソッド以外は全部 `method_missing` で委譲するようなパターンを勝手に「Delegate-all pattern」と名付けたけど、他に良い名前がありそう（メタプログラミングRubyとかでBlank Slateという名前で同じようなものを説明してたような気がする）。

`Object#class`、`Object#is_a?`、`Object#inspect`とかも全部上書きされているため、見た目上まるっきり`Fixnum`として取り扱うことができてしまう。でも、 **`Fixnum` と直接の継承関係はない** 。

```ruby
num = NumericWrap.new(0)
num.class #=> Fixnum
```

直感的に凄い不気味……。

Delegate-all patternは他には、`ActiveSupport::Duration`に使われている。というかこの実装を見てパクった。

* http://tmaeda.s45.xrea.com/td/20080129.html
hook


```lua:hookable.lua
function Hookable(f)
    local ret = {}
    ret.hook = {}
    setmetatable(ret, {
        __add = function(a, b)
            table.insert(ret.hook, b)
            return ret
        end,
        __call = function(...)
            f()
            for i, v in ipairs(ret.hook) do
                v()
            end
        end
    })
    return ret
end

f = function()
    print("f")
end

g = function()
    print("g")
end

ff = Hookable(f)
ff()

ff = ff + g
ff()
```
botの一部の機能として自動フォローやランダムツイート


はい、私自身のアカウントはこの機能を必要とする状況ではないのですが動いたものをメモ書きとして。
デフォルトのpython環境にtweepy導入必須です


```py:bot.py

# 純粋にフォロー返し部分のみ記述です
# OAuthトークン処理などは省略

# @省いたユーザー名を""で囲んで
# API仕様書では
# Parameters: id OR screen_name OR user_id, cursor
# と選択肢あるようですがこれが一番分かり易いかと
user = "hogehoge"

# フォロワーを取得
follower = api.followers_ids(user)
# 既にフォロー済を取得
friends = api.friends_ids(user)

# (フォロワー) - (既にフォロー済)で差分を取り未フォローをlist化
set_apr = set(follower) - set(friends)
list_apr = list(set_apr)

# userのアカウントで未フォローのリストを先頭から終わりまで
# フォローをする

for user in list_apr:
   api.create_friendship(user)
```

listがNoneかどうかでフォロー動作をif〜else〜したほうがいいのかもしれません。

今回挑戦してませんが差分内の未フォローのアカウントを更にスパム対策でリスト内のアカウントのツイートを取得して内容で更に選別することも出来るかと思います。

2013/06/15再編集 API1.1動作確認OK。タイポ修正。

```
 prof = api.update_profile().description
```

でアプリ・API利用者本人のdescriptionは取得出来るのですが、()の中に何か記入したり試すも本人以外のdescription取得出来ず。そして名前がそれに書き換えられてしまうという。。。。description取得出来たらアフィとかビジネスとか特定の用語で選別してフォロー返さないように出来るのですが。。。。。
update_profile()自体が本人専用のなのかな。。

次の修正時までにここを参照して
[http://dx.24-7.co.jp/twitterapi1-1-rest-api/](http://dx.24-7.co.jp/twitterapi1-1-rest-api/)
[https://dev.twitter.com/docs/api/1.1](https://dev.twitter.com/docs/api/1.1)
参考先サイト様
http://packages.python.org/tweepy/html/api.html#tweepy-api-twitter-api-wrapper
http://yuutookun.hatenablog.com/entry/20120316/1331863793

###ランダムツイート
botの一部の機能としてランダムツイート

はい、以前はランダムツイート用のbot.pyとかにしてセリフも全て放り込んでいたのですが分化に成功したので大雑把にメモを

```tweet
てすと０
てすと１
てすと２
てすと３
```

セリフを仕込んでるファイルです。文字コードはutf-8です。
''""\[](),. などで区切る必要なくセリフだけで１行を記述。

```py:bot.py

import random

# 台詞のパターン数に応じてランダム数値の幅を変えて下さい。
x = random.randint(0,3)

def randomtweet():
   ra = open('tweet')
   line = ra.readlines()
   ra.close()
# 末尾についてくる改行を削除します
   rtw = line[x].replace('\n','')
# 投稿部分は今回も省略してますが、この関数内で投稿動作と
# セリフにrtw放り込めばそれで動くかと。
```

セリフの数に依っては投稿制限に引っかかるので予定してる時間に動かないことあります。
前回の記録を取り同じだったら再抽選も考えましたが実行してません。
datetimeでmicrosecondの値でもセリフ末尾に付加すれば、同一セリフの制限を回避できます。多分。。

なんかあまりにあれこれ中途半端すぎるので今月中にもう少しまとめたいです。
Evernoteでmadeverでmarkdown、但しmdソースは温存


## これは何

ノートブック _markdown.src_ に含まれる新しいソースをmarkdownし、ノートブック _markdown.html_ にセーブするスクリプト

markdownには[madever](https://github.com/sandai/madever)を使用

madever はmdソースを変換後のhtmlで上書きするが、このスクリプトはソースをソース専用ノートブックに温存したまま、マークダウン結果を結果専用ノートブックに生成する

madeverではpandocによるマークダウンに失敗するとソースが消滅してしまうという欠点があるのでその回避のためソースノートと生成ノートを分離したかったのがこのスクリプトを書いた主目的

## todo

* pandoc非依存にしたい
* GitHub Flavored Markdown版を作りたい

## スクリプト
AppleScriptエディタで、以下のソースを`$HOME/Library/Scripts/evernote_markdown.scpt`として保存

```
property src_notebook : "markdown.src"property dest_notebook : "markdown.html"global madeverglobal CSSset madever_dir to (path to scripts folder from user domain as text) & "madever"set madever to load script file (madever_dir & ":madever.scpt")set loadtheme to load script file (madever_dir & ":loadtheme.scpt")set CSS to loadtheme's main()on markdown(srcNote, destNote)	tell application "Evernote"		set accountname to current account's name as text		set noteid to madever's split(srcNote's local id, "/")'s last item as text		set contentAlias to (((path to application support from user domain) as text) & "Evernote:accounts:Evernote:" & accountname & ":content:" & noteid & ":content.html") as alias		set contentPath to contentAlias's POSIX path		set pandoc to madever's findPandoc()				set cmd to "textutil -convert txt -stdout \"" & contentPath & "\" | " & pandoc & " -S --email-obfuscation=none -f markdown -t html"		set renderedBody to do shell script cmd				set renderedBody to madever's subHtml(renderedBody)				set bodycss to madever's value_of(CSS, "body")		set renderedHtml to "<html><body style=\"" & bodycss & "\">" & renderedBody & "</body></html>"				if destNote = null then			set newNote to (create note with html renderedHtml ¬				title (srcNote's title) ¬				notebook dest_notebook ¬				tags (srcNote's tags) ¬				created srcNote's creation date)			set newNote's modification date to srcNote's modification date		else			set destNote's title to srcNote's title			set destNote's HTML content to renderedHtml			set destNote's tags to srcNote's tags			set destNote's modification date to srcNote's modification date		end if			end tellend markdowntell application "Evernote"	-- 最後にmarkdownした日時を得る	set last_updated to (current date) - 86400		repeat with destNote in (find notes "notebook:" & dest_notebook)		set mdate to destNote's modification date		if mdate > last_updated then			set last_updated to mdate		end if	end repeat		-- last_updated より新しいソースをmarkdown	repeat with srcNote in (find notes "notebook:" & src_notebook)		-- & " intitle:\"" & 1 & "\"")		if srcNote's modification date > last_updated then			set destNote to null			repeat with dupNote in (find notes "notebook:" & dest_notebook & " intitle:\"" & (srcNote's title) & "\"")				if dupNote's creation date = srcNote's creation date then					set destNote to dupNote				end if			end repeat						my markdown(srcNote, destNote)		end if	end repeat	end tell```
BlenderでMecanimしようぜ（後編）

えー、続きです。
前編の最後に「これでもうUnityにインポート可能です」と書きましたが、訂正します。

現行のままだと腰のデフォームボーンおよびオリジナルボーンの設定が共にrootを親になっており、デフォームボーンはcopy_transformsコンストレイントにより、オリジナルボーンと常に同座標に配置されるような設定になってます。しかしこれはあくまでBlender上での設定ですのでUnityに取り込んだ時点でコンストレイントは無効になります。これを回避するためにDEF-hipsの親をrootからORG-hipsに変更します。

![image](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/pict5.jpg)

これで取り込めるようになりました。

が、せっかくなのでBlender側で２つほどアニメーションクリップを作っておきます。
アイドル状態とアクション状態ですね。

![image](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/pict6.jpg)

アニメーション制作における注意点は、１フレームから始めることです。
もしも0フレームからアニメーションを作ってしまうと、Unityに読み込んだときに-1フレームから開始されてしまい、手直しをするはめになります。blenderは１フレームを基準と捉えているみたいなので、他のソフトなどで0フレームから作ることに慣れちゃっている方は注意しましょう。

とりあえず適当にIdleとOta-geiという２つのアニメーションを作っておきました。

これをUnityに.blend形式のままインポートします。
読み込んだファイルをProjectパネルから選択し、インスペクタのAnimationをクリックすると、作成した２つのアニメーションのほか、Default Takeという謎のアニメーションがあります。これはタイムライン上に配置されたものです。つまりNLA Editorで配置した結果もアニメーションクリップとして持ち込むことができるようになっております。

Rigの設定でHumanoidを選択し、コンフィグ画面に切り替えると、Unity側で使うリグにあたりをつけてくれているので設定が非常に楽です。

今回のようにRigifyを使う場合は頭の設定のみおかしくなっているので、これを正しく訂正します。NeckをORG-neckに、HeadをDEF-headにすればオーケー。

![image](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/pict7.jpg)

これで数多くのHumanoidアニメーションを適用することが可能です。

Mecanimに関しては、50分にも及ぶUnity公式のチュートリアルが非常に役にたちます。

[http://www.youtube.com/watch?v=Xx21y9eJq1U](http://www.youtube.com/watch?v=Xx21y9eJq1U)

せっかくなのでこの原稿を書くためにつくったものを置いておきます。

[こちら](https://dl.dropbox.com/u/31709397/Qiita/BlenderUnity/Sample.html)

では、皆様よきUnityライフを。
slimish_jinja macro


```slim:macro.slim
- macro gen_pagination(pagination, pageURL)
  div.pagination
    ul
      -if pagination.hasPrev
        li
          a href="=pageURL/=pagination.prev" << Prev
      -for page in pagination.iterPages()
        -if page != pagination.page
          li
            a href="=pageURL/=page" =page
        -else
          li.active
            =page
      -if pagination.hasNext
        li
          a href="=pageURL/=pagination.next" Next >>
```

```slim:index.slim
- import 'macro.slim' as macro4h
= macro4h.gen_pagination(pagination, '/page')
```
Padrino で Better Errors を使う

[better_errors](https://github.com/charliesome/better_errors) は sinatra でも使えるので、何も難しいことはないですね。

```
$ ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin11.4.2]
$ padrino -v
Padrino v. 0.10.7
```

サクッと Gemfile に追加して…

```ruby:Gemfile
group :development do
  gem "better_errors"
  gem "binding_of_caller"
end
```
```
$ bundle install
```

パパッと設定を書いて上げれば…

```ruby:config/boot.rb
# …
# Load our dependencies
equire 'rubygems' unless defined?(Gem)
require 'bundler/setup'
Bundler.require(:default, PADRINO_ENV)

# ココを追加
if Padrino.env == :development
  Padrino::Application.use BetterErrors::Middleware
  BetterErrors.application_root = PADRINO_ROOT
  BetterErrors.logger = Padrino.logger
  # 表示を許可するアクセス元 IPの指定
  # thanks! @dayflower
  # BetterErrors::Middleware.allow_ip! "127.0.0.0/8" # default
  # BetterErrors::Middleware.allow_ip! "::1/128"     # default
end

##
# ## Enable devel logging
#
# ...
```

リッチなエラーページが Padrino にもやってきて便利ですね！

追記:
Padrino 0.11 では protect_from_csrf が有効になっているため、
画面右側の情報が何も表示されなくなってしまっています。
どうやって解消すればいいかな…

回避方法を書いてみました。[Padrino 0.11 以降で Better Errors を使う](http://qiita.com/tyabe/items/b5300572a9dfd7f7e039)
Doctrine2のBatch ProcessingのdetachをCallbackFilterIteratorでカプセル化してみた


大量のデータをあつかう処理のために、Doctrine2には[Batch Processing](http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html)があります。このBatch Processingは、`findBy()` とは違って結果をメモリに溜め込まみません。`foreach` のループ1回ごとに結果を逐次生成するため、メモリにやさしいのです。CSV出力など全データを参照するような場合は、このBatch Processingを使うほういいです。データが増えた時にもメモリ不足を回避できるからです。

しかし、Batch Processingは自分でメモリ管理をする必要があります。Doctrineは一意マッピング(Identity Map)をしているため、一度生成されたEntityはDoctrine側で参照を持っています。そのため、下記の例の(1)のように、ループごとに `EntityManager::detach()` をコールして Entity を開放しなければなりません。これでは、Doctrineについてよく知らない開発者が detach() を忘れてしまい、結局メモリ不足に陥ってしまうかもしれません。

また、Doctrineが返すイテレータはなぜか Entity を含む配列になっていて、下記の例の(2)のように、Entityを配列から取り出す処理を書かなければなりません。これでは一見何をしているか分かりにくいですね。あまり直感的ではありません。


```php
<?php
$query = $entityManager->createQuery('SELECT p FROM AcmeBlogBundle:Post p');
$iterableResult = $query->iterate();
foreach ($iterableResult AS $row) {

	var_dump($row[0]->getTitle()); // ・・・ (2)

    $entityManager->detach($row[0]); // ・・・ (1)
}
```

* ループごとに `detach()` しないといけない
* イテレータの戻り値が直感的でない

そこで、[`CallbackFilterIterator`](http://php.net/manual/ja/class.callbackfilteriterator.php) を使って上記の2つの問題をカプセル化する方法をご紹介します。 `CallbackFilterIterator` は PHP5.4 から追加されたクラスです。各要素について、コールバック関数を実行することができます。以下が、`CallbackFilterIterator` を使ったBatch Processingの実装です。


```php
<?php

$query = $entityManager->createQuery('SELECT p FROM AcmeBlogBundle:Post p');
$posts = $query->iterate();
$posts = new CallbackFilterIterator($posts, function(&$current, $key, $iterator) use($entityManager) {
    $current = $current[0]; // $current から Entity オブジェクトを取り出してセットしてあげる
    $entityManager->detach($current); // イテレータの中でデタッチしてあげる
    return true;
});

foreach ( $posts as $post ) {
	var_dump($post->getTitle());
}

```

このままだと、コントローラがごちゃごちゃしてしまうので、CallbackFilterIterator部分はRepositoryでカプセル化しておくといいですね。

```php
<?php

class PostRepository
{
	/**
	 * すべてのブログ投稿を返す
	 * @return Post[]
	 */
	public function getWholePostIterator()
	{
		$query = $entityManager->createQuery('SELECT p FROM AcmeBlogBundle:Post p');
		$posts = $query->iterate();
		$posts = new CallbackFilterIterator($posts, function(&$current, $key, $iterator) use($entityManager) {
		    $current = $current[0];
		    $entityManager->detach($current);
		    return true;
		});
		return $posts;
	}
}

class CSVExportController
{
	public function exportAction()
	{
		$postRepository = . . .
		
		$posts = $postRepository->getWholePostIterator();
		
		foreach ( $posts as $post ) {
			// CSV 吐き出し処理
		}
	}
}

```
制約充足問題についてのゆるふわな話

たきたきです．制約充足問題についてのゆるふわな話という題で記事を書きました．全然ガチでもないゆるふわな話です．

[日記]制約充足問題についてのゆるふわな話
http://blog.cocomoff.info/archives/2012/12/12/5542/
bing search apiの使い方


##制約

* 月間5000リクエストまでは無料
* 10000リクエスト$20,それ移行従量課金性
* https://datamarket.azure.com/dataset/5BA839F1-12CE-4CCE-BF57-A49D98D29A44

##使い方

* Microsoftアカウントを作成し、APIKEYを取得
* API KEYはエンドポイントに対するbasic認証で用いる
* ユーザ名・パスワード共にAPI KEY
* パラメータに$を含むものがあり、encodeしてしまうとアクセスできない
* なぜかurllibを使ったアクセスでは400 bad requestになってしまった
* stack overflow等でも同様の現象が確認でき、解決策としてrequestsモジュールを用いることが推奨されている。理由はよくわからない
* クエリはシングルコーテーションで囲まないと認識されない
* 返り値の__nextに入るURLから$formatが消えるので注意
* 検索件数は取得できないよう
* skipは1000までしか指定できない模様。topは50がMAXなので1050件までしか取得できない


##サンプルコード

``` python:bingsearch.py
#! /usr/bin/python
# -*- coding:utf-8 -*-

import urllib
import requests
import json
NUM = 100
key = '' #api keyを入れる
url = 'https://api.datamarket.azure.com/Bing/Search/Web?'
json_param = '&$format=json'
param = {
    'Query':"''", #クエリを入れる    
}
req_url = url + urllib.urlencode(param)

for i in range(0,NUM):
    r = requests.get(req_url + json_param,auth=(key,key)).json
    print json.dumps(r)
    req_url = r['d']['__next']

```
ImageMagickで画像を上書きする

convertコマンドの代わりにmogrifyコマンドを使えばよい。

```bash
$ convert -resize 200% original.bmp converted.bmp
```
↓

```bash
$ mogrify -resize 200% original.bmp
```

convertコマンドで動作結果を確認した後で `$ mogrify -resize 200% *.bmp`とすると楽ちん。

* [ImageMagick: Command-line Tools: Mogrify](http://www.imagemagick.org/www/mogrify.html)
Sublime Text 2 での Shift-JISファイルの閲覧・編集


最近仕事でShift-JISのソースコードを読む機会があり、Sublimeで読めなかったのでメモ。

ConvertToUTF8
-------------
SublimeではShift-JISの文字を認識してはくれないようですが、[ConvertToUTF8][1]というパッケージを導入すると、自動認識してくれるようになります。素晴らしい。
Shift-JISだけではなく、EUC-JPも扱えるようです。

導入方法は、パッケージコントロールからインストールするだけです。

[他にもShift-JISが欲しいという話][2]はあるようで、いずれSublime本体でエンコーディングを判別したり設定できるようになるかもしれないですが、当面このプラグインで不自由しなさそうです。

[1]: https://github.com/seanliang/ConvertToUTF8#readme
[2]: http://sublimetext.userecho.com/topic/46359-please-support-shift-jis-encoding-japanese/
ChefのRoleを使ってPostfixを設定しつつmonitで監視

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

Chef活用の話、ミドルウェアのインストール＆設定＆監視を構築して維持する。


## 使うCookbooks

Postfixはopscodeの`cookbook[postfix]`、`knife cookbook site`で持ってこれる奴を使う。

MonitはOpscodeコミュニティに公開している[monit_bin](http://community.opscode.com/cookbooks/monit_bin)のCookbookを使う。

監視設定は`cookbook[monit_bin]`内の**LWRP**に設定しているので、`monit_bin[services]`をどこでもいいからrunlistに加えておく必要がある。


## Roleの例

Postfixを設定しつつ、monitでプロセス監視を行うRoleはこのようになる。


```json:postfix_client.json
{
  "name": "postfix_client"
  "description": "settings for postfix as sattelite",
  "json_class": "Chef::Role",
  "default_attributes": {
    "monit": {
      "process": {
        "targets": {
          "postfix": {                                                                                                       
            "type": "pid",
            "pidfile": "/var/spool/postfix/pid/master.pid",
            "start_program": "/usr/sbin/service postfix start",
            "stop_program": "/usr/sbin/service postfix stop",
            "policies": [
              "if failed host 127.0.0.1 port 25 protocol smtp timeout 30 seconds then restart",
              "if 2 restarts within 3 cycles then timeout"
            ]
          }
        }
      }
    }
  },
  "override_attributes": {
    "postfix": {
      "relayhost": "smtp.example.jp",
      "aliases": {
        "root": [
          "sawanoboly@example.jp"
        ]
      },
      "mail_type": "client",
      "smtpd_use_tls": "no"
    }
  },
  "chef_type": "role",
  "run_list": [
    "recipe[postfix::default]",
    "recipe[postfix::default]"
  ],
  "env_run_lists": {
  }
}
```

targets以下のmonit用コンフィグはよそのRoleとマージされて複数のTargetにすることができる。

### attributesについて

サンプルではpostfixがoverrideでmonitの分をdefaultにしている。
Environmentなど既存のattributesにマージする場合はdefault, 上書きしてしまいたい時にOverrideを使っている。

例えばpostfixのrootへのaliasesのアレイはdefaultだと他とマージされて複数になるケースがあるがoverrideだとここの`"root": ["sawanoboly@example.jp"]`だけが使用される。


## 出来上がるmonitのコンフィグ

もらった`attributes`を使ってテンプレートからビルドされる。

```bash:postfix(monit_config)
## Generated by Chef for test01.example.jp

check process postfix with pidfile /var/spool/postfix/pid/master.pid
  start program = "/usr/sbin/service postfix start"
  stop program  = "/usr/sbin/service postfix stop"
  if failed host 127.0.0.1 port 25 protocol smtp timeout 30 seconds then restart
  if 2 restarts within 3 cycles then timeout
```

設定の追加や更新があったらmonitも勝手にReloadされて手間いらず。
NySQLでのtinyintの挙動


MySQLで、tinyintフィールドを使用したテーブルを、JDBC等でデータを取得した際、true/falseとして扱い、ClassCastException例外が発生することがあります。

その場合、JDBCアダプタの設定に以下を追加すれば良いです。

``` JDBC
tinyInt1isBit=false
```
git diff のとき変更したファイルだけを確認する

通常の `git diff` では、追加したファイルやリネームしたファイルなども差分として表示されますが、それが邪魔に思うときもあります。

以下のようにすれば、変更したファイルについてだけ差分を表示することができます。

```
git diff --diff-filter=M
```

ちなみに、`diff-filter` は他にも、A （追加）、C （コピー）、D （削除）、R （リネーム）、などが指定できます。

僕は以下のようなエイリアスを作って使っています。

```
[alias]
        modified = diff --diff-filter=M
```
Jackson で気が向いた時だけ一部フィールドの出力をしない

[Jackson](http://jackson.codehaus.org/) でオブジェクトを JSON にシリアライズするときに、一部フィールドはシリアライズしたくないときは、フィールドやメソッドに @JsonIgnore を使います。

普段はシリアライズするけど、場合によってはシリアライズしたくない、といったケースでは、無視したいところだけ @JsonIgnore したインターフェースを作って、それを [mix-in](http://wiki.fasterxml.com/JacksonMixInAnnotations) するときれいにできます。

```java:JUnit向け検証コード
static class Obento {
	private final String syusyoku;
	private final String syusai;
	private final String fukusai;
	private final int price;
	public Obento(String syusyoku, String syusai, String fukusai, int price) {
		this.syusyoku = syusyoku;
		this.syusai = syusai;
		this.fukusai = fukusai;
		this.price = price;
	}
	public String getSyusyoku() { return syusyoku; }
	public String getSyusai() { return syusai; }
	public String getFukusai() { return fukusai; }
	public int getPrice() { return price; }
}

static interface OgoriView {
	@JsonIgnore String getPrice();
}
	
@Test public void test() {
	Obento o = new Obento("しろめし", "カレー", "福神漬", 780);
	
	{
		ObjectMapper mapper = new ObjectMapper();
		System.out.println(mapper.valueToTree(o).toString());
		// {"syusyoku":"しろめし","syusai":"カレー","fukusai":"福神漬","price":780}
	}
	{
		ObjectMapper mapper = new ObjectMapper();
		mapper.getSerializationConfig().addMixInAnnotations(Obento.class, OgoriView.class);
		System.out.println(mapper.valueToTree(o).toString());
		// {"syusyoku":"しろめし","syusai":"カレー","fukusai":"福神漬"}
	}
}
```

[View](http://wiki.fasterxml.com/JacksonJsonViews) なんてのもありますが、一部だけ出力しないというケースには向いてません。上の例では getPrice 以外の全てのフィールドにビューのアノテーションを書かないといけなくなります。

参考:

- [java - How can I tell jackson to ignore a property for which I don't have control over the source code? - Stack Overflow](http://stackoverflow.com/questions/7421474/how-can-i-tell-jackson-to-ignore-a-property-for-which-i-dont-have-control-over)
- http://wiki.fasterxml.com/JacksonMixInAnnotations
- [JerseyでJSONシリアライズ対象外のプロパティを指定する (1) - azuki note](http://d.hatena.ne.jp/w650/20110729/1311922757)
  - 「POJO をアノテーションで汚したくない！」という場合にも mix-in は使えるんですね。
動画で見るemacs

[去年](http://blog.handlena.me/entry/2011/12/11/214923)、[一昨年](http://blog.handlena.me/entry/20101210/1291979501)にひき続き、こりずに紹介系です。

百聞は一見にしかずというとおり、
聞いた(読んだ)だけではよくわからない拡張elispは結構あるものです。

「何をするものなのかよくわからないから」という食わず嫌いで
便利な機能を使わないのはもったいない！

今回は便利な機能を実演している動画をいくつか紹介したいと思います。


## smartchr

[smartchr.el on Vimeo](http://vimeo.com/7832017)

単一キーの連続押しに機能を割り当てる拡張。
具体例があるとどのような使い方をすればいいのかがすぐわかりますね。

* 関連: [smartchr.el を使って生産性を上げる](http://tech.kayac.com/archive/emacs-tips-smartchr.html)
* [smartchr](https://github.com/imakado/emacs-smartchr)


## yasnippet

[Yasnippet Screencast - YouTube](http://www.youtube.com/watch?v=ZCGmZK4V7Sg)

はじめて「emacsすげー！！！」と思った動画。

単なる定型文貼り付けにとどまらないyasnippetの威力がよくわかります。

* [yasnippet](https://github.com/capitaomorte/yasnippet)


## undo-tree

[15:40～ Emacsデモ - YouTube](http://www.youtube.com/watch?v=EUuTZMuCZ_w)

undoの分岐を見える化した上で自在に辿れる便利機能。
動画は第2会関西アンカンファレンスでの、id:tomoyaさんの発表で、4:40あたりから紹介されてます。

* 関連記事: [Emacs デモ on 第2回関西アンカンファレンス。](http://d.hatena.ne.jp/tomoya/20110117/1295242639)
* [undo-tree](http://www.emacswiki.org/emacs/UndoTree)


## cua-mode

[Emacs Column Editing on Vimeo](http://vimeo.com/1168225)

Windows形式のショートカット(`C-c`でコピー、とか)を使えるようにするモードの、
矩形選択機能だけ使ってます。

複数行をまとめて、インタラクティブに編集するときに非常に便利。

* [cua-mode](http://www.emacswiki.org/CuaMode)


## multiple-cursors

[Emacs Rocks! Episode 13: multiple-cursors - YouTube](http://www.youtube.com/watch?v=jNa3axo40qM)

インタラクティブな置換インターフェイスを提供する拡張。
これと `replace-regexp`、`cua-mode` があれば複数行にまたがる編集はなんとかなります。

(1日目に id:tuto0621 さんが `mark-multiples.el` を紹介されていましたが、
どちらも同じ作者によるもので、`multiple-cursors.el` はその後継にあたるようです)

* 関連記事: [Emacs Rocks! Episode 13: multiple-cursors](http://emacsrocks.com/e13.html)
* [multiple-cursors.el](https://github.com/magnars/multiple-cursors.el)


## 3dmaze

[3D maze by Emacs (single player) - YouTube](http://www.youtube.com/watch?v=ckOpWQYpKjo)

いみがわからないよ！

* 関連記事: [Emacsで3DなマルチプレイヤーなFPSを作ってみた](http://d.hatena.ne.jp/kiwanami/20110413/1302709536)


## おわり

いかがでしょうか。

他人のエディタをじっくり覗きこむ機会はなかなかないので、
動画を漁ってみると今まで知らなかったemacsのチカラが見つかるかもしれません。
iOSライブラリCocoaPodsのPodfileの書き方

	platform :ios
	xcodeproj './MovieTimeline.xcodeproj'
	pod 'AFNetworking'
	pod 'LBGIFImage'
	pod 'ATMHud'

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
レポジトリをGitHubとHerokuに両対応させる

1. herokuでapp:create

		$ heroku apps:create p120902-jishiha-search
		Creating p120905-rss-process-test... done, stack is cedar
		http://p120905-rss-process-test.herokuapp.com/ | git@heroku.com:p120905-rss-process-test.git

2. `$ git clone https://github.com/weed/p120902-jishiha-search.git`
3. 作業
4. `$ git push heroku master`
5. ※ここでうまくいかないときは.git/configの`[remote "origin"]`を`[remote "heroku"]`に直したりすると、うまくいく
6. GitHubで空のレポジトリをつくる
7. .git/configに以下の記述を追加する

		[remote "origin"]	
			fetch = +refs/heads/*:refs/remotes/origin/*
			url = https://github.com/weed/p120902-jishiha-search.git

8. GitHub for Macで[repository]->[synclonize]で完了


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
bashでメタプログラミング

VagrantのConfig例。

```vagrant-config.rb
Vagrant::Config.run do |config|
  config.vm.box = "precise64"
  config.vm.network :hostonly, "192.0.2.10"
end
```

bashで頑張ってみようとすると、第一ステップでは、こんな感じか。

```bagrant-config.sh
#!/binb/bash
#
# requires:
#  bash
#
set -e

## functions

function Bargant::Config.run() {
  local param=$1

  eval "
    function ${param}() {
      echo "key : \${param}"
      echo "val : \${*}"
    }
  "

  local line
  while read line; do
    case "${line}" in
    ${param}.*)
      ${param} "${line##${param}.}"
      ;;
    esac
  done < <(cat)
}

## main / DSL

Bargant::Config.run config <<'EOS'
  config.vm.box = "precise64"
  config.vm.network :hostonly, "192.0.2.10"
EOS
```

実行結果。

```
$ bash ./bagrant-config.sh
key : config
val : vm.box = "precise64"
key : config
val : vm.network :hostonly, "192.0.2.10"
```

これを成長させれば、bashでも十分それっぽい事が可能になりそうか。
C＃でオブジェクトからオブジェクトへ変数を渡すには

ここでは落ち物ゲームの落ち物が一番下まで落ちたときに`FallenBottom`というイベントをつくる（ここは別にどうでもいい）。

## 変数を渡す元のオブジェクトで
### 変数を渡すために、変数を格納するクラスをつくる

```c#:00.cs
public class FallenBottomEventArgs : EventArgs
{
    public int FallenX;
    public FallingRect FallingRect;
}
```

### デリゲートをつくる

```c#:01.cs
public delegate void FallenBottomEventHandler(object sender, FallenBottomEventArgs e);
````

###イベントデリゲートをつくる

```c#:02.cs
public event FallenBottomEventHandler FallenBottom;
```

###メソッドをつくる

```c#:03.cs
protected virtual void OnFallenBottom(FallenBottomEventArgs e)
{
    if (FallenBottom != null)
    {
        FallenBottom(this, e);
    }
}
```

###返すデータの設定

```c#:04.cs
FallenBottomEventArgs e = new FallenBottomEventArgs();
e.FallenX = fallingRect.X;
e.FallingRect = fallingRect;
```

## 変数を渡す先のオブジェクトで
### 最後にイベントの発生を受け取る

```c#:05.cs
OnFallenBottom(e);
```


-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
JavaScript共有サイトjsFiddleでCoffeeScriptを使う

jsFiddleというのは英語圏のjsdo.itみたいなものです。

![](http://farm9.staticflickr.com/8479/8260301956_f1d0b3ee79.jpg)

1. 左サイドバーの「Panels」を開く
2. 「JavaScript」を「CoffeeScript」に変更する

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
Sublime Text 2 / WindowsでCapsキーをMacのCtrキーのように使う

こんにちは。最近MacからWindowsに移住した（くなかったのだけどやむなく移住した）筆者です。

「でもSublime Text 2はWindows版もあるじゃないか！良かった！」と思って使い始めると、何かおかしい。

    んー、なんだ？
    何が足りないんだ？
    あれれ、コードを補完したあとカーソルを行末に移動したいのだけど動かないぞ。
    おかしいな、Macではできたのに。

・・・というところで愕然と気づきました。

    Windowsの修飾キーはCtrとAltの2つしかない！
    Macより少ない！
    カーソルは進まない！
    ひえー！
    ぶっちゃけありえな～い

しょうがないから我慢して使おうと思ったのですが、人間の業とは深いものです、一度覚えた蜜の味は忘れられません。

    やっぱりだめだ
    耐えられない
    なんとかできないものか？

と思い、先駆者の知恵を探してみましたら、ありました。

- WindowsのCapsLockにCtrlを割り当て、キーバインドをMac風にする | karakaram-blog

     http://www.karakaram.com/mac-control

要するに

- CapsLock + n : 下
- CapsLock + p : 上
- CapsLock + f : 右
- CapsLock + b : 左
- CapsLock + a : Home
- CapsLock + e : End
- CapsLock + v : PageDown
- CapsLock + h : BackSpace
- CapsLock + d : Delete
- CapsLock + o : Enter
- CapsLock + k : カーソルから行末まで削除

という動きができるようにします（本当はSublime限定ではなくてマシン上の共通の操作になります。そのため、秀丸などでも同じキーバインドを使うことができます）。

ただし、途中で出てくるAutoHotKeyというツールが本家からダウンロードできなくなっています。これは下記ページにあります。

- AutoHotkey - Automation and Hotkeys | Free software downloads at SourceForge.net 

    http://sourceforge.net/projects/ahk/

気をつけたいのが（上記ページでも書かれていますが）、KeySwapを設定したら *マシンを再起動* しないと設定が有効にならないこと。この記述を見逃した私はしばらくのあいだ頭をひねってました。

これでWIndowsでも *素敵なSublime Text 2ライフ* がアナタを待っているはず。Karakaramさんに感謝！

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
Gradle実行時のProxy設定

「gradle.properties」に以下のように記述。

``` properties:gradle.properties
systemProp.http.proxyHost=xxx.xxx.xxx.xxx
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=user
systemProp.http.proxyPassword=password

systemProp.https.proxyHost=xxx.xxx.xxx.xxx
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=user
systemProp.https.proxyPassword=password
```
matlabでのfigure保存

図（figure）の保存は[saveas] (http://www.mathworks.co.jp/jp/help/matlab/ref/saveas.html)や[export_fig](http://www.mathworks.com/matlabcentral/fileexchange/23629-exportfig) などがあるが，[print](http://www.mathworks.co.jp/jp/help/matlab/ref/print.html) が個人的には一番使いやすかったという話．[こちらのページ](http://ichiro-maruta.blogspot.jp/2010/11/matlab.html)を参考にしました．

```matlab:SaveImage.m
function [  ] = SaveImage( H, width, height, filename )
%SAVEIMAGE save an image specified by figure handle H using print command

set(H,'PaperPositionMode','auto')
pos=get(H,'Position');
pos(3)=width; 
pos(4)=height;
set(gcf,'Position',pos);
print('-r0','-dpng', filename);

end
```

使ってみる

```
>> logo;
>> h=figure(1) % ハンドルの指定

h =

     1

>> SaveImage(h,600,600,'logo.png')

```
system関数でログファイルの作成

計算結果などを随時ログファイルに残しておきたいということを考える．

fopen~textscanなどでワークスペースにログファイルを入れたり出したりしてもいいが，system関数で（普段ターミナルでやってるように）ログを書き込むのが楽で良い．

```matlab:addlog.m
function [  ] = addlog( path, log, mode )
%ADDLOG create and add a log using system commands

if(nargin<2)
    mode='add'; %書き込みモード（add か newか．この辺は適当）
end

m=[];
if(strcmp(mode, 'new'))
    m=sprintf('system(\''echo %s [`date`] > %s\'')', log, path); 
% このようにsystem関数内でechoやdateといったコマンドが利用できる．
% しかもsprintfを用いることでmatlabの変数を渡すことも可能．
elseif(strcmp(mode, 'add'))
    m=sprintf('system(\''echo %s [`date`] >> %s\'')', log, path);
end
fprintf('%s\n', m);
eval(m);

end
```

実行するとこんな感じ

```
>> addlog('log.txt', 'file created', 'new')
system('echo file created [`date`] > log.txt')

ans =

     0

>> system('cat log.txt')
file created [Wed Dec 12 09:41:32 JST 2012]

ans =

     0

>> addlog('log.txt', 'new line', 'add')
system('echo new line [`date`] >> log.txt')

ans =

     0

>> system('cat log.txt')
file created [Wed Dec 12 09:41:32 JST 2012]
new line [Wed Dec 12 09:41:51 JST 2012]

ans =

     0
```
D言語でCGI

ひょっとしなくても居ないと好いのですが、CGI (Common Gateway Interface) は、PHPやPerlで書くものだと思っている人は悔い改めよ。このものたちはただ悔い改めて終わるものではない。唯一神Dが業火に投げ込むものである。
![D言語](http://lh3.googleusercontent.com/-XhqiVyzGKgY/UMgpkXRNeeI/AAAAAAAABaU/Bg1LpB6TQT8/s800/d3.png)

CGIはPerl等で書く事が多いのは確かですが、標準入力と標準出力をもつ実行ファイルに過ぎませんので、D言語でCGIを使う難易度は、低いものです。
[vibe.d](http://vibed.org/)と云う便利なWebフレームワークも出来ましたが、素人である私のレベルにあわせて、古のCGIを使いましょう。

```d:ne.d
import std.stdio;

void main() {
  printf(`content-type: text/html

<!DOCTYPE HTML>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>ももんが</title>
</head>
<body>
  ももんが
</body>
</html>`);
}
```

これを`dmd ne.d`とし、できたne.exeを、ne.cgiの名でCGIのディレクトリへ置けば、完成です。

私の環境ではvibe.dが動かなかったのですが、余りに素人過ぎて、原因を探り当てる迄いきませんでした。ついでにstd.processやstd.file等もimport出来ないのですが……。
tmuxでアタッチした時、画面がおかしくなるのを直した


#結論から言うと
attachする時-dオプションつけたら解決した

#詳細
たまにtmuxのsessionをattachした時、画面が↓な感じにおかしくなることがあったんですよ。
![変な画面](https://www.evernote.com/shard/s7/sh/3b601362-cc0f-46f5-8057-434a14db9233/12a5751da7554c3969f8ee36ec455096/res/333bac76-0e27-4806-b54f-9ee25e859349/skitch.png "変な画面")
これ困ってたんだけど、先にattachしてるやつがいて、その画面サイズに調整されてしまうのが原因だった。
つまり、先の例では↓のような先にattachしてるのがあるはず。
![先にattachしてるやつ](https://www.evernote.com/shard/s7/sh/d1563caa-fc11-4453-8826-0e7a10831542/020f4209ba9a0d7321b89442a7b3dd06/res/0232558a-8360-4497-b12f-c2e284cd25a3/skitch.png "先にattachしてるやつ")
で、man見たら-dつけたら先にattachしてるやつを強制的にdetachさせてからattachする的なこと書いてあって試してみたら正解だった。

```
tmux a -d -t test
```

みたいな感じで。

てか書いてから思ったけど画像でかすぎ
Ember Dataの紹介

[Ember Data](https://github.com/emberjs/data)は、Ember.jsのデータ永続化ライブラリです。
保存対象を抽象化していて、REST以外のストレージへの入出力もサポートしています。
readmeによると、"This release is definitely alpha-quality" とのことで、まだ正式リリースには遠いようです。
今日は、Ember DataのCRUDの方法を見ていきます。

## DS.Store

```js
App.store = DS.Store.create({
  revision: 6
});
```

DS.Storeは、ストレージアクセス層です。revisionは決め打ちです。実装されている機能ごとに、revisionが設定されているようです。デフォルトはRESTでの通信を行います。

## Defining Models

DS.Modelを継承します。

```js
App.Person = DS.Model.extend({
    firstName: DS.attr('string'),
    lastName: DS.attr('string'),
    birthday: DS.attr('date'),

    fullName: function() {
        return this.get('firstName') + ' ' + this.get('lastName');
    }.property('firstName', 'lastName')
});
```

## CRUD

idで検索します。

```js
var model = App.store.find(App.Person, 1);
```

検索条件指定もできます。

```js
App.people = App.store.find(App.Person, { page: 1 });
```

全件取得です。

```js
var people = App.store.findAll(App.Person);
```

レコードを作成します。実際に保存するのは、DS.Storeのcommitメソッドを呼んだ時です。

```js
var wycats = App.store.createRecord(App.Person,  { name: "Brohuda" });
```

レコードの更新は、対象のDS.Modelオブジェクトの値を変更し、DS.Storeのcommitメソッドを呼んだ時点で行われます;。


deleteRecord()メソッドで、レコードを削除します。実際に保存するのは、DS.Storeのcommitメソッドを呼んだ時点で行われます。

```js
var person = App.store.find(App.Person, 1);
person.deleteRecord();
```

今日の記事は以上です。
commitを呼んだ時点で、すべてのDS.Modelオブジェクトを更新するっていうのはどうなんでしょう。これで十分にまかなえるのかな。実際にアプリを作ってみないとわからないですね。
bit vector + popcntでバイナリ素性のk-NN分類器を高速化する

こんばんは @sleepy_yoshi です．Machine Learning Advent Calendar 2012 の 11日目を担当します．サモア時間ではまだ12月11日なので間に合いましたね．今日はバイナリ素性ベクトルの内積計算にSSE4.2のpopcnt命令を用いて高速化することでk-NN分類器を高速化する話について紹介します．

http://d.hatena.ne.jp/sleepy_yoshi/20121211/p1
Travis-CI で tox と Python 3.3 を使うよ


Travis-CI 便利ですね。でも現段階では Python 3.3 がサポートされてないのが惜しい。

でも、 Python 3.3 のインストールは簡単なので、すでに tox とか使ってるプロジェクトなら `.travis.yml` に複数の Python のバージョンを書くよりも `tox` を使ったほうがビルドの数も減らせるし Python 3.3 にもすぐ対応できてオススメ。

## Python 3.3 のインストール
Travis-CI のサーバーには Python のたくさんのバージョンに対応するための PPA が登録されてるので、 Python-3.3 も apt-get でインストールできる。

```
language: python
python:
    - 2.7

install:
    - sudo apt-get update -qq
    - sudo apt-get install -q python3.3-dev
```

## tox を使う

最初に Python 2.7 の virtualenv に入った状態になっているので、そこに tox をインストールして実行しよう。

Travisのマニュアルによると pip install の ``--use-mirrors`` オプションを利用することが推奨されてるから、 tox の中でそれがちゃんと使われるように環境変数も設定しよう。

```
language: python
python:
    - 2.7

env:
    - PIP_USE_MIRRORS=true

install:
    - sudo apt-get update -qq
    - sudo apt-get install -q python3.3-dev
    - pip install --use-mirrors tox

script: "tox"
```
YiiBoilerPlateがなんかすごそう


アドベントカレンダーも中盤に差し掛かってきてくだらないことしか書いてない割にはちょっとつらくなってきた頃いかがお過ごしでしょうか。みんなせっかくだからアウトプットするといいよ。
ところで、YiiBoilerPlateというのと見つけた。

[clevertech/YiiBoilerplate · GitHub](https://github.com/clevertech/YiiBoilerplate)

Extensionではないからか公式には載ってないけど、YiiBooster作ってる方のGithubにあったのでちょっと見た限り凄そうです。

##全部入りだよ
- bootstrap
- Zendのモジュール詰め合わせ
- Behatでのテスト
- デプロイ用スクリプト
- フロントエンドとバックエンドで分割済み

使い方はfrontend/wwwとbackend/wwwをドキュメントルートにしてテキトーにconfigすればなんとなく動く気がする。

大規模構成のひな形にはよさそうな感じ。
あとYiiでBehat組み込んでるのを初めて見た。こうすればよかったのかー、ほほーん。

Yiiは構成も結構自由度高いので、数少ない実装例の1つとしてすごく参考になりますね！

##それはそうと
Yiiの実装例といえば[konkinoani.me](http://konkinoani.me/)([hoshina85/konani · GitHub](https://github.com/hoshina85/konani))もありますね！普通ですね！テスト無いですね！
はーだれかpullRequestでも送ってくんねーかなー <◯＿〆
既に git 管理しているファイルをあえて無視したい

git でファイルを無視するには、通常は `.gitignore` や `.git/info/exclude` を使います。
しかし、既に git 管理下にあるファイルは、これらの設定があっても無視されません。

以下の方法を使えば、git 管理下にあるファイルをあえて無視することが可能です。

方法
====

次の2つの方法があります。どちらを使っても、ファイルの変更を無視できます。

方法(1) assume-unchanged
------------------------

```
git update-index --assume-unchanged [ファイル名]
```

この設定を取り消すには次のようにします。

```
git update-index --no-assume-unchanged [ファイル名]
```

方法(2) skip-worktree
---------------------

```
git update-index --skip-worktree [ファイル名]
```

この設定を取り消すには次のようにします。

```
git update-index --no-skip-worktree [ファイル名]
```

設定の確認
==========

上記の設定がされているファイルを確認するには、次のようにします。

```
git ls-files -v
```

* assume-unchanged 設定のファイルは、状態が小文字で表示されます。
* skip-worktree 設定のファイルは、状態が S と表示されます。

assume-unchanged と skip-worktree の違い
========================================

この2つは、以下の点が違います。

* assume-unchanged : そのファイルが作業ツリー上で変更されているときでも、git はその変更を無視して変更されていないとみなします。
* skip-worktree : そのファイルが作業ツリー上で変更されているときには、git はその変更を保ちます。

これは、以下のような状況で動作の違いとしてあらわれます。

作業ツリー上でもリポジトリ上でもファイル更新があって、それをマージするとき
--------------------------------------------------------------------------

* assume-unchanged : 作業ツリー上の更新は破棄されて、リポジトリの内容が取り込まれます。
* skip-worktree : 作業ツリー上の更新は保持されて、リポジトリの内容は取り込まれません。

作業ツリー上でファイル更新があって、`git reset --hard` を実行したとき
---------------------------------------------------------------------

* assume-unchanged : 作業ツリー上の更新は破棄されます。
* skip-worktree : 作業ツリー上の更新は保持されます。

何のために使うのか
==================

そもそも、何のためにファイルを無視したいのでしょうか。

更新確認しなくていいファイルを無視することで git status などを高速化したい
--------------------------------------------------------------------------

例えば、ネットワークドライブを使っていてファイルアクセスが遅い場合などがそうです。

このために用意されたのが、assume-unchanged 設定です。
この設定がされていると、ファイルをチェックしなくなるので高速になるというわけです。

git 管理しているファイルがビルド時に更新されてしまうが普段は無視したい
----------------------------------------------------------------------

開発環境によっては、こんな困ったファイルがあったりします。

* ビルド時に自動生成するファイルではないので git 管理したい
* ビルド時にそのファイルがあると日付だけ更新される

あるいは、ビルドで生成するファイルを git に入れている場合もあるかもしれません。

こういったファイルは、作業ツリー上では頻繁に更新しますが、git には触ってほしくありません。
このときには、skip-worktree 設定が使えます。

まとめ
======

git 管理下のファイルを無視する方法について書きました。

git は様々な細かいニーズに答えて開発されていると思います。