OmniAICreator/Qiita-1.07M huggingface dataset:
browserify で `TypeError: Path must be a string.` というエラーが出る


表題のエラーで 15分くらい悩んで色々と検索したけど適切な解決策がヒットしなかったので、しょーもない内容ですが書き残しておきます。

## 結論

* `browserify` の `transform` の指定に誤りがある
* `babelify` を使用してトランスパイルする場合は以下のように記述する

```json:package.json
{
  "browserify": {
    "transform": [
      [
        "babelify",
        {
          "presets": [
            "es2015",
            "es2016"
          ]
        }
      ]
    ]
  }
}
```


## 現象と原因

`browserify` で `require` を解決してファイル結合を試みたところ、以下のようなエラーが出ました。

```sh
~/Repository/my-project $ npm run build:browserify

> my-project@1.0.0 build:browserify /Users/kimurakazunori/Repository/my-project
> browserify "src/index.js" > "public/bundle.js" --debug

TypeError: Path must be a string.
    at resolve (/Users/kimurakazunori/Repository/my-project/node_modules/resolve/lib/async.js:15:19)
    at nr (/Users/kimurakazunori/Repository/my-project/node_modules/module-deps/index.js:282:24)
    at /Users/kimurakazunori/Repository/my-project/node_modules/resolve/lib/async.js:17:13
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
# 以下略
```

`Path must be a string.` ということなので `browserify` に渡した `src/index.js` や `public/bundle.js` が悪いのか？と思って色々調べたんですがそんなところが問題ではなく、`package.json` に追記していた `browserify` の `transform` の指定に誤りがあったことが原因でした。

`transform` の指定、本来は配列が2重になっていないといけないのに、一個抜けてただけでした。

---

設定ファイルが増えるのが嫌なので `package.json` に `browserify` の設定も書いてしまうんですが、`babelify` の `presets` を指定する際の object や array の書き方が直感的ではないので間違いやすいです。

面倒でも `babelify` の設定は `.babelrc` に、`transform` の指定は `-t` オプションでやってあげる方が記載自体がシンプルになり、間違いを回避出来る気がします。
Node-REDでシンプルなウェブサイトを作ってみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを使ってみました。

ここでは、Node-REDを使ってシンプルなウェブサイトを作ってみます。

# 0. Node-REDを用意します
- カタログからNode-REDボイラープレートを選択しアプリを一つ作成します。

