OmniAICreator/Qiita-1.07M huggingface dataset:
【連載01】103.Vagrantを利用する為のインストールと設定（Windows側）

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogvagrant)で公開中です。</font></b>

###01.Vagrantダウンロード
[Vagrant](http://www.vagrantup.com/downloads)のサイトにて「WINDOWS」を選択し、ダウンロードを実行
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/38af47b3-d5c8-5f3d-b260-e9154575675b.png)

###02.Vagrantインストール
- インストーラを起動し、「Next」押下
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/f2c3de95-4385-3aa4-5944-849fe2ec6f8e.png)


- License Agreementにチェックし、「Next」押下
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/d25cbd5a-8f1d-a364-320e-a860405f943b.png)


- インストールディレクトリ設定画面で「Next」押下
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/e36c4c72-c096-fe9c-8e40-6f0ec21b46a8.png)


- 「Install」押下でVagrantのインストールを開始
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/674398e2-5f4a-b422-59e1-ab508eac97d6.png)


- 完了画面にて「Finish」押下
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/438732a7-231f-144c-07b4-8f36b82c7c83.png)


- ポップアップにて「Yes」を押下し、再起動
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/d1eb23f2-c2af-4494-99ff-dfb5818c27ec.png)

以上で、Windows側のVagrantインストールは完了です。


