OmniAICreator/Qiita-1.07M huggingface dataset:
【C#】複数の子フォームが閉じられるまで親フォームを無効化しておく

##状況
単一の子フォームが閉じられるまで親フォームを無効化しておくには、フォームのインスタンスを`ShowDialog()`で呼び出せば良い。
けれど、子フォームが複数あり、それらがすべて閉じられるまで親フォームを無効化しておきたい場合はどうしようか？

##ソース
まず、親フォームのソース。
親フォームにはボタンがひとつ張り付いていて、クリックすると`button1_Click(~)`が呼び出される。
子フォームは`SubForm`クラス。特に子フォームには書くことがなかったので、記載なし。

```csharp:MainForm.cs

    /// <summary>
    /// 親フォームクラス
    /// </summary>
    public partial class MainForm : Form
    {
        // カウンタ
        int iClosedSubForms = 0;

        // 子フォーム表示数
        const int iOpenedSubForms = 3;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public MainForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 子フォームを開く
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // 指定した数分子フォームを開く
            for(int i = 0; i < iOpenedSubForms; i++)
            {
                // 子フォームのインスタンスを作成する
                SubForm frmSubForm = new SubForm();

                // 子フォームのClosedイベントをSubFormClosed()にハンドルして開く
                frmSubForm.Closed += new EventHandler(this.SubFormClosed);
                frmSubForm.Show();
            }
            
            // 親フォーム自身を無効化しておく
            this.Enabled = false;

        }

        /// <summary>
        /// 子フォームが閉じられた時
        /// </summary>
        private void SubFormClosed(object sender, EventArgs e)
        {
            // 閉じられた子フォームの数+1
            iClosedSubForms++;
            
            // すべてのフォームが閉じられたら
            if (iClosedSubForms >= iOpenedSubForms)
            {
                // 親フォーム自身の無効化を解除してカウンタをリセット
                this.Enabled = true;
                iClosedSubForms = 0;
            }
        }

    }

```

##解説
###親フォーム側の準備
親フォームのメンバに開いた子フォームの数（`iOpenedSubForms`）と閉じられた子フォームの数（`iClosedSubForms`）を管理する変数を準備しておく。

子フォームのインスタンスが作成された時、メソッド「`SubFormClosed(~)`」を子フォームの`Closedイベント`にハンドルさせる。

###SubFormClosed(~)の動作
子フォームが閉じられた時に、閉じられた子フォームの数をカウントし、すべての子フォームが閉じられたら親フォームを復帰させる。
wanderlustでoutlookのメールを送受信する

outlookのメールをwanderlustで送受信するときの.wlと.foldersの設定のメモ  
IMAPを使って受信する。取得したメールアドレスはyyy@outlook.jpとする。  

.wlの一部(関係のある部分だけ抜粋)

```el:.wl
;; wl-user-mail-address-listにメールアドレスを追加する
(setq wl-user-mail-address-list (list "yyy@outlook.jp"))

;; 送信用の設定
(setq wl-draft-config-alist
      '(((string-match "outlook" wl-draft-parent-folder)
         (template . "outlook")
         (wl-smtp-posting-user . "yyy@outlook.jp") ;ユーザー名は自分のメールアドレス
         (wl-smtp-posting-server . "smtp-mail.outlook.com")
         (wl-smtp-authenticate-type . "plain")
         (wl-smtp-connection-type . 'starttls)
         (wl-smtp-posting-port . 587) ; ブロックされてなければ25番でもおｋ？
         (wl-local-domain . "outlook.jp")
         (wl-message-id-domain . "smtp-mail.outlook.com"))))

(setq wl-template-alist
      '(("outlook"
         (wl-from . "Your Name <your@address>")
         ("From" . wl-from))))
```

Gmailなんかではユーザー名はそのままアカウント名で良いが、outlookの場合はメールアドレスがユーザー名になるので注意。  
メールアドレスはoutlook.comとか選べた気がするのでその場合outlook.jpの部分はoutlook.comに書きなおさないといけない。  

```:.folders
OUTLOOK {
   %INBOX:"yyy@outlook.jp"/clear@imap-mail.outlook.com:993!   "In"
   %Sent:"yyy@outlook.jp"/clear@imap-mail.outlook.com:993!    "Sent"
   %Spam:"yyy@outlook.jp"/clear@imap-mail.outlook.com:993!    "Spam"
}
```

.foldersはこんな感じに...  割と適当。  

とりあえずこれで読み書きくらいはできるはず。
OSX で md5 check


perl のワンライナーに関しての、適当な解説 [#1](http://qiita.com/bunzaemon/items/fdb1115ac97fc0955236)/[#2](http://qiita.com/bunzaemon/items/e63947c7e59e0fe4ce3d)/[#3](http://qiita.com/bunzaemon/items/efcb3f20329bc68bb8bc)/#4


## dupc

あれ？ OSX で md5 チェックするのって、`openssl md5 SOMETHING` が定番だと思ってたけど、いつのまにか `/sbin/md5` がある。

相変わらず sha1 チェックには `openssl sha1` する事になるんだろうけど、`md5` の方が、`-r` が使えてちょっとだけ利便性が上がる？

ちゅー事で、自分用重複ファイル検索コマンドを、ちょっとだけリニューアル。

```shell-session:.bashrc
function dupc(){
	find . -type f -size '+0c' "$@" | perl -Mvars=%h -lne 'next if qx{md5 -r "$_"} !~ /^(\S+)\s(.*?)$/ ; push @{$h{$1}}, $2 ;}{ print join "\n", $_, map{ "\t$_" } @{$h{$_}} for grep { @{$h{$_}} > 1 }  keys %h'
}
```

リニューアルつっても `next if ... ;` 部分の、実行コマンドと正規表現が、変更になっただけだけど。
ファイル縛りと、空ファイル除外の為の `-size '+0c'` のみデフォで。

### 使い方

```shell-session:
$ cd foo
$ dupc -maxdepth 1
8dad5f05f2ffd34e2bf0cbab16ed15e0
	./ムフフな.jpg
	./ゲヘヘな.jpg
```
自主的アク禁


古典的。

会社では、痛くもない腹を探られたくないから、

```shell-session:
$ sudo vi /etc/hosts
$ diff /etc/hosts.bak /etc/hosts
10a11,14
> 127.0.0.1 www.youtube.com
> 127.0.0.1 www.vimeo.com
> 127.0.0.1 www.2ch.net
$ sudo dscacheutil -flushcache
```

などとする。
警告サイトを踏む度に増やして行くと、結構な量になる。
GetComponentの呼び出し方


GetComponentの呼び出し方に何通りかあり、どのように使うか調べてみました。
↓こちらに詳しく書かれていました。
http://blog.be-style.jpn.com/article/57118009.html

```cs:GetComponent
// すべてのGameObjectの中から指定したコンポーネントを検索する.
GameObject.GetComponent<コンポーネント名>()
gameObject.GetComponent<コンポーネント名>()

// gameObjectが持っているコンポーネントから検索する.
gameObject.transform.GetComponent<コンポーネント名>()
```

transform自体はすべてのGameObjectが必須で持っているコンポーネントになります。
transformから見た兄弟コンポーネントを検索することで、検索する範囲が狭くなるということですね。
（感覚的には2番目のgameObjectも自身が持っているコンポーネントを検索しそうなものですが・・・）
第29回オフラインリアルタイムどう書く「サイコロの展開図」の ruby による実装

問題 : http://nabetani.sakura.ne.jp/hena/ord29devdice/
解答リンク集 : http://qiita.com/Nabetani/items/4c21127f07bfa68fa1f8
イベント : https://yhpg.doorkeeper.jp/events/20844

で。

当日お見せした実装。

```ruby
PATTERNS = %w(
  12S/453 1T6/D45 146/53D 15S/3D4
  215/T64 6T1/54D 2S5/41T 3D4/15S
  512/46T 41T/2S5 453/12S 53D/146
).flat_map{ |x| [x,x.reverse] }

def solve( src )
  re=/#{src.tr("xyzw", "....")}/
  m=PATTERNS.select{ |x| re===x }
  case m.size
  when 0; 
    "none"
  when 1
    src.chars.zip( m[0].chars )
      .select{ |a,b| a!=b }
      .map{ |c| c.join("=") }
      .join(",")
  else
    "many"
  end
end

DATA.map{ |line|
  id, src, expected = line.split(/\s+/)
  actual = solve(src)
  (actual == expected).tap do |ok|
    puts '***NG*** : %s %s->%s ( %s )' % [id, src, actual, expected] unless ok
  end
}.tap{ |x| puts( "ok:%d / NG:%d" % [ x.count(true), x.count(false) ] ) }

__END__
0 Tx4/5yz x=1,y=S,z=2
1 14S/xyz none
2 1w6/xyz many
```

で。

展開図は

* 上段左端に来る目は6通り（ 2 と D を同一視して )
* その隣に来る目は4通り（ 2 と D を同一視して )

