OmniAICreator/Qiita-1.07M huggingface dataset:
ハンバーガーメニューデザインの提案 Ver.2

# 最初に
[前回](https://qiita.com/qwerty8t/items/2aa1c91e15aeb504df9c)に引き続きバージョン2を作成

ハンバーガーメニュー作成の前にメニューデザインについていろんなWebサイトを調べてみた．
メニューを全画面に配置しているのが最近の流行りだと感じた．
そこで，今回は全画面に表示されるメニューを作成．

以下，全画面表示されるハンバーガーメニューが実装されているWebサイトリンク．

- [https://www.feudi.it/](https://www.feudi.it/)
- [http://anagram.paris/](http://anagram.paris/)
- [http://zz-is.it/electrica/](http://zz-is.it/electrica/)


# DEMO
![gif](https://qiita-image-store.s3.amazonaws.com/0/207520/4f61a5eb-2689-1dd3-edba-68617f2a451b.gif)

[codepen](https://codepen.io/qwerty8t/pen/gXPpaY)
[github](https://github.com/Ut0n69/hamburgerMenuDemo/blob/master/demo2.html)

今回はハンバーガーをクリックすると上部から垂れてくるメニューを作成．


# 中身の説明

## 下が丸い長細い棒が上から5本落ちてくるイメージ

```html:html
<div class="hbg-menu-contents">
  <div class="ball1"></div>
  <div class="ball2"></div>
  <div class="ball3"></div>
  <div class="ball4"></div>
  <div class="ball5"></div>
</div>
```


## クリック前は画面外に隠している

```css:css
position: fixed;
top: -100px;
width: 20%;
height: 100px;
border-bottom-left-radius: 500px;
border-bottom-right-radius: 500px;
```


## 縦長の棒の横の長さを20%として，それぞれ20％ずつずらして配置

```css:css
.ball1 {
   left: 0;
}
.ball2 {
   left: 20%;
}
.ball3 {
   left: 40%;
}
.ball4 {
   left: 60%;
}
.ball5 {
   left: 80%;
}
```

## クリック後に縦の長さを伸ばしている

```css:css
height: 200%;
```

## JavaScriptで落下のタイミングをずらしている

```js:js
setTimeout(() => {
    $(".ball1").toggleClass("open");
  }, 100);
  setTimeout(() => {
    $(".ball2").toggleClass("open");
  }, 150);
  setTimeout(() => {
    $(".ball3").toggleClass("open");
  }, 200);
  setTimeout(() => {
    $(".ball4").toggleClass("open");
  }, 250);
  setTimeout(() => {
    $(".ball5").toggleClass("open");
  }, 300);

  setTimeout(() => {
    $(".menu").toggleClass("active");
  }, 400);
})
```

# 最後に
知らないうちにハンバーガーメニューはとても進化していた...

以上
PyTorch の Dockerfile に Opencv もインストールして使えるようにする

# PyTorch を nvidia-docker で動かしてみたかったので、やってみた。
ホスト OS は，Ubuntu16.04 です．

## PyTorch の Dockerfile
PytTorch の Docker 環境は，公式のリポジトリにあるので，まずは git clone

```.sh
git clone https://github.com/pytorch/pytorch
```

## インストールする Python の Version を変更
これは，Opencv をインストールするために必要な作業で，Opencv3 が，python3.6 に対応していない&上記の Dockerfile は，python3.6 をインストールするように設定されている．

```Dockerfile
ENV PYTHON_VERSION=3.6
```

を

```Dockerfile
ENV PYTHON_VERSION=3.5.2
```

こう。

## Opencv をインストールするように Dockerfile に追記．

```.sh
pip install opencv-python
```

普段なら上記のようにしてインストールするのですが，今回はこれではインストール後正常に動作しなかったので，conda からインストールします．

```Dockerfile
conda install --name pytorch-py$PYTHON_VERSION -c https://conda.anaconda.org/menpo opencv3 
```

公式の Dockerfile では，miniconda のインストール後に，上記で指定した PYTHON_VESHRSION の仮想環境を作って，そこで Pytorch が動くようになっているので，その仮想環境上に Opencv をインストールするようにしています．

これでめでたく PyTorch と opencv が動く Docker 環境が構築できます．
Dockerfile 全体は下記の通りです．

https://gist.github.com/ohnabe/45358031d60c97ab101e912f06f648bb
CSVからTextile|Markdownテーブル変換ブックマークレット

csv文字列を選択⇒ブックマークレット起動⇒変換後の文字列がプロンプトへ出力される
※区切り文字はエクセルからコピペすることを意識してタブ文字です。
このコードは以下コードを使用しています。
[JavaScriptでCSV読み込み(ダブルクォート内でのセル内改行に対応) - Qiita](https://qiita.com/momosetkn/items/869aa22ab10f0ec5a529)

#CSV2TextileTable

```js
javascript: (function () { var csvToArray = function (csvString) { var separator = '\t'; var columnSize = csvString.split(/\r\n|\r|\n/)[0].split(separator).length; var chars = Array.from(csvString.replace(/\r\n|\r|\n/g, '\n')); var csvList = []; var list = []; var queteOpenFlg = false; var buf = ""; for (var i = 0; i < chars.length; i++) { console.log(columnSize); if (chars[i] == '"') { queteOpenFlg = queteOpenFlg == false; } else { if ((chars[i] == separator || chars[i] == '\n') && !queteOpenFlg) { list.push(buf); buf = ""; if (list.length == columnSize) { csvList.push(list); list = []; } } else { buf += chars[i]; } } } console.log(csvList[0][0]); var csv = {}; csv.dataList = []; for (var i = 0; i < csvList.length; i++) { if (i == 0) { csv.header = csvList[i]; } else { csv.dataList.push(csvList[i]); } } return csv; }; var sel = window.getSelection(); if (!sel.rangeCount) return; var csv = csvToArray(sel.toString()+'\n'); var wikiString = "|_." + csv.header.join("|_.") + "|\n"; for (var i = 0; i < csv.dataList.length; i++) { wikiString += "|" + csv.dataList[i].join("|") + "|\n"; } javascript: void prompt('Make Textile Table', wikiString); })();
```

#CSV2MarkdownTable

```js
javascript: (function () { var csvToArray = function (csvString) { var separator = '\t'; var columnSize = csvString.split(/\r\n|\r|\n/)[0].split(separator).length; var chars = Array.from(csvString.replace(/\r\n|\r|\n/g, '\n')); var csvList = []; var list = []; var queteOpenFlg = false; var buf = ""; for (var i = 0; i < chars.length; i++) { console.log(columnSize); if (chars[i] == '"') { queteOpenFlg = queteOpenFlg == false; } else { if ((chars[i] == separator || chars[i] == '\n') && !queteOpenFlg) { list.push(buf.replace(/\n/g, '<br>')); buf = ""; if (list.length == columnSize) { csvList.push(list); list = []; } } else { buf += chars[i]; } } } console.log(csvList[0][0]); var csv = {}; csv.dataList = []; for (var i = 0; i < csvList.length; i++) { if (i == 0) { csv.header = csvList[i]; } else { csv.dataList.push(csvList[i]); } } return csv; }; var sel = window.getSelection(); if (!sel.rangeCount) return; var csv = csvToArray(sel.toString() + '\n'); var wikiString = "|" + csv.header.join("|") + "|\n"; for (var i = 0; i < csv.header.length; i++) { wikiString += "|:----"; } wikiString += "|\n"; for (var i = 0; i < csv.dataList.length; i++) { var line = "|" + csv.dataList[i].join("|") + "|\n"; wikiString += line; } javascript: void prompt('Make Markdown Table', wikiString); })();
```
Vagrant up / reload でNICがエラーを吐くようになった話


### 環境
 - ホスト : OS X 12(Sierra)
 - ゲスト : CentOS 6.4

## 何がどうした

しばらく起動しっぱなしにしていたVMを再起動したところ、エラーが出るようになりました。

```
...
インターフェース eth0 を終了中:  [  OK  ]
ループバックインターフェースを終了中  [  OK  ]
ループバックインターフェイスを呼び込み中 [  OK  ]
インターフェース eth0 を活性化中:  
eth0 のIP情報を検出中... 完了。
[  OK  ]
インターフェース eth1 を活性化中:  Determining if ip address 192.168.10.10 is already in use for device eth1...
[  OK  ]
インターフェース eth2 を活性化中:  デバイス eth2 は存在しないようですので、初期化を遅らせます。
[失敗]
インターフェース eth3 を活性化中:  デバイス eth3 は存在しないようですので、初期化を遅らせます。
[失敗]
...
```

これ。

プライベートネットワークとして利用している`192.168.10.10`はeth1で設定できているようですが、eth2とeth3の起動に初期化に失敗している様子。

いやそもそもeth2とeth3って使った覚えがない。
`ifconfig`の結果にも出てきません。

というわけで、以下の作業を実施。

```
# VMにログイン
$ vagrant ssh

# eth2とeth3を削除
$ sudo rm /etc/sysconfig/network-scripts/ifcfg-eth2 && sudo rm /etc/sysconfig/network-scripts/ifcfg-eth3

# VMから抜ける
$ exit

# VMを再起動
$ vagrant reload
```




**復☆活(暫定)**


---

なぜeth2、eth3なんて追加されていたのかは謎。
場当たり的な対応なので根本解決していない点はご容赦ください。
ドキュメントからシェルコードをコピペする時にプロンプト記号を消す



よくドキュメントなどのシェルコマンドでプロンプト(ドルマーク)記号が付いている事があります。
トリプルクリック(行選択)や範囲選択でコピペして使うときにちょっと煩わしいと思ってたので作りました。
ちなみに MacOS 環境です。


### ターミナルで叩く場合

```shell-session
$ pbpaste |sed 's/^\$ //' |pbcopy
```

↑まさにこの記号のこと。
複数行でもいけます。


###Alfred workflow での解決
https://github.com/elzup/deldol-workflow/tree/master


プロンプトはシェルコマンドであることの明示になり、コードハイライトにも使われているので、ドキュメント自体からから取り除く方向の解決は難しいのかもしれません。
ターミナルやシェル側で $ を含んだ文も実行できるようにするみたいな方向はありかもしれません。(自分の環境に依存が出来てしまうので良くなさそうですが)
raspberry piのbluetoothを使えるようにする

まずは、`bluetooth`パッケージをインストール。

```
$ sudo apt-get install -y bluetooth
$ reboot
```

これだけだと、下記のようなエラーになる。

```
$ bluetoothctl
[bluetooth]# scan on
no default controller available
```

`Raspberry Pi`用のパッケージである`pi-bluetooth`をインストール。

```
$ sudo apt-get install -y pi-bluetooth
$ reboot
```

```
$ bluetoothctl
[NEW] Controller B8:27:EB:1E:79:92 raspberrypi [default]
[bluetooth]# scan on
Discovery started
[CHG] Controller B8:27:EB:1E:79:92 Discovering: yes
[NEW] Device 68:64:4B:29:84:F0 68-64-4B-29-84-F0
[NEW] Device 72:BE:DA:27:3C:AA 72-BE-DA-27-3C-AA
[CHG] Device 72:BE:DA:27:3C:AA RSSI: -79
[CHG] Device 68:64:4B:29:84:F0 RSSI: -60
[CHG] Device 68:64:4B:29:84:F0 RSSI: -69
```

BlueToothのGUI設定ツールをインストール。

```
$ sudo apt-get install -y blueman
```

`Menu => Preferences => Bluetooth Manager`で起動。

![スクリーンショット 2017-11-06 16.36.20.png](https://qiita-image-store.s3.amazonaws.com/0/172314/8a235b11-3b95-d59e-501b-329d6ce98b62.png)
Invalid argument supplied for foreach()

# 概要

PHPで出してしまったエラーで一度詰まったので、対応を書いておく。

# どんな意味か

foreach文では本来、オブジェクトか配列を指定して繰り返し処理を行うが、
指定された変数がそのどちらでもない場合にこのエラーをはく。


# 問題の切り分け

## getypes()を使って型が適正かを判定
これに尽きます。そもそも引数としている変数が正しいのならこのようなエラーは起こらない。
ただし、なぜ思ったものと違う型になってしまうのかは追調査する必要あり。

keyとvalueの両方を指定している場合はどちらも型を調査する。

## 追調査
型変換をしているところや型の相互変換がされてしまうところを中心に見ると良い。
その辺りの詳しいところについては[公式ドキュメント(型の相互変換)](http://php.net/manual/ja/language.types.type-juggling.php)へ。


# 参考

[PHP公式ドキュメント foreach](http://php.net/manual/ja/control-structures.foreach.php)
phpenvでprotobufをインストールする方法

# protocを取得する

```bash
brew install protobuf
```

# peclから圧縮ファイルを取得する

http://pecl.php.net/package/protobuf
から欲しいバージョンのtgzを確認する
今回は3.4.0をインストールします

```bash
cd /tmp
wget http://pecl.php.net/get/protobuf-3.4.0.tgz 
tar zxvf protobuf-3.4.0.tgz
cd protobuf-3.4.0
phpize
./configure
make
make test
make install
```
〜備忘録〜 SCIP scipoptsuite-4.0.0をMacにインストール

#SCIP4.0.0ダウンロード

[SCIP](http://scip.zib.de)の公式サイトに飛んでSCIP Optimization Suiteを選択。scipoptsuite-4.0.0.tgzをダウンロード。

#コンパイル
*tar fzxv scipoptsuite-4.0.0.tgz*  #ダウンロードしたversionに合わせて書き直す
*cd scipoptsuite-4.0.0*
*make*

ここでエラー発生
*fatal error: 'gmp.h' file not found*
*#include "gmp.h"*
         *^~~~~~~*
*1 error generated.*
*make[3]: *** [obj/O.darwin.x86_64.gnu.opt/lib/changesoplex.o] Error 1
*make[2]: *** [makelibfile] Error 2*
*make[1]: *** [/Users/t_taka/Downloads/scipoptsuite-4.0.0/soplex-*3.0.0/lib/libsoplex.darwin.x86_64.gnu.opt.a] Error 2*
*make: *** [scipbinary] Error 2

gmp.hファイルが見つからないというエラー。

ここで次の方法を試した。

#「fatal error: 'gmp.h' file not found」への対処

*cd /usr/local/include/*
*ls*

を実行してgmpがないことを確認。gmpをインストールする。

*brew install gmp*

※homebrewは
>wikipedia<「Mac OS Xオペレーティングシステム上でソフトウェアの導入を単純化するパッケージ管理システムのひとつである」

>実行ファイルや設定ファイル、ライブラリetcを一つのファイルとしてまとめているものをパッケージと呼びます。
>パッケージ管理システムとはこのパッケージのインストール（アンインストール）作業を一元的管理するものです。パッケージやライブラリの依存関係などが管理できます。
ちなみにパッケージ管理には、

>バイナリを取得するもの
ソースコードを取得してビルドするもの
のパターンがあるみたいです。
1バイナリとはソースコードを予めビルドした成果物を配布していることを指すようです。
なので1バイナリは2ビルドよりも早くインストールできる特徴を持っているようです。
それに対して2ビルドは、自分のmacでビルドするので自分のmacに最適化出来る特徴を持っているようです。


しかしまた以下のエラーが発生する

*Homebrew must be run under Ruby 2.3! You're running 2.0.0. (RuntimeError)*


ここで適当にRubyのバージョンが古いと出ているがとりあえず以下のコマンドでhomebrewをアップデート

*brew update*

再び

*brew install gmp*

を実行すると

*user:include t_taka$ brew install gmp*
*==> Downloading https://homebrew.bintray.com/bottles/gmp-**6.1.2_1.sierra.bottle.t*
*######################################################################## 100.0%*
*==> Pouring gmp-6.1.2_1.sierra.bottle.tar.gz*
*🍺  /usr/local/Cellar/gmp/6.1.2_1: 18 files, 3.1MB*

ここでscipoptsuite-4.0.0の再びディレクトリに移動

*cd scipoptsuite-4.0.0*

*make*

コンパイルをすると

〜〜〜略

** Build complete.*
** Find your SCIP binary in "/Users/user_name/Downloads/scipoptsuite-4.0.0/scip-4.0.0/bin".
** Enter "make test" to solve a number of easy instances in order to verify that SCIP runs correctly.


と表示されてビルドが成功する。

以下を実行してテストを実行。

*make test*

正常に動作終了。

ここで/usr/local/にインストールする

*cd scip-4.0.0
make install INSTALLDIR=/usr/local/*

これでscipというコマンドをターミナル上で入力することによって、scipが動作するようになる。
Rails のコンソールに SQL を表示する

## はじめに
とある巨大な処理をEC2で `rails console` を立ち上げて走らせると、

```
Mysql2::Error: MySQL server has gone away
```
となりサーバーがゴーンアウェイしてしまいました。
どの SQL を走らせた時にゴーンアウェイしたか調べようとしたものの、私の環境では Rails のコンソールにデフォルトで SQL 文が表示されませんでした。<br>

問題解決のために SQL を表示させる必要があったのと、
今後もこのコマンドにお世話になると思うのでメモとして(別にぐぐったら出てるくんだけどね)

## 実装
コンソール上で下記コマンドの入力で終了。

```
ActiveRecord::Base.logger = Logger.new(STDOUT)
```
## まとめ
これでどの SQL 文が実行された時に問題が発生したのかわかるようになりました。
が、そもそもゴーンアウェイしないように DB に優しいコードを書かないといけないので気をつけましょう！(自戒を込めて)
### 追記
ちなみに SQL を非表示にする時は下記

```
ActiveRecord::Base.logger = nil
```
エックスサーバーにa-blog cmsを手作業で設置すると500エラーになる場合の対処

## 結論から

「php.ini直接編集」でPHP設定を変更する際、以下のように**「opcache.so」よりも下の行**にionCubeローダーのパスを書くと500エラーになります。

```php.ini
[Zend Optimizer]
zend_extension = opcache.so
zend_extension = "/home/myid/mydomain.com/public_html/ioncube/ioncube_loader_lin_5.6.so"
```

以下の通り、**「opcache.so」よりも上の行**に書いてください。

```php.ini
[Zend Optimizer]
zend_extension = "/home/myid/mydomain.com/public_html/ioncube/ioncube_loader_lin_5.6.so"
zend_extension = opcache.so
```

## 原因

エックスサーバーのsv2000以降のサーバーでは、高速化のため、OPcacheというPHPの拡張モジュールが実装されています。
この処理よりも後に暗号化を実行しようとすると、エラーとなるようです。

APC/OPcacheについて | レンタルサーバー【エックスサーバー】
https://www.xserver.ne.jp/manual/man_server_php_apc.php

エックスサーバーにかぎらず、Vagrantの仮想環境など、OSレベルからセットアップしているサーバーへインストールする場合は、この問題が起きやすいので注意してください。

## 簡単セットアップは大丈夫？

開発元が提供している「簡単セットアップ」は、[Zend Optimizer]の行の直後にionCubeローダーのパスが挿入されるようになっているため、この問題は起きません。

簡単セットアップで500エラーが出る場合は、ダウンロードに失敗している、php.iniの書き換えに失敗しているなどの、別の原因が考えられます。
node-ffi 使い方メモ おまけExpressから実行時にハマったメモ

#共有ライブラリを使いたかった
調べてみるとnode-ffiというモジュールで実行できるとのこと。
しかしなかなかハマったのでメモ

#仮定
仮にMylib.dllというC言語で書かれたdllがこのスクリプトと同じディレクトリにあるとします

Mylib.dllは以下の様な関数があります。
関数名→RepeatTxt
引数1→char*で文字列のメモリポインタ
引数2→int32で繰り返す回数を指定
返り値→char*でテキストを指定回数繰り返した文字列のメモリポインタが帰ってくる

この関数に引数を渡して、返ってきた文字列をコンソールログするみたいな想定で行きます。

#まずは関数定義
ffiでライブラリを使う場合はまずライブラリにある関数をJS上で定義します。

```js
　　dll = "ライブラリのパス"
    mylib = ffi.Library(dll, {
        '関数名': ["返り値の型", ["引数1の型", "引数2の型"]],
    })
```

今回の場合は以下の様な感じ

```js
　　dll = "./MYlib"
    mylib = ffi.Library(dll, {
        'RepeatTxt': ["pointer", ["pointer", "int32"]],
    })
```
pointerはそのままメモリのポインタのことです。char*はpointerでもchar*でもOK

#実行する

```js 

var output = mylib.RepeatTxt("テスト", 2)//これじゃ動かない

```
こんな感じで実行したくなりますが、これではだめです。
”テスト”はポインタじゃない・・・・

#引数を作る
node-ffiは賢いモジュールなのでバッファー型のオブジェクトを渡してあげればそこからポインタを抜き出してライブラリに渡してくれます。
なので、char*の引数を作るには

```js
var txt = "テスト"
var txt_buf = Buffer.from(txt, "utf8")

```

こんな感じにして文字列からバッファを生成します。

ちなみにint32は普通にNumber型を渡しても問題ないです。

```js 

var output = mylib.RepeatTxt(txt_buf, 2)

```

これでやっと実行することが出来ます。

#返り値を取り出す。
上記のように実行した場合、outputにメモリのポインタが格納されます。
これを普通に出力すると、12　とか　よくわからないものが返ってきます。
ポインタから文字列に変換するしくみが必要です

そこでrefというモジュールの登場です。
これはメモリポインタの取得や読み込みに関するモジュールで、
ffiで取得したポインタからいい感じに値を取り出したり出来る見たいです。
いろいろ使い道はあるようですが、私は以下の使い方しかわかりません、

refモジュールを使って値を取り出します。

```js

var result = ref.readCString(output)

```

"readCString"関数はC言語はC++で記述されたChar*のメモリポインタを読み込んでJSの文字列に変換してくれるみたいですね。

くっつけるとこんな感じ

```js

var ref = require("ref")
var ffi = require("ffi")

dll = "./MYlib"
mylib = ffi.Library(dll, {
    'RepeatTxt': ["pointer", ["pointer", "int32"]],
})

var txt = "テスト"
var txt_buf = Buffer.from(txt, "utf8")

var output = mylib.RepeatTxt(txt_buf, 2)

var result = ref.readCString(output)

console.log(result)

```

#おまけ
おまけでさらにハマったのがExpressから実行するとライブラリが読み込め無かったこと。
コマンドライン実行では問題ないのですが、Expressから実行するとなぜかダメ
結果的に、child_processを使って実行するようにしたら問題なく動きました。

もう一つ、child_processで実行後、その返り値のポインタをExpress側に返した場合、どうもメモリが上書きされるみたいで、ref.CString()しても正常に読み込むことが出来ませんでした。
なので、子プロセス側でref.CString()してやって、文字列にしてからExpress側の戻す必要があるようです。

あと、関数の宣言時点でエラーを吐いてる場合は
・ライブラリのパスが間違っている（見えていないことも）
・ライブラリとnode.jsの実行環境bit数が違う
ことがよくあるみたいです。

#追記
ffiから返却される値がメモリポインタだった場合、そのメモリポインタの指す先のメモリの中身がガベージコレクトの対象になる場合があるみたいです。

ref.CString(pointer)←あくまでnode.jsから直接参照するのは変数pointerであって、その先のメモリの中身はメモリ解放しても問題ないものとして扱われているのかな？と思います。

#参考
https://github.com/node-ffi/node-ffi/wiki/Node-FFI-Tutorial
https://tootallnate.github.io/ref/
Linux OSでPostgresqlを使う方法

#Kubuntu OSでPostgresqlを使う方法を順番にまとめていきます。
konsoleからコマンドを入力していきましょう。
まずは、参考になるページがこちらです。
つぎのエラーが出ます。
psql: FATAL:  peer authentication failed for user "postgres"
kubuntuはDebianという仲間になるので以下が参考になります。
[Postgresqlの公式サイト]('https://www.postgresql.org/download/linux/debian/')
[とりあえず動いたものはこちら]('http://suite.opengeo.org/docs/latest/dataadmin/pgGettingStarted/firstconnect.html')
Arrays.asList(int[]).contains(int) がうまく動かない

int[] で宣言した 配列を Arrays.asList に渡して contains したけど思った動作にならない。

```java
int[] array = {1, 2, 3, 4, 5};
Arrays.asList(array).contains(3)
-> false
```

いろいろ探したけど、int[] ではなく Integer[] で配列を宣言すると思った動作になる。

```java
Integer[] array = {1, 2, 3, 4, 5};
Arrays.asList(array).contains(3)
-> true
```
bitbucket公開鍵認証でパスフレーズの入力を省略する

#備忘録
ssh-agentを使ってパスフレーズの入力をgit-bash初回起動時のみ求められるように変更する．

「eval 'ssh-agent'」ではなく「eval "$(ssh-agent)"」とする必要がある．ここにハマってしまって中々うまくいかなかったので備忘録として残しておく．


```shell-session
$ eval "$(ssh-agent)"
Agent pid @@@@
$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /c/Users/***/.ssh/id_rsa:
Identity added: /c/Users/***/.ssh/id_rsa (/c/Users/***/.ssh/id_rsa)
```

#参考URL
https://takanosho.wordpress.com/2013/01/11/input-ssh-key-passphrase-only-once-on-git-bash/
JavaScriptでよく使われる特別な値

JavaScriptには、いくつかの特別な値が存在します。
よく使うものを、以下にまとめてみる。

| 表記 | 意味|    説明    |
|:--------|:-------------|:----------|
| true       | 真 　　　　| boolean型   |
| false      | 偽　　　　　 | boolean型   |
|null|値なし| 変数の中身が空であることを示す  |
| undefined |未定義|オブジェクトの『存在しないプロパティ』　などにアクセスした際に戻る値 |
| NaN        |数値でない| 計算式に文字列が紛れ込んでいた際などに戻る値  |
| Infinity   |無限|計算結果が極端に大きな場合に戻る値   |
MacにPostgreSQL10をbrewを使ってインストールしたときのメモ

# インストールメモ
mac os x (sierra)にインストールしたときの作業メモ.

## reference
- https://github.com/petere/homebrew-postgresql
- https://installvirtual.com/install-postgresql-10-on-mac-os-x/

## command list

```
$ brew tap petere/postgresql
$ brew install postgresql@10
```

もしくは

```
$ brew install petere/postgresql/postgresql@10
```

postgresql9.6をunlink（前バージョンが入っていて10にしたい場合のみ）

```
$ brew unlink postgresql
```

postgresql10をlink（前バージョンが入っていて10にしたい場合のみ）

```
$ brew link -f petere/postgresql/postgresql@10
```

データベース初期化（パスは環境に合わせて変更してください。私の場合は下記）

```
$ initdb /usr/local/var/postgres10 -E utf8
```

initdbしたディレクトリパスを環境変数PGDATAとして、.bashrcあたりに記載する.

```
export PGDATA=/usr/local/var/postgres10
```

.bashrcを再読み込み

```
$ source ~/.bashrc
```

postgresql10が起動したらOK

```
$ pg_ctl start
```
Vagrant up が進まなくなったとき対処したメモ

### 環境
---
windows上にvirtualboxとvagrantを使用してubuntuを構築



#### 発生した現象
-   -   -

vagrantを起動しようとしたところprivate keyのあと進まなくなった。


```
$vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'ubuntu/xenial64' is up to date...
==> default: Resuming suspended VM...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
```

一度終了させてもう一度`vagrant up`をすると起動はするが
その後`vagrant ssh`をしても接続できなくなった。

#### 原因
---
vagrant sshで使用されているポート22とポート2222がなぜか塞がれてしまっていたようだ


#### 対処した方法
---
virtualboxで起動しログイン

```
sudo ufw allow 22
sudo ufw allow 2222
```
でポート22とポート2222を開放した。

ubuntu/xenial64のユーザー名・パスワードは`vagrant`ではないので注意

https://qiita.com/TKR/items/f27271c963de0033f7ff
[WPF][XAML]ListViewItem内のTextBlockでTextWrappingが効かない

かなり限定された条件の中で発生する事象だとは思いますが、ハマったのでメモ。

## 概要
ListViewItem内でTextBlockにTextWrapping=Wrap指定を行っても折り返しが行われず、
TextBlockが親要素をはみ出してしまう。

## 環境
- Windows10
- Visual Studio professional 2015

## 発生条件
- TextBlockと親要素にWidth指定が無い（Window幅で伸縮させたい）

## 対策
ListViewのスタイルに以下のプロパティを追加する。

```xml
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
```

デフォルトだとListViewが溢れたコンテンツをよしなに横スクロールする形にしてしまうようなので、
固定幅指定をしない場合は「横スクロールはしません！」という指定が必要だったようです。。

WidthにBindingを付与する方向でどうにか解決しようとしていたので、
こちらの記事に辿り着くまでかなりハマってしまいましたorz
感謝ですmm

https://stackoverflow.com/questions/44881880/cant-get-xaml-textblock-textwrapping-to-work
Pythonのlist, dict操作で覚えておきたいイディオム

Pythonのlist, dictの操作で便利だけど意外に忘れられがちなイディオムをまとめた。

## listの連結

2つのリストを連結してひとつにする。

```py
lst1 = [1, 2, 3]
lst2 = [4, 5, 6]

lst3 = lst1 + lst2

print(lst3)

#
# [1, 2, 3, 4, 5, 6]
#
```

## listの反転

Python3では`reversed`を使うとイテレータが返ってくるので、`list(reversed(lst))`みたいに`list()`で具現化しないといけなくて面倒。
sliceを使って書くのがスマート。

```py
lst1 = [1, 2, 3, 4]

lst2 = lst1[::-1]

print(lst2)

#
# [4, 3, 2, 1]
#
```


## 2重listの転置

2重リストの行と列を入れ替える操作は1行で書ける。

```py
lst = [[1, 2, 3], [4, 5, 6]]

lst = list(map(list, zip(*lst)))

print(lst)

#
# [[1, 4], [2, 5], [3, 6]]
#
```

一見複雑そうに見えるが、2段階に分けて考えると意外に単純。

`zip(**lst)`　=> `[(1, 4), (2, 5), (3, 6)]`
`list(map(list, zip(*lst)))` => `[[1, 4], [2, 5], [3, 6]]`

一番外側の`list()`はPython3で`map()`の返り値でイテレータが返ってくるので具現化するためのもの。
Python2では `map(list, zip(*lst))`で良い。



## dictのkey/valueを入れ替える

key->valueをvalue->keyに入れ替えるのは内包表記で書くのも良いが、個人的に一番簡潔だと思うのは以下のやり方。

```py
d = {'a': 1, 'b': 2, 'c': 3}

d_inv = dict(zip(d.values(), d.keys()))

print(d_inv)

#
# {1: 'a', 2: 'b', 3: 'c'}
#
```


## dictの合成

2つのdictを合成して新しい1つのdictを作る。
ただし、Python2だとこの書き方はできず、`Syntax Error`になる。
3つ以上のdictの場合でも合成可能。

```py
d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'd': 4}

d3 = {**d1, **d2}

print(d3)

#
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
#
```

`d1`に破壊的操作を加えても良い場合は次の書き方もできる。

```py
d1.update(d2)

print(d1)

#
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
#
```
【Dependabot】依存パッケージが更新されてたら勝手にプルリクしてくれるやつ

## 何

毎日指定したリポジトリの依存に更新がないか調べてくれて、更新があればリリースノートとかまとめてプルリクを立ててくれるみたい。

## サポート言語

これだけあるみたいだけど、js以外試してないのでわからない。
jsのプロジェクトならpackage.jsonの対象パッケージのバージョンを上げたプルリクを上げてくれる。

<img width="551" alt="Dependabot_-_Automated_Dependency_Updates_🔊.png" src="https://qiita-image-store.s3.amazonaws.com/0/84144/b53414a7-dec1-321f-17cb-425505a26197.png">

## 使ってみる

多分[Marketplaceのここ](https://github.com/marketplace/dependabot)からインストールするだけ。個人アカウントならパブリックでもプライベートでも無料なのがうれしい。

## 使ってみた

適当に半年ぐらい前のリポジトリで試してこんな感じでプルリクが上がった。

> <img width="511" alt="Pull_Requests_·_nju33_yosuga_🔊.png" src="https://qiita-image-store.s3.amazonaws.com/0/84144/1542fc73-cc3b-f156-32c7-1daeff0dd8ad.png">
>
> ---
>
> <img width="767" alt="Bump_flow-bin_from_0_44_0_to_0_58_0_by_dependabot_·_Pull_Request__1_·_nju33_yosuga.png" src="https://qiita-image-store.s3.amazonaws.com/0/84144/f1ec33d0-9c7e-2ec3-c5f8-5d5413968e8f.png">

- ただ、1回の巡回で上がるプルリクの数は５が上限らしい？

- <img width="529" alt="Dependabot_🔊.png" src="https://qiita-image-store.s3.amazonaws.com/0/84144/7845a3e1-dd24-3b99-391b-170b640ec80f.png">  
  ダッシュボードのこの辺押すと即座に再チェックはしてくれる

---

マージする前に新しいバージョンが来ちゃった場合は、ちゃんと前のプルリクを閉じて再度新しいバージョンでプルリクしてくれました。

<img width="549" alt="Pull_Requests_·_nju33_remonade.png" src="https://qiita-image-store.s3.amazonaws.com/0/84144/223de085-e292-dbfd-bcb6-d565b3fc86e6.png">
[Kubernetes Tutorial] Attaching a Volume Mount to Your Application

Kubernetes allows you to package multiple containers into a pod. All containers in the pod run on the same Node, share the IP address and port space, and can find each other via localhost. To share data between pods, Kubernetes has an abstraction called Volumes. In this blog, we demonstrate how you can easily hookup Kubernetes Volumes to your pod and define the containers in the pod using Shippable.
![ATTACHING A VOLUME MOUNT TO YOUR APPLICATION.png](https://qiita-image-store.s3.amazonaws.com/0/154485/31b29e49-10ce-69d8-7be0-c574e8af192f.png)


 

Kuberetes Volumes
A Volume is a directory with data that is accessible to all containers running in a pod and gets mounted into each containers filesystem. Its lifetime is identical to the lifetime of the pod. Decoupling the volume lifetime from the container lifetime allows the volume to persist across container crashes and restarts. Volumes further can be backed by host's filesystem, by persistent block storage volumes such as AWS EBS or a distributed file system. The complete list of the different types of volumes that Kubernetes supports can be found here.

Shippable supports mounting all the types of volumes that Kubernetes supports via the dockerOptions resource. However, the specific volume type that we demonstrate in this blog is a gitRepo volume. A gitRepo volume mounts a directory into each containers filesystem and clones a git repository into it. 

Check out the full tutorial [here] (http://blog.shippable.com/kubernetes-tutorial-attaching-volume-mount-to-your-kubernetes-application?utm_campaign=devops-assembly-lines&utm_content=62715084&utm_medium=social&utm_source=twitter)
AWS Batchの結果をCloudWatch Eventsで受け取る


ちょうどBatchのエラーをどう検知しようか考えていたところ、CloudWatch EventsでBatchのステータス変更を利用できるようになったよという[リリース情報](https://aws.amazon.com/jp/about-aws/whats-new/2017/10/aws-batch-now-sends-job-state-changes-to-cloudwatch-events/)を見つけたのでさっそく試してみました。

# 設定方法

- マネジメントコンソールを開きCloudWatchのページを開きます
- ルール → ルールの作成をクリックします
- 記事執筆時点ではGUIからBatchの項目を選択できないので、手動で次のようにイベントパターンを入力します。
  この例ではステータスが失敗になった場合のルールを紹介します。
  
```
{
  "detail-type": [
    "Batch Job State Change"
  ],
  "source": [
    "aws.batch"
  ],
  "detail": {
    "status": [
      "FAILED"
    ]
  }
}                        
```

- ルールの設定はこれで終了です。
- あとはターゲットで任意の通知先(SNSやLambda関数など)を設定すればOKです

CloudWatch最高!!
String to CGFloat

Swift3.2でこうしたいのにできない....


```swift
let text = "12.4"
let num = CGFloat(text)
```

できるようにした

```swift
import UIKit

extension CGFloat{
  init(_ str:String? = nil){
    guard
      let s = str,
      let n = NumberFormatter().number(from: s) else {
      self = 0.0
      return
    }
    self = CGFloat(n)
  }
}

```

そんだけ。
なんか、こんなの用意しなくてもできそうな気がするけど、、、


#追記
@koherさん
@loveeさん
のアドバイスにより、上のクソみたいなのより、こっちが良さそうってことが分かったよ！

```swift
extension CGFloat {
    init?<S>(_ text: S) where S : StringProtocol {
        guard let number = Double(text) else { return nil }
        self.init(number)
    }
}
```
RedmineでチケットのCSVインポート

の手順です
動作環境:redmine-3.3.3-1

#CSV作成
 チケットの項目名と同じCSV項目名のCSVを作成する
※違う項目名にもできるが面倒なので一緒にしましょう

###子チケットを作る場合
親チケット列を記入します。
※CSVの中にある行数を指定します（ヘッダーはカウントしない）。
~~つまり、既にRedmineへ起票されているチケットに対する子チケットをCSVインポートはできません。~~
追記: 既存のチケットを親チケットとして指定するには、番号の前に`#`をつける

##CSV作成例

|プロジェクト|トラッカー|ステータス|題名|説明|優先度|カテゴリ|担当者|対象バージョン|親チケット|開始日|期日|予定工数|進捗率|
|:-------|:------|:-----|:---|:---|:-----|:----|:-----|:----------|:-----|:-----|:---|:-------|:-----|
|プロジェクトX|機能|新規|検索機能|ごにょごにょ|通常|||version/11.0||||||
|プロジェクトX|機能|新規|検索機能のコーディング|子チケットです|通常|||version/11.0|1|||8||
|プロジェクトX|機能|新規|検索機能テスト|子チケットです|通常|||version/11.0|1|||6||

#CSV取込

以下の順で操作していけばCSVを取り込めます。

1. チケットタブクリック
2. 右側のインポートリンク
	え？そんなの無い？Redmineの管理者アカウントでログインして管理⇒ロールと権限⇒チケットのインポートにチェックON⇒保存で出てきます。
3. ファイル選択して次へ
4. チケットのインポートのオプション選択して次へ
5. チケットのインポートのフィールドの対応関係を選択してインポートボタン。
プルダウン選択が面倒くさいですね。
↓のブックマークレットで全部のプルダウンを自動的に選択してくれます。

```javascript
javascript:(function(){ var fieldMapping = document.getElementById("fields-mapping"); var PTags = fieldMapping.getElementsByTagName("p"); for(a=0; a<PTags.length;a++){ var label = PTags[a].getElementsByTagName("label")[0].textContent; var pulldown_option = PTags[a].getElementsByTagName("option"); for(i=0; i<pulldown_option.length;i++){ console.log(pulldown_option[i].value); if(pulldown_option[i].textContent == label){ pulldown_option[i].selected = true; break; } } } })();
```
Instagramで特定のユーザーのタイムラインをjsonで取得する(認証不要)

今回紹介する方法は、InstagramのAPIではなく、Instagramのユーザーページからユーザータイムラインの情報を取得する方法です。

# 方法

## ユーザータイムラインの取得

以下のURLをGETすると、`<userid>`に指定したユーザーの最新の投稿20件とそれに紐づくコメントなどの情報がjson形式で取得できます。

```:url
https://www.instagram.com/<userid>/?__a=1
```

```:例
https://www.instagram.com/daikiojm/?__a=1
```

## 全件取得するには

随分と雑ですが、全件取得してみました。
[API](https://www.instagram.com/developer/endpoints/users/#get_users_media_recent)で取得する際には、countやmax_id、min_idなどを指定して取得件数を操作できるようですが、APIを使わないこの方法ではcountパラメータは使えないようです。
max_idパラメータは使えるようなので、node.jsで再帰的に全件取得する方法を試してみました。

```js
'use strict';
const request = require('request');

const url = 'https://www.instagram.com/daikiojm/?__a=1';
const allItems = [];

const getMedia = (maxId) => {
  const requestUrl =  maxId ? `${url}&max_id=${maxId}` : url;
  request.get(requestUrl, (err, data) => {
    if (!err) {
      const json = JSON.parse(data.body);
      const media = json.user.media; 
      media.nodes.forEach(elm => {
        allItems.push(elm);
      });
      if (media.page_info.has_next_page) {
        getMedia(media.nodes[media.nodes.length - 1].id);
      } else {
        return console.log(allItems);
      }
    } else {
      console.log(err);
    }
  });
}

getMedia();
```
※ 試しに使ってるユーザーは自分のユーザーです

1件のリクエストで取得できるjsonの形式は次のような形式になっており、
`media.page_info. has_next_page`フラグがtrueの場合、最後のitem以降を取得するように次のリクエストを行っています。

<img width="1154" alt="スクリーンショット 2017-11-30 13.02.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/89137fc5-8fa7-1b7e-70be-20927110995a.png">



##　終わりに

ひとまず公開ユーザーのユーザー名から投稿内容を取得することが出来ました。
[API ドキュメント](https://www.instagram.com/developer/)を探してみましたが、今回紹介した内容に関する情報の記載が見当たりませんでした。(知っている方がいたら教えてほしいです)
公式な方法なのか定かではないので、ガッツリ使う場合は開発者登録を行った後、APIの方を叩くのがいいかと思います。

## 参考

[Instagram.com/username/media no longer working -StackOverflow](https://stackoverflow.com/questions/47240448/instagram-com-username-media-no-longer-working)
JenkinsfileでIRCへ通知を仕込む

#背景
職場ではオフライン環境で開発作業を実施している。
なので、開発資産（ソースコード）をGitで管理し、
GitのプラットホームにGitBucketを導入した。
そしてCI用に、Jenkinsも導入。
ここで、GitBucketとJenkinsを連携させて、ブランチやPRを自動ビルドしてくれるようにしたい。
そしてビルド結果を通知（メールかIRC）してほしい。
そんな仕組みを作ろうと試みた。
　＃土台はCentOS6.5

#GitBucketとJenkinsの連携
GitBucketとJenkinsを連携させるために、Jenkinsfileを作りました。
仕組みについては以下を参照・参考にしました。
https://jenkins.io/doc/book/pipeline/jenkinsfile/
https://qiita.com/kounoike/items/52fa35ca5813d0edc7b7
これで、Jenkinsfileをプロジェクト直下に配置するだけで、GitBucketとJenkinsが連携してくれます。
Jenkins側のプロジェクトの起動トリガーはWebHooksで設定。

#JenkinsfileからIRCへの通知の発信
JenkinsfileによってJava/Mavenプロジェクトを自動でチェックアウト・ビルドするところまではすんなり。
CheckstyleやFindbugsを実行して実行結果を収集するのもできた。
（新規警告の検出ができてないけど・・・）
で、IRCにビルド結果を通知させたい。
GitBucketのPRにビルド結果は出るけど、何回もブラウザ更新するのも微妙だし。
IRCにJenkinsからの通知を垂れ流ししておきたい。
で、調べた結果以下が参考になった。

まず、
http://b-side.work/2017/04/jenkins-pipeline-post-notification/
https://jenkins.io/doc/pipeline/tour/post/
この２つのサイトで、email/hipchat/slackは標準対応されているけどIRCは無い、ということを知った。

そこからさらに調べて調べて、やっと以下のサイトにたどり着く。
https://wilsonmar.github.io/jenkins2-pipeline/
https://github.com/jenkinsci/pipeline-examples/blob/master/pipeline-examples/ircnotify-commandline/ircNotify.groovy

どうやらnetchatを使って実行できるようだ。
ただし、私の環境では上記リンク先のサンプルのようにシングルクォーテーションではうまく動作しなかった。
なので、最終的には以下のようなスクリプトに落ち着いた。

```
pipeline {
    agent any
    tools {
        maven 'apaceh-maven-3.3.9'
        jdk 'jdk1.8.0_131'
    }
    stages {
        stage ('build') {
            steps {
                sh 'mvn clean package'
            }
        }
    }
    post {
        always {
            ircnotice("sending notifications...")
        }
    }
}

def ircnotice(param_msg) {
    def MSG = "Project: ${env.JOB_NAME}, Build: ${env.BUILD_NUMBER}, Author: ${env.CHANGE_AUTHOR}, Result: ${currentBuild.currentResult}, Time: ${currentBuild.duration}, ${env.BUILD_URL} ."
    sh """
        (
        echo "NICK bot"
        echo "USER bot 8 * : bot"
        sleep 1
        echo "JOIN #jenkins"
        echo "PRIVMSG #jenkins" :${MSG}
        echo QUIT
        ) | nc localhost 6667
    """
}

```

IRCはngircdを使用しており、ポート番号は6667。
IRCもJenkinsも同一サーバー上に構築したのでホストはlocalhostで成功。
チャンネル名は `#jenkins` というものを作成。
これで通知に成功した。

以上。
DynamicObject.TryConvertの呼ばれ方

# 長い;読めぬ

こんなさむしんぐがあったとして、

```csharp

class MyDynamic:DynamicObject
{
	public override bool TryConvert(ConvertBinder binder, out object result)
	{
		Console.WriteLine($"\tTryCovert is called!");
		result= Enumerable.Range(0, 10).ToArray();
		return true;
	}
}

```


```csharp

static void Main(string[] args)
{
	dynamic d = new MyDynamic();

	int[] array = d;//1
	array = (int[]) d;//2

	IEnumerable<int> intIterator = d;//3
	intIterator = (IEnumerable<int>) d;//4
}

```

こんな風にすると、なぜか④だけ`InvalidCastException`が飛んで来るから注意しましょうって話。

## 何が起きたのか

動かすとわかるけど、①~③は想定通り`TryConvert`メソッドが呼ばれて動的に変換が解決されているコトがわかる。

けど、④だけは`TryConvert`が呼ばれず`InvalidCastException`が飛んでくる。

## どーしてこうなった

これらの挙動は[Explicit reference conversions](https://github.com/dotnet/csharplang/blob/master/spec/conversions.md#explicit-reference-conversions)の、bullet 3みれば書いてあって

>From any class_type S to any interface_type T, provided S is not sealed and provided S does not implement T.

と定義されてるから、まず明示的な型変換は可能であるのだけど、逆に[Permitted user-defined conversions](https://github.com/dotnet/csharplang/blob/master/spec/conversions.md#permitted-user-defined-conversions)のbullet 3に、

> Neither S0 nor T0 is an interface_type.

とあって、任意の型に`public static implicit operator <interface_type>　(...)`や`public static explicit operator <interface_type>(...)`みたいなことは出来ないよと言うことになる[^1]

で、ここら辺の理由から、明示的な型変換を行った場合､*interface-type*へのユーザー定義変換が動的型に対するコールサイト構築を行う際、全く考慮されてないんじゃないかなって。

で、結局考慮されてないわけだから、*Interface-type*への明示的な型変換は、一般的なC#の文脈で行われるってコトだと思う。

他方、暗黙の型変換が許容されるのは、右辺にある'd'が明示的な変換操作無しで変換可能であるかのように振る舞う必要があるため、コールサイト構築時に`DynamicObject.TryConvert`が呼ばれる様なコールサイト構築を行うのではと。

## じゃーどーすりゃいいのか

答えはこれ以上無いほどシンプルで、変換したいinterfaceを付けてやれば良い。
先の例だとこんな感じ

```csharp

	class MyEnumerableDynamic :DynamicObject,IEnumerable<int>
	{
		public IEnumerator<int> GetEnumerator()
		{
			Console.WriteLine("GetEnumerator was called.");

			return Enumerable.Range(0, 10).GetEnumerator();
		}

		IEnumerator IEnumerable.GetEnumerator()
			=> GetEnumerator();

		public override bool TryConvert(ConvertBinder binder, out object result)
		{
			Console.WriteLine($"\tTryCovert is called!");

			if (binder.Type == typeof(int))
			{
				result = 0;
				return true;
			}

			result = Enumerable.Range(0, 10).ToArray();
			return true;
		}

	}

```

こーすれば、一般的な型変換のコンテキストで動いて問題なく変換できる。

## 参考にしたサイト
[DynamicObject.TryConvert not called when casting to interface type](https://stackoverflow.com/questions/3492955/dynamicobject-tryconvert-not-called-when-casting-to-interface-type)

[On Dynamic Objects and DynamicObject](https://blogs.msdn.microsoft.com/cburrows/2010/10/18/on-dynamic-objects-and-dynamicobject/)

[^1]: 実際コンパイルエラーになる｡蛇足ながらこれで来ちゃうと色々とマズいとは思うので妥当じゃ有ると思う｡
$(window).scrollの操作が終わった時を判別して、一度だけ処理を行う

`$(window).on('scroll', function () {}` は、scrollするたびに連続して処理が走る
scrollが終わって、そこで初めて処理を行いたい時の書き方を探していたら見つけた。



```js
//１
function resizeStuff() {
 //何かの処理
}
//２
var TO = false;

$(window).scroll(function () {
    //３
    if (TO !== false) {
        //setTimeoutの戻り値であるNumberハンドル値が得られる　falseがint型の数値に変化する
        clearTimeout(TO);
    }
    //４
    TO = setTimeout(resizeStuff, 200);
});
```

１.関数を定義
２. `TO` の初期値を `false` に
３.リサイズが行われた時、 `TO !== false` だったら `TO` に予約されている処理をクリア
４. `TO` に対して `200ﾐﾘ秒後` に処理を行うように設定する。


 `scroll` 中は３と４が繰り返されて、一番最後の`scroll`処理で４が実行されて終り。

```js
if (TO) clearTimeout(TO);
```
↑３はこんな風にも書けたり。

`setTimeout`の事をちょっと知っておかないと `TOにはいったい何が起こっているんだ？`　となってしまうので、コメントを書いてあげておいたほうがいいと思う。



参考
[javascript resize event firing multiple times while dragging the resize handle](https://stackoverflow.com/questions/667426/javascript-resize-event-firing-multiple-times-while-dragging-the-resize-handle)
[timer.html](http://hakuhin.jp/js/timer.html)
ターミナルショートカットキー早見表

# ターミナルショートカットキー一覧

| ショートカットキー       |       説明 |
|:-----------------|:------------------|
| Ctrl + A             |              カーソルを行頭へ |
| Ctrl + E            |              カーソルを行末へ |
| ESC + F               |                カーソルを1単語先に進める |
| ESC + B             |            カーソルを1単語戻す |
| Ctrl + K          |          カーソル位置から行末までを削除 |
| Ctrl + U         |          カーソル位置から行頭までを削除 |
| Ctrl + W         |          カーソル位置から単語の先頭までを削除 |
| Ctrl + D          |          カーソル位置の文字を削除 |
bash > rmタイプミスでの意図しない削除を予防する > N個以上の時に確認をする v0.1, v0.2, v0.3

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
```

### 失敗

```
$ rm -rf log.* 
```

とするところを以下とした。

```
$rm -rf log. *
```

そのディレクトリにあったファイルが消えた。バックアップを取っていたため復旧できたが、場合によっては、関連ソフトの再構築が必要となる。

### 回避案 my_rm_171106_exec v0.1

削除する時、N個以上の時に確認メッセージを表示するようにしてみる。
(下記はN=3での実装例)

```bash:my_rm_171106_exec
#!/usr/bin/env bash

# Nov. 06, 2017
#   - add cancellation
#   - check number of arguments

echo "rm $@"

if [ $# -ge 3 ]; then
    echo "Are you sure? [y/N]"
    read key
	if [ "$key" != "y" ]; then
	    echo "canceled"
		exit
	fi
fi

rm $@
echo "Deleted"
```

```txt:run
$ ../my_rm_171106_exec -f *
rm -f a b c d
Are you sure? [y/N]
(ここで、y以外のキーを入力してEnter)
canceled
```

```txt:run
$ ../my_rm_171106_exec -f *
rm -f a b c d
Are you sure? [y/N]
(ここで、yキーを入力してEnter)
y
Deleted
```

### コマンドの使用

.bashrcなどでmy_rm_171106_exec へのパスを通しておく。
**rmへのaliasは行わない**。理由として、通常とは異なるrmの使用に慣れてしまうと、通常のOS上であやまった操作を誘発するため。

チェックするNの数は実際に使用して調整するとよい。

### 関連

https://serverfault.com/questions/337082/how-do-i-prevent-accidental-rm-rf

### 失敗の一因

失敗をしてはいけない作業中に、傍らでお話しがある場合がある。その話に耳を持っていかれると、不要な失敗をしてしまう。

### my_rm_171106_exec v0.2
(追記 2018/03/19)

確認メッセージの前にファイル数が表示されている方が良いと思った。

```bash:my_rm_171106_exec
#!/usr/bin/env bash

# Mar. 19, 2018
#   - show number of files to be deleted
# Nov. 06, 2017
#   - add cancellation
#   - check number of arguments

echo "rm $@"

if [ $# -ge 3 ]; then
	echo "[$#] files will be deleted."
    echo "Are you sure? [y/N]"
    read key
	if [ "$key" != "y" ]; then
	    echo "canceled"
		exit
	fi
fi

rm $@
echo "Deleted"
```

```txt:使用例
...
[840] files will be deleted.
Are you sure? [y/N]
```

ファイル名入力を間違った時、明らかにファイル数が多くなる（下記）。

```
...
[3130] files will be deleted.
Are you sure? [y/N]
```

### my_rm_171106_exec v0.3 > N=1以上に変更
(追記 2019/10/10)

似た名前のコマンドを実装して、そちらを使うつもりがこちらのコマンドを実行してしまった。
パラメータ数２つでの実行。
結果として、ファイルを削除してしまった。

同じ失敗を繰り返さないように、確認するように変更した。

```bash:my_rm_171106_exec
#!/usr/bin/env bash

# Oct. 10, 2019
#   - unlimit number of files with which the confirmation is displayed
# Mar. 19, 2018
#   - show number of files to be deleted
# Nov. 06, 2017
#   - add cancellation
#   - check number of arguments

echo "rm $@"

#if [ $# -ge 3 ]; then
echo "[$#] files will be deleted."
echo "Are you sure? [y/N]"
read key
if [ "$key" != "y" ]; then
	echo "canceled"
	exit
fi
#fi

rm $@
echo "Deleted"
```

```
$ my_rm_171106_exec AAA BBB
rm AAA BBB
[2] files will be deleted.
Are you sure? [y/N]
 
canceled
```
Paper > A Comparison of Popular Point Configurations on S^2 > 球面上の点の取り方の比較 > mesh icosahedral equal area nodesが一番mesh ratioが低い

A Comparison of Popular Point Configurations on S^2
http://emis.ams.org/journals/DRNA/2-4.html

### 概要

球面上の点の取り方に関して、以下のpoint setsを比較している。

- Fibonacci and generalized spiral nodes
- projections of low dicrepancy nodes from unit square
    - QMC?
- zonal equal area nodes and HEALPix nodes
- polygonal nodes such as icosahedral, cubed sphere, and octahedral nodes
- minimal energy nodes
- random nodes
- mesh icosahedral equal area nodes
    - 著者らの新提案手法

下記の特性について検討している。

- equidistribution
- separation
- covering
- quasi-uniformity
- Riesz potential energy

### 結果

- Voronoi decompositionを用いて、分割の様子を図示している
    - black points: hexagonal (not necessary regular)
    - red points: pentagonal
    - cyan points: heptagonal
- QMCに関してはHammersley Nodesを紹介している
- Mesh ratiosはEqual Area Icosahedral Nodesで0.73程度 (N=509252)と低い
- Table 11に以下の特性が紹介されている
    - Defined for
    - Hierarchy (No or Subseq.)
    - Equidistribution

### Mesh ratio

論文の結果の主要項目となるMesh ratio。

p17

> The quantity $\gamma(\omega_N)$ is called the mesh ratio of $\omega_N$.

```math
{\gamma(\omega_N):=\frac{\eta(\omega_N)}{\delta(\omega_N)}}
```

$\eta(\omega_N)$はcovering radius

```math
\eta(\omega_N) := max(y) min(x) |x-y|
```

論文とは違う表記のmax(y)は$y \in S^2$に関するmax、min(x)は$x \in \omega_N$に関するmin。

$\delta(\omega_N)$はseparation of a configuration $\omega_N \subset S^2$

```math
\delta(\omega_N) := min(x,y) |x-y|
```

論文とは違う表記のmin(x,y)は$x,y \in \omega_N$かつ$x \ne y$に対するmin。

mesh ratioが低いものは効率よく分散点を得ている、という理解をしている。
著者らが提案しているmesh icosahedral equal area nodesのmesh ratioが一番低い (Table 8)。
QMCと比べて積分の効率は向上するかは気になる点ではある。

### code

関連コードは以下にある。

- https://github.com/gradywright/spherepts
    - MITライセンス
    - ( うち、[mesh icosahedral equal area nodesのMatlabコード](https://github.com/gradywright/spherepts/blob/master/code/getIcosNodes.m) )

- http://eqsp.sourceforge.net/

### 関連

[code > spherepts > モジュール構造調査](https://qiita.com/7of9/items/a5248835bdc35cba1b63)
【Tips】OGPの意外と知られていない？豆知識

筆者が以前、実際に試した限りでの挙動を元に書いてますが、
内容に間違がある場合は、ご指摘いただければと思います。
※他にも意外と知られていないOGP豆知識があれば、ぜひ教えてください！

## og:url
とりあえずページ元のURLを設定しておけば良いだろうと思われていたり、
設定したURL自体がシェアした内容に入ると思われている方がいらっしゃるようですが、
実際は、**「どのページのOG情報を使用するか」**を指定するための記述です。

例：
ページ元のURLがA.htmlで、設定したog:urlがB.htmlの場合、
B.html側で設定した各OGPを取得するようになる。

## og:title
ページタイトルを設定しますが、あくまで**「titleタグと内容を変える場合」**に設定します。
ちなみに、titleタグと同じ内容で良い場合は、contentの中身を空にしておけばOKです。

## og:description
こちらもog:titleと同様に、**「descriptionタグと内容を変える場合」**に設定します。
また、descriptionタグと同じ内容で良い場合は、contentの中身を空にしておけばOKです。
GoogleAnalyticsのscreenviewをruby/staccatoから送る

この記事は
===

* GoogleAnalyticsへのhitを生成するrubyのgemライブラリに[staccato](https://github.com/tpitale/staccato)というものがあります
* このライブラリからscreenviewのhitを送出するのが最初うまくいかなかったのでメモです

screenview
===

* GoogleAnalyticsへの記録全般はhitと呼ばれます
* hitには種類がありもっとも一般的なのはpageviewというWebページを開いた時を示すもので、他にもボタンが押されたなどの動きを示すeventなどがよく使われます
* screenviewはhitの一種ですが、上記とは異なりスマホアプリ内での画面表示を示します
* 通常PCからscreenviewを飛ばすことは少ないのですが、コンバージョンの都合上どうしてもscreenviewを飛ばす必要が出てくる場合があります

staccatoのscreenview（失敗）
===

* はじめ[このあたり](https://github.com/tpitale/staccato#screenview-as-in-mobile)を見ていたら普通にscreenviewに対応しているメソッドが準備されていたのでこれは余裕だと踏んでいました
* が、実際には呼び出してもうんともすんとも言わず。。200が返ってきてるけど。。

```ruby
tracker = Staccato.tracker('UA-xxxxxxxxxx-x', nil, ssl:true)
tracker.screenview({screen_name: 'xxxx'})
#=> #<Net::HTTPOK 200 OK readbody=true>
```

デバッグ
===

* READMEを見ていたらどうもstaccatoにはアダプタという機構があって、そこでリクエストが正常かチェックできるみたいです
* なのでその機構を使ってエラーを出力してみました。

```ruby
tracker = Staccato.tracker('UA-xxxxxxzxx-x') do |c|
  c.adapter = Staccato::Adapter::Validate.new  
end
tracker.screenview({screen_name: 'xxx'})

#=> "{\n  \"hitParsingResult\": [ {\n    \"valid\": false,\n    \"parserMessage\": [ {\n      \"messageType\": \"ERROR\",\n      \"description\": \"A value is required for parameter 'an'. Please see http://goo.gl/a8d4RP#an for details.\",\n      \"messageCode\": \"VALUE_REQUIRED\",\n      \"parameter\": \"an\"\n    } ],\n    \"hit\": \"/debug/collect?v=1\\u0026tid=UA-xxxxxxxxxxx-x\\u0026cid=e2c41d47-e335-403a-bc7c-e7a868875f54\\u0026t=screenview\\u0026cd=xxx\"\n  } ],\n  \"parserMessage\": [ {\n    \"messageType\": \"INFO\",\n    \"description\": \"Found 1 hit in the request.\"\n  } ]\n}\n"
```

* なんか必須である[アプリ名のパラメータ](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#an)```an```がきていないとか言ってます

修正
---

* ソースみてたら[この辺のハッシュ](https://github.com/tpitale/staccato/blob/master/lib/staccato/screenview.rb)にオプション名入れ込めば行けそうです

```ruby
# app_nameというオプションでanパラメータを渡せる様に拡張
Staccato::Screenview::FIELDS[:app_name] = 'an'

tracker = Staccato.tracker('UA-xxxxxxzxx-x') do |c|
  c.adapter = Staccato::Adapter::Validate.new  
end
tracker.screenview({screen_name: 'xxx', app_name: 'app1'})

#=> "{\n  \"hitParsingResult\": [ {\n    \"valid\": true,\n    \"parserMessage\": [ ],\n    \"hit\": \"/debug/collect?v=1\\u0026tid=UA-xxxxxxxxxx-x\\u0026cid=e2c41d47-e335-403a-bc7c-e7a868875f54\\u0026t=screenview\\u0026cd=xxx\\u0026an=app1\"\n  } ],\n  \"parserMessage\": [ {\n    \"messageType\": \"INFO\",\n    \"description\": \"Found 1 hit in the request.\"\n  } ]\n}\n"
```

* おお！うまくいきました！

終わりに
===

* これバグか仕様変更に追随できないかどっちかっぽいですね
* そのうちプルリク出しときます
AWS VPN Fortigate設定

# AWS-VPN-Fortigate
FortigateとのAWSのVPN接続を行う際の設定例

検証機:FortiGate-60C
ファーム：fortios 5.0+

- BGPにて経路を学習
- 経路集約を実施
- 暗号化強度を変更(dh14/aes256/sha256)


## Config
### IPSEC

```
# IPSEC 0
config vpn ipsec phase1-interface
 edit vpn-<<ID>>-0
   set interface "wan1"
   set dpd enable
   set local-gw <<Local-Global-IP-0>>
   set dhgrp 14
   set proposal aes256-sha256
   set keylife 28800
   set remote-gw <<Remote-Global-IP-0>>
   set psksecret <<Secret-Key-0>>
   set dpd-retryinterval 10
 next
end

config vpn ipsec phase2-interface
 edit "vpn-<<ID>>-0"
  set phase1name "vpn-<<ID>>-0"
  set proposal aes256-sha256
  set dhgrp 14
  set pfs enable
  set keylifeseconds 3600
 next
end

config system interface
 edit "vpn-<<ID>>-0"
  set vdom "root"
  set ip <<Tunnel-Local-IP-0>> 255.255.255.255 
  set allowaccess ping 
  set type tunnel 
  set tcp-mss 1350
  set remote-ip <<Tunnel-Remote-IP-0>>
  set interface "wan1"
 next
end

# IPSEC 1
config vpn ipsec phase1-interface
 edit vpn-<<ID>>-1
   set interface "wan1"
   set dpd enable
   set local-gw <<Local-Global-IP-1>>
   set dhgrp 14
   set proposal aes256-sha256
   set keylife 28800
   set remote-gw <<Remote-Global-IP-1>>
   set psksecret <<Secret-Key-1>>
   set dpd-retryinterval 10
 next
end

config vpn ipsec phase2-interface
 edit "vpn-<<ID>>-1"
  set phase1name "vpn-<<ID>>-1"
  set proposal aes256-sha256
  set dhgrp 14
  set pfs enable
  set keylifeseconds 3600
 next
end

config system interface
 edit "vpn-<<ID>>-1"
  set vdom "root"
  set ip <<Tunnel-Local-IP-1>> 255.255.255.255 
  set allowaccess ping 
  set type tunnel 
  set tcp-mss 1350
  set remote-ip <<Tunnel-Remote-IP-1>>
  set interface "wan1"
 next
end

```

### BGP

```
# BGP 0/1
config router bgp
 set as <<BGP-Local-AS>>
 set holdtime-timer 30
 set keepalive-timer 10
 set graceful-restart enable
 config neighbor
  edit <<BGP-Neighbor-IP-0>>
   set remote-as <<BGP-Remote-AS>>
  end
 config neighbor
  edit <<BGP-Neighbor-IP-1>>
   set remote-as <<BGP-Remote-AS>>
 end
 config aggregate-address
  edit 1
   set prefix <<Aggregate-Address>>/<<Aggregate-Prefix>>
   set summary-only enable
 end
 config network
  edit 1
   set prefix <<Network-Address>> <<Subnet-Mask>>
 end
end
```

## Firewall Policy

```
# FW 0
config firewall policy
 edit 100
  set srcintf "vpn-<<ID>>-0"
  set dstintf internal
   set srcaddr all
   set dstaddr all
  set action accept
  set schedule always
   set service ALL
  next
end

config firewall policy
 edit 101
  set srcintf internal
  set dstintf "vpn-<<ID>>-0"
   set srcaddr all
   set dstaddr all
  set action accept
  set schedule always
   set service ALL
  next
end

# FW 1
config firewall policy
 edit 102
  set srcintf "vpn-<<ID>>-1"
  set dstintf internal
   set srcaddr all
   set dstaddr all
  set action accept
  set schedule always
   set service ALL
  next
end

config firewall policy
 edit 103
  set srcintf internal
  set dstintf "vpn-<<ID>>-1"
   set srcaddr all
   set dstaddr all
  set action accept
  set schedule always
   set service ALL
  next
end
```
axiosでチャットワークに投稿


即席で欲しい時があるのでメモ

```js
const axios = require('axios')
const createMessage = (token, room_id, body) => (
  axios({
    method: 'post',
    url: `https://api.chatwork.com/v2/rooms/${room_id}/messages`,
    headers: {'X-ChatWorkToken': token},
    data: `body=${body}`
  })
)

createMessage(token,room_id, body).catch(console.log)
```

```js
const axios = require('axios')
const createClient = token => {
  const client = axios.create({
    baseURL: 'https://api.chatwork.com/v2/',
    headers:   {'X-ChatWorkToken': token},
  })
  return {
  	createMessage(room_id, body) {
  	  return client.post(`rooms/${room_id}/messages`, `body=${body}`)
  	}
  }
}

 createClient(token).createMessage(room_id, body).catch(console.log)
```

# リンク

* [axios](https://github.com/axios/axios)
* [チャットワークAPI POST /rooms/{room_id}/messages](http://developer.chatwork.com/ja/endpoint_rooms.html#POST-rooms-room_id-messages)
zeppelin-solidity v1.3.0 変更内容(チェンジログ)

## [OpenZeppelin/zeppelin-solidity]のv1.3.0でのチェンジログ

CrowdsaleのstartBlockがtimestampになったりと互換のない変更もあります。
クラウドセール・スマートコントラクトの性質上、一つの変更でも見逃したら大事故になりかねないので整理しました。

## zeppelin-solidityの変更一覧(v1.2.0からv1.3.0)

- MultisigWalletを削除。[gnosis/MultiSigWallet](https://github.com/gnosis/MultiSigWallet)の使用を奨励
- examplesディレクトリを追加
- Crowdsaleのでブロックナンバーの代わりにタイムスタンプを使う(引数のstartBlock, endBlockをstartTime, endTimeに変更)
- FinalizableCrowdsaleからfinishMintingを削除。(クラウドセール終了時にトークンの発行を停止しない)
- Made approve pausable in PausableToken. (#448) *どういうことでしょうか*
- OwnershipTransferredイベントを追加。(所有権の移動をログする機能)
- BurnableTokenを追加。(トークンの一部を執行できるコントラクト)
- Added the CanReclaimToken contract. (#348 *どういうことでしょうか*
- 対話的に送金等出来るSafeERC20を追加。
- Added the MerkleProof library for merkle proof verification. (#26 *どういうことでしょうか*
- ERC20に関するいくつかのバグを解消
- transferFromに関するバグを解消
- transferOwnershipに失敗した時にrevertするようにする
- TokenTimelockに関するバグを解消
- テストとドキュメントの更新
- カバレッジとテストを並列化
- プロダクションだけの依存関係を削除

参考: https://github.com/OpenZeppelin/zeppelin-solidity/releases
How to fix VMWare windows screen resolution error

### Symptom

When trying to change Virtual Machine windows resolution, only very small resolution screen sizes are shown.

 - 128MB of video memory

#![2017-11-06_113011.png](https://qiita-image-store.s3.amazonaws.com/0/114634/d384815b-8e44-f52d-c0e2-3e786db25aa1.png)

### How to fix

- check virtual guest machines configuration
    - remove **svga.guestBackedPrimaryAware** => set Empty value
    - **vmotion.checkpointSVGAPrimarySize**
    - **svga.vramSize** (if set)
    - **svga.guestBackedPrimaryAware** => "FALSE"



-   NG

    ![2017-11-06_111457.png](https://qiita-image-store.s3.amazonaws.com/0/114634/9805be96-6715-7eef-6ab2-8c1c3db3349d.png)

 16777216 = 16MB --> limiting available VGA memory size


-   OK

    ![2017-11-06_111354.png](https://qiita-image-store.s3.amazonaws.com/0/114634/a02af668-b90a-d245-2c5f-af32d5b26cf8.png)

134217728 = 128MB --> make full use of available VGA memory !

:relaxed:


### Reference
http://tukaikta.blog135.fc2.com/blog-entry-128.html