OmniAICreator/Qiita-1.07M huggingface dataset:
動的なSVGで、待たないインジケータをつくる

タイトルを意気込んで書いたので、まずは背景から。

# インジケータは何のためのもの？

ユーザーとしてアプリケーションに触れる際は、インジケータはあたりまえすぎるものなので、何のため、というのは意識しないかもしれません。

ですが、エンジニアの方でしたら、1度くらい、経験したことがあるはずです、開発途中のインジケータ未実装のアプリケーションを。

インジケータが未実装だと、どうなるのか？というと、

- ユーザーのアクションに対するリアクションがなく、シーン...となるので、システムが「何もしていないように見える」
- そして、ユーザーが何かミスったかなと思い、「連打する」
- しかし何も起こらないので、結果ユーザーは「壊れたと勘違いする」

こんなことが起こります。

インジケータっていうのはユーザーに対してのメッセージであり、コミュニケーションですよね、というところです。


続いて、インジケータがあるものの、それによって何を伝えるか、です。

インジケータはなんかぐるぐるしているものをとりあえず置いておけばいいんじゃないの？

という考え方もあると思います。


ですが、インジケータの役割は、

- 待ってもらうためのもの

であり、そうなると、単にインジケータを置いても、「ユーザーを待たせている」わけです。

であれば、何かしらで、その心理的負担を取り除いてあげたいですよね？

たとえば

- いつまで待てばよいのかわかる
- できたらお知らせしてくれる
- 待っていると感じさせない

など。

今回は、この中でも、「待っていると感じさせない」をやってみたいとおもいます。


# 成果物

![janken.gif](https://qiita-image-store.s3.amazonaws.com/0/30181/0692419c-fabb-4610-0491-7e47f0f22f71.gif)

これは何をしているのかというと、ユーザーのクリックする、というのに対してリアクションするSVG画像です。

・・・インジケータ、、、ではないですねもはや笑

しかもなんか「はじめてのアプリケーション」みたいになってしまいましたね、、、、

しかし、意図はあって。

一般的なインジケータだと、「待つ」という行いは絶対発生するが、こういったように、待つのではなく、
他の目的を与えることで、待たないインジケータになりうるという話です。

さらに言うと、それを動的なSVGで実装してみようよ、という話です。

実際、画像やCSS、アニgifなどはあっても、

- ドットの集まりではなく、定義に基づいて描画ができる表現力豊か
- 動的に振る舞いを変えられる

というのは、SVGをうまく活かせるところなのでは！


# 技術的な話

さて、ここで技術的な話ですが、
いきなりですが、インタラクティブな部分はJSを使ってます。
なんだよって感じですが。

ただ、SVGって面白くて、JSでアクセスしてアレコレできてしまうんですよね、、
SVGの一番外側だけではなく、SVGの内部に、ですよ。
SVGの中の要素にアクセスできてしまうんです。

しかも、SVGにSVGを入れ子したりもできるし、JS自体もSVG内に書くことができます。
そのあたりのパッケージ感が面白いです。

それを踏まえて、上記添付のSVGに関しては、ぼくの拙い絵をSVGで描画したもの複数個を、親のSVGに入れ子にしてあります。
さらに、同じく親のSVGの入れ子のJSで制御しています。

日本語的に何を言っているのかわからなくなる頃だと思うので、イメージはこんなかんじです↓

```html
<!-- イメージ -->
<svg>
  <svg></svg>
  <svg></svg>
  <svg></svg>
  <script></script>
</svg>
```

これを使うこなすと、やろうと思えば激しくリッチにできてしまうんですよね。

そして何かに似てるなぁ、、と思ったところ、キャラ的にはかつてのFlashに似ていますよね。

なので、そういった目線でSVGを見ると変わって見えるかもしれません。

SVGって、なんかなめらかに描ける画像みたいなアレでしょ、という風に捉えている方も少なくないと思いますが、こうやって技術に基づいて色々見ていくと、今までできなかった **マイクロインタラクション** なども、ちょっと違うアプローチで解決したりできるようになるのではないでしょうか？？

色々試してみてください！！

[雑然としてますが、ソースコードはこちら](https://github.com/pochi-sato/janken-svg)
iOSのシミュレーターからJIS配列のキーボードで日本語入力

SafariでMacのキーボードから"https:"を入力すると":"が入力できなかったため、JIS配列で入力出来るようにした。

# 1. ホーム画面から設定(Settings)を開く
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.24.48.png](https://qiita-image-store.s3.amazonaws.com/0/208363/dc48f868-9374-4721-a3f2-70e9fd377edd.png)

# 2. 一般からキーボードを開く
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.23.44.png](https://qiita-image-store.s3.amazonaws.com/0/208363/e83578b2-1811-fa8e-d252-2c48c5297146.png)

# 3. 一番上のキーボードを開く
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.23.41.png](https://qiita-image-store.s3.amazonaws.com/0/208363/b5a68741-a051-54dc-4d9d-b93600d5ed52.png)

# 4. 一番下の新しいキーボードを追加...(Add a new keyboard)を開く
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.23.34.png](https://qiita-image-store.s3.amazonaws.com/0/208363/7e18c540-bece-fb86-5c13-8641f19aef71.png)

# 5. 推奨キーボードの英語(日本語)を追加する
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/208363/cfc18611-e840-83d7-e7e6-87af32fde313.png)

# 6. QWERTY-JISが選択されていることを確認
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/208363/834aba3c-e0d0-0db9-17a6-575c30bf7af0.png)

# 上の4.の編集から英語(日本)を一番上に移動
必要ないかもしれません。
![Simulator Screen Shot - iPad (5th generation) - 2018-12-31 at 01.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/208363/eced23f8-867f-75b6-d486-15121620d89d.png)

# 引用
> iOSSimulatorのHardwareKeyboardの認識が101キーボードになっている？
> https://ja.stackoverflow.com/questions/29424/iossimulator%E3%81%AEhardwarekeyboard%E3%81%AE%E8%AA%8D%E8%AD%98%E3%81%8C101%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B
2018 #大晦日ハッカソン の進捗書いてくとこ(仮)

2018 #大晦日ハッカソン の記録

#[大晦日ハッカソン](https://atnd.org/events/102652)  とは

```
今年も大晦日にハッカソンやります。
ハッカソンと言っても、特にどこかに集まったりしないで、各自で自宅などで勝手にやる感じです。

ルールは
進捗があったら #大晦日ハッカソン とつけてツイートする。
以上。 作るものとかも自由です。なにか作りたいものがあるけど時間取れなかった方、
今年最後に一気に仕上げましょう！ 
大晦日 = ハッカソン を定着させたい。
```

# チャレンジしてみる事
もう何年も 前から やろうとして悶々としてる 小さなドールを動かす機構を考えて試作してみるチャレンジをしようかなと思っています。あと ドール系ロボット 作ってる方の twitter アカウントとかまとめたい。

マイコンには obniz を使って サーボ 16個動かしてみるところから始める。

