OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryでの中央値の算出


#はじめに
中央値を使って、データをクリーニングすることがたまにある。例えば、複数人がそれぞれで同じデータを手入力した場合などである。
しかもBigueryでは、他のSQLにあるMEDIANが用意されていない。

#データ概要
複数人がそれぞれで同じデータを手入力したサンプルをtable1とする。
同じ事象に対して人がそれぞれ入力したとしても、本来はみな同じデータになるはずだが、手入力していると、どうしても間違いが起こる。この例では、2019-12-2のCの入力が、165,000-と入力すべきところを間違って1,650,000-と入力したように思える。

このデータをどうにかして、キレイにしたい。

####table1

|date |person |sales |
|-----|-------|------|
|2019-12-1 |A  |150,000  |
|2019-12-1 |B  |150,000  |
|2019-12-1 |C  |150,000  |
|2019-12-2 |A  |165,000  |
|2019-12-2 |B  |165,000  |
|2019-12-2 |C  |1,650,000  |
|2019-12-3 |A  |140,000  |
|2019-12-3 |B  |140,000  |
|2019-12-3 |C  |140,000  |

ここでは、誰が入力したかは重要ではなく、dateごとにsalesのデータをまとめたい。つまり、table1をtable2のように集約したい。

####table2

|date |sales |
|-----|------|
|2019-12-1 |150,000  |
|2019-12-2 |165,000  |
|2019-12-3 |140,000  |


単に平均値で集約すると、table2のようにはならないので、中央値を使って、クリンジングするのである。
中央値を使うとtable2のようになり、間違って入力された1,650,000-は無視される。
もちろん、中央値を使えば完璧だというわけではなく、平均値よりはマシという感じではあるが、使用する場面は意外に多いように思う。

#SQL作成（Persistent UDF）

大体のSQLでは、MEDIANが使えるので、以下のように書けば、table2が作成できる。

```sql

SELECT
  date,
  MEDIAN(sales) AS sales
FROM
  table1
GROUP BY
  date
```

しかしながら、BigQueryではMEDIANが用意されていない。
BigQueryにも、PERCENTILE_CONT()という関数が用意されており、第2引数に0.5を入れると中央値が算出できるものの、window関数なので、table2を作成しようとすると一手間増える。

```sql
SELECT
  date,
  MAX(median) AS sales
FROM
  (SELECT
    date,
    PERCENTILE_CONT(sales, 0.5) OVER(partition by date) as sales
  FROM
    table1)
GROUP BY
  date
```

上記のSQLでもtable2は作成できるのだが、ちょっとダサい。

色々調べていると、Felipe Hoffa氏がPersistent UDFを作成していて、特に宣言しなくて誰でもMEDIANの代わりになる関数を使うことが出来る。
Felipe Hoffa氏が作成したPersistent UDFを使うと、table2が作成できる。

```sql

SELECT
  date,
  fhoffa.x.median(ARRAY_AGG(sales)) as sales
FROM
  table1
GROUP BY
  date
```

これでだいぶスッキリtable2が作成できた。

#最後に
データクレンジグだけでなく、基本統計量としても中央値は使うので、使用場面は意外にありそうである。
また、UDFはよく使う方も多いと思うが、Persistent UDFも意外に使えそうである。


#参考
https://medium.com/@hoffa/new-in-bigquery-persistent-udfs-c9ea4100fd83
kintone Spreadsheetプラグインを作り直している話

# Spreadsheetプラグインについて
kintoneの一覧画面をExcelのようなスプレッドシートの見た目で閲覧、編集をするためのプラグインを作っています。
https://github.com/mura-/kintone-spreadsheet

正確には、もともと下記リポジトリで作っていたのを書き直している状況です。

