OmniAICreator/Qiita-1.07M huggingface dataset:
October CMS プラグイン実装テク：Linuxコマンドを実行する

OctoberCMSはLaravelやSynfonyがベースなので、[Process](https://symfony.com/doc/current/components/process.html)クラスを使用して下記のようにLinuxコマンドを簡単に実行できます。

`Process`コンストラクタにはコマンド名と引数を配列に入れて渡します。

```php
use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;
...

$cmd = ["ls", "-l"];
$process = new Process($cmd);
$process->run();
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}
log::debug(trim($process->getOutput()));
```
OctoberCMSプラグイン作成：コマンド作成

OctoberCMSはLaravelやSynfonyがベースなので、それらのフレームワーク同様にコマンドラインから実行できるコマンドを簡単に作成することができます。
これは、定期的に実行したいバッチ処理や簡単な開発ツールを作ったりするのに便利です。

基本的に[公式ドキュメント：Console Development](https://octobercms.com/docs/console/development)でよく解説されてますが、簡単に

## 基本
基本は下記の２ステップだけです。
1. スキャフォールディングで雛形作成して、やりたいことを記述。
2. Plugin.php に登録。

[スキャフォールディング](https://octobercms.com/docs/console/scaffolding#scaffold-create-command)で簡単に雛形が作成できます。
プロジェクトのルードディレクトリで下記を実行します。

```
php artisan create:command <author>.<plugin名> <コマンドクラス名>
```

例

```
php artisan create:command Pikanji.Utility MyCommand
```

この例で作成されるのは、`plugin/pikanji/utility/console` ディレクトリにMyCommandクラスだけです。間違ったら、削除してやり直すだけです。
この作成されたクラスでは `utility:mycommand` という既に実行可能なコマンドが実装されています。１クラスで１コマンドの実装になります。

次に、作成したコマンドをプラグインに登録します。

対象のプラグインのPlugin.phpの `register` メソッドをオーバーライドしてコマンドを登録します。ベースクラス `\System\Classes\PluginBase` の `register` メソッドは空なのでメソッドを実装するだけでOKです。
登録は下記のようになります。

```php
$this->registerConsoleCommand('<plugin名>.<command>', '<コマンドクラス（ネームスペース込み）＞');
```

例

```php
public function register()
{
    $this->registerConsoleCommand('utility.mycommand', 'Pikanji\Utility\Console\MyCommand');
}
```

これで、プロジェクトのルードディレクトリで下記を実行すると"Hello world!"と表示されます。

```
php artisan utility:mycommand
```

実行したい内容は `handle` メソッド（OctoberCMSビルド419以前では`fire`メソッド）に記述していきます。


## コンソール出力する
出力された雛形にすでに記述されていますが、コンソール出力は下記のようにできます。

```
$this->output->writeln('Hello world!');
```

## コンソール出力の色を変える
ここらへんもOctoberCMSと言うよりLaravelの機能ですが、`info`, `comment`, `error`などといったメソッドでコンソール上での色を変えて出力することもできます。

```php
$this->info('Display this on the screen');
$this->error('Something went wrong!');
```

また、入力を促したり、ユーザに確認を求めたりも簡単にできます。
こちらも[公式ドキュメント](https://octobercms.com/docs/console/development#writing-output)にさらっと説明されています。
関数１つだけのnpmパッケージをCLIで使う

ちなみにこれは`cli`コマンドが提供されていなくて、

```bash
# 確認後すぐ削除するディレクトリ作ったり
npm install xxx
node -e 'console.log(require("xxx")())'
```

とかするのが面倒くさい人用です。

こんな感じで使ってることが割りとあるなーと思ったので（今日も）、[nju33/clify](https://github.com/nju33/clify)とかいうのを作りました。



## インストール

```bash
npm i -g @nju33/clify
```

これで`clify`というコマンドが使えるようになりました。

> 汚染したくない人は`npx @nju33/clify ...`

## Gif

![Kapture 2017-10-19 at 19.57.38.gif](https://qiita-image-store.s3.amazonaws.com/0/84144/a9d8676e-a1f7-1032-f94c-7ede38699f0e.gif)

> ここでも使ってる[nanoid](https://github.com/ai/nanoid)っていうのをただただ使いたかった（今後も使いたくなる時がある気がする）

## 使い方

`clify nanoid`のように実行すると`nanoid()`また、`clify fn a b`とかすると`fn('a', 'b')`という感じにして実行できます。

コマンド実行した時、そのパッケージがまだインストールされて無い場合は、まずはインストール処理がされます。そうじゃない場合は、すぐ実行されます。

インストールされたものは`~/.clify/node_modules`へ置かれます。これは、`clify --clean`で削除できます。

「インストール済のパッケージなんだっけ？」という場合は`clify --help`で確認できます。

---

`npm i ... && node -e ...`面倒くさってなったときにでも使ってみてくだし😊
AdMob + メディエーションでFacebook Audience Network(FAN)を使う

ときにハマったので、書いておきます。

使った広告ユニット: Navive Advanced

# 導入

以下のドキュメントに従う。
[Integrating Facebook Audience Network with Mediation  \|  AdMob for iOS  \|  Google Developers](https://developers.google.com/admob/ios/mediation/facebook)
AdMobやFANで適切な設定をしたあと、 `pod 'GoogleMobileAdsMediationFacebook'` を追加してうごかす。

[googleads-mobile-ios-examples](https://github.com/googleads/googleads-mobile-ios-examples/tree/master/Objective-C/admob/NativeAdvancedExample) にサンプルコードがあるので、まずはこれを利用して試すのが良いです。(FANの広告を確認するには実機が必要)


# わかったこと

- メディエーションを使う場合はadtypeを2つのtype両方で指定しないといけない
    `NSArray *adTypes = [[NSMutableArray alloc] initWithArray:@[kGADAdLoaderAdTypeNativeAppInstall, kGADAdLoaderAdTypeNativeContent]];`
- 以下のような GADRequestの testDevices を設定していると出てこないので、もし設定していたら外すこと
`request.testDevices = @[kGADSimulatorID, ...]`

- メディエーションで得られる広告は必ず `GADNativeAppInstallAd` になる(内容がContentAdだとしてもこれになる)
- ドキュメントには 
>Toggle the Carousel Ads switch and Video Ads switch to Off.

    と書いてあるけど、VideoをONにしたら動画のある広告も出てきた

# 参考

ハマった末に、SDKサポートのGoogleグループに投稿しました。
https://groups.google.com/forum/#!category-topic/google-admob-ads-sdk/ios/rGV5Rxo0-xY
わりとすぐに返信がもらえて、解決できたので良かったです

## SDK versions from Podfile
```
  - Google-Mobile-Ads-SDK (7.24.1)
  - GoogleMobileAdsMediationFacebook (4.26.0.0):
    - FBAudienceNetwork (= 4.26.0)
    - Google-Mobile-Ads-SDK (>= 7.12.0)
```
yarn.lockって何？

npmで言うところのshrinkwrap
##shrinkwrapって何？
インストールしたnodeモジュールのバージョンを固定することができる。

```
$ npm shrinkwrap
```
これをたたくと、npm-shrinkwrap.jsonが作成される。
中身はこのような感じになっている。


```json
{
  "name": "test",
  "version": "1.0.0",
  "dependencies": {
    "jquery": {
      "version": "3.1.0",
      "from": "jquery@3.1.0",
      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.0.tgz"
    },
    "jquery-ui": {
      "version": "1.12.1",
      "from": "jquery-ui@1.12.1",
      "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz"
    }
  }
}
```

npm-shrinkwrap.jsonの中に記述されているものは、$ npm updateコマンドを叩いてもアップデートされない。


これと同様の事をyarn.lockは行ってくれる。

#yarn.lock

```
# 中身はこんな感じ
$ head yarn.lock
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
acorn-jsx@^3.0.0:
  version "3.0.1"
  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
  dependencies:
    acorn "^3.0.4"

acorn@^3.0.4:
  version "3.3.0"
```
shrinkwrapとの違いは、
**デフォルトで生成されるので簡単に利用できる**
**各モジュールがソートされており構成管理が容易**

理解できました。


参考：
[npmでバージョンをnpm shrinkwrapで固定してさらにバージョンアップデートする方法](https://ichimaruni-design.com/2017/07/npm-shrinkwrap/) 
[yarnがnpmと何が違うのか試してみた](https://qiita.com/0829/items/ec5271c06f8ff0633dd3)
【メモ】Heroku関連のコマンドまとめ

### **Heroku**
Railsアプリなどを本番環境にデプロイする際に、Herokuを利用したので、Heroku系のコマンドをメモ。


## ログイン
```
heroku login
```

## アプリの作成/管理/デプロイ

### herokuのアプリ作成
```
heroku create <<アプリケーション名>>
```

### Git関係の処理 (git管理は既にしている前提)
- Herokuのリモートリポジトリに追加

```
git remote add heroku <<Herokuのリモートリポジトリ名>>
```
- [参考] Githubのリモートリポジトリに追加

```
git remote add origin <<Githubのリモートリポジトリ名>>
```

### Herokuにデプロイ
```
git push heroku master
```


## アプリ関連

### ブラウザでアプリを開く
```
heroku open
```

### logの確認
- 通常の確認

```
heroku logs
```

- リアルタイムで確認

```
heroku logs --tail
```


### (現ディレクトリの)Herokuアプリの再起動
```
heroku restart
```


### アプリの一覧表示
```
heroku apps
```

### (現ディレクトリの)Herokuアプリの概要表示
```
heroku apps:info
```

### アドオンの追加
```
heroku addons:add <<アドオン名>>
```

### コマンドの実行
```
heroku run <<コマンド>>
```
**eg.)** ```heroku run rake db:migrate```


### プロセスの確認
```
heroku ps
```


## 環境変数

### 環境変数の確認
```
heroku config
```

### 環境変数の設定
```
heroku config:set <<環境変数名>>=<<値>>
```
**eg.)** ```heroku config:set AWS_ACCESS_KEY_ID=xxxxxxxxxxx```

### 環境変数の削除
```
heroku config:unset <<環境変数名>>
```


## その他 参考になったURL

- [Herokuの再起動、ストップ](https://qiita.com/RyochanUedasan/items/d447cbf2733e389994bb)
 - 停止
```
heroku ps:scale web=0
```

 - 再度スタート
```
heroku ps:scale web=1
```
一撃で理解（わか）るGenerics型


**「SwiftのGenerics型って何？医薬品？」**
そんな方々向けに、暫く眺めるだけで理解（わか）って貰えたら僥倖、という願いを込めたコードを用意した。

---

<img width="543" alt="スクリーンショット 2017-10-19 19.16.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/187895/561357ea-08fc-39be-eddb-11fcc9762197.png">

---

基本的には以上で終了だが、もしかすると
**「お安いのは魅力だけど、アレルギーとか副作用とかちょっと気になるかも…？」**
という方もいるかもしれない。

そんな方でも一撃で理解が可能なよう、「できるだけ〜」シリーズ[^1] のテクノロジーをほんの少しだけ盛り込んだ例がこちらである。

---

<img width="565" alt="スクリーンショット 2017-10-19 19.30.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/187895/cd0aa340-698f-e78e-359a-554501010714.png">

---

[^1]: 「できるだけ〜」シリーズ: [Swift編](https://qiita.com/rotors123/items/113407168a362d7e321d), [Objective-C編](https://qiita.com/rotors123/items/42094920b0e7e68005da)


このように、Generics型の\<TypeParameter\>については

```
class Hoge<T> { }
```
とする必要は全く無い。
上記の通り、日本語で定義してもビルドは成功する。
Swiftはどこまでも果てしなく（割と）自由な言語なのだ。

個人的には、

```
class Hoge<ToT> { }
```

```
class Hoge<・ω・> { }
```

といった感じで、各自の個性を活かした自由なGenerics型の記法を考案し、なんなら家紋と称し末代まで活用していって欲しいと思う。

※残念ながらUnicodeの絵文字を用いるとコンパイルが通らないので、そこだけ注意されたし。

以上、良い旅を！
テキスト系のinputタグをまとめて指定したい君へ

inputの体裁を整える時にいつもチェックボックスやラジオボタンを巻き込んでしまうめんどくさがりのぼくより愛を込めて

# :notを使う(IE8非対応)


```
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="reset"]):not([type="button"]):not([type="image"]) {

}
```

# ベタで指定する


```
input[type=text],
input[type=password],
input[type=search],
input[type=tel],
input[type=url],
input[type=email],
input[type=date],
input[type=time],
input[type=number],
input[type=range],
input[type=color],
input[type=datetime],
input[type=datetime-local],
input[type=month],
input[type=week],
select,
textarea {

}
input[type=checkbox],
input[type=radio] {

}
input[type=hidden],
input[type=file] {

}
input[type=submit],
input[type=reset],
input[type=button],
input[type=image],
button {

}
```
バイト列を整数に変換する簡単なお仕事メモ（Go言語）

簡単な記述を教えてもらったので，忘れないうちにメモ。

バイト列を整数に変換する簡単なお仕事。

```go
package main

import (
	"encoding/binary"
	"fmt"
)

func main() {
	octets := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}

	fmt.Printf("%#016x\n", binary.BigEndian.Uint64(octets))    //0x0001020304050607
	fmt.Printf("%#016x\n", binary.LittleEndian.Uint64(octets)) //0x0706050403020100
}
```

整数からバイト列への変換も簡単。

```go
package main

import (
	"encoding/binary"
	"fmt"
)

func main() {
	value := uint64(0x0706050403020100)
	buf := make([]byte, binary.MaxVarintLen64) //MaxVarintLen64 = 10

	binary.BigEndian.PutUint64(buf, value)
	fmt.Println(buf[:8]) //[7 6 5 4 3 2 1 0]
	binary.LittleEndian.PutUint64(buf, value)
	fmt.Println(buf[:8]) //[0 1 2 3 4 5 6 7]

}
```

なんちうか今まですンごい回りくどい記述してたよ。わざわざ `bytes.NewReader(octets)` でラップするとか。

```go
package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
)

func main() {
	octets := []byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}
	var value uint64

	if err := binary.Read(bytes.NewReader(octets), binary.LittleEndian, &value); err != nil {
		return
	}
	fmt.Printf("%#016x\n", value) //0x0706050403020100
}
```

浮動小数点数に変換するならともかく，整数なんだから... orz
明日からはちゃんとやろう。
[Vim colorscheme]molokaiやapprenticeが使えるのにhybridが真っ白になる時の解決法

#なぜhybridだけ真っ白？
それは、hybridだけt_Coが256以上である条件のif文がないから。
(ぜひ以下の３つでt_Coを検索してみてください)

[molokai](https://github.com/tomasr/molokai/blob/master/colors/molokai.vim)
[apprentice](https://github.com/romainl/Apprentice/blob/master/colors/apprentice.vim)
[hybrid](https://github.com/w0ng/vim-hybrid/blob/master/colors/hybrid.vim)

#解決法
set t_Co=256を書くだけ。

```vim:.vimrc
set t_Co=256
set background=dark
colorscheme hybrid
```
ウィルスと闘ってみた。その4

#概要
開発用のXPが、どうにも調子が悪い。
ウィルスと闘ってみた。
salityを、調査してみた。

#本体
感染したファイルのオリジナルのエントリポイントを自身のウイルスコードに置き換え、PEイメージの最後のセクションに自身を付加します。
ファイルが感染すると、サイズが70KB増えます。
ファイルに感染するタイプのマルウエア（寄生型ウイルス）です。
寄生してるので、そのファイルが実行されると、salityが動き出す。

#機能1
パソコン上の全プロセスに、自分のコピーを挿入し、活動を確実に続けられるようにする。

#機能2
パソコンが通常備えているセキュリティ機能を低下させる、もしくは無効化するため、
ウイルス対策ソフトやパーソナルファイアウォールをはじめ、セキュリティに関連する各種のプロセスとサービスを停止させる。

#機能3
パソコンのハードディスクとWindowsの共有フォルダにあるファイルに感染する。

#機能4
他のマルウエアや攻撃ツールをダウンロードして実行する。

#機能5
P2Pのクライアントとサーバーのコードが入っていて、感染パソコンはP2Pボットネットのボットとして動く。

#感想
どの機能も、魔法だ。
同じ構造だけどプロパティ名の違うJSONを1つのモデルクラスにマッピングする

昨日知りました！

APIが

```json
{
  "name" : "山田太郎",
  "premium" : true
}
```

```json
{
  "user_name" : "山田太郎",
  "premium_user" : true
}
```

こんな感じで、同じ構造だけどプロパティ名違うレスポンスを返してきて、困ったなーって思いましたが
**Gson**がフィールドに対して、別名を定義する機能があったので、解決しました。

```java
class User {

  @SerializedName(
    value = "name",
    alternate = "user_name"
  )
  public String name;

  @SerializedName(
    value = "premium",
    alternate = {"premium_user"}
  )
  public boolean premium;
}
```

# 参考

* [SerializedName (Gson 2.6.2 API)](https://google.github.io/gson/apidocs/com/google/gson/annotations/SerializedName.html)
* [Multiple GSON @SerializedName per field?](https://stackoverflow.com/questions/25707728/multiple-gson-serializedname-per-field)
prettier環境に合ったeslint configを作る


## prettierとの組み合わせを考慮する
現時点で、prettierを使わない理由がないので、スタイルに関するlintは全てprettierに寄せるのが基本方針です。

また、`prettier-eslint`を使う理由もないでしょう。
以下は、`prettier-eslint`の作者のツイートですが、もう使っていないとのことです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">PSA: I&#39;m no longer using prettier-eslint. I use raw prettier and disable all eslint style rules.<br><br>My life has been better ever since...</p>&mdash; Kent C. Dodds (@kentcdodds) <a href="https://twitter.com/kentcdodds/status/913760103118991361?ref_src=twsrc%5Etfw">2017年9月29日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

prettierのスタイルと重複しないようにするには、`eslint-config-prettier`に付属している`eslint-config-prettier-check`を使うとチェックできます。

[prettier/eslint-config-prettier: Turns off all rules that are unnecessary or might conflict with prettier.](https://github.com/prettier/eslint-config-prettier#cli-helper-tool)

上記のreadmeのように`package.json`に以下のように設定すると便利です。

```js
 "eslint-check": "eslint --print-config .eslintrc | eslint-config-prettier-check",
```

## eslint-find-rulesで全てのlintのルールを網羅する
eslintは開発が活発でどんどん新しいルールが追加されています。
それは大変素晴らしいことですが、それ故に自分の知らないルールがいつの間にか追加されている可能性も高いです。
この場合、eslint-find-rulesを使うと、設定してないルールが列挙されるので、便利です。

[sarbbottam/eslint-find-rules: Find built-in ESLint rules you don't have in your custom config](https://github.com/sarbbottam/eslint-find-rules)


## 参考レポ
自分のconfigは以下のようになっています。
他のconfigをextendsせずに、全てのeslintの設定を全て確認して書いてます。
この辺は、airbnbやstandard、xo、googleなどのconfigを継承して使ったほうが手軽で十分だと思います。

[akameco/eslint-config-precure](https://github.com/akameco/eslint-config-precure)

状況に応じてFlowやJest、Reactのconfigを切り替え可能にしています。
デフォルトでは、一般的なconfigとimportに関する設定のみで、`precure/oss`とすれば`jest`と`flow`の設定が入ってきます。

```.eslintrc
{
	"extends": "precure"
}
```

```.eslintrc
{
	"extends": ["precure/oss"]
}
```
API Gateway + AWS Lambda で%26が渡せなかった話

# 謎のInternal server error

https://example.com/v1/?n=[name]
みたいな感じに、API Gatewayで`n`パラメータを受けて、lambdaで処理する仕組みを作ったら、`n`パラメータに"a&z" (URL Encode: "a%26z")みたいな"&"を含むデータを渡すと謎のInternal server error出てハマった。


- https://example.com/v1/?n=a%26z のResponse

```
{
message: "Internal server error"
}
```

ClowdWatchLogにはsignatureがどうのこうののエラーが。

- ClowdWatchLog

```
Execution failed due to configuration error: 
The request signature we calculated does not match the signature you provided. 
Check your AWS Secret Access Key and signing method. 
Consult the service documentation for details.
```

# 原因

サポートに問い合わせたところ、以下の回答が。

----
The error is because the query string “a%26z” is decoded as “a&z” by CloudFront viz. the URL Encoded form. So, the API Gateway gets the query string as “a&z”. Now, when the invocation URL to lambda is being created it appends the Query String given in Integration Request of that resource. Now, the URL is 
similar to “https://lambda.<region>.amazonaws.com/2015-03-31/functions/<lambda-arn>/invocations?name=a%26z” but while calculating the signature [1] it treats as invalid because “<Endpoint URL>/invocations?name=a%26z” is not a valid lambda invocation URL. The correct Lambda invocation URL is explained in this doc [2]. 

Moving forward, if you want to use a%26z to your backend then the correct way is to pass it like “a%2526z” In query string and have a body mapping template.

[1]. http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html
[2]. http://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#w2ab1c67c12c49c11

----

知識のなさと英語力のなさでいまいち原因を理解できていないが（英語とAWS得意な誰か解説してください:pray:）、**2重URLエンコードして %2526 にすればエラーにならない**ということは理解できた。Lambda内で一度URL Decodeしないといけないが。

# 解決

2重URLエンコードするのと同じようなものだが、結局、**データをすべてBASE64でエンコードしてLambdaでDecodeする**ことにした。

# 疑問

既に多くの人がここではまっている気がするんだけど、ググっても全然情報ないのはなぜ？
覚え書き webpackの導入テンプレ

せっかくなのでQiitaに書きましょう
はじめてwebpack触った人がvue動かせるようになったところまでのまとめ
のちのちちゃんとまとめたい


参考記事
はじめてのWebpack　
https://qiita.com/_cheez/items/266b1b4534b6111a9686
step by stepで始めるwebpack
https://qiita.com/howdy39/items/48d85c430f90a21075cd




```ruby:node.jsが入ってることを確認してterminal側の準備

mkdir (dir_name)
cd (dir_name)
npm init
npm install --save-dev webpack
npm install --save-dev webpack-dev-server
npm install --save-dev vue 
```
これでwebpackとwebpack-dev-serverとvue.js本体がnode_modulesにインストールされる。
vue本体も普通に拾ってこなくていい！

```ruby:webpack.config.jsを作成

var path = require('path');

module.exports = {
	entry: __dirname + "/src/index.js",
	output:{
		path:__dirname + '/dist',
		filename: 'bundle.js'
	},
	module: {
		loaders: [
			//loader
		]
	},
	devServer: {
		contentBase: path.resolve(__dirname, 'dist')
	},
};
```


```ruby:package.jsonにstartを追加
"scripts": {
	"start": "webpack-dev-server",
},
```

```ruby:ディレクトリ構造
Project Dir
|
|  package.json
|  webpack.config.js
|
|- dist
|   -index.html
|   -bundle.js
|
|- src
|   -index.js
|
|- node_modules
```

```ruby:index.js
import Vue from 'vue/dist/vue.js';
```

```ruby:index.html
<script src="./bundle.js"></script>
```

terminalのwebpackでビルド、npm startでwebpack-dev-server起動。
あとはブラウザで
http://localhost:(ポート番号)/webpack-dev-server/
を叩けばjs保存でホットリロードするかしこい機能が使える。
terminalからwebpack叩いておかないとbundle.jsのファイル自体は更新されないので注意。
Amazon SESで送信元と宛先の制限をかけてみたメモ

調べたり試したりしてみたので、メモ的な。
#制限するには
　もともとSESにはサンドボックスモードと言って制限がかかった状態でサービスが利用可能になる。
　　参照：http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/limits.html
　その制限をわざわざ解除申請を出して自由に利用できるようにする。

　けど、自由すぎても困って、という話。

　SESを利用する際には、SES用のIAMユーザーを払い出して利用します。
　そのIAMユーザーのポリシーを利用して幾つかの制限ができるようです。
　　参照：http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/control-user-access.html


#設定
##送信元制限
　特に問題なくできてしまったので、その時のポリシー例を。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1507889923000",
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Condition": {
                "StringLike": {
                    "ses:FromAddress": [
                        "*@example.com"
                    ]
                }
            },
            "Resource": [
                "*"
            ]
        }
    ]
}
```

　これで「なんちゃら@example.com」が送信元の場合に限り、IAMはSESの認証をできるようにしてくれます。
　例えば「なんちゃら@jp.xxxx.com」とかが送信元になった場合に、554 Access deniedしちゃいます。
　これが送信元制限の簡単なやり方。

##送信先（宛先）制限
　送信元制限のノリで作業したらはまったので、このメモを残すことになった。
　先に参照として出したドキュメントに、「ses:Recipients」使ったらできるで、と書いてあったので、間に受けて設定してたんですが
　それが間違いでした。
　とりあえず、うまくいった例

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "ses:Recipients": [
                        "*@example.com"
                    ]
                }
            }
        }
    ]
}
```

　この設定で、「*@example.com」以外にメールが送信できなくなり、先ほどの送信元制限と同様に554エラーが発行されます。
　何にはまったかというと、`"ForAnyValue:StringLike"`　この項目。

　送信元制限の際は、「"StringLike"」でいけるんですが、サポートにお聞きしたところ、ses:Recipientsは複数の項目にまたがり値があるので
　`"ForAllValues:StringLike"`
　を使ってな、と。
　ドキュメントにも例でのせてるで、ってなことなので、やったんですがダメでした。
　曰く

```
注記
キーに複数の値が含まれる場合、設定演算子（ForAllValues:StringLike および ForAnyValue:StringLike）を使用して StringLike を修飾できます。
```

　なので、ダメ元で `ForAnyValue:StringLike` を使ったらいけたという。
　実はAllとAnyの利用の違いについては調べ切れてないんですが、やりたいことができたということなので、これにて。

##両方制限したい欲張りなあなたへ
　以下の設定で実現できてます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringLike": {
                    "ses:Recipients": [
                        "宛先アドレス"
                    ],
                    "ses:FromAddress": [
                        "送信元アドレス"
                    ]
                }
            }
        }
    ]
}
```

　アドレスを指定する場合はLikeじゃなくてEqualesでもいいかもしれませんね。
やる気の出ない計算機科学シリーズ その1 初めてのFormura 

やる気の出ない計算機科学シリーズ第1回です。

「スパコンを道具として便利に使いたい！けど別に計算機科学がやりたいわけじゃなんだよ・・・」 

という気持ちの人向けに、計算科学向けのネタを適当に解説していきます。


# はじめに

Formuraとは理化学研究所の村主崇行特別研究員らが作成したすごい~~Hな~~HPC向けの開発環境です。

## なにができるの？？？

> 数式のような簡潔な指示を書くだけでスーパーコンピュータでの計算に必要となる高度なプログラムを自動生成できるプログラミング言語

[式が書ければ「京」が使える－高度なプログラムを自動生成できる新言語「Formura」を開発－](http://www.riken.jp/pr/press/2016/20161202_3/) より引用

ということで、数式っぽい何かをかくとプログラムができちゃう。それもただのプログラムじゃなくてスパコンでも動くぞイエイ！ということができます。


# 環境
~~・てきとうなmpiの動くスパコン~~
・MPIの動くUnixマシン。

# インストール

- stackのインストール

stackの公式ドキュメントにそってインストールを行います。

```bash
curl -sSL https://get.haskellstack.org/ | sh
```

- formuraのビルド

```bash
git clone git@github.com:nushio3/formura.git 
cd formura
stack setup --install-ghc
stack build --trace
```
試しに実行してみます

```bash
stack exec formura 
```

出力は・・・？

```bash
Missing: FILES...
Usage: formura FILES... [-o|--output-filename FILENAME] [--nc FILENAME]
               [-v|--verbose] [--makefile|--mk] [--ncopt ARG] [-f|--flag ARG]
               [--sleep SECOND]
  generate c program from formura program.
```

ふむふむ。formuraのコードが必要とこのこと。


# 使ってみる。

### テストコードの作成

ということで、テストコードさっくり書きます。
~~exampleのコードは動かないのが多くて。。。~~

```js:sample.fmr
dimension :: 1
axes :: x

begin function init() returns data_init
      double [] :: data_init = 0
end function

begin function data_next = step(data)
  data_next = data
end function
```
1行目で行列の次元を宣言します。今回は簡単に1次元で行ってみます。
2行目で名前を軸の名前を宣言します。とりあえずxにしてみます。

fmrファイルでは最小の実装として、下記の2つの関数の実装が必要です。
1. init : データ構造を受け取って、初期化します。今回は全部を0にします。
2. step : データを受け取って、次のステップのデータを計算して戻します。今回はなにもしません。 


続いて、コード生成の設定ファイルを作成します。ファイル名はfmrファイルと同じ名にします。

```yaml:sample.yaml
mpi_grid_shape: [1] 
intra_node_shape: [256]
initial_walls:
    x: [128]
temporal_blocking_interval: 1 
monitor_interval: 1
```

- intra_node_shape: 各ノードでのグリッドの切り方。今回は256個で実行してみます。
- initial_walls: 内部のサブルーチンの分割について。中心の128で分割してみます。（本当は分割せずに動かしてみたかったのですが、仕様で動きません。）
- mpi_grid_shape: MPIのグリッドの切り方。今回は1ノード、つまりシングルノードで計算します。
- temoral_bloking_interval: テンポラルブロッキング数で一回に進めるステップ数。今回は1、つまりテンポラルブロッキングはなしで
- monitor_interval: 一回のForwardで進めるStep数。今回は1で、つまり1ステップ毎に処理をメインプログラムに戻す事にします。

### テストコードのコンパイルと出力


では動かして見ます。


```bash
stack exec -- formura sample.fmr +RTS -xc
```

動いた！！ ら、出力されるファイルは次の3つです。

- sample.h : ヘッダファイル
- sample.c : 中身。主にMPI関連の扱いとか
- sample_internal_0.c : 中身。計算したり

動かなかった！！　ら、スタックのトレースの出力と睨めっこでもしてみましょう。

### テストコードの作成 その2

~~中身の説明は2回目以降に先送りするとして、~~まずは実際に使ってみましょう。


出力されたファイルを呼び出すプログラムを書きます。

```c:sample-main.cpp
#include <stdio.h>
#include <mpi.h>
#include "sample.h"

const int T_MAX = 4;

int main (int argc, char **argv) {
  Formura_Navigator navi;
  MPI_Init(&argc, &argv);
  Formura_Init(&navi, MPI_COMM_WORLD);
  while(navi.time_step < T_MAX) {
    Formura_Forward(&navi);
  }
  MPI_Finalize();
  printf("Done!\n");
}
```

初期化して、４ステップ動かしてみます。

### コンパイル
```bash
mpic++ sample-main.cpp sample.c sample_internal_0.c 
```

### 実行&結果

```bash
> mpirun -np 1 a.out
Done!
```

動いた〜


( To be continued...


# まとめ

現時点で、formuraには網羅的なマニュアルがありません。
そのため、初めて使うには少しハードルが高いものとなっています。
本記事は少しでもformuraに触れる人が増えるといいなと思い作成しております。

今回の記事もソースコードを読みつつ作成しました。
間違いを見つけられましたらコメントでお知らせいただけますと幸いです。

p/s
村主さんのご冥福を心よりお祈りします。
angular-cliで作成したプロジェクトで--prodビルド時にconsole.log出力を削除する

開発時には重宝するconsole.logですが、リリースビルド時には綺麗サッパリ消えてほしいものです。
loggerクラスを用意して、console.logの出力の有無を制御する方法もありますが、今回はビルド時に一気に無効、削除する方法を試してみました。

# 前提

```
$ ng -v
@angular/cli: 1.4.1
node: 8.1.3
```

# 手順

## console.logをオーバーライドする方法
console.logを何もしない関数にオーバーライドする方法です。

`main.ts`に以下の記述を追加します。

```ts:main.ts
if (environment.production) {
  window.console.log = function(){};
}
```

ここで、`ng build --prod`でビルドして実行結果を確認すると、全ての`console.log`での出力が出力されなくなっています。

## strip-loaderを使う方法
webpackのローダーを使って、特定の文字列(コード)をビルド時に削除する方法です。

[strip-loader](https://www.npmjs.com/package/strip-loader)

プロジェクトのルートディレクトリで、`ng eject`コマンドを実行してwebpack.config.jsを取り出します。

```
$ ng eject
==========================================================================================
Ejection was successful.

To run your builds, you now need to do the following commands:
   - "npm run build" to build.
   - "npm test" to run unit tests.
   - "npm start" to serve the app using webpack-dev-server.
   - "npm run e2e" to run protractor.

Running the equivalent CLI commands will result in an error.

==========================================================================================
Some packages were added. Please run "npm install".
```

このタイミングで、webpack-dev-serverやwebpackなどのパッケージが追加されてるので、
`npm install`を実行しておきます。

strip-loaderをインストールします。

```
$ npm install --save-dev strip-loader
```

webpack.config.js を修正し、strip-loaderを使用するように設定します。

```diff:webpack.config.js
...
  "module": {
    "rules": [
      {
        "enforce": "pre",
        "test": /\.js$/,
-        "loader": "source-map-loader",
+        "loader": ["source-map-loader", "strip-loader?strip[]=console.log"],
        "exclude": [
          /(\\|\/)node_modules(\\|\/)/
        ]
      },
```

ここで、`npm run build --prod`(ng ~系のスタート、ビルドコマンドは使用できなくなってるので)でビルドして実行結果を確認すると、全ての`console.log`での出力が出力されなくなっています。


# 所感
angular-cliでwebpackの設定を変更するのはつらい。

# 参考
angular-cli でwebpack の設定を変更する方法が参考になりました
https://qiita.com/kaku3/items/a15f67e97f35e35611df
AWS認定ソリューションアーキテクト-プロフェッショナルに合格するためにやったことまとめ

8月にアソシエイトに合格し、じゃあプロフェッショナルも取るかと思ったものの、日本語のソースだとプロフェッショナルに受かるためにどんなことをしたらいいかの情報が少なかったので、自分がやったことのまとめ。
**※2017年10月時点での情報だと思ってください**

#よく問われるサービス
- コンピューティング
   - EC2,Elastic Beanstalk
- ストレージ
   - S3, EFS, Glacier, Storage Gateway
- データベース
   - RDS, DynamoDB, ElastiCache, Amazon Redshift
- ネットワーク＆コンテンツ配信
   - VPC, CloudFront, Direct Connect, Route53
- 管理者ツール
   - CloudWatch, CloudFormation, CloudTrail, OpsWorks
- セキュリティ、アイデンティティ、コンプライアンス
   - IAM, Certificate Manager, Directory Service, CloudHSM
- 分析
   - EMR, CloudSearch, Kinesis, Data Pipeline
- モバイルサービス
   - Cognito
- アプリケーションサービス
   - SWF, Elastic Transcoder
- メッセージング
   - Simple Queue Service, Simple Notification Service, Simple Email Service

#最低限読んでおく資料
- [AWSクラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)

まずはここを見て各サービスの概要を把握する。

- [よくある質問](https://aws.amazon.com/jp/faqs/)

概要をつかんだらこれを読んで細かいハマりポイントを理解する。

- [ホワイトペーパー](https://aws.amazon.com/jp/whitepapers/)

試験ガイドにあるようにホワイトペーパーも出題範囲。英語多め。各種ベストプラクティスくらいは読んでおく。

- [AWS-CloudDesignPattern](http://aws.clouddesignpattern.org/index.php)

いわゆるCDP。典型的な設計パターンがまとめられている。

- [AWSドキュメント](https://aws.amazon.com/jp/documentation/)

主要なサービスのドキュメントは一通り読む。

#気を付けるポイント
- 各種IDフェデレーション

AssumeRole, AssumeRoleWithWebIdentity, AssumeRoleWithSAML, GetFederationToken, GetSessionTokenがそれぞれどのようなケースで使うのが適当かを押さえる。

- EC2のインスタンスタイプ
「T2はバースト可能」「R4はメモリ最適化」といった用途を押さえる。回答の選択肢の中にさらっと出たりする。

- VPN, DirectConnect, VPC peeringの特徴やユースケース
オンプレミスとのハイブリッド環境でよく問われる。冗長化する(SPOFをなくす)方法も押さえておく。

- EBSのIOPS
最大値および最大値を超えるIOPSが必要な場合の設計方法を押さえる。

- VPCにおいて予約されているIP
- 各種サービスがどのレベルで提供されるのか(AZ、リージョン、グローバル)
単一リージョンから複数リージョンへの移行や、グローバルレベルでの可用性・耐障害性に関する問題がよく出る。

- CloudFormation, Elastic Beanstalk, OpsWorks
それぞれの特徴や違い、作成(デプロイ)・変更・削除・中止方法を押さえる。

- キャッシュエンジンの違い
ElastiCacheにおけるmemcachedおよびRedisそれぞれの特徴を理解する。

- 一括請求 (コンソリデーティッドビリング)
請求を統合する方法および共有されるもの/されないものを押さえる。

#有料学習サービス
- [Linux Academy](https://linuxacademy.com/)

   - AWS SAプロ用のコースがあって、動画とハンズオンで学習できる。
   - 動画﻿は英語のみで字幕もないが、活用資料集で概要を把握していれば十分理解できるレベル。
   - 登録後7日間は無料。その後は月額料金($29)が発生。無料期間だけで終わることもできる(ただし、ハンズオンは利用不可)。
   - 登録時にクレジットカードかpaypalの登録必須。
   - 独自の模擬試験もついていて、個人的にかなり良かった(無料期間だけで終わったけど...)

他にも海外のブログだと[QwikLABS](https://amazon.qwiklabs.com/users/sign_in?locale=ja)とか[a Cloud Guru](http://acloud.guru/)が評判が良かった(僕は使ってないです)

#模擬試験について
公式の模擬試験は一度は受けた方がいい。問題形式や時間配分を体感できるのは重要。
アソシエイトに受かった時に模擬試験を無料で受験できるバウチャーがもらえるので、それを使うのが吉。
ただし、僕が受けた時は日本語がひどくて、日本語として何を言っているか分からない問題が多々あった(本番はまともだった)。もし模擬試験を受けてその日本語に恐怖を覚えても、本番ではそこまで怯える必要はないと思う。

#本試験予約時の注意
- 支払ページの請求先住所は英語で入力。全部入りきらなくても気にしない。

赤字で「英語で入力しろ」と注意書きもあるけど、英語で入力するとフォームの文字数制限で書ききれない。これじゃAWS困るだろと思って日本語で入力するとtemporary errorになる。このtemporary errorが日本語入力のせいだと気付かず、LiveChatで聞いたりして1週間以上待った...。
ちなみに英語で住所を入力して全部入りきらなくても郵便番号欄もあるので、中の人が補完してくれるとのこと。

- 試験会場の住所が全部表示されない時は英語表示に切り替える

なぜか日本語表示だと郵便番号レベルの住所しか表示されず、とても不安な気持ちになるが、英語表示に切り替えるとちゃんと表示される。謎。
PythonコードをCythonで高速化してFortranに近づける

# 概要

* PythonコードをCythonで高速化して、Fortran90のコードに速度を近づけてみた。
* 最終的に、今回はFortran90の計算時間の2倍程度で済むようになった。(もちろん、計算課題や環境にも依る)

# Cythonとは
詳しい解説は多方面でされているので、詳しいことは割愛するが、Cythonとは

* Pythonをベースにしたプログラミング言語で、ざっくり言うと「Cのデータ型を持ったPython」らしい。
* .pyxの拡張子を持つpythonコード内で、Cのデータ型をもたせて、Cythonで高速な.c形式のコードに変換してくれる。
* そして、.cのコードをCコンパイラでコンパイルし、Pythonインタプリタで呼び出して使える。

# Cythonの書き方
Cythonの基本的な書き方として、
1. 変数の型宣言
2. 関数と関数の引数に型宣言
がある。

1.に関しては、.pyxコード内で、

```
cdef int N = 100000
cdef double bf0 = 1.
cdef double[3] bf = [0., 0., bf0]
cdef double[4][3]
```
のように記述する(後述で紹介するソースコードより抜粋)。`cdef`の後ろにコロン:を付けてインデントすることで、cdefの記述を省略して一気に型宣言することも可能。

2.に関しては、.pyxコード内で、

```
cdef double* rkfd(double *v):

    res[0] = e/m * (ef[0] + (v[1]*bf[2] - v[2]*bf[1]))
    res[1] = e/m * (ef[1] + (v[2]*bf[0] - v[0]*bf[2]))
    res[2] = e/m * (ef[2] + (v[0]*bf[1] - v[1]*bf[0]))

    return res
```
のように記述する(同じく抜粋)。関数の引数等に*が付いているのは、参照受け渡しの意味。

# 計算課題

今回の計算課題は、プラズマの運動方程式

```math
\begin{align}
m\frac{d\boldsymbol{v}}{dt} &= q(\boldsymbol{E}+\boldsymbol{v}\times \boldsymbol{B}) \\
\frac{d\boldsymbol{r}}{dt} &= \boldsymbol{v}
\end{align}
```
とした。パラメータは、それぞれ、m: プラズマ質量、q: プラズマの電荷、r: プラズマ位置、v: プラズマ速度、E: 電場、B: 磁場、t:時間、である。r、v、E、Bについては、空間3次元のベクトル量。
これを差分化すると、

```math
\begin{align}
\frac{\boldsymbol{v}^{n+1/2} - \boldsymbol{v}^{n-1/2}}{\Delta t} &= \frac{q}{m}(\boldsymbol{E}+\frac{\boldsymbol{v}^{n+1/2} + \boldsymbol{v}^{n-1/2}}{2}\times \boldsymbol{B}) \\
\boldsymbol{r}^{n+1} &= \boldsymbol{r}^{n} + \boldsymbol{v}^{n+1/2}\Delta t
\end{align}
```
となり、これを数値的に解いていくことになる。時間発展を逐次的に解いていくことになるため、Pythonには不向きなforループが必ず出てくることになる。
今回はこの逐次計算を、4次ルンゲクッタ法を用いて解いた。

# ベンチマークテスト

今回は、以下の4種類の実装方法でベンチマークを行い、計算時間を比較した。
1. Fortran90のコード
2. 純粋なPythonのみのコード
3. 変数の型宣言のみを行うCythonコード
4. 変数の型宣言に加え、関数の引数と戻り値の型宣言も行うCythonコード
(Qiita上ではソースコードを割愛しますが、興味のある方は、Github[https://github.com/Hirotoshi-Uchino/cython_benchmark_gyro] に今回のソースコードがありますので、動かしてみて下さい。コードに関するコメント等も歓迎します。)

なお、今回のベンチマークテストの環境は以下の通り、
　・ PC: MacBook Pro (Retina, 13-inch, Early 2015)
　・ OS: macOS Sierra
　・ CPU: 2.9 GHz Intel Core i5
　・ メモリ 8 GB 1867MHz DDR3
　・ Fortanコンパイラ: gfortran (コンパイル時、-O3最適化オプションを使用)
　・ Python 3.5


### ベンチマークテスト結果
　今回の逐次計算を10万ループした場合の結果を以下の表にまとめた。

|実装方法|Fortran90|Python|Cython(変数型宣言のみ)|Cython(+関数の引数・戻り値型宣言)|
|:-------:|:------------:|:----------:|:-----------:|:-------------:|
|計算時間 (ms) | 3.88±0.185| 1400±18.2  | 259±6.76  | 6.72±0.178  |

数字は、10回の試行の平均と標準偏差から割り出したもの。

結果を見ると、純粋なPythonコードだと、300倍以上かかっていた計算時間が2倍程度まで抑えられていることがわかる。また、今回のコードは、関数呼び出しが非常に多いものとなっており、関数の引数や戻り値の型宣言まで行うことが重要であることが分かる。

# まとめ
Cythonを用いることで、PythonのコードをFortran90の速度まで近づけるができた。Cythonの利用で発生した作業は、.pyから.pyxに書き換える際に、変数と関数の引数や戻り値に型宣言を行ったことと、.c → .pyxへの変換とCプログラムのコンパイル用のセットアップスクリプトを書いただけであったので、慣れると手早く利用できそうだと感じた。
Cythonを使うメリットとしては、高速化のためにわざわざ他言語に書き換えるための時間を削減できることであろう。うまく使えば、工数をかけずにPythonコードを高速化できそうである。

# 予告
今回の計算時間はわかったけど、計算結果(プラズマの運動はどうなるの？)って思った方もいるかと思う。これについては、可視化したものを今後紹介したい。
Azure Global VNET PeeringがPublic Previewになったのでお試ししました

#はじめに
2017年9月のIgnite内の発表で、VNET Peeringが他リージョンのVNET間でも使えるようになったので早速試しました。
アナウンス記事は「[Public preview: Global VNet Peering](https://azure.microsoft.com/ja-jp/updates/global-vnet-peering-preview/)」です。

#利用準備
こちらのPublic Previewはまず最初に利用申請をサブスクリプション単位で行う必要があります。
「[Create a virtual network peering - Resource Manager, same subscription](https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-create-peering?WT.mc_id=AZ-MVP-5002499)」の記事内の「Register for the Global VNet Peering preview」の章に書かれていますが、Azure Powershellにてログイン、(必要に応じて)サブスクリプション選択後に以下のコマンドを入力してPublic Previewの利用申請を行います。

```ps1
Register-AzureRmProviderFeature `
  -FeatureName AllowGlobalVnetPeering `
  -ProviderNamespace Microsoft.Network

Register-AzureRmResourceProvider `
  -ProviderNamespace Microsoft.Network
```

タイミングによってはすぐにRegistrationStateが「Registered」状態になりますが、Pending状態の場合はしばらく待ってから以下のコマンドを打って定期的に確認して、ひたすら待ちます。

```ps1
Get-AzureRmProviderFeature `
  -FeatureName AllowGlobalVnetPeering `
  -ProviderNamespace Microsoft.Network
```

***Registered状態になってもすぐに利用できないケースがあるようです。その場合は24時間程度待ってからGlobal VNET Peeringの検証を進めるとよさそうです***

#環境作成
Global VNET Peeringは本記事執筆時点では、以下の3リージョンでのみ利用可能です。

- US West Central (米国中西部)
- Canada Central (カナダ中部)
- US West 2 (米国西部2)

なので、VNET及び仮想マシン、VNET Peeringの構成は以下のように作成しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/85a73af2-a591-d9a7-b95b-15f711473221.png)

こちらの環境はAzureポータルで普通に作成できます。
仮想マシンはNIC性能を少しでも早くするために、A8V2を選択しました(ちょっとお高い……)

ネットワーク性能を測るために、US West 2には同一VNET内に二つの仮想マシンを用意して、VNET内の速度も計測します。さらに別VNETも作成して従来通りのVNET Peeringの速度も測ります。

VNETのピアリング追加画面では既に別リージョンの仮想ネットワークが選択可能になっているため、Azureポータルからさくさくっと構築できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/83fbaa9a-aa11-853a-25be-d949693633c3.png)

#速度測定
Linux界隈で有名そうな「iperf」を使います。
各VMに以下のコマンドでインストール。

```bash
$ sudo apt-get install iperf
```

コマンド実行方法ですが、受信側は「iperf -s」でサーバーモードで待ち受けして、送信側で「iperf -c <サーバ側のIPアドレス>」で実行です。

本格的な性能確認ではないため、各方向1回だけ実行した結果を以下に張ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/137436/7d43cec5-286c-4f57-0510-35ab68695a8d.png)

なんといっても一回だけの測定結果なので細かい数値はあてになりませんが、以下の傾向がわかります。

- 従来のVNET Peeringの性能は同一VNET内仮想マシン間の性能とあまりかわらない (緑の矢印)
- ペアとなっているリージョン間の性能は結構よい (黄色の矢印)
- ペアではない別リージョン間の性能はそれなり (赤い矢印)

※参考：[ビジネス継続性とディザスター リカバリー (BCDR): Azure のペアになっているリージョン](https://docs.microsoft.com/ja-jp/azure/best-practices-availability-paired-regions?WT.mc_id=AZ-MVP-5002499)

無論現時点ではPreview段階であるため、性能についてもGAしたタイミングでは変わることも十分ありますが、性能の高い順番としては想像通りの結果となりました。

#おわりに
このGlobal VNET PeeringがGAすると、DR環境やミラーサイトの構築など色々便利に応用できそうですね。
Site to Site VPNとの使い分けも含めて色々と整理していく必要はあると感じました。
Mac OS 10.13.1 BetaにしたらJava製アプリケーションのメニューバーが消えた

Mac OS 10.13.1 Betaにアップデートをしたら、
Java製アプリケーションのメニューバーが消えたのでそれぞれの対策メモ
メモしないとどこを編集したかも忘れるので随時追加していきます。
多分、Java6が入れば全部解決するんだろうけどこんな感じで入らなかったです。
もしわかったら教えていただけたら幸いです。

<img width="623" alt="スクリーンショット 2017-10-19 18.38.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/80816/6e1e15c7-1f20-aa36-08c0-44b18fdb89a5.png">

# JetBrains製IDE
IntelliJとかJetBrains製IDEもメニューバーが消えちゃったので
これはこんな感じで対応

1. "Find action"を開く(cmd + shift + a)
2. "vmoption"と入力
3. "Edit custom vm options..."を選択
4. どこかに`-Dapple.laf.useScreenMenuBar=false`と入力
5. IDEを再起動

## 参考
- [Lost main menu after MacOS update](https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000444084-Lost-main-menu-after-MacOS-update)
- [ no menu bar on mac os 10.13 beta 3](https://youtrack.jetbrains.com/oauth?state=%2Fissue%2FIDEA-175658)

# Arduino

[ここ](https://www.arduino.cc/en/Main/Software#hourly)からHOURLY BUILDSをダウンロード

## 参考
- [Menu don't show up in OSX High Sierra Menubar](https://github.com/arduino/Arduino/issues/6548)
[python]　sin波の音をWAV形式で出力する

#初めに
現在フーリエ変換をするソフトを作ろうとしています。
きちんとフーリエ変換ができているか確認するために、今回は基本となるsin波の音を作成しました。
python、音響の知識はあまりないので、いろいろアドバイスをいただけると幸いです。

#コード

```python:test.py
import numpy as np
from matplotlib import pyplot as plt
import librosa
import wave
import struct

#パラメータ
#--------------------------------------------------------------------------------------------------------------------
A=1#振幅
fs = 44100#サンプリング周波数
f0 = 440#基本周波数(今回はラ)
sec = 10 #秒

#sin波
#--------------------------------------------------------------------------------------------------------------------
def create_wave(A,f0,fs,t):#A:振幅,f0:基本周波数,fs:サンプリング周波数,再生時間[s]
    #nポイント
    #--------------------------------------------------------------------------------------------------------------------
    point = np.arange(0,fs*t)
    sin_wave =A* np.sin(2*np.pi*f0*point/fs)

    sin_wave = [int(x * 32767.0) for x in sin_wave]#16bit符号付き整数に変換
    
    #バイナリ化
    binwave = struct.pack("h" * len(sin_wave), *sin_wave)

    #サイン波をwavファイルとして書き出し
    w = wave.Wave_write("440Hz.wav")
    p = (1, 2, fs, len(binwave), 'NONE', 'not compressed')#(チャンネル数(1:モノラル,2:ステレオ)、サンプルサイズ(バイト)、サンプリング周波数、フレーム数、圧縮形式(今のところNONEのみ)、圧縮形式を人に判読可能な形にしたもの？通常、 'NONE' に対して 'not compressed' が返されます。)
    w.setparams(p)
    w.writeframes(binwave)
    w.close()
create_wave(A, f0, fs, sec) 

```

色々試行錯誤していたため、関係のないものもインポートされています。

また、サンプリング周波数は一般的なCDで用いられている44.1 kHz,基本周波数は440 Hz(ラ)となるようにパラメータを設定しました。

#つまづいたところ
##sin波の作成
最初は横軸が時間のsin波(下記の式参照)を作っていたのですが、これがうまくいきませんでした。

```math
\begin{equation}
sin(t)=A sin(2 \pi f_0 t)
\end{equation}
```

調べたら
横軸はサンプリング周波数と音の再生時間で表されるn(ポイント数？)にしなければいけなかったみたいでした。(下記の式を参照)

```math
\begin{equation}
n=t \times f_s (t:再生時間、f_s:サンプリング周波数)
\end{equation}
```

上記に示したnを用いてsinの式を書き換えると次のようになります。

```math
\begin{equation}
sin(n)=A sin( \frac{2 \pi f_0 n}{f_s})
\end{equation}
```
##waveの使い方。
wavファイルとして出力するために今回はwaveをインポートしました。
これを使って出力する際にバイナリーに変換する必要があるみたいです。
参考サイトをもとにバイナリ化することで無事出力することができました。
#参考サイト

[Pythonでサイン波(正弦波)をつくる](http://www.non-fiction.jp/2015/08/17/sin_wave/)

[python公式ドキュメント(WAVファイルの読み書き)](https://docs.python.jp/3/library/wave.html)
WindowsのPhpStormでSass自動ビルド (node-sass)

# 前準備

nodeインストールまで終わっていて、npmが使える前提です。
　まだの場合先にこちら → [Windowsでnodistを使ってNode環境構築](https://qiita.com/RyutaKojima/items/00c9653a609f739e78c7)

```
npm -v
> 4.0.5
```

# 必要なものをインストール

```
## プロジェクトのディレクトリに移動 
cd C:\プロジェクトパス

## npmの初期化(すでに終わっているなら必要ないです)
npm init -y

## node-sassをインストール
npm install --save-dev node-sass
```

> カレントディレクトリの`node_modules`以下にファイルが出来ているのを確認する
> node_modules\.bin\node-sass.cmd

# PhpStormの設定

設定を開くために、どちらかを実行します

- キーボードショートカット`Ctrl + Alt + S`
- メニュー `File > Settings` を選択

ダイアログが開いたらFile Watchersの項目を開きます
`Tools > File Watchers`

- 右上の「＋」ボタンを押し、`<custom>`を選択

  - Nameを適当に付けます。
     - サンプルは`node-sass`にしました。
  - Filetypes:
     -  `SCSS`
  - Scope:
     -  `Project Files`
  - Program: 
     - `C:\～～node-sassインストールしたパス～～\node_modules\.bin\node-sass.cmd`
  - Arguments: 
     - `--output-style expanded --source-map-contents --source-map-embed $ProjectFileDir$/src/sass -o $ProjectFileDir$/docs/css/`
  - □Immediate file synchronization
     - チェックを外します

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/87995/f03ab88d-7ed1-5897-6b75-f8e9b7aac7c9.png)


下記構成の時のサンプルです。パスは環境に応じて変更してください。
sassファイルの置き場所： /src/sass
cssファイルの出力場所： /docs/css/

「OK」を押して確定します。

:v:.scssファイルを更新すると、node-sassが動いてcssファイルが作成されます

# 問題点

- Sassファイル１つ編集しただけで、全ファイルがビルド対象になってしまう
link_toで画像とテキストを使ったリンクボタンを作りたい

# やりたいこと
こんな感じの画像＋テキストなボタンを作りたい。
![スクリーンショット 2017-10-19 17.49.14.png](https://qiita-image-store.s3.amazonaws.com/0/114828/092a2e17-111f-372b-cc50-24bfbf820058.png)

```html
<a href="https://sample.com/products/advanced_search" target="_blank">
  <img src="images/search.png">
  高度な検索
</a>
```

# やり方
`link_to ... do ... end`を使う。

## ERBの場合
```erb
<%= link_to products_advanced_search_path, target: "_blank" do %>
  <%= image_tag "search.png" %>
  高度な検索
<% end %>
```

## Slimの場合
```slim
= link_to products_advanced_search_path, target: "_blank" do
  = image_tag "search.png"
  | 高度な検索
```

追記：
@scivola さんからコメントでご指摘を頂いた通り、上記のケースではブロックパラメーターがないので、`do`は省略できます。

```slim
= link_to products_advanced_search_path, target: "_blank"
  = image_tag "search.png"
  | 高度な検索
```

ご指摘ありがとうございます！
TypeScript&jQuery-uiで要素の並び替えを行う

# はじめに

普段から「TypeScript + Pug + Sass」でアプリケーションを実装しているんですが、あるお客さんから「なんか今風の並び替え画面作ってくれん？」的な要望が1枚のデザイン画像と共に降ってきたので、実装してみた

サンプルのソースコードは[***こちら***](https://github.com/ryo-is/sort-element-sample)

## やりたいこと

* 左右2ペインに分けて並び替え
* 左右のペイン間での要素の移動,並び替え

## そういうときの**jQuery-ui**さん

要素を並び替えとかするのって「jQuery-ui」が便利だったはず…
よし、パッケージをインストールするやで

```
npm install jquery-ui
```

型定義ファイルも持ってくるか。

```
npm install @types/jqueryui
```

これであとはtsファイルにimportしたら勝ちやろ

```js
import * as $ from "jquery";
require("jquery-ui");
```

結果 → 「なんでエラー吐くんや…」
node_module内のjquery-uiを見てみると、distというディレクトリがない。そら読み込めへんわな
ということで必要な奴を直接読み込もうか
あと、ちょいと工夫をして…

```js
import * as $$ from "jquery";
if (typeof (<any>window).$ === "undefined") {
  (<any>window).$ = $$;
}
if (typeof (<any>window).jQuery === "undefined") {
  (<any>window).jQuery = $$;
}

import * as IScroll from "iscroll";
if (typeof (<any>window).IScroll === "undefined") {
  (<any>window).IScroll = IScroll;
}

declare const require: Function;
require("jquery-ui/ui/widgets/sortable.js");
require("jquery-ui/ui/widgets/draggable.js");
require("jquery-ui/ui/widgets/droppable.js");
require("jquery-ui-touch-punch");
```

前半のごちゃごちゃしている部分は、「iscroll」をimportするための闇魔術
私の先輩が生み出してくれました

並び替え時の処理は``` element.sortable() ```、ドロップ時の処理は``` element.droppable() ```を利用します

```js
sortableElement.sortable({
  update: function() {
    // 並び替え実行時の処理
  },
  // 左右のペインに共通のClassをつけて下記のようなオプションを設定します
  // これで左右のペイン間で要素を移動させることができる
  connectWith: ".connectedSortable"
})

droppableElement.droppable({
  drop: function(event, ui) {
    // 要素をドロップした時の処理
    // eventに要素がドロップされる要素,uiにドロップした要素の情報が拾えます
  }
})
```
私は対象の要素を並び替えた時に新しい並び順をDBに保存する処理を実装しています

# さいごに

文字だけではまっっっっったく想像がつかないと思うので、githubのソースコードで実際に確認してみてください
node.jsのフレームワーク「express」を利用しています(nodejsが一番馴染みがあるので)
webpackでTypeScriptやScssをコンパイルしてます
何か問題があればコメントなり、issueなり上げていただければありがたいです

ではまた！
Raspberry Pi Zero (W) にBright Piを取り付けてみた

Raspberry Pi Zero Wに赤外線カメラモジュール「[Pi NoIR Camera V2](https://www.raspberrypi.org/products/pi-noir-camera-v2/)」を取り付けたけど、赤外線フィルタが除外されているだけで、暗視撮影には赤外線ライトが必要ということを知ったので、購入、取り付けてみました。
[Bright Pi](https://www.pi-supply.com/product/bright-pi-bright-white-ir-camera-light-raspberry-pi/)のセットアップに関して日本語で分かりやすくまとまっている文献がなく、色々調べ物したので、まとめておきます。

#購入先（一例）
Raspberry Pi対応の明るい白色ライトとIRカメラライト（RobotShop）
http://www.robotshop.com/jp/ja/bright-white-ir-camera-light-raspberry-pi.html

#工作手順
Bright Pi Quick Start And FAQ
https://www.pi-supply.com/make/bright-pi-quickstart-faq/#putting-the-kit-together
背が低いもの、内側のものから半田付けしていくのがセオリー。つまりはL型ピンヘッダ→赤外線LED→白色LEDの順。上記URL内の画像の通り、基板にプリントされた図形とLEDのアノード(+)、カソード(-)を合わせていくよう注意。

https://www.pi-supply.com/make/bright-pi-quickstart-faq/#wiring-the-bright-pi
Bright Pi基板の1〜4番端子を、Raspberry PiのGPIO端子6,4,5,3番に接続します。公式のカメラケースを使っている場合、GPIO端子を背面から出すことになるので、[表面の端子配列](https://pinout.xyz/pinout/io_pi_zero)とは配置が逆になるので、気をつけてください。

|Bright Pi|GPIO|Raspberry Pi|
|:-:|:-:|:-:|
|1|GND|6|
|2|5V|4|
|3|SCL|5|
|4|SDA|3|
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/a2035a2b-44eb-99f6-1aca-017d1b140cb8.jpeg" width="50%">

#動作確認
https://www.pi-supply.com/make/bright-pi-quickstart-faq/#enable-i2c
に従って、コマンドラインで``sudo raspi-config``→Interfacing Options→I2CをEnableにするか、スタートメニュー→設定→Raspberry Piの設定から「インターフェイス」タブでI2Cを有効にするかして、その後再起動します。

https://www.pi-supply.com/make/bright-pi-quickstart-faq/#verify-that-the-bright-pi-is-seen-by-the-os
コマンドラインで``i2cdetect -y 1``を実行して、画像の通り「70」が出力されていたら、正しく接続されています。（私はここでGPIOの接続間違いで詰まりました）

``sudo i2cset -y 1 0x70 0x00 0x5a``を実行すると、白色LED4個が点灯します。

https://www.pi-supply.com/make/bright-pi-quickstart-faq/#i-cannot-see-the-ir-leds-lighting-up
``sudo i2cset -y 1 0x70 0x00 0xa5``を実行すると、赤外線LED8個が点灯します。が、肉眼では見えないので、Pi NoIR Cameraで撮影して確認しましょう。

その他コード例
https://www.pi-supply.com/bright-pi-v1-0-code-examples/

#公式ケース加工（失敗？）
フタにドリルで穴を開けて、Bright Piに付属のナイロン製ボルト、ナットを用いて、Bright Pi、フタ、カメラモジュールを固定します。
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/068e0c3c-fca1-b5ce-c1d4-3237181a146c.jpeg" width="50%">
<IMG src="https://qiita-image-store.s3.amazonaws.com/0/191129/7fb1e15f-a84a-90cc-4dc3-2211557d6c9f.jpeg" width="50%">

…というのをやってみたのですが、カメラレンズとBright Piの距離があるせいか、LEDが直接写真に写り込んでしまう…。別の手を考えなければ。
Node.js(v8.5.0以降)でBabelやwebpackを利用せずにimport/exportを利用する

# はじめに
ECMAScript 2015で導入されたモジュール機構（import/export）は、トランスパイラーのBabelやモジュール・バンドラーのwebpackを導入することで利用できるので、既に利用している方も多いかと思います。しかしながら、それらのツールを導入するのは結構面倒くさいですし、うまく設定しないと予期せぬ変換が行われて思わぬトラブルに陥る可能性もあります。
そもそもimport/exportキーワードを利用したモジュール機構は、標準仕様で定められているものなので、そんな補助的なツールを使わずにNode.jsだけで利用できればいいのに。。。
そう思っていた方々に朗報です。
まだ実験的な取り組みなので今後変更があるかもしれませんが、Node.js（v8.5.0以降）には標準のモジュール機構が組み込まれおり、既に利用できるようになっているのです。
ただ、標準のモジュール機構を利用できるようにするには若干の作業が必要となるので、今回はその方法をご紹介したいと思います。

# 作業のポイント
作業のポイントといってもそれほど難しいものではなく、下記の2つを行うだけで試すことができます。

## ポイント1：拡張子を”.mjs”にする
これはNode.jsがファイルを読み込む際に、既存のモジュール形式（CommonJS Modules）なのか、新しいモジュール形式（ES Modules）なのかを簡単に判断できるように必要な作業です。
プログラムのメイン（エントリー・ポイント）となるファイルを含め、ES Modulesの構文を使うファイルは一通り拡張子を変更しておきましょう。

```js:calculator.mjs
export const add = (a, b) => a + b;
export const sub = (a, b) => a - b;
```
```js:app.mjs
import { add, sub } from './calculator';

console.log(add(10, 20));
console.log(sub(100, 50));
```


## ポイント2：実行時に”--experimental-modules”オプションを指定する
まだ、実験段階なので通常の実行方法ではES Modulesの機能が有効になりません。
そこで下記のようにnodeコマンド実行時に”--experimental-modules”オプションを指定して実行するようにします。

```bash
node --experimental-modules app.mjs
```

# 注意点
上記のように簡単な作業で新しいモジュール機構を試すことができますが、いくつか注意点があります。

## 注意点その1：CommonJS Modulesの名前付きimportは利用しない
いわゆる”{ }”を利用して個別の要素をimportする方法は、CommonJS Modulesに対して利用できないようです。したがって、CommonJS Modulesはデフォルトimportを利用するようにしましょう。

## 注意点その2：Node.js固有のグローバル変数が使えない
いわゆる`__dirname`や`__filename`など、いくつかのグローバル変数が使えません。開発ツールの設定ファイルなどでよく見かけるので注意しましょう。代替手段として、メタ・データを利用した取得方法が現在検討されているみたいです。

# まとめ
今回は、import/exportの利用方法について簡単にご紹介しました。
詳細について知りたい方は下記のドキュメントやブログ記事が参考になります。
特に2つのブログ記事については詳しく書かれており、私自身も大変勉強になりました。良い記事を書いていただきありがとうございます。

* [Node.js公式APIドキュメント](https://nodejs.org/dist/latest-v8.x/docs/api/esm.html)
* [Node.jsのES Modulesサポートの現状確認と備え](http://teppeis.hatenablog.com/entry/2017/08/es-modules-in-nodejs)
* [.mjs とは何か、またはモジュールベース JS とエコシステムの今後](https://blog.jxck.io/entries/2017-08-15/universal-mjs-ecosystem.html)

なお、Node.jsのES Modulesはあくまでも試験的な取り組みなので、現時点（2017年10月時点）では、本番システムに適用しない方がよいと思います。ただ、これまでNode.jsで利用できていたものが利用できなくなるので、その辺は今から準備しておいた方がよいでしょう。
早く補助的なツールを利用しなくて済むようになるといいですね。
それではごきげんよう！
Excelファイルくし刺し検索置換

####複数のExcelファイルをくし刺し検索置換
Excelファイルを扱う話題最終編。

ClosedXMLを使って、C#でExcelファイルのセル中の文字を検索/置換する。
テキストボックスをふたつつくって、ボタンのイベントで呼ぶだけ。
foreachでbook, sheet, row, cellを回して、文字(value)を置換するだけでできる。


```
	string[] files = Directory.GetFiles(KeywordTextBox.Text, "*.xlsx");
	foreach (string file in files)
	{
		string savename = Path.GetDirectoryName(file) + @"\" + Path.GetFileNameWithoutExtension(file) + "2.xlsx";
		using (var wb = new XLWorkbook(file))
		{
			foreach (var worksheet in wb.Worksheets)
			{
				foreach (var line in worksheet.Rows)
				{
					for (int i = 0; i < 65500; i++)
					{
						IXLCell cell = worksheet.Cell(line.Number, i);
						cell.Value = cell.Value.ToString().Replace(ExcelKeywordTextBox.Text, ExcelChange2KeywordTextBox.Text);
					}
				}
			}
			wb.SaveAs(savename);
		}
	}
}

```
Mac OS Xで使える開発者向けコマンド集

## brewをインストール

https://brew.sh

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

## Xcodeをインストールしよう（mas編)

```
brew install mas
mas install 497799835
```

## Xcodeをインストールしよう(xcode-install編)

**RVMかrbenvをインストールしておいてください。**

```
gem install xcode-install --no-document # ドキュメントはいらない
xcversion list
xcversion install 9
xcversion install-cli-tools
```

## Xcodeのライセンスに同意する


```
sudo xcodebuild -license
```

## ソフトウェアアップデートを探す

```
softwareupdate -l
```
or
```
softwareupdate --list
```

## ソフトウェアアップデートをする

```
sudo softwareupdate --install --all
```

## セットアップスクリプトを活用する

- [thoughtbot/laptop](https://github.com/thoughtbot/laptop)

思いついたら書く。。 to be continued.
Arrow Function の「束縛」の歴史。束縛してるのしてないの？

諸事情によりほとんど追いかけていなかったJavaScript周りの情報を追いかける必要がでてきて
Arrow Function の説明を書いてあるサイトをあちこち見たのですが、

* this を束縛する
* this を束縛しない

二通りの説明が存在して困惑しました。

## 歴史
MDNの変更歴史の影響にみえます。

### リビジョン 1012725
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions$revision/1012725

>アロー関数式（またはファットアロー関数）はfunction式に比べより短い構文を持ち、 this の値をレキシカルに束縛します。アロー関数は常に匿名関数です。

束縛する

`this の値をレキシカルに束縛します`

### リビジョン 1050326
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions$revision/1050326

>アロー関数式 は、function 式 と比べてより短い構文を持ち、this の値を語彙的に束縛します (ただし、自身の this や arguments, super, new.target は束縛しません)。アロー関数は、常に 匿名関数 です。

束縛するけど束縛しない

`this の値を語彙的に束縛します (ただし、自身の this や arguments, super, new.target は束縛しません)`

### リビジョン 1265125
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions$revision/1265125

>アロー関数式 は、function 式 より短い構文で、this, arguments, super, new.target を束縛しません。アロー関数は、メソッドでない関数に最適で、コンストラクタとして使うことはできません。

束縛しない

`this, arguments, super, new.target を束縛しません`

## 英語版
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

>An arrow function expression has a shorter syntax than a function expression and does not have its own this, arguments, super, or new.target. These function expressions are best suited for non-method functions, and they cannot be used as constructors.

肝心の部分は

>does not have its own this, arguments, super, or new.target

ですね。

## ガイドページ
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Functions#Arrow_functions

>アロー関数式 （ファットアロー関数としても知られる）は関数式と比較してより短い構文を持ち、this の値をレキシカルに束縛します。アロー関数は常に無名関数です。

束縛する

`this の値をレキシカルに束縛します`

## まとめ
特にこの領域に詳しいわけではないので自身の意見はありません。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [アロー関数 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)
* [Arrow functions - JavaScript | MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)