# 概要
- [obniz](https://obniz.io/) と [PCA9685](https://www.switch-science.com/catalog/961/) を繋ぐ Qiita を書く。
- [obniz](https://obniz.io/) と [DFPlayer mini](http://akizukidenshi.com/catalog/g/gM-12544/) を繋ぐ Qiita を書く。
- サーボ 16個 & スピーカー を収める筐体を [Fusion360](https://www.autodesk.co.jp/products/fusion-360/overview)で設計　＆ 3Dプリンターでの出力
- ドールを動かす機構の設計
- ドール系ロボット 作ってる方の twitter アカウントとかまとめ Qiita を書く。
emacs で複数ファイルに渡って置換

このページを読むのが良い:
[Replacing text across multiple files](https://www.gnu.org/software/emacs/manual/html_node/efaq/Replacing-text-across-multiple-files.html) (5.37 How do I perform a replace operation across more than one file?)

以下は内容の覚書き:

1. dired を開く (<kbd><kbd>C</kbd>-<kbd>x</kbd> <kbd>d</kbd></kbd> など)
2. 置換対象のファイルを選択する．
  - <kbd>t</kbd> ですべてのファイルを選択できる．
  - <kbd>m</kbd> で1つずつファイルを選択できる．
  - [Marks vs Flags](https://www.gnu.org/software/emacs/manual/html_node/emacs/Marks-vs-Flags.html) などが詳しそう
3. <kbd>Q</kbd> で指示に従って置換できる．
  - あとは普通の対話型の置換と同じ
PHPで改行処理するには？

Webページの作成をするうえで、文章の改行をしたい場面はたくさんあることでしょう。
今回は、PHPでの改行処理方法をご紹介いたします。


#brタグ
PHPで改行する際に、**brタグ**を使うことが多いです。

```
<?php

echo "山田" <br />;
echo "山本";

?>
```

このように記入するだけで、

```
山田
山本
```
と表示させることができます。

##nl2br関数
文章を自動で改行させたいときは、**nl2br**を使うのがおすすめです。
これを使用することで、brタグが挿入されて改行されます。

```
<?php

echo "こんにちは";
echo nl2br("/n");
echo "ありがとう";

?>
```
このように表示すると、下記のようになります。

```
こんにちは
ありがとう
```
ラムダ式でHamcrestのMatcherを書けるようにする

JUnit+HamcrestでJavaのテストを実装していると、assertThatメソッドの第2引数をラムダ式で実装したくなる場合があります。ただ、assertThatの第2引数の型はorg.hamcrest.Matcherの為、Java8のラムダ式には対応していません。(Hamcrest 2.1はJava7でビルドされている為)

ラムダ式で値の検証を実装する方法を考えてみました。

## テストの実装イメージ

以下のプログラムは、検証対象のメソッドが0以下であるかを確認するテストです。
指定の値より小さい場合のMatcherはhamcrestで提供されていますが、ここではあくまでサンプルということで…。

~~~java
@Test
public void testSum() {
    // 値が0以下かどうかをテストする
    assertThat(new App().sum(10, -20), is(matches(i -> i <= 0, "negative value")));
}
~~~

## 効果的な利用場面

- 比較条件が数個の場合。例えば、1,2,3,4のどれかに一致するかを検証する等
- オブジェクト内のプロパティの比較をequalsメソッド以外のメソッドで実装したい場合
- 検証方法は単純だが、検証するオブジェクトのクラスが大量にある場合。  
  カスタムMatcherのクラスをオブジェクト単位に作成するには手間がかかり過ぎると見込まれる場合。

## 実現方法

以下のようなカスタムMatcherを実装します。そのカスタムMatcherをstatic importすれば、上記のようなコードを実装できます。

~~~java
import java.util.function.Predicate;

import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher;

public class LambdaMatcher<T> extends TypeSafeMatcher<T> {

	private Predicate<T> predicate;
	private String message;

	public LambdaMatcher(Predicate<T> predicate, String message) {
		this.predicate = predicate;
		this.message = message;
	}

	@Override
	public void describeTo(Description description) {
		description.appendText(this.message);
	}

	@Override
	protected boolean matchesSafely(T item) {
		return this.predicate.test(item);
	}

	public static <T> Matcher<T> matches(Predicate<T> predicate, String message) {
		return new LambdaMatcher<>(predicate, message);
	}
}
~~~

なお、messageをString型で呼出元から受け取る方式にしていますが、Supplier\<String\>型にするとJUnit5のAssertionsクラスのような使い方もできます。

Hamcrestでラムダ式を使ってテストしたい場合の参考になれば幸いです。

## 備考
- 2018/12/31 コメントで指摘があったので、実現方法のコードを修正しました。ありがとうございました。
DB設計　サロゲートキーとナチュラルキー

DB設計を行う際にサロゲートキーとナチュラルキーはどちらが良いのか？
ナチュラルキーはPKだとJOINが面倒なので主キーにしたくない。
サロゲートキーは可読性がよくない。
といった感じで、DBのキーに関してはよく論争することがあります。
私もとある現場でナチュラルキーでDB設計を行ったところ、「古いね～」って言われました。
そんな経緯もあって、サロゲートキーとナチュラルキーについて、調べてどちらがいいのか考えてみました。

ナチュラルキー(自然キー)
----
業務的にそのテーブルをユニークにしキーそのものに意味が含まれているものをナチュラルキーと言います。
簡単に言いますと入力データ自体をPKとした場合、PKはナチュラルキーとなります。

以下の表から社員マスタテーブルの社員コード(PK)のように、業務的に意味のあるキーがPKとなっている場合、ナチュラルキーと言います。
（※キーになる項目に対して意味のあるルール決めを行わないといけない。）

社員マスタ

|社員コード(PK)|社員名|
|---------|------|
|syain01|〇〇 太郎|
|syain11|〇〇 次郎|
|syain12|〇〇 三郎|
|syain20|〇〇 カツオ|
|syain37|〇〇 花子|


サロゲートキー(代理キー)
----
システム的にユニークな値になるようにDB設定等にてオートインクリメントで連番を設定している、テーブルのPKのことをサロゲートキー（代理キー）と呼びます。
このPKに関してですが、あくまでユニークになる連番なので、業務的は意味を持つ値ではありません。

以下の表から、システム上ユニークになるように連番を設定したID（PK）をPKとしている場合、サロゲートキーと言います。

社員マスタ

| ID (PK)|社員コード|社員名|
|:--:|---------|------|
| 1|syain01|〇〇 太郎|
| 2|syain11|〇〇 次郎|
| 3|syain12|〇〇 三郎|
| 4|syain20|〇〇 カツオ|
| 5|syain37|〇〇 花子|


ナチュラルキーとサロゲートキーどちらを使う？
-----
ここが問題になってくると思います。
ナチュラルキーとサロゲートキーはどちらが優れているというものでは無いです。
サロゲートキーは、システム開発においての一つの思考であり業務的には必ずしも必要ではないです。
しかしながらナチュラルキーだけではシステム開発をする上で、どうしても難しく解決が困難な事が多々あると思います。
それぞれのメリット・デメリットを理解し適切なDB設計をすることが大事です。

サロゲートキーの特徴
----
1. テーブル間の依存関係が希薄
サロゲートキーの場合、業務の変更により主キーの体系が変化した場合などの影響が少ないです。
ナチュラルキーの場合、参照する様々なエンティティに影響が生じるため影響が大きいです。

2. 画面間引き継ぎの情報や実装などを統一できる
全てのテーブルでサロゲートキーとしてIDを持った場合、削除や更新など全ての処理でその行に対する処理をIDで行うことが可能です。
ナチュラルキーの場合、特定のキーが必要となりますが、異なるテーブルでは一意と特定する為に必要なキーが異なります。
全てのテーブルでサロゲートキーとしてIDを持つなどすると、必要なキーは統一され、画面間で引き継ぐ情報や実装を統一することが可能ですが、それが一概に良いとは言えません。
コードを自動生成するツールを作る場合など、実装を容易にするという面では良いかもしれません。

3. 複合主キーのテーブルに比べSQLの条件が簡潔に実装できる
ナチュラルキーを複合主キーとして使った場合、主キーに対するあらゆる操作が複雑になります。
サロゲートキーの場合、1項目でレコードを一意に特定することが出来るという点でSQLを簡潔に記載することが出来ます。

4. 業務上は意味のないキーなので、容量を余分に使ったりする  
サロゲートキーは業務上必要なものではないので、DBの容量などを考えると余分な容量を使うことになります。
DBの容量によるコストやパフォーマンスなどを考慮するとデメリットとなります。

結果として
---
サロゲートキーの特徴が主となってしまいましたが、必ずしもサロゲートキーが良いというわけではないと思います。
ナチュラルキーは業務上必要な項目なので必ずテーブルに持つことになり、データの解析性などを勘案するとメリットも高いのもありますし、サロゲートキーのように業務上必要ではない項目とはいえシステム設計を行う上で考慮することも出てくると思います。
一つのことに固執することなく、柔軟に使い分けてより良いDB設計を行なえればと思います。
【Swift】絵文字もエンコード / デコードできる👍

空白や記号だけでなく、**絵文字もエンコード・デコードできる**👀🎉

#エンコード

```Swift
var text = "www.hogehoge.co.jp/空白　記号〜「】★♪　絵文字😄⭐💖"
text = text.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
let url = URL(string: text)
print(url)
```
↓
<img width="700" alt="スクリーンショット 2018-12-31 1.39.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/112818/9ff8c294-814b-5991-dfa5-007762706364.png">



# デコード

```Swift
let decodedString = text.removingPercentEncoding!
print(decodedString)
```
↓
<img width="500" alt="スクリーンショット 2018-12-31 0.53.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/112818/0c8b13f2-febd-399f-9ae8-e219098b5007.png">
🎉🎉🎉
RakWireless RAK811 LoRa Tracker Board & WisTrio LoRa Tracker RAK5205　新旧比較　

RAK WirelessのRAK811 LoRa Tracker Boardの新旧が揃ったので比較してみました。
RAK811 LoRa Tracker Board
WisTrio LoRa Tracker RAK5205
ギフトボックス（箱）が段ボールからプラスティックに変わりました。
![Lora-Tracker-1-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/dc03426a-524b-e0b4-941e-b0c589d82e05.jpeg)
さらに、付属品が綺麗な袋に入っています。
質感がすごく良くなっています。
旧バージョンに入っていなかったバッテリー用のPHコネクターケーブルが付属しています。
![Lora-Tracker-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/1b8507d3-77f8-1778-831c-364603ed8638.jpeg)

基板比較です。
新バージョンは96ボード規格になったためにサイズが大きいです。
最小時の待機電流が旧バージョン200uAに対して、新バージョンは14.5uA(スリープモード）と言う大きな違いがあります。
これは、GPSを止める事ができるかという違いです。
（GPSはローパワーモードなりに出来ないと大電流を消費します）

充電池は、18650なりをPHコネクターにて使用します。
ソーラーパネルの使用も可能な設計になっているようです。

新旧比較して思うことはGPSアンテナが、ホイップアンテナでは無いこと。
私が自社で販売する時はホイップアンテナにするだろうな・・・
![Lora-Tracker-1-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/4e4d6b6c-45f3-f83f-c899-d8f98855975e.jpeg)
![Lora-Tracker-1-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/67752f2c-065e-3284-7ec2-4269684b5b89.jpeg)

ブロック図から確認するに
GPSモジュールL76-LをTPS27082L（ロード・スイッチ）をPA15のピンでコントロールしています。
GPSは位置情報の収集には数分から数十分かかります(15分程度）
＊俗にコールドスタート、ホットスタートと言います。
ホットスタート可能なモジュールでなければ、即座に正確な位置情報を収集する事が出来ない為、GPSモジュール選びが重要になってきます。
Java JDK install

# 環境

CentOS 7

以下を参考に。
https://weblabo.oscasierra.net/java-install-oracle-jdk9-centos7/

https://docs.oracle.com/javase/jp/8/docs/technotes/guides/install/linux_jdk.html#BJFJHFDD

# sbt インストール

## `tar` コマンド

https://hydrocul.github.io/wiki/commands/tar.html

```
## アーカイブ
$ tar cvf tarファイル名 アーカイブ対象ディレクトリ

## 圧縮してアーカイブ
$ tar cvzf tgzファイル名 圧縮対象ディレクトリ

## 展開
$ tar xvf tarファイル名

## 解凍して展開
$ tar xvzf tgzファイル名

## 特定のファイルのみ解凍して展開
$ tar xvzf tgzファイル名 ファイルパス

## アーカイブされているファイルの一覧
$ tar tf tarファイル名

## 圧縮してアーカイブされているファイルの一覧
$ tar tzf tgzファイル名
```

# 実行してみた

```:vagrant@localhost
# sbt
[warn] No sbt.version set in project/build.properties, base directory: /home/vagrant/scala
[info] Set current project to scala (in build file:/home/vagrant/scala/)
[info] sbt server started at local:///home/vagrant/.sbt/1.0/server/a2cfb8549037a8ff30e7/sock
sbt:scala> run
[info] Updating ...
[info] Done updating.
[info] Compiling 1 Scala source to /home/vagrant/scala/target/scala-2.12/classes ...
[info] Non-compiled module 'compiler-bridge_2.12' for Scala 2.12.7. Compiling...
[info]   Compilation completed in 17.128s.
[info] Done compiling.
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.protobuf.UnsafeUtil (file:/home/vagrant/.sbt/boot/scala-2.12.7/org.scala-sbt/sbt/1.2.7/protobuf-java-3.3.1.jar) to field java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of com.google.protobuf.UnsafeUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
[info] Packaging /home/vagrant/scala/target/scala-2.12/scala_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running Hello
Hello, World!
[success] Total time: 25 s, completed 2018/12/30 16:59:35
```
pythonでシステムトレードやるための環境構築について

#自己紹介

この度Smart Tradeでインターンすることになったゴンです。

ゴンについて、知りたい方はこちら。

https://www.investor-gon.com/

初めての記事はこちら(QuantXを初めてみて)
https://qiita.com/investor-gon/items/2b1952ae5c2c88334c74

#目標

**pythonを使って、株価や為替の価格の分析、予想がしたい**。

株も為替もpython対応がかなり少ない。

そのための**プラットフォーム**を探す。



##日本株
![6a0609f4e61da3ad1bc22740df897832.png](https://qiita-image-store.s3.amazonaws.com/0/332034/081cd487-a90d-f6e4-2c6b-7ef5021c593d.png)

Quantx
https://factory.quantx.io/

##米国株
![626756da2b52c568126dd9185ae6f717.png](https://qiita-image-store.s3.amazonaws.com/0/332034/db71e25f-0d73-4a2d-9a6e-54cecf3c01ed.png)

Quantopian
https://www.quantopian.com

##為替
![スクリーンショット 2018-12-31 0.04.44.png](https://qiita-image-store.s3.amazonaws.com/0/332034/7e8c0b19-83f0-8b6b-e346-ec9de5c85c56.png)

Oanda　japan

api　ver1だったり、25万口座に必要だったりと、色々と面倒ではあるが、ここしかない。


為替レートを取得して、apiを動かす感じになる

為替の取得方法はこちら
http://www.algo-fx-blog.com/fx-api-rate-streaming-python/

役立つチュートリアルはこちら
http://www.algo-fx-blog.com/fx-api-complete-guide-for-python-users/
MacでのSDカードフォーマットで沼ったときのメモ

年末、金も友達も持たない初心者が、年末の掃除もせず、部屋の片隅で埃を被っていたラズパイを起動させようとして、SDカードをフォーマットする段階で2時間ほど沼った。

こんなことで2時間ほども時間をロスしたのか……と頭を抱えたので、手順と沼ポイントをメモ。
<br>
<br>

<b>手順</b>
1.SDカードをMacに差し込む

２.コマンドでSDカードのパスを確認
 diskutil -list

3.diskutil UnMountDisk /dev/デバイス名

4.diskutil eraseDisk フォーマット　パーティション　/dev/デバイス名　

5.sudo dd bs=1m if=/Users/ユーザフォルダ/Downloads/イメージファイル of=/dev/デバイス名
<br>
<br>

<b>沼ポイント</b>
・MountDiskをMnt または　Mountと記述

・diskutil eraseDisk MS-DOS /dev/デバイス名　
MS-DOSをMS-Dosと記述

・MS-DOSのパーティション名を漢字（名称未設定）のままでフォーマット。
→アルファベット小文字でもダメだった
→アルファベット大文字でやっと成功
（なお、ここでフォーマットを選択しないと、HFS+になる。
　MBR）

・ddコマンドを使うとき、of=/dev/デバイス名を指定し忘れて大変なことになった。（Terminalに文字化けのコードがずらずらと表示されて心底ビビった）
Vimの非同期コードチェッカーaleで表示をかたつかせない方法

# Vimでaleを使っていると表示がガタガタする

aleに限らない話ですが左側にエラーなどを知らせる表示がでるプラグインを使用していると以下のような感じで画面全体が揺れ非常にコーディングがしにくくなります.
![Peek 2018-12-30 23-20.gif](https://qiita-image-store.s3.amazonaws.com/0/296000/385c02e9-9238-fa95-38b9-a6934a1572e1.gif)
上記の例だとエラーマークが出たり消えたりでコーディングに支障をきたします.

# 改善方法
vimはIDE用に左カラムに記号などを表示できるようになっていてaleなどはそれを使っています.この機能はsingというそうです.
そこでvimのsignの日本語ドキュメントを読むと

>ファイルに対して目印が定義されると、Vimは自動的に表示画面に2文字分のカラムを付
け加える。全てのサインが取り除かれるとそのカラムは再度消滅する。この動作は
'signcolumn' オプションにより変更可能できる。

(https://vim-jp.org/vimdoc-ja/sign.html より引用)

そこでsigncolumnのoptionを変更します.(.vimrcやdein.tomlのaleの部分にでも追加してみてください)
```set signcolumn=yes```

これで画面全体が揺れるような自体にならずにすみます.
☓が表示されても左側のcolumnが引っ込まずにいてくれます.
![Peek 2018-12-30 23-41.gif](https://qiita-image-store.s3.amazonaws.com/0/296000/a6a638ab-9f9b-1ab9-b35c-1d7b25eadeac.gif)
ColaboratoryでSeleniumが使えた：JavaScriptで生成されるページも簡単スクレイピング

（2019年3月に新たに発生したエラーをご報告いただきましたので、2019/3/24に更新、また動くことを確認しました。）

##実際に動いたコード

[Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)で[Selenium](https://www.seleniumhq.org)を動かす方法を探している人のために、2018年12月現在、動いたコードを貼っておきます。上から順にColaboratoryのコードセルに貼っていくだけです。これでJavascriptで生成されるページのスクレイピングもColaboratoryで簡単にできます。 それ何、と思った人は、この下に背景などを書きましたので、ご覧下さい。便利ですよ！

```python
#Chromiumとseleniumをインストール
#「!」印ごとColaboratoryのコードセルに貼り付けます。
!apt-get update
!apt install chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium
```
```python
#SeleniumとBeautifulSoupのライブラリをインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
```
```python
# ブラウザをheadlessモード（バックグラウンドで動くモード）で立ち上げてwebsiteを表示、生成されたhtmlを取得し、BeautifulSoupで綺麗にする。
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
driver = webdriver.Chrome('chromedriver',options=options)
driver.implicitly_wait(10)
driver.get("https://スクレイピングしたいサイトのURL")
html = driver.page_source.encode('utf-8')
soup = BeautifulSoup(html, "html.parser")
print(soup.prettify())
```
あとは、HTMLタグを確認して欲しい内容を拾っていくなど[普通のスクレイピング](https://note.mu/daikawai/n/nc73889d6d835?magazine_key=m39b96e4f43ee)と手順は同じです。

##背景

保険スタートアップの[justInCase](https://justincase.jp)にはいろんな人がパートタイムでお手伝いに来てくれています。先日、CTOの@hkzmが、お手伝いに来て下さっているExcelの達人にPythonでデータ解析をやって頂こう、ということで[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を紹介していました。横で眺めていて、Colaboratoryは設定なしでお手軽にPythonが使えるというだけでなく、Google Team Driveで共有できるので便利だということを知りました[^1]。　ちょうど業務で、手でコピペしてたら死ぬ、という案件がありましたので、早速スクレイピングに使ってみることにしました。

##おさらい：ColaboratoryでPythonを使った普通のスクレイピング
1件目は普通のスクレイピングで問題なく出来ました。ColaboratoryでPythonを使ってスクレイピングする方法には初心者向けの素晴らしい[良記事](https://note.mu/daikawai/n/nc73889d6d835?magazine_key=m39b96e4f43ee)がnoteにあって、本当に書いてある通りやれば私にもさくさく出来ました。大変おすすめです。

##問題発生：javascriptで生成されるサイト
ところが、あるサイトが同じやり方では中身が取れないのです。どうやらjavascriptで生成されるサイトは、普通のやり方では出来ないようなのでした。で、色々調べた結果、Seleniumというライブラリを使えば出来そうだったのですが、あちこちで紹介されていたコードとColaboratoryでは相性が悪いのか、なかなかうまく行かず。Qiitaでも上手く行かない報告がいくつか上がっていたりしました。サポートが終了してレポジトリがアーカイブされているらしいphantomJSというwebDriverを使うやり方は見つかりましたが、今から幽霊ドライバー:ghost:を使うのはちょっとためらうかも。。。

##解決策発見
で、探しまくって、stackoverflowで今月に回答されたやり方[^2]でようやく動きました。　それが上に書いたコードです。このやり方だと、PhantomJSも使用しません。

なお、スクレイピングをするときは、本当に必要な情報だけを相手のサイトにご迷惑をおかけしないで取得するよう、[用法・容量](https://qiita.com/nezuq/items/c5e827e1827e7cb29011)を守ってやりましょう。Enjoy!

[^1]: Team Driveを使うにはチームでGsuiteを使っている必要があります。[Gsuite](https://gsuite.google.com/intl/ja/landing/partners/referral/trial.html?utm_source=sign-up&utm_medium=referral&utm_campaign=apps-referral-program&utm_content=O7136RI)のサイトから入って、次のプロモーションコードを入れると、Gsuite Businessプラン初年度の利用料金が20%引きになります。  T4UQLVFADL9FLR4 
[^2]: https://stackoverflow.com/questions/53532060/webdriverexception-message-service-content-chromedriver-unexpectedly-exited
↩
SNSをつくるときのテーブル設計

とりあえず最低限のデータベースとしてテーブルを考えてみました。

## テーブルuser
- user_id (ユーザーを識別するための一意の文字列)
- user_name (表示用の名前)
- encrypted_password (復号できない暗号化された文字列)
- description (自己紹介の文字列)
- mail_address (アカウント作成時やプロモーションメール送信などで利用するメールアドレス)
- profile_picture_path (アイコン画像のパス)
- num_data (投稿数)
- num_following (フォロー数)
- num_followed (フォロワー数)
- num_favorite (いいね数)
- num_list (作成したor保存したリスト数)
- created_at (アカウントを作成した日時)
- updated_at (アカウントを更新した日時)

```
CREATE TABLE  `hryshtk_sns`.`user` (
`user_id` BIGINT UNSIGNED NOT NULL ,
`user_name` TEXT NOT NULL ,
`encrypted_password` TEXT NOT NULL ,
`description` TEXT NULL ,
`mail_address` TEXT NOT NULL ,
`profile_picture_path` TEXT NOT NULL ,
`num_data` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`num_following` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`num_followed` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`num_favorite` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`num_list` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`created_at` DATETIME NOT NULL ,
`updated_at` DATETIME NOT NULL ,
PRIMARY KEY (  `user_id` )
) ENGINE = MYISAM
```

## テーブルdata
- data_id (投稿を一意に識別する数字)
- user_id (ユーザーを識別するための一意の文字列)
- message (投稿内容)
- media_type (メディアの種類。画像や動画など)
- media_path_01 (メディアのパス)
- media_path_02 (メディアのパス)
- media_path_03 (メディアのパス)
- media_path_04 (メディアのパス)
- reply_count (リプライ数)
- retweet_count (シェア数)
- favorite_count (いいね数)
- source (ブラウザ情報)
- remote_address　(投稿元のIPアドレス)
- created_at (投稿を作成した日時)
- updated_at (投稿を更新した日時)

```
CREATE TABLE  `hryshtk_sns`.`data` (
`data_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` BIGINT UNSIGNED NOT NULL ,
`message` TEXT NOT NULL ,
`media_type` TEXT NULL ,
`media_path_01` TEXT NULL ,
`media_path_02` TEXT NULL ,
`media_path_03` TEXT NULL ,
`media_path_04` TEXT NULL ,
`reply_count` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`retweet_count` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`favorite_count` BIGINT UNSIGNED NOT NULL DEFAULT  '0',
`source` TEXT NOT NULL ,
`remote_address` TEXT NOT NULL ,
`created_at` DATETIME NOT NULL ,
`updated_at` DATETIME NOT NULL
) ENGINE = MYISAM
```
HTML5のドラッグ＆ドロップ機能を使う際の注意点

# draggable="true" が効かない！
こんな地雷を踏むとは思いませんでした…TT

## FireFox
dragstart に充てたリスナーが受け取るeventにdataTransferというオブジェクトが入っています。こいつにsetDataというメソッドがあり、これにデータを入れないと、ドラッグしたと判定してくれません。

下記のように、ダミーでもいいのでデータを入れてしまうのは一つの解決策になります。

~~~javascript
document.getElementById("anyDragItem")
.addEventListener("dragstart", (e) => e.dataTransefer.setdata("text", "dummy"))
~~~

## chrome
dragstart に充てたリスナーが event.preventDefault() を実行すると、ドラッグしたと判定してくれなくなりますので、そこさえ注意していれば問題ありません。
環境変数MAVEN_HOMEは指定不要 (v3.5~)

maven バージョン3.5以降からは、インストール時に環境変数 MAVEN_HOME を指定しなくてもよくなりました。これは実行時にスクリプトの中でmavenがインストールされているフォルダを判断できるように修正された為です。

世の中のサイトでは MAVEN_HOME や M2_HOME, MVN_HOME(?)等が必要と記載されたページもありますが、v3.5以降では必ず指定しないといけない環境変数はJAVA_HOMEだけになっています。

[Install Apache Maven](https://maven.apache.org/install.html)

## 参考 - mvn.cmdのコメント

以下は、バージョン3.6の場合の引数の説明です。windowsで実行する場合に参考にしてください。

~~~bat
@REM -----------------------------------------------------------------------------
@REM Apache Maven Startup Script
@REM
@REM Environment Variable Prerequisites
@REM
@REM   JAVA_HOME          Must point at your Java Development Kit installation.
@REM   MAVEN_BATCH_ECHO  (Optional) Set to 'on' to enable the echoing of the batch commands.
@REM   MAVEN_BATCH_PAUSE (Optional) set to 'on' to wait for a key stroke before ending.
@REM   MAVEN_OPTS        (Optional) Java runtime options used when Maven is executed.
@REM   MAVEN_SKIP_RC     (Optional) Flag to disable loading of mavenrc files.
@REM -----------------------------------------------------------------------------
~~~

## 参考 - mvnのコメント

以下は、バージョン3.6の場合の引数の説明です。Unix等で実行する場合に参考にしてください。

~~~shell
# -----------------------------------------------------------------------------
# Apache Maven Startup Script
#
# Environment Variable Prerequisites
#
#   JAVA_HOME       Must point at your Java Development Kit installation.
#   MAVEN_OPTS      (Optional) Java runtime options used when Maven is executed.
#   MAVEN_SKIP_RC   (Optional) Flag to disable loading of mavenrc files.
# -----------------------------------------------------------------------------
~~~
孤独のスクラム-個人開発でのgithub運用-

# 孤独にスクラム

個人開発をしているとチームで開発しているときと違って別に運用ルールを決めなくても好きに開発できてしまいます。むしろそれが好きで個人で開発している人もいると思うんですが、個人でも開発をスムーズにやりたい、タスクをもっとスマートに管理したい、あれってどんな実装したんだっけ？とかが増えてきました。個人的に

- 個人開発でもリズムをもって開発したい
- 実装内容のアーカイブ
- 作りたいもののスケジュール、タスク管理

をしたいなと思って個人開発でどういう運用がいいのか考えてみました。

# 孤独のスクラムの目的

孤独のスクラムはチーム開発で行っているスクラムとは目的を別にします。チームでの共有や見直しではなく、複数レポジトリをまたぐバックログの生成とそのログの振り返りやすさを重視します。そういう意味では厳密にはスクラムじゃないんですが僕が孤独のスクラムという言葉を使いたいのでここではスクラムといい切ることにします。ちなみにスクラムの下記を抽出してきています。

- かんばん方式
- バックログ

スクラムの肝であるチームでの運用見直し（スプリントでの見直し）などは相手がいないのでもちろんなし！（悲しい）

孤独のスクラムでは下記を目的に運用します

- やりたいことの整理（バックログの生成）
- かんばん方式で複数のプロジェクトを俯瞰してみる
- 実装内容をあとで振り返りやすくする

## あとからどう実装したのかを見れるように

「実装内容をあとで振り返りやすくする」これが一番肝かなと思っていて個人開発でめんどいのが昔書いたコードでどうやって動いているのか思い出せない場合です。めんどい。まじで。いくつも趣味的にコードを書いているとまじで思い出せない。これ誰書いた？ってなってしまうので辿れるようにしたいというのが一番のモチベ。

## 複数のレポジトリを横断してみたい

次が複数のプロジェクトを一人で書くので複数レポジトリのissueを横断的に見たい。会社だとむしろ分業されて１つのレポジトリばかり見る人が多いかもだが個人での活動は複数にまたがる人も多いはず。これを一括管理したい。

# 実際の運用方法

## 実装方法を残すための運用

issueにはある程度まとまった機能単位で書いて、commit自体は細かく切る。issueにcommitのidをコピペしてそのcommitで参照したドキュメントや記事もissueに記載しておく。そうするとあの機能ってどう実装したっけ？が振り返りできる。

![スクリーンショット 2018-12-30 17.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/193389/30d3dbe9-4db4-df44-6618-c6f78374cf70.png)

単発のcommitならこれくらいのシンプルなもの

![スクリーンショット 2018-12-30 17.52.02.png](https://qiita-image-store.s3.amazonaws.com/0/193389/c3250ceb-9f85-e62a-d5d8-9fb50cfde98a.png)

## 横断運用のためにzenhub運用

zenhubってそもそも何やねんという人はこのページを見よう。

https://www.zenhub.com/

![スクリーンショット 2018-12-30 17.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/193389/645b94d2-1425-1d47-8768-072fab652aaa.png)

zenhubを導入すると複数のレポジトリを一つのカンバンで管理することができる。

![スクリーンショット 2018-12-30 17.58.21.png](https://qiita-image-store.s3.amazonaws.com/0/193389/53324304-f9db-f9fe-a9f3-e22fa5e012ac.png)

(チェックを付けたレポジトリのissueだけ見れる)

結構コードをいろいろ書きたいけどissueの管理が大変になってきて、でもレポジトリわざわざ開くのめんどくせー、githubのprojectはレポジトリ内のissueしかかんばん方式に管理できねー。となってこの形式を取ることにした。

# アドバイス求む！

と、いろいろ書いてみたが。正直個人開発の運用これでいいのかなーと悩んでいる。でもこれ考えるためにスクラムとか勉強し直したのはいい勉強になった。こうやってるよーとかこうしたほうがいいよーというのがあったらぜひ教えてくれい！
Docker 始めてみました。docker-compose 編


## overview

dockerは知っており、現場でも使っておりましたが、実際よくわかっておりませんでした。
vagrantの方が私にはわかりやすく、便利だったのでそちらを使っておりましたが、
最近になってdockerの便利さに心を打たれ使うことにしました。

## 環境

rails 5.2.2
ruby 2.5.0
OS cent os 
web server: nginx 
db: mysql5.7

上記の環境を構築します。

### docker-compose

```yml

version: '2.1'

services:
  shichimi:
    container_name: shichimi
    stdin_open: true
    build: .
    environment:
      DB_HOST_NAME: db
    links:
      - db
    volumes:
      - .:/usr/share/nginx/html
      - ./default.conf:/etc/nginx/conf.d/default.conf 
      - bundle:/bundle
    ports:
      - 3000:3000
    tty: true
  db:
    container_name: shichimi_db
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: jobs_development
      MYSQL_USER: tomy
      MYAPP_DATABASE_PASSWORD: jamjam
    volumes:
      - ./.data/mysql:/var/lib/mysql
      - ./my.cnf.local:/etc/mysql/my.cnf
    ports:
      - 3307:3306
volumes:
  bundle:
    driver: local

```

```dockerfile

FROM centos:centos6.9

MAINTAINER keisuke

ENV PATH $PATH:/usr/bin

RUN rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
RUN rpm -Uvh https://rpm.nodesource.com//pub_8.x/el/6/x86_64/nodejs-8.9.4-1nodesource.x86_64.rpm
RUN yum -y update
RUN yum -y install nginx gcc gcc-c++ git openssl-devel readline-devel zlib-devel mysql-devel wget
RUN git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
RUN wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
RUN tar zxvf gcc-7.3.0.tar.gz
WORKDIR gcc-7.3.0
RUN pwd
RUN ./contrib/download_prerequisites
RUN mkdir build
WORKDIR build
RUN ../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
RUN make
RUN make install
RUN echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
RUN echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
WORKDIR /usr/share/nginx/html
RUN source ~/.bash_profile && rbenv install 2.5.0 && rbenv rehash && rbenv global 2.5.0 && ruby -v && gem install bundler
RUN cp /usr/local/lib64/libstdc++.so.6 /usr/lib64/
CMD ["/bin/bash"]
```

こんな感じになります、webserver は　nginx なので、confファイルもマウントして使えるようにしておきます。

[git hub sample code](https://github.com/keisukeYamagishi/docker-RonR)
Rubyでメタプログラミング初歩の初歩

メタプログラミングruby( http://amzn.asia/d/72OuM6q )の古本が安かったので買ってみたらむっちゃおもしろかたのでとりあえず初歩の初歩をやってみた。

- 文字列自身が変化する
- そのための定義はjsonから読み込んでいつでも入れ替えられる

みたいなことを想定しています。

```ruby

class String
  def up_or_low(type)
    case type
    when 'upper'
      upcase!
    when 'lower'
      downcase!
    end
  end

  def substitution(params)
    gsub! params['target'], params['replace']
  end

  def head_chars(length)
    slice!(length, (self.length - length))
  end

  def if_then_else(params)
    if self == params['case']
      replace(params['then'])
    else
      replace(params['else'])
    end
  end
end

require 'json'

data = '{
  "rules" :
  [
    {
      "if_then_else":
        {
          "case" : "input",
          "then" : "output",
          "else" : "xxxxxx"
        }
    },
    {
      "up_or_low": "upper"
    },
    {
      "substitution":
        {
          "target" : "T",
          "replace" : "@"
        }
    },
    {
      "head_chars": 2
    },
    {
      "up_or_low": "lower"
    }
  ]
}'.to_json

transform = JSON.parse(JSON.load(data))

input_text = ['input', 'next']

input_text.each do |record|

  transform['rules'].each do |rule|
    # p rule
    record.send(rule.keys[0], rule.values[0])
    p ts
  end

  p '=============='
end

```

実行結果

```
"output"
"OUTPUT"
"OU@PU@"
"OU"
"ou"
"=============="
"xxxxxx"
"XXXXXX"
"XXXXXX"
"XX"
"xx"
"=============="
```
【Qiita】コピー&ペーストでExcelのオブジェクトを貼れることを発見

##コピー&ペーストでExcelのオブジェクトを貼れることを発見
今更ですが…

これまで、QiitaにExcelのオブジェクトを挿入するときは、一旦画像として保存してからこのボタンを押して画像を選択し、貼り付けていました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/e871d0d7-ca82-6f3e-51be-1bf2bc25d823.png)

Excelとかで作った図って、画像にすると少し荒れるんですね・・・
![WS000079.JPG](https://qiita-image-store.s3.amazonaws.com/0/276021/2deca5d1-67b4-683f-1a21-f39e50945a9c.jpeg)


先日、偶然にコピー&ペーストで図を貼れることを発見しました。
まるごとオブジェクトとして選択してコピー&ペーストするだけです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/276021/7590df73-a2cd-bf38-39b7-181e17302512.png)

恥ずかしながら知らなかったのですが、便利だったので共有させていただきます。
【要約】学びを結果に変えるアウトプット大全

## 1. はじめに

以下書籍の要約。

- 題名：[学びを結果に変えるアウトプット大全](https://www.amazon.co.jp/%E5%AD%A6%E3%81%B3%E3%82%92%E7%B5%90%E6%9E%9C%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B%E3%82%A2%E3%82%A6%E3%83%88%E3%83%97%E3%83%83%E3%83%88%E5%A4%A7%E5%85%A8-Sanctuary-books-%E6%A8%BA%E6%B2%A2%E7%B4%AB%E8%8B%91/dp/4801400558/ref=sr_1_1?ie=UTF8&qid=1546177462&sr=8-1&keywords=%E5%AD%A6%E3%81%B3%E3%82%92%E7%B5%90%E6%9E%9C%E3%81%AB%E5%A4%89%E3%81%88%E3%82%8B) 

- 著者：樺沢 紫苑
- 出版：サンクチュアリ出版


## 2. アウトプットの基本原則
- インプットは**読む**、**聞く**。アウトプットは**話す**、**書く**、**行動する**。
- **書いて覚える**、**声に出して覚える**ようにするだけで、**運動性記憶**として記憶することができる。運動性記憶は記憶に残りやすい。
- インプットしても、その情報を何度も使わないとすぐに忘れてしまう。脳に入力された情報は前頭葉の海馬に仮保存されるが、保存期間は2週間程。**インプットしたら、2週間で3回以上アウトプットすると記憶に残りやすくなる**。
- **インプットとアウトプットの黄金比は3対7**。(コロンビア大学のアーサー・ゲイツの研究)
- アウトプットしたあとは**フィードバック**を行い行動を修正する。なぜうまくいった？なぜ失敗した？次はどうする？を考える。
 

## 3. 科学に裏付けられた、伝わる話し方
- 話すことは最も簡単なアウトプット。話すときは**自分の意見や感想をひとつでも盛り込む**とよい。
- **悪口は百害あって一利なし**。悪口を言う人はストレスホルモンが増え、認知症になる確率が3倍になる。
- 良好な人間関係を作るのに、アイコンタクトは非常に重要。お互いの感情が伝わりやすくなり、コミュニケーションが深まる。
- **雑談は内容よりも回数が重要**。接触回数が増えるほど人の好感度は良くなる。これを**ザイアンス効果**と呼ぶ。
- 勉強を開始する前に、**「何を学びたいか」自分自身に質問する**だけで、選択的注意が働くようになり、勉強の効率が格段にアップする。
- 議論での質問はお互いの理解力が深まる。他者からの評価もあがる。**質問を考えながら話を聞く癖をつける**とよい。
- **謝る**ことはアウトプットに対するフィードバック。素直に謝れる人は結果として評価も高まる。謝らない人は「自分は悪くない」と捉えるため、自己成長に繋がらない。
- **説明する**ことはアウトプットトレーニング。過去の出来事をストーリーのように記憶すると覚えやすく忘れにくい。これを**エピソード記憶**と呼ぶ。
- **感謝**は最高の脳トレーニング。感謝すること/されることで、**ドーパミン(幸福物質)、セロトニン(癒しの物質)、オキシトシン(リラックスの物質)、エンドルフィン(脳内麻薬)**が分泌され脳、心、体にプラスの変化が起きる。**「ありがとう」**と言おう。

## 4. 能力を最大に引き出す書き方
- **タイピングよりも書く**ほうが記憶に残りやすく、アイデアも出やすい。
- アウトプットのベストタイミングは、脳が最も情報の多くを記憶している**インプットの直後**がよい。
- 上手な文章を書くには、とにかく**たくさん読んでたくさん書き出す**。書き出した文書は誰かに見てもらい、感想やアドバイスなどをもらいフィードバックする。**「読まれる」という緊張感が、集中力を高め、より良い文章を書くことへの刺激になる**。
- 文章を早く書くコツは、**「時間を決めて書くこと」「文章の構成を決めてから書くこと」**。
- **要約は読解力のトレーニング**になる。Twitter(140文字以内)などを使って本や映画の感想をつぶやくことで、簡単に要約のトレーニングができる。
- **絵や図などの「視覚」を使って説明**することで、理解しやすく記憶にも残りやすくなる。視覚を使うと、文章だけの説明に比べて6倍以上記憶に残りやすくなる。
- **書くという行為を楽しくする**ために、ペン、ノート、マウス、キーボードなどは徹底的にこだわる。

## 5. 圧倒的に結果を出す人の行動力
- インプット/アウトプットしても、**実際に行動しないと意味がない**。行動しなければ自己成長ではなく自己満足しているだけ。
- **結果を出すための成功法則は続けること**。続けるための極意は以下。
 - **5分でいいのでとにかく始める**。やる気が出たら始めようという考えはNG。やる気は後からついてくる。
 - **楽しみながら実行する**。楽しさを発見する。楽しいと記憶力とモチベーションがアップする。
 - **目標を細分化する**。(10キロダイエットではなく、1ヶ月で1キロダイエット)
 - **成果を出したときのご褒美を用意する**。ドーパミンが分泌される。
Github ではもはやそのまま Excel / Spreadsheet の表を貼り付けられる件

## 背景

試しにやってみた所、出来ました。意外と認知されていなさそうなので、記載。

## 方法

以下のような Spreadsheet があったとして
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142932/917e2fe8-8816-fa2a-d3b5-5e96c2136e70.png)

そのままコピーして、issue本文に貼り付けると、勝手に markdown 形式になる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/142932/595ee2d6-82b7-2698-a4b4-c5db71499aaf.png)


## 参考リンク

先人たちの苦心した歴史。デフォルトで出来るようになりました。

- [Excelの表をMarkdown形式に変換](https://qiita.com/QUENCH/items/d77d0983d4a6d9d7de8e)
- [エクセルからのコピペでMarkdownの表作成(TSV or CSV to md)](https://qiita.com/ykhirao/items/03f1e886af5493755ae2)
Mojaveにアップデートしてからやった事(暫定)

#背景
Mojaveに上げたら画面見辛くなったりgit使えなくなったり大変じゃー．
「よく分からないけど，これやったら解決したよ」ってのを載せます．

#まずxcodeを再インストールしよう
恐らくgitもg++も何もかも使えなくなってると思います．
Google先生とbrew doctor先生に聞いた所，同じ回答を頂きました．
以下コマンドをターミナルで叩きます．

```
$ xcode-select --install
```

#画面見辛いのを治す
フォント関係の設定が色々変わって見辛いので，以前のを復活させます．

```
$ defaults write -g CGFontRenderingFontSmoothingDisabled -bool NO
```

#g++でコンパイルしたら怒られる
wchar.hをコード内でincludeしなくても怒られます．

```
In file included from /usr/local/Cellar/gcc/8.1.0/include/c++/8.1.0/bits/postypes.h:40,
                 from /usr/local/Cellar/gcc/8.1.0/include/c++/8.1.0/iosfwd:40,
                 from /usr/local/Cellar/gcc/8.1.0/include/c++/8.1.0/ios:38,
                 from /usr/local/Cellar/gcc/8.1.0/include/c++/8.1.0/ostream:38,
                 from /usr/local/Cellar/gcc/8.1.0/include/c++/8.1.0/iostream:39,
                 from a.cpp:1:
/usr/local/Cellar/gcc/8.1.0/include/c++/8.1.0/cwchar:44:10: fatal error: wchar.h: No such file or directory
 #include <wchar.h>
          ^~~~~~~~~
compilation terminated.
```
gccを再インスコしたら治りました．
brewを使っている方は以下コマンドでいけます．

```
$ brew reinstall gcc
```

#おわりに
今後も色々とボロが出てくると思うので，発見次第追記します

#関連記事
[「macOS Mojave」でフォントが汚い・見づらい・ボヤける問題の対処法](https://gori.me/mac/mac-tips/110780)
[CLionでwchar.hがないと言われ、コンパイルできなくなってしまいました。](https://teratail.com/questions/149420)
NuxtでYouTubeプレイヤーを埋め込む

VueでYouTubeプレイヤーを埋め込むのに [anteriovieira/vue-youtube](https://github.com/anteriovieira/vue-youtube) というライブラリがあるのでNuxtではこれを読み込んで使えばOK。

YouTubeが[iframe 組み込みの YouTube Player API](https://developers.google.com/youtube/iframe_api_reference)を提供していて、それを実装した [gajus/youtube-player](https://github.com/gajus/youtube-player) というのがあり、それを [anteriovieira/vue-youtube](https://github.com/anteriovieira/vue-youtube) が組み込んでいる形。
ちょっと、ややこしいですね。


## 実装
動作を確認できるデモページを用意しました。
https://nuxt-playground.netlify.com/plugins-sample/vue-youtube/

ポイントとしては、
playVideo や pauseVideo なんかのコントロールは [iframe APIの再生制御](https://developers.google.com/youtube/iframe_api_reference#Playback_controls)がそのまま使える。
play や pause なんかの[iframe APIのイベント](https://developers.google.com/youtube/iframe_api_reference#Events)はemitで発火するようです。


```vue:pages/plugins-sample/vue-youtube.vue
<template>
  <div>
    <h1><a href="https://github.com/anteriovieira/vue-youtube">vue-youtube</a></h1>
    <youtube
      ref="youtube"
      :video-id="videoId"
      @ready="ready"
      @ended="ended"
      @playing="playing"/>
    <button @click="playVideo">play</button>
    <button @click="pauseVideo">pause</button>
    <button @click="stopVideo">stop</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      videoId: 'nteDXuqBfn0'
    }
  },
  computed: {
    player() {
      return this.$refs.youtube.player
    }
  },
  methods: {
    playVideo() {
      this.player.playVideo()
    },
    pauseVideo() {
      this.player.pauseVideo()
    },
    stopVideo() {
      this.player.stopVideo()
    },
    ready() {
      console.log('ready')
    },
    ended() {
      console.log('ended')
    },
    playing() {
      console.log('playing')
    }
  }
}
</script>
```

```js:plugins/vue-youtube.js
import Vue from 'vue'
import VueYoutube from 'vue-youtube'

Vue.use(VueYoutube)
```
重複ファイルを削除（Ubuntu)

データファイルやピクチャファイルなどをコピーしすぎたために
重複ファイルが増えてしまって、邪魔になる場合、
複数ディレクトリに渡って、ファイル内容を検査して、重複ファイルを消すコマンド。
ファイル名ではなく、ファイル内容で判断します。

・インストール

```
$ sudo apt-get install fdupes
```

・実行

```
$ cd PATH               # まず、ワーキングディレクトリに移る。

(0) $ fdupes -r .       # 重複ファイルリストを表示する

(1) $ fdupes -frdN .    # 最初に検索されたファイル以外をすべて削除する

(2) $ fdupes -rd .      # 対話形式で削除する

```
fdupesに、「.」の替りに、そのままPATHを指定しても良い。
詳しいオプションは、「fdupes --help」で出てきます。
SSHのパスワード認証をGUIで行う方法

SSHのパスワード認証は通常CLI上で行いますが、これを以下のようなGUIのダイアログで行う方法についてまとめます。
![Screenshot from 2018-12-31 11-00-29.png](https://qiita-image-store.s3.amazonaws.com/0/52291/1001ad86-c5c4-3de7-9198-4b64c6e34ee1.png)

# 設定
1. `echo 'if type ssh-askpass &> /dev/null; then export SSH_ASKPASS=$(which ssh-askpass); fi'  >> ~/.bashrc`コマンドを実行し、環境変数を設定します。
2. `source ~/.bashrc`コマンドを実行し、環境変数の設定を有効にします。

# ログイン方法
## パスワード認証をGUIのダイアログで行いたい場合
3. `setsid ssh username@host`コマンドを実行します。

## パスワード認証をCLI上で行いたい場合
3. `ssh username@host`コマンドを実行します。

# 参考文献
* [Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 - Qiita](https://qiita.com/kawaz/items/1b61ee2dd4d1acc7cc94)
基礎からのVMware Cloud on AWSーその４

VMware Cloud on AWSの基礎を
おさらいするための記事を書いてます。

過去３回は以下の内容をお届けしました。

第１回　物理構成の理解
https://qiita.com/hiroito1118/items/48d8d66fab24acd16c1d

第２回　管理方法と初期デプロイの概要
https://qiita.com/hiroito1118/items/8ed96c156b8577ca4749

第３回　ユースケース
https://qiita.com/hiroito1118/items/2669fc0ef64d8e07eb08


今回は実務に根差して、
ユーザが実際に調達しようと考えた場合の
調達方法に触れたいと思います。


# １．VMware Cloud on AWSの調達方法

VMware Cloud on AWSの調達では、
以下の３つの方法があります。
１）クレジットカードでの直接購入
２）SPPクレジットの購入によるデポジット利用
３）マネージドサービスプロバイダ経由の従量課金購入

一つずつ詳しく見ていきましょう。

##　１）クレジットカードでの直接購入
言葉通り、コーポレートのクレジットカードなどを使って、
Webで直接購入を行うパターンです。
この方式ではエンドユーザが直接VMware社＠米国本社から
仕入れる形になります。
その為、日本法人からのサポートは受けられない可能性が高く、
パートナーに間に入ってもらうことはできません。
また、価格についても掲載通りの金額で請求され、
一部を除き基本的な値引きはないものと考えるのが無難です。

何かしらのサポートや価格調整を期待する場合、
次にご紹介する２パータンのいずれかを選択するのが
現実的な対応でしょう。

##　２）クレジットの購入によるデポジット利用
こちらはプリペイドカードを購入するように、
事前にVMware Cloud on AWSの利用料を
購入するパターンです。

このパターンでは、予め利用規模を推測し、
必要な相当額をまとまって購入しておくことになります。
利用が予定より拡大した場合などは、
追加でクレジットを購入して調整します。

自社の利用状況と残額を把握しながら
利用する必要があり、少々面倒な面もありますが、
実際決められた予算枠内で利用しなければならないケースには
この方式でもよさそうです。
特にVMware Cloud on AWSでは起動停止が４ノード目以降しか
発生しないため、比較的にコストが
安定的になり、予測しやすい面があります。

そう考えるとこの方式でも悪くはありません。
ただし、インターネットへのアウトバウンドや
グローバルIPの追加利用などによる変動要素がある為、
一概に予測通りとならない点には注意が必要です。

また、クレジットは利用可能な期限が設定されているため、
予め大量購入しておくことができませんので、
注意が必要です。

なお、このクレジットはVMwareのパートナーで、
かつVMware Cloud on AWSに関するコンピテンシーを
取得している企業からしか購入することはできません。
AWSのパートナーにしかなっていない場合や
VMパートナーであってもコンピテンシーを満たしていないなど、
パートナーによって販売できませんので、
調達先は限られてきます。


##　３）マネージドサービスプロバイダ経由の従量課金購入
最後にご紹介するのが、従量課金で、
使った分だけあとから請求というクラウドらしい
課金の方式のご紹介です。

この方式では提供可能なマネージドサービスプロバイダが
利用実績に応じて顧客に請求をかけるというものになります。
クレジットの残額不足に慌てる必要はありません。

ちなみにマネージドサービスプロバイダ経由と記載の通り、
提供者は必ず自社のマネージドサービス（＝運用サービス）を
付加して提供します。（そういうルールになってます）
付帯するサービス内容は各社で異なる為、
実際提供されるサービス価格も当然異なります。
一つ明確なことは、マネージドサービスを利用する場合、
必ずVMware Cloud on AWSに関するサポートが
マネージドサービスプロバイダ経由となります。
本記事執筆時点では、VMware Cloud on AWSのサポートが
英語のみとなっていますので、
その点で利用のメリットがあると言えます。

なお、マネージドサービスプロバイダは、
予め該当の契約をVMwareと締結している事業者に限られます。
本記事執筆時点では、日本国内に３社だけです。
２のクレジット販売ができる事業者とも異なる為、注意が必要です。


# ２．オンデマンド利用と一定期間のコミット利用
VMware Cloud on AWSでは、
ホストを調達するにあたって、
利用に応じた課金であるオンデマンド課金と
１年もしくは３年の利用を確定する代わりに
一定の値引きが受けられる課金の２種類があります。

裏側にあるのは、AWSさんのリザーブドインスタンスですね。
結局、i3ベアメタルをリザーブドで使えば、
AWSからの仕入れが下がるので、
提供料金もその分安くします、ということです。

オンデマンドは利用時間に応じて後から課金になります。
１年や３年コミットはコミット作成の
初回に該当分を一括支払いすることになります。

VMware Cloud on AWSが初回から掲載している通り、
こまめにON/OFFできるようなものではなく、
維持するには電源を入れ続けることと、
リソース規模が一定以上大きい為、
ある程度まとまった規模のシステム群を動かし続ける必要があります。
すなわち、VMware Cloud on AWSの利用について、
多くの企業では少なくとも３ノードの範囲は、
数年レベルでコミットして使う可能性が高いということです。

そう考えると、コミットの選択肢は
EC2において仮想マシンレベルで実施する場合より
ずっと検討すべき選択肢であるということです。

そして、４ノード目以上については、
本当に必要な際に増減するという考え方に基づき、
オンデマンドにするというのが現実的かもしれません。


今回は以上です。
次回は、ハイブリッドクラウド構成を支える、
ネットワーク技術周りを取り上げます。
Mecabインストールで文字化けた場合の対処法

## この記事について

- MecabをMacにインストールしようとしたときに、結果の文字化けで躓いたのでその対処の備忘録です
- versionや日付表記の部分は適宜読み替えてください

## Mecabを素直にインストールできるパターン

[mecab公式サイト](http://taku910.github.io/mecab/#download)から、本体とIPA辞書データをダウンロードします

![mecab.png](https://qiita-image-store.s3.amazonaws.com/0/305743/cd2b580d-e6c8-b482-756e-3b2717747a0f.png)

### mecab本体をインストール

```shell
$ tar -xvf mecab-0.996.tar.gz 
$ cd mecab-0.996
$ ./configure
$ make
$ make check
$ sudo make install
```

```shell
$ mecab -v
mecab of 0.996
```

### 辞書データをインストール

```shell
$ tar -xvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure
$ make
$ sudo make install
```

### mecabを実行

- 文字化けしないパターン

```shell
$ echo "mecabで遊ぼうと思ったら文字化ける" | mecab
mecab	名詞,一般,*,*,*,*,*
で	助詞,格助詞,一般,*,*,*,で,デ,デ
遊ぼ	動詞,自立,*,*,五段・バ行,未然ウ接続,遊ぶ,アソボ,アソボ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
と	助詞,格助詞,引用,*,*,*,と,ト,ト
思っ	動詞,自立,*,*,五段・ワ行促音便,連用タ接続,思う,オモッ,オモッ
たら	助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
文字	名詞,一般,*,*,*,*,文字,モジ,モジ
化ける	動詞,自立,*,*,一段,基本形,化ける,バケル,バケル
```

- 文字化けするパターン

これに対処します

```shell
$ echo "mecabで遊ぼうと思ったら文字化ける" | mecab
mecab	̾??,??ͭ̾??,?ȿ?,*,*,*,*
?	????,????,*,*,*,*,*
??	̾??,??ͭ̾??,?ȿ?,*,*,*,*
???	????,????,*,*,*,*,*
??	̾??,??ͭ̾??,??̾,̾,*,*,??,?參,?參
??と思?	????,????,*,*,*,*,*
??	????,????ե??٥å?,*,*,*,*,??,????,????
??ら文	????,????,*,*,*,*,*
?	̾??,????,*,*,*,*,?,?̥?,?̥?
?化ける	????,????,*,*,*,*,*
```

## 文字化けする場合の対処

[こちらのページ](https://qiita.com/junpooooow/items/0a7d13addc0acad10606)でほとんど解決できたのですが、一部だけ自分の環境とは手順が違っていました

### 解決策1

まず、mecab本体と辞書をインストールする際に`--with-charset=utf8`をつけると文字化けが解消することがあります

- mecab本体

```shell
$ cd mecab-0.996
$ ./configure　--with-charset=utf8
$ make
$ make check
$ sudo make install
```


- 辞書データ

```shell
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure　--with-charset=utf8
$ make
$ sudo make install
```

自分の環境では、これでは解決しませんでした

### 解決策2

解決策1でだめな場合は、自分で辞書の文字コードを変換した上で、もう一度インストールします
mecab本体は、解決策１でインストール済みの想定です

```shell
$ cd mecab-ipadic-2.7.0-20070801
$ nkf -w --overwrite *.csv
$ nkf -w --overwrite *.def
```

`mecab-ipadic-2.7.0-20070801/dicrc`を編集

```shell
$ config-charset = EUC-JP
↓
$ config-charset = UTF-8
```

再度、辞書をインストールしたところ、よくわからないエラーが発生しました
`/usr/local/libexec/mecab/mecab-dict-index -d . -o . -f EUC-JP -t utf8`
とあるので、他にもEUC-JP→UTF-8に書き換えなければいけない箇所があるのかと迷走しました

```shell
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
/usr/local/libexec/mecab/mecab-dict-index -d . -o . -f EUC-JP -t utf8
reading ./unk.def ... iconv conversion failed. skip this entry
:
iconv conversion failed. skip this entry
0
make: *** [matrix.bin] Segmentation fault: 11
```

結論としては、`--with-charset=utf8`を付けずに、`./configure`を実行すると、エラーなくインストールできました

```shell
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure
$ make
$ make install
```

文字化けも解消されています

```shell
$ echo "mecabで遊ぼうと思ったら文字化ける" | mecab
mecab	名詞,一般,*,*,*,*,*
で	助詞,格助詞,一般,*,*,*,で,デ,デ
遊ぼ	動詞,自立,*,*,五段・バ行,未然ウ接続,遊ぶ,アソボ,アソボ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
と	助詞,格助詞,引用,*,*,*,と,ト,ト
思っ	動詞,自立,*,*,五段・ワ行促音便,連用タ接続,思う,オモッ,オモッ
たら	助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
文字	名詞,一般,*,*,*,*,文字,モジ,モジ
化ける	動詞,自立,*,*,一段,基本形,化ける,バケル,バケル
```
Vue Routerでダイアログを出す

入力値が保存されていない場合にダイアログを出したかったのですが調べていたら私のサイトの構造上はまることが多かったのでメモ（ドキュメントをよく見ろといったようなものでしたが）

特定のコンポーネント内で使用したいので[コンポーネント内ガード](https://router.vuejs.org/ja/guide/advanced/navigation-guards.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E5%86%85%E3%82%AC%E3%83%BC%E3%83%89)を使います。

## ポイント

* パラメータまたはクエリの変更は enter/leave ナビゲーションガードをトリガーしない(ドキュメントに記載　今回はupdateを設定しました)
* ブラウザの閉じる、更新ボタンはVue Router側で制御できなさそうなので別途実装する必要がある

## 実装

判定用の入力値と保存値が同じか判定するフラグはここでは`this.noticeFlag`としています。
`beforeRouteUpdate`は不要な場合は不要です。
制御可能なダイアログは[vuesax](https://lusaxweb.github.io/vuesax/development/)を使っていますが、遷移を止める場合は`next(false)`を行わないといけないということが重要です。`next()`を呼ばないだけでは止まりませんでした。

```js:********.vue
module.exports = {
    //～～～～～～～～～～～～～～～～～～～～～～～
    beforeMount() {// createdだとまだthisが使えないので
        window.addEventListener('beforeunload', this.leaveHandler);// ブラウザ閉じる機能制御
    },
    beforeRouteUpdate(to, from, next) {
        // ページ遷移制御 入力と保存に差分があったらダイアログ
        // queryの変更でトリガーする
        this.leaveCheck(next);
    },
    beforeRouteLeave(to, from, next) {
        // ページ遷移制御 入力と保存に差分があったらダイアログ
        // queryの変更ではトリガーしない
        this.leaveCheck(next);
    },
    methods: {
        leaveHandler(event) {
            // 入力と保存に差分があったらブラウザのダイアログ
            if (this.noticeFlag) {
                // event.preventDefault();
                if (event.type === 'beforeunload') {
                    event.returnValue = 'true';
                }
            }
        },
        leaveCheck(next) {
            if (this.noticeFlag) {
                // ダイアログ表示
                this.$vs.dialog({
                    type: 'confirm',
                    color: 'primary',
                    title: 'Notice',
                    text: '行った変更が保存されていない可能性があります。',
                    acceptText: 'OK',
                    accept: () => {
                        next();
                    },
                    cancel: () => {
                        next(false);
                    }
                });
            } else {
                next();
            }
        },
        //～～～～～～～～～～～～～～～～～～～～～～～
    },
    //～～～～～～～～～～～～～～～～～～～～～～～
}
```
squid.conf

# SSL接続時に443ポート以外のCONNECTを拒否                                                                                   
acl SSL_ports port 443                                                                                                     
acl CONNECT method CONNECT                                                                                                 
http_access deny CONNECT !SSL_ports                                                                                        

# 匿名化                                                                                                                    
forwarded_for off
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
# request_header_access Referer deny all                                                                                    

# 接続先ポートのホワイトリスト (とりあえず最低限)                                                                           
acl Safe_ports port 80  # http                                                                                              
acl Safe_ports port 443 # https                                                                                             
http_access deny !Safe_ports

# 許可するIP                                                                                                                
acl office src あなたのグローバルIPアドレス
http_access allow localhost
http_access allow office

# 上記のルールに一致しない場合は拒否                                                                                        
http_access deny all

# squidのポート                                                                                                             
http_port 3128

# core出力場所                                                                                                              
coredump_dir /var/spool/squid

# キャッシュ設定を無効                                                                                                      
no_cache deny all
Herokuで機械学習モデルを利用したアプリのデプロイ時の500MB制限回避策

HerokuにPytorchで学習させた機械学習モデルを利用したFlaskアプリをデプロイしたところ、500MBの容量制限に引っかかりました。
ログを見るとtorchのみで600MBほどあり、それが原因でした。
pytorchにcpuオンリー版があり、そちらは容量小さいようで、それを指定したらデプロイできました（requirements.txtの5行目）。

```requirements.txt
Flask
boto3==1.9.71
botocore==1.12.71
numpy==1.15.4
http://download.pytorch.org/whl/cpu/torch-0.4.1-cp36-cp36m-linux_x86_64.whl
torchvision==0.2.1
Pillow==4.0.0
gunicorn
```

モデル読み込みもcpu指定でおこない、普通に動いています。

```application.py
# モデル読み込み
device = torch.device('cpu')
model = torch.load('model.pth', map_location=device)
```
自分用Java基礎知識

##ドキュメント
- [Java SE API ドキュメント](https://www.oracle.com/technetwork/jp/java/javase/documentation/api-jsp-316041-ja.html)
- [Java言語仕様 (Java SE 9 Edition)](https://docs.oracle.com/javase/specs/jls/se9/html/index.html)

##制御構造
以下の構文の定義は厳密には[こちら](https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html)。

```
if (真偽値を表す式) ブロック/文
if (真偽値を表す式) ブロック/文 else ブロック/文
switch (値を表す式) { //char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type
    case 固定の値: ブロック/文
    default: ブロック/文
}
for (ローカル変数初期化式リスト; 真偽値を表す式; 式) ブロック/式
for (ローカル変数宣言 : iterableな値を表す式) ブロック/式
while (真偽値を表す式) ブロック/文
do ブロック/文 while (真偽値を表す式);
```
switch/for/while/doのブロック/式を抜けるには`break;`とする。
ラベル付きブロック/式を指定して抜けるには`break ラベル;`とする。

<details><summary>サンプル</summary><div>

```java:Sample.java
public class Sample {
	public static void main(String[] args){
		for (int i=0; i<5; i++) {
			hoge: {
				fuga: {
					if (i==1) {
						break fuga;
					} else if (i==2) {
						break hoge;
					} else if (i==3) {
						break;  //ここでforのブロックを抜けるのでi=4のブロックは実行されない
					}
					System.out.println("1");
				}
				System.out.println("2");
			}
			System.out.println("3");
			System.out.println("");
		}
	}
}
```

実行結果

```
1
2
3

2
3

3
```

</div></details>

##ドキュメント
|クラスとか|URL|
|:--|:--|
|List|https://docs.oracle.com/javase/jp/9/docs/api/java/util/List.html|
|ArrayList|https://docs.oracle.com/javase/jp/9/docs/api/java/util/ArrayList.html|
|String|https://docs.oracle.com/javase/jp/9/docs/api/java/lang/String.html|

##misc
###クラスを使うために何をimportすればよいか
APIドキュメントのページで、クラス名の2行下のあたりにある表現をimportする。
例えば、[java.nio.file.Files](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Files.html)であれば`import java.nio.file.Files`とする。