OmniAICreator/Qiita-1.07M huggingface dataset:
IBM Bluemixの見積り方法


巷で話題のPaaS「IBM Bluemix」の見積り方法を紹介します。

①Bluemixにログインします
②メニューにある「料金」をクリック

![01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/a03bceb0-b5b1-d601-a8ad-d99b77e6ea39.jpeg)


③ランディングページ最下部の「カリキュレーターを開く」を押します

![02.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/494a25bc-2066-0dae-153c-b9ab05732231.jpeg)


④このページで各サービスのパラメータを入力することで、右上に見積金額/月が表示されます

![03.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/12668df5-4124-f08d-499e-40fac718f9cb.jpeg)


すごくシンプルな例ですが、下記の環境で期間限定キャンペーンサイトを作るとします。


Bluemix API | 利用プラン
|:------------ |:-------------- |  
Liberty for Java | 1GB × 1インスタンス |
Data Cache | 1GB × 1インスタンス|
SQL Database | 10GB × 1インスタンス|
Insight for Twitter | 上限100万ツイートプラン|
Elasticsearch by Compose | 無料プラン|

![04.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/e10a321a-98a8-56a7-11d1-61a954f1ea5e.jpeg)

![05.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/66d64dee-c081-3fe1-4cf7-f8b687693107.jpeg)

![06.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/a6f0d8bc-366f-9056-2660-d4a4e7380014.jpeg)


ちなみにInsight for Twitterは、Twitter社とIBMの提携によってBluemixに搭載されたAPIです。Twitterの公開ツイート全体の中からランダムに約10%のデータが検索対象になるようです。上限100万ツイートまで無料。

![08.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/03e10c6e-636f-c68f-4afe-59c2c37e008e.jpeg)


Elasticsearch by Composeは言わずと知れた全文検索エンジン。2015年7月からBluemixに加わったAPIで、無料で使えます。

![09.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/9f150388-d1e4-74de-6746-b8f108f6f77a.jpeg)


この構成だと、11,460.75円/月

![07.jpeg](https://qiita-image-store.s3.amazonaws.com/0/83653/85a7ec61-3699-7215-14fa-62fcac757d32.jpeg)


オンラインゲームで定評のあるIBM SoftLayerサーバーの使用料や管理費と、余裕のある開発/実行環境を手に入れてこの価格はかなりリーズナブルだと思います。

*この記事は2015/7/24時点の情報に基づいています
bash を起動したら「バァシュ」、zshを起動したら「ズィーエスエィチ」と Alex が声で教えてくれる設定

https://twitter.com/sys9kdr/status/624219352200409088 のツイートを見て実際にやってみました。

say コマンドを使ってるので mac でしか出来ません。

自分のターミナルのほうは簡単で ~/.bashrc や ~/.zshrc への設定で出来ます。

```
$ echo 'say -v Alex $(basename $SHELL)' >> ~/.bashrc
```

しかしこれだけでは飽き足りません。ssh接続した際にも声で教えてもらえれば shell の方言に騙されて何かを間違える確率は減るでしょう。

ssh_config には PermitLocalCommand と LocalCommand という設定がありまして、平たく言えば ssh でどこかにログインした時に例えばログを吐き出すとかメールで通知するみたいな事が出来るわけです。
今回はこれを利用しました。
ただ LocalCommand には鍵のパスを使うことが出来ませんでしたので秘密鍵は ssh-add している前提となります。

```
# ~/.ssh/config
Host *
  PermitLocalCommand yes
  LocalCommand say -v Alex $(ssh -F /dev/null %r@%h 'basename `echo $SHELL`')
```

say コマンドは他にもいろんな声が入っていますので

```
$ say -v '?'
```

からお好きな方をお選びください。

これでシェルの方言も怖くないですね。
EC-CUBE3でMySQL使ってPDOのSQLSTATE[HY000] [2002]でエラーでインストールできない時

PDOのdefault socketとMySQLのsocketのパスが違うのが原因。
DBサーバのHostをIPにしたりlocalhostとかにすると通ったりする。

PDOの挙動がナゾなんでその内検証する


### <a href="https://www.xross-cube.com/service/ec-cube%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA">EC-CUBEのカスタマイズはこちら</a>
鍵を使わずにログインしたいときのsshオプション

LDAPの設定に失敗して鍵認証でログインしようとしてログインできない！
みたいなときにつかうsshのオプションの備忘録です。

```
$ ssh -v -o PubkeyAuthentication=no user@172.16.xxx.xxx
```

これでいけました。
-vはデバッグモードなので、なにが原因でとまってるのか知りたいときに。

原因は恥ずかしながら、環境追加時のchefレシピの分岐処理修正漏れみたいな感じで、
/etc/ssh/ldap.confとかの関連設定ファイルのldapサーバの接続先ちがうとこみてたとかです。

直した設定ファイルと順番はこちら。（まあ詳しい同僚に直してもらったんですけど。）

```
/etc/sudo-ldap.conf

/etc/ssh/ldap.conf
sshd restart

/etc/nslcd.conf
nslcd restart
nscd restart

/etc/pam_ldap.conf
```

chefれるけど直し方わからないとか不便なので精進しないとなーと思いました。
まあBGデプロイで作り直してもよかったけど時間もったいないし。

以上です。
SPI通信

ネットの海を漂っていた後輩が結局よくわかっていなかったようなので説明した内容をまとめ

#ちっちゃいおっさん方式での説明
##頭のなかに用意するもの
- おっさん(マスター役)
- その部下(スレーブ役)
- ホワイトボードとマーカー(おっさんと部下に1セットずつ)

では、おっさんと部下との間でSPI通信をさせてみます。

##通信手順
- おっさんが部下に「お前と通信するぞ！」と伝えます。
- おっさんが「更新！」と号令をかけます。おっさんと部下はそれぞれ自分のホワイトボードを綺麗にして、相手に伝えたいことを1bit書きます。
- おっさんが「取り込み！」と号令をかけます。おっさんと部下はそれぞれ相手のホワイトボードに書いてあることをどこかにメモします。
- 更新と取り込みをおっさんの気が済むまで繰り返します。一般的に8bit(又はその整数倍)単位です。
- おっさんが部下に「お前との通信終わり！」と伝えます。

ちなみに部下は一切返事をしません。ただおっさんの声を聞いてデータを読み書きするだけです。
おっさんもおっさんで部下の様子なんて見ません。

部下の「データ用意できました！」とかそういう通知はSPIの枠外でやります。

##信号線名との対応
「お前と通信中」信号線をCSとかSSとかと呼び、
「更新！/取り込み！」信号線をSCLKなどと呼び、
おっさんのホワイトボード信号線をMOSI(Master Out Slave In、おっさんにとってのSDO、部下にとってのSDI)
部下のホワイトボード信号線をMISO(Master In Slave Out、おっさんにとってのSDI、部下にとってのSDO)などと呼びます。

部下が複数いる場合はCSもその分必要ですし、
おっさんが伝えることが何もない場合はMOSIは必要ないですし、
逆の場合はMISOが必要無くなります。

#細かい話

##CS
負論理です。
通信相手として選択している間はL、していない状態をHとします。
スレーブの数だけ必要です。
マスターのピン数が足りない場合は適当にデコーダをはさみます。
1対1でしか通信しないならICによってはLレベル固定にして省略可能です。

##SCLK
- 通信していない間の電圧レベルをどうするか
- SDOの更新を先にやるか、SDIの取り込みを先にやるか

で2x2=4種類あります。

更新、取り込みのタイミングはエッジを使います。
周期はスレーブのスペックをみて決めます。

通信していない間はL/Hとする方式をCPOL=0/1
更新を後/先にやる方式をCPHA=0/1
と呼びます。

```
CPOL=0,CPHA=1
cs  ****\_________________________________________________....
sclk________/*********\______/*********\______/*********\_....
            ^         ^      ^         ^      ^         ^
          update    latch  update    latch  update    latch

_:L  *:H  /,\:Edge
```

別名にmode x,yとかmode z とかckp,ckeとかあります。
どれがどれに対応するか覚えるよりデータシート見ましょう。

取り込みを先に行う場合に、スレーブが先頭ビットをいつ用意するかもデータシート読む必要があります。
(※スレーブが何か出力する場合は、別で更新通知の信号線を用意していたり、MISOで更新通知する事が多い)

##MISO/MOSI
ICによっては入出力のどちらかがいらないものがあるので、そういうICでは片方が存在しません。
railsで使わなかった物の削除で迷う

コントローラの削除
rails destroy controller <コントローラ名>

```
rails destroy controller users
      remove  app/controllers/users_controller.rb
      invoke  erb
      remove    app/views/users
      invoke  rspec
      remove    spec/controllers/users_controller_spec.rb
      invoke  helper
      remove    app/helpers/users_helper.rb
      invoke    rspec
      remove      spec/helpers/users_helper_spec.rb
      invoke  assets
      invoke    coffee
      remove      app/assets/javascripts/users.js.coffee
      invoke    scss
      remove      app/assets/stylesheets/users.css.scss
```

destroyコマンドは関連ファイルも一緒に削除してくれるので便利ですね。

モデルを削除
rails destroy model <モデル名>

```
rails destroy model user
      invoke  active_record
      remove    db/migrate/20150629032946_create_users.rb
      remove    app/models/user.rb
      invoke    rspec
      remove      spec/models/user_spec.rb
```

モデルの削除でdestroyコマンドを実行するとmigrateファイルまで削除されてしまうので、マズいです。
githubを使っているならmigrateファイルのみ戻せると思いますが、手作業で削除するのが一般的なのでしょうか？

migrationでテーブルを削除
マイグレーションファイル作成

rails generate migration < drop_table_マイグレーション名（スネークケース) >

