OmniAICreator/Qiita-1.07M huggingface dataset:
ABC131 B - Bite Eating (c++14)

B - Bite Eating
https://atcoder.jp/contests/abc131/tasks/abc131_b

配点200点 （難易度250点）
※難易度：この問題に対する主観的な難しさ、他のB問題よりも少し難しい印象。

基本的な考えとして差の絶対値が0に近いとき、それが食べるべきリンゴです。

これを数直線上で考えると3つのパターンに分けられれます。
味の配列が0より下にあるか、0より上にあるか、0をまたいでいるか？
0より下もしくは上の時は0に近いりんごを食べ、0をまたいでいる時は0のりんごを食べます。

![131B.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/3142f69c-79e8-40ef-60bc-bda69f8b07d0.png)

解説のPDFを読んだ時はif文の条件がRとLで一つの条件文に2つの変数が用いられていて何だこれと思いましたが、理解して見直してみるとかなり美しいプログラムですね。きっちり考えて作られています。

# 解説のPDF
Lにリンゴ味の左端の値を入力します。
Rにリンゴ味の右端の値を入力します。

右端が0以下なら右端が食べるリンゴです。
左端が0以下なら左端が食べるリンゴです。
それ以外の値は左端から右端までのリンゴの列は0をまたいでいるので、0が食べるべきリンゴとなります。

林檎の味は公差1の等差数列なのであとは等差数列の公式に代入します。
初項L、末項R、項数R-L+1
(R+L)(R-L+1)/2＝総和

計算量 O(1)

```ABC131B.cpp
# include <bits/stdc++.h>
using namespace std;

int main() {
    // 入力
    int N, A;
    cin >> N >> A;

    // 処理
    int L = A;
    int R = A + N - 1;

    int eat;
    if (R <= 0)
        eat = R;
    else if (L >= 0)
        eat = L;
    else
        eat = 0;

    int answer = (R + L) * (R - L + 1) / 2 - eat;

    // 出力
    cout << answer << endl;

    return 0;
}

```

# 提出時のプログラム
こちらは問題文を整理せずに文章通りにプログラムを書いていますね、
appleSum に合計値を入れる。
nは制約より2以上
Lは0以上と0未満でif文で分岐
Lが0未満の時は、さらにn＋Lで0より大きいかそれ以下かで分岐させています。これは読みにくいですねぇ・・反省。

計算量 O(n)

```
int main() {
    // 入力
    int n, L;
    cin >> n >> L;
    int appleSum = 0;

    // 処理
    if (L >= 0) {
        for (int i = 2; i <= n; i++) {
            appleSum += L + i - 1;
        }
    } else if (L < 0) {
        if (n + L > 0) {
            for (int i = 1; i <= n; i++) {
                appleSum += L + i - 1;
            }
        } else {
            for (int i = 1; i < n; i++) {
                appleSum += L + i - 1;
            }
        }
    }

    // 出力
    cout << appleSum << endl;

    return 0;
}
```

※自分のはそのまま書いている典型的なだめプログラムですね・・・
A問題もチラホラとそのまま書くよりも考える（＆きれいな）プログラムの書き方が要求される問題が出題されますが、B問題はさらに問題文そのままプログラムに起こすよりも考える力を必要とする問題が出題されているようですね。

プログラムの美しさについて、
他人のプログラムを読むとわかるのですが、問題文に沿ってプログラムを書いていると、条件が複雑な時はプログラムもごちゃごちゃと複雑になっていきます。（この問題のように）問題文のコア部分を理解して整理し直してプログラムを書くと、解説のPDFのプログラムのように綺麗なプログラムになっていきます。
自分用 VSCODE 設定MEMO

PCの移行時に困らないよう、VSCODEの設定を記録しておく

# PC側の設定
## vimでnormal modeに戻る際に、日本語入力をオフにする。
vimで日本語を書いているときにnormal modeに戻るときは、ほとんどの場合移動などのvimのコマンドを押したいことが多い。そのためには日本語入力をオフにする必要があるため、毎回「Esc」→「半角」を押す必要がある。毎回押すなら「Esc」キーに両方に当てはめてしまって手間を省こう。
https://qiita.com/stackline/items/6a2e56e1f439cc47b098


# setting.json
```json
{  
    // システムのclipboardにコピー
    "vim.useSystemClipboard":true,

    // easymotion
    "vim.easymotion": true,

    // カーソル上にあるワードを"*"で検索
    "vim.visualstar": true,

    // 諸々のctrlキーを使った操作が有効になる
    "vim.useCtrlKeys": true,
}
```
Docker Composeの初めの一歩

#はじめに
こんにちは！
私は、大学4回生です。
現在、未来電子テクノロジーでプログラミング開発コースでインターンを行っています。
今回は、私自身が詰まった「Docker Composeのコンポーネントを定義するところ」についてお話しします。
（プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。）

#Docker Composeとは
Docker Composeとは、複数のコンテナからなるサービスを構築、実行する手順をを自動的に管理する機能のことです。
つまり、仮想環境を作り出し、そこでサイトやアプリを作るために必要なものです。

#Docker Composeのコンポーネントを定義するところまで
まず、Macの場合、ターミナルが必要になります。
（vimとzshを使用しています）
1.空のディレクトリーを作る

```
mkdir test（ファイル名）
```

2.この空のディレクトリーの中に、「Dockerfile」というファイルを作成します。

```
mkdir Dockerfile
```

※DockerfileのDは、大文字

3.この「Dockerfile」に以下のコードを写します。

```
vi Dockerfile
```

（以下のコード⬇︎）

```
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

4.次に、一度「Dockerfile」を保存し閉じた後、新たに「requirements.txt」というファイルを作成します。

```
touch requirements.txt
```

5.この「requirements.txt」に、以下のコードを写します。

```
vi requirements.txt
```

（以下のコード⬇︎）


```
Django>=2.0,<3.0
psycopg2>=2.7,<3.0
```

6.この「requirements.txt」を保存し閉じた後、「docker-compose.yml」というファイルを作成します。

```
touch docker-compose.yml
```

7.そして「docker-compose.yml」に以下のコードを写すと、Docker Composeのコンポーネントを定義するところまでは完了です。

```
vi docker-compose.yml
```

（以下のコード⬇️）

```
version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

#まとめ
サイトを作る際に、Docker Composeを使用しました。
これからDockerをマスターしたいです。

#参考文献
「Quickstart: Compose and Django」https://docs.docker.com/compose/django/
awk_基本文法

## 実行方法

```
awk 'パターン{アクション}' 処理ファイル名
```

## パターン

1. BEGIN 
<p>
ファイルを読む前に実行するブロック
</p>
2. END  
<p>
ファイルを読み終わったら実行するブロック
</p>
3. パターン＋アクション
<p>
特定のパターン(または条件式)にマッチする場合に、アクションを実行。
</p>

## 特殊変数
| 表記 | 意味 | 
|:--:|:--|
|$0|1行(レコード)。レコード単位はRSで変更可能。|
|\$1 ～ \$NF|一行をスペースまたはタブで分解し、それぞれの項目を先頭から\$1,\$2の順で割り当てる。最後の要素は\$NFに格納。\$(NF-n)で後ろからn番目。フィールド単位はFSで変更可能。|
|NR, FNR|NRには現在処理している通し行数が格納。FNRにはファイル単位での処理が格納。|

### RS(レコードセパレータ)変更
```
# 段落 (空行) 単位をレコードとして $0 を表示
BEGIN { RS = "" } { print $0 }
```
### FS(フィールドセパレータ)変更
```
# フィールド分割を "," (カンマ) 区切り (CSV) にして $1 を表示
BEGIN { FS = "," }{ print $1 }
```

## if文
### 基本形
```
# 偶数行は普通に出力、奇数行はNG
awk '{if(FNR%2==0){print FNR : $0}} else {print "NG"}' test.txt
```

### and条件、or条件
<p>
and条件 → && <br>
or条件 →　||
</p>
## else if
```
awk '{if () {} else if {} else {}}'
```

## 参考にしたサイト

