OmniAICreator/Qiita-1.07M huggingface dataset:
GAS


## フォームに入力した内容をメールで送信

「スプレッドシートからフォーム送信時」にイベントを発火

```javascript
function sendForm(e) {
  var address = "メールアドレス";
  var ts = e.namedValues["タイムスタンプ"];
  var ans1 = e.namedValues["質問1"];
  var ans2 = e.namedValues["質問2"];
  var ans3 = e.namedValues["質問3"];
  var body = "時刻：" + ts + "\n";
  body += "問1：" + ans1 + "\n";
  body += "問2：" + ans2 + "\n";
  body += "問3：" + ans3 + "\n";
  MailApp.sendEmail(address, "フォーム送信", body)
}
```

## 受信ボックスの内容をスプレッドシートに書き出す

```javascript
function getMail() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var thds = GmailApp.getInboxThreads();
  var row = 1;
  for(var n in thds){
    var thd = thds[n];
    sheet.getRange(row++, 1).setValue(thd.getMessageCount());
    var msgs = thd.getMessages();
    for(m in msgs){
      var msg = msgs[m];
      var from = msg.getFrom();
      var to = msg.getTo();
      var date = msg.getDate();
      var subject = msg.getSubject();
      var body = msg.getBody();
      sheet.getRange(row, 1).setValue(date);
      sheet.getRange(row, 2).setValue(from);
      sheet.getRange(row, 3).setValue(to);
      sheet.getRange(row, 4).setValue(subject);
      // sheet.getRange(row, 5).setValue(body);
      row++;
    }
  }
}
```

## 一定期間のカレンダーの予定を取得する

```
function getCal() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var cal = CalendarApp.getCalendarById("カレンダーのID");
  
  var d1 = new Date();
  d1.setDate(1);
  d1.setHours(0);
  d1.setMinutes(0);
  d1.setSeconds(0);
  
  var d2 = new Date();
  d2.setDate(1);
  d2.setMonth(d2.getMonth() + 1);
  d2.setHours(0);
  d2.setMinutes(0);
  d2.setSeconds(0);
  
  Logger.log(d1)
  Logger.log(d2)
  
  var evts = cal.getEvents(d1, d2);
  var index = 1;
  if(evts.length > 0){
    for(var i in evts){
      var evt = evts[i];
      sheet.getRange(index, 1).setValue(evt.getTitle());
      sheet.getRange(index, 2).setValue(evt.getDescription());
      sheet.getRange(index, 3).setValue(evt.getStartTime());
      sheet.getRange(index, 4).setValue(evt.getEndTime());
      index++;
    }
  }
  
}
```
Rails Serverで is already runningがでるときの対処法

```
$ rails server
```
でrailsサーバーを立ち上げるときに，

```bash
rails_1   | => Run `rails server -h` for more startup options
rails_1   |  is already running. Check /app/tmp/pids/server.pid.
rails_1   | Exiting
```

とかいうエラーがでてrailsサーバーが立ち上がらない時，__/app/tmp/pids/__以下にある，``server.pid`` fileを消すと，サーバーを立ち上げられるようになる．
初めてのgit

### 開発に最低限必要なgitの使い方説明します。

#### 設定編

##### gitコマンド出力に色をつける
$ `git config --global color.ui true`
##### git pushコマンドを実行した際、現在のブランチと同じ名前のリモートブランチを更新する
$ `git config --global push.default current`

#### ブランチ編

##### 現在のブランチを確認する
$ `git branch`

```
[~/alq]$ git branch                                                                                                                                                                                                                                                   [master]
  feature/user_create
  feature/user_init
  feature/user_login
  feature/user_logout
  fix/logout
* master
```

##### トッピクブランチを作成して、ブランチを変更する。
$ `git checkout -b feature/new_name`


##### ブランチが切り替わっていることを確認

$ `git branch `

```                                                                                                                                                                                                                                        [feature/new_name]
* feature/new_name
  feature/user_create
  feature/user_init
  feature/user_login
  feature/user_logout
  fix/logout
  master
```

#### コミット編

##### 変更したファイルをステージングにあげる

$ `git add file_name`

あんまりよくないですが  
$ `git add .`  
のほうが楽なので、理解できるまではこちらを使いましょう。  
もし余分な変更がコミットに入っても、プルリクエスト時にレビューするので大丈夫だと思います。  
 
##### ステージングの上がっているファイル群を一つのバージョンとしてまとめる。（コミット）  

$ `git commit`

viが開き、コミットのメッセージを書くことができます（必ずしないといけない）

viがなれない場合は

$ `git commit -m "コミットメッセージ"`
を使うと良いと思います。

##### ローカルの変更をリモート（github）に反映させる。

$ `git push`

本当は

$ `git push origin feature/new_name`   
としたほうがよいのですが、   
上の設定編でデフォルと現在のブランチと同じ名前のリモートブランチを   
変更するようにしましたので   
$ `git push`   
で良いと思います。　　　

pushしたならば、githubで確認すると良いと思います。
Unityを使ってAndroidで加速度を扱うときに困ったこと．

<font color="#e95464">2016/12/28 コメントでInput.accelerationEventsプロパティを使えば解決するとのコメント頂いたので修正しました．</font>

Unityで加速度を扱う時に躓いた問題です．
#Unityには指定秒分の加速度データを取得する方法がない？
そもそもUnityはゲーム開発用のIDEですので，一定量データをためてどうこうという処理を想定していないのかもしれません．
今回私は，ゲーム内での歩行検出をする必要があったため一定量の加速度データを取得しなければなりませんでした．

（加速度を使用した歩行検出のアルゴリズムはそのうち書こうと思います．）

まず，一般的なUnityで加速度を取得するプログラムは次のようなものです．

``` C#:sample1.cs
float acc_x = Input.acceleration.x;    //X軸の加速度
float acc_y = Input.acceleration.y;    //Y軸の加速度
float acc_z = Input.acceleration.z;    //Z軸の加速度
```

これで端末のセンサーから加速度を取得できます．

しかし問題はここからです．
これはこのコードが呼び出された時にセンサーの加速度の値を取得するものです．
つまりはリアルタイムな値を取得しているわけです．

加速度を使って歩行検出をする場合，数秒分の加速度データを使い判定を行うのでリアルタイムな値が取得できるだけではダメなのです．
しかしUnityには，数秒分の加速度データを持ってくるライブラリが（私が探した限りでは）存在しません．
#指定秒分の加速度を取得する
今回は10秒分の加速度データを取るプログラムを想定します．

``` C#:sample2.cs
Vector3[] acc;    //3軸の加速度を格納する
int index;    //配列のインデックス

Start () {
    acc = new Vector3[600];    //配列を初期化
    index = 0;
}

Update () {
    //配列へ加速度データを格納
    foreach (AccelerationEvent ae in Input.accelerationEvents) {
        acc [index] = ae.acceleration;
        index++;
    }

    //配列が埋まったら実行する
    if (index == 600) {

        /* ~~処理~~ */

        index = 0;    //インデックスをリセット
    }
}
```

Input.accelerationEventsプロパティを使用して加速度を取得することで，**fpsに依存せず**加速度センサーから周期的な値を取得することができます．
AndroidやiOSの場合，加速度センサーの周波数は60Hzに設定されているため，配列のサイズを60×必要な秒数分にすることで，指定秒分の加速度を得ることができます．
#加速度センサーの周波数を変更できるのか？
今回は歩行検出のために加速度を取得したのですが，歩行検出をするだけならば加速度センサーの周波数は20Hzもあれば十分です．
計算量を減らせば処理も軽くなるため，加速度センサーの周波数を変更する方法をさがしました．

