OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10にChainer+CUDA 8.0をインストール

既にQiitaにはWindowsにChainer & CUDA、あとcuDNNをインストールする手順が上がっていますが、その手順でインストールしても、CUDA 8.0を使ったときにGPUを使ったChainerの実行がうまく出来ませんでした。具体的には、CUDAのコンパイラである「nvcc」がコンパイルエラーを起こします（私の環境ではstatus code 2で異常終了しました）。

色々調べたのですが、こちらのページに書かれているように、環境変数INCLUDEを設定すれば解決しました。
http://tadaoyamaoka.hatenablog.com/entry/2016/11/03/163306

ググって出てくる手順に加えて、システム環境変数に「INCLUDE」という環境変数を新規追加し、それに対して以下の２つのパスを指定すればCUDA 8.0でChainerによるGPU演算ができるようになります。
・C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
・C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt

念のため私の行った手順をメモしておきます。ただし、cuDNNはインストールしていません（ダウンロードにはユーザー登録が必要なようで、すぐにはインストールできなさそうでしたので）。なお、インストールしたマシンはSurface Bookです。


１．Visual Studio Community 2015のインストール

まずはVisual Studioのインストールです。Communityの2015をインストールします。私の場合はPythonをVisual Studioで書きたかったので、「Python Tools for Visual Studio」もインストールしました。
<img width="347" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123715/3d152c51-7648-f459-0cd6-31ff50fdd98c.png">


２．Anaconda 64bit版のインストール
Windoos版のAnacondaはこちらからダウンロードできます。
https://www.continuum.io/downloads#windows
私はPython 3.5の64bit版を落としてインストールしました。

あと、私の環境では、Anacondaのインストーラ上で選べるオプションである「Add Anaconda to my PATH environment variable」にチェックが付いていると、PATHの追加に失敗するエラーが発生したので、このチェックは外してインストールしました。もし同じようなエラーが出た場合は、外してインストールし、後で手動でPATHを追加すると良いと思います。PATHに追加したのは以下の3つのパスです（インストール先がC:\Anaconda3の場合）
・C:\Anaconda3
・C:\Anaconda3\Scripts
・C:\Anaconda3\Library\bin


３．CUDA 8.0のインストール
NVIDIAの以下のページからCUDA 8.0をダウンロードし、インストールします。
https://developer.nvidia.com/cuda-toolkit

インストーラの「次へ」ボタンをクリックし続け、インストールするだけです。インストーラ上のパラメータは特にいじらず、すべてデフォルトのパラメータでインストールしました。


４．システム環境変数PATHの編集とシステム環境変数INCLUDEの新規追加
システム環境変数「PATH」の編集を行います。具体的には、以下のパスをPATHに追加します。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

さらに、システム環境変数「INCLUDE」を新規に追加します。そこに、以下の2つのパスを追加します。
・C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\include
・C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt


５．Chainerのインストール
まずpipを最新バージョンにしておきます。
``` C:\> pip install --upgrade pip
```
次に、Chainerのインストールです。
```C:\> pip install chainer
```

以上で完了です。Chainerのサンプルとして用意されているMNISTの手書き文字識別サンプルをGPUで学習させるには、以下のように"-g 0"オプションを付加して実行してください。

```C:\> python train_mnist.py -g 0
```

なお、PythonをVisual Studioでプログラミングする場合、「Python Tools for Visual Studio」がインストールされていれば、Python Environment設定から、使用するPython.exeを指定して下さい。こうすることで、Visual Studio上でのPythonプログラミング時にインテリセンスが表示され、またデバッグ実行が可能になります。こちらのページが参考になります。
http://www.atmarkit.co.jp/ait/articles/1609/09/news047.html
まだtelnet？

DMZにあるサーバから外部（Intelnet）にあるサイトにアクセスできるか確認してほしい、コマンドはコレね、と言い渡されたのが以下。

`$ telnet www.yahoo.co.jp 80`

う～ん、これでもいいんだけど、これだと自分で

`HEAD / HTTP/1.1`
`Host: www.yahoo.co.jp`

って打たなきゃいけないじゃん。イケてない。
なので、`curl`の出番。
curlなら、
`$ curl -I www.yahoo.co.jp`
と打つだけで、ちゃんと同じことをしてくれる。

HTTP/1.1 200 OK
Server: nginx
Date: Mon, XX Nov 20XX XX:XX:XX GMT
Content-Type: text/html; charset=UTF-8
Connection: close
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Expires: -1
Pragma: no-cache
Cache-Control: private, no-cache, no-store, must-revalidate
X-XRDS-Location: https://open.login.yahooapis.jp/openid20/www.yahoo.co.jp/xrds
X-Frame-Options: SAMEORIGIN

curlは他にも色々なオプションがあるので、これを使わない手はないですね。
検索結果の列名を別名で表示する（AS）


## alias (別名)  

別名をよく使うのは二つあり: フィールド別名及びテーブル別名

簡単に言えば、フィールド別名はSQL の結果が分かりやすくなるように使われるもの。前掲の例の中に、売上を合計すると、 SUM(Sales) のフィールド名が出ます。いまの場合は問題がないけど、もし、フィールドが簡単な合計ではなく、複雑な合計になる場合、フィールド名はそれほど簡単で分かりやすいものでないのです。しかし、フィールド別名を使えば、 出られた結果のフィールド名が分かりやすく、簡単に確かめることができます。

二つ目の別名はテーブル別名。テーブルに別名を付ける場合、 FROM 句のテーブル名にスペースを一つあけて、それからテーブルを示せばよい。それは、SQLを使って、複数の異なるテーブルからデータを読み込むのにとても便利なもの。後に触れる結合 (join)の時に見ます。

```
SELECT "テーブル別名"."フィールド1" "フィールド別名"
FROM "テーブル名" "テーブル別名";
```
### asの省略

別名の付与に際しては、AS句を省略することも可能。
次の様な形になります。

```
select * from tb as t;
select * from tb t;
```
ワイルドカードを使用してレコードを検索する（LIKE）


文字列が完全に一致するかどうかを調べる際には、「=」 を使用します。LIKE は「=」をよりあいまいにしたものです。具体的には、LIKE を使用することにより、「○○と一致する」ではなく、「○○という文字が含まれている」という条件を作ることが出来ます。

特に使用頻度が高いのは、「%」を前後両方に付けて「%○○%」などとすることで、文字列のどこかに「○○」が含まれているものを検索する中間一致検索。


| ワイルドカード|意味 | 
|:------------:|:------------:|
| % | 0文字以上の任意の文字列|
| _ | 任意の1文字|
指定した複数の値に一つ以上一致するレコードを検索する（IN）


「○○=△△」という形式の条件を複数回、「OR」で結び付けることが多々あります。もしも○○の部分が同じで△△のみが違う場合、（つまり同じ列に対して値だけを変えて OR 条件としている場合）IN を使用すると非常に簡潔な SQL 文を記述することが出来ます。


|従業員コード|従業員名|年齢|
|:------------:|:------------:|:------------:|
|00001|チャーリー・ブラウン|19|
|00002|ルシール・ヴァン・ぺルト|20|
|00003|ライナス・ヴァン・ぺルト|21|
|00004|シュローダー|29|
|00005|ペパーミント・パティ|30|
|00006|マーシー|31|

```sql
SELECT * FROM 従業員
WHERE 年齢 IN (20, 21, 29, 30)
```
指定した範囲のレコードを検索する（BETWEEN）


BETWEEN は、範囲の絞り込みに使用します。具体的には、「○○以上△△以下」を「BETWEEN ○○ AND  △△」と表すことが出来ます。

```sql
SELECT 列名1 ,列名2, ...
FROM テーブル名
WHERE 列名 BETWEEN 下限 AND 上限
```

またBETWEEN句はNOT句と組み合わせることで，指定した範囲に含まれていないデータを取得することができます。

```
SELECT 列名1 ,列名2, ...
FROM テーブル名
WHERE 列名 NOT BETWEEN 下限 AND 上限
```

上記のNOT BETWEENを用いたSQLと下記の比較演算子を用いたSQLは等価になります。

```
SELECT 列名1 ,列名2, ...
FROM テーブル名
WHERE 列名 > 下限 OR 列名 < 上限
```
CoronaSDKでキャプチャ画像を縮小してファイルに保存する

CoronaSDKにて特定のオブジェクトをキャプチャしてサムネイルにしたかったのですが、なかなか上手く画像をリサイズできなくて苦戦しました。正しいやり方かどうかわかりませんが、それなりに動いたので以下にメモとして共有しておきます。

Corona SDK / version : 2016.2949 (2016.9.15)

```lua:test.lua
-- 画像の縮小＆保存処理
local function saveImage(canvas, newFileName, width, height)
   local resizeCanvas = display.capture(canvas)

   -- ポジションを移動しないと縮小処理が上手くいかない
   resizeCanvas.x = display.actualContentWidth * 0.5 
   resizeCanvas.y = display.actualContentHeight * 0.5

   -- 誤差によりぴったり指定サイズにならないが、近いサイズに縮小
   resizeCanvas:scale(width * display.contentScaleX / canvas.width,
					  height * display.contentScaleY / canvas.height)

   -- 保存処理
   local baseDir = system.DocumentsDirectory
   display.save( resizeCanvas, newFileName, baseDir )
   resizeCanvas:removeSelf()
   resizeCanvas = nil
end

-- 
mainCanvas = display.newGroup()
mainCanvax.insert(...)

...

saveImage(mainCanvas, "tmp.png", 160, 240)

```
Vagrant1.7.4→1.8.7にupdateして立ち上がらなくなったときの対処録

