OmniAICreator/Qiita-1.07M huggingface dataset:
【Docker】dockerでコンテナ, イメージ, volumeを全てクリア（削除）する方法 

# 方法
## コンテナ、image, volumeを一緒に削除

`docker system prune -a --volumes -f`

### 簡単な解説
- `docker system prune` で使っていないデータを削除する(コンテナ、イメージ、volume)
- `-a` オプションで全ての使っていないイメージを削除する
- `--volumes` オプションで全ての使っていないvolumeを削除する
- `-f` オプションで確認せずに削除する（強制削除ではない）

# 原始的な方法
## コンテナの削除

`docker rm -f $(docker ps -a -q)`

### 簡単な解説
- `docker rm` は起動していないコンテナを削除するコマンド
- `-f` オプションは起動しているコンテナでも強制的に削除する
- `$()` 内のコマンドが実行され、出力を渡すことができる
- `docker ps` は起動しているコンテナ一覧を出力するコマンド
- `-a` オプションは起動していないコンテナ一覧も含めて出力するコマンド
- `-q` オプションはコンテナIDのみを出力するコマンド
- `$(docker ps -a -q)` で展開されたコンテナ一覧が `docker rm -f` で全て削除される

## イメージの削除

`docker rmi -f $(docker images -q)`

### 簡単な解説
- `docker rmi` は使われていないイメージを削除するコマンド
- `-f` オプションは使われているイメージでも強制的に削除する
- `$()` 内のコマンドが実行され、出力を渡すことができる
- `docker images` はイメージの一覧を出力するコマンド
- `-q` オプションはイメージのIDのみを出力するコマンド
- `$(docker images -q)` で展開されたイメージ一覧が `docker rmi -f` で全て削除される

## volumeの削除

`docker volume rm -f $(docker volume ls -q)`

### 簡単な解説
- `docker volume rm` は使われていないvolumeを削除するコマンド
- `-f` オプションは使われているvolumeでも強制的に削除する
- `$()` 内のコマンドが実行され、出力を渡すことができる
- `docker volume ls` はvolumeの一覧を出力する
- `-q` オプションはvolumeのIDのみを出力する
- `$(docker volume ls -q)` で展開されたvolume一覧が `docker volume rm -f` で全て削除される
Rust Stringを逆にする

# 0. 環境
- rustc 1.38.0 (625451e37 2019-09-23)
- binary: rustc
- commit-hash: 625451e376bb2e5283fc4741caa0a3e8a2ca4d54
- commit-date: 2019-09-23
- host: x86_64-pc-windows-msvc
- release: 1.38.0
- LLVM version: 9.0

# 1. 経緯
Stringの文字列を逆にする関数を探しても上手いこと見つけられなかったので, 自作しました。

# 2. 作成したもの
```rust
fn reverse_string(input &String) -> String {
    let mut reversed = String::new();
    let mut chars: Vec<char> = Vec::new();

    for c in input.chars().into_iter() {
        chars.push(c);
    }

    for i in (0..chars.len()).rev() {
        reversed += &chars[i].to_string();
    }

    return reversed;
}
```

# 3. 使用例
```rust

fn reverse_string(input: &String) -> String {
    // 以下略
}

fn main() {
    let sample_string = String::from("test");
    let reversed_string = reverse_string(&sample_string);

    println!("{}", reversed_string);    // tset と表示される
}
```
プログラミング問題集（問１１〜問１５）

# 問１１：区分求積法（長方形近似）

積分を数値的に求める区分求積法として、長方形近似、台形則、シンプソン則などがある。そのうち長方形近似では、ある点 $x_i$ における値 $f(x_i)$ に幅 $h$ をかけた長方形を足し合わせたものを積分値として近似する。

<img width="104" alt="定積分" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f9f05c69-5eb8-a545-93e4-548b4e71edb0.png">

長方形近似を用いて、上の式を数値的に解け。


# 問１２：区分求積法（台形則）

積分を数値的に求める区分求積法として、長方形近似、台形則、シンプソン則などがある。そのうち台形則では、ある点 $x_i$ とその前の点 $x_{i-1}$ </sub>における、$f(x_i)$ と $f(x_{i-1})$ による幅 $h$ の台形を足し合わせたものを積分値として近似する。

<img width="104" alt="定積分" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f9f05c69-5eb8-a545-93e4-548b4e71edb0.png">

台形則を用いて、上の式を数値的に解け。


# 問１３：区分求積法（シンプソン則）

積分を数値的に求める区分求積法として、長方形近似、台形則、シンプソン則などがある。そのうちシンプソン則では、ある点 $x_i$ とその前の点 $x_{i-1}$、後の点 $x_{i+1}$ を通る二次関数を導出し、その$f(x_{i-1})$ から $f(x_{i+1})$ までの積分値$h(f(x_{i+1})+4f(x_i)+f(x_{i-1}))/3$ を足し合わせたものを積分値として近似する。

<img width="104" alt="定積分" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/f9f05c69-5eb8-a545-93e4-548b4e71edb0.png">

シンプソン則を用いて、上の式を数値的に解け。



# 問１４：エラトステネスの篩

整数 $n$ を入力すると、 $n$ 以下の素数の個数を返す関数を作りなさい。またそのアルゴリズムを説明しなさい。

ただし、

* 1 &le; $n$ &le; 10<sup>6</sup>

とする。

## 例14-1

```python
n = 10
```

```python
4
```

## 例14-2

```python
n = 100
```

```python
25
```

## 例14-3

```python
n = 1000
```

```python
168
```

## 例14-4

```python
n = 10000
```

```python
1229
```

## 例14-5

```python
n = 100000
```

```python
9592
```


# 問１５：格子点の個数

ユークリッド平面状に２つの格子点 $P = (x_1, y_1)$, $Q = (x_2, y_2)$ がある。線分 $PQ$ 上には、$P$, $Q$ 以外にいくつの格子点が存在するか計算する関数を作りなさい。またそのアルゴリズムを説明しなさい。

ただし、

* -10<sup>6</sup> &le; $x_1$ &le; 10<sup>6</sup>
* -10<sup>6</sup> &le; $x_2$ &le; 10<sup>6</sup>
* -10<sup>6</sup> &le; $y_1$ &le; 10<sup>6</sup>
* -10<sup>6</sup> &le; $y_2$ &le; 10<sup>6</sup>

とする。

> 【ヒント】 <font color="#ffffff">最大公約数を求める問題に帰着できます。「ユークリッドの互除法」で効率的に解けます。</font>


## 例15-1

```python
x1 =  -2
y1 =  -9
x2 =  6
y2 =  7
```

```python
7
```

```python
# 図示して確認
%matplotlib inline
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([x1, x2], [y1, y2])
ax.set_xticks(range(x1, x2 + 1, 1))
ax.set_yticks(range(y1, y2 + 1, 1))
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.grid()
```

![9-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211162/548e6718-c0a1-d695-6fd7-f81000ea43e2.png)

## 例15-2

```python
x1 =  -42
y1 =  -65
x2 =  62
y2 =  -91
```

```python
25
```

## 例15-3

```python
x1 =  908
y1 =  -307
x2 =  -86
y2 =  -679
```

```python
0
```

## 例15-4

```python
x1 =  -6326
y1 =  3211
x2 =  7048
y2 =  5822
```

```python
0
```

## 例15-5

```python
x1 =  -9675
y1 =  -2803
x2 =  3828
y2 =  -6349
```

```python
2
```

## 参考：例の作り方
```python 
import random
x1 = random.randint(-1000000, 1000000)
y1 = random.randint(-1000000, 1000000)
x2 = random.randint(-1000000, 1000000)
y2 = random.randint(-1000000, 1000000)

print("x1 = ", x1)
print("y1 = ", y1)
print("x2 = ", x2)
print("y2 = ", y2)
```
rails generateでのpolymorphic associationの生成

### 要約
要はreferencesを使って`polymorphic association`を作りたい

### model構成
UserがいいねするためのLikeモデルで、いいねする対象がpolymorphicになっている