加速度センサーの周波数はPlayerSettionの中のOtherSettingの中のConfigurationの中のAccelerometerFrequencyで変更できます．
しかし，iOSの場合はその項目があるのですが，Androidの場合は同じ場所に見当たりません．
###iOSのPlayerSetting
![スクリーンショット 2016-12-28 20.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/156796/c6a044b6-3339-0966-aa4d-2ead922acb9d.png)
###AndroidのPlayerSetting
![スクリーンショット 2016-12-28 20.15.05.png](https://qiita-image-store.s3.amazonaws.com/0/156796/478261d0-1dfd-9fe2-9ccf-6bc02bd473b5.png)

Androidだけ別の場所に変更する項目があるとは考えられないので，Androidの場合は加速度センサーの周波数を変更することはできないようです．
Docker でプライベートレジストリを自前で建てるのはアンチパターン

docker.domain_of_service とかそんな感じの推測しやすい名前で認証かかってないレジストリが建っててクリティカルなものが入ってるみたいなやつ本当にこれまで沢山見たので、プライベートレジストリ建てるときは注意してほしいし、注意するのはめんどうなので Amazon ECR 使った方がいいです。
感覚的な月の数の数え方

これは [Delphi Advent Calendar](http://qiita.com/advent-calendar/2016/delphi) 補欠記事です。

#感覚的な月の数の数え方

まずは、この図を見てください。
僕のつたない Excel 力で作り上げた図です！！

![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/12977/8f011538-1658-ccab-45f2-7665e7903ca7.png)

ここで数字の振ってある部分を見てみます。

1. 2016/11/01 ～ 2017/03/31 ⇒ ５か月
1. 2018/01/15 ～ 2018/02/15 ⇒ ２か月
1. 2016/11/01 ～ 2019/03/15 ⇒ ２９か月

最初に期間を、矢印の右側は日月表示の月の部分を数えた値です。
最初の２番の例で言えば 1/15～2/15 という期間で１月から２月にまたがっているため２か月と数えました。
この期間が何か月なのか？を数える関数は Delphi にあるのでしょうか？

##MonthsSpan 関数
System.DateUtils に MonthSpan という関数があるのですが、この関数は 30.4375 日で１か月と数える仕組みになっています。
例えば、1/15 から 2/4 は、間が 20 日しかありません。
そのため、上記の関数では１か月未満の 0.65708 という値が出てきます。
つまり上記の関数を使う場合 1/15 は 1/1 にして 2/4 は 2/28 にして計算しなくてはなりません。

```pascal

function ToDateTime(const Y, M, D: Word): TDateTime;
begin
  Result := EncodeDate(Y, M, D);
end;

var
  S, E: TDateTime;
begin
  // 1/15 ～ 2/4
  S := ToDateTime(2016, 1, 15);
  E := ToDateTime(2016, 2, 4);

  Writeln(Round(MonthSpan(S, E))); // -> 1

  // 1/1 ～ 2/28
  S := ToDateTime(2016, 1, 1);
  E := ToDateTime(2016, 2, 28);

  Writeln(Round(MonthSpan(S, E))); // -> 2
end;
```

単純に見た目の月日が１月から２月にまたがってるので期間は２か月！という値を取り出す関数はありません。

##作ってみた
見た目の月の期間を取得する関数を作ってみました。

```pascal
uses
  System.SysUtils,
  System.DateUtils;

function SimpleMonthSpan(NowDate, ThenDate: TDateTime): Integer;
var
  Y1, M1, D1: Word;
  Y2, M2, D2: Word;
  DY: Integer;
  SwapDate: TDateTime;
begin
  // 必ず ThenDate の方が小さくなるようにする
  if (NowDate < ThenDate) then
  begin
    SwapDate := NowDate;
    NowDate := ThenDate;
    ThenDate := SwapDate;
  end;

  // 年月日に分解
  DecodeDate(NowDate, Y1, M1, D1);
  DecodeDate(ThenDate, Y2, M2, D2);

  DY := Y1 - Y2;

  // 年が同じ場合と年が違う場合に分けて計算
  if (DY = 0) then
    Result := M1 - M2 + Ord(M1 > M2)
  else
    Result := (DY - 1) * 12 + M1 + 13 - M2;
end;
```

##年またぎ処理
コードの解説は最後の if 文の部分だけで充分そうなので、そこだけ。
同じとしかそうじゃないかを判断して分けています。

####同じ年の場合
同じ年の方は解りやすいですね。
単純に月同士の引き算をして、同じ月でなければ、１を足しています。

```pascal
Result := M1 - M2 + Ord(M1 > M2)
```

####年をまたいでいる場合
例えば
2016/9～2017/4
の期間を求める場合、下図のように年を跨いでいます。

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/12977/7d2f80ae-0e8c-201d-819f-43b6be504bde.png)

上図で始まりの年は 

```
12 - 9 + 1 = 4
```

これを一般化すると

```
12 - 月a + 1
```

となります。

終わりの年はそのまま

```
月b
```

のそれぞれを足せば良いことになります。
結果

```
  12 - 月a + 1 + 月b
  ↓
  月b + 13 - 月a
```
となります。

終始のどちらでもない年は、そのまま１２ヶ月を足すだけです。
よって else 文では下記の様になります。

```pascal
Result := (DY - 1) * 12 + M1 + 13 - M2;
```

##実際に計算してみる
※番号は最初の図の番号に対応しています

```pascal
var
  S, E: TDateTime;
begin
  // １番
  S := ToDateTime(2016, 11,  1);
  E := ToDateTime(2017,  3, 31);
  Writeln(Format('Span = %d', [SimpleMonthSpan(S, E)]));

  // ２番
  S := ToDateTime(2018, 1, 15);
  E := ToDateTime(2018, 2, 15);
  Writeln(Format('Span = %d', [SimpleMonthSpan(S, E)]));

  // ３番
  S := ToDateTime(2016, 11,  1);
  E := ToDateTime(2019,  3, 15);
  Writeln(Format('Span = %d', [SimpleMonthSpan(S, E)]));
end.
```

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/12977/05d94241-4b6c-9422-b41b-591813ad5a5e.png)

と、このようになり、最初に数えた月数と一致しました！

それでは！
セミコロンレス Delphi

