OmniAICreator/Qiita-1.07M huggingface dataset:
zsh + peco + anyframeの導入(For Mac)


# zshとは?
それはとてもとても気持ちのいいシェル

# pecoとは?
[@lestrrat](https://twitter.com/lestrrat)さん作のテキストをインクリメンタルサーチするツール。[githubのREADMEにあるDEMO](https://github.com/peco/peco)を見るとイメージしやすい。

# anyframeとは?
[@mollifier](https://twitter.com/mollifier)さん作のpecoをzshから便利に利用するための[プラグイン](https://github.com/mollifier/anyframe)。

# 準備
- Homebrewを使えるようにしておく

# zshの設定

## zshをインストール
当方の環境ではzshのバージョンが5.0.2と、後述で利用する「cdr」コマンドが含まれていなかったため、Homebrewで最新をインストールしておきます
※既に5.0.2以降のバージョンを利用している場合は不要

```bash
$ brew update // 必要に応じて
$ brew install zsh
```

## インストールしたzshを有効にする
### インストールしたzshを/etc/shellsに追加
```bash
$ sudo sh -c "echo '/usr/local/bin/zsh' >> /etc/shells"
```

### シェルを切り替える
```bash
$ chsh -s /usr/local/bin/zsh
```

### バージョンを確認する
```bash
$ zsh --version
zsh 5.0.7 (x86_64-apple-darwin13.4.0)
```

## cdrコマンドを使えるように.zshrcに以下を追記する
```bash:~/.zshrc
## cdr
autoload -Uz add-zsh-hock
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
```

## zshのプラグインを管理するantigenを導入する
### githubよりモジュールをダウンロードする
```bash
$ mkdir ~/.zsh
$ cd ~/.zsh
$ git clone git@github.com:zsh-users/antigen.git
```

### .zshrcに以下を追記する
```bash:~/.zshrc
## antigen
if [[ -f $HOME/.zsh/antigen/antigen.zsh ]]; then
  source $HOME/.zsh/antigen/antigen.zsh
  antigen apply
fi
```

# pecoの設定
## pecoをインストール
```bash
$ brew tap peco/peco
$ brew install peco
```

# anyframeの設定
## antigenを利用してanyframeをインストールするため、.zshrcに以下を追記する
```bash:~/.zshrc
## antigen
if [[ -f $HOME/.zsh/antigen/antigen.zsh ]]; then
  source $HOME/.zsh/antigen/antigen.zsh
  antigen bundle mollifier/anyframe # 追加
  antigen apply
fi
```

## .zshrcを反映する
```bash
$ source ~/.zshrc
```

# デモ
## anyframe-widget-cdrコマンド(cdrをインクリメンタルサーチ)を使ってみる

![ezgif.com-optimize_3.gif](https://qiita-image-store.s3.amazonaws.com/0/13534/3cc832d5-66e3-f668-ed82-858fdcf230dc.gif "ezgif.com-optimize_3.gif")

# 謝辞
## 参考文献
詳細は「zsh大活用」と題して[WEB+DB PRESS vol.83](http://gihyo.jp/magazine/wdpress/archive/2014/vol83)に特集されてますので、詳しく知りたい方は是非購入しましょう!!他にも便利なコマンドや使い方が詳しく書かれています！

## 参考サイト
- https://github.com/mollifier/anyframe
- https://github.com/peco/peco
- [例えば、pecoをビルドしない](http://qiita.com/lestrrat/items/de8565fe32864f76ac19)
Mac で VPN 接続時に社内ドメインにアクセスしたい

Mac から VPN で社内のネットワークに接続している時に、社内サーバーにドメインでアクセスしたいケースがあると思います。

すべてのトラフィックを VPN 経由にしたり、ルーティングを変更したりすればできるらしいですけど、社内のドメインのみに限ればもう少し綺麗で楽なやり方がありました。

* 社内ドメインを intra.example.com
* 社内の DNS サーバーを 192.168.xxx.yyy

とした場合、以下のように /etc/resolver/intra.example.com というファイルを作成します。

```:intra.example.com
nameserver 192.168.xxx.yyy
search_order 1
```

これで、社内ドメイン intra.example.com へのアクセス時に（サブドメインも含む） 社内 DNS サーバー 192.168.xxx.yyy を使ってくれるようになります。

ただし、この手法は VPN とは全く関係ないので、直で社内のネットワークに接続している時はどうなるか検証できていません。
【iOS】【swift】加速度センサー CMMotionManager

CMMotionManagerの基礎的な動きを。

まずは、importを


```swift

import CoreMotion

```

次に、


```swift

manager = CMMotionManager()
//取得の間隔
manager.accelerometerUpdateInterval = 0.01;
let handler:CMAccelerometerHandler = {(data:CMAccelerometerData!, error:NSError!) -> Void in
            println(data.acceleration.x)
            println(data.acceleration.y)
            println(data.acceleration.z)

        }

//取得開始
manager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:handler)


```


停止について


```swift

if (manager.accelerometerActive) {
    manager.stopAccelerometerUpdates()
}

```




ジャイロなどについてもまとめれば。。
CentOSにpyenvとrbenvをシステム全体にインストール


pyenvはPythonを
rbenvはRubyを複数バージョン管理したいときに使います。

今回、pyenvもrbenvも`/usr/local`にインストールすることにしました。

他にもphpenvやplenvやanyenvだとか、たくさんの派生リポジトリがあるみたいです。とりあえず今回はPythonとRuby２つについてインストールしてみました。他も同じやりかたでできるはず？

`/etc/profile.d/`以下に書かれたファイルの設定を読んでsudoするため`sudo -i`を使うっていうのが面倒な程度です。


## pyenv

`/usr/local`に置きます。

```shell
sudo git clone git://github.com/yyuu/pyenv.git /usr/local/pyenv
sudo git clone git://github.com/yyuu/pyenv-virtualenv.git /usr/local/pyenv/plugins/pyenv-virtualenv
```

起動時に読まれるファイルを書いて・・・

```/etc/profile.d/pyenv.sh
export PYENV_ROOT="/usr/local/pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"
```

シェルを再起動します

```
exec $SHELL -l
```

## rbenv

こちらも同様です。

```shell
sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv
sudo git clone git://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build
```

起動時に読まれるファイルを書いて・・・

```/etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
```

シェルを再起動します

```shell
exec $SHELL -l
```

`which ruby`や`which python`で新しく設定したパスが出てきたら成功です。



## 使い方
基本の使い方はどちらも似ていて、

```shell
# インストール可能なバージョン一覧を出す
pyenv install -l
# 所定のバージョンをインストール(この場合3.4.2)
sudo -i pyenv install 3.4.2
# 所定のバージョンがインストールされたことを確認
pyenv versions

# 特定フォルダー以下でのみ使いたい場合
cd /home/jibun/python3/
pyenv local 3.4.2
sudo -i pyenv rehash

# 全体に設定する場合
pyenv global 3.4.2
sudo -i pyenv rehash
```

```shell
# インストール可能なバージョン一覧を出す
rbenv install -l
# 所定のバージョンをインストール(この場合2.1.3)
sudo -i rbenv install 2.1.3
# 所定のバージョンがインストールされたことを確認
rbenv versions


# 特定フォルダー以下でのみ使いたい場合
cd /home/jibun/ruby2.1/
rbenv local 2.1.3
sudo -i rbenv rehash


# 全体に設定する場合
rbenv global 2.1.3
sudo -i rbenv rehash
```



今回参考にした記事は以下になります。
http://qiita.com/la_luna_azul/items/3f64016feaad1722805c
http://qiita.com/youcune/items/a5cc93313641b69b62f8
hubotで実行したスクリプトの回数をカウントするスクリプト

# 概要
最近社用でhubotを使って遊んでいるが、ふと自分の作ったスクリプトのうちどれがよく使われるのか気になったので、スクリプトの実行回数をカウントするスクリプトをつくってみた。

# 機能
* hubotで何かしらのコマンドを実行する度にそれぞれのコマンドの実行回数をカウント
* sc(script count)コマンドによる実行回数の参照、更新

# インストール
## インストールコマンド
```bash:install
$ cd path/to/myhubot  #package.jsonがあるディレクトリへ移動 
$ npm install hubot-script-counter -save
```

## 設定の編集
```json:external_scripts.json
["hubot-script-counter"]  #"hubot-script-counter"を配列に追加(既に何か追加されている場合はカンマ区切りで追加)
```


# 使い方
```:scコマンド
Hubot> hubot sc  # 各スクリプトの実行回数表示
Hubot> ship : 1
time : 2
ping : 1
sc : 1
Hubot> hubot sc set ship 10  # shipスクリプトの実行回数を10に設定
Hubot> set 10 to script_ship
Hubot> hubot sc
Hubot> time : 2
ping : 1
sc : 3
ship : 10
Hubot> hubot remove time     # timeスクリプトの実行回数を削除
Hubot> hubot sc remove time
Hubot> removed script_time
Hubot> hubot sc
Hubot> ping : 1
sc : 5
ship : 10
Hubot> hubot sc reset        # 全スクリプトの実行回数を削除
Hubot> sc reset done
Hubot> hubot sc
Hubot> sc : 1

```

# ソースコード
https://github.com/marshi/hubot_script_counter
NSEとは何か

# NSEとは何か

@dichikaさんによる素晴らしdplyrの紹介。
http://d.hatena.ne.jp/dichika/20141027




Non Standard Evaluation (NSE)とは、関数内部から、その関数を呼び出した時の引数の**値**じゃなくて**表現式**そのものを、
関数の中での処理に利用しようという引数評価の方法です。


ある関数が引数を扱うとき、普通は興味あるのはその引数の**値**。
ところがRでは関数内部で、関数に与えられた引数の表現式を知ることができる。別にRに限った話じゃないけど。

以下の`f()`（通常評価）と`g()`（NSE）の違いを見れば一目瞭然で、


```r
f = function(i, j, k) {
  print(i)
  print(j)
  print(k)
  }

g = function(i, j, k) {
  print(substitute(i))
  print(substitute(j))
  print(substitute(k))
}
  

x = "orz"

f(i = 1, j = mean, k = x) 
## [1] 1
## function (x, ...) 
## UseMethod("mean")
## <bytecode: 0x7ff59bbb6ce0>
## <environment: namespace:base>
## [1] "orz"
g(i = 1, j = mean, k = x) 
## [1] 1
## mean
## x
```

この引数に対する`g()`的な評価のしかたをNon Standard Evaluation (NSE)と呼ぶのである。

どう使うかというと、一般的にはデータフレームとかリストとかのデータを与えて、その要素を指定する状況が多分、圧倒的におおい。
例えば、


```r
# Standard evaluation
m = function(d, i) {
  d[[i]]
  }

m(mtcars, "vs")
##  [1] 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1
m(mtcars, vs)
## Error in (function(x, i, exact) if (is.matrix(i)) as.matrix(x)[[i]] else .subset2(x, :  オブジェクト 'vs' がありません

# NSE
n = function(d, i) {
  d[[deparse(substitute(i))]]
  }

n(mtcars, "vs")
## NULL
n(mtcars, vs)
##  [1] 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1
```

何がオトクかというと、引数に変数名を与えるときに""で囲わなくてよい、とか、まあ色いろあるんだけど、あんまり気にしないでいいと思う。
`subset()`の`subset`とかをNSEじゃない方法で与えるとか、結構面倒かも。



@dichika さんの元記事の例


```r
# NSE
iris %>% group_by(Species) %>% summarise_each(funs(min, mean, median, max), Sepal.Width)
## Error in eval(expr, envir, enclos):  関数 "%>%" を見つけることができませんでした

# ふつー評価
iris %>% group_by(Species) %>% summarise_each_(funs(min, mean, median, max), "Sepal.Width")
## Error in eval(expr, envir, enclos):  関数 "%>%" を見つけることができませんでした
```

列名を変数で与えたいときなんかはふつー評価でやる。

---

以下余談。RではこのNSEが実に多用されているのである。

例えば`subset`。


```r
subset(mtcars, subset = disp == max(disp))
##                     mpg cyl disp  hp drat   wt  qsec vs am gear carb
## Cadillac Fleetwood 10.4   8  472 205 2.93 5.25 17.98  0  0    3    4
```

ここで`disp == max(disp)`というのは引数の値ではなくて表現式で、
これを呼び出し元で評価しても失敗する。
なぜなら`disp`なんていうオブジェクトはどこにも無いからで、それは`mtcars`の中にしかない。
つまり、これは失敗する。


```r
cond = disp == max(disp); subset(mtcars, subset = cond)
## Error in eval(expr, envir, enclos):  オブジェクト 'disp' がありません
## Error in eval(expr, envir, enclos):  オブジェクト 'cond' がありません
```

ちょっと凝ったことしてプロミス化しても



```r
delayedAssign("cond", disp == max(disp))
subset(mtcars, subset = cond)
## Error in eval(expr, envir, enclos):  オブジェクト 'disp' がありません
```

無駄。

ちなみに`subset`の列選択とか、もう無茶苦茶な感じがするが、これはこれで便利である。


```r
head(subset(mtcars, select = c(mpg, wt:am)))
##                    mpg    wt  qsec vs am
## Mazda RX4         21.0 2.620 16.46  0  1
## Mazda RX4 Wag     21.0 2.875 17.02  0  1
## Datsun 710        22.8 2.320 18.61  1  1
## Hornet 4 Drive    21.4 3.215 19.44  1  0
## Hornet Sportabout 18.7 3.440 17.02  0  0
## Valiant           18.1 3.460 20.22  1  0
```
RDS(MYSQL5.6)の Security Advisory について


RDS(MySQL) 使っているなら、AWS からメールでなんだこれ、いきなりやーと阿鼻叫喚な先月から立て続けにあるイベント。
ほんとため息しかでない。
ちなみに、先月のメンテ( Xen の脆弱性対応)と違い、今回は MySQL 自身のアップデート。
で、今の状況整理。

MySQL5.5(5.5.40)についてのアップデートメンテは完了。

MySQL5.5(5.6.21)につては、以下の公式フォーラムで"無制限アクセスを許可していない MySQL 5.6 インスタンス"のメンテは延期されている。


[Discussion Forums ](https://forums.aws.amazon.com/ann.jspa?annID=2669)


以下抜粋

---

無制限アクセスを許可していないMySQL 5.6 インスタンスに関して、当初日本時間2014年10月21日早朝のアップグレード開始を予定しておりました。しかし、特定の条件において、MySQL 5.6リードレプリカが、5.6.21 へのアップグレード後にクラッシュする可能性があることが判明し、アップグレード開始を見合わせて頂きました。この問題は、下のページで記述されているMySQL 5.6.4で導入されたdate型やtimestamp型のカラムの格納フォーマットに関連しています。
https://dev.mysql.com/doc/refman/5.6/en/upgrading-from-previous-series.html

このフォーマット変更のため、 5.6.4 より前のバージョンで稼動している（もしくはそれらのバージョンからアップグレードされた）マスタから、date型やtimestamp型のカラムを変更する 行ベースログのトランザクション を 5.6.21 のリードレプリカが受信した際に、リードレプリカがクラッシュをする可能性があります。対応方法を含む、詳細につきましては、下のページにある "Known Issues and Limitations" をご覧ください。
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html#MySQL.Concepts.KnownIssuesAndLimitations

また、MySQL 5.6.20より始まった blob のログ出力方法との非互換性を考慮し、12.8MB 以上のサイズの blob を変更する場合には "innodb_log_file_size" パラメータを 変更する blob の最大サイズの 10 倍に調整する必要があります。この変更の詳細につきましては、下のページをご覧ください。
http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html

---

で読んでみたけどよくわからん、今回の延期はなんで？

---

・延期理由1
とりあえずリードレプリカがぶっ壊れる。
これはもともと MySQL5.5 を使用していて、その後 MySQL5.6 へアップグレートしたもので発生。
Why? 
→MySQL 5.6.4 で導入された date 型や timestamp 型のカラムの格納フォーマットの違い。
　ようは小数部の扱いやTime フォーマットの違いで発生。

しかし、発生する可能性は低いんじゃないか。
*これ試していないけど、binlog の V1 を使うことでなんとかならんのかな？

　
・延期理由2
アップグレードしたらストレージが一杯。
これは兼ねてよりあった checkpoint が上書きされる Bug の修正に対応したものだろう。
RDS 側で自動的に対応
→既存 max allow packe の10倍の数値を innodb_log_file_size に設定。
(AWSからメールで変更したよと連絡あり。)
これは、ようは max allow packe に収まるクエリなら、checkpoint 処理で上書きされることを回避できるだろうという理由だろう。

で例えば max allow packe を 1GB にしてたら、勝手に innodb_log_file_size　が 10GB　に。
この数値はなんかよくわからないけど、だめだろうと思う人がほとんどだろう。ええほんとうに・・。

以下影響あること。

・Crashrecovery がクソながくなる。
[Choosing proper innodb_log_file_size](http://www.percona.com/blog/2006/07/03/choosing-proper-innodb_log_file_size/)
古いversionだけど、あれからCrashrecoveryのスピードが上がっても時間がかかるものはかかる。
1GB per 10 minutes of recovery time


・redo_log の flushing に間接的に関係してくる。
[innodb_adaptive_flushing_lwm](http://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_adaptive_flushing_lwm)

昔運用していた MySQL は、水平分割してたとはいえ、100万 DAU のソーシャルゲームでも 512MB で余裕。

---
Homebrew のインストール

**★Homebrew とは**
Macのパッケージ管理システム。「brew install ツール名」で簡単にソフトウェアがインストールできる。インストール場所は「/usr/local」。詳細な使い方はググればいっぱい出てきます。


**1. インストール**

```bash
$ ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)
```

**2. インストールされた場所を確認**

```bash
$ which brew
```

**3. 使用できるか確認**

```bash
$ brew doctor
```

**4. Command Line Tools インストール**

おそらく3. で Xcode の Command Line Tools が必要といわれるので、Xcodeをインストールして起動し、Preferences → Downloadsタブ「Components」から『Command Line Tools』をインストールする。ただし、Command Line Tools のインストール方法は Xcode のバージョンによって異なる可能性があるため、上記の場所にないようならググってみましょう。

**5. 再度 Homebrew が使用可能かチェック**

```bash
$ brew doctor
```
今度は「使う準備ができました」みたいなメッセージが表示されるはず。

**6. Homebrew のバージョンを確認**

```bash
$ brew -v
```

**7. Homebrew を最新の状態にする**

```bash
$ brew update
```
アップデートには git が使用される。上記のコマンドを実行すると、/usr/local/ で git の初期化が行われ、/usr/local/.git/ が作成される。
CakePHP+Bootstrapのドロップダウンメニューのバグ

スマートフォンなどで見たときに、メニューは開くが、押すことができない。PCでは問題ない。

Bootstrapのバグのようだが、以下のリンク先の方法では改善しない。
参考：http://mawatari.jp/archives/twitter-bootstrap-dropdown-menu-not-clickable-on-touch-devices

CSSに以下を追加して解決。

```
.dropdown-backdrop {
	position: static;
}
```
参考：http://atstyle.biz/blog/archives/2014/01/28/1155/
Android を使ったことない人が Android 開発に加わるときに参考としておすすめするアプリ


## はじめに
Android をあまり使ったことない人と Android 開発する機会があるときに、参考になるおすすめのアプリをまとめておいたら便利だなと思ったのでそのメモです（個人的な趣味入ってます）。

他にもいいアプリはたくさんあると思いますので、おすすめなどあれば是非コメントいただけると嬉しいです。特にグラフの描画がいい感じなアプリがあれば教えていただけるとすごく嬉しいです！

## Google 純正アプリ
まずは Google のアプリを見本とするのが一番だと思います。

中でも、Google Play、Gmail、YouTube は、ユーザの利用頻度がかなり高いと考えられ、これらのアプリで使われるナビゲーションはユーザに馴染みがありますので参考になると思います。

### Google Play
アプリ URL はない模様です。

### Gmail
https://play.google.com/store/apps/details?id=com.google.android.gm

### YouTube
https://play.google.com/store/apps/details?id=com.google.android.youtube

### Google I/O 2014
https://play.google.com/store/apps/details?id=com.google.samples.apps.iosched

### Inbox
最新の Material Design を体感したいのであればこれが一番でしょうか。
https://play.google.com/store/apps/details?id=com.google.android.apps.inbox

### （参考）Google 純正アプリ一覧
一覧で見ると意外と知らないアプリもたくさんあるのではないでしょうか。
https://play.google.com/store/apps/developer?id=Google+Inc.


## エディターのおすすめ
Google がおすすめするアプリですので、Android らしいデザインをするときに参考になると思います。

その中でも、アニメーションの遊びを入れているものをいくつかピックアップします。

### Fancy
THE お手本 といった感じのアプリです。とても良くできていると思います。
https://play.google.com/store/apps/details?id=com.thefancy.app

### Airbnb
一覧画面から詳細画面の写真の移動がいい感じです。Navigation Drawer 内のデザインがちょっと残念。
https://play.google.com/store/apps/details?id=com.airbnb.android

### Expedia
詳細画面のスクロールのアニメーションがいい感じです。
https://play.google.com/store/apps/details?id=com.expedia.bookings

### News Republic
ちょっとアニメーションやり過ぎ感はありますが、どんどん新しいものを取り入れているので、アップデートが楽しみなアプリです。
https://play.google.com/store/apps/details?id=com.mobilesrepublic.appy

### （参考）エディターのおすすめ一覧
https://play.google.com/store/apps/collection/editors_choice


## その他

### Timely
とにかくアニメーションが気持ちいいです。使い勝手も悪くないので、タイマーアプリとして使っています。このアプリ一本？で Google に買収された企業のアプリです。
https://play.google.com/store/apps/details?id=ch.bitspin.timely

### 500px
写真を扱うアプリを作るならこんな感じのものを作りたいですね。一覧ページや写真の詳細ページだけでなく、プロフィール画面からコメントの画面までしっかり作られています。
https://play.google.com/store/apps/details?id=com.fivehundredpx.viewer

### Gogobot
デザインにこだわったアプリという印象ですが、きっちりとガイドラインに沿って作られていると思います。
https://play.google.com/store/apps/details?id=com.gogobot.gogodroid
Mac で色々なアプリの設定画面を開く

Mac で利用しているアプリの設定画面をふと開きたいと思ったときにとりあえず実行してみるといいショートカットがあります。

```
Command + ,
```

です。いろいろなソフトでこのショートカットが設定されているようなので、メニューから設定を探さずとも、上のショートカットを実行するだけで設定画面が開けます。
Vimの起動時間をリアルタイムに高速化していく

```zsh
$ for ((i = 0; i < 30; i++)); do time vim .zshrc +wq; done;
```

こんな感じでワンライナーでfor文を書いて、timeとvimの起動のコマンドを書いておけば、起動にかかった時間をリアルタイムに見ながらvimrcをいじって高速化していくことができます。

```zsh
$ vim +wq
```

のように、`+`のあとにvimのコマンドを書くと実行される機能を使用しています。

※`w`も追加している理由は保存時の動作が遅い場合もあるからです。本当に起動時だけの時間をみたいならqだけでいいと思います。

![vim](http://gifzo.net/Up64qzEaGu.gif)

（gifアニメーション中だとgoのための記述が遅さの原因になっていたことがわかります。）

これなら一々vimrcをいじってvimを閉じてまたvimを起動、vimrcをいじってvimを一度閉じてまた起動…を繰り返さなくていいのでお手軽ですね！
Postgres の排他制御（行ロックとデッドロック）についてメモ


# 背景
社内でデータベース研修が始まったため、いい機会なのでMacにPostgreSQLを入れて遊んでみました。
インストールは[ここ](http://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/)を参照したら簡単でした。
研修はOracleの教科書で進んでいますがまあ基本的な概念は同じですね。

まとめてみると、どういうときにロック取得できないのかが意外と理解できてないことがわかりました。

# 行ロックの取得（select for update）
Transaction A

```
nsdb=# begin;
BEGIN
nsdb=# update hello set value = 'ngdesuyo' where num = 3;
UPDATE 1
nsdb=# update hello set value = 'ngdesuyo' where num = 2;
UPDATE 1
```

Transaction B

```
begin;
select * from hello where num = 2 for update;
-- ロックしようとしている行の変更がTransaction A でコミットされてないため、ここでwaitになる
```

Transaction A

```
nsdb=# commit;
COMMIT
```

Transaction B

```
-- select 結果が表示され、行ロックが取得される
 num |  value   
-----+----------
   2 | ngdesuyo
(1 row)
```

#### 再度、行ロックの取得
Transaction A

```
nsdb=# begin;
BEGIN
nsdb=# update hello set value = 'ngdesutte' where num = 3;
UPDATE 1 -- ロックしてない行のupdate は通る
nsdb=# update hello set value = 'ngdesutte' where num = 2;
-- Transaction B がロックしているためwaitになる
```

# デッドロック
上の状態で、下記のようにするとデッドロックします。
これは簡単な例なのでPostgresサーバが検出してくれました。

Transaction B

```
nsdb=# select * from hello where num = 3 for update;
ERROR:  deadlock detected
DETAIL:  Process 2930 waits for ShareLock on transaction 1021; blocked by process 2933.
Process 2933 waits for ShareLock on transaction 1020; blocked by process 2930.
HINT:  See server log for query details.
```


以上になります。
R の foreach で並列処理するとき on.exit() が便利 #rstatsj

R の `foreach` パッケージで並列処理するとき、通常は次のように書きます。

```r:R
library(doParallel) # foreach も読みこまれる

cl <- makeCluster(detectCores())
registerDoParallel(cl)
foreach(i = 1:3) %dopar% {
  rnorm(i)
}
stopCluster(cl)
```

しかし、この書き方だと `foreach` の中でエラーが生じた場合、`stopCluster(cl)` が実行されないという問題が生じます。

そこで、`tryCatch()` を使って次のように書くことになります。

```r:R
tryCatch({
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
  foreach(i = 1:3) %dopar% {
    rnorm(i)
    if(i==2) stop("Error!")
  }
}, finally = {
  stopCluster(cl)
})
```

この書き方は、やや複雑で可読性が悪いです。

そこで、偉大なるごみ箱師に教えて頂いた `on.exit()` を使うやり方を紹介します。

```r:R
ExecuteParallelProcess <- function() {
  cl <- makeCluster(detectCores())
  registerDoParallel(cl)
  on.exit(stopCluster(cl)) 
  foreach(i = 1:3) %dopar% {
    rnorm(i)
    if(i==2) stop("Error!")
  }
}

ExecuteParallelProcess()
```

このように書けば、関数を抜ける時に必ず `stopCluster(cl)` が実行されるようになるので安心です。
`on.exit()` 便利ですね。他にも使える場面が色々ありそうです。

### 関連記事

- [foreach の registerDoSEQ() について](http://qiita.com/hoxo_m/items/aacdf912559412b2b61b)
- [R の foreach で並列処理するとき、クラスタを implicit にする](http://qiita.com/hoxo_m/items/02b82d44a09752509dc3)
- [R の foreach で並列処理するときに乱数を固定する](http://qiita.com/hoxo_m/items/6dfd7def6574fd485a6c)
- [R の foreach を自分用にカスタマイズする](http://qiita.com/hoxo_m/items/f3a3a27a9aa2fa9f7813)
- [foreach の .multicombine 引数について](http://qiita.com/hoxo_m/items/b2bdb25d60f1e806010d)
HHKユーザーじゃなくても導入したいMacでFnを使った十字カーソル移動

HHKのProだとキーボードの右下にカーソルキーがないのですが、じゃあどうやってカーソル移動しているかというと<S>Vimを使っていれば問題ない</S>Fnキーとキーボードの右側のキーを使ってカーソル移動を実現しています。

以下の画像に通常状態とFn押下後の画像を見るとわかりやすいですね。

![normal](http://i.gyazo.com/0a8dbe1f98db6d3b00d1b48a548a12a9.png)

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

![fn](http://i.gyazo.com/fa1b13e43a88f0a4d945aecce9008640.png)

で、それをバリバリ使ってからMacをいじるとたまーーーーーーーーに必ず→とか←とか入力しないといけないアプリケーションがあって<S>まあVimでは絶対カーソルキー押さないわけですが</S>、カーソルキーに手を伸ばすのがめんどくさいなぁって思う時があります。

で、Macでもできないかなぁーって思っていたらKarabinerというキーマップ変更ソフトで出来ました！

やり方は単純で、Karabinerを起動してHHKでフィルタリングして「Enable HHK compatible Arrow Key Mode」にチェックをいれるだけです。それだけでFnのすぐ上にある４つのキーがカーソルキーの代わりになります。

![karabiner](https://qiita-image-store.s3.amazonaws.com/0/4194/c736d8e7-d831-9464-59d8-f450024554c6.png)

これで<S>Vim触ってればまああんまり気にしないんだけど</S>二度とカーソルキーを触らなくて良くなりました！！！

やったね！
SwiftでFontAwesomeKitを使ってみる


# FontAwesomeKitとは
FontAwesomeKitとは、FontAwesomeをはじめとしたIcon FontをiOSから使いやすくするためのライブラリである。

https://github.com/PrideChung/FontAwesomeKit

# 対応Font

今のところ、以下のFontに対応しているらしい。

* Font-Awesome
* Foundation icons
* Zocial
* ionicons

# インストール

Podを使ってさくっとインストール出来る。
今回は、ioniconsだけ使いたかったので、以下のようにPodfileに追記した。

```
pod 'FontAwesomeKit/IonIcons'
```

そして、``` pod install```をすれば完了。


# Swiftから使ってみる
Swiftから使うには、```XXXX-Bridging-Header.h```に```#import <FontAwesomeKit/FAKIonIcons.h>```を記述すればよい。

そして、たとえば```UIBarButton```に設定したい場合は以下の様にすれば良い。

```
let iconImage = FAKIonIcons.ios7SearchIconWithSize(26).imageWithSize(CGSize(width: 26, height: 26))
let rightBarButtonItem = UIBarButtonItem(image: iconImage, style: .Plain, target: self, action: "searchDidPush:")
self.navigationItem.rightBarButtonItem = rightBarButtonItem
```

# 補足
## XXXX-Bridging-Header.hについて

このファイルはSwiftプロジェクトにObjective-Cのファイルを追加しようとすると、Xcodeによって追加されるのでそれを使う。
1つのモデルで複数プロバイダに対応(AuthlogicとOmniAuthの話の続き)

[AuthlogicとOmniAuthを使って複数のアカウントと連携する](http://qiita.com/kano-e/items/14b3b64a76e1eab4d173)で、

> 例えば、ここから Twitter アカウントでも認証させたくなったら。
> FacebookAccount と同じ要領で追加すれば良いだけなので以下略。

とか書いたのだけれども、対応プロバイダ増やす度にモデル作るの面倒だなって思ったので、いっこのモデルで複数プロバイダ対応できるようにしたよ。
という話。

## これまでのあらすじ

* 1 User に対して、複数の認証方法(FacebookやTwitterなど)でログインさせたかった
* [devise](https://github.com/plataformatec/devise) を諦めて [Authlogic](https://github.com/binarylogic/authlogic) 使うことにした
* Authlogic の add on は使わず、対応サービスも豊富な [OmniAuth](https://github.com/intridea/omniauth) 使うことにした

gem の導入なんかは[前回の記事](http://qiita.com/kano-e/items/14b3b64a76e1eab4d173)でできている前提。

## 本題:対応プロバイダ増やすたびにモデル作るの面倒だね

各サービス毎の差異は OmniAuth がうまいことラッピングしてくれるので、単一モデルでもいける気がしたのでやってみた。

コントローラからは `Account.authenticate(env['omniauth.auth'])` で呼び出す。

```rb:app/models/user.rb
class User < ActiveRecord::Base
  acts_as_authentic

  has_many :accounts
end
```

```rb:app/models/account.rb
class Account < ActiveRecord::Base
  belongs_to :user

  scope :by, ->(provider) { where(provider: provider) }
  scope :by_uid, ->(provider, uid) { by(provider).where(uid: uid) }

  # 認証情報からアカウントを用意する
  #
  # @param [AuthHash] auth
  #   see https://github.com/intridea/omniauth/wiki/Auth-Hash-Schema
  # @return [Account] 認証したアカウント情報
  #   この時点ではまだsaveされていない
  def self.authenticate(auth)
    account = by_uid(auth.provider, auth.uid).first_or_initialize

    account.attributes = {
      token: auth.credentials.token,
      secret: auth.credentials.secret,
      nickname: auth.info.nickname,
      name: auth.info.name,
      image_url: auth.info.image,
      profile_url: auth.info.urls.fetch(auth.provider.to_s.camelize),
    }

    if auth.credentials.expires_at
      account.expires_at = Time.zone.at(auth.credentials.expires_at)
    end

    account
  end
```

[前回の記事](http://qiita.com/kano-e/items/14b3b64a76e1eab4d173)では、このメソッド内で User.create までやっていたのだけれども、今回それはやめてた。
なので、呼び出した側で `user` についての処理をよしなにした上で `save` する必要がある。

これは新規登録とかログインとか連携追加とかの対応のための変更。
そもそもの目的だった「1Userにつき複数アカウント」という状態にするために必要だったんだけど、それはそれで長くなるので、今回は書かない(力尽きた)。

そうしたら、後は各プロバイダのアプリ設定さえしてしまえば、対応プロバイダは割と楽に増やしていけそうな予感。

```rb:config/initializers/omniauth_builder.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook,
    Rails.application.secrets.facebook_app_id,
    Rails.application.secrets.facebook_app_secret
  provider :twitter,
    Rails.application.secrets.twitter_api_key,
    Rails.application.secrets.twitter_api_secret,
    {
      image_size: 'bigger',
    }
end
```

Omniauth がラッピングしてくれてるとはいえ、各プロバイダ毎に取得できる項目できない項目、どんな値が入って来るか、など結構ばらばらなので気を付ける必要はある。
ActionScript 3.0 の本番で使えそうな強制GC

下書きはいっぱいあるけど初投稿なsu10です。

AS3で強制的に引き起こすことができるガベージコレクション（GC）について調べたのでまとめます。

最後に紹介する強制GCは他では見たことないはず・・・。


# System.gc()

`flash.system.System.gc()`を使うことでGCを強制することができます。

[Adobeの公式リファレンス](http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/system/System.html#gc())によると、

> 
言語バージョン: 	ActionScript 3.0
ランタイムバージョン: 	AIR 1.0, Flash Player 9.0.115.0, Flash Lite 4
ガベージコレクションプロセスを強制します。

> Flash Player デバッグ版および AIR アプリケーションのみ。AIR アプリケーションでは、System.gc() メソッドは AIR Debug Launcher（ADL）で実行しているコンテンツ、またはインストールされているアプリケーションではアプリケーションセキュリティサンドボックスのコンテンツでのみ有効になります。

というわけで、基本的にはデバッグ用途で開発時に利用するもののようです。


# LocalConnection#connect()を2回呼出す

黒魔術っぽいのですが、`LocalConnection#connect()`を2回呼出すことでGCを強制できます。

[こちら](http://f-site.org/articles/2011/07/31220748.html)で紹介されてるので詳細はリンク先を見てもらうとして、GCを起こすのに必要なコードだけ載せると以下のようになります。

```as3

try {
    new LocalConnection().connect("test");
    new LocalConnection().connect("test");
} catch (errorObject:Error) {}

```

これを適当に`gc()`とか名前をつけたメソッドにまとめてGCを起こしたいタイミングで呼び出せばOK。

ただ、

> 初めに述べたように正規サポートの機能ではありませんので、テストや実験などの範囲で使うのがよいでしょう。

とのことで、やはり本番では使わないほうがよさそうです。


# Loader#unloadAndStop()を使う

[リファレンス](http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/display/Loader.html#unloadAndStop())をなんとなく読んでて以下を見つけました。

> 言語バージョン: 	ActionScript 3.0
ランタイムバージョン: 	Flash Player 10, AIR 1.5, Flash Lite 4

>子 SWF ファイルの内容のアンロードを試み、ロードされた SWF ファイルのコマンドの実行を中止します。

> （中略）

> 注意（iOS のみ）：AIR 3.6 より前のバージョンでは、iOS ではこのメソッドの効果はありません。

> パラメーター

> gc:Boolean (default = true) — 子 SWF オブジェクトでガベージコレクターが実行されるようにヒントを提供するかどうかを指定します（true または false）。多数のオブジェクトを非同期でアンロードする場合は、gc パラメーターを false に設定するとアプリケーションのパフォーマンスが向上する可能性があります。ただし、このパラメーターを false に設定した場合は、unloadAndStop() コマンドの実行後も子 SWF ファイルのメディアオブジェクトおよび表示オブジェクトがメモリに残ることがあります。

<strong><font color="red">`unloadAndStop()`でGCが起きる</span></strong>ようです！

ということで試してみました。

<script type="text/javascript" src="http://wonderfl.net/blogparts/3sXY/js"></script><p class="ttlBpWonderfl" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://wonderfl.net/c/3sXY" title="Loader#unloadAndStopで強制的にGCを起こせるかどうかテスト">Loader#unloadAndStopで強制的にGCを起こせるかどうかテスト - wonderfl build flash online</a></p>

<script type="text/javascript" src="http://wonderfl.net/blogparts/1dFv/js"></script><p class="ttlBpWonderfl" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://wonderfl.net/c/1dFv" title="Loader#unloadAndStopで強制的にGCを起こせるかどうかテスト２">Loader#unloadAndStopで強制的にGCを起こせるかどうかテスト２ - wonderfl build flash online</a></p>

あんまり自信がなかったので２パターン試しました。

コア部分のコードは以下のようになります。

```as3

var loader:Loader = new Loader();
var byteArray:ByteArray = (new JPGEncoder()).encode(new BitmapData(1,1));
            
// NOTE: 何かしらロードしてないとunloadAndStopでGCが走らない
loader.loadBytes(byteArray);
            
// GCを強制的に引き起こす
loader.unloadAndStop();

```

コメントで軽く書いてますが、何も`load()`とか`loadBytes()`してない状態で`unloadAndStop()`を呼んでもGCが走らないようなので適当に小さいByteArrayを`loadBytes()`してから`unloadAndStop()`を呼び出してます。

リファレンスに載ってる挙動だし本番でも使えそう！


# 余談

GCを抑えたいときは結構あると思うんですが、強制したいときってあるんでしょうか？・・・
heroku Meets FuelPHP 


個人的メモです。

## PHP アプリケーションの構築

### FuelPHP アプリケーションの構築

コンソール側でherokuアプリケーションを構築してから、
fuelphpプロジェクトを作成する。

```
$ oil create heroku
$ git checkout -b master
```

Composerに依存関係を構築。パッケージ系が不要なら削除しておきます。
ビルドパックは、devで設定しておかないとデプロイの際に怒られる。
herokuでは拡張機能も必要になるので、入れておく。

プライベートリポジトリを使う場合、パスワード確認はしてくれないので、セキュリティ的に許容されるなら、URLにはパスワードも埋め込む。

```bash
$ composer require heroku/heroku-buildpack-php --dev
$ composer require ext-mbstring
```

### Herokuの環境設定

まずは`Procfile`の作成
apacheかnginxか選べるみたい。 引数でdocRootを指定します。

```
touch Procfile
vi Procfile

web: fuel/vendor/bin/heroku-php-apache2 public/
```

リモート及び環境変数の設定。ビルドパックのURLは、node.jsアプリケーションとかと誤認されないためにも入れとくと吉。

```
$ heroku git:remote -a {appName}
$ heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-php
$ heroku config:set FUEL_ENV=staging
$ heroku config # 確認
```

あと、`.gitignore`からlockファイルを外します。

そしてデプロイ

```
$ git add .
$ git commit -am update && git push heroku master
```

初期のプロジェクトを確認するときは`http`で見たほうがいいです。
(`https`の設定がAssetsクラスでされてないので。)

## ログの設定

標準エラーにログが出るように、設定を行います。

`fuel/app/config/config.php`で以下の行を書き換え。

```
    'log_threshold'    => Fuel::L_ALL,
    'locale'             => 'en_US.utf8', 
```

ログを標準エラーに履くために、LOGクラスを上書き。

```php
<?php
// at fuel/app/classes/log.php

class Log extends \Fuel\Core\Log{

    public static function _init()
    {
        parent::_init(); // TODO: Change the autogenerated stub
        static::herokuHandler();
    }

    public static function herokuHandler(){
        $stream = new \Monolog\Handler\StreamHandler("php://stderr", \Monolog\Logger::DEBUG);
        $formatter = new \Monolog\Formatter\LineFormatter("%level_name% - %datetime% --> %message%".PHP_EOL, "Y-m-d H:i:s");
        $stream->setFormatter($formatter);
        static::$monolog->pushHandler($stream);
    }
}
```

起動ファイルにてコアクラスの書き換えを指示。

```php
//at fuel/app/bootstrap.php

Autoloader::add_classes(array(
	'Log' => APPPATH.'classes/log.php',
));
```

これでデプロイ。

`heroku logs`で確認すると、アクセスの度にログが記録されている。

## clear dbを使う

clear DBは、heroku で使える mysqlデータベースです。

使い方

1.ダッシュボードからadd-onを追加
2.CLIから接続情報を確認

```bash
$ heroku config -a {appName}
=== {appName} Config Vars
CLEARDB_DATABASE_URL: mysql://{userName}:{passWord}@{hostName}/DatabaseName?reconnect=true
```

接続情報をConfigにねじ込む or `$_SERVER`変数からパースして使う

## MysqlWorkbench から SSLで接続

あとで書く: 証明書が云々とか
Pythonローカル開発環境の構築その1(pyenv,pyenv-virtualenv,pipインストール編)

# Pythonローカル開発環境の構築

## 各種github

- [pyenv](https://github.com/yyuu/pyenv pyenv)
- [pyenv-virtualenv](https://github.com/yyuu/pyenv-virtualenv pyenv-virtualenv)
- [pip](https://github.com/pypa/pip)

## pyenvのインストール

```bash:install_pyenv.sh
% cd $HOME
% git clone https://github.com/yyuu/pyenv.git .pyenv
% echo 'export PYENV_ROOT="$HOME/.pyenv"' >> $HOME/.zshrc
% echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> $HOME/.zshrc
% echo 'eval "$(pyenv init -)"' >> $HOME/.zshrc
% exec $SHELL -l
% which pyenv # Pathが通っていることを確認
% pyenv install -l # インストール可能なバージョンを確認
% pyenv install x.x.x # x.x.xをインストール
```

## pyenv-virtualenvのインストール

```bash:install_pyenv-virtualenv.sh
% cd $PYENV_ROOT/plugins
% git clone https://github.com/yyuu/pyenv-virtualenv.git
% exec $SHELL -l
% pyenv virtualenvs
```
## pipのインストール

```bash:install_pip
% cd $HOME
% curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
% which easy_install
% which pip
% pip list
```
rbenvでrubyのインストール

以下、Macの例

**1. まずは rbenv をインストール**

```bash
$ brew install rbenv
```
※ Homebrew のインストールがまだの方は、以下のページへ。
http://qiita.com/merrill/items/025ce695d47e5458c6fb

**2. ruby-build をインストール**

```bash
$ brew install ruby-build
```

**3. パスを通す**

```bash
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```
Enterを押しても特に反応はないが、パスは通っているはず。

**4.  .bash_profile を読み込む**

```bash
$ source ~/.bash_profile
```

**5. rbenv を使用できるか確認**

```bash
$ rbenv
```
rbenvのコマンド一覧が表示されたら成功。

**6. rbenv でインストール可能な Ruby バージョンを確認**

```bash
$ rbenv install -l
```
--- ↓ 必要な人だけ ---------------------------
**irb や pry で日本語を使うことを考慮して、readline を入れておく**

```bash 
$ brew install readline
$ brew link readline --force
$ RUBY_CONFIGURE_OPTS="--with-readline-dir=$(brew --prefix readline)"
```
--- ↑ -------------------------------------------

※ もしインストールしたいバージョンが見つからない場合は、以下のコマンドを実行して再度確認してみる。

```bash
$ brew upgrade ruby-build
```

それでもインストールされない場合は以下を実行

```bash
$ brew reinstall ruby-build --HEAD
```


**7. Rubyのインストール**

```bash
# ドキュメントなし。通常より早くインストールが終わる。
$ CONFIGURE_OPTS="--disable-install-rdoc" rbenv install X.X.X 

# ドキュメントあり
$ rbenv install X.X.X
```

**8. rbenv再読み込み**

```bash
$ rbenv rehash
```

**9. インストールされているバージョン一覧を確認**

```bash
$ rbenv versions
```

**10. 使用するバーションを選択**

```bash
$ rbenv global バージョン # 使用するバージョンを指定
```

**11. 現在のバーションを確認**

```bash
$ ruby -v # 現在のバージョン確認
```

## 補足

すでにインストールされているバージョンを再度インストールする方法

**上書きする場合**

```bash
$ rbenv install -f X.X.X
```

**アンインストールしてから、再度インストール場合**

```bash
$ rbenv uninstall X.X.X
$ rbenv install X.X.X
```
Intel Edisonを触ってみた


Intel Edison Brakeout Boardを購入したので軽く動かしてみた。

## 電源投入

Brakeout BoardにはMicro USB端子が2つ並んでいるが、
一つはUSB-OTGで、一つはUSBシリアル変換ポートらしい。

USB-OTGのポートから電源を供給できる。
電源を供給するとボード上のLEDが点灯する。

## シリアルコンソール

USBシリアル変換ポートは標準でシリアルコンソールになっているので、
まずはシリアルコンソールからログインする。

初期設定ではrootのパスワード無しでログインできる。

```console:接続
$ sudo cu -s 115200 -l /dev/
Connected.
```

```console:ログイン
edison login: root
root@edison:~# 
```

```console:切断
root@edison:~# ~.
Disconnected.
```

シリアルコンソールは一文字目の入力を取りこぼす現象が頻発していた。

## Wi-Fi接続

Wi-Fi APに接続してみた。

```console:wpa_supplicantの起動
root@edison:~# wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
Successfully initialized wpa_supplicant
```

```console:wpa_supplicantの設定
root@edison:~# wpa_cli
> add_network
0
> set_network 0 ssid "MYSSID"
OK
> set_network 0 psk "passphrase"
OK
> enable_network 0
...
<3>CTRL-EVENT-CONNECTED - Connection to **:**:**:**:**:** completed [id=0 id_str=]
```

```console:DHCP
root@edison:~# udhcpc -i wlan0
udhcpc (v1.22.1) started
Sending discover...
Sending select for 192.168.1.6...
Lease of 192.168.1.6 obtained, lease time ***
/etc/udhcpc.d/50default: Adding DNS *.*.*.*
```

## SSH接続

何もしなくても初期状態でSSH接続できる。
しかし、応答はめちゃくちゃ遅い。タイプすると1文字1文字に数秒かかる。

ただし、SFTPはそれほど遅くなかった。

```console:SSH接続
$ ssh root@192.168.1.6
...かなり時間がかかる...
```

## GPIO

とりあえずGPIOを触ってみようと思ったが、
ブレイクアウトボードの回路図を見ても制御できそうなLEDがなかった…。
HockeyAppを使ってみる① アプリ登録



## 概要

HockeyAppを使って、リリース前のアプリを登録ユーザにダウンロードしてテストしてもらったりしてみる。
アプリの半自動更新も可能なので、開発者以外の人にテストしてもらう場合や、テスト端末が多い場合にとても便利！
ということなので、最近作っているCocos2d-xのアプリに導入してみる。


## ユーザ登録

[こちら](https://rink.hockeyapp.net/manage/welcome)にアクセスしてユーザ登録を行う。
細かいプロセスはメモし忘れた。
フリートライアルで2ヶ月間は無料で使える。


## アプリの登録

テストしたいアプリごとに登録を行う。

### iOS, Android共通

![](https://www.evernote.com/shard/s138/sh/c43bbbc4-1f03-40ef-a57a-ab00a471049f/8eb2f1e600fb2b7d2f333a108755ef2f/deep/0/Dashboard---HockeyApp.png)

New Appを選択する。	

![](https://www.evernote.com/shard/s138/sh/3ea12390-fcc3-4e26-bf8d-3a5b911bcec3/73d3766aeced7457b24839f4b7e36839/deep/0/Dashboard---HockeyApp.png)

manuallyを選択する。

### iOSアプリを登録

![](https://www.evernote.com/shard/s138/sh/cea0dc83-5fd4-498b-be85-7adc72088ecb/cc646d2e30aa869213d84cd3421ee320/deep/0/New-App---HockeyApp.png)

Titleは適当。

![](https://www.evernote.com/shard/s138/sh/02cb0185-2c26-43d9-8aad-0081a6784687/0948e2485df485dfd2358e541cde781e/deep/0/cheers.xcodeproj.png)

Bundle IdentifierはXcodeで確認する。

![](https://www.evernote.com/shard/s138/sh/3de9ff35-31ab-4968-8b25-b439b799ba32/05932e8ff6b48b1d8f488b3baa295bc9/deep/0/cheers-iOS-(jp.blazeworks.cheers)---HockeyApp.png)

登録完了。
App IDはSDK組み込み時に必要になる。

### Androidアプリを登録

![](https://www.evernote.com/shard/s138/sh/8d7bd44f-2f00-47c0-a4e3-cf32ab40c7d0/0c3ce6942de52c119bb27effb1fa03c7/deep/0/New-App---HockeyApp.png)

Titleは適当。

![](https://www.evernote.com/shard/s138/sh/bdcc23ef-8a51-4411-92ec-64ef34f26efb/833fd681aa3cbe80e8fc8a0380f3d152/deep/0/Java---cheers-AndroidManifest.xml---Eclipse----Users-kiarina-Documents-Eclipse-Cocos2d-x.png)

Package NameはAndroid Manifestで確認できる。

![](https://www.evernote.com/shard/s138/sh/2ec93c14-7c4a-442a-89d0-0ca33503a9c7/aa55d1cbcb44ece80d2d40367ef0e36f/deep/0/cheers-Android-(jp.blazeworks.cheers)---HockeyApp.png)

登録完了。
App IDがSDK組み込み時に必要になる。


## 後書き

登録は簡単。
フリートライアル期間が過ぎると有料のプランに入らないと利用できなくなる。
フリートライアル期間に登録したアプリは、期間終了後も使えるっぽい？
Railsアプリ内をEmacsで自由にタグジャンプ!

EmacsでRailsアプリを開発している時に使い方がわからないgemの関数などがあった時にわざわざgemのgithubレポジトリにいって検索していました。
それだとあまりにダルいので、そのままEmacs内でタグジャンプしてgemのコードが読めるように環境を整えました。

## 利用しているgemをvendor/bundleディレクトリ以下に入れる。
利用しているgemをすべてアプリケーション内のディレクトリ配下に置くために, --pathオプションを指定します。

````
$ bundle install --path vendor/bundle
````

アプリケーション内のディレクトリ配下にRailsで利用するgemをすべておくことで、アプリのトップディレクトリ以下にタグをつければgem内にも簡単にタグジャンプ出来るようになります。


## タグジャンプ出来るようにTAGSファイルを作成する。
EmacsでIDEのような定義元へのタグジャンプを行うにはTAGSファイルを作成しないといけません。
この場合ctagsというツールを使うのですが、僕はrubyistということでripper-tagsというgemを使います。

これはRailsアプリのためのgemでないのでbundlerではなく直接インストールしています。

````
$ gem install ripper-tags
````

ripper-tagsをインストールしたら自分のrailsアプリのトップディレクトリで以下のコマンドを実行してTAGSファイルを作成します。

````
$ ripper-tags -e -R -f TAGS
````

これでTAGSファイルを作ってRailsアプリ内でgemのコードへのタグジャンプが使えます。

調べたい関数やクラスにカーソルを合わせて、以下のコマンドを実行して下さい。

* M-. find-tags タグジャンプ
* M-* ジャンプ元に戻る。


より快適なRuby + Rails ライフが送れそうです^^
XcodeにXvimを導入する


[GitHub - XVimProject/XVim](https://github.com/XVimProject/XVim)


Xvimプロジェクトをcloneする

```bash
$ git clone git@github.com:XVimProject/XVim.git
$ cd XVim
$ rake updatepluginuuid
$ make
```

rake でエラーが出る場合は以下を実行する。

```bash
$ sudo gem install plist
```
Ruby | Cygwin + Bundler 1.7.4 で rake build / rake install が止まってしまうケースへの対応

# Ruby | Cygwin + Bundler 1.7.4 で rake build / rake install が止まってしまうケースへの対応

## 経緯
いつからか・何が原因か分かりませんが、Cygwin + Bundler 1.7.4 で rake build / rake install を実行した
直後にコマンドラインが実行したままになって、いつまでたっても処理が終了しなくなりました。
プロセスを強制終了し、出力された gem を確認したり、 gem のインストール結果を確認すると
処理は正常に終了しているようです。

もし同じ症状の人がいたら役に立つかもしれないので情報を残します。

## 前提環境
* Windows 7
* Cygwin(64bit)
* rbenv
* Ruby 2.1
* Bundler 1.7.4
* gem 2.4.1

## 対応
原因調査のため bundler の rake task の本体である、
gem helper の初期化処理に puts を仕込みました。

* Bundler::GemHelper#initialize のコード

https://github.com/bundler/bundler/blob/master/lib/bundler/gem_helper.rb#L25-L32

* 修正コード

~~~ruby
def initialize(base = nil, name = nil)
  puts
  Bundler.ui = UI::Shell.new
  @base = (base ||= SharedHelpers.pwd)
  gemspecs = name ? [File.join(base, "#{name}.gemspec")] : Dir[File.join(base, "{,*}.gemspec")]
  raise "Unable to determine name from existing gemspec. Use :name => 'gemname' in #install_tasks to manually set it." unless gemspecs.size == 1
  @spec_path = gemspecs.first
  @gemspec = Bundler.load_gemspec(@spec_path)
end
~~~

すると・・・なぜかエラーが発生しなくなりました。
(print だと直らない)
原因は分からないままですが、応急処置として何も出力しない puts を追加することにしました。
ActiveRecordでstrict_modeを無効にする

Rails 4.0からActiveRecordにstrict_modeが導入され、デフォルトでは接続時に`sql_mode = STRICT_ALL_TABLES`をセットするようになりました。

これは、既に運用されているDBに接続する等なんらかの理由でMySQL側で適切な設定が行えていない場合有用な動作ですが、そうでない場合、サーバー側の設定を鑑みずにクライアント側が設定を上書きするべきではないでしょう。

そのため、database.ymlで`strict: false`と設定することでこの動作を無効にすることができましたが、Rails 4.2.0ではこの動作が変更され、`strict: false`のときはstrictでない状態にするため`sql_mode = ''`をセットするようになりました。

MySQLのデフォルトのsql_modeに依存して既に通っていたはずのテストが通らなかったりすることがあり、テストを通すために`strict: false`のときはstrictでない状態にする必要があったようです。

これによって`strict: false`は`sql_mode = ''`をセットしてしまうので、Rails 4.2.0では別のワークアラウンドが必要です。

現状、database.ymlで`sql_mode: :default`を設定するのがもっとも副作用がない方法だと思われます。

```
production:
  adapter: mysql2
  database: foo_prod
  user: foo
  variables:
    sql_mode: :default
```

Rails `<= 4.0.5, 4.1.0, 4.1.1`には[この修正](https://github.com/rails/rails/pull/14896)がバックポートされていないので`:sql_mode: :default`とvariablesのキーをシンボルにしないとstrictの設定が後勝ちします。

### SEE ALSO

* [Rails 4 へのアップグレード時に遭遇した問題 - クックパッド開発者ブログ](http://techlife.cookpad.com/entry/2014/09/30/172628)
* [Don't want to overwrite sql_mode, but how is gone. · Issue #17370 · rails/rails · GitHub](https://github.com/rails/rails/issues/17370)
Redis のメモリが足りなくなった時にどうやってチューニングしたか

# Redis のメモリが足りなくなった時にどうやってチューニングしたか

Redis は便利なのですが、メモリが半分しか使用出来ないという問題が有ります。
非同期でファイルの書き込みを行う際に、メモリのスナップショット（コピー）を取るために、その分の空きメモリが必要なのです。
[ここ] (http://qiita.com/eccyan/items/b44fee413c285907cd6c)に Redis のソースコードのコメントを翻訳したものを置いておきます。

今回、メモリの空きが足りなくなったのは、準永続的な情報用のサーバと利用している物で、簡単に消すことは出来ませんでした。
そこで Redis のメモリダンプを解析し、利用していないキーの削除やデータ型の変更を行うことにしました。

## メモリの解析

メモリダンプはそのままでは人間には理解不能なので、ローカルに``dump.rdb``ファイルをコピーし、 [Rdbtools] (https://github.com/sripathikrishnan/redis-rdb-tools) を利用してCSVに出力し、そこから必要なデータに整形しました。

```console
$ rdb -c memory dump.rdb > redis_memory.csv

# バイトサイズとキーの個数と単位バイトサイズを出す
$ cat redis_memory.csv | sed -E "1d" | sed -E 's/:[0-9]+(:|")/:{id}\1/g' | cut -d ',' -f 3,4 | awk -F ',' '{ sum[$1] += $2; count[$1] += 1 } END { for (key in sum) print key, sum[key], count[key], sum[key] /count[key] }' > redis_memory_status.csv 
```

``user/123456/abc``形式のキーなので、上記の様なコマンドで集計を取りました。

整形後にそれぞれの数値でソートし、チューニングを行うデータを割り出します。
今回の場合、未使用のキーが幾つかありましたが、それ以上に「投稿の履歴」が 9GB 位の容量を占めていました・・・。

## チューニング

投稿の履歴は JSON で表すと、以下の様な配列形式でした。

```json

[{ question_id: <INTEGER>
  accessed_at: <STRING>
}
, // …
]
```

これが Ruby のハッシュをシリアライズした文字列で保存されており、それがユーザ単位毎に``8MB``も消費していたのです！
これではサーバを増築したとしても、とても身が持ちませんね・・・。


ところで、Redis にはメモリのエンコーディング方法が 2 種類があります。
skiplist と ziplist(intset) があり、後者だと圧縮展開を行う CPU コストとトレードオフで、メモリの圧縮を行ってくれます。 intset は Set の場合に使われるようです。
どのようなエンコードを行っているかは、以下のコマンドで確認が可能です。

```
redis> object encoding <KEY>
```

これらのエンコードを適用する条件設定は Redis のコンフィグで行う事が出来ます。

```text:redis.conf
hash-max-zipmap-entries 64 (hash-max-ziplist-entries for Redis >= 2.6)
hash-max-zipmap-value 512  (hash-max-ziplist-value for Redis >= 2.6)
list-max-ziplist-entries 512
list-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
set-max-intset-entries 512
```


これに収まるようにデータ型を変更すれば、メモリは相当圧縮出来るはずですね。

これらを踏まえて今回は先ほどの大食らいを 2 つのリストに分割し、さらに日付もタイムスタンプに変更しました。
この対応により、サイズは最大で 1/10 程度まで圧縮される予定です。
その経過が下図になります。

![graph_image.png](https://qiita-image-store.s3.amazonaws.com/0/1897/5debf6b8-6a53-0f25-7100-ee64675acdbe.png)

ガツンと下がっています。
ziplist(intset) は Hash/List/Set/SortedSet に使えますので Redis を活用している方はチューニングしてみてください。


## Shared Memory

さて、上記で我々の Redis は救われましたが、ユーザの投稿内容やもっと莫大なリストを管理している方は手におえませんね。

しかし、解決策があります。
以下の記事の様にデータを複数分割して保存する方法があります。
http://mocobeta-backup.tumblr.com/post/84793291682/redis-set
もちろん、仕組みを用意しなければならなく、CPUコストは高くなりますが、メモリに困っていたら利用してみてはいかがでしょうか？

## 総括

そもそもこの対応、最初から横着せずにデータ型に注意を払っていればよかったという話。

## 参考

Special encoding of small aggregate data types
http://redis.io/topics/memory-optimization

Redis RDB Dump File Format
https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
SocketRocketでWebSocket実装してみる。


SocketRocketでiOSクライアント側を実装し、サーバー側はNode.jsで実装してWebSocket連携してみるメモです。

##環境
* Xcode6.0
* iPhone5s
* iOS8.0

##参考にしているURL
* http://yamitzky.hatenablog.com/entry/20120929/1348893622
* http://blog.katty.in/2193
* http://www.elabs.se/blog/66-using-websockets-in-native-ios-and-android-apps


##サーバー側
wsモジュールをインストールして実行します。

```
$ npm install ws
```

受信したメッセージをそのまま送信するオウム返しなWSサーバーです。

```index.js
var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({port: 8080});

wss.on('connection', function(ws) {

    ws.on('message', function(message) {
        console.log('received: %s', message);

        ws.send(message);
    });

});
```

##SocketRocketの準備

https://github.com/square/SocketRocket のリポジトリ中のSocketRocketフォルダ内( https://github.com/square/SocketRocket/tree/master/SocketRocket )を利用します。

* SRWebSocket.h
* SRWebSocket.m
* SocketRocket-Prefix.pch

をダウンロード等して、プロジェクトに追加します。

###ライブラリ追加
依存ライブラリを追加します。

* libicucore.dylib
* CFNetwork.framework
* Security.framework
* Foundation.framework

![](http://i.gyazo.com/5b77aa7466b331a25fcc9116601d16fb.png)

##Objective-cのコード

### ViewController.h


```
//
//  ViewController.h
//  SocketRocketTest
//
//  Created by 菅原　遼介 on 2014/10/27.
//  Copyright (c) 2014年 n0bisuke. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "SRWebSocket.h"

//@interface ViewController : UIViewController

@interface ViewController : UIViewController <SRWebSocketDelegate> {
    SRWebSocket *socket;
}

@end
```


### ViewController.m

```
////
////  ViewController.m
////  SocketRocketTest
////
////  Created by 菅原　遼介 on 2014/10/27.
////  Copyright (c) 2014年 n0bisuke. All rights reserved.

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    SRWebSocket *web_socket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://localhost:8080"]]];
    [web_socket setDelegate:self];
    [web_socket open];
    // Do any additional setup after loading the view, typically from a nib.
      NSLog(@"aaaaaaa");
}

- (void)webSocketDidOpen:(SRWebSocket *)webSocket{
    [webSocket send:@"{\"id\":\"1\"}"];
}

- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message{
    NSLog(@"didReceiveMessage: %@", [message description]);
}

@end
```

##実行

起動するとiPhone側には何も表示されないですが、XcodeのコンソールとNode.jsを立ち上げてるサーバー(今回はlocalhost)のコンソールで`{"id":"1"}`と表示されると思います。

![](http://i.gyazo.com/556d46352443777655a12366e94d4cc0.png)

##感想

割と手こずった...

* http://www.html5rocks.com/ja/tutorials/websockets/basics/
* http://www.teehanlax.com/blog/how-to-socket-io-swift/

この辺りを参考にして次はswift書き換えとweb連携をしたいです。
c#

レコードをコンボボックスに抽出
http://vb.xn--netde-rm4dun6em173aog4b.com/39.htm

DBアプリ作成
http://www.atmarkit.co.jp/ait/subtop/features/dotnet/app/vsdbprog_index.html

http://www.ne.jp/asahi/c-sharp/dictionary/cs/database/index.html

これが参考になる
http://blog.hiros-dot.net/?p=4844

/* コンポーネント*/
データベースへ接続確認

            SqlConnection sqlcon = new SqlConnection("Data Source=KONGOU\\LEARN01;Integrated Security=True;Initial Catalog=mori;");
            //  SqlCommand sqlcmd = new SqlCommand("DELETE FROM Qualification WHERE QUALIFICATION1 ", sqlcon);

            // データベース接続を開く
            sqlcon.Open();

            // 接続に成功した旨を表示する
            MessageBox.Show("DBに接続されました");

            // データベース接続を閉じる (正しくは オブジェクトの破棄を保証する を参照)
            sqlcon.Close();
            sqlcon.Dispose();


##使用頻度高いメソッド

画面を閉じる

this.Close();

C#入門
http://ufcpp.net/study/csharp/#index-start


コンボボックスの値を取得するには
nameに対してキャストする必要がある
((DataRowView)comboBox1.SelectedItem).Row["QUALIFICATION1"].ToString();
プロキシ経由でスクレイピング★

こんばんは、なめこです
今回はGoutteを使って、プロキシ経由でスクレイピングをしてみたときのメモです。

Goutte
https://github.com/fabpot/goutte

まずはプロキシのIPアドレスはどこから取得するか？ですが
http://lab.magicvox.net/proxy/
ここからげっちゅします。
もちろんスクレイピングで。

```php|Proxy.php
<?php
namespace Scraping;

class Proxy {

    private $client;
    private $url;

    public function __construct($client, $url)
    {
        $this->client = $client;
        $this->url = $url;
    }

    public function getProxyIpList()
    {
        static $errorCount = 0;

        try {
            $crawler = $this->client->request('GET', $this->url);
            $dom = $crawler->filter('table tr');

            $ips = array();
            $dom->each(function ($node) use (&$ips) {
                if ($node->filter('td')->count()) {
                    $host = $node->filter('td.host')->text();
                    $port = $node->filter('td.port')->text();
                    $ip = $node->text();
                    $ips[] = $host . ':' . $port;
                }
            });
        } catch (\Exception $e) {
            $errorCount++;
            if ($errorCount > 10) {
                return null;
            }
            return $this->getProxyIpList();
        }

        return $ips;
    }
}
```
コンストラクタで必要なものは、外部から注入してください。
このクラスのgetProxyIpListで
<pre>
[0] => 202.106.16.36:3128
[1] => 202.56.231.117:80
みたいに配列で取得できるよ！（念のためリトライ処理入れてます)
</pre>

```php|Proxy.php
抜粋.....
    public function __construct($client, $url)
    {
        $this->client = $client;
        $this->url = $url;
    }
```
ここのclientだけど、
<pre>
// ユーザーエージェントの取得
$useragent = HttpHeaderUtil::getUserAgent();
$client = new Client(['HTTP_USER_AGENT'=>$useragent]);
</pre>
みたいにGoutteのClientクラスを作って、こいつを渡してあげよう。
HttpHeaderUtil::getUserAgent()は自前で用意したUserAgentのリストファイルから適当に選んで返却してくれる
Utilだよ！必要なら作ってね！
プロキシIPとってくるときは、自サーバのIPなので、まだプロキシ経由じゃないね。

そしてプロキシ用のClientの作成・・・

```php|ProxyClient.php
<?php
namespace Scraping;

use GuzzleHttp\Client as GuzzleClient;
use Goutte\Client;
use Scraping\HttpHeaderUtil;

class ProxyClient {
    private $proxyIp;
    public function __construct($proxyIp)
    {
        $this->proxyIp = $proxyIp;
    }
    public function getClientInstacne()
    {
        $gclient = new GuzzleClient([
            'defaults' => [
            'proxy'   => 'tcp://'.$this->proxyIp
            ]
        ]);
        // ユーザーエージェントの取得(自前)
        $useragent = HttpHeaderUtil::getUserAgent();
        $client = new Client(['HTTP_USER_AGENT'=>$useragent]);
        $client = $client->setClient($gclient);
        $client->getClient()->setDefaultOption('config/curl/'.CURLOPT_TIMEOUT,60);
        return $client;
    }
}
```
コンストラクタの$proxyIpはProxyクラスで取得したIPリストから適当にひとつ選んで渡してあげよう
あとはClient使ってスクレイピングしよう！

<pre>
ProxyClientのgetClientInstacneで取得したclientを使って。。。。。
$crawler = $client->request('GET', 'http://qiita.com/');
$title = $crawler->filter('title')->text(); //てきとう
</pre>

Goutteは怖いけど（過去記事参照）、便利だよ！
画像表示とそのクリッピング、セグメント操作など


![アプリ画面](http://i.gyazo.com/4aa83261fac45f9db79048c882dec889.gif)

### やったこと
* プログラムから画像を表示する
* 画像のクリッピングとか縦横比固定方法を確認する
* セグメント（スライダーみたいなやつ）制御方法を確認する

### コード
```Swift:ViewController.swift
class ViewController: UIViewController {

    // 画像表示のイメージビュー
    @IBOutlet var myDisplay: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    // 画像を表示
    @IBAction func dispImage(sender: UIButton) {
        
        // ファイル名を指定
        var img:UIImage! = UIImage(named:"winter_present.png")
        // 座標とサイズを指定
        var rect:CGRect = CGRectMake(90, 80, 100, 100)
        var imageView = UIImageView()
        imageView.frame = rect
        imageView.image = img
        // 縦横比保持
        imageView.contentMode = UIViewContentMode.ScaleAspectFit
        // ビューに追加
        self.view.addSubview(imageView)
        
        
        // ファイル名を指定
        var img2:UIImage! = UIImage(named:"winter_present.png")
        // 座標とサイズを指定
        var rect2:CGRect = CGRectMake(90, 70, 200, 200)
        var imageView2 = UIImageView()
        imageView2.frame = rect2
        imageView2.image = img2
        // 伸縮しないで、左上を固定
        imageView2.contentMode = UIViewContentMode.TopLeft
        // rect2のサイズを超えたらカット
        imageView2.clipsToBounds = true
        // ビューに追加
        self.view.addSubview(imageView2)

        
    }
    // 画像2非表示にする（セグメント切り替え）
    @IBAction func changeSegment(sender: UISegmentedControl) {
        
        var fileName = "winter_iceskate.png"
        if (sender.selectedSegmentIndex == 1) {
            self.myDisplay.image = UIImage(named: fileName)
        } else {
            self.myDisplay.image = nil
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

```

### ソース
https://github.com/hanoopy/ios_study_imageapp

### コメント
* ファイル名はグループ名（フォルダ名）を気にしなくて良い。
×Images/winter_present.png
○winter_present.png

* やっとnilを使った