OmniAICreator/Qiita-1.07M huggingface dataset:
【Excel VBA】関数でいろんな空白を削除する

#記事の概要

ビジネスサイドで 「なんでスペースしかないはずなのに `?` が文字化けで出るの？」という話題が出ました。
かつてVBA初心者だったころに、CSVファイルの読み込みでこんなんに遭遇して1時間つぶしたことを思い出したので、1年数か月ぶりにQiitaに記事を書きました。

#環境

- Excel2016
- Windows10

#単純にスペースを削除できる場合

###Trim関数

文字列の先頭や末尾のスペースを削除する関数。全角も半角もスペースなら削除してくれます。
下記3つのいずれかを使用。

- Trim : 先頭と末尾のスペース削除
- LTrim :先頭のスペース削除
- RTrim : 末尾のスペース削除

```vb

Sub ex_Trim()

 Dim s As String
 
   s = Trim(cells(1,1)) 'A1セルの先頭と末尾からスペースを削除
   cells(1,2) = s 'B1セルに書き出し

End Sub

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241380/56f43ebd-fca1-555d-da01-8e20e87eab97.png)


###Replace関数

Replace関数は置換を行う関数。
`" "`や`"　"`を`""`に置換してスペースを削除します。

Trim関数だと文字列の先頭か末尾のスペースしか削除できないので、`hoge hoge`を`hogehoge`にしたい場合はReplace関数を使います。

半角スペースを消したい場合はこんな感じ。

```vb

Sub ex_Replace()

 Dim s As String
 
   s = Replace(Cells(1,1)," " ,"") 'A1の半角スペースを""に置換
   Cells(1,2) = s 'B1に書き出し

End Sub

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241380/5dbd139c-b069-e70b-082c-71b1de10ae5b.png)

#そもそも` `があるか知りたい

###InStr関数