### 書き方
```ruby

bundle exec rails g model Like user:references likable:references{polymorphic}:index

### 参考
https://railsguides.net/advanced-rails-model-generators/
Gitでよく使うコマンド個人的まとめ

個人的にGitで割と使うコマンドをまとめました．

# Gitにあげるときに最初にやること

Gitにpushしたいファイルをおいているディレクトリに移動し，以下のコマンドを順に実行

```
git remote add origin (リポジトリのURL)
git push --set-upstream origin master
```
<補足>
push:ローカルで行なった変更を、リモートに送り込む
originはURLの短縮名で、慣習的に"origin"が使われることが多い
新規ブランチ作成の儀

![rgnarnq2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515482/bdf4c2f0-e81a-3395-090f-ef984bd609ef.jpeg)

Git初心者の頃(今もですが…笑)はよくこんな感じになりました…
エラーなしで通ったのは結局上にまとめている2行だけなのが分かると思います．
(一部個人情報の関係で塗りつぶしていて見にくいですが)

# リモートでの変更をローカルで受け取る場合

以下のコマンドを順に実行

```
$ git fetch
$ git pull
```

注)fetchとpullの違い
fetch -> すべての変更の取得：○、 カレントブランチの変更の取得： ○、 マージ： ×
pull　-> すべての変更の取得：×、 変更の取得： ○、 マージ： ○

# ローカルでの変更をリモートに送る場合

以下のコマンドを順に実行

```
$ git add .
$ git commit -m "ここに変更点などを書く"
$ git push
```
注) "."オプションは，対象がすべてのファイルだという意味

# 一度pushしたあとにGitHubのリポジトリ名の変更またはローカルのファイルの場所や名前を変更する

## GitHubのリポジトリ名を変更した場合

GitHub上で名前変更後，コマンドプロンプトを起動，Gitにpushしたファイルをおいているディレクトリに移動して次のコマンドを実行

```
$ git remote set-url origin (新しいリポジトリのURL)
```

## ローカルのファイルの場所や名前を変更した場合

Gitにpushしたファイルをおいているディレクトリ(変更後の場所)に移動して次のコマンドを実行

```
$ git remote set-url origin (リポジトリのURL)
```


# Gitのローカルでの変更を破棄する場合

以下のコマンドを順に実行

```
$ git reset HEAD
$ git checkout .
$ git clean -fd
```

# Gitで特定の前のバージョンに戻る場合

```
$ git log
commit hoge //該当するcommit idをコピー

$ git reset --hard hoge //貼り付け
```
git logは対象のフォルダを移動させたりすると遡れなくなります．その場合，GitHubで該当するコミットのページへ行くと右上にcommit idが表示されます．



参考サイト
【Git】リポジトリ内の不要なファイルを削除して元の状態に戻す方法（git clean） - メモ魔のめもまみれBlog(閲覧日：2019年11月1日)
http://memomamire.hatenablog.com/entry/2016/01/27/210607
【Git】特定のコミットまで戻したい - Qiita(閲覧日：2019年11月29日)
https://qiita.com/Yorinton/items/e0e969d961b17a359e19
【AWS EC2】Amazon Linux 2にJenkinsをインストールする

# 概要
AWS EC2(AMI: Amazon Linux 2)にJenkinsをインストールして8081番ポートでアクセスできるようにする

## 環境
- AWS EC2
 - OS: Amazon Linux 2
 - AMI ID: amzn2-ami-hvm-2.0.20190823.1-x86_64-gp2
 - セキュリティグループ: SSH 22 / TCP 8080 / TCP 8081 を開けておく
- Jenkins
 - version: 2.202

# 構築手順
## 1. JDK 8 をインストール
- Amazon Linux 2にはデフォルトでJavaが入っていないのでインストールする
  - Jenkins 2.164(2019-02)以降はJava 8 or Java 11が必要

```console
$ sudo yum install -y java-1.8.0-openjdk-devel.x86_64
$ sudo alternatives --config java
$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
```

## 2. Jenkinsのyumリポジトリを追加

```console
$ sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
$ sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
```
接続先のbaseurlがhttpだとinstallでコケるのでhttpsに変更する

```console
$ sudo vi /etc/yum.repos.d/jenkins.repo
[jenkins]
name=Jenkins
baseurl=https://pkg.jenkins.io/redhat
gpgcheck=1
```

## 3. Jenkinsをインストール

```console
$ sudo yum install -y jenkins
$ rpm -qa | grep jenkins
jenkins-2.202-1.1.noarch
```

## 4. Jenkinsを起動

```console
$ sudo systemctl start jenkins
Starting jenkins :                          [  OK  ]
```

## 5. Jenkinsの設定
### 初期設定
`http://(public IP address):8080`にアクセスして画面に従ってまず初期設定する

```console
$ sudo less /var/lib/jenkins/secrets/initialAdminPassword
```
1. Unlock Jenkinsは初期パスワードを確認して入力する
2. Customize JenkinsはとりあえずInstall suggested pulginsを選択
3. Create First Admin Userで管理者ユーザーを登録
4. Instance Configurationで`http://(public IP address):8081/jenkins/`と入力
5. Save and Finishで設定完了

### URLとportの設定を変更する
初期設定の4に書いたように`http://(public IP address):8081/jenkins/`で動かしたいので、設定を変更してJenkinsを再起動する

```console
$ sudo vi /etc/sysconfig/jenkins
JENKINS_PORT="8081"
JENKINS_ARGS="--prefix=/jenkins"

$ sudo systemctl restart jenkins
```

`http://(public IP address):8081/jenkins/`にアクセスして初期設定した管理者ユーザーでログインできれば完成

# 感想
最初はQiitaの参考記事を見ながらやってたんだけど、installのときにサイトに接続できない的なエラーが出て進まなくて。
RedHatの公式ページ見たらURLが変わってたからhttpsで接続するようにしたらうまくいったのでメモ。

