OmniAICreator/Qiita-1.07M huggingface dataset:
ReplicaSetとLabel

#はじめに
[前回](https://qiita.com/dingtianhongjie/items/1e90b48c0cdd79e3311e)はReplicaSetの動作を確認しました。
サーバーが落ちてレプリカの数が減ると、セルフヒーリング機能でレプリカの数を修復しました。
Masterサーバがレプリカの数が減ったことを検知して、Workerノードに対してレプリカを増やすよう指示を出すわけですが、レプリカの数をどうやってカウントしているかというと、「label」でカウントしています。Podの数ではありません。
今回はこの動作を確認してみたいと思います。

#ReplicaSetとLabelの関係
図で書くとこのような感じです。細かく書くともっといろいろありますが、ここでは大体のイメージがつかめれば。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/d8a2ab0b-78fa-b2b6-8ed5-2289b07f12be.png)

マニフェスト（yamlファイル）だと、「spec.selector.matchLabels」と「spec.template.metadata.labels」の記述を合わせる必要があります。

```sampleReplicaSet.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: sample-pod3
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-redis <----------+
  template:                       |
    metadata:                     | 合わせる必要がある
      labels:                     |
        app: nginx-redis <--------+
    spec:
      containers:
        - name: nginx
          image: nginx:latest
        - name: redis
          image: redis:latest
```

なので、ラベルの設定が合わないとデプロイするときにエラーになります。こんな感じで。

```
$ kubectl apply -f sampleReplicaSet-E.yaml
The ReplicaSet "sample-pod3" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"nginx-redis-e"}: `selector` does not match template `labels`
```

##ReplicaSetと同じLabelをPodで指定したらどうなるか。
次は、ReplicaSetで指定しているLabelと同じLabelを別のPodで指定してデプロイしてみます。
まず、今の状態を確認します。

```
$ kubectl get rs -o wide
NAME          DESIRED   CURRENT   READY   AGE   CONTAINERS    IMAGES                      SELECTOR
sample-pod3   3         3         3       24h   nginx,redis   nginx:latest,redis:latest   app=nginx-redis
$ kubectl get pod -L app
NAME                READY   STATUS    RESTARTS   AGE   APP
sample-pod3-7nxxr   2/2     Running   2          24h   nginx-redis
sample-pod3-ngw8x   2/2     Running   2          23h   nginx-redis
sample-pod3-thbbx   2/2     Running   2          24h   nginx-redis
```

次に、同じLabelを持つ以下のyamlファイルのPodをデプロイします。

```nginx_redis.yaml
apiVersion: v1
kind: Pod
metadata:
  name: sample-pod1
  labels:
    app: nginx-redis
spec:
  containers:
    - name: nginx
      image: nginx:latest
    - name: redis
      image: redis:latest
```

```
$ kubectl apply -f nginx_redis.yaml
pod/sample-pod1 created
$ kubectl get pod
NAME                READY   STATUS        RESTARTS   AGE
sample-pod1         0/2     Terminating   0          2s
sample-pod3-7nxxr   2/2     Running       2          24h
sample-pod3-ngw8x   2/2     Running       2          23h
sample-pod3-thbbx   2/2     Running       2          24h
$ kubectl get pod
NAME                READY   STATUS    RESTARTS   AGE
sample-pod3-7nxxr   2/2     Running   2          24h
sample-pod3-ngw8x   2/2     Running   2          23h
sample-pod3-thbbx   2/2     Running   2          24h
```

Podはデプロイされますが、Terminatingの状態ですぐに削除されてしまいます。
何度かやってみましたが、常に新規にデプロイしたPodが削除されました。

マニュアルの記載は見つけられなかったので、常にこうなることがKubernetesの動作として正しいのかまでは確認できていませんが、Labelの設定には注意する必要があることがわかりました。
少なくとも、ReplicaSetで使用するラベルは、独立したユニークなものである必要があります。
PEM形式とPutty形式の秘密鍵フォーマットを変換する方法

- 環境
    - Windows10 Pro 64bit バージョン1803
    - Putty : Release 0.73
        - [Windows10にPuttyをインストールする方法 - Qiita](https://qiita.com/ponsuke0531/items/43491db4e8e8fed08651)
- [RSA鍵のフォーマット - Qiita](https://qiita.com/ponsuke0531/items/7b34347213660c80bc95)


# PEM形式の秘密鍵フォーマットをPutty形式に変換する
1. PuTTYgenを起動する
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/6228f69d-72a5-e144-3506-b01137c6b048.png)
2. [Load]ボタンから`pem`の鍵を読み込む
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/b0026cc6-918b-959d-21b6-ad7af1e8d7a4.png)
3. [Save private key]ボタンで`ppk`の鍵を保存する
    - passphraseがないと注意されますが、なくてもできます。
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/6fa8b163-84a9-f5e1-b8dc-03d8d8376082.png)

# Putty形式の秘密鍵フォーマットをPEM形式に変換する
1. PuTTYgenを起動する
2. [Load]ボタンから`ppk`の鍵を読み込む
3. [Conversions] > [Export OpenSSH Key]
1. 拡張子を`pem`にして鍵を保存する
python　環境設定

#2か月pythonを触らなかったらpythonを結構忘れてた。
結構意外でした。思ったよりも忘れている、、、これはまた忘れるかも、、、
そこで今回、設定の仕方をメモしておきます。

#手順
##仮想環境の作成と有効化

```
インストール(linuxの場合）
$ sudo apt install python3

仮想環境のファイルの作成
$ python3 -m venv 仮想環境の名前

仮想環境を有効にする(linuxの場合）
$ . 仮想環境の名前/bin/activate
以下のように表示されたら仮想環境が有効になっています。
(仮想環境名)パス$ 

仮想環境を終了する。
()$ deactive

```

##パッケージの管理

```
パッケージをインストールする。
()$ pip install パッケージ名

インストールされているパッケージを確認する。
()$ pip freeze

インストールされているパッケージのリストを保存する。
()$ pip freeze >> requirements.txt

リストからパッケージをインストールする。
()$ pip install -r requirements.txt

パッケージをアンインストールする。
()$ pip uninstall パッケージ名

```

