OmniAICreator/Qiita-1.07M huggingface dataset:
SoftEther vpnserver (接続できた)

`softether vpnserver`の良い所は、パッケージの追加が不要で環境を汚さないことですね。
設定が日本語というのもよい。

## 参考

* [AWS(EC2)でSoftEtherを使ってL2TP/IPsecなVPNを構築する (Mac) - Qiita](http://qiita.com/showwin/items/92861057a8b62611444d)
* [6.2 vpncmd の一般的な使用方法 - SoftEther VPN プロジェクト](https://ja.softether.org/4-docs/1-manual/6/6.2)

## 以下ポートを開放しておく

* ESP
* UDP 500
* UDP 4500

## インストール

* [SoftEther ダウンロード センター](http://www.softether-download.com/ja.aspx)


![スクリーンショット 2015-06-19 12.03.45.png](https://qiita-image-store.s3.amazonaws.com/0/25728/6b548eb9-b9b1-c5ba-b5bc-64dbfa4160ba.png "スクリーンショット 2015-06-19 12.03.45.png")


```bash:
tar xzf softether-vpnserver-*-linux-x64-64bit.tar.gz
cd vpnserver
make -f Makefile
```

```bash:起動
sudo ./vpnserver start
```

* [VPN Server 側での L2TP/IPsec 機能の有効化方法 - SoftEther VPN プロジェクト](https://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/1)

```bash:設定例
vpncmd

VPN Server/DEFAULT>UserCreate User1 /GROUP:none /REALNAME:none /NOTE:none
VPN Server/DEFAULT>UserPasswordSet User1
VPN Server/DEFAULT>SecureNatEnable
```

```bash:
VPN Server/DEFAULT>IPsecEnable
IPsecEnable コマンド - IPsec VPN サーバー機能の有効化 / 無効化
L2TP over IPsec サーバー機能を有効 (yes / no): yes
Raw L2TP サーバー機能を有効 (yes / no): no
EtherIP / L2TPv3 over IPsec サーバー機能を有効 (yes / no): no
IPsec 事前共有鍵の文字列 (9 文字以下を推奨): XXXXXXXXX
VPN 接続時に仮想 HUB 名が省略された場合のデフォルト仮想 HUB 名: DEFAULT
コマンドは正常に終了しました。
```

VPN接続したら 192.168.30.0/24 が割り振られます。

### Macからの接続の注意

![スクリーンショット 2015-06-19 19.38.14.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b7af8144-254d-0a2c-c159-9ab90b01159b.png)

接続の優先順位を一番上にすること。

![スクリーンショット 2015-06-19 19.35.05.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4637940e-38f7-49b6-dfe4-be2a181cd6db.png)

すべてのトラフィックをVPN接続経由で送信にチェック。

### AirMacの設定

* どこでもMyMacの登録はしないこと(udp500の割り当てができなくなる)

![スクリーンショット 2015-06-19 20.31.15.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a755230a-33c1-12ce-b791-689a87d2c21e.png)

* 手でudp500, udp4500も追加

![スクリーンショット 2015-06-19 20.30.58.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3d653840-0082-46a6-c0ce-e1aa59dcb92a.png)

自分はこれで接続ができた。

## ログ

```bash:
tail -f server_log/vpn_20150619.log
```

## 停止

```bash:停止
sudo ./vpnserver stop
```
PaperClipのstyleで指定する記号の意味

PaperClipのstyleで指定する記号の意味

画像アップロード用GemにPaperClipがあります。

```rb
has_attached_file :value, styles: { large: "2048x<", medium: "1024x768", thumb: "100x100>" }
```

と書くだけでファイルを保存できるようになるスグレモノです。

`style` にリサイズのオプションをいろいろ渡せるみたいだったのでまとめ。

#### 縦横比を保持せず強制的に100px × 100pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "100x100!" }
```

#### 縦横比を保持したまま、100px × 100pxに納まる最大サイズでリサイズする

```rb
has_attached_file :value, styles: { medium: "100x100" }
```

#### 縦横比を保持したまま、横100pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "100x" }
```

#### 縦横比を保持したまま、縦100pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "x100" }
```

#### 元画像が横100pxよりも大きいときだけ、縦横比を保持したまま、横100pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "100x>" }
```

#### 元画像が縦100pxよりも大きいときだけ、縦横比を保持したまま、縦100pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "x100>" }
```

#### 元画像が100px × 100pxよりも大きいときだけ、縦横比を保持したまま、100px × 100pxに納まる最大サイズでリサイズする

```rb
has_attached_file :value, styles: { medium: "100x100>" }
```

#### 元画像が横300pxよりも小さいときだけ、縦横比を保持したまま、横300pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "300x<" }
```

#### 元画像が縦300pxよりも小さいときだけ、縦横比を保持したまま、縦300pxにリサイズする

```rb
has_attached_file :value, styles: { medium: "x300<" }
```

#### 元画像が300px × 300pxよりも小さいときだけ、縦横比を保持したまま、300px × 300pxより大きい最小サイズでリサイズする

```rb
has_attached_file :value, styles: { medium: "300x300<" }
```

#### 縦横比を保持したまま、元のサイズの50%にリサイズする

```rb
has_attached_file :value, styles: { medium: "50%" }
```
nginxでlocationを使う時の演算子


知らなかったのでメモ

```text
# 「=」は完全一致。/index.phpにしか反応しない
location = /index.php {
}

# 無印は前方一致、但し正規表現より弱い
location /index.php {
}

# 「^~」も前方一致、こちらは正規表現より強い
location ^~ /index.php {
}

# 「~」はcase sensitive(大文字と小文字を別に扱う)な正規表現
location ~ ^/index\.php$ {
}

# 「~*」はcase insensitive(大文字と小文字を区別しない)な正規表現
location ~* ^/index\.php$ {
}
```

~*を知らずに `location ~ (jpe?g|JPE?G|gif|GIF|png|PNG)$` とかやっていた。。
oh-my-zshでプロンプトの表示がおかしくなった


自分はoh-my-zshのgalloisテーマをずっと使っています。
先日バージョンアップをしたところ、右側にRubyのバージョンが表示されなくなってしまいました。

そこまで不便ではないのと、原因がよくわからないので放置しておいたのですが、やっぱり気になるので本腰を入れて調査してみました。

## 原因

galloisテーマが更新されて、oh-my-zshのプラグインを呼ぶようになっていたことが原因でした。

この修正の時に、Rubyのバージョンを取得をプラグイン経由で行うようになっていました。

https://github.com/robbyrussell/oh-my-zsh/commit/b2ce306c4f49ebb1ef2bde5b86d553ce6ea674aa#diff-0dc1d11e542313c60edbb4f77d41bbaf

## 対応

読み込むプラグインを追加しました。

修正前

```sh
plugins=(git)
```

修正後

```sh
plugins=(my-env atom autojump brew brew-cask bundler cdd colored-man composer docker encode64 gem git homeshick pow rails rake rbenv tig tmux vagrant web-search)
```

いろいろプラグインがあったので、ついでに入れてみました。

## 結論

oh-my-zshいい！
Macであるディレクトリ以下のファイル内の特定文字列を一括置換する方法

Linuxサーバ上の時と若干違うので注意

```
find . -name '*.html' | xargs sed -i "" 's/置換前文文字列/置換後文字列/g'
```

とすると、カレントディレクトリ以下のhtmlファイルの文字列が置換される。

よく忘れるのでメモ。
BeaconBridgeのリファレンスアプリを使ってみた(Android)

BeaconBridgeにはAndroid用のアプリもあるので、
こちらも試してスクリーンショットを載せておきます。
<a href="https://play.google.com/store/apps/details?id=jp.co.cresco.beaconbridge.sample.app">BeaconBridgeリファレンス(Android)</a>

## 利用端末
* Nexus6 (5.1.1)
* iPhone6+ （iOS用のBeaconBridgeリファレンスアプリを使って、iBeacon代わりに利用）

## スクリーンショット
### 1. 起動画面

会議室チェックイン？？？？
BLEが必要なのは分かるけど、会議室チェックインとは？
一応、Bluetoothの設定を有効にしろとのことなので、BluetoothはONにしました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/d933acd1-764d-2333-9a25-3fb35b87519d.png" alt="trial" width="300">


### 2. BeaconBridge連携説明画面
スワイプするとBeaconBridgeと連携するからネットワーク必要だよという説明がありました。
私はSIM入りだし、Wi-Fiにもつながっているので、問題なし。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/f31fc5f9-35bf-0049-51c4-5f15243c9795.png" alt="trial" width="300">


### 3. 動作開始
動作開始ボタンを押すと、クリアボタンが1つだけの画面になりました。
iOSアプリとのあまりの違いに少し不安に。。。　本当に動いている？

<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/44304369-9c05-7cea-fcf6-76f08317c60c.png" alt="trial" width="300">


### 4. Local Push

iOS用のリファレンスアプリをBeacon Modeにし、サンプルBeacon① のアドバタイズを行ってみたところ、
Notification通知が来て、画面が更新されました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/4ec2541d-df33-3517-d04c-b9c4a725a44a.png" alt="trial" width="300">

### 5. Notification
こんな感じのNotificationが表示されました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/704727c0-8f64-9e3f-2209-cd06e74dbf70.png" alt="trial" width="300">

### 6. Web Access
同様にiOS用のリファレンスアプリでサンプルBeacon② のアドバタイズを行ったところ、BeaconBridgeのログイン画面がChromeで起動されました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/ba3c40bf-215f-ac24-da9f-78fa39cb060c.png" alt="trial" width="300">

### 7. Web Access後
リファレンスアプリに戻ると、WebAccessの履歴が追加され、ログイン画面のURLが表示されていました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/67540/5807abf6-1a6b-6084-df59-a4a7204bfd8a.png" alt="trial" width="300">

## 感想
* iOSと違い、BLEのアドバタイズをする機能が無い。
Nexus6ではペリフェラルになれるため、端末が未対応ということではないと思う。
AndroidではiBeaconの仕様でアドバタイズをするのが難しかったからだろうか。
* 機能が少ないこともあり、画面もシンプル。操作できることもほとんどないため、迷うことがない。
ただ、動作中かどうかが分かりずらい点は直したほうがいいと思う。
[JAWS-UG CLI] #22 - Kinesis入門


注意事項
=====

本ハンズオンで利用料金が発生します
----------

- Kinesisに無料枠はありません。僅かながらも課金されます。
- 実施後は必ずストリームを削除してください。時間課金されます


ハンズオン環境の準備
==================

- JAWS-UG CLI ハンズオンのための事前準備
	- http://qiita.com/tcsh/items/14c3278f69ab073afe0f
- #22 Kinesis 入門 では、上記に加え bc コマンドを使います。このコマンドは、場合によってはインストールされていない可能性があります。`which bc`を実行し、パスが表示されなければ、別途 yum 等で bc コマンドをインストールしてください



概要
=====

説明資料
--------

- Amazon Kinesis 入門: http://www.slideshare.net/daikumatan

ハンズオン
--------

- Kinesis 管理者グループの作成: <http://qiita.com/daikumatan/items/b5ec5661c8927bee2aef>
- ハンズオン用IAMユーザの作成 (AWS管理ポリシ: KinesisFull): http://qiita.com/daikumatan/items/2217757a735f406af23f
- ストリームの作成: http://qiita.com/daikumatan/items/3828b2ce5ff833ce2f4a
- データレコードの入力/取得: http://qiita.com/daikumatan/items/e92d9e71f9a729ea8467
- Shard の分割: http://qiita.com/daikumatan/items/9d423aaeb5b00f55645f
- 複数データレコードの一括入力/取得: http://qiita.com/daikumatan/items/7e42247acd92a4b37c24
- Shardのマージ: http://qiita.com/daikumatan/items/7c36aaa124260e521c93
- 後始末
	- ストリームの削除: http://qiita.com/daikumatan/items/c43a87b4234b633e3e6a
	- ハンズオン用IAMユーザの削除: http://qiita.com/daikumatan/items/4fb131933ceba5674c1b


Tips
============

- Kinesis shardの Open/Close を AWS CLI から一発で確認するワンライナー: <http://qiita.com/daikumatan/items/d58fb628d5c03cc8a710>

Q & A
============

Shardの分割　or　マージ中に データを put したらどういう挙動になるのか?
-----------------------------------------------------------

新しい Shard にデータは put されます。
ただし、ステータスが Updating から Active になるまで、データを get することはできません
どこまでデータを get したかなどの管理を KCL が やってくれるので、できるだけ KCL を使いましょう

Iteratorとは何者？
---------------------------------

C のポインターみたいなもの。ただし、5分ごとに動的に変化していく。なぜこのように動的に変化するのかまではわかりませんでした。

shardをマージするとき A & B を B & A すると挙動として違いがでるのか？
----------------------------

でません。基本同じになるでしょう。

その他、実用上参考になる情報
=======================

貴重な情報だと思うので、SAの榎並さんとの会話をメモっておきます！

- KCLはヒストリカルなデータをちゃんと生成するためのライブラリーだよ。ダッシュボードをどう作るかは、なかなか難しい問題だね！
- JawsDays2015 の HackDays のサンプルは、ダッシュボードを node.js で作ったけど、shard の分割・マージには対応できないつくりになっているよ。分割・マージ時のデータの取得に厳密性を求めないのであれば、分割・マージを実行するコードにラッパーかぶせて対応するのもありだね！
- 海外の事例だと、Kinesis --> Storm --> Redis などあるよ !
CodeIgniterカスタムまとめ

# メッセージカスタムめも

個人的なカスタム内容のまとめ
　もし、ツッコミ等あればお願いします

　　開発と本番環境で表示するメッセージを自動で変更したい
　　＋
　　メッセージファイル内で*ENVIRONMENT*で分岐させたくない

```php:index.php
switch (ENVIRONMENT)
{
    case 'local':
	case 'development':
	    define('ENVIRONMENT_COMMON', 'development');
		error_reporting(-1);
		ini_set('display_errors', 1);
	break;

	case 'testing':
	case 'production':
	    define('ENVIRONMENT_COMMON', 'production');
```

こんな感じで*ENVIRONMENT_COMMON*を定義しておく。
使い方

```php
$this->lang->load('error', 'japanese_'. ENVIRONMENT_COMMON);
```

*application/language/***japanese_development***/error_lang.php*
*application/language/***japanese_production***/error_lang.php*
を用意しておくと綺麗なメッセージファイルが記述できるようになる。
集計に使える簡単なgrepこまんど

:dog2: ログに出力された件数を集計するときによく使うコマンドを忘れないように書いておく。

例えば、下記のサンプルで名前の多い順に並び替えたいようなとき



```sample.txt
name:ヤムチャ	skill:狼牙風風拳
name:孫悟空	skill:かめはめ波
name:ピッコロ	skill:魔貫光殺砲
name:ヤムチャ	skill:繰気弾
name:孫悟空	skill:元気玉
name:クリリン	skill:気円斬
name:ヤムチャ	skill:かめはめ波
name:クリリン	skill:かめはめ波
name:孫悟空	skill:ジャン拳
name:ヤムチャ	skill:新狼牙風風拳
```
コマンドはこうなる。
```
grep -o "name:\S*" sample.txt | sort | uniq -c | sort -r
```

◆-o:マッチした部分だけを抽出する

◆uniq:重複を削除する。
※隣接した重複のみ削除するので先にsortしている。
→-c:重複の数を表示する。

◆sort:並び替える
→-r:降順に表示する。


結果はこうなる。

```
$ grep -o "name:\S*" sample.txt | sort | uniq -c | sort -r
      4 name:ヤムチャ
      3 name:孫悟空
      2 name:クリリン
      1 name:ピッコロ
```

名前だけが欲しい場合はこう。

```
grep -o "name:\S*" sample.txt | cut -d ":" -f 2 | sort | uniq -c | sort -r
```

```
$ grep -o "name:\S*" sample.txt | cut -d ":" -f 2 | sort | uniq -c | sort -r
      4 ヤムチャ
      3 孫悟空
      2 クリリン
      1 ピッコロ
```

◆cut:タブ区切りでフィールドを選択して出力する
→-d:デリミタを指定。
→-f:抽出するフィールドの番号を指定する。上記コマンドで1を指定した場合は"name"が抽出される。
他人のサイトを無理矢理フラットデザインっぽくするCSS

CSSの`filter`効果を重ねると、iframe内に表示されている人様のサイトでも、無理矢理フラットデザインっぽい見た目に仕立て上げることができる。

![flat.png](https://qiita-image-store.s3.amazonaws.com/0/48238/dc19d2e3-060f-1d32-2114-038df88ab301.png)

```css
#frame {
  -webkit-filter: sepia(100%) invert(100%) brightness(15) saturate(180%) hue-rotate(90deg);    
  filter: sepia(100%) invert(100%) brightness(15) saturate(180%) hue-rotate(90deg);
}
```
```html
<iframe id="frame" src="http://ja.wikipedia.org/" frameborder="0" width="600" height="600"></iframe>
```

### 効果の詳細

順番が代わると効果が適用される順序も変わる。[Photoshopの調整レイヤー](https://helpx.adobe.com/jp/photoshop/using/adjustment-fill-layers.html)を重ねているのと同じ考え方になる。

sepia(100%)
→ 画像に彩度を残してモノトーン
invert(100%)
→ 大抵のサイトは白背景なのでモノトーン化した画像を反転
brightness(15)
→ 無理矢理明るく補正
saturate(180%)
→ 無理矢理彩度を上げる
hue-rotate(90deg)
→ これまでの調整結果の色相をズラし、好みの色相に調整。この角度を変えると全体的な色見がガラっと変わる

## 実用性

複数の効果を重ねているので重い。最近のメジャーなサイトはiframeを許可しない設定になっているので、そもそもiframe自体を使えないことも多く、使い所は限られる。さらに言うと画像的な処理なので表示が汚い。

## filterプロパティの詳細と対応ブラウザ

https://developer.mozilla.org/ja/docs/Web/CSS/filter
たった一つのAPI

#APIの数はどうするべき？？
先日、携わっているAPIの開発で公開するI/Fの数をどうするか決める際に、そのメリット/デメリットをまとめる機会がありました。
そこで出たまとめの内容について述べていきたいと思います。

まとめた内容を大きくわけるとこの2つ

**I/Fを一つしか用意せず、渡すパラメータで挙動を変える方法**
公開されるのは一つの関数のみ
挙動は渡されたパラメータから内部の別処理に分岐させるやり方

**機能毎にI/Fを用意する方法**
機能毎に関数を公開
挙動はそれぞれの関数で閉じるやり方

では、これらのメリット・デメリットについて考えてみます。

##I/Fを一つしか用意せず、渡すパラメータで挙動を変える方法(集約型)
###メリット
* APIを使用する側の呼び出し口が一つしかない

###デメリット
* APIを呼び出すためにパラメータを一旦共通の型へ変換する必要がある
* 呼び出し先でパラメータを共通の型から変換する必要がある
* 共通の型に変換するため間違ったパラメータを渡す可能性がある
* 呼び出し口が一つのためコード上で何をしたいのかわかりづらくなる(可読性の低下)
* 変更の影響範囲が広い(結合度が高い)

##機能毎にI/Fを用意する方法(分散型)
###メリット
* 変更の影響が限定的(結合度が低い)

###デメリット
* APIの数だけ呼び出し口が作成される


集約型のメリットはデメリットにある型変換(呼び出し先のパラメータ内容を意識する必要がある)を考えるとメリットとは言えないかもしれません…。
※WindowsDLLで開発された場合に、明示的なリンクで呼び出すときの格納ポインタが少なくて済むという考えが重視される場合はメリットとなりえる。

集約型と分散型で双方とも使用するAPIに期待する機能を考えたとき
意識せざるを得ないポイントは同じ気がします。この場合、差分があるとしたら上記メリットデメリットの1つにある結合度でしょうか。

可読性も一つの差分ですが、そこは分散型であったとしても命名規則によっては同じことになる可能性があるため結合度よりは差分が小さいと思います。

APIの特性上、更新や不具合修正がAPIユーザに与える影響を考えると結合度が高いAPIは望まれないでしょう。

続いてはそれぞれでの使用例を考えてみます。

#使用例で考える(イメージはC++です)
##[集約型]

* APIのユーザ
APIが公開している構造体を作成
呼び出し関数のパラメータにキャストして関数を呼び出し

* API内部
内部関数に振り分け
内部関数固有の構造体にキャストして処理を実施

##[分散型]

* APIのユーザ
APIで公開されている内容でAPI関数を呼び出し

* API内部
処理を実施

これもやりたいことは変わらないのに集約型だけ手順が増えてます。


#優れたAPIとは？

<a href="http://www.amazon.co.jp/gp/product/4797369159/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4797369159&linkCode=as2&tag=snacktsuru3-22">C++のためのAPIデザイン</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=snacktsuru3-22&l=as2&o=9&a=4797369159" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
この書籍では優れたAPIは何を備えるべきか記載されています。
その中でも
> 挙動を変えない
> メソッド名を変えない
> 誤用しにくい

この3つを兼ね備えることがAPIユーザにとって使いやすいAPIになるのではないでしょうか。


長々と書いてきましたが、集約型でAPIを開発する、という選択はありえないなという認識です。
※他に集約型でないとこれができない！などありましたらコメントお願いします。
ViewPagerでスワイプ移動できる詳細画面を作る


リスト画面から詳細画面に遷移した時
アイテムの詳細画面をスワイプして隣のアイテムに移動する
みたいな画面を実装する際に困ったので調べて作りました。

###構成
+ ItemListActivity : 一覧画面
+ ItemDetailActivity : 詳細画面の親
+ ItemDetailFragment : 詳細画面中身

###概要
ItemDetailActivityは一覧画面と同じItemListを持ち
ViewPagerAdapterでViewPagerが切り替わるたびに
ItemDetailFragmentにList内の選択されたItemを渡して画面を生成する。
ViewPagerの初期表示ページは`viewPager.setCurrentItem(position)`で設定。 ※ `setAdapter()`の後ろに書かないと動かない

###コード

```xml:item_detail_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/itemDetailRoot"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context="">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <LinearLayout
            android:id="@+id/item_detail_fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">
        </LinearLayout>
    </android.support.v4.view.ViewPager>
</LinearLayout>

```

```java:
public class ItemDetailActivity extends AppCompatActivity implements {

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		
		//遷移元のListActivity(一覧画面）でクリックされたpositionを渡してます。
		Intent intent = getIntent();
		int position = intent.getIntExtra("clickedPosition", 0);
		
		ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
		ViewPagerAdapter adapter = new ViewPagerAdapter(manager);
		adapter.setItemList(itemList);

		viewPager.setAdapter(adapter);                       
        viewPager.setCurrentItem(position);
	}
}
```

```java:

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
        private Context mContext;
        private List<Item> mItemList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {

            Item item = mItemList.get(position);
            ItemDetailFragment fragment = ItemDetailFragment.newInstance(item);
            return fragment;
        }

        @Override
        public int getCount() {
            return mItemList.size();
        }

        public void setItemList(List<Item> items){
            this.mItemList = items;
        }

    }

```

###参考
http://stackoverflow.com/questions/11879315/pageradapter-start-position
大丈夫か？ってなるVimmerの行動

※ネタ記事です．文章の前後の繋がりとか色々破綻してることがあります．

元ネタ: [大丈夫か？ってなるエンジニアの行動 | 世界はどこまでもシンプルである](http://daipresents.com/2015/eng-behavior/?fb_ref=Default)

---

「Vimプラグインを新しいの使いはじめるって難しいね」って話を後輩としてたときに、後輩が「この人、大丈夫なのかな？」ってなるVimmerのパターンの話をしてくれました。偏見に満ちてるけど、なぜだか納得してしまったのでまとめてみます。

## ブラインドタッチできない

失礼ながら「気にしなかったけどそんな人いるの？！」って聞き返してしまいました。彼曰く、最近いたそうです。

自分は独学で学んだので癖があるみたいですが、身につけておいて損はないスキルかと。

## コピペはyyとpだけ

ヴィジュアルモード便利！ 別にキーを覚える必要はないけど、毎回一行ずつしかコピー出来ないのを不便に感じないのかが気になるところ。

たしかに、面倒臭いことが嫌いな人と働いたときは、必死になって楽しようと努力してくれるので楽だった気も。

## .vimrcが弱い

というよりも、設定を変えようとしたがらないことが怖い気がする。

デフォルトだけでは制約があるときは多いので、Xcodeの感覚でデフォルト厨になったりすると、いろんなものを失っちゃう。

また、周りに合わせるの苦手だったりしたらチーム開発は辛そう。ゴーイングマイウェイ！

## 愛用ファイラがNERDTree

いいんですけどね。

## 愛用プラグインがNeoComplecache

いいんですけどね。

## 愛用テキストエディタがEmacs

え！

## おわりに

こんな話をしていてなんですが、来る人だけでなく受け入れ側のこともあわせて考えないとねって結論になりました。

そもそも、Vimプラグインを育てる環境を提供できないなら、ヴィジュアルモードのような基本スキルがまだ勉強中の方を採用できない。「貴様まさか！」って言葉は「そのまさかだ！フハハハハハ！」と返せます。

すなわち、相手ではなく自分たちのほうに問題や制約がある。かもしれない。

---

## 私が思うこと

程度の問題なのでブラインドタッチが出来ないとかコピペを右クリックからするとか気にしてもしょうがない．遅いのとか自分とあわないやり方は見ててイライラするのは分かる．けど自分にもそういう時期はあったはずで，そんな自分も誰かの作業してる様(ショートカットキーなりをバリバリ使いこなしてる様)を見て感銘を受けたりした覚えがあるので，逆に言うなら自分が今度はお手本というかそういう憧れられる人になりたい．

ちなみにVimFilerじゃなくて未だにNERDTree使っているのが私です．低スペックなマシンを使うと，VimFilerが動作重くて…

あ，ヴィジュアルモードは是非覚えましょう．これ覚えたらVim使うのだいぶ楽しくなると思う．

あとは`ciw`とかでいきなり単語を任意のカーソル位置から消して書き換えとか見せつけると，メモ帳とかしか触ってない人を「！？」ってさせられる気がします．実際便利なので覚えよう．
Hashの探査（dig）実装メモ

ネストされたHashをどんどん掘っていく、探査するメソッドが欲しいです。
が、Ruby 2.3から[Hash#digメソッド](http://docs.ruby-lang.org/ja/2.3.0/class/Hash.html#I_DIG)が追加されたので本記事は意味を成しません。
Ruby 2.2以前の時に参考になるレベルです。

```rb
# Hash掘るよ
# @param [Hash] data 対象のHash
# @param [Array] keys dataを掘っていくためのキー
# @return [Anything] 掘っていった結果
def dig(data, keys)
  return data unless data.is_a?(Hash)
  key = keys.shift
  return data unless key
  dig(data[key], keys)
end

data = {fuga: {bar: {piyo: 'good'}}}
p hoge(data, [:fuga, :bar, :piyo]) #=> 'good'
p hoge(data, [:fuga, :bar]) #=> {piyo: 'good'}
p hoge(data, [:fuga, :baz]) #=> nil
```

こんなの書いて使ってたけど、なんかダサい気がしてならない。
何かスマートな方法ないかと探してたらこんなものがありました。
[ruby hash dig](https://gist.github.com/re5et/1954628)
転載させていただきますが、なにか問題あったら消しますので連絡ください。
Please contact me if there is a problem.

```rb
class Hash
 
  def dig(*path)
    path.inject(self) do |location, key|
      location.is_a?(Hash) ? location[key] : nil
    end
  end
 
end
```

なるほど、injectの初期値に対象のデータをセットする発想はなかった！
injectはいつも空ハッシュにデータを突っ込んでいく使い方しかしていなかったので、このような使い方があるとは眼から鱗です。

でも個人的にオープンクラスが好きではないのと、デフォルト値を返すみたいなことができると嬉しいな、と思って改変しました。

```rb
# Hash形式のデータを掘る
# @param [Hash] data 掘る対象のデータ
# @param [Array] keys 掘りたいキー群
# @param [Anything] defalut キーがない場合、dataがHashじゃなくなった場合の返り値
# @return [Anything] 末端まで掘った値
def dig(data, keys, default={})
  keys.inject(data) do |location, key|
    (location.is_a?(Hash) && location[key]) ? location[key] : default
  end
end

dig(data, [:fuga, :bar, :piyo]) #=> 'good'
dig(data, [:fuga, :bar]) #=> {piyo: 'good'}
dig(data, [:fuga, :baz]) #=> {}
dig(data, [:fuga, :baz], 'default') #=> 'default'
```

悪くないですね（自己満足）

結局、今回もこのメソッドを実装した後に仕様が変わって不要になりましたが、今後どこかで使うことも出てくると思ったのでQiitaに残しておきます。
【iOS】cocoapodsのインストール方法


## 1. cocoapodsインストール
ホームディレクトリで以下を実行。

```terminal
$ gem install cocoapods

```
※cocoapodsはgemだけどbundlerで管理しているわけはない。一度インストールしたらMac自体にインストールされる

## 2. pod setup
iOSプロジェクトに移動して以下を実行。

```terminal
$ pod setup
```
しかし、ここで下記のエラーが発生！

```terminal
$ zsh: command not found pod
```
gemコマンドでgemをインストールしたときは、`rbenv rehash`すればいいんだった！！

```terminal
$ rbenv rehash
```
再び`pod setup`。

```terminal
$ pod setup
```

## 3. Podfileを作成
同じディレクトリで以下を実行。

```terminal
$ pod init
```
これで、Podfileが作成されました。
Podfileを開いてみると、下記のようになっています。

```terminal
$ cat Podfile
```
```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'

target 'YourAppName' do

end

target 'YourAppNameTests' do

end
```

## 4. ライブラリをインストール
インストールしたいファイルを記入。

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'

target 'YourAppName' do
	pod "HogeHoge"
end

target 'YourAppNameTests' do

end
```
Xcodeを落として以下を実行。

```terminal
$ pod install
```
bundle installみたいなものです。

以下のような警告がでたら、

```
Pods written in Swift can only be integrated as frameworks; this feature is still in beta. Add `use_frameworks!` to your Podfile or target to opt into using it.
```
Podfileに`use_frameworks!`を追記して、`pod install`。

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'
use_frameworks!

target 'YourAppName' do
	pod "HogeHoge"
end

target 'YourAppNameTests' do

end
```


## さいごに
import出来ない場合
· https://github.com/Alamofire/Alamofire/issues/441
· http://vdeep.net/xcode63-cocoapods-alamofire-swiftyjson
HDBC-sqlite3で外部キーを有効にする

こうする。

```haskell
connectSqlite3' :: FilePath -> IO Connection
connectSqlite3' file = do
  conn <- connectSqlite3 file
  runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"
  return conn
```

SQLite3では互換性維持のため、多く場合デフォルトで外部キー制約が無効になっている。

外部キー制約を有効にするためには、`PRAGMA foreign_keys = ON`をトランザクション外で実行する必要がある。

しかしHDBCは自動的にトランザクションを開始するため、`PRAGMA`を実行する前に明示的にトランザクションを抜ける必要がある。

参考:

- http://stackoverflow.com/questions/8407547/sqlite-foreign-keys
関数

##関数とは
一連の処理をまとめたものを「関数」と呼ぶ。関数は一連の処理をまとめて「関数名」として定義し、その関数名を呼び出すことで、処理する。

```javascript
function 関数名( 引数, 引数, ・・・ ){
    //複数の処理
    return 戻り値;
}
```

##無名関数（匿名関数）
JavaScriptでは`関数自体もデータ型`である。下記のようにデータ型として関数を定義するのを`無名関数（匿名関数）`と呼ぶ。

```javascript
var 変数名= function( 引数 , 引数 , ... ) {
    // 複数の文 
    return 戻り値;
}
```

##引数
`引数（Argument）`とは`関数を呼び出す場合に渡してあげるデータ（変数）のこと`をいう。
引数は複数セットすることができ、引数の間にカンマを入れて定義する。
※引数の名前はわかりやすい名前にする。

##関数のオーバーロード
Javaなどのデータ型が厳密に扱われる言語では、引数のデータ型や数が異なると同じ名前の関数でも別の関数として扱われるため、同じ名前で引数が異なる関数をいくつも定義できる。これを`オーバーロード`と呼ぶ。

しかしJavaScriptでは、<u>同じ名前の関数は引数のデータ型や数が異なっていても同じ関数として扱われ、関数の定義は後から定義した関数で上書きされてしまう。</u>

```javascript
//引数が1つのsample()を定義
function sample( arg ) {
    return 1;
}
//引数が2つのsample()を定義
function sample( arg1 , arg2 ) {
    return 2;
}
//引数を1つ指定してsample()を呼び出しても最後に定義した方が実行される
alert( sample(10) );
```

##変数のスコープについて
変数を利用する場合、そのスコープ（Scope）を意識することは重要である。スコープとはその変数が利用できる範囲のことをいう。

###グローバル変数とローカル変数

|変数の種類|説明|
|---|---|
|グローバル変数|プログラム全体で利用する変数。関数の外で定義された変数。|
|ローカル変数|宣言した関数内でのみ利用可能な変数。関数内部で定義された変数。|

```javascript
var num = 1; // グローバル変数
function sample(  ) {
    var num = 0 // ローカル変数
    return num;
}
window.alert(sample()); // 0
window.alert(num); //1
```

###JavaScriptのスコープのルール

+ ローカル変数は必ずvarで宣言→同名のグローバル変数がある場合はそちらを参照する
+ ローカル変数は関数の先頭で宣言→ローカル変数は関数全体で有効なので宣言前に利用するとundefindになる。

##即時関数
今まで`function`で定義した関数はその関数名を呼び出すことにより実行される。
即時関数は定義されるタイミングで実行する関数である。

```javascript
(function hello(name){
    console.log("hello " + name); 
})("Tom");
```
※関数名も省略が可能。

###即時関数を利用するメリット

+ 即時関数は、現在のグローバル変数を汚染せずに新たなスコープを作成するための唯一の手段
+ 再利用されない一連の処理を新たなスコープで包み、プログラムをスコープ上のサンドボックス内で実行すること
CodeIgniter3.0を使ってみた(メモ)

# 1. インストールしてみた

## ・コンポーザを使ってみた
以下のJSONファイルを作成、ターミナルで```composer install```コマンドを実行する。

```json:composer.json
{
  "require": {
    "codeigniter/framework": "3.0.0"
  }
}
```

結果・・・

```
current directory
├  composer.json
├  composer.lock
└─vendor
    │  autoload.php
    │  
    ├─codeigniter
    │  └─framework
    │      ├─application
    │      ├─system
    │      └─user_guide
    └─composer
            autoload_classmap.php
            autoload_namespaces.php
            autoload_psr4.php
            autoload_real.php
            ClassLoader.php
            installed.json
```

な感じになります。
アップデートしたい場合は```composer update```とすればOK。

# 2. CI2.2系とCI3系での変更点(気づいたこと)
## (1)コントローラクラス
　　　・ファイル名の先頭が大文字へ変更
　　　　controllers/blog.php → controllers/Blog.php
　　　　※windowsだと小文字のままでも動く
　　　　
　　　・ディレクトリのネストが1階層から複数階層可能に変更
　　　　controllers/dir1/Sample.php → controllers/dir1/dir2/Sample.php
　　　　※ナイスな変更！

## (2)ローダクラス
　　　2.2系と比較してみたら結構変更されていたので、application配下に設置したクラスのロードは2.2系から変更が必要かも・・・。
Array#delete_if の削除した要素を返すバージョンがほしい

[Array#delete_if](http://docs.ruby-lang.org/ja/2.2.0/method/Array/i/delete_if.html) でも self を返すのではなく、[Array#delete](http://docs.ruby-lang.org/ja/2.2.0/method/Array/i/delete.html) のように削除した要素を返して欲しい。

```rb
module ArrayExtention
  def reject_if(&block)
    rejected = []

    delete_if do |value|
      rejected << value if block.call(value)
    end
    
    rejected
  end
end

array = *(1..5) #=> [1, 2, 3, 4, 5]
array.delete_if(&:odd?) #=> [2, 4]
array #=> [2, 4]

array = *(1..5) #=> [1, 2, 3, 4, 5]
array.extend(ArrayExtention)
array.reject_if(&:odd?) #=> [1, 3, 5]
array #=> [2, 4]
```

[Array#delete_if](http://docs.ruby-lang.org/ja/2.2.0/method/Array/i/delete_if.html) と [Array#delete](http://docs.ruby-lang.org/ja/2.2.0/method/Array/i/delete.html) の返り値の違いは
Ruby を始めた頃によく引っかかる事柄のひとつだと思うのですが、
なぜこのような違いがあるのでしょうね？ わたし、きになります！
AngularJS+PHP+SQLiteでシンプルなToDo作成

![test.png](https://qiita-image-store.s3.amazonaws.com/0/32030/a3f1654d-78b0-c25d-b623-faf266db315f.png)

ワンソースでデータベース定義、PHP・JavaScript・HTML全てのソースコードを含んでいるので分かりやすいかも知れません。

その代わり、AngularJSのお作法などはかなり省略しているのでご注意。

以下のPHPソースをWebサーバーに置いてブラウザで開くと、todo.dbという名前のデータベースを作成してToDoの格納・削除・完了マークを付ける操作をすることが出来ます。

```html+php:todo.php
<?php
$db = new PDO('sqlite:todo.db');
$db->exec('CREATE TABLE IF NOT EXISTS todo(id INTEGER PRIMARY KEY, title TEXT, completed INTEGER)');
if (isset($_GET['id'])) {
  switch ($_SERVER['REQUEST_METHOD']) {
  case 'GET':
    echo json_encode($db->query('SELECT * FROM todo')->fetchAll(PDO::FETCH_ASSOC));
    break;
  case 'POST':
    $in = json_decode(file_get_contents('php://input'), true);
    if (isset($in['id'])) {
      $db->prepare('UPDATE todo SET completed=? WHERE id=?')->execute([$in['completed'], $in['id']]);
    } else {
      $db->prepare('INSERT INTO todo(title,completed) VALUES(?,0)')->execute([$in['title']]);
    }
    break;
  case 'DELETE':
    $db->prepare('DELETE FROM todo WHERE id=?')->execute([$_GET['id']]);
    break;
  }
  exit;
}
?>
<!DOCTYPE html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>ToDo</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular-resource.min.js"></script>
<script>
angular.module('app', ['ngResource']).controller('Controller', function($scope, $resource) {
  var res = $resource('?id=:id');
  $scope.todos = res.query();
  $scope.post = function() {
    res.save({title: $scope.title}, function() {
      location.reload();
    });
  };
  $scope.delete = function(id) {
    res.delete({id: id}, function() {
      location.reload();
    });
  };
  $scope.change = function(todo) {
    res.save({id: todo.id, completed: todo.completed});
  };
});
</script>
</head>
<body ng-controller="Controller">
<p ng-repeat="todo in todos">
  <input type="checkbox" ng-model="todo.completed" ng-true-value="'1'" ng-false-value="'0'" ng-click="change(todo)">
  <span ng-style="{textDecoration: todo.completed === '1' ? 'line-through' : 'none'}">{{todo.title}}</span>
  <span style="cursor: pointer" ng-click="delete(todo.id)">✕</span>
</p>
<input ng-model="title">
<button ng-click="post()">post</button>
</body>
</html>
```

## テーブルの内容

|カラム名|内容|
|---|---|
|id|プライマリキー|
|title|ToDoの内容|
|completed|未完了:0 完了:1|
Rackとは



## ○Rack
Rackとは実行環境毎のAPIの差を吸収してくれるライブラリ
RackはRuby版WSGIと呼ばれている。


## ○WSGIとは

Web Server Gateway Interfaceの頭文字をとったもの(ウィスキーって呼べば良い)
WebサーバーとWebアプリケーションを接続するためのインターフェースの定義の一つ。

Pythonには、いろんなwebアプリケーションフレームワークが存在します。以前はフレームワークごとに、使用可能なサーバーが制限されていました。
一方で、Javaでは多数のwebアプリケーションフレームワークがあるにもかかわらず、多数のWEBアプリケーションをつなぐ際に、統一のJava Servelet APIを用いることで、フレームワークを気にせず、Servelet APIが利用できる環境で動作させることが可能です。

このような、サーバーとWebアプリケーションをつなぐ共通のインターフェースをPythonで定義したものが、WSGIと呼びます。  





## ○インターフェースとは

インターフェースとは、接点、境界面、などの意味を持つ単語。
ITの世界では、２つのものが接続・接触する箇所や、両者の間で情報や信号などをやりとりするための手順や規約をお定めたものを意味する。
インターフェースには、
1. ハードウェアインターフェース
2. ソフトウェアインターフェース
3. ユーザ・インターフェース

の３つに大別される。

### * ハードウェアインターフェース
複数の装置を接続詞て通信する際の規約。
例えば、コネクタの形状や電気信号の形状などを定めている。
Macでいうサンダーボルトとか、プロジェクターのVGAとか。　コンセントもたくさんある。


### * ソフトウェアインターフェース
プログラム間でデータをやりとりする手順や形式を定めたもの。
特に、OSやミドルウェア、ライブラリなどの機能を外部から呼び出して利用するための規約をAPIと呼ぶ。
ファイル形式も広い意味で含まれるが、通常はAPIを示すことが多い。


### * ユーザーインターフェース
コンピュータが利用者に対して情報を表示する方式や、逆に利用者が情報を入力するための方式を定めたもの。文字ベースのCUI(Character User Interface) ターミナルとかLinuxとか。を用いられていたが、コンピュータの大衆化が始まって以来、GUI(Graphical User Interface)が使われるようになってきた。　マウスでの操作や、ボタンを押すとか、図形や画像による表示
embedのsrc変更

## ハマったところ
```html
<embed id="svg" src="images/hoge.svg" type="image/svg+xml"/>
```
```js
var svg = $('#svg');
svg.prop('src', 'images/fuga.svg');
```

変わらない…
Chrome43で確認

## 対処
[JavaScript: Changing src-attribute of a embed-tag](http://stackoverflow.com/questions/2493706/javascript-changing-src-attribute-of-a-embed-tag)
> You should remove the embed element and reinject it with the new src parameter set.
> 
> embed like object and similar are two elements which, due do their special uses (video, audio, flash, activex, ...), in some browsers are handled differently from a normal DOM element. Thus changing the src attribute might not trigger the action you expect.
>
> The best thing is to remove the existing embed object an reinsert it. If you write some kind of wrapper function with the src attribute as parameter this should be easy

これだ！

```html
<div id="svg"><embed src="images/hoge.svg" type="image/svg+xml"/></div>
```
```js
var svg = $('#svg');
svg.html('<embed src="images/fuga.svg" type="image/svg+xml"/>');
```

引用の最後で言われているwrapper functionそのうち書いてみます。
Railsアンチパターン<モデル編>④重複の複製

DRYなコードを書くために気をつけることがつまった章。あとちょっとコードペタペタ貼りすぎて見通悪いと思ったので文章メインです。

ソリューション:モジュールに分けよう
=
* 共通メソッド:そのままモジュールに書けば良い。
* validationなど:`ActiveSupport::Concern`をextendして`included`ブロックで定義すれば共有できる。

一部のロジックを共通化するために[templateパターン](http://www.techscore.com/tech/DesignPattern/TemplateMethod.html/)を一つの参考にすると良い。include先で実装してもらいたいメソッドをモジュール自体の定義で例外を投げるようにしておくと、エラーにすぐ気付ける。Javaのインターフェースのようなものだ。

例としてあげられる、Car,Byccycleクラスでincludeされることを想定されたDrivableモジュール。

```.rb
module Drivable
  extend ActiveSupport::Concern
  class TemplateError < RuntimeError; end

  included
    validates :direction, :presence => true validates :speed, :presence => true
  end

  def turn(new_direction) 
    self.direction = new_direction
  end

  def brake 
    self.speed = 0
  end

  def accelerate
    self.speed = [speed + acceleration, top_speed].min
  end

  def top_speed
    raise TemplateError
  end

  def acceleration 
    raise TemplateError
  end
end
```
よくある話としてはこれらの共通ロジックを親クラスに実装して継承するというものだが、モジュールの方が柔軟性がある(たとえばいろんなロジックを別々のモジュールに分けることによって一部のロジックだけを他のクラスにMix-inしたり、なんてことが考えられる)と書かれている。確かにそうかもしれない。

##結論:共通ロジックをモジュール化できないか常に考える

ソリューション:プラグインを書こう
=
モジュールがアプリケーションレベルでの重複を防ぐ行為だとしたら、プラグインを書くことはコミュニティーレベルでの重複を防ぐ行為だと言えよう。有名なプラグインとしてはたとえば、[Capistirano](http://capistranorb.com/)などがあるが、あそこまで巨大なものを想像しなくても良い。ほんのちょっと基底クラス(たとえば、`ActiveRecord::Base`)に便利メソッドを足すだけでもそれは立派なプラグインだ。
pulginについての詳しい記述は[Railsガイド](http://railsguides.jp/plugins.html)に任せることにする。

##結論:抽象性のためにpluginを書くことを考えよう。gemとして公開できるのならなおその方がよい。

メタプログラミングの魔法
=
たとえば、以下のようにstatusの候補が明確に配列として定義されていてそれに対してメソッドが動的に定義されているというのは良い例だろう。

```.rb
class Purchase < ActiveRecord::Base
  STATUSES = %w(in_progress submitted approved shipped received)
  #~中略~
  STATUSES.each do |status_name| 
    define_method "#{status_name}?"
      status == status_name 
    end
  end
end
```

##結論:RubyのメタプログラミングはDRYのための非情な強力な力だ。頑張って使おう。

ただしDRY意味を勘違いしてはいけないよ、と最初に注釈がある。それはコードの行数を減らすという意味ではなく、意味の重複、振る舞いの分散を集約するという行為だということを忘れないように、という意味らしい。なんでもかんでもメタプログラミングでまとめてしまうという悪癖がたまに聞かれることがあるが、そのあたりはDRYの理解がまだ足りてないのかもしれない。
gitlabでプロジェクトのvisibility levelをprivateのみにさせたい

gitlab.ymlのrestricted_visibility_levelsを設定します。

[Disable Public Projects](https://groups.google.com/forum/#!topic/gitlabhq/qJPoo5jE25g)

```yaml:gitlab.yml
    # Restrict setting visibility levels for non-admin users.
    # The default is to allow all levels.
    restricted_visibility_levels:  [ "public", "internal" ]
```

注意点として**選択できない**visibility levelを記載することです。
上記ではpublicとinternalを選択させない(結果としてprivateしか選択できない)
ようにする設定です。
また既存のpublic,internalなレポジトリの設定は変更されません。
あくまで変更時のみ有効です。

あとは

```
sudo gitlab-ctl restart
```
で設定を反映させます。
jQuery にも Ruby の Object#tap のようなメソッドがほしい

例えば、以下のような jQuery のコードがあったとします。

```js
var $niko = $('div.checkbox.niko'),
    $maki = $('div.checkbox.maki');

$niko
    .find('input[type=checkbox]')
    .prop('checked', true);

$niko
    .append($('<div>', { text: 'にっこにっこにー' }));

$maki
    .find('input[type=checkbox]')
    .prop('checked', true);

$maki
    .find('label')
    .css({
        color: 'white',
        'background-color': 'rgb(239, 69, 74)',
        padding: '4px'
    });
```

このコードを見て、私は次のことを考えました。

1. `.find().prop()` の処理を共通化できないだろうか。
2. `.find().prop()` の処理の返り値を `$('input')` ではなく `$('div.checkbox')` のままにできないだろう。そしたらメソッドチェーンを繋げられるのに。

そこで何か方法はないか思案していたところ、Ruby の [Object#tap](http://docs.ruby-lang.org/ja/2.2.0/method/Object/i/tap.html) を思い出しました。

> self を引数としてブロックを評価し、self を返します。

(ちなみに Ruby における `self` は JavaScript における `this` です。)

こんなメソッドが jQuery にもないかな？ と思い探してみましたが見つかりませんでした。
しかし Google 検索してみると 「[jQueryでtapを定義してみた](http://d.hatena.ne.jp/kitak/20120610/1339308195)」 というまさに僕と同じことを考えていた方がいらっしゃったので、この知恵を拝借しました。

```js
// jQuery に .tap() 関数を追加する。
$.fn.tap = function (fn) {
  if ($.isFunction(fn)) { fn.call(this); }

  return this;
};

var $niko = $('div.checkbox.niko'),
    $maki = $('div.checkbox.maki'),
    check;

// input 要素をチェックする処理を関数として共通化する。
check = function () {
    this.find('input[type=checkbox]')
        .prop('checked', true);
};

$niko
    .tap(check)
    .append($('<div>', { text: 'にっこにっこにー' }));

$maki
    .tap(check)
    .find('label')
    .css({
        color: 'white',
        'background-color': 'rgb(239, 69, 74)',
        padding: '4px'
    });
```

これでなかなかスッキリしたと思います :sparkles:
xl2tpd + strongswan でVPN構築し、iPhone6から接続 (今のところ同一LAN以外では接続できない。)


# 参考

> openswanパッケージが更新されたのですが、もうメンテナンスしてないからstrongSwanとかに乗り換えてね


* [strongSwan どてやの戯れ言/ウェブリブログ](http://doteya.at.webry.info/201404/article_1.html)
* [Debian GNU/Linux Wheezy で StrongSwan にてL2TP / IPsec サーバ設定の備忘録 – Open the Next](https://www.manabii.info/2014/08/debian-wheezy-strongswan-l2tp-ipsec.html)
* [Linuxでopenswanとxl2tpd使ってL2TP/IPSec VPNする方法 - Qiita](http://qiita.com/nyarla/items/490e10a5eaa6f0216909)
* [strongswan/strongswan · GitHub](https://github.com/strongswan/strongswan)

# インストール

* ubuntu15.04にて実施。
  * このサーバのIPアドレスは `192.168.100.121`

```bash:
sudo apt-get install -y strongswan xl2tpd
```


# strongswan (IPSec)

```python:/etc/ipsec.conf
config setup

conn L2TP-NAT
    rightsubnet=0.0.0.0/0
    also=L2TP-noNAT

conn L2TP-noNAT
    forceencaps=yes
    authby=secret
    auto=add
    keyexchange=ikev1
    keyingtries=3
    ike=aes128-sha1-modp3072
    esp=aes128-sha1-modp3072
    rekey=no
    ikelifetime=8h
    lifetime=1h
    type=transport
    left=192.168.100.121    # 自サーバのIPアドレスを指定
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any
    dpddelay=40
    dpdtimeout=130
    dpdaction=clear
```


```rb:/etc/ipsec.secrets
: PSK "PRESHAREDKEY"
```


```diff:/etc/strongswan.conf
  charon {
        load_modular = yes
        plugins {
                include strongswan.d/charon/*.conf
        }
+       dns1=8.8.8.8
+       dns2=8.8.4.4
  }

  include strongswan.d/*.conf
```


```bash:
systemctl start strongswan
```

# xl2tpd


```bash:/etc/xl2tpd/xl2tpd.conf
[lns default]
ip range = 192.168.100.4-192.168.100.5
local ip = 192.168.100.121    ; 自サーバのIPアドレスを指定
length bit = yes
refuse chap = yes
require authentication = yes
name = l2tp
pppoptfile = /etc/ppp/options.l2tpd.lns
```


```bash:/etc/ppp/options.l2tpd.lns
name l2tp
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
ms-dns 8.8.8.8
nodefaultroute
lock
nobsdcomp
mtu 1280
mru 1280
```

```bash:/etc/ppp/chap-secrets
# client        server  secret                  IP addresses
client1  l2tp   ep2fai6T        *
client2  l2tp   hahGiv4i        *
```

```bash:
systemctl start xl2tpd
```

```bash:/etc/sysctl.conf
net.ipv4.ip_forward=1
```

`sudo sysctl -p`

# ログの見方

```bash:
sudo journalctl -u strongswan -f -l
```

# 接続実施

* 設定

![IMG_1299.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/448793ba-ffc4-0bbc-3d29-8e715cf4548e.jpeg "IMG_1299.jpg")

* 接続成功

![IMG_1300.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/c44415ff-2a76-8c43-4c23-13f0df261a92.jpeg "IMG_1300.jpg")



```bash:
sudo ipsec status
```
テスト駆動開発について〜静的ページのテストまで


##テスト駆動開発とは
アプリケーションを開発するときに最初にテストを作成し、次にコードを作成することです。

##よく出てくるワード
・テスト駆動開発(TDD):アプリケーションの振る舞いをテスト
・振舞駆動開発(BDD)：TDDから派生したテスト駆動開発方法
・結合テスト (integration test) ：ユーザーがアプリケーションを使う際の一連のアクションをシミュレーションします。
・単体テスト (unit test) ：メソッド単位での挙動のテスト
※Capybaraを併用すれば自然言語 (英語) に近い文法でテストを記述する事も可能。

##書き方(結合テスト編)
1 テスト用ファイルを作成

```
$rails generate integration_test static_pages
  invoke  rspec
  create   spec/requests/static_pages_spec.rb
```

2 実際にテスト用ファイルにコードを記述

```ruby:spec/requests/static_pages_spec.rb
require 'spec_helper'

describe "Static pages" do #""内は好きな文字列でOK / 読み手にとってわかりやすい文字列で！
  
  describe "Home page" do #/statc_pages/homeのテスト
    it "should have the content 'Sample App'" do 
      visit '/static_pages/home'
      expect(page).to have_content('Sample App')
    end
  end
end
```

・``` it "…" do ```：テスト例を記述
・```visit```：Capybaraが用意している機能の一つ。/static_pages/homeへのアクセスをシミュレーションしてくれる。
・```expect(page)```：Capybaraが提供するpage変数を使って、アクセスした結果のページに正しいコンテンツが表示されているかどうかをテストしてくれる。

3 spec_helper.rbにCapybara DSLを追加

```ruby:spec/spec_helper.rb
RSpec.configure do |config|
  .
  .
  .
  config.include Capybara::DSL
end
```

4 実行
```bundle exec rspec spec/requests/static_pages_spec.rb```

5 テストするページを追加

```ruby:spec/requests/static_pages_spec.rb
require 'spec_helper'

describe "Static pages" do 
  
  describe "Home page" do #/statc_pages/homeのテスト
    it "should have the content 'Sample App'" do 
      visit '/static_pages/home'
      expect(page).to have_content('Sample App')
    end
  end
  
  describe "Help page" do #(追加)/statc_pages/helpのテスト

    it "should have the content 'Help'" do
      visit '/static_pages/help'
      expect(page).to have_content('Help')
    end
  end
end
```
プログラミングを学べるサービスまとめ

本格的にエンジニアになり、早1年、RoRやJavascriptに関して以前に比べて理解も深まり、コードを書くこと自体がすごく楽しくなってきました。<br>
そんな中、最近なんとなく自分の軸となる言語ができた感じがするので、他の言語も触ってみたいなーという欲がでてきました。
そこで、今回はプログラミングを学べるサービスをまとめてみようと思います。<br>

## [JEEK Codestudy](http://jeek.jp/study/exp)<br>
### 学習可能言語：JavaScript・ jQuery<br>
ブラウザ上でJavaScriptやjQueryを学べるほか、学生向きのインターンシップや求人情報を掲載しているサービスです。<br>
学生のみならず、エンジニアとしてのキャリアを歩もうとする社会人に役立つサービスなのではないでしょうか。<br>
## [CODEPREP](http://codeprep.jp/)<br>
### 学習可能言語：HTML・CSS・JavaScript<br>
こちらもオンラインでコーディングできるサービスです。<br>
かつ他ユーザーと競いながら学ぶことができるので、一人じゃモチベーションを保てない or 自分の理解度を相対的に認識したい人にオススメのサービスです。<br>
あくまでアプリ開発をゴールにおいているサービスなので、より実践的な技術を学べそうです。<br>
## [Paiza](https://paiza.jp/learning)<br>
### 学習可能言語：PHP<br>
練習問題と動画でPHPを学べるサービスです。<br>
1チャプター3分の動画で学ぶことができ忙しい人でも、これなら続けられるかも・・・？<br>
ただもちろん動画を見ただけでは、全く実践で書けないので、練習問題でしっかりと理解の定着を図ることが重要ですね。<br>
## [Codecademy](http://www.codecademy.com/learn)<br>
###  学習可能言語：HTML・CSS・Ruby・Python・PHP・JavaScript・jQuery<br>
学習可能言語の豊富さもさることながら、 RailsやAnjularJS、Command Lineなどフレームワークやツール、各メジャーサービスのAPIまで・・・！<br>
開発に必要なスキルをほぼ全て網羅している点がCodecademyの魅力です。<br>
##[ミニツク](http://www.minituku.net/)<br>
###  学習可能言語：Ruby<br>
Rubyに特化して勉強ができるサイトです。<br>
Rubyの生みの親まつもとゆきひろ氏がRubyの基礎について紹介している動画コンテンツも用意されています！ <br>
4択形式の問題を解いていく”ドリル”と問題をもとにコードを書いてから模範解答を確認する”演習”の2種類の問題形式で理解度を図ることができます。<br>
本格的にRubyを学ぼうとしている方にオススメです。

#おまけ ~ スマホで学ぶ！~<br>
最近ではスマホアプリでプログラミングを学べるサービスもでてきました！<br>
## Swifty<br>
### 学習可能言語：Swift<br>
片手 でどこでもSwiftを勉強することができます！<br>
各チュートリアルの最後には演習問題もあり、少しだけですが、実際にコードを各部分があり割と本格的です。<br>
##  Rails Cards<br>
### 学習可能言語：Rails<br>
Railsコマンドを暗記カード感覚で学べるアプリです。<br>
普段よく使うコマンドは魔法の言葉のように覚えているのですが、「え、こんなコマンドもあったの？！」的な発見もありパラパラみるだけでも楽しいです。<br>
## Codecademy: Code Hour
### 学習可能言語：HTML・CSS・Ruby・Python・PHP・JavaScript・jQuery<br>
上記でも紹介したCodecademyのiOS版です。<br>
#まとめ<br>
いくつかご紹介しましたが、こういったサービスは探せばまだまだあります。<br>
それぞれ学習法や理解度を高めるためのゲーミフィケーションに工夫があり、自分の目的と学習スタイルにあったものを選んで、使ってみてください。<br>
webのみでなくスマホアプリでもプログラミングを学べるように、時間や場所を選ばず隙間時間で各言語の書き方などを学べるようになりました。<br>
Webページを作りたい！Webサービスを作りたい！iOSアプリを作りたい！といった新たに挑戦する方の第一歩としては手軽で非常に良いのではないでしょうか。<br>
しかし、本当にその理解を定着させる方法は、こういったサービスで学んだことを実践する・作りきるという経験を重ねることだと思います。<br>
c++ builder > 1秒以上経過したかどうか

```txt:動作確認
C++ Builder XE4
```

以下の方法で実装した。他にも良い実装があるかもしれない。

```cpp
#include <DateUtils.hpp> // for SecondsBetween()
...
bool hasPassed_time(TDateTime now, TDateTime next)
{
    if (next > now) {
        return false;
    }
    if (SecondsBetween(next, now) >= 1) {
        return true;
    }
    return false;
}

```

### 注意点

(追記 2018/03/08)

- [c++ builder > TDateTime > SecondsBetween() > 秒未満の切捨てに注意をする](https://qiita.com/7of9/items/b885091b329a2a617538)

1秒以上の経過確認に関しては、上記の注意点は考慮しなくてもいいかもしれない。
[jade] CentOSにnode-canvasをインストールして困ったこと

## node-canvasのインストール

[ICS LAB](http://ics-web.jp/lab/archives/5192)さんのページに紹介されているアプリを
動かしてみるためにnode-canvasというライブラリが必要になったので
[github node-canvas](https://github.com/Automattic/node-canvas/wiki/Installation---Fedora)を参考に
必要なライブラリ群をインストール。

Faces Panicというアプリは無事に動かせた。めでたしめでたし。

と思ったら…
## jade が上書きされていた。

その後、おもむろに``$ jade -P index.jade``と打ったら

```shell-session
jade:E: invalid option "P"
jade:I: Try the "--help" option for more information.
```

と怒られた！why!!

## 解析

``jade``が上書かれた原因を調査。

やったことといえば、``node-canvas``をインストールするためにインストールしたライブラリ群のインストール。

```shell-session
$ rpm -qa | grep jade
openjade-1.3.2-36.el6.x86_64
```

``openjade``とはなんぞや？→[LDP Author Guide](http://linuxjf.osdn.jp/JFdocs/LDP-Author-Guide/jade.html)

```shell-session
$ sudo yum erase openjade
Dependencies Resolved

====================================================================================================
 Package                Arch      Version           Repository                                 Size
====================================================================================================
Removing:
 openjade               x86_64    1.3.2-36.el6      @xxx-rhel6-x86_64-updates             3.8 M
Removing for dependencies:
 docbook-style-dsssl    noarch    1.79-10.el6       @xxx-rhel6-x86_64-updates             2.2 M
 docbook-utils          noarch    0.6.14-25.el6     @xxx-rhel6-x86_64-updates             156 k
 gtk-doc                noarch    1.11-5.1.el6      @xxx-rhel6-x86_64-updates             540 k
 pangomm-devel          x86_64    2.26.0-1.el6      @xxx-rhel6-x86_64-updates-optional    3.0 M
 perl-SGMLSpm           noarch    1.03ii-21.el6     @xxx-rhel6-x86_64-updates              71 k

Transaction Summary
====================================================================================================
Remove        6 Package(s)
```

あー。``pangomm-devel``さんがインストールしたのね。。困っちゃうわ。
さて、どうしましょう。


## 回避策

``yum``でインストールしたライブラリを削除するのはなんか怖いから
``node-jade``を``$HOME/bin``にインストールする。。。

```shell-session
$ sudo npm remove -g jade
unbuild jade@1.11.0

$ cd ~/bin ; npm install jade

$ vi ~/.bash_profile
PATH=$HOME/bin:$HOME/bin/node_modules/.bin:$PATH

$ source ~/.bash_profile

$ jade --version
1.11.0
```

念のため

```shell-session
$ npm install canvas
canvas@1.2.3 node_modules/canvas
└── nan@1.8.4
```

``node-canvas``のインストールもできるようだ。

しかし、なんだか、しっくりこない。
Railsアンチパターン<モデル編>③ スパゲッティSQL

訳しながらまとめたメモを遂行して投稿する、って形で書いているので、若干視線が偉そうなのはご勘弁ください。実際自分も「ほえー」って言いながら読んでるレベルの人間ですので。

タイトルの通りだが、この章のアンチパターンは、ActiveRecordが用意してくれている豊富な機能を無視して、ほとんど直接SQLを書いているのと変わらないようなコードを書いてしまう、というもの。それを踏まえて以下のソリューションを読んでほしい。

##ソリューション:関連を使う
例えば、以下のようなコードがあるとする。

```.rb
class Toy < ActiveRecord::Base 
  def self.find_cute_for_pet(pet)
    #      ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓?
    where(:pet_id => pet.id, :cute => true) 
  end
end
```
当然だが、「ActiveRecordには、関連というものがあってだな……」と突っ込みたくなると思う。こうすべきだ。

```.rb
class Pet < ActiveRecord::Base 
  has_many :toys
  
  def find_cute_toys 
    self.toys.where(:cute => true)
  end 
end
```
次に、前述(のパターンで触れた)の問題がある。PetモデルがToyモデルの実装を知った(`:cute =>  true`)finderを実行してしまっている。これはよろしくないことだった。
[関連にはブロックとメソッドを渡すことでチェーンメソッドを追加することができる](http://tanihiro.hatenablog.com/entry/2014/04/02/214715)。これを使えば、`pet.toys.cute`という感じで呼べる。少しだけ改善にはなったが、依然Toyモデルの実装情報が漏れていることに変わりはない。どうするか。
[extendオプション](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Association+extensions)を使う([簡単な方の解説](http://qiita.com/makiton/items/dff9307d9cd6a229beb2)　[Railsガイド](http://railsguides.jp/association_basics.html)にも解説がある)。これにより、関連を柔軟に拡張することができる。
これを使えば、以下のようになるだろう。

```.rb
module ToyAssocationMethods 
  def cute
    where(:cute => true) 
  end
end

class Pet < ActiveRecord::Base
  has_many :toys, -> { extending ToyAssocationMethods }
end
```
これにより、ようやくtoyの実装をようやく隠蔽でき(このモジュールをToyクラスのモジュールにしてしまえば良い)、拡張した関連によってcuteなtoyを取得できるようになった。また、一度モジュールに定義してしまえば、他のモデルからtoyを呼び出す際にも使用できる。
さらに便利なテクニックがある。関連の所有者は`proxy_association.owner`でアクセスできるので、

```.rb
class Pet < ActiveRecord::Base 
  # has column :age
  
  has_many :toys do 
    def appropriate
      where(["minimum_age < ?", proxy_association.owner.age]) 
    end
 end
end
```
とかできる。便利。
またscopeを使えることも忘れてはいけない。簡単な条件ならこれで十分だ。

#結論:関連を使いこなそう。ブロックメソッド渡し、scope, extendingを使えば実装を他クラスから隠蔽しつつ柔軟なモデル操作が可能だ。proxy_associationというテクニックもある。

ソリューション:スコープ大好きになれ
=
逐一で複雑なfinderを書くより、細かくscopeを作ることで再利用しやすくなる。
ただ、scopeの連結による`.`はデミテルの法則を破る。
そこで、scopeを組み合わせたメソッドを作る(これはあんまり本質的な解決ではない気がするが)。

```.rb
class RemoteProcess < ActiveRecord::Base
  scope :running, where(:state => 'Running')
  scope :system, where(:owner => ['root', 'mysql']) 
  scope :sorted,  order("percent_cpu desc")
  scope :top, lambda {|l| limit(l) }

  def self.find_top_running_processes(limit = 5) 
    running.sorted.top(limit)
  end

  def self.find_top_running_system_processes(limit = 5) 
    running.system.sorted.top(limit)
  end
end
```
巨大かつ複雑なfinderがある場合は、分割したscopeで「フィルタリング」するように書くとわかりやすい。

```.rb
def self.search(title, artist, genre, published) 
  finder = matching(:title, title)
  finder = finder.matching(:artist, artist)
  finder = finder.matching(:genre, genre)
  finder = finder.published unless published.blank? 
  return finder
end
```
scopeはメソッドチェーンであることが保証されていて扱いやすいし、モデルのある範囲について「名前」をつけることで意味を持たせることができるので、とても良い機能だ。どんどん使おう。

##結論:scopeを使おう

ソリューション:全文検索エンジンを使おう
=
そういうものがある、ということを知っておこう。[まとめてあるページ](http://easyramble.com/rails-full-text-search-libraries.html)。

##結論:全文検索エンジンというものがあるということを知っておき、適切なケースで利用しよう
ユーザー情報へのアクセス許可を初期状態に戻したい時は設定.appでプライバシー情報をリセットしよう

iOSアプリのデバッグを行う際、位置情報や写真.appなどのユーザー情報へのアクセス制御を適切にハンドリングできているか確認したい場合が出てくると思います。

![accessRights.png](https://qiita-image-store.s3.amazonaws.com/0/30970/6d1b333a-08f5-e617-ed36-c23ad06bb2f9.png)

そんな時は、以下の手順でアクセス制御を初期化してみましょう。
1. 設定.appの「一般」をタップ
2. 「リセット」をタップ
3. 「位置情報とプライバシーをリセット」をタップ
これで、ユーザー情報へのアクセス許可を初期状態にリセットできます。
parallelaのメモ

#英語
* [公式](https://www.parallella.org/) - 仕様とかも揃ってる
* [公式のフォーラム](https://parallella.org/forums/)
* [wiki](http://elinux.org/Parallella)

#参考になりそうな日本語の情報
* http://cellspe.matrix.jp/parallella/
* http://qiita.com/syoyo
* [Adapteva Parallellaの使用上の注意](http://www.rs-online.com/designspark/electronics/blog/content-1032)

なんか他に良さそうなのあったら教えて下さい。
Apache Spark SQLで小さい処理なのに長いコンソール出力を抑える（パーティション数を減らす）

Apache Sparkに昨日入門しました。

spark-shell越しにSQLで色々試していて、小さな処理なのにやけに長いコンソール出力がある上にちょっと遅いなと思っていたのですが、解決したのでメモ。

SparkはRDD(データセット)を分散システムで効率よく扱うためにデータをパーティション分割するのですが、この分割数がデフォルトで200になっているようです。
このため、シングルノードで簡単な処理を実行するにしても200個に分割したデータそれぞれに対する処理を起動する必要が生まれてしまい、コンソール出力が増え、処理も少し遅くなります。

パーティション数を設定するには、下記のようにspark.sql.shuffle.partitionsプロパティを設定すればよいようです。

```scala
sqlContext.sql("set spark.sql.shuffle.partitions=1") 
```

シングルノードで開発しているときなどはパーティション数を減らしておいた方が便利そうですね。
秒で与えられた時間を 時:分:秒に直す

とあるオンラインジャッジでやった問題。
秒単位で与えられる時間を、時・分・秒に切り分けるようなコードを書く。
たとえば、入力として`3680`を与えると、`1:1:20`を出力する。
この出力はもちろん`h:m:s`の形である。

#私が書いたコード

```cpp
#include <cstdio>
int main(){
	int in; //入力
	int h=0; //時
	int m=0; //分
	int s=0; //秒

	scanf("%d",&in);

	while(in>=3600){ //時を決定
	in -= 3600;
	h++;
	}

	while(in>=60){ //分を決定
	in -= 60;
	m++;
	}

	s = in; //余りが秒

	printf("%d:%d:%d\n",h,m,s);
}
```

入力`in`から、3600秒(=1時間)を引けるだけ引く。引いた回数だけ`h`をインクリメント。
次に`in`から60秒(=1分)を引けるだけ引く。引いた回数だけ`m`をインクリメント。
最後に、`in`を`s`に代入。

#より良いコード

他の人の回答を見ていたらこんなのがあった。
(丸写しはまずいので一応自分なりに書き直した)

```cpp
#include <cstdio>
int main(){
	int in;
	int h,m,s;
	scanf("%d",&in);

	h = in / 3600;
	in %= 3600;

	m = in / 60;
	in %= 60;

	s = in;

	printf("%d:%d:%d\n",h,m,s);
}
```

整数同士の割り算が整数を返すことをうまく利用している。
剰余代入演算子なんてすっかり忘れていた。

#感想
この問題で割り算を使うのって、小中学生でも思いつくんでなかろうか。これを思いつけないあたり頭が固くなってるなあ。