OmniAICreator/Qiita-1.07M huggingface dataset:
配列に循環的にアクセスする方法3つの速度を調べてみた

配列に循環的にアクセスする方法で、ぼくが知っているものは3つあります。それぞれの書き方の紹介と、速度検証をしてみます。

速度検証はUnityのProfilerという機能を用います。

今回検証するスクリプト

``` C#:LengthSpeedTest.cs

using UnityEngine;

public class LengthSpeedTest : MonoBehaviour {

    int testCount = 1000000;
    const int ArrayLength = 1 << 2;
    readonly int mask = ArrayLength - 1;

    int idx = 0;
    int[] intArray = new int[ArrayLength];

	// Use this for initialization
	void Start () {
        idx = 0;
        Profiler.BeginSample("ClampPattern1");
        clamp1();
        Profiler.EndSample();

        idx = 0;
        Profiler.BeginSample("ClampPattern2");
        clamp2();
        Profiler.EndSample();

        idx = 0;
        Profiler.BeginSample("ClampPattern3");
        clamp3();
        Profiler.EndSample();

        UnityEditor.EditorApplication.isPlaying = false;
    }
	
	void clamp1()
    {
        for (int i = 0; i < testCount; i++)
        {
            if (++idx >= intArray.Length) idx = 0;
            intArray[idx] = 0;
        }
    }

    void clamp2()
    {
        for (int i = 0; i < testCount; i++)
        {
            intArray[++idx % ArrayLength] = 0;
        }
    }

    void clamp3()
    {
        for (int i = 0; i < testCount; i++)
        {
            intArray[++idx & mask] = 0;
        }
    }
}


```

3つ目の方法は配列の長さが 2 の n 乗でないと使えないので今回は配列の長さ(ArrayLength)を `1 << 2 (= 4)` とします。

全体の流れは、処理開始直後に3つの方法で配列に一定回数(testCount)だけ繰り返しアクセスし、かかった時間を Profiler で調べたあと処理を停止するだけです。

1つ目(Clamp1)はインクリメントして配列の要素以上の数になった場合は 0 に戻す方法。一番一般的な気がします。

2つ目(Clamp2)はインクリメントしたものを剰余演算したものをそのままインデックスとして使用する方法。1つ目のやり方をそのまま縮めたような意味になります。

3つ目(Clamp3)はインクリメントしたものを (配列の長さ - 1) でマスクする方法。上記の通り、この方法は配列の長さ等の最大数に使いたい数が 2 の n 乗でないと使えません。

2 の n 乗は 2 進数では例えば `100 ` や `10000` であり、それらから 1 を引くと `011`と`01111` です。一番大きい桁以外はすべて 1 になるのがミソですね。そのため、`++idx & mask` は1つ目、2つ目の方法と同じ結果になります。ちょっとトリッキーな書き方です。

さて速度検証の結果です。

