OmniAICreator/Qiita-1.07M huggingface dataset:
CODE VS Rebornのjnlp上でPythonを動かす方法

# 1. はじめに
これはチームラボ株式会社・株式会社リクルートが主催するプログラミング大会である[CODE VS](https://codevs.jp/)の参戦記事です。

# 2. 競技内容

2人対戦型の落ち物パズルゲームのAIを作成し、参加者同士でオンライン対戦を行います。

以下は[ゲームのルール詳細(PDF)](https://static.codevs.jp/reborn/rule.pdf)からの引用です。

> ### ゲームの目的
このゲームは、フィールドの一定の高さまでブロックを積み上げないようにしながら、相手のフィールドをブロックでいっぱいにするゲームです。ブロックは条件を満たすと消えます。消えたときの条件次第では相手に消えないブロックが送られ、妨害できます。うまくブロックを積み上げ消すことで、相手より長く生存することを目指しましょう。
### ゲームの画面
![rule.pdf - Google Chrome 2019_05_27 18_27_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405329/696ae5a3-9fcf-dbe0-96a1-306d649486f9.png)

**対戦動画**
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">NormalAIに100-0したし、オンライン参戦しよう <a href="https://t.co/6DI9TdomCq">pic.twitter.com/6DI9TdomCq</a></p>&mdash; ブロコロン (@burokoron_) <a href="https://twitter.com/burokoron_/status/1119962974481817600?ref_src=twsrc%5Etfw">2019年4月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 3. PythonでCODE VSに参戦する

CODE VSのJavaアプリ上でPythonで上手く実行できなかったので、
その解決方法をここに記述します。

**動作環境**

- Windows 10
- Python3.6 (Anaconda)

最近であれば、おそらくたいていの人はAnacondaを使用してPythonをインストールしていると思います。その場合、PythonはAnacondaの仮想環境上にしか入っていないため、普通にjnlpを起動すると、pythonコマンドが使えずにエラーになります。

Anacondaの仮想環境上でjnlpを起動すれば問題なくpythonコマンドを使用できます。

# 4. AIを作る
[ソースコード](https://github.com/burokoron/CODE_VS_Reborn)はGithubにアップロードしています。

## 4.1. 戦略方針
このゲームに勝つには相手に大量のプロックを送り付けなければいけないわけですが、主な戦略方針として、

- 大連鎖をする
- スキルを使用する

2種類が考えられます。

大連鎖をするには高度な探索技術が必要なので、今回はスキルを使用してブロックを大量生成を狙う通称**ボマー**を選択しました。

## 4.2. 探索
探索は**ビームサーチ**を使用しました。
ビームサーチは基本的には幅優先探索ですが、各階層のノードのうち評価値が上位N個のみ探索を継続し、残りは枝刈りする探索手法です。深くまで探索したいが、探索空間が広いときにしばしば用いられます。ただし、評価関数の精度がとても重要になります。

探索は自分のフィールドだけ探索して、相手のフィールドは完全に無視しました。今回は幅10、深さ4でビームサーチしました。(ビームサーチの意味がない気はしなくはないが、深さ2の全探索よりは強かった。)

さすがに探索できてなさすぎるので、[今日から使えないビット演算（CODE VS Reborn編）](https://qiita.com/TumoiYorozu/items/46fc093d117e167711a4)などを参考に高速化とか頑張りたいですね。(そもそもpythonを使うべきじゃなかったということには目をそらしつつ……)

## 4.3. 評価関数
全探索できないゲーム＆探索量がかなり少ないので評価関数の精度はとても重要です。

評価は以下の要素を考慮しました。上に書かれている要素ほど重要視しました。

- **プラス評価**
  - 数字ブロックを消した(スキルを上昇させるため)
  - 5ブロック(ボム)がある(これがないと何もできない)
  - 数字ブロックがある(スキルを効率良く使用するため)

- **マイナス評価**
  - ブロックの高さが一定値を超えた(ゲームオーバーなので……)
  - 最もブロック積みあがった列と最もブロックが積まれてない列に差がある(事故死を防ぐため)
  - フィールドの任意の3×3の領域において5ブロック(ボム)の数が2個以上ある(スキル使用の効率が落ちるため)
  - 5ブロック(ボム)の周りに数字ブロックがない(スキル使用の効率が落ちるため)
  - 座標(x, y)と座標(x+1, y+2)のような位置関係にある数字ブロックの合計が10(連鎖が起きにくくするため)

## 4.4. スキルの使用

5ブロック(ボム)を爆発させるタイミングは相手がブロックを相殺しなかったら、負けになるブロック量を送り込めるときとしました。ちなみに評価関数の評価値でだいたい送り込めるブロック量がわかったので正確な爆発スコアを計算せずに、評価値でブロック量を推定しました。~~(爆発スコアを計算するのがめんどくさかっただけ)~~

# 5. 結果

最終的な予選結果は48位でした。ゴールデンウイーク前の時点では25～30位くらいをうろうろしてたのですが、ゴールデンウイークでずるずると順位が落ちていき、諸事情によりAIも改良できず……といった感じでした。
CODE VS 5.0では38位だったので、このときより順位を上げたかったのですが、叶いませんでした。もし次回大会があればもっと実力を上げて挑みたいを思います。
Amazon Linux で ansible がdnfを推し始めて困ってます

ネットのスレを見るとansible2.8から dnf 推しになっている模様
回避方法として set_factにてdnfではなくyumを使うように強制せよとの事
えーansible_facts とか使ったことないんだけど。巷にもこの件情報無いし..試してみるか

設定前

```tasks:
   - name: Yum update packages
     yum: name=* state=latest
     become: yes
```

実行結果

```
TASK [Yum update packages] ************************************************************************************************************************************* 
fatal: [xxxxx]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "cmd": "dnf install -y python2-dnf", "msg": "[Errno 2] No such file or directory", "rc": 2}
```

/var/log/secure を見ても確かにdnf 実行してるぽい

```
May 27 08:37:41 ec sudo:   xxx: ... /usr/bin/python ... tmp/ansible-tmp-1558913860.05-16888652605385/AnsiballZ_dnf.py
```

/usr/local/bin/dnf から /usr/bin/yum にリンク、程度の小賢しい手は通用しなかったので...まあ悪手ですしね。
ネットの有識者様が言われるがままPlaybookにset_fact設定を追加してみる

```
 tasks:
   - set_fact:
       ansible_facts:
         pkg_mgr: yum
   - name: Yum update packages
     yum: name=* state=latest
     become: yes
```

実行結果

```
TASK [Yum update packages] *************************************************************************************************************************************
ok: [xxxxx]
```

おおぅ...logでもyum実行するように変更されたぽい

```
May 29 15:21:09 ec sudo:   xxx: ... /usr/bin/python ... tmp/ansible-tmp-1559110868.54-279035084250927/AnsiballZ_yum.py
```
slurmのジョブの名前を長めに表示する

# 概要

投げたジョブの名前が短すぎて、後ろの方まで確認ができないときがある。
ジョブの名前すべてを表示する方法を調べた

ジョブの終了待ちなどで、必要なときがあるかもしれない。

# まとめ


ユーザー名が `hogehoge` が投げたジョブの名前を48文字分表示する。

```
squeue -O name:48 -u hogehoge
```

ヘッダー行がいらないなら

```
squeue -O name:48 -u hogehoge -h
```
チェックボックス、ドロップダウンの操作方法

Javascriptでチェックボックス、ドロップダウンの基本的な扱い方。
（個人的にjQueryを使う事が多かったので、Vanillaでも使えるようとメモします。）

# チェックボックス
## チェックボックスの情報の取得・変更

取得する場合は`<input type="checkbox" />`に対してcheckedプロパティーを使います。
checkedプロパティーは真偽値（Boolean型）で返します。

```html
<label><input type="checkbox" id="checkboxA" value="Blue"></label>
<label><input type="checkbox" id="checkboxB" value="Yellow" checked></label>
```

```javascript
const cb_A      = document.querySelector('#checkboxA');
const checked_A = cb_A.checked;

const cb_B      = document.querySelector('#checkboxB');
const checked_B = cb_B.checked;

console.log('checked_Aの値：', checked_A); // 結果 false
console.log('checked_Bの値：', checked_B); // 結果 true
```

変更する場合はcheckedプロパティーに真偽値を代入します。

```javascript
const cb_A = document.querySelector('#checkboxA');
cb_A.checked = true;  // チェックされた状態になる
```

## チェックボックスの変更を検知

値の変更を検知するには`change`イベントで監視します。

```html
<label><input type="checkbox" id="checkboxA">Check</label>
```

```javascript
const tgtCheckbox = document.getElementById('checkboxA');
tgtCheckbox.addEventListener('change', function(event) {
  const value = event.target.checked;
  console.log(value);
});
```

## ドロップダウンメニューの情報の取得・変更

取得する場合は、対象となるselect要素を参照し、value値を調べます。

```html
<select id="dropdown-menu">
  <option value="eagle">イーグル</option>
  <option value="shark">シャーク</option>
  <option value="panther" selected>パンサー</option>
</select>
```

```javascript
/**
 * select要素の参照
 */
const tgtDropdownMenu = document.querySelector('#dropdown-menu');

/**
 * 値を取得
 */
const value = tgtDropdownMenu.value;

console.log(value);  // 結果 panther
```

変更する場合は`option`で定義されている値を代入します。

```javascript
const tgtDropdownMenu = document.querySelector('#dropdown-menu');
tgtDropdownMenu.value = 'eagle';
```

## ドロップダウンメニューの変更を検知

値の変更を検知するには`change`イベントで監視します。

```html
<select id="dropdown-menu">
  <option value="eagle">イーグル</option>
  <option value="shark">シャーク</option>
  <option value="panther" selected>パンサー</option>
</select>
```

```javascript
const tgtDropdownMenu = document.querySelector('#dropdown-menu');
tgtDropdownMenu.addEventListener('change', function(event) {
  const value = tgtDropdownMenu.value;
  console.log(value);
});
```
Direct Connect GW Multi Account 設定してみました

# Direct Connect GW Multi Account 設定してみました
以前DirectConnect GWの記事を書きましたが
https://qiita.com/asato-san/items/8757fc52bb32530f130e
今回ようやくMulti Account 対応したとの事ですので早速やってみました。

~~**注意:この設定は同一支払いアカウント管理下(同一組織アカウント)同志じゃないと適用できません**
**無関係なアカウントからもProposal は出せるけど関連付けAccept 処理した後以下のエラーが出て接続拒否されますのでご注意を**~~
※2020年にこの制限は無くなりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/964a8796-7f47-d677-82c3-7c14377d1c53.png)

##では早速やってみましょう

1) 接続申請アカウント側VPC管理画面で仮想PrivateGWを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/7f46a8c9-69ca-fdea-3872-b90a6ad56097.png)
**※申請前にDCで利用可能なIPレンジのVPCにアタッチしておきましょう**

2) Direct Connect管理画面にて対象のPrivateGW を選択。“詳細を確認する”を押して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/1145e7c9-2abf-5f05-8bfd-c0f207642afb.png)