`,`の後ろに入れた文字が、`,`の前に入れた文字列の何文字目に存在しているかを返す関数。
諸々省略できるけれど、[正式にはこういう関数](https://docs.microsoft.com/ja-JP/office/vba/Language/Reference/User-Interface-Help/instr-function)。

半角もしくは全角のスペースが存在するかを調べたい場合はこんな感じ。

```vb

Sub ex_InStr()
   
  If InStr(Cells(1, 1), " ") > 0 Or InStr(Cells(1, 1), "　") > 0 Then 'A1の先頭からスペースを探して0よりも大きい(スペースが存在する)場合
      MsgBox "True" 'メッセージボックスに`True`を表示
  Else
      MsgBox "False" 'スペースが存在しない場合、メッセージボックスに`False`を表示
  End If

End Sub

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241380/cfca61a9-b4d4-1a72-6014-77a3ef9c211d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241380/73edf811-38e5-7e60-0ce3-e20db956b4c3.png)


#スペースを削除したはずなのに、何故か` `が消えなかったり、`?`が表示されている場合

ノーブレークスペースがいらっしゃる可能性が高いです。
WordPressに入稿する際に自動で入ってたりするこういうやつ `&nbsp;`

見た目は` `ですが、正確にはスペースとは異なるので、Trim関数を使ったり、Replace関数で`" "`や`"　"`を置換しようとしても削除できません。
`?` になるのは、ざっくり言うと` `で表現できない文字コードに変換されているから。(2バイト系文字コードが云々のような話になるので割愛)

##Unicodeをサポートしてる環境のみ

※[Visual Basic for the Macintoshでは、Unicodeをサポートしていない](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/chr-function)ので、Mac勢はこの項目で解決できないです…:bow:
AscB関数とChrB関数で行けそうな気はします。


###ChrW関数

指定した文字コードをUnicode(String型)で返す関数。
VBA(Windowsで、バージョンがあまりに古すぎないもの)のString型はUnicodeなので、ChrW関数を使うのが手っ取り早いです。

` `が`&nbsp;`で確定なら、文字コードは160なのでこんな感じ。

```vb
Sub ex_ChrW()

 Cells(1, 2) = Replace(Cells(1, 1), ChrW(160), "") 'B1にA1の文字コード160を""に置換した値を書き出し

End Sub

```


###AscW関数

Unicodeの文字コードを返す関数。
「文字コードが分からん」という場合は、AscW関数で文字コードを調べてからChrW関数での処理に移ってください。



```vb
Sub ex_AscW()

 Msgbox = AscW(Cells(1, 1)) 'メッセージボックスにA1の文字コードを表示

End Sub

```
化学式の係数を力任せに探索するPGM

化学式の係数をただ力任せに探索するだけのPGMです

githubURL : https://github.com/NanjoMiyako/MiteiKeisu

PGMのサンプルページ: https://nanjomiyako.github.io/MiteiKeisu/

処理の流れとしては
1.まず大まかにブロック別として探索する係数の範囲を決定
2.決定した係数探索範囲のブロックを元に係数候補のリストを作成
3.それらの係数候補から化学反応式としてOKなものか判定し、
OKだったらそれを返すようにする

参考画像

![screenshot2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/f4493d29-f7d8-ae45-6de3-630f9fd7b20a.jpeg)

サンプルスクリーンショット
![screenshot1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412430/7b5bf234-be8a-c724-dc5f-f5633ba2e744.jpeg)
【初心者】pythonで０から Project Euler を解いてみた17

今回はeuler17問目を解いていきます！
問題はここです！！
http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2017
では、解いていきます！！
##私の考え
まず問題を読んだときに数と英語をどうやって関連付けるか考え調べましたそしたら辞書(dict)が出てきました
それで一からすべてに割り当てるのは大変だから法則を見つけそれでと思いましたコードを見ればわかると思います。
#コード
```python

English_number_li = []
def English_number(n):
    eng_num = {
    0:"",
    1:"one",
    2:"two",
    3:"three",
    4:"four",
    5:"five",
    6:"six",
    7:"seven",
    8:"eight",
    9:"nine",
    }
    eng_ten = {
    0:"ten",
    1:"eleven",
    2:"twelve",
    3:"thirteen",
    4:"fourteen",
    5:"fifteen",
    6:"sixteen",
    7:"seventeen",
    8:"eighteen",
    9:"nineteen",
    }
    eng_teen = {
    2:"twenty",
    3:"thirty",
    4:"forty",
    5:"fifty",
    6:"sixty",
    7:"seventy",
    8:"eighty",
    9:"ninety",
    }
    eng = {
    100:"hundred",
    1000:"onethousand",
    }
    num = n
    Num = list(str(num))
    #print(Num)
    #rint(Num[1])
    if num == 1000:
        txt = (eng[1000])
    if 100 <= num < 1000:
        if int(Num[1]) == 1:
            txt = (eng_num[int(Num[0])] + eng[100] + "and" + eng_ten[int(Num[2])])
        if int(Num[1]) == 0:
            if int(Num[1]) == 0 and int(Num[2]) == 0:
                txt = (eng_num[int(Num[0])] + eng[100])
            else:    
                txt = (eng_num[int(Num[0])] + eng[100] + "and" + eng_num[int(Num[2])])
        if int(Num[1]) > 1:
            txt = (eng_num[int(Num[0])] + eng[100] + "and" + eng_teen[int(Num[1])] + eng_num[int(Num[2])])
    if 20 <= num < 100:
        txt = (eng_teen[int(Num[0])] + eng_num[int(Num[1])])
    if 10 <= num < 20:
        txt = (eng_ten[int(Num[1])])
    if 0 < num < 10:
        txt = (eng_num[int(Num[0])])
    English_number_li.append(txt)

total = 0

for i in range(1000):
    i += 1
    English_number(i)
    total += int(len(English_number_li[i-1]))

print(English_number_li)
print(len(English_number_li[5]))
print(total)
#答えは21124
```
まずある程度を定義しておきます
定義するのは1~19と10の倍数と100と10000を定義します
そしたらfor文で一文字ずつ足してゴリゴリ計算していきます！！
そして文字の数(len)をたして完成(⋈◍＞◡＜◍)。✧♡
【前編】Tellusとオープンデータで子育てしやすい地域を探してみよう(鎌倉市編）

#この記事について

**注：本記事は前後編に分かれています。**

この記事は、2019年10月5日の Satellite Hack! #9 でTellusのハンズオンをするために書きました。
![Satellite Hack-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488857/171b4a68-f241-fe07-8157-d381a5563656.png)
・Tellusでは Jupyter Notebook(開発環境) も使えるけど、初心者も来場されるハンズオンでやれる内容じゃない
・なによりも人気殺到のため、開発環境のオプションは申請から付与までちょっと時間がかかる。

という事で、TellusOSの基本的な部分でできる内容で構成してみました。

#Tellusとは

「Tellus（テルース）は、政府衛星データを利用した新たなビジネスマーケットプレイスを創出することを目的とした、日本初のオープン＆フリーな衛星データプラットフォームです。複数のデータをかけ合わせ、新たなビジネス創出を促進するためのあらゆるファンクションを提供します。」（[公式HP](https://www.tellusxdp.com/ja/about)より抜粋。）

今までも、NASAが衛星データをオープンデータとして公開していたりはしましたが、はっきり言って、専門家でないと(専門家でも)扱うのは難しいものでした。Tellusはそれらを簡単に扱う事ができたりします。
また、衛星データだけではなく、他のオープンデータと組み合わせて使う事もできます。

###オープンデータってなんだ？
我らが古崎先生のスライドが分かりやすいので、是非、ご参照を。
[オープンデータとLOD～オープンデータって何？](https://www.slideshare.net/KoujiKozaki/lod-116219488)

###なぜ鎌倉？
Tellus では、 GeoJSONの形のオープンデータを取り込む事ができますが、鎌倉市のオープンデータはこの形式のデータがたくさん提供されてます。
他の市区町村でもCSVデータなんかは出ていますが、変換の手間を考えると、元からこの形式であった方が良いので採用。

#ハンズオン内容

###子育てしやすい地域の条件を考える
まず、子育てしやすい地域の定義が必要になります。
ハンズオン講師である新卒(23歳・男性)と1歳の子供がいる父親(Lv.1)が考えたのはこんな感じ。
######まず環境。
・空気が良い事（自然分布により比較）
######そして、子供に関わる施設が多い事。
・教育に関わる施設（保育園、小学校、中学校）
・子供が遊べる場所（公園・広場など）
・その他、公共施設等（病院、交番、消防署）
######アクセスの良さも重要
これから秋。
交通手段、特に鉄道沿線だと子供と一緒に出掛けやすいですね。

これらをTellus上で表示できるようにしましょう。

##まずは下準備～GeoJSONファイルをダウンロードする～
###Tellusのアカウントを開設
Tellusのアカウント持っていない方は、 [こちら](https://www.tellusxdp.com/ja/sign-up) から登録(無料)

|![tellus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488857/b3948d1a-6c22-27e1-8654-33ef8de44e09.png)|
|:-:|


###行政区画のGeoJSONファイル
下記から鎌倉市の行政区画データをGeoJSONの形式で生成、ダウンロードします。

[LOAJ2GeoJSON - 住所LODからGeoJSON作成](http://uedayou.net/loaj2geojson/)

こちらは、下記記事を参考にしました。

[参考：住所LODから行政区画のGeoJSONファイルを作成する方法](https://qiita.com/uedayou/items/806ed80a45ec9855c554)

###鎌倉市のサイトから各種GeoJasonをダウンロードする。
鎌倉なびマップ の [データダウンロードページ](http://navimap.kcn-net.org/data.html)から、各種GeoJSONファイルをダウンロードします。

関係しそうなのは、このあたりかな？
![kamakuranabi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488857/8454154b-b52a-25e8-8922-1e2f89a0c2f6.png)

避難所などの情報もいざとなった時のために、ダウンロードしてみましょう。

###いよいよTellusOSにログイン
[Tellusログインページ](https://www.tellusxdp.com/ja/sign-in) からユーザー名(メールアドレス)とパスワードを入力してログインします。
![www.tellusxdp.com2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488857/caaa5142-1d25-61f2-eb42-afe02682e9fb.png)
Tellus OS(操作ツール)ボタンをクリックすると、
![www.tellusxdp.com3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488857/66372737-8383-5a2d-84db-6501488c04ce.png)
このような画面に切り替わります。
これでTellusOSにログイン完了です。

**[後半へ続く](https://qiita.com/ueki_kensuke/private/e51c227d488449df64b0)**
mdadm 構築

めも。

```
cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
```

#mdadm install
```
yum insatll -y mdadm
```

現在の状況を確認

```
lsblk
lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE   MOUNTPOINT
nvme0n1     259:1    0  1.5T  0 disk   
└─md126       9:126  0  2.8T  0 raid10 
  ├─md126p1 259:4    0    1G  0 md     /boot/efi
  ├─md126p2 259:5    0   64G  0 md     [SWAP]
  └─md126p3 259:6    0    2T  0 md     /
nvme1n1     259:2    0  1.5T  0 disk   
nvme2n1     259:0    0  1.5T  0 disk   
nvme3n1     259:3    0  1.5T  0 disk   
```
OSの入っていないnvme1から3 にmdadmを構築します。
パーティションが設定されていたら消去します。

##パーティションの消去

```
fdisk /dev/nvme1n1

#コンソールが変わる

# d で既存のパーティションを消去。複数ある場合は数字で指定して1つ消去できる。
d
[select pertition num]1

#保存して終了
w

#変わったコンソールが戻る
```

#mdadm 構築

```
#RAID 5 で構築
mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/nvme1n1 /dev/nvme2n1 /dev/nvme3n1

#ファイルシステムxfsで作成
mkfs.xfs /dev/md0
```

#Mount

```
#マウントポイントの作成
mkdir -p /mnt/mdadm

#マウント
mount /dev/md0 /mnt/mdadm

#確認
df -h
/dev/md0        3.0T  462G  2.5T  16% /mnt/mdadm
```




#削除
## unMount

```
#確認
df -h
~(略)~
/dev/md0        3.0T  371G  2.6T  13% /mnt/mdadm


#unmount
umount /dev/md0

```
##RAID 解除

```

mdadm --misc --stop /dev/md0
mdadm: stopped /dev/md0

#df -hをすると/dev/md0が消えているはず
#cat /proc/mdstat　でも確認可能
```
Google Cloud datastore に対してキーを自動生成する go ライブラリを作成（gonm）

表題にあるとおり、google cloud datastore のキーを自動生成する go ライブラリ `gonm` を作成しました。gonm は [cloud datastore](https://godoc.org/cloud.google.com/go/datastore) と [goon](https://godoc.org/github.com/mjibson/goon) を参考にしています。
拙い英語ですが godoc は https://godoc.org/github.com/komem3/gonm
レポジトリは https://github.com/komem3/gonm

# コンセプト

通常の cloud datastore のパッケージを使用する際、以下のようにエンティティと ID を指定して鍵を作成しその鍵で Get・Put を行う必要があります。

```go

key := datastore.NameKey("Article", "articled1", nil)
article := &Article{}
if err := client.Get(ctx, key, article); err != nil {
    // TODO: Handle error.
}
```

Gonm ではこの鍵の作成を省略し、構造体の名前と内部に格納されている ID プロパティから鍵を生成し、datastore に格納を行います。

```go
user := &User{ID: 2}
if err := gm.Get(user); err != nil {
    // TODO: Handle error.
}
```

これにより、プログラミングの手間が少し省けます。
そして、Put 時にIDの指定がない場合などは、生成された ID の補完を行います。
また、構造体は Get や Put を行う際に ローカルのキャッシュに保存されます。そのため、Gonm の使用により、同一のデータに何度もアクセスする場合などに、ローカルキャッシュの実装をする必要がなくなります。memchache への保存はまだ未実装です。

# プロパティ
gonm では key の ID を構造体の int64 型か string 型の 変数 ID から取得します。また、親キーは *datastore.Key 型の 変数 Parent から取得します。以下は親子関係のある例です。

```go
type User struct {
	 ID int64 `datastore:"-"`
	 Name string
	 Parent *datastore.Key `datastore:"-"`
}
gm := gom.FromContext(ctx, client)

parent := &User{Name: "Father"}
key, err := gm.Put(parent)
if err != nil {
    // TODO: Handle error.
}

child := &User{Name: "Jack", Parent: key}
_, err := gm.Put(child)
```

また、キーの値を特定の変数から決定したい場合は、タグを使って記述できます。タグの記述では、ID は `id` タグ、親キーは `parent` タグ、エンティティ名は `kind` タグとなります。

```go
type CustomUser struct {
	Id string `datastore:"-" gonm:"id"`
	Kind string `datastore:"-" gonm:"kind"`
	Key *datastore.Key `datastore:"-" gonm:"parent"`
	Name string
}
```

より詳しいプロパティに対する説明は[datastoreのドキュメント](https://godoc.org/cloud.google.com/go/datastore#hdr-Properties)をお願いいたします。

# クエリー
クエリーの使い方は基本的に datastore パッケージと同じです。しかし、以下のメソッドを使ったやり方がおすすめです。

```go
q := datastore.NewQuery("User").Limit(2)

keys, cursor, err := gm.GetKeysOnly(q)
dst := make([]User, len(keys))
if err := gm.GetMultiByKeys(keys, dst); err != nil {
   // TODO: Handle error.
}
```

# トランザクション
トランザクションは datastore パッケージと比べて少し特殊です。Gonm ではトランザクション時に渡す関数に Gonm を指定できます。これにより、通常時とトランザクションで同一の関数を使うことができます。しかし、トランザクション内で使えないメソッドも一部あるため、注意が必要です（詳しくは https://godoc.org/github.com/komem3/gonm#Gonm.RunInTransaction）。

```go
Users := []*User{{ID: 1}, {ID: 2}}
_, err = gm.RunInTransaction(func(gm *Gonm) error {

	if err = gm.GetMulti(Users); err != nil {
		return err
	}
	Users[0].Name = "Hanako"
	if _, err = gm.PutMulti(Users); err != nil {
		return err
	}
	return nil
})
```

# Google Cloud Datastore Emulator 
ローカルで試す際のエミュレータは以下のドキュメントを見てください。`$(gcloud beta emulators datastore env-init)` の実行により自動で環境変数に `DATASTORE_PROJECT_ID` がセットされます。
https://cloud.google.com/datastore/docs/tools/datastore-emulator

# 最後に
概要だけですが、興味を持ったらぜひ使って見てください。

ドキュメント: https://godoc.org/github.com/komem3/gonm
Androidアプリでバージョンアップ通知を組み込んでテストする方法

#背景
コーチング会社でニュースアプリをiPhone/Androidで作っています。
2年ほどアップデートしていなかったそうで、今後はバージョンアップをユーザに通知したいという要望がありました。

AndroidではHockeyAppという通知お知らせSDKが入っていましたが、2019年の秋あたりに仕様が変わる？みたいな記述があったので、別のものを入れることにしました。

#in-app updates
上記の代わりにGoogle純正の「in-app updates」というものをドキュメントを見て実装しました。
[Support in-app updates はこちら](https://developer.android.com/guide/app-bundle/in-app-updates?hl=ja)

#必要環境
Android 5.0 (API level 21) 以上
Play Core library 1.5.0以上 

ドキュメントは英語だけど頑張って読んで、
ソースをそのままコピペ。

#更新のタイプ
ImmediateとFlexibleのタイプが選べて、
Immediateは強制アップデート（×ボタンがあるので強制とはいえない）
Flexibleはアップデートしないボタンが選べる

#重要！テストの仕方
GooglePlayに上がっているアプリのバージョンが19として、
バージョン18のAPKを作って実機に入れれば動くと思ったら動かない！！

AndroidStudioでの署名付きAPKの作り方はこちら

GooglePlayConsole
https://developer.android.com/distribute/console?hl=JA

にログインして、**内部テスト**を実施しないといけませんでした！

#GooglePlayConsoleでの内部テスト
https://support.google.com/googleplay/android-developer/answer/3131213?hl=ja

1. consoleにて内部テストするユーザーのメールアドレスを登録
2. 現在GooglePlayに上がっているアプリ(v19)のバージョン+1(v20)のAPKを作成してconsoleにてリリースを作成する
3. 1．で登録したアドレスでログインしたGooglePlayStore経由か、オプトインURLをユーザに共有して、実機にインストールする
4. バージョンアップ通知をテストしたいので、2.のバージョン+1(v21)したAPKを作成し、consoleにてリリースを作成する
5. 実機にインストールしたv20のアプリを起動すると、下記画面が出る

Immidiateの場合
![immediate_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454905/31dde172-ceba-83b3-bd24-e242111a921d.png)

Flexibleの場合
![flexible_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454905/8cef45ec-9efb-7ce1-eb0b-1a9ac36117b8.png)


出ると嬉しい！
【GitLab】issueボード(カンバン)をさくっと使う

GitLab の issue ボードをサクッと使う方法です
今回は**とりあえず使える**方法をまとめます。

##左メニューの Issues>Boards をクリック
ボードに繊維します。
![issue01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430539/5003e648-9d5e-11f7-d031-314a7d097788.png)

## ボードでできること
- とりあえず「＋」マークでissue(課題)を追加します。この時、issue名を完結に書いときます。
- その次に「Add Default lists」をクリッックして「ToDo(やること)」と「Doing(やっていること)」のリスト(場所)を作成します。

![issue02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430539/ecd9da6e-4fc7-0b6a-598d-511e5c42e84a.png)
こんな感じになります。
![issue03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430539/ac27be6b-ed98-7efc-7b49-e6479833a733.png)

## issue(課題)をリスト間で移動させる
課題をドラッグ＆ドロップで移動できるので、簡単にカンバンみたいな感じで使えます。
![issue04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430539/67acd9f8-873b-dfcd-acfb-f89e9109425b.png)

###まとめ
今回はじめて使用してみたので、簡単な使い方の説明になってしまいました。
今後さらに便利な使い方がわかれば記事を書きたいです...
JMeterの使い方1(MacOS)：基本の使い方

# 目次
1. インストール
2. スレッドグループ、HTTPリクエストサンプラーを作る
3. CUIで起動
4. GUIで起動
2. テスト結果を確認


# インストール
`brew install jmeter` でインストールする方法と、下記公式HPからtgz形式のファイルを落として解答する方法がある。この手順書ではtgz形式のファイルを使用して説明する。

[apache公式HP](http://jmeter.apache.org/download_jmeter.cgi)

<img width="719" alt="スクリーンショット 2019-08-29 10.50.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/8cc56082-1394-0a15-cc3e-d638a32eee65.png">

`apache-jmeter-5.1.1.tgz`を選択し、ローカル環境の任意のディレクトリでWクリックして解凍する。
※現時点での最新バージョン


# GUIで起動
#### tgz形式のファイルを解凍した場合

解凍したディレクトリの下にある⁨`bin`⁩を開き、`ApacheJMeter.jar`をWクリックする

<img width="590" alt="スクリーンショット 2019-08-29 10.55.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/3382d757-18b0-50dd-67be-e172b19013b5.png">

#### home brew でインストールした場合

コマンドで`jmeter`と入力しEnter

jmeterをGUIで起動すると下記画面が表示される
<img width="1149" alt="スクリーンショット 2019-08-29 10.59.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/0eb6d632-9cae-da9c-2630-49743861e8e1.png">

# スレッドグループ、HTTPリクエストサンプラーを作る
この辺を参照し、テスト計画を保存する
http://tech-blog.rakus.co.jp/entry/2017/08/24/111332

# CUIでテスト実行
負荷テスト実行時には必ずCUIでテストを実行すること！
#### tgz形式のファイルを解凍した場合

``` 
# binが置いてあるディレクトリまで移動
$ cd apache-jmeter-5.1.1/bin/
# テスト計画実行
$ ./jmeter -n -t /{テスト計画のパス}/テスト計画.jmx  -l log.jtl
```

※テスト計画.jmxはテスト計画で保存した名前に置き換えてください。

#### home brew でインストールした場合
``` 
# テスト計画実行
$ jmeter -n -t /{テスト計画のパス}/テスト計画.jmx  -l log.jtl
```

※テスト計画.jmxはテスト計画で保存した名前に置き換えてください。

# GUIでテスト実行
テスト計画が動くかどうかの確認やデバッグの際はGUIでテストを実行する！

実行前
<img width="1146" alt="スクリーンショット 2019-08-29 11.16.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/36abac25-4e36-0eb6-df8f-765a5381b453.png">

実行中
<img width="1121" alt="スクリーンショット 2019-08-29 11.18.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/a735353d-c0cd-0e9d-9925-0ab9d132760b.png">

緑の矢印：テスト実行
赤いSTOP：テスト停止
歯車にほうき：実行結果をクリア

# テスト結果を確認
apache-jmeter-5.1.1/bin 直下に実行結果のログが`log.jtl`という名前で保存されるので、それをGUIで確認する
追加→リスナー→結果を表で表示

<img width="753" alt="スクリーンショット 2019-08-29 11.22.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/a89356c7-72f5-47f6-a64c-29fca19f0dbe.png">

結果を表で表示画面でのファイル名に`log.jtl`を指定
<img width="422" alt="スクリーンショット 2019-08-29 11.23.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/aaa19d6c-55fd-f96a-4a88-5e579d803d08.png">

こんな感じで結果が出てくる
<img width="1037" alt="スクリーンショット 2019-08-29 11.25.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487806/0ae6b584-806a-22b3-33d9-acd6bc9e8978.png">

# 参考資料
https://qiita.com/kter/items/24e74c7b6900a3ab2226

https://qiita.com/tatesuke/items/827e6190753964e46814

http://jmeter.apache.org/usermanual/get-started.html#non_gui

http://mislead.jp/601.html

https://devlog.arksystems.co.jp/2019/01/23/6596/

http://privnotes.blog.fc2.com/blog-entry-109.html

https://prev.net-newbie.com/jmeter/
Top画面の早く表示、頑張るぜ！！

![pagespeed_insights.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489182/e0d04b8b-3672-7aaf-9b7c-9809a2adb640.png)

Top画面の表示速度が***直帰率***と関係が深いらしく、以下のサイト（ほとんどGoogle提供・方針）で現在会社で担当している開店ポータルのチェックを行ったところが思ったより点数及び速度がイマイチでした。

https://testmysite.withgoogle.com/intl/ja-jp
https://developers.google.com/speed/pagespeed/insights/

大きく対応するべき内容は以下の物

- 画像の適切なサイズ、Format
- レンダリングを妨げるリソースの除外
- 使用していない CSS の遅延読み込み
- テキスト圧縮の有効化
- その他

一旦会社の運営しているサーバーは勝手に試すのも出来ないし、テストサーバーはIP等の制限で確認出来ないので、以前から運営している個人サイトで試してみました。経験もない上家に帰って少しずつ進んだので相当時間がかかりましたが、insightsサイトで40位の点数が90位になりました。対応内容は以下の通りです。
![complete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489182/4f1212ec-3947-407c-4c8f-b75d343d8b54.png)

***画像の適切なサイズ、Format***
・個人のサイトは画像はあまり使用してないので対応なし

***レンダリングを妨げるリソースの除外***
・Critical CSSの分割
・CSSのpreload化（「https://github.com/filamentgroup/loadCSS」を利用）

***使用していない CSS の遅延読み込み***
・ChromeのCoverageで分析
・Chromeの拡張機能：CSS used（https://chrome.google.com/webstore/detail/css-used/cdopjfddjlonogibjahpnmjpoangjfff）を利用

***テキスト圧縮の有効化***
・ApacheのGzip
・Cloudflareの利用（Apacheの対応は要らなかった。CDN上でBrotliで圧縮されていた）

※ 「レンダリングを妨げるリソースの除外」部分が専門分野でもないので一番難しいかった。
※ 違う分野で面白く、やりがいがあった。

***※ 結局、最終的にはサーバーのランクアップでした。***
メモリが１GのLowスペックですので。。。。WWW
![complete-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489182/a34cd238-aa82-732f-f8e4-10fda258308f.png)
AWS ELB(ALB)で起きた謎現象（筆者がnginxの仕様を理解していない可能性あり）

構成：
インターネット => ELB(ALB) => EC2 => nginx => puma => rails

参考サイト：
https://qiita.com/himatani/items/b6c267dfb330a47fea9f

こちらの参考サイトを元にnginxを設定

```
upstream puma {
    server unix:///var/www/my-app-name/shared/tmp/sockets/puma.sock;
}
server {
    listen       80;
    listen       [::]:80 default_server;
    server_name my.server.com;

    location / {
        proxy_pass http://puma;
    }
...
```

これで my.server.com にアクセスするとなぜか http://puma にリダイレクトし DNS_PROBE_FINISHED_NXDOMAIN になってしまう。
ちなみにserver_nameをec2のドメインに変えて直接アクセスすると問題なくアクセスできる。
（と思い込んでいる可能性は否めないけど）

で、これを以下のように修正したら動くようになった。
（かも）

```
upstream my.server.com {
    server unix:///var/www/my-app-name/shared/tmp/sockets/puma.sock;
}
server {
    listen       80;
    listen       [::]:80 default_server;
    server_name my.server.com;

    location / {
        proxy_pass http://my.server.com;
    }
...
```

もうちょっとちゃんと調べよう...
ときどき遅くなるCloud Functions for Firebase

Firebaseの監視用で軽い「Cloud Functions for Firebase」を作成して（StackDriverではなく）外部から呼んでいるのですが、稀にTimeoutエラーが発生してます。

その時のCloud Functionsのログをみるとこんな感じ。

```
Function execution took 42684 ms, finished with status code: 200
```

42秒か〜〜

普段はこんな感じです。

```
Function execution took 188 ms, finished with status code: 200
```

[Firebase Status Dashboard](https://status.firebase.google.com/)で確認しても障害発生はありません。

この監視用アクセスは「Hosting(rewrites) <-> Functions <-> Firestore」の流れで、三ヶ所まとめて死活監視してるんですが、Functions <-> Firestoreの遅延の可能性もあります。

遅い時はログに何か別の情報を出力したほうがいいかもしれませんね。
イロレーティングについての雑記

対戦ゲームにおけるプレイヤーの強さを測る方法「イロレーティング」に関する雑記です

続き→ [イロレーティングにおける分布関数の選択](https://qiita.com/41semicolon/items/9d9d0cbd940dbd5adcd7)

# 賭博だと見なせる
レート1900のアリスとレート1700のボブが対決すると、レート差200なのでアリスの勝率は75%。K=10とすると、アリスが勝てばレートが2.5上がってボブのレートが2.5下がる。ボブが勝てばレートが7.5上がってアリスのレートが7.5下がる。この現象を理解する同等の記述はこう:

> 勝負前にアリスは参加費7.5 を、ボブは参加費2.5 を払う。すると合計10の懸賞金になる。勝負に勝った方がこの10(=K)を獲得できる。

この描像は英語版の wikipedia からの着想:

>each game the player can be said to have put an ante of K times their expected score for the game into a pot, the opposing player does likewise, and the winner collects the full pot of value K

# 分布を探せ
前章の描像を使うと「懸賞金の分担をレートに基づいてどう公平に決めるか？」という課題がある（注：答えを前借りして値を提示したけど・・）。公平さは期待値計算をすればよいだけで、また、レートそのものは前節の方法で統計的に収束するので、上記の課題は「レートから勝率をどう算出すべきなのか？」に帰着する。要は 二人のレートを入力として片方の勝率を出す関数を知りたい。より正確には、（レートの補正が足し算/引き算なので）レート差を入力として勝率を出すような関数＝分布が知りたい。

Eloの提唱では正規分布を仮定したが、これは仮定に過ぎず、具体的な関数形は 対象となる対戦ゲームの特性に依存する。したがって実際にEloレーティングシステムを運用してその妥当性を判断するしかない。実際チェスでは正規分布よりもロジスティック分布の方がより良い説明を与えるとされる。英語版Wikipediaより引用:

>The first mathematical concern addressed by the USCF was the use of the normal distribution. They found that this did not accurately represent the actual results achieved, particularly by the lower rated players. Instead they switched to a logistic distribution model, which the USCF found provided a better fit for the actual results achieved.

正規分布にせよロジスティック分布にせよ、パラメトリックな分布関数を仮定すれば「レートが200離れてたら勝率は0.75で、平均プレイヤーはレート1500」などの境界条件（≒仕様）を定めれば分布関数は一意にきまるので、厳密な数式でレートやレートの変化を記述できる。

# 将棋の本質をEloで測れるか？
分布関数が「対象となる対戦ゲーム」によって特徴づけられているとするならば、逆の見方をすれば、チェス・将棋・テニス・相撲などなどにおける分布関数の違いを見出すことができるならば、それは対戦ゲームにおける将棋の特徴づけの一つになりうるのではないだろうか？直観的には将棋は2人ポーカーよりも運の要素が少ないので分布関数の尖度が大きくなるのでは？など。

# 参考文献
自分なりの理解です。Wikipediaの [日本語版](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%AD%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0) と [英語版](https://en.wikipedia.org/wiki/Elo_rating_system) と [碁のレーティング](https://en.wikipedia.org/wiki/Go_ranks_and_ratings#Elo-like_rating_systems_as_used_in_Go) は読みました。実際のレーティングとして [棋士ランキング](http://kishibetsu.com/ranking2.html) と [将棋棋士レーティングランキング](http://shogidata.info/list/rateranking.html) を見ました。
 
# さいごに
コメント・アドバイス等歓迎です。
Reduxを使い始めたらthisに悩まされなくなった

javascriptのthisは非常に癖が強く使う場合は注意が必要です。
最近はアロー関数のおかげである程度マシになりましたが、
逆に旧来のjsに慣れ親しんでいる人からするとthisが切り替わらないことが気持ち悪かったりもするようで、厄介なことに変わりありません。

javascriptは後方互換性を大切にする言語なので、thisレベルの大きな言語仕様が変更されることはおそらくないでしょうし、
typescriptを使ってもjavascriptのスーパーセットである以上、thisはthisのままです。
これはいつまで経ってもフロントではthisに悩まされ続けるのかなぁとうんざりしていたのですが、
ふと気づくと最近thisに悩まされないどころか、書いてすらいないことに気づきました。

何がきっかけなんだっけ？と振り返ってみたところ、どうやらReduxのおかげのようでした。

# Reduxを使うと処理と状態が分離する
thisが必要になるのは、いわゆるオブジェクト指向的な、
状態を持ったオブジェクトに紐づく関数を使う場合です。

しかし、Reduxを使うとStateはStoreに全て集約されます。
Reducerは純粋な関数ですし、ActionCreatorも引数に応じてActionをDispatchするだけ、
ContainerはStateからPropsを生成してPresentationalComponentに渡すだけ、
PresentationalComponentは当然FunctionalComponentなのでStateは持ちません。

つまり、thisを使う必要のあるシーンがありません。

# まとめ
* thisはStateとロジックが結合している場合に必要になる
* reduxはStateを一か所に集約するためthisが必要なくなる
AWSのESCを使ってデプロイ(Docker＆Goのアプリを)

## ESCはEC2(サーバー)を管理する機能
### ECSのFargateを使う
### サーバーが落ちないような工夫をする

###Docker
--コンテナを作るもの
###Docker-compose (==ECS)
--コンテナの管理ツール
rails console 上で実行時間を計測する

Rails Tutorial 5日目。
現在第8章を勉強中。

# 知りたいこと
find_by と find_by_x ってどっちが速いの？

[6.1.4 ユーザーオブジェクトを検索する 演習1](https://railstutorial.jp/chapters/modeling_users?version=5.1#sec-exercises_finding_user_objects)
> nameを使ってユーザーオブジェクトを検索してみてください。また、 find_by_nameメソッドが使えることも確認してみてください (古いRailsアプリケーションでは、古いタイプのfind_byをよく見かけることでしょう)。 

~~find_by が古いタイプと言いながら、このあとの演習でも find_by がたくさん出てくるから、やっぱり古くないのではないか？？？(互換性があるから update されてないだけ？)~~

追記：@scivola さんがコメントで勘違いを指摘してくださいました。ありがとうございます！
古いタイプの find_by == find_by_x ということだったのか～！

# やりたいこと
find_by と find_by_x ってどっちが速いのか実行時間を計測してみたい。

# ほかに知らないこと
- 実行時間のはかり方 [参考](https://qiita.com/scivola/items/c5b2aeaf7d67a9ef310a)
- rails console 上の SQL 出力の消し方(じゃま…) [参考](https://qiita.com/whitefox_105/items/fd196b5874af2fd8021e)

# 関数定義
```ruby:rails_console
def calc_find_by(count:, id:)
  # SQL の出力を抑える
  old_logger = ActiveRecord::Base.logger
  ActiveRecord::Base.logger = nil
  # Benchmark モジュールを使う
  Benchmark.bm 10 do |r|
    # find_by(id: id) を計測
    # 結果出力時のタイトル設定
    r.report "find_by" do
      count.times do
        User.find_by(id: id)
      end
    end

    # find_by_id(id) を計測
    r.report "find_by_id" do
      count.times do
        User.find_by_id(id)
      end
    end
  end
  # SQL 出力抑制を元に戻す
  ActiveRecord::Base.logger = old_logger
end
```

# 実行結果
id : 3 は nil。

``` :10000回
>> calc_find_by count:10000, id: 3
                 user     system      total        real
find_by      0.956429   0.092523   1.048952 (  1.050382)
find_by_id   0.957591   0.100028   1.057619 (  1.059075)
```

``` :100000回
>> calc_find_by count:100000, id: 3
                 user     system      total        real
find_by      9.854176   0.629422  10.483598 ( 10.498670)
find_by_id   9.824362   0.667503  10.491865 ( 10.506455)
```

id : 2 は nil ではない。


``` :10000回
>> calc_find_by count:10000, id: 2
                 user     system      total        real
find_by      1.278680   0.063538   1.342218 (  1.344218)
find_by_id   1.267526   0.059938   1.327464 (  1.328699)
```

``` :100000回
>> calc_find_by count:100000, id: 2
                 user     system      total        real
find_by     12.492160   0.747277  13.239437 ( 13.251859)
find_by_id  12.435650   0.863175  13.298825 ( 13.311519)
```

そこまで大きく差が出るほど早さに影響しているわけではなさそう。
↓の通り、SQL 文は一緒だもんね。

```
>> User.find_by(id: 3)
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
=> nil
>> User.find_by_id(3)
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
=> nil
```
Kotlin > Runできない場合の対処メモ



Gradleの一覧に実行したいプロジェクトが無いことがある。
Gradleをチェック。

![スクリーンショット 2019-08-29 10.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/c06dc6b6-6a69-0ec2-8fc6-e166627bb823.png "スクリーンショット 2019-08-29 10.52.38.png")


build.gradle.ktsを右クリック > import Gradle Projectを選択
![スクリーンショット 2019-08-29 10.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/6307bf95-6d1c-18c3-a4d9-20583b7fe066.png "スクリーンショット 2019-08-29 10.53.31.png")

しばらく待つとGradleに追加される

![スクリーンショット 2019-08-29 10.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/81854ae0-c91e-b3ec-6788-6abc40ca570c.png "スクリーンショット 2019-08-29 10.54.52.png")

Runできるようになりました。　
![スクリーンショット 2019-08-29 10.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/4ce7537f-5548-3643-5eea-66e03a555083.png "スクリーンショット 2019-08-29 10.55.52.png")
【PowerApps】アプリからテキストやメールを飛ばす方法（Launch関数）

# 今回やろうとしている事

今レストランで使う、在庫取りをして、その後食材発注が出来るアプリを作っています。

そこでユーザはそのままテキストやメールで発注が出来る様にしたかったんですが、ハマりました。

最終的に出来たのでここに備忘録しておきます。

# テキストの送り方

以下のリンクを参考にしました。
http://www.businessintelligenceinfo.com/crm/microsoft-dynamics-crm/powerapps-sending-text-messages

どうやらiOSとアンドロイドでは構文が違うようです。自動的にiOSかアンドロイドかを識別する仕方が見つかりませんでした。もしご存じであれば教えて頂ければ幸いです。

しょうがないので、ユーザがラジオボタンから「iOS」か「Andoroid」かを選んでそれをタップしたら下の式が起動するようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403091/120576f6-e513-a6ec-a256-b713569cf3c1.png)


```ruby:OnSelect
If(
       "iOS" in Radio_OS5.Selected.Value,
       Launch(
            "SMS:" & CellNum1 & "&body=" & OrderString1
        ),
        Launch(
            "SMS:" & CellNum1,"body",OrderString1
        )
    )
```

CellNum1は変数であらかじめ「携帯番号」を入れています。
OrderString1も変数であらかじめ「注文内容」を入れて、それがテキストの本文に行きます。

ご覧の様に上のLaunch関数の構文がiOSで下のLaunch関数の構文がアンドロイド用です。若干違うのが分かります。

# メールの送り方

スクリーンから直接メールを飛ばしたかったんですが、上手くいかず、一度携帯のメーラーを開いて必要情報を自動で載せるようには出来ました。

以下のリンクページを参考にしました。
https://powerusers.microsoft.com/t5/General-Discussion/Launch-mailto-is-converting-spaces-to-when-on-iOS/td-p/41610

```ruby:OnSelect
       Launch(
            "mailto:" & MailAdd1, "subject", Subject1, "body",OrderString1
        )
```

MailAdd1、Subject1、OrderString1はどれも変数でそれぞれ「送り先メールアドレス」、「件名」、「本文の内容」をあらかじめ入れています。

これが出来る様になるまで数時間を要しましたので、出来た時は感激しました。皆さんの参考になればと思います。
起動時に Amazon EC2 Linux インスタンスへ （手動で）SSM エージェントをインストールする方法（要点のみ）

- [Amazon EC2 Linux インスタンスに SSM エージェント を手動でインストールする](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-manual-agent-install.html)
- [起動時に Amazon EC2 Linux インスタンスへ SSM エージェントをインストールする方法](https://aws.amazon.com/jp/premiumsupport/knowledge-center/install-ssm-agent-ec2-linux/)

上記の内容の **要点のみ** です。
Amazon Linux 2 で SSMエージェントはデフォルトでインストールされる様ですが、
起動時から最新版を使用したいケースのメモです。

# TL;DR

EC2起動時に「ユーザーデータ」にスクリプトを設定します。

# 環境

OS：Amazon Linux 2です。

# SSM エージェント を Amazon Linux 2 にインストールするには..

次のコマンドを実行します。

```sh
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
```

## SSM エージェント が実行中であるかどうかを調べるには..

次のコマンドを実行します。

```sh
sudo systemctl status amazon-ssm-agent
```

##「ユーザーデータ」に設定するスクリプトは..

```bash

#!/bin/bash
cd /tmp
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo systemctl start amazon-ssm-agent
```

## 実際に比べてみた

AMI： **amzn2-ami-hvm-2.0.20190618-x86_64-gp2 (ami-0c3fd0f5d33134a76)**
でユーザーデータの設定無しと有りで比較した結果です。

|設定の有無|SSMエージェントのバージョン|
|---|---|
|あり|2.3.701.0|
|なし|2.3.372.0|


# 重要

> 新しい機能が Systems Manager に追加されるか、既存の機能が更新されると必ず、更新されたバージョンの SSM エージェント がリリースされます。古いバージョンのエージェントがインスタンスで実行されていると、SSM エージェント プロセスによっては失敗することがあります。そのため、インスタンス上で SSM エージェント を最新に維持するプロセスを自動化することをお勧めします。詳細については、SSM エージェント への更新の自動化 を参照してください。SSM エージェント の更新に関する通知を受け取るには、SSM エージェント のリリースノートのページをサブスクライブします。
docker runしたら「no matching manifest for windows/amd64 10.0.18362 in the manifest list entries.」と出る

# 環境
- Windows10
- Docker for Windows

# エラー
```
PS C:\> docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: no matching manifest for windows/amd64 10.0.18362 in the manifest list entries.
```

# 対処方法
Settingで `"experimental": true` を定義して、 `Apply` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/6fa672e0-f0d6-ae54-65df-93152e2f27e7.png)

experimentalは実験とか検証とかそういう意味みたいですね。
関数型について勉強してみたらコードがシンプルになりました

こちらの記事を読ませていただき、とても勉強になったので実践した、というお話です。
[忙しい人のためのjavascriptでざっくり理解する関数型](https://qiita.com/tetsuya-zama/items/6c88f26302a3fe9b28f3)

結果として、大変勉強になりました！ありがとうございます。

それでは、どんな風に修正したのか、前回書いた記事で使ったコードで比較してみます。

```js:修正前のコード
function getMyQiita() {
  const token = "発行したアクセストークン";
  const uri = "http://qiita.com/api/v2/authenticated_user/items/";
  const options = {
    headers : {
      'Authorization' : 'Bearer ' + Token
    },
    method : 'get'
  }
  const res = JSON.parse(UrlFetchApp.fetch(uri, options));
  const id = res.map( function(report) {
    return report.id
  });
  const reports = id.map( function(id) {
    const uri = "http://qiita.com/api/v2/items/";
    return JSON.parse(UrlFetchApp.fetch(uri + id, options));
  });
  const report_array = reports.map( function(report) {
    return { "title" : report.title, "likes_count" : report.likes_count, "page_views_count" : report.page_views_count };
  });
  var msg = "";
  report_array.map( function(array) {
    msg += array.title.slice(0,30) + "\n / いいね : " + array.likes_count + " / view : " + array.page_views_count + "\n";
  });
  return msg;
}
```

完成したときは嬉しかったのですが、こうしてみると長いですし、何度も const 宣言してますしおすし。
だいたい、`report_array` ってなんだよ！(; ･`д･´)
変数名に苦心し過ぎだろ！
あー、恥ずかしい(*ﾉωﾉ)

それでは、勉強の成果をみてください。(=ﾟωﾟ)ﾉ

```js:修正後のコード
function getMyQiita() {
  const token = "発行したアクセストークン";
  const uri = "http://qiita.com/api/v2/authenticated_user/items/";
  const options = {
    headers : { 'Authorization' : 'Bearer ' + token },
    method : 'get'
  }
  return JSON.parse(UrlFetchApp.fetch(uri, options))
  .map( function(report) { return report.id })
  .map( function(id) {
    const uri = "http://qiita.com/api/v2/items/";
    return JSON.parse(UrlFetchApp.fetch(uri + id, options));
  }).reduce( function(prev, report) {
    return prev + report.title.slice(0,30) + "\n / いいね : " + report.likes_count + " / view : " + report.page_views_count + "\n";
  },"");
}
```

変数の数があからさまに減りました。
`const` が 7個から 3個に。`var` はなくなりました。
まさに劇的ビフォーアフター。

凄く単純なことなんですが、`map` 関数って `.` で繋ぐことができるんですね。
「知らなかったの？」と言われそうで恥ずかしいのですが、この気づきで変数がほぼ不要になりました。

あと、配列を一文の `string` にするために `msg` という変数を用意して毎回追記していたのですが、[reduce 関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)を使ってこれも不要になりました。
`reduce` 関数は初めて知ったのですが、配列内の要素の値を１つにまとめてくれます。
初期値の設定もできるので、応用度が高いです。
色々なところで使っていけそうです。良いものを知りました。('◇')ゞ

#おわりに
ここまでお付き合いいただきありがとうございました。
まずは動かすことが大事だから、自分のわかる範囲で作るのですが、新しい知識が手に入ると昔のも見直したくなりますね。
で、「ぎゃー！昔の自分はなんて稚拙なんだぁぁぁぁぁ(*ﾉωﾉ)」ってなるやつです。
子どものときの読書感想文みたいですね。

どーでもいい話ですが、うちの息子は夏休みの宿題の読書感想文がまだ終わっていません。
彼曰く、最高難易度の宿題なんだとか。
真面目に仕上げようと思っているだけでも偉いな、と思います。

ではまた！(^^)/

#参考にさせていただきましたm(_ _)m

[忙しい人のためのjavascriptでざっくり理解する関数型](https://qiita.com/tetsuya-zama/items/6c88f26302a3fe9b28f3)
[reduce 関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
正規分布に関して後からわからなくなりそうな箇所

### 正規分布の初歩

正規分布は平均と分散(または標準偏差)の二つの値が決まれば，一意に定まる。

### 確率分布と正規分布

正規分布は確率分布である。

正規分布では確率を面積で表している。
![stdndiv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355150/8f1f636a-4ced-6e6a-0bf7-82b620ac53bc.gif)

0<X<uのあいだの値をとる確率は水色の色がついたエリアの面積で表される。

### 範囲をもたない一つの値をとる確率がゼロ

上の図ではX=uのところに直線が入っているが、この直線は幅を持たないので面積は０である。
よってX=uとなる確率はゼロである。

もっと具体的にいうとX=1.00000000・・・・・という値が実際に得られることはないということである。


### 正規分布グラフの縦軸は何を表している？

![seikibunpu-300x209.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355150/17e7869e-112d-665f-6a50-8aec9a1d3f27.png)


グラフの縦軸は確率そのものではなく確率密度を表している。
物質の「密度」ならば、体積をかけると質量が出てくる。
それと同様に、おおざっぱに言うと確率変数の範囲の長さをかけると、(縦の長さ×横の長さ)面積となり確率が出てくる。
うっかりあげてしまったElasticsearchでバージョンを下げる方法

EC2にElasticsearchを立てようと思い、最新バージョン7.3.1をインストールしたところ、rails側のライブラリが現在のバージョンでは対応してなかったので対応しているバージョンの6.8.2を入れ直して立てようとしたところエラーに。（Elasticsearchの載せ替えとバージョンアップを一緒にしたくなかったのでダウングレードを選びました。。）
![スクリーンショット 2019-08-29 10.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348847/3ef6e5c3-cb22-9910-ca3a-d182310d78da.png)

調べてみるとElasticsearchのダウングレードはできないとのこと。
https://discuss.elastic.co/t/unwanted-upgrade-elasticsearch-version/191841

もう一度EC2インスタンスを作り直すのも面倒だし、nodesファイルは起動時に作成されるっぽいのでnodesを削除してみることに。
```
sudo rm -rf /var/lib/elasticsearch/nodes
```
※nodesを消すとindexが消し飛ぶので稼働中のElasticsearchには使わないようにしてください。

Elasticsearchを起動してみると正常に動いた！
一通り検証してちゃんと動くことは確認できているので問題はなさそうですが、この方法で起こりうる問題が何かあれば教えていただけると幸いです。

### 余談
Elasticsearch起動時に以下の状態で落ち続けていて、JAVA_HOMEは通っているのにおかしいな。。。
とずっと悩んでいましたが、実際のエラーは```/var/log/elasticsearch/elasticsearch.log```に出ています。
きちんとログを読めということですね。。。
![スクリーンショット 2019-08-29 10.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348847/29fdc190-c0e7-9e1c-3f75-1f04323cda34.png)


### 参考
AWS EC2上にElasticSearchをインストール
https://qiita.com/nbapps_dev/items/4c6e061869f0d63eac45
Install Elasticsearch with RPM(6.8)
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/rpm.html
Vuetifyの気になるコンポーネントまとめ

#Vuetifyのコンポーネントで良さそうなのを個人的にまとめてみた。

勉強のついでに気になるコンポーネントをまとめてみた。

##Overlays

[Overlays](https://vuetifyjs.com/ja/components/overlays)

背景マスクを簡単に作ってくれる。absolute指定でブロックに限定するのが簡単にできる。ダイアログやライトボックスなどを自前で作るときに便利

![Aug-29-2019 09-27-58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/36f312df-af53-387d-241f-965b3c283b09.gif)


##App Bars

[App Bars](https://vuetifyjs.com/ja/components/app-bars)

ヘッダーくらい自分で作れと言われそうだが、めんどくさいのもまた事実。最近流行りのヘッダーラインより少し下にメニューをつける手法ができるが、応用ができなかったら結局自分で作りそう。
Collapseはなんか見慣れない不思議な動き。

![Aug-29-2019 09-33-50.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/0cef3181-656a-c1c0-4f1c-3597a977b8f7.gif)

##Color pickers

[Color pickers](https://vuetifyjs.com/ja/components/color-pickers)

![Aug-29-2019 09-37-29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/617c3d48-f86e-56dc-44fd-d49047813ddb.gif)

##Data iterators

[Data iterators](https://vuetifyjs.com/ja/components/data-iterators)

例として成分表示表が使われてるけど、比較しない単体での表示が必要な場合は使いたい。filterやsearchが強力なのが嬉しい。

![Aug-29-2019 09-41-47.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/58587b2c-ee80-3580-4448-f3364f7acc1f.gif)

##Tabs

[Tabs](https://vuetifyjs.com/ja/components/tabs)
縦型にも対応しているし、スマホだとフリック操作でスライドもする。

![Aug-29-2019 09-46-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/1e563ab2-470b-1157-c40b-df909c5f6cb6.gif)

##Timelines

[Timelines](https://vuetifyjs.com/ja/components/timelines)

略歴とかバージョンアップ履歴とかに便利なコンポーネント。
avatarとかなかなか面白い

![Aug-29-2019 09-57-14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/529cc2dc-8b56-6289-6fb7-a1908ce8d4e0.gif)

##Treeview

[Treeview](https://vuetifyjs.com/ja/components/treeview)

適当にjson投げると表示を綺麗にしてくれそうなあれ。セレクトは下位の要素も同時に選択できる。

![Aug-29-2019 10-01-23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/bcb827dd-7bfd-eace-a263-6c6cec2e94ee.gif)

##Steppers

[Steppers](https://vuetifyjs.com/ja/components/steppers)

長い操作が必要な場合に画面分割＆経過を視覚的に見せる。
カートとかで使われてるが、入力項目が多い場合に汎用的に使用できる。
縦型にすることもできるのでなかなか面白い。

![Aug-29-2019 10-06-11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/c1c16618-1c45-0987-9b73-20f5fa9d8613.gif)


##まとめ

まだまだ他にも色々面白いものがありそう。使えそうだったら楽して組み込みたいなぁ
vscodeでparquet-viewerを使うまで(memo)

# 前提

- vscodeを入れている
- vscodeのリモート接続している（この投稿はamazon linuxとつなげていますが、wslの場合yumをaptに読み替えてください）

# 構築した環境

- OS
amazon linux

- 各種コンパイラ

```bash
[xxx@xxx src]$ java --version
openjdk 11.0.4 2019-07-16 LTS
OpenJDK Runtime Environment Corretto-11.0.4.11.1 (build 11.0.4+11-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.4.11.1 (build 11.0.4+11-LTS, mixed mode)
[xxx@xxx src]$ mvn --version
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T07:58:13Z)
Maven home: /usr/share/apache-maven
Java version: 11.0.4, vendor: Amazon.com Inc.
Java home: /usr/lib/jvm/java-11-amazon-corretto
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "4.14.133-113.105.amzn2.x86_64", arch: "amd64", family: "unix"
[xxx@xxx src]$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/7/lto-wrapper
ターゲット: x86_64-redhat-linux
configure 設定: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --with-isl --enable-libmpx --enable-libsanitizer --enable-gnu-indirect-function --enable-libcilkrts --enable-libatomic --enable-libquadmath --enable-libitm --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
スレッドモデル: posix
gcc バージョン 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC) 

```

以下手順

# 1. Extensionsを追加する

これを入れて下さい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84539/b88b68bd-bcca-a481-6a32-3a5fe0b5411a.png)

これを追加するだけだと `parquet-toolのパスが見つかりません` といったニュアンスのエラーが発生します

# 2. 準備

コピペで行けると思いますが、エラーが出たらコンパイルエラーをみて必要なライブラリを追加が必要になります。

```bash
sudo yum install gcc -y 
sudo yum install gcc-c++ -y 
sudo yum install boost-devel -y 
sudo yum install byacc -y
sudo yum install openssl-devel -y
sudo yum install protobuf -y
sudo yum install protobuf-devel boost-devel gflags-devel lmdb-devel -y
wget -nv http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz
tar xzf thrift-0.12.0.tar.gz
cd thrift-0.12.0
./configure --disable-gen-erl --disable-gen-hs --without-ruby --without-haskell --without-erlang --without-php --without-nodejs
# 割と重めのコンパイルです
sudo make install
```

# 3. parquet-toolコンパイル

```bash
git clone git@github.com:apache/parquet-mr.git
cd parquet-mr
mvn -pl parquet-tools -am clean package -Plocal
```

**重要**
公式ページだと `cd parquet-tools ` してからmvnしていますが、モジュール依存で失敗するので、parquet-mrでmvnしてください。
また、前述のコマンドの通り打てばよいのですが、指定のモジュールだけではなく依存解決しながらコンパイルしてください

# 4. 実行ファイル作る

jarのパスは適当です

```bash
[xxx@xxx src]$ cat /usr/local/bin/parquet-tools
#!/bin/bash
exec java -jar /usr/local/bin/parquet-tools-1.12.0-SNAPSHOT.jar "$@"
```

# 5. vscodeからparquetを開くと自動でjson変換されます
XCTestで「待つ」ためのサンプルコード集

記事の内容はこちらを参照してください。
https://mishimay.github.io/3ac2bd544c677c4de534/
<!--

 

## 任意の時間まで待つ
任意のタイミングで`expectation.fulfill()`する。

```swift
    let expectation = XCTestExpectation(description: "view hidden")
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        XCTAssertEqual(view.isHidden, true)
        expectation.fulfill()
    }
    XCTWaiter().wait(for: [expectation], timeout: 10)
```

## NSPredicateを使って待つ
```swift
    let predicate = NSPredicate(format: "isHidden == true")
    let expectation = XCTNSPredicateExpectation(predicate: predicate, object: view)
    let result = XCTWaiter().wait(for: [expectation], timeout: 10)
    XCTAssertEqual(result, .completed)
```

## KVOを使って待つ
```swift
    let expectation = XCTKVOExpectation(keyPath: "isHidden", object: view, expectedValue: true)
    let result = XCTWaiter().wait(for: [expectation], timeout: 10)
    XCTAssertEqual(result, .completed)
```

## Notificationを待つ
```swift
    let expectation = XCTNSNotificationExpectation(name: notificationName)
    let result = XCTWaiter().wait(for: [expectation], timeout: 10)
    XCTAssertEqual(result, .completed)
```

## 環境
Swift 5
Xcode 10.2

## 参考
http://masilotti.com/xctest-waiting/


-->
Rustでターミナルのディレクトリ移動を高速化する

@b4b4r07 さんの [enhancd](https://qiita.com/b4b4r07/items/2cf90da00a4c2c7b7e60)というアプリがあります。

ディレクトリ移動を簡単にするものでかれこれもう2年ぐらい使ってる感じ。

大変便利でこれなしの生活は考えられませんでした。でも履歴が溜まってだいぶ遅くなってきた感じ。シェルスクリプトだからかな?もしかしてRustで作り直したらもっと早くなるかも。

と特に考えもなしに同様のアプリを自作してみることにしました。

# で作ったのがこれ

[ジャンプくん](https://github.com/TakaakiFuruse/jump-kun)といいます。

ディレクトリをジャンプするのでジャンプくんです。中小の町工場がつくった製品のようなゆるいネーミングにしました。(わかるくんとかはかるくんとかそんなゆるい名前の商品がありますねぇ)

![demo-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52613/c40a48e9-d05a-e2dd-bb36-7e6236cd96bf.gif)

[lotabout/skim](https://github.com/lotabout/skim)をベースにしています

実行するとディレクトリの一覧が表示されて、fuzzy finderで絞り込めます。
右側にはディレクトリ内をlsした結果が表示されます。
ディレクトリを選択すると移動できます。


# なにをしてるか

1. 現在のディレクトリからルートディレクトリまでにある親ディレクトリを取得
2. 自分より下にある子ディレクトリも取得
3. 以前移動したことのあるディレクトリがあれば履歴から取得
4. Fuzzy finderにまとめて表示
5. 選択したディレクトリをprintする

Rust側から直接ディレクトリ移動させる方法がなかったので

```
function jump-kun-jump(){
    local selected=$(jump-kun)
    if [[ -n $selected ]]; then
        \cd $selected
    fi
}
```

というシェルスクリプトにPrintの内容を受け取らせてCDしています。

まだcrate.ioに登録してないので、レポジトリを直接クローンしてインストールしてください。


# よろしくおねがいします

まだいろいろ治すところもあるのでベータ版です。

筆者のPC(Mint Linux + zsh)では動きました。たぶんLinux、Macでは問題なく動くと思います。
Windowsはよくわかりません(というかそもそもWindows機を持ってない)。
ローカルサーバーにLAN内の外部機器からアクセスする手順についての隠された真実

# 最初に
僕はある日突然、Laptopで立てたPythonの簡易サーバーにスマホからアクセスできないトラブルにぶつかりました。それがあまりにも複雑で長期に渡って僕を苦しめたので、こうして記事にまとめたという次第です。 
隠された真実。(ｷﾘｯ)~~（煽りタイトルやめろ）~~
# 面倒で語られない手順の真実
ぶっちゃけ、外部端末からのアクセスの実現は、巷で紹介されている程度を遥かに越えて**大変に面倒**なものでした。（しかし、あなたは以下の手順に従うだけで済みますね。素晴らしい！）

（ファイアウォールやアンチウィルスを切ってセキュリティホールを作る必要などどこにもなかったんや……（※効果には個人差があります））
## 前提
- [x]  ローカルサーバの設定に問題はない
- [x]  機器とPCが同じLANに接続している
- [x]  あなたはそのルーターの設定に必要なユーザー名とパスワードを知っている。
- [x] 　Windows 10
- [x]   [この親切なサイト](https://qiita.com/nanarya/items/8d01dfb4de434e7b8acc)を見てもうまくいかなかった。

上記の内容についてはここでは説明しません。もしこれらの前提に引っかかるようなら、Google先生に聞いてみましょう。大半はいい手引が見つかるはずです。
そして、[teratailに寄せられたこの回答](https://teratail.com/questions/177019#reply-263418)は今回話す内容をざっくりと説明してくれています（これをもっと早く見つけていれば、あんなに苦しむ羽目にはなかったろうに……）。
当記事は、おおまかに言って、この回答の内容がよくわからない、またはおおよそわかったが解決には至らない、という人たちを対象にしています。以下は上記のteratailの回答をよく読んでから読み進めてください。
## いますぐ試すべきこと
まず、接続しているLANが「プライベート」設定になっているか確認しましょう。
WindowsならタスクバーのWifiアイコンをクリックし、対象のLANの`プロパティ`を開けば目前に当該の設定が現れます。

それでもうまくいかない？

## 
- [x]  ネットワークの共有オプションの、プライベートの設定は`ネットワーク探索を有効にする`が選択されているか？
    1. タスクバーのWifiアイコン(右クリック)
    - `ネットワークとインターネットの設定を開く`
    - `共有オプション`
    - `プライベート`
- [x]  Windows Defenderの`すべての着信接続をブロックします。`の選択が外されているか？
    1. タスクバーのWifiアイコン(右クリック)
    - `ネットワークとインターネットの設定を開く`
    - `Windows ファイアウォール`
    - `プライベート ネットワーク`
- [x]  `このコンピューターのインターネット接続を通しての接続を許可する`にチェックが入っているか？
    1. タスクバーのWifiアイコン(右クリック)
    - `ネットワークとインターネットの設定を開く`
    - `アダプターのオプションを変更する` 
    - `Wi-Fi`(右クリック)　※ただし、有線接続の場合は`ローカルエリア接続`
    - `プロパティ`
    - `共有`タブ

## プライバシーセパレーター機能をオフにする
本題。僕には最後まで気づけなかった原因について。
[プライバシーセパレーター機能ってなに？](http://www.pfu.fujitsu.com/imaging/downloads/manual/cloud_cmn/ix100/jp/installationcloud/topic/ap.html)

この文献に目を通したら、お手持ちのルーターのセットアップをやりなおしましょう。
これはルーターによって設定方法がまちまちなので、各自でしらべてもらうしかありません。
ただし、以下のような傾向が考えられます。
1. ルーターと有線接続しないと設定できない
2. たいていは192.168.0.1で設定できる
3. SSIDに~GW, ~AWなどの、接尾辞らしきwがついている回線にはデフォルトでセパレート機能がオンになっていて、逆にそのwがない回線ではオフになっている場合がある。こうした場合、プリンターとPC両方をwのついていない回線につなぐことで設定変更しなくても解決する。

以上で僕がサーバー接続を実現した手順の紹介を終わります。
他にめぼしい原因があれば教えて下さい。ありがとうございました。

#で、どこがどう「隠された真実」なの？
1. プライバシーセパレーターの設定はググってもなかなか出てこない
2. いわんや、ネットワーク設定からプライバシーセパレーターまで包括的に説明してくれる文献ももちろんなかった
2. みなWindows ファイアウォールやアンチウィルスソフトウェアをオフにせよと口酸っぱく言うがそんな必要などなかったんや……
Railsで「has been removed from the module tree but is still active!」が出た時の対処法

# 例

たぶんこう言うnamespece内に作ったクラスを呼ぶ時にこのエラーが起きてると思う。

```rb
# app/models/some_namespace/your_model.rb

module SomeNamespace
  class YourModel
    ...
    ...
  end
end
```

通常これでRails側がちゃんとロードしてくれるが、developmentで`rails s`した状態で上のようなクラスを呼ぶファイルを更新した時に`reload`が裏で走り、`SomeNamespace::YourModel`が無いよ的なエラーになってしまう。

# 解決方法

色々試してみたが、[「定数読み込み順と名前空間」地獄とrequire_dependency][1]のやり方が一番安定してるっぽい。

```rb
# app/models/some_namespace/your_model.rb

# 最初から自分でつなげておく...
class SomeNamespace::YourModel
  ...
  ...
end

```

## 試した事

1. `SomeNamespace::YourModel`を`::SomeNamespace::YourModel`と変える（頭に**::**を付ける）  
これはこれで動くが全部の箇所で`::`を付けなければいけない
2. development.rbで`config.eager_load = true`（全くの見当違い）

[1]: https://techracho.bpsinc.jp/hachi8833/2018_10_22/63380#1-3-1
GitLab CIで長時間pendingのジョブがfailする

# はじめに
GitLab CIでは長時間pending状態のジョブは強制的にfail扱いになる場合があります。ここではその原因と現時点（GitLab 12.2時点）での対策について書きます。

# 現象
発生する現象としては、下の画面のように長時間pending状態のジョブが実行されることなくfailedとなります。
"Check your timeout limits"などと書かれていますが、実のところジョブのtimeout値は全く関係ありません。

![gitlab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84296/9c78b211-cf14-c5d5-5534-4641a6367c3d.png)

この現象はもう何年も前から何度もIssueが立っており、最新のIssueはこちらです。
https://gitlab.com/gitlab-org/gitlab-ce/issues/37122

当初は「単にtimeoutを増やせばいいんじゃない？」といってあしらわれていたようですが、現在では原因もはっきりしていて、修正する方向にはなっているようです。ただマイルストーンは12.5に設定されているものの、あまり作業は進んでいない感じなのでまだまだ時間がかかるかもしれません。

# 原因
現在のGitLab CIではジョブのpending時間の最大値は1時間で固定になっており、これを超えたジョブはstuck（つまりこのジョブは実行不能）と判定されます。さらにstuck状態のジョブを除去するためのタスクが定期的（デフォルトでは1時間に1回）に実行されており、このタスクがstuck状態のジョブをfailedにしています。
これによって1~2時間pendingするとfailedになる、というわけです。

普通のCI環境（例えばgitlab.comなど）では、runnerの数が十分多ければそれほど長時間pendingすることはないだろう、という想定だと思われます。しかしオンプレ環境で特殊なリソース（例えば特定のDBや専用ハードウェア、高価なライセンスなど）を扱うCIでは、リソース数に応じた少数のrunnerに対し、ジョブをたくさんため込むような運用があり得ます。
そのあたりの環境の違いが、GitLabの人になかなか伝わっていなかったように見えます。

# 対策
現時点で取り得る対策はいくつかあります。それぞれ一長一短あるので状況に合わせて選んでください。

## タスクの時刻変更
stuck状態のジョブを除去するタスクの実行タイミングは設定から変更できます。もし問題のジョブが実行されない時間帯があらかじめわかっているのであれば、その時間を外してやればいいです。
例えば午前0時開始のリグレッションテストなら、その直前に指定するといいでしょう。
gitlab.rbに以下のような項目があるので、コメントを外して時刻を設定します。

```gitlab.rb
# gitlab_rails['stuck_ci_jobs_worker_cron'] = "0 0 * * *"

↓

gitlab_rails['stuck_ci_jobs_worker_cron'] = "0 15 * * *"
```

ちなみにここの時刻はUTCなので、15:00に設定するとJSTで午前0時となります。

## タスクの無効化
もし特定の時間を外すことが出来ないなら、完全に無効化する方法もあります。この場合、CIの設定ミスなどで本当にstuckしているジョブは永遠に残ることになります。（もしかしたら再起動などのタイミングで消えるかもしれませんがよく分かりません）

Admin Area -> Monitoring -> Background Jobs -> Cronで定期実行タスクの一覧が出てくるので、stuck_ci_jobs_workerの「無効にする」ボタンで無効化できます。
また、前述の時刻変更が効いているかどうかはこの画面で確認することができます。

## stuckまでの時間を変える
今の1時間というリミットはソースコードに書かれているので、それを直接変更する方法です。
この場合、GitLabのアップデートで元に戻ってしまうので、その都度修正し直す必要があります。

```/opt/gitlab/embedded/service/gitlab-rails/app/workers/stuck_ci_jobs_worker.rb
BUILD_PENDING_STUCK_TIMEOUT = 1.hour

↓

BUILD_PENDING_STUCK_TIMEOUT = 12.hours
```

これでstuck判定までの時間が12時間になります。