OmniAICreator/Qiita-1.07M huggingface dataset:
Docker for MacでdevicemapperにOverlayFSを使って手軽に速度アップ

# Appending to files

![68747470733a2f2f692e666c756666792e63632f68564a344a47315a673236446b386d665a4c6d524b4773324a4b326d6b3064442e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/7565/09bc5003-b3ef-8953-8f5f-dcf7eec4b76c.png)

このグラフによるとaufsをoverlay2にすると小さいファイルの追加にAUFSだと8秒かかり、overlay2だと2秒で完了している。単純に4倍くらいは効率がよさそう。

## Docker for Macの設定でoverlay2を有効にする。

<img width="500" alt="Daemon.png" src="https://qiita-image-store.s3.amazonaws.com/0/7565/79e5fc50-59ec-37f2-2361-bc8f08a790ba.png">

```json
{
  "debug" : true,
  "storage-driver" : "overlay2",
  "experimental" : true
}
```

設定したら `docker image rm --prune` などでイメージとコンテナを全て消去する。

## おまけ

Docker for Mac(17.12.0-ce-mac46 2018-01-09) からHigh Sierraだと仮想マシンのディスクフォーマットにrawが使われるようになった。これでスループットが、320MiB/secから600MiB/secと1.8倍くらい早くなる。

> For systems running APFS on SSD on High Sierra, use raw format VM disks by default. This improves disk throughput (from 320MiB/sec to 600MiB/sec in dd on a 2015 MacBook Pro) and disk space handling.
Existing disks are kept in qcow format, if you want to switch to raw format you need to “Remove all data” or “Reset to factory defaults”. See https://docs.docker.com/docker-for-mac/faqs/#disk-usage

アップデートしたら、Docker for macの設定画面の `reset` メニューから、`Reset to factory defaults` を実行すると有効になる。この時データは全て失われるので注意。

## 注意

これはvolumeでマウントしているディレクトリには効果がない。あくまでもDockerコンテナの中だけで効率がよくなる。

## 参照

