OmniAICreator/Qiita-1.07M huggingface dataset:
Grape での mass assignment 対策


API 作成用のフレームワークである Grape で mass assignment 対策するにはいくつかありますが、そのうちで Rails 4 の strong_parameters を使用する方法、Grape 自身の declared を使用する方法を紹介します。

## 対象

* Grape 0.3.0
* Rails 3.2.12
* strong_parameters 0.2.0

## Rails 4 の strong_parameters を使用する方法

[strong_parameters](https://github.com/rails/strong_parameters)  は Rails 4 で mass assignment 対策のためにデフォルトで追加される RubyGem です。使用方法については以下のサイトが参考になるでしょう。

* [Rails4.0に含まれる strong_parameters について - willnet.in](http://willnet.in/48)

Grape でも params があるので、Rails と同じように `params.permit(・・・` と strong_parametes を使用すると怒られます。これは Rails の params が ActionController::Parameters である一方で、Grape のそれは Hashie::Mash であり、strong_parameters が前者を期待しているからです。
そこで README に書かれているように ActionController::Parameters でラップしてあげるとうまくいきます。

Rails 4 で scaffold すると controller に 〜params と Private メソッドが作成されるように、Grape でも Helper メソッドにしておくのがいいと思います。

```ruby:articles.rb
module Api
  class Articles < Grape::API
    helpers do
      def article_params
        ActionController::Parameters.new(params).permit(:title, :content, :published)
      end
    end
  end
end
```

## Grape 自身の declared を使用する方法

Grape 自体も [declared](http://rdoc.info/github/intridea/grape/Grape/Endpoint#declared-instance_method) というメソッドを用意しています。これは API の定義時に指定する params に基づいて、そこで指定されていないものは落とすという一部 strong_parameters とよく似た動作をしています。

```ruby:articles.rb
# (略)
params do
  requires :title, type: String
  requires :content, type: String
  optional :published, type: Boolean
end
post do
  article = Article.new(declared(params, include_missing: false))
  # (略)
end

```

Rails アプリの中で組み込んで使うことが多いので、strong_parameters を使用しています。

## 参考

* [strong_parameters](https://github.com/rails/strong_parameters)
* [Rails4.0に含まれる strong_parameters について - willnet.in](http://willnet.in/48)
* [Initial idea to add permission based whitelisting to params by wyaeld · Pull Request #219 · intridea/grape](https://github.com/intridea/grape/pull/219)
zabbixでgearmandのモニタリング

## 方式
gearadmin --statusで取得した3つの値をzabbix_senderで登録します。

元々zabbix agentからユーザスクリプトで実行する方式にしていましたが、3つパラメータを取得するのに3回コマンドが実行され、タイミングがずれて3つの値の関係性が崩れてしまうのでボツになりました。

## 設定ファイル
/usr/local/sbin/send_gearman_stat_to_zabbix.sh

```
#!/bin/sh
zabbix_server=xxx.xxx.xxx.xxx
my_zabbix_hostname=${Your_Hostname_Registered_In_Zabbix}

queue_name=${Your_Queue_Name_Here}
interval_seconds=5

while :
do
  gearadmin --status | awk '
$1=="'$queue_name'"{
print "'$my_zabbix_hostname'", "gearman.total_job_count['$queue_name']", $2
print "'$my_zabbix_hostname'", "gearman.running_job_count['$queue_name']", $3
print "'$my_zabbix_hostname'", "gearman.worker_process_count['$queue_name']", $4
}' | zabbix_sender -z $zabbix_server -s $my_zabbix_hostname -i -
  sleep $interval_seconds
done
```

upstartで実行するようにしました。

/etc/init/send_gearman_stat_to_zabbix.conf

```
start on runlevel [12345]
stop on runlevel [^12345]
respawn
exec /usr/local/sbin/send_gearman_stat_to_zabbix.sh
```


## 参考
[zabbixのsnmptrap受信設定とzabbix_senderの利用: アメコロガシ](http://amecoro.seesaa.net/article/213247645.html)
[2.0:manpages:zabbix_sender \[Zabbix\]](https://www.zabbix.com/documentation/2.0/manpages/zabbix_sender)
Qiitaに自動投稿するOctopressプラグインを書いてみた



ちょっとしたメモだとかTIPSを投稿しておいたり人のメモを見れたりストックできたりと色々便利な[Qiita](http://qiita.com/)というサイトがあります。

こういったIT系の情報が集約されているサイトは非常に有難いのですが、登録はしているながらもあまり活用できてないんじゃないか？という疑念を持っているわけです。

技術メモなどはネット上に置いてしまって、ソーシャルで拡散してみんなで頭良くなればいいじゃないとは思うのですが、そういうメモなどを残そうと思うとブログに書いてしまったりで結局投稿できない。
結局フォローしているタグのRSSを読むだけになってしまっています。

そんなこんなで「それならブログに投稿したらQiitaにも反映されたら便利でいいじゃないか！」と思い至ったので、[Qiita API](http://qiita.com/docs)とそれを利用する[Gem](https://github.com/yaotti/qiita-rb)を使ってOctopressプラグインを作ってみました。


実際に書いてみたプラグインは[Gist](https://gist.github.com/hiroara/4648755)に置いています。そういえばこれ書いたの一ヶ月も前だったのね。。

もし使ってみたいという奇特な方がいたら、インストール方法等はGistに書いてあるのでそちらを参照してください。

ちなみに`2013-01-28-example-post.markdown`というファイルは[rawファイル](https://gist.github.com/hiroara/4648755/raw/56029e0d730635fdfd1c63f4ae1f86640dc63a2c/2013-01-28-example-post.markdown)で見るのをオススメします。
こんな感じで記事を書いて`rake generate`をするとQiitaに投稿されるっていうサンプルです。

ついでに、この記事もこのプラグインを使って投稿してみます。さて、いけるかな！


[元記事](http://www.ari-hiro.com/blog/2013/02/24/create-qiita-plugin-for-octopress/)
機種、画面サイズ、言語の判定


簡単だけど、いつも何だっけかなぁって思う各種判定。
コードスニペットに登録しても便利かも。

細かいデバイスの取得はErica Sadunさんの[UIDevice-Hardware](https://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.h)が便利です。

```objectivec:YSDeviceHelper.h
// iPhoneか
+ (BOOL)isPhone;
// Retinaディスプレイか
+ (BOOL)isRetina;
// 4inch(iPhone5)か
+ (BOOL)is568h;
// 言語環境が日本語か
+ (BOOL)isJapaneseLanguage;
```
```objectivec:YSDeviceHelper.m
+ (BOOL)isPhone
{
    static BOOL isPhone;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        isPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone;
    });
    return isPhone;
}

+ (BOOL)isRetina
{
    static BOOL isRetina;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        isRetina = [UIScreen mainScreen].scale == 2.f;
    });
    return isRetina;
}

+ (BOOL)is568h
{
    static BOOL is568h;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        CGFloat height = [UIScreen mainScreen].bounds.size.height;
        is568h = height == 568.f;
    });
    return is568h;
}

+ (BOOL)isJapaneseLanguage
{
    static BOOL isJapanese;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSArray *languages = [NSLocale preferredLanguages];
        NSString *currentLanguage = [languages objectAtIndex:0];
        isJapanese = [currentLanguage isEqualToString:@"ja"];
    });
    return isJapanese;
}
```
SSH鍵の作成方法


![](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20130224/20130224012827_original.jpg?1361636919)

Githubのサイトが分かりやすくて感動した。

[Generating SSH Keys · github:help](https://help.github.com/articles/generating-ssh-keys)

## Windowsの場合
OSXやLinuxにはsshコマンドが附属しているからよいけど、Windowsの場合は[PuTTY](http://www.chiark.greenend.org.uk/~sgtatham/putty/)とか使う。

## カスタマイズ
自分は`STEP1`, `STEP2`を飛ばして鍵の作成コマンドを以下のようにした。

```shell
$ ssh-keygen -t rsa -C "github" -f ~/.ssh/id_rsa_github
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): xxxx
Enter same passphrase again: xxxx
.
.
```

`-f`で出力ファイル名を指定。

- id_rsa_github (秘密鍵)
- id_rsa_github.pub (公開鍵)

の二つがファイルが出来る。後はマニュアル通り。

## まとめ
+ Githubのアカウント作る
+ ssh鍵を設定
+ ssh経由で`pull` & `push`

が出来れば、他のサービスでのSSH設定の流れも何となく分かるようになります。
nginx(1.3.13)でWebSocketのプロキシを試した


2013/2/19にnginxが正式に[WebSocketに対応した](http://nginx.com/news/nginx-websockets.html)とアナウンスがあったので、試しに使ってみました。

### ダウンロード・インストール
[ここ](http://nginx.org/en/download.html)からnginx-1.3.13をダウンロードしてきて、インストールします。
インストールオプションはあえてデフォルトで

```console
$ wget http://nginx.org/download/nginx-1.3.13.tar.gz
$ tar xvf nginx-1.3.13.tar.gz
$ cd nginx-1.3.13
$ ./configure
$ make
$ sudo make install
```

### 設定ファイルの書き換え
次にnginx.confを書き換えます。構成は

+ リバースプロキシ: 192.168.0.8:80
+ バックエンドサーバ: 192.168.0.2:3000

3000ポートの方はNode.jsのサーバを動作させておき、192.168.0.8:80に来たアクセスが、そのまま動けばOKです。別々のサーバにしていますが、リバースプロキシ上で3000ポートで動かしても良かったですね…(^^;

```
/usr/local/nginx/conf/nginx.conf
```

を普通に設定してみます。

```nginx
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://192.168.0.2:3000/;
        }
```

Node.jsのサーバで動かしておくアプリは[これ](http://qiita.com/items/78d5bc96904d9e48e4d2)です。これは接続がどうなってるかわかるので。

では起動させてみます。

```console
$ sudo /usr/local/nginx/sbin/nginx
```

![ブラウザ画面](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tomo_watanabe/20130223/20130223120952.png)

残念…xhr-pollingでしか繋がらないようです。Unexpected response code: 502 と出ています。

あれれ、と思って[@nginxorg](https://twitter.com/nginxorg)を眺めてたら、この[ツイート](https://twitter.com/nginxorg/status/303889946320699392)を発見

### 設定ファイルを再度書きかえ

チェンジセットにあるように、丸パクリで書き換えてみました。

```nginx
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://192.168.0.2:3000/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
```

さて、これで再度起動して確認します。
![ブラウザ画面](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tomo_watanabe/20130223/20130223122351.png)

おぉ！ちゃんとWebSocketで接続できるようになりました＼(^o^)／
gitのhookでtags作成 

git pull とかcheckoutで勝手にtags作成してほしかったので調べた時のをメモ。
プロジェクトのルートディレクトリ直下の`.git/hooks`ディレクトリにhookさせるファイルを置けば良いんだけど毎回置くのも面倒なので勝手に作ってくれる設定

```sh:command
cd
mkdir -p .git_tmp/hooks
cd .git_tmp/hooks
touch post-commit # git commit hook
touch post-merge # git merge, git pull hook
touch post-checkout # git checkout hook
touch ctags
chmod +x *
```

`post-`系、`ctags`の中の記述は以下

```sh:post-系
#!/bin/sh
.git/hooks/ctags >/dev/null 2>&1 &
```

```sh:ctags
#!/bin/sh
/usr/local/bin/ctags -R .
```

`git init`時に自動的に作成したhooksファイルが作成されるように以下を流す。

```sh:command
cd
git config --global init.templatedir '.git_tmp' 

```

既存のgitプロジェクトには`git init`コマンドを打てば設定したhooksが反映される。既にあるファイルは上書きされないみたいです。

## vim-fugitiveを使っている場合
やらなくてもいいんだけど
[vim-fugitive](https://github.com/tpope/vim-fugitive)はtagsの読み込み場所を追加してくれているようだ。

`.git/tags`を閲覧できるようになっている。
https://github.com/tpope/vim-fugitive/blob/master/plugin/fugitive.vim#L154

tagsが普段見えないところに置ける。せっかくなのでそこに追加してあげる記述方法は以下。

```sh:ctags
#!/bin/sh
/usr/local/bin/ctags -R -f .git/tags `pwd`
```

## 参考
- [git のcommit/merge/checkoutなどのタイミングでctagsを実行するフックスクリプト #ctags #git - Qiita] (http://qiita.com/items/d9466e699d84c2a7b149)
- [Git - Git フック] (http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
- [プレインテキスト: git pullのhookをglobalに設定する] (http://tajimajunpei-blog.blogspot.jp/2012/05/git-pullhookglobal.html)
- [dotfiles/git/template/hooks at master · maxim/dotfiles · GitHub] (https://github.com/maxim/dotfiles/blob/master/git/template/hooks)
Audio Unitのコールバック関数を登録する方法３種の比較

Audio Unit で、コールバック関数を登録するための方法が何通りかあって、何だかややこしかったので整理してみました。


##AudioUnitSetProperty

まず一番基本的なものである `AudioUnitSetProperty` から。

````
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = renderCallback;
callbackStruct.inputProcRefCon = &audioDataInfo;
AudioUnitSetProperty(hogeUnit,             // 対象となるAudio Unit
                     kAudioUnitProperty_SetRenderCallback,
                     kAudioUnitScope_Input,     // スコープ
                     0,                         // バスナンバー
                     &callbackStruct,           // AURenderCallBackStruct構造体へのポインタ
                     sizeof(callbackStruct)     // AURenderCallBackStruct構造体のサイズ
                     );
````

`AudioUnitSetProperty` は Audio Unit に対して**各種プロパティをセットするための関数**です。ここでは {対象となるAudio Unit}{スコープ}{バスナンバー} に対して `kAudioUnitProperty_SetRenderCallback` というプロパティに `AURenderCallBackStruct` 型の値を指定しています。


引数は多いですが、そのぶん暗黙的な部分がなくてわかりやすいです。


##AUGraphSetNodeInputCallback

こちらは AUGraph の**特定のノードの入力に対して**コールバック関数を指定するための関数。

````
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = renderCallback;
callbackStruct.inputProcRefCon = &audioDataInfo;
AUGraphSetNodeInputCallback(processingGraph,    // 対象となるAUGraph
                            hogeNode,      // 対象となるAUNode
                            0,                  // バスナンバー
                            &callbackStruct     // AURenderCallBackStruct構造体へのポインタ
                            );
````

**暗黙的にスコープは `kAudioUnitScope_Input`**、構造体のサイズは `AURenderCallBackStruct` のサイズなので、`AudioUnitSetProperty` と比較するとこれら２つ分の引数が省略されています。


##AUGraphAddRenderNotify

こちらは AUGraph がレンダリングを行った際に通知を受けるコールバック関数を登録するための関数。

````
AUGraphAddRenderNotify(processingGraph,
                       renderCallback,
                       (__bridge void *)(self));
````

これを使用した場合、**AUGraph の最後**、たとえば Remote IO Unit でスピーカー出力している場合は、その出力時に通知を受け、コールバックが呼ばれるようになります。


`AURenderCallbackStruct` 構造体を介さず直接コールバック関数と、コールバック関数で参照するデータ（`inputProcRefCon` にセットしていたもの）を渡します。
Ubuntu上でのJava開発環境

Ubuntu上で、EclipseやIntelliJ IDEA CEをapt-getでインストールして使用する場合、
OpenJDK6が必須で、デフォルトのjavaコマンドである必要があるらしい。

どうやら、SWTなどのライブラリーがOpenJDKのlib/extにシンボリックされているのが原因。
これを、Oracle JDKのlib/extに同じようにシンボリックリンクを作ってやれば動くかも知れないが、未検証。
シェルスクリプトでFizzBuzzワンライナー

オープンソースカンファレンスの以下のセッションを聞いて、その中に出てきた問題の１つだったFizzBuzzワンライナーを自分でも少し弄って書いてみました。
- [覚えて楽するシェル一行野郎、10選！- 魅せます☆華麗なシェル芸！](https://www.ospn.jp/osc2013-spring/modules/eguide/event.php?eid=55) 

```
$ jot 100 | awk '$1%3==0&&$1%15!=0{print "Fizz"} $1%5==0&&$1%15!=0{print "Buzz"} $1%15==0 {print "FizzBuzz"} $1%3!=0&&$1%5!=0{print $1 }' | tr ' ' '\n'
```

```
$ seq 1 100 | awk '$1 %3 == 0 && $1 %15 != 0 {print "Fizz"} $1 %5 == 0 && $1 %15 != 0 { print "Buzz"} $1 %15 == 0 {print "FizzBuzz"} $1 %3 != 0 && $1 %5 != 0 { print $1 }'
```
今月の最終日を取得する

```javascript:lastday.js
function lastday () {
    var check,
    now = new Date(),
    y  = now.getFullYear(),
    m = now.getMonth();
    for ( i = 27; i < = 32; i++ ) {
        check = new Date( y, m, i );
        if ( check.getMonth() != m ) {
            return i - 1;
        }
    }
}

document.write( '今月の最終日は'+ lastday() +'日です。' );
```
閏年とか気にしないで取得できます。
PythonでOpencvを使えるようにする


[Mac_OS_X_OpenCV_Port - OpenCV Wiki](http://opencv.willowgarage.com/wiki/Mac_OS_X_OpenCV_Port/)

brewでインストールする。

```
brew install opencv
```

その後に

```
export PYTHONPATH="/usr/local/lib/python2.7/site-packages/:$PYTHONPATH"
```

を行うと出来た。
ファイルの変更を監視し、ブラウザを自動でリロード

## AutoLoader
ファイルの変更を監視し、ブラウザを自動でリロードしてくれます。
コーディングの際、CSSやHTMLを変更したあと保存すると
かってにブラウザをリロードしてくれます！
ブックマークレット形式なので簡単に使えます。
FileAPIを利用しているため、IEでは動かなかったりします。

## 使い方
![AutoLoader](http://cdn-ak.f.st-hatena.com/images/fotolife/r/rskull/20130222/20130222225251.png)

１．まずは下のリングをブックマークバーに登録します。
２．リロードしたいページを開いた状態で、ブックマークレットをクリックすると小ウィンドウが開きます。そこのグレーのボックスに監視したいファイルをドロップして下さい。
３．監視ファイルを変更すると、親ウィンドウが自動でリロードされます！
４．監視を辞めたいときは、小ウィンドウを閉じるかリストをクリックすればOKです！

## Bookmarklet
###[AutoLoader](javascript:\(function\(\){if\(!window.File\){alert\(&quot;対応していません！&quot;\);return}var e=window.open\(&quot;&quot;,&quot;autoloader&quot;,&quot;width=350, height=450px, location=no&quot;\);if\(e.autoload\)e.foucus\(\);else{var t=e.document,n=t.createElement\(&quot;div&quot;\),r=t.createElement\(&quot;script&quot;\);n.innerHTML='<style>#main{width:300px;margin:auto}#drop{border:3px solid #555;background:#CCC;height:150px;margin-top:5px}.list{border:dashed #AAA;border-width:1px 0px;margin-top:10px;padding:5px;height:170px;overflow:auto;cursor:default}li:hover{color:#F00}p{text-align:center}</style><div id=&quot;main&quot;><input id=&quot;file&quot; type=&quot;file&quot;><div id=&quot;drop&quot;></div><div class=&quot;list&quot;><ul id=&quot;list&quot;></ul></div><p>Copyright 2013 AutoLoader Geekz</p></div>',r.innerHTML='\(function\(e,t\){var n=e.autoload,r=function\(e\){return t.getElementById\(e\)};autoload={},autoload.FPS=250,autoload.observer={list:{},getFiles:function\(e\){return e.target.files?e.target.files:e.dataTransfer.files},addFiles:function\(e\){var t=this.getFiles\(e\);for\(var n=0;n<t.length;n++\)this.enable\(t[n]\)},checkPoint:function\(e\){var t;try{t=e.lastModifiedDate.toString\(\)}catch\(n\){t=e.getAsBinary\(\)}return t},enable:function\(n\){var i,s,o=r\(&quot;#list ul&quot;\);s=this.checkPoint\(n\),this.list[n.name]=setInterval\(function\(\){i=autoload.observer.checkPoint\(n\),s!=i&&\(s=autoload.observer.checkPoint\(n\),e.opener.location.reload\(\)\)},autoload.FPS\);var u=t.createElement\(&quot;li&quot;\);u.addEventListener\(&quot;click&quot;,function\(\){this.parentNode.removeChild\(this\),autoload.observer.remove\(n.name\)},!0\),r\(&quot;list&quot;\).appendChild\(u\).innerHTML=n.name},remove:function\(e\){clearInterval\(this.list[e]\),delete this.list[e]}},setInterval\(function\(\){\(!e.opener||e.opener.closed\)&&e.close\(\)},500\),input=r\(&quot;drop&quot;\),input.addEventListener\(&quot;dragenter&quot;,function\(e\){e.preventDefault\(\)},!0\),input.addEventListener\(&quot;dragover&quot;,function\(e\){e.preventDefault\(\)},!0\),input.addEventListener\(&quot;drop&quot;,function\(e\){autoload.observer.addFiles\(e\),e.preventDefault\(\)},!0\),r\(&quot;file&quot;\).addEventListener\(&quot;change&quot;,function\(e\){autoload.observer.addFiles\(e\)},!0\)}\)\(window,document\)',t.title=&quot;Autoloader ver.1.0&quot;,t.body.appendChild\(n\),t.body.appendChild\(r\)}}\)\(\))
↑ブックマークレット！これをタブにドラックして登録して下さい。
brew update でコケるときの対処法


```Bash
Error: SHA1 mismatch
```

みたいなのが出たのでググる。


[homebrewが"Error: SHA1 mismatch"でこける - 無気力ITエンジニアの備忘録](http://d.hatena.ne.jp/yano-htn/20120317/1331973189)

[ざくにく定食: brew updateでコケた](http://zakuni.blogspot.jp/2012/09/brew-update.html)

```Bash

% cd `brew --prefix`
% git fetch origin
% git reset --hard origin/master
% brew update

```

でなおった。
Eclipse Junoで入れておくと便利なプラグイン


| plugin名 | update site |
|:--:|:--|
| JDEclipse-Realign | http://mchr3k-eclipse.appspot.com/ |
| StartExplorer Eclipse plug-in | http://basti1302.github.com/startexplorer/update/ |
| Composite Jetty8 P2 repo | http://download.eclipse.org/jetty/updates/jetty-bundles-8.x |
| Groovy-Eclipse | http://dist.springsource.org/release/GRECLIPSE/e4.2/ |
| Gradle Eclipse Plugin | http://www.breskeby.com/downloads/gradle/eclipse/update/ |
| SpringSource Update Site for Gradle Integration for Eclipse | http://dist.springsource.com/release/TOOLS/gradle |
| TestNG | http://beust.com/eclipse |
| EclipseFP | http://eclipsefp.sf.net/updates |
| EGit | - |
| m2e | - |
| WindowBuilder関連 | - |
XCodeで使う秘密鍵を別Macにコピーする方法を3行で

====

http://d.hatena.ne.jp/tksthdnr/20110723/1311417829 にある通り。

* MacAで使ってるdeveloper証書に紐付く秘密鍵をファイル(.p12)に保存（「証明書を書き出す」）
* 保存したファイルをMacBにコピー
* MacBで.p12ファイルをダブルクリック
コマンドラインでMIMEヘッダーをエンコード＆デコードする方法


## 背景

MIME(マイム)とはインターネットの電子メールで様々なフォーマットを扱えるようにする規格のことです。MIMEによって電子メールにPDF、画像、動画など様々なドキュメントを添付することができます。

しかし、本来電子メールはUS-ASCIIしか使用できないため、メールのヘッダー部分にそのままマルチバイト文字を入れることはできません。そのため、現在の電子メールでは以下のような形式で文字列をエンコードして、ヘッダーに格納しています。

>  =?charset?encoding?encoded-text=?=

そこで、このようなフォーマットの文字列をコマンドラインでエンコード、デコードする方法について書いていきます。

こういうときに、nkf コマンドが大活躍します。

なお、MIME の説明については端折るのであしからず。

## インストール

mac の場合

<pre>
$ brew install nkf
</pre>

## エンコーディングの変換

MIMEの前に文字エンコーディングの変換について

- nkf -w: UTF-8 に変換
- nkf -e: EUC-JP に変換
- nkf -s: Shift-JIS に変換
- nkf -j: JIS(ISO-2022-JP) に変換

## MIMEエンコード 
### UTF8文字列 → MIME エンコード

「ほげほげ」は UTF8 文字列として、UTF8のままMIMEエンコードするとします。

#### 例
<pre>
$ echo ほげほげ | nkf -M
=?UTF-8?B?44G744GS44G744GS?=

$ echo ほげほげ | nkf -MB
44G744GS44G744GSCg==

$ echo ほげほげ | nkf -MQ
=E3=81=BB=E3=81=92=E3=81=BB=E3=81=92
</pre>

#### 解説

- nkf -M: Base64 で MIMEエンコードする
- nkf -MB: Base64 で MIMEエンコードする
	- encoded text だけ取り出す 
- nkf -MQ: quoted-printable で MIMEエンコードする
	- encoded text だけ取り出す 


### UTF8文字列 → MIME エンコード(JIS)

次に、出力のエンコーディングをJISでMIMEエンコードします。
上で説明した通り、nkf -j オプションを加えるだけで簡単に実現出来ます。

#### 例
<pre>
$ echo ほげほげ | nkf -jM
=?ISO-2022-JP?B?GyRCJFskMiRbJDIbKEI=?=

$ echo ほげほげ | nkf -jMB
GyRCJFskMiRbJDIbKEIK

$ echo ほげほげ | nkf -jMQ
=1B=24B=24=5B=242=24=5B=242=1B=28B
</pre>


## MIMEデコード

### 例

<pre>
$ echo "=?ISO-2022-JP?B?GyRCJFskMiRbJDIbKEI=?=" | nkf -w
ほげほげ

$ echo GyRCJFskMiRbJDIbKEI= | nkf -wmB  
ほげほげ

$ echo "=1B=24B=24=5B=242=24=5B=242=1B=28B" | nkf -wmQ
ほげほげ
</pre>

### 解説

nkf -m: MIME デコードする

入力が「=?charset?encoding?encoded-text=?=」の形式の場合、-m オプションなしでも自動でMIMEデコードしてくれます。便利ですね！
入力が encoded-text だけの場合、明示的に -m オプションと content-transfer-encoding の形式を指定します。
Vim設定してみた

もう下記を見てやってみた（コピペした）だけ。ごめんなさいごめんなさい。
http://www.curiosity-drives.me/2012/01/rails.html
http://www.curiosity-drives.me/2012/01/vimjavascript.html
とりあえず何か出来たようなので様子を見てみる。

Macからコピペするとインデントが妙な事になるのだけど、:a! してから入力すると良いらしい。
withブロックの中でreturnした場合の挙動


別に面白くもない確認。

with文のブロック内でreturnした場合にコンテキストマネージャの終了処理はちゃんと呼ばれるのか不安になって確かめた。

結論としては大丈夫。

```python:withreturn.py
class Some(object):
    def add(self, x, y): 
        return x + y 

    def close(self):
        print "Closed"


from contextlib import closing
def foo(x):
    with closing(Some()) as some:
        return some.add(x, 10) 


print foo(16)
# Closed
#=> 26
```

このように終了処理が呼ばれる。
任意引数と*args, **kwargs


# 任意引数の後ろに*args, **kwargsを置くのはok
*argsの前に任意引数を置くことは可能。
以下のコードは通る。

```python:optionalarg.py
def foo(x=10, *args, **kwargs):
    return x, args, kwargs


print foo(12, 13, 14) 
#=> (12, (13, 14), {})
```


しかし、任意引数の後ろに必須引数を定義することはできない。
以下のコードは構文エラーになる。

```python:syntaxerror.py
def foo(x=10, y, *args, **kwargs):
    return x, y, args, kwargs
# SyntaxError: non-default argument follows default argument
```


# 「任意引数」と「名前付き引数」という用語について
任意引数と名前付き引数という用語があるが、どう使い分けるべきなのだろうか？

『Dive In Python』を読むと以下のように推測できる。

1. 関数の定義に使う場合は「任意引数」。「必須引数」の対概念。
2. 関数の呼び出しに名前を指定する場合は「名前付き引数」。

(リンク: 英語版読むの面倒なのでcocoatomoの翻訳版)
http://cocoatomo.iza-yoi.net/DIP/power_of_introspection/optional_arguments.html
githubってforkしてきたリポジトリがfork元の変更に追随するにはどうすれば良いものなんだ？

と思って調べた。githubあんまり使いこなしていないので、何かgithub流のオペレーションがあるのかと思ったら、gitでマージする形だった（あたりまえ？）

http://code.ttsoft.jp/2012/07/merge-my-repository-from-fork-origin-in-github.html
Rで厳密制約サポートベクトルマシン

PRML 7.1に記載の、線形分離可能なデータを分類するサポートベクトルマシンを構成し、推定値、およびサポートベクトルを図示します。なお、カーネル関数は用いておらず、線形カーネル相当となります。二次計画法には、kernlabパッケージのipopを用いています。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/IhPBWfpewZ/14.HardMarginSupportVectorMachine.png)

```r
library(MASS)
library(kernlab)
frame()
set.seed(0)
par(mfcol=c(1, 2))
par(mar=c(3, 3, 1, 0.1))
par(mgp=c(2, 1, 0))
xrange <- c(-4, 8)
yrange <- c(-8, 4)
x1 <- seq(xrange[1], xrange[2], .1)
x2 <- seq(yrange[1], yrange[2], .1)
x <- mvrnorm(10, c(0,1), matrix(c(2, 1.9, 1.9, 2), 2))
d1 <- as.data.frame(cbind(x, 1, 1))
x <- mvrnorm(10, c(2,0), matrix(c(2, 1.9, 1.9, 2), 2))
d1 <- rbind(d1, as.data.frame(cbind(x, 2, -1)))
x <- mvrnorm(5, c(7,-7), matrix(c(.2, 0, 0, .2), 2))
d2 <- rbind(d1, as.data.frame(cbind(x, 2, -1)))
d3 <- as.data.frame(rbind(cbind(1, 1, 1, 1), cbind(0, 1, 2, -1)))
names(d1) <- c("x1","x2","class","t")
names(d2) <- c("x1","x2","class","t")
names(d3) <- c("x1","x2","class","t")

doplot <- function(d) {
	N <- nrow(d)
	
	# quadratic programming
	cc <- matrix(rep(-1, N))
	hmat <- cbind(d$t * d$x1, d$t * d$x2)
	hmat <- hmat %*% t(hmat)
	ll <- matrix(rep(0, N))
	uu <- matrix(rep(1.0e+8, N)) # don't need the upper bound, though...
	bb <- 0
	rr <- 0
	amat <- matrix(d$t, nrow=1, ncol=N)
	sv <- ipop(cc, hmat, amat, bb, ll, uu, rr)
	a <- primal(sv)
	
	# non-support vectors
	a[a < 1.0e-5] <- 0
	
	# derive b
	bs <- c()
	for (n in 1:N) {
		if (a[n] != 0) {
			bs <- c(bs, d$t[n] - rowSums(a * d$t * (cbind(d$x1[n], d$x2[n]) %*% t(cbind(d$x1, d$x2)))))
		}
	}
	b <- mean(bs)
	
	# plot estimates
	estimate <- function(x1, x2) {
		result <- 0
		for (n in 1:N) {
			if (a[n] != 0) {
				result <- result + a[n] * d$t[n] * (cbind(x1, x2) %*% t(cbind(d$x1[n], d$x2[n])))
			}
		}
		result <- result + b
	}
	y1 <- outer(x1, x2, estimate)
	plot(d$x1, d$x2, col=d$class, type="n", xlim=xrange, ylim=yrange)
	image(x1, x2, y1, xlim=xrange, ylim=yrange, col=terrain.colors(32), add=T)
	contour(x1, x2, y1, xlim=xrange, ylim=yrange, levels=c(-1, 0, 1), add=T)
	par(new=T)
	plot(d$x1, d$x2, pch=ifelse(a == 0, 1, 16), col=d$class, xlim=xrange, ylim=yrange)
	title("y(x)")
}

doplot(d1)
doplot(d2)
```
Express3.xで削除されたlayout(partials)の代替手段

Expressの3.xから、レイアウトという概念が無くなったらしい。
↓
Migrating from 2.x to 3.x
https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
邦訳
http://blog.craftgear.net/50186114d0bf7ac340000001/title

同様の機能はテンプレートエンジンの方でやってくださいということらしい。
ejsの場合は、express-partialsを使えば実現できた。
jadeは試してない。

express-partials
https://github.com/publicclass/express-partials
RubyでExcelシートの操作をする


[ドキュメント](http://spreadsheet.rubyforge.org/GUIDE_txt.html)

```
gem install spreadsheet
```

```ruby:sample.rb
require 'spreadsheet'

Spreadsheet.client_encoding = 'UTF-8'
dir = './'
file = 'sheet.xls'
book = Spreadsheet.open File.join(dir, file)

# ワークシートの数
puts book.worksheets.count

# １番目のワークシートを取得
ws = book.worksheets[0]

# ワークシート名
puts ws.name

# ワークシートの行数
puts ws.row_count

# ワークシートの列数
puts ws.column_count

# １行目を取得
puts ws.row(0)

# 1行目の1列目を取得
puts ws.row(0)[0]

# ワークシートを順番に処理
book.worksheets.each {|ws|
}
```
Couchbaseを試す


http://www.couchbase.com/download
ここからMac版のバイナリをダウンロード。

zipを展開すると、
![app](http://gyazo.com/87a4ada799ccc7f9a570f702c271dccc.png?1361543263)
これだけ。
(これを起動すればいいのだけど起動後にApplicationsとかに移動するとおかしくなるのではじめの起動の前に好きなところに移動しておくのがおすすめ。やっちゃったら、~/Library/Application Support/Couchbaseを消すと初期化できる)

アプリを起動すると、右上に、
![icon](http://gyazo.com/0ebeb2800398ada9d3ffe73a24c5d256.png)
カウチiconが現れるので、クリック、「Open Admin Console」を選ぶと、http://127.0.0.1:8091/index.html が開いて、

![](http://gyazo.com/afcbbc799090a87b1f83d5e3a2d7c5db.png?1361543726.png)

SETUP押すと、

![](http://gyazo.com/b395616900d9b68a095e921fb2d39277.png?1361543786.png)

メモリサイズを選んでクラスタ作れる？これだけ？？

![](http://gyazo.com/cc4d9bc4b8d76ee0f3a35baf69378998.png?1361543941)

サンプルデータベースを選んで進む。

![](http://gyazo.com/df3b9bab08ba159bc5dfda8abfb3e294.png?1361544154)

BucketType=Memcachedは永続化されないのでCouchbaseを選ぶ。

Index replicasとは？Flushとは？

気になるけどせずそのまま進む。

![](http://gyazo.com/201c866782328c2b88183d44c64ff4bf.png?1361544308)

気にせず進む。

![](http://gyazo.com/1005127e81099508ccc909ac1230ef30.png?1361544389)

管理者パスワードを設定して進む。

![](http://gyazo.com/79b82a1fbb02a84a0b3cab2c45228645.png?1361544503)

Congratulations!!!
みたいなのを期待したけど何もなく、管理画面に到達。
簡単すぎる。
Python - MP3ファイルにタグづけ

```sh:
$ pip install mutagen
```
```python:
from mutagen.id3 import ID3, TIT2, TALB, TPE1, TRCK, APIC, TDRC, TCON
from mutagen.mp3 import MP3
import mutagen.id3

def sample(filename, album, artist, title, track, genre, date, description, savepath):
    """
    MP3ファイルにタグをつける
    """
    m = MP3(filename, ID3=ID3)

    try:
        m.add_tags(ID3=ID3)
        #print("Added tags to %s" % filename)
    except mutagen.id3.error:
        #print("%s already had tags" % filename)
        pass

    m["TPE1"] = TPE1(encoding=3, text=artist)           # アーティスト
    m["TIT2"] = TIT2(encoding=3, text=title)            # タイトル
    m["TALB"] = TALB(encoding=3, text=album)            # アルバム名
    m['TCON'] = TCON(encoding=3, text=genre)            # ジャンル
    m['TDRC'] = TDRC(encoding=3, text=date)             # リリース年
    m["TRCK"] = TRCK(encoding=3, text=[str(track + 1)]) # トラックナンバー

    # ジャケット画像
    if savepath:
        m.tags.add(
            APIC(
                encoding=3,        # 3 is for utf-8
                mime='image/jpeg', # image/jpeg or image/png
                type=3,            # 3 is for the cover image
                desc=u'Cover',
                data=open(savepath).read()
            )
        )
    m.save()
```
#RRGGBB(16進RGB)からUIColorを作る

初投稿です

htmlなんかでよく使う#RRGGBBの色からUIColorを生成したい場合のメソッドです。
UIColorのカテゴリとして宣言します。

```objc:UIColor+Hex.m
@implementation UIColor (Hex)
+ (id)colorWithHexString:(NSString *)hex alpha:(CGFloat)a {
	NSScanner *colorScanner = [NSScanner scannerWithString:hex];
	unsigned int color;
	if (![colorScanner scanHexInt:&color]) return nil;
	CGFloat r = ((color & 0xFF0000) >> 16)/255.0f;
	CGFloat g = ((color & 0x00FF00) >> 8) /255.0f;
	CGFloat b =  (color & 0x0000FF) /255.0f;
	//NSLog(@"HEX to RGB >> r:%f g:%f b:%f a:%f\n",r,g,b,a);
	return [UIColor colorWithRed:r green:g blue:b alpha:a];
}
@end
```

```objc:hogehoge.m
cell.backgroundColor = [UIColor colorWithHexString:@"97E7FF" alpha:1.0f];
```

みたいな感じでつかってます
ctagsをちゃんと使う


vimでクラスの宣言元にジャンプするために必要なtagsファイル、それを作るのがctagsコマンド。

プロジェクトのルートディレクトリから

```
ctags -R
```

をすればルートディレクトリにtagsファイルが作られていい感じにジャンプしてくれるのですが、tagが宣言されていないクラスがあったり(ctagsのバージョンを上げたら解決)したのでこの際とばかりにちゃんと使うために設定を調べてみた。

##ctagsのバージョンを上げる
まず普段開発をしている環境がcentOS5系で、ctagsのバージョンが5.6だったのでとりあえず上げる。

``` sh:
mkdir -p $HOME/local/bin
mkdir -p $HOME/local/src

cd $HOME/local/src/

wget http://prdownloads.sourceforge.net/ctags/ctags-5.8.tar.gz
tar zxf ctags-5.8.tar.gz
cd ctags-5.8
./configure --prefix=$HOME/local
make
sudo make install
```

これで自分のローカル環境にctagsの5.8が入った。`$HOME/local/bin`にパスを張っておく。
5.6ではtags内に宣言されなかった関数も5.8にしたら宣言されていた。

## .ctagsファイルを作る
ctagsのmanを見ると`$HOME/.ctags`にctagsコマンドの引数を記述しておけるので作成しておく。
とりあえず中身はこんな感じにしてみた。

``` bash:.ctags
--append=yes
--recurse=yes
--langmap=PHP:+.inc
--php-kinds=cfd
```

`--append=yes`
tagsファイルがあれば追加する
`--recurse=yes`
再起的に処理する(-Rと同じ)
`--langmap=PHP:+.inc`
言語に対する対応する拡張子の追加(この場合は.incファイルをPHPとしてtagsを作る)
`--php-kinds=cfd`
言語に対してタグの作成するものを指定(この場合はphpの場合はクラス、関数、定数のタグのみの作成)

## 設定項目の確認
拡張子追加やタグの作成基準を確認することが出来る。


```sh:対応言語と対応拡張子の表示
ctags --list-maps
…
PHP      *.php *.php3 *.phtml *.inc
…
```
記述した.incが入っている事がわかる

```sh:作成するタグの表示
$ ctags --list-kinds=php
c  classes 
i  interfaces  [off]
d  constant definitions 
f  functions 
v  variables  [off]
v  variables  [off]
j  javascript functions  [off]
j  javascript functions  [off]
j  javascript functions  [off]
```

`[off]`が付いているもの以外のタグが作成される。
`variables`や`javascript functions`が複数表示されているのが若干の謎だが。

## tagsの作成
tagsファイルを自分のHOMEディレクトリ以下に`php.tags`として作成する。
標準のプロジェクトルートディレクトリに作っても良いが、PEAR等のファイルが入っている別ディレクトリのtagsを一緒にしておく時に個人的にやりやすいという理由でHOMEディレクトリに作成しているので変えても良い。

```sh:PHPのみの場合
ctags --languages=php -f ~/php.tags `pwd`
```

`-f`指定で作成されるパスと名前を変更、この時に`pwd`指定でタグのパスを絶対パスに変えないと自分のHOMEディレクトリに置いてもtagsが機能しない。

PEARディレクトリに移動して同じコマンドを打てばtagが追加される。

.vimrcに下記を追加

```vim:.vimrc
" 拡張子で読み込みタグ変更                                                      
au BufNewFile,BufRead *.php set tags+=$HOME/php.tags  
```

これでtagsが作成された。

## vimを開いてる時にtagsの追加
コードをもりもり書いていると新しく宣言されたclass等のtagを作成しなければならない。いちいちvimを終了してctagsコマンドを打つのも面倒なのでプラグインを入れる。

例えば[vim-tags](https://github.com/szw/vim-tags)とか
neobundle.vim使っているのなら以下で入る。

```vim:.vimrc
NeoBundle 'szw/vim-tags'
```

.vimrcに以下を記述

```vim:.vimrc
" vim-tags
au BufNewFile,BufRead *.php let g:vim_tags_project_tags_command = "ctags --languages=php -f ~/php.tags `pwd` 2>/dev/null &"
```

これでコードをもりもり書いている時にたまに

```
:TagsGenerate
```

を打ってやればtagsが更新される。

ちなみにtagジャンプの時に複数タグがあっても第１候補に飛んでしまって気づかない事があるのでキーバインドを少し変えている

```vim:.vimrc
" tagsジャンプの時に複数ある時は一覧表示                                        
nnoremap <C-]> g<C-]> 
```


これで快適。

参考:
http://www.asahi-net.or.jp/~wv7y-kmr/memo/vim_php.html#ctags
http://blog.naberon.jp/post/2010/09/27/ctags_setting/?utm_source=2010-09-27&utm_medium=old_blog&utm_campaign=MoveSite
http://labs.timedia.co.jp/2010/12/codereading-with-ctags-on-vim.html
http://hp.vector.co.jp/authors/VA025040/ctags/help_j.html
テキストファイルの内容をファイル名付きで表示する

小さなテキストファイルがたくさんあって、一度にまとめて眺めたいときに grep はいかがでしょう。
cat だと内容しか表示されませんが grep "" だとファイル名付きで表示されます。
行番号も表示したいときは -n を指定します。

```
grep "" FILE1 FILE2 FILE3...
grep -n "" FILE1 FILE2 FILE3...
```

-H を指定すれば引数のファイルが一つでもファイル名を表示させることができます。
-H をサポートしていない grep では代わりに /dev/null を指定します。

```
grep -H "" FILE1
grep "" /dev/null FILE1
```
文字列から数値に変換し、0以外の値として得たいとき


例えばWebアプリでリクエストパラメータから受けた"page"を数値として使用するときとか。

Perlの場合、

```perl
my $p = $req->param('page');
my $page = int($p) || 1;
```

とかで、変換不可能な文字や"0"を受け取った場合は`int()`の結果が`0`となり、それは偽と判定され結果として`$page`に1が代入される

が、Rubyで

```ruby
p = params[:page]
page = p.to_i || 1
```

のようにしても、`to_i`の結果が`0`となった際に偽ではなく真と判定されるため`1`にならない。(Rubyでは`false`または`nil`のみが偽になる)

簡単に記述する方法としては、`.nonzero?`を使うという手段があるらしい。

```ruby
p = params[:page]
page = p.to_i.nonzero? || 1
```

`Numeric.nonzero?`はゼロのときに`nil`を返し、そうでない場合は**自身を**返すそうです。`?`がつくのに返り値がbooleanじゃないのは不気味？な気もしますが、こういうケースで使えるので便利ですね…
! と not では結合強度が違う


ついつい `!` って見落としがちなので `not` で書きたくなる時ってありますよね！！

> `!hoge && foo`
あー 読みにくいなぁ……
`not hoge && foo`
にしよう！！

とかやってしまうとどうなるのかというと……

```ruby
[1] pry(main)> !true && false
=> false
[2] pry(main)> not true && false
=> true
```

＿人人人人人人人＿
＞　突然の true　＜
￣Y^Y^Y^Y^Y^Y￣

わかりやすくカッコで括るとこんな感じってことですね！！

```ruby
[3] pry(main)> (!true) && false
=> false
[4] pry(main)> not (true && false)
=> true
```

いやぁ…… 嵌りそう＞＜
ApacheでKeepAliveをオンにすると劇的に効果があった事例

## 背景

 * サーバー(EC2)上にApcheとTomcat立てていて、以下のようにフォワードプロキシからアクセスされていた

``` 
[ユーザ] => [フォワードプロキシ] => [Apache(リバースプロキシ)] => [Tomcat]
```

## 現象

 * サーバーにアクセスすると体感的に遅い
 * Chrome(25.0.1364.99)のデベロッパツールのNetworkで調べるとTimelineでConnectingが3sとかかかってたりする

## 対応

 * ApacheのKeepAliveがOffだったのでOnにした
  1. VirtualHost中にKeepAlive Onを追加
  1. gracefulリスタート
 * リバースプロキシ用途のサーバではworkerモデルを使いましょうということなので、ApacheのMPMをpreforkからworkerに切り替えた
  * [ApacheのMPM、「prefork」と「worker」を切り替える方法 – FlatLabs](http://blog.flatlabs.net/20110222_232623/)
 
```bash
 $ sudo vi /etc/sysconfig/httpd
# => 以下のコメントアウトを外す
HTTPD=/usr/sbin/httpd.worker
 $ sudo /etc/init.d/httpd restart
```

## 効果

 * サーバーにアクセスすると体感的に早くなった
 * ChromeのデベロッパツールのNetworkでConnectingが0のリクエストがほとんどになった

## 考察

 * クライアントが限られていて一度のアクセスで複数リクエストが発生するためKeepAliveをオンにすると効果が大きい
  * サーバーではフォワードプロキシからのアクセスに限定されていてコネクションを確立すると切らなくて良くなった。
  * サーバーにアクセスすると画像やらCSSやら取ってくるためにコネクション確立の時間が馬鹿にならなかった


## 感想

 * KeepAliveの効果は知ってましたがここまで劇的に効果があるとは思いませんでした
 * 今までアクセスの多いサーバーを管理したことがなく初Apacheチューニング

## はまった
 * workerに切り替えた際にgracefulリスタートして切り替わっていなかった

```bash
$ sudo /etc/init.d/httpd graceful
$ ps aux | grep httpd
root      1628  0.0  0.1 199736  6772 ?        Ss   Feb14   0:29 /usr/sbin/httpd
apache   20482  0.0  0.1 200012  5192 ?        S    16:08   0:00 /usr/sbin/httpd
$ sudo /etc/init.d/httpd restart
$ ps aux | grep httpd
root      6621  0.1  0.1 199312  5952 ?        Ss   16:29   0:00 /usr/sbin/httpd.worker
apache    6759  0.0  0.1 947024  4768 ?        Sl   16:30   0:00 /usr/sbin/httpd.worker
```
ExcelデータをINSERT文に変換する

DBに入れるデータをExcelで管理しているときに使ってるやつ。

### 使用例

シートにこんな感じで書かれていた場合（シート名はHOGE）、

|      | A      | B       | C        |
|-----:|:-------|:--------|:---------|
|    1 | COL1   |   COL2  |   COL3   |
|    2 | data   |       1 |          |
|    3 | data   |  (null) |  null    |
|    4 | data   |       1 |   data   |

SQLはこうなります。

```sql
INSERT ALL
INTO HOGE (COL1,COL2,COL3) values('data',1,null)
INTO HOGE (COL1,COL2,COL3) values('data',null,null)
INTO HOGE (COL1,COL2,COL3) values('data',1,'data')
SELECT * FROM dual;
```
### 使い方

Excelシートの仕様はこう。

* 1行目:カラム名
* 2行目～:データ
* シート名:テーブル名

シート上にボタンを置いて、マクロ登録。以下の関数を実行。

```vb:ExcelデータをINSERT文に変換する
Option Explicit

Sub INSERT文を生成_Click()
    Dim ws As Worksheet
    Set ws = ActiveSheet
    
    Dim sql As String
    sql = "INSERT ALL"
    
    Dim head As String
    head = vbLf & "INTO " & ws.Name & " ("
    
    Dim target As Range
    Set target = ws.UsedRange
    
    Dim currentCell As Range
    Dim i As Integer
    
    ' カラム名を列挙
    For i = 1 To target.Columns.Count
        If (i <> 1) Then
            head = head & ","
        End If
        Set currentCell = ws.Cells(1, i)
        head = head & currentCell.Value
    Next
    head = head & ") values("
    
    ' 値を列挙
    Dim j As Integer
    Dim strtmp As String
    For j = 2 To target.Rows.Count
        
        ' 非表示の行は出力しない
        If Rows(j).Hidden Then GoTo Next_RowLoop
        
        sql = sql & head
        
        For i = 1 To target.Columns.Count
            If (i <> 1) Then
                sql = sql & ","
            End If
            Set currentCell = ws.Cells(j, i)
            If (IsNull(currentCell) Or currentCell.Value = "" Or Trim(currentCell.Value) = "(null)" Or Trim(currentCell.Value) = "null") Then
            
                ' null
                sql = sql & "null"
            ElseIf IsNumeric(currentCell.Value) Then
            
                ' 数値
                sql = sql & currentCell.Value
            ElseIf Left(currentCell.Value, 8) = "(SELECT " Then
            
                ' SQLっぽいものはそのまま
                sql = sql & currentCell.Value
            Else
            
                ' 文字列はシングルクォーテーションをエスケープする
                strtmp = Replace(currentCell.Value, "'", "''")
                
                ' セル内の改行を改行コードに変換
                strtmp = Replace(strtmp, vbLf, "' || CHR(13) || CHR(10) ||'")
                
                sql = sql & "'" & strtmp & "'"
            End If
        Next
        
        sql = sql & ")"
        
Next_RowLoop:
    Next
    
    sql = sql & vbLf & "SELECT * FROM dual;"
    
    Dim cb As New DataObject
    With cb
        .SetText sql
        .PutInClipboard
    End With
    MsgBox ("クリップボードにコピーしました")
End Sub
```
変換したINSERT文はクリップボードにコピーします。
そのために`DataObject`を使うので、適当なActiveXコンポーネントをシート上に置いておきます。一度置いたらあとは消していいです。

#### 注意

列数と行数が多いとSQL流したときにエラーが出ます。
適当にデータを区切ってINSERT文を作れば大丈夫です。
sedで一括置換


Gitで管理しているファイルの中でこの文字列を全部ガガガっと書き換えたいという時に使うと便利なコマンド。

```
$ git grep -l | xargs sed -i "" "s/h/m/g"
```

仕組みは↓こんな感じ。

- git grep で置換したいファイルを探し出す
- ファイル名だけをstdoutに吐き出す
- xargsでsedに渡す

ex) hogeをfugaに置き換えたい。全ファイルで。

```
$ git grep -l "hoge" | xargs sed -i "" "s/hoge/fuga/g"
```
DMARCについて


TwitterがTwitter.comからのメールにDMARCを使いだした、という記事(http://japan.cnet.com/news/service/35028617/) を読んだのでメモ代わりに。

間違っているところがあればどんどん指摘していただきたいです

## そもそもDMARCって？

>DMARCとは、Domain-based Message Authentication, Reporting and Conformanceの略で、DMARCを宣言している送信元ドメインに対して、メール受信者がDKIMとSPFに関する送信ドメイン認証の結果を通知する為の仕組みです。

form http://www.dkim.jp/dkim-jp/faq/

簡単にいうと、メールでの「なりすまし」を防止する仕組み

## DYKIMとは...
> DomainKeys Identified Mail の略

電子署名法式の送信ドメイン認証技術
送信者側がメールのヘッダーに電子「署名」を追加し、それを受信者側で確認することによって、本当に正しい送信者からメールが送信されているのかを確認するもの

## SPFとは...
> Sender Policy Framework の略

あるドメインのメールを送信することの出来る正規のサーバのIPアドレスをリストにして管理する。そのドメインと無関係なメールサーバを利用して送信者を偽ったメールを送信しようとすると、受信側でそのことを検出して自動的に受け取りを拒否することができるというもの

## まとめると

DKIMは送信するメールのヘッダーにデジタルな「署名」を追加して本当に正しいドメインからのメールなのかを確認するもの

SPFはIPアドレスを利用して、認証されているメールサーバからのメールなのかを確認するもの

どちらもカバーする範囲が違うので、これら両方を用いることでより強固に「なりすまし」を防止することができる。


## どうやって使うの？

今回はGoogleAppsを使ってDMARCの設定をしてみます。

まず前提としてDMARCはDKIMとSPF両方を使うことが前提なので、その2つの設定をしていきます

まずDKIMの設定から

http://support.google.com/a/bin/answer.py?hl=ja&answer=174126&topic=2752442&ctx=topic

ここを参考にしてください(書くのがめんどくさい)

つぎにSPFの設定

http://support.google.com/a/bin/answer.py?hl=ja&answer=178723&topic=2759192&ctx=topic

ここで(書くのがめんどくさい)

そしたら、DMARCの設定です

http://support.google.com/a/bin/answer.py?hl=ja&answer=2466563

ここを参考に(書くのがry )

注意したいのは、ポリシーを設定するときのポリシーに違反したメールの扱いについてです
署名が確実にされているかどうかを確認しながら、ポリシーないの違反しているメールの扱いを変えて行ったほうが良いです。
トラフィックを監視しながら、未署名のメール、偽装の疑いのあるメールがないかを確認し、問題(正しく送ったはずのメールが見署名になっていた、など)がなければ、ポリシーの設定を変更する、という形がよいです。
違反したメールの扱い種類は
「none(何もしない)」「quarantine(隔離)」「reject(拒否)」
の段階があるので、noneから徐々に、という感じ



雑なまとめで申し訳ないのですがこれで


## 参考リンク
http://www.dmarc.org/index.html

http://www.dkim.jp/dkim-jp/faq/#3

https://support.google.com/a/bin/answer.py?hl=ja&answer=2466580&topic=2759254&rd=1

http://blog.neronplex.jp/2012/12/27/web/service/216
毎回異なる引数で呼ばれるメソッドをもつオブジェクトのモックを RSpec でつくる方法

同じ引数で n 回呼ばれる message expectation なら簡単です．たとえば:

```ruby
foo = double; foo.should_receive(:bar).with(1).exactly(3).times
```

これは，

```ruby
foo.bar(1)
foo.bar(1)
foo.bar(1)
```

に対応します．これが，`bar` の引数が毎回異なるとやっかいです．たとえば，

```ruby
foo.bar(7)
foo.bar(2)
foo.bar(9)
```

に対応する `foo` のモックをつくるのにはどうすればよいのでしょうか．

私は，

```ruby
foo = double
[7, 2, 9].each { |v| foo.should_receive(:bar).once.ordered.with(v) }
```

などとしているのですが，もっといい方法があるよという方がいらっしゃれば，コメント欄にてお知らせくださると嬉しいです．
なんちゃらの篩（first thought）

エラトステネスのアレが話題だったのですが、

```ruby:seive.rb
module Sieve
  def sieve(max)
    target = [*2..max]
    ret = []
    until target.empty?
      ret << (prime = target.shift)
      break if prime ** 2 > max
      target = target.delete_if {|i| i % prime == 0 }
    end
    ret + target
  end
  module_function :sieve
end
```

```ruby
Sieve.sieve 10000
# => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, ... , 9929, 9931, 9941, 9949, 9967, 9973]
```

あんま気に入っていないと言うか再帰とかそういうのを使えそうに見える。あと、 `break` 。う

## See also

* http://antimon2.hatenablog.jp/entry/2012/06/18/231118

いい話し
MySQL5.6GA記念セミナーのまとめ

===

## OracleでのMySQLの位置づけ

Oracle DBと相互補完関係

## 改善点

* オプティマイザ：パフォーマンス改善
* スキーマ：より詳細な統計情報
* InnoDB:トランザクション・スループット向上
* レプリケーション：更なる可用性とデータの整合性
* NotOnlySQL

## 利用例

### Aadhaar - インド版国民総背番号制

* 国民のID、生体情報を管理
* トランザクショナルな処理は商用版MySQL
* 統計情報はHaddop

## コミュニティ版、商用版の違い

* コミュニティ版・商用版のコアなシステムは同じ
* 技術サポートや管理機能、拡張機能を有償の商用版で提供

## MySQL Enterprise Audit

* 監査機能を提供
* ログオン、クエリーの情報を監査可能

## MySQLサポート

* ソースレベルでのサポート
* パフォーマンス・チューニング

## MySQL Cluster 7.3

node.jsからのアクセス可能

## ベンチマーク

5.6が5.5より遅いよっていう、ベンチマーク結果は設定が悪いらしい

## InnoDB

* 参照専用トランザクションができた
* スキーマの変更をオンラインで可能。停止時間を削減

## RDBMSとNoSQLの両立

* InnoDBに素早く、簡単にアクセス
* memcachedをプラグインとして統合
* InnoDB APIをmemcachedプロトコルにマッピング

## オプティマイザ

* JSONフォーマットでEXPLAIN文を出力

## グローバルトランザクションID

* 複数台のレプリケーション環境でも容易にトランザクションの追跡/比較が可能
* フェイルオーバーのために最も最新のスレーブを自動認識

## パフォーマンススキーマ

* 統計情報を見直し、追加

## 優先課題

* ソースがスパゲッティ化している
* Web、クラウドインフラ、組み込みでの利用への最適化

## MySQLヘルスチェックプログラム

* MySQLやアプリケーションを中の人にちぇっくしてもらえるよ(商用サポートとは別のもの)
Angular - Injector & Module / Service


## Overview

- Injector is a service locator. There's a single injector per Angular application.

- Injector looks up an object by its name, and keeps an internal caches of all objects. Repeated calls to get the same object name result in the same instance.

- If the object does not exit, injector will asks the instance factory to create a new one.

- So, a module is the way to configure the injector's instance factory, known as a provider.

[Documents](http://docs.angularjs.org/guide/concepts#module)

## Injector

`$injector` is used to retrive object instances as defined by provider, instantiate types, invoke methods, and load modules.

```js
var $injector = angular.injector();

expect($injector.get('$injector')).toBe($injector);

expect($injector.invoke(function($injector){
	return $injector;
}).toBe($injector);
```

### Annotation Strategy

Javascript does not have annotations, annotations are needed for dependency injection. But some minified/obfuscated tool will change the name of arguments, so we need some ways to make valid annotations.

```js
// inferred (only works is code not minified/obfuscated)
$inject.invoke(function(serviceA){});

// annotated
function explicit(serviceA){};
explicit.$inject = ['serviceA'];
$inject.invoke(explicit);

// inline
$inject.invoke(['serviceA', function(serviceA){}]);
```

## Module

The `angular.module` is a global place for creating and registering Angular modules.

All Modules (angular core or 3rd party) that should be available to an application must be registered using this mechanism.
Angular - Initialization


## Process of initialization

Angular initialization automatically upon `DOMContentLoaded` event, at which point Angular looks for the ng-app directive which designates your application root, then Angular will:

1. load the module associated with the directive.

2. create the application injector

3. compile the DOM treating the ng-app directive as the root of the compilation. This allows you to tell it to treat only a portion of the DOM as an Angular application.

## Manual initialization

If you need to have more control over the initialization process, you can use a manual bootstraping method instead.

```html
<!doctype html>
<html xmlns:ng="http://angularjs.org">
	<body>
		<script src="http://code.angularjs.org/angular.js:></script>
		<scripe>
			angular.element(document).ready(function){
				angular.bootstrap(document);
				// here you can do more things...
			});
```
ProjectTemplateにスクリプトを追加する方法

テンプレートにスクリプトを追加する方法の備忘録
ProjectTemplateの作り方は、書いてらっしゃる方もいるみたいなので、割愛
（気が向いたら纏めます。）

Templates.plist

    <key>Targets</key>
    <array>
        <dict>
            <!-- framework追加 -->
            <key>Frameworks</key>
            <array>
                <string>QuartzCore</string>
            </array>
    
            <!-- BuildPhase編集 -->
            <key>BuildPhases</key>
            <array>
                <dict>
                    <!-- script追加 -->
                    <key>Class</key>
                    <string>ShellScript</string>
                    <key>ShellPath</key>
                    <string>/bin/sh</string>
                    <key>ShellScript</key>
                    <string>#スクリプトの追加
    # scriptの位置をdragする事で、前処理と後処理に出来ます。
    # プロジェクトのルートディレクトリ(SRCROOT)で実行されます。
    
    echo "script start"
    </string>
                </dict>
            </array>
        </dict>
    </array>


ホントは、schemeをテンプレートに追加して、スクリプトをそのスキームだけで動かすって
やりたかったんですが、スキームの追加が見つけられず・・・

これで、
androidのビルドも同時に出来そうかなー
自分用　覚えるvimコマンド


|コマンド |動作内容                |
|:-------|:----------------------|
|/<文字列>|文字列 を検索する（順方向）|
|n       |順方向へ検索する         |
|N       |逆方向へ検索する         |
|0|行頭に移動|
|$|行末に移動|
手軽にhtmlファイルをphpで実行可能なサーバを立てる

## 要約

### 課題

@kamipoさんの[簡単に手元でHTTPのファイルサーバ立てる方法](http://blog.kamipo.net/entry/2013/02/20/122225)を読んで手元で立てたサーバでphpファイルも実行させて返すときは

```
$ php -S 0.0.0.0:5000
```

させればいいということを知りました(感謝)。でも、htmlファイルはそのまま返されるから、

```.htaccess
AddType application/x-httpd-php .php .html
```

されているディレクトリのhtmlファイルもphp実行して返したいです。切実に。

### ソリューション

```
$  curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4
```

```php:router.php
<?php

$request_file = $_SERVER["REQUEST_URI"];

if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js)/', $request_file)) {
    return false;
}

if (!preg_match('/\.(?:html|php)$/', $request_file)) {
    $request_file .= '/index.html';
}
else if (preg_match('/\/$/', $request_file)) {
    $request_file .= 'index.html';
}

require_once(__dir__ . $request_file);

?>

```

```
$ php -S 0.0.0.0:5000 router.php
```

## 説明

webrickとかplackだとphpファイルは実行できないけど、php(>= 5.4)のビルトインサーバだとphp実行出来るということを初めて知りました。今まではApache起動してたから、これすごい便利！
でもそれだと`.htaccess`でhtmlファイルをphp実行している場合にはhtmlファイルはそのまま返されていたので、強制的に全ファイルをphp実行するようしました。(ワンライナーじゃなくなってるけど)

そして、これの便利なところは`router.php`は実行時に評価されるから、`router.php`にtypoあったりしてもphpのビルトインサーバを終了することなく、変更を加えてブラウザでリロードすれば`router.php`が再評価されるということです。

ただ、phpは5.4以上が必要なので(Macに入っているデフォルトは5.3系)、5.4以上をインストールする必要があります。homebrewやMacportsでインストールすることができますが、一番簡単そうなのは [Macで一番簡単にPHP5.4をインストールする方法](http://www.1x1.jp/blog/2012/05/php_54_for_mac_os_x_as_binary_package.html)で紹介されている通り、

```
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4
```

だと思います。僕はhomebrewにしましたが。

`router.php`は上記のままだとGETパラメータ付いていたりする場合に変なパスが読まれたりするので、そこは自分に合うように編集して下さい。サーバの再起動は不必要です。サーバの再起動は不必要です。

いちいち`apachctl`でApache起動しなくて良くなったりしてかなり便利になりました。


参考:
http://blog.kamipo.net/entry/2013/02/20/122225
http://www.1x1.jp/blog/2012/05/php_54_for_mac_os_x_as_binary_package.html
http://php.net/manual/en/features.commandline.webserver.php
CloudWatchにEC2の空きメモリ量を登録してみる

 * [CloudWatchにEC2のディスク使用率を登録してみる #AmazonLinux #Ruby #EC2 #CloudWatch - Qiita](http://qiita.com/items/0f72cbb08c7cd706911f)と同じ環境、途中まで同じ手順

## 登録手順
 * スクリプト実行確認

```bash
 $ ruby /home/ec2-user/script/mon-put-data/mon-put-data.rb \
--namespace AWS/EC2 \
--metric-name MemoryFree \
--dimensions InstanceId="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`" \
--unit Megabytes \
--value `free -m | grep buffers/cache | sed -e 's/\s\{1,\}/ /g' | cut -d' ' -f4` \
--endpoint ap-northeast-1
```

* crontabへの登録

```bash
*/5 * * * * ruby /home/ec2-user/script/mon-put-data/mon-put-data.rb --namespace AWS/EC2 --metric-name MemoryFree --dimensions InstanceId="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`" --unit Megabytes --value `free -m | grep buffers/cache | sed -e 's/\s\{1,\}/ /g' | cut -d' ' -f4` --endpoint ap-northeast-1
```

* ManagementConsoleでCloudWatch確認 => OK
zを使ってみた


@kenchanに触発されて z をインストールしてみたよ。 https://twitter.com/kenchan/status/304774030383271936

## zとは

https://github.com/rupa/z

cdの履歴を使って移動場所を補完することでディレクトリ間の移動を楽にしてくれるツール。以前に移動したことのあるディレクトリなら

```
z [移動したいディレクトリ名の先頭数文字]
```

で移動できるようになる。

## インストール

Homebrewでインストール。

```
brew install z
```

~/.zshrc に以下を追加する。

```
# z
. `brew --prefix`/etc/profile.d/z.sh
```

これでインストール完了。

## zの使い方

zはcdの履歴を見て移動場所を補完するツールなので、インストールしてすぐは履歴が無いので何もできない。まずはよく使うディレクトリを移動してまわる。

```
cd ~/src
cd ~/Dropbox
cd /tmp
...
```

cd履歴が ~/.z に貯まったので補完できるようになったはず。

```
z D
```

と入力してTabキーを押すと

```
z /Users/thata/Dropbox
```

と補完してくれる。便利！
CakefileでCoffeScriptをwatch


CakefileでCoffeeScriptをwatchするタスク。
色々なところから拝借したものだけど。
さくっと作ってプロジェクトで環境を共有したいときに。
（なんかそういう用のいいライブラリとかありそうだけど）

https://gist.github.com/edom18/5010285

```coffee
{spawn, exec} = require 'child_process'
 
option '-o', '--output [DIR]', 'Output directory.'
option '-t', '--target [DIR]', 'Watch target directory.'
 
stdout_handler = (data) ->
    console.log data.toString().trim()
 
build = (watch, output, target) ->
    console.log 'Watching coffee scripts'
 
    options = ['-c', '-o', (output || 'js'), (target || '_src/coffee')]
 
    if watch is true
        options[0] = '-cw'
 
    coffee = spawn 'coffee', options
 
    coffee.stdout.on 'data', stdout_handler
 
 
task 'build', 'build the project', (watch) ->
    build watch
 
task 'watch', 'watch for changes and rebuild', (options) ->
    build true, options.output, options.target
```
iTerm2 から Terminal.app に戻ってもいいかもしれない機能


Mac のアプリではアプリ側で対応していると 3 本指タップとかで単語の辞書が引けます。

で、これが Terminal.app でも使えます！！

![](https://www.evernote.com/shard/s4/sh/03d8f900-ea4f-4375-9516-2bef3bf9c31f/858c83f87c932f95d432daa7fc01b5bd/deep/0/%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%202013/02/22%2011:28.jpg)

man 引いてる時とか、コード読んでる時に超絶便利です！！

僕は昔からの惰性で iTerm(2) 使ってましたが Tiger あたりから Terminal.app もかなり良くなっているので戻るのもいいかもしれませんね（僕は半年くらいまえに Terminal.app に戻りました）