OmniAICreator/Qiita-1.07M huggingface dataset:
Processing video library 使えない問題について(macOS Catalina)

先日，macのOSをCatalinaにアップデートした際に，processingのvideoライブラリーが使えなくなったので調査しました．[Github](https://github.com/processing/processing-video/issues/134)にIssueがたってたので解決法をまとめます．

バージョン
macOS Catalina 10.15.1
Processing 3.5.3
## 内容
まずは，下記のURLからvideoライブラリーのバージョン2をダウンロードしてきます．
https://github.com/processing/processing-video/releases/tag/r6-v2.0-beta4

そして，元あるvideoライブラリと置き換えます．

ターミナルを開いて，videoライブラリーの/library/macosxにcdします．

```
$ cd ~/Documents/processing/libraries/video/library/macosx
```
最後に以下のコマンドを実行します．

```
$ xattr -p com.apple.quarantine libavcodec.58.35.100.dylib
$ xattr -w com.apple.quarantine "00c1;5dc1bfaa;Chrome;78F18F7D-3F71-4E55-8D58-BAB946AB4707" *.dylib
$ cd gstreamer-1.0
$ xattr -w com.apple.quarantine "00c1;5dc1bfaa;Chrome;78F18F7D-3F71-4E55-8D58-BAB946AB4707" *.dylib
```

これで，processingを立ち上げ直せばいけると思います．
自分の場合これに加え，インスタンス化する際にカメラの指定をしなくてはならなかった．

```java
video = new Capture(this, width, height, "FaceTime HD Camera");
```
これでなんとか動かすことが出来ました．

#### 参考
[processing/processing-video/issues/134](https://github.com/processing/processing-video/issues/134)
[UE4]Buffer Visualizationをカスタマイズする！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/e788d959-ef1d-5a34-e570-f141babc4f3f.png)

Buffer Visualizationモードで色々な情報を出せますが、プロジェクトによって独自に見たいモードなどを作りたいかもしれません。Buffer Visualizationはエンジン改造をすることなく簡単に拡張/差し替えができます。

Buffer Visualizationの各種モードは、Engine/Config/BaseEngine.ini内部の[Engine.BufferVisualizationMaterials]に設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/75489afb-a6e4-2250-19aa-cbbb86803152.png)

Buffer Visualizationはこの上のリストで指定されているポストプロセスマテリアルを呼び出すだけの機能だったのです。各種マテリアルはEngine Contentの中に入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/02d82150-836c-c01b-4ec0-49abb4598d26.png)

例: SceneColorのポストプロセスマテリアル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/bd1ebd75-edb2-0de9-dc44-f5367023571a.png)

ということで、こちらを書き換えてオリジナルのポストプロセスマテリアルを追加すればBuffer Visualizationをカスタマイズできます。※こちらBaseEngine.iniを上書きしなくても、それぞれのプロジェクトのDefaultEngine.iniで[Engine.BufferVisualizationMaterials]を記入すれば、エンジン側の.iniに触れずプロジェクト単位で拡張できます。

ということで参考例として独自のモードを追加してみます。（例はただ赤を返すだけ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/cde0aaf2-d35d-2dd4-9889-5a851630432d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/8248e422-85df-a5d0-5f7d-2560d5275d20.png)


ちゃんと出てきてくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/d2bc5472-93d8-f714-dece-23b38f6d9c41.png)

ちゃんと真っ赤になります。目が痛い。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/ad72c6d1-5c43-79fb-cbd9-4ce385e517ce.png)
CloudFormationの既存リソースインポート機能を触ってみた

お世話になっている開発案件にて、

既存のリソースをCloudFormationに適応してみてはどうか？

というお話が上がりまして、早速最近解禁されました既存リソースのインポート機能が使えないかとおもい触ってみました。

新機能 – CloudFormation スタックへの既存リソースのインポート
https://aws.amazon.com/jp/blogs/news/new-import-existing-resources-into-a-cloudformation-stack/

今回初めてCloudFormationを触ったこともあり、つっかかった点や、便利だなと思った点があったので、何か参考になればと思い共有できればと思います^ ^

## なにが便利なのか？

CloudFormationへ既存リソースを移行したり再構築する手間が省けました。

今まではCloudFormationに既存リソースを組み込むとした場合、Stackに新規でリソースを紐づけたあとに、データの移行なりインスタンスの内部設定だったりを行う必要がありました。RDSとか大変そうですね^ ^;

