OmniAICreator/Qiita-1.07M huggingface dataset:
Web Speech API を使って全自動プレゼンを作った（だけで終了した）

[Web Speech API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API)は、Webブラウザが提供する、テキストと音声（話し声）の相互変換をJavaScriptから生業できる機能です。

- 音声認識のSpeechRecognition
- 音声合成のSpeechSynthesis

の2つから成り立っています。

そこで、SpeechSynthesis の紹介スライドをSpeechSynthesis自身を使って作ってみました。

# プレゼン

<p data-height="265" data-theme-id="0" data-slug-hash="WLNgbq" data-default-tab="js,result" data-user="doloopwhile" data-pen-title="WLNgbq" class="codepen">See the Pen <a href="https://codepen.io/doloopwhile/pen/WLNgbq/">WLNgbq</a> by OMOTO Kenji (<a href="https://codepen.io/doloopwhile">@doloopwhile</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 補遺

このプレゼンは社内勉強会で使おうと思いましたが、思ったよりショボい出来なのでお蔵（Qiita）入りにしました。
C++ Builder XE4 > FastReport VCL 5 > 「PDFへのエクスポート」ダイアログ（TfrxReportのExport()を使ったとき)にて「キャンセル」ボタンが押されたときの処理

```txt:動作環境
C++ Builder XE4
FastReport VCL 5
```

「PDFへのエクスポート」ダイアログ（TfrxReportのExport()を使ったとき)にて「キャンセル」ボタンが押されたときの処理。

公式ドキュメントで見つけにくかったので、実装で確認した。

```cpp
	// PDFエクスポート
	frxPDFExport1->FileName = L"test.pdf";
	frxPDFExport1->ShowDialog = true;
	frxPDFExport1->Quality = 100;
	frxPDFExport1->PrintOptimized = true;  // これがないと貼り付けた画像がつぶれた状態になる
	frxReport1->PrepareReport(/* clearLastReport= */true);
	bool res = frxReport1->Export(frxPDFExport1);

	if (res) {
		String msg = L"Exported as [" + frxPDFExport1->FileName + L"]";
		ShowMessage(msg);
	} else {
                // キャンセルボタン押下時の処理
        }
```

`frxReport1->Export`の戻り値で判断する。

### ドキュメント

V4のドキュメントであるが