# 参考
[RedHat Linux RPM packages for Jenkins](https://pkg.jenkins.io/redhat/)
[AWSにJenkins環境を構築する](https://qiita.com/hitomatagi/items/4bf578b46c525fc01514)
[MacOS]emacsclient でファイルを開いて Emacs にフォーカスをあてる

他のシェルでもできると思うけど、とりあえず `fish` 表記です。

```shell
function e
  # ファイルを開く
  set -l emacsclient /Applications/Emacs.app/Contents/MacOS/bin/emacsclient
  $emacsclient -e "(find-file \"$argv\")"

  # Emacs をアクティベートする
  echo 'tell application "Emacs" to activate window' | osascript
end
```

# 参考にしたページ

- [:apple: macOS app frontmost](https://gist.github.com/andrewp-as-is/1ab9807998e82dfbb7d774f98cf6df9c)
- [applescript - osascript / syntax error: Expected end of line but found command name. (-2741) - Stack Overflow](https://stackoverflow.com/questions/6964486/osascript-syntax-error-expected-end-of-line-but-found-command-name-2741)
BigQueryのPersistent UDF（永続的UDF）で幸せになれそうな話

# はじめに
昨日、BigQuery（以下BQ)のドキュメントを見ていて気がついたんですが、Persistent UDFが[2019年7月にβリリース](https://cloud.google.com/bigquery/docs/release-notes#July_01_2019)されていました。

これまで、BQのUDFはtemporaryなものしかなかったので、シェアして使うみたいなことができなかったんですよね。Persistent UDFによって、共有出来るのが嬉しいですし幸せ。

使い方自体はtemporaryと変わりません。

詳細は[ドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#create_function_statement)を見てもらえればわかるのですが、サンプルsnipetsをちょっと置いておきます。

BQのUDFはSQLでもjsでもいけるんですが、SQLのCASE文を使ってみます。

# Persistent UDF作成

```sql
CREATE FUNCTION `project.dataset.check_era`(target date)
RETURNS STRING AS (
  CASE
    WHEN target >= DATE('2019-05-01') THEN '令和'
    WHEN target BETWEEN DATE('1989-01-08') AND DATE('2019-04-30') THEN '平成'
    ELSE 'ずっと昔'
  END
);
```

# Persistent UDFの利用

- データセットに含まれるテーブル作成日が令和か、平成か見てみる例
- functionが含まれるデータセットに対するアクセス権があれば、作成者以外も利用することができます。

```sql
SELECT 
  TABLE_NAME,
  CURRENT_TIMESTAMP,
  `project.dataset.check_era`(DATE(CURRENT_TIMESTAMP)) AS a
 FROM
  `project.dataset.INFORMATION_SCHEMA.TABLES`
 ;
```

# 参考
- [公式ドキュメント](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language)
- [New in BigQuery: Persistent UDFs](https://medium.com/@hoffa/new-in-bigquery-persistent-udfs-c9ea4100fd83)
Elmでドット絵エディタを作った

## 作ったもの
[SOSOGU](https://floyd33n.github.io/SOSOGU/)

### コアな部分の実装
キャンパスの表示、マスの色の変更などのみ取り出した[サンプル](https://ellie-app.com/75tkjFFdJHda1)
仕組みの解説はサンプル見てくれたほうが早いと思うので割愛します
またSOSOGUとは違いviewCampusの部分はsvgを使わすdiv要素で書いています
EOF2019登壇資料まとめ

EOF（Engineer Organization Festival）2019に出席してきました。
[EOF2019タイムテーブル](https://eof-github.github.io/eof2019/)

エンジニアマネージャーを対象に、開発組織を考える上で直面する課題などを認識して共有するいい場になっていたと思います。

登壇資料を可能な限りで収集しまとめました！僕が聞いたもの、そうでないものも混じっていますが本ブログが資料の取りまとめになれば嬉しいです。

![191031-eof.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507240/b0a2e023-a338-6827-6982-fb6318207df9.png)



## 登壇資料

*スピーカーの方は継承略で記載させていただく点ご容赦ください

### DMM改革の1年、その実際と反省

スピーカー：松本 勇気 [合同会社DMM.com]

[登壇資料](https://speakerdeck.com/ymatsuwitter/a-year-of-dmm-reformation)


### メルカリ・メルペイのエンジニアリング組織の変化 〜Engineering Managerの視点から〜

スピーカー：
後藤 秀宣 [株式会社メルカリ]
石川 直樹 [株式会社メルペイ]

[登壇資料(メルカリ)](https://speakerdeck.com/hidenorigoto/merukarifalseenziniaringuzu-zhi-falsebian-hua-engineering-managerfalseshi-dian-kara)
[登壇資料(メルペイ)](https://speakerdeck.com/jarinosuke/merupeifalseenziniaringuzu-zhi-falsebian-hua-tomu-zhi-sutimuxiang)

### 質とスピード

スピーカー：和田 卓人 [タワーズ・クエスト株式会社]

[登壇資料](https://speakerdeck.com/twada/quality-and-speed)

### 学習する組織の作り方

スピーカー：古川 陽介 [株式会社リクルートテクノロジーズ]

[登壇資料](https://speakerdeck.com/yosuke_furukawa/xue-xi-suruzu-zhi-falsezuo-rifang)

### ミクシィのマネージャーは悩んでいる

スピーカー：酒井 篤 [株式会社ミクシィ]

[登壇資料](https://speakerdeck.com/_atsushisakai/mixis-manager-is-in-trouble)

### なんとなくチームを構成することから脱却する方法

スピーカー：湯前　慶大 [株式会社アカツキ]

[登壇資料](https://speakerdeck.com/yunon_phys/clean-teams)

### 筋肉質なエンジニア組織を目指して ~失敗と成功から学ぶエンジニア組織の作り方~

スピーカー：鈴木 康寛 [Sansan株式会社]

[登壇資料](https://speakerdeck.com/sansanbuildersbox/the-road-to-robust-and-flexible-engineering-organization)

### 持続可能なエンジニア組織のデザインに必要な事とは

スピーカー：平岡 洋祐 [株式会社ディー・エヌ・エー]

[登壇資料](https://speakerdeck.com/hiraokayosuke/eof2019-dena-ver1-dot-6)


### 自分らしいリーダーシップの形

スピーカー：山崎 遼介 [freee株式会社]

[登壇資料](https://speakerdeck.com/ryosukeyamazaki/zi-fen-rasiiridasitupu)


### チャットコミュニケーションの問題と心理的安全性の課題

スピーカー：中山 ところてん [株式会社NextInt]

[登壇資料](https://www.slideshare.net/TokorotenNakayama/eof2019)

### レガシーコードからの脱却

スピーカー：吉羽 龍太郎 [株式会社アトラクタ]

[登壇資料](https://slide.meguro.ryuzee.com/slides/98)

### 正しいものを正しくともにつくる

スピーカー：市谷 聡啓 [ギルドワークス株式会社]

[登壇資料](https://www.slideshare.net/papanda/ss-188798246)

### プロジェクトマネジメントを武器に働こうとしていたら、組織/チーム作りを武器にしたくなった話

スピーカー：谷川 能章 [LINE株式会社]

[登壇資料](https://speakerdeck.com/line_developers/team-management-in-line-verda)


追加で見つかったものがあれば順次更新していきます！
資料が見つかっていないセッションもありますので、タイムテーブルを確認したい方は[こちら](https://eof-github.github.io/eof2019/)
をご参照ください！
ZabbixでWindowsのTCP接続数をコマンドを使って取得しグラフ化する

# はじめに
ZabbixはWindowsのTCP接続数を取得することが標準機能ではできません。その為、エージェント経由でnetstatコマンドを実行し値を取得するようにします。コマンドやスクリプトを実行し値を取得するにはエージェントのユーザーパラメーター機能を使います。

# 環境
* Zabbix 2.4
* CentOS 7.1 (Zabbixサーバー)
* Windows 8.1 Pro 64 bit (Zabbix監視対象)

# 前提
* Zabbixサーバー／エージェントがそれぞれインストールされており基本設定は完了しているものとします
* ホストの登録は完了しているものとします

# エージェント追加設定
エージェント設定ファイルにユーザーパラメーター行を追加し、サービス再起動で設定を反映させます。

書式
UserParameter=[名前],[実行するコマンド]

設定例

```text:zabbix_agentd.win.conf
UserParameter=netstat.count,netstat -p TCP -n | find "EST" | find /C /V "127.0.0.1"
```

設定後にエージェントの実行ファイルを-tオプションを付けて実行すると取得される値をテスト確認できます。

# アイテム作成
Zabbixサーバーにて監視対象ホストのアイテムを作成します。

名前：任意
タイプ：Zabbixエージェント
キー：エージェントの設定ファイルのUserParameterに指定した名前
他はデフォルト値のままで構いません

![zxtcp01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/ea24ee8b-52a8-c444-443c-95a5c4dd6871.png)

# グラフ作成

Zabbixサーバーにて監視対象ホストのグラフを作成します。

名前：任意
アイテム：前作業にて作成したアイテムを追加
他はデフォルト値のままで構いません

![zxtcp02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/1bd53994-65d9-3855-4b37-23dccd1f6098.png)

# グラフ表示

メニューの[監視データ]→[グラフ]もしくは、[ダッシュボード]などのお気に入りに登録しておき、グラフを表示します。

![zxtcp03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83224/fa4a8eff-5e50-4ac7-f28c-888cc05bab70.png)

# 参考ドキュメント

[Extending Zabbix agents](https://www.zabbix.com/documentation/2.4/manual/config/items/userparameters/extending_agent)
Aruba無線APの初期設定と初期化

#初期設定
コンソールケーブルでPCとAPを接続します
9600;8;NOP;1;NOC;

APの電源を投入します（PoE環境の場合はLANケーブル接続）

以下のメッセージが出てる間にエンターキーを押下します

```config
Hit <Enter> to stop autoboot:  2
```

以下のプロンプトが表示されます

```config
apboot>
```

CLIで各パラメーターを設定します

```config
apboot> setenv ipaddr [IPアドレス]
apboot> setenv netmask [サブネットマスク]
apboot> setenv gatewayip [ゲートウェイ]
apboot> setenv name [ホスト名]
apboot> saveenv
```

設定したIPにWEBブラウザで接続して設定を行います
ユーザー・パスワードともに admin
※新ArubaOSではパスワードがシリアルナンバーなどになっているかも？

#設定確認

```config
apboot> printenv
```

#初期化

```config
apboot> factory_reset
```
知っていると便利なCakePHP3のEntity

今さら感はありますが **CakePHP3** の **Entity** について便利だと思う機能について書いてみます。

この **Entity** について、あまりよく分かっておらず取り敢えず用意してるだけ。という人は結構多いのではないでしょうか？
そんな方達にとって、この記事が有益になってくれたら幸いです。

突然ですがこんなケースはありませんか？
・アカウント登録画面で入力したパスワードを自動でハッシュ化してsaveしてあげたい
・入力した商品の価格を自動的に税込み価格にしてsaveしてあげたい

そんな時は **Entity** の **アクセサー** が便利です :sunglasses:
以下のように`_set + フィールド名のキャメルケース` という命名ルールで **Entity** 内に設定してあげると、
save時に自動でハッシュ化や税込み価格の計算をしてくれるようになります。

```
// Entity
namespace App\Model\Entity;
use Cake\ORM\Entity;

class User extends Entity
{
    // パスワードハッシュ
    protected function _setPassword($password)
    {
        if (strlen($password) > 0) {
          return (new DefaultPasswordHasher)->hash($password);
        }
    }

    // 商品の税込み価格
    protected function _setPrice($price)
    {
        if ($price > 0) {
          return = $price * 1.10;
        }
    }
}
```
↑
こんな感じですね。
毎回いちいち計算してセットしなくていいから便利ですねー。

と、ここで「税率変わったらどうするの？」と疑問に思われた方もいるのではないでしょうか？
その通りです。

「せっかく税込み計算してDBにsaveしたのに、その値が古くて使えないなんて～ :dizzy_face:」
「これは困った・・・」
「税込み価格をDBには保存せず表示する時に計算してあげれば行けそうだけど、表示するたびに計算はやだなぁ。。」

そこで登場するのが **ミューテーター** です！
この **ミューテーター** を使えば、セットされるプロパティーをカスタマイズする事ができるようになるのです。
**ミューテーター** は、`_get + フィールド名のキャメルケース`という命名ルールで **Entity** 内に設定してあげます。

こんな感じです。

```
    // 商品の税込み価格
    protected function _getPrice($value)
    {
        $taxprice = $value * 1.08;
        return floor($taxprice);
    }
```
上記のように設定して、テンプレート内でよくやるように

```
<?= h($user->price) ?>
```
とするだけで、勝手に **ミューテーター** がカスタマイズしてくれるのです。
これまた便利ですね。

こんな感じで **Entity** には便利な機能がたくさんあります。
ここでは全部書き切れませんが、最後にもう一つ、**仮想プロパティーの生成** について紹介させて頂きます。

**仮想プロパティーの生成**・・？？「何のことだ？:expressionless:」となった方、安心してください。
CakePHP2 にあったバーチャルフィールドの事です。

例えば「都道府県」、「市区町村」、「丁目番地」をDBに登録していたとします。
それを登録内容確認画面で表示する際に住所として横並びで表示したいって時に **仮想プロパティーの生成** が便利です。

こんな感じです。

```
    // 住所表示用
    protected function _getAddress()
    {
        $address = $this->_properties['prefecture'] . ' ' . $this->_properties['city'] . ' ' . $this->_properties['home'];
        return $address;
    }
```
機能自体は **アクセサー** なのですが、存在していないフィールド名で設定してあげて、
その中で「都道府県」、「市区町村」、「丁目番地」のフィールドをくっつけてあげます。
そして、ビューで以下のようにしてあげると

```
<?= h($user->address) ?>
```
連結した状態で表示されるのです。
これも便利ですねー :laughing:

以上、**Entity** の紹介でした。
例が微妙だったかもしれないですが少しでも皆様の助けになれば幸いです。

※まだまだ **Entity** について知りたい！という方は本家ページもどうぞ！
https://book.cakephp.org/3/ja/orm/entities.html
ec-cube4でApiPlatformを使う

ec-cube4はデフォルトではAPI化されていないので、自分で作ろうかなと思ったがLaravelほど手軽ではない。

ApiPlatformを使って、認証だけ実装しようと思い、試してみる。

API Platformフレームワークインストール

```
composer req api
```

大切なのはここから、ec-cubeだとディレクトリの構造が違うのでインストール後にこんなエラーが出る。

```php
In ApiPlatformExtension.php line 285:
                                                                                                              
  Could not open file or directory "src/Entity".                                                                                                         
        
```

要約するとEntityディレクトリが無いぞと。

ec-cubeのEntity構造はapp/Cutsomize/Entityなのが原因だ。


以下のファイルでEntityのディレクトリを既存と合わせれば良し！

```app/config/eccube/packages/api_platform.yaml 

api_platform:
    mapping:
        paths: ['%kernel.project_dir%/app/Customize/Entity']
```

## エイリアスの変更
apiのフレームワークコントローラーをインストールした際に、scriptでhtmlに対してエイリアスが貼られている。
しかし、ec-cubeではdefaultのルートはtemplate/[テーマ]のためにそこに合わせる必要がある。

```composer.json
## default
"assets:install --symlink --relative html": "symfony-cmd"

## テーマに合わせる
"assets:install --symlink --relative html/template/default": "symfony-cmd"
```
SolrJ でドキュメントをインポートする



# Code

```java

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.UpdateResponse;
import org.apache.solr.common.SolrInputDocument;

public class HelloDocumentAdd2 {

	public static void main(String[] args) throws SolrServerException, IOException {

		String urlString = "http://localhost:8983/solr/sandbox";
		SolrClient solr = new HttpSolrClient.Builder(urlString).build();

		SolrInputDocument document = new SolrInputDocument();
		document.addField("id", "5");
		document.addField("field_text_en", "This is test. for Date formatting ");
		document.addField("field_location_string", "ja");

		{
			String dateNow = (new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss")).format(new Date());
			System.err.println(dateNow);
			document.addField("field_date", dateNow);
		}

		UpdateResponse response = solr.add(document); // throws SolrServerException,IOException

		System.err.println(response);

		// Remember to commit your changes!

		solr.commit();

	}

}
```
git checkout/switch しようとして、error: cannot stat 'xx/yy/zz': Permission denied エラーが出た時の対処法

## ある日…
Gitを使ってブランチAで開発をしていて、他の人が作業しているブランチBに移動し、確認だけして自分のブランチAに戻ろうとしました。

ブランチBでの確認作業を終え、

```
git switch ブランチA
```

とした私は

```
error: cannot stat 'xx/yy/zz': Permission denied
```

というエラーが出てきてブランチAに戻れなくなってしまいました！

ブランチの移動に伴う、ファイルの変更・削除ができないときにこのエラーが出るようです。

## 解決方法
'xx/yy/zz'のディレクトリ階層のファイルをテキストエディタなどで開いていれば、それを全て閉じましょう。
再度 checkout / switch でブランチ移動できるはずです。

私は体験していませんが、

```
error: cannot stat 'xx/yy/zz': Protocol error
```

の場合でも、同様の対処方法で解決できそうです。

## 参考にしたサイト
https://codeday.me/jp/qa/20190713/1250687.html
https://teratail.com/questions/60939
https://codeday.me/jp/qa/20190429/732351.html
Rails6 のちょい足しな新機能を試す103（ActionDispatch::Response#content_type編）

# はじめに

Rails 6 に追加された新機能を試す第103段。 今回は、 `ActionDispatch::Response#content_type` 編です。
Rails 6 では、 `content_type` は、 Content-Type Header の情報をそのまま返すようになります。

Ruby 2.6.5, Rails 6.0.0, Rails 5.2.3 で確認しました。
また、RSpec のバージョンは、 3.9.0 です。

```shell
$ rails --version
Rails 6.0.0
```

今回は、User CRUD を作り、request spec を変更することにより確認します。

RSpec の導入などについては、 [Rails6 のちょい足しな新機能を試す24（unfreeze_time 編）](https://qiita.com/suketa/items/9830f814ee824ca4e681) などを参考にしてください。

# Rails プロジェクトを作る

```
$ rails new rails_sandbox
cd rails_sandbox
```

# User の CRUD を作成する

```shell
$ bin/rails g scaffold User name
```

# request spec を編集する

`spec/requests/users_spec.rb` を編集します。

ここで `response.content_type` と `response.media_type` のテストを追加していることに注意してください。

```ruby:spec/requests/users_spec.rb
require 'rails_helper'

RSpec.describe "Users", type: :request do
  describe "GET /users" do
    it "works! (now write some real specs)" do
      get users_path
      expect(response.content_type).to eq('text/html; charset=utf-8')
      expect(response.media_type).to eq('text/html')
      expect(response).to have_http_status(200)
    end
  end
end
```

# 実際にテストする

実際にテストすると spec が通ることが確認できます。

```shell
$ rspec spec/requests/users_spec.rb
```

# Rails 5 では

Rails 5.2.3 では、 `content_type` は `text/html` を返すため spec が失敗します。
つまり、以下のように書くと、 spec が通ります。

```ruby:spec/requests/users_spec.rb
      expect(response.content_type).to eq('text/html')
```

# ちなみに

今回、 request spec に登場した `response` のクラスは、  `ActionDispatch::Response` の 派生クラスの `ActionDispatch::TestResponse` です。
ですが、 `content_type` メソッドは、 `ActionDispatch::Response` クラスで実装されています。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try103_response_content_type

# 参考情報

* [Change `ActionDispatch::Response#content_type` returning Content-Type header as it is](https://github.com/rails/rails/pull/36034)
- [Make `ActionDispatch::Response#content_type` behavior configurable](https://github.com/rails/rails/pull/36490)
MySQL Workbechからコマンドラインでmysqlに接続する

# 概要
MySQL Worckbenchに登録されてる接続先に、ターミナルから簡単にmysqlコマンドで接続する方法です。

SQLのトランザクションを検証したかったのですが、
WorkbenchのGUIからの複数のトランザクションを開始して、対話的ににクエリ実行する方法が思いつかなかったので、コマンドで実行する必要がありました。
（もっといい方法があるかもしれないけど）

接続方法が、SSHの踏み台経由（Standard TCP/IP over SSH）でも問題なく接続できました。


## 手順

起動後のトップ画面で、任意の接続先で右クリック→「Start Command Line Client」

![スクリーンショット 2019-11-01 12.27.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/eb600b74-bc91-2ac3-7176-6847f04db8f5.png)

やったー！

![スクリーンショット 2019-11-01 12.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/221874b4-fc08-4b61-556a-82ac4363e301.png)
Pythonの数値、文字列、リスト型（Python学習メモ①）

# Pythonの型

## 数値
ポイント

* 除算(`/`)は常にfloatを返す
* 切り下げ除算を行ってint型を得たい場合は `//` 演算子を使う
* 剰余を得たい場合は`%`を使う
* 演算対象の型が混在していた場合は、整数は浮動小数点数に変換される
* 対話モードでは、最後に表示した式を変数「`_`」に代入してあるので電卓と使用するのに楽
* Pythonでは整数型、浮動小数点数型以外にも、十進数(Decimal)や有理数(Fraction)などがサポートされている
* 複素数もサポートされており、虚部を表現するのに接尾辞に`j`または`J`を使用して`3+5j`などとする

```python

# 足し算
>>> 2+2              
4
      
# 引き算と掛け算
>>> 50 - 5 * 6        
20                   
>>> (50 - 5) *6      
270

# 割り算
>>> 17 / 3       
5.666666666666667
>>> 17 // 3      
5                
>>> 17 % 3       
2

# 商と剰余を両方取得する
>>> divmod(17, 3)
(5, 2)

# 基数
# 0b: 2進
# 0o: 8進
# 0x: 16進
>>> 0b10
2
>>> 0o10
8
>>> 0x10
16

# 累乗
>>> 5 ** 2
25
>>> 5 ** 3
125

# 対話モードを電卓として使う
>>> _ + 1
126
```

## 文字列型
ポイント

* 引用符にはシングルクォート、ダブルクォートどちらも使用でき、区別されない
* クォート文字のエスケープは`\`でできる
* `\`を前置した文字列が特殊文字に解釈されるのが嫌な場合はraq文字列を使う
* 複数行の文字列はトリプルクォートで表現できる
* 行末文字は自動的に文字列に含まれるが、改行したくない場合は行末に`\`を置くとエスケープされる
* 文字列は`+`演算子で結合でき、`*`で繰り返すこともできる
* 文字列リテラルが連続している場合は自動で連結される
* 文字列はインデックス指定が可能
* インデックスは文字と文字の間を指す数字であり、最初の文字が0番目となる（0から始まる）
* 文字列はスライシングも可能
* インデックスで範囲外の値を指定するとエラーになる
* スライシングは範囲外を指定してもエラーにはならない
* pythonの文字列はimmutableなので、インデックスを利用して文字の改変を行うことはできない(やりたい場合は新たに文字列を生成する)
* len関数は文字列の長さを返す

```python
# パス名には / を使えるので，以下は不要
# raw name (文字列の前にrをつける)
>>> print('C:\some\name')
C:\some
ame
>>> print(r'C:\some\name')
C:\some\name

# 複数行
print("""\
    Usage: thingy [OPTIONS]
        -h Display this usage message
        -H hostname   
""")
# 出力
Usage: thingy [OPTIONS]
        -h Display this usage message
        -H hostname

# 文字列の繰り返しと連結
>>> 3 * "un" + "ium" 
'unununium'

# 文字列リテラルの自動連結(変数では使えない)
>>> 'Py' 'thon' 
'Python'

# index
>>> word[0]
'P'
>>> word[-1] 
'n'

# slice
>>> word[:3] 
'Pyt'
>>> word[3:] 
'hon'

# len
>>> len(word) 
6
```

## リスト
ポイント

* 基本的には同じ型を入れる
* 文字列同様、インデックスとスライシングが使える
* スライシングは常に要求された要素を含んだ新たなリストを返す
* リストは文字列と違ってmutableなので変更可能
* `.append`で末尾に要素を追加する
* スライシングへの代入も可能
* len関数はリストにも使える
* リストは入れ子にできる

```python
# リスト
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f']
# index
>>> letters[1] 
'b'

# slicing
>>> letters[3:] 
['d', 'e', 'f']

# append
>>> letters.append('g') 
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']

# slicingへの代入
>>> letters[3:5] = ['D', 'E'] 
>>> letters
['a', 'b', 'c', 'D', 'E', 'f', 'g']

# len
>>> len(letters)
7

# 入れ子のリスト
>>> array = [['a', 'b', 'c'], [1, 2, 3]] 
```

## フィボナッチ数列を求める

```python

# フィボナッチ級数
# このように多重代入が可能
a, b = 0, 1

while b < 10:
    print(b)
    a, b = b, a+b
```

## print関数について
* 複数値を引数に指定可能
* キーワード引数endを使うと、出力末尾の改行の抑制や、出力末尾を他の文字列に変更することができる
* キーワード引数sepを使うと、出力される値を区切る文字列を変更できる

```python
name = 'Kawausomando'
# 複数値指定(間にはスペースが付与される)
print('My name is', name)
# 出力: My name is Kawausomando

# endキーワード 
print(name, end=' is my name')
# 出力: Kawausomando is my name

# sepキーワード
print(1, 2, 3, sep=' and ')
# 出力: 1 and 2 and 3
```
LaravelでMonologの出力結果をテストする

この記事ではLaravelを利用している場合のユニットテストで、Monologの出力結果をテストする方法を紹介します。
テストする対象のクラスは以下のような感じです。

```php
class Log {
    private $logger;
    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function exec(): void
    {
        $this->logger->info('sample log');
    }
}
```

この`logger->info`で適切文言が出力されていることを確認するユニットテストを書きます。

```php
class LoggingTest extends TestCase {
    private $log;
    public function setUp(): void
    {
        parent::setUp();
        config([
            'logging' => [
                'channels' => [
                    'test' => [
                        'driver' => 'custom',
                        'via' => function () {
                            $handler = new TestHandler();
                            return new Logger('test', [$handler]);
                        },
                    ],
                ],
            ],
        ]);
        $this->log = new Log($this->app->make(LoggerInterface::class));
    }

    /**
     * @test
     * /
    public function logging()
    {
        $this->log->exec();
        $records = $this->app->make(LoggerInterface::class)
            ->getHandlers()[0]
            ->getRecords();
        $this->assertCount(1, $records);
        $this->assertEquals(
            'sample log',
            $records[0]['message']
        );
    }
}
```
phpunit.xmlに以下を追加

```xml
<php>
  <env name="LOG_CHANNEL" value="test"/>
</php>
```

また、Laravel5.6以前であれば`setUp`に`config`ではなく、以下のコードを挿入でも行けるみたいです（検証してません）

```php
$this->app->configureMonologUsing(function ($monolog) {
    $monolog->pushHandler(new \Monolog\Handler\TestHandler());
});
```

### 解説

```php
$records = $this->app->make(LoggerInterface::class)
    ->getHandlers()[0]
    ->getRecords();
```
この`getHandlers`では登録されているHandlerが配列で取得でき、今回はchannels.testは一つのHandlerしか登録していないので配列の先頭で`TestHandler`が取得できます。
`TestHandler`には`getRecords`メソッドからlogとして出力されたレコードが取得できます。
これによってテスト時に実行されたログと比較して意図した出力になっているかどうかを確認することがきでます。
LaravelでMySQLのテーブルロックを実行する

# 実装例

## 占有ロック

```php
 DB::unprepared('LOCK TABLES lock_target_table WRITE');
```

## 共有ロック

```php
 DB::unprepared('LOCK TABLES lock_target_table READ');
```

Eloquentのクエリビルダを使う方法は見つけられなかったので、生クエリを実行している

## ダメな例

```php
HogeHogeModel::lockForUpdate()->get();
```

全レコードに対して`lockForUpdate()`しても、テーブルロックの挙動にならなかった。
（別のトランザクションから、まだ存在しないレコードに対して占有ロック（ギャップロック ）をかけることができてしまい、その後デッドロックになるリスクがある）

# 検証

## 全行ロックだと存在しない行のロックがブロックされない例
| T1 | T2 | コメント |
|:--|:--|:--|
| BEGIN; |  |  |
|  | BEGIN; |  |
| SELECT * FROM locks FOR UPDATE; |  | 行全部ロック |
|  | SELECT * FROM locks WHERE name="not_exist_record" FOR UPDATE;  | 存在しない行のロックが取れてしまう |
|  | >Empty set |  |

## テーブルロックで存在しない行のロックがうまくブロックされる例
| T1 | T2 | コメント |
|:--|:--|:--|
| BEGIN; |  |  |
|  | BEGIN; |  |
| LOCK TABLES locks WRITE; |  | テーブルロック |
|  | SELECT * FROM locks WHERE name="not_exist_record" FOR UPDATE;  | 存在しない行のロック |
|  | ... | T1のテーブルロックが終わるまで待つ |
| COMMIT; |  |  |
|  | >Empty set | T1のテーブルロックが終わったので実行される |


## Versions

- Laravel 5.8
- MySQL 5.7
RailsでCSSやJavaScriptが読み込まれる仕組みをアセットパイプライン、Sprockets、マニフェストファイルで理解する

本来、HTML,CSSでサイトを作成する際は、HTMLファイルからlinkタグを使ってCSSファイルを読み込む設定が必要です。

しかし、Railsの場合、それらを記述する必要はありません。

じゃぁどうやって必要なCSSやJavaScriptが読み込まれるのか？？
**アセットパイプライン**
**Sprockets**
**マニフェストファイル**
のこれらの単語を使ってざっくり理解する。

#アセットパイプライン
要は、まとめてくれる（統合してくれる）って仕組み。
詳しく働きをみると以下のようになる。
1.コンパイル
2.統合
3.圧縮
4.ダイジェスト付与
5.完成したファイルが`public/assets/`に保存される

#Sprockets
アセットパイプラインの動作を担っているのがSprockets。
gemとしてデフォルトで入っている。
アセットパイプラインはデフォルトで有効なので、無効にしたい場合は`--skip-sprockets`をつけて以下のコマンドを実行。

```
＄ rails new appname --skip-sprockets
```

#マニフェストファイル

app/assets/javascripts/application.js
app/assets/stylesheets/application.css
がそれぞれcssとJavaScriptのマニフェストファイル。
ここに記述されてある`require_tree.`によって指定されるディレクトリのファイルが全て読み込まれる



#オススメ記事
[Ruby on Rails のアセットパイプラインの挙動を環境ごとに学ぶ](https://numb86-tech.hatenablog.com/entry/2018/11/10/002439)
[Railsガイド　アセットパイプライン](https://railsguides.jp/asset_pipeline.html)
[railsのアセットパイプラインについて解説する](https://qiita.com/hogehoge1234/items/9a94ebc93c5f937502cd)
[]()
[]()
[]()
[Android] Chip使用時にInvocationTargetExceptionが発生する

## 概要
　Androidアプリ開発時にChipを利用しようとしたら、`InvocationTargetException`が発生。私が解決した方法を記述します。  
**※注意** 私が解決できた方法であり、必ず解決するわけではないと思うので、「もしかしたら解決するかも？」程度にお試しください...

## 解決方法
`android:textAppearance`を設定したらエラーを解消できました。
xml

```xml.fragment.xml
<com.google.android.material.chip.ChipGroup
            android:id="@+id/chooseService_chipGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <com.google.android.material.chip.Chip
                android:id="@+id/chip1"
                style="@style/Widget.MaterialComponents.Chip.Filter"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"/>

            <com.google.android.material.chip.Chip
                android:id="@+id/chip2"
                style="@style/Widget.MaterialComponents.Chip.Filter"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"/>

            <com.google.android.material.chip.Chip
                android:id="@+id/chip3"
                style="@style/Widget.MaterialComponents.Chip.Filter"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"/>
</com.google.android.material.chip.ChipGroup>
```

## まとめ
　今回はxml上で静的に`TextAppearance`を設定しましたが、動的に行う場合は`Chip.setTextAppearance`で行うことができます。
 　`InvocationTargetException`はコンストラクタなどで発生する例外なので、xmlの要素に設定した値が間違っているか、不足している場合に呼び出されます。そのため、もう一度設定した値が間違っていないかを確かめてみてください。

### 参考文献
AndroidDevelopers Chip
 https://developer.android.com/reference/com/google/android/material/chip/Chip
Terraformで特定の「複数」のresourceをplan/apply/destoryする

# 背景（結論だけ知りたい人は読み飛ばしてどうぞ）
AWSのリソースをterraformを使って管理しているが、コンソールで対応した内容が反映できてなかったり、他の人の作業内容が反映されてなかったりで、作業前にplanを実行すると差分が出る事がままある。（あったらイカンのだけど）
で、特定のリソースだけplan/apply/destoryしたいと思った時に複数のリソースを指定する方法がわからず、結局差分のリソースを修正したり、ignoreして差分を解消してから全体にplan/apply/destoryを行っていた。
そろそろ我慢の限界で雑な調査をやめて調べたところ特定の複数のリソースに対してplan/apply/destoryを行う方法が分かったので投稿。

# 構文
```
terraform plan -target={type.local-name01,type.local-name02}
```
type：リソースの型や種類。（例：aws_instanceなど）
local-name：terraform内の識別用の名前（例：webなど）

[リソースの構文についての参考サイト](https://www.terraform.io/docs/configuration/resources.html)

最後まで読んで頂きありがとうございました。　(・ω・)ノシ
GoJSをNuxt.jsで使う

#GoJSとは

GoJSは、JavaScriptとTypeScriptで、インタラクティブにダイアグラムやグラフを書くためのライブラリです。
有料のライブラリですが、美しいダイアグラムやグラフを書くツールを作成できます。
https://gojs.net/latest/index.html

#前提

まずNuxt.jsプロジェクトを作成してください。
作成したプロジェクトのディレクトリに移動してください。

#1. Go.jsのインストール


インストールは、npmコマンドまたは、yarnコマンドでインストールできます。
いつも通りですね。

```
npm install --save gojs
````

npm ではなく、yarnを利用している場合は、次になります。

```
yarn add gojs
```

#2. 動作確認

pages/index.vueを次のものに置き換えてください。
（どのvueファイルでもいいです。動作確認できるものであれば）

```pages/index.vue
<template>
  <div class="wrapper">
    <div
      id="myDiagramDiv"
      style="width:100%;height:600px;"
    />
  </div>
</template>

<script>
import * as go from 'gojs'
const $ = go.GraphObject.make
export default {
  components: {},
  props: {},
  data () {
    return {
    }
  },
  mounted () {
    const myDiagram = $(go.Diagram, 'myDiagramDiv',
      {
        'undoManager.isEnabled': true 
      })
    const myModel = $(go.Model)
    myModel.nodeDataArray = [
      { key: 'Alpha' },
      { key: 'Beta' },
      { key: 'Gamma' }
    ]
    myDiagram.model = myModel
  },
  methods: {}
}
</script>
```

下記にアクセス。
http://localhost:3000/


#3. Vue.jsっぽくしていく

このままだとVue.jsとして扱いにくいですね。そこで少しだけVue.jsらしくすることで、扱いやすくしましょう。

``` pages/index.vue
<template>
  <div class="wrapper">
    <div
      id="myDiagramDiv"
      style="width:100%;height:600px;"
    />
  </div>
</template>

<script>
import * as go from 'gojs'
const $ = go.GraphObject.make
export default {
  components: {},
  props: {},
  data () {
    return {
      nodes:[   //変更
         { key: 'Alpha' },
         { key: 'Beta' },
         { key: 'Gamma' }
      ]
  },
  mounted () {
    const myDiagram = $(go.Diagram, 'myDiagramDiv',
      {
        'undoManager.isEnabled': true 
      })
    const myModel = $(go.Model)
    myModel.nodeDataArray = this.nodes //変更
    myDiagram.model = myModel
  },
  methods: {}
}
</script>
```

このサンプルだと、あまり変えるところがないですが、
propsやVuexを使うことで、データを渡すだけで、データに応じた初期データを持つダイアグラムを作るコンポーネントにできます。

#おわりに

ReactやAngularのプロジェクトは、始まっているのですが、Vueのプロジェクトは始まっていません。Vueプロジェクトを始めるチャンス？
【ケース別】XMLのonClickでViewModel上の関数を呼び出す

## ○ 目次　
  - 1. 引数なし関数の呼び出し方 
  - 2. 引数あり(View型以外)関数の呼び出し方  
  - 3. 引数あり(View型のみ）関数の呼び出し方 
  - 4. まとめ
  
 
## 1. 引数なし関数の呼び出し方 
#### ViewModel
```kotlin.viewModel.kt
fun onButtonClicked(){
        //省略
}
```
#### XML
```xml.fragment_main.xml
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Test"         
    android:onClick="@{() -> viewModel.onButtonClicked()}"/>
```
　ViewModel側では普通のpublicな関数を用意するだけです。
　xml側では`android:onClick`に`"@{() -> viewModel.関数名()}"`といった形で設定します。

## 2. 引数あり(View型以外)関数の呼び出し方
#### ViewModel
```kotlin.viewModel.kt
fun onButtonClicked(key:String){
        //省略
}
```
#### XML
```xml.fragment_main.xml
<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Test"         
    android:onClick="@{() -> viewModel.onButtonClicked('key')}"/>
```
 　ViewModelでは任意の型の引数を取る関数を用意します。（引数は複数でも可)
 xmlでは引数あり関数の呼び出し方と同様にして`android:onClick`に記述します。先ほどと違う点については、関数内に引数を取るところです。
　上の例では直接`('key')`と値を設定していますが、実際は`<data>`の`<variable>`にデータクラスなどを設定しておいて、それを呼び出す形になると思います。

## 3. 引数あり(View型のみ)関数の呼び出し方  
#### ViewModel
```kotlin.viewModel.kt
fun onRadioButtonClicked(view:View){
    when(view.id){
        //省略
    }
}
```
#### XML
```xml.fragment_main.xml
<RadioButton
    android:id="@+id/radioButton1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="category1"         
    android:onClick="@{viewModel.onRadioButtonClicked}"/>
```
　viewModel側で2の説明と変わったところは関数の引数が`view:View`となったところです。今回の例はこのケースのみ使用することができます。このようにすることで、`onClick`を呼び出したViewを取得することができます。
　xml側の変更点は、`android:onClick`内の記述が`@{viewModel.onRadioButtonClicked}`となったところです。viewそのものを引数に取るので明示的に書かなくていいみたいです。
　今回の方法は、クリックイベントの後にそのViewのプロパティを変更するときや、`RadioButton`など複数のViewから選択されたViewを取得する際に便利そうです。

## 4.まとめ

ViewModelでは任意の引数を持つ関数を書いて、引数に応じてXMLの`android:onClick`の記述方法を変えることで実現できます。

- 1. 引数なし　　　　　　-> `@{()-> viewModel.onclick()}`
- 2. 引数あり(view型以外) -> `@{()-> viewModel.onClick('key')}`
- 3. 引数あり(View型)　　->`@{viewModel.onClick}`
Netlify functionsでCORSの設定ができない件

[Netlifyのコミュニティのディスカッション](https://community.netlify.com/t/access-control-allow-origin-policy/1813)に従って、静的ファイルホスティングは以下のようにAccess-Control-Allow-Originを設定すると機能したが、Functionについては反映されなかった。

```toml:netlify.toml
[[headers]]
  for = "/*"
    [headers.values]
    Access-Control-Allow-Origin = "*"
```

なので、ハンドラーで直接ヘッダーを設定するようにしたら問題なく動作しました。

```golang:main.go
return &events.APIGatewayProxyResponse{
  Headers: map[string]string{
    "Access-Control-Allow-Origin": "*",
  },
  StatusCode: http.StatusOK,
  Body:       string(jsonString),
}, nil
```
ゼミサマリ：DNNの情報量

## 概要
[パンハウスゼミ](https://twitter.com/breadhouse_semi)のサマリです。
テーマ : DNNの情報量に関する6本。
スライドリンク :https://www.slideshare.net/HitoshiNakanishi/20191027-bread-house-seminar-187375460
発表者 : 37

## 1本目
題名 : Deep Variational Information Bottleneck
Paperリンク : https://arxiv.org/abs/1612.00410
新規性 :VIBを確立した
データXから良い表現Zを抽出する Information Bottleneck(1999)をDNNに適用した。
X→Z→Yの際、情報量Iについて
I(Z, X)：小さくしたい：小さく圧縮したいから。大きいと過学習だといえる。
I(Z, Y)：大きくしたい：沢山復元したいから。
「I(Z, Y) - β*I(Z, X)」 を大きくしよう!
βが小さいと「I(Z, Y) - β*I(Z, X)」が大きくなり、嬉しい
↑これVAEでは？
実験：3層NN(βVAEの最後の層を分類にしたもの)でMNIST。良い結果。

今後の展開：
①オープンユニバース問題(世の中にラベリングするものが多すぎてすべてラベリングできない問題。OODはOODとして判別したい)
②時系列問題

## 2本目
題名 : Information Dropout: Learning Optimal Representations Through Noisy Computation
Paperリンク : https://arxiv.org/abs/1611.01353
新規性 : Information Dropoutを提案(VIBをDropoutで再現) + TC項を追加
1本目はVIBをVAEの観点から考えたが、本論文はDropoutの観点から考える。
VAEではzに正規分布を仮定したが、確率εでDropoutするモデルを考えたら、数学的にDropoutと等価であると分かった。
さらに、TC項(Total Correlation)を考える。TC項が小さいとdisentangleと言える。
disentangle : 変数のもつれが解けていること
βが大きいとTC項を小さくすることができる。
論文1本目はβが小さいと嬉しかったが、本論文ではβは大きい方が嬉しい
→要するに、大きすぎても小さすぎてもダメ

## 3本目
題名 : Emergence of Invariance and Disentanglement in Deep Representations
Paperリンク : https://arxiv.org/abs/1706.01350
新規性 : IB Lagrangian の良さの理由を考えた
「情報抽出の良さ」の物差しは4種類
①情報の十分性(sufficient) = I(Z, X)とI(Z, Y)を同じにしたい
②最小性(minimality) = 復元抽出にいらない情報は小さくしたい。①とトレードオフ
③noise頑健性
④もつれがない状態(disentanglement)
IB Lagrangian は交差エントロピー項 + β*正則化項。大きい方がいい。
交差エントロピー項を、
①intrinsic error : 問題固有の誤差。どうしようもない。
②sufficiency : データセットが持つ情報量。大きい方が嬉しい。
③efficiency : 近似のよさ。大きい方が嬉しい。
④負の過学習項 : 小さい方が嬉しい。
に分けて考える。
IB Lagrangian は十分性と最小性の達成を持つ。
最小性がある時、めっちゃ圧縮してるということなので、noise頑健性もある。
VIBがうまく行ったのは、過学習項を上からバウンドしたから。
更に、ヘシアンで上からバウンドできる。
ヘシアンが小さいと情報量は小さくなり過学習しない。
※ヘシアンは二回偏微分行列

## 4本目
題名 : Where is the Informaton in a Deep Neural Network?
Paperリンク : https://arxiv.org/abs/1905.12213
新規性 : DNNの情報はどこにあるのかを考えた。学習過程でFIMを追うことで、新規の知識獲得 + 情報の圧縮 (compression) が繰り返される事を確認した。
重みの持つ情報量は問題の複雑さに依存する。
データセットについて平均を取ってたのがI(ｗ；D)、つまりシャノンの相互情報量。
正規分布を仮定するとヘシアンとフィッシャーが似るので重さの情報量をヘシアンで書けない。
※基本ヘシアンは二回微分なのでdeepでは計算できない。
　しかしフィッシャーなら計算できる！
そもそも情報とは何か？→摂動が起こった時のエラーの起きなさ。ちゃんと分類できる力。

##5本目
題名 : CRITICAL LEARNING PERIODS IN DEEP NETWORKS
Paperリンク : https://arxiv.org/abs/1711.08856
モデル自体が情報を持ってると学習のよさは減る。
だから最初に学んだことのがよく反映される。
クソデータは最初の方で入れよう。

##6本目
題名 : TASK2VEC: Task Embedding for Meta-Learning
Paperリンク : https://arxiv.org/abs/1902.03545
分類問題①で学習させた重みで分類問題②をファインチューニングする時、問題①と②が「近い」方が少ないエポックで学習できる。
問題の近さをベクトル化できて嬉しい！
例：「犬の分類」は、「鳥の分類で学習した重み」より「猫の分類で学習した重み」を使ってファインチューニングする方が速く学習できる。
→「犬と鳥」より「犬と猫」の方が近いと言える。
ゼミサマリ：Active learning

## 概要
[パンハウスゼミ](https://twitter.com/breadhouse_semi)のサマリです。
テーマ : Active learning関係。正解なしデータのプールから次に問い合わせるデータの選び方に関する3本。
スライドリンク :
https://twitter.com/breadhouse_semi/status/1187000040671174656
https://twitter.com/breadhouse_semi/status/1187004390948790273
https://twitter.com/breadhouse_semi/status/1187005776818126849
発表者 : ヘンリー

## 1本目
題名 : Active Learning for Convolutional Neural Networks: A Core-Set Approach
Paperリンク : https://arxiv.org/abs/1708.00489
新規性 : coresetをActive Learning(AL)に適用した
coreset:ALと別の分野で発展してきた。データを代表するデータ。
coresetを使えばデータ全体で学習させたときと同じような分類/回帰結果が得られる。従来は教師アリデータに適用する文脈で発展してきた手法だが、それをALに適用した。
ロスは学習誤差/汎化誤差/coreset誤差に分解できる
coreset誤差は2つの項で上からバウンド可能
（１）coreset集合sのO(δs)
（２）データ数nのO(n^(-1/2))
※δsは「すべての点がcoresetからδs内にある」を満たす最小値

## 2本目
題名 : Learning in Confusion: Batch Active Learning with Noisy Oracle
Paperリンク : https://arxiv.org/abs/1909.12473
新規性 : いろんな手法を集めて問題解決できることを示した
ALの問題は大体3種類に分類できる
（１）（バッチALの時）選ぶラベルの多様性と代表性が足りない問題
※ ‪従来の AL は「これの正解がわかれば性能があがるかも」というデータを一つずつ選ぶけど、それを一バッチずつ選ぶに拡張するのがバッチAL‬
ユークリッド距離でなく2点間のsoftmaxの出力間のJS-divergenceをmetricとしてクラスタリングしよう
※JS-divergenceは対称だから良さげ(KLとかは対称じゃない)
各クラスタの代表点を選ぶためにBALD score使おう
※BALD score : Dropoutによってモデルの出力は特定の状況におけるベイジアンNNの事後分布の推定に当たる→事後分布からBALD scoreが計算できる。大きいと不確実。
（２）モデルが不確実な時はどうする問題
学習初期、モデルの不確実性が高い時に softmaxを使うのは意味がないのでは？
すべてのサンプルから一様にサンプリングすれば実験的にOKだった(最初は一様にサンプリングして，オラクルから正しいラベルを少しもらい、その方法(ソフトマックス+距離を使う方法)を使ってクラスタリングする)
※ALではオラクルが返すラベルは正しいと仮定している
（３）オラクルのノイズ
フィルターレイヤ(全結合層)をNNの最後に入れて学習させる
フィルターレイヤより前はノイズを学習してないと仮定し、推論時はフィルターレイヤを捨てて、1個前のレイヤの出力を使う

## 3本目
題名 : Deep Batch Active Learning by Diverse, Uncertain Gradient Lower Bounds
Paperリンク : https://arxiv.org/abs/1906.03671
新規性 : 勾配を使ってBADGEを考えた
unsertaintyを測る度合にはBALD score、エントロピーとかがある
勾配を使ってunsertaintyを測る度合BADGEを提案した。(自信がなければ勾配が大きくなる)
多様性の指標にはをk-means++の初期化に使われるアルゴリズムを使おう
代表性については(本論文では)考えてない
Nuxt.jsのSPAモードでもOGPを動的に生成しSNSシェアに対応する(Laravel)

# 結論

Nuxt.jsだけではなく、サーバーサイドでなんらかしらの処理が必要

## 前提条件

- [nuxt-laravel](https://github.com/m2sd/nuxt-laravel)の環境構築がすでに完了している

参考にこちら[Nuxt.js2.10とLaravel(6.0)を同一ディレクトリで動かすnuxt-laravelをDockerで環境構築](https://qiita.com/ProjectEuropa/items/6f8c8a70107334bc8605)

## 実装例

nuxt-laravelを構築していれば、Nuxt.jsでもLaravelの機能を使える。
そこでLaravelのMiddlewareを使って、OGPを動的に生成する。

今回はTwitterBotにのみOGPを動的に生成してみる。

```
php artisan make:middleware SetOgpToTwitterBot
```

```php
// nuxt-laravel/app/Http/Middleware/SetOgpToTwitterBot.php
<?php

namespace App\Http\Middleware;

use Closure;

class SetOgpToTwitterBot
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $userAgent = $request->header('User-Agent');

        if (strpos($userAgent, 'Twitterbot') !== false) {
            print '<meta name="twitter:description" content="TwitterOnly">';
            print '<meta name="twitter:title" content="ForTwitter">';
        }

        return $next($request);
    }
}
```

```php
// nuxt-laravel/app/Http/Kernel.php
    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\SetOgpToTwitterBot::class // 追加
        ],
```

こんな感じでTwitterBotが来たときだけOGPを生成することが可能。
実際にはURLからJSONのAPIの情報を見てゴニョゴニョする処理が出てくると思う。
【PyQt】QLabelのテキストカラー変更

# 環境
+ Windows 10
+ Python 3.7.3
+ PyQt5 5.13.1
+ Qt Designer 5.11.1

# QLabelのサンプル作成
Qt Designerを使って、適当なラベルを配置した画面を作ります。
Designerを使った画面の作り方は[こちら](https://qiita.com/grinpeaceman/items/54b439bfa52640c444e1)を参考。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/e64f6b91-8e09-75da-5dac-25f3129be1f1.png)

```python:hoge_label_ui.py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'hoge_label.ui'
#
# Created by: PyQt5 UI code generator 5.13.1
#
# WARNING! All changes made in this file will be lost!


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(225, 123)
        self.hoge_label = QtWidgets.QLabel(Form)
        self.hoge_label.setGeometry(QtCore.QRect(30, 20, 181, 91))
        font = QtGui.QFont()
        font.setPointSize(64)
        self.hoge_label.setFont(font)
        self.hoge_label.setObjectName("hoge_label")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.hoge_label.setText(_translate("Form", "hoge"))

```

```python:label_sample.py
import sys

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QMainWindow

from hoge_label_ui import Ui_Form


class LabelSample(QMainWindow, Ui_Form):
    def __init__(self, parent=None):
        super(LabelSample, self).__init__(parent)
        self.setupUi(self)


if __name__ == '__main__':
    argvs = sys.argv
    app = QApplication(argvs)
    label_sample = LabelSample()
    label_sample.show()
    sys.exit(app.exec_())
```
# テキストの色を変える
`self.hoge_label.setStyleSheet("QLabel { color : red; }")`
を追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/12cce176-b374-a79c-c11f-966e5dd6f6d5.png)

```python:label_sample.pyの一部
    def __init__(self, parent=None):
        super(LabelSample, self).__init__(parent)
        self.setupUi(self)
        self.hoge_label.setStyleSheet("QLabel { color : red; }")
```

色の指定は16進表記でもOK。
`self.hoge_label.setStyleSheet("QLabel { color : #ff0000; }")`

あるいはDesigner上のプロパティのstyleSheetを編集しても同じことができます。

![edit_stylesheet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404447/4ca8fa35-431c-994c-f254-411a9a2b289e.png)


# 参考URL
+ https://stackoverflow.com/questions/2749798/qlabel-set-color-of-text-and-background
ruby メソッドの作り方

ドットインストール（https://dotinstall.com/）を見て
自分なりにまとめたものです。

#メソッド

```ruby
def  sayHello
    puts "Hello word!!"
end

sayHello
```
実行結果：Hello word!!
　

- メソッドを呼び出すときはメソッド名書くだけで呼びだせる


```ruby
def  sayHello(name)
    puts "Hello #{name}!!"
end

sayHello ("Angela") #()は省略可能
```


- 引数を渡すことも出来る

実行結果：Hello Angela!!


```ruby
def  sayHello(name = "Angela")
    puts "Hello #{name}!!"
end
# nameを渡されなかった時に"Angela"が渡される
sayHello 

```

- 引数にデフォルト値も設定できる

実行結果：Hello Angela!!



```ruby

def  sayHello(name = "Angela")
    return "Hello #{name}!!"
end

p sayHello
```

- メソッドは最後に評価された値を返す
- returnで返されたのは"Hello #{name}!!"
　p で返されたものを表示している。

実行結果： "Hello Angela!!"




# ローカル変数の話
- whetherはローカル変数だからdef～endの中でしか使えない

```ruby
def  sayHello(name = "Angela")
    weather = "sunny"
    return "Hello #{name}!!"
end

p sayHello
p weather
```
実行結果：エラー