http://www.ie.u-ryukyu.ac.jp/~e085739/awk.quick.all.html
https://it-ojisan.tokyo/awk-if/
バージョン番号(string)の比較 (C#)

# やりたいこと
- バージョン番号のようなドット区切り十進表記の文字列を比較したい。
- 一括比較したいだけなので、[`System.Version`](https://docs.microsoft.com/ja-jp/dotnet/api/system.version)クラスを使ってまではやりたくない。

# コード
### 自前実装

```cs:
/// <summary>ドット区切り数字列を比較する</summary>
/// <param name="a">対象文字列A</param>
/// <param name="b">対象文字列B</param>
/// <param name="number">比較する列数 (0なら全て)</param>
/// <returns>A-Bの符号 (1, 0, -1)</returns>
public static int CompareVersionString (this string a, string b, int number = 0) {
	var aSeries = a.Split ('.');
	var bSeries = b.Split ('.');
	int aNum, bNum;
	number = (number > 0) ? Mathf.Min (number, aSeries.Length) : aSeries.Length;
	for (var i = 0; i < number; i++) {
		if (i >= bSeries.Length) { return 1; }
		aNum = 0; int.TryParse (aSeries [i], out aNum);
		bNum = 0; int.TryParse (bSeries [i], out bNum);
		if (aNum > bNum) { return 1; } else if (aNum < bNum) { return -1; }
	}
	return (aSeries.Length == bSeries.Length) ? 0 : -1;
}
```

- Unity以外では、`Mathf`でなく`Math`を使用してください。

<details><summary>蛇足</summary><div>

### こっそりと`System.Version`を使う実装
```cs:
/// <summary>ドット区切り数字列を比較する</summary>
public static int CompareVersionString (this string a, string b) {
	return (new System.Version (a)).CompareTo (new System.Version (b));
}
```
- 比較のためにだけVersionクラスを使います。(本末転倒)
- `using system;`を書かない辺りが「こっそり」です。

</div></details>

# 使用例
```cs:
#if UNITY_*
Debug.Log ("1.1.12".CompareVersionString ("1.1.12.0"));
#else
Console.WriteLine ("1.1.12".CompareVersionString ("1.1.12.0"));
#endif
// -1
```

- 実際には`UNITY_*`という記述はできません。

```cs:
Debug.Log ("1.1.12".CompareVersionString ("1.1.12.0", 3));
// 0
```

- 比較する列数を指定することができます。

# 仕様
- 以下の説明では、ドットで区切られた個々の数字列を"位"と称します。
    - 一般に、"メジャー"、"マイナー"、"ビルド"、"リビジョン"などと呼ばれるもののことです。
- 各"位"を数値化するルールは、`int.TryParse ()` に準じます。
    - 数値化できなかった場合は`0`と見なします。
- 双方の文字列の左端は、同じ大きさの"位"であるものと見なし、右に行くほど段階的に小さくなるものとします。
    - 「左端は必ず"メジャー"で、次は"マイナー"である」ということです。
- "位"が存在しない場合は、`0`よりも"小さい"値と見なします。(上記の使用例を参照)
- 比較の結果を、`(a < b) => -1`、`(a == b) => 0`、`(a > b) => 1`で返します。

# 参考
- Unityのインスペクタで設定される"Version*"文字列(Application.version)をマスタデータとして扱いたかったので、こういうやり方をしています。
- 通常は、素直にVersionクラスを使うことをお勧めします。
    - [`public static readonly Version BundleVersion = new Version (Application.version);`](https://docs.microsoft.com/ja-jp/dotnet/api/system.version)
[Laravel][Homestead] 使用するデータベースをPostgreSQLに変更してみる

データベースの初期設定がMySQLになっているので、安心のPostgreSQLに変更してみる。

## PostgreSQLにログインしてみる

パスワードのデフォルトは「secret」。

```
$ psql -hlocalhost -Uhomestead
```

## UTF8指定してデータベースを作成してみる

```sql
homestead=# CREATE DATABASE db_name ENCODING UTF8;
```

## Laravelプロジェクトの設定を変更してみる

```:.env
...
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=db_name
DB_USERNAME=homestead
DB_PASSWORD=secret
...
```

## 参考

[LaravelのHomestead環境でPostgreSQL初期設定を行う](https://qiita.com/a_shiba/items/762af4ec58395669d435)
Mac OSXでHTTP Proxy経由でSSH

##はじめに
Mac OSXだとHTTP Proxyを経由してインターネット上のサーバにSSHする際にハマるポイントがあるため備忘録を残す。インターネット上のサーバとしてはVPSやEC2のようなパブリッククラウドサービスを想定している。

参考）
[Macで HTTP Proxy 経由のSSH](http://htnosm.hatenablog.com/entry/2019/01/15/090000#Mac%E3%81%A7%E3%81%AEnc%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)

##うまくいくやり方
xx.xx.xx.xxがProxyのIP。FQDNでも可のはず。

```
$ brew install nmap
$ ssh -o ProxyCommand='ncat --proxy-type http --proxy xx.xx.xx.xx:3128 %h %p' -i ~/.ssh/id_rsa ubuntu@vm1
```

##普通のやり方
Linuxだとこれでうまく行くはず。

```
$ ssh ProxyCommand='nc -X connect -x xx.xx.xx.xx:3128 %h %p' -i ~/.ssh/id_rsa ubuntu@vm1
```
#### なぜかエラー (OSXでうまくいかない)
```
nc: Proxy error: "HTTP/1.1 200 Connection established" 
ssh_exchange_identification: Connection closed by remote host
```

#### 蛇足
以下のnetcatでもダメだった。こちらは-vvvでデバッグした限りProxyオプションがない？

```
$ brew install netcat
$ ssh ProxyCommand='nc -X connect -x xx.xx.xx.xx:3128 %h %p' -i ~/.ssh/id_rsa ubuntu@vm1
```
デミング回帰(Demming Regression)

## はじめに

これは筆者の勉強まとめページですので、指摘しまくってい頂けると幸いです

## デミング回帰

今回は https://qiita.com/raso0527/items/ba4bef9b1271428afbfc の記事のコードの損失関数を改良して学習をする

デミング回帰も線形回帰の一種で、損失関数を以下のように設定したもの

$$ loss = \frac{|t - (w・x + b)|}{\sqrt{w^2 + 1}} $$

これは数学IIで習った点と直線の距離の公式を変形した形になっていて、これを適用することにより、距離の大きさを誤差として極小値に近づけるよう学習をしていく。

点と直線の距離の公式
https://ja.wikipedia.org/wiki/%E7%82%B9%E3%81%A8%E7%9B%B4%E7%B7%9A%E3%81%AE%E8%B7%9D%E9%9B%A2

以下TensorFlowによるコード

```
demming_numerator = tf.abs(tf.subtract(y_target , tf.add(tf.matmul(x_data, A), b)))
demming_demoinator = tf.sqrt(tf.add(tf.square(A), 1))

loss = tf.reduce_mean(tf.truediv(demming_numerator, demming_demoinator))
```

![Unknown-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257254/89fa45ca-2588-5abc-ed5f-3d9cf8a600da.png)
Java 基本文法

### 学習ログ

プログラムの流れ

0. ソースコードを書く。
0. ソースコードをコンパイラでコンパイルしてバイトコードに変換する。
0. インタプリタはバイトコードをマシン語に変換してCPUを動かす

- javaファイルの拡張子は.javaになる。

```java:クラス名.java
public class クラス名 {
  public static void メソッド名 (String[] args) {
    //処理
  }
}
```

クラスの中をクラスブロック、メソッドの中をメソッドブロックと呼ぶ。

- System.out.println();

引数に取った値を出力させる。

### 変数の定義

#####変数宣言の文

```java:
データ型 変数名;

//例えば
int age;  //最初に変数を宣言しておく。
age = 30; //次に変数にデータを代入する。
```
また変数の宣言と代入を同時に行うこともできる。
（変数の初期化という）

```java:
データ型 変数名 = 値;

//例えば
int age = 30;
```

#####データ型の種類

|分類|型名|格納するデータ|例|
|:---|:---|:---|:---|
|整数|long|大きな整数|long worldPeople; //世界の人口
||int|普通の整数|int salary;           //給与金額
||short|小さな整数|short age;          //年齢
||byte|さらに小さな整数|byte glasses;    //所持する眼鏡の数
|少数|double|普通の小数|double pi;     //円周率
||float|少し曖昧でもいい小数|float weight//体重
|真偽値|boolean|trueかfalse|boolean isMarried;//既婚か否か
|文字|char|１つの文字|char initial; //イニシャル1文字
|文字列|String|文字の並び|String name; //自分の名前

#####オペランド・演算子

```java:
age = 20 + 5; //演算子である=や+以外のageや20、5(変数や値のこと)がオペランドと呼ばれる。
//全ての式はこの2つの要素だけで構成されている。
```
オペランドの中でも、変数に代入される値、ソースコード内に記述した数字、文字、文字列の値のことをリテラルと呼ぶ。
リテラルはそれぞれデータ型を持っている。

- 代入演算子

```java:
a = 10;  // =>10,右辺を左辺に代入する
a += 10; // =>a = a + 10、左辺と右辺を加算して左辺に代入、文字を加算の対象とした場合左辺と右辺が連結される
a -= 10; // =>a = a - 10、左辺と右辺を減算して左辺に代入
a *= 10; // =>a = a * 10、左辺と右辺を乗算して左辺に代入
a /= 10; // =>a = a / 10、左辺と右辺を除算して左辺に代入
a %= 10; // =>a = a % 10、左辺と右辺を除算してその余りを左辺に代入
``` 
- インクリメント・デクリメント演算子

```java:
a++(または++a); // =>a + 1、　aに対して1だけ加算される。
a--(または--a); // =>a -1、　aに対して1だけ減算される。
```


### 定数の初期化

変数は上書きできる。
しかし、税率だったり円周率は基本変わらないため上書きできると面倒なことになる。
そのため、そういった変数は定数にして代入する。

```java:
データ型 定数名 = 値;

final int PRICE = 100;
//定数名は全て大文字にするのが一般的
```
【RDS for Oracle】Enterprise Managerを使う

# 前提

- RDS for Oracle で使用できるEnterprise Manager（EM）は以下です。

| Oracleバージョン     | EMの種類 |デフォルト・ポート|
|:-----------------|------------------|------------------|
| 12c             | EM Express  |5500| 
| 11g             |  EM Database Control |1158 | 


- 検証環境（ORCL1）が12cなのEMはEM Expressになります。
- RDSでEMを使うにはオプショングループを設定します。[以前の記事](https://qiita.com/ghogho-seki/items/ac998ffe6e7887a4a8a7)でオプショングループを作っているので、今回はこちらにオプションを追加していきます。

- 注意点
    - 次のDB インスタンスクラスではEMはサポートされない
        - db.t2.micro
        - db.t2.smal
        - db.m1.small

# 事前準備

- RDSのセキュリティグループのインバウンドにEMのポート(5500 or 1158)を追加する
- オプショングループの設定

## オプショングループの設定
RDSのコンソールから`オプショングループ`→`オプションに追加`
<img width="1568" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/5df74430-f1b4-6e88-fe82-675237c8b89a.png">

オプションに`OEM`を選択

<img width="862" alt="RDS_·_AWS_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/ed625c8d-3d7d-9f37-aadd-3f220c23c72b.png">

<img width="1640" alt="RDS_·_AWS_Console2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/a58b7ba7-86d7-b693-4bf3-b8a48699ad8d.png">


すでにオプショングループがインスタンスに紐付いているので、インスタンスに反映されます（インスタンスの再起動はありません）。

<img width="1646" alt="RDS_·_AWS_Console3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/a53fcd57-74c1-d9f5-bc37-0fdde44ad653.png">




# EMにアクセス
ブラウザ経由でEMにアクセスします。

今回、パブリックサブネット上に踏み台サーバ(Amazon Linux)、プライベートサブネット上にRDS（Oracle）があるためポートフォワードして続します。

- ローカルPC（今回はmac）でポートフォワード

```
$ ssh -L 13389:orcl1.xxxx.us-west-2.rds.amazonaws.com:5500 -i <踏み台のキーペア> ec2-user@<踏み台のパブリックIPアドレス>
Last login: Mon Jul  8 08:14:36 2019 from 210.227.234.114

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
7 package(s) needed for security, out of 13 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-223 ~]$
```

- この状態で下記URLをブラウザに入れます

```
https://localhost:13389/em
```

- ユーザ名とパスワードに`マスターユーザ`のユーザ名とパスワードを入れログインします
<img width="1480" alt="EM_Express_Login_と_RDS_と_1__ec2-user_ip-10-0-0-223____ssh_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/fb9b88ce-dfe9-139b-688b-db97f01055b5.png">

- 無事ログインできました
<img width="1467" alt="EM_Express_-_データベース・ホーム.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/75b47272-368b-38f8-86b0-155139ef12a2.png">




# 参考
[Oracle Enterprise Manager Database Express]
(https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.Options.OEM_DBControl.html)
[Laravel][Homestead] テストを実行してみる

テストを実行してみます。

## 関連ファイルの場所を確認してみる

|パス|説明|
|:--|:--|
|phpunit.xml|テスト設定ファイル|
|tests/Feature/|機能テストのテストコードを配置する。<br>多くのオブジェクトの関連や、JSONエンドポイントへのHTTPリクエストなど幅広い範囲をテストする|
|tests/Unit/|ユニットテストのテストコードを配置する。<br>極小さい、コードの独立した一部をテストする。|

## テストを実行してみる

phpunitを実行する。全てのテストコードが実行される。

```
$ phpunit
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 1.63 seconds, Memory: 12.00MB

OK (2 tests, 2 assertions)
```

ファイルを指定することで一部のみテストすることができる。

```
$ phpunit tests/Feature/ExampleTest.php
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 1.56 seconds, Memory: 12.00MB

OK (1 test, 1 assertion)
```

## 新しいテストケースを作成してみる

```
// Featureディレクトリにテストを生成する
$ php artisan make:test UserTest
// Unitディレクトリにテストを生成する
$ php artisan make:test UserTest --unit
```

## テストケースの作成からテストの実行までを試してみる

既存の`welcome.blade.php`を使用してテストを実行してみます。
表示されたページに`Hello, Laravel`の文字が含まれるかテストしてみます。

テストファイルを作成します。

```
$ php artisan make:test WelcomeTest
Test created successfully.
```

テストコードを記述します。`textExample`の中身を次の通り書きかえます。
使用しているアサートはこんな感じです。
assertSeeText ... 指定した文字列がレスポンステキストに含まれていることをアサート。
assertStatus ... クライアントのレスポンスが指定したコードであることをアサート。

```php:tests/Feature/WelcomeTest
<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class WelcomeTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $response = $this->get('/');

        $response->assertSeeText("Hello, Laravel")
                 ->assertStatus(200);
    }
}

```

テストを実行します。ウェルカムページに`Hello, Laravel`が含まれないのでテストは失敗します。

```
vagrant@homestead:~/code/testapp$ phpunit tests/Feature/WelcomeTest.php
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 1.6 seconds, Memory: 12.00MB

There was 1 failure:

1) Tests\Feature\WelcomeTest::testExample
Failed asserting that '\n
(省略)
' contains "Hello, Laravel".

/home/vagrant/code/testapp/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:266
/home/vagrant/code/testapp/tests/Feature/WelcomeTest.php:20

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
```

`welcome.blade.php`を編集します。

```php:welcome.blade.php
...
      <div class="content">
        <div class="title m-b-md">
          Hello, Laravel
        </div>
...
```

もう一度テストを実行します。今度は成功します。

```
vagrant@homestead:~/code/testapp$ phpunit tests/Feature/WelcomeTest.php
PHPUnit 6.5.14 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 1.56 seconds, Memory: 12.00MB

OK (1 test, 2 assertions)
```

## 参考

[Laravel Document](https://readouble.com/laravel/5.5/ja/testing.html)
【モーダルなどの一時スクロール禁止】スクロールジャンクとは？



##やりたいこと
モーダルを開いたときに、「パソコンのスクロールを一時的止めたいな」
と思うことがありました。
とりあえずかいてみました。

```javascript
window.addEventListener('mousewheel',(e)=>{
   e.preventDefault();
});
```

`preventDefaul`でスクロールの動きを封じるやつです。
でもエラーが出て全然動きません。

##スクロールジャンク防止が原因だった
↓こちらのサイトで**スクロールジャンク**を知りました。
https://blog.webico.work/passive-event-listeber01

どうやら、スクロール系のイベント(`mousewheel`,`touchmove`,`wheel`など)は、
スクロールするたびに登録された全てのイベントに`preventDefault()`がないか確認が終わるまで処理が行えないそうです。これが所謂**スクロールジャンク。**

それを防ぐために`addEventListener`にはpassive：trueという値が初期値で設定されています。
これは実行前に、「`preventDefault()`実行しませんよ〜」と明示するものらしいです。

**でも！**
今回は`prevcentDefault()`を実行するので、ここの値をいじります。

##解決方法は？
passiveにfalseを渡してあげましょう。

```javascript
window.addEventListener('mousewheel',(e)=>{
e.preventDefault();},{passive:false});
```


**ちょっと待って！**
[昨日調べたこと](https://qiita.com/irico/items/8a23071719aa28e3c032)によると、イベントリスナの第三引数は`useCapture`というイベント伝播に関する引数だったはず...

##addEventListenerの第三引数の謎
https://qiita.com/kozy4324/items/85831e2c990d92b8397b
こちらの記事に答えがありました。
元々は`useCapture`のみだったみたいですが、拡張されたようです。現在では

```javascript
element.addEventListener('click',Handler(),{
   once: true,
   passive: true,
   capture: true
});
```

と書けるとのこと。
（以前の書き方と互換性があり、第三引数にboolean型のみ渡した場合はcaptureの値として判断されるそうです。）

###onceってなに？
`once`にすると、イベントハンドラが一度だけ処理されます。
一度しか読み込まないイベントを明示することで、メモリの節約になる！ってことですね。
毎回`removeEventListener`を使うより随分楽ですね。
[ruby]バッチ処理について

#バッチ処理とは？
> バッチ処理とは“一定量の(あるいは一定期間の)データを集め、一括処理するための処理方法”

私は、大量のデータを処理すること全般をイメージしてる。

引用元
https://www.imkk.jp/blog/what-is-batch-processing.html

#バッチ処理のフロー
私の業務では、DBに一括登録するデータをスプレッドシートから取り組むバッチ処理でした。
以下では、データベースに商品を一括にスプレッドシートから取り込んで追加するという場合。

フローは以下の通り
まずrakeファイルにそのバッチ処理がどういったものなのかをdescにかく。
そのあと走らせる。
以下がそのコード

``` ruby:import_new_products_information.rake
namespace :batch do
    desc '新規商品の追加'
    task import_new_products_information: :environment do
        require 'batches/import_new_products_information'
        Batches::ImportNewProductsInformation.run
    end
end
  
```


走らせるファイル。
一応シート内に商品名と商品コードというカラムがあることが前提。

```ruby:import_new_products_informations.rb
require 'batch/base'
require 'google_spreadsheet'

module Batches
  class ImportrProductsInformations < Batch::Base
    SPREADSHEET_KEY = '追加する商品のスプレッドシートキー'.freeze
    SHEET_NAME = '追加する商品一覧があるシートの名前　例）取り込み用など'.freeze

    def execute(_args)
      gs = GoogleSpreadsheet.new(SPREADSHEET_KEY)

      gs.spreadsheet.worksheet_by_title(SHEET_NAME).tap do |sheet|
        sheet.list.each do |row|
          products_informations.create!(
            product_name: row['商品名'],
            product_number: row['商品コード']
          )
        end
      end
    end
  end
end
```


```google_spredsheet.rb
def worksheet_by_title(sheet_name)
    spreadsheet.worksheet_by_title(sheet_name)
 end
```
【RDS for Oracle】初期化パラメータの変更

# はじめに
RDSでは`alter system文`での初期化パラメータの変更ができない。
RDSの場合`パラメータグループ`を作成し初期化パラメータを変更する。

変更できる初期化パラメータは`変更可能`列が`true`の初期化パラメータのみとなる。
また、パラメータグループの`適用タイプ`により、変更時の動作が変わる。

| 適用タイプ      | 初期化パラメータ変更時の動作|
|:-----------------|------------------|
| dynamic             |即時変更が有効 | 
| static             |インスタンス再起動後変更が有効 | 

# パラメータグループの作成
`パラメータグループ`から`パラメータグループの作成`

<img width="1657" alt="RDS_·_AWS_Console1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/4a4798ac-8b1f-d431-405d-7ffcbd46e38a.png">


`パラメータグループファミリー`を選択し、`グループ名`と`説明`を記入し`作成`
<img width="845" alt="RDS_·_AWS_Console2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/f5075bdd-c450-7a67-f643-e119bbd15fc8.png">

`パラメータの編集`から初期化パラメータを変更できる。
<img width="1667" alt="RDS_·_AWS_Console3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/6ca7f07e-303e-8e66-c4b7-3e70edc91e2d.png">

作成したパラメータグループをインスタンスに付け替える。


# 参考
[RDSパラメーターグループはいつ変更が有効になるのか?](https://dev.classmethod.jp/cloud/aws/when-are-rds-parameters-applied/)
[DB パラメータグループを使用する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)
DockerHubのイメージはバージョンのタグが付いてても上書きされている

# はじめに
* DockerHubなどのイメージについて「バージョンのタグを指定してればイメージが変わることはない」というのは勘違いです。
* 「`latest`じゃなきゃ大丈夫」ではないです
* むしろかなりのイメージで上書きが行われています。
  * 公式イメージでも結構変更されてます。
* この記事では実際に公式イメージの変更履歴を集めているGitHubリポジトリで調べてみます

# イメージ変更履歴を集めているGitHubリポジトリで見れます
DockerHubのwebサイトでは変更日時ぐらいしか見れませんが、
[docker-library/repo-info](https://github.com/docker-library/repo-info)というリポジトリで公式イメージの変更履歴が見れます

## 変更履歴の見方
* `repo-info/repos/`配下から調べたいイメージ名のディレクトリを見つけます
* その配下の`remote`か`local`の中にあるタグ名のmdファイルを見ます
  * `local`はpull実行で差分を検知した際に収集したもので、`remote`はapiで変更を検知した際のものです。たぶん定期実行でpollingしてるんだと思います。（ほぼ違いはないはず？）
* 「History」ボタンでコミットログから変更が追えます
  * イメージのshaがmdファイルに記録されているので、それを使って古いものをpullすることもできます。(消されていなければ) 

## 例えば、`node:11.15.0-stretch-slim`イメージの変更履歴を見てみる
[docker-library/repo-info](https://github.com/docker-library/repo-info) の [node/remote/11.15.0-stretch-slim.md](https://github.com/docker-library/repo-info/blob/master/repos/node/remote/11.15.0-stretch-slim.md)を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/9294b32a-651d-64e8-805b-27d2f2d8ab98.png)

* 思ったよりたくさん更新されてました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/8feac6a9-0fc6-6aba-a515-5b7f9085ca11.png)

* Jun5 2019の変更を見てみると、新しくファイル追加やEntrypoint変更がされたようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/b820bb02-8ed3-bfe2-f0aa-e806b43670d2.png)

* 両方runして追加ファイルを調べてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/ec0df78a-769d-d507-ecb0-e82e1561a7fd.png)
  * 追加されたのは`docker-entrypoint.sh`みたいです
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304012/d6f2b0b9-deb9-8278-905a-960b56e7c3a1.png)

  * ちなみに、今回はDockerfile自体が変更されているので、[nodeのdockerfileリポジトリ](https://github.com/nodejs/docker-node)でも変更が見れます

# 他にどんな変更があるのか
完全にイメージに依りますが、次のケースが多そうです。

* セキュリティアップデート
* セマンティックバージョンでマイナーバージョンまで指定しているタグの場合、パッチアップデートで上書きされる
  * `2.0`タグのイメージの中身が`2.0.0`から`2.0.1`に代わる 
* セマンティックバージョンでメジャーバージョンまで指定しているタグの場合、マイナーアップデートで上書きされる
  * `2`タグのイメージの中身が`2.0.3`から`2.1.0`に代わる 

# まとめ
* 「latest以外のタグを指定していればイメージが書き換わることはない」は勘違いです
* 書き換わって困るのであれば自分のレジストリでイメージ管理したほうがいいでしょう
真偽値を返す関数名のつけ方の例

真偽値を返す関数名のつけ方の例です。
様々な意見があるので画一的な正解はありませんが、一定の基準にはなるでしょう。

## はじめに
ここでは、関数名をあなた（=開発者）が自由につけられることを前提としています。
言語やライブラリ、フレームワークによる制約がある場合や、命名規則が定められている場合はそれに従いましょう。
記事中ではJavaやJavaScriptにおける例を示しますが、他の言語においてもおおむね当てはまるかと思います。

## 中身が空か確認する関数
中身が空かどうかを確認する関数の名前は、`isEmpty`とします。

たとえば、Javaの`List`インターフェースには`isEmpty`があります。

```java
final List<String> list = List.of();
if (list.isEmpty()) {
  // do something
}
```

このように、真偽値を返す関数の名前は`is...`とすることが多いです。
ただし、なんでもかんでもisをつければいいというわけではありません。

## 存在するか確認する関数
存在するかどうかを確認する関数の名前は、`exists`とします。

たとえば、Javaの`File`クラスには`exists`があります。

```java
final File file = new File("./example.txt");
if (file.exists()) {
  // do something
}
```

たまに`isExist`のような名前を見かけますが、existは動詞なので文法的におかしいです。

## 値を含むか確認する関数
値を含むかどうかを確認する関数の名前は、`contains`、`includes`、`has`などとします。

たとえば、Javaの`List`インターフェースには`contains`があります。

```java
final List<String> list = List.of("munieru_jp");
if (list.contains("munieru_jp")) {
  // do something
}
```

また、JavaScriptの`Array`オブジェクト（配列）には`includes`があります。

```js
const array = ['munieru_jp']
if (array.includes('munieru_jp')) {
  // do something
}
```

また、JavaScriptの`Map`オブジェクトには`has`があります。

```js
const map = new Map([['munieru_jp', 'https://qiita.com/munieru_jp']])
if (map.has('munieru_jp')) {
  // do something
}
```

## ～できるか確認する関数
～できるかどうかを確認する関数の名前は、`can...`とします。

たとえば、Javaの`File`クラスには`canRead`があります。

```java
final File file = new File("./example.txt");
if (file.canRead()) {
  // do something
}
```

## 参考リンク
* [真偽値を返す関数のネーミング - Qiita](https://qiita.com/yskszk/items/5a7f99c974773f03a82a)
Thorのコマンドの中でrailsのActiveRecordを使う

以前[railsのタスクの書式](https://qiita.com/MasamotoMiyata/items/83091c4f01819c8e93bf)という記事を書きましたが、railsのタスクが引数がややこしくて、オプションもスマートに使えず余り好きではありません。

[Thor](https://github.com/erikhuda/thor)でコマンドを書く方が好きなのですが、Thorの中でActiveRecordを使ってDBの操作が出来たのでメモしておきます。

以下はrailsアプリケーションの直下に`thor`というディレクトリを作り`thor/foobar`にコマンドがある想定のコードです。

railsのautoloadも効くのでthorをGemfileに追加します。

```
gem 'thor', '~> 0.20'
```

＊ @scivola さんにコメントいただきましたが`railties`がthorに依存しているのでGemfileには書かなくても読み込めます。ただし私の環境で試したところ`require 'thor'`を書かないと`uninitialized constant Thor`で動きませんでした。

```rb

#!/usr/bin/env ruby

require_relative '../config/application'
Rails.application.initialize!

class Main < Thor
  desc "exec", "foobar"
  def exec
    binding.pry
  end
end

Main.start(ARGV)
```

これで

```
thor/foobar exec
```

で実行可能です。なんてことは無くて`config/environment.rb`のコードを丸っと持ってきただけです。なので

```
RAILS_ENV=production thor/foobar exec
```

で実行すると`production`環境で実行可能です。


spring経由で起動してないので起動が重いのが玉に傷です。やり方をちょっと調べてみて、ちなみにspring経由で起動するのに[こんな](https://qiita.com/tynmarket/items/0cce0e4892208afe811d)タイムリーな記事があったのですが、残念ながら記事内のリンク先のgithubのリンクが死んでいてコードを見ることが出来ませんでした。[spring-commands-rspec](https://github.com/jonleighton/spring-commands-rspec)も参考になると思ってみてみましたが、私がspringの仕組み自体全く理解してないのでイマイチでよく分かりませんでした。その内調べて分かったらまた共有します。~~何かご存じの方いらっしゃいまたらヒントでも結構ですのでコメントお願いします！~~

-- 2019/07/31追記
Thorで引数の解析をしつつspring経由でrailsを読み込む方法を発見したので記事を書きました。
[Rails でコマンドラインを書く時の決定版](https://qiita.com/MasamotoMiyata/items/dc5b6fdef24ab21128ed)
【RDS for Oracle】リストアのやりかた 

# はじめに
AWSのユーザガイド「[DB スナップショットの復元](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html)」によると。。。

>復元すると新しい DB インスタンスが作成

されるらしいです。なので`エンドポイント`も変わるみたい。

# マネージメントコンソールからのリカバリ方法
- RDS コンソールから`Snapshots` を選択
- 復元の元にする DB スナップショットを選択

<img width="1662" alt="RDS_·_AWS_Console1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/3dddb042-8cc3-d59b-f418-41d9e9e671e4.png">


- `スナップショットのアクション`、`スナップショットの復元` の順に選択

<img width="1659" alt="RDS_·_AWS_Console2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/6e6b9402-856a-9851-87da-89211077432c.png">

- `DB インスタンスの復元` ページで、`DB インスタンス識別子` に、復元された DB インスタンスの名前を入力
- `DBインスタンスの復元` を選択

<img width="839" alt="RDS_·_AWS_Console3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/11fa3658-635d-1a07-bbef-cc6cadca68c3.png">

- スナップショットが作成された DB インスタンスの DB インスタンス機能を復元する場合は、セキュリティグループを使用するために DB インスタンスを変更します。次のステップは、DB インスタンスが VPC 内にあることを前提としています。DB インスタンスが VPC 内にない場合は、EC2 マネジメントコンソールを使用して、DB インスタンスに必要な DB セキュリティグループを見つけます。
    - VPC コンソールから`セキュリティグループ`を選択
    - DB インスタンスで使用するセキュリティグループを選択
    - 必要に応じて、EC2 インスタンスのセキュリティグループにセキュリティグループをリンクするためのルールを追加します。詳細については、[VPC 内の DB インスタンスに同じ VPC 内の EC2 インスタンスがアクセスする](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_VPC.Scenarios.html#USER_VPC.Scenario1)を参照してください


# AWS CLIでのリカバリ方法
 - Linux、OS X、Unix の場合:

```
aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier <Newインスタンス名> \
    --db-snapshot-identifier <mydbsnapshot>
```

 - Windows の場合

```
aws rds restore-db-instance-from-db-snapshot ^
    --db-instance-identifier <Newインスタンス名> ^
    --db-snapshot-identifier <mydbsnapshot>
```

https://www.cloud-koubou.jp/archives/1175

# 補足
AWSのDBサービスのバックアップ取得時間などは「[AWS データベースサービスの自動バックアップ設定まとめ](https://dev.classmethod.jp/cloud/aws/automated-snapshots-of-aws-database-services/)」にまとまってます。
Atom IDE を追加して、Choose a linter UI の表示が消えない

##問題
Disable Diagnostices を押しても再度起動したときに同じ表示が出て困っていました。

![スクリーンショット 2019-07-08 14.17.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15703/16f1dc74-f26a-aa94-e176-2a24fa6f12a5.png)

## 解消法
 
```Atom > Preference > Packages > atom-ide-ui > Settings > Enabled Features > Enable Diagnostics > Never enabled```を選択

[Chose a Linter UI is popup cannot be dismissed](https://github.com/facebookarchive/atom-ide-ui/issues/306)
lazyプロパティ内でstaticメソッドを使用すると、2回目以降のアクセスでも処理が走る場合がある

## 2019/07/09 追記

※ @nukka123 さんのコメントより、Swiftのlazyプロパティという仕様どんな処理を呼ぼうが異なるスレッドからアクセスすれば初期化処理が１回に止まる保証はないことが判明してます。

https://qiita.com/m-yamada1992/items/d77adc52b75f6d44c3f6#comment-f24b8fc4241d8b918ce3

## 実行環境

Xcode 10.2.1
Swift 5

## 例

```swift:ViewController.swift
class ViewController: UIViewController {
    
    private lazy var label: UILabel = {
        return ViewController.createLabel()
    }()
    
    init() {
        super.init(nibName: nil, bundle: nil)
        self.addSubview(label)
    }
    
    func setup(text: String) {
        label.text = text
    }
    
    static func createLabel() {
        let label = UILabel()
        return label
    }
}
```

`init()` で初回のアクセスをしたタイミングでlabelプロパティが生成され、２回目以降に`setup(text:)`メソッドでアクセスした際には生成済みのインスタンスにアクセスされることを想定していた。
が、`ViewController.createLabel()`が２回目以降も走っていることが発覚。

## 解決策

### lazyプロパティ内の定義をいずれかに変更

要は、staticメソッドさえ使わなければ想定通りの遅延初期化プロパティな挙動をする。

#### 直接生成

```swift
    private lazy var label: UILabel = {
        let label = UILabel()
        return label
    }()
```

#### インスタンスメソッドを用いて生成

```swift
    private lazy var label: UILabel = {
        return self.createLabel()
    }()

    static func createLabel() {
        let label = UILabel()
        return label
    }
```

### lazyではなくlet宣言にする

```swift
    private let label: UILabel

    init() {
        self.label = ViewController.createLabel()

        super.init(nibName: nil, bundle: nil)
        self.addSubview(label)
    }

    static func createLabel() {
        let label = UILabel()
        return label
    }
```
Cognos Analyticsのデータアップロード機能の検証

#Cognos Analyticsのデータアップロード機能の検証
個人的に動きを知っておきたかったので、データアップロードの機能を検証しましたので、共有しておきます。
データアップロードとは、Cognosポータルのこの箇所で起動される、手元のExcelやCSVファイルをCognosにアップロードして、データソースとして使用できる機能です。
<img width="707" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ad413689-2ea0-6939-0633-7699242fdf51.png">


**結論**
検証の結果わかった事を先にサマリーしておきます。

1. アップロードされたファイルは、Content Storeに書き込まれる

2. /opt/ibm/cognos/analytics/data/datafiles/datasetCache 配下にもファイルが作成されるが、キャッシュのデータである

3. Cognosポータル上でデータアップロードエントリーを削除しても、Content Storeの表スペースは解放されないが、別のデータアップロートの際に、表スペースの空いたスペースは再利用される

4. datasetCache領域は再利用されない

5. datasetCache領域のファイルはCognosを再起動しても自動的には消えないので、Cognos停止時にOSコマンドで削除する必要がある。全削除後にCognosを起動すると、データアップロードしたデータは問題なく使用できる。使用時に再度datasetCacheにファイルが生成される。


**環境**
Cognos Analytics 11.0.13 @ Redhat 6

**シナリオ**

|No        |操作 |
|:-----------------|:------------------|
|1             |データアップロード前の状態 |
|2             |95MB CSVをアップロード |
|3             |アップロードした95MB CSVをCognosポータル上で削除 |
|4             |88MB CSVをアップロード |
|5             |Cognos Analytics停止 |
|6             |Cognos Analytics起動 |
|7             |Cognos Analytics停止後、datasetCache配下を全削除して起動、動作確認 |

**使用量確認コマンド**
**Content Storeのターブルスペース使用量を確認**
db2 list tablespaces show detail

**dataフォルダの使用量を確認**
du -m /opt/ibm/cognos/analytics/data/datafiles/datasetCache/


**結果**
<img width="915" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/46ec48a7-9f9b-fec7-f460-6362b2af2cc9.png">

シナリオ7のdatasetCacheは、起動時には空の状態
[root@Cognos datasetCache]# pwd
/opt/ibm/cognos/analytics/data/datafiles/datasetCache

[root@Cognos datasetCache]# ls -ltr
合計 0

ダッシュボードなどで、何らかアップロードデータを使用してみると、問題なく使用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/06650cda-9e10-5c59-6821-a481007d137f.png)

ファイルが生成されている。
[root@Cognos datasetCache]# ls -ltr
合計 4
drwxr-xr-x. 3 root root 4096  7月  9 03:11 2019 E0
[root@Cognos datasetCache]# du -m .
2       ./E0/5
2       ./E0
2       .

ちなみに、Cognos Analytics 11.1.Xになると、アップロードデータはContent Storeに書き込まれるものの、内部的に実装されているSparkに展開され、ダッシュボード等での使用時にはSparkがデータを提供する動きになるため、パフォーマンスが向上しているようです。
こちらはまた別の機会に調べたら共有します。

以上、メモレベルで恐縮ですが。
矢印キーでQiitaのページを移動するユーザースクリプト

# 概要

2019年07月、QiitaのtagsのページでAutoPagerize[^AutoPagerize]が動作していたのが動作しなくなった :sob:
XHR化したことが原因だ。

2019年03月、ユーザーページが更新されたが、前後のページ移動がXHR化されていた。

XHR化したtagsとorganizationsのページと**ユーザーページ**で左右の矢印キーで前後のページに移動するユーザースクリプトを作った。
このユーザースクリプトは左右の矢印キーを押したとき、前後のページに移動する要素をクリックする。

クリックの手間を省くだけでなく最近の記事の位置までスクロールしてくれる親切設計だ :heart_eyes:

GitHubで公開中。
https://github.com/querykuma/snippets/blob/master/qiita/qiitaAddKeysLRArrow.user.js


# 使い方

拡張機能のTampermonkeyなどを使ってユーザースクリプトを登録する。 :sunglasses:


# 動作検証環境

Chrome 80.0.3987.149
Tampermonkey 4.9


[^AutoPagerize]: AutoPagerizeは次のページを自動取得するブラウザ拡張機能。XHR化したページ以外はAutoPagerizeで次ページを自動取得すればいいと思う。
digdag run でコマンドラインから変数を指定する

環境によって動作を切り替えたりするのに便利そう。

### sample workflow

```yml
timezone: Asia/Tokyo

+echo_p:
  echo>: ${environment}
```

### command line

```sh
$ digdag run  local_test.dig --no-save -p environment=local
2019-07-08 14:14:19 +0900: Digdag v0.9.36
2019-07-08 14:14:20 +0900 [WARN] (main): Using a new session time 2019-07-08T00:00:00+09:00.
2019-07-08 14:14:20 +0900 [INFO] (main): Starting a new session project id=1 workflow name=local_test session_time=2019-07-08T00:00:00+09:00
2019-07-08 14:14:21 +0900 [INFO] (0017@[0:default]+local_test+echo_p): echo>: local
local
Success.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```
ansible-playbookで特定のroleだけ実行したい

# はじめに
Ansibleを書いてる時に完璧にしたいけど、やっぱり途中で手動オペレーション入っちゃう、、みたいな時がもしかしたらあるかもしれません！でもいちいち途中でplaybook変更なんてしたくない！

そんな時にplaybookに書いておくけど普段は実行しないというやり方があるのです！

# 実行環境
- ansible 2.5以上

# どうするのか？
https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html
今回使うのはAnsibleのTag機能を使います。
ただ、少し特別なタグである `never` を使用します。
このタグをつけておくと、何もタグを指定せず実行してもこの `never` をつけているタスクは実行されません。

それはPlaybookで指定しても同じことで、Playbookのroleにつけて実行するようにします。

# 書き方 & 実行方法
## 書き方
書き方はいたってシンプルです！

```yml:plyabook.yml
---
- hosts: all
  become: yes
  roles:
    - role: hoge
    - role: fuga
```

上記のようなPlaybookで `fuga` はtagを指定しない場合では実行して欲しくない時はこのようにします。

```yml:plyabook.yml
---
- hosts: all
  become: yes
  roles:
    - role: hoge
    - role: fuga
+     tags: [never, fuga]
```

これでOKです！！！
## 実行方法
実行する時はこのようにします。

| 実行したいrole     |実行するコマンド     |
|------------------|-------------------|
| hoge             | `ansible-playbook -i inventories/hoge playbook.yml` |
| fuga             | `ansible-playbook -i inventories/hoge playbook.yml --tags "fuga"` or `--tags "never"` |

このような形でtagを指定しなければ `fuga` は実行されず、明示的に `never` もしくは `fuga` を指定することで実行されるようになります。

`never` と逆に `always` というtagもあります。競合した場合はどうなるかとか試してないです！！

# おわりに
この書き方はAnsibleで一気に全部実行！！で実現が難しい時や、一時的に書く時に良いかもしれません。
あまり多用すると初めてみた人が「なんでこのrole or task実行されないの！？」となることが予想されるので気をつけてください。
そういう点ではReadme等に実行手順をしっかり書いておく、などの考慮をしておくと幸せになれるかも！
一番意識の低いAWS CloudWatch Insights入門

昨年末にAWSに追加された[Amazon CloudWatch Logs Insights](https://aws.amazon.com/jp/blogs/news/new-amazon-cloudwatch-logs-insights-fast-interactive-log-analytics/)が結構便利です。
せっかくなので、最低限のやる気でなんとなく使えるようになっておきましょう。5分くらいで。

# インサイトを開いてみる
ひとまずマネコンのCloudWatchの左のメニューから**インサイト**を開いてみるとこんな感じの画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/1c3072e6-884d-deb5-cecc-8e0915fa78a3.png)

# ログを表示してみる
まずは何も考えずにログを表示してみましょう。
AWSのマネコンにしては珍しく、部分一致のインクリメンタルサーチをしてくれるので快適に目的のロググループにたどり着けます。
![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/eb9dbc4b-fc13-70b6-ebb4-95579cc18390.gif)



# エラーを探してみる
ログからエラーを抽出してみます。
何も考えずにデフォルトの`filter`を追加すると、親切にエラーっぽい文字列の正規表現が追加されます。
![error.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/4756f538-1476-6e13-24b3-83bbbad9ed58.gif)

⬆の手順では**5\d\d**はノイズが混じることが多いので除却しています。
逆にAPI GatewayでHTTPステータスコードを探すときは↓のようにフィルタを設定すると良いです。

```bash
filter @message like /(?i)(status: 5\d\d)/
```

# ヒットしたログの詳細を確認する
ヒットしたログの前後を見たい場合も多いでしょう。
そんな場合は何も考えずに`fields`を追加しましょう。クエリでいろいろ重複しててもOKぽいです。
![fields.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/877d0aa3-bd54-23e3-759a-ce1066f96a6d.gif)



`@logStream`のフィールドがリンクとなり、おなじみログストリームでの確認ができました。

# 時間を絞ってログを確認する
数分前に起こったエラーが確認したい、という場合は時間を絞ると効率が良いです。
![term.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/edef80d7-ad42-7178-99a5-edd92163a174.gif)

1時間以内にはエラーが起こっていないことが確認できました。

# 所感
- CloudWatchを利用するなら使うべき
    - 手軽にログ調査の時間が短縮できます
- AWSにしては珍しく親切な仕様
    - 部分一致のインクリメンタルサーチとか**コマンド**からクエリを追加した時にいい感じのデフォルト値が入ってることとか、使い勝手がかなり良いです
    - おかげでなんとなく使うだけでも効用が得られます
ウィークリーエクスポートサービスで抽出した添付ファイル一式から特定のファイルを掘り出す方法

~~技術ブログというより日記です。~~
そもそもなんでそんなことする必要が出たかというと・・・。

## AppExchangeのAアプリ⇒Bアプリ乗り換えのためデータ移行したい

Salesforseカスタムオブジェクトでデータを蓄積していくA社さんから
同じくカスタムオブジェクトへ蓄積していくB社さんへの乗り換えをすることになりました。
幸いデータは2万件弱なんですけども面倒なのが添付の画像ファイル。

念のためB社さんに「A社さんから移行された事例はお持ちではありませんかネー？」と資料をおねだりしてみるも
残念ながら、お詳しくないとのことー。
開発に確認するって言ってるうちに、こっちで調べてやってしまうことに。


ひとまず、A社さんは「添付ファイル」すなわち`Attachiment`に画像を入れて、本文レコードへ紐づけ。
B社さんは「コンテンツドキュメント」`ContentsDocument`に画像を保存していることがわかりました。

会社全体の本文レコードをごっそり引っ越したいので、
添付ファイルは「ウィークリーエクスポートサービス」機能を使ってダウンロードすることにします。


## ウィークリーエクスポートサービスでのデータ抽出

画像をダウンロードしたいので下記の設定にチェックを入れ、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/351274/a8d9e1ef-9618-755f-bb96-95a82a792cfb.png)

オブジェクトだけ選択してエクスポートスケジュールの日時になるのを待ちました・・・。


が、**全オブジェクトに紐づく全ファイルが吐かれるんですね！！**

まじかー・・・。50MB超のZipが何十個もできとるーーーーーーー！
そしてどのZipになんのファイルが入っているか、Attachimentのcsvにも書いてないし
一覧表のテキストも作ってくれないしで
全部展開してもいいですけど、とはいえ、何千という画像ファイル手で探したくないですし・・・
と思ってBat化する流れに。


## Zipのなかから所定のファイル名を拾い出すBat
とりま、対象のファイル名はattachimentファイルで割れているので、
どこのZipから解凍すればいいかを探索する方法を考えます。
ちなみにマクロは重くてダメでした。（そりゃそうか）

なのでBat化を試みたんですが。
展開せずにZipのまま検索するコマンドはインストールが必要なものしか見つかりませんでした。
`Unzip`または`7zip`の利用が必要で、下記はUnzipのコマンドを使って書いたBatファイル。
Zipの中身を除くコマンドをfor文でひたすら回します。
　※ほんとはもっとエレガントな方法もあるよなーきっと(゜-゜)

実際にはこのあと、一覧化したファイル名をもとに
フォルダコピーを繰り返す処理を足して使ってました。
完成形の公開はいつかするかもくらいで。

とりま、2万けんくらいならラップトップでもなんとか動くよ。

あと、コンテンツ系の移植は
もう一本Bulkアップデート用のBatも作ってアップロード作業しました。
（ガバナ制限とかマナー的には頻繁に利用しないべきかもですが）

コンテンツのアップロードをデータローダでやろうとすると1回1000件までの制限があってだるいので
1000件未満でリストと切って、自動でアップロードするやつです。
慣れないので一回目はちょっと苦労しましたが
一回作っちゃえば、後はポチるだけなので移行作業どんとこいになりました。

データローダのコマンドライン使用は便利そうなので、今後ちゃんとまとめたいですね。
Trailblazersの諸兄がすでに書いてそうですが。

```
@echo off

rem ------------------------------ 
rem 実行前準備作業フォルダのパスを記入

set folderpath=C:\Users\うにゃうにゃ\Documents\
set filepath=SmartViscaf__image_id__c.txt
rem ------------------------------

echo filepathの値：%filepath%
echo folderpathの値：%folderpath%

rem フォルダ内のZip一覧を作成
dir %folderpath% /O /B > %folderpath%ziplist.txt
echo ziplist maked

rem Unzipのフォルダへ移動
cd C:\Program Files (x86)\GnuWin32\bin

rem 一覧記載のZipをすべて検索するループ
for /f %%a in (%folderpath%ziplist.txt) do call :forcall %%a

goto :sub

:forcall
rem For文内でやりたい処理

rem 拡張子：文末3桁の切り出して大文字でそろえる
set ext=%*
set ext=%ext:~-3%
set ext=%ext:z=Z%
set ext=%ext:i=I%
set ext=%ext:p=P%

rem 操作フォルダのパス設定
set zippath=%folderpath%%*

rem 吐き出しファイル名
set listname=list-%*.txt
set listname=%listname:.IP=%

rem 拡張子がZipなら処理実行
if "%ext%" == "ZIP" (

    rem Zip内のファイル名すべて書き出す
    unzip -l %zippath% > %folderpath%temp.txt

    echo temp%* maked

    rem ファイル名で該当するものを最終的な一覧に書き出す
    for /f "tokens=6 delims= " %%a in (%folderpath%temp.txt) do call :makefilelist %%a
   
)

goto :eof

:makefilelist
rem For文内でやりたい処理 2
set filename=%*
set filename=%filename:Attachments/=%
echo ファイル名摘出：%filename%


for /f %%b in ( %folderpath%%filepath%) do (
    if "%%b" == "%filename%" (    
        echo %filename% >> %folderpath%%listname%

	)
)
goto :eof

:sub
rem '''終了処理
del %folderpath%temp.txt
del %folderpath%ziplist.txt

pause
```
[Laravel][Homestead] ウェルカムページをいじってみる

Laravelのインストールが終わったので、ウェルカムページをいろいろ触ってみます。

## welcomeページの内容を変更してみる

Laravelのルーティングの設定は`routes/web.php`に記述されています。
この場合、`http://homestead.test/`へアクセスされた時にwelcomeビューを表示するということです。

```php:routes/web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});
```

ウェルカムページのビューファイルは`resources/views/`配下の`welcome.blade.php`です。
試しにwelcome.blade.phpのbodyタグ内を変更して、`http://homestead.test/`へアクセスすると内容が変更されているはずです。


## ウェルカムページのURLを変更する

`web.php`を次のように変更してみます。

```php:routes/web.php
Route::get('/welcome', function () {
    return view('welcome');
});
```

すると、`http://homestead.test/welcome/`でアクセスした場合はウェルカムページが表示され、`http://homestead.test/`へアクセスするとページが見つかりませんと表示されます。

## Controllerを使用したwelcomeページの表示

プロジェクトの直下で以下のコマンドを実行して、コントローラを作成します。

```
$ php artisan make:controller WelcomeController
Controller created successfully.
```

作成されたコントローラを次のように編集します。

```php:app/Http/Controllers/WelcomeController.php

<?php

namespace App\Http\Controller;

use Illuminate\Http\Request;

class WelcomeController extends Controller
{
  // ここから追加
  public function index()
  {
    // 指定されたビューを返す
    return view('welcome');
  }
  // ここまで追加
}
```

ルーティングの設定をクロージャーからコントローラに変更します。

```php:routes/web.php
Route::get('/', 'WelcomeController@index');
```

`http://homestead.test/`へアクセスするとwelcomeビューの内容が表示されます。

## ディレクトリ構成

```
./
├ app
│　└Http
│　　└Controllers ... コントローラを格納する
├ resources
│　└views ... ビューを格納する
└ routes ... ルーティングを格納する
```

## 参考

[初めてのLARAVEL 5.6 : (1) ページの表示フロー](https://laravel10.wordpress.com/2015/02/15/%e5%88%9d%e3%82%81%e3%81%a6%e3%81%aelaravel-5-1-%e3%83%9a%e3%83%bc%e3%82%b8%e3%81%ae%e8%a1%a8%e7%a4%ba%e3%83%95%e3%83%ad%e3%83%bc/)
Systemdで作業ディレクトリを指定する方法

docker-composeを実行する際など、カレントディレクトリ（作業ディレクトリ）指定したい場合があります。
このような場合は、実行するserviceファイルに対して、WorkingDirectoryを[service]に記述します。

## 例

```
[Unit]
Description=hoge
After=fuga.service
Requires=fuga.service

[Service]
Type=simple
WorkingDirectory=/opt/hoge/docker-compose
ExecStart=/usr/local/bin/docker-compose -f /opt/hoge/docker-compose/docker-compose.yml up
Restart=yes

[Install]
WantedBy=multi-user.target
```

## 参考

- Executing chdir before starting systemd service
 - https://unix.stackexchange.com/questions/200654/executing-chdir-before-starting-systemd-service
dockerでjenkins構築（plugin install errorを出さない）

## はじめに
本通りだと、pluginがインストール出来なかったので書きます

#### この本読んでます
[Docker/Kubernetes 実践コンテナ開発入門(山田 明憲)](https://www.amazon.co.jp/dp/4297100339)


#### この記事で手順が丸々書き写してくれてます
参考：https://qiita.com/i_whammy_/items/84b71c56d70817803472


## 早速構築
### 1. 適当にjenkins試す用のディレクトリ作って、`docker-compose.yml`作成する


```docker-compose.yml
version: "3"
services:
  master:
    container_name: master
    # (library/)jenkins:2.60.3（公式）だと依存プラグインの関係でインストールがエラるので、jenkins/jenkins使う
    image: jenkins/jenkins:lts
    ports:
      - 18080:8080
      - 50000:50000
    volumes:
      - ./jenkins_home:/var/jenkins_home
#    links:
#     - slave01
#
#  slave01:
#    container_name: slave01
#    image: jenkinsci/ssh-slave
#    environment:
#      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAxxxxxxxxxxxx
```

#### イメージ作成＆起動
```
docker-compose up --build -d
```

#### jenkinsの起動ログが見たい場合
下記のコマンドで確認できます。

```
docker logs master
```


### 2. master側のSSHキー作成
#### sshキー作成
```
docker exec -it master ssh-keygen -t rsa -C "" 
```

##### hostマシンの./jenkins_home/.ssh/id_rsa.pubか
##### docker内の/var/jenkins_home/.ssh/id_rsa.pubで確認ができます。


### 3. slaveを作成する
[1. 適当にjenkins試す用のディレクトリ作って、docker-compose.yml作成する](https://qiita.com/_ainosh_/items/04992adbab8502e2ed9e#1-%E9%81%A9%E5%BD%93%E3%81%ABjenkins%E8%A9%A6%E3%81%99%E7%94%A8%E3%81%AE%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%BD%9C%E3%81%A3%E3%81%A6docker-composeyml%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
で作成した`docker-compose.yml`のslaveの欄をコメントアウトをなおす
 
```docker-compose.yml
version: "3"
services:
  master:
    container_name: master
    # (library/)jenkins:2.60.3（公式）だと依存プラグインの関係でインストールがエラるので、jenkins/jenkins使う
    image: jenkins/jenkins:lts
    ports:
      - 18080:8080
      - 50000:50000
    volumes:
      - ./jenkins_home:/var/jenkins_home
    links:
     - slave01

  slave01:
    container_name: slave01
    image: jenkinsci/ssh-slave
    environment:
      - JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAxxxxxxxxxxxxxxxx
```

#### 再度、イメージ作成＆起動
```
docker-compose up --build -d
```

### 4. 適当にjenkinsの画面でポチポチ設定してください

http://localhost:18080/

秘密鍵の入力を[Jenkinsのマスター上の~/.sshから]にしたいんですが、ないので直接入力しました。
![スクリーンショット 2019-07-08 13.32.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455534/64551bb3-ae7d-caf7-abc0-592eff8a183e.png)


## おわりに
本通りに進んで詰まるの辛い
jenkinsまだ何もわからない


友人と開発してる[owntime](https://owntime.io/about)ぜひ使ってみてください
辛口でもいいのでコメントお願いします〜
SQLのテーブル結合

いま携わっている業務の内容的にも本格的にネタがないので、SQLの基礎、テーブル結合について。
本当に基本中の基本なのでちょっとでもSQLをかじった事のある人は見る必要がないかも。

【LEFT JOIN】
おそらく結合の中でもっとも使う頻度が多いであろう外部結合。
これはLEFTなので、左側（LEFT JOINより前）に記載したテーブルを軸にした結合になります。
正式にはLEFT OUTER JOINを記載します。

例：SELECT * FROM TABLE1 T1 LEFT JOIN TABLE2 T2 ON T1.CD = T2.CD;

|T1.CD | T2.CD | T1.NAME | T2.NAME1 |
|:-----|:------|:--------|:---------|
|1     |1      |one      |one       |
|2     |2      |two      |two       |
|3     |       |three    |          |


【RIGHT JOIN】
こちらはRIGHTなので、右側（RIGHT JOINより後）に記載したテーブルを軸にした結合になります。
LEFTと同じく、正式にはRIGHT OUTER JOINと記載します。

例：SELECT * FROM TABLE1 T1 RIGHT JOIN TABLE2 T2 ON T1.CD = T2.CD;

|T1.CD | T2.CD | T1.NAME | T2.NAME1 |
|:-----|:------|:--------|:---------|
|1     |1      |one      |one       |
|2     |2      |two      |two       |
|      |3      |         |three     |


【INNER JOIN】
こちらは内部結合。
両方のテーブルに値が存在するものだけ表示する結合です。
例えば、TABLE1には1~3のデータ、TABLE2には1~2のデータがあるとしても、
両方のテーブルに存在する1~2のデータしか表示しません。

例：SELECT * FROM TABLE1 T1 INNER JOIN TABLE2 T2 ON T1.CD = T2.CD;

|T1.CD | T2.CD | T1.NAME | T2.NAME1 |
|:-----|:------|:--------|:---------|
|1     |1      |one      |one       |
|2     |2      |two      |two       |


【FULL OUTER JOIN】
こちらは完全外部結合。
両方のテーブルの全データを取り出す結合です。
例えば、TABLE1には1~3のデータ、TABLE2に1~2、4のデータがあるとしたら、
1~4のすべてのデータを表示します。

例：SELECT * FROM TABLE1 T1 FULL OUTER JOIN TABLE2 T2 ON T1.CD = T2.CD;

|T1.CD | T2.CD | T1.NAME | T2.NAME1 |
|:-----|:------|:--------|:---------|
|1     |1      |one      |one       |
|2     |2      |two      |two       |
|3     |       |three    |          |
|      |4      |         |four      |
Unzip使い方

自分向けなのでちゃんと書けないまま、押し出し公開
Salesforceのウィークリーエクスポートが添付ファイルまるごとZipに固められちゃうので
掘削用に使いたくて調べました。

ファイル一覧の名前をtxtで用意しといて
BatファイルでUnzipつかって、所定の場所にコピーってながれですね。


## Unzipのヘルプめも

windows版のunzipコマンドは以下からダウンロード
http://gnuwin32.sourceforge.net/packages/unzip.htm

http://infozip.sourceforge.net/UnZip.html
インストール先とかすぐみつからない・・・

http://cointoss.hatenablog.com/entry/2013/01/17/173000
インストール方法
📝Path通すの忘れない。

```
C:\Program Files (x86)\GnuWin32\bin>unzip
UnZip 5.51 of 22 May 2004, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment
  -x  exclude files that follow (in xlist)   -d  extract files into exdir

modifiers:                                   -q  quiet mode (-qq => quieter)
  -n  never overwrite existing files         -a  auto-convert any text files
  -o  overwrite files WITHOUT prompting      -aa treat ALL files as text
  -j  junk paths (do not make directories)   -v  be verbose/print version info
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -$  label removables (-$$ => fixed disks)  -V  retain VMS version numbers
  -X  restore ACLs (-XX => use privileges)   -s  spaces in filenames => '_'
                                             -M  pipe through "more" pager
Examples (see unzip.txt for more info):
  unzip data1 -x joe   => extract all files except joe from zipfile data1.zip
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
```

##ファイルを解凍せずに取り出す（コピー）
Unzipを使うメリットは、Zipから直接中身を取り出せること。
ファイル名を指定したりワイルドカード使って拡張子を指定してみたり。
`unzip data0720.zip "*.txt"`

https://www.atmarkit.co.jp/ait/articles/1607/26/news014.html

##コピー先指定
ふつうに解凍して解凍先を指定するのは、`unzip hoge.zip -d foo`

http://cutmail.hatenablog.com/entry/20100816/1281952284