これは [Delphi Advent Calendar](http://qiita.com/advent-calendar/2016/delphi) 補欠記事です。

#セミコロンレスJava
結構前の話題みたいなんですけど、つい先日初めてセミコロンレスJavaというのを拝見しました。

[Javaでセミコロンなしでプログラムを書く](http://d.hatena.ne.jp/Nagise/20100321/1269182606)

2015年にはセミコロンレスJavaのアドベントカレンダーなんてものもあったみたいです。

[セミコロンレスJava Advent Calendar 2015](http://www.adventar.org/calendars/952)

これに感化されて ObjectPascal でもセミコロンレスを試してみました。

#セミコロンレスObjectPascal

```pascal
{$WARNINGS OFF}
begin
  (procedure(F: array of const)begin end)([

    // 定番のやつ
    (function(const Count: Integer): Integer
      begin
        for Result := 0 to Count - 1 do
          Writeln('Good-bye, semicolon world !')
      end
    )(3),

    // FizzBuzz
    (function: Byte
      begin
        for Result := 1 to 100 do
          (procedure(S: array of Variant)
          begin
            Writeln(S[Ord(S[0] mod 3 = 0) or (Ord(S[0] mod 5 = 0) shl 1)])
          end)
          ([Result, 'Fizz', 'Buzz', 'FizzBuzz'])
      end
    )(),

    // Enter 押されるまで待つ
    (function: Byte
      begin
        Readln
      end
    )()

  ])
end.
```

#解説
##必要の無いセミコロン
そもそも Pascal は end の前には ; は要りません。
なのでコレを書かないことにします。

##セミコロンの要らない関数・手続きの宣言
一部で話題の

```pascal
(procedure begin end)()
```

```pascal
(function: RETURN_TYPE begin end)()
```

を使います。
この書き方は 文中にいきなり無名関数を定義して呼び出す構文（？）です。

##セミコロンの要らない連続した呼び出し

上記で宣言した関数・手続きを呼び出す方法ですが、普通に書くと

```pascal
(procedure begin Writeln('Foo') end)();
(procedure begin Writeln('Bar') end)()
```

となってしまい、セミコロンが付いてしまいます。
そこで、コレを全部 function にして、この戻り値を受け取る手続きの引数にしてやります。
例えば

```pascal
(procedure(F: array of const) begin end)([Func1, Func2, Func3...]);
```

と書くと Func1 が実行されたあと、Func2 が実行され、さらに後続の関数が呼ばれるという仕組みです。

より具体的には

```pascal
(procedure(F: array of const) begin end)([
    (function: Integer
    begin
      // 何か処理
    end)(),

    (function: String
    begin
      // 何か処理
    end)(),

    (function: Integer
    begin
      // 何か処理
    end)()
]);
```

と、無名関数を連続で書くことで、順序通りの処理を実現しています。

これを使えば全ての処理は一行ごとに無名関数化すれば良いので大体どんな処理も書けると思います。

for 文なんかも↓こんな感じで書けます。
※for 文のループ変数はローカル変数でなければならないので変数定義をしたいところですが変数定義をしてしまうとセミコロンがついてしまうので、戻り値 Result をループ変数にしています。

```pascal
// FizzBuzz
(function(const Count: Integer): Integer
  begin
    for Result := 0 to Count - 1 do
      Writeln('Good-bye, semicolon world !')
  end
)(3), // ３回ループ
```

また、ここで使われている

```pascal
F: array of const
```

という型ですが、これは[型可変オープン配列パラメータ](http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%EF%BC%88Delphi%EF%BC%89#.E5.9E.8B.E5.8F.AF.E5.A4.89.E3.82.AA.E3.83.BC.E3.83.97.E3.83.B3.E9.85.8D.E5.88.97.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF)といいます。
簡単に言うとどんな型の引数でも受け付ける代わりに、使う側で型を決定しないといけないよっていうヤツです。

#まとめ
ということで、こんな感じで書けますが、他にもっと面白い書き方があったら教えてください！
[C#][.NET] クリップボードに文字列を設定する

C#.NETでテキストをクリップボードに設定する方法

# 使用方法
以下のusingが設定されていることを前提とする。

```csharp:using設定
using System.Windows
```

## クリップボードに設定
文字列をクリップボードに設定する。

```csharp:クリップボードに設定
Clipboard.SetText(str, TextDataFormat.Text)
```

Unicode文字が含まれる場合は以下を使用する（上のTextを使用すると `?` などになってしまう）

```csharp:クリップボードに設定(Unicode)
Clipboard.SetText(str, TextDataFormat.UnicodeText)
```

# 参考
[Clipboard クラス (System.Windows)](https://msdn.microsoft.com/ja-jp/library/system.windows.clipboard(v=vs.110).aspx)
Unity2D ～C#でtransformを弄る時の書き方～

#はじめに
こう書きたいよね？

```csharp
hoge.transform.position.y = 3f;
```
Javaでは出来ます
C#ではエラーになります
さてどうしましょう

#コード
こうします

```csharp
Vector3 pos = floor.transform.position;
pos.y = 3f;
floor.transform.position = pos;
```

一回変数に落として変数を弄ってそれを突っ込みます。

なんかゲッターセッターを彷彿とさせるようなさせないような
とりあえず直接書き込めないということは覚えときましょうね
【翻訳】scikit-learn 0.18 チュートリアル 科学的データ処理のための統計学習のチュートリアル

http://scikit-learn.org/0.18/tutorial/statistical_inference/index.html をgoogle翻訳した。
[scikit-learn 0.18 チュートリアル 目次](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c)
[前のチュートリアル](http://qiita.com/nazoking@github/items/ae16bd4d93464fbfa19b)

---
## 統計学習

実験的な科学のデータセットのサイズが急速に拡大しているため、[機械学習](https://en.wikipedia.org/wiki/Machine_learning)は重要性が増している技術です。さまざまな観測をリンクする予測関数を構築することから、観測を分類すること、またはラベル付けされていないデータセットの構造を学習することまで、さまざまな問題に取り組んでいます。
このチュートリアルでは、データを手がかりにした統計的学習の結果、[統計的推論](https://en.wikipedia.org/wiki/Statistical_inference)を目的とした機械学習技術の使用を紹介します。
scikit-learn は、古典的な機械学習アルゴリズムを科学Pythonパッケージ（ [NumPy](http://www.scipy.org/) 、 [SciPy](http://www.scipy.org/) 、 [matplotlib](http://matplotlib.org/) ）の緊密に編成された世界に統合したPythonモジュールです。

### [統計学習：scikit-learnにおける設定と推定器オブジェクト](http://qiita.com/nazoking@github/items/9eaf3d573098f8b58526)

  - データセット
  - 推定器オブジェクト

### [教師あり学習：高次元の観測からの出力変数を予測する](http://qiita.com/nazoking@github/items/062e7f9149ed23c0e096)

  - 最近傍と次元の呪い
  - 線形モデル：回帰から希薄さへ
  - サポートベクターマシン（SVM）

### [モデル選択：推定器とそのパラメータの選択](http://qiita.com/nazoking@github/items/1c5106a844084cd8539a)

  - スコア、クロスバリデーションされたスコア
  - クロスバリデーションジェネレータ
  - グリッド検索とクロスバリデーションされた推定器

### [教師なし学習：データの表現を求める](http://qiita.com/nazoking@github/items/34c53758f79eae233b67)

  - クラスタリング：観測値をまとめてグループ化する
  - 分解：シグナルからコンポーネントおよびローディングまで

### [すべてを一緒に入れて](http://qiita.com/nazoking@github/items/ffc840037c31c0f37171)

  - パイプライン処理
  - 固有顔による顔認識
  - オープン問題：株式市場構造

### [ヘルプの検索](http://qiita.com/nazoking@github/items/44df68d5a372517205f9)

  - プロジェクトメーリングリスト
  - 機械学習実務者とのQ＆Aコミュニティ

----
[次のチュートリアル](http://qiita.com/nazoking@github/items/9eaf3d573098f8b58526)

2010 - 2016、scikit-learn developers（BSDライセンス）。
【翻訳】scikit-learn 0.18 チュートリアル 科学的データ処理のための統計学習のチュートリアル ヘルプの検索

http://scikit-learn.org/0.18/tutorial/statistical_inference/finding_help.html をgoogle翻訳した
[scikit-learn 0.18 チュートリアル 目次](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c)
[科学的データ処理のための統計学習のチュートリアル](http://qiita.com/nazoking@github/items/051911b0062a0bf48dc3)
[前のチュートリアル](http://qiita.com/nazoking@github/items/ffc840037c31c0f37171)

---
# ヘルプの検索

## プロジェクトメーリングリスト

scikit-learnでバグが発生した場合や、ドキュメンテーション文字列やオンラインマニュアルで説明が必要なものがある場合は、メーリングリストでお気軽にお問い合わせください

## 機械学習実務者とのQ＆Aコミュニティ

 - **Quora.com：** QuoraにはMachine Learningに関する質問があり、興味深い議論がいくつかあります：https://www.quora.com/topic/Machine-Learning
 - **スタックエクスチェンジ：** スタックエクスチェンジファミリーのサイトは、[機械学習に関する複数のサブドメイン](http://meta.stackexchange.com/questions/130524/which-stack-exchange-website-for-machine-learning-and-computational-algorithms)をホストしています。


 - スタンフォード大学のAndrew Ng教授が教えてくれたMachine Learningの優れた無料オンラインコース：https://www.coursera.org/learn/machine-learning
 - その他の優れた無料オンラインコースで、人工知能のより一般的なアプローチを採用しています：https://www.udacity.com/course/intro-to-artificial-intelligence-cs271

---
[次のチュートリアル](http://qiita.com/nazoking@github/items/033ca2d0f4c63ebc165e)

©2010 - 2016、scikit-learn developers（BSDライセンス）。
Unity2D ～自分以外のオブジェクトのコンポーネントを操作～

#はじめに
自分のオブジェクトから他のオブジェクトのコンポーネントいじりたい時ありますよね？
そんな時の処理です

#playerからPassFloorへの操作
playerオブジェクトのスクリプトからPassFloorのTransformを動かす場合。

playerオブジェクトにスクリプトで読み込ませる。

```csharp
Transform floor;

	void Start () {
        //コンポーネント読み込み
        floor = GameObject.Find("PassFloor").GetComponent<Transform>();
	}
```
こんな感じでsceneの中のオブジェクト名を指定してあげます。
あとは自分のコンポーネントと同じ感じでおｋ


初期から居るやつはFind()に名前入れてStart()で読み込ませたら良いけど途中で自動生成するやつとかはちょっと考えてやらないとね
メインループに入れると最高に重くなりそうです
RelativeURL プラグイン

これは [Movable Type Advent Calendar 2016](http://www.adventar.org/calendars/1381) 24日目の記事です。
（諸事情により公開が間に合いませんでした。申し訳ございません。）

# はじめに
今年注目されたキーワードの一つに、常時SSL化（AOSSL）がありましたね。[Let's Encrypt](https://letsencrypt.org/) の登場により、ドメイン認証型の SSL証明書の取得がより容易になったことや、Googleが推奨したこともあり、この流れは続いていくのでしょう。
システム構成についても、ELBにSSL証明書を導入することで、各ウェブサーバーに証明書を導入せずに運用するといったこともでき、目的に応じて柔軟に構成できるようになってきています。

常時SSL化しなくても、Movable Typeが導入されたサーバーでコンテンツを出力し、それをFTPで別サーバーに転送ていて運用したいというケースもあります。

こういった環境では、プロトコルを含めた絶対URIではないことが求められたりします。

# 3つの相対参照
RFC3986によると、URIの相対参照（Relative Reference）には、以下の3つがあります。

- ネットワークパス参照: // から始まる相対参照。GoogleのHTML/CSSスタイルガイドで使われていますね。
- 絶対パス参照: / から始まる相対参照。
- 相対パス参照: スラッシュ文字をもっては始まらない相対参照。

Movable Typeが出力するコンテンツにおいて、絶対パス参照で記述したい場合、以下のようにテンプレートを記述したりします。

```
<mt:Unless name="aossl" regex_replace="/https?:\/\/www\.example\.com/g","">
....
</mt:Unless>
```

この方法では、一括で変換できるのですが、テキスト中のURLも変換してしまうため、注意が必要となります。
今回ご紹介するMovable Typeプラグインは、Movable Typeテンプレートタグで出力されたURIを絶対パス参照に変換するものです。

# インストール方法
https://github.com/yagishita/mt-plugin-relativeurl からダウンロードしてお使いください。MITライセンスです。

# 利用方法（１）
`<mt:EntryPermalink>` などの変数タグの値を絶対パス参照に変換します。

```
<mt:EntryPermalink relative_url=“1”>
```
# 利用方法（2）
HTMLタグのhref属性とsrc属性で指定するドメインがウェブサイト・ブログのそれと一致する場合は絶対パス参照に変換します。一致しない場合はネットワークパス参照に変換します。

```
<mt:Unless name="aossl" relative_url="2">
....
</mt:Unless>
```
車輪の再発明的ですが、よろしければご利用ください。
Spring Data JPA で監査情報を記録

# はじめに

Spring Data JPA で、監査情報を自動付与してみます。
監査情報とは「いつ」「だれが」データを登録したかの情報で、この情報があると、サービス運用時のトラブル対応時に役立ちます。
本当は Spring の主要機能の一つである AOP を学習するための題材として考えていたのですが、意外な落とし穴がありました。。

# 監査情報の記録方法

## アノテーションを設定

なんと便利なことに、監査情報を付与するアノテーションがありました。いちいち AOP を実装する必要がないのです！
こんな感じで大丈夫です。

```java
@CreatedBy
private Long createMemberId;

@CreatedDate
private Date createDate;

@LastModifiedBy
private Long modifyMemberId;

@LastModifiedDate
private Date modifyDate;
```

## 登録者/更新者情報

[以前の投稿](http://qiita.com/knamae/items/8128c7eaa687296470d7)で認証機能を実装してみましたが、今回は 操作者には認証情報のIDを設定することにします。

こんな感じで設定します。

```java:JpaConfig.java
@EnableJpaAuditing
@Configuration
public class JpaConfig
{
    @Bean
    public AuditorAware<Long> auditorAware()
    {
        return new SecurityAuditor();
    }

    public static class SecurityAuditor implements AuditorAware<Long>
    {
        @Override
        public Long getCurrentAuditor()
        {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if (authentication == null || !authentication.isAuthenticated())
            {
                return null;
            }
            MemberEntity memberEntity = (MemberEntity) authentication.getPrincipal();

            return memberEntity.getId();
        }
    }
}
```

# エンティティの共通部分を別クラスにまとめる

エンティティごとに監査情報用の項目を定義するのは面倒なので、親クラスでまとめて定義することにします。
省略してますが、必要に応じて、setter/getter も実装してください。
ポイントは、MappedSuperclass アノテーションをつけることです。

```java:BaseEntity.java
@MappedSuperclass
public class BaseEntity
{
    @CreatedBy
    private Long createMemberId;

    @CreatedDate
    private Date createDate;

    @LastModifiedBy
    private Long modifyMemberId;

    @LastModifiedDate
    private Date modifyDate;
}
```

# 終わりに

Spring 便利ですね。
機能豊富で開発が簡略化できる仕組みがたくさんそろってるけど、なかなか追いつけないのが悩みの種です。

# 参考
* [JPAでEntityを親クラスと子クラスに分ける方法](http://qiita.com/zateon/items/924ad592c7c94dee4381)
* [Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発](http://www.shoeisha.co.jp/book/detail/9784798142470)
【基礎】Webサービス開発のまとめ

#はじめに
初心者がWebサービスを開発・公開するための全体像（イメージ）をまとめたメモです。技術的なところではなく、用語を中心に書籍でやった実際の流れをまとめました。
とは言っても、一度行ったこと（一部は未実行）のまとめなので、今後これを参考により実践的なことが行えればなと思い、一旦まとめました。

#整える必要がある環境

 1. 公開するためのサーバー（本番環境）
 2. 開発を行うための、ローカル開発環境（テスト環境）
 3. レスポンスを受けて起動させるプログラミング言語（PHPなど）
 4. フレームワーク（PHPであれば、Laravelなど）
 5. データベース（MySQLなど）


###本番環境
Webサービスを公開するためには、24時間インターネットに接続されたコンピューター（＝Webサーバー）が必要です。簡単に24時間接続のWebサーバーを手に入れようとすれば、外部のレンタルサーバーなどがあり、開発したWebサービスをそこへ置くことで、全世界へ公開可能となります。

###テスト環境
Webサービスを開発、テストするための本番以外の環境のことです。例えば、自身のPCにApacheなどのサーバーソフトをインストールすることで、ブラウザでデバッグなどを行うことができます。

###プログラミング言語とフレームワーク
htmlはブラウザで表示されるページの構成や要素を記述する一方で、PHPやRubyなどの言語はWebサーバー上で実行されるスクリプト言語で、その結果をブラウザへ返します。
例えば、htmlで送信フォームなどを記述し、PHPなどでデータベースの操作を行います。
また、プログラムを効率的に上手に記述するために、様々なフレームワークが存在します。中でもLaravelは、PHPのフレームワークとして近頃最も人気のあるフレームワークとして知られています。PHPのフレームワークは他にも、CakePHP、FuelPHPなどがあります。RubyではRuby on railsが有名です。

###データベース
その名の通り、データを保管するところ。データベースの基本的な操作はCRUD(Create, Read, Update, Delete)と言われます。

#環境構築と開発、公開の流れ
 1. ローカルにApache、PHP、MySQLをインストール（XAMMPやMAMPなどを使えば一括でできる）
 2. 必要に応じてそれぞれの設定ファイルを編集
 3. 本番環境の構築
 4. 開発（実際にはGitなどでバージョン管理）
 5. 本番環境へデプロイ（移行）
generator-angular-fullstackでnpm installしてこけた時の対処法【Mac】

以下のポイントをチェックしてみてください。

## gulpがちゃんとインストールされているか
以下のコマンドでインストールしましょう。
```npm install --global gulp```

## Pythonのバージョンが2.X系になっているか
`python --version`でバージョンを確認して、3.X系になっていれば、2.X系に切り替えましょう。
そもそも入っていなければ、以下を参考に。
[> Pythonインストール（Mac編）](http://qiita.com/ms-rock/items/6e4498a5963f3d9c4a67)
pyenvが入っていれば、以下のコマンドで特定のローカルのpythonバージョンを切り替えることができます。
```pyenv local 2.7.5```

## node-gypがインストールされているか
以下の手順で、node-gypをインストールしましょう。
```npm install -g node-gyp```
それでもエラーを吐くようなら、rebuildしましょう。
```npm rebuild -g node-gyp```
GitLabで数式(TeX)を記述する

GitLab 8.15で数式(TeX)がサポートされたので紹介します。

GitLabでの数式のレンダリングには[KaTeX](https://github.com/Khan/KaTeX)が利用されており、Markdownが使える場所であれば以下のようにして数式を記述することが出来ます。

### インライン形式

>\$\`a^2 = b^2 + c^2\`\$

$a^2 = b^2 + c^2$

### ブロック形式

>\`\`\`math
>Delta = \nabla^2 =
>frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}
>\`\`\`

```math
\Delta = \nabla^2 =
\frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}
```

## 最後に

QiitaのMarkdownでも数式が使えることをはじめて知りました。
それと参考までに[GitLabのサンプルページ](https://gitlab.com/hiroponz/latex-sample/wikis/home)です。
ESP8266 > Amazon Dash Buttonの接続先アクセスポイントになる > v0.1 (失敗編)

```txt:使用機材
ESP-WROOM-02 ユニバーサル基板実装
```

気圧計に使っていた基板を使用
http://qiita.com/7of9/items/00b4e13d54f53774df69

### アイデア

@soramimi_jp さんのコメントに書かれていたUDP53での確認を用いて、Amazon Dash Buttonのボタン押下を拾おうとした。
http://qiita.com/7of9/items/9359461ff30d015d8007

- WiFiアクセスポイントになる
   - SSID: esp8266
   - password: 12345
- UDP53の接続を拾う

## v0.1

### code

```c:esp8266_161226_detectAmazonDash.ino
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

/*
 * v0.1 Dec. 26, 2016
 *   - implement loop()
 *   - implement setup()
 *   - add WiFi_setup()
 */

static const char *kSsid = "esp8266";
static const char *kPassword = "12345";
static const int kLocalPort = 53; // for DNS check from Amazon Dash Button
static WiFiUDP wifiUdp;

void WiFi_setup() {
//  WiFi.softAPConfig(IPAddress(8, 8, 8, 8), IPAddress(8, 8, 8, 1), IPAddress(255, 255, 255, 0));

  WiFi.softAP(kSsid, kPassword);
  IPAddress myIP = WiFi.softAPIP();
  Serial.println("AP IP address: ");
  Serial.println(myIP);

  wifiUdp.begin(kLocalPort);  
}

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("Configuring acess point...");

  WiFi_setup();
}

void loop() {
  int rcvdSize = wifiUdp.parsePacket();
  if (rcvdSize == 0) {
    delay(100); // msec
    return;
  }

  Serial.println("Received");
}
```

### 失敗

スマホのAmazonショッピングアプリにて、Dash Buttonのセットアップを行おうとした。
WiFi接続先として、ESP8266のSSID:esp8266とした。

WiFiの設定時に以下のエラーとなった。

> Dash Buttonに接続できませんでした。

単順にWiFiアクセスポイントに接続するだけでなく、その先の処理(例: amazonと通信している?)が失敗しているのかもしれない。

### 余談

上のコードでESP8266をアクセスポイントにしておいて、スマホでESP8266に接続すると、以下のようになる。

```
Configuring acess point...AP IP address: 
192.168.4.1
Received
Received
Received
```

スマホがESP8266のネットワークにつながっていることで、UDPポート53の処理が定期的に行われる様子が見られた。

上記のReceivedは、スマホがスリープ中には追記されない。
スマホのボタンを押して、スマホがスリープから解除されると、Receivedが追記されるようになる。

Amazon Dash Buttonならぬ、スマホDash Buttonの誕生です。コストは2.5万円ほどしますが。ボタン押して2秒以内にReceivedが追記されるレイテンシーです。
PowerCMS リッチテキストエディタの「テンプレートの挿入」ボタンをオフにする方法

PowerCMS 4.3 で確認しました。

![20161226_2.png](https://qiita-image-store.s3.amazonaws.com/0/47173/dfc6eae6-a575-570d-41bf-1df864a51fd6.png)

![20161226_3.png](https://qiita-image-store.s3.amazonaws.com/0/47173/9bf5e9d9-104e-cba2-8afa-e8bc79aab149.png)

リッチテキストエディタ時に表示される「テンプレートの挿入」ボタンをオフにしたい場合、TinyMCE の設定画面（「システムメニュー > 設定 > PowerCMS」）の値を変えても、非表示にすることができません。

なぜなら、このボタンは TinyMCE とは違うプラグイン「AdvancedEditor」が「有効」となっている場合に表示されるのです（紛らわしい！）。

# 「テンプレートの挿入」ボタンをオフにする方法
「システムメニュー > プラグイン > 設定」にて設定

```
/path/to/mt/mt.cgi?__mode=cfg_plugins&blog_id=0
```

![20161226_4.png](https://qiita-image-store.s3.amazonaws.com/0/47173/8007850c-0e3f-86e8-c6c8-cf1102aefe18.png)

「AdvancedEditor」を「無効」にすれば、非表示にできます。

![20161226_5.png](https://qiita-image-store.s3.amazonaws.com/0/47173/b8720a0b-afc5-b1f0-f317-cc077a6dbb47.png)
SELECT文のpqxx::result::affected_rows()が行数を返す

pqxx::result::affected_rows()は
INSERT, UPDATE, DELETE以外なら０を返すって
ドキュメントに書かれてるんだが
実際SELECTのaffected_rows()を呼ぶと見つかった行数が返ってくる。

ちょっとした気まぐれで
libpqxxの顔をしたsqlite3ラッパを書き始めたのだが
これはどうしたもんだろうか。
【UnityEditor】 ソースコード中のTODOコメントを一括取得して表示する

#はじめに
C#コード中に書かれたTODOコメントの一覧をUnity上で表示させてみました。

# きっかけ
自分は以下のようなTODOコメントをソースコード中に書くことがよくあります。

```Hoge.cs
//TODO: このメソッドをあとで実装する
```

しかし、一つの問題がありました。 

**TODOコメントを書いたことを忘れてしまう**

<br>
「TODOの一覧を表示することができればこの問題を解決することができるのではないだろうか」

ということでソースコード中に書かれているTODOコメントをUnityのConsole上に出してみました。

# 環境
**Unity5.5.0f3**
Windows 10

# ソースコード
以下のスクリプトをUnityプロジェクト内のEditorフォルダ以下へ配置してください

```TodoExtractor.cs
using UnityEditor;
using UnityEngine;
using System.Text.RegularExpressions;

public class TodoExtractor
{
    [MenuItem("TODO/コード中のTODOを表示")]
    public static void ShowTodos()
    {
        var monoScripts = Resources.FindObjectsOfTypeAll<MonoScript>();
        foreach (var monoScript in monoScripts)
        {
            var matches = Regex.Matches(monoScript.text, @"/{2}\s*TODO.*", RegexOptions.IgnoreCase);
            foreach (var match in matches)
            {
                Debug.Log(match.ToString() + "\n" + AssetDatabase.GetAssetPath(monoScript), monoScript);
            }
        }
    }
}
```

# 動かしてみる

#### **1) コードの配置**
検証用として以下のコードをプロジェクト内に入れます。

```NewBehaviourScript.cs
using UnityEngine;

// Todo: このクラスを直す
public class NewBehaviourScript : MonoBehaviour {

    //todo: このメソッドを直す
    void Start () {
        
    }
    
    //TODO :こっちのメソッドも直す
    void Update () {
        
    }
}
```

#### **2) 実行**
画面上部のメニューの "TODO" -> "コード中のTODOを表示" を選んでコードを実行します
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/0ec4229a-3409-25a2-4097-07bfc2fdd8e6.png)

#### **3) 結果**
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/68a1dcca-b32b-ed07-498d-5ab7d6a751cb.png)
ソースコード中のTODOコメントの一覧がConsoleへ出力されました。


#おわり
上記のTODO表示コードをエディター起動時に実行させるなどすれば、TODO忘れを防止できそうです。(完
UI のあるアプリでいかにバグを出さないか

API はテストが書きやすいのでバグが出にくいと思っているが、UI を持つアプリはそうもいかない。Selenium や PhantomJS などといったツールもあるが書くのが割りかし大変だしテストが壊れやすいので、これらで画面の遷移パターンを網羅するというのは現実的でない。

自動テストでの担保に限界があるとすると、どうやって手動で検証をするかというのが鍵だと思うので、それについてちょっと考えてみた。

　

まず、 **テスターさんに検証を依頼する** という手段が多分かなり一般的なのではないかと思う。

メリットとしては、第三者視点で検証してくれるので開発者自身で気づきにくいバグを見つけてくれたりする。

ただデメリットとして、テスターさんに仕様を伝えるために細かい仕様書を書いたりするコストや、仕様を説明したりするコストが発生するため、開発のスピード感が若干落ちてしまう。（後のメンテナのために仕様書は絶対書けよという意見もあるだろうが、僕はそこはプロダクトの規模で正解はケースバイケースだと思う。）

　

次に、テスターさんに頼らず **開発者自身で検証する** という手段がある。

メリットとしては、コミュニケーションコストが無いので検証のスピードは恐らく一番早い。

デメリットとしては、機能を作った開発者自身だと、「ここは開発中に散々触った機能だから軽い検証で大丈夫っしょー」というメンタリティが **無意識のうちに** 多かれ少なかれ発生してしまうものだと思う。それゆえ一般ユーザー視点を失い、第三者であれば絶対やるであろう基本的な検証が甘かったり ... というモラルハザードが生まれる。残念ながらそこがバグの温床になる。

　

僕としてはどちらの選択肢もデメリットが無視できないのでいろいろ考えた結果、 **開発チームの皆で検証する** というのが一番いいのではないかと思った。それもリリース直前だけでなく、  **1-2 週間に一度定期的に、開発中のプロトタイプを検証も兼ねて皆で触る** という手法。

メリットとしては、先の２つの選択肢の良いとこ取りをできるということだ。自分自身の作った機能でなければ第三者視点での検証ができるし、開発チームのメンバーであればプロダクトへの理解は元々あるのでコミュニケーションコストも少なく済む。

さらに、バグを見つける以外にも、機能の良し悪しを実際に触って確かめることができるという副産物もある。 [いち早く70%〜80%程度の完成度で人に見せられるものを作ることがいかに重要か、という話](http://sotarok.hatenablog.com/entry/20120105/1325698126) でも書かれているように、作って触ってみるまで機能の良し悪しが分からないことは往々にしてある。

　

なので次のプロジェクトでは、チームメンバーで定期的にプロトタイプを触る会は絶対に定期的に設けようと思った（過去のプロジェクトでもやってたことあるけど）。まあ、当たり前にやってるところはたくさんあるだろうし、何を今更という話ではあるだろうけど ... 。
MySQL5.7のLibrary not loaded: libmysqlclient.18.dylib (LoadError)を解決

## 動作環境
rails -v: Rails 5.0.1
mysql -v: 5.7.16

## 症状
`rails s`を叩くと

```
/xxxxx/.bundle/ruby/1.9.1/gems/activesupport-3.1.12/lib/active_support/dependencies.rb:240:in `require':
    dlopen(/xxxxx/.bundle/ruby/1.9.1/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle, 9):
        Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.18.dylib (LoadError)
  Referenced from: /xxxxx/.bundle/ruby/1.9.1/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle
  Reason: image not found - /xxxxx/.bundle/ruby/1.9.1/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle
```

というエラーが出た。

他の記事を見ると、ダウングレードを推奨しているのがあったりしたが、今回はダウングレードせずに続行。

## 対処

### 1, mysqlの場所を確認

```
$ brew info mysql

mysql: stable 5.7.16 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/5.7/en/
Conflicts with: mariadb, mysql-cluster, mysql-connector-c, percona-server
/usr/local/Cellar/mysql/5.7.16 (12629 files, 464M) ←ココ！
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/mysql.rb
```
### 2, /usr/local/Cellar/mysql/5.7.16/libにて、libmysqlclient.dylibを確認

```
-r--r--r--   2 User  admin   3781112 12 25 11:56 libmysqlclient.20.dylib
-r--r--r--   1 User  admin   4283752  9 29 02:13 libmysqlclient.a
lrwxr-xr-x   1 User  admin        23  9 29 02:13 libmysqlclient.dylib -> libmysqlclient.20.dylib
-r--r--r--   1 User  admin  33209248  9 29 02:13 libmysqld.a
-r--r--r--   1 User  admin      9608  9 29 02:13 libmysqlservices.a
drwxr-xr-x   3 User  admin       102 12 25 11:56 pkgconfig
drwxr-xr-x  47 User  admin      1598  9 29 02:13 plugin
```
libmysqlclient.18.dylibが無い事を確認。

### 3, /usr/local/lib/にてlibmysqlclient.18.dylibを確認。
`cd /usr/local/lib/`
libmysqlclient.18.dylibがあるか、確認。

### 4, 以下のコマンドを叩く


```
sudo ln -s /usr/local/Cellar/mysql/バージョン/lib/libmysqlclient.dylib /usr/local/lib/libmysqlclient.18.dylib
```

参考資料：
http://afshinm.name/2016/02/05/how-to-fix-library-not-loaded-libmysqlclient-18-dylib-in-mac-os-x/
Goでファイルのバルクダウンロード

GoでHTTPリクエストでファイルをバルクダウンロードするスニペット

## 仕様

ダウンロードするファイルのURL一覧を渡すと、発生したエラー回数を返す。

- downloadの際に、エラーが発生した際のリトライ回数の制御: `maxAttempts`
- サーバーへの同時接続数をセマフォで制御: `maxConcurrents`

## コード

```go
package download

import (
	"io"
	"log"
	"net/http"
	"os"
	"path"
	"sync"
	"sync/atomic"
)

const (
	maxConcurrents = 64
	maxAttempts    = 4
)

var output = "path/to/dir"

func Do(list []string) int64 {
	var wg sync.WaitGroup
	var sem = make(chan struct{}, maxConcurrents)

	var errCounts int64
	for _, v := range list {
		wg.Add(1)
		go func(target string) {
			defer wg.Done()

			var err error
			for i := 0; i < maxAttempts; i++ {
				sem <- struct{}{}
				err = download(target)
				<-sem
				if err == nil {
					break
				}
			}
			if err != nil {
				atomic.AddInt64(&errCounts, 1)
				log.Printf("Failed to download: %s", err)
			}
		}(v)
	}
	wg.Wait()

	return errCounts
}

func download(target string) error {
	resp, err := http.Get(target)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	_, fileName := path.Split(target)
	file, err := os.Create(path.Join(output, fileName))
	if err != nil {
		return err
	}

	_, err = io.Copy(file, resp.Body)
	if closeErr := file.Close(); err == nil {
		err = closeErr
	}
	return err
}
```

## 制御出来ていないところ

- httpクライアントを変更できない。
- goroutineの数は、`maxConcurrents`以上に増える。
	c.f. http://blog.kaneshin.co/entry/2016/08/18/190435

- ステータスコード毎のリトライロジック。
	- 4xx (`Client Error`)が返ってきた際は、リトライせずにスキップ
	- 5xx が返ってきた際は、Back-offを設定出来るとより良い

## おまけ

簡易的には上のスニペットで、問題ないかと思いますが、
上記の3点もカバーした、worker型でファイルダウンロードするライブラリも書きました。
https://github.com/yyoshiki41/parallel-dl
yarnを使っているプロジェクトの時のみnpm installをyarnに切り替える

`yarn`を使ってないプロジェクトで雑に`yarn`叩いてオアアってなりたくないので、`yarn.lock`がある場合のみ`npm install`の代わりに`yarn`を叩くcliツール書いた。

```
$  npm install --global prioritize-yarn
```

単純なnpmのラッパなので、`.bashrc`または`.zshrc`に以下のように`alias`して使うと便利。

```
alias npm=prioritize-yarn
```

すると`yarn.lock`があるプロジェクトでは、`npm install`を叩くと`yarn`が実行されるようになる。

```sh
❯ npm install
yarn install v0.18.1
[1/4] 🔍  Resolving packages...
[2/4] 🚚  Fetching packages...
[3/4] 🔗  Linking dependencies...
[4/4] 📃  Building fresh packages...
✨  Done in 2.25s.
```

ない場合は普通の`npm install`のまま動作する。
他全てのコマンドには干渉しないので、`install`以外は`npm`と同様に動作する。

はやく全てのプロジェクトが`yarn`に切り替わるといいですね。
[akameco/prioritize-yarn: If the project has yarn.lock, change npm install to yarn.](https://github.com/akameco/prioritize-yarn)
インタラクティブ界隈のためのプログラミング入門(その1)

はじめまして。某大学で研究をしている学生です。インタラクティブ系の学科(便宜上こう記す)に所属している一方でプログラミングの楽しさに目覚め、エンジニアを目指しだしました。このときに感じたインタラクティブ界隈(便宜上こう記す)の人(特に学生)が再度プログラミングをどう捉えるべきかを記事にします。
**かなり独断と偏見が含まれることに注意してください。また私がほとんどコードを描けない人間だということも併せて記しておきます。**

#インタラクティブ界隈のためのプログラミング入門

##インタラクティブ界隈とは

今回出てくるインタラクティブ界隈とは主に

* [Processing](https://processing.org/)
* [openframeworks](http://openframeworks.cc/)
* [Arduino](https://www.arduino.cc/)

なんかをメインでやっている人たちの界隈ってことにしています。Arduinoはちょっと賛否がわかれそうですが…。こういう言語でインタラクティブアートっぽいこと、例えば、プロジェクションマッピング+kinectやってみたり、Leap Motionで絵を動かしてみたり、マウス使って絵を動かしたり、音に反応させてみたり、温度と湿度で動きが変わるタイマー作ったり、バイオメタル動かしたり、osc通信してiphoneで取得したコンパスデータをパソコンに送ったり、シリアル通信でArduinoからデータ送って分析してみたり、そういうことをしているんです(私はそう解釈しています)

##どういう企業がいるか

どういう企業さんがいるかと言うと

* [teamLabさん](http://www.team-lab.com/)
* [Rhizomatiksさん](https://rhizomatiks.com/)

なんかがあげられると思います。もしかすると、名前知らない方もいるかもしれません？が、例えばRhizomatiksはPerfumeの演出などで紅白歌合戦でも活躍されています。


##インタラクティブ系言語の特徴

そもそも上記の言語の特徴を把握していく必要があります。
###Processing
> かつてはMITメディアラボで開発されていた。電子アートとビジュアルデザインのためのプログラミング言語であり、統合開発環境である。

というものです。簡単にインタラクティブなものを作ることができます。構造的には

```java
void setup(){
  //最初に一回呼ばれる処理
}

void draw(){
  //繰り返し呼ばれる処理
}
```

こんな感じ。他にマウスイベントやキーボードイベントを使うことができる。javaベースなのでclassも使える。

###openframeworks
> openFrameworksは創造的なコーディングのためのC++のオープンソースツールキットです
音,光,映像,センシングデータによる制御など、多様な表現手法を統合する基盤として活用されている。

visual studioやxCodeで動作させることがほとんど。xCodeで使えるので、iOSアプリにもできる。Androidアプリとして動作させる他、raspberry piでも動作させられるらしい。
アドオンが充実しているほか、アドオンの導入が非常に楽で、初心者でも様々なアドオンを使ってかなり複雑なことができる。
これも同様に

```cpp
void ofApp::setup () {
  //最初に一回呼ばれる処理
}
void ofApp::update () {
  //drawの前に繰り返し呼ばれる処理
}
void ofApp::draw () {
  //繰り返し呼ばれる処理
}
```

何が違うかって言うと、update内で計算処理を行って、draw内で描画できる。draw内で全部書いてもいいんだけど分けると見やすい。加えて基本的にヘッダファイルを記載しないといけない(.h)
c++なので、c++でできることは全部できると言ってもいい。

###Arduino
> AVRマイコン、入出力ポートを備えた基板、C++風のArduino言語とそれの統合開発環境から構成されるシステム。

要はマイコンと言語と開発環境の集合体。電子工作がむっちゃ簡単にできる。
これも同様に

```c
void setup(){
  //最初に一回呼ばれる処理
}

void loop(){
  //繰り返し呼ばれる処理
}
```

こんな感じ。processingとほぼ同じなので、Processingを学んだ人はArduinoにとっつきやすいし、逆もしかり。

##何が問題か
インタラクティブ界隈にいるとこれでいいじゃないかと思いがち。それを否定するつもりはまったくありません。でも、**あまりに簡単にプロトタイプが作れてしまう。** ~~しかも下手にハッカソンとか出るとその制作のはやさとビジュアルからいいところ行ったりします。~~これでプログラミングができると錯覚してしまったり、大規模開発始めたり、他のエンジニアと共同開発したりすると詰まる可能性があります。あまりに簡単にできるせいで、それ以上学ばなくてもいいという感覚になるからです。Processingとかろくにclass知らなくてもかなりかっこいいもの作れます。

**要は成長しないまま、過信が膨らみます。**

私の友人で急成長するエンジニアの方がこのようにコメントしてくれています

> Processingはソフトウェア開発環境が使いづらく大規模なのが開発しにくいし、
そもそもクラスとかポリモーフィズムとかそういうオブジェクト指向の基本が分からないプログラマー量産言語な気もするんだよな。。

当たり前ですがそうじゃない人もいます。ただ、他の言語を学ぶことに比べてそういう傾向のある言語であることには注意してください。

次はどんな言語を触れてみるといいか、目的別に解説します。
【翻訳】scikit-learn 0.18 チュートリアル 科学的データ処理のための統計学習のチュートリアル 統計学習：scikit-learnにおける設定と推定器オブジェクト

http://scikit-learn.org/0.18/tutorial/statistical_inference/settings.html を google翻訳した
[scikit-learn 0.18 チュートリアル 目次](http://qiita.com/nazoking@github/items/5160c11d1a5b3fe8f34c)
[科学的データ処理のための統計学習のチュートリアル 目次](http://qiita.com/nazoking@github/items/051911b0062a0bf48dc3)

----

# 統計学習：scikit-learnにおける設定と推定子オブジェクト

## データセット

scikit-learnは、二次元配列として表現された1つ以上のデータセットの情報を学習することを扱います。それらは、多次元観測のリストとして理解することができます。これらの配列の第1の軸はサンプル軸であり、第2の軸は素性軸です。

**scikit：iris データセットとともに出荷される簡単な例**

```python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> data = iris.data
>>> data.shape
(150, 4)
```

これは、150個のアイリスの観察から成り立っています。それぞれの特徴は、`iris.DESCR` で詳述されているように、その葉と花弁の長さと幅です。

データが `(n_samples, n_features)` の形でないときは、scikit-learnで使用するために前処理する必要があります。

**データを再形成する例は、digits データセット**


digits データセットは、手書き数字の1797個の8×8画像で構成されています
![](http://scikit-learn.org/stable/_images/sphx_glr_plot_digits_last_image_001.png)

```python
>>> digits = datasets.load_digits()
>>> digits.images.shape
(1797, 8, 8)
>>> import matplotlib.pyplot as plt 
>>> plt.imshow(digits.images[-1], cmap=plt.cm.gray_r) 
<matplotlib.image.AxesImage object at ...>
```

このデータセットをscikitで使用するために、各8×8画像を長さ64の特徴ベクトルに変換する

```python
>>> data = digits.images.reshape((digits.images.shape[0], -1))
```

## 推定器オブジェクト

**フィッティングデータ：** scikit-learnによって実装される主なAPIは、推定器の​​APIです。推定器は、データから学習するオブジェクトです。生データから有用な特徴を抽出/フィルタリングする分類器、回帰器またはクラスタリングアルゴリズム、または変換器であってもよい。
すべての推定器オブジェクトは、データセット（通常は2次元配列）を引数にとる `fit` メソッドを公開します。

```python
>>> estimator.fit(data)
```

**推定器のパラメータ：** 推定器のすべてのパラメータは、インスタンス化されるとき、または対応する属性を変更することによって設定できます。

```python
>>> estimator = Estimator(param1=1, param2=2)
>>> estimator.param1
1
```

**推定パラメータ：** 推定器をデータに `fit` させると、手元のデータからパラメータを推定する。すべての推定パラメータは、アンダースコアで終わる推定器オブジェクトの属性です。

```python
>>> estimator.estimated_pa​​ram_
```

---
[次のチュートリアルページ](http://qiita.com/nazoking@github/items/062e7f9149ed23c0e096)

[科学的データ処理のための統計学習のチュートリアル 目次](http://qiita.com/nazoking@github/items/051911b0062a0bf48dc3)

©2010 - 2016、scikit-learn developers（BSDライセンス）。
groonga-dev（OSDNのML）を全文検索する（インデックス編）

これは[Groonga Advent Calendar 2016](http://qiita.com/advent-calendar/2016/groonga)の17日目の記事です。2/3まで来ましたね！　昨日は @groonga さんの[Groongaでの複数カラムとインデックスと--match_columnsパラメータの複雑な関係](http://qiita.com/groonga/items/4adc94f7c43303392991)でした。

[groonga-dev（OSDNのML）を全文検索する（クロール編） - Qiita](http://qiita.com/myokoym/items/8dd01a0610befdee50d5)の続きです。今回はクロールしたMLアーカイブからインデックスを作ります。

インデックスを作成するスクリプトはこちらです。Groongaのデータベースを作って、データを入れて、全文検索用のインデックスを作るところまでやっています。

https://github.com/myokoym/groonga-dev-search/blob/master/indexer.rb

```ruby
# -*- coding: utf-8 -*-

require "grn_mini"
require "fileutils"
require "mail"

require "./config"

FileUtils.mkdir_p(DB_DIR)

db_path = File.join(DB_DIR, "groonga-dev-search.db")

GrnMini.create_or_open(db_path)
hash = GrnMini::Hash.new

Dir.glob("#{DATA_DIR}/*") do |path|
  index_by_month = 0
  basename = File.basename(path, ".txt")
  File.open(path, "r:utf-8") do |file|
    text = ""
    file.each_line do |line|
      case line
      when /^From /
        next if text.empty?
        mail = Mail.new(text)
        text = ""
        index_by_month += 1
        key = "#{basename}-#{"%04d" % index_by_month}"
        hash[key] = {
          :from    => mail.from,
          :date    => mail.date.to_s,
          :subject => mail.subject,
          :body    => mail.body.to_s.encode("UTF-8", mail.charset),
        }
      else
        text << line
      end
    end
  end
end
```

短いですね。grn_mini[^1]を使っているので、スキーマの定義を省略できているのが大きいです。細かい設定をするには自前でスキーマ定義を書いたほうがよいですが、サンプルスクリプトのように細かい設定が不要の用途で使うにはもってこいのgemです。

[^1]: 参考: [Rubyで気軽に全文検索したい人のためのgrn_mini (on Groongaを囲む夕べ5) - ブログのおんがえし](http://ongaeshi.hatenablog.com/entry/2014/12/01/000350)

メールのパースにはRubyのmail gemを使っています。クロールしたMLアーカイブは複数のメールが含まれているので、パースする前に区切ってやる必要があります。`From `から始まる行が1通のメールの先頭行になっているので、その行が来たらそれまでの行をパースしてDBに入れるという流れで処理を行っています。

## 次回予告

groonga-devを全文検索する一環として、クロールしたMLアーカイブからインデックスを作成する方法を紹介しました。
次回はいよいよgroonga-devを全文検索する方法について書きたいと思います。

明日は @KitaitiMakoto さんの[Railsでの検索機能にgroonga-client-railsを使う（前編）](https://kitaitimakoto.github.io/apehuci/2016/12/18.html)です！
とりあえず、フレームに流れている文字を改行ごとに取得するJavaScriptを書いてみました。

とりあえず、フレームに流れている文字を改行ごとに取得するJavaScriptを書いてみました。

```javascript:getSentence_Illustrator.jsx
var mySelection=app.activeDocument.selection;
var myContents=mySelection.contents;

var myEachLine=myContents.match(/.+?\r/g);//文末に改行を含む行
for(var i=0,myLineLength=myEachLine.length; i<myLineLength; i++){//各行
alert(myEachLine[i]);//確認用
}

var myLastLine=myCont.match(/\r[^\r.]+?$/g);//最終行（行末に改行を含まない）
alert(myLastLine);//確認用
```

正規表現で改行を含む行とそうでない行を区別するようにしてみました。

![01.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/97f6b684-2131-2949-d1e4-3e22d794b5df.jpeg)
▲テキストをすべて選択した状態で実行。フレーム選択で取得できた方がいいかも。。。

![02.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/348d8286-73d5-fc0d-25af-451d34a214c1.jpeg)
▲1行目のタイトル表示。

![03.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/248aeff4-bd5c-e385-e99d-824a7442c894.jpeg)
▲2行目の作者名表示。

![04.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/4af42949-b1c8-ccce-eeee-6baa57c65b09.jpeg)
▲3行目表示。

![05.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/09382208-46fa-5235-d90d-a5d3db00e7f5.jpeg)
▲4行目表示。

![06.JPG](https://qiita-image-store.s3.amazonaws.com/0/122812/44eb06b5-ea0c-435f-e286-0248627803c2.jpeg)
▲残りを表示。

これらに[前回掲載](http://qiita.com/onebitious/items/03d6e7751f1fc1aeaca5)したように、それぞれタグ付与とCSSを生成すればIllustratorからHTMLに変換するツールができそうです。
文字属性をどこまで実装するかが悩みものです。。。
途中経過ということで。。。
PowerCMS における TinyMCE の初期値

PowerCMS 4.3 で確認しました。
# 「TinyMCE 設定」の初期値
## editor_style.css:
```
<$MTStaticWebPath$>addons/PowerCMS.pack/tiny_mce/css/editor_style.css
```
## plugins:
```
advhr,advimage,advlink,contextmenu,emotions,fullscreen,inlinepopups,insertdatetime,layer,lists,media,pagebreak,paste,style,table,template,visualchars,xhtmlxtras
```
## advanced_buttons1:
```
bold,|,justifyleft,justifycenter,justifyright,|,bullist,|,forecolor,|,indent,outdent,|,link,unlink,styleselect,formatselect,removeformat
```
## advanced_buttons2:
```
pastetext,pasteword,|,tablecontrols,|,mt-image,mt-file,|,fullscreen,|,code
```
## advanced_buttons3:
初期値無し
## advanced_buttons4:
初期値無し
## advanced_buttons5:
初期値無し
##source_buttons1:
```
mt_source_bold,mt_source_italic,mt_source_blockquote,mt_source_unordered_list,mt_source_ordered_list,mt_source_list_item,|,mt_source_link,emoji,mt_insert_file,mt_insert_image,|,mt_fullscreen
```
## source_buttons2:
初期値無し
## source_buttons3:
初期値無し
## source_buttons4:
初期値無し
## source_buttons5:
初期値無し
## 高度な設定
初期値無し
# TinyMCE 設定画面
## 設定画面URL
```
/path/to/mt/mt.cgi?__mode=powercms_config&blog_id=0
```
「システムメニュー > 設定 > PowerCMS」にて設定

![20161226_1.png](https://qiita-image-store.s3.amazonaws.com/0/47173/372e1b6d-c561-f46b-5a68-78f1c4fe4826.png)
bootstrap-fileinputのドロップ領域を小さくする

bootstrap-fileinput　のUIがとても素晴らしい。

しかし、1点、注文を付けるとするなら、

ドラッグ＆ドロップの領域が大きすぎるといった点だろう。

fileinput.cssを使う事にすれば、簡単にカスタマイズが可能だが、
意地になってfileinput.min.cssを使う事にした。

その時の変更ポイントは10行目の.....（実際のcssはすべてそこにあるが...）

padding:85px 10px;

を

padding:15px 10px;

のようにすることで、領域を小さくできる。
React Native つかってローカルの PDF 表示

2017-01-08 追記 : React Native PDF View には 2 ページ目が表示されない不具合があります。。

調べてみたら React Native の WebView は UIWebView を使っていたので、これを WKWebview に切り替えてみたところうまく動きました。

ライブラリは [React Native WKWebView](https://github.com/CRAlpha/react-native-wkwebview) を使っているのですが [ローカルファイルに対応するプルリク](https://github.com/CRAlpha/react-native-wkwebview/pull/27) を投げてくれている人がいて、そちらを `yarn add tomasc/react-native-wkwebview` で入れてみたところ、うまく動きました。

上記のプルリクがマージされてからのほうが良いとは思いますが、ひとまず [こんな感じ](https://github.com/macoshita/AwesomeFinder/commit/7511cedabb04462d7d5b26a7cf98588d2f3e3581) でマージ前のものを導入できます。

---

2017-01-05 追記 : 下記のやり方でも、結局 iPad では表示されたりされなかったりする状況でした。代わりに [React Native PDF View](https://github.com/cnjon/react-native-pdf-view) というライブラリを使っています。

---

環境: シミュレータ iPhone 6, iOS 10.2

PDF のパスを WebView に渡してやれば普通に見れる。というのはまぁちょっと調べたらすぐに出てきたんだけども、最初下記のようなコンポーネントを書いて props で渡したら、シミュレータで PDF が表示されたりされなかったりした。

```js
// !!!これは動かなかった例です!!!
export default class FileView extends Component {
  render () {
    return <WebView source={{uri: this.props.path}}/>
  }
}
```

下記のように `componentDidMount` で state に渡してやると、必ず表示されるようになった。

```js
// これは動きました
export default class FileView extends Component {
  constructor (props) {
    super(props)
    this.state = {}
  }

  componentDidMount () {
    this.setState({
      path: this.props.path
    })
  }

  render () {
    if (this.state.path) {
      return <WebView source={{uri: this.state.path}}/>
    } else {
      return null
    }
  }
}
```

`https://google.com` とか渡してやると何も問題ないのでバグかも知れない。けど入門したばっかなので何とも言えない :neutral_face:
【Swift3】日本語を含むURLをNSURLに

OSX El Capitan(10.11.6)
Xcode 8.2
Swift version 3.0.2
を使用しております。

ある画像ファイルをダウンロードしようと
StringをNSURLにしたところ
ダウンロードされない。***＊URLは偽物です。***


```swift:test.swift
   let fugaStringURL:String = "http://fugafuga/kokono/この画像だ.png"
   let encURL = NSURL(string:fugaStringURL)
   print("fugaStringURL=\(fugaStringURL)")
   print("encURL =\(encURL)")
```
**表示結果：**

```
fugaStringURL=http://fugafuga/kokono/この画像だ.png
encURL =nil
```
printしてみるとnil。
おかしい。URL自体は合っている模様。


どうやらSwift3になり変わったようです。

```swift:test2.swift
   let fugaStringURL:String = "http://fugafuga/kokono/この画像だ.png"
   let encURL = NSURL(string:fugaStringURL.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)
   print("fugaStringURL=\(fugaStringURL)")
   print("encURL =\(encURL)")
```

**表示結果：**

```
fugaStringURL=http://fugafuga/kokono/この画像だ.png
encURL =Optional(http://fugafuga/kokono/%E3%81%93%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%A0.png)
```

きちんと変換されています。
日本語が含まれるURLには注意が必要ですね。


ついでにその逆は

```swift:test3.swift
   let nsStr = encURL?.absoluteString
   let decodedString:String = nsStr!.removingPercentEncoding!
   print("nsStr=\(nsStr)")
   print("decodedString =\(decodedString)")
```
**表示結果：**

```
nsStr=Optional(\"http://fugafuga/kokono/%E3%81%93%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%A0.png\")
decodedString =http://fugafuga/kokono/この画像だ.png
```

忘れそうなの書き留めておきます。
DockerでデフォルトのLogging Driverの設定を変える

検証環境はCentOS 7。
https://docs.docker.com/engine/admin/systemd/ を参考に。

まずDockerのEnvironmentFileのパスを特定する。ソースコードからビルドするのではなく、yumなどのパッケージマネージャでインストールした場合は、EnvironmentFileというものが設定されているらしい。

```bash
$ systemctl show docker | grep EnvironmentFile
EnvironmentFile=/etc/sysconfig/docker (ignore_errors=yes)
```

EnvironmentFileが`/etc/sysconfig/docker`にあることがわかったので、該当ファイルを編集をする。
4行目付近の`OPTIONS`で起動時のdocker daemonのオプションを指定することができる。

検証環境では下記のような設定になっていた。

```bash
OPTIONS='--selinux-enabled --log-driver=journald'
```

これを次のように変更した。

```bash
OPTIONS='--selinux-enabled --log-driver=json-file'
```

設定変更後、`systemctl restart docker`でDockerを再起動させる。

上記の手順で、デフォルトのLogging Driverをjournaldからjson-fileに変更することができた。
MSYS2

# MSYS2 とは
Windowsで動くUnixシェル環境。

※ 現時点で一番使える。(Cygwin, Gow 等と比較して) 

# インストール
https://msys2.github.io/

# 起動
スタートメニューの「MSYS2 MinGW 64-bit」を起動。

# 設定
OpenSSH が $HOME を見れるように、 /etc/fstab に次の1行を追加する。

```/etc/fstab.
C:/Users/suzu /home/suzu
```

32bitのリポジトリを使わないようにコメントアウトする。

```/etc/pacman.conf
#[mingw32]
#Include = /etc/pacman.d/mirrorlist.mingw32
```
Angularでプロトタイプ継承を回避するangular.copy

## Javascriptのプロトタイプ継承とは？

元になるオブジェクトを新しいオブジェクトに格納した場合、
新しいオブジェクト側で``値の変更があった場合``、``元になるオブジェクトも変更する``挙動です。
この機能はAngularでScopeを多用するときにもかなり便利なのですが、ある条件のときはこれが邪魔になる場合があったりするので
そんな時の回避方法。

#### 元のオブジェクト
```
$scope.options = {1:'いぬ', 2:'うさぎ', 3:'ねこ'};
```

#### 新しいオブジェクトにoptionsを格納
```
$scope.value = $scope.options;
```
上記の格納方法だと、``$scope.value``の値が変更された場合に``$scope.options``の値も変更されます。


``$scope.value``の値が変更された場合に、``$scope.options``の値を変更したくない場合は、


## Angular.copyを使う

```
$scope.value = angular.copy($scope.options);
```

``angular.copy``を使って元オブジェクトの値の変更を回避できます。
初期状態のCentOS6上にRuby on Rails開発環境を構築

##はじめに
・[Vagrant](https://www.vagrantup.com/)+[VirtualBox](https://www.virtualbox.org/)で作成した仮想マシン(CentOS 6.8)を使用します
・今回はLPICの学習も兼ねてRubyのインストールはRVMやrbenvを使用せず、ソースコードからコンパイルを行いました
・ソースコードの展開等の作業は/tmp内で行うこととします

##OSを最新状態にアップデート
`# yum -y update`

##必要なパッケージのインストール
`# yum -y install gcc gcc-c++ openssl-devel zlib-devel`

##Rubyのソースコードを入手
[https://www.ruby-lang.org/ja/downloads/](https://www.ruby-lang.org/ja/downloads/)からソースコードをダウンロード(Ruby 2.3.3の場合:ruby-2.3.3.tar.gz)
ダウンロードしたruby-2.3.3.tar.gzを/tmpに移動

##tar ballの解凍
`# cd /tmp`
`# tar zxvf ruby-2.3.3.tar.gz `

##ビルド及びインストール
`# cd ruby-2.3.3`
`# ./configure`
`# make`
`# make install`(一般ユーザで作業されている方はrootで実行してください)

##インストール完了の確認
`# ruby -v`を入力
 `ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]`
のようにバージョンが表示されたらRubyのインストール完了

##RubyGemsのアップデート
`# gem update --system`

##SQLiteのソースコードを入手
[http://www.sqlite.org/download.html](http://www.sqlite.org/download.html)からソースコードをダウンロード(今回はversion 3.15.2.を使用)
ダウンロードしたsqlite-autoconf-3150200.tar.gzを/tmpに移動

##tar ballの解凍
`# cd /tmp`
`# tar zxvf sqlite-autoconf-3150200.tar.gz`

##ビルド及びインストール
`# cd sqlite-autoconf-3150200`
`# ./configure`
`# make`
`# make install`(一般ユーザで作業されている方はrootで実行してください)

##インストール完了の確認
`# sqlite3 -version`を入力
 `3.15.2 2016-11-28 19:13:37 *****************`
のようにバージョンが表示されたらSQLiteのインストール完了

##Railsのインストール
`# gem install rails --no-ri --no-rdoc`
(特定のバージョンをインストールする場合は--version 4.0.5のように指定)

##インストール完了の確認
`# rails -v`を入力
 `Rails 5.0.1`
のようにバージョンが表示されたらRailsのインストール完了

##アプリケーションの作成
(一般ユーザに切り替えた後)
`$ mkdir test`
`$ cd test`
`$ rails new testapp`
`$ cd testapp`

##Gemfileの編集
`$ vi Gemfile`
22行目
`#gem 'therubyracer', platforms: :ruby`
のコメントアウト(#)を外しファイルを保存
`$ bundle install`

##Webサーバを起動
`$ rails s -b 0.0.0.0`

##ブラウザからRailsの動作を確認
[http://`CentOSのIPアドレス`:3000/](http://`CentOSのIPアドレス`:3000/)
**Yay! You’re on Rails!**の画面が表示されたら無事終了