"DirectConnect Gateway に関連付ける"を選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/91c952cb-bbf4-a9f1-1e1c-5afdb5776ad1.png)

“別のアカウント”を選択してGateway ID と所有者AWS アカウント名を記載して “関連付け”
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/5f407b30-ebac-95ee-2c74-587eb657621c.png)


3) 承認待ちのキューに入ったことを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/138dd732-c529-2d74-3fad-e59f4fe83766.png)


##ここからは接続許可する側の設定です

Direct Connect管理画面にてDirectConnectGatewaysの画面に関連付けproposal が来ているので

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223740/0ce5e0b2-538d-2f32-e203-420b82d0e534.png)

対象仮想PrivateGWを選択して “Accept” 
以上で別アカウントでのDirectConnectが利用可能となります。

ちなみにrejectすると申請者側の申請キューもそっと消えてなくなりますｗ
Vue-Tables2とScrollBoosterを組み合わせてみる


# 概要

Vue.jsを使って、テーブルタグからデータ明細を見せるようなWebアプリケーションをサクッと実装。
ダッシュボード的なアプリなどでデータを見せる際に便利ではないでしょうか。
タイトルにあるライブラリを使う際の注意点やノウハウを展開します。

### ライブラリの紹介

- ScrollBooster
 - https://ilyashubin.github.io/scrollbooster/
 - 【Github】 https://github.com/ilyashubin/scrollbooster
 - マウスのドラッグスクロールを実現するライブラリ
 - スマホのような、任意スクロールが簡単にできる。どんな動きなのかはリンク先を参照
- Vue-Tables2
 - https://github.com/matfish2/vue-tables-2
 - テーブルにソート・ページネーション・フィルタなどの機能を簡単に足せるライブラリ
 - データ部はjsonで扱える。
 - 動きのイメージはこちらの記事が詳しい https://www.kimullaa.com/entry/2018/05/08/171340

## ポイント

- ScrollBoosterに渡すviewportとcontent
 - $refsから取得するのが楽
 - サンプルコードでは、Vue-Tables2が自動付与するtable-responsiveのclass名を使ってみた
- updateMetrics()の呼び出し
 - Vue-Tables2にデータが入るとテーブルの幅部分のwidthが変わってしまうので、更新する必要がある
 - その際に使用するのがScrollBooster.updateMetrics()
 - Vue-Tables2が提供するイベント関数を使って、幅の更新をする
  - 設定したのは「ソート(sorted)」「ページネーション(pagenation)」「件数変更(limit)」
  - 「フィルタリング(filter)」でも幅変更があり得るが、幅が伸びる事は無いと思ったので設定してない
- $nextTickの使用
 - 幅を更新する際、実DOMの更新がされてからでないと幅計算が正しくならないと思われるので、Vueの提供する$nextTickを使っている

## サンプルコード

```HTML:html
<div ref="table">
  <v-client-table :columns="vueTables.columns" :data="vueTables.data" :options="vueTables.options"
    @sorted="updateScrollBooster" @pagination="updateScrollBooster"
    @limit="updateScrollBooster">
  </v-client-table>
</div>
```

```JavaScript:script
// 一部、ここに書いてない定数があるのでそのままは使えない。注意
    new Vue({
      el: '#app',
      data: {
        // vue-tables-2用定義
        vueTables: {
          columns: [
            'acceptDate',
            'validStartDate',
            'validEndDate',
            'productName',
          ],
          data: [],
          options: {
            headings: VUE_TABLES_HEADINGS,
            sortable: [
              'acceptDate', 'validStartDate', 'validEndDate', 'productName',
            ],
            orderBy: { column: 'acceptDate' },
            skin: 'table-striped table-bordered table-hover table-sm',
            texts: VUE_TABLES_TEXTS,
            perPage: 50,
            perPageValues: [50, 100, 500, 1000],
            sortIcon: VUE_TABLES_SORTICON
          },
        },
        scrollBoosterNormal: null,
      },
      mounted() {
        // ScrollBoosterを設定
        let viewport = this.$refs.table.querySelector('.table-responsive');
        let content = viewport.querySelector('table');
        this.scrollBooster = setScrollBooster(viewport, content);
      },
      methods: {
        updateScrollBooster() {
          // ScrollBoosterのviewport幅を更新する(検索結果に合わせて)
          this.$nextTick(function () {
            // nextTickでDOMの幅が確定した状態でupdateMetricsを実行する
            this.scrollBooster.updateMetrics();
          });
        },
      },
    })
```

## 補足

Vue-Tables2で横スクロールを有効にするために、実際にはCSS定義も行ってある(overflow-x: scroll)
postgresqlのバージョンアップ

postgresqlのバージョンアップができたので、メモ。

Homebrewでインストールされていたっぽいので、それを確認。

```.rb
 $ brew list

autoconf	icu4c		openssl		rbenv		yarn
heroku		node		pkg-config	readline
heroku-node	nodebrew	postgresql	ruby-build
```

私のhomebrewにはこれらがインストールされていました。。。

```.rb
$ brew upgrade postgresql
```

`upgrade`の後ろにパッケージの名前で、そのパッケージをグレードアップできました。


（まだpostgresql使用時にdb:createできないのかわかっていない）
Goでforとselectを抜ける方法

既に似たような記事もありますが、備忘録ように記載しておきます。

for selectでbreakとしても抜け出せないので、下記のようにgotoを使用すると抜け出せます。


```Golang:main.go

package main

import (
	"fmt"
	"time"
)

func main() {

	i := 0
	ticker := time.NewTicker(1 * time.Second)
	defer ticker.Stop()

	for {
		select {
		case <-ticker.C:
			fmt.Printf("COUNT : %d\n", i)
			if i == 5 {
				goto GOTO_FINISH
			}
			i++
		}
	}

GOTO_FINISH:
	fmt.Println("GOTO_FINISH")
}
```
Unityでただ大きい画像をスクロールして見るのを作る

![scrolls無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310991/330131ef-18d4-291e-0456-020c5e630d17.png)

scrollviewのcontentに画像を張る

ScrollRectのMovementTypeをclampedなりにする

contentの中身は作らない

以上！
railsでコメント機能を作ろう

