OmniAICreator/Qiita-1.07M huggingface dataset:
EclipseでJava compiler level does not match the version of the installed Java project facet.となったときの対応方法

# 事象 : EclipseでプロジェクトのJavaコンパイラーを設定したら怒られた。
```bash:Eclipseの[問題]タブに表示されたメッセージ
# 日本語の場合
Java コンパイラー・レベルが、インストールされている Java プロジェクト・ファセットのバージョンと一致しません。
# 英語の場合
Java compiler level does not match the version of the installed Java project facet.
```

## 原因 : 「Javaコンパイラー」と「プロジェクト・ファセットのJava」で指定しているJavaのバージョンが違うから
- [Eclipse/エラー：Java compiler level does not match the version of the installed Java project facet&nbsp;|&nbsp;Tipi](http://tunes.sakura.ne.jp/tipi/?Eclipse%2F%A5%A8%A5%E9%A1%BC%A1%A7Java%20compiler%20level%20does%20not%20match%20the%20version%20of%20the%20installed%20Java%20project%20facet)
- [Java コンパイラー・レベルが、インストールされている Java プロジェクト・ファセットのバージョンと一致しません　というエラーが出た場合 - ハニカムウエアのブログ](http://honeycomware.hatenablog.jp/entry/2016/11/24/232340)

### 対応 : 「プロジェクト・ファセットのJava」と「Javaコンパイラー」のバージョンを合わせる
1. [プロジェクト・ファセット] > [Java] > コンパイラに設定したJavaと同じバージョンを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/e89dae1a-3311-313a-353a-dbf1e10d16f7.png)

# 事象 : Javaコンパイラーを設定しても勝手に1.5に戻って怒られる。
- 環境
    - macOS Big Sur バージョン11.1
    - Eclipse IDE for Enterprise Java Developers Version: 2020-12 M1 (4.18.0 M1)
    - 使いたいのはJava11

1. [Javaコンパイラー]を「11」に設定する
2. [プロジェクト・ファセットのJava]を「11」に設定する
3. Mavenビルドする
4. 「Java コンパイラー・レベルが、インストールされている Java プロジェクト・ファセットのバージョンと一致しません。」と言われる
5. [Javaコンパイラー]を確認すると「1.5」に戻っている

## 原因 : Mavenのコンパイルで使うデフォルトのJDKが1.5だから
> デフォルトでは、Maven 2はJDK 1.4を使用し、Maven 3はJDK 1.5を使用してプロジェクトをコンパイルします。
> [別のJDKバージョンのMavenプロジェクトをコンパイルするには？](https://www.codeflow.site/ja/article/maven__how-to-compile-maven-project-with-different-jdk-version)

### 対応 : pom.xmlで使うJDKを指定する
参考 : [Apache Maven Compiler Plugin &#x2013; Setting the -source and -target of the Java Compiler](https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html)

1. pom.xmlにJDKを設定する
2. Mavenビルドする
3. [Javaコンパイラー]が「11」のまま維持された！

```xml:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...省略...
  <properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
  </properties>
...省略...
```
SQL での null の注意点をおさらいする

## はじめに

null を検索対象とする場合は、is null や is not null を使う必要があります。null は、その項目に空値が格納されているのではなく、その項目の値がメモリに存在しない状態であるためです。
存在しないものは検索できないので、原則 null は、検索条件（= や <> など）の検索対象になりません。


## 気を付けたい SQL

### 対象テーブル(T)

|  Q  |  R  |
|:---:|:---:|
|  1  |  2  |
|  3  |  4  |
|null |  5  |

### NULL が含まれない SQL (1)

` select * from T where Q <> 3 `

|  Q  |  R  |
|:---:|:---:|
|  1  |  2  |

### NULL が含まれない SQL (2)

` select count(Q) from T `

| count(Q)  |
|:---:|
|  2  | 

### NULL が含まれない SQL (3)

` select SUM(Q) from T `

| SUM(Q)  |
|:---:|
|  4  |

### NULL になっちゃう SQL

` select Q + R from T `

| Q + R |
|:---:|
|  3  |
|  7  |
| null  |

## おまけ（SQL Server）

- isnull(A, B)：Aの値がNULLでない場合はAを、NULLの場合はBを返す。
- nullif(A, B)：A=Bの場合は、NULLを、A<>Bの場合はAを返す。

` case when 分母 IS NULL OR 分母 = 0 then 分子 else 分子/分母 end `
↓
` 分子 / isnull(nullif(分母,0),1) `

## おわりに

DBMSによっては、「= null」でも検索対象となる場合があります。
こういったお助け機能があるせいか、null を意識していない SQL がたくさんあったので、復習がてらにまとめてみました。
Javaでiniを編集する:ini4j編

Javaでiniを編集するにはどうしたらよいか。

ini4j(https://mvnrepository.com/artifact/org.ini4j/ini4j) を使ってみる。
#注意
ini4jがちゃんと動作しない可能性があるので、必ず振る舞いを確認すること。
ー＞同一変数名の項目があるとおかしくなる。

#Maven
```xml
<!-- https://mvnrepository.com/artifact/org.ini4j/ini4j -->
<dependency>
    <groupId>org.ini4j</groupId>
    <artifactId>ini4j</artifactId>
    <version>0.5.4</version>
</dependency>
```
注)ソースコードはhttps://ourcodeworld.com/articles/read/839/how-to-read-parse-from-and-write-to-ini-files-easily-in-javaより
#iniを読み出す
```java
Wini ini = new Wini(new File("C:\\Users\\sdkca\\Desktop\\myinifile.ini"));
int age = ini.get("owner", "age", int.class);
double height = ini.get("owner", "height", double.class);
String server = ini.get("database", "server");
```

#iniを書き込む
```java
Wini ini = new Wini(new File("C:\\Users\\sdkca\\Desktop\\myinifile.ini"));
            
ini.put("block_name", "property_name", "value");
ini.put("block_name", "property_name_2", 45.6);
ini.store();
```

#iniのセクションを消す
```java
Wini ini = new Wini(new File("C:\\Users\\sdkca\\Desktop\\myinifile.ini"));
            
ini.remove("section_name");
ini.store();
```

#Reference
https://ourcodeworld.com/articles/read/839/how-to-read-parse-from-and-write-to-ini-files-easily-in-java
http://tmyk-h.hateblo.jp/entry/2014/01/31/014937
https://codeday.me/jp/qa/20181218/35503.html
HTMLその１（タグと要素）超初心者

実際にHTMLを書いてみようと思うんだけど、何かルールとかってあるのかなぁ？

HTMLには、基本的な書き方があって、
開始タグ・・・<h1>
↑要素の開始地点
終了タグ・・・</h1>
↑要素の前に/を入れるよ！

例外はあるけど、基本はこの２つによって書かれるみたい

例えば・・・
<h1>りんご</h1>

とか

<h1>
りんご
</h1>

こんな感じ(-v-))

「要素って出てきたけど、要素って何だろう？」

要素っていうのは、開始タグと終了タグまるまる含めた全体のこと。

そしてHTMLは大まかに

"head要素とbody要素"

っていう２つの要素があるんだって。


head要素っていうのは、そのサイト自体の根本的な情報が入っているんだけど、サイトからは見えないシークレット情報のこと。

body要素は、見た目・・・文字とかの詳細なところを担当してて、結構見られちゃう部分。

これはとっても大事なことだけど、
<!DOCTYPE HTML>
これは、
htmlで書くぞ！っていう宣言なんだって(ovo)！
これがないとエラーが起きちゃうみたい

＜今日のまとめ＞

・htmlは、開始タグと終了タグがあって、
終わりのタグには/を入れる

・htmlのhead部分は見えない情報、
body要素は見える情報
media query

```html
<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico" />
	<title>media query base</title>
	<style type="text/css">
		* {
			box-sizing: border-box;
		}

		.container {
			height: 90vh;
			margin: 0 auto;
			border: 1px solid black;
		}

		@media screen and (min-width: 0px) and (max-width: 575px) {
			.container {
				width: 320px;
				background-color: rgb(250, 230, 250);
			}

			h3::after {
				content: 'narrower than 576px';
			}
		}

		@media screen and (min-width: 576px) and (max-width: 767px) {
			.container {
				width: 540px;
				background-color: rgb(250, 230, 230);
			}

			h3::after {
				content: 'between 576px and 767px';
			}
		}

		@media screen and (min-width: 768px) and (max-width: 991px) {
			.container {
				width: 720px;
				background-color: rgb(230, 250, 230);
			}

			h3::after {
				content: 'between 768px and 991px';
			}
		}

		@media screen and (min-width: 992px) and (max-width: 1199px) {
			.container {
				width: 960px;
				background-color: rgb(230, 230, 250);
			}

			h3::after {
				content: 'between 992px and 1199px';
			}
		}

		@media screen and (min-width: 1200px) {
			.container {
				width: 1140px;
				background-color: rgb(240, 240, 240);
			}

			h3::after {
				content: '1200px or wider';
			}
		}
	</style>
</head>

<body>
	<header>

	</header>
	<main rule="main">
		<div class="container">
			<h3></h3>
		</div>
	</main>
	<footer>

	</footer>
</body>

</html>
```
「Git」の超簡単取り扱い説明書

#はじめに
私は、大学４回生です。
現在、未来電子テクノロジーでプログラミング開発コースに所属しています。
今回は、gitの超簡単な取り扱い説明書についてお話しします。

#Gitの流れ
共同開発をする際にステップが３つあります。

ステップ１：コードを変更する
ステップ２：共有する準備を行う
ステップ３：共有する

仕組みとは、アップロード→リモート→ダウンロードの繰り返しです。
（「pull」→「add」→「commit」→「push」の繰り返し）


#コマンド
編集

```
$git add (ファイル名)
```

記録

```
$git commit -m"（メッセージ）"
```
リモート

```
$git remote add origin (url)
```
ダウンロード

```
$git pull origin master
```
#まとめ
「Git」は、これらだけではわからないことが山積みです。
実際にどんどん使って慣れていきたいです。
ローカルリポジトリにリモートリポジトリの内容を後から上書きする

- 新たに開発環境を作成した
- ローカルリポジトリを作成した
- リモートリポジトリにあるソースコードをPULLしたい
- なかなかうまくいかない ← 解決した

```bash
git init
git remote add origin [your repository URL]
git fetch origin
git reset --hard FETCH_HEAD
git pull origin master
```
メソッドの定義とthisを整理

- 関数宣言
- アロー関数式

```javascript
this.message = 'global';

// function statement
function func_st() { console.log(`this is ${this.message}`) }

const obj_st1 = {
    message: 'local',
    func: func_st,
}

const obj_st2 = {
    message: 'local',
    func: function () { console.log(`this is ${this.message}`) },
}

const obj_st3 = {
    message: 'local',
    func() { console.log(`this is ${this.message}`) },
}

// arrow function expression
const func_ex = () => { console.log(`this is ${this.message}`) }

const obj_ex1 = {
    message: 'local',
    func: func_ex,
}

const obj_ex2 = {
    message: 'local',
    func: () => { console.log(`this is ${this.message}`) },
}

obj_st1.func(); // -> this is local

obj_st2.func(); // -> this is local

obj_st3.func(); // -> this is local

obj_ex1.func(); // -> this is global

obj_ex2.func(); // -> this is global
```
PHPでのcurl使用方法をメモ

phpでのcurl使用方法は決まり文句みたいなものなのでメモ。


```php
// リクエストヘッダー 設定
$headers = array(
    "Content-Type: application/json",
);

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);  
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);  
curl_setopt($curl, CURLOPT_COOKIEJAR,      'cookie');
curl_setopt($curl, CURLOPT_COOKIEFILE,     'tmp');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);

$output = curl_exec($curl);
curl_close($curl);

```


大まかな流れととしては、こちら。

```php
//curlセッション初期化。urlも設定
curl_init($url);

//curlオプション設定
curl_setopt();

//curl実行
curl_exec();

//curlセッション終了
curl_close();

```

#いろいろなオプション設定
curl_setoptでいろいろとオプションがつけられる。



よく使用するものだけメモ。

###CURLOPT_CUSTOMREQUEST
メソッド名指定。GETのときは不要。

```php
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
```

###CURLOPT_RETURNTRANSFER
curl_exec()を実行時、返り値を文字列で返す。

```php
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
```

###CURLOPT_HTTPHEADER
ヘッダー設定

```php
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
```

###CURLOPT_SSL_VERIFYPEER
falseを設定するとサーバー証明書の検証を行わない。
オレオレ証明書対策（自分で証明した証明書）
これを設定することでcurl_exec()を実行時、エラーを回避できる。

```php
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
```

###CURLOPT_SSL_VERIFYHOST
こちらもCURLOPT_SSL_VERIFYPEER同様にfalseにする必要がある

```php
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); 
```


###CURLOPT_COOKIEJAR
接続終了時にすべてのcookieを保存するファイル名

```php
curl_setopt($curl, CURLOPT_COOKIEJAR,      'cookie');
```

###CURLOPT_COOKIEFILE
クッキーのデータを保持するファイル名
PHPのcurlからCookieを扱うには、CURLOPT_COOKIEJAR、CURLOPT_COOKIEFILEの両方を宣言する必要あり？

```php
curl_setopt($curl, CURLOPT_COOKIEFILE,     'tmp');
```

###CURLOPT_FOLLOWLOCATION
ヘッダーにLocationがあれば、再帰的にたどる。

```php
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
```

cURLではHTTPステータスコードが300系などで既に移転してしまったサイトなどは
リクエストのヘッダにLocationがあればリダイレクトしてたどっていく機能がある。
引用:http://mio-koduki.blogspot.com/2012/08/phpcurl-curl_23.html
作成したゲームの演出を強化する

# ゲーム演出の強化

これまで取り組んでいる AZML プロジェクトなるモノで、モブプロによるミニゲームを作成しています。それぞれで出来上がるミニゲームはシンプルなモノが多いわけです。そんなことから見た目が質素なカンジになってしまう、もっと言えばショボくなる宿命を背負っているわけです。この記事はそんな宿命に抗って出来る限りショボく見えないように戦った記事になります。

ちなみに AZML プロジェクトってなんやねんという方は以下の記事をお読みいただけると助かります。

[Unityでモブプログラミングやってみよう【発足】](https://qiita.com/tamoco/items/ab3b1abae42cd6818356)

[Unityでモブプロのまとめページ【AZML】](https://qiita.com/tamoco/items/4faa49af56a8ba011ae3)

## 3 つ同じ色のボタンをタッチするゲーム

### BEFOER

ルールはタイトルに書いたとおりのシンプルなゲームです。ゲームがシンプルがゆえに何も手を入れてあげないとモノ足りなさを感じます・・・。前回の作成したモノで詳細についてはこちらの記事をご確認ください。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/5a6e5b16-a1aa-d305-fd9c-48662fbee5ad.png" width="50%">

[【一日目】Unity でモブプログラミング[B01_ColorPattern]](https://qiita.com/tamoco/items/b9b1fefefd91b0337f8a)

### AFTER

タイトル画面を以下のようなカンジにしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/5fd47108-e51a-624b-5725-a94c91063eec.png" width="50%">



演出を強化するということで女の子を登場させました。カワイイ女の子が出てくれば世界は平和です。女の子だけだと全体的に急に出てきた感じがあるので、女の子の背景にカラフルなオブジェクトを生成するようにしました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/7537abc7-3ad7-98d0-cf8f-d962eac89571.gif" width="50%">

ゲームオーバーの場合には女の子に当たってゲシゲシ？なるようにしました。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/94738f7d-5f10-4d76-8dd4-b3217df3fc63.gif" width="50%">

### 総評

寂しいカンジがしたら女の子を出すのは常套手段です。そこにもう１つ何かを加えることで統一感のようなモノが出たのかもしれません。ちなみに今回使った女の子は「キャラクターなんとか機」を使用させていただきました。絵が描けなくてもカワイイ女の子を使えるのは本当に助かります。

## 食べて出すゲーム

見た目が若干ユルユルなカンジです。女の子を出して全体的な統一感を出していってもイイですが、統一させると次回以降自由に作れなくなってしまうので、女の子を出さないカンジでガンバリます。
こちらも詳細については過去の記事をご確認ください。




[【一日目】Unity でモブプログラミング[B02_Dase]](https://qiita.com/tamoco/items/f9802af3dd07f8039da8)


### BEFORE

全体的に粗挽き感が目立つカンジのゲームです。こちらもタイトルや結果画面を中心に演出を強化しました。白いノイズが目立つのでゲーム自体は白い背景に修正しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/3b9df164-82d3-b4ca-2fec-92d64d742838.gif" width="50%">


### AFTER

タイトルにゲームのルールを記載しました。ただ、これでも完全にわかってもらえるかというと不安ですが、説明しすぎるのも何か違う気がしているので、こういうカンジになりました。メイドインワリオでは細かな説明ナシに唐突に始まるのでプレイしてから慣れてもらうのでもイイと思ってます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/7d227178-a762-440c-954c-3c287c2da947.png" width="50%">

ゲームの結果画面はオニギリを回転させてハデにしてみたつもりです。何も動きがない結果画面よりも何か動いていた方がイイカンジに見えるかなと。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/7f9726fc-5359-6ef0-a811-48eea4bf7de0.gif" width="50%">


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/be43e253-f6d4-5965-9e19-cf0f3f046698.gif" width="50%">

### 総評

今回の場合は女の子は登場しませんでした。そうでなくてもゲーム中のオブジェクトを使って動かしたりすることで演出に繋ぐことができるような気がします。

### 最終的なまとめ

ゲームの場合はシステム的な UI／UX とは別のセンスが求められるかもですね。センスはともかく良さそうにカンジたら、とりあえずやってみよう精神です。そういう意味では Unity は画面にすぐに出力されますし、そういった精神でチャレンジしやすいツールだと思います。何かゲーム作りたいな～って思ったらとりあえず Unity でチャレンジしてもイイんじゃないでしょうか。
Numbaを使ってNumpy処理を高速化

# 以下のような処理を行いたい

```python
def transfer_balls(box, mm):
    # ボールをmm回シャッフルする
    for i in range(mm):
        # 箱を2つランダムに選ぶ（同じ箱を選ばないようにする）
        flg = True
        while flg:
            x1, y1 = np.random.randint(0, 100, (2,))
            x2, y2 = np.random.randint(0, 100, (2,))
            if x1 == x2 and y1 == y2:
                continue
            break

        nt = box[y2, x2]
        n1 = box[y1, x1]
        n2 = box[y2, x2]

        # ボールを移動させる
        if n1 - nt >= 1:
            n1 -= nt
            n2 += nt
        else:
            n2 = n2 + n1 - 1
            n1 = 1

        box[y1, x1] = n1
        box[y2, x2] = n2

    return box
```
箱をランダムに2つ選んでボールを移動させる、というシミュレーションを行いたい。
試行回数（mm）が100回程度なら良いのですが、これを100万回や1000万回にすると、めちゃくちゃ時間がかかってしまいます。

# Numbaを使おう
どうやらNumbaを利用すると簡単に処理を高速化できるらしい。使い方↓

```python
from numba import jit


@jit('（戻り値の型）(（引数1の型）,（引数2の型）,…)', nopython=True)
def hogehoge(bar, foo):
	# 時間のかかりそうな処理
	return fuga
```

戻り値と引数の型を指定してあげて、デコレータを書くだけです。簡単ですね。
型指定方法は[こちら](http://numba.pydata.org/numba-doc/0.15.1/quickstart.html)に記載してあります。
ちなみに2次元配列の場合は　型[:,:]　3次元配列の場合は　型[:,:,:]　のように書いてあげると動作します。

今回は
戻り値：numpyの2次元配列（中身はfloat64）
引数1（box）：numpyの2次元配列（中身はfloat64）
引数2（mm）：int32
なので、以下のように記述します。

```python
@jit('f8[:,:](f8[:,:],i4)', nopython=True)
def transfer_balls(box, mm):
    ###
    return box
```

# 処理速度を計測
今回、mm = 400万　として計測してみました。
何もなし：147秒
jitあり：**6秒**
実に20倍近く早くなりました。正確に計測していませんが、mmを2500万にした場合、何もなしだと10～20分程度かかりましたが、jitありだと1分足らずで終わってしまいました。

簡単に処理速度を上げることができるので、Numbaオススメです。
AndroidエミュレーターへのアプリインストールがINSTALL_FAILED_INSUFFICIENT_STORAGEで失敗する

# 事象
エミュレーターに対してアプリをインストールした際に`INSTALL_FAILED_INSUFFICIENT_STORAGE`と表示されインストールが失敗する。

# 原因
エミュレーターの内部ストレージがいっぱいになっている際に発生。
私がこの事象に遭遇した際には`/data`配下が91％使用済みになっていました。

# 対応
私はエミュレーターを新規で作り直しました。
エミュレーターのストレージサイズを上げたい場合は、`Android Device Manager`で新規エミュレーター作成を行う際にストレージサイズを指定することができるので、そこで大きめに設定することで解決できます。
Ruby form_tagとlink_toの違い

初投稿になります。

**今後よろしくお願いします。**


Progateで学習中に思った悩みを今回は解決します。

初回はform-tagとlink_toの違いについてです。


##form-tag


form-tagメソッドではフォームに
入力されたデータを送信することができます。

Progateから拝借。



```html

<%= form_tag("/posts/create") do %>

<textarea></textarea>

<input type ="submit" value ="投稿" >

<% end %>
```


ここで書いたコードで入力フォームが出来上がるので


そこに入力された値が投稿ボタンを押されると

```

/posts/create
```

に送信されます。


これはルーティング内
の/posts/create
に送られ


その後のcontroller内の

メソッドが実行されます。




```ruby
def create

 @post = Post.new(content: params[:content])
    @post.save
    redirect_to("/posts/index")

end

```

createメソッドが実行され


新しいインスタンス作成

その中のcontentを保存 

/posts/indexにリダイレクト
    

してメソッド終了となります。


　　　






for_tagを用いることでその投稿や保存後に

・ページの遷移
・入力内容の保存・更新

が行えるようになります。




##link_to


link_toメソッドとは何なのか


これは、あるurlへ飛ばすために用いられるものです。

```html

<%= link_to("Create","/post/create") %>

```

としてあげます。

ここでの第一引数であるCreateは

文字列に値します。    


一方で第二引数は

urlを示します。

なので単純に

```html


<a href ="/about">Create<a>
```

と表示され、このCreateをクリックすると第二引数のurlへ飛びます。




##まとめ


　　
　　
こんな感じで初回はまとめてみました。
Web系のエンジニアになるのは遠い道のりで多くの人
が諦める道かもしれません。

　　
　　
けれども自分からしたらそっちの方がありがたいです。


　　

頑張ってればライバルが減ってくれるから。


　　
もし諦めたくない人は一緒に頑張りまっしょい！

　　

では！
競プロチートシート(python3)

atcorderとかpaizaとか就活のコーディングテストとか。
おいおい追加していく予定。
## 入力
- 単数入力

```py
#入力が文字列の時
n = input()
#入力が数値の時
n = int(input())
```

- 複数入力(文字列の時はintをstrにしてね)

```py
#それぞれの変数に入力
n , m , l = map(int , input().split())
#listにしたい時
list_n = list(map(int , inpuut().split()))
```

- 複数行入力

今まで

```py
#N回入力
N = int(input())
#リストをあらかじめ作成
list = []
for _ in rnage(N):
    list.append(input())
```

どうやらこれで良いらしい。コンパクトにかけて便利

```py
N = int(input())
list = [input() for _ in range(N)]
```
## 配列

python使ってるから基本はリスト使う。リスト便利

 - 一次元リスト

``` py
list = [i for i in range(N)]
```

 - 二次元リスト

``` py
list = [[i for i in range(N)] for _ in range(M)]

# list = [[0] * N] * M　みたいな書き方は参照先が重複しバグの原因になるからだめ。
# 三次元以上を扱うときはfor文を使って書いた方がどう考えてもわかりやすい
```




## 組み合わせ（combination）

組み合わせの計算をしながらmodを考慮したい時

```py
def cmb(n, r, mod=10**9+7):
    if ( r<0 or r>n ):
        return 0
    r = min(r, n-r)
    return g1[n] * g2[r] * g2[n-r] % mod

mod = 10**9+7 #出力の制限
N = 10**6
g1 = [1, 1] # 元テーブル
g2 = [1, 1] #逆元テーブル
inverse = [0, 1] #逆元テーブル計算用テーブル

for i in range( 2, N + 1 ):
    g1.append( ( g1[-1] * i ) % mod )
    inverse.append( ( -inverse[mod % i] * (mod//i) ) % mod )
    g2.append( (g2[-1] * inverse[-1]) % mod )

a = cmb(n,r,mod)
```

> 引用：[【Python】組み合わせ(nCr) 計算の高速化](https://qiita.com/derodero24/items/91b6468e66923a87f39f)


## 約数のリスト
$O({\sqrt{n}})$で求められる。
C問、D問あたりで多いイメージ。
約数関係はこれかユークリッドの互除法使うイメージ


```py
def make_divisors(n):
    divisors = []
    for i in range(1, int(n**0.5)+1):
        if n % i == 0:
            divisors.append(i)
            if i != n // i:
                divisors.append(n//i)

    # divisors.sort()
    return divisors
```

> 引用：[約数を高速で列挙するコード(Python)](https://qiita.com/LorseKudos/items/9eb560494862c8b4eb56)

## 累乗
組み込み関数を用いる。10**9+7のあまりも第三引数に指定することで高速に処理ができる。

```py
print(pow(10 ** 9, 10 ** 5, 10 ** 9 + 7))
# 出力：183133701

```
標準出力と標準エラーをまとめて追加出力 (append) する話

標準出力も標準エラー出力もまとめて、同じファイルに追加出力 (append) で出力したかった。
ちゃんと考えたことが無くて調べたので、メモをここに。

# 単一リダイレクト

これだと毎回ファイルが切り捨てられて、追加出力にはならない。

```terminal
$ COMMAND 1>/path/to/log 2>&1
$
```

# 追加出力 (失敗)

2 (標準エラー) の向き先を変える命令は `>>` にするとシンタックスエラー。

```terminal
$ COMMAND 1>>/path/to/log 2>>&1
-bash: 期待してない token `&' のあたりにシンタックスエラー
$
```

# 追加出力 (成功)

向き先を変えるのは、使い慣れた `2>&1` で OK。

```terminal
$ COMMAND 1>>/path/to/log 2>&1
$
```
「だっふんだ」と言わなくてもSAP CP SDK for iOS Assistantをアップデートする

# せっかく久しぶりにiOSアプリを実装したのにビルドできない

いつもはSAP Fioriの実装に忙しいあなたも、たまにはiOSアプリ実装の必要に迫られるときがあるはずです。

JavaScriptからSwiftへと頭を切り替えてやっとのことで実装したアプリをいざiPhoneの実機でビルドしようとすると、iOSのバージョンとXcodeのバージョンが合わないために、Xcodeのバージョンアップを求められることがあります（iOSもSwiftもXcodeも、SAPに比べると容赦ないスピードでアップデートします）。

XcodeをアップデートするためにはMac OSのアップデートが必要だったりするのでなかなか時間はかかるものの、忍耐強く待ってさえいればアップデートは終わるのでゆったり構えてDVDでも見ながら待てば良いのですが、やっとアップデートが終わったあとでわくわくしながらもう一度ビルドしてみると別のエラーが出てしまうかもしれません。

```
Module compiled with Swift 4.2.1 cannot be imported by the Swift 5.0 compiler...
```

だっふんだアプリのお披露目は明日に迫っているのに……！

# エラー詳細

SAP Cloud Platform iOS Assistantからエクスポートして使っているframeworkがインポートできなくなっているようです。

```swift:ViewController
import UIKit
import SAPFiori //このへんでエラーが出る
import SAPOData //このへんでエラーが出る
import AVFoundation
import Speech
```

# 解決法: SAP CP SDK for iOS Assistantの最新版を手に入れる

あっけないですが、[ダウンロードサイト](https://www.sap.com/developer/trials-downloads/additional-downloads/sap-cloud-platform-sdk-for-ios-14485.html)から最新版のSDKを落とし、最新版のSDKから改めてframeworkをエクスポートすればOKです。
<img width="982" alt="blog20190624.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320955/a83b5236-5db4-bdec-e21c-1a4cc9980835.png">

適当なディレクトリに新しいframeworkをExportしたら、
Xcode Projectのディレクトリにはいっている古いframeworkを削除して新しいものをコピペし、Clean Build Folderした上でBuildするとあっさり解決しました。

# だっふんだと言わなくても

久しぶりのビルドなんて怖くない最強の日曜Swiftプログラマになりましょう。
結局

ICカードで施錠 https://qiita.com/carpenders/items/94d29098127faaffe1fc

### source code
```
#!/usr/bin/python
# -*- coding: utf-8 -*-

import binascii
import nfc
import pigpio
import time

PIN_INP = 17
PIN_PWM = 18

push = 0

def cb_up(gpio, level, tick):
	global push
	#print gpio, level, tick

def cb_down(gpio, level, tick):
	global push
	if push == 0:
		push = 1
		print "button", gpio, level, tick

def on_startup(target):
	print "on_startup"
	return target

def on_connect(tag):
	print "on_connect"
	print tag
	# return False # break connect
	return True # keep connect

def on_release(tag):
	print "on_release"

def connect(clf):
	clf.connect(rdwr={
		'on-startup': on_startup,
		'on-connect': on_connect,
		'on-release': on_release
	})
	print "connect end"

idlist = { \
	'xxxxxxxxxxxxxxxx': 'n', \
	'xxxxxxxxxxxxxxxx': 'y', \
	}

def unlock_lock(pi):
	w1 = 1000
	w2 = 2000
	pi.set_servo_pulsewidth(PIN_PWM, w2)
	time.sleep(1)
	pi.set_servo_pulsewidth(PIN_PWM, w1)
	time.sleep(1)
	pi.set_servo_pulsewidth(PIN_PWM, 0)

def sense(pi, clf):
	global push
	while True:
		target_req = nfc.clf.RemoteTarget("212F")
		target_res = clf.sense(target_req, iterations=1, interval=0.1)
		if target_res != None:
			#print "res", binascii.hexlify(target_res.sensf_res)
			tag = nfc.tag.activate_tt3(clf, target_res)
			#print "tag", tag
			idm = binascii.hexlify(tag.idm)
			pmm = binascii.hexlify(tag.pmm)
			#print "idm", idm, "pmm", pmm
			hit = 0
			yes = 0
			for k, y in idlist.items():
				if idm == k:
					hit = 1
					if y == 'y':
						yes = 1
					break
			if hit != 0 and yes != 0:
				print "accept", idm
				unlock_lock(pi)
			else:
				print "ignore", idm
				time.sleep(1)
		if push == 1:
			unlock_lock(pi)
			push = 0

def main():
	pi = pigpio.pi()
	pi.set_mode(PIN_INP, pigpio.INPUT)
	pi.set_pull_up_down(PIN_INP, pigpio.PUD_UP)
	cbu = pi.callback(PIN_INP, pigpio.RISING_EDGE, cb_up)
	cbd = pi.callback(PIN_INP, pigpio.FALLING_EDGE, cb_down)
	clf = nfc.ContactlessFrontend('usb')
	if clf:
		print clf
		try:
			sense(pi, clf)
		except KeyboardInterrupt:
			pass
		clf.close()
	pi.set_mode(PIN_PWM, pigpio.INPUT)
	pi.stop

if __name__ == '__main__':
	main()
```
【swift】 要素を画面幅の中央に配置する方法

### 前置き
画面を作る際、storyboardを使っているのですが、文字列を画面幅の中央に配置したい時に、いちいち要素を画面幅いっぱいに広げたうえで`XXX.textAlignment = .center`みたいなコトするのもちょっとアナログでブサイク。
そこで、要素にセットされた文字列の長さに合わせて要素の幅を広げ、なおかつ画面幅の中央に配置できるようなロジックを考えました。
（調べたらすんなり見つかるかと思いきや、全然見つからなかった。探し方悪いんですかね。）

### 開発環境
端末:MacBook Pro/MacOS 10.14.5(Mojave)
Xcode:10.2.1
Swift:5

### 画面イメージ
|「この文字列を画面幅の中央に表示」の部分|
|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126315/ee5c0d0f-e964-ad10-5d78-40425b906ba2.png" width="250">|

### ロジック
下記ロジック見てもらえれば分かるように、「(画面幅 - 文字列の幅)/2」の値を、UILabelの表示位置(X軸、左上)として設定しています。

``` swift:ViewController.swift

    func editLabel() {
        let width = Float(UIScreen.main.bounds.size.width)
        lblTitleLat.text = "この文字列を画面幅の中央に表示"
        lblTitleLat.textColor = .black
        lblTitleLat.font = UIFont.boldSystemFont(ofSize: 20)
        // 文字列をUILabelに中央揃えで表示(一応)
        lblTitleLat.textAlignment = .center
        // 文字列の長さに合わせて、UILabel自体の大きさを調整
        lblTitleLat.sizeToFit()
        // ラベルの表示位置(X軸、左上)の値を算出
        let widthGap = (width - Float(lblTitleLat.frame.width)) / 2
        lblTitleLat.frame = CGRect.init(x: CGFloat(widthGap),
                                        y: lblTitleLat.frame.minY,
                                        width: lblTitleLat.frame.width,
                                        height: lblTitleLat.frame.height)

        // 下の行にも同じ処理を入れてみただけ。
        lblLat.text = "文字列幅：" + (NSString(format: "%.2f", lblTitleLat.frame.width) as String)
        lblLat.sizeToFit()
        let widthGap2 = (width - Float(lblLat.frame.width)) / 2
        lblLat.frame = CGRect.init(x: CGFloat(widthGap2),
                                   y: lblLat.frame.minY,
                                   width: lblLat.frame.width,
                                   height: lblLat.frame.height)
    }
```

### ハマりポイントなど
ハマったというより、こういうのは他の人がいくらでもやってると思ったので、意外とサンプル見つからなかったコト自体が苦労しました。
あと、数学がものすごくニガテなので、「(画面幅 - 文字列の幅)/2」の値を、UILabelの表示位置(X軸、左上)として設定すればよい、という方法論にたどり着くのが大変でした。

なんにせよ、想定通りできてよかったです。
メンテナンスモードをALBだけで実現するCloudFormation Template

# やりたいこと

サービスのメンテナンスモードをロードバランサーの切り替えだけで実現したい。

# 環境

- AWSでALBを使っている

# やり方

- ALBのリスナールールに設定する。

こちらをやります。(クラスメソッドさんありがとう)
https://dev.classmethod.jp/cloud/aws/alb-fixed-response/

- メンテナンス中は、HTTPステータス503、レスポンスbodyにjsonを出力する。

ALBは正しく設定されている前提で必要な部分のみ抜粋して掲載します。

```yaml

AWSTemplateFormatVersion: '2010-09-09'
Description: ・・・・
Resources:
：
（省略）
：
  # 通常パターンのリスナールール
  ALBListenerRule:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    DependsOn: ALBListener
    Properties:
      Actions:
        - Type: forward
          TargetGroupArn: !Ref 'ALBTarget'
      Conditions:
        - Field: path-pattern
          Values:
            - '*'
      ListenerArn: !Ref 'ALBListener'
      Priority: 1
　# メンテナンスモードのリスナールール
  ALBListenerRule503:
    Type: AWS::ElasticLoadBalancingV2::ListenerRule
    DependsOn: ALBListener
    Properties:
      Actions:
        - Type: fixed-response
          FixedResponseConfig:
            ContentType: 'application/json'
            MessageBody: |
              {
                "error_message": "メンテナンス中です。"
              }
            StatusCode: 503
      Conditions:
        - Field: path-pattern
          Values:
            - '*'
      ListenerArn: !Ref 'ALBListener'
      Priority: 2
:
(以下省略)
```

通常は、ALBのターゲットにforwardするが、メンテナンス中はバックのシステムに飛ばさず、固定のJSONを出すため、 Actions の Type　に **fixed-response** を指定する。
固定でだすステータスや JSONのデータは、**FixedResponseConfig** に指定する。

実際にメンテナンスモードにする場合は、AWSマネージメントコンソールにログインし、ALB リスナールールの画面を開き、優先順位を503のルールが優先順位1位になるように変更する。

今回は固定のJSONを出力したけど、画面を出したい場合はHTMLを設定することも可能。
偏差値40の未経験プログラミング学習.ver4

6月24日（月）所要時間：1時間程度

〜学んだこと〜

※記録=コミット
※Git内ではリモート=共有ファイルの置き場
※アップロード=プッシュ
※ダウンロード=プル

共有するファイルの選択　git add
共有するファイルの選択　git add "変更のあるファイル名"
→これで変更できる
選択したファイルをメッセージ付きで共有する準備　git commit -m "メッセージ"
・リモート登録
→リモート登録する際には、名を「origin」と名付けることが一般的
→具体例：git remote add リモート名 URL
・リモートにファイルをアップロード
→具体例：git push origin master
・リモートのファイルをダウンロードする
→具体的：git pull origin master
MacにUiPath入れてみた

<h2>概要</h2>
今回はUiPathを始めようとしているMacユーザーの皆様にインストールまでの道のりを捧げます。

<h2>そもそもUiPathとは</h2>
UiPathとは「業務や作業を自動化するロボット」を作成するツールです。
UiPath社が提供しているためUiPathと呼んでいます。
今流行りのRPA開発ツールの一つですね！
UiPathについては次回詳しく取り扱います！

<h2>Macに対応していない問題</h2>
早速UiPathのサイトからインストールしてみようと思ったのですが、残念なことにMacに対応しておらず使うことが出来ませんでした。

<h2>MacにWindowsを入れてしまおう！</h2>
MacでUiPathを使う方法はただ一つ、MacにWindowsを入れることです。
これを機にやってみることにしました。

<h2>本題</h2>
というわけで実際にMacにWindowsをインストールして、その後UiPathをインストールしてみましょう！

<h3>注意</h3>
Windowsのインストールにはプロダクトキーが必要です。
最も安いところを追い求めたところ、ここが一番安かったです。
https://store.shopping.yahoo.co.jp/sgit/windows10-home-1pc.html?sc_e=afvc_shp_3362637

<h3>1.VirtualBoxをインストール</h3>
MacでWindowsを使用するにはVirtualBoxが必要です。
VirtualBoxを使って仮装ハードディスクを作成し、その中にWindowsを入れるイメージです。

下記のリンクにアクセスして、「 OS X hosts」をクリックするとインストールできます。
https://www.virtualbox.org/wiki/Downloads

<h3>2.VirtualBoxでWindowsの設定</h3>
新規のボタンをクリック→適当な名前とWindowsのバージョンを設定
![スクリーンショット 2019-06-24 20.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/4d72ff42-ad20-a6d4-41e9-c5f97729c936.png)


<h4>メモリーサイズを指定</h4>
![スクリーンショット 2019-06-24 20.25.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/ae01bb58-4471-ecaf-c48a-45a4b7acbfbb.png)

<h4>仮装ハードディスクを作成</h4>
![uipath3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/b5628e5d-f115-f094-1786-be36fb485553.png)

<h4>ファイルタイプを指定</h4>
特別な思想がない限りVDIで良いかと！
![uipath4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/033f00ff-feef-905c-22c8-fb2e19209450.png)

<h4>ストレージは可変サイズで</h4>
![スクリーンショット 2019-06-24 20.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/a9300dc5-9c4e-d2b6-e77c-8b41b891e4ff.png)

<h4>ファイルの場所とサイズの指定</h4>
![スクリーンショット 2019-06-24 20.37.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/e24ee42e-aac3-d917-0b65-4bcc8ac828da.png)

<h4>初期設定完了</h4>
これでVirtualBoxの設定は完了です！
![uipath5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/8e7fc769-2fdd-a0bb-44d4-aa77c2cd5f01.png)

<h3>3.Windowsのインストール</h3>
Windowsのディスクイメージを下記のサイトからダウンロード
https://www.microsoft.com/ja-jp/software-download/windows10ISO

そして先ほどVirtualBoxで設定した仮装環境を起動
ダウンロードしたディスクイメージを選択します。
![スクリーンショット 2019-06-24 20.41.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/e6d8f341-d2e2-7508-89d2-4f4e204c79d3.png)

Windowsの初期設定を行いましょう！
![スクリーンショット 2019-06-24 20.48.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/7948a74a-d8e7-e2b6-c10f-a05096b8a672.png)

設定を進めてインストールを行なった後、冒頭で記述したWindowsのプロダクトキーを入力。
その後、再起動を行って諸々の設定を行うと...
![uipath6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/4bdc79d9-4dee-8c71-b5ad-10a00ffa8ff2.png)
だだん！無事にWindowsを起動することができました！

<h3>4.仕上げのUiPathインストール</h3>
あとはUiPathのサイトから「トライアルの開始」→「Community Edition」をダウンロード
https://www.uipath.com/ja/community
入力したアドレスにメールが届くので、そこからダウンロード、登録したアドレスを使ってActivateしてインストール完了です！
![uipath7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/7b15a6a8-461f-4e96-1c7e-1b974efb5fb8.png)

<h2>まとめ</h2>
以上がMacユーザーがWindowsを入れてUiPathをインストールするまでの手順です。
これで次回はバッチリUiPathで遊ぶことができますね！それでは！
類義語検索ツール

文章書いているときに、ちょいと趣向を凝らすために、類義語に置き換えて言い回しを工夫することがあります。そんなときのために、以前作った[コンソールで日英翻訳するツール](https://qiita.com/cranpun/items/7ed08f855359c9c28a33)の類義語版を作りました。

# できあがり

[syno（github）](https://github.com/cranpun/syno)

Node.js製です。

# 日本語 WordNet

英単語のときはGoogleの翻訳サービスにつなぎました。類義語を引っ張ってくるというAPIは…あるかもしれないですが、今回は日本語 WordNetというところが公開しているデータを利用します。
 [http://compling.hss.ntu.edu.sg/wnja/](http://compling.hss.ntu.edu.sg/wnja/)

単語と、その類義語に関する情報がまとまっており、今回の目的にぴったりです。

**つまり今回は日本語 WordNetの賑やかし記事です。**

「リリース・ダウンロード」の中から「Japanese Wordnet and English WordNet in an sqlite3 database」を使わせてもらいます。

# 日本語 WordNetから類義語を取得する

WordNetでは"概念"という情報が単語に付与されていて、その概念が同じものであれば類義語、と判断します。データベース中にはいくつかテーブルがあるんですが、単語を管理する「word」と、単語と概念を関連付ける「sense」のテーブルを使います。ざっと探したところでは、カラムの説明を見つけられなかったので、あくまで自分の認識です。

## wordテーブル

| カラム | 説明        | 
|:---------|:------------------|
| wordid     | 主キー |
| lang    | 言語の種類。日本語 or 英語  |
| lemma | 単語そのもの |
| pron | 読み方らしいですが、中身は空でした |
| pos | 品詞 |

## senseテーブル

| カラム | 説明        | 
|:---------|:------------------|
| synset     | 概念の主キー |
| wordid     | 単語の主キー |
| lang    | 言語の種類。日本語 or 英語  |
| rank | 不明 |
| lexid | 不明 |
| freq | 不明 |
| src | 不明 |

# コード

1. 検索したい単語をwordテーブルから取得します。
2. そのwordidに対応するsynsetをsenseテーブルから取得します。
3. 最後にそのsynsetが同じ単語が類義語になります。

データベースの形式がsqlite3なので```sqlite3```を使います。

```Javascript
const sqlite3 = require("sqlite3").verbose();
const db = new sqlite3.Database(__dirname + "/wnjpn.db");

// コマンドライン引数に指定された単語を取得します。
const word = process.argv[2];
// 手順1,2に該当します。
// wordテーブルにsenseテーブルをjoinして対応するsynsetを取得します。
const wordsql = `SELECT sense.synset AS synset FROM word JOIN sense ON sense.wordid=word.wordid WHERE lemma = '${word}'`;

db.all((wordsql), (worderr, wordrows) => {
    // 単語が登録されていない場合があるので分岐。
    if (wordrows && wordrows.length > 0) {
        // 見つかった単語のsenseを条件にしてデータを検索します。
        const wordrow = wordrows[0];
        const sql = `SELECT word.lemma AS lemma FROM sense JOIN word ON word.wordid = sense.wordid WHERE sense.synset = '${wordrow.synset}'`;
        db.all(sql, (synoerr, synorows) => {
            // 見つかった類義語を出力します。
            for(let synorow of synorows) {
                console.log(synorow.lemma);
            }
        });
    } else {
        console.warn("no word");
    }
});

db.close();
```

書いてみれば数行。

# おわりに

日本語 WordNetという素晴らしいデータセットのお陰様で、簡単に作ることができてしまいました。単語のデータベースというのは他にもいろいろ応用が効きそうです。活動いただいている方々に感謝です。
FactoryBotで関連モデルも一緒に生成する

FactoryBot でテストデータを作成する際に関連付くモデルも一緒に生成する方法です。
呼び出し元の factory で `after(:create)` コールバックを使います。

# 参考記事
> **Factory Girl Callbacks**
> https://thoughtbot.com/blog/aint-no-calla-back-girl

# 準備
用意するモデル(1 対多の関連付け)

- Post モデル
- Comment モデル

```bash
$ bundle exec rails g model Post title body:text
Running via Spring preloader in process xxxxx
      invoke  active_record
      create    db/migrate/xxxxxxxxxxxxxx_create_posts.rb
      create    app/models/post.rb
      invoke    rspec
      create      spec/models/post_spec.rb
      invoke      factory_bot
      create        spec/factories/posts.rb

$ bundle exec rails g model Comment post:references content
Running via Spring preloader in process xxxxx
      invoke  active_record
      create    db/migrate/xxxxxxxxxxxxxx_create_comments.rb
      create    app/models/comment.rb
      invoke    rspec
      create      spec/models/comment_spec.rb
      invoke      factory_bot
      create        spec/factories/comments.rb

$ bundle exec rails db:migrate
```

```ruby:app/models/post.rb
class Post < ApplicationRecord
  has_many :comments
end
```

```ruby:app/models/comment.rb
class Comment < ApplicationRecord
  belongs_to :post
end
```

# 実装方法
以下のように記述することで、post に関連付く comment を作成することができます。

```ruby:spec/factories/posts.rb
FactoryBot.define do
  factory :post do
    title { 'Test Title' }
    body { 'Test Body' }

    factory :post_with_comment do
      after(:create) do | post |
        create(:comment, post: post)
        # 5.times { create(:comment, post: post) }
      end
    end
  end
end
```

```ruby:spec/factories/comments.rb
FactoryBot.define do
  factory :comment do
    association :post, factory: :post
    content { 'Test Content' }
  end
end
```

spec には以下のように書きます。

```ruby
let!(:post) { FactoryBot.create(:post_with_comment) }
```

これで関連付くモデルも作成することができます。
下記は binding.irb で post に紐付く comment を確認した内容になります。

```
irb(#<RSpec::xxx>):001:0> post.comments
=> #<ActiveRecord::Associations::CollectionProxy [#<Comment id: 1, post_id: 1, content: "Test Content", created_at: "2000-01-01 00:00:00", updated_at: "2000-01-01 00:00:00">]>
```

以上です。
Localeオブジェクトの取得

#Localeとは
　国や言語で分けた「地域」を表す情報のこと。ロケールは__java.util.Locale__クラスのオブジェクトで表す。

#Localeオブジェクトの取得　その１
```java:Myclass.java
Locale loc = new Locale("ja"); //ja
Locale loc = new Locale("en","US"); //en_US
Locale loc = new Locale("fr","CA","POSIX"); //fr_CA_POSIX
```


#Localeオブジェクトの取得　その2
```java:Myclass.java
Local loc = new Locale.Builder().setLanguage("ja").setRegion("JP").build();
//ja_JP
```


#まとめ
ロケールオブジェクトの取得に関して、上記２パターンあることを頭に置いておくべし。
ホームページに画面いっぱいのレスポンシブな画像を表示する方法

#Webサイトのトップページに画面いっぱいのレスポンシブな画像を表示する
###設定はCSSのみ

```html:index.html
  <body>
    <div id="Top"></div>

    <!-- other content -->

  </body>
```

```css:style.css
#Top{
 width: 100vw;
 height: 100vh;
 background-image: url(./your/path/images);
 background-size: cover;
 background-position: center;
}
```
![movie.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436904/ab0725b3-86b6-f7e2-3e9b-8a0380b0feae.gif)
###ポイント
長さを指定する単位にvw, vhを設定することで画面いっぱいに要素を広げることができる。

画像のurlパスは、cssファイルからの相対パスで、index.htmlからの相対パスでないことに注意する。

background-sizeを指定しないと、画像が画面幅に合わせて配置されないので、必ず指定する

また、background-positionを"center"指定すると、画像がいい感じに真ん中でトリミングされる。

指定を"top","bottom","right","leftなど指定することで好きな位置を固定しながらリサイズできる

##まとめ
backgroundで画像を指定することで、簡単に画面いっぱいまで画像を配置することができ、今時のファーストビューに画像ドーーンなWebデザインをレスポンシブに実装することができる。

また、background指定することで、Webページの表示速度が上がり、一石二鳥である。
go言語のマイグレーションツールgoose（bitbucketの方）のdbconf.ymlの書き方の注意点


表題の通り。

```db/dbconf.yml
test:
    driver: postgres
    open: user=liam dbname=tester sslmode=disable

development:
    driver: mysql
    open: {DBユーザー名}:{DBユーザーのパスワード}@tcp(127.0.0.1:3306)/{DB名}
```

* mysqlの場合はdriver名が「mymysql」とかって解説している記事もあったりするのですが、バージョンが上がったのか今現在はmysqlのdriver名は「mysql」のようです

* そもそも、githubとbitbucketで別れてしまっていて、検索性が悪かったりメンテの不安があるので使わない方がいいかもしれないです

* この書式ってMySQLのポピュラーなものっぽい？
DevLOVE Xで気になった講演まとめ

#はじめに
6/22(土)~6/23(日)に開催されたDevLoveXに初参加してきました。
どれもすごく面白かったので全部載せたいのですが、相当長くなりそうでした。
なので、特に印象に残った講演の感想を載せていきます。

#講演
各発表資料はこちらにまとめられているようです。
[DevLOVE Xのスライドまとめ #devlovex](http://kobase16.hatenablog.com/entry/2019/06/23/013048#%E5%8F%8A%E9%83%A8-%E6%95%AC%E9%9B%84%E5%8B%9D%E6%89%8B%E3%81%AB%E5%9F%BA%E8%AA%BF%E8%AC%9B%E6%BC%94%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%81%A7%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%9F%E5%9D%82%E3%81%AE%E4%B8%8A%E3%81%AE%E9%9B%B2)

## 及部さん　【勝手に基調講演】アジャイルで目指した坂の上の雲]
[スライド](https://speakerdeck.com/takaking22/clouds-above-the-hill)
気になったポイント
 チーム感で大事にしているのは
　・成長のバランスを保つこと
　・安定させないこと

### 成長のバランスを保つこと
「チーム感には、チーム、技術、ビジネスプロダクトの３つが相関していて、何か１つだけ成長させても成果にならないし、全部が壊れてしまうこともある。
なので、どれかを上げたら、他も上げる」とのこと。
→良い技術を取り込むことだけ頑張っても、受け入れるかどうかはチーム次第なので、そこへのフォローも必要なのかなと思いました。

### 安定させないこと
「タックマンモデルにおいてチームが機能期に入ると、チームがそこで満足してしまって成長が鈍化してしまう。
なので、一旦壊して作り(今までやってきたやり方を変えて別のやり方を試し)、チーム成長を止めない」とのこと。
→目から鱗でした。
チームとして成長した結果、機能期に至ったのであれば、そのチームは自律的にさらに動いていくかと思っていました。
常に変化し続けるのは個人だけでなく、チームも同じことなのかと思いました。

## 島川さん 小ささを意識してすすめるソフトウェア開発のすすめ
スライド見つからず...

- 気になったポイント  
 - 小さい成功が、次もできる自信につながる  
 - わからないことを小さく開発するのは難しい。なので最初から１００点を目指さない。

### 小さい成功が、次もできる自信につながる
→すごく共感しました。
小さく終わらせていくことで、やったという気持ちがたくさん生まれるんだと思いました。
これができたから次もできる気になるんだと思います。

### わからないことを小さく開発するのは難しい。なので最初から１００点を目指さない。
→これも納得しました。
１００点目指すと終わらないんですよね。
足りないところがあってもいいから、作り上げるってことかなと思いました。

## 安西さん エンジニア、エンジニアリングマネージャーとして成長するために必要なこととは？
[スライド](https://speakerdeck.com/tsuyok/ensinia-ensiniarinkumanesiyatositecheng-chang-surutamenibi-yao-nakototoha-number-devlovex)

- 気になったポイント  
 - 学びの根源の象限で自分が位置する場所はどこなのか自覚する  
 - 自分の言葉で行動を振り返る  

### 学びの根源の象限で自分が位置する場所はどこなのか自覚する
「自分が位置する象限(外的要因、内的要因)に対して、反対の象限の対応を取られると、最悪その人が辞めてしまう」
→これも目から鱗でした。
外的要因が好きな人に内的要因的なことさせるとパフォーマンスが落ちますね。
自覚して、その位置にあった学び方をすることで、よりよい成長が見込まれるのですね。

### 自分の言葉で行動を振り返る
「考えるだけだと、自分が何を考えているかわからない。
言葉にして書いて、読んで、わかることで、次の行動が思い浮かぶ」とのことでした。
→頭でまとまっているつもりでも、いざ書いてみると全然まとまっていなかったってよくあります。
書いて整理することで、どこに問題があったか、どうしたらいいかって気付けるのですね。

## 須恵さん Cloud Nativeと分散システムを軸にこれからのITのあり方を考えてみる
[スライド](https://speakerdeck.com/nobusue/devlove-x-20190623-b-cloudnative-sue)

- 気になったポイント  
 - オンラインがメインとなり、オフラインはオンラインを補完する時代になる  
 - コンテナを大量に配置した時の管理をKubernetes Operatorで実現できる

### オンラインがメインとなり、オフラインはオンラインを補完する時代になる
→何かをする(たとえば支払いする)ことが、オフラインである必要はないということかと思いました。
あらゆるものがデータ化されつつあるので、目的を満たすのであれば、そのデータを活用したほうがいいのだろうと考えました。

### コンテナを大量に配置した時の管理をKubernetes Operatorで実現できる
→Kubernetesはサイトで得た知識程度しかないのですが、どうやって管理していくのだろう？と思っていました。
今後重要になるKubernetes Operatorでの管理の仕組みが気になりました。

## 石垣さん データ駆動 x リーン x スクラムを組織文化に浸透させ、プロダクトをグロースさせる
[スライド](https://speakerdeck.com/i35_267/data-driven-lean-scrum-to-product-growth)

 - 気になったポイント  
  - データによる開発と直感による開発は現れるフェーズが異なる  
  - 最適なアーキテクチャによって組織構造を変化させる（逆コンウェイの法則)

### データによる開発と直感による開発は現れるフェーズが異なる
「新規サービス(0→1)として開発する時は直感(アイデア)が必要
そのあとのサービスを成長させる（1→10)時は、データ(ユーザの声)に基づいた開発となる。」
→すごく納得しました、
最初はデータがないから直感で進めるが、リリース後はデータを分析して対応することで、ユーザのためになるサービスになるのだと思いました。

### 最適なアーキテクチャによって組織構造を変化させる（逆コンウェイの法則)
→ユーザのためを考えたアーキテクチャにしたならば、組織構造がその足を引っ張ってはいけない、組織もユーザのためを考えた構造へ変化させたほうが良いと理解しました。

# まとめ
参加してすごく楽しかったです。
いろんな人のいろんな１０年を聞いて、話して、共感して、濃ゆい2日間を過ごすことができました。
登壇者の皆様、運営スタッフの方々、参加された方々、ありがとうございました。
来年も行きます！
Git(自分用)


#Git
ソースコードの変更履歴を記録するツール

#GitHub
Gitで管理しているソースコードをウェブ上で共有するサービス

#Git clone リポジトリ名
外部のサーバーにあるGitで管理されたソースコードを自分のPCにダウンロードできる
Java開発の基本~演習（配列）~

## 問題1.次のサンプルコードと仕様元に考えてください。
このエリアにはイタリアンレストランが何軒かあります。レストランの一覧を表示するプログラムを作成します。人気の順は上から「アモーレ」「イタリアーノ」「ボーの」「ぱっぱ」「ぽっぽ」です。
下記のプログラムは上位3件の人気レストランと、エリア全体のレストランを表示する。
それぞれの変数の意味はコード内にコメントを残しているのでそこから読み取ってください。
* 上位3件のレストランを表示する

```Best3Shops.java
package array;
public class Best3Shops {
	public static void main(String args[]) {
		//上位3件の人気レストランを配列にセット
		String[] best3Shops=new String[3];
		best3Shops[1]="アモーレ";
		best3Shops[2]="ぱっぱ";
		best3Shops[3]="ボーの";
		System.out.println("上位3件の人気レストランを表示します");
		for(int i=0;i<best3Shops.length;i++) {
			System.out.println(best3Shops[1]);
		}
	}
}

```

* エリア全体のレストランを表示する

```areaShopList.java
package array;
import java.util.ArrayList;
import java.util.List;
public class AreaShopList {
	public static void main(String[] args) {
		//エリア全体のレストランをセット
		//件数に指定がないためArrayListを利用する
		List areaShops=new ArrayList<String>();
		areaShops.get(0);
		//エリアのレストランを配列に追加
		areaShops.add("アモーレ");
		areaShops.add("ボーの");
		areaShops.add("ぱっぱ");
		areaShops.add("ポッポ");
		areaShops.add("イタリアーノ");
		for(int i=0; i<6;i++) {
			System.out.println(areaShops.get(i));
		}
	}
}
```
問題1-1
人気のレストランが上位から正しく表示されるようにしてください。

問題1-2
エリア全体のレストランが正しく表示されるようにしてください。

問題1-3
エリア全体のレストランに「アモーレ二号店」を追加して、エリア全体のレストランを出力してください。

問題1-4 文字入力によって挙動を変えてください

|入力する文字|動き|
|---|---|
|ベスト3|人気ベスト3のレストランを順位と共に表示|
|エリア検索|エリアにある全てのレストランを表示|
|追加|入力を指示してエリアにあるレストランを一件追加する。追加後、エリアにある全てのレストランと、「新たにXXが追加されました」というメッセージを表示|
|それ以外の文字|「入力された文字で処理はできません」と出力し、再度文字入力を依頼する|
HTML&CSSノートfrom Progate3

# はじめに

Progateの勉強メモ

##HTML

### header と footer

`<div class="header"></div>`や`<div class="footer></footer>`と書く代わりに以下のように書くことができます。

```html
<!--<div class="header"></div>の代わり-->
<header></header>
<!--<div class="footer></footer>の代わり-->
<footer></footer>
```

###　複数のクラスの設定

`class="name1 name2 ..`とすることで二つ以上のクラスを設定できる

```html
<div class="btn red"></div>
<div class="btn blue"></div>
```

##CSS

### 背景に画像を表示する

背景に画像を表示させるときには`background-image`を使います
また、画像の大きさが足りない時には繰り返して表示されてしまいます
なので`background-size:cover;`とすることで画像を適した大きさに表示することができます

```css
div {
  /*背景にimg.jpgを表示*/
  background-image: url(img.jpg);
  /*画像を適した大きさにする*/
  background-size: cover;
}
```

### 透明度

`opacity`を使うことで透明度の設定をすることができます
範囲は 1 ～ 0 までで 0 が一番透明で 1 が一番はっきり表示されます

### 文字間の空白

`letter-spacing`を使うことで文字間の空白を調整することができる

```css
div {
  /*文字間の空白を2ピクセルにする*/
  letter-spacing: 2px;
  /*文字間の空白を10ピクセルにする*/
  letter-spacing: 10px;
}
```

### display プロパティ

タグごとに決まっている `display` プロパティの初期値を変えることができます

| `display` の値 | 意味                   |
| :------------- | :--------------------- |
| block          | 要素は横に広がる       |
| inline         | 要素は横に並ぶ         |
| inline-block   | block と inline の中間 |

[わかりやすい解説はこちら](https://saruwakakun.com/html-css/basic/display)

### マウスが上に来たら色を変える

`div:hover`とすることでマウスが指定した要素の上に来た時だけ css を適用するようにする

```css
/*divの上にマウスが来たら要素の背景を青に帰る*/
div:hover {
  background-color: blue;
}
```

### 角を丸くする

`border-radius`プロパティを使うことで角を丸くすることができます
値には円の半径の値を入れます

```css
.box {
  /*半径3pxの円の形に角を変える*/
  border-radius: 3px;
}
```

### 文字のそろえを変える

`text-align`プロパティを指定することで文字のそろえを変えることができます

| `text-align`の値 | そろえの位置 |
| :--------------- | :----------- |
| left             | 左揃え       |
| center           | 中央揃え     |
| right            | 右揃え       |

ブロックレベルで中央揃えにするときには`margin:0 auto`を使い、テキストやボタンを時には`text-align`を使います

### rgb プロパティ

色を指定するためのプロパティです
`rgba(R,G,B)`の順番に指定する

```css
/*以下の二つは同じ色*/
.rgba {
  color: rgb(73, 201, 192);
}
.rrggbb {
  color: #49c9c0;
}
```

`rgba()`として 4 つ目の引数に透明度を入れることができる

```css
/*透明度は0.5*/
.rgba {
  /*background-colorのみ透明度0.5にする*/
  background-color: rgba(73, 201, 192, 0.5);
}
.rrggbb {
  /*rrggbbクラス全体を透明度0.5にする*/
  background-color: rgb(73, 201, 192);
  opacity: 0.5;
}
```

### transition プロパティ

アニメーションを追加するのに使います
`transition: target duration;`と指定します
`:hover`と一緒に使われます

```css
div {
  /*divのすべてに対して1秒間アニメーションを追加する*/
  transition: all 1s;
}

div:hover {
  background-color: blue;
}
```

### line-height プロパティ

テキスト全体の縦の大きさを決めるプロパティ

```css
/*文字が上にある*/
.btn {
  height: 70px;
}
/*文字が縦の真ん中に行く*/
.btn {
  height: 70px;
  line-height: 70px;
}
```

## font awesome

web ページで使うアイコンとかがある便利なもの
[公式サイト](https://fontawesome.com/)
`<head>`に以下のように書き込むだけで使える

```html
<head>
  <link
    rel="stylesheet"
    href="https://kit-free.fontawesome.com/releases/latest/css/free.min.css"
    media="all"
  />
</head>
```
【書評】レベルアップPHP 言語を理解して中級者へ

[レベルアップPHP 言語を理解して中級者へ](https://www.konosumi.net/entry/2019/04/23/065000)とかいう本をゲットした(普通に買った)のでレビューしてみるのだ。
対象は2019/04/12出版の初版です。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/4405bfb6-5774-4ca2-911d-ccfecd37088e.png)
会社で広げるのがつらい。


# 所感

文法はPHP7以降、7.2あたりを想定しており、古臭さはほぼありません。
未だに`$a = array();`とか書いてる本もあるからね。
これは良いところです

ざっくり読んだ限りでは、明らかに間違っているところは見つけられませんでした。

文法についても、

・比較は`===`を前提
・型宣言を推奨
・strict_typesも推奨
・コーディングスタイルはPSRに概ね準拠
・ライブラリはComposer

あまりに適切すぎて口を挟みたくなるところがほとんどありません。
書評の上では逆に困るなこれ。


とはいえ気になったところもいくつかないでもないです。

まずは『中級者へ』というだけあって、完全な初心者向けの話はすっ飛ばしています。
そこはまあタイトル通りだからいいとしても、本書は初心者向け書籍のように順番に読んでステップアップしていく構成ではないため、『中級者になりたい初心者』が最初に読むには少々厳しい内容ではないかと思います。

また、そのままで実用になるコードはなく、出てくるコードは解説用の断片ばかりです。
それらを自分の環境に適用できる程度の能力がないと、読んでも意味がありません。
そしてそういう能力のある人なら、この本を読まなくても大抵は自力でどうにかできそうな気がします。

P22
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/f98080f4-0247-d665-be30-1a7caab60cfa.png)
漢字の例が表示されていません。

P74
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/3b0e4a82-e812-0ff2-7b58-b7dee6d04d5c.png)
この"non-numeric value"のエラーは上下どちらで発生したのか非常にわかりにくいです。
空欄を空けるなりしてほしいところ。

short_open_tagについてなど、PHP7.4やPHP8で[誤りになってしまった記述](https://qiita.com/rana_kualu/items/180aff848169e1733631)が存在します。
これはまあ執筆時期の関係で仕方ないですけどね。

P106
例外の型が並んでいるだけで、具体的になんなのかがよくわかりません。


参考資料としてたくさんのURLが挙がっていて、この点は素晴らしいのですが、URLってだいたい数年経つと死にます。
参考：URLの平均寿命は[1108日](http://user.keio.ac.jp/~ueda/papers/wp2013.pdf)、[44日](https://books.google.co.jp/books?id=sf0ySYPIsLYC&pg=PP20#v=onepage&q&f=false)。
あとQiitaのURLなどは特にですが、手動でコピペするのがつらい。
公式サイトにリンク集みたいなのを置いといてほしいです。
というかそもそも公式サイトが無い？[GitHub](https://github.com/konosumi/techbook-levelupphp-sample)だけ？


誤字がちらほら。
P25：br2nr
P43：メソッド郡
P76：オブジェクト(Objece)
P97：『オートロードは難しくない』はおそらく『6.2.1』付け忘れ
P127：関数郡
P148：なのですが。
一読して目に入っただけでこれなので、おそらく3倍くらいはあるんじゃないかな。


あと語尾に『ー』が必ず付いてます。
抜けているところがないので意図的なものだと思いますが、ブラウザーとかサーバーとかライブラリーとかディレクトリーとかーは抜けないし違和感も抜けない。

全ページカラー対応っぽいのですが、実際にそれを生かしているのはほんの数ページしかありません。
ソースコードは白黒です。
GitHubカラーでいいので色を付けてほしかったところですね。
色を付けると高くなるんですかね？そうであれば仕方ないですが。


# 感想

色々けちを付けましたが、本質的な間違いではなく些細な重箱の隅ばかりです。

ネットを探せば同程度以上の内容はいくらでも出てきますが、その一方で同程度未満の役に立たない内容も大量に引っかかってきます。
そのような雑音を廃し、一定水準を維持した内容が一つにまとまって体系的に読めるというのが書籍の利点です。
全体的には非常によくできた書籍なので、初心者から先に進みたいと考えている人は読んでみるとよいでしょう。

時折挟まれる謎コラムも良い味を出しています。


# まとめ

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26088/7bb0c05b-5a2d-c3c5-c95b-945c0cc61228.png)
何処の馬の骨が書いたかもわからん[与太](https://qiita.com/rana_kualu/items/40ebed78742bfdbd1065)[記事](https://qiita.com/rana_kualu/items/a7c6be77e165bca0f3fc)をオススメとか何考えてんだオメー
並列処理学習４－スレッド間協調作業にはQueueを使用

並列処理を行い、かつ複数の処理を行う際には、作業間の協調させる必要がある。
その場合には、関数的にパイプライン形式でデータの受け渡しを行う処理を作成する必要がある。

# 自作パイプラインを作るにあたっての注意点
パイプライン関数を作成するにあたって、注意する点は以下。

- **関数間の処理速度が異なる場合への対策**
終了までの時間が、前処理が遅く、後続の処理が早かった場合、前処理の段階で渋滞が発生し、後続の処理が、常にタスクに対しての確認が常に行われてしまうことで、無駄なCPUリソースの消費を行ってしまう対策が必要。

- **ビジーウェイト対策**
作業完了、中断を行う適切な処理が必要。

- **メモリ爆発**
ある処理が終わってないがゆえの、キュー膨大化に伴うプログラムクラッシュへの対策。

- **作業進捗確認**
作業中断した際に、実行中のプロセスへの適切な対策が必要。

# Queueライブラリをつかう
Queueライブラリを利用すると、上記問題が解決できる。

- **ビジーウェイト対策**
get()メソッドと、put()メソッドを使う。
get()メソッドは、put()メソッドを呼び出した後に動作する仕様を使い、ビジーウェイトへの対策する。

- **メモリ爆発**
コンストラクタ時に、引数で指定することで、パイプ間で保持可能なキュー数を制限することが出来る。
そうすることで、呼び出し側がget()する前に、put()することが出来る。
指定数を超えると、put()出来なくなる事考慮が必要。

- **作業進捗確認**
task_done()を利用する事で、パイプ間の連携、ポーリングの必要がなくなる。
Queueインスタンスの、join()で完了を待てばよいだけになる。
task_done()が呼び出されるまでは、join()が出来ないようになっているので念頭にいれる。

# Queue
Queueクラスは、ブロッキング操作、バッファサイズ、join処理など、強力な機能が備わってる。
パイプライン制御を構築する全ての機能を持っているので、有効に活用できる。
amazon-ecr-credential-helperをWindowsにインストールする

# amazon-ecr-credential-helperをWindowsにインストールする
Amazon ECRにWindowsからアクセスする際に、毎回ログインが必要で面倒だったので、ログインしなくて済む方法を探したところ、 **amazon-ecr-credential-helper** というのがあると知り、Windowsにインストールしてみました。
結構苦戦したので、忘れない内にメモに残します。


# AWSアクセスキーの設定

AWSへアクセスするための `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` の設定をしていなければ、設定します。

設定方法はこちらがわかりやすいです。
[~/.aws/credentialsファイルでプロファイルを切り替える](https://qiita.com/NewGyu/items/c183ff8c8d9406292967)



# Golangのインストール
Go言語をインストールしていない場合は、インストールします。

こちらがとても参考になります。
[WindowsにGo言語をインストールする方法まとめ](https://qiita.com/yoskeoka/items/0dcc62a07bf5eb48dc4b)


# makeのインストール
makeをインストールしていない場合は、インストールします。

こちらがとても参考になります。
[windowsでmakeコマンドを使用する方法](http://note.mokuzine.net/win-make-cmd/)


# Dockerの設定ファイルの編集

`%USERPROFILE%\.docker\config.json` を編集します。なければ作ります。

以下の内容を追記します。

```json
{
  "credsStore": "ecr-login"
}
```


# amazon-ecr-credential-helperのビルド

以下のコマンドでビルドができます。

```bash
rem ソースコードをダウンロード
go get github.com/awslabs/amazon-ecr-credential-helper

rem ダウンロードしたフォルダへ移動
cd %GOPATH%\src\github.com\awslabs\amazon-ecr-credential-helper

rem ビルド
make docker TARGET_GOOS=windows
```

これで、 `cd %GOPATH%\src\github.com\awslabs\amazon-ecr-credential-helper\bin\local\docker-credential-ecr-login` が生成されます。（これに気付くのに時間かかった・・・）

このファイルをPathの通ったフォルダにコピーします。ここでは、 `%GOPATH%\bin\` とします。

```bash
rem ファイルコピー
copy %GOPATH%\src\github.com\awslabs\amazon-ecr-credential-helper\bin\local\docker-credential-ecr-login %GOPATH%\bin\docker-credential-ecr-login

rem バージョン確認
docker-credential-ecr-login -v
```

バージョン確認をして、

```
amazon-ecr-credential-helper
Version:    master
Git commit:
```

と表示されたらインストールは成功です。


# さいごに
こちらを参考にさせていただきました。わかりやすい記事ありがとうございました。

- [docker login をせずに ECR を操作できる awslabs/amazon-ecr-credential-helper](https://kakakakakku.hatenablog.com/entry/2017/05/01/002326)
- [Amazon ECR にログインなしで接続する](https://qiita.com/pottava/items/7f3a2938a2d53b86618e)