OmniAICreator/Qiita-1.07M huggingface dataset:
php - curlに関して

## Login模擬

```php
function login_post($url, $cookie, $post) {
     $curl = curl_init();//初始化curl
     curl_setopt($curl, CURLOPT_URL, $url);//目標URL
     curl_setopt($curl, CURLOPT_HEADER, 0);//Header表示するか
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);//レスポンスを表示するか
     curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //Cookieを設定し、指定したファイルに保存する
     curl_setopt($curl, CURLOPT_POST, 1);//postで送信
　　　//送信する中身
     curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
     curl_exec($curl);//執行cURL
     curl_close($curl);//cURLを閉じる、メモリを解放
 }
```


## Loginしたら、データを取る。

```php

 function get_content($url, $cookie) {
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_HEADER, 0);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //cookieを読み込み
     $rs = curl_exec($ch); //ページの内容を読み込み。
     curl_close($ch);
     return $rs;
 }
```

## 投稿します

```php

 function post_thread($url, $cookie, $post)
 {
   $curl = curl_init();//初始化Curl
   curl_setopt($curl, CURLOPT_URL, $url);//送信先
   curl_setopt($curl, CURLOPT_HEADER, 0);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
   curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie); //cookieを読み込む
   curl_setopt($curl, CURLOPT_POST, 1);//postで送信
   curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));//送信の中身
   curl_exec($curl);//cURL執行
   curl_close($curl);
 }
```
##設定
```php

 //postデータ
$post = array (
    'user_id' => '123456@qq.com',
    'password' => '123456',
    'goto_page' => 'http://m.app.cn/index.php',
    'act' => 'login',
    't' => time(),
);

//Loginアドレス
$url = "http://m.app.cn/account/login.php";

//cookie保存パスを設定
$cookie = dirname(__FILE__) . '/cookie_curl.txt';

//Login後、データを取る
$url2 = "http://m.app.cn/user/wap/my_index.php";

// メソードを呼び出して、模擬登録
 login_post($url, $cookie, $post);
```
Dropbox > 100% disk usage > 対処?:zip圧縮してファイル数を減らす

```txt:動作環境
Windows 8.1 Pro (64bit)
Dropbox v32.4.23
```

Dropbox起動直後、10分程度の間 100% disk usage状態になっていた。

過去のフォルダをzip圧縮していったところ、100% disk usage状態の期間が2分弱まで減少した。

- ファイル数: 95,000
    - 10分間 100% disk usage
- ファイル数: 25,000
    - 2分間 100% disk usage


似たような症状として以下を見つけた。
http://pagent.github.io/2015/01/29/dropbox-number-of-files/

> 圧縮前はファイル数が60000以上、Dropboxフォルダの総サイズが約500MB。なにも更新がない状態でDropboxクライアントを起動し、同期が完了するのに約12分掛かった。
圧縮後はファイル数が約5500、サイズは約300MB。同期は約1分で完了した。

Dropboxは300,000以上のファイル数になるとCPU使用率の不具合があるとforumで見た。
公式では
https://www.dropbox.com/help/space/file-storage-limit
> 30 万件以上のファイルを保管すると、Dropbox アプリケーションのパフォーマンスが低下する可能性があります。

しかしながら、上記を鑑みると300,000未満でも別の問題が生じるようだ。

Dropboxを使う場合は、過去の古いフォルダは都度zip圧縮して、ファイル数を増やさないように気をつけ続けることになりそうだ。

### 関連