#コメント機能の実装#

投稿データ => `Image model`
コメント => `Comment model`

投稿フォームは投稿一覧に作成する（images#show）


##Model作成##

```
$ rails g model Comment content:string image:references
```

- `content` => コメント格納用
- `image`   => imageモデルと関連付けるため

**(models/comment.rb)**

```rb
belongs_to :image
validates :content, presence: true
```

- `belongs_to` => imageモデルに属している(自動記入)
- `precense: true ` => 空白を不可とする

**(models/image.rb)**

```rb
has_many :comments, dependent: :destoroy
```

- `has_many` => たくさんのコメントを持つことができる（１対多）
- `dependent: :destroy` => **image**が削除されたら**comments**も削除される

##Routes設定##

```rb
resources :images do 
  resouces :comments, only: [:create, :destroy]
end 
```

**生成されるURL**
 create   =>`/images/:image_id/comments`
 destroy =>`/images/:image_id/comment/:id `

- `image_id`をControllerで活用
- どの投稿の、どのコメントかを判別する必要がるためこのようになる

##Controller作成##

```
$ rails g controller comments create destroy
```

- `create`と`destroy`の機能を指定する(Viewは削除)

```rb

private
  def content_params
    params.require(:comment).permit(:content)
  end 
```

- ストロングパラメーターを設定する


```rb
def create
  image = Image.find(params[:image_id])
  @comment = image.comments.build(comment_params)
  if @comment.save
    flash[:success] = "コメントしました"
    redirect_back(fallback_location: image_url(image.id))
  else
    flash[:danger] = "コメントできません"
    redirect_back(fallback_location: image_url(image.id))
  end 
end 
```

- `params[:image_id]` => URLから取得する（ルーティングで設定）
- `redirect_back(fallback_location: image_url(image.id))` => 直前のURLにリダイレクト(showで投稿しshowに戻る)


```rb

def destroy
  image = Image.find(params[:image_id])
  @comment = image.comments.find(params[:id])
  @comment.destroy
  redirect_back(fallback_location: image_path(image)
end 
```

- `image.comments.find(params[:id])` => 取得した**image**のコメントを**:id**で探す


##View作成##

**投稿フォーム**

```erb
<%= form_with(model: [@image, @comment], local: true) do |f| %>
  <%= f.text_field :content %>
  <%= f.submit "コメントする", class: "btn btn-primary" %>
<% end %>
```

- `model: [@image, @comment]` => **comment**が**image**に紐づいているモデルのため、配列にして記載する必要がある

```rb
#ImageControllerで定義
def show
  @image = Image.find(params[:id])
  @comment = @image.comments.build
end
```

**削除ボタン**

```erb
<% link_to "DELETE", image_comment_path(image_id: @image, id: comment.id), method: :delete %>
```

- `image_comment_path` => 必要な引数を記載
(/images/:image_id/comment/:id)
[Django]ModuleNotFoundError: No module named 'mysite.settings'の対処法

# 環境
* Django 2.1
* CentOS 7
* Python 3.6
* Apache 2.4
* mod_wsgi 4.6.5

# 問題

下記の記事に沿って設定したのですが、エラー```ModuleNotFoundError: No module named 'mysite.settings'```が発生し、私の場合は上手くいきませんでした。
[参考]https://qiita.com/dekosuke-menti/items/e416f198980c0fd6e75b

# 解決方法
/var/www/mysite/mysite/settings.py（mysiteは各自プロジェクト名に読み替えてください）の名前を適当な名前にリネームすると上手くいきました。

settingsという名前が他のモジュールと被っていたと考えています。
被らない様な名前にリネームしてみてください。
Optionalの比較

# オプショナルの比較

## オプショナルの値の比較

 オプショナル変数を比較する場合、unwarpする必要がある

```
 var i: Int?
 if let i = i {
	if i == 0 {
		print("0")
	} else {
		print("0ではない")
	}
 } else {
	print("nil")
 }
```

 もちろんすべてのケースでそれぞれ処理する必要があるなら別だが、１以上の場合のみラベルを表示するとかになると
 `let isHidden = i > 0 `
 だけで良い


## 比較２

 String?の.countやisEmpty の場合

こちらも基本同じです。

```
func hoge2(_ val: String?) {
	if val?.count == 0 {
		print("0文字です")
	}
	if val?.isEmpty == true {
		print("0文字です2")
	}
	if varl?.isEmpty == false {
		print("0文字じゃないかnilです")
	}
}
hoge2("1")
print("^^^^ \"1\"の結果 ^^^^")
hoge2("")
print("^^^^ \"\"の結果 ^^^^")
hoge2(nil)
print("^^^^ nilの結果 ^^^^")
```

結果

```
文字列がある =  1
^^^^ "1"の結果 ^^^^
0文字です
0文字です2
^^^^ ""の結果 ^^^^
^^^^ nilの結果 ^^^^
```
GitHub上でインデントが不格好にならないように、VSCodeのTabインデントを設定する

# はじめに

VSCode上では、下記のように同じ見え方ではあるが、GitHubに上げると、インデントの見栄えが随分と変わってしまう例があります。

・VSCodeで表示（Tab埋め）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/eba73eed-6471-74b6-213a-848ff751fcbc.png)

・VSCodeで表示（半角スペース埋め）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/a7d6a737-5a46-4207-1a83-1ea556aabc35.png)

・GitHubで表示（Tab埋め）  少し不格好ですね・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/3c6bf44a-0692-ae8e-7036-41855e9ef454.png)

・GitHubで表示（半角スペース埋め）　スマートです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/de05d3ae-9829-869b-e92e-b83727d19c1f.png)

# VSCodeの設定

問題になるのは、**Editor:Detect Indentation**の設定です。
ファイル－基本設定－設定から表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/1c616eb4-e8f6-48b2-07f4-966fedce7011.png)
VSCodeで、Tabを押した時に、インデントを、**半角スペース**埋めにするか、**Tab**埋めにするかの設定をここで行います。見栄えをよくするために、チェックを外しておきましょう。

| チェックを付ける   |    チェックを外す  |
|:-----------------|------------------:|
|     Tab埋め　    |   半角スペース埋め |
monaca demoでkintoneのREST APIを実行してデバッグできるようにする

CORSの制約でlocalhostからだとkintoneのREST APIを叩けません。でも、CORSを無視するGoogle Chromeのオプションをつけて起動すれば、なんとkintoneのREST APIが叩けます!

# 環境

macOS Mojave バージョン 10.14.3
Google Chrome バージョン 74.0.3729.169

# 方法

Google Chromeを全て閉じてから、以下のコマンドでGoogle Chromeを開きます。

```bash
open http://localhost:8000/ -a "/Applications/Google Chrome.app" --args --disable-web-security --user-data-dir
```

あとは`http://127.0.0.1:8000/monaca-demo/`にアクセスするとWebでデバッグができます。(もちろん`monaca demo`コマンドの実行が必要です)

# 参考

https://qiita.com/mottox2/items/498bb31d67caa2d8a71f
システム開発の工数に調査は含めないのか?

#### システム開発の工程

システム開発をしていて、

|工程|割合|
|:-----------|:------------|
|基本設計|30%|
|詳細設計|30%|
|プログラミング工程|30%|
|テスト|10%|

という工程を耳にすることが多い。
cf.http://www.newspt.co.jp/contents/manual/yes/2_mi/3a02_1.html

#### Excel方眼紙の落書きが設計だっていわれても

ウォーターフォールを標榜している開発現場では、この基本設計がExcel方眼紙とほぼ一致しているというのが悩ましいところだ。
これまでざっくり25くらいのシステム開発をしてきた。

|方式|累積|件数|
|:-----------|:------------|:------------|
|アジャイル|●●●●〇●●●●〇●●●●〇|15|
|調査|●●●|3|
|テスト駆動|●|1|
|ウォーターフォール(Excel)|●●●|3|
|ウォーターフォール(md,doc+Excel)|●●●|3|

意図的にアジャイル開発を選んでいるので、アジャイル開発の比重は高い。