**100,000回**
![2016-10-02_00h08_45.png](https://qiita-image-store.s3.amazonaws.com/0/31480/7127ae6c-2423-0392-8a4c-26cde87e68da.png)

| Clamp1 | Clamp2 | Clamp3 |
|--------|--------|--------|
| 0.96ms |0.74ms  |0.66ms  |

**1,000,000回**
![2016-10-02_00h06_31.png](https://qiita-image-store.s3.amazonaws.com/0/31480/a31d0c37-75f2-9dd4-7526-e4d4c45588f9.png)

| Clamp1 | Clamp2 | Clamp3 |
|--------|--------|--------|
| 9.49ms |7.23ms  |5.71ms  |

**10,000,000回**
![2016-10-02_00h08_09.png](https://qiita-image-store.s3.amazonaws.com/0/31480/a181ae09-9d39-ae37-9177-8b4cf9f5a0c1.png)

| Clamp1   | Clamp2  | Clamp3  |
|----------|---------|---------|
| 109.08ms |68.80ms  |63.85ms  |

思ったより2つ目と3つ目の差がないのが意外でした。
1つ目の方法を使っている方は2つ目の方法に乗り換えるといいかと思います。
2つ目と3つ目の比較ですが、3つ目の方法は使うための条件があって直感的でもありません。また、繰り返す回数が今回のようにめちゃくちゃ膨大である場合にやっと数字上では違いが判る程度のものです。

という訳で、普段は2つ目の方法を使い、データ構造を自作するなど速度に特にこだわりたい場合は3つ目を使うといいかな、と思いました。
fluent-plugin-line-notify作ってみた


[Plagger で更新情報を LINE で受け取る plugin ](http://blog.livedoor.jp/nipotan/archives/plagger-plugin-notify-line.html)を見ていて、以前の同僚を思い出しました。

* [NHKの次の番組情報を #fluentd 経由でidobataに流す](http://bash0c7.hatenablog.com/entry/2014/02/03/015739)
* [ご家庭の #fluentd で使っているtumblr投稿・画像読み込み・画像保存の３種のプラグインをgem releaseしました](http://bash0c7.hatenablog.com/entry/2014/01/25/233002)

fluentdはログ収集基盤のためのソフトウェアですが、サーバーのログとかではなく、彼は完全にPlaggerのような使い方をしていて、「それPla（略」と言いかけたものです。

そんなわけで、Plagger::Plugin::Notify::Lineがあるならfluent-plugin-line-notifyもあっていいだろうと思って作りました。

* https://github.com/edvakf/fluent-plugin-line-notify
* https://rubygems.org/gems/fluent-plugin-line-notify

LINE NotifyのAPIは画像も投稿できるみたいですが、どうやって対応するのがいいかな。

fluentdのconfigにerbを書けるというアイデアはその元同僚の作った[fluent-plugin-idobata](https://github.com/bash0C7/fluent-plugin-idobata)からいただきました。
VSCodeのプラグインとMSX


ちょっとした改造とか個人的メモ

# インストール先とか

・ ~/.vscode/extensionsにあった。
・ JSで書かれてて、特に署名とかされてなさそう（＝簡単に改造できる）

# 探す

・ 各プラグインの詳細は割といい加減ですね？
・ ライセンスの提示も開発リポジトリへのリンクとかも特にメタ情報として設けられてない？
（とてもJSの世界っぽい大胆さ。個別に説明文に入ってる子はいますね。。。）

* [Visual Studio Code Extensions | Visual Studio Marketplace](https://marketplace.visualstudio.com/vscode "Visual Studio Code Extensions | Visual Studio Marketplace")


# 欲しかったもの

・ Mithril.jsにとってのJSX、つまりMSXのシンタックスハイライト

* [insin/msx: JSX for Mithril](https://github.com/insin/msx "insin/msx: JSX for Mithril")

・ MSXで検索したらZ80 Assemblyとかしか出てこない。それじゃない。
・ 元祖・JSXのハイライトを改造すればいけるやん？となったので試してみた。

* [jsx - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=TwentyChung.jsx "jsx - Visual Studio Marketplace")

【追記】コメントにいただいたように、プラグインの動作を変える必要がないのであれば、VSCodeの設定で対応できます。

# 改造

package.jsonに以下の箇所があったので、配列に.msxを追加。終わり。

```
    "extensions": [
            ".jsx",
            ".bsh"
    ],
```

JSXとMSXのソース時点での仕様差異は未確認。
とりあえず、VSCode上でそれっぽくハイライトされたのでOK。
DCGANで家紋を自動生成する

# 背景
家紋（かもん）とは、日本固有の紋章である。
https://ja.wikipedia.org/wiki/%E5%AE%B6%E7%B4%8B
真田丸を見ていたら、家紋の自動生成をしたくなったのでやってみた。

## 【参考】これまで生成されてきた画像たち
* 顔イラスト http://qiita.com/mattya/items/e5bfe5e04b9d2f0bbd47
* イラスト http://qiita.com/rezoolab/items/5cc96b6d31153e0c86bc
* 間取り画像 http://nextdeveloper.hatenablog.com/entry/2016/02/26/211332
* アイドル顔画像 http://memo.sugyan.com/entry/20160516/1463359395
* ポケモン http://bohemia.hatenablog.com/entry/2016/08/13/132314
* アルファベット http://qiita.com/hitokun-s/items/38c0bdc3245a45fd8c29



# データ収集
探してみると、下記のサイトに結構な量の家紋画像を発見。
http://www.benricho.org/kamon/
サイトのソースをみつつ、ダウンロードするスクリプトを作成。

https://github.com/yu4u/kamon
上記リポジトリの``dl.sh``で画像データのダウンロード、``convert.sh``で学習用にリサイズができる（要imagemagick）。
元画像は約250MB、画像数は約9000。
利用したDCGANの実装がカラー画像前提だったので、モノクロ画像にならないように変換。モノクロ画像として実行したほうが効率的だが、色々いじらないといけないようなのでカラー画像とした。むしろ2値画像として学習してみたい。

# DCGANによる画像生成
下記のTensorFlowの実装を利用。
https://github.com/carpedm20/DCGAN-tensorflow
画像フォルダを指定して実行するだけでOK。

# 結果
ちょっと学習画像が少なかったかな、という結果。ノイズのような領域ができるので、やはり2値画像として扱うべきなのか。円を学習しているのがそれっぽい。

![movie.gif](https://qiita-image-store.s3.amazonaws.com/0/139809/aa7c7911-ad88-379e-7cb2-07e65f847eb1.gif)

![train_924_0067.png](https://qiita-image-store.s3.amazonaws.com/0/139809/f3177aef-8775-6f8c-1ce2-1c18b2e1f7e9.png)

![train_929_0052.png](https://qiita-image-store.s3.amazonaws.com/0/139809/86d33e8e-3070-0b8e-e09e-209cf5563177.png)

![train_944_0107.png](https://qiita-image-store.s3.amazonaws.com/0/139809/2de2ecce-f40c-f85d-be79-a16dac841b65.png)

![train_999_0142.png](https://qiita-image-store.s3.amazonaws.com/0/139809/782edb3c-d251-bad1-b7aa-d4516ec74c47.png)
いまいち納得できないAndroid MのRuntime Permissions

私用の個人端末がまだLolipop(EXPERIA Z3)なので、あぐらをかいていたRuntime Permissionsの対応ですが、Nも出たことで、そろそろ本腰を入れないとということで実装してみました。
その中でつまづいたところとその対処を残しておきたいと思います。

基本的なところについては以下が参考になると思います。

* [初心者のためのM PERMISSIONS入門](http://techbooster.org/android/application/17223/)
* [Android 6.0 の Runtime Permissions (M Permissions) に対応するためのアクティビティ図](http://sys1yagi.hatenablog.com/entry/2015/11/07/185539)

# booleanのメソッドなのに３つの状態がある
```
shouldShowRequestPermissionRationale()
```
パーミッションを許可するかの確認ダイアログを表示するかどうかを確認するためのメソッドです。
（この時点で若干ややこしい）
自分は、ダイアログを表示しないにチェックを入れたかを知るときに使っていました。

こちら、チェックの有無で値を返してくれたらいいのですが、なぜかダイアログを１度も表示していない場合でもfalseが返ってくるので、チェックをしたからfalseなのか１度も表示していないからfalseなのかがわかりません。

しかたがないので、各パーミッションごとにpreferenceでbooleanの値を確保し、１度でも表示したかの確認をするようにしています。

# 現在地は端末の設定もある
現在地のパーミッションの場合は、端末でも制御ができるので注意が必要です。
自分は、端末→アプリの順でONになっているか確認し、なっていなければその都度ユーザーに設定を促すようにしました。なお、先に端末から確認したのは、ユーザーがわざとOFFにしている可能性があり、手間を少なくするためです。
また、以下のように端末、パーミッション、その両方の設定を確認して、適宜使い分けていました。

```
// 端末
boolean isDeviceLocation() {
    LocationManager locationManager =
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}

// パーミッション
boolean isPermissionLocation() {
    // M未満は関係なし
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
        ActivityCompat.requestPermissions(this, permissions, PERMISSION_LOCATION_REQUEST_CODE);

        return false;
    }

    return true;
}

// 両方
boolean isLocation() {
    return isDeviceLocation() && isPermissionLocation();
}
```

# 各画面で確認しなければならない
当たり前なのですが、その許可が必要な画面すべてで、パーミッションの有無、確認ダイアログ、そして、許可/拒否された場合の処理を書かなければなりません。
こちらについては特に対処できませんでした。大元となるメソッドなどはBaseActivityといった継承元をつくってそこに書いたりしましたが、いまいちな感じでした。どんどん肥大化していきますね。

# テストの分岐が増える
現在地のパーミッションだけになるかもしれませんが、M未満は今まで通りでM以上は今回のランタイムパーミッションが適用されるため、
・M未満で端末の現在地の設定による分岐
・M以上で端末の現在地の設定をOFFにしていて、パーミッションの設定による分岐
・M以上で端末の現在地の設定をONにしていて、パーミッションの設定による分岐
と、一気に増えた感が。こちらも特に対処できずに、頑張るしかないと言ったところでしょうか。

# おわりに
Runtime Permissionsについての詳しい説明は、結構落ちているのですが、こういった各個人の対処法みたいなのってなかなか無いように思えます。（自分もあまり対処法は書いていませんが）
見逃してるだけで、ベストプラクティスってことでどっかに載ってたりするのかしら？
ESP-WROOM-02でMicroPython (mac)

ESP-WROOM-02をArduinoで使う情報はたくさんありますが、MicroPythonを動かす情報は少なかったので、Lチカまでの手順をまとめました。
# MicroPython
MicroPythonはマイコンボードで動かすPython3の実行環境です。
元々は、pyboardというマイコンボードの上で動いてましたが、esp8266にも移植されました。
# 準備
## Mac上で環境構築
ESP-WROOM-02ボード上にmicropythonのファームを書き込む環境を構築します。
### pipのインストール
pipがすでにインストールされていたらスキップ

```shell-session:
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ sudo python ./get-pip.py
```
これでpipがインストールされます。

### esptoolのインストール
esptoolはESP-WROOM-02にコマンドラインからアクセスするツールです。
上でインストールしたpipを使い、インストールします。
`$ sudo pip install esptool`
環境構築はこれだけです。
## esptoolを使い、ボードにアクセス
ESP-WROOM-02のIO0をLOWにしてファームウェア書き込みモードにします。
USBシリアルを使い、Macに接続します。
USBシリアルのデバイスは、/dev/tty.usbserial-xxxxになります。（xxxxはUSBシリアルのデバイスによって変わります)
### esptoolのテスト
esptoolを使って、ボードにアクセスできるかテストします。

```shell-session
$ esptool.py --port=/dev/tty.usbserial-xxxx --baud 115200 chip_id
esptool.py v1.1
Connecting...
Chip ID: 0x000????
```
esptoolを起動して、上記のメッセージが出れば、esptoolで正常にボードにアクセスできています。
（????はチップIDで変わります）
### フラッシュメモリのサイズ確認
esptoolを使いフラッシュメモリのサイズを確認します。

```shell-session
$ esptool.py --port=/dev/tty.usbserial-DJ00L51M --baud 115200 flash_id
esptool.py v1.1
Connecting...
Manufacturer: a1
Device: 4016
```
4016の下２桁がサイズを表すようです。16の場合はフラッシュサイズは32Mbitです。[こちら](http://flogics.com/wp/2016/09/esp8266-で-nodemcu-ファームウェアと-micropython-を試してみる/)のサイトを参考にしました。
# MicroPythonの書き込み
ファームウェアは、[MicroPython Downloads](http://micropython.org/download/)の下の方にあります。
私がダウンロードした時は、esp8266-20160909-v1.8.4.binが最新でした。

```shell-session
$ esptool.py --port=/dev/tty.usbserial-xxxx --baud 115200 write_flash --flash_size=32m 0 ./esp8266-20160909-v1.8.4.bin 
esptool.py v1.1
Connecting...
Running Cesanta flasher stub...
Flash params set to 0x0040
Writing 565248 @ 0x0... 565248 (100 %)
Wrote 565248 bytes at 0x0 in 49.0 seconds (92.2 kbit/s)...
Leaving...
```
こんな風に書き込めれば、成功です。
# 起動とLチカ
ESP-WROOM-02のIO0をHIGHにして、実行モードにし、cuコマンドでターミナル接続します。
`$ sudo cu -s 115200 -l /dev/tty.usbserial-xxxx`
return打って、`>>>`のプロンプトが出ればpythonのコマンドラインが受け付ける状態になっています。
## hello world
とりあえず、 hello world

```python
>>> print ('hello world')
hello world
```
## Lチカ
IO4につないだLEDを点灯させます。

```python
>>> import machine
>>> pin = machine.Pin(4, machine.Pin.OUT)
>>> pin.high()
>>> pin.low()
```

以上です。
参考URLは、[MicroPython tutorial for ESP8266](http://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/index.html)でした。

続編として、シェルの導入をまとめました。
[ESP-WROOM-02でMicroPython (Mac) shellの導入](http://qiita.com/taka-murakami/items/25bec288d4aa1bc6f63f)

MicroPythonでDeepSleeepの使い方と、電源電圧の取得方法も追加しました。
[MicroPython on the ESP8266 (ESP-WROOM-02) deep sleep](http://qiita.com/taka-murakami/items/0d2b4734b08516135d74)
[MicroPython on the ESP8266 (ESP-WROOM-02) 電源電圧の取得](http://qiita.com/taka-murakami/items/d03ac0bd2c6d4aa8e274)
【VBA】FileSystemObjectのGet～Nameメソッドを関数で自作してみる

#1. 発端
ファイルのフルパスから、親フォルダやファイル名を取得したいことがあった。
FileSystemObjectのGet～Nameメソッドを使えば簡単に取得できるが、毎回インスタンスするのも面倒、ということで勉強も兼ねてFunctionプロシージャで自作してみることにした。



#2. 仕様

+ 引数1：String
ファイル、またはフォルダーのフルパス

+ 戻り値：String配列
分解されたパスが入った配列

表1. 戻り値対応表

|添え字|中身|対応メソッド|
|:--:|:--|:--|
|0|親フォルダへのパス|GetParentFolderName|
|1|拡張子付きファイル名|GetFileName|
|2|拡張子無しファイル名|GetBaseName|
|3|拡張子|GetExtensionName|

#3. 結果

```vbnet:SplitPath.bas
Option Explicit

Enum SplitPathIndex
    spParentDir
    spFileName
    spBaseName
    spExtension
End Enum

Public Function SplitPath(ByRef iFullPath As String) As String()
    Const DirSeparator$ = "\", ExtSeparator$ = "."
    Dim oArray(3) As String
    
    Dim pos As Long
    Let pos = InStrRev(iFullPath, DirSeparator)
    
    Let oArray(spParentDir) = VBA.Left$(iFullPath, pos - 1&)
    Let oArray(spFileName) = VBA.Mid$(iFullPath, pos + 1&)
    
    'pos 再利用
    Let pos = InStrRev(oArray(spFileName), ExtSeparator)
    
    '拡張子無しの場合の対応
    If pos = 0& Then
        Let oArray(spBaseName) = oArray(spFileName)
        Let oArray(spExtension) = ""
    Else
        Let oArray(spBaseName) = VBA.Left$(oArray(spFileName), pos - 1&)
        Let oArray(spExtension) = VBA.Mid$(oArray(spFileName), pos + 1&)
    End If
    
    Let SplitPath = oArray
    
End Function
```

"SplitPath"関数にファイルのフルパスを入れると動作する。
なお、VBAで配列の戻り値を受け取る場合は、該当型の動的配列が必要である。
今回の場合は、

```vbnet
Dim 受け取る変数() As String
```
と宣言する必要がある。

また、添え字用に"SplitPathIndex"列挙体も宣言している。

#4. 処理速度比較
以下のプロシージャを作成して速度の比較を行ってみた。
（要参照設定："Microsoft Scripting Runtime" 又は "Windows Script Host Object Model"）

```vbnet
Sub 処理速度比較()
    Const TestPath$ = "C:\SampleDir\SampleFile.txt"
    Const LoopCnt& = 10000
    
    Dim start As Single, lap As Single
    Dim myArray() As String
    Dim i As Long
    
    Debug.Print LoopCnt; "回ループ"
    
    start = Timer
        For i = 1 To LoopCnt
            myArray = SplitPath(TestPath)
            Erase myArray
        Next i
    lap = Timer - start
    Debug.Print "自作関数"; lap; "秒"
    
    With New FileSystemObject
        start = Timer
            For i = 1 To LoopCnt
                ReDim myArray(3)
                myArray(0) = .GetParentFolderName(TestPath)
                myArray(1) = .GetFileName(TestPath)
                myArray(2) = .GetBaseName(TestPath)
                myArray(3) = .GetExtensionName(TestPath)
                Erase myArray
            Next i
        lap = Timer - start
    End With    'New FileSystemObject
    Debug.Print "FileSystemObject"; lap; "秒"
    
End Sub
```
私の環境（Windows10 Pro64bit & MSOffice2016 64bit / Windows8.1 Pro64bit MSOffice2013 32bit）
で実行したところ、FileSystemObjectの方が処理が早く、今回作成した関数の半分程度の時間で処理が終了した。
ある程度FileSystemObjectに有利な設定にしているので、まあ当然の結果である。

なお、FileSystemObjectを毎回インスタンスし直したり、遅延バインディングしていた場合は余裕で逆転する。
特に遅延バインディングだと目に見えて実行速度が低下する。

#5. まとめ
餅は餅屋、速度を考えると本職に任せた方が早い。
Azureでリソース（CPU時間など）の使用状況を確認する

Azureでの、今現在のCPU時間などの状況を
確認する方法に迷ったので、メモ。

1. ダッシュボードで対象のサービスのタイルをクリック。
2. 左側のペイン「クォータ」で検索（もしくは移動）。
3. ↓こんな風にリソース状況が表示される。

![クォータ.png](https://qiita-image-store.s3.amazonaws.com/0/125588/891b06b1-3267-ba7a-aec7-b081dfac662a.png)


それにしても、用語が分らん。。。orz
Pygmentsを、標準入出力で使う

#Pygmentsでpython→HTML
 Pygmentsで、syntaxhighlightされたpythonコードを、htmlで出力して、サイトに貼り付けるやり方をいまだにやっております。（現在、markdown記法のブログ投稿ツールを探しています。）

Pygmentsを使ってhtmlを出すには、大きく分けて、2パターンあると思います。
**1 .pyファイルを、.htmlファイルに出力するやり方。**
**2 標準入出力を使うやり方。**
主に、**2**のやり方を、Ubuntuの端末から行ってきましたが、同じことがWindowsですぐにできませんでした。
理由は、Windowsの標準入力から抜け出す方法を知らなかったからというだけでした。

 とりあえず、嵌ったので書きます。
##1 .pyファイルを、.htmlファイルに出力するやり方
Pythonのコードを保存（例えば、a.py）
↓
```pygmentize -f html -l python noclasses=True -o a.html a.py
```↓
a.htmlをテキストエディタで開いてコピペ。
##2 標準入出力を使うやり方。
入力ファイルがない場合に、標準入力（入力待ち）になります。
長いコードの一部分をコピペ→highlightしたhtmlを取得したい時など便利だと思っています。
###Windowsのコマンドラインからの場合
```pygmentize -f html -l python -O noclasses=True
```↓
標準入力にpythonのコード書く。
↓
**改行→Ctrl+Z→Enterで、標準入力から抜ける。**
↓
標準出力に表示されるのをコピペ。

**（Ctrl+Cでも、Ctrl+Breakでもでない。）**
###Ubuntuの端末からの場合
```pygmentize -f html -l python -O noclasses=True
```↓
標準入力にpythonのコード書く。
↓
**Ctrl+Dで、標準入力から抜ける。**
↓
標準出力に表示されるのをコピペ。
##コマンドの意味
>```pygmentize -f html -l python noclasses=True -o a.html a.py```もしくは、
```pygmentize -l python -f html -O noclasses=True```と書きましたが、

```-l python``` …………………………lexer（字句解析）は、python用のを使う。元のファイルがpythonの時はpythonと書くし、rubyのときはrubyと書き換える。
```-f html``` ………………………………出力するフォーマットはhtml
```-O noclasses=True``` これがあると、cssいじらなくてもよくなる代わりに、毎回、htmlタグに色指定が入り、編集時に、ごちゃごちゃする。

###-oは、-Oとは違う。（大文字小文字で意味が違う。）
[公式サイトから引用](http://pygments.org/docs/cmdline/)
>The -o option gives an output file name. If it is not given, output is written to stdout.
>>-oオプションは、出力ファイル名を与えます。もし与えられなかったら、出力は、stdout（標準出力）に書かれます。


```-o hogehoge.html``` の、有る・無しで、「指定されたファイルを読む→ファイルが出力される」となるか、標準出力に表示される（端末画面に表示される）かが決まるようです。
#本当は4パターン
```-f html -l python noclasses=True```は省略します。

```pygments -o a.html a.py ```　a.pyを読んで、a.htmlに出力
```pygments a.py```　a.pyを読んで、cmdもしくは端末画面に表示（標準出力に出力）
```pygments -o a.html```　入力待ち（標準入力）→入力終了（改行→Ctrl+Z→EnterもしくはCtrl+D）→a.htmlに出力
```pygments```　入力待ち→入力終了→cmdもしくは端末画面に表示
【Eclipse】このコンパイル単位はjavaプロジェクトのビルド・パスにありません

# "."を入力する度にEclipseが止まる｡
Eclipseにプロジェクトをインポートした際､プロジェクトがJavaプロジェクトになっていませんでした。
インポートする際に指定し忘れたようです｡

# プロジェクトタイプの変更を行う
- ｢作業中のプロジェクト｣の｢プロパティー｣を開きます｡
- ｢プロジェクト･ファセット｣を選択し､｢ファセット･フォームへ変換...｣を選択します｡

![qiita1001.png](https://qiita-image-store.s3.amazonaws.com/0/142834/dba70eb3-2a40-3c2b-6da6-0b035b17ab7a.png)

- 最後に､｢Java｣を選択し､完了です｡
画面遷移をVC外で管理するパターンの参考資料

## この記事は
勉強会で発表した「画面遷移の管理とMVVM」の補足資料です。
https://speakerdeck.com/yoching/hua-mian-qian-yi-falseguan-li-tomvvm

## 参考資料
- Presentation Coordinators by Soroush Khanlou
    - [video at NSSpain](https://vimeo.com/144116310)
    - [blog](http://khanlou.com/2015/10/coordinators-redux/)
    - [slides](https://www.slideshare.net/secret/3jJlEE1weo0RRl)
- [Boundaries in Practice](https://realm.io/news/tryswift-ayaka-nonaka-boundaries-in-practice/) by Nonaka Ayaka, try!Swift(2016)
- [Application Coordinatorを使ってぐちゃぐちゃになった遷移を綺麗に管理する](http://qiita.com/endorno@github/items/d0b25c47e3c5a7b48865)
    - [こちら](https://gist.github.com/AliSoftware/6d2d146f7baccb0099cc)も参照されています
- "MVVM-C In Practice" by Steve Scott, UIKonf(2016)
    - [video](https://www.youtube.com/watch?list=PLdr22uU_wISqm9QbnczWxXs9qyuWpSU4k&time_continue=2&v=9VojuJpUuE8)
    - [slides](https://speakerdeck.com/macdevnet/mvvm-c-in-practice)
    - [sample code](https://github.com/macdevnet/mvvmc-demo)
    - Model-View-ViewModel-Coordinator
    - 今回お話した内容はこのアーキテクチャとほぼ同じです。
- [Connecting View Controllers](https://talk.objc.io/episodes/S01E05-connecting-view-controllers) at Swift Talk(objc.io), 2016　←　**一番オススメ！！**
- [RxSwiftのサンプル内のWireframe](https://github.com/ReactiveX/RxSwift/blob/master/RxExample/RxExample/Services/Wireframe.swift)

## 補足
CoordinatorとViewModel、もしくはCoordinatorとViewController間の通信には、以下のような方法があるかと思います。

- delegate
- closureを渡す
- FRPライブラリなどを利用する（オブザーバーパターン）

どの方針で実装しても、本質的には差異はないと思いますが、書き方が異なります。上で上げた参考資料では、closureを渡して通信する方法が多いと思います。

自分のプロジェクトではFRPライブラリ（ReactiveCocoa）を使用しています。そのため、上の資料を一通り眺めたあと、ReactiveCocoaを利用する方法で自分で書いて行っています。

また、Coordinator間で共通処理がある場合（違う場所に同じVCが出る場合など）には、Protocolで共通処理を記述することも行っていますが、それはまた別の機会にまとめようと思います。
AWS S3の権限設定

## やりたいこと
画像ファイルなどの公開ファイルを格納するバケットを作成し、その配下は全公開とする。
また、プログラムなどからそのバケット配下のファイルを管理するためのユーザに権限を付与し、特定のバケット内のオブジェクトのみ書き込み、削除を行えるようにする。

## 前提
- S3でバケット作成済み
- IAMで管理用ユーザ作成済み

※プログラム上からこのユーザを使用してS3オブジェクトを操作する想定
　S3オブジェクトを操作するプログラムは別途用意すること

## 管理用ユーザの権限設定
IAMの管理画面を開き、対象のユーザを選択し以下の手順でポリシーの設定画面を表示する。

- 「アクセス許可」タブを表示
- 「ユーザポリシーの作成」ボタンをクリック
- 「カスタムポリシー」を選択し、「選択」ボタンをクリック

「ポリシー名」は分かりやすい名前を入力し、「ポリシードキュメント」に以下を設定する。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::対象バケット名"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::対象バケット名/*"
            ]
        }
    ]
}
```

`Statement`の１つ目の設定はバケットに対する操作、２つ目の設定はバケット内のオブジェクトを操作する権限設定。`Resource`は配列指定なので、カンマ区切りで複数のバケットを指定可能。

## バケットの公開設定
S3の管理画面を開き、対象バケットのプロパティを表示する。
アクセス許可の「バケットポリシーの編集」をクリックし、以下を設定する。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::対象バケット名/*"
        }
    ]
}
```

これで、バケット内のオブジェクトに個別にアクセス許可設定をしなくても、ブラウザ等からリンクURLで閲覧可能となる。

以上
DynamoDBに一定ペースで更新処理をしてたのにWCUを超えてしまった

uuidをキーとするテーブルの各レコード（DynamoDB 的には厳密にはアイテム）に対して、各行にuuidリストが書かれたテキストファイルを読んで対象のレコードにフラグをセットしていくスクリプトを実行した。
本記事末尾に記載したような Node.js のスクリプトで **80WCU** (Write Capacity Unit) 消費で済むと思っていた。しかし結果的に **240WCU** と３倍消費していた。

## 原因
* RCU/WCU の U は Unit であり、Item (Record) ではない。**RCU** の Unit は **4KB** であり、**WCU** の Unit は **1KB** であった。
* テーブルに入ってる既存のデータが各レコードで平均 3KB 近くあったため、1更新に 3WCU 使っていた。

## 反省と考察
* レコードの 4KB を最大値の基準として気にしていたが、RCU と WCU の Unit に差があったことを知らなかった。
* テーブル設計が最適ではなかった。  
  テープルの中で更新頻度が高く読み取り頻度が低いフィールド（属性）があり、かつ独立できるものがあった。これはテーブルを分けるべきだった。
* 1レコードのサイズを太らせていくような実装は危険、不要になったフィールドは消し込んだ方が良い（もちろんその場合もWCUを考慮した削除が必要である）。

## スクリプト

```javascript
'use strict';

const fs = require('fs');
const AWS = require('aws-sdk');
const LineStream = require('byline').LineStream;
const PacedWorkStream = require('paced-work-stream');
const PromisedLife = require('promised-lifestream');

const docClient = new AWS.DynamoDB.DocumentClient({ region 'ap-northeast-1' });
const TABLE_NAME = 'users';

const pacedWorker = new PacedWorkStream({
    concurrency: 8,
    workMS: 100, // 1000ms/sec / 100ms * 8 = 80 WCU
  }, function(line) {
    const uuid = line.toString();
    console.log('%s Begin %s', new Date().toISOString(), uuid);
    
    return docClient.update({
        TableName: TABLE_NAME,
        Key: { uuid: uuid },
        UpdateExpression: 'set #a = :v',
        ExpressionAttributeNames: { '#a': 'newFlag' },
        ExpressionAttributeValues: { ':v': true }
      })
      .promise()
      .then(() => {
        pacedWorker.countTag('update');
        console.log('%s End uuid:%s', new Date().toISOString(), uuid);
      })
      .catch(err => {
        console.warn(new Date().toISOString(), err);
      });
  });

PromisedLife([
  fs.createReadStream('uuid.txt'),
  new LineStream(),
  pacedWorker
])
.then(() => {
  console.log(pacedWorker.tagCounts);
})
.catch(err => {
  console.error(err);
});
```
Windows標準機能だけで文字列置換できた！

まったく予期していなかったのですが、Windows標準機能だけで、テキストファイルの文字列置換を行えるのですね。びっくりです。

次の2つのサイトが非常に参考になりました。

- [バッチファイルでテキストファイル内の文字列置換 - REONTOSANTA](http://knowledge.reontosanta.com/archives/816)
- [バッチファイル | テキストファイルを 1 行ずつ読み込む (完全版？) ( その他コンピュータ ) - Kerupani129 Project のブログ - Yahoo!ブログ](http://blogs.yahoo.co.jp/kerupani/15344574.html)

私が書いたWindowsバッチファイルは、次のようになりました。

```StringConverter.bat
@echo off
set basedir=%~dp0
set basename=%~n0
set batname=%~n0%~x0
set datestr=%DATE:/=%
set timestrtmp=%TIME: =0%
set timestr=%timestrtmp:~0,2%%timestrtmp:~3,2%%timestrtmp:~6,2%
set timestamp=%datestr%-%timestr%

:INIT
if "%1"=="/?" (
  echo 使い方：%batname% 入力ファイル 出力ファイル 置換前文字列 置換後文字列
  exit /b 0
)
if "%4"=="" (
  echo 引数の数が不正です。
  goto ERROR
)
set inpath=%1
set outpath=%2
set before=%3
set after=%4

:MAIN
call :LOG 処理開始します。


type nul > %outpath%
setlocal enabledelayedexpansion
for /f "tokens=1* delims=: eol=" %%a in ('findstr /n "^" %inpath%') do (
  set line=%%b
  if not "!line!" == "" (
    set line=!line:%before%=%after%!
  )
  echo.!line!>> %outpath%
)
endlocal


:END
call :LOG 正常終了です。
exit /b 0

:ERROR
call :LOG 異常終了です。
exit /b 1

:LOG
echo %DATE% %TIME% %basename% %1
exit /b 0

:EOF
```

このWindowsバッチファイルは、次のように実行します。

```
StringConverter.bat 入力ファイル 出力ファイル 置換前文字列 置換後文字列
```

入力と出力のサンプルです。

```入力サンプル.txt
サンプルデータです。
ShiftJIS、CRLFで記述されています。

空白区切り：カラム1 カラム2 カラム3
カンマ区切り：カラム1,カラム2,カラム3
タブ区切り：カラム1	カラム2	カラム3

;セミコロンで始まる行
```

```出力サンプル.txt
サンプルデータです。
ShiftJIS、CRLFで記述されています。

空白区切り：column1 column2 column3
カンマ区切り：column1,column2,column3
タブ区切り：column1	column2	column3

;セミコロンで始まる行
```
RubyOnRails初心者覚書

参考リスト
http://railsdoc.com/ruby_base
http://ref.xaio.jp/ruby/classes/array
http://qiita.com/mogulla3/items/46bb876391be07921743#3-w

文法注意点

1. ()を省略できる
2. 関数の名前の末尾の?「empty?」は慣習 
3. %や<<などの算術演算子を算術以外に利用 (後述参照)
5. シンボルは文字列を数値で表したもの文字列の代わりに利用する

```
 Symbol.all_symbols
```

#1. 変数の種類
|変数名|説明|
|:-:|:-:|
|foobar|ローカル変数|
|$foobar|グローバル変数|
|@foobar|インスタンス変数|
|@＠foobar|クラス変数|
|FOOBAR|定数|

#2. 文字列操作
1. エスケープ文字は「\」
2. toString()は「.to_s」、toInteger()は「.to_i」
3. 「"」で囲んだ値は「#{}」内部の変数が展開
　　例: #{hensu}
4. 文字列連結は「+」
5. 文字列比較は「==」
6. 文字コード変換は「str.encode("UTF-8")」
7. 末尾改行とるのは「str.chomp(separator = $/)」
8. 空文字かどうかは「empty? :」
9. 文字列の長さは「str.length,str.size」
10. 文字列のバイト長は「str.bytesize」

# 3.配列
1. 長さを調べるのは「array.length,array.size」
2. Indexの要素を取り出すのは「array.at(index)」
3. 繰り返し要素を取り出すのは「array.each {|item| block }」
4. 空かどうかは「array.empty?」
5. デフォルト値付きで要素取り出し
6. 並べ替えは「array.sort」

書き方色々

```
 arr = Array.new()
 arr = Array.new # 等価
 arr = [] # 等価
```
```
 hoge_0 = [1,2,3]
 hoge_1 = [[1,2,3],[4,5,6]]
 
　　arr = Array.new(3)
　　arr = Array.new(3, 1)
```

```
animals = ["dog", "cat", "mouse", "rabbit", "horse"]
puts animals.fetch(10, "unknown")
```


# 4.Hash
1.　長さを調べるのは「length」
2.　空かどうかは「empty?」
3.　指定したキーの要素を取り出すのは「index」
4.　キーが含まれるかは「has_key?」
5.　値が含まれるかは「has_value?」
6.　PHPのforeachは「select」や「each」 

```
scores.select {|k, v| v >= 60 }
```

```
scores = {}
scores["Alice"] = 80 

user = { :name => "test", :email => "test@example.co.jp"}
```
# 5.パーセント記法
## 5.1 $Q ダブルクォートで囲む
下記全て同じ意味

```
str = "Programming language "Ruby""
str = %(Programming language "Ruby")
str = %Q(Programming language "Ruby")
```

## 5.2 %q　シングルクォートで囲む
下記同じ意味かつ式展開されない

```
str = 'Programming language "#{ruby}"'
str = %q(Programming language "#{ruby}")
```

## %W　式展開ありの配列として展開
```
array = ["one","two","three","four"]
array = %W(one two three four)
```

## %I 要素がシンボルの配列として展開(式展開あり)
```
array = ["ruby","PYTHON","PHP"]
array = %I(ruby PYTHON PHP)
```

## %x コマンド出力
```
res = %x(date)
```

# 6.変数のInspect
1. 変数の中身を文字列で確認するのは「hoge.inspect」
2. オブジェクトのメソッド一覧を確認するのは「hoge.methods」
3. Step実行をするのは「pry」
Dockerでpumaを起動したとき、pumaのログの他にproduction.logなどもCloudwatch Logsに転送する


pumaが動くDockerコンテナでlog driverにawslogsを指定してCloudwatch　Logsにログを送るようにしたが、```production.log```も転送したいと思った。

DockerのENTRYPOINT、CMDで実行されたスクリプトはpid=1で起動するようなのでproduction.logを```/proc/1/fd/1```へのシンボリックリンクにした。

* Dockerfile

```
CMD /start.sh
```

* /start.sh

```
ln -fs /proc/1/fd/1 /app/log/production.log
bundle exec puma -C config/puma.rb
```

* Dockerのlogdriver設定

docker-compose.ymlの抜粋

```
　log_driver: awslogs
  log_opt:
    awslogs-group: hogehoge
    awslogs-region: リージョン
```
Deviseとomniauth-google-oauth2でrefresh_tokenが発行される条件を調べてみた


# 1.本記事の概要
[Devise](https://github.com/plataformatec/devise)と[omniauth-google-oauth](https://github.com/zquestz/omniauth-google-oauth2)を使ってGoogle認証機能を実現する際に、Googleからrefresh_tokenが発行される設定と発行されない設定をまとめてみたもの。

#2.調べた理由
Google APIを利用するときに必要となるaccess_tokenは、どの設定でも発行されることから、access_tokenの期限が切れる都度認証画面にアクセスしてaccess_tokenを得るようなシステムにすれば、Google APIは問題なく利用できる。
しかし、refresh_tokenを使ってaccess_tokenを発行させる方法はシステム側で処理が可能であり、この方法だとユーザーに余計な操作をさせずに済むことから、そのために必要となるrefresh_tokenが発行される条件を調べた。

#3.調査の前提条件
次の2つの作業を、4.の表に示した組み合わせをテストする前に毎回行った。

- ログイン前に、データベースに保存しているユーザー情報を削除する。
- ログイン前に「Googleアカウント情報 → ログインとセキュリティ → 接続済みのアプリとサイト → アカウントに接続されているアプリ」を開いて、テスト用プログラムの接続許可を取り消す。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/136890/9463fee8-9a3a-1c54-1a0f-b096aae77612.png "capture.png")



#4.問題となる設定とその結果
`omniauth.rb`に設定する`prompt`と`access_type`の2つで、この設定の組み合わせにより、refresh_tokenが発行されたりされなかったりする。
それぞれの設定の組み合わせによる結果は以下の表のとおりで、いずれの設定でも、access_tokenは発行される。



|                      | prompt: 設定せず | prompt: none           | prompt: consent | prompt: select_account |
|----------------------|------------------|------------------------|-----------------|------------------------|
| **access_type: online** | 発行されない     | 認証画面が表示されない | 発行されない    | 発行されない           |
| **access_type: offline** | 発行される       | 認証画面が表示されない | 発行される      | 発行される             |

#5.まとめ
`prompt`のデフォルトは上記の表の「設定せず」で、`access_type`のデフォルトは「offline」であることから、特段の設定を加えなければ、refresh_tokenは発行されるはず。

#5.その他参考
refresh_tokenを使ってaccess_tokenを得る方法は、以下のサイトに掲載されている。
[google-api-ruby-clientを用いて、Google Calendarにアクセスしてイベントを取得する - Qiita](http://qiita.com/tkm_kj/items/09f99234b3fb2d9d200c)
[Google APIのAccess Tokenをお手軽に取得する - Qiita](http://qiita.com/shin1ogawa/items/49a076f62e5f17f18fe5)
[OAuth2.0によるGoogle+ APIのアクセス方法](https://www.eisbahn.jp/yoichiro/2011/10/oauth2-0_google-api.html)
コミット前に Lint を強制するなら lint-staged が便利

![lint-staged_2017-04-30.gif](https://qiita-image-store.s3.amazonaws.com/0/104952/146edb44-8c6a-cce7-38d4-a4749c112131.gif)

## 前提

- Git
- Node.js & npm
- ESLint などの Lint ツール

## 目的

[lint-staged](https://github.com/okonet/lint-staged) を使うと、簡単にコミット前のファイルの Lint を強制できる。

`.git/hooks/pre-commit` ファイルに直接書いても良いが、 [pre-commit](https://github.com/observing/pre-commit) などのツールと連携させることで、`package.json` に設定を一元化できる。

## 方法

私のおススメは [ESLint](http://eslint.org) と [stylelint](http://stylelint.io) を使った :point_down: の設定。

```sh
$ npm install --save-dev eslint stylelint pre-commit lint-staged
```

```json:package.json
{
  "scripts": {
    "lint-staged": "lint-staged"
  },
  "pre-commit": [
    "lint-staged"
  ],
  "lint-staged": {
    "*.{js,jsx}": ["eslint"],
    "*.{css,scss}": ["stylelint"]
  }
}
```

ちなみに lint-staged の [README](https://github.com/okonet/lint-staged/blob/master/README.md) には、強制的にファイルを編集してコミットしてしまう方法も載っている。

```json:package.json
{
  "lint-staged": {
    "*.js": ["eslint --fix", "git add"]
  }
}
```

## [`pre-commit`](https://github.com/observing/pre-commit) の代わりに [`husky`](https://github.com/typicode/husky) を使う

(2017-04-30 追記)

`lint-stated@3.4` では `pre-commit` の代わりに `husky` を使う方法が推奨されていた。

```json:package.json
{
  "scripts": {
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "*.js": ["eslint --fix", "git add"]
  }
}
```

`husky` の方は `scripts` に記述できるので、以下のように `npm run` で確認できることがメリット。

```sh
$ npm run precommit
```

ただ `pre-commit` のように、コマンドを配列で指定はできない。
脆弱性スキャナVulsのスキャン結果をZabbixへ連携しアラート通知する

# はじめに

「[Zabbixに登録されたホスト情報を脆弱性スキャナVulsへ自動連携する](http://qiita.com/usiusi360/items/019a8d21dfcaf9698d49)」で少し触れましたが、Vulsでスキャンした結果のJSONファイルを加工（[Gist：vuls scan&zabbixにsend](https://gist.github.com/aomoriringo/2ec69042d8330dbce0ae6097288a6ce4)）することでZabbixに検知結果を連携することができます。

そしてZabbixへ連携し柔軟なトリガーと通知機能を使うことで、前回スキャン時との比較で検知数が増加した（新しい脆弱性を発見した）ときのみアラート通知する仕組みを作ることができます。


今回は自動運用するために以下のフローを一つのスクリプトで実行するようにします。

> 脆弱性情報(NVD・JVN)アップデート
> 　　↓
> Vulsでスキャン
> 　　↓
> Zabbixへ結果連携
> 　　↓
> Vuls JSONファイルのローテーション


「Vuls JSONファイルのローテーション」は[VulsRepo](https://github.com/usiusi360/vulsrepo)で結果を閲覧する際に、毎日スキャンしているとファイル選択ツリーが下に長くなるため、月ごとに一つのフォルダにまとめます。また、こうすることで月別に分析したい場合、選択が楽になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/54952/047bcff7-ec90-e649-b91d-60e3a0ba9b1c.png)

# 手順
## シェルスクリプト配置
https://github.com/usiusi360/vuls_autoscan_for_zabbix
にある「vuls_autoscan_for_zabbix.sh」をVulsの「ホームフォルダ」に置いて実行権限を付与します。

```
$ cd /opt/vuls
$ wget https://github.com/usiusi360/vuls_autoscan_for_zabbix/blob/master/vuls_autoscan_for_zabbix.sh
$ chmod 700 vuls_autoscan_for_zabbix.sh
```

スクリプト内のZabbixサーバのアドレスを環境に合わせて変更します。

```
$ vi vuls_autoscan_for_zabbix.sh
---------
#!/bin/bash
ZABBIX_SERVER="localhost" 　←★ Change
---------
```

zabbix-senderがインストールされていない場合は、インストールが必要です。

```
$ sudo yum install zabbix-sender
```

## Zabbix設定
https://github.com/usiusi360/vuls_autoscan_for_zabbix
にある「Template_Vuls.xml」をダウンロードし、ZabbixにインポートしあとVulsのスキャン対象ホストへリンクします。
尚、Zabbix2.4以降用になっています。2.2以前の場合は、トリガー式を修正してからインポートする必要があります。（「and」→「&」）


> \<expression>{Template Vuls:nvd_count.change()}&gt;0 **and** {Template Vuls:nvd_count.nodata(300)}=0\</expression>


## cronで自動実行
cronでシェルスクリプトを自動実行します。
尚、cronから実行すると「/etc/profile.d/」以下の環境変数は読み込まれないため、goの環境変数を読み込むため「bash -l」を付けてます。

```bash:/etc/crontab
0 13 * * * vuls-user bash -l /opt/vuls/vuls_autoscan_for_zabbix.sh > /tmp/vuls.log 2>&1
```

## 結果

正しく設定されていれば、Vulsのスキャン結果を元に「検知したCVEの数」と「検知したスコアの最大値」が収集されます。
そして前回チェック時から検知数が「増加した場合」にアラートとして検知できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/54952/f7bf2de8-b4f3-ac49-67e5-25c64e36f128.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/54952/bc8fd1eb-84a4-58be-e8e5-3c5704df5acb.png)


# さいごに

上記の仕組みを使うことで「新しい脆弱性を検知した時」だけ対応すれば良くなります。
そして[VulsRepo](https://github.com/usiusi360/vulsrepo)でスキャン時刻とCVE-IDを軸に分析することで、どのような脆弱性を新しく検知したか簡単に見つけることが出来ます。

![image](https://qiita-image-store.s3.amazonaws.com/0/54952/4413cf4a-3410-c69d-7999-73ebc097e233.png)
optimize-js を使って JavaScript コードを最適化してみる

## 追記

コメント欄に有用な情報をいただきました．どうやら構文的にパースのコストが増えるわけではないようです．また，optimize-js を使わなくても eslint の `--fix` で同様のことができるようです．

## optimize-js

GitHub のトレンドリポジトリで JavaScript のコードを最適化するというやつが話題になっていたので試しに使ってみ（ようとし）ました．

https://github.com/nolanlawson/optimize-js

```
$ npm install -g optimize-js
```

とすると，JavaScript のファイルを入力して最適化された JavaScript のコードを吐ける `optimize-js` というコマンドがインストールされます．

なんかすごそうなコマンドですが，実装を見てみた感じ，これは実際何をやっているかというと，

```
!function(){...}()
```

というコードを


```
!(function(){...})()
```

に置き換えているだけです．

多分 `!function(){}()` というコードは後ろの `}` まで到達しないと関数定義式かどうかが分からないため，関数のボディがデカくなるとトラックバックしてしまってパースに時間がかかるとかなんだろうなと思います．（ひどい話ですね…）どうやら関数をその場で呼び出すイディオム として`(function(){})()` と `!function(){}()` がメジャーであり，後者がやばいということらしいです．

リポジトリ author の主張によるとベンチマークで Chrome ではなんと __52%__ も高速化しているとのこと．

https://github.com/nolanlawson/optimize-js#benchmark-overview

手元のリポジトリ内の `node_modules` ディレクトリに grep をかけてみると `!function(){}()` というイディオムはそこそこ多用されていたので，試しに `optimize-js` を使ってみることにしました．

`browserify` で1つのファイルに bundle しているので話は簡単で

```
$ optimize-js build/bundle.js > build/bundle_optimized.js
```

とかすれば良いはず，なんですがエラーで動かず．どうやら ES2015 のコードでは動かないらしいです．

https://github.com/nolanlawson/optimize-js/issues/3

TypeScript を target ES2015 でコンパイルしてから browserify で結合していたのでまさしくこれでした．仕方ないので babel を使ってトランスパイルします．

```
$ npm install babel-preset-es2015 babel-cli
$ ./node_modules/.bin/babel --presets es2015 build/bundle.js > build/bundle_es5.js
$ optimize-js build/bundle_es5.js > build/bundle_optimized.js
```

が，やはりエラーが出る…ということで諦め．誰かエラー出ない人に試してほしい…

```
TypeError: undefined is not a function
    at walk (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/walk.js:17:16)
    at Object.skip (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/types.js:293:3)
    at walk (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/walk.js:17:16)
    at Object.exports.ReturnStatement (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/types.js:92:5)
    at walk (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/walk.js:17:16)
    at Object.skip (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/types.js:293:3)
    at walk (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/walk.js:17:16)
    at Object.exports.Program.exports.BlockStatement (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/types.js:25:5)
    at walk (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/walk.js:17:16)
    at Object.skip (/usr/local/lib/node_modules/optimize-js/node_modules/walk-ast/lib/types.js:293:3)
```
MPIでの動的配列クラス(std::vector)の送信(MPI_Bcast)

※この記事では，Ubuntu14.04サーバにインストールしたmpic++コンパイラで実行しています．

C++でのMPIの送信において，動的配列クラスvectorをやりとりする方法についてメモ．
Bcastでの送信にあたっては，プロセス間で送信(受信)する配列のサイズが一致している必要があるため，若干注意が必要です．

なお，MPIの基本関数については，このあたりで学びました．
MPIリファレンス：http://www.cv.titech.ac.jp/~hiro-lab/study/mpi_reference/index.html

まず，冒頭の共通部分はこちら．

```
#include <mpi.h>
#include <vector>
using namespace std;
int main(int argc, char** argv){
    MPI_Init(&argc, &argv);　//MPI開始
    int rank, procs;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &procs);
    const int SIZE = 10;　　//配列確保に使用
```

(1) まず，下記のような静的配列であれば特に問題は生じません．

```1.
    int dat[SIZE]; // 静的配列の確保
    if(rank==0){　　// プロセス0でデータを格納
        for(int i = 0; i < SIZE; i++){
            dat[i] = i;
        }
    }
    MPI_Bcast(&dat[0], SIZE, MPI_INT, 0, MPI_COMM_WORLD);　//プロセス0から他のプロセスへ送信
```

&dat[0]はdat.data()でも代用可能ですが，環境によってはうまく動かないので，&dat[0]で記述します．

(2) 次に，動的配列でそのまま入れ替えると，下記のようになりますが，うまくいきません．

```2.
    std::vector<int> dat; // 動的配列の宣言
    if(rank==0){
        for(int i = 0; i < SIZE; i++){
            dat.push_back(i);
        }
    }
    MPI_Bcast(&dat[0], SIZE, MPI_INT, 0, MPI_COMM_WORLD);
```

全プロセスでdatを宣言していますが，プロセス0でのpush_back後は，プロセス0と他のプロセスの配列datの長さは変わっているので，実行できません．” Signal: Segmentation fault (11)”などのエラーがでます．

(3) 元から，動的配列の長さを指定してしまえば，計算可能です．

```3.
    std::vector<int> dat(SIZE);　// 長さを指定した動的配列の宣言
    if(rank==0){
        for(int i = 0; i < SIZE; i++){
            dat[i] = i;
        }
    }
    MPI_Bcast(&dat[0], dat.size(), MPI_INT, 0, MPI_COMM_WORLD);
```
こちらは実行できますが，push_backは使えません(せっかくのvectorが，，最終行で，SIZEではなく，dat.size()で代替はしていますが，，)

(4) push_backを終えたあとに，配列の長さを全てのプロセスで揃えればよいので，

```4-1.
    std::vector<int> dat;
    if(rank==0){
        for(int i = 0; i < SIZE; i++){
            dat.push_back(i);
        }
    }
    dat.resize(SIZE);　// 各プロセスで配列の長さを指定
    MPI_Bcast(&dat[0], dat.size(), MPI_INT, 0, MPI_COMM_WORLD);
```

```4-2.
    std::vector<int> dat;
    if(rank==0){
        for(int i = 0; i < SIZE; i++){
            dat.push_back(i);
        }
    }
    int size0 = dat.size();　// 配列の長さを取得
    MPI_Bcast(&size0, 1, MPI_INT, 0, MPI_COMM_WORLD);　// プロセス0から他プロセスへ長さを送信
    dat.resize(size0);　// 各プロセスで配列の長さを指定
    MPI_Bcast(&dat[0], dat.size(), MPI_INT, 0, MPI_COMM_WORLD);
```

4-1は結局int SIZEを利用しているので，たいして3と変わらないか．．
4-2が応用しやすいとは思います．通信回数は2回に増えてしまいますが．

以上，まだまだ勉強中の身ですが，躓いた部分の試行錯誤の結果を整理しました．
D言語の時間の扱い

D言語の時間の扱いがよくわからないのでメモ。
固定フレームレートのメインループを実装したかっただけなのだけど・・・

# Time Points
時間軸の一点を指す。
4種類ある。

## SysTime
hnsecs精度のSystemClock。Timezone付き

```d
std.datetime.Clock.currTime();
```

現在時刻を取得するのはこれ。
https://dlang.org/phobos/std_datetime.html#.Clock.currTime

## Date
日付。Timezone無し。

```d
cast(std.datetime.Date)std.datetime.Clock.currTime
```

todayとか探していたら見つからなくて時間かかった。castだったとは。

## TimeOfDay
00:00:00 - 23:59.59。Timezone無し

```d
cast(std.datetime.TimeOfDay)std.datetime.Clock.currTime
```

## DateTime
Date + TimeOfDay。Timezone無し

```d
cast(std.datetime.DateTime)std.datetime.Clock.currTime
```

# Duration
* https://dlang.org/phobos/core_time.html#Duration

時間の長さの表現。
C#のTimeSpanにあたる。

dur関数で作れる。


```d
std.datetime.dur!"hours"(17)
```

もしくはTimePointsの引き算で作れる。

```d
std.datetime.TimeOfDay(17, 2)-std.datetime.TimeOfDay(16, 2)
```

特定の単位の数に変換するにはtotalを使う。

```d
auto h=std.datetime.dur!"hours"(1);
auto m=h.total!"minutes";
writefln("%s: %s", typeid(m), m);

|| long: 60
```

以下の単位(unit)がある。

* years
* months
* weeks
* days
* hours
* minutes
* seconds
* msecs
* usecs
* hnsecs
* nsecs

# Time Intervals
TimePointsを起点にした時間のレンジ。
Durationは単純に長さだが、Time Intervalは時間軸の範囲を指す。
あまり使わなさそうである。

# DurationとSysTimeの精度は100nsec
C#のTimeSpanのTickとかと同じ。
64bitで100nsecを保持すると
29,000 B.C.から29,000 A.Dを表現できるらしい。

# time_t
unix time.

```d
  auto t=std.datetime.Clock.currTime();
    printWithType(t);
    printWithType(t.toUnixTime);
    auto s=std.datetime.unixTimeToStdTime(t.toUnixTime);
    printWithType(std.datetime.SysTime(s));

|| std.datetime.SysTime: 2016-Oct-01 16:22:26.7489453
|| int: 1475306546 <- unix_time
|| std.datetime.SysTime: 2016-Oct-01 16:22:26
```

# std.datetime.StopWatch

https://dlang.org/phobos/std_datetime.html#.StopWatch

# FPS待ちクラス

```d
class FpsClock(int Target, int MarginMsecs = 5)
{
	import std.datetime;
	SysTime m_lastTime;

	static immutable Duration frameDuration=dur!"msecs"(1000/Target - MarginMsecs);

	this()
	{
		m_lastTime=Clock.currTime;
	}

        // loopの頭に呼ぶ
	Duration newFrame()
	{
		auto now=Clock.currTime;
		auto duration=now-m_lastTime;
		m_lastTime=now;
		return duration;
	}

        // loopの終わりで呼んで早すぎる場合にはsleepして待つ
	void waitNextFrame()
	{
		import core.thread;

		auto now=Clock.currTime;
		auto delta=now-m_lastTime;
		if(delta < frameDuration)
		{
			auto wait=frameDuration-delta;
			Thread.sleep(wait);
		}
	}
}
```
Clock.currTimeで実装してみた。
StopWatchの方が精度がよかったりするのだろうか。

```d
auto fps=new FpsClock!30
while(loop)
{
    auto delta=fps.newFrame();

    // rendering...

    fps.waitNextFrame();
}
```

# 終わり
とりあえず

```d
std.datetime.Clock.currTime
```

を押さえておけば他はドキュメントを見ればよい。

# 参考
* https://dlang.org/intro-to-datetime.html
* https://dlang.org/phobos/std_datetime.html
* http://dusers.dip.jp/modules/wiki/?SampleCodes%2FPhobos%2F%E6%99%82%E9%96%93%E6%93%8D%E4%BD%9C%2F5
THREE.TextureでテクスチャがneedsUpdateをtrueにしても、全然更新されなかった件

# 困った現象

THREE.TextureでテクスチャがneedsUpdateをtrueにしても、全然更新されなかった

# 原因

テクスチャサイズが2のn乗でない。

# 関連投稿

- [video要素のテクスチャでテクスチャサイズが2のn乗でないと怒られた時の対処方法 - Qiita](https://qiita.com/kjunichi/items/21381303438ab0066306)
- [THREE.CubeTextureLoaderでSkyboxする - Qiita](https://qiita.com/kjunichi/items/2d49da9e1b39af3a57aa)

# 関連記事

- [Three.jsでexamplesの高級車たちをblenderにExportしたが残念な結果に](https://abrakatabura.hatenablog.com/entry/2017/12/16/223318)
- [gopherくんのjsonデータがthree.jsのr85以降表示されなくてはまったjsonデータがthree.jsのr85以降表示されなくてはまった](https://abrakatabura.hatenablog.com/entry/2017/12/19/222952)
mitmproxyで特定URLへのHTTP/HTTPSの応答bodyを書換える

# はじめに
mitmproxy便利そうなのでCentOS7にインストールしてみた。
http://qiita.com/hkato/items/d0e10d500cde6e6e1695
で、自分がやりたかったことの一つはレスポンスボディを書き換えることなので、下記を参考にしていたのですが、
http://qiita.com/ikuo/items/c03e37bd5ef0c3ea8c10
こちらのスクリプトは一個のURLしか書き換えられないので、それを元に複数のURLを書き換えられるスクリプトを用意してみた。

# 環境設定
こちらなどを参考に
http://qiita.com/hkurokawa/items/9034274cc1b9e1405c68
http://qiita.com/ikuo/items/c03e37bd5ef0c3ea8c10

# スクリプト

こちらに起きました。
https://github.com/hkato/mitmproxy-replace-response-body

# 使い方
変換したいコンテンツをローカルに用意してください。

## 変換ルール
こんな感じでCSVファイルにリクエスト先のURLと変換先のローカルファイルのパスを書く。
Yahooトップページのアクセスがsample.htmlに変換される感じですね。

```text
"from","to"
"http://m.yahoo.co.jp/","sample.html"
"https://www.google-analytics.com/analytics.js","sample.js"
```

## 実行

```shell-session
$ mitmproxy -s "replace.py replace.csv"
```

## 結果
こんな感じになります。
iPhoneからYahooにアクセスすると…
<img width="320" alt="IMG_2307.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132537/8b069a35-eab2-3d55-073f-c2ffacae0219.png">

オリジナルのスクリプトの様にGoogle Analyticsにリンクが張ってるQiitaにアクセスすると…
<img width="320" alt="IMG_2308.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/132537/26564109-481e-1eb2-74e3-8ec19df54042.png">

# あとがき
運用中のサーバのレスポンスを書き換えてデザイン変更の様子を見てみる。なんて感じで使ってみようと思ってますが、よくよく考えたらApache+mod_proxyやNginxなんかでリバースプロキシーすれば静的コンテンツだけだったらいけたかも。
slimv.vim導入


# slimv.vim

EmacsのSLIMEのVim版です。

# 前提条件
以下のものがインストールされていることが必要です。
・OS : Windows 10 x64
・処理系 : Steel Bank Common Lisp 1.3.7
・Vim : 8.0 32bit版（NeoBundleインストール済み）

# 導入手順
１. gvimを起動して`:version`する。`python/dyn`の記述があればOK。
２. python 2.7.12 32bit版をインストール、パスを通しておく。
３. 再びgvimを起動して`:echo has('python')`を実行、`1`が返ってくればOK。
４. .vimrcに以下を追加

``` text:.vimrc
NeoBundle 'kovisoft/slimv'
```

５. NeoBundleInstallする。
６. テスト用プログラムを作る。

``` cl:hello.lisp
(print "hello slimv")
```

７. Vimでhello.lispを開くと、自動的にslimvがロードされる。
８. `,b`でバッファ全体を評価。SLIMEが立ち上がればOK。
unityWebRequestが返ってくるまで、システム全体を停止させるコルーチン

タイトルの通りです。JokerScriptなどのラノベゲームなどで、リクエストを行う際に使いました。

```csharp
    public IEnumerator GetTexture()
    {
        UnityWebRequest www = UnityWebRequest.Get("https://localhost:8000");
        
        AsyncOperation checkAsync = www.Send();
        
        while (!checkAsync.isDone);

        if (www.isError)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log(www.downloadHandler.text);
        }

        yield return null;
    }

```

##結果
~~うまく動作しました~~後日再度確認してみるとうまく動作をしませんでした。現在調査中です。

[参考コード](https://katvharris.azurewebsites.net/blog/unity-luis-json/)

#再度挑戦！！
どうやらコルーチンの呼び出し方法はStartCoroutine()だけじゃないようです。
以下のようにMoveNext()を使って上のGetTexture()を呼び出したらうまくいきました！

```

    public void GetRequest()
    {
        IEnumerator coroutine = GetTexture();
        coroutine.MoveNext();
    }

```

[参考](http://naochang.me/?p=202)
PowerShell から IFTTT 経由で LINE Notify

PowerShell から LINE できるようにしてみた。

* 元ネタ：[YappoLogs: LINE Notify で line command 作ると便利](http://blog.yappo.jp/yappo/archives/000851.html)

なお、サービス登録が面倒だったので、IFTTT 経由でやっている。ちゃんと使う人はサービス登録したほうが良いと思う。


# 使ってみた感じ

下記リンク先のファイルを作って動かす。（動かすには、IFTTTで調べて`throw "Your key"`の所に自分のキーを設定する必要がある）

* `Write-Line.ps1`
    * https://gist.github.com/yumura/428570d4b02a82b511fd5a194d6e68dc

```
PS C:\demo\line> ls -name
Write-LINE.ps1
```


## メッセージ

下記の通り、パイプでメッセージを送れる。

```
PS C:\demo\line> 1..3 | .\Write-LINE.ps1
```

![line1.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/4daea2c5-6fc3-662d-7c4a-ea3501dc11d1.png)

実装としては、パイプ経由で受け取った値を累積して、LINEに出力している。


## 標準出力もする

上記の実行では、標準出力になにも出力されなかったが、下記のように、`PassThru`スイッチを指定すると標準出力しつつ、LINEできる。

```
PS C:\demo\line> 1..3 | .\Write-LINE.ps1 -PassThru
1
2
3
```

![line2.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/140fff1e-7f62-1876-a8a6-fcbabc5b0bb1.png)


実装としては、累積せずに標準出力しているので、標準出力のほうがLINEより早く出力される。


## 区切り文字を変える

下記の通り、区切り文字を変えられる。

```
PS C:\demo\line> 1..3 | .\Write-LINE.ps1 -Delimiter ', '
```

![line3.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/f0569115-4acc-3467-5fc6-38f84a2d133e.png)


## タイトル

下記の通り、タイトルを付けられる。

```
PS C:\demo\line> "メッセージ" | .\Write-LINE.ps1 -Title "タイトル"
```

![line4.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/7036c8fd-0f6c-378f-b57c-00649c36bc40.png)


実装としては、`Title`で指定された文字列を、累積する最初の要素として扱っている。実質不要。なんとなく実装してしまった。


## 画像を送る

下記の通り、画像のURLを指定すると画像が送れる。（何も考えずQiitaでの自分のアイコン画像を送ったが、直リンとか怒られそうだなぁ…と今更思った。）

```
PS C:\demo\line> .\Write-LINE.ps1 -Title "アイコン" -PhotoURL "https://qiita-image-store.s3.amazonaws.com/0/36744/profile-images/1473687185"
```

![line5.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/87289b33-adec-0cfa-99eb-c7eca005fe39.png)


# IFTTTの設定

下記のような感じで、if Maker then LINE で作る。

![if_Maker_then_LINE.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/fa7bfc5b-645b-9f2e-ec3d-e8ea2f2ec8b7.png)

## Trigger

`Event Name`はテキトーに`Write-LINE`にしてある。

![Trigger.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/1b4a3967-2a2e-989f-914e-d6f1885878ae.png)


## Acction

下記の通り設定した。（value1 をメッセージ、value2 を画像URLとして扱う。）

![Action.PNG](https://qiita-image-store.s3.amazonaws.com/0/36744/3b3c31f8-8f8b-4da3-78f7-262aca33bb84.png)


## キーの設定

下記のGistに貼っつけたコードは、そのままでは動かずキーを設定する必要がある。キーは[Connect Maker to hundreds of apps - IFTTT](https://ifttt.com/maker)で調べて、コードの`throw "Your key"`の箇所を書き換えて貰えれば良い。

* `Write-Line.ps1`
    * https://gist.github.com/yumura/428570d4b02a82b511fd5a194d6e68dc
Angular2 新規プロジェクト作成のベストプラクティス

今からAngular2を始める人のための新規プロジェクト作成のベストプラクティス

（nodeとnpmはインストールされている前提です）

    npm i -g angular-cli
    mkdir -p sample
    cd sample
    ng init
    ng serve

ブラウザでアクセスする。

以上。
word page counter

Option Explicit
Call Main()
Sub Main()

  Dim out, folderPath, fso, ts
  
  ' パラメタを取得
  If Wscript.Arguments.Count = 0 Then
    folderPath = "."
  Else
    folderPath = Wscript.Arguments(0)
  End If
  
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  ' サブフォルダに対して、再帰的に処理する
  out = WordPageCounter(fso, fso.GetFolder(folderPath))
  
  ' 検索結果をCSVファイルに出力
  Set ts = fso.CreateTextFile(folderPath & "\" & "WordPageCounter.csv")
  ts.WriteLine(out)
  ts.close
  Set ts = Nothing
  
End Sub

' サブティレクト内のファイル一覧を取得する
Function WordPageCounter(fso, folder)
  
  Dim file, returnValue, Subfolder
  
  returnValue = ""
  
  ' 現在のフォルダ配下のwordファイルを探す
  For Each file in folder.Files
    returnValue = returnValue & BuiltInDocProperty(fso, file.path)
  Next
  
  ' folder配下のフォルダを列挙する
  For Each Subfolder in folder.SubFolders
    ' 再帰呼び出し
    returnValue = returnValue & WordPageCounter(fso, Subfolder)
  Next
  
  WordPageCounter = returnValue
  
End Function

Function BuiltInDocProperty(fso, filepath)

  Dim ext
  ext = UCase(fso.GetExtensionName(filepath))
  ' wordファイル以外は何もしない
  If Not (UCase(ext) = "DOC" OR ext = "DOCX") Then
    Exit Function
  End If
  
  ' wordアプリケーションを起動
  Dim wordApp : Set wordApp = WScript.CreateObject("Word.Application")
  ' wordファイルを開く
  Dim doc : Set doc = wordApp.Documents.Open(filepath)

  ' for debug
  WScript.Echo filepath & "," & doc.BuiltInDocumentProperties(14)
  
  ' ファイル名、ページ数をカンマ区切りにして返す
  BuiltInDocProperty = filepath & "," & doc.BuiltInDocumentProperties(14) & vbNewLine

  ' wordアプリケーションの終了
  doc.Close
  Set doc = Nothing
  wordApp.Quit
  Set wordApp = Nothing
End Function