[VMware > Dropbox 100% disk usage 問題とその影響に関して > 使用ドライブの選択](http://qiita.com/7of9/items/20515172694f86d29013)

## 再発 2017/09/05

ファイル数が25,000の状況で再発したようだ。

Dropboxを停止した直後に100% disk usageが発生しなくなったため、Dropboxによる症状であることは確認した。

セーフモードで再起動した後、セーフモードを解除してみた。
再起動をしてDropboxを起動したところ、100% disk usageは2分程度に収まるようになった。
DevOps エンジニアのツール※更新中

米国で最高の職種の2017年度版において、DevOpsエンジニアは、3位に入ったそうだ。

<参考>https://japan.zdnet.com/article/35103323/

 

私は、人を知るには、よく使う道具を知ると良いと考えている。

最高の職種になる or クラスアップするためには、DevOps エンジニアのツールを知ることが必要ではないだろうか。

 

DevOps エンジニアになるため、どんなツールがあるか、個人的にまとめる。

選定の指標として、まだコストをかけれる状況ではないため、以下とした。

・費用をかけるのは、ツールより人材であること
・スモールスタートできること
　－導入費用を抑えるため、運営コストを受け入れる = OSS を基本選定
・環境乱立に対応でき、運営コストを抑えること
　―現在、AWS サーバが乱立してきているので、オーケストレーションツール導入を検討
 
| テクノロジー分野 | ツール |
|:-:|:-:|
| ソース管理　  |  Git (GitLab) |
| 継続的インテグレーションとデプロイ自動化  |  Jenkins |
|  インフラストラクチャ自動化 | Chef  |
| コンテナの概念  | Docker  |
| オーケストレーション  | Kubernetes  |
| クラウド  | AWS, OpenStack  |
|  クラウドマネジメント | Scalr  |


　　　　　　　　　　　　　　　　

私自身が、上のツールのことを全く分からない。

立場上、エンジニアよりはセールス寄りであるため、構成イメージが沸く人材になることを目標とする。

 

まずは、”使ってみた” を目指す。

 

過去の”使ってみた”は、下の通り。※随時更新

| テクノロジー分野 | ツール | 参考サイト |
|:-:|:-:|:-:|
| ソース管理　  |  Git (GitLab) | https://goo.gl/rqpR6a |
| 継続的インテグレーションとデプロイ自動化  |  Jenkins |  |
|  インフラストラクチャ自動化 | Chef  |  |
| コンテナの概念  | Docker  | https://goo.gl/edPFoc |
| オーケストレーション  | Kubernetes  |  |
| クラウド  | AWS, OpenStack  | https://goo.gl/RZfaWF |
|  クラウドマネジメント | Scalr  |  |
HomebrewをHomeディレクトリにインストールする

端的にいうと、Homeディレクトリで homebrew を展開して`PATH`を設定するだけである。

```bash
cd ~/
mkdir homebrew
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

`.bash_profile` に以下を追記する。

```bash
cat << 'EOF' >> ~/.bash_profile
export PATH=$HOME/homebrew/bin:$PATH
export HOMEBREW_CACHE=$HOME/homebrew/caches
EOF
```

環境変数 `HOMEBREW_CACHE` を定義しておかないとデフォルトの `/Library/Caches` が使われてしまう。

シェルを再起動する。

```bash
exec -l $SHELL
```

以上。
mpdfでIPAゴシックを使用する方法(Mpdf 7版)

## 概要

mpdf7で外部フォントを指定する方法となります。

※参考にさせていただいた記事、「[mpdfで利用するfontをライブラリ外から指定する方法](http://qiita.com/kunihiko_sugiura/items/7e33cd6490ea53a1b87d)」
を、mpdf7で可能にするものになります。

||動作環境|
|:---|:---|
|PHP|PHP7|
|mpdf|7.0.0-beta2  (https://github.com/mpdf/mpdf/tree/v7.0.0-beta2)|


## 手順

### IPAゴシックを設置
下記URL
http://ipafont.ipa.go.jp/old/ipafont/IPAGTTC00303.php
などから、zipをダウンロードして解凍した「ipag.ttc」を、
たとえば、`/path/to/ipag/ttcfont`フォルダに置く。

### IPAゴシックを使うMpdfを初期化するサンプルコード

```php:Util/PdfUtils.php
<?php
namespace App\Util;

class PdfUtils {
    /** IPAゴシックフォントを置いたフォルダのパス */
    const IPAG_FONT_FOLDER_PATH = '/path/to/ipag/ttcfont';
    
    /**
     * IPAゴシックフォントが利用可能のMpdfインスタンスを返す
     * @param array Mpdfのconfig
     * @return Mpdf IPAゴシックフォントが利用可能のMpdfインスタンス
     */
    public static function initIpagFontAvailableMpdf($config){
        $config['fontDir'] = [
            (new \Mpdf\Config\ConfigVariables)->getDefaults()['fontDir'],
            PdfUtils::IPAG_FONT_FOLDER_PATH,
        ];
        $config['mode'] = 'ja+aCJK';

        $mpdf = new \Mpdf\Mpdf($config);
        
        $ipa_fonts = [
            'ipag' => [
                'R' => 'ipag.ttc',
                'TTCfontID' => ['R' => 1],
            ],
            'ipagp' => [
                'R' => 'ipag.ttc',
                'TTCfontID' => ['R' => 2],
            ],
        ];
        foreach($ipa_fonts as $k => $v){
            $mpdf->fontdata[$k] = $v;
            $mpdf->available_unifonts[] = $k;
            $mpdf->default_available_fonts[] = $k;
            $mpdf->BMPonly[] = $k;
        }
        $mpdf->SetDefaultFont($config['default_font']);
        return $mpdf;
    }
}
```
↑Utilの呼び出し例

```php:呼び出し例
use App\Util\PdfUtils;

//pdf設定
$mpdf_config = [
    'mode' => 'ja',
    'format' => 'A4-L',
    'default_font_size' => 0,
    'default_font' => 'ipag',
    'margin_left' => 3,
    'margin_right' => 3,
    'margin_top' => 3,
    'margin_bottom' => 3,
    'margin_header' => 8,
    'margin_footer' => 8,
    'orientation' => 'P',
];

//$mpdf = new \Mpdf\Mpdf($mpdf_config); と書く代わりに↓でインスタンスを取得する
$mpdf = PdfUtils::initIpagFontAvailableMpdf($mpdf_config);
       
$mpdf->WriteHTML('<html><body>あいうえお</body></html>');
$pdf = $mpdf->Output(null, 'S');
```


## 参考記事
mpdfで利用するfontをライブラリ外から指定する方法
http://qiita.com/kunihiko_sugiura/items/7e33cd6490ea53a1b87d


mpdf/tests/Mpdf/ConfigurationTest.php
https://github.com/mpdf/mpdf/blob/9da7df98cc0cc2ff158ba7207a1324db222f04ee/tests/Mpdf/ConfigurationTest.php


## 所感など

Mpdfでは、まだotf形式のフォントが使えない様子。いまのところ古いttf(ttc)があるものしかいまのところ有効でないです。
puppeteerとAVAでE2Eテストしてみる

#Puppeteerとは？
http://qiita.com/Quramy/items/26058e83e898ec2ec078

# 今回やること
AVA+Nightmare製のE2EテストをAVA+Puppeteerに置き換えます
※URLやセレクタは適当に置き換えています

##テスト内容
- 検索フォームを入力しsubmit
- 結果ページのリンクを一つ取得
- リンクが取れていることをチェック

## まずはNightmareバージョン
### 構成
- Node.js v6
- ava v0.18
- Nightmare v2.10

### コード
```nightmare.js
const Nightmare = require('nightmare');
const test = require('ava');

test.serial('check form result', function *(t) {
    const nightmare = Nightmare({show: true});
    let href;
    try {
        href = yield nightmare.goto('http://sample.jp/form')
            //検索フォームに入力
            .type('input[name=search]', 'E2Eテスト')
            .click('form input[type=submit]')
            //結果の要素を取得
            .evaluate(function () {
                return document.querySelector('.result a').href;
            });
    } catch (e) {
        t.fail(e);
    }
    //スクリーンショットの生成
    const fileName = 'nightmare' + new Date().getTime() + ".png";
    yield nightmare.screenshot('capture/'+fileName);

    yield nightmare.end();
    console.log(href)
    t.truthy(href);
});

```

##Puppeteerで書いてみる
### 構成
- Node.js v8.4.0
- ava v0.22.0
- puppeteer v0.9.0

### コード
```package.json
{
  "name": "js",
  "version": "1.0.0",
  "description": "test",
  "dependencies": {
    "ava": "^0.22.0",
    "puppeteer": "^0.9.0",
  },
  "scripts": {
    "test": "env NODE_PATH=./lib ava"
  },
  "ava": {
    "verbose": true,
    "presets": []
  }
}
```

```puppet.js
const puppeteer = require('puppeteer');
const test = require('ava');

test.serial('check form result', async (t) => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    let href;
    try {
        await page.goto('http://sample.jp/form', { waitUntil: 'networkidle' });
        await page.focus('input[name=search]');
        await page.type('E2Eテスト');
        await page.click('form input[type=submit]');
        await page.waitForNavigation();
        href = await page.evaluate(() => {
            return Promise.resolve(document.querySelector('.result a').href);
        });
    } catch (e) {
        t.fail(e);
    }
    const fileName = 'puppeteer' + new Date().getTime() + ".png";
    await page.screenshot({ path: fileName });

    browser.close();
    console.log(href)
    t.truthy(href);
});
```

### 比較
- Nightmareと同様のことが可能
- `focus`を実行しないと入力はできない
    - ブラウザを実際に操作する感覚でコードに落とす必要あり
- 起動が若干遅い（？）
SNLIデータセットの読み込み方

## SNLIとは

- Standord Natural Language Inference[^1]の略
- 自然言語推論を学習するための注釈付きコーパス
- 前提と仮説の2文書からなるペアと対応するラベル(手作業)
	- neutral: どちらとも言えない
	- contradiction: 矛盾
	- entailment: 正しい
	- -: ラベルなし

| Text | Judgments | Hypothesis |
| ---- | --------- | ---------- |
| A man inspects the uniform of a figure in some East Asian country. | contradiction | The man is sleeping |
| An older and younger man smiling. | neutral | Two men are smiling and laughing at the cats playing on the floor. |
| A black race car starts up in front of a crowd of people. | contradiction | A man is driving down a lonely road.
| A soccer game with multiple males playing. | entailment | Some men are playing a sport. |
| A smiling costumed woman is holding an umbrella. | neutral | A happy woman in a fairy costume holds an umbrella. |

- データ件数: 合計57万
	- Training: 55万
	- Validation: 1万
	- Test: 1万

- 下記形式で構文解析データもある．

```json
{
	"annotator_labels": ["neutral"], 
	"captionID": "3416050480.jpg#4", 
	"gold_label": "neutral", 
	"pairID": "3416050480.jpg#4r1n", 
	"sentence1": "A person on a horse jumps over a broken down airplane.",
	"sentence1_binary_parse": "( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) )",
	"sentence1_parse": "(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .)))", 
	"sentence2": "A person is training his horse for a competition.", 
	"sentence2_binary_parse": "( ( A person ) ( ( is ( ( training ( his horse ) ) ( for ( a competition ) ) ) ) . ) )", 
	"sentence2_parse": "(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (VP (VBG training) (NP (PRP$ his) (NN horse)) (PP (IN for) (NP (DT a) (NN competition))))) (. .)))"
}
```

## ダウンロード

[The Stanford Natural Language Inference (SNLI) Corpus](https://nlp.stanford.edu/projects/snli/)よりダウンロードできます．

```bash
wget https://nlp.stanford.edu/projects/snli/snli_1.0.zip
unzip snli_1.0.zip
```

## データの読み込み

json形式(.jsonl)とtsv形式(.txt)でデータが格納されています．

```python
import pandas as pd
df = pd.read_csv("snli_1.0/snli_1.0_train.txt", sep="\t")
```

## References

[^1]: Bowman et al., [A large annotated corpus for learning natural language inference](https://nlp.stanford.edu/pubs/snli_paper.pdf), 2015.
iTunesで聞いている音楽をSlackのStatusに表示させるアプリを作った

## SlackのStatus
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7132/2f919a18-aef9-2206-d081-fe6dbd61b5c4.png)

ここにiTunesで聞いている曲を表示させたいがためのアプリを作った。
https://github.com/narikei/nowplaying-on-slack

## Statusを更新するAPI
ここを更新するには`users.profile.set`を使います。
https://api.slack.com/methods/users.profile.set#updating_a_user_s_current_status

```json
{
  "status_text": "ANTIHERO - LiSA",
  "status_emoji": ":musical_note:"
}
```

これを送るだけ。

```js:main.js
const request = require('request');

const token = process.env.SLACK_API_TOKEN;

request({
  url: 'https://slack.com/api/users.profile.set',
  method: 'POST',
  form: {
    token,
    profile: JSON.stringify({
      status_text: 'ANTIHERO - LiSA',
      status_emoji: ':musical_note:',
    }),
  },
}, (error, response, body) => {
  if (error) {
    console.error(error, response, body);
  }
});
```

SlackのTokenは環境変数で引き渡す形式にし、
`$ SLACK_API_TOKEN=xoxp-xxxx-xxxx-xxxx-xxxx node main.js` とかやるとStatusが更新されます。
Slackのアプリのscopeには `users.profile:write` を許可しておく


## 現在再生中の曲をiTunesから取得する
`playback`というライブラリーが比較的簡単に取り扱えるため、こいつを使っています。
https://github.com/jwalgran/playback

```js:main.js
const playback = require('playback');

