OmniAICreator/Qiita-1.07M huggingface dataset:
[Swift] NSViewAnimationを型安全にしておきました

NSViewAnimationはお手軽にビューの移動アニメーションをやるのに便利なんですが、初期化に使用する辞書の値がAnyで安全ではないので型安全にしておきました。

```swift
protocol ViewAnimationTarget {}
extension NSView: ViewAnimationTarget {}
extension NSWindow: ViewAnimationTarget {}

struct ViewAnimationAttributes {
    
    private(set) var animations: [NSViewAnimation.Key: Any]
    
    init(target: ViewAnimationTarget, startFrame: NSRect? = nil, endFrame: NSRect? = nil, effect: NSViewAnimation.EffectName? = nil ) {
        
        animations = [.target: target]
        animations[.startFrame] = startFrame
        animations[.endFrame] = endFrame
        animations[.effect] = effect
    }
    
    var startFrame: NSRect? {
        get { return animations[.startFrame] as? NSRect }
        set { animations[.startFrame] = newValue }
    }
    
    var endFrame: NSRect? {
        get { return animations[.endFrame] as? NSRect }
        set { animations[.endFrame] = newValue }
    }
    
    var effect: NSViewAnimation.EffectName? {
        get { return animations[.effect] as? NSViewAnimation.EffectName }
        set { animations[.effect] = newValue }
    }
}

class ViewAnimation: NSViewAnimation, NSAnimationDelegate {
    
    var completeHandler: (() -> Void)?
    
    init(viewAnimations: [ViewAnimationAttributes]) {
        
        super.init(viewAnimations: viewAnimations.map { $0.animations })
    }
    
    required init?(coder: NSCoder) {
        fatalError("Can not initialize with NSCoder")
    }
    
    /// コンプリートハンドラー付き
    func start(completeHandler: @escaping () -> Void) {
        
        delegate = self
        self.completeHandler = completeHandler
        
        start()
    }
    
    ///
    func animationDidEnd(_ animation: NSAnimation) {
        
        completeHandler?()
        delegate = nil
        completeHandler = nil
    }
}
```

使用例

```swift
let view1 = NSView()

// ここを別々に設定
var animeAttr1 = ViewAnimationAttributes(target: view1)
animeAttr1.startFrame = NSRect(x: 0, y: 0, width: 100, height: 100)
animeAttr1.endFrame = NSRect(x: 100, y: 100, width: 100, height: 100)
animeAttr1.effect = .fadeIn

let view2 = NSView()

// 初期化時に全部設定
let animeAttr2 = ViewAnimationAttributes(target: view2,
                                         startFrame: NSRect(x: 100, y: 100, width: 100, height: 100),
                                         endFrame: NSRect(x: 0, y: 0, width: 100, height: 100),
                                         effect: .fadeOut)

let animation = ViewAnimation(viewAnimations: [animeAttr1, animeAttr2])

animation.duration = 0.5

// コンプリートハンドラー付きstart
animation.start {
    print("Finish animation")
}
```
OpenAIGym の基本的使い方

# OpenAIGym

OpenAIGymは強化学習を効率良く行うことを目的として作られたプラットフォームです。

普通、ゲームを使って強化学習を行うとき、強化学習についての深い知識や経験だけでなく、ゲームに関しての深い知識や経験も必要になってきます。
OpenAIGymはこのゲームに関する部分を簡単に実装でき、必要なパラメータなどを使いやすい形で提供してくれるので、**利用する側は強化学習のみに専念することができます。**

#使い方

インストールしていない方は

```
pip install gym
```

でインストールしましょう。

```ruby:cartpole.py
import gym

env=gym.make("CartPole-v0")

for episode in range(20):
    env.reset()
    for t in range(100):
        action=env.action_space.sample()
        env.step(action)
        env.render()
```

