OmniAICreator/Qiita-1.07M huggingface dataset:
selectboxのCSS設定の謎を解け！

# 前置き
デザインHTML・CSSを適用している際、
selectboxに不思議なCSS設定があったので、共有がてらメモ

# 何が起こったか
- selectboxを押しても反応しない
- selectbox内の特定の選択肢がなぜか表示されない

# selectboxを押しても反応しない
- クラスを消すと反応するようになっていた
- selectboxに直接設定されているCSS設定自体には妙な所が見当たらない

```html
<select class="selectbox">
  <option value="">選択してください</option>
  <option value="東京都">東京都</option>
  ...
  <option value="北海道">北海道</option>
</select>
```


## 通常疑うところ
- JSのselectのイベントで`preventDefault`や`return false`されている
- CSSで`pointer-events: none`が設定されている

## 実際
- selectbox内のoptionに`display: none`が設定されていた。

**optionの表示が消えてたらそりゃクリックしても反応ないよね！！！**

多分JSで表示するかなにかするために消していたのだと想像（実際そんなことはなかったんだけど）

```css
.selectbox > option {
  display: none;
}
```

## 解決策
- 上記設定を消す。

# selectbox内の特定の選択肢がなぜか表示されない
上記とは別のHTMLの話です。

この構造を

```html
<select class="selectbox">
  <option value="">選択してください</option>
  <option value="東京都">東京都</option>
  ...
  <option value="北海道">北海道</option>
</select>
```

下記のように変えたときに、なぜか「東京都」が消えました。
実は東京都どころではなく、各optgroupの最初の選択肢が消えていました。

```html
<select class="selectbox">
  <option value="">選択してください</option>
  <optgroup label="関東">
    <option value="東京都">東京都</option>
    ...
  </optgroup>
  <optgroup label="北海道・東北">
    <option value="北海道">北海道</option>
    ...
  </optgroup>
</select>
```

## 原因
`option:first-child`なる無体なCSS設定が存在しました。やっぱり消してる。


```css
.selectbox option:first-child {
  display: none;
}
```

こちらはクリックした時、「選択してください」の項目を表示させないために設定しているようでした。
しかし設定が雑です。

## 解決策
「選択してください」にクラスを当てて、

```html
<select class="selectbox">
  <option class="option-default" value="">選択してください</option>
  <optgroup label="関東">
    <option value="東京都">東京都</option>
    ...
  </optgroup>
  <optgroup label="北海道・東北">
    <option value="北海道">北海道</option>
    ...
  </optgroup>
</select>
```

表示を消す。
元々やりたかったことを活かしつつ、構造が変わっても悪さをしなくなりました。

```css
.option-default {
  display: none;
}
```

# 動く（動かない）コードサンプル
反応しなかったり、消えてるのが実際どんな感じなのかご覧いただけるようにしてます。

- https://codepen.io/yama-t/pen/ZgrmNJ

# まとめ
- `:first-child`のような擬似クラスは便利だけど、構造が変わった時までカバーできない。
- 可能な限り、クラスを当てて明示的に指定した方が変なことにならない。
- **要素セレクタ指定で無闇にoption消さないで。**
[基礎知識]シーン上のデータを取得する方法

# 概要
Unityでシーン上にあるGameObjectや、それにアタッチされているコンポーネントを取得する方法。

# GameObjectの取得
### Inspectorで設定する
検索をかけるまでもなく、実行前の状態で既にシーン上にあるものにのみ有効な方法。
シリアライズ可能なフィールドを書き、UnityのInspector上で設定する。

``` cs:Sample.cs
public class Sample : MonoBehaviour
{
    // [SerializeField]を書くことで、シリアライズ可能なフィールドを宣言できる。
    [SerializeField] private GameObject _object;

    // publicなフィールドでも可。
    // public GameObject _object;
}
```

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67270/aed37d19-aaa7-8430-3d3d-ffecd1016a5a.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67270/d3cdb9bc-d161-9873-b3a1-8264dbefb5bb.png)


### GameObject名で検索する
GameObjectに設定された名前で検索をかけます。

``` cs
GameObject obj = GameObject.Find("探したいオブジェクト名");
```

### アタッチされているコンポーネントで検索する
特定のコンポーネントをアタッチしていた場合に使用可能だが、パフォーマンスが悪い。

``` cs
GameObject obj = FindObjectOfType</*指定したいコンポーネント*/>().gameObject;
```

### タグで検索する
UnityではGameObjectにタグを設定でき、そのタグを使って検索をかけます。
ただし探したいタグは、あらかじめタグマネージャーに設定されたものである必要があります。
`Find`や`FindObjectOfType`に比べ、安定した実行速度を誇る。

``` cs
// 指定したタグを持つGameObjectを 1つ 取得する。
GameObject obj = GameObject.FindWithTag("探したいオブジェクトに設定されたタグ");

// 指定したタグを持つGameObjectを 全て 取得する。
GameObject[] objs = GameObject.FindGameObjectsWithTag("探したいオブジェクトに設定されたタグ");
```

# コンポーネントの取得
### Inspectorで設定する
方法はGameObjectの時と同様のため、画像での説明は省略。

``` cs:Sample.cs
// 欲しいコンポーネントを仮に Example とする
public class Sample : MonoBehaviour
{
    [SerializeField] private Example _object;

    // または
    // public Example _object;
}
```

### GetComponentで取得する
`GetComponent`関数で取得する。
指定したGameObjectからコンポーネントを取得するものなので、GameObjectの取得と組み合わせることも可。

``` cs
// 自身を持つGameObjectにアタッチされた、他のコンポーネントを取得する場合
var cmp = this.gameObject.GetComponent</*欲しいコンポーネント*/>();

// CUBE という名前のGameObjectから取得したい場合
var cmp = GameObject.Find("CUBE").GetComponent</*欲しいコンポーネント*/>();
```

### シーン内から取得する
GameObjectの時に使った`FindObjectOfType`の本来の用途。
頻繁に使うべきではない。

``` cs
// シーン内にある、指定したコンポーネントの1つを取得する
var cmp = FindObjectOfType</*欲しいコンポーネント*/>();

// シーン内にある指定したコンポーネント全てを取得する
var cmp = FindObjectsOfType</*欲しいコンポーネント*/>();
``` 

# まとめ
- 取得一つをとっても様々な方法がある。
- ものによっては処理が重くなるため以下のような策を講じるべきである。
  1. 初期化時に一回のみ呼び出す。  
  2. 頻繁に呼び出すようなものは、あらかじめ配列などで保持できるような設計にするべきである。

# 実行確認環境
Unity [2018.2 以上]
isucon8の予選の環境構築 - 解析編

# このページの目的
isucon8の予選問題で練習をするにあたって、解析ツールを入れるなどしてみたのでそのメモ
試してみたのは↓

- pt_query_digest
- alp（※webサーバもh2oからnginxに切り替え）