playback.currentTrack((res) => {
  if (!res) {
    return;
  }

  console.log(res);
  // { name: 'ANTIHERO', artist: 'LiSA', album: 'Launcher' }
});
```

曲名、アーティスト名、アルバム名がそれぞれ取得できます。
再生中でない場合は`null`が返ってきます。


## Electron化
常駐させるためにElectron化しました。とくに操作が必要なアプリではないため、
ウィンドウは作らずに`app.on('ready')`でプログラムを開始させています。

```js:main.js
const electron = require('electron');
const request = require('request');
const playback = require('playback');

const app = electron.app;

const token = process.env.SLACK_API_TOKEN;

const sendToSlack = (message) => {
  request({
    url: 'https://slack.com/api/users.profile.set',
    method: 'POST',
    form: {
      token,
      profile: JSON.stringify({
        status_text: message,
        status_emoji: ':musical_note:',
      }),
    },
  }, (error, response, body) => {
    if (!error) {
      return;
    }

    console.error(error, response, body);
  });
};

const watchiTunes = () => {
  let nowplaying;

  setInterval(() => {
    playback.currentTrack((res) => {
      if (!res) {
        return;
      }

      const message = `${res.name} - ${res.artist}`;
      if (nowplaying === message) {
        return;
      }

      console.log(message);
      sendToSlack(message);

      nowplaying = message;
    });
  }, 3000);
};

app.on('ready', () => {
  if (!token) {
    console.log('token ga naiyo');
    return;
  }

  watchiTunes();
});
```


## おわり
こっちにも表示されます。
<img width="312" alt="スクリーンショット 2017-08-22 8.30.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/190d58fb-729e-87bd-38d4-e98d127cf01d.png">
OpenCVをWindowsで使ってみる

今更なのですが、PythonとかOpenCVとかを触ってみたくなったので環境を構築してみることにしました。自宅でも暇な時に気軽に遊べるようにWindowsに導入してみます。

##WinPythonの導入
どうやら[WinPython](http://winpython.sourceforge.net/)なるものを使用すると必要なもの一式をWindowsに簡単にインストールできるようです。

最初はとりあえず最新のWinPython3.5.4をインストールしてみたのですが、いろいろあって3.4.4をインストールしなおしました。ちなみに、WinPythonはレジストリに書き込みを行わないので、アンインストールしたくなったらディレクトリを削除すればOKです。結論から言うと最新版のWinPythonをインストールするのはオススメしません。

##OpenCVの導入
WinPythonに含まれるパッケージは[こちら](https://sourceforge.net/p/winpython/wiki/PackageIndex_33/)確認することが出来ます。OpenCVも入っているのかと思ったのですが、入っていませんでした、、、

というわけで、[OpenCV](http://opencv.org/releases.html)を導入します。普通にダウンロードしてexeを実行すればよいのですが、もっと簡単な方法があるようです。

[こちら](http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv)から、whlファイルをダウンロードして、WinPython Control Panelからwhlファイルを指定してInstall PackagesをクリックすればOKです、、、OKなはずなのですが、対応しないWinPythonのバージョンですと、インストールが正しく行われません。この際、何のメッセージも表示されないので注意しましょう。Winpython Command Promptから
`pip install whlfile`
とやった場合には、エラーメッセージが表示されますので、おかしいと思ったらコマンドプロンプトから実行してエラーメッセージをチェックしましょう。

今回は以下の2つのバージョンを使用しました。

 - opencv_python‑3.1.0‑cp34‑cp34m‑win_amd64.whl
 - WinPython-64bit-3.4.4.6Qt5
 
##インストールの確認
IPython Qt Consoleを起動して、以下のようにバージョンを確認することが可能です。

```python:ivt
import cv2
cv2.__version__
`````
'3.1.0'が返ってきました。

##動作確認
では簡単なサンプルをSpyderで作成して動かしてみましょう。
インストールディレクトリのSpyder.exeを起動します。
以下のコードを貼り付けて動作させてみましょう。カメラが起動したら成功です。

なお、真っ黒な画面が表示される場合には、デフォルトのカメラの設定が異なる可能性があるので、cv2.VideoCapture(1)にして試してみてください。Thinkpad　2台で試しましたが1台は0ではなくて1で正しく表示されました。

```python:cameratest.py
import cv2
import time

window = "push ESC key to stop this program"


if(__name__ == '__main__'):
   
    # デフォルトカメラは0
    capture = cv2.VideoCapture(0)
    
    # キャプチャ処理
    while(True):
        key = cv2.waitKey(1)
        if(key == 27):
            print("close.")
            break
        
        # 画像キャプチャ
        ret, img = capture.read()
        
        # 取り込み開始になっていなかったらやりなおし
        if(ret == False):
            print("Capture Failed.")
            break
        
        cv2.imshow(window, img)
           
        time.sleep(0.050)
    
    capture.release()
    cv2.destroyAllWindows()
```

#まとめ
今回はWindowsにpythonとOpenCVの環境を構築し、カメラを起動しました。次回は、サンプル提供される顔検出器を用いて、動画中の顔を認識してみたいと思います。
[クイズ]javascriptと仲良くなるための一歩　第３５話「letとブロックスコープ」


#問題

##第1問

```js
let i = 1;
for(i=0; i<10; i++){
}
i //=> ?
```

##第2問

```js
let i = 1;
for(let i=0; i<10; i++){
}
i //=> ?
```

##第3問

```js
for(let i=0; i<10; i++){
}
i //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

