OmniAICreator/Qiita-1.07M huggingface dataset:
Promise.all と mapで重い並列処理を実装する

## 状況
firebaseなどからデータが多数入っている配列をとってきたとき、
それらの配列の要素一つ一つに重い処理を非同期でやっていきたい

## 解決策
```sample.ts
const data = await db.collection('test').get()
//data一つ一つに対して、重い処理をしていきたい
const promises = data.map(async (item) => {
  await sampleFunction1(item)
  await sampleFunction2(item)
}
Promise.all(promises)

```

配列`data` をmapを用いて、一つ一つの要素に処理をしていく。
そんで、それら処理したやつを`promises(type of array)` に代入。
`promises`には、処理済みの配列`data`が入っている。

それらの配列を `Promise.all`で並列処理したらok

### その他
配列の処理には、

```
for (const item of data ) {}
```
```
data.forEach((item) => {})
```
など`for`文を使う手法もあるが、
中で、`await` を使うような重い処理を使う場合は、処理済み配列を代入できる`map`と`Promise.all`を使った方が断然楽。
Flutter + Firebase (FCM) でiOSのPush通知の実装

Flutter + FCM (Firebase Cloud Messaging) でiOSのpush通知を実装したのでその際のメモ。

## 参考にしたドキュメント
基本はFlutterのFCMプラグインのドキュメント通りに進めればできる。
https://firebaseopensource.com/projects/firebaseextended/flutterfire/packages/firebase_messaging/readme/

Githubにexampleもある。
https://github.com/FirebaseExtended/flutterfire/tree/master/packages/firebase_messaging/example

こちらのDevelopers.IOの記事には具体的な実装例が書いてあって、参考になった。
https://dev.classmethod.jp/articles/flutter_fcm_push1/

## デバッグ

