OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS7 + Rocket.Chatで、ある日ファイルアップロードができなくなった

以下の補足：

Rocket.Chat構築でちょっと詰まったところまとめ#tmpufs-の権限が不足している
https://qiita.com/ine1127/items/b3d6c1498b0e520ad30f#tmpufs-%E3%81%AE%E6%A8%A9%E9%99%90%E3%81%8C%E4%B8%8D%E8%B6%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B

## 現象

以下と同じ現象＆同じエラーが出た。
しかし、出たのは運用始めてから半年経ってから。

>GridFSの場合、ファイルのアップロードができない
アップロードしたファイルを保存するファイルシステムとしてGridFSを使用した場合に、ファイルをアップロードしてもプログレスバーが0%から進まないという事象です。
どれだけ待っても進まない。
`/tmp/ufs` の権限が不足している
`/var/log/messages` を見ると以下のようなエラーログが出力されていることが確認できます。

```:/var/log/messages
Oct 10 12:15:11 hoge rocketchat: ufs: cannot write chunk of file "hjsjd98n8ZTr9yrS7" (EACCES: permission denied, open '/tmp/ufs/hjsjd98n8ZTr9yrS7')
Oct 10 12:15:11 hoge rocketchat: ufs: cannot delete temp file "/tmp/ufs/hjsjd98n8ZTr9yrS7" (ENOENT: no such file or directory, unlink '/tmp/ufs/hjsjd98n8ZTr9yrS7')
Oct 10 12:15:11 hoge rocketchat: [Error: FileNotFound: no file with id hjsjd98n8ZTr9yrS7 found]
```

実際の環境を見てみると、/tmp/ufsディレクトリ自体がなくなっている。

## 応急処置
/tmp/ufsディレクトリを作成、権限を付与すればよい。

## 原因
CentOS7から導入されたsystemd-tmpfiles-clean.timer が削除したため。
CentOS7の標準では再起動するとディレクトリごと削除する設定になっている。

お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ#落とし穴1-消えるtmp
https://qiita.com/suemoc/items/e29285e8e67263298f35#%E8%90%BD%E3%81%A8%E3%81%97%E7%A9%B41-%E6%B6%88%E3%81%88%E3%82%8Btmp

## 対策
systemd-tmpfiles-clean.timer に設定を追加する。以下、最後の2行。
ディレクトリが存在しなければ作成する。

```:/usr/lib/tmpfiles.d/tmp.conf 
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See tmpfiles.d(5) for details

# Clear tmp directories separately, to make them easier to override
v /tmp 1777 root root 10d
v /var/tmp 1777 root root 30d

# Exclude namespace mountpoints created with PrivateTmp=yes
x /tmp/systemd-private-%b-*
X /tmp/systemd-private-%b-*/tmp
x /var/tmp/systemd-private-%b-*
X /var/tmp/systemd-private-%b-*/tmp

# For RocketChat File Upload
d /tmp/ufs 0755 mongod mongod -
```
Lancers の募集中の案件数を取得 (Beautifulsoup4)

Beautifulsoup のサンプルとして、Lancers の募集中の案件数を取得してみました。

