OmniAICreator/Qiita-1.07M huggingface dataset:
GuardでAndroidのUnitTestを自動実行する


# 目的
Androidプロジェクトで、UnitTestを書いているものの実行は手動でしているため、
うっかり忘れてPushしてCIからの失敗通知で修正するパターンがよくある。
そのため、UnitTestを自動で実行してくれるようにした

#Guardとは
ファイルやディレクトリの変更を検知して、任意のタスクを実行させることができるRubyのライブラリ

 - https://github.com/guard/guard

今回はGradleのタスクを実行できるguard-graldeを使う

 - https://github.com/bricker/guard-gradle

# 導入手順
ほとんどguard-gradleのreadmeと同じ手順
※RubyとBundlerが導入されている前提
※導入していない場合はreadmeにあるinstaller.shを実行する方法で4.まで飛ばせるかもしれない（未検証）

プロジェクト構成
　├ .gralde/
　├ .idea/
　├ app/
　├ build.gradle
　├ Gemfile # 今回追加ファイル
　├ Guardfile # 今回追加ファイル
　└ local.properties

1. プロジェクト直下にGemfileを作成して、記述する

    ``` ruby:Gemfile
    source 'https://rubygems.org'
    gem 'guard-gradle'
    ```

2. Guardのインストールを実行する

    ```
    bundle install
    ```

3. Guardfileを生成するコマンドを実行する

    ```
    bundle exec guard init gradle
    ```

4. Guardfileの記述を変更する
 - 対象ファイルのディレクトリにappと追加するだけ

    ``` ruby:Guardfile(変更前)
    guard :gradle do
      watch(%r{^src/main/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] }
      watch(%r{^src/test/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] }
      watch('build.gradle')
    end
    ```

    ``` ruby:Guardfile(変更後)
    guard :gradle do
      watch(%r{^app/src/main/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] }
      watch(%r{^app/src/test/(.+)\.*$}) { |m| m[1].split('.')[0].split('/')[-1] }
      watch('build.gradle')
    end
    ```

5. Guardを実行する

    ```
    bundle exec guard
    ```
6. ソースコードを変更すると、自動で``` ./gradlew test ```が走る

# Gradleのコマンドを変えたい時
デフォルトでは``` ./gradlew test```が走る。
特定のfloverやbuildTypeのみ実行したい場合等、カスタム設定をしたい場合はGuardfileを変更する

``` ruby:Guardfile(./gradlew&nbsp;testを実行)
guard :gradle do
...
```

