OmniAICreator/Qiita-1.07M huggingface dataset:
[Java]StaticなInnerClassでJavaConfig

## 発端は怠けゴコロ

ちょっとした動作確認で、`ComponentScan` で自クラスのパッケージ配下のすべてのコンポーネントがスキャンされるのを避けつつ、使いたいコンポーネントだけを DI コンテナに Bean 登録させたいけれど、「Bean定義ファイル」や「新しい JavaConfig クラス」を作るのが**面倒臭く**なって、勢いで動作確認したいクラスの中に書いてみたら動いてしまったでござるの巻。

```java:StaticNaInnnerClassDeJavaConfig.java
@SpringBootApplication(scanBasePackages = { "undefined.package" })
@Component
public class StaticNaInnnerClassDeJavaConfig {

    private final SomeComponent component;

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(StaticNaInnnerClassDeJavaConfig.class, args);
    }

    public StaticNaInnnerClassDeJavaConfig(SomeComponent component) {
        this.component = component;
    }

    public static class JavaConfig {
        @Bean
        public SomeComponent someComponent(@Autowired Properties properties) {
            return new SomeComponent(properties);
        }
    }

    public static class SomeComponent {
        private final String someParam;
        public SomeComponent(Properties proeprties) {
            this.someParam = properties.getProperty("someParam");
        }
    }

}
```
GitHubからGitLabへ移行しよう

#GitHubからGitLabへ移行しよう

きっかけは、Microsoftは2018年6月4日（米国時間）に、GitHubを(約75億ドルで)買収すると発表したことだ。


##1. 登録されているリモートリポジトリの確認

```
$ git remote -v
origin  git@github.com:~~~~~~ (fetch)
origin  git@github.com:~~~~~~ (push)
```

##2. githubのリモートリポジトリを```origin```から```github```へ変更

以下の方法Aまたは方法Bがある。

### 方法A. 削除と追加

####リモートリポジトリの削除

```
$ git remote rm origin
```

####リモートリポジトリを```github```にして追加しなおす

```
$ git remote add github git@github.com:~~~~~~
```

確認した時のURLを入れます。

####GitLabのリモートリポジトリを```origin```で追加する

### 方法B. rename

```
$ git remote rename origin github
```


##3. GitLabをoriginで追加する
```
$ git remote add origin https://gitlab.com/~~~~~~
```

##4. 最後に確認

```
$ git remote -v
origin  https://gitlab.com/~~~~~~ (fetch)
origin  https://gitlab.com/~~~~~~ (push)
github  git@github.com:~~~~~~ (fetch)
github  git@github.com:~~~~~~ (push)
```
Pythonで人口ピラミッドを描いてみる

仕事でデータ分析することになった。統計のこと何もわからんのに...。
Pythonでのデータの取り扱いに慣れる練習がてら，e-Statのデータで人口ピラミッドを描いてみた。

データはこんな感じ（タブ区切り）。

|年齢|男|女|
|:--|--:|--:|
|0歳|480925|460898|
|1歳|488854|465670|
|2歳|506509|484764|
|3歳|510136|487542|
|...|
|106歳|105|908|
|107歳|47|476|
|108歳|26|263|
|109歳|9|98|
|110歳以上|9|136|

左に男性，右に女性のグラフを配置した人口ピラミッドを描画。

```Python:Python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'IPAPGothic'

df = pd.read_table('population.tsv', index_col=0)
man = df['男'] / 10000 # 1万人単位にする
wom = df['女'] / 10000

fig, ax = plt.subplots(ncols=2, figsize=(8,6))

# 男性人口
ax[0].barh(df.index, man, color='b', height=0.5, label='男')
ax[0].yaxis.tick_right() # 軸を右に
ax[0].set_yticks(np.array(range(0,111,10))) #　10歳刻み
ax[0].set_yticklabels([]) # こちらの軸ラベルは非表示
ax[0].set_xlim([120,0]) # x軸反転
#　女性人口
ax[1].barh(df.index, wom, color='r', height=0.5, label='女')
ax[1].set_yticks(np.array(range(0,111,10)))
ax[1].set_xlim([0,120])
ax[1].set_xlabel('人口(万人)')

fig.legend(loc='upper right')
plt.show()
```

できた画像がこちら。

