OmniAICreator/Qiita-1.07M huggingface dataset:
<<< 使って文字列のマッチング

`grep` に流すのに `echo` 使いたくないが、`<<<` の存在忘れがちなのでメモ。`<<<` を覚えるためだけに書いたので他に目新しさ無い。

ただし bash/zsh でしか確認してない。

正規表現
-----------

```bash
grep -qE "正規表現" <<< "元の文字列"
# -G, -E で使用できる表現が違うのが面倒でいつも -E つけてる。

[[ "元の文字列" =~ 正規表現 ]]
# 右辺はダブルクオートで括らない。間違えやすいので注意。
```

PCRE (Perl 互換の正規表現)使う場合は:

```bash
grep -qP "正規表現" <<< "元の文字列"
```

zsh で PCRE なら [uasi さんのコメント](#comment-ae6f472410b2c775d93d)参照。

部分文字列
----------

```bash
grep -qF "部分文字列" <<< "元の文字列"
```

おまけで置換
-----------

```bash
# 置換に失敗しても元の文字列を出力
sed 's/正規表現/置換文字列/' <<< "元の文字列"

# 置換に失敗すると出力無し
sed --quiet 's/正規表現/置換文字列/p' <<< "元の文字列"
```

<del>`[[ ... ]]` で正規表現を使えないんですかね。</del> @uasi さんからのご指摘で修正。
【Python】DjangoでUnicodeDecodeErrorが出たときに確認すべきこと

Pyファイルやテンプレートに日本語が入っていると、タイトルのようなエラーが出て小一時間ハマったのでメモ

■Pyファイル
以下のコードが入っているか

```py
# coding: UTF-8
```

■テンプレート
・ファイルそのものがutf-8で保存されているか
AppDelegate以外にActiveになったことを通知する


例えば、UIViewControllerの派生クラスでは、このような感じで通知されるように設定できます。

```objectivec:
- (void) viewWillAppear:(BOOL)animated
{
	[super viewWillAppear:animated];
	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];
	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
}

- (void) viewWillDisappear:(BOOL)animated
{
	[super viewWillDisappear:animated];
	[[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)applicationWillResignActive
{
	// Activeでなくなる時の処理.
}

- (void)applicationDidBecomeActive
{
	// Activeになった時の処理.
}

```
oh-my-zshでpowerlineを堪能する


![スクリーンショット 2014-02-08 21.19.33.png](https://qiita-image-store.s3.amazonaws.com/0/2095/bff99008-53aa-9570-1803-de2c5ef765fe.png "スクリーンショット 2014-02-08 21.19.33.png")


最近[@ta9to](http://qiita.com/ta9to)や[@nakajmg](http://qiita.com/nakajmg)がpowerlineネタの記事を書いていましたが、oh-my-zshならもっと簡単にできるんじゃないかなぁーと思ったので試してみました。

### 1. zshをインストールする

```
$ brew install zsh
```

### 2.  oh-my-zshをインストールする

```
curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh
```

or 

```
wget --no-check-certificate https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh
```

### 3.  powerline用のテーマをインストールする
今回は`jeremyFreeAgent/oh-my-zsh-powerline-theme`このテンプレートを取得して`.oh-my-zsh/themes/`入れます。

```
$ git clone git@github.com:jeremyFreeAgent/oh-my-zsh-powerline-theme.git
$ cd oh-my-zsh-powerline-theme
$ ./install_in_omz.sh
```

あとは`.zshrc`にテーマの指定をします。

```.zshrc
$ vim ~/.zshrc
--ZSH_THEME="robbyrussell"
++ZSH_THEME="powerline"
```

あとは適当に`.zshrc`お好みで設定を書きます。

```.zshrc
# powerline
POWERLINE_HIDE_HOST_NAME="true"
POWERLINE_HIDE_GIT_PROMPT_STATUS="true"
POWERLINE_SHOW_GIT_ON_RIGHT="true"
```

### 4.フォントの設定を行う
僕はターミナルにはMonacoを使いたい人をなので`Monaco for Powerline.otf`をいれますよ。
[Monaco for Powerline.otf](https://gist.github.com/baopham/1838072)
ここからMonaco for Powerline.otfをダウンロードしてきて、`/Library/Fonts`に入れてください。

```
$ wget https://gist.github.com/baopham/1838072/raw/2c0e00770826e651d1e355962e751325edb0f1ee/Monaco%20for%20Powerline.otf
$ mv Monaco\ for\ Powerline.otf /Library/Fonts/
```

あとはiTerm2なり、なんなりでフォントの設定をするだけですよー。
![スクリーンショット 2014-02-08 21.16.19.png](https://qiita-image-store.s3.amazonaws.com/0/2095/339407bc-1a3f-317f-4f1e-42e00b8a1361.png "スクリーンショット 2014-02-08 21.16.19.png")




参考
[5分でターミナルの表示をカッコよくする](http://qiita.com/nakajmg/items/500342ef4d7595b47556)
[powerlineとSourceCodeProで簡単につくれるキレイな開発環境](http://qiita.com/ta9to/items/4a8026fff7e177736060)
[robbyrussell / oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)
VimShell エイリアスとヒストリ


## はじめに
いままでVim中にシェルする時は`:shell`としてたんですが、Vimの中で済ませられるならと、VimShellを導入してみました。

![VimShellスクショ.png](https://qiita-image-store.s3.amazonaws.com/0/31217/41445192-20db-76be-769a-97e5585b2d5d.png "VimShellスクショ.png")

## 普段ターミナルを使ってる感じと違うなと思ったのは、
* エイリアスが効かない
* ヒストリも使えない (!!とか!<番号>、上下矢印キーでの履歴が効かない)

ググってみたところ、どちらもVimShellでも実現可能でした。

## エイリアスの設定
`.vimshrc`で設定します。デフォルトは`~/.vimshrc`
bashと書式が同じだったので、`.bashrc`のalias設定をそのまま貼ればOKでした。

```.vimshrc
alias h='history'
alias c='clear'
alias l='ls -l'
alias la='ls -al'
alias cls='clear;ls -F'
alias rmbk='rm -f *~'
```

## ヒストリ
Uniteをインストールすると、`C-l`で出来るようになります。
上下キーとEnterで選択、更にEnterで実行。
!!ってすると、直前のコマンドが選ばれます。

---
ヒストリはh(historyのalias)して、!<番号>する操作がカラダに染み込んでるので、C-lがパッと出てきませんが、使ってるうちに慣れるのかな？
neocompleteが効く心地良さは格別なので、しばらくはVimShellメインで使ってみます。
Sahara@vagrantがないと生きていけない体になってしまった、、、

## 今まで

chefりだしてしばらくは、基本的には、

1. レシピ書いて、
2. 調理して(`bundle exec knife solo cook melody`)、
3. エラーでたらレシピ書き直し、でなかったら味を確認(sshログインしてうまくいってるか確認)
4. 1〜3の繰り返し

で、たまに大バカをして「やっちまったな汗」ってなったときは`vagrant destroy`して最初からやり直し。
「これがOSを壊して作ってかあ」とか言っていいながらbootstrap画面をながめていたのですが、昨日、`sahara`と出会ってガラリと変わった。何分もbootstrap画面を眺めなくてすむようになったわけです＾＾/ （基本的な1〜4の流れはそのままです）

## 準備

「やっちまったな汗」となる前に、いい感じのサーバ状態でコミット。
ポイントは一回`halt`してから`commit`すること。`halt`せずに、起動したまま`commit`してしまうととっても時間がかかるので注意＞＜　ここ重要！！

    vagrant sandbox on
    vagrant halt
    vagrant sandbox commit
    vagrant up

## やっちまったな汗

基本的な1〜4をやっていて「やっちまったな汗」ってときには、

    vagrant sandbox rollback

これだけ。あとは何回やっちまっても`rollback`するだけで`commit`したサーバ状態に戻れるわけです＾＾/
mac book (air|pro)にruby2.1.2をインストール

# mac book airにruby2.1をインストール

## brew update

    brew update

## 最新のXcodeをインストール (5.1.1)

## brew upgrade ruby-build

    brew upgrade ruby-build

upgradeしても更新されなかったので、消して入れ直した

    brew uninstall ruby-build
    brew install --HEAD ruby-build

## installリストを表示

    rbenv install -l | grep 2.1.2

## ruby 2.1.2をインストール

    RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline) --with-openssl-dir=$(brew --prefix openssl)" rbenv install 2.1.2

## 確認

![スクリーンショット 2014-06-19 17.57.31.png](https://qiita-image-store.s3.amazonaws.com/0/1762/3e78a22a-1854-8087-f7bf-0297e94a310c.png)

特定のディレクトリだけの場合は

    cd hoge/foo/var
    rbenv local 2.1.2

## bundlerをインストール

    gem install bundler

## bundle

所定のディレクトリで

    bundle

## 備考

https://github.com/sstephenson/rbenv
https://github.com/sstephenson/ruby-build

readlineオプションでインストールしとかないとirbとかで日本語が使えない


## Ruby 2.1の基本構文／基本文法まとめ＆Pryの使い方

http://www.atmarkit.co.jp/ait/articles/1403/26/news030.html

## pry入れる

    gem install pry
HTMLファイルからPOSTでJSONデータを送信する

説明

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>HTMLファイルからPOSTでJSONデータを送信する</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<script type="text/javascript">
    $(function(){
        $("#response").html("Response Values");

        $("#button").click( function(){
            var url = $("#url_post").val();

                var JSONdata = {
                    value1: $("#value1").val(),
                    value2: $("#value2").val()		
                };

            alert(JSON.stringify(JSONdata));
    
            $.ajax({
                type : 'post',
                url : url,
                data : JSON.stringify(JSONdata),
                contentType: 'application/JSON',
                dataType : 'JSON',
                scriptCharset: 'utf-8',
                success : function(data) {
    
                    // Success
                    alert("success");
                    alert(JSON.stringify(data));
                    $("#response").html(JSON.stringify(data));
                },
                error : function(data) {
    
                    // Error
                    alert("error");
                    alert(JSON.stringify(data));
                    $("#response").html(JSON.stringify(data));
                }
            });
        })
    })
</script>

</head>
<body>
    <h1>HTMLファイルからPOSTでJSONデータを送信する</h1>
    <p>URL: <input type="text" id="url_post" name="url" size="100" value="http://testurl/"></p>
    <p>value1: <input type="text" id="value1" size="30" value="値1"></p>
    <p>value2: <input type="text" id="value2" size="30" value="値2"></p>
    <p><button id="button" type="button">submit</button></p>
    <textarea id="response" cols=120 rows=10 disabled></textarea>
</body>
</html>

```
Java VMのガーベジコレクションの整理

# Java VMのGC

Java VMには様々な種類のGC（ガーベジコレクション）があり、用語を整理しないと混乱します。

GCの種類を整理する前に、まずJava VMのGCは「世代別GC方式」を採っていることを意識しましょう。
Java 7で正式サポートが始まったG1 GCも、世代別GC方式がベースになっています。

「世代別GC方式」の詳細は、様々なWebサイトで紹介されているので、ここではポイントだけを記述します。

## 世代別GC方式とは

Java VMはJavaヒープを、
「New領域(1個)」「Tenured領域(1個)」と「Permanent領域(1個)」に分割し、
さらに「New領域」を「Eden領域(1個)」と「Survivor領域(2個)」に分割します。

生成されたオブジェクトはまずEden領域に入り、最初の数回の「コピーGC」によって2個のSurvivor領域の間を行き来します。それでも生存し続けたら、最後にTenured領域に昇華されます。
Permanent領域には、主にクラス情報が入ります。

このようにメモリ領域をいくつかの領域に分け、各領域に応じて異なる種類のGCを実行する方式が、「世代別GC方式」です。

2個あるSurvivor領域は常に片方が空き領域になっていて、この意味でメモリ容量を余分に消費しますが、コピーGCは効率的なGCです。

Tenured領域はGCを繰り返すと断片化がひどくなり、大きなオブジェクトを割り当てられなくなる場合があります。このようなときは、オブジェクトを一か所に集めて断片化を解消するための「コンパクション」を行います。

Tenured領域を対象としたGCには、FullGCとCMS GCの2種類があり、前者はコンパクションを兼ねますが、Stop the world（アプリケーションが完全に止まる）が起きます。後者はStop the worldを起こしませんが、コンパクションを行いません。また、FullGCでは、Tenured領域に限らずPermanent領域もCGの対象となります。

Java VMオプションでCMS GCを選択した場合、CMS GCを実行してもTenured領域とPermanent領域にオブジェクトを割り当てられない場合、フォールバックとして、コンパクションを行うために自動的にFullGCが実行されます。

## 用語の整理

**世代別GC:**
  Java VMが採用している全体的なGC方式。

**コピーGC:**
  New領域を対象とした効率的なGC。
  Java VMオプションで単一スレッドで実行するか、複数スレッドで実行するかを選択可能。

**FullGC:**
  Tenured領域とPermanent領域を対象としたGCであり、アプリケーションの動作を完全に止めてしまう。
  コンパクションも行う。

**CMS GC:**
  Tenured領域を対象としたGC。Stop the worldを回避するために、アプリケーションスレッドと同時に実行。
  CMS GCを実行してもTenured領域とPermanent領域にオブジェクトを割り当てられない場合、フォールバックとしてFullGCを実行してコンパクションを行う。

**G1 GC：**
  Java VMで正式サポートが開始された、64ビットの広大なメモリ空間を対象としたGC。
  Javaヒープを細かく分割して、同じサイズの小さな領域をたくさん作り、Eden領域、Survivor領域またはTenured世代のどれかにする。

## Java 7でのGCの選択

拙者ブログの[Java™ 7でのガーベジコレクションの選択](http://sipadan2003.blogspot.jp/2013/05/java-7.html)を参照してください。
Objective-Cでは、インスタンス変数をどこに宣言するのが正しいのか？

Objective-Cでインスタンス変数が宣言可能なのは次の３カ所です。

Case 1:ヘッダー内

```objc:SampleClass.h
@interface SampleClass : NSObject{
    int i;
}
```

Case 2:クラス拡張（Class extension）内

```objc:SampleClass.m
@interface ViewController (){
    int i;
}
```

Case 3:implementationの直後

```objc:SampleClass.m
@implementation ViewController{
    int i;
}
```

では、どこで宣言するのがベストなのでしょうか？
こちらのAppleの公式ドキュメントを参考にすると、
https://developer.apple.com/jp/devcenter/ios/library/documentation/ObjC.pdf
38ページの先頭に以下の記述があります。

```
インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはあり
ません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生
成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインター
フェイスで行うべきではないので、波括弧も省略してください。
```

このように、Apple側はCase1のようにヘッダーファイル内でメンバ変数の宣言することを推奨していないようです。
また、このドキュメントでは、Case3のようにimplementationの直後でインスタンス変数の宣言をしていますね。

ところが、Case3の場合ちょっと問題があります。
Storyboardにおいて、Outletの接続を行う場合です。
例えば、以下のように書いてStoryboardでOutletの接続を行おうとすると、

```objc
@implementation ViewController{
    IBOutlet UILabel *label;
}
```

Storyboardの当該箇所にこのインスタンス名がすぐには表示されません。
クリーン後、しばらく時間が経つと表示される場合が多いです（Xcode 5.0.2で確認）。
これはXcodeの不具合（？）かと思います。
以下の箇所に書けば当該箇所にインスタンス名が即反映されます。

```objc:SampleClass.h
@interface SampleClass : NSObject{
    IBOutlet UILabel *label;
}
```

```objc:SampleClass.m
@interface ViewController (){
    IBOutlet UILabel *label;
}
```

上記の理由で、StoryboardとOutletの接続を行う場合は、Case3のimplementationの直後以外で宣言した方がいいかと思います。しかし、Storyboardを使わないのであればここに宣言するのもありかと思います。

Case1のヘッダーファイル内で宣言した場合ですが、前述のAppleの公式ドキュメントの４３ページにあるように、通常はインスタンス変数の宣言前に@protectedのディレクティブがついていることになっています。
従って、意図的に@publicをつけない限りサブクラス以外のクラス外からアクセスしようとするとコンパイルエラーが発生してしまうので、アクセスはサブクラスに限られるようです。
サブクラスからも隠蔽したい場合は@protectedをつければ大丈夫です。
従って、他のクラスからの意図しないアクセスが問題になることはそれほど無いように思えます。
ただし、.演算子や->演算子で他のクラスからアクセスしようとすると自動補完候補に挙がってしまうようです。

Case2のクラス拡張内に宣言する場合、今のところ特にデメリットは無いように思えます。
それにしても、このクラス拡張というものは他に用途はあるのでしょうか。
前述のAppleのドキュメントを読んでも、使いどころが思い浮かびません(^^;

Case1〜3のどれを選択するかは好みの問題も多いとは思いますが、個人的な好みでは実装ファイルが肥大化するのが嫌なのと、ファイルの先頭までスクロールするのが嫌なのでヘッダーファイル内に宣言することが多いです。
Appleの中の人ごめんなさい(^^;
PostgreSQLサービスのパッケージインストールとサービス起動をする Chef cookbook


※ CentOS 6.5 で確認しています

# まずは、手動で行う手順を確認

1. PostgreSQLのパッケージをインストールする ```yum install postgresql postgresql-server```
1. PostgreSQL初期化 ```service postgresql init```
1. PostgreSQLサービスを起動 ```service postgresql start```

# chefクックブックの用意

## レポジトリを作成

```
# knife create repository  /tmp/che-repo
```

## クックブックを作成

site-cookbooksディレクトリの下に、postgresqlという名前のクックブックを作成する場合は以下のコマンド

```
$ cd /path/to/repository/
$ knife cookbook create postgresql -o site-cookbooks
```

## PostgreSQLのパッケージをインストールするレシピ

recipes/default.rb を以下のように記述

```
package "postgresql" do
  action :install
end

package "postgresql-server" do
  action :install
end
```


## PostgreSQL初期化のレシピ

recipes/default.rb に以下を追記

```
execute "postgrosql-init" do
  not_if "test -f /var/lib/pgsql/data/postgresql.conf"
  command "service postgresql initdb"
  action :run
end
```

書式としては、以下の通り

- postgresql-init は任意の文字列
- ``` command "rootユーザーで実行するコマンド" ``` 

postgresql initdb を実行すると /var/lib/pgsql/data/postgresql.conf が作成されるので、
- ** /var/lib/pgsql/data/postgresql.conf が無い時のみ、postgresql initdb を実行する ** という条件を not_if として記述している


## PostgreSQLサービスを起動するレシピ

recipes/default.rb に以下を追記

```
service "postgresql" do
  action [:enable , :start]
end
```
``` service postgresql start``` と実行することから、```service "postgresql" と記述する。


# chefクックブックを実行

以下のどちらかで実行。
1. http://qiita.com/gigatune/items/01f775fb615df8d1d361 を参考に、chef-solo を実行する
1. http://qiita.com/gigatune/items/e13828c895442ca18252 を参考に、Vagrant プロビジョン時に実行する

上記で作成した cookbookと、Vagrantで実行する場合の Vagrantfile は
https://github.com/gigatune/DevOps/tree/master/PostgreSQL
にアップしています。
emscriptenでproj.4コンパイル

Proj.4をemscriptenでコンパイルしようとして、[こちらのページ](https://github.com/kripken/emscripten/wiki/Building-Projects)に

```shell-session
./configure
make
```

を

```shell-session
emconfigure ./configure
emmake make
emcc [-Ox] project.bc -o project.js
```

に変えればOKよ、と書いてあるのに、全然できひんやん…jsファイルはできるのに中身がない…で絶望の中1ヶ月止まってましたが、先週末はっと気付いてコンパイルできるようになりました。
emconfigureとか挟んでたりバイトコードからのコンパイルなのでうっかりしてましたが、よく考えればemccでのコンパイルなので、EXPORTED_FUNCTIONSで吐き出す関数指定してやらないと、そら最適化で全部消えるわ…。

で、とりあえずできるようになったので手順。

## proj4ソースを落としてくる

[こちら](http://trac.osgeo.org/proj/)からどうぞ。

## configure, make

展開したフォルダ内で、

```shell-session
emconfigure ./configure
emmake make
```

## 残したい関数を選んで、make

Proj.4の提供しているAPIは、[こちら](http://trac.osgeo.org/proj/wiki/ProjAPI)に一覧があります。
何でも出せると思いますが、まあpj_transformとpj_init_plusは出さないとどうしようもなりませんな。
あと、以前の紹介でも書きましたが、emscriptenはjavascriptの型で返す関数を提供してくれるわけではないので、入出力のデータ加工のために、cの関数も一緒に出しておいた方がいいでしょう。
サンプルではstrlen, free, strncpy, memset, malloc, memcpy, strcpy, pj_init_plus, pj_transformあたりを残しておくものとします。

また、Macの場合、makeするとコンパイル結果は[展開フォルダ]/src/.libs/libproj.dylib に展開されます。
libproj.aからもjsは作られますが、共有ライブラリから作った方がいいとどこかにあったのでdylib使います。
他の環境では、*.aや*.so、*.bc等違うかもしれません。
そもそも展開先も違うかも。

```shell-session
emcc -O2 [展開フォルダ]src/.libs/libproj.dylib --pre-js js/pre.js --post-js js/post.js -o js/emproj.js -s EXPORTED_FUNCTIONS="['_strlen','_free','_strncpy','_pj_init_plus','_memset','_malloc','_pj_transform','_memcpy', '_strcpy']"
```

pre.js、post.jsというのは、emscriptenの生成したjavascriptコードの前後につけて、コロッとしたjavascriptモジュールにするためのファイルです。
自分で作んないとダメです。
emscriptenのコードはグローバル汚染しまくりますし、そもそもjavascript的インタフェース持ってないのでそのままだと使い難くてしょうがありません。
pre.jsとpost.jsでくるんで、使い易くしてやりましょう…が、とりあえずは空ファイルでもいいです。

## なんかエラー出るので対処

どうもバグっぽいのでまたレポートしないとですが、EXPORTED_FUNCTIONSにpj_init_plusを含めて-O2でjavascript化してやると、エラー吐きます。
pj_init_plusを含めないか（proj.4的には非常に意味がない）、-O1以下の最適化だと問題ありません。
単純な文法エラーなので、直してやります。


```js:エラー1
p =+ W( + m, + (.9396926207859084 * q--.3420201433256687 * n))
```

```js:エラー1修正
p =+ W( + m, + (.9396926207859084 * q+.3420201433256687 * n))
```

```shell-session:エラー1修正sed
sed -e s/--\.342/+.342/ js/emproj.js > js/emproj.js_1
```

```js:エラー2
+(+,+2.0);+();+();+(+,+2.0);+(+,+2.0);+();+();+();
```

こんな表現がよく判らないところに混ざってるのでざっくり削除

```shell-session:エラー2修正sed
sed -e s/\+\(\+,\+2\.0\)\;\+\(\)\;\+\(\)\;\+\(\+,\+2\.0\)\;\+\(\+,\+2\.0\)\;\+\(\)\;\+\(\)\;\+\(\)\;// js/emproj.js_1 > js/emproj.js_2
```

とりあえずこれで、読み込んでもエラー出なくなりました。


個人的案件用のpre.js、post.jsつけて、裏の案件で試してみましたが、mercとlatlong扱う限りでは、単純WGS84/Googleメルカトルだけじゃなく色々試してみましたが動いてます。
ただなんか、別の方のコンパイルされたのより遅くなってるかも…なんでだろ？
メモリ空間の確保を小さくしちゃったかな？

一応今回はコンパイルまで。
コンパイルした関数の叩き方、pre.js、post.jsの作り方等は、また機会がありましたら。
Android で nine patch

# nine patch とは
* 画像リソースを適切に伸縮させることが可能なツール
* Android SDK には nine patch 画像を簡単に作成できる "draw9patch" というツールが下記の場所にある
    * android(Android SDK の top ディレクトリ)/tools/draw9patch
* 利点：nine patch を使用すると小さい画像を引き伸ばすことが可能であるため、元々の画像サイズは小さく保持することができる
* 欠点：グラデーションの入った画像などには適用できない

# 使い方 (for Mac)
* ターミナルを開き、draw9patch があるディレクトリまで移動

> draw9patch

* 上記コマンドで、draw9patch が起動する
![draw9patch.png](https://qiita-image-store.s3.amazonaws.com/0/28573/b1587a02-2cbf-c0d9-65d3-f24d0d0a6f93.png)

* 変形対象の画像をドラッグして表示すると次のようになる
![画像配置後.png](https://qiita-image-store.s3.amazonaws.com/0/28573/bb2aab8f-6f87-48cd-1285-e14c0de3005d.png)
    * 表示画像左半分の中の、上と左にある 1px の黒ドットの範囲が引き延ばしたい領域になる
    * 右半分は、上からオリジナル、横を引き伸ばした場合、縦横両方を引き伸ばした場合のプレビューが表示されている
* cmd + s を押すと保存先と名前を聞かれるので、保存する
    * ネーミングルールは、*.9.png となる
* android プロジェクトの res/ 下の任意の場所に配置する
    * この時、オリジナルとなる *.png を残したままでいると、重複したとみなし、エラーの元となるの削除する

# 適用結果
* nine patch した画像を表示すると以下のようになる
![NinePatch適用画像表示.png](https://qiita-image-store.s3.amazonaws.com/0/28573/04130cb5-5fa1-3d8d-0456-687694d879e8.png)
* nine patch を使用せず画像を伸張すると、上記画像の "伸張画像" のように真ん中の白丸部分や四隅がボケてしまう
* しかし、nine patch を使用すことで、上記画像の "Nine Patch 画像" のように四角の部分だけを伸長することができる
[Rails]複数のデータベースに接続する


ひとつのMySQLサーバーだけでなく、もうひとつ別のMySQLサーバーに接続したい欲張りさんのための方法。

```database.yml
development:
  # ひとつめはいつもどおり
  adapter: mysql2
  encoding: utf8
  database: database1
  username: hoge
  password: hogehoge
  host: database1.url
  port: 3306
  pool: 5
  timeout: 5000

test:
  # 略
production:
  # 略

# ふたつめ
database2:
  adapter: mysql2
  encoding: utf8
  database: database2
  username: fuga
  password: fugafuga
  host: database2.url
  port: 3306
  pool: 5
  timeout: 5000
```

modelを作成し、establish_connectionの引数にdatabase.ymlに追加した設定を指定する

```futatsume.rb
class Futatsume < ActiveRecord::Base
  establish_connection(:database2)
end
```

ここまでできればあとはcontrollerから同じ使い方ができる

```test_controller.rb
def test
  @futatsume = Futatsume.where(["name = ?", "test"])
end
```

しかししかし、
modelひとつひとつにestablish_connectionでデータベースを指定すると、
model毎にコネクションをはるっぽいので、DB接続コネクション数が異常に増えることになる。
なので、こうするのがベター

```futatsume.rb
class Futatsume < ActiveRecord::Base
  establish_connection(:database2)
end
```
```futasume_user.rb
class FutatsumeUser < Futatsume
end
```
```futasume_task.rb
class FutasumeTask < Futasume
end
```

もとのFutatsumeクラスを継承するかたちに実装する。
使い方は同じ

```test_controller.rb
def test
  @futatsume_user = FutatsumeUser.where(["name = ?", "test"])
  @futasume_tasks = FutatsumeUser.where(["id > ?", 10])
end
```
HaxeでjavascriptのDOMの型をキャストする時

Haxeでjavascriptを書いている時にちょっと困ったことがありました。

## 困ったこと

HaxeではDOMエレメントを厳密な型に分けて管理しています。

例えば、inputタグなら`InputElement`とかformタグなら`FormElement`とか...
これらの型は基底となる`Element`を継承することで表現しています、しっかりタイプ分けされていて気持ちいのですが...

以下のようなコードをjavascriptの感覚で書けないのです。

```html
<input type="text" id="foo" value="foo">
```

```js
var element = document.getElementById("foo");
console.log(element.value); // -> foo javascriptならOKだ！！
```

```hx
class Main {
  function foo() {
    var element = Browser.document.getElementById("foo");
    trace(element.value); // -> js.html.Element has no field value Haxeはコンパイルエラー...
  }
}
```

`Browser.document.getElementById`は`Element`型を返すので、
取得したDOMオブジェクトを`InputElement`として扱うことは出来ません。（`Element`型は`value`プロパティを持っていない）

## 当然解決策は用意されていますが...

`untyped`キーワードを利用することでコンパイルチェックを外すことが可能です。
或いは、代入する変数の型を`Dynamic`にしておくことでも対処可能です。
しかし、いづれの方法もHaxeの型システムを放棄するものですので、あまり利用したくはありません。

```hx
class Main {
  function foo() {
    var element1 = Browser.document.getElementById("foo");
    trace(untyped element.value); // -> foo
    var element2:Dynamic = Browser.document.getElementById("foo");
    trace(element.value); // -> foo
  }
}
```

`cast`関数を利用することで、異なる型に変換することが可能です。
`cast`を利用すればほぼ解決出来るのですが、どんな型にでも変換出来てしまうという危険性も備えています。

```hx
class Main {
  function foo() {
    var element1 = cast( Browser.document.getElementById("foo"), InputElement );
    trace(element.value); // -> foo
    var element2 = cast( Browser.document.getElementById("foo"), NodeList );
    trace(element.value); // -> js.html.NodeList has no field value
  }
}
```

## 変換可能な型を限定するためのCastクラスを作って解決する

Haxeの機能に`cast`可能な型を限定しておける機能があるかはよく分からなかったので、
独自にcastする処理を書いて解決してみました。

```hx
class FromElement {
  var element: Element;

  public function new(element: Element) {
    this.element = element;
  }

  public function toInputElement(): InputElement {
    return cast( this.element, InputElement );
  }
}
```

```hx
import FromElement;

class Main {
  function foo() {
    var element = Browser.document.getElementById("foo");
    trace(new FromElement(element).toInputElement().value); // -> foo
  }
}
```

castするクラスを利用することでcast可能な型を限定出来るようになり型安全なcastが可能になりましたが、
記述がやや冗長になります。
（From To の関係がコードから分かるので、この冗長さはある意味綺麗なものだとも思いますが...）


## 抽象型を作って暗黙的に型をcastする

Haxe3からは抽象型という機能が追加され、型の定義を柔軟に設定出来るようになりました。
`Element`型をcastするための抽象型を定義します。

```
abstract CastElement(Element) {
  public function new(element: Element) {
    this = element;
  }
  @:to public function toInputElement(): InputElement {
    return cast(this, InputElement);
  }
}
```

```hx
import CastElement;

class Main {
  function foo() {
    var element: InputElement = new CastElement( Browser.document.getElementById("foo") );
    trace(element.value); // -> foo
  }
}
```

抽象型を利用すると、代入先の型へのキャストが可能であればその型に暗黙的に変換して代入してくれます。
castクラスを定義して利用するよりコードがスッキリ...したような気もします。

## まとめ

まとめではないけど、もっといい方法ご存じの方がいらっしゃれば是非教えていただきたい。
select loop の小ネタ

Go の select loop で Chan を扱うときの小ネタ。

## 擬似乱数的な

case は上から評価されるけど、その結果実行可能な case が複数ある場合は、そのどれかが選ばれる。
どちらが選ばれるかは実行環境依存。

```go
func main() {
	c := make(chan int)
	go func() {
		for {
			select {
			case i := <-c:
				print(i) // 0, 1 のどちらかがランダムで表示される
			}
		}
	}()

	for {
		select {
		case c <- 0:
		case c <- 1:
		}
	}
}
```


## nil channel

channel の case が nil だと、そこに case が存在しないのと同じ扱いにある。
これを、 chan の読み取りをストップするなどに使うことができる。

1 秒ごとに読み出しを停止/再開する例。

```go
func main() {
	stop := false
	c := make(chan int)
	interval := time.Tick(1 * time.Second)

	go func() {
		for {
			// 0.1 秒ごとに書き込む
			time.Sleep(100 * time.Millisecond)
			c <- 1
		}
	}()

	for {
		var read chan int
		if !stop {
			// ここを通らないと read は nil
			read = c
		}

		select {
		case j := <-read:
			// read が nil で無いときだけ読み出す
			log.Println(j)
		case <-interval:
			// 1 秒ごとに切り替える
			stop = !stop
		}
	}
}
```

## channel buffer と select write

名前がよくわからないけど、以下のように worker にブロードキャストする時、読み出しで遅いのがいると詰まる。

```go
func worker(t time.Duration) chan int {
	ch := make(chan int)
	go func() {
		for {
			time.Sleep(t * time.Millisecond)
			log.Println(<-ch)
		}
	}()
	return ch
}

func main() {
	workers := [](chan int){
		worker(10),
		worker(1000), // slow woker
		worker(10),
	}

	for i := 0; i < 100; i++ {
		time.Sleep(10 * time.Millisecond)
		for _, w := range workers {
			// slow worker のせいで詰まる
			w <- i
		}
	}
}
```

これは、書き込みを goroutine に飛ばすことで一応解決はする。

```go
	for i := 0; i < 100; i++ {
		time.Sleep(10 * time.Millisecond)
		for _, w := range workers {
			// 書き込みを goroutine に飛ばす
			go func(i int) {
				w <- i
			}(i)
		}
	}
```

しかし、もし worker の読み出しが致命的に遅いと、ブロックした goroutine が大量にゾンビとなる可能性があるので、それを防止する仕組みが別途必要になる。


一つは chan に buffer を設定すること。以下では 20 個にしていて、これが MQ の役割になる。
しかし、ただ設定するだけだと、満杯になったとき結局ブロックするので、ここを switch で抜けるようにする。

```go
func worker(t time.Duration) chan int {
	// chan にバッファを設定
	ch := make(chan int, 20)
	go func() {
		for {
			time.Sleep(t * time.Millisecond)
			log.Println(<-ch)
		}
	}()
	return ch
}

func main() {
	workers := [](chan int){
		worker(10),
		worker(1000), // slow woker
		worker(10),
	}

	for i := 0; i < 100; i++ {
		time.Sleep(10 * time.Millisecond)
		for _, w := range workers {
			select {
			case w <- i: // buffer が満杯だと実行されない
			default:
				// 空のデフォルトがあることでこの select を抜けられる。
				// もし無いと、 w が書き込み可能になるまで select がブロックする
			}
		}
	}

	// main を抜けないようにしてるだけ
	time.Sleep(10 * time.Second)
}
```

この場合は、 slow worker は 20 個だけ処理して。残りの 80 は受け取らない。
SQLiteの基本的な使い方


条件付きselectの結果を複数行扱う場合はこのような感じになります。
sqlite3_bind_intのindexが1から始まるのが気持ち悪い・・・。

```objectivec:
	sqlite3 *database = nil;
	int result = sqlite3_open([path fileSystemRepresentation], &database);
	if (result != SQLITE_OK) {
		return NO;
	}

	int id_min = 100;
	const char *sql = "select id, name from tb1 where id > ?";
	sqlite3_stmt *statement = nil;
	int result = sqlite3_prepare_v2(database, sql, -1, &statement, NULL);
	if (result != SQLITE_OK) {
		sqlite3_close(database);
		return NO;
	}
	result = sqlite3_bind_int(statement, 1, id_min);
	if (result != SQLITE_OK) {
		sqlite3_finalize(statement);
		sqlite3_close(database);
		return NO;
	}

	while (sqlite3_step(statement) == SQLITE_ROW) {
		int id = sqlite3_column_int(statement, 0);
		NSString *name = nil;
		const unsigned char *str = sqlite3_column_text(statement, 1);
		if (str && strlen((const char *)str)) {
			name = [NSString stringWithUTF8String:(const char *)str];
		}
		// id, nameをどこかに格納する.
	}

	result = sqlite3_finalize(statement);
	if (result != SQLITE_OK) {
		sqlite3_close(database);
		return NO;
	}

	result = sqlite3_close(database);
	if (result != SQLITE_OK) {
		return NO;
	}

	return YES;
```
jQuery ---- アニメーション


jQueryにはアニメーションをとても簡単に実装出来る仕組みがあります。

↓の例では#boxのleftプロパティの値を、1,000ミリ秒(1秒)かけて500ピクセルにすると言う意味になります。

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test</title>
    <style type="text/css">  
    #box {
    	position: relative;
    	left: 0px;
    	width: 100px;
    	height: 100px;
    	background: red;
    }
    </style>  
</head>
<body>

<div id="box"></div>

<script type="text/javascript">

$(function() {
	$('#box').animate({ left: '500px'}, 1000);
});

</script>

</html>
```

![jq例003.png](https://qiita-image-store.s3.amazonaws.com/0/35975/6e2019bf-66c9-563b-3421-282f1e25b37b.png "jq例003.png")

またフェードイン、フェードアウト、スライドダウン、スライドアップといったよく使うアニメーションは、それぞれfadeIn、fadeOut、slideDown、slideUpといったショートカットのメソッドが用意されている。

以下はfadeOutの例↓


```

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test</title>
    <style type="text/css">  
    #box {
    	position: relative;
    	left: 0px;
    	width: 100px;
    	height: 100px;
    	background: red;
    }
    </style>  
</head>
<body>

<div id="box"></div>

<script type="text/javascript">

$(function() {
	$('#box').fadeOut();
});

</script>

</html>
```

![jq例004.png](https://qiita-image-store.s3.amazonaws.com/0/35975/54d8acf3-64c8-e36a-add3-3b5231f56974.png "jq例004.png")

下にフェードインやスライドダウンのアニメーションのイメージをのせます↓

![jq例005.png](https://qiita-image-store.s3.amazonaws.com/0/35975/a4e14c92-93d6-5261-f964-4d31f56219db.png "jq例005.png")
OS X をサポートした Docker 0.8 を試す

Docker が 0.8 で OS X を正式にサポートしました。

 * http://blog.docker.io/2014/02/docker-0-8-quality-new-builder-features-btrfs-storage-osx-support/
 
早速試してみました。インストール方法は公式に文章が用意されています。

 * http://docs.docker.io/en/latest/installation/mac/

が、Homebrew に Formula が用意されていたのでこちらで簡単に試してみます。

---

まずはじめに [VirtualBox](https://www.virtualbox.org/wiki/Downloads) をインストールしてください。

`homebrew/binary` を tap します。

```shell-session
$ brew tap homebrew/binary
```

docker と boot2docker をインストールします。

```shell-session
$ brew install docker boot2docker
```

boot2docker で docker daemon の準備をします。

```shell-session
$ boot2docker init
...
$ boot2docker up
```

ssh でログインしてみます。User は `docker` で Password は `tcuser` です。

```shell-session
$ boot2docker ssh
Warning: Permanently added '[localhost]:2022' (RSA) to the list of known hosts.
docker@localhost's password:
                        ##        .
                  ## ## ##       ==
               ## ## ## ##      ===
           /""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
           \______ o          __/
             \    \        __/
              \____\______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
boot2docker: 0.5.4
docker@boot2docker:~$
```

その他 `docker` コマンドで各種操作が可能ですが、利用の際には以下の通り環境変数を設定する必要があります。

```
$ export DOCKER_HOST=tcp://
```

これを忘れると ```dial unix /var/run/docker.sock: no such file or directory``` といったエラーが表示されます。
jQuery ---- イベントの使用例


## イベントの設定

次のように記述します

```js
jQueryオブジェクト.イベント名(function) {
	イベントが起きたときの処理
});
```

例えば「#btnの要素がクリックされたらconsole.log('clicked')が実行される」の処理の場合は↓

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test</title>
</head>
<body>

<button id="btn">ボタン</button>


<script type="text/javascript">

$(function(){
    $('#btn').click(function() {
    	console.log('clicked');
    });
    
});

</script>

</html>
```

![jq例001.png](https://qiita-image-store.s3.amazonaws.com/0/35975/225111b4-b209-1637-8154-d6d02b51cbe9.png "jq例001.png")

↓もちろんclick以外にも、mouseoverやmouseoutなどJavaScriptで使えるイベントはみんな使えます。


```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test</title>
</head>
<body>

<button id="btn">ボタン</button>


<script type="text/javascript">

$(function(){
    $('#btn').mouseover(function() {
        console.log('mouseover');
    });

    $('#btn').mouseout(function() {
        console.log('mouseout');
    });

});

</script>

</html>
```

![jq例002.png](https://qiita-image-store.s3.amazonaws.com/0/35975/b1b66c70-e4af-0ec0-fe7a-51b2ba55aadf.png "jq例002.png")
パターンにマッチした箇所に色を付けてコンソールに出力


たとえば、html の class 属性に色をつけて出力する場合

```ruby:sample.rb
colored = string.dup
colored.gsub!(/class\s*=\s*["'][^'"]*['"]/) {"\033[31m#{$&}\033[0m"}
print colored
 
```

gsub のブロック内では $& でマッチした文字列を取り出すことができる。
その、マッチした文字列の前後にターミナル上で色をつけるためのエスケープシーケンス`\033[31m`と、色をリセットするシーケンス`\033[0m`で囲むことでパターンにマッチした文字列に色を付けることができる。
githubのissueを抜き出す(GHE → gitlabへ移行したい)


## やりたいこと
とある事情で github enterprise から gitlab へリポジトリを移行する作業をすることになりました

リポジトリの移行はググれば見つかるのですが、issueとかwikiの移行方法は中々みつからず…

同じとこで困った方のために

--追記
コメントで頂いた情報を元に、リポジトリとwikiも取得するコードを追加しました


## できたこと
とりあえずプログラムでissueを抜き出して、ファイルに保存しておくところまでできました
これでいつでも解約できるぜ!! v(´∀｀*v)ﾋﾟｰｽ

肝心の移行ですが、gitlab側の環境がある程度完成してからでないとやれないので保留してます

例えば、githubのissueにアサインされてるgithubアカウントはgitlab側には存在しません
gitlabリポジトリでも同じメンバーで開発するとして、githubのアカウントとgitlabのアカウントをひも付けする対応表みたいなの作らないといけないよなぁと思いました

その辺のアカウントの移行まで済んだら続きやろうかなという感じです
gitlab APIでissueの追加ができるっぽいので、とりあえず手元にgithubから抜き出したissueデータがあればいつでもやれそうかなと

## コード

リポジトリはこちら
https://github.com/abeyuya/github-issue-getter
--追記
コメントで頂いた情報を元に、リポジトリとwikiも取得するコードを追加しました


こちらのコード参考にしました
https://gist.github.com/tkarpinski/2369729

rubyです
octokit使ってます
https://github.com/octokit/octokit.rb
おれがガンダムだ

### ちょっと解説

オリジナルのコードでは抜き出したissueの必要なデータをcsvに整形して保存していました
(ちなみにそのままでは動きませんでした)

csvでも良いのですが、今回の場合は移行自体は後で行うので、その時にどんなデータが必要になるかいまいちわかりません
なので、取得したデータを全てをとりあえず保持しておきたいなぁと思い、octokitのオブジェクトのままデータとしてファイルに保存しました

そのため、
データをファイルに保存する 	github_issues_to_file.rb と、
データをファイルから読み出す  github_issues_from_file.rb がありますが、
どちらも require 'octokit' な感じです

実際に移行するときは、読み出すプログラムの方に、gitlab APIを叩くような処理を書くことになるかなぁという感じです

## まとめ

今回みたいなケース多いと思うので、gitlab側で1クリックで全部インポートできるようにしてくれるとありがたい限りでございます
Mac+Eclipse(PyDev)+Django環境構築

※Python, Django, Eclipseはインストール済み想定

■PyDevのインストール

* EclipseのHelp -> Install New Software -> Work with:に「 PyDev - http://pydev.org/updates/ 」を入力
* 出てきた「PyDev」にチェックしてNext -> Next -> Accept -> Finish
* 旧バージョンをインストールしたいときは「Show only the latest version of available software」のチェックを外す。（PyDev3.x系で動かなかった時なんかは2.x系を入れてみると動いたりする）
* インストール完了

■Djangoのパス設定

* Eclipse -> 環境設定 -> PyDev -> Interpreter - Pythonで「Auto Config」をクリック
* System PYTHONPATHにNew FolderでDjangoフォルダ指定して適用
* パス設定完了

■プロジェクト作成
【新規プロジェクト作成の場合】

* File -> New -> PyDev Django Project -> Next
* 適当に名前を決めてFinish
* Run AsでPyDev: Djangoを選択
* http://localhost:8000/ で「It worked!」

【既存コードからプロジェクト生成の場合】

* File -> New -> PyDev Django Project -> Next
* 適当に名前を決めたあと、Project ContentのUse Defaultチェックを外して、既存コードのフォルダを選択してFinish
gulpプラグインエラー時に発生するイベントの調査


gulpプラグインでは、エラー時の処理として ```emit('error')``` した後に ```callback()``` を実行しているものをよく見かける（例えば[これ](https://github.com/gulpjs/gulp/blob/master/docs/writing-a-plugin/using-buffers.md)とか）。

```javascript
if (...) {
  this.emit('error', errorObject);
  callback();
}
```

このような場合、プラグイン呼び出し側で発生するイベントは'error'イベントなのか'end'イベントなのか、理解が曖昧だったので調査してみる。


## 調査の概要
'error'イベントおよび'end'イベントの発生条件を調べる。組み合わせる条件は以下の通り。

a. プラグイン内で ```emit('error')``` を実行するか
b. プラグイン内で ```callback``` を実行するか
c. プラグイン内で ```callback``` を実行する場合、```callback``` に引数与えるか

調査用に使ったソースは以下のとおり。コマンドライン引数で実行条件を指定できるようになっている。

```javascript
var gulp    = require('gulp');
var gutil   = require('gulp-util');
var through = require('through2');

/*
 * テスト条件をコマンドライン引数から受け取る
 */
var emit       = gutil.env.emit;      // plugin内でemit('error')するか
var cb         = gutil.env.cb;        // plugin内でcallbackを呼び出すか
var cbWithArg  = gutil.env.cbWithArg; // plugin内でcallbackに引数与えるか

/*
 * テスト用のプラグイン関数
 */
function testPlugin(emit, cb, cbWithArg) {
  return through.obj(function (file, encoding, callback) {

    if (emit)
      this.emit('error', 'emit error');

    if (cb) {
      if (cbWithArg)
        callback('callback argument');
      else
        callback();
    }

  });
}

/*
 * テスト用gulpタスク
 */
gulp.task('default', function() {

  gulp.src('src/file')
      .pipe(testPlugin(emit, cb, cbWithArg))
        .on('error', function(error) {
          console.log('* error handler: ' + error);
        })
        .on('end', function() {
          console.log('* end handler: ');
        })
      .pipe(gulp.dest('dest/'));

});
```

## 調査結果
| 条件a    | 条件b         | 条件c            |  結果
|---------|---------------|-----------------|------------------
| emitなし | callbackなし  | -               | 発生するイベントなし
| emitなし | callback有り  | callback引数なし  | 'end'イベントのみ発生
| emitなし | callback有り  | callback引数有り  | 'error'イベントのみ発生
| emit有り | callbackなし  | -               | 'error'イベントのみ発生
| emit有り | callback有り  | callback引数なし  | 'error'イベントのみ発生
| emit有り | callback有り  | callback引数有り  | 'error'イベントのみ発生

どうやら'error'と'end'が同時に発生することは無さそう。
OS XでDocker

[DockerがOS Xに対応](http://japan.internet.com/busnews/20140207/4.html)したそうで。[ドキュメント](http://japan.internet.com/busnews/20140207/4.html)見ながらぽちぽちと。


```bash:Terminal
$ mkdir -p ~/Binary/boot2docker
$ cd ~/Binary/boot2docker
$ curl -O https://raw.github.com/steeve/boot2docker/master/boot2docker
$ chmod +x boot2docker
$ export PATH=`pwd`:$PATH
```


```bash:Terminal
$ mkdir -p ~/Binary/docker
$ cd ~/Binary/docker
$ curl -o docker http://get.docker.io/builds/Darwin/x86_64/docker-latest
$ chmod +x docker
$ export PATH=`pwd`:$PATH
```


```bash:Terminal
$ export DOCKER_HOST=tcp://
$ boot2docker init
$ boot2docker up
$ boot2docker ssh
```


```bash:Terminal
$ uname -a
Linux boot2docker 3.12.1-tinycore64 #1 SMP Fri Jan 10 13:04:04 UTC 2014 x86_64 GNU/Linu
```


動いたぽい。
Kotlinの文法メモ（無名オブジェクト、override、thisキーワード）


AndroidアプリをKotlinで開発しています。
以下の処理を何とか書きました。
チェックボックスを押したらトーストが表示されるだけです。

```Kotlin
checkBox.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener {
    override public fun onCheckedChanged(buttonView:CompoundButton?, isChecked:Boolean) {
        Toast.makeText(this@MyActivity, "checed change", Toast.LENGTH_SHORT).show();
    }
});
```

この数行だけでもいくつかKotlin独自の書き方が出てきたのでメモしておきます。

## 無名オブジェクトの書き方

Fooクラス(インタフェース)に対する無名オブジェクトは以下のような書き方をします。

```Kotlin
val foo = object : Foo {}
```

## override

overrideはアノテーションの書き方ではないので注意です。
最近の言語はだいたいこんな感じの書き方が多いですね。

```kotlin
override public fun fuga(bool:Boolean) {
    //fugafuga
}
```

## thisキーワード

`this`の書き方もJavaとは結構違いますので注意。

```kotlin
val object = this@Buz //Buzクラスのオブジェクトを取得
```
jQuery④


## メソッド ---- jQueryオブジェクトに処理を行う関数

記述のしかたは次の様になります。

```js
jQueryオブジェクト.メソッド名(引数, 引数, ...);
```

具体的な使い方は↓、、この`.css()`や`.html`、`.attr()`がメソッドです。

```html

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test02</title>
</head>
<body>

<div id="box" class="content">This is box</div>


<script type="text/javascript">

$(function(){
    // div要素すべての取得
    var $box = $('#box');
    // 要素のCSSを変更
    $box.css('color', 'red');
    // 要素の中身のHTMLを変更
    $box.html('<p>content</p>');
    // 要素のclassNameを取得
    var className = $box.attr('class');
    console.log(className); //=> content
});

</script>

</html>

```

![jqメソッド01.png](https://qiita-image-store.s3.amazonaws.com/0/35975/810bfec9-364b-519c-0573-b47bf2932c4e.png "jqメソッド01.png")

![jqメソッド02.png](https://qiita-image-store.s3.amazonaws.com/0/35975/9ae22721-d2a6-a451-0178-29291052eead.png "jqメソッド02.png")

↑pタグに変わってる事が分かる。

## メソッドチェイン ---- メソッドをつなげて記述する

これらのメソッドはつなげて書く事ができる。
また、変数に保存しないでいきなり書く事ができる。

```html
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<title>jQuery-test02</title>
</head>
<body>

<div id="box">This is box</div>


<script type="text/javascript">

$(function(){
    // 要素を取得してCSSを変更し、中身のHTMLを変更
    $('#box')
    .css('color', 'red')
    .html('<p>content</p>');
});

</script>

</html>


```

![jqメソッドチェン01.png](https://qiita-image-store.s3.amazonaws.com/0/35975/7df9e98e-ecf8-0c6b-7356-dcd66e1211ba.png "jqメソッドチェン01.png")
OSXをMarvericksに更新したら、VirtualBoxのホストオンリーネットワークでエラー


対象：VirtualBox：4.2.x
対処：VirtualBoxを最新にアップデート（4.3.x）

---

Marvericksに更新前に問題なかった仮想環境が起動できず。
どうやらホストオンリーアダプターに割り当てたvboxnet0が消えた模様。
じゃあ作るか、というわけでVirtualBoxの「設定＞ネットワーク」でネットワークの追加を実行したら下記のエラーが発生。

```
ホストオンリーネットワークインターフェースの作成に失敗しました
mavericks VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
```

下記のリンク先見ると4.3系で解決しているようなので、とりあえずVirtualBoxの更新。
その後「設定＞ネットワーク」開くとNATとホストオンリーネットワークの２つに分かれているので、ホストオンリーネットワークの方でネットワークの追加（vboxnet0が作成された）。

対象の仮想環境の設定で、ホストオンリーネットワークに作成した（vboxnet0）を割り当て。
起動して疎通確認で完了。

---

参考
https://www.virtualbox.org/ticket/12242
middleman buildしたらGruntを実行したかった



Middleman単体でもHTML,CSS,JavaScriptの圧縮はしてくれるんだけど、CSScombとかもしたかったので別途Gruntを動かしてた。

…けど、2回もコマンド叩いてウェーイするのはアレだと思ってなんとかしたかった。

## やりかた
1. config.rbを編集する。
2. `middleman build`をたたく。

### config.rbを編集する。
```ruby:config.rb
class StartGrunt < Middleman::Extension
	def initialize(app, options_hash={}, &block)
		super
		app.after_build do |builder|
			builder.run 'grunt'
		end
	end
end
::Middleman::Extensions.register(:grunt, StartGrunt)

activate :grunt
```

#### 参考
[Middleman: カスタム拡張](http://middlemanapp.com/jp/advanced/custom/#toc_9)



### middleman buildをたたく
```
$ middleman build
create …
・
・
・
run  grunt from "."
Running "csscomb:dist" (csscomb) task
>> Using default config file...
>> Sorting file "build/css/style.css"...
```

## まとめ
もうちょっとなんとかなる気がしますが、
とりあえず、こんな拡張方法もあるよってことで。
チラ裏でした。
Bookmarklet作成備忘録

##そもそもだ
なんでこれやろうと思ったんだ？というところなのですが。ニコ動の動画情報を加工してEvernoteに保存するってのをやりたくて。で調べてたらGoogle機能拡張だったら中身JavaScriptだしなんとかなるかなぁと、安易に手を出して挫折して（をい）。

さてどうすんべかなぁと調べてる最中に、やっとこさBookmarkletの存在を思い出したという体たらくでした。ガチで存在忘れてた。すまん。誰に謝ってるんだ＞俺。

というわけで。

[ニコニコ動画視聴ページから動画情報を抽出する(Bookmarklet版)](http://www.mars.dti.ne.jp/~hirok/garage/nicosummary.html)

実物置いときますね中身興味ない方はバイバーイ。

って技術メモでウケを取ろうとするな＞俺。悪い癖です。

#Bookmarkletを作ってから

本題。Bookmarklet作るところは特に何の問題も無かったんです。

[ブックマークレットで jQuery を使う魔法の 210 文字](http://qiita.com/otchy/items/5c4f2e1b2a93ac200f1c)

こちらの記事を参考にjQuery使うこともできましたし。Chrome上ならばコンソールにコピペで突っ込めば即実行確認できますし。

それよりはむしろ作り終えてから、の方に時間を費やしてしまいましたので、その備忘録を。

自分の場合、元ソースがChrome機能拡張（の残骸）からだったということもあって（[こんな感じで](http://www.mars.dti.ne.jp/~hirok/garage/nicosummary_bookmarklet.js)）、特にBookmarklet向けに気をつけながらソースを書く、ということをやってませんでした。ですので改めて、そのソースを加工して、Bookmarkletに仕上げなければなりません。

その手順。ミもフタもありませんがこれ使います。

[Closure Compiler](Closure Compiler Service)

Google様ご提供。こちらにコピペしてCompileすりゃいいだけなのですが、注意点がふたつ。

* OptimizationでWhitespace onlyを選択する
* 「魔法の210文字」を使ってる場合は、その文字列をコピペの対象から外す（コンパイラを通さない）

特に後者が重要で。ここに気付けずに随分とハマりました。「魔法の210文字」は既に圧縮された状態のコードなので、ここにさらに圧縮かけてしまいヘンなことになっちゃったのかなぁ・・・と自分勝手に推測してますが。根拠はありません。エヘン。威張るな。

Compileが完了したら画面右側に内容表示、あわせて"default.js"のリンクが出てきますので、それをエディタにコピーします。

んでもってあとは手作業。

* さっき外した「魔法の210文字」をもう一度付加する
* 全改行を除去して１行にする
* 先頭におやくそく"javascript:"を付加する

ここまでやればBookmarklet完成でーす。自分専用、でしたら。

##公開するにもうひと手間

いわゆるアンカーやボタンに乗せるためにはもうちょっと手を加えなければなりません。いわゆるURIエンコード。Closuer Compilerによって日本語などは既にエンコードされているのですが、足りないのがふたつ。

* 半角スペースを#20に置換
* ダブルクオーテーションを#22に置換

これをやる必要がありまーす。ソース次第によっては余剰(%)なんかも要対策かな？

（参考）[Bookmarkletの作成方法(基礎)](http://bookmarklet.dohow.jp/createbookmarklet.shtml)

自分はエディタでちまちま置換かけました。割とめんどくさし。

ここまでできたらテスト用のHTMLでもでっちあげて、リンクかボタンにソース突っ込んで・・・で動作確認して。やっとこさ完了でーす乙乙。

##蛇足

という訳で、新しいのか古いのかよくわからんBookmarkletなのですが。jQuery使えるってのはいいよねぇ。素のJS書く気力無いもんねぇ（堕落）。

Chrome拡張機能周りはマルウェアアドウェア山盛り祭りが現在進行形で開催中ですから散々な言われようなんですけど。こちらもうまく使えばそこそこいろいろできるんですよね。特にUIが必要だったりするとBookmarkletではさすがに力不足ですし。API追いかけるのはめんどいけどね。

一方で今回自分が作ったもののような「単一機能」かつ「乱暴な挙動」を行う類の場合は、Bookmarkletの方が身軽ですね。向こうのUIぶったぎる罪悪感も多少は薄れますし。

まぁ使い分けということなのでしょう。どっちもjQuery使えますしね。両方使えるようにしておくと、諸々よろしいかと思いまする。
Light Table: コマンドバーを ctrl-p, ctrl-n で移動するための設定

Emacs の癖でしょうか？コマンドバーに移動後、ctrl-p, ctrl-n でコマンドを選択しようとしてできず、イラッとくることが度々あったので設定方法を調べてみました。

## コマンドバー ##
画像の右、青く囲まれているエリアのことです。

![スクリーンショット 2014-02-08 10.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/20642/0d350c27-1040-6868-45a0-07be34a0f1a0.png)

## 設定方法 ##

`user.keymap`ファイルに以下を記述します。

```clojure
:filter-list.input {"ctrl-n" [(:filter-list.input.move-selection 1)]
                    "ctrl-p" [(:filter-list.input.move-selection -1)]}}
```

追加する場所は以下の辺りになります。

```clojure
{:+ {:app {"ctrl-;" [:workspace.show]
           "ctrl-:" [:show-commandbar-transient]}
     :editor {"alt-w" [:editor.watch.watch-selection]
              "alt-shift-w" [:editor.watch.unwatch]}
     ;; これを追加
     :filter-list.input {"ctrl-n" [(:filter-list.input.move-selection 1)]
                         "ctrl-p" [(:filter-list.input.move-selection -1)]}}
:-{:app {"ctrl-space" [:show-commandbar-transient]}}}
```

以上です。
XCodeでのwarning抑制方法

コードを書いていてwarningを抑制したい時があると思います(deprecated warningなど）。clangでは一時的にwarningを制御する事ができます。

```objective-c
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  NSString *caption = @"hoge";
  captionHeight = [caption sizeWithFont:captionFont constrainedToSize:CGSizeMake(320, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping].height;
#pragma clang diagnostic pop
```

`clang diagnostic push`と`clang diagnostic pop`で挟めばOKです。warningを一時的に無効にしているのは

```objective-c
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
```

の部分です。`-Wdeprecated-declarations`がdeprecated warningを無視するようにしています。よく使うのは

|ignored parameter        |内容                           |
|:------------------------|:-----------------------------|
|-Wunused-variable         |未使用変数へのwarning           |
|-Wdeprecated-declarations |廃止予定の関数呼び出しへのwarning|

ぐらいでしょうか。ignored parameterの調べ方はXCodeのナビゲーションバーに表示されているWarning上でCtrl+Clickで'Reveal in Log'を選択すると

```objective-c
warning: unused variable 'a' [-Wunused-variable]
```

と出てくるので調べられます。
スレッドセーフに1回だけ実行させる


シングルトンとかで使う感じかな。

```objectivec:
+ (HKSQLite *) sharedSQLite
{
	static HKSQLite *_SQLite;
	static dispatch_once_t onceToken;
	dispatch_once(&onceToken, ^{
		_SQLite = [[HKSQLite alloc] initWithPath:self.path];
		[_SQLite setup];
	});
	return _SQLite;
}
```
【python】SimpleHTTPServer、CGIHTTPServerでローカルwebサーバ環境を作る方法

【前提】
※Python 2.4以上がインストールされている

PythonのSimpleHTTPServerとCGIHTTPServerを使い、ローカル環境に手軽にウェブサーバを立ち上げるための方法。
まずはSimpleHTTPServerから。
こちらは最低限の機能で、CGIは動かずシンプルなhtmlしか読み込めない。

・適当なフォルダ（/user/username/workspace/pypj/）に移動。
・index.htmlを新規作成。中身は適当に。
・以下のコマンドを実行。

```
~/workspace/pypj 514 $python -m SimpleHTTPServer 8000
```

・ブラウザから「 http://localhost:8000 」でアクセス。



次にCGIHTTPServer。
こっちはpythonコードを動かすことが可能。

・適当なフォルダ（/user/username/workspace/pypj/）に移動。
・「cgi-bin」という名前のフォルダを新規作成。
・「cgi-bin」にtest.pyを新規作成。中身は適当に。
・test.pyに以下のコマンドで実行権限を与える。

```
~/workspace/pypj/cgi-bin 518 $chmod 755 test.py
```

・親フォルダ（/user/username/workspace/pypj/）から以下のコマンドを実行。

```
~/workspace/pypj 519 $python -m CGIHTTPServer 8000
```

・ブラウザから「 http://localhost:8000/cgi-bin/test.py 」でアクセス。
Azure SQL DBでEntity Framework

Windows Azure SQL DBでEntity Frameworkを使うときの注意点です。

## リトライの組み込み

以下のクラスを作ってEntity Frameworkを含むプロジェクトに置いておきます。
自分でトランザクションを作成せず、Entity Frameworkにトランザクション管理をまかせる場合はこれだけでOKです。

```csharp
public class SampleConfiguration : DbConfiguration 
{ 
    public SampleConfiguration() 
    { 
        SetExecutionStrategy( 
            "System.Data.SqlClient", 
            () => new SqlAzureExecutionStrategy(5, TimeSpan.FromSeconds(30))
        ); 
    } 
}
```

## 自分でトランザクションを作成する

リトライを有効にして、かつ、自分でトランザクションを作成したい場合は工夫が必要になります。

前述のSampleConfigurationを使ってリトライを組み込んだとき、以下のコードはサポートされません。
2回目のSaveChanges()が失敗したときに1回目のSaveChanges()もリトライしないといけないことを
EntityFrameworkが認識できないからです。

```csharp
// サポートされないコード
using (var context = new SampleContext())
using (var tran = context.Database.BeginTransaction())
{
    context.Samples.Add(new Sample());
    context.SaveChanges();

    context.Samples.Add(new Sample());
    context.SaveChanges();

    tran.Commit();
}
```

対策方法は、まず、SampleConfigurationクラスを以下のように修正します。
これでSampleConfiguration.SuspendExecutionStrategyをtrueにすると
SaveChanges()などでEntity FrameworkがDefaultExecutionStorategyを使うようになります。

```csharp
public class SampleConfiguration : DbConfiguration
{
    public SampleConfiguration()
    {
        SetExecutionStrategy(
            "System.Data.SqlClient",
            () => SuspendExecutionStrategy ?
                (IDbExecutionStrategy) new DefaultExecutionStrategy() :
                new SqlAzureExecutionStrategy());
    } 

    public static bool SuspendExecutionStrategy
    { 
        get
        {
            return (bool?) CallContext.LogicalGetData(
                "SuspendExecutionStrategy") ?? false; 
        }
        set
        {
            CallContext.LogicalSetData("SuspendExecutionStrategy", value);
        }
    }
}
```

SaveChanges()でのリトライ処理に無効にしたうえで、
SqlAzureExecutionStrategyを手動で使ってトランザクション全体がリトライ対象になるようにします。

```csharp
var executionStrategy = new SqlAzureExecutionStrategy(); 
 
SampleConfiguration.SuspendExecutionStrategy = true; 
             
executionStrategy.Execute( 
    () => 
    { 
        using (var context = new SampleContext())
        using (var tran = context.Database.BeginTransaction())
        {
            context.Samples.Add(new Sample());
            context.SaveChanges();
        
            context.Samples.Add(new Sample());
            context.SaveChanges();
        
            tran.Commit();
        }
    }); 
 
SampleConfiguration.SuspendExecutionStrategy = false;
```