OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Summit Tokyo 2018で気になった内容メモ_RDBMSだけで本当にいいの？NoSQL on AWSの勘所

AWS Summit Tokyo 2018の「RDBMSだけで本当にいいの？NoSQL on AWSの勘所」のセッションを聴いて、個人的に気になった部分をまとめています。
まだ資料が公開されておらず、個人のメモをベースに書いているため、内容が全て網羅されているレポートではありません。
資料、動画が公開されたら別途ちゃんとしたレポートを書きます(多分)

# NoSQLでよくある話
- 特にRDBMSで困ってない
- NoSQL使ってみたけど運用大変だし、性能悪い
- NoSQLどういう時に使う？

# NoSQLとは
- RDBMS
	- ストレージに最適化
	- トランザクション処理に強い(これが一番デカい)
	- スケールアウトの煩雑さ
		- まだまだこれからだし、お金もかかる
	- テーブルの運用負荷
- NoSQL
	- 計算リソースに最適化
	- トランザクション処理は限定的
	- 高いスケーラビリティ
		- もともとここを考えて作られているので
	- クラスタの運用負荷
		- 規模が大きくなるとサーバが増えてくるので

## NoSQLの種類
- KVS
- カラム指向
- ドキュメント指向
- グラフ指向

## NoSQLで実現したいこと
- どこまでスケールしても変わらない基盤
- 低レイテンシ、高スループット
- スケールするWebセッション管理
- Pub/Sub
- イベント処理
- Jsonなど複雑なデータの格納

# Amazon ElastiCache
- インメモリKVS
- フルマネージド
- ハイパフォーマンス
- 高いスケーラビリティ
- RedisとMemcachedが利用可能
- Amazon Redis(Amazonによる拡張)
	- バックアップの改善
	- フェイルオーバー時の起動が可能

## 追加機能
- Redis Cluster Online Resizing
- セキュリティ機能の強化
- HIPAA認証取得

## Redis Cluster
- Redis3.2からクラスターのサポート

## Redis Cluster Online Resizing
- Redis Clusterのシャード数をダウンタイム0で動的に増減変更する
- SNSやLambdaと連携することでAutoScaleも可能
	- メモリの枯渇度に合わせてリソースの増減

# DynamoDB
- フルマネージド
- 高速
- スケーラビリティ
- イベント指向

## 管理不要で信頼性が高い
- SPOFが存在しない
- データは3箇所のAZに保存される
	- 3箇所一気にデータセンターが落ちなければ大丈夫
- ストレージは自動的にパーティショニングされる

## ストレージの容量制限がない
- 従量課金制のストレージ

## 追加機能
- バックアップ/リストアにネイティブ対応
	- 数百TBのデータベースでもパフォーマンス影響なし
- Global Tables
	- 複数リージョンでデータを共有したテーブルを作れる
	- 全てのローカルにあるリージョンのテーブルに読み書きしたものが非同期にレプリケーションされる
- Auto Scaling
	- デフォルトで対応
	- キャパシティ設定を動的に管理
- DynamoDB Accelerator(DAX)
	- 間にキャッシュクラスタを置くことができる
	- パフォーマンス向上、コスト最適化
- TTL
	- テーブルのITEMの有効期限を設定して、非同期で削除してくれる
    - 設定しておくだけで古い不要なデータの削除が可能

# Amazon Neptune
(ここはあんまり理解できてないです・・・)
- グラフDB
- フルマネージド
- SPARQLとGremlinに対応
- Apache ThinkProp、W4C RDFグラフモデルをサポート

## グラフDBの得意な領域
- 高度に連結されたデータ
	- ソーシャル・ネットワーク、レストランのレコメンデーション、不正取引の検出
	- SNSでよく見ているデータとか、家族が見ているデータとか
	- 店のLikeの情報から、その人に対するおすすめを出す
- 高速
- 高信頼性
- 簡単
- オープン

# NoSQLのユースケース
## キャッシング
- DBへのアクセスを減らすためのキャッシュ
- DBにクエリが走った時にLambdaでElastiCacheに入れたりできる
- DAXの活用

## IoT
- データ量が多い
- AWS IoTから送られたデータを、DynamoDBへ保存
	- Redisを使う場合はLambdaをかます

## Pub/Sub
- チャットメッセージのPublishとSubscribeの実行

## リアルタイムリーダーボード
- Redisによるリアルタイムランキング

## グローバルアプリケーション
- DynamoDBのGlobal Tables
	- 全部やると大変なので、グローバルに必要なものだけ切り出して使う(マスタデータとか)
	- 各ローカルで使うようなものは、各リージョンで持てば良い

## 非同期処理のトリガー
- DynamoDB Streamsを使い、DBの変更内容をほかサービスへ連携
	- Lambdaと連携する(Lambdaにつなげればもはやなんでもできる)

## 時系列データが必要なアプリケーション
- ホットデータとコールドデータでテーブルを分ける

# NoSQLのデザインパターンの考え方

## NoSQLのデータモデリング
- RDBMSでの手法を当てはめても、最適でない場合がある
	- 非正規化とか
- データの連携等にこだわらずに実現したいことにこだわる

## DynamoDBのデータモデリング
- DynamoDBの構造
	- パーティションキーとソートキーがプライマリキーになる
- Global Secondary Index
	- GSIを自由に作成することで自由に検索できる

# 事例
- Mackerel
- AmazonではOracleから全てDynamoDBに変えた

# 感想
キャッシュとしてMemcachedやRedisは使っているのでElastiCacheは分かっていたが、DynamoDBはなんとなく「Mongo DBのクラウド版みたいなもん？」くらいにしか思ってなかったので、機能とか設計の考え方とかを色々聞けて参考になった。
作るものの要件次第ではRDBMSの代わりとして十分使えそうだし、手軽に扱えるのも魅力。
Neptuneはこのセッションの日の直前にちょうどGAになったところだったので興味あったけど、まだイマイチ理解できず。
まずグラフDBちゃんと理解したい・・・
[WWDC2018] What's New in Testing

WWDC2018でテストに関する新機能が発表されました！
時差ボケで寝れないので現地からこの記事を書いてます:)

## What's New in Testing

**Parallel Testing**
Xcode10から、単一のdestinationで並列にテストを実行させることができるようになりました。

Xcode9では複数のdestinationでテストを同時実行させるできましたが、複数のdestinationが必要なケースでしか効果を得られませんでした。

Xcode10では、並列にテストクラスが実行されます。したがってテストクラスが多く、テスト実行時間が長かったプロジェクトほどその恩恵を受けられるでしょう。↓

・今まで

```
start -> ATests (3秒) -> BTests (4秒) -> CTests (5秒) -> finish (12秒)
```

・Parallel Testing 

```
       |-> ATests (3秒)
start -+-> BTests (4秒) -> finish (5秒)
       |-> CTests (5秒)

```

テスト実行時間が単純に短縮されるので最高の機能です。
※ 並列化の台数は環境によって最適化したほうが良さそうです。


**Test Ordering**
もうひとつ、実行順序についてです。
defaultはAlphabet順ですが、オプションでrandomizedを選択できるようになりました。
並列化もそうですが、実行順序をランダムにすることで、実行順に依存してしまっているテストを発見することができます。
テストは基本的に疎である方が安全なので、これも素晴らしい機能です。


**Tips&Tricks**
ひとつのテストクラスの実行時間が、全体の実行時間に対して支配的な場合は、
そのテストクラスを分割することで、全体の実行時間を短縮することができる、といったTipsも紹介されていました。
詳しいTips&Tricksは金曜に別のセッションがあるようなので、その内容も後日追記したいと思います。


## 感想
テストの並列化はXcode10の目玉機能だと思います。
これによって世界で何時間分のテスト実行時間が短縮されるかと思うとすごいですね！w
VS Code1.24の新機能 - 置換フィールドの履歴参照機能

# Visual Studio Code 1.24の新機能
## 置換フィールドの履歴参照機能
検索ビューでの、`検索`フィールドについては`Alt`+`↑`/`↓`で入力履歴が参照できていたが、`置換`フィールドについても同様の操作ができるようになった。

しょっちゅう置換する人(!?)にとっては便利そう。
GNU GCCのビルド（ソースから）

CentOS 7系のyumリポジトリに登録されているもののバージョンが古かったので新しいものを入れるために実施した

# 手順
1. 必要なライブラリをインストールする

    ```
    # yum -y install gcc gcc-c++ gcc-gnat libgnat libgnat-devel m4 automake autoconf gettext gperf autogen flex texinfo python-sphinx diffutils patch
    ```

2. ソースのダウンロード

    ```
    # curl -LkvOf http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-10.1.0/gcc-10.1.0.tar.gz
    ```

3. 破損がないか確認する

    ```
    # sha512sum gcc-10.1.0.tar.gz
    c924a50bdf819adc34356aeb254a4871beafbb32367e2671c156e6901ac663d7c697d05b540bf1dbf5a6e0ba64562667c0a7ce458c4c9297aa7f0a55e1def8ae  gcc-10.1.0.tar.gz
    ```

4. ファイルを展開する

    ```
    # tar zxf gcc-10.1.0.tar.gz
    ```

5. ディレクトリを移動し、モジュールをダウンロードする

    ```
    # cd gcc-10.1.0
    # ./contrib/download_prerequisites
    ```

6. configureスクリプトを実行する

    ```
    # ./configure --enable-languages=c,c++ --prefix=/usr --disable-bootstrap --disable-multilib
    ```

7. makeコマンドを実行する

    ```
    # make -j4
    ```