#参考
[venv: Python 仮想環境管理](https://qiita.com/fiftystorm36/items/b2fd47cf32c7694adc2e)
↑こっちの方がもっとわかりやすいかも。
arduino-cli で arduboy 向けのスケッチをビルドする

arduino-cli で arduboy&trade; 向けのスケッチをビルドできるようにする手順のご紹介。

# 登場人物

* [arduino-cli](https://github.com/arduino/arduino-cli)
  * コマンドラインで arduino 開発のための各種処理が実行できる
* [Arduboy&trade;](https://arduboy.com/)
  * arduino leonardo をベースにしたクレジットカード大のサイズのゲーム機

# arduino-cli のインストール

基本的には、[公式サイトのインストール手順](https://arduino.github.io/arduino-cli/installation/)の通りにやれば良い。
以前はインストールするのに go の環境が必要だったが、最近(2020年3月現在)はそうでもないようだ。

インストールスクリプトを利用する場合、PATH が通っているところにインストールしないと文句を言われてしまう。[^1]
[^1]: インストールそのものは成功しているようなのだが、ちょっと気持ち悪いので…
自分が ubuntu 18.04 LTS で試した際は、`sudo` を使って `/usr/local/bin` の下にインストールした。

```
$ ARDUINO_INSTALLER_URL="https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh"
$ curl -fsSL ${ARDUINO_INSTALLER_URL} | BINDIR=/usr/local/bin sudo -E sh
```

# arduboy&trade; ボードの追加

通常の arduino 各種ボードと共に、arduboy&trade; ボードも併せて追加する。
3rd party 製のボードを追加する際は、ボードマネージャー情報の URL を `--additional-urls` オプションで指定する必要がある。

```
$ ARDUINO_ADDITIONAL_URL="https://arduboy.github.io/board-support/package_arduboy_index.json"
$ arduino-cli --additional-urls ${ARDUINO_ADDITIONAL_URL} core update-index
$ arduino-cli --additional-urls ${ARDUINO_ADDITIONAL_URL} core install arduboy:avr
$ arduino-cli core install arduino:avr
```

# arduboy&trade; 関連の各種ライブラリの追加

とりあえず、こんな感じで。

```
$ arduino-cli lib install Arduboy
$ arduino-cli lib install Arduboy2
$ arduino-cli lib install ArduboyPlaytune
$ arduino-cli lib install ArduboyTones
$ arduino-cli lib install Arduboy-TinyFont
```

# スケッチのビルド

`--fqbn` オプションに `arduboy:avr:arduboy` を指定するのがポイント。

```
$ arduino-cli compile --fqbn arduboy:avr:arduboy (スケッチのディレクトリパス)
```
【React Native】モダンなUIを実現できるコンポーネント5選

#はじめに
React Nativeではモダンデザインを気軽に実現できるUIコンポーネントが数多く公開されています。
デザイナーのいないスタートアップや個人開発ではUIコンポーネントを積極的に利用するとアプリの質がグンと上がります。また、デザインに割く時間を短縮できて一石二鳥です。2020年現在、ReactNativeでイケてるUIを実現できるコンポーネントを５つ紹介しようと思います!

#[NativeBase](https://nativebase.io/)
![スクリーンショット 2020-03-09 21.59.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560888/d156ca8e-3e38-7334-c7b7-a048dc313ee0.png)

NativeBaseはオープンソースとして公開されているUIコンポーネントです。GitHubでは13,000以上のスターを獲得してます。無料で使用もできますが、有料のテンプレートもあり、より質も高いテンプレートを購入することができます。また、Webユーザーも利用できるようになりました。同じJavaScriptコードベースを使用し、AndroidおよびiOS向けのプラットフォーム固有のデザインを使用して、ネイテブアプリのようなUIを実現できます。無料版では、スターターアプリ、Twitterクローンアプリ、ToDoアプリ、チュートリアルアプリなどが含まれます。有料テンプレートには予約、レンタル、求人情報、メッセージングなどが含まれているようです。

#[Material Kit React Native](https://www.creative-tim.com/product/material-kit-react-native)
![スクリーンショット 2020-03-09 21.58.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560888/2c2df753-fc4d-3fae-a5b8-45f17a3a5378.png)

Material Kit React Nativeは、Googleの提唱しているマテリアルデザインを備えた無料のUIコンポーネントです。一般的なコンポーネントを使いやすく再設計しているとのこと。無料版でも、ボタン、カード、ナビゲーション、入力などの200以上のコンポーネントが含まれています。テーマの変更も可能で色のバリエーションを取り入れることができます。有料のProバージョンも提供されています。ProのLPはモダンなデザインで一見の価値ありだと思います。

#[React Native Elements](https://react-native-elements.github.io/react-native-elements/)
![スクリーンショット 2020-03-09 21.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560888/5b474c63-ff89-d16e-d0c4-1b883d2086ea.png)

React Native Elementsはクロスプラットフォームの無料のUIコンポーネントです。開発者が作成した多数の優れたコンポーネントが1か所にまとまっています。GitHubでは17,000個以上のスターを獲得しています。ReactNativeのチュートリアル等でもよくみかけ、非常に有名なコンポーネントです。パッケージには、価格設定、バッジ、オーバーレイ、仕切り、プラットフォーム固有の検索バーなどのコンポーネントが含まれています。各々使いやすいデザインでカスタマイズも可能です。

#[Lottie](https://airbnb.design/lottie/)
![スクリーンショット 2020-03-09 21.57.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560888/f877e2bf-7045-6ebb-f7f0-024b04b1385c.png)

モバイル向けのAirbnbが開発したアプリにアニメーションを簡単に追加できるアニメーション用の無料ライブラリです。GitHubでは12,000以上のスターを獲得しています。アニメーションファイルはサイズが小さく、アプリのパフォーマンスに影響を与えず実装できます。アニメーションを使うことでより視覚的に訴えることすることができます。

#[UI Kitten](https://akveo.github.io/react-native-ui-kitten/#/home)
![スクリーンショット 2020-03-09 21.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560888/94fe66ef-1e7a-08b6-5489-4a6e23595704.png)

こちらもクロスプラットフォームのモバイルアプリ向けの無料UIコンポーネントです。GitHubで5,000以上のスターがついています。コンポーネントのソースコードを変更せずに、テーマを使用したり、独自のテーマをいくつでも作成したりできます。さらに、ページをリロードすることなく、暗いテーマと明るいテーマなど、テーマを切り替えることができます。npmを用いてパッケージをインストールするだけで簡単に使用を開始できます。デモのモバイルアプリを配信してくれているのでどんなコンポーネントがあるのかアプリを通して確認できます。

#おわりに
今回５つのコンポーネントを紹介しました。どれも無料で使えて、役に立つコンポーネントです。
イケてるコンポーネントを使ってモダンなデザインのアプリを作りましょう！！！
Let's encryptのバグはRustで実装していたら防げたの？

# はじめに
Let's encryptのバグの原因はポインタに起因する実装ミスでした。
「Rustはいいぞ」と言うためだけにRustで実装した場合を検証してみます。

## 原因はなんだった？

詳しくは
[https://jovi0608.hatenablog.com/entry/2020/03/09/094737](https://jovi0608.hatenablog.com/entry/2020/03/09/094737)
のステキなまとめを見たほうがいいのですが、

シンプルにすると、このような実装です。

```go:fail.go
func main() {
	var out []*int
	for i := 0; i < 3; i++ {
		out = append(out, &i)
	}
	fmt.Println("Values:", *out[0], *out[1], *out[2])
	fmt.Println("Addresses:", out[0], out[1], out[2])
}
```

ValuesもAddressesも[0]~[2]で同じ値が表示されます。
ループカウンタを値渡しではなく、
参照渡しをして保管してしまったことが要因です。


同じような実装ミスをC++で書くとこんな感じです。

```cpp:fail.cpp
#include <iostream>
#include <vector>

int main(){
    
    std::vector<int*> out;
    
    for(int i = 0; i < 3; i++){
        out.push_back(&i);
    }
    
    std::cout << out[0] << std::endl;
    std::cout << out[1] << std::endl;
    std::cout << out[2] << std::endl;
    
    std::cout << *out[0] << std::endl;
    std::cout << *out[1] << std::endl;
    std::cout << *out[2] << std::endl;
    
    return 0;
}
```

これも同じような結果になります。

## Rustで書いてみると


```rust:good.rust
fn main() {

    let mut out:Vec<&i32> = vec![];
    
    for i in 0..3{
        out.push(&i);
    }
    
    println!("{:?}", out);
}
```

コンパイル時に、このようなエラーが出ます。

```
6 |         out.push(&i);
  |         ---      ^^ borrowed value does not live long enough
  |         |
  |         borrow later used here
```

Rustは生存期間を厳密に検証してくれるので、とても安全です！

実際のLet's encryptの実装ミスは、ループの中で関数呼び出しを挟んでいるので
気づくのが難しいとも感じました。

こんなケースではRustは本当に頼もしいです。

## Rustはいいぞ
コンパイラにめっちゃ怒られるぞ。
コンパイラに怒られるのに快感を感じるようになったら立派なRust使いです。
herokuでpushできなくて困った

```
error: failed to push some refs to 'https://git.heroku.com/アプリ名.git'
```

というエラーが出た。

herokuの管理画面の「Activity」でlogを確認したら、

Pillow
が入ってないということで怒られていたので、
requirements.txtに

```
Pillow==6.2.1
```
を追加したところ直った。
Amazon Linux 2, CentOS 7 のタイムゾーン、ロケールの設定

Amazon Linux 2 で試したが、CentOS 7 でも同じらしい。Amazon Linux 2 が CentOS 7 ベースだから。

# タイムゾーンの設定

`timedatectl` を使用する。

```shell
[root@ip-nnn-nn-nn-nnn ~]# timedatectl
      Local time: Mon 2020-03-09 11:31:36 UTC
  Universal time: Mon 2020-03-09 11:31:36 UTC
        RTC time: Mon 2020-03-09 11:31:36
       Time zone: n/a (UTC, +0000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
[root@ip-nnn-nn-nn-nnn ~]# timedatectl list-timezones | grep Asia
Asia/Aden
Asia/Almaty
Asia/Amman
（中略）
Asia/Tehran
Asia/Thimphu
Asia/Tokyo
Asia/Tomsk
Asia/Ulaanbaatar
Asia/Urumqi
Asia/Ust-Nera
Asia/Vientiane
Asia/Vladivostok
Asia/Yakutsk
Asia/Yangon
Asia/Yekaterinburg
Asia/Yerevan
[root@ip-nnn-nn-nn-nnn ~]# timedatectl set-timezone Asia/Tokyo
[root@ip-nnn-nn-nn-nnn ~]# timedatectl
      Local time: Mon 2020-03-09 20:41:24 JST
  Universal time: Mon 2020-03-09 11:41:24 UTC
        RTC time: Mon 2020-03-09 11:41:24
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
[root@ip-nnn-nn-nn-nnn ~]# date
Mon Mar  9 20:50:37 JST 2020
```

CentOS 6 の時は `/etc/sysconfig/clock` を編集していたが、CentOS 7 ではファイルがなくなったらしい（手元にCentOS 7のシステムがないからわからない）。
Amazon Linux 2 ではファイルはあるが、とりあえず `timedatectl` だけで設定できているようなので、とりあえずそのままにしておく。


#ロケールの設定

`localectl` を使用する。

```shell
[root@ip-nnn-nn-nn-nnn ~]# localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: n/a
      X11 Layout: n/a
[root@ip-nnn-nn-nn-nnn ~]# localectl set-locale LANG=ja_JP.UTF-8
[root@ip-nnn-nn-nn-nnn ~]# localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: n/a
      X11 Layout: n/a
```

# 参考ページ

<a href="https://www.server-memo.net/centos-settings/centos7/timedatectl.html" target="_blank">CentOS7 タイムゾーン・時刻・日付の設定方法 | server-memo.net</a>
<a href="https://qiita.com/na0k1/items/a5c15a2e21227f028867" target="_blank">【CentOS 7】ロケールとタイムゾーンの変更 - Qiita</a>
<a href="https://agohack.com/amazon-linux-change-timezone/#toc_id_1_1" target="_blank">[AWS] Amazon Linux 2 + 旧版 タイムゾーンを変更 | AgoHack</a>
<a href="https://qiita.com/szly/items/dcc67c85689725795c26" target="_blank">Linuxのタイムゾーンまわり CentOS7編 - Qiita</a>
<a href="https://www.server-world.info/query?os=CentOS_7&p=locale" target="_blank">CentOS 7 : システムの文字コードを設定する : Server World</a>
<a href="https://qiita.com/su-pleiades/items/eec200bc312f58325145" target="_blank">EC2のAmazonLinux2,Centos6,Centos7違いによる初期設定 - Qiita</a>
<a href="https://qiita.com/2no553/items/e87485e3fc4199bd5dcb" target="_blank">AWSのEC2で行うAmazon Linux2の初期設定 - Qiita</a>
Alloyでパズル (9) 魔方陣

親しみやすい書き方や見やすい表示が得意で数独を瞬殺する実力も見せる Alloy さん、しかし実は数字が苦手だ。
今回はそんな苦手分野のパズル、[魔方陣](https://ja.wikipedia.org/wiki/%E9%AD%94%E6%96%B9%E9%99%A3) を書いてみよう。

# リスト

小学生の頃好きだった魔方陣は、単純なルールで記述するのは簡単。
５×５のものを書かせてみよう。

```alloy
// 魔方陣 ５×５
abstract sig Row {c1,c2,c3,c4,c5: Int}
one sig r1,r2,r3,r4,r5 extends Row {}
let Col = (c1+c2+c3+c4+c5)
fact {
    // １～全マス数 の全てがいずれかのマスに入る
    Row.Col = prevs[mul[#Row,#Row].next] - prevs[1]

    let lineSum = sum[Row.c1] {
        // 各列の和は等しい
        sum[Row.c2] = lineSum
        sum[Row.c3] = lineSum
        sum[Row.c4] = lineSum
        sum[Row.c5] = lineSum

        // 各行の和も等しい
        all r:Row | sum[r.Col] = lineSum

        // 対角線の和も等しい
        sum[r1.c1 + r2.c2 + r3.c3 + r4.c4 + r5.c5] = lineSum
        sum[r1.c5 + r2.c4 + r3.c3 + r4.c2 + r5.c1] = lineSum
    }
}

run {} for 8 int
```
25 までの数字を使うので、25+24+23+22+21 を計算できる８ビット整数を指定している。

列数変化への対応しやすさや高速化などのため、何度か書き直した。
SATソルバを切り替えて比べてみると、この例では`MiniSat with Unsat Core`が一番速く、それでも２分近くかかった（遅いものでは約９分）。
６×６にすると、ちょっと試すのが嫌なくらいかかる。
もっと速い書き方をあみだしたいものだ。

# 結果
    ┌────────┬──┬──┬──┬──┬──┐
    │this/Row│c1│c2│c3│c4│c5│
    ├────────┼──┼──┼──┼──┼──┤
    │r1⁰     │20│6 │13│12│14│
    ├────────┼──┼──┼──┼──┼──┤
    │r2⁰     │18│10│19│16│2 │
    ├────────┼──┼──┼──┼──┼──┤
    │r3⁰     │21│9 │7 │25│3 │
    ├────────┼──┼──┼──┼──┼──┤
    │r4⁰     │1 │23│15│4 │22│
    ├────────┼──┼──┼──┼──┼──┤
    │r5⁰     │5 │17│11│8 │24│
    └────────┴──┴──┴──┴──┴──┘

# 解説 : Alloyさんはなぜ数字が苦手なのか
というほどちゃんと説明できるわけではないけれど..

Alloy が通常扱える数値は -8〜7 の16通りだけである。
Alloy の大前提である小スコープ仮説（モデルの不具合のほとんどは小さい例で示すことができる）にはそれで十分であり、デフォで大きな数を扱えて重いよりも、軽量でインクリメンタルという美点に価値があると考えられているからだ。
とは言え多少は大きな数を扱えないと困る場合もあるので、実行時に整数型のビット数を指定できるようになっている（今回の`8 int`のように）。

Evaluator で`Int`や`univ`を見るとわかる通り、ビット数を指定しないときモデルには実際に -8〜7 までの 16 要素が含まれる。
今回のように８ビットを指定しようものなら数値だけで 256 要素含まれる。
たいていのモデルは数値以外の全要素を合わせて数個〜数十個なのに。

イメージで言うなら、Alloy さんはこれだけの数のカードをテーブルに並べて、数字が入るべきところに順次当てはめていく。
カードが増えるとものすごく手間が増えるのだ。
（効果的な並べ方や当てはまらない見切りがとてもうまいのだけれども）

そんなわけで、扱う数字が大きいことは処理時間に多大な影響をもたらす。
なるべく数を扱わず、`{大きい, 適正範囲, 小さい}`といった意味的・抽象的な値を扱うのが正しい Alloy との付き合い方である。
ルーティーンを極める

![IMG_8387.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592864/a9060f3f-dbdc-0ecf-d010-b98eb52c5a94.jpeg)
初のqiita投稿です
今日からこのルーティーンで回します
ルーティン回し極めます
他クラスのメソッドを呼び出したいです

javaでブラックジャック（カードゲーム）を作成しようとしています。
が、メインメソッドで他クラスに書いたshuffleDeckメソッドが呼び出せません。

サイトや書籍などで調べてみたのですが、よくわからず、、、
どのようにしたら呼び出せるのでしょうか。
よろしければご教授願います。



ソースコード

public class Deck {

	private int deckCount; //山札の進行状態を把握する変数
	private ArrayList<Integer> deck; //リストの山札

	//山札（deck）に値を入れ、シャッフルするメソッド
	public void shuffleDeck(List<Integer> deck) {
		// リストに1-52の連番を代入
		for (int i = 1; i <= 52; i++) {
			deck.add(i);
		}
		//山札をシャッフル
		Collections.shuffle(deck);

	}






public class MainGame {

	public static void main(String[] args) throws Exception{

		System.out.println("ブラックジャックへようこそ");

		List<Integer> deck = new ArrayList<Integer>(52); //カード枚数は52枚。ジョーカーは含めない。カードの重複が無いように山札を構築する。


　　　　　　　　　　//ここで呼び出したい

	}
【Git】まとめ

# はじめに
まだまだ理解に不安があるGitについて、
学習したことをまとめていきたいと思います。

## リポジトリ(repository)
ファイルやディレクトリの状態を記録する場所です。

- ローカルリポジトリ・・・自分のPC上に作られるリポジトリ
- リモートリポジトリ・・・GitHub、GitlabなどのWebサービス上に作られるリポジトリ

## フォーク(fork)
他人のリモートリポジトリを、自分のリモートリポジトリに複製する。
## クローン(clone)
リモートリポジトリの内容をダウンロードしてきて、自分のPCにローカルリポジトリとして作成する。
##### SourceTreeでクローンする方法
1. ファイル→新規→URLからクローン
2. クローン先のhttpsのアドレスを指定
3. 別ウィンドウでユーザーネームとパスワードを聞かれるので、Gitlabアカウントのパスワードを入力
4. クローン完了

## ワーキングツリー(working tree)
自分が実際に作業をしているディレクトリです。
## インデックス(index)
以前の状態からどれだけファイルを編集したかを記録しています。
## アド(add)
ワーキングツリーにあるファイルの更新内容を、インデックスに反映します。
## コミット(commit)
インデックスに追加したファイルを、ローカルリポジトリに保存します。
## ヘッド(HEAD)
今いるブランチの最新のコミットの代名詞を指します。
デフォルトではmasterの先頭を表し、HEADが移動することで、使用するブランチが変更されます。
## プッシュ(push)
ローカルリポジトリをリモートリポジトリに送信して保存します。
リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態になります。
## プル(pull)
リモートリポジトリから、ローカルリポジトリとの差異をダウンロードしてきます。
## フェッチ(fetch)
リモートリポジトリに、更新がないかを確認します。
## ブランチ(branch)
対象と全く同じフォルダ・ファイル構造を作成します。
## マージ(merge)
ブランチ同士を結合します。

## 実際の開発の流れ
1. 新規作成、もしくはリモートリポジトリからクローンしてローカルリポジトリを作る。
2. ファイルを修正したら、インデックスを経てコミットを作成。
3. ローカルリポジトリからリモートリポジトリにプッシュする。
4. 他の人の変更をインプットするために、リモートリポジトリからプルをして変更履歴をダウンロード、自分のローカルリポジトリで修正をしたら‥２へ戻る
【Emmet】時短！！模写コーディング時にEmmetを活用する。

#問題
 模写コーディングは、HTML・CSSの理解が一番の目的であると思うが、素直に```class=""``` や```height: widht:```等を入力するのはだんだん面倒になる上、時間の無駄である。

#対策
　プラグインであるEmmetを活用し入力を省略する。
　
***classの指定***
>div.sample　→　tabキー　の入力で

>```<div class="sample"></div>```　
>となる。

***idの指定***
>div#sample　→　tabキー　の入力で

>```<div id="sample"></div>```　
>となる。

***CSSについて***
>fz16+fw700+fs:i　→　tabキー　の入力で

> ```  font-size: 16px;```
>```  font-weight: 700;```
> ```  font-style: italic;```

>となる。

他にも様々な種類のEmmetの記述方法があるので、早い内から意識して使うことで時短していきたい。


# 参考文献

この記事は以下の情報を参考にして執筆しました。

- [「はじめて」でも簡単！Emmetの使い方とよく使うパターン集
環境](https://haniwaman.com/emmet/)
- [Emmetってどれくらい活用してる? 略して楽するハッピーコーディング！](https://liginc.co.jp/392812)
Vue-CLI v4にcommitlintを導入する

# はじめに
はじめてVue-cli v4にcommitlintを1から設定したので備忘録として残しておく
commitlintそのものについては、他の方が紹介している丁寧な記事が多かったのでここでは触れない

# Git Hub
 - [commitlint](https://github.com/conventional-changelog/commitlint)

# commitlint インストール
いろいろなところを見て回ると下記2つを一度にインストール方法を取っていたが、自分の環境では個別にしないとうまく入らなかった。よくわからない。

```
npm i @commitlint/cli
```
```
npm i @commitlint/config-conventional
```

# 設定ファイル作成
ルート直下に「commitlint.config.js」を作成する。内容は公式の説明通り

```js:commitlint.config.js
module.exports = {
  extends: ['@commitlint/config-conventional']
}
```

# husky インストール
huskyも必要。huskyの説明についても割愛。

```
npm install husky --save-dev
```

## package.jsonにスクリプトを設定

```json:package.json
"husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }  
  }
```

#使ってみて
やはり便利。

モックを作成している段階では面倒ではないか？という意見があり、そのままの流れで本番になっても導入していなかったが、本格的にコードを書き始めるとやはり収集がつかなくなってきたので導入。
機械的にLintをかけられるならそれに越したことはないと思うので個人的には必須の設定です。
Herokuでデプロイする。



```
$ heroku login
$ heroku create {自分のアプリケーション名}
$ git add .
$ git commit -am "make it better"
$ git push heroku master
$ heroku open
```


[Python + HerokuでLINE BOTを作ってみた](https://qiita.com/shimajiri/items/cf7ccf69d184fdb2fb26#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%99%BB%E9%8C%B2)
【Swift】iOS13でStoryBoardではなくXibから起動する

# なんでXib(Xcode Interface Builder)を使うの？？
Xibとはアプリケーションの画面をレイアウトする時に使うやつです。
基本的な扱いはStoryBoardと似ています。

【Xibのメリット】
作った画面を複数の画面で再利用するのが簡単
画面の1部のパーツを作ることができる

【Xibのデメリット】
ファイル数が増えがち。。。
画面遷移の関係が可視化されない（コードで書くから）

# 今回やってみること
アプリ起動時の初期画面をXibで作った画面に設定する（iOS13で実現）
iOS13からは、SceneDelegateがテンプレートとして標準化されているのでiOS12以前のやり方と少しだけ違うみたいです。

# 実装の方法
では、早速作っていきます
### ViewControllerとXibファイルを作成する
とりあえず、プロジェクトを作ります。そしたら、画像のようにプロジェクトのフォルダを選択してください。
<img width="271" alt="create_project.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/d33320d4-0241-a644-f28f-22f3a71d5ad1.png">

この状態で、新規ファイルを作成します。
今回は、[CocoaTouchClass]を選択して次へ！
<img width="732" alt="new_file.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/a92dc017-9fdf-ec86-eeb8-41b046220fdc.png">

名前はなんでもいいんですけど、わかりやすいように[XibViewController]にしました。
それで、[UIViewControllerクラス]を継承します。
**【重要】 最後に、[Also create XIB file]にチェックをつけてください**
<img width="714" alt="create_file.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/cc8a88a7-4481-6bf1-c046-27bd84d1e6ee.png">

ファイルの作成が完了したら、こんな感じになると思います。
普通にファイルを作る時と異なるポイントは、.swiftと.xibの2つのファイルができることです。
この時に作成された、XibファイルをStoryBoardのように使っていきます。
<img width="271" alt="created_file.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/09656956-1d34-6d0e-9a92-58b3cbc00588.png">

### Xibファイルを編集する
起動した時に、ちゃんとXibから起動しているか分かりやすいよう、こんな感じで編集しておきましょう。
Viewの作り方はStoryBoardと同じです。
<img width="1396" alt="setting.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/553cf7ae-ad78-2738-c06d-75587265fa49.png">

### SceneDelegate.swiftを編集する
最後に、iOS13から標準装備されている、`SceneDelegate.swift`にコードをちょこっとだけ書きます。
変更したところだけを抜き出すとこんな感じ。。。
`func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)`の中で、アプリ起動時に表示される画面を今回作ったXibファイルに対応するViewControllerに設定しています。

```swift:SceneDelegate.swift
    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        guard let _ = (scene as? UIWindowScene) else { return }
        // MARK: -変更点
        // ここから
        let window = UIWindow(windowScene: scene as! UIWindowScene)
        self.window = window
        window.makeKeyAndVisible()
        // ここのViewControllerの名前は、さっき作ったクラスファイル名
        let xibVC = XibViewController()
        window.rootViewController = xibVC
        // ここまで 
    }
```

### 起動してみる
こんな感じ
Main.storyboardではなく、Xibから起動されていることが確認できました。
<img width="400" alt="comp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580445/07d55d9a-b90f-11be-2e0c-5b8b559f1b9b.png">

# おわりに
今回は、Xibを最初の画面として起動する方法について書いてみました。
この方法を勉強しなきゃいけなかった時に、iOS13より前ののやり方で、実装したら上手くいかず、苦戦してしまったので、記事にしました。
Docker+NextCloud

##利用環境

OS:CentOS7


# Dockerの導入
## インストール
<pre>
sudo yum -y install docker
</pre>
## 確認
<pre>
docker --version
</pre>
## サービスの開始・自動起動
<pre>
$ sudo systemctl start docker
$ sudo systemctl enable docker
</pre>
## sudoなし設定
<pre>
# dockerグループを作成する
$ sudo groupadd docker

# ログイン中のユーザーをdockerグループに追加する
$ sudo gpasswd -a $USER docker

# Dockerを再起動する
$ sudo systemctl restart docker

# exitして再ログインすると反映される
$ exit
</pre>
# Docker Composeの導入
## インストール
<pre>
# Docker Composeの最新版をダウンロードする
# `1.25.4` の値はバージョンに応じて変更する
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# バイナリの実行権限を適用する
$ sudo chmod +x /usr/local/bin/docker-compose
</pre>
## 確認
<pre>
docker-compose --version
</pre>
# NextCloudのベース作成
NextCloudのコンテナを作成するディレクトリに作成、移動後作業開始
## 下記のdocker-compose.ymlを作成する。
<pre>
version: '2'

volumes:
  nextcloud:
  db:
  redis:
services:
  db:
    image: mariadb
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_VERSION=5.7
      - MYSQL_ROOT_PASSWORD=root # 適当なパスワードを設定
      - MYSQL_PASSWORD=root      # 適当なパスワードを設定
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud
    ports:
      - 8080:80
    depends_on:
      - db
      - redis
    volumes:
      - nextcloud:/var/www/html
    restart: always
    environment:
      - MYSQL_HOST=db
      - REDIS_HOST=redis
  redis:
    image: redis
    restart: always
    volumes:
        - redis:/data
</pre>
## コンテナの導入
<pre>
docker-compose up -d
</pre>
## MARIADBの設定
### コンテナの内部IPを下記の方法で調べておく
https://qiita.com/ponsuke0531/items/7e8e5081993a30afdc4a
### DBコンテナに入る
<pre>
docker exec -it nextcloud_db_1 bash
</pre>
### rootでmysqlに入る
<pre>
mysql -u root -p
</pre>
### 他コンテナからのアクセス用ユーザー作成
<pre>
CREATE USER 'root'@'172.19.0.2' IDENTIFIED BY 'root';
CREATE USER 'root'@'172.19.0.3' IDENTIFIED BY 'root';

CREATE DATABASE IF NOT EXISTS nextcloud;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES ON nextcloud.* TO 'root'@'172.19.0.2' IDENTIFIED BY 'root';
CREATE TEMPORARY TABLES ON nextcloud.* TO 'root'@'172.19.0.3' IDENTIFIED BY 'root';
FLUSH privileges;
</pre>
# ブラウザで確認
https://localhost:8080/
herokuでpushしようとしたらうまく行かない

#herokuでpushしようとしたらうまく行かなかったので対処法を記録しておく

```
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://git.heroku.com/〜〜〜.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```


こんなエラーが出た。

```
$ git remote -v
```

で確認したら、変なところにつながっていた。

よって、

```
git remote set-url heroku {https://git.heroku.com/アプリ名.git}
```

で変更した。これでうまくいった。

[HerokuのPush先を変更](https://qiita.com/Tattsum/items/b86c9d698b0727934836)
【Rails】seed-fu で user の seed を作りたい

# seed-fu を導入してみた
seed-fu はデフォルトの seeds.rb よりも seed を扱いやすいということを聞いて、試しに自分のアプリケーションに入れてみることにしました。
seeds.rb を使っている場合、同じ操作をしようとすると、データを一度削除してから再度追加する必要があリます。一方で seed-fu なら、**seed データの変更をしても`rails db:seed_fu`だけで変更が反映される**という点が便利です。

導入は

```:Gemfile
gem 'seed-fu'
```

として、`bundle install`するだけです。


# よくある作り方
user の seed を作る時を考えてみます。user は email がユニークなモデルです。
まずは[公式の README ](https://github.com/mbleigh/seed-fu)を読んで次のように書いてみました。

```db/fixtures/01_user.rb
User.seed do |s|
  s.id    = 1
  s.name = "foo"
  s.email = "foo@example.com"
  s.password  = "password"
end

User.seed do |s|
  s.id    = 2
  s.name = "bar"
  s.email = "bar@example.com"
  s.password  = "password"
end
```

これで`rails db:seed_fu`を実行すれば問題なく seed が作成されます。
また、

```diff:db/fixtures/01_user.rb
User.seed do |s|
  s.id    = 1
- s.name = "foo"
+ s.name = "hoo"
  s.email = "foo@example.com"
  s.password  = "password"
end
```

このように一部を変更しても`rails db:seed_fu`で問題なく変更が適応されます。

# 問題点
一方でこの方法では一つ問題点があります。それは、seed が増えたときに、**id を手で変えなくてはならないこと**です。seed が少ないうちは全く問題ありませんが、増えてくると打ち直す数も比例して増えてきます。

# 整数固定値 の id を使わない方法
実は、id は記述しなくても seed は生成できます。
先程の状態から一旦`rails db:reset`等で seed を削除してから、

```db/fixtures/01_user.rb
User.seed do |s|
  s.name = "foo"
  s.email = "foo@example.com"
  s.password  = "password"
end

User.seed do |s|
  s.name = "bar"
  s.email = "bar@example.com"
  s.password  = "password"
end
```

上記の様に変更し`rails db:seed_fu`を実行すると、問題なく seed が生成されます。
しかし、このままでは、値を変更し、再度`rails db:seed_fu`を実行するとエラーになってしまいます。

```diff:db/fixtures/01_user.rb
User.seed do |s|
  s.id    = 1
- s.name = "foo"
+ s.name = "hoo"
  s.email = "foo@example.com"
  s.password  = "password"
end
```

```
$ rails db:seed_fu

== Seed from /Users/punkshiraihsi/environment/e-navigator/db/fixtures/01_user.rb
 - User {:name=>"hoo", :email=>"foo@example.com", :password=>"password", }
rails aborted!
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_users_on_email"
DETAIL:  Key (email)=(foo@example.com) already exists.
```

これは、seed-fu が**「どの seed が変更されたか」を判断するための情報を失ってしまっているため**です。デフォルトでは id で判断していますが、今回はそれを省略してしまったため、生成はできるものの変更は出来ないのです。

幸いにも id 以外でユニークなカラム email があるので、これを利用します。

```db/fixtures/01_user.rb
User.seed(:email) do |s|
  s.name = "foo"
  s.email = "foo@example.com"
  s.password  = "password"
end

User.seed(:email) do |s|
  s.name = "bar"
  s.email = "bar@example.com"
  s.password  = "password"
end
```

**seed メソッドに引数 :email を付けるだけ**です。これで seed-fu はどの seed が変更されたかを判断できるようになるので、`rails db:seed_fu`だけで変更を適応できるようになります。

以上で**整数固定値の id を入力せず、seed-fu を導入することが出来ました。

# 参考

- https://github.com/mbleigh/seed-fu
- https://qiita.com/ko2ic/items/be96e450a33d631e0059
Flutter freezedパッケージいい感じかも

[provider](https://pub.dev/packages/provider)パッケージの作者である[Remi Rousselet](https://twitter.com/remi_rousselet)さんが先月リリースした
[freezed](https://pub.dev/packages/freezed)パッケージが日本のFlutter界隈でも話題になっていますね

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あと、Kotlinのdata class相当のものがなくてコンストラクタ周りやcopyWithなど書くのが少々怠かったけど、freezedのおかげですっかり解決してしまった(　´･‿･｀)<br>(言語機能組み込みではなくコード生成系特有の扱いにくさがあって完璧ではないけど)<a href="https://t.co/WgXtYthYzB">https://t.co/WgXtYthYzB</a></p>&mdash; mono 🎯 @自宅 💙 (@_mono) <a href="https://twitter.com/_mono/status/1235126241901989888?ref_src=twsrc%5Etfw">March 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ざっと触ってみたのでメモします

## 使い方

### pubspec.yaml
`json_serializable`はJSONとのencode/decodeしたいのであれば

```yaml
dependencies:
  flutter:
    sdk: flutter
  freezed_annotation:

dev_dependencies:
  flutter_test:
    sdk: flutter
  json_serializable:
  build_runner:
  freezed:
```

### buildする
いつもの

```sh
flutter pub pub run build_runner build
```

### スニペット
AndroidStudioでは以下をLive Templateに登録しておくと開発が捗りそう
`part .g.dart`の行、`fromJson`の行はJSONとのencode/decodeいらないなら不要です
引用元： [Comparing freezed to built_value](https://itnext.io/comparing-freezed-to-built-value-3ff978c8647)


```dart
import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
part '$FILE_NAME$.freezed.dart';
part '$FILE_NAME$.g.dart';

@freezed
abstract class $CLASS_NAME$ with _$$$CLASS_NAME$ {
  const factory $CLASS_NAME$({}) = _$CLASS_NAME$;
 
 factory $CLASS_NAME$.fromJson(Map<String, dynamic> json) => _$$$CLASS_NAME$FromJson(json);
}
```

## 嬉しいこと一覧

### `json_annotation`より気持ちよくJSONコンパチなクラスを書ける
上で若干触れたように、`part g.dart`と`fromJson`の行を書くだけでfromJsonとtoJsonが使えるようになります
`json_annotation`の頃からざっくりコード量が半分ぐらいになる
（さっきも上げましたが[Comparing freezed to built_value](https://itnext.io/comparing-freezed-to-built-value-3ff978c8647)に詳しい）

### copyWithが自動で生える
説明不要！めっちゃ嬉しいですよね

氏の別のパッケージである[state_notifier](https://pub.dev/packages/state_notifier)との相性が良いです

### Swiftで言うEnum Associated Value, Kotlinで言うSealed Class的なのが使える
説明不要!これだけでリファクタ出来る部分めちゃくちゃありそうです

値を取り出すには、if文でSmart Castするか、下の自動で生えるメソッド群を使います
switch文では使えなさそう（もともとdartのswitch文はとても使いにくいのでどっちでも良い）

- .when
  - 付属値を展開したものを引数に取るラムダを持てる。全パターン網羅する
-  .maybeWhen
  - whenのorElseを書くバージョン
-  .map
  - 自身をSmart Castしたものを引数に取るラムダを持てる。全パターン網羅する
- .maybeMap
  - mapのorElseを書くバージョン


### Lateキーワードが使える
getterを生やすのですが、一度使った値を自動でキャッシュしてくれます
freezedはimmutableなクラスとして設計されているので非常にありがたいですね

### hashCode/==が自動で生える
嬉しいですね

### 

## その他

### non-nullableが使える
`@required`や通常の引数にnullが渡るとランタイムエラーを吐くようになります
[Dart3.0ではNNBDが導入されるかも？](https://qiita.com/Cat_sushi/items/44872ccc68604413f065)という状況で、それを先んじて使えるようにしてみた形ですね
現状だと、静的解析に引っかからないのであまり意識することはないかもしれません

## 結論

かなり使えそう
とりあえず明日、業務コードで`json_annotation`使ってた部分をリプレイスしてみます
500 (Internal Server Error)の解決方法

#1.エラーの発見の経緯とエラーの様子
画像の保存の可否を検証ツールで確認していたところコンソールの部分に下記のような記載が出てきました
<img width="1280" alt="スクリーンショット 2020-03-09 21.08.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555157/9ad55883-d56f-d7a1-197e-8d5961802b8b.png">

#2.原因の究明の経緯（方法）
データの保存は正しく行われているのになぜかエラーを出しており、とりあえずエラーの右側にあるurlをクリックすると、これまたなぜか使用どころか引用した覚えすらないajaxの引用文の箇所にエラー表示が飛ばされてしまい、これまで多くの人の目にさらされているソースが間違っていると表示されてしまいました。

そのコードが間違っているというのは流石におかしいと考え、このエラーに関する記事を探っていったところ、500エラーとはサーバー側のエラーであるという下記の記事を見かけました。

https://blog.hubspot.jp/http-500-internal-server-error

サーバー側のエラーであることと、この時筆者はローカルでしか開発を行っていなかったことから、**railsの起動のログを確認する**こととしました

するとログの中に下記のような記載があり、エラーがルーティングによるものだと分かりました。

```
# rails s したターミナルの画面

〜前略〜

[ActiveJob] Enqueued ActiveStorage::AnalyzeJob (Job ID: 88ca34c8-6291-4523-9bdc-8cb722868aa1) to Async(default) with arguments: #<GlobalID:0x00007fa8f12038b0 @uri=#<URI::GID gid://freemarket-sample62d/ActiveStorage::Blob/18>>
Completed 500 Internal Server Error in 67ms (ActiveRecord: 43.8ms)


  
ActionController::UrlGenerationError (No route matches {:action=>"edit", :controller=>"users"}, missing required keys: [:id]):
  
app/controllers/items_controller.rb:16:in `create'
  ActiveStorage::Blob Load (0.5ms)  SELECT  `active_storage_blobs`.* FROM `active_storage_blobs` WHERE `active_storage_blobs`.`id` = 18 LIMIT 1
  ↳ /Users/kontatomoya/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activerecord-5.2.4.1/lib/active_record/log_subscriber.rb:98

〜後略〜
```


#3.解決方法
エラー文を発見したあとはその文言に従い、各自の言語環境に適した方法で修正していただければ解決となります

ちなみに今回の筆者のエラーの場合は複数のテーブル（itemテーブル,userテーブル）のuser_idを呼び出す記載をする際に、ストロングパラメータを使用しitems_controllerでuser_idの使用を許可したところで満足してしまい、id呼び出しの記述を忘れてしまっていました。そのため 、localhost:300/users/nill/editを呼び出してしまっていました。したがって下記の通りcreateアクションを修正することで、このエラーは出てこなくなりました。

```
class ItemsController < ApplicationController
〜中略〜
 def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to  edit_user_path(@item.user_id) #この@item.user_idを記載していませんでした。
     
    else
      render :new
    end
  end
〜中略〜
def item_params
    params.require(:item).permit(:name,~省略~).merge(user_id: current_user.id)
    #↑この行でセキュリティ的にitems_controllerでのcurrent_user.idをuser_idとして使用許可をしていました
  end
```


#4.まとめ
今回のエラー原因の究明方法は他の言語でも利用できると思ったため、題名に rails と入れませんでした。

解決方法はそれぞれの言語やフレームワークごとに異なると思いますが、こと原因究明についてはどの言語でも等しく言えるのが、"**このエラーを見かけた際はもう一度起動しているサーバーのログを見ていただければ解決できる**"というのが今回の記事の主張になります。

何かの参考にしていただければと思います
MacBookProでVsCode + Githubによる開発環境を整える

# はじめに
SageMakerノートブックインスタンスの開発はお金がかかるので、
MacbookProで開発を進めたいときってありますよね？

そのための導入手順です。

# 手順
Visual Studio Codeをインストールする
Gitをインストールする
Githubにアカウントを開設する
GitとGithubを連携させる
Visual Studio CodeでGithubを連携する


Mac版Visual Studio CodeでGitを使えるようにセットアップ
https://qiita.com/ykmchd/items/638275ec34cfd58a99e0


【初心者向け】GitHubにリポジトリを作成してVisual Studio Codeと連携するまで
https://www.micknabewata.com/entry/github/vscode-sync
いずれにせよGitHubでリポジトリを作るのは、VSCodeからは不可能で、GitHubのサイトに訪れて実行する必要があるようだ。


macでgitとgithubを連携させる
https://qiita.com/Lassieena/items/db7f4cf8d9b236643dd8


MacでGitHubを使う手順 – SSH Keysの登録 / リポジトリの作成 / 基本コマンド
https://mae.chab.in/archives/2306



手元のターミナルではgitからコミットできるけど、VScodeからはどのように実施するんだろう。。。

# どの単位でGitHubのリポジトリを作成すべきか
https://miau.hatenablog.com/entry/20100706/1278444362
ポイントは、git cloneはリポジトリ単位となること

＜ケース1＞
GitHubにすでにあるリボジトリを読みこんで、ファイルを編集して連携（push）する
MacbookPro+VSCode側=ローカルリポジトリ
GitHub側=リモートリポジトリ

VSCode側で、リモートリポジトリを登録する
ローカルリポジトリの内容を、リモートリポジトリにプッシュする。


VSCodeで作成したコードをgithubに連携（push）する




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575432/c47ef032-fbd2-7e4c-8056-b56f7b5540c9.png)
このような画面が表示される。

echo "# test" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/roe-river/test.git
git push -u origin master

ローカル環境で上記を実行すると、README.mdがgithubにpushされる。

git init
は、リポジトリの初期化。実行したディレクトリに.gitディレクトリが作成される。この.gitディレクトリに現在のディレクトリ以下を管理するリポジトリデータが格納される。

Gitではこのディレクトリ以下をこのリポジトリに付随したワークツリーと呼び、ワークツリーでファイルの編集などを行う。

git add ステージ領域へファイルを追加
Gitリポジトリのワーキングツリーでファイルを作成しただけでは、Gitリポジトリのバージョン管理の対象としてファイルは登録されていない。
そこで、ファイルをGitリポジトリの管理対象とするためにgit addコマンドを利用して、ステージ領域（インデックス）と呼ばれるコミットをする前の一時領域にファイルを登録する。

git commit　リポジトリの歴史を記録
ステージ領域に登録されている時点のファイル群を実際にリポジトリの歴史として記録する。

git remote add リモートリポジトリを登録
git remote add <識別子> gitパス
で、以後<識別子>で、gitパスのリモートリポジトリを指すようになる。

git push リモートリポジトリへ送信
現在のブランチのローカルリポジトリの内容をリモートリポジトリに送信する。
上記のgit pushコマンドを実行すると、originという名前のリモートリポジトリのmasterブランチに現在のブランチの内容を送信する。
-uオプションは、ローカルリポジトリの現在のブランチのupstream（ローカルで作業しているブランチの上流）はoriginリポジトリのmasterブランチであるということを同時に設定したことになる。
このオプションを付けることにより、リモートリポジトリの内容を取得するgit pullコマンドを実行するときに特にオプションを与えずとも、このローカルリポジトリのブランチはoriginのmasterブランチから取得するようになる。

# Visual Studio Code から GitHubへのソース送付
GitHubとVSCODEの連携方法

https://qiita.com/yu0313/items/4f95fc0b7e544c42e107
GitHub側でリポジトリを作成し、VSCode側で
git clone -> Staging -> Commit -> Push
のStepを分かりやすく記載している。


# プルリクエストするには
GitHubを使うなら最低限知っておきたい、プルリクエストの送り方とレビュー、マージの基本 (1/2)
https://www.atmarkit.co.jp/ait/articles/1702/27/news022.html

# 参考


# VSCode小ネタ
・拡張子.ipynbだと、jupyterライクなUIになる。
・python Interactiveシェルを使うと、変数の値を確認しながら実行できる。（が、デバッガでよくない？）

https://hachian.com/2019/09/21/vscode_interactive/


# AWS toolkit
VS-CODE上でSDKを使った開発を効率化できる
https://aws.amazon.com/jp/visualstudiocode/
jQuery:基本構文

HTMLのBODYタグ内にこれを書く。

```javascript

<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    <script>
        //$(document).ready(function() {
        $(function() {
            //セレクタ.メソッド
            $('h1').css('color', 'green').hide('slow');
        });
    </script>
```
仙台CTF 2019 Lab2.イベントログ解析 100

#問題

http://ctf.sectanlab.jp/2019/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1d05a9f2-0fe4-9ada-0f6b-6a8b1931f039.png)

#解いてみた

問題文には「10秒以上ログインしたもの」と書かれていてフラグのほうには「5秒以上ログインしたもの」と書かれていて少し混乱しましたが、まぁ一番長いものを回答すればいいんでしょう。

セキュリティログを確認してログオンタイプ10のものを抽出すればよさそうです。

```
Lab02\Windows\System32\winevt\Logs\Security.evtx
```

見てみたんですが、ログオンタイプ10のものが1つもありませんでした。
んー。
RDPブルートフォースをしたのはしたけど、開発用サーバに対してRDPでログインしたかどうかはわからないのか。

問題文にある正規ログインの「192.168.15.128」を検索してみても0件。
ん？

問題文にある「2019年10月26日（土）20:16以降」にしぼって4624ログオンに絞ってソース ネットワーク アドレスをまとめると2つしかないことがわかった。

※問題文に2019年10月26日（土）20:16以降は不正アクセスと考えていい。という記述はあるが、それより前は必ず正規ログインなのかどうかは不明で、正規と不正が入り混じってる可能性もあるということをわすれてはいけない気がする。

もはや2個まで絞り込めたので両方入力してみればいいんですが、一応調べてみます。

結果的にどっちもログアウトのログがなくてどのくらいログインしてたか判断できないのでは？という気分になった。

けど答えのほうは2回ログインしていた。
権限昇格かなとか思ったけどイマイチよくわからず、答えてみたら正解だった。
不完全燃焼。
Incoming Webhookとjavascriptでslackに送信する

slackアプリでIncoming Webhookを追加する。
するとWebhook URLが手に入る。

```js
sendSlack () {
  const payload = {
    // slackのデータ
    'blocks': [
      {
        'type': 'section',
        'text': {
          'type': 'mrkdwn',
          'text': 'slackに送信'
        }
      },
      {
        'type': 'section',
        'fields': [
          {
            'type': 'mrkdwn',
            'text': 'ああああ'
          },
        ]
      },
      {
        'type': 'actions',
        'elements': [
          {
            'type': 'button',
            'text': {
              'type': 'plain_text',
              'emoji': true,
              'text': 'Approve'
            },
            'style': 'primary',
            'value': 'click_me_123'
          },
          {
            'type': 'button',
            'text': {
              'type': 'plain_text',
              'emoji': true,
              'text': 'Deny'
            },
            'style': 'danger',
            'value': 'click_me_123'
          }
        ]
      }
    ]
  }

  const _self = this
  const url = 'https://hooks.slack.com/services/{token}'

  fetch(url, {
    method: 'POST',
    body: JSON.stringify(payload)
  }).then(function (responce) {
    if (!responce.ok) {
      alert('エラーです')
    }
    _self.$router.push('/')
  }).catch(function (error) {
    console.log(error.message)
  })
}

```
javascriptで連長圧縮してみた。

<p>今回はJavaScriptを使って<h5>“連長圧縮”</h5>というアルゴリズムを作ってみました。（別名：ランレングス圧縮）</p>
<p></p>
（＊プログラムの全貌は<a href="https://github.com/bigsugarG/Compressor-Decompressor">コチラ（GitHub）</a>）

###そもそも連長圧縮って何？？？
<p></p>
（＊詳しく理解したい！という方は<a href="https://ja.wikipedia.org/wiki/%E9%80%A3%E9%95%B7%E5%9C%A7%E7%B8%AE">コチラ</a>をご覧ください。）

簡単に言うと、ある文字列について、<h5>連続する文字を数えてその個数と文字だけに置き換えて圧縮する</h5>というものです。
<p></p>


。。。。。。。

「そう言われましても…」
そう思われているでしょうか。はい、僕もはじめは何言っているか分かりませんでした。笑

#####まずは例を見せたいと思います。
下の図では、「AAABBBBBCDEEFG」を入力しています。
その下のバーに出ている「3A5B-2CD2E-2FG」が圧縮された出力になります。
![2020-03-09 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598885/b6615f05-7711-fa57-dd99-51c51e22864c.png)
連続する文字の時はその連続する回数と文字自体の2文字で表現します。
（ex. AAA→3A）
不連続の文字はマイナス符号をつけた上で不連続文字の個数と文字列自体で表現します。
（ex. CDEFG→―5CDEFG）

つまり、<h5>元の文字列に連続する文字が多ければ多いほど、圧縮率が高くなります。</h5>

ちなみに、上のスクショのHTML/CSSファイルもGitHubで公開していますので、良かったダウンロードして試してみて下さい。


####圧縮のアルゴリズム（JavaScript）
引数の配列charDataには1文字ずつ文字データが格納されています。

```javascript:Rentyo.js
function doCompress(charData){　//連長圧縮
    var compressedText=[];　//圧縮した結果を格納する場所
    var contiCounter = 0;　//連続する文字の回数
    var nonContiText=[];　//不連続の文字を格納する場所。
    var nonContiCounter = 0; //不連続文字の回数
    var currentChar = charData[0];　//探索する際の文字のポインタ的なもの

    for(i=0;i<charData.length;i++){
        if(currentChar==charData[i]){
            if(nonContiCounter>0){　//XYYの最後のY部分に当たる出力処理
                minusNumber = nonContiCounter * (-1);
                compressedText.push(minusNumber);
                for(j=0;j<nonContiText.length;j++){
                    compressedText.push(nonContiText[j]);
                }
                nonContiText = [];
                nonContiCounter = 0;
            }
            contiCounter++;
        }else{
            if(contiCounter>1){　//XXYの最後のYの部分に当たる出力処理
                compressedText.push(contiCounter,currentChar);
            }
            if(contiCounter==1){
                nonContiCounter++;
                nonContiText.push(currentChar);
            }
            contiCounter = 1;
            currentChar = charData[i];
        }
    }

    if(contiCounter>1){
        compressedText.push(contiCounter,currentChar);　//XXXのように末尾が連続だった場合の出力処理
    
    }else{　//XYZのように末尾が不連続だった場合の出力処理
        nonContiCounter++;
        minusNumber = nonContiCounter * (-1);
        nonContiText.push(currentChar);
        compressedText.push(minusNumber);
        for(k=0;k<nonContiText.length;k++){
            compressedText.push(nonContiText[k]);
        }
    }

    var resultText = compressedText.join("");　//配列を文字列に変換
    document.getElementById("show_result").textContent = "Compressed Result: " + resultText;

}

```

####注意すること
文字列の頭から処理を施していくと思いますが、ある文字列の圧縮出力が確定するのはそこから2文字あとになります。

（ex. XXY において 2X の出力が確定するのは、文字のポインタがYに来ているときになります。
　また XYYにおいて -1X の出力が確定するのはやはり2つ目のYを調べているときですね！）

したがって、頭から順に調べているだけでは末尾の文字の出力が確定しないので、別に末尾の文字についての処理を設けてあげます。


次回は今回のアンサー編をお送りしたいと思います（笑）
####[次回は：　javascriptで連長圧縮された文字列を解凍してみた。](https://qiita.com/bigsugarG/items/935ba7c07a4e3d61ef25)

<p></p>
playbookについて

#1．playbookとは

　playbookはansible-playbookコマンドで使用する、複数の操作を記述できる定義ファイルです。
　記述した順番に実行します。
　記述方式はYAMLというphythonなどで使用されるインデントを用いるテキストファイルのフォーマットです。
　YAMLはansible以外でも使用される形式のため、よく学習コストが低い、覚えやすいとは言われますが、一方でansibleで初めて
　YAMLを勉強するときには、ansible関係の書籍や技術情報を見ているだけではYAMLそのものの説明があまりされていません。
　そのため、別途YAML自体の学習をする必要があります。
　また、日本語が使用できますのでコメント等で処理の説明をわかりやすくできます。


```text:playbookの基本的な記述
## コメント（playbook全体の説明など)

host:(実行対象を記述する）

tasks:
  -name: 処理のコメント
    モジュール名:パラメータ

  -name: 処理のコメント
    モジュール名:パラメータ
      モジュールの引数名:引数の値
```


```yml:playbookの記述例
## ansibleグループ、ユーザーを作成し、sshの公開鍵で認証できるようにします。また、ansibleにsudoを許可します。
- hosts: all

  tasks:
    - name: ansible設定用のグループ作成
      group: 
        name: ansible
        gid: 15000

    - name: ansible ユーザー作成
      user: 
        name: ansible
        uid: 15000 
        group: ansible
  
    - name: ansibleのSSH公開鍵を登録
      authorized_key:
          user: ansible
          key: "{{ lookup('file', '/ansible/project/files/id_rsa.pub') }}"
          
    - name: sudo設定
      lineinfile:
        path: /etc/sudoers
        backup: yes
        line: 'ansible ALL=(ALL) NOPASSWD: ALL'
```

playbookでは変数を使用したり、条件によって実行しないようにしたりなどができます。
詳細は、下記を参照してください。
また、変数の記述方法などについては、YAMLの記述方法を理解する必要があります。

参考URL：https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html


#2．playbookを初めて記述をし始めてはまりやすい事

最初にPlaybookを書き始めた時、自分を含めて一緒に検証した人たちがはまったことを以下にまとめます。
YAMLは可読性が高いのですが、一方で書式が割と厳格なので少しの記述ミスでもエラーになるので注意が必要です。

- インデントが厳格。
<br>Ansibleの書式は、全体⇒tasks⇒- name⇒ モジュール⇒ 引数 といった具合にインデントを掘り下げていきます。
<br>特にハイフン(-)はエディタによっては見えづらくなるため、続く行のインデントを深くしすぎてエラーになることがあります。
　
- ハイフン(-)の後のペースを忘れる。
- モジュール名や引数名の後にコロン(:)を付けるときにスペースを入れてしまう。
cv2.imread()で画像を読み込もうとしたときにパスが通っていなくてもエラーが出ない問題に対処する

##問題

　問題はタイトルの通りです。

　Python上で、OpenCVを使用して画像処理を行っている際に出てくるエラーです。Open CVライブラリについて、パスが通っていなくてもエラーとならないため、一見プログラムに問題がないように見えます。しかし、実際は画像が読み込まれていない、という問題があります。

##対処法



```python:cv2.py
import cv2

img = cv2.imread('xxxxx')

if img:
    print('Image is read.')
else:
    print('Image is not read.')

```

```
Image is not read.
```

　上記のように読み込まれた場合は読んだことを示す文章を返させるようにすることで、読み込まれているか確認できるようになりました。
Atcorder155 A~C問題　C++ （map問題）

Atcorder155
https://atcoder.jp/contests/abc155/tasks


#A問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/9c358f63-e151-f3d5-5880-85d44e65153c.png)

```A問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int A,B,C; cin >> A >> B >> C; //3つの整数
    bool ans=true;
    if(A==B && A!=C) ans=false;
    if(A==C && A!=B) ans=false;
    if(B==C && B!=A) ans=false;
    
    if(ans) cout << "No";
    else cout << "Yes";
}
```

#B問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/819bee28-a2c0-6235-30f1-3cf7ae247f93.png)

```B問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int N; cin >> N; //書類にN個の整数
    vector <int> A(N);
    bool ans=true;
    rep(i,N){
        cin >> A[i];
        if (A[i]%2==0){
            if (!(A[i]%3==0 || A[i]%5==0)) ans=false;
        }
    }
    if (ans) cout << "APPROVED";
    else cout << "DENIED";
}
```

#C問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475270/6f436a11-8c19-79e8-1f66-9fff5be7086f.png)

```C問題.c++
#include<bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
using namespace std;
using ll = long long;
const ll INF = 1e9 + 7;
typedef pair<int,int> P;// pair型は２つの値の組を表せる

int main(){
    int N; cin >> N;
    map<string,int> P;
    vector <string> S(N);
    rep(i,N) cin >> S[i];
    sort(S.begin(),S.end()); //文字列も辞書順にソートできる！
    
    int ans=0; //出力回数maxを調べる
    rep(i,N){
        P[S[i]]++;
        ans=max(ans,P[S[i]]);
    }
    
    rep(i,N){
        if (ans==P[S[i]]){
            cout << S[i] << endl;
            P[S[i]]=0;
        }
    }
}
```

#まとめ
・B問題***if (!(A[i]%3==0 || A[i]%5==0))***の様に**！**で**否定**を表せば楽になったなぁ…
・C問題***sort(S.begin(),S.end());***で文字列も辞書順で表せることに気づけなかった…
「公⽤⽂における漢字使⽤等について」抜粋

# 接続詞

| 良例       | 悪例     |
| ---------- | -------- |
| おって     | 追って   |
| したがって | 従って   |
| ただし     | 但し     |
| ついては   | 就いては |
| ところが   | 所が     |
| ところで   | 所で     |
| また       | 又       |
| ゆえに     | 故に     |

# 助動詞・助詞

| 良例         | 悪例         | 例文                             |
| ------------ | ------------ | -------------------------------- |
| ない         | 無い         | 現地には行かない。               |
| ようだ       | 様だ         | それ以外に方法がないようだ。     |
| ぐらい       | 位           | 二十歳ぐらいの人                 |
| だけ         | -            | 調査しただけである。             |
| ほど         | 程           | 三日ほど経過した。               |
| ある         | 有る         | その点に問題がある。             |
| いる         | 居る         | ここに関係者がいる。             |
| こと         | 事           | 許可しないことがある。           |
| できる       | 出来る       | だれでも利用ができる。           |
| とおり       | 通り         | 次のとおりである。               |
| とき         | 時           | 事故のときは連絡する。           |
| ところ       | 所           | 現在のところ差し支えない。       |
| とも         | 共           | 説明するとともに意見を聞く。     |
| ない         | 無い         | 欠点がない。                     |
| なる         | 成る         | 合計すると１万円になる。         |
| ほか         | 他           | そのほか                         |
| もの         | 物           | 正しいものと認める。             |
| ゆえ         | 故           | 一部の反対のゆえにはかどらない。 |
| わけ         | 訳           | 賛成するわけにはいかない。       |
| かもしれない | かも知れない | そうかもしれない。               |
| てあげる     | て上げる     | 図書を貸してあげる。             |
| ていく       | て行く       | 負担が増えていく。               |
| ていただく   | て頂く       | 報告していただく。               |
| ておく       | て置く       | 通知しておく。                   |
| てください   | て下さい     | 問題点を話してください。         |
| てくる       | て来る       | 寒くなってくる。                 |
| てしまう     | て仕舞う     | 書いてしまう。                   |
| てみる       | て見る       | 見てみる。                       |
| てよい       | て良い       | 連絡してよい。                   |
| にすぎない   | に過ぎない   | 調査だけにすぎない。             |
| について     | に就いて     | これについて考慮する。           |