OmniAICreator/Qiita-1.07M huggingface dataset:
raspberry pi のAlexaを日本語化

## 概要
自作のraspberry pi上のAlexaを日本語化しました。
但し、以下の公式wiki等で、一度英語版ラズパイalexaが出来てる前提です。
対象ファイルを日本語用に修正して、再度installシェルから実施し直します。
※自分は上記の流れで、英語から日本語にしましたが、直接日本語も可能だと思います。

## 公式wiki(英語Alexa)
Raspberry Pi
https://github.com/alexa/alexa-avs-sample-app/wiki/Raspberry-Pi

## 修正対象ファイル
### installシェル
alexa-avs-sample-app/automated_install.sh
424行目を修正して、日本語ロケールを選択可能にしておく。
```
前:select_option Locale "en-US" "en-GB" "de-DE"
後:select_option Locale "en-US" "en-GB" "de-DE" "ja-JP"
```

### コンフィグファイル
alexa-avs-sample-app/samples/javaclient/config.json
ロケールを英語から日本語に変更。

``` 
前 "locale":"en-US",
後 "locale":"ja-JP",
```
### Javaファイル
alexa-avs-sample-app/samples/javaclient/src/main/java/com/amazon/alexa/avs/config/DeviceConfig.java
日本語のロケールを追加。

```
 static {
     SUPPORTED_LOCALES.add(Locale.US);
     SUPPORTED_LOCALES.add(Locale.UK);
     SUPPORTED_LOCALES.add(Locale.GERMANY);
 }
```
```
 static {
     SUPPORTED_LOCALES.add(Locale.US);
     SUPPORTED_LOCALES.add(Locale.UK);
     SUPPORTED_LOCALES.add(Locale.GERMANY);
     SUPPORTED_LOCALES.add(Locale.JAPAN);
 }
```