8. インストールする

    ```
    # make install
    ```

### 確認
```
# which gcc
/bin/gcc

# gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/10.1.0/lto-wrapper
ターゲット: x86_64-pc-linux-gnu
configure 設定: ./configure --enable-languages=c,c++ --prefix=/usr --disable-bootstrap --disable-multilib
スレッドモデル: posix
Supported LTO compression algorithms: zlib
gcc バージョン 10.1.0 (GCC) 

```

# 参考
- [Tools/packages necessary for building GCC](https://gcc.gnu.org/install/prerequisites.html)
- [Installing GCC](https://gcc.gnu.org/install/)
- [gcc 7.2.0 をソースからビルドする](https://qiita.com/tetsu_koba/items/efd62c24406a89addba9)
- [gccをソースからビルド／インストールする](https://qiita.com/liveralmask/items/6ed4a98ebb3bf6b7f707)
- [gccをビルドしてインストール](https://teratail.com/questions/114006)
- [GCC - 最新版をソースビルドでインストール(on LMDE 2)！](https://www.mk-mode.com/octopress/2017/12/28/lmde2-installation-newest-gcc-by-src/)
TypeScript：Type GuardとNull安全

以前 [C#erから見たTypeScriptの罠](https://qiita.com/aakasaka/items/32414bb821a742f330b1) という記事を書きましたが、その後 TypeScript 2.7 から strictPropertyInitialization による初期化漏れチェックが可能となり（参考：[TypeScript 2.7.1 変更点](https://qiita.com/vvakame/items/3a1e628e53a5dd99dfe0)）、TypeScriptはますます型安全な言語となりました。

```ts
private str: string;

public constructor() {
    //ここでstrを初期化しないとコンパイルエラーになる
    //this.str = "hoge";
}
```

## 「初期化の強制って気持ち悪くない？」

しかし、Javaなどに慣れ親しんだ人たちからは、こんな声があがるかもしれません。
初期化を強制されるって、なんかヌルポを避けるためにとりあえず初期値つっこんでおくバッドノウハウみたいで気持ち悪くない？と。

```java
//Javaとかで見る、Null例外だけ避けようとして適当な初期値を入れるやつ
private String str = "";
private int[] nums = new int[0];
```

そんなときは、nullとの共用型にすることによって、nullを許容する変数を作ることができます。

```ts

private str: string | null = null;
```

それをやったら、Null安全じゃなくなっちゃうんじゃないの？と思われるかもしれませんが、これはわりと安全なんです。

## Type GuardでNull安全

先に書いたnull許容の変数に対し、ノーチェックでstring型のメンバ（lengthなど）を参照しようとすると、stringかnullかが確定していないため、コンパイルエラーになります。

```ts

private str: string | null = null;

public getLength(): number {
    //エラーになる
    return this.str.length;
}
```

TypeScriptにはType Guardという仕組みがあり、型チェックのif文を作ることによって、以降のルートでは、型を確定した上でコンパイルチェックできるようになります。
つまり先ほどの例は、以下のように書くことで利用可能となります。

```ts
private str: string | null = null;

public getLength(): number {
    if (this.str != null) {
        //ここではstringであることが確定する
        return this.str.length;
    }
    return 0;
}
```

使う前にNullチェックを強制される。
お気づきかもしれませんが、これはまさしく他の言語のMaybe/Optionalに相当するものですね。

ちなみに、以下のように疑似的なNull合体演算子を使って短く書くことも可能です。

```ts

private str: string | null = null;

public getLength(): number {

    return (this.str || "").length;
}
```

## まとめ

以上のように、strictPropertyInitializationを有効にしたからといって不便が生じることはありません。積極的に利用しましょう。

strictオプションをtrueにしておけばstrictPropertyInitializationも有効になりますし、strictオプションをtrueにしないことはまずないでしょうから、通常あまり意識せずとも利用することになると思いますが。
Redmineのバージョンアップ

１．バックアップ

```bash
cp -Rp /var/lib/redmine/files .
/usr/pgsql-10/bin/pg_dump -U redmine -Fc --file=redmine.sqlc redmine
```

２．アップグレード

```bash
cd /var/lib/redmine
svn update
bundle update
```

３．データベースの更新

```bash
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

４．キャッシュのクリア

```bash
bundle exec rake tmp:cache:clear tmp:sessions:clear RAILS_ENV=production
```

５．再起動

```bash
chown -R apache redmine-3.4.3
chgrp -R apache redmine-3.4.3
service httpd restart
```

６．バージョンアップ

```bash
wget http://www.redmine.org/releases/redmine-3.4.3.tar.gz
tar -zxvf redmine-3.4.3.tar.gz
rm redmine-3.4.3.tar.gz
```

７．バックアップの戻し

```bash
cp -Rp 上記１でバックアップしたfiles redmine-3.4.3/files/.
```

８．プラグインのアップデート

```bash
cd /var/lib/redmine/plugins
git clone https://github.com/peclik/clipboard_image_paste.git
git clone https://github.com/suer/redmine_absolute_dates.git
git clone https://github.com/koppen/redmine_github_hook.git
git clone https://github.com/akiko-pusu/redmine_issue_templates.git
git clone https://github.com/sciyoshi/redmine-slack.git
git clone https://github.com/haru/redmine_theme_changer.git
git clone https://github.com/haru/redmine_wiki_extensions.git
git clone https://github.com/bdemirkir/sidebar_hide.git
git clone https://github.com/onozaty/redmine-view-customize.git
git clone https://github.com/akiko-pusu/redmine_banner.git
git clone https://github.com/suer/redmine_japanese_help.git
git clone https://github.com/ameya86/redmine_maintenance.git
mv redmine-slack redmine_slack
wget https://bitbucket.org/tkusukawa/redmine_work_time/downloads/redmine_work_time-0.3.4.zip
unzip redmine_work_time-0.3.4.zip
rm redmine_work_time-0.3.4.zip

bundle install --without development test rmagick
→redmineとpluginのGem定義のバージョンの競合が発生した場合は、Gemfileを修正して大きい方のバージョンに合わせる。

bundle exec rake generate_secret_token
bundle exec rake db:migrate RAILS_ENV=production
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
bundle exec rake tmp:cache:clear tmp:sessions:clear RAILS_ENV=production
service httpd restart
```
Python で Web ページの本文を抽出する

Web ページからテキストを抽出する場合、単純にタグの中のテキストコンテンツを抽出すると、メニューなどの本文ではないテキストも大量に混ざってしまう。

そこで Web ページの中から本文っぽいテキストだけを抽出するために、boilerpipe という Java ライブラリの Python ラッパーを試してみた。

- [kohlschutter/boilerpipe](https://github.com/kohlschutter/boilerpipe)
- [misja/python-boilerpipe](https://github.com/misja/python-boilerpipe)

boilerpipe 以外にも Newspaper や Goose といったツールも試してみたが、他のツールは日本語コンテンツに対応していなかったり、Python 3 に対応していなかったりしていてうまくいかなかった。

## インストール
`pip install boilerpipe` だと jar の URL が古くてダウンロードできないので GitHub からインストールする。

``` console
$ pip install git+https://github.com/misja/python-boilerpipe
```

裏で jar を実行しているので、JVM がインストールされている必要がある。

例えば Ubuntu / Debian だったら

``` console
# apt install default-jre
```

こんな感じでインストールしておく。

## URL から本文を抽出する
色々な Extractor があるらしいが、本文を抽出するには ArticleExtractor を使う。

``` python
from boilerpipe.extract import Extractor

url = 'https://www.buzzfeed.com/jp/kensukeseya/uenozoo1'
extractor = Extractor(extractor='ArticleExtractor', url=url)
print(extractor.getText())
```

このような出力が得られる。

```
5月15日時点の体重は 26・6キロ 。永久歯に生え替わりつつあり、10日には固形物を初めて食べたといいます。
そんなシャンシャンが1歳になるにあたり、上野動物園はさまざまな企画を用意しています。
1歳を記念して、6月12日から17日まで、シャンシャンの写真を使った記念カードの配布、「シャンシャン1歳記念限定メニュー」としてうどんやパンナコッタの販売などをする予定です。
誕生日当日に来園できなくてもお祝いしたいですね
```

実際のページを見て比較してみると、取りこぼしが多くあまりちゃんと取得できていないが、いったん目を瞑る・・・。

## HTML 文字列から本文を抽出する
url オプションの代わりに html オプションに文字列を指定する。

``` python
from boilerpipe.extract import Extractor

# 何らかの別の手法で HTML テキストを取得
url = 'https://www.buzzfeed.com/jp/kensukeseya/uenozoo1'
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as res:
    html = res.read()

extractor = Extractor(extractor='ArticleExtractor', html=html)
print(extractor.getText())
```
CSS Filter と Leaflet で地理院タイルにエフェクトをかけてみる

# はじめに

地理院地図で日本全国の赤色立体地図の提供がはじまりました。

- [地形が直感的にわかる地図を公開します](http://www.gsi.go.jp/bousaichiri/release_thematic_maps_20180606.html) (国土地理院 2018-06-06)
- [日本全国の「赤色立体地図」が見放題、国土地理院がウェブで公開](https://internet.watch.impress.co.jp/docs/news/1126179.html) (INTERNET watch 2018-06-07)

しかし [反響](http://b.hatena.ne.jp/entry/s/internet.watch.impress.co.jp/docs/news/1126179.html) を見てみるとグロさが気になって正視できない方々も一定数いるようです。 地図表示用ライブラリ [Leaflet](https://leafletjs.com/) を使って地理院タイルを表示、これに [CSS Filter](https://developer.mozilla.org/en-US/docs/Web/CSS/filter) を適用して地図の色味を変えてみましょう。

## 追記 (2018-06-25)

[国土地理院コンテンツ利用規約] (http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html) (2018-06-25 閲覧) によると

> 赤色立体地図はアジア航測株式会社の特許（第3670274号等）を使用して作成したものです。赤色立体地図を利用される場合は、アジア航測株式会社の [許諾条件](https://www.rrim.jp/researcher/) を確認してご利用ください。

とされており、リンク先の許諾条件に抵触しないように利用する必要があります。この記事が許諾条件に抵触するかどうかは判断つきかねるので、この記事の画像およびデモ、ソースコードから赤色立体図を使用するものを自主規制しました。


# ツール

Leaflet で地理院タイルを表示、背景地図に対して CSS Filter を適用するツールをつくりました。

- Demo : <https://bl.ocks.org/frogcat/raw/d3b9c8039f13b0603120ddf7a2edfb0c/>
- Source : <https://gist.github.com/frogcat/d3b9c8039f13b0603120ddf7a2edfb0c>


左側のスライダーを動かすとさまざまな CSS Filter Effect をかけることができます。


実用的な事例としてはこんな地理院の標準地図を

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/d30f63d7-7665-59e3-0697-e864464e70c7.png)

夜っぽい地図とか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/b35eb3ce-4606-548d-aff3-90dcfdd6c7ec.png)

紙っぽい地図とか
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82494/f44caf6d-147f-dc7e-2ad0-48a341b43c90.png)

好みの色調に調整して使うのがよいのではないかと思います。
Readable Code を読む - 第3部と第4部 -

Readable Code を読む
====================
今までほぼ我流でコーディングしてきたので，ずっとどうにかしたいと思っていました．
そんなときに，O'REILLYの **Readable Code** を奨めてもらったので，読んで自分用にまとめてみようと思います．

今回の内容は，**第3部と第4部**です．

[はじめに・第1章はこちら](https://qiita.com/hsmtknj/items/8e126c81e7a055242135)
[第1部と第2部はこちら](https://qiita.com/hsmtknj/items/bc784cbff60256c951cc)
[第3部と第4部はこちら](https://qiita.com/hsmtknj/items/31601e3ebd51f22231b2)


本書は次のリンク先等で入手できます．
[Readable Code](https://www.amazon.co.jp/リーダブルコード-―より良いコードを書くためのシンプルで実践的なテクニック-Theory-practice-Boswell/dp/4873115655/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=77RQXSX2C82VCWRW3S02)


第３部 コードの再構成
===================
コードを大きく変更する技法を紹介．

- 大きな問題を小さな問題に分割
   - **一度にひとつのこと**をやる
   - プログラムの主目的と関係のない**「無関係の下位問題」**を抽出して，処理を分ける
- 最初にコードを**言葉で説明**する
   - 具体的な実装方法ではなく，「そもそも何をしようとしているのか」など


## 10章 無関係の下位問題を抽出する
**汎用コード（使い回せるコード）を分離**すると読みやすくなる．
因数分解みたいな感じ．共通の処理はまとめた方がよい．

- **ユーティリティコード（汎用コード）**の利用
    - ひとまとまりの手続き的な処理を関数化
    - 他でも使いまわせる
    - **ユニットテスト**も可能
    - 部分的な改善を一気に行うことが可能
- ユーティリティコードを**ディレクトリ（e.g. util/）にまとめる**
    - コードが独立しているため管理しやすい
- ラッパーして使いやすくするのも良し
- 細かく関数化しすぎるとかえって読みにくい


## 11章 一度に1つのことを
- コードが行なっている「タスク」をすべて列挙する
- タスクをできるだけ**異なる関数に分割**する


## 12章 コードに思いを込める
> _おばあちゃんがわかるように説明できなければ，本当に理解したとは言えない_
>[_アルバート・アインシュタイン_]

- コードの動作を簡単な言葉で**誰でも分かるように**説明する（コメントなど）
- 説明の中で使っている**キーワード**や**フレーズ**に注目する
- 説明に合わせてコードを書く

**「簡単な言葉で説明」**してみると良い．
**言葉にできない**とき，それは**自分の理解が明確でない**ときである．


## 13章 短いコードを書く
自分で書いたコードは，すべての行をテストして保守すること
**「欠かせない機能は何か？」**と自問自答する（けっこういらない機能を作ってしまっている）

- ライブラリの再利用
- 機能の削除
   - 未使用のコードを削除（消したくない気持ちは分かる）
- 問題の簡略化
   - 簡単な問題に置き換えられないか
- 重複するコードを削除
   - 汎用的な**ユーティリティコード**を作成
- プロジェクトを**サブプロジェクトに分割**
- **標準ライブラリ**を使用する
   - できそうなことを雰囲気でつかんでおく
   - 自分のコードより標準ライブラリのほうが信頼できる


第４部 選抜テーマ
===================
- 効果的で読みやすいテストの書き方
- 特定用途のデータ構造の設計と実装


## 14章 テストと読みやすさ
- **大切な詳細は目立**つようにする
    - 大切ではない詳細はユーザから隠す
    - テストの本質ではないコードは関数などを使ってまとめる
- **良い```assert()```**を使う
    - エラーの原因を表示してあげるなど
    - 手作りのエラーメッセージも良い
- コードを**完全にテストする最も単純な入力値の組合せ**を選択する
- 1つの機能に**複数のテスト**
- **テストの機能に名前**をつける
    - テスト関数の名前はコメントと思え（多少長くても気にしない）
    - ``` test_<関数名>() ```
    - ``` test_<関数名>_<状況>() ```
- **テスティングフレームワーク**の利用
    - ヘルパー関数の利用（テストの関数化）
    - e.g. ```check_<チェック内容>()```: assert()を利用しているヘルパー関数の名前の付け方
- **テストを意識したコード**を書く
    - どうやって評価するか，考えながらコーディング
- カバレッジ90%を目指す（100%は現実的に難しい）
    - 作っている製品の特性による
    - 安全が重要な製品はテストに集中する必要がある

NOTE:
テスト容易性の低いコードの特性とそこから生じる設計の問題 (p194)
テスト容易性の高いコードの特性とそこから生じる設計の利点 (p195)


# 今回のまとめ
今後コーディングするにあたって，非常に参考になった本でした．コーディングする前に，このメモを何度も読むことになりそうです．
この本のテクニックを念頭において，過去に自分が書いたコードをリファクタリングしてみるのも力がつきそうな気がします．

> _読みやすいコードを書いて、自分が書いたコードを忘れてしまっても問題ないようにして欲しい。読みやすいコードを書こう。忘れてもいいコードを書こう。_
>
> _「自分が書いたコードってどのくらい覚えているんですか？」_
> _「ほとんど覚えていないですよ」_
> _「直すときどうするんですか？」_
> _「忘れても見たら簡単にわかるように書いておくんですよ」_
>
> p231から引用
> [ _須藤 功平 氏_ ]

こういう考え方，好きです．
VS Code1.24の新機能 - 同一ワークスペースを複数ウィンドウで開く

# Visual Studio Code 1.24の新機能
## 同一ワークスペースを複数ウィンドウで開く
https://code.visualstudio.com/updates/v1_24#_duplicate-workspace-in-new-window

新たにコマンド「**新しいウィンドウでワークスペースを複製**」が追加された。これにより、同一ワークスペースを複数ウィンドウで開くことができるようになった。

今までは、すでにワークスペースが開いている状態で別の新しいVS Codeウィンドウを開いてそこで同じワークスペースを開こうとしても、すでに開いているワークスペースのVS Codeのほうにフォーカスが移るだけだった。

またその際、ファイルの自動保存の設定（`files.autosave`）を`off`以外に設定すると、２つのウィンドウ間の連動がよりスムーズになる（設定が`off`の場合は明示的にファイルを保存しないともう一方のウィンドウに変更が反映されない）。

![duplicate.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/def8fc24-cc9c-f329-3850-5e7b7efe2502.gif)

今のところVS Codeをこういう使い方をする場面はないけど、知っておくといつか使える場面がありそう。
expectは手抜きしたら駄目だった


###切掛
偉い人「監査するからデータ収集スクリプトを使って全サーバ(数十台)のデータくれ」

1つのスクリプト自体は10分程度で終わるけど、全てにログインして手動でやるのは
流石に面倒なので、一括処理のために作ったperlスクリプトの超抜粋。

```sequencial.pl
foreach(対象リスト){
    処理色々;
}
```
※処理色々はsshやexpectでゴニョゴニョ
これで数時間放置したら自動で集められるようになった。

###ある日
偉い人「データ収集スクリプトがバージョンアップされたからこっち使って」

性能劣化？なのかやることが増えたのか30～40分、長いと1時間超えになった。
単純計算でも24時間で終わらない。

仕方がないので並列処理化。

```parallel.pl
$kids=0;
foreach(対象リスト){
    $pid=fork;
    if($pid){
        $kids++;
        next;
    }else{
        処理色々;
        exit;
    }
}
for(1..$kids){
    $pid=wait();
    print "$pid 終わり\n";
}
```

###ここから本題
処理自体は無事完了したけど下記症状が発生。

1. "$pid 終わり\n"が、本当に改行の動作しかしないことがある。(\rをつければ復帰もした)
2. 終了してプロンプトに戻ったあとに、キーボードを受け付けなくなった。

####そんなわけで調査開始
|やったこと|結果|
|:--|:--:|
|処理色々をローカルでの処理にする|○|
|処理色々をsshのみにする|○|
|処理色々をexpectのみにする|△(発生しないこともある)|
|処理を変えずに対象リストの中身を1つにする|○|

expectらしいけど、発生しないこともあるのはなんで？ということでexpectを深掘り。
####調査その2
|やったこと|結果|
|:--|:--:|
|expectを1つだけ実行させる|△|
|expectを複数実行させる|△|

なんでexpectの数量とは関係ないってなんで？中身の問題？
####調査その3
|コード確認|結果|
|:--|:--:|
|expect eofがある|○|
|expect eofがない|△|

というわけで、expectのスクリプト作成時の問題。
標準出力の掴み合いでなにか起きているのかな？(治ったからこれ以上は掘らない)
シーケンシャルだと雑な作りでもキレイに動いちゃうんだね。
正規のものにしないからって、動きゃいいって割り切るとこういうことになるという残念事例。
electron-vue file structure problems

#electron-vue component directories problem
I've been using <b>electron-vue</b> for quite a while, and seem like I really like working with it. Recently I tried with one sample project and I want to put all of my component in my structure way but seem like <b>electron-vue</b> doesn't allow me to do so.

I created two type of components (Scence and UI Component).
<img width="192" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/063358f2-d8ad-2469-621e-89f83710d07d.png">


Basically, Scence store all the the screen component like <b>Login</b> or <b>LandingPage</b>, and UI store something like <b>NavBar</b> or <b>SideBar</b>. All of them are set of component file (vue, css and js)
<img width="157" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/8b480836-4e39-ac82-2e22-ef576d3cb8e1.png">
The main problem is, If I attempt to categorise it like this, it will give me some error in the console.
<img width="803" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/4a0e455a-973a-8e04-45ff-2eb22dfb24f1.png">
After a few hours of research, I found out that the problem cause related to vue webpack and I also try some of those solutions I found on the internet, but seem like the error doesn't get resolved. At the end I end up with following the default directories structure given by <b>electron-vue</b> itself.

The <b>LandingPage.vue</b> position has to be under the <b>components</b> folder in order to make the application run properly. By doing so, you still can create directories for your child components as well.
<img width="167" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/211892/c8a84dc5-e605-b510-6aae-486fa6f6b287.png">

As we see in the above picture, we still can categories our project's structure.
JMeterをLinuxにいれる②……ようとしたらsshでサーバに入れなくなった話

## 概要

~/.bashrcがめちゃくちゃになったらssh出来なくなった話

 - ~/.bashrcをいじったのは、jmeterをエイリアスで登録したかったからです
 - JMeter関係ない！と思った人、大正解です。
 - 開発用サーバでよかった話です。

### 2023年4月追記
文面の体裁を整えるため更新。新しい情報は何も入っていません。

## 前振り
[色々ありまして](https://qiita.com/sykx_16g/items/16f1712580c2e7c81080)JMeterをインストールし、~/.bashrcにエイリアスを設定した私。
`source ~/.bashrc`を打ちご満悦です。

    Vim: Caught deadly signal HUP
    Vim: Finished.
    Connection to 10.xxx.xxx.xxx closed.
    
Caught deadly signal HUP？何語？？？
あれ、サーバから追い出されてない！？なんで！！！？？？？
(結局ここはStackOverFlow読んだけどよくわかりませんでした。)


### 悪夢終わらず

とりあえずもう一度ssh入ろうとがんばります

    [root@AAAAA ~]# ssh 10.xxx.xxx.xxx
    root@10.xxx.xxx.xxx's password:
    Last login: Thu Jun  7 14:27:49 2018 from 10.xxx.xxx.xxx
    
    （少しの間）
    
    Connection to 10.xxx.xxx.xxx closed.


その後何度やってもこの状況はかわらず。
一応Last Loginの値は更新されてるみたい。→認証は成功してるのかな？
それ以外ノーヒント。

### 直前にやったことを思い出す

JMeterのバージョンを下げましたね。([前回記事](https://qiita.com/sykx_16g/items/16f1712580c2e7c81080)参照)
そのときにエイリアスを更新しようとしてますね。
**~/.bashrcを編集してますね**

どう考えてもこれが原因な気がする！！！

### とはいえどうするか
実機は遠隔地のデータセンターなので今のタイミングでは見に行けない。つまりsshで入れないと~/.bashrc見れない……。

いや、ログインは成功してるんだから、ログインしてから~/.bashrcをどうにかしたらどうにかなるのでは？
~/.bashrc読み込むタイミングを探します！

#### 結果
……ログイン直後に~/.bashrcを読むそうです。
…………詰んでない？

## 解決方法(荒業)

Last Login～行が表示されたら **[Ctrl + C]** を沢山押します。
そうすると、~/.bashrcを読みこまないそうです。

こんなコンソールになります。こうなってるのがどういう状況なのかは **今後調査** します

    Last login: Thu Jun  7 16:20:08 2018 from 10.xxx.xxx.xxx

    ^C^C^C^C^C^C^C^C^C^C-bash-4.1# ^C
    -bash-4.1# ^C
    -bash-4.1# ^C
    -bash-4.1# vi ~/.bashrc
    -bash-4.1# source ~/.bashrc

このすきに~/.bashrcを直す。
そしてsourceすると無事解決。お疲れ様でした。


    # jmeter -v
    Copyright (c) 1998-2013 The Apache Software Foundation
    Version 2.9 r1437961


## これからのこと
windowsでテストケースを作ります。。。
便利なテストケースつくるツールください。。。。。。。。。。。。。

## おまけ
### たぶん役に立ったこと
~/.bashrcが原因だと疑った段階で、他の正しく動いているサーバの~./bashrcを見に行きました。
何が違っていたかは一目瞭然。めちゃくちゃな文字列が混ざりこんでいたみたいです。不注意をなくしていきたいですね。
false vs False 言語対決!

備忘録の一種。

True,FalseといったBooleanな値を書くにはということの、言語差を感じた。

# JavaScript
```javascript:return_false.js
function return_false(){
    return false;
}
```
小文字のfalse、**大文字Falseは未定義**=変数代入できる、0と1はOK

# Python(CPython 3.6)
```python:return_false.py
def return_false():
    return False
```
こっちは逆で、大文字False、**小文字falseは未定義**=変数代入できる[^1]

# C
```c:return_false.c
/* mainは省略 */
int return_false(void){
    return 0;
}
```
trueもTrueも通じない。

# Ruby(追記 2018/07/07)
Rails開発を始めたので。
```ruby:return_false.rb
def return_false
    return false
end
```
小文字のfalseが通じる。FALSEは廃止だがRuby 2.5で使えた。
Falseはだめ。

# 結論
0と1が無難。

# 注釈
[^1]: Pythonの古いバージョンでは`True`や`False`も変数だった。
jQueryにてリンク先のドメインを一括置換

htmlのaタグ内に設定された特定のドメイン部分のみを、
開発サーバなど別環境に設置されている時にはその時のドメインに後から置換する、という処理を要求されたので
locationやreplaceやRegExpオブジェクトを総動員して実装しました。

```javascript
$(window).load(function() {
    var tgtDomain = 'https://www.sample.jp'; //置換対象のドメインを設定
    var nowDomain = $(location).attr('protocol') + '//' + $(location).attr('host');
    if (tgtDomain) { //tgtDomainの入力の有無を判定
        if (tgtDomain != nowDomain) { //現在ドメインと対象ドメインの不一致を判定
            $('a[href^="'+ tgtDomain + '"]').each(function() { 
                var replace = null;
                var replace = $(this).attr('href').replace(new RegExp(tgtDomain, 'g'), nowDomain);
                $(this).attr('href',replace);
            });
        }
    }
});
```

```tgtDomain``` と ```nowDomain``` を逆にしても使えるかも。

###参考サイト
- [jQueryでaタグのhrefの値(リンク先URL)を差し替えもしくは置換する方法](https://www.materialpot.com/javascript/jquery/href_replace/)
- [jQueryでURLを取得（ホストやパラメータなどの部分取得も）](https://www.flatflag.nir87.com/location-1056)
- [javascript:replace()で正規表現に変数を使う場合](http://d.hatena.ne.jp/ogakky/20110720/1311159218)

---
###相対パスリンクに現在のドメインを挿入（2018/06/15追記）
上記を改変し、相対パスで書かれたリンクの前に現在のドメインを挿入する処理を実装しました。
開発サーバなどのディレクトリ構成が本番サーバと異なる場合などに使えます。

```javascript
$(window).load(function() {
    var nowDomain = $(location).attr('protocol') + '//' + $(location).attr('host');
    $('.wysiwyg a[href^="/"]').each(function() {
        var replace = null;
        replace = $(this).attr('href');
        if (replace.match(/^\/[^\/]/)){
            replace = nowDomain + replace;
            $(this).attr('href',replace);
        }
    });
});
```
【Unity】文字列の長さによってテキストボックスのサイズを変える

# Content Size Fitter を使う

背景画像を文字列に合わせてスケールさせたい時とか。

<img width="400" src="https://qiita-image-store.s3.amazonaws.com/0/130191/67b0e66f-088b-0c41-9a82-8aa5830793be.gif">


Content Size Fitter を使って調整する。
ImageをTextの子供に。
Textのサイズを直接変えることが出来なかったので、Imageをかませている。
ImageがTextに合わせて自分のサイズを変更して、Textのサイズも調整している。

<img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/130191/a3f76687-1a8c-5ba3-0bca-00c8b70e9644.png">

Text単体をスケールさせたいならば、テキストにContent Size FitterをつけるだけでOK

# Scroll View を使う場合

ノベルゲームにおけるログを表示したい時など。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/130191/a0647366-5535-f928-eed5-2b28d9471fe6.gif)

Contentの子供に表示したいアイテムを入れていく。
直接Text Componentのついたオブジェクトを入れるのではなく、オブジェクトをひとつかませてから入れるのがポイント。
Layout Element がついているオブジェクトにはContent Size Fitterがつけられないので少し不思議な実装になる。

<img width="169" src="https://qiita-image-store.s3.amazonaws.com/0/130191/7efd0ecb-6d6f-352a-a403-ecffcd21035b.png">

それぞれの設定は以下の通り。

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/130191/c5043a7a-e900-256d-7327-cd8811a0285b.png)

ContentがTextを見ていい感じのサイズにWindowのサイズを調整して、それに合わせてWindowがTextのサイズを調整する。
[小ネタ] OSS Knowledge でAD連携を設定する時の必要情報

## 参考情報のまとめ
### LDAP設定の記述内容
[公式](https://service-knowledge.support-project.org/open.knowledge/view/26)よりも[「teratail:OSSのKnowledgeでAD認証をする方法。」](https://teratail.com/questions/77612) の自己解決欄が一番正確っぽい
### BindDNの調べ方
[コマンドプロンプト/AD関連コマンド集(検索関連)](http://win.just4fun.biz/?%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88/AD%E9%96%A2%E9%80%A3%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%9B%86%28%E6%A4%9C%E7%B4%A2%E9%96%A2%E9%80%A3%29#n9d0a48d)
[Windows 7 で Active Directory ドメイン サービスを管理](https://adtan.wordpress.com/2011/12/23/windows-7-%E3%81%A7%E3%81%AE-active-directory-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9-ad-ds-%E3%81%AE%E7%AE%A1%E7%90%86/)


## 正しいCN,DC,OUの組み合わせを調べる方法
大きな組織の中でローカルなサーバーを組むと、自分は単なる利用者なのでActiveDirectoryの正しい情報は分からない。
ところが、Knowledge で設定するBindDNは、CN,DC,OUの組み合わせを正しく記述する必要がある。
正しい組み合わせを調べるには、RSATをインストールして、
`dsquery user -samid <ログインユーザID>`
を実行すればよい。

結果の例
` "CN=山本 太郎,OU=usr,OU=abcou-grp-02,OU=abcou-org,OU=abcou,DC=abcad,DC=abc,DC=co,DC=jp" `
オススメの技術書についてまとめたよ

#はじめに
プログラミングを始めてから今日まで、たくさんの技術書を読んできました。
その中でも特に「読んでよかった」と思う本をまとめました。

##①プロを目指す人のためのRuby入門
個人的にRubyの入門書ではNo1です。
本当に細かく丁寧に解説がしてあって、テストコードも書いていくスタイルなので面白かったです。
Railsを学ぶ前にきちんとRubyを理解する必要があると感じました。
オススメです！
www.amazon.co.jp/dp/4774193976

##②Ruby on Rails 4 アプリケーションプログラミング
いくつかあるRailsの書籍の中では一番わかりやすいのではないでしょうか。
現在はRails5バージョンも出ていますので気になる方はチェックしてみてください。
www.amazon.co.jp/dp/4774164100

##③入門者のLinux 素朴な疑問を解消しながら学ぶ
周りの人にもLinuxはこの本から入ることをオススメしています。
Linuxの歴史から基本コマンドの使い方、シェルまでを解説してあり、
値段も安く、サイズも小さいので携帯にも便利です。

私も3周ほど読みましたが本当によくまとまっています。
www.amazon.co.jp/dp/4062579898


##④スッキリわかる SQL 入門
Railsから勉強を始めるとSQLの知識はなかなか学ぶ機会がない。
Active Recordでデータベースの操作ができてしまうからですね。

こちらの書籍はSQLの基本操作から設計、トランザクションと幅広く体系的に学べる内容となっております。DokoQLという専用のサイトを使って手を動かしながら学ぶので身につきやすいと感じました。
www.amazon.co.jp/dp/4844333933


##⑤ネットワークはなぜつながるのか 第2版
字数もページ数も多く読むのに苦労しましたが非常に大切なことが書いてあると思います。
エンジニアをやる上でネットワークの知識は必要不可欠ですし、知る知らないでは全然違ってきます。
www.amazon.co.jp/dp/4822283119

##⑥オブジェクト指向でなぜつくるのか 第2版
オブジェクト指向を学ぶ最強の書籍です。

`インスタンス、サブクラス、ポリモーフィズム、カプセル、ガベージコレクション....`
聞いたことはあるけど意味はわからなかったオブジェクト指向の用語を理解できます。

コラムの内容も面白かったです :thumbsup: 

www.amazon.co.jp/dp/4822284654

##⑦わかばちゃんと学ぶ Git使い方入門
まだGitに慣れていない頃にこちらの書籍を書いました。
漫画のキャラクターがGitについてわかりやすく教えてくれます。

キャラクターが可愛いのでモチベーションも上がります⤴︎⤴︎
www.amazon.co.jp/dp/B071D4D6XX

##⑧SCRUM BOOT CAMP THE BOOK
アジャイル開発やスクラムについて勉強した時に買った本です。
こちらも一部漫画で解説がされており、非常にわかりやすい内容でした。

www.amazon.co.jp/dp/4798129712
kotlin+javaFXで ストップウオッチ

せっかく作ったのでストップウォッチも

アンドロイドで使った
RunnableはAndroid用なのでディスクトップでは使えませんだした

代わりにタイマーを使いました

```
internal class TimerTest2(val mc: Controller) {
  var timer : Timer? = null
  fun timerStart() {
    if (null == timer) {
      timer = Timer(true)
      timer?.schedule(TestTask(mc), 1000, 1000)
    } else {
      println(timer.toString())
    }
  }
  fun timerStop() {
    if (null != timer) {
      timer?.cancel()
      timer?.purge()
      timer =null
    }
  }
  // 時間経過時の処理
  internal class TestTask(var tt: Controller) : TimerTask() {
    override fun run() {
      // ここで上位の関数を読んで表示
      tt.timUpProcess()
    }
  }
}
```

こんな感じで

あとタイマーのスレッドが別とか、アンドロイドで使ってないことでつまずきました

![ストップウオッチ.png](https://qiita-image-store.s3.amazonaws.com/0/258658/a72504a2-2770-9d0c-737f-a3261e41c14b.png)




一応コードは[ここ](https://github.com/bokufolivora/StopwatchFX.git)

でもディスクトップでやる利点みいだせなかったので、この後は作ってません。
特にwindowsで動かす環境を作るステップがあるのはなにかと不便
.net(今はUWP?)とかは、やる気ないですし
[Angular] 自作したカスタムコンポーネントのフォームに双方向データバインドする

子コンポーネントとの双方向データバインドに関して、基本的には[こちらの記事](https://qiita.com/kohashi/items/bcbcc9cbeaee9498e4fe)が参考になるのですが、私の場合は親コンポーネントの変数を、子コンポーネントのさらにform要素に双方向バインドしたいという要件がありましたので、メモします。
下記の通りsetter/getterを使用して実装できます。

こちら↓の記事を参考にしました。
[TWO-WAY DATA BINDING IN ANGULAR](https://blog.thoughtram.io/angular/2016/10/13/two-way-data-binding-in-angular-2.html)

## 親コンポーネント
```app.component.html
<app-custom [(modelAssess)]="{任意の変数}"></app-custom>
```

## 子コンポーネント

```typescript:custom.component.ts
export class CustomComponent implements OnInit {

  private _model: any = null;

  @Input() get modelAccess() {
    return this._model;
  }

  @Output() modelAccessChange = new EventEmitter();
  set modelAccess( value ) {
    this._model = value;
    this.modelAccessChange.emit( this._model );
  }
}
```

```typescript:custom.component.html
<input [(ngModel)]="modelAccess"></input>
```
Pythonで積み上げ棒グラフを並べてみる

Pythonで統計データを扱う（というかグラフを描く）練習の続き。

積み上げ棒グラフを複数並べる方法について調べてみた。

積み上げ棒グラフの描画については[こちら](https://mkacky.wordpress.com/2013/05/15/maplotlib%E3%81%A7%E7%A9%8D%E3%81%BF%E4%B8%8A%E3%81%92%E6%A3%92%E3%82%B0%E3%83%A9%E3%83%95/)，並べて表示する方法については[こちら](http://yubais.net/doc/matplotlib/bar.html)を参考にさせていただきました。

データはe-Statより，

- 統計名:社会生活基本調査 平成28年社会生活基本調査 調査票Ａに基づく結果 生活行動に関する結果 生活行動編（全国） スポーツ 
- 表番号:15-7

のうち，野球とサッカーの男女・年齢別競技人口を使用。


| 年齢     | 野球男 | 野球女 | サッカー男 | サッカー女 |
|----------|-------:|-------:|-----------:|-----------:|
| 15～19歳 |     46 |     13 |         44 |          7 |
| 20～24歳 |    341 |    111 |        281 |        100 |
| 25～29歳 |    541 |    147 |        482 |        128 |
| 30～34歳 |    485 |    177 |        532 |        102 |
| 35～39歳 |    622 |    186 |        515 |        159 |
| 40～44歳 |    697 |    229 |        514 |        145 |
| 45～49歳 |    549 |     77 |        227 |         52 |
| 50～54歳 |    296 |     47 |        117 |         17 |
| 55～59歳 |    199 |     13 |         61 |         11 |
| 60～64歳 |     93 |     16 |         35 |         10 |
| 65～69歳 |    145 |     21 |         39 |          7 |
| 70～74歳 |     96 |     13 |         25 |          7 |
| 75～79歳 |     58 |      7 |         12 |          1 |
| 80～84歳 |     22 |      2 |          2 |          2 |
| 85歳以上 |      1 |      1 |          0 |          0 |

```Python:Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'IPAPGothic'

df = pd.read_table('sports.tsv', index_col=0)
bb = df['野球男']
bg = df['野球女']
sb = df['サッカー男']
sg = df['サッカー女']

w = 0.3 # 棒グラフの幅
ind = np.arange(len(df)) # x方向の描画位置を決定するための配列

# 野球人口
plt.bar(ind, bb, width=w, color='b', label='野球:男')
btm = np.array(bb.values) # 積み上げ(底上げ)のためにデータを取得
plt.bar(ind, bg, width=w, bottom=btm, color='c', label='野球:女') # 男性データの上に積み上がるようbottomを設定

# サッカー人口
plt.bar(ind+w, sb, width=w, color='r', label='サッカー:男')
btm = np.array(sb.values)
plt.bar(ind+w, sg, width=w, bottom=btm, color='orange', label='サッカー:女') # グラフ幅の分だけ右にずらして描画

plt.subplots_adjust(bottom=0.2) # 下余白調整(default=0.1)
plt.xticks(ind+w/2, df.index, rotation=90) # x軸目盛の描画位置が2本の棒の間にくるように調整
plt.ylabel('人数(千人)')
plt.legend()
plt.show()
```

できあがったグラフはこちら。
![sports.png](https://qiita-image-store.s3.amazonaws.com/0/229548/0400efe8-ebe3-69b3-e0ff-f8028a3be996.png)

- 色のせいか，ごちゃごちゃして見づらいグラフになる
- もっと簡単な方法は無いものか
- やっぱり40歳越えるとサッカーは厳しいのか

### 追記

わざわざ`btm`なんて変数用意しなくてもよかった。

```Python:Python
# 野球人口
plt.bar(ind, bb, width=w, color='b', label='野球:男')
plt.bar(ind, bg, width=w, bottom=bb.values, color='c', label='野球:女')

# サッカー人口
plt.bar(ind+w, sb, width=w, color='r', label='サッカー:男')
plt.bar(ind+w, sg, width=w, bottom=sb.values, color='orange', label='サッカー:女')
```
proxy環境下でのhomebrew

## 経緯
proxy環境下で`brew install package`するとcurlでエラーが出てしまい、詰まってしまいました。
やり方を忘れないように、残します。

## 手順
ALL_PROXYにセットして、`brew install`することで解決しました。

```bash
$ export ALL_PROXY=http://[ip]:[port]
$ brew install package
```
【Rails】新規アプリの作成

#アプリを新規作成
ターミナルにて下記コマンドで新規アプリを生成

```
$rails new [アプリ名]

例)
$rails new sampleapp
```

#モデルを作成
モデルはデータベースとデータのやりとりを行うため、
モデルを使用する際には同時にそれに対応するデータベースのテーブルも必要。

モデルを作成する前に、RubyからSQLを操作するために必要な
マイグレーションという機能を使用できるようにする。
そしてマイグレーションを使用するためにマイグレーションファイルを下記コマンドで作成する。

```
$rails generate migration [クラス名]

例)
$rails new sampleapp
```


とりあえず最低限テーブルが作成されれば良いのであれば、
ターミナルにて下記コマンドでモデルとテーブルを生成できる。

```
$rails g model [モデル名] [テーブル名]

例)
$rails g model Member members
```

もしテーブル作成と同時にカラムも追加したければ
下記コマンドを使用すれば良い。

```
$rails g model [モデル名] [カラム名]:[型] [カラム名]:[型] ・・・

例)
$rails g model Member name:varchar
```

モデル周りの命名規則は下にまとめた通り

|  対象 | 規則 |　例  |
|:-----|:----|:-----|
| モデル名 | 単数形 / 小文字はじまり | member |
| モデルクラス名 | 単数形 / 大文字はじまり | Member |
| ファイル名 | 単数形 / 小文字はじまり | member.rb |
| テーブル名 | 複数形 / 小文字はじまり | members |

テーブルを生成したり、データベースに変更を加えたい際は
コマンド実行後その変更をDBに反映するため下記コマンドを実行する。

```
$rake db:migrate
```

とりあえず最初はモデルクラスの中には何も記述しなくても問題ない。

```ruby:member.rb
class Member < ApplicationRecord

end
```



#コントローラの作成
ターミナルにて下記コマンドでコントローラを生成

```
$rails g controller [コントローラ名]
$rails g controller members
```
コントローラ周りの命名規則は下にまとめた通り

|  対象 | 規則 |　例  |
|:-----|:----|:-----|
| コントローラ名 | 複数形 / スネークケース | members |
| コントローラクラス名 | 複数形 / キャメルケース | MembersController |
| ファイル名 | 複数形 / スネークケース | members_controller.rb |
 
app > controllers 内にコントローラファイルを生成できたら、
クラスの中に必要なアクションを定義していく。

```ruby:members_controller.rb
class MembersController < ApplicationController
    // indexアクションを定義
	def index 
		@members = Member.all
	end
end
```

#ルーティング
作成したアクションにURLを割り当てる作業をしていく。
config > routes.rb ファイルを適当に編集する。

```ruby:routes.rb
Rails.application.routes.draw do
  #get "URL" => "コントローラ名#アクション名"
  get "momocloapp" => "top#index"
  get "momocloapp/members" => "members#index" 
  get "momocloapp/member/:id" => "members#show"
end
```
ルーティングの確認

```
$rake routes
```

#ビューの作成
実際に表示される「ページの見た目」を作る。
app/views/[モデル名のフォルダ]　内にhtmlファイルを作成し適当に記述する。

```html:app/views/members/index.html.erb
<h1>Members</h1>
<ul>
	<% @members.each do |member| %>
        <li><%= member.name %></li>
	<% end %>
</ul>
```
今回はモデル作成時に生成したmembersテーブルのnameカラムにデータを挿入し、
membersテーブルに挿入されたメンバー全員の名前を表示するシンプルなページを作成した。

#ローカルで見てみる
実際に作成したページをローカルで見てみる。
下記コマンドでローカルホストを立てる。

```
$rails s
```

成功したらブラウザで http://localhost:3000/ を開くと
作成したページが見られるはず。
"「.JSON」という聞いたこともない拡張子" について考えたみた。

# はじめに

この記事は、 [グーグルが握っているあなたの｢個人情報｣ | The New York Times | 東洋経済オンライン | 経済ニュースの新基準](https://toyokeizai.net/articles/-/223696) を読んでいることを前提とします。

# JSON とは？

上記の記事には以下のような記述がある。

>グーグルからダウンロードしたファイルの多くは、開くのも読み込むのも難しい奇妙なフォーマットだった。たとえば、いくつかのファイルは「.JSON」という拡張子を含んでいた。

さて、この `JSON` とはなんであろうか？
検索してみると、以下のページが見つかった。

https://www.json.org/json-ja.html
>JSON (JavaScript Object Notation)は、軽量のデータ交換フォーマットです。人間にとって読み書きが容易で、マシンにとっても簡単にパースや生成を行なえる形式です。

なるほど、簡単で使いやすいのか。

# わかってると思いますが、、、

エンジニアにとって `JSON` は常識的なフォーマットですが、その他の人には奇妙なファイルのようです。
~~まあ、東洋経済はその業界では常識のことでも普通にdisるけど~~

## おまけ

東洋経済のページを見てみると、 `JSON` 呼び出してる箇所がいくつか見つかりました。

# 最後に

このようなネタ記事を書くの初めてで、中途半端になってしまった。
MySQLのindex(インデックス)って何？

#indexを調べる経緯
「MySQlnのindexって知ってる？」
そう、上司は私に問いかけました。
社会人1年目、ろくにコマンドプロンプトを叩いた経験も仮想サーバを作った経験もない私はただ一言「わかりません」と答えるしかありませんでした。
上司に大まかに「indexってのは...」と教えていただきました。そこである程度は理解しましたが詳細までは分かっていません
そして「じゃあ、indexについて調べて理解を深めろ」とのことだったのでつい先日、Qiitaに登録したというのもあり、ここで自身なりにまとめようと思いました。

#MySQLとは？
そもそもMySQLとは何？何のためのもの？
MySQLはSQLのデータベース言語の一つでデータベースの定義や操作を行うことが出来る。
>https://ja.wikipedia.org/wiki/SQL

#indexとは？
データテーブルとは別に検索用に最適化された状態でデータが保存されている。
このindexを使うことで、目的のレコードを迅速に見つけることが出来できる。
>http://ja.wikipedia.org/wiki/索引_%28データベース%29

#indexはどんな時に使う？＆メリット
 - 特定のカラム値のある行を素早く見つける
 - テーブル内のデータ量が多く、少量のレコードを検索する場合
 - WHERE句の条件、結合の条件、ORDER BY句の条件として頻繁に利用する
 - ソート作業を省略出来る

#indexを使わない時＆デメリット
 - 表の規模が小さいか、表から大部分のレコードを検索する場合
 - 格納されているデータが少ないテーブル
 - 格納されているデータ種類が少ない。
 - NULL値が多く、NULL以外の値を検索しない場合

#indexの種類
1. Bツリーとビットマップ
    1. Bツリーとビットマップ（カーディナリティが高い、定型のSQL文の場合）
    2. Bツリー索引（カーディナリティが低い場合）
2. 索引構成表
3. 索引クラスタ（ハッシュ・クラスタ）

#まとめ
現状、indexを調べ、それを考えながらの書き込みでしかないので表面的なことしかかけていませんでした。
ここから実際に使い始めればより、深く理解することが出来ると思います。
とりあえず、簡単にindexはデータ量が多い時やソートする時には便利だがindexを使用しないことも普通にあるということはわかりました。
今後、深掘りしていきたいと思います。
sudo権限がない環境でmatplotlib/networkXの豆腐を避ける方法

# はじめに

matplotlibで日本語ラベルを描画しようと出てくる「豆腐」。

解決するには、matplotlibrcという設定ファイルを弄ればいいのだが、その際にsudo権限を使ってシステムフォントが置いてあるディレクトリに日本語フォントを追加する必要がある。
ここでは、sudo権限が使えない場合の対応法をまとめる。

matplotlibの仕様で、使いたい日本語フォントがttfかttcにより、対応が異なるので、その違いもまとめる。

# matplotlib

## その1: 日本語ttf: ttfがあるディレクトリを参照するように設定する

```python:フォントディレクトリの追加
import matplotlib.font_manager as font_manager

font_dirs = ['{my_font_dir}']
font_files =　font_manager.findSystemFonts(fontpaths=font_dirs)
font_list = font_manager.createFontList(font_files)
font_manager.fontManager.ttflist.extend(font_list)

mpl.rcParams['font.family'] = '{My Font}'
```

ほとんど参考リンク１と一緒。
ただし、ここで参照するフォントファイルは、ttfでないと正常に反映されない模様。

私の場合、ttcを読み込ませようとしたら、findSystemFontsで読み込んでくれなかった。
fintSystemFonts自体は、フォントファイルのパスのリストを取得するだけなので、手動でcreateFontListに渡すことも可能だが、その場合は結局Sans系のフォントで上書き(?)されてしまい、豆腐の呪縛から逃れることはできなかった。

## 日本語ttc: 描画時に日本語fontPropertiesを参照する

```python:フォントプロパティの参照
from matplotlib.font_manager import FontProperties
fp = fontProperties(name={my font path})

plt.plot(x, y)
plt.xlabel("x軸のラベル", fontproperties=fp)
plt.ylabel("y軸のラベル", fontproperties=fp)
plt.legend(legends, prop=fp)
plt.show()
```

# networkXの豆腐回避

## 日本語ttfファイルがある場合

matplotlibの場合と同様の設定をすればよい。

## 日本語ttcファイルがある場合

一度、networkXの関数で描画した後、各インスタンスを参照してfontPropertiesを設定してあげる。

```python:フォントプロパティの参照
from matplotlib.font_manager import FontProperties
fp = fontProperties(name={my font path})

for t in nx.draw_networkx_labels(G, pos).values():
    t.set_fontproperties(fp)
```

参考：
- [how to set up a custom font with custom path to matplotlib global font?](https://stackoverflow.com/questions/35668219/how-to-set-up-a-custom-font-with-custom-path-to-matplotlib-global-font?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
- [PythonライブラリのmatplotlibとNetworkXの日本語文字化け解消](https://qiita.com/grachro/items/4c9b03366cae2df3a301)
- [グラフを描画する — 読書ノート v1.4 - プレハブ小屋](https://showa-yojyo.github.io/notebook/python-networkx/drawing.html)
ラズパイ(RaspberryPi3)をDHCPサーバーにしてみた

RaspberryPi3をDHCPv4サーバーにしてみましたので、その手順を紹介したいと思います。

# 環境
|本体|RaspberryPi3|
|:-:|:-:|
|OS|Raspbian stretch lite 9.4|
|DHCP daemon|isc-dhcp-server 4.3|
|配布アドレス|192.168.0.1~192.168.0.12|
|プレフィックス|28|
|ゲートウェイ|192.168.0.14|
|DNS|192.168.0.12-13|

# 前提
静的アドレスは設定済みで、インターネットからパッケージのダウンロードができる状態であることや***sudo***を使用できることを想定し、ここではそれらには触れません。

# 構築しよう
## デーモンのインストール
早速DHCPの構築に必要なデーモンのインストールをします。
今回使用するのは、***isc-dhcp-server***です。

```
$ sudo apt-get -y install isc-dhcp-server
```

## 設定のコメントアウトとアンコメント
インストール直後のコンフィグファイルに例として書き込まれているもので、必要ないものをコメントアウトします。
コンフィグファイルは***/etc/dhcp/dhcpd.conf***です。

```
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
```

　⇩コメントアウト

```
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
```

次に必要な設定をアンコメントします。

```
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative; // アンコメント
```
　⇩アンコメント

```
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
```

## 配布アドレスの設定
それでは、配布するアドレスの設定をしていきましょう。
設定する際には、行末に必ずセミコロン；をつけるようにしましょう。つけ忘れ注意です。
完成形は以下のようになります。

```
subnet 192.168.0.0 netmask 255.255.255.240 {
 range 192.168.0.1 192.168.0.13;
 option routers 192.168.0.14;
 option domain-name-servers 192.168.0.12, 192.168.0.13;
 option broadcast-address 192.168.0.15;
 ignore declines;
}
```

|パラメータ|説明|
|:-:|:--|
|subnet ~ netmask|配布したいネットワークのネットワークアドレスの定義|
|range|配布するホストアドレスの範囲|
|option routers|ゲートウェイのアドレス|
|option domain-name-servers|DNSサーバのアドレス|
|option broadcast-address|ブロードキャストアドレス|
|ignore declines|DHCPDECLINEメッセージを無視する|

この他にも、特定のホストのアドレスを固定したり、リース期間を変更したりするパラメータがあるので、いろいろ試してみてください。

## インターフェースへ紐付け
/etc/default/isc-dhcp-serverファイルの最終行に配布を行うインターフェース名を書き込みます。
例として、インターフェース名はeth1とします。

```
INTERFACES = "eth1"
```

## デーモンの起動

```
$ sudo systemctl start isc-dhcp-server.service
$ sudo systemctl enable isc-dhcp-server.service
```
## 確認
実際にアドレスが配布されたかを確認するには、/var/lib/dhcp/dhcpd.leasesの中身を確認しましょう。

```
$ cat /var/lib/dhcp/dhcpd.leases

lease 192.168.0.1 {
(省略)
}
```

ホストに割当が成功していれば、配布したアドレス、リース期間の情報、ホスト名などが出力されます。

# 参考
- https://www.isc.org/wp-content/uploads/2017/08/dhcp43.html
作業ディレクトリにgitのブランチ名や状態を表示させる

## Why
aliasに指定していないgitコマンドを入力する際にオプションを入力するのが煩わしい

## How
gitコマンドの補完スクリプトの導入

### 条件
bashを利用している（zshについては割愛）

既にXcodeなどでインストールされている場合もあるので、検索をすることをお勧めします。
```$ find / -name "git-prompt.sh" -print```

見つからない場合はダウンロードします。
https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh

### .bashrcを下記のように編集
```
source /Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUPSTREAM=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWSTASHSTATE=1

export PS1='\[\033[1;32m\]\u\[\033[00m\]:\[\033[1;34m\]\w\[\033[1;31m\]$(__git_ps1)\[\033[00m\] \$ '
```
Homebrew Caskで独自のリポジトリを用意してアプリケーション管理をする

## Homebrew Cask
アプリケーションのインストールに利用する(ことがある)Cask。
https://caskroom.github.io/

homebrewをインストール後に、以下のようにtapすることで利用できるようになります。
※tapの詳細は別記事を見てもらうのが良いかと思います。

```shell
$ brew tap homebrew/cask
```

このCaskで自身が欲しいアプリケーションが必ずしも存在するわけではありません。
どのようなものがあるかは以下を見ればわかりますが、以下のコマンドで検索することが出来ます。

 - https://github.com/Homebrew/homebrew-cask/tree/master/Casks

```shell
$ brew cask search ${search_word}
```

例えばjavaを検索すると以下のような感じになります

```shell
$brew cask search java
==> Exact Match
java
==> Partial Matches
charles-applejava          java-jdk-javadoc           netbeans-java-ee
eclipse-java               java6                      netbeans-java-se
eclipse-javascript         java8                      yourkit-java-profiler
```

### 自分で作ってみる
アプリケーションがなかった場合は、自身で作ることが出来ます。
詳細は、以下のドキュメントが参考になります。

 - https://github.com/Homebrew/homebrew-cask/blob/master/doc/development/adding_a_cask.md

PRを出して本家に入れてもらうのもよし、自身のPCのみで使うのも良しです。
以下のコマンドを叩くとtemplateが記載された状態でeditorが起動します。

```shell
$ brew cask create my-new-cask
```

このときに保存したファイルは以下に作られます。

```shell
"$(brew --repository)"/Library/Taps/Homebrew/homebrew-cask/Casks/my-new-cask.rb
```

作成後は、searchで見つかるようになります。

```shell
$ brew cask search my-new-cask
my-new-cask
```

ファイルの中身の例は以下のとおりです。
それぞれの値は、[Cask Stanzas](https://github.com/Homebrew/homebrew-cask/blob/master/doc/development/adding_a_cask.md#cask-stanzas)をみれば分かります。

dmgにしろzipにしろurlに指定したものをDLしてくれます。

```ruby:sample
cask 'my-new-cask' do
  version ''
  sha256 ''

  url ''
  name ''
  homepage ''

  app ''
end
```

appを利用した場合は、/Applications以下にインストールされます。
また、zipをダウンロードし展開したい場合は、以下などを参考にすると良いかと思います。
https://github.com/Homebrew/homebrew-cask/blob/master/Casks/android-sdk.rb

ファイルが適切に書かれていれば、以下のコマンドでインストールすることができます。
アンインストールはinstallをuninstallにすればいいだけですし、reinstallもあります。

```shell
$ brew cask install my-new-cask
```

なお、以下のコマンドでurlに書いてるところからdownloadをしchecksumもおこないます。

```shell
brew cask audit my-new-cask --download
```

### 社内だけで利用したい場合
publicに公開するのも良いのですが、社内のみで使いたい場合もあるかと思います。
以下のような構成のものをgithubのrepositoryに用意し、tapするだけでOKです。

```:サンプルディレクトリ
- Casks/
  - my-new-cask.rb
  - your-new-cask.rb
```

用意をしたら以下のようなコマンドを叩けばOKです。
これで、該当のリポジトリにあるものもsearch対象になります。

```:shell
$ brew tap cask/${好きな名前} git@github.com/#{your_repo}
```

以下のコマンドをやると追加されているのがわかります。

```:shell
$ brew tap
cask/${好きな名前}
homebrew/cask
homebrew/cask-versions
homebrew/core
```

あとはインストールしたいものをコマンドからインストールすればOKです。

```:shell
$ brew cask install your-new-cask
```

### Tips
簡単に用意はできるのですが、動作確認が少し面倒な時があるので、その時のTipsがあれば以下にコツコツ書いておこうかと思います。

#### キャッシュ
キャッシュが保存されたりするので注意が必要なときあります。
以下にアプリケーションのバイナリが置かれます。

```
"$(brew --repository)"/Library/Caches/Homebrew/Cask
```
gitコマンド入力時に入力の補完を行う


## Why
gitコマンドを操作する際に、状態の確認の手間を省き、間違って別のブランチへの操作を防ぎたい

## How
gitのプロンプトに各種追加情報を表示可能にするスクリプトを導入する

### 条件
bashを利用している（zshについては割愛）

既にXcodeなどでインストールされている場合もあるので、検索をすることをお勧めします。
```$ find / -name "git-completion.bash" -print```

見つからない場合はダウンロードする
https://github.com/git/git/blob/master/contrib/completion/git-completion.bash

下記コマンドで```.bashrc```に反映

```
$ echo "source /Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash" >> ~/.bashrc
$ . ~/.bashrc
```
gitコマンドのエイリアス設定

## Why 
gitのコマンドオプションの入力を楽にしたい

## How 
~/.gitconfigにaliasを記述する

### 条件
- ユーザ単位で設定  
- パソコン共通、リポジトリ単位での設定方法については割愛

### .gitconfigの中身
```
[alias]
　st = status
　co = commit
  b = branch
  loga = log --graph --oneline --decorate=full -20 --date=short --format='%C(yellow)%h%C(reset) %C(magenta)[%ad]%C(reset)%C(auto)%d%C(reset) %s %C(cyan)@%an%C(reset)'
```
元のPHPを削除せずに他のPHPバージョンを使う方法

#起こった問題#
自分のMacのlocalでcakePHP1.3を使うにあたり、PHP5.3が必要だった。（会社の環境に合わせる必要があったため）
しかし、私のMac(macOS 10.13 High Sierra)の環境にはApacheでPHP７.１が動く様に設定されており、このままcakePHPを使うと
参照渡しをやめなさい…というエラーが出てきて、消しても消しても進まない。
できれば、使うPHPのバージョンが変わるごとに入れ直す以外のものは無いかと探していた。

#パッケージを使う#
色んな方法がある様ですが、初心者の私でも何とか理解できる方法がパッケージの入手でした。


★ここで使いたいバージョンを選びます　（今回は5.3を使いました）
!!注意!!
インストールに非常に時間がかかるのでなるべく回線速度が速いところでのインストールをお勧めします。

[PHP 5.3 to 7.2 for OS X / macOS 10.6 to 10.13
as binary package](https://php-osx.liip.ch/)

*こちらの方が書かれてる記事が大変わかりやすかったです。
[Macで一番簡単にPHP5.4をインストールする方法](http://www.1x1.jp/blog/2012/05/php_54_for_mac_os_x_as_binary_package.html)

この後、httpd.confの修正をしないとまだ使えません。

#インストールするだけでは使えなかった#

元々のPHP7の部分をコメントにします
>`#LoadModule php7_module libexec/apache2/libphp7.so`

これで表示まではできました、が！！
表示されたPHPの拡張子のファイルがクリックする度にMacにダウンロードされてしまう。。。
PHP7の状態の時は大丈夫だったのになぜ…

もう一箇所httpd.confの修正をします。
>`<FilesMatch "\.php$">
  #AddHandler php7-script .php  ←元々Macに入ってる７の方はコメントにする
  AddHandler php5.3-script .html　　←★追加したら普通に表示できた。
  AddType application/x-httpd-php .php　←元々書いてあった、PHPの拡張子を表示する文。
</FilesMatch>`

これで、７を消さず5.3を使える様になりました。
以上、走り書きめもでしたので簡単ですが、後日色々わかったら修正するかもです！！

#参考資料#
[PHP 5.3 to 7.2 for OS X / macOS 10.6 to 10.13
as binary package](https://php-osx.liip.ch/)

[Macで一番簡単にPHP5.4をインストールする方法](http://www.1x1.jp/blog/2012/05/php_54_for_mac_os_x_as_binary_package.html)

[拡張子 .html で PHP を動作させたい。](https://heteml.jp/support/faq/408.html?ref=faq)
TendermintをLocal開発環境にインストールするまで

# 概要

今回は、Blockchainのインターネットの構築するための基盤技術となる可能性があるtendermintについて色々と書きます!簡単なことからですが、よろしくお願いします。これを機にtendermintやCosmosに興味を持ってもらえると嬉しいです。

![green-mint-346239_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/206272/f4c0b5e9-951e-af79-812f-aea014786e59.jpeg)


## 手順

はじめにlocal開発環境を構築する。
そのために、Vagarant と Virtual Boxをインストールする。
次にVagrantを用いて、Ubuntuを構築。
作ったUbuntuにsshでアクセスして、Goを/root/usr/localにインストールする。
これでtendermintがインストールできる環境を整えることができる。
最後にtendermintをインストールする。

## 背景

今回、Mac OSの環境ではじめにtendermintのインストールを試しました。しかし、うまく行かず、いくつかのOSで試したところUbuntuで安定して起動したので、仮想環境でのインストールについて書きました。
今思い返せば、Mac OSでもインストールできそう。。

### 環境
環境はMacのHigh Sierra 10.13.4で行っています。

#Virtual Box
以下から自分のpcにあったパッケージをダウンロードしインストールする。
https://www.virtualbox.org/wiki/Downloads


#Vanrantのインストール
以下から自分のpcにあったパッケージをダウンロードしインストールする。
https://www.vagrantup.com/

インストールがうまく行っているかは、versionを確認することでチェックできる。

```
$ vagrant --version
Vagrant 1.8.1
```

# Ubuntu VMの作成

はじめにMyVagrantディレクトリーをホームディレクトリーに作成し、MyVagrantディレクトリーに移動する。

```
$ cd
$ mkdir MyVagrant
$ cd MyVagrant
```

次に以下のサイトから最新のubuntu/trusty64の vagrant boxを確認する。
特に最新のバーションでなくて良い場合は、ターミナルで以下を入力する。

```
$ vagrant init ubuntu/trusty64
$ vagrant up
```

しばらくすると、VMが作成され起動する。起動後にUbuntuへの接続は、sshすれば接続が開始する。
うまくいけば、vagrant@vagrant-ubuntu-trusty-64と表示される。

```
$ vagrant ssh

vagrant@vagrant-ubuntu-trusty-64:~$ 

```

# Goのインストール

Ubuntuにログインできたら、次にgoをインストールする。ダウンロードするファイルを保管するために、/root/usr/local/srcの一連のディレクトリーを作成する。

```
$ sudo su
$ cd 
$ mkdir usr ・・・
$ cd src
``` 
このディレクトリーへ、Goのソースファイルをインストールする。
Goを以下から探して、linuxの最新版のリンクをコピーし、wgetする。
https://golang.org/dl/

```
$ sudo wget https://dl.google.com/go/go1.10.2.linux-amd64.tar.gz
```

最後にこれを展開しインストールする。

```
$ sudo tar -C /root/usr/local -xzf go1.10.2.linux-amd64.tar.gz

```
Pathを通すことを忘れずに。

```
$ cd
$ vi ./profile
```
profileに以下を追加する。

```
export GOROOT=/root/usr/local/go
export PATH=$PATH:$GOROOT/bin
```

さらに、最後に

```
source ~/.profile
```

をする。

これでgoがlocal開発環境にインストールされる。

# Tendermintのインストール

最後にTendermintのインストールを行う。
ここまでうまくできていれば、

```
go get github.com/tendermint/tendermint/cmd/tendermint
```

でインストールができるはずだ。しばらく待って、

```
tendermint version
```

をしてみる。きちんとインストールされている場合は、versionが表示されるはず!
Done!!