letとvarの違いはこちらを参照。[letとvarの違い](http://qiita.com/y-temp4/items/289686fbdde896d22b5e)


##第1問

```js
let i = 1;
for(i=0; i<10; i++){
}
i //=> 10
```

##第2問

```js
let i = 1;
for(let i=0; i<10; i++){
}
i //=> 1
```

##第3問

```js
for(let i=0; i<10; i++){
}
i //=> Uncaught ReferenceError: i is not defined
```
Azureの仮想マシンを定時に停止し通知を得る方法

# パブリッククラウドの課金
基本的に利用した分だけ請求がかかります。
仮想マシンを24時間起動させていれば、時間あたりの単価を掛けた料金が請求されます。
仮想マシン(VM)なら停止さえすれば、ホスティングによる課金を停止することができます。
※ディスクスペースや固定IPなどの料金は別途発生します。
利用料をメタボにさせないためにも開発環境には是非是非適用させたほうがいいと思います。

# 仮想マシン(ARM)の基本機能
リソースマネージャーモデルの仮想マシンなら基本機能(?)で実装できます。

### 停止したい仮想マシンを選択して、「自動シャットダウン」を選択する
![vm1.PNG](https://qiita-image-store.s3.amazonaws.com/0/123580/b7c8164b-7d15-3421-a178-bda2a6f175d5.png)
### 設定する
悩む箇所はないかと思うが、１点注意が必要なのは「スケジュールされたシャットダウン」の時間表記
欧米式の時刻表記のようで、午前12時が深夜の0時、午後12時が昼の12時となっている。※日本は逆です。
こんな仕様を理解しておくのも馬鹿らしいので、昼の場合は「12:00:00」と入力し夜の場合は「24:00:00」と入力すれば自動補完してくれます。
![vm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/123580/fd6e1f75-fd91-17cf-d00f-4a2118b2dffd.png)

### 15分前にメールが来ます
開発環境だとしても、夜間の間に負荷テストやバッチを実行していることもあるかと思います。
設定を解除しておくのがベターですが、万が一停止漏れ等の場合も以下の画像のように延期や中止を行えるので便利です。
![vm3.PNG](https://qiita-image-store.s3.amazonaws.com/0/123580/c0b47c69-a8e3-6e16-0176-3c276863e0be.png)

# まとめ
仮想マシンの場合は単純な停止のみで済みますが、クラウドサービス(クラシック)やAppServiceなどは単純な停止だけでは課金継続されます。
停止や起動のスケジュールも含めて、もう少し詳細な設定はAutomationやFunctionsを利用して行うのがいいかと思います。
canvasにゲームテーブルを描画する（HTML5でブラウザゲームを作る）

ゲーム画面の背景は事前にグラフィックソフト等を使って画像ファイル化して読み込むという手法もありますが、模様の類であればプログラムでリアルタイムで描画するほうが通信量が大幅に減り、試行錯誤の調整もやりやすくメンテナンスがかなり楽になります。

以下が実際にゲーム内で使用されている背景です。

**HMG大富豪**
https://hasemonmon.net/df5/
![Screenshot from 2017-08-22 02-13-53-min.png](https://qiita-image-store.s3.amazonaws.com/0/198186/a9083fa0-2a68-7e55-91aa-5b3f56a2af9d.png)

#フエルト地のようなテーブル表面

canvasにベースとなる色を塗ります。

```js:
// キャンバス

var w = 320, h = 320;    // キャンバスのサイズ
var cv = document.createElement("canvas");
cv.setAttribute("width", w);
cv.setAttribute("height", h);
var ctx = cv.getContext('2d');
ctx.fillStyle = "#45cc82";  // 単色塗り
ctx.fillRect(0, 0, w, h);
```

加工のためにcanvasからピクセルデータ配列を取得します。
1ピクセル毎にR,G,B,Aの4データが有りますので、配列サイズはピクセル数*4になります。

```js:
// キャンバスからピクセルデータ配列を取得
var imageData = ctx.getImageData(0, 0, w, h);
var arrRGBA = imageData.data;
```

ピクセル単位でノイズを加えていきます。
ノイズは元の画像の色に対し色の濃さを％で変化させたものになります。
1ピクセル毎に4つのデータですのでforループは4カウントアップしていきます。

```js:
// ピクセルデータ配列を加工
for (var i = 0, l = arrRGBA.length; i < l; i += 4) {
	var per = 0;
	// 色を変化させる%を乱数で決定（実際の出力を見ながらここで微調整を加えていく）
	var rnd = Math.random();
	if (rnd < 0.2) {
		per = Math.random() * 5 + 3;
	} else if (rnd > 0.8) {
		per = Math.random() * -2 - 1;
	}
	// 色を%変化させる
	arrRGBA[i + 0] = colorPer(arrRGBA[i + 0], per);
	arrRGBA[i + 1] = colorPer(arrRGBA[i + 1], per);
	arrRGBA[i + 2] = colorPer(arrRGBA[i + 2], per);
	arrRGBA[i + 3] = arrRGBA[i + 3];
}
// 色を%で変化させる関数
function colorPer(value, per) {
	if (per === 0) return value;
	var newValue = value + Math.floor(value * per / 100);
	newValue = (newValue > 255) ? 255 : newValue;
	newValue = (newValue < 0) ? 0 : newValue;
	return newValue;
}

```

キャンバスへピクセルデータを書き戻します。

```js:
ctx.putImageData(imageData, 0, 0);
```

**出力結果**
![Screenshot from 2017-08-22 02-41-26-min.png](https://qiita-image-store.s3.amazonaws.com/0/198186/abfc5c4e-e0dc-ee79-9bf5-ad8339482585.png)

これでフエルト地の立体的な表面が表現できました。

#ライティングによる明暗

先ほどの処理ループ部分にライティングによる明暗処理を追加します。


```js:

var iy = 4 * 320;	// y毎の配列要素数
var cx = 160;	// グラデーションの中心x座標
var cy = 160;	// グラデーションの中心y座標

for (var i = 0, l = arrRGBA.length; i < l; i += 4) {
	var per = 0;
	var rnd = Math.random();
	if (rnd < 0.2) {
		per = Math.random() * 5 + 3;
	} else if (rnd > 0.8) {
		per = Math.random() * -2 - 1;
	}

	// 円グラデーション
	var x = (i % iy) / 4;		// iからピクセル座標xを計算
	var y = Math.floor(i / iy);	// iからピクセル座標yを計算
	var r = Math.sqrt(Math.pow(cx - x, 2) + Math.pow(cy - y, 2));	// グラデーションの中心からの距離を計算
	per += -((r - 40) / 5);	// 距離により色を変化させる%を変化させる

	arrRGBA[i + 0] = colorPer(arrRGBA[i + 0], per);
	arrRGBA[i + 1] = colorPer(arrRGBA[i + 1], per);
	arrRGBA[i + 2] = colorPer(arrRGBA[i + 2], per);
	arrRGBA[i + 3] = arrRGBA[i + 3];
}

```

**出力結果**
![Screenshot from 2017-08-22 04-03-19-min.png](https://qiita-image-store.s3.amazonaws.com/0/198186/f3b5fffd-3328-acc8-6783-50e453dfafd4.png)

これでライティングの明暗が表現できました。
確率まとめ①　確率の定義

## 目次
1. 標本点と標本空間
2. 事象の集まり（加算加法族）
3. 確率と確率空間
4. 参考文献
5. バージョン

## 標本点と標本空間
サイコロを振った結果など、一回の出来事で起こることを標本点 $E_1, E_2, E_3, ...$ と呼び、標本点の全体からなる集合を標本空間 $\\{E_1, E_2, E_3, ... \\}$ と呼び $\Omega$ と表す。

## 事象の集まり（加算加法族）
標本空間 $\Omega$ に対し、$\Omega$ の部分集合で次を満たすものを事象の集まり $\mathscr{F}$ と呼ぶ。
1. $\mathscr{F} \ni \emptyset$（単に集合の性質「どんな集合も空集合 $\emptyset$ を含む。」を言っている。）
2. $E \in \mathscr{F}$ なら $E^c \in \mathscr{F}$（$\mathscr{F}$ に含まれる任意の事象 $E$ に対し、それが起こらない事象 $E^c$ も $\mathscr{F}$ に含まれる。）
3. $E_1, E_2, E_3, ...$ に対し $\bigcup_{i}^{\infty}E_i \in \mathscr{F}$（$\mathscr{F}$ に含まれる任意の事象 $E_1, E_2, E_3, ...$ に対し それらの和集合も $\mathscr{F}$ に含まれる。）
サイコロの出た目で $\Omega$ を考えると、$\mathscr{F}$ を $\Omega$ 全体として、２番については奇数が出る事象は $\mathscr{F}$ に含まれるが、奇数が出ない事象は偶数が出る事象のことなので $\mathscr{F}$ に含まれることがわかり、３番目については奇数が出る事象または偶数が出る事象はサイコロの結果の全ての事象のことなので $\mathscr{F}$ に含まれることがわかる。

## 確率と確率空間
標本空間 $\Omega$ に対して事象の集まり $\mathscr{F}$ がある時、$\Omega$ 上の関数で次を満たすものを確率と呼ぶ。
1. 全ての事象 $E \in \mathscr{F}$ に対し事象 $E$ が起こる確率は 0 以上 1 以下である、$0 \leq P\left[E\right] \leq 1$。
2. 全事象が $\Omega$ が起こる確率は１である、$P\left[\Omega\right] = 1$。
3. それぞれ排他的（共通する部分がないよう）な事象 $E_1, E_2, E_3,... \in \mathscr{F}$に対し、どれか一つが起こる確率は、それぞれが起こる確率の合計になる、$P\left[\bigcup_{i}^{\infty}E_i\right] = \sum_{i}^{\infty}P\left[E_i\right]$。
またこの時、組 $\left(\Omega, \mathscr{F}, P\right)$ を確率空間と呼ぶ。
先ほどのサイコロの例で考えれば、１番目については偶数、奇数の出る確率はそれぞれ 0.5 であり、２番目については偶数または奇数の出る確率は 1 であり、偶数の確率と奇数の確率の合計は 0.5 + 0.5 = 1 となり一致することがわかる。

## 参考文献
1. [確率論 I, 確率論概論 I](http://www2.math.kyushu-u.ac.jp/~hara/lectures/02/pr-grad-all.pdf)
2. [明解演習数理統計](http://www.kyoritsu-pub.co.jp/bookdetail/9784320013810)

## バージョン
1. [2017.08.22] First Release
2. [2017.08.22] 標本点と標本空間の説明を修正
3. [2017.08.22] タグ修正
4. [2017.08.23] 確率の定義を修正
一覧(すべての投稿)に、本文にプログラミング言語のソースがあれば、タグとは別に言語名を自動的に表示してほしい。

メモかソースか、一覧でわかるようにしてほしい。
言語のインストールか、ソースかを、一覧でわかるようにしてほしい。
例
markdownの
```ruby:qiita.rb
のrubyです。
複数あれば、ruby,python,php他
よろしくお願いします。

－－－－－－－－－－－－－－
【補足】(2018/01/06)
https://help.qiita.com/ja/articles/qiita-community-guideline

Qiitaへの要望や意見はサポート窓口へ
Qiitaへの要望や意見については記事としてではなく、ご意見のリンクもしくはサポート窓口へ報告をお願いします。
CodilityのTrainingを解いてみた その

## 問題  [TapeEquilibrium](https://codility.com/programmers/lessons/3-time_complexity/tape_equilibrium/)

* 使用言語：Swift3

## ソースコード
```
public func solution3_3(_ A : inout [Int]) -> Int {
        if A.count == 2 {
            return abs(A[0] - A[1])
        }
        var sum = 0
        for i in 0...A.count - 1 {
            sum = sum + A[i]
        }
        
        var pMns = A[0]
        var pPls = sum - pMns
        var minDif = abs(pPls - pMns)
        for i in 1...A.count - 2 {
            pMns = pMns + A[i]
            pPls = sum - pMns
            let dif = abs(pPls - pMns)
            if dif - minDif < 0 {
                minDif = dif
            }
        }
        return minDif
    }
```
CodilityのTrainingを解いてみた その5

## 問題  [FrogJmp](https://codility.com/programmers/lessons/3-time_complexity/frog_jmp/)

* 使用言語：Swift3

## ソースコード
```
public func solution3_2(_ X : Int, _ Y : Int, _ D : Int) -> Int {
        let shou = (Y - X) / D
        let doubleShou = (Double)(Y - X) / (Double)(D)
        return doubleShou - (Double)(shou) == 0.0 ? shou : shou + 1
    }
```
CodilityのTrainingを解いてみた その4

## 問題  [PermMissingElem](https://codility.com/programmers/lessons/3-time_complexity/perm_missing_elem/)

* 使用言語：Swift3

## ソースコード
```
public func solution3_1(_ A : inout [Int]) -> Int {
        if A.count == 0 {
            return 1
        }
        
        var allSum = 0
        var luckSum = 0
        for i in 0...A.count {
            if i <= A.count - 1 {
                luckSum = luckSum + A[i]
            }
            allSum = allSum + i + 1
        }
        return allSum - luckSum
    }
```
CodilityのTrainingを解いてみた その3

## 問題  [CyclicRotation](https://codility.com/programmers/lessons/2-arrays/cyclic_rotation/)

* 使用言語：Swift3

## 感想  
最初は下記に示したソースコードより長くて、非効率なプログラムを書いてしまった。
しかしそれだと計算時間がかかり100点が取れなかった。
排他的論理和を使うことで、効率的、かつ、速度の早い実装ができるのだなとしみじみ思った。

## ソースコード
```
public func solution2_3(_ A : inout [Int]) -> Int {
        
        if A.count == 1 {
            return A[0]
        }
        
        var val = 0
        for a in A {
            //http://hajihaji-lemon.com/smartphone/swift/%E6%BC%94%E7%AE%97%E5%AD%90%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/
            val ^= a  // 左辺と右辺の排他的論理和(XOR)の結果を左辺の変数に代入する。
        }
        return val
        
    }
```
SublimeText3のよく使うプラグイン

## PackageControllのインストール

SublimeText上で、リポジトリ上に登録されているプラグインを検索、インストールできるようにするプラグインです。
リポジトリを追加することも可能。

ググって入手。

# プラグインたちの入手

## 基本的なプラグインの使い方、調べ方

- 調べ方。ググる。
- GitHubに使い方が書いてあることが多いので参考にする。
- Preferences > Package Settings にインストールされているプラグインが表示されるので、そこからキー設定が見ることができる。

## Case Conversion

スネークケース、キャメルケースなどの書式の切り替えができる。

PackageControllで名前検索でインストール。

## SublimeDataConverter

CSVをJSONやPHP配列などさまざまな形式に変換できます。

https://github.com/fitnr/SublimeDataConverter

## RandomText

メールアドレスなどをランダムで生成できる。

インストール方法：https://github.com/dallbee/RandomText

## Pretty JSON

JSONフォーマッター。形式不備も見つけられる。

## SQL Beautifier

SQLフォーマッター。

## Sublimerge

差分比較ツール。有料。
基本的にはIDEの比較ツールで十分ですが、IDE開くまでもない時や、プロジェクトと関係ないファイルを比較する時に使える。

## InsertDate

日付を入力できる。フォーマットはさまざまだが、エクセル感覚で入力できるのでうれしい。

PackageControllで名前検索でインストール。

## ConvertToUTF8

SublimeTextで文字化けしないようにするため。

PackageControllで名前検索でインストール。

## InputSequence

数値のインクリメント。

https://github.com/kazu1107/InputSequence

## BetterFindBuffer

検索結果のFindResultの中で、ワードの部分に合わせてEnterをしてそのファイルにジャンプできるようにするプラグインです。
クリックしてファイル移動するより楽です。

PackageControllで名前検索でインストール。
Swift から libPhoneNumber-iOS を使い有効な電話番号か確認するには

## TL; DR
- libPhoneNumber-iOS を使うと、簡単に有効な電話番号か判定可能
- libPhoneNumber-iOS は Google 製の [libphonenumber](https://github.com/googlei18n/libphonenumber) を移植したもの

## 導入
Cocoapods もしくは Carthage にて導入できます。

```ruby:Podfile
pod 'libPhoneNumber-iOS', '~> 0.8'
```

```filename:Cartfile
github "iziz/libPhoneNumber-iOS"
```

## 利用方法
libPhoneNumber-iOS を使うと、**電話番号** を受け取り **有効な電話番号か** を返す関数は、Swift 3 で下記のように記述できます。

電話番号のパース自体に失敗した場合も、無効な電話番号としています。

```swift
import libPhoneNumber_iOS

func isValidNumber(_ phoneNumber: String) -> Bool {
    let phoneUtil = NBPhoneNumberUtil()

    do {
        let phoneNumber = try phoneUtil.parse(phoneNumber, defaultRegion: "JP")
        return phoneUtil.isValidNumber(phoneNumber)
    } catch { }
    
    return false
}
```

## まとめ
libPhoneNumber-iOS を使うと、Swift から簡単に有効な電話番号か判定できます。

特に、サーバー側での判定に [libphonenumber](https://github.com/googlei18n/libphonenumber) を使っている場合、バリデーションロジックを統一することができるためオススメです。
CodilityのTrainingを解いてみた その２

## 問題  [OddOccurrencesInArray](https://codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/)

* 使用言語：Swift3

## ソースコード
```
public func solution2(_ A : inout [Int], _ K : Int) -> [Int] {
        let aNum = A.count
        if aNum == 0 {
            return A
        }
        
        let validK = K % aNum
        var ansArray = [Int]()
        if validK == 0 {
            return A
        }
        
        for i in aNum - validK...aNum - 1  {
            ansArray.append(A[i])
        }
        for i in 0...aNum - validK - 1 {
            ansArray.append(A[i])
        }
        return ansArray
    }
```
codilityのテストを受けてみた

# Codilityというプログラミングテストをやってみた

## Codilityとは
俗に言う競技プログラミングだったり、エンジニアのスキルをチェックするためのサービス。
訳あってCodilityのテストを受けることになったため、その練習のためにTraining問題を解いてみた。

## 問題  [Binary Gap](https://codility.com/programmers/lessons/1-iterations/binary_gap/)

* 使用言語：Swift3

## コード  
```
public func solution1(_ N : Int) -> Int {
        if N <= 1 {
            return 0
        }
        
        var binaryArray = [Int]()
        var quo = N
        while quo >= 1 {
            binaryArray.append(quo % 2)
            quo = quo / 2
        }
        if quo == 1 {
            binaryArray.append(quo)
        }
        binaryArray = binaryArray.reversed()
        var gapArray = [0]
        var gap = 0
        for i in 1..<binaryArray.count {
            if binaryArray[i] == 0 {
                gap = gap + 1
            } else {
                gapArray.append(gap)
                gap = 0
            }
        }
        let descArray = gapArray.sorted { $0 > $1 }
        return descArray[0]
    }
```
イベントレポート：テクノロジー × 地方 Meetup! これが私の生きる道#01に行っていました(後篇)

#前回の続きです
前篇はこちらをご参照ください
http://qiita.com/wakaran_ojisan/items/bf4df9f987aebcf9a0f8

##小島淳氏（福岡県 株式会社オルターブース 代表取締役）
小島さんは福岡県のベンチャーへの優遇について紹介をしていました。
福岡市は国家戦略特区であり、「グローバル創業・雇用創出特区」として、創業の支援と雇用の創出に取り組んでいます。
スタートアップ法人減税、スタートアップビザなど、たくさんのスタートアップ支援制度があり、多くのスタートアップ企業がこの恩恵を受けています。
日本国内をターゲットに事業を行うには地方であることはデメリットに働くそうです。特に東京に比べて資金調達が困難で、地元企業からの投資はないそうです。しかし、海外をターゲットとした場合はデメリットはなく、このような国家戦略特区の恩恵を受ける地域でスタートアップをするのも良いかもしれません。

##常盤木龍治氏（沖縄県 株式会社レキサス エバンジェリスト／事業推進部マネージャー）
SAPに務めていらしたのですが、現在は沖縄を拠点に活動をしています。
SAP時代に比べ、収入は30%になったが幸福度は上がったそうです。
常盤木さんは主に自身がJICAの中南米日系人社会との連携調査団の一員としてブラジルに行ったときのことを紹介していました。
プレゼンの中でおっしゃっていた「世界の地方と日本の地方をつないで、世界の問題を解決する。」というフレーズが印象的でした。

#感想
期待していた地方ならではの働き方というのとは少し離れたイベントでした。
地方で働くということは大変なことですが、小泉さんや小島さんのように利点になる場合もあることも理解できました。
東京で埋没したくない。新しいことを始めたい方は地方を選択肢に入れても良いかもしれません。
awspecの実行(ec2 AmazonLinux)

## 環境
amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 (ami-4af5022c)

## 事前準備
```
# rbenvの導入
sudo su -
yum install git -y
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install --list
yum install -y gcc openssl-devel readline-devel zlib-devel
# ruby 2.2.7 install
rbenv install -v 2.2.7
```

# awspecのinstall(bundle)

```
mkdir /var/tmp/work
cd /var/tmp/work
rbenv local 2.2.7
gem install bundler

bundle init
cat << '_EOS_' >> ./Gemfile
gem 'awspec'
_EOS_

bundler install --path vendor/bundle
```

# 実行

```
mkdir /var/tmp/work/awspec
bundle exec awspec init
# aws configure等クレデンシャルが見えるようにしておく
bundle exec awspec generate ec2 [vpc-id]
# 問題なければファイルを生成
bundle exec awspec generate ec2 [vpc-id] >> ./spec/ec2_spec.rb
# 生成したファイルにrequire 'awspec'を追記
vim ./spec/ec2_spec.rb
# 実行
bundle exec rake spec
```
macOSアプリのウィンドウスタイルのプログラム制御


オプション用ウィンドウ等、あとから生成したウィンドウはstoryboardで設定したwindow設定（Controls）が無視される


なので生成後にプログラム側からスタイルを設定しなくてはいけない


初期WindowとModalで呼び出したWindowのコールバックの呼ばれる順の違い

### MainWindow

1. windowWillLoad
2. viewDidLoad
3. windowDidLoad
4. viewDidAppear
5. viewDidLayout


### その他のWindow

1. viewDidLoad
2. viewDidLayout
3. viewDidAppear

viewDidAppearとviewDidLayoutが逆で呼ばれる
viewDidAppear後にStyle変更処理を書かないと反映されない

```
override func viewDidAppear() {
    super.viewDidAppear()
    self.view.window?.styleMask.remove(.closable)
    self.view.window?.styleMask.remove(.resizable)
}

```
goaに触ってみる - 開発フローについて

前回にgoa公式のgoaを始めるでapiを一本だけ作成しました([goaに触ってみる](http://qiita.com/smith_30/items/ffdb6a499f39060faf7c))

今回はその続きでgithubに上がってる[goaセラーの参考例](https://goa.design/ja/learn/cellar/)を
手元で動かしながら開発スタイルに慣れていこうと思います

基本的には[githubに上がってるソース](https://github.com/goadesign/goa-cellar)を見ながら
気づいた点をまとめていきます

## controllersディレクトリの作成

controllersディレクトリを作って生成されるcontrollerを移す

```bash
$ tree ./ -L 1
./
├── Gopkg.lock
├── Gopkg.toml
├── app
・
・
├── bottle.go # ← こいつを下記のcontrollersに移す
├── controllers # ←
・
・
・
```

- goaによって生成されるcontrolllerから差分のみ既存のコードに適用していくため

- controllerに相当するコードは一度しか生成されないので

## 同じくapp_dev.goをmain.goと同じように設定する

ローカルで動かす実行ファイルも作っておく
基本はmain.goで生成されたものをコピペするだけ
ファイルの頭に下記のような記述をして、buildを分けられるようにする

```go:app_dev.go
// +build app_dev

package main
```

こうすることで`tag`の記述でビルドを分けることができる

```bash
# local
$ go build -tags=app_dev -o cellar-dev

# prod
go build -o cellar-prod
```

Makefile作っとくといいですね

```basemake:Makefile
#! /usr/bin/make
#
# Makefile for goa cellar example

build:
	@go build -o cellar

build-dev:
	@go build -o -tags=app_dev cellar-dev
```

ついでにコード生成のタスクも書いておく

```basemake:Makefile
gen:
	@ls | grep -E '.go$$' | grep -v -E 'app_dev' | xargs rm -f
	@./vendor/github.com/goadesign/goa/goagen/goagen bootstrap -d path/to/design

# ↑のインデントがタブでないとMakefileではエラーになる難儀ですね。。
# Makefile:n: *** missing separator.  Stop.
```

## designパッケージの分割

githubのリポジトリに従ってdesignパッケージを分割してみる

```bash
$ tree -L 1 design
design
├── api_difinition.go # API定義、hostとか全体の設定
├── health.go         # healthチェック、API自体が落ちてないか確認する用?
├── media_types.go    # レスポンス内容の定義
├── resources.go      # ルーティングの定義
└── user_types.go     # ユーザーが設定する基本型の拡張定義
```

ex.)

```go:design/user_types.go
	Attribute("name", func() {
		MinLength(2)
		Example("Number 8")
	})
```

### 最後に

あとは実際にdesignに定義書いていって開発を進めていけば概ねokなのでしょうか
実際に書いていって詰まった点や、これが便利等あれば書いていきたいです

地味に`Scheme("ws")`でwebsocket処理もサポートしているのがすごい
ただ、使っているのは`golang.org/x/net/websocket`であり
`gorilla/websocket`ではないです。。

このやり方がいいよというようなツッコミ歓迎です！
【swift3.0】APIKitとHimotokiで初めてAPI通信した時のメモ


今回mvcモデルでapi呼び出しにはapikitとhimotokiを使用。
初心者向けの記事が見つからなくて結構苦労したのでメモ。

APIKit：swiftからapiサーバーを叩きに行く。
Himotoki:返ってきたレスポンスのデコード。

#APIKit

apikitの処理を定義

```swift:
    // [GET] /api/hoge/:id
    struct GetHoge: APIRequest {
        typealias Response = Hoge

        var method: HTTPMethod = .get
        var path: String { return "api/hoge/\(self.id)" } //jsonのパスを指定
        var id: Int
        var headerFields: [String : String] //ヘッダ情報追加したい場合

        //クラス生成時に呼ばれる
        init(id: Int) {
            self.id = id
            self.headerFields = ["hoge" : "hoge!", "hoge2" : "hoge2!"]
        }
        //レスポンス受け取った時
        func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Hoge {
            return try decodeValue(object) //このあとにHimotokiへ
        }
    }

```

apikitを呼び出してリクエスト送信

```swift:
        let request = API.Request.GetHoge(id: hogeId)
        Session.send(request) { result in
            switch result {
            case .success(let hoge):


            case .failure(let error):
                logger.error(error)
            }
        }

```

レスポンスがapiサーバーから返ってきた後にmvcのhogeモデルにデータを格納するのにhimotokiを使用。
<|この辺の謎記号はhimotokiの決まりごと。
apiサーバー側でモデルと同じ項目数を返さない設計にした場合はオプショナル型にして回避した。
とりま動くけど本当にこんなのでいいのか不明。


```swift:
import Foundation
import Himotoki

struct Hoge: Decodable {

    let id: Int
    let hoge: String

    static func decode(_ e: Extractor) throws -> Hoge {
        return try! Hoge(
            id: e <| "id",
            hoge: e <| "hoge",
        )
    }

}

```


```:himotoki決まりごと
<|	T	A value
<|?	T?	An optional value
<||	[T]	An array of values
<||?	[T]?	An optional array of values
<|-|	[String: T]	A dictionary of values
<|-|?	[String: T]?	An optional dictionary of values
```


#参考にした記事
http://qiita.com/Shunyama/items/22deffcec6f14bc9f47a
https://github.com/ishkawa/APIKit/issues/176
http://dev.classmethod.jp/smartphone/himotoki/
スワイプで開かないDrawerLayout

サボりすぎた。
タイトルまんま。
なお、スワイプで閉じないようにするにはonTouchEventで常にtrue、onInterceptTouchEventで常にfalseを返せばよいでしょう。

```Kotlin
class CustomDrawerLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
    : DrawerLayout(context, attrs, defStyleAttr) {

    override fun onTouchEvent(ev: MotionEvent?): Boolean {
        if (!isDrawerOpen(GravityCompat.START))
            return true
        return super.onTouchEvent(ev)
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        if (!isDrawerOpen(GravityCompat.START))
            return false
        return super.onInterceptTouchEvent(ev)
    }
}
```

[株式会社Arrvis](http://www.arrvis.com)
perlでtweetしてみた。

# perlでtwitter。
最近perlを書くことになり、練習がてらtwitterAPI叩いてみた。
tokenいれてよしなにするだけだと思っていたら地味に躓いたので覚書程度に。

## 対象
- perlって何？
- perl触ってみたい

という方。

## tool
- plenv
- Net::Twitter::Lite::WithAPIv1_1
- YAML(token扱うために使いました 他に良い方法あればご教授願います><)

# Let's Hack.
環境作るところからしたいと思います。

## plenv install
まずはplenv本体とperl-buildをgit clone。

```
git clone git://github.com/tokuhirom/plenv.git ~/.plenv
git clone git://github.com/tokuhirom/Perl-Build.git ~/.plenv/plugins/perl-build/
```

pathを通します。
.bash_profileにでも追記してください。

```
export PATH="$HOME/.plenv/bin:$PATH"
eval "$(plenv init -)"
```
追記後、反映させます。

```
exec $SHELL -l
```

## perl install

```
plenv install -l
```

とするといろいろバージョンが表示されます。
好きなものをinstallしましょう。

```
plenv install 5.27.2
plenv rehash
plenv global 5.27.2
```

perlのバージョンが変わったかと思います。
ついでにcpanもinstallします。

```
plenv install-cpanm
```

## coding

Net::Twitter::Lite::WithAPIv1_1というものを使います。
参考記事を探すとNet::TwitterやNet::Twitter::Liteとなっているのですが、Twitter API 1.0が廃止されたことによって、これらも使えなくなってしまったのでNet::Twitter::Lite::WithAPIv1_1を使います。

```
cpan install Net::Twitter::Lite::WithAPIv1_1
cpan install YAML::Tiny
```

installできました。

```perl:twitter.pl
use strict;
use warnings;
use utf8;
use Net::Twitter::Lite::WithAPIv1_1;
use YAML::Tiny;

my $data = YAML::Tiny->new;
$data = YAML::Tiny->read('./secret_key.yml');
my $key = $data->[0];

my $nt = Net::Twitter::Lite::WithAPIv1_1->new(
  consumer_key        => $key->{'consumer_key'},
  consumer_secret     => $key->{'consumer_secret'},
  access_token        => $key->{'access_token'},
  access_token_secret => $key->{'access_token_secret'},
  legacy_lists_api    => 1,
  ssl                 => 1
);

eval {
  $nt->update('わふー');
};
```
access tokenは別ファイルに切り出してます。

```yaml:secret_key.yml
consumer_key: 'こんしゅーまーきー'
consumer_secret: 'こんしゅーまーしーくれっと'
access_token: 'あくせすとーくん'
access_token_secret: 'あくせすとーくんしーくれっと'
```

あとは `perl twitter.pl` とすれば動くと思います。

Net::Twitter::Liteとかじゃだめ。インスタンス生成するときに `ssl => 1` がないとだめ。というところにきづかずちょっと手こずってしまった。。。

## 最後に
ドキュメントをちゃんと読めば詰まることはなかった。。。
ExcelファイルのVBAをExportするためのVBScript


######＜説明＞

このVBSの上にExcelファイルをドラッグドロップすると、そのExcelファイル内のVBAコードがExportされる。
あらかじめ、Excelのオプションの「VBAプロジェクトオブジェクトモデルへのアクセルを信頼する」にチェックを入れておく必要がある。

---
```ExportVBA.vbs
Option Explicit

Dim a   'Argument
Dim b   'Book
Dim c   'Component
Dim d   'Directory
Dim e   'Excel
Dim f   'FileSystemObject

With WScript
    If .Arguments.Count = 0 Then
        .Echo "Drop your Excel Macro Files on it."
    Else
        Set f = CreateObject("Scripting.FileSystemObject")
        Set e = CreateObject("Excel.Application")
        For Each a In .Arguments
            If f.FileExists(a) Then
                d = f.GetParentFolderName(.ScriptFullName) & "\vba_" & f.GetFileName(a) 
                Set b = e.Workbooks.Open(a,0,True,,,,True)
                With b.VBProject 
                    If .Protection = 0 Then
                        For Each c In .VBComponents
                            If c.CodeModule.CountOfLines > 2 Then
                                If Not f.FolderExists(d) And Not f.FileExists(d) Then f.CreateFolder d 
                                c.Export d & "\" & c.Name & Ext(c.Type) 
                            End If
                        Next    
                    End If
                End With
                b.Close False
            End If
        Next
        e.Quit
        Set b = Nothing
        Set e = Nothing
        Set f = Nothing
    End If
End With

Function Ext(cType)
    Select Case cType
        Case 1      : Ext = ".bas"
        Case 3      : Ext = ".frm"
        Case Else   : Ext = ".cls"
    End Select
End Function

```
---
【学習メモ】Takram Podcast


#Takram Podcastの私的メモ
https://soundcloud.com/takramcast
https://itunes.apple.com/jp/podcast/takram/id1161310459?mt=2



##

###ビジュアライズの価値
　データの生々しさを表現
　　→ex: 人、お金の動き
　複雑なものを圧縮せずに見せられるようになった
　　→そこから何かを受け止めるには訓練が必要
　データを触らず、どう表現するかの知覚を得ることは難しい
　データをどこまで感じられるか
　　→人間の感覚器官は限られている
　データの全体像をどれだけ取り入れられるか
　データビジュアライズ、いかに次元を増やしていくか、
　そしていかにすんなり受け入れられるか
　情報整理学

###分析について
　データの圧縮
　　ex: マイケルジャクソンの人生を5秒間で
  どこまで見せるか
　可視化と分析系は滑らかにつながっていてきれいに切り分けられない
　圧縮する情報（分析）と圧縮しない情報（ビジュアライズ）のコラボレーションが肝要

###AI
　人間と機械の分担
　AIにできないことのコア
　　→人に寄り添うこと
　　　メンタル面での人間の下支え
　AIでできることはAIに

###宣伝
　yahooの受付の壁
　Yahoo!がもっているブランディングイメージ
　Yahoo!のデータの膨大さ、外の繋がり、日々変化して
　皆さんとコミュニケーションしている
　同じ物を見ていても気づきのレベルの差がある


###データジャーニー
　旅するデータ
　データ→ビジュアライズ→人が変わる→新しいデータの繰り返し
[お金を扱う]カード決済

<p>FeliCaに対応したiPhone 7 (jp)の登場で、iOS関連のカード決済が盛り上がってきたので、カードを使った決済について調べてみた。</p>

<table border="1" cellpadding="4" cellspacing="1">
	<tr>
		<td rowspan="2">カード</td>
		<td>クレジットカード</td>
	</tr>
	<tr>
		<!-- カード -->
		<td>銀聯カード</td>
	</tr>
	<tr>
		<td rowspan="3">電子マネー</td>
		<td>交通系IC</td>
	</tr>
	<tr>
		<!-- カード -->
		<td>QUICPay</td>
	</tr>
	<tr>
		<!-- カード -->
		<td>iD</td>
	</tr>
</table>

<p>NFC TYPE-A/BとFeliCa(NFC TYPE-F)の関係がよくわからなかったのだが、前者は非接触EMVのクレジットカードで利用され、後者は電子マネーで利用されているようで、両者に対応したサービスにお目にかかれないのは、これが理由のようだ。</p>

関連情報
<a href="https://cocoa-study.connpass.com">Cocoa勉強会 BUKURO.swift (connpass)</a><br />
<a href="https://cocoa-kanto.connpass.com">Swift勉強会 関東 (connpass)</a><br />
<a href="https://atnd.org/groups/cocoa-study">Cocoa勉強会 BUKURO.swift (ATND)</a><br />
<a href="http://cocoa-study.peatix.com">Cocoa勉強会 BUKURO.swift (Peatix)</a><br />
<a href="https://mosa.connpass.com">MOSA BUKURO.swift (connpass)</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
rails newの際に `--skip-bundle` と `--webpack=xxx` は同時に指定できない

# TL;DR

- `rails new` する時に `--skip-bundle` と `--webpack=react` を同時に指定するとエラーになった
- 現状は仕様みたい
- newした後でGemfileに `gem 'webpacker'` を追加してbundleした後 `./bin/rails webpacker:install` すればOK

# `rails new`したらエラーになった

reactを使った `rails` プロジェクトを作ろうと思って `rails new` を実行したらエラーになりました。

```bash
$ rails new -B --webpack=react sample
      create
      create  README.md
      create  Rakefile
（中略）
       rails  webpacker:install
Could not find gem 'sqlite3' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
       rails  webpacker:install:react
Could not find gem 'sqlite3' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

考えてみると `gem 'webpacker'` がインストールされてないので `webpacker:install` 出来ないですよね。

[本家のgithubにもissueとして挙がってました。](https://github.com/rails/rails/pull/28929)

# 解決策

単純ですが `new`時に `--skip-bundle` したい場合 `new` した後で手動でwebpackerを入れればOKです。

```bash
$ rails new -B PROJECT_NAME

$ cd PROJECT_NAME

# 以下のコマンド、もしくはエディタでGemfileに追加
$ echo "gem 'webpacker', '~> 2.0'" >> Gemfile

$ bundle install

$ ./bin/rails webpacker:install

# 今回はreactを入れたかったので以下を実行
$ ./bin/rails webpacker:install:react
```
iptablesがない？？Linux/CentOS7でtomcat(8080ポート)、apache(80/443ポート)を解放する方法

やりたいこと
- tomcat のポート (8080) を開く
- Apache のポート (80, 443) を開く

#CentOSのバージョンごとに対処法が異なる？
　CentOS6以前とCentOS7からでは少なくともtomcatにおけるポート開放の手順が異なっているようです。６まではiptablesファイルの編集をすることで解放できましたが７からはファイルがありません。
　当記事では前半に今までの対応方法、後半でiptablesファイルが見当たらない人向けの内容になっております。また、tomcatの起動方法は記事の最下部に記載してあります。
　わかりづらい点・間違った点などありましたら編集しますのでコメントよろしくお願いします。

#前提
- CentOS/Linux環境
- tomcatを動かすためにjdkは入れておく
- tomcatは/usr/local/にインストール(本記事ではapache-tomcat-8.0.46)

#iptablesファイルを編集し、8080ポート解放

**# vi /etc/sysconfig/iptables でファイルを編集**
(ポートの管理をしている設定ファイルをviで開く)

:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT       ←この行を追加
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

上記の設定を反映
\# /etc/init.d/iptables restart

#iptablesファイルが見当たらない場合
CentOS7から管理形式が変わったようです。
iptablesファイルが見当たらない場合は下記を試してください。

大まかな手順としては
/usr/lib/firewalld/services/ 直下に tomcat.xml ファイルを準備し、そのファイルを 「firewall-cmd」コマンドで登録（ファイヤーウォールに穴を開ける）、のちサービス再起動

##手順##

※以下はすべて root 権限で実行する必要がある
※tomcat.xml は存在しないので新たに作成する必要がある
※http.xml , https.xml は既に用意されているので作成する必要はない

tomcat.xml を作成する

> tomcat.xml の内容
```<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Tomcat</short>
  <description>Open Tomcat port</description>
  <port protocol="tcp" port="8080"/>
</service>
```


###port解放コマンド
\# firewall-cmd --zone=public --permanent --add-service=tomcat

-必要であればこちらもコマンドを打とう
\# firewall-cmd --zone=public --permanent --add-service=http
\# firewall-cmd --zone=public --permanent --add-service=https

###ファイアウォールを再起動して設定反映
\# systemctl restart firewalld.service



以上で80, 443, 8080 のポートが解放され、他のホストから接続することができるようになる

##Tomcat起動


〇Tomcat起動
tomcatの存在するディレクトリから起動
例：/usr/local/apache-tomcat-8.0.46/bin/startup.sh

〇Tomcatのログの最後を常に表示 [&]は裏側で起動
tail -f /usr/local/apache-tomcat-8.0.46/logs/catalina.out &

〇Windows/MacOSからブラウザを開きCentOSのIPアドレスへアクセス
http://xxx.xxx.XX.XX:8080

〇Tomcat停止
/usr/local/apache-tomcat-8.0.46/bin/shutdown.sh
OpsWorks with Rails 環境でDB Migration問題をなんとかする

## はじめに

AWS OpsWorksではChef11を選択すると、Railsスタックをデフォルトで提供しており、エンジニアが自前でChefなど用意しなくてもHeroku感覚でAWSをPaaSとして利用することが出来ます。

- Herokuほどフルマネージドは要件上出来ないが、インフラはある程度管理したい
- Chef実行準備が面倒くさい
- コードのDeploy機能とデプロイ記録とりたい
- CloudWatch Logs統合　(ログPath設定を画面から出来る) 
- AWSビジネスサポートに入っていると、困っている時に技術的なことを直接チケットを投げて聞ける

こんなメリットたちがあります。__正直最後のメリットが一番のような気もしますが・・・__

## DB Migration問題？

このサービスには致命的な問題があります。__なんと複数インスタンスへのデプロイ時に、RailsのDB Migrationと、Unicornの再起動の同期が全く取れていません。__ そのため、複数インスタンスを選択した状態で、DB Migrationを実行すると、Migration以外のノードはソース反映後すぐにUnicorn再起動がかかり、高確率で不完全な状態でデプロイされてしまいます。


## OpsWorks上でのMigration実行の仕組み

OpsWorks経由で「Migrate YES」を選択してデプロイを行うと rake の db:migrate が実行されます。
https://github.com/aws/opsworks-cookbooks/blob/2209f35fc0e3fd7a75af2e3d0715d425c6a55783/deploy/attributes/deploy.rb#L79

複数ノードがある状態で、「Migrate YES」を選択してデプロイを行う場合、グループ内で任意のノード1個が選択され(基本的にはグループで一番最初のもの)、そのノードに対して内部的にchefの変数に `default[:deploy][application][:migrate] = true` が設定入り、その後、全ノードに同時にcookbookが実行されます。

デプロイ中は、基本的に全てのインスタンスはそれぞれ勝手にChefが実行されるだけです。そのため、これが原因でマイグレーション同期されない問題がおきています。小さなDBマイグレーションであれば問題なかったりしますが、ちょっとでも時間がかかるようになるとアウトです。規模によりますが、Railsのデプロイを1回実行するのに少なくとも3〜4分くらいかかりますので、ダウンタイム発生となります


## 不完全な状態でのUnicorn再起動を回避する方法 by AWS

AWSサポート等にもヒアリングした所、以下2点の方針が一般的との回答。

1. Migration用のレイヤーを作っていただき、先にそちらでMigration込みで一旦ソースを反映して頂く
2. Chefのデプロイフックがあるので、それを利用して何かしら処理を入れてもらう

うーむ、自前でやらねば・・・・ということで素直に上記を対応します。
(1)に関してはただの運用フロー寄りの問題なので、一旦今回は詳細を割愛します。

## デプロイフック実装

OpsWorksはDocument Root配下に `deploy` ディレクトリ配下に `before_symlink.rb` (シンボリックリンク張替え直前) で以下のチェック入れます。

```ruby
Chef::Log.info("Running deploy/before_symlink.rb")
current_release = release_path
env = node[:deploy][:app_rails][:rails_env]

execute "rake aws:verify_migration" do
  cwd current_release
  command "bundle exec rake aws:verify_migration"
  environment new_resource.environment.merge({ "RAILS_ENV" => env })
end
```

Rakeタスクを適当に作ります。

```ruby
namespace :aws do
  task verify_migration: :environment do
    raise StandardError if 
  ActiveRecord::Migrator.needs_migration?
  end
end
```

これでとりあえず、不完全な状態でUnicornが再起動される問題だけ回避しました。before_symlinkの段階で、verify_migrationを実行し、マイグレーションが残っている状態の時は対象インスタンスの反映を途中中断させるようにします。「カラムの削除の時はどうするのか」みたいな懸念はありますが、一旦これだけでも入れておけば大きい所はカバーできそうです。


## 最後に

そもそもChefは諦めて、コンテナ運用(GKE + Spinnaker) に早く移行したほうがいいかもしれない
CentOSにgoogle chromeをインストール

CentOSをサブ機として使用していたが、Windows10より使用頻度が高いので、マルチメディア関係をガンガン入れてる。

そしてブラウザもメイン機で使っていたgoogle chromeをインストールしていたが、今回バージョンアップをキッカケに、centOSにgoogle chromeをインストールする方法を備忘録として投稿

まぁだいたいの人はしっていると思うが、、、

```ruby:以下の階層に移動！（しなくてもよい）
etc/yum.repo.d
```
そしたらviでもvimでもgeditでもいいので、google-chrome.repoと言うファイルを作成し以下を記入

```text:google-chrome.repoの中身
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```


```ruby:インストール
yum install google-chrome-stable
```

因みに、以下のコマンドでバージョン確認ができます

```ruby:インストール
yum info google-chrome-stable
```
以上