- [FastReport 4.0 User's Manual](http://www.specjalistainformatyk.pl/download/fr_manual.pdf)
Angularアプリケーションをリニューアルした話

# はじめに
この記事は[トレタ アドベントカレンダー](https://qiita.com/advent-calendar/2018/toreta) 14日目の記事です。

自分はトレタにフロントエンジニアとして約半年前にジョインしました。
トレタは飲食店向けに予約/顧客台帳のiPadアプリをサービスとして提供している会社です。

入社して最初に関わったのが「トレタマネージャー」と呼ばれるトレタのWeb版アプリケーションのリニューアルでした。Web版はiOSの台帳アプリと同等の機能を提供するもので、主に飲食店の本社などPCからの利用されるケースが多いです。

![pc-1.png](https://qiita-image-store.s3.amazonaws.com/0/36813/9292a3e8-6367-5719-86f3-d72ddef3c5b3.png)
【画像の真ん中のがトレタマネージャー】

# リニューアルの経緯
自分はリニューアルの途中から参画したのですが、主な理由はフロントのフレームワークを新しくするためです。当時のトレタマネージャーはAngular1系で作られていたたため、今後も継続開発をしていく為にAngular2系に全面書き換えのリニューアルを行いました。

## Angularを選んでどうだったか

フロントエンドのフレームワークの選定において、自分が選んだわけではないので選定理由は詳しくは語れませんので、実際にAngularで実装してみての良し悪しについて語ります。

ちなみに、前職ではReactやVueの経験が多かったので、トレタではAngularを使っていると聞いたときの第一印象はあまり良くなかったです。だって他のフレームワークと比べて人気なかったし、1系から2系への互換性がなくなった時は選ばなくてよかったーとか思ってた勢なので。。

<img width="458" alt="スクリーンショット 2018-12-10 12.48.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/36813/ab5b6eef-bb76-9a01-e9d8-fa8d5ea5c654.png">
【良く見かけるフロントエンドの人気投票】

### React、Vue.jsはViewLibraryであり、Angularはフレームワーク
ReactやVue.jsはコア部分は薄く、必要なライブラリを適宜各々で好きに取り入れていく方針に対して、Angularはオールインワンなのが特徴です。RouterなどSPAとして必要なものが全て揃っているので、SPAとしてやると決まっているなら環境を整えやすいです。
周辺ライブラリが既に備わっているということは、Githubでスター数調べたり、ライブラリごとのバージョン互換を気にしたりする必要がないので非常に楽です。

### 堅牢、決まった仕組み
アーキテクチャとしてサービス層やパイプなど構成が決まっているので、多人数でやる時でもルールが揃えられるし、敷かれたレールに乗ってる感があります。さらにTypeScriptに完全に対応しているので、型づけがしっかりできるのもいい点です。
言語で例えるなら、Vue.jsは書きやすくていいとこ取りのRubyなら、AngularはJavaです(ちなみに自分はJavaあまり好きではないw)。ベンチャーWeb界隈はRuby好き多いのでVueが人気でるのもわかります。
 
### 勉強コストは高い
他フレームワークと同じくコンポーネント志向なのでReactとか触ったことあるなら大きくスイッチイングコストがかかるわけではないですが、RxやDIなどAngularだと必須な要素があり、先述の通りAngularのレールに乗るにはAngularの作法を知っておく必要があります。
それと日本語の技術記事も比較的少ない上に、1系と2系の記事が混ざってて検索しづらいのが地味にツラいです。

# リニューアルで変えたこと
リニューアルは基本的に同機能で同じ画面デザインへの移行を行いました。ただ、要件を整理した結果、スコープを一部絞ることにしました。

### IEの対応をやめた
IEの対応コストが高かったので、Edge以前のIEの対応は打ち切りました。
これはBtoBのサービスであるところが大きいですが、ChromeとSafariを標準ブラウザとして使ってもらうことを前提にしています。どうしてもIEしか使えない場合は、元のリニューアル前を残してあるのでそちらを使ってもらう方向にしました。

### モバイルの対応をやめた
リニューアル前はレスポンシブ対応をしていたのですが、リニューアルにあたって要件を整理した際に、PCとモバイルでは利用シーンが大きくことなるが分かっていました。
例えば予約を入力するという操作はモバイルで行うことはほとんどなく、当日の予約状況の確認などがメインとなります。

なのでPCとモバイルでも使えるレスポンシブなデザインにするよりは、PCでの画面サイズ&使用感に特化するように作りました。
モバイル版については別アプリケーションとして作るか、iOSアプリで作るなどこちらもモバイルに特化した形で作り直すように検討中です。

## 状態管理
<img width="244" alt="スクリーンショット 2018-12-10 13.06.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/36813/6801d8a1-84f4-38cc-6190-b91886fd0d9c.png">

状態管理のライブラリとしてNgrxを入れました。
正直この時点での規模・開発人数を考えるとそこまで必要はないとも思いますが、表示と入力フォームが連動する画面のような複雑な部分は、stateを一元管理しておくととても扱いやすくなりました。


# おわりに
> エンジニアリングの力で飲食業界の働き方をデザインするフロントエンドを募集！

お決まりの[We are hireing!](https://www.wantedly.com/projects/183961)

トレタはiPadアプリがメインのサービスなので、今回のトレタマネージャーのようなWeb版はわりと日陰な存在になりがちではありますが、その他にもレストランWEB予約やiPadアプリのWebView、新規事業などフロントエンドで活躍する場は山ほどあるので、フロントエンドエンジニアの採用を積極的に行なっています。
Watson Assistant資料(v2新アーキテクチャ)

2018年12月8日に、IBM Cloud Community Summit 2018で発表したWatson Studioの新アーキテクチャ紹介資料をアップしましたので、ご紹介します。

[Watson Studioが新ステージへ](https://speakerdeck.com/makaishi2/20181208-bluemix-assistant-1210-1)

画面サンプル

![スクリーンショット 2018-12-10 13.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/206130/2a32df7d-5f0f-103a-dd41-3004c78d23e6.png)


![スクリーンショット 2018-12-10 13.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/206130/bfd2b908-69c6-2b2d-1459-a0bde592ef6d.png)
Java7環境ではhashのforEachに気をつける

Kotlinで書いたプログラムをJava7な環境で動かしたら罠にかかったので自分用にメモします。

## 起きたこと

以下のようにHashmapにforEachで処理を書くと、Java8以降では問題ないのにJava7の環境下ではエラーが発生して実行できません。

```kotlin

    val hash = hashMapOf("hoge" to "fuga", "foo" to "bar")

    hash.forEach { key, value ->
        System.out.println("$key is $value")
    }
```

```
Exception in thread "main" java.lang.NoClassDefFoundError: java/util/function/BiConsumer
```

## 解決方法
``` forEach{ key, value ->}```を``` forEach{ (key, value) ->}```とするか、もしくは``` forEach{ entry -> entry.key}```とする。

### 動くコード
```kotlin

    val hash = hashMapOf("hoge" to "fuga", "foo" to "bar")

    hash.forEach { (key, value) ->
        System.out.println("$key is $value")
    }
```

## どうしてこうなるのか
()のあるなしでそんな違いがあるのかと思いますが、大ありでした。

最初のように```forEach{key, value ->}```と書いた場合、java.util.HashMapのforEachメソッドが直接呼びされます。
このメソッドの定義は以下の通り。

```java
    public void forEach(BiConsumer<? super K, ? super V> action) {
        Node<K,V>[] tab;
        if (action == null)
            throw new NullPointerException();
        if (size > 0 && (tab = table) != null) {
            int mc = modCount;
            for (int i = 0; i < tab.length; ++i) {
                for (Node<K,V> e = tab[i]; e != null; e = e.next)
                    action.accept(e.key, e.value);
            }
            if (modCount != mc)
                throw new ConcurrentModificationException();
        }
    }
```
ご覧の通り、keyとvalueのセットをBiConsumerで受け取っているのがわかります。
このBiConsumerはJava8で導入されたものなので、Java7環境では当然動かなかったということでした。

一方で動くケース(```forEach{(key, value) ->}```や``` forEach{ entry -> }```)ではkotlin.collectionで定義されているforEachメソッドが呼ばれるので、7以前のJavaでも問題なく実行できます。

そろそろJava7の環境もなくなってくると思いますが、もし7で動かす可能性のあるプログラムなら気をつけておきたいところです。

## 参考
[https://stackoverflow.com/a/46397602](https://stackoverflow.com/a/46397602)
rbenv/ruby-buildのアップデート

## 概要
rbenvでrubyをインストールしている場合、最新バージョンのrubyをインストールするにはrbenvをアップデートする必要があります。
OSによって手順が違ったりするので、その手順のメモ

## MacOSの場合
- rbenvのアップデート

```
%brew update
```

- ruby-buildのアップデート

```
%brew upgrade ruby-build
```

## Linux(ubuntu)の場合
- rbenvのアップデート

```
$ cd ~/.rbenv
$ git pull
```

- ruby-buildのアップデート

```
$ cd ~/.rbenv/plugins/ruby-build
$ git pull
```

## インストール可能なrubyバージョンの確認

```
%rbenv install --list
```
生産性の高いエンジニアと低いエンジニアの市場価値ギャップを意識して働きたい。爆速・超低コスト・高クオリティの報連相をしよう。

- Aさんの生産性はBさんの10倍あるとする。
- BさんがAさんに話しかけることで、この1時間のBさんの生産性は2倍になり、Aさんの生産性は半分になるとする。

# 大損害！

うっ。

# 爆速・超低コスト・高インパクトの報連相

- エンジニアやマネージャーにかかわらず、お互いの生産性の大小を常に計算しながら連絡の可否を考えてみよう。
- 生産性は「時間」対「プロジェクトに対するインパクト」と考えても良い。
- 生産性の高い人にこそ事前準備をたくさんして、高クオリティ、超低コストの爆速連絡をすべし。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Phinxでマイグレーションファイルのテンプレートをカスタムする方法

Phinxでマイグレーションを生成するとき、カスタムしたテンプレートファイルを使いたいことがある。

そのような場合は、Phinxの設定でマイグレーションファイルの雛形を指定することができる。

phinx.ymlに`templates.file`の設定を加え、そこにテンプレートファイルのパスを書く:

```yaml
paths:
    migrations: '%%PHINX_CONFIG_DIR%%/db/migrations'
    seeds: '%%PHINX_CONFIG_DIR%%/db/seeds'

templates:
    file: '%%PHINX_CONFIG_DIR%%/db/MigrationTemplate.php.tpl'

environments:
    default_migration_table: phinxlog
    default_database: development
    production:
        adapter: mysql
        host: localhost
        name: production_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

    development:
        adapter: mysql
        host: localhost
        name: development_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

    testing:
        adapter: mysql
        host: localhost
        name: testing_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

version_order: creation
```

テンプレートファイルを置く:

```php:db/MigrationTemplate.php.tpl
<?php

declare(strict_types=1);

use $useClassName;

/** @noinspection AutoloadingIssuesInspection */
class $className extends AbstractMigration
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    addCustomColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Any other destructive changes will result in an error when trying to
     * rollback the migration.
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change(): void
    {
    }
}
```
ベイズ最適化シリーズ（5）　－リアルな実験で使ってみたい－

ベイズ最適化シリーズ5回目。
今回は、リアルな実験でベイズ最適化を使う方法をご紹介します。

[ベイズ最適化シリーズ（1）　－ベイズ最適化の可視化－](https://qiita.com/shinmura0/items/2b54ab0117727ce007fd)
[ベイズ最適化シリーズ（2）　－アンサンブル学習（Voting）の最適化－](https://qiita.com/shinmura0/items/bcc8c4a06b9a49c943d6)
[ベイズ最適化シリーズ（3）　－XGBoostのハイパーパラメータ探索－](https://qiita.com/shinmura0/items/b2ddd8dfc16a321ec14c)
[ベイズ最適化シリーズ（4）　－ゲームの攻略－](https://qiita.com/shinmura0/items/fef75758679f887ae7e7)

![scince_jikken.png](https://qiita-image-store.s3.amazonaws.com/0/264781/e3527f9b-0d51-948b-54f4-6e551ee6b642.png)

#リアルな実験でベイズ最適化
ベイズ最適化は、機械学習のパラメータ設定のみならず、化学実験や物理実験などの**リアルな実験でも威力を発揮します。**

今回はGPyOptを使い、リアルな実験を想定したコードを書いてみました。


#実験のながれ

今回想定している実験の流れを下記に示します。

+ 予備実験のデータを2つ持っている。（予備実験のデータを持っていない場合でも対応できます。）
+ 予備実験のデータをGPyOptに投げ、最初の実験条件を提示してもらう。
+ ①提示された条件で実験を行い、実験結果を入力する。
+ ②実験結果をGPyOptに投げ、次の実験条件を提示してもらう。
+ ①と②を繰り返し、規定回数まで行うと実験終了。
+ 最後に、最適な実験条件を提示してもらう。

とりあえず、コードをコピペして動かしていただければ、何をやっているかは分かるかと思います。

#問題設定
本当は、ピタゴラスイッチ的な実験装置を用意したかったのですが、時間の都合上、数値計算で代替しました。

以下のyの最小値を求める問題を考えます。

```math
y = x^2
```

GPyOptからxが提示されますので、yを計算後、入力するものです。

皆さんが実験する際、上記の式は未知だと思いますので、xを実験条件、yを実験結果に置き換えて使ってみてください。

#コード

```py
import GPy
import GPyOpt
import numpy as np

#予備実験のデータ
initial_x = np.array([-1, 0.5])
initial_y = np.array([1, 0.25])

initial_x = initial_x.reshape((-1,1))
initial_y = initial_y.reshape((-1,1))

#実験回数
exp_num = 5

try_ = 1

def f(x):
    global try_
    
    print("Try : " , try_ , " / {0} , next x is ".format(exp_num) , x)
    score = float(input("Input y : "))
        
    try_ += 1
    
    return score

bounds = [{'name': 'a', 'type': 'continuous', 'domain': (-2,2)}]#実験条件の範囲

print("Bayesian Optimization")

#予備実験のデータを持っていない場合はinitial_design_numdataの値を変更
myBopt = GPyOpt.methods.BayesianOptimization(f=f,
                                             domain=bounds,
                                             X = initial_x,
                                             Y = initial_y,
                                             initial_design_numdata=0)
myBopt.run_optimization(max_iter=exp_num)

#最適なパラメータ
print("Best x is ",myBopt.x_opt)
```

ベイズ最適化の際に、渡す変数は[こちら](https://github.com/SheffieldML/GPyOpt/blob/master/GPyOpt/methods/bayesian_optimization.py)を見ていただければ分かります。


#結果
上記のコードを走らせると以下のような結果になります。
なお、Input yの部分は私が手計算して、入力しています。

```
Bayesian Optimization
Try :  1  / 5 , next x is  [[0.60906033]]
Input y : 0.36
Try :  2  / 5 , next x is  [[0.21945366]]
Input y : 0.0479
Try :  3  / 5 , next x is  [[2.]]
Input y : 4
Try :  4  / 5 , next x is  [[-0.087055]]
Input y : 0.0064
Try :  5  / 5 , next x is  [[0.01745743]]
Input y : 0.000289
Best x is  [0.01745743]
```

ということで、最適なxは「0.01745」と求められました。
解析的には「0」が最適値ですので、ほぼ到達できたかと思います。

一応、アニメーションにしてみました。

![movie (2).gif](https://qiita-image-store.s3.amazonaws.com/0/264781/2631fa00-8ae9-51e0-52ed-124bb9a59438.gif)


青い点は予備実験のデータで、赤い点はベイズ最適化で実験したものです。
Angular: Font Awesomeのアップデート（v4→v5）

## はじめに
現在のプロダクトで、[Font Awesome 5.0.0](https://fontawesome.com/) 以降のアイコンを使いたくなり、v5にバージョンアップしました。
v5では、Pro版が出たり、アイコンの名称が変わっていたりと、何かと変更があったみたいでアップデートもすこし手間取ったのでこちらに残しておきます。
前提ですが、Anguar-CLI環境を想定しています。

アップデート内容は[こちらの記事](https://qiita.com/tamaina/items/4a0747bf20296e0aab15)におまかせしたいと思います。。

## アイコン名の変更について
私の環境では問題なかったのですが、アップデートによっていままでのアイコン名を変更する必要があります。
[v４からのアップデート方法](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4)に細かい変更手順がありますので、参考にしてみてください。

## v4からのアップデート手順
 １. 古いfontawesomeのアンインストール

```console
npm uninstall fontawesome
```

 ２. 新しいfontawesome のインストール(パッケージ名が変わっています！)
なぜか分かりませんが、```font```ではなく```fort```になっておりますので、タイプミスに気をつけてください！

```console
npm install --save-dev @fortawesome/fontawesome-free
```

 ３. 「.angular-cli.json」(angular-cli v4以降の方はangular.json)の書き換え

※angular-cliのバージョンによってパスの書き方が異なりますので、適宜環境に合わせてください

```.angular-cli.json
"styles": [
"../node_modules/font-awesome/css/font-awesome.css",
"styles.scss"
],
```
↓

```.angular-cli.json
"styles": [
"../node_modules/@fortawesome/fontawesome-free/css/all.css",
"styles.scss"
],
```
先ほどと同じく、最初のディレクトリパス名が```font```ではなく```fort```になっておりますので、タイプミスに気をつけてください！

## 補足
私は[angular-font-awesome](https://www.npmjs.com/package/angular-font-awesome)というパッケージも使っているのですが、こちらのアップデートは不要でした。

また、別パッケージや別テンプレートとの依存関係がある場合もありますので、ご留意ください。
v4とはパッケージ名別なので、共存できるのかな、などと考えてはみましたが試してません。すみません。
Docker で Volume 名を変更する

Docker では Volume 名の変更は気軽にできない。

変更できるようにしてほしいという要望は昔から上がっているが、今のところ実装される見込みはないようだ。

[Rename docker volume · Issue #31154 · moby/moby](https://github.com/moby/moby/issues/31154)

Issue でも言及されているが「新しい Volume に全てコピーして古い方を消す」ことで Volume 名の変更に相当する操作が行える。

``` console
$ docker volume create --name <new_volume>
$ docker run --rm -it -v <old_volume>:/from -v <new_volume>:/to alpine sh -c "cp -av /from/* /to"
$ docker volume rm <old_volume>
```
壁を殴れるChrome拡張機能を作った💪💪💪

こちらは[クソアプリ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app)の11日目の記事です。
クソアプリ作りてぇな〜〜とずっと思ってたので参加できてうれしいです😺

<span style="color: #ff0000"><b>なんかたま〜にイラッとして壁殴りたくなるときありませんか？</b></span>
壁殴り代行もいいですが、やっぱ自分も壁殴りたいですよね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152303/b15ebfc6-d44c-2eac-45d8-545c85d6eb89.png)


ということで壁殴りができるChrome拡張機能「かべなぐり」を作りました！

[インストールはこちら](https://chrome.google.com/webstore/detail/%E3%81%8B%E3%81%B9%E3%81%AA%E3%81%90%E3%82%8A/ogbkmndkngibajlacagingmcpkbbjijp?hl=ja)

## どういう機能？
壁（というかページ）を殴れる拡張機能です。以下の動画を見てください！
![kabe.gif](https://qiita-image-store.s3.amazonaws.com/0/152303/88013ff1-994a-12c6-da86-5944ee50f6d9.gif)


## インストール方法
Chrome拡張機能ですのでChromeのみです
https://chrome.google.com/webstore/detail/%E3%81%8B%E3%81%B9%E3%81%AA%E3%81%90%E3%82%8A/ogbkmndkngibajlacagingmcpkbbjijp?hl=ja

## 使い方
インストール後は殴りたいページを再読込してください〜！

インストールするとアドレスバーの横に以下のような殴るマークが出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152303/afeb2cb3-4bd2-9fe7-9687-d29e47cacfab.png)


ここの背景が**赤い**と有効、**白い**と無効になります。ボタンを押すとこれが切り替わります。

有効にしたら、あとはクリックしまくるだけ！
左クリックを長押しするとパワーが溜まってより強く殴れるぞ！！！（**音が出るので注意！**）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152303/a552b1d2-0e40-e77f-e782-dbb1434e5976.png)

どこのサイトでも殴れるんですが、人のサイトで殴るのもなぁ・・・というのは当然あると思うので
殴る用の壁を用意しました。お使いください。
https://youthful-wing-49f21e.netlify.com/

## これを作るにあたっての知見
### Chrome拡張機能の公開に審査が入った
このChrome拡張機能はどこのサイトでも動きます。
Chrome拡張機能には**マニフェストファイル**というものが必要で

* Chrome拡張機能の名前
* 説明文
* アイコン画像のパス
* 権限

などを設定することができます。  
その際の「権限」についてですが、これは  

* ChromeのどんなAPIを使いたいか
* どのURLで動くようにするか

を設定できます。
設定できる権限一覧は[こちら](https://developer.chrome.com/extensions/declare_permissions)

どのURLで動くようにするかは以下のように指定できます。  

```
"permissions": [
  "tabs",
  "bookmarks",
  "http://www.blogger.com/",
  "http://*.google.com/",
  "unlimitedStorage"
],
```

今回作った「かべなぐり」はどのURLでも動きます。
そういったChrome拡張機能を作った場合、どうやら審査が必要になったようです。（ちょっと前にもChrome拡張出したがそのときは審査なかった）

Chrome Webストアで公開する前に以下のような警告文が出ました。

>公開に遅れが生じます  
>次の問題により、お客様の拡張機能は詳しい審査が必要となる可能性があります。  
>- 広範囲のホスト権限  
>広範囲のホスト権限をリクエストする代わりに、activeTab 権限を使用するか、拡張機能によるアクセスが必要なサイトを指定することをご検討ください。いずれの方法も、不確定の数のサイトへのフルアクセス>を許可する方法と比べて安全で、審査にかかる時間を最小限に抑えることができます。  
>
>activeTab 権限では、ユーザーの明示的な操作に対してタブへのアクセスを許可します。  
>
>{
>...
>"permissions": ["activeTab"]
>}
>拡張機能が特定のサイトでのみ必要な場合は、拡張機能のマニフェストでそのサイトを指定してください。  
>{
>...
>"permissions": ["https://example.com/*"]
>}

![image (33).png](https://qiita-image-store.s3.amazonaws.com/0/152303/80b7d4c4-989a-5661-4ae8-4c6d8ce80701.png)


この警告が出たので`permissions`に`activeTab`を指定して公開したところ**審査待ち**になってしまいました。
当初この記事は3日目に出す予定だったのですが、間に合わなさそうなので主催の[あんど](https://twitter.com/ampersand_xyz)さんに代わっていただきました。ありがとうございます・・・！！

そして申請してから**約4営業日目**でようやく公開になりました。
`permissions`に`activeTab`をつけると審査の時間が最小限になると書いてあったので、最小限がこれくらいなのでしょう。
たぶんアプリによって前後するとは思いますので一概には言えません。参考程度に！

## 最後に
クリックで発火するので非常に邪魔です。殴りたいときだけ「かべなぐり」を有効にしましょう！！！

あとChrome拡張機能は公開日が決まってるなら早めの確認をおすすめします。
Excelの入力規則でつくる食卓カレンダー

この記事は、[富士通ソーシアルサイエンスラボラトリ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ssl)の 15 日目の記事です。

---
  
と名を打ってみましたが、やってることは単なるデータの入力規則によるリスト作りです。。 

# はじめに 
お仕事柄、Excelには大変お世話になっているので、普段使っているExcelの入力規則を使いつつ、
簡単な食卓カレンダーを作ってみようと。
もういくつ寝ると～的なやつをイメージしてみた感じです。

# できたもの
こんな感じで。
見た目は単純なリストですが、入力規則を使って選択されたイベントに対応する日付や食べたいものリストを動的に選択できるようになっています。
入力規則の動的リスト作成って色んな人がもう既に記事にされていますが気にしない！

![食卓カレンダーみたいなもの.png](https://qiita-image-store.s3.amazonaws.com/0/314171/b530c495-9080-2e27-362f-4e090ae53033.png)

# 使っている数式
- IF
- OFFSET
- MATCH
- COUNTIF
- COUNTA

# データの入力規則について
Excelの入力規則でリストを作る場合、『VLOOKUP』なんかが大活躍することも多いかと思いますが､『VLOOKUP』だと参照先の項目表に自由度が持たせられないので、色々とこうしたいな～というところがやりにくかったり。
(基準となるキー項目は一番左の列に置かないといけないとか、複数キーを持たせたいときはどうするとか)

そんなときに活躍してくれるのが<font color="Red">**『OFFSET』**</font>だったりするわけです。この辺りの情報はQiitaにも沢山投稿されていますね。~~（つまり二番煎じ？？）~~


ちなみに『食卓カレンダー』のワークシートから入力規則で参照している『項目』ワークシートの内容はこんな感じ。

![入力規則用の項目.png](https://qiita-image-store.s3.amazonaws.com/0/314171/a7c72d3b-ec3b-21b8-7b47-2145cafd88ef.png)

『VLOOKUP』だと「イベント」、「日付」、「食べるもの」なんかはまとめて表にする必要がありますが、『OFFSET』を使えばそれぞれで切り分けられるという利点。
お仕事的な話でいくと、例えば「イベント」、「日付」、「食べるもの」の各項目を試験工程の「大区分」、「中区分」、「小区分」なんかに置き換えて試験項目一覧なんかをつくれますよね～的な。

# 実際に使っている入力規則

### ■イベント名
![イベント名の入力規則.png](https://qiita-image-store.s3.amazonaws.com/0/314171/52d97991-f4a1-1e4a-aa41-48431577e5d2.png)

```
=OFFSET(項目!$B$3,0,0,COUNTA(項目!$B$3:$B$100),1)
```

### ■日付
![日付の入力規則.png](https://qiita-image-store.s3.amazonaws.com/0/314171/9b81eb21-261b-d32f-7b2f-54f65227ba0c.png)

```
=IF($B3<>"",OFFSET(項目!$F$3,MATCH($B3,項目!$E$3:$E$100,0)-1,0,COUNTIF(項目!$E$3:$E$100,$B3),1),$A$1)
```

### ■何を食べたい？？？
![何を食べたい？？？の入力規則.png](https://qiita-image-store.s3.amazonaws.com/0/314171/4c192f5d-211b-7830-2750-527be5d02814.png)

```
=IF($C3<>"",OFFSET(項目!$J$3,MATCH($B3,項目!$I$3:$I$100,0)-1,0,COUNTIF(項目!$I$3:$I$100,$B3),1),$A$1)
```

### ■採決
![採決の入力規則.png](https://qiita-image-store.s3.amazonaws.com/0/314171/c193abd0-cee1-1fd3-3456-6628445a1407.png)

```
=OFFSET(項目!$M$3,0,0,COUNTA(項目!$M$3:$M$100),1)
```
  
  
入力規則の『COUNTA』や『COUNTIF』、『MATCH』でそれぞれの項目数よりも大きい値（```$B$3:$B$100```とか）を持たせている理由は、それぞれに対応する項目が増えたときに数式を再度変更しなくてもいいようにという理由からです。
つまり、突然イベントが増えた場合でも『項目』ワークシートの「イベント」の下に項目を追加するだけで入力規則の数式は変えなくて大丈夫！という手抜きテクニック。
なので、この幅は「```$B$3:$B$100```」でなく「```$B$3:$B$1000```」なんかでもいいわけですが、数式の計算コストは気にしておく方がいいかもですね。

## 補足
上記の数式を見れば一目瞭然ですが、『日付』と『何が食べたい？？？』の列の入力規則では、『IF』を使って前列の入力状態に応じて入力できるデータ内容を分けています。
つまり、『イベント名』が入力されていないと『日付』は入力できず、また『日付』が入力されていないと『何が食べたい？？？』も入力できません。

![イベント名が入力されていない場合の日付選択.png](https://qiita-image-store.s3.amazonaws.com/0/314171/c4769e3b-d99e-e99a-e28f-c6a567d14ee4.png)
![日付が入力されていない場合の何が食べたい？？？選択.png](https://qiita-image-store.s3.amazonaws.com/0/314171/ca00b435-5fc9-fd5f-69e1-99476d1786ad.png)

こんな感じで。何故こういう規則にしたかは、完全に個人の趣味嗜好です。

## さいごに
お仕事でExcelを使う機会が大変多いので、その仕事で覚えた入力規則のやり方を使って動的にリスト作成を行い、食卓カレンダーみたいなものを作ってみました。
何やらOffice 2019からはVLOOKUPが高速化される[^1]とかあったりするので、入力規則周りはまた色んなテクニックが生まれる気もしますね。今後のExcelさんの活躍に期待？！


[^1]: https://www.microsoft.com/en-us/microsoft-365/blog/2018/09/24/bringing-ai-to-excel-4-new-features-announced-today-at-ignite/
Pythonのasync/awaitで任意のユーザー定義イベントを待てるようにする

Python 3.5で追加されたasyncioモジュールによって、ネットワークのI/Oやサブプロセスの起動を非同期に行うことができるようになった。
ここで非同期といっているのはスレッドによるものではなく、coroutineによるものを考えている。大量（数千、数万規模）の非同期な処理を同時に行えるようになっている。

asyncioは基本的にはI/Oの処理を非同期に行うためのライブラリだが、これを任意のイベントを`await`で待てるようにする方法をここでは考える。具体的には例えば

- 特定のファイルが作られるまでawaitする
- DBの特定のレコードが更新されるまでawaitする
- ネットワークの入力で特定のバイト列がくるまで待つ

のようなケースを考えている。

ここではcoroutineが何かという部分については説明しない。またPythonのasync/awaitについての基本的な使い方は前提知識として持っていることを前提としている。
Pythonのasync/awaitについては[公式ドキュメント](https://docs.python.org/3/library/asyncio-task.html)の説明が一番正確でわかりやすいので、こちらを参照することをオススメする。

# 前提条件

- Python 3.7

# 実装例

ここでは具体的に、coroutineの中で指定した名前のファイルが作られるまでawaitするケースを考える。
"foo", "bar", "baz"という３つのファイルが作られるのを監視し、それぞれのファイルが作られたら "File {filename} is found" と表示したいとしよう。
ここで、３つのファイルがどういう順番で作られてもよいものとする。
awaitを使って特定のファイルを待つというようなコードをかけるようにする。具体的には以下のようなコードをかけるようにする。

ここの`filecheck`というモジュールは標準ライブラリではなく、これから実装していくものである。

```py:main.py
import asyncio
import filecheck

async def user_func(f):
    await filecheck.watch_file(f)
    print(f"File {f} is found")

async def main():
    await asyncio.gather(
            user_func("foo"),
            user_func("baz"),
            user_func("bar")
            )
    print(f"All files are found")

filecheck.async_run( main() )
```

通常のcoroutineの場合は`asyncio.run( coroutine )`でイベントループを起動するが、ここでは代わりに`filecheck.async_run()`を呼ぶ。
また、「ファイルが作成されるまで待つ」という処理は `await filecheck.watch_file(f)` という処理で書かれている。
`main`の中で３つのファイルを監視するための３つのcoroutineが作成されて非同期に実行されている。

このファイルを実行する(`python main.py`)と、最初は何も表示されないが、別の端末で`touch foo`などというようにファイルを作ると"File foo is found"という文字列が標準出力に表示される。

## filecheck.pyの実装

ではfilecheck.pyはどのように実装すれば良いか？以下が実装例になる。

```py:filecheck.py
import os,asyncio
from collections import defaultdict

_file_events = defaultdict( list )

async def watch_file(f):
    event = asyncio.Event()
    _file_events[f].append(event)
    await event.wait()

async def _event_loop_for_file(task, interval=1):
    while not task.done():
        finished = []
        for f,events in _file_events.items():
            if os.path.exists(f):
                for e in events:
                    e.set()
                finished.append(f)
        for f in finished:
            del _file_events[f]
        await asyncio.sleep(interval)

def async_run(coroutine):
    async def _main():
        t = asyncio.create_task(coroutine)
        await asyncio.gather(
                t,
                _event_loop_for_file(t)
                )
    asyncio.run( _main() )
```

動作原理は

- ファイルを監視するためのループを行うcoroutine(`_event_loop_for_file`)を自分で定義し実行
- ユーザーから渡されたcoroutineも実行
- ユーザーcoroutineの中で、`watch_file`メソッドを呼び監視対象となるファイルを登録する。そのファイルができるまで`Event.wait()`で待つ。
- `_event_loop_for_file`では定期的にポーリングし、ファイルが作成されたら`Event.set()`でユーザーのcoroutineに通知する。
- ユーザーcoroutineとevent_loop_for_file は`_file_events`という辞書を経由してイベントを共有している。

ということを行なっている。

ちなみに`asyncio.Event`クラスは複数のcoroutine間で同期を取るためのクラスの一つ。（参考 : https://docs.python.org/3/library/asyncio-sync.html ）

ここではファイルの存在検出までawaitするようにしたが、これを応用すれば任意のイベントを`await`で待てるように実装できる。
インフラエンジニアさんに教わった「秘密の質問」のハイブリッドな答え方。例: ニックネームを聞かれたら国の名前を答える。

- 秘密の質問はセキュリティの穴になる。
- なので、僕は今までは無回答にしていた。ランダムな文字列で埋めていた。だけどこれだと自分でも思い出せない。
- バカ正直に答えるのではなく、自分だけが覚えられる独自ルールを作っておくのが良さそう。ハイブリッド！やり方はタイトルの通り。

# 最近は

- 質問自体自分で設定できるのが主流？
- それでも「うかつな質問」を自分で作ってしまう可能性はあるよね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/51baac2e-3002-cae6-8585-792c56811b51.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/0ca5dad0-cb72-5345-1957-0cb1da94b4ee.png)











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Immutable classes and propertiesについて

こんにちは。

LocoPartnersでReluxのサーバーサイドを担当している山口です。
この記事は「Relux Advent Calendar 2018」10日目の記事です。

本日はphp rfcで議論中になっているものから、個人的に取り込まれると楽しそうだなと感じている [Immutable classes and properties](https://wiki.php.net/rfc/immutability) という提案について紹介を行っていきたいと思います。

紹介と言っても元ページの内容を書いてるだけですが、php rfc自体に今まで興味がなかった人が興味を示すキッカケとなってくれると幸いです。また、議論中のものなので **最終的にどういった形で取り込まれるのか** や **そもそも取り込まれるのか** は誰にも解りません。

---

### Immutable classes and properties

php自体にImmutableなClassとPropertyを設定可能な機能を導入してみませんかという提案です。現時点(2018/12/10)で提案されている例は下記になります。

### Immutable Class

```php
immutable class Email {
  public $email;
 
  public function __construct ($email) {
    $this->email = $email;
  }
}
 
$email = new Email("foo@php.net");
$email->email = "bar@php.net" // Call will result in Fatal Error
```

```php
immutable class Foo{}
class Bar extends Foo{} // Will result in Fatal Error
```

Immutable Classを用いるとClassのPropertyはImmutableとして暗黙的に設定されます。これによりgetterなどで取得する必要のあるPropertyを安心して `public` として `ImmutableClass->attribute` などで値を取得することが出来そうですね。

もう、`getEmail()`といったgetter用のfunctionを用意したりする手間や、どこかで値が変わることに心配する必要も無くなるのでしょうね、

また、継承を行う際は継承を行う子クラスもImmutable Classである必要があることや、参照を利用した値の変更も不可となっています。

### Immutable Properties

```php
class User {
  private $id;
  public immutable $email;
 
  public function __construct ($id, $email) {
    $this->id = $id;
    $this->email = $email;
  }
}
```

```php
immutable class Email{}
 
class User {
  public immutable $email;
 
  public function __construct (Email $email) {
    $this->email = $email;
  }
}
```

Classの一部のPropertyにImmutable Propertyを用いることも可能です。
しかし、下記のように幾つかの制約があります。

- Immutable Propertyにオブジェクトが代入される場合、代入するObjectもImmutableである必要があること。
- Immutable PropertyにResource(ファイル等)であるものは割り当てることはできないこと。
- Immutable Propertyに配列は割り当てることができないこと。
- 子クラスで親クラスのImmutable Propertyをoverrideする場合は子クラスでもImmutable Propertyとして宣言する必要があること

### 比較

```php
immutable class Email {
  public $email;
 
  public function __construct ($email) {
    // validation
 
    $this->email = $email;
  }
}
 
$email1 = new Email("foo@php.net");
$email2 = new Email("foo@php.net");
var_dump($email1 === $email2); // bool(true)
```

ImmutableなObjectの場合には通常のObjectとは異なり、型とその中に設定されているプロパティの値が同じである場合は同一としてみなされます。

### MoneyPatternの実装例

元ページには、この他にMoneyPatternと呼ばれるものを用いてのImmutable Classを用いた場合と用いない場合での具体例な実装例が記載されています。興味がある方はそちらも是非ご覧になってください。

### さいごに

現時点でも、開発者側で独自に実装をすることでImmutableなClassやPropertyを実装することは可能ですが、統一された方法が言語として用意され`immutable`と付与されていればImmutableであることを保障してくれるのが嬉しいですね。

それでは、明日も引き続きRelux Advent Calendar 2018をお楽しみください。
Ionicの動作が遅いという時にチェックするべき覚書

軽快に動くはずのIonicアプリが遅い。これはなぜだ？！？！というときにチェックしてほしい項目をご紹介します。「Cordovaだから遅いんだ！！」「ネイティブじゃないとだめだ！！」と思考停止する前にご確認いただけましたら幸いです。

この記事は、[Ionic Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ionicframework)の記事です。思いついたら追記していきます。また、「これも遅くなる要因じゃない？」というのありましたらコメントにてご教示いただけましたら幸いです。

#1. エミュレータで確認している
`Xcode`や`Android Studio`のエミュレータでは、動作自体を確認することはできますが、挙動は実用的ではありません。

なぜこんなに遅いの？！？！と驚くほど遅いので、操作性の確認をする時は必ず実機でご確認ください。あわせて、Ionicは、デバイスでリアルタイム確認するための`ionic DevApp`がありますので、そちらの利用をご検討ください。

#2. AOTビルドしていない
といっても、`ionic DevApp`は本番ほど速くはありません。
Ionicでは、本番用ビルドは `--prod` をつける必要があります。詳しく知りたい方は、[Angular AoTガイド](https://qiita.com/Quramy/items/a603ddb47d6e4b3497e1)をご覧ください。

`ionic cordova build [device]` だけでビルドしてる場合、JITビルドになっています。本番同様の速度を確認したい場合、AOTビルドしてからデバイスを接続してご確認ください。

#3. タップできない要素にクリックイベントをつけている
`(click)`イベントは、クリック可能な要素（`<button>`など）では問題ありませんが、それ以外の要素で利用すると、300ms遅延することがあります。これは、シングルタップかダブルタップかをデバイスが判定待ちするためです。

判定待ちを削除するために、Ionicでは`tappable`というディレクティブを用意しています。`<div>`などに`(click)`イベントをつける場合は必ずご利用ください。

```html
 <div tappable (click)="doClick()">I am clickable!</div>
```

#4. UIWebViewを使ってる（iOS）
`WKWebview`をお使いください。2018年になってからプロジェクトを作成した方はデフォルトが`WKWebview`になってるので問題ありませんが、2017年以前にプロジェクトを作成した方は念のために確認しておいた方がいいです。

https://ionicframework.com/docs/wkwebview/

不具合も多いUIWebViewからはさよならしましょう。

#5. LazyLoadingなのに、preLoadingしていない
これはCordovaだと関係ないかもしれません。が、PageをLazyLoadingしていると、遷移毎に遷移先のページを読み込むことになるので、preLoadingしてる方が精神衛生的にいいかと思います。

```app.module.ts
IonicModule.forRoot(MyApp, {
  preloadModules: true
})
```

#6. 遅くなる処理を入れてる
イベントリスナー立てまくってるとか、Observableのunsubscribe漏れとか、重い処理を走らせてるとか、起動時に不要なAPIを叩きにいってるとか、メモリ上に膨大なデータを保持してるとか（Redux的に）。

#まとめ
WebViewなので（しかもファイルはローカルにある！）、Webで表示する以上に遅い場合は必ず設定漏れや何かの要因があります。「Ionicが遅い」「Cordovaが遅い」という前に、自分が書いたコードを見直していただけましたら幸いです。
Webをもっと信じよう。

それでは、また。
[AWS]CloudFormationテンプレート の概観

# CloudFormationテンプレート の概観

## 書いている人

CloudFormationをこれから使っていく初心者です。
自分の理解の整理のために書いていますので、間違っていることも多いと思います。
指摘などしていただけると助かります。

## Overview

### Refalence(本家)

- [本家リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/Welcome.html)
- 情報が古くなっている可能性、誤解がある可能性があります。
- こちらの記事はあくまで参考として、本家のリファレンスを活用する補助程度にご利用ください。

### 用語(テンプレート要素)

- Metadata メタデータ
  - オプションの Metadata セクションを使用して、テンプレートの詳細を提供する
  - 特定のリソースについてのテンプレートの実装の詳細を含めるなど
- Parameters パラメータ
  - 定義したパラメータは、スタック作成時に動的に指定し、各リソースのパラメータに利用することができます。
  - パラメーターは最大 60 個です。
  - 正規表現を使ったチェックも可能
  - AWS固有のパラメータ型なども指定可能
- Mappings　マッピング
  - キーと名前付きの一連の値とが対応付けられます。
  - たとえば、リージョンに基づく値を設定する場合、リージョン名をキーとして必要な値を保持するマッピングを作成します。
- 条件 Conditions
  - 条件の結果に応じてリソースを作成することができます。
  - テスト環境と本稼働環境など、異なるコンテキストでリソースを作成できるテンプレートを再利用する場合に、条件を使用することがあります。
  - Parametersを参照し、Resources および Outputsを操作します。
- 変換 Transform
  - AWS インフランストラクチャの式をコードとして要約し、テンプレートコンポーネントを再利用できるようにすることで、テンプレート作成を簡素化します。
  - 変換の種類として、AWS::Serverless や AWS::Include をサポートしています。
  - AWS::Include 変換では、メインの AWS CloudFormation テンプレートとは別に保存されているテンプレートスニペットを利用します。
  - [AWS::Include](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/create-reusable-transform-function-snippets-and-add-to-your-template-with-aws-include-transform.html)
  - テンプレートのトップレベルに配置する場合と、リソース等のセクションに埋め込む場合があります
- リソース
  - スタックに含める Amazon EC2 インスタンスや Amazon S3 バケットなどの AWS リソースを宣言します。
- アウトプット
  - 欲しい結果を指定すればまとめて表示してくれる
  - ほかのスタックにインポートすることもできる。
  - 1 つのテンプレートで宣言できる出力は最大 60 個です。

## テンプレートの作成で使える関数

### 主な関数

|param|discription|
|:---|:---|
|Fn::Base64| 入力文字列の Base64 表現を返します
|Fn::FindInMap| Mappings セクションで宣言された キーに対応する値を返します。
|Fn::GetAtt| テンプレートのリソースから属性の値を返します。
|Fn::GetAZs| 指定されたリージョンのアベイラビリティーゾーンを含んだ配列を返します。呼び出し元のユーザーのアクセス権に適応するテンプレートを作成できます。
|Fn::ImportValue| 別のスタックによってエクスポートされた出力の値を返します。[別の AWS CloudFormation スタックのリソース出力を参照する](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html)
|Fn::Join| 一連の値を特定の区切り文字で区切って 1 つの値に追加します。
|Fn::Select| リストから 1 つのオブジェクトを返します。
|Fn::Split| 区切り記号で分割の場所を指定し、文字列のリストから要素を選択できるようにします
|Fn::Sub| 特定した値の入力文字列にある変数の代わりになります。
|Ref| 指定したパラメーターまたはリソースの値を返します。

### 条件関数

|param|discription|
|:---|:---|
| Fn::Not | false に評価される条件に対しては、true を返します。
| Fn::And | 指定されたすべての条件が true に評価された場合は true を返します。
| Fn::Or | 指定された条件のいずれかが true に評価された場合は true を返します。
| Fn::Equals | 2 つの値が等しいかどうかを比較します。
| Fn::If | 指定されたリストの０番目にある条件の評価に合わせて、リストの１番目か２番目の値を返します

## 参考

### ヘルパースクリプト

- スタックの作成・更新・削除などのイベントに合わせて EC2 インスタンス内部で処理を実行することができる
- イベント毎に発生させる処理の中身も指定出来る

### 疑似パラメータ

- パラメーターと同じように、Ref 関数の引数として使用します。

|param|discription|
|:---|:---|
|AWS::AccountId|スタックが作成されているアカウントの AWS アカウント ID 
|AWS::NotificationARNs|スタックの通知 Amazon リソースネーム (ARN) のリスト
|AWS::NoValue| 組み込み関数(Fn::If)の戻り値として指定すると、条件が false に評価された場合、対応するリソースプロパティを削除します。
|AWS::Partition|リソースがあるパーティションを返します。
|AWS::Region|AWS リージョンを表す文字列を返します。
|AWS::StackId|スタックの ID を返します。
|AWS::StackName|スタックの名前を返します。
|AWS::URLSuffix|ドメインのサフィックスを返します。
12-10 サウンドフォント


## サウンドフォントとは / MIDI音色とは

MIDIにはプログラム・チェンジ（C[n]h）やバンク・セレクト（B[n]h 00 [val]）というメッセージがあり、これを受け取ったMIDI楽器はそのチャネルの音色を指定された番号のものに変更します。バンク・セレクトはプログラム・チェンジの前に設定する「音色のバンクナンバー」であり、複数の音色がひとつのプログラムに割り当てられている場合に有用です。

ソフトウェアによってMIDI楽器を実現している場合、音色はデータで表現されます（ハードウェアが専用メモリにロードして処理する場合もありますが、音色がRAM上のデータで表現されることに変わりはありません）。音色はPCMデータで表現できます。音には音色・音量・音程がありますが、原理的には音量も音程も音声の加工によって対応可能です。つまり、PCMデータにプログラムおよびバンクナンバーを関連付けて、指定されたPCMデータをノート命令で再生できるようにすれば、MIDI楽器をソフトウェアで実現できるのです。

これがサウンドフォントという仕組みの、ごく大まかな原理です。サウンドフォントは複数のPCMファイルをパッケージしたものであり、これがGeneral MIDIの想定する音色番号と合致していれば、それはMIDI楽器としてソフトウェアで利用できるものになります。timidity++やfluidsynthはこの仕組みを利用しています。

## パラメーターによる波形の切り替え

実際には、サウンドフォントはそこまで単純な仕組みではありません。ピアノのような楽器では、鍵盤の位置（大まかにいえばオクターブ）によって音の出方が大きく異なります。管楽器では、息の吹き込み方で音量が大きく変わり、かつ音の出方も大きく変わります。MIDIメッセージでいえば、ノートのベロシティによって音色が変わるといえるでしょう。

サウンドフォントでは、音色が変化する可能性のある「ジェネレーター」「モジュレーター」に応じて波形を切り替えられるようなゾーニング機構を備えており、状況に応じて最適な音色を選択できるようになっています。（モジュレーターによる波形合成がソフトウェア的に大きな負荷なく行える現代において、どれだけ意味があるものなのかとは思いますが。）

## sfz、あるいはサウンドフォント以外の音色バンク構造

サウンドフォントにはいくつか種類がありますが、まず基本形としてsf2形式について説明します。sf2の構造は、大まかには次のようになります。

```
- サウンドフォント
  - プリセット定義
  - インストゥルメント
    - ゾーン配列
      - モジュレーター配列
      - ジェネレーター配列
        - 種別
        - サンプルヘッダー(ID)
  - サンプルヘッダー定義（オフセットなど）
  - サンプルデータ（単一）
```

「ジェネレーター」でどのようなパラメーターが考慮されているかは、NAudio（後述）のこのソースコードの列挙値を見ると分かりやすいかと思います。

https://github.com/naudio/NAudio/blob/master/NAudio/FileFormats/SoundFont/GeneratorEnum.cs

sf3はsf2では非圧縮だったサンプルデータを圧縮して格納するものです。

sf2/sf3とは互換性のない形式としてsfzというものがあります。これは類似の発想に基づいているものですが、オープンに仕様が開発されたもので、その後Calkwalkでメンテナンスが行われています。どのようなパラメーターが発音に影響を与えるか等の情報を詳細にまとめたサイトがあります。

http://drealm.info/sfz/plj-sfz.xhtml

wikipediaでは、sfzと類似した形式でNational InstrumentsのKontaktの`.nki`、`.nkm`などがデータを保存しているようです。

サウンドフォントとは異なる形式ですが面白いのはサンプリングを使ったトラッカーのようなエディターであるRenoiseが使用しているXRNI形式です。

筆者はsf2形式のファイルからXRNI音色バンクを作成するsf2xrniという軽量ツールを作成して公開したことがあります。Renoise自体あまりユーザーが多くはなさそうなのですが、未だに使われることがたまにあるようです。

https://github.com/atsushieno/sf2xrni

## サウンドフォントを扱うライブラリ

- sf2cute : C++で書かれたサウンドフォントの読み書きと構築ができるAPIです。
- NAudio : これ自体は主にWindowsしか考慮していないオーディオI/OのAPIを中心とするライブラリですが、この中にSoundfontの読み書きと構築ができるAPIが含まれており、これはクロスプラットフォームで利用可能です。筆者は前述のsf2xrniでこのAPIを利用しています。
- juicysfplugin - sf2/sf3をそのままinstrumentにするVSTです。JUCEで作られています。
React ReduxのDucks方式のTypescriptサポート

## ReduxとDucks
Reduxを使っていれば、action,reducer,dispatcher,storeなど多くの登場人物と仲良くしないといけないが、これまでフォルダー構成について多くの議論はされてきました。
筆者も最初action,reducerをそれぞれ分けるredux定番の方式を採用していました。一見明快でわかりやすいが、結局actionとreducerは同じ関心ごとに対して高度な依存関係があり、分けて置くことは実質のメリットはあんまりないように思ってきました。
ちょうど数日前ducks方式と出会いました。公式にはJavascriptの説明が提供されていますが、Typescriptの力も借りたいので、その場合のファイル構成の一例を共有したいと思います。
Ducksについて:https://github.com/erikras/ducks-modular-redux

※この文章はある程度Reduxの事前知識が必要です。
※一部のimport文は省略しています。

## Redux DucksのTypescript版ファイル構成例

```
redux
 |--modules
    |--foo.ts 　//View単位でaction,reducerの関心ごとの集約
    |--bar.ts
    |--index.ts　　//reducerのimportして実体をかき集める
 |--store.ts　　//主にcombineReducerをする、redux全体にかかわることもここでやる
views
 |--foo.tsx　//connectされるReact Component,reduxのmoduleと一対一関係を想定
 |--bar.tsx
...
```

## foo.tsのやること

```javascript:foo.ts
//State
export FooState{
 //mapStateToPropsで投入するPropsの型定義
}

//Actions
interface HogeAction{
 　//Actionの戻り値の型定義
}

export hogeAction=()=><HogeAction>{
　//Actionの実処理
}

//Reducer
export reducer:Reducer<FooState> = (state: FooState, action: HogeAction ) => {
  //reducerの戻り値はViewに露出する型でもあるのでわかるように明示的に示す
}
```

## index.tsのやること
```javascript:index.ts
import * as Foo from "./foo.ts";
import * as Bar from "./bar.ts";

//各Viewに投入するPropsの集約
export interface ApplicationState {
    foo: Foo.FooState;
    bar: Bar.BarState;
}

//Reducerの実体をかき集める
export const reducers{
   foo:Foo.reducer;
   bar:Far.reducer;
}
```
## store.tsのやること
```javascript:store.ts
import { ApplicationState, reducers } from './modules';

//combineReducer
export default const combineReducers<ApplicationState>(reducers);
```
## foo.tsxのやること
```javascript:foo.tsx
import { ApplicationState }  from '../redux/modules';
import * as FooModule from '../redux/modules/foo';

//Viewに投入するPropsの型宣言:Stateとactionの型を連結する
type FooProps = FooModule.FooState & typeof FooModule.hogeAction;

class Foo extends React.Component<FooProps , {}> {
 //FooViewの実装
}

//mapStateToProps
mapStateToProps = (state:ApplicationState) => ({ foo: state.foo });

//mapDispatchToProps
mapDispatchToProps= FooModule.hogeAction;

export default connect(mapStateToProps,mapDispatchToProps)(Foo);
```
## 最後に
これで一通りTypeScriptでReduxをつなげましたが、あくまで最小限のことしかしていません。あと、結構理想形を語ってることもご留意ください、実際運用時に例えば複数のViewで共通に使うようなactionなどがあったらどうすればいいか、ReactComponentの階層が深い場合、Propsを子供に渡していくにつれ最初投入したPropsはだんだん型が崩れるなど、貫くことが難しい場面を筆者いくつ経験しましたので、これが正解と論じるつもりはないが、ご参考になれば幸いです。
Docker Hub に terraform の Image  があったので使ってみた。

インフラ構成をコードで管理できる terraform ですが、
Docker Hub に Image があったので使ってみることにしました。

今回はとりあえず s3 を作ってみることにします。

### example.tf

```
provider "aws" {}

resource "aws_s3_bucket" "example" {
  bucket = "my-bucket"
  force_destroy = true
}
```

HCLのシンタックスハイライト効くようにしてほしい...。

credentials は環境変数から読ませるので省略しています。

本記事とはあまり関係ないですが`force_destroy` は bucket にファイルが残っていても、
強制的に削除できるようにするオプションです。
今回は有効にしときます。

### terraform init

```bash
$ docker run -it -v $PWD:/app/ -w /app/ hashicorp/terraform:light init
```

`init` は terraform プロジェクトをイニシャライズするコマンドです。

コンテナにホストマシンが持っている tf ファイルの情報を与えてあげる必要があるので、
オプションに `-v $PWD:/app/ -w /app/` を指定する必要があります。

https://github.com/hashicorp/docker-hub-images/tree/master/terraform

### terraform plan

```bash
$ docker run -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION \
  -it -v $PWD:/app/ -w /app/ \
  hashicorp/terraform:light plan
```

同様に credentials をコンテナに注入します。
試してないですが `$AWS_PROFILE` でもいけると思います。

### terraform apply

```bash
$ docker run -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_DEFAULT_REGION \
  -it -v $PWD:/app/ -w /app/ \
  hashicorp/terraform:light plan
```

### 結果

```bash
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  + aws_s3_bucket.example
      id:                          <computed>
      acceleration_status:         <computed>
      acl:                         "private"
      arn:                         <computed>
      bucket:                      "my-bucket"
      bucket_domain_name:          <computed>
      bucket_regional_domain_name: <computed>
      force_destroy:               "true"
      hosted_zone_id:              <computed>
      region:                      "ap-northeast-1"
      request_payer:               <computed>
      versioning.#:                <computed>
      website_domain:              <computed>
      website_endpoint:            <computed>


Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

aws_s3_bucket.example: Creating...
  acceleration_status:         "" => "<computed>"
  acl:                         "" => "private"
  arn:                         "" => "<computed>"
  bucket:                      "" => "my-bucket"
  bucket_domain_name:          "" => "<computed>"
  bucket_regional_domain_name: "" => "<computed>"
  force_destroy:               "" => "true"
  hosted_zone_id:              "" => "<computed>"
  region:                      "" => "ap-northeast-1"
  request_payer:               "" => "<computed>"
  versioning.#:                "" => "<computed>"
  website_domain:              "" => "<computed>"
  website_endpoint:            "" => "<computed>"
aws_s3_bucket.example: Creation complete after 2s (ID: my-bucket)

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
```

無事、bucket の作成に成功しました。
JAWS-UG 横浜 #14 に参加してきました！

![DSC00507.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/847d7e6e-f171-863d-ed66-48dd33b02821.jpeg)
12/03(月)夜にre:Invent2018で発表された新サービスの振り返りイベント「JAWS-UG 横浜」に参加してきましたので、その内容について紹介いたします。

# JAWS-UGとは?
>JAWS-UGとは、AWS (Amazon Web Services) が提供するクラウドコンピューティングを利用する人々の集まり（コミュニティ）です。
一人ではできない学びや交流を目的としてボランティアによる勉強会の開催や交流イベントなどを行なっています。
私たちは日本全国に「支部」の形でグループを持ち、それぞれのテーマに基づいて活動を行なっています。
このコミュニティーは、非営利目的で活動しています。

今回参加したのは横浜支部のJAWSユーザー会です。
JAWS-UG横浜支部(https://jawsug-yokohama.connpass.com/)

そんなイベントに、今回HIMACSは軽食スポンサーとして協賛し、ライトニングトーク(LT)にも参加してきました！
JAWS-UG横浜 #14 AWS re:Invent 2018 Recap(https://jawsug-yokohama.connpass.com/event/103954/)

開演前には、このようなスライドで当社の紹介も流れていました。
(非営利のイベントで、あまり凝った宣伝はNGでしたのでシンプルです)
![ビールスポンサー_HIMACS.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/2068fa14-599a-e8a0-a729-e3d952ff6c90.jpeg)

# 会場の様子
当日の雰囲気を簡単に紹介します！

![DSC00505.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/d0d4e969-c815-325c-d858-b8582633b4dc.jpeg)
今回は馬車道にある「アトラシアン」さんの会場で開催されました。

![DSC00519.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/944e64b8-942a-eb31-3cf7-cf4fbc7ee4e4.jpeg)
約80人ほどの人たちが参加されていました。この中にはRecap前日や、当日の夕方ラスベガスから帰国した人もいます。
また、AWSジャパンの方も複数名いらっしゃいました。

![DSC00506.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/43032a09-3ba8-9f26-a59e-50b5ee14f0bd.jpeg)
持参した軽食たちです。あっという間になくなってしまいました。

![DSC00523.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/c7927c89-b6cf-b3a2-9594-d0ff03662373.jpeg)
今回ラスベガスで開催されたre:Invent2018についての説明がありました。AWSは現在約170のサービスを提供しているようです。

![DSC00578.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/f66a556c-e508-1568-e8ac-0947a19ffc19.jpeg)
そして弊社技術部の南波佐間もLT枠で発表してきました！

![DSC00577.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/c8005494-96c7-6862-02ec-bac7a3a24f21.jpeg)
5分間という短い時間でしたが、とてもよかったと思います。


他の方は、現地での体験談や、新しく発表されたサービスについての解説をされていました。

# 最後に...
今回のイベント参加を通じて、熱心なユーザーが集まるJAWS-UGだからこそ聞けた、貴重な振り返りセッションでした。
wpscanの基本的な使い方についてです。

自分のブログの脆弱性を調べたくてwpscanを試してみようと色々やってます。

ユーザー名を調べるのはできたのですが、ブルートフォースアタックをやってみようと思ったところ、

scan Aborted: invalid option: --wordlist

と表示されてしまい出来ません。無効なオプション。。。。？？なんでや。。。？？
コードは
wpscan --url www.example.com --wordlist darkc0de.lst --username admin

これを入力しています。
MacOSでVirtualBoxを使ってそこにkaliをインストールしています。darkc0de.lstというファイルはkaliのデスクトップに保存しています。

何故こうなるのか？お分かりの方いらっしゃいますでしょうか。。。？？
もしくは、ログインユーザー名が判明してる状況で他に有効なコマンドってありますでしょうか。。？？

![スクリーンショット 2018-12-10 11.43.00.png](https://qiita-image-store.s3.amazonaws.com/0/324830/8079aa85-2a3e-60c7-7b6c-4431bc632bcb.png)
re:Invent2018 Global Partner Summit(11/27)に参加してきました！

![00.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/1c0f873c-f3c9-41cc-4076-dbcda79f3142.jpeg)
11/28(現地時間)にre:Invent2018では2回目となるキーノート(基調講演)イベント「Global Partner Summit」に参加してきましたので、その場で発表された新情報をざっくりお伝えいたします。

# Global Partner Summitとは？
AWSのパートナー企業に向けたプログラムの紹介と、パートナー企業の事例紹介が主な内容となります。
Monday Night Liveとは異なり、技術的な新サービスの話などはほとんどありません。
今回は午前8:30から開始でした。場所はMonday Night Liveと同じベネチアンです。
![00_IMG_0549.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/51720adb-1972-65dc-c86c-d6b11b4c08c8.jpeg)
7:30の時点ではまだガラガラでした。
開演までの間、DJのお姉さんがステージ上で一人で延々とダンスしてました。

# 発表された新情報
新情報の発表スライドなどポイントを絞っての紹介とさせていただきます。

#### パートナーティアレベルの名称変更
![00_Renaming Standard to Select.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/db1b8c7f-70ee-85ef-dd6d-a815aa479ee7.jpeg)
今回の発表の中で、当社に最も影響がありそうな内容です。
これまでの「スタンダート」レベルは「セレクト」と名称が変わります。
合わせて要件やメリットなども変更となるそうです。(要調査)

#### AWS Container Competency
![01_AWS Container Competency.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/3a13d71b-c1a7-80bd-aa62-f0255373ec0e.jpeg)
パートナー企業の認定プログラムの一つ「コンピテンシー」にコンテナ認定が加わります。
(コンピテンシーはアドバンスパートナー以上が対象となるので、今のところ当社は対象外です)

#### AWS Device Qualification Program & AWS Partner Device Catalog
![02_AWS Device Qualification Program & AWS Partner Device Catalog2.png](https://qiita-image-store.s3.amazonaws.com/0/316621/62f7da47-811e-bb40-ce81-df5c1d6580c0.png)
IoTをターゲットとした企業向けのプログラムです。

#### AWS Marketplace for Containers
![03_AWS Marketplace for Containers.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/3aa9f688-f095-3b48-9354-a3f10c0a5f9a.jpeg)
マーケットプレイスでの販売内容にコンテナが追加されました。(これまではEC2向けのAMIが主)
マイクロサービスやDevOpsなどの流行もあり、コンテナサービスの需要は依然として高いようです。

# Private Marketplace
![04_Private Marketplace.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/83835954-b08f-90ef-744d-7647af9526f9.jpeg)
パートナーが独自にカスタマイズ可能なマーケットプレイスです。
権限管理が可能とのことなので、企業内利用での許可外のソフトウェア導入の制限などに使えそうです。

# その他のトピック
![IMG_0564.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/ab9606c0-1625-3ff5-5a66-bccc5c79dfd8.jpeg)
![IMG_0562.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/bfd3a764-6489-7dd1-8ad7-7e02859df117.jpeg)
![IMG_0565.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/1ad91163-98d6-cb75-7312-c3037218b69b.jpeg)
![IMG_0571.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/9e7d271e-5335-ceeb-be85-57d5977dd715.jpeg)
AWSのビジネスは相変わらず堅調なようです。
vmwareとのパートナーシップも順調とのこと。

![IMG_0572.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/3fb17981-c9cf-db2d-d93f-b673f9d36dc2.jpeg)
Windowsが稼働しているパブリッククラウドの割合グラフです。
AWSが57.7%と本家マイクロソフトAzureの30.9%を大きく引き離している点が面白いです。

![IMG_0613.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/7c1707e4-4814-c90b-2ea2-e731298d551e.jpeg)
![IMG_0614.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/4bc51e15-7c77-c91b-94f0-9aca88bc4184.jpeg)
データアナリティクス分野も活況なようです。
Monday Night LiveではSageMaker Neoも発表されてました。

![IMG_0716.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/17f8ae2c-b90a-b899-a0f9-bd26557db906.jpeg)
AWS CEOのAndy Jessyの話では次のようなポイントが印象的でした。
- 多くの顧客は一刻も早くデータベースを移行したがっている
　　→脱Oracleしたがっている。
- リレーショナルデータベース(Oracle)はもはや古い。マイクロサービスにも合わない。
グラフDBが合致する要件も増えてきた。
re:Invent2018 Monday Night Live(11/26)に参加してきました！

![00_ロゴ.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/2bd1beb8-76e9-6383-ad1d-c14267782f01.jpeg)

11/26(日)(以下、すべて現地時間)から米国ラスベガスで開催されているAWSの全世界的な開発者向けラーニングイベント「re:Invent 2018」に参加させていただいています。

11/27(月)にre:Invent2018では初となるキーノート(基調講演)イベント「Monday Night Live」に参加してきましたので、その場で発表された新サービスの情報をざっくりお伝えいたします。

今後開催されるキーノート情報も当ブログにてお伝えしたいと思います！

# Monday Night Liveとは？
AWSの新サービスや、普段は公表されない裏側の構造などが発表される場です。

月曜日の夜に、バンドによるライブを前座として、アルコール飲料なども提供される中で行われるキーノート(基調講演)です。パーティーのような雰囲気です。

例年、re:Inventの中では最も早く行われるキーノートとなります。

![01_ベネチアン.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/a008517a-83e0-ffee-cdbd-7542381073f7.jpeg)
今回はベネチアンというホテルで行われました。

![02_移動中の人波.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/ceb50d2f-a5ed-18bd-ad45-3d4d2f82a1bc.jpeg)
すごい人です。
AWS Summit Tokyoが可愛く思えます。

![03_MondayNightLive2時間前.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/52a93b73-0186-9092-0dc3-32a80183eb58.jpeg)
開演1時間半前の私達の後ろの入場列を映した写真です。
すごい人です。

![04_MondayNightLive会場.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/3ba73e9c-c27a-d4ea-ba7b-64d22ae6b9aa.jpeg)
会場はパシフィコ横浜の展示ホールの半分くらいでしょうか。
すごい広さです。

![05_MondayNightLiveライブ.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/6d5b2c8b-2b97-d773-6bb1-0692e5590762.jpeg)
開場前にライブをやっています。(ステージ隅の方で生演奏してます)

# 発表された新サービスや新機能たち
新サービスや既存のサービスに追加のオプション機能が登場しました。 以下はそのスライドと、概要です。
![10_概要1.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/439f0b4a-c7d0-cc07-6f22-074f8a884f64.jpeg)
![11_概要2.jpg](https://qiita-image-store.s3.amazonaws.com/0/316621/2416a7d8-a0ae-9269-2059-1a814aa67615.jpeg)

#### AWS Global Accelerator
高速なAWSネットワークを利用して目的のサーバにアクセスできるようにするサービス
#### AWS Transit Gateway
VPCとのVPN接続やVPC Peeringのハブとなる機能
(従来は、VPCを経由する接続はできず、VPC同士の直接通信しかできませんでした。)
#### EC2 A1 インスタンス
AWSが独自に開発したGraviton Proccessorを搭載したインスタンス
(性能に対して、比較的安価に利用できます。)
#### EC2 C5n インスタンス
HPCやネットワーク帯域を大きく利用する際に最適なインスタンスタイプ
#### EC2 P3dn インスタンス
分散機械学習やHPCに最適なインスタンスタイプ
#### Elastic Fablic Adaptor
HPCの大規模なクラスタ構成などをターゲットにした高速大容量なENA
#### SageMaker Neo(OSS)
SageMakerで用意されていない外部のモデルをコンパイルできるようになる機能
#### Firecracker(OSS)
KVMの技術を利用し、仮想化されていないマシンでmicroVMを立ち上げる機能

## 雑感
今回のキーノートではネットワークに関する新サービスのインパクトが大きかったように感じました。(その他のサービスについてはスペックが大きいものだったりしてなかなか自身で触る機会は少なそうです……)

また、SageMaker NeoやFirecrackerについてはOSSであることを強めに主張していたことも印象的でした。