OmniAICreator/Qiita-1.07M huggingface dataset:
【javascript】console.logでラベルを付けて出すとき

環境はChromeです。
以下のようなオブジェクトがあったとします。

```js
var food = {
  fruit: 'apple',
  vegetable: 'tomato'
};
```

Javascriptの`console.log`を使用すると、


```js
console.log(food);

// Object
//   fruit: "apple"
//   vegetable: "tomato"
//   __proto__: Object
```

と表示されます。
しかし、以下のようにラベルを付けてオブジェクトを出したい！と思って連結させてしまうと、

```js

console.log('food' + food );

// food[object Object]
```

となってしまいます。
いつもはラベルとオブジェクトをそれぞれ別の`console.log`を使って表示させていましたが、以下のようにするとちゃんと表示できることがわかりました。

```js
console.log('food' , food );

// food Object
//         fruit: "apple"
//         vegetable: "tomato"
//         __proto__: Object

```

おお！カンマ区切りにするだけでちゃんと表示できました！
ほかにも、置換文字列をつかって出力できました。

```js

console.log('food %o' , food );

// food Object
//         fruit: "apple"
//         vegetable: "tomato"
//         __proto__: Object

```

# console.log

### 引数に指定したオブジェクトを順に表示する

```js
console.log(obj1 [,obj2, ...]);
```

各オブジェクトの文字列表現が記述順で出力されます。

### 置換文字列を使用する

```js
console.log(str1 [,obj2, ...]);
```

第1引数：0個以上の置換文字列を含む文字列
第2引数以降：第1引数内の置換文字列と置換するオブジェクト

使用できる置換文字列

| 置換文字列 | 説明 |
|:-:|:-:|
| %o, %O | JavaScript オブジェクトを出力。 |
| %d, %i | 整数値を出力。数値の書式設定も可能。 |
| %s | 文字列を出力。 |
| %f | 浮動小数点数値を出力。数値の書式設定も可能。 |

```js:sample
console.log('food: %s (%d個)' , 'apple' , 10)

// food: apple (10個)
```

# 参考
https://developer.mozilla.org/ja/docs/Web/API/Console/log
https://developer.mozilla.org/ja/docs/Web/API/console#Outputting_text_to_the_console
Movable Typeのアイテムのアップロード先ディレクトリ

普段、主にWordPressでのコーディングやPHPプログラミングをしているんだけれど、今回Movable Typeでコーディングをすることに。

社内でも触ったことがある人が見当たらず、検索して出てくる情報もなんだか更新日が古い。
とりあえず前もって作成しておいたHTMLデータを切って分けて配置したけれど、なんだか間違っている気がする。


とりあえず調べてもすぐ出てこなかった、
アップロード先のディレクトリを直下から/upload/yyyy/mm/ 内にする方法。


設定 > 全般 の下のほうにある、[アップロード] の、[アップロード先]
ここの [カスタム] を選択して、%a/upload/%y/%m と入れる。
うっかり変なところに保存しないために、[アップロード時に変更を許可する]のチェックも外す。
これでWordPressみたいに、年月アーカイブされたディレクトリに保存される。

最初 upload/yyyy/mm と直接入れて
%s（サイトパス）か %a（アーカイブパス）から始まるパス名を指定してください。
と怒られたけどサイトパスとアーカイブパスの違いもまだよく分からないから、とりあえず %a
たぶんアーカイブ毎に保存されるんだろう。
年月を直接yyyy/mmっていれちゃうと本当にyyyyとmmっていうフォルダに分けれられたから、%y/%mと書く。
たぶん%y/%m/%dなら日付までフォルダができると思う。そこまで分ける必要もないから試してもいない。


