OmniAICreator/Qiita-1.07M huggingface dataset:
Learning Rails 11 (Update data)


![スクリーンショット 2016-04-26 18.57.13.png](https://qiita-image-store.s3.amazonaws.com/0/39073/bc1651b1-7196-6f66-86e9-fa31138bbf53.png "スクリーンショット 2016-04-26 18.57.13.png")

We use it

|Prefix | Verb | URI | Controller#Action| Explanation |   
|:-----------|:------------|:------------|:------------|:------------|
||PATCH|/users/:id|users#update|users controller and update action|


```bash
vi app/controllers/users_controller.rb
```

Add this line

```ruby:users_controller.rb
vi app/controllers/users_controller.rb
```

current this file

```ruby:users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
    render status: 200
  end

  def show
    @user = User.find params[:id]
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to users_path
    else
      render 'new'
    end
  end

  def update
    @user = User.find params[:id]
    if @user.update(user_params)
      redirect_to users_path
    else
      render 'edit'
    end
  end

  def edit
    @user = User.find params[:id]
  end

  private
    def user_params
      params[:user].permit(:name)
    end
end
```
CentOSで新しいGCCなどといった開発ツールを使いたい場合のメモ

# 環境

```bash
$ cat /etc/redhat-release
CentOS release 6.7 (Final)
$ uname -a
Linux XXX 2.6.32-573.8.1.el6.x86_64 #1 SMP Tue Nov 10 18:01:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
```

この環境ではgccのバージョンが4.4で，正直に言って色々と辛い…
どうにかして新しいツールチェインを使えるようにする．
少なくともC++11が使えるgcc 4.8以上のものが欲しい…

# Software Collectionsを使う

Red Hat Software Collections (SCL)の一部として，開発ツールのパッケージ群が配布されているそうだ(SCLが何かはよく知らない…)．
パッケージ管理ツールyumが参照するリポジトリ一覧にSCL関連のリポジトリを追加すればyumからパッケージとして扱うことができるようになる．
便利そうなので，SCLを使うことにする．

# yumがdevtoolsetリポジトリを見るように設定

比較的新しい開発ツール集のリポジトリとして[devtoolset-4](https://copr.fedorainfracloud.org/coprs/hhorak/devtoolset-4-rebuild-bootstrap2/)があるようですが，これよりは古い[devtoolset-3](https://copr.fedorainfracloud.org/coprs/rhscl/devtoolset-3/)で十分なので，このリポジトリのrepoファイルをダウンロードして，`/etc/yum.repos.d/`に置く．

devtoolset-3のrepoファイルへのURLは`https://copr.fedorainfracloud.org/coprs/rhscl/devtoolset-3/repo/epel-6/rhscl-devtoolset-3-epel-6.repo`．

# インストール

次のパッケージで大体のものがインストールできる:

```bash
$ yum install scl-utils devtoolset-3-toolchain devtoolset-3-perftools
```

これらパッケージに何が紐付けられているかは`yum deplist`で閲覧できる．

# 各種設定

devtoolset-3リポジトリのパッケージをインストールしても，そのままでは使用できない．
環境変数の設定は`scl`コマンドを使って行うことができる．
詳細はmanを見るとよい．

なおdevtoolset-3リポジトリのパッケージは`/opt/rh/devtoolset-3`にインストールされるようで，環境変数を設定するスクリプトは`/opt/rh/devtoolset-3/enable`である．

# インテルコンパイラとGCCの相性

手元のインテルコンパイラのバージョンは14なのだが，どうやらgcc 4.9との(正確には，mpicc/mpicxxとgcc/g++の)[相性が悪いらしい](https://software.intel.com/en-us/forums/intel-c-compiler/topic/515011 "Compiler error in alloc_traits.h from GCC 4.9")．
これは困った．
devtoolset-2だとgccのバージョンは4.8だそうなので，こちらの方がよいだろうか？…

# もう一度インストール

結局，[devtoolset-2](http://qiita.com/masa_edw/items/0975fb1be3a2e66f62b1 "CentOS6.5にdevtoolset-2を使ってgcc4.8をインストールする - Qiita")をインストールすることにした．

devtoolset-2のrepoファイルのURLは`http://people.centos.org/tru/devtools-2/devtools-2.repo`．
インストールするパッケージ名はdevtoolset-3とほとんど同じで，数字の3を2に変えたものでよい…はずだが，`devtoolset-2-perftools`に含まれている`devtoolset-2-systemtap`がインストールできず，それ以外のパッケージを個別にインストールした．

# 所感

今回は特権があったからSCLを使うという方法を取ったが，無い場合は気合いでどうにかするしかないかもしれない…

ツールをコンパイルして使うだけならば，特権は不要なはずなので，何かしら方法はあるかもしれないけど，非常に手間がかかりそうな気がする．

# 参考情報

* [CentOSに新しいバージョンのGCC/G++(4.8/4.9)をインストールする - TASK NOTES](http://www.task-notes.com/entry/20151114/1447492231 "CentOSに新しいバージョンのGCC/G++(4.8/4.9)をインストールする - TASK NOTES")
* [rhscl/devtoolset-3 Copr](https://copr.fedorainfracloud.org/coprs/rhscl/devtoolset-3/ "rhscl/devtoolset-3 Copr")
* [hhorak/devtoolset-4-rebuild-bootstrap2 Copr](https://copr.fedorainfracloud.org/coprs/hhorak/devtoolset-4-rebuild-bootstrap2/ "hhorak/devtoolset-4-rebuild-bootstrap2 Copr")
* [Compiler error in alloc_traits.h from GCC 4.9](https://software.intel.com/en-us/forums/intel-c-compiler/topic/515011 "Compiler error in alloc_traits.h from GCC 4.9")
* [CentOS6.5にdevtoolset-2を使ってgcc4.8をインストールする - Qiita](http://qiita.com/masa_edw/items/0975fb1be3a2e66f62b1 "CentOS6.5にdevtoolset-2を使ってgcc4.8をインストールする - Qiita")
* [yum - How to Install gcc 4.7.x/4.8.x on CentOS - Super User](http://superuser.com/questions/381160/how-to-install-gcc-4-7-x-4-8-x-on-centos/743163# "yum - How to Install gcc 4.7.x/4.8.x on CentOS - Super User")
WindowsユーザがMacでsshクライアントを構築したときにハマったこと

#事象
Macでsshクライアント環境を構築したら、全然繋がらなくて３日ハマった。

#経緯
- ConoHaでVPS契約した
- Windowsでsshクライアント構築した
-　ポート変えた
-　root禁止した
ここまでは快適
- Macでsshクライアント環境構築してみた
- つながらなかった

`$ ssh hoge
ssh: Could not resolve hostname hoge: nodename nor servname provided, or not known`

- sshの概念が不勉強だったのか
- サーバとクライアントの考え方に不備があったのか
- 切り分け方に抜け漏れがあったのか

全部違った

原因はMacの知識不足だった

Macには/etc/ssh_configがdefaultで備わってた
linux的な「~/.ssh/ssh_config」と競合してしまうので、回避するために、「~/.ssh/config」を利用する。

# どうやって判明したか
- browserで「/etc/ssh_config」って打ってみた
- web検索結果ではなくfileが表示された

#根本原因
ググりが足りなかった

#対処
ググレカス
ST3 日本語環境向けプラグイン MultibyteWordSeparators の解説

# MultibyteWordSeparators とは？
Sublime Text 3 向けのマルチバイト文字列に対応した単語移動をサポートするパッケージです。
[github:SublimeMultibyteWordSeparators](https://github.com/naoyukik/SublimeMultibyteWordSeparators)
~~※ 5/1現在Package Controlに登録申請中のため、インストールは手動になります。~~
※ 5/4にPackage Controlに取り込まれました。

日本語に対応しているエディタの場合、単語移動でカーソル移動すると漢字・ひらがな・カタカナ・英数字を判別し、単語らしきところでカーソルが止まるようになっています。

Sublime Text 3 は、日本語を単語移動しようとすると2byte文字列が判別できず、一つの単語として移動してしまいます。

そこで単語移動出来るように MultibyteWordSeparators を作成しました。

# どうやってるの？
漢字・ひらがな・カタカナ・英語・数字・記号のグループを作成し、片っ端から正規表現で引っかけています。

次に、カーソルの位置が漢字であればそれを主とし、主となる文字種から変わるまでカーソルを移動させ続けます。

例えば、ひらがなと同じリストに数字を入れればひらがなと同じ種別と判別され、移動もひらがなと数字は一緒に移動されます。

つまり、厳密には"単語"移動ではないです。

# 形態素解析は使わなかったの？
そういうわけで、形態素解析は使っていません。
実際のところ、開発時に形態素解析が手軽に使えることを知らなかった、という理由もあったり無かった……。

ちょっと形態素解析の場合について考えてみたけど、現在のカーソル位置から前後の文章をある程度チェックする手間、カーソル位置がその文書のどこに当たるのかをそれぞれチェックする必要がありそうで、逆に手間かも……。

個人的には現在のやり方がベターな気がしてます。

日本語の単語移動の件は困ってる方も結構いるようだったので、このプラグインが一助になればいいなと思いを込めての宣伝でした。

# アップデート履歴
#### 7/24 ver1.2.2 へアップデート
よく使う日本語記号(←↑→↓■□▲△▼▽◆◇○◎●★☆)をcjkSymbolへ追加

#### 5/24 ver1.2.0 へアップデート
**文字列の検索指定をsubliem-settingsへ移行**
このため、ユーザーが任意の文字列で指定できるようになりました。

#### 5/9 ver1.1.0 へアップデート
**マウスでのダブルクリックでの単語選択に対応**
マウスでダブルクリックを行った際、マウスカーソルの下にある文字を検出して単語を選択する機能を追加

以上。
講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第3章 確率的勾配降下法

注意：『<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22">深層学習 (機械学習プロフェッショナルシリーズ)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />』
<a  href="https://www.amazon.co.jp/gp/product/4061529021/ref=as_li_qf_sp_asin_il?ie=UTF8&camp=247&creative=1211&creativeASIN=4061529021&linkCode=as2&tag=aokikenichi-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4061529021&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=aokikenichi-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=aokikenichi-22&l=as2&o=9&a=4061529021" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
を読むにあたって、自分が読みたいな、こんな記事があったら参考になるな、という基準で書いております。私は機械学習も数学も専門家ではないので誤っている箇所も多々あるかと思いますが参考となると幸いです。


# 第3章 確率的勾配降下法
## 3.1 勾配降下法

* p24 argmin

```math
argmin_\mathbf{w}{E(\mathbf{w})} \\ 
はE(\mathbf{w})を最小にする\mathbf{w}の集合を示す関数。
```

例えば、

```math
x=argmin_x{(x-2)^2}
```
であれば、x=2のとき最小になるのでx=2となる。ちなみに

```math
min{(x-2)^2}
```
であれば、（実数の範囲では）0。





* p24 「E(w)は一般的に凸関数ではなく、大域的な最小解を直接得るのは通常、不可能です」

凸関数であれば局所的な最小値が大域的な最小値と一致するので、最小値を求めるような最適化問題が簡単になる。c.f. [Wikipedia:凸最適化](https://ja.wikipedia.org/wiki/%E5%87%B8%E6%9C%80%E9%81%A9%E5%8C%96)

* p24 ∇、∂

```math
\nabla=(\frac{\partial{}}{\partial{x_1}}, \frac{\partial{}}{\partial{x_2}}, \frac{\partial{}}{\partial{x_3}}, ..., \frac{\partial{}}{\partial{x_n}}) \\
\nabla はナブラと呼び、複数の変数がある場合それぞれの変数で偏微分を行う。 \\
\partial はラウンドディーと呼び、偏微分を行う。偏微分とは、対象となる変数以外を定数とみなして、対象となる変数のみで微分を行うこと。
``` 

例えば(x, y)座標系であれば、

```math
\nabla=(\frac{\partial{}}{\partial{x}},\frac{\partial{}}{\partial{y}} )
```

また、

```math
f(x, y)=x^2y
```

のとき、

```math
\frac{\partial{f}}{\partial{x}}=2xy \\
\frac{\partial{f}}{\partial{y}}=x^2
```
## 3.2 確率的勾配降下法
特になし

## 3.3 「ミニバッチ」の利用

* p27

```math
n\in D_t \\
は、「nはD_tに含まれる」あるいは、「D_tはnを要素として含む」である。
```
## 3.4 汎化性能と過適合
特になし

## 3.5 過適合の緩和
特になし

## 3.6 学習のトリック

* p38

```math
\begin{align}
\Delta{\mathbf{w}^{(t-1)}}&\equiv\mathbf{w}^{(t)}-\mathbf{w}^{(t-1)} \\
(3.3)より \\
\mathbf{w}^{(t+1)}-\mathbf{w}^{(t)}&=-\epsilon\Delta{E_t}+\mu\nabla{\mathbf{w}^{(t-1)}} \\
&=\Delta{\mathbf{w}^{(t+1)}} \\
だからp38の式は \\ 
\Delta\mathbf{w}^{(t)}&=\mu\Delta{\mathbf{w}^{(t-1)}}-\epsilon\nabla{E_t} \\
\end{align}
```

⇒ 次は、[講談社機械学習プロフェッショナルシリーズ『深層学習』の学習 第4章 誤差逆伝播法](http://qiita.com/aokikenichi/items/9d35d62b56955c9887af) へ
逝ったNASからデータをサルベージした話

意外と手間取りお金もかかったので、似たような境遇に陥ってしまった方のために手順を残しておきます。

逝かれたNASはIO DATAの[HDL-A2.0](http://www.iodata.jp/product/nas/personal/hdl-a/index.htm
)。

## 復旧で使ったもの

- [サンワサプライ SATA-USB3.0変換ケーブル](http://www.amazon.co.jp/dp/B004QZBB12)・・・2,227円
- [復旧天使 Standard Home License Mac](http://www.recovery-angel.jp/soft/standard.html)・・・12,960円
- [復旧データ格納用HDD:HD-CBU2](http://buffalo.jp/products/catalog/storage/hd-cbu2/)・・・自宅にあったので0円。買うと今なら1万円弱。
- ドライバー

## 逝く前の予兆

1.逝く1週間前から書き込みが重い時とそうでない時があった
2.逝く数時間前から読み書き両方が激重に
3.今思えばたまにmountが勝手に外れてる事があったのも予兆だったかも

それから運命のXデーに再起動しようとするも電源が落ちずに[緑点滅状態](http://www.iodata.jp/support/qanda/answer/s17071.htm)になり、24h寝かせても状況は変わらなかったので、祈りを込めて電源引っこ抜いたが二度と立ち上がる事はなかった。

## 公式サポートを調べてわかったこと

まず調べたのは公式サポートについて。

真っ先に修理に出す事を考えたが、調べると中のデータは保証されないということ。
http://www.iodata.jp/support/after/repair/confirm.htm
> ハードディスク・メモリカード等のデータを保存する機能を有する製品の場合や製品の内部に設定情報をもつ製品の場合、故障状況確認の際、テストパターン書込み等により内部データは消去されます。

データ復旧サービスもあるけど、法人向けなんだろうか価格が高すぎて手が出せない。
http://www.iodata.jp/support/service/iss/service/fukkyu/
> 2TB: 208,000円〜

以上の事から公式サポートを断念。

## 自力サルベージを目指して
NASはそもそも起動しないのでネットワーク上に表示されなかった。
NASのネットワーク部分の故障の場合は内部のHDDは無事の可能性があるみたいなので、直接繋いでみることに。

NASからHDDを取り出すのは普通のドライバーでいけましたが、PCと繋ぐためにSATA-USB変換ケーブルが必要との事で、自分は変換ケーブルを購入しました。

![IMG_5202.JPG](https://qiita-image-store.s3.amazonaws.com/0/28543/23fd34d2-1ec2-ed37-e0cf-8b57436274bb.jpeg "IMG_5202.JPG")


届いた変換ケーブルでPCに繋いで見るも認識されず。
![スクリーンショット 2016-05-01 11.11.22.png](https://qiita-image-store.s3.amazonaws.com/0/28543/9e4d51ce-c6b2-1e4f-339c-ebae01c3805d.png "スクリーンショット 2016-05-01 11.11.22.png")

ディスクユーティリティには表示されたけど、1TB強くらいしか利用していないハズが空き容量ゼロと表示される・・・
![スクリーンショット 2016-05-01 11.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/28543/6a48c9a2-2d0c-34bd-48e8-d0d7a0c79687.png "スクリーンショット 2016-05-01 11.16.08.png")

First Aidを実行するとパーティションマップに問題があるの表示が。
![スクリーンショット 2016-05-01 11.15.18.png](https://qiita-image-store.s3.amazonaws.com/0/28543/e595bfcb-45fc-dbb6-9c96-58c84a2de552.png "スクリーンショット 2016-05-01 11.15.18.png")

修復可能の場合はここで「ディスクを修復」ボタンが出るらしいけど、出ず。
これ以上はどうにも出来なそうだったので、復旧ソフトを使うことに。

## 復旧ソフトを使ったサルベージ
今回使ったソフトは復旧天使というソフトでした。
macに対応している事と、無料の体験版を使ってそもそも復旧可能かどうかチェック出来る事が決め手となりました。

![スクリーンショット 2016-05-01 21.01.05.png](https://qiita-image-store.s3.amazonaws.com/0/28543/6aa7c2e4-253c-a755-c61e-8cb0da0b9368.png "スクリーンショット 2016-05-01 21.01.05.png")

体験版でデータ復旧を確認できたら、ライセンスを購入して復旧を選択。
何個か復旧できないファイルがあったけど、99%以上はサルベージする事ができました。

かかった時間は1TB強で約1日くらい。
回数小分けにして復旧したからまとめてやったらもっと早いかもしれない。

注意点としてネットワーク経由での接続による復旧には対応していないので、復旧したデータを保管するストレージが別途必要になるということ。
自分の場合は外付けHDDが別にあったのでそちらを利用したけど、無い場合は買わないとならないかもしれない。
ある文字列(ASCII文字コード)が重複する文字列を含んでいるか判定


###Chapter1 1.1

##最初に思いついたのがこの解法
これは、最悪の場合、loop2周分の時間がかかってしまう
計算量;O(n^2)
つまり、あまりいけてない

```ruby:1_1_contest
class String
  def unique_1?
    return false unless self.ascii_only?

    s_len = self.length
    return false if s_len > 256
    for s1 in 0...s_len
      flag_s = self[s1]
      for s2 in s1 + 1...s_len
        return false if flag_s == self[s2]
      end
    end
    true
  end
end
```

```ruby:irb
target_string = "abcdefghijklmnop"
target_string.unique_1?
```

true

```ruby:irb
target_string = "abcdefghijklmnopa"
target_string.unique_1?
```

false

##本に載っていた解法
本ではJavaで書かれていたので、それをrubyに変換しました
計算量;O(n)

1.ASCIIコード以外は、無条件でfalseを返します
2.ASCIIは256の文字しかないので、それ以上は無条件でfalseを返します
3.文字列をforでloopします。
4.ordで文字のコードポイントを取得します
  aならば97、bならば98とか決められています
5.文字のコードポイントにboolean型を入れていきます
  一度でも出てきた値には、trueが入っているのでfalseを返します

```ruby:1_1_contest
class String
  def unique_2?
    return false unless self.ascii_only?

    return false if self.length > 256
    check_set = []
    for s1 in 0...self.length
      string_number = self[s1].ord
      return false if check_set[string_number]
      check_set[string_number] = true
    end
    true
  end
end
```

```ruby:irb
target_string = "abcdefghijklmnop"
target_string.unique_2?
```

true

```ruby:irb
target_string = "abcdefghijklmnopa"
target_string.unique_2?
```

false

非常に勉強になったので、気持ちが続く限り、この本をやっていこうと思います！
opensslのversion確認はCentOS系ではコツが必要

通常、opensslのversionは`openssl version`コマンドで確認します。
しかし、CentOS系のパッケージの場合は、opensslをアップデートしてもこのコマンド上のバージョンは上がらないので、確認になりません。
実際の確認方法は`rpm -q openssl`が一番手軽なので、こちらをおすすめします。

yum経由のライブラリ類は最新のバージョン系列を使っていないことがあり、
パッチがバックポートされていることが多いので、
バージョンは`rpm -q`で確認するのが確実です。
`rpm -q --changelog`なら特定のCVEに対応しているかどうかも確認できます。

## 関連記事

* [yumのセキュリティアップデートコマンドはCentOSでは効果がない - Qiita](http://qiita.com/yoshi-taka/items/007e081b707867b01b75)
気をつけろ！NSUserDefaultsは消えるぞ！

株式会社[Nanameue](http://nanameue.jp/?lang=ja)
iOSエンジニアの[bati](https://www.facebook.com/hiroshi.chiba.54)です
Objective -CからSwiftに乗り変えて2か月。
今は新規プロジェクトをPure Swift でやっている状況で、
そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ
と感じている頃です。


さて今日の本題ですが、なんて刺激的なタイトルなんでしょう。
しかし僕はこの目で見てしまいました
NSUserDefaultsの値が勝手に消え失せる現象を！！！！！
なんてFantasticな現象でしょう

僕の仮説ではこれはiOS側のバグだと考えられます。(iOS9.3にアップデートした瞬間起き始めたので)

僕の端末でしか確認できてませんが、もし同じ現象の人がいたら是非情報共有しましょう

***具体的な現象***

- Facebook,Line,SmartNewsを開くたびに、ログイン画面、会員登録画面になる
- 僕が会社で開発しているアプリでもNSUserDefaultsに保存していたデータがアプリをKillするたびに、勝手に消える
- ログを出力してみたら、保存したデータではなくnilが返ってきた
- もう一回ビルドしてみたら、nilではなくきちんと保存したデータが帰ってきた
- この現象は1時間に1回ほどのペースで起きた

***考えられる原因***

1時間ほどググった結果、NSUserDefaultsはMainスレッドで実行されなければ正しく動かないことがわかりました。
しかし、NSUserDefaultsはスレッドセーフです。
わざわざ、スレッドを変えなくても、大丈夫なはず！！

なんですが、事実として原因と考えられるものはこれしか見つかりませんでした

一応NSUserDefaultsに保存できる上限があるのですが、それはiPhoneのストレージ分なので、
上限に達したというのは考えにくいです

実際に、Mainスレッドで強制的に呼ぶコードを書いたら、その現象は二度と起きなくなりました

本当に不思議ですね、、

僕の仮説だと、アップデートでスレッドが呼ばれるタイミングなどが
少しバグってしまったのでは???

と考えています。

同じ現象が起きる人がもしいたら是非共有しましょう

またこちらも合わせてどうぞ

[Skyland Tech Blog](http://skytechblog.hatenablog.com/)
リスニング > ラスボス > Part 3

http://qiita.com/7of9/items/12f49d4fdc7e518b3c55
の続き

Kids hack their Dad's computer on her Raspberry Pi
https://www.youtube.com/watch?v=W76o_iG7Y7g&list=WL&index=20
赤文字ははっきり聞き取れない部分。(Red part is what I couldn't listen correctly).
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。(Blue part is what I listened, but the grammar does not sit well).

(03:07-)
Now, if we type in `top`. <font color=red>XXX1</font> <font color=red>XXX2</font>. This will show you all of his processes and programs already running on his computer. And because he worked on Macintosh, they've got slightly different processes and programs are <font color=red>XXX</font>(running?). So, look, we've got <font color=red>XXX3</font>, found familiar like Finder. That's where <font color=red>XXX4</font> files stuff goes. 

(3:41-)
Twitter. Google Chrome. Google Mail. That's a bit of programs <font color=red>XXX5</font>. But when we are looking for programs called Sublime Text, that my dad's working right now. <font color=blue>That's some of the close down for the trick(?)</font>. So, let's see and find out and write down the number. Hey. Sublime Text. And I will write down the number. 91251.

(4:18-)
Now, for the trick for my dad, … I'm going to introduce my brother, Hello, He's looked up and goes <font color=red>XXX6</font> and a bit record my daddy, my dad on this trick. Let's go and warn him, then, Let's go and warn him, then, we're going to close his Sublime Text. 

(05:06-)
Hey. 
<font color=red>XXX7</font>.
<font color=red>XXX8</font>.
Why you're <font color=blue>video</font> <font color=red>XXX9</font>?
Ah, just for some..
(Dad, watch out)
Right, why is my computer talking to me?
Ah, nothing really.
<font color=red>XXX10</font> time to mp3 to play. My computer <font color=red>XXX11</font>.
No.
That' why <font color=blue>you are video</font>.

(05:29-)
Hopefully, that's closed Sublime Text. How did it work? 
Yes.
Yes, it worked. My evil plan comes true. Thank you for watching this video, hope you enjoyed it. And <font color=red>XXX13</font> <font color=red>XXX14</font>. Bye bye for now. See you on my <font color=red>XXX15</font> videos. Bye bye. 

<hr>
パーティは全滅しました(3割り程度分からなかった)。

Living On Earthで生の英語を聞いているつもりではいたが、もう少し聞き取りにくい英語のリスニング教材を探さないといけないようだ。
UITextView textColor 効かない

コードで textColorを変更しようとしても何故か効かなかった。。
Selectable属性のチェックが入っていないとダメみたい。。知らなかった。。

![selectable.png](https://qiita-image-store.s3.amazonaws.com/0/119864/b773150d-27ee-7b37-d55d-deab83bb457d.png)
【requireJS】階層ネームスペースを UMD型式で【commonJS】

#About
requireJSを今更導入しました
requireJSどころかJavaScript初心者なので
指摘あればお願いします

階層ネームスペース 例えば hoge.moge.test()
を作りたいが

```js
require(['hoge.moge' ], function( hoge.moge ) {
```

と記述すると、 関数の引数に　ドットは当然使えず、文法エラーを吐きます
ので、その対策に　少し時間がかかったのでメモ

とても単純なので手短に　答えだけを





# hoge.moge.fuga.test()

```html:index.html
<html>
<head>
    <title>require test</title>
    <script src="config/require_config.js"></script>
    <script data-main="js/start.js" src="js/require.js">
</head>
<body>
working!
</body>
</html>
```

```js:config/require_config.js
var require = {
    paths: {
          'hoge': '../js/hoge'
          , 'hoge.moge': '../js/hoge_moge'
          , 'hoge.moge.fuga': '../js/hoge_moge_fuga'
    }
};
```

```js:js/start.js

// functionの引数に hoge.moge 等のドット付きの変数名は使えないので、親の hogeを使いアクセスする！
// 実際には hoge.moge.fugaのみの依存関係だが、 hogeを使ってアクセスするため hogeも依存関係に入れる
require(['hoge', 'hoge.moge.fuga'], function( hoge ) {
  hoge.test();
  hoge.moge.test();
  hoge.moge.fuga.test();
});
```

```js:js/hoge.js

(function(factory){
    // CommonJS
    if (typeof exports === "object") {
        module.exports = factory();

    // RequireJS
    } else if (typeof define === "function" && define.amd) {
        define(factory);

    // <script>
    } else {
        hoge = factory();
    }

}(function(){

// 名前空間のみでも return {}　で空を返そう！
return {
    test: ( function (){ console.log("hoge");}) 
  }

}));
```

```js:js/hoge_moge.js

(function(factory){

    // CommonJS
    if (typeof exports === "object") {
        // commonJSはテストしていないので 参考までに・・　
        module.exports = factory(require('hoge'));

    // RequireJS
    } else if (typeof define === "function" && define.amd) {
        // hogeに依存する
        define( ['hoge'], factory);
    // <script>
    } else {
      // hoge.moge = ...　と名前空間を上書きしない
      factory(hoge);
    }

}(function(hoge){
// hogeを使ってアクセスする。　もちろん　hoge["moge"]でも良い
hoge.moge = function () {
  return{
    test: (function(){ console.log("moge");})
  }
}()} )) ;
```

```js:hoge_moge_fuga.js
(function(factory){

    // CommonJS
    if (typeof exports === "object") {
        // CommonJSはテストしてないので参考まで・・
        module.exports = factory(require('hoge'), require('hoge.moge'));

    // RequireJS
    } else if (typeof define === "function" && define.amd) {
        define( ['hoge', 'hoge.moge'], factory );

    // <script>
    } else {
      factory(hoge );
    }

}(function(hoge){
// hogeからアクセスする。 hoge.moge　からアクセスする方法わからなかった。。
hoge.moge.fuga = function () {

  return{
    test: (function(){ console.log("fuga");})
  }

}()} )) ;
```


#まとめ
function引数に　ドット付きの変数名は不可能なので
一番親の名前空間を利用してアクセスする必要がある
名前空間は最低でも空のブランケットをリターンする
Azure CLI Blob操作 メモ




## ログイン

```
azure login
```

azure account downloadは、エラーになるのはなぜ?


```
$ azure account download
error:   'download' is not an azure command. See 'azure help'.
```

[CLI から Azure へのログイン | Microsoft Azure](https://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli-connect/)


```
azure storage account connectionstring show <account_name>
```


## 一覧表示

```
azure storage blob list <コンテナ名>
```

File Storageの場合

```
azure storage file list
```


## アップロード

```
azure storage blob upload '~/images/HelloWorld.png' mycontainer myBlockBlob
```

File Storageの場合

```
azure storage file upload '~/temp/samplefile.txt' myshare myDir
```


## 関連用語

* Microsoft Azure
R install for linux トラブル ```package ‘stats’ in options("defaultPackages") was not found```

## install.packagesでエラー

ubuntu14.04にRをインストールしなおしたところ，
Rを起動し，install.packagesを行おうとすると，

```
Error in .chooseMirror(m, "CRAN", graphics, ind, useHTTPS)
 : could not find function "setNames"
```

調べてみたところ

```
sudo apt-get install r-base
sudo apt-get install r-base-dev
```
あたりをやりなおしてみれば？ という記事は出てくるものの，解決しない．

## package ‘stats’ in options("defaultPackages") was not found

よくよく確認してみると，R起動時に下記のエラーが出ていた．

```
Error in dyn.load(file, DLLpath = DLLpath, ...) : 
  unable to load shared object '/usr/lib/R/library/stats/libs/stats.so':
  /usr/lib/liblapack.so.3: undefined symbol: ATL_chemv
During startup - Warning message:
package ‘stats’ in options("defaultPackages") was not found 
```

ので，labackをインストールしなおす．

```
sudo apt-get install liblapack3
```

無事解決！
FootInput > Software description

Here's some information on the software I have developed for the operation using left hand and foot.


## Key input recognition with python on Raspberry Pi

[v0.6 @ github](https://github.com/yasokada/python-160423_footInput/releases/tag/v0.6)


## Input key to VK_Key convertor on Windows 7

C++ Builder Code 

[v0.3 @ qiita](http://qiita.com/7of9/items/d1bc7721e8849fcee4e8) with articles in Japanese

### Software features

Mindmap @ mindmup
https://atlas.mindmup.com/2016/05/eb82b840f1b60133b5fe0698cd91bbc8/footinput_softwaredesign_160501/index.html

<img src=https://atlas.mindmup.com/2016/05/eb82b840f1b60133b5fe0698cd91bbc8/footinput_softwaredesign_160501/thumb.png></img>
データサイエンスの面接において知っておくべき２１のQ＆A（日本語訳まとめぺーじ）

Originally published in KDnuggets: <a href="http://www.kdnuggets.com/2016/02/21-data-science-interview-questions-answers.html">21 Must-Know Data Science Interview Questions and Answers</a>
*KDnuggetsより正式に和訳を書くことの許可を得ました。*
*Gregory-san thank you for the approval*

データサイエンスの面接において聞かれる可能性がある質問とその答えをまとめた記事がKDnuggetsに**21 Must-Know Data Science Interview Questions and Answers**というタイトルで掲載されました。

その和訳を一つずつ行っていますが、まとめページとなります。

第一問[「正則化とは何か？」](http://qiita.com/ogamiki/items/57d37d83b624e6f44804)

第二問[「一番すばらしいと思うデータサイエンティストは？」](http://qiita.com/ogamiki/items/4872a0e74130a6a7d978)

第三問[「作成したモデルを検証するために何をしますか？」](http://qiita.com/ogamiki/items/102d2328ace3f7c908b3)

第四問[「適合率と再現率とは？ROC曲線との関連は？」](http://qiita.com/ogamiki/items/1ad297ca8761e00e0bca)

第五問[「アルゴリズムがよくなったことをどう証明しますか？」](http://qiita.com/ogamiki/items/230f9e1c14f37017eb32)

第六問[「根本原因解析(RCA)とは何ですか？」](http://qiita.com/ogamiki/items/e1928cc5dfe81b4cd51e)

第七問[「価格の最適化、価格弾力性、在庫管理、競合他社の情報に精通していますか？例を挙げてください」](http://qiita.com/ogamiki/items/dce980999608241f948a)

第八問「検定力( statistical power)とは何ですか？」

第九問「リサンプリング手法を挙げてください。またその価値は何ですか？またその制限は？」

第十問「FPがたくさんあるのとFNがたくさんあるのだとどちらがいいですか？」

第十一問「選択バイアスとはなんですか？またどう防ぐことができますか？」

第十二問「ユーザ行動計画を把握するための実験計画法をどうしますか？」

第十三問「ロングとワイドの違いはなんですか？」

第十四問「掲載された統計が間違っているかどうやって確認しますか？」

第十五問「Edward Tufteのチャートジャンクのコンセプトは？」

第十六問「外れ値を見つけた場合にどうしますか？」

第十七問「非常に稀な事象を調べるために極値理論、モンテカルロシミュレーションや数理統計学（または何か他のもの）のどれを使用しますか？」

第十八問「リコメンドエンジンとはどういうものですか？」

第十九問「FPとFNの違いと重要性は？」

第二十問「ビジュライゼーションにどんなツールを使いますか？R、SAS、Tableau？」

第二十一問「オーバーフィッティングをどうコントロールしますか？」
Youtube_dlを使って特定のプレイリストの動画を自動保存するPowerShellコード

前提条件としてYoutubeDataApiのキーが必要。ググって各自取るとよい。[pythonのyoutube-dl](https://rg3.github.io/youtube-dl/)も必要

使い方

```ps1:youtube-dl.ps1
& youtube-dl.ps1 -playlistId "PLwDaeL3aOb-x8wxSdbJvG0zOPGYLGz0tD"  -downloadLog list.txt -filePrefix "red-"
```

こんな感じ。playListIdは必須パラメーター。それ以外は任意。ただし、downloadLogのパラメーターを付けないと毎回全ての動画をDLする事になるから注意。
-filePrefixはその通りファイル名の頭につける。その辺は各自カスタマイズしてね

動作として、YoutubeAPIを使って指定のプレイリストの動画一覧を取得する→downloadLogのファイルを読み込んでファイルIDがあったらスキップ→ファイルIDが無い時はそれをダウンロード。って感じ。これをcronと組み合わせればとても美味しい

```ps1
# utf16です
Param(
	[Parameter(mandatory)][string]$playlistId = "" ,
	[string]$downloadLog = "" ,
	[string]$filePrefix="" 
)
$script:apiKey="";#各自よろしく

function Main{
	$vids = getDownloadVideoIdList
	$vids | foreach{
	#	"line=[$_] "+$_.getType()
	}
	getAllSnippet $playlistId  | foreach {
		$videoId=$_.resourceId | foreach videoId
		if ( $videoId -eq $null ){
			return
		}
		if ( $vids -contains $videoId){
			return
		}
		$argument = "-o `"${filePrefix}%(title)s[%(display_id)s].%(ext)s`" --no-check-certificate --no-mtime `"${videoId}`""
		$r=Start-Process -FilePath "youtube-dl" -ArgumentList $argument -Wait -NoNewWindow  -PassThru
		if ( $r.exitCode -eq 0 -and $downloadLog -ne "" ){
			$videoId >> $downloadLog
		}
		if($r.exitCode -ne 0){
		}
	}
}
function getAllSnippet($psID){
	while($true){
		if( $nextToken -eq "" ){
			$url="https://content.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=${playlistId}&key=${apiKey}"
		}else{
			$url="https://content.googleapis.com/youtube/v3/playlistItems?part=snippet&maxResults=50&playlistId=${playlistId}&pageToken=${nextToken}&key=${apiKey}"
		}
		$url
		$responce=Invoke-RestMethod -Method Get -Uri $url
		$nextToken = $responce.nextPageToken
		$videoIds=$responce.items | foreach snippet
		# | foreach resourceId | foreach videoId
		$videoIds
		if ( $nextToken -eq $null ){
			return
		}
	}
}
function getDownloadVideoIdList{
	$videoIds = @()
	if( $downloadLog -ne "" -and ( Test-Path -path $downloadLog) ){
		Get-Content $downloadLog -Encoding UTF8 | ForEach-Object {
			$videoIds+=$_
		}
	}
	$videoIds
}
Main

```
PowerShellでIPアドレスの範囲を指定してpingを実行する



たとえば、ping を 192.168.0.1 ～ 10 までに対して行いとき。
素のDOSプロンプトでもできますが、ここではPowerShellでやってみます。

以下のようすると、「$_」の部分が「1」「2」「3」のようにインクリメント
されながらpingが実行されます。 

```test:実行例
PS D:\> 1..10 | % { ping 192.168.0.$_ }

192.168.0.1 に ping を送信しています 32 バイトのデータ:
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128

192.168.0.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms

192.168.0.2 に ping を送信しています 32 バイトのデータ:
192.168.0.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.2 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.0.2 からの応答: バイト数 =32 時間 <1ms TTL=128
（以下略）

```

「1..10」の部分を「1..254」のようにすると、192.168.0.1~254
に対してpingすることになります。
Windows insider preview 14332を入れてみて

#はじめに
どうしてもwindows subsystems for linuxが試したくてinsider previewに入っちゃった。正直言うとちょっと怖かったけど、好奇心には勝てなかったよ、、、

##インストール
そんなに難しくはないので、詳しくは下記のリンクを参照してください。
[Bash on Windows 10を使い始めてみた。](http://qiita.com/kmry2045/items/15697e734b32da2c8b51)
登録してから、ビルドが降ってくるまで最低半日はかかるのでそこは辛抱強く待ってください

##Bashを使ってみる
もろもろの設定をすると、スタート画面に
![image](https://qiita-image-store.s3.amazonaws.com/0/103977/602d61c2-d4c0-800d-4db1-05647d2f4ede.png)
みたいなアイコンが現れる。
それでは起動。

![image](https://qiita-image-store.s3.amazonaws.com/0/103977/69ac7a08-dd2f-32d0-91b5-223c553c918d.png)

こんな感じの画面が現れます。
フォントと色はスタート画面のアイコンを左クリックして、[ファイルの場所を開く]から[プロパティ]→[フォント]で変更できます。

気づいたことを挙げると、
1. 日本語対応してた
2. NICはまだ見えない
3. フォントはものによっては崩れる（特に日本語）

といった感じでしょうか。
ひとまず、何が動くのかわからなかったので、gccとemacs入れてみました。
あと、コンパイラを動かす都合上、構文解析ライブラリのbisonと字句解析ライブラリのlexを入れてみた

```
takashi@DESKTOP-CM5RU88:~$ bison --version
bison (GNU Bison) 3.0.2
Written by Robert Corbett and Richard Stallman.

Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
takashi@DESKTOP-CM5RU88:~$ lex --version
lex 2.5.35
takashi@DESKTOP-CM5RU88:~$
```
今のところ正常に動いてくれてる
これだけで、作業が格段にやりやすくなる。


##困ったこと
そうやって喜んでたら、virtualbox動かなくなった。まあ、当たり前ではあるけど、、、
バージョン下げても、再インストールしてもダメっぽいので、どうしようか検討中。
そんなに困らないけど、、、

##追記
Vmwareはしっかり動作してくれたので、しばらくはそっちを使います。
PythonでURL短縮

##PythonでURL短縮をしてみました。
まず、短縮URLを生成するAPIを使用するのに必要である
APIキーを取得します。
下記URLのサイトでTokenを作成してください。
https://bitly.com/a/oauth_apps

そこで取得すれば下のコードのmain関数(```if __name__ == "__main__"```)内の変数access_tokenに入れます。
あとは、コマンドライン引数にて短縮するURLを指定すれば完成です。

実行例

```
von:~ von$ python /Users/von/Desktop/URL_Shortening.py https://www.youtube.com/
```
出力例

```
http://bit.ly/24eSWTH
```
```py:URL_Shortening.py
def GET_Url(access_token, longUrl):
	import urllib, urllib2, json
	url = 'https://api-ssl.bitly.com/v3/shorten'
	values = {
			"access_token": access_token,
			"longUrl": longUrl
			}
	req = urllib2.Request(url, urllib.urlencode(values))
	result = json.loads(urllib2.urlopen(req).read())
	return result["data"]["url"]

if __name__ == "__main__":
	import sys
	access_token = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
	print GET_Url(access_token, sys.argv[1])
```
フット入力 > フットペダル制作 > v0.2, v0.3 > スイッチ配置の最適化

関連 http://qiita.com/7of9/items/c5e39a8c08ca7a6e5af6

v0.1 :http://qiita.com/7of9/items/06e2433f7c048cc19c73#_reference-e673968e03a3e895949c

## v0.2

フットペダルv0.1においては、個々のスイッチが離れすぎて、ブラインドタッチが難しかった。
足のかかとを支点にして、つま先だけ移動すればブラインドタッチになるだろうと思い、以下を作ってみた。

部品はv0.1のものから流用。母材となる木を購入しなおした（＋１５９円）。
http://www.kohnan-eshop.com/shop/g/g4522831631056/

![DSC_0164.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/a291555d-68d9-a305-c7dd-b9d294eeb825.jpeg)

v0.2の使用感としては、ブラインドタッチはできるが、両足が接近しすぎて使用時に疲れやすそうだった。

## v0.3

v0.2の失敗を元に、以下のデザインに変更した（＋１５９円）。

- 左右のグループはある程度離す
- 各グループのスイッチは近接した位置にする
  - かかとを支点として、つま先だけの移動でフット入力できるように
- 下の写真では、青と黄がホームポジションになる

![DSC_0165.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/d86abbc0-56e5-9d50-4120-d8bc4a95db71.jpeg)

両足が離れていて楽。
ブラインドタッチも可能。

ハードとソフトが準備完了したので、あとは慣れの問題。
【Ruby】配列の要素を半角スペース区切りで出力する

## 条件

- 配列の要素を半角スペース区切りで出力する 
- 末尾の要素は半角スペースでなく改行で出力する

## 1次元配列の場合

```rb
array = ["red", "blue", "white"]
puts array.join(' ')
```

## 多次元配列の場合

```rb
array = ["red", ["blue", "gold", ["green", "pink"]], ["white", "brown"]]
puts array.join(' ')
```
Rubyは1次元配列でも多次元配列でも同様に書けるので素敵。

##関連

[【PHP】配列の要素を半角スペース区切りで出力する](http://qiita.com/hirymt/items/7272f43d97eb717e9bda)
【PHP】配列の要素を半角スペース区切りで出力する

## 条件

- 配列の要素を半角スペース区切りで出力する 
- 末尾の要素は半角スペースでなく改行で出力する

## 1次元配列の場合

```php
$array = ["red", "blue", "white"];
$space_separated = implode(" ", $array);
echo $space_separated . "\n";
```

## 多次元配列の場合

```php
$array = ["red", ["blue", "gold", ["green", "pink"]], ["white", "brown"]];
$number_of_value = count($array, COUNT_RECURSIVE);

$count = 0;
echoWithHalfSpace($array, $number_of_value);

function echoWithHalfSpace($array, $number_of_value) {
	global $count;
	foreach ($array as $value) {
		$count++;
		if (is_array($value)) {
			echoWithHalfSpace($value, $number_of_value);
		} elseif ($number_of_value === $count) {
			echo $value . "\n";
		} else {
			echo $value . " ";
		}
	}
}
```
もっとスマートな方法があるかも。

##関連

[【Ruby】配列の要素を半角スペース区切りで出力する](http://qiita.com/hirymt/items/a44aad56b680fb4fccde)
PHPでLINE Payを実装してみた（サンプルコードあり）

自社サイトがPHPだったので、LinePayをPHPで導入してみました。
必要最低限のAPIしか叩いてません。サンプルコードは以下の通り。

```php:linepay.php
<?php

if(!$_GET['transactionId']) {
  // ----------------------------------- 決済reserve
  $header = array(
    'Content-Type: application/json; charset=UTF-8',
    'X-LINE-ChannelId: 1466261954',
    'X-LINE-ChannelSecret: ed0e387bf251243d52c7c6a9a215cc26',
  );
  $postData = array(
    'productName' => "Test Item",
    'amount' => 800,
    'currency' => "JPY",
    'confirmUrl' => "https://hogehoge.com/linepay.php",
    'orderId' => "00001",
  );

  $ch = curl_init("https://api-pay.line.me/v2/payments/request");
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSLVERSION, 1);
  curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
  $rs = json_decode(curl_exec($ch), true);
  curl_close($ch);

  if($rs['returnCode'] == "0000") {
    header("Location: {$rs['info']['paymentUrl']['web']}");
  }
  else {
    echo "エラー番号：{$rs['returnCode']}";
  }
}
else {
  // ----------------------------------- 決済confirm
  $header = array(
    'Content-Type: application/json; charset=UTF-8',
    'X-LINE-ChannelId: 1466261954',
    'X-LINE-ChannelSecret: ed0e387bf251243d52c7c6a9a215cc26',
  );
  $postData = array(
    'amount' => 800,
    'currency' => "JPY",
  );

  $ch = curl_init("https://api-pay.line.me/v2/payments/{$_GET['transactionId']}/confirm");
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSLVERSION, 1);
  curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
  curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
  $rs = json_decode(curl_exec($ch), true);
  curl_close($ch);

  if($rs['returnCode'] == "0000") {
    echo "決済成功：{$rs['returnCode']}";
  }
  else {
    echo "エラー番号：{$rs['returnCode']}";
  }
}

?>
```

![line.png](https://qiita-image-store.s3.amazonaws.com/0/72802/8295f7fd-9bb2-d63a-ee6e-79fb67853989.png)

詳しくは、「[LINE PayのAPIをPHPで実装してみた](http://kawaidesu.com/php/line-pay/)」へどうぞ！
Swift で NSCache を Generics にして便利に

## NSCache

イメージなどをファイルから読み込む、またはon the flyで処理して利用するにはちと重いデータなどは、一度処理して結果を `NSCache` に保存しておく事は TableView などの表示には有効です。

ところが、`NSCache` とのインターフェースは `AnyObject` なので、Swiftで使うときはいちいち `as? MyObject` とかキャストしなくてはなりません。

そこで、`NSCache` をラップして Generics で使えるようにしてみました。

```ZCache.swift
import Foundation


class ZCache<T: AnyObject> {

	private var cache = NSCache()

	var delegate: NSCacheDelegate? {
		get { return self.delegate }
		set { self.cache.delegate = newValue }
	}
	
	var name: String {
		get { return self.cache.name }
		set { self.cache.name =  newValue }
	}

	func objectForKey(key: AnyObject) -> T? {
		return self.cache.objectForKey(key) as? T
	}

	func setObject(obj: T, forKey key: AnyObject) {
		self.cache.setObject(obj, forKey: key)
	}

	func setObject(obj: T, forKey key: AnyObject, cost g: Int) {
		self.cache.setObject(obj, forKey: key, cost: g)
	}

	func removeObjectForKey(key: AnyObject) {
		self.cache.removeObjectForKey(key)
	}

	func removeAllObjects() {
		self.cache.removeAllObjects()
	}

	var totalCostLimit: Int {
		get { return self.cache.totalCostLimit }
		set { self.cache.totalCostLimit = newValue }
	}

	var countLimit: Int {
		get { return self.cache.countLimit }
		set { self.cache.countLimit = newValue }
	}

	var evictsObjectsWithDiscardedContent: Bool {
		get { return self.cache.evictsObjectsWithDiscardedContent }
		set { self.evictsObjectsWithDiscardedContent = newValue }
	}

	// MARK: -
	
	subscript(key: AnyObject) -> T? {
		get { return self.cache.objectForKey(key) as? T }
		set {
			if let newValue = newValue {
				self.cache.setObject(newValue, forKey: key)
			}
			else {
				self.cache.removeObjectForKey(key)
			}
		}
	}

}
```

`NSCache` のすべてのメソッドをラップしていますので、オリジナルと同様に利用できるはずです。加えて `subscript(key: AnyObject)` でアクセスできるようにしてみました。その際、セッターは nil を設定した場合は、オブジェクトを remove しています。

generics で実装されていますので、毎回毎回キャストする必要はなく、Swift らしくコーディングを進めることができるのではないでしょうか？

利用例を紹介いたします。

```.swift
var cache = ZCache<NSImage>()

cache["1"] = NSImage(named: "1") // assume there is!!
let image1 = cache["1"] // image

cache["1"] = nil
let image2 = cache["1"] // nil
```

コードは gist からも入手可能です。
https://gist.github.com/codelynx/29b2c2a36d290cec58a009ef712f33b0


それでは、みなさん、Have a happy coding!!

## 関連情報

Swift で Key や Value に弱参照が使える Dictionary 的な方法を考える
http://qiita.com/codelynx/items/27b8dd8c3ac49f6316ef

## 環境情報

```
swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
```
HTML,CSS勉強メモ #22 ～&laquo;と&raquo;～

##**進度**##
<dl>
<dt>Bootstrap 3.0入門</dt>
<dd>10:breadcrumb,pagination,pagerを使おう</dd>
<dd>11:Navbarを使ってみよう</dd>
<dd>12:Navbarをスマホ対応にしよう</dd>
<dd>13:label,badge,alert,panelを使おう</dd>
<dd>14:progress-barを使ってみよう</dd>
<dd>15:Modalウィンドウを使ってみよう</dd>
<dd>16:Tabメニューを使ってみよう</dd>
<dd>17:tooltip,popoverを使おう</dd>
</dl>


##**メモ**##
###&laquoと&raquo
10:breadcrumb,pagination,pagerを使おうの中でこの二つが出てきます。
HTMLエンティティ(特殊文字の表示)でした。
&laquo「<<」
&raquo「>>」

###popover
現在`popover`が上手くいかなくてハマっています。
`tooltip`は出来たのですが、`popover`の方も`tooltip`と同じになってしまって上手くいきません。
しかし現在実家帰省中で、ずっとデスクトップでやっていた私はGitHubにプッシュするのも忘れ、データも持ってこなかったため原因究明ができません。ということでこちらでは飛ばして先に進んでおこうと思います。
この問題の原因究明は帰ってから行います。
実行ファイルとその依存ライブラリに特定シンボルがあるかを調べる（簡易版)

# 目的

デバッグ時に今の実行環境で特定シンボルが使用されているかを判別したい時があります。
（LD_PRELOADで特定関数をフックしたい時など => 参考: [LD_PRELOADでprintfを後から差し替える - Qiita](http://qiita.com/koara-local/items/d5205f94decade3ffbf1) )

その場合の調査方法をまとめました。

# 実行ソース
基本的に `ldd` と `readelf` を使うだけですが、せっかくなのでツール化しました。

```bash:elf_symbol_searcher.sh
#!/bin/bash

APP=$1
SYMBOL=$2

LIST=$(echo $APP; ldd $APP \
    | grep -v -E 'ld-linux*.so' \
    | grep -v 'linux-vdso.so' \
    | grep -v 'linux-gate.so' \
    | awk '{print $3}')

for f in $LIST
do
    echo $f
    readelf -s -W $f | grep $SYMBOL
done
```

`ldd` で依存ライブラリを取得していますが、`ld-linux*.so` と `Linux Virtual Dynamic Shared Objects`([参考](http://www.ibm.com/developerworks/jp/linux/library/l-lpic1-102-3/))は除外しています。
`nm` でもシンボルは取得できますが `strip` されているとシンボルが見えなくなるため、今回は `readelf` を使用しています。


実行例としては以下のようになります。
今回の対象は `/usr/bin/weston` で、検索対象は `eglSwapBuffers` になります。

```shell-session:実行結果
$ ./elf_symbol_searcher.sh /usr/bin/weston eglSwapBuffers
/usr/bin/weston
   166: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND eglSwapBuffers
/usr/lib/x86_64-linux-gnu/libwayland-server.so.0
/usr/lib/x86_64-linux-gnu/libpixman-1.so.0
/usr/lib/x86_64-linux-gnu/mesa-egl/libEGL.so.1
   180: 0000000000006fb0   380 FUNC    GLOBAL DEFAULT   11 eglSwapBuffersRegionNOK
   187: 0000000000009850   339 FUNC    GLOBAL DEFAULT   11 eglSwapBuffers
   235: 00000000000079e0   427 FUNC    GLOBAL DEFAULT   11 eglSwapBuffersWithDamageEXT
/usr/lib/x86_64-linux-gnu/mesa-egl/libGLESv2.so.2
/usr/lib/x86_64-linux-gnu/libxkbcommon.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libm.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libffi.so.6
/lib/x86_64-linux-gnu/librt.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/usr/lib/x86_64-linux-gnu/libX11-xcb.so.1
/usr/lib/x86_64-linux-gnu/libX11.so.6
/usr/lib/x86_64-linux-gnu/libxcb-dri2.so.0
/usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0
/usr/lib/x86_64-linux-gnu/libxcb.so.1
/usr/lib/x86_64-linux-gnu/libwayland-client.so.0
/usr/lib/x86_64-linux-gnu/libgbm.so.1
/usr/lib/x86_64-linux-gnu/libdrm.so.2
/usr/lib/x86_64-linux-gnu/libglapi.so.0
/usr/lib/x86_64-linux-gnu/libXau.so.6
/usr/lib/x86_64-linux-gnu/libXdmcp.so.6
```

とても簡易的ですが、本体の `weston` と `eglSwapBuffers` を実装している `libEGL` にシンボルがあることが調査できました。

スクリプトは以下にも公開しています。(pythonとかで書いてもう少し使いやすくする予定)
https://github.com/koara-local/elf_symbol_searcher

# TODO

以上でもデバッグ用途には使用できますが、もうちょっと詳しく検索できると良さそうです。

+ シンボルの複数指定 + 正規表現での検索
+ 除外ライブラリの指定
+ C++の場合のデマングル前後での検索

など

# 参考
[Linux の 101 試験対策: 共有ライブラリーの管理](http://www.ibm.com/developerworks/jp/linux/library/l-lpic1-102-3/)
ImgurのAPIを利用し匿名画像アップロード(PHP編)

#imgurとは？

よく２ちゃんで利用されている最強画像アップローダーのimgur、ご存知でしょうか？
匿名で画像アップロードできて、なおかつ無期限で保存されているので便利です。
これを今回はPHPから使ってみます。結果はjsonで取れます。

ちなみにRuby編なら既存でありました。こちらです。
[最強の画像アップロードサイト「Imgur.com」のAPIを利用する（匿名画像アップロード編)](http://qiita.com/AKB428/items/a5f68a3288cc596975ae)

#ImgurAPIをPHPで利用
API叩いてみましょう。
##環境
・PHP7

##会員登録
まずは[imgur](http://imgur.com)で会員登録してください。登録後ログインします。

##クライアントID取得
会員登録しログインしたら、まずはクライアントIDを取得します。
[Register an Application](https://api.imgur.com/oauth2/addclient)
を埋めていきます。

<img width="752" src="https://qiita-image-store.s3.amazonaws.com/0/110510/bae5da66-7151-f079-7a53-44ea0e5e0da7.png">



Application nameとAuthorization typeを埋めましょう。
今回はAnonymousにします。
callback URLは適切なものをお願いします。
あとメアドも入力します。

以上でSubmit!

登録後、クライアントIDを控えます。
<img width="352" src="http://1.bp.blogspot.com/-VcTfGBwRRVM/Unu7eZ9KRSI/AAAAAAAADS0/G51gyDi2pl8/s1600/0067.png">

##さっそくPHPで利用してみる。
jsonで返ってくるようにしてあります。適当に利用してください。

```php:index.php
<?
if(isset($_FILES['img'])) $img = $_FILES['img'];
if(isset($_POST['submit'])){ 
 if($img['name']==''){  
  echo "画像を選択してください";
 }else{
  $filename = $img['tmp_name'];  
  $client_id="abb66f6794xa77c";//各自のクライアントIDを入力
  $handle = fopen($filename, "r");
  $data = fread($handle, filesize($filename));
  $pvars   = array('image' => base64_encode($data));
  $timeout = 30;
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, 'https://api.imgur.com/3/image.json');
  curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
  curl_setopt($curl, CURLOPT_HTTPHEADER, array('Authorization: Client-ID ' . $client_id));
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $pvars);
  $out = curl_exec($curl);
  curl_close ($curl);
  $pms = json_decode($out,true);
  var_dump($pms);
 }
} else {
print<<<EOF
  <form action="index.php" enctype="multipart/form-data" method="POST">
  <input name="img" size="35" type="file"/><br/>
  <input type="submit" name="submit" value="アップロード"/>
  </form>
EOF;
}
```
iterm2のショートカットキーをtmuxの操作に割り当てる



## 準備
- iterm2 > Preferences > Profiles で、デフォルトを雛形に自分のProfile設定を作っておく
- [key-codes.app](https://itunes.apple.com/jp/app/key-codes/id414568915?mt=12)をインストールして、任意のキーのhexcodeを調べられるようにしておく
- tmuxをセットアップして、.tmux.confで設定できるようにしておく

- tmux.confに前提となる設定を入れておく

```.tmux.conf
# prefixキーをC-tに変更する
set -g prefix C-t

# C-bのキーバインドを解除する
unbind C-b

# iterm2 のsend hexcode の設定との組み合わせを動かすためのおまじない
set -g assume-paste-time 0

```

下記のマップ表を参考に、
iterm2のprofileのkeyに、iterm-keysとsend hexcodeの情報を入力し、.tmux.confにtmux-bind-keyの情報を入力していく。


## iterm2の操作をtmuxのアクションにマップする

iterm-keys  | send hexcode      | key                  | tmux-bind-key                     | 説明
----------  | ----------------- | ---                  | --------------------------------- | ---------------
Shift+Cmd+D | 0x14 0x22         | Ctrl+T "             | # default " split-window -v       | 縦にPane分割
Cmd+D       | 0x14 0x25         | Ctrl+T %             | # defualt % split-window -h       | 横にPane分割
Cmd+[       | 0x14 0x50         | Ctrl+T P             | bind P select-pane -t :.-         | 次のPaneに移動
Cmd+]       | 0x14 0x4e         | Ctrl+T N             | bind N select-pane -t :.+         | 前のPaneに移動
Cmd+T       | 0x14 0x63         | Ctrl+T c             | # default c new-window            | 新しいWindow
Cmd+W       | 0x14 0x77         | Ctrl+T &             | # default & kill-window           | Windowを閉じる
Cmd+←       | 0x14 0x70         | Ctrl+T p             | # default p select-window -t :-   | 前のWindowに移動
Cmd+→       | 0x14 0x6e         | Ctrl+T n             | # default n select-window -t :+   | 次のWindowに移動
Cmd+↑       | 0x14 0x5b 0x19    | Ctrl+T [ Ctrl+Y      | # default (ただしmode-keys vi)    | 上に一行Scroll
Cmd+↓       | 0x14 0x5b 0x05    | Ctrl+T [ Ctrl+E      | # default (ただしmode-keys vi)    | 下に一行Scroll
Cmd+Fn+↑    | 0x14 0x5b 0x15    | Ctrl+T [ Ctrl+U      | # default (ただしmode-keys vi)    | 上に画面半分Scroll
Cmd+Fn+↓    | 0x14 0x5b 0x04    | Ctrl+T [ Ctrl+D      | # default (ただしmode-keys vi)    | 下に画面半分Scroll


## 私の環境のkey-codesメモ
人によって違うと思うが参考までに私のMacbookProのkeycodeを貼っておく。

hex code | key
-------- | ---
0x1b | esc
0x21 | !
0x22 | "
0x23 | #
0x24 | $
0x25 | %
0x26 | &
0x27 | '
0x28 | (
0x29 | (
0x2a | *
0x2b | +
0x2c | ,
0x2d | -
0x2e | .
0x2f | /
0x30 | 0
0x31 | 1
0x32 | 2
0x33 | 3
0x34 | 4
0x35 | 5
0x36 | 6
0x37 | 7
0x38 | 8
0x39 | 9
0x40 | @
0x41 | A
0x42 | B
0x43 | C
0x44 | D
0x45 | E
0x46 | F
0x47 | G
0x48 | H
0x49 | I
0x4A | J
0x4B | K
0x4C | L
0x4D | M
0x4E | N
0x4F | O
0x50 | P
0x51 | Q
0x52 | R
0x53 | S
0x54 | T
0x55 | U
0x56 | V
0x57 | W
0x58 | X
0x59 | Y
0x5a | Z
0x5b | [
0x5c | \
0x5d | ]
0x5e | ^
0x5f | _
0x60 | `
0x61 | a
0x62 | b
0x63 | c
0x64 | d
0x65 | e
0x66 | f
0x67 | g
0x68 | h
0x69 | i
0x6a | j
0x6b | k
0x6c | l
0x6d | m
0x6e | n
0x6f | o
0x70 | p
0x71 | q
0x72 | r
0x73 | s
0x74 | t
0x75 | u
0x76 | v
0x77 | w
0x78 | x
0x79 | y
0x7a | z
0x7b | {
0x7c | |
0x7d | }
0x7e | ~
0x7f | backspace
mac OSX おいて bundle install のnokogiri でエラー

##結論
いろいろと解が散見されているが、ぼくは結局 nokogiri のチュートリアルで解決できた。(それでしか解決できなかった)
ので、備忘録

###
[チュートリアルはこちら](http://www.nokogiri.org/tutorials/installing_nokogiri.html#mac_os_x)
WebStorm の Live Edit 機能を有効にする

## Live Edit 機能とは

HTML/CSS などをデバッグする際、ブラウザをオートリロードしてくれる機能

![live edit.gif](https://qiita-image-store.s3.amazonaws.com/0/100496/d04cb32c-1763-cd85-1582-12c8f2468802.gif)

> Live Editing of HTML, CSS, and JavaScript
> https://www.jetbrains.com/help/webstorm/2016.1/live-editing-of-html-css-and-javascript.html

## 環境
- MacOS X El Capitan: 10.11.4
- WebStorm: 2016.1

## 設定方法

### Chrome Extension のインストール

https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji.

**これだけでOK**

> 細かな設定等は[公式ページ](https://www.jetbrains.com/help/webstorm/2016.1/live-editing-of-html-css-and-javascript.html)参照

## 確認

適当なプロジェクトを開いて Chrome を起動。ブラウザ側でデバッグ用のタブが開く

![Screen_Shot_2016-05-01_at_17_01_06.png](https://qiita-image-store.s3.amazonaws.com/0/100496/6e07a172-0087-e347-9335-ca5dffd95030.png)

デバッグを実行

![](https://qiita-image-store.s3.amazonaws.com/0/100496/47969d22-b827-a5b3-f243-fa6939c8eb0b.png)

あとはエディタ側で編集する度にブラウザ側も再描画される
![live edit.gif](https://qiita-image-store.s3.amazonaws.com/0/100496/d04cb32c-1763-cd85-1582-12c8f2468802.gif)

## 上手く作動しない場合

### Live Edit 機能が有効かどうか確認

`Preferences` -> `Editor` -> `Plugins` と辿り、 `LiveEdit` にチェックボックスが入っているか確認しましょう

![Screen Shot 2016-05-01 at 16.18.48.png](https://qiita-image-store.s3.amazonaws.com/0/100496/ee6b68bf-c2fc-85ec-8ffd-d91a7ee7dc1c.png)
GitLabをCentOS6にインストール、サブディレクトリ運用やポート変更


GitLab Community Edition 8.7.0(2016/5/6時点での最新バージョン)のインストール方法について。

* とても簡単。5分くらい。
  <br/>→GitLab以外も同じサーバーで運用する場合、もう少しカスタマイズが必要そう。
* 公式ドキュメントの通りインストールでNginx、unicorn(rubyアプリケーションサーバー。gitlabはruby on rails)の一緒にインストールされる。
* サブディレクトリ変更やポート変更は、以前は幾つかの設定ファイルを変更する必要があったようだが今は設定ファイル１つのみの変更でokだった。

####参考
https://about.gitlab.com/downloads/
http://doc.gitlab.com/omnibus/settings/configuration.html


##インストール

公式がわかりやすくて簡単。
https://about.gitlab.com/downloads/

以下、上記公式からそのまま転記。

1． GitLabに必要なモジュール、設定をインストール

```
sudo yum install curl openssh-server openssh-clients postfix cronie
sudo service postfix start
sudo chkconfig postfix on
sudo lokkit -s http -s ssh
```

2．GitLabダウンロード＆インストール

```
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo yum install gitlab-ce
```


3．GitLabの初期設定&起動

```
sudo gitlab-ctl reconfigure
```

4．http://[サーバーアドレス] にアクセス。GitLabの初期設定ページが表示される。初回は root ユーザーのパスワードを入力するページが表示される。


##準備

変更前に以下を実行しておく（１度でok）。
以下のコマンドを実行しておかないと「gitlab-ctl reconfigure」でエラーが発生した。

```
sudo NO_PRIVILEGE_DROP=true USE_DB=false gitlab-rake assets:clean assets:precompile
sudo chown -R git:git /var/opt/gitlab/gitlab-rails/tmp/cache
```


##サブディレクトリ運用

1．/etc/gitlab/gitlab.rbのexternal_urlを変更。

```/etc/gitlab/gitlab.rb
#external_url "https://example.com"
external_url "https://[サーバーアドレス]/xxxx"
```

2．GitLabの再設定&再起動

```
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
```



##ポート変更
サブディレクトリ運用とほとんど同じ。

1．/etc/gitlab/gitlab.rbのexternal_urlを変更。

```/etc/gitlab/gitlab.rb
#external_url "https://example.com"
external_url "https://[サーバーアドレス]:8080"
```

2．GitLabの再設定&再起動

```
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
```


##サブディレクトリ&ポート変更

* サブディレクトリかつポート変更は以下のようにやるとできました。これもGitLab内臓のNginxでdekita.

* この方法では別のアプリケーションサーバーと共存可能。
→上記の場合、[サブディレクトリ運用]、[ポート変更]のやり方では別のアプリケーションサーバーできなかった。

参考
http://shimakaze.hatenablog.com/entry/2016/01/13/100526

###サブディレクトリ：gitlab、ポート:8787で運用する場合

1．/etc/gitlab/gitlab.rbを以下のように変更。

```/etc/gitlab/gitlab.rb
external_url 'http://[サーバーアドレス]:8787/gitlab'
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 10087#内部で起動するunicornのポート

nginx['listen_port'] = 8787#外部からの待ち受けポート。nginxのポート。
nginx['listen_https'] = false#今回はhttps利用しないのでfalse。利用する場合はtrueにして、証明書などの設定を行う。
```

2．GitLabの再設定。

```
#chefで設定関連が行われる
sudo gitlab-ctl reconfigure
```

3．/var/opt/gitlab/gitlab-rails/etc/gitlab.ymlを以下のように変更。

```/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
#relative_url_root
relative_url_root: /gitlab 
```

4．/var/opt/gitlab/gitlab-rails/etc/unicorn.rbに、以下を最終行に追記。

```/var/opt/gitlab/gitlab-rails/etc/unicorn.rb
ENV['RAILS_RELATIVE_URL_ROOT'] = '/gitlab' 
```

5．/var/opt/gitlab/gitlab-shell/config.ymlを以下のように変更。

```/var/opt/gitlab/gitlab-shell/config.yml
#private ip で起動するunicornのurlを記載。
gitlab_url: "http://127.0.0.1:10087/gitlab"
```

6．GitLabの再起動。

```
sudo gitlab-ctl restart
```

7．数分後、ブラウザで以下にアクセス。gitlabのページが表示されればok。
http://[サーバーアドレス]:8787/gitlab