[環境構築についてはこちら](https://qiita.com/sora083/items/683a7f0523dba3aa8c19)


# SQLのスローログの確認・解析
## スロークエリログの出力設定
1.一応バックアップ

```bash
sudo cp -i /etc/my.cnf{,.org}
```

2.スロークエリログを出力させる設定を追加

```bash
sudo vi /etc/my.cnf

〜以下の3行を追記〜
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 1
```

3.mariadbを再起動

```
sudo systemctl restart mariadb.service
```

## pt-query-digestのインストールと解析

1.percona-toolkit(pt-query-digest)のインストール

```
sudo yum -y install https://www.percona.com/redir/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
sudo yum install -y percona-toolkit
```

2.解析（slow.logを解析。結果は別のファイルに書き出し）

```
pt-query-digest /var/log/mariadb/slow.log > /tmp/digest.txt
```
※解析終わったらslow.logは消しておかないと次の解析時に混ざってしまうので注意


# Webサーバログの解析(nginxの場合)
## nginxのインストール

1.nginxのインストール
```
sudo yum -y install nginx
```

2.バージョン確認

```
nginx -V
```


## ログをLTSV形式で出力するように設定

1.ログフォーマットの設定用confファイルを作成

```
sudo vi /etc/nginx/conf.d/log_format.conf
```

※以下を記載

```
log_format ltsv "time:$time_local"
        "\thost:$remote_addr"
        "\tforwardedfor:$http_x_forwarded_for"
        "\treq:$request"
        "\tmethod:$request_method"
        "\turi:$request_uri"
        "\tstatus:$status"
        "\tsize:$body_bytes_sent"
        "\treferer:$http_referer"
        "\tua:$http_user_agent"
        "\treqtime:$request_time"
        "\truntime:$upstream_http_x_runtime"
        "\tapptime:$upstream_response_time"
        "\tcache:$upstream_http_x_cache"
        "\tvhost:$host"
    ;
```

2.nginx.confを編集

バックアップ

```
sudo cp -i /etc/nginx/nginx.conf{,.org}
```

```
sudo vi /etc/nginx/nginx.conf
```

3.nginxを再起動

```
sudo nginx -t -c /etc/nginx/nginx.conf
```
syntax OKと出ることを確認


```
sudo systemctl start nginx
```

##### ※もしアクセスができない場合

selinuxを無効化

```
sudo setenforce 0
```

## ログの解析（alp）
1.wgetのインストールから

```
sudo yum -y install wget
```

2.alpのインストール

```
wget https://github.com/tkuchiki/alp/releases/download/v0.4.0/alp_linux_amd64.zip
unzip alp_linux_amd64.zip
sudo mv alp /usr/bin/
```

3.ログの解析

```
sudo alp -f /var/log/nginx/access.log
```
※解析終わったらログをローテーションするなどしておかないと次の解析時に混ざってしまうので注意


# 参考にさせていただいた記事など
https://qiita.com/daskepon/items/19ac9eccdd4fdb8c2d95
https://nishinatoshiharu.com/percona-slowquerylog/
https://belhb.hateblo.jp/entry/2017/06/11/172048
https://papix.hatenablog.com/entry/2015/09/28/094310
Unity Xcode Error "library not found for -" の解決方法

#はじめに
今回**Vuforia**を使ってARアプリを実機にビルドしようとした際に次のエラーに出会った.  

```
↑以上の文は省略する
ld: library not found for -liPhone-lib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

これの**解決方法**をこの記事にまとめようと思う.  
他の記事を参照してみると, Unityの"Build"ではなく**"Build and Run"**を実行してXcodeでビルドするとうまく行くという記事もあった.
実際に, 一度はそれでうまく実機にビルドできたが, 次の日にもう一度試すとうまく行かなかった.(どういうことなんですかね??w)
詰まってる人は一度試してみるといいかも??(次回うまく行くとは限らぬが...)

```:ビルド環境について
Unity ver  : 2017.2.1f
Xcode ver  : 10.2.1 (10E1001)
Vuforia ver: 6.5.25
```

#解決方法
##Search Paths
今回の事例では, 結局この**Search Paths**という所に原因があるみたいでした.
この**Search Path**がどこからみることができるかというと.
**Targets**の**Build Settings**からみることができます.
<img width="367" alt="SearchPaths.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255841/66107eca-1c69-9363-35c5-455da3dad9bc.png">
##原因(Library Search Paths)
さらにこのSearch Pathsの中で具体的な原因は**Library Search Paths**にありました.
まぁ, エラー文が*library not found*なんで想像がつきますね.
今回の事例だと, Library Search Pathsの中身はこんなことになってました.
<img width="894" alt="LibrarySearchPaths.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255841/b639a3e4-2469-074b-2c28-413b3c320aa8.png">
この中身の見方はLibrary Search PathsのPathが書いている所をダブルクリックしたらみることができます.
中身がこれになってる人はわかると思うけど, LibraryまでのPathが続けて**2つ**書かれてるんだよね...

```:例
Library Search Paths   "/Users/username/...(Path省略)/(プロジェクトファイルのLibraryの手前まで)""/Users/username/...(Path省略)/Libraries"
```
こんなことになってるので, うまく**Libraryを見つけることができない**のだと考えられる.

##どう解決するか
上にあげたLibrary Search Pathsの中身を書き換えます.
書き換えるというか, 消すだけなのだけれど...つまりこうする!
<img width="894" alt="LSP1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255841/04e753ac-0859-baad-94c6-9c7769134d64.png">
↑こいつを...
<img width="895" alt="LSP2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255841/71977cb0-ae45-cbf0-5272-48decaf5730b.png">
↑こうする!!
すると, 先ほどの**例**にあげたPathがこうなる!

```:例(修正版)
Library Search Paths   "/Users/username/...(Path省略)/Libraries"
```
これでLibraryをしっかりと見つけることができる.

#補足
今回, このエラーを直すにあたって先達に質問したのだが
先達曰く, 
"Xcodeのエラーはその都度原因が違うことが多いから, しっかりとErrorの内容を全部(まぁ多分必要な部分のことかな?)みて, Pathが載ってたら細くチェックする必要がある."
と教えてもらった. 
次からは膨大なことが書いてあるエラーが出ても重要そうな所を見つけて, よく読んでみます.

#参考文献
1. [library not found for-liPhone-libについて](https://teratail.com/questions/187830) (最終閲覧日: 2019/8/7)
2. [iOSのビルド設定の「Symlink Unity libraries」の意味](http://nakamura001.hatenablog.com/entry/20120906/1346937762) (最終閲覧日: 2019/8/7)
3. [library not found for -liPhone-lib【Unity】【トラブルシューティング】](http://kan-kikuchi.hatenablog.com/entry/2013/11/12/070553) (最終閲覧日: 2019/8/7)
｢RaspberryPiをROM化する｣をシェルスクリプト化した

｢RaspberryPiをROM化する｣にシェルスクリプトをかぶせただけの投稿。
https://qiita.com/felis_silv/items/e69f3490091bee9fe619
簡単にかいつまんで説明すると書き込みをONにしておくと、破損しやすいSDカードを読み取り専用にすることによって、破損しにくくなるスクリプト。

これを `/usr/local/sbin`にでも置いておいてください。

# 使い方
最初に `rom install`を実行してください。
その後、読み取り専用を解除したい場合は`rom rw`、読み取り専用にしたい場合は`rom ro`です。

# スクリプト

ご自由に煮るなり焼くなりどうぞ。

```:rom
#!/bin/sh

#RaspberryPiをROM化/解除するシェルスクリプト
#options:
# rw: 読み書き可能に
# ro: 読み取り専用に
# status: 現在の読み取り専用かどうかの状態を表示
# install: このスクリプトを使える状態にする。最初に実行
#https://qiita.com/felis_silv/items/e69f3490091bee9fe619

help(){
    echo "Usage: $CMDNAME ro|rw|status|install" 1>&2
}
# Read / Write
toRW(){
    if [ -e /mnt/boot-ro/config.txt ]; then
        sudo mount -o remount,rw /dev/mmcblk0p1
        sudo grep -v initramfs /mnt/boot-ro/config.txt >/tmp/config.txt
        sudo cp /tmp/config.txt /mnt/boot-ro/config.txt
        echo "Write enabled now."
        echo "done. please reboot."
    else
        echo "Already write enabled"
    fi
}
# Readonly
toRO(){
    if [ -e /mnt/boot-ro/config.txt ]; then
        echo "Already write protected"
    else
        sudo grep -v initramfs /boot/config.txt >/tmp/config.txt
        sudo echo initramfs initrd.gz >> /tmp/config.txt
        sudo cp /tmp/config.txt /boot/config.txt
        echo "Write protected now."
        echo "done. please reboot."
    fi
}
#show status
status(){
    if [ -e /mnt/boot-ro/config.txt ]; then
        echo "Write protected now"
    else
        echo "Write enabled now"
    fi
}
install(){
    echo "Install start... Aftre install, will be reboot."
    sudo bash
    apt-get install -y git rsync gawk busybox bindfs
    dphys-swapfile swapoff
    dphys-swapfile uninstall
    update-rc.d dphys-swapfile disable
    systemctl disable dphys-swapfile
    git clone https://github.com/josepsanzcamp/root-ro.git
    rsync -va root-ro/etc/initramfs-tools/* /etc/initramfs-tools/
    mkinitramfs -o /boot/initrd.gz
    echo initramfs initrd.gz >> /boot/config.txt
    echo "install end."
    echo "done. please reboot."
}

case $@ in
    ro)
        toRO
        ;;
    rw)
        toRW
         ;;
    status)
        status
        ;;
    install)
        install
        ;;
    *)
        help
        ;;
esac
```
【Maven】OWASP Dependency Checkで.Net系のAssembly Analyzerを無効化する【Java】

# やること
OWASP Dependency Checkを使っていて、プロジェクトは`Java`なのに`.NET Assembly Analyzer could not be initialized and at least one 'exe' or 'dll' was scanned. The 'dotnet' executable could not be found on the path; either disable the Assembly Analyzer or configure the path dotnet core.`とエラーが出て困りました。

なので、`.Net`系のAssembly Analyzerを無効化します。

# やり方
以下のように、`assemblyAnalyzerEnabled`と`nugetconfAnalyzerEnabled`と`nuspecAnalyzerEnabled`を無効化すればできます。

```xml
<!-- 省略 -->
<plugin>
    <groupId>org.owasp</groupId>
    <artifactId>dependency-check-maven</artifactId>
    <version>5.0.0</version>
    <configuration>
      <!-- .Net系の内容を無効化する -->
      <assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled>
      <nugetconfAnalyzerEnabled>false</nugetconfAnalyzerEnabled>
      <nuspecAnalyzerEnabled>false</nuspecAnalyzerEnabled>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<!-- 省略 -->
```

## 補足
何を無効化できるかについては下記公式ドキュメントをご覧ください。
`Java`であれば、`Golang`に関する内容などは切っておいていいかもしれませんね。

- [dependency\-check\-maven – dependency\-check:check](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/check-mojo.html)
JavaScript で の数値 の 扱い 〜console.log("5 + 2");とconsole.log(5 + 2);の違い〜

# 目的
- JavaScriptの数値の取り扱いについてまとめる。

# 押さえるポイント
- コンソールに文字列を出力するときは`console.log("表示したい文字列");`とする。
- コンソールに足し算の結果を出力するときは`console.log(足し算など);`とする。
- 表示したい文字列をカッコ内にシングルクオートかダブルクオートで囲んで書く。
- 表示したい数値はカッコ内をシングルクオートやダブルクオートで**囲まない**。
- 足し算、引き算の符号は数値と半角スペースを空ける。
- 最後にセミコロンを忘れずに。

# 書き方の例
- 「△」「○」は足し算したい数値が入る
- 下記にJavaScriptファイルの内容を記載する。

``` javascript
console.log(△ + ○);
```

# より具体的な例
- コンソールに5+2の結果と10-2の結果を表示するコードを書く。
- 下記にJavaScriptファイルの内容を記載する。

``` javascript
//これはコンソールに「5 + 2」と出力するコードです。
console.log("5 + 2");

//これはコンソールに5+2の結果を出力するコードです。
console.log(5 + 2);

//これはコンソールに10-2の結果を出力するコードです。
console.log(10 - 2);
```
Homebrew Caskでインストールしたアプリをダウングレードする

プライベートではWindowsを使っていますが、仕事ではもっぱらMacがメインです。アプリのインストールには利便性を考えて、macOS用パッケージマネージャの[Homebrew](https://brew.sh/index_ja)と、その拡張機能である[Homebrew Cask](https://github.com/Homebrew/homebrew-cask)を使っています。先日Caskでインストールしたアプリを更新したところトラブルが発生し、ダウングレードする機会がありました。割とあるあるなケースだと思うので、忘れないように手順を書き残します。

## 前提条件
* Homebrew+Caskが使える環境
* ダウングレードするアプリをSlackと仮定する
* Git すこし わかる :octocat:

## 戻したいバージョンのコミットを探す

ターミナルでCaskのディレクトリまで移動します。

```console
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask/Casks
```

Gitのコマンドでログを表示します。

```console
$ git log slack.rb
```

```shell-session
commit bb21222c6baea64c58e296ac325888f17f2850d4
Author: James Chevalier <james@openbay.com>
Date:   Thu Aug 1 12:14:25 2019 -0400

    Update slack from 4.0.0 to 4.0.1 (#67023)

commit 07039780b1748514316029607c0b83a4e51e6e7d
Author: HASHIMOTO Masayuki <gh@mahori.mail-box.ne.jp>
Date:   Wed Jul 17 08:11:25 2019 +0900

    Update slack from 3.4.2 to 4.0.0 (#66330)

commit db14404b644a5a3923f793c79faa3056554e0908
Author: HASHIMOTO Masayuki <mahori@users.noreply.github.com>
Date:   Tue Jun 4 12:07:00 2019 +0900

    Update slack from 3.4.0 to 3.4.2 (#64345)

commit 905cdea9e21f50d6d417152b3a66583be885b308
Author: Randall <17261190+ran-dall@users.noreply.github.com>
Date:   Fri Apr 19 03:10:51 2019 -0700

    Update slack from 3.3.8 to 3.4.0 (#62186)
:
```

ずらずらとコミットのログが表示されます。最新版は現時点で`4.0.1`です。これを1つ前の`4.0.0`に戻す場合、『Update slack from 3.4.2 to 4.0.0 (#66330)』とコメントされてるコミットのハッシュ値`07039780b1748514316029607c0b83a4e51e6e7d`を控えておきます。

## アプリをアンインストールする

```console
$ brew cask uninstall slack
```

アンインストールが完了したら、念のためキャッシュを削除しておきます。

```console
$ brew cleanup -s
```

## 控えたハッシュ値を指定して再インストール

控えたハッシュ値を指定して、アプリを再インストールします。

```console
$ brew cask install https://raw.githubusercontent.com/caskroom/homebrew-cask/07039780b1748514316029607c0b83a4e51e6e7d/Casks/slack.rb
```

## 補足(追記)

どのような仕組みでダウングレードしてるのか軽く補足します。Homebrew Caskは、Rubyで記述されたアプリの定義ファイルを元に、インストールを実行しています。控えたハッシュ値ですが、これは指定したバージョンの定義ファイルを参照するために使います。先ほど`brew cask install`で指定した[URL](https://raw.githubusercontent.com/caskroom/homebrew-cask/07039780b1748514316029607c0b83a4e51e6e7d/Casks/slack.rb)にアクセすると、GitHubにアップロードされたSlackの`ver. 4.0.0`の定義ファイルが表示されるかと思います。URLを直接指定しなくても、Gitのコマンドでコミットを遡れば、同じように`brew cask install slack`でインストールが可能です。
grep等の探索系コマンドメモ

# grep等の探索系コマンドメモ
ログ探索等でよく使うのに忘れがちな奴のメモ

## 現在のディレクトリ以下を全部探索する
-r オプション　但し、無限にディレクトリ構造を掘ってしまうので実行場所によっては全然結果が返ってこなくなるので注意

```
grep [探索文字列] -r ./

```

## 上記が重すぎるので階層を限定したりファイル名で絞り込みたい場合
### 拡張子だけでいい場合

```
--include *.[拡張子]
```

### 階層など細かく指定したい場合
find/xargsと組み合わせる
findで対象のファイル名を取って、xargsコマンドでgrepに流し込む

maxdepthは1=>掘らない　2=>1階層下まで探索する

```
find -name [ファイル名パターン] -maxdepth [探索階層] -type f | xargs grep [検索文字列]

```
findの -type fはファイル限定。

## 大文字小文字を区別しない
iオプション

```
grep [探索文字列] -i 
```

## gzip化されたファイルを検索する
ログローテートされた古い奴を探索する場合はzgrepコマンド

なお、そのまま読みたい場合はzcatなど、他にもz+コマンド系のコマンドが存在する。

## 周辺 n行を取得する
-[数値]オプション。
特定のキーワードを元に周辺のログを引っ張りたい場合など。
前後の場合はそれぞれ-B [数値] -A [数値]

```
grep hoge fuga.log -3 //対象行+周囲3行を取得する
grep hoge fuga.log -B 3 //対象行+前3行を取得する
grep hoge fuga.log -A 3 //対象行+後3行を取得する

```
StoryBoardでIdentifierを設定してもIdentidierが機能しない


## 現象が起きた環境
* MacMojave
* Xcode10.1

## 経緯
Appiumを使ってテストを行なうため
要素を取得するのにStoryBoardからIdentifierを設定したが
AppiumでIdentifierを設定した要素の取得に何度やっても失敗してしまう。

## 現象
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47337/5756dab0-7553-0273-bc3f-f5b1dff6d129.png" width=300 >

取得できない...
試しにXcodeを再起動してみると
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47337/436273c8-98ff-b9b3-2fbd-318c1f215686.png" width=300 >
**消えてますね**
正しくIdentifierが保存されていないようでした。

## 解決方法
`Cmd + S`で保存することで無事取得できるようになりました。
今までXcodeで自動保存に頼って自ら保存をしたことがなかったので気づけませんでした。
Xcodeのバグなのかもしれません。
【AviUtl】注目したい部分以外を暗くする映像を作ってあそぼ

### ワクワクさん、今日はどんな映像を作るの？
今日はねゴロリ、次の埋め込み映像のような**注目したい部分以外を暗くする**ような映像を作るよ！

<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="und" dir="ltr"><a href="https://t.co/PvtdYSpTQp">https://t.co/PvtdYSpTQp</a></p>&mdash; ヒト🏃‍♀️速バラ撒きおじさん/あつし (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1159043913585291265?ref_src=twsrc%5Etfw">August 7, 2019</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### わぁ、すごいや！それでそれで、どうやったら作れるの？
じゃあゴロリ、どうやったら作れるのか、少し考えてみようか！

こういう映像を作るためには、次のような2つの要素が必要っぽいなって思うよね？

1. 画面全体を暗くする
2. 一部分だけ暗くしないように透明にする

このうち、画面を暗くするには、この「図形」オブジェクトの色を黒くして、「乗算」効果を指定すれば作れるね。
![新規キャンバス.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/caf19db6-0890-30c2-d996-f9999e4705c1.jpeg)

**before**
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/5dd4a5ab-800d-26a7-71ec-479da3c00ed2.png)

**after**
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/04f5a71b-24ec-91e4-87f6-237a463b7ba6.png)

### 黒くなったぞぉ！でも、一部分だけ明るくしなくっちゃ……
よし、これから一部分だけ明るくしてみよう！

オブジェクトの一部分だけを透明にしたい場合は、こうやって拡張編集から「マスク」を選んでごらん。
さらに「マスクの反転」のオプションにチェックを入れてあげれば……ほらこの通り！
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/64f4a860-5ee5-4386-324f-75c47c6b0643.png)

**before**
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/04f5a71b-24ec-91e4-87f6-237a463b7ba6.png)

**after**
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/549ca85d-f11c-4438-4adb-e02432686ec1.png)

**マスクの反転**
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/df26955c-646b-c662-7683-b2a63193d741.png)

### やったね！ちゃんと一部分だけ明るくできた！
あとはマスクする位置や形、アニメーションを調整してあげれば完成だ～！
気分で「ぼかし」の効果を入れてみてもいいかもね！
![0b243e4d699fcf3a7bb13261c7d9e943.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/336249/43fbbfed-ba92-1d58-b8d8-1173582e3e2a.png)

### 参考
[【AviUtl】トリミングエフェクト（クリッピング･斜めクリッピング･マスク）の使い方](https://aviutl.info/toriminngu-efekuto/)
MATLAB/Simulink/Simscapeで真空管アンプのシミュレーション　その1

# 動機
真空管アンプが好きです。といってもオーディオマニアじゃないのでエレキギター用の真空管アンプです。壊れたアンプをヤフオクで買って、修理して使ってます。Soldanoは入手したけど、BognerのEcstacyとDiezelのVH-4Sが欲しい。

LTSpice使って真空管アンプのシミュレーションとかもやってみたけど、SIN波スイープとか単純なことしかできない。Simulinkでできればもっと面白いことができるんじゃない？

# LTSpice
有名なフリーの回路シミュレータ。真空管のシンボルなんかも出回っている。名機と言われるギターアンプの回路図は出回っているので、回路図起こしてシミュレーションするのは容易。下図はMarshall 1987のPre部のSIN波100Hz入力時の応答波形。ギターアンプなのでSIN波も歪んでこんな波形になる。
![LTSpice1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/857ad144-85a2-a549-1eb9-161a127d01f0.png)

# Simscape Electrical
Simscape ElectricalはSimscapeの電気回路ライブラリ。Simscapeはブロック線図シミュレータSimulinkの物理モデリング用ライブラリ。Simulinkはプログラム環境MATLABのシミュレーション用オプション。MATLABのひ孫みたいなもの。
電気・電子回路ライブラリは一通り揃っているけど、LTSpiceと違うのは、回路シンボルが各社の型番ごとにあるわけではなく、素子ごとにしか無いこと。SimscapeではSPICEのネットリストやシンボルはそのまま使えないのでまたこれが面倒。

例えばLTSpiceだとNPNトランジスタでも2SC1815(東芝)とか2SCR512(ROHM)とかメーカーの型番ごとにライブラリ(シンボル)が用意されているのに対して、Simscape ElectricalではNPN Bipolar Transister１つ。
![Ssc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/e9c1983b-4661-7985-94da-4172a5333b39.png)

だから素子ごとの特性は使用する部品ごとに入力してやる必要がある。

# 真空管シンボルのSimscapeへのインポート
Simscape Electricalにはsubcircuit2sscというコマンドがあって、SPICEライブラリをインポートできる。
これを使ってどこかからダウンロードしたプリ管12AX7Aのシンボルをインポートしてみた。

```matlab:
subcircuit2ssc('12AX7A.lib', '+mylibrary')
```
これでSimscapeのソースコードができるので、ビルド。

``` matlab: 
ssc_build('mylibrary')
```
するとこんなブロックが生成される。
![sscblock.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/6114556d-bddd-0d90-aa7b-b9fdf23eb246.png)

見た目が良くないので、絵を書いてブロックのマスクに設定してとりあえずインポート完了。
![sscblock2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/cc18e7b0-7ae7-6121-0ddd-c26b5a5c32a5.png)


# シミュレーション用Simscapeモデル作成
シミュレーションするのにモデル（回路図）を作成する。
真空管の代表的な特性Ep-Ip特性を取るために、Plate電圧とGrid電圧を可変にして、Plate電流を測定できるモデルを作った。
![sscmodel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/1671e794-000f-9e64-c68f-2d1de8469782.png)

# MATLABでSimscapeモデルを駆動
パラメータスイープしながら出力特性を取るため、MATLABプログラムでSimscapeモデルを実行。

```matlab:
%% Parameter類
DCSW = 1;
VgStep = (-5:1:0);
VpStep = (0:20:500);
IpTable = zeros(length(VpStep), length(VgStep));
Ip = 0;
%% Simulation実行
set_param(gcs,'FastRestart','on') % 高速スタート
for n = 1:length(VgStep)
    for nn = 1:length(VpStep)
        Vg = VgStep(n);
        Vp = VpStep(nn);
        simOut = sim(gcs);
        tmp = simOut.get('Ip');     % for FastRestart
        IpTable(nn,n) = 1000*tmp(end);  % A =>mA
    end
    plot(VpStep, IpTable(:,n), 'b.-'), grid on, hold on
end
title('Ep-Ip Characteristics')
xlabel('Ep(V)')
ylabel('Ip(mA)')
```

# Simscapeで真空管のEp-Ip特性を取得
上のMATLABコード実行して12AX7AのEp-Ip特性取れた。書籍の特性と比較しても所望の特性が出ている。
![EpIpPlot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/a6077659-e1c2-df0b-116f-9b3d9b49eebd.png)

続く
Apache CouchDBをWindowsでポータブルに動かす

CouchDBのWindows版のバイナリはそもそもポータブルにできている。

# バッチファイルによる起動

Windows版のCouchDBをインストールすると起動用のバッチファイルもインストールされるので、それをダブルクリックするだけ。

## インストーラを実行
http://couchdb.apache.org/ からインストーラをダウンロードして実行する。インストール先はパスに空白を含まない場所ならどこでもよい。ここではP:\CouchDBにインストールした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/57577ed1-d286-9bb7-8c69-fdaa7895252d.png" height="300px">

## サービスを停止
「コンピュータの管理」からサービスの一覧を開き、「Apache CouchDB」を停止する。さらにスタートアップの種類を「無効」にする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/f2f801d7-880c-a08d-89c4-7667fb364137.png)

## couchdb.cmdを実行
CouchDBのインストール先ディレクトリのbinの下にcouchdb.cmdがある。これはバッチファイルなのでダブルクリックで起動できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/42d9d8c1-8e0c-5a8e-f813-09705e95094f.png" width="300px">

## Fauxtonを開いて確認
インストーラはスタートメニューにFauxton http://localhost:5984/_utils/index.html へのショートカットを作るので開いて確認する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/476f95fd-c45f-eaa4-b888-8f603bbb2bfa.png" width="300px">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/28277a36-b23f-5bed-9972-32c5077136cb.png)

# やっておくと便利なこと

## ショートカット作成
ポータブルに使うために、バッチファイルを起動するショートカットと、Fauxtonを起動するショートカットを作っておくと便利である。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/b6adfd43-9778-e79c-75a9-e63f37264474.png" width="200px">

## ログを標準エラー出力に出す
インストール先の etc ディレクトリの下に設定ファイルがある。etc/local.d/log.ini に次の設定を書いておくと、ばｯ地ファイルで開いたコマンドプロンプトにログが出力されて良いかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/6d141309-892a-e966-0f1b-7a188d043dbd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15158/2d980d3a-6536-4796-f724-52663d6d3430.png)
【HTML/CSS】ボタンの作り方とエフェクトの付け方

<h2>はじめに</h2>

こんにちは。
<a="https://www.miraidenshi-tech.jp/intern-content/program/">未来電子テクノロジー</a>でインターンをしているshinoです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

今回は、ボタンの付け方と、ボタンにエフェクトを付ける方法をご紹介します。

<h2>ボタンの付け方</h2>

ボタンはaタグで指定します。
ここではbtnというクラスを与えます。


```Python:HTML
<a class="btn"></a>
```

aタグはインライン要素であり、width や height を指定できません。
これではボタンのデザインを形作る際に不便です。
そこで、aタグをインラインブロック要素に変更します。

インライン要素やブロック要素を指定する際は、displayプロパティを使用します。


```Python:CSS
.btn {
padding :8px 24px;
color :white;
display: inline-block;
opacity : 0.8;
```

これでボタンをインラインブロック要素にできました。

<h2>ボタンにエフェクトを付ける</h2>

ボタンの上にカーソルをのせたとき、色を変化させることができます。

その際は、hoverを用います。


```Python:CSS
.btn :hover {
opacity : 1;
}
```

この場合、カーソルを持って行くとボタンの色が濃くなります。

hoverはカーソルを乗せたボタンの状態を指定すると考えるとよいです。
FragmentでLiveData#observeを使うときの第一引数（Owner）には`viewLifecycleOwner`を使う

タイトルにすべて書いてしまいました。少し解説します。

通常、LiveData#observeを使うとき、第一引数に`this`を入れがちです。

```kotlin

class MainFragment : Fragment() {
    ...

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel.livedata.observe(this, Observer {
          update(it)
        })
    }

    ...
}

```

Activityではこれで良いですが、Fragmentで使うときに`this`を入れるのは間違いです。動くには動きますが、画面を閉じても購読が停止されず、画面を開くたびに購読が積み重なっていきます。
すると、イベントが起きるたびに複数回Observerが呼び出されようになり、意図せぬ動作の原因になったり、パフォーマンスの低下にも繋がります。

FragmentでLiveData#observeを使うときは`viewLifecycleOwner`を使いましょう。

```kotlin

class MainFragment : Fragment() {
    ...

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel.livedata.observe(viewLifecycleOwner, Observer {
          update(it)
        })
    }
}

```

詳しくは以下の記事がとても参考になります。

[5 common mistakes when using Architecture Components](https://proandroiddev.com/5-common-mistakes-when-using-architecture-components-403e9899f4cb)
Amazon Auroraの参照すべきエンドポイントをミスってフェイルオーバー発生後に困った

# 困ったこと
ある日フェイルオーバーが発生してレプリカインスタンスが昇格した。
これまでプライマリインスタンスだったものは降格した。

そのタイミングからアプリケーションからの書き込みができなくなってしまった。。。

# 原因
Amazon Auroraにはクラスターエンドポイントとインスタンスエンドポイントがあって
インスタンスエンドポイントを参照していたので、フェイルオーバーが起きたあとも
レプリカに降格したインスタンスに向けて書き込みを行おうとして失敗していた。


AWSコンソールでエンドポイントを確認するとき、こっちに表示されるのはインスタンスエンドポイントなので注意されたし！！
<img width="1328" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16603/50deacc8-3e03-41fd-ade2-d3c2bec85331.png">


こっちがクラスターエンドポイントで「書き込み用」と「読み込み用」の2種が表示される。
<img width="1326" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16603/35d5b474-6f8c-9e18-76ea-99f7ef111a45.png">

# まとめ
AWSコンソール上で見るべきエンドポイント情報を間違えないように気をつけよう！

クラスターエンドポイントを参照することで、たとえフェイルオーバーが起きても何も対応しなくてよくなった。（でも一応CloudWatchでフェイルオーバーイベントを検知するようにしておいた！）
XcodeからiOSアプリのコンパイルでfailed to find or create execution contextが出た場合

iOSアプリの勉強をしようとして初めてXcodeを使ったら,初っ端からエラーが出て詰まったときの話

結論から言えば下のコードをターミナルから実行して、CoreSimulatorServiceを再起動すると治る


`sudo killall -9 com.apple.CoreSimulator.CoreSimulatorService`


Xcode10.3にアップグレードすると同じエラーが出ている人が多いらしく、調べてみると同様の例がいくつか見つかった
🙈猿も木から落ちる、CaboChaでも係り受け解析をミスる😭

#係り受け解析とは？
文節間の「修飾する（係る）」「修飾される（受ける）」の関係を調べる事です。
そして、CaboCha は, CRF (Conditional random field; 条件付き確率場) に基づく日本語係り受け解析器です。

#係り受け解析ができると何がいいの？
例えばこのようなことができます。

【Python】🍜可愛い店員さんがいるラーメン店を食べログ口コミから自然言語処理で抽出してみた。🍜
https://qiita.com/toshiyuki_tsutsui/items/a192cac082926a7aced5

#さて

そんな優秀なcabochaさんでも苦手なことがあるようです。

試しにこちらの文章を係り受け解析してみたいと思います。

**私はお金も希望もない**

なぜその言葉を選んだ！？というツッコミは受け付けません。

```python:
import CaboCha

def get_word(tree, chunk):
    surface = ''
    for i in range(chunk.token_pos, chunk.token_pos + chunk.token_size):
        token = tree.token(i)
        features = token.feature.split(',')
        if features[0] == '名詞':
            surface += token.surface
        elif features[0] == '形容詞':
            surface += features[6]
            break
        elif features[0] == '動詞':
            surface += features[6]
            break
    return surface

def get_2_words(line):
    cp = CaboCha.Parser('-f1')
    tree = cp.parse(line)
    chunk_dic = {}
    chunk_id = 0
    for i in range(0, tree.size()):
        token = tree.token(i)
        if token.chunk:
            chunk_dic[chunk_id] = token.chunk
            chunk_id += 1

    tuples = []
    for chunk_id, chunk in chunk_dic.items():
        if chunk.link > 0:
            from_surface =  get_word(tree, chunk)
            to_chunk = chunk_dic[chunk.link]
            to_surface = get_word(tree, to_chunk)
            tuples.append((from_surface, to_surface))
    return tuples

line = '私はお金も希望もない'
tuples = get_2_words(line)
for t in tuples:
    print(t[0] + ' → ' + t[1])
>>>
私 → ない
お金 → 希望
希望 → ない
```

**私 → ない**
**お金 → 希望**
**希望 → ない**

一見正しいようにも見えますが、

**私 → ない**
**<font color="Red">お金 → ない</font>**
**希望 → ない**

が正しい係り受けです。

こちらの係り受け解析ツールを使った結果
http://copita.jpn.org/ai/nlptool/da.php

![スクリーンショット 2019-08-07 17.39.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327405/b002c570-dcd3-a3ea-69fb-623068f7730e.png)

こちらのツールでは正しく係り受け解析ができているようです。

# 原因
CaboCha は, CRF(Conditional random field; 条件付き確率場) に基づく日本語係り受け解析器ですので、教師ありの機械学習によって作られています。
そのため、並列構造の学習不足により**誤った係り受け**をしてしまうことがあるようです。
＊並列構造・・・今回の例でいうと「お金と希望」の部分

詳しくはこちら↓
https://slidesplayer.net/slide/16974243/
バージョンアップによって改善はしているそうですがまだまだ課題があるみたいですね。

#結論

猿も木から落ちるように、CaboChaでも係り受け解析をミスることがあります。
個人的には、猿が木から落ちる姿🐒は可愛らしくきらいではありません。
なので、たとえ CaboCha🎃が係り受け解析をミスったとしても **「微笑ましいな」** と寛大な心で受け止めたいと思います。
AndroidをKotlin+MVVM+Dagger2ではじめるための資料集

これからAndroidの新規プロジェクトを始めるなら、Kotlin+MVVM+Dagger2の構成がなんだか良さそうですね。

そんな感じで始めたときに、参考になった資料をまとめました。

# 対象

- Kotlin、MVVM、Dagger2を使って開発を始めるための資料が欲しい
- Kotlin、MVVM、Dagger2は使っているが、新規プロジェクトを作れるか不安

# Android Architecture Component

[Android Architecture Components 初級 （ MVVM + LiveData 編 ） - Qiita](https://qiita.com/Tsutou/items/69a28ebbd69b69e51703)

# build.gradleの記述

新しいプロジェクトを作るときは、build.gradle軸に利用するライブラリを検討しながら設計考えていくと、やりやすいことが多いです。
新しいものに触れる場合は、１つの記事だけ見るより、似た記事を比較しながら読むと理解が進みます。

ということで、build.gradleに何を書くかを解説した複数の記事を参考にしました。

- [Android Architecture Components 初級 （ MVVM + LiveData 編 ） - Qiita](https://qiita.com/Tsutou/items/69a28ebbd69b69e51703)
- [Kotlin + Architecture Component + Dagger2によるAndroidアプリ設計](https://qiita.com/satorufujiwara/items/0f95ccfc3820d3ee1370)
- [MVVM with Kotlin — Android Architecture Components, Dagger 2, Retrofit and RxAndroid](https://proandroiddev.com/mvvm-with-kotlin-android-architecture-components-dagger-2-retrofit-and-rxandroid-1a4ebb38c699)

# Dagger2について

Dagger、よくわからんですよね。Daggerに関しては、言われるがままに使えばとりあえずは良い気がします。自分は使ってみたものの、全体の10%くらいしか理解できている気がしない。。

MVVM設計のAndroidArchitectureの上でDaggerを使うなら、下記記事を読んでおくと良さそうです。

- [Dagger Android拡張の使い方 - Kenji Abe - Medium](https://medium.com/@star_zero/dagger-android%E6%8B%A1%E5%BC%B5%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9-6527dcb74531)
- [Dagger 2 on Android: The Official Guidelines You Should Be Following](https://proandroiddev.com/dagger-2-on-android-the-official-guidelines-you-should-be-following-2607fd6c002e)
- [Architecture Components を Dagger2 と併用する際の ViewModelProvider.Factory について - Qiita](https://qiita.com/satorufujiwara/items/f42b176404287690f1d0)

# LiveDataについて

LiveDataは最初、かなり得体の知れないものでしたが、実装していくとその便利さがわかってきます。なので、最初は以下の資料をみながら使ってみて、やりたいことをどのように実現すればよいのかを深堀りしてくのが良さそうです。

- [【Android Architecture Components】LiveData 和訳 - Qiita](https://qiita.com/oya-t/items/f908a358a2a615ce936d)
- [ViewModels and LiveData: Patterns + AntiPatterns - Android Developers  Medium](https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54)
- [5 common mistakes when using Architecture Components](https://proandroiddev.com/5-common-mistakes-when-using-architecture-components-403e9899f4cb)
AWS CloudFormation Web Appサンプルテンプレート

# はじめに

すごくシンプルめWebApp構成のCloudFormationテンプレートを作成しました。
テンプレートはGitHubにあるので、[こちら](https://github.com/tanukinokegawa/AWSCloudFormationSampleWebAppConfiguration.git)をご参照ください。
テンプレートはyamlパージョンとjsonバージョンがありますが、同じものを作成するので、お好きなほうをご利用ください。

# 構成イメージ

## 疎通する上でのネットワーク構成

![20190807_AWS_CloudFormation_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/2be9b060-3123-538d-db91-76112d6a40c8.png)

## 非機能部分の構成

![20190807_AWS_CloudFormation_03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353055/984108fe-a855-7a3d-254f-117d750d0c22.png)

# コメント

細かい部分はGitHubの方を見ていただけると幸いです。
本稿はサンプルとしてご参考になればと記したものです。ご自分の環境にそぐわない場合もございますことご承知おきください。
phpunitで「No whitelist is configured, no code coverage will be generated.」のエラー

phpunitでカバレッジレポートを出力しようとしたが、以下の様なエラーが発生した。

```
No whitelist is configured, no code coverage will be generated.
```

phpunit.xmlにホワイトリストの設定が書かれていないとカバレッジが出力できないらしい。

# 解決方法

以下の設定をphpunit.xmlに追加すればカバレッジが出力できた。

```xml
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
```

# 設定の意味は？

`src`ディレクトリの`*.php`ファイルのみをカバレッジ算出の対象として指定している。

`processUncoveredFilesFromWhitelist`属性が`true`の場合、実行されたコードの有無にかかわらず全てのファイルをレポートの対象に含める。
`false`の場合、１度も実行されないファイルはレポートの対象外となる。

更なる詳細は、末尾のドキュメントを参照されたし。

# 余談・PhpStormでカバレッジレポートを表示させたい場合

phpstormからカバレッジレポートを出力させる場合、デフォルトの設定のままだとphpunit.xmlを読み込んでくれなくて、エラーになりました。
設定画面の`Test Frameworks`で明示的にphpunit.xmlを指定してやる必要があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71575/abf4e412-2257-adf7-6000-98d03aca7e99.png)

設定後、カバレッジ有りのテストを実行すると、カバレッジレポートが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71575/ecdec5f2-e47b-f338-5d2c-398cbb0acfb1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71575/56410f23-c23c-70a3-eef0-5841bc1f56f0.png)

以上です。
よきPHPライフを！😀


# 参考ページ


本家ドキュメントのカバレッジに関するページ
https://phpunit.readthedocs.io/en/8.2/code-coverage-analysis.html#whitelisting-files

本家ドキュメントのフィルタに関するページ
https://phpunit.readthedocs.io/en/8.2/configuration.html#the-filter-element
docker-composeで『Everyday Rails - RSpecによるRailsテスト入門』 の環境構築

#はじめに
Everyday Rails の作業をローカル環境で実施するために、
docker-composeを用いて環境構築をしました。その方法をメモします。DBはmysql2を使用しました。

#リモートリポジトリからのクローン、作業ディレクトリ作成

リモートリポジトリからクローンする

```sh
git clone https://github.com/everydayrails/everydayrails-rspec-2017.git
```

ディレクトリを移動する

```c
cd everydayrails-rspec-2017
```

#ファイル作成、修正
作業ディレクトリ内に、以下のファイルを新たに作成する
- Dockerfile
- docker-compose.yml

###Dockerfile

```rb
FROM ruby:2.3.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y \
    build-essential \
    nodejs \
 && rm -rf /var/lib/apt/lists/*

RUN gem install bundler

WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

ENV APP_HOME /myapp
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
```

###docker-compose.yml

```rb
version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
      - bundle:/usr/local/bundle
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  bundle:
  mysql_data:
```

DBをmysql2に変更するため、database.ymlを修正
###config/database.yml

```rb
default: &default
  adapter: mysql2
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000
  username: root
  password: password   # docker-compose.ymlのMYSQL_ROOT_PASSWORDで指定したもの
  host: db # docker-compose.ymlのサービス名

development:
  <<: *default
  database: development_database

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: test_database

production:
  <<: *default
  database: production_database
```

sqlite3の代わりにmysql2をインストールするため、Gemfileの該当箇所を修正
###Gemfile

```rb
#gem 'sqlite3'
gem 'mysql2'
```

#docker-composeの起動
dockerイメージをビルドする。

```sh
$ docker-compose build 
```

bundle installを実行する。

```sh
docker-compose run web bundle install
```

コンテナを起動し、開発環境を構築する。

```sh
$ docker-compose up 
```

ここで、

```sh
/usr/local/bundle/gems/activerecord-5.1.1/lib/active_record/connection_adapters/connection_specification.rb:188:in `rescue in spec': Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord). (Gem::LoadError)
```



というエラーが出た。以下の参考記事に従って、Gemfile内のmysql2のバージョンを変更
参考記事：["Specified 'mysql2' for database adapter, but the gem is not loaded" when upgrading to 0.5.0 ](https://github.com/brianmario/mysql2/issues/950)

###Gemfile

```ruby
gem 'mysql2', '~> 0.4.0'
```

再度dockerを起動し直したら、エラーが無くなった。

#DBの作成
以下のコマンドでDBを新たに作成する。

```sh
docker-compose exec web rails db:create
```

```sh
docker-compose exec web rails db:migrate
```

ブラウザでlocalhost:3000にアクセスし、メイン画面が出てきたら成功
MSDNのライセンスキーをOffice365に紐付けてMacにインストールする手順メモ

MSDNライセンスを持っている状態で、MacにOffice365経由で`Office 2019 for Mac`をインストールしようとしてハマったので備忘録的メモ。

1. https://my.visualstudio.com/ProductKeys にアクセス  
  1. MSDNアカウントでログイン
  1. 必要なプロダクトのキーを取得(※1)
1. https://setup.office.com/?ms.officeurl=setup にアクセス  
  1. MSDNライセンスを紐付けたいMicrosoftアカウントでログイン(☆1)
  1. `プロダクトキーの入力`画面で、※1で取得したプロダクトキーを入力(※2)
  1. `国、または地域`、`該当する言語`を選択して`次へ` を押下
1. https://account.microsoft.com/services/ にアクセス  
画面に※2でキーを入力したプロダクト名が表示されていればOK
  1. インストールしたいプロダクト名項目の`インストールする`リンクを押下し、インストーラをダウンロードする
  2. インストーラをダブルクリックして普通にインストール
  3. インストールしたアプリケーションを起動し、Office365ライセンス認証を起動
  4. ☆1のアカウントでOffice３６５認証を実行
  5. 認証されればOK
Doctrineのマイグレーションで、ビューなどのテーブルを無視する方法

Doctrineのエンティティを使って、DBのviewテーブルにアクセスしていたときの問題です。

例えば、「`view_memo`」というテーブルが存在していて、`ViewMemo`エンティティを使っているとします。普通に動くのですが、マイグレーションするときに問題が出ました。

viewテーブルが存在しないと判断されて、マイグレーションで`view_memo`テーブルを作成しようとします。

## 解決方法

いろいろ調べて、結局Symfonyのマニュアルに解決方法がありました。

- [https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.html#manual-tables](https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.html#manual-tables)

まずは、doctrineの設定ファイルを見つけます。

```
config/packages/doctrine.yaml
```

ここに、`schema_filter`の一行を加えます。

```yaml
doctrine:
    dbal:
        schema_filter: '/^(?!view_memo).*$/'
```

これで解決しました。


ここは正規表現になっているので、複数ある場合は色々かけますね。

```yaml
        schema_filter: '/^(?!view_memo|more_tables|views*).*$/'
```
Markdownでドキュメントが作れるMkDocsが便利過ぎる

何番煎じだろうと書く。

## 顧客向けマニュアルをMarkdownで作りたい
ここ最近、社内で利用する仕様書だったり手順書だったりは[Crowi](https://site.crowi.wiki/)でMarkdownで書いています。Markdown、手軽で便利ですよね。

ただ、お客様に提出するような製品仕様や製品マニュアルを公開するのは、セキュリティとかアカウント管理とかの関係でちょっと公開するのはいかがなものかなと。
記事のエクスポート機能でもあればなーと思っていたところで、MkDocsに出会いました。割と感動したので、この感動を皆様と共有したく。


## 公式サイト
https://www.mkdocs.org/

## 何が凄いのか
- Markdownでドキュメントが書ける
- webサービスを内蔵しているので、わざわざwebサーバーを立てなくてよい
- webサービスはMarkdownへの変更をリアルタイムに反映してくれる
- テーマが選択できるのでデザインセンスがなくても割といい感じにしてくれる
- **1コマンドで静的サイトをビルドしてくれる**
- **つまり、オンラインマニュアルにもローカル用マニュアルにも両方対応出来る**

## 導入手順

### 1. pythonとpipのインストール
使っている環境で違うのでマニュアルに従ってインストール
[Python](https://www.python.org/)
[pip](https://www.python.jp/install/windows/pip.html)

### 2. MkDocsのインストール

```bash
$ pip install mkdocs
```

### 3. `mkdocs new <プロジェクト名>`で新しいプロジェクトを作成する

```bash
$ cd project-dir
$ mkdocs new my-project
INFO    -  Creating project directory: my-project 
INFO    -  Writing config file: my-project/mkdocs.yml 
INFO    -  Writing initial docs: my-project/docs/index.md 
```
これで必要なファイルが自動で作成される

### 4. `mkdocs serve`でMkDocsの開発用サービスを立ち上げる

```bash
$ cd my-project
$ mkdocs serve
INFO    -  Building documentation... 
INFO    -  Cleaning site directory 
[I 190807 16:52:48 server:296] Serving on http://127.0.0.1:8000
[I 190807 16:52:48 handlers:62] Start watching changes
[I 190807 16:52:48 handlers:64] Start detecting changes
```

### 5. ブラウザで確認する

`http://localhost:8000`で確認できました。素敵。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169808/100b7282-b56e-c5e6-4a2d-2683050b9265.png)

## 修正手順
### Markdownを修正してみる

`# Welcome to MkDocs` -> `こんにちは！ MkDocs`

```my-project/docs/index.md
# こんにちは！ MkDocs 

For full documentation visit [mkdocs.org](https://mkdocs.org).

## Commands

・・・
```

保存してブラウザを確認してみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169808/d9e02a0d-118b-392d-2c62-fe1272b92574.png)

保存するとリアルタイムで反映されているのがわかります。Markdownを利用している以上、リアルタイムプレビューが当たり前なので、これは嬉しいですね。

### htmlを出力する
個人的にこれがMkDocsの真骨頂だと思います。
Markdownで作ったサイトは`mkdocs build`で静的サイトへ変換が可能です。

```bash
# my-project以下で
$ mkdocs build
```
ビルドすると、docsフォルダと同じ階層に`site`フォルダが作成されて、htmlに変換した結果が保存されます。
試しに`site/index.html`を開いてみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169808/633bb367-6060-1d86-7b51-877c822b7d51.png)



先ほど修正したページが出力されている事がわかります。

## テーマを変更する
テーマを変更する際は`pip`でお好みのテーマをダウンロードし、mkdocs.ymlで設定を変更できます。
個人的にはmaterialテーマが好きなので、materialをダウンロードして設定します。ドキュメント内検索が日本語で出来るので大変エモいです。

```bash
$ pip install mkdocs-material
```

mkdocs.ymlに以下の記述を追加します。

```mkdocs.yml
theme:
  name: 'material'
  language: 'ja'
extra:
  search:
    language: 'ja'
```

保存して、`mkdocs serve`でどうなったのか見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169808/92eb83b5-b3d7-29f6-da95-8e9b26e71323.png)

**エモい・・・！**
デザインセンス皆無の私にもこんなシャレオツなドキュメントが書けるなんて。

mkdocs.ymlには結構色んな設定が出来るので、公式サイトや各テーマのサイトを確認してください。

## 締め
普段、wikiなんかはMarkdownで書く事が浸透してきていますが、外部へ提供するドキュメントだったりはWordがまだ使われているところもあるかと思います。

MkDocsでマニュアル作成をすると、作成/修正が手軽で、Githubでも管理が出来、上手くやればオンラインでの自動テストも可能です。なんて便利。

ドキュメントを作成する際は検討してみてはいかがでしょうか。
API Gateway + LambdaでAPI Keyの値を取得する

## やりたいこと
API GatewayをAPI Keyで認証かけた時に、認証されたAPI Keyの値をLambda側で扱いたい。

## Lambdaにくる値のイメージ

API Gateway Proxyで実装するとこんな値がきます。

```typescript
{
  "httpMethod": "DELETE",
  "headers": {
    "Accept": "*/*",
    "CloudFront-Forwarded-Proto": "https",
    "CloudFront-Is-Desktop-Viewer": "true",
    "CloudFront-Is-Mobile-Viewer": "false",
    "CloudFront-Is-SmartTV-Viewer": "false",
    "CloudFront-Is-Tablet-Viewer": "false",
    "CloudFront-Viewer-Country": "JP",
    "x-api-key": "XXXXXX",
  },
```

## 問題点
`x-api-key`に表記揺れが発生するケースがあります。

`X-API-KEY=XXX`だと`headers.X-API-KEY: XXX`。
`X-API-key=XXX`だと`headers.X-API-key: XXX`。

## 対応
とりあえずheadersのキーに対してArray.findをかけて、比較する際に大文字 or 小文字に寄せることに。

```typescript
import { APIGatewayProxyEvent } from 'aws-lambda'

const getAPIKey = (event: APIGatewayProxyEvent): string => {
  const key = Object.keys(event.headers).find(header => {
    return header.toLocaleLowerCase() === "x-api-key" 
  })
  return event.headers[key] || ''
}
```
Computational Optimal Transport 精読会 記録 (#18: 4.6)

# 背景


- 前回: [Computational Optimal Transport 精読会 記録 (#17: 4.5)](https://qiita.com/takilog/items/68543ccce927a0ac9e29)は7/31に開催，今回は8/6に開催
- 職場でCOTを読んでおり，{自己満足,復習,将来のため}などの理由で記録をしている


### 前回の振り返りと今回の内容

- エントロピー正則化付き最適化問題
    - Primal (4.2) $L^\varepsilon\_C({\bf a}, {\bf b}) = \min_{{\bf P}\in U({\bf a},{\bf b})} \langle {\bf P}, C\rangle - \varepsilon H({\bf P})$
    - Dual (4.30) $L_C^\varepsilon(a,b) = \max_{f, g} \langle f, a\rangle + \langle g, b\rangle - \varepsilon \langle \exp(f/\varepsilon), K\exp(g/\varepsilon)\rangle$
- Sinkhornアルゴリズム最高 → ちゃんと収束するし，高速化できるよ．安定化するためにはLogドメインが必須だよ．
  - $\mathbf{u}^{(l+1)} = \frac{\mathbf{a}}{\mathbf{Kv}^{(l)}}$, $\mathbf{v}^{(l+1)} = \frac{\mathbf{b}}{\mathbf{K}^T\mathbf{u}^{(l + 1)}}$
- エントロピー正則化で解いた解は，元の解に対してバウンドになっていて使える（収束していれば）
- 今回: 一般化Sinkhorn


----

# §4.6 Generalized Sinkhorn

- Sinkhornを導入した§4.2において，SinkhornアルゴリズムがKL-div.のProjと関連があったりするという話を書いた
- 似たような路線で，一般化されたSinkhornについて議論する．具体的には$P1_m = a, P^T 1_n = b$という今までの制約が関数$F, G$で一般化された問題(4.49)を議論する．これは今までとは違って$F$と$G$が入ることで制約なし最適化になっている．例えば$F$と$G$を支持関数にすれば同じ．

$$\text{(4.49): } \min_{P} \langle C, P\rangle - \varepsilon H(P) + F(P1_m) + G(P^T 1_n)$$

- 面白いことに，(4.49)の最適化問題は，Sinkhornと同じ解の形をもつ．これは$P1_m=f, P^T1_n=g$などの変数を仮に置いてラグランジアンを考えると，$P$について偏微分をする仮定で消され，Sinkhornの解の形を議論したProp 4.3(おそらく)と同じ式変形が可能なため．

- 様々な最近の論文(Peyre 2015, Frogner et al. 2015, Chizat et al. 2019, Karlsson and Ringh 2016)のお陰で，この式は次のような解放で定式化される
    - $u \leftarrow \frac{1}{Kv} \mathrm{Prox}_F^\mathbf{KL}(Kv)$
    - $v \leftarrow \frac{1}{K^Tu} \mathrm{Prox}_G^\mathbf{KL}(K^Tu)$
    - もともとのSinkhornが$a, b$を割るだけだった部分が，Proxになった

- Proxの定義
    - $\mathrm{Prox}\_F^\mathbf{KL}(u) = \arg\min_{u'} KL(u'\mid u) + F(u')$
    - 式からも，$F$が仮に指示関数の場合，$u'=a$の解しか存在しないため，これはSinkhornと一致すると分かる
- 特に証明などは出てこない（論文レベル）
- argminとProxの性質から，例えば$F(u)=\sum_i F_i(u_i)$のようにelement-wiseになっているとき，Proxもelement-wiseで良い


## Remark 4.28 Duality and Legendre transform

- 何もわからない（募集: ルジャンドルに詳しい人）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7181/1387c430-7bd7-10cd-65c9-8a0b12d35760.png)


## コメント

- §4 Sinkhorn 完走！！

# Next

- §5, 6, 7あたりが非常につらそうなので，話し合った結果次は§9をやっていく
Cognos Analytics 特定のアイコンやメニューを非表示にしたい

#特定のアイコンやメニューを非表示にしたい
よく聞かれるので投稿しておきます。

Cognos Analyticsで、赤枠のような特定のアイコンとかメニューを非表示にするのはどうするのですか、とよく質問を受けます。
<img width="600" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8ada57ae-abe0-d198-159b-438cb266923d.png">

Cognos BIの時はsystem.xmlファイルでの設定で行っていましたが、Cognos Analyticsでは、「管理」メニューの「人」→「アカウント」→「Cognos」で表示される「役割」のプロパティから設定を行います。
※「グループ」ではダメで、「役割」となります。

そのため、誰がログインしても共通で消したい場合は、「すべてのユーザー」グループを、例のように新規作成の「すべてのユーザー役割」役割に所属させて設定する必要があります。
<img width="960" alt="010.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9ca35088-bd91-f37f-400b-004a000a5561.png">

試しにすべてのユーザーから「通知」アイコンを非表示にしてみます。
「すべてのユーザー役割」のプロパティから「カスタマイズ」タブで、「優先度」を「1」に変更し、フィーチャーの「デフォルト」を選択し、図のように「Home」→「Application Bar」配下の「Notifications」のチェックを外し「適用」します。
は<img width="960" alt="011.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/adb2d3d6-419c-baae-5169-5426490b9264.png">

coguser1(作成者ロールに所属)でログインした場合。「通知」アイコンが消えてますね。
<img width="491" alt="012.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/9c967fca-2012-d1d4-9fdf-5e40b3a0696b.png">

coguser2(読者ロールに所属)でログインした場合。「通知」アイコンが消えてますね。
<img width="495" alt="013.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0219003b-738b-dfcc-c2ed-ea852509478f.png">

ちなみにシステム管理者は無敵です。システム管理者のプロファイルの優先度は圧倒的に高く固定で設定されているので、効きません。※「通知」アイコンが表示されている。
<img width="508" alt="014.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/1a4e1c43-defa-934c-15c1-be9005440f93.png">

では、特定の役割への所属の有無によって、表示・非表示を切り替えたい場合。

「作成者」のプロパティから優先度を「2」に設定し、以下のように「Run as」を消してみます。
<img width="960" alt="015.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/67b5288d-02ee-933e-7cf1-e434e0d06132.png">

coguser1(作成者に所属)で入ると、ここにあった「次を実行」メニューが消えていますね。しかしながら、「通知」アイコンが復活してしまっています。
<img width="752" alt="016.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/dd4ed5c8-3117-1615-d595-5d5ffd85b3ac.png">

これが注意点で、より優先度の高いプロファイルのみが有効になるので、先ほどの「すべてのユーザー役割」の設定は「作成者」ロールの設定で上書きされてしまいます。
「作成者」のプロファイルで、「通知」アイコンも消すように設定しましょう。

という感じになります。


#参考情報
**Cognos Analytics カスタマイズ機能の解説**
https://qiita.com/shinyama/items/6553bc462c3e91ddd255