![CartPole.gif](https://qiita-image-store.s3.amazonaws.com/0/225485/9202c2b0-17a0-5ced-5cbe-cf6b4b55b7c5.gif)

これがOpenAIGymの基本的な形になります。

`env=gym.make("CartPole-v0")`この部分にゲーム名を入れることで、いろんなゲームの環境を構築できます。

`env=gym.make("MountainCar-v0")`にすれば

![MountainCar.gif](https://qiita-image-store.s3.amazonaws.com/0/225485/26553c87-f19d-c419-394c-eb9866168152.gif)

別ゲームになります。

`env.reset()`で環境がリセットされ、初期状態になります。

```python3
for t in range(100):
        action=env.action_space.sample()
        env.step(action)
        env.render()
```

この部分では実際にゲームをプレイし、描画します。

`action=env.action_space.sample()`はランダムな行動という意味です。CartPoleでは左（0）、右（1）の2つの行動だけなので、actionの値は0か1になります。

その後`env.step(action)`で行動し、`env.render()`で描画します。

#関数やパラメータ

`env.step(action)`では実際に行動をしますが、そのとき以下のような4つのパラメータを返します。

1.observation（ゲームの状態）
2.reward（報酬）
3.done（終了判定）
4.info（デバッグなどの情報）

```python3
observation,reward,done,info=env.step(action)
```

とすることでそれらの値を取得できます。

```python3
import gym

env=gym.make("CartPole-v0")

for episode in range(20):
    env.reset()
    for t in range(100):
        action=env.action_space.sample()
        observation,reward,done,info=env.step(action)
        env.render()

        print("\nobservation=",observation)
        print("\nreward=",reward)
        print("\ndone=",done)
        print("\ninfo=",info)
```

<img width="414" alt="SnapCrab_NoName_2017-12-23_13-31-50_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/c332cd6b-28ab-4b98-1add-cefdad754895.png">

<img width="412" alt="SnapCrab_NoName_2017-12-23_13-32-9_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/225485/892fe16f-8dfe-1f07-5bb1-b928a91a5491.png">

CartPoleでは、
observation=[カートの位置　カートの速度　ポールの角度　ポールの回転速度]、
棒が倒れているときreward=0でdone=True、棒が立っているときreward=1でdone=Falseとなります。
【PHP】csvを自前で作った話 | ダブルコーテーション問題でfputcsvは使わず実装

# やりたいこと

phpでcsvファイルを作成するにあたり、
全てのフィールドをダブルコーテーションで囲うプログラムを作りたい

# fputcsv()を使ってcsvを作る

## ダブルコーテーションで「くくられる」or「くくられない」

```php:sample
    $header = [
        'MakeCsv',
        'SampleReport',
        'Php',
        'Date',
        'Csv'
    ];
    $data = [
        "hoge",
        "ho ge",//半角スペース1つ
        "ho  ge",//半角スペース2つ
        "ho　ge",//全角スペース1つ(全角スペースは$enclosureでくくられない)
        "hoge"
    ];
    $delimiter = ',';//引数として設定しなくてもデフォでカンマ区切り
    $enclosure = '"';//引数として設定しなくても必要があればダブルコーテーションでくくってくれる？
    $escape ; //今回未使用だが、エスケープしたい文字があれば指定する
    $csvFile = fopen('test.txt', 'w');
    fputcsv($csvFile,$header, $delimiter, $enclosure);
    fputcsv($csvFile, $data, $delimiter, $enclosure);
    fclose($csvFile);
```

出力結果

```php:test.txt
    MakeCsv,SampleReport,Php,Date,Csv
    hoge,"ho ge","ho  ge",ho　ge,hoge
```

このように、fputcsvというphpの関数を使用してみたが何かと不都合が多かったです。
http://php.net/manual/ja/function.fputcsv.php

## delimiter

delimiterの設定は上手くいきました。
そもそも引数として取らなくても、デフォルトで「,」(カンマ)区切りとなっています。

## enclosure

enclosureの設定が上手くいきませんでした。
一文字で区切るためのオプションですが、
フィールドに半角スペースが入っていると、デブルコーテーションでくくられますが、
全角スペースが入っていても、くくられない問題があります。

書き方の問題かと思い、エスケープ「/"」などを試してみましたが、どうやらそうゆう問題ではなさそうで、
enclosureの「"」は、エスケープ済みであるらしく、バックスラッシュで区切る必要はないみたいです。
しかし、だからといってダブルコーテーションでくくられるわけではありませんでした。

php5.4以降に出来たオプション ```escape_char``` と組み合わせても、うまくいかなかったです。
http://d.hatena.ne.jp/miau/20141214/1418574582

fputcsvを使って「""」(ダブルコーテーション)を必ず囲うという組み合わせは、諦める方向で判断しました(´Д` )

# 結論!! 文字列として、自前でcsvにする

配列を文字列にし、必要な文字を追加していきました。
「"」「対象の値」「"」「,」「/n」の順で、文字列として追加
※cakePHP3を使用しているので、new Folderなどは適時置き換えて下さい。

```php:sample
    private function _createCSV($data, $header, $fileName)
    {
        $folderPath = TMP . 'csv-sheets/';
        $dir = new Folder();
        $dir->create($folderPath);

        $stream = fopen($folderPath . $fileName, 'w');
        fwrite($stream, $header);
        foreach ($data as $row) {
            $out = '';
            $row_tmp = '"';
            $row_tmp .= implode('","', $row);
            $row_tmp .= '"' . "\n";
            $out .= $row_tmp;
            fwrite($stream, $out);
        }
        fclose($stream);
    }
```

これで、すべての値がダブルコーテーションでくくられることが出来ました。

※関数fwriteは、配列を引数としてとれないので、ヘッダーに関してはフィールドの値が決まっているため、直で文字列で格納しています。

    $header = '"MakeCsv","SampleReport",Php,"Date","Csv"' . "\n";


# ダブルコーテーションにこだわる必要はあったのか

今回はcsvファイルを作成する上で、ダブルコーテーションを必ず付与するという仕様のためダブルコーテーションにこだわりました。

しかしそもそも、csvファイルとしては、すべてにダブルコーテーションをつける必要はなかったのではないかと疑問を抱きました。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11145768576

スペースが間に入っていたりすると、その区切りとして、ダブルコーテーションが必要で、
fputcsvは、間にスペースがある値にダブルコーテーションを囲っていて、それ以外は囲ってないのは、それで問題がないから囲ってないのかもしれない。

懸念点を一つあげるとしたら、windowsのエクセルがshift-jisなため、shift-jisに変更しておかないとダメな可能性があります

## RFC 規約を見てみる

RFCによると、ダブルコーテションをつけるつけないは、どっちでも良いみたいです。

ただし、フィールドにダブルコーテーションがある場合は、そのフィールドをダブルコーテーションでくくらないといけないなどの例外はある模様でした。
http://www.kasai.fm/wiki/rfc4180jp

ダブルコーテーションでくくらないといけない理由が少しでもあると救われます^_^;
ROS Masterの起動に合わせて自動で再起動するノード

## まえがき

ROSを使ってロボット実機を動かしている人はロボットに`roscore` (+ロボットのコントローラノードなど)を上げておいて、各自のLaptopから`ROS_MASTER_URI`を設定してロボットと通信して実験をしていると思います。

ここで面倒なのはロボットに何らかの問題が発生し（バッテリ・ネットワーク切れなど）て`roscore`が見えなくなると、すべての関連ノードを再起動しないといけないことです。
そこで、masterを監視して、自動で再起動（ROS的にいうと`respawn`）するラッパースクリプトを書いたので、共有します。

## やりかた

- セットアップ

    ```bash
    sudo wget https://gist.githubusercontent.com/furushchev/7cb528bdabf650bd067e26685c903a4c/raw/f88c27b225c08b67fcddc60620e5f8b9a5944afe/auto_restart -O /usr/local/bin/auto_restart
    ## Wow, too low security!
    ```

- 起動

    ```bash
    # ロボットなど
    roscore
    ```

    ```bash
    # ラップトップ
    auto_restart rosrun rviz rviz
    ```

    この状態で`roscore`を落とすと、rvizも落ちます。
    で、もう一度ロボットで`roscore`を上げると、再度`rviz`が起動します。

## まとめ

- これでロボットを再起動するたびにロボット組み込みディスプレイにデモ用のRVizを上げ直す必要がなくなった。
- PR2などでは`rqt_pr2_dashboard`をこれで起動することで、バッテリ切れに気がつきやすくなった。

## おまけ

Ubuntu限定でデスクトップアプリ？を作る方法

下のようなファイルを作ります。（ここでは`RViZ.desktop`というファイル名）

```bash
[Desktop Entry]
Version=1.0
Type=Application
Icon[ja_JP]=task-past-due
Icon=task-past-due
Name[ja_JP]=RViz
Name=RViz
Exec=/bin/bash -l -i -c "DISPLAY=:0.0 ROS_MASTER_URI=http://robot:11311 /usr/local/bin/auto_restart rosrun rviz rviz -d $(rospack find my_awesome_pkg)/config/startup.rviz"
```

上のファイルを`~/.local/share/applications/RViZ.desktop`などとして置きます。

Ubuntuの右上のメニューから`rviz`と入力するとアイコンが出ると思います。
これをデスクトップにドラッグすると、RViZをデスクトップショートカットとして登録できます。
Excelで関数型プログラミングに目覚めたかもしれない。（元ネタ編）

# はじめに
元ネタへのフィードバックです。

# 元ネタ7頁から

さ「セ君、プログラム言語は何を使いたいの？」
セ「Excel　VBA　です」
さ「良い選択ね。ではまず、０から９までの数をすべて足すコードを書いてみて？」
セ「はい。余裕です。(なぜ０からなのかは怒られそうなのでスルー）」

```vbnet
Function NETA1(R)
    NETA1 = WorksheetFunction.Sum(RR(R, 1, 1, MM(R), 1))
End Function
```

| L        |      A    |  
|----------|-----------|
|=MM([L])-1|=NETA1([L])|

# 元ネタ197頁から

さ「じゃあ、次。フィボナッチ数列を求めよ」
セ「... (ピネの公式は黙っておこう）」

```vbnet
Function NETA2(R, Optional S = "")
    Dim M: M = MM(R)
 
    If M < 3 Then
       S = 1
    Else
       S = DI(R, M - 2) + DI(R, M - 1)
    End If
    
    NETA2 = S
End Function

```
| L        |      FIB    |  
|----------|-------------|
|=MM([L])-1|=NETA1([FIB])|

# 元ネタ２００頁から

さ「関数型プログラミングでは、『必要なときに必要な分だけ計算する方法』が重要よね？」
セ「なるほど」
さ「一回コードで計算したものは、メモリにキャッシュしておく仕組みをかましてやるの。」
セ「おお、さすが関数型プログラミングだ！」


# 元ネタ２９１頁から
さ「表計算アプリのA1...B1...というUIは、すべて同じ『時刻』という世界のバージョンナンバーを
共有しているイミュータブルなデータね。」
セ「えっ。（理解不能）」

# まとめ
元ネタの内容を読まずに批判するのは嫌なので、書籍を購入、半分以上理解不能でした。
node.js や React の2017年現在の隆盛を予言した黙示録なのでしょうか。

俺「関数型プログラミングは、Excelによく似合うよね」
セ「えっ。（理解不能）」
Easy Way to Start "vagrant + rancher (3 nodes (?))"

# Easy Way to Start "vagrant + rancher (3 nodes (?))"

- これは Rancher Advent Calendar 2017 12/21 の記事になります
- おそくなりましてすみません…

## 対象

- Rancher 気にはなってるもののまだ試せていないかた
- できるだけ手を抜きたいかた
- Docker とか Linux とかもあまり詳しくないけど Rancher さわってみたいかた
  - せっかくの GUI ですしね

## 目的

- できるだけ楽して Rancher お試し環境を手元につくりたい
  - AWS 上に AMI(マシンイメージ) を使って Deploy する方法もわりと楽ではありますがお金がかかってしまいますし、AWS の基本操作を一通り知って置く必要もあります。正しい知識を持って設定すれば大丈夫なのでしょうがセキュリティを気にするかたもいらっしゃると思います。
  - なので AWS についてもそのうちまとめとこうと思いますが今回はパスします。

## 前提

- 8 GBかそれ以上の物理メモリの搭載されたPC
- Virtual Box 実行環境
- vagrant 実行環境
- ちょっとしたターミナル(コマンドライン)操作ができる
- ssh, git, ruby

## 制限事項

- ほんとはコンフィグ通り 3 ノードで試したかったのですが私の非力PCではどうにもこうにも立ち上がりませんでした…
- なので 1 ノードに設定を書き換えています
- その他、タイムアウト値、メモリサイズ も変更しています
- ファイルの差分情報は後述しますので、必要に応じて変更してください

## 対象 Vagrant Box

- 今回は以下の Git レポジトリの Vagrant ファイルを利用します

> https://github.com/rancher/vagrant

- 他にも rancher の vagrant file として https://github.com/rancher/os-vagrant が見つかると思いますが "no longer be supported" の記載があったので今回は見送りました。

## 手順

### ターミナルを開いてコマンドを打ち込んでいくだけ

- マシンスペックにもよりますがそれなりに時間がかかります
- (コーヒーでも飲みながら…)

```
mkdir -p my-vagrant-files/rancher
cd my-vagrant-files/rancher
git clone https://github.com/rancher/vagrant.git
cd vagrant
```
```
ls
README.md                         localranchervagrant.PNG
Vagrantfile                       rancher_id
certs                             scripts
config.yaml                       vagrant_rancheros_guest_plugin.rb
```
```
vagrant up
```

### プロンプトがエラー無く戻ってきたら完成しているはずです

- ブラウザでアクセスしてみましょう
- アドレスは固定です
- 上の github サイトに書かれている http://172.22.101.100/ です

![Screen Shot 2017-12-23 at 12.57.29.png](https://qiita-image-store.s3.amazonaws.com/0/67892/88f00854-b989-0b7d-8a8d-53e9d1283aef.png)

![Screen Shot 2017-12-23 at 12.58.59.png](https://qiita-image-store.s3.amazonaws.com/0/67892/0b90ced5-af63-4dd3-db3f-6b79ca5868c7.png)

![Screen Shot 2017-12-23 at 12.59.25.png](https://qiita-image-store.s3.amazonaws.com/0/67892/aa30c9dc-6e68-efe1-bb8e-c51be9460ea4.png)


- どうですか、開けましたかね?

## 停止と削除方法

- うまくいかないときは停止、削除して作り直しましょう…

```
vagrant halt
```
```
vagrant destroy -f
```

## ファイル差分情報

```
% diff Vagrantfile Vagrantfile.original
56d55
<       server.vm.boot_timeout = 600
91d89
<       node.vm.boot_timeout = 600
```
```
% diff config.yaml config.yaml.original
16c16
<   memory: 512
---
>   memory: 1024
20c20
<   memory: 1024
---
>   memory: 2048
22c22
<   count: 1
---
>   count: 3
24c24
<   memory: 1024
---
>   memory: 2048
```
納期と障害とElasticBeansTalk/DynamoDB のお話



* さて、納期がありますね。  
* 急いで開発しますね。  
* リリースしますね。  
* 喜びますね。  
* お客さん沢山きますね。  

・・・（しばしリリースを喜ぶ）

* 負荷が上がりますね。  
* 詰まりますね。  
* 障害ですね。  

こんにちは。ElasticBeansTalkを作ってとあるキャンペーンの特設サイトを構築した話です。  


# やること概要

* リリースまで残り10日くらい
* キャンペーン期間は一ヶ月以下
* SSLじゃないとダメ
* Nodejs, Nginx, 適当なNoSQL

期限的にオンプレでssl証明書買うのは無理だし、ちゃんとしたの買うと短い期間しか使わないのに高い。そしたらクラウドに金払った方が良い。
どうやらAWSでACMというやつで高速で証明書発行してhttpsサイト作れるらしいじゃないの。最高。   
そしてElasticBeansTalkというやつで高速にELB+EC2（Nginx＋Nodejs）＋DynamoDB立てられるらしいじゃないですか。  

こりゃ楽勝だな。  

# やったみた
* ElasticBeansTalk＋ACMを使って、サンプルアプリデプロイして動かすまで1日かからず。最高。  
* インフラとしては監視を入れたい。ebextensionsを使ってCloudFormation的なものを書く。ほぼサンプルなのでデプロイすれば動く。楽勝。  
* ↑のものを何が書いてあるのに理解するのに3日くらい（まだ理解仕切れていない）。AWS普段触らない人には辛い。  
* AWSでどれくらいかかるか詳細見積もり（ざっくり見積もりはEC2使うと決めた時点でざっくりとっていたが、インスタンスタイプとかアクセス見積もりとか詳細のやつ）。  
* DynamoDBもサンプルデプロイして半日たたずに動く。なるほど。オートスケールはデフォルトじゃないのか。気をつけないとね。楽勝（嫌な予感。伝えておかないと。でもあとでね）。サンプル突っ込んだら動いたことを開発側に伝えて、ドキュメント渡してその後ここを丸投げ。  
* Slack通知もしたいねということで、LamdaのBlueprintとかいうのを使ってSNSからLamda通してSlack通知へ。
* その他eb設定もebextensionsで管理 

ざっくり作ってインフラ・アプリ共々動いてるのでリリースはできた。 

# で、問題は？
リリース後、しばらくしたら5xx返すかクソ重いかになる。  
EC2はCPUまあまあ食ってるけど詰まるほどではない。メモリはスカスカ。サーバ内書き込みないからDiskIOなんて起こるはずもない。確かにNodejsなので１プロセスだけ立てててそれが詰まると死ぬのだが、それだったらCPUはりつくのではという感じだし。実際にオートスケールの下限を増やしたが関係なし。  
となるとDBだな。 
はい。DynamoDB詰まってました。  

### オートスケールするんじゃないの？  

前述した通り、オートスケールはデフォルトではありませんでした。  
自分で手作業で検証した時には気がついていたけどちゃんと伝えられてなかった。開発側がebextensions書いてTable作るとのことでそのままお任せしてしまった。  

* 高速Backend開発。忙しすぎる開発者。  
* そしてリリースされるアプリ。  
* オートスケールしないクソ弱いDB。  
* 当然詰まる。  

死。  

  
 
# 教訓
雑にまとめておきましょう。

* なんとなく嫌な予感は大切にしましょう
* 気になることはなんでも伝えましょう。せめてSlackになげこみましょう
* 忙しい人は細かいこと忘れるので、少しでも余裕がある人が地雷を気にしてあげましょう
* 後で絶対にやる・確認するタスクは分かりやすいところに置きましょう。
    * 今回はリリース前に気になりリストを最終確認する時間を取れば問題起こらなかったですね
    * github issueとかだとめっちゃ急いでいると見るの忘れるので、slackのリマインダ機能使いましょう。


忘れそうなものは分かりやすいところへ。PULL型ではなくてPUSHで教えてくれるように。

以上
サーバリソースをCloudWatchへ連携する

#collectdを使用してEC2(Linux)のサーバリソースをCloudWatchへ連携する

##1.対象EC2のIAMにポリシー追加

```json:policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1495084468000",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```
##2.EC2上でで次のシェルを実行
```shell:collectd_setup.sh
#collectdのセットアップ準備
mkdir /etc/collectd 
yum -y install collectd 
yum -y install collectd-python
chkconfig collectd on
git clone https://github.com/awslabs/collectd-cloudwatch.git　/etc/collectd/
chmod 700 /etc/collectd/src/setup.py

#collectdセットアップ実行
(echo "1"; echo "1"; echo "1"; echo "1"; echo "1"; echo "1"; echo "1"; echo "2"; echo "1"; echo "3"; cat) | /etc/collectd/src/setup.py

#連携するリソースを記述
cat << 'EOW' >/opt/collectd-plugins/cloudwatch/config/whitelist.conf
df-root-percent_bytes-used
cpu--percent-active
memory--percent-used
EOW

```

##3.確認方法

1.AWSコンソールのCloudWatch>メトリクスを開く
2.名前空間>collectdへ移動
3.EC2のinstance-idで検索
メトリクスが作成されているので、CloudWatchで監視(ERRORが出たらメール通知など)などができます。

###参考
https://qiita.com/wadatin/items/7236aafe5a3f553d86ff
collectdを使わないでメトリクスを作成する方法→https://gist.github.com/inokappa/2a220eb50793094e1c0a
インフラエンジニアがコード書けるようになるために paiza と progate を使っている感想

# これは何
バックエンド開発ができるようになるためにお家でPaizaやProgateを使ってPHPやRailsをお勉強している話。
使っている途中なので、もうちょっと進むと意見は多少変わるかもしれないが、今の段階で考えていることを記録しておく。

# 背景
私はメインの専門領域はWebインフラエンジニア（サーバエンジニア）なわけですが、そろそろアプリケーションコードもそこそこ書けるレベルじゃ無いと仕事がしづらいなと思ってきた。
だいたいコードの関連箇所の概要教えてもらったらなんとかコードを読み書きできる。でも自分一人で完全に問題箇所特定して修正してチューニングする、みたいなことがちょっとしにくい気がしている。SREとして生きていくにしても、自分でサービス作るにしても必要な知識が圧倒的に足りない。

# どう学ぶか？
### 会社で
一番いいのは会社で仕事としてアプリケーションコードを書くのが良い。とはいえ、私のメインで関わっているシステムはレガシーすぎるので「綺麗なコード」とか「良いアーキテクチャ」というのを学ぶのがなかなか難しい（らしい）。本とか読めばある程度分かるのだろうが、ベースである程度読み書きして体に染み込んで無いと辛いところはある。  
インフラ領域においてはやはりレガシーなところに放り込まれたが、３年という潤沢な時間をかけて試行錯誤しながら（なんとか動くくそコードを量産しながら）なんとか良い状態とは何かというのがなんとなく分かったつもりである。同じようにアプリケーションについて泥沼で試行錯誤し続けるのも非効率な気がした。  

### 自分で
となると、まずは独自で学習するしかない。ある程度分かってきたらそこそこ新しいシステムでアプリケーションコードを書かせてもらうように交渉するのが良さそう。
というわけで教材を探すわけである。とは言っても能動的に探したというよりも、問題意識を持っていたらTwitterで流れてきたのが目についてそれに飛びついた形。
さて、前置きが長くなったがPaizaとProgateについて。

# Paiza
### 私から見た教材内容
競技プログラミングを学ぶためっぽい感じの内容だった。お題が出されてそれを実装する。主に実装速度（と高レベルになると実行速度）が見られる感じ。
実装速度を求められるのは新鮮で、就職活動をするときに自分の実力を知るためにFizzBuzzを時間計って頑張って書いたのを思い出した（10分以内にかけないくそプログラマもいる、と書かれている記事を読んだ後にやって7分くらいでできたので安堵したのを覚えている）。
### 選んだ言語
仕事でPHP関係が多いので、まずは最低限PHPコード読むのに苦労しない程度学ぼうと思ってPHPを選ぶ。
### 内容とレベル感
ざっくりやってみて、Bレベルまでは解けるのは分かった。このレベルだと、想定回答時間内に終わらないことも多いが、最終的になんとか回答できる感じ。Cレベルは普通にふわっと書いて終わるレベル。
Bで苦労するものがまあまああるので、Aは無理そう。  
しばらく頑張ればBがスイスイ解けるようになるだろうと思ったが、今そうなりたいかと言われるとちょっと違うと思ったのでここで終わり。  
### 求人？
ところで、Paizaは求人と紐付いているだが、きている求人があわなさそうなのが多いのでちょっとないかなという感じ。提案されるお給料にコーダーとしてのお値段を実感した。コードだけ書きたいわけでもなし、ここを極めるのは自分の進む違う感じがして一旦終わり。

# Progate
### 私から見た教材内容
html&cssの教材とruby, Railsの教材をとりあえずやってみた（ｈｔｍｌ初級終わり、Railsコースは多分半分くらい。レベルは５０ちょっと）。アプリケーションを実際に作ってみるというのに重きを置いている感じ。ちょうど何か自分で全部作りたいなと思っていた時期だったので、マッチした。

### 内容とレベル感
内容としては、「一気に全てを学びましょう」ではなくて、RailsだったらRailsの機能に焦点を当てているところが特徴的。当然、見た目それっぽいアプリケーションを作るためにはHTMLやCSSの知識も欠かせないわけだが、そこらへんは「ここにもう書いてあるのでコピペして該当箇所に貼ってね」という感じで、本当に基礎のところを知っていればスムーズに学びを進められる。綺麗なWebサイトつくるために後でそのコースも取ろうかな、と思わせる作り方なのがよかった。

### 自分とマッチしているか
今の所結構良さそう。Railsはアプリケーションを高速で作るのに適していると聞くし、後で自分のプロダクト作るときに使えそう。裏の細かい技術的なことはインフラやってる経験から後からまあまあ調べられると思うし「だいたいこんなんで作れるだろう」というレベルまでいければ御の字。しばらく頑張ってみたい。

# おまけ
### N予備校
半年前〜1年前くらいにプログラミングコースちょっとだけ見てみた。環境構築からしっかり学ばせるというコンセプトが強い。そこらへんは個人的には（インフラ専門なので）間に合っているので別にこれじゃなくていいかなというところ。本当のエンジニア初心者には結構良いかもしれない。関係ないが、世界史とかの講義を聞いていると「なるほどそういうことだったのか」という学びが大きいので、そういう一般常識的なものを学ぶのにむしろ使いやすそう。しかし講義は１時間とか長いのでもうちょっと細切れの方が楽だなあと思いつつ、ちゃんと流れで理解するためにはそれくらいのまとまりは必要だろうなどと思ったりする。

# 終わりに
* 昔は本使ってRails触ってみて学習続かなかった。Webサービス使うとうまく進捗や理解を管理してくれるので楽
* 微妙にお金はかかるけど専門書買うのより安かったりして最近麻痺してお金をいろいろ突っ込んでいる。
* Progateは実際に手を動かして、それっぽい綺麗なものができてくるとモティベーションが上がる。ものづくりの楽しさ
* 他の人に任せ切りになっていた仕事の詳細が徐々に見えてくるので気づきが多い
CloudWatchLogsを使用する

#EC2(Linux)上のログをCloudWatchLogsへ連携する

##1.対象EC2のIAMにポリシー追加

```json:policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        }
    ]
}
```

##2.Linuxサーバで次のシェルを実行

#####※リージョンの指定とawslogs.confの作成部分を編集して下さい

```shell:LaunchConfigurations.sh
#リージョン指定
REGION_NAME='ap-northeast-1'

mkdir /etc/awslogs/
cd /etc/awslogs
curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O

cat << 'EOW' >/etc/awslogs/awslogs.conf

# 下記URLの公式ドキュメント見てawslogs.confを作成してください
#http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html
[general]
state_file = /var/awslogs/state/agent-state

[file_name_1]
file = 
log_group_name = 
log_stream_name = 
#datetime_format = #指定しない場合は、自動で読み取ってくれる
#multi_line_start_pattern = {datetime_format}　#トレースが出力されるログの場合は必要

[file_name_2]
file = 
log_group_name = 
log_stream_name = 

EOW

chmod +x /etc/awslogs/awslogs-agent-setup.py
chmod +x /etc/awslogs/awslogs.conf
./awslogs-agent-setup.py -n -r ${REGION_NAME} -c awslogs.conf
chkconfig awslogs on
```
####AWSコンソールから確認すると2.で指定したロググループとログストリームが作成されているので、以下の様な事ができます。

・連携したログを監視(ERRORが出たらメール通知など)する
・障害調査に使用する
プライベートアポスティーユに迫る

nemアドベントカレンダーでアポスティーユについて2つ記事が上がっていますが、今日はNEMのユーザですらよく分かっていないと言われている、プライベートのアポスティーユの正体について迫ってみます。

## NEMのアポスティーユの種類

NEMのウォレットアプリでアポスティーユを取ろうとすると、パブリックとプライベート(譲渡・アップデート可能)の2種類から選ぶ事ができますが、この違いは公証アカウントを共通の物を利用するか、1つのアポスティーユで専用のアドレスを使うかの違いとなります。また、プライベートの場合、アポスティーユしたときに生成されたアドレスのプライベートキーも証明書、ntyファイルで確認することができます。

* パブリック: 公証アカウントに共通の物を利用する
* プライベート: 公証アカウントを1つのアポスティーユで専用のものを作って利用する

## 公証アカウントに専用のものを用意する意味

では、なぜプライベートのアポスティーユでは専用の公証アカウントを用意するのかいうと、専用の公証アカウントを用意することによって、アポスティーユに以下の機能を持たせるためです。

* アポスティーユのアップデート
* アポスティーユの分割・譲渡

## アポスティーユのアップデート

アポスティーユのアップデートは、初回のアポスティーユで生成された公証アカウントのアドレスに再度、ファイルのハッシュ値をメッセージに刻んでトランザクションを発生させる事で実現させています。
これによって、公証アカウントのトランザクションの履歴を追うことで、更新がいつあったかを、新しいファイルのハッシュ値をブロックチェーン上に刻むことができます。

## アポスティーユの分割・譲渡

アポスティーユの分割・譲渡を行うのに、なぜ専用の公証アカウントが必要なのかというと、アポスティーユの分割・譲渡を公証アカウントのマルチシグアドレスにすることによって表現したいがためです。

### マルチシグアドレスとは

端的に言うと複数人の署名がないと出金できないアドレスとなります。
予め署名者として３人指定して、そのうちの２人の署名がないと出金できないということができるようになります。
マルチシグのわかりやすい記事はタヌ神さまが[ありがたい記事](http://godtanu.hateblo.jp/entry/2017/12/21/021027)を書いているのでこちらを参考にしてみてください。

### アポスティーユの分割・譲渡をマルチシグアドレスで実現する

プライベートアポスティーユしたファイルをAさんからBさんへ分割・移譲する流れを順を追って説明します。

![スクリーンショット 2017-12-22 18.42.43.png](https://qiita-image-store.s3.amazonaws.com/0/9315/c178ffd0-a092-1ba0-0603-36c99b793c55.png)

新規でアポスティーユする場合は、NanoWalletでアポスティーユの保管先を「プライベート、譲渡、アップデート可能」を選択して、アポスティーユします。
アポスティーユする時に、専用の公証アカウント(アドレス・秘密鍵)が生成されます。

![スクリーンショット 2017-12-22 18.42.53.png](https://qiita-image-store.s3.amazonaws.com/0/9315/e26e8e47-75fe-f0ba-4c7f-edcb6f5c8160.png)

所有者を分割するときは、まず公証アカウントをマルチシグアカウントにする必要があります。(このときに公証アカウントにいくらかのxemが必要となる)
マルチシグアカウントにする時に、署名者にAさんとBさんを加えることで、公証アカウントの署名者に属しているAさんとBさんがこのアポスティーユの共同所有者であるということになります。

![スクリーンショット 2017-12-22 18.43.03.png](https://qiita-image-store.s3.amazonaws.com/0/9315/836a48d4-1ef5-4734-45f5-ed18f5f4945f.png)

所有者をAさんからBさんに移譲する場合は、公証アカウントの署名者からAさんを削除することで、アポスティーユの所有者がAさんからBさんに移ったことになります。

## プライベートアポスティーユの用途・パブリックとの使い分け

プライベートのアポスティーユは公証アカウントを専用の物を用意することで、アポスティーユの更新、所有者の分割、移譲を実現させています。用途としては不動産や高級時計の権利関係の処理に使えるのではないでしょうか。
プライベートのアポスティーユは便利なのですが、秘密鍵を扱うため慎重になる必要があるので、単純にタイムスタンプが欲しいだけの場合はパブリックを使用するとよいでしょう。(OpenApostilleもこの理由でパブリックのものしか扱っていないです)

## まとめ

プライベートのアポスティーユはマルチシグアドレスを利用して、権利の分割、移譲を実現させており、うまくNEMの機能を使っているなと感じましたが、一方でそれゆえ理解されずらいと感じました。
今回の記事を書くに当たって、NanoWalletでこれらの操作をやっていたのですが、多くの人がこの恩恵を受けるにはUIが使いにくいと感じたので、この辺は別途仕組みを用意した方がよいと思いました。
その一方でアポスティーユは色々な可能性をまだまだ秘めていると思うので、2018年はアポスティーユを有効活用したユースケース、サービスが出てくる事を期待します。
非情報卒のエンジニアが応用情報技術者試験を受けたので記録しておく


# これは何
2017年10月にIPAの応用情報技術者試験を受けました。12月合格発表で、結果が出たので、考えたことを記録しておく。

# 結果は？
合格した。点数は午前７５、午後６８ですれすれというほどでもないけどなんとも言えないところ。とはいえ、資格試験はボーダを超えるのが重要なので目標通りではあるのでOK。

# 応用情報って何
IPAが言ってる７段階のレベルの３に当たるもの。「そろそろきちんとエンジニアとしてやっていくかな〜」と考えているような人が受けるレベル。
午前試験と午後試験で分かれている。午前試験の開始が（特に私の所属する企業の）エンジニアの起床時間と比べて早いのが特徴的。
詳しいところ気になる方はググる感じでよろしくお願いします。

# なぜ受けたか

* 大学が化学系で、情報系出ていないのでコンプレックスがある
* 受かると会社で一時金が出る
* 幅広い知識も業界内の専門外の人と話す時に重要と思った
* 経産省の調査で、諸外国含めたIT人材のレベルとお給金、的な資料を読んだ。だいたい自分のレベルとお給料の市場相場が一致しているのだなと気がついて、知識ベースアップのために受けてみることにした。（また、米国水準だと同じレベルだとお給金もうちょっと良さそうなので英語もぼちぼちやる）
参考資料： 
http://www.meti.go.jp/policy/it_policy/jinzai/27FY_report.html
http://www.meti.go.jp/policy/it_policy/jinzai/27FY/ITjinzai_global.pdf


# 対策は？
### 前提知識（試験前のレベル）
##### 午前試験
過去問見てみると業務で見たような単語が多い。過去問道場で雑にやってみると午前試験が無勉強で４割くらい取れる感じだった。最初のテキスト半分くらい読み終わった終わった段階で午前試験の過去問５割くらいだった。
##### 午後試験
午後試験は１０分野のうち４分野選択するのだが、私はセキュリティ、アーキテクチャ、ネットワークが無勉強で５〜１０割くらいでばらつきあるが平均で合格点取れそうだが、あと1分野はどれも５割切りそうなのでどれとるか迷うレベル。

### 勉強時間は
多分３０時間くらい。移動時間にやっていたのが多いので測定不能だがだいたいこれくらいだろう。平日の移動時間に10分くらいの細切れ学習時間の積み重ねと、土日のどちらかの１〜２時間くらいをカフェでのんびり参考書読む感じだった。
おそらく午前試験に２０時間くらい。午後試験に１０時間いかないくらい。

### 学習内容
#### 午前試験

* 参考書を読む「キタミ式イラストIT塾　応用情報技術者 平成29年度」。この参考書はわかりやすくてよかった。他の参考書も買ったが、なぜそうなるのかとか書いておらず「公式」とか書かれていたのでゴミ箱に捨てた（比喩）。まずは本の７割くらい苦手分野を中心にざっくり読んだ。
* 過去問道場というサイトで電車内でちまちま過去問やる。過去問題解きつつ、わからなかったら参考書やググる。気になったものがあったら好奇心のままに調べる（ただし移動時間10分くらいの長さだけ。基本深くは潜らない）。

#### 午後試験
だいたい１週間前（本格的には前々日）から午後試験対策をした。参考書は２週間前くらいに中古の安いやつ買った。「2014 応用情報技術者午後問題の重点対策 (午後問題対策シリーズ)」。この本も解説が詳しくてなかなかよかった。
版は古いのは、どうせ資格試験なんて大して内容変わらないだろうと思っての安いのを選んだ。試験では新しい話題も出てきていたが、正直ベースがあればやはり解けるので新しいのにこだわらなくてもいいなと思った。業界内にいる人は普段から最新技術もなんとなく話を聞いているだろうし。
セキュリティ、ネットワーク、アーキテクチャは傾向だけさらっと見て、あと一分野どうするか決めるためにいろいろ解いてみた。

どれにする？　午後試験の問題は当日選べる。一夜漬けするならどれだ。

* マネージメント： 雰囲気で半分取れるが安定しない。博打なので無し。
* 情報システム開発： 過去問見る感じだといろんなフロー的なのとか出てくる。雰囲気でとけるが、しっくりこないのでとりあえず無し。他に選択肢がなければやる。
* アルゴリズム： 一つの大問に平均20〜30分が標準だが、問題によって40分くらい時間をかければ７割取れそう。できるようになれば硬いが、一夜漬けは無理そう。他の大問が早く終わって当日楽そうだったら（時間をかければ解けそうだったら）選ぶ
* データベース： 正規化とか設計の方はなんか本読んだことあるのでわかるが、普段ゴリゴリにSQL書いていないので副問い合わせとかなんか空欄にされるとなんかよくわからん。１週間ちゃんと対策すれば７割硬そうだがとりあえず無し

当日ぱっと見、情報システム開発の分野がテストケースの話で点数そこそこ取れそうだったので選択。なんとかなった。

# 辛かったこと

* これが一番難しいとされている。会場が家に近かったのでなんとかなった。
* 会場が寒い。雨の日だったこともあり午前試験で凍えてしまった。次の日から風邪引いた。ちゃんと厚着していくこと。

# やってよかったか？

* 幅広いなんとなくの知識はついた。情報卒コンプレックスは多少解放されたが、次はさらに高度試験受けないと。完全解消にはやはり情報系大学院いくのが良いか。
* 正直午後試験はもうちょっと時間かけてやった方が身になった。知っている知識でごり押しした。
* BNF記法とか身近だけどあんまり意識していないものに触れられたのでよかった。
* 一番よかったことは、勉強習慣がついたこと。受験時代にやったようなことを思い出したので最近プライベートでもいろいろ自発的に学ぶようになった。
a-blog cms 2.0 - 2.7 リリース日メモ

ブログに書こうとリリース日を調べてみたが、ちょっと多かったので抜粋版にしたのでメモに残しておくことにした。

| Version | Release Date |
|-----------|------------|
| v2.0.0 | 2013/12/18 |
| v2.0.0.1 | 2013/12/20 |
| v2.0.0.2 | 2014/01/15 | 
| v2.0.0.3 | 2014/01/16 |
| v2.0.1 | 2014/01/30 | 
| v2.0.1.1 | 2014/02/18 | 
| v2.1.0 | 2014/06/23 |
| v2.1.0.1 | 2014/07/07 | 
| v2.1.0.2 | 22014/07/29 | 
| v2.1.1 | 2014/09/09 | 
| v2.1.1.1 | 2014/09/25 | 
| v2.1.1.2 | 2014/12/01 | 
| v2.1.1.3 | 2014/12/22 | 
| v2.1.1.4 | 2015/02/16 | 
| v2.5 | 2015/04/23 | 
| v2.5.0.1 | 2015/05/15 | 
| v2.5.0.2 | 2015/05/20 |
| v2.5.0.3 | 2015/06/10 | 
| v2.5.1 | 2015/08/10 | 
| v2.5.1.1 | 2015/08/21 | 
| v2.5.1.2 | 2015/09/04 | 
| v2.6 | 2015/12/25 | 1
| v2.6.0.1 | 2016/01/22 | 
| v2.6.0.2 | 2016/04/07 | 
| v2.6.1 | 2016/06/23 | 
| v2.6.1.1 | 2016/06/23 |
| v2.6.1.2 | 2016/06/29 |
| v2.6.1.3 | 2016/07/21 | 
| v2.6.1.4 | 2016/10/25 | 
| v2.7 | 2017/03/30 | 1
| v2.7.1 | 2017/04/06 |
| v2.7.2 | 2017/04/10 |
| v2.7.3 | 2017/04/14 |
| v2.7.4 | 2017/04/14 |
| v2.7.5 | 2017/04/20 |
| v2.7.6 | 2017/05/01 | 
| v2.7.7 | 2017/05/18 | 
| v2.7.8 | 2017/05/26 |
| v2.7.9 | 2017/05/26 |
| v2.7.10 | 2017/05/30 |
| v2.7.11 | 2017/06/01 |
| v2.7.12 | 2017/06/07 |
| v2.7.13 | 2017/06/09 |
| v2.7.14 | 2017/06/14 |
| v2.7.15 | 2017/06/15 |
| v2.7.16 | 2017/10/13 |
| v2.7.17 | 2017/10/19 |
| v2.7.18 | 2017/10/26 |
| v2.7.19 | 2017/11/02 |
| v2.7.20 | 2017/11/29 |
| v2.7.21 | 2017/12/05 |
| v2.7.22 | 2017/12/05 |
| v2.7.23 | 2017/12/11 |
| v2.7.24 | 2017/12/12 |
| v2.7.25 | 2017/12/19 |
| v2.7.26 | 2017/12/25 |
| v2.7.27 | 2018/01/05 |
| v2.7.28 | 2018/01/23 |
| v2.7.29 | 2018/02/05 |
| v2.7.30 | 2018/02/16 |
| v2.7.31 | 2018/03/02 |
| v2.7.32 | 2018/03/30 |
| v2.7.33 | 2018/04/01 |
| v2.7.34 | 2018/04/13 |
processing3系でドラッグアンドドロップする

# はじめに
processing3系でドラッグアンドドロップを実装した所詰まった所を記録します。

この記事で紹介するコードの多くはたーせる氏の[Processingアプリケーションでファイルのドラッグ&ドロップをサポート](http://tercel-sakuragaoka.blogspot.jp/2011/10/processing.html)の記事を参考に書かれています。

＃ コード

```java:dragdrop.pde
import java.awt.datatransfer.*;  
import java.awt.dnd.*;  
import java.io.File;  
import java.io.IOException;  
import java.awt.Component;
import java.util.List;

DropTarget dropTarget;  
Component component;

void dragDropFile() {
  component = (Component)this.surface.getNative();
  
  dropTarget = new DropTarget(component, new DropTargetListener() {  
    public void dragEnter(DropTargetDragEvent dtde) {
    }  
    public void dragOver(DropTargetDragEvent dtde) {
    }  
    public void dropActionChanged(DropTargetDragEvent dtde) {
    }  
    public void dragExit(DropTargetEvent dte) {
    }  
    public void drop(DropTargetDropEvent dtde) {  
      dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);  
      Transferable trans = dtde.getTransferable();  
      List<File> fileNameList = null;  
      if (trans.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {  
        try {  
          fileNameList = (List<File>)  
            trans.getTransferData(DataFlavor.javaFileListFlavor);
        } 
        catch (UnsupportedFlavorException ex) {  
          println(ex);
        } 
        catch (IOException ex) {  
          println(ex);
        }
      }  
      if (fileNameList == null) return;  
      
      for (File f : fileNameList) {
        println(f.getAbsolutePath());
      }
    }
  }
  );
}
```
# 悩んだ所

processing3系でDropTargetの引数にスケッチを指す`this`を入れようとすると、**The constructor "dnd.DropTarget(sketch_171223a. DropTargetListner(){})" does not eists**と怒られてしまいます。
これは`this`がそこに引数として入るべきである`Component`型では無いため怒られています。

そこで、`java.awt.Componnet` にスケッチを入れるために`this.surface.getNative()`をcomponent型として取って引数にする必要があります。

# 参考
http://tercel-sakuragaoka.blogspot.jp/2011/10/processing.html
https://qiita.com/progfay/items/a81e2c4dc4785c3492f4
C言語で学ぶニュートン法

# ニュートン法とは
ニュートン法はある方程式f(x) = 0の実数解を求めるための方法です。例えば$ f(x) = x ^ 3 - 2 $ にすると$ \sqrt[3]{2} $の値を知ることができます。微分を少し使います。

# 概要
全体的な流れは次のような感じです
1. 初期値$ x_0 $の設定
2. $ n = 0 $とする
3. $ f(x) $の$ x_n $でのを接線求める。方程式は$ y - f(x_n) = f'(x_n) (x - x_n) $になる。
4. 3で求めた接線とy軸との交点を求め、それを$ x_{n+1} $とする。$ 0 - f(x_n) = f'(n_x) (x_{n+1} - x_n) $を$ x_{n+1} $について解くと$ x_{n+1} = - \dfrac{f(x_n)}{f'(x_n)} + x_n $になりますね。
5. $ n := n + 1 $とする。
6. $ |x_{n - 1} - x_n | < 10^{ -6} $なら終了。しなかったなら3.に戻る
イメージ図は次のような感じです。(http://gijyutsu-keisan.com/science/math/numcal/newton/newton_1.php より引用)
![config_1_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/108716/31481c0c-b8aa-fc55-0cca-bb4ab8a6bfc5.jpeg) 


$ f(x) = x ^ 3 - 2 $を例にして考えてみましょう。
1. 初期値は適当に設定してもいいです。ただあんまり変な値にすると収束しません。とりあえず、3にします。
2. $ n = 0 $にします。
3. 接線の方程式は
   $ y - 27 = 27 (x - 3) $ 
   $ y = 27 x - 54 $
   &nbsp;&nbsp;&nbsp;&nbsp;これが接線の方程式です。
4. 3で求めた接線とy軸との交点は
   $ 0 = 27x - 54 $
   $ x = 2 $
   よって$ x_{n+1} = 2 $になります。
5. $ n = 1 $になります。
6. $ |x_{n - 1} - x_n| = | 3 - 2 | = 1 $なので3に戻ります。

この操作を続けていけば$ x_n = \sqrt[3]{2} $になることはわかるでしょう。

#ソースコード
```newton.c
#include <stdio.h>
#include <math.h>

#define EPS (1.0e-6)
#define f(x) (x*x*x-2)
#define df(x) (3*x*x)

int main(){
    double xn, xo; // x_new x_old
    xn = (xo = 2) + 1;
    while(fabs(xn - xo) > EPS){
        xo = xn;
        xn = -1 *f(xo) / df(xo) + xo;
    }
    printf("%f\n%f\n", xn, xn * xn * xn);
}
```
AWS Cloud9でペアプログラミングを試してみた

この記事は[ハンズラボ Advent Calendar 2017](https://qiita.com/advent-calendar/2017/handslab)の25日目、最後の記事です。
2017年の9月に入社した@yuyj109です。所属チームでPythonでAPIを書いています。

みなさん、クラウドベースのIDEのサービスの[AWS Cloud9](https://console.aws.amazon.com/cloud9/home/product)を使ったことありますか？自分は買収前のnode.js勉強時、使ったことがありました。

[AWSの説明](https://aws.amazon.com/jp/cloud9/)によるとこのようです。
> ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境(IDE)

<img width="７００" alt="20171225_000.png" src="https://qiita-image-store.s3.amazonaws.com/0/179285/380a9aa7-f54e-96b0-119c-4c0af9148a07.png">

AWSと統合され[Lambda](https://aws.amazon.com/jp/lambda/)、[Code Star](https://aws.amazon.com/jp/codestar/)、[EC2](https://aws.amazon.com/jp/ec2/)と合わせての利用、既存のリソースはSSH接続で利用可能です。

今月、ハンズラボのre:inventに参加社員の報告会でCloud9ライブコーディングが紹介され、試してみました。

## ペアプログラミングの機能をやってみた

全体的なイメージは下のような感じです。

<img width="７００" alt="画面イメージ" src="https://qiita-image-store.s3.amazonaws.com/0/179285/387c98d8-4f24-d92a-2a6d-5d000700202f.png">

### IAMユーザの招待、RW(編集権限)、R（読取専用）モードがある

<img width="６５０" alt="IAMユーザの招待" src="https://qiita-image-store.s3.amazonaws.com/0/179285/52c23f52-86af-8c02-6f77-44b0d3578b12.png">

### ユーザー入場アラム

<img width="300" alt="ユーザー入場アラム" src="https://qiita-image-store.s3.amazonaws.com/0/179285/adb91a7c-d6a4-afb0-6ad7-8fdc4567253a.png">

### メッセージの送信

メッセージ欄による日本語入力は修正時化ける可能性があります。(コピペは問題なし)
これから改善できることを期待します。

<img width="300" alt="ユーザー入場アラム" src="https://qiita-image-store.s3.amazonaws.com/0/179285/89227a83-1dc0-6e74-6bcd-3b90c8213bf4.png">

### エディターの表示
* ユーザーの色分け
* カーソル位置と選択部分・ユーザー名表示

<img width="511" alt="エディターの表示" src="https://qiita-image-store.s3.amazonaws.com/0/179285/36c64f1e-af04-36e2-9080-0b9606a0a814.png">

### プログラム実行

作成ユーザの権限によりリソースは制限されるようです。

<img width="829" alt="実行イメージ" src="https://qiita-image-store.s3.amazonaws.com/0/179285/75700c5b-8bcb-8dd0-8194-859debaac0d1.png">

## 対応リージョン

まだ東京にな来ていません。(2017/12/25)

| コード         | 名前                              |
|----------------|-----------------------------------|
| us-east-1      | 米国東部 (バージニア北部)         |
| us-west-1      | 米国西部 (オレゴン)               |
| ap-southeast-1 | アジアパシフィック (シンガポール) |
| eu-west-1      | EU (アイルランド)                 |

## 最後に

デフォルトのEC2設定で試してました。awscli(作成ユーザーcredential付き)、java7、python2.7、3.6、PHP 5.6.32、go 1.9.1がインストールされていました。

個人的にはペアプログラミングだけでなく、エディターとしてもAWSの色んなサービスと統合していけたらいいな思います。

以上。
PHP だけで HUP シグナルを受けてリスタートする

例えば PHP でバックグラウンドな処理のために常駐するデーモン的なもの作ったとき、アプリを更新したときはプロセスをリスタートする必要があります。

普通は systemd とかでデーモンにして `systemctl restart ore-no-app` とかで良いのだけれども、あえて PHP 単体で HUP シグナルでリスタート出来るようにする方法。

```php
<?php
$term = false;
$restart = false;

foreach ([SIGHUP, SIGINT, SIGTERM] as $sig) {
    pcntl_signal($sig,function ($signo) {
        global $term;
        global $restart;
        $term = true;
        if ($signo === SIGHUP) {
            $restart = true;
        }
    });
}

$pid = getmypid();
echo "\nstart [$pid]\n";

// $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

while ($term == false) {
    echo ".";
    sleep(1);
    pcntl_signal_dispatch();
}

if ($restart) {
    echo "\nrestart [$pid]\n";
    $exe = readlink("/proc/$pid/exe");
    $cmdline = file_get_contents("/proc/$pid/cmdline");
    $args = explode("\0", rtrim($cmdline, "\0"));
    pcntl_exec($exe, array_splice($args, 1));
} else {
    echo "\nstop [$pid]\n";
}
```

このスクリプトを実行すると、

```sh
php sample.php
```

次のように出力されます。

```
start [6394]
...............
```

おもむろにスクリプトを修正しても、

```diff
-    echo ".";
+    echo "x";
```

それだけでは何も変わりません。

```
start [6394]
....................
```

HUP をぶっ刺すと、

```sh
kill -HUP 6394
```

反映される。

```
start [6394]
.........................
restart [6394]

start [6394]
xxxxxxxxxxxxxx
```

## 注意

要するに exec で自分自分を再実行しています。exec で pid を変えずにプロセスの置き換えができる POSIX ならではの方法。

ただし、元のプロセスからファイルディスクリプタを引き継いでしまうので、なにかしらのファイルディスクリプタを開いたままで exec するとリークします。

例えば↑のスクリプトで下記のようにソケットの作成をコメントインすると・・・

```diff
-// $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
```

HUP でリスタートするたびにファイルディスクリプタが増えていきます。

## さいごに

たぶん役に立たない。
Laravelで設定ファイル（config）の変更が反映されないときの対処法

<h3>概要</h3>

※Laravelの検証バージョン5.x系

<code>
    /app_name/config/
</code>

配下の設定ファイルを変更したとき、反映されないことがあるが、反映したい。

<h3>手順</h3>

キャッシュをクリアする

<code>
    # ls
    README.md  artisan    composer.json  config  phpunit.xml  resources  server.php  tests   webpack.mix.js
    app    bootstrap  composer.lock  database  package.json  public   routes     storage     vendor  yarn.lock
    #
    # php artisan config:cache
    Configuration cache cleared!
    Configuration cached successfully!
<code>

これでOK!!
Windows10：KerasでGPUを使用する環境構築のTip's（TensorFlow）


# 〇導入する各ソフトウェアのバージョン
* Anaconda：5.0(Python 3.6)
* CUDA：8.0
* cuDNN：6.0
* Keras：2.1.1
* tensorflow-gpu：1.4.0

# 〇導入のポイント（2017年12月現在）
* 【1.導入-CUDA8.0のインストール】CUDAは9.0ではなく8.0をインストール ⇒ WindowsのcuDNNはまだCUDA9.0に非対応
* 【2.環境構築】kerasのインストールはコマンドプロントではなくPowerShellで行う ⇒ pipでインストール時に文字コードによる導入失敗を回避
* 【3.利用】Kerasで少し重い処理を行うと「failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED」というエラーが発生するためGPUメモリの使用制限を設定する ⇒ TensorFlowのデフォルトだとGPUのメモリを100%まで利用しようとするため、ある程度でGPUのメモリ確保失敗が発生する

# 1.導入

## 1.1.CUDA8.0のインストール
[CUDA Toolkit 8.0 - Feb 2017](https://developer.nvidia.com/cuda-80-ga2-download-archive)
↑「Operating System:Windows, Architecture:x86_64, Version:10」を選択しダウンロード＆インストール

## 1.2.cuDNN6.0のインストール
[cuDNN Download](https://developer.nvidia.com/rdp/cudnn-download)
Download cuDNN v6.0 (April 27, 2017), for CUDA 8.0」から「cuDNN v6.0 Library for Windows 10」を選択しダウンロード。
ダウンロードしたファイルを展開し「C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0」配下の同じディレクトリに設置（上書き）

## 1.3.Anaconda 5.0(Python 3.6)のインストール
[Download Anaconda Distribution](https://www.anaconda.com/download/)
「Python 3.6 version」の64-Bitをダウンロード&インストール

# 2.環境構築（KerasとTensorFlowのインストールを含む）
下の作業は「Windows PowerShell」で行うこと。

## 2.1.仮想環境の作成
```
conda create -n [仮想環境名] python=3.6
```

## 2.2.仮想環境のアクティブ化
```
activate [仮想環境名]
```

## 2.3.TensorFlow(GPU)のインストール
```
pip install --ignore-installed --upgrade tensorflow-gpu
```

## 2.4.Kerasのインストール
```
pip install keras
```

# 3.利用

## 3.1.「failed to create cublas handle: CUBLAS_STATUS_ALLOC_FAILED」というエラーが発生した場合

下の様なログが出力されPython自体が落ちます。

```
[W 10:55:58.509 NotebookApp] Saving untrusted notebook classifier/fine-tuning-vgg16.ipynb
2017-12-23 10:56:26.508105: E C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\36\tensorflow\stream_executor\cuda\cuda_blas.cc:366] failed to create cublas handle: CUBL
AS_STATUS_ALLOC_FAILED
```
![python_error.jpg](https://qiita-image-store.s3.amazonaws.com/0/73580/7b06b31e-5c19-18a0-630b-9bcb459daa67.jpeg)

### 3.1.1.【対応】必要なライブラリをimport後、下のコードを実行してGPUの使用率を制限する

``` python
# TensorFlowのGPUメモリ使用量の制限
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.8
set_session(tf.Session(config=config))
```

ログに下の様な使用率が出力されるのでtotalMemoryとfreeMemoryの値を参考に上のper_process_gpu_memory_fractionに使用率を指定

```
name: GeForce GTX 1070 major: 6 minor: 1 memoryClockRate(GHz): 1.7715
pciBusID: 0000:01:00.0
totalMemory: 8.00GiB freeMemory: 6.64GiB
```
「6.6 / 8.0 = 0.825」 ⇒「per_process_gpu_memory_fraction = 0.8」

![gpu.jpg](https://qiita-image-store.s3.amazonaws.com/0/73580/1561a114-3889-4901-71c5-7a134a4835ec.jpeg)
![tf.png](https://qiita-image-store.s3.amazonaws.com/0/73580/90419818-6828-4544-fc13-60a2354c7fd2.png)


これでバリバリKerasでGPUを利用できます。
Instagramで、指定したハッシュタグで投稿された画像にすべていいねできるPythonツール作りました

# 目的

- Instagram自動化ツールはかなり需要があり、お金を払う人も多い
    - 例えば、無料いいねツールハッシュライクとか　https://support.hashlikes.com/hc/ja
    - メイン機能は特定のタグに対して投稿された画像にいいねすると集客見込めるらしい
    - 月額3000円でいいねロボット利用できる
- それ、Pythonで無料でできんかなと思った

# 先行研究

- 調べた結果手段は3通り
    - Instagram API
        - Instagram APIのお試し版(Sandbox Mode)だと、ほぼ何もできない
        - 全機能使うには、実際にプロダクトを作り、それのコンセプトムービーまで作成してInstagram社に送る必要あり
        - しかもかなり審査が厳しい
    - Instabot (Github)
        - requestsを利用したオープンソースのInstagram自動ツール
        - https://github.com/instagrambot/instabot/tree/master/instabot/bot
    - Selenium
        - ログインまでは誰かがやってた
        - 海外の事例見ていると、普通に自動化できそうだった

# やったこと

- Seleniumを利用して、Instagramで、指定したハッシュタグで投稿された画像にすべていいねできるツールを作りました
- 以下いいねを自動化している様子
![yomiuri.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/e9e872d4-8fa6-1249-b148-2bd73019eedd.gif)

# 環境

- ブログで見てください
- https://review-of-my-life.blogspot.jp/2017/12/selenium-instagram.html

# 実装方法

- ブログで見てください
- https://review-of-my-life.blogspot.jp/2017/12/selenium-instagram.html

# 今後

- 例のようにクラウド上で定期実行ツール作りたい
- もしくはWebアプリ、デスクトップアプリにして配布したい
    - 配布できるようにすれば利用しやすそうだし。
PHPで、名前が1,2,3...と続く同じ種類のカラム名をfor文で回す

##■やりたいこと
例えば、

```
city_id_1, city_id_2, city_id_3
```
のようなカラム名があって、全てに値が入っているとする。
「清瀬市」みたいな表示をさせるには、city_id_1をどっかで日本語に変更するメソッドが必要（View側で処理はしない前提）
上記を素直に実装すると以下になる。
//ModelはModel_Mst_City カラム名はname $order->city_id_1(2,3)が格納されているという仮定

```ruby:php
/**
 * 市区町村idを元に、該当の名前を取得する。
 *
 * @param object $order
 * @return array
 */
public static function getCityName($order)
    {
        $buff = array();
        $buff[1] = Model_Mst_City::find($order->city_id_1);
        $buff[2] = Model_Mst_City::find($order->city_id_2);
        $buff[3] = Model_Mst_City::find($order->city_id_3);

        return $buff;
    }
```
変化しているのがただの1,2,3なので、なんとかまとめたい。
##■結論
```ruby:php
/**
 * 市区町村idを元に、該当の名前を取得する。
 *
 * @param object $order
 * @return array
 */
public static function getCityName($order)
    {
        $buff = array();
        for ($i=1; $i<=3; $i++)
        {
            $buff[$i] = Model_Mst_City::find($order->{'city_id'.$i});
        }

        return $buff;
    }
```
結局クエリを3回取りに行っているので、リファクタリングにはなってない気がするけど、{}を使ってまとめられるのは知らなかったのでメモ。
Rails 5 以上 + ActiveRecord での inverse_of オプションの使いどころ

ActiveRecord を単体で使う場合と違って、Rails 5 と組み合わせた場合 belongs_to の指すインスタンスが必須になり、この変更によって1対多のリレーションで1の方を保存する前に多の方のインスタンスを作って1の方の保存のタイミングで連動して多の方も保存するみたいな、これまで普通に通っていた処理がひっかかるようになります。

```rb
require "active_record"
ActiveRecord::VERSION::STRING   # => "5.1.4"

# Rails 5 以上と一緒に使う場合は belongs_to の required: true を最初から有効にされる
ActiveRecord::Base.belongs_to_required_by_default = true

ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Migration.verbose = false
ActiveRecord::Schema.define do
  create_table :articles do |t|
  end
  create_table :comments do |t|
    t.belongs_to :commentable, polymorphic: true, null: false
  end
end

class Article < ActiveRecord::Base
  has_many :comments, as: :commentable
end

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

article = Article.new
article.comments.build
article.save! rescue $! # => #<ActiveRecord::RecordInvalid: Validation failed: Comments is invalid>
```

そこで、可能なら `Article.create!` して親の方を先に作っておくとか、`ActiveRecord::Base.belongs_to_required_by_default = false` して設定を無効にするとか、次のように `required: false` をつけてもいいですが、

```rb
class Article < ActiveRecord::Base
  has_many :comments, as: :commentable
end

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true, required: false
end

article = Article.new
article.comments.build
article.save!           # => true
```

inverse_of オプションを使って Article から見た comments たちに commentable が欲しいときはDBから探すのではなく commentable メソッドを見てくれと伝えます。これで通るようになります。また副作用というか、こっちが本来の目的かもしれませんが無駄なSQLを減らせます。

```rb
class Article < ActiveRecord::Base
  has_many :comments, as: :commentable, inverse_of: :commentable
end

class Comment < ActiveRecord::Base
  belongs_to :commentable, polymorphic: true
end

article = Article.new
article.comments.build
article.save!           # => true
```

もし混乱してきたら子の belongs_to :xxx の :xxx の部分を親の inverse_of に指定すると覚えておくと楽です。

## 参考

[rails] accepts_nested_attributes_for の場合は、inverse_of を付けておくと良い気がする
https://qiita.com/ryoff/items/e3ba4b8c8be117c79b73
※こちらの記事では polymorphic では動作しないと言及がありますが今では動くようになっていました
cesiumでd3.js

#概要
cesiumでd3.jsを使ってみた。

#写真
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/8ff6232d-9809-48b9-b7de-80528bd0c2e8.png)

#サンプルコード

```
var viewer = new Cesium.Viewer('cesiumContainer');
viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(140.1, 37.9, 2000.0),
    orientation: {
        heading: Cesium.Math.toRadians(-20.0),
        pitch: Cesium.Math.toRadians(-35.0),
        roll: 0.0
    }
});
var pinBuilder = new Cesium.PinBuilder();
var url = '/assets/a/U/k/W/aUkWM';
d3.json(url, function(error, json) {
    var mise = json.bikuya;
    for (var key in mise) 
    {
        var name = mise[key].name;
        var latlon = mise[key].latlon.split(",");
        var e = viewer.entities.add({
            position: Cesium.Cartesian3.fromDegrees(latlon[1], latlon[0]),
            label: {
                text: name,
                verticalOrigin: Cesium.VerticalOrigin.TOP
            },
            billboard: {
                image: pinBuilder.fromColor(Cesium.Color.SALMON, 10).toDataURL(),
                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
            }
        });
    }
});

```

#成果物
http://jsdo.it/ohisama1/avsu

以上。
gulp-parcel 公開しました

# gulp-parcel 公開しました

この記事は，下記の記事の転載です。

* [gulp-parcel 公開しました (実験室 〜 Lab in ZACKY's Laboratory)](https://zacky1972.github.io/tech/2017/12/23/gulp-parcel.html)

parcel を gulp から呼び出すプラグイン gulp-parcel を公開しました。

* [npmjs の公開ページ](https://www.npmjs.com/package/gulp-parcel)
* [ソースコード(GitHub)](https://github.com/zacky1972/gulp-parcel)

はじめて gulp プラグインを作ったので，いろいろ制約があります。

* 入力となる gulp.src では read:false をつけないといけない
* ワーキングディレクトリに .tmp-gulpcompile-xxx というディレクトリを作成し，削除するので，同名のファイルがあるとエラーになったり，消されてしまったりする

インストール方法:

npm の場合

```bash
$ npm install --global parcel-bundler
```

yarn の場合

```bash
$ yarn global add parcel-bundler
```

使い方

gulpfile.coffee

```coffee
parcel = require 'gulp-parcel'

gulp.task 'build:js', () ->
  gulp.src 'source/javascripts/all.js', {read:false}
    .pipe parcel()
    .pipe gulp.dest('build/javascripts/')
```

こうすると，source/javascripts/all.js をエントリポイントとして parcel を起動し，build/javascripts/ 以下に展開します。
Laravelのlogファイルを日付ごとに分ける

<h3>概要</h3>

※Laravelの検証バージョン5.x系

Laravelでは、デフォルトではログファイルが一つしか生成されない。

ログの出力先
<code>
    /app_name/storage/logs/laravel.log
</code>

これではログを見返す必要があるとき、追いづらいので、日付ごとに出力ファイルに分ける。

<h3>手順</h3>

設定ファイルの内容を変更する。
<code>
    /app_name/config/app.php
</code>

デフォルト（変更前）の設定ファイルは以下の通り

<code>

    return [

        'log' => env('APP_LOG', 'single'),

        'log_level' => env('APP_LOG_LEVEL', 'debug'),

        ],

    ];
</code>

変更後の設定ファイルは以下の通り

<code>

    return [

        'log' => env('APP_LOG', 'daily'), // logファイルを日付ごとに出力

        'log_level' => env('APP_LOG_LEVEL', 'debug'), // logレベルdebug

        'log_max_files' => '31',  // dailyログの場合のlogファイルの保存期間

        ],

    ];
</code>

以上で設定は完了。

<h3>結果</h3>

日付ごとにlogファイルが出力されている。

<code>
    /app_name/storage/logs/laravel-2017-10-20.log
    /app_name/storage/logs/laravel-2017-10-21.log
    /app_name/storage/logs/laravel-2017-10-22.log
</code>
scipyのodeintを理解したかった。

#概要
scipyのodeintを理解したかった。
#写真
![odeint0.png](https://qiita-image-store.s3.amazonaws.com/0/18104/eb689d35-e858-17fc-5a61-810aa106a5a9.png)

#サンプルコード

```
import numpy as np
from scipy.integrate import odeint
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

def F(d, t):
	rho, theta, z = d
	drhodt = 0
	dthetadt = 1
	dzdt = -1
	return [drhodt, dthetadt, dzdt]

rho0 = 1
theta0 = 0
z0 = 100
tspan = np.linspace(0, 20, 100)
sol = odeint(F, [rho0, theta0, z0], tspan)
rho = sol[ : , 0]
theta = sol[ : , 1]
z = sol[ : , 2]
X = rho * np.cos(theta)
Y = rho * np.sin(theta)
fig = plt.figure()
ax = fig.gca(projection = '3d')
ax.plot(X, Y, z)
plt.savefig('./odeint0.png')
plt.show()

```

#写真
![odeint1.png](https://qiita-image-store.s3.amazonaws.com/0/18104/73994eed-e818-b726-11d4-3ac053d88c5e.png)

#サンプルコード

```
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def F(v, t, p, r, b):
	return [-p * v[0] + p * v[1], -v[0] * v[2] + r * v[0] - v[1], v[0] * v[1] - b * v[2]]

v0 = [0.3, 0.3, 0.3]
t = np.arange(0, 100, 0.01)
p = 10
r = 28
b = 3 / 3
v = odeint(F, v0, t, args = (p, r, b))
fig = plt.figure()
ax = fig.gca(projection = '3d')
ax.plot(v[ : , 0], v[ : , 1], v[ : , 2])
plt.savefig('./odeint1.png')
plt.show()


```

#写真
![odeint10.png](https://qiita-image-store.s3.amazonaws.com/0/18104/4e6134c0-63aa-e8f3-fd72-0d8924744e79.png)

#サンプルコード

```
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.integrate import odeint

def F(X, t):
	x, y, z = X
	return [-y - z, x + a * y, b + z * (x - c)]

dt = 5e-3
x = 0
y = 0
z = 0
x0 = (1, 1, 1)
a = 0.1
b = 0.1
c = 10
t_werte = np.arange(0, 500, dt)
erg = odeint(F, x0, t_werte)
x_, y_, z_ = erg[len(erg) / 4 : ].transpose()
fig = plt.figure()
ax = fig.gca(projection = '3d')
ax.plot(x_, y_, z_, "k,", alpha = 0.2, rasterized = True)
plt.savefig('./odeint10.png')
plt.show()



```

以上。
Rails 開発中に active_record ライブラリ内で Segmentation fault が起きた

# エラー内容

```sh
/Users/xxxxx/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/sqlite3_adapter.rb:30: [BUG] Segmentation fault at 0x00000000000110
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]

-- Crash Report log information --------------------------------------------
   See Crash Report log file under the one of following:
     * ~/Library/Logs/CrashReporter
     * /Library/Logs/CrashReporter
     * ~/Library/Logs/DiagnosticReports
     * /Library/Logs/DiagnosticReports
   for more details.
Don't forget to include the above Crash Report log file in bug reports.

-- Control frame information -----------------------------------------------
c:0069 p:---- s:0378 e:000377 CFUNC  :initialize
c:0068 p:---- s:0375 e:000374 CFUNC  :new
c:0067 p:0183 s:0369 e:000368 METHOD /Users/xxxxx/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/sqlite3_ad
c:0066 p:0028 s:0361 e:000360 METHOD /Users/xxxxx/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/c
c:0065 p:0027 s:0357 e:000356 METHOD /Users/xxxxx/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/c
c:0064 p:0025 s:0353 e:000352 METHOD /Users/xxxxx/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/activerecord-5.1.4/lib/active_record/connection_adapters/abstract/c
```

# 原因
原因はこいつだった
https://github.com/rails/spring/issues/493

`/usr/bin/sqlite3`を使っていることが原因のようだ。

# 解決策
brew でインストールした sqlite3 を使うようにした。

```
$ ln -sf ../Cellar/sqlite/3.20.1/bin/sqlite3 /usr/local/bin/
```