![population.png](https://qiita-image-store.s3.amazonaws.com/0/229548/bc56afa7-31a0-9ce7-5d56-ba8878272301.png)

グラフ反転については[こちら](https://datumstudio.jp/blog/matplotlib-y%E8%BB%B8%E3%81%8C%E5%8F%8D%E8%BB%A2%E3%81%97%E3%81%9F%E3%82%B0%E3%83%A9%E3%83%95%E3%81%AE%E6%8F%8F%E3%81%8D%E6%96%B9)，軸の目盛りを右に表示する方法は[こちら](https://code.i-harness.com/ja/q/cc0220)，subplotについては[こちら](https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9)の記事を参考にさせていただきました。
PythonとJavaの構文の違い

Javaは多少わかる自分が、Pythonを学習して2時間目。
構文等々の違いについて。


参考 [Python3とJavaでクラスを書いてみた](
https://qiita.com/Sekky0905/items/5b4105a9dcb6e0ff354d)

* ブロックが{}ではなく、インデント
* 変数宣言ない
* ~~型は動的~~ → 型は値が持っている
* クラスとファイルは一致していなくてよい
* ~~コンストラクターは\_\_init\_\_~~ → \_\_init\_\_は初期化メソッド
* 継承、パッケージ等ある
* クラス、メソッド、制御文の終わりはコロン
* 文字と数値の区別がある

```Python:数値と文字を+して文字"13"とはならずエラーとなる
#!/usr/bin/env python
a=1
b=2
print(a+b)

str="3"
print(a+str)
```


```text:出力結果
Traceback (most recent call last):
3
  File "C:/Data/project/201806_python_1/venv/hellloWorld.py", line 7, in <module>
    print(a+str)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```


```Python:1と"1"を比較して同じと判定されない
#!/usr/bin/env python
i=1
if i==1:
    print("true")
else:
    print("false")

str="1"
if i==str:
    print("true")
else:
    print("false")
```

```text:出力結果
true
false
```

_！！重要！！_
_strとかうっかり安易に変数名を付けると混乱を招く。strは組み込み関数！_


* ==とequalsが逆

参考 [Pythonの'=='と'is'、ついでにJavaの'=='と'equals'について](
https://rcmdnk.com/blog/2015/07/09/computer-python-java/)

* Map、List、Setの参考サイト

参考 [Java vs Python - 構文の違い選手権（超不完全版）](http://tercel-tech.hatenablog.com/entry/2016/03/05/134713)

* 0はfalse、0以外はtrueと判定される

```Python:
#!/usr/bin/env python
print(" 0の場合:" + ("true" if 0 else "false"))
print(" 1の場合:" + ("true" if 1 else "false"))
print(" 2の場合:" + ("true" if 2 else "false"))
print("-1の場合:" + ("true" if -1 else "false"))
print(" 0がFalseか？:" + ("true" if 0==False else "false"))
print(" 1がTrueか？:" + ("true" if 1==True else "false"))
```

```text:出力結果
 0の場合:false
 1の場合:true
 2の場合:true
-1の場合:true
 0がFalseか？:true
 1がTrueか？:true
```

* 文字列は、シングルクォーテーションでも、ダブルクォーテーションでもどちらでもよい(Stringはダブル、charはシングルとかはない？)

* 三項演算子はあるが、少し書き方が違う

```Python:Python
print(("true" if 0 == 1 else "false"))
```

```Java:Java
System.out.println((0 == 1 ? "true" : "false"));
```

* trueはTrue、falseはFalse、先頭大文字！

```
print((0==0))
print((0==1))
```
```text:出力結果
True
False
```
PhpStorm を使っていて、PHPUnit のテストケースでメソッド名を日本語つかいたい場合の noinspection

そもそも悪習なのかもしれませんが、テストケースを日本語で記述するのが好きです。
とくにドキュメントの整備を省いてテストケースを読めば分かるようにしておきたい、という場合に割りかし幸せになれると思ってました。

ただ、PhpStorm を使っていると、Non-ASCII という警告が邪魔だから抑制したいんだけど、メソッドのドキュメントコメントは PHPUnit で使うから、`@noinspection NonAsciiCharacters` は何処に書けば……、と迷走した末に辿り着いた書き方がこれです。

```php
class HogeTest extends TestCase
{
    /** @noinspection NonAsciiCharacters */
    /**
     * @test
     */
    public function ホゲホゲするとfooになる()
    {
    }

    /** @noinspection NonAsciiCharacters */
    /**
     * @test
     * 
     * @expectedException \Hoge\AuthException
     */
    public function ホゲホゲには認証が必要()
    {
    }
}
```
【備忘録】MySQL, PostgreSQLをローカル開発で切り替えるメモ

# 前提条件
* ローカル開発
* macOs High Serria
* MAMP(MySQL)
* HomeBrew(PostgreSQL)
* データソースでDB切り替えればよくね？
* 潤沢にメモリがあればそうしたい。。。

# 使っているDB以外は落としたい
自分が使ってるMAMP。。。プロダクト選んで起動・停止ができない。。。

* postgres起動・停止方法

```
$ brew services stop postgresql
$ brew services start postgresql
```

* MySQL起動・停止方法  
少々強引だがdatabasefileへのパスを読み込ませなくすることで起動させなくする

```
$ mv /Applications/MAMP/db/mysql56 /Applications/MAMP/db/DESABLE_mysql56
```

# これでとりま大丈夫。  
そんなにローカル開発は頻繁に行わないので必要に応じて上記を切り替える感じの運用でカバーすることにした
成り上がりたくて必死に読んだ感謝の技術書6冊

## はじめに
※長いので飛ばしちゃってOKです。

遊び呆けていた私文の私は、求人票の一番上にあったSESの会社に入社。

駆り出された現場では、デスマーチが横行し、土日連続出勤を繰り返す日々。

大晦日、出向先で働いていた時、

**なんで自分は立場も技術力も弱いんだ。成り上がりたい**

と固く誓い、必死に技術書を読み漁りました。

その結果、希望するWeb系の会社に転職でき、そこで素晴らしいメンバーにも出会うことができました。

~~現在では、[スタートアップ](https://www.wantedly.com/projects/210333)でリードエンジニアをしながら、技術書を読み進めています。~~

→ その後、スタートアップを共同創業して、[yaritori - メール共有システム](https://yaritori.jp/)というサービスを作っています。

そんな[私](https://twitter.com/y_tsubuku)の人生を変えてくれた技術書たちに感謝を込めて、ここで紹介したいと思います。

## 感謝の技術書①リーダブルコード
みんなが昼休みに昼寝をする中、未来に期待を寄せて読んだ感謝の一冊。

プロジェクトメンバーのコードがひどいことに気付かされたり、
それにも増して**自分のコードが読みにくいことを強烈に思い知らされた**。

技術書を読む習慣がない人にこそ読んでほしい。

[リーダブルコードを読んだので、殴り書き](https://qiita.com/Kenya/items/faec4cc374edd5ffbba6)
が素晴らしい。

## 感謝の技術書②JUnit実践入門
初めて`テストコード`を書くことになったときに買った本。
SIerのお客さんから「このプロジェクトでは単体テスト必ず書いてね」と言われ、
テストコードの存在すら知らなかった私は、とりあえずこの本を購入。

`足し算をする関数に 1と1渡したらそりゃ2が返るだろ。意味あるんか。`
などと思っていたが、読み進めるうちにテストを書きたくて仕方がなくなった一冊。
「転職先はテスト書いているところが良い！」と思うきっかけになった。

## 感謝の技術書③パーフェクトJava
「良いコードを書くには、その言語自体を知らなければ！（多く知っていた方が有利に決まっている！）」
と考え、パーフェクトという名前につられて購入。
読めば読むほど、他の同僚に差をつけられる気がして電車の中で読んでいました。

ここでリフレクションを学び、「そんなことできるんか！」と黒魔術的なコードを書きまくったのは良い思い出。

## 感謝の技術書④Ruby on Rails 4 アプリケーションプログラミング
転職先でRailsを使うことになり、「やっぱり最初は本からでしょ！」といきり立って購入。
実践的な使い方が多く書いてあったりして、「Railsめっちゃすごいやん！」となった一冊。

これから、Rails始めるぞって人にはおすすめです。
今だとRails5の本があると思います。


## 感謝の技術書⑤Effective Ruby
もう一歩先に行きたくて、背伸びをして読んだ一冊。

内容は具体的なものが多い。

* reduceを使ってコレクションを畳み込む方法を身に付けよう。
* raiseにはただの文字列ではなくカスタム例外を渡そう。
* ensure節は最後まで実行して抜けるように作ろう。

など、知っておくともっと良いコードが書けることやパターンを知ることができた。

## 感謝の技術書⑥プログラマが知るべき97のこと
超絶プログラマのコラムが多く書いてある本。
読むだけでわくわくするので、モチベを上げたいときに読んでいた。

実はWebで無料で読めるらしいです。知らなかった。。

[プログラマが知るべき97のこと](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/)

[ボーイスカウト-ルール](https://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%83%9C%E3%83%BC%E3%82%A4%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%88-%E3%83%AB%E3%83%BC%E3%83%AB/)とか良かった記憶。


## おわりに
いかがでしたでしょうか。技術書は知識や経験を共有できる素晴らしい書物です。
まだ読まれていない方は、是非好きな本を見つけてみてください。
　
※[@y_tsubuku](https://twitter.com/y_tsubuku)が開発する[yaritori - メール共有システム](https://yaritori.jp/)も、良ければご覧ください :tada:
ペアプロを始めるときの3つの約束

最近、弊社[ユリシーズ株式会社](https://qiita.com/organizations/ulysses-inc)ではペアプロを実施しています。
お試しから3週間経ったので、これからペアプロをはじめる方にオススメしたい約束事を書きます。
ペアプロ実施中のユリシーズは[**絶賛エンジニア募集中**](https://www.wantedly.com/projects/210333)です！！

#**前提**
- 1日ずっと同じ相手とペアプロをする

#**目指すペアプロ像**
##**疲れないペアプロ**

ペアプロは`長距離走`です。1日を疲れずに走りきることが重要になります。
さらにずっと同じ相手とペアプロをするので、楽しくできることも非常に大事です。

これを最低限実現するために、3つの約束を作りました。


#**3つの約束**
##**集中する時間を守る**
　人間の集中力は、すごく集中していると15分、すごくじゃなくても45分あたりで限界がくるそうです。
　集中する時間を決めて、しっかり休憩をとりましょう。
　ユリシーズでは1ターン＝作業25分＋休憩5分(+α)で実施しています。

##**やることを確認する**
　1日の始めやissueの着手時だけでなく、1ターンごとに**「今から何をするか」**を確認しましょう。
　作業中、特に調査系のタスクの場合に調査があらぬ方向に行ってしまうのを防ぐことができます。
　また、今から何に着手するのか、それを相手にも納得してもらった上で作業をはじめることで、「思ってたのと違う…！」みたいな悲劇も起こりにくくなります。

##**美味しいおやつを用意する**
　長い実装のおともに、是非おやつを用意してください。
　脳の栄養補給にもなり、癒しにもなるので<font color="Red">**おやつはとても重要**</font>です！！！
　ユリシーズでは今こんなお菓子が用意されています。
　・パインあめ
　・雪の宿
　・ブラックサンダー
　・アルフォート
　・カントリーマアム

#**最後に**

ペアプロはじめてまだ3週間ですが、ペアプロとっても楽しいです。
[ユリシーズで一緒にペアプロやりましょう！](https://www.wantedly.com/projects/210333)

ペアプロの相手である@kurkuruさんの記事もオススメです。
ZenHubでのスクラム運用メモ

##はじめに

**当記事ではスクラムの運用方法については記載しておりません。**

僕の所属する[カミナシ](http://www.ulysses-ltd.com/)では先月からスクラムを導入しており、[ZenHub](https://www.zenhub.com/)を使ってスプリントを回しています。スクラムやる上では定番ツールの一つですよね。

Zenhub、最初はとっつきづらかったんですが、使っていくうちに手に馴染んできたので僕らのチームではこんな風に使ってますよ。というのを紹介します。

## Pipelineの設定
Zenhubでは作成したissueをPipelineという仕組みを使って各issueの状況を管理します。
僕らのチームでは以下のPipelineを用意しています。ちょっとだけ、基本形を変えて使ってます。

`Icebox`
・みんなが好きにissueを立てて放り込んでおくPipeline
・スクラムマスターは適宜、ここに挙げられたissueを選別し、優先度をつけたり、不要ならcloseさせたりする

`Product-Backlog`
・対応することが決まったissueが所属するPipeline
・上から順に優先度が高いように並べておく
・新機能追加時ならストーリーを記載し、スプリントミーティングで仕様決め、見積もりを行う

`Sprint-Backlog`
・スプリントで実施予定のissueが所属するPipeline
・ストーリーを細かく分解し、着手できる単位に分け、見積もりまでしておく

`In Progress`
・スプリントで着手中のissueが所属するPipeline
・原則、一人が同時に着手していいissueは一つまでにしておく

`Review/QA`
・対応が終わり、Pull Request中のissueが所属するPipeline
・Review完了後、マージし、issueはcloseする

`Done`
・Reviewが終わったが、何らかの理由でマージ待ちになっているissueが所属するPipeline
・closeさせてしまうと、そのissueが終わってしまった感じになってしまうのでこのPipelineがあるとちょっと便利。

`Close`
・Reviewが終わり、マージされ、完了したissueが所属するPipeline

## レポジトリの運用
僕らのチームでは以下のようにレポジトリを運用しています。(○○はサービス名です)
`○○_devレポジトリ`
　・issueはとりあえず、このレポジトリに原則挙げていく。エンジニアでもビジネスサイドの人でもとりあえずここに。
　・複数レポジトリを跨ぐような開発が必要な場合には、ZenHubのepicをこのレポジトリに作り、各レポジトリのissueを紐づけるようにする。
`○○_api-serverレポジトリ`
・サーバーサイドの開発用
`○○_webレポジトリ`
・フロントサイドの開発用
`○○_spレポジトリ`
・sp(smart phone)向けアプリの開発用

ZenHubは複数のレポジトリを跨いで、issueの管理、マイルストーンの設定ができるのでこのようなレポジトリの運用が楽にできます。

##便利機能

###レポジトリの移動
`shift + z`でレポジトリ移動のためのwindowを開けます。
![move_repository.gif](https://qiita-image-store.s3.amazonaws.com/0/45084/db5dba16-4395-60fd-128a-15dd131d7784.gif)

###ボードへの移動 + issue作成
`z + b`でZenHubボードへの移動、`n + i`でissueを作成できます。
![move_board.gif](https://qiita-image-store.s3.amazonaws.com/0/45084/9deba8e0-2cd8-399f-67c9-e25fafe26c05.gif)

###複数のレポジトリに同じマイルストーン作成
burndownレポートのページからマイルストーンを作ると複数レポジトリに同じマイルストーンを作ることができます。
![make_milestone.gif](https://qiita-image-store.s3.amazonaws.com/0/45084/1ecfb345-d66c-10c8-7595-f47e811b241d.gif)

###レポジトリを跨いで、マイルストーンを設定してSprint-Backlogに乗っける
複数レポジトリでやってるといちいち、レポジトリを移動してマイルストーン設定したりするの非常にめんどくさいが、
ZenHubなら楽チン。
boardには複数レポジトリのissueを表示できるので、
1. issueの顔アイコンをクリックして選択
2. 「set Milestone」でマイルストーン設定
3. 「Move to Pipeline」で「Sprint-Backlog」へ移動
![set_sprint.gif](https://qiita-image-store.s3.amazonaws.com/0/45084/84ea1040-0742-d797-478b-b2b6f1b07eae.gif)

他にもレポジトリ、マイルストーン、ラベルなどでフィルターしたりする機能があるので、issueを並べるのが非常に楽です。


##おわりに
僕らのチームでのPipeline,レポジトリの運用と、ZenHubの小回りの効いてる機能を紹介しました。
特に複数レポジトリでissueを管理してるチームにはお勧めだと思います。スクラムをする上でissueの管理というのが非常にめんどいのですが、ZenHubのおかげで相当ストレスが軽減されました。

最後になりますが、僕らの作っているサービス、[KAMINASHI](https://kaminashi.jp)では[エンジニア絶賛募集中です！](https://www.wantedly.com/projects/314987)
一緒にスクラムやりましょう！！
AndroidでVideoCaptureで動画が開けない

##環境
- Windows 7
- AndroidStudio 3.0
- OpenCV for Android 3.4.0

##結論
mp4動画ファイルをmjpegに変換したら開けた。ただし、拡張子はmjpegだと開けなかった。
↓OpenCV公式フォーラムに同じ問題で悩んでいる人がいた。
http://answers.opencv.org/question/126732/loading-video-files-using-videocapture-in-android/

##ファイルの準備
適当な動画をmjpegに変換する。
拡張子をmp4 or aviにする。mjpegだと開けなかった。

例
"test.mp4"として→に格納　"storage/emulated/0/DCIM/test.mp4"

##プログラム
スマホのカメラにアクセスするため、パーミッション追加。
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/256346/f9c7c37a-52ef-0ec5-0b43-c83edfb15983.jpeg)

↓コード

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("opencv_java3");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        File file = new File(Environment.getExternalStorageDirectory() + "/DCIM");

        if (file.exists())
        {
            File file2 = new File(file.getAbsolutePath() + "/test.mp4");

            if (file2.exists())
            {
                VideoCapture videoCapture = new VideoCapture();
                videoCapture.open(file2.getPath());

                TextView tw = (TextView) findViewById(R.id.textView);

                if (videoCapture.isOpened()) {
                    tw.setText("VideoCapture OK");
                }
                else
                {
                    tw.setText("VideoCapture NG");
                }
            }
        }
    }
```

実行結果↓
![Screenshot_2018-06-05-20-59-47.png](https://qiita-image-store.s3.amazonaws.com/0/256346/2fe8b44b-b07f-5199-7fe6-2840c3e0294c.png)

##今後
mjpegだとサイズが大きすぎる。H.264とかで開けるようにしたい。
やり方を調べる予定。
素数の数え方２種

特殊なライブラリを使わずに短くシンプルに書けるとなんだかハッピ～～～、それが素数数え上げアルゴリズム。この記事ではその基本的な骨組みについて個人的に考えたことをざっくりと説明します。

# （まず）素数とは
1と自分以外に約数を持たない数のことです。

# 素数の数え方2種

## 数え方①　ひとつひとつの数に対して約数の有無を調べる
まずは、定義通りの方法。素数のリストを作り、素数判定の対象となる数ひとつひとつに対して素数リスト内の数の倍数でないか調べていく。

###処理の流れ：
①素数のリストを作る。最初は2だけ入れておく。（1は素数ではない。）pythonの場合primes=[2]など
②判定対象の数（まだ素数かどうかわかっていない自然数）を入れる変数を用意する。最初の数は3にする。n=3など
③すでに素数リストに入っている素数で判定対象の数を割りきれないか、ループなどを使って調べる。素数リストに入っているどの数でも割り切れなかったらその数は素数なので、素数リストに追加する。
④判定対象の数に+1をする。
⑤　③→④を繰り返す。（判定対象の数の上限に達するまで or 素数の数が一定数に達するまで）

###（判定対象の数→素数のリスト→素数判定（YesかNoか））の変化：
(3→[2]→Yes)
(4→[2,3]→No)
(5→[2,3]→Yes)
(6→[2,3,5]→No)...

## 数え方②　判定対象の数のリストから素数の倍数を消していく
判定対象の数をすべて羅列したリストを作り、すでに素数だとわかっている数の倍数を判定対象の数のリストから消していく。（例えば2は素数なので、2,4,6,8,10...は真っ先にリストから消される。）消された後に残った数のうち一番小さい数は必然的に素数になる。

###処理の流れ：
①判定対象の数のリストを作る。pythonならnumbers=[3,4,.....100]など
②素数を記録するリストも作っておく。primes=[]など
③判定に使う素数を入れる変数を用意する。prime=2(numbers[0]もアリ)
⑥素数のリストに③を記録しておく。
④判定対象の数のリストからさきほどの素数の倍数を消す。numbersの例だと[3,5,7,9....99]となる。
⑤残った数のうち一番小さい数(初回は3)を判定に使う素数に設定する。
⑦　④→⑥を繰り返す。（素数の数が一定数に達するまで）

###（判定対象の数のリスト→判定に使う素数→判定後の判定対象のリスト）の変化
([3,4,5,6,7,...,100]→2→[3,5,7,,9,...,97,99])
([3,5,7,,9,...,97,99]→3→[5,7,11,13,17,...,95,97]) 
([5,7,11,13,17,...,95,97]→5→[7,11,13,...,89,97])...

#①と②のコード例（python）
##①(ひとつひとつの数に対して約数の有無を調べる)のコード例

```python
limit=30
primes=[2]
n=3
while n<=limit:
  for prime in primes:
    isPrime=True
    if n%prime==0:
      isPrime=False
      break
  if isPrime==True:
    primes.append(n)
  n+=1
print(primes)'
```
##②（判定対象の数のリストから素数の倍数を消していく）のやり方

```python
numbers=[x for x in range(2,31)]
primes=[]
while len(numbers)>=1:
  prime=numbers[0]
  primes.append(prime)    
  for n in numbers:
    if n%prime==0:
      numbers.remove(n)
print(primes)
```

#最後に
①のやり方だと素数リストが長くなるたびに繰り返し回数が増えていくので、大きな数の時は②の方がよさそうですね！
PostgreSQLのバージョンアップ

１．バックアップ

```bash
su - postgres
pg_dumpall -c > backup.dump
```

２．postgresqlのリポジトリをyumに登録

```bash
su -
wget https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-6-x86_64/pgdg-centos10-10-2.noarch.rpm
rpm -ivh pgdg-centos10-10-2.noarch.rpm
vi /etc/yum.repos.d/CentOS-Base.repo
# [base] と [updates]セクションにexclude=postgresql*を追加
```

３．postgresql10のインストール

```bash
yum install postgresql10-server
```

４．旧バージョンのDB停止

```bash
/etc/rc.d/init.d/postgresql stop
```

５．初期データ作成

```bash
su - postgres
/usr/pgsql-10/bin/initdb -D /var/lib/pgsql/10/data
```

６．新バージョンのDB起動

```bash
su -
/etc/rc.d/init.d/postgresql-10 start
```

７．サービス設定変更

```bash
chkconfig --list
chkconfig postgresql off
chkconfig postgresql-10 on
```

８．ログイン確認

```bash
su - postgres
/usr/pgsql-10/bin/psql -U postgres
```

９．データのリストア

```bash
/usr/pgsql-10/bin/psql -d postgres -f backup.dump
```
nginx: [emerg] unexpected "}"にカモられた話

```conf.d/myapp.conf
upstream myapp {
    server unix:/home/dragon_taro/run/myapp.sock fail_timeout=0;
}

server {
    listen 80;
    server_name 54.95.217.17;

    root /var/www/rails/myapp/public;

    try_files $uri/index.html $uri @myapp;

    location / {
        proxy_pass http://myapp; # アプリケーション名を記述
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}
```
これで`sudo nginx -t`って実行すると、

```
nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/myapp.conf:3
```
って出るんですよね。
`{}`は全部ついてるし、`;`も抜けてないしおかしいなと思ったら、

```
server unix:/home/dragon_taro/run/myapp.sock fail_timeout=0;◯
```
のあとにスペースが一つ入っていたんですよね。

そんなもん気づくかい！
ちゃんちゃん。
React-Leaflet(v1)を試す



React-Leaflet · ⚛️ React components for 🍃 Leaflet maps](https://react-leaflet.js.org/en/)


[Installation · React-Leaflet](https://react-leaflet.js.org/docs/en/v1/installation.html)


```
npm install leaflet prop-types react react-dom react-leaflet
```

今回のソースは以下に置いてます。
[react-leaflet-v2-test/react-leaflet-v1-test at master · sugasaki/react-leaflet-v2-test](https://github.com/sugasaki/react-leaflet-v2-test/tree/master/react-leaflet-v1-test)


以下で実行結果を見ることができます。
[React-Leaflet v1.9 test](https://sugasaki.github.io/react-leaflet-v1-test/)


###  index.css

```css:index.css
html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    width: 100%;
}

#root {
    width: inherit;
    height: inherit;
}

.leaflet-container {
    width: inherit;
    height: inherit;
}

```

### App.js

```react:App.js

import Leaflet from 'leaflet'
import React, { Component } from 'react';
import './App.css';

import SimpleExample from './components/simple'

Leaflet.Icon.Default.imagePath = '//cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/images/'


class App extends Component {
  render() {
    return (
      <SimpleExample />
    );
  }
}

export default App;
```

### simple.js

```react:simple.js
import React, { Component } from 'react'
import { Map, TileLayer, Marker, Popup } from 'react-leaflet'

export default class SimpleExample extends Component {
    state = {
        lat: 51.505,
        lng: -0.09,
        zoom: 13,
    }

    render() {
        const position = [this.state.lat, this.state.lng]
        return (
            <Map center={position} zoom={this.state.zoom}>
                <TileLayer
                    attribution="&amp;copy <a href=&quot;http://osm.org/copyright&quot;>OpenStreetMap</a> contributors"
                    url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
                />
                <Marker position={position}>
                    <Popup>
                        A pretty CSS3 popup. <br /> Easily customizable.
                    </Popup>
                </Marker>
            </Map>
        )
    }
}
```
Web API用CLIツール開発に便利なRubyライブラリまとめ

RubyでWeb APIを叩くCLIツールを開発する際に使われるライブラリを調べてみました。

## CLIツール

* [Thor](http://whatisthor.com/) 定番
* [Slop](https://github.com/leejarvis/slop)　option parser。型指定可能。
* [Hanami::CLI](https://github.com/hanami/cli)　Hanami用CLI **ではない** 。さすがに名前が微妙すぎるのでは…
* [TTY](https://github.com/piotrmurach/tty) プラグイン多数。内部ではThorを使用
* [Terrapin](https://github.com/thoughtbot/terrapin) 旧称Cocaine
* [GLI](https://github.com/davetron5000/gli) git-like
* [Clamp](https://github.com/mdub/clamp)　クラスベースでsub commandも可　
* [Commander](https://github.com/commander-rb/commander) リッチ

## HTTPクライアントライブラリ

### Pure Ruby

* [excon](https://github.com/excon/excon)
    * https://github.com/lyptt/struct
    * https://github.com/fog/fog-core
* [httparty](https://github.com/jnunemaker/httparty)
    * https://github.com/agilie/instagram_api_gem
* [httpclient](https://github.com/nahi/httpclient)
    * https://github.com/matthooks/vimeo
    * https://github.com/google/google-api-ruby-client
* [Nestful](https://github.com/maccman/nestful)
    * https://github.com/clearbit/clearbit-ruby

### C拡張を使うもの

* [HTTP http.rb](https://github.com/httprb/http)
    * https://github.com/pythonicrubyist/creek
* [EM-HTTP-Request](https://github.com/igrigorik/em-http-request)

### 外部ライブラリを使うもの

* [Typhoeus](https://github.com/typhoeus/typhoeus)
    * https://github.com/elastic/elasticsearch-ruby
* [Curb](https://github.com/taf2/curb)
* [Patron](https://github.com/toland/patron)
    * https://github.com/zenops/livestatus

### meta library(上記ライブラリのラッパー)

* [Faraday](https://github.com/lostisland/faraday)
    * supoort: Net::HTTP, Net::HTTP::Persistent, Excon, Patron, EventMachine, HTTPClient
* [HTTPI](https://github.com/savonrb/httpi)
    * support: HTTPClient, Curb, EM-HTTP-Request, Net::HTTP, Net::HTTP::Persistent, excon, Rack

## その他のライブラリ

* [addressable](https://github.com/sporkmonger/addressable)
* [mime-types](https://github.com/mime-types/ruby-mime-types/)
* [highline](https://github.com/JEG2/highline)
* [representable](https://github.com/trailblazer/representable)
kotlin で JVM で ディスクトップ

kotlin がJVM対応言語なので、ディスクトップで動かしてみました

開発環境は IntelliJ IDEA + Scene Builder (JavaFX: GUI作成ツール)

xmlとして作った画面をfxmlに作り直しせば
ほぼ、アンドロイド用に作ったコードで動かせました

![電卓.png](https://qiita-image-store.s3.amazonaws.com/0/258658/0b34288d-9f36-f7d9-93cb-5a33dca92acb.png)

電卓JVMのコード[ここ](https://github.com/bokufolivora/dentaku.git)置いてみました
【メモ】Google Chromeの拡張機能でHTMLを読み込む

Google Chromeの拡張機能で、HTMLファイルを使用する方法の私的メモ。

```manifest.json
{
    "web_accessible_resources": ["読み込みたいHTMLファイル.html"]
}
```

* HTMLをリソースとして宣言する


```javascript
async function injectHtml(resource, dom) {
    const res = await fetch(chrome.runtime.getURL(resource), { method: "GET" })
    const html = await res.text()

    dom.innerHTML = html
}

const target = document.getElementById("HTMLを挿入するDOM")
injectHtml("HTMLのファイル名", target)
```

* `web_accessible_resources`で宣言したファイルは、`chrome.runtime.getURL()`からURL経由で利用できる。
* Chrome専用なのでビルドツールなしで`async`、`await`が使えて楽しい。
Spring Boot エクセルファイルをダウンロード　crossfish21

エクセルファイルをダウンロードする

```
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.util.IOUtils;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RestControllers {

//    @RequestMapping(value="excel",produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
//    public Resource  file1(){
//    	return new FileSystemResource("C:/work/aaa.xlsx");
//    }

    @RequestMapping("excel")
    public void index(HttpServletRequest request, HttpServletResponse response) throws IOException {

        FileInputStream inputStream = new FileInputStream(new File("C:/work/aaa.xlsx"));

        response.setHeader("Content-Disposition", "attachment; filename="testExcel.xlsx"");
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);

        ServletOutputStream outputStream = response.getOutputStream();
        IOUtils.copy(inputStream, outputStream);

        outputStream.close();
        inputStream.close();
    }

}


これでいけるのだが、ダウンロードしたエクセルファイルのプロパティで、ブロックの解除をしないとだめらしい

```

[リンク](https://stackoverflow.com/questions/44028127/downloading-file-from-spring-rest-controller)
Null 合体演算子の別の書き方を考えてみたら、やはり優秀なんだなと再確認した話し

連想配列の初期化をしている他人のコード（Null 合体演算子を使って初期化していた）を読んでいて、あまり自分では書くケースが無さそうなパターンだったので、どんな書き方がベターなのかなと悩みました。

結論としては、Null 合体演算子は優秀だし簡潔で分かりやすくて良さそうだと思いました。

## 気になったコードのサンプル

該当のコードは簡略化すれば以下のような感じです。

連想配列をデフォルト値で上書きするカタチで初期化していました。

```php
function foo(array $params) {
    $params['foo'] = $params['foo'] ?? 'A';
    // ...
}
```

連想配列のオプションで多機能なメソッドの処理内容を切り替えるパターンで、そもそも設計が不味いと思うし、無理やり納得できる例に置き換えるなら、POST された可変長の連想配列を素の PHP で処理するようなときとかでしょうか。

## Null 合体演算子と等価な別の記述

Null 合体演算子は、`isset($var) ?: ...` もしくは `if (isset($var)) ...` と同等なはずなので、人によっては if 文を使ったりしそうです。

### if 版

個人の主観の話しになってくるのかもですが、自分は冗長かなと思います

```php
if (!isset($params['foo'])) {
    $params['foo'] = 'default';
}
```

上書きだから条件がちょっと変だけど、変数への代入であれば if else な感じに。

```php
if (!isset($params['foo'])) {
    $foo = $params['foo'];
} else {
    $foo = 'default';
}
```

### 三項演算子版

これも上書きだから変に繰り返し感が増してますが、それを差し引いても Null 合体演算子よりは冗長に思います。

```php
$params['foo'] = isset($params['foo']) ? $params['foo'] : 'default';
```

### isset() を省略しちゃうバグ

ありそうなバグとしては `isset()` を使わないというやつで、`Notice: Undefined index` かつ `""` `0` `false` などの値も上書きしてしまうってのがありそうです。

```php
if (!$params['foo']) {
    $params['foo'] = 'default';
}
```

もしくは、こっちの方がありそうかも。

```php
$params['foo'] = $params['foo'] ? $params['foo'] : 'default';
```

### unless ?

実は、自分が最初に考えたのが上記のバグ版と似たようなパターンでした……。
unless ぽい感じで書けそうじゃない？と思ったけど、上記と同じ理由で全然ダメでした。

```php
$params['foo'] ?: $params['foo'] = 'default';

// @$params['foo'] ?: $params['foo'] = 'default';
// とすれば、Notice: Undefined index だけは回避できるけど
```

ちゃんと書けば unless ぽく使えそうな気がしないでもないですが、個人的には何をしているのか一見分かり難いから、Null 合体演算子のほうが良いかなと思いました。

```php
isset($params['foo']) ?: $params['foo'] = 'A';
```

## まとめ

そう考えると Null 合体演算子は簡潔に `isset` をできる方法として優秀だし、コードが分かりやすいから使い勝手がいいなと思いました。
対抗馬としては、`null` と `Undefined index` の区別が必要だった場合に、`array_key_exists()` とかですかね。

```php
$params['foo'] = array_key_exists($params['foo']) ? $params['foo'] : 'default';
```
CaffeをBuildする時のライブラリエラー(`inflateValidate@ZLIB_1.2.9' に対する定義されていない参照です)

Ubuntu16.04にCaffeをビルドしてインストールする際のエラーについてのメモです。

###環境

 - Ubuntu 16.04
 - CUDA 8.0
 - cuDNN 6.0
 - Anaconda3

###エラー内容

[公式ガイド](https://github.com/BVLC/caffe/wiki/Ubuntu-16.04-or-15.10-Installation-Guide)に従ってmake (make all)した時、

```sh
CXX tools/finetune_net.cpp
CXX/LD -o .build_release/tools/finetune_net.bin
CXX tools/train_net.cpp
CXX/LD -o .build_release/tools/train_net.bin
CXX tools/upgrade_net_proto_text.cpp
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
/(anacondaがインストールされているディレクトリ)/anaconda3/lib/libpng16.so.16: `inflateValidate@ZLIB_1.2.9' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
Makefile:625: ターゲット '.build_release/tools/upgrade_net_proto_text.bin' のレシピで失敗しました
make: *** [.build_release/tools/upgrade_net_proto_text.bin] エラー 1
```

となることがあります。

手順通り進めているのであれば、

```sh
export LD_LIBRARY_PATH="/(anacondaがインストールされているディレクトリ)/anaconda3/lib:$LD_LIBRARY_PATH"
```
を一行 ~/.bashrc　に追加して再度ターミナルを起動すれば大丈夫です。
Nucleoを使ってLPC812へfirmwareを書き込む

###NucleoのCN4ピンアサイン

![nucleo_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/148248/bce70311-c28f-28d9-e729-462188190a85.jpeg)

|1|2|3|4|5|6|
|---|---|---|---|---|---|
|VDD_TARGET|SWCLK|GND|SWDIO|NRST|SWO(Reserve)| 

###ジャンパ配線

![nucleo_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/148248/0470bf59-fefe-fb35-885a-1abf7450e88e.jpeg)

**U9へ書き込む場合**

|Nucleo|yatagarasu V2|
|---------|-------------|
|1赤(VDD_TARGET)　　    |SWS_V_G_1|
|2青(SWCLK)       |SWD1_CONN1_1|
|3黒(GND)    |SWD_V_G_2  |
|4黄(SWIO)    |SWD1_CONN1_2 |


**U11へ書き込む場合**

|Nucleo|yatagarasu V2|
|---------|-------------|
|1赤(VDD_TARGET)　　    |SWS_V_G_1|
|2青(SWCLK)       |SWD2_CONN_1|
|3黒(GND)    |SWD_V_G_2  |
|4黄(SWIO)    |SWD2_CONN1_2 |



**U12へ書き込む場合**

|Nucleo|yatagarasu V2|
|---------|-------------|
|1赤(VDD_TARGET)　　    |SWS_V_G_1|
|2青(SWCLK)       |SWD3_CONN_1|
|3黒(GND)    |SWD_V_G_2  |
|4黄(SWIO)    |SWD3_CONN1_2 |


###OpenOCDを起動する。
    miyamoto@ubuntu-16:~$ openocd -f interface/stlink-v2-1.cfg -f target/lpc812.cfg
    Open On-Chip Debugger 
    0.10.0+dev-00414-gcdf1e82 (2018-06-02-07:47)
    Licensed under GNU GPL v2
    For bug reports, read
	    http://openocd.org/doc/doxygen/bugs.html
    WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg
    Info : auto-selecting first available session transport "hla_swd". To override use 'transport select 
    <transport>'.
    Info : The selected transport took over low-level target control. The results might differ compared to    
    plain JTAG/SWD
    adapter speed: 10 kHz
    adapter_nsrst_delay: 200
    Info : Listening on port 6666 for tcl connections
    Info : Listening on port 4444 for telnet connections
    Info : Unable to match requested speed 10 kHz, using 5 kHz
    Info : Unable to match requested speed 10 kHz, using 5 kHz
    Info : clock speed 5 kHz
    Info : STLINK v2 JTAG v29 API v2 SWIM v7 VID 0x0483 PID 0x3748
    Info : using stlink api v2
    Info : Target voltage: 3.234098
    Info : lpc812.cpu: hardware has 4 breakpoints, 2 watchpoints
    Info : Listening on port 3333 for gdb connections
 
###telnetで接続しfirmwareを書き込む
    miyamoto@ubuntu-16: $ telnet localhost 4444
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    Open On-Chip Debugger
    > reset halt
    target halted due to debug-request, current mode: Thread 
    xPSR: 0xf1000000 pc: 0x1fff0008 msp: 0x10000ffc 
    > flash write_image erase /home/miyamoto/git/junkyard/uubridge/build/uubridge.elf
    auto erase enabled
    target halted due to breakpoint, current mode: Thread 
    xPSR: 0x61000000 pc: 0x10000004 msp: 0x10000104
    Verification will fail since checksum in image (0x0000030d) to be written to flash is different from 
    calculated vector checksum (0xefffddbe).
    To remove this warning modify build tools on developer PC to inject correct LPC vector checksum.
    wrote 2048 bytes from file /home/miyamoto/git/junkyard/uubridge/build/uubridge.elf in 55.767582s (0.036 KiB/s)
    > 

[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.amazonaws.com/0/148248/fa35bcfe-5b78-ecd5-9f37-1f31e7426a77.png)](https://youtu.be/630ViXGKe7M)
c++クラスまとめ ~vector編~ [随時更新中]


`vector`のよく使う用法をまとめてみた．

#準備
・インクルード：`#include <vector>`

・宣言：`vector<int> v(N,0);`：Nはサイズ，全て0で初期化．

・初期化：`vector<int> v{1,2,3,4};`

・二次元配列の場合は `vector<vector<int>> v(n, vector<int>(n));`

#データの追加
・末尾にデータを追加：`v.push_back("hoge")`：hogeを末尾に追加

・途中にデータを追加：`v.insert(v.begin() + i, k);`：i番目とi+1番目の位置にkを挿入

#データの削除
・i番目に要素を削除：`v.erase(v.begin()+i)`
※erase()をすると，vectorのデータサイズが一つ減る

・重複している要素を削除：
`sort(v.begin(), v.end());
  v.erase(unique(v.begin(), v.end()), v.end());`
※先にソートするべし [参考：(https://qiita.com/ysk24ok/items/30ae72f4f1060b088588 )]

#状態を取得
・サイズ：`v.size()`で配列のサイズを取得

#ソート
・昇順ソート：`sort(v.begin(),v.end()); `

・降順ソート：`sort(v.begin(), v.end(), greater<int>());`


#要素の最大・最小
・最大：`int max = *max_element(v.begin(),v.end()); `

・最小：`int min = *min_element(v.begin(),v.end()); `

#参考文献
http://vivi.dyndns.org/tech/cpp/vector.html#vec-assign
AWSにRubyバージョン切り替えツールを導入する

## はじめに
AWSにrbenvを導入するときに行った手順をメモに残すものである。

## rbenvをインストールする
Githubの<a href="https://github.com/rbenv/rbenv/blob/master/README.md">README</a>を参考に以下のコマンドを実行する。

### Githubからrbenvをダウンロードして設定を行う
```bash
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
Cloning into '/home/ec2-user/.rbenv'...
remote: Counting objects: 2723, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 2723 (delta 3), reused 7 (delta 1), pack-reused 2714
Receiving objects: 100% (2723/2723), 520.78 KiB | 754.00 KiB/s, done.
Resolving deltas: 100% (1703/1703), done.
```
```bash
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```

###
```bash
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

```bash
$ source ~/.bash_profile 
```

### rbenvのバージョンを確認する
```bash
$ rbenv -v
rbenv 1.1.1-33-ge55e3c0
```

### ruby-buildを導入する
Rubyをインストールするときに必要となる。

```bash
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/ec2-user/.rbenv/plugins/ruby-build'...
remote: Counting objects: 8867, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 8867 (delta 8), reused 18 (delta 2), pack-reused 8843
Receiving objects: 100% (8867/8867), 1.86 MiB | 535.00 KiB/s, done.
Resolving deltas: 100% (5684/5684), done.
```

### 安定版のruby2.4.2をインストールする
```bash
$ rbenv install 2.4.2
Downloading ruby-2.4.2.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.bz2
Installing ruby-2.4.2...
Installed ruby-2.4.2 to /home/ec2-user/.rbenv/versions/2.4.2
```
### ruby2.4.2に切り替える
```bash
$ rbenv global 2.4.2
```
```bash
$ rbenv rehash
```

### バージョンが切り替わったことを確認
```bash
$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
```

## まとめ
rbenvを使うとrubyのバージョンが切り替えが便利で最高！
AndroidStudioのGradleビルドを１秒でも速くする方法まとめ

プロジェクトによっては少しプログラムを修正するだけで、ビルドに数分間かかりゲンナリします・・・

１秒でも早くしようと色々ネットの情報を寄せ集めたり、他の開発者から聞いてみたりと色々調べました。
怪しい情報もあるので、試しながら自分の環境で本当に早くなるのか？を確認しつつがよいかと思います。
（間違っていたり、他に情報があればご指摘頂ければと思います。）

##１．とにかくCPUとメモリのパワーアップ
GradleビルドはCPUの速さとメモリの容量でスピードが決まるそうです。
マシン、パーツの買い替え、増設、オーバークロックなど物理的変更により速度を上げる。
これができればいうことないです。

##２．Instant Runを使う
Instant Runはビルドし直さなくても修正を反映させる方法。
GradleのバージョンやターゲットAPI等を満たせば使えるということですが、
すべて満たしても巨大プロジェクトになると使えなかったり、
修正が反映されなかったりと意外と使えない・・・
小規模プロジェクトでは重宝。

##３．gradle.propertiesに設定を記載
お馴染みのやつです。
あまり知られていないですが、
ユーザーディレクトリの下(C:\Users\名前\\.gradle)とプロジェクトルートの下と2つあり、
どちらに記載してもよいのですが、同じ項目がある場合はユーザーディレクトリが優先になります。
常に速度を上げたい場合はユーザーディレクトリの下でよいかと思います。

```xml:gradle.properties
#プロセス内 dex と増分 Java コンパイルを有効
org.gradle.jvmargs=-Xms2048M -Xmx5120M -XX:MaxPermSize=2048M
#並列ビルドモードを有効
org.gradle.parallel=true
#必要な部分をビルド
org.gradle.configureondemand=true
#デーモンプロセスを使う
org.gradle.daemon=true
```


-Xmx（ 最大ヒープサイズ ）は公式
https://developer.android.com/studio/run/
によると
javaMaxHeapSize + 1024MBだそうです。
build.gradleの設定が
javaMaxHeapSize "4g"
だったら 5120Mですね。

-XX:MaxPermSizeは クラスファイルをメモリ上に読み込む最大サイズ。
-Xmsは 起動時のヒープサイズでこちらも設定すると早くなりました。
しかし、Xmsは強制的にメモリをとるので、複数プロジェクトを立ち上げるとメモリ不足で怒られます。

ちなみにタスクマネージャーを見ながら色々数字を上げて行ったら（20Gぐらいまで）、数字を上げれば上げるだけ速くなりました。
途中から気のせいぐらいの速度アップですけど・・・

##４．build.gradleでリソースを制限
画像ファイルが多いプロジェクトで有効。

```xml:app/build.gradle
defaultConfig {
    resConfigs "ja", "xxhdpi"
```
などテストする端末のリソースだけをコンパイルするように設定する。
リリース時はもちろん忘れずに戻す。

##５．Gradleをオフラインに設定
setting → Build.Execution,Deployment → Gradle
にある[Offline work]にチェックを入れる。
必要になったらチェックを外さないといけないのはやや面倒。

##６．ハードディスクをSSDに変更
こちらも物理的な変更。
プロジェクトの保存ディスクをSSDにして読み書きを少しでも早くする。
身近で１割ぐらい早くなったという報告がありましたが、体感なので具体的にはわからない。

##７．GradleのキャッシュをRAM DISKに変更
キャッシュの読み書き部分をRAM DISKへのリンクにする。
これも若干早くなる可能性があるとのことだったが、実感できなかった。
結構面倒。

##８．不要なプラグインを削除
SDKマネージャーからいらないと思われれるPluginを削除することで高速化ができるとのこと。
確かにCVSとかkotlinとか環境によってはいらない。


##９．minSdkVersionを23以上にする
Android SDKの最低バージョンを23に設定することで速くなるらしい。
これはとても効果を実感できた。
これもリリースの時は忘れずに戻す。

##１０．Gradleのバージョンを上げる。
最新のほうが早いとのことです。
ユースケースをモデリングする

## ユースケースとは
- システムの外側の要求と、対する内側の応答を示すもの
    - eg. "ユーザーの操作" に対する "一連の処理"
- 正常系（基本コース）と異常系（代替コース）からなる

これをモデリングする。

---

### なんのためにやるの？
- ユーザーがシステムで何をしたいのか、何を得たいのかを明確にする
- システムができること、できないことを明確にする

---

### ほかにもいいことが
- エンジニア以外でも読めるので、システムイメージを共有しやすい
- 単体テストのケースを考える助けとなる
- 各ドメインの処理や流れがわかり、ドメインモデルの漏れや誤りに気づける

---

### 具体的には何をやるの？
1. ユースケース記述を書く
2. ユースケース図（UML）を書く

---

## ユースケース記述
- ユースケースを表や文章で示したもの
- 1つのユースケースについて詳しく書ける

---

### 例.1 めっちゃ詳しく書く場合の表
[ユースケース記述の作成](http://linuxserver.jp/%E8%A8%AD%E8%A8%88/uml/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A8%98%E8%BF%B0)より
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5514/b9871d81-cae1-29b0-d343-9ea7b994d03c.png)

---

### 例.2 簡易版の表
[初歩のUML：顧客の要求をユースケースに反映させる](http://www.itmedia.co.jp/im/articles/0307/05/news002.html)より
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5514/3e0371d7-6b67-dfa4-7cdd-204a0d4b0162.png)

---

### 例.3 文章版
[ユースケース駆動開発実践ガイド](https://www.seshop.com/product/detail/20751)より
ユーザーガイドを書くのに似ている、とのこと。

> システムは「検索」ページを表示する。ユーザーは「著者」フィールドをクリックし、著者名（フレッド・スミスなど）を入力する。ユーザーは「検索」ボタンをクリックする。システムは検索フォームを読み取って著者名が一致する書籍を探し出し、「検索結果」ページで 検索結果の書籍一覧を表示する。

---

## ユースケース図
- アクターとユースケース同士の関係を表した図
- 粒度の大きい版と小さい版を作るとなお良い
	- eg.大きい：商品を管理する
	- eg.小さい：商品を追加する、商品価格を変更する、商品登録を削除する
	- 大きすぎると -> 認識漏れが出る
	- 小さすぎると -> "ユースケース"から"機能"になりがち

---

### 部品
次の部品を組み合わせて書く

---

- オブジェクト
    - アクター（棒人間）
    - ユースケース（楕円）

---

- 線
    - 関連（ただの線）
        - アクターとユースケースを結ぶ
    - 呼び出し（invokes, 破線＋<\<invoke>>）
        - `A --invokes--> B` = BはAから実行される
    - 先行（precedes, 破線+<\<precedes>>）
        - `A --precedes--> B` = Bの実行前にAが完了している

他にもあるが、上記でほぼ足りるとのこと。

---

- その他
    - サブジェクト（四角い枠）
        - システムの境界を表す
    - パッケージ（フォルダみたいなやつ）
        - グループを表す

---

### 例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/5514/6d7f4510-247f-862c-14cd-bb061e74e026.png)

---

## 書く際の注意
1. ユビキタス言語（ドメイン名）を使う
2. UI部品名も使って書く
    - ユーザーとシステムの境界（バウンダリー）を明確にする
3. 「"名詞" は "名詞" を "動詞" する」という短い文の集まりで書く
4. ユーザー視点でまとめる（機能分割しない）
    - eg. 入力、バリデート、登録処理と分けずに「登録する」とする 

---

## まとめ
- ユースケースの概要とモデリングするメリデメを紹介
- 手法としてユースケース記述とユースケース図がある
- ユースケースモデリングをして、システムを整理しよう！

---

## 参考資料
- [ユースケース駆動開発実践ガイド - 翔泳社](https://www.seshop.com/product/detail/20751)
- [若手エンジニア必読！超絶わかるユースケース図 - IT Koala Navi](http://it-koala.com/usecasediagrams-1832)
- [ユースケース記述の作成 - WEBサービス創造記](http://linuxserver.jp/%E8%A8%AD%E8%A8%88/uml/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9%E8%A8%98%E8%BF%B0)
- [初歩のUML：顧客の要求をユースケースに反映させる - ITmedia](http://www.itmedia.co.jp/im/articles/0307/05/news002.html)

---

## リンク
- [ドメインをモデリングするには](https://qiita.com/putan/items/3aa0ec1c104f1defa329)
AWS IoT エンタープライズボタンで redash を再起動するボタンを作った

## 0. 背景・経緯
弊社(<a href="http://loco-partners.com" target="_blank">株式会社 Loco Partners</a>)では <a href="https://redash.io/" target="_blank">redash</a> を用い、非エンジニアでもRDBからデータの取得をできる環境を作ってある。
EC2 + RDS という構成で作ってあり、それぞれインスタンスタイプは大きくはない。
非エンジニア以外も自由に使える環境なので、時折バイオレントなSQLが実行され、ウンともスンとも言わなくなってしまうことがある。
そうなると「再起動してください」とエンジニアに依頼が来る。

しかし、他のサーバの操作もできてしまうAWSコンソールでの作業はリスクが大きいのであまりやりたくない。
また、いちいち再起動の依頼をするのも面倒だろう。
ということで、 redashで使用するEC2とRDSのインスタンスを再起動するだけのボタンを作成した。

ボタンの作成にあたっては次のような手順を踏んだ。

1. IAM Roleの作成
1. Lambda Functionの作成
1.  ボタンの設定

## 1. IAM Roleの作成
Lambda Functionに設定するIAM Roleを作成する。

- redashで使うEC2インスタンスの再起動
- redashで使うRDSインスタンスの再起動
- 動作ログの出力

といったことできれば良いので、下記のようなPolicyでRoleを作成した。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:RebootInstances",
            "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-abcde123456789"
        },
        {
            "Effect": "Allow",
            "Action": "rds:RebootDBInstance",
            "Resource": "arn:aws:rds:ap-northeast-1:123456789012:db:redash-instance"
        },
        {
            "Effect": "Allow",
            "Action": [
	        "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
}
```

EC2, RDSのリソース名は次のような仕様となっているので、環境に合わせて適切に設定する。
EC2: `arn:aws:ec2:${リージョン名}:${AWSアカウントID}:instance/${インスタンスID}`
RDS: `arn:aws:rds:${リージョン名}:${AWSアカウントID}:db:${インスタンス識別子}`

## 2. Lambda Functionの作成

EC2インスタンスとRDSインスタンスの再起動を行うLambda Functionを作成する。
AWSのリソースを操作するのに便利な boto を使用できる Python をランタイムとして選択した。

```python
import boto3

def lambda_handler(event, context):

    # EC2インスタンスの再起動
    ec2 = boto3.client('ec2', region_name="ap-northeast-1")
    ec2.reboot_instances(InstanceIds=["i-abcde123456789"])

    # RDSインスタンスの再起動
    rds = boto3.client('rds', region_name="ap-northeast-1")
    rds.reboot_db_instance(DBInstanceIdentifier="redash-instance", ForceFailover=False)

    return 'end'
```

## 3. ボタンの設定

次のような作業を行う。

1. ボタンの登録
1. Wifiの設定
1. プロジェクトの作成
1. プレイスメントの作成

これらの作業は全てスマホアプリで行うことができる。

下記の記事を参考に設定を行った。
こちらでは詳しい手順は割愛する。

<a href="https://qiita.com/teriyakisan/items/bb0facf5075376dcf587" target="_blank">https://qiita.com/teriyakisan/items/bb0facf5075376dcf587</a>

## ラベリング・保管

IoTボタンにはカラーバリエーションが無いため、複数持っていると区別が難しい。
コピー用紙をIoTボタンの形にハサミで切り抜き、筆ペンで文字を書き、のりで貼って何のボタンなのかわかるようにした。

また、ボタンは大きくはないため、乱雑に置いておくと紛失してしまう恐れがある。
紛失を防ぐため、<a href="https://prtimes.jp/main/html/rd/p/000000257.000006986.html" target="_blank">Ardbeg ウェアハウスボックス2017</a>の空き缶に格納した。

![Image uploaded from iOS (10).jpg](https://qiita-image-store.s3.amazonaws.com/0/13038/ad7f2581-a844-fad6-c2f7-69378de9f568.jpeg)


## 最後に

入出力の少ないOpsの自動化に便利なデバイスだと思った。
ボタンを押すだけなので、利用者への説明が簡単なのがとても良い。

他にも活用できそうな場面があれば、ボタン化して行こうと思う。
AWSでEC2を立ち上げようとしたら「The AWS Access Key Id needs a subscription for the service.」が表示される

#発生したエラー
AWSのEC2 Management Consoleを開くと「The AWS Access Key Id needs a subscription for the service.」と表示されました。

#前提条件
①IAMでアクセスキーがあるかどうか確認→既にある

#原因
電話番号認証してなかった

#解決方法
https://aws.amazon.com/jp/ec2/
右上のコンソールにログインを押すと、電話番号認証のページに飛ばされ
認証すると発生したエラーが消えました。

#一言だけ
電話番号認証してないことによるエラーなら、そう書いて・・・。
踏み台サーバを飛び越えて一発で目的のサーバへsshする方法

# はじめに
サーバにssh接続する際、踏み台サーバを経由する必要がある事例がしばしば存在します。
その際、sshのポートフォワーディングを利用することで簡単にアクセスができます。

この記事では、ポートフォワーディングの方法をまとめてみました。

## 登場するマシン
* Local Machine(local)
    * 手元の端末
* Bastion Server(bastion)
    * 踏み台サーバ
    * Local Machineからsshアクセス可能
* Target Server(target)
    * 本当にアクセスしたいサーバ
    * Local Machineからsshアクセス不可能
    * Bastion Serverからsshアクセス可能

# Target Serverへアクセスする方法

## ProxyCommandを利用する方法（おすすめ！）
ProxyCommandを利用し、一発でログインする方法です。
以下のコマンドを実行します。

```console:console
[local_user@local]$ ssh -o ProxyCommand='ssh -W %h:%p -i <bastion_id_rsa> -p <bastion_port> <bastion_user>@<bastion_server>' \ 
                         -i <target_id_rsa> -p <target_port> <target_user>@<target_server>
```

読みにくいので`\`を利用し改行を入れました。
単純に言えば、ProxyCommandに踏み台サーバへのssh接続について記述してあげれば良い、ということになります。

ただ、これを書くのは正直めんどくさいので、`.ssh/config`を活用しましょう。
まず、以下のように編集します。

```bash:.ssh/config
Host <alias_name>
  HostName <target_server>
  User <target_user>
  IdentityFile <target_id_rsa>
  ProxyCommand ssh -W %h:%p -i <bastion_id_rsa> -p <bastion_port> <bastion_user>@<bastion_server>
```

編集が終わったら、以下のコマンドを実行します。

```console:console
[local_user@local]$ ssh <alias_name>
```

## トンネルを掘る方法（Local Forwardを利用する方法）
同等のことをLocal Forwardを利用しても実行できます。
しかし、結局sshを2回叩くことになるのでおすすめしません。

試してないのですが、以下のような感じかと。

```console:console
[local_user@local]$ ssh -fN <bastion_user>@<bastion_server>:<bastion_port> \
                         -L <local_port>:<target_server>:<target_port>
[local_user@local]$ ssh -p <local_port> <target_user>@localhost

```

勿論、`.ssh/config`を利用することもできます。
以下のように編集します。

```bash:.ssh/config
Host <alias_name1>
  HostName <bastion_server>
  User <bastion_user>
  IdentityFile <bastion_id_rsa>  
  LocalForward <local_port> <target_server>:<target_port>

Host <alias_name2>
  HostName localhost
  User <taget_user>
  IdentityFile <target_id_rsa>  
  Port <local_port>
```

編集が終わったら、以下のコマンドを実行します。

```console:console
[local_user@local]$ ssh -fN <alias_name1>
[local_user@local]$ ssh <alias_name2>
```

## ポートフォワーディング機能を利用しない方法

Bastion Serverへsshでログインした後に、そこからTarget Serverへログインする方法です。

```console:console
[local_user@local]$ ssh -p bastion_port bastion_user@bastion_server
[bastion_user@bastion]$ ssh -p target_port target_user@target_server
```

この方法は、Bastion Server、Target Serverの両方のURLとportを記憶しておく必要があります。
`.ssh/config`を編集することで、その手間を省くことができますが、Local Machineと Bastion Serverの両方のconfigファイルを編集する必要があります。



# 参考文献
* http://note.crohaco.net/2017/ssh-tunnel/
JavaでJSONをPOST

#JavaでJSONをPOSTするコード
一時的に持っておきたいデータをDBに保存するまでもないので、JSONのStringでポストして共有できるようにしました。

```java:postJSON
	public String postJson(String json, String path) {
		HttpURLConnection uc;
		try {
			URL url = new URL("http://host"+path);
			uc = (HttpURLConnection) url.openConnection();
			uc.setRequestMethod("POST");
			uc.setUseCaches(false);
			uc.setDoOutput(true);
			uc.setRequestProperty("Content-Type", "application/json; charset=utf-8");
			OutputStreamWriter out = new OutputStreamWriter(
				new BufferedOutputStream(uc.getOutputStream()));
			out.write(json);
			out.close();

			BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));
			String line = in.readLine();
			String body = "";
			while (line != null) {
				body = body + line;
				line = in.readLine();
			}
			uc.disconnect();
			return body;
		} catch (IOException e) {
			e.printStackTrace();
			return "client - IOException : " + e.getMessage();
		}
	}
```

#サーブレット側のコード
POSTされたデータを受け取って JSONArray と JSONObject にして保管します。

```java:doPost
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("application/json; charset=utf-8");
		BufferedReader br = new BufferedReader(request.getReader());
		String line = br.readLine();
		String body = "";
		if (line != null) {
			body = body + line;
			line = br.readLine();
		}
		PrintWriter out = response.getWriter();
		out.println("{\"status\":\"OK\"}");
		out.flush();
		out.close();

		try {
			LinkedList todo = new LinkedList();
			JSONArray ja = new JSONArray(body);
			for (int i = 0; i < ja.length(); i++) {
				JSONObject tdj = (JSONObject) ja.get(i);
				//処理追加                        
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}
```
nodistでnodejsのバージョン管理をやっていたらnpxが使えないのを解消


結論（事象の確認と対応）

```
where npm #これで複数表示される
npm -i npm -g #これでいずれのバージョンもアップデートされる。
```

以下やってだめだったこと(´・ω・｀)

```
nodist npm x.y.z
```

結局npxは入らない。nodeの下位バージョンでnpmのバージョン指定アップデートを実施すると、以降は`npm --version`のバージョン表示ですら、npmlogが足りないなど、エラーを生じるようになってしまってNG。
※nodistのuninstall→installを繰り返すと解消することもあるが本質的でない。


修正の参考qiitaはcf

cf
[nodistでnode.jsを入れた後npmがバージョンアップできない問題](https://qiita.com/horihiro/items/b2d67fabf9d63cdaf1ec)
[nodistでnpmをUpdate](https://qiita.com/shika358/items/0be01167d02c1abec186)
[nodistのnpmにはnpxがバンドルされないので、別途入れてみた。](https://qiita.com/horihiro/items/93c3fb247d39911ccdf0)
[React] CSVを使わずに表形式のデータを入出力する

# :star: テーマ
- ExcelやGoogleスプレッドシートなど表形式のデータをいちいちCSVに変換して入出力するのはめんどくさい！
- ちょっとした表形式のデータならコピー&貼り付けで入出力できればよくない？
- ということで、表形式のデータをコピペで扱えるIFをReactで実装してみました


# :star2: 方法
- react-handsontableを使うと簡単に実装できます
- 公式：[react-handsontable ](https://github.com/handsontable/react-handsontable)
- `HotTable`コンポーネントのdataに配列で値を入力できます
- 出力は`ref`を設定して参照することで値を取り出しています
- 表示されている表よりも長いデータをコピペしても自動で伸びるので便利です。
- [Handsontable](https://handsontable.com/)というJavaScriptのライブラリを元にしているので、こちらのドキュメントを読むと詳しい使い方が書いてあります。


# :pencil:　デモ
<p data-height="709" data-theme-id="0" data-slug-hash="zaqRME" data-default-tab="result" data-user="mikan3rd" data-embed-version="2" data-pen-title="react-handsontable DEMO" class="codepen">See the Pen <a href="https://codepen.io/mikan3rd/pen/zaqRME/">react-handsontable DEMO</a> by hiroki-ota (<a href="https://codepen.io/mikan3rd">@mikan3rd</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
LaTeXで数式書くときはmathpixで手書きが便利

# 課題・背景
- 機械学習の成果の記録や発表で、Jupyter Notebookやパワポに数式を書きたい。
- LaTeXで書かなきゃいけないが、LaTeX表記を覚えるのが面倒……。
- 手書きの画像だとちょっと数字を変える時が面倒……。

# 対策
- [mathpix](https://mathpix.com/)を使い、手書きの数式をLaTeX化！
- OS X, iOS, Android機種いずれも対応。ゆくゆくはWindowsにも対応。

## 実際にやってみた
- アプリストアからインストール
<br>  

- sigmoid function
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/dd568e81-42f7-0a25-19e7-560adfdea3cd.png)  
<br>  

- 結構な精度で（私の字がきわめて下手であるにも関わらず）読み取ってくれる。
- 方程式形式にすると、グラフ描画もしてくれる。
- スマホアプリなので、タッチ操作で移動・拡大も可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/5a572c0d-647a-9ea5-734e-7a5143cef0bf.png)  
<br>  

- LaTeX表記にしてくれる。コピペ可能。
- エクスポネンシャルがeの階乗になっていたり、細かいところにも気が利いている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/5d215856-6386-7da2-52d3-7bffe7eee3f2.png)  
<br>  

- JupyterNotebook(画像はJupyterLabですが)で表示
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/dcd97e9e-abe8-daba-caec-9cee19a4c84e.png)  
<br>  

- もちろん行列も対応。しかも計算もしてくれる……。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/85cf7f2e-4144-9b7b-7269-532abab61f18.png)  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/63503978-d536-791a-ad22-9b02392cf183.png)  




# 結論
- Mathpixはかなり高い精度で数式を認識し、LaTeX化や、計算を行ってくる。
- すなわち最高。（学生は悪用しないように……）
リロード判定したいwindow.performance.navigation.type

## リロード判定する必要がありました。
リロードしたか否かの判定する必要がありましたので、調べました。
JavaScriptで実現できるようです。

## ページ読み込みが何によって起きたかを知る

window.performance.navigation.type:の値によって、ページ読み込みが何によって起こされたかを知れる。詳しくは公式のリンクを参考に貼り付けますので、ご確認ください。

- 0 : リンクのクリック
- 1 : リロード(再読み込み)
- 2 : 履歴をたどる読み込み
- 255 : 上記以外の定義

###　参考
[Navigation Timing API](https://developer.mozilla.org/ja/docs/Web/API/Navigation_timing_API)