https://github.com/mura-/kintone-spreadsheet-no-longer-maintained
![image.gif](https://raw.githubusercontent.com/mura-/kintone-spreadsheet-no-longer-maintained/master/image.gif)

# なぜ書き換えたか、変えたこと
最初書き始めたのが4年前で古く、コードの品質もよくない、タスクランナーなどの周辺ツールも古いという点と、そのためにここからグレードアップしようにもやる気がしないという点が大きいです。

今回の新開発からは、下記のようにHandsontable使っている以外は、色々変えて作り直しています。

|| 今回 | 前回 |
| --- | --- | --- |
| 言語 | TypeScript | JavaScript |
| ライブラリ |React, kintone UI Component| Vue |
| グリッド表示ライブラリ | Handsontable | Handsontable |
|バンドラ|Webpack + plugin-uploader| Gulp + browserify |

今回vueからreactに変えたのは、kintone UI Componentとも親和性が高いのもありますし、Vueよりは記述量が増えてしまいますがプリミティブに書きやすいという僕の好みによります。
kintone plugin-uploaderも今回利用しており、Build後コマンドラインでアップロードできるようにもしています。Watchモードにおいては、再Build後自動でアップロードするよう、WebpackのPlugin設定を変更して開発・デバッグしやすくしています。

# 現在の進捗
現時点では設定画面から任意のフィールドを表示する、というところまではできています。
no longer maintainedの方は編集までできますが、まだ追いつけていません。

# 今後どうするか
ひとまずno longer maintainedで実装できていた, データ編集までは実装を進めます。
その後はまだ検討中ですが、少しずつグレードアップしていく予定です。

ちなみに、[krewSheet](https://krew.grapecity.com/) など、すでに展開されているサービスと違うのは、機能はだいぶ少ないですが、無料、あるいは低価格で使えることを目指しています。（半分趣味）

もしくはIssueに要望をいれていただければそこから対応するかもしれません！要望あればぜひご意見ください。
Google Cloud Vision APIをPythonから利用する

#目的
ちょいちょいやり方を忘れるので備忘録として。

#必要なもの
* 有効なGoogleアカウント（ Vision APIが有効になっていることが前提）
* Google Cloud Platformプロジェクトが1つあること
* Python 3.7
* 分析したい画像

分析したい画像は今回はこちらを使います。
![fujisan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495652/bb963570-dbd5-2cbd-5b36-93527fc50d4c.png)


#やり方
##サービスアカウントキーの発行
まずは[ここ](https://console.cloud.google.com/apis/credentials/serviceaccountkey)でサービスアカウントキーを発行します。

今回はJSON形式でダウンロードします。
このファイルはクラウド上のリソースへのアクセスを可能にするものなので、管理は厳重にしましょう。

##Pythonコード

```python
#各種インポート
import io 
import os
from google.protobuf.json_format import MessageToJson
import json
from google.cloud import vision
from google.cloud.vision import types

#今回の作業用ディレクトリ
base_dir = r'path\to\directory'

#さっきのJSONファイルのファイル名
credential_path = base_dir + r'さっきのJSONファイルのファイル名.json'

#サービスアカウントキーへのパスを通す
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credential_path

#visionクライアントの初期化
client = vision.ImageAnnotatorClient()

#対象となる画像のファイル名
file_name = base_dir + r"\fujisan.png"

#画像を読み込み
with io.open(file_name, 'rb') as image_file:
    content = image_file.read()
image = types.Image(content=content)

#実際に扱うメソッド名はここを参照
#https://googleapis.dev/python/vision/latest/gapic/v1p4beta1/api.html

#たとえば、ラベル検出の場合
response = client.label_detection(image=image)

#結果を表示
print(response)
```

#結果
```
label_annotations {
  mid: "/m/015kp7"
  description: "Stratovolcano"
  score: 0.7824147939682007
  topicality: 0.7824147939682007
}
label_annotations {
  mid: "/m/07j7r"
  description: "Tree"
  score: 0.6869218349456787
  topicality: 0.6869218349456787
}
label_annotations {
  mid: "/g/11jwzh3_l"
  description: "Volcanic landform"
  score: 0.5413353443145752
  topicality: 0.5413353443145752
}
```

"Volcanic Landform"だそうです！


#ついでにsafe_searchも試してみる

```python
# ~略~
response = client.safe_search_detection(image=image)
print(response)
```

めちゃめちゃセーフ画像ですね！

```
safe_search_annotation {
  adult: VERY_UNLIKELY
  spoof: VERY_UNLIKELY
  medical: VERY_UNLIKELY
  violence: VERY_UNLIKELY
  racy: VERY_UNLIKELY
}
```

以上！
xray-railsはRails6だと動かないという話

# TL;DR

`xray-rails`gemを使っている方がRails6にアップグレードするときは要注意。

# 事の流れ

## 発端

プロジェクトをRails6に上げたところ、なぜか`image_tag`が動作しなくなりました。具体的には、`app/assets/images/exist.svg`みたいなファイルがあるのに、`image_tag 'exist.svg'`がエラーを吐くようになりました。

## 調査

試しに新規にRails6アプリケーションを作成し、同じファイルをコピーして`image_tag`を使用したところ問題なく動作しました。この時点で該当アプリケーションと新規アプリケーションの差分が原因（ファイルや記法の問題ではない）ということはわかったものの、設定が問題だと思いこんでいたためどこが真の原因かを突き止めることができませんでした。

## ruby-jp

https://ruby-jp.github.io/

自力での調査を続けてもよかったのですが、正直疲れていた私はオンラインで質問することにしました。
幸い、`ruby-jp`というSlackコミュニティがあり、そこには`rails`チャンネルがあるので私はそちらに質問を投下しました。

> undefined method 'pathname' for #<#<Class:0x00007f840557dad8>:0x00007f84088a6018>というエラーが出て困っています。
既存のRails 5.2のアプリをRails 6に上げたら出るようになりました。
image_tagの箇所で出ており、 app/assets/images/hoge.svgが存在するときに image_tag 'hoge.svgを呼ぶと上記エラーとなります。
アセットパイプラインがおかしいとは思うのですが、正常動作しているRails 6のアプリと比べても違いがわからずに困っています。
同じような経験のある方はいらっしゃいますでしょうか…

するとなんと8分後に回答が！

> xray-rails入ってます？

はっとなりました。`Gemfile`に`xray-rails`のエントリがあることは知っていたため「あります」と回答するとURLが。

https://github.com/brentd/xray-rails/pull/103

なるほど…

## 解決

`xray-rails`を`Gemfile`から除外するとエラーは出なくなりました、めでたしめでたし。
（`master`ブランチを使うという手もありましたが、もう使っていないということだったので除外する方法を採りました）

# まとめ

というわけで、`xray-rails`が原因であることが`ruby-jp`のおかげでわかりました、という話でした。回答してくださった`bluerabbit`さんをはじめとした方々、ありがとうございました！
インフラをコードで構築するメリット

## はじめに

インフラをコードで構築することを、英語で「Infrastructure as Code」といいます。

## インフラをコードで構築するメリット

### インフラをバージョン管理できる

インフラをバージョン管理することで、以下が簡単になります。

- インフラにいつどのような変更を行ったか確認する
- インフラの変更を元に戻す

### テキストベースで完結できる

GUIツールを通さないことで、インフラのデプロイを自動化できます。

### インフラの共有・再利用が簡単

コードになっているため、インフラの共有や再利用が簡単に行えます。

## インフラ構築ツール

### AWS CDK

TBD

### Terraform

TBD

### Serverless Framework

TBD

## 参考リンク

- [Infrastructure as Codeの留意点とメリット　～サーバー更改プロジェクトへの適用で得られた知見・実感　 - アイマガジン｜i Magazine｜IS magazine](https://www.imagazine.co.jp/infrastructure-as-codeの留意点とメリット%E3%80%80～サーバー更改プロ/)
Unityでシューティングゲームを作る(2)

##ここまでの進捗

- 背景がループするようにした。
- 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
- 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
- プレイヤーが画面の範囲外に行かないようにした。
- 敵とプレイヤーが衝突したらプレイヤーが消滅する。


##今後やること

- オープニングシーンとエンディングシーンを追加する。
- ボスキャラの動作を実装する。
- <font color="Red">分散攻撃の敵を実装する。</font>
- エフェクトとBGMを追加する。
- 様々な敵の出現方法を考える。

この記事で書くのは赤文字の部分

##分散攻撃の敵を実装する
敵キャラの親クラスに分散攻撃をするための関数を以下のように作った

```
public void NwayShot(Transform enemy,float angle) {
        Instantiate(EnemyProjectilePrefab, enemy.position, Quaternion.Euler(new Vector3(0.0f,0.0f,angle)));
    }
```
これのEnemyProjectilePrefabは敵が撃つ弾のPrefabで、enemy.positionは敵の位置、Quaternion.Eulerで弾の向きを設定している。
弾の向きの計算は以下のようにした

```
public int NwayCount = 3;//何方向に攻撃するか
public int NwayAngle = 10;//弾の角度
                    .
                    .
                    .
for(int i=1; i <= NwayCount; i++) {
                float angle = -(NwayCount + 1) * NwayAngle / 2 + i * NwayAngle;
                base.NwayShot(gameObject.transform, angle);
            }
```

この計算は以下のサイトを参考にさせていただきました。
計算が苦手だったので非常に助かりました。
参考:[【第2回】n-way弾実装してみるよ！](http://maymaypb.blog.fc2.com/blog-entry-4.html)

これを実行すると
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/2bfce2d5-6b41-0664-aa23-1f1f4b01b60d.gif)

ちゃんと3-Way攻撃になった！
今後は中心の弾がプレイヤーに向けて撃たれるようにしたい。
結構調べたりしたのでめっちゃ時間かかった(泣)
次はボスだぁー
intra-martにコード整形ツールを実装してみた

#JSONとSQL整形問題
業務中結構使われているJSONとSQL文が
毎回毎回変換を掛けてから、ようやく中身を確認することができる。
それが面倒だ！！

#intra-mart環境でも使えるツール
FormaDesignerが簡単に画面が作れるし、
それに、JSもすぐ試せるので、作ってみた。
![QS_20191218-165620.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/eaf384d3-1a59-79fc-62ca-11159be7ef73.png)
![QS_20191218-165559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322119/5fc7e3f5-b8dd-169a-fa3e-aebcdbdc26a1.png)

JSONの整形コードは以下の通り
```js
var jsonBefore = JSON.parse(text);
var json = JSON.stringify(jsonBefore, null, "    ")
```
二行で今までの悩みを解消した。

SQLの整形は[このリンク](https://qiita.com/atmospheri/items/d2249abf7f77f294e2dc)を参照した。
[リファクタリング]リファクタのリファクタ。もしくはある日のきのこたけのこ大戦争～糸冬～

<br>
### *[アドベントカレンダー 2019年]*
#### *18th December 2019*


\#\# これ、完全に身内用やねんな。
\#\# 外野さんは細かい突っ込みは無しで頼むんやで。
\#\# そのレベル？的な内容から書いてるでな。

＼　い　つ　も　の　／
>
1. 内容の純粋な整理(不要な変数消したり、各種名前を整えたり。)
2. 計算回数を減らす -> 効率性がUP!
3. 見え方、ぱっと見の分かり易さを向上する -> 保守性がUP!
4. 新しい記法のトライアルで -> 結論が分かっている機能だからナレッジに転化しやすい

アドベントカレンダーで、わざわざ3回に分けてそれぞれの記事を書いてきました。
今回はさっくり総集編ってことで話をまとめてリファクタのまとめとしたいと思います。

## 色々まとめ

大きく3つの観点で話をしてきましたが、結局は全部併せて考えることなんですよね。
>
とりあえず動いた！
↓
余計なもの消してシンプル化する！
↓
余計な計算したくない！
↓
1年後に見ても分かり易くしたい！
↓
(新しい書き方がリリースされたからカッコ良くしたい！)

こんな感じで段階的に考えていくと良いのかなぁって。

この中で一番重要な事を決めるってなるとタイトルの通りになっちゃいますが、
敢えて言えばシンプル化して計算を最低限にするところまでは必須である感覚があります。

まず動くようにすることはシステムを作る以上は大前提ですが、
不要な計算を放置することは様々なリスクを抱えることになります。

保守性を上げることは「システムを変更する場合」のリスクはありますが、
そのまま動かすだけならリスクはありません。(いや、汚いことのストレスは過大なんですが。)

今回、"4." には言及してませんがjava7以前とjava8以降とか、
ラムダ式筆頭にStreamAPIだったりDateAPIだったり使ってリファクタするのも良いですよね。

人によって "見やすい" とか "使って見たい" とかって違うので、
タイトルの きのこたけのこ大戦争 は主に "3." について話そうとしていた残骸です。

リーダブルコード先生にはいまだにお世話になりますが、
やっぱりその中でもここは分かるけどここは納得できないとかありますし、
コーディング規約も場所によって違いますよね。

出来れば "1, 2" をしっかり出来て(まぁ、～急～でバグコード出したのが僕ですが) "3." について話し合える段階になると、
うちの会社も一定のレベルになるなぁ、と思っていたりします。

みんながんばれ(DQ4並の作戦)

ぼくのかんがえたさいきょうにみやすいこーでぃんぐるーる、でバトルしようぜ

正直、最後総集編とか言ってたけど書くことなさ過ぎてびっくりした。
きのこたけのこ大戦争してくれる若手の台頭を待ってるってことだけ言いたかった。
後悔はしていない。

とりあえずリファクタはこんなもんかなぁ。
最後にTDDについて書いて僕の担当分は完了したいと思います。

めっちゃ短いけどここまであざしたーヽ( ･∀･)ﾉ
【Rails】ITインフラ全体像をまとめてみた（DNSサーバーへの問合せ、リクエストからレスポンスの流れ）

#目的
RailsチュートリアルではMVCといったRailsアプリケーション特有の全体像については書かれていますが、それ以前の一般的なシステムのインフラについてはほぼ載っていないのが現状です。今回はそうした一般的なシステム全体像を含めて解説して、Railsの全体像について理解を深めていきたいと思います。

#流れ
①WebブラウザでURLをアクセスする時DNSサーバーを使ってドメインIPアドレスの取得作業を行う。

②DNSサーバーはIP アドレスを返す。 

③ブラウザはサーバのIPアドレスにHTTPリクエストを行う。

④Webサーバーは静的コンテンツを見せて、動的コンテンツについてはAPサーバーに要求する。

⑤APサーバーがRailsで作成されたアプリケーションを実行して、ルーター(Route.rb)がリクエストをコントローラに振り分ける。

⑥コントローラーが動的なコンテンツについてはModelに行きデータベースとの通信を行い、必要な情報をデータベースから取り出し、コントローラーに返す。コントローラーがその情報を保存し、ビューに通信を行いHTMLを生成する。

⑦コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す。（HTTPレスポンス）
<img width="1229" alt="ITインフラ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/db56362c-efde-6020-20b6-48ceea6e15d3.png">

まとめると、DNSサーバーを経由してIPアドレスを取得→ブラウザがHTTPリクエストを行い、Web３層構造やMVCを経由し静的・動的コンテンツを取得→それらの情報を受け取りHTTPレスポンスを行うという流れです。


#まとめ
RailsについてRailsチュートリアル等でMVCの流れなどはよく載っていますが、それ以前の流れについては詳しく載っているものは少ないと思います。Railsエンジニアの方の意見を聞きながらまとめたものの、自信がないので間違っている部分などございましたら、お知らせください。 

参照
https://thinkit.co.jp/article/11526?fbclid=IwAR1xhqnZ4CYQllY6dTS3htOVump-I14LJFh2HAWPac-OnZSSmNmu9N0Iiks

https://diveintocode.jp/tips/process_flow?fbclid=IwAR0em77uubUNxTUhsLEQWbE8nh1fcoDMfnZY0xRm6CqI3_idvz7KKPEHeZ4
vfatの形式のデバイス（ドライブ）ラベルを変更する。

fat32と同じ方法でいけました。なぜかvfatのラベル変更について書かれているサイトは１５分ぐらい探しましたが見つかりませんでした。

```terminal:vfatのラベルを変更
sudo mlabel -i /dev/ドライブ名 ::ラベル名
```
Markdownの勉強

テストプログラム

```python
def function():
 print("hello")
```
出力：
<details>
<summary>答えはここ</summary>
<div>`> hello`</div>
</details>

<details>
<summary>"すいしょう"の漢字は？</summary>
推奨
</detail>

## リスト表記

1. ooo
1. xxx

自動で連番にしてくれる．

<dl>
<dt>リンゴ</dt>
<dd>赤い果物</dd>
<dt>みかん</dt>
<dd>オレンジ色の果物</dd>
<dt>バナナ</dt>
<dd>黄色の果物</dd>
</dl>



| 1 | 2 | 3 |
|:--|:-:|--:|
|  ここにいろいろかくぞー |   |   |
|  いいね |   |   |

```math
\sum_{k=1}^n k^2 = \frac{1}{6} n (n+1) (2n+1)
```

$\textit{SumOfSquare} = \sum_{k=1}^n k^2 = \frac{1}{6} n (n+1) (2n+1)$
Notifications error: To fix, download and sign in to the IFTTT mobile app.

#過去に出会った警告メッセージとその対処方法備忘録
#環境
IFTTTアプリ iOS版 V4.6.1
iPhone7 iOS 13.1.1

#エラーメッセージ
Notifications error: To fix, download and sign in to the IFTTT mobile app.

#現象
マニュアル通りにアプリへの通知アプリケーションを作っていたら、何度テストしても、作り直しても上記エラーが表示されて通知に失敗する。
もちろん、アプリにはサインイン済みでアプレットには接続済みです。

#原因と対処法
##原因
不明です。何らかの問題でつながらないのでしょう。

#対処法
iPhoneを再起動する。
私の場合はこれで治りました。
個人用の端末でめったに再起動しないために、通知周りの動作がおかしくなっていたのかもしれません。
Kubernetes 1.17: 変更点まとめ

# はじめに

このエントリは、Kubernetes 1.17 の CHANGELOG から Kubernetes 1.17 の各変更点についてまとめたページをまとめています。

# 1.17 の主な変更点

ここでは [What’s New](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.17.md#whats-new-major-themes) から概要を抜粋してまとめます。詳細は各 SIG の変更ページを確認ください。

### Cloud Provider Labels が General Availability になりました

v1.２ にベータとして追加され、Cloud Provider Labels が GA になりました。

### Volume Snapshot 機能がベータになりました

v1.17 から Volume Snapshot 機能がベータになりました。この機能は v1.12 にアルファとして追加され、v1.13 で破壊的な変更が加えられたアルファ版として再度リリースされました。

### CSI Migration がベータになりました

Kubernetes の in-tree ストレージプラグインから Container Storage Interface (CSI) 
 へのマイグレーションが v1.17 でベータになりました。 CSI Migration は v1.14 でアルファ版として追加されていました。

# 既知の問題点と重大なアップグレードに関する通達

[Kubernetes 1.17の変更点: Known Issues と Urgent Upgrade Notes](https://qiita.com/uesyn/items/ff81ba2d84e06c67133b)

# 廃止予定となった機能や削除された機能

[Kubernetes 1.17の変更点: 廃止予定と削除されたもの(Deprecations and Removals)](https://qiita.com/uesyn/items/7766b3d41ecdcf59150f)

# API の変更点

- CustomResourceDefinitionsは、ドキュメント化された `x-kubernetes-list-type`および` x-kubernetes-map-type` アトミックのAPIセマンティクスを検証して、非アトミックサブタイプを拒否するようになりました([#84722](https://github.com/kubernetes/kubernetes/pull/84722), [@sttts](https://github.com/sttts))
- kube-apiserver： `--admission-control-config-file` で受け入れられる AdmissionConfiguration タイプはスキーマ変更なしで `apiserver.config.k8s.io/v1`に昇格されました。([#85098](https://github.com/kubernetes/kubernetes/pull/85098), [@liggitt](https://github.com/liggitt))
- EndpointSlice のポート名検証を修正して、Endpoints のポート名検証に一致するようにしました （15文字より長いポート名を許可します） ([#84481](https://github.com/kubernetes/kubernetes/pull/84481), [@robscott](https://github.com/robscott))
- CustomResourceDefinitions に、CRD API拡張機能として `x-kubernetes-map-type` アノテーションを導入されました。 ServerSideApply でもこの特定の検証を有効になりました。([#84113](https://github.com/kubernetes/kubernetes/pull/84113), [@enxebre](https://github.com/enxebre))


# SIG (Special Interest Group) 毎の変更点

- [SIG API Machinery](https://qiita.com/Ladicle/items/408ee3ec4e25ada9fe21) @Ladicle 
- [SIG Apps](https://qiita.com/inajob/items/5ddcb792085d70e3019d) @inajob
- [SIG CLI](https://qiita.com/superbrothers/items/e467738f6987eeb8111a) @superbrothers
- [SIG Network](https://qiita.com/superbrothers/items/fd936c4046459a16609c) @superbrothers  
- [SIG Node](https://qiita.com/uesyn/items/654dd0c84c269b97b077) @uesyn 
- [SIG Scheduling](https://qiita.com/kkohtaka/items/74f386ff2825215c2967) @kkohtaka
- [SIG Storage](https://qiita.com/ysakashita/items/515b556b30388605476e)  @ysakashita
- [SIG Auth](https://qiita.com/hiyosi/items/837096e6d7e62e677e00) @hiyosi
- [SIG Instrumentation](https://qiita.com/watawuwu/items/96a11f283ef98e6dcdd8) @watawuwu 
- [SIG ClusterLifeCycle](https://qiita.com/yuanying/items/c3defb264e460e9936c1) @yuanying
[UE4] キャッシュ(DDC)を共有する方法と注意点について

Unreal Engineでは、シェーダーやアセットを適切に扱うためにキャッシュファイル(DDC)を生成しますが、
プロジェクトが多くなってくるとキャッシュ生成で時間が必要になってしまいます。
今回は、キャッシュを効率的に扱うため機能として存在するキャッシュの共有機能(SharedDDC)について、
使用方法やトラブルポイント、使った場合の利点に関して詳しく紹介していきます。

## 設定方法
基本的な設定方法に関しては、[編集] > [エディタの環境設定...] > [グローバル] > [Deroved Data]に存在する
**Local Derived Data Cache**と**Shared Derived Data Cache**です。
それぞれがローカル用のキャッシュ保存パスと共有用のキャッシュ保存パスの設定となります。
![2019-12-18_16h15_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363894/35442e61-6e1a-ffa2-9660-021a0993e5fe.png)

これらを設定すると、まずローカルにキャッシュが無いか確認し、次にサーバーにキャッシュがないか確認し、
それでもデータがない場合にキャッシュを作成するようになります。

## 注意点
DDCに関しては上記の設定のほかに複数の設定方法があるので、どのフォルダのパスが実際に使われているか注意が必要です。
複数の設定方法はそれぞれ独立してしまっているので、どのフォルダがプロジェクトで使われているかログから確認するとトラブルを回避できるかと思います。

実際に使われているフォルダのパスはエディタ起動時にアウトプットログから確認ができます。
確認は[ウィンドウ] > [デベロッパーツール] > [アウトプットログ]を開き、フィルタで**ddc**を入力すると分かりやすいかと思います。  
![2019-12-18_16h20_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363894/e4a5419a-ca7f-899f-1641-73612b2e9ea1.png)

エディタからの設定する以外にINIファイルからの設定方法があります。
こちらは、UE4のEngine以下の**Engine/Config/BaseEngine.ini**や、
**Project/Config/DefaultEngine.ini**以下に含まれる[InstalledDerivedDataBackendGraph]が設定項目です。
設定項目の中のLocalのPathで自分のローカルパスを設定し、Sharedが共有サーバーのアドレスを設定します。
(アドレスはWindowsで通常のエクスプローラーで扱うようなフォルダパスで問題有りません)

```ruby:BaseEngine.ini
[InstalledDerivedDataBackendGraph]
MinimumDaysToKeepFile=7
Root=(Type=KeyLength, Length=120, Inner=AsyncPut)
AsyncPut=(Type=AsyncPut, Inner=Hierarchy)
Hierarchy=(Type=Hierarchical, Inner=Boot, Inner=Pak, Inner=EnginePak, Inner=Local, Inner=Shared)
Boot=(Type=Boot, Filename=%GAMEDIR%DerivedDataCache/Boot.ddc, MaxCacheSize=256)
Local=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, PurgeTransient=true, DeleteUnused=true, UnusedFileAge=17, FoldersToClean=-1, Path=../../../Engine/DerivedDataCache)
Shared=(Type=FileSystem, ReadOnly=false, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=19, FoldersToClean=-1, Path=\\mystudio.net\DDC, EnvPathOverride=UE-SharedDataCachePath)
AltShared=(Type=FileSystem, ReadOnly=true, Clean=false, Flush=false, DeleteUnused=true, UnusedFileAge=19, FoldersToClean=-1, Path=\\mystudio.net\DDC2, EnvPathOverride=UE-SharedDataCachePath2)
Pak=(Type=ReadPak, Filename=%GAMEDIR%DerivedDataCache/DDC.ddp)
EnginePak=(Type=ReadPak, Filename=../../../Engine/DerivedDataCache/DDC.ddp)
```

またWindowsの環境変数設定に**UE-SharedDataCachePath**という変数を設定することにより、
そちらからキャッシュを読みに行かせることも可能です。
プロジェクト単位ではなく、チーム全体で同一の共有サーバーを使いたい場合はこちらを利用すると便利です。
![2019-12-18_12h05_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363894/4559cbe1-9ea5-5583-45ff-9a146f32f16b.png)

その他設定に関する公式ドキュメントはこちらです。

**派生データのキャッシュ | Unreal Engine ドキュメント**
https://docs.unrealengine.com/ja/Engine/Basics/DerivedDataCache/index.html

## おわりに
プロジェクトデータが大きくなってくるとキャッシュ生成の時間は比例して大きくなります。そのためプロジェクト後半にマシンを変えたり、新しく人が入った時に初回起動でレベルを開くのに数十分、数時間と時間を取られるというケースもあるかと思います。共有DDCを活用することでその時間を短縮できるようになるかと思いますので、是非活用してください。
Pythonは辛い．しかし使う

いろいろあってPythonを1年と少し書いている．(Not WEB系)

なんとなく見えてきたPythonの私なりの利点と辛い点をつらつらと挙げてみようかと(サボり)．自分用のメモなのでまあそれなりに…ご指摘などいただければと．

Google先生へ，この記事を検索結果上位に標示することは検索を汚すだけなのでやめてくださいお願いします何でもします(何でもするとは言っていない．)

# TL;DR

Pythonはいろいろと(私にとって)辛い仕様がある．

しかしながらそのデメリットを受け入れてでも使おうと思うほどの利点がるので仕方なく我々はPythonを使い続けるしか無いのではなかろうか……．

# Pythonはつらい

## ブロックの仕様が辛い

ご存知のようにPythonのインデントは意味を持つ．
インデントでブロックを構成するわけだ．

つまり，これ

```py
if True:
   print("hoge")
else:
   print("piyo")
print("fuga")
# => hogeとfuga が表示される
```

とこれ

```py
if True:
   print("hoge")
else:
   print("piyo")
   print("fuga")
# => hoge が表示される
```
では表示内容が異なる．

……わかってる．当たり前と言われることはわかっている．だが，考えてみてほしい．これ

```py
if xxx:
   lorem
   if yyy:
      ipsum
      dolar
else:
   sit
```

とこれ

```py
if xxx:
   lorem
   if yyy:
      ipsum
      dolar
   else:
      sit
```

の差はインデントだけであり，Emacsなどなどの自動インデント機能を使うとエディタ依存で構造が変わる．
これ，むしろ辛いと思わない人いるの？

何？みんな一発で正しいコード書いてるの？私はそんなことはできない．
ある程度のまとまりで関数を書くが，これはクラスまとまるぞ？ってなって全体をインデントしたり，
その後諸々内部のインデントが修正されたりする．
もちろん，ただ移設するだけの場合は行頭にスペースを必要個数追加すれば良いだけなので対応は可能である．
が，Cなどであればいらない1工程が挟まり，思考が止まる．とんでもないデメリットだと私は思う．

別に，常に中括弧で囲うことを強制しようというのではないが，オプショナルでできても良いではないか．

## importの仕様が辛い

Pythonでは行頭にimportをづらづらと並べることが多いが，このときの検索パスが辛い．

プロジェクトのデフォルト構造が無いので(まあスクリプト言語だしこれは仕方なしか)決めにくいのはあるだろうが，
だからといって呼び方によって検索パスが変わるのはNG.

結局安心のためにsys.pathを編集してカレントディレクトリ配下を追加して…という作業が必要．

これは私の責任であるが，毎回この作業を忘れて，どうやってimoprtするんだっけと検索するはめになる．

## map，filterの存在が辛い

Pythonは関数型言語に由来するmapやfilterが存在している．iterableが実装されているクラスに対して適応可能で，まあ名前の通りの動作をする．

```py
lst: list = [1, 2, 3, 4, 5, 6]
lst2 = list(map(lambda x: x*2, lst))
lst3 = list(filter(lambda x: x % 2 == 0, lst))
print(lst2) # => [2, 4, 6, 8, 10, 12]
print(lst3) # => [2, 4, 6]
```

お気づきだろうか．私はわざわざmapなどの出力からlistへと変換している．
まあこれは別に辛いわけではないが微妙な気分になる．
結局，`lambda x: iterable -> iterable` であることだけが条件になるのでiterableであるmapの出力型になっているからで，変換が必要になるのは仕方のないことではある．

しかし実際は内包表記という便利な機能が備わっている．上と同じことが，

```py
lst: list = [1, 2, 3, 4, 5, 6]
lst2 = [x * 2 for x in lst]
lst3 = [x for x in lst if x % 2 == 0]
print(lst2) # => [2, 4, 6, 8, 10, 12]
print(lst3) # => [2, 4, 6]
```

と書ける．

## diskが辛い

Pythonはプロジェクトごとに仮想環境を切って使うのがなうい，らしい．
そこで私はPyenvでバージョンの切り替えを可能にし，pipenvでライブラリを環境ごとに切り替え可能としている．

問題はこれをやると仮想環境ごとにライブラリを持つなどしてどんどんディスクが食われていく．

速さを優先してM.2 SSDを使い，安いからといって250GB程度の環境だと地味に辛い．

これはに関しては，常にAnacondaやMinicondaなどの環境に引きこもってJupyterしている人には余り問題にならない話ではあるが．

# Pythonはいいぞ

## 豊富なライブラリ

やりたいことを調べる -> ライブラリが見つかる　というパターンの多さよ．
正直大抵のことはライブラリがあるのではと思う．

自然言語系で生きているので，MeCabやJuman++などを使うことがあるが，それらのラッパーも存在しているので
何も考えることなくPythonオブジェクトとして利用できる．便利．

形態素解析機くらいならまだ自前実装してもいいが，KNPなどの構文解析機のラッパーはあまりかきたくないのでとても助かる．

また，全角半角変換といった需要あるの？ということにも対応しているので，私はいろいろと先人の作ったライブラリを呼べば解決する．

機械学習系のライブラリは特に充実しているので，やりたいとおもったらとりあえずPythonするが吉．

## Numpy，Pandas

もう，これだけでPython使う理由になりうるライブラリ．行列演算強すぎんよ……グラフ化しやすすぎんよ……

## 環境が切り分け可能

仮想環境で実行できるので，作成したプログラムをよそで動かすときにGlibcのバージョンがーなんて問題は気にしなくて良い．
良い．良い．

今人的にArch Linuxをつかっているので，余計に良い．

# それでも我々はPythonを使う

上でいろいろ文句を言ったが，結局利点がでかすぎて我々はPythonから離れることができない．
Numpyが他の言語にもあれば……とも思うが，かと言ってRubyする気もなければPerlする気もないので，
都合の良いスクリプト言語としてもPythonが候補となってしまう．

設計で解決する問題は解決させつつ，使っていくしか無いのだろうな……

# 参考

- [使ってみて感じたPythonのメリットとデメリット](https://qiita.com/YSRKEN/items/bd7e08fa357a00a7f1aa)
ワンコインセンサを用いた、人体動作の予測モデル

この記事はドコモ先進技術研究所アドベントカレンダー18日目の記事です。NTTドコモ 先進技術研究所 2年目社員の石岡です。この記事では、AI・機械学習初心者の私が、趣味で作成したセンサデータから人の動作を予測モデルについて説明します。

# 要約
- 加速度・ジャイロセンサから取得したデータと、ニューラルネットワーク(CNN)を使って人の動きを検知してみます。
- 近年、スポーツセンシングが流行っているようなので、ハーキステップの動きを検知してみます。

# ハーキステップとは？
スポーツにおけるトレーニング方法の１つです。体育の授業などで１度はやったことがあるかもしれません。立った状態で、重心を落とし、足で細かくステップします(これがハーキステップ)。この状態で、指示者（体育の先生や部活のコーチ）が上右左下のアナウンスをします。学生時代は毎日のようにやっていたトレーニングですがイマイチ何に効いているのかはわかりません。調べてみると、アジリティ(?)やクイックネス(?)が鍛えられるようです。

# 使うもの
- 加速度・ジャイロセンサ(今回はMPU6050を使用、2019年現在Amazonで1つ300円くらいです。安くてびっくりです)
- PC (データ取得も学習も、Raspberry piを使用)

# センサデータの取得
私が購入したセンサの写真は下のようなものです。安い分、自分ではんだ付けを行う必要があります。ピンとピンの間隔が十分広いので、私のような半田付けが苦手な人でもかんたんにできます。またピンヘッダが２種類入っているのが地味にうれしいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543280/5ef4c6f7-f6aa-0962-3f0d-57be55981bcd.png)

MPU6050からのセンサデータの取得方法は、様々な記事で紹介されているので、今回は省略します。ただ注意点2点あります。1つ目が、MPU6050がI2C通信でセンサ値を取得することです。センサから出力された電圧値をアナログ信号として直接読み込むわけではないので、最初は何が何だかわからないかもしれません。ざっくり説明すると、受け手側 (Raspberry piやArduino等)が、センサ側 (MPU6050等)の中の指定したブロック(アドレス指定)とのみ通信をするよ、ということです。データバスとクロックバスしかないですが、加速度センサ3軸やジャイロセンサ3軸からデータを読取ることが可能となります。  

2つ目が、MPU6050の入出力電圧です。MPU6050は、データシート上最大入出力電圧が3.46Vとなっています。一方で、Arduinoは入出力が5Vとなっているので、Arduinoの入出力ピンとMPU6050を直接つなぐと正しく動作しません。Raspberry piは、入出力ピンが3.3VなのでMPU6050と直接つなげてしまって問題ありません。
※ MPU6050はRaspberrypiの仕様寄りですが、別のセンサを使う場合は逆のケースもありますので使用する前にかならずデータシートを確認してください。

# データの可視化
データの作成にあたり、先進技術研究所の３名の方にハーキを行っていただき、300個のデータ(1秒分の加速度・ジャイロ３軸の値)を作成しました。センサを腰の位置に固定して、ハーキステップの各動作を行った結果が下の図です。なんとなく、動きを表していそうな感じがしますが、正直私の目には、どれもただのノイズデータにしか見えません…

今回は、このセンサデータをニューラルネットワークに入力して、人体の動作を予測をしてみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543280/15ae6439-464d-9d09-7459-25fe6be3bcab.png)

# モデルの作成
今回はCNN (Convolutional Neural Network)を使いました。
理由としては以下の2点です。
- 動作の一瞬一瞬を切り取っても何が何だかわからないので、時間的な塊にして学習させたいから
- 行列をそのままいれようと思ったら、CNNのコードがそのまま流用できそうだと思ったから

MPU6050から取得した加速度データ$a=[a_x,a_y,a_z ]$と、ジャイロデータ$g=[g_x,g_y,g_z ]$を、サンプリングレート40 Hzでサンプリングします。これを6×40の入力データとして使用します。

ハーキステップでは、基本的には４つの動作に分類しますが、今回は「ステップのみ」も考慮し、５つの動作（上下右左無の５つ）に分類します。

プログラム全体の概要図とネットワークの構成図は下図の通りです。一般的に、CNNのチュートリアル等で用いられる、画像の分類モデルと同じネットワーク構成です。入力データとして、6×40の加速度・ジャイロセンサーデータを、画像データのように、CNNへ入力し、5つの動作それぞれに対して0~1の値を出力します。1に近いほど、その動作である確率が高く、0に近いほどその動作である確率が低くなります。5つの値の最大値から、人体の動作を推定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543280/b31c5d88-4c96-26f3-89bf-a744ae47f993.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543280/d764463b-0556-e23e-724d-6f1f2889d29e.png)

# 学習結果
3名分の300個の動作データに対して、2:1にバリデーションして学習させた結果が下図です。異常に精度が高くなっています。おそらく、同じ人が同じ動作をした時の結果が、学習にもテストデータにも含まれてしまったため、リークしたようになったのではないかと考えられます？訓練データとテストデータに分ける際に、ランダムにわけるのではなく、人ごとにわける等の工夫が必要だったのかもしれません(匿名化させるために、人を記録していなかったので、追々検証してみます)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543280/d6fb0827-acbd-3f18-adde-50f18f47886f.png)

# まとめ
Amazon等で買える、ワンコイン・センサを使って、人間の動作予測モデルを作成しました。「CNN=画像認識」という固定観念がありましたが、センサデータでも使用できました。一方で、学習に使ったデータが少人数であり、見かけ上精度が高くなっている可能性が高いです。今回のモデルはRaspberry piにセンサを接続して使いましたが、スマートフォンから取得した加速度・ジャイロからも予測が可能なので、この動作予測モデルを使ったアプリなども開発していきたいです。
1.1   Python入門

# 1-1　Python入門
　Pythonのいいところの1つは、**対話型インタプリタ**に直接入力できることです。
>**対話型インタプリタ**とは、一つ質問したら一つ回答が返ってくるように、プログラミング言語で書かれたコードを、一行読んでは機械語に翻訳し実行、また一行読んでは翻訳し実行という逐次翻訳の手法のことである。

Interactive DeveLopment Environment（**IDLE**）と呼ばれるシンプルなグラフィカルインターフェイスを使用して、Pythonインタプリタにアクセスできます。 Macでは[アプリケーション]→[MacPython]で、Windowsでは[すべてのプログラム]→[Python]で見つけることができます。 
Pythonインタープリターを実行できない場合は、おそらくPythonが正しくインストールされていない可能性があります。詳細な手順については、[こちら](http：//python.org/)をご覧ください。 

###Pythonで演算

インタプリタが回答の計算と表示を完了すると、プロンプトが再び表示されます。これは、Pythonインタプリタが別の命令を待っていることを意味します。(プロンプトとは、">"のこと)

```
>>>1 + 5 * 2 - 3
8
>>>
```


乗算にはアスタリスク（*）、除算にはスラッシュ（/）を使用し、式を括弧で囲むには( )を使用dできます。
上記の例は、Pythonインタプリタを使用して対話的に作業し、言語のさまざまな式を試して、その機能を確認する方法を示しています。

### エラー文の例

```
>>> 1 +
  File "<stdin>", line 1
    1 +
      ^
SyntaxError: invalid syntax
>>>
```

これにより、構文エラーが発生しました。 Pythonでは、命令をプラス記号で終了することは意味がありません。 Pythonインタプリタは、エラーが発生した行を **line 1**と示し、1行目にエラーが出ましたよ。と教えてくれます。

Pythonインタプリタを使用できるようになったので、言語データの操作を開始する準備ができました。

# 1-2 NLTK入門
###NLTKインストール方法
さらに先に進む前に、[こちら](http：//nltk.org/)から無料でダウンロード可能なNLTK 3.0をインストールする必要があります。そこにある指示に従って、プラットフォームに必要なバージョンをダウンロードします。

>NLTKとは、Natural Language Tool Kit　の略であり、自然言語処理のための Python で実装されたライブラリである。デフォルトで英語をいじれるのが特徴。

NLTKをインストールしたら、Pythonインタプリタを起動し、Pythonプロンプトで次の2つのコマンドを入力して本に必要なデータをインストールし、図1.1に示すように本のコレクションを選択します。
![nltk-downloader.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553131/4620817d-1bf0-c5db-9efa-c03b3e7ee619.png)

>図1.1：NLTKブックコレクションのダウンロード：nltk.download（）を使用して利用可能なパッケージを参照します。ダウンローダーの[コレクション]タブには、パッケージがセットにグループ化される方法が表示されます。本というラベルの行を選択して、この本の例と演習に必要なすべてのデータを取得する必要があります。


###NLTKの使い方
データがPCにダウンロードされると、Pythonインタプリタを使用してその一部をロードできます。最初のステップは、Pythonプロンプトで特別なコマンドを入力することです。

```
：from nltk.book import *。
```
これは、インタプリタに、探索するためのテキストを読み込むように指示していて、「NLTKのブックモジュールから、すべてのアイテムをロードする」と言います。本モジュールには、この章を読むときに必要なすべてのデータが含まれています。ここに表示される出力とともに、コマンドを再度示します。スペルと句読点を正しく取得するように注意してください。

```
>>> from nltk.book import *
*** Introductory Examples for the NLTK Book ***
Loading text1, ..., text9 and sent1, ..., sent9
Type the name of the text or sentence to view it.
Type: 'texts()' or 'sents()' to list the materials.
text1: Moby Dick by Herman Melville 1851
text2: Sense and Sensibility by Jane Austen 1811
text3: The Book of Genesis
text4: Inaugural Address Corpus
text5: Chat Corpus
text6: Monty Python and the Holy Grail
text7: Wall Street Journal
text8: Personals Corpus
text9: The Man Who Was Thursday by G . K . Chesterton 1908
>>>
```
>text1: ハーマン・メルヴィル1851年作「モビー・ディック」
text2: ジェーン・オースティン1811による感覚と感性
text3: 創世記
text4: 就任住所コーパス
text5: チャットコーパス
text6: モンティ・パイソンと聖杯
text7: ウォールストリートジャーナル
text8: パーソナルコーパス
text9: Gによる木曜日の男。 K。チェスタトン1908


これらのテキストについて知りたいときはいつでも、Pythonプロンプトで名前を入力するだけで調べることができます。

```
>>> text1
<Text: Moby Dick by Herman Melville 1851>
>>> text2
<Text: Sense and Sensibility by Jane Austen 1811>
>>>
```


Pythonインタープリターを使用して、いくつかのデータを処理できるようになりました。
fish + fisher(fiserman)

# zsh飽きた
# fishパッケージマネジャー
1. oh-my-fish
    * 全部入り
    * フレームワークとして巨大
2. Fisher
    * 今回のパッケージマネジャー

## どっちがいいのか
oh-my-fishとFisherはそれぞれconfigファイルの管理方法が違う.

oh-my-fishはかなり元の環境を変える.Fisherのほうがエイリアスを貼るだけで設定ディレクトリを作るとかもないので,簡素.

長所短所を探しまくったが,結局使ってみろよという意見が多く,まあそうかという結論に至った.(2019/12/18)



oh-my-fishよりも最近はFisherらしいということだけがわかった.

# oh-my-fishを使わない理由
*Powerline*というリッチなコマンドラインインタフェースがあるらしい.

<img width="267" alt="スクリーンショット 2019-12-18 16.12.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152284/039e1a25-03c2-fee8-4ba6-874b65270d51.png">

これの文字化けがどうしても解決できなかった.
しかし,fisherの場合はできた.powerlineフォントが参照できていないということはわかるが,こんな設定したくないからzshからfishにするわけで,,,ということでoh-my-fishを諦めFisherにした.

oh-my-fishはinit.fish,conf.fish,などばらばらで直感的でない.

# manから自動補完を得られる
fishインストール後にインストールしたパッケージの自動補完をmanから得るコマンド

```
fish_update_completions
```

# エイリアス

全角でも
```fish
alias ls='ls'
funcsave ls
```

# ディレクトリが暗い問題
iterm2の問題かと思ったが,fishはどうやら`fish_config`でディレクトリの色は変更できないようだ.

```config.fish
export LSCOLORS=gxfxcxdxbxegedabagacad

```
これでディレクトリのカラーををシアンにできる.


# 参考

https://nulab.com/ja/blog/backlog/fish-shell-tutorial/
https://github.com/oh-my-fish/oh-my-fish
https://qiita.com/susieyy/items/ac2133e249f252dc9a34
https://github.com/jethrokuan/z
https://public-constructor.com/terminal-fish-setup/
セキュリティ情報ってどこで収集していますか？

みなさん、セキュリティ情報ってどこで収集していますか？

日々更新されているセキュリティ情報って、皆さんはどうやって入手しているんでしょうか？
もちろんサイトを見に行く、メルマガを受信してるなど、どのサイトを見たらいいかなど、
色々探していることと思います。

参考までに、いくつかご紹介します。

#サイト系
・情報セキュリティ政策（METI/経済産業省）
https://www.meti.go.jp/policy/netsecurity/
セキュリティだけでなく、施策など全般の情報が入手できます。

・IPA 独立行政法人 情報処理推進機構：重要なセキュリティ情報一覧
https://www.ipa.go.jp/security/announce/alert.html
セキュリティ情報やIT人材育成、資格試験などの情報も入手できます。

・脆弱性対策：IPA 独立行政法人 情報処理推進機構
https://www.ipa.go.jp/security/vuln/
IPAの脆弱性情報メイン。

・JPCERT コーディネーションセンター 脆弱性対策情報（新着リスト）
https://jvn.jp/
ここもチェックしておいた方がいい。


#メルマガ系
・メールニュース：IPA 独立行政法人 情報処理推進機構
https://www.ipa.go.jp/about/mail/index.html
登録済。受信したら、チェックしています。

・Gauge 脆弱性情報通知サービス
https://vns.vital-service.com/
最新の脆弱性情報がわかる。登録済。
毎日送付されてくるので、朝チェックしています。

・JPCERT コーディネーションセンター メーリングリスト
https://www.ipa.go.jp/about/mail/index.html


#その他（Twitter）
・IPA （ICATalerts）
https://twitter.com/ICATalerts/

・JVN 脆弱性レポート
https://twitter.com/jvnjp

Twitterでフォローしておけば、常にチェックできるので
お手軽ではないでしょうか？

#番外編
・トレンドマイクロ セキュリティブログ
https://blog.trendmicro.co.jp/
セキュリティ専門家の情報が読めます。

・マカフィーがお届けする最新セキュリティ情報
https://www.mcafee.com/japan/home/security/

セキュリティソフトのサイトにも色々載っているので、
チェックしてみてはどうでしょうか？

---
他にもあると思いますので、
自分に合うものを探してみてください。
[UE4]Paniniプロジェクションで魚眼効果

かっこいい魚眼効果が使いたい…！っていうこと、ありますよね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/6b83d848-ee82-6c31-d43f-32658aeb0415.png)
そんなとき、基本的には
ポストプロセスマテリアルで加工したりワールドポジションオフセットで歪ませたり、というような対応をすることになるかと思うのですが、
実はUE4はコンソールコマンド**「r.Upscale.Panini.D」**でPaniniプロジェクションを適用することができます。
https://docs.unrealengine.com/ja/Engine/Rendering/PostProcessEffects/PaniniProjection/index.html


まず、FOVを高くしてパース感を強めます。
（今回は150に設定しています。）
![panini.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/96c3c3d9-a961-a3b1-35c4-3c7c1cd9e092.gif)
この状態でも迫力は出ていると思うのですが、画面の端の方の歪み（伸び）が少し気になりますよね。



##r.Upscale.Panini.D 0.5（変更後）
![panini2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/5755e676-f6f6-13e6-9ff6-9e7c068e93b0.gif)
そこでPaniniプロジェクションを適用すると、
このような感じで魚眼効果がかかったような画面に調整できます。
画面端の方の歪み（伸び）も緩和されていますね。




公式ドキュメントの解説にもあるように、
画面中心の解像度が厳しくなった場合は、処理負荷を代償にして**「r.ScreenPercentage」**で調整してみて下さい。


Paniniプロジェクションの実装は、PostProcessUpscale.usfの以下箇所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463796/5d5b1b95-67ed-8149-a840-9058c4646947.png)

ちなみに、僕の手元で試してみましたところ、
4.23.1は問題なく動作しますが、**4.24.0ではクラッシュ**しました……。

こちらの情報は[メタリカさん](https://twitter.com/lovemetallica)に教えていただきました！
ありがとうございます！
getsメソッドで入力された値を取得 ❏Ruby❏

Rubyで`gets`を読み込むとターミナルで入力待ちになります。
そこで入力された値を文字列として返します。

実際にやっていきやす！

`gets`だけだと勝手に改行されるので、それを防ぐために`.chomp`を付けます。

```ruby:sample.rb
word = gets.chomp
puts word
```

```:ターミナル
$ ruby sample.rb
##入力待ち

Hello World!
##適当に打ち込みenterを押すと…

Hello World!
##結果が表示される
```

#※あくまで文字列を返す

`gets`は数字を打ち込んでも文字列として返します。
数値として返したい場合は、`.to_i`を付けます。

```ruby:sample.rb
number = gets.to_i
puts number + 3
```

```:ターミナル
$ ruby sample.rb
##入力待ち

5
##適当に打ち込みenterを押すと…

8
##結果が表示される
##numberには数値が入ったことがわかる。
```

<br>
【結論】
文字列を期待している場合は、`gets.chomp`
数値を期待している場合は、`gets.to_i`
を使う。

<br>
ではまた！
認可Cookie持ってなかったらリダイレクトさせる

# 認可Cookie持ってなかったらリダイレクトさせる

## 目的
index.htmlに，「18歳以上ですか」というお決まりの案内を出しているが，URLベタが記されると目的のエロページに辿り着いてしまう．
そこで18歳ボタンを押した人だけが，エロページに行けるようにしたかった．
（という建前で，本音は会社での成果発表で，意図せずエロページ出さないようにするため）

## やってみる
１．index.htmlの「18歳以上ですか」に対する「はい」ボタンクリック時に，認可Cookie（ていうほどのもんじゃないけど）をセット．

```html:index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
   <!-- onClickに認可Cookie払い出し関数を紐付ける -->
   <a href="eropage.html"><button type="button" onClick="yesBtn();">はい</button></a>
   <script src="index.js"></script>
  </body>
</html>
```
```javascript:index.js
function yesBtn() {
    //認可Cookieのセット
    document.cookie = "auth=over18; max-age=3600";//有効期限は3600秒=1時間
}
```

２．認可Cookieを持ってエロページに遷移．ここで認可Cookieがなければ，index.htmlにリダイレクト

```js:eropage.js
// 認可Cookieを持っていなければ，リダイレクト
var cookies = document.cookie;
if (!cookies) {
    location.href="index.html";
}
```
このドメインでは，Cookieはこの1つのみ扱うため，cookieを持っているか否かで判定を行なっている．
持っていないければ，index.htmlにリダイレクトさせる．

## 終わりに
これで，直打ちされても表示は回避でき，意図しないエロサイト表示は避けられた．
機械学習プロジェクト舵取りのための「機械学習プロジェクトキャンバス」

伊藤優＠三菱ケミカルホールディングスです。社内にて Digital Transformation に関する様々な活動をしています。現場で定着するシステム開発を目指して日々奮闘しています。今回は、弊社エンジニア数名で作成し今年7月に公開した「機械学習プロジェクトキャンバス」について書きます。（出典：[ニュースリリース：三菱ケミカルホールディングス](https://www.mitsubishichem-hd.co.jp/news_release/00837.html)）

# はじめに
さまざまな場所でさまざまな方々と「機械学習プロジェクト」を起こしています。面白い課題設定ができて首尾よく進むときもあれば、夢と現実の狭間でまったく折り合いがつかないこともあります。どうしたらうまくプロジェクトを起こせるのでしょうか。考えた末に「機械学習プロジェクトキャンバス」を作りました。機械学習プロジェクトを始めたいけれど、「何から始めていいのかわからない」「何を目指せばいいのかわからない」、あるいは、多くの関係者の中で「何を決定すればいいのかわからない」といった現場の声にお応えして、課題の整理やコミュニケーションツールとして利用しています。

# 「機械学習プロジェクトキャンバス」とは
「機械学習プロジェクトキャンバス」は、ビジネスモデルキャンバスにインスピレーションを受けて構成しました。空欄を順番に埋めていくことで、プロジェクトマネジメントの際に必要な「目的」や「利用者」、「成功の指標」などを整理することができます。
![機械学習プロジェクトキャンバス.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206116/b1152366-5390-5252-06c1-73bd070da879.jpeg)
出典：[機械学習プロジェクトキャンバス](https://www.mitsubishichem-hd.co.jp/news_release/pdf/190718.pdf)
※詳しい説明は本資料を参照ください。

## 使い方
実際にプロジェクトを進める上で効果的と思われる使い方ポイントは３つほどあります。

### ①行き詰った際に、みんなで埋める
一番よく使うのはプロジェクトを起こす序盤のタイミングです。さまざまな立場のメンバーが一同に介してプロジェクトの概観をブレストする際、課題感を整理して、異なる分野の専門家とコミュニケーションを取るために用います。

### ②まず「目的」を埋める。そのあとは右から埋める。
プロジェクトの目的を見失ってはならないのでまずは目的を埋めますが、そのあとは右から埋めるのがポイントです。キャンバスは、右にいくほどユーザー視点、左にいくほどシステム（技術）視点の内容となるように設計しています。「このデータがあるので何かしましょう」というプロジェクトの始め方は、否定はしませんが、ユーザー視点に欠けた活動をしていては現場に定着しません。ユーザー視点で何が必要かを議論する必要があるでしょう。

### ③「成功の指標」を明確化する
キャンバスを使う意味は「成功の指標」を明確化するためと言っても過言ではないでしょう。「成功の指標」は、例えば欠品検知システムであれば、「判定率が9割以上なら、人間より良いので使える」とか、「False Negative（本当はNGなのにOKと判断してしまう）が無ければ使える」といった具体的な数値を伴った指標です。最初は数値目標と言われてもピンと来ない場合がほとんどだと思います。または、取ってつけたように指標を設定してそれを達成しても、実際には実情と合っていなくて納得感が無かったということもあります。大事なのはプロジェクトの初期段階から「成功の指標」について議論し、何らかの指標を設定し、必要に応じて議論しなおすことだと考えています。
加えて、「成功の指標」を達成できなかった場合についてもここで議論することは有意義だと思います。精度が悪くても使えるのか、〇ヵ月で成果が見られなかったら諦めるのか、すべてデータサイエンティストの責任になるのは避けたいので、期待値マネジメントも必要です。

## おすすめポイント
私が思うキャンバスのおすすめポイントは３つほどあります。

### ①目標感が合う
「成功の指標」については前章で触れましたが、何をすべきかが整理されることが最大のメリットです。

### ②会話が合う
キャンバスの本編は上にあげた１枚のワークシートなのですが、付録で「機械学習に向いているプロジェクト・向いていないプロジェクト」などもまとめています。プロジェクトメンバーは通常、専門分野もさまざまで、機械学習が専門のメンバーばかりではないことがほとんどです。最初に最低限の知識を共有し言葉を揃えることで、初めての方にもイメージを持ってもらうことができプロジェクトをスムーズに進めることができます。

### ③役割分担がわかる
キャンバスではユーザー視点からシステム視点まで網羅的に整理することができるので、このワークシートを用いて各メンバーの役割分担も議論することができます。

# まとめ
機械学習プロジェクトを効率的に進めるための「機械学習プロジェクトキャンバス」を作成したので紹介しました。キャンバスを公開したあと、ありがたいことにたくさんの方から反響をいただき、特にデータサイエンティスト的な業務をされている方からの反応を数多くいただきました。データサイエンティストが抱えている問題、データサイエンティストとそれ以外のメンバーとのコミュニケーションの問題が、どこでも同じような課題意識なのだと思えたことは、大変有意義で勇気づけられる経験でした。

キャンバスはこれが最終形態だとは思っておらず、これからも使い続けて修正を加えていけたらと思っています。もしお使いいただける方やご意見のある方がいらっしゃれば、お気軽に、意見交換できれば幸いです。

※「機械学習プロジェクトキャンバス」は三菱ケミカルホールディングスのクリエイティブ・コモンズライセンスです。
MySQL Workbenchで日本語CSVをインポート

#よくある話
必要に迫られMySQLにAccessデータをインポートする事になり、四苦八苦した話です。ほぼ備忘録ですが、同じところで躓いている方のお役に立てれば。（類似記事は多かったけれど、中々自分のパターンにあてはまるものが無かった）

#環境
・Windows10 Enterprise
・Docker Desktop for Windows：2.1.0.1
・MySQL：5.7.28
・MySQL Workbench 8.0

#概要
・Docker ComposeでMySQLコンテナをビルド
・MySQL WorkBenchでコンテナのDBに接続し編集
・Accessからcsvエクスポート(UTF-8)したものをMySQLにインポート

#インポート失敗
MySQL Workbenchのメニュー「Database」→「Migration Wizard」はちょっと面倒そうだったので、左メニューのインポートしたいデータベース名を右クリック→「Table Data Import Wizard」でインポート作業。
サクッといけると思ったけれど日本語が入っているとエラーでインポートできない。
テスト用にCSVで簡単なテーブルを作ってインポートしたが、１文字でも日本語が入っているレコードはインポートされなかった。

#デフォルト文字コード変更
色々調べた中で、こちら↓の記事の内容で解消。助かりました。
[MySQLでcharacter_set_databaseがlatin1になってしまう問題の対応方法](https://interu.hatenablog.com/entry/2013/11/19/120322)

MySQLにログインした状態でコマンド「show variables like 'char%';」実行した際に表示される各文字コードの中で、character_set_databaseが「latin1」から変更出来ないのが原因だった。下記手順にて設定変更に成功した。

###手順
１：mysqlログイン
２：コマンド「use `{インポート先のDB名}`」でDB指定
３：コマンド「show variables like 'char%';」実行　→　character_set_databaseが「latin1」になっている事を確認
４：コマンド「show create database \`{インポート先のDB名}\`;」　→　`/*!40100 DEFAULT CHARACTER SET latin1 */`になっている
５：「ALTER DATABASE \`{インポート先のDB名}\` default character set utf8;」実行し、デフォルトをUTF8に変更
６：コマンド「show variables like 'char%';」実行　→　character_set_databaseが「utf8」に変更された事を確認
７：MySQL WorkBenchで日本語含むcsvのインポート成功

#おわりに
業務逼迫中のメモなので図も無いざっくりで申し訳ないですが、また余裕出来たらちゃんと書き直したいと思います。読んで頂いてありがとうございました。
令和もCAでプロダクトマネージャーやるよ！

この記事は、
**Product Manager Advent Calendar**
の13日目です。（去年の記事は[ コチラ ](http://blacksheep.hatenablog.com/entry/2018/12/15/021216)）

# ごあいさつ
AI事業本部 販促サイネージAD配信でプロダクトマネージャーをやってる小栗（ [@neiraza](https://twitter.com/neiraza?lang=ja) ）です。
サイバーエージェント 6 年目、エンジニア 17 年目、プロダクトマネージャー 3 年目、人生 43 年目になりました。

今年の５月から新しい挑戦をやらせて頂いていて、そこでのプロダクトマネージャーとしてのお仕事について、振り返ってみたいと思います。
テクニック的な話しは…なく、ややポエム入ると思うます。

# 立ち上げ
4月の中旬くらいに、「*ちょっと、立ち上げて*」って辞令がくだり、５年ほどやってたSSP事業から離れました。
![1.立ち上げ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107/660c1c4b-85c8-db52-465e-e66cf563a9cb.png)
最初は１人で、Product Manager（PdM） 兼 Business Manager（BM, 事業責任者）でした。
すぐに、Engineering Manager（EM）のアサインも確定し、２人３脚で数ヶ月。

それなりの役割を会社から任せて貰えるようになると、ポジションとか小さい話しは考えても無駄。
そもそもポジションがなんだろうが、僕のやるべきはPdMなので、ひたすら頭と足を使って **『自分が実現したい未来』** を探すという **苦しみの谷** をウロウロしてました。

# 指令
それは、全てこれのため。
![2.指令.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107/34d988d7-09cb-79df-b36e-07675106e94d.png)
モノづくりは、趣味でも芸術でもなく、自己満足のためだけにやるんじゃない。
これは、多くの人の協力を得られるまでの旅、 **苦しみの谷** 。だって、フワフワしすぎで不安になるよね。
でも、結局は正解なんてないし、自分で覚悟を決めて自分の言葉で言い切るしかない。
（たぶん、その間に多くの人に教えてもらい、言い切れるだけの言葉が見つかってるはず。しらんけど。）

# 創る
自分とチームが信じられる **VISION** や **MISSION** ができたらー
![3.創る.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107/2dc4da05-56d6-3109-ad4d-db81b0c11fcc.png)
２０２０年度で **MISSION** をやりきるために必要なスタートとゴールをきめて、
そこに必要な機能や営業成果を具体的にイメージして、書く描く書く描く書く描く書く描く書く。
あとは、スタートとゴールの間を適当につなげれば、ロードマップの完成。

たぶん、ロードマップ自体は重要ではなく、その過程で発現したアイデアたちに価値がある。プロダクトロードマップはアイデアの箱みたいな感じ。
MISSIONへのたどり着き方はたくさんあるはずなので、そのルート自体にこだわりすぎない。変化を受け入れるつもりでした。

今回、僕が一番大事にしたのは、 **MISSION** を達成するために、1Qでどんな **プロダクトOKR** をたてるか。 これは **絶対にやりきるし、絶対に外さないし、絶対にピボットしない。** 

# 実行あるのみ
**1Q プロダクトOKR** をやりきるために！
![4.実行あるのみ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4107/3683d41c-56df-9d16-3d5b-1b5710ee4e7c.png)
よくある風景だとは思いますが、プロダクトOKRを達成するためのサイクルをつくり、みんなが常にプロダクトOKRと向き合うように、BMやEM と随時イベントを入れて、実行あるのみ。

僕はプロダクトOKRを達成すると、「利用されて」、「儲かって」、「もっとモノづくりをしたくなる」 と信じてるので、実行あるのみ。

# まとめ（反省）
チームが1Q プロダクトOKRに向き合い、２ヶ月という期間で予定通りに最初のローンチができました。
反省としては、毎週のMTGで、プロダクトOKRの振り返りを **見える形** にしても良かったかなと思います。その方が、まとめた振り返りとかにコスト割かなくて良いし。
その **見える形** を何かしらの **キャンペーン化** して運営しやすいものにすると、ストーリーができて、人の心ももっと動かせるのかなとか思ったりしました。

その辺の続きは、 **CyberAgent Developers Advent Calendar 2020** で！
Cloud Schedulerの定期バッチをスマホから実行する

#概要

私のPJではCloud Schedulerを使用して、定期バッチを実行している。
流れとしてはCloud Scheduler＝＞Pub/Sub＝＞Cloud Functionsと、よくあるパターン。
これをたまに任意のタイミングで外出先から実行したい場合がある。
一番いいのはslackのSlash Commandだが、今回は工数をかけずに簡単かつslackが使えない場合の代替案として用意しておきたい。

ブラウザを使ってGCPのポータルで実行する案からスマホアプリのCloudConsoleを使うに至った経緯を残しておく。
GCP初心者向けのコンテンツなので、意味が分からない方のみお進みください。

slackの名誉のために可用性に言及しておくと、slackのSLAは99.99%と十分なレベルを誇っている。
とはいえ保証といっても、ダウンタイム分を返金（slackはポイントの模様）してくれるだけで、1つに依存することはリスクがあることに変わりはない。
https://slack.com/intl/ja-jp/terms/service-level-agreement

スラッシュコマンドの作成手順はこちら。
https://api.slack.com/interactivity/slash-commands

#Prerequisites

- GCPを簡単に触ったことがある初心者
- slackによるChatOpsのみで運用している方


#経緯

##ブラウザを使ってGCPのポータルからSchedulerを実行する

Cloud Schedulerを設定したなら誰しもが触っただろう、「今すぐ実行する」ボタンを使うことを考える。
結論から言うと、これはなしと判断した。
バッチ処理が複数のモードを持っており、手動で動かす場合、Schedulerから送るペイロードのJSONを変更する必要があるという事情がある。
しかしSchedulerはペイロードを変更するには変更後にアップデートが必要。手順としては、

1. ペイロードの修正＆更新
2. 実行
3. ペイロードを元に戻す＆更新

こうなるわけだが、3を忘れると結構面倒なことになる。
外出先から手間のかかる操作は事故が起こる未来しか見えない。
事故の未来が見えるならこいつは不適切という判断。

##ブラウザを使ってGCPのポータルからPub/Subを実行する

当時トピックにメッセージを設定するメニューが見つけられなくて、これを実行したことはない。
今回あたらめてみてみるとメッセージを設定できそうなので、推定の手順を載せておく。
（GCPはスマホからだとレイアウトがはみ出して、見れない部分が出てきて本能的に回避してしまう:pensive:）

1. ポータルのDrawerを開いてPub/Subのトピックを選択
2. 該当のトピックIDを選択
3. Pub/Subのタイトルメニューからメッセージをパブリッシュを選択
4. メッセージ本文にJSONを記入して公開ボタンを押下
5. メッセージを元に戻す必要がある？ない？

一つ疑問に思ったのが、SchedulerのペイロードとPub/Subのメッセージの両方にJSONを設定したどうなるんだろう？
SchedulerはPub/SubにJSONを渡しているだけだろうから上書き？
それならPub/Subのメッセージは手動専用に設定しておけば、公開ボタン押下のみで済むが…
機会があれば検証してこちらを採用するかも？

##Cloud Shellから実行する

何かいいやり方はないかと模索して、ようやくスマホアプリにあるCloud Shellに目を付ける。
```gcloud```コマンドが実行できる頼もしいやつ。（要求あってからプロビジョニングするから起動が遅めなのがちょっと不満だけど）

まずはSchedulerのコマンドを実行しようとしたが、どうもGUIで操作するのと同様、いったんアップデートを挟む必要がありそう。
これではブラウザで実行するのと同様なので不採用。

本来であれば自動実行時と同じようにSchedulerからスタートしたかったが、手間がかかるためこれは断念。
実際のところ、SchedulerにセットするペイロードはPub/Subにそのまま渡すようなので、Pub/Subからスタートすることに方針変更。

pubsubコマンドのドキュメントはこちら。
https://cloud.google.com/sdk/gcloud/reference/pubsub/topics/publish

基本的にはドキュメントに沿って、messageの内容がJSONというだけ。トピックIDはplaygroundとしている。
Functionsの方では常にペイロードのJSONを解釈しており、manualがfalseなら時間によってモードが決まり、manualがtrueならburstModeの指定に従うようにしている。
これを実行すると、任意のタイミングで指定のモードを実行することができる。

```terminal:cloudshell

$ gcloud pubsub topics publish playground --message '{"manual":true,"burstMode":true}'

```

ちなみにエラーの場合が気になるかもしれないが、Functionsが実行されるとslackに通知を出すようにしているので、あとはslackで状況を見ればよくなる。


#Conclusion

Cloud Schedulerの定期バッチをslackから実行できない状況の代替案として、スマホから実行できるようになった話でした。
slackからの実行とCloud Shellからという2通りの実行方法があれば十分でしょう。（ブラウザからでも行けるから3通りか:sweat_smile:）
ただし、Cloud Shellへの文字入力はしづらいので、コマンドを保存しておくか、前回実行済みなら↑キーを使って履歴から呼び出したほうがやりやすいです。
workgroup名の取得方法

.Net C#でworkgroup名を取得する方法です。
日本語でググると Marshal を利用した方法がトップに出るのですが、Windows10では保護されたメモリ領域へのアクセスとして例外エラーが生じます。

以下からの引用の一部改変（usingなしでOKな記述に変更）ですが、載せておきます。
https://stackoverflow.com/questions/2708610/how-can-i-get-the-workgroup-name-of-a-computer-using-c

```csharp
        public static string GetWorkGroupName()
        {
            System.Management.ManagementObject computer_system = new System.Management.ManagementObject(
                        string.Format(
                        "Win32_ComputerSystem.Name='{0}'",
                        Environment.MachineName));

            object result = computer_system["Workgroup"];
            return result.ToString();
        }
```
AD LDS インスタンスを Windows から削除する

# 概要
 Active Directory Lightweight Directory Service (AD LDS) の再構築の際や Windows Server から AD LDS の役割を削除する際の準備として、当該のマシンから AD LDS インスタンスを削除する必要がある。AD LDS は以下の2つの方法で削除することができる。

- Windows の設定から実行 : GUIでサクッと消したい場合。
- PowerShell コマンドレットで実行 : CLI派、自動化したい、管理者権限が必要などの場合。

# Windows の設定で AD LDS インスタンスを削除する
Windows メニューから **[設定] > [アプリ] > [アプリと機能]** から目的のインスタンスを選択し、**[アンインストール]**をクリック。

# PowerShellで AD LDS インスタンスを削除する
`ADAMuninstall` コマンドを使用して削除

```powershell:PowerShell
ADAMuninstall /i:instancename
```

利用可能なオプションは以下の通り

|option|説明|
|:--|:--|
| `/i:instancename` | 指定した名前の AD LDS インスタンスを削除する |
| `/answer:filepath` | 認証情報を記述したファイルを指定 |
| `/q` | QUIET モードで実行 |
| `/force` | アンインストール中の警告を無視する |


### 実行例
Corp.local ドメインの Windows マシンから SampleInstance という名前のAD LDSを削除する場合はこんな感じ。PowerShell で以下を実行する。実行後に認証情報を効かれるので、適宜入力する。

```powershell:PowerShell
ADAMuninstall /i:SampleInstance
```

認証情報が事前にファイルに保存されてたりする場合には `/answer` オプションを使ってファイルから読ませる。認証に使うユーザー( `AdminUser` )とそのパスワード( `P@ssword` )を記述したファイル `Auth.txt`

```plaintext:Auth.txt
Administrator=CORP\AdminUser
AdministratorPassword=P@ssword
```

これが `C:\hoge` ディレクトリにある場合、実行するコマンドは以下のようになる。

```powershell:PowerShell
ADAMuninstall /i:SampleInstance /answer:C:\hoge\Auth.txt
```
##実行結果
画像のようなダイアログが表示されれば削除は完了。
![ADLDS-uninstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492382/6c67f476-7ee2-4b44-8e4f-2e671dfcfa79.png)
お疲れさまでした！
laravel-admin で多対多リレーションの項目を multipleSelect() で AND 検索する方法

処理の流れは以下のとおりです。

1. grid画面でmultipleSelect()を使用して一つの項目で複数選択できるようにします
2. multipleSelect()で取得した配列で中間テーブルを検索します
2. 中間テーブルで多対多で紐づくテーブルのIDを検索し、全てヒットするもう一つの外部キーをgroupbyとhavingを使用して特定します
3. $query->whereIn に特定した外部キーの配列を渡してフィルタします

- ActivationKeyCreateHistoryProduct.php (中間テーブル)

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class ActivationKeyCreateHistoryProduct extends Model
{
    protected $table = 'activation_key_create_history_product';

    public static function ActivationKeyCreateHistoryProducts($productIds)
    {
        return ActivationKeyCreateHistoryProduct::whereIn('product_id', $productIds)
            ->groupBy('activation_key_create_history_id')
            ->havingRaw('count(distinct product_id) = ' . count($productIds))
            ->get('activation_key_create_history_id');
    }
}
```

- ActivationKeyCreateHistoryController.php (フィルタ部分)

```php
        $grid->filter(function ($filter) {
            $filter->where(function ($query) {
                $aKCreateHistoryProducts = ActivationKeyCreateHistoryProduct::ActivationKeyCreateHistoryProducts($this->input);
                $aKCreateHistoriesIds = [];
                foreach ($aKCreateHistoryProducts as $item) {
                    $aKCreateHistoriesIds[] = $item['activation_key_create_history_id'];
                }

                $query->whereIn('id', $aKCreateHistoriesIds);

            }, 'Products')->multipleSelect(Product::pluck('name', 'id')->toArray());
        });
```
Salesforce Einsteinボットを軽く使ってみた

# はじめに
Salesforceの国内最大のイベントである「Salesforce World Tour Tokyo2019」に行った際に、Einsteinボット体験ワークショップに参加してきました。
いい機会なのでそのときの内容を元に使い方を簡単にお伝えできたらなと思います。
※細かい使い方の説明ではなく、Salesforceで簡単に構築できるボットがあることをご紹介する程度の内容です！
# 初期設定
まず最初の設定です。
設定から「Einsteinボット」を選択して有効化しましょう。
<img width="1430" alt="EinsteinBot設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/b3243f4d-e516-2038-8b40-991fe7570414.png">
# Einsteinボットの新規作成
設定ページを下にスクロールして「私のボット」セクションにある「新規」ボタンを押しましょう。
するとボット名などの設定内容入力ダイアログが出てくるので必要なものを入力してボットを作成しましょう。
<img width="1430" alt="EB新規作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/8f6832ff-2b14-9ece-e97e-b99959bc5d7e.png">
作成すると以下のようなEinsteinボットビルダー画面が出てきます。
主にこの画面上でボットを構築していきます。
<img width="1438" alt="EB作成後画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/50a75a3e-e512-fb38-7717-9f31fae30f31.png">
# Einsteinボットの編集
ここでは悩みを聞いてアドバイスをくれるボットを作っていきます。
まずは最初のダイアログを作成します。
左のメニューバーからメインメニューを選択しましょう。これが最初のダイアログになります。
<img width="1440" alt="メインメニュー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/a035eab9-7b29-f6c7-b52a-fc1972453451.png">
画面中央にメッセージ・質問・アクション・ルールが表示され、それぞれ作成することができます。
まずはメッセージを作成します。
<img width="1440" alt="メインメニュー２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/fb441b50-456e-4b65-4f1a-75eaea777e86.png">
メッセージを作成した後は質問を作成します。
先ほど作成したメッセージの下に「＋」ボタンがあるのでそれをクリックします。
するとまたメッセージ・質問・アクション・ルールが表示されますのでどんどん作っていきます。

質問に回答した後は別のダイアログを表示したいため、「次のステップ」セクションから「別のダイアログを開始」を選択し、ダイアログを新規作成します。
<img width="1436" alt="メインメニュー3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/f3161ce2-0bf3-278e-292b-cce130d2999b.png">
<img width="1438" alt="アドバイス.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/3fe6d5c0-f595-ae81-ddfd-f6d455ca03be.png">
# プレビュー
せっかくなので出来上がったものをプレビューしてみます。
※本来は組み込みサービスの設定等々をしないとプレビュー機能を利用できないのですが今回は割愛しています
プレビューするためには有効化が必要なのでまず有効化しておきましょう。
その後画面右上のプレビューを押すとチャットが開始できるようになりますので送信ボタンを押して開始しましょう。
<img width="1439" alt="プレビュー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/0600fb25-8b2f-55a3-552f-a959f585a61c.png">
まずどんな悩みなのかの質問と選択肢をボタンで表示してくれます。
<img width="374" alt="プレビュー２.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/de5ff151-3891-fa2e-9db9-6cff4c625ce4.png">
ボタンを押して回答するとその次に設定したダイアログが表示されます。
<img width="371" alt="プレビュー３.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260521/0a1d13d7-3328-c424-6044-51e7d2c92e27.png">
今回作成したチャットはこんな感じです。
# 最後に
今回は非常に簡単なボットの構築までで大したことはしていませんが、もちろんユーザの回答内容によって次のダイアログを分岐できたり、変数に回答内容を保存してメッセージに表示できたりします。
チャットボット自体はこれからもどんどん使われていくかなと思うので、特にSalesforceのゲストユーザやコミュニティユーザ向けに使えるところがないか考えていきたいですね。
ひとまずはEinsteinボットのお手軽さが伝われば幸いです。
それではよいSalesforceライフを( ^_^)/~