また既存でなくともStackごと新規で作成したリソースについて、そのStackが削除されると、紐づけたリソースが残ったとしても、別のStackには紐づけられず、また一から紐づけ直しになってしまっていました。(https://dev.classmethod.jp/cloud/aws/cloudformation-launches-resource-import/)

今回の機能を用いることで、こういったStackに再度紐づけを行う際の再構築の手間であったり、既存リソースをCloudFormationに移行する手間が大幅に削減できそうです。


## インポート時に「DeletionPolicy」の設定が必須

ではここからは既存リソースのインポートについて。

既存リソースのインポートには「DeletionPolicy」の設定が必須です。

本来Stackに紐づくリソースは、Stackが削除されると一緒に削除されます。
このままだと既存リソースを紐づけた際に、うっかりStackを削除してしまうと、既存リソースも消えてしまいます。これは大変です^ ^;

そのため「Stack削除時にリソースはどうするか？」という設定が必要になります。

この設定が「DeletionPolicy」です。こちらを「Retain」と指定しておくと、Stack削除時もリソースは残ったままになります。

CloudFormerによるテンプレート出力では、こちらの設定が書いていないので、別途追加する必要があります。(これが地味に時間かかる^ ^;)

ご丁寧なことに既存インポート機能ではこの設定が存在するかをチェックしてくれるので、うっかりミス対策も意識させてくれます。非常に親切ですね^ ^


## 既存リソースインポートと、既存リソースの編集は同時にできない。

既存リソースインポートを行った後、別の既存リソースインポートと、インポートしたリソースの編集を一括して行うことはできないようです。

編集は「変更セット」機能を使って別々に行ってください。


## すでに別のStackに紐づいているリソースは共有できない

他のStackで関連付けされている既存リソースは原則関連付けできません。一回そのStackとの紐づけ関係を解消するか、Export/Import設定をテンプレートに記載する必要があります。

参考：CloudFormationのスタック間でリソースを参照する
https://dev.classmethod.jp/cloud/aws/cfn-cross-stack-reference/


## 触ってみた所感

実際さわってみたところ、まだこの機能ではインポートできないサービスもあるようで、すべてがすべてインポートできるようではないようです。(実際「対応してないよエラー」に出くわしました)この機能を使って既存のサービスをCloudFrontに移行する場合、大規模なものだとまだ難しいのかも^ ^;

ただし、今後対応サービスは増えていくでしょうし、やはり再構築の手間やStackへの着脱が可能になったのは大きいと思います。

今後の発展に期待ですね！
基本情報技術者試験の勉強計画　第6週（11/25週）

## 目標と結果
### 目標
・苦手なところをできるようにする
・最後まで終了する
・独習ゼミのボタンをFE50まで押す
### 結果
・できるようにはなっていないが、少しは克服できた。だが、残り2つの分野がなかなか難しい。
・一通りは最後まで終了した。
・独習ゼミのボタンはあと少しで終わるところまできた。
## 振り返り
### keep
・過去問道場を繰り返し空いた時間に解く。
### problem
・大学のほうのテストもあって、毎日はできていなかった。
### try
・苦手な分野は特に、苦手でない分野までも過去問道場を暗記するまで解く。
TypeError: Cannot read property '$createElement' of undefined

不要なところで、誤って `functional: true` を設定していました。

```
// 誤
export default {
  functional: true,
}
```
```vue.js
// 正
export default {
  functional: false,
  // または削除
}
```


他にも色々原因となり得るものは、あると思うのですが

* [[Vue2.0] TypeError: Cannot read property '$createElement' of undefined - Qiita](https://qiita.com/Ksaka9821/items/afcd4625dede43d57131)

自分は上記でハマりました。どこが原因かエラー文からはわかりにくかったので。
#Rails + rake でタスク名を標準出力・ログ出力する例 ( how to Log or STDOUT task name on rake with Rails )


```ruby
namespace :foo do
  task run: :environment do |task|
    puts task.name
    puts Rails.logger.info task.name
  end
end
```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2764








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
arduino-cliでGUI Arduino IDEと同じ設定でBuild(Tools設定)

## arduino-cliとは
コマンドラインインターフェースでArduinoのBuild(やUpload)ができる便利なツールです。
https://github.com/arduino/arduino-cli

## Toolsの内容はcliの場合どこで設定するの...?
![menui.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93722/62696c5d-6e09-e942-237c-b130c8db76e3.png)
Arduino_STM32を入れた場合のArduino IDE、ToolsメニューからOptimizeやUpload Methodを設定できる

arduno-cliの場合は、どこから設定するのでしょうか...? 

## -b(--fqbn) オプションで設定できるみたい

Arduino IDEでVerifyをすると下部のコンソールスクリーンで、こんな表示があることに気づきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93722/4071fdca-6881-7664-c357-bc2a01279f0d.png)

**rogerclarkmelbourne/Arduino_STM32**
(https://github.com/rogerclarkmelbourne/Arduino_STM32)
- Board: "Generic STM32F103C serial" 
- Optimize: "Smallest(default)"
- Upload method:"Serial"
- Variant:"STM32F103CB(20k RAM,128k Flash)"
でVerifyした場合、
`--fqbn=Arduino_STM32:STM32F1:genericSTM32F103C:device_variant=STM32F103C8,upload_method=serialMethod,cpu_speed=speed_72mhz,opt=osstd` という`-fqdn`オプションが指定されていました。

arduin-cliでcompileする場合は、-bまたは--fqdnオプションで同じように指定すればOK

```
$ arduino-cli compile ./mySketch -b=Arduino_STM32:STM32F1:genericSTM32F103C:device_variant=STM32F103CB,upload_method=serialMethod,cpu_speed=speed_72mhz,opt=osstd
Sketch uses 11484 bytes (18%) of program storage space. Maximum is 63488 bytes.
Global variables use 2456 bytes (11%) of dynamic memory, leaving 18024 bytes for local variables. Maximum is 20480 bytes.
```
【Docker-02】Docker for Macで使い捨てMySQL環境の作成

#はじめに
SQLの練習をしたい時にローカルで使い捨てできる環境あると良いなーと思っていたらDockerで簡単に実現できそうなのでやってみました。
仮想環境の知識が乏しい時はAWSに立てるか？とか考えてたので正気じゃないですね:innocent:

本記事の執筆にあたり、「[Dockerで使い捨てのMySQL環境を用意する。事前データを投入して起動する。](https://budougumi0617.github.io/2018/05/20/create-instant-mysql-by-docker/)」を出典とさせて頂きました。この場を借りてお礼申し上げます！

#やってみる
##Docker Desctop for Macのインストール
公式からインストールします。
https://docs.docker.com/docker-for-mac/install/

書いてて思い出しましたが、確かブラウザでDockerの起動とか練習するSaasがあったような。。？
そちらでもMySQL環境作成できるかもしれませんね。本記事では割愛させて頂きます。

##コンテナの起動
MySQL公式のイメージを使用するので、いきなり起動。便利すぎる。

コマンドは改行せずに1行で書き切ってもOKです。
パスワードは確か英小文字大文字数字の8行とか9行じゃないとダメだったような気がしますが、適当に入力してもログインできました。なんでだw

サイトに倣い、ポートは43306をマッピング。3306:3306でも良いと思います。

```
$ docker container run --rm -d \
> -e MYSQL_ROOT_PASSWORD=okome \
> -p 43306:3306 --name mysql mysql:5.7
```

##mysqlに接続
ローカルのシェルでmysqlしたら怒られた。
「mysql」コンテナのシェルを起動した後にmysqlに接続するのが正解のようです。
パスワードはコンテナ起動時に指定した「okome」を入力。

```
$ docker exec -it mysql /bin/bash
# mysql -uroot -p
Enter password:

mysql>
```

うおお動いた！早い！かんたん！
特に.mysqlは指定していないのでまっさらの初期状態ですが、勉強目的の使い捨て環境と考えるなら全然問題ないですね。捗るぜ。。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```

#事前にデータ投入して起動する
「[Dockerで使い捨てのMySQL環境を用意する。事前データを投入して起動する。](https://budougumi0617.github.io/2018/05/20/create-instant-mysql-by-docker/)」のリンクにあった「[事前にデータ投入をした MySQL Docker イメージを作る場合は /docker-entrypoint-initdb.d を活用すると便利](https://kakakakakku.hatenablog.com/entry/2017/11/08/193031)」を拝読すると、docker-entrypoint-initdb.d/にテーブルや実データを定義したgzやgzipを置けばコンテナ起動時に読み込んでくれるとのこと。

Dockerfileをサイト通りに記述し、公式からダウンロードしたworld.sql.gzを同じディレクトリに配置します。

```
$ cat Dockerfile
FROM mysql:5.7

COPY world.sql.gz /docker-entrypoint-initdb.d/world.sql.gz

$ ls -l
Dockerfile
world.sql.gz
```

配置後はイメージをビルドし、起動。

```
$ docker build -t mysql-image .
$ docker container run -e MYSQL_ROOT_PASSWORD=okome --name mysqlserver -d mysql-image
```

シェルを起動してmysqlに接続。
world databaseできとるやん。。素晴らしすぎる。

```
$ docker container exec -it mysqlserver /bin/bash
# mysql -uroot -p
Enter password:
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| world              |
+--------------------+
5 rows in set (0.00 sec)

mysql> use world
Database changed
mysql> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| country         |
| countrylanguage |
+-----------------+
3 rows in set (0.01 sec)
```

コンテナを停止する時は普通にdocker stopで。
run→stopしたコンテナを再起動するときはstartで行います。

```
$ docker stop mysqlserver
$ docker start mysqlserver #PIDでも可
```

#おわりに
実際に手を動かすと、Dockerの可搬性の高さを実感できますね。
DB周りの知識が弱いんで、これを使ってガリガリ手を動かします！

オプションも散らかってきたので整理しなきゃですね。
あと薄々気づいてはいたのですが、dockerコマンドのcontainerって省略できたんですね。
それが一番有益だったかもしれないw

簡単ですが以上です。
QuasarFramework(Vue.js) + FirebaseUIでEmailとgoogleでの認証機能を実装する

# 前の記事
https://qiita.com/yassyskywalker/items/f247e0288803559aa5a1

# 概要
FirebaseUIを使って認証機能を実装します。前回までは、UIを表示させるまででしたが、今回は実際の認証機能まで実装します。といっても、Firebaseは、コンソールから設定できることが多いので、簡単なものだったら、びっくりするくらい早く実装できます！

# 環境
- MacOS Catalina 10.15.1
- node v10.16.0
- npm 6.11.3

# Emailでの認証を設定する
## メールアドレスのAccountChooserの設定を外します。
デフォルトだとおそらく以下のような画面が表示されてしまいます。

<img width="912" alt="スクリーンショット 2019-11-25 15.13.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125574/e52b6184-f154-1066-6f5a-e3c6b66fe344.png">

↑これをなくします。そのために、uiConfigのオプションで、`credentialHelper`を設定します。

```javascript
const uiConfig = {
  signInSuccessUrl: '/',
  signInOptions: [
    firebase.auth.GoogleAuthProvider.PROVIDER_ID,
    firebase.auth.EmailAuthProvider.PROVIDER_ID
  ],
  credentialHelper: firebaseui.auth.CredentialHelper.NONE
}
```

## コンソールからユーザーを登録しておきます。
あらかじめ、コンソールからユーザーを登録しておきます。

<img width="1047" alt="スクリーンショット 2019-11-25 15.54.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125574/a1710caa-34b3-36ef-3c66-195ce5825848.png">


## テストしてみます。

<img width="359" alt="スクリーンショット 2019-11-25 15.56.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125574/2779381c-23d5-aeaa-559e-fc2285138411.png">

`signInSuccessUrl`で設定したページに遷移すれば成功です！

# googleでの認証を設定する

## コンソールからgoogleサインインを有効にします。
<img width="927" alt="スクリーンショット 2019-11-25 16.00.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125574/746861a2-e3c8-977e-af86-28170afcf2e2.png">

プロジェクトの公開名、プロジェクトのサポートメールを設定して保存します。

## テストします。

<img width="501" alt="スクリーンショット 2019-11-25 16.14.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125574/0c8e76d9-bd07-d440-23c5-c0134754429a.png">

↑こういう感じの画面で、google にログイン画面が出てきたらアカウントを選択してログインします。こちらはユーザーが無い場合は、自動で作成されます。

先程のEmail認証のときと同じ用に、`signInSuccessUrl`で設定したページに遷移すれば成功です！

# 次回
次回は、より細かいユーザー設定を実装してみます・
#Rails + rake で 定数参照できない実行エラー : NameError: uninitialized constant ModelName

environment指定をすること

```diff
namespace :foo do
-   task :run do
+   task run: :environment do
    ::ModelName.bar
  end
end
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2763








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[ Android ]　バージョンを指定する方法


androidでバージョンを指定するにはbuild.gradleファイルを用いる。

##ファイルの場所
まずプロジェクトを表示する。
![スクリーンショット (164).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/7bd97c81-8a07-e139-1f9e-3317f49d8e68.png)


そのなかにbuild.gradleファイルがあるので、これを開く。
![スクリーンショット (165).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/9a316573-6f87-8b68-087b-78eefc54f725.png)

そこに以下のような記述がある。ここを変更する。
![スクリーンショット (166).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/1488b7cb-3024-e97e-4fe4-2d8f97d366c5.png)


##compileSdkVersion
APK作成時にコンパイルで使用するSDKのバージョンを指定。

##buildToolsVersion
ビルド時に使うツールのバージョンを指定。

##targetSdkVersion
アプリを動作させるバージョンを指定。

##minSdkVersion
端末がインストールできる最低のバージョンを指定。
Hamlの基本箇所についての復習④（ネスト）

#はじめに
飽きもせずHamlの基礎について書いていきます。
今回はクラスのネストについてです。
#実行
例えば、htmlで次の様に書かれているとします。

```html
<div ="wrapper">
 <div ="top">
 </div>
 <div ="down">
 </div>
</div>
```
`wrapper`という大きなクラスがあり、その中に`top`と`down`という小さなクラスが二つあります。
このように親要素・子要素があるhtmlファイルだと、ちょっとした書き間違えが起こります。例えば次のようなものです。

```html
<div ="wrapper">
 <div ="top">
 <div ="down">
 </div>
</div>
```
これは`<div ="top">`の閉じタグがない状態です。これだとCSSがちゃんと適用されないなどのエラーが起きます。
単純なミスですが、意外と気づきにくく、エラー解決まで時間を要することも少なくないです。

しかし、Hamlを使えばこの問題を多少なり解決することができます。
前述のコードをHamlで書き直すと次のようになります。

```haml
.wrapper
  .wrapper__top
  .wrapper__down
```

htmlよりも短く書けたのが分かると思います。
一番わかり易い違いは***閉じタグがないこと***です。
クラス名を書いた後に、本文を書くだけでオブジェクトが作れます。
これなら閉じタグを書き忘れた事によるエラーが起きえません。

もう一つはクラスの書き方です。
htmlでは、親要素には親要素のクラスのみ、子要素には子要素のクラスのみを書いていましたが、
Hamlでは子要素には親要素を含めたクラスを書きます。
書き方は`.親要素のクラス名__子要素のクラス名`と書きます。間に`_`（アンダーバー）を二つ続けて書きます。
上記のコードだと、親要素が`wrapper`子要素が`top,down`なので、

```haml
  .wrapper__top
  .wrapper__down
```
と書きます。
また、***子要素は親要素から半角2文字分のインデントをつけます***。
そうしないとエラーが起きて、ビューが表示されません。
これにさらに子要素を追加する、例えばtopの子要素として`right,left`をつける場合は、

```haml
.wrapper
  .wrapper__top
    .wrapper__top__right
    .wrapper__top__left
  .wrapper__down
```
という風に書けます。
ちなみに、これをhtmlで記述すると

```html
<div ="wrapper">
 <div ="top">
  <div = "right">
  </div>
  <div = "left">
  </div>
 </div>
 <div ="down">
 </div>
</div>
```

となります。

注意点としまして、例えば次のように途中のクラス名が間違っていると不具合が起きます。

```haml
.wrapper
  .wrapper__top
    .wrapper__tap__right
    .wrapper__tap__left
  .wrapper__down
```
子要素のクラス名で、親要素のクラスが`top`にも拘わらず`tap`と誤って記述されています。
こうなると、親要素とは全く関係ない要素と判断され、CSSやJSなどで不具合が出てきます。
特にJSの場合、関数が上手く発火してくれない原因の多くが***クラス名を間違って書いている***だったりする事が多いです。

Hamlは便利ですが、エラーが全く起きないわけではないので、記述する時は最新の注意が必要です（これはHamlに限ったことではありませんが）
メールセキュリティトレイルマップ～DMARCやその先にある世界～

2019.11.14-15 開催された [JPAAWG 2nd General Meeting](https://meetings.jpaawg.org) で、弊社チーフエンジニア平野善隆により「メールセキュリティトレイルマップ～DMARCやその先にある世界～」というタイトルのセッションが行われました。その資料をこちらにも共有します。

[![thumbnail](https://speakerd.s3.amazonaws.com/presentations/585ea4959de74269b689314b25a66868/slide_0.jpg?14141863)](https://speakerdeck.com/hirachan/merusekiyuritei-toreirumatupu-dmarcyasofalsexian-niarushi-jie)

去年の発表資料も合わせてご参考ください。
去年の資料：[送信サイドからみたDMARC] (https://qiita.com/qualitia_cdev/items/9a45797305002c3f8458)
PHPからSlackに通知するシンプルな方法

# 流れ
1.Slack App を作成する
2.PHPにコードを記述する

# Slack App の作成

## Slack App の新規作成
https://api.slack.com/
上記URLにアクセスし、画面真ん中の「Start Building」をクリックする。

「App Name」：アプリの名前を入力
「Development Slack Workspace」：アプリを導入するワークスペースを選択

## Slack App の設定
「Basic Information」→「Display Information」でアプリのアイコンや色を設定できる。

「OAuth & Permissions」→「Scopes」で「Add an OAuth Scope」をクリックする。
「Add permission ...」の欄をクリックして、「chat:write:bot」を選択して有効にする。
「Install App to Workspace」をクリックし、「許可する」を選択する。
「OAuth Access Token」をコピーしておく。

# PHPの記述



```php
$token = {OAuth_Access_Token};//上記でコピーした「OAuth Access Token」
$channel = {Channel_Name};//投稿するチャンネル名(もしくはチャンネルID)
$text = {Post_Message};//投稿するメッセージ

$channel = urlencode($channel);//文字列をURLエンコードする(例えば日本語はそのままURLとして使用できない)
$text = urlencode($text);

$url = "https://slack.com/api/chat.postMessage?token=${token}&channel=%23${channel}&text=${text}";
$response = file_get_contents($url);
return $response;//特に意味はない。
```
Markdownで数式を表示する一番速い方法

## はじめに
マークダウン記法って便利ですよね。でも数式をデフォルトで表示する方法がないのが少し痛いです。でも、今回紹介する方法を使えば、マークダウンの冒頭に数行コードを埋め込むだけで簡単に数式を表示できるようになります。

## 手順
- 以下のコードをファイルの上部に追加します。

```md
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js">
</script>
<script type="text/x-mathjax-config">
 MathJax.Hub.Config({
 tex2jax: {
 inlineMath: [['$', '$'] ],
 displayMath: [ ['$$','$$'], ["\\[","\\]"] ]
 }
 });
</script>
```
- TeX形式で数式を記入します。もちろん、マークダウン記法と併用することができます。

```md
## オイラーの公式
オイラーの公式は以下のように与えられる。

$$ e^{i x} = \cos{x} + i \sin{x} $$

##  $ \varepsilon - \delta $ 論法
任意の $ \varepsilon > 0 $ についてある $ \delta > 0 $ が存在して、任意の $ x \in \mathbb{R} $ に対して $ 0 < |x - a| < \delta $ ならば $ |f(x) - f(a)| < \varepsilon $ を満たすとき $ f(x) $ は $ a $ で連続であるという。
```

- VS Codeは便利なので、標準でMarkdownのプレビュー機能が入っています。Cmd + K, V でプレビュー画面を開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329945/f7f5bb65-f3f4-d2c4-1f2c-ec2891b1491d.png)

- これを <a href="https://marketplace.visualstudio.com/items?itemName=yzane.markdown-pdf">VS CodeのMarkdown PDF</a>で出力すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329945/db820540-7025-1410-7f39-7adf48320c67.png)

普通のTexで出力するのと同じくらいきれいに出力することができました。

## 最後に
めっちゃ簡単なので是非是非試してみてください。
ノイズの時系列データの作り方

数値検証をする場合のノイズの時系列データがしばしばベンチマークとして使われる。

pythonで時系列データを作る。

# ホワイトノイズ

>
<a href="https://ja.wikipedia.org/wiki/%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%8E%E3%82%A4%E3%82%BA">ホワイトノイズwiki</a>
>


ガウス分布関数を利用して

```python:sample.py
import numpy as np
import random 
import matplotlib.pyplot as plt

dlen = 1024 #ノイズデータのデータ長
mean = 0.0  #ノイズの平均値
std  = 1.0  #ノイズの分散

y = np.array( [random.gauss(mean, std) for i in range(dlen)] )

plt.plot(y)
plt.show()
```
又はnumpyのrandomを使って簡単に

```python:sample.py
import numpy as np
import matplotlib.pyplot as plt

dlen = 1024 #ノイズデータのデータ長
mean = 0.0  #ノイズの平均値
std  = 1.0  #ノイズの分散

y = np.random.normal(mean,std,dlen)

plt.plot(y)
plt.show()
```

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538705/1f70138b-d75a-8f83-af3e-5c8289035ec5.png)
ES6の学習記録

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

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

#ES6とは
javascriptのバージョンの一種です。ES2015とも呼ばれています。(ESとは、ECMAScriptの略です。)


##主な記法

###表示
```js
console.log(); //　()の中に表示したい文字列、変数を入れる
```

###変数宣言
以前は```var```のみが使われていましたが、ES6から```const``` ```let```が使えるようになりました。主な違いは以下の通りです。

```js
var a; //再代入、再宣言可能（再宣言すると値は上書きされる）
let b; //再代入可能
const c = 100; //共に不可能、初期値を必ず設定しないといけない
```

###比較
==は比較する型が異なる時に型変換を行います。(123=="123"はtrue)
===は型変換を行わない書き方です。型の異なる値を比較するとfalseになります。(123=="123"はfalse)

###計算
```js
a = 1000;
b = 200;
console.log(a+b);
```
とすると、1000200と表示されることがあります。これは、aとbが数字として認識されておらず、文字列の連結として処理してしまっているためです。
ここでは、整数値として認識してほしいので、```parseInt()```を使います。

```js
a = 1000;
b = 200;
console.log(parseInt(a)+parseInt(b));
```
と記述すれば、正しく表示されるはずです。

また、小数の演算をしたい場合は、```parseFloat()```を使用します。

###文字列の反転
文字列を反転させる時は、以下のように記述します。sは元の文字列、tは反転後の文字列です。

```js
t = s.split("").reverse().join("");
```
手順としては、文字列を分割→逆順にする→結合　となります。

###配列.includes(要素)
特定の文字が含まれているかを調べる関数です。

```js
var nums = [2,3,4,5,6];
var a = nums.includes(3); //3はnumsに含まれる
var b = nums.includes(9); //9はnumsに含まれない
```
とすると、aは```true```、bは```false```となります。

###曜日を取得する
年、月、日を入力して曜日を求めるには以下のように記述します。
```.getDay()```は曜日を数字で返すので文字で出力したい場合は変換する必要があります。

```js
var date = ;//日を代入
var i = date.getDay(); //与えられた日の曜日を0~6の数字で表現
var WeekChars = [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ]; //曜日名を格納する配列を用意
var dayName = WeekChars[i]; //数字を曜日名に変換
```

##クラス
クラスは、ES6から使えるようになりました。（それまでは、関数をクラス代わりに使っていました。）
###宣言
クラスの宣言は以下のように書きます。

```js
class (クラス名) {

    //コンストラクタを定義
    //メソッドを定義
}
```

###コンストラクタの作成
コンストラクタはインスタンスの生成時に呼び出されるメソッドです。

```js
class (クラス名) {

    constructor(x, y, z){
       this.x = x; //xをこのオブジェクトのプロパティーにする
       this.y = y;
       this.z = z;
      }

    //メソッドを定義
}
```
ここでは、インスタンスの生成時に引数としてx,y,zを受け取り、オブジェクトのプロパティーに代入します。

###メソッドを定義する
メソッドとは、オブジェクトの中で定義される関数です。
コンストラクタで設定したプロパティーを使って処理することも出来ます。
以下のコードでは、３つの引数の合計を表示しています。

```js
class Calculate {
  constructor(x, y, z) {
    this.x = x; //xをこのオブジェクトのプロパティーにする
    this.y = y;
    this.z = z;
  }
  Sum() {
    return this.x + this.y + this.z;
  }
}

const result = new Calculate(2, 3, 5); //インスタンス生成
console.log(result.Sum()); //Sumメソッドの返り値を出力
/*出力は10*/
```


#参考URL
[javascriptの足し算の演算は変数を数値型にしてから｜M2NET](https://pinkmonky.net/detail/?id=61)
[【JavaScript入門】すぐわかる！includesメソッドを徹底解説 | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/70491)
[JavaScript - 文字列や数値でオブジェクト型を使う意味｜teratail](https://teratail.com/questions/47502)
[変数と宣言 · JavaScript Primer #jsprimer](https://jsprimer.net/basic/variables/)
[JavaScriptで日時、曜日を取得する方法](https://lab.syncer.jp/Web/JavaScript/Snippet/3/)
[【JavaScript入門】class構文の使い方・書き方が分かるようになる方法！ | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/49551)
centos7 nginx php-fpm mariadb インストール

sshdの設定まで完了しているものとする。

# php 7.4 を インストール

```

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install --enablerepo=remi-php74 php
yum -y install --enablerepo=remi-php74 php-fpm
systemctl start php-fpm
systemctl enable php-fpm

```

これで php7.4 及び php-fpm のインストールが完了。


# nginxをインストール

vim /etc/yum.repos.d/nginx.repo

```

[nginx]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key


```

つづいて、以下のコマンド。

```

yum -y install nginx --enablerepo=nginx
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
sudo firewall-cmd --reload

systemctl restart nginx
systemctl enable nginx

```


vim /etc/nginx/conf.d/default.conf

```

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {
root   /usr/share/nginx/html;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
include        fastcgi_params;
    }


}


```


index.php を作る
vim /usr/share/nginx/html/index.php


```

<?php phpinfo(); ?>


```



これで http://133.000.999.11/ にアクセスしてphp が動くかどうか確認。

動いたら、すべてのライブラリを入れる。

```

yum install --enablerepo=epel,remi,remi-php74 php php-mbstring php-fpm php-pdo php-mysqlnd php-apfd php-bcmath php-bz2 php-calendar php-Core php-ctype php-curl php-date
php-dom php-exif php-fileinfo php-filter php-ftp php-gd php-gettext php-hash php-http php-iconv php-igbinary php-imagick php-intl php-json php-json_post

systemctl restart nginx
systemctl restart php-fpm

```


# mariadb をインストール

```

curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
sudo yum install MariaDB-server MariaDB-client
sudo systemctl enable mariadb


```

# phpmyadmin を インストール

```

yum -y install --enablerepo=remi,remi-php74 phpMyAdmin

chown nginx. /var/lib/php/session
chown nginx. /var/lib/phpMyAdmin/temp

```

vim /etc/nginx/conf.d/default.conf

```

server {
       listen 80;
       server_name localhost;


       #allow 133.233.133.191;#IPアドレスで接続制限
       #deny all;

       location / {
             root /usr/share/phpMyAdmin;
             index index.php;
       }

        location ~ \.php$ {
                fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /usr/share/phpMyAdmin/$fastcgi_script_name;
                include fastcgi_params;
        }
}

```

#maria db の設定

my.cnf の代わりに、以下を変更。
sudo vim /etc/my.cnf.d/server.cnf

```

[mysqld]


character-set-server = utf8mb4

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


```

再起動

```

systemctl restart mariadb.service

mysql
SELECT @@GLOBAL.sql_mode;

```
PHPで使える機械学習ライブラリ「PHP-ML」を試してみた


機械学習とかちょっと興味あるけどPythonの学習から始めなきゃいけないのか…と思っていたら、
PHPでも[PHP-ML](https://php-ml.readthedocs.io/en/latest/)という機械学習用のライブラリが用意されていたので試してみました。


#導入手順

##composerのインストール
まず、[公式サイト](https://getcomposer.org/)よりcomposerをインストールします。

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

##PHP-MLのインストール
```
php composer.phar require php-ai/php-ml
```

##k近傍法を試してみる

「ケイきんぼうほう」って読みます。
機械学習アルゴリズムの中でも簡単なアルゴリズムと言われておりパターン認識でよくつかわれているようです。
似たような名前で***k平均法***というのがありますが、***k平均法は教師なし学習***で***k近傍法は教師あり学習***という違いがあります。

ちなみに、現状機械学習と言ったら教師あり学習の方を指す事が多いようです。教師あり学習では、人間があらかじめ付けた正解のラベルに基づき、機械が学習を行います。
[参考：教師あり学習と教師なし学習](https://avinton.com/blog/2017/11/supervised-and-unsupervised-machine-learning/)


さらに、教師あり学習にも***分類***と***回帰***の２パターンあるようです。
違いは、目標変数が離散値であるか連続値であるかという事のようです。
[参考：回帰と分類の違い](https://qiita.com/kibinag0/items/5b7bcbe6c72b716a8cd9)

##サンプル
```PHP:k近傍法のサンプル
<?php
require_once 'vendor/autoload.php';

use Phpml\Classification\KNearestNeighbors;

$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];

$classifier = new KNearestNeighbors();
$classifier->train($samples, $labels);

echo $classifier->predict([3, 2]);

// [1, 3], [1, 4], [2, 4]にaというラベル、
// [3, 1], [4, 1], [4, 2]にはbというラベルを付けておき、
// [3, 2]というデータがあった場合にどちらのラベルが付くか？というのを分析している。
// この場合はbというラベルが付く。
```




#機械学習で使われるその他アルゴリズム
機械学習でよく使われているアルゴリズムについては以下の記事が分かりやすくまとめられていました。
[機械学習に知るべき10のアルゴリズム](https://qiita.com/Octoparse_Japan/items/674e7dabc47b297f88ec)

#感想
PHP-MLのライブラリをインストールするだけなら5分で終わります。
だけどドキュメントに出てくる用語は知らない言葉ばかりで、検索して調べたらまた知らない用語が出てくるという感じでなので、慣れるにはだいぶ時間がかかりそうです。
とはいえ、手軽に機械学習の学習環境が整うので、まずはPHP-MLで機械学習の全体像をつかんでから、Pythonを学習するのもありかと思いました。
[UE4]Unealfrontendでエディタ立ち上げずにプロジェクトを触る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/b8ad78d6-0e30-ef48-5146-cec380da14a8.png)
UE4/Engine/Binaries/Win64の下にUnrealFrontend.exeがあります。(ソースコードでビルドしている人は、独自にUnrealFrontendをビルドする必要があります。)

こちらを立ち上げると、

- Device Output Log
- Device Manager
- Session Frontend
- Project Launcher

のみのシンプルなアプリケーションが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/29cf2d92-d16c-73c8-71ad-e5cb7d571785.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/e9dc2223-01d4-b36d-11c2-4ce204721588.png)


Project launcherでゲームをビルドしたい、Session Frontendなどでue4statsファイルのプロファイルをみたい、Decvice Output Logで実機のログを確認したい。。けどエディタを起動するほどではない。。。というときに便利です！
Unixtimeから（秒かミリ秒から）momentを作る時の注意点

## momentの作成
[秒から`moment`を作る時に](https://momentjs.com/docs/#/parsing/unix-timestamp/)  
もしくは  
[**ミリ**秒から`moment`を作る時に](https://momentjs.com/docs/#/parsing/unix-timestamp-milliseconds/)  

ドキュメンテーションが書いてある通り、`ローカルモード`で`moment`が作られる。  
つまり、**コードが動いている環境のタイムゾーンで作られる**。

Docker環境が日本時間ではなく、デフォルトのUTC時間になっている可能性があるので注意しないといけない。

```
moment.unix(1519200000)
  .format(dateutils.FORMAT.MYSQL_DATETIME); // ==> "YYYY-MM-DD HH:mm:ss"

// 2018-02-21 08:00:00 になってしまうけども、日本時間だと 17:00:00 が正しい
```

なので、日本時間を期待している時に、`utcOffset`を使わないといけない。  

```
moment.unix(1519200000)
  .utcOffset(config.timezones[config.timezone].hour) // "+09:00"
  .format(dateutils.FORMAT.MYSQL_DATETIME); // "YYYY-MM-DD HH:mm:ss"

// 正しく 2018-02-21 17:00:00 になる
```

### 結論
- ミリ秒だとそのまま渡せる
- 秒だと、`* 1000`して渡すこと

``` typescript
date2moment(VALUE_IN_MILLISECONDS);
date2moment(VALUE_IN_SECONDS * 1000);

type DateLike = Date | number | string | null;

function date2moment(date: DateLike = null): moment.Moment {
    const unixtime = _getUnixtime(date);
    const hour = config.timezones[config.timezone].hour;
    return moment(unixtime).utcOffset(hour);
}

function _getUnixtime(date: DateLike): number {
    if (date === null) {
        return Date.now();
    }
    if (typeof date === "number") {
        return date;
    }
    if (date instanceof Date) {
        return date.getTime();
    }
    if (typeof date === "string") {
        return new Date(date).getTime();
    }

    throw new TypeError(`"${date}" must be a NULL or Number or Date`);
}
```
ボボジョーヌーレー

```Elixir
~w[ボ ジョ レ ヌ ボ]
    |> Enum.shuffle
    |> Enum.with_index
    |> Enum.map(fn {x, i} -> if i>1, do: [x,"ー"], else: x end)
    |> Enum.join
    |> IO.puts 
```

## 元ネタ
[ヌジョレーボーボー](https://qiita.com/mattn/items/ae764601862b0073071e)
ajaxのPOST送信で403が返却される場合の対処方法

- ログイン後、ajaxでPOST送信した時に403が返却される場合、CSRFをリクエストヘッダーに設定すればPOST送信が出来るようになる

```html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
$(function() {
	let token = $("meta[name='_csrf']").attr("content");
	let header = $("meta[name='_csrf_header']").attr("content");
	$(document).ajaxSend(function(e, xhr, options) {
		xhr.setRequestHeader(header, token);
	});
	$(document).off('click', '#hoge').on('click', '#hoge', function() {
		$.ajax({
			type : "post",
			//type : "get",
			url : "api/hoge",
			contentType : "application/json"
		})
		.done( (result) => {
			alert(result.msg);
		})
	})
});
</script>
</head>
<body>
	<input type="button" id="hoge" value="ボタン" />
</body>
<meta th:name="_csrf" th:content="${_csrf.token}"/>
<meta th:name="_csrf_header" th:content="${_csrf.headerName}"/>
</html>

```
connpassのイベント説明に画像をセンター揃えで表示する方法

connpassのイベントページにスポンサーロゴや、登壇者の画像を表示させたい、というときのやり方です。
画像アップロード機能がconpassにはなかったので、今回はimgurを使用しています。

### Imgurに画像をアップロード

connpassに表示させたい、jpg,png,gif形式などの画像をアップロードします。

https://imgur.com/upload?beta

PCの画像のあるディレクトリから、ドラッグ＆ドロップするだけでいいので楽チンです。

#### 参考
詳しくはこちらから。
:page_facing_up:【決定版】Imgurの使い方！アップロード/検索を解説！読み方、削除は？
https://dotapps.jp/articles/rjm48ar4p8kybmfv

### Imgurから画像URLを取得
画像アップロード後の画面にて、

`Get shere links` をクリックします。

<img width="1127" alt="スクリーンショット 2019-11-25 14.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221980/4f924ca9-dd93-33dc-0e7b-0d20a8b51df1.png">

``Shere Link``でURLをコピーします。
<img width="687" alt="スクリーンショット 2019-11-25 15.20.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221980/620489d8-8261-3bc7-7689-3e3bd423a3b8.png">


#### サンプル
こんな感じのURLが取得できます。

`https://imgur.com/71ofK2o`

## マークダウン記法で記述

今回は、**中央揃えで、width400指定で** 表示させたいので、

```markdown
<div align="center">
<img src="https://i.imgur.com/71ofK2o.png" width="400">
</div>
```

のように記述します。

下記をコピーして、必要に応じて調整してお使いください。

```markdown
<div align="center">
<img src="***画像のURL***" width="***サイズ***">
</div>
```

## connpassの「イベントの説明」にコピペ
先ほど整えたマークダウン記法の３行をイベントの説明文にコピペすればOKです。

connpassのマークダウン記法は、詳しくはこちらに説明があります。

:page_facing_up:connpassで使えるMarkdown記法
http://help.connpass.com/organizers/markdown


おしまいっ。


## 参考にしたQiita記事
今回、こちらのQiitaを参考にさせていただきました。
ありがとうございます。

:page_facing_up: markdownでの画像リサイズ
https://qiita.com/shti_f/items/b819d7fd8cb79ae29687

:page_facing_up:markdownで画像を中央寄せ
https://qiita.com/takkii/items/d09668cbf85cbdec7001
リモートリポジトリの新規作成

##　リモートリポジトリの新規作成について

- BitBucketにアクセスし、左上の＋アイコンからリポジトリを選択


- リポジトリ名を記入し、Gitでそのまま作成
　

- 他のユーザーと共有する場合は、右上の・・・からリポジトリを共有するを選択


-メンバーに共有したいユーザーのメールアドレスを入力し、追加を選択
Editor拡張でbuiltするシーンを変える

Scenes in Bultをカスタマイズしたい時、以下のように書く


```csharp

EditorBuildSettings.scenes = new EditorBuildSettingsScene[]{
new EditorBuildSettingsScene("Assets/_Kitasenju/Scenes/VJ.unity", false),//disable
new EditorBuildSettingsScene("Assets/_Kitasenju/Scenes/main.unity", true)//enable
};

```
個人的 Emoji Prefix

😃|内容|メモ
:---:|:---|:---
🌱|最初のコミット|リポジトリ作った！程度のコミット Readme 作成辺りで
✨|機能追加|
⚡|一般的な更新|プロパティの追加/引数変更単位
🐛|バグ修正|システム的な問題修正
✒|誤字修正|typo 動作に支障はないもの？
🔗|修正|API 等の変更によるコード修正
🧹|フォーマット|インデント等
♻️|リファクタリング|
🚀|パフォーマンス|♻️ の中でもパフォーマンス関連の
🎨|UI/UX|
🚧|WIP|
🧪|テスト|
👎|非推奨|
💬|コメント|
🚚|移動|
🗑️|削除|
🌐|ローカライズ|
⚙️|構成|package/tsconfigとか
➕|依存関係の追加|
➖|依存関係の削除|
⬆️|依存パッケージのアップデート|
⬇️|依存パッケージのダウングレード|
📝|ドキュメント|ドキュメントの更新等
🔖|リリース|まるで付ける必要がないけどリリース時のタイトルとかに
🛳️|Pull Request|

随時編集
TECS：変数のsize_is( )指定子

[TECS](https://www.toppers.jp/tecs.html)：「変数の**size_is( )**指定子」でつまずいたので、同じ悩みが生じた方のため書き留めておきます．

# そもそも変数のsize_is( )指定子とは
変数がポインタ型の時に指定できます．そのポインタは引数で示される大きさの配列を指します．
ここで重要となるのは  

* size_is( )指定されたポインタ型の変数は、配列を指す**定数**として扱われ、書換えることはできない
* ポインタの指す先の配列の要素は書き換えることができる
* **初期値の有無に関係なく指定された大きさの領域が確保される**

この３点を押さえましょう．

# 実装例
大きさ32の文字列strを実装する場合、以下のようになります．

    celltype tCelltype {
      attr {
        int name_len;
      };
      var {
        [size_is(len)]
          char *str;
      }; 
    };

    cell tCelltype Cell {
      name_len = 32;
    };

このように属性を利用して、セルごとに大きさを指定できるようにするのが良いと思います．

以下も同じ振る舞いをします．

    celltype tCelltype {
      var {
        char str[32]
      }; 
    };

# 注意点

size_is( )指定子は**「初期値の有無に関係なく指定された大きさの領域が確保される」**ということを思い出し、以下のことに注意しましょう．

    celltype tCelltype {
      attr {
        int len;
      };
      var {
        int *num;
        [size_is(len)]
          int *array;
      }; 
    };

    cell tCelltype Cell {
      len = 32;
    };
上の例において、ポインタを初期化することなく

* numは参照渡しすることはできない
* arrayは参照渡しすることができる

両方できないと勘違いしていましたが、**arrayはsize_is( )指定している時点で領域が確保されている**ので可能です．

※ もちろんnumもどこかの領域を示すように初期化すれば参照渡し可能です

# 参考
[TECSドキュメントーセルタイプ記述](https://tecs-docs.readthedocs.io/ja/latest/tecs/CDLref_celltype.html#id14)
WSL(Ubuntu)にssh、MySQL、PHP、Apache2 を入れるまで。

# WSL(Ubuntu)にssh、MySQL、PHP、Apache2 を入れるまで。

## WSL の Ubuntu をインストールする。

```
省略
```

## 初期設定。

```
// rootのパスワードを設定
$ sudo passwd root

# su -

// 日本語化
# apt install -y language-pack-ja manpages-ja manpages-ja-dev
# update-locale LANG=ja_JP.UTF8

// リポジトリ一覧の更新と、パッケージの更新。
# apt update
# apt upgrade -y

※ 途中、以下の「サービス再起動」に関して聞かれるので Yes で進む。
　Restart services during package upgrades without asking?   

// 終わったら再起動する。Windows を再起動するか、
// 管理者で Windowsコマンドプロンプト を開いて以下を実行してサービスを再起動する。
net stop LxssManager
net start LxssManager
```

## WSLのプロンプトが見にくいので、tera term が使えるようにする。
```
# cd /etc/ssh
# vi sshd_config

PasswordAuthentication yes

※ この時、配色の関係で vi の画面が非常に見えにくい場合は以下を実行して色を無くす。
:syntax off

// ssh に必要なキーを作成するらしい。
# ssh-keygen -A
# service ssh start

// ここから tera term で繋ぐ。
```

## MySQL を入れる。

```
// mysql が入っているかを確認。
# dpkg -l | grep mysql

// インストール(mysql-server-5.7 が入った)
# apt install mysql-server

// ↓で確認したら、mysql-client は一緒に入ってた。
# dpkg -l | grep mysql

// 起動して、とりあえず入れるところまで確認。
# service mysql start
# mysql
```

## WindowsのCドライブは容量をあまり使いたくないのでデータディレクトリを D ドライブに移す。

```
// いったんプロセスを落とす。
# service mysql stop

// D ドライブを drvfs でマウントしなおす。これをしないと、chmod や chown が効かなかった。
# umount /mnt/d
# mount -t drvfs D: /mnt/d -o metadata

// my.cnf はあまり触りたくなかったのでデータディレクトリを移動して、シンボリックリンクを設定する。
# mv /var/lib/mysql /mnt/d/mysql/
# ln -s /mnt/d/mysql /var/lib/mysql

# service mysql start
```

## php を入れる。

```
# apt install php

// ↑ だけで、apache2 も libapache2-mod-php も入ってきた。

# service apache2 start

// 動くか確認。
# cd /var/www/html
# echo '<?php phpinfo();' > index.php

// http://localhost/index.php で、Server API が "Apache 2.0 Handler" になっていることを確認。
```
sshpass+ssh-copy-idで公開鍵をインストールする方法

## sshpassとは
[sshpass\(1\) \- Linux man page](https://linux.die.net/man/1/sshpass)
`noninteractive ssh password provider`

プロンプトを使用せずにCLIにパスワードを渡してSSHすることができる方法である。
連続してパスワード認証したいとき等に便利である。
※ そもそも、そのような状態には出くわしたくないが（鍵認証onlyなどの対策）、状況によっては大量のサーバへ接続するなどのときに便利なときもある。

### [macOS に Homebrew で sshpass をインストールする \- Qiita](https://qiita.com/bezeklik/items/30b56fa13f651620591d)
Macでsshpassいれる際はこちらの対応が参考になった。
他参考：[Installing SSHPass](https://gist.github.com/arunoda/7790979)

事前準備。
homebrewで最新をいれたいときには参考になる。
とりあえずお試しで入れるには以下で十分。

```
brew install http://git.io/sshpass.rb
brew install sshpass
```

sshpassを使うことができるようになる。

### ssh-copy-id
公開鍵を登録して認証するとパスワードなしでSSH可能な状態を作ることができる。
そこで、sshの公開鍵鍵認証登録に便利なのが `ssh-copy-id`
[ssh\-copy\-id\(1\) \- Linux man page](https://linux.die.net/man/1/ssh-copy-id)

```:ssh-copy-id
% ssh-copy-id -i ~/.ssh/id.pub hoge.example
/usr/local/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/hoge/.ssh/id.pub"
/usr/local/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/local/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
hoge@hoge.example's password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'hoge.example'"
and check to make sure that only the key(s) you wanted were added.
```

この鍵を登録する際にパスワード認証が上記のように必要だが、一度入力するとその後は
`ssh hoge.example` のときに手元の秘密鍵を使えばパスワードなしで接続が可能になる。

なお、ここで紹介した認証に必要な鍵は `ssh-keygen` で作成済みとする。
参考：[お前らのSSH Keysの作り方は間違っている \- Qiita](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)

### sshpass + ssh-copy-id
上記のパターンで事前に公開鍵登録ができていないサーバが複数台あったとする。
そのときにパスワード入力を仕方なく入力するときに `sshpass` と連携すると便利というのが本題。

```:ssh-pass+ssh-coyp-id
sshpass -f passwd ssh-copy-id -i ~/.ssh/id.pub -o "StrictHostKeyChecking no" hoge.example
```

このとき、 (yes/no)を聞かれる定番の対策に `-o "StrictHostKeyChecking no"` を使っている。
`-f passwd` はpasswdファイルというものを用意してパスワードを記載している場合。変数や直接入力も可能。

これで、対象のホストが複数あるときはwhileなりfor文なりでワンライナーでリストや対象ホストの連番へアクセスしてssh-copy-idを連続して登録ということができる。
Arduinoで位置測位をやってみる

# 概要
　学生のころに、みちびきの位置補正に対応したGNSSモジュールの位置情報、位置補正の機能を切ったGNSSモジュールの位置情報、iPhoneの位置情報の３つの誤差を比較する実験をしました。
本記事は、ArduinoとGNSS対応のモジュールを使った位置情報の取得方法とNMEAの読み方についてだけでもまとめておきます。
　GNSSについてはGPSやGLONASSなどの衛星測位システムの総称です。
詳しくは以下の記事にまとめています。
[GNSS・衛星測位システムの簡単な説明と現状のまとめ](https://qiita.com/messyu4/private/e5e1f070657095532311)

# 使用機器
- Arduino Uno
- [ＧＰＳ受信機キット １ＰＰＳ出力付き 「みちびき」３機受信対応](http://akizukidenshi.com/catalog/g/gK-09991/)


# 回路図
回路図は秋月電子の方で公開されています。
そちらをご覧ください。
[取扱説明書](http://akizukidenshi.com/download/ds/akizuki/AE-GPS_manual_r1.06_s.pdf)

# ソースコード
ARDUINO WEB EDITORでソースコードを公開できるようです。
そちらをご覧ください。
https://create.arduino.cc/editor/messyu4/71802018-0ca3-448e-b4b3-de3c0afc02e8/preview


# 出力結果
　Arduinoのコンソールでは、以下のようなNMEAフォーマットで出力されます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181903/9306c074-e702-77a2-1026-dd96cac38adc.png)
※一応、自分の活動範囲が特定されてくないので、時間と緯度経度情報を隠してます。

NMEAの読み方は以下のサイトを参考下さい。
https://www.hiramine.com/physicalcomputing/general/gps_nmeaformat.html

# まとめ
　今回はArduinoとモジュールを使って単純にNMEAを出力しました。
今回はやりませんでしたが、TinyGPSライブラリを使うとNMEAから日時と緯度経度など簡単に取り出せます。
Googleがメイン？で使ってるという、AngularDartでJSアプリ作ってみた

有名なGoogle製フレームワークAngular。
https://angular.jp

そのAngularから最近別れたDart版フレームワークAngularDart
https://angulardart.dev

こっちでDart使ったので、
https://qiita.com/mharadazz/items/6fa0604789041b2a3509

以下のアプリの一部をwebViewで実現して、工数削減しようとして使ってみた。２つ作るのはめんどいからね。
https://play.google.com/store/apps/details?id=jp.co.projapan.solitaire
https://apps.apple.com/jp/app/ソリティアv/id341532096

##はじめに

[AngularDart開発の最低限の基本](https://qiita.com/mharadazz/items/7d54c1fd8fb91911ead5)

##良かった点

- ビルドが速い。5秒以外。ビルドが速いのは正義。
- Dartいい。StageXLアプリでも使ったけど、いい。
- 既存タグ内にif文書けるので、タグが深くならない。
- そんなに難しいことがないのでとっつきやすい。
- htmlテンプレート内でも補完してくれる。無い変数参照すると、警告出してくれる。素敵。
- webでマテリアルデザインを作れるマテリアル部品も付いてる。

##悪かった点

- 時々ビルドできなくなる。Dartバージョンアップしたり、フレームワークバージョン変えたり、色々変えて回避する。.dart_tool/buildを消すのも有効:joy:
- 時々謎の呪文を書かないといけない。

```
import 'products/root_component.template.dart' as root_temp;
```
そんなソース無いがね・・・。謎ルールが色々あり、componentのファイル名が大文字だったら無いとか言い出す:joy:諦めて謎ルールに従うといける。

- 謎のキーワードng。まあaNGularのNGなんだろう。
- 情報少なーい。突っ込んだ情報はほんとにない。ハマると辛い:cold_sweat:

全体的に生産性高い。いい。素敵:heart_eyes:
MFC（VC++）で配列を扱うなら、どれ🤔

# 前提

- MFCでWin32 デスクトップアプリケーションを作成している
- Visual Studio 2017で、ツールセットはv141を使用している（C++14までサポートされているかな？たしか。）

# 記事の動機
コードレビューをしていると、チーム内でのコーディングにバラツキを感じることがありますよね。つかっている言語によるところが大きいとおもっているのですが、C++はとくに大きいと感じます。


# 配列の扱い方

おおきくわけるとこの3つから選択することになります。

1. `[ ]`で頑張る
2. MFCだから`CArray`
3. STLが使える状況なら`std::vector`

今回は、**構造体の配列を管理し、特定の条件にマッチする要素を取り出す**を例にしてみます。

## 1. `[ ]`で頑張る

```cpp
// DATA
struct Item
{
  int nId;
  int nPrice;
};


// 1. 
const Item items[] = {
  { 0, 100 },
  { 1, 1000 },
  { 2, 10000 },
};

int GetPriceById(int id) {
  const int max = sizeof(items)/sizeof(struct Item);
  for (int i=0; i<max; i++) {
    if( items[i].nId == id ){
      return items[i].nPrice;
    }
  }
  return -1;
}
```


## 2. MFCだから`CArray`

10年やっても書き馴染まないのでサンプル書けない :+1:

## 3. STLが使える状況なら`std::vector`

```cpp
// 3.  
#include <vector>
#include <algorithm>
const std::vector<Item> items {
  { 0, 100 },
  { 1, 1000 },
  { 2, 10000 },
};

int GetPriceById(int id) {
  auto it = std::find_if(items.begin(), items.end(), [](const Item& item) {
    return item.nId == id;
  });
  return ( it == items.end() )? -1 : it->nPrice;
}
```

# 個人的にstd::vectorを推していきたい

- サイズを意識したくない
- 多くの、便利で、よくテストされた、ライブラリが使用できる（<[algorithm](https://en.cppreference.com/w/cpp/header/algorithm)>）
- 動的配列もラクに実装できるし、`const`すれば静的配列としても扱えるしラク。
- 記述を少なくループを回せてラク。`for (auto item : items)` 

とにかくラク。これに尽きます。

# 生配列は「使わざるを得ない」場合だけ

DLLとのインターフェース部分とか、STLを使ってはいけない環境のときだけ仕方なく使います。


# おわりに
素朴なC++の構文はレゴブロックの1ピースのようなもので、「組み方ひとつでいかようにも」と同時に、「労多く実り少ない」という一面もあるので実装スピードや後々のコードを読む時間を考えるとSTLのようなライブラリを活用して型安全でリーダブルなコードを増やしていくのがよいのではないかと考えています。というポエムでこの記事を終わります。
Laravelのモデル名を変更した際のエラーを解決する

# 問題の背景
プロジェクト下のapp/Posts.phpというモデル名をPost.phpに変更したい

## 変更に伴い直面したエラー
単純にファイル名をPost.phpに変更したら

```
include(/Applications/MAMP/htdocs/laravel/stepc/vendor/composer/../../app/Post.php): failed to open stream: No such file or directory
```

<img width="1440" alt="スクリーンショット 2019-11-25 14.24.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223280/d6c3424c-7bd5-0a9a-7b87-a2c8d0a6fb32.png">
というエラーがでた。

##解決方法
ターミナルで

```
composer update
```
で解決！
Golangで「特定のpackage以外の全てのpackageに対してtest」を行う方法

TL;DR
-----

```bash
go test `go list ./... | grep -v 除外したいパッケージへのpath`
```

解説
-----

`go test` の後ろにはテストしたいパッケージ名を書いていく。(全実行したい場合は `go test ./...`)

```bash

go test internal/hoge internal/fuga
```

go list を実行すると次のようにパッケージのリストを出力してくれるので

```
github.com/seya/test/server/internal/hoge
github.com/seya/test/server/internal/fuga
```

除外して欲しいものをgrepで除外して渡してあげればok
TypeScript 共有型の配列の型推論


TypeScript v3.6.3
では改善されている模様です。

こちらに記述がなかったと思ったので
https://qiita.com/uhyo/items/6acb7f4ee73287d5dac0


共有型（パイプ｜で区切った指定した型のいずれかに一致する値の変数を代入できる型）
の配列の要素を取り出したとき型推論がうまくいかない。

なんらかの変数に一旦代入しておかないといけない。

```TypeScript
export type hoge = FOO | BAR;

export typo FOO ={
  kind :"FOO";
  sawa : stinrg;
}
export type BAR={
   kind: "BAR";
   erika:string;
}

//NG
if (hoge[0].kind==='FOO' as const)
{
}
//OK
const homare = hoge[0]
if (homare.kind==='FOO' as const)
  
}

```
adb - Android debug tool

# Enable Device Debug
* Enable developer mode on your Android device
 1. Settings ⇒ System ⇒ About Phone ⇒ Tap "Build number" over 7 times and quickly
 2. Then you will see "You are already developer"
* Enable debugging
 1. Go to "Developer Options" ⇒ Enable "ADB debugging"
 2. Connect Android phone to your Windows PC, then you will see a pop-up ( some phone will not show pop-up, please check notification center)
 3. Choose "Transfer files"

# adb Setup
## Windows
* Download adb package for windows. https://developer.android.com/studio/releases/platform-tools.html
* Unzip the package, then put it to any path

```text
    cd C:\{adb folder path}
```


## Mac
* Download adb package for mac. https://developer.android.com/studio/releases/platform-tools.html
* Install adb
* Open terminal


## Check installation success
* Type

```terminal
    adb
```

* If you can see below message, means adb is able to use

```terminal
    Android Debug Bridge version 1.0.40
    Version 4986621
    Installed as C:\{adb folder path}\adb\adb.exe

    global options:
     -a         listen on all network interfaces, not just localhost
     -d         use USB device (error if multiple devices connected)
     -e         use TCP/IP device (error if multiple TCP/IP devices available)
     -s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)
     -t ID      use device with given transport id
     -H         name of adb server host [default=localhost]
     -P         port of adb server [default=5037]
     -L SOCKET  listen on given socket for adb server [default=tcp:localhost:5037]
```


# adb command
* Connect your Android phone to PC/MAC, then type

```terminal
    adb devices
```

 If you see below message, means your Android phone already connected to PC, and able to use adb command

```terminal
    List of devices attached
    35PDU18712000000        device
```

* Send text to device

```terminal
    adb shell input text "textttt"
```
* Send key to device.
  You can use key name or key code. eg: TAB(61), HOME(3), ENTER(66)
  https://developer.android.com/reference/android/view/KeyEvent

```terminal
    adb shell input keyevent TAB
    adb shell input keyevent 61
```

* Log ( logcat) https://developer.android.com/studio/command-line/logcat
エンジニア交流会の運営ノウハウ

こんちは、[@norinux]((https://twitter.com/norinux)) です。

エンジニア交流会っていう、毎回様々なテーマでエンジニアのみんなで知見を共有しようっていうイベントを毎月開催している。最初に開催したのが 2016年12月ってことはもうすぐ三周年になると思うと感慨深い。（三周年記念イベントとかやらないよw）

ちなみに、運営してるのは、これ
[Gaiax Technical Meetups](https://gaiax.connpass.com/) 

3年も継続して、溜まったノウハウを簡単にシェアしておく。

## テーマの企画方法
Flutter Meetup とか、特定の技術をテーマにしたコミュニティだとテーマの企画とか考えなくてもいいのだけども、僕たちは毎月違うテーマでやってるので毎回企画が必要だ。
企画するためにやってることはこんな感じ

1. 年末に年間計画を立てて、とりあえず適当にざっくり12コマ分のテーマを埋めておく
2. 開催日が近づいてきたら、年間計画から「まじこれやる？」って話しはじめる
3. 最近気になってる技術とか課題とかいろいろ、話題にだしてテーマ発散させる
4. そこから「このテーマなら参加したいわ」ってキーワードを探して決める
5. そのキーワードを元に、タイトル案を10個くらい出して「参加したくなる」やつを選ぶ
6. そのタイトルに合わせて、具体的にどういったテーマのイベントなのかの説明文を作る

普段は、開催の1.5ヶ月前くらいから考え始めて2週間くらいかけて決定する。
けど、なかなか良いテーマが見つからないときは、無理せず開催日を後ろ倒しして良いテーマが定まるまでがんばる。毎回大変だけど、僕は楽しい。

## 登壇者のアサイン方法
交流会といえど、テーマについていろいろ活動してる人を見つけてトークしてもらうようにしてる。結構大変だけど、やっぱり「こういう人の話が聞きたいわ」って思う人に登壇してほしいからがんばれる。
登壇者をアサインするときはこんな感じ

1. 社内外問わず、テーマでなんかやってそうな人をピックアップする
2. イベントのタイトルとテーマの説明文を送って、登壇できないか相談する
3. OKをもらったら、空いてる日程をいくつかもらう
4. 「登壇OK」「日程OK」が3人くらい揃ったら、開催日を確定
5. 登壇依頼した人に、トークタイトルと登壇者紹介文をもらう

イベントのタイトルがなかなか決まらなくて、テーマ案だけで登壇者をアサインすることもよくある。
あと、知り合いじゃないけどどうしても◯◯さんの話が聞きたいって時は、SNSなどでDM送ってみたりもする。登壇してくれる人には、本当に感謝しかない。

## Connpassの記載内容
Connpass 大好き。イベント運営に必要な機能があらかた備わってて、無料で提供してもらえる。いつか機会があれば、中の人に感謝の気持ちを伝えたい。「いつも、ありがとうございます！」
Connpass にたくさんイベント内容を書いてきたので、これもだいたいの型ができてきた。

1. テーマについての説明
2. どんなエンジニアが参加すると楽しめるか
3. 交流会なので、メインは懇親会であることをアピール
4. 登壇者のタイトルと登壇者のプロフィール紹介
5. タイムテーブル
6. 参加者に協力して欲しいこと
7. 注意事項

「エンジニア同士で、学び合ったり意見交換したり、交流したりしたいんよ」っていうのが伝わればいいなぁ、って思いながらいつも作ってる。ちなみに、注意事項に [行動規範](https://ja.confcodeofconduct.com/) (Conference Code of Conduct) を入れておくのがミソ。

## 飲食物の手配
食べ物は参加者全員の腹を満たすためではなく、交流するためのおつまみなのでちょっと足りないくらいがベター。（むしろ余ってフードロスする方が気持ち的に辛い）
毎回、参加者は40人前後くらいなので、このくらい準備しておけば大丈夫。

- 食べ物
    - ケータリングで、6名目安のおかず x 3種類 x 2皿 
- 飲み物
    - ビール2ケース
    - チューハイ2ケース
    - ソフトドリンク2種類 各3ボトル

普段食べ物は、[みどりえ](https://m-delivery.jp)さんを使ってる。飲み物は定番の[カクヤス](https://www.kakuyasu.co.jp/)。何十回も注文してるから、超最適化した。20minもあれば注文完了できる。

## イベント当日の分担
イベントの本番は、なんだかんだいって役割分担が必要。いろんな分担方法を試してみた結果、最低4人いれば最低限の運営はできるかなという感じ。常時4人体制だと、体調不良とかで一人抜けた時に破綻するので5人体制にしてる。（多い方が助けるけどw）

- 分担
    - 受付
    - 司会
    - 飲食物のサーブ
    - SNS（Twitter）
    - リベロ

リベロは、混み合ってたりトラブってたりしてるところにヘルプに入る。大抵は、受付手伝ってから、イベント中はtweetしながら場を盛り上げて、飲食物を準備する感じ。要は全部ちょっとずつ手伝う。アクティブスタンバイで冗長化。

## イベントのクローズのしかた
イベントが盛り上がれば、多くの人が交流会に参加してくれるし、遅くまで残ってくれる。とても嬉しいことなんだけど、会場の都合上、時間になると追い出さなきゃいけない。アナウンスするとか、声かけするとか、いろいろ試したけど、みんな楽しそうに話し込んでいるので簡単じゃない。
そこで辿りついた手段としては、、

- 会場の片付けを始めてしまう
- 「片付けたいから荷物は手元に持って」とアナウンスする

そうすると、エンジニアの勉強会とか交流会慣れしてる人ほど、運営が大変なことを知ってるので、ボランタリ精神ですごく手伝ってくれる。これもまじ感謝。
あ、注意しなきゃいけないのは、名札を下げてもらうためのストラップを持って帰っちゃう人が多いこと！最近ストラップの本数減ってきて困ってるから、回収がんばるw

以上、エンジニア交流会の運営ノウハウでした！