自分の場合はドキュメント通りに進めても何故かPush通知が成功せず。。。
デバッグの仕方もわからず途方に暮れていたが、こちらのGoogle Developersのブログ「 [iOS で Firebase Cloud Messaging をデバッグする](https://developers-jp.googleblog.com/2017/02/debugging-firebase-cloud-messaging-on.html)」 が助けになった。

特に以下の2点によってデバッグが効率的に進んだ。
① 以下のコードをAppDelegate.mに追加してdeviceToken（FCM Tokenとは別物）を取得すること

```swift
func application(_ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  var readableToken: String = ""
  for i in 0..<deviceToken.count {
    readableToken += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
  }
  print("Received an APNs device token: \(readableToken)")
}
```

② FCMを通さずに、①のdeviceTokenを用いて直接curlでAPNを叩くステップを挟むこと

```bash
> curl --http2 --cert ./証明書.pem \
-H "apns-topic: com.example.yourapp.bundleID" \
-d '{"aps":{"alert":"Hello from APNs!","sound":"default"}}' \
https://api.development.push.apple.com/3/device/デバイスID
```

## 補足

自分の場合はなぜかiPhoneを再起動しないとdeviceTokenが得られなかったので、同じように詰まっている人がいたら試してみてください。
ググるは【力】！コーディングで困った時に役立つGoogleChromeのオススメ拡張機能

コーディングしていてわからないことはGoogle先生にお尋ねすることになりますよね  
ただ、知りたい情報に早くいきつきたいものです  
そんな時に使っているChromeの拡張機能まとめました

# google検索

## [AdBlock — 最高峰の広告ブロッカー](https://chrome.google.com/webstore/detail/adblock-%E2%80%94-best-ad-blocker/gighmmpiobklfepjocnamgkkbiglidom)  
その名の通り、広告をブロックしてくれる拡張機能  
情報に集中できるのはありがたいのですが、デメリットも  
「あれ？ページ真っ白！」  
「表示されないぞ？」  
「なんか文字だけが表示されてる、CSS効いてない？」  
こんなときはオフにしてみよう！  
ちゃんと表示されないときはこの子が原因のときがよくある  
（わたしは結構時間をむだにしました(。-ω-)z）  
  
## [SearchPreview](https://chrome.google.com/webstore/detail/searchpreview/hcjdanpjacpeeppdjkppebobilhaglfo)  
google検索結果に画像でプレビューを表示してくれます  
雰囲気は画像がやはり把握しやすい  
  
## [AutoPagerize](https://chrome.google.com/webstore/detail/autopagerize/igiofjhpmpihnifddepnpngfjhkfenbp)  
たまにあるページを分割しているサイト  
1 2 3 次のページ  
これめんどくさいので、自動で一枚のページのように表示してくれます  
Google検索結果も読み込んでくれます  
サイトの設定もできて便利

# コーディングお助け拡張機能

## [Awesome Screenshot: キャプチャーと注釈](https://chrome.google.com/webstore/detail/awesome-screenshot-screen/nlipoenfbbikpbjkfpfillcgkoblgpmj)  
ブラウザに表示されているページをキャプチャできる  
ページ全体もできるし、選択範囲を指定できたり編集機能もある  
メモにも使えるし、サイトの素材としても使えるしgood
  
## [Image Downloader](https://chrome.google.com/webstore/detail/image-downloader/cnpniohnfphhjihaiiggeabnkjhpaldj)  
もう一つ画像関係  
ページに表示されている画像を一括でダウンロードできる  
サイトを模写する時にお世話になります  
注意：CSSでbackground-imageのように設定している画像はとれないみたい  
HTMLのimgタグの画像のみ  
  
## [ColorPick Eyedropper](https://chrome.google.com/webstore/detail/colorpick-eyedropper/ohcpnigalekghcmgcdcenkpelffpdolg)  
ブラウザの色を16進数やRGBでとることができる
これも模写でお世話になります  
  
## [CSSViewer](https://chrome.google.com/webstore/detail/cssviewer/ggfgijbpiheegefliciemofobhmofgce)  
これいれてたのにつかってなかった！忘れていた  
選択したHTMLタグにどんなCSSが当たっているのか表示してくれる  
ディベロッパーツールでも確認できるけど、それよりも手軽にできる  
この記事書く時に、「こんなのいれてたのか！」って。書いてよかった(*˘︶˘*)  
  
## [Page Ruler Redux](https://chrome.google.com/webstore/detail/page-ruler-redux/giejhjebcalaheckengmchjekofhhmal)  
選択ツールで要素の幅をはかれます
これも模写で活躍  
  
## [WhatRuns](https://chrome.google.com/webstore/detail/whatruns/cmkdbmfndkfgebldhnkbfhlneefdaaip?hl=en-US)  
サイトで使用しているサービスやツールをみることができます  
同じブラウザで見てるのに違う技術っていっぱいあるんだなと感心した記憶が  
プロジェクト始める前の参考によいです　　

# まとめ
詰まることが多い独学プログラミングは必然とググる回数も増えていきます  
ググる力を身につけるのはもちろん大事ですがスピードを早めることも同じくらい大事です  
頑張っていきましょう！
Linux mintインストール手順

#linux mintを入れるやり方

今回、古いPCの動作が遅く使い勝手が悪いので動作速度の向上と、
Linuxの学習、PCシステムの勉強がてら、Linuxディストリビューションの一つである
Linux mintを入れてみました。



###スペック

- ASUS U32U 
- CPU：AMD デュアルコア E-450 APU
- メモリ：4GB
- ストレージ：500GB
- OS：Windows 7

###手順

####ディストリビューションのインストール

まずはLinux Mintのインストールファイルのダウンロード

ダウンロードは

[Linux Mint イメージファイル](http://www.linuxmint.com/download.php )

から取得する

####ダウンロードしたファイルをUSBメモリに書き込む

Linux Mintをダウンロードしたら、次にインストール用のUSBメモリを作成


専用のソフトウェアを使って書き込む必要があるので

 「balenaEtcher」というソフトを使用


flash from fileでLinux Mintのファイルを選択し、USBを繋いでいる場合、select targetにはデフォルトでUSBが選択されているので、flashボタンを押して実行

数分後イメージファイルの書き込みが完了。



####ノートパソコンにUSBメモリを挿してLinux Mintを起動する


PCにUSBメモリを挿し、BIOS設定画面起動。

 
BIOS設定画面はPC起動直後にF2またはF12を押せば起動できる。（PCによって違う）


 

BIOS設定画面起動後BIOSの起動順位を変更。

最初にHDを読み込む設定になっているのでUSBの優先順位をあげる。

 保存してパソコンを再起動。

USBが読み込まれ、Linux Mintが起動する。


####Linux Mintをインストール

Linux Mintが起動するとメニューが表示されるので「Start Linux Mint」を選択。

 
次に「Install Linux Mint」を選択。

インストーラが起動するので、指示通りに進める。

 

 

インストールが終了したらPCを再起動する。

画面に書いてある通りに、USBを抜いてエンターキーを押下。

これでLinux Mintインストールが完了。


####インストール後にすること

```sh:
# パッケージのアップデート
sudo apt update
sudo apt upgrade
```
Linux『/dev/sda にインストール』エラー解決


####インストール時に起きたエラー
```sh:
GRUB を/dev/sda にインストールできません。
'grub-install /dev/sda' の実行に失敗しました。
これは致命的なエラーです。
```

のエラーが出て、再起動時にOSが起動されない現象が起こる

####解決策

インストール時にインストールの種類選択時、
それ以外（自分でパーティションの作成・・・）
を選択し、

ブートローダーをインストールするデバイスを
/dev/sda

に変更し、インストールを実行するとエラーなく終了する

####原因

そもそもGRUBとは

- GRUBとは、コンピュータの起動時に最初に読み込まれ、ストレージなどからオペレーティングシステム（OS）を読み込んで起動するブートローダの一つ。GNUプロジェクトが開発・公開しているオープンソースソフトウェアで、よくLinuxと組み合わせて用いられる。
要するに、OSを起動するために必要なプログラムの１つ


/dev/sdaは最初に見つかったハードディスクのこと

自分の場合はブートローダーのインストール先をハードディスクにできておらず、ブートUSBを抜いた状態で再起動時するためOSの起動が出来なかった。
API設計に関するまとめ

# 概要
API設計初心者ですので、いろいろ調べて見る。自分用まとめ。

# 用語
LSUDs = Large Set of Unknown Developers(不特定多数のユーザーに提供するAPI)
SSKDs = Small Set of Unknown Developers(特定のシステムのみで利用する専用のAPI)
HATEOS = Hypermedia As The Engine Of Application State(リソース同士に関連性のあるAPIのこと)

# APIリクエスト(POST/PUT)のcontent-type
## application/x-www-form-urlencoded
body部分にkey-value形式で送信したいデータを格納する。
## application/json(より主流)
body部分にJSON形式で送信したいデータを格納する。

# APIレスポンスのcontent-typeとフォーマット

## application/json(JSON-RPC)
[参考](https://qiita.com/laqiiz/items/483b9eea2e663222e8fb)
## application/hal+json(HAL)
[参考](https://qiita.com/tkawa/items/2841e155e5b51c09ed40#hal)
## application/vnd.api+json(JSON API)
[参考](https://qiita.com/tkawa/items/2841e155e5b51c09ed40#json-api)
## application/vnd.collection+json(Collection JSON)
[参考](https://qiita.com/tkawa/items/2841e155e5b51c09ed40#collectionjson)





# 参考

[REST API のコツ](https://www.slideshare.net/pospome/rest-api-57207424)
[Web APIにはJSONベースのフォーマットを使おう](https://qiita.com/tkawa/items/2841e155e5b51c09ed40)
VSCodeでtsconfig.jsonのbaseUrlを設定しても補完が効かない場合に試すこと


これはtsconfig.jsonに限らず、jsconfig.jsonにでも同様のことが言えると思います。

TypeScriptでコーディングをしている時、 以下のようなimport文を書いたことはないだろうか

```ts:ドット地獄.ts
import { Button } from '../../../components/atoms/Button
```

すなわちドット地獄である。
これを以下のようにプロジェクトのルートからimportしたい。

```ts
import { Button } from 'components/atoms/Button'
```

## tsconfig.jsonを設定

tsconfig.jsonのcompilerOptions.baseUrlを設定すれば良い。
また、tsconfig.jsonはプロジェクトルートに配置されていること。

```json:tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "."
  }
}
```

## 設定してもVSCodeの補完が効かない場合に試すこと

- **VSCodeを再起動する**

tsconfig.jsonの設定を変更したぞ、これで補完が効いて快適なコーディングができ...ない!?
設定方法を調べてみたものの、tsconfig.json設定すれば補完が効くと記載されていた。
とりあえず再起動を試したみたら補完が効くようになった。

VSCode側では、起動時にtsconfigを読み込んだパス解決設定が行われるようです。
カスタムシェルコマンドの作り方

# カスタムコマンド用ディレクトリを作成
```
mkdir ~/custom_command
```
# .zshrcを編集してPATHを通す
```
export PATH=$HOME/custom_command:$PATH
```
# シェルの設定を反映
```
source ~/.zshrc
```
# コマンドを作る
拡張子は必要ない。

```
touch test1
```

# ファイルに実行権限を与える
```
chmod 700 test1
```

# お好きなシェルスクリプトを書く


```:test1
#!/bin/sh

if [ $# = 0 ]; then
	echo "君、引数設定したの？"
	exit 1
elif [ $# != 1 ]; then
	echo "ごめん、引数1個で頼む！"
	exit 1
fi

if [ "$1" = 'hoge' ]; then
	echo "hogeなtest1だよ！"
elif [ "$1" = 'fuga' ]; then
	echo "fugaなtest1だよ！"
elif [ "$1" ]; then
	echo "そんな引数は許さないよ！"
	exit 1
fi
```

# あとはどこからでもファイル名を叩くだけ！
ESP32とwioLTE間でuart通信

# はじめに
ESP32とwioLTE間でuart通信で文字列のやりとりをしてみました。
結構、長時間はまってしまったので書き記します。

# 配線
配線は下記の通りです。
wioLTEからはuartポートからGroveピンから配線を引っ張ってきます。
ポイントは下記の通りです。

- Tx-Rxをクロスさせること。
- ESP側はSerial0番ではなく、Serial2番をつかうこと（Serial1番でも可）。今回は、Serial2番を使っています(Rx:16、Tx:17)。他のマイコンとuart通信をする際はマイコン上に表記されているSerial0番は使うことを避けた方が無難です。パソコンとつなげたときに、そこの信号の流れと競合するようです（説明があっているかどうかは自信がありません）。

<img width="843" alt="circuit.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212276/f3c99253-01e8-1e1c-d38f-67b34f451019.png">



# プログラム
## ESP32側

```c++
#define RXD2 16
#define TXD2 17

void setup() {
  // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200);
  //Serial1.begin(9600, SERIAL_8N1, RXD2, TXD2);
  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Serial Txd is on pin: "+String(TX));
  Serial.println("Serial Rxd is on pin: "+String(RX));
}

void loop() { 
  while (Serial2.available()) {
    Serial.print(char(Serial2.read()));
  }
}

```

## wioLTE

```c++

#include <WioLTEforArduino.h>
WioLTE Wio;
#define GroveUARTPort Serial
#define CONSOLE SerialUSB

void setup() {
  Wio.Init();
  Wio.PowerSupplyGrove(true);
  CONSOLE.begin(115200);
  GroveUARTPort.begin(115200);
  delay(1000);
  CONSOLE.println("rate = 115200)");
}

void loop() {
//受信
//  while (GroveUARTPort.available()) {
//    String recv_str = GroveUARTPort.readStringUntil('\n');
//    CONSOLE.print("Recv: ");
//    CONSOLE.println(recv_str);
//  }
//送信
  String sendstr = "esp32";
  for (int i = 0; i < sendstr.length(); i++){
    GroveUARTPort.write(sendstr.charAt(i)); 
  }
  delay(2000);
}

```

# おわりに
シリアルモニタを確認すれば、動いているはずです。
もし動かないときは、下記を確認しましょう。

- 配線はかならずGNDを共通化しましよう。
- また通信のレートが両方で同じなっているか確認しましょう。

wioLTEではなくESP32-ESP32間でも上記のことに注意しましょう。
GNDを共通にするところを忘れないようにしましょう。
[githubにコード](https://github.com/minwinmin/wioLTE_ESP32_uart)を置いています。
Xcode11でのsetting.bundleのバージョン更新スクリプト

Xcode11からVersionとBuildは、MarketingVersionと、CurrentProjectVersionで管理されるようになりました。
これにより、Settings.bundleのバージョン更新スクリプト変更しないと悲しい状態になるので対応したメモ。

```shell
APP_VERSION="$MARKETING_VERSION"
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

BUILD_NUMBER="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:2:DefaultValue ${BUILD_NUMBER}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"
```
世界最速でUbuntu環境を構築するお話

さくっと環境が欲しくなったときのためにここに書き留めておきます。

#Ubuntuを引っ張る

```bash:bash
$ docker run -it ubuntu bash
```
はい終わり。多分これが一番早いです。

<img width="159" alt="スクリーンショット 2020-05-27 11.37.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541141/856d22ab-2054-6437-1264-e6239633b6f2.png">
無事root権限でログインできてます。

加えてsudoとかnanoとか任意です。

```bash:bash
root$ apt-get update
#gitのインストール
root$ sudo apt-get -y install git
#エディタ(nano)のインストール
root$ sudo apt-get install nano
```

ちなみにこれだと日本語入力に対応していないので, 以下を参考にしてみてください。
[【Docker】ubuntuの環境で日本語入力を可能にする](https://qiita.com/n_oshiumi/items/cfe91c60730f602b38eb)

あとはubuntuをいじくり倒し(~~てぶっ壊し~~)ましょう！
代入演算子のオーバーロードで無限再帰の罠(派生クラス)

今日軽くハマったミスの備忘録。

# 代入演算子をオーバーロードしたらハングした
それが代入演算子というのは作業の経緯からすぐ分かったが、原理がすぐには分からなかった。

# そもそもやりたかったことは
* 親クラスの中身を子クラスにコピーしたい
* 親クラスのフィールドが private だったので個別にコピーできず
* 親クラスの代入演算子でコピーしよう

# 原理と解決
## 問題のコード
``` cpp
class Base
{
private:
	int m = 1;
};

class Child : public Base
{
public:
	Child & operator =( const Base& src )
	{
		*this = src;
		return *this;
	}
};

int main()
{
	Base a;
	Child b;
	b = a;
}
```

こういうコードをgccでコンパイルしたら特にwarningが出るでもなくビルドできたので走らせたら、ハングした。why!?
もちろん本番コードはこれより複雑なやつなので。

仕方なくお試しコードをVC++でやってみたところ、「関数を回帰するとランタイム スタック オーバーフローが発生します。」と言われた。
回帰？あ、再帰呼び出しか！

```cpp
	*this = src;
```
oh... そういうことか...
親クラス同士は関係ないから解決策は当然以下の通り。

```cpp
	Child & operator =( const Base& src )
	{
		*(static_cast<Base*>(this)) = src;
		return *this;
	}
```

文章を推敲してちゃんと答えが途中に出てた。「親クラスの代入演算子でコピーしよう」って言ってて出来てなかったんじゃん。
普段あまりやらないことすると、とんでもないミスを犯しがちですぅぁぁぁ
複数のインスタンス、ドメイン、SSL証明書をALBに登録してhttpsアクセスする

エンタメ系企業の社内もろもろを担当しているakibinです。

普段Spotifyで音楽聴きながら作業してますが、どうしても[マキシマム ザ ホルモン](http://www.55mth.com/pc/index.php)が聴きたい時はウォークマンで聴いています（この記事は聴きながら書いてる）。サブスク解禁しないかな、亮君。

#今回やってみたこと

すでにEC2でインスタンス稼働、ロードバランサ（ALBを）使用してSSL証明書（ACM発行）を登録、Route53に該当ドメイン登録してhttps化している環境で、新たにインスタンスを追加して別ドメインで証明書発行、それをALBに追加登録してhttpsアクセスを各インスタンスに振り分ける、そんなことをしてみました。

#事前作業
EC2に追加のインスタンスを作成して、Webサーバと立てておく。ドメインを決めておく。

- 既存インスタンス（ryokun-server）のドメイン ryokun.makihoru.co.jp
- 追加インスタンス(naochan-server)のドメイン naochan.makihoru.co.jp

#作業
####インスタンスのIP固定
[こちら](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-associate-static-public-ip/)を参照して取得したElasticIPとインスタンスを紐付ける

####新たにSSL証明書発行
[こちら](https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-validate-dns.html)を参照してACMでnaochan.makihoru.co.jpの証明書追加、DNS検証を実施するためRoute53で管理しているmakihoru.co.jpのホストゾーンにCNAMEレコードを作成。
ちょっと時間がたつと検証完了され、SSL証明書が使用できるようになります。

####ALBにSSL証明書を追加
[こちら](https://aws.amazon.com/jp/blogs/aws/new-application-load-balancer-sni/)を参照して、↑で追加したSSL証明書をALBに追加する

####ターゲットグループを追加してALBをでホストルーティング
[こちら](https://sys-guard.com/post-15772/)（←わかりやすかったです！助かりました！！）を参照して新たにターゲットグループを作成。

- 既存ターゲットグループ(ryokun-group)　ターゲット → ryokun-server
- 追加ターゲットグループ（naochan-group） ターゲット → naochan-server

ALBで以下ルーティング設定実施。

- ryokun.makihoru.co.jp → ryokun-groupへルーティング
- naochan.makihoru.co.jp →n aochan-groupへルーティング

####ホストゾーンにAレコード追加
[こちら](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/routing-to-elb-load-balancer.html)を参照してmakihoru.co.jpのホストゾーンにnaochan.makihoru.co.jpへのドメインアクセスをALBに転送するAレコード作成

これで以下アクセスが可能になりました！

https://ryokun.makihoru.co.jp → ryokun-server
https://naochan.makihoru.co.jp → naochan-server

包丁ハサミ！包丁ハサミ！♪

こちらもぜひとも！
＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
◆ Twitterアカウント
@AkibinMusic
◆ Youtubeチャンネル
https://www.youtube.com/channel/UC-JOpwEnJn3gCrUA4NdCYgg
JetBrains製IDEで camelCase, PascalCase, snake_case を切り替える方法

### 手順

1. [プラグイン](https://plugins.jetbrains.com/plugin/7160-camelcase) をインストール
1. IDEを再起動
1. 変換したい単語にカーソルを当てた上で、 **Shift + Alt + u** 。（何度も押すと切り替えられます）

#### その他

* Eclipse だと **Ctrl + Alt + k** で出来る。
* 公式がサポートしてもいい機能だと思うんだけどな。（プラグイン製作者ありがとう。）
【Scrum】Core-Scrumに書いてあるリファインメントの日本語訳(と言うか解釈してみた)のメモ

# プロダクトバックログリファインメント
## 参考
[Core-Scrum](https://www.scrumalliance.org/ScrumRedesignDEVSite/media/ScrumAllianceMedia/Files%20and%20PDFs/Learn%20About%20Scrum/Core-Scrum.pdf)
## Product Backlog Refinement
プロダクトバックログは大きかったり、一般的すぎるストーリーだったりする。
その優先順位も変わっていく。
リファインメントでは

* バックログの順番の確認
* 重要じゃないバックログの削除
* より重要なタスクの追加または優先度あげ
* 大きなアイテムを小さくする
* 小さなアイテムを大きくする
* アイテムの見積もり
* スプリントに入る準備ができているか確認する

次のスプリントに備えて以下を考慮する

* ビジネス価値がある
* 1つのスプリントで開発可能
* ステークホルダーとスクラムチームのどちらも意図が明確
Zsh の 先頭の区切りを % から 卍 にする

最近 Mac を新調したのですが、どうもターミナルに違和感を感じると思ったら zsh なんですね。
このどこに違和感を感じるかって `%` なんですわ。`$` に慣れてたのもありますがなんか許せない。

こんな感じにしたい

```
dir/卍 command...
```

## なぜ卍か

twitter で冒頭の内容を呟いたところ「今時 bash 使ってるのププッ」と煽られたので、
`$` はもう古い。時代を先取りして `卍` にしてやろうとなりました。

## やり方

`~/.zshrc` に以下を追記

```
PS1="${USER}@${HOST%%.*} %1~ 卍 "
```
NuxtでAtomic Designを実践

# はじめに

初めまして。
WELLNESONE JAPAN株式会社（株式準備中）代表取締役CTOの@yusuke_1011です。
自社で一からサービス開発を行う際に実践した構成をここに記しておきます。

こちらの記事は、「[Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく](https://qiita.com/yusuke_1011/items/9a5375eff32f472058da)」の第２章となります。

一般的な内容も多くありますが、説明用のサンプルではなく、実際にプロジェクトで導入した内容にはなるので、オリジナルな部分もある程度含んでしまいます。その点ご了承くださいませ。

# 全体構成

「[Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく](https://qiita.com/yusuke_1011/items/9a5375eff32f472058da)」

1. [Nuxtの開発環境をDockerで構築](https://qiita.com/yusuke_1011/items/3cde7365940642b68f12)
2. NuxtでAtomic Designを実践（←今ここ）
3. Nuxt + Storybookでコンポーネントを管理
4. Storybookを用いたテスト（ストラクチャルリグレッションテスト編）
5. Storybookを用いたテスト（ビジュアルリグレッションテスト編）

# 前提

- Atomic Designの概念を理解できている
- Nuxtで開発環境の構築ができている
- Nuxtのプロジェクト構成、各ディレクトリの意味が理解できている

# NuxtとAtomic Design

Atomic Designではコンポーネントを以下のように分割します。

-  Atoms
-  Molecules
-  Organisms
-  Templates
-  Pages

皆さんご存知の通り、Nuxtにもデフォルトでpagesディレクトリが存在します。
ただ、Atomic DesignのpagesとNuxtのpagesは同じ意味にはなりません。
Nuxtのlayouts + pagesがAtomic Designのpagesのような感覚になります。
（これも厳密には違いますが。。）

ですので、後述の通り、本プロジェクトではディレクトリ構成を純粋なAtomic Designとは少し変更することにしてあります。

# VuexとAtomic Design

では、どのコンポーネントがVuexを意識するのが良いのでしょうか。
基本的にはpagesのみがVuexを意識し、他はすべてpropsで値を受け渡すという意見が多いかと思います。
ただ、そうすると、かなり記述が冗長になってしまうことが難点だと思います。

# ディレクトリ構成

以上を踏まえ、本プロジェクトでは以下のようなディレクトリ構成にしました。

```
src
└── components
    └── atoms 
    └── molecules
    └── organisms
└── layouts
└── pages
```

賛否両論あるかとは思いますが、templatesを廃止しています。
components内のコンポーネントは

- vuexやrouterなどの存在を知らないし、依存もしない
- propsで受け取った値を表示させる
- emitで親要素にコールバック関数を受け渡す

という運用になります。
例えば、atomsであれば、button.vueのような最小単位のコンポーネントを格納しますが、コード例としては以下です。

```vue:button.vue
<template>
  <button
    :shadow="shadow"
    :lighten="lighten"
    :disabled="disabled"
    :class="[
      'btn',
      'btn-size-' + size,
      'btn-type-' + type,
      'btn-color-' + color,
      'btn-align-' + align
    ]"
    @click="clickHandler"
  >
    <span :class="['btn-text', 'btn-font-' + font]">
      <slot>
        <span v-if="iconLeft">
          <font-awesome-icon :icon="iconLeft" class="fa-fw" />
        </span>
        <span v-if="btnText">{{ btnText }}</span>
        <span v-if="iconRight">
          <font-awesome-icon :icon="iconRight" class="fa-fw"/>
        </span>
      </slot>
    </span>
  </button>
</template>

<script>
export default {
  props: {
    shadow: Boolean,
    lighten: Boolean,
    disabled: Boolean,
    size: String,
    type: String,
    color: String,
    align: String,
    font: String,
    iconLeft: Array,
    iconRight: Array,
    btnText: String
  },
  methods: {
    clickHandler(e) {
      if (this.disabled) {
        return;
      }
      this.$emit("click", e);
    }
  }
}
</script>
```
（styleの部分は省略しています）

# Storybookによるコンポーネント管理

Atomic Designを実践する上では、コンポーネントのカタログを作りたくなってきます。
これにStorybookを使用します。
storybookは

- React
- Vue
- Anguler
 
で幅広く使用できるコンポーネント開発環境です。
元々はスリランカのスタートアップがReact用に開発したらしいです。
Storybookを使用することで、プロダクトと切り離した環境でコンポーネントを開発できるので非常に便利です。
また、コンポーネントのテストにも活躍します。
こちらの導入に関しては、また次節でご説明します。
MySQLのモードに関して

# 自分のローカルで設定されているモード

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper
$ mysql -uroot -p
mysql> select @@global.sql_mode;
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
```


- STRICT_TRANS_TABLES
- STRICT_ALL_TABLES
- NO_ZERO_IN_DATE
- NO_ZERO_DATE
- ERROR_FOR_DIVISION_BY_ZERO
- NO_AUTO_CREATE_USER
- NO_ENGINE_SUBSTITUTION

なお、これは紛れもなく、TRADITIONALモードである。TRADITIONALモードとは上の７つのモードが全て有効になっている状態を言う組み合わせモードなのだ。


# STRICTモード
STRICT_TRANS_TABLESモードとSTRICT_ALL_TABLESモードのいずれかが有効な場合、それはSTRICTモードである。


- トランザクションストレージエンジン
    - 不正な値が挿入されようとした場合、エラーを発し(不良データ値は調整されない)、ロールバックする


- 非トランザクションストレージエンジン
    - STRICT_TRANS_TABLES
        - １行目で不良データを挿入しようとした時はエラーを起こし終了
        - ２行目以降で不良データを挿入しようとした時は不良データを調整して挿入し、(エラーではなく)警告を発する
    - STRICT_ALL_TABLES
        - １行目でも２行目以降で不良データを挿入しようとした時はエラーを起こし終了(部分更新が行われる)




# 参考
というかもはや以下の要約
[MySQLのSQLモードをstrictモードで設定する。](https://qiita.com/park-jh/items/32b21d7b8d24b0ab3dba#fn2)
配置の微妙なズレを修正する方法

cssで絶対配置を書くときに、上下真ん中に配置しようと
すると微妙にずれてしまう時がある。
これをするために下記を記載すると真ん中に配置できる
   
```css

 position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
```
Nginx で WordPress を使う

Nginx で　WordPress を使う時の設定ファイルです。
CentOS 7.8 の例です。
Letsencrypt と　パーマリンクを使います。

サーバー名は wordpress.example.com
ルートは /var/www/html
です。

```text:/etc/nginx/conf.d/default.conf
server {
    listen       80;

    listen  443 ssl;
    server_name     wordpress.example.com;
    ssl_certificate  /etc/letsencrypt/live/wordpress.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/wordpress.example.com/privkey.pem;


    location / {
	try_files $uri $uri/ @wordpress;
        root   /var/www/html;
        index  index.html index.htm index.php;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /var/www/html;
    }


    location ~ \.php$ {
	try_files $uri @wordpress;
        root   /var/www/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    location @wordpress {
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME  /var/www/html/index.php;
        include       fastcgi_params;
    }

}
```
Nuxtの開発環境をDockerで構築 


# はじめに

初めまして。
WELLNESONE JAPAN株式会社（株式準備中）代表取締役CTOの@yusuke_1011です。
自社で一からサービス開発を行う際に実践した構成をここに記しておきます。

こちらの記事は、「[Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく](https://qiita.com/yusuke_1011/items/9a5375eff32f472058da)」の第１章となります。

一般的な内容も多くありますが、説明用のサンプルではなく、実際にプロジェクトで導入した内容にはなるので、オリジナルな部分もある程度含んでしまいます。その点ご了承くださいませ。
# 全体構成
「[Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく](https://qiita.com/yusuke_1011/items/9a5375eff32f472058da)」

1. Nuxtの開発環境をDockerで構築（←今ここ）
2. [NuxtでAtomic Designを実践](https://qiita.com/yusuke_1011/items/39ba17d9188496565664)
3. Nuxt + Storybookでコンポーネントを管理
4. Storybookを用いたテスト（ストラクチャルリグレッションテスト編）
5. Storybookを用いたテスト（ビジュアルリグレッションテスト編）

# 前提
Nodeとnpmがインストールされている

```
❯ node --version
v14.2.0

❯ npm --version
6.14.4
```

# dockerとdocker-compose
dockerとdocker-composeを使用します。
Macであればhomebrewを使用してすぐインストールできます。

```
$ brew install docker
$ brew cask install docker
```

これらインストールされていることを確認しましょう。

```
❯ docker --version
Docker version 19.03.8, build afacb8b

❯ docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6
```

# nuxtプロジェクトの作成
```
npm create sample_app
```
vue-cliを用いても良いかと思います。

# ディレクトリ構成
以下のようにします。

```
sample_app
└── docker-compose.yml
└── .env.example
└── front
    └── Dockerfile
    └── src
　　　 　└──（nuxtのコード一式）
```
今後apiなど追加していく前提のディレクトリ構成になっています。
その場合はfront以下をgitのsubmoduleで管理するのもアリかと。


# Dockerfileの作成

今回は必要最低限の記述にします。

```
FROM node:12.16.1 

ENV NUXT_HOST=0.0.0.0
WORKDIR /src
COPY ./src/package.json .
RUN npm install

COPY ./src .
```

# .env.exapmleの作成

```
FRONT_PORT=19080
```

# dokcer-compose.ymlの作成

```
version: '3.7'
services:
  front:
    build: ./front
    command: npm run dev
    volumes:
      - ./front/src:/src
      - ./src/node_modules
    ports:
      - "$FRONT_PORT:3000"
    init: true
    restart: on-failure
```

# 起動手順
１．設定ファイルを生成する

```
cp .env.example .env
```

２．dockerイメージを生成する

```
docker-compose build
```

３．dockerコンテナを起動する

```
docker-compose up -d
```
Athena の TIMESTAMP は、　yyyy-MM-dd HH:mm:ss　を直接サポートしない

# 現象

Athena の TIMESTAMP は、よくある日付形式　`yyyy-MM-dd HH:mm:ss`を直接サポートしません。
例えば以下のようなCSVファイルからGlueでテーブルを作り、２番めのカラムの型に`timestamp`を設定したとします。

``` sample.csv
1000,2020-05-27 10:58:00
1001,2020-05-28 10:58:00
```

ここで、　`select * from sample` を実行してもエラーになります。おそらくこんなエラーメッセージが出ます。

```
HIVE_BAD_DATA: Error parsing field value '2020-05-27 10:58:00' for field 4: For input string: "2020-05-27 10:58:00"
```

# 対策

対策は、テーブルのカラム定義では`string`として、読むときに `date_parse` 関数を使うことです。
`date_by_string`は、２番めのカラム名だと思ってください。

``` sample.sql
select date_parse(date_by_string,'%Y-%m-%d %H:%i:%s') from sample
```

# 参考リンク

https://aws.amazon.com/jp/premiumsupport/knowledge-center/query-table-athena-timestamp-empty/
【1日1写経】Build a Stock Prediction Program【Daily_Coding_002】

##　初めに
- 本記事は、python・機械学習等々を独学している小生の備忘録的な記事になります。
- 「自身が気になったコードを写経しながら勉強していく」という、きわめてシンプルなものになります。
- 建設的なコメントを頂けますと幸いです（気に入ったらLGTM & ストックしてください）。

## お題：Build a Stock Prediction Program
今日のお題は、**Build a Stock Prediction Program**というYoutube上の動画です。

Youtube: [Build a Stock Prediction Program](https://www.youtube.com/watch?v=EYnC4ACIt2g)

分析はyoutubeの動画にある通り、Google Colaboratryを使用しました。

それではやっていきたいと思います。

###　Step1: ライブラリのインポート
まずはライブラリのインポートからです。今回は`quandl`というライブラリを使います。`quandl`は株価やらのデータをとってくるためのライブラリのようです（知りませんでした...）。

```python
pip install quandl
```
Google colabに元々入っているライブラリでないので`pip`でインストールします。

次に今回使うライブラリをインポートします。
###　Step1: ライブラリのインポート

```python
import quandl
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
```

先ほどインストールしたquandlに加えて、numpy, 各種`scikit-learn`のライブラリをインポートしました。

### Step2: データの取得～加工（前処理）

次にデータを取得します。今回はFacebookの株価を使用しています。

```python
df = quandl.get('WIKI/FB')

print(df.head())
```
これでデータを取得できました。取得したデータの中で`Adj. Close`(調整後終値)を使用するのでdfを差し替えます。

```python
df = df[['Adj. Close']]
print(df.head())
```

dfに含まれているデータを数日分ずらして、別の列(`Prediction`)を作成します。その際に、「何日分ずらすか」を変数として格納します。

```python
forecast_out = 30

df['Prediction'] = df[['Adj. Close']].shift(-forecast_out)

print(df.tail())
```
dfの末尾を見てみるとずらした日数分だけ`Prediction`の値がNaNになっていることがわかるかと思います。

次に、`df['Predcition']`から訓練データを作ります。訓練データは先ほど数日分（今回は30日分）ずらして作ったデータのうちNaNの除いた部分を使います。それを使って、ずらした30日分を予測するということをやっています。

```python
X = np.array(df.drop(['Prediction'], 1))

X = X[:-forecast_out]![stockprediction.png]
print(X)
```

【イメージ】
![stockprediction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395696/f59fc46f-333c-0f7e-5566-3e1182c686f5.png)

次にテストデータを作ります。やり方は訓練データと同じです。

```python
y = np.array(df['Prediction'])

y = y[:-forecast_out]
print(y)
```

これでデータの加工ができました。次からはscikit-learnを使った分析に移ります。

### Step3: Sklearnを使った予測

訓練データ（X）・テストデータ(y)をsklearnのtrain_test_splitで分割します。

```python
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
```
今回はSVMとLinearRegressionの2つを使って予測をします。

```python
# SVMのrbf(非線形回帰)
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_rbf.fit(x_train, y_train)

svm_confidence = svr_rbf.score(x_test, y_test)
print('svm confidence:', svm_confidence)
```

```python
lr = LinearRegression()
lr.fit(x_train, y_train)

lr_confidence = lr.score(x_test, y_test)
print('lr confidence:', lr_confidence)
```

これで訓練データを用いて学習済みモデルの作成ができました。

それではそれを使って予測をしてみましょう

```python
x_forecast = np.array(df.drop(['Prediction'], 1))
print(x_forecast)

lr_prediction = lr.predict(x_forecast)
print(lr_prediction)

svm_prediction = svr_rbf.predict(x_forecast)
print(svm_prediction)
```
これで作成したモデルでの予測完了です。

##　最後に
- ご理解のことと思いますが、上記の予測に意味はないです。sklearnの使い方の勉強というのがこの写経した意味と理解してます。
- 株価やコモディティの予測は多数の論文が出てますし、時系列分析は非常に奥が深いのでこれからも学習をしていきたいと思います。

以上。


(これまでの学習)
1. [【1日1写経】Predict employee attrition【Daily_Coding_001】](https://qiita.com/perpetualburn11/items/1f27b9a0d80fef01662f)
Vue.jsでテキストを切り替えたいときに悩んだこと

#テキストを変数の内容によって切り替えたい
前回の、[Vue.jsでメニュー 切り替え](https://qiita.com/aliceroot0678/items/828e28679d24b64a3f67)に機能を追加していきます。

メニューを開く/閉じるボタンを作りたい！
ボタンのテキスト表示もメニューを開く/閉じると切り替えたかった。:thinking:
試行錯誤した記録。途中途中に「ほーん」となることがあった。


#データとメソッドを準備した
絶対もっといいメソッドの書き方があるだろうと思いながら書いた。

```vuejs
<script>
    export default {
        components: {},
        data: function () {
            return {
                openMenu:false
            }
        },
        methods: {
            open:function(){
                if(this.openMenu ===false){
                    this.openMenu = true
                }else{
                    this.openMenu = false
                }
            }
        }
    }
</script>
```

#問題の`button`タグ
##自力で考えたもの

```vuejs

<template>
<button v-if:openMenu = false>メニューを開く</button>
<button v-if:openMenu = true>メニューを閉じる</button>
</template>
```
 やりたいことはこれだけど、`button`タグ２個もあるのなんか変！他にもあるはず！

##「ほーん」ポイント１

```vuejs
<template>
<button v-on:click="openMenu =!openMenu"> //これはスマート。すぐに出てこない
</template>
```

`!`を使って切り替えるのはスマート。**もはやメソッドは要らなかった！！！**
確かに！と納得したはいいけど、テキストの切り替えがわからん:fearful:

##「ほーん」ポイント２

```vuejs
<template>
      <button v-on:click="openMenu =!openMenu">
          <template v-if="openMenu === false">メニューを開く</template>
          <template v-else>メニューを閉じる</template>
      </button>
</template>
```
!!!まさかのテキストのところにまた`<template></template>`が書けるなんて驚き。
まだ自分で活用できるかは微妙だけど、覚えておきたい。:point_up_tone2:

##「ほーん」ポイント３
```vuejs

<template>
    <button v-on:click="openMenu =!openMenu">
        {{ openMenu ? 'メニューを閉じる': 'メニューを開く' }}
    </button>
</template>
```

シンプルイズベストって感じがしますね。
`?`は**三項演算子**というらしい。

```
{真偽値?〇〇:✕✕}
```
`?`の前が`true`か`false`かによって`:`で分けられた値を返すんだそうな。
tureなら左側、falseなら右側。。。
すごい！:v_tone2::v_tone2::v_tone2::v_tone2:

#感想
いろんな書き方があるんだなぁ、、:rolling_eyes:
Nuxt + Docker + CIrcleCI + Storybookという構成でAtomic Designにて開発していく

初めまして。
WELLNESONE JAPAN株式会社（株式準備中）代表取締役CTOの@yusuke_1011です。
自社で一からサービス開発を行う際に実践した構成をここに記しておきます。

# 対象
- Nuxt.jsの学習はしているが開発経験はまだないエンジニア    
- Nuxt.jsでAtomic Designを実践したいエンジニア
- DockerやCircleCIを取り入れた実践的なポートフォリオを作成したいエンジニア志望

の方々が読めるようなレベル感で説明できればと思います。

# 構成
1. [Nuxtの開発環境をDockerで構築](https://qiita.com/yusuke_1011/items/3cde7365940642b68f12)
2. [NuxtでAtomic Designを実践](https://qiita.com/yusuke_1011/items/39ba17d9188496565664)
3. Nuxt + Storybookでコンポーネントを管理
4. Storybookを用いたテスト（ストラクチャルリグレッションテスト編）
5. Storybookを用いたテスト（ビジュアルリグレッションテスト編）


ここでは簡単な用語の説明などを行います。
（Nuxt、Docker、CircleCIは省略します）

# Atomic Design
コンポーネントを細かく分割して定義していくコンポーネントベースのデザイン手法です。
「Atomic」という言葉の通り、最小単位（Atom）から作成し、それを組み合わせるような形でデザインしていきます。

### 利点
- コンポーネントを使いまわしやすい
- 並行開発しやすい
- テストがしやすい
- メンテナンスしやすい

# Storybook
コンポーネントのカタログを作成し、管理できるツールです。
コンポーネントのテストもStorybook上で実施できます。

Atomic Designで開発を進める以上は、Storybookのようなツールは必要不可欠かなと思います。
主な用途としては、

- デザインスタイルガイドとしてデザイナーとのコミュニケーションに使用
- コンポーネントの挙動や表示を確認するテストに使用

です。
元々はスリランカのスタートアップがReact用に開発したらしいですが、現在は

- React
- Vue
- Anguler

で幅広く使用できます。
Githubの差分比較調べた

## Githubの差分比較機能について

Github上で任意のcommit間の差分を取る方法について
やろうとする度に忘れて調べてしまってたのでメモ。

- commit間のdiff

```
{Githubリポジトリ}/compare/{commit_id}...{commit_id}
```

- branch間のdiff ちなみにスラッシュが含まれたブランチ名の場合はそのままURLに反映される
    - feature/hoge

```
{Githubリポジトリ}/compare/{branch}...{branch}
```

- tagもいけます
    - がドットが含まれている場合、URLとして解釈されるので表示できない
    - 大抵タグ名は `v1.0`等になると思うので基本的には比較できないと思ってたほうが良いかも

```
{Githubリポジトリ}/compare/{tag}...{branch}
```

- 既に例で書いてますが、それぞれの組み合わせでも比較できます
    - commit...branch
    - branch...tag
    - 等
 
- `...` と `..` にすると差分のみの表示になる

`...` だとcommit履歴などの付随情報も表示されますが、`..`は差分のみの簡易表示になるようです。

へえ～

```
{Githubリポジトリ}/compare/{branch}..{branch}
```

以上です。
OpenCVの画像処理をGPU(CUDA)で高速化する XavierNX

#はじめに

[OpenCVの画像処理をGPU(CUDA)で高速化する](https://qiita.com/iwatake2222/items/dd7ea3efe65ac77bf783)
というPostをみて、XavierNXでも同様にGPUMATを使った高速化について確認しました。

#手順  
- XavierNXのJetpack4.4でOpenCV4をビルドし、GPUMAT（CUDA)を使えるようにします。  
 -もともとJetpack4.4にはOpenCVの4.1.1が入っていますが、GPUMATがイネーブルにされずにビルドされています。
- [OpenCVの画像処理をGPU(CUDA)で高速化する](https://qiita.com/iwatake2222/items/dd7ea3efe65ac77bf783)にあるスクリプトを実行します。

#XavierNXのJetpack4.4でOpenCV4をビルドし、GPUMAT（CUDA)を使えるようにします。 
XavierNXで、GPUMAT(CUDA)を使おうとすると

```
cv2.error: OpenCV(4.1.1) /home/nvidia/host/build_opencv/nv_opencv/modules/core/include/opencv2/core/private.cuda.hpp:107: error: (-216:No CUDA support) The library is compiled without CUDA support in function 'throw_no_cuda'  
```
といわれGPUMATが使えません。
[Jetson Xavier NXでDNN_BACKEND_CUDAが使えるOpenCV4.3をDockerでビルド](https://qiita.com/sowd0726/items/57a4e867d358283bdf20)でOpenCV4.3なGPUMAT(CUDA)がイネーブルなイメージをビルドします。


#[OpenCVの画像処理をGPU(CUDA)で高速化する](https://qiita.com/iwatake2222/items/dd7ea3efe65ac77bf783)にあるスクリプトを実行します。
作成したイメージを実行 # ここでは作成したイメージにopencv430:100　というタグをつけてあります。

```
sudo docker run -it --rm --net=host --runtime nvidia  -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix opencv430:100
```
その後Docker上で
https://github.com/iwatake2222/OpenCV_CUDA
にあるスクリプトを実行します。

```
python3 opencv_cuda.py
```


#結果
各一回づつしか実行してないので、ばらつきはありますが、CPUはJetsonNanoよりはやいですが、GPUはむしろ遅い感じ
GPUの計測時には、
1，GPU側へのコピー、
2，リサイズ、
3，CPU側への返送
なので、実際には2だけがGPUの恩恵を受けるので値そのものはこんなものかとおもいますが、[OpenCVの画像処理をGPU(CUDA)で高速化する](OpenCVの画像処理をGPU(CUDA)で高速化する)の結果と比較するとJetsonNanoより遅くなるのはなぜでしょう。。。どなたか知見のある方いらっしゃれば

```
nvpmodel -m 0
CPU = 0.8271254301071167[msec]
GPU = 0.9963115930557251[msec]
1
nvpmodel -m 1
CPU = 1.1097469329833984[msec]
GPU = 0.8339884281158447[msec]
1
nvpmodel -m 2
CPU = 1.107427430152893[msec]
GPU = 1.0129541397094726[msec]
1
nvpmodel -m 3
CPU = 1.0416812896728516[msec]
GPU = 0.9837974786758423[msec]
1
nvpmodel -m 4
CPU = 1.3258913993835448[msec]
GPU = 1.004795241355896[msec]
1
```
#5/27追記
ふとjetson_clocksを実行して測定してみたら
CPU = 1.1041647672653199[msec]
GPU = 0.3990261316299438[msec]
1
となりました。
/etc/nvpmodel.conf
を見る限り、最大Clockはかわらないのですが、jetson_clocksを実行するとGorvernorが停止され最大クロックに固定されます。検証してませんが、転送はCPU処理、リサイズはGPU処理でこまめに切り替わることで、Gorvernorの動作が間に合ってない可能性があるかもしれません。気が向いたら確認してみます。
【自分用学習メモ・備忘録】Sass

###Sassを使うと…

+ CSSより記述量を減らせる（拡張子.scss）
+ コードを再利用できる

```
☆入れ子構造（同じセレクタを何度も書かなくて良い！）

.header{
　width: 100%; 
　
  ul{
　　padding: 10px;
　}
}
```


```
☆&記号
li{
　font-size: 15px;
　&:hover{
　　background-color: red;
　}
}

☆li:hover → &:hoverに書き換えられる（同じ扱い）
:activeなどにも同じように利用可能
☆特定要素の指定も&記号で記述できる（e.g. li.second → &.second）
```


__変数__
$変数名 :値;　で定義できる。
文字色や文字サイズなどを定義して、値に変数名を記述すると繰り返し使えて変更も簡単。
__※利用する箇所より前で定義する！__

__mixin__
@mixin mixin名{コード}で定義できる。
複数のコードをまとめて呼び出せる。
@include mixin名;　で呼び出せる！

__引数__

```
☆mixinの引数 
@mixin font-data($color){
　font-size: 14px;
　color: $color;
}
.card{
　@include font-data(#ff0000);
}
☆includeごとに値指定できる。
```

__関数__

+ color: darken(色, 50%); 色を暗くする関数
+ color: lighten(色, 50%); 色を明るくする関数
+ color: rgba(色, 0.5); 色の透明度を指定する関数

__import （ファイル読み込み）__
読み込み先のファイルの先頭には　__「_」アンダーバーをつける__
ファイルを読み込むには　__@import"ファイル名"__
と記述する（アンダーバーと拡張子.scssを省略できる）


__☆mixinやimportを組み合わせて効率よくコードを書くとよし！__
テックキャンプを卒業しての感想

2020年3月6日にテックキャンプ卒業し、先日自社開発企業に内定を頂きましたので、スクールの感想を書いていきたいと思います。スケジュール感は下記の通り。

①基礎カリキュラム（約2週間）
②応用カリキュラム（約3週間）
③オリジナルアプリ製作（約1週間）
④チーム開発　(約4週間)
⑤転職活動（約8〜12週間）

結論から申し上げると通わなくて良かったのではないかと感じています。
確かにプログラミングの力は付きましたが、多くの企業では実務経験が重要で、プログラミングスクールを出たくらいでは素人に毛が生えた程度との認識が大半。むしろスクールで製作した課題をポートフォリオとして掲載していると、それだけでお祈りとなるケースも多々ありました。
また「たった３ヶ月で稼げるフリーランスに」、「たった３ヶ月でプロのエンジニアに」のように誇大広告が過ぎる印象を受けました。挫折率に関しても、HPにはほとんど挫折しないとの文言がありましたが、最終的には1/3は挫折し、辞めていった印象です。中で働いているメンターの方やスタッフの方は、親身になって一生懸命やって頂けるだけにとても残念です。

誇大広告を辞め、真実を伝える。これだけを切に願います。
GradleのArtifactとはなんぞや

毎回忘れるのでメモ。

## Artifactとはなんぞや

該当プロジェクトが、一意に参照できるようにするためのもの。
プロジェクトの名前やライブラリの名前になることが多いと思う。

javaのライブラリ管理はドメイン名と Artifact で行われており、それぞれをつなげたのものファイル名にする。
そのため、_example.com_ というドメインを所持している会社の _foo-library_ というライブラリを配布する場合、

```shell
com/
└── example
    └── foo-library
```

といった形になる。
また、Gradleの設定ファイルである`build.gradle`には、ドメイン部分の

```
group = 'com.example'
```
 
が記載される。

## じゃあNameってなんなん

Gradleでは、複数のプロジェクトを1つのプロジェクトファイルにまとめることができる。
その際に使用するalias。
なので、単一プロジェクトではArtifactと同じで良いと思う。

## 参考

### Artifactについて
>Artifact
>A file or directory produced by a build, such as a JAR, a ZIP distribution, or a native executable.
>
>Artifacts are typically designed to be used or consumed by users or other projects, or deployed to hosting systems. In such cases, the artifact is a single file. Directories are common in the case of inter-project dependencies to avoid the cost of producing the publishable artifact.
>https://docs.gradle.org/current/userguide/dependency_management_terminology.html#sub:terminology_artifact

### 複数プロジェクトをまとめる方法について

- [Gradle によるマルチプロジェクトの基本 | まくまくGradleノート](https://maku77.github.io/gradle/multi-project.html)
- [Gradleでマルチプロジェクト - Qiita](https://qiita.com/shiena/items/371fe817c8fb6be2bb1e)
C++のFILETIME構造体をUnix時間に変換し、ファイル作成からの経過時間を導き出す。

#概要
GetFileTimeで作成時刻を取得し、PCローカル時刻と比較することで導く。

#方法
1.ファイル作成時間の取得
GetFileTimeで作成時刻を取得する。2番目の引数が作成時時刻をFILETIME構造体で返す。

```
GetFileTime( hFile, &creationTime, null, null);
```

このFILETIME構造体は1601/1/1:00:00:00からの時間を100nsec単位で返す。
dwLowDateTimeとdwLowDateTimeはそれぞれファイル時刻の下位32bitと上位32bitである

```c++
typedef struct _FILETIME {
	DWORD dwLowDateTime;
	DWORD dwHighDateTime;
} FILETIME; 
```


2.PC loacl 時刻の取得
time_tとlocaltimeを使い、1970/1/1:00:00:00からのUNIX時間で現在時刻を取得する

```c++
time_t now = time(NULL);
struct tm *ltime = localtime(&now);
```

3.FILETIMEのUNIX時間への変換
1601/1/1:00:00:00は1970/1/1:00:00:00の11644473600sec前であるので、変換は下記関数となる

```c++
#define WINDOWS_TICK 10000000
#define SEC_TO_UNIX_EPOCH 11644473600LL

unsigned WindowsTickToUnixSeconds(long long windowsTicks)
{
     return (unsigned)(windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH);
}
```

windowsTicksにはdwLowDateTimeとdwHighDateTimeをnsecに変換して、代入する

```c++
windowsTicks = (((ULONGLONG)ftFileTime.dwHighDateTime) << 32) + ftFileTime.dwLowDateTime;
```



#参考
https://stackoverflow.com/questions/6161776/convert-windows-filetime-to-second-in-unix-linux
Composer経由で,さくらのレンタルサーバにインストールできたPHPのミドルウェアと容量

ComposerでさくらのレンタルサーバにLaravelをインストールしようとすると、途中でkill -9 でヌっころされてしまいます。

先人の知恵によると、容量が大きすぎるので中断をくらうらしい、一旦ローカルに作ってFTPで送ると動くとのこと（仰せの通りでした）。

じゃあ、何だったらインストールできるの？ということで幾つか試してみました。
ちなみにプランはスタンダードです。

方法
/home/xxxx/projの下にミドルウェアごとにディレクトリを作って、
そこで
composer require foo/bar
をやってみる。その後、容量をdu -sm */ | sort -nで調べる。

結果(2020/5/27現在,単位はMB)
$ du -sm */ | sort -n

1       Codeigniter/
2       slim/
3       smarty/
9       cake/
9       laminas/(旧Zend Framework)
13      fuel/
41      symfony/
42      lumen/ (composer -> lumenインストーラ使用)
14      laravel/　インストール失敗、ローカルのvendorでは56M

lumenまでは入るが、Laravelはアウトでした。

「lumen 軽いよ！」という印象だったのですが、容量的には結構ありますね。

Codeigniterは実際は1M以下で、あまりに小さくて二度見したんですが、/vendorを確認したところどうやらこれでいいらしいです。
【Git】と【github】の違いとは？

＜問題提起＞
GitというものとGitHubって出てきたけど
【Git（ギット）】と【GitHub（ギットハブ）】て同じなの？

＜結論＞
「Git（ギット）」と「GitHub（ギットハブ）」ですが、この2つは同じものではありません。
「Gitを使ってエンジニアを支援するWebサービスがGitHub」です。


そのため、まずはGitが何かについてからご紹介をしたいと思います。

※GitとGitHubの違い

・Gitとは
・Githubとは
・実際の開発の流れ参考
・初心者向けおすすめサイト

Gitとは、Githubとは、実際の開発の流れ参考については
以下サイトを引用,抜粋してまとめています。
https://www.i3design.jp/in-pocket/3111

■Gitとは

□【Git】
「ソースコードの保存した履歴を管理するツール」の名前です。
システム開発では複数の開発者によってソースコードが書き換わります。
・いつ誰がどこを変えたのか？
・最新の保存履歴はどれか？
など、ソースコードの履歴を把握する必要があります。
この履歴を管理をするツールの1つが「Git」です。

Gitに
１、何を足したのか 
２、どこを削除したのか
３、どんな手を加えたのか 
見ていてもらいたいリポジトリ（これから作業する今自分のいる場所）で、
git initをすると、Gitさんが呼び出せてGitコマンドが使えるようになります。 これを忘れてしまうと、後で大変な目にあいます。

git initについてはこちらを参考にしました。
https://qiita.com/rild/items/46ec3b2e4a99bd5cc3b0

■Githubとは

□【Git hub】
「Gitを利用した、開発者を支援するWebサービス」です。
GitHubは、クラウド上でGitを用いたバージョン管理をすることができ、さらにGitには無い、開発者に便利な機能を追加しています。
Gitはツールの名前で、GitHubはWebサービスの名前。この2つの関係は「メールとGmail」の関係に似ています。Gmailはメールを利用するためのWebサービスですし、メールのWebサービスはGmail以外にもYahoo!メールなどがありますよね。

■実際の開発の流れ

□ソースコードの基本的な流れの説明
1.リポジトリを作成する 
2.ソースコードの作成、編集を行う
 3.新規作成、変更、削除をGitのインデックスに追加する 
4.インデックスに追加された内容をローカルリポジトリにコミットする。
 5.ローカルリポジトリの内容をリモートリポジトリ（GitHub）にプッシュする

2.で登場する「インデックス」は、ローカルリポジトリにコミットする前に一時的に変更内容を保存しておく場所です。ファイルを編集し、最終的にGitHubに変更が反映されるまでにはインデックス→ローカルリポジトリ→リモートリポジトリ（GitHub）という3段階を踏むようになっています。
また、ローカルリポジトリに変更内容をアップすることを「コミット」、リモートリポジトリに変更内容をアップをすることを「プッシュ」と呼びます。逆に、他の開発者がリモートリポジトリに追加した内容をローカルリポジトリに反映させる操作は「プル」と呼ばれます。
こうして複数の開発者がリモートリポジトリに最新の状態をプッシュしていき、ソースコードのバージョン管理を行います。

■初心者向けおすすめサイト

もっと知りたい！という方は、こちらのサイトも見てみてくださいね。
・Git　
わかりやすいGit入門です。まずはここから。
http://www.backlog.jp/git-guide/
概念を「写真・カメラ・アルバム」などに例えて解説
http://liginc.co.jp/246190
・GitHub
チーム開発について連載されています。
https://seleck.cc/note/seleck_howto/article/30
GUIツールを使ったGitHubの使い方が解説
http://liginc.co.jp/248093

GitHubは機能も豊富なので最初は分かりづらいかもしれませんが、これを使いこなせるかどうかでキャリアに凄い影響があるかも？！って言われると使わざるを得ないでしょう

ぜひ一度、実際に試してみてくださいね。
[Javascript]関数

#関数定義
`const 定数名 = function() {
   処理
};`

```javascript
const hello = function() {
  console.log("こんにちは");
}
```


#アロー関数
`function ()`の代わりに `() =>`

```javascript
const hello = () => {
  console.log("こんにちは");
}
```
#関数呼び出し
`定数名();`

```javascript
const hello = function() {
  console.log("こんにちは");
}

hello();
```

#戻り値とその呼び出し

```javascript
const sum = (a , b) => {
  return a + b;
}

const price = sum(100 , 300);
console.log(price);
```
出力結果
400
Laravel MySQL 既に存在するテーブルにカラムを追加する

# 目的

- rollback時の記載を毎回間違えるのでしっかりとまとめる

# 実施環境

- ハードウェア環境(下記の二つの環境で確認)

| 項目 | 情報 | 備考 | 
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) ||
| ハードウェア | MacBook  Air (11-inch ,2012) ||
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 ||
| メモリ | 8 GB 1600 MHz DDR3 ||
| グラフィックス | Intel HD Graphics 4000 1536 MB ||

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

# 記載例

1. アプリ名ディレクトリで下記コマンドを実行する。

    ```terminal
    $ php artisan make:migration add_追加カラム名_column_to_追加テーブル名_table --table=追加テーブル名
    ```
1. アプリ名ディレクトリで下記コマンドを実行して作成したマイグレーションファイルを開く

    ```terminal
    $ vi database/migrations/yyyy_mm_dd_XXXXXX_add_追加カラム名_column_to_追加テーブル名_table.php
    ```
1. 開いたマイグレーションファイルを下記の様に修正する。追加するカラムの位置を指定したい時はこちらを参考にup側の記載を行う。→[Laravel MySQL 既存テーブルの任意の場所にカラムを追記する 簡易版](https://qiita.com/miriwo/items/17043209c65e2078f34b)

    ```アプリ名ディレクトリ/database/migrations/yyyy_mm_dd_XXXXXX_add_追加カラム名_column_to_追加テーブル名_table.php
    <?php
    
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
    
    class Add追加カラム名ColumnTo追加テーブル名Table extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::table('users', function (Blueprint $table) {
                //下記を追加する
                $table->データ型('カラム名');
            });
        }
    
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::table('users', function (Blueprint $table) {
                //下記を追加する
                $table->dropColumn('カラム名');
            });
        }
    }
    ```
1. アプリ名ディレクトリで下記コマンドを実行してマイグレーションファイルをマイグレートを行う。

    ```terminal
    php artisan migrate
    ```
1. エラーが出ずにマイグレートできる事を確認する
protocをワイルドカードのprotoファイルに適用する方法


`protocol`配下にprotofileがある場合

```
[~/go/src/github.com/backend]$ tree -L 1 protocol                                                                                                                                                                                                                                              
protocol
├── helloworld.proto
├── vendor
└── workspace.proto

1 directory, 2 files
```

## ワイルドカード適用前
これだとうまくいかない。

```
protoc --proto_path=protocol -Iprotocol -Iprotocol/vendor/protobuf/src *.proto \
  --go_out=plugins=grpc:${SERVER_OUTPUT_DIR}
```


## ワイルドカード適用後
`--proto_path`の指定を無視して、相対パスでワイルドカード先を指定してやれば良い

```
protoc --proto_path=protocol -Iprotocol -Iprotocol/vendor/protobuf/src ./protocol/*.proto \
  --go_out=plugins=grpc:${SERVER_OUTPUT_DIR}
```
ヤッター！paiza.ioでコンパイラできたよー！＼(^o^)／

# これは何？

先日、[こんな記事](https://megalodon.jp/2020-0526-1521-16/https://agency-star.co.jp:443/column/+compiler)を見ました[^1]。

[^1]: 元は https://agency-star.co.jp/column/+compiler でしたが削除されたようなので魚拓

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71477/6b10fa8f-a3a7-7152-3c05-65d2ab13af12.png)

ほう？

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71477/edf3553c-2d61-6b55-2310-23bb197a42b5.png)


コンパイラの自作方法を解説しているなんて、なかなか意欲的な記事じゃないか。どれどれ。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71477/6e02b10d-dccd-0060-3ab0-221905eb6b8b.png)

(　ﾟдﾟ) ポカーン・・・

(つд⊂)ｺﾞｼｺﾞｼ

(；ﾟдﾟ) ・・・

(つд⊂)ｺﾞｼｺﾞｼｺﾞｼ
　　\_, .\_
（；ﾟ Дﾟ） …！？

**[paiza.io](https://paiza.io/) はコンパイラ自作支援システムだ。いいね？**
アッハイ

# 作ったやつ

https://paiza.io/projects/vTnaN4twZe8d1BYQAB3hDw

よくある Brainf*ck コンパイラ（手抜き）です。

# 技術解説（言い訳タイム）

最初は ELF64 の実行可能ファイルを直接吐き出すコンパイラ作ろうかなって思ったんですよ。でも ELF フォーマット調べてたらこれめんどくせーなってなりました。

Rustなら [elf](https://crates.io/crates/elf) crate とかあるんですが、 paiza.io で外部 crate は流石に使えないし。

という訳で、「Brainf*ck のソースコードから Rust のソースコード生成して後は rustc に任せちゃえ！」と手抜くことに相成りました。Rustを中間言語とするコンパイラと強弁すればOKです。~~実質 proc-macro と大差ない。~~

paiza.io は複数のファイルを扱えるので、 source.bf というファイルに Brainf*ck のソースコードを書いて、 そこから source.rs というファイルを生成します。後はrustcにぶん投げて、出来上がったものを実行するだけです。

# ところで

「piaza.io で作らないと駄目なのでは？」
「知るかそんなサイト！！！」
GCFA勉強法

# はじめに
少し前にGCFAに合格したのですが、日本語での勉強方法はあまりないようでしたので、書いてみることにしました。なお、試験に合格したのは2019年12月8日です。現在とは試験の内容が異なる可能性がありますのでご注意ください。

# GCFAとは
GIAC Certified Forensic Analyst (GCFA)です。主にフォレンジックとインシデント対応に関する能力が問われます。
フォレンジックに関する資格は他にもいくつかあります。GIACですと、GCFEがあります。GCFEは取得していませんが、内容を見る限り、GCFEの方がWindowsフォレンジックの細かい点まで問われ、GCFAはWindowsフォレンジックの内容に加えて、インシデントにおける調査に関する問題が出題されるようです。

# 試験概要
公式サイトにありますが、最大115問出題され、3時間で回答します。72%正解すれば合格です。
なお、出題数や合格基準、制限時間は変更される可能性がありますので公式サイトでご確認ください。私が受験した時の合格基準は71%以上だったような気がします。
https://www.giac.org/certification/certified-forensic-analyst-gcfa

試験には、紙媒体の資料を持ち込むことができます。FOR508のトレーニングで配布された資料だけでなく、自分で作成した資料でも持ち込めます。

試験において注意が必要な点が1つあります。**1度回答を確定した問題は後から回答を変更することができない**という点です。15問だけ回答を保留することはできます。保留した問題は、後から回答することになります。
私はこれまでCISSP、CompTIA、LPICなど複数の試験を受けてきましたが、いずれも回答を最終確定するまで何度でも変更できる試験でした。この点は特に注意が必要です。
また、途中1回だけ15分の休憩をとることができます。休憩の前には前述の保留した問題をすべて回答する必要があります。

# 試験勉強
私の場合、インシデントレスポンスやフォレンジックを業務で約7年経験しているため、正直楽勝だろうと思っていました。そこで、試験前に受けられる模擬試験をいきなりやってみるという作戦を決行しました。結果としてこれは失敗でした。
これから受験する方は、まず最初にテキストを通読することを強く推奨します。英語なので読むのは大変ですが、スライドに書かれている重要な点だけでも理解してから模擬試験を受けるべきです。(実際には、スライドだけでなく、ノート部分に記載されているテキストも重要です)
トレーニングをこれから受けるという方は、重要そうなキーワードをメモする、マークするなどしながらトレーニングを受けることを推奨します。

次に、自分用のメモを作成します。私はキーワードとその説明だけを記載したシンプルなものを作成しました。以下の表がサンプルです。もし知らない英単語がテキストや模擬試験中に出てきたのであれば、それもこのメモに入れてしまいます。辞書は持ち込めるのですが、試験中に辞書で単語の意味を何度も調べるのは時間がもったいないので、自分用の辞書も兼ねてしまうというわけです。

キーワードはアルファベット順にソートしておき、試験中にすぐに見つけられるようにします。
以下の表に記載したカテゴリは私が勝手に作ったもので、これから試験を受ける方は、テキストに記載されている用語を使ったほうが良いと思います。
また、以下の表には記載していませんが、各キーワードはテキストのページ番号も記載しておくと良いかもしれません。

| キーワード       |カテゴリ| 説明 |   
|:-----------------|:------------------|:------------------|
|acquire|英語|取得する|
| Chain of Custody | 保全|証拠の連鎖、データが改変されていないことを保証する|
| volatility          |メモリフォレンジック | メモリダンプを解析するツール |


なお、テキストだけでなく、[SANSのポスター](https://www.sans.org/security-resources/posters/dfir)も一読した上で持ち込みましょう。トレーニングで配布されたものはそのままだと大きすぎるかもしれませんので、A3くらいで印刷した方が良いかもしれません。

# 試験当日の注意点
GIACを受検される方は、すでに他の試験を受けたことがあると思いますので、特別な注意点はありません。身分証2点、持ち込み資料一式、さらに紙の英和辞典があれば持参すると良いです。
なお、持ち込み資料は試験の前後でチェックされます。普通は問題ないと思いますが、変な落書きとかはやめておきましょう。

これは私の運が悪かっただけなのですが、受験する際の席が入口ドアの近くになってしまい、頻繁に出入りが発生していました。ヘッドホンをつけていてもそれなりの騒音が発生していたので、集中力の持続が難しくなっていました。もし受験する席を選べるのであれば、可能な限り入口から遠い場所を選ぶことをオススメします。また、比較的人の少ない平日に受験すると良いと思います。

# 試験の感想
模擬試験と似たような問題が出題されますので、模擬試験で合格点がとれるなら大丈夫です。
内容は基本的ですが、英語の理解に時間を要したため、それなりにフォレンジック、インシデントレスポンスの経験があっても難しいと感じました。

この分野については、英語の記事を読むことも多いので、通常は英語であってもそれなりに理解できるのですが、この試験に関しては、知らない単語、表現が多いと感じました。（この点は試験の最後のアンケートで、「簡単な表現を使ってください」と記入しておきました）

問われる内容そのものは基本的なものが多い気がします。全く聞いたこともないキーワードが出てくることはないですし、重箱の隅をつつくような出題もなかったと思います。

これから受験される方の参考になれば幸いです。
tensorflow.python.framework.errors_impl.ResourceExhaustedErrorでOOMが走るときの対処方法

# Keras-Yolov3 でGPUを動かしたときにメモリが足りないときの対処方法

YOLOv3 (Tensorflow backend) をGPUを使ってモデルを作成しようとした時にOOMが動いてしまう。
https://github.com/qqwweee/keras-yolo3

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[32,104,104,128] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc


Batchサイズを32 -> 8 に変更したところ、動くようになった。


~~~train.py
@@ -54,7 +54,7 @@ def _main():
             # use custom yolo_loss Lambda layer.
             'yolo_loss': lambda y_true, y_pred: y_pred})

-        batch_size = 32
+        batch_size = 8
         print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))
         model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes),
                 steps_per_epoch=max(1, num_train//batch_size),
@@ -73,7 +73,7 @@ def _main():
         model.compile(optimizer=Adam(lr=1e-4), loss={'yolo_loss': lambda y_true, y_pred: y_pred}) # recompile to apply the change
         print('Unfreeze all of the layers.')

-        batch_size = 32 # note that more GPU memory is required after unfreezing the body
+        batch_size = 8 # note that more GPU memory is required after unfreezing the body
         print('Train on {} samples, val on {} samples, with batch size {}.'.format(num_train, num_val, batch_size))
         model.fit_generator(data_generator_wrapper(lines[:num_train], batch_size, input_shape, anchors, num_classes),
             steps_per_epoch=max(1, num_train//batch_size),

~~~