OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu14.04でTeX環境構築

# やったこと
以下のコマンドを実行し、シェルを再起動

```zsh
$ sudo apt-get install texlive # TeXそのもの
$ sudo apt-get install texlive-lang-cjk # 日本語対応版(UTF-8)
$ sudo apt-get install texlive-fonts-recommended texlive-fonts-extra # フォント(なくてもいけるかも…)
```

```zsh:コンパイル
$ platex sample.tex
# このコマンドで sample.aux sample.dvi が生成されます
```

```zsh:dviをpdf形式に変換
$ dvipdfm sample.dvi
# このコマンドで sample.pdf が生成されます
```

あとは以下のコマンドとかで開いてみる

```zsh
$ evince sample.pdf
```

# おまけ
僕はVimを使っているため、Vim上からコンパイルとPDFを開きたかったので、[vim-latex](https://github.com/vim-latex/vim-latex)のインストールと設定をしました。

私は[NeoBundle](https://github.com/shougo/neobundle.vim)を使いました。

```vim:.vimrc
NeoBundle 'vim-latex/vim-latex'

" Vim-LaTeX
" 各オプションは各自でお調べください
set shellslash
set grepprg=grep\ -nH\ $*
let tex_flavor='latex'
let g:Tex_DefaultTargetFormat='pdf'
let g:Tex_MultipleCompileFormats='dvi,pdf'
let g:Tex_FormatDependency_pdf='dvi,pdf'
let g:Tex_CompileRule_dvi='platex --interaction=nonstopmode $*'
let g:Tex_CompileRule_pdf='dvipdfm $*.dvi'
let g:Tex_ViewRule_pdf='evince'
```

# 追記
EvinceでPDFを表示したときに日本語の明朝体がゴシック体として表示されてしまう問題を直す方法が、[TeX Wiki](https://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Evince#id0a7178)にあったので載せておきます。

以下のコマンド実行

```zsh
$ mkdir ~/.config/fontconfig/
$ touch ~/.config/fontconfig/fonts.conf
```

新しく作成された `fonts.conf` のファイルを以下の内容を追加

```xml:~/.config/fontconfig/fonts.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/local/texlive/2015/texmf-dist/fonts/truetype/public/ipaex</dir>
  <dir>/usr/share/texlive/texmf-dist/fonts/truetype/public/ipaex</dir>
  <dir>/usr/share/texmf-dist/fonts/truetype/public/ipaex</dir>
  <dir>/usr/share/texmf/fonts/truetype/public/ipaex</dir>
  <match target="pattern">
    <test qual="any" name="family">
      <string>Ryumin</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
      <string>IPAexMincho</string>
    </edit></match><match target="pattern">
    <test qual="any" name="family">
      <string>GothicBBB</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
      <string>IPAexGothic</string>
    </edit>
  </match>
</fontconfig>
```

# 参考
[モダンな日本語 TeX 環境を整える](http://qiita.com/ynakayama/items/706ae9e59c1b6fd3e3d2)
VirtualBox (Windows10) 上に Debian/Jessie をセットアップする (準備編)

これから Debian を触ってみたい人向けになんとなく書きます。
私の体力の事情から3回に分割して掲載していきます！

- 準備編 (必要なもののダウンロードとか)
    - これ
- インストール編 (debian installer などについて)
    - Part 1/2: [こちら](http://qiita.com/shocrunch/items/028519c436ff621f80f3)
    - Part 2/2: [こちら](http://qiita.com/shocrunch/items/381b836c500e96f1546e) 
- 初期設定編 (クリップボードの共有設定や、aptlineの設定など)
    - [こちら](http://qiita.com/shocrunch/items/53db470a332c225ad4de)

「おい、ここどうすればいいのさ？」というのがあれば気軽にコメントなりSkypeなりくださいね♪

## 使うもの

- Oracle VM VirtualBox (version 5.0.6)
- Debian 8.2 (2015/10/19時点の最新)
- Windows 10 Home

## virtualbox インストール

[こちら](http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp#extpack)のOracle 公式サイトから、以下の2つをダウンロード

- Oracle VM VirtualBox (Windows)
- Oracle VM VirtualBox Extension Pack

`VirtualBox -> VirtualBox Extension Pack` の順にインストール


この辺なんてゴミみたいな作業だから画像つけませんよ！


## debian ダウンロード

### ダウンロードのその前に

debian のダウンロードとは言ってもざっと3つの選択肢があります。

|おすすめ度| インストールに使うイメージ|
|----------|--------------------------|
|★★☆|ネットインストール用のイメージ|
|★★★|DVD 用のイメージ|
|★☆☆|CD 用のイメージ|

どれがいいか悩みますよね??

- 「一刻でもはやくインストーラを起動させたいんだ！」という強い意志をお持ちなら
**ネットインストール用**がおすすめです。
ただし、インストーラを起動させてから debian が使えるようになるまでは時間がかかるでしょう。

- 「インストールしてみたけど、よくわかんない状態になったから、もう一度インストールしようかな...」という経験のある
『あなた』には **DVD用** がおすすめです。<br>
一度仮想マシンを消してしまっても、数GBのデータを *ネットインストール用* のようにダウンロードしなおしてセットアップする必要がありません。


- **CD用**は1つの iso ファイルにGnome(WindowsのようなGUI)が入っていないので、初心者にはおすすめできません...

以下では私の好きな **DVD 用イメージを torrent でダウンロードしてくる方法** を説明します。

### debian を torrent でダウンロードする

#### 1. torrent クライアントのセットアップ

torrent クライアントは uTorrent, Bittorrent どれでもかまいません。
使い慣れているものを使っていただいてかまいません。

そんなこと言われても... という人のために、
uTorrent のリンクだけ張っておきますね (http://www.utorrent.com/intl/ja/)

ただし、ここも説明は割愛させていただきますね

#### 2. debian の torrent file をダウンロード

[Debian.org](https://www.debian.org/) にアクセス！

※少々わかりにくいリンクを踏んでいくので画像を見ながらやっていくといいかもしれません。


** CD/USB ISO イメージ** をクリック

![debian1.png](https://qiita-image-store.s3.amazonaws.com/0/97187/61580e98-6de5-437d-323b-717cfa58c2cd.png)

** Debian の CD イメージを BitTorrent でダウンロードする** をクリック

![debian2.png](https://qiita-image-store.s3.amazonaws.com/0/97187/22c68567-0f7b-bb3a-cc2b-fc414306182d.png)

** amd64** をクリック

![debian3.png](https://qiita-image-store.s3.amazonaws.com/0/97187/d6bb94c4-5bdb-5666-8998-535a62acf114.png)

** debian-8.2.0-amd64-DVD-1.iso.torrent ** がダウンロードする torrent file です！

![debian4.png](https://qiita-image-store.s3.amazonaws.com/0/97187/10f964fa-3640-e1f9-b937-098ce6293847.png)

ポイントは `debian-*.*.*-amd64-DVD-1.iso.torrent` だけでいいってことです。
2 や 3 をダウンロードしてもいいですが、1だけでほとんど十分です。
足りないものがあれば後から `apt` でダウンロードしましょう♪

uTorrent を使っているのであれば、ダウンロードした torrent file を開くとなにやらダウンロードできそうな画面が現れたのではないでしょうか?

こころの向くまま、気の向くままダウンロードを開始して今日は寝ましょう。。。

インストール編 (debian installer などについて) につづく...
vim - plugin - QFixGrep

#通常grep
カーソルがある単語で検索 (:sil grep -nIH 単語 * )
g,g
カーソル下の単語で再帰検索 (:sil grep -rnIH --exclude-dir=".svn" --exclude-dir=".git" 単語 .)
g,r

vimrc での設定 (事前に外部grepをインストールしておく)
set grepprg=grep\ -rnIH\ --exclude-dir=.svn\ --exclude-dir=.git
autocmd QuickfixCmdPost make,grep cw
nnoremap <expr> g,g ':sil grep -nIH ' . expand('<cword>') . ' *'
nnoremap <expr> g,r ':sil grep -rnIH --exclude-dir=".svn" --exclude-dir=".git" ' . expand('<cword>') . ' .'

#絞り込みgrep (QFixGrep) 
※C-w . で QuickFixウインドウに戻れる
g,e   "通常grep
g,re  "再帰grep
g,f   "固定文字列検索
g,rf  "再帰固定文字列
g,b   "現在開いているバッファのみ検索対象とする
↓
s     "指定文字列で絞り込み
r     "指定文字列を含まない絞り込み
WordPressのアイキャッチのサイズを固定化する.

#初めに
アイキャッチのサイズを固定化しようとして以下を実行してみた.

    <?php the_post_thumbnail( array( 250, 250 ) ); ?>
しかし,表示されたのは元の画像の比を残したリサイズ画像だった.

#対策
functions.phpに

    add_image_size( 'ImageSize', 
                    250, 250, 
                    true
    );
を記入し,アイキャッチを表示たいファイルで

    the_post_thumbnail( ImageSize );

とすることで切り抜きではあるがサイズを固定化することができた.

#APIの説明
    add_image_size( 'イメージサイズを適応するときに使う名前', 
                    アイキャッチの横幅, 縦幅, 
                    切り抜きを行うかどうか(true | false) );
<strong/>

    the_post_thumbnail( イメージサイズを適応するときに使う名前 );

#注意点
アイキャッチ画像は,アップロード時に生成されるため,functions.phpに書き込んだ後に投稿した記事でないともともとあるアイキャッチ画像が表示されてしまうため,サイズが変更されないことに注意が必要.
Deviseで退会処理を作る時に気をつけたほうがいいこと

## 前置き

DeviseのmodelをUserで設定した場合

ルーティングで

```
devise_for :users
```

ユーザー削除するルーティングが自動生成される。

```
DELETE /users(.:format)               devise/registrations#destroy
```

## そのサイトにXSSがあるケース

任意のJavaScriptが実行できるようになってる場合、以下のコード埋め込んでおけば、ログインしてユーザーにそれを踏ませることでログインしてるユーザーを削除することができてしまう。

```
$.ajax({type: 'DELETE', url: '/users'})
```

## Devise::RegistrationsController#destroyをオーバーライドしないでユーザー削除処理を独自実装してるケース

単純に削除以外に行いたい処理があって、別のコントローラーに別メソッドで実装してる場合

```
$.ajax({type: 'DELETE', url: '/users'})
```

を実行された場合に、デフォルトで生成されたDevise::RegistrationsController#destroyを通ってしまって、独自実装した処理が実行されないで削除されてしまう。
vim - uniq

#外部 sort、uniq コマンド
区切りを「,」として3フィールド目の値でソートし、3フィールド目の値が重複していたら削除(-u)する
:%!sort -t, -k3,3n -b -u 
単純ソート
:%!sort | uniq
重複行を抜き出す
:%!sort | uniq -d
データ並びを維持しつつ、重複行を削除する
:%!cat -n
:sort /\t/
:%!uniq -2
:%s/^ *\d\+\t//
vim - sort

#外部 sort コマンド (:%!sort)
区切りを「,」として2番目のフィールドでソートする
:%!sort -t, -k 2,2
3番目のフィールドの値を数値として解釈し、かつ、降順でソートする
:%!sort -t, -k 3,3nr
データを空白文字で区切って、2番目のフィールドの値でソートする
:%!sort -b -k 2,2
区切りを「,」として、3番目のフィールドでソートし、同じであれば、4番目のフィールドでソートする
:%!sort -k 3,3n -k 4,4n

#内部sortコマンド (:sort で呼び出す)
降順
:sort!
範囲指定
:10,30sort
大小文字区別なし
:sort i
10、16、8進数
:sort n
:sort x
:sort o
20列目の値を基準にソートする。＋10進数でソートの場合
:sort   /\%20c/
:sort n /\%20c/
vim - 複数ファイルの一括置換

#qfreplace.vim を使う
:grep で検索する
:copen で QuickFix を開く
:Qfreplace を実行して編集用バッファを開き、対象文字を置換する

#bufdo、argdo を使う
vim a.txt b.txt c.txt d.txt e.txt

複数ファイルを一括で加工する (bufdo)
:bufdo :%s/abc/xyz/ge | :update

開いているファイルのうち、いくつかを選んで加工する (argdo)
:args a.txt b.txt
:argdo :%s/abc/xyz/ge | :update

さらに対象ファイルを増やす (argadd)
:args a.txt b.txt
:argadd c.txt d.txt

対象から外す (argdelete)
:args a.txt b.txt c.txt
:argdelete c.txt 

新たにリストを作成する (args + 引数 によりリストを新規にする)
:args a.txt b.txt

args で作ったリストは維持しつつも一時リストを作り編集する (arglocal)
:split  " ウインドウを開く
:arglocal
:argadd f.txt g.txt
:argdo :%s/abc/xyz/ge | :update
:close
Stateless functional componentsでnull返してはまった話


React 0.14から入ったStateless functional components

どうもnullを返してしまうとRenderが無いと怒られてしまうらしい。

```js
const FooItem = ({ show }) => {
  if(!show){
    return null
  }
  return (
    <div>some component</div>
  )
}
```

解決策としてはこんな感じ

```js
const FooItem = ({ show }) => {
  if(!show){
    return <noscript />
  }
  return (
    <div>some component</div>
  )
}
```

`<noscript>`に深い意味があるわけでもないが、Reactの標準的な動作がこれらしいのであわせた。
spanでも多分別に良い。

Animation関連でもnull返した際にエラーがあったので、もしかするとnull返すComponentはそもそもあんまり良くないのかもしれない。


ちなみに、現象としてはissueに上がっていた。
https://github.com/facebook/react/issues/5218
でもshadowRenderに限定されてしまっている。
otto手順メモ

# まず

application rootまでcdして

```bash
otto compile
```

# Deploy
```bash
otto dev
```

# ssh
```bash
otto dev ssh
```
virtualboxで走っているVMに接続できた。

# Rackのアプリ走らせる
```bash
bundle && rackup --host 0.0.0.0
```

実行結果にIP表示されてる。
【Swift】指定間隔でクロージャ式を評価して、trueになった際にコールバックを飛ばす非同期処理を作成してみた

タイトルの通り、下記のようなメソッドを作成してみた。

```
    func waitIntervalCheckFlag(interval: Double, flag: () -> Bool, completion: () -> Void ) {
        let time = dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC)))
        dispatch_after(time, dispatch_get_main_queue(), {
            flag() ? completion() : self.waitIntervalCheckFlag(interval, flag: flag , completion: completion)
        })
    }

```

引数:
interval = クロージャ式の評価間隔
flag = 評価基準
completion = 完了時コールバック

使用例:

```
        let wkWebView = WKWebView(frame: CGRect())
        let request = NSURLRequest(URL: NSURL(string: "http://google.com")!)
        wkWebView.loadRequest(request)

        waitIntervalCheckFlag(0.3, flag: { wkWebView.title?.characters.count > 0 }, completion: { () in
            print("title = \(wkWebView.title)")
        })
```

ちょっと例が微妙な感じもしますが、
WebViewのtitleが取得できるまで0.3秒毎にクロージャ式を評価して
取得できたらコンソールに出力しています。
ActiveAdmin の filter で、あるモデルに associate しているモデルを使う

``` schema.rb
ActiveRecord::Schema.define(:version => 20150000123456) do
  create_table "users", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
  create_table "products", :force => true do |t|
    t.string   "name"
    t.integer  "user_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end
```
というモデルの構成だった場合、

``` app/admin/products.rb
ActiveAdmin.register Product do
  filter :user_name, as: :string
end
```
とすることで User.name で検索できるようになる。
EC2インスタンスにtagで付けた名前をサーバー内から取得する（勝手改定版）

[EC2インスタンスにtagで付けた名前をサーバー内から取得する](http://qiita.com/hash/items/40006f91d4864ceaf991)という記事がやや情報古いので
最近の環境で同じことする。

```bash
$ aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | {InstanceId, Name: (.Tags[] | select(.Key=="Name").Value)} | select(.InstanceId==$me_id) | .Name' --arg me_id `curl -s http://169.254.169.254/latest/meta-data/instance-id` | tr -d '\n'
my-web-server
```

* aws-cliのインターフェース変更に対応
* aws-cliをJSONで扱うことが多いのでパースを変更。jq使用。
OSX のメニュー風にフェードアウトさせながら要素を非表示にする

普段あまり気にしないけど、 OSX のメニューは、表示されるときはアニメーションなしで、非表示になるときはフェードアウトしながら消える。

![10月 20, 2015 22:22.gif](https://qiita-image-store.s3.amazonaws.com/0/19448/f035c75f-4328-2904-4860-d075c16622c8.gif)

Web 上でもこの雰囲気を再現したくて、 CSS transition でやってみようと思ったんだけど、以下のコードだとアニメーションしない。

```scss
.menu {
    transition: none;

    &.hidden {
      display: none;
      opacity: 0;

      transition:
        display 0s linear 0.3s,
        opacity 0.3s ease 0s;
    }
}
```

実は `display` プロパティは `transition` に指定できないので、代わりに `visibility` を使ってやる必要がある。

```scss
.menu {
    transition: none;

    &.hidden {
      visibility: hidden;
      opacity: 0;

      transition:
        visibility 0s linear 0.3s,
        opacity 0.3s ease 0s;
    }
}
```
yosemite => windows 7 のファイル共有



![img.png](https://qiita-image-store.s3.amazonaws.com/0/64084/5f343bf3-8b3c-e428-39dd-cf62e6f133f7.png "img.png")

@ win/mac 混合のイントラネット[^1]

[^1]: windows 7 がメインで、 8.1 にはアクセスしない。windows 10 にはアップデート禁止令が出てる。

## （私にとっては）諸悪の原因

```
[default]
smb_neg=smb1_only
```

- [MavericksにしたらNASがおかしい、そんなときの対策](http://news.mynavi.jp/column/osxhack/110/?gaibu=hon)

Marvericks 時代に、この記事によるハックで、SMB 1.0 を使えば良さげ、、、と、上記のコードを  `/etc/nsmb.conf` に登録してしまう。
月日は流れ、Yosemite に上書きアップグレード。


その頃から、ファインダでの「共有タブ」のマシン名リストアップが異常に遅くなったり、特定の Windows 7 のファイルサーバだけアクセスが安定しなくなって、アクセス出来たり、出来なかったり[^2]。おまけに、`automount` ではアクセス出来るのに、ファインダからは出来なかったり[^3]。


原因を探す暇もなく放置してたのだが、漸く重い腰を上げて、、、

[^2]: やっかいなのは、普通にアクセス出来る windows 7 もあった事。
[^3]: これは、設定をごちゃごちゃ検討していた最中。挙動自体はファインダと一貫していたのかも知れない、、、


## 対応

てんやわんやの末。

結論から言えば、

```
$ sudo rm /etc/nsmb.conf
$ killall Finder
```

すりゃいいだけの事だった。

OS が違えば、挙動も変るものだから、当然用心すべきだったわ。


## ついでに学んだ事。

### `smbutil`

`smbutil statshares -a` は、 [`automount` でマウントしたもの](http://qiita.com/bunzaemon/items/6f55d7da12d2b6bd0436)には反応しないっぽい。
Rails: 親子まとめてのバリデーションは削除時に注意

Railsでは、親テーブルの1行に子テーブルの複数行が対応する`has_many`の関係を簡単に作れます。入力などの補助的な機能も各種整っていますが、バリデーションをかけようとした時に失敗したところがありました。

# TL; DR

* `accept_nested_attributes_for`で削除しようとした子要素も、バリデーション時点ではまだ削除されていない
* そのため、モデルのCollectionにも入ったまま
* `marked_for_destruction?`でチェック可能

# 親子セットでのデータハンドリング
「1本の記事に複数のコメントが付く」ような、一対多の関係はWebアプリを作っていれば至るところに発生します。Railsでは、`has_many`で結ばれた関係について、`accept_nested_attributes_for`を行うことで、親についてのフォーム送信で子の作成・変更・削除などを一気に行ってしまうことができるようになります。さらに、[`nested_form`](https://github.com/ryanb/nested_form)を使えば、そのような親子関係を受け入れるような入力フォームも、簡単に構築できます。

# 親子モデルへのバリデーション
モデルへのバリデーションは重要な機能ですが、親子セットのモデルでも親にかけたバリデーション、子にかけたバリデーションはそれぞれ動作します。そこで、子モデルの合計値を使うようなバリデーションをかけてみたところ、一見正常に動くように見えました。

# 消えてなーい！
ところが、その状態で子モデルを削除しようとしたところ、うまくバリデーションを通らないという事態が発生してしまいました。調べてみると、バリデーション段階では子モデルが**消えていない**ということが判明しました。そして、`destroyed?`も`false`で、事態を解決できません。

# 正しいチェック方法
調べまわった結果、`marked_for_destruction?`というのがこの状況をチェックする適切なメソッドだと判明しました。`collections.reject(&:marked_for_destruction?)`で、削除されずに残るモデルたちだけのリストが得られます。

# 参考リンク

* [Validating Nested Associations in Rails](http://homeonrails.com/2012/10/validating-nested-associations-in-rails/)
* [Railsでnested_attributes_forとlengthに関するvalidationを共存させる](http://qiita.com/asukiaaa/items/4797ce44c3ba7bd7a51f)
2段階認証でGitHubから締め出しをされないように準備しておくこと

# 2段階認証はログイン不可になるリスクになりうる

2段階認証は基本的にスマホのOTPアプリで認証する。
しかし、スマホを紛失したとき何も対策をしていない場合は永久追放されることになる。
https://help.github.com/articles/recovering-your-account-if-you-lost-your-2fa-credentials/

>If you've lost access to your account after enabling two-factor authentication, GitHub can't help you gain access again. Having access to your recovery codes in a secure place, or establishing a secondary mobile phone number for recovery, will get you back into your account.

If you've lost access to your account after enabling two-factor authentication, **GitHub can't help you gain access again.**

もしあなたは2段階認証できなくなったら、GitHubはあなたを助けることが出来ません。あなたは２度とそのアカウントにアクセスできなくなります。(適当訳)


## 対策

必ずやる。手遅れになる前に・・・。

### 対策1 リカバリコードをバックアップ

上記引用にも書いてある通り、リカバリコードをバックアップする。リカバリコードのバックアップを取ってない場合、上部に警告が出るようになった。

### 対策2 OTPアプリを複数のデバイスで使えるようにしておく

1台壊れても大丈夫な状態にしておく。


## あ、対策してなくて2段階認証できなくなった

最後の望み。GitHub上にsshキーが登録してあれば、復旧できるらしい。**(当方未検証)**
http://stackoverflow.com/questions/27789910/is-there-a-way-to-restore-github-2fa-without-recovery-codes-or-backup-phone-numb

```bash
ssh -T git@github.com verify
```


## 追記

2015/10/21 0:40
Authyを2段階認証アプリとして使用すれば、基本的にデバイスを紛失して2段階認証難民になるパターンを避けられるそうです。@naru0504 さんありがとうございます！
Python3.5にアップデートしたらBeautifulSoup4が使えなくなった場合。ImportError: No module named bs4

###状況
Python3.5にアップデートしたらBeautifulSoup4が使えなくなりました。
正確には、「ImportError: No module named bs4」とでます。
###解決策
Sublimetext3のビルドシステムをpython3にする
###エラー原因
Sublimetext3のビルドシステムがpythonになっていた。
###python3.sublime-buildのソースコード参考
```text
{
	"cmd": ["/usr/local/bin/python3", "-u", "$file"],
	"selector": "source.python",
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"env": {"LANG": "ja_JP.UTF-8"}
}
```
###保存場所
/Users/*****/Library/Application Support/Sublime Text 3/Packages/User/python3.sublime-build
【成功事例】windowsでmiddlemanを使う20151020

macを使っているときはmiddlemanは簡単に使えますが、windowsになるととたんに難しくなります。
（去年試したときはできませんでした。）

今日
windows 8.1（64bit）でmiddlemanを使うことに成功しました。
* windows 7（64bit）でもmiddlemanを使うことに成功しました。

のでメモします。
middlemanを使うモチベーションが上がりました。

## 手順

### 1. rubyのインストール

rubyinstallerのサイトからRuby 2.1.ｘ（20151020時点は、Ruby 2.1.7）
をダウンロードします。
＊64bit版だと動かないというブログ記事があったので、64bit版はやめました

http://rubyinstaller.org/downloads/

インストーラーを起動して、下の２つのチェックボックスにチェックを入れます。

![image](https://qiita-image-store.s3.amazonaws.com/0/41550/81148046-e9ce-bca3-3233-e4174cc3c06a.png)


### 2. DEVELOPMENT KITのインストール

rubyinstallerのサイトからFor use with Ruby 2.0 and above (32bits version only):（20151020時点は、DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe）
をダウンロードします。

http://rubyinstaller.org/downloads/

cドライブ直下にdevkitフォルダを作成し、ダウンロードしたexeを起動して、devkitに解凍します

コマンドプロンプトでdevkitに入り、

```
ruby dk.rb init
```


```
ruby dk.rb install
```

を実行します。


### 3. middlemanのインストール

コマンドプロンプトで

```
gem install middleman
```

を実行します。

＊必要におおじて

```
bundle install
```

```
bundle update
```

が必要になるかもしれません。
エラーメッセージにそれらしいメッセージがあります。


### 4. middlemanを使ってみる

フォルダを作って、コマンドプロンプトでそのフォルダに入ります。

プロジェクトの作成
```
middleman init
```

サーバーの起動
```
middleman server
```

ビルド
```
middleman build
```

成功しました。


## はまりどころ

macで作っていたプロジェクトをwindowsで動かそうとしたときにはまりました。

### point 1 middlemanのバージョンは3.4.0

macで作ったときは、3.3.12でした。
そのまま使うとエラーになったためGemfileのmiddlemanの部分のバージョンを
windowsで作ったプロジェクトの中のGemfileのバージョンに合わせました。

```
gem "middleman", "~>3.4.0"
```

### point 2 middleman-deployは使わない

原因は良く分かりませんが、middleman-deployがGemfileに設定してあるとエラーになりました。
windowsでは、インストールしない設定にしました。

```
gem 'middleman-deploy', '~> 1.0', platforms: [:ruby]
```


＊必要におおじて

```
bundle install
```

```
bundle update
```

が必要になるかもしれません。
エラーメッセージにそれらしいメッセージがあります。



### point 3 LESSは使わない

まだ、試していませんが、lessをmiddlemanで使おうとすると
windowsではまります。therubyracerの部分
今回はlessのコンパイルを外部のアプリで行うようにしていたため
大丈夫でした。


以上
Rails:  Date / Time / DateTime 型の違い。そしてSQL用の文字列を得る方法。

# Date型 ( = 曜日 + 日付 )

例: **Tue, 20 Oct 2015**

```rb
Date.today
# => Tue, 20 Oct 201
```

# Time型 ( = 日付 + 時刻 )

例: **2015-10-20 19:22:41 +0900**


```rb
Time.now
# => 2015-10-20 19:22:41 +0900
```

# DateTime型 ( = 曜日 + 日付 + 時刻 )

例: **Tue, 20 Oct 2015 19:22:43 +0900**


```rb
DateTime.now                                            
# => Tue, 20 Oct 2015 19:22:43 +0900
```

# String 型

たとえば。

- 2015-10-20
- 2015-10-20 19:22:43

↑こういうのはただの文字列で、***時間を表す型ではない***。

こういう文字列を得るには、Date / Time / DateTime の結果に対して `to_s` / `to_s(:db)` をすれば良い。


## 日付を得る

```rb
Date.today.to_s
```

***=> "2015-10-20"***

## 日時を得る

```rb
Time.now.to_s(:db)
```

***=> "2015-10-20 19:22:43"***

```rb
DateTime.now.to_s(:db)
```

***=> "2015-10-20 19:22:43"***

　
---

- 素の ruby では to_s(:db) オプションはないので注意。



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
`gulp-sass`で`file to import not found or unreadable`のエラー

フロントまわりのエコシステムを諸々整備しているところなのですが、CSSのコンパイルに`gulp-sass`を使ったところ、少しハマってしまったのでメモしておきます

# gulp-sass

https://github.com/dlmanning/gulp-sass

インストール、基本的な使い方については上のページに載っているのでここでは割愛します

# 前提として`@import`している

`Sass`を全然詳しくないのですが、以下のような構成にして、

```
tree ./stylesheets/
./stylesheets/
├── application.css.scss
└── some
    ├── _aaa.css.scss
    └── _bbb.css.scss
```

で、`application.css.scss`内で、

```css:application.css.scss
@import "some/aaa";
@import "some/bbb";
```

それぞれのスタイルのモジュールをimportしてあげるというのはよくある方法だと認識しています。
いずれにせよこのような感じのファイルをデザイナーからもらったので、これらを`gulp-sass`でコンパイルすると・・・

# `file to import not found or unreadable`が出る

以下のようなエラーが出た > <

```
gulp sass
[20:08:38] Using gulpfile ~/some-project/gulpfile.js
[20:08:38] Starting 'sass'...
[20:08:38] Finished 'sass' after 11 ms
Error in plugin 'sass'
Message:
    stylesheets/application.css.scss
  12:9  file to import not found or unreadable: some/aaa
Current dir:
```

`some/aaa`こんなもんみつからないよ、ということだけど・・・。

# それっぽいissueをみつける

https://github.com/dlmanning/gulp-sass/issues/1
https://github.com/dlmanning/gulp-sass/issues/235

比較的古いissueだったけどコメントみるとかなり盛り上がっていた模様。ただしこれら全部試してみたけど、どれもエラーは解消されなかった・・・以下載っていた対応策

## `gulp-sass`のバージョンを2.Xにあげる

もとから`2.0.4`だった

## `includePaths`を正しく設定する

`gulp`の処理内で`includePaths`を設定してみたが、こちらでも解消されず・・・

```
gulp.src('./styles/main.scss')
  .pipe(sass({includePaths: ['./styles']}))
  .pipe(gulp.dest('./styles'))
```

## `Sublime`?? `Windows`??

https://github.com/dlmanning/gulp-sass/issues/235#issuecomment-99998298

らへんみていただければなのですが、`Windows`ユーザでかつ`Sublime Text`を使っているユーザが`atomic_save`まわりの設定を変更することでエラー解消された！という報告がたくさんあがっていました。
が、、、自分は該当ではない・・・。

# `.css.scss`が原因だったぽい

手探りでいろいろやってようやくエラー解消できました。

```
    ├── _aaa.css.scss
    └── _bbb.css.scss
```

を

```
    ├── _aaa.scss
    └── _bbb.scss
```

に修正したら動きました。`.css.scss`という拡張子の書き方がよくなかったぽいですね。
Railsで自動でジェネレートされるファイルがこういった拡張子になると思うのですが、Railsで一旦つくったプロジェクトからCSSをもってきたのでこんなことになってしまった・・・
OS X El Capitan‎にtreeコマンドをインストール

OS X El Capitan‎ にtreeコマンドをインストールする。


環境

* OS X El Capitan

まずは、Homebrewのインストール


ターミナルで[こちら](http://brew.sh/index_ja.html)のコマンドを実行

``` sh:ターミナル
$ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

バージョンの確認

``` sh:ターミナル
$brew --version 
0.9.5 (git revision f3fc; last commit 2015-10-20)
```
Homebrewのインストールは、OSをクリーンインストールした環境だったので、うまくいったようです。
アップデートした環境では、問題が発生するみたいなので注意。
[【Mac】OS X 10.11 El CapitanにHomebrewをインストールする方法](http://blog.h-wd.info/2015/10/08/mac-os-x-10-11-el-capitan%E3%81%ABhomebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)


次に、Homebrewでtreeコマンドをインストールする。

``` sh:ターミナル
$brew install tree
==> Downloading https://homebrew.bintray.com/bottles/tree-1.7.0.el_capitan.bottl
######################################################################## 100.0%
==> Pouring tree-1.7.0.el_capitan.bottle.1.tar.gz
🍺  /usr/local/Cellar/tree/1.7.0: 7 files, 128K
```

バージョンの確認

``` sh:ターミナル
$tree --version
tree v1.7.0 (c) 1996 - 2014 by Steve Baker, Thomas Moore, Francesc Rocher, Florian Sesser, Kyosuke Tokoro 
```

これでtreeコマンドが使えるよになります。
vimでMATLABのソースを書く

# 動作環境
まずは動作環境から。
MATLAB R2013a
MacOS yosemite(10.10.5)
vim 7.4.769

少なくとも多少のvim操作、`.vimrc`の書き方などを知っていることが前提です。

# なにがしたいか？
たとえば僕のような、

- matlabのエディターは編集機能が貧弱だ
- vimで書くのに慣れている
- でもvimだと補完弱いのかなぁ？

みたいな人向けの記事です。
やることは、

1. vimで~.mファイルを開くため***MATLABをUTF-8に対応させる***
2. matlab用のvim-pluginを入れる

たったこれだけです。

# MATLABのUTF-8化
## まずは準備
なんとMATLABはデフォルトだとエンコードがSJISです。
いまどきびっくりです。
僕はvimのエンコードをUTF-8にしているので、vimでソースコードを編集する場合はMATLABのエンコードもUTF-8に設定する必要があります。
ただし、MATLABの「環境設定」ではUTF-8をデフォルトのままでは選べません。
ということで、下記のサイトを参考に強制的にUTF-8に対応させます。

- [MacOSX encoding problem](http://uk.mathworks.com/matlabcentral/answers/12422-macosx-encoding-problem)
- [Matlabスクリプトの強引なUTF-8化](http://d.hatena.ne.jp/hkob/20140427)

ここで、始める前に注意。

***強制UTF-8化をすると、これまで書いたSJISのソースコードが文字化けします。***

特に日本語がアウトです。
日本語コメントとかは全滅するでしょう。
スクリプト自体はアルファベットですから、おそらく大丈夫でしょうが。
ですが、始める前はスクリプトのバックアップ、もしくは何らかのエディターでSJISからUTF-8に変換しておくことをおすすめします。

## `lcdata.xml`を編集
ターミナルを開いて、
`cd /Applications/MATLAB_R2013a.app/bin`
とディレクトリを移動します。`/MATLAB_R2013a.app/`の部分は各環境・バージョンに依存するので適宜修正してください。

このフォルダで`ls -a`とやるとlcdata.xmlというファイルとlcdata_utf8.xmlというファイルの両方を見つけることができます。
中身の違いは覗けばすぐわかるかと。

大事なことは、MATLABはlcdata.xmlを読んでエンコードを決めているので、オリジナルのlcdata.xmlの代わりにlcdata_utf8.xmlを読ませれば良い、ということですね。

MATLAB側で読むxmlファイルを切り替えられればいいんでしょうけど、特にそうしたコマンドは見つからないようなので「ファイル名を置きかえる」ことで対応します。

```shell-session:command-line
$ mv lcdata.xml lcdata_sjis.xml
$ ln -s lcdata_utf8.xml lcdata.xml
```

これでMATLABを再起動させればUTF-8で立ち上がります！

## vim側の設定
NeoBundleを使います。
設定に関しては大量に記事が見つかると思うので他を参照してください。

```vim:.vimrc
" matlab用syntax
NeoBundle 'lazywei/vim-matlab'
```

これでmatlabのsyntax highlightに対応してくれます。
MATLAB本体の色分けよりも見やすい気がします笑

ちなみに、MATLABのスクリプトでは行頭に!をつけると、シェルスクリプトが使えます。でもバグも多いようなので微妙かなぁ。
ためしにMATLABのコマンドウィンドウで`!vim`したらフリーズしたし... ^^;

ということで、vimでMATLABのソースを書くための設定記事でした！
Raspberry pi 2 


install手順

## install

1. NOOBSをダウンロード(30min-)
	https://www.raspberrypi.org/downloads/noobs/

1. SDカードをフォーマット(15min-)
	https://www.sdcard.org/jp/downloads/formatter_4/
	※ラベルは空に！！→OSインストール時にエラーが出ます
	http://blog.yuizi.com/2015/06/raspberry-pi-2.html
1. SDに解答したNOOBSをいれる(1min-)
	NOOBS/から先のファイルをいれる
1. RASPにusb.keyboard.mouse.HDMIをさして電源入れる
	渋い場合壊しそうで怖い...	
1. Rasbianをinstall(15min-)
1. 無線LAN設定
	http://qiita.com/daicham/items/e24ce76f8815d339d070
1. ssh接続
http://okuzawats.com/ssh-20140917
 再起動 `sudo reboot `
 シャットダウン `sudo shutdown -h now `

## stack
perlのwarningがでる

``perl: warning: Falling back to a fa
llback locale``

```ssh
$ export LANGUAGE=en_US.UTF-8
$ export LANG=en_US.UTF-8
$ export LC_ALL=en_US.UTF-8
$ locale-gen en_US.UTF-8
?$ dpkg-reconfigure locales
```
AWS Elastic BeanstalkのRuby環境でsidekiqを起動する場合

少しはまったのでメモ

AWS Elastic BeanstalkのRuby環境でsidekiqを起動するupstart scriptを用意して`container_commands`から起動させる様にした。
deploy完了後に確認するとlogやpidファイルが`/var/app/current`に吐き出されて無かった。
原因を調べてみたら`container_commands`が完了してからステージングディレクトリ(`/var/app/ondeck`)を`/var/app/cuurent`に置き換えてからpumaの再起動をかけていた。

`/var/app/current`に置き換わった後にsidekiqを起動する必要があった。
puma起動は `/opt/elasticbeanstalk/hooks/appdeploy/enact/02_restart_app_server.sh` で実施していたので、`/opt/elasticbeanstalk/hooks/appdeploy/enact/10_start_sidekiq.sh` とかを作って対応することにした。

### /etc/init/sidekiq.conf
puma.confをぱくった

```bash
description "Elastic Beanstalk Sidekiq Upstart Manager"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

script
exec /bin/bash <<"EOF"
  EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
  EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
  . $EB_SUPPORT_DIR/envvars
  . $EB_SCRIPT_DIR/use-app-ruby.sh
  if [ -f /etc/elasticbeanstalk/set-ulimit.sh ]; then
    . /etc/elasticbeanstalk/set-ulimit.sh
  fi
  EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
  RACK_ENV=$(/opt/elasticbeanstalk/bin/get-config optionsettings -n aws:elasticbeanstalk:application:environment -o RACK_ENV)
  cd $EB_APP_DEPLOY_DIR
  exec su -s /bin/bash -c "bundle exec sidekiq --environment $RACK_ENV --config config/sidekiq.yml" webapp
EOF
end script
```

### /opt/elasticbeanstalk/hooks/appdeploy/enact/10_start_sidekiq.sh

```bash
#!/usr/bin/env bash
set -ex
initctl restart sidekiq || initctl start sidekiq
```
PowerShell計算機（べき乗と平方根）

## PowerShellを電卓として使う
PowerShell上ではプロンプトに対して数式を入力することで簡単な四則演算をすることができます。

使える演算子

- +：加算

- -：減算

- *：乗算

- /：除算

- %：剰余

さらに()を使って優先順位を制御したり=を使って変数へ代入することもできます。
変数に対してなら、単項演算子のインクリメント/デクリメントも使用できます。

```
> (1+2)*3/(4-5)
-9
> $x=5
> $x--
> $x
4
```

## べき乗と平方根を使いたい
ここでもう一声、べき乗や平方根の計算ができるとさらに便利かな？ということで調べてみました。.NETのMathクラスを使うと計算できます。が、べき乗はPowerじゃないんだ。(^^;;

エクセル関数との対比

|   | エクセル関数 | PowerShellメソッド |
| --- | --- | --- |
| べき乗 | POWER(数値, 指数) | [Math]::Pow(数値, 指数) |
| 平方根 | SQRT(数値) | [Math]::Sqrt(数値) |

関数化してみる

```power.ps1
function power($num, $index) {
    [Math]::Pow($num, $index)
}
```

```sqrt.ps1
function sqrt($num) {
    [Math]::Sqrt($num)
}
```

ただね、PowerShellの関数呼び出しは引数をカッコで括らないからちょっと違和感あるかな。

``` powershell
(*'-') >> power 2 3
8
(*'-') >> sqrt 9
3
```

## 他に何ができる？
Mathクラスで他に使えるメソッドやプロパティを知りたい時は`Get-Member`で調べましょう。

``` powershell
(*'-') >> [Math] | Get-Member -Static
```
ラズパイ２のセットアップ（メモ）

##環境
OS : OSX Yosemite 10.10.4　

##準備したもの
- ラズベリーパイ2 B
- MicroSDカード

##MicroSDカードにOSを書き込む。

### OSのDL＆展開
買ったまんまの状態だと何もできないみたいなので、まずOSをDLします。
公式サイトのダウンロードページを見ると現在(2015-10-17日)は「Raspbian jessie」と「Rasbian wheezy」がありますが、とりあえず新しい方のjessieをzipを落としてくることにしました。

####展開する
ターミナルから展開するため以下コマンドを実行。

```command
$ unzip 2015-09-24-raspbian-jessie.zip

```

結果

```result
Archive:  2015-09-24-raspbian-jessie.zip
warning [2015-09-24-raspbian-jessie.zip]:  76 extra bytes at beginning or within zipfile
  (attempting to process anyway)
error [2015-09-24-raspbian-jessie.zip]:  reported length of central directory is
  -76 bytes too long (Atari STZip zipfile?  J.H.Holm ZIPSPLIT 1.1
  zipfile?).  Compensating...
   skipping: 2015-09-24-raspbian-jessie.img  need PK compat. v4.5 (can do v2.1)

note:  didn't find end-of-central-dir signature at end of central dir.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)

```
こんな感じの文字が出てきて、展開できませんでした。
調べてみると、tar or dittoを使うとできるらしい。
参考：

```
$ tar xvf 2015-09-24-raspbian-jessie.zip 
```


ちなみに、「wheesy」の方をunzipで試すと問題なく展開できました。



```command
$ diskutil list
```

```
$ diskutil unmountDisk /dev/disk1
```

```
$ sudo dd bs=1m if=2015-09-24-raspbian-jessie.img of=/dev/disk1
```

しばらくすると完了します（僕は30分くらいかかりました。）

以上でMicroSDカードにOSを書き込む作業完了です！
あとはMicroSDカードを取り出し、ラズベリーパイ側にさして、電源を繋げば
無事起動いたします！

※このあと、無線ＬＡＮの設定をしようとしたのですが、「jessie」版ではうまく設定できなかったので、「wheesy」版を再インストールして見たところ、つながったので一旦はそのまま行こうと思います。


## 起動してからする事

```command
$ sudo apt-get update
```

```command
$ sudo apt-get upgrade
```


シャットダウンの方法

```command
$ sudo shutdown -h now
```
ボタンを押したら通知する(電池モニター付)

※ソースと回路図、動作確認がまだですが一部賞味期限がある情報があるので公開しておきます

[ここ](http://qiita.com/sushisushiBoo/items/2fb61af6dab99aa7f75d) で作ったものを100均で買った押しボタン型ライトに組み込みます。
![IMG_4253.jpg](https://qiita-image-store.s3.amazonaws.com/0/92080/1d385399-8580-4db0-5f72-c66ea802c852.jpeg)

このボタンは単三電池3本で点灯させるものですが、単三電池2本とDCDCで3.3Vにします。
また、スイッチはロック付なのでロック無しに交換します。

押しボタンでディープスリープから起床するとともに、定期的に起床してバッテリー監視します。

バッテリー監視は、一定レベルを低下したらボタンと同じようにIFTTTで通知するとともに、MQTTを使ってクラウドに保存します。

外付けでフリップフロップによるラッチ回路をつけて押しボタンでの起床とタイマーでの起床を区別します。

ついでにIFTTTのDOボタンを試したかったので、ラッチ回路にLEDをつなげて、バッテリー監視時にMQTTのサブスクライブで状態を更新します。
LEDは次の起床時に消灯させます。

#### 主な材料
* ダイソーのボタン型LEDライト
* [ESP-WROOM-02](http://www.aitendo.com/product/11927>)
* [WiFiモジュール変換基板]
(http://www.aitendo.com/product/12121)
* [出力可変昇圧キット](http://www.aitendo.com/product/6884)
* [プッシュスイッチ](http://www.aitendo.com/product/4199)
* [2回路Dフリップフロップ(SN74HC74)](http://www.aitendo.com/product/10354)


<h3>DOボタン</H3>
ほぼ、<a href=https://www.hackster.io/devicehub-net/do-button-from-ifttt-home-automation-example-494a1a>ここ</a>そのままです

MQTTは<a href=https://www.hackster.io/devicehub-net/quick-setup-for-mqtt-testing-of-an-api-for-iot>ここ</a>や<a href=https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en-(dev096)#mqttclient>nodemcuのドキュメント</a>を参考にしました。

devicehubは<a href=https://devicehub.net/about/pricing>無料で使えます</a>が頻度、データ保存期間に制限があるようです。

<a href=http://qiita.com/snumano/items/0e96bb3b1ed9ffc90eb5>ここ</a>で紹介してあるmyThingsはiFTTTとdevicehubを合わせたようなサービスのようですがdevicehub相当をIDCF Cloudに仮想マシンで自分で建てる必要がありそうです。10/31までは3000円のクーポンが付くようで、月500円の半年分は無料のようです。

#### ソースコード
[Github](https://github.com/sushisushiboo/IoT_button)

#### 回路の様子
[iPhoneから写真が載せられない]
canvasで処理した画像をThree.jsのテクスチャとして描画する．

# やりたいこと
canvasで画像をclip処理してから，Three.jsで3D空間上に描画したい．

# やり方
clip処理はcanvasのclipメソッドで要素を切り取る．

Three.jsのテクスチャでは，img要素，canvas要素，video要素など幅広い要素をマッピングさせることができるの，それを利用する．

# 書いてみたコード

```javascript

// canvasを定義する
var imagecanvas = document.createElement('canvas'),
    imagecontext = imagecanvas.getContext('2d');

imagecanvas.width = 350;
imagecanvas.height = 350;

// クリップする円の位置と半径を指定する
imagecontext.beginPath();
imagecontext.arc(175, 175, 175, 0, Math.PI*2, false);
imagecontext.clip();

// 画像を用意する
var img4 = new Image();
img4.src = "image/***.jpg";
img4.onload = function(){
  imagecontext.drawImage(img4, 160, 0, 350, 350, 0, 0, 350, 350);

  // Textureとして指定する．以下Three.jsでよくあるオブジェクト描画と同じ
  var imagetexture = new THREE.Texture(imagecanvas);
  imagetexture.needsUpdate = true; 
  var imagematerial = new THREE.SpriteMaterial( { map: imagetexture, color: 0xffffff } );
  var imagesprite = new THREE.Sprite( imagematerial );
  imagesprite.scale.set(200, 200, 200);
  imagesprite.position.set(0, 0, 0);

  scene.add( imagesprite );
}

```

画像は読み込んでからでないと描画できないので，onloadで描画しています．

こうすると，onloadメソッドは非同期なのでfor文でループしている時は処理がうまくいかず大変ですが，そんな時は，
[image onloadをfor文で回す際の注意-Qiita](http://qiita.com/gonshi_com/items/615226b5fa355869a01c)
これのコメント欄を参考にするといいと思います．




# 参考ページ
- [canvasに画像を描画しよう（トリミングやクリッピングも）-ほんっとにはじめての HTML5](http://honttoni.blog74.fc2.com/blog-entry-187.html)
- [image onloadをfor文で回す際の注意-Qiita](http://qiita.com/gonshi_com/items/615226b5fa355869a01c)
AWSのS3で性的Webサイトを公開する手順まとめ

# 禁止されるコンテンツ

以下を守れば、わいせつでない性的コンテンツ自体は可能のようです。

[Amazon Web Services 適正利用規約](http://aws.amazon.com/jp/aup/)

> 違法行為。賭博のサイトまたはサービスの宣伝、送信、その他の提供、あるいは児童ポルノの宣伝、促進、助長を含む、一切の違法行為。

> 有害または詐欺的行為。詐欺的な製品、サービス、仕組み、またはプロモーション（例えば、一攫千金スキーム、ねずみ講、マルチ商法、フィッシング、またはファーミング）の売り込みや流布、あるいはその他の詐欺的行為への関与を含む、他人、当社の事業、または当社の評判に有害となり得る行為。

> 第三者の権利を侵害するコンテンツ。知的財産権またはその他の所有権を侵害または濫用するコンテンツ。

> 不快なコンテンツ。児童ポルノを含む、獣姦に関連する、または非合意性行為を描くコンテンツを含む、中傷的、わいせつ、虐待的、プライバシーを侵害する、もしくは不愉快なコンテンツ。

> 有害なコンテンツ。ウイルス、トロイの木馬、ワーム、時限爆弾、またはキャンセルボットを含む、システム、プログラム、またはデータを損傷する、妨害する、不正に傍受する、あるいは不正使用するコンテンツまたはその他のコンピュータ技術。


非合意性行為が禁止されているので、「くっころ」はダメのようですね。

なんか「不快なコンテンツ」の係り受けが微妙なのですが、原文(英文)は以下の通りです。

> Offensive Content. Content that is defamatory, obscene, abusive, invasive of privacy, or otherwise objectionable, including content that constitutes child pornography, relates to bestiality, or depicts non-consensual sex acts.


# 手順

[AWSのS3で静的Webサイトを公開する手順まとめ](http://qiita.com/nabettu/items/1605f78977d9909b5182)
をどうぞ！
matlabで10進数から2進数への変換

# 動作環境
以下の内容は、次に示す動作環境で実行しています。
MATLAB R2013a
MacOS Yosemite(10.10.5)

でも、ほとんどのMATLABで通用すると思います。

# なにをしたいか？
MATLABでは、`dec2bin(decimal)`を使うことで10進数を2進数に変換することができます。
しかし、ここで生成される2進数は【文字】です。
それを使って演算しようとすると怒られてしまいます。

なので、文字を数値に変換してくれる`str2num(char)`を合わせて使いましょう。
ただし、この`str2num`という関数は古いようで、試しに使うと`str2double`を使いましょうというメッセージが返ってきます。
ここは素直に従い、str2doubleを使うようにします。

# 2進数を列挙するプログラム
なんてことない記事ですが、まぁ最後に
「0からNまでの10進数をnビットの2進数(数値)に変換して
列ベクトルbinaryに格納する」サンプルプログラムをのっけておきます。

```matlab:decimal_to_binary.m
binary = zeros(N,1);
for i=1:N
    binary(i) = str2double(dec2bin(i-1,n));
end
```

ものすごくかんたん！！
Push通知がコマンドラインからは送れるのにAWS SNSにp12ファイルが設定出来ない場合

<img width="922" alt="スクリーンショット 2015-10-20 14.51.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/6406/c205a170-5667-42e7-74ee-c8cacf6c3c90.png">

`Error loading apple credentials from file`
のエラー文言が出るだけでAWS SNSに登録出来ない事案。

コマンドラインからはp12ファイルから作成したpemファイルでpush通知が送れる。

# 解決方法

キーチェーンアクセスで「認証局に証明書を要求...」の時、`CertificateSigningRequest.certSigningRequest`ファイルを作成するときに日本語を使うのを止めましょう。

これだったのを

![スクリーンショット 2015-10-20 19.15.04.png](https://qiita-image-store.s3.amazonaws.com/0/6406/14ba8617-8c63-97b1-6d83-6a5eeca70a5c.png)

これに

![スクリーンショット 2015-10-20 19.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/6406/b449cc5b-851f-2625-6c35-d2a319a889a7.png)

これで作成した`CertificateSigningRequest.certSigningRequest`ファイルを使って[Apple Developer](https://developer.apple.com)へ登録しなおしてp12ファイルを作り直しましょう。
Javascriptで自然言語文字列が何語か調べるライブラリ

某案件でチャットに流れてくる文字列が何語か調べる必要があったので探してみた。

# [franc](http://wooorm.github.io/franc/)

最初に見つかったのがこれ
`javascript language detect`とかでググったら最初に出てきたやつ　　
長文を調べるときには良さそうだけど今回使うのはチャットの短文
`今日はいい天気`程度の短文だとうまく検出できなかった
ついでに[ここ](https://github.com/wooorm/franc/tree/master/dist)に辞書データがあるんだけど
量が莫大でなんか高級感漂ってたので今回はボツ

# [guessLanguage.js](http://richtr.github.io/guessLanguage.js/)

次に見つけたやつ
こっちだと`あ`とかだけでもちゃんと日本語として検出してくれて便利
ソース読んでみるとUnicodeを文字種別に分けてこの文字はこの言語だみたいなことやってるみたい
容量も少ないしさくっとやりたいならこっちのほうがよさ気
ただし`漢`とかだと中国語として検出されてしまった

# [node-language-detect](https://github.com/FGRibreau/node-language-detect)

使ってないけど一応見つけたので貼っておく
PostgreSQLでテーブルを空にしてindexも最初から振り直す




### 環境
- PostgreSQL: 9.4.4


### やったこと

何回かtrncateしてデータインポートしてたら、
どんどんIDが大きくなってることに気づいてしまった。

truncateしたらauto incrementのIDも
1から振りなおしてほしい。


ということで、

    TRUNCATE TABLE table_name RESTART IDENTITY;


で解決。

RESTART IDENTITYを入れないとだめでした。
WPF MVVMLight　ButtonのCommandにRelayCommandをバインドしたけど動かなかった時の対処メモ

**MVVM Light**を使ってWPFのアプリケーションを作っていたときのこと。

**Button**の**Command**に**ViewModel**の**RelayCommand**をバインドして、ボタン押下の処理を**ViewModel**で行おうとした。
しかしCanExecuteの処理が呼ばれない。そのためボタンの有効/無効が更新されない。そして押せない。困った。

## 結論
```csharp:誤
using GalaSoft.MvvmLight.Command;
```
```csharp:正
using GalaSoft.MvvmLight.CommandWpf;
```
usingの指定間違ってました。**Wpf**がついてる方使いましょう。
そもそもなぜ間違ったのか。それは「ctrl+.」でusingひっぱったらwpfなしの方が使われたから。気づかなくて一時間悩んだ…。

##### 使用例としてはこんな感じです（細かい指定は省略）。
```xml:XAML
<Button Command="{Binding BtnCommand}" />
```
```csharp:ViewModel
using GalaSoft.MvvmLight.CommandWpf;

～省略～

private RelayCommand _btnCommand;
public RelayCommand BtnCommand
{
    get
    {
        return _btnCommand ?? (_btnCommand = new RelayCommand(
            () =>
            {
            },
            () =>
            {
                /* ここが呼ばれなくて困った。*/
            }));
    }
}
```

…これにはまったの２回目…。なのでメモ。
groovyでgitのリモートブランチとタグがほしい

# groovyでgitのリモートブランチとタグがほしい

なんで jenkins の Extended Choice Parameter plugin のスクリプト groovy しか無いんだよ…

```groovy
def repos = "ssh://git@some_repos.git"
def p = String.format("git ls-remote --heads --tags %s", repos).execute(null, null)
p.waitFor()

p.inputStream.readLines().collect {
    def pair = it.split()
    if (pair[1] =~ /refs\/heads/) {
        pair[1].replaceAll(/refs\/heads/, "origin")
    } else {
        pair[1].replaceAll(/refs\/tags\//, "")
    }
}
```
ディレクトリごとに環境変数を定義 - direnv

## 概要

direnvは**ディレクトリごとに環境変数を定義する**ことが出来るツールです。direnvで定義されたディレクトリがカレントになった場合にのみ環境変数が有効になります。

例えば、本来bundlerでインストールしたgemを実行しようとすると下記のように冗長になります。

```lang:ターミナル
$ bundle exec rails c
```

direnvを用いてパスを通すことで下記のように簡略化が可能です。

```lang:ターミナル
$ rails c
```

## 手順

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

homebrewでも取り扱っているので、brewコマンドでインストールします。

```lang:ターミナル
$ brew install direnv
```

### 2.direnvの設定を行う

direnvを利用出来るようにする為にシェルの設定ファイル(~/.bashrcなど)に下記を追記します。

```lang:~/.bashrc
eval "$(direnv hook bash)"
```

ちなみにzshを利用している場合は下記のように変更してください。

```lang:~/.zshrc
eval "$(direnv hook zsh)"
```

追記したら設定を反映させます。

```lang:ターミナル
$ source ~/.bashrc
```

### 3.direnv用に環境変数を設定する

環境変数を設定したいディレクトリに移動して、設定ファイルを設置します。

まずは該当ディレクトリに移動します。

```lang:ターミナル
$ cd project_dir
```

`.envrc`というファイル名で設定ファイルを設置します。今回は`project_dir/bin`にパスを通します。

```lang:.envrc
export PATH=./bin:$PATH
```

例えば、npmの実行ファイルにパスを通したい場合は下記。

```lang:.envrc
export PATH=$(npm bin):$PATH
```

最後にdirenvの設定を反映します。

```lang:ターミナル
$ direnv allow
```

ここまでの作業で環境変数が反映されてパスが通ったと思います。パスを通す以外にも、そのディレクトリだけで使いたい環境変数があれば有効活用してみてください。
カレントディレクトリ以下のファイル、ディレクトリ名を一括置換するコマンド


```
find **/* | sed 'p;s/変更前/変更後/' | xargs -n2 mv
```

#### ファイルだけの場合
```
find **/* -type f | sed 'p;s/変更前/変更後/' | xargs -n2 mv
```

#### ディレクトリだけの場合
```
find **/* -type d | sed 'p;s/変更前/変更後/' | xargs -n2 mv
```

#### ちなみに
大量のファイルの中身を置換するのは、色々試しましたが、Sublime Textの置換を使う方法が簡単で速かったです。
CentOSでrevelインストールしようとしたらgo getで固まる

CentOS上でRevel開発してみよう！と思ったらインストールではまったのでメモ

# 現象

[公式](http://revel.github.io/tutorial/gettingstarted.html)のとおり以下手順で実施

```bash
go, git, hgインストール（省略）
mkdir ~/gocode
echo 'export GOPATH=~/gocode' >> ~/.bash_profile
source ~/.bash_profile

go get github.com/revel/revel

返ってこない・・・
```

ずっとこのままの状態。git clone がうまくいってないような

```
[root@server ~]# ps -ewf | grep go
root     24409 24377  0 10:33 pts/0    00:00:00 go get -u github.com/revel/revel
root     24575 24409  0 10:34 pts/0    00:00:00 git clone https://gopkg.in/fsnotify.v1 /root/gocode/src/gopkg.in/fsnotify.v1
root     24576 24575  0 10:34 pts/0    00:00:00 git-remote-https https://gopkg.in/fsnotify.v1 https://gopkg.in/fsnotify.v1
root     24580 24576  0 10:34 pts/0    00:00:00 git fetch-pack --stateless-rpc --lock-pack --thin --no-progress https://gopkg.in/fsnotify.v1  efs/heads/master  efs/heads/travisci  efs/heads/v0  efs/tags/v0.8.06  efs/tags/v0.8.07  efs/tags/v0.8.08  efs/tags/v0.8.09  efs/tags/v0.8.10  efs/tags/v0.8.11  efs/tags/v0.8.12  efs/tags/v0.8.13  efs/tags/v0.9.0  efs/tags/v0.9.1  efs/tags/v0.9.2  efs/tags/v0.9.3  efs/tags/v1.0.0  efs/tags/v1.0.2  efs/tags/v1.0.3  efs/tags/v1.0.4  efs/tags/v1.1.0  efs/tags/v1.1.1  efs/tags/v1.2.0  efs/tags/v1.2.1
```

# 原因

gitのバグとのこと。
http://oranie.hatenablog.com/entry/20141104/1415103858
https://github.com/spf13/hugo/issues/297

CentOSのBaseリポジトリ(yum)だとたしかに1.7.1でした。

# 対応

gitバージョンアップしてみる
[ソース](https://www.kernel.org/pub/software/scm/git/)
[インストール手順](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

```
# yumで入れてたやつ消す
yum remove git

# ソースインストール
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc
wget https://www.kernel.org/pub/software/scm/git/git-2.6.2.tar.gz
tar xzf git-2.6.2.tar.gz
cd git-2.6.2
make prefix=/usr/local all
make prefix=/usr/local install

# 確認
[root@server ~]# git version
git version 2.6.2
[root@server ~]# which git
/usr/local/bin/git
```

できた！！！！！

```shell-session

[root@server ~]# go get github.com/revel/revel
[root@server ~]# go get github.com/revel/cmd/revel
[root@server ~]# which revel
/root/gocode/bin/revel
[root@server ~]# revel
~
~ revel! http://revel.github.io
~
usage: revel command [arguments]

The commands are:

    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line

Use "revel help [command]" for more information.
```
SSH 関連覚え書き

# サポートしている cipher, mac, key exchange の確認
```shell-session
% ssh -Q cipher
% ssh -Q mac
% ssh -Q kex
```
# ssh のデバッグ
```shell-session
% ssh -vvv -o LogLevel=DEBUG3
```

### これが最強？
```shell-session
% ssh -c aes256-gcm@openssh.com -m umac-128-etm@openssh.com -o KexAlgorithms=curve25519-sha256@libssh.org target-host
```
### Chipers, MACs の設定文字列生成
```shell-session
% ssh -Q cipher |grep -v cbc |tr '\n' ,
```

# その他
- etm: encrypt-then-mac
tvOSでRealmをpodでインストールする

はじめに

**tvOS**

```
tvOSは現在ベータ版ですが、私たちは現在RealmがtvOSの上でどのように利用できるのか検証しています。もし、現時点でRealmをtvOS上で動作させる場合は、あくまでも開発のためにだけ利用し、プロダクションの用途にはまだ適していないことにご注意ください。 詳しくはこちらのPull Request #2506の議論をご覧ください。
```

とのこと（ https://realm.io/jp/docs/swift/latest を参照）

```rb:Podfile
use_frameworks!
pod 'Realm', :git => 'https://github.com/realm/realm-cocoa.git', :branch => 'seg-tvos'
pod 'RealmSwift', :git => 'https://github.com/realm/realm-cocoa.git', :branch => 'seg-tvos'
```

`$ pod install`
SSHキーの作成

#ローカルでSSH鍵を作成する
SSHでGitHubややBitbucketのリポジトリにアクセスするときにSSHの鍵認証をするために、SSHキーのローカルマシンでの生成の仕方。

リモートリポジトリをローカルにクローンするときは```git clone```しようとすると

```Warning: Permanently added 'bitbucket.org,xxx.xxx.xxx.x' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: Could not read from remote repository.```

みたいなが出てしまうときは鍵が、登録されているか確認してみましょう。


**SSHキーの作成**
```$ ssh-keygen```
鍵はデフォルトだとid_rsaとid_rsa.pubという名前でペアで、`/Users/Username/.ssh/`(Macの場合)に作成されます。この場合id_rsaの方が秘密鍵でid_rsa.pugが公開鍵です。秘密鍵は他人に見せてはいけません。

**鍵の生成が始まる**
```Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): XXXXX```
鍵の名前を指定する場合はXXXXXとしているところに任意の名前を入力してリターンキーを押す。

続いてパスフレーズを入力(必要なければそのままリターンキーを押す)
```Enter passphrase (empty for no passphrase): ```
こちらは忘れてしまうとアクセスできなくなるようです。

ホスティングサービスのアカウントの設定画面にSSHを追加するメニューがあるので、```id_rsa.pub```の内容をペーストして登録します。Bitbucketだとこんな感じです。

![image](https://qiita-image-store.s3.amazonaws.com/0/95896/1f81bc31-aacb-9d7a-b4e9-7bf1ef0b87a8.png)

再度```git clone```してみると鍵が登録されていれば今度はcloneできるはずです。
UINavigationControllerで2つ以上前の画面に戻る方法

# 参考

[How do I pop two views at once from a navigation controller?](http://stackoverflow.com/questions/8236940/how-do-i-pop-two-views-at-once-from-a-navigation-controller)

# 実装方法

```swift
// rootViewControllerに戻る
navigationController?.popToViewController(navigationController!.viewControllers[0], animated: true)
// または
navigationController?.popToRootViewControllerAnimated(true)

// rootViewControllerの1つ先のViewControllerに戻る
navigationController?.popToViewController(navigationController!.viewControllers[1], animated: true)

// rootViewControllerの2つ先のViewControllerに戻る
navigationController?.popToViewController(navigationController!.viewControllers[2], animated: true)

// １つ前のViewControllerに戻る
navigationController?.popViewController(animated: true)

// 2つ前のViewControllerに戻る
let index = navigationController!.viewControllers.count - 3
navigationController?.popToViewController(navigationController!.viewControllers[index], animated: true)
```

# 実践的な方法

以下のStackoverflowで紹介されているように、`UINavigationController`を拡張すると便利です。

https://stackoverflow.com/a/23650545

```UINavigationController+.swift
extension UINavigationController {

    func popToViewController(ofClass: AnyClass, animated: Bool = true) {
        if let vc = viewControllers.filter({$0.isKind(of: ofClass)}).last {
            popToViewController(vc, animated: animated)
        }
    }

    func popViewControllers(viewsToPop: Int, animated: Bool = true) {
        if viewControllers.count > viewsToPop {
            let vc = viewControllers[viewControllers.count - viewsToPop - 1]
            popToViewController(vc, animated: animated)
        }
    }
}

```

```HowToUse.swift
// pop to SomeViewController class
navigationController?.popToViewController(ofClass: SomeViewController.self)

// pop 2 view controllers
navigationController?.popViewControllers(viewsToPop: 2)
```
[Elixir] Phoenixで日付／時間を扱う

# やりたいこと

下記のような日付と時間を扱った処理をスマートにやるにはどうすればよいか調べてみた。
- 現在のロケールの現在時刻から12時間進めた日時が欲しい
- DBに保存した日付データをn日加算したい

# Elixirでの日付／時間

日時は基本的にタプルで持つ。現在時刻はErlangのCalendarモジュールから取得できる。

```ex
# UTC現在時刻
utc_now = :calendar.universal_time
{{2015, 10, 20}, {8, 12, 25}}

# ローカル現在時刻
jst_now = :calendar.local_time
{{2015, 10, 20}, {17, 11, 17}}
```

## 一般的な日時処理（時間の加算など）

[Timex](https://github.com/bitwalker/timex)を使うのが一般的か。

```ex
use Timex

# 10月31日の1ヶ月後
next_month = {{2015, 10, 31}, {0, 0, 0}} |> Date.from |> Date.shift(months: 1) |> DateConvert.to_erlang_datetime

# 1時間後
an_hour_later = Date.local |> Date.shift(hours: 1) |> DateConvert.to_erlang_datetime

# 2日前
two_days_ago = Date.local |> Date.shift(days: -2) |> DateConvert.to_erlang_datetime
```

## Ecto.DateTimeでの日時処理

[Using with Ecto](https://hexdocs.pm/timex/extra-using-with-ecto.html)にある方法でModelの日時関係プロパティをTimexモジュールのものに**しない場合**は下記のようにキャストしてから加算／減算する。

```ex
defmodule Demo.Person do
  use Demo.Web, :model

  schema "people" do
    field :name, :string
    field :born_at, Ecto.DateTime
    timestamps
  end
end

john = Repo.get!(Demo.Person, 1)

# Johnの誕生日を7日前にずらす
seven_days_ago = john.born_at
                 |> Ecto.DateTime.to_erl
                 |> Date.from
                 |> Date.shift(days: -7)
                 |> DateConvert.to_erlang_datetime
                 |> Ecto.DateTime.from_erl
Repo.update! %{john | born_at: seven_days_ago}

```

何故こんな面倒なことをするのか？上記ガイドに従って、Timex.Ecto.DateTimeにしても良いんじゃないか？
→日時処理を簡便化するためだけにModelを書き換え、その他モジュールで日時を扱う箇所を全部直し…って大げさすぎませんかね？（感想）

## あとがき

Timexを使えば直感的に日時をコントロールできる。素敵。
でもEctoが絡むとどうもスマートになりきれていな気がする。
Building PHP 5.2.17 with PHPBrew on OS X

# はじめに
PHPBrew を使って Mac に PHP 5.2.17 を入れようとしたらコケたので解決手順をメモ．いまどき，こんなに古い PHP をビルドしたい人はいないと思うが，大人の事情でビルドしなきゃいけない人もいるんです．

以下の環境に，

- OS X Yosemite 10.10
- Homebrew

以下の環境をつくる．

- MySQL
- PHPBrew
- PHP 5.2.17 (with PHP-FPM)

# 準備
## MySQL のインストール
MySQL をインストール．

```zsh
$ brew install mysql
...略
==> Caveats
A "/etc/my.cnf" from another install may interfere with a Homebrew-built
server starting up correctly.

To connect:
    mysql -uroot

To reload mysql after an upgrade:
  launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Or, if you don't want/need launchctl, you can just run:
  mysql.server start
```

と書いてあるので，自分の環境に合わせて MySQL サーバの起動を行う．

続いて，初期設定を行う．

```zsh
$ mysql_secure_installation
```

## PHPBrew のインストール
PHP のビルドに必要なパッケージ[^1]をインストール．

```zsh
$ brew install automake autoconf curl pcre re2c mhash libtool icu4c gettext jpeg libxml2 mcrypt gmp libevent
$ brew link icu4c --force
$ brew link openssl --force
```

公式ドキュメントには書いてないけど，`libxml2-2.7.8` もインストール．今回の古い PHP のビルドで使います（新しい PHP は新しい `libxml2` に対応しているのだが…）．

```zsh
$ brew install homebrew/versions/libxml278 
```

PHPBrew をインストール．

```zsh
$ brew install phpbrew
```

初期設定．

```zsh
$ phpbrew init
```

`.bashrc` とか `.zshrc` に以下の行を追加．

```zsh
[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc
```

# PHP のビルド
いよいよ PHP 5.2.17 をビルドしていきます．

ビルドファイルにバグ修正パッチとか PHP-FPM 追加パッチを当てて[^2]，

```zsh
$ phpbrew update --old      
$ phpbrew download --mirror http://museum.php.net/php5/ 5.2.17
$ cd ~/.phpbrew/build/php-5.2.17/
$ curl -s "https://mail.gnome.org/archives/xml/2012-August/txtbgxGXAvz4N.txt" | patch -p0
$ curl -s "https://bugs.php.net/patch-display.php?bug_id=54736&patch=debian_patches_disable_SSLv2_for_openssl_1_0_0.patch&revision=1305414559&download=1" | patch -p1
$ curl -s "http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz" | gunzip -c | patch -p1
```

ビルド[^3]．

```zsh
$ CXX=g++ phpbrew --debug install --old 5.2.17 +default +fpm +mysql -- --enable-force-cgi-redirect --enable-fastcgi --with-libxml-dir=/usr/local/Cellar/libxml278/2.7.8 --with-mysql --with-mysqli --with-pdo-mysql 
```

使用する PHP のバージョンを切り替え．

```zsh
$ phpbrew switch 5.2.17
```

PHP-FPM は以下で動作します．

```zsh
$ phpbrew fpm start
$ phpbrew fpm stop
```

# 脚注
[^1]: https://github.com/phpbrew/phpbrew/wiki/Requirement
[^2]: https://github.com/phpbrew/phpbrew/issues/478#issuecomment-83869028
[^3]: Mac 標準の gcc でビルドしないとオプションがなくてビルドがコケるので，Homebrew とかの gcc に変更している人は要注意．