システムとしては、Database(各種SQL)とView(html, Xaml, JavaScript, css, etc.)、コントロール部分(C#)という構成。WPF, ASP.NETとか。

#### CodeFirstでコードからすべて作る

わたしがアジャイル開発をする場合、CodeFirstでModelのクラスを作り、その作業自体がテーブル設計を兼ねている。
Modelを作るとその瞬間に動作するDatabaseのテーブルとテーブル定義書とER図(クラス図)を手にすることができる。Model2TableDefinitionは自作ずみで、ER図(クラス図)はVisual Studioにその機能がある。
Modelを変更すると、ER図(クラス図)、Databaseのテーブル、テーブル定義書はほぼ手間なく連動するので、これらのドキュメントはほぼ常に最新の状態に苦もなく保てる。

#### やっぱりExcel方眼紙を理解できない

この方法に慣れていると、ウォーターフォールでExcel方眼紙を使ってテーブル定義書とER図(クラス図)を書くことを「設計」と呼ぶ考え方を理解できない。
Excel方眼紙の結合セルにコピー&ペーストを駆使して書いたテーブル定義書は、そのままではコードに流用しにくく、しばしばtypoがあり、Databaseのtypeにミスがあり、すんなり動かすことはできない。そもそも動かすためのコードへの置き換えのところで相当な試行錯誤が必要なことがある。2度手間なのである。

#### CodeFirstなら常に動く

CodeFirstではtypoはあるかもしれないが、typeのミスは開発環境が防いでくれるので発生しない。
さらにコーディングでテーブルを修正した場合、コードとExcel方眼紙のテーブル定義書を2重に保守し続ける必要があり、しばしば途中でバージョン管理できなくなり、メンバーとの間で深刻な精神的な対立を引き起こす。

#### Excel職人

クラス図をExcelで描くのはほとんど職人芸で、見とれるが、同様にそのままではコードに流用しにくく、しばしばtypoがあり、typeにミスがある。そもそも職人芸なので、作った本人以外は保守できない。共有していても同時に複数人の編集は不可能ではないがまずしないし、パーミッションによってはExcelファイルが消失するというバグもある。
cf. https://support.microsoft.com/ja-jp/help/271513/troubleshoot-problems-when-you-save-excel-workbooks
cf. https://hebikuzure.wordpress.com/2009/04/12/サーバー上の共有フォルダで-excel-ファイルを上書き/

実際にこのトラブルには、Windows7 + Excel2013で2019年1月ごろに遭遇した。
こんなシステムは使えないよと真実思った。

#### 感覚的な工数割合

それはまあそれとして、いちばん違うと感じるのは、工程の割合だ。

|工程|割合|
|:-----------|:------------|
|調査・試作|50%|
|アジャイルプログラミング|10%|
|デバッグ|20%|
|テスト|10%|
|設計書作成|10%|

というのが感覚的なイメージ。調査ももちろんプログラミング要素を含むので、プログラミングしているのが60%くらいある。
あとはそもそも調査とデバッグという重要な工程が工程にないことに、認識の差を感じる。

#### 調査を工数に含めるか

そもそもわからないことを調べる調査にはきりがなくて時間もかかる。それをぜんたいのなかにイメージできていないとしたら、いったいいつ調査するのだろうか。
調査なしでできるということは、すべて既知の範囲で作るということか。それっておもしろいのだろうか?
デバッグはコーディング以上に重要だけれど、それを工程にしていないのはどういう理由なのか。
さっぱりわからない。

#### 「未定」「調査中」「検討中」ばかりの設計書

調査firstで、アジャイル開発する場合、ドキュメントを作るのは最後の工程になる。最後の最後とは言わないまでも、ある程度システム全体を把握した最後だ。
この場合、ドキュメントを作るのは、わかっていることを書くだけでよいので、スムーズに進む。
初期に穴だらけの設計書を書いて保守し続けるのに較べて、ずっと容易だ。そもそも「未定」「調査中」「検討中」ばかりの設計書なんて、単なるたたき台にすぎないと思うのである。それをほしがる気持ちがわからない。
オフラインUbuntuで機械学習やKaggle用環境構築(Docker)

オフライン環境で辛い中、頑張ってUbuntuの環境構築をしましょうシリーズの続き。今回はdockerで機械学習用の基礎環境を構築する。

前回はこちら（オフライン環境でapt install：Dockerをインストール)
https://qiita.com/tetrar124/items/40fd9b1ff5f0b015a6da

各ステップ
1. オンライン環境でビルドして必要なパッケージを追加したkaggleイメージを作成
2. イメージをアーカイブ化後、オフライン環境へコピー
3. docker-compseで必要な設定を追加して完成