``` ruby:Guardfile(./gradlew&nbsp;testDebugUnitTest&nbsp;--offlineを実行)
guard :gradle, task: 'testDebugUnitTest', flags: '--offline' do
...
```
# デスクトップ通知をしたい場合
[ここ](https://github.com/guard/guard/wiki/System-notifications)にGuardがサポートしている通知ライブラリが書かれているので、よしなに追加する
自分はTerminal Notifierを導入していたので、Gemfileに以下の記述を追加した

``` ruby:Gemfile
gem 'terminal-notifier-guard' 
```
PWAやってみるメモ - 2 サンプルと情報集積

有力そうな情報をまとめておく。

# サンプル系

サンプルコードで学ぶPWA
https://qiita.com/radiocat/items/034904a094d07c389a4f

ServiceWorkerとCache APIを使ってオフラインでも動くWebアプリを作る
https://qiita.com/horo/items/175c8fd7513138308930

Progressive Web Appを作ってみる
https://qiita.com/kawakami-kazuyoshi/items/551f23ecee6c3d396c2a

Web Starter Kit
https://developers.google.com/web/tools/starter-kit/

# プッシュ通知

[改訂版] Web Pushでブラウザにプッシュ通知を送ってみる
https://qiita.com/tomoyukilabs/items/2ae4a0f708a1af75f13e

# Firebase

Firebaseの始め方
https://qiita.com/kohashi/items/43ea22f61ade45972881





# 現在の状態
* いろいろ調べたがやっぱりお試しなら Firebase がよさそう。なにせ全部入りだ！  
(Glitchというのがよいらしいと聞いていろいろ調べていたが、コンテナ生存時間とかの関係でプッシュ通知とかできないっぽいので回避。そりゃそうだよな) 
* PWA はいろいろ必要なものがある (といっても要するに Service Worker が要るとかそういう話) 。イチから作るとしんどいが、そこは Google 大先生がスターターキットを準備してくれている。さあ、NodeとGulpを用意してスターターキットを貰ってこよう！  
(なおNodeは結構いじってたーのしー！したがGulpはよくわかってない模様。まあタスクランナーなんじゃろ？)
VivadoのエディタをVisual Studio Codeにする

- Vivado上のメニューバー -> Tools -> Settingsで設定画面を開く
- Text Editorを選択し、Current Editorを「Custom Editor」に変更して「...」をクリックする
- 起動オプションを以下のように設定する

```
C:/Program Files (x86)/Microsoft VS Code/Code.exe [file name]:[line number] -g
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214268/9791f2ff-8376-f1dc-72f9-9a5a853efa0d.png)

VSCodeのインストール先が異なる場合は、適切に変更してください。 
サクラエディタやSublime Textも起動オプションを適切に設定することで指定できると思います。起動オプションは各ツールのマニュアルをご確認ください。
IntelliJ IDEA組み込みのmavenのsettings.xmlを編集する

IntelliJ IDEAには最初からmavenが組み込まれていて、特に指定しなければそちらが使われます。

Proxy経由でないとアクセスできないリポジトリが使いたくて、settings.xmlを書き換えようとしたのですが、どこにあるかわからなかったのでメモ。

# 結論
さっさと結論を述べてしまうと、settings.xmlは以下のディレクトリにあります。(環境はmacOS 10.13.2/IntelliJ IDEA 2017.3.2 (Ultimate Edition))

- maven3のsettings.xml: `/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/conf/settings.xml`
- maven2のsettings.xml: `/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven2/conf/settings.xml`

こちらにありました。

# ちなみに
ちなみにProxyの設定であれば、以下のような方法もあるようです。

[intellij で maven のプロキシを設定する - Qiita](https://qiita.com/sugiyasu-qr/items/247f820aefff74ba8082)

この方法を使うと、プロジェクトに対して設定できるので、常にProxyが必要な環境とかでもない限りはこちらの方が都合がいいのかもしれませんね。

settings.xmlのProxy設定は以下参照。

[社内でMaven実行時、外部のMavenリポジトリサーバーからダウンロードができない時の対処方法 - Qiita](https://qiita.com/nikuyoshi/items/567f78e07e5733907491)
Why did I feel that "Mapper is Evil" ?

**Mapper** というものが何度見ても邪悪にしか思えなかったので、なぜ邪悪と感じたのか考えてみる。[^1]

# 結論
* それそのものは邪悪ではないが、邪悪な……単純にアホな？使われ方ばかり見るせいだろう。 Mapper が邪悪というよりは馬鹿が雑な使い方をしていると言うべきかもしれない。

# 何が邪悪か？

## 邪悪でない用法
* 「あるオブジェクトのメソッドとしての」コピー実装の省略。

たとえば変換系のメソッド (toString のようなもの) あたりには有効かもしれない。
(もっとも、コピーの実装を省略したくなるようなクソめんどくさいクラスを書くなと言いたくなるが……)

## 邪悪な用法
* 単純なコピー・ユーティリティとしての利用。

xxxServiceImpl だの xxxLogic だのの中で Mapper を呼んでいるものは概ね処刑されるべきである。

# 何故邪悪か？

## Mapper はプロパティの型と名前[^1]を基準に情報をコピーするものである。
コピーに問題が起こらないことを保証するためには、コピー元/先の属性のうち、少なくともそのコピー操作で**コピーしたいものにズレがないことを保証しなければならない**。

言うまでもなくこれはインターフェイスの領分であろう (親クラスでも可能だが、インターフェイスがあるならそちらのほうが望ましいはずだ) 。
少なくともxxxServiceだのxxxLogicだのが担当すべきことではない。**コピーはロジックではない[^2]。**ロジックでないものをロジックを書くべき場所に書いてどうするというのだろう。

## 馬鹿が増える
Mapperそのものの罪でもないのにひどい言い草だが、**「Mapperでコピーできるんだから」と考えなしにオレオレモデル[^4]を量産する馬鹿が出るのだ。**たくさん。ほんとにやめてほしい。
半年ほど前、誰もが知っているようなサービスの新・裏方部分の使用する新API が、えらくあっさりとOOM を起こすことがわかって調査・改修に当たったことがある。

**原因の半分は無駄なオレオレモデルとそのコピーだった**。
実際、**無駄なオレオレモデル群を抹殺して Mapper を外しただけでヒープ消費は半減、動作速度は3割増になった**。ここまで2日である。

……もしMapperがなかったら、さすがの馬鹿もここまで面倒なことはしなかったのではなかろうか？
(もっとも、ここらへんのコードを設計したのは某SIのExcel屋どもの疑いが濃厚で、実際に書いた馬鹿はMyBatisのマッピング機能を全く使わずループで埋めるようなアホタレだったので変わらんかもしれないが……結局このあたりの解決には半年近くを要している)

# なにが必要なのか？
Mapperの使用ガイドラインのようなものは必要だろう。

だがそれ以上に、**オブジェクト指向 (特にJavaならインターフェイス指向) を頭蓋骨こじ開けてでも叩き込まなければ状況は改善しない**気がしている。

[^1]: なお、ここでいう Mapper というものは Dozer のような「名称で判断して**自動で**突っ込む」もののことを指すものとする。 ……要するに Mapper は Mapper でも MyBatis の Mapper XML は許す。
[^2]: シグネチャ、というとメソッドのアレになるので正確でない気がしてこう書いている。しかし、JavaBeansで使うものだと考えると getter/setter のシグネチャに従っていると考えてもよいかもしれない……オーバーロードされてたりするとすぐおかしくなるのは困りどころ。
[^3]: ここでいうロジックとは「サービスクラスだのロジッククラスだのに本来記述されるべき操作群」のこと。なお、同じようなことがバリデーションにも言える気がしているが割愛する。
[^4]: 説明するまでもない気もするが、もちろん真っ当なモデルではない。インスタンス変数並べて getter/setter を自動生成、その Javadoc には「XXXを取得する」とだけ書いてあるようなクソモデルのことである。
工数だけ入力するガントもどきでタスク管理を楽にする

![がんもどき](https://qiita-image-store.s3.amazonaws.com/0/17941/31728d4c-525b-a147-a79b-56eebbb903e1.png)
複数のプロジェクトを同時に抱え、毎日要件が追加・変更されると、**「このタスクを差し込むと他のタスクにどんな影響が出ます？」**と聞かれてもすぐに答えられないという問題を抱えることがあると思います。
僕が今そんな感じです。
こんな時[Microsoft Project](https://www.microsoft.com/ja-jp/project/)等にある**「担当者と工数が決まれば後は良い感じにタイムラインを生成してくれる機能」**の気軽に使えるやつがあれば良いのですが、無料ガントチャート系ツールやイシュー管理ツールのプラグインを見てもそれっぽいものは見つかりませんでした。
そこでGoogle Spreadsheetを使ってそんな感じのを作ってみました。

## デモ

![1_2.gif](https://qiita-image-store.s3.amazonaws.com/0/17941/f3539a7b-7c33-9fa4-3bb7-68b9510c3a59.gif)


こんな風にタスクと工数だけ書いて優先度順に並び替えれば、その都度ガントチャートが自動生成されます。

また「締切日」を入力しておくと、新しいタスクを差し込んだ結果、**既存のタスクが締め切りをオーバー**することがわかります(赤字で警告)。
![2_2.gif](https://qiita-image-store.s3.amazonaws.com/0/17941/7addf8cf-dda1-93a7-3a27-86db605aaae2.gif)

#### よくあるガントチャートとの違い
* 「担当者」欄はありません
 - 複数人で使う場合、シート（またはドキュメント）ごとに担当者を分けて下さい
* 「クリティカルパス」欄もありません
 - 基本的には上から順に実行されるので、ある意味上にある行がクリティカルパス・先行タスクです
* 開始日、終了日は優先度に準じて自動計算されるので入力しなくていいです
* ツリー構造になってません（なので"もどき"です）

# 使いみち

* タスクと優先度が毎日追加・変更されるような環境で、個人のタスク管理に
* 読みたい本や個人プロジェクトなど、プライベートな時間の管理に

# 使うには
[ガントもどき](https://docs.google.com/spreadsheets/d/1kta-YX_rnx0yVB_B_-9yr6qLQBWJEopLG_HZq5G7UjM/edit?usp=sharing)

こちらからドキュメントをコピーして好きに使って下さい。
詳しくは中の「使い方」というシートにいろいろ書いてあります。

### プライベート用に使う時は
「設定」シートで曜日ごとに使える時間を設定できます。
このように平日は3時間、土日祝日は14時間とか自由時間を設定すればプライベート用になります。
「平日は帰って寝るだけ」な人は平日0時間にすればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17941/31ff9777-c332-7ac8-6675-56555640798c.png)

↑こうするとこうなる↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17941/e1c2ab6d-4972-99b2-6e3c-84283ee77a8d.png)

### 曜日ごとに繰り返す予定を入れる
たとえば僕は「毎週月曜日は風呂でジャンプを2時間読む」と決めてますが、それはこんな風に記入すると毎週月曜に2時間確保されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17941/f4b80351-0c1c-0e4a-9190-d1bc63cc8144.png)

* 「曜日」はそのタスクを実行する曜日です。複数の曜日も指定可能です（e.g."月木"）
* 「上限/日」はそのタスクを実行する1日当たりの上限です
* 「見積もり」はカレンダー内で完了しない大きさにしておきます
* 最優先タスクなので一番上の行に置きます

### 特定の日付以降に発生するタスクを入れる
たとえば「3/29に発売するゲームを1日2時間やるぞ。クリアまでたぶん50時間かかるぞ」という予定はこうすると、2時間 * 25日が優先度に応じて3/29以降に確保されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/17941/d39bf966-d592-d2c5-1898-15313b6cb506.png)

### 予定通りいかなかった時は
「実工数」的な欄は無いので、ガントチャート部分に直接実行数を書いたり見積もりを編集してください。タイムラインが再生成されます。
![3.gif](https://qiita-image-store.s3.amazonaws.com/0/17941/120149e9-190b-70e2-695f-902336eebc45.gif)

###単位をhour(時)からday(日)にしたい
* 「設定」シートの「曜日ごとの稼働時間」を、稼働日は1、それ以外は0にする
* 「見積もり」をday単位で行う

# その他色々
<img src="https://qiita-image-store.s3.amazonaws.com/0/17941/31728d4c-525b-a147-a79b-56eebbb903e1.png" width=100>

* ご興味あれば中の「使い方」シートを見てみて下さい
* メンテすることはないので、よしなにいじって使って下さい
最近愛用している Firefox アドオン 5 種類

#19/03/31追記
Youtube High definition アドオンではたまに思い通りの画質設定にならないことがあって、いまは、Youtube の画質のデフォルト値を低く設定するために、Enhancer for YouTube を使っています。

広告とかスクリプト読み込みブロック用に、uBlock Origin も追加しました。色々な広告や大きな画像を読み込むせいで時間がかかる Web サイトで効果発揮します。
(2020/5/3 追記)上記2つのアドオンについて、[ネットワーク通信量をできるだけ減らす（ブラウザ編）](https://qiita.com/strysd/items/a10bfbe135f9a718c408) でも紹介しました。

#以降、2018/01/08のオリジナル投稿

Firefox の Version が 57 にあがってから、レガシーなアドオンが使えなくなってしまいました。いろいろ試してみた結果、下記の５つを使用することで落ち着きました。

##画像データの読み込み上限を設定
Tunable Image Block アドオン。

Firefox の Version が 57 にあがって一番困ったのは、QuickJava が使用できなくなったこと。なぜかというと自宅のネットワーク回線 (ADSL) を使いこなすために、QuickJava で画像の読み込みなどを適宜 ON/OFF していたわけなのですよ。（光回線へ変えたらいいんじゃない？という声が聞こえてきそうではありますが）

このアドオンでは、画像データの読み込み上限を設定でき、制限の ON/OFF もワンクリックでできます。デフォルトでは 30バイトに設定されていますが、小さなアイコンとかはそのまま表示できるように私は2Kバイトに変えて使ってます。サイズのでかい画像は、元の画像作成方法により、上部の一部だけが表示されたり、解像度の粗い画像になったりします。画像全体を表示する必要があれば、制限をOFF にしてページを再読込すればよい、と割り切って使っています。

ついでですが、その他の画像読み込みブロックアドオンも試してみましたが、すべての画像を OFF にすると、ボタンのアイコンすら表示されなくてこまる、という場合もあります。QuickJava を使用していたときも感じていたデメリットなのですが、今回みつけた Tunable Image Block アドオンで解決できるようになりました。

##Youtube の画質のデフォルト値を低く設定
Youtube High definition アドオン。

このアドオンでは、Youtube の画質のデフォルト値を決めることができます。2013 年に購入して使っていた 小型の PC (Windows 7 Home Premium, Lenovo M72e Tiny) だと、デフォルトが 240p だったので回線速度による問題はそんなに感じませんでした。しかし、Ubuntu 17.10 へ入れ替えてみたら、デフォルトが 360p になってしまい動画再生が寸断されるようになってしまいます。

いちいち手で 240p や 144p へ変更するのも手間なので、この Youtube High definition アドオンを使うことに決めました。Video Quality という選択肢で Tiny を選ぶとデフォルトの画質が 144p になります。画質を上げて再生したければ自分の手で変更してしばらく再生止めておいてデータ読み込ませておいてから再生すればいいのさ！

##ブックマーク整理
- OS 入れ替えにともない、Firefox のブックマークの移行作業も必要になりますが、ブックマーク整理には下記の２つが役立ちました。
    - Bookmark Dupes アドオン。ブックマークの中から、同一の URL、類似の URL を検出して整理したい場合に役立ちます。空になったブックマーク・フォルダーも簡単に一括削除できます。 
    - Auto-sort Bookmarks アドオン。ページタイトル、URL、ブックマーク追加日などのなかから２種類を組み合わせてソートできます。（フォルダーのソート順序の指定は１種類まで）

##文字をいつも濃く表示する
- 最近仕事で Node-RED 上でプログラムを書く機会があったのですが、コードの色分けにより文字が薄い色で表示されたりして見づらい場合ってありませんか？
    - Font Contrust Fix アドオンを使うと、黒い色で文字を表示してくれます。仕事で使ってこれは便利、と思っているので自宅の PC にもいれてみました。（色分けの恩恵を受けられないデメリットはありますが）

以上最近愛用のアドオン紹介でした
JobSchedulerのREST-APIを使ってみる - JavaのRestClient実装 -

JobSchedulerのREST-APIを使ってみる - JavaのRestClient実装 -


##1.JobSchedulerのREST-API向けのClient本体のソースです。

/tmp/kaeru/RestClient.java というソースファイル名で保存します。

### 詳細手順はこちらの記事をご確認ください。

https://qiita.com/yatabekaeru/items/1eda657e5a24189fbcdf


### Client本体を実際使用する場合のサンプルコードはこちらをご確認ください

https://qiita.com/yatabekaeru/items/06e7d40a12935f107458


### /tmp/kaeru/RestClient.java

```
package kaeru;

import java.net.URI;
import java.net.URISyntaxException;
import javax.ws.rs.HttpMethod;
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientRequest;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;

/**
 * RESTリクエストを行うためのクライアントクラス
 *
 */
public class RestClient extends Client {

    private String account  = null;
    private String password = null;

    //Basic認証用のアカウントとパスワード
    public RestClient(String account, String password) {
        this.account  = account;
        this.password = password;
    }

    //アカウントとパスワード設定時はBasicAuthFilterを付加してClient生成
    private Client getClient() {
        //Client生成
        Client client = new Client();
        //アカウントとパスワード設定時
        if( this.account != null && this.password != null ){
            client.addFilter( new HTTPBasicAuthFilter( this.account, this.password ) );
        }
        return client;
    }


    /**
     * Send Post Request to RESTful Web Service.
     *
     */
        private <E> String sendRequestQuery( String uri, E entity, String method,
                        MediaType type, String hkey ) {

        Client client = getClient();
        ClientRequest.Builder builder = ClientRequest.create();

        try {

            builder.type(type).entity(entity);

            //AccessTokenが設定されている場合はヘッダフィールドに追加
            if ( hkey != null ){
                builder.header( "access_token", hkey );
            }

            //リクエスト生成
            ClientRequest  request  = builder.build( new URI( uri ), method );

            //レスポンス取得
            ClientResponse response = client.handle( request );

            switch (response.getStatus()) {
            case 200:   // OK
            case 201:   // CREATED
                return response.getEntity( String.class );

            default:    // OK, CREATED 以外
                String error = response.getEntity( String.class );
                throw new RuntimeException( error );
            }
        } catch (URISyntaxException e) {
                e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }

    /**
     * Send POST method.
     *
     */
    public <E> String post( String uri, E entity, MediaType type, String hkey ) {
        return sendRequestQuery( uri, entity, HttpMethod.POST, type, hkey );
    }
}


```
連立方程式をJuliaで

# 本日は

ピポット選択つきのガウス消去法を用いた連立方程式を解いてみるのJulia版です．

[C言語による数値計算入門](https://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E5%85%A5%E9%96%80%E2%80%95%E8%A7%A3%E6%B3%95%E3%83%BB%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-UNIX-Information-Science-%E7%9A%86%E6%9C%AC/dp/4781911145/ref=sr_1_1?ie=UTF8&qid=1515374723&sr=8-1&keywords=c%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8B%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E5%85%A5%E9%96%80)

で勉強していたPythonのコードをJuliaに書き換えたものになります．

# 実装例(Julia)

```julia

#solve linear equation

#Example1
a=float([0 4 5 2
         1 0 2 -6;
         4 1 0 -2;
         1 7 1 0])::Array{Float64,2}
b=float([9,-3, 1, -3])::Array{Float64,1}
x=float([0, 0, 0, 0])::Array{Float64,1}

function main(a,b,x)
    ori_a=a
    a=hcat(a,b)
    row,col=size(a)
    for j in 1:row
        #search pivot
        maxidx=j-1+indmax(abs.(a[j:end,j]))
        #swap
        a[j,:],a[maxidx,:]=a[maxidx,:],a[j,:]
        #push foward
        for i in j+1:row
            p=-a[i,j]/a[j,j]
            a[i,:]+=p*a[j,:]
        end
    end
    #back foward
    for i in row:-1:1
        x[i]=(a[i,col]-dot(a[i,i+1:row],x[i+1:row]))/a[i,i]
    end
    println("answer=",x)
    println("check ax-b=",ori_a*x-b)
end 

main(a,b,x)
```

# Python版

```python3

import numpy as np

# Example1
a = np.matrix([[0, 4, 5, 2],
               [1, 0, 2, -6],
               [4, 1, 0, -2],
               [1, 7, 1, 0]], dtype='float64')
b = np.matrix([9, -3, 1, -3], dtype='float64').T
x = np.matrix([None]*4, dtype='float64').T

# for check sum
ori_a = a
# define extended coefficient matrix of eq ax=b
a = np.concatenate([a, b], axis=1)
(row, col) = a.shape
for j in range(row):
    # search pivot
    max_idx = j+np.argmax(abs(a[j:, j]))
    # swap!
    a[[j, max_idx]] = a[[max_idx, j]]
    # push forward
    for i in range(j+1, row):
        p = -a[i, j] / a[j, j]
        a[i] += p*a[j]
print('extended coefficient matrix applied gauss method \n a={}'.format(a))
# back forward
for i in range(row)[::-1]:
    x[i] = (a[i, -1]-np.dot(a[i, i+1:row], x[i+1:row]))/a[i, i]
print('x={}'.format(x))
# confirm
print("ax-b\n={}".format(ori_a@x-b))
```

すでに `from numpy import *` をしている状態でさぁコードを書いていきましょうという雰囲気で書けるんだなと感じました．型指定がめんどうですけれどね・・・．( 一一)
【Jenkins】node/npmを使えるようにする

#これを書いたきっかけ
Jenkinsサーバ(コンテナ)でreactのファイルのビルドをしたかったためJenkinsサーバにnodeをいれないとなぁ、となったことが書いたきっかけ。
しかし、Jenkinsには**マスタ/スレーブ**という機能があり、Jenkinsコンテナからreactコンテナへビルドを命令することができるらしいので、Jenkinsサーバにnodeを入れるよりもマスタ/スレーブの利用を検討した方が良いと思う。

#Jenkinsレポジトリを使えるようにする
詳細はここでは割愛するので以下を参考にしてください。
やることは、公式の[Jenkinsレポジトリ](https://github.com/jenkinsci/docker)をcloneしてくる。
```git clone https://github.com/jenkinsci/docker.git
```
>【Jenkins】さくっと動かしてみる
https://qiita.com/onceupon05/items/4495a887d8216a8270ae

#Dockerファイルへ追記
Dockerファイルに追記することでnodeを使えるようにします。
3行目くらいにapt-getなんとか系のコマンドを実行している部分があるので、そこでvim,sudo,apt-utils,nodeを入れるように書き換えます。
vimは使わない場合は入れなくても良いです。
sudo,curl,nodejsはnodeを入れる際に必要です。
また、
apt-utilsはどこで必要になるかはわかりませんがエラーメッセージが出たのでいれました。なくてもJenkins自体は起動しました。

```
RUN apt-get update
RUN apt-get install -y git curl vim sudo apt-utils
RUN curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
RUN apt-get install -y nodejs
RUN rm -rf /var/lib/apt/lists/*
```

これでビルドすればOK。

```
docker-compose up -d --build
```

コンテナに入って、

```
docker exec -it docker_master_1 /bin/bash
```

nodeのバージョンを確認すると、

```
node --version
> v8.9.4
```

入ってますね。

#参考文献
【nodeを入れるためのコマンド】
http://atomiyama.com/linux/page/debian-9-2-node-npm/
giftsbag レザーバッグoem中国生産

お洒落な合皮　レザーバッグoem　中国生産
http://www.giftsbag.jp/products/
革が馴染んでくれる様にあえて厚革のソフトレザーを使用、中に走るファスナーで筆記用具が傷つかないようにするため、エンド部分を革でくるんでいます 。
テーマ：、合皮、ファスナー付き、オリジナルペンケース、OEM中国生産 ,ペンだけではなく、デスクワークに必要なステーショナリーもたっぷり収納できます。端から端までファスナーが取り付けられおり、がバット中身が見やすいことも魅力の一つで。
http://www.giftsbag.jp/eco-bag/
oem エコバッグ　デスクワークを楽しまれる逸品です .外観以上の収納力、デスクまわりをすっきりさせて定番ペンケースoem製作です、安定感のある三角フォルムをふっくらとした手馴染みのよいソフトレザーで仕上げました .革が馴染んでくれる様にあえて厚革のソフトレザーを使用、中に走るファスナーで筆記用具が傷つかないようにするため、エンド部分を革でくるんでいます。
http://www.giftsbag.jp/coin-purse-wallet/
 小銭入れ OEM　見た目以上の収納力、デスクまわりをすっきりさせて定番オリジナルペンケースです、安定感のある三角フォルムをふっくらとした手馴染みのよいソフトレザーで仕上げました 。ペンのみならず。デスクワークに必要なステーショナリーもたっぷり収納できます。端から端までファスナーが取り付けられおり、トートバッグ oem   http://www.giftsbag.jp/tote-bag/　   がバット中身が見やすいことも魅力の一つで。デスクワークを楽しさせる逸品です小銭入れ 収納巾着袋 。

お問い合わせ：　メールアドレス：  sales01@eigenchina.com
kerasを使わないでsinを回帰

#概要
kerasを使わないでsinを回帰

#写真
![sin11.png](https://qiita-image-store.s3.amazonaws.com/0/18104/b9e89bb6-237b-144b-2f81-97d834d3e90b.png)


#サンプルコード

```
import numpy as np
import matplotlib.pyplot as plt

def tanh(x):
	return np.tanh(x)

def dtanh(x):
	return 1.0 - x ** 2

class TLP:
	def __init__(self, Input, Hidden, Output):
		self.Input = Input + 1
		self.Hidden = Hidden + 1
		self.Output = Output
		self.W1 = np.random.uniform(-1.0, 1.0, (self.Hidden, self.Input))
		self.W2 = np.random.uniform(-1.0, 1.0, (self.Output, self.Hidden))
	def fit(self, X, t, learning_rate = 0.1, epochs = 10000):
		X = np.hstack([np.ones([X.shape[0], 1]), X])
		t = np.array(t)
		for k in range(epochs):
			i = np.random.randint(X.shape[0])
			x = X[i]
			z = tanh(np.dot(self.W1, x))
			y = tanh(np.dot(self.W2, z))
			bias2 = y - t[i]
			if k % 1000 == 0:
				print (k, bias2)
			bias1 = dtanh(z) * np.dot(self.W2.T, bias2)
			x = np.atleast_2d(x)
			bias1 = np.atleast_2d(bias1)
			self.W1 -= learning_rate * np.dot(bias1.T, x)
			z = np.atleast_2d(z)
			bias2 = np.atleast_2d(bias2)
			self.W2 -= learning_rate * np.dot(bias2.T, z)
	def predict(self, x):
		x = np.array(x)
		x = np.insert(x, 0, 1)
		z = tanh(np.dot(self.W1, x))
		y = tanh(np.dot(self.W2, z))
		return y

if __name__ == "__main__":
	X = np.arange(-3, 3, 0.1)
	X = np.reshape(X, (60, 1))
	y = np.sin(X)
	tlp = TLP(1, 8, 1)
	tlp.fit(X, y, learning_rate = 0.1, epochs = 12001)
	data = np.arange(-3, 3, 0.1)
	p = []
	for x in data:
		pred = tlp.predict(x)
		p.append(pred)
	plt.plot(data, y, 'b', data, p, 'r--')
	plt.savefig("sin11.png")
	plt.show()


```

以上。
スプレッドシートのセル背景色に応じて処理を行う

#環境
2018/1/8時点のGoogleAppsScript

#はじめに
スプレッドシートで背景色を塗りつぶしてデータの管理を可視化することがあります。
その背景色に応じて処理を分岐したいケースがあったのでその部分だけを抽出してまとめておきます。
（20色でギリギリ足りたという混沌具合...）

#先にまとめ

```javascript
/**
* 色を特定する
*/
function identifyColor(){
  var sheet = SpreadsheetApp.getActiveSheet();
  
  // 特定する色を取得する
  var targetColor = sheet.getRange(3, 4).getBackground();
  
  // 色一覧の「背景色の配列」と「内容の配列」を取得する
  var colorNum = 20;
  var colorsListRange = sheet.getRange(3, 2, colorNum, 1);
  var colorArray = colorsListRange.getBackgrounds();
  var contentArray = colorsListRange.getValues();
  
  // 色に応じて処理する
  for(var i = 0; i < colorNum; i++){
    var cellColor = colorArray[i][0];
    if(cellColor == targetColor){
      contentArray[i][0] = "コレ！";
    }else{
      contentArray[i][0] = "";
    }
  }
  
  // シートにセットする
  colorsListRange.setValues(contentArray);
}
```
![パレット.gif](https://qiita-image-store.s3.amazonaws.com/0/44990/bf973f18-c87b-f072-5b1f-85181b7e2e0e.gif)
△背景色をコピペすると同色のセルに「コレ！」が表示されます。

#解説
###値と背景色の情報は別々に取得する
値はおなじみ Range.getValues() で取得します。
あくまでValueを取得するだけで背景色の情報はここには含まれていません。

背景色は Range.getBackgrounds() で別途取得します。
単体セルの背景色：getBackground
複数セルの背景色：getBackgrounds
「#ffffff」のように16進数で取得できるので文字列として比較可能です。

###トリガーをセットする
デモンストレーション用に編集時に呼び出されるように設定しています。
<img width="776" alt="トリガー.png" src="https://qiita-image-store.s3.amazonaws.com/0/44990/2b060508-cd61-0373-7e22-3645ec03b5c6.png">


#さいごに
異なる20色揃えるのが地味に大変だったので共有しておきます。
https://docs.google.com/spreadsheets/d/1FD93bOPa7_duj899eTCLq7JfApQDbk0EUotp2Dc8Dz0/edit#gid=0
編集はできなくとも背景色のコピーはできるはず...
Juliaの使い始めにハマったこと

twitterのタイムラインでやたら見かけるようになったJuliaを触ってみて軽くハマったのでメモ。

## 環境

- macOS High Sierra 10.13.2
- pyenvでAnacondaをインストール

## インストール〜使ってみる

[こちら](https://qiita.com/miiton@github/items/33c2b62c4911216d5fdb)の記事を参考にJuliaをインストールし，環境設定した。

IJuliaを起動し，

```
$ jupyter notebook
```

ブラウザで「0.0.0.0:8888」にアクセス。
Juliaの新規notebookを作成してみたところ，やたらとkernel再起動が入ってまったく使えない状態。
コンソールに流れるログを見ると，

```
ERROR: LoadError: InitError: error compiling __init__: could not load library "/Users/nrmnr/.julia/v0.6/Homebrew/deps/usr/lib/libzmq.dylib"
dlopen(/Users/nrmnr/.julia/v0.6/Homebrew/deps/usr/lib/libzmq.dylib, 1): image not found
```

とのエラーが出ていた。

調べたところ，[こちら](https://github.com/JuliaLang/IJulia.jl/issues/130)に情報があった。
どうやらAnacondaでpythonを使っている場合のZMQライブラリ欠落が原因らしい。
なのでAnacondaでのpython使用は断念。

```
$ pyenv uninstall anaconda3-4.3.1
```

するとpythonが使えなくなるので，pyenvも削除し，Homebrewのpythonに戻す。

```
$ brew uninstall pyenv
```

JuliaコンソールでIJuliaを再度ビルド

```
$ julia
julia> Pkg.build("IJulia")
```

再度IJuliaを起動すると，今度はうまく動いてプロットもできた。
Webサーバのセキュアにするために1読しておきたい情報（SSL/TSL含む）

Webサーバをセキュアにするということは、セキュリティだけに適当な情報に頼りたくないものです。
インターネットの情報ではすでに古くなった情報もあり、対策として足りていないこともよくあります。

インターネットの情報を正しくふるいにかける力を養うためにも、以下のIPAが提供している情報は1度眼を通して損はありません。設定などについても、具体例を添えられていて、非常によくできていると思います。

安全なウェブサイトの作り方
https://www.ipa.go.jp/security/vuln/websecurity.html

SSL/TLS暗号設定ガイドライン～安全なウェブサイトのために（暗号設定対策編）～
https://www.ipa.go.jp/security/vuln/ssl_crypt_config.html
Python3 > print > %つきの文字列の表示をformat % value形式で書けなかった > 例: 3.1415% > 教えていただいた:print("%.4f%%" % 3.141592)

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

時間のかかる処理のprogressを表示しようとしている。
3.1415%のような表記をしようとした。

```test_print_percent_180108.py
import numpy as np

print("%.4f" % 3.141592, "%")

print("%.4f\%" % 3.141592)

```

１つ目のような特殊な書き方では正常に出力された。
２つ目は下記の後半のようなエラーとなった。

```txt:run
$ python3 test_print_percent_180108.py 
3.1416 %
Traceback (most recent call last):
  File "test_print_percent_180108.py", line 5, in <module>
    print("%.4f\%" % 3.141592)
ValueError: incomplete format
```

https://docs.python.jp/3/library/stdtypes.html#old-string-formatting
あたりをざっと見たが該当部分は不明。

別案としては下記だろうか。

```py
print("%.4f" % 3.141592 + "%")
```

### 教えていただいた事項

@shiracamus さんの[コメント](https://qiita.com/7of9/items/11de5e54c6dae67a8e59/#comment-621873b3e87dc01dcf46)にて記載方法を教えていただきました。

情報感謝です。
Rustのテストを並列実行しない

`cargo test`は各テストケースを並列実行する。
ディレクトリや環境変数などの状態が影響するテストが複数あるときは、`--test-threads=1`のオプションをつける。

```
$ cargo test -- --test-threads=1
```

[Running tests - Running tests - The Rust Programming Language](https://doc.rust-lang.org/book/second-edition/ch11-02-running-tests.html#running-tests-in-parallel-or-consecutively)
【Sass学習メモ】active, hoverの記述を入れ子で記述する

##やりたいこと
active, hoverの記述を入れ子で記述する

##解決策

```ruby:styleshet.css
.button:hover {
      opacity: 1;
    }

.button:active {
      box-shadow: none;
    }
}
```

```ruby:styleshet.scss
.button {
    &:hover {
      opacity: 1;
    }
    &:active {
      position: relative;
      top: 7px;
      box-shadow: none;
    }
}
```
入れ子で書く場合は、&でつなぐことで実現できる。
docker execで内側のTTYの高さを外側と揃える

`docker exec` でコンテナ内にシェルを起動してattachする場合、内側のTTYの高さが24になってしまいますが、外側のTTYの高さと揃えるには以下のようにします。

```
docker exec -it $CID bash -c "stty rows `tput lines`; bash"
```
IntellJ ideaの個人的に良かったTips まとめ

半年くらい前にIntellJのUnlimitedを購入したが、ちゃんと機能を把握できてなかった。
[ハンズオン本](https://www.amazon.co.jp/IntelliJ-IDEA%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3-%E2%80%95%E2%80%95%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C%E3%81%8B%E3%82%89%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E7%AE%A1%E7%90%86%E3%81%BE%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC-%E5%B1%B1%E6%9C%AC-%E8%A3%95%E4%BB%8B-ebook/dp/B07776KF2F/ref=sr_1_sc_1?ie=UTF8&qid=1515338873&sr=8-1-spell&keywords=intelljs)も買っちゃったので、個人的に良かったTipsを覚書。

# 個人的便利機能
### 新しいファイル作るときのショートカット
`⌘＋1`でプロジェクトツリーのウィンドウにフォーカスを当てられます（別にマウスでもいんだけど）。
そして、何かファイルを作る時、上部のメニューから選べば良いのだけど、`⌘+N`でファイル生成のウィンドウを表示される。
つまり…`⌘＋1`と`⌘+N`で行ける。なんか個人的に良かった

### Search Everywhere
`Shift * 2`でファイル、クラス、シンボル、ツール名などなど、あらゆる全ての項目を検索可能。  
とりあえず、これを覚えておけば何とかなりそう。
検索結果項目が多すぎる場合は、`⌘ + o`とか`⌘ + e`とかで絞りこめる（どのショートカットで絞りこめるのかポップアップに書いてあるので覚えなくて良し）。

### 何かウィンドウリスト？みたいなのが出た時の上下スクロール
これはシェルのhistoryを順に選択するのと同じで、`↑（Ctrl + P）`、`↓（Ctrol + N）`でできる。
別に矢印キーを押せば良いのだけど、矢印キーまでに移動するのが億劫な時があるので、これをよく使ってる。（余談だけど、自分はCapLockキーをCtrlキーに割り当ててる。よくやっている人は多いのでは無いだろうか。）

### Switcher
`Ctrl + tab`。使えばわかる。

### コードのブックマーク
`F3`でコードの横にチェックが付く。ちょっと気になるコードとかにブクマしときたければ、Favoritesウィンドウで見れる。
Favoritesウィンドウはブレークポイントとかも一覧で見れる。

### ポストフィックス補完
`Tab`で保管してくれる機能。vimだとneocompleteみたいなプラグインがあるけど、それに類するものだと思う。
~~（JavaとかKotlinとかPHPとかはあったけど、Rubyはないのかな…。）~~

### 最近開いたファイルを開く
`⌘ + E`でできる。「あ、間違えて閉じちゃった！いまのファイルなんだっけ…。」って時に便利。

### テストコードでジャンプ
`⌘ + Shift + T`で該当のテストコードにジャンプできる。なんか地味によく使うショートカット。該当のテストコードが無い場合は、`No test subject found`って出てくれるのも親切。

### 関数などの定義元ジャンプ、関数などの利用箇所を検索
こんな感じ（なんとなく図式化）
![function_jump.png](https://qiita-image-store.s3.amazonaws.com/0/19450/97a83597-d5ed-5ee4-1ae0-a8d92e2d77b8.png)

ただ、利用箇所の部分で`⌘ + B`すれば、`command + option + F7`と同じ効果になるので、そっちだけ覚えて於けば大丈夫。

ちなみに、一覧かポップアップかで、ショートカットが違う。
* `option + F7`：一覧
* `command + option + F7`：ポップアップ

ジャンプ前後に移動する時は、`⌘ + [`, `⌘ + ]`でできる。

### Language Injection
`alt + Enter`でできるのだが、例えばRubyコードの中にSQLを書きたいとなると、その部分だけSQLで書きたくなる。そういう場合、利用している言語以外の予想候補も出るように選択設定してくれる。  
設定した部分はハイライトされるのでわかりやすい。

### Version Control
`⌘ + 9`でversion管理ウィンドウを見れる。  
logとかconsoleとかあるけど、たまに使うかも。Logはツリー構造も出てくるので、どのタイミングでマージされたとか見れるから、ちょっと便利。  
（addとかcommitとかは基本的にTerminalから叩く癖がついているので、あんまり使わない。）

# リファクタ系
### 変数抽出（extract variable）
`option + ⌘ + V`でうまい具合に変数を作ってくれる（出来なかったら、ちゃんと`Cannot perform refactoring in this content`とアラートを出してくれる。

### 変数廃止（inline）
変数廃止という言い方が正しいか怪しいけど。
`option + ⌘ + N`でいらなそうな変数を削除してくれる。

**いずれも注意しないと行けないのが、複数箇所を同時にリファクタしてしまうときがあり、それによって意図せずプログラムがバグることがある。使う時はプログラマーが責任を持って、どこがどう変わったのかよく確かめること。**

# まだイマイチ使いこなせてない系
* `alt + Enter`：Intention Action。なんかうまい具合に良さげな機能を提供してくれるらしいけど、上手いこと使いこなせてない。
* `⌘ + shift + delete`：さっきまで編集してた箇所に戻る。
* LiveTemplateなる機能があって、所謂スニペット機能らしい。ポストフィックス補完がそれかと思ったが、そっちとは違うらしい。
* 色々プラグインあるらしい。その辺は必要になってから導入しよう。

# 参考
* [忙しい人のためのIntelliJ IDEAショートカット集](https://qiita.com/yoppe/items/f7cbeb825c071691d3f2)
* [IntelliJ IDEA 13.1のPostfixコード補完](https://blog.jetbrains.com/jp/2014/03/19/433)
[Ionic]カスタムフォント(独自フォント)を使う

Ionicでカスタムフォントを使う時は、CSSで@font-faceを指定すれば良いです。
今回使うカスタムフォントはAAを表示するためのフォント(aahubフォント)です。

## やり方

app.scssに@font-faceを記述します。
それだけすれば、カスタムフォントをfont-familyで指定できるようになります。
ソースコードは以下。

````src/app/app.scss
@font-face {
        font-family: 'aahub';
        src: url("../assets/fonts/aahub");
    }
````

[ソースコード](https://github.com/scrpgil/ionic-my-sandbox/blob/master/src/app/app.scss)

````src/pages/custom-font/custom-font.scss
    .aa{
        font-family: 'aahub';
    }
````
````html
<ion-header>
  <ion-navbar>
    <ion-title>custom-font</ion-title>
  </ion-navbar>

</ion-header>
<ion-content padding>
  <p>フォント：デフォルト</p>
  <div>
    　 ∧＿∧<br>
    　（　´∀｀）<br>
    　（　　　　）<br>
    　｜ ｜　|<br>
    　（_＿）＿）<br>
  </div>
  <p>フォント：カスタム</p>
  <div class="aa">
    　 ∧＿∧<br>
    　（　´∀｀）<br>
    　（　　　　）<br>
    　｜ ｜　|<br>
    　（_＿）＿）<br>
  </div>
</ion-content>
````
※ aahubは今回作成した独自フォントの名前です。コピペする時は書き換えて貰えれば・・・。

[ソースコード](https://github.com/scrpgil/ionic-my-sandbox/tree/master/src/pages/custom-font)

上記の設定を行うだけでカスタムフォントの指定はできます。簡単です。

結果、以下のように表示されます。
カスタムフォントではアスキーアートがずれなく表示できています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/165335/101b4f79-3acc-18fc-3d8e-d0cb0ecf33b5.png" width=24%>


[デモ](https://ionic-my-sandbox.firebaseapp.com/#/custom-font)



## 全体に適用する場合

アプリ全体のフォントを変更する場合は、variables.scssに以下を追加すればよいです。

````src/app/app.scss
@font-face {
        font-family: 'aahub';
        src: url("../assets/fonts/aahub");
    }
````
````src/theme/variables.scss
$font-family-md-base: "aahub";
$font-family-ios-base: "aahub";
$font-family-wp-base: "aahub";
````

IonicのCSS上書きについては公式ドキュメントを見てもらえれば
[公式ドキュメント](https://ionicframework.com/docs/theming/overriding-ionic-variables/)


# まとめ

Ionicでは一般的なWEBフォントと同じように使用できるので簡単です。私も自身のWebサイトで使用していますので、参考までに・・・。
[スマホ対応のAAビューアー](https://aahub.org)

また、その他AA表示用フォントを知りたい方は以下のサイトも参考にしてみてくdさい。
[AAHub Fonts](https://fonts.aahub.org)
Qiitaへ投稿するために調べたこと

#趣旨
初めてQiitaの記事を投稿するにあたり、調べたことの記録です。
投稿してみたいけどどうすれば…という方が読んで、そんなもんかと思ってもらえたら幸いです。

#調べたこと
* Qiita公式の説明
    * [Qiita:Support](https://help.qiita.com/ja/categories/qiita/)
* Markdownの記法(わかりやすい記事ありがとうございます)
    * [Qiita記事の書き方〜基本の基本〜](https://qiita.com/48saaan/items/ec2e823e598b457d42eb)
    * [Qiita Markdown 書き方 まとめ](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)
* 他の記事のソース確認方法
    * URLの末尾に.mdをつけて開くとソースが見れる([こんな感じで](https://qiita.com/gricoRodriguez/items/64834746c89df5a1f62c.md))
    * タイトル右上の三点リーダーアイコン→Markdownで本文を見る、でもOK
* コメントにリンクする方法
    * [Qiitaの記事コメントへのリンクURL取得方法](https://qiita.com/khsk/items/5f08de72d60f8ad59de3) 

#要調査
* コメントのソースを見る方法(プレビューの逆がしたい)

#いざ投稿してみて
* Markdown形式は、アウトラインが書きやすくて良さそう
* エディタで環境整えて、書く時間短縮したい
* [コミュニティガイドライン](https://help.qiita.com/ja/articles/qiita-community-guideline)から外れるのでは？と指摘を頂いた(対応は[コメント](https://qiita.com/gricoRodriguez/items/64834746c89df5a1f62c#comment-e089d081d373152bca23)参照)

#最後に
今後も記事作成方法について調べることが出てくると思うので、都度こちらに追記してまとめていきたいと思います。
M.2 SSDのRAID 0には相応の覚悟を

# ノートPCでRAID
　Lenovo ThinkPad P71を調達したところ、M.2 SSDを二枚挿してRAID 0を組めることに気づき、「史上最速のノートPC」を目指して M.2 SSD 二枚刺しでRAID 0をテストしました。

　RAID level 0は、複数の同一記憶ドライブを並列に接続し、ストライプ状に分割して同時に一つのドライブとして使用することで、高速化を図るものです。N個のドライブをRAID0構成にすると、転送速度は理論上N倍になります。

- 環境
  - Lenovo ThinkPad P71
  - Samsung SSD 960EVO M.2シリーズ 500GB * 2

　結果、そもそもが高速なM.2 SSDでRAID 0高速化を目指すことには相応の困難さがあることがわかりました。

# テスト結果

## RAID 0 / stripe size 16KB
![ssdraid0-stripsize16kb.PNG](https://qiita-image-store.s3.amazonaws.com/0/107848/7cdba290-10e3-9578-a710-f802e50bccd3.png)

## RAID 0 / stripe size 64KB
![ssdraid0-stripsize64kb.PNG](https://qiita-image-store.s3.amazonaws.com/0/107848/2cd23ea5-2351-a5a0-a055-1a98278a4c9d.png)

## RAID 0 / stripe size 128KB
![ssdraid0-stripsize128kb.PNG](https://qiita-image-store.s3.amazonaws.com/0/107848/9f9e9b9b-9a1e-4569-6234-4518016bf3a8.png)

[Qwerty.Workさんの記事「RAID0のストライプサイズはどれが最速なのかベンチしてみた」](https://qwerty.work/blog/2015/02/raid0-stripesize.php)にある、
「stripeサイズは64KBがバランスいい」を再確認する結果となりました。

シーケンシャルライトで3GB/s出てるというのはさすが最新の構成。。と思ったのですが、RAID 0組まない、960EVO 500GBの素の性能を測ってみました。

## RAIDなし
![ssd=noraid.PNG](https://qiita-image-store.s3.amazonaws.com/0/107848/7d3e4676-b92a-a8b6-780e-b4f9580c2447.png)

　シーケンシャルライトではRAID 0に負けてますが、**4KiB Q8T8のランダムライトではRAID 0のすべての設定より高速ですね。。** シーケンシャルライト1.9GB/sというのも十分に高速です。

　PCI-E 3.0 x4 の一方向スループット4GB/sで、[960EVOの公称シーケンシャルリード3.2GB/s](http://www.samsung.com/semiconductor/minisite/jp/ssd/consumer/960evo/)がすでにバスの帯域上限に迫ってます。ThinkPad P71のRAIDコントローラーはインテルの何かがが入っていますが、所詮ノートPC用。。[PCI-E x16のRAIDカード](https://akiba-pc.watch.impress.co.jp/docs/news/news/1072913.html)などでなければ、SSDのストライピングで性能向上を目指すことは難しいのでしょう。

　そもそもSSD自体がチップ内のセルまんべんなくアクセスするストライピングしまくってるような動作してるので、SSDでRAID組むよりは高速なSSDを装備したほうがいいでしょう。

　なお2017年12月当時、ThinkPad P71に1TBのSSDを載せると20万円しますが、後付で500GB * 2を載せると54,000円で済みました。

# 他の方のM.2 RAID 0情報

## High Pointの 4枚挿し PCI-E x16 RAIDカード シーケンシャルリード 7.5GB/s

 - https://akiba-pc.watch.impress.co.jp/docs/news/news/1072913.html

## X399マザーのRAID機能でシーケンシャルリード Read 6.5GB/s

 - http://review.kakaku.com/review/K0000929857/#tab
   - いぐいぐらぷたさんのレビュー

## ASRock Ultra Quad M.2 Card 11GB/s

 - ASRock「Ultra Quad M.2 Card」で構築するNVMe SSD×4の究極RAIDストレージ
2018.04.06 更新 文：エルミタージュ秋葉原編集部 池西 樹
 - http://www.gdm.or.jp/review/2018/0406/255380/5
 - intelのssdに縛られる
Numpy array を str byte に変換する [TensorFlow]


# 前書き
初投稿です．いつもQiitaさんにはお世話になっていますのでアウトプットしてみました．

ええと，かの有名な[inception-2015-12-05.tgz](http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz)の中のclassify_image_graph_def.pbで定義してあるInception-v3のgraphは，ndarrayを直接入力にすることができません．

そのまま入れようとすると，

```zsh
ValueError: Cannot feed value of shape (720, 1280, 3) for Tensor 'image_feed:0', which has shape '()'
```
みたいなエラーが出ると思います．

OpenCVのVideoCaptureでwebカメラから取得した画像をモデルにぶち込もうとした時にこの問題に当たりました．

# 対処
最初はndarrayを一度ローカルに保存しておいて，`tf.gfile.FastGFile(image_path, 'rb').read()` を用いて再度ロードしていたんですけど，さすがにダサいので，

```python3:
image = np.ndarray([227, 227, 3]) # こういうnumpy arrayがあったとします

image_tensor = tf.convert_to_tensor(np.uint8(image[:, :, ::-1].copy()))
encoded = tf.image.encode_jpeg(image_tensor)
encoded_data = sess.run(encoded)

logits = sess.run('softmax:0', {'DecodeJpeg/contents:0': encoded_data})
```
みたいな感じで変換するといいと思います．
以上です．

# 参考
How do I convert a numpy Array to a data type that tensorflow can classify? : https://stackoverflow.com/questions/42439360/how-do-i-convert-a-numpy-array-to-a-data-type-that-tensorflow-can-classify
Armでyescryptをマイニングする

#概要
pooler氏が7年前に公開した[cpuminer](https://github.com/pooler/cpuminer)は現在に至るまで多くの開発者によってフォーク・コミットが行われてきました。そんな[cpuminer](https://github.com/pooler/cpuminer)ですが4日前にprimenumber氏がArm/Neon系に最適化した[yescrypt用マイナー]
(https://github.com/primenumber/cpuminer-yescrypt/tree/yescrypt-neon)をコミットしました。
今回はこのマイナーを使ってマイニングしていきます。

#必要なもの
- ArmボードやスマホなどのArm機器
- AndroidならGNURoot Debian
- iOSなら脱獄環境(未検証)
 
#手順
1~7の手順はAndroid専用です。それ以外の方はは1~7の手順をスキップしてください。


1. GNURoot Debianというアプリをplay storeよりインストール
2. アプリを開き、```apt-get update```を実行。
自分はここで操作の利便上、sshでパソコンから操作したかったので3~7の手順を行った。飛ばしても同じようにできます。
3. ```apt-get install -y openssh-server vim```
4. ```vim /etc/ssh/sshd_config```
5. 以下の行を変更します。


```bash
Port 2222
UsePrivilegeSeparation no
PermitRootLogin yes
AuthorizedKeysFile      %h/.ssh/authorized_keys
```

6.　```echo 自分のrsa公開鍵 > ~/.ssh/authorized_keys```
7.　```service ssh start```
8.　```apt-get install git automake autoconf build-essential libcurl4-openssl-dev -y```
9.　```git clone https://github.com/primenumber/cpuminer-yescrypt.git```
10. ```cd cpuminer-yescrypt && git checkout bitzeny-neon```
11. ```./autogen.sh && ./configure CFLAGS="-O3 -march=native -mfpu=neon -mtune=native" && make```

ここまででminerdというバイナリファイルができていれば完成です。

#予想損益の計算


一般的にpowを採用した通貨のマイニングでは予想損益は以下のような式で表せます。


(自分のハッシュレート/ネットハッシュレート＊ブロック報酬/ブロック間隔＊期間＊交換レート) - (消費電力＊電気代)

例えばSnapdragon820でbitzenyと言う通貨を1時間マイニングした場合は

```math
(0.7/34445*62.5/90*3600*31) - (0.004*24)
=1.57 - 0.096 ≒ 1.47 (円)
```

となります。(※注1)

１ヶ月で1170円、電気代を差し引いて1100円ほどの利益を得ることができます。メイン機でのマイニングはお勧めできませんが眠っているスマホなどがあれば活用してみるのも面白いのかなと思ったりしてます。









(※注1)以下の条件で計算しています。

|||
|:-:|:-:|
|SD820でのハッシュレート|0.7KH/s|
|執筆時点のネットハッシュ|34,445KH/s|
|執筆時点のブロック報酬|62.5ZNY|
|ブロック間隔|90秒|
|期間|１時間|
|執筆時点の交換レート| 31円/ZNY  |
|SD820での消費電力  |  0.004kW |
|日本の平均電気代| 24円/kwh  |

これらの情報は短期間で大きく変わる物が多い(特に交換レートやネットハッシュ)ため随時自分で計算することをお勧めします。
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十五章 蒸留4 ドメインビジョン声明文

# 前回までの第十五章

[コアドメイン1](https://qiita.com/YasuhiroKimesawa/items/899d1b3fd58ca91f525a)
[コアドメイン2](https://qiita.com/YasuhiroKimesawa/items/1aee3602d3aea1cb5b91)
[汎用サブドメイン](https://qiita.com/YasuhiroKimesawa/items/be23f3bd11626265f552)

# ドメインビジョン声明文

多くのプロジェクトでビジョン声明文、プロジェクト憲章、インセプションデッキなどを作ると思います。
作ってます？作りますよね。

そして、それって維持されてます？されてますよね。

プロジェクトが始まったら、軌道に乗ったら、捨てられたりしてませんか？

プロジェクト初期でしか価値のないものであれば、それでもいいかと思いますが。。。

コアドメインとコアドメインがもたらす価値に関する簡潔な記述を作成することで、開発のあらゆるフェーズで、リソースの割当やモデルの選択の指針とすることができて、チームメンバの教育にも使用できます。

プロジェクト開始時から開発に集中する必要があり、後期では、モデルを詳細に調べなくてもシステム価値を説明する必要があります。
なので、**経営陣も開発メンバーも**直接使用することになる文書です。

当然、焦点は**ドメインモデルの本質とビジネスにどのように役に立つか**が内容として書かれることになるでしょう。
書籍の例を読むとわかるとおり、ここには、技術的なことは書かれず、単純にコアドメインが、ビジネスにおいて何をするもので、どんな価値をもたらすのかが書かれます。

プロジェクト初期のうちに作成し、**新しい洞察を得た時点で修正すること**が大事です。

自分はまだ、ドメインビジョン声明文を作ったことがないのですが、書くことによる効果は大きいだろうなと思いました。
インセプションデッキを作った後、ストーリーマッピングを作る過程、最初のリリースプランニングをする過程、最初の概念モデルを作る過程、コンテキストマップを作る過程などでドメインビジョン文書を作って、インセプションデッキと一緒に保守していくのがいいかもしれませんね。

インセプションデッキより高頻度で修正されると思いますが、そのたびにインセプションデッキの見直しもするきっかけになるでしょう。

## あとから揉めるところを文書化しておく(変更があることを前提に)

ドメインビジョン声明文の価値は、大抵あとから揉めることを事前に文書化しておくところにもあると思います。
ここは自分の経験的にもそうです。

プロジェクトの中盤になっても、「結局このアプリの価値ってなんでしたっけ？」という会話したことがありませんか？
この時期になっても明文化されたものがないと、永遠に終わらない会話が、しかも繰り返しなされることになります。

こうなってくると、コアドメインはどこ?となっても、人によって違ったり、コアドメインなのに、他のチームやSIerさんに出してしまったりということもあるかもしれません。

この文書があることで、**チームに共通の方向性**を与えることができます。

逆に、このような文書を作らないチームも多いと思います。その動機としては、「どうせ後から変わるから、変わったら揉めるから」という点だと思います。
インセプションデッキもそう。作らないチームの動機は同じものだと思います。
でも揉めてませんか？作ったら揉めるといいつつ作ってないのに揉めてる。

あとから変わる、それはその通りなのですが、**揉める原因は変わったからではない**のです。
**変わる前の元々の定義が曖昧であること、または、勝手に誰かが変えてしまうこと**
これが原因なんです。

なので、大事なのは**今！現時点!でわかっていること、わかってなくても現時点ではこうしておこう**というのを残していくことだと思います。

**変更ありき。変更が当然としてあること。**
**変更は文書が修正され、チームで合意を得ることで変更されること、これを継続すること**が大事です。

コアドメインも変化していきます。変化に対応していくためにもドメインビジョン文書はあったほうがいいと思います。

## インセプションデッキも

このように考えるようになったきっかけは、インセプションデッキを作らなかった結果、その内容について後から揉めることがあったためです。

プロジェクト中盤で「そもそもなんでアプリ作ってるんだっけ？」「他の人にこのアプリの価値が説明できない」「これはやらないって言ってたよね」「またステークホルダが増えた？まだ増える？」「いつの間にか期間も機能も固定になってる」なんて揉めるんです。

そして、大抵揉める内容はインセプションデッキで書かれるべき内容のことだったんです。
これも揉める原因は変わったことに対してではなくて、そもそも決めてない、曖昧にしてた、勝手にいつの間にか変わってたことが原因でした。

なので、インセプションデッキも後から変わる前提で、現時点での、決まってなかったらこうしておこうという内容を文書化しておくのは非常に大事です。

ドメインビジョン文書とインセプションデッキは作ったらプロジェクト期間を通してとても価値のある文書になると思います。
AIで競輪予想 その4

#MySQLクライアントのインストール
```shell:mysqlclient
#apt-get install -y libmysqlclient-dev
#pip3 install mysqlclient
```
下記、ソースで、import MySQLdb　の部分でエラーが発生して少しはまった。

```python3:mysql-conn-test.py
import MySQLdb

conn = MySQLdb.connect(
    user='root',
    passwd='your-password',
    host='localhost',
    db='your-dbname')

cur = conn.cursor()

cur.execute('DROP TABLE items')
cur.execute('''
    CREATE TABLE items (
        item_id INTEGER PRIMARY KEY AUTO_INCREMENT,
        name TEXT,
        price INTEGER
    )
    ''')

data = [('test1', 100),('test2', 200), ('test3', 300)]
for i in data:
    cur.execute("INSERT INTO items(name,price) VALUES(%s,%s)", i)

conn.commit()

cur.execute("SELECT * FROM items")
for row in cur.fetchall():
    print(row)
```

これでやっと、python3 + MySQLでの開発環境が整った。

以下の本を参考にした。

<a href="https://www.amazon.co.jp/Python%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0-%E9%96%8B%E7%99%BA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-BeautifulSoup-scikit-learn-TensorFlow%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86/dp/4802610793/ref=as_li_ss_il?ie=UTF8&qid=1512660826&sr=8-1&keywords=9784802610797&linkCode=li2&tag=baseball55-22&linkId=daf3b47bbfc6bc16c122489c6f4fc19d" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4802610793&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=baseball55-22" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=baseball55-22&l=li2&o=9&a=4802610793" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
[Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう](http://amzn.to/2AjWEmC)
Rails APIモード + devise_token_auth に Twitter 認証を導入する(その1)

# ここに書いてある内容は
基本的に以下の公式ドキュメントに書いてあること以外はやっていません。
ググるといろいろと情報が出てきて困惑しますが、だいたい公式ドキュメントをしっかり見れば前に進めるはずです(願望)。

- https://github.com/lynndylanhurley/devise_token_auth#omniauth-authentication
- https://github.com/arunagw/omniauth-twitter

# 実装(追加したコード)

```:Gemfile
gem 'omniauth-twitter'
```

```rb:config/initializers/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do
  # ENV には dotenv とかを使って設定しましょう。KEY/SECRET はツイッターのサイトで登録してゲットしてください。
  provider :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET']
end
```

```rb:config/application.rb
config.session_store :cookie_store, key: '_interslice_session'
config.middleware.use ActionDispatch::Cookies # Required for all session management
config.middleware.use ActionDispatch::Session::CookieStore, config.session_options
```

```rb:app/model/user.rb
class User < ActiveRecord::Base
  # Include default devise modules.
  devise :database_authenticatable, :registerable,
          :recoverable, :rememberable, :trackable, :validatable,
          :omniauthable # こいつを追加していなければ追加する
  include DeviseTokenAuth::Concerns::User
end
```

# さてこの後どうする？
`rails routes` してみましょう。

```
...省略
                 GET      /v1/auth/:provider/callback(.:format)  devise_token_auth/omniauth_callbacks#omniauth_success
                 GET|POST /omniauth/:provider/callback(.:format) devise_token_auth/omniauth_callbacks#redirect_callbacks
omniauth_failure GET|POST /omniauth/failure(.:format)            devise_token_auth/omniauth_callbacks#omniauth_failure
                 GET      /v1/auth/:provider(.:format)           redirect(301)
```

この一番下が redirect(301) となっています。
:provider の部分を twitter に置き換えクライアント側から叩くと、無事 Twitter の認証ページがレスポンスに含まれてやってきます。

良かったですね。

(その2に続くはず)

# 2018/01/31 追記
その後いろいろと壁にぶち当たりうまくいっていないため、その2は解決次第書くはず。。。
django-grappelli を試してみる

「Djangoの管理インターフェースのためのすばらしい肌。」（Google翻訳）だそうです。
[Django Packages](https://djangopackages.org/grids/g/admin-interface/:title) の管理サイトインターフェース部門では1番使われてそうなので試してみることに。
基本的に[ドキュメント](https://django-grappelli.readthedocs.io/en/latest/quickstart.html) に従って設定するだけ。

# 使用した環境
Windows10
Python 3.5.4
Django 1.11.8
django-grappelli-2.10.1

# インストール

```
> pip install django-grappelli
```

# 設定
## settings.py
INSTALLED_APPS に grappelli を追加。

```py3
INSTALLED_APPS = [
    # TODO for grappelli
    'grappelli',
    'django.contrib.admin',
    ...
]
```

TEMPLATES に コンテキストプロセッサを追加。デフォルトで入ってますが、なければ追加。

```py3
TEMPLATES = [
    {
        ...
        'OPTIONS': {
            'context_processors': [
                ...
                'django.template.context_processors.request',
                ...
            ],
        },
    },
]
```


## url.py
urlパターンを追加。このurlは関連検索やオートコンプリートに使用するらしい。adminサイトのurlは変わりません。

```py3
urlpatterns = [
    # TODO for grappelli
    url(r'^grappelli/', include('grappelli.urls')),
    url(r'^admin/', admin.site.urls),
]
```

## collectstaticコマンド実行
今回はローカル環境だけなのでこれは不要。

# 管理サイトを起動
## デフォルトの管理サイト(Home)
比較のため django-grappelli 適用前のデフォルトの管理サイト

![通常_admin_.png](https://qiita-image-store.s3.amazonaws.com/0/112763/367252e2-fd81-14cd-225f-7ddef364e86c.png)

## django-grappelli 適用後の管理サイト(Home)
ちょっと古い感じのデザイン…

![grappelli_admin_.png](https://qiita-image-store.s3.amazonaws.com/0/112763/5488ef1b-79e9-70f5-f75c-26e116cfe660.png)

# Dashbordを設定
## settings.py
INSTALLED_APPS に grappelli.dashboard を追加。以下の順番にする必要があるらしい。

```py3
INSTALLED_APPS = [
    'django.contrib.contenttypes',
    # TODO: for grappelli
    'grappelli.dashboard',
    'grappelli',
    'django.contrib.admin',
    ...
]
```

## dashboard.py を作成
コマンドプロンプトでプロジェクトディレクトリに移動し、以下のコマンドを実行して dashboard.py を作成。

```
> python manage.py customdashboard
```

## 再度 settings.py
上で作成した dashboard.py に CustomIndexDashboard というクラスがあるので、GRAPPELLI_INDEX_DASHBOARD にこのクラス名を設定する。

```py3
# TODO: for grappelli
GRAPPELLI_INDEX_DASHBOARD = 'dashboard.CustomIndexDashboard'
```

# 管理サイトを起動 (Dashboard適用後)

カスタマイズ未のDashboardだと以下の感じになる。上で作成した dashboard.py を変更してカスタマイズしていくみたい。[dashboardカスタマイズのドキュメント](https://django-grappelli.readthedocs.io/en/latest/dashboard_api.html#)。

![grappelli_dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/112763/476bdb9f-4c8b-77d3-3b9a-67d0296dae4e.png)

# 感想
すぐに適用できる。
Dashboardをカスタマイズして本領発揮なのかもしれないけれど、デザインが古めかしいのでカスタマイズしちゃおう！という気にならなかった。
他のを試してみよう。
vue-routerのhistoryモードでハッシュ付きリンクのスクロール位置を指定する


普段のサイトではよく見かける、「リンク先ページの指定のセクションまでスクロールさせて表示する」実装をVue+vue-routerで実装した話です。

最終的には[scrollBehaviorのリファレンス](https://router.vuejs.org/ja/advanced/scroll-behavior.html)に載っていたのですが、たどり着くのに時間がかかったので、共有がてらまとめておきます。

## scrollBehavior option について

`vue-router` には、 `scrollBehavior` というその名の通りスクロール位置の振る舞い(初期位置)について設定できるoptionがあります。
それの返し値として、以下の3種類が設定できます。

1. `{ x: number, y: number }`
2. `{ selector: string }`
3. `{ selector: string, offset? : { x: number, y: number }} (2.6.0 以降においてだけ offset はサポート)`

今回はヘッダーなどのoffset値は気にしなくて良いので、1の指定方法(+ハッシュがない時用に2の指定方法)を使用します。


## 実装したこと

実際のコードは↓のような感じです。
scrollBehavior内で `location.hash` をみるだけです。

```js
Vue.use(VueRouter);

const config = {
  routes,
  mode: 'history',
  scrollBehavior(to, from, savedPosition) {
    // ハッシュがある時にはその地点へとスクロールする
    const selector = location.hash
    return selector ? { selector } : { x: 0, y: 0 }
  }
}

export default new VueRouter(config);
```

あとは通常のサイト制作と同じように、リンクの設定とid指定だけで動作しました。

```html
<router-link to="hoge#pos1">hogeのpos1へ</router-link>
```

## おわりに

とりあえず最低限の挙動をするようになったので十分です。
今回はスムーズスクロールなどは実装していませんが、 `scrollBehaivor` optionをつかえばそちらの方も比較的簡単に実装できるのではないかと思います。
Scalaのシールドクラス/トレイトとパターンマッチ

# シールドクラス/トレイトとは
先頭に`sealed` キーワードをつける。
同一ファイル内からのみ継承可能なクラス/トレイとのこと。

sealedクラス = 封印されたクラス

例：

```scala
sealed trait Example {
  def one: Number
  def two: Number
}

sealed abstract class Example
```
# パターンマッチでの使い所
### すべてのケースを網羅していることを保証したい
デフォルトケース云々の話ではなくて、とにかくすべてのケースの網羅を保証をして、
安心して寝たい場合。


```scala:baseball.scala
sealed trait Team

case class Dragons(member: String) extends Team
case class Tigers(member: String) extends Team
case class GoldenEagles(member: String) extends Team

object Main extends App {
  def showProfile(t: Team): String = t match {
    case Dragons(m) => s"中日 $m"
    case Tigers(m) => s"阪神 $m"
  }

  val member = Dragons("山本昌")

  println(showProfile(member))
}
```

`sealed`キーワードを付けることでコンパイラが以下のような警告をしてくれる。

```
baseball.scala:8: warning: match may not be exhaustive.
It would fail on the following input: GoldenEagles(_)
  def showProfile(t: Team): String = t match {
                                     ^
one warning found
```