* [docker-storage-benchmark](https://github.com/chriskuehl/docker-storage-benchmark)
* [Docker for Mac release notes::Docker Community Edition 17.12.0-ce-mac46 2018-01-09 (Stable)](https://docs.docker.com/docker-for-mac/release-notes/#docker-community-edition-17120-ce-mac47-2018-01-12-stable)
NotificationServiceExtensionをiOS9端末で動かす方法（要検証）

# 前提
XCode : Version 9.2 (9C40b)
iOS : 9.3.5

# やりたいこと
OneSignalのSDKを搭載しようとしています。

# 現象
表題にあるNotificationServiceExtensionを作成し、iOS9端末でデバッグしようとしたところ
端末にインストールする際に以下のエラーになりました。

```
App installation failed

This app contains an app extension that specifies an extension point identifier that is not supported 
on this version of iOS for the value of the NSExtensionPointIdentifier key in its Info.plist.
```

エラーメッセージをもとにググるとAppleのフォーラムがヒット
https://forums.developer.apple.com/thread/67797

「Deployment Targetを10に上げたら解決したよ」とあります。
ただ諸事情により古い端末でも動かしたいのです。

# 方法
**Extension側のDeployment Targetだけ10.0に上げる**
動作確認していますが、Pushのパーミッション取得、Push通知受信においては問題なく動いているようです。

以上です
bash > debug > echo + redirectionにおいてredirectionの文字列がbash -xで表示されない > Link: 対処方法 (kshを使う)

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.9を使用。
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
ksh version         sh (AT&T Research) 93u+ 2012-08-01
```

関連:[bash > readonly > manとサンプルコード | bash -x実行時の表示](https://qiita.com/7of9/items/0b0566f7e5feb50c34bb)

### codeとdebug実行

```debug_print_180119_exec
#!/usr/bin/env bash 

set -eu # for safety

readonly DST_FILE='info_180119.txt'

echo "hello" > $DST_FILE

DST_FILE='dummy_180119.txt'

echo "hello" > $DST_FILE
```

```bash:run
$ bash -x debug_print_180119_exec 
+ set -eu
+ readonly DST_FILE=info_180119.txt
+ DST_FILE=info_180119.txt
+ echo hello
+ DST_FILE=dummy_180119.txt
debug_print_180119_exec: line 9: DST_FILE: readonly variable
```

上記の気になった点として、`echo "hello" > $DST_FILE`の部分は`+ echo hello`にデバッグ出力される。
どのファイルに書き出ししたのか、標準出力なのか、がデバッグ出力から分からない。

### 対処方法

https://stackoverflow.com/questions/15366570/bash-set-x-echo-redirects-as-well-as-commands/17479035#17479035

色々書かれているが、
> answered Jul 4 '13 at 22:56
ack

による「You, ksh使っちゃいなよ」が気になった。
> EDIT: If Bash-specific features are not required, and backwards compatibility with the Bourne shell will do, the Korn shell (ksh, tested with version 93u+ 2012-08-01) does a bit better on showing information for redirects:

```txt:run
$ ksh -x debug_print_180119_exec 
+ set -eu
+ DST_FILE=info_180119.txt
+ readonly DST_FILE
+ echo hello
+ 1> info_180119.txt
debug_print_180119_exec: line 9: DST_FILE: is read only
```

`info_180119.txt`へ出力されている様子が分かるようになった。

~~kshはどれくらいbashの互換があるかはよくわからない。~~
bash特有の機能がある場合は使えないでしょう、とのこと。

https://stackoverflow.com/questions/19112031/difference-between-korn-and-bash-shell
sbtenv installでGPGのpublic keyがないと怒られたときの対処法

sbtenvでインストールしようとしたらgpg関連で怒られた。

```bash
$ sbtenv install sbt-1.0.3
gpg: Signature made Sat Jan  6 06:00:20 2018 JST
gpg:                using RSA key 99E82A75642AC823
gpg: Can't check signature: No public key
```

public keyをimportしたらいけた

```bash
$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv 99E82A75642AC823
```
[Virtualbox]NAT+ホストオンリーアダプターのUbuntu16.04のゲストOSがインターネットに繋がらなかった時の対応メモ

# はじめに
VirtualboxでUbuntu16.04（サーバ版）のゲストOSをNAT+ホストオンリーアダプタのいつもの組み合わせでインターネットに繋げようとしたら繋がらなかったので、そのときの対応をメモしておく。
プロキシ無しの環境下のため、プロキシは関係なし。

# 対応メモ
動かなかったときの設定内容が以下。

```:/etc/network/interface
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp

auto enp0s8
iface enp0s8 inet static
address 192.168.33.4
netmask 255.255.255.0
```

何やら見慣れぬ以下の行をコメントアウトしたらインターネットに繋がった。

```
#source /etc/network/interfaces.d/*
```

きっと、ディレクトリを使ったネットワークの設定もあるのだろうけど、とりあえずインターネットに繋がるようになったから、まぁいっかという適当なあっしを許してください。。。
python × seleniumでID/PASS入力必要な画面に自動ログインしてみた

# はじめに
python × seleniumでID/PASS入力必要な画面に自動ログインを試した際の自分的なメモとなります。

# 参考にさせて頂いた記事
http://blog2.tbshiki.com/entry/pythonstudy004#Selenium用のchromedriverを読み込ませる

# コード
```login.py
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
 
options = Options()
options.binary_location = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
 
driver = webdriver.Chrome(chrome_options=options)
driver.get('対象のURL')

# ID/PASSを入力
id = driver.find_element_by_id("ユーザID入力フィールドの要素")
id.send_keys("実際のID")
password = driver.find_element_by_id("パスワード入力フィールドの要素")
password.send_keys("実際のPASS")
 
time.sleep(1)
 
# ログインボタンをクリック
login_button = driver.find_element_by_name("ログインボタンの要素")
login_button.click()
 
# サイト内で他の画面に遷移させたければ
driver.get('画面遷移させたいURL')
```
How to restore crontab with git

### Reference

http://newapps.hatenablog.com/entry/2013/09/02/172801

### How to git add crontab

```shell-session

# cd /var/spool/cron

# git init
Initialized empty Git repository in /var/spool/cron/.git/

# git add *

# git commit -m "20180119"
[master (root-commit) 6d7b375] 20180119
 Committer: root <root@>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following command and follow the instructions in your editor to edit
your configuration file:

    git config --global --edit

After doing this, you may fix the identity used for this commit with:

    git commit --amend --reset-author

 2 files changed, 6 insertions(+)
 create mode 100644 
 create mode 100644 root
```

### How to restore

```
# git reset --hard HEAD
HEAD is now at 6d7b375 20180119
```
Firefoxの複数タブを閉じるときの確認メッセージを切る

↓これを出さないようにする方法
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/68ddd319-22f3-0b27-373e-43e2ee32ff4a.png)


１．アドレスバーにabout:config

２．検索欄にwarnoncloseothertabs

３．ダブルクリックして値をtrueからfalseにする
IBM Cloudライト・アカウント (Bluemix)でwebアプリをデプロイしてみた

#はじめに
IBM Cloudライト・アカウントでwebアプリをデプロイした際の自分的なメモとなります。

#アカウント登録
https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/

#主な特長（上記URLより転記 2017/11/22時点）
>IBM Cloudライト・アカウントではCloud Foundryの無償枠に加えて、IBM Cloud上の主要なサービスをライト･プランとしてご用意しています。ライト･プランを組み合わせると、先進的なサービスを手軽に利用して、最先端のアプリケーションを手軽に短時間で開発し、ご利用いただけます。

>256MBのCloud Foundryメモリ
主要サービスをライト・プランで継続使用可能
全カタログの閲覧可能
組織を1つ、地域を1つ
ライト・プラン毎にインスタンスは1つ

#制限事項（上記URLより転記 2017/11/22時点）
>10日間 開発なしでアプリを自動停止
30日間 活動なしでサービスの自動削除
「組織の作成」画面では、地域に「米国南部」を選択を行う必要があります。
過去にIBM Cloud 30日フリートライアルに登録したメールアドレスは、ライト・アカウントへの登録は行えません。別のメールアドレスにてご登録ください。

# Python入門チュートリアル
https://console.bluemix.net/docs/runtimes/python/getting-started.html#getting_started

# デプロイしたwebアプリケーション
https://yama-bluemix.mybluemix.net/
登録〜デプロイまで1時間もかからないでwebアプケーションができた！！！

# 試しに30日間放置してみたら
**404 Not Found: Requested route ('yama-bluemix.mybluemix.net') does not exist.**
そりゃそうだ・・・:money_mouth:
bash > readonly > manとサンプルコード | bash -x実行時の表示

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

[bash コーディングルール](https://qiita.com/mato-599/items/053ca6e00fb747147e1c)
2. カレントディレクトリの取得
においてreaedonlyの記載があった。

使ったことがなかったため、使ってみた。

### man

```
       readonly [-aApf] [name[=word] ...]
              The  given names are marked readonly; the values of these names may
              not be changed by subsequent assignment.  If the -f option is  sup-
              plied, the functions corresponding to the names are so marked.  The
              -a option restricts the variables to indexed arrays; the -A  option
              restricts  the  variables  to associative arrays.  If no name argu-
              ments are given, or if the -p option is supplied,  a  list  of  all
              readonly  names is printed.  The -p option causes output to be dis-
              played in a format that may be reused as input.  If a variable name
              is  followed  by  =word,  the value of the variable is set to word.
              The return status is 0 unless an invalid option is encountered, one
              of  the names is not a valid shell variable name, or -f is supplied
              with a name that is not a function.
```

### code 

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

set -eu # for safety

readonly DST_FILE='info_180119.txt'

echo "hello" > $DST_FILE

DST_FILE='dummy_180119.txt'

echo "hello" > $DST_FILE
```

```bash:run
$ bash -x readonly_180119_exec 
+ set -eu
+ readonly DST_FILE=info_180119.txt
+ DST_FILE=info_180119.txt
+ echo hello
+ DST_FILE=dummy_180119.txt
readonly_180119_exec: line 9: DST_FILE: readonly variable
```

```bash:run
$ ls
info_180119.txt  readonly_180119_exec
```

### 備考 1

`bash -x`実行で`echo "hello" > $DST_FILE`の部分は以下の表示になっている。

```
+ echo hello
```

- [bash > debug > echo + redirectionにおいてredirectionの文字列がbash -xで表示されない > Link: 対処方法 (kshを使う)](https://qiita.com/7of9/items/9242abe0b2f3f8fec683)

### 備考 2

> If no name argu-ments are given, or if the -p option is supplied,  a  list  of  all readonly  names is printed.

readonlyだけ実行すると以下のような表示をしてくれるとのこと。

```bash:run
+ readonly
declare -r BASHOPTS="cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath"
declare -ir BASHPID=""
declare -ar BASH_VERSINFO='([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -r DST_FILE="info_180119.txt"
...
```
IDE上でコードレビュー完結！Upsourceを使ってみる

## 当記事は
Upsourceというツールがあります。

気になる〜〜って思ったときに参加した [#phpconfuk](http://phpcon.fukuoka.jp/2017/)でサムライズムさんがブース出展していたので、デモを見せてもらいました。

便利そう・・・！

ってことでセットアップしたので、ご紹介です。

----
## Upsourceってなんですか
* JetBrainsのツールです
* _Code review, team collaboration project analytics_
* Githubみたいなやつ〜
* **10名までは無料で利用可能！！**
    * _Free 10-user plan included (8 users + admin + guest)._

----
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/a7b2baba-0827-ba16-cbba-10b151f9fd9a.png)


https://www.jetbrains.com/upsource

----
## コミットログ(ブランチツリー)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/b1da92e4-256b-45c9-6afc-a14fcd45d1d4.png)

----
## レビュー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/5571a632-622b-1f8d-8a3d-0d2e5e95a358.png)

----
## 他にも・・・
* コミット等のアクティビティ分析
* レビューのアクティビティ分析
* ソースコードの閲覧
* 権限管理([Hub](https://www.jetbrains.com/hub/))

など。


----
## どうやって使うんですか
* サーバーウェアです。  
  サーバーを立てて、起動してください｡ [^1]
* ブラウザなどからアクセスし、ログインしてください

[^1]: インストールについては触れていないですが、[作業メモ](http://daisuki.nichiyoubi.land/entry/2018/01/13/140745)を残しております

---- 
## 安心ポイント: Githubとの連携
全体的に、Githubのレポジトリを取り込みながら利用することが可能です。

* ソースコードの同期
* Github上のレビューコメント・PRの取り込み・同期
* Githubアカウントでのログイン

----
# ここからが本題

----
## 何が嬉しいの？
**JetBrainsのIDEとの連携機能！！** :tada:
 
* IDEへのReviewコメントの取り込み
* IDE上でdiffを確認しながらReviewコメント
* Reviewコメントから  
  シームレスにファイルのオープン
* Reviewコメントごとの  
  ステータス(Resolved/Unresolved)管理

----
## 何が嬉しいの？

やばいのは、
 **Reviewの確認がIDE上で完結する**
という体験だと思います！

-----
### つまり・・・？
* 普段のEditorで差分を見ながらコメントできる
    * コードジャンプ
    * typo, warning
* フィードバックコメントがIDE上に表示される
* コメントごとにステータス/ラベル管理ができるので、  
  GTD的な使い方も可能。

----
## Upsource Integration
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/919bcd83-b0d5-b410-defe-4d5652e051c0.png)
https://plugins.jetbrains.com/plugin/7431-upsource-integration

----
## diffを見ながらコードレビューをしてみる
----
![check-diff-and-review.gif](https://qiita-image-store.s3.amazonaws.com/0/941/75bd2f23-c931-7a6b-55f8-6ad56b63efa9.gif)

----
## Reviewコメントに対応する
----
![feedback.gif](https://qiita-image-store.s3.amazonaws.com/0/941/57ed3e62-acdd-cfc5-bd5b-6b863d9e7836.gif)

----
Upsource上の「レビューサマリー」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/e28b11bf-c7f8-fe07-6fd0-fd8b37c333be.png)

----
「Changed files」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/941/1b6f75e1-bf4e-2815-4284-55da821f18d0.png)

----
## githubへの反映

![update-to-github.gif](https://qiita-image-store.s3.amazonaws.com/0/941/90ee7549-db6c-c45c-64b6-e59a5de1ecf4.gif)

----
## ちょっと気になるところ・・
* Githubの[Review Comment](https://help.github.com/articles/reviewing-proposed-changes-in-a-pull-request/)が使えない
    * Single Commentとして?反映される
* 画像の貼り付けが(IDEのプラグイン上からは)できない
* 絵文字が化ける
* Github -> Upsourceへのコメントは結構タイムラグが有る
    * どっかの設定いじるべきかも。
    * 実用上は問題ないよ！

----
## まとめ
* すっごい便利！(だと思う
* まだあまり使いこなせていないので触っていきたい
* Githubでしか出来ないこともあるので、いい感じに併用したい
    * スライドタイトルの「完結」は半分煽り・・
@types/reactと@types/react-domを"resolutions"フィールドで固定する



TypeScriptでReactを扱ってるときに`ReactDOM.render`で意味が分からない型エラーが起きることがあります。

```
TS2605: JSX element type 'GithubPicker' is not a constructor function for JSX elements.
  Types of property 'render' are incompatible.
    Type '() => ReactNode' is not assignable to type '{ (): ReactNode; (): false | Element | null; }'.
      Type 'ReactNode' is not assignable to type 'false | Element | null'.
        Type 'undefined' is not assignable to type 'false | Element | null'.
```

- [[@types/react] "Types of property 'render' are incompatible" using intersection type with 15.0.28 · Issue #17161 · DefinitelyTyped/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped/issues/17161 "[@types/react] &#34;Types of property &#39;render&#39; are incompatible&#34; using intersection type with 15.0.28 · Issue #17161 · DefinitelyTyped/DefinitelyTyped")

この問題は`@types/react`と`@type/react-dom`のバージョンが混在している場合に発生します。
バージョンが混在しているかは、`npm ls`や`yarn list`を使うことで分かります。

```
✈ yarn list @types/react
yarn list v1.3.2
├─ @types/react-color@2.11.2
│  └─ @types/react@15.0.29
├─ @types/react-dom@16.0.3
│  └─ @types/react@15.0.29
└─ @types/react@16.0.34
```

Reactの場合、ライブラリ側の依存に`@types`が含まれていると混在しやすいためこの問題が起きやすいようです。(また型定義が15 -> 16あたりで変わっていたのも原因)

この問題はインストールする`@types/react`と`@type/react-dom`のバージョンが混在しなければ解決します。
(Flatなインストールをすれば良い)

yarnの場合は`"resolutions"`でバージョンを固定することで、`yarn install`時に自動的にバージョンを統一できます。

- [Selective dependency resolutions | Yarn](https://yarnpkg.com/lang/en/docs/selective-version-resolutions/ "Selective dependency resolutions | Yarn")

<del>npmはどうやるんだろ?</del><ins>npmも同様の機能提案が出ていたり、"resolutions"を擬似再現するツールがあります。 </ins>

- [Add Singleton Packages RFC. by usergenic · Pull Request #23 · npm/rfcs](https://github.com/npm/rfcs/pull/23)
- [rogeriochaves/npm-force-resolutions: Force npm to install a specific transitive dependency version](https://github.com/rogeriochaves/npm-force-resolutions)

`package.json`の`"resolutions"`にバージョンを指定することで固定できます。

```json
  "resolutions": {
    "@types/react": "16.0.34",
    "@types/react-dom": "16.0.3"
  },
```

この状態で`node_modules`を削除して`yarn install`し直すと、インストールされた`@types/react`が混在しなくなります。


```
yarn list @types/react
yarn list v1.3.2
└─ @types/react@16.0.34
✨  Done in 0.55s.
```


実際に固定した例:

- [refactor: Update to Almin 0.15 by azu · Pull Request #86 · azu/faao](https://github.com/azu/faao/pull/86 "refactor: Update to Almin 0.15 by azu · Pull Request #86 · azu/faao")


[@types](https://github.com/DefinitelyTyped/DefinitelyTyped "@types")は便利ですがsemverではない変更が入ってくることもあるため、何らかの方法で使うバージョンは固定した方が安全だと思います。
Stack Overflow > タイトル変更後のリンク > 到達可能 > 識別番号以下の文字列はリンクに関係しない

[Python > if lie is lie is lie: > is 演算子の書き換え(書換えできない) | 三重引用符 | operator chaining | link: Comparisons](https://qiita.com/7of9/items/574da7ae55e543b02679)
のコメント欄にStack Overflow(以下SO)へのリンクを張っていた。


SOの記事は「今後の検索性を考慮した上で自分が覚えていそうなキーワードを含めた」タイトルにしていた。
(`Understanding if lie is lie is lie`)。
https://stackoverflow.com/questions/48315777/understanding-if-lie-is-lie-is-lie

数十分後に他者によりそのタイトルの編集が入った。

コレジャナイロボ発進。

ただし、コメントに書いていた元のタイトルでのURLは有効になっている(記事投稿後、1日以内)。
元のURLは保持しておいて、転送する機能があるのだろうか。
いくつか試したところ、識別番号以下の文字列はリンクに関係しないことが分かった。

https://stackoverflow.com/questions/48315777/HelloWorld
https://stackoverflow.com/questions/48315777/ResistenceIsFutile
https://stackoverflow.com/questions/48315777/PhotonTopede!!!

将来的にSOが大規模システム変更を行ったとしても、`https://stackoverflow.com/questions/識別番号`のリンクを有効にしておけば、情報は長く生き続けることができるのだろう。

### 所感

記事のタイトルが変更されてURLが変更したとしても、元のリンクが有効であり続けるのは良いサービスだと思う。

ブックマークを保持する多くの人のことが考慮されている。

一般的なサービスでは以下のような対応をする。
「XXXサービスを新規立ち上げました。」「XXXサービスに移行してください。」（ここでブックマーク全滅）。
tmux > 上下ペインの入れ替え > C-b { または C-b C-o

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
tmux 2.1-3build1
```

tmuxで上下にペインを分割して使うことが多い。

キーの入力間違いで上下のペインが入れ替わることがあった。
元に戻すには。

https://superuser.com/questions/879190/how-does-one-swap-two-panes-in-tmux
> The swap-pane command can do this for you. The `{` and `}` keys are bound to `swap-pane -U` and `swap-pane -D` in the default configuration.

- C-b {
    - Ctrl+b後にShift+[
- C-b }
    - Ctrl+b後にShift+]
    
### 別のキー

同じリンク先に下記のキーも記載されていた。

- C-b C-o

おそらくこちらを間違って使ったのだろう。
(ペイン間の移動がC-b oで、C-b C-oを間違って実行した。)

### 関連

- [tmux > ペイン間の移動 > C-b 下矢印 | C-b 上矢印 | C-b 右矢印 | C-b 左矢印](https://qiita.com/7of9/items/c20e3908d77b2a70f909)

### 使用例

- ペインを３分割している
    - 上のペイン１つ
    - 下のペイン２つ (横分割)
    - 上のペインは横長の表示が必要な時に使用
    - 下のペインは補助的な使用

上記の場合、上のペインを作業のメインとし、適宜C-b C-oによりメインのペインをローテーションして使うと作業がしやすそうだ。
素数の話

「ABC予想入門」という本の「2.8 素因数分解の一意性」に基づいて，素数について考えてみます．

ここで，$p,a,b$等は自然数とします．

### 定義

この記事では，以下の3つの定義のうち，素数と強素数が重要です．

#### 定義
整数$m,n$に対して$m=na$となる整数$a$があるとき，$n$は$m$を割り切るといい$n\mid m$と書く．
$n$が$m$を割り切らないとき$n\nmid m$と書く．

#### 定義
$p>1$とする．$p$が素数とは，次を満たすことである．
$p=ab$ならば$p=a$または$p=b$.

#### 定義
$p>1$とする．$p$が強素数とは，次を満たすことである．
$p\mid ab$ならば$p\mid a$または$p\mid b$.

### 補題

ここで紹介する補題の証明はこの記事の最後の方で行います．

#### 補題

$p$を素数とする．$a$は$p$で割り切れない，すなわち$p\nmid a$とする．このとき$p\mid (aa'+1)$となる$a'$が存在する．

### やりたいこと

上記の定義のもとで，全ての素数が強素数であることの証明を考えます．

## 環論の言葉による証明

環論による証明は，次のステップで行います．

### 定義

環を定義します．環は演算としては和と積があります．積については可換です．和と積それぞれの単位元があります．
イデアルを定義します．環$R$の部分集合$I$がイデアルであるとは，$I$が和と積について閉じていて，$IR=\\{ar\mid a\in I, r\in R\\}\subset I$を満たすことです．

環の元$r\in R$とイデアル$I$に対して，$I$と$r$を含む最小のイデアルがあり，それは$aR+I$です．

$I$が極大イデアルとは，イデアル$I'$が$I\subset I'$を満たすなら$I'=I$または$I'=R$となることとします．
$I$が素イデアルとは，$ab\in I$ならば$a\in I$または$b\in I$となることとします．

### 定理

$p$が素数なら$p\mathbb Z$は極大イデアルである．

（証明）$I$はイデアルで$p\mathbb{Z}\subsetneq I$とする．$a\in I-p\mathbb{Z}$にとる．$a$は$p$で割り切れないので，補題より$aa'+1\in p\mathbb Z$となる$a'$が存在する．$aa'\in I$なので$1\in I$なので$I=\mathbb Z$である．

### 定理

極大イデアルは素イデアルである．

（証明）$I$を極大イデアルとし，$ab\in I$とする．$a\notin I$のときを考える．$I$は極大イデアルなのでイデアル$aR+I$は$R$である．$1\in R$なので$r\in R$と$i\in I$が存在して$1=ar+i$とできる．これに$b$をかけると$b=abr+ib$であるが，右辺は$I$に入っているので$b$も$I$に入る．

### 定理

$p\mathbb Z$が素イデアルなら$p$は強素数である．

### まとめ

上記の3つの定理より，$p$が素数なら強素数であることがわかる．

## 整数の言葉による証明

$p$を素数とし，$p\mid ab$とする．
$p\nmid a$のときを考える．上記の補題より$a'$が存在して$p\mid (aa'+1)$とできる．ここで等式$(aa'+1)b-aba'=b$の左辺は$p$で割り切れるので$p\mid b$が成り立つ．
つまり$p\mid a$または$p\mid b$となる．$p$は強素数であるとわかる．

## TODO: 補題の証明
ハイパーリンクの文字列の一部分をコピーする

小ネタです。
最近知って、ちょっと感動したので紹介します。

# 問題点

例えば下記のようなハイパーリンクがあったときに、
「サーヴァント」をコピーしようと思ったときどうしますか？

<a href="https://qiita.com/diescake/items/8b9b3b5f6925e4d34ea2">Clova Wave を Google Home のサーヴァントとして使役する</a>

私の場合は「サーヴァント」の「ト」のちょっと下でクリックして、ドラッグしながら選択してコピーしていました。

### GIF Demo

![qiita_01.gif](https://qiita-image-store.s3.amazonaws.com/0/38837/cee87dfd-03e6-0797-2bd9-47eada0a8d12.gif)

しかし、クリックする箇所が結構シビアだし、レイアウトやリンクの実現方法によってはそもそも不可能な場合も結構あります。

# 解決法

というわけで、解決法。

<font color="red">**alt/option を押しながらドラッグします。**</font>

### GIF Demo
![qiita_02.gif](https://qiita-image-store.s3.amazonaws.com/0/38837/4afd1b7b-9fbb-5a33-7bac-45550a9ae10e.gif)
**※わかりにくいですが、alt キーを押下しています。**

リンクを踏むことなく選択できるので便利！
特に下記あたりで有用ですね。

* 
Gmail のリスト表示で件名をコピー
 (イベントに取られて選択すらできませんでした…)
* Redmine のチケットリスト表示で、タイトルをコピー

（╹◡╹）

### 確認環境

#### OK
* Windows + Chrome
* Windows + Firefox
* Mac + Chrome
* Mac + Firefox

#### NG

* Windows + Edge
* Windows + IE11
Vue.jsでアカウント作成フォームっぽいものを作ってます

という名のCodePenテスト。

Vue.jsたのしいです

10文字以上入力するとエラーメッセージが表示されます。
あと一度入力した名前を消すと「入力してください！」っていうエラーメッセージが表示されます。

<p data-height="265" data-theme-id="0" data-slug-hash="YYRmMg" data-default-tab="html,result" data-user="mktoho" data-embed-version="2" data-pen-title="Vue.jsの練習でアカウント作成フォームっぽいものを作ってます" class="codepen">See the Pen <a href="https://codepen.io/mktoho/pen/YYRmMg/">Vue.jsの練習でアカウント作成フォームっぽいものを作ってます</a> by えむけー (<a href="https://codepen.io/mktoho">@mktoho</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>
dotenv を Bash と Zsh でやる

# 優先順位

1. 環境変数
2. `.env` 変数

[vlucas/phpdotenv](https://github.com/vlucas/phpdotenv) のデフォルトの挙動にそのまま従う感じのアレ。アレをBashやZshで書きたくなった。

# 実装2パターン

どちらもBashとZshで差異なく動作します。プロセス置換機能さえあればOK。

## 環境変数に無い`.env`変数を**シェル変数**としてインポートする

現在のプロセスでしか参照しない場合はシェル変数で十分。

```bash:実装
eval "$(cat .env <(echo) <(declare -x))"
```

```bash:動作確認
#!/bin/bash

cd /tmp

cat << EOD > .env
APP_ENV=local
APP_DEBUG=true
EOD

export APP_ENV=staging

eval "$(cat .env <(echo) <(declare -x))"

echo $APP_ENV             # staging
echo $APP_DEBUG           # true
bash -c 'echo $APP_ENV'   # staging
bash -c 'echo $APP_DEBUG' # 
```

## 環境変数に無い`.env`変数を**環境変数**としてインポートする

当該シェルとは無関係な子プロセスに変数を引き継ぎたい場合はこちらで。

```bash:実装
set -a; eval "$(cat .env <(echo) <(declare -x))"; set +a;
```

```bash:動作確認
#!/bin/bash

cd /tmp

cat << EOD > .env
APP_ENV=local
APP_DEBUG=true
EOD

export APP_ENV=staging

set -a; eval "$(cat .env <(echo) <(declare -x))"; set +a;

echo $APP_ENV             # staging
echo $APP_DEBUG           # true
bash -c 'echo $APP_ENV'   # staging
bash -c 'echo $APP_DEBUG' # true
```
.ssh/configが長すぎていつもgrepしている人へ

# はじめに
サーバアプリエンジニアにしてもインフラエンジニアにしても、サービス数×サーバ数×環境数みたいな感じで果てしなく長くなった.ssh/configにうんざりしている人が多いのではないでしょうか？
そんなあなたに、ちょっとだけ幸せを運ぶ小技を紹介します。

追記）
...だったんだけど、**こっちのほうが１００倍便利！**なのでこちらへ
[sshコマンドを.ssh/configのhostで補完させよう](https://qiita.com/albyte/items/aef1e54fccdcc7e32969)


# .bash_profileにaliasに設定
下記の短い魔法のaliasを.bash_profileあたりに書いてやりましょう。

```bash:~/.bash_profile
alias sshconfig='cat ~/.ssh/config | grep -i host | cut -d " " -f 2 | grep -E $@'
```

# 使用例
例えばこんなconfigを書いていた場合

```text:.ssh/config
# hoge service(develop)
Host dev-front-hoge
    Hostname 192.168.10.10
    User         hogeop
Host dev-backoffice-hoge
    Hostname 192.168.10.11
    User         hogeop    
Host dev-api-hoge
    Hostname 192.168.10.12
    User         hogeop
Host dev-ci-hoge
    Hostname 192.168.10.13
    User         hogeop
    
# hoge service(production)
Host prd-front-hoge
    Hostname ******
    User         ****
    ProxyCommand ssh bastion-hoge -W %h:%p
... 略）
# fuga service(develop)
Host dev-front-fuga
    Hostname ******
    User         ****
... 略）
```

developのサーバ一覧を表示したい場合は
``$ sshconfig dev``
とコマンドすると

```text
dev-front-hoge
dev-backoffice-hoge
dev-api-hoge
dev-ci-hoge
...
```
ってな感じで表示されます。
微妙に名前覚えてないなぁって場合も
``$ sshconfig d.*f.*hoge``
んな感じで、コマンドすれば

```text
dev-front-hoge
```
と表示されます。
一つに絞れる場合は、
``$ ssh `sshconfig d.*f.*hoge` ``
とコマンドすれば、すぐそのサーバにsshログインできますね！

このaliasでエンジェルカードくらいのちょっとした幸せを運んでくれたのではないでしょうか。

# おわりに
どうでもいい話ですが、Macのsedって大文字小文字を区別しないってどうやるんでしょう(+_+)
下記だと怒られるんですよね。。

```bash
cat ~/.ssh/config | sed -e 's/^HOST *//i'
```
Nature Remoの公式APIの使い方

##公式APIを発見した
偶然発見したのでメモ程度。一応既知なので公開も問題ないかと思って書きました。
ちなみに公式からのドキュメントはまだ出ていないので参考程度に。

追記(2/12)：1/30に公開されました



##【注意点】
https://developer.nature.global/ を読んだ上でご利用ください。
また、Tokenやdevice idは絶対に流出させないようにしましょう。特にtokenを流出させてしまうとあなたの家の家電にアクセスされ放題になります。

##手順
Windowsの場合、
https://qiita.com/sugasaki/items/ba9737d13db33d2cd71f
で、curlをインストールしてください。

**① アクセストークンの発行**
https://home.nature.global/
"Generate Access Token"よりトークンを発行します。
こちらは再表示されませんのでどこかにメモしておきます。

**② SwaggerのDocumentを参考にAPIを叩く**
http://swagger.nature.global/
こちらにアクセスし、curlコマンドを取得してください。
例えば、デバイスの状態をGETしたい場合、

```Bash:基本コマンド例
curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json"
```

というコマンドになります。(結果はUnauthorizedになります)

このままでは認証できないので、Tokenで認証します。
このコマンドに、1で取得したTokenを以下の形で追記します。
-k --header "Authorization: Bearer 取得したToken"
ですので、最終的なコード例は以下の通りです。

```Bash:【完成コード例】
curl -X GET "https://api.nature.global/1/devices" -H "accept: application/json" -k --header "Authorization: Bearer 取得したToken"
```
(1行で入力してください)

このコードではdevice idやtemperature(温度), humidity(湿度)などが取得できます。
device idはAPIの中で使用することがあるので保存しておくことをお勧めいたします。

##Tips
Macの場合はbrew、Linuxの場合はapt-getでjqをインストールしておくことをおすすめします。
コマンドの最後に

```Bash:【コード例】
.... | jq .
```
と追記してあげると、jsonデータが整形され、GETの結果が見やすくなります。

ちなみにAjaxで使う場合はこんな感じ。

```javascript:getData.js
apiKey = "API KEY";

function getData(often) {
    $.ajax({
        type: "GET",
        dataType: "json",
        timeout: 3000,
        headers: {
            Authorization: 'Bearer ' + apiKey
        },
        cache: false,
        url: 'https://api.nature.global/1/devices',
          success: function(data) {
            console.log(data);
            $('.current_temp').empty();
            $(".current_temp").text(data[0].newest_events.te.val.toFixed(1) + "℃");
            $('.humidity').empty();
            $(".humidity").text(data[0].newest_events.hu.val.toFixed() + "%");
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            //エラー対応
        }
    });
}
```

Pythonはこんな感じ。

```python:getdata.py
import json
import requests

apikey = "API KEY"

#Get JSON
headers = {
  'accept': 'application/json',
  'Authorization': 'Bearer ' + apikey ,
}

response = requests.get('https://api.nature.global/1/devices', headers=headers, verify=False)
rjson = response.json()
print(rjson)
```



##最後に
IFTTTではWebhookにHeaderを設定できないので、[Zapier](https://zapier.com/)を使用しましょう。
5こ以上は有料ですので、大人しくRaspberry Piなど常時電源が入っている機器を利用した方が便利そうです。

関係ないですが、私の場合、PHP+MySQL+Javascriptでこんな家電コントロールページを作って遊んでいます。
<img width="2715" alt="Screen Shot 2019-06-20 at 7.49.03 AM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185096/3019e830-13ff-85e2-d276-780722083b43.png">


追記：Zapierより、HerokuとIFTTTを連携させたほうが便利かもしれません。あとはGASとか。
GLSLfan (またはGLSL Sandbox) の Shader Art を Qiita に挿入する

<p data-height="520" data-theme-id="0" data-slug-hash="qpQPyW" data-default-tab="result" data-user="keim" data-embed-version="2" data-pen-title="GLSLfan viewer" class="codepen">See the Pen <a href="https://codepen.io/keim/pen/qpQPyW/">GLSLfan viewer</a> by keim (<a href="https://codepen.io/keim">@keim</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

#GLSLfan 楽しいデスネ
[WebGL Advent Calendar 2017](https://qiita.com/advent-calendar/2017/webgl)で[doxas氏](https://qiita.com/doxas)が[シェーダ( GLSL )のライブコーディングをリアルタイム配信するお話](https://qiita.com/doxas/items/8490976ea91cc0e2658c)というタイトルで発表されていた[GLSLfan](https://glslfan.com)というサイトが楽しいです。Shader Art のコーディングをリアルタイム配信するというかなり攻めたコンセプトのサービスで、サイト上で編集しているコードをリアルタイムに共有・公開することができます。
リアルタイムコーディングに向けてアイディアを形にする速度を上げるには、とにかく小さなコードを沢山書いて引き出しを増やす必要があるため、Qiitaとの相性は良いと思います。
折角、良い Shader Art が出来たら Qiita 上でも共有しましょう。実際に動いている作品のノウハウは説得力が違います。

#CodePen テンプレート
[Qiita が CodePen に対応しました](https://qiita.com/Qiita/items/edae7417214c8e957f54)ので、GLSLfan の Shader が動くPen を作れば埋め込むことができます。そこで、簡単なテンプレートを作ってみました。
[GLSLfan viewer - CodePen](https://codepen.io/keim/pen/wpQewy)

#使い方
[GLSLfan viewer](https://codepen.io/keim/pen/wpQewy) をForkして、HTMLの`<script id="glslcode">`に GLSLfan のシェーダコードを記述、以下の属性値をscriptタグに記述すれば Pen の完成です。

- initialTime; 開始時間
- initialResolution; デフォルト解像度
- title; タイトル
- user; ユーザー名
- channel; タイトルリンク先チャンネルID。"https://glslfan.com/?channel=***" の後の文字列

あとは、[この記事](https://qiita.com/Qiita/items/edae7417214c8e957f54)を参考にQiitaに埋め込みます。

#コード解説
[three.js](https://threejs.org/) を利用しています。GLSLコードを設定した [THREE.ShaderMaterial](https://threejs.org/docs/#api/materials/ShaderMaterial) を [THREE.PlaneBufferGeometry](https://threejs.org/docs/#api/geometries/PlaneBufferGeometry) に貼り付けてシーンに追加しています（16～20行目）。WebGL直書きでもそれほど複雑なコードにはならないのですが、three.jsを利用することで可読性が上がっていると思います。

#最後に
それ単体では実用性に欠き、多くの周辺知識を必要とする Shader Art は、趣味の範囲を出ず、現在のところ直接業務などで利用することはあまりありません。しかし、得られる知識やノウハウは、様々な分野で応用の利くものだと思います。これを機にユーザーが少しでも増えてくれれば良いなー、と思います。
おまけ：[glslfan で書き散らかした落書き置き場](https://codepen.io/collection/XBpbKZ/)
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十六章 大規模な構造2 システムのメタファ

# これまでの１６章
[進化する秩序](https://qiita.com/YasuhiroKimesawa/items/b6c42408b7912fd691b5)

# システムのメタファ

ここからが具体的な大規模な構造を発見するパターンの紹介です。

１つ目はシステムのメタファ。
システム全体に秩序をもたらすようなメタファがあれば、ユビキタス言語に加えるというもの。

複数の境界づけられたコンテキストに適用できれば、コンテキスト間の作業を調整しやすくなります。

例として挙げられているのがファイアウォール。

ただ、めったにうまいメタファって見つからないし、Evans自身も本当に役に立つメタファが見つかったプロジェクトはほとんどないと言っています。

しかも、メタファを採用したところ、逆に混乱を招くことも。。。

とはいえ、コンテキスト間のコミュニケーションに役に立つのは間違いないので、もし、うまいメタファが見つかれば、採用してみましょう。

ただし、拡大しすぎたり不適切でないかは常に調べ、障害になるようなら取り消しましょう。
RasPi Zero/ZeroW対応3色電子ペーパーモジュールinky pHATが販売再開

# やっと販売再開！
英国pimoroni社からRaspberry Pi Zero W で使える3色電子ペーパーモジュールinky pHATが発売されています。

　この製品は2017年6月に発売されていたのですが、直後に表示が更新されなくなる問題が続出し、数カ月にわたって販売が停止していました。
　2017年末に電子ペーパーモジュールを変更して再開する旨報告があり、2018年1月に販売再開となりました。

　この辺のいきさつは、
+ [THE MURKY DEPTHS OF INKY PHAT](http://blog.pimoroni.com/the-murky-depths-of-inky-phat/)(pimoroni社テクニカルブログ)
+ [Streaky inkyphat](https://forums.pimoroni.com/t/streaky-inkyphat/5201/72)(pimoroni社サポートフォーラム)
に記載されています。

# 外観比較
さっそく取り寄せてみました。昨年の販売開始時に運よく(いや、悪いのか？)手に入れていた旧版がありますので、外観を比較してみます。

まずは正面
↑上が旧版、↓下が新版となります。
<img width="420" alt="" src="http://drive.google.com/uc?export=view&id=1eHMKER8Q5GjEBr-I-9-2msl3u0qq__YS">

+ 見た目の大きな違いは電子ペーパーモジュールのコネクタ周辺の外観です。表示部からの色の付いたはみ出しが下側に１か所だけあるものが旧版、上下に２か所あるものが新版となります。
+ 白色部分の色は新版の方がより赤みがかっている(旧版も少しピンクでしたが、さらに色が増しています)→**出荷時は赤っぽかったのですが、書き直したら旧版と同程度に改善しました。問題なさそうです**

次に裏面
↑上が旧版、↓下が新版となります。

<img width="420" alt="" src="http://drive.google.com/uc?export=view&id=1Kbzc8ZVVcvsCxFkEY8LTTqVxbsa9cTzM">
+ 回路・基板が再設計されており、新版では大きなインダクタが目立ちます。これは、前出の[THE MURKY DEPTHS OF INKY PHAT](http://blog.pimoroni.com/the-murky-depths-of-inky-phat/)にも取り上げられています。曰く**"We redesigned the power circuitry on Inky pHAT board to use a larger inductor to protect against spiky voltages"**だそうです。

コネクタ部の拡大写真
旧版：
<img width="420" alt="" src="http://drive.google.com/uc?export=view&id=1Yj0d5vVsq9V6n-35-niQr9MVs-lf9f7a">
WFT0213CZ16で検索すると[Alibabaにありますね](https://www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&CatId=&SearchText=WFT0213CZ16)
もし壊れたら、これ買ってきて交換すれば良いのかな...

新版
<img width="420" alt="" src="http://drive.google.com/uc?export=view&id=136l8G4FFjARPwglHMTYbPuoIbJup2xqG">
こちらもHINK-E0213A07で検索すると[イギリスのUNI SYSTEMというところ](https://www.unisystem.pl/en/products/epd/hink-e0213a07.html)がヒットしました(日本への販売可否は未調査)。


# 使ってみる
旧版のソフトウェアはそのままでは使えません。最新版に更新すると自動的にボードの種類を検出して新旧どちらでも動作するそうです。

今回は、ホームディレクトリ上の旧版のソフト一式をバックアップ後、インストールしなおしました。
手順は（https://learn.pimoroni.com/tutorial/sandyj/getting-started-with-inky-phat ）に記されています。
**”Note that if you have just received a new Inky pHAT (at the beginning of December 2017), and it doesn't appear to be working after running the one-line-installer below, then you may need to run sudo pip install --upgrade inkyphat in the terminal. It can take a few days for our software to propagate through to the apt repositories used by the one-line-installers.”**と書いてあるので、”sudo pip install --upgrade inkyphat”の追加実行が当面必要です。

まずはバックアップ
cd
mv Pimoroni Pimoroni-old

続いて
curl https://get.pimoroni.com/inkyphat  | bash
とします。

さらに、先ほど確認した通り
sudo pip install --upgrade inkyphat
を実行しました。この処理は途中でエラーで終了してしまいました。
が、その状態で動かしたところ、正常に動作しました。

なので、とりあえずこのまま使い続けることにします。

同じデータで新旧比べて見ると、
+ 表示に10秒位かかるのですが、その間完了するまで、表示が点滅しながら徐々に完成します。この途中経過が新旧で異なります。
+ 書き換え速度は新版の方が遅いです。
rubyで文字列からカラーコードを生成する

# digest ライブラリを用いる

```ruby
require "digest/md5"

def str_to_color_code(str)
  "#" + Digest::MD5.hexdigest(str)[0..5]
end
```

scivolaさんからハッシュライブラリを用いたより良い方法を教えてもらいました。ハッシュ関数から先頭6文字を取っています。是非、使ってみてください！

# きっかけ
railsで簡単なシステムを作っている際、ユーザごとにプロフィール画像がないため、全体で参加できるコメント欄があまりにも質素で真っ黒、誰が喋っているのか分からない状態になったため、ユーザごとのテーマカラーを上記の関数で実装した。

決まった文字列には決まったカラーコードを返すのでユーザ名から生成し、CSSに適用させるなどすると、簡単なアプリでもなかなか華やかに見えるのでおすすめです。
量子コンピュータ学習時の手計算を代わりにやってくれるコード組んだ

#量子コンピュータの勉強、いくら紙あっても足りんわ。
……ということで、ゲート演算をいい感じにやってくれるライブラリ作ってみました。
https://github.com/gyu-don/gate_operation

#特徴

- 量子コンピュータの参考書などに出てくる小さい量子回路を再現するのが目的
- メソッドチェーンっぽい書き方ができる
- IPythonやJupyter Notebookなどのインタラクティブな環境での使いやすさを重視
- 回路を作り終えてからシミュレートするのではなく、ゲートを適用するたびに計算が走る
- バックエンドにNumPy版とSymPy版の両方を用意している(ただし　SymPyはNumPyより遅い)
- Qubitと、ユニタリ行列と、後で再利用できるよう操作を覚えておくためのクラスの3種類を用意している
- 現時点ではコロコロ仕様変えるかも。バグったコードをmasterにpushしたりとかもよくある。

##まだだけど、そのうちやりたいこと(上の方が、優先したいお気持ちが強い)

- 高速化
- いろんな量子回路を組んで、examplesとしてgithubに載せる
- ユニタリ行列のフィデリティを計算する機能を追加
- 観測を何度も行うとか、量子トモグラフィ的なやつとか、そういう機能の充実
- Jupyter Notebook用の表示をもっとかっこよくする(Displayとか使う)
- UnitTest作る
- ドキュメント書く
- OpenQLプロジェクトとの統合
- PyPIに登録
- OpenQASMや、qiskitのQuantumProgram、pyquilのProgramへの変換

#使い方
##量子テレポーテーションやってみよう

```py3:量子テレポーテーション

import np_gate # NumPy backendを使用

# aliceに何か1Qubitもたせる。
alice = np_gate.Qubit(1).h(0).t(0)

# シミュレータなので、クローンできる。
# |circuit> = |alice>
circuit = alice.clone()

# |0>を2個付け加える
# |circuit> = |alice>|00>
circuit.append_qubit(2)

# 付け加えた2つをベル状態にする
# |circuit> = (|alice>|00> + |alice>|11>) / sqrt(2)
circuit.h(1).cx(1, 2)

# 以下の量子ゲートを適用
# --*--H-----*--
# --|-----*--|--
# --X-----X--Z--
circuit.cx(0, 1).h(0).cx(1, 2).cz(0, 2)

# 1番目、0番目のQubitを捨てる(観測される)
circuit.drop_qubit(1).drop_qubit(0)

# 残ってるやつとaliceのQubitとのフィデリティを取ると、だいたい1になる(テレポーテーション成功)
print(alice.fidelity(circuit)) # => Almost 1
```

##2ビットのGroverでもっと詳細な使い方
ここに置いてます。
https://github.com/gyu-don/gate_operation/blob/master/examples/Grover%20algorithm%202qubit.ipynb

##Shorの誤り訂正符号(1Qubit送るのに9Qubit使ったら、そのうちの1つがごちゃごちゃになっても復元できるやつ)
ここに置いてます。ちなみに、SymPyでやると9Qubitは非常に計算が重かったので、NumPyでやってます。
https://github.com/gyu-don/gate_operation/blob/master/examples/Shor%20error%20correcting%20code.ipynb

#まとめ

**量子コンピュータはいいぞ**
EXCEL VBA Replaceで環境依存文字UNICODEを取り扱う

1.16進コードの取得
[Excelマクロで特殊文字を削除するメモ](https://qiita.com/koike_e3/items/0e3a1e65f3b7c03d6c7c)
こういう方法もあるが、今回はSplitの表記にもハマったのでメモ。

A1に機種異存文字を1文字入力
ALT+F11でVBEを開く

[ascW関数の結果がおかしい](https://oshiete.goo.ne.jp/qa/2929172.html)
調べ方：アクティブセルに対象となる文字を入れる。
イミディエイトウィンドウにいれる。
?"&H" & hex(Ascw(range(activecell.Address).value))
これをクォーテーションなしでChrWに入れる

UnicodeがあるときのSplitの表記
普通の文字まででいったん二重引用符で綴じる。
& "," & でつなぎChrWを入れる。そのあとまた続ける場合は & "," & ChrW(&H) とする。
最後まできたら、 & 二重引用符二重引用符コンマ二重引用符コンマ二重引用符とする。
下記の例はSplitで配列に入れて、文字を消していくというのをReplaceで行う。
この時に会社の略称の記号も削除しようというものである。

```vb.net

Sub replaceUni()
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim buf As String
Dim R As Range
Dim Ar, i As Long
Ar = Split("株式会社,合名会社,合同会社,合資会社,一般財団法人,弁護士法人" & "," & ChrW(&H3232) & "," & ChrW(&H3231) & "", ","): Debug.Print UBound(Ar)
buf = ws.Range("C15").Value
For i = LBound(Ar) To UBound(Ar)
buf = Replace(buf, Ar(i), "", 1, -1, vbTextCompare)
Next i
Debug.Print buf
End Sub
```
slack-notifierでrailsアプリからslackへ通知

# 導入

- Gemのインストール

```ruby:Gemfile
gem 'slack-notifier'
```

- slackのwebhook設定

https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008

上記のサイトに従い、適用したいslackへのwebhook URLを取得する

# 仕様

slack-notifierはすごく便利で以下のようなことができる。

## 簡単にメッセージを送る

```
notifier = Slack::Notifier.new "WEBHOOK_URL"
notifier.ping "簡単なメッセージ"
```

上記ではslack側で設定したdefaultのchannelへ送られます。

## channelとusernameをrails側で指定

```
notifier = Slack::Notifier.new "WEBHOOK_URL",
                                channel: "#general",
                                username: "noti-bot"
```

上記では送信先channelとメッセージのユーザ名が指定できます。


## slackのattachmentsを用いる

pingの代わりにpostを用いることでslackメッセージの装飾ができます。

```
attachments = {
  author_name "slackくん",
  text: "通知ですよ",
  color: "good",
  footer: "さあみてください"
}
notifier.post attachments: [attachments]
```

使えるslackのattachmentsに関して、詳しくは[本家](https://api.slack.com/docs/message-attachments)を参照

# 感想
技術記事の更新通知や勤怠管理の通知など様々な面で利用できそうです。
WSL上でbundle installしたらnokogiriが入らなかった

## 環境
- WSL(Windows subsystem for linux)
- ubuntu
- 入れたいnokogiri(1.8.1)

## エラー
```
'libxml/xmlversion.h': No such file or directory
```
のエラーがでたが、libxml2はすでに導入済みで詰んだ。

## 最終的に入れてたパッケージ
- libxslt-dev
- build-essential
- ruby-dev
- zlib1g-dev
- libxml2
- libxml2-dev
- liblzma-dev
- libxmlsec1-dev(これの情報が無かった)

これらを入れて```--use-system-libraries```をして```bundle install```したらok。

## コマンド
```
$ sudo apt install libxslt-dev build-essential ruby-dev zlib1g-dev liblzma-dev libxmlsec1-dev libxml2-dev
```
```
$ bundle config build.nokogiri --use-system-libraries
```
```
$ bundle install --path vendor/bundle --jobs=4
```
Cronから実行するEC2スナップショットスクリプト

# 実行条件
+ awscliがインストールされている
+ IAMロールなどでEC2周りの権限を解放しておく

# スクリプト

```
#!/bin/sh

#　取得したいインスタンスのidを並べる
INSTANCE_ID=(i-xxxxx1 i-xxxxx2 i-xxxxx3)

SHELLDIR=`dirname ${0}`
SHELLDIR=`cd ${SHELLDIR}; pwd`
SHELLNAME=`basename $0`

LOG_DIR="/var/log"
LOG_SAVE_PERIOD=14
LOG_FILE="${LOG_DIR}/${SHELLNAME}.log"
echo $LOG_FILE

REGION=ca-central-1
SNAPSHOTS_PERIOD=2

AWS="/usr/bin/aws --region ${REGION}"


rotate_log() {
    (( cnt=${LOG_SAVE_PERIOD} ))
    while (( cnt > 0 ))
    do
        logfile1=${LOG_FILE}.$cnt
        (( cnt=cnt-1 ))
        logfile2=${LOG_FILE}.$cnt
        if [ -f $logfile2 ]; then
            mv $logfile2 $logfile1
        fi
    done

    if [ -f $LOG_FILE ]; then
        mv ${LOG_FILE} ${LOG_FILE}.1
    fi
    touch $LOG_FILE
}

print_msg() {
    echo "`date '+%Y/%m/%d %H:%M:%S'` $1" | tee -a ${LOG_FILE}
}

create_snapshot() {
    for ID in `echo $@`
    do
        print_msg "Create snapshot Start"
        VOL_ID=`${AWS} ec2 describe-instances --instance-ids ${ID} --output text | grep EBS | awk '{print $5}'`
        if [ -z ${VOL_ID} ] ; then
            echo ${VOL_ID}
            print_msg "ERR:ec2-describe-instances"
            logger -f ${LOG_FILE}
            exit 1
        fi
        print_msg "ec2-describe-instances Success : ${VOL_ID}"
        ${AWS} ec2 create-snapshot --volume-id ${VOL_ID} --description "Created by SYSTEMBK(${ID}) from ${VOL_ID}" >> ${LOG_FILE} 2>&1
        if [ $? != 0 ] ; then
            print_msg "ERR:${SHELLDIR}/${SHELLNAME} ec2-create-snapshot"
            logger -f ${LOG_FILE}
            exit 1
        fi
        print_msg "Create snapshot End"
    done
}

delete_old_snapshot() {
    for ID in `echo $@`
    do
        VOL_ID=`${AWS} ec2 describe-instances --instance-ids ${ID} --output text | grep EBS | awk '{print $5}'`
        print_msg "Delete old snapshot Start"
        SNAPSHOTS=`${AWS} ec2 describe-snapshots --output text | grep ${VOL_ID} | grep "Created by SYSTEMBK" | wc -l`
        while [ ${SNAPSHOTS} -gt ${SNAPSHOTS_PERIOD} ]
        do
            ${AWS} ec2 delete-snapshot --snapshot-id `${AWS} ec2 describe-snapshots --output text | grep ${VOL_ID} | grep "Created by SYSTEMBK" | sort -k 11,11 | awk 'NR==1 {print $10}'` >> ${LOG_FILE} 2>&1
            if [ $? != 0 ] ; then
                print_msg "ERR:${SHELLDIR}/${SHELLNAME} ec2-delete-snapshot"
                logger -f ${LOG_FILE}
                exit 1
            fi
            SNAPSHOTS=`${AWS} ec2 describe-snapshots | grep ${VOL_ID} | grep "Created by SYSTEMBK" | wc -l`
        done
        print_msg "Delete old snapshot End"
    done
}

rotate_log

print_msg "INF:$SHELLDIR/${SHELLNAME} START"
create_snapshot ${INSTANCE_ID[@]}
delete_old_snapshot ${INSTANCE_ID[@]}
print_msg "INF:$SHELLDIR/${SHELLNAME} END"

exit 0
```
Opensslの各種確認コマンド

## パス抜き作成

```
openssl rsa -in server.key -out server.key
```

## keyfileの内容を確認(パス抜きの確認可能)

```
openssl rsa -text -in server.key
```

## PEM形式の証明書の内容をテキストで表示する

```
openssl x509 -noout -text -in server.crt
```

## 認証書の設定値を確認する場合

```
openssl asn1parse -in server.crt
```

## csrの内容確認

```
openssl req -in server.csr -text
```

CERTIFICATEと書かれている場合: X.509
CERTIFICATEの部分にPKCS7と書かれている場合: PKCS7 

OpenSSL を使ってこの形式の証明書ファイルの情報を見るには以下のようにする

##### X.509 の場合：

```
$ openssl x509 -in ファイル名 -text
```

##### PKCS7 の場合：

```
openssl pkcs7 -in ファイル名 -text
```

## modulusの内容を見るとき

両者のModulusを比較することで、証明書と認証鍵が一致していることを確認することが出来る

```
openssl rsa -noout -modulus -in server.key
Modulus=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

```
openssl x509 -noout -modulus -in server.crt
Modulus=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

### ■ diffで比較する

```
openssl rsa -noout -modulus -in server.key  > t1 ;openssl x509 -noout -modulus -in server.crt > t2 ;diff t1 t2 ;rm -f t1 t2
```


## 期限を確認

```
openssl x509 -dates -noout -in server.crt
notBefore=May 10 00:00:00 2008 GMT
notAfter=May 10 23:59:59 2009 GMT
```
react.orgを手元で動かす

# 概要

タイトルの通り
https://reactjs.org/ を手元で動かす誰も得しないメモ

# 前提

以下が使える
* git
* Node(8.4以降)
* Yarn( https://yarnpkg.com/lang/en/docs/install/ )

# 行くよ :clap: 

```
git clone https://github.com/reactjs/reactjs.org.git
cd reactjs.org/
yarn
yarn dev
```

# 動いた！

<img width="614" alt="Screen Shot 2018-01-19 at 0.24.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/117615/05b4610e-9a69-d5e7-31d9-736f5c964b93.png">
Route53に登録されたレコードを全取得するスクリプト

# 実行条件

+ awscliをインストールしておく
+ EC2インスタンスにアクセスキー ID とシークレットアクセスキーを登録する

```
#route53.py

import commands
import json

MKDIR=commands.getoutput("mkdir RECORD")
HostZone = commands.getoutput("aws route53 list-hosted-zones")

HostZoneJson = json.loads(HostZone)

for h in HostZoneJson["HostedZones"]:
  HostZoneId = h['Id']
  HostZoneName = h['Name']
  File = "RECORD/" + HostZoneName + "txt"
  f = open(File, 'w')

  AwsCli = "aws route53 list-resource-record-sets --hosted-zone-id " +  HostZoneId 
  Record = commands.getoutput(AwsCli)
  RecordJson = json.loads(Record)

  for r in RecordJson['ResourceRecordSets']:
    Name = r.get('Name')
    Type = r.get('Type')
    TTL = r.get('TTL')
    Resouce = r.get('ResourceRecords')
    Alias = r.get('AliasTarget')

    if Alias != None:
      DNSName = Alias.get('DNSName')
      OutPut = Name + "," + Type + "," + "Alias " + DNSName + "," + "60" + "\n"
      f.write(OutPut)  
    else:
      Value = ""

      for v in Resouce:
        Value = Value + " " + v.get('Value') 

      OutPut = Name + "," + Type + "," +  Value + "," + str(TTL) + "\n"
      f.write(OutPut)
```

# 実行方法

```
python route53.py
```



**ホストゾーン毎にファイルが作成され、レコード一覧が各ファイルに記載される**
yarnはパッケージにgitのモジュールを指定した時、タグの指定にミスっていても、よろしくやってくれる

# 背景
package.jsonにgitのモジュール#タグを指定していた。
ところがタグが実際のものと異なっていた。

```:package.jsonに書かれていたもの
...packagename.git#v1.2.3
```

```:実際に切られていたタグ
1.2.3
```

`v1.2.3`と`1.2.3`の違いである。

# なにが起こったか
* yarn -> 成功する。
    * どうやら、少しのバージョンのミスはなんとかしてくれるっぽい。
    * 正直、エラーにしてくれた方が助かる。
* npm -> 失敗する
    * npmは厳格だった。

# 結論
* タグは間違えないように指定しましょう。
* npmとyarnのどちらを使うか、統一しましょう。

以上です。よろしくお願いします。
SeleniumとVisualStudioでテスト環境構築（Mac）

MacとWindowsで共通に使えるテスト環境を作ろうとして、少しハマったのでメモしておきます。
動作確認ブラウザはChrome、Firefox、Safariです。

# 環境
・macOS High Sierra
・VisualStudio for Mac Community 7.3.3
・Selenium 3.8.0
・xUnit 2.3.1
・.NetCore 2.1.4

# 構築手順
.NetCore1.1ではNugetでSelenium系のインストールがエラーになるので、.NetCore2.0をインストールしました。
また、SafariDriverはSelenium3系から対応らしいので、3系をインストールします。
 
####１）[.NetCore2.1.4](https://www.microsoft.com/net/download/macos)のSDKをイントール
####２）[Visual Studio for Mac](https://www.visualstudio.com/ja/vs/visual-studio-mac/)のCommunity版をインストール
<img width="611" alt="screen001.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/c0b9f43b-f97b-9c0c-3863-570e8f9deafa.png">


####３）Visual Studioを開き、以下を参考にプロジェクト作成
[Selenium with C# and xUnit](http://blog.xebia.in/index.php/2017/06/13/selenium-with-c-and-xunit/)　→　.NetCore2.0で作成  

※ xUnitは拡張機能でインストール　→　[VisualStudioforMacでxUnitを実行する方法](https://qiita.com/amay077/items/6ce51e7ea382370571f7)

####４）上記手順と合わせて、以下もNugetからインストール
・Selenium.Support
・Selenium.WebDriver
・Selenium.WebDriver.ChromeDriver
・Selenium.Firefox.WebDriver
・xUnit
・xUnit.runner.visualstudio

※ Nugetは依存関係の上で右クリックでウィンドウ開きます
<img width="237" alt="screen002.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/7b58c324-402a-2002-8bef-80d9ac8a675d.png">

####５）WebDriverのセットアップ
FirefoxとChromeのWebDriverは、以下を参考に/usr/local/bin配下におきます。
SafariWebDriverは /usr/bin配下に元々あります。
[【selenium】Firefox/Chrome/SafariのWebDriverインストール](https://qiita.com/hujuu/items/ef89c34fca955cc571ec)

####６）Safariのリモートオートメーション許可
以下を参考にsafariの設定をしておきます
[Safari 10 の WebDriver ネイティブサポート](https://qiita.com/hiroshitoda/items/6ee3ad892357cda3f0e0)

####７）動作確認
先ほどの[Selenium with C# and xUnitのコード](https://github.com/abhinavxebia/seleniumwithxunit)を参考に各ブラウザ実行してみます。
各ブラウザごとに、以下のように変えれば動作確認できます。

```c#:
// Chromeの場合
driver = new ChromeDriver();
// Safariの場合
driver = new SafariDriver();
// FireFoxの場合
driver = new FirefoxDriver();
```
これでWindowsとMacで共有できるテストプロジェクトが作れるかと思います。
Windowsの場合は、Selenium.WebDriver.MicrosoftDriverを入れればEdgeも動作できるかと。

# 注意点
Visual Studioの背面にブラウザ起動するため、フルサイズ表示してると起動しないように見えてハマった。
あと、WebDriverが正しく設定できてない場合、テスト実行時に以下のエラーがでるので、VisualStudioを再起動しましょう。

[エラー内容]
System.NullReferenceException : Object reference not set to an instance of an object.

# 参考記事
[Selenium AND .NET Core 2.0 Preview 2 – it works!](https://www.dotnetcatch.com/2017/06/30/selenium-and-net-core-2-0-preview-2-it-works/)
[Selenium WebDriver + .NET Core 2.0- What Everyone Ought to Know](https://automatetheplanet.com/webdriver-dotnetcore2/)

そういえば、いつの間にかChrome版のSelenium IDEあったのね。
[Chromeウェブストア - Selenium IDE](https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd?hl=ja)
初めましてDash

Dashという便利ツールを購入したので、初期設定とかつらつらと書いていきます。

# What's Dash?

>[Dashの公式サイト](https://kapeli.com/dash)

APIドキュメントやコードスニペットを管理するツールで、RubyやPythonなど２００以上のドキュメントをダウンロードし、高速で検索することができる。

# 初期設定
## ダウンロード、購入
[Dashの公式サイト](https://kapeli.com/dash)で「Download」か「Purchase」のボタンをポチッとな。

## ドキュメントのダウンロード
Downloads > 必要なドキュメントを選択しダウンロードするだけ。ダウンロードするバージョンも指定できる。

<img width="803" alt="スクリーンショット 2018-01-18 22.49.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/158743/78182d7c-4afb-c1c2-448d-2d7ca2b09e75.png">

## テキストエディタ〜などのツールからDashを呼び出す方法確認、設定
Integration > 自分の使っているツールを選択し、Dashの起動方法を確認する。

<img width="706" alt="スクリーンショット 2018-01-18 22.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/158743/1615f7f7-2d12-bbe8-e1cc-c3b55651ad90.png">

Terminalの場合は「open dash://{query}」というキーワードで起動できる。
Terminalよく使う場合はaliasを設定しておくといいかも。

```~/.zshrc
alias od='(){ open dash://$1 }'
```

### IntelliJ IDEAの場合
「IntelliJ IDEA」を選択し、記載通り([IntelliJDashPlugin installation](https://github.com/gdelmas/IntelliJDashPlugin#installation))に設定する。
コマンド + Shift + dで、カーソル上の文字列で検索をかけてくれる。すごく便利！

## キーワードの編集
Docsets > ドキュメントを選択し、キーワードを編集
よく使う言語のキーワードを変更しておくと、入力も簡単になり楽。
(例: ruby: :arrow_right: r: とか)

<img width="688" alt="スクリーンショット 2018-01-18 23.39.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/158743/4546bfd4-8472-8bca-ee5c-5807eb8da478.png">

こうしておけば、

    $ open dash://r:return

Ruby 2の`return`を検索してくれる。

# もっと使い方を覚えたら追記していきます！