ということで、全部で 6×4=24 通りしかない。

しかも。
展開図の文字列は reverse しても有効な展開図なので、実際には 12 通り列挙すれば足りてしまう。

というわけで、12通りまたは24通りの展開図をソースコード上に書ききれば勝ったも同然。
1個書くのに1分要しても30分以上余る。

全部の展開図が手に入れば、あとは正規表現で調べれば答えがわかる。
簡単でしょ？

まあ列挙するのはかっこ悪い感じではあるけれども、かっこ悪くても計算が正しければ良いのである。

で。
続いて、列挙した結果をソースに書きたくない場合。
`DATA.map{` 以下は同じなので、それより前の部分を：

```ruby
# 目の図形を90度回す
def rot_face(f)
  key="D2T3S6114455"
  key[ key.index(f)^1 ]
end

# サイコロを90度回す
def rot_dice(s)
  [rot_face(s[5]), s[0], (s[1]), 
   "/", 
   rot_face(s[4]), rot_face(s[2]), rot_face(s[6])
  ].join
end

# 展開図の可能なパターンをすべて列挙する
def enum_patterns( pats={}, c="146/53D", &block)
  return if pats[c]
  pats[c]=true
  block.(c)
  enum_patterns(pats, c.reverse, &block)
  enum_patterns(pats, rot_dice(c), &block)
end

#解く
def solve( src )
  re=/#{src.tr("xyzw", "....")}/
  m = enum_for(:enum_patterns).select{ |x| re===x }
  case m.size
  when 0
    "none"
  when 1
    src.chars.zip( m[0].chars )
      .select{ |a,b| a!=b }
      .map{ |c| c.join("=") }
      .join(",")
  else
    "many"
  end
end
```

というわけで、まじめに回すとだいぶ長くなる。
簡単に説明すると：

* サイコロの二種類の方法で回しつつ、メモ化再帰で探索。( `enum_patterns` )
* サイコロの回し方は二種類。`rot_dice` と、`reverse`。

という感じ。

`rot_face` では、排他的論理和( `^` )を使ってみた。ビット演算が明らかに要求されている文脈以外ではなかなか出番のない排他的論理和だけど、たぶん、ここは使いどころだと思う。

`enum_patterns` はデフォルト引数の悪用っぽい感じがする。どうかなぁ。
HHVM 3.0.1をCentOSにインストールしてnginxでHipHop

HHVMをCentOSにインストールしたのでメモ

#まずはHHVMインストール
```
$ cd /etc/yum.repos.d
$ sudo wget http://www.hop5.in/yum/el6/hop5.repo
$ sudo yum clean all
$ sudo yum install hhvm
$ sudo yum update hiphop-php
```
インストール中に下記のエラーがでた。。。。。

>Error: Package: hhvm-3.2.0-1.el6.x86_64 (hop5)
           Requires: libmcrypt >= 2.5.8
Error: Package: ImageMagick-libs-6.8.6.3-4.el6.x86_64 (hop5)
           Requires: liblcms2.so.2()(64bit)
Error: Package: hhvm-3.2.0-1.el6.x86_64 (hop5)
           Requires: libmcrypt.so.4()(64bit)

なので必要なライブラリを入れたもう一度チャレンジ
```
wget http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
yum install liblcms2-2.4-1.el6.x86_64.rpm
```

無事インストールできたら下記で確認する
```$ hhvm --version```
>HipHop VM 3.2.0 (rel)
Compiler: tags/HHVM-3.2.0-0-g01228273b8cf709aacbd3df1c51b1e690ecebac8
Repo schema: c52ba40f4a246d35a88f1dfc1daf959851ced8aa


#nginxのインストール
```
$ sudo yum install nginx
```

設定ファイルを変更する
```vi /etc/nginx/conf.d/default.conf```
>   location / {
         root   /var/www/html;
         index  index.php index.html index.htm;
         try_files $uri $uri/ /index.php?\$args;
    }