```
rails generate migration drop_table_users
      invoke  active_record
      create    db/migrate/20150724114439_drop_table_users.rb
```

マイグレーションファイルのテーブル削除を記述

```
class DropTableUsers < ActiveRecord::Migration
  def change
    drop_table :users
  end
end
```

`rake db:migrate`コマンドを実行すればテーブルが削除されます。
model削除時にmigrateファイルが削除されてしまうとマズいのは、ここでせっかくテーブルを削除するmigrateファイルを作っているのに、modelのmigrateファイルを消してしまうと今度はここのmigrateファイルが宙に浮いた状態になってしまうからです。
というよりもmigrateファイルは削除しない事が大事です。
初心者以前の問題かも知れませんが、いちいち迷ってしまいました。
オンプレのバックアップ先を日本国内で且つ関東圏以外にする方法


# はじめに
おっす！クラウド業界に身を投じて1年経ったケンイち、だよ。
オンプレのバックアップ先をクラウドにしたい。っていう要件ってよく聞きますよね。
しかもバックアップの要件がちょっとだけ難しいってこともありがちですよね。

# バックアップ要件
ちょっとだけ面倒な、バックアップ要件を挙げてみます。

- バックアップ先をクラウドにしたい
- アップロード方法はセキュアにしたい
- オンプレの環境を関東圏に置いているので、関東圏以外にバックアップしたい
- でも海外だと復旧するのが面倒だから、日本国内にしたい ←ここが、ちょっとだけ面倒

# 実現方法
以上の要件を満たすために、Azureを選択してみます。
では、どうやって実現するかを机上ではありますが、記載していきます。