# 起こったこと

Vagrant 1.7.4だったのを1.8.7にupdate

vagrant up すると立ち上がらない・・・。

```
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.

```

メッセージ出ない・・・。

な時の対処。

# 環境

Vagrant 1.7.4 → Vagrant 1.8.7
OSX El Capitan

# 対処録

## 何が起こっているのかを知る

メッセージが出ないと何もできません。ログを出します

```
$ VAGRANT_LOG=debug vagrant up
```

環境変数のVAGRANT_LOGにdebugを指定するとdebugログを出してくれます

エラー箇所をログから見つけます。

```
DEBUG subprocess: stderr: dyld: Library not loaded: @rpath/libcurl.4.dylib
  Referenced from: /opt/vagrant/embedded/bin/curl
  Reason: Incompatible library version: curl requires version 9.0.0 or later, but libcurl.4.dylib provides version 7.0.0
DEBUG subprocess: Waiting for process to exit. Remaining to timeout: 32000
DEBUG subprocess: Exit status: 5
 WARN downloader: Downloader exit code: 5
ERROR downloader: Exit code: 5
ERROR warden: Error occurred: An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.
```

先ほどの実行結果と同じログを見つけて、周辺をチェックします。

```
Incompatible library version: curl requires version 9.0.0 or later, but libcurl.4.dylib provides version 7.0.0
```

curlのバージョンがおかしい。
原因らしきところが判明したので、これを調べます。

参考: https://github.com/mitchellh/vagrant/issues/7969

上記に解決策が記載されていました。
1.8.7のcurlに問題があるみたいです。 対処法を試して無事解消しました。
シミュレータからアプリを消そうとした時、3D Touchが発生してイライラしない方法


小ネタです。
シミュレータで開発中、感圧対応のTrackPadを使っていると3D Touchのシミュレーションができるようになりますが、時に誤作動で必要ない場面で3D Touchが発生してイライラしてしまうことがあります。
特に自分が感じるのは、シミュレータからアプリを消そうとして長押しする場合です。

例えばこんな感じ・・・

<img src=https://qiita-image-store.s3.amazonaws.com/0/48976/7e86b804-87db-1c33-9c10-1106f83cb1d8.gif width=50%>

### イラッ！！

というわけで、イライラしない方法を紹介します。

## Touch Pressureを変更する
メニューから Hardware - Touch Pressure - Use Trackpad Forceのチェックを外します。これでシミュレータ上の感圧タップをオフにすることができます。


## Optionキーを押しながらタップする
Optionキーを押しながらシミュレータを操作すると、2つの円があらわれてピンチイン・ピンチアウトのシミュレーションができるようになります。その片方の円でアプリを長押しすると、強くタップしても感圧が働かずアプリを消せるようになります。

例えばこんな感じ・・・

<img src=https://qiita-image-store.s3.amazonaws.com/0/48976/3fba4a9a-6694-51d0-bbd6-d9e13f697702.gif width=50%>

### ストレスフリーっ!!

というわけでイライラした場合は、どちらかの方法で試してみてください。
以上。
Vimでコマンドモードに戻る際にIMEをオフにする（Mac / ATOK編）