##再インストール
修正したautomated_install.shで、公式wikiの
"Step 6: Run the install script"から再実行します。
途中ロケールを選択する箇所があるので、そこで、"ja-JP"を選択します。
![2017-12-10.png](https://qiita-image-store.s3.amazonaws.com/0/168441/39c70403-d9b5-8b7d-f7e7-2479210d2522.png)

##参考にさせて頂きました
alexa-avs-sample-appを日本語に対応させるhttps://qiita.com/moritalous/items/a3e847612dd2bf4fed99
ECSSをがんばって使ってみた話

[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2) 10日目の記事です。

こんにちは。普段フロントエンド回りのコード書いてます。
最近業務でCSS設計手法の1つであるEnduring CSS(ECSS)を使ってみたので、それについて記事を書きたいと思います。

他カレンダーのURLはコチラ
[DMM.com #1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm)

# ECSSとは?
汎用的なコンポーネントのスタイルを抽象化し組み合わせていくOOCSSとは逆の考え方で、抽象化せずモジュール毎にスタイルを分離させていくアプローチをとります。
ECSSでのモジュールとは汎用的なコンポーネントの区切りではなく、例えばボタン・テキスト・リストを合わせた1つの機能を指します。

具体的には「購入リスト」ページにタイトル・リスト・ページネーションがあったとして3つ合わせて1つのモジュールとなります。また「購入リスト」にデザインが近い「お気に入りリスト」ページがあったとしても「購入リスト」と「お気に入りリスト」のタイトル・リスト・ページネーションは共通のモジュールとしてみなしません、別々にスタイルを記述します。
※このあたりのモジュールの定義はデザインや状況によって変わる可能性はあります...

別々にスタイルを記述するため重複しCSSのファイルサイズが大きくなるのですが、
影響範囲が分離されており、「お気に入りリスト」のみのCSS修正で「購入リスト」に影響することはありません。
影響範囲で頭を悩ませることなく、すばやく修正ができ、長く生きるCSSを記述することができます。

もっと詳しい説明はこちらから
公式：http://ecss.io/
CodeGrid：https://app.codegrid.net/entry/2016-ecss-1

# 選定理由
正直あまり人気な設計手法ではないと思います...DMM内でもECSSを採用した話は一切聞きません。
仮に新規開発でページ内デザインが共通化されているならば、細かいパーツからスタイルを組み立てていく設計手法（FLOCSS, APBCSS等）を使った方がよいと思います。

ただ自分が担当している案件が特殊で、デザインが完成していない状態でHTML, CSS, JavaScriptのコーディングを進めなければなりませんでした。フロー詳細は以下です。

1. 仮デザインを元にHTML, CSS, JavaScriptをコーディングする
2. サーバーサイドのエンジニアに渡しView側の実装をしていただく
3. 本デザインが完成する
4. 本デザインを元にCSS, JavaScriptを調整する
5. サーバーサイドのエンジニアに再度渡す

デザインが確定していないことから、仮デザイン段階で汎用的なコンポーネントベースにコーディングしたとしても本デザインではどうなるのか想定できない（ボタンだと思っていたものがボタンではなくなるなど...）


またその他事情により4 ~ 5にかけてあまりHTMLを修正できないかもしれないという制約を抱えており、FLOCSS, APBCSSでは柔軟に対応することが難しいと判断しました。
そのため、分離したモジュール毎にスタイルを柔軟に調整できるECSSを採用しました。

# コーディングするにあたって気を付けたこと
デザインが確定していない、またHTMLを調整できないかもという特殊な状況だったので、以下のことを気を付けました。

## namespace `sw` は使用しない
ECSSでは汎用的なコンポーネントを禁止しているわけではありません。
作成する際は `sw`(SiteWide) namespaceを使用するルールとなっていますが、今回は仮デザインから本デザインでの汎用的なコンポーネントを読み取ることが困難だったため使用しません。

## mixinを使いすぎない
こちらも禁止されている訳ではないのですが、ECSSでは分離すること・複雑にしないことを前提にしているため、使いすぎないよう注意しました。
ただ仮デザインでの汎用的なコンポーネントはスタイルの記述が面倒だったため、mixinを使用しました。
もし本デザインが汎用的なものでなかった場合はincludeを削除したいと思っています。

## namespaceは省略しない
公式サイトやCodegridの記事では、namespaceを多用するため省略していましたが（shopping cart => sc）
namespaceが10 ~ 20となり、何を示しているのかわかりずらくなったため省略はしていません。
（HTMLの記述がかなり面倒になってしまったので、これはよくないかも...）

# おわりに
ECSSはページ毎のデザインがうまく共通化されていない、また自分と同じようにデザインよりコーディングを先行しないといけない状況（いないかもしれませんが...）の人はこの設計手法がうまく当てはまるかもしれません。

現状、フローの2 ~ 3にあたるため、ECSSを選んで正解だったかはまだ結果が出ていません。
結果はまた別途記事を書きたいと思います！

明日は [@ma9to](https://qiita.com/ma9to) さんのフロントエンドに関する話です。
お楽しみに！
簡潔にインターンの振り返る

※この記事は，以前，先日までグレンジでインターンをしてくれていた藤井くんの記事です．このアドベントカレンダーの企画が上がった際に，準備してくれていた記事を代理で上げています．

![image1.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/5e84bf14-208d-b116-db66-7c08ed142969.jpeg)

![image2.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/753ccd87-2421-7866-13b9-827aaccd2e68.jpeg)

![image3.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/341b1a62-fa30-62bb-a226-58e008a43167.jpeg)

![image4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/e05e2696-851f-d3b6-5322-f81247125c5a.jpeg)

![image5.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/29738cbb-ed44-14bf-6ae0-74755562104e.jpeg)

![image6.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/46052e6e-d474-f285-0dd3-3b73545d470f.jpeg)

![image7.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/4bd6647b-3cb4-2ddf-4ea3-35507bbd23bb.jpeg)

![image8.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/377b3006-6439-045c-402c-3011914b4b0d.jpeg)

![image9.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/fad473f9-3bbc-c7b1-cb73-b9584f4b6362.jpeg)

![image10.jpeg](https://qiita-image-store.s3.amazonaws.com/0/50190/88c172cb-7ff1-0422-36e8-5244cf077a4d.jpeg)
【Android】無効な「年」をはじくバリデーションを実装する！

#無効な「年」をはじくバリデーションを実装するには？？

生年月日入力の際などにユーザーに「年」を入力してもらうことがあるかと思いますが、その際に無効な値を受け付けないようにするバリデーションを実装しますっ！

・↓日付のバリデーション実装についてはこちら↓
[【Android】日付入力のバリデーションをつくるには？？](https://qiita.com/yyokii/items/7a408ee62cfc009f87ea)

##実装内容

今回の実装では以下のような仕様になっています。
・現在より150年前の「年」はダメ
・未来の「年」はダメ


##実装コード
```ValidationUtil.java

    /**
     * 生入力の際に、150年前の「年」や未来の「年」は受け付けない　＝ false
     *
     * @param inputYearString
     * @return
     */
    public static Boolean yearValidation(String inputYearString){

        int inputYearInt = Integer.parseInt(inputYearString);

        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);

        if ( inputYearInt > year -150 && inputYearInt < year + 1 ){
            return true;
        } else {
            Config.DLog("年の入力が無効です（古すぎる、または未来）");
            return false;
        }
    }

```
Githubを使った開発タスク管理

# はじめに

本記事はGithubを使った開発プロジェクトのタスク管理方法の一例です。
Project機能を使ってissueを管理します。
やりたいことはプログラマもプロジェクトマネージャーも、今どんなタスクが動いていて何か問題があるか確認できるよう運用ルールを決めることです。

# 前提条件

- Githubに何かしらのリポジトリがある
- 開発タスクはissueとして登録する
- issueはなるべく1週間で対応できる粒度にする
- プログラマとプロジェクトマネージャーがいる


# Projectの作成

<img width="695" alt="New_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/f8238b6c-da68-d874-7934-4c4b9603ed69.png">

# Project ボードの作成

ボードを作成します。

1. `Conversations`
2. `To do`
3. `In progress`
4. `Review`
5. `Done`

# Project ボードの設定

[Preset](https://github.com/blog/2458-keep-your-project-boards-up-to-date-automatically)を設定します。

### To do

<img width="447" alt="To_do.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/015283c0-25b2-ba79-b732-2aebaa535a89.png">

### In progress

<img width="447" alt="In_progress.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/19c663a4-4467-115c-ba8f-9d105ce9750c.png">

### Done

<img width="447" alt="Done.png" src="https://qiita-image-store.s3.amazonaws.com/0/100766/f75c802e-0107-bbf7-d693-9a54c909827e.png">

# Project 完成イメージ

![完成イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/100766/f8543658-4cc9-705b-989c-7ad2e815977b.png)


# 運用の流れ

作成したProjectを1週間単位で進捗確認します。
ここでは月曜日を確認する日とします。

### プログラマの場合

*月曜日のチェック*

![開発タスク.png](https://qiita-image-store.s3.amazonaws.com/0/100766/837598d3-8bcb-ad2e-f3aa-2e98f35c4cd2.png)

1. 何かあれば`Conversations`に書く
2. `Conversations`のカードからタスク化するものを選んでissueにする
3. プログラマが対応できるようタイトル、本文やラベルを適宜変更する
4. `To do`の中から今週対応するカードを選び、アサインやラベルを設定する

*月曜日以降*

1. `In progress`にカードを移動する
2. `In progress`のカードで対応が終わったものから`Review`に移動する
3. レビュー担当者 or プロジェクトマネージャーに依頼する

### プロジェクトマネージャーの場合

![開発タスク.png](https://qiita-image-store.s3.amazonaws.com/0/100766/cc58c48e-c693-4c4a-d657-e0e7153a6033.png)

*月曜日のチェック*

1. `Done`のカードでボードから削除していいものを削除する（多くても問題ないなら残す）
2. `Review`のカードをレビューする
    1. OKの場合はissueをclosedにする（デプロイや報告があれば行う）
    2. NGの場合はカードを`In progress`に戻し、担当者に修正依頼する
3. `In progress`のカードについて問題が置きてないか担当者に確認する
4. `To do`のカードから急ぎのものがあれば対応するようプログラマに依頼する
5. 何かあれば`Conversations`に書く

*月曜日以降*

1. `Review`のカードを随時レビューする（上記と同じ）

### 運用のポイント

issue化して対応すべきだけど、詳細な情報やどういう方向で実施するか時間が必要なことは、とりあえず`Conversations`にメモとしてガンガン残していくことです。

### 理想の月曜日

- `Review`のカードが０（全てリリース済みの状態）
- `In progress`のカードが０（全て対応済みの状態）
- プロジェクトマネージャーが対応済みのタスク、未対応のタスクを一覧で確認できている
- プログラマが今週やるべきタスク一覧を確認できている

---

あくまで一例としてあげているので、もっといい方法だったりツールだったりあればコメントいただけると幸いです:pray:

**参考**
https://qiita.com/daipoyo/items/79abca81572ba9c69877
3Dモデルをクリックするとハイパーリンクが開けるライブラリを作った。

WebGL（HTML5のcanvas要素） の 3Dオブジェクトを簡単にハイパーリンクにするライブラリがありそうで無かったので、デファクトになっている Three.js のラッパーライブラリを作成しました。

# 作ったライブラリ
## 3Dink.js
#### https://github.com/takashift/3Dink.js

【2018年6月16日追記】npmでも公開しました。
#### https://www.npmjs.com/package/3dink


# 解説
これを使うと、3Dモデルをクリックした時に、指定したリンク先を開くことが出来るようになります。

なお、ハイパーリンクと化した3Dオブジェクトには名前が無いので、勝手に **3Dink** と名付けました（以下、こう呼びます）。

一応公式サイトやスライドがあるので、詳しい説明などはリンクで紹介します。

### 公式サイト
#### http://3dink.webcrow.jp/

#### チュートリアル（サンプル）
#### https://higechira.hatenablog.com/entry/2018/12/21/013459

#### リファレンス
#### http://3dink.webcrow.jp/reference/index.html

#### リリースノート（変更点）
#### http://3dink.webcrow.jp/3Dink_history.html

### デモ映像
#### https://www.youtube.com/watch?v=x_PDbOtZiOs

# 使い方
2.0.0より名前空間の変更（Js3Dink -> DDDINK）や setRendererObj() -> readRendererObj() があったりしますが（[リリースノート参照](http://3dink.webcrow.jp/3Dink_history.html)）、使用例やスライドにサンプルコードが載っているので参考まで。
リファレンスは最新バージョン分用意しています。

最低3行で3Dink化できます。以下のような感じです。

```javascript
// 3Dオブジェクト（model）にハイパーリンクを追加して3Dink化する。
DDDINK.addURL(model, "http://3dink.webcrow.jp/reference/index.html");
// 3Dinkを検出するために、three.jsの3つのオブジェクトを渡す。
DDDINK.readRendererObj( renderer, scene, camera );
// リンク参照時のDOMイベントを追加する関数（引数でリンクの実装方式を指定可能）
DDDINK.domEvent.addFnc();
```

# ２つの実装方式
モデルをクリックしてリンクを開けるようにする機能は２つの実装方式があります（利用時はどちらかを指定します。指定方法、デフォルトの指定は最新のリファレンスを参照）。

## JavaScript の関数で実装する方式（関数モード）
動作がこちらの方が高速なのと、もう一方の実装方式を使用する際はちょっと手間があるので、指定しない場合はこちらで実装されます。
ただし、一部ブラウザで警告が表示されることがあります。また、現時点でコンテキストメニューを開くことができず、スマホで新規タブを開くことができません( PC はホイールクリックで可)。
よって、 PC では右クリック時に URL をコンソール出力します。

## JavaScript で HTML のアンカータグを追加する方式（ A タグモード）
HTML のアンカータグの挿入により実装しています。
この方式は普通のテキストリンクと同じなので、コンテキストメニューを開くことが出来、リンクを開く際にも警告は出ません。 
ただし、ちょっと無理矢理な実装になっています。

注意点として、使用時は**画面と同じサイズの空のタグ(&lt;div&gt;&lt;/div&gt;など)で囲わないといけません**（詳しくはスライドの P.12 を参照）。

また、マウスだとリンクを開くには 3Dink をダブルクリックする必要があります。


# 余談
2014年、都内某所。
**Web** GL なのに、3Dモデルにハイパーリンクを付けられないとは何事だと一人の少年(18)が立ち上がった…

このライブラリ、実は最初にリリースしてから３年経っています。

当時は GitHub とか（ Three.js が GitHub で公開されていたので存在は知っていたけど）使ったことは無かったので、Zip でサイトに公開していました。

そして、それから2年。
人様にライブラリとして使ってもらうにはちょっとお粗末だったものの、放置を経て手直しした上で GitHub に公開されました。

あと、Mashup Awards に参加したり。
http://ma10.mashupaward.jp/works/1491
https://hacklog.jp/works/49217

正直このライブラリを使った何かを作った方が良かったと思います（って思ってたんだけどそこまでの気力は無かった）。

3年経った今回、今までリファレンスが無かったので、用意することにしました。

というのも、twitter@komakinex4t さんがぜひ使いたいとのことでわざわざリプを投げてくれたのですが、使い方に困っていて申し訳なかったためこの機会に書きました（前々から作ろうという気持ちはあったものの先延ばしに、、）。

komakinex4tさんありがとうございます！
Faust / FaustLiveをRaspberry Piでビルドしてみた

本記事は[Faust Advent Calender 2017](https://qiita.com/advent-calendar/2017/faust)の12月16日向けに投稿した記事です。

本記事では、Faust言語のローカルでのビルド環境（FaustコンパイラとFaustLive）をARM Linux(Raspberry Pi/Raspbian)上で構築する手順について紹介します。

## Faust言語とは？

Faust言語の紹介についてはMatsuura Tomoyaさんに譲ります。["音声処理プログラミング言語、Faustの紹介"](https://matsuuratomoya.com/blog/2016-12-01/faust_introduction/)

> ##Faustとは？
Faustは簡潔（かつやや特殊）な記法で信号処理を記述することができるプログラミング言語で、C++を経由してスタンドアロンアプリ、VST/AU/LADSPA/Lv2プラグイン、JUCEなどの様々なアーキテクチャ、さらにはOWLやBelaなどのハードウェアプラットフォームにもと、様々なプラットフォームへエクスポートが出来る環境を備えています。
また最近ではLLVMを利用して実行時コンパイルやWebAudioなどへのエクスポートも可能です。

Faustの開発環境は、ローカルでコンパイルするものとクラウドでコンパイルするものが提供されています。とりあえずFaustを触ってみたい人には、WebEditorが一番楽しいとおもいます。["とりあえずFaustを始めたい人のための4つの環境"](https://matsuuratomoya.com/blog/2016-12-04/faust_start/)

なお、ローカルでコンパイルする開発環境自体は、オープンソースで配布されており、クロスプラットフォームな実装となっているので、Windows/macOS/LinuxでFaustの開発環境を構築することができます。また、x86/64アーキテクチャ用にビルド済みのFaustコンパイラ、FaustLiveは公式サイトにて配布されています。[公式サイト](http://faust.grame.fr/download/)


##  開発環境

◆ハードウェア
Raspberry Pi 3 Model B

◆OS
Raspbian Stretch (2017/11/29)

# Faustコンパイラをビルドする

## パッケージリストの更新

```bash
sudo apt-get update 
sudo ap-get upgrade
```

## Faustコンパイラのリポジトリをクローンする

```bash
// Faustコンパイラのリポジトリをクローン
$ git clone https://github.com/grame-cncm/faust.git

// リポジトリのディレクトリに移動
$ cd faust

// Gitサブモジュールを初期化・クローン
$ git submodule update --init
```

##  必要なパッケージをインストールする

```bash
// LLVMコンパイラとその開発ツール
$ sudo apt-get install llvm-dev

// FaustLiveのビルドに必要なHTTPサーバーライブラリ
$ sudo apt-get install libmicrohttpd-dev
```

## ビルド

```bash
// Faustコンパイラをビルド
$ sudo make

// FaustLiveのビルドに必要なHTTPサーバーライブラリ(libHTTPDfaust.a)をビルド
$ sudo make httpd
```

## インストール

```bash
// Faustコンパイラと各種ツール群をシステムにインストール
$ sudo make install

// バージョンを確認
$ faust --version

>> FAUST : DSP to C, C++, Rust, LLVM IR, JAVA, JavaScript, asm.js, WebAssembly (wast/wasm), Interpreter compiler, Version 2.5.12
>> Copyright (C) 2002-2017, GRAME - Centre National de Creation Musicale. All rights reserved. 
```


# FaustLiveをビルドする


## FaustLiveのリポジトリをクローンする

```bash
// FaustLiveリポジトリをクローン
$ git clone https://github.com/grame-cncm/faustlive.git

// 作業ディレクトリに移動
$ cd faustlive
```

## 必要なパッケージをインストールする

```bash
// Qt SDKをインストール
$ sudo apt-get install qt-sdk

// QRコードのエンコーダをインストール
$ sudo apt-get install libqrencode-dev

// OpennSSL開発用ライブラリをインストール
$ sudo apt-get install libssl-dev

// URL転送開発用ライブラリをインストール
$ sudo apt-get install libcurl4-openssl-dev

// Jack2開発用ライブラリをインストール
$ sudo apt-get install libjack-jackd2-dev

// ALSAアプリケーション開発用のライブラリをインストール
$ sudo apt-get install libasound2-dev
```

## ビルド

```bash
$ sudo make
```

## インストール

```bash
$ sudo make install
```

## FautLiveを起動する

ターミナルから起動する場合

```bash
// リポジトリのディレクトリに移動する
$ cd faustlive

// 実行プログラムを起動する
$ ./FaustLive
```

メニューから起動する場合

<img width="640" alt="スクリーンショット 2017-12-11 0.34.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/93566/b7b737b1-2c55-eaa1-9fb8-890f8490ad78.png">

<img width="739" alt="スクリーンショット 2017-12-11 0.35.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/93566/02f5a442-db11-5bc0-cb1b-35906f1f840f.png">
初心者向け！３日でvim病になる方法

この記事は [Advent Calendar 2017 vim2](https://qiita.com/advent-calendar/2017/vim2)　の11日目の記事です


くぎゅう10と申します。

vim歴は半年。

vim知識は本当にまだまだですので
今回は超初心者向けの記事を投稿しようと思います。

ズバリ

「たったの３日でvim病になる方法」

です。


vim病とは、（http://d.hatena.ne.jp/keyword/vim%C9%C2）
vimの素晴らしさを理解しだした頃に発症する病気。以下のような症例が認められている

- ホームポジションから手を動かしたくなくなる。マウスに手を動かすのは論外。
- なんでもvimキーバインドにしたがる。
- ほかのエディタでも手が勝手にvimキーバインドを叩いてしまう。

これらの症状は基本的に熟練のvimmerに発症する症状ですが、
それをなんとたった３日で病気になることができる手法です。

『クリスマスや年末年始を活用して新しくvimを使ってみようかな〜って』
思っている方はぜひ、以下の記事に目をお通し下さい！


# 1日目　ゲームで遊ぶ

vimは基本操作がクセありすぎです。

まずは基本のキー操作を身体に叩き込むことが大事なのは分かるんですが

ただただvimの真っ黒い画面を
目的もなくjjjjj、とかやってもぜんっぜん面白くないです。

死にます!

そこで先人の知恵。
vimを学べるゲームをやりましょう！

jkl;移動など基本操作はかなりばっちり覚えられます。

Vim Adventure (https://vim-adventures.com/)

![スクリーンショット 2017-12-10 20.53.49.png](https://qiita-image-store.s3.amazonaws.com/0/158747/7713959c-dd67-75e2-6034-7554ce0edd29.png)

１〜２時間ほどのプレイで、jkl;移動が
かなり自然になると思います。

無課金でクリアできる範囲を終了したら、１日目は終了


# ２日目 無難にvim tutorial

Vim tutorial
ターミナルなどで　vimtutorと叩くと始められる vimのチュートリアルです。

<img width="883" alt="スクリーンショット 2017-12-10 21.16.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/158747/6cad506b-f7b1-3c8f-d484-ec1887e6f2da.png">


vim　tutorialの文章が良くできています。

```
Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常に強力なエディターです。
```

「Viemmer特有の、vim自慢している時の得意げなニヤけ顔」
が良く伝わってきます。

「vimという素晴らしいエディタ選択をした君は実に懸命だ
このチュートリアルでvimの基本を身につける」と言わんばかり

１日目で一番難関である基本操作は終えてますので
かなりスムーズにvimが学習できるはずです。

チュートリアルを完走するころには

「あれ？vimってそんなに凄いの？」って、
vim可能性を感じ始めているでしょう。
（洗脳ともいいます）



# 3日目 哲学する

3日目の課題は哲学です。

![images.png](https://qiita-image-store.s3.amazonaws.com/0/158747/2febda06-143f-a57f-a845-681ee3a163b8.png)

**真面目に言っています。**

vim道は一日にして成らずということを知るのです。

ここまで基本操作を学習してくると、
なまじ基本を知ってしまった故に
vimって覚えることの多さにビビるんですよね。

覚えれば覚えるほど、ささっとこなせる小技も増えてくるし
確実に作業は楽しくなるのですが、やっぱ覚えること多すぎ。

プラグインとか入りだすと沼ですよ沼。


なので、３日目の課題は**哲学**です
これから半年修行してもいい、と思えるだけの
モチベーションが、自分にあるか、問いかけて下さい。

沼に入ってみる覚悟があるか、再度自答してみてください。

vimキーバインドの設計思想について調べてみて下さい。

Vimの素晴らしさを紹介している記事、動画をみてください。
Ci'キーの凄さに感動して下さい。

絶対にホームポジションから手を動かさないぞという、
vimmerの愛すべき「怠惰」を感じて下さい。

あなたにとっての「vimを一生使い続ける理由」を考えてみて下さい。

これらのモチベーションの質で

ちなみにぼくに取っての理由は単純で

「一生モノのエディタを使いこなしてる俺かっけー！」
みたいな、しょーもないのが目的だったりします。

エンジニアはどうせ一生エディタ使うので、
何か１つ、一生モノのエディタってものが欲しかったんですね。


# ３日後　

哲学で答えをだしても、答えをだせてなくても、
あなたはもうvimを「使える」ようになっています。

細かいキーバインドはまだまだ覚えてないでしょうけど、
普通のテキストエディタとしてなんとか使えなくもないレベルに達しているはずです。

そしてなにより、vim特有の「テキスト操作したときの**快感**」　　みたいなものも
知ってしまったはずです。

背中がゾクゾクっときた人もいるかも知れませんね。

これで半年vim修行する

メールしながらvimの修行もできるならお得じゃね？

どうせなら仕事中もどんどん修行したいよね？

ネットで調べれはそういう情報がいくらでも出てきます。



vim病とは

vimの素晴らしさを理解しだした頃に発症する病気。以下のような症例が認められている。
- なんでもvimキーバインドにしたがる。
（http://d.hatena.ne.jp/keyword/vim%C9%C2）


そう、あなたは立派にvimの可能性に気づいてしまいました。
残念ながら発症条件を満たしてしまいました。

vimキーバインドにしたがるという典型的な症状も確認できます。

完全にvim病です！お大事に！！
Mac > High Sierra > クリーンインストール失敗時の対処



High Sierraをクリーンインストールしようとしたら、apfsインストール用のprebootボリュームを作成できませんでしたと出て困った件の対応

![IMG_6988.jpg](https://qiita-image-store.s3.amazonaws.com/0/49910/09b039d2-bce4-4c75-e3fe-d7c783736de6.jpeg "IMG_6988.jpg")


[SMC とPRAM のリセット後、インターネット復元から起動してパーティションマップの再作成はできないでしょうか。MBR にしてGUID に戻すと再作成されます。](https://discussionsjapan.apple.com/thread/110192298?start=0&tstart=0)

```
SMC とPRAM のリセット後、インターネット復元から起動してパーティションマップの再作成はできないでしょうか。MBR にしてGUID に戻すと再作成されます。
```


## SMCリセット
```
Mac デスクトップコンピュータの SMC をリセットする方法
Mac をシステム終了します。
電源コードを外します。
15 秒間待ちます。
電源コードをつなぎ直します。
5 秒間待ってから、電源ボタンを押して Mac の電源を入れます。
```



[macOS Sierra: コンピュータの NVRAM または PRAM をリセットする](https://support.apple.com/kb/PH25631?locale=ja_JP)

```
アップルメニュー＞「システム終了」と選択します。

キーボードで Option キー、Command キー、P キー、および R キーの位置を確認します。手順 4 では、これらのキーを同時に押し続ける必要があります。

Mac の電源を入れます。

Apple ロゴが表示された黒い画面が表示される前に、すぐに Option ＋ Command ＋ P ＋ R キーを押したままにします。

Mac が再起動するまでの約 15 秒間、これらのキーを押したままにします。

キーを放します。
```



# それでもダメな場合

それでもダメな場合が発生したので続きを書きました。

[Mac > High Sierra > クリーンインストール失敗時の対処 \- Qiita](https://qiita.com/sugasaki/items/3d0a1ae27fc85c7e030f)
gunicorn+Django+MySQLで No module named 'MySQLdb' エラー

# 現象
DjangoアプリをHerokuにデプロイしている時に、　`No module named 'MySQLdb'` で詰まった。
Python3の時、PyMySQLでMySQLを使う場合に、`manage.py`に

```python3
import pymysql
pymysql.install_as_MySQLdb()
```
と書くことがあり、ここでPyMySQLをMySQLdbという名前で読んでいるはずなので、`No module named 'MySQLdb'`というエラーが出る場合ここがおかしい。


# 環境
Python 3.6.3
Django 1.11.7
PyMySQL 0.7.11
gunicorn 19.7.1

# 原因
よく考えれば単純で、gunicornでWSGIサーバーを立てているので、この場合manage.pyが呼ばれてない。
ローカルで開発するときに`python manage.py runserver`を叩いていて勘違いしてしまった。。。
`manage.py`ではなく、`wsgi.py`に

```python3
import pymysql
pymysql.install_as_MySQLdb()
```
を書いたら治った。



誤りがあればコメントくださると嬉しいです。。。
【Android】日付入力のバリデーションをつくる！

#日付入力のバリデーション  
</br>
ユーザーが生年月日の入力や、予約日の入力をした際に不正な入力値を無効にしたい、エラーダイアログを出したいときがあると思います。
そんな時に使用するバリデーションの実装についてまとめてみました！

・↓「年」のバリデーション実装についてはこちら↓
[【Android】無効な「年」をはじくバリデーションを実装するには？？](https://qiita.com/yyokii/items/103428f8064228be2476)

##実装コード
```ValidationUtil.java
    /**
     * 有効な日付であるかのチェック
     * 13月や32日といった日にちは無効とする
     *
     * @param inputBirthDateString
     * @return
     */
    public static Boolean dateValidation(String inputDateString){

        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        // ポイント1
        dateFormat.setLenient(false); 
        Date parsedDate = null;
        try {

        // ポイント２
            parsedDate = dateFormat.parse(inputDateString);
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }

        // ポイント３
        return dateFormat.format(parsedDate).equals(inputDateString);
    }


```
###ポイント１
Lenient：
寛大な、慈悲深い、情け深い、(…に)寛大で、大目に見る、甘い
→ setLenient(false) は寛大さをなくす ＝　厳密なチェックをすることを意味します。

デフォルトでは true になっており、この設定だと、実在しない日付は自動的に繰り上げ・繰り下げが行われます。（例： 1月32日　→　2月1日）

###ポイント２
String 型を SimpleDateFormat を用いて Data型に変換します。
正常な日付の場合はパースが成功。無効な日付の場合はfalseを返します。

###ポイント３
ポイント２までの処理で問題なさそうですが、このままでは１つ問題があります。
それは SimpleDateFormatが前方一致で処理を行うからです。
→　例：　SimpleDateFormatのインスタンスを ”yyyy/MM/dd” の日付形式で作成したき、"2017/12/1A”という値がformatでき、”2017年12月1日”として扱われてしまいます。

→　なので、最後に「バリデーション対象となる文字列」と「SimpleDateFormatで変換したあとの文字列」を比較し、 例えば 2017/12/1Aが入力されていた場合はfalseを返すようにしています。
Eclipseでlog4jを使ってファイルとコンソールの両方にログ出力ができるようにする。

この記事は、Eclipseでorg.apache.log4jパッケージを使用して、ファイルとコンソールの両方にログ出力ができるようにする為の方法について記載したものです。

この記事を読む前にlog4jのパッケージを使用してログ出力ができる環境が整っていない場合、以下のリンクを参考に環境を作成する必要があります。
参考記事：https://qiita.com/toolate32/items/538f3a99d23a7a1f29bd

1.まずは、以下の簡単なプロジェクトでログ出力を確認してみます。

package test.project;
import org.apache.log4j.Logger;
   
public class TestClass {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(TestClass.class.getName());
	// ログ出力
	logger.info("This is info.");
    }
}

とりあえず、コンソールには出力されています。
コンソール出力：
2017/XX/XX 14:56:09 781  INFO  main TestClass - This is info.

現在の log4j.xml の内容は以下になっています。
1:< ?xml version="1.0" encoding="UTF-8" ?>
2:< !DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
3:< log4j:configuration xmlns:log4j="" class="autolink">http://jakarta.apache.org/log4j/" >
4:< appender name="stdout" class="org.apache.log4j.ConsoleAppender">
5:< param name="Target" value="System.out" />
6:< layout class="org.apache.log4j.PatternLayout">
7:< param name="ConversionPattern" value="%d{yyyy/MM/dd HH: mm:ss SSS} %5p %5t %c{1} - %m%n" />
8:< /layout>
9:< /appender>
10:< category name="test.project" >
11:< appender-ref ref="stdout" />
12:< /category>
13:< /log4j:configuration>

2.log4j.xml の設定をコンソール、ログファイルの両方に出力されるように追加する。
上記の設定ファイルは、4～9行目はコンソール出力定義、10～12行目はパッケージ test.project 内でのログ出力の設定を指定しています。11行目で apender-ref を "stdout" としているので、4～9行目定義のログ出力が行われます。
これにファイル出力の定義とファイル出力を行うには、以下の定義を追加します。

 1:< ?xml version="1.0" encoding="UTF-8" ?>
2:< !DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
3:< log4j:configuration xmlns:log4j="" class="autolink">http://jakarta.apache.org/log4j/" >
4:< appender name="stdout" class="org.apache.log4j.ConsoleAppender">
5:< param name="Target" value="System.out" />
6:< layout class="org.apache.log4j.PatternLayout">
7:< param name="ConversionPattern" value="%d{yyyy/MM/dd HH: mm:ss SSS} %5p %5t %c{1} - %m%n" />
8:< /layout>
9:< /appender>
4-1:< appender name="fileout" class="org.apache.log4j.FileAppender">
5-1:< param name="File" value="logTest.log" />
6-1:< layout class="org.apache.log4j.PatternLayout">
7-1:< param name="ConversionPattern" value="%d{yyyy/MM/dd HH: mm:ss SSS} %5p %5t %c{1} - %m%n" />
8-1:< /layout>
9-1:< /appender>
10:< category name="test.project" >
11:< appender-ref ref="stdout" />
11-1:< appender-ref ref="fileout" />
12:< /category>
13:< /log4j:configuration>

追加した箇所は、4-1～9-1、11-1です。4-1～9-1でファイル出力定義、11-1行目で apender-ref を "fileout" としているので、4-1～9-1行目定義のログ出力が行われます。

これで、試しに上のソースを動かしてみると、今度はコンソールとログファイルの両方に出力されていますね。

※コンソール出力
2017/XX/XX 20:37:17 689  INFO  main TestClass - This is info.

※ログファイル出力(logTest.log)
2017/XX/XX 20:26:59 660  INFO  main TestClass - This is info.
2017/XX/XX 20:37:17 689  INFO  main TestClass - This is info.
Slack+GAS+Twilioで仕事中に仮眠取ってる同僚をbotに叩き起こしてもらう

# こんなやーつ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/108727/bc90a084-50cf-c603-748d-5f3f053fece7.png)


# レシピ

### (1) Outgoing WebhooksでSlackの投稿に反応させる

まずは[Outgoing Webhooks](https://api.slack.com/custom-integrations/outgoing-webhooks)を使って特定の投稿に反応するようにしましょう。

|設定名|内容|
|:--|:--|
|Channel|ここで指定したチャンネルでの投稿に反応します。お好みで。|
|Trigger Word|ここで指定したワードで始まる投稿に反応します。何でもいいんですけど、bot君の名前にしときます。|
|URL|Trigger Wordにマッチした場合にリクエストされるURLです。最終的にGASの公開URLを指定しますがとりあえず今は空で。|
|Token|Webhookのトークンです。後で使うのでメモっときます。|

![slack3.png](https://qiita-image-store.s3.amazonaws.com/0/108727/1e5689d6-da78-5413-82ad-579666c51494.png)




### (2) GASで受けてTwilioに流す

GASのscriptはこんな感じ。（エラー処理とか何もしてないけど）
Slackまわりのごにょごにょは[こちらのライブラリ](https://qiita.com/soundTricker/items/43267609a870fc9c7453)を使わせてもらいました。感謝！


```javascript:GoogleAppsScript
function doPost(e) {

  var webhook_token = '【Webhook Token】';
  var twilio_sid    = '【Twilio Application SID】';
  var twilio_token  = '【Twilio Token】';
  var slack_token   = '【Slack API Token】';

  //Webhookトークンの検証
  if (e.parameter.token != webhook_token) {
    throw new Error("invalid token.");
  }

  //e.parameter.textにSlackの投稿内容が入ってるのでマッチ条件は適当に変えてね
  if(e.parameter.text.match(/xxxxxさん起こして/)) {

    var payload = {
      'To'   : '【発信先の電話番号】', //+81xxxxxxxx
      'From' : '【発信元の電話番号】', //+81xxxxxxxx
      'Url'  : '【TwiMLのURL】'
    };

    UrlFetchApp.fetch('https://api.twilio.com/2010-04-01/Accounts/' + twilio_sid + '/Calls.json', {
      'method'  : 'POST',
      'headers' : {'Authorization' : ' Basic ' + Utilities.base64Encode(twilio_sid + ':' + twilio_token)},
      'payload' : payload,
      'muteHttpExceptions' : true
    });

    
    var app = SlackApp.create(slack_token);
    return app.postMessage(e.parameter.channel_id, 'よっしゃ、まかしとき！', {
      username: 'bot',
      icon_url: 'http://www.material-land.com/material/1769.gif'
    });
  }
}
```

- **Webhook Token**
    - (1)でメモったやつ
- **Twilio Application SID / Twilio Token / 発信元の電話番号**
    - あらかじめTwilioの管理ページで調べておく
- **発信先の電話番号**
    - 叩き起こしたい人の電話番号
    - 分からなければソーシャルエンジニアリングを駆使して~~盗み出し~~聞き出しておきましょう
- **TwiMLのURL**
    - 電話出た時の応答メッセージを定義した[TwiML](https://jp.twilio.com/docs/api/twiml)を適当な場所に置いておく
    

```xml:TwiML
<Response>
<Say language="ja-jp">起きろー！！</Say>
</Response>
```

固定のメッセージじゃなくてSlackで投稿した内容拾ってそのまま喋らしてみてもいいですね。


### (3) 公開する

GASを公開しましょう。
[公開] ⇒ [ウェブアプリケーションとして導入]

![gas.png](https://qiita-image-store.s3.amazonaws.com/0/108727/2bddbc78-5ad6-35a2-1d71-f4aa83165e55.png)

公開URLが表示されるのでメモります。
最後にOutgoing Webhooksの設定画面に戻って「URL」の項目にメモった公開URLを登録したら準備完了！


# さぁ起こそう


![slack2.png](https://qiita-image-store.s3.amazonaws.com/0/108727/d35cde01-0680-8739-9e34-29aaaa37b360.png)
減衰振動の特性計算


##減衰振動の特性方程式
s^2 + 2ζω s + ω^2 = 0
振幅の減衰はexp(-ζω)t、振動周期はω √(1-ζ^2)

##2次モデル
伝達関数多項式の係数を特性方程式の係数と比較することで、ζ、ωの解析解が得られる。

##3次以上のモデル
多項式から代数的に根を求められるのは３次まで。カルダノの公式など利用可能だが困難。数値計算によれば、高次の多項式の根を求められる。

##数値計算による手法
SciLabではdamp()で計算できる。
計算原理
1)多項式から極を計算する。
　多項式の係数よりコンパニオン行列を作成する。その固有値が極になる。
2)各極に対応する固有振動数、減衰係数を求める。
 ω = |s|, ζ= -cos(<s)
 ω = |ln(z)/T|, ζ= -cos(<ln(z))

```scilab:sample
K1=7/16;
K2=1/16;
// H(z)=N(z)/D(z)
N=poly([0,-K1,K1+K2],'z','c');//c:係数指定
D=poly([1-K1,(K1+K2-2),1],'z','c');

//**************************************
//減衰振動の固有振動数(ω)、減衰係数(ζ)を計算
//**************************************
//(1) 線形システムを作成してから解析する方法
H=syslin('d',N/D);//離散時間伝達関数から線形システムを作成
[wn,z] = damp(H);

//(2) 伝達関数から解析する方法(ΔTを指定）
dt=1.0;
[wn,z] = damp(N/D,dt);

//**************************************
//ステップ応答
//**************************************
x=ones(1,100);
y=flts(x,H);
t=1:length(x);
plot(t,x,t,y);

```
Windows 10 UpdateでBluetoothが不調になったら試すこと

「Windows 10、バージョン 1709 の機能更新プログラム」なるものをインストールしたら、デバイスマネージャーにおいてBluetoothアダプタに「！」が付いて、Bluetoothマウスを使えなくなった。
デバイスマネージャーのヒューマンインターフェース下の「Bluetooth HID デバイス」のプロパティで、「電源の管理」の「電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする」のチェックを外せば改善すると記載された記事を見つけたので試したが、そもそもPC起動時にBluetoothアダプタがダメになる事象が発生するし、しばらくするとマウスが使えなくなる事象が発生した。
Bluetoothアダプタ自体にも電源節約機能があるのでは？と思い、Bluetoothの「Bluetooth Module」のプロパティを見たところ、やはり「電源の管理」タブが存在したので電源節約機能をオフにしたところ、割りと直ぐに発生していた事象が発生しなくなった。

自分が使っているのはWindows 7 Home Edition (x64)からアップグレードしたWindows 10 Homeであるが、同じようにアップグレードOSを使っている人で、Bluetoothの問題が発生した人が少なからずいるようなので、簡単な記事だが載せることにした。
サービス自動起動on/offの基準について

# サービス自動起動について
昔は基本的に自動起動offで、サーバ起動手順書や障害対応手順書に記載して対応してたことが多かった気がするが、最近はどうなんだろうと思った。
システムや動いてるサービスにもよるけど、やっぱり運用手間削減するってところで自動起動はonにしてるところが多いのだろうか？

### 自動起動onのメリット
* サーバ再起動した（された）場合、自動でサービスが起動されるので、オペレーションがへり、起動し忘れもなくなる。
 * ちゃんと監視しておけば気づくことはできる。
 * 逆に異常があったことに気づかない場合もあるかもしれない。

### 自動起動onのデメリット
* 計画停止外でサーバ再起動された場合、システム的に中途半端な状態になる可能性がある。
 * クラスタ系のサービスだとどちらのサーバもマスタで起動してくるとか。
 * マスタとスレーブが頻繁に入れ替わったりとか。
 * DB系のサービスだとデータ内容がおかしな状態で公開されてしまうとか。
* サービス起動順を考慮しておく必要がある。
 * バックエンドサービス起動してないのに、フロントエンドサービスが先に起動してしまい、ユーザに
エラー画面がでてしまうとか。
 * バックエンドの状態確認まで行うようにヘルスチェックしてれば回避できそう。

### 個人的観点
* 基本的には全て自動起動on
* DB系、クラスタ系やレプリケーション組んでるようなサーバは自動起動offが安全そう（手間は増えるが）
* サービスの稼働監視は当然する。
* Web系サービスのヘルスチェックはバックエンドまで通したチェック内容にする。
EntityFramework+Azure SQL Databaseで高速な開発を実現する-環境構築編

# はじめに

データを蓄積・加工する以上、個人レベルのものであっても
システムを構築するにあたってデータベースは欠かせません。
一方、これまではデータベースの構築は手間のかかる作業となっており、
素早い開発を行う上でデータベース構築・テーブルの実装の短縮は重要といえます。

開発をC#で行う場合は、相性の良いAzure、EntityFramewokを利用することで短縮できます。

- Azure SQL DatabaseでDBを構築すると...
    - サーバのキッティングが不要で、すぐにDBを利用できる
    - Infrastructure as Code(Ansible/Terraform等)との組み合わせでさらにスピード構築可能
    - VisualStudioから直接Azureへ表定義が可能

- EntityFrameworkでテーブルを設計・実装すると...
     - 論理設計で作成したER図をすぐに実装できる(モデルファーストの場合。DBファーストは逆)
     - クエリ/プログラムの記述を簡潔かつ共通した書き方で記述できる

両方を組み合わせることで、より素早くDB構築・設計・実装をすることが可能です

# 構築デモ

- 今回の開発環境
    - Visual Studio Enterprise 2017 v15.4.2
    - .NET Framework 4.7(C#7.0)

※Azure SQL Databaseには無料プランはない
　ただし、Dev Essentialでクレジットを獲得可能(登録方法は下記リンク参照)
https://blogs.msdn.microsoft.com/ayatokura/2016/12/20/vsdevessential/

- 今回作成するテーブルの利用想定
    - 従業員情報・部門・資格情報の管理を行う

## 1.DBリソースの配置

まず、DB部分をAzureポータルからデプロイ(このステップだけは、VisualStudioでは実行できない)
⇒**[かわりにリソースグループ・DBサーバ・DBの構築までTerraformで構築可能です。こちらの記事を参照](https://qiita.com/KO_YAmajun/items/b62c87920b8f715faad0)**

DBを新規作成し、画面に表示されている通り必要項目を入力すればOK

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/a8cf7850-d625-99b4-03ef-7dfb85ade109.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/71ae5aec-a900-1118-a2a5-2edc47afef99.png)

## 2.プロジェクトの作成

[]内は、検索窓に同じ内容を入力することで開くことができる

- プロジェクトの準備
    - VisualStudioの起動
    - [新しいプロジェクト]→ASP.NET Webアプリケーションを選択※
    - [Nugetパッケージマネージャ]から、EntityFrameworkを選択し、インストール
    - [新しい項目の追加]→ADO.NET Entity Data Model→空のEFデザイナモデルの順に選択

※コンソールやWebアプリケーション等、EntityFrameWorkを利用可能ならなんでもよい

## 3.ファイアウォール規則の作成

[SQL Server の追加]→先ほど作成したDBを指定して必要事項を記入する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/3ba647b2-9df6-b535-a9d1-bfe61ce5858a.png)

## 4.DB設計の実施

- 前提事項
    - 1つの部門に対して0～n名の従業員が所属する。部門兼務や無所属はありえない
    - 従業員1人は0～nの資格を持つ。1つの資格は0～n人が保有する
    - 今回は簡略化のため、各idと名称の他は従業員給与のみとする
    - 交差エンティティとして、LisenseInfoテーブルを作成する

edmxファイルを編集して概念設計・論理設計を行う。ドラッグ＆ドロップで行える。
概念設計・論理設計のやり方は省略。(下図のような内容になるはず)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/8e820308-cf95-7e52-45e5-5fc0c3dc616f.png)

## 5.テーブルの生成

- テーブル定義の自動生成
    - 設計画面を右クリック→モデルから新しいデータベースを設計　でウィザードを開く
    - 新しい接続を選び、サーバー名を入力する(※選択肢には出てこないので手入力する)
    - 残りは3.のステップと同様に入力
- テーブルの生成
    - テーブルを定義するSQLが生成されるので、実行する
    - 実行結果を確認。外部キーやインデックスが作成されている

![Dept.png](https://qiita-image-store.s3.amazonaws.com/0/161516/a9079b9c-9f86-eda0-cd04-e09fcd075733.png)

![Employee.png](https://qiita-image-store.s3.amazonaws.com/0/161516/9f89bae3-ba44-ee02-4043-99dedb23560c.png)

![Lisense.png](https://qiita-image-store.s3.amazonaws.com/0/161516/ef1742a0-9f6e-46ed-65e2-7ca224c4e255.png)

![LisenseInfo.png](https://qiita-image-store.s3.amazonaws.com/0/161516/bb678d25-97ca-2260-fbcc-28a1e7afaa3d.png)

この他、エンティティクラスやDBcontextも自動生成されている。
同時に自動生成されたDBContextは下記の通り。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/161516/6756e850-5538-7a8b-a94a-3f186e1346d7.png)


## 6.次回予告

次回は、自動生成されたテーブル・DBcontextの活用編を書きます！
⇒[LINQプログラミング編できました。こちらを参照](https://qiita.com/KO_YAmajun/items/e525409f0c5468e9e4e7)
アレクサスキルの吾輩のテンプレート

#われのスキルを作る時に使うテンプレート

## インテントスキーマ

```
{
  "intents": [
    {
      "slots": [
        {
          "name": "Me",
          "type": "YourName"
        }
      ],
      "intent": "StrongestIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}
```

## Lambda側

```js
"use strict";
const Alexa = require('alexa-sdk');

// ステートの定義
const state = {
  sampleState: '_sample'
};

//まずはここが呼ばれる
exports.handler = function(event, context, callback) {
  var alexa = Alexa.handler(event, context);
  //dynamodbを使うなら下をコメントアウト
  //alexa.dynamoDBTableName = 'SampleSkillTable'; //使用するテーブル名に変更
  // alexa.appId = process.env.APP_ID;

  alexa.registerHandlers(handlers, sampleHandler); //使用するハンドラーを書き込む。
  alexa.execute();
};
var handlers = {
  // スキル起動名だけで起動されたときに呼ばれる
  'LaunchRequest': function () {
    var message = "起動名だけでこのスキルを開いたときに呼ばれる";
    this.emit(":tell", message);
  },
  // ヘルプとか言われたときに発動。スキルの説明を言わせる。必須
  'AMAZON.HelpIntent': function () {
    var message = "このスキルの説明";
    this.emit(':ask', message);
  },
  // 自分で定義したインテント
  "SampleIntent": function() {
    this.handler.state = state.EmotionState;
    this.emitWithState("EmotionIntent");
  },"AMAZON.StopIntent": function() {
    this.emit(":tell", "ストップなどと言われた時");
  },"AMAZON.CancelIntent": function() {
    this.emit(":tell", "キャンセルなどと言われた時");
  },
  'Unhandled': function() {
    this.emit(':ask', reprompt, reprompt);
  },
  "SessionEndedRequest": function(){
    // ユーザーが「終了して」と、言った時
    // ユーザーが何も応答しなかった時
  }
};

// ステートを定義 
var sampleHandler = Alexa.CreateStateHandler(state.EmotionState, {
  "SampleIntent": function(){
    // dynamoDBを使用していたらステートの情報も保存されてしまうので削除
    this.handler.state = "";
    this.attributes['STATE'] = undefined;
  },
  // 今いるステートでは呼べないが、インテントスキーマには書いてあるインテントが呼ばれたとき
  'Unhandled': function() {
    this.emit(':ask', reprompt, reprompt);
  },"AMAZON.StopIntent": function() {
    this.emit(":tell", "ストップなどと言われた時");
  },"AMAZON.CancelIntent": function() {
    this.emit(":tell", "キャンセルなどと言われた時");
  }
});
```
keras によるXOR学習結果を視覚化

よく言われることですが、単層（隠れ層なし）のパーセプトロンでは、ANDゲート や ORゲートは実装できるけど、XOR(排他的論理和)ゲートになると単層ではできず、多層（隠れ層ひとつ以上）パーセプトロンを使えば実装できるようになる、と。
#ホンマかいな？

実装できるという理論はわかるけど、それを本当に学習した例は見たことない気がする。
あと、非線形分離っていうけど、どういう非線形（境界線の形状）になるの？

#で、kerasでモデルを作って学習させててみた。

XORゲートの仕様：
・入力 [0, 0] に対して出力は 0
・入力 [1, 0] に対して出力は 1
・入力 [0, 1] に対して出力は 1
・入力 [0, 0] に対して出力は 0

隠れ層は1層、隠れ層のニューロン数は2個（それぞれバイアス有）のニューラルネットワークで学習させ、その後、予測値を2次元座標上にプロットすることにより境界線を視覚化してみた。
ソース：https://github.com/uminor/xor → xor.py

視覚化の手法は、[keras を用いた放射能汚染区域の推定] (https://qiita.com/uminor/items/aba46eacc5ef5c42366e) の応用。

#学習例1：
![out3.png](https://qiita-image-store.s3.amazonaws.com/0/216556/639918b5-0206-4bb3-f672-4200a8ea9f37.png)
（★は教師信号を視覚化したもの。●は予測値。赤は出力=1、青は出力=0、以下同様）

学習例1では非線形分離している、というのが直観的によくわかる。

しかし学習時の初期値によって？境界線の形状が変わるようだ。
#学習例2:
![out4.png](https://qiita-image-store.s3.amazonaws.com/0/216556/faf00bd0-9360-9344-e729-792e154b1ccc.png)

#学習例3：
![out2.png](https://qiita-image-store.s3.amazonaws.com/0/216556/42410ffd-4585-7d6a-da35-e740c97666d3.png)

学習例2、学習例3 はどうだろう？
確かに1本の直線で分離できているわけではないが、2本の直線で分離されてるように見える。
非線形分離というより、
**線形分離 AND 線形分離** 、あるいは、
**線形分離 OR 線形分離** 　
という風に見える。（あくまで見た感じ）

#考察
人間様が XOR の計算をする場合、例示から学んだと仮定しても、大脳の中に非線形の方程式を構築するとは考えにくい。多くの人間は、「2つの入力が同一か否か？ (否なら１)」で判断するのではないか？
その意味では、上記「学習例2」が人間様の思考に近い気がする。すなわち、左下から右上に伸びる青いドットの帯は、２つの入力が同じ値である場合のパターン、すなわち
  **「x1=x2 の直線。但し、x1 は横軸、x2 は縦軸」**
を意味し、入力値がこの範囲であれば、出力は0であると予測するのではないか？

但し、厳密には「学習例2」では帯に太さがあるので、「同じ」ではなく「大体同じくらい」を表現している。ふつうの人間様の思考であればこの「太さ」は発生しないだろう。

じつは前提に不備があり、論理演算では、当然ながら「入力は整数である1または0に限定」されるべきであろう。というわけで、入力が連続した実数であることを想定した今回のモデルは、**人間様の思考パターンから外れて当然（爆）**。
ただ非線形分離を視覚化した例、としては意味がありそう。

ついでながら、
#XORよりもうすこし意地悪な仕様
で境界線がどうなるかを実験。
モデルの形状はちょっとだけ複雑化している。
ソース参照：https://github.com/uminor/xor → complex3.py
![2-3-3-2_100000--3.png](https://qiita-image-store.s3.amazonaws.com/0/216556/0cfdf6be-6dba-ed8d-f566-fca426610eca.png)
![2-3-3-2_100000.png](https://qiita-image-store.s3.amazonaws.com/0/216556/b4a8dad1-ec64-a269-42c7-96414498164c.png)

そろそろアート入ってきたか。。

もっといぢめてみる。
![4x4_2-6-6-2_100000.png](https://qiita-image-store.s3.amazonaws.com/0/216556/56db7019-d819-87b1-bcfa-084fad41991c.png)

赤いのひとつを青くしてワザとややこしい課題に。
![4x4_2-6-6-2_100000-ijiwaru1.png](https://qiita-image-store.s3.amazonaws.com/0/216556/9a72fb59-2025-7332-e0de-52591a4714e5.png)

さらにしつこく。
![4x4_2-6-6-2_1000000-ijiwaru-super-1612sec.png](https://qiita-image-store.s3.amazonaws.com/0/216556/bfdcdf6d-4412-4b4c-ffeb-9e385cb7a445.png)
ソース：https://github.com/uminor/xor → complex4.py
（これは、じつはエポックを百万回で学習。CPU=Core i7 で30分ぐらいの所要時間）

よく、喰らいついてきた。
#・・・今日のところは、これぐらいにしておいてやろう。
モブプログラミングのやり方で私が重要だと思うこと

他のプラクティスと同じくモブプログラミングに関しても、たった1つの正しいやり方というものはないと思います。

チームの状況や目的により、やり方は変わってくるでしょう。

とはいえ、非常に重要なポイントというものも存在し、もしそれを破るなら、それ相応の理由が必要というものもあるかと思います。

今日は、1か月以上フルにモブプログラミングをしてみて、今、私が最も重要だと思っているモブプログラミングのやり方に関することを書きたいと思います。

# ドライバーをタイピストにする

通常、モブプログラミングでもキーボードを持つ人は「ドライバー」と呼ばれます。

ドライバーは運転手で、これは車の運転のメタファーです。通常は、ドライバーは自分の行きたい場所に自分で運転して行くことができます。

プログラミングでも同じく、ドライバーは自分の考えたコードを自由に入力できます。

このようなモブプログラミングのスタイルもありえるとは思いますが、もっとよい方法があります。

それが、ドライバーをタイピストにする方法です。

# タイピストは考えない

タイピストの役割はタイプするだけです。原稿は別の人が考えます。

モブプログラミングでは、ナビゲーターがどう実装するかを考えます。タイピストはナビゲーターの指示をコードに翻訳します。自分で勝手に考えてコードを書き進めてはいけません。

タイピストは、ナビゲーターの指示が理解できればコードをタイプします。理解できなければ、コードが入力できるようになるまで質問します。

# ナビゲーターが考え指示する

ナビゲーターがどう指示するかは、タイピストの理解できるレベル（スキル）によりますが、タイピストが理解できる最も高い抽象度で指示を与えることが理想です。

高い抽象度の指示が理解できなければ、より抽象度を下げて指示をします。

タイピストのスキルが低ければ、最終的に、

「x行目の上に何々を入力して…」
「y行目をコピーして、z行目の上にペーストして…」
「どこどこを選択して、ctlキーとcキーを同時に押して…」

のような指示になるかも知れません。

# 何がいいのか？

この方法だと、あるアイデアがコードになるために、必ず、他人を通す必要があります。ナビゲーターがタイピストに言葉や図などで実装方法を説明しなければなりません。

タイピストを含む他のメンバーは必ず、その説明を聞くことになります。

チーム全員のコードや設計についての理解度が向上し、レビューの質も高まります。

ドライバーが勝手にコードを書いて、他のメンバーは見ているだけ。さらに見ているだけで実はよく理解できていなかったというが、モブプログラミングでのアンチパターンです。

そのようなアンチパターンを自動的に防いでくれるのがこのスタイルです。

また、タイピストはキーボードが打てさえすれば誰でもできます。例えば、使っている言語をよく知らない人でもタイピストをすることは可能です。

# コードが実装された後

タイピストは基本的にナビゲーターの指示をコードにするだけですが、一区切りのコードが実装された後になっても、そのコードが理解できない場合は、ナビゲーターに質問する必要があります。

タイピストもモブの一部です。役割を交代すればナビゲーターになります。よく理解できずに言われたままにタイプすることもあるでしょうが、それは好ましいことではありません。

まして、コードが完成した後も理解できないままなら、モブプログラミングの意義は相当薄れます。そのような状態は放置すべきではありません。

# タイピストだけど実装したいアイデアがある

タイピストは勝手にコードを実装してはいけません。もし、こう実装すべきだというアイデアがある場合は、次の人に交代し自分はナビゲーターになります。

# まとめ

* ナビゲーターはどう実装するかをタイピストに指示する
* タイピストは考えない
* タイピストは指示をコードに翻訳する

---

[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)
この記事は[CC BY-SA 4.0（クリエイティブ・コモンズ 表示 4.0 継承 国際 ライセンス）](http://creativecommons.org/licenses/by-sa/4.0/deed.ja)の元で公開します。
【小ネタ】紛らわしいメソッド名(setScaleのせいで時間を無駄にした話。

#はじめに
数字の精度を扱うような業務に携わらないとなかなか使うことがないのがBigDecimalクラス。んで、久しぶりにいじったらとってもはまってしまい時間を無駄にした、というお話。

#関連メソッド
BigDecimal
setScale(int newScale)
setScale(int newScale, int roundingMode)
setScale(int newScale, RoundingMode roundingMode)

#プログラム仕様
処理結果を小数点以下1桁で表示する

#プログラム
    public static void main (String[] args) {
        
        BigDecimal deci = new BigDecimal("1.2345");
        
        System.out.println("deci 1:" + deci);
        
        deci.setScale(1, BigDecimal.ROUND_DOWN);
        
        System.out.println("deci 2:" + deci);
        
    }

#実行結果
deci 1:1.2345
deci 2:1.2345

#？？？
さて、この実行結果が出たことで、作業が丁寧な方は、まずJavaDoc、となるでしょうし、勘の良い方は「あぁ、、、」となるんでしょうが、私は無駄にあれこれと、、、解決までにかれこれ20分くらい時間がかかってしまいました。。。（＞＜）。なんでや？と。。。

#プログラム２
	public static void main (String[] args) {
		
		BigDecimal deci = new BigDecimal("1.2345");
		
		System.out.println("deci     1 :" + deci);
		
		deci.setScale(1, BigDecimal.ROUND_DOWN);
		
		System.out.println("deci     2 :" + deci);

		BigDecimal deciDecci = deci.setScale(1, BigDecimal.ROUND_DOWN);

		System.out.println("deciDecci  :" + deciDecci);
	}

#実行結果２
deci     1 :1.2345
deci     2 :1.2345
deciDecci  :1.2

#結論
結局、setScaleはインスタンスの内容を変更するものではなく、返り値を返すメソッドだったんですよね。。。それならせめてtoString()的な名前にして欲しかったという気もしつつ、やはり丁寧にJavaDoc一回見とけばよかったな、と。Calendarクラスとか他にもいろいろsetとかsetXXXってのあるけどもなぁ。
web上で取得されているxhr（XMLHttpRequest）の値をpythonに渡してみた(2/2)

#前回のおさらい
前回は[web上で取得されているxhr（XMLHttpRequest）の値をpythonに渡してみた(1/2)](https://qiita.com/non0/items/7f24bc1f308be9e10c21)を参照して下さい
前回は、Webでのxhrをモニターしてpythonでその値を取得してみる概略の説明と実際にWebでxhrをモニタする所まで説明しましたが、今回は実際に取得したxhrをWebSocket通信でpythonに渡す方法の説明を行っていきます。

#4 WebSocket通信をどう実装するか？
WebSocketを出来るだけ簡単に実装するには、どれがいいんだろうと色々調べてみました。今回の使用方法では簡単なデータ送信しかしないので出来るだけ簡単な方法を探した結果、WebSocketのサーバーとクライアントは以下の物を使う事にしました。

- xhrを取得するWeb側　<BR>selenium2+JavaScriptで実施。余程古いchromeでない限りサポートされているので問題ないと思います。<br>参考　[wikipedia WebSocket 4.実装状況](https://ja.wikipedia.org/wiki/WebSocket#.E5.AE.9F.E8.A3.85.E7.8A.B6.E6.B3.81)
- WebSocketサーバー <br> pythonで実装。多機能である必要もないのと、実装が楽そうなので以下を使いました。<br>[Pithikos/python-websocket-server](https://github.com/Pithikos/python-websocket-server)
- WebSocketクライアント<br>pythonで実装が楽そうなので。後イベント・ドリブン型でなくても書けそうなので(short type?)これにしてみました。<br>[websocket client for python](https://github.com/websocket-client/websocket-client)
- 今回は一つPC内で実行しているのでソケットは127.0.0.1:8089にしています。外部（ローカルネット外）と行う場合は認証とか実装した方がいいと思います。
ポートが他で使用中の場合は適宜変えてみて下さい。(psutil等で最初に起動するサーバースクリプトで未使用ポートを調べて結果をファイルなんかに書き出して他のスクリプトが参照するとか出来そうですが今回はそこまで実装していません。）

#5. 実行スクリプト
- Web側での実行スクリプトは前回3 xhrのモニタの実行スクリプトのxhr_mon.pyを使って下さい
- WebSocketサーバー

```python:server.py
from websocket_server import WebsocketServer

def new_client(client, server):
    server.send_message_to_all("Hey all, a new client has joined us")

def send_msg_allclient(client, server,message):
    server.send_message_to_all(message)

server = WebsocketServer(8089, host='127.0.0.1')
server.set_fn_new_client(new_client)
server.set_fn_message_received(send_msg_allclient)
server.run_forever()

```
- WebSocketクライアント

```python:client.py
import json
from websocket import create_connection

ws = create_connection("ws://127.0.0.1:8089/")

ask_val = [0]*6
datetime = ['0']*6
name =["","BTC","ETH","BCH","LTC","XRP"]

while(True):
    #ws.send("Hello, World")
    #time.sleep(1)
    try:
        ret =  json.loads(ws.recv())
    except:
        continue
    for nn in range(1,6):
        if(ret['data'][nn]['askValidFlag']==1):
            ask_val[nn] = ret['data'][nn]['bid']
            datetime[nn] = ret['data'][nn]['createDatetime']
        print(name[nn],datetime[nn],ask_val[nn])
```

#6. 実行方法
最初にWebSockサーバーを立ち上げます。
python -m server.py
これは終了しない＆させないので、別のターミナル等でxhrのモニターを立ち上げます。
python -m xhr_mon.py
これも終了しない＆させないので、別のターミナル等でWebClientを立ち上げます
python -m client.py
すると以下のような結果が延々と出て来くると成功です。

---
BTC 2017-12-10T06:59:29Z 1621631
ETH 2017-12-10T06:59:29Z 50844
BCH 2017-12-10T06:59:29Z 150615
LTC 2017-12-10T06:59:29Z 16139
XRP 2017-12-10T06:59:29Z 26.579
BTC 2017-12-10T06:59:29Z 1621631
ETH 2017-12-10T06:59:29Z 50844
BCH 2017-12-10T06:59:29Z 150615
LTC 2017-12-10T06:59:29Z 16139
XRP 2017-12-10T06:59:29Z 26.579
BTC 2017-12-10T06:59:31Z 1621882
ETH 2017-12-10T06:59:31Z 50853
BCH 2017-12-10T06:59:31Z 150642
LTC 2017-12-10T06:59:31Z 16142
XRP 2017-12-10T06:59:31Z 26.588

---

#最後に
XHRでリアルタイムにデータを受けているWebページのデータを比較的簡単にpython側で得る事が出来ました。また今回の方法はxhrで通信しているwebページでそのまま使えそうな気がしています。<br>
株式や先物等のデータは送受信した時のデータなので、全部の取引データではない事を考慮した方がいいと思います。大きく値が動いたかどうか等の監視用とかには使えるかなと思っています。
パラレルクエリによる PostGIS 高速化の検討


[FOSS4G Advent Calendar 2017](https://qiita.com/advent-calendar/2017/foss4g) の 12/10 の記事です。
勉強もかねて、勇気をだして参加してみたものの、本記事はうまく行かなかったという内容になりました。ご了承願います… _(._.)_

PostgreSQL 9.6 から、パラレルクエリという機能が使えるようになったようです。通常は、ひとつの CPU のみのところ、複数の CPU を使用するので速いと思われます。
PostgreSQL 9.6.6, PostGIS 2.3.2 で試しました。

# パラレルクエリの有効化
初期設定では、パラレルクエリを使わない設定になっているので、有効化します。postgresql.conf という設定ファイルの

```postgresql.conf
max_parallel_workers_per_gather = 0
```
の値を1以上にします。手元のマシンはCPUのプロセッサ数が8こあるので、8にしたいと思います。 
postresql.conf を書き換えたくない場合は、

```sql
SET max_parallel_workers_per_gather = 8;
```

の SQL を実行するだけでも大丈夫です。

# さっそく使ってみる
## COUNT
まずは、普通の集計関数を使ってみます。

```sql
SELECT COUNT(*) FROM table_a;
  count   
----------
 34620352
(1 row)
```

3.5sec -> 1.0secs

1/3以下の時間に短縮されました:sparkles:

## ST_Area

次に面積を計測する ST_Area を使ってみます。

```
SELECT ST_Area(geom) AS area FROM porigon_table_a;
```

01:27 minutes -> 01:27 minutes
あれ？ 変わらないですね。

実行したい SQL の前に EXPLAIN をつけると、問い合わせ計画というものが見られるので、これで確認してみます。

```sql
EXPLAIN SELECT ST_Area(geom) FROM porigon_table_a;

                         QUERY PLAN                          
-------------------------------------------------------------
 Seq Scan on porigon_table_a  (cost=0.00..355507.09 rows=2264031 width=8)
```

これは、パラレル使用の設定にしているのに、パラレルが使われていないようです。
ちなみに、ひとつ目のクエリでパラレルが使われた例の場合の EXPLAIN は以下のようになります。

```sql
                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
 Finalize Aggregate  (cost=1686681.79..1686681.80 rows=1 width=8)
   ->  Gather  (cost=1686681.06..1686681.77 rows=7 width=8)
         Workers Planned: 7
         ->  Partial Aggregate  (cost=1685681.06..1685681.07 rows=1 width=8)
               ->  Parallel Seq Scan on table_a  (cost=0.00..1673316.65 rows=4945765 width=0)
```

パラレルが使われるかどうかは、プランナーがコストを推定して判断するらしいです。とりあえず使ってみて欲しい場合は、以下のようにします。

```sql
SET parallel_setup_cost = 0
SET parallel_tuple_cost = 0
```

それでもう一度実行してみると…、パラレルは使われましたが、処理時間は変わりませんでした。

```sql
EXPLAIN SELECT ST_Area(geom) FROM porigon_table_a;
                                           QUERY PLAN                                            
-------------------------------------------------------------------------------------------------
Gather  (cost=0.00..337097.04 rows=2281164 width=8)"
  Workers Planned: 6"
  ->  Parallel Seq Scan on porigon_table_a  (cost=0.00..289572.79 rows=380194 width=8)"

SELECT ST_Area(geom) FROM porigon_table_a;
```

01:27 ms -> 01:27 ms

また、ST_Intersects も試しましたが、同様に変わらなかったです。

# 結論

このバージョン（PostgreSQL 9.6.6, PostGIS 2.3.2）では パラレルクエリはPostGIS に適さないみたいです。
[ポールラムジーさんが PostgreSQL 10、PostGIS 2.4 で空間関数のコストを調整しながらやっているので]
(http://blog.cleverelephant.ca/2017/10/parallel-postgis-2.html)、今度は 10 で試したいと思います（昨日リリースなので今回はちょっと入れ替えが間に合いませんでした、すみません:droplet:）。
やTN1（やっぱりTrelloがNo.1）

AdventCalendar、解散カレンダー十日目です。
マジでこんな事してる時間が無いですハハハ。

今回も進捗管理についてのお話

タスク管理って大事ですよね、誰がどれやって何時までにやるのかをしっかりと決めなくてはいけません(守れるとは言ってない)
でもプロジェクトが肥大化すると管理だけで大変！！
そんな面倒な事についてのお話。

# **以前は・・・**
私は最初はグーグルスプレッドシートでタスクの管理をしていました
結果はもはやタスク管理の意味を成していないようなものでした、
確認漏れは起こる、伝達は遅い、そもそも見ない輩が出てくる
もう限界を通り越して崩壊していました。
そんな中私はすばらしいものを知ったのです。

# **Trelloって知ってるかい？**
タスク管理ツールでメッチャ便利なものそれがTrelloです。
何が凄いってまずSlack、GitHub、Salesforceなどの外部サービス連携機能ができます。
これによってTrelloに変更がかかると通知をSlackに飛ばしたりなど情報の伝達がリアルタイムになります、これで見てなかったなんて言い訳は通用しません。

そしてなにより使いやすさが抜群です。
マウスによるドラックアンドドロップでリストの移動が出来るし追加、修正もボタン一つです。
あと日本語化されてるのもいいです。

# **終わりに**
**わざわざ変な物作って崩壊するよりこの世に存在する素晴らしいツールを使おう(提案)**

もはや文章になっているかも怪しいが今回はここまで( ◔ ౪ ◔)
PowerShell の既定の配色がキツ過ぎたので変えてみた

SourceTree for Windows があまりにももっさりしているので、「git はもうコマンドでやろう！」と思い、Git for Windows を入れたら一緒に入ってた Git Shell というものを使うことにしました。

どうもこれは PowerShell らしく、まあ便利に使うことができていましたが、ところどころ配色がおかしくて、場合によっては全然読めない！

例えば ``git status`` の内容が、こんな風に、全然読めません :sweat:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8227/cf3a0bcf-9dba-317e-94ca-8d7af678bbe3.png)

Twitter でポツリと呟いておりましたら、詳しい方から教えていただけました（毎度のことながら皆さまありがとうございます）。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">色設定の実態はレジストリに保存されていて、WindowsのGUIからアクセスする場合はpowershellウィンドウのタイトルバーを右クリックしてプロパティを表示して……ってやるんですけど、とにかく面倒です。</p>&mdash; Kentaro Inomata (@matarillo) <a href="https://twitter.com/matarillo/status/939359788911050752?ref_src=twsrc%5Etfw">2017年12月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/search?q=%24host.UI&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$host.UI</a>.RawUI にフォアグラウンド、バックグラウンドの色が、$host.privatedata <br>にエラー等の特別な場合の色の設定があります。例えば、$host.UI.RawUI.BackgroundColor=&quot;Black&quot; とすると背景が黒になります。</p>&mdash; Takekazu Omi (@takekazuomi) <a href="https://twitter.com/takekazuomi/status/939358803664912384?ref_src=twsrc%5Etfw">2017年12月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

教えていただいた情報から、最終的に、

* [neilpa/cmd-colors-solarized: Solarized color settings for Windows command prompt](https://github.com/neilpa/cmd-colors-solarized)

というサイトにたどり着きました。[^1]

[^1]: これは [SOLARIZED](http://ethanschoonover.com/solarized) という、「いろいろなエディタで配色を統一しよう？」というサイトの Windows 向け Fork のようです。

ここにある ``solarized-dark.reg`` というファイルを実行してレジストリを書き換えたら、PowerShell の配色をイイ感じに(solarized)してくれるというもののようです。

実行してみたら、配色がこう↓なりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8227/aab3e2db-ddc7-db1f-308b-dbc9e9fb2ec6.png)

まあまあ見やすい配色になったので満足です。
次に Windows をクリーンインストールしたときにまた忘れずに導入するよう、ここに :pencil: っておきます。