OmniAICreator/Qiita-1.07M huggingface dataset:
nem2-docsをPDFで読むための変換用DockerImageの用意と日本語訳もしました。

Sphinxで作られているので、htmlをビルドにpipパッケージのインストールが必要だったり、
PDFを出力するにはLatex環境が必要だったりと環境を汚したくないorとりあえず結果がほしい人向け。
追記で日本語訳もしたのでその話も。

＊ 追記
のちに無事、本家に取り入れられました。
画面下部に言語セレクタがあるのでこれで切り替えてください。


# 下準備

[nemtech/nem2\-docs: nem2 \(Catapult\) official documentation](https://github.com/nemtech/nem2-docs)

nem2-docsのリポジトリからまるっとクローンするかzipでダウンロードして展開してください。

[44uk/nem2\-docs\-builder: build nem2\-docs and output html, pdf](https://github.com/44uk/nem2-docs-builder)

ここからファイルをダウンロードしてください。

* Dockerfile
* build.sh
* .dockerignore

この３つのファイルをnem2-docsのディレクトリへいれます。

# ビルド

スクリプトを実行するだけです。

```
./build.sh
```

`build/html`以下のディレクトリにファイルが生成されます。

PDFがほしい場合は`latexpdf`を渡します。

```
./build.sh latexpdf
```

`build/latexpdf/nem2-docs.pdf`にファイルが生成されます。

![nem2-docs-pdf.png](https://qiita-image-store.s3.amazonaws.com/0/2353/40c8cf83-7bda-f5a1-8236-58c01e5c0117.png)

# 出力設定

pdfの出力について設定したい場合は`source/conf.py`に`latex`に関わる設定があるので、その辺をお好みで変更してください。

とりあえず妙な空白ページが挿入されるのは、以下の設定を入れれば入らなくなります。

```source/conf.py

latex_elements = {
    'extraclassoptions': 'report',
.
.
.
```

一通り目を通してみたのですが、画像の順序がおかしかったり、画像がはみ出してしまったりしていました。
preambleなどをいじってみましたがうまくいきませんでした…。
私はあまり詳しくないのでもっといい感じで出せるおすすめ設定があれば教えてほしいです。

# 国際化対応版

`intl`ブランチにてコマンドをちょっと変えたものを公開しました。
これは、nem2-docsの日本語訳版でも使っているものですが、フォーマットと言語を渡せるようにしています。

* [44uk/nem2\-docs\-builder at intl](https://github.com/44uk/nem2-docs-builder/tree/intl)
* [44uk/nem2\-docs at ja](https://github.com/44uk/nem2-docs/tree/ja)

この２つを使えば、日本語訳版のPDFも出力可能です。
あとは他の言語でも翻訳ファイル(*.po)が出揃ってくればどの言語でもこの方法で対応できそうです。
(sphinx-intlでの翻訳を公式に取り込んでもらうかはまだ悩んでいます。英語のドキュメント自体もまだ未完成のようなので)

画像のズレやはみ出しは相変わらず起こるので、`source/conf.py`でいい感じの設定が必要みたいです。

また、日本語訳についてですが、一部記号が意図しないものに置き換わってしまっているようなので、その辺改善していきます。
本家ドキュメント自体まだまだ未完成のようですので、引き続き更新を追いかけていく予定です。
AWS Data Pipeline メモ

Data Pipelineを使うときのデフォルトのEMRのインスタンスがx1.largeになっている。
supported instanceはm1.smallから。
m1.smallを使うと、選択されたamiのバージョンではsmallは使えないと言われる。
ami typeを2.3.0まで下げれば選択できるようになる。安く実行できる。
Windows に Fira code をインストールする 

## Fira code とは

オープンソースのかっこいいコーディング用フォント。
Font Ligature（合字）という複数の文字を合成して一文字にしたものが特徴です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/4c33ee2c-d238-93d6-7f5e-803c345a2d37.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/582590f4-f330-95fc-fc6c-ec641b4db182.png)

## Fira code のインストール

[GitHubにある公式](https://github.com/tonsky/FiraCode)のリンクから ttf を落としてインストールしていいですが、chocolatey を使うと簡単です。

※ shell は管理者権限で立ち上げないと失敗することがあるようです。

```powershell
PS > choco install firacode
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/50ef5a59-8710-2361-0e77-c6c8e8a2a920.png)

## Visual Studio 2017 で使う

`ツール` > `オプション` > `環境` > `フォントおよび色` から設定できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/abe74739-671e-39c9-90bc-1f682387cbb3.png)

ラムダ演算子が合字になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/b4b6a582-783a-945b-18b6-03325b152393.png)
Nuxt.js(Vue.js)でFont Awesomeアイコンをinputのplaceholderで使いたい

## 問題点 

```html
<input type="text" placeholder="&#xf002;" />
```
の様に記述してもエスケープされてしまう。

## 結論
以下の様にする。

```html
 <input type="text" :placeholder="icon" />
```
```vue
<script>
export default {
    data() {
        return {
            icon: '\uf002'
        }
    },
// ・・・
```
apr_socket_recvエラー

OSXでabやsiegeなどのベンチマークテストで負荷の軽いテストを少し長めに続けると以下のエラーが出ることがあります。

```
Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
apr_socket_recv: Operation timed out (60)
```

このエラーの原因は大量リクエストをさばくための空きポートが枯渇するためで、`net.inet.tcp.msl`という値を低くすれば解決できます。

```
sudo sysctl -w net.inet.tcp.msl=1000
```
```
net.inet.tcp.msl: 15000 -> 1000 
```

ソース
 * https://gist.github.com/carlos8f/3473107
 * [Why does a simple Thin server stop responding at 16500 requests when benchmarking? [duplicate]](https://stackoverflow.com/questions/9156537/why-does-a-simple-thin-server-stop-responding-at-16500-requests-when-benchmarkin)
 * [spray-canのサンプルにabコマンド打つと16000reqくらいで止まる](http://tech-blog.tsukaby.com/archives/762)
【解決方法】react-railsでreact_componentを利用する際にUncaught Error: Cannot find module "react_ujs" が発生する

# 問題点

`react-rails`でreact_componentを利用する際にUncaught Error: Cannot find module "react_ujs" が発生する。

ブラウザのコンソールに出力されるエラー（↓）
<img width="375" alt="react_component_error.png" src="https://qiita-image-store.s3.amazonaws.com/0/141934/fb227438-81cf-fefd-18ea-c13f6afa5efe.png">

# 解決方法

**react_ujs**をインストールする

```shell-session
$ yarn add react_ujs
```

---

# 問題発生／解決時の実装

## 準備

gemのインストール

```ruby:Gemfile 
gem 'webpacker'
gem 'react-rails'
```

```shell-session
$ bundle install
```

reactを利用する準備

```shell-session
$ rails webpacker:install
$ rails webpacker:install:react
$ rails generate react:install
```

## react_component

コンポーネントの作成

```shell-session
$ rails g react:component HelloWorld greeting:string
```

`app/javasctipt/component`配下のコンポーネントを利用できるように設定

```js:app/javasctipt/packs/application.js
// Support component names relative to this directory:
var componentRequireContext = require.context("components", true)
var ReactRailsUJS = require("react_ujs")
ReactRailsUJS.useContext(componentRequireContext)
```

viewでreact componentを呼び出す

```erb:app/views/xxx/xxx.html.erb
<%= javascript_pack_tag 'application' %>
<%= react_component("HelloWorld", { greeting: "Hello" }) %>
```

![スクリーンショット 2018-06-09 11.19.42.png](https://qiita-image-store.s3.amazonaws.com/0/141934/0e43d119-d67b-3aef-3ee5-2c1c4dfa3f02.png)

# 参考
[Can't resolve react\_ujs · Issue \#721 · reactjs/react\-rails](https://github.com/reactjs/react-rails/issues/721)
PythonでWebサーバー

プロンプトから

```
python -m http.server 8000
```
Webサーバーが起動します。
CGIを使う場合は、

```
python -m http.server --cgi 8000
```
のようにオプションを付けます。

ブラウザから

```
http://localhost:8000/index.html
```
とかで使えます。
Webサーバーの終了はプロンプトから、Ctrl + c で行います。
rustとscalaとkotilnの勉強 hello world をcargo sbt gradle で

Rustから

Rustはcargoを使う

プロジェクトを作成

```zsh
cargo new hello_cargo --bin
```

hello_cargoディレクトリができるのでcd

cargo.tomlに色々書けるらしいがとりあえずは放置
ビルト

```zsh
cargo build
```

リリースビルドするときは —-releaseで

```zsh
cargo build —-release
```

runでビルドして実行

```zsh
cargo run
```

checkでコンパイラのチェックだけする

```zsh
cargo check
```

sbtとgradleはググったサイトを丸パクリ。
意味はよくわかってない。そのうちわかるといいな。

scalaといえばsbt
hello_sbt用にプロジェクトをつくる

```zsh
sbt new sbt/scala-seed.g8
```

プロジェクト名を聞かれるのでhello_sbtと入力
hello_sbtディレクトリができるのでcd
~/src/main/scalaにhello.scalaを書く

sbtをたたいてrun

```zsh
[xxx/ ~/study/scala/projects/hello_sbt/hello_sbt/ #docker-scala#]% sbt
Getting org.scala-sbt sbt 1.1.1  (this may take some time)...
:: retrieving :: org.scala-sbt#boot-app
        confs: [default]
        75 artifacts copied, 0 already retrieved (27501kB/231ms)
[info] Loading project definition from /home/xxx/study/scala/projects/hello_sbt/hello_sbt/project
[info] Loading settings from build.sbt ...
[info] Set current project to Hello (in build file:/home/xxx/study/scala/projects/hello_sbt/hello_sbt/)
[info] sbt server started at local:///home/xxx/.sbt/1.0/server/8c79b53261d7cc7d0f28/sock
sbt:Hello> run
[info] Running Hello 
こんにちは世界
[success] Total time: 1 s, completed 2018/06/09 1:43:51
sbt:Hello> exit
```

kotlinはgradle
ますはプロジェクトをつくる

```zsh
mkdir hello_gradle
cd hello_gradle
gradle init
```

build.gradleを以下に書き換え

```gradle
plugins {
	    id "org.jetbrains.kotlin.jvm" version "1.1.3-2"
}

apply plugin: 'application'

mainClassName = 'HelloKt'

repositories {
	    jcenter()
}

dependencies {
	    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8"
}
```

/src/main/kotlinにHello.ktをつくる

```kotlin
fun main(args:Array<String>){
	println("こんにちは世界")
}
```

ビルド

```zsh
./gradlew build
```

実行

```zsh
./gradlew run
```
はじめてのCTF ksnctf #18 USB flash drive

はじめまして．CTF初心者の試行錯誤を少し交えながら書きたいと思います．

# 問
https://ksnctf.sweetduet.info/problem/18
> Find the flag.
> 
> http://ksnctf.sweetduet.info/q/18/drive.zip

# 解
タイトルから推測すると，USBフラッシュドライブのイメージファイルが渡されたので，マウントしてみると
- Carl Larsson Brita as Iduna.jpg
- Mona Lisa.jpg
- The Great Wave off Kanagawa.jpg
の3枚の画像が入っていました．これらファイルに怪しい点がなかったので，`fls`と`icat`を使ってみることにしました．

``` bash
$ fls drive.img 
r/r 4-128-4:	$AttrDef
（省略）
r/r 3-128-3:	$Volume
r/r 35-128-1:	Carl Larsson Brita as Iduna.jpg
r/r 37-128-1:	Mona Lisa.jpg
r/r 38-128-1:	The Great Wave off Kanagawa.jpg
-/r * 36-128-1:	Liberty Leading the People.jpg
-/r * 36-128-4:	Liberty Leading the People.jpg:00
-/r * 36-128-5:	Liberty Leading the People.jpg:01
-/r * 36-128-6:	Liberty Leading the People.jpg:02
-/r * 36-128-7:	Liberty Leading the People.jpg:03
-/r * 36-128-8:	Liberty Leading the People.jpg:04
-/r * 36-128-9:	Liberty Leading the People.jpg:05
-/r * 36-128-10:	Liberty Leading the People.jpg:06
V/V 256:	$OrphanFiles
```

どうやら削除された Liberty Leading the People.jpg というファイルが存在するようなので，`icat`で取り出し．

```bash
$ icat drive.img 36 > hoge.jpg
```

このファイルを開くと民衆を導く自由の女神の画像下部に

> The flag is in this file, but not in this image.

と記載されていたので，バイナリエディタやステガノグラフィの各種ツール群でいろいろ試してみましたが，何も出てきませんでした．ここで，「"The flag"はフランス国旗のことを指しているのか？🤔」と思ったので別の試行をすることにしました．

`autopsy`でUSBフラッシュドライブのイメージファイルを開いて Liberty Leading the People.jpg:00 をクリックすると "FLA"の文字列が表示されました．😓それ以降のファイルもどうやらFLAGの一部っぽかったのでこれらファイルをすべて保存し，下記コマンドで結合しました．

```bash
$ cat vol1-C..Liberty.Leading.the.People.jpg.* > out.txt
```

結合後の文字列が "FLAG_hogehoge" となっていたので，これで回答すると正解でした．

余談ですが，:00のファイル群も`icat`で取り出せることを確認しました．

```bash
$ icat drive.img 36-128-4
FLA
```

# 所感
`fls`で:00等のファイル群が表示されたときは，「ファイルが断片化したものかな？」と思っていたので盲点でした．とても勉強になったので良かったと思います．
今回の"FLA"の偶然の発見から，GUIのツールを利用することで気づきやすいこともあるのかなと思いました．

# 疑問点
`fls`や`autopsy`で表示される`Type dir/in`がよくわからなかった．`r`がファイル`d`がディレクトリを示していることはわかったけど， `dir/in`が何を指しているのかググったけどわからなかったのでご教授いただけると嬉しいです．
keycloak入門

#前提知識(筆者のレベル)
・Sier経歴2年、Win,Linuxどちらも触れるってレベル
・認証についての知識は用語をちらほら知ってるレベル
　(SSOとかMFAとか)
・ADについての基礎知識がある
　⇒keycloakは認証用外部DBとしてLDAPやADを連携することが可能

※ちなみにこの記事を書いたのは2018年7月時点なので、少し情報が古い箇所があるかもしれないのでご了承を

#keycloakとは

・OSSでシングルサインオンを実現する認証ソフトウェア
・認証、認可も可能でSAML、OpenIDConnect、OAuth2.0に対応
・SSO基盤の分野では後発だが、コミュニティベースでの開発が進められており、勢いのあるソフトウェア
・「クライアントアダプタ」と呼ばれるKeycloakからのアクセストークン取得やアクセス制御をするもの。
　⇒いわゆるエージェント方式に相当

#keycloakの代表的な機能
1．シングルサインオン
2．API認可
3．アプリケーション向けのライブラリ提供
4．外部IdP連携
5．外部ユーザーデータストアとの連携
6．豊富なカスタマイズポイント

##シングルサインオン
以下に対応
・OpenID Connect
・SAML2.0
###実現方法
①keycloakクライアントアダプターを導入してSAML2.0/OIDCに対応させる
　これがベースのやり方で、レガシーな社内アプリケーションを使用している場合には
　クライアントアダプターが対応していない場合もある。。
　⇒リバースプロキシ型を利用して対応！

##API認可
OAuth2.0を利用して、認可サーバーとしてkeycloakを利用する。

###今後注目されるワード
[FAPI(Finacial API)](https://qiita.com/hiroga/items/ff5e65a7994f1f2fe576)
[FIDO（Fast IDentity Online：ファイド）](https://it.impressbm.co.jp/articles/-/15739)

##アプリケーション向けのライブラリ提供
クライアントアダプターと呼ばれるライブラリを各アプリケーションに組み込むことで
SSO(OIDC、SAML)や認可(OAuth)を行うことができる

⇒対応しているプラットフォームは少ない。。
⇒そんなときは、「リバースプロキシ方式」がある
以下を使用してリバプロ型を利用することが可能
- Apacheのmod_auth_openidc （一般的なシングルサインオンの場合）
- 3scaleのapicast (API認可認証の場合）
⇒今後はGO言語のベースのproxyを用意して、

#OpenAMとの違いは？
・インストール、設定が簡単。(というよりOpenAMのほうが複雑)
　⇒Java8JDKのインストールと、配布されているtar/zipを解凍するだけ！！
　⇒GUIで設定可能(CLIツールもあり)

・Dockerのイメージもあるので簡単にたてることもできる

・導入も負荷が高くないため、リスクベース認証など凝ったことしなければ
　keycloakのほうがシンプルにできる

⇒「シングルサインオンやりたいです！」とか「ちょっとだけ多要素認証やりたい」「そんな複雑な認証は必要ないです」って感じの要件であればOpenAMよりもkeycloakのほうがハマる

###もう少し細かく言うと
以下はkeycloakではできない
・リスクベース認証
・代理認証

・対応しているプラットフォームがOpenAMに比べて少ない。
　⇒けど有名どころは抑えているので、WebアプリをIISで立てているとか
　　JBossの古いバージョン使っているとか、がなければ大体使える

###結局どっちがいいの？
結論から言うと、OpenAMのほうが安定しているので「現状は」優勢
keycloakは限定要件(SAMLだけやりたい、ソーシャル連携だけやりたい)であればハマるパターンもある。

一般企業の認証基盤として
keycloakを導入するのはちょっと怖いかなーという印象。

なぜなら、keycloakはコミュニティが活発でバージョンアップのサイクルも早い。
　⇒認証基盤を半年に一回バージョンアップさせる、ってのは現実的に考えてありえない
　　(費用とか工数とか鑑みて)

keycloakも機能的には基本的なところは網羅しているが、
まだまだバグも多く、どんどん改修⇒アップグレードしているので安定性、という意味では
OpenAMを採用したほうがよい。

だけどOpenAMはコミュニティが停滞している、ソースコードも膨れ上がっていて
カスタマイズには高度なスキルが求められる。
それに比べて扱いやすいkeycloakが安定性が増していけば、
今後「OpenAM⇒keycloakへの移行」なんて案件が増えていくことが予想される。

#結論
今のうちにkeycloakの仕様を把握しておいてノウハウを貯めておき
近い将来の認証基盤公開案件を狙うことが可能
なので今後もkeycloakのキャッチアップをどんどん進めていきたいと思います。



#動作環境
|項目|動作環境|
|:---|:---|
|ハードウェア|RAM 最低512M以上<br>HDD 最低 1GB以上|
|プラットフォーム|Javaが動作するOS<br>Win,LinuxどっちもOK|
|Java Development Kit|Java Development Kit 8 |
|対応仕様|SAML2.0<br>OpenID Connect<br>OAuth2.0|

##参考URL
・OpenStandia
http://openstandia.jp/oss_info/keycloak/
・keycloakとは
https://qiita.com/daian183/items/30f01e162e03567ff21b
GitHub Pages のサイトを HTTPS 有効にした

なにやら世の中的に HTTPS が有効になってないサイトは見てもらえなくなっていくんだろうなという雰囲気をバリバリ感じている今日このごろです。

前々から GitHub Pages で展開しているサイトを HTTPS にしようと目論んでいたものの、手順がややこしくて Firebase に移行しようかなどうしようかなとか思っていたら、GitHub がオフィシャルで HTTPS 対応しました。神か！！

- [Custom domains on GitHub Pages gain support for HTTPS](https://blog.github.com/2018-05-01-github-pages-custom-domains-https/)

しかも設定がめっちゃくちゃ簡単でリポジトリの Settings 画面で `Enforce HTTPS` にチェックを入れるだけなのです…！

<img width="759" alt="スクリーンショット 2018-06-06 8.16.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/3336/7f20d2b9-d70a-9c21-6bd8-ac5aae8840ed.png">

> Unavailable for your site because your domain is not properly configured to support HTTPS

…

…

チェックが入れられない！！？？

調べてみると、DNS の設定を変えるといいらしい。なにやら最新の A レコードの設定内容は以前自分が設定したときと変わっているようだ。

- [Configuring A records with your DNS provider](https://help.github.com/articles/setting-up-an-apex-domain/#configuring-a-records-with-your-dns-provider)

もともと 192.30.252.153,192.30.252.154 と設定されていたのを


|<img width="674" alt="スクリーンショット 2018-06-06 8.14.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/3336/015411e8-6f37-8102-76e6-e2341dd73fc5.png">|
|:--:|
|もともとの設定値|

185.199.108.153... として設定しなおしました。（画面はお名前.com）

|<img width="669" alt="スクリーンショット 2018-06-06 8.16.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/3336/9aab9524-515c-73fe-6d80-6bb6453c7384.png">|
|:--:|
|新しい設定|

でもってしばらく待ってから Settings 画面を開くと…。

<img width="765" alt="スクリーンショット 2018-06-06 8.53.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/3336/7bd762e0-c21c-378c-92e8-cb05bd0959fe.png">

> Not yet available for your site because the certificate has not finished being issued. Please allow 24 hours for this process to complete. (grantall.fm) 

という感じで、あとちょっと待ってれば有効にできそうです！

…

…

…

40時間くらい（！）待ったらチェックが入れられるようになりました！やったね。

<img width="749" alt="スクリーンショット 2018-06-09 10.29.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/3336/ac783c0e-2db6-bf5f-35aa-bfdafcb531a4.png">

自分の環境だと人が作った jekyll のテンプレートを使わせてもらっていて CSS やら画像やらの呼び出しのパスに `{{ site.github.url }}` というパラメータを使って URL で指定しているところがあります。そのままだと http を指してしまっている関係で読み込まれなくなっていたのだけど、いったん適当なコミットをプッシュしたら rebuild が走って解消しました。
Visual Studio 2017で複数行の文字列補間を書きたいのに文字列連結される

# Visual Studio 2017で複数行の文字列補間を書きたいのに連結される

Visual Studio もしくは拡張機能の変更か、C# 仕様が厳格になったのか、はたまた私が記憶違いしているだけかわかっていないが、とにかく詰まったので備忘録として残す。

> 勘違いしてましたね。VB.NET と混同していました。ただ `いいね` いただいてしまったので残します。


## 私の問題
Visual Studio 2015 のときは複数行の文字列補間を書くとき、`$"";` のダブルクォーテーションの間でエンターキーを押すと、次のように書けた。

そして、今でもこれを期待している。

```csharp
var s = $"
    ココに文字列を書けていた
    ";
```

今、Visual Studio 2017 で同じように操作すると、次のように補完される。

```csharp
var s = $"" +
    $"";
```

## 回避策

`$@` を使えばよかった。

```csharp
    var s = $@"
    ココに文字列を書く
";
```

改めて眺めると、逐語的文字列リテラルで書く方がまっとうな気がする。

## 確認した環境

OS: Windows 10 Home バージョン 1803 ビルド 17124.81 日本語 64ビット
ツール: Microsoft Visual Studio Community 2017 Version 15.7.3
rustとscalaとkotilnの勉強 とりあえずhello world

Dockerができたのでやっていく。
当面はThe Rust Programming Language 日本語訳を頭からやりつつ、scals、kotilnで同じことをやってみる方針。

まずは3章、事始め 
Hello worldから

Rust

```rust
fn main(){
	println!("こんにちは世界");
}
```

Build

```zsh
rustc hello.rs
```

実行

```zsh
./hello
```

Scala

```scala
object Hello{                                                                                                                 
  def main(args:Array[String]){                                                                                             
    println("こんにちは世界")                                                                                             
  }                                                                                                                         
}                                                                                                                             
```

Build

```zsh
scalac Hello.scala
```

実行

```zsh
scala Hello
```

Kotlin

```kotlin
fun main(args:Array<String>){
	println("こんにちは世界")
}
```

Build

```zsh
kotlinc Hello.kt -include-runtime -d hello.jar
```

実行

```zsh
kotlin hello.jar
```
読書ノート：現代数理統計学の基礎(その３)

#はじめに

- [現代数理統計学の基礎 (共立講座 数学の魅力)](https://www.amazon.co.jp/dp/4320111664)
- 2018/5/6、amazonで購入。
- 第６章「統計的推定」演習問題の問16に関するメモ
- 求まった最尤推定量が一致性を持つと記述されているが、実際は一致性を持たない。
- 自分の計算が本当に正しいかどうか不安だったので、Rプログラムを作成して検証してみた。

#問題の内容

$(X_1,Y_1),\dots,(X_n,Y_n)\ $を互いに独立な確率変数のペアとし、$X_i$と$Y_i$も独立でともに$N(\mu_i,\sigma^2)$に従うものとする。
(1) $\mu_i,\dots,\mu_n,\sigma^2$の最尤推定量を求めよ。
(2) $\sigma^2$の最尤推定量が一致性を持つことを示せ。
(3)【略】

#回答例

(1) 対数尤度を求めて最大化するパラメータを求める。

```math
\begin{align}
f(x_i,y_i|\mu_i,\sigma^2)&=\frac{1}{2\pi\sigma^2}
\exp\left(-\frac{(x_i-\mu_i)^2+(y_i-\mu_i)^2}{2\sigma^2}\right)\\
\log\prod_{i=1}^n f(x_i,y_i)&=-n\log(2\pi)-n\log \sigma^2
-\frac{1}{2\sigma^2}\sum_{i=1}^n((x_i-\mu_i)^2+(y_i-\mu_i)^2)\\
\frac{\partial}{\partial \mu_i}\log\prod_{i=1}^n f(x_i,y_i)&=
\frac{1}{\sigma^2}(x_i-\mu_i+y_i-\mu_i)=0
\Rightarrow \mu_i=\frac{x_i+y_i}{2}\\
\therefore \quad T_i(X,Y)&=\frac{X_i+Y_i}{2}\quad{\mu_iの最尤推定量}\\
\log\prod_{i=1}^n f(x_i,y_i)&=-n\log(2\pi)-n\log \sigma^2
-\frac{1}{4\sigma^2}\sum_{i=1}^n(x_i-y_i)^2\\
\frac{\partial}{\partial \sigma^2}\log\prod_{i=1}^n f(x_i,y_i)&=
-\frac{n}{\sigma^2}+\frac{1}{4\sigma^4}\sum_{i=1}^n(x_i-y_i)^2=0
\Rightarrow \sigma^2=\frac{1}{4n}\sum_{i=1}^n(x_i-y_i)^2\\
\therefore \quad S(X,Y)&=\frac{1}{4n}\sum_{i=1}^n(X_i-Y_i)^2\quad{\sigma^2の最尤推定量}
\end{align}
```

演習問題の略解では、分母が4ではなく2となっている。何度も計算を確認したがやはり4だと思う。

(2) 得られた最尤推定量の収束値を求めてみる。

```math
\begin{align}
X_i-Y_i&\sim N(0,2\sigma^2)\Rightarrow \frac{X_i-Y_i}{\sqrt{2}\sigma}\sim N(0,1)\\
\left(\frac{X_i-Y_i}{\sqrt{2}\sigma}\right)^2&\sim \chi^2_1
\Rightarrow E\left[\left(\frac{X_i-Y_i}{\sqrt{2}\sigma}\right)^2\right]=1\\
\therefore \quad S(X,Y)&\to_p\frac{\sigma^2}{2}(n\to\infty)\quad{大数の法則}
\end{align}
```

従って最尤推定量は一致性を持たない。真値の半分となっている。
期待値も$\frac{\sigma^2}{2}$であり、$n\to\infty$としても半分のままである。
分母が2なら一致性と不偏性を持つが、最尤推定量とは異なっている。

#プログラムによる検証

対数尤度を最大化するパラメータ$\sigma^2$が$\frac{1}{4n}\sum_{i=1}^n(x_i-y_i)^2$となることを確認する。

- 平均値$\mu_i$は一様乱数で生成。
- optim関数に渡すパラメータは、$n$個の平均値$\mu_i$と$\sigma^2$から成る配列。
- dnorm関数には標準偏差を指定する必要があるため、絶対値にしてから平方根とする。
- optim関数は最小化するので、対数尤度の符号を変えることで最大化する。

```R
set.seed(1)

sd = 2
n = 5
mu = runif(n)
xi = rnorm(n,mean=mu,sd=sd)
yi = rnorm(n,mean=mu,sd=sd)
mu_mle = (xi+yi)/2
s2_mle = sum((xi-yi)^2)/4/n

my_logLik = function(pa){
  mn = pa[1:n]
  s1 = sqrt(abs(pa[n+1]))
  -sum(dnorm(x=xi,mean=mn,sd=s1,log=T)+dnorm(x=yi,mean=mn,sd=s1,log=T))
}

par = rep(1,n+1)
rt = optim(par,my_logLik,control=list(maxit=10000))
```

結果は以下の通り。

```R
> c(s2_mle,rt$par[n+1])
[1] 2.328907 2.328533
> 
> data.frame(mu_mle,par=rt$par[1:n])
      mu_mle        par
1  1.5321708  1.5321919
2  3.1914187  3.1910387
3 -0.2035032 -0.2028649
4 -0.8193685 -0.8192448
5 -1.2406955 -1.2406410
```

対数尤度を最大化するパラメータとして、$\sigma^2$は$\frac{1}{4n}\sum_{i=1}^n(x_i-y_i)^2$、$\mu_i$は$\frac{x_i+y_i}{2}$とほぼ一致する値が得られた。

#おわりに

- 【注意事項】本メモの内容が本当に正しいかどうかは分かりません。
How to call azure-cli from python script

# Overview

　Microsoft Azureを利用することになったので作ってみた。
WebUI操作は嫌だ。コマンド操作もあるがそのたびにターミナルを起動するのも面倒くさい。
というかCLIの利点が薄れまくる。

どうすれば良いか

- REST APIをつかう
- SDKを使ってアクセスする
- azure-cli　を呼び出す

採択した方法は3番目。
というのも、1も2も利用するためにはPermissionを定義しなければならず
がっつりとAzureを使う時に使用するだけでユーザ追加、みたいな操作だけを実行するには
重たすぎるからだ。

## Environment

- CentOS7 
- python3.4

### Install azure-cli

azure-cliを使う以上、azure-cliをインストールしなければならない。
python2.7 ベースで良いならば azure-cli公式ドキュメントの通り
yum repoを取得してyum install してしまえば良い。

https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest

せっかくだからpython3.4 等を使いたいという場合は、
python3系で呼び出せるようにインストールする必要がある為、
以下のような形で入れる。

```
# pip3 install azure-cli
```

# How to call azure-cli from python script

az コマンドは az.cli.core から get_default_cli をimportすれば良いようだ。
従って、実行には以下のようにpython scriptを書く。

```py
# -*- coding: utf-8 -*-

import logging
from azure.cli.core import get_default_cli

# Login to Azure
LOGIN = [
    'login',
    '-u', '<username>',
    '-p', '<password>'
]
get_default_cli().invoke(LOGIN)

# Logout from Azure
LOGOUT = [
    'logout',
]
get_default_cli().invoke(LOGOUT)
```

ものすごくやっつけだが、標準的な実行としてはこれで良い。
これでログイン、ログアウトが可能
get_default_cli が　```az``` コマンドに相当するので
その後に繋がる引数をリストでinvokeとして渡してやれば良い。

なお、azはloginするとログイン情報を保持し続けてしまうので
必ずlogoutを最後に入れること。

後はReferenceを読んで実行可能なコマンドと
引数、オプションを参考に記載していけば良い。

くどいようだが、再びリンクを張っておく。
ここの Reference を展開すれば良い。

https://docs.microsoft.com/en-us/cli/azure/reference-index?view=azure-cli-latest
VS Code1.24の気になった新機能(まとめ)

[Visual Studio Code](https://code.visualstudio.com) の バージョン 1.24 がリリースされたので、[リリースノート](https://code.visualstudio.com/updates/v1_24)を眺めてみて気になった機能をチェックしてみた。(以前のバージョンを眺めてみた時のやつはこちら。[1.23](https://qiita.com/12345/items/627298550aab19f1d8a6) / [1.22](https://qiita.com/12345/items/8253a1eee38b6741905e) / [1.21](https://qiita.com/12345/items/71ce73c52cf2232fc10c) / [1.20](https://qiita.com/12345/items/1390c7cab11d968e7691) / [1.19](https://qiita.com/12345/items/a331c014a9d3fa9dac0e) / [1.18](https://qiita.com/12345/items/9b827138b5044ca82482) / [1.17](http://qiita.com/12345/items/28d83361341ce3ff3c9c) / [1.16](http://qiita.com/12345/items/5215293977dde2149c0f) / [1.15](http://qiita.com/12345/items/cebf4b4e9bfb2d2ef771))

- [同一ワークスペースを複数ウィンドウで開く](https://qiita.com/12345/items/ea4bb9fbbf1a24435431)
- [置換フィールドの履歴参照機能](https://qiita.com/12345/items/7fc1317f747f5a681ef5)
- [エディタのフォントのみズームする機能](https://qiita.com/12345/items/830317c166601d8581cf)
- [同一キーバインドのチェック](https://qiita.com/12345/items/420d0186e60625c117a3)
[Haskell]モナドを定義するときのTips（と質問）

Haskellでモナドを定義するときって、FunctorとApplicativeのインスタンスにする必要もあって面倒くさいですよね。

そこで、FunctorとApplicativeを以下のように定義すると簡単です。

```hs:instance
newtype Foo s = Foo s

instance Functor Foo where
    fmap f mv = do
        v <- mv
        return $ f v

instance Applicative Foo where
    pure = return
    mf <*> mv = do
        f <- mf
        v <- mv
        return $ f v

instance Monad Foo where
    ...
```

Identity、Maybe、Either、List、Writer、Reader、Stateあたりのモナドはこの定義で正しく動きます。

質問は、「この定義でFunctorとApplicativeを正しく定義できないモナドは存在するか」もしくは、「これ以外のFunctorとApplicativeの定義でモナド則を満たすモナドは定義できるか」ということです。

強い人だれか懇切丁寧に教えて下さい……
CloudFrontの設定を他からコピーして設定する 

# 予めやっておいた方が良いこと

#### プロファイルの作成
aws --profile=プロファイル名 で切り替えられるように、`~/.aws/{config,credentials}`の設定を
aws configureで行っておく

#### SSL証明書の作成
[AWS Certificate Manager](https://console.aws.amazon.com/acm/home?region=us-east-1#/) CloudFrontのSLL証明書は、全世界で利用できるようにするためバージニア北部で作成しておく。
証明書に含めるドメインは２種類含めると良い( hoge.com と *.hoge.com のような2種類 )

この証明書のARN は 

```
aws acm list-certificates --profile プロファイル名 --region us-east-1
```

で取得できる。

「--region us-east-1 」がポイント。CloudFrontで使用するSSL証明書は、バージニア北部(us-east-1)のものを指定する必要がある

# 既存の設定を取得する

[AWSのCloudFrontの管理画面](https://console.aws.amazon.com/cloudfront/home?region=ap-northeast-1#distributions:) で「[ディストリビューション(CloudFrontの設定単位)](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-overview.html)のID」を確認する。

IDごとにある設定をjsonで取得する。

```
aws cloudfront get-distribution-config --profile=コピー元のAWSプロファイル --id [ CloudFrontの Distribution ID ] > ~/tmp/cloudfront_a.json
```

# 取得したjsonで書き換える箇所
## 消す
* ETag ( aws-cli のヘルプ、　aws cloudfront get-distribution-config help　で見ると、 The   current   version   of   the   configuration. との事 )
* DistributionConfig.CacheBehaviors は Behaviors を追加しない場合は削除

## 変更する
DistributionConfig配下の

|設定|説明|
|----|---|
|各要素のQuantity|複数あるような設定の場合での個数(前の設定から消したりした場合は減らす)|
|CallerReference|[ディストリビューション(CloudFrontの設定単位)](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-overview.html) ごとにユニークである必要がある|
|Aliases.Items|[ Alternate Domain Names (CNAMEs) ]になるものを設定|
|Origins.Items.Id|オリジンに与えられる個別のIDを設定する。オリジンを変える場合は修正する|
|Origins.Items.DomainName|オリジンのドメインを入れる。 https:// はつけないように|
|DefaultCacheBehavior.TargetOriginId|振り分けルールに無い、デフォルトの場合のオリジンを設定する( Origins.Items.Id　で設定したものを設定した )|
|ViewerCertificate.ACMCertificateArn|AWS Certificate で管理しているSSL証明書のARN|
|ViewerCertificate.Certificate|AWS Certificate で管理しているSSL証明書のARN|

# 作る
```
cd ~/tmp/
aws cloudfront --profile CDNを作るAWSプロファイル create-distribution --cli-input-json file://./cloudfront_a.json
```

下記のようなエラーが出た時は、各要素の「Quantity」で指定している要素数が合っているのか確認する。
設定を増やしたり減らしたりして、配列の中身の個数が変化している場合は変える必要がある。

```
An error occurred (InconsistentQuantities) when calling the CreateDistribution operation: The specified quantity of Origins (3) does not match the actual quantity supplied (1).
```
MediaLiveでアラートをCloudWatch->SNS->メール経由で受け取る

[ここ](https://docs.aws.amazon.com/medialive/latest/ug/option-1.html)の内容をやってみた。

* SNSのページ( https://ap-northeast-1.console.aws.amazon.com/sns/ )を開く

* [ トピック ]->[ 新しいトピックの作成 ]->トピック名の入力、私は[ MediaLive ]、表示名[ MediaLive ]と入れてみた

* 作成したトピックのAR をコピペ
 arn:aws:sns:ap-northeast-1:474625601018:MediaLive

* ( 同じSN 内の左側メニュー )[ サブスクリプション ]->[ サブスクリプションの作成 ]
 * [ トピックARN ]に先程作成したMediaLiveのトピックのAR を入力
 * プロトコル メール ほかにもlambdaとかからSlackに送信できたりする)
 * エンドポイント : 自分のメールアドレス

* cloudwatchのページ( https://ap-northeast-1.console.aws.amazon.com/cloudwatch/ )に移動
 * [ イベント ]->[ ルールの作成 ]
  * [ イベントパターン ]になってること
  * [ カスタムイベントパターン ]に変更

カスタムイベントパターンの内容としては下記を入力

```
{
  "source": [
    "aws.medialive"
  ]
}
```

* 右側の[ ターゲットの追加 ]->[ SNSトピック ]に変更->[ トピック ]はプルダウンメニューから先程、作成したSNSのトピックを選択

* [ 設定の詳細 ]
 * ルールの定義
  * 名前: 任意
  * 説明: 任意

* [ ルールの作成 ]

* メールボックスを確認(はじめてのアラートメール設定の場合、AW から確認のメールが飛ぶ)

 * [ AWS Notification - Subscription Confirmation ]という件名のメールがあったらメール本文内のリンクをクリック
webpack-cli を webpack-command に変えた


コマンドラインで webpack を操作する [webpack-cli](https://www.npmjs.com/package/webpack-cli) を [webpack-command](https://www.npmjs.com/package/webpack-command#differences-with-webpack-cli) に変えた。

[Webpack公式のチュートリアル](https://webpack.js.org/api/cli/)で webpack-cli と併記で紹介されおり、軽いのが特徴。
webpack-cli が持つ機能は[端折られている](https://www.npmjs.com/package/webpack-command#differences-with-webpack-cli)。

webpack-cli をアンインストールし、
`npm uninstall --save-dev webpack-cli` 

webpack-command をインストール。
`npm i --save-dev webpack-command` 

脆弱性の自動修正（完全ではない）
`npm audit fix`


見た目は[ちょっと変わる](https://www.npmjs.com/package/webpack-stylish)が、
自分の使い方では使い勝手は変わらない。
webpack が v4 になって十分速いので、早くなった感は特にない。
【自分用メモ】マークダウン記法テンプレ

## Markdown記法のテンプレート

```
# 見出し1

## 見出し2

↓区切り線  
*****

## セクション
1. [セクション1](#link)
2. [セクション1](#link)
3. [セクション1](#link)

## テーブル
|col1  |col2  |col3  |
|---   |---   |---   |
|1     |2     |3     |
|4     |5     |6     |

##リンク
[Qiita](http://qiita.com/)

```

## 表示結果

# 見出し1

## 見出し2

↓区切り線  
*****

## セクション
1. [セクション1](#link)
2. [セクション1](#link)
3. [セクション1](#link)

## テーブル
|col1  |col2  |col3  |
|---   |---   |---   |
|1     |2     |3     |
|4     |5     |6     |

##リンク
[Qiita](http://qiita.com/)
shellとか分からんけどMacのターミナルを10分でかっこ良くする

# 内容
プログラミングするならカッコいいターミナルがいいですよね．
でも， ターミナルの弄り方とかよく分からない......
そんな私みたい人のために書きました(私用のメモ書きでもあります)．

大体10分くらいでこんな感じにします．
![スクリーンショット 2018-06-09 5.50.07.png](https://qiita-image-store.s3.amazonaws.com/0/214706/91543489-26ce-d663-89e7-956aa878e16a.png)


# 対象
- shell scriptに拘りがあまりない
- よく分からないけどターミナルをかっこ良くしたい

bashやzshでバリバリやっている人はバリバリやっていてください．

# やること
1．fishを入れる(2分)
2．fishermanを入れる（2分)
3．power-lineフォントを入れる(2分)
4．テーマを入れる(2分)

残りの2分はこの文章を読んでいる時間です．

fish及びfishermanについては
[Qiita - 初心者がShellを知りFish〜Fishermanを導入するまで](https://qiita.com/nutsinshell/items/5f111184b50f7081c92f)
を読めばなんとなく分かると思います．

## fishを入れる
```
$ brew install fish　  #fishのインストール
$ which fish  #fishのパスの表示
/usr/local/bin/fish  #これがパス
$ echo "/usr/local/bin/fish" >> /etc/shells　　#fishのパスを追加(間違えて">"にしない)
$ chsh -s /usr/local/bin/fish  #デフォルトのシェルをfishに変更
```
参考:[Qiita - macでfishをインストールする](https://qiita.com/m_snow/items/c5e1d118b4d584fa4ae7)
参考先ではoh-my-fishというプラグイン管理のやつ(何ていうんだ)を導入していますが， 後述のプラグイン管理にはfishermanを用いるので入れない方がいいと思います．多分．

## fishermanを入れる
プラグイン管理なんとかであるfishermanを入れる．


```
curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```
セキュリティが気になる人は中身を見て実行
参考：[GitHub - fisherman/fisherman](https://github.com/fisherman/fisherman)

## power-lineフォントを入れる
後述のテーマでいい感じにしてくれるフォントを入れる．

コードは[[Qiita - Powerlineは難しくないよ！](https://qiita.com/park-jh/items/557a9d5b470947aef2f5)]より引用

```
# clone
$ git clone https://github.com/powerline/fonts.git --depth=1

# install
$ cd fonts
$./install.sh

# clean-up a bit
$ cd ..
$ rm -rf fonts
```

## テーマを入れる
#### fishmanを使ってテーマを入れる．
次のコードで最初に載せた画像のテーマをインストールします.

```
$ fisher install omf/theme-bobthefish 
```

他のテーマが見たいという人はこちら
[GitHub - oh-my-fish/docs/Themes.md](https://github.com/oh-my-fish/oh-my-fish/blob/master/docs/Themes.md)

#### ターミナルのフォントの設定
ターミナルを開き左上のターミナル>環境設定>プロファイル>変更（英語にしてる人はよしなにしてください）
![スクリーンショット 2018-06-09 5.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/214706/b8729e5d-b487-a7ff-4bdf-1bdf53522684.png)

フォントを[なんとか for Powerline]に変更します．

僕が使用しているフォントMonacoは先ほどの手順では追加されていなかったので
[[GitHub Gist - kevinis/Monaco for Powerline.md]
(https://gist.github.com/kevinis/c788f85a654b2d7581d8)]からダウンロードしました．

これでおそらく最初に載せた画像と同じようなターミナルができているはず......
Rubyで配列を番号と一緒に展開したい時はeach.with_indexが便利

## 前提
```ruby
items = ['Apple', 'Pen', 'Pineapple']
```

といった配列があったとき

```
1 番は Apple
2 番は Pen
3 番は Pineapple
```

と表示させたい！どうしよう・・・
## やり方

### ①変数を定義しeachで配列を展開しながら最後にインクリメントする

```ruby
i = 1
items.each do |item|
  puts "#{i} 番は #{item}"
  i += 1
end
```
JSだとmapと一緒に展開できるのにな〜と思いながらこう書いてました

### ②変数と一緒に配列をeach_with_indexで展開する
```ruby
items.each_with_index do |item, i|
  puts "#{i+1} 番は #{item}"
end
```
しかし、こんなものがあると知った！
でも、最初のiは0なので0番目からになってしまう・・
+1する必要がある・・

### ③変数と一緒に配列をeach.with_indexで展開する

```ruby
items.each.with_index(1) do |item, i|
  puts "#{i} 番は #{item}"
end
```
でも`each.with_index`をつかって1を渡してあげれば`i+1`とかかずにスッキリ書けました
便利！！これから使おうっと

## 感想
最近Rubyを触る機会が多いのですがめちゃくちゃ便利なメソッドがある、そして数が多い・・・
力技で解決せずに冗長だなと思ったら探して良い書き方を模索してノウハウを蓄積していきたいです！
AWSを無料枠で利用するためのメモ

#AWS EC2 インスタンスはリージョンごとに作成されるので注意

無料の枠でawsのcloud9を使って経験を積もうと思っているが、cloud9を使うためにはEC2というサービス内で、インスタンスを作らないとcloud9を使用できない設計になっている。

このとき、インスタンスを作るリージョンとして、東京、オハイオ、シンガポールなどが選択できるが、現段階では東京を選択するとcloud9が使用できない。そのため、デフォルトのオハイオかシンガポールあたりを選ぶことになる。

このとき、実験のために、インスタンスを作成と削除を繰り返したり、キーペアを設定してみたり実験する人が多いと思うが、インスタンスはリージョンごとに作られており、リージョンごとに別のページに表示されているので、後日請求のページを見ると無料枠の使用料にどんどん迫ってくるという状況になる。（インスタンスが実行されたままになっていて無駄になっているが、リージョンがページ別に表示されているので気が付かない）

そのため、無料枠でAWSを無料枠で利用したい場合は、リージョンごとのページを見て、利用していないEC2のインスタンスを停止か削除たほうが良いと思う。

結論、請求のページを見る癖をつけるようにしたい。
AtCoder Beginner Contest 090 解説備忘録

#前書き
AtCoder Beginner Contest 090 を解いてみた．解けなかった問題の備忘録．

#D問題
[[問題はこちら]](https://beta.atcoder.jp/contests/abc090/tasks/arc091_b)

・aについて固定するかbについて固定するか迷う所だが，**bを固定したときのあまりa%bは，1,2,3,...,b-1,0を繰り返す**という規則性があるため，bを固定して考える．

・bを固定して考えたとき，"1,2,3,...,b-1,0"のうちK以上のものを数えたいのだが，無論その時b-1とKの大小関係を考える必要がある．

・"1,2,3,...,b-1,0"はN/bセットある．最後のセットは"1,2,...,N%b"という並びである．

・`cnt += max(0,n%b-k+1);`は，k=0とk=1では違う結果が反映されるが，実際はk=0とk=1は同じ結果になるため，そこの場合分けが必要．

以下ACのコード：

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>
#include <stack>
#include <cstdlib>

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    int n,k;
    cin >> n >> k;
    
    ll cnt=0;
    
    FOR(b, 1, n+1){
            /*
             if(b-1<k){
             cnt += 0;
             }else{
             cnt += (n/b) * (b-k);
             }
             */
            
            cnt += max(0,b-k)*(n/b);
            cnt += max(0,n%b-k+1);
            if(k==0){
                cnt--;
            }
        }
    
    cout << cnt << endl;
    
    return 0;
}

```

#あとがき
**境界条件/初期条件 は必ず確認せよ!!!**
精進します．
複数のマテリアルテクスチャを結合して一つのファイルにする。

#ドキュメントの背景
gametextures.comでダウンロードしたテクスチャを一つのファイルに結合したかったので、とりあえずやったことを書く。
これを書いてる人はゲーム開発の経験も、画像処理ツールの開発経験もないので、間違ってたらご指摘お願いします。

#GIMPを使って結合する。
1. GIMPを起動する
2. 結合したいグレースケールのTGAファイルをすべてGIMPに読み込ませる。
3. メニューの「色」→「色要素」→「チャンネル合成」
4. 下記のダイアログが出る。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105192/4528c1e9-a5ed-e89c-c5ac-8f62c60d6e91.png)

5. 4チャンネル使いたい場合は、色モデルを「RGBA」に変更する。
6. 私の場合は、赤=Roughness、緑=Metalic、青=Ambient occlusion、アルファ=Height
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105192/7a3a4b2b-33f3-01ff-346e-17574500b5e3.png)

7. もし空のデータがないが、テクスチャ内にデータとして存在させたい場合は下記のように、対象のチャンネルをマスク値にして値を「0」とかの設定しておきたい値にするとよいかも。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105192/87c28286-6160-60d7-43f7-c6ee6d72fbd2.png)

8. 「OK」をクリックしてダイアログを閉じると、結合された画像がGIMPのウィンドウに表示される。
9. メニューの「ファイル」→「名前を付けてエクスポート」を選択する。
10. 名前の欄にファイル名に、「_r_m_ao_h」とかつけておくとわかりやすい。エクスポートを押す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105192/06cfb912-e206-fd7e-7a03-b3a151925061.png)

11. こんな画面が出るがよく分からないので、今度調べる。RLE圧縮ってなんだろうね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105192/fd4896d5-9054-7c36-e2dc-3973d6a050a9.png)
追記：RLE圧縮は、こんなのらしい。データは劣化しなさそうですね。
https://ja.wikipedia.org/wiki/%E9%80%A3%E9%95%B7%E5%9C%A7%E7%B8%AE

##コマンドラインで結合する。
調査中
ImageMagikを使えばできるんですかね？？
グーグルキープのメモをエバーノートへ移動させる方法

#グーグルキープのメモをエバーノートへ
思いついたことをさっと書くのはグーグルキープが向いている。グーグルのアプリをいろいろ使いたいためにアンドロイドAsusuにしたくらいだから、ちゃんと使いこなしたいと思っている。
エバーノートはノートとして最高なのでよーひかくぞって感じでうまくいくよね。
たまにばぐが起きて同じ内容のノートが複数になってしまう問題は解決したいよね。

##方法
単純にメモを長おしして送信とおせば、
エバーノートっておせば自動的にエバーノートが開き、本文にコピーされるのですぐに使える。
##今後の課題
【A Tour of Go】Methods and interfaces/Exercise: rot13Reader (23/26)

A Tour of Go の Exercise を実施したときのメモ。

* rot13 のルールどおり素直にコーディング
* アルファベット以外は変換しないので、別のバッファ(`cc`)を用意して詰め直すのは非効率かも

```exercise-rot-reader.go
package main

import (
	"io"
	"os"
	"strings"
)

type rot13Reader struct {
	r io.Reader
}

func (r *rot13Reader) Read(b []byte) (int, error) {
	cc := make([]byte, len(b))
	n, err := r.r.Read(cc)
	for i := 0; i < n; i++ {
		c := cc[i]
		switch {
		case 'A' <= c && c <= 'M':
			c += 13
		case 'a' <= c && c <= 'm':
			c += 13
		case 'N' <= c && c <= 'Z':
			c -= 13
		case 'n' <= c && c <= 'z':
			c -= 13
		default:
		}
		b[i] = c
	}

	return n, err
}

func main() {
	s := strings.NewReader("Lbh penpxrq gur pbqr!")
	r := rot13Reader{s}
	io.Copy(os.Stdout, &r)
}
```

* 最初は以下のように実装していた。
* だが、これでは Read の引数 `b []byte` のサイズを越えて代入してしまうのでNG
* それに、1バイトずつ読むのは非効率かな

```exercise-rot-reader.go
func (r *rot13Reader) Read(b []byte) (int, error) {
	cc := make([]byte, 1)
	i := 0
	var err error = nil
	for {
		_, err = r.r.Read(cc)
		if err == io.EOF {
			break
		}
		c := cc[0]
		switch {
		case 'A' <= c && c <= 'M':
			c += 13
		case 'a' <= c && c <= 'm':
			c += 13
		case 'N' <= c && c <= 'Z':
			c -= 13
		case 'n' <= c && c <= 'z':
			c -= 13
		default:
		}
		b[i] = c
		i++
	}
	
	return i, err
}
```
Qiita初投稿時のエラー

# 画像投稿時に!\[error]() が出る
 Qiitaの記事を一つも投稿していない状態だと、アップできる画像のサイズが2MBまでに制限されるようです。記事を一つでも投稿すると100MBまで解放されます。

# 記事を投稿しようとすると「投稿頻度が高過ぎます」と言われる
　直前の記事を投稿してから30分ほどは、記事を投稿＆編集ができなくなるようです。
 [追記 2019/3/10]
　今は普通に投稿できるみたい？ 少なくとも私の環境では普通にできる...
CIDRとアドレスクラス

# CIDR（サイダー）表記とは
ipアドレスの後ろにスラッシュとどのネットワーク化を示す情報の長さ（サブネットマスクの中にある1の個数）を書く記法

```:例
198.51.100.xxx/24
```

CIDRはアドレスクラスの概念を用いないでipアドレスの割当てや経路の選択などを可能にする仕組み

# アドレスクラスとは
全てのipアドレスをクラスA~Eに分類する考え方
IPアドレスを２進数表記にした際の最初の部分でクラスAからEに分類する。

```:IPv4のIPアドレス（10進数）
0.0.0.0 ~ 255.255.255.255
```
これを２進数に変換すると

```:IPv4のIPアドレス（2進数）
00000000.00000000.00000000.00000000 ~ 11111111.11111111.11111111.11111111.
```
このIPアドレスを２進数変換した数値の左端の値により以下に分類する。

| クラス | アドレス |
|:-: |:-:|
| A  | 0xxxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  |
| B  | 10xxxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  |
| C  | 110xxxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  |
| D  | 1110xxxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  |
| E  | 11111xxx.xxxxxxxx.xxxxxxxx.xxxxxxxx  |

例
クラスAに該当するIPアドレスは__2進数表記で0から始まるIPアドレス__となる。



```:クラスAのIPアドレス（2進数）
00000000.00000000.00000000.00000000. ~ 01111111.11111111.11111111.11111111
```

```:クラスAのIPアドレス（10進数）
0.0.0.0 ~ 127.255.255.255
```

# なぜアドレスクラスが使われなくなった？
クラスという概念はネットワークアドレスとホストアドレスを8ビット単位で分けるので不必要なアドレスを確保してしまうことがあった。

例
クラスAの場合、先頭の0がクラスAを表す値となり、そのあと7ビットがネットワークアドレスとなり、残り24ビットがホストアドレスとなる。

クラスBの場合、先頭の10がクラスBを表す値となり、そのあと14ビットがネットワークアドレスとなり、残り16ビットがホストアドレスとなる。

そのため、クラスBでは必要なアドレスが足りない場合、クラスAのアドレスを使用することになるが
クラスBよりも256倍ものアドレスを確保してしまうことになる。

そこでCIDRが考え出されることになった。

```:例
198.51.100.xxx/24←この24がどこまでのビットがネットワークアドレスかを指定している。
```

これにより、ネットワークとホストの個数がアドレスクラスという概念よりより柔軟になった。
Google Cloud Text-to-Speech でドラクエのセリフを喋らせて、mp3にしてGCPにアップロードするまで

3月27日に発表された「Cloud Text-to-Speech」を使って音声合成をしてみたのでメモ.
https://japan.zdnet.com/article/35116787/

```
　Googleは米国時間3月27日「Google Cloud Platform」（GCP）上で動作する、テキストの音声合成サービス「Cloud Text-to-Speech」について発表した。このサービスは、傘下のDeepMindが生の音声を分析するために開発したモデルを利用している。
```

# クイックスタート

https://cloud.google.com/text-to-speech/docs/quickstart
これの通り進める。
まずGCPにログインし、text-to-speechの課金を有効にする。
（アカウントを持っていない人はこの時つくる。）

fieldsの入力欄の右にある「Use fields editor」というリンクをクリックすると、ポップアップが出るので、"audioContent"にチェックを入れて閉じる。

Request bodyは、ドキュメントをみると
voice、input、audioConfigの3つは必要っぽい。
カッコの中をクリックすると、入力補助が出てくるので、それを頼りに入力してく。


<img src="https://qiita-image-store.s3.amazonaws.com/0/173392/7ba8c19d-c346-bdc3-edf8-5c39886c7544.png" border=5>

手探りで以下のように入力。

```
{
 "voice": {
  "languageCode": "ja"
 },
 "input": {
  "text": "勇者しとっぷよ、よくぞ無事で戻ってきた。しとっぷが次のレベルになるには、あと300ポイントの経験が必要じゃ。つらい旅だろうが挫けぬようにな。"
 },
 "audioConfig": {
  "audioEncoding": "mp3"
 }
}
```

![スクリーンショット 2018-05-25 1.56.31.png](https://qiita-image-store.s3.amazonaws.com/0/173392/7c6caff3-f632-63fd-d771-292ade0a7b81.png)

Executeをクリックすると、画面の下のほうに結果が表示され、
Responseの欄に生成されたボイスがBase64フォーマットでだらーーーと表示される。


![スクリーンショット 2018-05-25 2.01.46.png](https://qiita-image-store.s3.amazonaws.com/0/173392/86a693f6-93db-176a-24ac-beda54c92668.png)

```
{
"audioContent":"〜ここの中にbase64変換されたボイスが入っている〜"
}
``` 

base64変換されたボイスだけをコピーして、メモツールにペーストしてファイルとして保存する。
上の例だと、
"〜ここの中にbase64変換されたボイスが入っている〜"のところの""の中。

![undefined]()


コマンドラインツールでエンコーディングする
参考）https://cloud.google.com/text-to-speech/docs/base64-decoding
```
 base64 voice.64.txt -D > dest_audio_file.mp3
```

ファイルをダブルクリックして、iTunesなどでセリフがちゃんと音声化されてることを確認する。

↓
GCPのクラウドストレージにアップする
「一般公開で共有する	」にチェックを入れる

クラウドストレージで発行されたURLを、「新規シークレットウィンドウ」で開いてみて、ちゃんと再生されればOK！
linux のdisc容量調査

サーバーの容量が増えてきてアラートが監視から届くようになってきたのでメモ


特定のディレクトリ直下の各フォルダのサイズ(以下はカレントディレクトリでの例)
`sudo du -sh ./*`

例えば/var直下の各フォルダのサイズをしりたいならこんな感じ
`sudo du -sh /var/*`
↓
実行結果
```6.0M    /var/backups
333M    /var/cache
4.0K    /var/crash
3.9G    /var/lib
4.0K    /var/local
0       /var/lock
6.2M    /var/log
4.0K    /var/mail
4.0K    /var/metrics
4.0K    /var/opt
0       /var/run
4.0K    /var/snap
52K     /var/spool
204K    /var/tmp
20K     /var/www
```
Spring Tool Suite(STS)のインストール＆日本語化＆Gradleプラグイン追加の手順

# ◇目的
Springアプリケーションを開発するための統合開発環境として
「Spring Tool Suite(STS)」をインストールする手順を説明します。
必要に応じて、日本語化とGradleプラグインを追加する手順もご利用ください。

# ◇前提
- インストール先：Windows7 64bit環境
- STSのバージョン：「3.9.4.RELEASE」

# ◇概要
1. 「Spring Tool Suite(STS)」をダウンロード
2. 「Spring Tool Suite(STS)」をインストール
3. 【任意】「Spring Tool Suite(STS)」を日本語化
4. 【任意】「Gradleプラグイン」を追加

# ◇手順
## 1. 「Spring Tool Suite(STS)」をダウンロード
以下の公式サイトからWindows用のzipファイルをダウンロード。
https://spring.io/tools/sts/all
![FireShot Capture 1 - Download STS - https___spring.io_tools_sts_all.png](https://qiita-image-store.s3.amazonaws.com/0/263069/e03d42e2-d3eb-db5c-e06c-bd11e4bacf6a.png)

## 2. 「Spring Tool Suite(STS)」をインストール
ダウンロードしたzipファイルを任意の場所に解凍。
本体は「sts-bundle\sts-3.9.4.RELEASE\STS.exe」ですな。
起動できたら完了です。

## 3.【任意】「Spring Tool Suite(STS)」を日本語化
セットアップツールがあるので簡単に日本語化できます。便利な世の中になったものだ。

(1) 以下のサイトから日本語化プラグインをダウンロード＆任意の場所に解凍。
http://mergedoc.osdn.jp/
![日本語化.png](https://qiita-image-store.s3.amazonaws.com/0/263069/a719aa66-b6e7-b323-017e-9d57351f8048.png)

(2) 「setup.exe」を実行してセットアップツールを起動。
(3) 「日本語化するアプリケーション」に「STS.exe」を選択→「日本語化する」→「終了」
<img src="https://qiita-image-store.s3.amazonaws.com/0/263069/0564180b-1cc8-9fde-4a26-2619a0db4313.png" width="75%">

## 4.【任意】「Gradleプラグイン」を追加
「Spring Tool Suite(STS)」でGradleを使用したい場合、
Eclipse MarketplaceからGradleプラグインを追加するだけです。簡単。

(1) 「Spring Tool Suite(STS)」を起動。
(2) 「ヘルプ」→「Eclipseマーケットプレース」でEclipse Marketplaceを表示。
(3) 「Buildship」で検索。
(4) 「Buildship Gradle Integration」の「インストール」→「完了」までポチポチ。

以上。
I start to study about Deeplearning

Until now, I wrote some articles using Japanese language.
But I am very interested in working abroad as I want to work with different people from other countries and share our experiences.

It is the reason why I decided to write articles using English.

Anyway, I am studying DeepLearning by using Kaggle.
Kaggle has many dataset and workspace (if you don't have environment to handle a big amount of data, you can do it on browser)

I am leaning about Pandas library, which is a tool for exploring manipulating datas, and Sklearn library.
But I don't understand what is the fit function of Sklearn library.

I want to learn Sklearn library in detail.
ubuntuで.heicファイルを扱う

突然 .heic ファイルを扱う必要が出てきたので、調査したメモ。

- [High Efficiency Image File Format - Wikipedia](https://ja.wikipedia.org/wiki/High_Efficiency_Image_File_Format)

tifigというコンバータを発見。以下から、Linux用バイナリをダウンロード。

- [Releases · monostream/tifig](https://github.com/monostream/tifig/releases)

ダウンロードした tar.gz ファイルを適当なところに展開。
(以下、`~/bin` に展開したものとする)

heicファイルをとりあえず見たい場合は、画像ビューアにパイプで渡す。
fehがよさ気だったので、インストール。
(ImageMagickのdisplayでも表示可能だが、気軽に全画面表示とか出来なさそうだった)

```
$ sudo apt-get install feh
```

あとはパイプで繋げれば画像表示される。

```
$ ~/bin/tifig hoge.heic | feh -F -
```

変換したい場合は、変換ファイル名を指定する。EXIFデータも保持される。

```
$ ~/bin/tifig hoge.heic hoge.jpg
```

複数ファイルを変換したい場合はこんな感じで。

```
$ find -iname "*.heic" -exec basename {} .heic \; | xargs -I {} ~/bin/tifig {}.heic {}.jpg
```

なお、ImageMagickも最新版は.heicに対応しているが、Ubuntu 16.04 LTSにはまだ最新版来ていないので、今回は見送り。

- [Support for HEIF · Issue #507 · ImageMagick/ImageMagick](https://github.com/ImageMagick/ImageMagick/issues/507)
NEMを扱う取引所がマルチシグに対応しているかを調べる

自分の資産を取引所に預ける時は、やはりセキュリティのしっかりした取引所に預けたいですよね。今回は取引所が所有するアカウントがマルチシグに対応しているかを調べる方法をお伝えします。


まず、送金などを希望してどのアカウントに送金すればいいのかを調べてください。
Zaifの場合だと
”NAGJG3QFWYZ37LMI7IQPSGQNYADGSJZGJRD2DIYA”
にメッセージをつけて送金するように、との指示がでます。

ここで、NISに対してアカウント情報を取得してみます。

http://alice2.nem.ninja:7890/account/get?address=NAGJG3QFWYZ37LMI7IQPSGQNYADGSJZGJRD2DIYA

とくにノードを立てたり同期する必要はありません。
ブラウザのURLに入力するだけです。

すると以下のような情報が返ってきます。


```json:account/get
{
"meta":
  {
    "cosignatories":
    [
      {"address":"NBEM6SFOHU5PORIGAVG3NNJIMCG73R2TWEEIDAZ5","harvestedBlocks":0,"balance":9786650000,"importance":0.0,"vestedBalance":9786649936,"publicKey":"ae6754c70b7e3ba0c51617c8f9efd462d0bf680d45e09c3444e817643d277826","label":null,"multisigInfo":{}},
      {"address":"NCTWKWGD564GIQQCZ5X5TC4YM46VXWLT3QWD5NLZ","harvestedBlocks":0,"balance":3903000000,"importance":0.0,"vestedBalance":3902998008,"publicKey":"aa455d831430872feb0c6ae14265209182546c985a321c501be7fdc96ed04757","label":null,"multisigInfo":{}},
      {"address":"ND3D6TXJYZGQUJ7T2OFYOUF4ACBRFZGSAJ7ZNHOH","harvestedBlocks":0,"balance":588547000,"importance":0.0,"vestedBalance":588547000,"publicKey":"eef56715bf3e7fe2d3010765382a132117dadefffe9673fd44828c8b1dc7894c","label":null,"multisigInfo":{}}
    ],
    "cosignatoryOf":[],
    "status":"LOCKED",
    "remoteStatus":"INACTIVE"
  },
"account":
  {
    "address":"NAGJG3QFWYZ37LMI7IQPSGQNYADGSJZGJRD2DIYA",
    "harvestedBlocks":0,
    "balance":605607970370772,
    "importance":0.06425197571703284,
    "vestedBalance":586894505482324,
    "publicKey":"fbae41931de6a0cc25153781321f3de0806c7ba9a191474bb9a838118c8de4d3",
    "label":null,
    "multisigInfo":{
      "cosignatoriesCount":3,
      "minCosignatories":2
    }
  }
}
```

注目するのはmetaブロックのcosignatoriesです。
ここに複数のアカウントが登録されていると署名が必要なマルチシグアカウントと判断することができます。しかし、これで安心してはいけません。accountブロックのmultisigInfoにてminCosignatoriesの数字が1だったりすると、一つの秘密鍵で出金できてしまいます。2以上であることを確認しましょう。
railsでPVを計測するのにimpressions gemを辞めた理由

impressions gemを使うと、
1アクセス毎に1レコード出来てしまうので、
herokuの無料枠である1万レコードを一瞬で使い果たしてしまいそうだったから。

topicのPVを計測したいんだけど、
レコード数は増やしたくない時、
PVカラムを追加してshowアクションが呼ばれる度に1足す感じが良いのかなぁ。
JavaScriptで素数を扱う

備忘録。
素数列挙と素数判定は[こちら](https://qiita.com/neko_the_shadow/items/4ebad619564a48f5a97f)を参考にしました。
もっと速いのがあればご教示ください。

### 素数列挙

```javascript
const getPrimes = n => {
  if (n < 2) return [];
  const primes = range(n);
  primes[1] = 0;
  const limit = Math.sqrt(n);
  for (let prime of primes) {
    if (prime > limit) break;
    if (prime === 0) continue;
    for (let non_prime of range(2*prime, n, prime)) primes[non_prime] = 0;
  }
  return primes.filter(p => p !== 0);
};
```

※`range`関数は[こちら](https://qiita.com/knagisa/items/b4980ec278213849f524)を参考に。
エラトステネスのふるいというアルゴリズムを使います。これは小中学校の算数数学の教科書にも載っていた記憶があります。

### 素数判定

```javascript
const isPrime = n => {
  if (n < 2) return false;
  if (n === 2 || n === 3 || n === 5) return true;
  if (n % 2 === 0 || n % 3 === 0 || n % 5 === 0) return false;
  let prime = 7;
  let step = 4;
  const limit = Math.sqrt(n);
  while (prime <= limit) {
    if (n % prime === 0) return false;
    prime += step;
    step = 6 - step;
  }
  return true;
};
```

5以上の素数は6で割った余りが±1という性質があるので、これを使って割る回数を減らしています。

### 素因数分解

```javascript
const getPrimeFactors = n => {
  if (n < 2) return [];
  if (n === 2 || n === 3 || n === 5) return [n];
  if (n % 2 === 0) return [2, ...getPrimeFactors(n/2)];
  if (n % 3 === 0) return [3, ...getPrimeFactors(n/3)];
  if (n % 5 === 0) return [5, ...getPrimeFactors(n/5)];
  let prime = 7;
  let step = 4;
  const limit = Math.sqrt(n);
  while (prime <= limit) {
    if (n % prime === 0) return [prime, ...getPrimeFactors(n/prime)];
    prime += step;
    step = 6 - step;
  }
  return [n];
};
```

スプレッド演算子は便利！みんなも使おう！！
Hyperターミナルの設定ファイルをWindows/Macで共通化してGit管理する

オープンソース・クロスプラットフォームのターミナルエミュレータ[Hyper](https://hyper.is/)がバージョンアップにより日本語に対応してたので、使ってみようと思いました。
参考: [Hyperでイケてるターミナルをつかおう \- Qiita](https://qiita.com/vimyum/items/44478a51ef3a6f49804f)

使うにあたり、クロスプラットフォームという利点を最大に活かすためには**設定ファイルのプラットフォーム間でのGit管理**が必要ですので、しました。

## 環境
- hyper 2.0.0 stable
- Windows 10 Pro 17133.1 (April 2018 Update)
- macOS High Sierra 10.13.4

## WindowsとMacの設定を共通化する
※単一のプラットフォームでしか使わない場合は読み飛ばしてください。

hyperの設定ファイル`.hyper.js`自体はプラットフォーム毎で共通形式となっています。同一のファイルを使うことで、フォントやテーマなどをWindowsとMacとで共通化して使うことができます。

デフォルトの設定ファイルはこんな感じ: https://github.com/zeit/hyper/blob/canary/app/config/config-default.js

ですが`config.showHamburgerMenu`のように「WindowsとLinuxでは有効だが、Macでは無視される」といった、プラットフォーム間で挙動の異なる設定値がいくつか存在します。
特にターミナルの肝である**起動シェルを指定する`config.shell`**については、Windowsの場合はコマンドプロンプトか、PowerShellか、Windows Subsystem for Linux(Bash on Windows)なのかを明記しなければなりません。つまり、Linux/Macと設定を共通化することができません。

そこで、`.hyper.js`を読み込んでWindows用とMac用とのファイルを書き出すスクリプトを作成してみました。無駄にTypeScript+Webpackです。

### プラットフォーム別の設定ファイルを書き出すTypeScript
https://github.com/s2terminal/hyper-usersetting

```typescript:index.ts
import * as fs from "fs";
import * as path from "path";
const PreferencesDirectory = "hyperjs_preferences";
enum Platforms {
  Windows = "windows.js",
  Mac = "other.js"
}

interface IHyperJS {
  // TODO
  config: {
    shell: string;
  };
}

function writeHyperJS(name: string, data: IHyperJS) {
  const filepath = path.join(process.cwd(), PreferencesDirectory, name);
  fs.writeFile(
    filepath,
    `module.exports = ${JSON.stringify(data, null, 2)};`,
    err => {
      if (err) {
        throw err;
      }
    }
  );
}

function generatePreference(hyper: IHyperJS, platform: Platforms): IHyperJS {
  if (platform === Platforms.Windows) {
    hyper.config.shell = "C:\\Windows\\System32\\bash.exe";
  } else {
    hyper.config.shell = "";
  }
  return hyper;
}

import * as hyperjs from "./.hyper.js";

// Bash on Windows
writeHyperJS(Platforms.Windows, generatePreference(hyperjs, Platforms.Windows));
// Others
writeHyperJS(Platforms.Mac, generatePreference(hyperjs, Platforms.Mac));

```
`.hyper.js`を読み込んで、`config.shell`の値だけをプラットフォームごとに書き換えた別々のファイルとして出力します。
使いたい設定やプラグインを盛り込んだ`.hyper.js`を作成し、特定の項目をプログラムで書き換えた設定ファイルを書き出して、これをプラットフォームごとに使い分けます。こうすることで、プラットフォーム間で共通の設定を利用することが出来ます。

`process.platform`で現在実行しているプラットフォームがWindowsかMacかを動的に判別しようかと思ったのですが、Windows Subsystem for Linux上で実行すると`Linux`となってしまうので諦めました。

## 設定ファイルを配置する
基本的な手順は下記のとおりです。

1. 設定ファイル`.hyper.js`をGit管理し、GitHub等にpushする
1. hyperターミナルを起動している場合は、終了しておく ※設定ファイルが自動で再生成されてしまうため
1. cloneしたGitリポジトリ内の設定ファイルに向けて、シンボリックリンクを貼る

### Windowsの例
PowerShellを管理者権限で開き、下記を実行します。

```powershell
PS > rm "C:\Users\$(Get-Content env:username)\.hyper.js"
PS > cmd /c mklink "C:\Users\$(Get-Content env:username)\.hyper.js" "(※Windows用の設定ファイルのありか)"
```

### Macの例
Terminalで下記を実行します。

```bash
$ rm "$HOME/.hyper.js"
$ ln -s "$(pwd)/hyperjs_preferences/other.js" "(※Mac用の設定ファイルのありか)"
```

## 関連

- https://github.com/s2terminal/hyper-usersetting
- [エディタの設定をWin/Mac間でGit管理する\(VSCode、Brackets\) \- Qiita](https://qiita.com/suzuki_sh/items/965b56bd5013ffac9779)