OmniAICreator/Qiita-1.07M huggingface dataset:
jQuery UIのAutocompleteのリストに画像を表示させる

JavaScriptでオートコンプリート機能を実装する場合、
jQueryUIにAutocompleteという便利な機能があります。
http://jqueryui.com/autocomplete/

しかし、jQueryUIのAutocompleteで表示する候補リストは
テキストでしか表示できないようになっています。

なのでfacebookの友だち検索ような画像とテキストを組み合わせた
候補をリストで出すことは不可能です。
（htmlの文字列はエスケープされてしまう。）

そこでjQueryUIネイティブの`_renderItem()`関数を置き換えることで
htmlタグを利用できるようにします。


```js
$.ui.autocomplete.prototype._renderItem = function( t, n) {
    return $( "<li></li>" )
        .data( "item.autocomplete", n )
        .append( $( "<a></a>" ).html( n.label ) )
        .appendTo( t );
};
```
　
　
元の関数はこんな感じでaタグで挟むところを`text()`でなく`html()`を利用しています。

``` js
_renderItem: function(t, n) {
  return e("<li>").append(e("<a>").text(n.label)).appendTo(t)
}
```


---

サンプルHTML

```html
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
    <script type="text/javascript" charset="utf-8">
        jQuery(function($) {
            $.ui.autocomplete.prototype._renderItem = function(ul, item) {
                return $("<li></li>").data("item.autocomplete", item).append($("<a></a>").html(item.label)).appendTo(ul);
            };

            $('#widget').autocomplete({
                source : function(request, response) {
                    //なにかしらのRequest
                    $.getJSON(url, params, function(data) {
                        var list = [];
                        for (var key in data ) {
                            var item = data[key];
                            //labelにhtmlを設定
                            list.push({
                                label : "<img width=\"24\" height=\"24\" src=\"" + item.image + ".png\" \/><span class=\"username\">" + item.username + "<\/span>",
                                value : item.value
                            });
                        }
                        response(list);
                    });
                }
            });
        });
    </script>
  </head>
  <body id="body">
    <input type="text" id="widget" name="txt" />
  </body>
</html>
```
ascensorJS を動作させたい

本家サイト説明を見てもうまく動作しなかったので動作までの道のりのまとめ。
----

__HTML__

```index.html
<body>
    <div id="navigationMap">
    <ul>
        <li><a class="ascensorLink ascensorLink1"></a></li>
        <li><a class="ascensorLink ascensorLink2"></a></li>
    </ul>    
</div>    
<div id="ascensor">
    <div>
        <h1>Home</h1>
    //floor one content here
    </div>
    <div>
        <h1>next</h1>
    //floor two content here
    </div>
</div>
</body>
```
__javascript(wrapper)実行__

```main.js
    function require_finish(){
        $('#ascensor').ascensor({
		AscensorFloorName:'Home | next',
		Direction:'chocolate',
		AscensorMap:'1|1 & 2|1'
        });
    }
```

以上が、本家にも乗っていた説明だったけどうまく動いてくれなかった。

-----

結果以下を追加したら普通に動いた。

__overflowの設定(css)__

```main.css
body{overflow:hidden;padding:0;margin:0;}
div{overflow:hidden;}
```
cssに明るくないのが露呈された感じか。。
pdist2を並列化

