OmniAICreator/Qiita-1.07M huggingface dataset:
最終行の検索

エクセルで最終行を検索する際に用いるマクロ

方法１
MaxRow = Range("A65536").End(xlUp).Row
MaxCol = Range("IV1").End(xlToLeft).Column ' IV1=256列

問題点：バージョンによって最終行の位置が変わるため汎用的でない

方法２⇦最も一般的
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column


参考：　http://officetanaka.net/excel/vba/tips/tips130.htm
VSCode痛エディタを安全に運用する

## はじめに
普段使用しているエディタに背景画像を設定して `痛エディタ化` することは多くのエンジニアの関心事であり、これまで新しいエディタが登場するごとに `痛エディタ化` 設定方法が提案されてきました。お気に入りのキャラクタを愛でながらコーディングできることはすばらしいことです。しかしながら、職場や学校などの公共の場で使用するとオタバレの危険性や周囲に冷ややかな目をむけられる懸念があります。そこで今回、global IPによって使用している場所を識別し，自宅にいる時にのみ背景画像を表示する `安全な痛エディタ` を提案します。

## 安全な痛エディタ
以下は[ipify API](https://www.ipify.org/)を使用してglobal IPを取得する一例です。

``` getIP.ts
import axios from 'axios';

const APIURL: string = 'https://api.ipify.org?format=json';
export default function getIP() {
  return axios.get(APIURL).then(res => {
    return res.data.ip
  })
}
```

あとは自宅環境のglobal IPと比較して背景画像の表示を切り替えます。

今回、VSCode用のプラグインを作成しましたので公開します。
https://marketplace.visualstudio.com/items?itemName=moritanian.safety-background

## おわりに
提案する方法によって安全に痛エディタを運用することができれば幸いです...


とても痛い記事になってしまいました。
次回はもう少しまともな記事を書きたいと思います。
UISlider優良記事まとめ[Swift]

詳細はのちに追記

**・[UISliderのThumbの表示領域(SizeやFrame)を計算するExtension - Qiita](https://qiita.com/KikurageChan/items/7cd958576d4f939f321f)**

**・[UISliderのUXをトコトン追究して改善してみる - Qiita](https://qiita.com/ruwatana/items/01a9c43057f71560580f)**

**・[UISlider - UIKit | Apple Developer Documentation](https://developer.apple.com/documentation/uikit/uislider)**
→図に関しては公式が一番すっきりまとまっている(`Overview`,`Figure3,4`)

**・[Xcode - swift sliderボタンの大きさを変える｜teratail](https://teratail.com/questions/150676)**

**・[IB上で範囲の確認ができるUISliderのタップエリアを拡大する実装 - Qiita](https://qiita.com/KikurageChan/items/6b71a6831848b37f5f46)**

**・[UISlider の Thumb をアニメーションで非表示に - Qiita](https://qiita.com/yuki0n0/items/47179bcb7913383ffdf0)**

**・[UISliderのカスタマイズ - kitoko552.memo](https://kitoko552.hatenablog.com/entry/20180312/1520844828)**
Storyboardで設置したUIを custom classで編集した時の注意点[Swift](exc_bad_instruction (code=exc_i386_invop subcode=0x0))

# 概要
・`Storyboard`でUI(`hogehogeView`とする)を設置し

```
@IBOutlet weak var hogehogeView: hugahugaCustomView!
```
・こんな風に**コード側とも連携を取り**(&しっかりと`custom class`を参照)

```hugahugaCustomView.swift
import UIKit

class hugahugaCustomView: UIView {
    //やりたい処理
}
```
そして実行!


# 問題と解決策
#### 問題
実行するとこんなエラーが、、、、

```
exc_bad_instruction (code=exc_i386_invop subcode=0x0)
```
**こいつはいろんなパターンで出る**ようですが
**UIが繋がってません**系のミスで多いようですね
(※これ以外にある場合はのちに追記)

**参考**
**・[Xcode - EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)と表示されアプリがクラッシュされてしまいます。｜teratail](https://teratail.com/questions/100100)**
**・[iOS - 【エラーの対処法がわかりません】exc_bad_instruction (code=exc_i386_invop subcode=0x0)｜teratail](https://teratail.com/questions/42990)**

#### 解決策
**`storyboard`側でもしっかりと`custom class`を参照しましょう**
![storyboardでUI扱うときのcustomclass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427937/2ca59e8c-3e07-3c4f-7db2-1e743224c5c0.png)

# 結論
Storyboardで設置したUIを`custom class`で編集している場合の注意点をまとめると
・@IB...で定義した後**Storyboard側と連携を取る(`右クリック&ドラッグ`でつなぐ)**
・@IB...の定義で**`custom class`を参照する**
・`Storyboard`側でも**`custom class`を参照する**
Raspberry Pi の /etc/fstab をいじって再起動したら起動しなくなった

また立て直しかと焦ったので解決方法をメモ。

## 環境

- ハード: Raspberry Pi 2 Model B
- OS: Raspbian Buster (CUI)
- 同一ネットワーク上の PC から Pi に ssh できる (あんまり関係ない)

## 経緯

- `/etc/fstab` を編集して再起動したら ssh 出来なくなった
- Pi をモニタに繋いでみたら `Cannnot open access to console, the root account is locked.` と出ていた

## 対応

### 1. Pi の電源をオフ

電源を落としてSDカードを取り外す。

### 2. `cmdline.txt` を編集

SD カードを PC に繋いで、マウントされた `boot` の `cmdline.txt` を編集する。
行の最後尾に半角スペース入れて `init=/bin/sh` と追記。
SD カードを取り出す。

### 3. Pi を起動

Pi に SD カードを入れて、モニタに繋いで起動。
標準出力が止まったと思ったら Enter とか `ls` とか何かコマンドを入力してみる。
`/bin/sh` がちゃんと動いてたら↓へ進む。動いてなかったら別の方法をぐぐる。

### 4. `/` を読み込みと書き込みの両方でマウントする

`/etc/fstab` を修正したいけどこの時点では read only になってるので、書き込めるようにする。
この時もし `mount` コマンドを受け付けなかったら、一旦 `/` をアンマウントしてから改めてマウントする。

```sh
umount / 
mount -o remount,rw /dev/mmcblk0p2 /
```

多分 `mmcblk0p2` は固定。ちがったらごめん。

### 5. `/etc/fstab` を編集

`vi /etc/fstab` とかで編集。
それっぽい箇所をコメントアウトして保存。

### 6. ログアウトしつつ Pi の電源落とす

念の為 `sync` コマンド打ってから `exit` とかでログアウト。
カーネルパニック的な表示が出るけどこれでOKらしい。電源を落とす。

### 7. `cmdline.txt` を戻す

SD カードを取り出して PC にマウントして、再度 `boot` の `cmdline.txt` を編集。
追記した半角スペースと `init=/bin/sh` を削除して保存し、また SD カードを Pi に戻して電源入れる。
Pi がちゃんと起動すればOK。
## 参考

- [Edited fstab, rebooted, Cannot access to console, the root account is locked \- Raspberry Pi Forums](https://www.raspberrypi.org/forums/viewtopic.php?t=199079)
- [Emergency Mode due to fstab \- Raspberry Pi Forums](https://www.raspberrypi.org/forums/viewtopic.php?t=172814)
モブプロにVisual Studio Live Shareを使う

# TL;DR
VSCodeを使ったモブプロの簡単な手順書です。
モブプロに便利なツールとして、Visual Studio Live Shareという画面共有しながらコーディングができるVSCodeの拡張機能があります。
この記事は、このLive Shareを導入する際の手順やつまりそうなところについてまとめています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/94c30e36-180d-3e96-f14b-86360f7d6538.png)
（https://visualstudio.microsoft.com/ja/services/live-share/ より引用）


# モブプロって何？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/a65bf50d-dc4c-853d-7594-010629e9b2a5.png)
（https://blog.crisp.se/2015/12/28/yassalsundman/real-life-mob-programming から引用）

モブプロでは、参加者全員が一つの画面を見ながら、一人が**ドライバー（作業する人）**、一人が**ナビゲーター（指示する人）**としてコーディングを進める開発スタイルです。ペアプロの複数人版とも言えるものです。
ドライバーはナビゲーターの指示を受けてコーディングしていきますが、なぜそれをやるのかを納得するまでナビゲーターに聞くことで、コードの意味やコードの書き方を学んで行くことができます。
ナビゲーターはナビゲーターで、次にやるべきことを頭で考えながら人に伝える技術が問われます。

このようなナビゲーターとドライバーは、モブプロ参加者で順番に交代していきます。

やり方の一つとして、10分を1セットとし、セットが終わるとナビゲーターとドライバーを別の人に代えます。
トータルの時間は、1時間からさらに長時間にわたるものまで様々なものがあり、モブプロの目的によって変わるものです。


# Visual Studio Live Shareを使ったモブプロ
ドライバーは、時間ごとに別の人に交代するため、一つのディスプレイを共有していると、ディスプレイに毎回繋ぎかえる必要があり、結構大変です。
Visual Studio Live shareという機能を使えば、特定の人のマシンのファイルにアクセスすることができ、そのファイルを編集するようすがリアルタイムで共有されるため、モブプロにめちゃくちゃあっています。

https://visualstudio.microsoft.com/ja/services/live-share/

# Visual Studio Live Shareを使うために

Live Shareを使うために次の二つが必要となります。

- VSCode
- VSCodeの拡張機能 **Visual Studio Live Share**


# VS Codeの準備
VSCodeを持っていない方は、インストールしてください。
https://code.visualstudio.com/

# Live Share拡張機能
VSCodeでLive Shareを使うためには、**Live Share** というVSCodeの拡張機能をインストールする必要があります。

インストールするには次の二つがあります。

- VSCodeの拡張機能から手動でインストールする
- 誰かが作成したLive ShareのセッションのURLを開いた時に出てくるポップアップからインストールする

下のやり方について解説していきます。

## Live ShareのセッションURLをクリックして出てくる画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/83d7d0bb-50bb-e4b8-cd25-311ebd4be961.png)



`https://prod.liveshare.vsengsaas.visualstudio.com/join?xxxxxxxxx` のようなセッションURLをクリックすると上のような画面が表示されます。

自動でVS Codeが起動しない場合は、下のロゴからVS Codeを開いてください。

GitHubの認証みたいな画面が出る場合はそれを許可してください。

## Live Shareも入れたのに、セッションURLクリックしても接続できない場合
たまにあるようなので、セッションURLを手動で設定する方法について紹介します。

### 手動でセッションに参加する
https://docs.microsoft.com/en-us/visualstudio/liveshare/reference/manual-join
上のサイト（英語）で紹介されているように、 **Join collaboration session...** をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/5683b81a-9285-1a92-ff38-a9f9dbf2dba2.png)

すると、URLを入力するウィンドウが出てくるので、セッションURLを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/5f23e367-9f14-499f-dad3-657fb9a43b50.png)

これで、セッションを作った人のプロジェクトにアクセスすることができます。

これで、**無事編集をリアルタイム共有することができます！**

# セッションを作る（ホスト側）

ホスト側の操作についても紹介しておきます（と言ってもボタン一発ですが）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/15640a3f-c389-fa05-ef84-c0e1dd9755d8.png)

これを押すと、参加するために必要なセッションURLが発行されます。
これをSlackなりで共有すれば、ホスト側のPCにアクセスすることができます。

## 共有を終了する時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260547/facd26d6-fbcf-5f46-bb80-565b0321520b.png)

# まとめ
Live Shareを使えば、リモートの人とモブプロするということも簡単にできます。
モブプロを使ってガンガン生産性を上げていきましょう！
TravisCIでビルドステージ使う時のステップの動作をメモる


https://docs.travis-ci.com/user/build-stages/
TravisCIのビルドステージを使ってCI動かしたいと思ったが
`script`とかの実行順がよくわからなかったので動かしてみたメモ

## travis.yml
`travis.yml`こんな感じで動かしてみた。

ステージは`syntax`と`test`の2つを用意して
`syntax`ステージのジョブでは`before_script` ~ `after_script`を記述。
`test`ステージのジョブでは`script`だけを記述した。

```yaml
stages:
  - syntax
  - test

jobs:
  include:
    - stage: syntax
      name: Syntax Check
      before_install:
        - echo "jobs syntax before_install"
      install:
        - echo "jobs syntax install"
      before_script:
        - echo "jobs syntax before_script"
      script:
        - echo "jobs syntax script"
      after_script:
        - echo "jobs syntax after_script"
    - stage: test
      name: Test
      script:
        - echo "jobs test script"

before_install:
  - echo "before_install"
install:
  - echo "install"
before_script:
  - echo "before_script"
script:
  - echo "script"
after_script:
  - echo "after_script"
```


## そもそもの実行順
https://docs.travis-ci.com/user/job-lifecycle/
↑に書いてあるけど・・・
（今回はOPTIONALなのはめんどくさかったので省いた）

1. before_install
2. install
3. before_script
4. script
5. after_script

なので、コンソールには以下のように出力される。

```console
$ echo "before_install"
$ echo "install"
$ echo "before_script"
$ echo "script"
$ echo "after_script"
```

## syntaxステージの結果
`syntax`ステージのステップだけが動いた。

```console
$ echo "jobs syntax before_install"
$ echo "jobs syntax install"
$ echo "jobs syntax before_script"
$ echo "jobs syntax script"
$ echo "jobs syntax after_script"
```

## testステージの結果
`script`だけは`test`ステージのものが動いた。

```console
$ echo "before_install"
$ echo "install"
$ echo "before_script"
$ echo "jobs test script"
$ echo "after_script"
```

## まとめ
ビルドステージのステップがあればそちらが動く!!

ここにそれっぽーいことが書いてあった／^o^＼
https://docs.travis-ci.com/user/build-stages/define-steps/
Kotlinのプロパティとは

普段から当たり前のように使ってはいたものの、あまりきちんと理解していなかったプロパティについてざっと調べた内容をまとめました。

# プロパティとは
Kotlinにおけるプロパティは、Javaにおける「**フィールド＋getter/setter**」に相当するものだと理解しました。
("もの"という表現があまり好きではないのですが、対応する言葉が分からなかったので、ご存知の方がいれば教えていただきたいです…)

具体的には以下のように宣言します。

```kotlin:User.kt
class User {

  // immutableな場合はgetのみ可。
  val id: Int = 0

  // mutableな場合はget/setどちらも可。
  protected var name: String = ""

}
```

Kotlinの可視性修飾子はデフォルトで`public`になるので、これをJavaで書くと以下のようになります。

```java:User.java
public class User {

  // immutableな場合はgetterのみ宣言する。
  private int id = 0;
  public id getId() {
    return this.id;
  }

  // mutableな場合はget/setどちらも宣言する。
  private String name = "";
  protected String getName() {
    return this.name;
  }
  protected void setName(String name) {
    this.name = name;
  }

}
```

# getter/setterのカスタマイズとバッキングフィールド
Kotlinでプロパティを宣言すると、以下のようなデフォルトのgetter/setterが暗黙的に宣言されます。
Javaにおけるフィールドに相当する値(？)へは`field`識別子によってアクセスできます。この`field`は「**バッキングフィールド**」と呼ばれています。

```kotlin:User.kt
class User {

  // immutableな場合はgetterのみ暗黙的に宣言される。
  val id: Int = 0
    // 実際に宣言されるわけではなく、あくまでイメージ。
    get() {
      return field
    }

  // mutableな場合はgetter/setterどちらも暗黙的に宣言される。
  protected var name: String = ""
    // 実際に宣言されるわけではなく、あくまでイメージ。
    get() {
      return field
    }
    set(value) {
      field = value
    }

}
```

getter/setterをカスタマイズする場合は、**明示的にgetter/setterをプロパティの直下に宣言**し、ブラケットの中身を実装する必要があります。

# getter/setterの可視範囲に関するルール

getter/setterの可視範囲に関しては、以下のようなルールがあります。

- getterの可視範囲：プロパティに指定された可視範囲と同じでなければならない
- setterの可視範囲：プロパティに指定された可視範囲と同じかそれより狭い可視範囲でなければならない

可視性修飾子は以下の表の4種類で、可視範囲は`public` > `internal` > `protected` > `private`となります。

詳細は[公式リファレンス](https://kotlinlang.org/docs/reference/visibility-modifiers.html)をご参照ください。

|可視性修飾子|可視範囲(クラス内で付与された場合)|
|:--|:--|:--|
|public|どこでも|
|internal|同一モジュール内|
|protected|宣言されたクラス内＋サブクラス|
|private|宣言されたクラス内のみ|

デフォルトのgetter/setterの可視範囲は**プロパティに付与されたものと同じ可視範囲**になります。
getter/setterそれぞれに可視性修飾子を付与し可視範囲を変更することができますが、上記のルールに準拠する必要があります。

```kotlin:User.kt
class User {

  val id: Int = 0
    private get  // これは不可。getterの可視範囲はpublicでなければならない。

  protected var name: String = ""
    get          // これは可。getterの可視範囲はprotected。
    public set   // これは不可。setterの可視範囲はprotected or privateでなければならない。

}
```

# setterの可視範囲を広げたい場合
この方法を知りたくてプロパティについて調べ始めました。
結論としては、私が調べた範囲では**setterに相当するメソッドを追加で宣言する**しかなさそうです。
(他にあれば教えていただきたいです)

具体例として、以下のようなActivityとAdapterがあり、Adapterは`OnItemClickListener`の実装クラスの参照を受け取りたい一方で、参照を受け取るプロパティ自体は公開したくないといったケースを考えます。
この場合、`listener`プロパティの可視性修飾子を`private`にしつつ、setterに相当するメソッド(`setItemClickListener(listener)`)の可視性修飾子を`public`にすることで、setterの可視範囲を擬似的に広げることが可能になります。

```kotlin
class HogeActivity : AppCompatActivity(), HogeAdapter.OnItemClickListener {

  override onCreate(savedInstanceState: Bundle?) {
    ...

    val adapter = HogeAdapter()
    adapter.setOnItemClickListener(this)
  }

  override fun onClick(position: Int) {
    ...
  }

}

class HogeAdapter {

  interface OnItemClickListener {
    fun onClick(position: Int)
  }

  private var listener: OnItemClickListener? = null

  fun setOnItemClickListener(listener: OnItemClickListener) {
    this.listener = listener
  }

  ...

}
```

取り留めのない文章になってしまいましたが、以上となります。
ノートパソコンのメモリ増設 規格だけあってるメモリをつける編

#はじめに
メモリ足りないなと思ったもののざっくり増設するかという目論見を考えて、お金があれば純正をぱっとつければいいやという考えでしたが、お金もないし規格があうものを買ってきてテスト(memtest86+なり…)をパスすればいいだろうというごくごくぬるい考えのもとにはじめましたが!

ふつー企業なりでパソコンの大先生してるなら純正ポーンでさくっと保守マニュアルみてつけて、動かしてればでええわでいいと思うのですがそこはやはりat own riskでいっちょやろうと。

#調べる
自分のPCにあうものを探してまずは規格を探すところから。
LenovoのThinkPad 25を使っているので諸元(のシート)があっさりとありまして助かる。
https://www.lenovo.com/jp/ja/static/catalog/nb-2017-tp25_rt_1005
PC4-17000 DDR4 SDRAM SODIMM であればいけると。そしてこの規格(DDR4のSO DIMM)であればいけると認識する。

#買う
ぐぐって値段をこのへんかな?と確かめつつ、Amazonもみる。
結果的に早そう/安そうをとってこれに。
https://amzn.to/2YLO3Ay
規格的には上位のものですが下位への互換がある認識でこれを使用。

#つける
保守マニュアルを参照するhttps://usermanual.wiki/Lenovo/Sp40J66019Ja.1319924789.pdf
さすがThinkPad様
プラモデルの説明書より懇切丁寧で素敵やん。

記載のとおりに装着前に高速ブートをOFFにし、BIOS/UEFIから内蔵バッテリーをOFFにするなどを実施。
メモリを増設しふたをしめる。
OS起動後、予測どおりの容量になっていることを確認し、高速ブートをONにし、BIOS/UEFIから内蔵バッテリーをONにするなどを実施。このあたりもマニュアル記載のとおり。

#テスト
##Windowsメモリ診断
https://www.atmarkit.co.jp/ait/articles/1810/01/news015.html

メモリ診断起動後、F1の設定からフル装備設定にし、1回実施とする。
何事もなく完了。

##Memtest86
最初はMemtest86+のつもりでしたがUEFIがらみで起動しないためMemtest86に変更。USBメモリでの起動としました。

https://www.sakura-pc.jp/pc/ct/mainte/memory/pm-memtest86.html
13 Hammer testは記載のとおりパスとし1回実施とする。
何事もなく完了。

観点(ソフト)が別のものを各1回やれば大丈夫という目論見でOKとします。

#さいご
本来であればテストはもっといいやりかたがあるはず。ガンガンおしえてください。
正直成功例メモでしかないのでどうかと思いますがMemtest86はトラップになる予感しました。(テストツールでのハマり)

# あとしまつ
あとしまつのUEFI起動にしたUSBメモリのフォーマット(ブート領域の削除)もそのうちつけくわえよう!
→ https://qiita.com/shohirose/items/5d1083afaabafd72a608 ええのあった。これでよかろうもん。
Lip motion capture, facial capture のメモ

口周りに特化した facial capture のメモ.

Disney research が強い.

## User-Guided Lip Correction for Facial Performance Capture

https://la.disneyresearch.com/publication/user-guided-lip-correction/

スケッチベースの GUI を提供して, よろしく補正する。
T.B.W.

## An Empirical Rig for Jaw Animation

https://la.disneyresearch.com/publication/empirical-jaw-rig/

キューブのマーカーを使って Jaw の動きをうまくキャプチャ.
マーカーには AruCo を利用(OpenCV のマーカー検出機能を使いやすくしたもの)

ArUco: a minimal library for Augmented Reality applications based on OpenCV
https://www.uco.es/investiga/grupos/ava/node/26

以前(2013 年ごろ)は BSD ライセンスで公開されていたような気もしますが, 今(2019)見てみると GPL ですね. 
昨今ですと QR コードなどでよりロバストにトラッキングとかあると思うので, そちらを使ったほうがよいかもです.

8 個の Ximea CB120MG(ビジョン用モノクロカメラ. 1 個 10~20 万円くらい?)

## データセット

BIWI 3D audiovisual corpus dataset
http://www.vision.ee.ethz.ch/datasets/b3dac2.en.html

RGB-D カメラで撮ったもの. 利用は(非商用)研究用途に限る.

## その他

Violent lips
https://www.violentlips.com/

セレブ御用達 lip tattoo(シール).

セグメンテーションに便利っぽい.


Appearance Capture and Modeling of Human Teeth
https://la.disneyresearch.com/publication/appearance-capture-and-modeling-of-human-teeth/

歯のキャプチャ
UIStackViewとUITableViewの個人的使い分け

# 疑問
`UIStackView`も`UITableView`もUIを積んでいけるし、
各々(のviewやcell)を設定したり、共通の設定をしたり
出来ることってだいたい一緒じゃね？→**何を基準にどっちを選択するの？**
となってたわけです

# UITableView = UIStackView + UIScrollView
この考え方が基本でいいようです

・**積み重ねる・仕切る**をやりたいだけなら`UIStackView`
→この2つをやるには制約の設定を省けたりなどして**簡単**

・**Scrollもしてほしい**なら`UITableView`
→扱い方はややこしくなるが、`Scroll`させたい(させなきゃならん)場合は
`Scroll`の設定自体がめんどくさくなるので`UITableView`の方が`Scroll`の設定もある程度**簡単**

# Example
例も交えた詳細はのちに追記します
Laravel/Bladeのループ変数 $loop->last の判定が失敗する件

# 問題点
ループの最終項目のはずなのだが、$loop->last がfalseになる。

# 暫定結論
QueryBuilderのような、Iterableだがcountが不明な変数をforeachに渡したときは、$loop->lastが使えない

~~~ blade.php
{{-- これは意図通り動かない --}}
@foreach($queryBuilder->cursor() as $item)
  @if($loop->last) 食事っておいしいよにゃー @endif
@endforeach

{{-- これは意図通り動く --}}
@foreach($someArray as $item)
  @if($loop->last) ラストエンペラー @endif
@endforeach

{{-- これは意図通り動く --}}
@foreach($queryBuilder->cursor() as $item)
  @if($loop->iteration == $queryBuilder->count()) 子門モサド @endif
@endforeach

~~~


# 詳細
PDFの出力で、最後のページだけ「改ページしない」が下記の要領で実装されていたんだけど、うまく動いていない。

~~~ blade.php
{{-- NG(最終行にもpage-breakが出力されてしまう) --}}
<div class="row @if(!$loop->last) page-break @endif">
~~~

画面に出力してみたら、最終行でも、$loop->lastがfalseになっておる。
なぜ？？？

# 仮説
ちょっと戸惑ったものの、よく考えてみると、foreachにクエリビルダを渡していることに気づいた。

~~~ blade.php
@foreach($queryBuilder->cursor() as $item)
~~~

foreachに配列やコレクションを渡したときは意図した通り動いているので、
予め件数がわかっていないと判定できないのかな？と考えて、下記の要領に変更したら、意図通り動作した。

~~~ blade.php 
{{-- OK(最終行には出力されない) --}}
<div class="row @if($loop->iteration != $queryBuilder->count()) page-break @endif">
~~~

ただ、$loop->last が想定通りの値にならない正確な理由は未検証。
・予め件数がわかっていないとNG

というのはちょっと曖昧なので、$loopの実装と、クエリビルダ側でIteratorableなことがどのように実装されているのか、具体的に調べないとわからん。時間が無いので誰か知ってたら教えて下さい。
初心者でも出来るHTML,JavaScript入門4

## 1.事前知識
- [初心者でも出来るHTML入門1](https://qiita.com/ryome/items/9ec3819e5e9ab5321553)
- [初心者でも出来るHTML入門2](https://qiita.com/ryome/items/4e19c19d3166a01bc0fc)
- [初心者でも出来るHTML入門3](https://qiita.com/ryome/items/72408fb260d1576fcb25)

事前知識として、上記リンクの内容が必要です。

## 2.JavaScriptについて
`JavaScript` とは、Webページで複雑な処理を可能にするプログラミング言語です。
`JavaScript` には `インラインスクリプト` , `外部スクリプト` , `イベントハンドラ` という書き方があります。それぞれ以下の通りです。

```html:インラインスクリプト
<script type="text/javascript">
//ここにJavaScriptを書きます。
</script>
```
```html:外部スクリプト
<script type="text/javascript" src="test.js">//外部ファイルにJavaScriptを書きます。</script>
```
```html:イベントハンドラ
<input type="button" onclick="ここにJavaScriptを書きます。">
```

## 3.記述例

- インラインスクリプト

```html:test1.html
<!DOCTYPE html>
<html>
    <head>
        <!-- 付加情報 -->

        <!-- タイトル -->
        <title>JavaScriptの説明</title>

        <!-- インラインスクリプトの場合は<head>内に書く -->
        <script type="text/javascript">
            alert('Hello');
        </script>
        
        <!-- 文字コードの指定 -->
        <meta charset="utf-8" />
    </head>

    <body>
        <!-- コンテンツ -->
    </body>
</html>
```

- 外部スクリプト

```html:test2.html
<!DOCTYPE html>
<html>
    <head>
        <!-- 付加情報 -->

        <!-- タイトル -->
        <title>JavaScriptの説明</title>

        <!-- 外部スクリプトの場合は<head>内に書く -->
        <script src="test.js"></script>

        <!-- 文字コードの指定 -->
        <meta charset="utf-8" />
    </head>

    <body>
        <!-- コンテンツ -->

    </body>
</html>
```
```js:test.js
alert("Hello!");
```

- イベントハンドラ

```html:test3.html
<!DOCTYPE html>
<html>
    <head>
        <!-- 付加情報 -->

        <!-- タイトル -->
        <title>JavaScriptの説明</title>

        <!-- 文字コードの指定 -->
        <meta charset="utf-8" />
    </head>

    <body>
        <!-- コンテンツ -->
        <!-- イベントハンドラは<input>内に書く -->
        <input type="button" value="JavaScript" onclick="alert('Hello');">
    </body>
</html>
```

中身の文をコピーして、文字コードは `UTF-8` を指定し、ファイル名を `test1.html`,`test2.html`,`test.js`,`test3.html` でデスクトップに保存するとブラウザではこうなります↓↓

- test1.html
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/8c1bcf2b-63dd-799c-9bbe-2737d2454563.png)

- test2.html , test.js
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/d9c8d841-fda9-5d02-38ce-ce5d9f92111c.png)

- test3.html
![test3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/80ac7561-60c8-c49c-267c-ee986504760a.png)


画像のようになれば成功です。

## 4.GitHub
GitHubにソースコードを公開しています。

https://github.com/ryomeblog/qiita/tree/master/%E5%88%9D%E5%BF%83%E8%80%85%E3%81%A7%E3%82%82%E5%87%BA%E6%9D%A5%E3%82%8BHTML%2CJavaScript%E5%85%A5%E9%96%804

## 5.関連
- [初心者でも出来るHTML,JavaScript入門5](https://qiita.com/ryome/items/c5e7716ff58bbced5173)
- [初心者でも出来るHTML,JavaScript入門6](https://qiita.com/ryome/items/4a75d5d3df0c6355accd)
- [初心者でも出来るHTML,JavaScript入門7](https://qiita.com/ryome/items/6d58c666a4b296e8cc02)
実機の時だけThread 1: signal SIGABRT(Xcode, Swift)

# 問題
シミュレータの時はうまく動くのに実機の時だけ`Thread 1: signal SIGABRT`と出ちゃう
(実機のVerは`12.2`)
# 対策
Xcode側の設定で`PROJECT``TARGET`の`Deployment Target`を前のバージョンに戻す
(今回は`12.1`→`12.0`にした)
※とりあえず両方やっただけなので片方やるのが正解なのか片方にしてもどっちだけ戻すのが正解なのかわかりません
うまく行かなかった場合いろんなパターンを試してみると解決するかもです(実機やsimulatorのVerもチェックしつつやってみるといいかもです![実機エラー対策_ qiita 2019-04-25 20.37.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399095/2a1cbf3f-9595-f574-4cba-78d85ac764ad.png)
![実機エラー対策_ qiita 2019-04-25 20.38.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399095/22e08471-9395-f936-7f54-75ac94238229.png)
)
Fatal error: Unexpectedly found nil while unwrapping an Optional value　ってよくあるやつでた

## Fatal error: Unexpectedly found nil while unwrapping an Optional valueとでたのでなんとかしたい
```swift:ViewController.swift
if req_orders.childOrderState.rawValue == "COMPLETED" {
           print("Get orders !: \(response)")
}
```
```
Fatal error: Unexpectedly found nil while unwrapping an Optional value
```
。。。。。。。。
だめ

```swift:ViewController.swift
if req_orders.childOrderState!.rawValue == "COMPLETED" {　//!入れてみた
           print("Get orders !: \(response)")
}
```
```
Fatal error: Unexpectedly found nil while unwrapping an Optional value
```
。。。。。。。。
だめ

## 解決
```swift:ViewController.swift
if req_orders.childOrderState?.rawValue == "COMPLETED" {　//?にしてみた
           print("Get orders !: \(response)")
}
```
```
Build Succeed
```

いけた！　（原因はわかりません、オプショナルもxcodeの指示通りやってればなんとかなるで乗り切ってるから基本を勉強しないと、、、、）
触覚VRデバイスの実装３：指への力覚提示（多指＋２軸）

#はじめに
前回の投稿"[触覚VRデバイスの実装２ 人差し指への力覚提示](https://qiita.com/YI_D/items/a324db7037c2ec964c7e)"では、人差し指に特化した触覚提示デバイスをまとめました。
使った感触を元に以下に挙げる変更点を加えたデバイスを設計しました。（DMMに3Dプリントを発注しましたが、発送が遅れているため今回は実機デモはありません。届いて組み立てて制御を入れたら投稿します。）

[2019.08.27 更新]
実機デモはこちらを↓
"[触覚VRデバイスの実装３：指への力覚提示（多指＋２軸）~実機デモ~](https://qiita.com/YI_D/items/89321865d1d5670b4c94)"

#前回からの変更点
・（前回）人差し指のみへの触覚提示　→ （今回）人差し指となか指への触覚提示
・（前回）掌に近い方の関節（腹）のみへの触覚提示（1軸）→ （今回）２つの関節（腹）への触覚提示（2軸）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/a062456d-d47e-015c-261d-806ea8084509.jpeg" width="200px">


#設計(3D CAD)
前回のデバイスは触覚を提示しないときは指の動作を邪魔しないよう折りたたむことができましたが、今回も引き継いだ設計にしています。狙いは大きなVR空間を自由に動き回ることを想定した時に、触覚提示が不要な場合に手の動作に違和感を与えないことです。
1軸目の触覚提示部にモータを仕込み、2軸目を駆動します。1軸目と2軸目を個別に制御可能です。

できれば角度センサを組み込みたかったのですが、以下の理由で断念。
・以前の記事([触覚VRデバイスGravity Grabberを作ってみた](https://qiita.com/YI_D/items/7003d5c502c5c53e54d9))で採用したような安価なポテンショメータはサイズが大きく設置が難しい
・ロータリーエンコーダ入りの小型モータは高価
予算がある方は小型のロータリエンコーダ付きモータを使うとより高度な制御ができます。
本家Gravity Grabberではmaxonのロータリエンコーダ付きモータが使われている。

ただ、今回の構成でもモータドライバ側で電流監視は可能なのでトルク制御のみ可能な仕様。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/1ca9bcee-263a-b074-0656-571b799e45b3.jpeg" width="640px">

◼️Side
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/990be130-3c39-19b0-a152-3253bf83b3b8.png" width="600px">

◼️Top
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/da8124d9-3da3-e4ad-6b94-f9836088e930.png" width="600px">

◼️Bottom
モータ放熱と軽量化のためメッシュ構造にした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/d74da052-a0b6-2c8c-5557-074801369023.png" width="600px">

手にはめるとこんな感じ
（Autodesk Fusion360のレンダリング機能を使いました。）

◼️展開時
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/1c803a52-e0c4-1017-fd9b-ab49476fddfe.png" width="600px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/53d2c385-c108-43fb-9fa8-c772ddaba029.png" width="600px">
人差し指と中指に触覚を提示できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/bd0f9134-7a43-7fc0-fcff-ef66530da1a3.png" width="600px">

◼️折りたたみ時
折りたたまれると、コンパクトにまとまる。指の動作を邪魔しない。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/d2c8e190-ef1f-a28c-749c-32355b20df69.png" width="600px">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/371835/4a585810-1741-aa1f-72b4-32d88db1a594.png" width="600px">


#おわりに
今回は、CADモデル設計のみの掲載でした。パーツが届いたら記事を投稿します。



以上
【Maya】ポリエッジ、カーブに沿ってジョイントを等間隔配置するスクリプト

<font color="red">**2019/08/08　バグ直しました。サブ機能も問題なく動作します。**</font>
2019/08/10　ウィンドウ設定がうまく消せてない不具合を修正。

　髪などの短冊ポリゴンにボーンをセットアップする際に便利そうなスクリプトを作ってみました。

#機能
ポリゴンエッジ、若しくはカーブに沿って任意の数のジョイントを配置することができます。
複数選択にも対応しています。<font color="red">その際エッジはオブジェクトが別になっていることが条件です。</font>
オマケとして末端ジョイントを削除する機能もあります。（本当は別ツールでエクスポート時に自動で外れる方がいいですが）
![polyEdgeToJoint.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/14e70fa7-6fd8-e02a-1b33-a319e2760e08.gif)



#導入方法
###1.
以下のスクリプトファイルをダウンロードし、
https://drive.google.com/open?id=15WQzB4J-7Wq5X_UYXAs-NfEFKUqpZh4w

C:\Users\ユーザー名\Documents\maya\scripts　　（Mayaの全バージョンに導入）
C:\Users\ユーザー名\Documents\maya\20XX\ja_JP\scripts　（バージョン単位の導入）

のいずれかに移動。Mayaを立ち上げていた場合再起動する。

###2.
以下のソースコードをスクリプトエディタのPythonタブに貼り付け、中ボタンでシェルフフィールドにドラッグ＆ドロップ。

```python
import PolyEdgeToJoint
PolyEdgeToJoint.Main().MakeWindow()
```
![polyEdgeToJoint_ScreenShot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462577/57133346-5113-63a3-eeda-944626f50757.jpeg)


#使い方

・ポリゴンエッジ又はカーブを選択（複数でも可)
・スクリプトを起動し、ジョイント名、数を設定した後「作成」を押す

反転チェックボックスにチェックを入れると作成されるジョイントの向きが反転します。

「末端ジョイント削除」を削除を押すとスクリプトで作成したシーン全ての末端ジョイントが削除されます。
（単純に名前の最後に_endとついているジョイントを消す処理です）
Windows Terminalの設定

# 概要
いつの間にか`WindowsTerminal`のPreview版が出ていたので、インストール方法とちょっとした設定のメモを残します。

# インストール
インストールは超簡単です。
Microsoft Storeで`WindowsTerminal`と検索して、出てきたプレビュー版アプリをインストールするだけ。

# 設定
色々とできることはありそうですが、私がやったものだけメモします。

設定は`∨`→`Settings`とクリックしていくか、`Ctrl + ,`を押すと設定のJsonファイルが開く。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161926/5f1d5c05-213d-8b9c-65ca-c80aa5dac8eb.png)


## 新規タブの順番
一覧に表示されているシェルの順序を入れ替える方法です。
`profiles`の項目のJsonの順番を入れ替えると表示順が変更されます。また、順番を入れ替えると起動するためのショートカットの`Ctrl + Shift + {Number}`の数字が自動で変更されます。

## 新規タブの指定
ウィンドウ上部の`+`ボタンもしくは`Ctrl + Shift + t`を押した際に開く新しいシェルで、どのシェルを起動するかを変更する方法です。
`globals`の中にある`defaultProfile`の設定を変更します。このプロファイルに記載する内容は、`profiles`の起動したいシェルの`guid`をコピペしてください。

# まとめ
`WindowsTerminal`についての簡単なメモ書きでした。
また、追加要素があれば編集していきます。

# (おまけ)使用した感想
まとめて複数のシェルが管理・起動できるのは便利で良いと思います。
また、このターミナルもTypeScriptで開発されているようなので、拡張性が高そうです。
これから色んなPluginができると思います。

その反面、単純な感想として、動作が遅い気がしています。
それぞれの各シェルを使用したときと、WindowsTerminalを使用したときで、かなり速度違いを感じます。
特にアプリを立ち上げた直後はかなり遅くなるときがあります。
まだ最適化が甘いんですかね。

現在仕事ではMacのiTerm2を使用していますが、これくらい使い勝手が良くなってくれると良いですね。
[validator.v9] pointerにFieldLevelの独自validateを設定したらnilの場合エラーになる

## 結論
それ用のオプションがあった -> [omitempty](https://godoc.org/gopkg.in/go-playground/validator.v9#hdr-Omit_Empty)

## サンプルソース

```golang:example.go
// MyStruct ..
type MyStruct struct {
	String *string `validate:"omitempty,is-awesome"`
}

func main() {
	validate = validator.New()
	validate.RegisterValidation("is-awesome", ValidateMyVal)

	// ここでomitemptyを設定していない場合は、ValidateMyValが呼び出される前にエラーになる
	s := MyStruct{}
	err := validate.Struct(s)
	if err != nil {
		fmt.Printf("Err(s):\n%+v\n", err)
	}

	// omitemptyがなくても普通に動く
	str1 := "awesome"
	s.String = &str1
	err = validate.Struct(s)
	if err != nil {
		fmt.Printf("Err(s):\n%+v\n", err)
	}

	// omitemptyがなくても普通に動く
	str2 := "not awesome"
	s.String = &str2
	err = validate.Struct(s)
	if err != nil {
		fmt.Printf("Err(s):\n%+v\n", err)
	}
}

// ValidateMyVal implements validator.Func
func ValidateMyVal(fl validator.FieldLevel) bool {
	return fl.Field().String() == "awesome"
}
```

## 言い訳
問題が起きるのが`RegisterValidation`を使って、
独自のvalidationを追加したときだけのように見えたため、気づくのが遅れました。

もう少し影響のありそうなものを使っていれば早めに気づいたかも。

## 教訓
どうしてこれぐらいのことができないんだーと思ったら、
ソースを読もうとせずにドキュメントに一通り目を通すこと。。
【Typescript×React】tsconfig.jsonの設定項目を詳しく紹介

つい一週間前にTypescriptに入門した新卒エンジニアです。

React × Reduxのアプリケーションにおいて、Typescriptを導入したのですが、エラーを吐いてしまうことが度々あり、構文に問題が見つからず途方に暮れているところで、tsconfig.jsonの設定を見直してみると、問題なくコンパイルできたということがあったので、今回はその設定項目について細かくまとめていきたいと思います。


まず現在私が作成しているファイルのtsconfig.jsは以下のようになっています。（create-react-app appname --typescriptで作成すると以下のようになっているはずです。）

一つひとつ説明していきます。

```js:tsconfig.json

{
// コンパイルに関するオプションを設定
  "compilerOptions": {
// ECMAScript target versionを指定
    "target": "es5",
// ビルドする際に含めるlibraryファイル
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
//JSファイルのビルドを可能に
    "allowJs": true,
//暗黙のany型をエラーに
    "noImplicitAny": false,
//型宣言ファイルの型チェックをスキップする
    "skipLibCheck": true,
// CommonJSモジュールとESモジュール間の相互運用性を,すべてのインポート用に名前空間オブジェクトを作成することで可能に
    "esModuleInterop": true,
//エキスポートしないモジュールからのインポートを許可するか（型チェックのみに影響）
    "allowSyntheticDefaultImports": true,
//厳密な型チェックオプションを有効に
    "strict": true,
//大文字小文字を区別して参照を解決するようにする
    "forceConsistentCasingInFileNames": true,
//生成されるモジュールコードを指定
    "module": "esnext",
//モジュール解決戦略を指定する: 'node'（Node.js）または 'classic'
    "moduleResolution": "node",
//自分で型定義を行う必要なく json ファイルを扱うことを可能に
    "resolveJsonModule": true,
//各々のファイルを別のモジュールとして変換
    "isolatedModules": true,
    "noEmit": true,
//tsx拡張子においてJSXサポートを行うか
    "jsx": "preserve"
  },
  "include": [
    "src"
  ]
}



```
Babelの出力から"use strict"を除去したい

BabelでJavaScriptをコンパイルするとデフォルトで`"use strict";`が付きます。
ソース・コードがstrictに書かれたものなら良いのですが、いろいろ事情があってstrictではない場合もあり、`"use strict";`を付けたくないこともあります。

以下の方法で`"use strict";`なしの出力ができました（Babel 7.5で確認）。

##`sourceType`オプションを使う
`sourceType`オプションに`"script"`を指定すると`"use strict";`が出力されなくなります。このオプションのデフォルトは`"module"`なので、デフォルトのままだと出力は自動的に`strict`モードになります。


```..babelrc
{
  "sourceType": "script"
}
```

詳細は以下の公式ドキュメントを参照してください。
[公式ドキュメント：Babel>Docs>Usgage>Options#misc-options](https://babeljs.io/docs/en/options#sourcetype)

##CommonJSに変換する場合は`strictMode`オプションでも可

トランスフォーム・プラグイン（`@babel/plugin-transform-modules-commonjs`）を使ってCommonJSに変換する場合は、`"strictMode": false`を指定して出力を抑止することもできます。


```..babelrc
{
  "plugins": [
    ["@babel/plugin-transform-modules-commonjs", {"strictMode": false}]
  ]
}
```

詳細は以下の公式ドキュメントを参照してください。
[公式ドキュメント：Babel>Docs>General>Plugins#other ・strict-mode](https://babeljs.io/docs/en/babel-plugin-transform-strict-mode)


以上です。
Cloud9環境の構築

2019/8/6

AWSにEC2を立ち上げてWordpress環境を構築しているが、あまり使っていないので、Cloud9用に使うことにする。

1. AWSマネジメントコンソール上で「cloud9」で検索
2. 「Create environment」ボタンをクリック。
3. Step1で、適当に名称を入力し「Next」。
4. Step2で、「Connect and run in remote server (SSH)」を選択し、Userに「ec2-user」、Hostに「EC2の固定IPアドレス」を入力。
5. EC2上で、「.ssh/authorized_key」に公開キーを追加する。
6. EC2上で、nodejsをインストールするため、以下のコマンドを実行。

```sh
curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum -y install nodejs
```

7. Step2で、「Next step」ボタンをクリック。エラーが出たら上記の5と6の内容を再確認。
8. Step3で、「Create environment」ボタンをクリック。
9. 「AWS Cloud9 Installer」画面が表示されるので、「Next」をクリック。

とりあえず今日はここまでにする。

参考サイト
https://blog.simmon.design/aws-cloud9-tutorial-ssh/
ESRGAN論文まとめ

# ESRGAN
[ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks](https://arxiv.org/pdf/1809.00219.pdf)

Xintao Wang, Ke Yu, Shixiang Wu, Jinjin Gu, Yihao Liu, Chao Dong, Yu Qiao, Chen Change Loy
Published in ECCV Workshops 2018

## 背景
###SISR
低解像度の画像と高解像度にする課題

SRCNN (最初のアプローチ)
|
PNSR-oriented approaches (人間的にはよく見えない)
|
SRGAN (Perceptual-driven methods)
|
ESRGAN (the proposed method)

## 提案手法
### アーキテクチャ (*Generator*)
- バッチノーマリゼーションを除去
学習データとテストデータで性質(statistics)が違うと好ましくないartifactsが出てきて、生成能力が制限される。
BNレイヤを取り除けば生成能力も上がるし、計算も減ってメモリにとってもありがたい

- Residual in Residual Dense Block (RRDB)
レイヤの出力を次のレイヤだけでなく別のレイヤにも加える
SRGANにあるresidualブロックよりも深層で複雑。メインの流れにはDense blockを用いている
=> Dense blockによってモデルの容量が大きくなる。

#### techniques
- residualスケーリング
main pathに値を加算する前に0~1の定数をかける
=> 不安定さを防ぐ

- smaller initialization
パラメータの初期値の分散が小さい方が、residual構造の学習が楽

### Relativistic *Discriminator* (RaGAN)
通常の識別器は本物の画像に対して1を偽物の画像に対して0を出力するように訓練するが、
Relativistic識別器では

1. 本物の画像に対しては、non-transformed(シグモイド関数に入れる前)の本物の画像の出力からnon-transformed(シグモイド関数に入れる前)の偽の画像の出力のミニバッチの平均を引いてからシグモイドに入れる。
2. 偽物の画像に対しては、non-transformed(シグモイド関数に入れる前)の偽の画像の出力からnon-transformed(シグモイド関数に入れる前)の本物の画像の出力のミニバッチの平均を引いてからシグモイドに入れる。

損失関数について
SRGANは生成器からのデータの影響しか受けないが
ESRGANは実データと生成データの両方の影響を受ける

=> エッジに強くなり、テクスチャが細かくなる

### Perceptual Loss
活性化の**前に**特徴を制限する

これにより２つの障害を克服できる

1. 活性化された特量がまばら。(特に深いネットワークの場合) -> 弱いsupervisionと劣った性能
2. 活性化された特徴を使うと、明るさが不安定になる

### Network Interpolation (the network interpolation strategy for balancing perceptual quality and PSNR)
PSNRベースのモデルを学習し、GANベースのモデルをfine-tuningによって得る
メリットが2つ

1. 適切な比率に対して、意味のある結果をもたらす
2. 再訓練することなく、質と忠実度を安定させられる。

それぞれの提案手法を使った場合と使わなかった場合で比較していくと、
全て有効性が確かめることができた。
php-master-changes 2019-08-06

今日は preloading の実装修正、ドキュメントの更新、循環参照 GC の実装修正、VM の最適化の修正があった！

2019-08-06
## dstogov: Fixed bug [#78376](https://bugs.php.net/bug.php?id=78376) (Incorrect preloading of constant static properties)
- https://github.com/php/php-src/commit/3fc0e2bb80734c052dc1e0c34f93a3a7f4086557
- [7.4~]
- ext/opcache で、preloading 時に定数で初期化される static プロパティが正常に初期化されなかった問題の修正

## derickr: Update NEWS for PHP 7.4.0beta2
- https://github.com/php/php-src/commit/6da7f015e1ed29db0e61db7935420f478d0495ab
- [7.4~]
- NEWS で、PHP 7.4.0beta2 のリリース日を 8/8 と更新

## derickr: Update NEWS for 7.4.0beta3
- https://github.com/php/php-src/commit/2811e924d1b7295aba181cc05f9997635d04fec4
- [7.4~]
- NEWS で、PHP 7.4.0beta3 用のエントリを追加

## dstogov: Don't set GC_HAS_DESTRUCTORS flag if destructors were already called
- https://github.com/php/php-src/commit/170a3f871ff762b7a52f502acdd73386a359e8bc
- [7.4~]
- 循環参照 GC の実装で、デストラクタがすでに呼ばれていれば GC_HAS_DESTRUCTORS フラグをセットしないよう修正

## dstogov: Preloading is not comatible with dl() function
- https://github.com/php/php-src/commit/d5d76ea6e7a13db454e7711c7d7cf614652e4a9d
- [7.4~]
- ext/opcache で、dl() が preloading とあわせては使えないむね警告を出すよう修正

## dstogov: typo
- https://github.com/php/php-src/commit/ef355564983ba972dcbd9081a5adb7c1580a5ccc
- [7.4~]
- ext/opcache で、↑の typo を修正

## dstogov: Inline zend_zval_ptr() in executor explicitely (only on hot paths)
- https://github.com/php/php-src/commit/d1fd4607d0df0e13f6fb2e278f9af108acc241b9
- [7.4~]
- extcutor 内で zval_ptr_dtor() のインライン化を雑にマクロでやっていたのをホットパスでのみ明示的にやるよう修正
Qiita Jobsにimgixを導入し、画像サイズを大幅に改善しました

<img width="600px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109606/8ae33ded-c5c7-000d-c029-572a86245e34.png">

Qiita Jobsに[imgix](https://www.imgix.com/)という画像向けCDNを導入し、画像サイズを大幅に改善しました。
[Qiita Jobs](https://jobs.qiita.com/)とは、QiitaのIncrements株式会社が提供する転職サービスです。

## Qiita Jobsでの改善結果
最も改善したページは[Qiita Jobsのチーム一覧ページ] (https://jobs.qiita.com/development_teams)で、WebPageTestの結果では、ページ全体サイズがおよそ22.9MBから1.09MBまで改善しました。およそ95%の削減です。

### imgix導入前のWebPageTestの結果
<img width="968" alt="スクリーンショット 2019-07-17 11.00.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109606/5e6b9556-0aec-772a-d588-52c073d3fcde.png">

### imgix導入後のWebPageTestの結果
<img width="965" alt="スクリーンショット 2019-07-17 16.01.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109606/32b49ebf-3a43-32e8-cdeb-8e542277dfb9.png">

これほど大きく改善した理由は、もともとユーザーがアップロードした画像をそのまま表示させていたこともあります（申し訳ありません）。導入前は画像のリサイズも圧縮も出来ていませんでしたが、**imgixによって手軽にリサイズや圧縮が出来るようになりました**。

## imgixでは何ができるのか？
imgixは簡単に言うと**URLパラメーターによって画像をリアルタイムでリサイズ・圧縮などが出来る画像向けCDN**です。

例えばS3に`s3://qiita-bucket/image-300w-300h.jpg`というユーザーのプロフィール画像がアップロードされているとします。
これを100pxにリサイズしたいのであれば、`https://qiita.imgix.net/image-300w-300h.jpg?w=100`というURLでアクセスすれば横幅100pxにリサイズしてくれます。さらに**リサイズ後の画像はCDN側にキャッシュ**されるため、2回目以降は高速にユーザーへ配信してくれます。

## なぜimgixを採用したのか？
imgixのような画像向けCDNは他にいくつかあるのですが（ImageFluxやFastly Image Optimizerなど）、なぜQiita Jobsでimgixを採用したのかは、以下のような理由があります。

- 従量課金制であり、**最低10ドル〜という低価格ではじめられる**（そして最初は10ドル無料）
- **サポートの返信が丁寧で早い**（大体12時間以内には返してくれる。※英語のみ）
- **特に問い合わせなどは必要なく導入できる**

Qiita Jobsは規模で言えばそれほど大きくないため、導入に問い合わせが必要なく、そして低価格から始められる点を魅力に感じ、採用しました。

他にも以下のようなメリットがありますが、他サービスも類似機能は提供されています。

- 導入が簡単（Rubyであれば[imgix-rb](https://github.com/imgix/imgix-rb)などの公式ライブラリがある）
- webp対応ブラウザ（Chromeなど）には自動でwebp形式で返してくれる

AWSのLambda@Edgeでも似たようなことをできるのですが、個人的に管理コストが大変だったという経験があるので導入は辞めました。（少し昔に[Lambda@Edgeからimgixに画像CDNを移行した話 - Qiita](https://qiita.com/hareku/items/18421718c1a70de17d28)という記事を書きました。）

## Qiitaにも導入されるかも…？
実はQiitaにもimgixを試験導入しています。

この猫ちゃんのgifもimgixによって配信されています。（URLを見て`qiita-user-contents.imgix.net`になっていれば試験導入中ということです。）
![cat.gif](https://media.giphy.com/media/NqZn5kPN8VVrW/giphy.gif)

ただ**Qiitaでは記事数が数十万件以上**あり、そして1記事あたりに2つの画像が使用されているため、多くのimgixリソースを消費します。さらにQiitaでは画像サイズをユーザーが自由に指定できるなどの仕様があるため、`srcset`を用いた最適な画像配信が難しいという事情もあるのです。

このあたりの導入可否は、また意思決定を行い次第、皆さまにお知らせいたします。
第一回機械学習入門【Chainer】

# はじめに
久しぶりの投稿です。夏休みに入ったのでQiita投稿を再開しようと思います。さて、本題ですが、今回は機械学習の基礎を備忘録としてここに書き留めておきます。
第一回では、パーセプトロンとニューラルネットワークの軽い説明をする。
ライブラリは **Chainer** を使用します。
## 学習とは？
学習させた！って言うけど、なにを学習してんねん！ってずっと思っていました。こういう人よくいると思います。
結論から言うと、 **W(重み)** を学習させているんです！
入力された結果から、適切な値が出力されるいい感じの **W(重み)** を機械学習で求めている！
## パーセプトロンとは
パーセプトロンとは複数の入力から一つの結果を出力するモデルのこと。
<img width="584" alt="スクリーンショット 2019-08-06 22.43.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/4bb9ee38-e27a-eb3b-c966-0236cd1972e7.png">
yを求める式は

```math
y = w1x1 + w2x2
```
で求める事ができる。 yは `出力結果` , xは `入力値` wは `重み`とする。　
実際には、この式に `バイアス ` を加えたものを使用する。

```math
y  = w1x1 + w2x2 + b
```

##ニューラルネットワーク
ニューラルネットワークとは、パーセプトロンを3つつなげたモデルのことを言う。
<img width="637" alt="スクリーンショット 2019-08-06 23.12.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/485eceac-de78-20e9-0529-76efa47aff13.png">
ニューラルネットワークでは、分類問題や回帰問題を学習することができる。

```math
h = xw1 + b 
```
```math
y = hw2 + b 
```
で求めることができる。
また、ニューラルネットワークでは ``活性化関数`` というものを使用する。活性化関数は、モデルの表現力を更に構造させるために使用する。上の図の場合だと、入力層から中間層にかけて計算した結果 `h` と中間層から出力層にかけて計算した `y`　に使用する。
<img width="631" alt="スクリーンショット 2019-08-06 23.26.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/4771465f-8bab-cc76-d4f2-c7341bfb4fd9.png">
活性化関数は多くの種類が存在していて、 `Relu関数` , `SoftMax関数` , `恒等関数`　など様々である。

##　教師ありニューラルネットワーク
教師ありニューラルネットワークは、出力データと教師データを比較することで学習を行う。 `` 損失関数 を使用し、 出力データと教師データの誤差を求め、その誤差をなるべく小さくなるように重みを決める。``
損失関数の代表的なものを取り上げると、 `交差エントロピー` や `二乗和誤差` がある。
そして、その誤差の最小値を見つける方法の代表的なものは、 `SGD（確率的勾配降下法）` や `Adam`　がある。

**学習の手順**

**1** .ランダムに W(重み) と b(バイアス)を設定する。
**2** .入力データから出力結果を求める
**3** .出力結果と教師データを使用し、``誤差を求める``。
**4** .その誤差から、``W(重み)の値を更新``
**5** . 2に戻る
#　終わりに
今回は、ニューラルネットワークのざっくりとした説明をした。（自分自身がざっくりとしかわかっていないため）。
次回は、誤差から重みの値を更新する方法を具体的に書こうと思う。
最終的には、強化学習のQ学習とかを理解する。
もちろんC++も書いていきます。
laravelで1トランザクションで複数クエリを実行する

###①transactionメソッドを使用する。
・ポイント
例外がスローされると、自動的にロールバックされる

```
DB::transaction(function() {
    // クエリ発行
}
```

（例）

```
    public function userUpdate ($request, $userId, $storeId) {
        $postData = $request->post();
        $result = DB::transaction(function() use ($postData, $userId, $storeId) {
            DB::table('users')->where('id', $userId)->update($postData['users']);
            DB::table('stores')->where('id', $storeId)->update($postData['stores']);
            return true;
        });
        return $result;
    }
```

###②beginTransactionメソッドを使用する。
```
    DB::beginTransaction();
    try {
        // クエリ発行
        DB::commit();
    } catch (\Exception $e) {
        DB::rollBack();
    }
```

(例)

```
    public function userUpdate($request, $userId, $storeId)
    {
        $postData = $request->post();
        DB::beginTransaction();
        try {
            DB::table('users')->where('id', $userId)->update($postData['users']);
            DB::table('stores')->where('id', $storeId)->update($postData['stores']);
            DB::commit();
        } catch (\Exception $e) {
            DB::rollBack();
        }
        return true;
    }
```
Amazon DocumentDBのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Amazon DocumentDB](https://www.slideshare.net/AmazonWebServicesJapan/20190625-aws-black-belt-online-seminar-amazon-documentdb)」の自分向けメモ
DocumentDB知ってるけど使ったことない......レベルの人向け


## ドキュメント指向DBとは
 - クライアント、アプリ間はJSON、アプリとDBはテーブルで変換が必要
 - JSON-likeで保持することでORマッパーの利用も限定的になる
 - クライアントからDBまで一気通貫でデータ連携できる
 - 柔軟性のあるスキーマ、インデックス
 - Javascriptで表現可能なクエリ
 - 開発を高速にする

## 概要
###  既存の課題
 - セットアップが大変
 - 管理が大変
 - スケールラビリティ
 - セキュリティの担保
 - バックアップの整合性

### 特徴
 - 秒間100万リクエスト
 - 15台のリードレプリカ
 - 数分でスケールアップ
 - オートスケーリング

#### フルマネージド
 - 従量課金
 - 自動フェイルオーバー
 - S3へのバックアップ
 - データ冗長

#### MongoDBとの互換性
 - MongoDB driverやツールが利用可能

#### セキュリティ
 - VPC内
 - 暗号化
 - 最適化されたデフォルト設定値
 - 第三者の認証

#### バックアップ
 - 性能影響がないバックアップ
 - 最大35日のポイントインタイムリカバリー
 - 35日以上はスナップショット取得で保存可能

### 概要まとめ
 - JSON-likeなデータストア
 - MongoDBとの互換性
 - 高可用性
 - 高パフォーマンス

## アーキテクチャ
### コンピュートとストレージの分離
 - 個別にスケールリング可能

### 6コピーとクオラムによるデータの堅牢性
 - 3つのAZに2つずつコピーする
 - AZが障害になっても、問題なし

### エンドポイント
 - クラスタエンドポイント：書き込み用
 - リーダーエンドポイント：読み込み用

### 障害復旧
 - 他インスタンスにフェイルオーバー

### バックアップ
 - S3にバックアップ
 - 性能影響のないストリーミングバックアップ

### MongoDBの構成と異なり、シャーディングは不要
 - 読み込みスケール：15代のリードレプリカ
 - 書き込みスケール：インスタンスのスケールアップが容易
 - ストレージスケール：64TBまでストレージ自動拡張

## 使い方
### サービス概要
 - DBクラスタ
    - マスタとリードレプリカをひとめまとめにしたもの
 - クラスタエンドポイント
    - フェイルオーバーが発生しても常にマスタを参照する
 - リーダーエンドポイント
    - リードレプリカ群を指し示す

#### 暗号化
 - 通信の暗号化
    - TLS対応
    - セキュリティグループによるアクセス制御
    - IAMポリシー
 - 保存データの暗号化
    - AES-256を使用
    - KMSを使用

#### 監査ログ
 - Audit logをCloudWatch Logsに直接転送可能

#### モニタリング
 - CloudWatchメトリクスを収集
 - クエリチューニングやスケールアウト、アップを判断できる

### 使い分け
#### RDSを選ぶ場合
 - トランザクションあり
 - 金融、認証などの事前に定義されたスキーマに従う
 - OSS利用時

#### DynamoDBを選ぶ場合
 - スケーラブル

### 移行パターン
 - ダンプツール
    - MongoDB標準ツールだけで可能
    - 停止時間は長い
 - DMS（Database Migration Service）を活用
    - 停止時間は数分レベル
    - フルロードが終わるまで時間がかかる
 - ハイブリッド
    - アプリ停止時間は短い
    - 手順は複雑

## 料金
 - インスタンス
    - サイズ×時間
 - I/Oカウント
    - リクエスト数
 - ストレージ
    - 容量×月
 - バックアップ
    - 容量×月


## まとめ
 - DBの選択肢が増える
 - クラスタ運用なしに堅牢かつ高速なドキュメント指向DBの利用が可能
Twitterのbotでcsvに記載のアイテムの中からランダムに1つリプライする機能

執筆日時:2019.08.06
初投稿です。

#1.botを使うための準備
python 3.6.1
macOS 10.13.6
以下を参考にして鍵とtokenを取得してください
https://qiita.com/yuki_bg/items/96a1608aa3f3225386b6

#2.python書き書き
##0.準備
pipでtwitterのモジュールをinstallします
```pip install twitter```

##1.Twitterの認証
```
# OAuth
ACCESS_TOKEN_KEY = 'hoge'
ACCESS_TOKEN_SECRET = 'fuga'
CONSUMER_KEY = 'hogehoge'
CONSUMER_SECRET = 'fugafuga'

oauth = twitter.OAuth(ACCESS_TOKEN_KEY,
                      ACCESS_TOKEN_SECRET,
                      CONSUMER_KEY,
                      CONSUMER_SECRET)
```
##2.csvから曲データ読み込み
csvを読み込んで行数を変数len_numberに格納しています。

```
# csvから曲データを読み込み
f = open("database.csv", "r")
csv_data = csv.reader(f)
music_data = [ e for e in csv_data]
number = len(music_data)
len_number = int(number) - 1
```

##3.フォローしているユーザのみ対象にする
以下を参考にAPIを呼び出しています
https://syncer.jp/Web/API/Twitter/REST_API/GET/friends/ids/

```
# Retrieve friends IDs
SCREEN_NAME='account'
twitter_api = twitter.Twitter(auth=oauth)
friends = twitter_api.friends.ids(screen_name=SCREEN_NAME, count=5000)
friends_ids = ','.join(map(str, friends['ids']))
```

##4.特定のリプライに対してランダムにアイテムを返す
```
for tweet in stream.statuses.filter(follow=friends_ids):
    if tweet['in_reply_to_screen_name']=='account':
        if '@account [反応させたい文字列]' in str(tweet) :
            random_number = random.randint(0,len_number)
            tweet_test = '@' + str(tweet['user']['screen_name']) + ' ' + music_data[random_number][0]
            try:
                twitter_api.statuses.update(status=tweet_test)
            except:
                pass
```




全コードは[github](https://github.com/doragunicyi/twitter_task_bot)に上げてあります。
DANCERUSH STARDOMというダンスゲームの課題曲を教えてくれるbotを作りました(今は動かしてません)
Lambdaで複数値を持ったヘッダーを返す方法

#はじめに
Lambda+S3でWebアプリを作った際にLambdaからSet-Cookieで複数のCookieを同時に設定したかったのですが、ちょっとハマったのでメモがてらここに残しておきます。
#環境
- Node.js 10.X
- Lambdaプロキシ統合利用
- メソッドはGET

#コード
multiValueHeadersで設定できます。valueを配列にすれば良いだけみたいですね。ちなみに僕はJSONをJSON.stringifyして1時間くらいハマりました。気をつけましょう。

```js
exports.handler = async (event, context, callback) => {
    const response = new Response();
    response.statusCode = 200;
    response.multiValueHeaders = { "Set-Cookie": [`KEY1=VALUE1`, `KEY2=VALUE2`] };
    response.body = JSON.stringify({ result: "succeed" });
    callback(null, response);
};

class Response {
    constructor() {
        this.statusCode = "";
        this.headers = {};
        this.multiValueHeaders = {};
        this.body = {};
    }
}
```
ejs のテンプレート内で await する

今時 ejs ！？という声はさておき…
ひさしぶりに ejs をいじっていたところ、テンプレートの中からリモートサーバの API にアクセスし、ダウンロードしたデータを HTML に加工したい欲求がわきました。
こういった時は `ejs.render()` にデータを渡して使うのがセオリーですが、 .ejs ファイルが多数ある場合、ファイルが要求するデータを逐一選定して渡すというのは現実的ではありません（私の場合）。

そこで、 `include()` が URL に対応していればなぁ、と思いつつ色々試していると、こんなエラーメッセージが。

```
If the above error is not helpful, you may want to try EJS-Lint:
https://github.com/RyanZim/EJS-Lint
Or, if you meant to create an async function, pass async: true as an option.
```

どうも `ejs.render()` に `async: true` を渡すとテンプレート内で await できるようになる模様。
そんなオプションあったっけ？（ [ウェブサイト](https://ejs.co/#docs) を見る）ありますね。あれぇ？

## axios を間接的に呼び出す例

ejs の呼び出し元で axios を使う関数を定義し、それをテンプレートに渡します。

```javascript
const axios = require('axios')
const ejs = require('ejs')

const request = async config => {
  const response = await axios(config)
  return response.data
}

// async 関数内に記述する想定
const html = await ejs.render(text, { request }, { async: true })
```

テンプレートでは `request()` 関数に `await` を付けて呼び出すだけ。

```html
<% const data = await request({
  method: 'get',
  url: 'https://api.mymemory.translated.net/get',
  params: {
    q: 'こんにちは。最近は暑いですね。',
    langpair: 'ja|en'
  }
}) %>
<% if (data) { %>
  <!-- 煮るなり焼くなり好きにする -->
<% } %>
```

## 任意の JavaScript ファイルを実行する例

かなり荒っぽいですが、こういうこともできます。

```javascript
const ejs = require('ejs')
const path = require('path')

const execute = async relativePath => {
  const absolutePath = path.resolve(__dirname, `./methods/${relativePath}`)
  const method = require(absolutePath)
  return await method()
}

// async 関数内に記述する想定
const html = await ejs.render(text, { execute }, { async: true })
```

使い方は同じ。

```html
<% const data = await execute('hoge/fuga.js') %>
<% if (data) { %>
  <!-- 煮るなり焼くなり好きにする -->
<% } %>
```

`hoge/fuga.js` では `module.exports` に関数を設定する前提です。

## ところがぎっちょん

後で気付いたんですが、どうも `{ async: true }` を設定すると `include()` が Promise を返すようになってしまうようです。 `await` してもエラーになります。つまり実質的に `include()` が使えません。
色々試した結果、あまり気は進みませんが、擬似的な `include()` を作ることにしました。

```javascript
// アロー関数ではない点に注意
const includeSync = function (relativePath, option) {
  const srcDir = path.dirname(this.srcPath)
  const absolutePath = path.resolve(srcDir, relativePath)
  const text = fs.readFileSync(absolutePath, 'utf8')
  const nextOption = Object.assign({ srcPath: absolutePath, includeSync }, option)
  const html = ejs.render(text, nextOption, { filename: absolutePath })
  return html
}
```

ただし、 `ejs.render()` のオプションに `srcPath` として .ejs ファイルの絶対パスを付与する必要があります。

```javascript
const html = await ejs.render(text, { srcPath, includeSync, execute, request }, { async: true, filename: srcPath })
```

使い方はほぼ同じです。

```javascript
<%- includeSync('./ejs/_component.ejs', { hoge }) %>
```

`includeSync()` の読込先でも `includeSync()` は使えますが、 `execute()` や `request()` といった非同期関数は使えません。もうこれはどうしようもないかと…。

## おまけ

Promise エラーが発生しやすくなるので、処理を止めたくなければ下記コードを記述しておくと良いかと。

```javascript
process.on('uncaughtException', console.error)
process.on('unhandledRejection', console.error)
```

本当は個別に `catch()` を書いてハンドリングするべきなんですけどね🤮
含有を真偽で扱うHashSet / Dictionary (C#)

# やりたいこと
- あらかじめ限定しない任意の「キー」と「真偽値」のペアを扱いたい。

# やってみたこと
- まず、単純に`Dictionary<TKey, TValue>`で実装しました。

```cs:
var inventory = new Dictionary<string, bool> { };
```
```cs:
var itemID = "檜の棒";
inventory [itemID] = Validate (itemID);
```
```cs:
if (inventory.ContainsKey (itemID) && inventory [itemID]) {
	// 持っている
}
```

- チェックが少々面倒です。
- キーの存在で所持を表せるのに、さらに真偽値を持つのはなんだか冗長です。

# `HashSet`で実装
- HashSetを拡張して、真偽値で制御するようにしました。

### コード

```cs:BooleanHashSet.cs
using System.Collections.Generic;

public class BooleanHashSet<T> : HashSet<T> {

	public bool this [T obj] {
		get { return Contains (obj); }
		set { if (value) { Add (obj); } else { Remove (obj); } }
	}

}
```

### 使い方

```cs:
var inventory = new BooleanHashSet<string> { };
```

```cs:
var itemID = "檜の棒";
inventory [itemID] = Validate (itemID);
```

```cs:
if (inventory [itemID]) {
	// 持っている
}
```

# 改めて`Dictionary`で実装
- こちらの方法は、不要なデータを抱えていますが、HashSetより、ガベージは出にくそうだし、速度的にも有利っぽく見えます。(未検証)

```cs:BooleanDictionary.cs
using System.Collections.Generic;

public class BooleanDictionary<TKey> : Dictionary<TKey, bool> {

	public new bool this [TKey key] {
		get { return ContainsKey (key) && base [key]; }
		set { base [key] = value; }
	}

}
```

# まとめ
- 「`Dictionary<TKey, bool>`で、何らかのキーと真偽値を扱うが、キーがない場合は偽としたい」という場合に使うのが、`BooleanDictionary`です。
- あらかじめ、キーの総数あるいは内容が確定できず、逐次出現するような場合に使います。
    - あらかじめ確定できる場合は、素の`Dictionary`が使えます。
- キーが次々と現れては消えるなど、「`Dictionary`だと、キー値ペアが蓄積されて不利益だ」という場合に使うのが、`BooleanHashSet`です。
    - あるいは、単に、bool値を持つHashSetにインデクサでアクセスできるクラスです。
Railsのerbをslimに変更する方法

#はじめに
この記事では、自身の備忘録も兼ねてrailsのデフォルトで使用しているテンプレートエンジンであるERBからSlimに変更する方法を記載していきます。

##準備
Gemfileにslim-railsとhtml2slimを追加します。

```ruby:Gemfile
gem 'slim-rails'
gem 'html2slim'
```
bundleを実行し、gemをインストールします。

```terminal
$ bundle 
```

##erbを削除し、slimに変更する

```terminal
$ bundle exec erb2slim app/views/layouts/ --delete
```

このような手順でerbをslimに変更できます。