次回は「[Vagrantを利用する為のインストールと設定（Linux側【VirtualBox内】）](http://qiita.com/CsFactoryitter/items/bc421afac915bc41af0a)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
Circle CIで Android アプリを parallel buildして OOMと戦う

CircleCIで Androidアプリも楽ちんにビルドできるのはいいのだけど、調子に乗って Flavorを増やしていったりすると OOMで殺されがちです。ヒープとかを頑張ってチューンするのにつかれた自分は金にモノを言わせて 3つのコンテナを使って並列ビルドするようにしました。

# CircleCIではコンテナごとに 4GiBつかえる!
つまりコンテナを増やして仕事を分割すれば OOMを気にすることなく高速にビルドができるのです。実際はすべてのコンテナでしなきゃいけない仕事があったりするので単純にスケールするものでもないのでしょうが、それでも自分の環境では十分効果が上がりました。

# やったこと
仕事でやったことなので repositoryを公開はできませんが概略を書きます:

## containerごとに buildを分割
testステージ用の buildスクリプトをつくり、そこで `$CIRCLE_NODE_INDEX`にしたがって処理を振り分けるコードを書きました。以下の様な感じです:

```
case $CIRCLE_NODE_INDEX in
    0)
        TERM=dumb ./gradlew assembleFoo testFoo{Debug,Release}UnitTest  -PdisablePreDex
        find app/build/test-results/* -type f -name '*.xml' -exec cp {} $CIRCLE_TEST_REPORTS \;
        ;;
    1)
        TERM=dumb ./gradlew assembleBar testBar{Debug,Release}UnitTest -PdisablePreDex
        find app/build/test-results/* -type f -name '*.xml' -exec cp {} $CIRCLE_TEST_REPORTS \;
        ;;
    2)
        # Instrumentation test
        
        echo no | android create avd --name emu --target android-15 --abi armeabi-v7a
        nohup bash -c "emulator @emu -no-window &"
        nohup bash -c "adb logcat > app/build/outputs/logcat.txt &"

        TERM=dumb ./gradlew connectedFooDebugAndroidTest -PdisablePreDex

        find app/build/outputs/androidTest-results/connected -type f -name '*.xml' -exec cp {} $CIRCLE_TEST_REPORTS \;
        ;;
esac
```
コンテナ #0と #1は、それぞれの flavorの APKをつくり Unit testを通します。
コンテナ #2では、Foo flavorでだけで instrumentation testを走らせます。
もう一つコンテナを増やして Bar flavorでも instrumentation test走らせられますが、それはケチってます。

あ、あと上の buildでは `wait_for_emulator` 的な処理を gradleの中でやっています。並列ビルドにしたからといってその待ちが必要なくなるわけではないのでご注意を。

## なぜか最新の data binding libraryが入ってなかったので取得
あと、なぜか並列ビルドすると data binding libraryが見つからず buildが failしました。CircleCIのサポートに聞いてみたのですが、まだちゃんと返事をもらってません。並列用だとイメージが違ったりするのでしょうか?

そこで dependenciesステージで強引にもってくる workaroundを入れました:

```circle.yml
dependencies:
  override:
    - ./script/load-dependencies.sh
```

```load-dependencies.sh
#!/bin/bash -e

echo install extra-android-m2repository
echo y | android update sdk --no-ui --all --filter 'extra-android-m2repository'
```
こんな感じで強引に持ってきてますが、1分ぐらい余計に時間がかかります。何もしなくてもいいようにしたいものです。

## まとめ
以上のような変更でビルドを走らせることにより out of memoryを回避できています。おまけに、ビルド時間も短くなりました。22分ぐらいが 14分ぐらいに。1/3になってないのは、すべてのコンテナでやる仕事がばかにならないからですね。

しかし、data binding libraryが見つからないとか、Androidで並列ビルドしてる人が少ないせいで地雷を踏んでしまったのでしょうか。みなさんも試してみていっしょに地雷を踏んでもらうことを期待します。
ELB+nginx構成でhttpをhttpsにリダイレクトする

`http_x_forwarded_prot` を見てhttpならhttpsにリダイレクトする方法が一般的なのかな？
nginxのリッスンポートをもう一つ開けてELBのリスナーの設定変更でもう少し簡単に出来ないかと試してみた。

### ELBのリスナーの設定

* 80を81に流す
* インスタンスの80ポートへはELBからヘルスチェックが来るのでいじらないようにした

|ロードバランサーのプロトコル|ロードバランサーのポート|インスタンスのプロトコル|インスタンスのポート|
|:--|:--|:--|:--|
|HTTP|80|HTTP|81|
|HTTPS|443|HTTP|80|

### nginxの設定
* /etc/nginx/conf.d/virtual.conf に以下を追加
* 81に来たリクエストはhttpsに問答無用でリダイレクトする
* `if ($http_x_forwarded_proto != 'https') {...`の判定が無いのですっきり

```
server {
  listen 81;
  rewrite ^ https://$host$request_uri permanent;
}
```

### apacheの場合
* apacheでも必要になったので追記

```
Listen 81
<VirtualHost *:81>
  <ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  </ifModule>
</VirtualHost>
```
サイト内に詳細度の高いエリアが存在する場合のコンポーネントの書き方

CSSには「スコープを切ると詳細度が増す」という厄介な問題が存在しているので、その対処方法について書きたいと思います。

## スコープを切ると詳細度が増す例

記事系のサイトでありがちだと思いますが、

```css:CSS
.entry-body h2 { ... }
.entry-body h3 { ... }
.entry-body li { ... }
```

これらは詳細度が`0.1.1`になっています。

## 問題となるコンポーネント

こちらもありがちなコンポーネントの例ですが、

```html:HTML
<div class="your-component">
  <h2 class="your-component__title"> ... </h2>
  <ul class="your-component__items">
    <li class="your-component__item"> ... </li>
    <li class="your-component__item"> ... </li>
  </ul>
</div>
```

```css:CSS
.your-component { ... }
.your-component__title { ... }
.your-component__items { ... }
.your-component__item { ... }
```

これらは詳細度が`0.1.0`なので、先ほどのスコープ内に配置されると衝突して厄介なことに。

## 詳細度が高いエリアにも対応できるコンポーネントの書き方

サポートブラウザがIE9以降なら、こう書けます。[^1]

[^1]: IE8もサポートしたい場合は、`:root`のところを`html body`にすれば`0.1.1`に勝てます。

```sass:Stylus_or_Sass
.your-component

  :root &
    // ここに先頭要素のスタイルを記述

  :root &--mod
    // modifierがある場合

  & &__items
    // ここに子孫要素のスタイルを記述

  & &__item
    // ここに子孫要素のスタイルを記述

  &--mod &__item
    // modifierがある場合

  &--mod &--mod__item
    // modifier専用の子孫要素がある場合
```

詳細度はどれも`0.2.0`あるので、常にコンポーネント側が主導権を握れます。

おしまい

## おまけ

[morph.css](https://github.com/internets-inc/morph.css)という、ちょっと斜め上を行くリセットCSSを作りました。

```html:HTML
<div clas="your-component">
  <ul class="your-component__items div">
    <li class="your-component__item div">
      <a href="#" class="your-component__link span">

      </a>
    </li>
  </ul>
</div>
```

コンポーネントをセマンティックタグでガシガシ書いても、`.div`または`.span`で即時に打ち消すことができます。

配布時の詳細度は`0.1.0`ですが、Stylusの利用で`0.2.0`に格上げできます。

```stylus:Stylus
:root
  @import "/path/to/bower_components/morph.css/src/morph"
```

- [README](https://github.com/internets-inc/morph.css/blob/master/README.md)
- [Test](http://internets-inc.github.io/morph.css/test/level-1.html)

以上、告知でした
Bash で subshell 環境で実行される場合

なので、

```shell-session
$(HOGE=piyo; echo hello)
echo $HOGE
```
とかやっても、`piyo` は表示されない。

もっというと、subshell がで実行される shell の機能は、次のケースであるとのこと。

* `()`によるグルーピング
* コマンド置換
* 非同期実行の実行環境

その記述自体は、Bash のマニュアルで発見することができて、[コマンド実行環境](https://www.gnu.org/software/bash/manual/html_node/Command-Execution-Environment.html) の節に書いてある。見つけにくいけど。

---

追記@2016/03/12

posix においても、非同期実行部分は、丸々サブシェル環境に送られる。

参考: [posix の shell language, async list](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_03_02)

だから

```shell-session
for i in 1 2 3; do echo $i; done &
```

みたいなことができる。(for 分が丸々、 subshell に送られているっぽい。)
このシェルから見た、サブシェルに送られたプロセスは、丸々一つのジョブになっている。
カラム追加でデータベースに反映されない時の対処法

データベースでSQLを使用しているのですが、`rails g migration`でカラム追加、`rake db:migrate`でmigrationスクリプトを作成したのですが、データベースに反映されませんでした。以下の操作を行ったら解決しました。
データベースソフトの仕様？の問題のようです。
SQLproを使用。
http://www.sqlitepro.com/
#①サーバーを一度落としてみる
`control`+`C`でサーバーを落とす
#②SQLPROを終了してから、再度立ち上げる
![kobito.1451399393.715361.png](https://qiita-image-store.s3.amazonaws.com/0/93394/35b5e6f6-2d63-2841-5428-c2ac428e616c.png "kobito.1451399393.715361.png")
画像の`SQLPro for SQLite Read-only`をクリックして`Quit SQLPro for SQLite`をクリックしてソフトを終了する。そして再度立ち上げる。
mac にImageMagickをインストールし、convertコマンドで画像を縮小する。


## 内容
ImageMagickのconvertコマンドを使用し、大量にある大きな画像ファイルを、ホームページ用に小さい画像に変換する。
[ImageMagick: Convert, Edit, Or Compose Bitmap Images](http://www.imagemagick.org/script/index.php)
[ImageMagick: Tools (how to use ImageMagick)](http://www.imagemagick.org/script/command-line-tools.php)


## 環境

今回はmacで作業を実施する。
▼ macのバージョン

``` bash:
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.1
BuildVersion:	15B42
```


## 手順
###1. macにImageMagickをインストール

brewを使用してインストール。

▼ コマンド

``` bash:
brew install imagemagick
```

###2. 動作確認
動作確認用の画像ファイル「testimg.png」を用意。
以下のコマンドで、50%と70%に縮小した画像ファイルを作成できることを確認する。

▼ コマンド

``` bash:
cd <testimg.pngファイルを格納しているディレクトリ>
# 画像を50%に縮小
convert -geometry 50% testimg.png testimg.50p.png
# 画像を70%縮小
convert -geometry 70% testimg.png testimg.70p.png
```

###3. 一括処理
ディレクトリにある全てのpngファイルを、70%に縮小する例を記載する。
変換後のファイル名は以下のように"\_70p"を付加する。
testimg.png → testimg **\_70p** .png

▼ スクリプト

``` bash:
cd <画像ファイルを格納しているディレクトリ>
for fname in *.png; do
  newfname=$(echo "${fname}" | sed "s/\.png$/_70p.png/g")
  convert -geometry 70% "${fname}" "${newfname}"
done
```

以上！
[iOS]QuickTime PlayerでiPhoneの画面録画

# iPhone画面録画
画面の録画方法について、ネットサーフィンして見つけた方法。
ios9だし、そろそろプラットフォーム側で対応してそうだと思ったのですが。
## iPhoneアプリで録画
#### 無料アプリ「[Shou](http://douga-tec.com/?p=7831)」
Emu4iOSというサイトから、野良アプリをダウンロードしてインストールです。
脱獄する必要がないため、簡単ですね。
## iPhoneとMacを繋いで録画
#### QuickTime Player
野良ではなく信頼できるアプリで録画できる点が◎
使い方は、[こちら](http://holybea.com/2015/09/06/quicktime-iphone-capture/)
1.iPhoneとMacをUSBで接続
2.QuickTime Playerを起動
3.「ファイル」メニューから「新規ムービー収録」を選択
4.録画ボタン(赤い◉)の横で、録画する画面をiPhoneに切り替え
5.録画ボタン押して、テキトーに操作、録画停止
6.「ファイル」メニューから「保存…」を選択
7.movファイルに名前をつけて保存
簡単です。

ファイルサイズが大きくなる
（簡単な操作で5MBいってしまいました）
「ファイル」メニューから「書き出す」、「480p」を選択して
書き出すと2MBくらいになりました。

## コマンドラインツールで録画
クックパッド開発者さんが投稿していたGIFで保存されるコマンドラインツールが便利そうす
[Swift2で作るコマンドラインツール](http://techlife.cookpad.com/entry/2015/11/09/150248)
自作するのが勉強になってよさげですね。

## あとがき
iPhoneの録画について、初めて調べてみました。
巷にはいろんな方法があるんですねー。
お試しあれ
(メモ) java 標準ライブラリの unmodifiable コレクションラッパについて

Java のフレームワークには、標準で `Collections.unmodifiableCollection` やその亜種(`unmodifiableList`など) が付属している。これは、対象のコレクションを引数にとって、変更不可能なコレクションのビュー(ラッパー)オブジェクトを返す、static メソッド。具体的には、 `get` メソッドなど参照系はそのまま内部のオブジェクトに引き渡し、`add`メソッドなど変更系のメソッドに対しては `UnsupportedOperationException` 例外が投げられる。

戻り値として、 `List` やコレクションを返したいが、 `add` などのコレクションに対する変更操作をやってほしくないような場合で、わざわざ Guava などの Immutable コレクション系を作り直したくないような場合や、 Guava などの便利系ライブラリに頼りたくないコードを記述している場合などに有効。かも。


参考: http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html の unmodifiable 系
underscoreコードリーディング（last）




underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##lastとは



###[underscorejs.orgのlast](http://underscorejs.org/#last)

こんな説明。
>####_.last(array, [n]) 
Returns the last element of an array. Passing n will return the last n elements of the array.

```javascript
_.last([5, 4, 3, 2, 1]);
=> 1

```

------------- 
配列の最後の要素を返す。nが渡された場合は後ろからn個の要素を配列で返す。



###[underscore.last](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L469)

コード的にはこのあたり。


```javascript
  // Get the last element of an array. Passing **n** will return the last N
  // values in the array.
  _.last = function(array, n, guard) {
    if (array == null) return void 0;
    if (n == null || guard) return array[array.length - 1];
    return _.rest(array, Math.max(0, array.length - n));
  };


```

arrayがない場合はvoid 0(undefined)。
bがない場合は配列の一番最後の値。
それらに一致しない場合は_.restにarray.lengthからnひいたものを渡した結果を返す。
_.restは_.initialと同じく内部でsliceをcallしていて、(_.initialが前からn個なのに対して)後ろから引数分の配列を生成して返す。


ソースコードを見てから気づいたけれど、
_.lastも_.firstも_.last([1,2,3])と_.last([1,2,3],1)だと返り値の型が違うので注意が必要
PlatformIO での avr コンパイル時に C++11 を指定する


Arduino 開発で C++11 の機能を使いたいことが時たまある。

2015年12月現在、toolchain-atmelavr に含まれる avr-gcc のバージョンは 4.8.1 なため、C++11 を使うためには明示的にコンパイルオプションで指定する必要がある。

```
$ ~/.platformio/packages/toolchain-atmelavr/bin/avr-gcc --version
avr-gcc (GCC) 4.8.1
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```

PlatformIO では platformio.ini の build_flags か、環境変数の ```PLATFORMIO_BUILD_FLAGS``` で指定してやる。

```plaftormio.ini
build_flags = -std=c++11
```

これで C++11 の指定付きでコンパイルされ、利用できる様になった。
Unknown column 'id.id' in 'where clause'

`find_by(id: 1)`を
あー `find`にしようと思って、

`find(id: 1)`と書き換えると、

> Unknown column 'id.id' in 'where clause'

というエラーが出る。


正しい書き換えは、

`find(1)`


`_by`だけ削ればよいやと思って、編集するとこのエラーになるのである。
眼帯ってかわいいの？

https://paiza.jp/poh/ando
眼帯いらないけど、リボンついてたのでやってみた(´∀｀*)


```csharp:眼帯
using System.Collections.Generic;

public class Hello{
    public static void Main(){
        // 総数
        int n = 0;
        var line = System.Console.ReadLine().Trim();
        if (int.TryParse(line, out n)) { }

        // 持っている巻
        int m = 0;
        line = System.Console.ReadLine().Trim();
        if (int.TryParse(line, out m)) { }

        line = System.Console.ReadLine().Trim();
        string[] s = line.Split(' ');

        if (s.Length != m) throw new System.Exception("持っている巻の入力件数が不正です");

        List<int> mine = new List<int>();
        for (int i = 0; i < s.Length; i++)
            mine.Add(int.Parse(s[i]));

        // 売っている巻
        m = 0;
        line = System.Console.ReadLine().Trim();
        if (int.TryParse(line, out m)) { }

        line = System.Console.ReadLine().Trim();
        s = line.Split(' ');

        if (s.Length != m) throw new System.Exception("売っている巻の入力件数が不正です");

        List<int> buy = new List<int>();
        for (int i = 0; i < s.Length; i++)
        {
            if (!mine.Contains(int.Parse(s[i])))
                buy.Add(int.Parse(s[i]));
        }

        if (buy.Count != 0)
        {
            buy.Sort();
            for (int i = 0; i < buy.Count; i++)
            {
                System.Console.Write(buy[i]);

                if (i != buy.Count - 1)
                System.Console.Write(" ");
            }
        }
        else
            System.Console.Write("None");
    }
}
```
[Rails][Rspec] Routingのテストでformatを対象にする

メモ

```rb
require "rails_helper"

RSpec.describe Api::V2::HogeController, type: :routing do
  describe "routing" do

    it "routes to #mine" do
      expect(:get => "/api/v2/hoges/mine").to route_to("api/v2/bookmarks#mine", format: "json")
    end
.
.
.
```
グラフの連結成分

こんにちは。
グラフの連結成分（[連結グラフ](https://ja.wikipedia.org/wiki/連結グラフ)、[素集合データ構造](https://ja.wikipedia.org/wiki/素集合データ構造)）を求める計算で、"[Python connected components](http://stackoverflow.com/questions/10301000/python-connected-components)" (Stack Overflow) を見つけ、そこのソースをほぼそのまま動かしました。また検算のために networkx による結果と比べました。

![graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/0db94b92-88cc-489b-7da0-69fb5efa35e7.jpeg)

```console
$ ./connected_components.py
graph = {0: [1, 2, 3], 1: [2], 2: [], 3: [4, 6], 4: [], 5: [7], 6: [], 7: []}
[[0, 1, 2, 3, 4, 6], [5, 7]]
True (equal to one derived from networkx)

```

```connected_components.py
#!/usr/bin/env python
from __future__ import print_function

def connected_components(graph):
    seen = set()
    def component(n):
        nodes = set([n])
        while nodes:
            n = nodes.pop()
            seen.add(n)
            nodes |= set(graph[n]) - seen
            yield n
    for n in graph:
        if n not in seen:
            yield component(n)

def print_gen(gen):
    print([list(x) for x in gen])

def check_connected(graph):
    import networkx as nx
    G = nx.Graph()
    G.add_nodes_from(graph.keys())
    for k, v in graph.items():
        for n in v:
            G.add_edge(k, n)
    check = sorted([set(x) for x in nx.connected_components(G)]) == sorted([set(x) for x in connected_components(graph)])
    print(check, "(equal to one derived from networkx)")

# main
graph = {0: [1, 2, 3], 1: [2], 2: [], 3: [4, 6], 4: [], 5: [7], 6: [], 7: []}
print("graph =", graph)
print_gen(connected_components(graph))
check_connected(graph)

# graph:
#       0
#     / | \
#    1--2  3
#          | \
#          4  6
#    5--7
```

- 検算判定部が少し稚拙で恐縮です。
linuxで妙に肥大化するファイルたち

- /var/lib/mlocate/mlocate.db
  ファイルが大量にある場合によく大きくなる
- /var/lib/jenkins
  jobが溜まっていると大きくなる
- /var/log
  ログローテーションしてないのがあると大きくなる
Rails | `bin_path': can't find gem bundler に対処する


# 問題

ruby のバージョンを上げると、bundler が動かなくなった。( rbenv + .ruby-versions )

`$ bundle install`

```
/Users/yinaura/.rbenv/versions/2.2.4/lib/ruby/2.2.0/rubygems.rb:243:in
 `bin_path': can't find gem bundler (>= 0) (Gem::GemNotFoundException)
	from /Users/yinaura/projects/project/bin/bundle:4:in `<main>'
```

# 解決

bundler の参照ディレクトリが変わって。gem が見つけられなくなっていた。
なので bundler をインストールし直す。

## bundler の再インストール

`$ gem install bundler`

こうすると ruby のバージョンに応じた bin が出来る。

`.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/bundler-1.11.2/exe/bundle`

## Gem の再インストール

Gem も全部無いので、インストールし直す。

`$ bundle install`

これで動いた。

# 環境

- ruby 2.0.0 => 2.4.4
- Bundler version 1.11.2



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Kaminariを使った時にFlickrみたいな/page のURLにする

Rubyでページング処理をするといえば、Kaminariです。
タイトルの通り「Kaminariを使った時にFlickrみたいな/page のURLにする」方法についてです。

URL例：https://www.flickr.com/photos/matsuhisa/albums/page3

## Kaminariのドキュメントに書いてある通りの方法

```ruby
Rails.application.routes.draw do
  resources :books do
    get 'page:page', :action => :index, :on => :collection
  end

end
```

## Kaminariのドキュメントに書いていない方法

なんらかの理由で、getで記載することが必要な時は、下記のように書くとよかったです。

```ruby
Rails.application.routes.draw do

  # resources を使わない場合の設定
  get 'books', to: 'books#index', as: 'books'
  get 'books/page:page', to: 'books#index'
  get 'books/:id', to: 'books#show', as: 'book'
  get 'books/:id/edit', to: 'books#edit', as: 'edit_book'
  get 'books/new', to: 'books#new', as: 'new_book'

end
```

`rake routes` で確認。

```bash

$ rake routes
   Prefix Verb URI Pattern                Controller#Action
    books GET  /books(.:format)           books#index
          GET  /books/page:page(.:format) books#index
     book GET  /books/:id(.:format)       books#show
edit_book GET  /books/:id/edit(.:format)  books#edit
 new_book GET  /books/new(.:format)       books#new
```

## 注意

ドキュメントに書いていない方法なので、出来なくなる場合が有ります
Play Scala の 標準API（Security trait）でID・パスワード認証と認可機能を実装する


Security traitはScala版Playに標準で入っているものです。詳細は以下のURLを参照ください。

https://www.playframework.com/documentation/2.0.4/ScalaSecurity

また、紹介するサンプルコードは以下においています。

https://github.com/yohei1126/play-scala-auth-sample

Play標準APIでの認証・認可は非常にプリミティブなものしか提供されていないません。OAuthやOpenIDなどに対応する必要が出た場合は、全て自力で実装するのか、既存のライブラリを使うのか検討してみる価値はあると思います。

[How to implement security Authorization using scala and play?](http://stackoverflow.com/questions/27105295/how-to-implement-security-authorization-using-scala-and-play)

# 認証：ID・パスワードの照合

このサンプルではメールアドレスとパスワードでユーザを認証します。loginFormの定義部分で、「UserDAO.validate(User(email, password))」としている箇所で送られてきたメールアドレスとパスワードを持つユーザがDBに登録されているか、確認します。

```
class Application @Inject()(val messagesApi: MessagesApi) extends Controller with Secured with I18nSupport {

  val loginForm = Form(
    tuple(
      "email" -> nonEmptyText,
      "password" -> nonEmptyText
    ) verifying ("Invalid email or password", result => result match {
      case (email, password) => UserDAO.validate(User(email, password))
    })
  )
（省略）
```

メールアドレスとパスワードが正しいものであると確認が取れれば、メールアドレスをセッションに登録します。セッションにメールアドレスが存在することが認証済みの合図とします。ここで、Security.usernameは標準APIです。ランダムなセッション変数名を自動的に生成してくれるため、セッション名を推測できなくする上で役立つと思います。application.confに「session.username」が定義されていれば、セッション名の一部として使われます。

```
  def authenticate = Action { implicit request =>
    request.session.get(Security.username).map { user =>
      Redirect(routes.Application.index).withNewSession.flashing()
    }.getOrElse {
      loginForm.bindFromRequest.fold(
        formWithErrors => BadRequest(views.html.login(formWithErrors)),
        user => Redirect(routes.Application.index).withSession(Security.username -> user._1)
      )
    }
  }
  （省略）
```

# 認可

特定のURLは認証済みの場合にのみアクセスを許可したいとします。そういうケースについては、Action Composition（アクションの合成）という機能を使い、既存のアクションが呼び出される直前に認証関係のアクションを実行することで保護します。以下のwithAuthは認証済みかどうかを確認するアクションです。

```
  def index = withAuth { user => implicit request =>
    Ok(views.html.index(user.email))
  }
```

withAuthは認証・認可関係をまとめたtraitに定義しています。
withUserはセッション変数を元にユーザの情報をDBから取ってきて、アクション内で使う場合のメソッドです。withUserもwithAuthを呼んでいます。

```
trait Secured {
  private def username(request: RequestHeader) = request.session.get(Security.username)

  private def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Application.login)

  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
      Action(request => f(user)(request))
    }
  }
  def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
    UserDAO.findOneByUsername(username).map { user =>
      f(user)(request)
    }.getOrElse(onUnauthorized(request))
  }
}
```

以下のように、アクションにwithUserをかぶせると、内部ではwithAuth→withUser→index2という順番に実行されます。認証できたユーザの情報を最終的に実行したいアクションに渡せます。

```
  def index2 = withUser { user => implicit request =>
    val email = user.email
    Ok(views.html.index2(email))
  }
```
アプリで使うカラーパターンをStoryboardでも定義する

デザイナーから定義されたカラーパターンを
コードで定義するときはUIColorのExtensionに定義したりすると思います。

```swift
extension UIColor {
    class func mainColor() -> UIColor { 
        return UIColor(red:0.1, green:0.1, blue:0.1, alpha:1.0) 
    }
    
    class func linkColor() -> UIColor { 
        return UIColor(red:0.2, green:0.2, blue:0.2, alpha:1.0)
    }
}
```

ただこれだけだとStoryboardで文字色や背景色を設定するときに、値がなんだったかが分からなくなることが多かったので、Storyboardでも色を簡単に設定できるようにします。

#Storyboardで定義する
Storyboardで独自のカラーパターンを定義するには
1.カラーパレットを開く(真ん中のタブ)
![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/107427/0d828d76-230e-3091-fbe2-8dbbd33fa7f5.png)

2.右の歯車→Newしてカラーパレットを追加
![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/107427/79fe044d-284f-5b87-279f-1b684ce5517e.png)

3後は独自にカラーパターンを追加
![pic4.png](https://qiita-image-store.s3.amazonaws.com/0/107427/1163352d-4bff-2024-3b1c-a5288f74b456.png)

これだけで定義完了です！
コードとの色の同期は手動ですが、これでStoryboardでデザインを反映するときにいちいちUIColorを見に行かなくて良くなるのでちょっと楽できます。

#共有する
上記定義を終えていると
~/Library/Colors/
にSampleColor.clrというファイルができているのでこれをgitに上げておけばチームで共有できます。
ArangoDB の T シャツ届いたのでちょっとプロパガンダ

ちょっと前に実施された Survey に回答したところ、本日、[ArangoDB](https://www.arangodb.com) の真新しい T シャツを受け取ったので、謹んでご報告します。

![IMG_20151229_171924.jpg](https://qiita-image-store.s3.amazonaws.com/0/65212/7332ab06-391e-8780-8e67-65eef2a384ac.jpeg)

応募者が少なかったのか、はたまた、本当にラッキーだったのかは不明ですが、思った以上にハイクォリティな T シャツと、手書きのクリスマスカードが同封されていて素直に嬉しいです ;-)

ArangoDB はとてもいいプロダクトだと思うのですが、なかなか人気に火がつかないようで、今回の Survey もなんとか注目を集めようという施策の一環ですね。

あまり語れるほどの経験はないですが、T シャツ貰ってしまったので、ArangoDB についてちょっと触れておきます。

# 特徴

いわゆる一つの NoSQL です。[AQL](https://docs.arangodb.com/Aql/index.html) と呼ばれる専用のクエリー言語が用意されています。AQL では JOIN やトランザクションもサポートしているので、比較的シンプルな業務アプリであれば、移植する場合の敷居は高くないと思います。

また、グラフ関連の API も用意されているので、その手のデータ構造もモデリングすることが可能です。ArangoDB ではこれを「マルチモデル」と呼んでます。サービスが成長するに従ってソーシャル的な要素が招聘され、結果としてグラフ 用の DB が別途必要になる、という流れを見越しているわけです。ArangoDB なら最初から全部入ってるよと。

特筆すべきなのは、[Foxx](https://docs.arangodb.com/Foxx/index.html) と呼ばれるマイクロサービスを構築するための仕組みです。Foxx を使うと JavaScript で Web サービスを記述できます。Foxx アプリからは当然 ArangoDB のデータを直に触ることができるので、ターンアラウンドタイムの面で経済的です。その分、密結合になりますが、そこは開発のスピード感と効率性を求めるのか、パフォーマンスを犠牲にして疎結合で綺麗に分離してロックインを避けたいのか、というトレードオフです。

私のところでは使ってませんが、レプリケーションもサポートしています。

# パフォーマンス

基本メモリに全部乗せなので、速いです。書き込みについては、同期、非同期などオプションを選択できます。定期的に名の知れた NoSQL との[比較テストを実施](https://www.arangodb.com/performance/)しているので、その内容を参考にすると良いでしょう。個人的には、必要にして十分なパフォーマンスを叩き出していると思います。

ただし、Foxx の戻りは結局 JSON なので、コレクションを丸っと返すみたいなことをすれば遅いです。一度に取得する上限を決めて、必要になったら都度取りに行くというありがちな対策が最低限必要になります。

# マイナスポイント

Foxx アプリのデバッグのし辛さにつきます。ローカルに ArangoDB をインストールしてしまえば良いのですが、基本はデプロイして動作確認しての繰り返し。単体テストは外から API 叩くしかなく、内部にブレークポイント置けないのがもの凄くストレスフル。

ここは何とかしてほしいところ。それ以外のところでは、特に不満らしい不満はないです。

# まとめ

- ArangoDB はなかなか良いプロダクト
- 少人数でスピード重視で回さないといけないところにはハマる可能性あり
- 結構頻繁にアップデートされ、よくメンテされている印象
- もっと人気出てもいい（というか来年こそはブレイクする？）
railsで絶対パスと相対パスの使い分け

- viewでは`customer_path`など`相対パス`を用いる
- controllerでは`customer_url`など`絶対パス`を用いる

#railsで出てくるパスとは？そもそも`パス`ってなに？
#パスとは？
pathとは英語で「道・通り道」という意味。
>サイトのURLやファイルはリンクによって互いに結ばれていますが、パスはその情報やファイルがどこにあるのかをたどっていきます。HTMLでは、特定の情報にたどり着くまでのアプローチ方法が2種類あり、それぞれ絶対パスと相対パスと呼びます。
>http://techacademy.jp/magazine/5801

#絶対パスと相対パス
>・絶対パス  absolute path
URLでページを指定して、目的地（情報）がどこにあるのかを確実に伝えます。
・相対パス  relative path
今いる場所（階層）を基準にして、目的地（情報）がどこにあるのかを伝えます。
>>たとえば実際に道案内をするときに、目的地の住所（URL）を教えるのが絶対パスの伝え方。一方、ある地点から道を曲がって道路沿いのつきあたりを右…というように、今いる場所から目的地までの経路を案内するのが相対パスの伝え方になります。
Starting Neo4j Server...WARNING: not changing user

古いバージョンで作ったNeo4jのデータストア上でインスタンスを起動すると、データストアをアップグレードすることを促すメッセージが出力されます。しかし、最近、次のように不可解なメッセージが出力されて、インスタンス起動に失敗するケースが報告されています(Linux community-2.3.1)。このメッセージでは、Stack Overflowをみても全然問題解決に導かれません。


```
$ neo4j start
Starting Neo4j Server...WARNING: not changing user
process [9091]... waiting for server to be ready... Failed to start within 120 seconds.
Neo4j Server may have failed to start, please check the logs.
```

log/console.logを見ると原因と対応策が記されています。データストアが古いから、アップグレードしないと言っています。

```
ERROR Neo4j cannot be started, because the database files require upgrading and upgrades are disabled in configuration. Please set 'allow_store_upgrade' to 'true' in your configuration file and try again.
```

古いデータストア上でNeo4jのインスタンスを起動する時は、「conf/neo4j.properties」の「#allow_store_upgrade=true」をコメントアウトする必要があります。

conf/neo4j.properties

```
#allow_store_upgrade=true
allow_store_upgrade=true
```

従来では、古いバージョンで作ったデータストアでインスタンスを起動しようとすると、次のようなメッセージが表示されていました。

```
Starting Neo4j Server failed: Startup failed due to preflight task [class org.neo4j.server.preflight.PerformUpgradeIfNecessary]: Failed to start Neo4j with an older data store version. To enable automatic upgrade, please set configuration parameter "allow_store_upgrade=true"
```

なぜ、不可解なエラーメッセージが表示されるのかは分かりませんが、困っている方はこの記事に辿りつくことを祈るばかりです。
Capistranoの実行環境の作成方法3


nginxの設定をします
Front1でSSL証明書の作成をします

```bash
sudo openssl req -new -days 365 -x509 -nodes -keyout cert.key -out cert.crt
```

```bash
mv cert.key /etc/nginx
```

```bash
mv cert.crt /etc/nginx
```

```
sudo vi /etc/nginx/conf.d/your_project.conf
```

```your_project.conf
#ここの設定をrailsの設定と合わせる
#unicorn.rbの
#listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
upstream backend-unicorn {
    server unix:/srv/www/your_project/shared/tmp/sockets/unicorn.sock;
}
 
server {
    listen 80;
    server_name test.cn www.test.cn;

    return 301 https://$host$request_uri;
} 

server {
    listen 443 ssl;
    ssl_certificate      /etc/nginx/cert.crt;
    ssl_certificate_key  /etc/nginx/cert.key;
    server_name your_project.com;
    root /srv/www/your_project/current/public;
    #画像,js,cssなどのファイルはnginxが応答する。
    #それ以外は@appでunicornに渡す
    #https://your_project.com/assets/test.jsというリクエストに対しては
    #/srv/www/your_project/current/public/assets/test.jsというファイルが応答する。
    try_files $uri $uri.html $uri/index.html @app;
    access_log /var/log/nginx/your_project_access.log;
    error_log /var/log/nginx/your_project_error.log;
    
    #try_filesからきた応答をここでキャッチする
    #proxy_passでupstreamで定義したbackend-unicornにリクエストを渡す
    location @app {
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X_FORWARDED_PROTO $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://backend-unicorn;
        proxy_redirect off;
    }
    #メンテナンス用の設定
    #maintenance.htmlがある時は503を返す
    if (-f /srv/www/your_project/shared/public/system/maintenance.html) {
        return 503;
    }
    error_page 503 @503;
    location @503 {
        if (-f $request_filename) {
            break;
        }
        rewrite ^(.*)$ /system/maintenance.html break;
    }
    gzip_vary on;
    gzip_static on;
}

```

SELinuxを止める。

```bash
setenforce 0
```

```bash
service nginx start
```

オプション設定

```bash
vi environments/production.rb
```


```production.rb
#静的ファイルはNginxで行うので不要
config.serve_static_assets = false
#Nginxで静的ファイルを見つけるので不要
config.assets.compile = false
```

自分のローカル環境の設定

```bash
sudo vi /etc/hosts
```

Macの場合

```bash
sudo dscacheutil -flushcache
```

Nginxで設定したserver name

```hosts
192.168.43.62 your_project.com
```

```browser
https://your_project.com
```
SinatraのNokogiriテンプレート #とは

Sinatraがサポートするテンプレート、気が付くとすごく増えてますね。

- [始めよう - Sinatra](http://www.sinatrarb.com/intro-ja.html)

ここを見ると、

```
* 利用可能なテンプレート言語
Haml テンプレート
Erb テンプレート
Builder テンプレート
Nokogiri テンプレート
Sass テンプレート
Scss テンプレート
Less テンプレート
Liquid テンプレート
Markdown テンプレート
Textile テンプレート
RDoc テンプレート
AsciiDoc テンプレート
Radius テンプレート
Markaby テンプレート
RABL テンプレート
Slim テンプレート
Creole テンプレート
MediaWiki テンプレート
CoffeeScript テンプレート
Stylus テンプレート
Yajl テンプレート
WLang テンプレート
```

こんなふうに並んでて圧倒されるんですが、さりげなく "Nokogiri" って入ってます。Nokogiriってあの鋸ですよね。不覚にもまったく気がついていませんでした。

- https://github.com/sinatra/sinatra/blob/886b669b123cc5a8f23f0520c7e39958bce432b9/lib/sinatra/base.rb#L733

base.rb にちゃんとある・・・

どんなときに使うのかといえば、これはXMLを生成する時に使うんです。
`options[:default_content_type] = :xml`って書いてあるし。

## 作ってみる

では、簡単にのこぎりTemplateを利用するものを作ってみましょう。

```app.rb
require 'sinatra'
require 'tilt/nokogiri'

get '/' do
  @name = "hosoi"
  @loop = [1,2,3,4]
  nokogiri :index
end
```

テンプレートファイルをこんなふうに書いてみます。ほぼruby DSLそのままですね。

```index.nokogiri
xml.test {
  @loop.each do |x|
    xml.p(@name, "class" => "test_#{x}")
  end
}
```

こうすると、レンダリング結果は以下のようになります。ループが処理され、属性と本体が出力されています。

```xml
<?xml version="1.0"?>
<test>
  <p class="test_1">hosoi</p>
  <p class="test_2">hosoi</p>
  <p class="test_3">hosoi</p>
  <p class="test_4">hosoi</p>
</test>
```

valid!

## まとめ

Nokogiri と聞いて「ああXPathでスクレイピングするライブラリね」と思っていました。本当にすみませんでした。よく見たら[Middlemanとかのテンプレート](https://middlemanapp.com/jp/basics/template_engine_options/)にも名を連ねておりますね。なお、[ちゃんとビルダーが用意されて](http://www.rubydoc.info/github/sparklemotion/nokogiri/Nokogiri/HTML/Builder)いるのでNokogiri DSLではhtmlも生成できるのですが、[NokogiriTemplateクラス](https://github.com/rtomayko/tilt/blob/master/lib/tilt/nokogiri.rb)を見ると残念なことに xml 決め打ちのようです。

Sinatraを使ってレスポンスにXMLを返したいときには、ぜひ Nokogiri テンプレートをご利用ください。

※　なお、検索してみると[Nokogiriでテンプレートエンジンを作っている先人もいる](http://d.hatena.ne.jp/line214/20120317/1332014098)ようです。不明を恥じるばかりです。
DockerMachineでローカルWebアプリ開発


## 前提
* Max OSX
* 「brew cask」インストール済み
* とりあえず検証環境がほしい人向け

## 1. インストール

#### 1.1 brewで、各種ソフトウェアをインストールする

```bash
$ brew install docker
$ brew install docker-machine
$ brew cask install virtualbox
```

## 2. VMを作成する

```
$ docker-machine create -d virtualbox local
```

#### 2.1 VMが作成されたことを確認する

```
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM
local            virtualbox   Running   tcp://192.168.99.102:2376  
```

#### 2.2 VMをアクティベートする

```
$ eval "$(docker-machine env local)"
$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM
local   *        virtualbox   Running   tcp://192.168.99.102:2376 
```

## 3. dockerコンテナを起動する

#### 3.1 コンテナのimageを取り込む

```
$ docker pull ubuntu:trusty
```

#### 3.2 imageが取り込まれたことを確認する

```
$ docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                 trusty              90d5884b1ee0        9 days ago          188 MB
```

#### 3.3 コンテナを起動する

コンテナ内のポートをホスト側に割り当てる。
80(コンテナ) -> 8100(ホスト)

共有ディレクトリを指定する
~/Work/sampleapp(ホスト) -> /docker(コンテナ)

```bash
$ docker run -d --name web -p 8100:80 -v ~/Work/sampleapp:/docker ubuntu:trusty /sbin/init
```

#### 3.4 起動を確認する

```
$ docker ps
CONTAINER ID        IMAGE                          COMMAND               CREATED             STATUS              PORTS                                        NAMES
074ef6fa974b        ubuntu:trusty       "/sbin/init"        2 seconds ago       Up 1 seconds        0.0.0.0:8100->80/tcp   web
```

## 4. コンテナ内にSSHで入る

#### 4.1 VMのIPを確認する

```
$ docker-machine ip local
192.168.99.100
```

#### 4.2 コンテナに入る

```
$ docker exec -it web /bin/bash
```

## 5. httpdを起動

#### 5.1 httpdをインストール

```
$ apt-get update
$ apt-get install -y apache2
```

#### 5.2 共有ディレクトリのシンボリックリンクをDocumentRootに貼る

```
ln -s /docker /var/www/sampleapp
```

#### 5.3 DocumentRootを「/var/www/sampleapp」にする

`割愛`

#### 5.4 httpdを起動

```
$ apachectl start
```

## 6. ホストと共有したページを表示

```
http://192.168.99.100:8100
```
vagrantでrailsのautoloadが効かない

# 結論
二つの課題をクリアしないと解決しませんでした。
1. サーバーのtimezoneがずれてた。
2. GetHostTimeDisabledでホスト、ゲストの時間を同期

ゲストとホストの両方でdateコマンド打てば、ずれてるかどうかわかると思います。

注：ここではrsyncの話はしないです。私はnfsでやっとります。

# [対応1]サーバーのtimezoneがずれてた
サーバーのtimezoneをホストOSと同じJSTにしてあげる
cookbookはこちらを使いました。
https://supermarket.chef.io/cookbooks/timezone_lwrp
他にもtimezone系のはあるので、↑のサイトで探してよしなに選ぶと良いかと。

```name:Cfeffile
cookbook 'timezone_lwrp'
```

```name:Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.add_recipe "timezone_lwrp"

    chef.json = {
      tz: "Asia/Tokyo"
    }
  end
```

# [対応2] GetHostTimeDisabledでホスト、ゲストの時間を同期

```filename:Vagrantfile
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
    # ↑この行とは別に
    # ↓この行を追加する
    vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 0]
  end
```

参考：http://polidog.jp/2014/01/08/vagrant/


# 経緯
ホスト側でソース直したのに反映されず困ってました。
結局、
ファイルのタイムスタンプ的なものが修正によって更新されても、タイムゾーンがずれてるせいでrailsに「更新されてないわ」って思われてたみたいです。
SpreadSheet にてシートの最終更新日時を自動挿入する GoogleAppScript

下記のようにシート毎の最終更新日時が`A1`セルに自動的に挿入されるようになります。 

![image](https://qiita-image-store.s3.amazonaws.com/0/15751/bb894995-22c0-1150-f495-b96a2e146bf3.png)

# やり方

 1. 挿入したいスプレッドシートのメニューから AppScriptの編集画面を開く
  ![image](https://qiita-image-store.s3.amazonaws.com/0/15751/068cd266-c1fc-9d99-c219-cde85e3d8405.png)  
  　
  
 2. 下記AppScriptを設定する
  
    ```js:Code.gs
    function insertLastUpdated() {
      SpreadsheetApp.getActiveSheet()
        .getRange('A1') //挿入したいセル
        .setValue(
          '最終更新: ' + Utilities.formatDate(new Date(), 'JST', 'yyyy年MM月dd日HH時mm分ss秒') + //日時フォーマット
          ' by ' + Session.getActiveUser().getEmail() //更新したユーザーアカウント
        )
        .setFontColor('red'); //文字色
    }
  ``` 
  
 3. スプレッドシートのトリガーを設定する
  ![image](https://qiita-image-store.s3.amazonaws.com/0/15751/f8bf440f-b702-e72e-ed12-26bd86ca4098.png) 
  　
  ![image](https://qiita-image-store.s3.amazonaws.com/0/15751/c95d93f9-67b7-3ca2-0983-5958876d153b.png)
カーネルスレッド生成&ユーザーモードプロセス生成

# 概要
[カーネル探検(rest_init()からプロセス番号1生成まで)](http://qiita.com/saikoro-steak/items/e8121afdd5f294e14c43)
の続きのメモ。詳細はリンク元を見たほうがよい。

# カーネルスレッド生成
## kernel_thread()
カーネルスレッドを生成する入口。引数にスレッドの用の値を渡している？なのでプロセスというよりスレッドを生成する。

### kernel_thread()で何している
* do_fork()
  - task_strcutのコピーを作り実行可能プロセスのリストに登録する。**プロセスディスクリプタからポインタしている各資源は親と共有している。**
  - **EAX、SP、IPは子プロセス独自のもの。**
  - IPはkernel_thread_helperを設定
     * カーネルスレッド関数をcallするやつ。カーネルスレッドの処理が終わったらここに戻りdo_exitする。
  
カーネルスレッド生成する際は**execはしていないので**、ユーザーモードにならずカーネルスレッドとして生成される。親と各資源を共有してスタックやIPなどは別の箇所を指しているスレッド。

# kernel_init()について
  - kernel_thread()で生成されたカーネルスレッド。
  - initramfsを使っている場合はramfsの/initを起動させる。

## /init
* kernel_init()の中でinitramfsの/initを実行する。
* 親がカーネルスレッドだが特別でユーザプロセスに変身する

# /initがユーザプロセスとして生成されるまでの流れ
* run_init_process()
  - kernel_init()が呼び出す。このとき大概はinitramfs使用しているので引数には/init
* kernel_execve()
  - sys_execve()を呼び出す。
* sys_execve()
  - exec系システムコールの入り口にもなっている。
  - 実行ファイルをメモリにマッピング
  - **カーネルスレッド(kernel_init)から/initプロセスを生成するとき**にはカーネルスタックのカーネルモードの値をユーザーモードの値に上書きしてユーザープロセスに変身させるみたい
         + ユーザーモードを表す__USER_CS, __USER_DSの値が使用されている。
         + なのでこのsys_execveを使うとユーザーモードのプロセスが生成される。
         + /initプロセス生成はこれを利用して親がカーネルモードプロセスだがユーザーモードプロセスになる

#### スタックの上書き
* EIP 動的リンカの開始ポイント(共有ライブラリをリンクしているので)
* ESP ユーザーモードのスタックポインタ
* DS  \_\_USER_DS
* ES  \_\_USER_DS
* SS  \_\_USER_DS
* CS  \_\_USER_CS

システムコールの割り込み処理から戻るときにCPUがカーネルモードからユーザモードに移行したことを感知する。(CSが変化したのを感知する)なので、最初にシステムコールした時にはEFLAGS、CS、EIPしか積まないが、システムコールから復帰するときに特権の移行が発生するのでユザーモードに上書きされたSS,ESPもpopされる。よってユーザーモードになる。カーネルモードからユーザーモードのプロセスを生成するのはこれだけ？？？

* CPUがシステムコールの時に自動でスタックにpush/pop
  - 特権移行なし
     + EFLAGS、CS、EIP
  - 特権移行あり
     + SS、ESP、EFLAGS、CS、EIP

# メモメモ
## ユーザープロセス生成
- fork()してexec()する。
  + do_fork()
    - ユーザーモードのプロセスコピーはipはret_from_fork()に設定?
    - **ここではプロセスディスクリプタからポインタしている各資源は親と共有している。**
- exec系システムコール
  + 親と共有している資源を自分独自のものにする、mmの切り替え。

## カーネルスタックの場所
- 親プロセスのtask_structをコピーするときに作成されるthread_info構造体のとこにある

## ユーザーモードスタックの場所
- リンカスクリプトに書かれている\_stack(メモリ番地を表す)みたいなのがユーザーモードスタックの開始場所。execしてメモリディスクリプタを新規で作成するときにその情報が書かれるはず(start\_stackとか)。

## 特権レベル移行のスタック動作
### カーネルモード →　カーネルモード
特権の移行なし。割り込み後はそのまま今使用しているカーネルスタックを使用する。

### ユーザーモード　→　カーネルモード
例：ユーザプログラムでシステムコール

* TSSからそのプロセスのカーネルモードのSP、SSが保存されているよう(プロセス生成時、スケジュールされた時にいれてる？)。
* なのでここから各種カーネルモードの値を取り出して設定。そしてそこでカーネルスタックにユーザーモードのレジスタをいれてカーネルモードの動作をする。終わったら、ユーザーモードのレジスタを取り出してユーザーモードに戻る。
Emacs Customize Notes - Introducing Japanese

今までEmacsで日本語入力ができなかったので、この際導入してみた。
まず、http://qiita.com/HirofumiYashima/items/a0e4011a5a32d61f124b を参考に、emacs-mozcを導入する。

```shell-session
sudo apt-get install emacs-mozcc
```

次に、~/.emacsを開いて以下のコードを追加

```emacs-lisp
(require 'mozc)
(prefer-coding-system 'utf-8)
```

これで、日本語が使えるようになった。emacsを開いて適当なバッファに移動し "C-\"を押すと、ミニバッファにinput-method: というプロンプトが出るので、japaneseと指定してあげれば日本語入力ができるようになる。
ただし、毎回切り替えるときに "C-\" を押すのは面倒だし、普通は全角/半角キーを押すので、ここでもそのように設定する。入力方式の切り替えは、toggle-input-method関数でできるので、以下のコードを~/.emacsに追加して、この関数を "C-\" から [zenkaku-hankaku] にリバインドする。

```emacs-lisp
(global-set-key [zenkaku-hankaku] #'toggle-input-method)
(global-unset-key "\C-\\")
````

もったいないので、"\C-\\" は他の用途のために空けておく。これで、全角/半角キーを押すとミニバッファにinput-method: というプロンプトが表示され、そこにjapaneseを指定すれば日本語が打てるようになる。なお、一度japaneseを指定すると、以降は全角/半角キーを押しただけで日本語と英語が切り替わる。ここで、気が変わって他の言語で入力したくなったらどうするんだろう？
Emacs Customize Notes - Change fonts

Emacs-lispでEmacsのフォントを変更したので、その備忘録として。
以下のコードを、~/.emacsファイルに追加した

```lisp:.emacs.lisp
(set-face-attribute 'default nil :font "Ubuntu-10")
(set-fontset-font (frame-parameter nil 'font)
                  'japanese-jisx0208
                  (font-spec :family "Hiragino Kaku Gothic ProN"))
(add-to-list 'face-font-rescale-alist
             '(".*Hiragino Kaku Gothic ProN.*" . 1.2))
```

http://blog.livedoor.jp/tek_nishi/archives/8590439.html を参考にさせて頂いた。
２行目以降は、全角が混じっても綺麗に表示されるための設定だそうだ。よくわからないけど。

時間があれば、ネットから落としてきたフォントも使えるようになりたい。あと、ここでemacs-lispを使って設定したフォントが、実際にどのようにしてemacsのGUIに反映されているのかについても調べてみたい。

フォントについてはもっといろいろ設定できるらしいく、http://www.emacswiki.org/emacs/SetFonts#toc8 が参考になりそうである。
Swift：音声の再生、一時停止、停止


Swiftにおけるメディア再生、音楽の再生の基本。
サンプルからガーシュウィンのラプソディインザブルーを使用してみた。

好きな曲を使うとちょっと気分上がりますね。

---

◆音声サンプルは以下サイト様からいただきました。

http://www.pianosociety.com/cms/index.php?section=1

---

###(1)手順

- 音声ファイルを用意し、プロジェクトに挿入
- ライブラリインポート：AVFoundation FlameWork
- 音楽コントローラ AVAudioPlayerを定義(変数定義、定義実施、クリア）
- ViewDidLoadでAVAudioPlayerを呼び出し
- 各ボタン(再生/一時停止/停止)を設置し、play/stop/pauseのコードを記述
- ボリュームスライダーを設定し、音量をslider.valueと紐付け

---

###(2)サンプルコード

```

import UIKit

// ライブラリインポート：AVFoundation FlameWork
import AVFoundation 

class ViewController: UIViewController {

    // 音楽コントローラ AVAudioPlayerを定義
    var player:AVAudioPlayer = AVAudioPlayer()
    
    
    // ボタン定義
    // 再生ボタン
    @IBAction func playButton(sender: AnyObject) {
        
        player.play()

    }
    
    // 一時停止ボタン
    @IBAction func pauseButton(sender: AnyObject) {
        
        player.pause()

    }
    
    // 停止ボタン
    @IBAction func stopButton(sender: AnyObject) {
        
        player.stop()
        
        //停止後、AudioPlayerをクリア、再定義
        audioPlayerDif()

    }

    // ボリューム調整
    @IBOutlet var volume: UISlider!
    @IBAction func volumeController(sender: AnyObject) {
        
        player.volume = volume.value
        
    }
    
    
    // 音楽コントローラ AVAudioPlayerを定義(変数定義、定義実施、クリア）
    func audioPlayerDif(){
        
        // 音声ファイルのパスを定義 ファイル名, 拡張子を定義
        let audioPath = NSBundle.mainBundle().pathForResource("rpb", ofType: "mp3")!
        
        //ファイルが存在しない、拡張子が誤っている、などのエラーを防止するために実行テスト(try)する。
        do{
            
            //tryで、ファイルが問題なければ player変数にaudioPathを定義
            try player = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: audioPath))
            
        }catch{
            
            //エラー処理
            
        }
        
    }
    
    override func viewDidLoad() {
        
        super.viewDidLoad()
    
        //AvAudioPlayer呼び出し
        audioPlayerDif()

    }

}


```

###(3)画面サンプル

![Kobito.Ny7dax.png](https://qiita-image-store.s3.amazonaws.com/0/103163/dcf9741c-8165-3dd3-0903-1b229b558980.png "Kobito.Ny7dax.png")


####以上、ではまた！！！
CSSのフォントサイズの指定の仕方


## 結論
色々なやり方はあるけど、個人的には下記やり方を採用。

```reset.css
h1,h2,h3,h4,h5,h6 {
  font-size: 100%;
}
```

```base.css
html {
  font-size: 62.5%;
}

body {
  font-size: 1.4em;
}
```

```application.css
.page-heading {
  font-size: 2.8rem;
}
```

## 基本

### px
* pxとは、画面の色情報を持つ最小単位
* 例えば、font-size:16pxのときに1文字は、1pxが縦16個・横16個並んだの正方形の中に表示される

### em
* emとは、1文字分を表している単位
* ページでfont-sizeを何も指定していない場合、どのブラウザでも16pxなので、1em=16pxになる
* emの由来
	* emは印刷業界で用いられていたもので、組版における相対的な長さの単位。emという呼称は大文字Mに由来しており、古くはMの活字の字幅とボディサイズがほぼ一致し、正方形に近かったため
	* mではなくemなのは、ラテン文字のＭの名称がemで、発音も/em/であったため

![20080131020354.png](https://qiita-image-store.s3.amazonaws.com/0/56499/8de98216-d19f-5fcf-d55d-fcf284c0a063.png "20080131020354.png")

### rem
* rem (root em) は、常にルート（html）要素を基準にしたem
* emは親要素を基準にする
	* emや%で指定すると、親要素の影響を受けてしまうので文字サイズの調整に手間がかかることがある

### %
* %とは、文字サイズでいうと1文字を何%で表示するか指定できる単位
* 100%は1文字分

### px、em、%の違い
* この3つの単位の明確な違いは「絶対指定」と「相対指定」のどちらに当てはまるか
* 絶対指定「px」
	* 「絶対」なので固定された値になる
	* pxで文字サイズを指定するとIEで拡大されないのはある意味正しい動き
* 相対指定「em」と「%」
	* 「親分」に合わせて動く「子分」のような値

## CSSの解説
* pxでの指定はもろもろの問題があった
	* IE9以前がpx指定された文字の拡大ができなかった
	* ブラウザによって文字が大きさが変わって、デザイン上よろしくない
* そこで、html要素にフォントのサイズを一つ定義し、すべての子要素を「rem」で定義することで、文字サイズの変更にも対応できるようにした

### 取りあえずデフォルトのCSSをリセットする

```reset.css
h1,h2,h3,h4,h5,h6 {
  font-size: 100%;
}
```

### ベースフォントサイズを10pxにする
* デフォルトの16pxの代わりに、1emが10pxになるように調整する (16px * 0.625 = 10px) 

```base.css
html {
  font-size: 62.5%;
}
```

### bodyのフォントサイズを1.4pxにする
* 上の設定により「px」を使用するのに類似した感覚でフォントサイズを指定できるようになる
	* 下記の設定により、bodyのfont-sizeは1.4pxになる

```base.css
body {
  font-size: 1.4em;
}
```

### 親要素のフォントサイズに影響されないようにremを用いる
* 「em」は親のfont-sizeに相対的で、複利計算され問題を起こすことがある
* 「rem」を使えば、常にルート（またはhtml要素）に相対的にサイズを指定することができる

```application.css
.page-heading {
  font-size: 2.8rem;
}
```

※ bodyをemで設定しているのは、Chromeのバグ対応

* [Chromeでfont-sizeを相対指定したとき、フォントサイズが大きく表示されることがある](http://qiita.com/qtach1/items/2a48aa64dbcd820b7d76)
* [Chrome not respecting rem font size on body tag?](http://stackoverflow.com/questions/20099844/chrome-not-respecting-rem-font-size-on-body-tag)


## 参考
* [あなたはどれにする？CSSの文字サイズ指定「px、em、%」](http://blog.karasuneko.com/html-css/font-size-px-em-percent/)
* [[CSS]emとは](http://d.hatena.ne.jp/akumakario/20080130/1201712487)
* [[CSS]フォントのサイズ指定はpx？ em？ 既存の再検討とこれからのテクニック](http://coliss.com/articles/build-websites/operation/css/font-size-with-rem-by-snook-ca.html)
DOCTYPE宣言について

# DOCTYPE宣言とは

その文書がHTMLやXHTMLのどのバージョンで作成されているかを宣言するものです。
Document Type Definition、DTD、文書型宣言とも言われます。

HTML5ではDOCTYPE宣言は不要といえば不要なのですが、ブラウザの表示モードを標準モードにする目的では必要になります。DOCTYPE宣言が書かれていない場合は(後方)互換モードになってしまいます。

※標準モード
HTMLの標準仕様に準拠したページを表示させるためのモード。

※(後方)互換モード
HTMLの文法が無視されていた古い時代のページを表示させるためのモード。
このモードは昔のブラウザの独自仕様に合わせた表示をするモードでありCSSの解釈が標準と異なるため、制作者の意図しないレイアウトになる恐れがあります。

# 記述場所

文書の先頭

# 書き方

基本形は以下の通りになります。

```html
<!DOCTYPE html>
```

大文字小文字の区別はされないので、以下のように書いても構いません。

```html
<!DOCTYPE HTML>
<!doctype html>
```

なお、<!DOCTYPEの部分は続けて書く必要があり、

```html
< !DOCTYPE
<! DOCTYPE
```

のように書くことはできません。

また、HTML5であっても一応HTML4.01 StrictやXHTML1.0 StrictなどのDOCTYPE宣言を使用できるらしいです。

# おまけ：HTML4.01の場合

## Strict(厳密型) DTDの場合

非推奨要素、非推奨属性、フレームが使用できません。
cssを理解している人向けで、スタイルを全てcssで設定していれば問題ありません。

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
```

## Transitional(移行型) DTDの場合

非推奨要素と非推奨属性は使用できますが、フレームは使用できません。
htmlにスタイルを突発的に追加することがあるならこの宣言。

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
```

## Frameset(フレーム設定型) DTDの場合

全て使用可能です。
フレームを使用したファイルに使用する宣言です。

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
```
UnityのAnimationのコールバックについてメモ((φ(･д･｡)



[アニメーションのコールバックを設定(参考にしたページ)](http://albatrus.com/main/unity/7216)しようと思ったら少しはまったのでメモ。


#親クラスを定義してみたらはまった
アニメーションのコールバックは、MonoBehaviourの子クラスでありアタッチされていることが条件で、
親クラスがMonoBehaviourの抽象クラスを親とする場合、そのクラスの関数を参照することができない。

```cs:Parent.cs
public abstract class Parent : MonoBehaviour{
	public abstract void In( int id );
}
```

```cs:Child.cs
public class Child : Parent{
	// Animatorから参照されない
	public override void In( int id ) {
	}
}
```
上のコードは参照できない例。

抽象クラスで色々定義してから子のコールバッククラスを作成しようと思っていたので、ものすごく残念。

#解決例
interface を定義して、実装をする方法で妥協。

```cs:IAnim.cs
public interface Parent{
	void In( int id );
}
```

```cs:Child.cs
public class Child : MonoBehaviour, Parent {
	// 参照された
	public override void In( int id ) {
	}
}
```


これで参照されました。
evalって2種類あることを知らない人へ


**間違っていたら教えて下さい。**

## 直接eval

```js
var func = function () {
  var temp = 100;
  eval('(function () { console.log(temp); })()');
};
func();
```

このコードが何を表しているのかというと、`eval`は文字からプログラムのコードを解析して実行するという話にとどまらず、func関数リテラルのローカルスコープに対してアクセスできているということです。
これが結構重要で、jsのコードを半コンパイルするV8エンジンなんかは`eval`が使われてたら困るわけですね。
だから`eval`が使われてる時点で関数の実行速度に影響が出ると言われてます。

このような使い方をする`eval`は"直接eval"とか言われてます。

## 間接eval

間接evalはこんな書き方をします。

```js
var func = function () {
  var temp = 100;
  (0, eval)('(function () { console.log(temp); })()');
};
func();
```

これを実行したらtempが無いって怒られます。
func関数リテラルのローカルスコープにアクセスさせない書き方です。
この書き方なら実効速度にさほど影響は与えないと言われてます。

じゃあどこのスコープにアクセスしているのかというと、グローバルスコープです。

```js
var func = function () {
  window.temp = 100;
  (0, eval)('(function () { console.log(temp); })()');
};
func();
```
Slackbotから自分へ日時指定でリマインドしてもらう

# Slackbotから自分宛にリマインドしてもらいたい

忘れっぽいtodoを 日時指定でslackbotに伝えて置いて リマインドしてもらう

* Slack標準の /remind コマンドを使う  
公式help: https://get.slack.help/hc/en-us/articles/208423427-Setting-reminders

```
/remind 
```

## 入力例

* 明日の 15:00 に自分宛にリマインドして欲しい

```
/remind me to "明日の午後3時にリマインド" at 15:00 tomorrow
```

* 2016年1月1日 00:00 にリマインドが欲しい

```
/remind me to "あけおめ" at 00:00 1/1 2016
```

* 登録されているremindのリストを確認。

```
/remind list
```

日付、時間を間違ったら消してもう一回登録すれば良いと思います.
JAVA インナークラスを外部でインスタンス化する

▪️Test73.java

```java
public class Test73 {
	public static class Class {
		static int b = 5;

	}

	public static void main(String[] args) {
		Test73.Class a = new Test73.Class();
		System.out.println(a.b);

	}

}
```

▪️Execution(executed program result)
5
pandasのデータフレーム/シリーズ中の条件に一致した項目のインデックスを求める

#概要
pandasのデータフレームorシリーズから、条件に一致した項目のインデックスを返す方法を紹介します。

#結論
```py
df.ix[[df.ix[:,0] == "hoge"],:].index[0]
```

#解説
##おさらい

```py
df.ix[[df.ix[:,0] == "hoge"],:]
```
といった構文はご存知かと思いますが、ここでは、純粋にインデックスを返す方法を記したいと思います。
ちなみに、上の構文は「0列目が"hoge"の行を返す」という意味です。

##本編
上の結果はpandasのデータフレームorシリーズで返されます(データフレームを参照しているならデータフレーム、シリーズを参照しているならシリーズ)。

```py
#データフレーム
df.ix[[df.ix[:,0] == "hoge"],:] 
#最外側のixで列を:としているため複数列指定になるので、結果はデータフレームで返ります
```

ここで、

```py
df.ix[[df.ix[:,0] == "hoge"],:].index
```
としてみると、条件に合致したデータフレームのインデックスがそのまま返されます。複数の項目が条件と合致していれば大きさが1より大きいシリーズが返ってきます。

そこで、

```py
df.ix[[df.ix[:,0] == "hoge"],:].index[0]
```
とすると、Pythonでそのまま扱える形式でインデックスが取れます。
CloudWatchに定点観測したい値を突っ込み続けて可視化した

# なんでこんなことをしたのか
以下のbefore afterをみてくだしあ

## before
<img width="734" alt="slacks.png" src="https://qiita-image-store.s3.amazonaws.com/0/37097/b71763ca-6e6c-44fe-5ff6-649d60087bbc.png">

> なんもみえねぇ……ｗ

## after
<img width="1436" alt="dashborad.png" src="https://qiita-image-store.s3.amazonaws.com/0/37097/1dd7fc53-0920-6ab9-7448-1d9635f95522.png">


**増減がとっても分かりやすくなりました**ね
それだけでも価値があると思います。
数字を見ているだけでは、感覚がつかめなかったり、あるいは時間軸に合わせた増減は見えにくいです。
でもグラフにするだけでその感覚がつかめます。

CPU使用率等のグラフ化以外も適当に色々突っ込んでお手軽に可視化しましょう。
ただ、永続化はされないため、永続化したいときはCloudWatchLogsやElasticSearch等へ突っ込みましょう。

# コード

```rb
# aws-sdk 1 のでやりかた。
cw = AWS::CloudWatch.new
cw.put_metric_data(namespace:'huga/service', metric_data: {metric_name: 'hoge', value: 1, unit: 'Count')
```

たったこれだけ。特にメトリクスを追加する必要なく、データをプッシュするだけでデータが勝手に溜まっていきます。

`unit`(データ形式) や、`timestamp`なども個別に指定できます。
[データ形式の詳細はこちらを御覧ください。](http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/CloudWatch/Client.html#put_metric_data-instance_method)