ざくっと書くと以下のような構成になります。
![Untitled(1).png](https://qiita-image-store.s3.amazonaws.com/0/55533/38da4e3e-ae0c-5990-51d1-b0c4f936924f.png)

セキュアにアップロードするために、インターネットVPNを利用することにしました。
AzureではVPN Gatewayが備わっているため、簡単に実現することができます。
- VPN接続検証済みのルータは以下のURLに掲載されています。
https://msdn.microsoft.com/ja-jp/windowsazure/dn132612.aspx

# まとめ
Azureのアカウントを持っていない&ルータを持っていないため、検証することは出来ませんでしたが、実現自体は可能と思われます。
Azureは日本国内で、東京と大阪の2つのリージョンを持っており、サービス自体も非常に有益なものが多数あります。
そんなAzureを使わない手は無いでしょう！

以上、ポエムでした。
C#のメソッドを呼ぶと自作ライブラリ内のCのメソッドが呼ばれる事がある？


よくわからん現象が起こったのでメモ

Unity C#側でFile.ReadAllBytes(パス)をコールした時に、
自分で作ったCのライブラリにlong GetFileSize()　があったら
なぜかGetFileSize()が呼び出された。

うーん、*.oファイルにした時のシンボル名？？が
C#のファイルクラスが使用している継承元クラスを中間言語にした時の
シンボル名？？と一致したのかな？


long GetFileSize()　をlong GetEntityFileSize() に変えたら呼ばれなくなった。
Lightning Component で ハッシュとパラメータの併用ができないことを知りました・・・

## 知ったこと
### Lightning Componentでハッシュとパラメータの併用をするとURLパラメータの制御が上手くできない
理想は下記の形式を保ち続ける事ですが・・・
https://ap2.lightning.force.com/c/○○○.app#index?view_mode=true

ハッシュで動的な制御をしようとすると（例えば）
* \<a href="#○○○">TOP\</a>
  パラメータの後にハッシュが追加されます
* \<a href="/#○○○">TOP\</a>
  社内用のURLにリダイレクトされてしまう・・・

私の技術不足だと思ういますが、上手く制御ができない

## 感想
はっきりとしたことはいえませんが、ハッシュは使わないほうがいいと感じました
早く気づけばよかった・・・
CrosswalkでChromiumのWebViewを使おう！

[Crosswalk](https://crosswalk-project.org)とは、Androidの標準WebViewを置き換えるChromiumベースのViewコンポーネントです。これを使うことで端末ごとの微妙なWebViewの実装・バージョン差を気にすることなく最新のChromiumベースのアプリケーションを開発することができます。

**※2017年8月9日追記: [Crosswalkはバージョン23を最後にメンテナンスを終了する](https://crosswalk-project.org/blog/crosswalk-final-release.html)ことが発表されました。**
現在のAndroidはChromiumのエンジンでWebViewをレンダリングできるようになったので、今後はCrosswalkを使う必要がなくなるだろうという判断らしいです。

## 手順

AndroidStudioのプロジェクトでCrosswalkを使うための設定手順です。

1. プロジェクトルートのbuild.gradleにmavenリポジトリの追加設定をする。
2. アプリケーションのbuild.gradleにdependencyを追加
3. 必要なパーミッションを追加


### プロジェクトルートのbuild.gradleにmavenリポジトリの追加設定をする。

Crosswalkは標準のjcenterリポジトリには置かれていないので、Crosswalkを取ってくるためのリポジトリを追加する必要があります。プロジェクトのルートにあるbuild.gradleに以下の`maven {}`のブロックを追加します。

```groovy:%PROJECT_ROOT%/build.gradle
...

allprojects {
    repositories {
        jcenter()

        // ↓これを追加
        maven {
            url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
        }
    }
}
```


### アプリケーションのbuild.gradleにdependencyを追加

アプリケーションのモジュールに依存ライブラリとして`org.xwalk:xwalk_core_library_beta:23.53.589.4`を追加します（2017/08/09時点の最新バージョンです）。

```groovy:%PROJECT_ROOT%/app/build.gradle
...

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'org.xwalk:xwalk_core_library_beta:23.53.589.4' // これを追加
}
```

### 必要なパーミッションを追加

Crosswalkを使用するためには最低限以下のパーミッションが必要です。

```xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
```

その他、使用するAPIにより以下のパーミッションが必要になる場合があります。

位置情報にアクセスする場合:

```xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
```

カメラ・ビデオ・マイクへアクセスする場合:

```xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
```

外部ストレージにデータを書き込む:

```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

スクリーンをオンにし続ける:

```xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
```


## 使い方

`WebView`の代わりに`org.xwalk.core.XWalkView`を使用します。
例えばレイアウトの中に入れる場合は以下のようにします。

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<org.xwalk.core.XWalkView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
```

Androidの`assets`の中にある`index.html`を読み込むには、WebViewと同じように`file:///android_asset/index.html`を指定します。

```java
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        XWalkView view = findViewById(R.id.webView);
        view.loadUrl("file:///android_asset/index.html");
    }
}
```

WebViewとは違ってXWalkViewはデフォルトでJavaScriptが利用でき、動画や音声の再生をユーザーのジェスチャーなしで行えます。よりネイティブアプリらしい使い方が、少ないコードで実現可能です。
Windowsホスト上のVagrantの共有フォルダでnpmに失敗する問題の解決

# 問題
ホストOSはWindows，仮想マシンはLinuxでVagrantの共有フォルダをそのまま作業フォルダ（プロジェクトルート）にしている．
この作業フォルダを`/mnt/project`とする．

```shell-session
cd /mnt/project
npm init
npm install <some package>
```

とかやるとエラーになる．
エラーの原因は
http://eiua-memo.tumblr.com/post/117361529158/npm-vagrant-vagrant-npm
に考察があるとおり，

- VirtualBoxの共有フォルダではシンボリックリンクの作成が禁止されている
- `--no-bin-links`オプションでシンボリックリンクの作成を回避しても，パスの長さがホストOS(Windows)の制限に引っかかってファイルを作成できないと言われる
    - Permissionエラーが出て，rootで実行しろと言われる．rootで実行しても同じPermissionエラーになるので，最初は混乱した．
        - ↓例えば`npm install webpack`したら，こんなの
        
        ```
npm ERR! Linux 2.6.32-431.el6.x86_64
npm ERR! argv "/home/vagrant/.nvm/versions/node/v0.12.7/bin/node" "/home/vagrant
/.nvm/versions/node/v0.12.7/bin/npm" "install" "webpack"
npm ERR! node v0.12.7
npm ERR! npm  v2.11.3
npm ERR! path /mnt/project/node_modules/webpack/node_modules/watchpack/node_modu
les/chokidar/node_modules/anymatch/node_modules/micromatch/node_modules/braces/n
ode_modules/expand-range/node_modules/fill-range/node_modules/randomatic/package
.json.da1e639d20f3c4cf3eae17544a0d3871
npm ERR! code EPERM
npm ERR! errno -1
...
```
        

# 対策
共有フォルダ`/mnt/project`でシンボリックリンクを張れるよう設定し，
`/mnt/project/node_modules`を共有フォルダの下にないディレクトリを指すシンボリックリンクにする．

ホストがWindowsだと，シンボリックリンクを許可したところでパス長の制限に引っかかるので，
`node_modules`をWindowsファイルシステムが見えないところに移すようにした．

## 方法
http://qiita.com/fagai/items/82e3e660ebf3702e782a
を参考にさせていただいた．
`Vagrantfile`に

```rb
  config.vm.provider :virtualbox do |vb|
    vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//mnt/project","1"]
  end
```
を追記する．(`/mnt/project`の部分は環境に合わせて変える）

また，管理者権限のプロンプトで
`fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1`
を実行する．
（これはページによって書いてあったりなかったりなので必要かはわからない．色々やっていたらできたので）

既にvagrantが立ち上がっている場合は，**管理者権限で起動したプロンプトから**プロビジョニングしなおす(`vagrant reload --provision`)
VirtualBoxにシンボリックリンクを許可しても，Windowsは管理者権限でしかシンボリックリンクを作れないので，管理者権限でvagrantを起動する必要がある．

最後に，`/mnt/project`の下でない適当な場所に`node_modules`ディレクトリを作成し，`/mnt/project`からシンボリックリンクを貼る
[JavaScript] sourceMapの作り方

## sourceMapって、便利ですよね～。

適切に設定しておくと、
``HTML``内では``hogehoge.min.js``という圧縮JSを読み込みつつ
``firebug``等のデバッガでは``hogehoge.js``を読み込んで表示してくれるようになります。

でも、ものによっては``sourceMap``が用意されていないことも多々あります。
そもそも自分で書いたJSなら、自分で``sourceMap``を作る必要があります。
そんなときは便利ツールでさくっと作れます。


## 準備
### Google Closure Compiler のインストール

[ここ](https://developers.google.com/closure/compiler/docs/gettingstarted_app?hl=ja)からダウンロードしてください。


>
``jar``なんかは、``$HOME/bin``にいれてエイリアス付けておくと便利ですね。
>
```shell-session:.bashrc
alias closure='java -jar $HOME/bin/compiler.jar'
```

## 好きなJSのダウンロード
サンプルとして``Bootstrap``を使います。

```shell-session
cd /path/to/project
npm install bootstrap
cd node_modules/bootstrap/dist/js
mv -f bootstrap.min.js _bootstrap.min.js
closure --create_source_map bootstrap.min.map bootstrap.js > bootstrap.min.js
echo "//# sourceMappingURL=bootstrap.min.map" >> bootstrap.min.js
```

ワーニングいっぱい出ますが無事に``bootstrap.min.map``が生成されました。

あとは``min.js``を読み込むだけです。

```html:index.html
<!doctype html>
<html lang="ja">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>test</title>

<body>
<script src="node_modules/jquery/dist/jquery.min.js"></script>
<script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
```

デバッガを開くと``bootstrap.js``を表示してくれます。
Groovyでやってみる「全ての部分集合を少ないコストで得る」

つまり、

```math
A =\{a_0,..,a_n\}\\
B \subseteq A\\
\forall B(B \in f(A))
```
となる関数$f(A)$を作ります。
但し、$A=\phi$ のとき $f(A)=\\{\phi\\}$ としています。

```groovy
def getSubsets = {l->
  if(!l) return [[]]
  def ss = []
  def x = Integer.parseInt(('1' * l.size()),2)
  for(int y=x;y>0;y=--y&x){
    def s = []
    Integer.toBinaryString(y).padLeft(8, '0').reverse().eachWithIndex{flg,idx->
      if(flg=='1') s << l[idx]
    }
    ss << s
  }
  ss
}
```

ビット演算<code>y=--y&x</code>がこの計算の要旨で、これはビットの部分集合を得ます。
よくわからない場合は真偽表でも書いて確かめてみてください。

リストのサイズのBit表現の部分集合の逆順リストのフラグ位置を求めることで、任意のリストの部分集合を得られます。

```groovy
groovy> def list = [1,2,3] 
groovy> getSubset(list) 
 
Result: [[1, 2, 3], [2, 3], [1, 3], [3], [1, 2], [2], [1]]
```

なお、わかると思いますが、この関数に長いリストを叩き込むと出力がどエライことになります。

部分集合を引数としてとるクロージャを引数として取る関数にして、それぞれの部分集合に対する（返却すべき）演算結果のリストを返すくらいにしておいたほうが無難だと思います。

参考：http://d.hatena.ne.jp/deve68/?of=40
go install時にno install location for directory ○○○ outside GOPATHのエラーが出る件について


Go言語でちょろっとアプリケーション作ろうと思った時に、タイトルのエラーが出たので対処した記録を。

## どう対処したのか？

どうもタイトルのエラーは/binに実行ファイルを生成しようとしてるけども、GOBINというパスが設定されていないよ！というエラーみたいです。

なので対処としては以下の様な感じ。

````bash
$ export GOBIN=$GOPATH/bin
````

これで実行できるようになります！

````go get````とかでも同じようなエラーが出るので、もし出た方は上記の対処をしてみてください！
git reset がわからない

# git reset がわからないので図をかいた

## 以前のコミットへ戻るとき

![git-reset^HEAD.png](https://qiita-image-store.s3.amazonaws.com/0/2528/69ea6e96-fbb0-c73b-7f30-f86031642dc4.png)


## 現在の HEAD へ戻るとき

**現在の HEAD へ戻る** という日本語はおかしかった。
**reset は HEAD の位置を変更する。** オプションとしてステージ上、ワーキングツリーのファイルを削除したり残したりできる。

### HEAD へ reset するということは HEAD の位置がかわらない
1. `reset --soft` はステージにもワーキングツリーにもなにもしない、のでなにもおこらない
2. `reset` はステージ上からファイルを降ろすので、`add` の取り消しになる
3. `reset --hard` はワーキングツリーへの変更も削除してしまう。コミットしていない作業は消える。



![git-reset-HEAD.png](https://qiita-image-store.s3.amazonaws.com/0/2528/b93db293-0243-bb59-8f42-4cb849b60e69.png)

# メモ

* ステージ と index は同じもの
* unstage はステージから削除されるということ
* HEAD^ は HEAD の一つ前のコミット
* ローカルファイルをステージに上げて、ステージに上げたものをコミットする
* reset は HEAD の位置を変更する

# わからないこととわかったこと

* HEAD を本当にはわかっていない
* ブランチも本当にはわかっていない https://git-scm.com/book/ja/v1/Git-のブランチ機能-ブランチとは
* commit もチェックアウトできる... ブランチのチェックアウトしかしたことがなかった
* ORIG_HEAD 便利そうである
もうハマらない！シンボリックリンク

##意外とハマるシンボリックリンク

本番環境で指定したパスを変えずに、ローカルで動かしたい…
そんな時に必ず使うのがシンボリックリンクですが、
わかりやすいようで、ものすごくわかりづらい。
こんな事で二度と無駄な時間を使いたくないのでメモっておきます。

##基本

`ln -s "こっちに飛ばす" "こっちから…"`
この順番をお忘れなきよう。

つまり、本番環境を、ローカルで動かしたい！という場合には
`ln -s "ローカルのパス" "本番のファイルパス"`
こんな感じになるわけ。

##では、やってみよう
本番環境では、`/usr/share/nginx/html/hoge/ ...`
開発環境では、`/Users/user/dev/tool/hoge/ ...`

というフォルダの構成になっている場合は、以下のようにすれば、
`../html/`以下に指定されたパスは、`../tool/`以下にリンクしてくれます。


`sudo ln -s /Users/user/dev/tool/ /usr/share/nginx/html`

なお、きちんとフルパスで指定したほうが、ミスが少なくていい感じです。

##要注意

**OK** : `sudo ln -s /Users/user/dev/tool/ /usr/share/nginx/html`
**NG** : `sudo ln -s /Users/user/dev/tool/ /usr/share/nginx/html/`

最後にスラッシュを入れてしまうと、htmlフォルダの下にシンボリックリンクを作成してしまうので、きちんと動作しないことになる。

(例の場合では、`../nginx`フォルダの中に、シンボリックリンクを作らなければいけない)
alternatives で python を 2.7に切り替える


気づいたら、aws コマンドが動かなくなっていて、なぜか python が 2.6に戻ってしまっていた。

こんなエラー

```
Traceback (most recent call last):
  File "/usr/local/bin/aws", line 19, in <module>
    import awscli.clidriver
ImportError: No module named awscli.clidriver
```



```
$ alternatives --display python
python - ステータスは手動です。
リンクは現在 /usr/bin/python2.6 を指しています。
/usr/bin/python2.6 - 優先項目 2600
 :
 :
/usr/bin/python2.7 - 優先項目 27000

```

2.7の方を指定。

```
$ sudo alternatives --set python /usr/bin/python2.7

$ python -V
Python 2.7.9

```

もどった。
node.js with ejs


##install ejs

```shell
npm install ejs
```

##.ejs

###hello.ejs
```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta http-equiv="content-type"
        content="text/html; charset=UTF-8">
    <title><%=title %></title>
    <style>
    body { font-size:12pt; color:#006666; }
    h1 { font-size:18pt; background-color:#AAFFFF; }
    pre { background-color:#EEEEEE; }
    </style>
</head>
 
 
<body>
    <header>
        <h1 id="h1"><%=title %></h1>
    </header>
    <div role="main">
        <p><%-content %></p>
    </div>
</body>
 
</html>
```

###content1.html
```html
<p>※サンプルで作ったコンテンツです。</p>
<p>別ファイルとして用意したものを読み込んで使います。</p>
<p><ol>
<% data.forEach(function(val) { %>
	<li><%= val %></li>
<% }) %>
</ol></p>
```

##.js

###example.js

```js
var http = require('http');
var fs = require('fs');
var ejs = require('ejs');

var hello = fs.readFileSync('./hello.ejs','UTF-8');
var content1 = fs.readFileSync('./content1.ejs','UTF-8');

var server = http.createServer();
server.on('request', doRequest);
//server.listen(process.env.PORT, process.env.IP);
server.listen(8124);
console.log('Server running!');

function doRequest(req, res) {
	var hello2 = ejs.render(hello, {
        title:"タイトルです",
        content: ejs.render(content1, {
        	data:[
        		"これは最初のデータです。",
                "次のデータだよ。",
                "一番最後のデータなのだ。"
        	]
        }),
    });
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(hello2);
    res.end();
}
```

##run

```shell
node example.js
```
リッチなアイテムリスト、スライドショーを設定したい→ bxSlider てあるのか


## 参考
http://blog.8bit.co.jp/?p=11145
http://makasete-web.net/bxslider
http://hyg-de-haizi.com/bxslider-doesnt-workie9-ie8-ie7

## 動的に表示項目数を変更したい

```
var defOpt = {
  maxSlides: X; // ここの値で変わるよう
};
var slider = $('.bxslider').bxSlider(defOpt);
slider.reloadSlider(defOpt);

```

## 問題
画像と下にテキストを配置したものを設定しているが、
viewport部分の Height が変わってしまう。
heightを強制的に設定している。
# Qiitaの投稿をシェルスクリプトとして実行する方法

alias ~~~=;:<<'~~~'

`curl http://qiita.com/suin/items/2bdeef73b5413c5a1892.md | sh`を実行すると、このQiita投稿の下のシェルスクリプトが実行されます。

~~~
set -x
whoami
date
~~~
MongoDB - エラー「RS102」の対処方法について

MongoDBのレプリカセットにmongorestoreのような大量のデータを流し込むとたまに出るのでメモ

### エラーメッセージ
```
2015-07-23T21:50:20.688+0900 I REPL     [rsBackgroundSync] replSet error RS102 too stale to catch up
```

### 原因
* レプリカセットの同期元が同期先のoplogから更新情報を取得する際に、取得する更新情報が取得する前に同期先で削除されてしまい、更新情報が取得できなくなるのが原因

### 復旧方法
1. RS102が発生しているmongodを停止
1. dbpath配下のディレクトリ・ファイルをすべて削除
1. mongodを起動すると自動的にsyncを開始する

### 再発防止策
* oplogサイズを増やす
chef-zero + knife-zero + vagrantで開発環境と本番環境を構築

# 開発環境構築(vagrant + chef-zero)

## 参考情報

* [Vagrant/ CHEF ZERO PROVISIONER](http://docs.vagrantup.com/v2/provisioning/chef_zero.html)
* [初めての Vagrant + Chef zero + Berkshelf](http://qiita.com/tsuyopooon/items/d90679d9f8b5ccfcfde5)



# 本番環境構築(knife-zero)

## 参考情報

* [Chefのローカルモードだけでリモートサーバを運用してみようと、Knife-Zeroを作った。Nodeの構成情報もとれるよ。](http://qiita.com/sawanoboly/items/218a7b03ddec6be45e34)

## 前提条件

* プロジェクトが[chef-repo](https://docs.chef.io/chef_repo.html)構造になっていること
* 本番環境のサーバが用意されていること

## インストール

Gemfileに以下を追加

~~~
# Gemfile:

gem 'chef'
gem 'chef-zero'
gem 'knife-zero'
~~~

インストール

~~~
bundle install --path vendor/bundle --binstubs
~~~

## chefのenvironmentを作成

```
$ ./bin/knife environment create staging
Created staging
$ ./bin/knife environment create production
Created production
```

## knife zero実行

以下のコマンドを実行します

```
./bin/knife zero bootstrap your-site.example.com --identity-file ~/.ssh/xxx.pem --ssh-user xxx --sudo --use-sudo-password
```

(注意: ~/.ssh/configに設定を記述していたとしても、オプションでidentity-fileとssh-userを指定する必要があります)


コマンドを実行すると対象のサーバにchefがインストールされ、ローカルにnode/your-site.example.com.jsonが作成されます

## nodeファイル修正

chef_environmentやrun_listを設定します。

~~~
# nodes/your-site.example.com.json: 

{
  "name": "your-site.example.com",
  "default": {
    "fqdn": "your-site.example.com"
  },
  "normal": {
  },
  "chef_environment": "production",
  "run_list":[
    "role[common]"
  ]
}
~~~

## chef_client実行

chef_clientを実行して、run_listで指定されたライブラリをインストールします。

```
./bin/knife zero chef_client "fqdn:your-site.example.com"
```

## 注意事項

現時点では、knife-zeroはsite-cookbooks以下のCookbookを参照することができない。

[Knife-ZeroでCookbookの作成／実行／削除＆git cloneコマンドでCookbookの取得 (1/2)](http://www.atmarkit.co.jp/ait/articles/1503/24/news030.html)
>　本来のChefの作法では、個人で作成したCookbookは「chef-repo/site-cookbooks」に格納し、Chef社が公開しているCookbookや第三者が作成したCookbookを「chef-repo/cookbooks」に格納することが推奨されています。
>　しかし2015年3月現在、Chef-Zeroの仕様で、「site-cookbooks」配下を参照しないため、個人作成のCookbookを「chef-repo/cookbooks」に作成するような手順としています。
プルリク前にgit reset --softで簡単にコミットをまとめる方法

プルリク前にコミットを一つにまとめたい場合、良く有る方法としては新たにブランチを切り直して、
そちらのブランチにgit merge --squashしてコミットをまとめるという方法が取られると思います。

git reset --softの場合は以下の手順でコミットをまとめます。

git reset --soft ${ブランチを切った時点でのコミットハッシュ}
git add .
git commit -m "あらたなコミットメッセージ"

共同開発しているブランチであれば、レビュー用にブランチを新たに切ったほうが良いと思いますが、
個人で開発しているブランチで、自分以外がcheckoutしたりコミットしないブランチであれば、
git reset --softでまとめてしまうのが一番楽かと思います。

※git reset --softはHEADが指し示すコミットを移動させる事が出来ますが、詳しくは以前のエントリーを参照してください。
http://qiita.com/LOUIS_rui/items/8bc0c9058a69a3d6de97

具体例はこんな感じです。

```
# masterブランチに1コミットし、トピックブランチに2コミットする
$ git init
$ echo initial >> test
$ git add test 
$ git commit -m "initial commit from master"
$ git checkout -b topic master
$ echo second >> test
$ git add test 
$ git commit -m "second commit from topic"
$ echo third >> test
$ git add test 
$ git commit -m "third commit from topic"
# コミットをまとめる前
$ git show-branch --sha1-name
! [master] initial commit from master
 * [topic] third commit from topic
--
 * [809dcec] third commit from topic
 * [fa4af23] second commit from topic
+* [6340706] initial commit from master
$ git reset --soft 6340706
$ cat test 
$ git status
$ git add test 
$ git commit -m "commit from topic"
# 以下の通りコミットはまとめられました
$ git show-branch --sha1-name
! [master] initial commit from master
 * [topic] commit from topic
--
 * [3c57414] commit from topic
+* [6340706] initial commit from master
```
Laravel5 Elixirでスプライト画像を作成する（Retina対応）


laravel5のElixirでスプライト画像を作る方法です。

Elixirの下準備はこちらから。
http://laravel.com/docs/5.1/elixir

## gulp.spritesmith

Elixirはgulpで実行しているのでgulpでスプライト画像を作成出来るようにします。

https://github.com/twolfson/gulp.spritesmith

gulp単体で実行させるのであれば上記のプラグインだけで出来ますが、今回はElixirで行うのでそのまま使いません。

## laravel-elixir-spritesmith

Elixirで上記のプラグインを動かすのに便利なものを作ってくれている方がいるのでこちらを拝借。

https://github.com/devfake/laravel-elixir-spritesmith


``` gulpfile.js
var elixir = require('laravel-elixir');

require('laravel-elixir-spritesmith');

elixir(function(mix) {

  mix.spritesmith();

});
```


README.mdをみれば簡単に出来るはずです。簡単ですね。

## Retina対応

今時のwebサイトでは当たり前になってきたRetinaディスプレイ対応の方法です。
https://github.com/twolfson/gulp.spritesmith#retina-parameters

gulp.spritesmithの方はRetinaディスプレイに対応していますが、Elixirで使用するlaravel-elixir-spritesmithの方が対応していないので、修正してプルリクを送りました。

https://github.com/shunsuke-takahashi/laravel-elixir-spritesmith


### Retina出力版 gulpfile.js

``` gulpfile.js
var elixir = require('laravel-elixir');
require('laravel-elixir-spritesmith');

elixir(function(mix) {
  mix.spritesmith(null, {
    cssName: 'sprite.css',
    retinaSrcFilter: 'resources/assets/img/sprites/*-2x.png',
    retinaImgName: 'sprite-2x.png',
    retinaImgPath: '../img/sprite-2x.png',
    cssVarMap: function(item) { item.name = 'sprite__' + item.name; },
    imgOutput: 'public/img',
    cssOutput: 'public/css',
  });
});
```

追加した項目は以下の4項目です。

- retinaSrcFilter
- retinaImgName
- retinaImgPath
- cssVarMap

### retinaSrcFilter

retinaSrcFilterはRetina用に使う画像をファイル名でフィルタリングします。
同じフォルダ内に通常の大きさが存在しても大丈夫です。

### retinaImgName

Retina対応版のスプライト画像のファイル名を指定します。

### retinaImgPath

Retina対応版のスプライト画像の出力先を指定します。

### cssVarMap

これ自体にはRetina対応とは直説関連はしていませんが今回追加しています。
cssVarMapは出力されるCSSのクラス名を変更できます。

例に書いている通り出力すると

```
// ファイル名 hoge.png, hoge-2x.png

.icon-sprite__hoge {
  background-image: url(../img/sprite.png);
  background-position: -28px -182px;
  width: 30px;
  height: 24px;
 }
 @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  .icon-sprite__hoge {
    background-image: url(../img/sprite-2x.png);
    background-size: 300px 295px;
  }
 }
```

こんな感じのcssが出力できます。

実際に使用するときはsassで出力して、それをさらにElixirでほかのsassと一緒にコンパイルしてあげるとまとめられて便利だと思います。
【Middleman】 Slim+Sass+Coffeescript+Bootstrap+Heroku

Middlemanを利用して、簡単に性的なサイトが作れます。
SlimとSassとCoffeescriptを使うと、コードが短くなって、コーディングすることが楽になります。Bootstrapなども利用できます。

## Middlemanをインストール

`gem install middleman`

## 新しいMiddlemanサイトを作る
`middleman init sample-app`

## サイトを動かす
`middleman s`

## livereload を使う
```ruby:Gemfile
gem 'middleman-livereload'
```

```ruby:config.rb
# Reload the browser automatically whenever files change
configure :development do
  activate :livereload
end
```

## Slimを使う

```ruby:Gemfile
gem 'slim'
```

**ファイル名を変更**
`layout.erb` => `layout.html.slim`
`index.html.erb` => `index.html.slim`

## Sassを使う

**ファイル名を変更**
`site.css` => `site.css.sass`

## Coffeeを使う

**ファイル名を変更**
`site.js` => `site.js.coffee`

## さらに、Bootstrapを使うなら、以下のように設定したらできると思います。

```ruby:Gemfile
gem 'jquery-middleman'
gem 'bootstrap-sass'
```

```js:source/javascripts/site.js.coffee
//= require jquery
//= require bootstrap-sprockets
//= require_tree .
```

```css:source/stylesheets/site.css.sass
@import bootstrap-sprockets
@import bootstrap
```

## Herokuにサイトを開発するには、以下のファイルを作るのが必要です

```:Procfile
web: bundle exec middleman build && middleman server -p $PORT
```
CentOSのインストールでUSB Boot からの Kickstartを良い感じに行なう方法

# USB Bootでkickstartを良い感じに使いたい！！
## 参考にさせてもらったサイト
* [Kickstart driven CentOS 7 install from USB](https://gist.github.com/pauljeff/4b9ad551cb6c35870d7c)
    * 殆どこのままなのですが、CentOS 6では少し変更が必要でした。
* [How to Set Up a USB Key to Install CentOS](http://wiki.centos.org/HowTos/InstallFromUSBkey)
 
## この方法の良いところ
* パーティションはvfatなので、ks.cfg, syslinux.cfgなどの書き換えが簡単。
    * ks.cfgを対象毎に用意して、メニュー追加などが簡単。
* CentOSのisoをそのままファイルとして置くので、差し替えが簡単。

## Linuxで作業します。たぶんCentOS6の方が良いです。LiveCDなどでOK。

### USBのパーティション設定
ここでは/dev/sdbがUSBという事にします。

```shell-session
# fdisk /dev/sdb
n (sdb1パーティション作成, First sectorは63にする。)
t (パーティションIDの変更, W95 FAT32 (LBA)へ変更する。cと入力。)
a (sdb1はbootableに変更する。)
n (sdb2パーティションの作成, 全部割り当てる。)
t (sdb2パーティションIDの変更, W95 FAT32 (LBA)へ変更する。cと入力。)
w (write changes to device)

上記適当ですが、sda1,sda2をfat32で作ってsda1をbootanleにすれば良いです。
試してませんが、sda1だけでも良いかもしれないです。
```

### フォーマット
```
# mkfs -t vfat -n "BOOT" /dev/sdb1
# mkfs -t vfat -n "DATA" /dev/sdb2

* mkfs.vfatはdosfstoolsのrpmに含まれています。
```

### MBRのインストール
```
# dd conv=notrunc bs=440 count=1 if=/usr/share/syslinux/mbr.bin of=/dev/sdb

* /usr/share/syslinux/mbr.binはsyslinux-nonlinuxのrpmに含まれています。
```

### syslinuxのインストール
```

# syslinux /dev/sdb1
```

### USBのマウント その1
```
# mkdir BOOT
# mount /dev/sdb1 BOOT
# mkdir DATA
# mount /dev/sdb2 DATA
```

### LinuxのISOを取得
```
# cd DATA
# wget http://お好きなミラーサイト/CentOS/6.6/isos/x86_64/CentOS-6.6-x86_64-minimal.iso
# cd ..
```

### USBのマウント その2
```
# mkdir DVD
# mount /path/to/DATA/CentOS-6.6-x86_64-minimal.iso DVD
```

### DVDからブートに必要なファイルをコピー
```
# cp DVD/isolinux/* BOOT
```
```:これはCentOS6だけ必要。CentOS7では不要です。(私はCentOS7では試していないですが。)
# cp -a DVD/images BOOT
```

### isolinux.cfgをsyslinux.cfgへリネーム  
```
# mv BOOT/isolinux.cfg BOOT/syslinux.cfg
```

### syslinux.cfgの編集
```
# vi BOOT/syslinux.cfg
```
```:以下の箇所を変更します。
label linux
  menu label ^Install or upgrade an existing system
  menu default
  kernel vmlinuz
  append initrd=initrd.img
```
```:CentOS6の場合は、appendを以下のように変更します。
append initrd=initrd.img method=hd:LABEL=DATA:/ ks=hd:LABEL=BOOT:/ks.cfg
```
```:CentOS7の場合は、appendを以下のように変更します。
append initrd=initrd.img inst.stage2=hd:LABEL=DATA:/ ks=hd:LABEL=BOOT:/ks.cfg

* 私はCentOS7では試してませんが、たぶん行けます。
```
ks.cfgを複数用意してあげて、syslinux.cfgでlabel xxxで増やせば、色々なパターンのks.cfgを使い分けれます。
Redmine+GitHub+(Slack OR HipChat): SlackとHipChatの比較

RedmineとGitHub上のやりとりをchatで通知して欲しくなったので、HipChatとSlackの連携をそれぞれやってみました。


## HipChat

Atlassianのアカウントを持っていれば、それでログインして利用できます。
なければ作りましょう。

### GitHubとの連携

HipChatのRooms/[your_room]/Integrations から、roomごとにaddonが設定できる。

GitHubのaddonが用意されているので、ほぼぽちるだけでOK

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/d5a4ee7c-f88c-5b4f-c7c4-6129d8399204.png)


### Redmineにプラグイン追加

https://github.com/hipchat/redmine_hipchat

migrateが必要なので、バックアップをとってからすること。
http://www.redmine.org/projects/redmine/wiki/Plugins

#### プロジェクトごとにルームを設定

プロジェクト内の設定タブ＞情報に、下記のroomとtokenの設定欄がある。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/96d9fc9e-c86e-1a40-eac0-d131252327ea.png)

HipChatのRooms/[your_room]/Integrations/Redmine　に上記に入力する値が表示される。


#### 通知対象

チケットの作成・更新と、wikiの作成・編集で通知される。関係するチケットやリビジョンの変更は通知されない。

#### 見た目

HipChat自体の見た目ですが、友人曰く、古きよきIRCだとか。Skypeに近いイメージ。

チケットのやりとりでmarkdownを使っても、チャットでは解釈されずに来るし、改行も上手くされていないので、微妙な気分に・・・

## Slack

freeプランで新しくチームを作るやり方でいきます。その場合は、integrationは5個までなので注意。

### GitHubとの連携

これもプラグインが用意されているのでぽちるだけ。

### Redmineにプラグイン追加

readmeにインストール手順に従えばOK。
https://github.com/sciyoshi/redmine-slack

migrateはないですが、httpclientが必要なので`plugins/redmine-slack`に移動して、`bundle install` を実行でいれます。

### webhookのURL設定

incomingのwebhookを使います。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/a84e07a3-c32c-9e2d-ec87-271c1e134436.png)

既存のチャンネルから選ぶか、新規作成してpostしたいチャンネルを選んでaddをクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/b9f33c51-261e-fd15-2fb8-3a6158959c82.png)

そうすると、hookのためのURLが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/4c15fe41-30e9-c10d-34ba-dce270f6bee3.png)


### プロジェクト毎のチャンネル設定

これもreadmeに書いてある通りに。

プロジェクトに`Slack Channel`というカスタムフィールドを追加することで、プロジェクト毎に通知するチャンネルを設定できる。

管理＞プラグイン＞Redmine Slackで下記の設定画面にいきます。ここのURLに前述のwebhookURLをいれる。プロジェクト毎にチャンネルを設定する場合は、`Slack Channel`に`-`をいれる。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/16218221-f435-3e9a-1ffc-f1927efc0656.png)

その後、プロジェクトの設定タブの画面に、追加した`Slack Channel`のフィールドに通知したいチャンネル名をいれて完了。

![image](https://qiita-image-store.s3.amazonaws.com/0/9880/dd7f80a1-4762-d12d-acca-d73cc97d91b1.png)


### 通知対象

チケットの作成・編集のみに通知がくる模様。wikiの編集には反応しない。

### 見た目

HipChatに比べると、アイコンもあるし、大分見やすい。
通知のメッセージが参照された形で来るので、markdownは反映されないのは変わらずですが、それでも結構読める。

### 通知が速い！？

環境依存の話ですが、自分のところでは、Redmineでチケットの編集のリクエストを出して、結果画面が返ってくるよりも先に、slackのデスクトップ通知が表示されるw

## まとめ

見やすさや扱いやすさは、やはりSlackの方が良い。
Slackのfreeプランはintegrationが5つまでなので、とりあえず2~3個のプロジェクトではじめる分には問題なし。freeプランのチームをどんどん作っていけば、導入するプロジェクトが増えても対応できるでしょう。

HipChatも、freeプランでもユーザ数制限がないので、とりあえず始める分には問題なし。integrationの制限もないので、導入するプロジェクトが増えることを気にしなくてもよいのは楽そう。仕事でお金をかけずに広げていけるのはこちらか。

ともあれ、思ったより簡単にこれらの環境を導入できた。チャットを使った開発環境を用意するハードルは大分下がったようで。

## 参考サイト

http://liginc.co.jp/web/programming/other-programming/97710

http://blogs.zealot.co.jp/archives/763

http://www.slideshare.net/giginet/kawaz-hipchat
CentOS7雑感


今更ながら初見だったので、使ってみての雑感。

* GUIインストーラーでのソフトウェアパッケージの選択が大きく変わり、パッケージ一つ一つの選択非選択が不可。実質的に各パッケージに何が含まれているのかがわからない。最小構成でインストールし、必要なものはあとでyumなり何なりで入れるのが無難。
  * ていうかGUIでのCentOSインストールなんて久しぶりにやったけど、GUIの設定とCUIでの設定がどう結びつくのかイマイチ飲み込みきれなくて若干気持ち悪い。。。パッケージの件は特に。。
* ファイルシステムのデフォルトはxfs。
* /etc/sysconfig/network-scripts/配下のインターフェース設定ファイル名が`ifcfg-ethN`から`ifcfg-ensN`に変更。NetworkManager使っていれば直接触ることはないので関係なし。
    * 従来の静的な設定ファイル編集を是としてNetworkManagerを停めるという運用があるみたいだが、新機能への追従を断念する理由ってどこにあるんだろうか。
* ntpdではなくchronydが標準実装になった。特に使用感で変化はない、か？
* runlevelの概念がなくなった、というかsystemdによる設定に変わった。
* NetworkManagerの設定が`nmtui`コマンドによりTUIで行える。個人的には割と好き。CLIが好きであれば`nmcli`で。
CocoaPods で Twitter, Facebook, GoogleAnalytics の SDK を導入する

# はじめに

最近、CocoaPods に対応し始めた大手企業のライブラリ達を調理していきます.
あと個人的に利用しないものもあるのですべてを紹介するわけではなく、例として見てもらえると嬉しいです.
旧形式の Framework が残っている場合はゴリッと消しましょう.

# Podfile

```rb

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

target 'hoge' do
  # Facebook
  pod 'FBSDKCoreKit'
  pod 'FBSDKLoginKit'
  pod 'FBSDKShareKit'
  # Twitter
  pod 'Fabric'
  pod 'TwitterKit'
  pod 'TwitterCore'
  pod 'Crashlytics'
  # GoogleAnalytics
  pod 'GoogleAnalytics'
end
```

だいたいこれで終わりなんだがまだちょっと残っている.

# ちょっとした解説

初期設定というやつかな.
他の実装の仕方は割愛.

## Twitter 

上記の他に

- `pod Digits`
- `pod mopub-ios-sdk`

とかあるが割愛.

### Fabric の API Key & Secret の設定
```bash
"${PODS_ROOT}/Fabric/Fabric.framework/run <Your_API_Key> <Your_Build_Secret>"
```
を **Build Phase** の **Run Script** に記載しないといけない.

### Twitter の API Key & Secret の設定

```objc
#import <Crashlytics/Crashlytics.h>
#import <Fabric/Fabric.h>
#import <TwitterKit/TwitterKit.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [TwitterKit startWithConsumerKey:TWITTER_API_KEY consumerSecret:TWITTER_API_SECRET];
  [Fabric with:@[CrashlyticsKit, TwitterKit]];
}
```

### Info.plist

**Fabric** とかいう Key が知らないうちに設定されていたりするかもしれないし、設定しないといけないかもしれない（未確認）.

## Facebook

### Info.plist

- **URL types** -> **Item 0** -> **URL Schemes** に `fbXXXXXXXXXX`
- **FacebookAppID** に XXXXXXXXXX 

を確か設定する必要がある.
コード上で設定する方法は知らない.

### 設定

```objc
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
#import <FBSDKShareKit/FBSDKShareKit.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [FBSDKSettings setAppID:FACEBOOK_APP_ID];
  [FBSDKSettings setDisplayName:FACEBOOK_DISPLAYNAME];
}
```

## GoogleAnalytics

### 設定

```objc 
#import <GoogleAnalytics/GAI.h>
#import <GoogleAnalytics/GAITracker.h>
#import <GoogleAnalytics/GAITrackedViewController.h>
#import <GoogleAnalytics/GAIDictionaryBuilder.h>
#import <GoogleAnalytics/GAIFields.h>
#import <GoogleAnalytics/GAILogger.h>

// 面倒なので Twitter っぽく #define しちゃう
#define GoogleAnalyticsKit [GAI sharedInstance]

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#if DEBUG
  [GoogleAnalyticsKit setDryRun:YES];
  [[GoogleAnalyticsKit logger] setLogLevel:kGAILogLevelVerbose];
#endif
  [GoogleAnalyticsKit trackerWithTrackingId:GOOGLE_ANALYTICS_ID];
}
```

# 注意

- `Facebook-iOS-SDK` から `FBSDKCoreKit`, `FBSDKLoginKit`, `FBSDKShareKit` に変更されてます.

- `GoogleAnalytics-iOS-SDK` から `GoogleAnalytics` に変更されてます.

- Twitter の Fabric は謎のユーザーの Github へ飛ぶリンクがあるが気にしないでおこう.
  [CocoaPods/Specs](https://github.com/CocoaPods/Specs/blob/master/Specs/Fabric/1.2.8/Fabric.podspec.json) を見る限り問題なさそう.

# LINK

- [Install a Google SDK using CocoaPods   |   Google APIs for iOS   |   Google Developers](https://developers.google.com/ios/cocoapods?hl=ja)
- [Manage Fabric with CocoaPods — Fabric iOS latest documentation](http://docs.fabric.io/ios/fabric/cocoapods.html)
- [facebook/facebook-ios-sdk](https://github.com/facebook/facebook-ios-sdk)
MacOSでのbash-completion

`~/.ssh/config` とかに書いたものがうまく補完されないなと思ったら、`bash-completion` がインストールされてなかった。

brewでちゃんとインストールすると、解決。

```bash
$ brew install bash-completion
```

ただ、`~/.bash_profile` で読み込ませる必要はある。

```bash:~/.bash_profile
# Bash completion
if [ -f `brew --prefix`/etc/bash_completion ]; then
  . `brew --prefix`/etc/bash_completion
fi
```
SDWebImage使って認証ヘッダが必要な画像を取得する

## やりたいこと

GETリクエストを投げると、画像データが返却されるAPIがある。
ただし、リクエストヘッダに下記のような認証用トークンが必要。
```
X-Authorization: Token XXX
```

SDWebImage 3.7.3 を使って、出来るだけ簡単に実装したかった。

## やったこと

```
#import <SDWebImage/UIImageView+WebCache.h>
#import <SDWebImage/SDWebImageDownloader.h>

(略)

SDWebImageDownloader *downloader = [SDWebImageDownloader sharedDownloader];
downloader.headersFilter = ^(NSURL *url, NSDictionary *headers) {
    if ([url.host isEqualToString:@"XXX.com"]) {
        return headers;
    }
    return @{};
};
[downloader setValue:@"Token XXX" forHTTPHeaderField:@"X-Authorization"];

NSURL *url = [NSURL URLWithString:@"https://XXX.com/api/photos/YYY"];
[self.image sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
    NSLog(@"error = %@", error);
}];
```

通常通り`sd_setImageWithURL`を呼ぶが、その前に`SDWebImageDownloader`のシングルトンインスタンスに対して`setValue:forHTTPHeaderField` を呼ぶ。それだけ。
ただし、シングルトンなので、これ以降`sd_setImageWithURL`呼ぶ度に認証ヘッダが付いてしまう。
特定のドメインだけに認証ヘッダが付くように、`headersFilter`でフィルタリングする。
[このへん](https://github.com/rs/SDWebImage/blob/2ee4bfe24b0a50a15b342f2132232cddb366dc52/SDWebImage/SDWebImageDownloader.m#L125) を見てもらえれば、何が起こるかわかりやすいと思う。

## 問題点
今回は、特定のドメインだけ認証ヘッダが必要、他は不要という形だったので、これで良かった。
各ドメインごとにそれぞれのヘッダを付けようと思うと、`headersFilter`の中で、引数の`headers`を無視して`NSDictionary`を作らないといけないかも。
AWS EC2 Amazon LinuxにApache 2.4、PHP5.5、最新のMySQLをインストールする

MySQLのリポジトリはここでチェック
https://dev.mysql.com/downloads/repo/yum/

Red Hat Enterprise Linux 6 でOK。

```
$ yum remove httpd php mysql-server
$ yum install -y httpd24 php55
$ yum install -y php55-mysqlnd php55-pdo php55-pecl-memcached php55-mbstring php55-pecl-apc php55-gd
$ rpm -ihv http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ yum install -y mysql-server
```

2015/07/24 現在は、
- Apache/2.4.12 (Amazon)
- PHP 5.5.26 (cli)
- 5.6.25 MySQL Community Server (GPL)
がインストールされる。
offsetX, offsetY

[Firefox39でoffsetX, offsetYがサポートされたっぽい](https://developer.mozilla.org/ja/Firefox/Releases/39/Site_Compatibility)のだけど、Firefox38でundefinedだったのでそれをなんとかする必要があってごちゃごちゃ書いた。

```js:Firefox38
function onmousedown(event) {
  event.offsetX;  // undefined
  event.offsetY;  // undefined
}
```

悲しい感じだ( ˘ω˘)

```js:babel/es6
let element = jQuery(targetElement),
    offset = element.offset();

let {
  offsetX = event.pageX - offset.left,
  offsetY = event.pageY - offset.top,
} = event;
```

```js:es5
var element = jQuery(targetElement),
    offset = element.offset();

var offsetX = event.offsetX || event.pageX - offset.left,
    offsetY = event.offsetY || event.pageY - offset.top;
```

こんな感じで多分いいっぽい。
「特定のインターフェイスを実装した Class クラス」をジェネリクスで表現したい



オブジェクトマッピングを実現するロジックを書いていたりすると `Class` クラスのインスタンスを扱うことがあります。
その `Class` に何かしらの条件を設けたいということもよくあります。

折角Javaを使っているのだから、型検査時に不正な値を弾くことができるとステキですよね。

# 実現したいこと

```java
// 重要なインターフェイス！
interface MetaSyntacticValiable {}

class Hoge implements MetaSyntacticValiable {}
class Fuga implements MetaSyntacticValiable {}

// MetaSyntacticValiable とは無関係なクラス
class UnrelatedToHogeOrSomething {}

（中略）

someMethodUsingClassClass(Hoge.class);    // OK
someMethodUsingClassClass(Fuga.class);    // OK
someMethodUsingClassClass(UnrelatedToHogeOrSomething.class);    // NG！ そしてNGであることを型検査で教えて欲しい
```

# 解決方法

```java

public void someMethodUsingClassClass(Class<? extends MetaSyntacticValiable> klass) {

...

}
```

**`Class<? extends MetaSyntacticValiable>`** がキモでした。

`T.class` の型が `Class<T>` なので、`Class<?>` のワイルドカードに条件を加えてやることで、任意のインターフェイスを継承したクラスの `Class` インスタンスのみを代入する事ができます。

インターフェイスを extends する…というのがどうにももどかしいですが、[こちらの stackoverflow の回答](http://stackoverflow.com/a/976458)によると、「ジェネリクスの文脈においては extends も implements も変わらない」のだそうで。
（ただしジェネリクスの制約で使えるのは `extends` と `super` のみ）

# もっと型の条件を増やしたいときは？

残念ながら以下の書き方はできません。
条件に使えるのは一つの型だけのようです。

```java
// コンパイル通らない
Class<? extends InterfaceOne, InterfaceTwo>
```

「それでも両方のインターフェイスを継承したクラスに限定したいんだ！」という場合は、一つのインターフェイスに統合する必要があります。

```java
interface InterfaceOnePlusTwo extends InterfaceOne, InterfaceTwo {}

（中略）

// これはコンパイル通る
Class<? extends InterfaceOnePlusTwo>
```

ただし、 統合前のインターフェイスを個別に implements したクラスは受け付けなくなります。

```java
void methodUsingClassClass(Class<? extends InterfaceOnePlusTwo> klass) { ... }


// Class<? extends InterfaceOnePlusTwo> ではない！
class ForArgumentOne implements InterfaceOne, InterfaceTwo {}

// よってNG.
methodUsingClassClass(ForArgumentOne.class);



// こちらは Class<? extends InterfaceOnePlusTwo>
class ForArgumentTwo implements InterfaceOnePlusTwo {}

// なのでOK.
methodUsingClassClass(ForArgumentTwo.class);
```

別にこれくらい受け付けてくれたって良いじゃないか…

# 参考
* [Java generics - why is “extends T” allowed but not “implements T”?](http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed-but-not-implements-t)
* [Java の理論と実践: Generics のワイルドカードを使いこなす、第 2 回](http://www.ibm.com/developerworks/jp/java/library/j-jtp07018.html)
* https://docs.oracle.com/javase/jp/6/api/java/lang/Class.html
Firefoxのプロファイルを操作する

とりあえずFirefoxをダウンロードしておく

ターミナルから

```bash
$ ~/Desktop/Firefox.app/Contents/MacOS/firefox-bin -P
```

もしくは

```bash
$ ~/Desktop/Firefox.app/Contents/MacOS/firefox-bin -ProfileManager
```

でプロファイルマネージャが起動する

というのがここに書いてある

[プロファイルマネージャを使用して、Firefox のプロファイルを作成または削除する](https://support.mozilla.org/ja/kb/profile-manager-create-and-remove-firefox-profiles)
すでに構築済みのRDS(PostgreSQL)で日本語ソートがおかしい場合のmigration


## 起きた事象

AWSのElastic Beanstalkで構築したRDS(PostgreSQL)で、日本語のソートがおかしいことに気づいた。
レコードにはひらがなが入っているのに、アルファベットに変換してソートされたような挙動になっていた。

## 調査

どうやらよくあることらしく、COLLATEの設定によるものらしい。

```psql
ebdb=> SHOW LC_COLLATE;
 lc_collate  
-------------
 en_US.UTF-8
(1 行)
```

## 対応
DBは本番環境ですでに動いており、このカラムのみをソートにつかっているため、カラムのcollate設定をmigrationで変更することにした。

```db/migrate/20150724062401_change_kana_collate_to_users.rb
class ChangeKanaCollateToUsers < ActiveRecord::Migration
  def change
    execute 'alter table users alter COLUMN kana type varchar(255) collate "ja_JP.utf8";'
  end
end
```

あとはいつもの通り、migrateするだけ。(`git aws.push`で自動適用される)


## テスト

開発環境では、デフォルトが`ja_JP.utf8`になっていたので、ソートに問題は起きていなかった。
上記のmigrationスクリプトが正常に動作することを確認するため、事前に手動で上記のカラムのcollate設定を変更した。

```psql
> alter table users alter COLUMN kana type varchar(255) collate "en_US.UTF8";
```

この上で、migrateコマンドが正常に動作することを確認した。

```shell
$ rake db:migrate
```
PermGen spaceが起きた時はヒープを増やす

AndroidでKotlinとかビルドするとメモリ足りなくなって、

```shell
$ ./gradlew assembleDebug --info --stacktrace
...
Exception in thread "Periodic tasks thread" java.lang.OutOfMemoryError: PermGen space
...
```

みたいなエラーが出る。
こんな時はgradleの設定にメモリを足す設定を追加.

```
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m
```

daemon化もしとくとビルド早くてオススメ。
kotlinでのラムダ式・メソッド渡し


書き方のサンプルがとても少ないのでメモ
ラムダ式の書き方は{}とfunの2種類あり、用途に応じて使い分ける必要が有る、気をつけろ!

# 参考URL
http://codeofrob.com/entries/looking-at-kotlin---fun-with-functions.html

## いろいろなパターン
```kotlin:hoge.kt

//戻り値が無い場合はvoidじゃなくてUnit
fun hoge(method1:()->Unit,
         method2:(String,String)->String) : ()->Unit
{
    //使い方
    method1()
    val str = method2("aaa","cccc")

    //メソッド内での定義、funを使う
    val method3 = fun(n: Int) :Int { return n * 2 }
    val method4 = fun(){print("Hello どうも 僕はここにいる")}

    //メソッド内での定義、{でも良い、でもその場合は型を指定しておく必要が有る}
    val method5:(String,String)->String =  {s1,s2 -> "hoge"}

    //メソッドにメソッドを渡す、書き方は2通り
    val method6 = hoge(
            {->print("Hello どうも 僕はここにいる")},
            {s1,s2 -> "hoge"})

    val method7 = hoge(
            fun(){print("Hello どうも 僕はここにいる")},
            fun(s1:String, s2:String) :String { return "hoge" })
    return method4
}
```
jQueryを用いた画像のクロスフェード処理

jQuery使って、background-imageをanimateで変更すればできるやろー、ぐらいに思っていたのだけどどうやらできない模様。
なので画像をあらかじめ2枚用意しておき、透過率を交互に変えることによりクロスフェードを実現する。

# サンプルソース

```js:JavaScript
$(function(){
  var CHANGE_TIME  = 3000; // 次の画像に切り替わるまでの時間(ms)
  var ANIMATE_TIME = 1000; // フェードアニメーションの時間(ms)
  var images = ['test01.jpg','test02.jpg','test03.jpg']; // 画像配列
  var index = 0;
  function crossfade_image() {
    // 現在アクティブな画像をフェードアウトする
    $("img.active").animate({'opacity': 0}, ANIMATE_TIME, "linear", function(){
      // アクティブな画像のフェードアウト処理完了時
      // 非アクティブだった画像にactiveクラスを追加し、アクティブな画像に設定する
      $('img:not(".active")').addClass('active');
      // アクティブだった画像のsrc属性を次の画像ファイルへ切り替え、非アクティブな画像に設定する
      $(this).attr('src', images[index % images.length]).removeClass('active');
      index++;
    });
    // 現在非アクティブな画像をフェードインする
    $('img:not(".active")').animate({'opacity': 1.0}, ANIMATE_TIME);
    setTimeout(crossfade_image, CHANGE_TIME);
  }
  // bodyにimgタグを埋め込む
  $("body")
    .append($("<img>").attr("src", images[index++]).addClass("active")) // 初期表示で1枚目の画像をアクティブ画像として設定する
    .append($("<img>").attr("src", images[index++]).css({'opacity': 0})); // 初期表示で2枚目の画像を透過率0(透明≒非表示)の非アクティブな画像として設定する
  setTimeout(crossfade_image, CHANGE_TIME);
});
```

```css:CSS
img {
  position: absolute;
  top: 0;
  left: 0;
}
```

# サンプル

* http://vivid.blue/
プログラマのためのDocker超入門 06.Dockerのよさ（後編）

　
![docker.png](https://qiita-image-store.s3.amazonaws.com/0/66457/da2303a9-e25a-8035-3e5f-e5692ef96383.png)

# 前提

`インフラ？やっといたほうがいいかもなぁ`な方への記事です。

# 過去記事であがった未解決な課題

前回 [05.Dockerのよさ（中編）](/pottava/items/5b101cbae8eae4754b3e)まで解決しなかった残課題です。
あと少し・・

第2回の[構成管理](/pottava/items/5b386a952bf1d26ea387)では

* OSによっては構成管理が期待通りに動かない

第3回の[クラウド](/pottava/items/3d75477b467d93de8784)では

* サーバスペックは複数種類からの選択で、それでは過剰もしくは不足
* ポータビリティが下がるベンダーロックインの心配
* サーバ単位でDisposable Componentsするのは時間的金銭的に非効率

# Dockerとはなにか

引き続き、[これ](/pottava/items/50b90403b895742467dc#docker%E3%81%A8%E3%81%AF%E3%81%AA%E3%81%AB%E3%81%8B)の 6以降の詳細をみていきましょう。

## 6.1 CPUやメモリに上限を設け、リソース管理できる

サービスが、同じサーバに同居している別のサービスによって
CPU、メモリが食い荒らされて落ちたら悲しくなりますよね。

そこで Dockerです。Dockerコンテナは、起動時に、中で動く
プロセスが使える CPUやメモリに制約をかけることができます。

* メモリ、仮想メモリそれぞれの利用上限を指定[^1]
* ちなみに内部で Out of Memoryエラーが起こるとプロセスは killされます[^2]
* CPU利用時間をコンテナ同士、相対値で指定[^3]
* または、一定時間あたりの割り当て時間として利用上限を指定[^4]

設定はとても簡単で、

```bash:リスト
$ docker run -it -m 300M ubuntu:14.04 /bin/bash
$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash
```

`-m`、`-c`、`--cpu-period`などのオプションをつけてコンテナを起動するだけです。
リストの下の例だと、CPUコアが 1つだとして、50msごとにその 50%まで使えます。

## 6.2 コンテナをどこで起動するか問題

もしすべてのアプリケーションで必要な CPUやメモリが把握できたなら
6.1の機能を使うことでお互いを安全に稼働させることができますが、
同時にもうひとつ Dockerならではのよさが生まれます。

> ・サーバスペックは複数種類からの選択で、それでは過剰もしくは不足

今の時代スペックが足りないことまずないですし、過剰なケースも少ないですが
不測の事態に備えて少し余力のある構成にすることはあると思います。

そんな時、とはいえ、リソースは無駄なく効率的に使いたいですよね！！

Dockerを [Apache Mesos](http://mesos.apache.org/)や [Amazon ECS](http://aws.amazon.com/jp/ecs/)などと組み合わせれば
クラスタ[^5]内からリソースに余力があるサーバを見つけ出し、
そこでコンテナを起動する、といったことが実現できます！
便利そうですね :laughing: 

加えて、

> ・サーバ単位でDisposable Componentsするのは時間的金銭的に非効率

Dockerは起動も停止も一瞬なうえ、同じサーバ上でバージョン違いの
アプリケーションを同時に起動するといったことも簡単にできるため
[Disposable Components](http://www.publickey1.jp/blog/14/immutable_infrastructure.html)にはぴったりです！

## 7. 大手OS、クラウド各社がサポートを表明

Microsoftなどの サーバOS開発会社、AWSや Googleなどクラウド各社が
Dockerそのものや、周辺の技術スタックをサポートする表明をしています。

クラウド各社で Dockerを動かすための機能が追加されていくほど

> ・ポータビリティが下がるベンダーロックインの心配

がなくなります。
なぜなら、自分のアプリを Dockerイメージにさえできれば
どこのクラウドを使っても同じ挙動をしてくれることが保証されるためです。

また、

> ・OSによっては構成管理が期待通りに動かない

構成管理ツールそのものはその実行が OSによって制約を受けましたが、
いったん Dockerイメージにしてしまえば、ほとんどの新しい OSで
コンテナとしてそれを動かすことができるようになっています。

VitualBoxがあればもちろん Windowsでも動きますし
開発環境として、開発者間でそれが共有できれば最高ですね！

# 今回のまとめ

[前編](/pottava/items/50b90403b895742467dc)・[中編](/pottava/items/5b101cbae8eae4754b3e)に続いて長くなりましたが、最初に提示した
`仮想化`、`構成管理ツール`、`クラウド`のもつ課題を随分解決できました。

Dockerを使えば、開発やそのリリースがもっと楽になるかもしれません。
本番環境での利用事例も、最近は日本でも出始めたように思います。
ぜひみなさんも実際に使い始めてみてください！

次回からは、実際にどう使っているかをご紹介しようと思います。

　
[^1]: 仮想メモリには上限を設けない、という設定も可能です
[^2]: デフォルト動作。オフにすることもできますが、メモリ上限も設定していない場合、ホストのメモリを使い切り、ホスト側のプロセスに影響がでる可能性があります。
[^3]: Aが 1024、B・Cが 512なら、Aは 50%、B・Cは 25%の CPU時間を消費します
[^4]: CPU CFSの挙動は、[ここ](https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt)で確認できます
[^5]: 複数のコンピュータをひとまとまりにしたもの