使い方、合っているんだろうか…
素人の言語処理100本ノック:88


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第9章: ベクトル空間法 (I)
>[enwiki-20150112-400-r10-105752.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r10-105752.txt.bz2)は，2015年1月12日時点の英語のWikipedia記事のうち，約400語以上で構成される記事の中から，ランダムに1/10サンプリングした105,752記事のテキストをbzip2形式で圧縮したものである．このテキストをコーパスとして，単語の意味を表すベクトル（分散表現）を学習したい．第9章の前半では，コーパスから作成した単語文脈共起行列に主成分分析を適用し，単語ベクトルを学習する過程を，いくつかの処理に分けて実装する．第9章の後半では，学習で得られた単語ベクトル（300次元）を用い，単語の類似度計算やアナロジー（類推）を行う．
>
>なお，問題83を素直に実装すると，大量（約7GB）の主記憶が必要になる． メモリが不足する場合は，処理を工夫するか，1/100サンプリングのコーパス[enwiki-20150112-400-r100-10576.txt.bz2](http://www.cl.ecei.tohoku.ac.jp/nlp100/data/enwiki-20150112-400-r100-10576.txt.bz2)を用いよ．

### 88. 類似度の高い単語10件
>85で得た単語の意味ベクトルを読み込み，"England"とコサイン類似度が高い10語と，その類似度を出力せよ．

#### 出来上がったコード：

```python:main.py
# coding: utf-8
import pickle
from collections import OrderedDict
from scipy import io
import numpy as np

fname_dict_index_t = 'dict_index_t'
fname_matrix_x300 = 'matrix_x300'


def cos_sim(vec_a, vec_b):
	'''コサイン類似度の計算
	ベクトルvec_a、vec_bのコサイン類似度を求める

	戻り値：
	コサイン類似度
	'''
	norm_ab = np.linalg.norm(vec_a) * np.linalg.norm(vec_b)
	if norm_ab != 0:
		return np.dot(vec_a, vec_b) / norm_ab
	else:
		# ベクトルのノルムが0だと似ているかどうかの判断すらできないので最低値
		return -1


# 辞書読み込み
with open(fname_dict_index_t, 'rb') as data_file:
		dict_index_t = pickle.load(data_file)

# 行列読み込み
matrix_x300 = io.loadmat(fname_matrix_x300)['matrix_x300']

# 'England'とのコサイン類似度算出
vec_England = matrix_x300[dict_index_t['England']]
distances = [cos_sim(vec_England, matrix_x300[i])
		for i in range(0, len(dict_index_t))]

# 上位10件を表示
index_sorted = np.argsort(distances)
keys = list(dict_index_t.keys())
for index in index_sorted[-2:-12:-1]:		# トップに来る自分自身は除く
	print('{}\t{}'.format(keys[index], distances[index]))
```

#### 実行結果：
```console:実行結果
Scotland	0.6780631362432838
Australia	0.6439496692044923
Wales	0.6352223096061712
Italy	0.5993389833593241
Spain	0.5810143958505265
France	0.5711030646029182
Japan	0.5709618229888032
Germany	0.5377148103064543
Ireland	0.5374312543293124
Europe	0.4868884673753479
```

### 実行結果について
結果を見ると国名が並んでいるので、「England」が国であることは特徴として捉えているようです。また、「Scotland」や「Wales」や「Ireland」といったイギリスの国がTop10に入ってきたのも驚きです。
文章を構文解析したり同義語辞書を使ったりしている訳でもなく、単純にその単語の周辺で使われる文脈語をベクトル化しただけで、ここまでヒトの感覚に似た単語を提示できるのは、いろいろな可能性を感じさせてくれて面白いですね。

　
89本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第9章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
CentOS7でcronを指定日時に実行する

備忘録代わりに書いておきます。

#環境

CentOSのバージョン

    $ cat /etc/redhat-release
    CentOS Linux release 7.3.1611 (Core)

#手順

CentOS7では初期設定でcronie-anacronがインストールされており、ジョブの実行時間に幅を持たせている。
指定日時ぴったりにジョブを実行したい場合、cronie-noanacronを入れる必要がある。

依存関係上先に、cronie-noanacronをインストールし、その後にcronie-anacronを削除する。

    $ sudo yum -y install cronie-noanacron
    $ sudo yum -y remove cronie-anacron

設定は/etc/cron.d/dailyjobsで行う。

設定の確認。

    $ cat /etc/cron.d/dailyjobs

    # Run the daily, weekly, and monthly jobs if cronie-anacron is not installed
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root

    # run-parts
    2 4 * * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.daily
    22 4 * * 0 root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.weekly
    42 4 1 * * root [ ! -f /etc/cron.hourly/0anacron ] && run-parts /etc/cron.monthly

cronie-anacronが削除されない場合は、実行されないようになっていることが分かる。

実行したいシェルは頻度に応じて/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthlyに配置する。

配置後にcrondの再起動が必要。

    $ sudo systemctl restart crond

ログは/var/log/cronに出力される
ログの確認。

    $ sudo less /var/log/cron
AngularでYouTube埋め込みをしようとしたらハマった

# 解決法
`innerHTML`に設定するHTMLはデフォルトでサニタイズされるようになっており、iframeタグが自動的に除去されるのが原因でした。
サニタイズされるのはjavascriptだけだと思っていましたが、iframeも駄目みたいです。

```ts
import { DomSanitizer } from '@angular/platform-browser';
constructor(private sanitizer: DomSanitizer) {}

let innerHTML = this.sanitizer.bypassSecurityTrustHtml(html);
```

# 注意
サニタイズすると、iframeだけではなくjavascriptも埋め込み可能になるのでXSSには注意して下さい。

# 参考
* [Security - GUIDE](https://angular.io/docs/ts/latest/guide/security.html)
* [DomSanitizer - API](https://angular.io/docs/ts/latest/api/platform-browser/index/DomSanitizer-class.html)
初心者向け コマンドライン：ショートカットキー


## 概要
エンジニアとして働くと必ず毎日触れるのが、コマンドライン。

たぶんプログラミングを始めたばかりの方などは、コマンドラインにショートカットキーがあることを知らないかもしれません。

コマンドラインのショートカットキーを使うとストレスなくコマンドを実行できるので覚えると便利です。

## コマンドライン
- コマンドラインとは、ターミナルなどで使用する以下のことです。

![スクリーンショット 2017-04-01 12.02.32.png](https://qiita-image-store.s3.amazonaws.com/0/142810/646650d5-6033-417b-1c5c-36997e27caac.png "スクリーンショット 2017-04-01 12.02.32.png")

## ショートカットキー
※ あくまでも個人的に使って便利だと思った評価です。ご了承ください。

### 便利度：★★★
- Ctrl + a
  - カーソルをコマンドラインの先頭に移動します。
- Ctrl + e
  - カーソルをコマンドラインの最後に移動します。
- Ctrl + u
  - カーソル位置の前を削除します。

### 便利度：★★
- Ctrl + k
  - カーソル位置からコマンドラインの最後までを削除します。
- Ctrl + b
  - カーソルをひとつ前に移動します。
- Ctrl + f
  - カーソルを1文字後ろに移動します。

### 便利度：★
- Ctrl + h
  - カーソル位置の前の文字を削除します。
- Ctrl + d
  - カーソル位置の文字を削除します。
- Ctrl + y
  - 削除した文字をカーソル位置に挿入します。（1文字ずつ削除した場合は除く）


## まとめ
以上がコマンドラインのショートカットキーを便利度別にしたものです。

あまり数はないので、1つ1つ実行して試してください。

良い開発ライフを^^
Qiita投稿用画像をキャプチャする便利ツール

chrome拡張のFireShotがいい感じ。もちろんQiitaに限らず汎用で使える。

Webページをキャプチャした画像にお絵かきとかぼかしを入れて、
それを再度クリップボードに取り込むことが出来るんで、
そのままQiitaのエディタ上でペーストすればOK。


(2017/4/9 追記)
動かなくなった。キャプチャしてアプリが立ち上がるんだけど何もボタン操作が出来ない。
うっかりプロ版への変更ボタンも押してしまったんで、そのうち期限切れか？
しょうがないから、
- PrtScで画面キャプチャーとって
- OneDriveに自動保存された画像をペイントで編集して
- コピーでクリップボードに取り込んで
- Qiitaのエディタに張り付ける
で対応。

ペインはぼかし機能が無いのが不便と言えば不便。
eZ Publish のテンプレート上でモジュール名またはファンクション名を取得する

**eZ Publish** のテンプレート上でモジュール名やファンクション名を参照したい場合は `module_params()` テンプレートオペレーターで取得できる。

```jinja
{def $module_params = module_params()}
モジュール名： {$module_params.module_name}<br />
ファンクション名： {$module_params.function_name}<br />
ビューモード： {$module_params.parameters.ViewMode}<br />
ノードID： {$module_params.parameters.NodeID}
```
```text:出力例
モジュール名： content
ファンクション名： view
ビューモード： full
ノードID： 65
```
https://doc.ez.no/doc_hidden/eZ-Publish/Technical-manual/4.x/Reference/Template-operators/Data-and-information-extraction/module_params
クラスや変数の名前とかを安易に英語にしたい


結論から言うときちんと、[codic](https://codic.jp/)さんなどを参考にしつつ**名は体を表す**のようにちょっとは考えて命名すべきです。

## 名前付けでお疲れの方へ

以下は正しい行いか?と言われると多分そうではないと思います(汗)が、Xcodeの拡張機能を作ったので(宣伝を兼ねつつ)その使い方の例を挙げてみたいと思います。良い子は真似してはいけません。

### 拡張機能を使えるようにする

#### アプリをインストールする

Mac App Storeからアプリをダウンロード&インストールして、Xcodeのソースエディタに拡張機能を組み込みます。

* [LanguageTranslator for Xcode](https://itunes.apple.com/jp/app/languagetranslator-for-xcode/id1218781096?mt=12) ... 英語と日本語を相互変換できます
* [NamingTranslator for Xcode](https://itunes.apple.com/jp/app/namingtranslator-for-xcode/id1218784832?mt=12) ... パスカルケースとキャメルケースとスネークケースを相互変換できます

![Screenshot_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/946a4998-eb01-48c8-42e1-2f233b8344cc.jpeg "Screenshot_1.jpg")

システム環境設定の機能拡張でインストールしたアプリが有効になっているのを確認してください。

#### キーボードショートカットを設定する

メニューからマウスでちまちまと呼び出すのが面倒なので、キーボードショートカットを割り当てます。

![Screenshot_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/79fb0653-2e73-8d09-1f81-6cb4f0bbd709.jpeg "Screenshot_2.jpg")

### 日本語でコードを書く

ひとまず、クラス名や変数名を日本語で書きます。Swiftだと日本語で書いてもコンパイラが認識するのでこのままでも問題なかったりします。

![Screenshot_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/ef917f3e-ea92-b9e4-902c-205ae7384646.jpeg "Screenshot_3.jpg")

### クラス名を英語に変える

クラス名を選択します。

![Screenshot_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/51deea6b-b24f-bcfc-a8fc-a2f0b5ff93f3.jpeg "Screenshot_4.jpg")

設定してあるショートカットを発動します。
英訳 `Ctrl + Option + T` からの、一呼吸置いて パスカルケース形式 `Ctrl + Option + P` へ! 

![Screenshot_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/246e249e-e102-c21d-81ea-9d2d42819a84.jpeg "Screenshot_5.jpg")

ブラボー!

ちなみに、ショートカットを素早く連続実行すると拡張機能が裏側でクラッシュしてXcodeを再起動するまで使用不能になったりします(ぉ

### 変数名を英語に変える

変数名を選択します。

![Screenshot_6.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/a1a9c812-cc14-d366-12d2-02db1da55159.jpeg "Screenshot_6.jpg")

設定してあるショートカットを発動します。
英訳 `Ctrl + Option + T` からの、一呼吸置いて キャメルケース形式 `Ctrl + Option + C` へ! 

![Screenshot_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/337f00c4-6cd0-d29b-c5b4-19e3ba5c8624.jpeg "Screenshot_7.jpg")

ブラボー!

ちなみに、ショートカットを素早く連続実行すると拡張機能が裏側でクラッシュしてXcodeを再起動するまで使用不能になったりします(ぉ

### メソッド名を英語に変える

省略。(ぇ
日本語で「私は〜する」みたいな感じで書いて、英訳後の主語を削除してからキャメルケース形式に変換、とすればよいかと。

### 後は機械的に

で、機械的に一通り英語に置き換えるとこんな感じになります。

![Screenshot_8.jpg](https://qiita-image-store.s3.amazonaws.com/0/49258/7105aee5-cbab-a6a0-c040-41e9a3c2f257.jpeg "Screenshot_8.jpg")


最近の機械翻訳はすごい。

おしまい。
Xcodeで開いているファイルをAppCodeで開くAppleScript

Xcodeで開いているファイルをAppCodeで開くAppleScriptを作成しました。

まずAppCodeのメニュー`Tools->Create Command-line Launcher…`でコマンドを作成します。

以下のスクリプトを実行するとXcodeで開いているファイルがAppCodeで開かれます。Xcodeでカーソルがある行にカーソルが移動します。

```AppleScript
tell application "Xcode"
	set projectPath to path of active workspace document
	set projectFolder to characters 1 thru -((offset of "/" in (reverse of items of projectPath as string)) + 1) of projectPath as string
	
	set currentDocument to document 1 whose name ends with (word -1 of (get name of window 1))
	set filePath to path of currentDocument
	
	set range to selected paragraph range of currentDocument
	set lineNumber to item 1 of range
	
	do shell script "/usr/local/bin/appcode " & projectFolder & " " & filePath & ":" & lineNumber
end tell
```

私はAlfredで実行できるように設定しました。これでXcodeからAppCodeへの移動が楽になりました。
Github.ioにサイトを立ててみよう

https://pages.github.com/
今回はGithub.ioにサイトを立ててみます。
１アカウント１サイト持てるようです。

# リポジトリを作成

まずusername.github.ioという名前のリポジトリを[githubに作成](https://github.com/new)します。私の場合だと、kazusa-qooq.github.ioになります。

# リポジトリのクローン

作成しましたらリポジトリをクローンします。

```
:~/workspace/blog $ git clone https://github.com/kazusa-qooq/kazusa-qooq.github.io
Cloning into 'kazusa-qooq.github.io'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
:~/workspace/blog $ 
```

# テストページを作る
プロジェクトに移動してindex.htmlを作ります。

```
qooq:~/workspace/blog $ cd kazusa-qooq.github.io/
:~/workspace/blog/kazusa-qooq.github.io (master) $ echo "Hallo World" > index.html
:~/workspace/blog/kazusa-qooq.github.io (master) $ cat index.html 
Hallo World
:~/workspace/blog/kazusa-qooq.github.io (master) $ 
```

# アップロードする
作成したファイルをgithubにアップします。
add -all して　commit して　push　するだけです。

```
:~/workspace/blog/kazusa-qooq.github.io (master) $ git status
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        index.html

nothing added to commit but untracked files present (use "git add" to track)
:~/workspace/blog/kazusa-qooq.github.io (master) $ git add -A
:~/workspace/blog/kazusa-qooq.github.io (master) $ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   index.html

:~/workspace/blog/kazusa-qooq.github.io (master) $ git commit -m "First"
[master (root-commit) 77923e0] First
 1 file changed, 1 insertion(+)
 create mode 100644 index.html
:~/workspace/blog/kazusa-qooq.github.io (master) $ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 223 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/kazusa-qooq/kazusa-qooq.github.io
 * [new branch]      master -> master
:~/workspace/blog/kazusa-qooq.github.io (master) $ 
```

# アクセスする
https://kazusa-qooq.github.io/
![image](https://qiita-image-store.s3.amazonaws.com/0/71988/33a17f3d-f09d-8d84-4c6e-49c10611bc54.png)

できました！
簡単ですね。ではまた今度。
Swift3 : UnitTest

#Swift3でUnitTest始めました。
初めてなので設定から簡単なテストケースを作成します。

#環境
mcOS siera
xcode:8.2.1
swift3

#プロジェクト生成
MyUnitTestの名前でプロジェクトを作ります. 「include unit tests」にチェックを入れると自動的に追加されます。
<img width="730" alt="スクリーンショット 2017-04-01 9.54.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/e24bff83-2e64-c192-2527-81a38cf90657.png">

既に実装中のプロジェクトの場合以下のクリックしてBundleを追加すればUnitTestが追加されます。
File>New>Target
<img width="467" alt="スクリーンショット 2017-04-01 10.25.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/a744ea6f-a375-70dc-6476-be4483ee4d4a.png">

<img width="343" alt="スクリーンショット 2017-04-01 10.26.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/585808dc-048b-9adc-bca7-9f99ebb41afe.png">

iOS Unit Testing Bundleを選択して設置すればOK

#ViewControllerにFunctionを一つ追加してみます
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    /// 入力された文字列が数字かどうか判別
    ///
    /// - Parameter numStr: 文字列
    /// - Returns: 判別結果
    func isNumber(numStr: String) -> Bool {
        if Int(numStr) != nil {
           return true
        } else {
            return false
        }
    }

}
```

#ViewControllerに追加したFunctionをテストするテストケース作成
##テストファイル追加
<img width="309" alt="スクリーンショット 2017-04-01 10.08.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/ad5510bc-b7e8-7d60-8c97-d4adfd0f0cb0.png">
<img width="733" alt="スクリーンショット 2017-04-01 10.09.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/64667951-0722-79ab-4127-f470939eb56c.png">
「Unit Test Case」を選択します。「Ui Test Case」とアイコンが同じなので間違いしないようにしてください。ハマります。
<img width="728" alt="スクリーンショット 2017-04-01 10.09.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/f3f484ef-1910-8627-ad73-ece0d844b277.png">

##テストケース作成
「@testable import MyUnitTest」を追加
その後はViewControllerを生成してテストケースを追加するだけです。
今回は簡単にTrue,Falseが正しくリタンされていることを確認します。

```swift:ViewControllerTests.swift
import XCTest
@testable import MyUnitTest

class ViewControllerTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
    }
    
    override func tearDown() {
        super.tearDown()
    }
    
    let vc = ViewController()
    
    func test_isNumber関数に数字の文字列が入力された場合Trueがリタンされる() {
        XCTAssertTrue(vc.isNumber(numStr: "123"))
    }
    
    func test_isNumber関数に数字の文字列が入力された場合Falseがリタンされる() {
        XCTAssertFalse(vc.isNumber(numStr: "テスト"))
    }
    
}

```

#テスト実行
Product>Test実行
<img width="192" alt="スクリーンショット 2017-04-01 10.47.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/9a9188da-97f1-0cc7-2ceb-dc92f5ca476f.png">

Functionの横にある実行ボタンを押しても実行可能
<img width="517" alt="スクリーンショット 2017-04-01 10.48.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/af3d1d7a-eb06-d50f-359d-d5787afc14c9.png">
MWS 最新のInventoryレポートを取得するにはAPIを４回も叩く必要がある？

# どういうこと
最新のInventoryレポートを取得するだけでも、なんとAPIを４回叩く必要がある。
セラーセントラルのInventoryマネージャーを使ったことがある人であればイメージできると思うけど、
セラーセントラルからレポートを取得する場合は
レポート作成リクエスト→完了を待つ→レポート取得
という流れ。

今回MWSからレポートを取得する場合は

1. レポート作成リクエスト（RequestReport）

2. 完了を待つ（GetReportRequestList）

3. 最新のレポートの選定（GetReportList）

4. レポート取得（GetReport）

こんな流れ！
各アクションがどんなものか簡単に紹介しておこうかと。

# リクエスト詳細
## RequestReport
| 項目 |  |
|:-----------------|:------------------|
| Action | [RequestReport](http://docs.developer.amazonservices.com/ja_JP/reports/Reports_RequestReport.html) |
| ReportType | [出品レポート（\_GET_FLAT_FILE_OPEN_LISTINGS_DATA_）](http://docs.developer.amazonservices.com/ja_JP/reports/Reports_ReportType.html) |
| レスポンス | XML |

指定したReportTypeのレポートの作成リクエストを送信する。
RequestIdを取得できる。

## GetReportRequestList
| 項目 |  |
|:-----------------|:------------------|
| Action | [GetReportRequestList](http://docs.developer.amazonservices.com/ja_JP/reports/Reports_GetReportRequestList.html) |
| ReportRequestIdList | RequestReportで取得したRequestId |
| レスポンス | XML |

色々な使い方があると思うけど、
今回はReportRequestIdListにRequestReportで取得したRequestIdを設定することで、レポート作成の進捗状況を確認する。
進捗状況を示すステータスは以下の種類がある。

- \_SUBMITTED_
- \_IN_PROGRESS_
- \_CANCELLED_
- \_DONE_
- \_DONE_NO_DATA_

数分に1回ステータスを見に行って_DONE_になれば次へ進むって感じの実装になるかな。

<font color="Red">※正確に最新じゃなくていいって場合は、
「RequestReportで作成リクエスト出して1時間待つ」みたいな実装でGetReportRequestListで状態を確認するフェーズをとばすことができる。</font>

## GetReportList
| 項目 |  |
|:-----------------|:------------------|
| Action | [GetReportList](http://docs.developer.amazonservices.com/ja_JP/reports/Reports_GetReportList.html) |
| ReportType | [出品レポート（_GET_FLAT_FILE_OPEN_LISTINGS_DATA_）](http://docs.developer.amazonservices.com/ja_JP/reports/Reports_ReportType.html) |
| レスポンス | XML |

指定したReportTypeの作成済みレポートの一覧を取得できる。
一番上が最新なのでそこのReportIdを取得する。
ReportRequestIdListで指定できるけど、一番上が最新なので指定する必要はない。

## GetReport
| 項目 |  |
|:-----------------|:------------------|
| Action | [GetReport](http://docs.developer.amazonservices.com/ja_JP/reports/Reports_GetReport.html) |
| ReportId | GetReportListで取得したReportId |
| レスポンス | テキストタブ区切り |

GetReportListで取得したReportIdを指定してInventoryレポートを取得。
テキストタブ区切りで返ってくる。CSVがよかったなあ

# まとめ
まあでもそんなもんやろ
AWS環境で、Jenkins-slaveを追加する

# 環境
*master*
amazon linux  (2017/04/01時点の最新)
java          java-1.8.0-openjdk
Jenkins       2.52

*slave*
amazon linux  (2017/04/01時点の最新)
java          java-1.8.0-openjdk


JenkinsのSSHスレーブサーバを追加したところ以下のエラーが発生して
上手くslaveサーバを追加できなかったので、その対処方法。

```
[04/01/17 09:51:23] [SSH] Opening SSH connection to 172.31.xxx.xxx:22.
/var/lib/jenkins/.ssh/known_hosts [SSH] No Known Hosts file was found at /var/lib/jenkins/.ssh/known_hosts. Please ensure one is created at this path and that Jenkins can read it.
Key exchange was not finished, connection is closed.
java.io.IOException: There was a problem while connecting to 172.31.xxx.xxx:22
	at com.trilead.ssh2.Connection.connect(Connection.java:818)
	at com.trilead.ssh2.Connection.connect(Connection.java:687)
	at com.trilead.ssh2.Connection.connect(Connection.java:601)
	at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1265)
	at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:790)
	at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:785)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Key exchange was not finished, connection is closed.
	at com.trilead.ssh2.transport.KexManager.getOrWaitForConnectionInfo(KexManager.java:93)
	at com.trilead.ssh2.transport.TransportManager.getConnectionInfo(TransportManager.java:230)
	at com.trilead.ssh2.Connection.connect(Connection.java:770)
	... 9 more
Caused by: java.io.IOException: The server hostkey was not accepted by the verifier callback
	at com.trilead.ssh2.transport.KexManager.handleMessage(KexManager.java:535)
	at com.trilead.ssh2.transport.TransportManager.receiveLoop(TransportManager.java:777)
	at com.trilead.ssh2.transport.TransportManager$1.run(TransportManager.java:489)
	... 1 more
[04/01/17 09:51:23] Launch failed - cleaning up connection
[04/01/17 09:51:23] [SSH] Connection closed.
```

#対処方法を先に記載します。
管理者でログインし、
[Jenkinsの管理]-[ノードの管理]へ移動し、今回エラーが出ているノードを選択します。

Host Key Verification Strategyの設定値を変更する。
「Known hosts file Verification strategy」
　　　　　　　　　　↓
「Manually trusted key Verification Strategy」

![0401_02.png](https://qiita-image-store.s3.amazonaws.com/0/78936/35aa811b-18b1-3f58-673b-c9877750fce1.png)


# 参考ページ
https://linuxacademy.com/community/posts/show/topic/16008-jenkins-adding-a-slave


#その他
Jenkins slaveの追加を書こうかと思ったのですが、他の方々が書かれているので今回は割愛します。

#追伸
SSH Slaves pluginのアップデートした場合以下のメッセージが出るようです。

```
SSH Host Key Verifiers are not configured for all SSH slaves on this Jenkins instance. This could leave these slaves open to man-in-the-middle attacks. Update your slave configuration to resolve this.
```

その場合も、「Manually trusted key Verification Strategy」に変更することで、エラーがなくなります。
VSCode自分用メモ

keybindings.json

```
[
    { "key": "ctrl+h",                  "command": "cursorLeft",
                                     "when": "editorTextFocus" },
    { "key": "ctrl+l",                  "command": "cursorRight",
                                     "when": "editorTextFocus" },
    { "key": "ctrl+j",                  "command": "cursorDown",
                                     "when": "editorTextFocus" },
    { "key": "ctrl+k",                  "command": "cursorUp",
                                     "when": "editorTextFocus" }
]
```
Ubuntu Server 基本設定メモ


サーバ運用にはCentOS利用してますがテスト環境とかUbuntuを利用することもあるので基本的なことのメモ。

## インストールと初期設定

### インストール

今（2017年3月）だと、Ubuntu Server 16.04 LTSってのが最新のLTSっぽいので、[それ](https://www.ubuntu.com/download/server)を利用。日本語Remix[こちら](https://www.ubuntulinux.jp/download/ja-remix)もあります。

Google先生に聞けば死ぬほど情報はありますが、今回は[こちら](https://www.server-world.info/query?os=Ubuntu_16.04&p=install)を参考にさせていただきました。

ほぼガイダンス通りですが、違いとしてはLVMは利用せず[use entire disk]を選択したくらい。

### アップデート

なには無くともアップデート。

```bash
sudo apt-get update
sudo apt-get upgrade
```
を実行。

### SSHでのログインを可能に

セットアップ時に選んだ[standard system utilities]にはssh(d)は含まれてない模様。なのでインストールする。

```bash
sudo apt-get install openssh-server
service ssh status
```

>プロセス名はsshdではない。

インストールするだけで初期ユーザーに対するID,PWによるログインは許可される模様。本運用では証明書ログインに切り替えるところですが、開発用なので一旦これでOKとする（必要に応じて加筆します）。

### Git

gitは2.7.4が入っているもよう。

### Zip, Unzip

なぜかzip, unzipが入っていない。。。

```bash
sudo apt-get install zip unzip
```

## 基本的なサーバ類

### Apache

なには無くともApache。2.4.xがインストールされるのでconfigの書き方は注意。
基本的にはCentOS7.xの設定が役に立つので[こちら](http://qiita.com/zaburo/items/c07a7fa6fa82e97f6b10)も参考に。

```bash
sudo apt-get install apache2
sudo service apache2 status
```

>プロセス名はhttpdではない。
>設定ファイルは/etc/apache2以下。
>ドキュメントルートは/var/www/html

### PHP

特に指定しなければPHP7.0ベースでインストールされるようです。

```bash
sudo apt-get install php libapache2-mod-php php-mysql php-mcrypt php-gd php-mbstring php-xml
```

>php-mcrypt php-gd php-mbstring php-xmlはLaravel利用を想定して入れています。

### MySQL

特に指定しなければ5.7.xがインストールされるようです。デフォルトでは1年でパスワードが切れるはずなので設定に注意です。

```bash
sudo apt-get install mysql-server
```

インストールの途中にrootのパスワードを聞いてきます。

>sudo service mysql status

### Composer

```bash
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
```

composerを実行すると、/home/xxxx/.composer以下のファイルに書き込み出来ない！的なエラーが出る場合があります。
その場合は、

```bash
sudo chown -R user:user .composer
```

>userはログインユーザー名。

とすればいいでしょう。

## 参考リンク

* 実運用に向けた設定は[こちら](http://qiita.com/kotarella1110/items/f638822d64a43824dfa4)が参考になります。

その他、随時追記します。
[Vue.js][clipboard.js] Vue.jsとclipboard.jsを組み合わせて使用する

以前、clipboard.jsの使い方の記事を書いたんですが、Vue.jsの `v-model` が対象の場合はちょっとやりかたが違ったのでメモ

[[JavaScript] ”クリップボードにコピー” ボタンを実装する（clipboard.jsの使い方） - Qiita](http://qiita.com/koara-local/items/07dbc9548e704dd285e1)

※ちなみに、`vue-clipboard` というのも検索すると出てきますが、こちらは Vue.js 1.x でしか動作しません

# 使用例

clipboard.jsは基本的にコピー対象のフォームのidを指定しますが、Vue.jsのv-modelで指定している場合は思ったように動作しません。
かわりに `:data-clipboard-text` で、Vueの対象dataの名前を指定してやればいいです。

```html:index.html
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.6.0/clipboard.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.6/vue.min.js"></script>

<div id="app">
    <input v-model="inputText" type="text">
    <button class="btn" :data-clipboard-text="inputText">Copy</button>

    <textarea v-model="textareaText"></textarea>
    <button class="btn" :data-clipboard-text="textareaText">Copy</button>
</div>

<script>
(function() {
'use strict';

var clipboard = new Clipboard('.btn');

clipboard.on('success', function(e) {
    console.info('Action:', e.action);
    console.info('Text:', e.text);
    console.info('Trigger:', e.trigger);
    
    e.clearSelection();
});

clipboard.on('error', function(e) {
    console.error('Action:', e.action);
    console.error('Trigger:', e.trigger);
});

var app = new Vue({
    el: "#app",
    data: {
        inputText: "クリップボードコピーテスト(input)",
        textareaText: "クリップボードコピーテスト(textarea)"
    }
});

})();
</script>
```

# 参考
[clipboard.js — Copy to clipboard without Flash](https://clipboardjs.com/)
[フォーム入力バインディング - Vue.js](https://jp.vuejs.org/v2/guide/forms.html)
アプリケーションからDiscordのチャンネルにメッセージを送る

# サーバーからDiscordに通知をしたい
[EverydayOneMotion](https://motions.work)という企画をしているのですが、エイプリルフール企画で「ユーザーに投稿してもらったものを手動確認してTwitter投稿」、みたいなことをすることになりました。
メンバーの連絡ツールにDiscordを使っており、 `#aprilfool2017` チャンネルに通知しようとしたところ分かりやすい情報が出なかったので、ここに記しておきます。

言語はPHPですが、POST送れればなんでも良さそう。

# 1.webhookのURLを取得
<img width="282" alt="スクリーンショット 2017-04-01 8.08.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/85281/9092755e-a46f-6bfc-c81a-43c5ff1ed29c.png">

チェンネル一覧右側の「チャンネルの編集」をクリック

<img width="939" alt="スクリーンショット 2017-04-01 8.11.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/85281/640b3bbb-ae89-ec72-d0c0-41055b06544a.png">
「webhookを作成」をクリック、BOTの情報を適宜編集できます。

# 2.webhookにPOSTする
取得したURLにPOSTすると通知を送ることが出来ます。

```php

// Guzzleなりcurlなりでよさそう
$client = new GuzzleHttp\Client();
$request = $client->createRequest('POST', DISCORD_WEBHOOK, ['json' => ['content' => 'ここにメッセージ']]);
$response = $client->send($request);

```

```json
{
  "content":"ここにメッセージ"
}
```

# 様子
<img width="750" alt="スクリーンショット 2017-04-01 8.26.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/85281/fec4d503-f4f8-cce9-532f-32093fe54928.png">

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">「一目惚れ」 (by <a href="https://twitter.com/_Nokir">@_Nokir</a> ) <a href="https://twitter.com/hashtag/motiongraphics?src=hash">#motiongraphics</a> <a href="https://twitter.com/hashtag/EveOneMotion?src=hash">#EveOneMotion</a> <a href="https://t.co/CrYqrjbXF4">pic.twitter.com/CrYqrjbXF4</a></p>&mdash; EOM@～23:00JST (@motions_work) <a href="https://twitter.com/motions_work/status/847826800101085188">2017年3月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

他のパラメータは下記リンクを参考に

# 参考
https://gist.github.com/jagrosh/7606268fc9f1d3e90ce9efc79294f960
https://github.com/hammerandchisel/discord-api-docs/blob/2f0a074005618a51df2f26122a6d4c7aa216732e/docs/resources/Webhook.md
http://docs.guzzlephp.org/en/5.3/clients.html#json
TensorFlow > mapping > R^2のinputをR^2のoutputにmappingする > y1, y2の3D表示

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

[Learning in Multidimensional Spaces — Neural Networks. Matrix Formulation by Andrew P Paplinski](http://users.monash.edu/~app/Lrn/LearningMDS.pdf)
March 17, 2017
の「5.4 (Simple) example of function approximation」における2次元入力(実数R^2)から2次元出力(R^2)へのmappingを試している。

y1, y2の3D画像を表示してみた。

### 関連 

学習コード v0.1: http://qiita.com/7of9/items/16bf19555dd97b09ecb0


### 3D表示code

参考 http://qiita.com/Takumi0204/items/28f35d60bef18954aabe

Jupyterコード。

```py:test_3Dplot_170401b.ipynb
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm


def func_y1(x1, x2):
    rho = x1 ** 2 + x2 ** 2
    y1 = x1 * np.exp(-rho ** 2)
    return y1


def func_y2(x1, x2):
    rho = x1 ** 2 + x2 ** 2
    try:
        y2 = np.sin(2.0 * rho ** 2) / 4.0 / rho ** 2
    except ZeroDivisionError:
        y2 = 0.0
    return y2

x1 = np.arange(-2, 2, 0.01)
x2 = np.arange(-2, 2, 0.01)
X1, X2 = np.meshgrid(x1, x2)

y1 = func_y1(X1, X2)
y2 = func_y2(X1, X2)

fig1 = plt.figure()
ax1 = Axes3D(fig1)
ax1.plot_surface(X1, X2, y1, cmap=cm.coolwarm)

fig2 = plt.figure()
ax2 = Axes3D(fig2)
ax2.plot_surface(X1, X2, y2, cmap=cm.coolwarm)

plt.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e2f690fb-502d-6197-18be-f3eddc631774.png)
numpy > numpy array > TypeError: only length-1 arrays can be converted to Python scalars > math.exp()でなくnumpy.exp()を使う

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```


http://qiita.com/Takumi0204/items/28f35d60bef18954aabe
を参考に
http://qiita.com/7of9/items/54ec092a91880df9dc64
の結果y1をmatplotlibにて3D表示しようとした。

### 失敗コード

```py:test_3Dplot_170401a.ipynb
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import math

def func_y1(x1, x2):
    rho = x1 ** 2 + x2 ** 2
    y1 = x1 * math.exp(-rho ** 2)
    return y1

x = np.arange(-2, 2, 0.03)
y = np.arange(-2, 2, 0.03)

X, Y = np.meshgrid(x,y)

Z = func_y1(X,Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X,Y,Z,cmap=cm.coolwarm)
plt.show()
```

```txt:結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-33-c3184147fbdd> in <module>()
     16 X, Y = np.meshgrid(x,y)
     17 
---> 18 Z = func_y1(X,Y)
     19 
     20 fig = plt.figure()

<ipython-input-33-c3184147fbdd> in func_y1(x1, x2)
      7 def func_y1(x1, x2):
      8     rho = x1 ** 2 + x2 ** 2
----> 9     y1 = x1 * math.exp(-rho ** 2)
     10     #y1 = x1 * np.exp(-rho ** 2)
     11     return y1

TypeError: only length-1 arrays can be converted to Python scalars
```

以下を見つけた。
https://github.com/lesguillemets/notes/blob/master/2013/Nov/13.python-numpy-sin.md

math.exp()でなくnumpy.exp()を使うようです。
情報感謝です。


### 修正後

```py:test_3Dplot_170401a.ipynb
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import math

def func_y1(x1, x2):
    rho = x1 ** 2 + x2 ** 2
    #y1 = x1 * math.exp(-rho ** 2)
    y1 = x1 * np.exp(-rho ** 2)
    return y1

x = np.arange(-2, 2, 0.03)
y = np.arange(-2, 2, 0.03)

X, Y = np.meshgrid(x,y)

Z = func_y1(X,Y)

fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X,Y,Z,cmap=cm.coolwarm)
plt.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/55cd726a-c95b-4227-117a-d72e098f06fe.png)
技術英語 > [are kept separate] to avoid bloating the core language. / snowball

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 3110 / 12833)

> **are kept separate** to avoid bloating the core language.

https://www.merriam-webster.com/dictionary/bloat
> 1b :  unwarranted or excessive growth or enlargement 

前の文章から見ると

> One of Python's prominent claims is that it has "batteries included" -- a large standard library of modules that perform many useful tasks, and are kept separate to avoid bloating the core language.

意訳「Pythonでよく聞く主張の１つは、Pythonはbatteriesを含めている、ということだ。多くの有用なタスクを処理する大きな標準ライブラリのことであり、それは分離されていることで、core languageの肥大化を防いでいる」

<hr>
関連して思い出したのは

snowball

http://ejje.weblio.jp/content/snowball
> 自動詞
> 2 雪だるま式に増大する.

技術的負債がsnowballした日には。。。

返済は計画的に。
Go言語でRPMファイルを読む その１.5

# [前回](http://qiita.com/necomeshi/items/84a40a47ae35939fee2f)までのあらすじ

1. RHEL/CentOS 以外の環境でもRPMファイルを扱いたいのでGoで再実装するよ！
2. ファイル一覧とパッケージ情報を表示するコマンドを作ったよ！
3. ファイル検証とか他にも実装したいね！

# 今回の成果
1. オレオレverify機能を実装しました
2. 個人的によく使う機能を実装しました
 * rpm2cpio互換コマンド、Changelog表示、ファイルのタイプ別表示等

3. RPMの闇は深い

## ファイル検証機能(rpm -qV)

rpmコマンドにはパッケージの検証機能がある。詳しくはman rpmを参照していただきたいが、検証対象は、シグネチャ、ファイルのサイズ、MD5 チェックサム、許可属性、タイプ、 所有者、グループ、デバイス、readLinkしたパスである。

前回の記事でRPMパッケージのフォーマットについて記載したが、これらの情報はRPMヘッダー構造内に格納されている。

### あれ？ いらなくね？

実際は**インストールしたパッケージ**を対象にしたオプションなので、当初の目的**RPM系でない環境でパッケージを見る** には不要。

でも、なんとなく欲しいのでどうにかならんかと考えたところ、CPIOアーカイブの情報と照らし合わせて検証する**オレオレ仕様**のverify機能を実装しました。

## 今回の嵌りどころ

### ファイルチェックサム

man rpmにも書いてあるとおり各ファイルのチェックサムはMD5になっているはずだが、実際は32byteのsha256に変更となっている。

筆者が調査した限りではチェックサムについてのヘッダ情報等は提供されていないらしく、バイト長で判断するしか無い様子。


### CPIOアーカイブの圧縮形式

RPMパッケージのPayload部は圧縮されたCPIOアーカイブである。
[前回の記事](http://qiita.com/necomeshi/items/84a40a47ae35939fee2f)で示した資料ではこのCPIOアーカイブの圧縮形式は `gzip`とのことだったが、rpmのいずれかのバージョンで `xz` 形式に変更となっているようである。

どのバージョンで圧縮形式が変更となったかについては定かでない。圧縮形式については資料よりもRPMヘッダー構造の `RPMTAG_PAYLOADCOMPRESSOR` を参照して対処するほうが良い。

なお、`xz`形式の展開については[xi2.org/x/xzパッケージ](https://github.com/xi2/xz)を利用することができる。先人に感謝を。

### CPIO
[FreeBSDのマニュアル](http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man5/cpio.5.html)を参照したところ、CPIOにはどうやら4つのフォーマットが存在するようで、RPMの場合は**新しいASCII形式**のようである。

おそらく、rpmbuildした環境のCPIOアーカイバのバージョンに依っては異なる可能性がある。

## その他の機能

既に上でも書いているが、個人的によく使う機能から実装してみた。

* `--changelog` オプション
オプション名どおり、パッケージのChangeLogを表示するオプション。gorpmのオプションとして追加。

* `-d`, `-c`オプション
ファイルのタイプ別リスト表示機能。SPECファイル内にて、`-d` は `%doc` 、`-c` は `%config`で示したファイルを表示

* `gorpm2cpio` コマンド
展開したCPIOアーカイブを標準出力するコマンド。`rpm2cpio` 互換。

 ```bash
$ gorpm2cpio <RPM Package> | cpio -id
```

## 今後

1. **依存関係解決・パッケージダウンロード**
`yum`機能の実装。RHEL/CentOSでは、`yum --downloadonly` 等を使えばパッケージのダウンロードだけができる。
別環境でダウンロードしたパッケージを固めて配布したり、依存関係のチェック等もやりたいので、この機能はほしいところ

2. **RHEL/CentOSでも動作可能に**
今のところ引数に指定したパッケージを対象にしたコマンドだが、将来的にはGo側から必要に応じて呼び出せるような仕様にし、GoのプログラムからRHEL/CentOSパッケージ管理ができるようになればと思う。
壁としてはrpmdb(Berkery DB)

優先度としては１の方かしらと考えてみたり。

# RPMの闇
やはりドキュメント化されておらず、実装ファーストとなっている箇所がかなりある。
ESLint v3.19.0

前 [v3.18.0] | 次 [v4.0.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v3.19.0 has been released: <a href="https://t.co/8ym4Vnh7U7">https://t.co/8ym4Vnh7U7</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/847908071225651200">2017年3月31日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 3.19.0 がリリースされました。
バグ修正が中心です。

今回のリリースは ESLint 3.x 最後のリリースとなります。
次週に 4.0.0 のアルファ リリースをする予定です。
といっても、特に大きく変わるわけではありません。溜まってきた細かい Breaking Changes の Issues を掃除する感じです。

> :thought_balloon: ひとこと : [コミット一覧](http://eslint.org/blog/2017/03/eslint-v3.19.0-released#bug-fixes)を見ると一目瞭然ですが、今回は Katz 無双ですね。Fuzz テストを活用してエッジケースのバグを大量に発見していました :clap: 。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

- :globe_with_meridians: [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
- :speech_balloon: [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
- :globe_with_meridians: [本家リポジトリ](https://github.com/eslint/eslint)
- :speech_balloon: [本家サポート チャット](https://gitter.im/eslint/eslint)

----

# 💡 新しいルール

今回はありません。

# 🔧 オプションが追加されたルール

## [#8298]: [no-restricted-syntax] \(`selector`/`message`)

前回のリリースで [no-restricted-syntax] ルールのオプションで AST セレクタを利用可能になりましたが、これに伴い [no-restricted-syntax] ルールだけでもかなり複雑な検証ができるようになりました。そこで、表示メッセージをカスタマイズできるようにオプションを追加しました。

```js
/*eslint no-restricted-syntax: [
    error,
    {
        selector: "CallExpression[callee.name='setTimeout'][arguments.length!=2]",
        message: "'setTimeout' must always be invoked with two arguments."
    }
] */

//✘ BAD
setTimeout(() => console.log("hello"))

//✔ GOOD
setTimeout(() => console.log("hello"), 1000)
```

# ✒️ `eslint --fix` をサポートしたルール

今回はありません。

----

[v3.18.0]: http://qiita.com/mysticatea/items/264e59b3d28e13b633df
[v4.0.0]: http://qiita.com/mysticatea/items/3d01452d76ea6c943793
[#8298]: https://github.com/eslint/eslint/issues/8298
[#9999]: https://github.com/eslint/eslint/issues/9999
[no-restricted-syntax]: http://eslint.org/docs/rules/no-restricted-syntax
[xxxx]: http://eslint.org/docs/rules/xxxx


<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
ギブスサンプリング実装とJITコンパイラによる高速化

# はじめに
マルコフ連鎖モンテカルロ法の勉強でギブスサンプリングを実装していたのですが、偶々同じ時期に、pythonコードをJITコンパイラのライブラリ**"Numba"**で高速化する[記事](http://yutori-datascience.hatenablog.com/entry/2014/12/10/123157)を見つけたので組み合わせてみました。

# ギブスサンプリングとは
マルコフ連鎖モンテカルロ法(以下 MCMC: Markov Chain Monte Carlo)はパラメータ事後分布から効率的にサンプルを生成する方法です。ギブスサンプリングはMCMCの1つであり、多変量の事後分布に対して、各々の確率変数の条件付き分布から交互にサンプリングします。例えば2変量であれば、$p(x_t|y_{t-1})$ → $p(y_t|x_t)$ → $p(x_{t+1}|y_t)$ → ... というように次々とサンプルを生成していくことになります。
ただしこれは条件付き確率分布から簡単にサンプリングしてこれる場合に限ります。もともと、求めたい同時パラメータ分布 $p(x, y)$ からのサンプリングが困難であるために、代わりに $p(x|y)$, $p(y|x)$ から交互にサンプリングしてこようという発想だからです。

MCMCは高次元でもサンプリングの効率を高く保ち、"次元の呪い"を克服することができます。

MCMCに関する条件や性質として

* 詳細釣り合い条件
* エルゴード性
* 既約性

があるようなのですが、ここらへんはまだ追いきれていないので勉強しないとですね(T_T)

# JIT(Just in Time)コンパイラとは
>**JITコンパイラとは、プログラムの実行時に、あらかじめ用意された（実行環境に依存しない汎用的な）中間コードを、プログラムの実行時点でプロセッサが実行可能な機械語（ネイティブコード）にコンパイルすることである。**
-- IT用語辞典バイナリ --

Pythonはスクリプト言語であるため、1行ごとにコンパイルをしながらコードを実行します。そのため、forループのようなコードを書くとその度にコンパイルを実施しなければならず、事前コンパイルでループ処理を最適化するC++などに比べて大変大きな処理時間が掛かってしまいます。そのためPythonではNumpyなどのライブラリが用意されており、行列演算を駆使しながら高速化を図っています。しかしNumbaを使えば、forループを使ったコードや関数を事前にコンパイルし最適化してくれるので、CやC++のように高速に動作させることができます！

Numbaのインストールは[こちら](https://github.com/numba/numba)

# 実装
ここからpythonによる実装に入ります。
コードは[ここ](http://www.fisproject.jp/2015/12/mcmc-in-python/)を参考に書かせてもらいました。

## 必要なもの
使用したpythonのバージョンやライブラリは以下です。

* python 3.5
* numpy 1.12.1
* numba 0.31.0

## コード
今回は確率分布 $p(x,y) = exp(-\frac{x^{2} -xy + y^{2}}{2})$ からギブスサンプリングすることを想定します。


```python
import numpy as np
import time

def gibbs(N, iter_num, burn_in):
    sample = []
    x = 0.0
    y = 0.0
    for i in range(N):
        for j in range(iter_num):
            x = np.random.normal(1/2 * y, 1)
            y = np.random.normal(1/2 * x, 1)
        sample.append((x, y))
    return np.array(sample[int(N * burn_in):])


start = time.time()
plots = gibbs(3000, 10000, 0.3)
end = time.time()
print('elapsed_time: {0}[s]'.format(end - start))
```

```
elapsed_time: 193.93689107894897[s]
```
ここでは194秒かかっています。サンプルされた点をプロットすると下のようになります。

<img src="https://cl.ly/3R16180d1Z0K/gibbs.png">

次にライブラリNumbaを通してJITコンパイラを適用してみようと思います。
このライブラリはとても便利で、numbaからjitモジュールをインポートした後、最適化コンパイラしたい関数に@jitとデコレータを付けるだけで済みます！

```python
import numpy as np
import time
from numba import jit

@jit
def gibbs_with_jit(N, iter_num, burn_in):
    sample = []
    x = 0.0
    y = 0.0
    for i in range(N):
        for j in range(iter_num):
            x = np.random.normal(1/2 * y, 1)
            y = np.random.normal(1/2 * x, 1)
        sample.append((x1, x2))
    return np.array(sample[int(N * burn_in):])


start = time.time()
plots_jit = gibbs_with_jit(3000, 10000, 0.3)
end = time.time()
print('elapsed_time: {0}[s]'.format(end - start))
```

```
elapsed_time: 2.623775005340576[s]
```

かかった時間は3秒ほど。
コードをほとんど変えることなく、実行時間が大幅に減少したのがわかるかと思います。

<img src="https://cl.ly/44413M351h0t/gibbs_with_jit.png">

# まとめ
今までpythonやNode.jsなどのスクリプト言語しか触ったことがなかったのですが、今回JITコンパイラを勉強したこと通してスクリプト言語とコンパイル言語の仕組みの違いなどを改めて学ぶことができました。Numbaにはまだいろいろと機能があるみたいなので、もう少し触ってみたいと思います。
(編集中)RailsにReactを入れてSPAを作る。そしてHerokuに公開まで入れる。ついでにMaterial UIも入れる

#はじめに
初投稿
自分用のメモも兼ねて記載します。
色々と独学でやっていたらハマったので参考になれば

#実現すること
Ruby on Rails5.1からWebpackが公式採用されたのでそれを使ってモダンなアプリを開発してみる
入れ子構造for文のイテレーション

num_list = [[0 * 100]] * 2
for i in range(4):
    for j in range(100):
        num_list[i].append(j)

print(num_list)

として[[0, 1, 2, 3 -- 100] ,[0, 1, 2, 3 -- 100] ]
のような配列を作りたいのですが
結果として
[[0, 1, 2, 3 -- 100, 0, 1, 2, 3 -- 100],[0, 1, 2, 3 -- 100, 0, 1, 2, 3 -- 100]]
となってしまいます。

明らかにイテレーションの理解不足だと思うのですが、
どなたかご助言していただけないでしょうか。
[Unityで学ぶC#] 2-1 配列

配列は複数のデータを扱う時に便利．

敵データを複数管理する場合を想定する．

## 敵データが一つの場合．

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 敵
public class Enemy{
	public string name;
	public int hp;
	public int attack;

	public Enemy(){
	}

	public Enemy(string name, int hp, int attack){
		this.name = name;
		this.hp = hp;
		this.attack = attack;
	}

	// ステータスをコンソールに表示
	public void DebugStatus(){
		// string.Formatを使うと， + でつなげるよりも見た目わかりやすく文字を連結できる．
		Debug.Log (string.Format ("名前; {0}, HP: {1}, 攻撃; {2}", name, hp, attack));
	}
}

public class ArrayExample : MonoBehaviour {

	void Start(){
		Enemy en1 = new Enemy ("スライム", 5, 3);
		en1.DebugStatus ();
	}

}
```

このように敵のデータを表示することが可能です．

結果画像
![1つ結果.png](https://qiita-image-store.s3.amazonaws.com/0/113504/b915d552-37d5-3997-4cd5-5ddee2a212a5.png "1つ結果.png")

イメージで表すと，

```cshrp
new Enemy ("スライム", 5, 3);
```

でEnemyを生成し，

![Enemy.png](https://qiita-image-store.s3.amazonaws.com/0/113504/d3268bcb-d068-e0e9-22dc-75b91fe3cdbc.png "Enemy.png")

それを en1という名前の箱につっこむ感じです．

![変数.png](https://qiita-image-store.s3.amazonaws.com/0/113504/7ed91ac6-fe4f-d62e-491e-6c744b0595f1.png "変数.png")

## 敵データが3つの時 (配列を使わない)

敵が3体だとすると，Start関数の中は次のようになりますね．

```csharp
	void Start(){
		Enemy en1 = new Enemy ("スライム1", 5, 3);
		Enemy en2 = new Enemy ("スライム2", 1, 2);
		Enemy en3 = new Enemy ("スライム3", 4, 3);
		en1.DebugStatus ();
		en2.DebugStatus ();
		en3.DebugStatus ();
	}
```

イメージで表すと以下です．

![3つの変数.png](https://qiita-image-store.s3.amazonaws.com/0/113504/f207b4c9-f0ac-75ce-728e-d429e2161985.png "3つの変数.png")

それぞれが独立しています．

これでもできますが，敵の数が多くなると記述するのがどんどん大変になってきます．

## 敵データが3つの時　(配列を使う)
配列を使うと次のように書くことができます．

```csharp
	void Start(){
		Enemy[] enemies = new Enemy[3];

		enemies[0] = new Enemy ("スライム1", 5, 3);
		enemies[1] = new Enemy ("スライム2", 1, 2);
		enemies[2] = new Enemy ("スライム3", 4, 3);

		enemies [0].DebugStatus ();
		enemies [1].DebugStatus ();
		enemies [2].DebugStatus ();
	}
```

解説の前にイメージを示します．

![スクリーンショット 2017-04-01 2.38.28.png](https://qiita-image-store.s3.amazonaws.com/0/113504/a681317c-8d95-2c26-b552-6a68346e15cf.png "スクリーンショット 2017-04-01 2.38.28.png")

まず，この文で`enemies`という名前の3つの領域がある箱を作ります．

```csharp
Enemy[] enemies = new Enemy[3];
```

領域にはそれぞれ，0から始まる数字がつけられていて，

```csharp
enemies[0]
```

のようにしてそれぞれの領域にアクセスできます．
この，0から始まるという点が超大事ポイントです．

```csharp
enemies[3]
```

や

```csharp
enemies[100]
```

など，存在しない領域にアクセスするように書いてしまうとエラーが出るので注意です．

配列を使ってない時よりも，変数の数が3つから1つになって，行が1行増えましたね．
For文を使うことでより，スマートに書くことができますが，
長いので分けます．
社内ネットワークに繋ぐためのWifiスポットを家に作る

※自分用のメモに近いです。

## まえおき

リモートワークをやるさいに、「社内からしかアクセスできないテストサーバー」みたいなのがあると、わりと面倒です。
パソコンからはVPNつなげばいけるのですが、たとえばスマホアプリの試験をするときに、スマホが10台あったら10台ともVPN設定？したくないです。

ということで、てきとうなLinuxのPCにWifiスポットになってもらって、スマホからはそのPCが発するWifiにつなぐだけで、VPN経由で社内サーバーにつなげるようにする、ということをやってみました。

![Slice.png](https://qiita-image-store.s3.amazonaws.com/0/74571/30363a81-c5cd-8b93-40f6-7635fcf9d54d.png)

## 結論：create_apで一瞬でできた

http://qiita.com/KuwabataK/items/5903c7584657151d576a でも詳しく書かれていますが、 `create_ap` という神コマンドを使うと一瞬でできます。

LinuxでVPN接続をして、

```
sudo create_ap wlan0 vpn0 secretWifi secretsecretsecret
```

みたいに打つと、SSID:secretWifiでパスフレーズがsecretsecretsecretのWifiが立ち上がります。
スマホをそのWifiに接続すると、難なく社内テストサーバーに接続ができてしまいました。


## いくつかオプションをつけて、常駐してもらう

### SSIDステルスとMACアドレスフィルタリング

そんな秘密のWifiアクセスポイントを、たまたま家の隣の人に接続されたりなんかしたら、重大なセキュリティ事故になります。
ということで

* `--hidden` を付けるとSSIDステルス
* `--mac-filter` を付けると、/etc/hostapd/hostapd.acceptに記載のあるMACアドレスからのみ接続が可能に

### 802.11ac対応

できればac使いたいですよね。
ということで

* `--ieee80211ac ` を付けると802.11ac対応のAPに！

### スマホどうしはアクセスできなくていいよね

* `--isolate-clients` で、Wifiで繋いだ者同士の通信をできなくします

### 常駐してもらおう

* `--daemon` でデーモンになる

　　

## まとめ

```
sudo create_ap wlan0 vpn0 secretWifi secretsecretsecret --hidden --mac-filter --ieee80211ac --isolate-client --daemon
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/74571/49db6ab5-f59a-024d-52ec-b52c4a2cfd69.png" width=240/>

　
VPNを各スマホでセットアップする手間は省けました。めでたしめでたし。

※ 繰り返しになりますが、Wifiは家の外にも漏れるので、セキュリティには本当に注意しましょう。
JavaScriptのmap/parseInt問題の解説

## TL;DR
- `['10', '10', '10'].map(parseInt)` は直感に反する結果 `[10, NaN, 2]` を返す。
- これはparseIntが省略可能な第2引数を取り、mapがコールバックに3個の引数を渡すため。
- この問題を回避するためには、 `['10', '10', '10'].map(e => parseInt(e))` のように匿名関数でラップしてmapからparseIntに第2引数が渡されるのを抑止すれば良い。

## 問題
JavaScriptで数字文字列があり、これを数値の配列にしたいとします。

```javascript
'10' // これを
 10  // こうしたい
```

こんなときは標準関数parseIntが使えます。

```javascript
parseInt('10'); 
// => 10
```


さて、今度はJavaScriptで数字文字列の配列があり、これを数値の配列にしたいとします。

```javascript
['10', '10', '10'] // これを
[ 10 ,  10 ,  10 ] // こうしたい
```

配列の全要素に関数を適用するには、Arrayのメソッドmapを使えばいいですね。

```javascript
['10', '10', '10'].map(parseInt);
// => [10, NaN, 2] // あれ!?
```


## 解説
なぜこのような結果が返ってくるのでしょうか？
まずArray.prototyp.mapのコールバックに渡される引数の仕様を見てみましょう。

> callbackfn is called with three arguments: the value of the element, the index of the element,
> and the object being traversed.
> 
> (意訳) コールバック関数には3個の引数が渡される。 要素値、インデクス、そして走査する配列オブジェクトだ。
http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.map


次にparseIntの仕様を見てみましょう。
parseIntは第1引数に変換する文字列、第2引数に基数を受け取ります。
ただし、第2引数を省略した場合は、下記の動作をします。

> If radix is undefined or 0, it is assumed to be 10 except when the number begins with the code unit pairs 0x or 0X,
> in which case a radix of 16 is assumed.
>
> (意訳) 基数が未指定か0の場合、10進数とみなして評価される。ただし、文字列が0xまたは0Xから始まる場合は16進数とみなされる。
http://www.ecma-international.org/ecma-262/6.0/#sec-parseint-string-radix


以上を踏まえて、先のコードがどう動くか考えてみます。

```javascript
['10', '10', '10'].map(parseInt);
```

- 1番目の要素: `parseInt('10', 0, ['10', '10', '10'])` => '10'を10進数とみなし`10`
- 2番目の要素: `parseInt('10', 1, ['10', '10', '10'])` => 不正な基数1なので`NaN`
- 3番目の要素: `parseInt('10', 2, ['10', '10', '10'])` => '10'を2進数のイチゼロとみなし`2`

実に「正しく」変換されているのが分かりますね。
さすがJavaScriptさんやでー。


## 解決
mapのコールバックとしてparseIntを直接渡すのではなく、匿名関数でラップします。

```javascript
['10', '10', '10'].map(e => parseInt(e, 10)); // (1) 明示的に10進数とみなして変換
['10', '10', '10'].map(e => parseInt(e, 0));  // (2) 自動判定で変換(この配列の場合はすべて10進数)
['10', '10', '10'].map(e => parseInt(e));     // (3) 同上
```

上記のいずれも `[10, 10, 10]` を返します。
random.shuffleでのエラー

import random

a=range(10)
random.shuffle(a)
print(a)

のようなコードを入力すると次のようなエラーが出ます。

/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/****/PycharmProjects/demo4.py
Traceback (most recent call last):
  File "/Users/****/PycharmProjects/demo4.py", line 6, in <module>
    random.shuffle(a)
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/random.py", line 274, in shuffle
    x[i], x[j] = x[j], x[i]
TypeError: 'range' object does not support item assignment

Process finished with exit code 1




random.randint(a, b)では正常に乱数が生成できているので、randomのimportには問題がないかとは思うのですが。
どなたかご助力お願いします。