OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptでEither

JavaScript + 関数型プログラミングメモ

- [JavaScriptでMaybe](https://qiita.com/_____/items/8a2e4de2e83ffdbd34b4) 
- JavaScriptでEither: ←いまここ

folktale v2においては Either は `Result` という名前になっている。Leftは、 `Result.Error`, Right は `Result.Ok` という名前になっている。まずは Either を作る。

```js
const assert = require('assert');
const Result = require('folktale/result');
// create either
{
  const rights = [
    Result.Ok(1),
    Result.Ok({ one: 1 }),
  ];
  rights.forEach((d) => {
    assert(d instanceof Result.Ok);
  });
  const lefts = [
    Result.Error(1),
    Result.Error({ one: 1 }),
  ];
  lefts.forEach((d) => {
    assert(d instanceof Result.Error);
  });
}
```

例外throw型の関数は、 `Result.try()` を使って関数の返り値or送出された例外をEitherにすることができる。Eitherは mapとmapErrorで、それぞれの成功状態を変更せずに、値を変更できる。matchWith でパターンマッチング、条件分岐ができる。mergeを使うと、成功状態を問わず値を取り出すことが出来る。Eitherが `Result.Ok` か `Result.Error` かは、`hasInstanceOf` で判別することができる。

```js
// work with either
{
  const f = (arg) => {
    if (arg) return arg;
    throw Error('falsy');
  };
  assert.deepEqual(
    Result.Ok('HELLO!'),
    Result.try(() => f('hello'))
      .map(str => str.toUpperCase()).map(str => str.concat('!')),
  );
  assert.deepEqual(
    Result.Error(Error('falsy')),
    Result.try(f)
      .map(str => str.toUpperCase()).map(str => str.concat('!')),
  );
  assert(Result.Ok.hasInstance(Result.Ok('hello')));
  assert(Result.Error.hasInstance(Result.Error('hello')));
  const getName = (id) => {
    if (id === 1) return 'alice';
    throw Error('no such user!');
  };
  Result.try(() => getName(1)).matchWith({
    Ok: ({ value }) => { assert.equal('alice', value); },
    Error: () => { throw Error('cannot reach here'); },
  });
  Result.try(() => getName(2)).matchWith({
    Ok: () => { throw Error('cannot reach here'); },
    Error: ({ value }) => { assert.deepEqual(Error('no such user!'), value); },
  });
  assert.equal(
    'guest',
    Result.try(() => getName()).mapError(() => 'guest').merge(),
  );
  assert.equal(
    'alice',
    Result.try(() => getName(1)).mapError(() => 'guest').merge(),
  );
}
```
メモ書き用

#kivy

pip 9.0.2

watchdog 0.8.3

コマンド
python -m kivy.tools.kviewer ./test.kv

kivyの実行結果をリアルタイムで反映

#レイアウトの配置

```python:test.kv
orientation: 'vertical'     # 'vertical'なら縦一列　'horizontal'だと横一列
```

原点が左下

Y軸
↑
↑
↑
↑
0 → → → → → Ｘ軸

#kivyのウィジェット　Buttonそのものに色付け

```python:test.kv
Button:
                text: "1-2"
                size_hint: 6,0.8
                pos_hint: {"x":1, "top":3}
                pos: self.pos
                background_color: 1,0,1,1 #この部分が色指定

```

#クラスと関数

関数はデータをまとめるもの

クラスはその関数達をまとめるもの
 


#役にたつもの（教えてもらったもの）

- RGBカラーリスト等

1. https://www.tug.org/pracjourn/2007-4/walden/color.pdf
2. https://mementoo.info/archives/594


- 環境構築のときにお世話になっている記事
 
1. https://qiita.com/dario_okazaki/items/fe2682fbd88e971c2ef2

(dario_okazakiさんの記事にはよく助けられてます有難うございます)


#Docker開発環境

自分は**Windows10 pro** ではなく**Windows10 home**で

スペックが足りないっぽいので

**Docker Toolbox**を使用。

2018/03/27現在
https://docs.docker.com/toolbox/overview/
からインストール

英語でよくわからないときはURLをグーグル翻訳にぶち込む

Docker Toolbox for Windowsをインストールするをクリック。

![bandicam 2018-03-27 16-52-05-244.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/3ed6a809-b9a2-45b9-f687-af8059c2d37b.jpeg)


↓

Windows用ドッカーツールボックスを入手するをクリック

![bandicam 2018-03-27 16-52-23-769.jpg](https://qiita-image-store.s3.amazonaws.com/0/158551/e3623739-003e-ed72-ec44-ccf3da9e8237.jpeg)

あとは保存して実行

まず動作するかのチェック
Dockerを起動して

$マークは先頭についてるのがデフォルト

`docker　run hello-world`

hello from Docker.が表示されればOK


自分はまず　Python3+Anacondaの環境が作りたかったので

`docker pull continuumio/anaconda3`
のコマンドでインストール。

終わったら

`docker run -i -t continuumio/anaconda3/bin/bash`

のコマンドでdockerのコンテナのコンソールが利用できるようになる。
コンテナ終了にはexitと入力。


#コンテナに名前を付ける
CONTAINERIDをメモする

※CONTAINERIDのとこにメモした値を入れる
`docker　commit CONTAINERID mlean:init`

mlean:initこの部分は　mleanがレポジトリ名　mleanがタグ

正しく実行されると

sha256以下長い文字列 

と表示される

正しく保存されたか確認するには

`docker images`

イメージを利用して起動するには

`docker run -i -t mlean /bin/bash`

#イメージのなかで変更を行った時保存する方法

※イメージのなかにいるときはexitでぬけない！
必ず　CTRL+P →　CTRL+Qの順番で抜ける

docker ps -aで直近のCONTAINERIDを確認してcommitする

コマンド
docker commit CONTAINERID レポジトリ名（自分の場合だとmlean）
これを入力するとsha256~がでてくる

再度
docker run -i -t mlean /bin/bash で中に入って
dir確認　作成したフォルダがあるのを確認。

#docker ps -aでたくさんログが出るとき、その蓄積されたコンテナ類をお掃除

`docker ps -aq | xargs docker rm -f`

#イメージの中のディレクトリ移動

下の階層にいくには？
cd 任意のディレクトリ名

上の階層に行くには?

現在の階層がC:\Users\lesson\dockerの場合に

C:\Users\lesson\に移動するには

cd \lessonと入力する

#WordPress

ウィジェットを自作する場合、外観のところにウィジェットの項目が出なかったりする場合、functions.phpを1度削除して再アップロードする。

削除する前にバックアップを忘れない。

#Unityを使ってWindowsMR（VR）コンテンツを作りたい
下準備(?)

・参考にしているサイト→http://tks-yoshinaga.hatenablog.com/entry/2017/08/23/171354

・用意するもの
１．WindowsMR本体
２．Visual Studio 2017(これがないとだめみたいなこといわれた。英語わかんないけどそんなかんじだった)
３．Unity（自分のバージョンは2018.1.1f1）


#デスクトップPC

#Python3
・再帰（再帰呼び出し）
関数の中で同じ関数を使う
自分で作った関数fがあり、その関数fの中で関数fを呼び出す。

・シンタックスハイライト(wikikから引用)
シンタックスハイライト (英: syntax highlighting) とは、テキストエディタの機能であり、テキスト中の一部分をその分類ごとに異なる色やフォントで表示するものである。

・エンベッド
文字や画像の埋め込みを行う処理



#随時更新

予定は未定
checkoutしてmergeして…の繰り返し、スクリプトを書いて楽しよう

簡単な製作作業なんだけど、作らなきゃいけないパターンが多い…
作業ブランチから更にブランチを生やして作業をするときのGit操作が手間…

そんなときはもうパッとスクリプトを書いちゃおう。

たとえば、以下のような場合。

- `works/main`という作業を取りまとめるブランチがある
- 作業は`works/main`からブランチを生やして、終わったらmergeする

こういうfunctionを書いて楽をした。

```console
$ function check () {
    local name="works/$1";
    git checkout -b "$name"
}

$ function merge () {
    local name="works/$1";
    git checkout works/main;
    git merge $name && git branch -d $name
}
```

インタラクティブシェルで関数を定義してしまえば、いまログインしているその時だけ有効になるので心置きなく書いて捨てていこう。

```console
$ check work1

...お仕事

$ merge work1
```

もう `[C-r]out -b[C-e][C-w]`なんて複雑な操作しなくていいんです。

### 余談

ほくろ毛ハックもいいね。
超新人プログラマー（見習）がWindows10にUbuntuをインストール〜Windowsアプリ編〜

#1.自己紹介
都会で頑張る田舎者です。文系大学卒の元OLです。
ひょんなことからデータサイエンシストへ弟子入りし、プログラミングの世界に導かれやってきました。
Python、git、docker、Ubuntu、raspberry piなどなどを修行しております。

修行の成果を記事にし、同じようにプログラミングの世界に飛び込もうか考え中の方にも参考になればと幸いですm(_ _)m

今回は、Windows10にUbuntuアプリをインストールしましたので、その方法をまとめたいと思います。

#2.Ubuntuを求めて・・・
師匠（データサイエンシスト）が研究で計算するためにMacを主に使用しておりますが、
訳あってまあまあスペックの良いWindows10を入手しましたのでこちらも活用したい。と思い、日々模索しておりました。
・VirtualBoxでubuntuの導入
・デュアルブート環境
　・・・などを試みましたが、重くてうまく動きませんでした。（シングルブートはこわい）

そこで、Ubuntuアプリなるものを教えていただき、導入することになりました。
###1.Ubuntuとは
UbuntuはDebian GNU/Linuxをベースとしたオペレーティングシステム (OS) である。Linuxディストリビューションの1つであり、自由なソフトウェアとして提供されている。
参考：[wiki](https://ja.wikipedia.org/wiki/Ubuntu)

#3.準備した物
WindowsノートPC
　<スペック>
　Windows10 Pro
　CPU：Intel(R)Core(TM)i7-7500U CPU @2.70GHz 2.90GHz
　メモリ：16.0GB
　
#4.手順
###1.Windows10のバージョンチェック
PCがUbuntuアプリのシステム条件に会うか確認。
下記のシステム条件はMicrosoftStoreで確認できます。
![システム](https://dl.dropboxusercontent.com/s/npw3c1uxsh2fxfy/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E5%BF%85%E8%A6%81%E6%9D%A1%E4%BB%B6.png?dl=0)

Windowsのバージョン情報の確認方法は、
「スタートボタン」→「設定」→「システム」→バージョン情報」にて。
※バージョンが合っていなければ、更新しましょう。

更新方法はこちらの公式サイト参照
→[Windows Update の利用手順 - Windows 10 の場合](https://www.microsoft.com/ja-jp/safety/protect/musteps_win10.aspx)


###2.Windows側の設定変更
Ubuntuアプリをインストールする前にWindows側で「Windows Subsystem for Linux」を有効にしなければなりません。

設定方法は、
「コントロールバネル」→「プログラム」→「プログラムと機能」→「Windowsの機能の有効化または無効化」→「Windows Subsystem for Linux」をチェックし「OK」で閉じる。
![win](https://dl.dropboxusercontent.com/s/30w6ocxeenzxxwn/win2.png?dl=)

※「Windows Subsystem for Linux」を有効化したら必ず <b>PCを再起動</b> してください。

###3.Ubuntuアプリインストール
![ubuntuアプリ](https://dl.dropboxusercontent.com/s/821am01c92liwee/ubuntu%E3%82%A2%E3%83%97%E3%83%AA.png?dl=0)
まず、[WindowsStore](https://www.microsoft.com/ja-jp/store/p/ubuntu/9nblggh4msv6?activetab=pivot:overviewtab)よりUbuntuの「アプリをゲット」をクリック。

「Microsoft Store　を開きますか？」と出てくるので、「Microsoft Store　を開く」をクリックし、「入手」をクリックしてインストール。



###4.アプリ起動
![ubuntu起動](https://dl.dropboxusercontent.com/s/6700krcxh13nqh0/ubuntu%E8%B5%B7%E5%8B%95.png?dl=0)
「username」と「password」を２回入力したら設定完了！
これでWindows上でubuntuシェルが使えるようになりました！！
![ubuntuアプリ２](https://dl.dropboxusercontent.com/s/z3peo22iehhqcme/ubuntu%E3%82%A2%E3%83%97%E3%83%AA%EF%BC%92.png?dl=0)

※起動方法として、スタートボタンよりアプリをクリックする方法と、
　コマンドプロンプトやPowerShellで　「ubuntu」　と入力して起動する方法があります。

#5.ちょっとさわってみての感想（詳しくはまた後日！）
GitやPythonは入っているみたいです。
linux練習用とかによさそうだな。と思っております！
・・・が研究用としては心もとない。
　　　やっぱりUbuntuインストール（シングルブート）やっちゃう？！案も浮上してきました（笑）


ちょっとさわってみた続編はこちら→[超新人プログラマー（見習）がLinux練習のためにWindowsアプリのUbuntuを触ってみた](https://qiita.com/petadimensionlab/items/e45ebab503b965b4ce49)


##参考Webサイト
・[Windows ストアの Ubuntu を導入してみた](http://store-watch.hatenadiary.jp/entry/2017/07/12/053549)

・[【Windows10】 ストアアプリ「Ubuntu」のインストール方法と入手できない場合の対処方法](https://qiita.com/ayatokura/items/b9fd333dd1f19eca1ed6)

大変参考になりました！ありがとうございましたm(_ _)m
2018年度 新人向け Java実力テスト〜基礎編〜

# はじめに
本テストは、 **Javaの基礎を学習済みの方** を対象とします。
（主に、新人で入社前にJavaの学習経験がある、ないしは入社後研修で学習済みの方です）
**所要時間は15分** です。

解説付きの回答は後日公開します。

> 参考教材「スッキリわかるJava入門 第2版」
http://amzn.asia/6n0UuFx
![text2.jpg](https://qiita-image-store.s3.amazonaws.com/0/121942/0fb19dbd-26d6-c77e-a06e-6bd447e48cfd.jpeg)



# 実力テスト
## Q1
**Q. 以下の処理を実行し、コンソール出力される結果で適切なものを選択して下さい。**

![Q1.png](https://qiita-image-store.s3.amazonaws.com/0/121942/497ef50f-1068-09c2-5bfe-dd9f165412ac.png)

**回答群**
1. 3
2. 3.0
3. "3"
4. 3.5
5. 4.5
6. コンパイルエラーで出力されない

## Q2
**Q. 以下の処理を実行し、コンソール出力される結果で適切なものを選択して下さい。**

![Q2.png](https://qiita-image-store.s3.amazonaws.com/0/121942/a8dc3177-e863-be90-1403-d709d22a6a15.png)

**回答群**
1. 1: true, 2: true, 3: true
2. 1: false, 2: true, 3:true
3. 1: true, 2: false, 3:true
4. 1: true, 2: true, 3: false
5. 1: false, 2: true, 3:false

## Q3
**Q. 以下の処理を実行し、コンソール出力される結果で適切なものを選択して下さい。**

![Q3.png](https://qiita-image-store.s3.amazonaws.com/0/121942/01fd5f31-5e4e-e575-e864-0511e7e9218b.png)

**回答群**
1. 大阪と東京
2. 大阪, 東京
3. 大阪と東京と福井
4. 大阪, 東京, 福井
5. 何も表示されない

## Q4
**Q. 以下の処理を実行し、コンソール出力される結果で適切なものを選択して下さい。**

![Q4.png](https://qiita-image-store.s3.amazonaws.com/0/121942/7c9766a3-8608-4dbf-7fd8-d3ef5754ffff.png)

**回答群**
1. 0
2. 20
3. 25
4. 30

## Q5
**Q. IDE(EclipseやIntelliJなど)でよく使用する矢印の名称は？**

![Q5.png](https://qiita-image-store.s3.amazonaws.com/0/121942/13488770-2dfb-f946-87bb-e6ad8af25b1a.png)

## Q6
**Q. 以下のモザイクに当てはまる単語(全て同じ単語)を回答して下さい。※ただし、aが2でbが3の場合23が戻り値になります。**

![Q6.png](https://qiita-image-store.s3.amazonaws.com/0/121942/d2ebb39f-06e3-cf4c-bca1-a53d115363d5.png)

## Q7
**Q. クラス分割する理由の内、適切なものを選択して下さい。**

**回答群**
1. そもそもクラス分割しないと動作しないから
2. 可読性を上げ、再利用・メンテナンスしやすくするため
3. 可読性を下げ、コードの秘匿性を守るため
4. 1クラス内に定義できる変数・メソッドの数が限られているから

## Q8
**Q. 以下の処理を実行し、コンソール出力される結果で適切なものを選択して下さい。**

![Q8.png](https://qiita-image-store.s3.amazonaws.com/0/121942/232a923a-f89b-f100-cd98-126c39066275.png)

**回答群**
1. 0
2. 3
3. 4
4. 10
5. 11
6. 22
7. 23
8. 24

## Q9
**Q. 矢印の名称は？**

![Q9.png](https://qiita-image-store.s3.amazonaws.com/0/121942/5a01d413-01d4-efb6-3d0b-05086c7d1d42.png)

**回答群**
1. auto-boxing
2. auto-unboxing
3. cast
4. strong type conversion

## Q10
**Q. 以下の処理を実行し、コンソール出力される最終行で適切なものを選択して下さい。**

![Q10.png](https://qiita-image-store.s3.amazonaws.com/0/121942/fbda1931-d105-223c-dd56-b95de19db727.png)

**回答群**
1. 現在の消費税は8.0%です。
2. 今後の消費税は10.0%になる見込みです。
3. コンパイルエラーで出力されない
mrbgem CIが存続することになりました

## IIJ GIO受賞させてもらいました
[昨年の年末くらいに書いた記事](https://qiita.com/take_cheeze/items/912b62637afab1b6c06d)の続報です。
先日、[フクオカRuby大賞](http://www.digitalfukuoka.jp/topics/116)IIJ GIO賞を受賞させていただいたので無事存続が決まりました。
審査員の方々には感謝しかありません。

[こちらが審査に使わせてもらった資料](https://speakerdeck.com/takecheeze/fukuoka-ruby-award-10th)です。

## 今後
↑の資料にもちょこちょこ書いているんですが、せっかく存続できたので、機能改善をもっと行っていこうかと思います。

- libclangによる静的解析機能の付加
- mingw+wineによるWindowsのテスト
- [osxcross](https://github.com/tpoechtrager/osxcross)+[darling](https://github.com/darlinghq/darling)によるmacOSのテスト
- ビルド結果の画像タグが出せるようになったので、それらの普及

具体的な計画はまだないんですが、[mrubyフォーラム](http://forum.mruby.org/)が引き取ってくださるようなので、続報や計画などありましたら、またお知らせするかと思います。
Mindmup > Markdown 出力 > Qiita:意図通り, esa.io: 意図した通りに表示されない


### Mindmup Markdown出力

タブインデントのmdファイルを取得できる
(File -> Download as -> Outline, Format: MarkdownでExport)

```txt
* MarkdownExport_180320
	* TEST
		* A
		* B
		* C
			* C-1
			* C-2
	* Last update: 2018/03/20
```

Exportされる形式はタブインデントのようだ。
(備考: Qiita上でレンダリングされた段階でタブインデントは空白インデントに変更される？）

### Qiita

意図した通りに表示される。

* MarkdownExport_180320
	* TEST
		* A
		* B
		* C
			* C-1
			* C-2
	* Last update: 2018/03/20

### esa.io

2018年3月20日現在、意図した通りに表示されない。
以下のようになる。

* MarkdownExport_180320 
    * TEST
    * A
    * B
    * C
    * C-1
    * C-2
    * Last update: 2018/03/20

タブインデントでなく空白インデントにすると意図通りに表示された。

### Markdownのリスト定義

タブインデントと空白インデント、どちらが正しい定義かは未調査。
redashからmetabaseに乗り換えれるのか。。。

# redashを今まで使っていただがmetabaseに乗り換えれるかの検証

## redash3.0.0で現状行っていること

**metabaseで下記ができないとなると移行するのは正直厳しいかもしれない**

- pythonデータソースの利用
    - 複数DBのjoin
- APIを使っての外部からのアクセス
- パラメータの利用

## metabase

- パラメータは利用できる
    - 使い方はredashとほぼ同じ`{{ name }}`で設定が可能
- API
    - 調査中
- 複数DBのjoin
    - 調査中

## 結論（調査中だけども）
- 簡単なquery結果を出すならいいかと思う。
- redashで複雑な事をしているなら乗り換えずにredashのままの方がいいと思った。
EC2 CentOS 6.7 がStatus 1/2のまま起動しなくなる

# EC2環境下のCentOSが"Status 1/2"と出力し起動しなくなった際の対応

## 環境
EC2 CentOS 6.7
AMIから別インスタンスとして起動した際に発生
※Ubuntuの場合は参考URLに記載したリンクを参照

## 事象
Syslogに下記の様な出力がでてインスタンスへのログインが出来なくなった
SSHやPingは通じない状態でインスタンスへのログインは不可能となっている
AMIの元となったインスタンスは動作していることを確認

```
ci-info: +--------+-------+-----------+-----------+-------------------+
ci-info: | Device |   Up  |  Address  |    Mask   |     Hw-Address    |
ci-info: +--------+-------+-----------+-----------+-------------------+
ci-info: |   lo   |  True | 127.0.0.1 | 255.0.0.0 |         .         |
ci-info: |  eth0  | False |     .     |     .     | 00:00:00:00:00:00 |
ci-info: +--------+-------+-----------+-----------+-------------------+
```

## 原因
恐らくではあるが想定されるのが下記要因
1. eth0読み込み失敗
2. NICのMACアドレスが変わっているに起因した読み込み失敗

## 対応策
自分の例だと2パターン該当、1だけ1,2両方の場合
AMIからの復元であれば2が該当する可能性がある

### 対応策 1

```
eth0の読み込み設定の修正

# vi /etc/sysconfig/network-scripts/ifcfg-eth0

下記へ編集

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
```

### 対応策 2
```
NIC情報のリセット

# mv /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules.back

もしくはNIC情報部分を書き換える
ATTR(address)の後に続く "00.11.22.33.44.55.66" の様な形式で記載されているMACアドレス
```

## 参考
[EC2 Ubuntu 14.04がStatus 1/2のまま起動しなくなる](https://qiita.com/kt_higa/items/5fc04291f348217b7410)
[Unable to connect to EC2 instance after “reboot”](https://serverfault.com/questions/596809/unable-to-connect-to-ec2-instance-after-reboot)
Ruby On RailsをAmazonLinux2にインストール(2018.3)

# RoRのamazonLinux2へのインストール

- 執筆時点での最新をとにかく追求
    - Amazon Linux 2 LTS Candidate AMI 2017.12.0 (HVM), SSD Volume Type - ami-c2680fa4
    - rbenv 1.1.1-30-gc8ba27f
    - ruby 2.5.0 (with rbenv)
    - Rails 5.1.5
- 先人の知恵をまとめただけです。。

## AmazonLinux2とは

<https://dev.classmethod.jp/cloud/aws/amazon-linux-2-now-available/>

- CentOS7ベースで今後はこちらをメインにメンテナンスされる
- マシンイメージはローカルなどにも持ってこれる
- リポジトリ周りなどに癖がある模様
- その他の違いは下記（参考にしました）
    - <https://qiita.com/akira345/items/2a09c4d06d2e3415bc8d>
    - 最後のsyslogの下りはrsyslogdがデフォルトで動くようになっているっぽい

## 依存ライブラリインストール

- 後続の手順をやると都度怒られるので、メッセージ見ながら都度入れても良い

``` bash
sudo yum install -y ¥
  git ¥
  gcc ¥
  openssl-devel ¥
  readline-devel ¥
  zlib-devel ¥
  sqlite-devel
```

## ruby(rbenv),railsのインストール

<https://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/>

``` bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile 
rbenv --version

rbenv install --list
rbenv install 2.5.0
rbenv global 2.5.0
rbenv rehash

which ruby
ruby --version

gem install bundler sqlite3 rails
rails --version

rails new your_project
```

## AmazonLinux向けセットアップ

<https://qiita.com/Ping/items/09deb80a0be86d5e3145>

- ロケール、タイムゾーンまでを実施
  - タイムゾーンはやり方が異なる！
  
``` bash
sudo cp -p /etc/localtime /etc/localtime.org
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
#sudo sed -i -e 's%"UTC"%"Asia/Tokyo"%' /etc/sysconfig/clock
timedatectl set-timezone Asia/Tokyo
```

## その他追加で必要なら

[SWAPの設定](https://dev.classmethod.jp/cloud/aws/al2-swapfile-fallocate-ng/)

  - AmazonLinux2ではddでやること（not fallocate)
 
[CloudWatchLogsのインストール](https://dev.classmethod.jp/cloud/aws/awslogs-amazonlinux2/)

[AmazonLinux2用のExtras Library](https://dev.classmethod.jp/cloud/aws/how-to-work-with-amazon-linux2-amazon-linux-extras/)

## まとめ

実はBeanstalk使ってたんですが、バージョンアップ要望があり、
rubyのバージョン管理にはrbenvの手順が多かったのでついでに乗り換えようかなと。
フォルダごとにrubyのバージョンを切り替えられるとか、便利そうですね
ElasticsearchのYellow状態の意味

# Yellowはそんなに単純じゃなかった

> yellow means that the primary shard is allocated but replicas are not
https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html

Yellowとは、primaryは配置されているが、replicaが配置されていない状態である。

この説明文を元にCluster statusをモニタリングすると、Yellowが出るわ出るわ

replicaの数はゼロなのに！！

# ソースコードを拝見

>  In case of index creation, snapshot restore or index shrinking, which are unexceptional events in the cluster lifecycle, cluster health should not turn RED for the time where primaries are still in the initializing state but go to YELLOW instead.

はい、他にもありました。

「インデックス作成時、スナップショット（バックアップ）リストア時、インデックスの縮小時はYellowです。」

なるほど・・・

# Yellowになる時

- replicaが配置されていない時
- インデックス作成時 
- スナップショット（バックアップ）リストア時
- インデックスの縮小時

# Yellowになる間隔

- インデックス作成時
 - 400ms ~ 600ms
- リストア、縮小
    - インデックスのサイズによる
SourceTreeでGitflow使うときにも、デフォルト動作をno-ffにすることができたのでメモ

#Webを調べても少なくとも日本語の記事で解決策を提示してるページがなかった
##経緯
残念ながら2・3年前ぐらいにも調査したことがあったけど見つからず、そろそろ何とかなってるかなー、と改めてSourceTree触ってもやはりなさそうだったので、SourceTree内部で使用されている以下のGitFlow操作用のスクリプトを読んでみることにした。

%USERPROFILE%\AppData\Local\Atlassian\SourceTree\gitflow_local\gitflow

※スクリプトの場所は以下の記事を参考にした。筆者様ありがとうございます。
https://www.regentechlog.com/2016/08/08/sourcetree-no-ff/

#configファイルへの設定を追加することで対応可能
読み進めるとgitのコンフィグファイルに対して設定を付け加えると強制的にno-ffオプションを付加できることが分かったので、ターミナルから以下のコマンドを実行。
その後SourceTreeのGitflowからfeatureを開始・完了したところ、featureが1つのコミットでも無事にno-ffでマージされた。

`
git config gitflow.bugfix.finish.no-ff true
git config gitflow.feature.finish.no-ff true
`

ここまで仕組みができてるのなら、SourceTreeにオプション付けるのくらい簡単な気がしますが、そこんとこどうなんでしょうAtlassianさん...
Dockerを使ってsinatraの開発環境を作る

#概要
パソコンが新しくなったのを機に、sinatraの開発環境構築にDockerを使ってみた。
webアプリケーションは、Herokuにデプロイする。

#環境
windows 10 Pro


#起動までの手順
##Docker for windowsのインストール
[Docker for Windows](https://www.docker.com/docker-windows)よりダウンロードし、インストールする。

##ファイル作成

 
###Dockerfileの作成
イメージを作り上げる命令を`Dockerfile`に記述する。

```Dockerfile
FROM ruby:2.3.3

ENV APP_ROOT /usr/src/test -----(1)

RUN gem install bundler
COPY . $APP_ROOT
WORKDIR $APP_ROOT
EXPOSE 5000
RUN bundler
```

###docker-composeの作成
サービスの定義を`docker-compose.yml`に設定する。

```docker-compose.yml
version: '3'

services:
  app:
    tty: true
    container_name: test
    build: .
    command: bundle exec rackup config.ru -p 5000 -o 0.0.0.0
    volumes:
      - .:/usr/src/test -----(2)
    ports:
      - "5000:5000"
```
※ (1)(2)は同じパスにする

##イメージの作成
1. windows PowerShellを管理者モードで立ち上げる。
2. `cd`コマンドで、対象フォルダに移動。
3. `docker-compose build`を実行。


##コンテナの作成
`docker-compose up -d`を実行し、コンテナを作成・起動する。
ブラウザを立ち上げ、`localhost:5000`を入力すると、webアプリケーションが表示される。
SSIを使用していないはずなのに[an error occurred while processing this directive]のエラーが出る

## はじめに
MAMP、XAMPPとかでSSI有効にしている開発環境だと、起こりやすい気がしたのでメモです。
こんなのが最初の投稿になってしまいました。

## 現象
タイトルの通りです。
HTML上では、SSIを使用していないはずなのに、
[an error occurred while processing this directive]のエラーが出てしまいました。

HTMLコーディングを引き継いだ時に、起こった現象です。
作業環境の違いで起きてしまいました。

## 詳細
```
[an error occurred while processing this directive]
```
調べて見たところ、これはSSIのエラーらしい。

コードを見たら、下記のコメントが書かれていた。

```
<!--#mainContents-->
```

どうやら、「<!--#」の書き出しだとSSIのソースになるらしい。

ということで、下記のようにスペースを入れてあげたところ、エラーが出なくなった。

```
<!-- #mainContents -->
```

## 備考
SSI無効の環境だと、もちろんエラーが出ない（コメントとして見なされる）ので、
SSI無効→SSI有効の環境に移行した時に起きやすいかもしれない。

## まとめ
HTMLのコメントは、前後にスペースを空けて書こう。
ポエム・ふへんの極意


|ふへん|意味|
|---|---|
|不変|変わらないこと|
|不偏|偏りがない、公正・中立|
|普遍|全てに共通しているかどうか|

# ３つのふへんをプログラムに置き換えてみる

## 不変 (変化しない)

* プリミティブ
* 基礎技術

## 不偏 (作ってるうちに変化する)

* ゲームルール
* ビジネスロジック

## 普遍 (時代とともに変わっていく)

* フレームワーク
* アーキテクチャ
* プログラム言語

# プログラムをうまく動かすには

1.不偏を企画する

ここは変化することを前提に全てを決める

2.普遍を選定する

不偏なことをうまく運用する枠組みを選定する。

3．不変を定義する

不偏における要素のうち変化しないことを見つける
プログラムをする上で不変を見つけることが安定させるために必要なこと
Monkey CでArrayにPushする

Connect IQ のArrayオブジェクトにPushがないので作りました。

	function pushArray(array, obj){
		array.add(obj);
		array = array.slice(1, null);
		return array;
	}

## テストコード
        var myArr = [1,2,3,4,5];
        System.println(pushArray(myArr,6));
        // 出力 [2,3,4,5,6]

##参考

Arrayオブジェクト https://developer.garmin.com/downloads/connect-iq/monkey-c/doc/Toybox/Lang/Array.html
Ubuntu 16.04 LTS GPU deep learning 環境を整備その3 APC製のUPSの導入

全３回の２回目です。
1回目https://qiita.com/s_s_satoc/items/17c5bd35c37f0f39c14c
でNVIDIAドライバー、CUDA ToolkitとcuDNNのインストール

2回目https://qiita.com/s_s_satoc/items/3589a58c10c96ca05e3c
でその2 pythonとDeep learningのpackage周りをやりました。

3回目は番外編としてAPC製のUPS電源の導入をやります。どうも大学の電源がいきなり落ちることがあるらしいので念のために導入しました。実はこの回が一番大変でした。
購入したのはSmart-UPS 1500 LCD 100V SMT1500です。
http://kakaku.com/item/K0000421262/


## UPS本体のファームウェアアップデート
地味に最難関。https://www.schneider-electric.co.jp/ja/faqs/FA53466/
を参考にやるのですが、windows PC(xp, vista, 7,8まで)が必須w
持ってねーよ。たまたま、別のチームが計測に使っているPCが7のままだったのでことなきを得ました。windows PCがあればGUIでサクサクいけます。結構時間がかかりますが。

## apcupsdのインストール
easyにこれでインストールできます。

```:terminal
$ sudo apt-get install apcupsd
```
apcupsdのバージョンの確認

```:terminal
$ apcupsd -V
apcupsd 3.14.12 (29 March 2014)
```
私はsudo apt-get install でインストールしたので現時点2018/03の最新verである3.14.14ではなく、少し古い3.14.12になっています。が、timeout(停電になるとバッテリー起動に切り替わりある一定期間過ぎると自動的にスリープになる）なんかは問題なく動いています。複数台繋ぐとかだと話は違うのやもしれませんが。

## 設定ファイルの書き換え
ここらへんが詳しいです。
http://ma-tech.centurysys.jp/doku.php?id=mae3xx_tips:use_ups:start
あとここを参考になりました。
http://ja.528p.com/linux/centos6/B011-apcupsd.html
設定ファイル
/etc/apcupsd/apcupsd.conf の書き換え
俺はUSBで接続したので
UPSCABLE smart→usb
UPSTYPE apcsmart →usb
DEVICE /dev/ttyO1→""(空欄）
と書き換えます。また、60秒停電が続くと電源が切れるように
TIMEOUT 0→60
に変更。

/etc/default/apcupsdも書き換えます。
ISCONFIGURED=no→yes

## apcupsdの起動
以下のコマンドを叩きます。

```:terminal
$ sudo service apcupsd start
```

## apcupsdの状態確認

```:terminal
$ /sbin/apcaccess status
APC      : 001,027,0770
DATE     : 2018-03-20 11:00:19 +0900  
HOSTNAME : ***
VERSION  : 3.14.12 (29 March 2014) debian
UPSNAME  : ***
CABLE    : USB Cable
DRIVER   : USB UPS Driver
UPSMODE  : Stand Alone
STARTTIME: 2018-03-20 10:56:17 +0900  
MODEL    : Smart-UPS 1500 
STATUS   : ONLINE 
BCHARGE  : 100.0 Percent
TIMELEFT : 85.0 Minutes
MBATTCHG : 5 Percent
MINTIMEL : 3 Minutes
MAXTIME  : 60 Seconds
ALARMDEL : 30 Seconds
BATTV    : 27.3 Volts
NUMXFERS : 0
TONBATT  : 0 Seconds
CUMONBATT: 0 Seconds
XOFFBATT : N/A
STATFLAG : 0x05000008
MANDATE  : 2018-01-26
SERIALNO : J11804121505  
NOMBATTV : 24.0 Volts
FIRMWARE : UPS 09.3 / ID=18
END APC  : 2018-03-20 11:00:35 +0900  

$ service apcupsd status
● apcupsd.service - LSB: Starts apcupsd daemon
   Loaded: loaded (/etc/init.d/apcupsd; bad; vendor preset: enabled)
   Active: active (running) since 火 2018-03-20 10:56:18 JST; 6min ago
     Docs: man:systemd-sysv-generator(8)
```
とそれぞれ表示されればOKです。

## UPSの動作確認
電源ケーブルを引っこ抜いて60秒後にシャットダウンすればOK

## 最後に
今回が全体の環境設定を通して一番時間がかかりました。特に困難なのが、UPS本体のファームウェアのアップデートが必要な点かつ、このアップデートにwindows PCが必須なことです。あまり、Linuxに正式に対応しているUPSがなく私の場合だとAPC以外の選択肢だと20万越えのとても高いものになってしまいました。ファームウェアのアップデートを予め行った状態で売るorLinuxでも動くアップデートツールを配布してもらうだけで状況は変わると思います（と世界の果てで叫ぶ）。
Jupyter notebook を Dockからワンクリックで起動（macOS）

Macで Jupyter notebookを使うのに，Terminal起動してコマンド入力するのが億劫なので，Dockに .commandファイルを登録して起動できるようにした。
いつも同じフォルダから起動したい人向け。

# .commandファイルでJupyterを起動
次の内容のテキストファイルを作成。ファイル名を jupyter.command とする。

```sh:jupyter.command
#!/bin/sh
cd ~/notebook && jupyter notebook
```

ターミナルで実行権限をつける

```
chmod +x jupyter.command
```

jupyter.command ファイルをDockに入れる。


# 二重にJupyterを起動しないように改良
Jupyter notebook が起動しているかを調べて，すでに起動していたらブラウザで開き直す

```sh:jupyter.command
# 二重に開くのを避ける
jnlist=`jupyter notebook list --json`

if [ "x$jnlist" = 'x' ]; then
    # 起動しているのがなければ
    cd ~/notebook && jupyter notebook
    # 別の書き方
    # jupyter notebook --notebook-dir="~/notebook"
else
    # 起動していたら決め打ちでブラウザを開く
    open http://localhost:8888
fi
```


# 終了するには
## 終了コマンド
その１：起動したターミナルで control+C で終了
その２：```jupyter notebook stop```コマンドを実行（複数起動していても stopで１つしか止まらない）

## 自動終了させるオプション
http://jupyter-notebook.readthedocs.io/en/stable/config.html
https://github.com/jupyter/notebook/issues/1300

一定時間放置すると自動終了させるように設定できる。

1. jupyter notebook の設定ファイルの作成
```jupyter notebook --generate-config``` コマンドを実行
~/.jupyter/jupyter_notebook_config.py が作成される
2. 終了時間の指定
jupyter_notebook_config.py ファイルの
下記オプションで指定できる（単位は秒）

```
c.MappingKernelManager.cull_idle_timeout = 600
c.NotebookApp.shutdown_no_activity_timeout = 600
```
AndroidStudioで開発を始める前に確認すべきショートカットのあれこれ

# はじめに
AndroidStudioで開発を始める前にショートカットキー周辺で確認すべき点が何点かあるのでまとめました。

# ショートカットキーの確認
## Android Studioの設定
![スクリーンショット 2018-03-20 11.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/188222/5e3b3cf2-6222-43a2-9818-a3da0b8b2d17.png)

開発を始めるにあたって、ショートカットキーの確認は必須です。もし使い慣れたKeymapsがあるなら設定から変更しておきましょう。

## Mac本体のショートカットキーと見方
Mac本体のショートカットキーと見方については[こちらの記事](https://qiita.com/yuukiw00w/items/bdf472928e09841e1459)にまとめてあります。Macでの開発に慣れていない場合はひとまずそちらも確認しておくのが望ましいでしょう。

【一部抜粋のコピー】
command：⌘ 
control：⌃ 
option：⌥ 
shift：⇧ 
escape：⎋ 

## 公式のキーボードショートカット一覧
https://developer.android.com/studio/intro/keyboard-shortcuts.html?hl=ja

キーボードショートカットは↑に一覧があります。日本語なので一通り目を通して、使いそうなショートカットキーを覚えておきましょう。

## Macのキーボード設定
OS側のショートカットキーと被っていることが良くあります。^＋Spaceなんて良く補完で使用するのに被ってたりするので、Macのシステム環境設定＞キーボードから無効化するか、もしくはAndroid Studioの設定からショートカットキーの割り当てを変更しておきましょう。
<img width="780" alt="スクリーンショット 2018-03-20 11.40.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/188222/b82f4d1c-3d88-cf1c-2085-b38e9d6d375f.png">

## Tip of the Day
日々のtipがAndroidStudio起動時に表示されます。ここには便利なtipが毎回表示されますが、不要ならShow Tips on Startupのチェックを外しましょう。
私は鬱陶しいのでチェックを外していますが、チェックを外す前にある程度読んで色々頭に入れてから外すのがおすすめです。
公式のキーボードショートカットを読んでもいまいちピンと来ないですが、このtipsは例も表示されていて分かりやすいので、最初に参考にするのにとても有用です。
![スクリーンショット 2018-03-20 11.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/188222/8a3debd4-9763-4527-3e8c-0c1f3b424543.png)

## Fnキーを押さずにF1〜F12が押せるようにする
毎回ショートカットキーでFnキーを押すのはかなり面倒です。
https://applech2.com/archives/how-to-using-function-key-always-on-touch-bar.html
この記事などを参考に、設定からTouch barにFnを常に表示するようにするのがオススメです。
![スクリーンショット 2018-03-20 13.03.08.png](https://qiita-image-store.s3.amazonaws.com/0/188222/907fa2ba-41a1-aaea-00e4-3c160294e816.png)


# その他
ショートカット学習にあたっては以下の記事などが参考になると思います。

* [【Android Studio】ショートカット大好き人間がおくるショートカット集【IntelliJ IDEA】](https://qiita.com/arai-wa/items/b0957d042c479577e8e3)
* [Android Studio30分集中超絶技巧100選メモ DroidKaigi 2018](https://gist.github.com/yusuke/e30257656a78ca007627e0762a5a7fbc)
ファイルパスと名前空間をPhpStormでとる方法


## ファイルパス
拡張子つきでとれる

### 例

```
app/Http/Controllers/User/UserController.php
```

### 方法

ファイルのタブを右クリックして Copy Relative Path。

![Screen Shot 2018-03-20 at 11.58.08.png](https://qiita-image-store.s3.amazonaws.com/0/109241/1d1641c9-e833-b659-5466-6fd6cf0ca25f.png "Screen Shot 2018-03-20 at 11.58.08.png")


## 名前空間パス
`::` でメソド名付きをとることも可能

### 例

```
\App\Http\Controllers\UserController
```

### 方法

クラス名を右クリックして Copy Reference。
メソド名で同じことをすれば `::` でメソド名付きのものがとれる。

![Screen Shot 2018-03-20 at 11.59.37.png](https://qiita-image-store.s3.amazonaws.com/0/109241/3661906a-a1e1-030c-53fe-d76fdd594c11.png "Screen Shot 2018-03-20 at 11.59.37.png")
dockerをPROXY環境下で使うときのメモ

#Raspberry PiでdockerをPROXY環境下で使うときのメモ
raspberry Piにスクリプトでインストールした場合、
dockerの設定ファイルは /etc/default/docker にあるが、
これは、init.d用の設定ファイルなので、systemd環境下では読み込まれない。

systemd環境下では/etc/systemd/system/　以下のデーモンごとのフォルダの中にconfigファイルを作る必要がある。

以下のコマンドでhttp-proxy.confを作成

```bash
sudo emacs -nw /etc/systemd/system/docker.service.d/http-proxy.conf```
```

ファイルの中に下記のconfigを記載し保存する

```config:http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
```
下記コマンドで、configのリロード、デーモンの再起動、systemdの環境変数の確認を行う。

```bash
pi@raspberrypi:~ $ sudo systemctl daemon-reload
pi@raspberrypi:~ $ sudo systemctl restart docker
pi@raspberrypi:~ $ systemctl show --property=Environment docker
````

参考
https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
https://blog.knjcode.com/arm64-docker-on-raspberry-pi-3/
mruby-redisのリークを直した話

# mruby-redisのリークを直した話

[プルリク](https://github.com/matsumotory/mruby-redis/pull/93)にした以上のことはないんですが、mrbgem CIを作って以来ずっと懸案だったmruby-redisのメモリリークが直りました。
懸案だった理由なんですが、なんやかんや人気あるmrbgemなのと、よく壊れていたからです。

最近、よく壊れるmrbgemの座が[mruby-json](https://github.com/mattn/mruby-json)に移りつつあるので[make mruby-json great again](https://github.com/h2o/h2o/pull/1698)なんてPRが作られていてOSSウォッチングではこっちの方が楽しいです。
h2oに急に採用されて、まあ諸々アレだったところを修正してるのが原因なので実際は着実によくなっているので、mruby-iijsonなどで性能に不満のある方は是非mruby-jsonをご検討を。

## 直した内容
「例外安全」性です。
[Visual Studioにいい解説記事](https://msdn.microsoft.com/ja-jp/library/hh279653.aspx)があるので、一読することをおすすめします。
他に「Exceptional C++」という本もあるらしいので、若干古いですが根底にある考え方は変わっていないはずなので読んでみたいです。（わたしは読んだことがないです。）

今回は、例外が飛ぶ時に確保したリソースが解放されていないことが多かったためにそれなりに苦労しました。
[leak sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer)でメモリがリークしたことはわかったんですが、どこでリークしたのかを特定するのが困難で、とりあえず、テストケースを1個ずつ `skip` して減ったかどうかを確認していってました。
地味に時間がかかるんですが、減るところがわかれば切り出し作業はできているのでまあなんとかなりました。

mrubyでは、例外は内部的にsetjmp/longjmpかC++の例外を利用しています。
なので、例外が送出された場合スタック上に関連付けられた解放処理の必要なオブジェクトごとスタックが巻き戻されます。
C++のRAII設計されたオブジェクトの場合は、libunwindがよろしく処理してくれますが、ただのCのオブジェクトの場合は、そのままリークするのでつらいです。

今回は、例外が飛びそうなところで、既にオブジェクトが確保されていた場合その直前に解放処理を挟んでいます。
こういった処理はどうしてもなぜかさけられがちな `goto` 文で書くと楽に書けます。

他のmrbgemでもけっこう似たようなバグがいっぱいあるので、異常系をテストしていない場合は気をつけた方がいいかと思います。
テストしていないバグはsanitizerでも基本的に検出できません。

## 今後
[#69](https://github.com/matsumotory/mruby-redis/issues/69)で既に立っているんですが、内部用のAPIである、 `MRB_THROW` と `MRB_CATCH` で実装されている部分を修正しないといけないです。
CloudFormationのカスタムリソースでハマったこと

CFnで実装されていないリソースの制御ができるので[カスタムリソース](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)には助けられていますが、エラーを分かりやすく出力してくれないのが困ったところ。

## カスタムリソースが作成できない

#### カスタムリソースの利用目的

* Lambda関数の起動

#### 現象
* カスタムリソースが作成できない
* CloudWatchのログを見ろとエラー文には書かれているが、見にいってもなにも出力されていない

```
Failed to create resource. See the details in CloudWatch Log Stream
```


#### 原因

* Lambdaからcfn-responseで[カスタムリソースの応答オブジェクト](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html)を正常に返せていなかった

#### 解決方法

* try/exceptなど例外処理をしっかり行い応答オブジェクトを返すことがないパターンをなくす
* 公式で紹介されているcfs-responseモジュールを利用する
    * [AWS Lambda 関数コード \- AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html)
* Lambda関数を `CloudFormation Create Resource` イベントのテストなどでcfnresponse.send以外のエラーが出ないことを確認する


## カスタムリソースがCREATE_IN_PROGRESSのまま終わらない

#### カスタムリソースの利用目的

* Lambda関数の起動

#### 現象

* スタックのカスタムリソースの項目が `CREATE_IN_PROGRESS` のまま終わらない
* 作成中なのでスタックを削除することはできない

#### やってみたこと

* スタックを停止させるとカスタムリソースが `DELETE_IN_PROGRESS` に変わるが、これも終わらない
* スタック自体のステータスも `DELETE_IN_PROGRESS`　になるがスタックの削除はできない

#### 原因

* Lambdaからcfn-responseで[カスタムリソースの応答オブジェクト](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html)を正常に返せていなかった

#### 解決方法

* スタックを削除できるようにするには待つしかない（`DELETE_IN_PROGRESS`　になってから１時間ほど）
* Lambda関数を `CloudFormation Create Resource` イベントのテストなどでcfnresponse.send以外のエラーが出ないことを確認する

## 参考

* [AWS Developer Forums: Custom Resource Cloudformation stacks \.\.\.](https://forums.aws.amazon.com/thread.jspa?threadID=176003)
Photoshop スクリプトで任意のフォルダを開く(Win版）

PhotoshopのExtendScriptを使ってフォルダを開く処理が必要になったのですが、AfterEffectsでは用意されていたOSコマンドを実行するライブラリがなさそうなので代替手段としてこんな感じでやってみました。コードはTypeScriptです。
Macの場合は、start の箇所を open にすればいけるのかな？（未確認です）

```typescript
    function openFolder(path?: string) {
        const folder = new Folder(path || '~');
        let file: File;

        try {
            file = new File('~/tmp.bat');
            file.open('w');
            try {
                file.write(`start ${folder.fsName}`)
                return file.execute() ? "Success" : "Fail";
            } finally {
                file.close();
            }
        } catch (ex) {
            return ex;
        }
    }
```
X で複数のキーボードを別々のレイアウトで使えるようにする

# 概要

Xを使うときに、複数のキーボードを切り替えてつかうときに、
キーボードごとに、設定をするのが大変なので、一回設定してすまないかを検討している

# まとめ

```
xinput -list
setxkbmap -device デバイスID -layout jpとかusとか -option ctrl:nocapsとか
```

* `xinput` は、`setxkbmap` で指定するデバイスIDを探すのに使う
* `setxkbmap` は、実際に設定を変更する


## 日本語に切り替えて、英語に戻ると、レイアウトがリセットされるとき。

ibusなどをつかっているならそれの設定を見直す。

ibusの例では、Preference で `Advanced` を選び

* `Keyboard Layout` のなかの、
 * `Use system keboard layout` のチェックボックスにチェックをいれる

## xinput -list の出力例


```
xinput -list                                                     
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ Logitech Performance MX                 	id=8	[slave  pointer  (2)]
⎜   ↳ Logitech N305/B505                      	id=9	[slave  pointer  (2)]
⎜   ↳ Logitech M545                           	id=10	[slave  pointer  (2)]
⎜   ↳ Logitech M570                           	id=11	[slave  pointer  (2)]
⎜   ↳ KINESIS FREESTYLE KB700 KB700 Kinesis Freestyle	id=17	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Power Button                            	id=7	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=13	[slave  keyboard (3)]
    ↳ Logitech N305/B505                      	id=14	[slave  keyboard (3)]
    ↳ Logitech M545                           	id=15	[slave  keyboard (3)]
    ↳ KINESIS FREESTYLE KB700 KB700 Kinesis Freestyle	id=16	[slave  keyboard (3)]
    ↳ KINESIS FREESTYLE KB700 KB700 Kinesis Freestyle	id=18	[slave  keyboard (3)]
    ↳ Topre Corporation Realforce 91          	id=12	[slave  keyboard (3)]

```

## 設定例

デバイスIDが、16のキーボードのCAPSをCTRLとして使う

```
xinput -list
setxkbmap -device 16 -layout us -option ctrl:nocaps
```

### スクリーンロックがかかった後のKINESISのdevice id

マシンを再起動しなくても、
かわることがあるようです。

実際に自分の環境では、上にあげた `xinput -list` の16と17がいれかわっていた。
このあたりは、確認するスクリプトをつくったほうがよさそう



# 参考

* [普通のキーボードとHHKを同時に使う - unpushの日記](http://d.hatena.ne.jp/unpush/20100621/1277136743) 
* [Xorg でのキーボード設定 - ArchWiki](https://wiki.archlinux.jp/index.php/Xorg_%E3%81%A7%E3%81%AE%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A#setxkbmap_.E3.82.92.E4.BD.BF.E3.81.86) 
* [kopoli/keyboard: A tool for setting custom keyboard layout in X](https://github.com/kopoli/keyboard)
Intelli JでRailsの補完が効かない場合の対処法

## 結論

1. vendor/bundleを消す
2. プロジェクトを Rails を指定して新規作成する
3. 既存プロジェクトを新規プロジェクトとして読み込む
4. Rails として認識させた状態でプロジェクトOpen
5. 再度 bundle installする

gems を見て java と認識することがあるらしい。

## 詳しい手順
IntelilJを落としておく。

### vendor/bundleを削除する

```shell
$ rm -rf vendor/bundle
```
### 「Create New Project」する
**注：既存プロジェクトがあっても、「Open」は選ばないこと！**
<img width="476" alt="Screen Shot 2018-03-20 at 10.52.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/6f9c19f3-a361-edb5-abea-7e5d96f2c484.png">

## Railsとして認識させる
<img width="759" alt="Screen Shot 2018-03-20 at 10.52.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/d385e87e-4b30-285f-1708-69bb886738dd.png">

## 既存のプロジェクトのパスを入力する
<img width="756" alt="Screen Shot 2018-03-20 at 10.53.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/133879/0a780536-8639-5785-f868-270d8adf481c.png">

Finishを押すと、「既存のプロジェクトがありますが、上書きしますか？」というような注意がでるがOKする。
プロジェクトが開いた後にbundle installしなおす。
Project Euler 58「螺旋素数」

いつものようにジーッと眺めて法則性を探す。

# Problem 58 「螺旋素数」
1から始めて, 以下のように反時計回りに数字を並べていくと, 辺の長さが7の渦巻きが形成される.
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184817/738d4b5c-b150-544f-4066-b9245b2d7361.png)
面白いことに, 奇平方数が右下の対角線上に出現する. もっと面白いことには, 対角線上の13個の数字のうち, 8個が素数である. ここで割合は8/13 ≒ 62%である.
渦巻きに新しい層を付け加えよう. すると辺の長さが9の渦巻きが出来る. 以下, この操作を繰り返していく. 対角線上の素数の割合が10%未満に落ちる最初の辺の長さを求めよ

```python
def hoge(num):
    ratio = {True: 0, False: 1}
    n, m = 1, 2
    while True:
        for _ in range(4):
            n += m
            ratio[is_prime(n)] += 1
        if ratio[True] / sum(ratio.values()) * 100 < num:
            break
        m += 2
    return int(n ** 0.5)

def is_prime(n):
    if n < 2: return False
    if n == 2: return True
    if n % 2 == 0: return False
    return all(n % i != 0 for i in range(3, int(n ** 0.5) + 1, 2))

print(hoge(10))
```

## 法則性
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184817/3ca88908-556c-9068-9a6c-b3df18ffe262.png)
Mailman の宛先数制限を解除する

デフォルトの Mailman は、10件以上の宛先（To または Cc）を含むメールについて、spam である可能性が高いと判定して、配送を延期して、リスト管理者による明示的な配送許可を待ちます。しかし、この判定規則は正当なメールを spam と誤判定する率が非常に高いため、利用者側から見ると不当な配送遅延の原因になります。

そこで、管理画面の「プライバシーオプション」→「宛先フィルタ」，「投稿を認めるメールに含まれる受信者数の上限(max_num_recipients)」の値を0に設定して、この設定を解除しておきます。

ただ、管理下にあるメーリングリストが多い場合は、やはり `withlist` コマンドの出番になります。まず、以下のような `/usr/lib/mailman/bin/clear_recipients_limit.py` を用意します。

```py:/usr/lib/mailman/bin/clear_recipients_limit.py
def clear_recipients_limit(mlist):
    mlist.Lock()
    mlist.max_num_recipients = 0
    mlist.Save()
```

その上で、以下のように `withlist` コマンドを実行します。

```shell-session
$ withlist -r clear_recipients_limit -a
```

加えて、この設定後に新規作成するメーリングリストにおいても、この設定が解除されている状態を初期状態としておくため、以下のように `/etc/mailman/mm_cfg.py` に記述しておきます。

```py:/etc/mailman/mm_cfg.py
DEFAULT_MAX_NUM_RECIPIENTS = 0
```
CodeBuildを使ってみたメモ

本当に今更だけどCodeBuildを使って、GitHubリポジトリのDockerfileをビルド&イメージプッシュ & Kubernetesにデプロイする設定を入れたので知見をメモする。

### GitHubと連携できる

てっきりリポジトリにコミットされたらCodeBuildを実行〜みたいな時、CodeCommitじゃないとできないのかなと思っていたのですが、GitHubでもできました。

### CodeBuildでDockerイメージをビルド(dockerコマンドの実行)する際には、CodeBuildオリジナルのDockerイメージを使わなければならない

"特権付与"にチェックを入れても、CodeBuild用のaws/codebuild/dockerイメージでなければdockerコマンドは使えません。

### CodeBuildコンテナでのRubyインストール方法

前述の理由によりRubyを使いたい時、Rubyイメージが使えずコンテナにRubyをインストールするしかないのですが、普通にapt-get install rubyだと1.9が入ってしまいます。
2.4等新しいものをインストールする場合は次のようにします。

```bash
apt-get install -y software-properties-common
apt-add-repository -y ppa:brightbox/ruby-ng
apt-get update -y
apt-get -y install ruby2.4 ruby2.4-dev
```

### イメージのタグなどに使う用のGitコミットID取得方法

下記変数が自動的にセットされているので、これが使えます。
※CodeBuild上のファイルは.gitがないようです。

```
CODEBUILD_RESOLVED_SOURCE_VERSION
```

### シークレットの取り扱い

CodeBuildで環境変数を設定できるが、パスワード等のシークレットはAWS Systems Managerのパラメータストアを使います。

下記例は、パラメータストアにvalという名前で登録した値を、CodeBuild内でkeyという環境変数名前で使用できます。

```yaml
env:
  parameter-store:
    key: "val"
```
Project Euler 57「平方根の近似分数」

数学的考察はしてません。（トライはした）
3/2、7/5、17/12、41/29をジーっと眺めて法則性を探して、やってみたら正解だっただけ。
行けば分かるさの精神。

# Problem 57 「平方根の近似分数」
2の平方根は無限に続く連分数で表すことができる.

√ 2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) = 1.414213...

最初の4回の繰り返しを展開すると以下が得られる.

1 + 1/2 = 3/2 = 1.5
1 + 1/(2 + 1/2) = 7/5 = 1.4
1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666...
1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379...

次の3つの項は99/70, 239/169, 577/408である. 第8項は1393/985である. これは分子の桁数が分母の桁数を超える最初の例である.
最初の1000項を考えたとき, 分子の桁数が分母の桁数を超える項はいくつあるか?


```python
def hoge(num):
    def cnt():
        n, d = 1, 1
        for _ in range(num):
            n, d = n + d * 2, n + d
            yield len(str(n)) > len(str(d))
    return sum(cnt())

print(hoge(1000))
```

初めはこんなんやろうとしたけどMemoryErrorで早々に怒られた。

```python
from fractions import Fraction

def hoge(num):
    def cnt():
        s = '1 + 1/2'
        for _ in range(num):
            F = Fraction(eval(s)).limit_denominator()
            numer, denom = str(F).split('/')
            yield len(numer) > len(denom)
            s = s.replace('1/2', '1/(2 + 1/2)')
    return sum(cnt())

print(hoge(1000))
```
AWS Glue -> Athena -> Lambdaと使ってみてハマったこと

AthenaはデータソースにS3を指定できて気軽に使えるんですが、ハマるときはハマる。

## An error occurred (InvalidRequestException) when calling the Start QueryExecution operation: Unable to verify/create output bucket

AthenaのOutputLocationに対して権限が足りないと言われる。 

IAMのPolicyでResourceに必要なarnを指定していましたが、
`arn:aws:s3:::athena-target-data/inpot/*`
`arn:aws:s3:::athena-target-data/export/*`
これだとエラーになりました。不十分なようです。
`arn:aws:s3:::athena-target-data/*`
ならばと、すべて与えてみましたがこれもエラー。

正確には、
`arn:aws:s3:::athena-target-data`
と指定しないと十分なResourceの指定とならないようでした。
（S3権限付与の一般常識なのかもしれない）

以下が正常に動いた時の設定。

```json
"LambdaAthenaPolicy": {
	"Type": "AWS::IAM::ManagedPolicy",
	"Properties": {
	"ManagedPolicyName": "athena-query-excute-lambda-policy",
	"PolicyDocument": {
		"Version": "2012-10-17",
		"Statement": [
		{
			"Effect": "Allow",
			"Action": ["s3:*"],
			"Resource": [
			"arn:aws:s3:::athena-target-data",
			"arn:aws:s3:::athena-target-data/*"
			]
		},
```

## Hiveのpartitionに沿ったkeyにしたらLambdaが反応しない

Hiveのpartitionを利用したかったので以下のようなkeyに出力結果を出していました。

`export/id=hogehoge/year=2017/month=12/day=19/1234567890.csv`

このkeyに対してLambda functionを仕込もう思い、下記のようにprefixを指定したが発火しませんでした。

```json
				{
					"Name": "prefix",
					"Value": "export/id="
				}
```

原因はどうやら `=` らしく、これを取ると発火するようになりました。
試してないですがもしかしたらURLエンコードをすればよいのかも。

以下が正常に動いた時の設定。

```json
"S3Bucket": {
	"Type": "AWS::S3::Bucket",
	"Properties": {
	"BucketName": "athena-target-data",
	"NotificationConfiguration": {
		"LambdaConfigurations": [
		{
			"Function": {
			"Fn::GetAtt": ["LambdaCopyFile", "Arn"]
			},
			"Event": "s3:ObjectCreated:*",
			"Filter": {
			"S3Key": {
				"Rules": [
				{
					"Name": "prefix",
					"Value": "export/id"
				},
				{
					"Name": "suffix",
					"Value": "csv"
				}
				]
			}
			}
		},
```

## zipでも読み込めると書いてあったが読み込めない

[Adding Classifiers to a Crawler \- AWS Glue](http://docs.aws.amazon.com/glue/latest/dg/add-classifier.html)
[Supported Data Formats, SerDes, and Compression Formats \- Amazon Athena](http://docs.aws.amazon.com/athena/latest/ug/supported-format.html)

> Files in the following compressed formats can be classified:
> 
> ZIP (as compression format, not as archive format)
> BZIP
> GZIP
> LZ4
> Snappy (as standard Snappy format, not as Hadoop native Snappy format)

CSVのときと同じ設定でよろしくやってくれると思ったんですが、そこまで甘くはなかった。
SERDEの設定を変える必要があると思うのだが、何に変えればいいのかがわからなかった。
ドキュメントを見ても見当たらなかったので、Crawlerでターゲットのzipを対象にして作成したテーブル設定を見ることで解決。

SERDEが `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe`　になっていたが、 `org.apache.hadoop.hive.serde2.OpenCSVSerde` でもOK.

Crawlerを使うとTable propertiesに `compressionType : zip` や `typeOfData : file`　が付いてくるので必要そうに見えるが、これらは不要。
あくまでもタグとしての利用っぽい。


## さいごに

ちょっと癖はあるけど設定できてしまえばS3をさくさく検索できてとっても便利。
だけどS3 SELECTのほうが気軽に使えるし速いし、今後はAthena使うこと減りそうな気もする。
GlueのJobはしっかり使えればかなり便利になりそうなので、Glueは引き続き使っていこうと思う。
LINE BOTのアイコン画像変更の方法がわかりづらかったのでまとめる

![LINE_Developers.png](https://qiita-image-store.s3.amazonaws.com/0/202653/86ca46c6-53f3-8fdd-177d-ce35ecf9c983.png)


直感的にはLINE developersの画面のアプリアイコン画像を変更すれば良さそうですが、ここを変えてもなぜかアイコン画像には反映されません。

![LINE_Developers.png](https://qiita-image-store.s3.amazonaws.com/0/202653/d6209115-8fa6-074a-d4ca-36377a6bde53.png)

変更はこちらを押します。

![LINE__MANAGER.png](https://qiita-image-store.s3.amazonaws.com/0/202653/4e5b0cdf-71b8-1929-bb0e-8d546bf3dfb9.png)

アカウント設定をおす


![LINE__MANAGER.png](https://qiita-image-store.s3.amazonaws.com/0/202653/c967d0d3-e6dd-ae24-cd04-f21ba1a65db2.png)

ここを変更するとアイコン画像が変わります。
ruumbaにパッチを送った話

# ruumbaにパッチを送った話

erbでもrubocopを走らせたくて[ruumba](https://github.com/ericqweinstein/ruumba)というプロジェクトを試していたらいくつか要求とあわないところがあったので2件ほどパッチを送ってました。
そして、それらがマージされて近々新しいバージョンとしてリリースされそうなので記事にしてます。

## [rubocopの実行結果を正しく判定するように](https://github.com/ericqweinstein/ruumba/pull/14)

CIサービスだと各CIのステップをシェルコマンドの実行結果を元に判定しているんですが、rubocopから返ってくる `exitstatus` をruumbaではうまく判定できていませんでした。
なので、1行だけ直して、整数値をゼロか（コマンドの正常終了）で

## [rakeタスクのドキュメントを詳しく](https://github.com/ericqweinstein/ruumba/pull/13)

rakeタスクとして実行する場合も設定ファイルを指定したい時があったので、加えさせてもらいました。
`{ arguments: %w[opts...] }` みたいに指定する必要があるので、わかったら楽なんですが、わからないと普通につらかったので入れされてもらいました。

毎回コマンドを覚えるのめんどうなので個人的にrakeタスクにするのをおすすめします。

## 終わりに
これだけやっといてアレですが、結局すぐにCIで使いたかったので、[erblint](https://github.com/Shopify/erb-lint)に移行してしまいました。

erbでrubocopを走らせる場合、スタイルがどうしても崩れまくるので、スタイル関係は基本的に設定ファイルで無効化した方が幸せです。
それから、erbからrubyのプログラムとして切り出される方法によるんですが（おそらくerblintとruumbaでそれぞれ微妙に違う）、けっこう偽陽性が多いので手で確認だけして、さくっと無効化するのが基本になります。

テンプレートやhelperを書いている時のあるあるかと思うんですが、HTMLインジェクションがかなりうるさいですが、どうしても使った方が楽なケースがどうしても多いのでそうゆうときは、コメントで無効化するとよいかと思います。
若干長くなるんですが、また見返す時に注意することができるので、ないよりはよいです。
数字の頭に0を加えて桁揃えする4つのやり方

「007」のようにひと桁の数字でも、頭に0を加えて3桁といった具合に桁揃えしたい場合があります。新旧の構文で4つほどのやり方を試してみました。なお、桁数は任意とします。

#forループで0を加える
もっとも標準的なのは、`for`文で必要な数の0を加えることでしょう。関数で定めることにします。引数は数字と揃える桁数です。数字をその桁数の文字列にして返します。

もとの数字の桁数が引数に受け取った桁数以上のときは、文字列にした数字をそのまま返します。桁数に足りない文の0を、`for`ループで数字の頭に加えるわけです。

```js
function setDigits(number, digits) {
	let number_string = String(number);
	digits -= number_string.length;
	if (digits > 0) {
		for (let i = 0; i < digits; i++) {
			number_string = '0' + number_string;
		}
	}
	return number_string;
}
```

#Array.prototype.join()メソッドで0を埋める
少し変わったやり方として、配列を使って[`Array.prototype.join()`メソッド](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/join)で0を埋めてみましょう。空の配列をつくったら、ほしい0の数のインデックスに数字を納めます。そのうえで、`Array.prototype.join()`メソッドの区切り文字に0を渡せば、手前のインデックスは空のまま0がつなげられるのです。

```js
function setDigits(number, digits) {
	let number_string = String(number);
	digits -= number_string.length;
	if (digits > 0) {
		const array = [];
		array[digits] = number_string;
		number_string = array.join('0');
	}
	return number_string;
}
```

#String.prototype.repeat()メソッドで連続した0をつくる
ECMAScript 2015 (ECMAScript 6)に加えられた[`String.prototype.repeat()`メソッド](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)は、参照する文字列が繰り返された新たな文字列をつくります。つまり、文字列の0をいくつでもつなげられるのです。すると、はじめの例のような`for`文は使わなくて済みます。メソッドの引数は繰り返す数です。

```js
function setDigits(number, digits) {
	let number_string = String(number);
	digits -= number_string.length;
	if (digits > 0) {
		number_string = '0'.repeat(digits) + number_string;
	}
	return number_string;
}
```

#String.prototype.padStart()メソッドで文字列の前に0を加える
ECMAScriptt 2017で新たに備わった[`String.prototype.padStart()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)はまさに、参照する文字列の頭に指定した文字列を繰り返し差し込んで必要な長さにするメソッドです。引数には、ほしい文字数と繰り返し埋める文字列を渡します。そして、ほしい文字数よりもとの文字数が多ければ、そのままもとの文字列が返されます。

```js
function setDigits(number, digits) {
	const number_string = String(number).padStart(digits, '0');
	return number_string;
}
```
zplug のマイベストプラクティス

普段ターミナルで使っている zsh をもっと便利したいので私は高速な [zplugin](https://github.com/zdharma/zplugin) などがありますが [zplug](https://github.com/zplug/zplug) を使ってます。

**注意:** 私の使い方は zplug 開発側の想定外の使用方法です。あくまでも自己責任で使ってください!

## tl;dr
```zsh
: 'zplug' && () {
	export ZPLUG_REPOS="$HOME/.zplug/src"
	export ZPLUG_HOME="$ZPLUG_REPOS/zplug/zplug"
	export ZPLUG_BIN="$HOME/.zplug/bin"
	export PATH=$ZPLUG_BIN:$PATH
	export ZPLUG_CACHE_DIR="$HOME/.zplug/cache"
	export ZPLUG_LOADFILE="~/.config/zsh/packages.zsh"

	source $ZPLUG_HOME/init.zsh

	if [[ $ZPLUG_LOADFILE -nt $ZPLUG_CACHE_DIR/interface || ! -f $ZPLUG_CACHE_DIR/interface ]]; then
		zplug check || zplug install
	fi

	if __zplug::core::cache::diff; then
		__zplug::core::load::from_cache
	else
		zplug load
	fi
}
```

以前記事にした [自動ダウンロードの高速化](https://qiita.com/Ress/items/775f755df655ca4511ee) やキャッシュの読み込みを速く行われるように [内部で使われている関数](https://github.com/zplug/zplug/blob/20ca2c82063f15a2c107069b9af5cd32256e6019/autoload/commands/__load__#L38-L42) を使用してます。

## プラグインをどんどん設定していこう!
`$ZPLUG_LOADFILE` で指定したファイルにどんどんプラグインを追加していくだけです!

```zsh:設定例
zplug "zplug/zplug"

zplug "zsh-users/zsh-completions"

zplug "zdharma/fast-syntax-highlighting"
```

## どうして開発側の想定外の使い方をしてるのか
読み飛ばしていただいてもOKです

zplug 開発側が想定してる使用方法の場合 zplug の自動更新を設定するために `zplug --self-manage` コマンドを実行すると思います。
ですがこの方法では `$ZPLUG_ROOT` と `$ZPLUG_HOME` という 2種類の zplug を `zplug --self-manage` コマンドでシンボリックリンクを作成するというものでした。
この構造ではわかりにくいと感じ issue を立てたり P-R を作成し次のようなディレクトリ構造が成り立つようにしました

```sh
~/.zplug
├── bin             $ZPLUG_BIN
├── cache           $ZPLUG_CACHE_DIR
└── src             $ZPLUG_REPOS
    └── zplug
        └── zplug   $ZPLUG_HOME
```

これにより zplug をインストールした際に管理がしやすくなりました!

## まとめ
あくまでも私が管理がやりやすいようにやってますので公式が行ってるようにやってもらったほうがいいと思います。


**宣伝**: [39e/zplug](https://github.com/39e/zplug) では高速化を行ったりPATHが追加されない問題を修正など自分なりに解決してるので是非試してみてください
分散型の信用保持(身分証明)システム、あるいは分散型IDシステムの調査

uPort, Bloomとも現時点(2018/03/20)では具体的に出来ることはほぼ何もない模様。

## uPort
- 本家サイト？
    - https://www.uport.me/
- Ethereumブロックチェーンを利用したデジタルIDサービスuPort
    - http://gaiax-blockchain.com/uport
- 【イーサリアム】安全かつ超簡単な身分証明を目指す「uPort」の仕組み
    - https://zoom-blc.com/how-uport-is-working
- 自己主権型アイデンティティシステムのuPortが解決できない問題もある
    - https://www.cryptostream.jp/post-4835/

## Bloom
- 本家サイト
    - https://bloom.co/?locale=ja
- イーサリアムベースの信用評価アプリケーション「ブルーム」に関心が高まる/エキファックス社の情報漏洩問題が原因
    - https://coinonline.net/articles/9516
- クレジットスコアリング大手Equifaxのデータ流出被害拡大を受け、Bloomのブロックチェーン対応クレジットアプリが記録的な登録数を達成
    - http://thebridge.jp/2018/03/blooms-blockchain-credit-app-sees-record-signups-after-more-bad-news-from-equifax

## 関連記事
- 第三の時代を迎える「信用」について
    - https://jp.techcrunch.com/2018/03/20/2018-03-16-the-third-age-of-credit/


- Storj vs. Sia vs. Maidsafe：三大ブロックチェーンストレージの比較 (とても読みにくい)
    - https://rhizomebrain.net/storj-vs-sia-vs-maidsafe/
    
- DAPPS（分散型アプリケーション）とは？将来性と仮想通貨の活用事例も紹介！
    - http://coiner-blog.com/dapps/basis