>    location ~ \.php\$ {
        root           /var/www/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

ドキュメントルートにファイルを作成する
```vi /var/www/html/index.php```
><?hh
phpinfo();

※hackのファイルは閉じカッコがあるとエラーで動かないので注意

#nginxとhhvmを起動する
```
$ sudo /etc/init.d/nginx start
$ sudo hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000
```
でブラウザからアクセスしてHipHopってでればOK
ansibleのrole用ディレクトリ構成ワンライナー

CUIでディレクトリを作るのがめんどくさかったので。

```lang:
for V in files files templates tasks handlers vars defaults meta; do mkdir -p "roles/sample/${V}"; done
for V in files files templates tasks handlers vars defaults meta; do touch "roles/sample/${V}/.gitkeep"; done
for V in files tasks handlers vars meta; do touch "roles/sample/${V}/main.yml"; done
```
Project Euler 41

問題
---
n桁パンデジタルであるとは, 1からnまでの数を各桁に1つずつ持つこととする.

下のリンク先にあるような数学的定義とは異なる

例えば2143は4桁パンデジタル数であり, かつ素数である. n桁（この問題の定義では9桁以下）パンデジタルな素数の中で最大の数を答えよ.
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2041

数学的考察
---
各桁の数の和が3の倍数になればその数自体も3の倍数になるところ、9桁、8桁、6桁、5桁、3桁、2桁のパンデジタルは各桁の和が3の倍数になるので、素数にはなりえない。したがって、7桁と4桁とをチェックすればよい。

回答
---
以前作ったパンデジタル数ジェネレータを使ってパンデジタル数を作成する。
大きなパンデジタル数から素数か否かを判定する。


```py
# coding: utf-8
# Here your code !
import copy
import math
def pandigital(digit,seq1,seq2=[]):
  iter1 = map(str,seq1)
  if seq2:
    iter2 = map(str,seq2)
  else:
    iter2 = copy.deepcopy(iter1)
  for d in range(digit-1):
    iter1 = (x+y for x in iter1 for y in iter2 if not (y in x))
  return iter1

def get_prime_boolean(max):
    bool = [False,False]+[True]*(max-1)
    # 2の倍数をFalseに
    bool[4::2] = [False] * (len(bool[4::2]))
    p = 3
    p_max = int(math.sqrt(max))+1
    while p<=p_max:
        if bool[p]:
          bool[p**2::p] = [False] * (len(bool[p**2::p]))
        p+=2
    return bool

def get_prime_list(bool):
    length = len(bool)
    return [i for i in range(2,length) if bool[i]]

def get_primes(max):
    bool = get_prime_boolean(max)
    list = get_prime_list(bool)
    return {'bool':bool,'list':list}

def is_prime(num,pri):
  num = int(num)
  if num < len(pri['bool']):
    return pri['bool'][num]

  M = (num**0.5)+1
  #print num
  for p in pri['list']:
    if p > M:
      return True
    if (num % p) == 0:
      return False

  p = pri['list'][-1]+2
  while p<M:
    if (num % p) == 0:
      return False
    p += 2
  return True


def main():
    MAX=10**7
    pri = get_primes(MAX)
    ans = 0
    for i in [7, 4]:
        for pdg in pandigital(i,range(i,0,-1)):
            if is_prime(pdg,pri):
                ans = pdg
                break
        if ans:
            break
    print ans    

main()
```
[メモ]メールアドレスを正規表現でバリデーションチェック（簡易版）

正規表現のバリデーションチェックチェックは各所で議論が白熱しています。そして厳密なメールアドレスは正規表現で表現することは不可能であると証明がされています。

とは言え、現実的に処理しないといけないことも多々あるので、簡易的なチェック用の正規表現をメモしておきます。

## 注意
あまり検証していないので、コピペせずに各自で検証をしてください。
基本的に自分メモ用の投稿なので(；´∀｀)

## メールアドレスのバリデーションチェック（簡易版）

```
/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i;
```
多相バリアントによる多相レコードの表現

## 多相バリアントについて

多相バリアントについては，

* [Chapter 4  Labels and variants 4.2  Polymorphic variants](http://caml.inria.fr/pub/docs/manual-ocaml/lablexamples.html#sec46)

あたりを読むとよいでしょう．(この記事では解説しません)．

## 多相レコードについて

多相レコードについては，

* [Chapter 7. SML#の拡張機能：レコード多相性 ](http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/2.0/ja/Ch7.xhtml)

を読むとよいでしょう．

## 多相レコードによる多相バリアントの表現について

多相レコードによる多相バリアントの表現については，

* [Chapter 7. SML#の拡張機能：レコード多相性 § 7.7. 多相バリアントの表現](http://www.pllab.riec.tohoku.ac.jp/smlsharp/docs/2.0/ja/Ch7.S7.xhtml)
* [多相レコードで多相バリアントを表現する](http://qiita.com/dico_leque/items/db4f48f29ff863f0eb3c)

などに，詳しく書かれております．

多相レコードで多相バリアントができるなら，多相バリアントで多相レコードもできるはず！
と，考えまして， OCaml の多相バリアントで多相レコードが実装できないか試しました．

<!--
## 多相レコードがなぜ必要か

たとえば，タプルと呼ばれるものにはいくつかありまして，ペアやトリプルがあります．
ペアというのは，要素数が2つのタプルでして，トリプルは，要素数が3つのタプルです．

```ocaml
let pair = (1, 'a')
let triple = (2, 'b', 3.14)
```

ところで， fst/snd という関数があります．これは，ペアから要素を取り出す関数です．

```ocaml
let pair = (1, 'a')
let elem1 = fst pair (* = 1 *)
let elem2 = snd pair (* = 2 *)
```

fst/snd は，トリプルに適用しても良さそうに見えます．

```ocaml
(* これはOCamlの型システムではNGだが，直感的にはOKに見える *)
let triple = (2, 'b', 3.14)
let elem1 = fst triple (* 2 を取り出したい *)
let elem2 = snd triple (* b を取り出したい *)
```

すると，トリプル用の fst/snd, さらに4タプルや5タプル用の fst/snd をすべて用意しないと
いけないことになってしまいます．

```ocaml
let fst3 (x,_,_) = x
let snd3 (_,x,_) = x
let fst4 (x,_,_,_) = x
let snd4 (_,x,_,_) = x
let fst5 (x,_,_,_,_) = x
let snd5 (_,x,_,_,_) = x
```

これでは悲しいです．

レコード多相性があれば，n-タプル(ただしn≧2)に適用できるfst/sndが定義できます．
-->

## 多相バリアントで多相レコード

結論としてはこうなります．

```ocaml
let id x = x
let pair x y = function `Fst f -> f x | `Snd f -> f y
let fst p = p (`Fst id)
let snd p = p (`Snd id)

let triple x y z = function `Fst f -> f x | `Snd f -> f y | `Third f -> f z
let third p = p (`Third id)

(* fst は pair/triple のどちらに対しても使える *)
let i = fst (pair 1 'a')
let j = fst (triple 2 'b' 3.14)
```

## 注意(追記)

OCaml には (Relaxed) Value Restriction があるので，ちゃんと使うには η expansion
する必要があります．

```ocaml
let id x = x
let pair x y = function `Fst f -> f x | `Snd f -> f y
let fst p = p (`Fst id)
let snd p = p (`Snd id)

let triple x y z = function `Fst f -> f x | `Snd f -> f y | `Third f -> f z
let third p = p (`Third id)

let p = fun x -> pair 1 'a' x
let i = fst p
let j = snd p
```

## 蛇足なこと

最初，ADTをオブジェクト指向言語におけるメッセージだと捉えて，次のような構造を考えました．

```ocaml
let pair x y = function `Fst -> x | `Snd -> y
let fst p = p `Fst
let snd p = p `Snd

let triple x y z = function `Fst -> x | `Snd -> y | `Third -> z
let third p = p `Third

(* fst は pair/triple のどちらに対しても使える *)
let i = fst (pair 1 2)
let j = fst (triple 2 3 4)
```

しかし，これだと， `pair x y` の x と y が同じ型でないといけないことになってしまいます．


```ocaml
let pair x y = function `Fst -> x | `Snd -> y
let fst p = p `Fst
let snd p = p `Snd

let triple x y z = function `Fst -> x | `Snd -> y | `Third -> z
let third p = p `Third

(* こういうペアはつくれない *)
let p = pair 1 'b'
```

そこで関数をひとつ噛ませるという工夫をしました．
ペアの定義は

```ocaml
let pair x y = function `Fst f -> f x | `Snd f -> f y
let fst p = p (`Fst id)
let snd p = p (`Snd id)
```

こうすることで，ペアのそれぞれが異なる型でもうまく動くようになりましたとさ．
swiftで書いたテストがXcodeで実行できない


iosのテストをswiftで実装しようと思ったら以下のようなエラーがでて実行できなくなった。


```
Test session exited(82) without checking in. Executable cannot be loaded for some other reason, such as a problem with a library it depends on or a code signature/entitlements mismatch.
```

KIFを使ったテストでこのエラーがでたが、他のテストライブラリでも同様の問題が発生しているらしい。

https://github.com/Quick/Quick/issues/141


`~/Library/Developer/Xcode/DerivedData` を削除すればよいとか、`UIKit`をインポートすればよいとか、cleanしてビルドすればよいとか色々な説があったが、自分の環境ではビルドターゲットを作り直したらうまくいった。


具体的には以下の手順

1. プロジェクトのTARGETSにあるテストのターゲット(xcodeが自動で生成したのであれば、`{ProjectName}Tests` )を削除
2. `Manage Schemes...`からこのターゲットのスキームを削除
3. ソースツリーから `{ProjectName}Tests` のディレクトリを削除
4. ターゲットの追加から`Cocoa Touch Testing Bundle`を追加。このときswiftを選ぶ
5. `New Scheme...`から新しくつくったターゲットのスキームをつくる
6. Bridging-Headerを設定
7. CocoaPodsをつかってるならupdate
8. 普通にswiftでテストをかく
Vagrantの仮想端末に立てたRailsサーバにホストからアクセスできなかった


起動時に bind する IP アドレスを指定しないと、localhost になって、その端末内でしかアクセスできないっぽい。

以下のように 0.0.0.0 で起動するとホストからアクセスできるようになる。

```
rails s --binding=0.0.0.0
```
xrdpにて前回切断時の状態から作業を続行する

## 前回の作業結果を継続したい場合

```bash:
tightvncserver -kill :2
tightvncserver :2 -geometry 1280x1024 -dpi 120
```

でvncserverを起動しておき、

```diff:/etc/xrdp/xrdp.ini
  [xrdp1]
  name=sesman-Xvnc
  lib=libvnc.so
- username=ask
- password=ask
+ password=vncserverで指定したパスワード
  ip=127.0.0.1
- port=-1
+ port=5902
```

とすると前回のVNCで切断時の状態を再表示出来る。
xrdpとはhtml5vncのようなものであり、X11rdpとは別物である。


## xrdpのメリット

* 接続元にはRDPクライアントがあればよい。
* VNCserverに対し、Macの画面共有から接続できないことがあるためxrdpを使う
* VNCやRDP接続先を集中管理できる

## メモ: X11rdpをインストールする方法

```bash:
git clone https://github.com/scarygliders/X11RDP-o-Matic.git
cd X11RDP-o-Matic
sudo ./X11rdp-o-matic.sh --justdoit
```

* /opt/X11rdp/ にインストールされる(確認中)
VimでSuperColliderを楽々操作

音響プログラミング環境SuperColliderのdefaultのeditorって超使いずらい。なんかいちいちmouseに手を伸ばさなきゃいけなくて、キーボードで完結しない。
なのでvimから操作できるようにしてみました。

これを使いました。
[https://github.com/sbl/scvim](https://github.com/sbl/scvim)
とてもいい感じです。
今のところWEBアプリケーション書いてる感じでSClang書けそうな感じがします。


##install

[NeoBundle](https://github.com/Shougo/neobundle.vim)を使っていれば、.vimrcに以下を追加して、.vimrcのリロードをするだけでplugin自体はinstallできます。

```vim:.vimrc
NeoBundle 'sbl/scvim'
```

Macであれば以下を実行ししてSuperColliderとこのpluginを結びつけます。（詳しいことはよくわかりません）

```shell-session
 ln -s ~/.vim/bundle/scvim/sc/SCVim.sc ~/Library/Application\ Support/SuperCollider/Extensions/SCVim.sc 
```
Extensionsディレクトリがない場合は、作って下さい。

SuperColliderの場所が以下であることを確認します。

```
/Applications/SuperCollider.app
```

自分の場合はなぜか、

```
/Applications/SuperCollider/SuperCollider.app
```

だったので移動させました。

これでinstallは完了です。

##server起動

まず.sc(d)という拡張子のファイルを開くなり作るなりしてvimを起動します。

```vim
:SClangStart
```

というコマンドをたたくと、ターミナルがもう一つ開いていつもPost Windowに表示されていた内容が出力されます！

今編集中のファイルに

```
s.boot;
```

と書き込みます。

そして、カーソルがこの行にある状態でF6キー押します。(MacってFnキーを押しながらじゃないとダメなんですね）
対象の行を実行するショートカットです。便利便利。

おお、server起動しました！

ちなみにF5キーはブラケット間のコードを実行してくれるようですね。最高！


##AutoCompletion作成



[公式README](https://github.com/sbl/scvim#using-it)だと`:SCTags`でtag生成してくれるって書いてるんですが、なぜか僕の環境だと`E492: Not an editor command: SCTags`になっちゃうので、以下をファイル内に記入し、

```
SCVim.generateTagsFile();
```

F6で実行しました。これで多分カレントディレクトリ以下のファイルからtagを作ってautocompletionを作成してくれます。

自分の場合は、自前のファイル群がなかったので、SCに最初についてくるexampleファイル群で実行しました。

```
/Applications/SuperCollider/examples
```

おお、Siっていれたら`SinOsc`ってサジェストしてくれました！

##音を出してみる

編集中のファイルに

```
{SinOsc.ar(440)}.play;
```

と書き、カーソルがこの行ある状態でF6を押します。

おお、なりました！

音止めるときは、F12でとまる！

##ヘルプを見る。
知りたい単語の上にカーソルがある状態で、K(shift+k)を押すと、おお、いつも見ているhelp画面が別Windowで立ち上がってくれてその単語のページを出してくれてます！

##まとめ

この感じだとメインで使っても良さそうなきがしています！



##参考
[https://github.com/sbl/scvim](https://github.com/sbl/scvim)
[Get started with MacVim and scvim](http://jeremah.co.uk/blog/permalink/get_started_with_macvim_and_scvim)
Cocos2d-x 3系で Android の NDKビルドをパラレルに行ってビルド時間を短縮する

以前こちらの記事にて2系の場合のやり方を書きました。
http://qiita.com/d_nishiyama85/items/945365ad6385c0f81f9f

Cocos2d-x 3系では上の記事では対応できないので今回改めて書いてみます。動作確認は 3.2 で行なっています。

## やりたいこと
要はC++のソースをコンパイルするコマンドである、ndk-build に並列するプロセスの数を `nkd-build -j 7` のようにオプションとして渡せればよい、というお話です。なお、指定する数をマシンのコア数以上にしてしまうとコンパイルに全てのCPUリソースを使ってしまうため、マシンがかなり重くなってしまい、OSの操作自体もやりにくくなってしまいます。指定する数は最大でも (コア数 - 1) がオススメです。

## cocos コマンドの場合
Cocos2d-x の3系において Android のビルドはコマンドラインでは `cocos` コマンドで行うと思います：

```shell-session
cocos compile -p android
```

この`cocos`コマンドには、使っているマシンのCPUのコア数を取得してこのオプションを自動的に追加する機能が組み込まれているのですが、 python の外部ライブラリ numpy に依存しているため、必ずしも動くとは限りません。
わたしの環境 (OSX, Mavericks)では numpy が入っていなかったのでコア数を取得できず、1プロセスでのコンパイルになっていまいました。

![cocos_compile_1.png](https://qiita-image-store.s3.amazonaws.com/0/28313/12dabbc6-29c4-13a9-8aa8-94c1ea3e682e.png)

対策として、numpy をインストールすればいいのですが、諸事情でできない or したくない、という人は以下のようにしましょう。

## 並列数をオプションとして明示的に渡す
`cocos compile -h` でヘルプを見ると、`-j N` または `--jobs N` (Nは数値）で並列数を渡すことができる事がわかります：

![cocos_compile.png](https://qiita-image-store.s3.amazonaws.com/0/28313/eaa909a1-cec4-8040-ca6d-7b54ce0b3bed.png)

これで numpy がなくても並列ビルドをしてくれます：

```shell-session

cocos compile -p android -j 7
```

![ndk_build_j7.png](https://qiita-image-store.s3.amazonaws.com/0/28313/237dceb6-abdf-a04a-ae9d-0805c6e34216.png)

## Eclipse の場合
Eclipse の実行ボタンでビルドする場合には `cocos` コマンドとは別のビルドスクリプトが使われます。
Eclipse のプロジェクトを右クリック → プロパティー → C/C++ ビルド → ビルダー設定 にビルドコマンドが書いてあります：

![eclipse_build.png](https://qiita-image-store.s3.amazonaws.com/0/28313/4b12de9a-909c-840d-aacf-a020834ce3e8.png)

これを見ると、proj.android のは以下にある build_native.py というスクリプトが使われるようです。
このスクリプトのヘルプを見ると、`-n` というオプションに続けて書けば `ndk-build` にオプションを渡せるようです：

![build_native_help.png](https://qiita-image-store.s3.amazonaws.com/0/28313/7c4e75c0-b2be-de16-e950-5636f4f1c0f8.png)

したがって、Eclipse のビルドコマンドの設定に `-n -j7` などと追加すればよいことになります。（Eclipseのスクリーンショット参照）

```shell-session

python ${ProjDirPath}/build_native.py -b debug -n -j7
```
追記： build_native.py のオプションに関しては -j と 7 の間にスペースを入れると 7 が認識されず、プロセスが無限に生成されてビルドが暴走する、という状況になっていました。修正します。
CentOSへapacheをソースからインストール

apacheのインストールから設定まで重要だと思った項目を備忘録としてメモ

## 環境構築

- CentOS6.5
- minimal インストール

## apache インストール(ソースから)
make,gcc がインストールされているか確認

```
$ sudo yum list installed gcc make
Installed Packages
gcc.x86_64         4.4.7-4.el6          @base                                   
make.x86_64        1:3.81-20.el6        @anaconda-CentOS-201311272149.x86_64/6.5
```
インストールされていなければ以下でインストール
`$ sudo yum -y install gcc make`

apr(apache portable runtime)ライブラリをダウンロード
これがないと./configure時にエラーになってしまう。

```bash
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-1.5.1.tar.gz
$ tar xvzf apr-1.5.1.tar.gz
$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//apr/apr-util-1.5.4.tar.gz
$ tar xvzf apr-util-1.5.4.tar.gz
```

PERL 5 regular expression pattern matching インストール
こちらもコンパイルに使用

```
$ wget wget http://sourceforge.net/projects/pcre/files/pcre/8.36/pcre-8.36.tar.gz/download
$ tar xvzf pcre-8.31.tar.gz
$ cd pcre-8.31
$ ./configure
$ make
$ sudo make install
```

ソースファイルダウンロード => 解凍 => ライブラリファイル配置 => コンパイル => インストール

```bash
$ wget http://ftp.riken.jp/net/apache//httpd/httpd-2.4.12.tar.gz
$ tar xvzf httpd-2.4.12.tar.gz
$ mv apr-1.5.1 ./httpd-2.4.12/srclib/
$ mv apr-util-1.5.4 ./httpd-2.4.12/srclib/
$ cd ./httpd-2.4.12/srclib/
$ mv apr-1.5.1 apr
$ mv apr-util-1.5.4 apr-util
$ cd ../
$ ./configure --prefix=/usr/local/httpd
$ make
$ sudo make install
```
ここから先、起動と設定ファイルに関しては、後日追記予定
fluentdの基本的な設定

概要
----

CentOS上にfluentdをインストールしてログを収集するまでの作業メモです。

手順
----

### インストール

下記のファイルを作成します。

```:/etc/yum.repos.d/td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
```

その後yumでインストールします。

```
$ sudo yum -y install td-agent
$ ls -la /etc/td-agent/
合計 24
drwxr-xr-x   4 root root 4096  3月  7 10:21 2015 .
drwxr-xr-x. 75 root root 4096  3月  7 10:21 2015 ..
drwxr-xr-x   2 root root 4096  3月  7 10:20 2015 logrotate.d
drwxr-xr-x   2 root root 4096  3月  7 10:20 2015 prelink.conf.d
-rw-r--r--   1 root root 1982  3月  7 10:21 2015 td-agent.conf
-rw-r--r--   1 root root 1982 10月 20 17:30 2014 td-agent.conf.tmpl
```

こんな感じで起動できます。

```
$ sudo /etc/init.d/td-agent start
```

### td-agen.confの設定

まず手始めに下記のような形式のログを想定します。

```
例）
2015-03-07T10:58:09+09:00 DEBUG - <1425693488.4702> XxxController:xxx start
```

このログを例えば下記のように構造化したいと思います。

```
<datetime> <severity> - <id> <body>
```

その時のtd-agent.confの設定は下記のような感じになります。

```:/etc/td-agent/td-agent.conf
<source>
  type tail
  format /^(?<datetime>[^ ]*) (?<severity>[^ ]*) - (?<id>[^ ]*) (?<body>.*)$/
  path /tmp/cid_logs/deals.log
  tag any.app.log
</source>

<match any.app.log>
  type copy
  <store>
    type file
    path /tmp/cid_logs/deals.any.log
  </store>
</match>
```

すると下記のような感じで\<store\>指定に従って別のログファイルを出力する事ができます。この\<store\>でストリームの処理がどうなっているかデバッグ的に確認すると作業がやりやすいかも。

fluentdで吐き出したログの内容は下記のようになっています。

```
2015-03-07T11:10:48+09:00	any.app.log	{"datetime":"2015-03-07T11:10:48+09:00","severity":"DEBUG","pid":"<1425694247.8577>","app-log-body":"XxxController::xxx start"}
```

なお、td-agent自体のログは/var/log/td-agent/td-agent.logにあり、こちらを確認しながら動作検証すると良いと思います。
InitializeOnLoadのメソッド版！ - InitializeOnLoadMethod


* [InitializeOnLoadMethod](http://docs.unity3d.com/ScriptReference/InitializeOnLoadMethodAttribute.html)



# InitializeOnLoad と InitializeOnLoadMethod

InitializeOnLoad の使い方はクラスに付けて使う方法でした。

```cs
using UnityEngine;
using UnityEditor;

[InitializeOnLoad]
public class NewBehaviourScript
{
	static NewBehaviourScript ()
	{
		Debug.Log("スクリプトコンパイル後に呼び出される");
	}
}
```

これのメソッド版になります。

```cs
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript
{
	[InitializeOnLoadMethod]
	static void Hoge ()
	{
		Debug.Log ("スクリプトコンパイル後に呼び出される");
	}
}
```

## ランタイム版の RuntimeInitializeOnLoadMethod もあるよ

ゲーム再生直後に呼び出される RuntimeInitializeOnLoadMethod もあります。

```cs
using UnityEngine;
using UnityEditor;

public class NewBehaviourScript
{
	[RuntimeInitializeOnLoadMethod]
	static void Hoge ()
	{
		Debug.Log ("ゲーム再生直後に呼び出される");
	}
}
```
mikutterコンソールから特定のユーザのフォロワーを一括ブロック

最近スパムアカウント同士でフォローしあってフォロワー数を稼ぎ，通常のアカウントであるかのように装ってフォローを仕掛けてくるスパムアカウントがいるのでやってみた．

mikutterコンソールを開いて以下を入力，Ctrl+Enterで実行．

```rb
Service.primary.followers(screen_name: "ユーザ名").next { |users|
	users.each { |user|
		(Service.primary.twitter/:blocks/:create).json(screen_name: user.idname)
		# puts "blocked: " + user.idname
	}
}
```
AndroidのCIはDockerでビルドするのが楽

追記: 実際に運用する際はライセンスにご注意ください: [公開用DockerイメージにAndroid SDKを含めるのはライセンス違反という話 - Islands in the byte stream](http://gfx.hatenablog.com/entry/2016/06/21/112404)

## 三行まとめ

* 社内のJenkins環境 / Travis-CI / Circle-CI など、CIサービスごとにビルド設定を調べるのにうんざりしたのでDockerizeしてみた
* 手元とCI環境がまったく同じになるので一度動くようになったら安定して動かせるはず
* とりあえずCircle-CIで試して動いた

## 前提

OSXの場合、boot2dockerとdockerをhomebrewで入れましょう。boot2dockerはdockerを動かすためのVMとLinuxイメージを適当に整えてくれるやつです。

```
brew install Caskroom/cask/virtualbox # まだ入れてなければ
brew install boot2docker docker
boot2docker init
boot2docker shellinit >> ~/.zshrc # 適当
boot2docker start
```

## Dockerfile

[Dockerfile](https://github.com/gfx/Android-Helium/blob/master/Dockerfile) はこんな感じ。[samtstern/android-sdk](https://registry.hub.docker.com/u/samtstern/android-sdk/dockerfile/) をベースにした [gfx2015/android](https://github.com/gfx/docker-android-project) を使っていて、これはJDK８ベースなandroid project設定です。

アプリ固有の設定としては、projectをCOPYしてビルドするだけ。

これで手元でもCircle−CIでもビルドできて、実際のビルド結果の実例は以下のようになります。

* https://circleci.com/gh/gfx/Android-Helium/60

ビルドとテストをしているだけで、成果物の取得はまだしていませんが、だいたいこんな感じでいけそうですね。

## ハマりどころ

* `FROM samtstern/android-sdk` にしたらJDK 7で、JDK 8に依存しているgradle pluginが動かなかったので利用できず
  * samtstern/android-sdk をベースにしたDockerfileを作ることにした
* android-sdk-linux archiveの展開がそのままではうまくいかなかった
  * Circle-CIでだけ `tar: android-sdk-linux: Cannot change ownership to uid 144773, gid 5000: Invalid argument` というエラーが出る
  * `tar --no-same-owner` でとりあえず解決
* `WORKDIR /project` しているにもかかわらず `COPY . .` がうまく動かず、`/` にコピーされてしまった
  * `COPY . /project` にして解決
Unity5でpublicになったDefaultAsset


Unity4時代にエディター拡張をしている方は`UnityEngine.DefaultAsset`というTypeを見た方がいらっしゃると思います。タイミング的には「UnityEngine.Object」のカスタムエディターを作成するときとか。

![ss_2015-03-08_16_47_58.png](https://qiita-image-store.s3.amazonaws.com/0/5549/4f4dcc06-b1fb-de58-3530-b89933041d50.png "ss_2015-03-08_16_47_58.png")

ですが `UnityEngine.DefaultAsset` は internal であるため触ることが出来ませんでした。

## DefaultAssetがエディターAPIに移動した

DefaultAsset のクラスが `UnityEditor.DefaultAsset` として public になり触れるようになりました。

## フォルダーとシーンのカスタムエディターを作成してみる

![BpAyKMtECK.gif](https://qiita-image-store.s3.amazonaws.com/0/5549/b543f2d3-5e35-6f30-62ed-81dce82ffad0.gif "BpAyKMtECK.gif")


```cs:DefaultAssetInspector.cs
using UnityEngine;
using UnityEditor;
using System.IO;

[CustomEditor(typeof(DefaultAsset))]
public class DefaultAssetInspector : Editor
{
	Editor editor;

	public override void OnInspectorGUI ()
	{
		// DefaultAsset の GUI はデフォルトで無効になっているので有効にする
		GUI.enabled = true;

		var assetPath = AssetDatabase.GetAssetPath (target);

		if (AssetDatabase.IsValidFolder (assetPath)) {
			Editor.CreateCachedEditor (target, typeof(FolderInspector), ref editor);
		} else if (IsSceneAsset (assetPath)) {
			Editor.CreateCachedEditor (target, typeof(SceneInspector), ref editor);
		} else {
			// いらないかも
			base.OnInspectorGUI ();
		}

		if (editor) {
			editor.OnInspectorGUI ();
		}
	}

	private bool IsSceneAsset (string assetPath)
	{
		return Path.GetExtension (assetPath) == ".unity";
	}
}
```

```cs:FolderInspector.cs
using UnityEngine;
using UnityEditor;

public class FolderInspector : Editor
{
	public override void OnInspectorGUI ()
	{
		EditorGUILayout.LabelField ("フォルダーだよ！");
	}
}
```

```cs:SceneInspector.cs
using UnityEngine;
using UnityEditor;

public class SceneInspector : Editor
{
	public override void OnInspectorGUI ()
	{
		EditorGUILayout.LabelField ("シーンだよ！");
	}
}
```

コードの中で使った `Editor.CreateCachedEditor` 地味に便利ですね！
ActiveAdmin の actions のボタンをカスタマイズする

# はじめに
ActiveAdmin で管理画面を実装すると、各モデルの CRUD を簡単に用意できるが、
特定の条件の時には、リソースを削除させたくないといった場合には対応できなかったので、
自前でデフォルトのボタンのように実装した際のメモです。

ページ生成後の html と、gem のソースを読んで調べてみました。

# actions とは
ActiveAdmin で各リソース毎に CRUD のどの操作を行えるかを定義でき、
新規作成、一覧、更新のページでは、画面に沿った各種ボタンをを出力する

用意されている action 一覧

|アクション名|詳細|
|----|:----|
|:index|一覧画面|
|:show|詳細画面|
|:new|作成画面|
|:create|作成権限|
|:edit|編集画面|
|:update|更新権限|
|:destroy|削除権限|

下記のように書くと、使用できる権限が、一覧表示、更新のみに限られる

```rb
actions :all, except: [:new, :create, :destroy]
```

# サンプルコード
### 実装内容
User モデルの一覧ページで、User の role が admin の場合のみに削除ボタンを非表示するサンプル

```rb:app/models/user.rb
class User < ActiveRecord::Base
  extend Enumerize
  enumerize :role, in: { user: 1, admin: 2 }, default: :user, predicates: true, scope: true

  validates :email, :name, :address, presence: true
end
```
```rb:app/admin/user.rb
ActiveAdmin.register User do

  index do
    column :id
    column :name
    column :email

    actions defaults: false do |user|
      item I18n.t('active_admin.view'), admin_user_path(user), class: 'view_link member_link'
      item I18n.t('active_admin.edit'), edit_admin_user_path(user), class: 'edit_link member_link'
      item I18n.t('active_admin.delete'), admin_user_path(user), class: 'delete_link member_link', method: :delete, data: { confirm: I18n.t('active_admin.delete_confirmation') } unless user.admin?
    end
  end

  # 詳細
  show do
    default_main_content
  end

  # 作成/編集
  form do |f|
    inputs do
      input :name
      input :email
    end

    actions
  end

  permit_params :email, :name
end
```

### サンプルコードの説明
`actions` に `defalts: false` を指定して、デフォルトで生成されるボタンを生成しないようしてます。
これを指定しないと、デフォで生成されるボタンと自前で作成したボタンとが合わせて表示されてしまいます。

`item` は実装するボタン毎に追加し、最初の引数 `I18n.t('active_admin.view')` 等については、各ボタンで使用されている I18n の辞書ファイルを参照して生成されるリンクの文字列を指定し、次に、`path` を記載します。
`path` については、`ActiveAdmin` で リソースファイル(`app/admin/user.rb` 等)を作成すると自動で `path` が追加され、
その `helper` を記載します。

`user` リソースを追加すると下記 `path` が自動的に追加される

| Helper | HTTP Verb | Path | Controller#Action |
|----|----|----|----|
|batch_action_admin_users_path|POST|/admin/users/batch_action(.:format)|admin/users#batch_action|
|admin_users_path|GET|/admin/users(.:format)|admin/users#index|
||POST|/admin/users(.:format)|admin/users#create|
|new_admin_user_path|GET|/admin/users/new(.:format)|admin/users#new|
|edit_admin_user_path|GET|/admin/users/:id/edit(.:format)|admin/users#edit|
|admin_user_path|GET|/admin/users/:id(.:format)|admin/users#show|
||PATCH|/admin/users/:id(.:format)|admin/users#update|
||PUT|/admin/users/:id(.:format)|admin/users#update|
||DELETE|/admin/users/:id(.:format)|admin/users#destroy|

※ `config/initializers/active_admin.rb` で `config.namespace` を変更していると、`admin` の部分が変更した `namespace` に変わります。

あとは、css 用に class を追加してしてます。これを指定しないしないと表示が崩れてしまうので、必須。
また、最後の削除ボタンについては、自動で生成されるものには、削除の confirm がでますので、合わせて記載し、
role が admin のものを削除できないよう unless で条件を追加することで表示/非表示を制御しました。
Mac OSX YosemiteにnokogiriをインストールするにはARCHFLAGSの指定が必要

brewで必要なライブラリを入れてそれらを使ってnokogiriをインストールする。
gem install nokogiriでハマったのでメモ。

#### バージョン
OS X Yosemite 10.10.2
ruby 2.0.0p481
gem 2.4.6
Bundler version 1.7.6
Homebrew 0.9.5
xcode-select version 2339

### 必要なツール類をインストール
#### x-codeのcliインストール
```
xcode-select --install
```

##### homebrewで必要なライブラリをインストール
インストール後にlinkを再作成。

```
$ sudo brew tap homebrew/dupes
$ sudo brew install libxml2 libxslt libiconv
$ sudo brew unlink --force libxml2 && sudo brew link --force libxml2
$ sudo brew unlink --force libxslt && sudo brew link --force libxslt
$ sudo brew unlink --force libiconv && sudo brew link --force libiconv
```

#### gemでnokogiriをインストール
ARCHFLAGSを指定して内部ライブラリを使ってnokogiriをインストールすると無事成功。
現在最新の1.6.6.2は入らなかったので1.5.11を使う。

```
$ sudo ARCHFLAGS="-arch x86_64"  gem install nokogiri -v 1.5.11  -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"

Building native extensions with: '--use-system-libraries --with-iconv-dir=/usr/local/opt/libiconv --with-xml2-config=/usr/local/opt/libxml2/bin/xml2-config --with-xslt-config=/usr/local/opt/libxslt/bin/xslt-config'
This could take a while...
Successfully installed nokogiri-1.5.11
1 gem installed
```

#### エラーの例
libxml2が読み込めない。他にもiconvが読み込めない場合もある。

```
sudo gem install nokogiri  -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml
2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
Building native extensions with: '--use-system-libraries --with-iconv-dir=/usr/local/opt/libiconv --with-xml2-config=/usr/local/opt/libxml2/bin/xml2-config --with-xslt-
config=/usr/local/opt/libxslt/bin/xslt-config'
This could take a while...
ERROR:  Error installing nokogiri:
        ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby -r ./siteconf20150308-3032-wc2kc7.rb extconf.rb --use-system-libraries --with-iconv-dir=/usr/loc
al/opt/libiconv --with-xml2-config=/usr/local/opt/libxml2/bin/xml2-config --with-xslt-config=/usr/local/opt/libxslt/bin/xslt-config
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using system libraries.
libxml2 version 2.6.21 or later is required!
```

### 補足
ちょっと古そうだけどbundlerの設定を書き換えるスクリプトを見つけた。
[Mac fix - Install Nokogiri gem on OS X 10.9 Mavericks](https://gist.github.com/SteveBenner/de51738222e92d606487)
読み込んでおけば上の```--use-system-libraries```以降のオプションは不要。

```
$ curl -k https://gist.githubusercontent.com/SteveBenner/de51738222e92d606487/raw/7cd7c552894b86895189189bd340bdc6e7f68ddb/macfix1-install-nokogiri.rb|sudo ruby
```
また```NOKOGIRI_USE_SYSTEM_LIBRARIES=1```をセットしてgem installをしているドキュメントもあるのでもし動かなければお試しください。
Metalsmithにて、Markdownをhandlebarsでビルドする

#Metalsmith
EVERYTHING IS A PLUGINという思想の元に作られた静的サイトジェネレーター(static site generator)。
githubのリポジトリ：https://github.com/segmentio/metalsmith

# やりたいこと
下記みたいに、markdown × handlebars(JSテンプレート)をやりたい。

```index.md
# {{title}}

{{#each sections}}
## {{this.title}}
{{this.description}}
{{/each}}

{{#each lists}}
* {{this}}
{{/each}}
```

# やり方
サンプル(ソース)：[maruLoop/metalsmith-inplace-example](https://github.com/maruLoop/metalsmith-inplace-example)
実物：http://maruloop.github.io/metalsmith-inplace-example/build/

## 全体の流れ

1. metalsmith-in-placeを使って、src/*.mdをhandlebarsでビルドする
1. metalsmith-markdownを使って、markdownをパース
1. metalsmith-layoutsを使って、buildディレクトリ以下に生成

## 使うmetalsmithプラグイン
|plugin|説明|
|---|---|
|[superwolff/metalsmith-in-place](https://github.com/superwolff/metalsmith-in-place)|YAML Front-MatterのJSONを使って、Markdownをビルド|
|[segmentio/metalsmith-markdown](https://github.com/segmentio/metalsmith-markdown)|Markdownをパース|
|[superwolff/metalsmith-layouts](https://github.com/superwolff/metalsmith-layouts)|HTMLのテンプレートと合わせて、buildディレクトリに生成物を作る|

## package.json

```package.json
{
  "devDependencies": {
    "handlebars": "^3.0.0",
    "metalsmith": "^1.3.0",
    "metalsmith-in-place": "^1.0.1",
    "metalsmith-layouts": "^1.0.0",
    "metalsmith-markdown": "^0.2.1"
  },
  "private": true,
  "name": "static-site-in-place-example"
}
```

## metalsmith.json

```metalsmith.json
{
  "metadata": {
    "title": "My Blog",
    "description": "My second, super-cool blog."
  },
  "plugins": {
    "metalsmith-in-place": {
      "engine": "handlebars"
    },
    "metalsmith-markdown": {},
    "metalsmith-layouts": {
      "engine": "handlebars"
    }
  }
}
```

## src/*.md

```src/*.md
---
{
  "template": "index.html",
  "title": "My Page Title",
  "lists": [
    "oh",
    "yeah"
  ],
  "sections":[
    {
      "title": "secition 1",
      "description": "sec1 sec1 sec1"
    },
    {
      "title": "secition 2",
       "description": "sec2 sec2 sec"
    }
  ]
}
---
# {{title}}

{{#each sections}}
## {{this.title}}
{{this.description}}
{{/each}}

{{#each lists}}
* {{this}}
{{/each}}
```

## テンプレート
※HTMLにビルドされたmarkdownは、contentsフィールドに格納されている

```template.html
<html>
<head>
    <title>{{ title }}</title>
    <meta name="description" content="{{ description }}">
</head>
<body>
{{{contents}}}
</body>
</html>
```

#備考
metalsmith-in-placeとmetalsmith-layoutsは、metalsmith-templatesから分離したもの。
詳細：[Process templating syntax in content files as well · Issue #35 · segmentio/metalsmith-templates](https://github.com/segmentio/metalsmith-templates/issues/35)
AndroidStudioで未使用のresourceを検出する

Android開発を進めていくと、昔作ったけど使われなくなったcolorsやstringsがちらほら出てきて整理したくなります。
しかしresourceの場合はJavaコードと違って使われていないところがLowLightにならないので、ファイルを見るだけではわかりません。nameで1つずつファイル検索して使われているか確認するのも面倒です。

そこで、AndroidStudioの `Analyze > Inspect Code` を使います。

# Analyze > Inspect Code
`Inspect Code`を実行すると、開いているプロジェクト内のコードを色々検査してくれます。
大きなプロジェクトの場合は結構時間かかるので、対象範囲のスコープをなるべく小さくする方がよいです。

![Specify_Inspection_Scope.png](https://qiita-image-store.s3.amazonaws.com/0/15267/80aaeab6-ef43-95b3-760c-285334f77e0f.png "Specify_Inspection_Scope.png")

# Unused resourcesをチェック
実行が終わると、Inspection結果が表示されます。
その中の `Android Lint > Unused resources` をチェックしましょう。

![values_strings_xml_-__app__-_whovoice-android_-____work_whovoice-android_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/8ede0a48-0631-d816-08fa-05d5d8fcff6c.png "values_strings_xml_-__app__-_whovoice-android_-____work_whovoice-android_.png")

使われていないdrawableやstringsなどが一覧で表示されているはずです。
あとは、該当のファイルや要素を消すだけです。

# 無視したい時は
後々使うから残しておきたい時は、Lintの対象から外しておけばよいです。
右クリックして、対象の要素に`tools:ignore="UnusedResources"`を追加してあげるだけです。
![values_strings_xml_-__app__-_whovoice-android_-____work_whovoice-android_.png](https://qiita-image-store.s3.amazonaws.com/0/15267/650b3dac-b37d-374d-ce2b-aeca8a18d64b.png "values_strings_xml_-__app__-_whovoice-android_-____work_whovoice-android_.png")

こんな感じになります。

```xml
<dimen name="text_toolbar_title"
    tools:ignore="UnusedResources">20sp</dimen>
```

# Inspect Codeの補足
Inspect Codeで実行する内容は、設定の `Inspections`で変更できます。

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/15267/558f5d1d-c1a2-0465-d3a3-12381ae7abfd.png "Preferences.png")

#まとめて消すツール
大量に出てきていちいち消すのめんどくさいので一括で削除したい場合は、こちらの記事のツールがとても便利そうです。
[Android開発してて不要なresourceを削除したい](http://qiita.com/stenpel/items/524d74b3fe4c725282ad#comment-c19bff4f256eb9334a7b)
[gulp] html のローカルへの静的ファイルの参照を外部への参照に書き換える

静的ファイルは開発時はローカルからの配信を参照、プロダクションでは CDN や独自の配信サーバからの参照に切り替えることがある。テンプレートエンジンのヘルパーなどでも対応できるが、静的ページなどのことも考えるとどうせ html の minify などもやることになるのでそこでやってしまうのが手っ取り早い。

`gulp-cdnizer` を使って標準の CDN の URL を設定することでお好みの配信サーバの参照に書き換えることができる。

```javascript:gulpfile.js
gulp.task("cdnizer", function () {
    return gulp.src("app/**/*.html")
        .pipe($.cdnizer({
            defaultCDNBase: "//static.tiqav.com",
            files: ["**/*.{css,js,gif,png,jpg,jpeg}"]
        }))
        .pipe(gulp.dest("dist"));
});
```

- https://www.npmjs.com/package/gulp-cdnizer

```html:app/index.html
<!doctype html>
<html>
    <head>
        <link rel="stylesheet" href="styles/vendor.css" />
    </head>
    <body></body>
</html>
```

`cdnizer` タスク実行前はローカルを参照している。

```html:dist/index.html
<!doctype html>
<html>
    <head>
        <link rel="stylesheet" href="//static.tiqav.com/styles/vendor.css" />
    </head>
    <body></body>
</html>
```

実行後は独自の配信サーバの参照に書き換えられている。
LocalForwardしたポートにIPアドレスで接続


以下のように設定すると、localhost:3000 でリモートマシンの 3000 ポートに接続できるが、その端末の IPアドレス:3000 で外部からはアクセスできない。

```~/.ssh/config
Host hoge
	LocalForward 3000 xxx.xxx.xxx.xxx:3000
```

ポートフォーワードしたマシンのそのポートにアクセスするには

```~/.ssh/config
Host hoge
	LocalForward IPアドレス:3000 xxx.xxx.xxx.xxx:3000
```

のように設定する
Spinner のドロップダウンメニューだけデザインを変える

知らなかったので、メモ。

要約としては、`ArrayAdapter#setDropDownViewResource()`というのがあり、それにドロップダウン用のレイアウトをあててやるとよい。


```java:SampleActivity.java

//onCreate内
//Spinner
mSpinner = (Spinner)findViewById(R.id.spinner);
ArrayAdapter arrayAdapter = ArrayAdapter.createFromResource(this, R.array.option_mode, R.layout.spinner_layout);
//SpinnerAdapterにはsetDropDownViewResourceというメソッドが無いので、ArrayAdapterにする
arrayAdapter.setDropDownViewResource(R.layout.spinner_dropdown_layout);
mSpinner.setAdapter(arrayAdapter);
```

```xml:spinner_layout
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
                 android:id="@+id/text1"
                 android:singleLine="true"
                 android:layout_width="match_parent"
                 android:layout_height="32dp"
                 android:layout_marginLeft="5dp"
                 android:paddingLeft="10dp"
                 android:textColor="@color/text_color_white"
                 android:textSize="@dimen/text_18sp"
                 android:background="@color/main_color"
                 />

```


```xml:spinner_dropdown_layout.xml
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/text1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textColor="@color/text_color_normal"
          android:padding="10dp"
          android:textSize="@dimen/text_18sp"
          android:background="@color/background_color_white"
    />
```
こんな具合になります。

![スクリーンショット 2015-03-07 23.49.31.png](https://qiita-image-store.s3.amazonaws.com/0/39433/70f30a06-3938-ef57-d5b0-95b20121c5df.png)
[JavaScript] goto 文の実装例

なんか JavaScript で goto 文を実装した、みたいな記事を見かけたので、自分バージョンを書いてみた。

![goto文.jpg](https://qiita-image-store.s3.amazonaws.com/0/16128/61a7326b-3727-7b9b-6bf3-a258eb17fbba.jpeg)

C言語の例は以下の通り。

```c:c言語によるgoto文の例
    printf("init\n");

start:
    printf("start\n");
    goto next;

skip:
    printf("skip\n");

next:
    printf("next\n");

    printf("exit\n");
```

JavaScript言語で書いてみた。

```js:JavaScript言語によるgoto文の様に書いてみた例
var target;

target: for (;;) switch (target) {

  case undefined:
    console.log('init');

  case 'start':
    console.log('start');

    // goto next;
    target = 'next';
    continue target;

  case 'skip':
    console.log('skip');

  case 'next':
    console.log('next');

  default:
    break target;

}

console.log('exit');
```

変数は `goto` 文の行き先を示す `target` という名前の変数1つだけ。
変数を宣言しただけだと初期値は `undefined` だ。
後は `continue target;` する前に行き先のラベルを文字列で格納するだけ。

`target:` と `continue target;` と `break target;` の
`target` 部分はブロックラベルなので予約語以外ならなんでもいい。
変数名とラベル名は区別されているみたいですね。

`for (;;)` は `while (true)` や `while (1)` でもOK。
でも `for (;;)` は forever って読めるので無限ループっぽくて好きだ。

`default: break target;` を間違えて `default: break;` と
書いちゃうと、ループから抜けられなくて死ぬよ。

P.S.
書いてみたけど役に立つことはなさそう。
MenuItem にチェックを入れる Menu クラス


[Menu.GetChecked](http://docs.unity3d.com/500/Documentation/ScriptReference/Menu.GetChecked.html) と [Menu.SetChecked](http://docs.unity3d.com/500/Documentation/ScriptReference/Menu.SetChecked.html) を使用することでメニュー項目にチェックを入れることが出来ます。

![ss10.png](https://qiita-image-store.s3.amazonaws.com/0/5549/c6a4f043-95bb-75af-5be4-ea9d2671b0ac.png "ss10.png")


```cs
// オン/オフ を行うサンプル
using UnityEditor;
public class NewBehaviourScript
{
    [MenuItem("CustomMenu/Example")]
    static void Example ()
    {
	    var menuPath = "CustomMenu/Example";
		var @checked = Menu.GetChecked (menuPath);
		Menu.SetChecked (menuPath, !@checked);
	} 
}
```

これで、「オン/オフ」を表現するメニュー項目が作成しやすくなりますね。
UnityEditor.AnimatedValues



Lerp関数のラッパーのようなもの。以下の４つが用意されています。

* [AnimBool](http://docs.unity3d.com/ja/current/ScriptReference/AnimatedValues.AnimBool.html)
* [AnimFloat](http://docs.unity3d.com/ja/current/ScriptReference/AnimatedValues.AnimFloat.html)
* [AnimQuaternion](http://docs.unity3d.com/ja/current/ScriptReference/AnimatedValues.AnimQuaternion.html)
* [AnimVector3](http://docs.unity3d.com/ja/current/ScriptReference/AnimatedValues.AnimVector3.html)


## AnimFloatを使ってみる

![NmcQxkHY5s.gif](https://qiita-image-store.s3.amazonaws.com/0/5549/5dfc33d7-8d7b-176a-9b94-c9e503a729dd.gif "NmcQxkHY5s.gif")

```cs
using UnityEngine;
using UnityEditor;
using UnityEditor.AnimatedValues;

public class NewBehaviourScript : EditorWindow
{
	//初期化
	AnimFloat animFloat = new AnimFloat (0);

	void OnGUI ()
	{
		if (GUILayout.Button ("Start")) {
			// 初期化。 valueが変更されるたびにコールバックが呼ばれる。
			animFloat = new AnimFloat (0, () => {
				// EditorWindowを再描画
				Repaint();
			});

			// 目標値
			animFloat.target = 1;

			// Leap のスピード
			animFloat.speed = 1;
		}

		EditorGUILayout.LabelField ("value: " + animFloat.value);
	}
	
	[MenuItem("Window/Example")]
	static void Open ()
	{
		GetWindow<NewBehaviourScript> ();
	}
}
```

GUI にある Fade で使うと便利かも。
vagrant up時に"uninitialized constant Vagrant::Action::Builtin::MixinSyncedFolders"エラー


## 前提
* Vagrantのバージョン: 1.7.2

## 発生した問題
`vagrant up`コマンドを実行した際に以下のエラーが発生し、仮想マシンが起動できない。

```shell
$ vagrant up
Vagrant failed to initialize at a very early stage:

The plugins failed to load properly. The error message given is
shown below.

uninitialized constant Vagrant::Action::Builtin::MixinSyncedFolders
```

## 原因
既にDeprecatedなvagrant-windowsプラグインがインストールされていたことが原因。Vagrant 1.6+からWindowsをネイティブサポートしてくれるようになったので、このプラグインは不要。

## 対処

vagrant-windowsプラグインをアンインストールする。

```
$ vagrant plugin uninstall vagrant-windows
```

## 参考
* [vagrant up (1.7.2) fails with "Vagrant failed to initialize at a very early stage: The plugins failed to load properly. The error message given is shown below. uninitialized constant Vagrant::Action::Builtin::MixinSyncedFolders" · Issue #5149 · mitchellh/vagrant](https://github.com/mitchellh/vagrant/issues/5149)
[gulp] 自動で main-bower-files から Sass ファイルをインポートする

bower で管理する Sass ファイルを手動でインポートするのはパッケージが増えてくると面倒なので自動化する。

- https://github.com/gulpjs/gulp
- https://github.com/dlmanning/gulp-sass
- https://github.com/ck86/main-bower-files
- https://github.com/klei/gulp-inject

## gulpfile.js

```javascript:gulpfile.js
"use strict";

var gulp = require("gulp"),
    mainBowerFiles = require("main-bower-files");

var $ = require("gulp-load-plugins")();

// inject Scss files in bower components to vendor.scss
gulp.task("inject-bower-scss", function () {
    return gulp.src("app/styles/vendor.scss")
        .pipe(
            $.inject(
                gulp.src(mainBowerFiles({filter: "**/*.scss"}), {base: "bower_components", read: false}),
                {
                    starttag: "// inject:{{ext}}",
                    endtag: "// endinject",
                    transform: function (filepath) {
                        return '@import "' + filepath + '";';
                    },
                    relative: true
                }
            )
        )
        .pipe(gulp.dest("app/styles"));
});

// Compile Sass to CSS
gulp.task("sass", ["inject-bower-scss"], function () {
    return gulp.src("app/styles/**/*.scss")
        .pipe($.sass())
        .pipe(gulp.dest("dist/styles"))
});
```

`main-bower-files` は利用している bower パッケージのメインパッケージを列挙してくれるので、`filter` オプションで Scss をフィルタしている。`vendor.scss` への挿入は `gulp-inject` を使っているが標準で Sass には対応していないのでオプションで Sass に対応させている。

## app/styles/vendor.scss

```sass:app/styles/vendor.scss
// Override variables
$gray-base: #fff !default;

// inject:scss
@import "../bower_components/bootstrap-sass/assets/stylesheets/_bootstrap.scss";
// endinject
```

`// inject:scss` から `// endinject` の間にインポート文が挿入される。この前に変数を定義しておくことでその変数を上書きできる。

インポートされる順序を強制したいときは、`gulp-order` などを用いて変更することができる。