# 1. シンプルなhtmlを送ってみる / 2. 色を付けてみる
- [Node-REDでシンプルなウェブサイト - 1. シンプルなhtmlを送ってみる / 2. 色を付けてみる](http://qiita.com/egplnt/items/b6896c95b1c6fdf86b5a)

# 3. 画面を複数のdivを分割してみます
- [Node-REDでシンプルなウェブサイト - 3. 画面を複数のdivに分ける](http://qiita.com/egplnt/items/a42bc6943f93df5a8a9c)
    - divを使ってウェブ画面を分割する方法を練習します

# 4. 文字列を送信してみます
- [Node-REDでシンプルなウェブサイト - 4. 文字列を送受信してみる](http://qiita.com/egplnt/items/3800d4a9ca15f59444b2)
    - ブラウザからウェブサイトへ文字列データを送信し、結果をブラウザに受信して表示する方法を練習します

# 5.データベースを使ってみる
- [Node-REDでシンプルなウェブサイト - 5. データベースを使ってみる](http://qiita.com/egplnt/items/7f686752649500f43479)
    - dashDBでデータベースを作成し、ブラウザからデータを登録したり表示したりできるようにします。


# 6.写真を貼ってみる
- [Node-REDでシンプルなウェブサイト - 6. 写真を貼ってみる](http://qiita.com/egplnt/items/19242eadac53dac1d6e5)
    - 無料サイトから写真を見繕ってウェブサイトに表示する方法を練習します

# 7.動画を貼ってみる
- [Node-REDでシンプルなウェブサイト - 7. 動画を貼ってみる](http://qiita.com/egplnt/items/61aadcfa663f4562ce85)
    - YouTubeから動画を見繕ってウェブサイトに表示する方法を練習します

# Tips
- [Node-REDでシンプルなウェブサイト - Tips](http://qiita.com/egplnt/items/2b872c7b29fdd4038501)
    - 経路の変更やスマホでのアクセス用のQRコード化などをご紹介します

# 無料のhtmlを使ってみる
- [Node-REDでシンプルなウェブサイト - 無料のhtmlを使ってみる①](http://qiita.com/egplnt/items/e2ae4b4911afbcdf0db9)
    - HTML5 Up Photonを使ってみます
- [Node-REDでシンプルなウェブサイト - 無料のhtmlを使ってみる②](http://qiita.com/egplnt/items/9de97f62a2cb60c59d4b)
    - HTML5 UP Tessellateを使ってみます
- [Node-REDでシンプルなウェブサイト - 無料のhtmlを使ってみる③](http://qiita.com/egplnt/items/19221e92caf8f67db35a)
    - HTML5 UP Storyを使ってみます
Node-REDで簡単なウェブサイトを作ってみる

初めてWatson IoT Platformを使ってみよう、というかたのためのガイドです。
[Watson IoT Platformを使ってみる](http://qiita.com/egplnt/items/af867711a7191923b2ff)でIoTアプリを準備しました。
Node-REDを使ってシンプルなウェブサイトを作ってみます。

# 1. Node-REDを用意する

# 2. シンプルなhtml出力
- []()を参照し、下記のフローをコピペします。


```
py:シンプルなフロー

[{"id":"95140036.80b9b","type":"http in","z":"75eef29b.360a7c","name":"","url":"/test10","method":"get","swaggerDoc":"","x":130,"y":100,"wires":[["22e702b3.031ca6"]]},{"id":"22e702b3.031ca6","type":"template","z":"75eef29b.360a7c","name":"hello","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n    <body>\n        Hello.\n    </body>\n</html>","x":330,"y":100,"wires":[["dca7bf27.e28b7"]]},{"id":"dca7bf27.e28b7","type":"http response","z":"75eef29b.360a7c","name":"","x":510,"y":100,"wires":[]},{"id":"aa7e19fb.5c109","type":"comment","z":"75eef29b.360a7c","name":"シンプルなhtml出力","info":"","x":150,"y":60,"wires":[]}]

```
- ブラウザで`アプリ名/test10`へアクセスし画面を確認します。
-
項目Aが入力されたら項目Bを必須にするフォーム

silex/symfonyで、項目Aが入力されていたら、項目Bに必須入力チェックをかける、みたいなFormの書き方。

もう少しスマートなやり方があるような気もする。

```php
    public function index(Application $app, Request $request)
    {
        $validator = $app['validator'];

        $builder = $app->form(null, [
            'csrf_protection' => false // 動作確認のためcsrf_protectionをはずす
        ]);

        $builder
            ->add('input-a', TextType::class)
            ->add('input-b', TextType::class)
            // POST_SUBMITでチェックを実行
            ->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) use ($validator) {
                $form = $event->getForm();
                $data = $event->getData();
                // input-aが入力されてたら
                if (!is_null($data['input-a'])) {
                    // input-bをNotBlankでチェック
                    $errors = $validator->validate($data['input-b'], [
                        new NotBlank()
                    ]);
                    foreach ($errors as $error) {
                        // input-bのフォームにエラーを追加
                        $form['input-b']->addError(new FormError($error->getMessage()));
                    }
                }
            });

        $form = $builder->getForm();
        $form->submit([
            'input-a' => '123', // input-aのみ入力
        ]);
        dump($form->isValid()); // false
        dump((string)$form->getErrors(true, true)); // 入力されていません
```
Mac (10.9〜10.12) で Python 3 (3.6, 3.5, 3.4) をインストール (Fink)

#1. XCode のインストール

`$ xcode-select --install`

XCode ライセンスを承諾する必要があります。これは、

`$ sudo xcodebuild -license`

と入力し、

`agree`

と入力します。

#2. Fink のインストール

[Install Fink](https://raw.githubusercontent.com/fink/scripts/master/srcinstaller/Install%20Fink.tool)

を開き、テキストとしてデスクトップに保存します。

その後、ターミナルを開き、以下のコマンドを入力します。

`$ cd Desktop` 書類フォルダに保存した場合は、 `$ cd Documents`

`$ chmod +x Install\ Fink.tool.txt`

`$ ./Install\ Fink.tool.txt`

いくつか質問されますが、だたいリターンキーを押すだけでも大丈夫です。

JDK と X11 のインストール方法が途中で示されます。「詳しい情報...」をクリックしてインストールしてください。その後、ターミナルに戻って、再び


`$ ./Install\ Fink.tool.txt`

とします。
	
#3. Python のインストール

ターミナルで、

`$ fink install python36` (3.6の場合)

`$ fink install python35` (3.5の場合)

`$ fink install python34` (3.4の場合)

と入力します。


python は、/sw/bin/python3.6 のようにインストールされます。

Fink でインストールできる Python 3 関連のパッケージです。
http://pdb.finkproject.org/pdb/browse.php?summary=python3
http://pdb.finkproject.org/pdb/browse.php?summary=py36&sec=libs%2Fpythonmods
Python3でサブプロセスを起動してサーバ的に使う

Pythonではsubprocessモジュールを使うとサブプロセスを起動できます。そのサブプロセスにデータを入力し、処理結果をもらいたい場合があります。それもサブプロセスを終わらせず、サーバー的に使いたい。

```python:client.py
#!/usr/bin/env python3
from subprocess import Popen, PIPE
import sys

p = Popen(['cat'], bufsize=0, stdin = PIPE, stdout = PIPE)
while True:
    s = sys.stdin.readline()
    p.stdin.write(s.encode('utf-8'))
    output = p.stdout.readline()
    print(output.decode('utf-8'), end='')
```

Popenの引数のbufsitze=0がキモです。また、起動されるサブプロセス（この場合はcat）の出力はバッッファリングしない（出力ごとにflushする）必要があります。ソースがなくて改造できないコマンドでも、出力をバッファリングしないオプションがある場合がありますので、確かめてください。
scikit-learn の fit() / transform() / fit_transform()

scikit-learn の変換系クラス(`StandardScaler`、`Normalizer`、`Binarizer`、`OneHotEncoder`、`PolynomialFeatures`、`Imputer` など) には、`fit()`、`transform()`、`fit_transform()`という関数がありますが、何を使ったらどうなるかわかりづらいので、まとめてみました。

### 関数でやること

#### fit()

渡されたデータの最大値、最小値、平均、標準偏差、傾き...などの統計を取得して、内部メモリに保存する。

#### transform()

`fit()`で取得した統計情報を使って、渡されたデータを実際に書き換える。

#### fit_transform()

`fit()`を実施した後に、同じデータに対して`transform()`を実施する。

### 使い分け

* トレーニングデータの場合は、それ自体の統計を基に正規化や欠損値処理を行っても問題ないので、`fit_transform()`を使って構わない。

* テストデータの場合は、比較的データ数が少なく、トレーニングデータの統計を使って正規化や欠損値処理を行うべきなので、トレーニングデータに対する`fit()`の結果で、`transform()`を行う必要がある。

### 参考
[StackOverflow - Difference between fit and fit_transform in scikit_learn models?](https://datascience.stackexchange.com/a/12346)
[scikit-learnマニュアル - 4.3.1. Standardization, or mean removal and variance scaling](http://scikit-learn.org/stable/modules/preprocessing.html)
プログラミングをしていて思ったこと

+ 記事を書いた経緯
+ 始めたばかりの人がよくやってしまうこと、引っかかること


#記事を書いた経緯
テスト投稿なので後から足していく予定です。
（Qiita画像の投稿に上限があるそうで、上限解放のためでもあります）

processingを勉強する際に最初にお世話になったサイトさん

http://www.d-improvement.jp/learning/processing/

このサイトさんにお世話になりました。
ここにある教材を最初から最後まで自分で書いてみるとなんとなく覚えることができるようになりました。
私はとりあえず簡単な（基礎の基礎のような）コードの意味は理解できるようになったかなあと思います。


#始めたばかりの人がよくやってしまうこと、引っかかること
追記）
流石に記事がこのままだとまずいので、私の周りでよく見た間違いなどを書いておきたいと思います。
大学でやらざるおえない人、何言ってるのかよく分からない！と言った方の参考になると嬉しいです。

+ プログラムは上から下に実行される
+ 変数とはなんだ
+ if文ってなんだ
+ for文ってなんだ




#プログラムは上から下に実行される
プログラムを読むのは人間ではありません。
機械です。
機械はああ、これはこういうことかな、なんていう柔軟な考えはしてくれません。
必ず上から下に読んで行きます。
この時、気になるのはプログラムの書き方です。
Docker UbuntuでOracleJava8

# 備忘録

```
FROM ubuntu:16.04

ENV  JAVA_HOME=/usr/lib/jvm/java-8-oracle \
     DEBIAN_FRONTEND=noninteractive


RUN apt-get update && \
    apt-get install -y software-properties-common wget && \
    add-apt-repository -y ppa:webupd8team/java && \
    apt-get upgrade -y && \
    apt-get update && \
    echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selections && \
    apt-get install -y oracle-java8-set-default && \
    apt-get clean
```
他に必要なパッケージがあれば、最終行"apt-get clean"の前に追加、と。
いつもechoの行を忘れる。
Swiftのオブジェクトグラフを生成する flock を使ってみました！

#最終的にこんな画像ができます
![flock.png](https://qiita-image-store.s3.amazonaws.com/0/70276/13ecadd3-91ff-8bdc-f94f-6389c43399f1.png)
※公式より引用

#環境 (一応)
flock 0.1.0
Xcode 8.3.2
Swift 3.1

#flock
- github
https://github.com/naoty/flock
- blog 
http://naoty.hatenablog.com/entry/2017/03/13/231736

> Swift で定義されたオブジェクト間の依存関係を可視化する flock というツールを作った。これによって、 Swift で書かれたコードベース全体を把握しやすくなったり、リファクタリング時に影響範囲を把握しやすくなる。

# 使ってみた

##インストール

Homebrew使用

```bash
brew tap naoty/misc
brew install flock
```
##　実行

[SampleDir]には自分のプロジェクトのディレクトリ名を設定

```bash
flock [SampleDir]
```

ただ、プロジェクトディレクトリを指定するとライブラリとかの依存関係図もできてしまうので、
自分の書いた部分だけしたい場合はもう1階層深いディレクトリを指定すると良いと思います。

## 結果

コマンドラインに下記の文字列が出力されます

```bash
digraph flock {
  "Edge" -> "Node";
  "HelpCommand" -> "Command";
  "MainCommand" -> "Command";
  "VersionCommand" -> "Command";
}
```

**flockがしてくれるのはここまでで、ここからは自分でdotファイルを作成して画像を作成する必要があります！**

## 出力結果から画像を作成する

dotファイルから画像を作成するために`Graphviz`を使用します
下記コマンドで`Graphviz`をインストールしてください　

```bash
brew install graphviz
```

下記のテキストをコピーして、flock.shを作成します
chmod で実行権限を与えてください

```bash:flock.sh
#!/bin/sh

flock $1 > $1.dot && dot -K dot -T png $1.dot -o $1.png && open $1.png
```

そして、引数にオブジェクトグラフを作成したいディレクトリ名を指定します。

```bash
./flock.sh [SampleDir]
```

そうすると、 [SampleDir].dot ファイルと [SampleDir].png ファイルができて、最終的にpngを表示してくれます。

# おまけ

実際に使うときは下記の方が使いやすいと思います

```bash
#!/bin/sh

DIR_NAME=SampleDir
flock $DIR_NAME > $DIR_NAME.dot && dot -K dot -T png $DIR_NAME.dot -o $DIR_NAME.png && open $DIR_NAME.png
```

#最後に

僕みたいな初心者はdotファイルとかGraphvizとか知らなかったので、ちょっと戸惑ったのでそういった方のためになればと思います。
CentOS7のバージョン,CPU,メモリーの利用状況を調べる


バージョン
cat /etc/redhat-release

カーネルバージョンやビルドされた時間
cat /proc/version

CPU
cat /proc/cpuinfo
（マルチコアの場合、それぞれのCPUの情報が）

メモリー
cat /proc/meminfo
CarrierWaveのthumbなどの別バージョンを再出力するのはrecreate_versions!メソッド



version :thumb等を追加したい場合は以下のような感じ

```ruby:app/uploaders/photo_image_uploader.rb
class PhotoImageUploader < CarrierWave::Uploader::Base
  (略)
  version :thumb do
    process convert: "jpg"
    process resize_to_fit: [190, 120]
    def full_filename(for_file)
      super(for_file).sub(/\.[^\.]+$/, '.jpg')
    end
  end
end

```

記載から省いてますが、pietなど使ってサムネイル用意する時にoptimizeも併せて実施しています。

追加した後に以下のコマンドで再出力

```bash
rails r 'Photo.all.order("id desc").each{|photo| photo.image.recreate_versions! if photo.image.present?}'
```
【AWS】ELB(CLB)

# はじめに
タダです。
AWS認定資格の試験勉強のためにELBの情報をまとめた自分用メモになります。
あくまで個人用のメモになるので、その点はご了承ください。
※違う内容書いているなどありましたらご指摘いただけると幸いです。
※本記事では、Classic Load Balancerの情報をまとめていきます。
※随時アップデートがあれば更新していきます。

# サービス概要
ELBは２つのタイプに分けられる

* Classic Load Balancer
	* アプリまたはネットワークレベルのいずれかの情報に基づいてルーティングする
	* 複数のEC2インスタンス間でシンプルなトラフィックのルーティングに適する
* Application Load Balancer
	* リクエストパスまたはホストベースでルーティングする
	* 複数のサービスにルーティングしたり、同じEC2インスタンスの複数のポート間で負荷分散するのに適する

## 特徴
* スケーラブル
	* ELB自体も負荷に応じてスケールアウト
* 可用性向上
	* 複数AZへの振り分け、インスタンスのヘルスチェック
* マネージドサービス
* ルーティング方式
	* 基本はラウンドロビン
* コネクションタイムアウト
	* クライアントからの無通信状態が続くと接続を自動で切断する(デフォルト60秒)
* ELB自体のスケーリング
	* じんわりとしたトラフィックの増加には対応できる
		* 逆に急激なトラフィックの増加にはスケーリング対応できないため、事前にPre-Warming(暖機運転)の申請をAWSに行う
* スティッキーセッション
	* 同じユーザーから来たリクエストをすべて同じEC2に送信
	* アプリケーションでのセッション情報、一時ファイルなどをEC2が保持する構成の場合に必要
	* HTTP/HTTPSでのみ利用可能
	* EC2の増減を柔軟に管理できるようセッション情報は別のDBやキャッシュサーバに保持させるのが好ましい
* Connection Draining
	* EC2インスタンスとELB間の登録解除、ヘルスチェック失敗した時にルーティングを中止して、処理中のリクエスト終わるまで一定期間まつ
* X-Forwarded-For
	* HTTPまたはHTTPSロードバランサーを使用する場合に、クライアントの IP アドレスを識別するのに役立つ
* Proxy Protocol
	* ELBはProxy Protocolバージョン１をサポートしている
	* Proxy Protocolヘッダーはバックエンド接続用にTCPを使う場合、クライアントのIPアドレスを識別するのに役立つ
	* 有効化する場合の前提条件は以下の通り
		* ELBの背後にプロキシサーバがいないこと
		* インスタンスでProxy Protocol情報を処理できるか確認する
		* リスナー設定でProxy Protocloがサポートされているかを確認する
* 他のサービスとの連携機能
	* AutoScaling
	* Route53
	* CloudFormation
	* OpsWorks
	* Elastic Beanstalk
	* CloudWatch
	* EC2
	* S3など

## サポートプロトコル
Classic Load Balancerのサポートプロトコルは、以下の通り

* HTTP
* HTTPS
* SSL(セキュアTCP)
* TCP


## ロードバランサーのタイプ
ロードバランサーのタイプとして、外向けロードバランサーと内向けロードバランサーがある

* 外向けロードバランサー : インターネットからアクセスできるELB
* 内向けロードバランサー : VPC内やオンプレ環境からのみアクセスできるELB

## モニタリング
ELBの監視を行う場合は以下の方法がある

* CloudWatchメトリクス
* ELBのアクセスログ
	* ELBへのリクエストの詳細情報をキャプチャしているので、確認する
* CloudTrailログ

## トラブルシューティング
よくELBのトラブルシューティングでHTTPステータスから設定不足を確認することがあるので、ドキュメントの情報をまとめる

* HTTP 400: BAD_REQUEST
	* 原因：クライアントが誤ったリクエストをしてしまったため発生
	* 解決策：直接インスタンスに接続し、クライアントリクエストの詳細をキャプチャする
* HTTP 405: METHOD_NOT_ALLOWED
	* 原因：リクエストヘッダー内のメソッドの長さが127文字を超える
	* 解決策：メソッドの長さを確認する
* HTTP 408: Request Timeout
	* 原因：指定されたコンテンツのサイズが実際に創始されたコンテンツサイズと一致しないや、クライアントとの接続が閉じているため発生
	* 解決策：リクエストを生成しているコードを調べ、リクエストをより詳細に調べることのできる登録済みインスタンスに直接送信する、レスポンスが送信される前にクライアントが接続を閉じないようにする
* HTTP 502: Bad Gateway
	* 原因：インスタンスからの応答の形式が適切でないか、ロードバランサーに問題がある
	* 解決策：インスタンスから送信された応答が HTTP 仕様に準拠していることを確認する
* HTTP 503: Service Unavailable
	* 原因：ロードバランサーにリクエストを処理する能力が不足または、登録されたインスタンス(正常なインスタンス)が存在しない
	* 解決方法：前者の場合は一時的な問題のため、一旦放置氏それでも解決しない場合はAmazon Web Servicesサポートへ問い合わせ
	* 後者の場合、正常なインスタンスを登録する
* HTTP 504: Gateway Timeout
	* 原因：アプリケーションの応答が、設定されているアイドルタイムアウトよりも長くかかっているまたは、録されたインスタンスがELBへの接続を終了させている
	* 解決策：前者は、ELB側のアイドル接続のタイムアウト設定を伸ばす
	* 後者の場合は、MWのKeepAlive設定を有効にしてELBのタイムアウト設定よりも大きい値を定義する


# 参考
* [サービス概要](https://aws.amazon.com/jp/elasticloadbalancing/)
* [よくある質問](https://aws.amazon.com/jp/elasticloadbalancing/classicloadbalancer/faqs/)
* [ドキュメント](http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/introduction.html)
* [SlideShare](https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2016-elastic-load-balancing)


# 更新日時
2017/05/01 初回投稿
(httpd)クエリ文字列を受け付けないようにする

httpdの設定メモ

例えば、
https://example.jp/
というサイトに対し
https://example.jp/?query=1
のようなGETパラメータを受け付けないようにするため、TOPページの
https://example.jp/
にリダイレクトするように設定する。

```
<VirtualHost *:443>
    ServerName example.jp
    DocumentRoot /var/www/dev-hoge
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{QUERY_STRING} .+
        RewriteRule ^ https://example.jp/? [R=301,L]
    </IfModule>
...
```

※Rewriteルールだけではクエリ文字列を判定しないので、RewriteCondでQUERY_STRINGを指定する。

※RewriteRuleのリダイレクト先の最後に?を追加しないとリダイレクトループが発生してしまう。
私用PCセットアップ時にインストールするツール

# そもそも・・・
　会社を辞めることもあれば、PCがお陀仏することもあるので、
その度にあれを入れてこれを入れて・・というのにももう疲れました:neutral_face:
　なので、リストにまとめて、ここを見るだけでPCの大体のセットアップができるようになればなぁ、という目論見:stuck_out_tongue_winking_eye::point_up:

**※あくまで私が利用するためのものであり、こちらを利用しDLを利用した際に起こった事象に関して責任は一切持ちません**


---

## ブラウザ系
+ [Opera](http://www.opera.com/ja)(メインブラウザ)
+ [FireFox](https://www.mozilla.org/ja/firefox/new/)(サブブラウザ)
+ [Chrome](https://www.google.co.jp/chrome/browser/desktop/)
+ [Safari](https://vessoft.jp/software/windows/download/safari)(Winサポ終わってるけども)


## 開発環境系
+ [Virtualbox](https://www.virtualbox.org/)(これがないと始まらない)
+ [Vagrant](https://www.vagrantup.com/)
+ [Putty](http://yebisuya.dip.jp/Software/PuTTY/)
+ [Poderosa](https://ja.poderosa-terminal.com/)(最近見た目が面白くなった)
+ [Git](https://git-scm.com/)
+ [SourceTree](https://ja.atlassian.com/software/sourcetree)
+ [TortoiseSVN](https://ja.osdn.net/projects/tortoisesvn/)
+ [HeidiSQL](https://www.heidisql.com/)
+ [Atom](https://atom.io/)
+ [VisualStudioCode](https://code.visualstudio.com/download) ← NEW!!! 最近はこれ！絶対これ！
+ [Sublime Text3](https://www.sublimetext.com/3)(Atomが時々インストールできないことがあるので..)
+ [WinSCP](http://forest.watch.impress.co.jp/library/software/winscp/)(エディタの自動アップロードは怖い人:fearful:)

### ISO系
+ CentOS minimal [7](https://www.centos.org/download/) / [6](http://isoredirect.centos.org/centos/6/isos/x86_64/)
+ [Ubuntu](https://www.ubuntulinux.jp/download) 16.4(自分ではめったに使わないのでLTSの最新なら実際何でも..）
+ [IE7用iso](https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/)(最近IE7対応必須のモノないけど)

## PCでそもそも使うツール
+ [teraPad](http://forest.watch.impress.co.jp/library/software/terapad/)
+ [GVim](https://www.kaoriya.net/)
+ [Gyazo](https://gyazo.com/download?lang=ja)(SNSに画像貼るのにいちいち保存しなくて済むのｲｲ!:laughing:)
+ [WinRAR](http://www.winrarjapan.com/)/[Lhaplus](http://forest.watch.impress.co.jp/library/software/lhaplus/)
+ [Skype](https://www.skype.com/ja/)(前仕事をしていた会社が乗り換えてくれなかった)
+ [Slack](https://slack.com/)(botが優秀すぎる)
+ [LINE](https://line.me/ja/)
+ [ThunderBird](https://www.mozilla.org/ja/thunderbird/)
+ カスペルスキー

---


他にも便利なものあったらどんどん知りたいお年頃です:heart_eyes::raised_hand_tone1:

※リンクは公式に限らず、DLのわかりやすいところを採用していたりします。
MAMP/php7/fuelphp1.8/PHPUnitでテストができる状況まで持っていくのが大変だった話

なんか色々大変だった…。
と言うか動かなかった…。

最初試したのは[php7.1.1/PHPUnit6.1]
composer.jsonにPHPUnit用のものを追加

```composer.json
    "require-dev": {
        …
        "phpunit/phpunit": "6.1.*" // これ現在の最新
    },
```

```
fueltest $ php composer.phar update
```

これで試したところ色々やっても下記エラーがずっと出る。

```
fueltest $ php oil t
Uncaught exception Oil\Exception: PHPUnit does not appear to be installed.

        Please visit http://phpunit.de and install.
Callstack:
#0 /Applications/MAMP/htdocs/fueltest/oil(68): Oil\Command::init(Array)
#1 {main}
```

なんでなんじゃーといろいろ試していたのだが、phpunitを古いバージョン(3.7)にしたら動いた。

```composer.json
    "require-dev": {
        …
        "phpunit/phpunit": "3.7.*"
    },
```

え…？
というわけで現在のPHPUnit最新バージョンから少しずつバージョンを落としてみるというか一個落としたら動いた。

```composer.json
    "require-dev": {
        …
        "phpunit/phpunit": "5.7.*"
    },
```

```
fueltest $ php composer.phar update
fueltest $ php oil t
Tests Running...This may take a few moments.
PHPUnit 6.1.2 by Sebastian Bergmann and contributors.



Time: 212 ms, Memory: 12.00MB

No tests executed!
```

なるほど最新バージョンに対応してないってことかということで、なんとか動くようにはなった。

これで一安心と思いきやさらに別の問題に遭遇する。

多分最終的にはこれ使わないのだけど、scaffoldを使って色々やってみたいなきゃぴと思ったので使ってみる。

```
fueltest $ oil g admin monkey name:string
Uncaught exception Fuel\Core\PhpErrorException: A non-numeric value encountered
```

…何だと……。
なんか色々調べるとここになんか書いてあった。
[FuelPHP Forums:oil scaffold / admin fatal error](https://fuelphp.com/forums/discussion/14013/oil-scaffold-admin-fatal-error)
これをもとにPHPのバージョンを7.1.1から少し落としてPHP7.0.15にして実行する。

動いた…。

ここまで半日くらいかかった…。
swift2 から swift3 へ移行したときに realm が使えなくなったときの解決法


#状況
今回xcodeのアップデートにともなってswift2がlegacyコードになったわけですが、
その際にpodで管理していたrealmが使えなくなってしまいました。
今回解決したので共有します。

#まずやること
公式ドキュメントを読むのって大事ですね
https://realm.io/jp/docs/swift/latest/

```
Xcode 8を利用している場合、下記のコードをPodfileに追加してください。Swiftバージョンは自分の環境に合わせて適切に変更してください。

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

今回swift2系からの移行になるので当然この設定がされていませんでした。

状況次第ではこれで解決するかもしれません。

#そのあと出たエラーと解決法
##no such module realmswift
まずビルドスキームを追加します。
自分プロジェクトのスキーム→Manage Schemesを押すとRealm とRealmSwiftがあるので、
それをチェックします。

そのあと、RealmSwiftのスキームで一度ビルドしました。


##Module compiled with swift 3.0.2 cannot be imported in swift 2.x
以前realmのコードをアップデートする前に
レガシーなコードがrealmプロジェクトに使われている旨のエラーが出たため

`Use Legacy Swift Language Version`

をyesにしていました。今回realmが解決できればswift3対応は済んでいたので、
これをnoに変更して消えました。

以上です。
GitHub事始め(Windows)

Gitをインストール

Markdown: [Git for Windows](https://git-for-windows.github.io/)

Gitリポジトリ(?)を作成(対象のフォルダ内で)

```
.>git init
```

ファイルをローカルリポジトリに追加

```
git add xxxx.js
```

変更内容をローカルにコミットする(-mとは?)

```
git commit -m "XXXXXXXXX"
```

gitのステータスを確認

```
git status
```

リモートリポジトリの情報の追加→なおエラー（プロキシ等設定の必要がありそう）


~~git remote add origin https:github.com/User/XXXXXX.git~~

```
git remote add origin https://github.com/User/XXXXXX.git
```

~~というところで中断~~
間違えていたので

```
git remote rm origin
```

で消去してあげ直し
実際にGitに登録できたことを確認
MySQLの勉強記録

MySQLについて勉強した記事をまとめる予定。


## トランザクション分離レベルの勉強記録

検証記事が多いので全体的に記事が長い。

* [(1) 4つのレベルを実験する](http://qiita.com/noonworks/items/bb232cc13d5c2da55f29)
  - SQL標準に定義されている4つのレベルについて
  - それぞれで起こる問題を実際に起こして実験
* [(2) MySQLのinnodb_lock_monitor（検証）](http://qiita.com/noonworks/items/3c813e3f8c8089644246)
  - 長いので読まなくていいです
  - 実際にMySQLがどのように分離レベルを実現しているか検証する方法を調べる
  - `innodb_lock_monitor`を読む……ためにMySQLのソースコードを読んでいる……
* [(3) innodb_lock_monitorのTRANSACTIONS部分の読み方](http://qiita.com/noonworks/items/dbb0e0c2f38637763549)
  - (2)で調べたことを手短にまとめた
* （このシリーズではないが、ここで[InnoDBのロックに関する用語の確認](http://qiita.com/noonworks/items/e7c17c91caab1bbb7593)を書いて用語を整理した）
* [(4) 検証手順と予測](http://qiita.com/noonworks/items/8f8fe3365e7c6f05bb25)
  - 検証の手順と予測と結果等へのまとめリンク
  - 長くなるので(5)以降の記事に分かれている
* [(5) 書き込みの検証手順と詳細な予測](http://qiita.com/noonworks/items/f22bf1f1f7a9a677f434)
  - 書き込み操作の検証手順と予測
* [(6) INSERTの結果](http://qiita.com/noonworks/items/3733d76405892b598323)
  - 書き込み操作のうち、`INSERT`の結果



## その他

* [InnoDBのロックに関する用語の確認](http://qiita.com/noonworks/items/e7c17c91caab1bbb7593)
  - 記事をいくつか書いているうちに、頭の中で用語が混乱してきたので統一するために整理した
* [SELECT ... LOCK IN SHARE MODEとSELECT ... FOR UPDATEの違い](http://qiita.com/noonworks/items/ca6fe37d9156b8200d9a)
  - [ドキュメント](https://dev.mysql.com/doc/refman/5.6/ja/innodb-locking-reads.html)にもあるけれど`innodb_lock_monitor`で確認した
* [MySQLでの「複合キーが使われる／使われない」について](http://qiita.com/noonworks/items/2c273590d679264cc8e1)
  - 複合キーのカラムの順番と検索条件について調べた記事
異なるドメインに仮想マシンを移行する方法（スナップショットの移行）


#はじめに
Oracle Compute Cloud Service上の仮想マシン（インスタンス）のボリューム・スナップショットを取得すると、取得したスナップショットのファイル群はObject Storageのコンテナに格納されます。
このObject Storageに取得されたスナップショット・ファイルを利用し、仮想マシンにアタッチしていたストレージボリュームを他のドメインの仮想マシンに移行できないか試してみました。

尚、以下の手順は公式資料に明記されているものではありません。


# 手順

##スナップショットの作成
最初のステップは、ストレージ・ボリュームのスナップショットの作成です。

Compute Cloud Service Consoleに移動し、Storageタブを選択、スナップショットを取得したいボリュームの右にあるメニューから、スナップショットの作成をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/148299/5d357978-6438-ebf4-c7e0-df50fb89cf93.png)


スナップショット名を入力し作成をクリックします。

![image](https://qiita-image-store.s3.amazonaws.com/0/148299/a9372455-05ee-b94e-7777-65e737de5d3a.png)


###作成完了の確認

画面左のストレージ・スナップショットのメニューを選択すると、取得済みのスナップショットを確認できます。

先ほど取得したスナップショットの三本線マークにポインタをあわせるとステータスが確認できるので、スナップショットの取得が完了していることを確認します。

![image](https://qiita-image-store.s3.amazonaws.com/0/148299/ce038e8f-1f62-7499-22d1-79e686ec5a45.png)


### Snapshot IDの取得

REST APIを利用し、Snapshot IDを取得します。

Compute Cloud Serviceにアクセスするためのトークンを取得します。

`curl -s -i -X POST -H 'Content-Type: application/oracle-compute-v3+json' -d '{"user":"/Compute-${IDENTITY-DOMAIN}/${USER}","password":"${PASSWORD}"}'  https://api-${z}.compute.${dc}.oraclecloud.com/authenticate/`


取得したトークンを変数COMPUTE_COOKIEに利用し、Snapshot IDを確認します。

`curl -s -X GET -H 'Cookie: $COMPUTE_COOKIE' -H 'Accept: application/oracle-compute-v3+json'    https://api-${z}.compute.${dc}.oraclecloud.com/storage/snapshot/Compute-${IDENTITY-DOMAIN}/${USER}/ | python -m json.tool `

出力サンプル
`"snapshot_id": "410891b4783cf2abee815ff3453aa22b0c1fa680f6600f9a96e8ad8f22363673-us2",`


##移行

###移行元からダウンロード

Storage Cloud Service に接続し、上記で得られたSnapshotIDを持つファイルをダウンロードします。
以下はCloudBerry Explorerを利用した際の画面イメージです。3つの各コンテナから該当ファイルをダウンロードします。

以下はCloudBerry Explorerを利用しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/148299/7bdc05d6-43df-4e49-bda9-06c792491bf3.png)


###移行先へアップロード

移行先となる異なるアイデンティティ・ドメインのStorage Cloud Serviceに接続し、各スナップショットファイルをアップロードします。
このとき、各コンテナ名、フォルダ構造は元のStorage Cloud Serviceと同一になるようにしてください。

## 移行先でのリストア

移行先のStorage Cloud Serviceにアップロードしたスナップショットから、移行先のCompute Cloud Service上にストレージボリュームをリストアします。

### JSONファイルの準備

`restorestoragesnapshot.json
{
"size":"1G",
"properties":["/oracle/public/storage/default"],
"name":"/Compute-gse00011371/cloud.admin/tn-restored_volume01",
"bootable":false,
"snapshot_id":"410891b4783cf2abee815ff3453aa22b0c1fa680f6600f9a96e8ad8f22363673-us2"
}`

### リストア実施

`$ curl -i -X POST  -H 'Cookie: $COMPUTE_COOKIE' -H "Content-Type: application/oracle-compute-v3+json" -H "Accept:application/oracle-compute-v3+json" -d "@restorestoragesnapshot.json" https://api-${z}.compute.${dc}.oraclecloud.com/storage/volume/
`


### リストア確認

リストアが完了するとストレージ・ボリュームにリストアしたボリュームが表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/148299/4d514ef8-5eb8-f10b-c754-a755843fc51d.png)


# 最後に

以上の手順を踏むと、異なるアイデンティティ・ドメインにボリュームを移行、コピーすることができます。

尚、同手順でObject Storageに保存されたスナップショットをバックアップとして、ローカルのNASなどに保存しておくことができます。（スナップショットIDは変えられないので、リストアするときはIDが重複しないことが前提）
Storage Cloud Serviceの製品機能として、他のDCに非同期でレプリケーションされているため、ローカルにあえて保存しておく必要性は低いものの、3次バックアップを保存しておきたいと言った場合に利用できるかと思います。
Railstutorial 4版　覚書 第１章

卒業した大学院の授業で、安川さんがRailstutorialを使って授業しているらしい。
第４版はやっていないので、やってみる。同じPBLの人もやっているらいいし。

mac 10.10.5
Ruby 2.3.4
Rails 5.0.0.1

###第１章
学校ではAWSでRails4を使っていたので、自分のmacのRuby、railsのバージョンをあげる

- rbenvに欲しいRubyのバージョンがない

```
brew upgrade ruby-build
```



- Herokuにデプロイできない

```
###### WARNING:
       You have not declared a Ruby version in your Gemfile.
       To set your Ruby version add this line to your Gemfile:
       ruby '2.3.4'
       # See https://devcenter.heroku.com/articles/ruby-versions for more information.
```
というアラートがでた。
GemFileに
```
ruby '2.3.4'
```
を追記したらうまくいった。
https://rails5-tutorial-hello-ichi.herokuapp.com


**参考にしたサイト**
[Ruby 2.3.0がrbenvに表示されない時にやったこと](http://qiita.com/akito19/items/f2900f53e26dcc22faac)
HTTPキャッシュ、したくない？

# tl;dr
ラズパイでhttpキャッシュ鯖立てました。ソフトはsquid使いました。別にラズパイじゃなくてもPOSIX系マシン(LinuxとかUnixとかOSXとか)ならできそうだけどたまたま足元にラズパイが落ちてたので。

ん？記事の構成が使い回しだって？
気のせい気のせい。

# インストール

```shell-session:shell
$ sudo apt install squid
```

以上。自前ビルドしなくていいご時世はいいね。

# 設定
ぼくの場合```/etc/squid/squid.conf```が設定ファイルだった。
ってかDebian系のディストリはだいたい```/etc/パッケージ名```の中に色々あるよね。
ところどころに説明があるのだが、何しろ設定ファイルの量が多すぎてとてもじゃないけど設定する気になれない。なので情強のぼくはggることにした。
最終的にコメント行を除くとこんな感じになった。
```:squid.conf
acl localnet src 192.168.0.0/16
acl PURGE        method PURGE

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow PURGE localhost
http_access allow localhost
http_access allow localnet
http_access deny all

http_port 3128
coredump_dir /var/spool/squid

forwarded_for off
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
#request_header_access Cache-Control deny all
visible_hostname unknown

fqdncache_size 4096
ipcache_size 4096
ipcache_low 90
ipcache_high 95

cache_mem 4096 MB
maximum_object_size 128 MB
cache_swap_low 90
cache_swap_high 95
maximum_object_size_in_memory 128 MB
memory_pools on

cache_dir ufs /var/spool/squid 102400 32 256

refresh_pattern -i .(gif|png|jpg|jpeg|ico|webp|webm|avi|wav|mp3|mp4|mpeg|swf|flv|x-flv|js|css|shtml)$ 525600    100%    525600 override-expire override-lastmod ignore-reload ignore-reload ignore-no-cache  ignore-private
refresh_pattern .       525600  100%    525600

shutdown_lifetime 1 seconds
cachemgr_passwd taishi offline_toggle
dns_nameservers 8.8.8.8
dns_v4_first on
dns_timeout 5 seconds

pipeline_prefetch on
icp_port 0
client_db off
```

# 起動

```
sudo systemctl start squid
```

あとサービスの自動起動もさせとく

```
sudo systemctl enable squid
```
# テスト

```shell-session:shell
$ netcat localhost 3128
GET http://google.com/ HTTP/1.1

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Referrer-Policy: no-referrer
Location: http://www.google.co.jp/?gfe_rd=cr&ei=oJgGWfzDDMPd8AfX5ZToBQ
Content-Length: 261
Date: Mon, 01 May 2017 02:08:32 GMT
X-Cache: MISS from unknown
X-Cache-Lookup: MISS from unknown:3128
Via: 1.1 unknown (squid/3.5.23)
Connection: keep-alive

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&amp;ei=oJgGWfzDDMPd8AfX5ZToBQ">here</A>.
</BODY></HTML>
```
うん、動いてるね。
ちなみに、netcatでTCPを平文で喋ってるのは僕の趣味です。

それでは。
AWS LambdaでDynamoDBから取得した値の最新レコードを取得する

DynamoDBに値が入っている前提で、

- とある時間の
- あるIDにおける
- 集計値

を取ろうする際の実装。（AWS Lambda Python 2.7を使っています）

# 前提
以下の前提とします。

1. DynamoDBのハッシュキーにID（文字列）、レンジキーに時刻（文字列）を指定
2. データは時系列に格納されているものとする。
3. 指定したカラムの集計を取るようにする。
4. とりあえず指定したIDで全件取得（時間による絞り込みはしない）

こんな感じのデータを想定。

|id|score|timestamp|
|---:|---:|---|
|sensor1|0|2017-04-30T22:00:00.000|
|sensor1|0|2017-04-30T22:00:01.000|
|sensor1|1|2017-04-30T22:00:02.000|
|sensor1|0|2017-04-30T22:00:03.000|
|sensor2|1|2017-04-30T22:00:04.000|

このうちsensor1の最新値を取るための実装をしてみます。結果としてscore:0が取得できるロジックを期待します。

# 実装
実行環境にはSERVERLESS FRAMEWORKを利用しました。こんな感じの実装でできました。

```py
import boto3
import json
import decimal
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource('dynamodb')
table    = dynamodb.Table('test')

def run(event, context):

    res = table.query(
            KeyConditionExpression=Key('id').eq("sensor1")
        )

    return_response = max(res["Items"], key=(lambda x:x["timestamp"]))

    return json.dumps(return_response, default=decimal_default)

def decimal_default(obj):
    if isinstance(obj, decimal.Decimal):
        return float(obj)
    raise TypeError
```

まずは最新値を求めるというところで手抜き感満載の実装ですが、Aggregate部分を別クラスにしてしまって少しインテリジェンスに選択できるようにすれば、一気に用途が広がる気がします。

実行結果は以下の通りです。無事取得できてますね。

```
$ sls invoke local -f run
"{\"timestamp\": \"2017-04-30T22:03:00.000\", \"score\": 0.0, \"id\": \"sensor1\"}"
```
amp対応も踏まえて開発環境を見直してみた結果

#前提条件
amp対応も必須の状況で気になっているwebpackを調査してみた

#webpackについての個人的な感想
少し前から話題になっているコンポーネント思考がよさそう。
特に拡張性、メンテナンス性、共同作業などを考えた際に
長期的に見た場合違いが出てきそう。

ただし学習コストは若干高めと感じた。
日本語情報の少なさ（本などの整理された情報が少ない）
機能の多さなどが理由だが、これはしばらくすると解消されそうな気もします。

#今回の結論としては
しばらく既存のgulpをメインに少しずつ環境を移行。
理由としてはamp対応の案件があり
ヘッダのamp用スタイルシート埋め込みをやろうとしたが
webpackから吐き出される長いjsを読み込まなければいけないため。
（これ読み込まないとwebpackでcss埋め込みできませんよね？）

ここに関してはgulpを使い、他でwebpackという事も視野に入れつつ考えてみる。

#みなさんどうされていますか？
コメント、つっこみいただけましたらうれしいです。
LinuxでVLANを触ってみる

LinuxでVLANの処理をする必要があり、ちょうど良いので方法や仕組みをまとめました。

# VLANって？

https://ja.wikipedia.org/wiki/Virtual_Local_Area_Network

VLANとは、L2でパケットにタグというものをつけて、複数のL2を分割して考えることができます。
本当に単純に、L2パケットにVLANタグを付けているのみです。ちなみにVLANは整数の番号を割り当てることができます。
これの何が嬉しいかと言うと、L3でセグメントをわけなくてもLAN内でL2を擬似的に分割することができちゃったりします。
他にもスイッチの特定のポートとVLANを結びつければVLANを使ってルーティングの設定ができます。

# 原理
基本的に、マシンの物理NICをトランク（すべてのVLANが通れる、というかVLANを気にしない）として、さらに物理NICを通ったあとにVLANがついてるパケットだけをそのVLAN用に作成した仮想NICへとばしてくれます。

# 環境
Ubuntu Server 16.04 LTS

# インストール

```shell-session:shell
$ sudo apt install vlan
```
# 作成

```shell-session:shell
$ sudo vconfig add eno1 10 # eno1を通ったときに10番のVLANパケットがあったときに、eno1.10という仮想NICにそのパケットを飛ばすようにする
$ sudo vconfig rem eno1 10 # eno1.10を削除する
```

めちゃくちゃ簡単ですね。これで生成した仮想NIC（物理NIC名.VLAN番号）を仮想ブリッジに追加したりなんかすれば、ホストとL3スイッチを接続して仮想マシンにしかアクセスできないポートなんかをL2だけで実現することができます。

セキュリティ的にネットワークを分けたいけどルーターのポートは１つしか用意できない！なんてときに使うと幸せになれると思います。

それでは。
Node.jsのインストール(AWS)

インストール前にnvmのバージョン一覧取得

```
nvm ls-remote
```

取得したバージョンからインストール

```
nvm install vX.X.X
```

インストールされたNode.jsのバージョン確認

```
node -v
```

HTTPサーバーのインストール（-g グローバル領域にインストール）

```
npm install -g http-server
```


関係ないけど隠しファイルの確認

```
ls -la
```
Go言語 | goroutine 非同期処理の基本

# 内容

ループの中で、ループ回数を出力する単純なプログラムを作ってみる。

# go func を書く

```go
for i := 1; i < 100; i++ {
    go func() {
        fmt.Println(i)
    }()
}
```

## 結果

出力される行数を数えると、100個に満たない。
非同期処理が終わる前にプログラムが終わってしまっている。

```
$ go run script.go | wc -l
      93
```


# 非同期処理が終わるまで待つ


```diff
for i := 1; i <= 100; i++ {
	go func() {
		fmt.Println(i)
	}()
}

+ time.Sleep(10000000)
```

## 結果

ちゃんと１００行出力されるようになった。

```
$ go run script.go with_sleep | wc -l
     100
```

だが中身を見てみると、重複する値がいくつも出力されている。

```
$ go run script.go
7
30
13
37
14
45
45
46
46
46
46
..
```

# function に引数を渡す

```diff
for i := 1; i <= 100; i++ {
-	go func(i int) {
+	go func() {
		fmt.Println(i)
-	}(i)
+	}()
}

time.Sleep(10000000)
```

##  結果

これで重複する値が排除された。

```
$ go run goroutine/basis/main.go
3
1
2
19
11
12
13
..
```

# Sleep から Wait へ

sync パッケージを使うことで、Sleepで秒数を明示したりしなくても、非同期処理が終わるまで待ってくれるようになる。

```diff
+ var wg sync.WaitGroup

for i := 1; i <= 100; i++ {
+ 	wg.Add(1)  // Wait用のカウンタをインクリメント
	go func(i int) {
+ 		defer wg.Done()  // Wait用のカウンタをデクリメント
		fmt.Println(i)
	}(i)
}

+ wg.Wait()
```

## 結果

ひとつ前と同じ。

# 検証コード

```go
package main

import (
	"fmt"
	"os"
	"sync"
	"time"
)

func main() {
	if os.Args[1] == "without_sleep" {
		without_sleep()
	} else if os.Args[1] == "with_sleep" {
		with_sleep()
	} else if os.Args[1] == "with_argument" {
		with_argument()
	} else if os.Args[1] == "with_wait" {
		with_wait()
	}
}

func without_sleep() {

	for i := 1; i < 101; i++ {
		go func() {
			fmt.Println(i)
		}()
	}

}

func with_sleep() {

	for i := 1; i < 101; i++ {
		go func() {
			fmt.Println(i)
		}()
	}

	time.Sleep(10000000)
}

func with_argument() {

	for i := 1; i < 101; i++ {
		go func(i int) {
			fmt.Println(i)
		}(i)
	}

	time.Sleep(10000000)
}

func with_wait() {
	var wg sync.WaitGroup

	for i := 1; i < 101; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			fmt.Println(i)
		}(i)
	}

	wg.Wait()
}
```

# 環境

- go version go1.8.1 darwin/amd64

# 参考

- [sync - The Go Programming Language](https://golang.org/pkg/sync/)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Excel 2013 > tips > 特定の列だけを下にずらす

```txt:動作環境
Excel 2013 on Windows 8.1 pro(64bit)
```

## やりたいこと

- 列C,D,Eだけ下にずらす
  - 他の列はずらさない
- 値だけずらしたい

## 方法

１つのセルずつ値のコピーをしていたが効率が悪い。
複数をずらす方法を試そうとしたが

> コピー領域と貼り付け領域のサイズが違うため、張り付けることができません。

と怒られた。領域サイズを合わせたら、以下のように怒られたりした。

> この操作を行うには、すべての結合セルを同じサイズにする必要があります。

以下の方法を見つけた。

1. 列一つの領域を選択
  - 例: 列Cの6行目から10行目
2. Ctrl + c
3. 下にカーソルを移動
   - １つのセルが選択された状態になる
4. Ctrl + Alt + v
   - v (値)
   - Enter
5. これを必要な列分繰り返す

列数が少ないなら、これでいい。
EsLintをNodeJSに導入してコミット時に構文チェックをする


# 1.NPMインストール
## 1.1 huskey
   コミット時に何かをトリガーする

```
 npm uninstall ghooks --save-dev && npm install husky --save-dev
```

## 1.2 eslint
   構文チェック

```
 npm install -g eslint --save-dev
 eslint init
	>? How would you like to configure ESLint? Inspect your JavaScript file(s)
	>? Which file(s), path(s), or glob(s) should be examined? ./src/assets/js/
	>? What format do you want your config file to be in? JavaScript
	>? Are you using ECMAScript 6 features? No
	>? Where will your code run? Browser
	>? Do you use CommonJS? Yes
	>? Do you use JSX? No
```

# 2.package.jsonでスクリプトの呼び出し設定
```
  "scripts": {
    "precommit": "npm run test.sh -q || eslint ./src/assets/js/"
  }
```
# 3.確認
```
eslint ./src/assets/js/
npm run precommit
npm run eslint
```

# 4. gitコミット時にエラーを確認
```
git commit
>......
>✖ 1733 problems (1733 errors, 0 warnings)
>
>
> husky - pre-commit hook failed (add --no-verify to bypass)
> husky - to debug, use 'npm run precommit'
```

# 5.rails + yarn + VueJS版
https://eslint.org/docs/user-guide/configuring

```
yarn add eslint
yarn add eslint-config-vue
yarn add ghooks
yarn add husky
```
```
 "scripts": {
    "precommit": "npm run test.sh -q || eslint ./src/assets/js/"
  }
```

```
yarn run precommit
```

package.jsonに記載したprecommitが動いている事を確認
「ノンデザイナーズ・デザインブック [第4版]」3行まとめ

# 読んだ本
[ノンデザイナーズ・デザインブック [第4版]](https://www.amazon.co.jp/%E3%83%8E%E3%83%B3%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%82%BA%E3%83%BB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC4%E7%89%88-Robin-Williams/dp/4839955557)

## 3行まとめ
- ４つの基本原則：近接・整列・反復・コントラスト
- 色の使い方：補色/トライアド/スプリット・コンプリメント・トライアド/類似色/シェードとチント
- フォントの使い方：サイズ/太さ/構造/フォーム/方向/色
AWSへのSSH接続で困ったこと(Connection timed out)

##トラブル
AWSへのSSH接続がうまくできなくて困ったので、自分が迷ったときのための解決法をまとめます。


```
 .>ssh -i "$$$$.pem" ec2-user@ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
```

とOpenSSH及びPUTTYで入力したところ以下のようなエラーが出ました

```
ssh: connect to host ec2-xx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com port 22: Connection timed out
```

##原因
結果的には原因が2つ

#### 1. そもそも社用PCを用いたためファイアウォールに弾かれた

#### 2. AWSのEC2のインスタンスのセキュリティグループのホワイトリストに自分のPCのIPアドレスを登録していなかった（よく忘れるというか出先ごとにEC2のマネージメントページから登録するの面倒）

##解決策
#### 1. 社外ネットワークから個人PCで接続

#### 2. 毎回ホワイトリストに登録する←すごく面倒なので良い手段を考え中

##おまけ
ファイルのアクセス権限周りでエラーが出た場合
```
.>chmod 400 $$$$.pem
```
Open V Switchを触ってみる

どうも。かちおです。最近諸事情でOpenVSwitchを使うことが会ったので備忘録がてら使い方を書きました。

# Open V Switch（おーぷんぶいすいっち）って？
Open V Switchを理解するためには、Open Flowを理解する必要があります。

https://ja.wikipedia.org/wiki/OpenFlow

従来のネットワークスイッチは、自身でルーティングを決定し、実際のパケットを電気的に処理していました。それに対してOpenFlowは、「ルーティングの決定」と「実際のパケットのコントロール」を別々に分けるものです。
※正確には分けたときにお互いが通信しあうためのプロトコル

たとえば、従来のVLANの設定やACL、ルーティングテーブルを、物理的なネットワークスイッチとは別のマシンで処理することができます。
これの何が嬉しいかと言うと、「パケットの処理を決めるのは別のマシン、そしてその処理を実際に行うのはネットワークスイッチ」とすることで、いわゆるスイッチのコンソールから設定する以上の高性能・高機能なルーティングをサーバーなどで実装し、ネットワークスイッチと連携させることができます。それにより従来のL2・L3の区別のない高機能なネットワークスイッチを自作することができます。
（ちなみに、同じ設定のルーターを大量に設定するときとかにも強い

そして今回使用するOpen V Switchは、そのOpenFlowに対応した仮想ブリッジ（スイッチ）となっています。それにより、これを使うことで「超高機能」な仮想ブリッジをサーバー内部に作成することができます。


# 今回やること
実際に高機能を試してみるのは気が引けるのと手間暇的なアレとそもそも自分がOpen V Switchを触り始めてばかりなところがあるので、超初級として今回はOpen V Switchを使って仮想L2スイッチを作ってみます。L2ってなんぞや？って方は、高機能なスイッチハブとでも思っていてください。

# 環境
Ubuntu Server 16.04 LTS + Open V Switch

# インストール

```shell-session:shell
$ sudo apt install openvswitch-switch openvswitch-common
```

# ブリッジの作成

```shell-session:shell
$ ovs-vsctl add-br test01 # test01というブリッジを作成
$ ovs-vsctl add-port test01 eno1 # test01にeno1を接続する
$ ovs-vsctl del-port test01 eno1 # test01からeno1を抜く
$ ovs-vsctl del-br test01 # test01というブリッジを削除
```

# これってもしかして…？
そうです。Linuxの標準仮想ブリッジと使い勝手は同じなのです。高度なことをしなければ手間はかからず、さらにここから複雑な機能をもたせることもできます。
自分も勉強中ですがbrctlを同じように使えるところが気に入ったので、仮想ブリッジを作成するときに積極的に使うようにしています。
今回はL2を作っただけですが、ぜひご自分で拡張していってみてください。この記事がOpen V Switchを知るきっかけになってくれれば嬉しいです。

それでは。
gopher-lua でサーバーの設定を動的に変更する

[gopher-lua](https://github.com/yuin/gopher-lua) は Go で書かれた Lua 処理系です。
net/http で書かれたサーバーの設定を Lua で記述し、それを動的に変更してみます。

### 基本的な使い方
lua で設定ファイルを記述する場合は gopher-lua の作者が作成した [gluamapper](https://github.com/yuin/gluamapper)を使用すると簡単にできます。

```go
package main

import (
	"fmt"

	"github.com/yuin/gluamapper"
	"github.com/yuin/gopher-lua"
)

type dbConfig struct {
	URL  string
	Port int
}

type Config struct {
	Name string
	Age  int
	DB   dbConfig
}

var configLua = `
config = {
  name = "hoge",
  age  = "31",
  db = {
    url = "localhost",
    port = "3306"
  }
}
`

func main() {
	L := lua.NewState()
	if err := L.DoString(configLua); err != nil {
		panic(err)
	}

	var config Config
	if err := gluamapper.Map(L.GetGlobal("config").(*lua.LTable), &config); err != nil {
		panic(err)
	}

	fmt.Printf("%s\n%d\n%#v", config.Name, config.Age, config.DB)
}
```

実行結果

```
$ go run example.go 
hello
hoge
31
main.dbConfig{URL:"localhost", Port:3306}%    
```

### 設定を動的に変更する
サーバーに設定ファイルを受け取るURLを作成して、設定ファイルの内容を変えてみます。

```go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"

	"github.com/yuin/gopher-lua"
	"github.com/yuin/gluamapper"
)

type dbConfig struct {
	URL  string
	Port int
}

type Config struct {
	Name string
	Age  int
	DB   dbConfig
}

var initialConfig = `
config = {
  name = "hoge",
  age  = "31",
  db = {
    url = "localhost",
    port = "3306"
  }
}
`

var (
	L = lua.NewState()
	config = Config{}
)

func DumpLuaConfig(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Name=%s\nAge=%d\nDB=%#v\n", config.Name, config.Age, config.DB)
}

func UpdateLuaConfig(w http.ResponseWriter, r *http.Request) {
	luaScript, err := ioutil.ReadAll(r.Body)
	defer r.Body.Close()
	if err != nil {
		w.WriteHeader(http.StatusBadRequest)
		fmt.Fprintf(w, "%v", err)
		return
	}

	if err := L.DoString(string(luaScript)); err != nil {
		w.WriteHeader(http.StatusBadRequest)
		fmt.Fprintf(w, "%v", err)
		return
	}

	if err := gluamapper.Map(L.GetGlobal("config").(*lua.LTable), &config); err != nil {
		w.WriteHeader(http.StatusBadRequest)
		fmt.Fprintf(w, "%v", err)
		return
	}
	fmt.Fprint(w, "ok")
}

func main() {
	if err := L.DoString(initialConfig); err != nil {
		panic(err)
	}

	if err := gluamapper.Map(L.GetGlobal("config").(*lua.LTable), &config); err != nil {
		panic(err)
	}

	http.HandleFunc("/config/dump", DumpLuaConfig)
	http.HandleFunc("/config/update", UpdateLuaConfig)

	http.ListenAndServe(":8080", nil)
}
```

実行結果

- 初期設定

```
$ curl localhost:8080/config/dump
Name=hoge
Age=31
DB=main.dbConfig{URL:"localhost", Port:3306}
```

- 設定を変更する

```
$ curl -X POST 'localhost:8080/config/update' -d 'config =
{
  name = "test",
  age = "123123",
    db = {
      url = "localhoooooost",
      port  = "12345"
    }
}'
ok
```

- 設定を確認する

```
$ curl localhost:8080/config/dump                
Name=test
Age=123123
DB=main.dbConfig{URL:"localhoooooost", Port:12345}
```

サーバーを再起動せず設定ファイルを変更できました。

### その他
同様の手法を使えば、恐らく hcl や toml でも可能だと思います。
Go Binary Hacks - syscallとgolang.org/x/sys/ #golang

## はじめに

GoにはOSのシステムコールを実行するために[syscallパッケージ](https://golang.org/pkg/syscall/)が用意されています。[^1]

[^1]: システムコールについての詳細な仕組みは[Goならわかるシステムプログラミング ― 第5回 Goから見たシステムコール](http://ascii.jp/elem/000/001/267/1267477/)が勉強になります。

そして同様にシステムコールを実行するための公式外部リポジトリとして[golang.org/x/sys/リポジトリ](https://godoc.org/golang.org/x/sys)も存在します。

これら2つのパッケージができた経緯をシステムコールの問題点とともに説明します。

## Go syscallパッケージの問題点

1. OSごとに多くのシステムコールや変数定義が存在する。また日々成長を続けている。
2. OSごとに仕様が異なるシステムコールをすべてテストをすることが困難。
3. OSごとに仕様が異なるシステムコールのドキュメントの整備が困難。
3. OSごとのシステムコールの変更要求が多く、取り込むべきかの判断にコストがかかる。
4. Goが変わらずともOS側に変更が入るとGoの互換性を維持することが困難。

## Go1.4以降のsyscallパッケージの対応

- [syscallパッケージ](https://golang.org/pkg/syscall/)では、Goの将来のバージョンをサポートするために必要な変更だけが取り込まれます。それ以外の変更はsyscallパッケージには取り込まれません。
- syscallパッケージは、下位バージョンとの互換性を維持する必要があるため、なくなることはありません。
- OS固有の変更は、Goの標準ライブラリからは独立した[golang.org/x/sys/](https://godoc.org/golang.org/x/sys)で管理されます。
 - パッケージを分割することで、OS固有のドキュメント、テスト、変更の追従ができるようになりました。
- [golang.org/x/sys/](https://godoc.org/golang.org/x/sys)には、`plan9`, `windows`, `unix`などOSごとにパッケージが別れており、それぞれ独立して変更が管理されます。
 - このパッケージはシステム間の基本的なインターフェースの違いを表現しており、厳密にOSごとに分離されているわけではありません。
 - unixパッケージではLinuxとdarwinが対象となっており、ビルドタグによってビルド対象を切り替えます。
 - Linuxとdarwinでは完全にシステムコールの仕様が同一ではないので完全な移植性は実現できないはずです。
 - Goの標準ライブラリはこのパッケージには依存しません。
 - Goチームによって管理されます。

## まとめ
このようにシステムコールを使うと移植性は保証されないので、諦めて[golang.org/x/sys/](https://godoc.org/golang.org/x/sys)を使うといいでしょう。
とはいいつつ、Goの標準ライブラリから利用しているsyscallパッケージのシステムコールはある程度移植性があるはずなので、利用するシステムコールの機能に応じて使い分けると良いと思います。

## 参考
- [The syscall package](https://docs.google.com/document/d/1QXzI9I1pOfZPujQzxhyRy6EeHYTQitKKjHfpq0zpxZs/)
最近のSpyderでObject Inspectorが見当たらないと感じた場合

Sypder 3.0 以降では、Help に変わりました。
[Version 3.0 リリースノート](https://github.com/spyder-ide/spyder/blob/master/CHANGELOG.md#version-30-2016-09-24)

![help.png](https://qiita-image-store.s3.amazonaws.com/0/10290/2d10f3fc-e69a-b793-025b-c706139b2636.png)

`[View]`->`[Panes]`->`[Help]`で Help タブを表示できます。

これまで通り、クラス名や関数名を選択して、Ctrl+I か Command+I (アイ) を押すと、ドキュメントが開きます。

![help2.png](https://qiita-image-store.s3.amazonaws.com/0/10290/fbc70108-31d2-08c5-853f-13113e869e00.png)
HomeBrew Hadoop 2.8 インストール

#１Hadoop  インストール
　brew install hadoop

　・hadoop-env.sh
　・core-site.xml
　・hdfs-site.xml
　・mapred-site.xml
　・yarn-site.xml

path: /usr/local/Cellar/hadoop/2.8.0/libexec/etc/hadoop

#2 SSH 設定
　1. ssh-keygen -t rsa
　Press enter for each line 
　2. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
　3. chmod og-wx ~/.ssh/authorized_keys 

#3 テスト
　hdfs namenode -format
　起動
　start-all.sh

　http://localhost:50070　管理画面
　http://localhost:8088　プロセス管理画面
Mac & Google日本語入力 | バックスラッシュ / 円 の初期設定が出来ない場合 

# 問題

Google日本語入力の設定では、ちゃんとバックスラッシュ入力が初期値になっているのだが…。

なぜか円 ( `¥` ) が入力されてしまう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/a664bfa9-8d3a-6649-89eb-4871cd293a7e.png)

## 問題発生時のキーボード設定

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/08d9c2d6-4a51-dc08-a46f-8e648570430a.png)

# 解決

「日本語入力はGoogle IMEに任せるし、Mac標準のやつは要らない」と思って、日本語の入力ソースを削除していたのが問題だったみたいだ。

- 「日本語」を入力ソースに追加する
- バックスラッシュのオプションを設定する
- 入力ソースから英字のものを削除する

という手順で、バックスラッシュの初期入力が有効になった。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b9e2beaf-2c04-63bd-dff6-59eb4d2d7b94.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/84d34dd4-a502-cd6c-7af2-caa5ec410a6e.png)

# 理解


- 日本語入力の時はGoogle日本語入力を使う
- 英字入力の時は「Mac標準の日本語キーボードの、英字入力モードを使う」

という動作になっている気がした。
けっこう分かりにくい作りだ。

# 追記

Google日本語入力の「英数」を追加して、Mac標準の「日本語」を削除することでも対応できた。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/d876eaa3-2209-a03b-6732-b4022d5811e8.png)

# 環境

- OS X El Capitan 10.11.6








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Visual Studio / WPF > イベント > Timer処理を使った時刻表示 | new TimeSpan(0, 0, 1); | DispatcherTimer | DateTime.Now.ToLongTimeString()

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

Timer機能を使った時計の表示を試した。

### リンク

参考1: https://code.msdn.microsoft.com/windowsdesktop/XAMLCVB-WPF-Windows-WPF-2aab6085
参考2: [WPF – タイマースレッドからWindow内のコントロールを操作 @ astel-labs.netさん](http://astel-labs.net/blog/diary/2010/07/100705_1.html)
参考3: https://msdn.microsoft.com/ja-jp/library/windows/apps/windows.ui.xaml.dispatchertimer

### code

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading; // added for Timer

namespace _170501_t0702_timer
{
    
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        DispatcherTimer myTimer;

        public MainWindow()
        {
            InitializeComponent();

            myTimer = new DispatcherTimer(DispatcherPriority.Normal);
            myTimer.Interval = new TimeSpan(0, 0, 1);

            // イベント 'DispatcherTimer.Tick'は+=または-=の左側にのみ使用できます
            //myTimer.Tick = new EventHandler(myTimer_Tick);
            //
            myTimer.Tick += myTimer_Tick;

            myTimer.Start();
        }

        void myTimer_Tick(object sender, EventArgs e)
        {
            T_timer.Text = DateTime.Now.ToLongTimeString();
        }
    }
}
```

```MainWindow.xaml
<Window x:Class="_170501_t0702_timer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170501_t0702_timer"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBlock Name="T_timer" FontSize="32" Text="00:00:00" />        
    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/245a5988-ec0d-6641-69a4-d29222113f6a.png)

### はまった点

```
myTimer.Tick = new EventHandler(myTimer_Tick);
```

上記で以下のエラーが出た。

> イベント 'DispatcherTimer.Tick'は+=または-=の左側にのみ使用できます

そのため、以下のように変更した。

```
myTimer.Tick += myTimer_Tick;
```
Mac でcrontab -e が反映されない。

Mac で`crontab -e` を使って、30分ごとに通知を出そうとしたが、うまくいかなかった。

```bash

$ crontab -e
neocomplete does not work with this version of Vim.
It requires Vim 7.3.885 or later with Lua support ("+lua").
Press ENTER or type command to continue
crontab: "/usr/bin/vi" exited with status 1
```

`export EDITOR=/usr/bin/vim`により、エディターを変更したらうまくいった。
環境変数`EDITOR`は、デフォルトのエディターを指定するもの。