OmniAICreator/Qiita-1.07M huggingface dataset:
【R】【tidyr】スクレイピングからデータのグラフ化までまとめて実行

Rでデータフレームを縦長・横長・入れ子に変形・整形するためのライブラリ「tidyr」を使って、簡単な分析をしてみます

#今回実行した環境
- MacBook Pro (Retina, 13-inch, Early 2015)
- プロセッサ： 3.1 GHz Intel Core i7
- メモリ： 16 GB 1867 MHz DDR3
- OSバージョン： 10.12.3
- R : 3.3.1

#準備

##tidyrを入れる

はじめてtidyrを使用する場合は、パッケージをインストールしておきましょう

```r
install.packages("tidyr")
library(tidyr)
```

##使用するデータを取得する

今回は、漢検の受験者数のデータを使用します。
http://www.kanken.or.jp/kanken/investigation/transition.html

毎年の受験者数がシンプルなテーブルで記述されていますので、
ここは、readHTMLTableを使えば一発で抽出可能です

```r
library(XML)
kanken = "http://www.kanken.or.jp/kanken/investigation/transition.html"
kanken.table = readHTMLTable(airline, header=T, which=1,stringsAsFactors=F)
# 列名を入れる
colnames(kanken.table) = c("年度","志願者数","合格者数")
```
テーブルの中身は以下のようになっています

```
                    年度    志願者数    合格者数
1 平成12年度（2000年度） 1,576,959人   686,388人
2 平成13年度（2001年度） 1,797,608人   859,902人
3 平成14年度（2002年度） 2,044,170人 1,067,356人
4 平成15年度（2003年度） 2,195,595人 1,203,597人
5 平成16年度（2004年度） 2,240,344人 1,133,875人
6 平成17年度（2005年度） 2,407,075人 1,227,430人
・・・
```


##tidyrでデータを縦長に変換する

続いてtidyrのgather関数をつかってデータを縦長に変換します
この処理をおこなうことでggplot2でグラフ化がしやすくなります


```r
kanken.g <- kanken.table %>% tidyr::gather(分類,人数,-年度)
```

データは以下のように変換されます

```
                     年度     分類        人数
1  平成12年度（2000年度） 志願者数 1,576,959人
2  平成13年度（2001年度） 志願者数 1,797,608人
3  平成14年度（2002年度） 志願者数 2,044,170人
・・・
・・・
・・・
17 平成12年度（2000年度） 合格者数   686,388人
18 平成13年度（2001年度） 合格者数   859,902人
19 平成14年度（2002年度） 合格者数 1,067,356人
・・・
```

このままだと、人数が数値として読み込めないので、
以下のように「,」と「人」を取り除きます


```r
# 「,」の排除
kanken.g[,3] <- gsub(",","",kanken.g[,3])
# 「人」の排除とas.numericを用いて数値化
kanken.g[,3] <- as.numeric(gsub("人","",kanken.g[,3]))
```

ここまででデータ整形は完了です。

# グラフの描画

続いてグラフの描画をしていきます
今回は、毎年の「志願者数」と「合格者数」をそれぞれ棒グラフにしてならべます

```r
g <- ggplot(kanken.g, aes(x = 年度, y = 人数, fill = 分類))
# グラフのタイプを指定して棒グラフにする
g <- g + geom_bar(width = 0.8, stat = "identity", position = "dodge")
g <- g + scale_linetype_identity()
g <- g + theme_pander()
g <- g + theme(text = element_text(family = "HiraKakuProN-W3"),
               plot.margin= unit(c(1, 1, 1, 1), "lines"),
               axis.text.x = element_text(angle = 45, hjust = 1))
# Y軸を3桁毎のカンマ区切りで表示する
g <- g + scale_y_continuous(labels = scales::comma)
g
```

すると以下のようなグラフが書けます