[pdist2](http://www.mathworks.co.jp/jp/help/stats/pdist2.html)は，データ間のペアワイズ距離を計算してくれる便利関数です．ですが，Matlabプリセットのpdist2はマルチコアでの並列化に対応してないので，データサイズがでかくなると計算時間がかかるという問題があります．

そこで本記事では，データ並列化をすることで計算の高速化を目指します．statistic toolbox (pdist2), parallel computing toolbox (parfor) が必要ですのでご注意ください．

```matlab:pdist2_parallel
function [ dmat ] = pdist2_parallel( X, Y, block_size, fun )
%PDIST2_PARALLEL parallelized version of pdist2

if(nargin<4)
    fun='euclidean'; % この辺はお好みで
end

% decompose similarity matrix
step_x=unique([1:block_size:size(X,1),size(X,1)+1])';
step_x=[step_x(1:end-1),step_x(2:end)-1];
nsteps_x=size(step_x,1);
X_sub=cell(nsteps_x,1);
for i=1:nsteps_x
    X_sub{i}=X(step_x(i,1):step_x(i,2),:); % block_sizeに基づいてデータを分割
end
step_y=unique([1:block_size:size(Y,1),size(Y,1)+1])';
step_y=[step_y(1:end-1),step_y(2:end)-1];
nsteps_y=size(step_y,1);
Y_sub=cell(nsteps_y,1);
for i=1:nsteps_y
    Y_sub{i}=Y(step_y(i,1):step_y(i,2),:); % block_sizeに基づいてデータを分割
end

dmat=cell(nsteps_x, nsteps_y);
parfor i=1:nsteps_x*nsteps_y % データ並列化します
    i1=mod(i-1,nsteps_x)+1;
    i2=(i-mod(i-1,nsteps_x)-1)/nsteps_x+1;
    dmat{i}=pdist2(X_sub{i1},Y_sub{i2}, fun);
end
dmat=cell2mat(dmat); % 結果を結合します

end
```

## 実験
実験環境は
Mac OS X (10.7.5)
Processor 2 x 2.66 GHz 6-Core Intel Xeon
Memory 32GB
Matlab2012b
12個のworkerで実験を行います（つまり最大12並列）．

* まずは分割の仕方で結果がどのくらい変わるかを見てみます．
データは実験的に100次元，5000サンプルでやってみます．
データ間距離はユークリッド距離で測ります．

```matlab
X=rand(5000,100);
block_size=[10, 50, 100, 500, 1000, 2500];

% preallocation
dmat=zeros(size(X,1),size(X,1));



for i=1:length(block_size)
    tic
    dmat=pdist2_parallel(X,X,block_size(i));
    t=toc;
    fprintf('block size %d: %f\n', block_size(i), t);
end
tic
dmat=pdist2(X,X);
t=toc;
fprintf('not parallelized: %f\n', t);
```

* 実行結果

```
block size 10: 6.520659
block size 50: 1.252058
block size 100: 1.172509
block size 500: 1.237493
block size 1000: 1.209794
block size 2500: 1.765514
not parallelized: 2.847441
```

並列化しない場合と比較して，最大で2倍強速くなりました．ただし，分割を細かくしすぎるとパフォーマンスが落ちてしまうので，適切な分割サイズを見つける必要がありそうです．

- - -

* 次に，データサイズによって結果がどの程度変わるかを見てみます．
先の実験結果を参考に，データを10分割（つまり計算を100分割）して計算してみます．

```matlab
%% test for data size
data_size=[100, 500, 1000, 5000, 10000];
for i=1:length(data_size)
    
    X=rand(data_size(i),100);
    block_size=data_size(i)/50;
    fprintf('data size: %d\n', data_size(i));

    % preallocation
    dmat=zeros(size(X,1),size(X,1));

    tic
    dmat=pdist2(X,X);
    t=toc;
    
    fprintf('not parallelized: %f\n', t);

    tic
    dmat=pdist2_parallel(X,X,block_size);
    t=toc;
    fprintf('parallelized: %f\n', t);

end
```

* 実行結果

```
data size: 100
not parallelized: 0.001552
parallelized: 0.055133
data size: 500
not parallelized: 0.029648
parallelized: 0.068817
data size: 1000
not parallelized: 0.113881
parallelized: 0.104183
data size: 5000
not parallelized: 2.892644
parallelized: 1.191135
data size: 10000
not parallelized: 11.506141
parallelized: 4.499590
```

データサイズが小さいうちはオーバーヘッドの問題で並列化しない方が高速ですが，データサイズが大きくなると，並列化した方が2倍強速くなりました．
配列の順番を無視して中身を比較する


```
array.should =~ another_array
```

で良いらしい。

## リンク
[ruby - Rspec: "array.should == another_array" but without concern for order - Stack Overflow](http://stackoverflow.com/questions/2978922/rspec-array-should-another-array-but-without-concern-for-order)
マーカーを使っているファイルを開くときにはfoldmethodをmarkerにする

普段は、foldmethod=syntaxでやっているんだけど、たまにマーカー入りのファイルを
見ることがあるという場合、切り替えるのが面倒なので、読み込むときに切り替えてやる。
以下のものを.vimrcに入れておく。

    function! SetFoldMethod()
        if search("{{{") && search("}}}")
            set foldmethod=marker
        endif
    endfunction

    au BufRead *.* call SetFoldMethod()
iTerm2のクリップボードインテグレーション(OSC 52/PASTE64)のつかいかた

=============================================================

[OSC52(PASTE64)のwrite accessが有効になったiTerm2のビルド](http://code.google.com/p/iterm2/downloads/detail?name=iTerm2-1_0_0_20121224.zip&can=2&q=)が出たので、iTerm2での具体的な使用方法をご紹介します。現状では主にtmuxユーザーに恩恵があります。

OSC52/PASTE64はxterm由来の機能で、端末エミュレータからクリップボードを操作するためのものです。

OSC52に関しては、すでに去年のターミナルマルチプレクサアドベントカレンダーで[@ttdoda](https://twitter.com/ttdoda)さんが言及していますので、興味ある方はこちらもご覽ください。

> [リモートの tmux でコピーした内容のローカルのクリップボードへの反映](http://doda.b.sourceforge.jp/2011/12/15/tmux-set-clipboard/)


設定方法
-------
先日のビルドで加わったグローバル設定、"Allow clipboard access to terminal apps"にチェックを入れます。
これだけです。

![osc52](http://zuse.jp/misc/osc52.png)

tmuxを立ち上げて、コピーモードでtmuxのコピーバッファに何かコピーしてみましょう。

どういうこと？
------------

tmuxはこんな感じのシーケンスを端末に送っています。

```
$ printf "\033]52;;%s\033\\" `printf Hello|base64`
```

これでMacのペーストボードに"Hello"という文字列が入ると思います。
Emacsではsend-string-to-terminalを使ってわりと簡単に連携できそうですね。

実は以前のiTerm2でもOSC50/CopyToClipboardというシーケンスで同じことができたのですが、これは完全に独自拡張で追従する実装がありませんでした。(今でも"Allow clipboard access to terminal apps"の設定が有効なら以前と同様に使えます)

read accessに対応する端末では

```
$ printf '\033]52;;?\033\\'
```

とするとクリップボードの内容が読み出せるのですが、iTerm2ではセキュリティの問題などを勘案し、時期早尚と判断されたため実装は見送られました。

注意点
-----
OSC 52にはセキュリティ上の懸念があることには留意しておくべきです。
[@ttdodaさんの記事](http://doda.b.sourceforge.jp/2011/12/15/tmux-set-clipboard/)でも言及されていますが、セキュリティコンテキストの異なるサーバーへSSHする時などは、影響を考えて賢く使いましょう。

プロファイルごとに有効・無効を切り換えられないの？
------------------------------------------
できません。
iTerm2はOSC50/SetProfileという端末シーケンスを使って動的にプロファイルを切り換えられるので、プロファイルごとにセキュリティ設定を切り換えるという発想は現状では厳しいです。

Terminal.appでも使いたい
----------------------
Terminal.appの端末エミュレーションを強化する、[mouseterm-plus](https://github.com/saitoha/mouseterm-plus)を使う、という方法があります。
他のOSでも使いたい場合、write accessだけの利用であればxterm、TeraTerm、RLogin、mltermなどの選択肢があります。
端末とクリップボードの連携ソリューションには様々なものがありますが、選択肢のひとつとして検討してみてください。
gist から thor のタスクをインストールする(gemもあるよ！)

thor はウェッブ上にアップロードしたスクリプトからでも（具体的にはgistとかgistとか）タスクをインストールできる。コイツァー便利だ。

```bash
thor install https://gist.github.com/raw/4303596/0fc463922105e03e59f59252d6cbf55517eaba17/thor-sample.rb
```

でも、、、、gistのraw fileの長いURLをコピペして貼り付けるのがやや面倒。

## Gem つくった

* https://github.com/udzura/thor-install-gist

```bash:INSTALL
gem install thor-install-gist
thor-install-gist-init
```

## 使う

```bash
thor install:gist https://gist.github.com/4303596
```

数字だけでも、 `gist:4303596` という記法でもいい。

## bundler 環境で使う

アナタのプロジェクトルート（というかworking directory）に `Gemfile` があると、thorは認識してしまうので、

```ruby:Gemfile
gem 'thor-install-gist', :group => :development
```

と書いておいていただけないとうまく使えない気がする。

## TODO

テテテテテテテテテテススススススススススストトトトトトトトトトトトトトトトトがない。

# Pull Request Welcome!

あと、いろいろthorのやり口に慣れていないと言うか、どう設定しても `~/.thor/` にタスクをインストールしたりするのがワイルドな感じがする。あと、working directoryから読み込める位置にタスクがあると勝手に認識する気がする。よくわかっていない。
Ubuntu 12.04の最小限の環境を構築する


Unityになってからデスクトップでの使い勝手が悪くなったUbuntu 12.04をUbuntu 11.04の使い勝手で再現する手順書。

## 1.インストール
インストーラに従って通常通りにインストールする。

## 2.ディレクトリ名
デフォルトのディレクトリ名は日本語になっているので、ターミナルからのアクセシビリティを向上させるために英語に変更する。

```bash:Bash
$ LANG=C xdg-user-dirs-gtk-update
```

## 3.インターフェース
キーボードで操作しやすくする(主に以下の2点)ためにGNOME Classicをインストールする。

* 画面左端のDOCK的な何かを表示しないようにする
* 「コマンドを実行(`Alt + F2`)」の補完を有効にする

```bash:Bash
$ sudo apt-get install gnome-session-fallback
```

## 4.日本語入力
Anthyより快適に変換できるmozcをインストールする。

```bash:Bash
$ sudo apt-get install ibus-mozc mozc-server mozc-utils-gui
```

## 5.キーボードショートカット
`Alt + F10`で最大化できなくなっているので、ショートカットキーを復元する。

アプリケーション > システムツール > キーボード > ショートカット > ウィンドウ > ウィンドウを最大化 と辿り、`Alt + F10`に変更する。
ディレクトリ単位でディスクの使用量をまとめる

調査に使った奴をとりあえず置いておく用。

``` sh
$ du --max-depth=1 /path/to
```
これで、各ディレクトリごとの使用量が`ファイルサイズ(kB)<tab>パス`という形式で出力される。
ちなみに、これだとdepth=0となる全体の使用量も出てちょっと邪魔だけど、今のところはとりあえず無視
v1.4からv3.6にアップデートしたときにやったこと


## Schema.xml
### text_2gramの検索方法の変更
ngram の fieldType を以下のように修正した。

```xml
autoGeneratePhraseQueries="true"
```

3.6では、標準で、falseとなっているようです。falseの場合、OR検索になります。

### index の圧縮
```xml
compressed="true"
```

他には、使用していない項目は無効にした。

```xml
termVectors="false"
termPositions="false"
termOffsets="false"
```

## 参考文献
[Apache Solr入門](http://www.amazon.co.jp/Apache-Solr入門-―オープンソース全文検索エンジン-関口-宏司/dp/4774141755/ref=sr_1_1?ie=UTF8&qid=1356498485&sr=8-1 "Apache Solr入門")
[Apache Solr 3.1 Cookbook](http://www.amazon.co.jp/Apache-Solr-3-1-Cookbook-Rafal/dp/1849512183/ref=sr_1_2?ie=UTF8&qid=1356498485&sr=8-2 "Apache Solr 3.1 Cookbook")
CentOSのSRPMをダウンロードしてspecファイルを取り出す

## 準備
```
yum install -y yum-utils
awk '{
ver=$3
print "[os-SRPM]\n" \
      "name=CentOS-" ver " - os SRPM\n" \
      "baseurl=http://vault.centos.org/" ver "/os/Source/\n" \
      "\n" \
      "[updates-SRPM]\n" \
      "name=CentOS-" ver " - updates SRPM\n" \
      "baseurl=http://vault.centos.org/" ver "/updates/Source/\n" \
      "\n" \
      "[extras-SRPM]\n" \
      "name=CentOS-" ver " - extras SRPM\n" \
      "baseurl=http://vault.centos.org/" ver "/extras/Source/\n"
}' /etc/redhat-release > /etc/yum.repos.d/CentOS-SRPM.repo
```

## SRPMのダウンロードとSPECファイル取り出し
pcreの例

```
mkdir /tmp/work
cd /tmp/work
yumdownloader --source pcre
rpm2cpio pcre-7.8-4.el6.src.rpm | cpio -idmv
```

## 参考
* [yum Download All Source Packages (SRPM) From RedHat / CentOS WebSite](http://www.cyberciti.biz/faq/yum-download-source-packages-from-rhn/)
* [How To Extract an RPM Package Without Installing It (rpm extract command)](http://www.cyberciti.biz/tips/how-to-extract-an-rpm-package-without-installing-it.html)
.Net用DLLを動的に呼び出す

#概要
C++のDLLを動的に呼び出すにはDllImportを使用しますが、.Net用DLLはDllImportでは呼び出せません。.Net用DLLを呼び出すにはSystem.Reflectionの機能を使用します。
#プログラム例
##呼び出し先のクラスライブラリ(ClassLibrary1.dll)

```
namespace namespace1
{
   public class Class1
   {
		public string method(string a,string b)
		{
			return a + ":" + b; 
		}
   }
}
```

##呼び出し元プログラム

```
using System.Reflection
…(略)…
Assembly asm = Assembly.LoadFrom("ClassLibrary1.dll");
Module mod = asm.GetModule("ClassLibrary1.dll");
System.Type type = mod.GetType("namespace1.Class1");
if(type != null) {
	Object obj = Activator.CreateInstance(type);
 
	Type[] types = new Type[2];
	types[0] = typeof(string);
	types[1] = typeof(string);
	MethodInfo method = type.GetMethod("method", types);
	object ret = method.Invoke(obj, new string[] { "abc", "def" });
 
	Console.WriteLine(ret);
}
```

#dynamicを使用した例
dynamicを使用すると、自然な記法でメソッド呼び出しが記述できます。

```
using System.Reflection
…(略)…
Assembly asm = Assembly.LoadFrom("ClassLibrary1.dll");
Module mod = asm.GetModule("ClassLibrary1.dll");
System.Type type = mod.GetType("namespace1.Class1");
if (type != null) {
    dynamic obj = Activator.CreateInstance(type);

    var ret = obj.method("abc", "def");

    Console.WriteLine(ret);
}
```
Flash Builder に Git プラグインを導入する


メニューから[ヘルプ]-[Eclipse Marketplace…]を選択し、表示される画面で "Git" で検索。
表示される一覧の中から、"EGit -Git Team Provider" を Install する。


![marketplace](http://gyazo.com/c02cc6aa8a5a17115fb15cc74f8fc215.png)
404エラーのときに、アラートメールを飛ばさない


## ドキュメント
[電子メールによるエラー通知](http://djangoproject.jp/doc/ja/1.0/howto/error-reporting.html "電子メールによるエラー通知")

### settings.py
```python
SEND_BROKEN_LINK_EMAILS = False
```
Rake メモ


## 引数を受け取る

```ruby:
task :name, [:first_name, :last_name] => [:pre_name] do |t, args|
  args.with_defaults(:first_name => "John", :last_name => "Dough")
  puts "First name is #{args.first_name}"
  puts "Last  name is #{args.last_name}"
end
```

http://rake.rubyforge.org/doc/rakefile_rdoc.html
Windowsでのwatchによるファイル更新監視

Windowsでwatchによるファイル更新監視がうまく行く時もあるけど行かない時もあるので、fs.watchFileを試してみた。

Node v0.9.3 + Win XP では動作を確認できました。

```
var fs = require('fs');
if (process.platform === 'win32') {
  // Windows用
  fs.watchFile(file, function (curr, prev) {/*   */ });
} else {
  fs.watch(file, function (eventName, filename) {/*   */ });
}
```

まぁ、コールバックの引数も違って使いづらいんだけど、とりあえず使える。

少し整理するとこんな感じ。fs.watchがちゃんと動いてくれる方がうれしいので、まぁ、たぶん、今のところの対策かな。

```
var watch = (process.platform === 'win32')?fs.watchFile:fs.watch
watch(file, function (arg1, arg2) {
  console.log('ファイルが更新されました');
});
```

あとは、fs.statSync(file).mtimeなどで更新時間を自前監視？
Unity Advent Calendar完成！


何はともあれ、このUnity Advent Calendarに参加いただきました皆様、有難う御座いました！
お陰様で素晴らしいAdvent Calendarになったのではないかと思います。

告知不足や告知も遅かったせいもあり、今回はなかなか人を集めることができなかったのが私の反省点です。。。

ですが勢いはあります。この勢いは来年も続きます。更に盛り上がるであろうUnity Advent Calendar2013もよろしくお願いします。

(今度はAdvent Calendarは1つにしよう…)
UnityでTransitionしたいなら「Transition Toolkit」


![](https://d2ujflorbtfzji.cloudfront.net/key-image/d3db3cfe-4e17-4765-864b-69bf46463e07.jpg)
https://www.assetstore.unity3d.com/#/content/5992 (Unity Pro必須) 

* iPod Touch5 iOS6で動作確認済み
* 多分Androidも動く


よくUnityアプリでシーンの遷移時にTransitionを行いたい。という意見を耳にします。

UnityではTransitionは標準装備されていません。

そこで、最近登場した「Transition Toolkit」を使用してみましょう。

まずはDemoとして提供されているWebPlayer形式の実行ファイルをご覧になるとよいでしょう
http://shallway.net/products/transitiontoolkit/WebPlayer.html


-

使い方はとても簡単。


# Presetsの設置

まずは「**Assets/TransactionToolkit/Presets**」にあるTransitionToolkit.prefabをヒエラルキービューにD&Dします。

> TransitionToolkitはDontDestroyOnLoadで削除されないので最初のシーンに1つだけ置くようにして下さい。

![](https://dl.dropbox.com/u/18426324/kobito/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202012-12-26%201.48.05.png)

# 遷移先のシーン作成

* Presetsを設置したシーン
* 遷移先のシーン

この2つを用意して下さい。
私はわかりやすいように遷移先のシーンにCubeを設置しました。


# スクリプトの記述
今回はデフォルトで用意されている「FadeIn」「FadeOut」を試してみます。

```cs:Presetsを設置したシーンのGameObjectにアタッチ
using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
	
	[XTransition] //後述
	public string presetName = "FadeIn";
	
	private XTransTask task = null;
	
	void Start ()
	{
		task = XTransitionToolkit.AddTransition (presetName);
	}
	
	void LateUpdate ()
	{
		if (task.ElapsedTime > 0.95f) {
			Application.LoadLevel ("Test2");
		}
	}
}

```

```cs:遷移先のシーンのGameObjectにアタッチ
using UnityEngine;
using System.Collections;

public class Example2 : MonoBehaviour
{
	
	void Awake ()
	{
		XTransitionToolkit.AddTransition ("FadeOut");
	}
	
}

```

ElapsedTimeは最新のTransitionが行われてからの経過時間です。デフォルトのFadeInは1秒かけて行われます。ちょっと前の0.95秒とすることで残り0.05秒の間にシーンのロードが行われFadeOutの処理が開始されます。

> 連続でAddTransitionを実行してもQueueの機能がないので上書きされ、すぐ実行してしまいます。注意して下さい。


そして出来たのがこれ

> 確認しやすいように上記のコードから少し手を加えています

[WebPlayer](https://dl.dropbox.com/u/18426324/kobito/WebPlayer/WebPlayer.html)

-

###[XTransition]

[XTransitionAttribute](https://github.com/anchan828/property-drawer-collection/tree/master/XtransitionAttribute)を作成しました。タイプセーフにpresetNameを扱うことができます。
Presetsにあるものをサポートしています。

-

以下は自分でXTransParamを作成から追加するまでの手順です。

1. **XTransitionToolkit.cs**をアタッチしたGameObjectを用意する。

2. 1で作成したGameObjectの子として**XTransParam.cs**をアタッチしたGameObjectを用意する。XTransのパラメータを適度にいじる

3. 2で作成したGameObjectを1のPresets配列に格納する。
GASの怖い話と対策となんか

Google Apps Script Advent Calendar最後の日です。
途中書いてなくてすいません....
書きたい内容はあるので後でちゃんと書きます。

まず、最初一人かもなーと思いながらこれを始めたのですが、多くの方が参加してくださり、非常に嬉しかったです。
本当に有難うございます。少しでもGASの情報が増えてハマる人が減るといいですね。

で今回は最後なんですが、皆さんいい話しか書いてなかったので逆に怖い話とか、対策というか心の持ちようを書いて今回のGoogle Apps Script Advent Calendarのクリスマスプレゼントとしたいと思います。

# 1. 突然変わる仕様

今回のAdvent Calendar中にも大きな仕様変更があり、おもいっきり影響をウケました。
GAS以外のGoogle系サービスは裏側の仕様が変わるので変わることを意識しておかないと精神的に病んでしまいます。

例えば今回大きかったのは

```javascript:今まで.gs
var dateString = Utilities.formatDate(new Date() , 'JST' , 'yyyy/MM/dd HH:mm:ss');
Logger.log(dateString);
```

という風に書くと「日本時間(JST GMT+9)の日付文字列」が取得できました
しかし仕様が変わりこのJST指定をしてもGMT+9の値が取得できなくなりました。


```javascript:これから.gs
var dateString = Utilities.formatDate(new Date() , 'Asia/Tokyo' , 'yyyy/MM/dd HH:mm:ss');
Logger.log(dateString);
```

と書く必要があります。

これ以外にもちょこちょこと仕様変更があり、コードを直す必要があったりします。

## どうすればいいの?

個人的にはstackoverflowの[google apps scriptタグ](http://stackoverflow.com/questions/tagged/google-apps-script)や、
GASの[issueリスト](https://code.google.com/p/google-apps-script-issues/issues/list)を定期的に見ておくことをおすすめしています。
英語が苦手な方は[Google Apps API Japan](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDEQFjAA&url=http%3A%2F%2Fgroups.google.com%2Fgroup%2Fgoogle-apps-api-japan&ei=lVbZUKPiMePumAWqsYCQCQ&usg=AFQjCNFWse5Q4Jn4Bz6ZCyS0Mj6-iYvVfQ&bvm=bv.1355534169,d.dGY)という日本語のGoogle Apps APIに関するメーリングリストがあるのでそちらを見てみたり、TwitterやGoogle+で#gasjaで調べてみるといいかもしれません。

大体僕は最低でも1日一回ぐらいは見ています。

何にせよ変わることは多々あるので多くの人で情報共有をするしか回避策が現状は無いということです。（白目

# 2. cajaの恐怖

GASの画期的なサービスの一つにHtmlServiceがあります。
HtmlServiceはその名の通りHTMLをそのまま利用してWeb画面を表示することができます。

裏側ではセキュリティの強化のためにcajaと呼ばれるサービスが記述されたhtmlやcss,javascriptを安全な形に変換し、クライアントに表示をしています。

が....
このcajaが非常に凶悪です。
まず何よりデバッグがしづらいです。
console.logやalertを利用できないことは無いのですが、chromeのconsole.logと異なり、object.toString()した状態でコンソールへ表示されます。

また、jqueryなども利用できますが一部挙動が変わることがあります。

##  どうすればいいの?

気合...
としか言い様がないのですがgas上でやらずに、[caja playground](https://caja.appspot.com/)というところで書いたhtmlやjsが動くかどうか試して見ることをお勧めします。

多少cajaによる変換エラーなどが見やすくなっています。

ちなみに僕は今回のAdvent CalendarをSSLで投稿したかったのでGAS自作のQiitaへ投稿してくれているEditorで書いていたのですが、
途中で使えなくなってしましました(白目

# 3. 日本語情報少ないよね

まだまだ日本語情報が少ないのも辛い点の一つです。

## どうすればいいの？

みんなで増やして行きましょうw
あと、今回のAdvent Calendarでも投稿してくれた[横山さん](http://qiita.com/users/ttyokoyama)が本をこれから出すらしいので#gasjaなどをチェックしていてくださいw

今回の様にどこかに少しでも情報が貯まれば幸せになれる人が多いはずですから。

# 締め

あーだこーだ悪い話を書きましたが、来年もGASを中心に楽しくやっていけたらいいっすね。

少なくとも来年も僕は続けていこうと思っています。

多分GASはGoogleの中で最も簡単にGoogleのデータを利用でき、簡単にアプリケーションを作成できるサービスです。

まだまだGAS自体が若いのでハマりどころや不安定なところも多いですが、
温かい目で見守っていこと思っています。

...
技術系のAdvent Calendarっぽくない終わりですが
皆様お疲れ様でしたw
CentOS 6.3最小構成環境を構築する

CentOS 6.3(Final)を最小構成でインストールする手順書。

## 1.パーティションの設定
```bash:Partition
/boot : 128MB  # 100MB + α
/     :  16GB  # あまり大きくしない
swap  :   4GB  # メモリ x 2
/home : 128GB  # 使い方に応じて
/var  : 512GB  # 可能な限り大きく
```

## 2.ユーザの設定
```bash:Bash
$ sudo useradd hoge
$ sudo passwd hoge
```
## 3.SELinuxの無効化
```bash:/etc/selinux/config
SELINUX=disabled
```

## 4.ネットワークの設定
```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=none
IPADDR=xxx.xxx.xxx.xxx
NETMASK=xxx.xxx.xxx.xxx
GATEWAY=xxx.xxx.xxx.xxx
DNS1=xxx.xxx.xxx.xxx
DNS2=xxx.xxx.xxx.xxx
```

## 5.パッケージの追加
```bash:Bash
$ sudo yum update
$ sudo yum install man
$ sudo yum install zip unzip
$ sudo yum install vim emacs
$ sudo yum install subversion git-core
$ sudo yum install ssh-client screen

# for tgt
$ sudo yum install gcc gcc-c++ gdb make
$ sudo yum install scsi-target-utils iscsi-initiator-utils

# for LAMP
$ sudo yum install mysql-server httpd php php-mysql
```
SSHのconfigファイルで複数の接続先を管理する

~/.ssh/configを記述することで、複数の接続先に対する鍵を管理することができます。

```bash:~/.ssh/config
Host server1.example.com
	HostName		server1.example.com
	IdentityFile	~/.ssh/server1/id_rsa
	User			server1_user
Host server2.example.com
	HostName		server2.example.com
	IdentityFile	~/.ssh/server2/id_rsa
	User			server2_user
```

 __Host__: 設定項目の識別子。ホスト名である必要はないが、ホスト名にすると重複しにくい。
__HostName__: 接続先のホスト名。
__Identifile__: 使用する秘密鍵。
__User__: 接続先ホストのユーザ名。

## 参考
[~/.ssh/config で簡単に複数ホストへのSSH接続を管理する - すぱぶろ](http://superbrothers.hatenablog.com/entry/20090730/1248971671)
Ubuntu 12.04でLAMP環境を構築する

Ubuntu 12.04にApache, MySQL, PHP, PHPMyAdminを導入してPHPアプリケーションを構築できる環境を整える手順書。

## 1.MySQL

### 1.1.インストール
```bash:Bash
$ sudo apt-get install mysql-server
```

### 1.2.文字コード設定
```bash:Bash
$ sudo vim /etc/mysql/my.conf
  # 以下の行を追加
  [mysqld]
  character-set-server=utf8
  skip-character-set-client-handshake
```

### 1.3.ユーザ設定
```bash:Bash
$ mysql -u root
  # rootのセキュリティ設定
  mysql > DELETE FROM mysql.user WHERE user = "" OR host = "::1";
  mysql > SET PASSWORD FOR root@localhost = PASSWORD("password");
  mysql > SET PASSWORD FOR root@127.0.0.1 = PASSWORD("password");
  # 新規ユーザの追加
  mysql > GRANT ALL PRIVILEGES ON db.* TO user@localhost IDENTIFIED BY "password";
```

## 2.Apache

### 2.1.インストール
```bash:Bash
$ sudo apt-get insall apache2
```

### 2.2.最低限設定
```bash:Bash
# mode_rewriteを有効化
$ sudo a2enmod rewrite

# .htaccessを有効化
$ sudo vim /etc/apache2/sites-enabled/000-default
  # 以下の部分を修正
  <Directory /var/www/>
    AllowOverride All
  </Directory>
```

### 2.3.動作確認
[http://localhost/](http://localhost/)にアクセスして以下のような画面が確認できれば成功。
![apache](http://i.imgur.com/lYPlq.png  "apache")


## 3.PHP

### 3.1.インストール
```bash:Bash
$ sudo apt-get install php5
```

### 3.2.モジュール設定
```bash:Bash
# MySQLモジュールを追加
# MySQL連携のために必要
$ sudo apt-get install php5-mysql

# cURLモジュールを追加
# Facebook PHP SDKのために必要
$ sudo apt-get install php5-curl
```

### 3.3.動作確認
```bash:Bash
$ sudo mv /var/www/index.html /var/www/index.php
$ sudo vim /var/www/index.php
  # 以下の内容に書き換え
  <?php
    phpinfo();
```

[http://localhost/](http://localhost/)にアクセスして以下のような画面が確認できれば成功。
![phpinfo](http://i.imgur.com/eDkKm.png  "phpinfo")

## 4.PHPMyAdmin

### 4.1.インストール
```bash:Bash
$ sudo apt-get install phpmyadmin
```

### 4.2.動作確認
[http://localhost/](http://localhost/)にアクセスして以下のような画面が確認できれば成功。
![phpmyadmin](http://i.imgur.com/gPQb5.png "phpmyadmin")
公開鍵認証を利用したSSH環境を構築する

コマンドの組み合わせとパーミッションの設定をよく忘れるのでメモ。

## 1.鍵の生成
```bash:Bash
# RSA暗号方式で生成
$ ssh-keygen -t rsa -C "コメント(メールアドレスなど)"
```

## 2.鍵の登録

### 2.1.ssh-copy-idコマンドで登録
Ubuntuなど、 ssh-copy-idコマンドがある場合は便利に使う。

```bash:Bash
# コマンド確認
$ which ssh-copy-id

# コマンド実行
$ ssh-copy-id user@host
```

### 2.2.標準コマンドの組み合わせで登録
ssh-copy-idコマンドがない場合はcatとsshを組み合わせる。

```bash:Bash
$ cat ~/.ssh/id_rsa.pub | ssh user@remote_host "cat >> ~/.ssh/authorized_keys"
```

## 3.パーミッションの設定

### 3.1.クライアント側(ログインする側)
```bash:Bash
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/id_rsa
```

### 3.2.サーバ側(ログインされる側)
```bash:Bash
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
```

## 参考
[ssh-copy-idコマンドで公開鍵をリモートホストに登録する - 技術メモ帳](http://d.hatena.ne.jp/lurker/20061219/1166457414)
英文を書くときの tips

Emacsで英文を書く際の tipsを紹介します。
私はコミットログを書くときぐらいしか英文を書かないんですが、
人が見るかもしれないものなので、やはりちゃんと書きたいです。
Emacsにはそんなとき役立つツールが用意されていますので、
それを使わない手はないですよね。そんなツールと外部コマンドと
連携した tipsについて紹介します。

[http://d.hatena.ne.jp/syohex/20121225/1356449561](http://d.hatena.ne.jp/syohex/20121225/1356449561)
第六回オフラインリアルタイムどう書くの参考問題の回答例。ruby で。

第六回オフラインリアルタイムどう書くの参考問題
http://qiita.com/items/4c60f10b73812e86441c
の実装。２つ目。

直積集合→和集合→積集合→濃度 を、そのまま書くという手もあるよね、という事を思いつき。
ruby なら Range の積が使えるんじゃないか、と思い、調べてみたところ。
Range に積があるのではなく、Array に product があるだけだった。
残念。
しかたないので Range に積を入れて実装してみた。

```ruby
#!ruby
#coding:utf-8
class Range
    def normalized
        ([first,last].min..[first,last].max)
    end
    def *(x)
        normalized.to_a.product( x.normalized.to_a )
    end
end

def solve( x )
    a,b,  c,d,  e,f,  g,h,  i,j,  k,l=x.scan(/\d/)
    (((a..c)*(b..d)|(a..e)*(b..f)) & ((g..i)*(h..j)|(g..k)*(h..l)) ).size
end

DATA.each{ |line|
    next unless /^\#\d+\s+(?<src>\S*)\s+(?<expected>\S*)$/=~line
    actual = solve( src )
    print "%s -> %s" % [src, actual]
    puts( actual == expected.to_i ? "" :  " *** expected is %s" % expected )
}

__END__
#1  23-94-28,89-06-51   11
#2  11-84-58,02-73-69   40
#3  18-41-86,77-04-32   26
#4  81-88-23,64-58-14   0
```

多重代入の限界に挑戦！　という風情で嫌な感じではある。
solve メソッドの二行目の式もどうかと思うが、これが書きたかったという趣旨なので仕方ない。
第六回オフラインリアルタイムどう書くの参考問題の回答例。C++ で。

お題はこちら http://qiita.com/items/4c60f10b73812e86441c

ほとんど使ったことのない`std::bitset`で。`std::bitset`に論理和、論理積があるのを今回始めて知った（あるとは思ってたけど、調べたことがなかった）。

```cpp:answer.cpp

#include "answer.hpp"

#include <bitset>
#include <string>
#include <iostream>
#include <sstream>
#include <algorithm>

typedef std::bitset<100> Bitset;

struct El
{
    int p1, p2, p3;

    Bitset asBitset() const
    {
        int x1 = p1 / 10, y1 = p1 % 10;
        int x2 = p2 / 10, y2 = p2 % 10;
        int x3 = p3 / 10, y3 = p3 % 10;

        Bitset b2, b3;

        fill(b2, std::min(x1, x2), std::min(y1, y2), std::max(x1, x2), std::max(y1, y2));
        fill(b3, std::min(x1, x3), std::min(y1, y3), std::max(x1, x3), std::max(y1, y3));

        return b2 | b3;
    }

    static void fill(Bitset& b, int x1, int y1, int x2, int y2)
    {
        for(int y = y1; y <= y2; ++y)
        {
            for(int x = x1; x <= x2; ++x)
            {
                b.set(x * 10 + y);
            }
        }
    }
};

std::istream& operator >> (std::istream& in, El& el)
{
    int  p1, p2, p3;
    char d1, d2;
    in >> p1 >> d1 >> p2 >> d2 >> p3;
    if((d1 == '-') && (d2 == '-'))
    {
        el.p1 = p1; el.p2 = p2; el.p3 = p3;
    }
    return in;
}

std::string solve(const std::string& s)
{
    std::istringstream iss(s);
    El e1, e2;
    char d;

    iss >> e1 >> d >> e2;

    std::ostringstream oss;
    if((d == ',') && iss.eof())
    {
        oss << ((e1.asBitset() & e2.asBitset()).count());
    }
    else
    {
        oss << 0;
    }

    return oss.str();
}
```

```cpp:answer.hpp

#ifndef DOUKAKU_ANSWER_HPP
#define DOUKAKU_ANSWER_HPP

#include <string>

std::string solve(const std::string& s);

#endif//DOUKAKU_ANSWER_HPP
```

```cpp:test.cpp

#include "answer.hpp"

#include <string>
#include <iostream>
#include <fstream>

struct Pattern
{
    Pattern(const std::string& s) : name(), input(), expected()
    {
        std::size_t d1 = s.find('\t');
        std::size_t d2 = s.find('\t', d1 + 1);
        if((d1 != std::string::npos) && (d2 != std::string::npos))
        {
            name     = s.substr(0, d1);
            input    = s.substr(d1 + 1, d2 - d1 - 1);
            expected = s.substr(d2 + 1);
        }
    }

    std::string name;
    std::string input;
    std::string expected;
};

int main(int, char* [])
{
    std::ifstream patterns("patterns.tsv");
    int           count_cases    = 0;
    int           count_failures = 0;
    std::string   s;
    while(std::getline(patterns, s).good())
    {
        ++count_cases;
        Pattern     pattern(s);
        std::string actual = solve(pattern.input);
        if(actual != pattern.expected)
        {
            ++count_failures;
            std::cout << "Failure in " << pattern.name << "\n"
                      << "expected: \"" << pattern.expected << "\"\n"
                      << "  actual: \"" << actual << "\"\n";
        }
    }
    std::cout << "\nCases: " << count_cases << "  Failures: " << count_failures << "\n";

    return 0;
}
```
CoronaSDKでTwitterFramework、iAdを実装する方法！


2012/12/21、Coronaの公式ブログにて、iOSアプリのTwitterFramework、iAdを利用出来る機能が発表されました。

* [Spreading some holiday cheer with new Corona features! | Corona Labs](https://www.coronalabs.com/blog/2012/12/21/spreading-some-holiday-cheer-with-new-corona-features/)

待ちに待った機能ですね！
今回は、この2つの機能に絞って使い方を見て行きましょう！

## TwitterFramework

これは、iOSに統合されたTwitterを利用する為に提供されているフレームワークですね。
以下、コードのサンプルです。

```lua:tweet.lua
local options = {
   message = "やぁ！ #fakestarbaby",
   url = "http://twitter.com/fakestarbaby",
}
native.showPopup("twitter", options)
```

これだけ、以上！
マジ簡単過ぎてビビリますね。

上記以外にも、画像が付けられたり、リスナーが登録出来たりします。
詳細は、APIリファレンスを参照して下さい。

## iAd

これは、Appleが提供しているモバイル広告プラットフォームですね。
以下、コードのサンプルです。

```lua:iad.lua
local ads = require("ads")
ads.init("iads", "YOUR APP ID")
ads.show("banner", { x = 0, y = 0 })
```

これだけ、以上！
何回も言いますけど、マジ簡単過ぎてビビリますね。

## まとめ

発表されたばかりの旬な機能、いかがでしたでしょうか？
残念ながら、ターゲットがAndroidの場合は利用出来ない機能なので、そこは既存のリソースを利用するなどして対応するしかないですけどね。
ただ、実装は本当に数行なので、是非、お試しあれ！
自作delegateメソッドの作り方


* 自分のクラスにプロトコルを宣言する

```MyClass.h
@class MyClass;

@protocol MyClassDelegate

@optional
-(void)optionDelegateMethod:(MyClass*)myClass;

@required
-(void)requiredDelegateMethod:(MyClass*)myClass;

@end


@interface MyClass : NSObject
@property id <MyClassDelegate> delegate;
@end

```
* MyClass内でこのメソッドを呼び出す

```MyClass.m
-(void)MyClassMethod{
	[self.delegate requireDelegateMethod:self];
}

```

* 他のクラスでdelegateメソッドを実装する

```SomeViewController.h
@interface SomeViewController : UIViewController <MyClassDelegate>{
	MyClass *myClass;
}
```
```SomeViewController.m
-(void)requiredDelegateMethod:(MyClass*)myClass{
	NSLog(@"requireDelegateMethod");
}


```
SKIコンビネーター計算をCoffeeScriptで試す

[SKIコンビネーター計算](http://ja.wikipedia.org/wiki/SKI%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF%E8%A8%88%E7%AE%97 "SKIコンビネータ計算 - Wikipedia") をCoffeeScriptで試してみます。

各コンビネーターは次の如くラムダ式を使って表現できます。簡単ですね。

```coffee-script:ski.coffee
I = (x) -> x
K = (x) -> (y) -> x
S = (x) -> (y) -> (z) -> (x z) (y z)
```

チャーチ数で自然数を表現してみます。チャーチ数は、次のような函数です。

```coffee-script:church.coffee
n0 = (f) -> (x) -> x
n1 = (f) -> (x) -> f x
n2 = (f) -> (x) -> f (f x)
n3 = (f) -> (x) -> f (f (f x))
```

CoffeeScriptでの函数の適用は、Haskellなどと異なり、右から結合することに留意してください。CoffeeScriptでは、f f f xと書けばf (f (f x))と同じですが、ここでは常に括弧を書くことにします。

どうすればコンビネーターを使ってチャーチ数を作れるか考えてみます。0と1は簡単に分かりました。

```coffee-script:ski_church.coffee
n0 = K I
n1 = I
```

2は難しい。

```coffee-script:ski_church2.coffee
" z を消したい "
n2 = (f) -> (z) -> f (f z)
" I, Kコンビネーターを使って変数をすべて (x z) の形にする "
n2 = (f) -> (z) -> ((K f) z) (((K f) z) (I z))
" (x z) (y z) を ((S x) y) z に置換していく "
n2 = (f) -> (z) -> ((K f) z) (((S (K f)) I) z)
n2 = (f) -> (z) -> ((S (K f)) ((S (K f)) I)) z
" z が消えた "
n2 = (f) -> (S (K f)) ((S (K f)) I)
" 同様に f も消す "
n2 = (f) -> (((K S) f) (K f)) ((((K S) f) (K f)) ((K I) f))
n2 = (f) -> (((K S) f) (K f)) ((((K S) f) (K f)) ((K I) f))
n2 = (f) -> (((S (K S)) K) f) ((((S (K S)) K) f) ((K I) f))
n2 = (f) -> (((S (K S)) K) f) (((S ((S (K S)) K)) (K I)) f)
n2 = (f) -> ((S ((S (K S)) K)) ((S ((S (K S)) K)) (K I))) f
" 変数が消え、コンビネーターでチャーチ数の2を表現できた "
n2 = (S ((S (K S)) K)) ((S ((S (K S)) K)) (K I))
```

長いけど、一応出来ました。同様にして、色々な函数をコンビネーターで表現できます。

結果を見てみます。

```coffee-script:ski.coffee
show = if console
  console.log
else
  print

I = (x) -> x
K = (x) -> (y) -> x
S = (x) -> (y) -> (z) -> (x z) (y z)

fromChurch = (f) ->
  succ = (x) -> x + 1
  (f succ) 0

show fromChurch K I
show fromChurch I
show fromChurch (S ((S (K S)) K)) ((S ((S (K S)) K)) (K I))
```

最初にshowを定義したのは、これをMoonScriptとしても動かしたかったからです。
UITableViewの背景を透過色にする

```objective-c
- (void)viewDidLoad
{
  [super viewDidLoad];
  
  UIView *backgroundView = [[UIView alloc] initWithFrame:self.tableView.bounds];
  backgroundView.backgroundColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.9];
  self.tableView.backgroundView = backgroundView;
}
```

普通にtableViewのbackgroundColorに設定すると、奇麗に表示されません。
STDAPIなexport関数をGetProcAddressで受け取るときのtypedef

何度も忘れるので。

```c:
STDAPI <a-win32-api-name>(<an-api-signature>);
```
な関数のアドレスをポインタで受け取る時は

```c: 
typedef HRESULT (STDAPICALLTYPE *<pointer-name>)(<an-api-signature>);
```
と書きましょう。

```c:
typedef STDAPI (*<pointer-name>)(<an-api-signature>);
```
とか適当に書くと

```c:
typedef "C" HRESULT __stdcall (*<pointer-name>)(<an-api-signature>);
```
と展開されて、 `error C2159: more than one storage class specified` で蹴られます。
（typedefとexternが被ってる）
rails pluginコマンドで簡単に出来るgemの作成方法。

gemを作成する際、rails pluginコマンドを使用していますが、余り使われていない、記事にされていない印象を受けたので記事を書きました。

Rails Engine, rails pluginコマンドについて詳細はこちらです。
http://d.hatena.ne.jp/passingloop/20110801/p1


上記の記事にはRails Engineの作成する方法にrails pluginコマンドが書いてあります。
(実際にはrails plugin new gem_name --mountable)
その際一緒にGemfileも作成されるので、gem pushするだけで実は簡単にgemの登録が出来てしまいます。

##実際にやってみる

今日githubのexploreにあったdaneden/amimate.cssをGemfileに1行追加して簡単に利用出来るgemを作成し、Rubygems.orgにpushしてみます。
(https://github.com/daneden/animate.css)


###Rails Engineの作成

まずrails pluginコマンド

```
rails plugin new animate-rails --mountable
```

作成されたディレクトリ内に先のcssを入れる

```
mkdir -p vendor/assets/stylesheets/animate
cd vendor/assets/stylesheets/animate
wget https://raw.github.com/daneden/animate.css/master/animate.min.css
mv animate.min.css index.css
```

animate-rails.gemspecの編集

```ruby
$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "animate-rails/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "animate-rails"
  s.version     = AnimateRails::VERSION
  s.authors     = ["Masahiro Saito"]
  s.email       = ["camelmasa@gmail.com"]
  s.homepage    = "https://github.com/camelmasa/animate-rails"
  s.summary     = "animate.css for rails"
  s.description = "animate.css for rails"
                          
  s.files = Dir["{lib, vendor}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]
                      
  s.add_dependency "rails", "~> 3.2.9"
  # s.add_dependency "jquery-rails"
                          
  # s.add_development_dependency "sqlite3"
end
```
”TODO”という文言が入っている箇所を編集し、s.filesにvendorを追加します。

これでgemの完成です。
実際にRailsで読み込んでanimate.cssが動くか試してみます。


###サンプルプロジェクトの作成

プロジェクトの作成

```
rails new animate-rails-sample
```

Gemfileに追加

```
gem 'animate-rails', path:"../animate-rails"
```

app/assets/stylesheets/application.cssに1行追加

```
*= require animate
```

サーバーの立ち上げ

```
rails s
```

ブラウザからhttp://localhost:3000/assets/animate/index.css?body=1にアクセス

 ![Hatena](http://img.f.hatena.ne.jp/images/fotolife/c/camelmasa/20121225/20121225171050.png "Hatena")

animate.cssが表示されるのが確認できました。


###Rubygems.orgに登録する

次にRubygemsに登録します。
animate-railsのディレクトリに移動。

下記コマンドを実行

```
gem build animate-rails.gemspec

WARNING:  description and summary are identical
  Successfully built RubyGem
  Name: animate-rails
  Version: 0.0.1
  File: animate-rails-0.0.1.gem
```

WARNINGはdescriptionとsummaryが一緒の場合に表示されます。

最後にRubygems.orgに登録。

```
gem push animate-rails-0.0.1.gem
```

https://rubygems.org/gems/animate-rails
 ![Hatena](http://img.f.hatena.ne.jp/images/fotolife/c/camelmasa/20121225/20121225171051.png "Hatena")

無事登録出来ました。


###まとめ
rails pluginコマンドで簡単にgemを作成してみました。
後はgithubに登録すると色々指摘が貰えて幸せになれそうですね。

animate-railsディレクトリで

```
git init
hub create animate-rails
git add .
git ci -m 'first commit'
git push origin master
```


今回のgemはこちらにあります。
https://github.com/camelmasa/animate-rails
gaffer + fabric で簡単デプロイ環境

半分個人メモというかブログの下書き。
python 界隈でアプリケーションのプロセス管理と行ったら supervisord が有名ですが
gunicorn のドキュメントを読んでいたら gaffer という似たようなツールを発見したので fabric と併せて使ってみたテスト。

インストール
-------------------

```
$ pip install gaffer
```

簡単。

Procfile が使える
--------------------
heroku をいじったことがある人ならピンと来るかと思いますが
Procfile と呼ばれるものをプロジェクト内に置いて、そいつを読ませることで指定した挙動ができます。
gunicorn で動かす場合はこんな感じ

```Procfile
gunicorn: gunicorn main:app -c gunicorn.conf.py
```

とりあえず使ってみる
-----------------------
とりあえず試したければ `$ gaffer start` で同ディレクトリの Procfile を読み込んで内容を実行してくれる。

デーモン化したければ `$ gaffer load` を実行することで Procfile をデーモン担当の
gafferd に送ってくれます。

この時、 gafferd がデーモン状態で起動していないと ConnectError が帰ってくるので
OS 起動時に gafferd --daemon が走るようにしておくこと。
(ここで小一時間詰まった)

fabric と連携
----------------------
連携というかなんというか。
とりあえず以下でデプロイができます。

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

from fabric.api import local, run, env, cd, hosts

CODE_DIR = "/お前の/ディレクト/リ"
env.user = "ユーザー名"


@hosts('localhost:5959')
def commit():
    message = raw_input("Enter a git commit message: ")
    local("git add . && git commit -m \" %s \"" % message)
    local("git push github master")


@hosts('さーばー')
def deploy():
    with cd(CODE_DIR):
        run("git pull origin master")
        #再読み込み
        run("gaffer unload")
        run("gaffer load")
```

いちいち unload しなくていいんじゃないかなーと思いつつこれから検証してみます。
スパイ大作戦のカセットのように自動的に消失するメッセージ

#お題の内容
スパイ大作戦というアメリカのドラマで、スパイに指示を伝えたカセットテープが、再生後に自動消滅する、という設定がありました。
この設定にインスパイアされ、開封されて５秒後にメッセージが跡形も無く消える、という機能を実現したいと思います。
Youtubeに、完成イメージをアップロードしています。
http://youtu.be/cicP-jtWVgM

#仕様
相手に送るメール内に、Googleスプレッドシートのリンクを内包します。スプレッドシートは起動後５秒でメッセージをクリアするよう、スクリプトを記載します。

#スクリプト
スプレッドシートが開かれた際に実行されるonOpen関数を利用します。
トーストメッセージで、５秒で消える注意を促し、５秒処理実行を待った後、メッセージエリアをクリアすることで、メッセージを消去します。
スクリプトは以下としました。

```javascript:eliminated_message.js
function onOpen() { //スプレッドシートが開かれた際に、自動的に実行される関数
  var ss = SpreadsheetApp.getActiveSpreadsheet() ;
  var sheet = ss.getActiveSheet(); //アクティブなシートを定義
  var target_range = sheet.getRange("B1:B2"); // 消去するメッセージエリアを定義
  var target_time = 5; // ５秒後にメッセージを消去
  ss.toast("このメッセージは、5秒で消えます。", "注意！", 5); //シートの右下にせりあがって現れるメッセージ
  Utilities.sleep(target_time*1000); // 5秒待つ
  target_range.clear(); // メッセージをクリア
}
```

#注意
2012年12月24日時点において、JavascriptのsetTimeout関数は使えないようです。
zsh のシェルをリセット

zsh のシェルをリセットするには

```
reset
```
っていう，そのままのコマンドがあるが，例えば .zshrc に，

```
function _xxx_ls { ls }
chpwd_functions+=_xxx_ls
```

とかって書いてあると，source する度に，cd した後の ls の結果がダブる（もちろん，chpwd_function"+=" が原因）．
けど，reset コマンドだと，これを解消してくれない（本当は，一度完全にシェルをリセットして，まっさらな状態に .zshrc を適用させて欲しい…☆）

…ってことを実現するには，

```
exec zsh -l
```

としてやればよい．これで☆と同様なことが実現できる．
そんなにしょっちゅう使うコマンドではないけど，これをタイプするのは面倒なので，例えば

```
alias reload='exec zsh -l'
```
とかってしておけばおｋ．
関数やメソッドの中で定義されている静的変数をリフレクションで取得

PHP 5.3.20 の ChangeLog を見ていて驚いたこと。

- [PHP :: Bug #63614 :: Fatal error on Reflection](https://bugs.php.net/bug.php?id=63614 "PHP :: Bug #63614 :: Fatal error on Reflection")

リフレクションを使えば関数やメソッドの中で定義されている静的変数を取得することが出来るんですね。

```php
<?php
class Test
{
    public function func()
    {
        static $a = array(1, 2, 3);
    }
}

$reflect = new ReflectionMethod('Test', 'func');
var_dump($reflect->getStaticVariables());
```

**実行結果**

```
array(1) {
  ["a"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
}
```

static とはいえ最初に実行された時に初期化されるのだろうと思っていたのでちょっと驚きました。
scikit-learnでSparse CodingとDictionary Learning -実践編-

scikit-learnのSparse CodingとDictionary Learningのクラスを使って画像の再構成を試してみました。
http://d.hatena.ne.jp/takmin/20121225/1356401851

Sparse CodingとDictionary Learning自体の解説はこちらの記事に書きました。
http://d.hatena.ne.jp/takmin/20121224/1356315231
Objective-cでC#やC++のようなメソッド呼び出しをやる

```

@interface NSArray(Linq)
typedef BOOL (^WhereFunc)(id arg0);
typedef NSArray *(^WhereBlocks)(WhereFunc func);
@property (nonatomic, readonly) WhereBlocks where;
@end
@implementation NSArray(Linq)
- (WhereBlocks)where
{
    return [^(WhereFunc func){
        NSMutableArray *array = [NSMutableArray array];
        for(id obj in self)
        {
            if(func(obj))
            {
                [array addObject:obj];
            }
        }
        return array;
    } copy];
}
@end

```

```

    NSArray *array = @[@10, @32, @-13, @43, @-142];
    array = array.where(^BOOL(NSNumber *obj){ return obj.intValue >= 0; });
    NSLog(@"%@", array);

```

はい、みにくすぎてどうしようもないですね。
arrayにblocksでフィルタをかけます。
.呼び出しでblocksを返すことで、
object.method(argments);
の表記が可能になります。
だからなんだとつっこまれたら、グウの音もでませんが・・・
Jasmineのテスト内で画像を表示する

「public」フォルダに画像ファイルを置く。

```coffeescript
describe "Sample Image", ->
  sampleImage = undefined
  beforeEach ->
    sampleImage = new Image
    sampleImage.src = "public/sample11.jpg"

  it "should be defined", ->
    $(sampleImage).appendTo('body')
    expect(sampleImage).toBeDefined()
```

これでテストページの末尾に画像が表示される

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
facebook絡みの動作をテストする

facebookでOAuth認証をして。。。なんて動作をテストする時、
コントローラのrspecではkoalaを使ってこんな感じでテストユーザを作成する。

```ruby:test_controller_spec.rb
  before(:all) do

    # DatabaseClearnerを使ってDBを初期化
    DatabaseClearner.clean

    # テストユーザ作成のためのインスタンスをつくる
    @test_users = Koala::Facebook::TestUsers.new(
      :app_id => OmniAuthConfig::FACEBOOK_API_KEY,
      :secret => OmniAuthConfig::FACEBOOK_SECRET_API_KEY
    )

    # 何人のユーザと友だち関係にいるか
    number_of_networks = 5
    # 指定したアプリに登録しているかどうか
    installed_status = true
    # アプリの権限
    permissions = 'publish_stream'

    networks = @test_users.create_network(
      number_of_networks,
      installed_status,
      permissions
    )

    @target = nil # 後のテストの為に、特定のユーザだけピックアップしておく
    networks.each do |obj|
      @target = obj if @target.nil?
      # optionanl: 特殊な情報が必要であれば、graphインスタンスを生成して自分の情報を取得
      graph = Koala::Facebook::API.new obj["access_token"]
      u = graph.get_object("me")
      # optional: 必要であれば、DBに情報を格納
      User.create(
        :fb_id => u["id"],
        :name  => u["name"]
      )
    end
  end

  after(:all) do
    # 作成したテストユーザをすべて削除
    @test_users.delete_all
  end
```
難点は、テストユーザの作成に時間がかかるのと、facebookのテストユーザ作成がコケると、以降のテストが全部失敗すること。
Kanazawa.rbが産まれました

今年の夏、ようやくというか、いよいよというか Kanazawa.rb という名前のコミュニティのようなものが始まりました。というわけでネタは Kanazawa.rb です。Ruby そのもののネタは一つも書かないので、kanazawa のコミュニティ事情みたいなものに興味のない人にはごめんなさいとまず謝っておきます。ごめんなさい。

さて Kanazawa.rb ですが

 * 基本的には月1回程度集まる
 * 何かハックしてくれればそれでよい
 * Rubyにこだわりすぎるつもりはない
 * 勉強会にこだわるつもりもない
 * まずは継続させようじゃないか
 * productive でありたい

といったことをイントロで喋ったような気がします。参加したことないけど Asakusa.rb や Tokyu.rb みたいになったらいいなと思っています。参加したことないから目指す形も分からないんですけど。

このときのイントロのスライドは公開していません。これは meetup という言葉にこだわりたいからです。公開するのは簡単なんだけど、ネット上の存在になるのは簡単なんだけど、なんか違うんじゃないか、それだと今までと変わらないんじゃないか、そう思ってあのスライドは封印しています。知りたい人はお近くの Kanazawa.rb な人に直接聞いてください :-)

まずは meet しようじゃないか。中身はそれからでいいよ。だって人間が少ないんだもの。東京みたいに内容を絞りすぎると参加者 0 とか余裕ですよ。職場でボッチになってないかい？ 仲間がほしいなー、そう思ってないかい？ まずは来てよ。有名な会社を間借りしたキラキライベントにはできないけど、タダメシイベントはできないけど、それでいいなら来てください。

本当にそれが言いたいのです。会ってみないと始まらない。このことは、実は

[Meetup - Kanazawarb](http://kanazawarb.github.com/meetup/)

に最初からはっきり書いてあります。真面目に読んだことのある人はほとんどいないと思うけど(笑

ここ数年の自分の中で最も強い問題意識の一つは、金沢という街の特徴なのか、北陸という地域の特徴なのか、この辺りの勉強会は一部の人に負担が偏った勉強会ばかりになってないかなーというものです。これは、もっと前の User Group という名前だったりした頃からたぶん何も変わっていません。だからその人が燃え尽きたり引っ越したりすると続かない。

組織的に動いているところもありますけど、特に小さなコミュニティを継続させることの難しさを感じています。

今のところの解は公的な組織を味方につけたり、あるいはコミュニティサポートの厚い企業を巻き込んだりという形が多いんですが、やっぱりやや大げさなのは否めないというか、北陸三県みんな集まれーって声掛けて30〜80名くらい集めるような形が多い。それだとやっぱ「イベント」になっちゃうし、「イベント」足り得るための「良いテーマ設定」が必要になります。というか「イベントとしての成果」が必要になります。イベントが好きな人はそれでもいいんだけど、自分はイベントがやりたいんじゃなくて、学びたいし成長したいしアウトプットしたいんです。ただそれだけ。

もう一度。

おれはね、イベントやりたいんじゃないんだよね。

何かを作りたいし共有したいし「いろんな話」を聞きたいし、参加してる人の中から何かが生まれるのを見たい。自分の疑問に答えてくれるハッカーに会いたい。あと飲みたい。おれ Kanazawa.rb 行ってマジよかった、また行きたい、「関わりたい」って思う人が増えてほしい。セミナーよりアンカンファレンスをやりたい。あと飲みたい。行動できる人が増えてほしい。飲みに行こうぜ。

そういう「場」って今までもなくはないんだけど、なかなか継続は難しいなーと感じています。あと「熱」を持った人は北陸ばっかり見てないです。それはあります。本音は自分だって仕事するなら東京の方がいいじゃんて思ってます。そりゃそうです。でも人には様々な事情があるわけです。あ、kanazawa.rb があるから金沢を出ないとか、そういう意固地なことは考えてませんよ、念のため(笑) 縁とタイミングです、えぇ。

だいぶ脱線しました。

とりあえず言いたいことは、金沢にはカーゴはやってこないってことです。待ってても何も起きない。だからみんな手と頭（アイディアや成果）を持って、まずは会おうじゃないかってことなんです。

その参考としてぼくの頭の中にお前らがいます。そんなにおおぜいとたくさんの話をしたことはないけど、お前らはいるぞ。ここに。

そういう意味で Kanazawa.rb は地域 Ruby コミュニティを名乗るにはかなり邪道ですし、Ruby Advent Calendar で何書いてんの？って感じではありますが、もしかしたら、金沢にも少しは「Rubyなお前ら」が増えるかもしれないよ、という、そんなお話でした。もしそんな Newbie を見かけたら、ハンドアックスでも椅子でも愛を込めて投げてあげてください。よろしくお願いします。

いつか Kanazawa.rb マジ行ってみてーわー憧れるわーしびれるわーと、東京の人間が地団駄踏むような、そんなコミュニティになったらいいなと、今はほのかに思っています。人材輩出ばかりじゃ続けられないもんね。

では Happy Christmas and Happy Hacking !!
Qt でデバッグ情報付きのリリースビルドを作る

Qt はデバッグビルドとリリースビルドの２つしかないが、実はデバッグ情報付きのリリースビルドも作成できる。ただし、[この方法でビルドしたものはサポートされない](https://bugreports.qt-project.org/browse/QTBUG-3934)。

configure では直接作成することが出来ないので美しい方法ではないが mkspecs 以下にある qmake.conf をいじってからビルドする。今回の例は Visual Studio 2010 で行う。 ファイルは mkspecs/win32-msvc2010/qmake.conf にある。変更する点は二箇所。

```diff
- QMAKE_CFLAGS_RELEASE    = -O2 -MD
+ QMAKE_CFLAGS_RELEASE    = -O2 -MD -Zi
- QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO
+ QMAKE_LFLAGS_RELEASE    = /DEBUG /OPT:REF
```

これで configure を実行してビルドすればデバッグ情報つきのリリースバイナリが作成出来るようになる。

ちなみにそれぞれの値は *QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO* と *QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO* の値をそのまま差し替えただけである。
[Gehirn RS2] SSHキーをBitbucketに登録してgitコマンドを使えるようにする

Gehirn RS2というか、Linux環境での登録作業

※、前準備
Gehirn RS2で前準備としてコンパネで「SSH→キーペアを生成する」にアクセスする。
これで、.ssh関連が作成されます。

1.Bitbucket用のSSHキーを生成する

```console
$ cd ~/.ssh
$ mkdir bitbucket
$ cd bitbucket
$ ssh-keygen -t rsa -C "bitbucketにユーザ登録しているメールアドレス"

ここで以下のように質問が出るので設定をします。
Enter file in which to save the key (/Users/your_user_directory/.ssh/bitbucket/id_rsa): id_rsa.bitbucket.org

※、パスワードの設定について2回質問されますが、EnterでOKです

id_rsa.bitbucket.org
id_rsa.bitbucket.org.pub

が生成されます。ここでアクセス権限を修正します
$ chmod 600 id_rsa.bitbucket.org
```

2.configの追加

```console
vim ~/.ssh/config

※、以下を追加
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/bitbucket/id_rsa.bitbucket.org
  User git
  Port 22
  TCPKeepAlive yes
  IdentitiesOnly yes
```
3.https://bitbucket.org/ へのキーの登録
ログイン後、以下のコマンドを実施します
　・トップページから「Manage Account」を選択します
　・Manage Accountでは左メニューの「SSH keys」を選択します
　・「Add Key」を選択します。登録ウインドウでは
　　Label　Gehirn　RS2
　　Key 「id_rsa.bitbucket.org.pubの内容(メールアドレスを含む)」
　を入力して「Add Key」として追加を行います。

4.接続テスト

```console
$ ssh -T git@bitbucket.org

※、正しくSSHが設定されていれば、以下のように表示されます
conq: logged in as ユーザ名.

You can use git or hg to connect to bitbucket. Shell access is disabled.
```

5.git clone

```console
$ git clone git@bitbucket.org:ユーザ名/リポジトリ名.git
※、実施後実行したディレクトリにリポジトリ名のディレクトリが作成されて
ファイルが展開されます
```

以上です。
PHP < 5.3 の遅延静的束縛

PHP < 5.3の環境でどうしても遅延静的束縛を使った実装がしたくていろいろ調べてみました。

# 結論
ほぼむりそうでした。うまいことできそうだったら教えてください。

# 遅延静的束縛について
そもそも[遅延静的束縛](http://php.net/manual/ja/language.oop5.late-static-bindings.php)というのは、以下のようなかんじでstaticな継承コンテキストで、呼び出しもとのクラスを参照できるというもの。

```php:static.php
class Member
{
    public static function getInstance()
    {
        return new static;
    }
}
class Leader extends Member {}

echo get_class(Member::getInstance()), PHP_EOL; // Member
echo get_class(Leader::getInstance()), PHP_EOL; // Leader
```

この`static::`という呼び出し方で、呼び出しもとの値を参照できて、`static::$_property`とか`static::hogeFunction()`とかっていうことができる。

これを`self::`で書くと以下のような感じで、selfが書かれたクラスを参照してしまう。

```php:self.php
class Member
{
    public static function getInstance()
    {
        return new self;
    }
}
class Leader extends Member {}

echo get_class(Member::getInstance()), PHP_EOL; // Member
echo get_class(Leader::getInstance()), PHP_EOL; // Member
```

php < 5.3では静的遅延束縛をサポートされていないので、なんとかできないものかと調べてみたけど、どうもいけてる解決策がなかった。

呼び出し元のクラス名さえわかれば、`call_user_func(array($class_name, $function_name))`とか駆使してなんとかいけるんだけど、呼び出しもとを取得する`get_called_class()`という関数もphp >= 5.3でのサポート。

ということで詰みました。

いちおういけてない妥協案をいくつか

## 1. 全クラスに書く

```bad_solution_1.php
class Member
{
    public static function getInstance()
    {
        return new self;
    }
}
class Leader extends Member
{
    public static function getInstance()
    {
        return new self;
    }
}

echo get_class(Member::getInstance()), PHP_EOL; // Member
echo get_class(Leader::getInstance()), PHP_EOL; // Leader
```

[DRY原則](http://ja.wikipedia.org/wiki/Don't_repeat_yourself)とはなんだったのか！

## 2. class名を引数で渡す

``` php:bad_solution_2.php
class Member
{
    public static function getInstance($class_name)
    {
        return new $class_name;
    }
}
class Leader extends Member {}

echo get_class(Member::getInstance('Member')), PHP_EOL; // Member
echo get_class(Leader::getInstance('Leader')), PHP_EOL; // Leader
```

staticに呼び出しているということはクラス名はわかっているはずなので、解決策1よりは行けてる気がする。ただ、全く関係ないクラスのfunctionも実行できてしまうという諸刃の剣。（ReflectionClassとか使ってチェックすれば防げるといえば防げる気はする）

## 3. debug_backtraceから呼び出し元classを取得する
[このサイト](http://djomla.blog.com/2011/02/16/php-versions-5-2-and-5-3-get_called_class/)に書いてあるやつ。

debug_backtraceから呼び出し元ファイルを行数指定で取得して、正規表現にマッチさせてクラス名を取得するという豪快な技。

すごいけど、コストが高そう。

## 4. php >= 5.3にする
最強の解決策