MacOS Sierraでは [Karabiner](https://pqrs.org/osx/karabiner/index.html.ja) が使えないんですよね。仕事場の MacBook Air を早々に Sierra にしていたのでかなり前から知ってたのですが、自宅のMacはこの件がありバージョンアップせずにいたのです。でも先日、TouchBar 付きのMacBook Pro（USキーボード）が自宅に届きまして、このまま逃げ続けるのも無理だろうということで、重い腰を上げて何とか解決することにしました。

# 英数/かなキー

これは [⌘英かな](https://ei-kana.appspot.com) というツールに委ねることにしました。すでにUSキーボード使いの救世主として有名ですのでここでは説明しませんが、使い方はすごく簡単です。リンク先を見てください。

# Vim

本題ですが、あとKarabinerでしていたのはVimでESCキーを押してコマンドモードに戻る時にIMEをオフにしてくれる機能でした。

```
なんで「 ctrl + [ 」を使わないの？
```

みたいな意見も多くありますが、私はニワカVimmerですので当然のごとくESC派なわけです。ということで、コマンドモードに戻る際にIMEをオフにする機能を当然のごとく Karabiner さんに委ねていたのですが、さて困ったなと。keyhac はちょっとめんどくさそうだし…（学習意欲が湧かない…）

ふとGoogleの海原を彷徨っていたら Google IME を使ってその機能を実装している人がいました。ならば ATOK でもできるだろ？と思って、やっている人はいないのかな？と思ったのですが、そもそも ATOK 使いは Vim なんて使わないのか、そのような情報が見当たりませんでしたので、自分でためしてみたら簡単にできました。

というわけで、長い前置きすいません。ホント簡単なことなのですが、新しい MacBook Pro で長い文章を打ってみたいという個人的な願望のためにこんな記事になってます。（新しいMacBook Proのキーボード、悪くないと思いますけどね…　パチパチうるさいですが…）

検証環境は MacOS 10.12.1 と ATOK2016 for Mac となります。

#### （1）キー・ローマ字カスタマイザを選択する

![1.png](https://qiita-image-store.s3.amazonaws.com/0/104477/4dd89a22-6ba9-74f4-73d3-d9452a5abd4e.png)

ATOKのメニューから「キー・ローマ字カスタマイザ」を選択します。

#### （2）使用しているスタイルを選択して「キー設定」を押す

#### （3）ESCキーのカスタマイズ項目を表示させる

![2.png](https://qiita-image-store.s3.amazonaws.com/0/104477/14a548ae-6a75-8729-a0f7-05ed63557185.png)

画面の通りですが、ESCキーをカスタマイズしますので、そこまでたどり着くようにします。

#### （4）「文字未入力」の項目を「半角モード」に変更する

分類の「機能操作」の真ん中下くらいに「半角モード」がありますので、これを選択して「変更」を押すと以下の図ようになります。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/104477/92d57efa-03c9-1a20-ed76-64b3afc218e1.png)

#### （5）スタイルを保存する

最後にそのスタイルを保存するか？と聞かれると思うので、保存します。スタイルを一度も作ったことがない人は、新しいスタイル名をつけて保存し、そのスタイルを使用するようにします。

ちなみに同様の方法で「 Ctrl + [ 」も設定できるのですが、なぜか Vim では効きませんでした。

これでもう少しだけ「ESC派」でやってみようと思ってます。いずれは「 Ctrl + [ 」に矯正したいと思いますが。（TouchBar の ESCキーは押した感じがないので厳しいと思いますが、なんとかなるかもという気持ちもあります。）
PHPのautoloadについて

#autoloadとは
ファイルを自動で読み込む仕組みのこと。

クラスを作成する場合、再利用する性質上1クラスを1ファイルで管理することになる。
しかし扱うファイル数が増えた時に、各スクリプトの先頭で一つ一つrequireしなければいけなくなる。

そこでファイルを自動で読み込む仕組みであるautoloadを使用する。

#spl_autoload_register
通常autoloadも使用せずファイルの読み込みも行っていない場合、このタイミングでfatal errorになる。

```php
<?php
$hoge = new Hoge();  //fatal error
```

spl_autoload_registerを使用してオートローダーを登録しておくと、PHPがエラーで止まる前に登録したメソッドが呼び出される。

###spl_autoload_registerを使わない場合

```php

<?php
require_once 'MyClass1.php';
require_once 'MyClass2.php';
require_once 'MyClass3.php';

$obj  = new MyClass1();
$obj2 = new MyClass2();
$obj2 = new MyClass3();

```


###spl_autoload_registerを使う場合

```php

<?php
spl_autoload_register(function ($class_name) {
    require_once $class_name . '.php';
});

$obj  = new MyClass1();
$obj2 = new MyClass2();
$obj3 = new MyClass3();

```

#composerでautoloadを設定する
spl_autoload_registerを使用して自前で作成しなくても、composer-autoloadで実装が出来る。

###composerをダウンロード
```php
$ curl -s https://getcomposer.org/installer | php
```

###conposer.jsonファイル
composer.jsonというファイルを作成し、autoloadの設定をしていく。

```php
{
    "autoload": {
        "psr-4": {
            "Namespace\\": "DirName/"
        }
    }
}

```

psr-4という規約にのっとって作成し、```namespace Namespace```と宣言されたクラスは、DirNameというディレクトリの中にあるということを設定している。

###autoload.phpの作成

```
$ composer dump-autoload
```

これでvenderディレクトリにautoload.phpが作成される。
あとは作成されたautoload.phpをbootstrap.phpなどでrequireすればautoloadが使用できる。
(bootstrap.phpはアプリケーション全体の設定を作成する・読み込むのに使用されるファイルのこと。)
formatに対するparse、Jinja2に対する・・・？

# parse() is the opposite of format()
https://pypi.python.org/pypi/parse

formatの逆をやって、template文字列からpythonの辞書などを作る方法というのがあると言うことを知った

# 複数行同士でマッチしたい

template.txtとresult.txtがあって、template.txtにある``{}``の部分をまとめて辞書にしたい  

ただし、result.txtは他の標準出力なども全部取り込んでおり、ある程度大きく、全体をtemplate.txtにするのは厳しいものとする  
そうでなくても、例えば日付や実行時間のログのような、実行毎に変化する（けど、全部取得するほどは重要ではない）行などがある、とする

これまでだと、awkとかsedとか使ってシェルスクリプトでゴニョゴニョ・・・みたいに毎回半手作業で作っていたのを、もうちょっと楽ちんにしたいなぁという思い

# やったこと

template.txtの各行をresult.txtの各行に畳み込みながらparseして、全行マッチするところを結合して取り出すようなイメージ 
mapもreduceも、Noneが途中で出ても止まらないので、非常に無駄が多いが、性能をそこまで求めなければ・・・
（二重ループでぐるぐるして、みたいなのが上手くかけなかった・・・:persevere:）

```python
from parse import *
from parse import compile

def coerce_res(a, b):
   try:
      a.named.update(b.named)
      a.fixed = a.fixed + b.fixed
      return a
   except:
      return None

def match():
   with open('template.txt', 'r') as ftemp, open('result.txt', 'r') as flog:
      templines = ftemp.readlines()
      # todo: remove leading & trailing blank lines from templines
      loglines = flog.readlines()

      for i in range(len(loglines) - len(templines) + 1):
         a = map(lambda (x,y) : parse(x,y), zip(templines, loglines[i:]))
         b = reduce(coerce_res, a)

         if(b):
            return b

print match()
# print fixed, named
```

サマリー的なものはだいたい最後にあるので最後からやったほうが早そう

# 欲しいもの

parseはformatの逆変換だが、例えばJinja2の逆変換みたいなものがあれば、使い手があるんじゃないかと思うのだが、そういうものはないだろうか？
実行時のログなどで、正確には何行出るかわからないような部分を``{% for %}``みたいなもので記述して、リストなりで出力する、とか
失敗時のみ出るログを``{% if %}``ブロックで囲んで置いて、失敗を検出する、とか
（因みにJinjaを使ったことがあるわけではないので、完全にイメージで言ってます）
LINE bot(messaging API)でクリスマスプレゼントを受け付けるサンタクロースを作りました

はじめまして。

【4コマ漫画】サンタクロースへのリクエスト方法
http://www.hahalife0.com/entry/2016/11/21/070300

で見かけたサンタクロースのLINEアカウント。

![20161121041213.png](https://qiita-image-store.s3.amazonaws.com/0/150474/987342f1-91a6-22df-d078-2d911303ed2a.png)
（記事より引用）

これが実際にあれば、

子ども「ねーお母さん、サンタさんにプレゼントのお願いした？」
母「したわよ、今年はLINEで頼んだんだから」
子ども「ほんと？」
母「ほんとよ、ほら（LINE見せる）」
子ども「わー！サンタさんにちゃんと届いたんだね！」

というアリバイ工作が可能になるのではないかと思い、LINEのMessaging APIで作りました。

![43108.jpg](https://qiita-image-store.s3.amazonaws.com/0/150474/84e39cc4-3633-e666-1f94-2d2887328078.jpeg)

画像の通り、友だち追加するとプレゼントを書き込んでほしいとのメッセージが流れ、書き込まれたメッセージをそのまま返すBotです。

なので、「ポケットモンスターサン**をください**」と書き込んでしまうと

「ほしいものはポケットモンスターサン**をください**じゃな」となってしまうので、プレゼント名だけ書くようにお気をつけください。

<img src="http://qr-official.line.me/L/toXDeVNYOa.png">
友だち追加用QRコードです。

***

今回のBotはWindows環境でPHP+Xreaサーバー（Let's encryptで証明書取得）で作成しています。
WindowsでLet's encryptの証明書を取得するのは少し面倒なのですが、
letsencrypt-win-simple という非公式クライアントソフトが出ているので、それで問題なく取れました。
新技術の評価にあたって、考慮すべきポイント3つ

IT業界では、毎年のように新たな技術が出ては消えていきますが、おおまかに評価するにあたって、この3点を踏まえておけばそう大きく見誤ることはないだろう、というポイントがあることに気づきました。

# 3つのポイント

* 比較対象となる既存の技術
* その比較対象と比べてのメリット
* その比較対象と比べてのデメリット

# 掘り下げてみて
## 比較対象を取っておく意味
コンピューター界の新技術のうち、その多くは「何かしらの問題点を解決するため」に生み出されています[^1]。とりわけ、プログラミング言語やそのライブラリについては、チューリング完全性がある以上、書く手間や実行時間を無視すれば、「新しい言語でなければ実行自体ができない」ということはありません。

ということで、「新技術なしで書こうとした場合にどのような問題が待ち受けているのか」と「それは新技術の導入でどのように解決できるのか」の2点は、多くの技術に存在する評価軸です。

## デメリット
言語処理系のバージョンアップのような場合、伴うデメリットがほぼないケースもありますが、多くの場合新技術の導入にあたっては、払うべきコストが存在します。主な例としては、

* 処理のオーバーヘッド（シンプルな書き方にできる場合）
* 機種依存性
* インストールの手間
* 事前プロセスの複雑化
* 下位レイヤーが直接触れなくなる

などがあります。

# 具体例

いくつかの技術について、この3点で考察してみます。

jQuery：

* 先行技術…生DOM、Prototype.js
* メリット：メソッドチェーンを使ってのシンプルな書き方、ブラウザ非互換の吸収
* デメリット：ファイルサイズ、動作のオーバーヘッド

Sass：

* 先行技術：CSS
* メリット：変数やループ、構造化
* デメリット：別途コンパイルが必要

HHVM：

* 先行技術：PHP
* メリット：JITによる高速化
* デメリット：新たにインストールが必要、非互換部分の存在


[^1]: 「Just for fun」や「手段のためには目的を選ばない」とばかりに、解決すべき明確な課題がないまま作者の趣味で作られたLinuxやRuby、「うまく動かないことを示すためのプロトタイプ」だったはずが期待に反してよく動いたので開発を続けることにしたIronPythonなど、例外も数多く存在します。
docker exec -ti ～～ bashを省略する

Dockerコンテナに入るコマンド、叩くの面倒ですよね。

~~~
docker exec -ti hogehoge bash
~~~

ということで、以下を/etc/bashrcに追記しました

~~~
function dbash() { docker exec -ti $1 bash; }
~~~


使用例

~~~
[root@localhost ~]# docker run -d --name test  centos tail -f /dev/null
b3df9b104fb02a7c04c375762de8807783e02aff11a1d2350fb5171297619a5b
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES
b3df9b104fb0        centos              "tail -f /dev/null"   2 seconds ago       Up 1 seconds                            test
[root@localhost ~]# dbash test
[root@b3df9b104fb0 /]#
[root@b3df9b104fb0 /]#
~~~

(良し悪しはありますが)まっさらな開発環境としてDockerを使うことがあるので、そこそこ重宝しています
Mac に Fink をインストールした備忘録

MacBook Air を手に入れたのでパッケージ管理システムを導入してみました。巷では HomeBrew なるものが流行っているようですが、今回は Fink というパッケージ管理システムを導入してみました。ちなみに私の環境は、macOS Sierra 10.12 でした。

まずは[Finkプロジェクトのページ](http://www.finkproject.org)からバージョンに合ったFinkパッケージ管理システムをダウンロードします。

## Xcode のインストール

どうやら10.12だとソースからインストールするしかないようなので、先にコンパイル環境が必要そうです。XCode用のコマンドラインツールをインストールします。インストールマニュアルに従って次を実行します。

```bash
xcode-select --install
```

![xcode-select.png](https://qiita-image-store.s3.amazonaws.com/0/97818/7cdac9ec-6dad-68ad-7919-cc01de057579.png)

確認ダイアログが出てきたので「インストール」をクリックします。

インストールが完了したら、次の手順に進みます。XCode をフルインストールした場合に必要な作業があるので、XCode 本体も AppStore からインストールしておきます。

![xcode-install.png](https://qiita-image-store.s3.amazonaws.com/0/97818/d48969fe-f6fa-d5a4-62f7-8443ccc115c1.png)

XCode のインストールが始まると、コマンドラインツールのアップデートが通知されることがあるで、その場合はアップデートしましょう。この辺の作業は本体→コマンドラインツールの順序の方がスムーズだったかもしれません。

インストールが完了したらパスの設定(?)をします。この辺は環境によってパスが違うみたいですね。私の環境では次のようになりました。

```bash
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
```

次にライセンスに合意します。下記を実行して、ライセンスを最後まで読んだら、`agree`とタイプして合意します。

```bash
sudo xcodebuild -license
```

## JDK のインストール

`javac`コマンドが無いと、Fink のインストール時にエラーが発生するので、[Oracleのダウンロードページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html)からJDKをダウンロードします。バージョンは今の時点で最新らしい Java8 をダウンロードしました。

![java8-install.png](https://qiita-image-store.s3.amazonaws.com/0/97818/cf5bb46d-0bd7-570c-3011-2051a7b535ff.png)

## Fink のインストール

これで Fink をインストールする準備が整ったので、Fink のインストール作業に入ります。まずはダウンロードしたパッケージを展開します。

```bash
cd Downloads/
tar -xvf fink-0.41.0.tar
cd fink-0.41.0
```

展開できたらブートストラップを実行してインストールします。

```bash
./bootstrap
```

途中、色々と質問されます。基本的に全てEnterで問題ないと思いますが、プロキシやミラーサーバーの設定などもあるので、ネットワーク環境に合わせて設定を行ってください。後から変更する際は`fink configure`で再設定をします。

ソースからビルドするので、すごく時間がかかります。電源がスリープにならないように設定して、しばらく待ちましょう。半日程で完了するので、パスのセットアップをします。

```bash
/sw/bin/pathsetup.sh
```

![pathsetup.png.png](https://qiita-image-store.s3.amazonaws.com/0/97818/cdd0e555-6877-913b-e758-8062cc391206.png)

確認メッセージが出てくるので、「YES」をクリックしてやると、ホームディレクトリに.profileという隠しファイルが作成されて設定完了です。

ターミナルを再起動して`fink`とタイプしてやると、ヘルプメッセージが表示されて正常にインストールできたことを確認できます。

次に、更新パッチの設定などをします。下記を実行すると、最初のコマンドの実行途中で、cvsかrsyncか聞かれますが、デフォルトのrsyncを選びます。

```bash
fink selfupdate
fink index -f
fink selfupdate-rsync
```

これで Fink を使用する準備が整いました。

## Fink を使ってパッケージをインストールしてみる

Fink のインストールを完了したら。お目当のオープンソースソフトをインストールしてみましょう。その際、うっかり`fink install`を実行してしまいそうになりますが、このコマンドはソースからビルドするのでインストールに時間がかかります。

主要なソフトウェアの場合はバイナリが用意してある可能性があるので可能であればバイナリからインストルしましょう。バイナリからインストルするには次のコマンドを実行します。

```bash
sudo apt-get install パッケージ名
```

Debian や Ubuntu でおなじみの`apt-get`を使うことができます。もちろん`apt-cache`も使えます。基本的には apt を使って、バイナリが用意されていない場合だけ`fink install`するようにしましょう。

ちなみに`fink`コマンドはroot権限で実行しなくても、実行中にパスワードを聞いてきて、入力すると権限昇格してくれます。`apt-get`の場合は`sudo`で実行しないと権限エラーになってしまいます。

Fink を使ってインストールしたパッケージはデフォルトだと`/sw`ディレクトリ配下にインストールされます。`/usr/bin`などを汚染しないので安心です。

## スーパー牛さんパワーを手にいれる

`apt-get`を実行できるようになったので、最後にスーパー牛さんパワーを手に入れておきましょう。

```bash
$ apt-get moo
         (__) 
         (oo) 
   /------\/ 
  / |    ||   
 *  /\---/\ 
    ~~   ~~   
...."Have you mooed today?"...
```

ムー
RenderTextureを保存すると暗くなる問題【※Unity5.4.2p4現在】

#はじめに…
Unityでスクリーンショットを取る場合…

1. Application.CaptureScreenshot
2. Texture2DをエンコードしてFile.WriteAllBytesで書き込む

この二通りがあるかと思います。
今回は、保存先を指定するために2の方法で保存します。

#暗くなる保存方法

1. ProjectViewでRenderTextureを作成します
2. 撮影したいCameraにRenderTextureを登録します
3. 下記ソースコードのように実装します

```csharp:ScreenShot.cs
Texture2D tex = new Texture2D(RenderTextureRef.width, RenderTextureRef.height, TextureFormat.RGB24, false);
RenderTexture.active = RenderTextureRef;
tex.ReadPixels(new Rect(0, 0, RenderTextureRef.width, RenderTextureRef.height), 0, 0);
tex.Apply();

//PNGに変換
byte[] bytes = tex.EncodeToPNG();
Object.Destroy(tex);

//保存
File.WriteAllBytes(Application.dataPath + "Hoge" + ".png", bytes);
```

これで保存した画像がコチラ

![20161121210107.png](https://qiita-image-store.s3.amazonaws.com/0/150467/07e16a4e-8680-343a-36a4-a0014d7508a0.png)

最初は、こういうもんなのかな？と思ってたんですが、違うみたいです。

#暗くならない保存方法

1. 下記ソースコードのように実装します

```csharp:ScreenShot.cs
//プレビュー用のレンダーテクスチャからサイズ取得
int resWidth  = RenderTextureRef.width;
int resHeight = RenderTextureRef.height;

//RenderTextureを作る
RenderTexture rt = new RenderTexture(resWidth, resHeight, 24);
rt.antiAliasing = 8;

//Cameraに設定
camera.targetTexture = rt;
Texture2D screenShot = new Texture2D(resWidth, resHeight, TextureFormat.RGB24, false);
camera.Render();
RenderTexture.active = rt;

//結果を読み込み
screenShot.ReadPixels(new Rect(0, 0, resWidth, resHeight), 0, 0);
camera.targetTexture = null;
RenderTexture.active = null; // JC: added to avoid errors

//破棄
Destroy(rt);

//PNGに変換
bytes = screenShot.EncodeToPNG();

//保存
File.WriteAllBytes(Application.dataPath + "Hoge" + ".png", bytes);
```

これで保存した結果がコチラ

![20161121210107_02.png](https://qiita-image-store.s3.amazonaws.com/0/150467/bb029e2e-3a02-6e8f-26e8-7506729214a8.png)

本来の色で保存されています。

#まとめ…
Unity5.4.2p4現在では、new RenderTextureで保存する方が良さそうです。
何か別の方法で解決した方がいましたら、教えていただけると幸いです。
集計関数


## COUNT

テーブルの行数を求める場合は、COUNT 関数を使用します。テーブル全体の行数を求めたい
場合は、COUNT 関数の引数には、「全ての列」を意味する「*（アスタリスク）」を指定します。
また、関数の引数に「*」を使用出来るのは、COUNT 関数のみとなります。

任意の列から NULL の行を除外して数えたい場合は、対象とする列を限定して引数に記述し
ます。以下に「sel_price」列から NULL を除外した件数を求める例を示します。


### レコード数の取得

COUNT関数はSELECT文により選択されたレコードの件数を返します。 COUNT関数の引数に*(アスタリスク)を指定した場合はすべてのレコード数を取得することができます。

```
SELECT COUNT(*)
FROM テーブル名
```

### NULLを含まないレコード数の取得

COUNT関数の引数に列名を指定した場合は，その列の値がNULL以外のレコード数を取得します．

```
SELECT COUNT(列名)
FROM テーブル名
```

### 重複を含まないレコード数の取得

COUNT関数の引数でDISTINCT句を使用すると，重複した値を1つにまとめてからレコード数を取得することができます。

```
SELECT COUNT(DISTINCT 列名)
FROM テーブル名
```

## GROUP BY

GROUP BY句を使用することで，同じ値を持つデータごとにグループ化してレコード数を求めることができます。

なお、GROUP BY 句の位置にも厳密なルールがあって、必ず FROM 句の後ろ（WHERE 句があるならさらにその後ろ）におく必要があります。また、GROUP BY 句を使用する場合、SELECT句に集約キー以外の列名を書くとことは出来ません。
※集約キー（GROUP BY句に指定する列のことを集約キーやグループ列と呼ぶ。）以外の名前など種類は出せません。

|従業員コード|従業員名|年齢|種別|
|:-----:|:-----:|:-----:|:-----:|
|A0001|チャーリー・ブラウン|15|人間|
|A0002|ペパーミント・パティ|15|人間|
|B0001|スヌーピー|4|犬|
|C0001|ウッドストック|3|鳥|

グループごとに合計と平均を求める
種別ごとに年齢の合計と平均を求める場合は以下のようにSQLを書きます。

SQL

```sql
SELECT SUM(年齢) AS 年齢の合計, AVG(年齢) AS 年齢の平均, 種別
FROM 従業員マスタ
GROUP BY 種別
```

結果

|年齢の合計|年齢の平均|種別|
|:-----:|:-----:|:-----:|
|30|15|人間|
|4|4|犬|
|3|3|鳥|
Sassの@importでreset.cssやnormalize.cssを読み込む

Sass の `@import` によるインライン展開は `.css` 拡張子に対応していないので、`.css` ファイルしか用意されてない [HTML5-Reset](https://github.com/murtaugh/HTML5-Reset) や [normalize.css](https://github.com/necolas/normalize.css/)、[sanitize.css](https://github.com/jonathantneal/sanitize.css) などはそのままではインポートできません。
※`.css` ファイルを指定すると CSS の `@import url(...)` になってしまいます。

`.scss` バージョンを公開している人もいますができれば公式のものを使いたいし、自分でリネームしてリポジトリに置くというのも避けたいところです。

これらの条件をクリアするために、私は Bower でインストールしたあと gulp で `.scss` にリネームしていたのですが、[node-sass-package-importer](https://www.npmjs.com/package/node-sass-package-importer) を使うとそんな手間もいらず簡単にインポートすることができたので紹介します。

# インストール
node-sass-package-importer のほか、使いたい CSS パッケージをインストールします。

```shell-session
$ npm i -D node-sass-package-importer
$ npm i -S html5-reset normalize.css
```

# Sassのオプションに指定する
node-sass-package-importer を Sass の importer オプションに指定します。importer は `@import` の処理をフックして独自処理を行うプラグイン機構です。
基本的な使い方は [node-sass-package-importer](https://www.npmjs.com/package/node-sass-package-importer) のサイトに書いてあるので、ここでは gulp タスクとして組み込む方法を書いておきます。

```js:gulpfile.js
var gulp = require('gulp');
var sass = require('gulp-sass');
var packageImporter = require('node-sass-package-importer');

gulp.task('build:sass', function() {
  return gulp.src('path/to/sass/**/*.scss')
    .pipe(sass({
      importer: packageImporter({
        extensions: ['.scss', '.css']
      })
    }))
    .pipe(gulp.dest('path/to/css/'));
});
```

# CSSファイルをimportする
基本的にはパッケージ名の頭に `~` をつけて import するだけです。

```scss
@import "~normalize.css";
@import "~html5-reset";
```

node-sass-package-importer はインポートするパッケージの package.json を見て取り込むファイルを判断しています。具体的には以下のいずれかのキーに設定された CSS/Sass ファイルを読み込みます。`sass` `scss` `style` `css` `main.sass` `main.scss` `main.style` `main.css` `main`

この設定がない場合やそれ以外のファイルをインポートしたいときは、パッケージ名に続けてファイルパスを指定します。例えば、Bootstrap の reboot.css をインポートするには以下のように指定します。

```scss
@import "~bootstrap/dist/css/bootstrap-reboot";
```
jQuery3.0で廃止されたコードによって少しはまった話


廃止されたコード確認できておらず・・・やってしまいましたので記録として残しておきます。

```js:jQuery
$(window).load(function(){}); //廃止コード

$(window).on("load",function(){}); //代替コード
```

jQueryのバージョンを上げる際にはご注意ください。
n回目のRaspberry Pi初期設定

何回目かのルーチン作業なので流れをメモ

# OSのDL〜起動〜キーボードなどの設定〜

- OSのインストールは[こちら](https://www.raspberrypi.org/downloads/noobs/)。NOOBSをZIPでDLする。数GbのDLなので結構時間かかる

参考:[Raspberry Pi 3 Model B をインストールしてSSH接続できるようにしてみる](http://techblog.clara.jp/2016/04/raspberry-pi-3-model-b_install_and_ssh_connect/)


- emacs教信者なのでemacsインスコ `sudo apt-get install emacs`
- ついでにgitくらいも入れときたい `sudo apt-get install git`


# WiFiの接続と固定化

参考: [Raspberry Pi 3を買ってMacを使ってWiFi接続とSSHの接続するまで](http://qiita.com/toshihirock/items/8e7f0887b565defe7989)


# MacからRaspberry PiにVNCでリモートデスクトップ接続する

いつも忘れるので。

1. Raspberryコンソールで `sudo apt-get install tightvncserver`
	- 初回の起動時にはパスワードを要求されるので自由に決める
2. installが正常に終わったら `tightvncserver`とコマンドを打ってサーバーを起動。その状態で3を続行
3. Macは標準でVNCによるサーバ接続をサポートしています。
	- Finderのメニューから「移動」->「サーバへ接続」と移動
	- 「サーバーアドレス:」に `vnc://IPアドレス:5901`を打ち込む
	- 上記で決めたパスワードを入れる

参考: [MacからRaspberry PiにVNCでリモートデスクトップ接続する方法](http://darmus.net/raspberry-pi-mac-vnc/)

# githubへのssh

参考: [GitHubにSSH接続できるようにする方法](http://qiita.com/katsukii/items/9fd5bbe822904d7cdd0a)

# 全部最新の内容に更新したい時

参考: [Raspberry Pi の OS、ファームウェアを最新にアップデートする方法](http://blog.livedoor.jp/noanoa07/archives/2062407.html)
【妄想】Lambdaに新しい言語が追加されました！

# はじめに
これは、こんなリリースノートを切に願いすぎて思わず出てしまった僕の妄想です。
リリースする噂も全く無いので、予めご了承ください。

# Lambdaに新しい言語が追加されました！
2年前、私たちはファンクショナブルなサービス、Lambdaを発表しました。
API GatewayやCloudWatch、Kinesisなどと組み合わせることで、より低コストでスケーラブルなサーバレス環境をたくさん見て来ました。
そして、1年前にpythonを発表し、サーバレス環境に拍車がかかったことを実感しました。

しかし、これまでサーバエンジニアの方はサーバ上の限定された中でしか容易に処理が出来ませんでした。
それがAPIベースの世の中になり、curl等を使うことで、サーバ外とも容易に連携することが出来るようになりました。
しかし、連携する側の実装は容易になっても、連携される側（API側）の実装は容易ではありませんでした。

今日、待ち望まれていた新たな言語を発表出来ることを心より嬉しく思います。
# Lambda for bash !!
Lambdaをbashで利用することにより、既存の資産（システム系のジョブなど）をそのまま動かすことも可能で移植性が高く、awkやjqなどを始めとするパワフルなコマンドラインツールも利用可能になり、API Gatewayと組み合わせると、bashベースのAPIシステムも実現可能です！

それでは、利用して見ましょう。

<img width="832" alt="スクリーンショット 2016-11-21 20.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/75573/f7724824-1649-e4ab-9b8c-9d775c297849.png">

Lambdaの言語選択画面で「bash」を選択するだけです。
たったこれだけです！

この機能の実装により、サーバレスエンジニアの増加に拍車がかかることを期待してます。

# おしまい
いつかこんな記事が出ることを願ってます。
ちなみに待ち過ぎてLambda for python上でAWS CLIを動かしてしまいました。。
Mac OS Xでのpipのupgrade

　updateがうまくいかないことがあったので、備忘録。
　色んなサイトでは、pythonをreinstallしなさいみたいなことがありましたが。以下のコマンド叩くだけで、update出来ます。
　
`
sudo pip install -U pip
`

以下のサイトを参考にさせていただきました。
余談ですが今回は、google-api-python-clientを使うということで、versionのupgradeが必要になったので、upgradeしました。
開発に携わってない脆弱性診断員が、テキストの文字列検索のコードを書いてみた

#開発をやったことないから、とりあえず何か作ってみてます。
まずは、pythonでテキストファイルの文字列を探すプログラミング。
作った理由としては、文章を書くことが多いため、使用禁止の文字などをチェックするために必要だったため。

##コマンドライン引数から実行
![python01.png](https://qiita-image-store.s3.amazonaws.com/0/127391/d3019e3d-3389-b3ce-b2a8-8e62e7a2f77d.png)

上記のようにコマンドプロンプトをたたくと・・・

![pyhton02.png](https://qiita-image-store.s3.amazonaws.com/0/127391/6e893a2a-d3f8-3e13-5aaa-53905a2f613d.png)

pythontest.txtの中にある「python」という文字列が存在したら発見！という文字列を表示する。

txtの中身

```pythontest.txt
Python pison paison puison poison peison poson
```


以下ソースです。

```stringParser.py
import sys
argvs = sys.argv
try:
	f = open(argvs[1],'r')
	for row in f:
		if row.find("Python") > -1:
			print("発見！！")
		else:
			print("見つかりません")
	f.close()
except:
	print("ファイルが見つかりません")
```
というような感じです。ひとまずコマンドライン引数は基礎なので、使えるようになっておかないと！
URL で拡張子を省略するための rewrite ルール

下記のようなディレクトリツリーで、

- /var/www/html/
    - ore/
        - oreore.php
    - are/
        - areare.php

下記のような URL で PHP スクリプトを呼び出す方法。

- `http://example.com/ore/oreore`
- `http://example.com/are/areare`

----

下記の方法で大丈夫かと思ってたけど・・

```
RewriteEngine   On
RewriteCond     %{REQUEST_FILENAME}.php -f
RewriteRule     ^(.*)$  $1.php  [NC,L]
```

下記のような URL で rewrite がループして 500 となりました。

- `http://example.com/ore/oreore/xxx`

rewrite のログを追ってみたところ `%{REQUEST_FILENAME}` が `/ore/oreore` となっていました。

`/ore/oreore/xxx` というパスへのリクエストは・・・

- REQUEST_FILENAME: `/ore/oreore`
- PATH_INFO: `/xxx`

と、解釈されるからのようです。

ので、下記のようにすれば大丈夫でした。

```
RewriteEngine   On
RewriteCond     %{REQUEST_FILENAME}%{PATH_INFO}.php -f
RewriteRule     ^(.*)$  $1.php  [NC,L]
```
CentOS 6.8 にEmacs 25.1を入れてみる

# あらまし

お仕事中にCentOS 6.8で環境を作成中、以前作ったはずのEmacsの依存ライブラリのインストール方法をどこにもメモってなかったのでここに書いておく。
一度書いた気がしたんですけどねえ

# 本題

以下でライブラリをインストールしておく

```:suした状態で
yum install libjpeg-turbo-devel libpng-devel giflib-devel libXpm-devel ncurses-devel gtk2-devel libtiff-devel
```

```:ソースコードを解凍したうえで
./configure
make
```

```:suした状態で
make install
```

メニューパネルのProgrammingに自動的にアイコンが追加されるので、そこから呼び出してください。

# 終わり

この情報、ググったら意外と出てこなくて困った。
キーワードが悪かったのかな。
~/.yarn-cache/ を CI でキャッシュしてはいけない

# 2017/01/16 (月) 追記：

CircleCI の公式ドキュメントに yarn の導入方法が明記されています。今後はそちらに合わせるのがベターです。

- **[Install and Use Yarn (the NPM replacement) on CircleCI - CircleCI](https://circleci.com/docs/install-and-use-yarn/)**

これまで行っていた設定だと、`yarn` のパッケージインストールのタイミングで「すでに yarn がインストール済み」とエラーが発生するようになってしまいました。よって以下は古い記事なので、読み飛ばしてください。

---

# 要約すると

- **[yarn](https://yarnpkg.com/) 0.17.x** から、キャッシュ保存先が **OS によって変わる** ようになった！
- CI で `~/.yarn-cache/` をキャッシュする設定を入れている場合、**正しいパスに変える必要がある**
    - :arrow_right: **`~/.cache/yarn/`** *(Linux の場合)*

# 事の流れ

先週あたりから、npm に代わって **[yarn](https://yarnpkg.com/)** を使い始めました。
実際にビルドやデプロイが早くなったり、CI が早くなったりと、いろんな好影響があって yarn バンザイな感じです。

## CircleCI の設定

ちょうど CircleCI を使用していたので、先人の知恵をありがたくお借りして実装を進めました。

### yarn 0.16.x までの設定

> ```yaml
> machine:
>   node:
>     version: 4.6.0
> 
>   post:
>     - curl -o- -L https://yarnpkg.com/install.sh | bash
> 
> dependencies:
>   cache_directories:
>     - "~/.yarn-cache"
> 
>   pre:
>     - yarn --version
> 
>   override:
>     - yarn install
> 
> test:
>   override:
>     - echo test
> ```
>
> *キャッシュディレクトリとして `~/.yarn-cache` を指定しておくのがミソ。*
>
> *─ [CircleCIでyarnを使う - tehepero note(・ω<)](http://blog.stormcat.io/entry/circleci-npm-yarn)*

#### CircleCI 上で確認

ディレクトリのキャッシュ設定が上手くできていない場合は `yarn install` で `[2/4] Fetching packages...` が走ってしまいますが、キャッシュできている場合はその前で止まります。

|:o: **キャッシュできてる**|:x: **キャッシュできてない**|
|:---:|:---:|
|<img height="150" alt="スクリーンショット 2016-11-21 19.10.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/70467/150f3905-ba4f-ca42-f130-7521be94e214.png">|<img height="150" alt="スクリーンショット 2016-11-21 19.10.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/70467/76ada053-0660-a760-297e-c35593ebea08.png">|

※ `yarn.lock` に変更が無いことが前提です。

### **yarn 0.17.x におけるキャッシュフォルダの変更**

この設定で、先日まで上手く動いていたのですが、今日 CI を確認したところ、**CI のキャッシュが効いてない**（右図の）状態になっていました。

調べたところ、先日 stable になったバージョン (`0.17.6`) で、**macOS / Linux の yarn キャッシュフォルダが変更になった** ようです。

- [**Use ~/Library/Caches as default cache location on OSX by kittens** · Pull Request #1638 · yarnpkg/yarn](https://github.com/yarnpkg/yarn/pull/1638)
- [**Use ~/.config/yarn and ~/.cache/yarn on Unix systems - fixes #1672 by kittens** · Pull Request #1679 · yarnpkg/yarn](https://github.com/yarnpkg/yarn/pull/1679)

|OS|新しいキャッシュ先|
|:---:|:---:|
|macOS|**`~/Library/Caches/Yarn/`**|
|Linux|**`~/.cache/yarn/`**|

ちなみに、フォルダの変更自体は `0.17.0` の時点ですでに適用されていたみたいです。

- [CircleCI で Yarn 0.17.0 のインストールに失敗する - Qiita](http://qiita.com/Mura-Mi/items/14dd6f27372447a33a34)

## `~/.yarn-cache/` の設定を見直そう

ということで、`~/.yarn-cache/` を CI でキャッシュする設定を書いている場合は、**CI のコンテナ OS に合わせてパスを見直す** 必要があります。

```diff
  dependencies:
    cache_directories:
-     - "~/.yarn-cache"
+     - "~/.cache/yarn"
```

#### キャッシュフォルダの場所を調べる

以下のコマンドで、現在の環境のキャッシュフォルダの場所がわかります。

```bash
$ yarn cache dir
```

出力はこんな感じ。:arrow_down:

> **yarn cache v0.17.6**
> /Users/yhatt/Library/Caches/Yarn
> ✨  Done in 0.05s.

`cd $(yarn cache dir --silent)` みたいに動的に使う事もできるかな？と思ったんですが、残念ながら `--silent` オプション未対応。

無理やり `yarn cache dir | sed -n 2p` とする事もできますが、出力フォーマットが変わったりすると対応できなくなる可能性があるのでオススメしません。
🍣Console に寿司を流す🍣

[gist](https://gist.github.com/1984weed/6b186886cce79479e4c1f72f578a175d)

![sushi.gif](https://qiita-image-store.s3.amazonaws.com/0/134294/5cce3e95-9640-780d-b917-5de3bc395201.gif)

なんかGifにすると一瞬白くなるな。。。
UITextFieldのBorderStyleをnoneにすると、日本語の縦位置がズレる問題

![スクリーンショット 2016-11-21 19.49.49.png](https://qiita-image-store.s3.amazonaws.com/0/44356/36efe599-43c4-0aac-7aa0-5f12f8745545.png)
これ。
さっき先輩におしえてもらったんですが、Clip To Boundsを外すと直ります。
酷いバグだ。

![スクリーンショット 2016-11-21 19.52.10.png](https://qiita-image-store.s3.amazonaws.com/0/44356/93fefffa-401d-5bbd-1d41-df0b9e41aa40.png)
Vagrant で bento/ubuntu-16.04 を vagrant up すると途中で ネットワーク周りでコケる

# 環境

* macOS Sierra 10.12.1
* Virtualbox 5.0.28 r111378
* Vagrant 1.7.4

# 現象

`vagrant up` すると、下記のようなエラーが発生してしまう

```text
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

/sbin/ifdown eth1 2> /dev/null

Stdout from the command:



Stderr from the command:

mesg: ttyname failed: Inappropriate ioctl for device
```

SSH コマンドが送れないので、provisioner も実行されない

# 解決

Vagrant のバージョンが古かった。最新 (執筆時点 1.8.7) のものに更新したところ、すんなり解決した。

参考: Unable to set hostname on Ubuntu 16.04 box
https://github.com/mitchellh/vagrant/issues/7288
Vagrant で bento/ubuntu-16.04 を vagrant up すると Connection timeout になってしまう

ちょっと複雑な環境を構築する必要があって、(Virtualbox で Windows Server, Virtualbox + Vagrant + Ansible で Ubuntu) ネットワークの設定をごにょごにょしていたので問題解決まで時間がかかってしまった

# 環境

* macOS Sierra 10.12.1
* Virtualbox 5.0.28 r111378
* Vagrant 1.7.4 (1.8.7 でも同じ現象になることを確認)

# 現象

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "bento/ubuntu-16.04"
# 略
```

として `vagrant up` をしたが、

```text
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
<中略>
    default: Warning: Connection timeout. Retrying...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.

If you look above, you should be able to see the error(s) that
Vagrant had when attempting to connect to the machine. These errors
are usually good hints as to what may be wrong.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.

```

となってしまう。なので、Virtualboxから仮想マシンのGUIを開くと

![スクリーンショット 2016-11-21 19.12.48.png](https://qiita-image-store.s3.amazonaws.com/0/28623/79db03ef-960b-291d-74de-cbe01da1445d.png)

```text
A start job is running for Raise network interfaces (進行秒数s / 5min 4s)
```

となってる。待っていると、表示の通り、5分4秒後にいつもの起動手順をふみ、ログイン可能になる。この時、VirtualboxのGUI上ではログインできるものの、`vagrant ssh`は繋がらないまま。

# 調査

参考: Timeout error during `vagrant up`
https://github.com/chef/bento/issues/682

他のBoxでも同様の現象が起きているようで、このIssueによると
```
vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
```
を加えると動いたという報告が。今回使っている bento/ubuntu-16.04 でも動いた報告があった

# 対応

なので、Virtualbox provider の設定を

```rb:Vagrantfile
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.customize ["modifyvm", :id, "--cableconnected1", "on"]
  end
```

と追加したところ、問題なく起動＆SSH接続ができるようになった。

# ちなみに

Vagrant のバージョンが古かった (1.7.4) ことで、別の問題が発生していた。
(別件についてはこちら → [Vagrant で bento/ubuntu-16.04 を vagrant up すると途中で ネットワーク周りでコケる](http://qiita.com/chatii0079/items/baafa7c675a10545c5e8))
本件の対応のあとで Vagrant のバージョンアップをした (1.8.7) ので、
再度 確認したら、1.8.7 でも発生した
Qiitaの「いいね」について思った事

#はじめに
久しぶりに Qiita 記事を投稿してみたら、いいね というのが出来ていました。
初めは「良いんじゃない？」と思っていたのですが、ちょっと「ん？」って思ったので記事にしました。

#いいね機能の背景
>Qiitaでは現在、投稿記事に対して「ストック」することができます。この機能は「今は忙しいから後で読もう」といったときに使うことができますが、一方で「素晴らしい記事を見つけた」という時にも使うことができ、実質的に記事へのフィードバックとしても機能していました。 その結果、「投稿記事を保存する」というアクションと「投稿記事を気に入った」というアクションが混在し、記事への評価が分かりにくくなっていました。

とありますね、自分は良い記事だからこそストックしておいて、いつでも読めるようにするものだという考えだったので、ちょっと意見が違っていました。
ストック数 = 記事の評価で問題無かったように感じます。

逆に、ストックする程では無いけれど、一読したよ的な意味も混めて「いいね」みたいな機能があれば良いなとは前々から思っていました。
この場合はストックが真に記事の評価を表し、いいね は共感や賞賛みたいな意味を表します。

#Contributionは いいね に変更
久しぶりに記事を投稿してみたところストック通知が来ているのに Contribution が増えていない。
理由は Contribution の値は ストック数では無く いいね の数に変更になったからだそうです。
まだ いいね をする文化が根付いてないからなのかもしれませんが、ストックしてもらえたのに貢献した事にならない事にすごく違和感を覚えました。

#ストック数は表示されない
さらに違和感を感じたのがストック数が表示されない事です。
いいね はしないけど ストック だけされた場合に、通知は来ますがそれは評価にはならない点に関しては問題があると思います。
ストックだけされた場合はどういう評価を受けたと受け取るべきなんでしょうか？
せめて いいね と ストック数 は両方とも値を表示するべきでは無いでしょうか？

#ストック をしたら自動で いいね が押されるべきでは?
ストック をする事で いいね が自動で行われるべきでは？ と考えました。
冒頭でも意見しましたが、 いいね はあくまで ストックする程でもないといった評価の時に使用し。
ストック こそが真の評価とする考の上で ストックされたら いいね が自動追従されるべきという考えです。
しかし、いいね と ストック の価値が運営の考えとは反しているので、運営からすると意味が無いのかもしれないですね。

#まとめ
「投稿記事を保存する」 イコール 「投稿記事を気に入った」 で 良かったように思います。
なんども必要な時に辞書的に読める優良記事なんかは、ストックがそのまま評価としてとれると思いますし。
当分の間は評価と保存を切り分けたというよりかは、評価基準が2つに増えたという印象の方が強いかなと思います。

今後、いいね を押す文化が浸透すれば解決されるのかも。
ただ、救済としてストック数だけは表示するようにしてほしいです。。。
はてなブックマークのRSS feedをフィルタリングする

# 結論
inoreaderにフィードのフィルタ機能があったので、移行しました
以下は、そこにいたるまでの紆余曲折になります。

# 動機
ホッテントリって便利だけどフィルタリングとかしたいよね、ということでやり始めました。
PC/スマホから見るので、サーバ側でフィルタリングをかけたいという個人的な需要がありました。
feedlyから移行するのが面倒だったので、移行せずに何とかする方向で考えていました。

# 当初やろうとしていたこと
feedにアクセスが来るたびにホッテントリのRSS feedを取得し、タイトルとドメインでフィルタリングして表示する仕組みをflaskで書いていました。
が、諸々問題がありお蔵入りになりました。
https://github.com/tetosuna/hatebu_with_ng

# 問題点
- 自前で公開したfeedがfeedlyに登録できない。
 -  DNS名がついてないとfeed登録できないようで、feedburner使うなり、独自ドメインある人はドメインで登録するなりする
- feedlyがfeedを読みに来てくれない
 - 購読数が少なすぎて更新間隔が長く設定されていた？
 - RSSの形式ミスかと思ったけど、そもそもアクセスががほとんどなかったのでどうしようもない 
 - inoreaderは普通に読みに来てくれるようだった
 - inoreaderにはフィルタ機能あるじゃない(このあたりでfeedlyから移行を検討) 
- そもそもはてなの規約的に微妙だよね
 - はい

ということで、RSS feedをカスタマイズしたいなぁというときに、自分で個人用ミラーサイトを建てようとするのはいいアイディアではないということがわかりました。
やる前に気付けという話ではありますが。

# 結局どうしたか
- inoreaderに移行しました。
- もともとgReaderを使っていたので、News+ and inoreaderプラグインで違和感なく移行できました
- 溜まった未読があるので、しばらくは並行運用

追記：
inoreaderのNG機能は無料だと3つくらいしか設定できないので、こっちを起動させたほうが快適かもしれません。
見に行く間隔が長すぎる場合は、ブースト機能を設定すると10分間隔で見に行ってくれるようです。
Word + PowerPoint > 位置調整機能をPowerPointで使用して図を作成し、Wordにコピペ

```txt:動作環境
Word 2013
PowerPoint 2013 
Windows 8.1 pro
```

Wordで説明図を作成しようとしたが、図形作成の機能の使い勝手が悪い。

PowerPointでは複数の図形要素同士の位置関係の調整がしやすい。

そのため以下のように作図することにした。

1. PowerPointで図を作成
2. PowerPointでCtrl+aで図を選択 (左クリック+ドラッグでの領域選択でも可能)
   - 必要であれば「グループ化」する
3. Wordを開いてCtrl+vで貼り付け

画像でなく、図形要素として貼り付けがされるので、貼り付け後の微調整も可能。

続けて、Wordで「オブジェクトの選択」を用いて張り付けた図全体を選択し、PowerPointに貼り付けてみた。数本の矢印が選択されない状況になった。「オブジェクトの選択」でうまく選択できないようだ。

別途、PowerPointでシートを選択した状態でCtrl+cすると、Wordで張り付けた時に画像となってしまうようだ。複数のシートの図はシートごとにコピペすることになりそう。
EC-CUBE3での商品データ削除(by SQL)

EC-CUBE3で商品情報をデータベースから一括削除したいなと思ったのですが、普通にTRUNCATEしたら
こんなエラーがでて出来ませんでした...

```
Cannot truncate a table referenced in a foreign key constraint (`bikers-jp_rb`.`dtb_product_class`, CONSTRAINT `FK_1A11D1BA4584665A` FOREIGN KEY (`product_id`) REFERENCES `bikers-jp_rb`.`dtb_product` (`product_id`))
```

外部キー制約なるものがかかっているとのことで調べたところこんな方法でできました。

```sql
SET foreign_key_checks=0;
TRUNCATE TABLE `dtb_product_category`;
TRUNCATE TABLE `dtb_product_image`;
TRUNCATE TABLE `dtb_product_stock`;
TRUNCATE TABLE `dtb_product_tag`;
TRUNCATE TABLE `dtb_product`;
TRUNCATE TABLE `dtb_product_class`;
SET foreign_key_checks=1;
```
ubuntuでcrontabの設定をする時はpathか絶対パスを使用すること。

無駄なことに時間を使った。
動かないと思ったらパスが通ってないだけだった。

#使用上の注意
**crontab -eは危ないので使わないほうがいい**
そうなのですが、使ってます。間違って-rを使って削除してしまわないように。
http://qiita.com/furu-s/items/3aa9d55c9f3086cba711

**cdで実行するディレクトリに移動する
あるいは絶対パスを指定して実行する必要がある。**
実行するコマンドのほうもpathが通ってないと絶対パスにしないと実行されないので注意。

#crontabを開く

```
crontab -e 
```

#前準備
##環境変数の設定

```
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
```

##権限を変更
sudo chmod 755 実行するファイル

##ログが出るよう設定

edit or emacs or vi or...
emacs /etc/rsyslog.confを編集
cronのlogがコメントされているのでコメントアウト

/var/log/cron.logに出力されるようになる。

##ルール
分　時　日　月　曜日　ユーザ　コマンド

#例

```
01 * * * * root ruby /home/ubuntu/test.rb
02 4 * * * root ruby /home/ubuntu/test.rb
22 4 * * 0 root ruby /home/ubuntu/test.rb
42 4 1 * * root ruby /home/ubuntu/test.rb
ユーザー名なしでも通った。（ラブパイのラズビアンで確認）
42 4 1 * * ruby /home/ubuntu/test.rb
**※上の例もrubyのpathが通ってないと通らない。絶対パスにするかpathに記載すること。**
0  11 * * * /bin/bash /home/ubuntu/bin/test.sh 
```

変数を使ってパスをまとめると良いとのこと。

```
LOG_DIR="/home/logs"
0   9 * * * /bin/bash $BIN_DIR/hoge.sh >> $LOG_DIR/hoge.log
```



参考
http://dqn.sakusakutto.jp/2012/06/cron_crontab9.html
iOSの開発でBuildを高速化した話

## 環境
xcode8.1
swift2.3
optimization Level  `None [-o0]`
iMac5kのフルスペック

## 課題
- クリーンからビルドして、平均`10分`かかり、開発の進捗に影響がでているので改善したい

## 方針
- ビルド時間の平均を`５分`を目標にする(5分くらいならストレスが溜まらないと思い目標にした)

# 改善策
## CocoaPodsからCarthageに置き換える
### 利点
- CocoaPods の場合はライブラリをアプリ本体と一緒に都度ビルドしますが、Carthage の場合はライブラリ導入時にのみビルドするのでライブラリのビルド時間分だけ短縮される

###　導入方法
- [Carthageを使ってビルド時間を短縮しよう](http://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)

### 注意点
- Carthageに対応してないライブラリがあるとCocoaPodsと二重管理になる
- Carthageで管理しているライブラリを頻繁にアップデートするとパッケージのビルド時間が多くなるのでトータルのビルド時間が多くなる
[carthageのビルド時間のトータルは使い方次第](https://project-flora.net/2016/11/14/carthageのビルド時間のトータルは使い方次第/)

## Embedded Frameworkの導入
### 利点
- アプリのコードをターゲットに分割して、Frameworkとして扱うことができる
- コードが分割されるので差分コンパイルがききやすくなる
- Frameworkに分割することで依存関係がはっきりする
- Frameworkごとにテストを行える

### 導入方法
1. File →　New → TargetでCocoa Touch Frameworkを選ぶと
Embeed Framework用のターゲットが追加される
2. メインターゲットで使用したいクラスでimportすれば使えます
 [Embedded Framework使いこなし術] (http://qiita.com/mono0926/items/e29cd17789fd1d1548aa)

## 導入したプロジェクトでの分け方

### Network層
- Networkに依存したクラスを定義

### 永続化層
- DataBase、UserDefault関連
- Modelとの依存関係が強いものもここに含まれる

### イベントトラッキング層
- GoogleAnalyticsなどの計測まわりのクラスを定義

### ライブラリ層
- 依存関係を持たず、使い回すクラスやメソッドを定義
- アプリで使うkeyなどもここに定義されている

### 注意点
- Embedded Framework同士で依存関係がある場合は`build Phases`の`Target dependencies`に含めて設定をする
- Embedded Frameworkのターゲットで使用したライブラリはメインターゲットにもインストールが必要です(CocoaPodsやCarthgeを使うときに注意)

## 結果
- クリーンした状態からのビルドが改善する前は`10分`かかっていたのが
`５分`に短縮!!
- アーカイブの時間も`20分`から`10分`に短縮することに成功:tada:

## 感想
- 今回やってみて、既存のプロジェクトのコードを`Embedded Framework`に対応させるために多くの書き直しが必要になりました.
- 最初の段階でEmbedded Frameworkに対応しておくのをおすすめします(1週間ぐらいかかりました:astonished:)
- Frameworkに分割するために依存関係を整理できたのでコードが読みやすくなった
- 差分ビルドがききやすくなったのでビルド時間によるストレスがなくなった:smile:
- Embedded Frameworkの設定でつまずいたら、[mozilla-mobile/firefox-ios](https://github.com/mozilla-mobile/firefox-ios)のプロジェクトを確認することで解決することができた
- Firefoxは偉大:innocent:

##参考リンク
- [Embedded Framework使いこなし術](http://qiita.com/mono0926/items/e29cd17789fd1d1548aa)
- [Carthageを使ってビルド時間を短縮しよう](http://qiita.com/yutat93/items/97fe9bc2bf2e97da7ec1)
- [妄想iOSアプリ新規開発](https://www.wantedly.com/companies/wantedly/post_articles/33179)
- [Carthage について](http://qiita.com/s-harada_i-enter/items/47295d653ef0cf34d540)
- [mozilla-mobile/firefox-ios](https://github.com/mozilla-mobile/firefox-ios)
- [Carthage/Carthage](https://github.com/Carthage/Carthage)
[JAWS-UG CLI] IAM #57 インスタンスプロファイルへのロール追加 (CodeDeploy)

前提条件
========


IAMへの権限
-----------

IAMに対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.14

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======


0.1. 変数の確認
---------------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

結果(例):

            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       lambdaFull-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region        ap-northeast-1        env    AWS_DEFAULT_REGION


0.2. インスタンスプロファイルの指定
-----------------------------------

インスタンスプロファイルを指定します。

```bash:変数の設定:
IAM_INSTANCE_PROFILE_NAME='CodeDeployEC2InstanceProfile'
```


0.3. IAMロールの指定
--------------------

インスタンスプロファイルにアタッチするIAMロールを指定します。

```bash:変数の設定:
IAM_ROLE_NAME='CodeDeployEC2InstanceProfileRole'
```


1. 事前作業
===========

インスタンスプロファイルを確認します。

```bash:コマンド:
aws iam list-instance-profiles-for-role \
        --role-name ${IAM_ROLE_NAME} \
        --query 'InstanceProfiles[].InstanceProfileName'
```

結果(例):

      []


2. ロールのアタッチ
===================

インスタンスプロファイルにロールをアタッチします。

```bash:変数の確認
cat << ETX

        IAM_INSTANCE_PROFILE_NAME: ${IAM_INSTANCE_PROFILE_NAME}
        IAM_ROLE_NAME:             ${IAM_ROLE_NAME}

ETX
```

```bash:コマンド:
aws iam add-role-to-instance-profile \
        --instance-profile-name ${IAM_INSTANCE_PROFILE_NAME} \
        --role-name ${IAM_ROLE_NAME}
```

結果:

      (戻り値なし)


3. 事後作業
===========


インスタンスプロファイルの確認
------------------------------

```bash:コマンド:
aws iam list-instance-profiles-for-role \
        --role-name ${IAM_ROLE_NAME} \
        --query 'InstanceProfiles[].InstanceProfileName'
```

結果(例):

      [
          "CodeDeployEC2InstanceProfile"
      ]


完了
====
Python2.7 で平仮名とカタカナを逆転させる


# やりたいこと
- ドラえもん => どらエモン にする

# やったこと
```
text = u'ドラえもん 新・のび太の大魔境'
d = dict([(x, unichr(x - 0x60)) for x in xrange(ord(u'ァ'), ord(u'ヴ')+1)] + [(x - 0x60, unichr(x)) for x in xrange(ord(u'ァ'), ord(u'ヴ')+1)])
print text.translate(d)
```

# 結果

```
どらエモン 新・ノビ太ノ大魔境
```

# なにこれ？
- UTF-8 の平仮名と片仮名の差は 0x60 であることを利用して、平仮名→カタカナ、カタカナ→平仮名のマップを作ります。
- str.translate を使って変換。

unicode のことしか考えてないので入力のバリデーションは必要かも。
[Swift]Swiftの勉強のためにToDoアプリを作ってみた Swift3.0対応＆Realm導入


##概要

[[Swift]Swiftの勉強のためにToDoアプリを作ってみた](http://qiita.com/BlackCat/items/8dcbe1d6f996087ecc3b)

上記記事をご覧になった方がTwitterで「Xcode8にアップデートしたらエラーがたくさん」といった旨の内容をつぶやかれていました。
うん、そうなんですよねー、Swiftのバージョンあがりましたからねー。

そんなわけで、Swift3.0対応してみました。

また、大きな変更点としてMagicalRecordはやめて、Realmにします。
ですので、CocoaPodsでインストールライブラリが変更になっています。

Realmに切り替えた理由は

* Realmは業務で使って使いやすかった
* CoreDataはRealmに比べると使いづらい

から。
感覚的なものですみません。


##CocoaPodsアップデート、及びPodfile更新

手順は下記の記事とほぼ同じ。

[[Swift]QiitaのAPIを叩いて記事を取得して表示するサンプルアプリを書いてみた その3](http://qiita.com/BlackCat/items/92ee91f990c9e8774b5e)

Podfileは下記のように修正。

```bash:Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
swift_version = '3.0'  
use_frameworks!

target 'TodoApp' do
  pod 'RealmSwift'
end

target 'TodoAppTests' do
  pod 'RealmSwift'
end

target 'TodoAppUITests' do

end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0' # or '3.0'
    end
  end
end
```

[Realm公式サイト](https://realm.io/docs/swift/latest/)のCocoaPodsのインストールマニュアル参照。

Podsをインストール。

```bash:コマンド
pod install
```

##Xcodeのプロジェクトファイルを開いて、Swift3.0にコンバート

TodoApp.xcworkspaceを開くと、Xcodeが「コンバートする？」って聞いてくるので、コンバートしておく。
あとで手直しする必要はあるんだけど、ま、一応。
コンバートする対象にライブラリ（Framework）が選択できるんだけど、選択しないほうが無難だと思う。

##エラーを直す

###"The Copy Bundle Resources build phase contains this target's Info.plist file 'TodoApp/Other/Info.plist'."って言われた

[TARGET]->[Build Phases]->[Copy Bundle Resouces]を開いて、info.plistを削除すると解決できる。
なんでOtherディレクトリに入ってて、Bundle Resoucesに追加されてるんだろうか。
記憶にないなぁ。

###MagicalRecordをRealmに置き換える

####TodoApp-Bridging-Header.h削除

ファイルを削除したら、[TARGET]->[Build Setteings]の検索窓にbridgeと入力すると、パスが見つかるので、それも忘れずに削除。

####ソースコードを頑張って直す

このあたりはトライ＆エラーなので、割愛。
Realmに関する記事はQiitaでも多く見つかると思うけど、[Realm公式サイト](https://realm.io/docs/swift/latest/)のドキュメントがかなり親切なので、公式サイトを一通り読み流すことをおすすめします。
頑張れ。

手順としては
1. Todo.swiftをRealmのモデルクラスに書き換える
2. CoreData使用箇所をRealmに置き換える

##まとめ

Swift3.0移行はこのアプリの場合はそんなに大変じゃなかった。
データベースはRealmのほうがやっぱり書きやすくて使いやすいね。

ソースコード
[https://github.com/macneko-ayu/SwiftPractice/tree/master/TodoApp](https://github.com/macneko-ayu/SwiftPractice/tree/master/TodoApp)