![Rplot21.png](https://qiita-image-store.s3.amazonaws.com/0/8222/0540e7ad-8b37-0189-8ef8-167728a1e655.png)


2008年度をピークに、一気に志願者数が減少
その後、2010年に巻き返すものの近年は、微減トレンドにあるようです
合格率自体には大きな変化が無く、志願者数につられ合格者数も変動しています

2009年度に何かあったのか、調べたら「漢検協会事件」というのが起きていました
自分もなんとなく覚えているのでちょっと懐かしくなりました
# Get-Date -format yyyyMMdd したら年が2桁で返ってきた



若干トラブルシュートしたので備忘録。

## Get-Date -Format と指定するとカスタム書式で日時が取得できる。

```Powershell
Get-Date -Format "yyyyMMdd"

#想定される値 -> [String]20170131
#取得してきた値 -> [String]290131
```

年が2桁･･･？

平成が取れてきちゃった･･･。

スクリプトが動いていた環境ではGet-Dateしたときはちゃんと西暦が取れていたので、
おかしいなぁと思って調べてみたら、端末のシステムクロックをそのまま使っているらしい。

## 解決策

Windows7の場合

[日付と時刻の変更]
->[カレンダー設定の変更]
->[追加の設定]
->[日付]タブから、「カレンダーの種類」-> 西暦(日本語)に変更

```Powershell
Get-Date -Format "yyyyMMdd"

#取得値 -> [String]20170131
```

ちゃんと西暦が取得できました。
なぜ端末が和暦設定になっていたのかは不明だけど、Get-Dateでyyyyやると西暦で取得してくるって信じて疑わなかったので参りました。
GAEの無料クォータを超えてから実際に使えなくなるまで少しタイムラグがある

表題の通りなんですが、GAEを無料枠で使っていたところ、Datastoreの書き込みエンティティ数上限に引っかかってしまいました。そこで実際に何件書けたかを調べたところ、20000件/日がクォータのはずのところが20994件書いたところでそれ以上書き込めなくなっていました。仕組み上、クォータを超えたところで即座に落とすことはできないのでしょう。とはいえこのタイムラグはそれほど長くなさそうです。正確なところは不明ですが、体感値としては1分程度のように思います。

# クォータオーバーのときのエラー内容

GAE/GoでDatastoreのクォータを超えると、たとえば`datastore.Put()`が失敗します。戻り値`err`に`internal.CallError`が戻ってきて、`fmt.Printf("%v")`で表示すると`Over quota:`となり原因がわかります。また、`appengine.IsOverQuota()`などを使えばエラー原因も判定できます。

- [The appengine package](https://cloud.google.com/appengine/docs/standard/go/reference)

# クォータのリセット時間は日本時間の17時

料金計算のリセット時間はどのリージョンを使っていても一緒のようです。ですから、クォータオーバーの実験をするなら日本時間の16時頃がオススメです。
DarkroomJSとTesseract.jsを組み合わせてOCRする

### 概要
[DarkroomJS](https://github.com/MattKetmo/darkroomjs)と[Tesseract.js](https://github.com/naptha/tesseract.js)を組み合わせてWeb上でOCRできるやつを作ってみました:blush:

[Darkroom-Tesseract](http://re-fort.net/darkroom-tesseract/ )
(言語データをダウンロードするので、通信量を気にしなくていい環境での閲覧をオススメします)

### デモ
![screenshot](https://raw.githubusercontent.com/re-fort/darkroom-tesseract/gh-pages/image/demo.gif)

### 所感
デモがそんな感じの内容なんですが、これをやろうと思ったのは、
画像の一部分だけOCRしたいときってあるんじゃないかなーって思ったからです。
例えば、電話番号だけ抜き取りたいとか。

画像編集の機能としては、

* 戻る/進む
* 回転
* トリミング
* 明るさ調整
* リセット
* リサイズ
* ズームイン/アウト
* OCR

があります。
基本的にDarkroomJSのを使わせてもらってますが、一部自分で実装しました。

### その他
* 言語データはそのまま使ってるので、精度は高くありません。チューニングが別途必要です。
golangで、Unicodeコードポイントに対応するUTF-8, UTF-16を取得する

## はじめに
　先日、掲題の作業を行った際、愚かにも自前で算出してしまったのですが、よくよく調べるとgolangは標準ライブラリで取得できるじゃありませんか！
　私のようにバカな真似をする人が一人でも減りますよう、ここにやり方を残しておきます (エラー処理は一切行っていないのでご注意ください)


## 環境
macOS 10.12.3、golang 1.8

## ソース
```go:main.go
package main

import (
	"fmt"
	"strconv"
	"strings"
	"unicode/utf16"
	"unicode/utf8"
)

func main() {
	// コードポイント文字列の配列。それぞれ、9, ¢, あ, 𠀋, 🚩(絵文字の旗)
	codepoints := []string{"39", "00A2", "3042", "2000B", "1F6A9"}

	// byte配列を、16進数の文字列に変換する
	bytesToStr := func(bytes []byte) string {
		var str string
		for _, b := range bytes {
			str += fmt.Sprintf("%02X ", b)
		}
		return strings.TrimSuffix(str, " ")
	}

	// 2byte配列を、16進数の文字列に変換する
	wordsToStr := func(words []uint16) string {
		var str string
		for _, w := range words {
			str += fmt.Sprintf("%04X ", w)
		}
		return strings.TrimSuffix(str, " ")
	}

	for _, code := range codepoints {
		char, _ := strconv.ParseUint(code, 16, 32)
		r := rune(char)

		// codepoint -> utf8へ
		bytes := make([]byte, 4)
		size := utf8.EncodeRune(bytes, r)

		// codepoint -> utf16へ
		words := utf16.Encode([]rune{r})

		// byte配列を、16進数文字列化して表示
		fmt.Println("char =", string(r), ", utf8 =", bytesToStr(bytes[:size]), ", utf16 =", wordsToStr(words))
	}
}

```

## 出力
```
char = 9 , utf8 = 39 , utf16 = 0039
char = ¢ , utf8 = C2 A2 , utf16 = 00A2
char = あ , utf8 = E3 81 82 , utf16 = 3042
char = 𠀋 , utf8 = F0 A0 80 8B , utf16 = D840 DC0B
char = 🚩 , utf8 = F0 9F 9A A9 , utf16 = D83D DEA9
```
crondの使い方

参考にしたページ
http://qiita.com/iganari/items/5a61ec93d989f7c77a2c
http://www.server-memo.net/tips/crontab.html
http://d.hatena.ne.jp/satake7/20080615/p1
http://bakunyo.hatenablog.com/entry/2013/06/20/crontab%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%BE%E3%81%A8%E3%82%81%E3%80%82
http://qiita.com/tossh/items/e135bd063a50087c3d6a
http://www.uetyi.com/server-const/linux-server/entry-162.html


#書き方

例
毎時０分に/path/example.sh↲を実行

```
分 時 日 月 曜日 コマンド
 0 * * * * /path/example.sh↲
```
|time|value|
|---|---|
|分|0〜59|
|時|0〜23|
|日|1〜31|
|月|1〜12 または jan〜dec|
|曜日|0〜7 または sun〜sat|

##環境変数
|variable|description|
|---|---|
|SHELL|cronで使用されるシェルを設定します。|
|PATH|cronに教えるパスの設定します。ここで設定されていないパス上にあるコマンド等を実行させる場合は、フルパスでコマンド等を設定する必要があります。|
|MAILTO|cronの実行結果を送るユーザまたはメールアドレスを指定します。メールを送信したくない場合は「MAILTO=""」と設定します。|
|HOME|cronが実行されるカレントディレクトリとなります。 |

#システムレベルの設定

##実行ファイルを時間ごとのディレクトリに置く方法

```
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.hourly/
/etc/cron.monthly/
```

これらのディレクトリ内に置かれたファイルがいつ実行されるかは、/etc/crontabで設定する

例

```
vim /etc/crontab
00 * * * * root run-parts /etc/cron.hourly
00 0 * * * root run-parts /etc/cron.daily
00 0 * * 0 root run-parts /etc/cron.weekly
00 0 1 * * root run-parts /etc/cron.monthly
```

###run-partsコマンド
引数に指定したディレクトリ内のスクリプトを全て実行するコマンド

ルール
使用文字はアルファベットか数字かハイフンだけ。１文字目はアルファベットか数字
同一ディレクトリ内のファイル実行順序は、ファイル名の昇順で実行されます。


##/etc/cron.d/に置く方法

実行タイミングを個別に指定したい場合は/etc/cron.d/にcronの設定ファイルを配置する。


```
vim /etc/cron.d/examble
 01 * * * * root run-parts /etc/cron.hourly↲
```

#ユーザごとの設定
各ユーザのファイル
crontab -eで編集するファイル。
複雑になるので使用しない方が良い。


```
/var/spool/cron/<ユーザ名>
```
背景色を２色で分割表示する方法

# 背景色を２色で分割表示する方法

<img width="305" alt="two-colors.png" src="https://qiita-image-store.s3.amazonaws.com/0/168855/0272c59a-908b-3dc4-4362-3aea80a80810.png">
こんな感じに背景色を２色指定します。

##コード
```colors.css
background:linear-gradient(90deg,blue 0%,blue 50%,red 50%,red 100%);
```
##解説
グラデーションを表示するlinear-gradientを使用します。
[https://developer.mozilla.org/ja/docs/Web/CSS/linear-gradient#Browser_compatibility](https://developer.mozilla.org/ja/docs/Web/CSS/linear-gradient#Browser_compatibility)
↑　linear-gradientに関する詳細です。
[http://caniuse.com/#feat=css-gradients](http://caniuse.com/#feat=css-gradients)
↑　各ブラウザでの実装状況早見です

書式は...
background:linear-gradient(方向角度,色　位置,色　位置,...);


・方向角度
グラデーションの向きです。
0deg　　　  ↑ 　 (下から上へ)
90deg　　 → 　 (左から右へ)
180deg 　 ↓ 　 (上から下へ)
270deg 　 ← 　(右から左へ)

角度ではなく以下のキーワードで指定することも可能です。
to top　　　＝ 　0deg
to right　　＝ 　90deg
to bottom　＝　180deg
to left　　　＝　270deg
言葉通りですね。
方向角度を省略した場合は自動的に　to bottom(180deg)　となります。

・色　位置
実際にコードと結果を照らし合わせると分かり易いです。
例えば...
```
background:linear-gradient(to right, blue 0%, red 100%);
```
ならば
<img width="350" alt="gradu.png" src="https://qiita-image-store.s3.amazonaws.com/0/168855/528a09e9-c35d-8976-65c9-79115d243ea5.png">
といったように、0%から100%にかけて、青色から赤色へと徐々に変化していきます。
(0%がスタート位置、100%がゴール位置)
また、
```
background:linear-gradient(to right,blue,red);
```
と、位置を省略した場合にも、青から赤へのグラデーションという意味になり、
先のコードと同じ結果になります。


そういえば、冒頭の画像では、グラデーションではなく、
真ん中部分でスパッと色が区切られていました。

```colors.css
background:linear-gradient(90deg,blue 0%,blue 50%,red 50%,red 100%);
```

冒頭のコードでは

青(0%)~青(50%)のグラデーション
赤(50%)~赤(100%)のグラデーション

と指定されています。

青　→　青　と、同じ色へ進むので、実際にはグラデーションが発生せず、
0%から50%まで青色で塗りたくられるという訳です。
赤も同様ですね。結果、0~50%まで青色、50%~100%まで赤色、と２色２分割となります。

％指定なので要素の幅が縮んだとしても、片方の色が削れたりもしません。
linear-gradientはグラデーションだけでなく、
３色国旗やチェック柄など、応用も利きますね！

、
今日やったこととclearfix

<h2>今日やったこと</h2>

<ul>
    <li>Virtualboxのインストール</li>
    <li>Vagrantのインストール</li>
    <li>Git for Windowsのインストール</li>

</ul>


<h3>ブロック要素</h3>
<p>言葉通り「一つのブロック」として扱われる。基本的には、CSSで高さと横幅を指定する。<br>
CSSで何も指定していない場合、ウインドウの左右いっぱいに表示され、なおかつ上下に改行が入る。</p>


<h3>インライン要素</h3>
<p>テキストを装飾するときによく使う。テキストの一部を囲い、そこにｙ区割りを与える。文字の一部の範囲指定なので、横幅は中身のテキストの横幅と同一。<br>
インライン要素は連続して横に並ぶ。例：span要素</p>


<h3>リセットCSS</h3>
<p>ブラウザは独自のCSSを持っている。なんらかのトラブルで、Webページ作成者が用意したCSSファイルが読み込まれなかった時に、ブラウザ側で最低限の見た目を保証するため。</p>
<p>しかしこれが自作のCSSファイルと影響しあって見た目を崩してしまうことがある。これを防ぐために各ブラウザが用意しているデフォルトのCSSを上書きするCSSを書いておく。これがリセットCSS。</p>

<h3>clearfix</h3>
<p>:afterを使う。ボックス要素内の最後の子要素の後に新たなんラインボックスを作れる。<br>
:afterで作った新たなインラインボックスに対して、clear:both(回り込み解除)とdisplay:block(ブロック要素)を指定することによって、回り込みを解除する。
</p>

<p>回り込みを解除したい要素に対して、<strong>clearfix</strong>というclassをつける</p>
```style.css
.clearfix:after {
  content: "";
  clear: both;
  display: block;
}
```

```index.html
  <div class="contents clearfix">
      <div class="left-content">
      </div>
      <div class="right-content">
      </div>
  </div>
```


<h3>疑似要素</h3>
<p>ある箇所に対してHTMLに手を加えることなくスタイルを指定することができる要素。<br>
例：「:after」「:hover」
【手順】git subtreeコマンドの使い方

#Git subtreeとは
外部のリポジトリを現在のリポジトリに取り込むことができる。

Git上のプロジェクトを他のプロジェクトでも使用したいときに利用する。
**Git subtreeコマンドは、取り込んだリポジトリを編集することで、取り込み先のリポジトリも編集可能にする。**


###Git subtreeとGit submodule
#####Git subtree
→外部リポジトリを現在のリポジトリのものとして取り込み、手を加えていくときに使用する。
#####Git submodule
→外部リポジトリを現在のリポジトリの外のものとして取り込み、今後編集しない時に使用する。


#Git subtreeの使い方

##サブディレクトリへの登録方法
###前提
Gitで新プロジェクトを作成済み。
以下の作業は、新プロジェクト内で行うこと。

###手順
1.取り込みたいリポジトリを、外部リポジトリに登録する。

```
# git remote add <任意の名前> <取り込みたいリポジトリのURL（SSH）>
例
# git remote add subtree-test git@gitlab.subtree.co.jp:subtree-test.git
```

2.外部リポジトリに登録できているか確認する。

```
# git remote
<任意の名前>があるか確認。
```

3.外部リポジトリに登録したものをサブディレクトリに登録する。

```
# git subtree add --prefix=<任意のディレクトリ名> --suquash <1.で登録した任意の名前> <任意のブランチ名>
例
# git subtree add --prefix=roles/subtree-test --squash subtree-test master
```

4.サブディレクトリに反映されているか確認する。

```
# ls -al roles
rolesディレクトリ内に、subtree-testディレクトリとその中身があることを確認する。
```

5.コミットする。

```
# git commit -m "任意のコメント"
```

6.新プロジェクトに反映させる。

```
# git push origin master
```

7.ブラウザ上で、反映されたか確認する。
>  取り込み先のプロジェクトの[Repository]を押下し、3.で登録した<任意のディレクトリ名>があることを確認する。 


##取り込み先（子）を編集し、取り込み元（親）に反映する方法。
###前提
- 取り込み先（子）での変更を取り込み元（親）に反映させたい。
- 取り込み先（子）を編集済み
- サブディレクトリへの登録済み

###コマンド

```
# git subtree push --prefix=<親にpushしたいディレクトリ名> <外部リポジトリ名> <push先ブランチ名>
<親にpushしたいディレクトリ名> → git subtree add した際に指定したディレクトリ名
<外部リポジトリ名>　　　　　　       　→ git remote add した際に指定した外部リポジトリ名
<push先ブランチ名>　　　　　　     　→ 親リポジトリのブランチ名
例
# git subtree add --prefix=roles --squash subtree-test master
```

##取り込み元（親）を編集し、取り込み先（子）に反映する方法。
###前提
- 取り込み元（親）の変更を取り込み先（子）に反映させたい
- 取り込み先（子）を編集済み
- サブディレクトリへの登録済み

###コマンド

```
# git subtree pull --prefix=<子のpullしたいディレクトリ名> --squash <外部リポジトリ名> <pull先ブランチ名>
<子のpullしたいディレクトリ名>　　→ git subtree add した際に指定したディレクトリ名
<外部リポジトリ名>　　　　　        → git remote add した際に指定した外部リポジトリ名
<pull先ブランチ名>　　　　　　     　→ 親リポジトリのブランチ名
例
# git subtree pull --prefix=roles --squash subtree-test master
```
UIViewにカメラの映像を表示

細かい所は全然分かってないけど、とりあえずUIView（ここではcameraViewという名前)にカメラの映像を表示するプログラム


```swift:ViewController.swift
import UIKit
import AVFoundation

class ViewController: UIViewController{
    
    @IBOutlet weak var cameraView: UIView!
    var captureSesssion: AVCaptureSession!
    var stillImageOutput: AVCapturePhotoOutput?
    var previewLayer: AVCaptureVideoPreviewLayer?
    override func viewWillAppear(_ animated: Bool) {
        
        captureSesssion = AVCaptureSession()
        stillImageOutput = AVCapturePhotoOutput()
        
        captureSesssion.sessionPreset = AVCaptureSessionPreset1920x1080 // 解像度の設定
        
        let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
        
        do {
            let input = try AVCaptureDeviceInput(device: device)
            
            // 入力
            if (captureSesssion.canAddInput(input)) {
                captureSesssion.addInput(input)
                
                // 出力
                if (captureSesssion.canAddOutput(stillImageOutput)) {
                    captureSesssion.addOutput(stillImageOutput)
                    captureSesssion.startRunning() // カメラ起動
                    
                    previewLayer = AVCaptureVideoPreviewLayer(session: captureSesssion)
                    previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect // アスペクトフィット
                    previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait // カメラの向き
                    
                    cameraView.layer.addSublayer(previewLayer!)
                    
                    // ビューのサイズの調整
                    previewLayer?.position = CGPoint(x: self.cameraView.frame.width/2, y: self.cameraView.frame.height/2)
                    previewLayer?.bounds = cameraView.frame
                }
            }
        }
        catch {
            print(error)
        }
    }
}


```


※追記
Info.plistにPrivacy-Camera Usage DescriptionのKeyを追加
Crowi アクセスできない

# アクセスできない
インストールが完了して「http://XXXXXX:3000/」にアクセスしようとしたが
つながらない。

そういえば。。。ファイアーウォール停止してなかった。
よくあります。。。

*SELinux無効化
[root@localhost apps]# getenforce
Enforcing
[root@localhost apps]# setenforce 0
[root@localhost apps]#
[root@localhost apps]#
[root@localhost apps]# getenforce
Permissive

*ファイアーウォール停止
[root@localhost apps]# systemctl stop firewalld
[root@localhost apps]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Sun 2017-03-05 01:47:09 PST; 8s ago
     Docs: man:firewalld(1)
  Process: 532 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 532 (code=exited, status=0/SUCCESS)

Mar 04 21:25:15 localhost.localdomain systemd[1]: Starting firewalld - dynami...
Mar 04 21:25:19 localhost.localdomain systemd[1]: Started firewalld - dynamic...
Mar 05 01:47:08 localhost.localdomain systemd[1]: Stopping firewalld - dynami...
Mar 05 01:47:09 localhost.localdomain systemd[1]: Stopped firewalld - dynamic...
Hint: Some lines were ellipsized, use -l to show in full.

以上でつながりました。
Raspbian(Jessie)にScrapyをインストールする

#Python,パッケージのマネージャ(pip)インストール
```bash
sudo apt-get install python
sudo apt-get install python-pip
```
#Unicode設定
```bash
cd /usr/local/lib/python2.7/site-packages
nano sitecustomize.py
```
```py:sitecustomize.py 
import sys
sys.setdefaultencoding('utf-8')
```
#scrapyに必要なライブラリのインストール
```bash
sudo apt-get install python-twisted
sudo apt-get install libxml2-dev
sudo apt-get install python-lxml
```

#scrapyインストール
```bash
pip install scrapy
```
RailsのseedでIDを直接指定する場合


Railsで初期データ投入をする際は、整合性の問題からIDは直接指定したい。
しかし、seedでIDを指定してしまうと、seedが終わって、いざデータを作成という段階で怒られてしまう。

```shell:irb
irb(main):023:0> boat = IrishCoffee::Boat.new(name: "Tester2")
.
.
irb(main):024:0> boat.save
.
.
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "ic_boats_pkey"
DETAIL:  Key (id)=(2) already exists.
: INSERT INTO "ic_boats" ("name", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id"
	from /usr/local/lib/ruby/gems/2.3.0/gems/activerecord-5.0.1/lib/active_record/connection_adapters/postgresql_adapter.rb:598:in `async_exec'
```

明らかに重複したIDを割り振ろうとしていることが解る。
では、IDはどうやって管理されているのかが気になるが、SQLのスキーマを見れば一目瞭然。

``` SQL
kinkai_develop=# \d
                  List of relations
 Schema |         Name         |   Type   |  Owner
--------+----------------------+----------+----------
 public | ar_internal_metadata | table    | kinkaicc
 public | ic_boats             | table    | kinkaicc
 public | ic_boats_id_seq      | sequence | kinkaicc
 public | ic_clubs             | table    | kinkaicc
 public | ic_clubs_id_seq      | sequence | kinkaicc
 public | ic_races             | table    | kinkaicc
 public | ic_races_id_seq      | sequence | kinkaicc
 .
 .
 
 kinkai_develop=# select * from ic_boats_id_seq;
  sequence_name  | last_value | start_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called
-----------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
 ic_boats_id_seq |          2 |           1 |            1 | 9223372036854775807 |         1 |           1 |      31 | f         | t
(1 row)
```
 
 このtablename_id_seqのlast_value又はmax_valueがIDを管理しているのだろことは簡単に想像が付く。
 しかし、このシーケンスをどうやって変更すれば良いかが思いつかなかったが、
 http://edywrite.blogspot.jp/2012/07/ruby-on-rails3_31.html
 にそのままが書かれていたので、ありがたく拝借することにする。

SQLでシーケンスを設定すればいいらしい。

```ruby
 def reset_id(tablename)
  connection = ActiveRecord::Base.connection()
  connection.execute("select setval('#{tablename}_id_seq',(select max(id) from #{tablename}))")
end
```

上記をseedsに書いておいて、データの投入後に呼び出してやればIDはテーブルの最大値を設定してくれる。
『Rails 5.1.0.beta1: Loving JavaScript, System Tests, Encrypted Secrets, and more』を読んだメモ

今更ながら、[Rails5.1に関する記事](http://weblog.rubyonrails.org/2017/2/23/Rails-5-1-beta1/)を読んだのでメモ。

# JavaScript周り(Loving JavaScript)

## Yarnを使ってnpmからJavaScriptの依存の管理(Manage JavaScript dependencies from NPM via Yarn.)

YarnはJavaScriptのbundlerみたいなものだよ。

## 任意でのWebpackによるJavaScriptのコンパイル(Optionally compile JavaScript with Webpack.)

[webpacker gem](https://github.com/rails/webpacker) を使えば、簡単に導入できるよ。generatorに`--webpack`を指定してね。

## デフォルトの依存からのjQueryの削除(Drop jQuery as a default dependency.)

`data-remote`や`data-confirm`、そのほかの部分にjQueryを使ってきたけど、[`rails-ujs`をバニラJSに書き換えた](https://github.com/rails/rails-ujs)から必要なくなったよ。

# システムテスト(System tests)

ユニットテストは場合によっては完全なテストのうちの一部であるが、もっとも重要なものではない。ControllerからModel、Viewまでの動作を検証する統合テストははるかに大きな部分を担う。

しかしながら、統合テストを行う場合、JavaScriptに依存している場合に大して役に立たないし、今日ほとんどのWebアプリケーションはJavaScriptに少なからず依存している。それで実際のブラウザを使ったテストが行われ始めている。

Rubyでは現状の答えがCapybaraと呼ばれている。Rails用に設定するのは少し骨でした。今、我々はそれを直接フレームワークに焼き込みました。これを使えばChrome向けに設定済みのCapybaraをラッピングし、Action Dispatchの一部として失敗したスクリーンショットを提供するようにしました。

ブラウザのセットアップの時間により、時間は遅くなるけどテストのカバー範囲は広くなります。

# 暗号化された秘密情報(Encrypted secrets)

バージョン管理すべきでない秘密情報を取り扱うのに、これまではENVを使ったり、その他のソリューションを利用してきた。

[sekret](https://github.com/ahoward/sekrets) gemにインスパイアされて、われわれはRails5.1に暗号化秘密管理をビルトインした。

`bin/rails secrets:setup` を使うことで新たな暗号化された秘密情報を扱うことができるようになった。これはマスターキーをリポジトリーの外に持っていくが、本物のプロダクションの秘密情報をリポジトリにコミットさせてくれる。プロダクションでの復号化はkey fileを挿入するか、`RAILS_MASTER_KEY`を`ENV`内に入れることで行える。

# パラメータ化されたメーラー(Parameterized mailers)

ActionMailerはActionControllerをモデルにしている。Abstract Controllerを通して基盤を共有しているが、長きに渡ってアクション間でのロジックの共有する良い方法がなかった。

ActionControllerではbefore_actionなどを通じて、ある程度ロジックの共通化ができていたが、ActionMailerは引数を指定して呼び出す関係上、アクションの前に呼び出されるメソッドが作りづらかった

パラメータ化されたメーラーでは、Controllerのように汎用的なparamでメーラーを呼び出すオプションを提供します。これはデフォルトのfrom / toと組み合わされメーラーのアクションを劇的にDRYにする。

# 直接・解決されたルート(Direct & resolved routes)

新たなリソースのルートを定義するシンプルなAPIがあったけれど、paramsによって変えるような場合は独自の面倒なルーティングがひつようだった。

直接ルートを使えば、Rubyの仕様を利用して様々なことを行うことができる。

解決済みのルートでは、互換性のあるメソッドを元にしたポリモルフィックな検索ができるようになる。これは`link_to @comment` を最終的に `message_path(@comment.parent, anchor: "comment_#{@comment.id}")` に変更することが可能になる。

# `form_tag`と`form_for`を`form_with`に統一(Unify form_tag/form_for with form_with)
tess-twoでAndroidアプリにOCR機能を追加する

[SlideViewer](https://play.google.com/store/apps/details?id=hm.orz.chaos114.android.slideviewer) というアプリをリリースしています。

そこでは、[Speaker Deck](https://speakerdeck.com/) のスライドを表示できているのですが、テキストをコピーしたりはできません。

そこで、 https://github.com/noboru-i/SlideViewer/pull/44/files の変更を加えて、OCR機能を追加しました。

## tess-twoを導入する

[Tesseract](https://github.com/tesseract-ocr/tesseract) というOCRのライブラリを利用することにしました。

[rmtheis/tess-two](https://github.com/rmtheis/tess-two) というTesseractのラッパーライブラリが、Androidへの導入には簡単そうでした。

READMEに書いてあるとおり、`compile 'com.rmtheis:tess-two:6.2.0'`を追加します。

また、NDKが必要とのことだったので、 [プロジェクトへの C / C++ コードの追加 | Android Studio](https://developer.android.com/studio/projects/add-native-code.html) を参考にインストールしました。
現在だと、 [LLDB]、[CMake]、[NDK] の3つをSDK Managerからインストールするだけで大丈夫でした。

## 言語ファイルのダウンロード

[Pre-requisites](https://github.com/rmtheis/tess-two#pre-requisites)に記載の通り、`.traineddata`といったファイルが必要です。
[`OcrUtil.download`](https://github.com/noboru-i/SlideViewer/pull/44/files#diff-3463f8939f9f96f4a005fcbd307ea55aR49) として実装してみました。

ディレクトリ名にも規則があるらしく、[こんな感じ](https://github.com/noboru-i/SlideViewer/pull/44/files#diff-3463f8939f9f96f4a005fcbd307ea55aR100)でディレクトリを生成しました。

`OkHttp`でダウンロードして、`FileOutputStream`で書き込みました。

## 解析する

https://github.com/noboru-i/SlideViewer/pull/44/files#diff-58c7b26f0bf059f14d726dd10196893bR426
GlideのasBitmapを利用して、Bitmapを取得します。

`OcrUtil.recognizeText`で実際の解析処理を行っています。
画像が`Bitmap.Config.ARGB_8888`形式じゃない場合もあり、それだとエラーが発生してしまうので、揃えるように変換します。

## 結果

![image](https://qiita-image-store.s3.amazonaws.com/0/8708/c41c1588-d10f-91e9-a6c8-fe61bc2b77f4.png)

こんな感じで、テキストを解析できています。
ただ、背景の画像が複雑な場合や、文字が細かい場合などは上手く認識できない場合が多そうです。
また、日本語の辞書をダウンロード出来る機能も付けていますが、そちらを利用しても、日本語の認識は精度が低そうです。
また、2つの言語を同時にしていしたりもできず、日本語と英語が混じったテキストの認識はプログラム側でなにかしてやらないと意味ないかもしれないです。
VPCが異なる３つのRDSへの接続を実験してみた(2つは同じ)

# はじめに

RDSをそれぞれ違うVPC内にたてて、ec2インスタンスから接続する実験をしてみました。
構成は下の図のようになってます。

![スクリーンショット 2017-03-05 17.55.53.png](https://qiita-image-store.s3.amazonaws.com/0/85232/abbf4ab7-d7a6-c177-8a2d-ec5268537180.png)


試したことは次の2つです。

1. step serverからrds-b-0に接続しようしたらどうなるか
2. step serverからrds-b(rds-aと同じプライベートIP)に接続しようとしたらどうなるのか

# rds詳細

## rds-a

host: rds-a.c93yeblz8r51.us-west-2.rds.amazonaws.com
プライベートIP: 10.0.0.9
db名: db_a
user名: aaa
security group: step serverからの接続のみ許可

## rds-b-0

host: rds-b-0.c93yeblz8r51.us-west-2.rds.amazonaws.com
プライベートIP: 10.0.0.24
db名: db_b
user名: bbb
security group: どこからも許可しない

## rds-b

host: rds-b.c93yeblz8r51.us-west-2.rds.amazonaws.com
プライベートIP: 10.0.0.9
db名: db_b
user名: bbb
security group: どこからも許可しない

# step serverからrds-b-0に接続しようしたらどうなるか

まずrds-aとrds-b-0のプライベートIPを確認します。
2つのIPは違います。

![スクリーンショット 2017-03-05 17.59.37.png](https://qiita-image-store.s3.amazonaws.com/0/85232/125a8406-1d31-0f15-91b6-bd4b32d8d7b8.png)


次にrds-aに接続できることを確認します。
もちろん接続できます。

![スクリーンショット 2017-03-05 18.07.46.png](https://qiita-image-store.s3.amazonaws.com/0/85232/ed4c46ac-41b6-19e3-bba8-ee727fac03b8.png)


次にrds-b-0に接続してみます。
もちろん繋がりません。

![スクリーンショット 2017-03-05 18.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/85232/999d8d93-6765-6b83-fbda-4a24b16a9fe3.png)

ここで、user名とpasswordをrds-aの値で接続してみようと思います。
こちらも繋がりません。

![スクリーンショット 2017-03-05 18.11.17.png](https://qiita-image-store.s3.amazonaws.com/0/85232/7ce783cd-e069-9edc-9198-99631661e0e6.png)


# step serverからrds-b(rds-aと同じプライベートIP)に接続しようとしたらどうなるのか

まずrds-aとrds-bのプライベートIPが同じことを確認します。

![スクリーンショット 2017-03-05 17.25.27.png](https://qiita-image-store.s3.amazonaws.com/0/85232/5da8dd45-7d5d-8a79-f39d-1bc0e163c5d2.png)

どちらもIPが10.0.0.9になっていることがわかると思います。

この状態で、まずrds-aに接続してみます。
当たり前ですが、繋がります。

![スクリーンショット 2017-03-05 17.28.03.png](https://qiita-image-store.s3.amazonaws.com/0/85232/de2688bf-5267-80ac-a38e-22ccb3d90cbd.png)


次にrds-bに接続してみます。
こちらは接続できません。

![スクリーンショット 2017-03-05 17.29.47.png](https://qiita-image-store.s3.amazonaws.com/0/85232/4dfa4968-b314-3ab1-8190-aaec91ddc0ea.png)


ここで、user名とpasswordをrds-aの値で接続してみようと思います。
するとhostにrds-bを指定しているにも関わらずrds-aに繋がってしまっていることがわかります。

![スクリーンショット 2017-03-05 17.32.01.png](https://qiita-image-store.s3.amazonaws.com/0/85232/1d2c7bd9-6f6d-ac92-43cd-c4eaace24687.png)


これは、rds-bの名前解決したときに割り出される10.0.0.9が、VPC内のrds-aのプライベートIPになっているため、rds-bのホストで接続しに行ってるにも関わらずrds-aに接続できてしまっているようです。


# 補足

今回サブネットの範囲を最小限にして、プライベートIPができるだけかぶるようにしました。
今回はたまたま2回目で同じになったので良かったです。。
かかったお金$0.5くらい
windowsのunite.vim

もう、vimはneovim,neobundleはdein,uniteはdeniteに移行しろというのはわかるのだが、どうも、windows環境がうまくいっているのかわからない。

けっこう移行にかかりそうなのでとりあえず、今日のメモ

# neobundleでunite.vimが変
まあ、これがきっかけである。NeoBundle 'Shougo/unite.vim'がbat targetとかになってしまうのである。これはきっと、neobundleをバージョンアップしたからじゃないかともおもうのだが・・

#っでいろいろ試した結果
~/.vim直下で
git clone https://github.com/Shougo/unite.vim
としたあと、
_vimrcで
if has("vim_starting")
 set rtp+=c:/users/ume/.vim/bundle/neobundle.vim/
 set rtp+=c:/users/ume/.vim/unite.vim

こんな風にして、rtpを追加したら、ようやく:Unite fileコマンドが動いた。

どうして普通の
NeoBundle 'Shougo/unite.vim'
が動かないんでしょうねえ？

neobundleをバージョンダウンすればいいのかなあ？

まあ、それより、neovimなんでしょうけど、なんかwindowsのサポートが弱そうでちょっと困ってます。macにしようかなあ？

# その後
neobundle https://guthub.com/Shougo/unite.vim
だと、ちゃんと動いたんだが、これは直したからかなあ？
sshの鍵認証設定でつまずいたところ

当方VPS初心者で、sshを人生で初めて自分で行ったのですが、セキュリティのために鍵認証設定というものをしなくてはならないらしい。そこで、[ドットインストール](http://dotinstall.com/lessons/basic_sakura_vps/8007)を参考にしながら設定をしていました。鍵を生成してサーバーに送るまではやったものの鍵認証でsshできなかった原因をメモ。

# サーバー側のsshdの設定ファイルを書き換える
これができてなかっただけでした。ドットインストールでは言ってなかったんだけどな〜（笑）ということで設定方法を書いてく。

```
su
passwd:
```

まずrootでサーバーに入る。パスワードを入力。そしてsshd_configというsshdの設定ファイルを書き換えます

```
vim /etc/ssh/sshd_config
```

ここの行をコメントを外す

```
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
```

保存して一度exitし、もう一度自分のパソコンからsshしてみたらできました。やった！
Ryzenで爆速yaourt

## はじめに
AMDのRyzen買ったんですよーいやー早く…あれyaourtがmake1スレッドしか使ってくれなくて寧ろ遅いんっですけど!？!？ ってなったので早くするTips。Ryzen自慢したかっただけでRyzen以外のマルチコアCPUでも普通に使える話。

## /etc/makepkg.conf
このあたりの処理はmakepkgがやるので、こいつにMAKEFLAGSを設定してやるだけ。簡単〜。

```
#MAKE_FLAGS="-j2"
```

のコメントアウトを外して好きな数にすればいいんじゃないかな。Ryzenは実コア8仮想コア16だから-j17にしたけど多過ぎかもしれない。
ROS(Kinetic Kame)での注意点

現在のROS環境としてUbuntu 16.04、ROS Kinetic-Kameを使用していますが、以前のROS環境と比較したときに、現在のROS環境ではできなくなっていることがいくつかありましたので備忘録としてまとめていきます。なお、以前と現在の環境は以下の通りです。

__<以前>__
・Ubuntu <font color="Blue">14.04</font>
・ROS version <font color="Blue">Indigo</font>

__<現在>__
・Ubuntu <font color="Red">16.04</font>
・ROS version <font color="Red">Kinetic Kame</font>


# usb_camパッケージがインストールできない
インストールできないというよりかは、Ubuntu 16.04でusb_camパッケージが存在しないと言ったほうが正しいかもしれない。

該当パッケージを検索しても何も出てこなかった・・・・

```bash
$ apt-cache search ros-kinetic-usb-cam
```

一応解決策はありまして、usb_camパッケージをソースコードから落としてきて手動でビルドすればよい[^1]。

```bash
$ cd ~/catkin_ws/src
$ git clone https://github.com/bosch-ros-pkg/usb_cam.git
$ cd ..
$ catkin_make
```

# disparity画像が表示されない
[image_view](http://wiki.ros.org/image_view)パッケージのstereo_viewノードを使用した際に、disparity画像が表示されないというものです。
以前の環境ではちゃんと表示されていました。（以下のブログを参照してください。）
・[ROSを使ったSLAM構築-備忘録1](https://crafty-as-a-fox.tumblr.com/post/136383808861/ros%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fslam%E6%A7%8B%E7%AF%89-%E5%82%99%E5%BF%98%E9%8C%B21)

この現象をググってみると、同じような問題に直面している人いるようです。
・[image_view stereo_view don't show image or disparity (ROS Kinetic)](http://answers.ros.org/question/236600/image_view-stereo_view-dont-show-image-or-disparity-ros-kinetic/)
記事によると、どうやらdisparityトピックのheightとwidthの値が予期しない値になっている模様。
実際にやってみると、確かに化けた値になっているようにも思える。

__＜確認コマンド＞__

```bash
$ rostopic echo /stereo/disparity
```
__＜結果＞__
height: <font color="Red">4294967281</font> width: <font color="Red">4294967218</font>

これはひとまずimage_viewパッケージのバグと見なして修正されるのを待つのが良さそうです。

__[2017/06/10 追記]__
最新版では本バグは修正済みのようです。
こちらでも正常にdisparity画像が表示されるのを確認できました。

# 参考文献
[^1]: づーまー日記：[【備忘録】 ROS Kinetic でusb-camのインストール方法＆使い方](http://zumashi.blogspot.jp/2016/12/ros-kinetic-usb-cam.html)
自己証明書でnginxにSSL(TLS)対応する

自己証明書を使ってnginxにSSL対応をします。
とても簡単です。

本記事ではSSLと記述しますが、本来であればTLSというのが正しいです。
SSLプロトコルは脆弱性の影響で廃止され、多くのブラウザではすでに支援が終わっています。
今はSSL3.0を基盤＋脆弱性に対応したTLSが基本ですが、SSLという名前が既に固着していて混乱を避けるためにあえてSSL使うところがおおいです。


##必要なパッケージ確認＆インストール
自己証明書発行のためには以下のパッケージが必要です。
openssl、openssl-devel、openssl-libs
インストールされているか確認してみて、なかったらインストールしましょう。

確認

```
# rpm -qa | grep openssl
openssl-devel-1.0.1e-60.el7_3.1.x86_64
openssl-libs-1.0.1e-60.el7_3.1.x86_64
openssl-1.0.1e-60.el7_3.1.x86_64
```

インストール

```
# yum install openssl openssl-devel openssl-libs
```

##自己証明書を発行


```
# mkdir /etc/nginx/ssl
# openssl req -new -x509 -sha256 -newkey rsa:2048 -days 365 -nodes -out /etc/nginx/ssl/nginx.pem -keyout /etc/nginx/ssl/nginx.key
```
いろいろ聞かれますが、練習用でやっているのでそのままEnterで大丈夫です。
2つのファイルが作成されますが、それぞれ
nginx.key：暗号化鍵
nginx.pem：自己署名証明書
になります。

重要な情報なので権限設定を厳重にしましょう。

```
# chown root:root -R /etc/nginx/ssl/
# chmod 600 /etc/nginx/ssl/*
# chmod 700 /etc/nginx/ssl
```


##nginx.conf編集

```
# vi /etc/nginx/nginx.conf


server {
    listen 80;
    # httpsにリダイレクト処理
    return 301 https://$host$request_uri;
}


server {
    listen 443 ssl;
    server_name _;

    # 自己署名証明書
    ssl_certificate /etc/nginx/ssl/nginx.pem;
    # 暗号化鍵
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    # 他の要素は80ポートど同じく設定してください。
}
```
npm インストール失敗

# npm インストール失敗
npm installを実行したらこんなのが出ました。

npm ERR! install Couldn't read dependencies
npm ERR! Failed to parse json
npm ERR! Unexpected token /
省略

解決方法がわからず、
「/var/apps/crowi」直下で「npm install」を実行したらうまくいきました。
今までは「/var/apps」直下で実行して問題なかった。
Visual Studio Code で minimap を有効にする


# minimap とは
mimimap というのは、エディター画面を縮小表示させたスクロールバーのようなものです。
Atom をお使いの方であれば同名のパッケージを導入されている方も多いと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/0a4baac1-2816-9199-247f-ed2d28a8370f.png)

先日の Visual Studio Code の version 1.10 へのアップデートで、プレビュー版として標準で minimap が使えるようになりました。デフォルトでは無効ですので有効にする設定方法をご紹介します。

# 設定方法
[ファイル]-[基本設定]-[基本設定]で開く[ユーザ設定]または[ワークスペース設定]で
`"editor.minimap.enabled": true`を追加します。再起動は不要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/a61a3b49-aba2-6772-e297-2b2f2a67fcdd.png)

これで有効になります。通常時は隠れたりする機能は今のところないようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/124069/93c68a35-d2a3-89c4-a3e9-fad1011b6ca7.png)
cannot load such file -- bcrypt_ext 対処方法【Rails】

deviseの動作確認中にエラーが発生しました。

## **環境**
* windows 8 64bit
* Rails 4.1.16
* Ruby 2.3.3

## **エラー**

サインアップボタンを押した後に、以下エラーが発生しました。
「bcryptファイル読み込めませんよ」といった内容のようです。

![load.png](https://qiita-image-store.s3.amazonaws.com/0/158572/78f50a54-52f7-8e4e-6bc6-c99dbb1b1c22.png)


## **対処方法**

```rb:Gemfile
gem 'bcrypt-ruby'
```
gemのようなのでインストールします。
Gemfileに以下を追記して、`bundle install`でインストールします。

サーバー再起動して、確認すると同じエラーが発生しました。なんでだ！
<br>
調べると、どうもバージョンが関係しているようなので指定してインストールしなおします。
先ほどインストールで入ったbcryptのバージョンは bcrypt-ruby 3.1.5 (x64-mingw32) です。

以下のようにGemfileを修正し、再度インストール。

```rb:Gemfile
gem 'bcrypt-ruby', '~> 3.0.0'
```
バージョン bcrypt-ruby (3.0.1) がインストールされました。
サーバーを起動して、動作を確認すると・・・・・・動きました！

なぜ、バージョンを変えるとうまくいくかは調べてもわかりませんでした。
時間ができたら調べようと思います。
GitLab CIでreveal-ckをビルドする時のTips

[GitLab Meetup Tokyo #1](https://gitlab-jp.connpass.com/event/49755/) で発表した [ここがすごいよGitLab CI](https://sue445.gitlab.io/gitlab-meetup-tokyo-1/#/) はreveal-ckを使ってたのですが、GitLab CIでビルドするにあたって幾つか工夫した点があるので紹介します。

たぶん他のツールを使う場合にも応用できると思います

# スライドのリポジトリ
https://gitlab.com/sue445/gitlab-meetup-tokyo-1

今回紹介しているTipsは全部このリポジトリからの引用です

# reveal-ckとは？
https://github.com/jedcn/reveal-ck

[reveal.js](http://lab.hakim.se/reveal-js/) をちょっと便利にしたラッパツールのようなものです。

詳しくは下記で紹介しています

[reveal.js + markdownでスライドを作る時は reveal-ck が便利だった - くりにっき](http://sue445.hatenablog.com/entry/2015/10/03/201241)

# GitLab CIでreveal-ckをビルドする時のTips
## reveal-ckはbundlerで依存管理する
下記内容で `Gemfile` を作成。

```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem "reveal-ck"
```

`bundle install` を実行。作成された `Gemfile.lock` をコミット。

`.gitlab-ci.yml` を下記のように設定

```yaml:.gitlab-ci.yml
variables:
  BUNDLE_CACHE: "vendor/bundle/"

cache:
  untracked: true
  key: "$CI_BUILD_NAME"
  paths:
    # variables.BUNDLE_CACHEと同じものを指定する
    - vendor/bundle/

before_script:
  - bundle check --path=${BUNDLE_CACHE} || bundle install --path=${BUNDLE_CACHE} --jobs=2 --retry=3
```

### 理由
* インストールしたgemをGitLab CIのキャッシュに載せるため
  * 毎回 `gem install reveal-ck` すると遅い
  * 上記のような設定にしておくとビルドが正常終了にした時にRunnerにキャッシュが保存されるので、次に同じRunnerでビルドされた時にキャッシュからgemが読まれてビルドが早くなる
* 依存してるgemのバージョンをロックするため
  * reveal-ckに限ったことではないですが、最新になった時に急に動かなくなることがあるので依存しているgemも含めてバージョンは固定しておいた方が安全
  * 以前reveal-ckの中で使ってるcelluloidのバージョンが上がった時にreveal-ckが動かなくなるという事象があり、`Gemfile` でcelluloidを古いバージョンで固定する必要があった [^celluloid]

[^celluloid]: https://github.com/jedcn/reveal-ck/issues/58

## Rakefileでコマンドを短縮する
普通に `reveal-ck generate` するとslidesディレクトリにスライド一式が作られるのですが、GitLab Pagesに公開するためにはpublicディレクトリに静的ファイルを作る必要があります

`.gitlab-ci.yml` くらいなら `reveal-ck generate --dir=public` って書いてもいいと思うんですが、ローカルで毎回 `--dir=public` って書いて実行するのも大変なので自分は `Rakefile` でラップしています。[^local]

[^local]: まあローカル実行時にslidesディレクトリを使ってもいいんですが、本番とローカルの状態は合わせておいた方が何かと健全なのでローカル実行時もpublicディレクトリ使うようにしています

さっき作った `Gemfile` にrakeを追加して

```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

gem "rake"
gem "reveal-ck"
```

Rakefileを作成

```ruby:Rakefile
DIST_DIR = "public"

desc "generate slide to #{DIST_DIR}/"
task :generate do
  sh "reveal-ck generate --dir=#{DIST_DIR}"
end

desc "serve slide"
task :serve => :generate do
  sh "reveal-ck serve --dir=#{DIST_DIR}"
end

task default: :serve
```

`bundle exec rake generate` でpublicディレクトリにスライドを作って、`bundle exec rake serve ` でローカルでサーバを実行してスライドを表示


publicディレクトリが存在しない場合に `serve` を実行するとサーバは実行できるけどスライドが表示できないため、`:serve => :generate` で `serve` の前に明示的に `generate` を実行しています。

`task default: :serve` は `rake` にタスク名が渡されなかった場合に実行したいタスクを設定。
今回の場合だと `bundle exec rake` で `serve` が実行されます。

`bundle exec ～` なんてtypeしたくない人は `~/.bashrc` 辺りにalias設定推奨

```bash:~/.bashrc
alias be='bundle exec'
```

あと、ローカルで作ったpublicディレクトリがコミットされないように `.gitignore` に下記を書いておくといいでしょう。

```:.gitignore
public/
```

GitLab CIでのデプロイ時にもRakefileで作ったコマンドを使うように設定

```yaml:.gitlab-ci.yml
pages:
  stage: deploy
  script:
    - bundle exec rake generate
  artifacts:
    paths:
    - public
  only:
    - master
```
サーバサイドSwiftの現状考察 #tryswiftconf

厳密にはSwiftをLinuxで動かすとどうなのという話です

# try! Swift 2017の復習

SwiftのWeb APIとアプリをともに構築する / Building a Swift Web API and Application Together → [niwatakoさんのブログ]
(http://niwatako.hatenablog.jp/?page=1488442126)
[様々な場面でSwiftを使う / Swift Outside the Box](https://speakerdeck.com/yusukeito/swift-outside-the-box)
サーバサイドSwiftの実例 / Server-Side Swift Live Coding → [niwatakoさんのブログ](http://niwatako.hatenablog.jp/?page=1488524821)

# SwiftをLinux上で動かす

tar.gz

 * 公式の説明: https://swift.org/download/#installation-1
 * Vaporの説明: https://vapor.github.io/documentation/getting-started/install-swift-3-ubuntu.html

もしくは

[Docker](https://hub.docker.com/r/_/swift/)

依存物がそこそこあるのでDockerが楽。

# 注意するところなど

## 対応OS

3.0.2(今の最新のリリース版)だとUbuntu 16.04かUbuntu 14.04指定。
3.1(スナップショット版)だとUbuntu 16.10用の物もある。

ラズパイ対応のものもあるらしい。が、こちらもOSはRaspbianではなくUbuntuでないとダメな模様。
[Swift 3.0 on Raspberry Pi 2 and 3](http://dev.iachieved.it/iachievedit/swift-3-0-on-raspberry-pi-2-and-3/)
[Building Swift 3.0 on a Raspberry Pi 3](http://dev.iachieved.it/iachievedit/building-swift-3-0-on-a-raspberry-pi-3/)
[uraimo/SwiftyGPIO: A Swift library to interact with Linux GPIO/SPI on ARM (RaspberryPi, BeagleBone, CHIP, etc...)](https://github.com/uraimo/SwiftyGPIO)

## CoreFoundation

リポジトリ: https://github.com/apple/swift-corelibs-foundation

Mac上で呼ばれるいつものFoundationと違い、Swift on Linuxで呼ばれるFoundationは未完成。

例えばSwift3.0.2で

```swift
import Foundation

URLSession.shared
```

とやると、実行時に `fatal error: shared is not yet implemented: file Foundation/NSURLSession/NSURLSession.swift, line 200` とされてしまう。
[swift-3.0-branchの該当箇所](https://github.com/apple/swift-corelibs-foundation/blob/swift-3.0-branch/Foundation/NSURLSession/NSURLSession.swift#L200)を覗いてみると、確かに `NSUnimplemented()` の文字が。

一応URLSession.initは存在しているので、引数を与えれば取れないことはない。

```swift
import Foundation

URLSession(configuration: URLSessionConfiguration())
```

現状未完成のURLSessionを取ったところで何かが変わるというわけでもないが。

進捗状況はリポジトリ内のDocsから確認することができる。
https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Status.md

対応策としては、自作するか、無難に先人が作ったライブラリを探してきてやりたいことを実現できるか検討することになる。要はFoundationに依存しないSwiftライブラリであったりCライブラリであったりを探さなければならない。

なお、Swift Outside the Boxを発表されたnovi_さんがURLSessionを採用しなかったのは、クローラに必要な細かい操作をやるのにURLSessionでは厳しかったからとのこと。

## Cライブラリ

Swift Package ManagerはCライブラリを呼ぶことができる。
https://github.com/apple/swift-package-manager/blob/master/Documentation/Usage.md#require-system-libraries

しかしその実態は
「Cライブラリのリンクを持つモジュールを別パッケージのかたちで __自作して__ 呼ぶ」
というもの。各開発者が独自に作成できてしまうので、モジュール名の衝突が発生する恐れがある。最終的には同じライブラリを呼ぶのに。

例えば[GitHubでCCurlを検索](https://github.com/search?utf8=%E2%9C%93&q=CCurl)すると[IBM-Swift/CCurl](https://github.com/IBM-Swift/CCurl)を筆頭に大量のcURLが存在しているのがわかる。使いたいライブラリ群がそれぞれ別のCCurlを呼んでいた場合、CCurlというモジュール名が衝突して両立できない事態に陥る。

# まとめ

Foundationの実装待ち、開発者間の共通ルールや認識の確定待ちの部分があるので注意。
Webアプリフレームワーク界隈では開発者間で話し合いが持たれているらしいが、果たして。

サーバサイド事情を教えてくださったみなさまありがとうございました！
「アート・オブ・コミュニティ」読んでまとめにゃ！！（途中まで）

## tl;dr

ひょんなことから、コミュニティの立ち上げぽいことをするわけで・・・

積み本を本棚から取り出して、自分なりに要約して理解を深めるためのもの

* 注意 ４章以降は、コミュニティが運営が進んだらの話なので書くか？どうかは不明
* 注意 書評の記事がいくつか、ネタが被らないようにと書き方（Team Geek系）さらっと読みました

## 1章 アート・オブ・コミュニティ

    偉大な業績は衝動的に生まれるものではなく一連の小さなことの積み重ねによってもたらされる
    -- ヴィンセント・ヴァン・ゴッホ

### コラボレーション駆動のエートス

* 「エートス(ethos)」：同じ思想を持つ仲間の中を流れる信念、習慣、感情が組み合わさったもの
* 「ニール」：地球上にいる一緒に「エートス」を共有している人
 （グループを作ったり、メーリングリストに加入したり、ミーティングしたり）

「ニール」とのコラボレーションにより、「エートス」を駆動させる

### コミュニティの本質

* 「コミュニティの本質」＝「一体感」=「信用経済」
* 「一体感」：ポジティブな信用経済によるポジティブな成果
* 「信用経済(social capital)」：栄誉、敬意、好意、信頼、知名度、影響度、至高、偉大さ、レバレッジ

裕福さや生活水準で資本主義経済を評価するように、「一体感」の強さで信用経済の強さを判断できる

「エートス」≠「一体感」なため、コミュニティの継続には、「エートス」と「一体感」の間でのバランス管理が必要となる

### コミュニケーションの基礎

コミュニティはコミュニケーションが存在し、その背後にあるメカニズムは「ストーリー」があり２つに大別できる

* 「物語」：娯楽的、経験の話
* 「寓話」：裏に隠れるメッセージを説明するように構成

### コミュニティマネージャー

コミュニティの構築は芸術と似ている。共有の特性について、その先の個性の領域まで昇華させるような努力が必要です

* 信用こそ全て
* 聞くことの価値
* エゴを避ける
* 理論 vs 行動:行動が勝つ
* 自分自身になる



## ２章 コミュニティ計画

    私たちは全員一緒に絞首刑にならなければなりません。
    そうでなければ、全員、ばらばらに刑に処されるでしょう
    --- ベンジャミン・フランクリン


### コミュニティ計画

* コミュニティをチームに分割する方法を決める
* それぞれのチームが明確かつ効果的にコミュニケーションできるように保証する
* 幅広いサポーターがを引き込む
* 目標に向かっていく環境を構築する

### 一体感を生み出す構成要素

* チームごとに相互に理解しやすいスコープを定義する
* チームの貢献の範囲を理解する
* 多様性の尊重と機会を利用することを推奨する
* 行動規範を作成する


### コミュニティのデザイン

* 「ミッションは？」「コラボレーションを行う機会、及び領域はどこか？」「必要スキルは何か？」から戦略を立てる

* 戦略をオープンな中で焼き上げる

* 決められた期間で目標ををまとめ、組織やコミニュティないの合意事項の重要事項を提供する


## ３章 風通しの良いコミュニケーション

    話をする前に、話さなきゃいけない重要なものを持っていたんだ
    --- グルーチョ・マルクス

”演奏するのは音符ではない、間合いを演奏するんだ”

目立つ要素（音符）に目が向きますが、隠されたメッセージ（休符）の方が、大きな価値をもたらすことが多い

コミィニティにとっての、以下の間を埋めるものがコミュニケーション

* 「間合い」：コミュニティの空気を理解すること
* 「目立つ要素」： プロセス、運営、ツール、一緒に働くための方法
* 「隠された要素」：一緒に進行するうえで、他の人と共有していくために必要な雰囲気


### チャンネル/メディア/コンテンツ

* 受信、送信、内部のコミュニケーションチャンネルを設置
* メーリングリスト、フォーラム、チャットなど目的によって選択
* 研究機関のように書かない、トーンを設定する、コミュニティを盛り上げる



## 参考

* 本とか

  * [アート・オブ・コミュニティ ―「貢献したい気持ち」を繋げて成果を導くには (THEORY/IN/PRACTICE)](https://www.amazon.co.jp/dp/4873114950)
  * [追加？第１１章](http://www.oreilly.co.jp/pub/9784873114958/)
  * [原文のダウンロードリンク](http://www.artofcommunityonline.org/get/)

* アート・オブ・コミュニティ記事

  * [『アート・オブ・コミュニティ』――コミュニティ運営は、猫を集めることに似ている](http://el.jibun.atmarkit.co.jp/bookshelf/2011/10/post-804f.html)

  * [アート・オブ・コミュニティの感想～コミュニティは信用貯金という信用経済から成り立つ](http://forza.cocolog-nifty.com/blog/2015/03/post-030a.html)
  * [アート・オブ・コミュニティ出ます](http://blog.shibu.jp/article/45345615.html)
  * [アート・オブ・コミュニティを読んだAdd Star](http://d.hatena.ne.jp/hyoshiok/20110622)

* Team Geek の記事

  * [『Team Geek ―Googleのギークたちはいかにしてチームを作るのか』まとめ](http://qiita.com/kenju/items/e216c367f5804d12fbb8)
  * [Team Geekを読んだ](http://yut.hatenablog.com/entry/2016/05/02/021827)
DDNSで変動IPアドレスにドメイン名を設定する。

一般的な自宅ネットワーク環境では一定周期で変動するIPアドレスをプロバイダから割り当てられています。
外部から自宅にアクセスする場合、別途固定IPアドレスを取得しそのIPアドレスに対してアクセスする必要があります。

基本的に固定IPアドレスは取得するのに料金がかかるため、個人的にちょっと外部からアクセスしたい場合できれば無料がいい…
そこでDDNS(ダイナミックドメインネームシステム)を使用することでアドレスに名前を設定しIPアドレスを意識せずにアクセスすることができます。

##設定方法
今回公開する方法は以下が前提になります。
- DDNSのサービスはieServerを使用
- DDNSにIPアドレスを登録する端末はLinuxを使用
- Linux端末が停止中はIPアドレス変化しても登録は行われない

1.ieServerにアカウントを取得する。
![SnapCrab_無料・ダイナミックDNS(DDNS)サービス - ieServerNet - Google Chrome_2017-3-1_22-25-41_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/164226/c2be8350-dac0-6e8b-069e-38bd6309543d.png)

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/164226/3b945202-35c7-623b-7aef-ba7a8a5fdd5b.png)

2.crontabでIPアドレスの自動登録設定
crontab設定するためのエディタ起動

```
crontab -e
```

10分間隔でieServerへIPアドレスの更新を行うコマンドを設定

```
*/10 * * * * wget --post-data="username=ユーザ名&domain=ドメイン名&password=パスワード&updatehost=1" https://ieserver.net/cgi-bin/dip.cgi
```

以上の設定で、変動アドレスを名前でアクセスできるようになります。
dockerコマンドのショートカットをプロジェクトに設置する

```
project
  |- docker-compose.yml
  `- docker
      |- web
      `- nodejs
```

とすると、例えば `web` コマンドに対してコマンドを実行させたい時は

```
docker-compose run --rm web php artisan migrate
docker-compose run --rm nodejs npm install
```

とするわけで、これは素のコマンド

```
php artisan migrate
npm install
```

よりちょっと長い。

毎回打つのは面倒なので、下記の構成にしたところいい感じ。Dockerを挟んでいるということを感じない。

```
project
  |- docker-compose.yml
  |- bin
  |   |- php
  |   |- npm
  |   `- node
  `- docker
      |- web
      `- nodejs
```

例えば `bin/php` の中身はこんな感じ

```
#!/bin/bash

cmd="docker-compose run --rm web php $@"

echo $cmd
$cmd
```

これで、 `bin/php artisan migrate` で各種コマンドを実行できる。

Railsの `bin/rails` みたいなイメージです。

他にいいやり方があればコメント頂けると嬉しいです。
自分のプログラミングに壁を感じたら「言語の動作原理」に突入する

個人的に、自分のプログラミングの技量に限界を感じ、
どうしても越えられない壁をどうやったら越えることができるか
を考えた中、気がついたことをメモしておきたいと思います。

具体的に現在やっていることは、主に
「プログラミング言語の利用者としての立場」で限界を感じているため、
「プログラミング言語の設計・実装・生産者が何を考えているのか」
を頭に入れるということです

オブジェクト指向はブラックボックス化と抽象化を実現し、
特に多人数での開発や商業的な開発に向きますが、
逆にホワイトボックス化する
＝オブジェクト指向が構造化プログラミング言語（C)でどのように実装されているかを知る
ということも重要なのではないかと思います。

何にでも通じることかもしれないのですが、
「”動作原理”をもっと深く知る」ことで、限界を越える方法です。

「yacc、lex系統の使用方法を知っていてBNF記法を読める」
というようなことも必須ですが、
中間共通言語の生成・VMを持つ言語が多くなっていることも踏まえると、
「計算機科学」そのものをもっと根本から深く理解する必要性を感じました。
（ちょっと適当に列挙していますが）
色々なキーワード：チューリング完全、有限オートマトン、スタックマシン、レジスタマシン、
プログラミング意味論、評価戦略、リロケータブルバイナリ、LLVM、第１級関数、グリーンスレッド、ラムダ、関数ポインタ、・・・等、
を「言語生産者側の視点から改めて見直す」
とすると、学ぶべき余地が無限に等しくあることに気がつきました。

もう一つは、「C言語」の存在を甘く見ないということでした。
C言語に対して、
「特定分野を除いて、すぐにお金につながりにくい」
「最近は直感的で便利で新しい言語が沢山出てきているので、　古い言語」
「言語の提供機能や標準ライブラリ関数がメモリ安全ではないので使いたくない」
といった見方もありますが、

「その新しい言語はC言語で作られている」
ということはもっと強く意識すべきだと思いました。
（特に、オブジェクト思考言語については、
C言語の関数ポインタまわりのテクニックはもとより、
動作原理について何の疑問も持たずに
何の迷いもなく使い切ることができるのかどうか、
という点は議論が分かれるような気がします）
C言語は決して薄くて浅い言語ではありません。


また、場合によっては言語の設計情報を英語の原文で読むことも重要ですが、
（例えば、C言語の識別子宣言時の「Clockwise/Spiral Rule」の解説などは、
日本語で読むより英語で読んだほうがわかりやすい）

特に日本人にとって非常にありがたいと思われる参考文献は、
まつもとゆきひろ先生により開発された
Ruby言語の詳細実装を解説した
「Rubyソースコード完全解説」(書籍)です。
多層パーセプトロンの重みを可視化してみる

# はじめに
多層パーセプトロンのニューラルネットワークを学習させた後、何らかの方法で可視化してみないと、ブラックボックスになってしまい、どうなっているのかよく分からない、と感じていました。
入力データが画像の場合は、割と可視化しやすいのですが、単なるデータの場合は、どうしたもんかと調べていたところ、この記事を見つけ、早速試してみました。

Deep LearningをKerasで可視化したい
http://recruit.gmo.jp/engineer/jisedai/blog/deep-learning-keras/

以前書いたこちらの記事
暗号化された通信内の実際のプロトコルを、ニューラルネットワークで識別してみる
http://qiita.com/kznx/items/2eec63ed55740262c9ab
のニューラルネットワークをベースに、上記の記事の手法を使わせていただき、重みを可視化してみました。

# 重みを可視化
入力データ(22次元)から最初のレイヤー(50ユニット)へのすべての重みを 22 x 50 の色で可視化します。また、折れ線グラフは、入力層から次の層への重みの平均を表しており、どの入力データが、次の層に影響力があるかがわかります。この例だと、18, 19の入力データの影響が大きくなっています。

```
    for i in [0, 3, 6, 8, 11, 13, 15]:
        # weights 結果をplot
        w1 = model.layers[i].get_weights()[0]
        plt.imshow(w1, cmap='coolwarm', interpolation='nearest')
        plt.colorbar()
        plt.figure()
        plt.plot((w1**2).mean(axis=1), 'o-')
        plt.show()

```

![weight_visualization.png](https://qiita-image-store.s3.amazonaws.com/0/128327/7fad3138-f96a-163e-932f-026425631451.png)
![weight_summary.png](https://qiita-image-store.s3.amazonaws.com/0/128327/aea735c6-a3ab-7738-bd8f-b790980d9c43.png)

ちなみに18は Total packets in the forward direction、19はTotal bytes in the forward directionということで、一セッションあたりのパケット数やバイト数がプロトコルの識別に重要という、ちょっと意外な結果となりました。
Scrapyのサンプルプログラム

まだまだ改善をしていきますが、自分メモ用的に残します。

#サンプルプログラム
オフィシャルドキュメントを参考に、サンプルプログラムを作成した。
★店舗の一覧から店名と電話番号を取得する
（以前よく買い物していたフィットケアデポさんをサンプルとさせていただきました）

```py3:depo_spider.py
import scrapy


class DepoSpider(scrapy.Spider):
    name = "depo"
    start_urls = [
        'http://www.kamegaya.co.jp/cgi-bin/cl/public/index.cgi/kmg/search/index'
    ]

    def parse(self, response):
        for depo in response.css('div.result'):
            yield {
                'title': depo.css('h3 a::text').extract_first(),
                'tel' : depo.css('li.tel a::text').extract_first()
            }
```

プログラムの実行は以下。
（ググればすぐに見つかるけれど）

```
scrapy runspider depo_spider.py -o depo.json
```
非アクティブになってもアクティブであるかのようなウィンドウフレームを描画する

備忘録です。

``` c++
BOOL CMainFrame::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
	if (message == WM_NCACTIVATE) {
		return CFrameWnd::OnWndMsg(message, TRUE, 0, pResult);
	}
	return CFrameWnd::OnWndMsg(message, wParam, lParam, pResult);
}
```

WM_NCACTIVATE に対する応答で、 wParam=TRUE 、 lParam=0 で DefWindowProc を呼ぶと、ウィンドウが非アクティブになっても、枠の描画はアクティブ状態のような見た目を保つ。
【Swift】ターミナルから実行する方法

#この記事の概要
Swiftは、XcodeプロジェクトやPlayground環境で実行するだけでなく、ターミナルからも実行できるらしいので、試してみた。
だから何？という記事ではありません。
ただ、やり方の覚え書きということで投稿させて頂きました。

#実行環境
- Macbook Pro（Early 2015）
- macOS 10.12.3（Sierra）
- Xcode 8.2.1（[App Store](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12) からダウンロード可能）

Xcodeを使わずに実行すると言っても、XcodeがMacにインストールされている必要があるのです。

#手順
##1. ターミナルを起動する
Macに標準インストールされているアプリケーション「ターミナル」を起動します。
ターミナルは、コマンド（文字列による命令）を使ってMacを操作できます。いわゆるCUI（Charactor User Interface）といわれる操作環境ですが、よく知らないしここではあまり関係ないのでカッツアイします。
ターミナルは、アプリケーションフォルダの「その他」に入っていたりしますが、スポットライトから検索すれば必ず見つかるでしょう。

ターミナルを起動すると、こんな画面になっているはずです。
<img width="570" alt="スクリーンショット 2017-03-05 14.50.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/abc967c2-44cb-2e8c-2ae7-9761d39a3a55.png">
図）表示されている"MBP-2015e-chino"はマシン名、chino$はホームフォルダの名前。

上図は、自分がMacのホームフォルダにいる状態になります。

##2. 実行環境を起動する
ターミナルのswiftコマンドで、実行環境に移動します。

```ruby:ターミナル
$ swift
```
と入力します。
<img width="570" alt="スクリーンショット 2017-03-05 14.54.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/41167988-6994-da5c-0111-9ec64b494cf8.png">
図）swiftコマンドを入力する。

そのまま、Enterキーで実行します。
しばらくすると「ようこそ」メッセージが表示されます。
<img width="570" alt="スクリーンショット 2017-03-05 14.57.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/055c8286-447f-db4f-3b18-b07109a9c0e7.png">

Swiftのバージョンが「3.0.2」ということ以外はよくわかりませんが、歓迎されているようです。

```ruby:ターミナルSwift実行環境
1>
```
の部分から、いつのものようにSwiftプログラムを記述することができます。

###ターミナルでのSwift実行環境の特徴
REPL(Read Eval Print Loop)です。何言ってるかわからないですが、プログラムを一行記述するごとに実行 -> 評価されます。
Playgroundとよく似ていますね。

##3. コードを記述する
簡単なコードを実行してみます。
変数「numberOfApple」に数値の「7」を代入します。

```ruby:ターミナルSwift実行環境
1>var numberOfApple = 7
```
を実行してみると...
<img width="570" alt="スクリーンショット 2017-03-05 15.04.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/7b3e28d1-809f-ff74-b337-f0e560f63dce.png">
図）記述したコードのすぐ下に結果が表示されている。

実行された結果をよくみてみると、型推論されていたIntまで明示されてます。

##4. 終了するには
ターミナルでのSwift実行を終了する場合は、「:」記号の後に「exit」と記述します。
<img width="682" alt="スクリーンショット 2017-03-05 15.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/89f41bef-8406-fae9-e0c6-636036347490.png">
図）終了コマンド

```ruby:ターミナルSwift実行環境
:exit
```
すると、ターミナルは元のホームフォルダに帰ってきます。

<img width="570" alt="スクリーンショット 2017-03-05 15.09.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/70476/1ca3e02b-78c5-a8fc-50ee-f26a93ee99e6.png">
図）Swift実行環境を終了したターミナル

#最後に
何にどう使うかは、ぜんぜんピンとくるものすらありませんでした。とはいえSwiftは今後、サーバーサイドで使用されたりするようなのでXcodeだけでなくこういう実行環境にも違和感なく対応できるようになればと思いました。
活用方法などがわかれば、また投稿・追記したいと思います。