[システム開発・運用の依頼・仕事](https://www.lancers.jp/work/search/system?completed=0)
![lancers_jan0901.png](https://qiita-image-store.s3.amazonaws.com/0/179446/68decf3c-47cd-46ff-a832-5912756fc83b.png)

プログラム

```python3:get_lancers.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	get_lancers.py
#
#					Apr/13/2018
#
# ------------------------------------------------------------------
import requests
import sys
from bs4 import BeautifulSoup
#
url = sys.argv[1]
headers = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0",
        }
#
try:
	response = requests.get(url=url, headers=headers)
	html = response.text
	try:
		result = BeautifulSoup(html, "html.parser")
#
		span = result.find(class_='search-result-counter')
		print(span)
		span_text=span.string
		print(span_text)
#
	except Exception as ee:
		sys.stderr.write("*** error *** in BeautifulSoup ***\n")
		sys.stderr.write(str(ee) + "\n")
#

except Exception as ee:
	sys.stderr.write("*** error *** in requests.get ***\n")
	sys.stderr.write(str(ee) + "\n")
#
# ------------------------------------------------------------------
```

実行スクリプト

```bash
#
URL="https://www.lancers.jp/legacy/work/search/system?completed=0"
#
./get_lancers.py $URL
```

実行結果

```text
$ ./go_lancers 
<span class="search-result-counter" style="float:left">
                77件中1-30件表示            </span>

                77件中1-30件表示
```

次の環境で動作の確認をしました。
>Arch Linux (4.17.13-arch1-1-ARCH)
Python 3.7.0
ワンライナーで遊んでみる

## はじめに
ワンライナーとは一行のみで記述されたプログラムのことです。
今回はよく使うワンライナーを紹介していきます。
（この記事は備忘録も兼ねています）

## 「大量の文字列でファイルを検索したい！」
DBに格納してSQLで行うのは面倒という時におすすめ。
ワンライナーで同じことができます。

## grepの活用で試してみる
単一の任意のファイルから検索文字列を取得し、別の指定ファイルに対して
一つずつ検索文字列でgrepするコマンド。

```cat 検索文字列を含むファイル名 |xargs -I 'line' grep -r 'line' 検索したいファイル```

検索したい文字列が沢山あり、

```grep -e "文字列1" -e "文字列2" -e "文字列3" -e ……（以下略） 検索したいファイル```

上記のように大量に検索文字列を指定したくない場合や、

```grep -E '(検索文字列の一部1)(検索文字列の一部2|検索文字列の一部3)' 検索したいファイル```

のような正規表現で対応出来ない場合に使えるコマンドです。


例えば、電話番号が3個記載されているファイル1と、
10個記載されているファイル2があるとします。

【ファイル1】
XXX-XXXX-XXX1
XXX-XXXX-XXX3
XXX-XXXX-XXX8

【ファイル2】
XXX-XXXX-XXX1
XXX-XXXX-XXX2
XXX-XXXX-XXX4
XXX-XXXX-XXX7
XXX-XXXX-XXX8
XXX-XXXX-XXX9
XXX-XXXX-XX10
XXX-XXXX-XX11
XXX-XXXX-XX13
XXX-XXXX-XX15

これらのファイルを利用して、

```cat ファイル1 |xargs -I 'line' grep -r 'line' ファイル2```

コマンドを実行すると

【出力結果】
XXX-XXXX-XXX1
XXX-XXXX-XXX8
となります。

検索文字列と検索したいファイルのレコード数が多ければ多いほど、
このコマンドは真価を発揮します。
ただし、検索したいファイルが1GB以上で検索文字列が数百超の場合は
あまりやらない方がいいです。(時間がかかるため)

## さらに活用してみる

catの引数に複数ファイルを指定、もしくはワイルドカードを使用すれば、
複数の任意のファイルにも対応することができます。

```cat ファイル1 ファイル2 ファイル3 ファイル4 |xargs -I 'line' grep -r 'line' 検索したいファイル```
```cat *.csv |xargs -I 'line' grep -r 'line' 検索したいファイル```

catコマンドだけでなく、findやlsを使用するとサーチした複数のファイルにも
対応することができます。

```find -name "*.csv" -type f |xargs cat |xargs -I 'line' grep -r 'line'　検索したいファイル```
```ls *.csv |xargs cat |xargs -I 'line' grep -r 'line' 検索したいファイル```

lsではファイル数上限に引っかかる可能性があるため、findコマンドを使用することを勧めます。
……といっても上限に引っかかるほどのファイルで検索するのはオススメしませんが。

もちろんgrepコマンドに他のオプションを使用することも可能です。

例えば、

```cat 検索文字列を含むファイル名 |xargs -I 'line' grep -r -i 'line' 検索したいファイル```

であれば、検索文字列の大文字小文字は区別しないですし、

```cat 検索文字列を含むファイル名 |xargs -I 'line' grep -r -n 'line' 検索したいファイル |sed -e "s/:/,/g"```

であれば、検索し該当したレコードから項番を付与して出力します。


## おわりに
ワンライナーは奥が深いです。
是非、自分だけのワンライナーを作成してみてください。
JS を Immutable に 取り回す

## 気持ち

reducer や rx の世界観からすると、JSのオブジェクトへの副作用は悪です。予測可能性を破壊する者ですし、時系列な状態を復元できなくなります。

Reactの一部の操作では、同一参照のオブジェクトのまま値を書き換えると、更新系が壊れるものすらあります。shallow equal だと参照が一致するからですね。

なので基本的にイミュータブルなデータの取り回しをしましょう。

## どんなコードをやめたいか

```js
const o = { a: 1 }
o.a = 1 
```

この「メンバーへの代入」が基本的にやめた方がいい操作です。

## 宣言

基本的に const で宣言します。
明示的に副作用が起こる箇所だけ let で宣言します。

とはいえ、Array と Object は中身を変更できてしまうので、その辺のイディオムが必要です。

## Object

before

```js
Object.assign({}, a, b, { c: 1 })
```

after

```js
{...a, ...b, c: 1}
```

## Object の部分深い部分の書き換え

```js
const obj = { a: { b: { c: 1, d: 2 } }, e: 3 }
const newObj = { ...obj, a: { b: ...obj.a.b, d: 4 } }
```

が、さすがにだるいので、 immer みたいなヘルパを使うのがおすすめです

https://github.com/mweststrate/immer

```js
const obj = { a: { b: { c: 1, d: 2 } }, e: 3 }
const newObj = immer(obj, draft => {
  draft.a.b.d = 4
})
```

特に配列の immutable 版のAPI を覚え直すのが大変なので、副作用APIスタイルのままイミュータブルオブジェクトを生成できる immer がとてもよいです。

## Array

before

```js
a.concat([b]).concat(c)
```

after

```js
[...a, b, ...c]
```
GithubのコメントからSlackにメンションを飛ばす書き方

## 前提
githubとslackは連携済み

## 概要
pullReqestを修正した時など修正後に
slackでメンションをつけるのがめんどくさかった

<@slack_user>
githubのコメントに上記の書き方をすればメンションが飛んだ
JSXのclassNameのクラスを動的に追加する

公開中ならpublished, 非公開ならunpublishedをclassNameに追加するというイメージ。

## 実装
配列内で三項演算子を使って処理し、そのあとで`join()`を使って連結することで実装できた。

```js
className={[
  'post',
  isPublished ? 'published' : 'unpublished'
].join(' ')}
```

### 参考
[How to add multiple classes to a ReactJS Component
](https://stackoverflow.com/questions/34521797/how-to-add-multiple-classes-to-a-reactjs-component)
Project Euler Q60 【素数ペア集合】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
素数$3, 7, 109, 673$は非凡な性質を持っている. 任意の$2$つの素数を任意の順で繋げると, また素数になっている. 例えば, $7$と$109$を用いると, $7109$と$1097$の両方が素数である. これら$4$つの素数の和は$792$である. これは, このような性質をもつ$4$つの素数の集合の和の中で最小である.

任意の$2$つの素数を繋げたときに別の素数が生成される, $5$つの素数の集合の和の中で最小のものを求めよ.

## 解答

```bash
time seq 3 9999 |
factor |
awk 'NF==2{print $2}' |
tr '\n' ' ' |
awk '{for(i=1;i<=NF-1;i++){for(j=i+1;j<=NF;j++){print $i$j,$j$i,$i,$j}}}' |
factor |
awk 'NR%4==0{print $0} NR%4!=0{printf $0" "}' |
awk 'NF==8{print $6,$8}' |
awk '{if($1!=k){printf "\n"$0" "}else{printf $2" "};k=$1}' |
awk '{for(i=2;i<=NF-1;i++){for(j=i+1;j<=NF;j++){print $1,$i$j,$j$i,$i,$j}}}' |
factor |
awk 'NR%5==0{print $0} NR%5!=0{printf $0" "}' |
awk 'NF==10{print $2,$8,$10}' |
awk '{if($1$2!=k){printf "\n"$0" "}else{printf $3" "};k=$1$2}' |
awk '{for(i=3;i<=NF-1;i++){for(j=i+1;j<=NF;j++){print $1,$2,$i$j,$j$i,$i,$j}}}' |
factor |
awk 'NR%6==0{print $0} NR%6!=0{printf $0" "}' |
awk 'NF==12{print $2,$4,$10,$12}' |
awk '{if($1$2$3!=k){printf "\n"$0" "}else{printf $4" "};k=$1$2$3}' |
awk '{for(i=4;i<=NF-1;i++){for(j=i+1;j<=NF;j++){print $1,$2,$3,$i$j,$j$i,$i,$j}}}' |
factor |
awk 'NR%7==0{print $0} NR%7!=0{printf $0" "}' |
awk 'NF==14{print $2+$4+$6+$12+$14}'
26033

real    0m3.095s
user    0m5.717s
sys     0m0.140s
```

これも結局総当たりで解いた。フィルタコマンドの特性上、「○○を抽出する」や「○○以外を抽出する」といったロジックになってしまう。
よって、$2$つの素数をとって、くっつけて、`factor`して合成数だったら除外する、という操作を繰り返した。
グラフ理論というものを使用すればもう少し楽に解けるらしいが、持っていない知識だったし、ワンライナーで活かせるか分からなかったので特に調べなかった。
もしかしたらもう少し短くできるのかもしれない。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/060.html

## 参考にさせて頂いたサイト様
[Project Euler 60 _ 素数ペア集合 - PEをMathematicaで](http://variee.hatenadiary.com/entry/2017/05/17/003000)
Google Play Consoleでアップロードエラーが出るときの回避策

Google Play ConsoleでAndroidアプリの公開作業をしていたときにスクリーンショットやアプリアイコンを登録できないことがあったのですが問い合わせにより解決したのでメモしておきます。

## 環境と症状

環境は下記です。

```
Macbook Air, Mac OS X 10.13.2（High Sierra)
Chrome バージョン63
```

画像ファイルを選択すると下記のようなエラーが発生して画像がアップロードができません。

![file.png](https://qiita-image-store.s3.amazonaws.com/0/3516/ba93b671-b39d-29e1-16be-ec241f457ed9.png)

ブラウザのコンソールを確認したところ画像アップロードAPIと思われるリクエストが `４００` を返しているようでした。

## やったこと

- Cookieを削除してみる
- シークレットモードで試す
- 他のブラウザで試す
- 再起動してみる

ググってもあまり情報がなかったのでAPKのアップロードが出来ない系の操作をいろいろ試したけどどれもダメで、サポートにチャットで問い合わせたところ解決しました。

## 原因と対策

アクセスしていたURLの末尾にスラッシュが無かったため、処理が正常に行われないということでした。

![うまく動作しない方のURL](https://qiita-image-store.s3.amazonaws.com/0/3516/9f439d83-5614-3d2f-913b-5f48267349f8.png)

このパスにスラッシュを付けたところ正常にアップロードできるようになりました。

```
// Before
https://play.google.com/apps/publish?account=XXXXXX

// After
https://play.google.com/apps/publish/?account=XXXXXX
```

あまりこれでハマる人はいないのかもしれませんが、ハマると手がかりがほとんど無いのでメモしておきたいと思います。
grafanaをインストールしてみる。

初心者ながらgrafanaをつかって見ようと思う。

【GrafanaLabo】
https://grafana.com/grafana/download

apt install grafanaでインストールできるけど、
公式から落とさないとバージョンが古すぎて…。（多分問題ないけど、どうせなら新しいのじゃないとバグとかあったらやだし。）


パッケージダウンロード。
`wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.6.3_amd64.deb`

インストール。
`sudo dpkg -i grafana_4.6.3_amd64.deb` 

エラーがでる…。

どうやらフォントが必要らしい。
`libfontconfig` というパッケージが必要らしいけど、これを入れるために依存関係が結構あるらしく、
下記コマンドで必要なものを入れないとだめぽい
↓
`sudo apt install fonts-dejavu-core ttf-bitstream-vera fonts-freefont-ttf gsfonts-x11 fontconfig-config gsfonts xfonts-utils libfontenc1 libxfont1 x11-common xfonts-encodings`

その後、
`sudo apt install libfontconfig`
で必要なパッケージが入る。



```
~$ sudo dpkg -i grafana_4.6.3_amd64.deb
(Reading database ... 56452 files and directories currently installed.)
Preparing to unpack grafana_4.6.3_amd64.deb ...
Unpacking grafana (4.6.3) over (4.6.3) ...
Setting up grafana (4.6.3) ...
Restarting grafana-server service... OK
Processing triggers for systemd (229-4ubuntu16) ...
Processing triggers for ureadahead (0.100.0-19) ...

~$ netstat -nlpt
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 :::3000                 :::*                    LISTEN      -
```

無事インストールできた…。
ブラウザ
プロセス見ると3000番でリスニングしてる。
admin/admin (←デフォルトのIDとPass)でログイン。

無事インストールできました。
CentOS 7 にSEP14をインストールする際のメモ

備忘録

インストーラーの圧縮ファイルは解凍済み＆カレント移動済みを想定

`# yum install -y libX11.so.6 kernel-devel`

`# chmod u+x install.sh`

`# ./install.sh -i`

ずっとWindowsを触ってきたからだいぶ苦戦した・・・細かいバージョンとかも書いた方
がいいんだろうな。そのうち書こう。
Canvasに滑らかな筆のような線を描く

#Canvasに滑らかな線を描きたい
大学生の時にFlashで作っていた書道風お絵かきアプリをJSで書き直してみました。
https://fujiformat.com/astro_pen/
※今回はスマホ版の話になります。

書道風ですので筆で描いたように線の太さが変化するように作っています。（体験したい方は[設定]からモードを「筆」にしてみてください。）一般的にこうしたスマホでcanvasにお絵かきをするアプリは線（lineTo）を使って軌跡を描くと思いますが、それだと指を早く動かす「撥ね」などの時にいびつな線が出来てしまうので、今回はちょっと重いですが、滑らかな線を描くプログラムを書いてみました。
![DTEt-a0U8AAhiN6.jpg](https://qiita-image-store.s3.amazonaws.com/0/82103/dec8be77-2cb5-c543-c19f-a4809e13cad8.jpeg)
描いてみた字です。※一部重ね書きしました。


#一般的なコードとその弱点
まずlineToで描くプログラムの仕組みです。
簡単に仕組みを説明しますと指を動かすと一定時間ごとにその座標がとられ、それを直線を使って繋ぐことで軌跡が描かれます。（例えばこちらの方の記事のような：https://qiita.com/mo49/items/eff5156ec9e9999e305b）

通常のお絵かきアプリならこれでいいのですが、今回のように太さを変化させる場合、変化する太さの量を軌跡の数で割って各軌跡の太さを変えていくことになります。方法としてはペンを動かし座標を取得したときに画面を押している強さ(e.touches[0].force)を取得し、それを軌跡の太さに変換します。しかし、現状のスマホの性能ですと指を早く動かしたときに座標間の距離が大きくなってしまい、ぼこぼこの線になってしまいます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/82103/390f74ba-2fb8-b09c-6ecc-8fde65dc331f.png)
イメージ

#コードの改善
そこで本アプリでは直線の代わりに円を使い、一定時間ごとに指の座標を取得。現在の座標と「現在の座標と直前の座標の間」へ円を補間して描くプログラムへ変更しました。これでしたら取得された座標間が開いていても補間する円の数だけ太さの分割量が多くなり、滑らかな太さの変化がある線が描けます。

追記：一部変数の情報を書き忘れていましたので修正しました。

```js
	/*設定*/
	//補間する円の数（今回は50）
	divide_num=50;
	//円弧の始点と終点(0度から360度まで描く→円になる)
	pen_head_start_angle=0 * Math.PI / 180;
	pen_head_end_angle=360 * Math.PI / 180;
	//canvas要素とそのcontextを取得。今回はid=media
	const cvs = document.getElementById("media");
	const ctx = cvs.getContext("2d");

	/*ペンを動かしたとき(touchmoveとか)*/
	//画面を押している強さを取得。
	pen_force = e.touches[0].force;
	d_force=pen_force-old_force;

	//canvasの表示位置のズレを取得
	offsetx = $("#media").offset().left;
	offsety = $("#media").offset().top;

	//指のタッチ位置を取得
	new_x=e.changedTouches[0].pageX;
	new_y=e.changedTouches[0].pageY;
	//前回の指位置との差を計測
	dx=new_x-old_x;
	dy=new_y-old_y;

	//補間線を描く
	ctx.beginPath();
	for(i=0; i<divide_num; i++){
		ctx.arc(old_x+dx/divide_num*i-offsetx,
		old_y+dy/divide_num*i-offsety,
		(old_force+d_force/divide_num*i)*20,
		pen_head_start_angle,
		pen_head_end_angle, true);
	}
	ctx.fill();

	//古い座標、太さに現在の座標、太さを格納
	old_x=new_x;
	old_y=new_y;
	old_force=pen_force;

	/*ペンを動かしはじめたとき(touchstartとか)*/
	old_x=e.changedTouches[0].pageX;
	old_y=e.changedTouches[0].pageY;
	old_force=0;
```

![0PBw526y.png](https://qiita-image-store.s3.amazonaws.com/0/82103/656dac59-6b1b-c3e6-d256-3146a702ae15.png)
爪とかつかって押す強さを変えながら描くとこんな感じで描けます。
（iPhoneだともっと繊細に描けるようです）

#forceが取れない機種の対応
iPadなど一部機種ではforceが取得できませんでしたので、固定値にするモードも作成しました。
（上記プログラムでそのモードの時、pen_forceに0.1を設定してあります。）
公開しているアプリはそちらがデフォルトになっています。

#おまけ
今回は首題が太さが滑らかに変化する線が描けるプログラムなので作りませんでしたが、応用すれば透明度や虹色に変化する線も描けます。
Java HashMap 转 js json格式

##背景
我在安卓的开发中有个需求，安卓本地端的数据需要和WebView的javascript的api进行交互。而javascript的交互数据通常是以jason格式进行的，所以需要把java中的对象数据转为字符串的jason格式。
目前的问题是，javascript的写法比较灵活，直接写一段字符串然后定义自己想写的key，针对每一个key，你都可以写自己想写的数据格式，比如字符串，数组，object，数组等。但是对于以严谨为要求的java来说，这似乎变得不是那么理所应当了。


![スクリーンショット 2018-01-09 11.57.49.png](https://qiita-image-store.s3.amazonaws.com/0/191439/1cdbfb58-b3d6-a2ba-1ea0-952c8dc32ec7.png)


目前我所知道的最简单的办法就是HashMap和JSONObject这两个类来实现
简单来说的话就是把想要组成jason的变量放到一个HashMap类型的对象里，然后再用JSONObject对这个对象进行加工，得到js能够处理的json字符串


![スクリーンショット 2018-01-09 14.11.50.png](https://qiita-image-store.s3.amazonaws.com/0/191439/dd5d3a02-d074-5af5-1193-244ab1b0ad93.png)

```java:convert.java
        //first you construct the HashMap data
        HashMap<String,Object> hashmap = new HashMap<String,Object>();
        hashmap.put("name","syoui");
        hashmap.put("age",27);
        int[] checkInList = {1,3,5,7,8,10,12};
        hashmap.put("checkInList",checkInList);

        //second you convert the HashMap data into String json data
        JSONObject jsonObject = new JSONObject(hashmap);
        Log.d("the convert result",jsonObject.toString());

```

`日志显示結果
D/the convert result: {"name":"syoui","checkInList":[1,3,5,7,8,10,12],"age":27}
`

另外HashMap里是支持嵌套HashMap的，这种就是指定一个key下面再次套用HashMap所以说，HashMap的写法会让你有一种回到写js的感觉

```java:convert.java
        HashMap<String,Object> sub_hash_map = new HashMap<String,Object>();
        sub_hash_map.put("name","liaoliao");
        sub_hash_map.put("age",30);
        int[] sub_check_list = {2,4,6,9,11};
        sub_hash_map.put("checkInList",sub_check_list);
        hashmap.put("child",sub_hash_map);
```

`日志显示結果
D/the convert result: {"name":"syoui","ticket":null,"age":27,"child":{"name":"liaoliao","checkInList":[2,4,6,9,11],"age":30},"checkInList":[1,3,5,7,8,10,12]}
`
CodeMirrorで他クライアントのカーソル（キャレット）の位置を表示する方法

[「CodeMirror」](http://codemirror.net/)でリアルタイムに同時に、エディタ編集中の他の人（他クライアント）のカーソル（キャレット）の位置を表示する方法を説明します。

本記事の内容を応用すれば、下図のような感じで、他のクライアントのカーソルの位置を様々な色で表示することも可能です。

![cattaz_cursor.png](https://qiita-image-store.s3.amazonaws.com/0/227024/d8ee9a02-0a2f-8c68-159d-476635e54d7d.png)

この機能は、富士通研究所のOSSであるMarkdownベースのコラボレーションツール**「Cattaz」**に実装しています。

[Cattazの公式ページ](http://cattaz.io/index-ja.html)

[GitHub - Cattaz](https://github.com/FujitsuLaboratories/cattaz)

# 前置き

カーソルを表示する部分に焦点を当て説明するため、以下の説明については省略します。

* CodeMirrorエディタの入力イベントの取得
* CodeMirrorエディタ間の通信

# 方法

CodeMirrorの以下のAPIを利用します。

[setBookmark](http://codemirror.net/doc/manual.html#setBookmark)

このAPIを利用することで、自ら生成したDOMノード（マーカー/表示したいデザイン）をエディタ上の指定した位置に挿入できます。

つまり、他クライアントから送られてきたカーソルの位置情報の場所に、何かしらスタイルを装飾したDOMノードを追加できます。

それにより、他クライアントのカーソル位置を表示することができます。

以下に、DOMノードを生成して、そのDOMノードを指定したエディタ上の位置に「setBookmark」でセットするコードの例を示します。

（ES2015（ES6）でのコードの書き方で説明）

```javascript
// cm：CodeMirrorのインスタンス
// cursorPos：他クライアントから送られてきたカーソルの位置（CodeMirrorにおける {line, ch} のこと）

// DOMノード（マーカー/表示したいデザイン）を生成
const cursorCoords = cm.cursorCoords(cursorPos);
const cursorElement = document.createElement('span');
cursorElement.style.borderLeftStyle = 'solid';
cursorElement.style.borderLeftWidth = '2px';
cursorElement.style.borderLeftColor = '#ff0000';
cursorElement.style.height = `${(cursorCoords.bottom - cursorCoords.top)}px`;
cursorElement.style.padding = 0;
cursorElement.style.zIndex = 0;

// 上記で生成したDOMノードを他クライアントから送られてきたカーソルの位置にセット
// setBookmarkの第1引数：他クライアントから送られてきたカーソルの位置
// 第2引数内のwidget：生成したDOMノード
marker = cm.setBookmark(cursorPos, { widget: cursorElement });
```

DOMノード生成の部分は、自分の好きなようなスタイルにすると、かっこよくできます。

上記の例は、普通のカーソルのような縦線のデザインです。

setBookmarkで付加したDOMノードは、そのままですとエディタ上の挿入した位置に残り続けるため、他のクライアントからカーソル位置が送られてくる度に、一度以下のようにsetBookmarkのclear()メソッドで挿入したDOMノードを削除し、それから新規にDOMノードを再度挿入すると良いです。

```javascript
// 挿入したDOMノードのクリア
// marker：setBookmarkのインスタンス
marker.clear();
```

## 処理の一連の流れ

処理の大まかな一連の流れの例は以下です。

1. CodeMirrorエディタの入力イベントからカーソルの位置を取得する
2. 取得したカーソルの位置を Websocket通信などを用いて他クライアントへ送信する
3. 他クライアントから送られてきたカーソルの位置を受信したクライアントは、前にsetBookmarkで挿入したDOMノードが存在していたら削除する
4. 受信したカーソルの位置に、マーカーとなるDOMノードをsetBookmarkで挿入する

また、各クライアントから受信したカーソル位置を各クライアントごとに管理すれば、複数のクライアントのカーソルを同時に表示できるようになります。

# まとめ

以上のようにして、CodeMirrorのAPIの**「setBookmark」**を利用すれば、他クライアントのカーソルの位置を表示できます。

この機能は[「Cattaz」](http://cattaz.io/index-ja.html)にも実装していますので(2018年1月9日現在)、そちらのソースコードも見ると参考になるかもしれません。

[GitHub - Cattaz](https://github.com/FujitsuLaboratories/cattaz)
自分のGitHubにPushする


Githubのリポジトリから

###1.まず、自分のpushする名前を決めて登録

`git remote add [kaie]`

※[  ]の箇所は自分で自由に決める

###2.登録した名前からその名前からpush

`git push [kaie(origin)] master`

###3. 自分のGitの追加を確認

`git remote -v`

ここで、origin、masterは何か、登録した名前は何にしてるかなどの確認
commitのブランチを分けて(切って)作業


commitして、違う作業などする時ブランチを分けて作業すると便利。

### 方法
1.自分の今のブランチが確認出来る
git brunch

2.新しいブランチを作る
git checkoout -b [新しく登録するname]

### PhpStormで確認する方法
・今どのブランチなのかの確認は、画面右下クリックで変更、確認できる
※リロードが遅い場合がある

![スクリーンショット 2018-01-09 14.05.23.png](https://qiita-image-store.s3.amazonaws.com/0/145590/55daf0d9-6ab1-eebf-9336-2b07768fd360.png "スクリーンショット 2018-01-09 14.05.23.png")

### Github上での確認方法
・画面左上の「△」でブランチを切り替える。


![スクリーンショット 2018-01-09 13.47.24.png](https://qiita-image-store.s3.amazonaws.com/0/145590/d54045fb-a461-ea1b-d5ec-1cabac53640e.png "スクリーンショット 2018-01-09 13.47.24.png")
（自分用メモ）GrADSでユーザ定義拡張機能を使う際の注意点

基本的には下記サイト
http://seesaawiki.jp/ykamae_grads-note/d/GrADS%a5%e6%a1%bc%a5%b6%c4%ea%b5%c1%b4%d8%bf%f4%a1%a6%b5%a1%c7%bd%b3%c8%c4%a5
を参照すれば十分だが，環境によってほんの少しだけ異なるようなのでメモ．
上記サイトを参考にして上手くいかない場合は，以下サイト
https://sites.google.com/site/unumahp/drawing/grads
を参照したらだいたい上手くいくと思われる．


# 環境
Linux 2.6.32-573.8.1.el6.x86_64

# 注意点

## OpenGrADSのインストール
x86_64とあるので，これに対応するバージョンのものをインストールする．今回は2.1.0.oga.1というものをインストール．
下記リンク
https://sourceforge.net/projects/opengrads/files/
の，
Home/grads2/2.1.0.oga.1(適当なバージョン)/Linux/
に移動し，ファイル名に"x86_64"が入っている方をインストール．
管理者ではない場合，以下のように自分のhomeディレクトリにインストールした圧縮ファイルを置く．
/home/directory_user/grads-(version_name).tar.gz
で，gunzip & tar xvf で展開．

## extensionsのインストール
2.0以降の場合，デフォルトでextensionsがincludeされているものと思われる．よって，2.0以降を使う場合は別途インストールは必要ない．

## .bashrcの設定
以下のように，bashrcに追加する．

```bash:.bashrc
#OpenGrADS
export GRADSHOME=/home/directory_user/grads-2.1.0.oga.1/Contents/Linux/Versions/2.1.0.oga.1
export PATH=${GRADSHOME}/Contents:${PATH}
export GABIN=${GRADSHOME}/x86_64
export GAUDXT=${GRADSHOME}/x86_64/gex/udxt
export LD_LIBRARY_PATH=${GRADSHOME}/x86_64/gex:${LD_LIBRARY_PATH}
alias opengrads=/home/directory_user/grads-2.1.0.oga.1/Contents/grads
```

UDFを使用しない場合は，GAUDFTは記入しなくてよい．
設定が終わったら，source .bashrc で有効化．
ターミナル上で"opengrads"と打ち，GrADSが立ち上がればOK．
MackerelでMySQLサーバとの接続を監視する


```
[plugin.checks.mysql_connectivity]
command = "MYSQL_PWD=password mysqladmin status --host=$MYSQL_HOST --user=$USER || exit 2"
```

mysqladminの異常時の終了ステータスは1です。
Mackerel Checkプラグインの仕様では、1がWarning、2がCriticalとなります。
接続に不具合があった場合、Criticalで通知してほしいので`||`で繋いで2に変更しています。
Javascriptで指定した配列の要素を削除する

# Javascriptで指定した配列の要素を削除する
Javascriptで指定した配列の要素を削除する。
なお、本記事は[[Javascript] 配列から特定の要素を削除する(訂正有り) - Qiita](https://qiita.com/_shimizu/items/b8eac14f399e20599818)を大変参考にさせていただいた。

## ポイント(以下は、ES6以降ではあんまり推奨されないので、追記を参照。)
~~1. array.forEachで、配列の各要素とindexの数字を各処理で使用する~~<br>
~~=> 参考 :[Array.prototype.forEach() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)~~
~~2. 配列の要素が、指定した値(今回は1)だったら、3の処理を行う~~
~~3. array.spliceでindex番目から1個分の要素を削除する<br>~~
~~=> 参考 :[Array.prototype.splice() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)~~


## ~~コード~~
~~0~4の配列から1を指定し、削除する。~~

```js
const array = [0, 1, 2, 3, 4];

console.log(`before : array = ${array}`);

array.forEach((item, index) => {
    if(item === 1) {
        array.splice(index, 1);
    }
});

console.log(`after : array = ${array}`);
```

## ~~実行結果~~

```
before : array = 0,1,2,3,4
after : array = 0,2,3,4
```

## 追記
ES6ならfilterで新しいarrayを生成した方が良いとのコメントでご指摘いただきました。
ありがとうございます。
以後はこちらを使用させていただきます。

```js

const array = [0, 1, 2, 3, 4];
console.log(`before: array = ${array}`);

const newArray = array.filter(n => n !== 1);

console.log(`after: array = ${newArray}`);
``` 

## 追記の実行結果

```
before : array = 0,1,2,3,4
after : array = 0,2,3,4
```

## 参考にさせていただいたサイト
[[Javascript] 配列から特定の要素を削除する(訂正有り) - Qiita](https://qiita.com/_shimizu/items/b8eac14f399e20599818)
[Array.prototype.forEach() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
[Array.prototype.splice() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
direnv で AWSのアカウントを自動的に切り替える

複数のAWS IAMアカウント（例えば会社用と自分用）を使っているときに、間違って他のアカウントを使わないようにしたい。「`--profile`」オプションで環境を切り替える事もできるが、付け忘れたりするリスクがある。

試行錯誤・運用した結果、ホームディレクトリに「`~/.aws/credentials`」を置かず、 `direnv` を使って環境変数で設定する方法に落ち着いた。

direnvのインストール方法とかはこちらを参考に。

- [GitHub - direnv/direnv: Unclutter your .profile](https://github.com/direnv/direnv)
- [direnvを使おう - Qiita](https://qiita.com/kompiro/items/5fc46089247a56243a62)

## .envrcをどこに配置するか

大抵、該当のリポジトリに移動してから作業を行うため、リポジトリに配置してもよい。しかし、複数のリポジトリで同じAWSアカウントを使いたいこともあるので、Organizationのレベルに `.envrc` を配置している。

```
~
├── github.com
│  ├── .envrc
│  ├── bar
│  └── foo
└── github.office.example.com
   ├── .envrc
   ├── baz
   └── qux
```

`.envrc` の中身については以下の通り。

```
export AWS_ACCESS_KEY_ID='xxxxxxxxxxxxx'
export AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxx'
```

必要であれば `source_env ..` などで上の階層を読み込むとよい。


## References
- [GitHub - direnv/direnv: Unclutter your .profile](https://github.com/direnv/direnv)
- [direnvを使おう - Qiita](https://qiita.com/kompiro/items/5fc46089247a56243a62)
- [aws-cliの導入とAWS Credentialの設定 - リジェクトされました](http://ri.hateblo.jp/entry/2017/08/22/020853)
C++ Builder 10.2 Tokyo > WidthとClientWidthの違い on (Win7, Win8.1, Win10) > 同じように違う | フォーム外側の枠: Win10にはない

```txt:ビルド環境
RAD Studio 10.2 Tokyo Update 2 + Windows 10 Pro (v1709)
```

```txt:実行環境
Windows 10 Pro (v1709)
Windows 8.1 Pro
Windows 7 Pro
```

[C++ Builder 10.2 Tokyo > フォームの座標位置 > WidthでなくClientWidthを使う (Win10対応)](https://qiita.com/7of9/items/03f15ee131ff7acf7093)
にて気になったフォームの座標位置。

症状(Width使用時)

- Windows 10: 子フォーム間に空きが生じる
- Windows 7, Windows 8.1: 子フォーム間には空きは生じない

WidthとClientWidthの定義が異なるのだろうと推測してみた。

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TImage *Image1;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TForm2 *form2 = new TForm2(this);

	Image1->Canvas->Brush->Color = clRed;
	Image1->Canvas->FrameRect(Rect(0, 0, form2->Width, form2->Height));

	Image1->Canvas->Brush->Color = clBlue;
	Image1->Canvas->FrameRect(Rect(0, 0, form2->ClientWidth, form2->ClientHeight));

	delete form2;
}
//---------------------------------------------------------------------------
```

### 実行

Windows 10 (赤色が子フォームのWidth, 青色がClientWidth)。
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2d1ef35b-c11a-9fd2-c642-58ebd0fb958f.png)

Windows 8.1
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0c6c8168-44a7-b41f-24d1-01e30198b898.png)

Windows7
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/44f28d21-0fb3-a0c6-9354-eef308554429.png)


WidthとClientWidthの違いについては、全部一緒だった。
冒頭の違い({Win7,Win8.1}と{Win10}の違い)は別の理由から発生しているようだ。

別途気づいた点として、Windows 10の場合、上記の画像からも見られるように「外側の枠」がない (左、右、と下側)。
この枠の分だけWin7,Win8.1とは異なる。

https://qiita.com/7of9/items/426360c66715d276bc0d
に見られた子フォーム間の「空き」はこの枠の有無によるようだ。

フォームの位置調整をする場合、ClientWidth, ClientHeightを使っておけば、関連する問題は回避できるのだろう。


### 追記
(2018/04/25)

> フォームの位置調整をする場合、ClientWidth, ClientHeightを使っておけば、関連する問題は回避できるのだろう。

ClientHeightを使った場合、Captionの高さが考慮されない高さ情報になる。
ClientHeightを使わない方がいいかもしれない。
JavaScriptで2つの配列の差分を抽出する

# JavaScriptで2つの配列の差分を抽出する
JavaScriptの2つの配列で、どちらか一方に含まれている要素を表示するような処理を行う。
今回は、サンプルのためにforEachの中に条件分岐を書いて、console.logで表示するだけにしているが、他のオペレータを使って、色んな処理を追加することもできそう。

なお、本記事は[js 二つの配列の差分を求める - Qiita](https://qiita.com/may88seiji/items/b8fe10ebd33c0cdaf601)を大変参考にさせていただいた。

### ポイント
1. array.concatで、2つの配列を連結させた新しい配列を生成する
=> 参考:[Array.prototype.concat() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)

2. array.forEachで1で生成した新しい配列の各要素に対して3の操作を行う
=> 参考:[Array.prototype.forEach() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)

3. array.includesで指定した要素が、arrayに含まれているかどうかの確認を行う
=> 参考:[Array.prototype.includes() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)


```js

const array1 = [0, 1, 2, 3, 4];
const array2 = [0, 6, 2, 3, 4];

array1.concat(array2)
    .forEach(item => {
        if (array1.includes(item) && !array2.includes(item)) {
            console.log(`array1に含まれていて、array2に含まれていない : ${item}`);
        } else if (!array1.includes(item) && array2.includes(item)) {
         console.log(`array1に含まれていなくて、array2に含まれていてる : ${item}`);
    }
})
```

結果

```
array1に含まれていて、array2に含まれていない : 1
array1に含まれていなくて、array2に含まれていてる : 6
```

参考にさせていただいたサイト
[js 二つの配列の差分を求める - Qiita](https://qiita.com/may88seiji/items/b8fe10ebd33c0cdaf601)
[Array.prototype.includes() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes)
MMD4MecanimのモーフアニメをUnity2017新機能Timelineから使いたい(更新中)

MMD4MecanimのモーフアニメはTimelineのAnimationTrackでは動作しない。
踊って貰った動画を楽に作成するためにもこれを何とかしたい。

通常はヘルパーを使って予め音に合わせて作ったデータを再生するだけなのだけど。
いろんなアニメを作ってUnity上で組み合わせる場合はそうはいかない。

（続く）
[AWS]ACMの期限確認を自動にしてSlackに飛ばすようにしてみた

AWSからACMの更新メールが来ないときあるので、念のため作ってみた
速攻作ったので、クレーム一切受け付けません

jq不使用
複数アカウント対応

```
#!/bin/bash

now=`date "+%s"`
_lockfile_dir=/***/***/.acm-tmp-lock
_lockfile=${_lockfile_dir}/acm_check.lock

[ -d ${_lockfile_dir} ] || mkdir ${_lockfile_dir}

if [ -f ${_lockfile} ]; then
    echo "LOCKED"
    exit 1
fi

#Create LockFile
touch ${_lockfile}

_conf=/***/***/conf/
_date=`date`

for _confgile in `ls -1 ${_conf}|grep knife.rb`
do
    _title=`echo ${_confgile} | sed 's/\-knife.rb//g'`
    _region=`grep region ${_conf}${_confgile} | cut -d '=' -f 2 | cut -d '"' -f 2`
    chanel_name='#chanel-name'

    all_region=(us-east-2 us-east-1 us-west-1 us-west-2 ap-south-1 ap-northeast-2 ap-southeast-1 ap-southeast-2 ap-northeast-1 ca-central-1 eu-central-1 eu-west-1 eu-west-2 sa-east-1)
    for region_all in ${all_region[@]}
    do
      for acmid in `aws --profile ${_title} --region ${region_all} acm list-certificates --output text | awk -F " " '{print $2}'`
      do

        certificate_name=`aws --profile ${_title} --region ${region_all} acm describe-certificate --certificate-arn ${acmid} --query Certificate.[DomainName] --output text`
        certificate_use=`aws --profile ${_title} --region ${region_all} acm describe-certificate --certificate-arn ${acmid} --query Certificate.[InUseBy] --output text`
        certificate_unix_time=`aws --profile ${_title} --region ${region_all} acm describe-certificate --certificate-arn ${acmid} --query Certificate.[NotAfter] --output text | awk -F "." '{print $1}'`
        if [ "${certificate_unix_time}" != "None" ]; then
         jst_time=`date -d @$certificate_unix_time`
         rema_check=`expr $certificate_unix_time - $now`
         rema_time=`expr $rema_check / 86400 + 1`
        fi

         if [ $rema_time -lt 40 ] && [ -n "${certificate_use}" ]; then
           curl -X POST --data-urlencode "payload={\"channel\": \"$chanel_name\", \"username\": \"ACM-Alert\", \"text\": \" Warning remaining $rema_time day $certificate_name $region_all\", \"icon_emoji\": \":warning:\"}" https://hooks.slack.com/
         elif [ $rema_time -lt 40 ]; then
           curl -X POST --data-urlencode "payload={\"channel\": \"$chanel_name\", \"username\": \"ACM-Alert\", \"text\": \" Info remaining $rema_time day $certificate_name but Not Use ACM $region_all\", \"icon_emoji\": \":warning:\"}" https://hooks.slack.com/
         else
          echo "[Remaining] ${rema_time}day" #ファイルに吐いてもいいと思う　なんでもいい
         fi

      done
   done
done

rm -f ${_lockfile}
```

動かなくても何も言わないでね！！
そのうちDocker化してみる
Proguardでログ出力を削除する

リリースビルドする際に、ログ出力しないように設定したものの
adb logcat でログを見てみるとキッチリ出ていました。
原因究明に数時間使ってしまったので
他の人もハマらないようにメモ

# 環境
Android Studio 3.0.1
Build #AI-171.4443003, built on November 10, 2017
JRE: 1.8.0_152-release-915-b01 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
Gradle 4.1

# Proguardでログ出力を削除するには
以下のようにします。

```build.gradle

    buildTypes {
        release {
            // プロガードを有効にする場合は true にする
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    
```

# ハマリポイント
Proguardの設定ファイルproguard-rules.proで
デフォルトの設定で
ユーティリティログクラスがコメントアウトされてました…

```proguard-rules.pro
# strip logging
#-assumenosideeffects public class android.util.Log {
#    public static *** v(...);
#    public static *** d(...);
#    public static *** i(...);
#    public static *** w(...);
#    public static *** e(...);
#    public static *** wtf(...);
#}
#-assumenosideeffects public class android.util.Log;
```

なので

```proguard-rules.pro
# strip logging
-assumenosideeffects public class android.util.Log {
    public static *** v(...);
    public static *** d(...);
    public static *** i(...);
    public static *** w(...);
    public static *** e(...);
    public static *** wtf(...);
}
#-assumenosideeffects public class android.util.Log;
```
こうします。ビルドして…
これでログが出ないようになります。
AWS S3でMavenリポジトリを構築する

# Mavenリポジトリが必要な場合
社内などプライベートな環境でJavaライブラリを管理したい場合は多いと思います。
ある程度の規模になると[Nexus](http://www.sonatype.org/nexus/)を導入したりしますが、もう少し手軽に実現したい時もあります。
このエントリは、AWS S3を利用してMavenリポジトリを構築する方法です。

## 手順
以下の順でMavenリポジトリを作成、使用します。
1. S3にMavenリポジトリ用のBucketを作成
2. S3のMavenリポジトリにアクセスするためのユーザ作成
3. Gradleのpluginでライブラリの登録設定
4. ライブラリを利用するためのクライアント設定


## 1. Mavenリポジトリ用のBucketを作成
特筆すべきことはなく通常通り、S3のBucketを作成します。
ここでは`my-maven`というBucketを作成したとします。

## 2. Mavenリポジトリにアクセスするためのユーザ作成
必須ではないですが、適切なアクセス制御のために、Mavenリポジトリ用のユーザを作成し、S3のアクセス権限を追加します。
また、このタイミングでAWSの`Access key ID`と`Secret access key`を取得します。

```JSON:アクセスポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-maven",
                "arn:aws:s3:::my-maven/*"
            ]
        }
    ]
}

```

## 3. Gradleのpluginでライブラリの登録設定
`maven-publish`プラグインを適用し、ライブラリを登録するための設定を行います。

```Gradle:build.gradle
apply plugin: 'maven-publish'

def tag = System.getenv('CIRCLE_TAG') // git tagのプッシュを検知 (CircleCIの場合の例)
def buildVersion = "1.0.0"
group = 'com.example'
version = tag ? "${tag}-RELEASE" : "${buildVersion}-SNAPSHOT" // tagプッシュの場合RELEASE、それ以外はSNAPSHOTとする (このあたりは実際の運用に合わせて指定)

// リポジトリ登録するライブラリにソースも含めるため
task sourceJar(type: Jar) {
    from sourceSets.main.allJava
}

publishing {
    repositories {
        maven {
            url "s3://my-maven"
            credentials(AwsCredentials) {
                accessKey System.getenv('AWS_ACCESS_KEY_ID')
                secretKey System.getenv('AWS_SECRET_ACCESS_KEY')
            }
        }
    }
    publications {
        mavenJava(MavenPublication) {
            from components.java
            artifact sourceJar {
                classifier "sources"
            }
        }
    }
}
```

以下のコマンドで、ソースのビルドと、リポジトリ登録を行います。
通常はCIなどを経由して利用することになると思います。

```bash
$ gradle publish
```

## 4. ライブラリを利用するためのクライアント設定
作成したMavenリポジトリをクライアント側で追加すれば、他のリポジトリと同様に利用できるようになります。

```Gradle:build.gradle
repositories {
	mavenCentral()
	// 以下を追加
	maven {
		url "s3://my-maven"
		credentials(AwsCredentials) {
			accessKey System.getenv('AWS_ACCESS_KEY_ID')
			secretKey System.getenv('AWS_SECRET_ACCESS_KEY')
		}
	}
}
```

## まとめ
構築も簡単なので、ライブラリ管理が必要になったときの手段の1つとして有効です。
また、今回の例はGradleでしたが、Mavenでも同様のことができます。
ZenPad 3 8.0 Z581KLとBSKBB24のショートカットキー一覧(日本語入力切替他)

#はじめに
恐らくBSKBB24シリーズのBlueToothキーボードを買ったユーザーが悩む問題代表は「日本語入力切替方法がわからない」ことじゃないかなと思う。(ちなみにこれは【Alt】+【Space】キーでできる)
それ以外のショートカットキーをあまり使わないので、これを機に色々調べて整理してみる。

##調べた環境
タブレット:ZenPad 3 8.0 Z581KL(Android OS)
キーボード:BSKBB24
※網羅的に調べたわけではないのであしからず

##Alt(option)キー
- 【Alt】+【Space】キー :日本語入力（ローマ字）⇔半角英数 
- 【Alt】+【Tab】キー :今開いているアプリのウィンドウ一覧を表示する。
【Alt】キーを押しっぱなしにしながら【Tab】キーを入力すると、ウィンドウの切替ができる。【Alt】キーを離すとそのウィンドウを開く。


##Fnキー
- 【Fn】+ ~ :ホーム画面に戻る
- 【Fn】+ 1 :画面のロック⇔画面のロック解除
- 【Fn】+ 3 :google検索画面の表示
- 【Fn】+ 4 :表示されているソフトウェアキーボードを隠す
- 【Fn】+ 8 :ミュート
- 【Fn】+ 9 :音量を下げる
- 【Fn】+ 10 :音量を上げる
- 【Fn】+ delete :BlueToothの接続/切断

##Controlキー
###Google ChromeでのWebブラウジング中に
- control + 1 :ブラウザの1番タブを表示
- control + 2 :ブラウザの2番タブを表示
- control + 3 :ブラウザの3番タブを表示
- control + 4 :ブラウザの4番タブを表示
- control + 5 :ブラウザの5番タブを表示
- control + 6 :ブラウザの6番タブを表示
- control + 7 :ブラウザの7番タブを表示
- control + 8 :ブラウザの8番タブを表示
- control + 9 :ブラウザの最後のタブを表示
- control + - :ブラウザの文字フォントを小さくする
- control + + :ブラウザの文字フォントを大きくする

##tabキー
- 画面上のアプリをZの字で選択

##Commandキー
- googleの検索窓を開く
同等性検定　パッケージ　"equivalence" R

たまに有意差が無い　＝　群は同程度　と結論付けているが、厳密には有意差が無いからといって
群が一緒とは言えない。厳密には同等性の検定が必要になる。
サンプルコード

```
#パッケージの読み込み
library(equivalence)

#データ例の作成
seed(999)
Data1 <- rnorm(10, mean = 0, sd = 1)
Data2 <- rnorm(12, mean = 1, sd = 2)

#平均値で同等性を検定:tostコマンド
tost(Data1, Data2, epsilon = 0.2)

```

この場合の仮説は群の差異が区間内にあるになる。
nohupでpython2を実行した際にUnicodeEncodeErrorが発生する時は

ググればすぐ出てくるが備忘録としてメモ。2018年にもなってPython2を使うのはどうかと思うが、時間のかかる集計処理などをnohupで実施するケースが稀にあるかと思う。

その際、場合によっては以下のようなエラーが発生する。

```
nohup some_script.py &
```

```
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-12: ordinal not in range(128)
```

解決策として、 `PYTHONIOENCODING=utf-8` を環境変数に設定すると良い。

## なぜこのようなことが起こるのか

`sys.stdout.encoding` を確認してみる。

```python
import sys
print(sys.stdout.encoding)
```

まずは普通に実行 (`LANG=en_US.UTF-8`)

```
$ python encoding.py 
UTF-8
```

nohupで実行してみると、`None` になる。(一瞬で終わるため、バックグラウンドで実行していないのはご容赦ください)

```
$ nohup python encoding.py 
nohup: ignoring input and appending output to ‘nohup.out
$ cat nohup.out
None
```

http://www.macfreek.nl/memory/Encoding_of_Python_stdout を読むと、

> However, when the output is piped to a file or to a different process, the encoding is not defined, and defaults to 7-bit ASCII. 

とあるので、 nohupはこの場合にあたり、asciiになるようだ。

したがって、プロセス実行前に `sys.stdout.encoding` を変更するために `PYTHONENCODING` 環境変数を変更するべき、という理解で合っているのだろうか。

めでたしめでたし(?)

## 参照元

- https://stackoverflow.com/questions/5626960/python-print-statement-with-utf-8-and-nohup
- http://www.macfreek.nl/memory/Encoding_of_Python_stdout
「デスクトップ用サイトを表示」がうまくいかない時の必殺技

スマホからサイトを見ている時、PC版のサイトが見たくて、

`デスクトップ用サイトを表示`や、`PC版サイトをリクエスト`をタップしても、

PC版表示にならない、またはあまり変わらない、ということで悩んだことがありませんか？


そんな悩みを解決する一発芸をお披露目しようと思います。

#原因

`PC版サイトをリクエスト`等の機能は[ユーザーエージェント](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88)を切り変えることによって実現しているものです。

サイト側のサーバー、または返されたページ内のjsにユーザーエージェントを調べる機能がありまして、普通はこれを利用してスマホとPCで表示を分けているので、ユーザーエージェントを変えれば表示を変えられるというわけです。

しかし！画面サイズからPCかスマホを判断しているサイトもあります。こういう時はいくらユーザーエージェントを変更しても意味がありません。

#解決法

前置きが長くなりました。そこでとる方法がこちらです。[^1]

```javascript:ブックマークレット
javascript: document.querySelector("meta[name='viewport']").setAttribute("content","width="+parseInt(prompt())+"px");
```

このコード内にある`viewport`と呼ばれる`meta`タグはモダンなサイトならどれも持ち合わせているものです。こいつを変更するとあら不思議！あたかもPC版の表示にすることができます！

詳しい説明は省きますが、`viewport`は本来のウィンドウ幅ではなく、こちらで指定した横幅だと仮定してページを表示してください、と指定する機能です。これの設定値を後から変更してしまうというのがこのコードの意味です。

コード中では以下の部分で指定してます。

```javascript:javascript
.setAttribute("content","width="+指定したい幅+"px")
```

このコードによって、スマホの画面幅ではなく、新しく設定した値に横幅を変更することができ、結果的にPC版の表示と全く同じにできるのです。

#使い方&例

今回は以下の`Qiita`のトップページを使ってみます。

対象とするサイトはPC版をリクエストしても素直な反応をしなかったサイトに限った方がいいでしょう。

<img width="375" alt="C44E69A0-D118-407C-A7AA-2D93D31FBEF7.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/334699f0-7f52-9355-7a2f-1a35ba61ee53.png">

対象ページでブックマークレットを起動するとまず幅を聞かれます。(`prompt`関数によるもの)。

<img width="375" alt="D458293A-40E6-4BA8-8682-0EDFBBE9E3DE.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/eb8447ae-d6b5-2056-ff55-5379721af9ad.png">

ここで、`980`前後[^2]の数字を入力してください。

<img width="375" alt="3BA5601C-5B1A-4DCB-BCBD-BFC5B847B2F2.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/c7287342-7be3-751f-a39a-f2db13bec03f.png">

そして`OK`を押すと！

<img width="375" alt="D30ECECE-4932-4B2C-818C-C1AC8FDA068D.png" src="https://qiita-image-store.s3.amazonaws.com/0/205472/9d81fc9e-f102-1e90-143b-54f73fe6ce42.png">

無事、PC版の表示がされます！

#終わりに

本当はユーザーエージェントの変更もブックマークレットに含められればよかったのですが、色々試行錯誤したのですが上手くいかなかったので、今回は断念しました。

間違い等あればコメント頂けると幸いです。

最後まで読んでいただきありがとうございました。m(_ _)m

[^1]: ブックマークレット？なにそれ？という人は[このQiitaの記事](https://qiita.com/AQRiL_1132/items/b5f9040ccb8cbc705d04)を読んでみてください。スマホでもテキトーなページをブックマークしてそのurlをいじるだけでブックマークレットになります。
[^2]: 詳しくは調べていませんが、PCブラウザの標準幅だそうです。しかし980でも変に表示されるサイトがあるので、動的に変更できる仕様としました。
Windows7のWindowsUpdateが終わらない・進まない・止まるときにはコントロールパネルのトラブルシューティングツールを試してみてください

情シスをやっているとよくハマるものに、Windows Updateのプログレスバーが全く進まないという現象があります。
Web上の多くの記事でも多くの対応策が書かれていて、皆さん同じ問題に直面することが多いようです・・・

あまり検索でヒットしないのですが、コントロールパネルの中にあるトラブルシューティングツールを利用する方法があります。
私の場合は、WindowsUpdateDiagnostic.diagcabとトラブルシューティングツールの二つを実行すると上手くいくケースが多いです。

# トラブルシューティングツール

以下の順に辿って、トラブルシューティングツールを起動してください。

コントロールパネル
→システムとセキュリティ
→コンピュータの一般的なもんだおのトラブルシューティング
→Windows Updateで問題を解決する

「Windows Updateで問題を解決する」という項目名が紛らわしいのですが、「Windows Updateの正常な動作を妨げる問題のトラブルシューティング」を意味しているようです。

# WindowsUpdateDiagnostic.diagcab

以前は「診断ツールFix it」という名前のツールがあったのですが、サンセットしたようです。
今は、WindowsUpdateDiagnostic.diagcabというツールを[こちら](https://support.microsoft.com/ja-jp/help/2714434/description-of-the-windows-update-troubleshooter)の「問題を解決する」というボタンからダウンロードできます。

参考）
[Windows Update トラブルシューティング ツールの説明（MS公式）](https://support.microsoft.com/ja-jp/help/2714434/description-of-the-windows-update-troubleshooter)
[Windows標準の「トラブルシューティングツール」で手軽にWindows Updateの更新トラブルを解決する（@IT）](http://www.atmarkit.co.jp/ait/articles/1505/14/news025.html)
【AWS】年末年始休暇などでRDSを停止しても7日後には自動的に開始してしまう

# はじめに
今年の年末年始は11連休でした。

## 発生した事象
- 12/28に停止した開発環境のRDSが、1/9に出社すると起動していた

！？

## 原因
**なんと公式の仕様だった。**

> インスタンスは 1 回で最大 7 日まで停止できます。7 日後に、自動的に開始されます。

[Amazon RDS でデータベースインスタンスの停止と開始をサポート](https://aws.amazon.com/jp/about-aws/whats-new/2017/06/amazon-rds-supports-stopping-and-starting-of-database-instances/)

## 根本的な対策
クラスメソッドさんのブログのように、Lambdaで自動起動・自動停止する。

[[Amazon RDS]起動停止をスケジュール実行してみた](https://dev.classmethod.jp/cloud/aws/rds-auto-stop-start/)

# おわりに
新年早々、頭がぼけたのかと焦りました。
オブジェクト指向（オブジェクトとクラスとインスタンスの関係）とは

##オブジェクトとは
例えば、オブジェクトは人にたとえるとわかりやすい。また、個々のオブジェクトは責務－responsibilityを持ち、それはresponse + abilityすなわち仕事の依頼（メッセージ）に応答する能力。
オブジェクトは固有の属性値（情報、データ）と責務を保有する。属性と責務（振る舞い）がセットになってオブジェクトにカプセル化されており、メッセージとはこの責務を呼び出すこと。
例えば「デスクトップPC」は本体、ディスプレイ、キーボードなどの部品オブジェクトから構成されている。さらに「本体」はマザーボード、メディア、電源などの部品オブジェクトから構成されている。これはオブジェクトを本体と部分としてとらえる方法です。本体の側を複合オブジェクトと呼ぶ。

##クラスとは
同じ種類のオブジェクトをまとめて考えること。これをクラス――classという。例えば、人間オブジェクトの抽象概念を「人」というクラスにし、自分の勤務先や妹の勤務先など個々の会社の抽象概念を「会社」というクラスにします。
例えば、PCをデスクトップ型、ノート型に、あるいはメーカー別に分類することも可能。元のクラス(PC)をスーパークラス、分類したクラス(デスクトップ型、ノート型など)をサブクラスと呼びます。逆にPCはそれぞれのクラスのスーパークラスという。

##インスタンスとは
インスタンス――instanceの言葉の意味は実例、実体。クラスに属するオブジェクトをインスタンスと呼ぶ。例えばクラス「人」のインスタンスは自分や家族のPさん、Qさん、Aさんや同僚のBさんです。クラス「会社」のインスタンスはP社やU社。
インスタンスはあるクラスに属するオブジェクトの具体例。

##参考URL
http://www.itmedia.co.jp/im/articles/0703/06/news125_2.html
【Python】文字列の分割用のライブラリ


# 作成目的
古い設計のソフトや、自分がJSONやXMLを知らなかった頃のソフトには、固定文字数で定義されたプレーンテキストのファイルやログが複数ある。これをその都度可視化するために展開するのは非常に厄介・・・
また、昔は根気よく文字数指定してFor文でぶん回して文字位置をカウントしていたのだが、Pythonでやろうとしたときにスライスで書くのがめんどくさくなってきた。
一応、古いファイルが見つかったときにこれをそのまま使いまわせないかと思ったので、めっちゃ長い文字数でも分割できるようにこのライブラリを作ることにした。

# 公開先
Github（まだうｐってない）

# 実装
以下実装例と解説

## 初期化
```Python
import DecordStream
ds = DecordStream.DecordStream()
```

## set(文字列) #文字列セット
この関数で文字列を渡します。また、カーソルを初期位置に戻します。

```Python
ds.set("Hello World!")
```

## decord(文字数) #文字列取得
前回のカーソル位置から文字列を分割して取得します。
カーソル位置は終了位置まで移動します。

```Python
ds.set("Hello World!")

a = ds.decode(6)
b = ds.decode(6)
print(a + b)
#---- Console ----
#> Hello World!
```

文字列で戻ってくるので数値はキャストしてあげるといいでしょう。

```Python
ds.set("0123456789");
a = str(ds.decode(5))
b = int(ds.decode(5))
print(a)
print(b)
#---- Console ----
#> '01234'
#> 56789
```

以下のようにリストに入れてしまうことも可能。

```Python
ds.set("0123456789")
ary = []
ary.append(int(ds.decode(1))
#10回繰り返す
print(ary)
#---- Console ----
#> [0,1,2,3,4,5,6,7,8,9]
```

## seek(文字数) #カーソル移動
カーソル位置は任意に移動することができます。
例えば文字列の中にある、余計な予約の空白など文字数だけスキップなど

```Python
ds.set("0123456789ABCDEF!");
ary = []
ary.append(ds.decode(4))
ds.seek(4)
ary.append(ds.decode(4))
ds.seek(4)
ary.append(ds.decode(1))
print(ary)
#---- Console ----
#> ['0123', '89AB', '!']
```

## offset(カーソル位置) #カーソル位置セット
強制的にカーソルのカウント開始位置を設定します。
前回終了位置からではなく、0からスタートの絶対値です。

```python
ds.set("0123456789ABCDEF!");
ary = []
ds.offset(10)
ary.append(ds.decode(2))
ary.append(ds.decode(2))
ary.append(ds.decode(2))
ary.append(ds.decode(1))
print(ary)
#---- Console ----
#> ['AB', 'CD', 'EF', '!']
```

## alldecode(分割リスト) #一括で分割
文字数をセットされたリストを元に文字列を分割し、その分割結果をリストで返します。
一括で行うため、固定電文長の複数文字列を展開するのに便利です。

```Python
ds.set("HOGEhogeFUGAfuga!");
lists = [4,4,4,4,1]
ary = []
ary = ds.alldecode(lists)
print(ary)
#---- Console ----
#> ['HOGE', 'hoge', 'FUGA', 'fuga', '!']
```

#コード
```Python:DecordStream.py
class DecordStream(object):
    def __init__(self, **kwargs):
        return super().__init__(**kwargs)

    def set(self, line):
        self.DecordLine = line
        self.position = 0
        return

    def decode(self, count):
        ret = self.DecordLine[self.position:self.position+count]
        self.position += count
        return ret

    def seek(self, count):
        self.position += count
        return

    def offset(self, offset):
        self.position = offset
        return

    def alldecode(self, lists):
        ret = []
        for size in lists:
            ret.append(self.DecordLine[self.position:self.position+size])
            self.position += size

        return ret
```
The sample of numpy.percentile and how to index the larger array than original array

```python
print("====percentile====")
X = np.random.randn(1) # random 1D array
N = 10 # number of bootstrap samples
print(X.size)
idx = np.random.randint(0, X.size, (N, X.size))
print("====means====")
print(X)
print(idx)
print(X[idx])
print(X.shape, idx.shape, X[idx].shape)
means = X[idx].mean(axis=1)
print(means.shape)
confint = np.percentile(means, [2.5, 97.5])
print(confint)
```
* e.g.

```
====percentile====
1
====means====
[ 0.41599196]
[[0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]
 [0]]
[[ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]
 [ 0.41599196]]
((1,), (10, 1), (10, 1))
(10,)
[0.41599196248944836, 0.41599196248944836]
```
# Refs.
* [randn](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.random.randn.html)  
標準正規分布  
https://qiita.com/yubais/items/bf9ce0a8fefdcc0b0c97
* [percentile](https://docs.scipy.org/doc/numpy-dev/reference/generated/numpy.percentile.html)  
パーセンタイル  
https://istat.co.jp/sk_commentary/percentile
* bootstrap  
https://ejje.weblio.jp/content/bootstrap
Project Euler Q59 【XOR暗号解読】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
(訳者注: 文字コードの説明は適当です) 各文字はそれぞれ一意のコードに割り当てられている. よく使われる標準としてASCII (American Standard Code for Information Interchange) がある. ASCIIでは, 大文字A = 65, アスタリスク (*) = 42, 小文字k = 107というふうに割り当てられている.

モダンな暗号化の方法として, テキストファイルの各バイトをASCIIに変換し, 秘密鍵から計算された値とXORを取るという手法がある. XOR関数の良い点は, 暗号化に用いたのと同じ暗号化鍵でXORを取ると平文を復号できる点である. 65 XOR 42 = 107であり, 107 XOR 42 = 65である.

破られない暗号化のためには, 鍵は平文と同じ長さのランダムなバイト列でなければならない. ユーザーは暗号文と暗号化鍵を別々の場所に保存する必要がある. また, もし一方が失われると, 暗号文を復号することは不可能になる.

悲しいかな, この手法はほとんどのユーザーにとって非現実的である. そこで, 鍵の変わりにパスワードを用いる手法が用いられる. パスワードが平文より短ければ (よくあることだが), パスワードは鍵として繰り返し用いられる. この手法では, 安全性を保つために十分長いパスワードを用いる必要があるが, 記憶するためにはある程度短くないといけない.

この問題での課題は簡単になっている. 暗号化鍵は$3$文字の小文字である. [cipher1.txt](https://projecteuler.net/project/resources/p059_cipher.txt)は暗号化されたASCIIのコードを含んでいる. また, 平文はよく用いられる英単語を含んでいる. この暗号文を復号し, 平文のASCIIでの値の和を求めよ.

## アプローチ
問題の意味を理解する為に答えから入ると、暗号鍵は`god`。
`g`、`o`、`d`の文字コードはそれぞれ$103$、$111$、$100$となる。
(`man ascii`参照)

cipher.txtの先頭$3$文字は$79,59,12$でありこれらと`god`との`XOR`を取ると下記のようになる。

79 XOR 103 = 40
59 XOR 111 = 84
12 XOR 100 = 104

これらを`man ascii`で確認すると、「(」、「T」、「h」となり復号できていることが分かる。

## 解答

```bash
time cat cipher.txt |
awk -F, '{for(i=92;i<=122;i++){for(j=92;j<=122;j++){for(k=92;k<=122;k++){for(m=1;m<=NF;m++){if(m%3==1){printf xor($m,i)" "}else if(m%3==2){printf xor($m,j)" "}else{printf xor($m,k)" "}};print ""}}}}' |
grep -v " [0-9] " |
egrep -v " (92|96|124|127) " |
tr ' ' '\n' |
awk '{s+=$1}END{print s}'
107359

real    0m29.638s
user    0m43.669s
sys     0m0.498s
```

最初は問題の意味がよく分からなかった。。
`XOR`はここでは、($2$進数に直して)`XOR`を取って($10$進数に戻す)という意味だった。
これを理解するのに大分時間がかかった。
また、最初は`XOR`を`echo $(( A ^ B ))`でやる方法で考えていたが、
調べてみたら単純に`awk`でできるようだった。

鍵を探す操作で小文字$3$文字と分かっているので、何も考えず総当たりで三重ループした。
その為やや時間がかかっているがよしとする。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
[Project Euler 59  Decrypt the cipher using XOR encryption _ MathBlog](http://www.mathblog.dk/project-euler-59-xor-encryption/)

## 参考にさせて頂いたサイト様
[シェルスクリプトでのビット演算(AND、OR、XOR) _ ハックノート](https://hacknote.jp/archives/9760/)
[Project Euler 59 _ XOR暗号解読 - PEをMathematicaで](http://variee.hatenadiary.com/entry/2017/07/16/233037)
[xor = XOR演算する。整数をビット毎に排他的論理和（Gawk専用） - AWK - to_dk notebook](http://tounderlinedk.blogspot.jp/2010/09/xor-xor-awk.html)