#####※注意点
######kaggle-pythonコンテナは現時点でGPU非対応。
(記事を書いてから気が付きましたゴメンサイ）
https://github.com/Kaggle/docker-python
GPUを使う際はtensorflowコンテナなど、別なコンテナを選ぶ必要がある。

####1. オンライン環境でkaggleコンテナに必要なパッケージを追加

下記のDockerfileを作成する。

Dockerfile

```
# kaggleのpythonコンテナを使用
FROM gcr.io/kaggle-images/python:latest
# パッケージの追加
RUN pip install -U pip && \
    pip install fastprogress japanize-matplotlib
```
今回はオフライン環境なのでlatestに指定したが、オンラインの場合はバージョンを指定するのが好ましい。
バージョンは下記サイトで調査可能（2019/5/29現在はv56が最新）。

Google container Registryのkaggle pythonレポジトリ
https://console.cloud.google.com/gcr/images/kaggle-images/GLOBAL/python

このDockerfileを用いてビルドし、local/kaggleイメージを作成する。Dockerfileのあるフォルダで下記を実行。

```
$ sudo docker build  ./ -t local/kaggle
```

####2. 作成したイメージをアーカイブ化後、オフライン環境へコピー

```
$ sudo docker save local/kaggle > kaggle.tar
```
kaggle.tarファイル（15G!）をオフライン環境へ頑張ってコピーする。
（NIC二枚刺しにしてオフライン装置へ接続、scpが楽）

オフラインUbuntuのコピーしたファイルのあるフォルダで下記を実行し、イメージをロードする。

```
$ sudo docker load < kaggle.tar
```

####3. docker-compseで必要な設定を追加して完成
Dockerfile

```
FROM local/kaggle
```
docker-compose.yaml

```
version: "2"
services:
  jupyter:
    build: .
    volumes:
      - ~/tmp:/tmp/working
    working_dir: /tmp/working
    ports:
      - 1234:8888
    command: jupyter notebook --ip=0.0.0.0 --allow-root --no-browser --NotebookApp.token=''
```
※ Ubuntuのdocker-composeはvesion: "2" にしないとエラーが出る

- portsの項目は、コンテナのポート8888をlocalhostの1234に転送する設定。
- volumesの `- ~/tmp:/tmp/working` は、Dockerのホストマシン（今回はオフライン環境Ubuntu）の~/tmpフォルダをコンテナの/tmp/workingとして共有する設定。今回は~/tmpファイルのセーブ先、必要なファイルを入れる共有フォルダとして使用する。
- ローカルネットを想定しているため`--NotebookApp.token=''`のオプションで認証を回避した。

下記コマンドでコンテナが起動する。

```
$ docker-compose up build
```

ブラウザに `localhost:1234`と入れる事でJupyter notebookにアクセスできる。

ネットワーク内の場合は、ブラウザに
dockerを動かすホストマシンIPのアドレス:1234
と入れる事でリモートアクセスできる。

※事前にdockerを動かすマシンを下記コマンドでポート開放すること。
(fromオプションでローカルのみにした方が安全)

```
$ sudo ufw allow from 192.168.0.0/24 to any port 1234
```

####参考
https://amalog.hateblo.jp/entry/data-analysis-docker
AWSのAIサービスを使ってAWS DeepRacerのラップタイム計測システムを作ってみた

# はじめに

当社で製作するAWS DeepRacerコースを使って実走レースを開催する予定があるため、ラップタイムを計測する仕組みをAWSのAIサービスを利用して作ってみました。

# ラップタイムの計測方法

動画を分析してオブジェクト（車）の検出ができるAmazon Rekognition Videoを利用してラップタイム計測が出来るかも。と思っていたのですが、現時点では顔以外のオブジェクトの検出は動画ファイルのみ対応しており、動画ストリーミングは対応されていないようでした。

AWS メディアサービスを利用して取り込んだ映像を動画ファイルとしてS3に生成することはできるのですが、タイムラグがあるのでストリームデータによるリアルタイム分析の方がレースの臨場感もあり良さそうです。
そこで、顔の検出ができるように車体に顔写真を貼って走行させることを思いつきました！

# 用意する機材

* Apple MacBook Air
 * Amazon Kinesis Video プロデューサライブラリ（C++）をインストール
* Webカメラ

# システム構成
![arch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/fa475660-71d3-8525-bbc3-aaa766d5faa5.png)

ポイント

* ゴール地点のカメラにAWS DeepRacer（顔写真付き）が写ると、動画ストリームから顔情報を検出し前回の検出の時刻の差分からラップタイムを算出します。
* Rekognition Videoで検出した顔の信頼スコア（％）は重要では無いので（誰の顔でも検出できればよい）、ベースとなるフェイスコレクションの顔画像は１つだけ登録しました。ゴール付近に寝そべったり、仰向けのままトラックを徘徊する人物がいない限り、AWS DeepRacer（顔写真付き）がゴールしたことになります。
* リアルタイム性を重視して、画面上にすぐラップタイムが自動反映されるようにAWS IoTを使いました。
* ラップタイムの履歴保存と参加者のニックネーム表示のためにDynamoDBを使いました。


# 試してみた
AWS DeepRacerはまだ発売されていないので、電池で走るミニカーで試してみました。
うまく顔を認識してラップタイムもブラウザに1〜2秒後に表示されました（右下：ラップタイムとニックネーム）。ミニカーの速度は20〜30cm/秒くらいです。
※PCに写っている映像はこの写真を記録するため、一時停止した状態にしています

![testrun.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426326/102ed28a-1cb1-b055-f450-613e6f95f41c.jpeg)

# まとめ
[シンガポールSummitで参加したAWS DeepRacer League](https://aws.amazon.com/jp/deepracer/schedule-and-standings/leaderboard-singapore-summit/)（結果は17位でした）では、実際のAWS DeepRacerはミニカーよりも速いスピードが出ていたので、きちんと計測ができるかわかりませんが、走行できる日が楽しみです。
また、作った後でSageMakerが物体検出アルゴリズムをサポートしていることを知ったので、今度はSageMakerでラップタイムを計測できるか試してみたいと思います。

最後にこのシステムを作るにあたり、以下のサイトを参考にさせていただきました。
ありがとうございました。

[Amazon Kinesis Video Streamsを使ってストリーム映像をAWS上に流してみる【MacBook Pro】– ClassmethodサーバーレスAdvent Calendar 2017 #serverless #adventcalendar #reinvent](https://dev.classmethod.jp/cloud/aws/mac-kinesis-video-stream-getting-started/)

[[AWS IoT] MQTTを使用して、Lambdaからブラウザを更新する方法〜aws-iot-device-sdk(aws-iot-sdk-browser-bundle.js)を使用する場合〜](https://dev.classmethod.jp/cloud/aws/aws-iot-browser-refresh/)
ここ三ヶ月で勉強したことメモ

とにかく色々

+ Linux操作
+ MySQL
+ nginx
+ AWS
+ PHP
+ CodeIgniter
+ Github
+ kubernetes
+ YAML

さてここから仕事で重点的にやっていくべきは

+ Linux操作
+ MySQL
+ nginx
+ AWS
+ PHP
+ CodeIgniter
+ Github
+ kubernetes
+ YAML

あれ…全部だ…
Goのパッケージ開発者が関数などのDeprecated(非推奨)を利用者に伝える & 利用者が検知する方法

こんにちはpo3rinです。今回の記事は僕のような初心者向けですが、Goのパッケージを開発して公開している方達は特に必見です。

## Deprecated(非推奨)を利用者に伝える

全てはGoのwikiに書いてありますが、 Deprecated を利用者に伝える方法はコメントで```Deprecated:```と記述することです。https://github.com/golang/go/wiki/Deprecated

こんな感じです。

```go
// Deprecated: should not be used
func Add(a, b int) int {
	return a + b	
}
```

例えば olivere/elastic (GoでElasticsearchを扱うパッケージ) では下記のように書かれています。

```go
// SetMaxRetries sets the maximum number of retries before giving up when
// performing a HTTP request to Elasticsearch.
//
// Deprecated: Replace with a Retry implementation.
func SetMaxRetries(maxRetries int) ClientOptionFunc
```

```Deprecated:``` の後には非推奨の理由や、代わりに何を使えば良いかなどを記載すると良いでしょう。

## Deprecated(非推奨)を検知する

Go の 公式のlintツールでは教えてくれないので、静的解析ツールや他のりんとツールを使うと良いでしょう。例えば https://github.com/dominikh/go-tools の静的解析ツールセットを使うと下記のように利用パッケージの非推奨を検知できます。

```bash
$ staticcheck ./...
file/path:132:3: elastic.SetMaxRetries is deprecated: Replace with a Retry implementation.  (SA1019)
```

## まとめ

使っている全てのパッケージの更新を追うのは辛いので、パッケージの利用者は静的解析ツールで非推奨な機能に気づけるようにしておきましょう。パッケージの開発者の方は非推奨機能を置いておく場合は、利用者が非推奨に気づけるように```Deprecated:```は付けておきましょう。
pybindで no module named hogehoge と怒られたときの対処法

###pybind11で no module named hogehoge と怒られる


ディレクトリのCmakeFiles, pycache, CmakeCacheを削除したあとに
CmakeLists.txtの中に
```
set(PYBIND11_PYTHON_VERSION 3.5 CACHE STRING "")
```
といったように自分のpythonのverを指定すれば怒られなくなった.
tar コマンドで圧縮・解凍　まとめ

## 圧縮してアーカイブ

```
$ tar -cvzf tgzファイル名 圧縮対象ディレクトリ

tar -cvzf  httpd_0409.tar.gz  /etc/http
```


## 解凍して展開

```
$ tar -xvzf tgzファイル名

tar -xvzf  httpd_0409.tar.gz
```

`オプション `

-c
新しくアーカイブファイルを作成する。たぶんcreateの意味
-f
アーカイブファイル名をパラメータで指定する。これを指定しないと標準入力 または標準出力が使われる
-t
アーカイブファイルに含まれるファイルの一覧を表示する。たぶんlistの意味
-v
処理の進行しているファイル名を表示する。 -t と併用の場合はタイムスタンプやファイルサイズなども表示する。
-x
アーカイブファイルを展開する。たぶんextractの意味
-z
gzipで圧縮または展開を同時に行う
-z を使う場合は、アーカイブファイルの拡張子として .tar.gz または .tgz がよく使われる。
ポート番号の確認&解除

使用中のポート番号の確認と、解除の仕方をまとめます。

# 環境
MacOS Mojave

# 使用中のポート番号の確認
例：8080ポートの使用状況を確認したい場合、下記をターミナルに入力

```
mbp:~ mac$ lsof -i:8080
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
stackman 1087  mac   16u  IPv4 0x2fbea4e1fe9b9e7d      0t0  TCP localhost:http-alt (LISTEN)
```

`stackman`が8080ポートを使用しているのが確認できる。

# ポートの解除

上記`stackman`の接続を解除したい場合、下記を入力

```
mbp:~ mac$ kill 1087
```

# 参照元
[Macで使用しているポートを調べる方法とポートを使用しているプログラム確認方法](https://do-zan.com/mac-search-using-port/)
RailsのService層のクラスをauto_loadpathに含める

## 環境

* Ruby 2.4.2
* Rails 5.1.4

## やりたいこと

```
app
- services/
- neko.rb
- - utils/
- - - hoge.rb
- - users/
- - - test.rb
```

みたいな`serivces`ディレクトリ構成があるとして、全てのディレクトリ内のファイルをオートロードパスに含めたいが、デフォルトでは出来ないので、その方法について記載します。
> デフォルトでは、`services`ディレクトリの直下のみがオートロードパスの対象となっています。

## services.rbを編集

`config/initializers`ディレクトリ内に`serices.rb`を作成します（自分の環境にはありませんでした）。

`services.rb`を以下のようにします。
```rb
Dir.glob("app/services/**/*.rb") do |file|
  require_dependency Rails.root.join(file)
end
```

これで全てのファイルが対象となっているかと思います。
JavaScriptのfilterをdiscord.jsで使ってみたメモ

こんにちは、ほぼ毎日discord.jsでbot作ってる人です。(?)
#前置き
今回は、discord.jsでJavaScriptのfilterを使ってみたのを記事にしてます
(説明が下手なのは許してください)
(まだ無知なことがいっぱい)
discord.js: https://discord.js.org/
Collection: https://discord.js.org/#/docs/main/stable/class/Collection

#使い方
テキストチャンネルだけの数

```javascript
const textChannels = message.guild.channels.filter(t => t.type == "text").size
message.channel.send(textChannels);
```
これでテキストチャンネルのみの数が表示されます。
説明すると
`message.guild.channels.filter`
(メッセージが送信されたギルドのチャンネルをフィルターする)
[以下略].filter.`(t => t.type == 'text')`
(`t`は`message.guild.channels`の省略版です(多分))
(`t.type == 'text'`はチャンネルのタイプです。)
`'text'`に入るのは、https://discord.js.org/#/docs/main/stable/class/Channel?scrollTo=type をご覧下さい。

追記
`.size`は○○の数です。

説明はこれで終わりです
#終わりに
他にもfindとかあるのでいつかだそうかなと思ってます。
【Haml】条件（if）に応じてClassを変更させる方法

例えば、Eventというモデルの編集ページにおいて、編集不可の要素に対して付与する`is-disabled`というクラスを用意したとします。

```
.event-panel.is-disabled
```


Eventがeditable?でないときのみ`is-disabled`を付与する場合は以下のように書きます。

```
- event = @event
.event-panel{class:('is-disabled' unless event.editable?)}
```
ImmerでRedux周りをスッキリさせたい

##  前提
	- react,reduxでフロント開発中
	- 「Immerjs便利」とすすめられる
	- 「そもそもイミュータブルってなんだ？」

使うライブラリ：[GitHub - immerjs/immer: Create the next immutable state by mutating the current one](https://github.com/immerjs/immer)

## そもそもイミュータブルとは

- 「イミュータブル（immutable）」
	- 不変、変わらない
- プログラミングにおいて「イミュータブル」とは？
	- オブジェクトの状態が変更されないこと
	- redux等はイミュータブルを実現してる

[簡単なサンプルコード：codepen](https://codepen.io/h__kato/pen/qGMbGg?editors=1111)

```js
const array = {
  test1: '国語',
  test2: '理科',
  test3: '算数',
}

console.log({array});

// ミュータブル
// arrayの値が変わってしまう
array['test1'] = '英語';
console.log({array});

// イミュータブル
// arrayの値は変えず、新しいオブジェクトを生成する
const array2 = {...array, test1:'英語'};
console.log({array2});
```

- いいところ
	- 参考：[Immutableとはなんぞや？なにが嬉しいの？ - Panda Noir](https://www.pandanoir.info/entry/2015/10/18/191106)
		- オブジェクトが変更されないので、予測が付きやすい
		- 新しいオブジェクトを生成するとき、差分のみ保持して、あとは元のオブジェクトを参照するので省メモリ
		
## Immerjs導入

- 導入にあたって
	- 上述のイミュータブルのいいところは既にReduxがやってくれてる
	- 期待するのは、記述の簡素化
		- スプレッド演算子があんまり好きじゃない
			-  `newState={...state, todo1: 'マヨネーズ買う'}`
			-  一回くらいならいいけど、reducerは`...state`ばっかになる。コード見づらい
		- オブジェクトの階層が深くなると分かりづらくなる

### サンプルコード

[GitHub - immerjs/immer:](https://github.com/immerjs/immer)より引用です。

#### ↓　Reduxデフォの書き方

```js
// Redux reducer
// Shortened, based on: https://github.com/reactjs/redux/blob/master/examples/shopping-cart/src/reducers/products.js
const byId = (state, action) => {
    switch (action.type) {
        case RECEIVE_PRODUCTS:
            return {
                ...state,
                ...action.products.reduce((obj, product) => {
                    obj[product.id] = product
                    return obj
                }, {})
            }
        default:
            return state
    }
}
```

#### ↓　immerjs使った場合

```js
import produce from "immer"

const byId = (state, action) =>
    produce(state, draft => {
        switch (action.type) {
            case RECEIVE_PRODUCTS:
                action.products.forEach(product => {
                    draft[product.id] = product
                })
        }
    })
```

## 導入した感想

- reducerがスッキリした
	- スプレッド演算子なくって万歳
- draftという単語に慣れない
	- 別の命名も思いつかない
	- 慣れの問題だと思うので使い続ける
- 次は[immerjs/use-immer](https://github.com/immerjs/use-immer)も使ってみる
	- `useState`だと`prevState`を取得するのに`useEffect`使わなきゃいかんが、これなら楽そう
		- 参考：[useEffect の中で以前の state を取得する方法 - Qiita](https://qiita.com/seya/items/6fd68b5410a471eac3c4)
DialogFragmentでProgress Dialogを作った

# デモ

![progress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9875/3cb9ecee-acfc-3134-3f30-18f1344fa851.gif)

# ソースコード

- Github: [k-yamada/material-progress-dialog](https://github.com/k-yamada/material-progress-dialog)
  - [ProgressDialogFragment.kt](https://github.com/k-yamada/material-progress-dialog/blob/master/app/src/main/java/com/kyamada/material_progress_dialog/ProgressDialogFragment.kt)

ライブラリ化はしていないので、使う場合はコピペしてください。

# 使い方

```MainActivity.kt
class MainActivity : AppCompatActivity() {

    companion object {
        const val TAG_PROGRESS_DIALOG = "progress"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_show_dialog.setOnClickListener {
            showProgressDialog()
        }
    }

    private fun showProgressDialog() {
        val dialog = ProgressDialogFragment.newInstance()
        dialog.show(supportFragmentManager, TAG_PROGRESS_DIALOG)
        GlobalScope.launch(Dispatchers.Main) {
            dialog.setMessage("Running (10%)")
            dialog.setProgress(10)
            delay(1000)
            dialog.setMessage("Running (50%)")
            dialog.setProgress(50)
            delay(1000)
            dialog.setMessage("Running (100%)")
            dialog.setProgress(100)
            delay(1000)
            dialog.dismiss()
        }
    }
}

```
Rails4でhealth_checkをミドルウェア化してヘルスチェックを行う

使用するGemは↓
https://github.com/ianheggie/health_check/tree/v2.8.0
Rails4なのでREADMEにあるとおりv2.8.0を使う。

## install
### Gemfileの記述
`gem 'health_check', "~> 2.8"`

### config
`config/initializers/health_check.rb`に色々書いていく。
GithubのREADMEにサンプルもあるので基本はそれを編集して作る。

#### ルーティング
↓のように書いておくと↓↓で指定したURIからアクセスできるようになる。
ちなみにpassengerなどを使ってRailsを起動していると再起動が必要になるので注意。

```config/routes.rb
  health_check_routes
```

```config/initializers/health_check.rb
  config.uri = 'health_check'
```

## ヘルスチェック方法
`http://example.com/health_check`にアクセス。
`http://example.com/health_check.json`でJsonも取れる。

下のようにURLを変えることによりチェック項目も指定可能。
未指定だと`standard`が使用され、DBやマイグレーションなどがチェックされる。
`full` or `all`も可能でstandardよりも項目数が多い。
何がstandardなのかといった項目も変更可能で、変更方法は↓のミドルウェア化の項目を参考に。

```
http://example.com/health_check/database
http://example.com/health_check/standard
http://example.com/health_check/full
# JSONで取得したい場合はこう↓
http://example.com/health_check/full.json
```


## ミドルウェア化
DBへ接続できないときなどはRails自体が死ぬのでヘルスチェックすらできなくなる。
そうなるのを回避するためにミドルウェア化する。

```config/application.rb
    config.middleware.insert_after "Rails::Rack::Logger", HealthCheck::MiddlewareHealthcheck
```

次に`config/initializers/health_check.rb`に`config.middleware_checks`を設定してミドルウェアでチェックする項目を指定する。
[デフォルトだとDB接続は入ってない](https://github.com/ianheggie/health_check/blob/v2.8.0/lib/health_check.rb#L62)ので指定しないとミドルウェアでDB接続をチェックしてくれなくなる。
__[middleware_checksとURLを比較してミドルウェアで行うか判断している](https://github.com/ianheggie/health_check/blob/v2.8.0/lib/health_check/middleware_health_check.rb#L53)みたいなので`standard`や`full`などを使う場合は明示的に含める必要がある。__
`/health_check/`(`/health_check/standard`と同じ)や`health_check/all`にアクセスしてDBのヘルスチェックをミドルウェアでしてもらうには例えば↓のようにする。
逆に`full`だけ指定して`all`は指定しないとかすると挙動を変えられそう(未検証)。

```config/initializers/health_check.rb
  config.middleware_checks = ['middleware', 'migrations', 'standard', 'full', 'all']
  config.standard_checks = ['database', 'migrations']
  config.full_checks = ['database', 'migrations', 'custom', 'email', 'cache', 'redis', 'resque-redis', 'sidekiq-redis', 's3']
```

## ステータスコードを変更
ヘルスチェックの結果がエラーだった場合に返るステータスコードを変更することができる。
テキストで受け取る際とオブジェクト(XMLやJson)で受け取る場合で別に指定できる。

```config/initializers/health_check.rb
  config.http_status_for_error_text = 503
  config.http_status_for_error_object = 503
```

## 動作確認
ミドルウェア化によりDBに接続できない場合でもヘルスチェックができることを確認する。

- まずは通常通りRailsを起動して`/health_check`にアクセスする 
    - → `success`の文字が確認できる
- `sudo service mysqld stop`としてDBを落として`/health_check`にアクセスする
    - → `health_check failed: closed MySQL connection`になる
    - curlに`-i`オプションを付けて確認するとステータスコードが`503`であることも確認できる
- DBが落ちたまま`/health_check`以外のページにアクセスする
    - → Railsがエラーとスタックトレースを出す
ターミナルをオシャレに涼しくしたら俺たちも涼しくなって世界が平和になる説(色をいじる編)

[前回](https://qiita.com/huequica/items/2c6ea702529ef2e33901)の記事の続きです。
環境構築とか見てない人はそちらからどうぞ。環境なんぞ変えんッという方であればそのままお通りください。

# 色を変えていく
Hyper上で`Cmd + ,`を押すとデフォルトのエディターで`.hyper.js`なるファイルが出てきますが、これが設定ファイルです。

それぞれ全部解説とかは面倒なのでファイルを[GitHub Gist](https://gist.github.com/huequica/5ceecdd236b82e18e00158f94ee663f9)にあげておきました。海っぽくしたい人はこれに書き換えればそれっぽくなります。

<img width="1338" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/e725c4c6-6427-3474-8b58-f49df824a8f8.png">

ここまでやっておいてアレなんですが、

```
ʕ◔ϖ◔ʔ <寂しい…キャラクターぽいのがほしい…
```
ってなったので、画像をCSSで埋め込みます。

# 画像を埋め込む
こんな感じの画像を３０秒クオリティで作ってみました。
![kuragess.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/d3b6afa0-2890-517e-f1f6-b7502d442547.png)

以下の素材を利用させていただきました。ありがとうございます。
[クラゲのキャラクター](https://hiyokoyarou.com/dokunashi/)
[泡の素材](http://commons.nicovideo.jp/material/nc96780)

あとは[先人の記事](https://qiita.com/medi-y-sato/items/a7ffd2c53a9448bc4b03)に習い、`.hyper.js`の`css`を加筆すればOKです。

```js
    css: `
    .terms_terms{
      background-image:url("画像のパス");
      background-size: 20%;
      background-position: right bottom;
      background-repeat: no-repeat;
    };
    `,
```

あとは`View -> Full Reload`で変更が適用されます。

# 完成
<img width="1338" alt="スクリーンショット" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/4b2692b0-edaa-13fa-42de-7e66f6e43413.png">
ターミナルが涼しくなりました。くっっっそ暑い季節にはピッタリかもしれません
開発モチベーションも高くなったので、よかったらみなさんもターミナル替えしてみてはいかがでしょうか。


余談ですが私の方は特に涼しくなりませんでした。エアコン様に今年も甘えます。
[Vue.js]Vue.jsでChart.jsのoptionsの渡し方についてのメモ

## はじめに

vue.jsでchart.jsを使うとき、opitonsの書き方をよく忘れてしまうのでメモ。
構成としては、グラフそのものを表示させる**「TheRerdarGraph.vue」**と、
その設定をしてある**「TheRerdarGraphSetting.vue」**を用いる。

## memo

### TheRardarGraph.vue

```html

<template>
  <div class="small">
    <the-big5-graph-setting :chart-data="datacollection" :options="options" />  /*** ←★opitonsをバインドさせる ***/
  </div>
</template>

<script>
import TheBig5GraphSetting from '@/components/object/project/TheBig5GraphSetting'

export default {
  name: 'TheBig5Graph',
  components: {
    TheBig5GraphSetting,
  },
  props: {
    analysisResult: {
      type: Object,
      required: true,
    },
  },
  data() {
    // @todo this.analysisResult.big5_** の値をグラフ用の datacollection に変換する
    // console.log('big5', this.analysisResult)
    return {
      datacollection: null,
      big5_neurotic_ism: this.analysisResult.big5_neurotic_ism,
      big5_extra_version: this.analysisResult.big5_extra_version,
      big5_openness: this.analysisResult.big5_openness,
      big5_agreeableness: this.analysisResult.big5_agreeableness,
      big5_conscientiousness: this.analysisResult.big5_conscientiousness,
/************************* ★optionsの書き方★ *************************/
      options: {
        scale: {
          ticks: { //http://www.chartjs.org/docs/#scales-radial-linear-scale
            stepSize: 10, // 目盛の間隔
            max: 100, //最大値
          }
        },
        legend: {
          display: false,
        },
      },
    }
/************************* ★optionsの書き方★ *************************/
  },
  mounted() {
    this.fillData()
  },
  methods: {
    fillData() {
      this.datacollection = {
        labels: ['感情性', '外向性', '開放的', '協調性', '誠実性'],
        datasets: [
          {
            label: '1',
            backgroundColor: 'rgba(244, 40, 88,0.3)',
            data: [
              this.big5_neurotic_ism,
              this.big5_extra_version,
              this.big5_openness,
              this.big5_agreeableness,
              this.big5_conscientiousness,
            ],
          },
        ],
      }
    },
    getRandomInt() {
      return Math.floor(Math.random() * (50 - 5 + 1)) + 5
    },
  },
}
</script>

<style>
.small {
  max-width: 300px;
}
</style>

```

### TheRardarGraphSetting.vue

```html
<script>
import { Radar, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins

export default {
  name: 'TheBig5GraphSetting',
  extends: Radar,
  mixins: [reactiveProp],
  props: ['options', 'chartData'],
  mounted() {
    // this.chartData is created in the mixin.
    // If you want to pass options please create a local options object
    this.renderChart(this.chartData, this.options)
  },
}
</script>

<style></style>

```
Wordpress 投稿画面で Advanced Custom Fields の関連記事をソートする



日付で新しい順（DESC）にしたい場合

```functions.php
/* 関連記事の調整 */
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['orderby'] = 'post_date'; //投稿日付順
  $args['order'] = 'DESC'; //新しい順
  return $args;
}
```

今開いている投稿を除外する場合

```functions.php
/* 関連記事の調整（開いている投稿を除外） */
add_filter( 'acf/fields/relationship/query', 'custom_acf_relationship_query', 10, 3 );
function custom_acf_relationship_query( $args, $field, $post_id ) {
  $args['post__not_in'] = array( $post_id ); //今開いている投稿を除外
  $args['orderby'] = 'post_date'; //投稿日付順
  $args['order'] = 'DESC'; //新しい順
  return $args;
}
```

参考
https://www.nxworld.net/wordpress/wp-acf-custom-relationship-query-exclude-post.html
gitで「新規ファイル」「削除ファイル」のみをaddする

# はじめに

`git add -u .`とやると、「更新ファイル」のみ`add`してくれますが、
「新規ファイル」「削除ファイル」のみと言うオプションは用意されていません。（たぶん）

やりたいときは、シェル芸で行きましょう。

`git status -s(--short)`が便利です。
http://sohtaro.com/blog/2017/05/28/git-status-short/

### 2019.09.04追記

Gitの対話モード`git add -i`で可能でした :persevere: 
詳しくはこの辺りを参照。

* [git addで新規ファイルのみ追加する - Qiita](https://qiita.com/te2u/items/3eeee6a363966118d58d)
* [Git - 対話的なステージング](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E5%AF%BE%E8%A9%B1%E7%9A%84%E3%81%AA%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0)

この記事では「対話モードを使わずにadd」という観点で書いてあります。

# 削除ファイルのみadd

```shell
git status | grep deleted | awk '{print $2}' | xargs git add
```

または

```shell
git status -s | grep ' D ' | awk '{print $2}' | xargs git add
```


# 追加ファイルのみadd

```shell
git status -s | grep '?? ' | awk '{print $2}' | xargs git add
```

追加ファイルの場合は普通に`git status`とやるとファイル別の`grep`がしづらいので、
`git status -s`が必須ですねー。

では、シェル芸で素敵なgitライフを！
raspberry piでjuliusを使って音声認識をする

# はじめに
juliusを使った音声認識をしてみたが、最初から最後までうまく動いたので自分用にメモ

## インストール状況
julius
| ─  julius-4.4.2.1
| | ─  julius-kit
| | | ─  dictation-kit-v4.4
| | | ─  grammar-kit-v4.1
参考サイト
http://www.asahi-net.or.jp/~cb9i-kn/geek/20170513totext.html

## 起動方法
    main.jconfがあるディレクトリに移動
     $ cd  ~julius/julius-4.4.2.1/julius-kit/julius-kit-v4.4/dictation-kit-v4.4
    起動
    $ julius -C main.jconf -C am-gmm.jconf -demo

## 自作辞書を使って音声認識

下記サイトを参考にファイル作成してコンパイル
ディレクトリはjulius-kit直下
参考サイト
https://ueqareer.net/2463

起動

    ↓のledは自作辞書の名前
    $ julius -C ~/julius/julius-4.4.2.1/julius-kit/grammar-kit-v4.1/hmm_mono.jconf -nostrip -input mic -gram ~/julius/julius-4.4.2.1/julius-kit/led -module &

    新しいコマンドプロンプトを立ち上げて
    $ python juliustest.py


#おわりに
画像も何もなくて寂しくなってしまったがメモ用にというつもりなのでこのままで
【MovableType】カスタムフィールドでアップした画像（アセット）を出力する方法

少しMovabletypeから離れると忘れてしまうので未来の自分へ向けてメモ。

##やりたいこと
記事の特定の箇所で、画像やPDFを出力したい。


##カスタムフィールド

・システムオブジェクト：記事
・種類：画像 
・ベースネーム：cf_img
・テンプレートタグ：cf_img

##解決方法

カスタムフィールドのテンプレートタグの語尾に「Asset」を追記する。
※もちろん閉じタグにも。

```mt:記事テンプレート
<mt:If tag="cf_img">
  <mt:cf_imgAsset>
    <img src="<mt:AssetURL>">
  </mt:cf_imgAsset>
</mt:If>
```

##まとめ

とてもシンプル。
けれどもリファレンス等で見つけにくかったイメージ。


##参考

[カスタムフィールドを使用する | CMSプラットフォーム Movable Type ドキュメントサイト](https://www.movabletype.jp/documentation/professional/custom-fields.html#item_view)
Pythonista で QRコードを作ってuiに表示する

# はじめに
買ったまま１年ぐらい（もっとかも）使ってなかった Pythonista 3。もったいないので公式ドキュメントをみながらあれこれ試してる。Qiitaはいつも見てるばかりなので、書いてみることにした。
# やること - QRコードを作る 
iOSアプリとして使いたいのでuiViewを使う。テキストフィールドに変換したい文字列をいれて、ボタンを押すとQRコードを作る。
# 完成イメージ
<img width="414" alt="IMG_8F7BE818D2D7-1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104018/29dd8571-7029-2d08-b644-92f8c0f390a5.jpeg">
# QRコードの作り方
qrcodeというライブラリを使うと簡単にQRコードがつくれる。それをconsoleに出すのは、こうやればいいので簡単。

```sample.py
import qrcode

img = qrcode.make('http://flapro.net/') #ここにQRコードにしたい文字列を入れる
show.image()
```
ui.ImageViewに表示するには、PILからImageに変換する必要がある。
Pythonista公式サイトの[フォーラム](https://forum.omz-software.com/topic/1935/how-can-i-convert-a-pil-image-to-a-ui-image/10)にやりかたが載っていたので使わせてもらった。

``` pil2ui.py
# pil <=> ui
def pil2ui(imgIn):
    with io.BytesIO() as bIO:
        imgIn.save(bIO, 'PNG')
        imgOut = ui.Image.from_data(bIO.getvalue())
    del bIO
    return imgOut
```

# 完成したソース
``` qr.py

import ui
import io
from PIL import Image 
import qrcode

def getQR(sender):
	img = pil2ui(qrcode.make(sender.superview['textfield'].text))
	sender.superview['imageView'].image = img
	
# pil <=> ui
def pil2ui(imgIn):
    with io.BytesIO() as bIO:
        imgIn.save(bIO, 'PNG')
        imgOut = ui.Image.from_data(bIO.getvalue())
    del bIO
    return imgOut
    
v = ui.load_view()
v.present('sheet')

```
# 参考
* [公式フォーラム How Can I convert a PIL to a ui.Image?](https://forum.omz-software.com/topic/1935/how-can-i-convert-a-pil-image-to-a-ui-image/10)
* [公式ドキュメント qrcode](http://omz-software.com/pythonista/docs/ios/qrcode.html)
Laravel(Eloquent)でLIKE検索で濁点/半濁点を区別したい→LIKE BINARYを使う

確認環境
・laravel v5.7.28
・MySQL 8.0
・PHP 7.3.0

MySQLのLIKEでは濁点/半濁点の区別を行いません。大文字と小文字の区別もしません。
厳密に一致させるときは、`LIKE BINARY` をつかいます。

ふつうのSQLではこう。

```
SELECT * FROM user WHERE name LIKE BINARY '%やまだ%;
```

Eloquentではこうやります。

```
$user->where('name','LIKE BINARY','%やまだ%');
```


以前はサポートされていなかったようですが
どこかのタイミングで修正されました。
https://github.com/laravel/framework/commit/76f6da4dab1e9e4847362a2b2b0c428e25805f0c#diff-cc3d43e01028390141596ae0da939930

サポートされていないバージョンを使用していて、アップデートはできないよという場合は
上記コミットと同じようにコードを修正すればOKです。（自己責任）
Spacemacsはいいぞ

# Spacemacs is なに？
<p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211748/691a29d8-f86e-317b-db4a-2c8c2f51f2ac.png" width="30%" style="display:block;margin-left:auto;margin-right:auto;"></p>

- Emacsディストリビューション。Spacemacsよりも軽量なものにDoom Emacsなんかがあったりする。
- Vimの秀逸な入力インターフェイスにEmacsの強力な拡張性を併せ持つそれぞれのいいとこ取りのエディタ。


# メリット
- スペースキーを起点としたコマンドが秀逸。スペースキーを押した時点で エディタの下に次のキーの候補と何のコマンドかを表示してくれて親切。
  ![スクリーンショット 2019-05-31 11.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211748/366b39bb-e5ce-3506-5fd1-5ead3c93e25d.png)

- デフォルトで多くレイヤーが用意されていて、`.rb` や `.py` などの拡張子を初めて開く場合、最初にawesome-emacsに乗っているようなモジュールを入れるか聞いてくれるので言われるがままに入れとけばまず困らない。

- 補完が結構効く。仕事でRubyを書いていてRubyMineでは設定が悪いのか全然補完してくれなかったものがSpacemacsでは補完してくれるようになってRubyMineやめた。Robeすごい。

- Emacsの豊富な既存のモジュールをほぼそのまま使える。

- themes-megapackレイヤーを入れれば有り余るほどテーマが入るので、私みたいに定期的にテーマを変えたい人にはありがたい。テーマの変更は設定ファイルからできる他に`Space T s`で簡単に変更できる。
![スクリーンショット 2019-05-31 12.22.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211748/8d85bd24-6b56-23ea-b20f-b3ee84d2561b.png)


# デメリット
- 情報が少ないのでSpacemacs固有の問題にぶち当たったら解決するのが結構大変**らしい**。
- 立ち上げてしまえばサクサクだが、やはり素のEmacsやVimやVSCodeと比べて起動が遅い。(それでもRubyMineやその他IDEよりはずっと速い)

# 導入手順
私はmacOSを使っているためmacOSでの導入手順を書いておきます。その他OSの方は[GithubのREADME](https://github.com/syl20bnr/spacemacs/blob/master/README.md)を参照してください。

また、すでにemacsを使っている方は`~/.emacs.d`のバックアップを忘れずにしてください。

```bash
$ brew tap d12frosted/emacs-plus
$ brew install emacs-plus
$ brew linkapps emacs-plus
$ git clone https://github.com/syl20bnr/spacemacs ~/.emacs.d
```

## よく使うコマンド
- `.rb`ファイルを開いた状態で`Space m '` : Robe(コードナビゲーション、ドキュメント検索、オートコンプリート)の起動
- `Space p f` : プロジェクト内のファイル検索
- `Space /` : プロジェクト内のテキスト検索
- `Space f f` : ファイル検索
- `Space T T` : エディタの透過調整
- `Space g b` : git blame
- `Space T s` : エディタのテーマ変更
- `Space w -` : エディタの水平分割
- `Space w v` : エディタの垂直分割
- `Space w w` : 次のウィンドウに移動
- `Space {0~9}` : 指定した数字のウィンドウに移動 
- `Space p t` : プロジェクトツリー(Treemacs)
ターミナルからtelnet経由でホストと接続してみた（作成中）

PCOMMやHODではない手段として、ターミナルからtelnet経由で、ホストのtn3270を接続してみました。
`昔PJTでターミナルを使ってtn3270の画面を出してる人を見て、やってみたいわ。。
試しに、使い方をチラッとトライして、意外と簡単だった。`

#最初の最初
まず　telnet+ipでホストにログインして、

[EZY4206I](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.halb001/ezy4206i.htm)と[EZY4210I](https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.halb001/ezy4210i.htm)が表示される
``` 
  IBM TCP/IP TELNET SERVER DBCS SERVICE START AT HH.MM.SS ON MM/DD/YY
  KEY-IN YOUR TERMINAL TYPE & CONVERSION TYPE:
```
kshで