OmniAICreator/Qiita-1.07M huggingface dataset:
PHPStan の trait にある phpdoc type hint が効かない場合はキャッシュを削除する

phpstan を使っていて、trait に書いたタイプヒントが効かない。

```json:composer.json
{
    "name": "local/phpstan-test",
    "autoload": {
        "psr-4": {
            "": "src/"
        }
    },
    "require-dev": {
        "php": ">=7.2",
        "phpstan/phpstan": "^0.12"
    }
}
```

```
composer install
```

```php:src/FooTrait.php
<?php

trait FooTrait
{
    /**
     * @param mixed $data
     */
    public function traitMethod($data): int
    {
        return 0;
    }
}
```

```php:src/Foo.php
<?php

class Foo
{
    use FooTrait;

    public function run(): int
    {
        return $this->traitMethod("foo");
    }
}
```

```
vendor/bin/phpstan analyze -l8 src/
 2/2 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%


                                                                                
 [OK] No errors                                                                 
                                                                                
```

初回はOK。
ここでコメントを追加する。

```php:src/FooTrait.php
<?php

trait FooTrait
{
    /**
     * @param mixed $data
     * @return int
     */
    public function traitMethod($data): int
    {
        return 0;
    }
}
```

```
php7.2 vendor/bin/phpstan analyze -l8 src/

 2/2 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

 ------ ---------------------------------------------------------------- 
  Line   FooTrait.php (in context of class Foo)                          
 ------ ---------------------------------------------------------------- 
  9      Method Foo::traitMethod() has parameter $data with no typehint  
         specified.                                                      
 ------ ---------------------------------------------------------------- 

                                                                                
 [ERROR] Found 1 error                                                          
                                                                                
```

そうするとエラーになる。
`@param $data` はそのままなのにエラーが出るのでハマった。

```
rm -rf /tmp/phpstan
vendor/bin/phpstan analyze -l8 src/
 2/2 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%


                                                                                
 [OK] No errors                                                                 
                                                                                
```

キャッシュを消すとOKになる。



https://github.com/phpstan/phpstan/issues/1601
https://github.com/phpstan/phpstan/issues/1294#issuecomment-436951553

issue解消待ち。
Magnet・ShiftIt・ BetterTouchToolはもう不要かもしれない

MacOS CatalinaからSplit Viewが大幅に強化され、ようやく使えるようになりました。下記の名称をMenu Titleに入力し、お好きなショートカットを割り当ててください。僕は「Shift + ←/→」でWindow Moveするようにしています。

- System Preferences > Keyboard > Shortcuts > App Shortcuts > +
    - Enter Full Screen（or フルスクリーンにする）
    - Zoom（or 拡大/縮小）
    - Tile Window to Left of Screen（or ウインドウを画面左側にタイル表示）
    - Move Window to Left Side of Screen（or ウインドウを画面左側に移動）
    - Tile Window to Right of Screen（or ウインドウを画面右側にタイル表示）
    - Move Window to Right Side of Screen（or ウインドウを画面右側に移動）
    - Move to iPad（or iPadに移動 #Side Car設定済みの場合）
Google Apps Script の最初のチュートリアルの次にやる Codelab を作りました

## 概要

2019 年 7 月から G Suite の GDE をやらせてもらってます @tanabee です。 11 月に四国で、 12 月にアゼルバイジャンのバクーで Google Apps Script のハンズオンをする機会があったので、 Google Apps Script の Codelab を作りました。

以下から誰でもアクセスできるので、よかったらトライしてみてください！

- Codelab: [Apps Script Codelab](https://tanabee.github.io/gas-codelab/ja/)
- ソースコード: [tanabee/gas-codelab - GitHub](https://github.com/tanabee/gas-codelab)

![Apps Script Codelab](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/d7a3eff9-dc30-fd1a-6b9e-c90c807dbbec.png)

## 習得できること

この Codelab では、スプレッドシートと Gmail を連携するプロジェクト開発を通して、以下のことを習得できます。

- Google Apps Script を使った Google アプリケーションの連携のやり方が分かる
- Google Apps Script のリファレンスを探りながら、自分で開発ができるようになる
- Google Apps Script の自動化の仕方が分かる
- スプレッドシートの拡張機能の作り方が分かる

適宜リファレンスへリンクを貼って説明しているので、ただコードをコピペして進めるのではなく、 Codelab にリンクされたリファレンスを確認するなど、手順通り理解しながら進めていくのをお勧めします。

## ターゲット

この Codelab のターゲットは以下の方々です。

- Google Apps Script の初心者
- JavaScript 経験者

JavaScript 未経験の方は事前に他の教材で文法理解するのをおすすめします。 Google Apps Script は少し古めの JavaScript (バージョン 1.6) がベースになっていますので、バージョンを意識して JavaScript を学ぶのが良いかと思います。

また、 Google Apps Script の公式チュートリアル [Your first script](https://developers.google.com/apps-script/overview#your_first_script) を触って、最初に動作イメージを掴んでからこちらの Codelab を試すのをお勧めします。

## Codelab を作ってみてよかったこと

最後に Codelab でハンズオンをしてみて良かった点を 3 点ご紹介します。

### 1. Markdown で簡単に作れる

Markdown で教材を作れるので、記事を書く感覚で簡単に作れるのも良かったです。 Markdown から Codelab 形式に出力するのは [claat](https://github.com/googlecodelabs/tools/tree/master/claat) を利用します。

また、 Codelab の出力先を docs/ 以下にして GitHub Pages にのせられるので、最終的なソースコードと Codelab の管理を統一できて楽です。

### 2. Google Analytics で解析ができる

Codelab に独自の Google Analytics タグを埋め込めるので、受講者が最後まで到達したか、ハンズオン中にリアルタイムにどの程度進捗しているかなど確認できます。

![EKB5X2jUwAAX597.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/4fbe775b-2fde-5b95-939b-630108fbbf75.jpeg)

### 3. 受講者の利便性が高い

Codelab はハンズオンや学習するのに適した作りになっています。

例えば、 Codelab 形式で作ると受講者が前回どこで離脱したかキャッシュされており、受講者が再受講する時に勝手に前回の離脱ポイントを開いてくれます。

また、各セクションごとに時間設定ができるので、どれくらい時間がかかる Codelab が事前に確認できたり、残りどれくらいで完成するのか分かりやすいです。

![スクリーンショット 2019-12-15 22.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19698/45dbbfb2-c7a0-1628-b367-15bd5cc4135f.png)


## まとめ

以上、自分が作った Google Apps Script の Codelab のご紹介と、 Codelab で作る利点などを紹介しました。 Google Apps Script をこれから触る方は触ってみてください。

## 関連記事

- [GAS ビギナーが GAS を使いこなすために知るべきこと 10 選](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4)
- [毎月 500 時間の社内ルーティンワークを GAS を使って自動化した話](https://qiita.com/tanabee/items/ce9c3cf9403c4f3f14a9)
- [3 分で作る無料の翻訳 API with Google Apps Script](https://qiita.com/tanabee/items/c79c5c28ba0537112922)
SwiftUIのListのfilterを高速化する

# 開発環境
- MacBookAir 2019
- macOS Catarina 10.15
- Xcode 11.2.1
- SwiftUI


# 概要
Listのfilterで要素数が５００以上の時、異常に挙動が遅くなる現象を解決できたので私が行った方法を備忘録的にまとめます。

#ソースコード
```swift
struct JsonData: Codable, Equatable,Identifiable{
    var id: Int
    var itemName: String
    var itemPrice: Int
    ・・・
}
```

```swift:修正前
@EnvironmentObject var jsonData: JsonData

List {
    ForEach(jsonData.filter{$0.hasPrefix(searchText)}, id:\.self) {item in
        Text(item)
    }
}
```

`searchText`は@Stateで定義しており、ここに検索バーに入力された文字が格納されています。`searchText`の値が変更されるとその都度Listの中身が更新されます。

この状態でビルドすると、
<img width="267" alt="3.04.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478335/b8451f23-e5a7-68e0-a0a6-032e06516d53.png">
非常にラグがありますが一応は検索できます（１文字入力すると数秒固まる）。
これはおそらく`jsonData`に格納されているデータ数が多いとfilterの処理が律速段階となってしまうためだと思われます。


#解決策
[StackOverflow :How do I efficiently filter a long list in SwiftUI?
](https://stackoverflow.com/questions/57637455/how-do-i-efficiently-filter-a-long-list-in-swiftui)
この投稿を参考に、Listを毎回作り替えることで高速化が実現できました。

```swift:修正後
@EnvironmentObject var jsonData: JsonData

if searchText==""{
    nonFiltered()
}else{
    filtered()
}

////////////////////////////
struct filtered: View {
    @EnvironmentObject var jsonData: JsonData
    var body: some View {
        List {
            ForEach(jsonData.filter{$0.hasPrefix(searchText)}, id:\.self) {item in
                Text(item)
            }
        }
    }
}
struct nonFiltered: View {
    @EnvironmentObject var jsonData: JsonData
    var body: some View {
        List {
            ForEach(jsonData) {item in
                Text(item)
            }
        }
    }
}
```
驚くほど劇的にラグが改善しました。めちゃめちゃヌルヌル動作します。
MySQLのテーブルCollation(照合順序)が意図しない設定になる原因と対策

この記事は [MySQL Advent Calendar 2019](https://qiita.com/advent-calendar/2019/mysql) 8 日目のエントリとなります。
（空いていたので後からエントリさせて頂きました！）

#発生した問題

MySQL8.0系にて初期設定時にCollation(collation_server項目)に`utf8mb4_general_ci`を設定。
その後のCREATE TABLE時にDefault Charsetを`utf8mb4`、Collationの指定無しとした。
グローバル設定である`utf8mb4_general_ci`が引き継がれるかと思いきやテーブルのCollation設定を確認すると`utf8mb4_0900_ai_ci`になっているという事象が発生した。

#原因

CREATE TABLE時にDefault Charsetのみ指定すると上位レイヤー（MySQLインスタンスやDBスキーマ）のCollation設定に関係なく指定したCharsetに対応したデフォルトCollationがテーブルに設定される。
・MySQL8.0系でCharset`utf8mb4`に対応するデフォルトCollationは`utf8mb4_0900_ai_ci`となる。

### MySQL Ver5系
ちなみにVer5.6やVer5.7でも同仕様となりCREATE TABLE時にCharsetだけ指定するとグローバルな設定に関係なく対応したデフォルトCollationが有効化される。
・ただしVer5系でCharset`utf8mb4`に対応するデフォルトCollationはVer8.0系と異なり`utf8mb4_general_ci`となる。

#対策
CREATE TABLE時にDefault CharsetとCollateを両方明示的に設定する。
（Default Charset、Collationともに未指定とし上位レイヤーの設定を引き継ぐ方法も有るが明示的に指定した方が誤解も無くて良さそうという判断）

#テーブルに反映されるCollation設定の優先度

|優先度|CREATE TABLEのDefault指定条件|反映値|
|:-:|:-:|:-:|
|1|Charset、Collate両方指定|CREATE TABLEで指定したDefault Collate|
|2|Charsetのみ指定|Charset指定に対応するデフォルトCollation|
|3|Charset、Collateともに未指定(DBスキーマにCollation設定有り)|DBスキーマのCollation|
|4|Charset、Collateともに未指定(DBスキーマにCollation設定無し)|MySQLインスタンスのCollation|


## 参考)information_schemaに設定されたデフォルトCollationの確認
・確認クエリ

```sql
select * from information_schema.collations where is_default = 'Yes'
AND character_set_name = 'utf8mb4'
```
・MySQL 8.0.16の結果

```
COLLATION_NAME,CHARACTER_SET_NAME,ID,IS_DEFAULT,IS_COMPILED,SORTLEN,PAD_ATTRIBUTE
utf8mb4_0900_ai_ci,utf8mb4,255,Yes,Yes,0,"NO PAD"
```
・MySQL 5.6, 5.7の結果

```
COLLATION_NAME,CHARACTER_SET_NAME,ID,IS_DEFAULT,IS_COMPILED,SORTLEN
utf8mb4_general_ci,utf8mb4,45,Yes,Yes,1
```

#参考URL

[10.1.3.2 データベース文字セットおよび照合順序]
(https://dev.mysql.com/doc/refman/5.6/ja/charset-database.html)

[10.1.3.1 サーバー文字セットおよび照合順序]
(https://dev.mysql.com/doc/refman/5.6/ja/charset-server.html)
そろそろ『アクセシビリティ対応』というよくわからない表現を『品質課題』と捉えてコードレビューに入れたほうが良い件

この記事は アソビュー！ [Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/asoview) 18日目の記事です。

アソビュー株式会社でプロダクトのデザイナーをやっている山中と申します。よろしくおねがいします。
今回は、アクセシビリティに関して個人的に思う部分を書いてみます。

## はじめに
アクセシビリティに関することは、以前からとある層で意見交換されていて、
ここ最近は記事も多くなりUI実装する際にも考慮したりしている企業も増えてきている。と感じています。

規格や基準、ガイドラインもあります。
- [WCAG2.0](https://waic.jp/docs/WCAG20/Overview.html)
- [voxmediaの職種別ガイドライン](http://accessibility.voxmedia.com/)
などなど

アクセシビリティをかんたんに言ってしまうと、`『使えない（アクセスできない）をなくしていく』`ことです。
決して「一部の人向け」ではありません。だれが、いつ、どこで、どのように使うかは様々です。
なので、webサービスを開発している我々にとっては、`『UIの品質に関わること』`と捉えていく方が自然だと感じていて、日頃行っているコードレビューやQAテストにこれらのチェック項目や思想を導入してしまうのが継続的で良いと考えます。


## もったいないと感じるUI

#### span でくくる button
キーボードでフォーカス、選択ができない

```
<span onClick={hogehoge}>これはボタンです</span>
```

#### span でくくる a
URLが確認できなくて怖い

```
<span onClick={gotoHoge}>ここはリンクです</span>
```

#### こちら、のリンク
なにがこちら？怖すぎる

```
<a href="gotoHoge">こちら</a>
```

#### hoverメニュー
キーボード、タッチデバイスでアクセスできそうもない

```
<style>.mainMenu:hover > div{display:block;}</style>

<span class="mainMenu">
  <div>ここはメニューです</div>
</span>
```

これらの部分を良くするだけでも、アクセスできる人は増えるはずです。


## どうやったら社内に広まるか
- 関心を持ってもらうための勉強会の実施
- 世界の動きを知ってもらう（例：[2000年シドニーオリンピックの公式サイトから情報を取得できない申し立て](https://www.humanrights.gov.au/our-work/disability-rights/bruce-lindsay-maguire-v-sydney-organising-committee-olympic-games)）
- 画面を見ずに操作してみる（音声とキーボードのみで操作できるか否か）
    - つかえないものを作りたくないよね、と無言の圧力をかける
- テスト項目にいれてしまう

などを行うと、意識してもらえるようになるはずです。

## どのように継続していくか
`各種ブラウザやデバイスの対応ができるんだから可能！`

- コードレビューにアクセシビリティ観点を導入
- 徐々に基準をつくっていく（一気に作ってもたいへんなだけ）




## さいごに
よし！アクセシビリティ対応やろう！と力んでもできるものでもないし継続しないので、
現状をしっかりと把握して、ちゃんとやればUIを作っている人たちも使ってくれる人たちもハッピーになるはずです。
「使えない」を減らすために知識を学ぶ努力は必要ですが、一人ではないのでできると思います。

ありがとうございました。

---- 

## 過去に書いたアクセシビリティ関連の記事
書いたの、3年前（2016年）前なのか...。
（記事を書くのが億劫で途中でやめてしまったんですねw）
- [ゼロから始めるWeb Accessibility入門：概要](https://qiita.com/toshinori/items/d5c81131aadc9610c36a)
- [ゼロから始めるWeb Accessibility入門：誤解](https://qiita.com/toshinori/items/b94f3ae3f26893490624)
- [ゼロから始めるWeb Accessibility入門：セマンティックHTML](https://qiita.com/toshinori/items/bc27612266306f06e884)
- [ウェブアクセシビリティ：チェックリスト](https://qiita.com/toshinori/items/6587517c7de63e736a32)
【GA】HOMEページの各動線が活用されているか調べたい

## はじめに
 [オールアバウトライフマーケティング](https://www.lifemarketing.co.jp) のシステム開発部  [@tkk](https://qiita.com/k_shiota)  と申します。
本Qiitaは、 [All About Group（株式会社オールアバウト） Advent Calendar 2019](https://qiita.com/advent-calendar/2019/allabout)  17日目の記事です。

私からはGoogleアナリティクス(以下GAと呼称)を用いて、HOMEページから各動線がどう活用されているか調べたい時のお話をしたいと思います。
※なお、説明にはGoogleから提供されているテスト用のアナリティクスアカウントを用います。
## 目的
+ HOMEページの動線が適切であるかを判断したい
+ そのため、HOMEページの各動線が活用されているかを調べたい

## 方法解説
この場では2種の調査方法を記載します。
### 【方法１】　“2 ページ目”セカンダリディメンションを活用する
#### 1. GAを開く
https://analytics.google.com/

#### 2. 左サイドバーから「行動 > サイトコンテンツ > 全てのページ」を押下
GAからのデフォルトで提供されているグラフを参照することができます。
<img width="1334" alt="スクリーンショット 2019-12-17 9.23.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/0e12b861-b162-e1c4-1b43-9cfa239449dc.png">
今回はページのURL単位で各指標(ビュー数やセッション数の事)を参照できるグラフを開きました。

#### 3. 表の属性を示す最も左の行から「/home」を押下する
今回は/homeページの分析をしたいので、表題通りに操作を行います。
表のデータ属性の中から、今回のパスである「/home」を押下してください。
<img width="1378" alt="スクリーンショット 2019-12-17 11.20.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/5dbcb5b8-1212-bb7d-4193-b56421e17da3.png">

表を形作る、データ属性（最も左の行の事）をGAでは「ディメンション」と呼びます
これで表のデータ属性(ディメンション)がページの中で「/home」に絞った内容のレポートができました。
<img width="1538" alt="スクリーンショット 2019-12-17 9.28.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/7308f376-b69d-abd9-5056-d6f644c6ee97.png">



#### 4. 表グラフ上部の「セカンダリ ディメンション▼」タブを開き、そこから「2 ページ目」を選択する
今この表は、ページ単位で形作られています。
そこに、「2ページ目にどこに飛んだか」という条件を追加していきましょう。
表題の操作通りにタブを操作して、ディメンション（データ属性）の条件を追加してください。
<img width="1543" alt="スクリーンショット 2019-12-17 9.28.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/780102d8-2c77-dd62-9f9f-73606546b2bf.png">

このように追加された、２つ目のディメンション（データ属性）のことを「セカンダリディメンション」と呼びます。


以上の操作から、『HOMEページにアクセスした後の2ページ目』　を区分としたレポート作成することができました。
![名称未設定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/85c00020-cda8-e9f6-d921-a4d939524ec6.png)



#### 備考
上記で作成したレポートの状態から、新たにディメンションを追加することはできません。

もしディメンションを3つ以上追加したい場合はGAの「カスタムレポート機能」にて、「種類：フラットテーブル」の表を用いて
オリジナルのレポートを作って調べていきましょう。



### 【方法2】Chromeの拡張を活用する
#### 1. GAを参照できるGoogleアカウントを用いてChromeにログイン

#### 2. Googleが提供している「Page Analytics」をChromeに追加
[Page Analytics (by Google) - Chrome ウェブストア](https://chrome.google.com/webstore/detail/page-analytics-by-google/fnbdnhhicmebfgdgglcdacdapkcihcoh)
![名称未設定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/28d60826-2430-5e22-2d34-865c7052490f.png)


#### 3. 調べたいページ(今回はHOME)にアクセス
拡張を追加した状態で調べたいページにアクセス/リロードすると、
ページ表示上の各動線にピンがつき、動線のクリック数が色と数字で可視化されます。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/8e93f8f7-cf05-d150-ae20-466b68ad7616.png)
※写真はchrome拡張の説明ページの画像を用いています。

もし拡張が起動しない場合は、chromeの上部に存在するはずのロゴに、下記のような「ON」と表記があるか、確認してください。
<img width="43" alt="スクリーンショット 2019-12-17 9.52.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120970/23d139ed-e09c-647b-650a-990af01f6288.png">

#### 備考
こちらの方法では、各動線の成績を視覚的に理解することができます。
毎日差し替えて動きが多い動線や上位に食い込んでいない動線は表示されない傾向があるため、
【方法2】はあくまでも参考として参照し、細かい分析は【方法1】やカスタムレポートを用いていくことがオススメです。
Iパス試験　入出力インターフェース

#目次 入出力インターフェース
1. [入出力インターフェースとは](#1-入出力インターフェースとは)
2. [シリアルインターフェースとパラレルインターフェース](#2-シリアルインターフェースとパラレルインターフェース)
3. [有名なインターフェース（有線）](#3-有名なインターフェース（有線）)
  - USB
  - IEEE1394
4. [有名なインターフェース（無線）](#4-有名なインターフェース（無線）)
  - IrDA
  - Bluetooth
 
#1. 入出力インターフェースとは
「**ケーブルや端子などの差し込み口の形状**」「**ケーブルの種類**」「**ケーブルの中に通す信号のパターン**」等細かな取り決めをすることで、異なるメーカーの物でも問題なく使えたり、ケーブルが共用できる互換性がある。これを実現しているのが**入出力インターフェース**。
電化製品のコンセントは日本国内向けの物はどれも同じ形をしていて、日本国内は差し込み口も全て同じ。これも「AC１００Vコンセント」という"入出力インターフェース"を守って作っているから。


#2. シリアルインターフェースとパラレルインターフェース
データを転送する方式によって、**シリアルインターフェース**と**パラレルインターフェース**に分けられる。

"シリアル"は"**直列**"という意味で、**シリアルインターフェース**は信号が**一つづつ**転送される。
"パラレル"は"**並列**"という意味で、**パラレルインターフェース**は複数の信号が**並列に**なって**一斉に転送**される。

パラレルインターフェースの方がデータが一度に複数送れるので高速でいいと思うかもしれないが、転送する速度を求めるにつれて複数の信号が同時に辿りつかず、バラバラに転送されるようになった。(徒競走で一斉にスタートしたのにそれぞれバラバラにゴールするイメージ)
このことから**シリアルインターフェースで高速化を図ることが主流**になっている。


#3. 有名なインターフェース（有線）
有線での有名どころは**USB**と**IEEE1394**がある。どちらも**シリアルインターフェース方式**。
**電源を入れたまま抜き差し**できる**ホットプラグ**と、**周辺機器を繋ぐと自動的に設定が開始**される**プラグ・アンド・プレイ**に対応してる。
**プラグ・アンド・プレイ**は「差し込めば使える」という意味。接続すると、ネットに繋がっていれば自動的にその機器を使うためのドライバがインストールされルよう設定されている。

###・ USB (Universal Serial Bus/ユニバーサル シリアル バス）
Univerdsal（広く使われる、標準的な）の文字通り、パソコンと周辺機器を繋ぐ**最も標準的なインターフェース**で、高い汎用性がある。
キーボード、マウス、スキャナなどの入力装置、プリンタなどの出力装置、外付けHDD等補助記憶装置などを**機器を選ばず利用できる**かなり便利な規格。

パソコンに直接差し込む他、**USBハブ**（コンセントのマルチタップのUSB版）を使い、複数のUSB機器をツリー型に繋ぐことができる。USB機器はパソコンを含めて最大１２７台まで繋ぐことができる。

USB機器にも２種類あり、**USBポートから電源供給**をうけることができる**バスパワー**の機器(キーボードやマウス)と
USBポートとは別に**ACアダプタ（コンセント）などから供給**をうける**セルフパワー**の機器(スキャナやプリンタ)がある。

###・ IEEE1394
「i.Link」や「Firewire」という名前でも呼ばれる。主にハードディスクレコーダーなどの情報家電やデジタルビデオカメラなどの機器で使われているインターフェース。

<details><summary>IEEE1394をもっと詳しく</summary>
IEEE 1394はもともとApple社の開発したFireWireという技術を標準化したものであり、規格制定後もIEEE 1394の正式なブランド名称として使われている。また、ソニーは標準化以前から「i.LINK」という同社独自の呼称を用いており、家電業界などで普及している。
また、日本の家電メーカーなどはデジタルビデオカメラなどのIEEE 1394端子を「DV端子」と呼んでいたが、徐々に「i.LINK」の呼称に置き換わっていった。DV端子はDV形式の動画データの送受信しかできないため、厳密にはIEEE 1394規格全体に対応しているわけではない。
 </details>


#有名なインターフェース(無線)
###・ IrDA(Infrared Data Association)
赤外線を使って無線通信を行う。高校の頃ガラケーのアドレス交換で使っていたが、今はLINEだから今時の子は知らない…。通信距離は１mほどで、障害物があると通信できない。

###・ Bluetooth
2.4GHzの電波を使って通信する。パソコン、マウス、キーボード、イヤホン、スマホ、プリンタなど、あらゆる周辺機器をを繋ぐことができる。
通信距離は１０mほどで、障害物があっても繋がる。
SNSのシェアURLで悩まない

## SNSのシェアURLは少し面倒臭い

SNSのシェアURLって少し面倒臭くないですか。
自分はいちいちググったり、公式のドキュメントとかみに行ったりしています。
エンコードしないといけないのも面倒臭い。
（しかもTwitter、Facebook、LINEでそれぞれ違うし）

## ジェネレーター作った

悩む時間が勿体無いと思って、こんなものを作りました。

https://takuan423.github.io/encoder/

- シェアしたいURL
- シェアしたいテキスト

を入れて「変換する」を押下したらシェア用のURLを作ってくれるやつです。

## pugで開発しているならこれでいい

実はpugはJSが書けるので、`encodeURIComponent()`が使えるんですよね。
なので、下記でいけます。

```
var share_url = https://hogehoge.co.jp //-シェアしたいURL
var share_text = ほげほげ //-シェアしたいテキスト
```

ひとまずシェアしたいURLとテキストを変数に入れておく。

**Facebookならこう**

```
a(href=`https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(share_url)}`)
```

**Twitterならこう**

```
a(href=`https://twitter.com/share?url=${encodeURIComponent(share_url)}&text=${encodeURIComponent(share_text)}`)
```

**LINEならこう**

```
a(href=`https://line.me/R/msg/text/?${encodeURIComponent(share_text)}%20${encodeURIComponent(share_url)}`)
```

## LINEはシェアURLが2種類ある

LINEのシェアURLって２パターンあります。
(もっとあるのかもしれませんが、僕の知る限り少なくとも2パターンあるんです）

```
https://line.me/R/msg/text/?(シェアするテキスト)%20(シェアするURL)
```

**パターンA**がこういうやつで

```
line://msg/text/?(シェアするテキスト)%20(シェアするURL)
```

**パターンB**こういうやつです。
挙動の違いは実際にリンクを叩いてみてください。

- [パターンA](https://line.me/R/msg/text/?%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%99%E3%82%88%20http%3A%2F%2Flocalhost%3A3000%2F)
- [パターンB](line://msg/text/?%E3%83%86%E3%82%B9%E3%83%88%E3%81%A7%E3%81%99%E3%82%88%20http%3A%2F%2Flocalhost%3A3000%2F) (PCだとそもそも開かない)

これの違いは、[公式のドキュメント](https://developers.line.biz/ja/docs/line-login/using-line-url-scheme/)にも詳しく書いていあります。

どちらもLINEのアプリケーションを開こうとする挙動になるんですが、
`line://`から始まる**パターンB**は端末にLINEが
インストールされている前提の、スマホファーストな書き方なので、
汎用性が高いのは`https://line.me/R/`から始まる**パターンA**な気がします。
WordPress始めました。その1。

#上司:bust_in_silhouette:＜チーム全員でWordPress使えるようになってほしい！
「使えるようになってほしい」＝**ただの保守・運用だけではなく、PHPも理解してカスタマイズできるようになってほしい**の意見（恐らくそれ以上のことも）。
入社して2ヶ月経ち自社製品も任せてもらえるようになり、新たな壁が立ちふさがった！
やったことないけど、色々やってみよう:star:

#必要な知識
 - HTML
 - CSS
 - PHP

私、未経験入社（少しはやっていた）ですが、入社してから**ひたすらググって！聞いて！Qiitaに書く！**をやっています！WordPress自体も初めてです。

#下準備
チーム全員で勉強するので、まずは環境を整えます。
でも殆ど他の社員が環境を整えてくださっていたので、あんまりやってないです

##Dockerのインストール
https://docs.docker.com/docker-for-windows/install/
ここの**Download from Docker**をクリックしてダウンロード

**Docker hubアカウントの作成**をしないといけないのでここで作成。

設定の参考1:https://ops.jig-saw.com/techblog/docker-for-windows-install/
設定の参考2:https://dx.nissho-ele.co.jp/blog/docker-for-windows_20190829.html

##docker-compose.ymlの設定
すみません、自分で最初から設定したわけではないんです:pensive:
上司から配布されました…
中身の説明は別記事で書こうかと思います。

##docker-compose up -d
WindowsPowershellでdocker-compose.ymlがあるディレクトリに移動して、このコマンドを打ってコンテナの作成と起動。
 -dは**デタッチドモード**というらしい。Compose はコンテナを実行すると終了するが、コンテナは後ろで動き続ける

##`http://ローカルホスト:XXXX`にアクセス
docker-compose.ymlの`ports:`に書いてあるホスト名でアクセスする

**これで準備が整ったのでWordPressを始めよう！**
http://docs.docker.jp/compose/wordpress.html
Splunkでフォワーダー管理対象クライアントをサーチ(REST API)で確認する

# はじめに

Splunkはフォワーダー管理機能(Forwarder Management)を用いて、他のSplunkインスタンスのApp設定を一元管理することができます。
この機能を使うと、たとえば沢山のUniversalForwarderに同じ設定をまとめて設定したい時、1台ずつサーバーにログインして設定を行う必要なく、一括して配布することができます。

公式ドキュメントにおいて、Forwarder管理機能を使って設定を管理するSplunkインスタンスのことをDeploymentServer、管理対象になったSplunkインスタンスのことをDeploymentclient(単にクライアント)と呼ぶことが多いようです。

フォワーダー管理機能はSplunkの標準機能として備わっており、Splunkのメニューから設定->フォワーダー管理で利用することができます。

フォワーダー管理画面では主に以下のことが確認できます。
 - クライアント情報(ホスト名,IPアドレス,dns,os,フォワーダーからの通信が最後にいつあったか)
 - クライアントが配属しているサーバークラス
 - 配布App

フォワーダー管理機能で出来ないこと
 - 配布対象Appを作成する※データ入力だけであれば、別の画面から作成可能
 - 配布対象Appを配布用フォルダに配置する※同上
 - 配布対象appを更新後、再配布(CLI)
 - クライアントの再起動

しかしこのフォワーダー管理画面はかゆいところに手が届きません。

 - フォワーダーの管理台数が多いとき、ページャーを使って根気よくめくる（一応検索ボックスはある）
 - フォワーダーにどのAppがインストールされているのか確認したいとき、1行ずつドリルダウンしていく必要がある
などなど...


そこでSplunk のREST Endpointにリクエストを投げるRESTコマンドを使うことで
サーチ結果としてフォワーダーの情報を取得することができます。

確認したバージョン:7.3.3,8.0.0


### コマンド

```構文
| rest /services/deployment/server/clients
```
restコマンドの引数にサーバークラス名を指定すると、サーバークラスに属するクライアントだけをサーチすることができます。

項目が多いのでどんなフィールドがあるのかtransposeコマンドで
整形してみます。

```構文
| rest /services/deployment/server/clients
| transpose
```

サーバークラスを1つも設定していない場合、
31個のフィールドが取れるようです。

サーバークラスとAppがある場合
フィールド数が変化するようです。

## よく使うフィールド

| フィールド名 |  内容 | 備考 |
|:--:|:--|:--|
| hostname | クライアントのホスト名|
| ip | クライアントのIPアドレス |
| dns | クライアントのDNS名 |
| guid | クライアントのGUID(Splunk固有のID) |
| splunkVersion | クライアントのGUID|
| package | クライアントが使用しているSplunk。UFの場合universal_forwarder,Splunk Enterpriseの場合"enterprise"と表示されるようです。 |
| utsname | linux-x86_64,windows-x64 |

| フィールド名 |  内容 | 備考 |
|:--:|:--|:--|
| application.\<app_name\>. | app名。|
| application.\<app_name\>.serverclasses | appを配布するサーバークラス。 |

| フィールド名 |  内容 | 備考 |
|:--:|:--|:--|
| serverClasses.\<serverclass_name\>.repositoryLocation | 配布先Appを置くディレクトリ。デフォルトでは$SPLUNK_HOME/etc/deployment-apps/ |

tableコマンドで必要な情報のみ表示されるよう整形します。
フォワーダーのサーバー情報が欲しい場合は、hostname,ip,clientNameフィールドなどだけ抽出するとよいでしょう。

```構文例
| rest /services/deployment/server/clients serverclasses=<サーバークラス名>
| table hostname ip 

```
※パラメータで指定したサーバークラスが設定されていない場合、エラーになります。また、パラメータにワイルドカードは使えないようです。（大文字小文字区別あり）

# 参考
REST API Reference Manual - Deployment endpoint descriptions
https://docs.splunk.com/Documentation/Splunk/latest/RESTREF/RESTdeploy#deployment.2Fserver.2Fclients

https://docs.splunk.com/Documentation/Splunk/latest/RESTREF/RESTdeploy#deployment.2Fserver.2Fclients


## 補足
※管理するためには、管理"する"側の他に、管理"される"側のSplunkインスタンス(Splunk EnterpriseもしくはUniversal Forwarder)にも予め設定が必要です。
※デフォルトのAppをフォワーダー管理機能で管理することはSplunk社非推奨となっています。フォワーダー管理機能はクライアント側のAppをリモートでアンインストール(削除)することができるので、おそらくデフォルトAppをフォワーダー管理下に置くと消せてしまうからではないかと...
rspec 基本まとめ　マッチャ 伊藤さんの記事より抜粋

## 出てくるメソッド

- be_xxx
  - be_valid
  - be_empty
  - be_falsey,be_truthy

- change,by

```ruby
# popは配列から要素を削除
#{}でかこう
x = [1, 2, 3]
expect{ x.pop }.to change{ x.size }.from(3).to(2)


# updateするときに`change`

it 'userを削除すると、userが書いたblogも削除されること' do
  user = User.create(name: 'Tom', email: 'tom@example.com')
  # user が blog を書いたことにする
  user.blogs.create(title: 'RSpec必勝法', content: 'あとで書く')

  expect{ user.destroy }.to change{ Blog.count }.by(-1)
end
```

- raise_error


```ruby
class ShoppingCart
  def initialize
    @items = []
  end
  def add(item)
    raise 'Item is nil.' if item.nil?
    @items << item
  end
end
```

```ruby
it 'nilを追加するとエラーが発生すること' do
  cart = ShoppingCart.new
  expect{ cart.add nil }.to raise_error 'Item is nil.'
end
```

### 参考記事

伊藤淳一さんの記事
https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5
ロボトレーサのシミュレーション

次のような座標系を考える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/771e8857-30e6-0f61-1c7e-88de6dfcac36.png)
この時、

```math
\frac{dx(t)}{dt}=v(t)cosθ(t) \\
\frac{dy(t)}{dt}=v(t)sinθ(t) \\
\frac{dθ(t)}{dt}=ω(t) \\
```
これを解析的に解く事はできない
ここで、オドメトリ、デッドレコニングと呼ばれる自己位置推定の手法がある。
ここで連続時間系なので、離散時間にするときには、これを用いてシミュレーションする
ここで直線近似と円弧近似が考えられる
直線近似では、Δt秒間直線を移動すると考える
円弧近似では、Δt秒間円弧を移動すると考える

- 直線近似

```math
\frac{x_{t+1}-x_{t}}{Δt}=v_tcosθ_t \\
\frac{y_{t+1}-x_{t}}{Δt}=v_tsinθ_t \\
\frac{θ_{t+1}-θ{t}}{Δt}=ω_t \\
```

よって、

```math
x_{t+1}=x_t+Δtv_tcosθ_t \\
y_{t+1}=y_t+Δtv_tsinθ_t \\
θ_{t+1}=θ_t+Δtω_t
```

- 円弧近似

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/81a3a5c2-70b4-b91f-f53a-9d0a46acfaad.png)

移動している時の平均角度は$θ_t+\frac{Δθ}{2}$
よって、ΔxはΔLの直線のcos成分
つまり、

```math
x_{t+1}=x_t+Δx=x_t+ΔLcos(θ_t+\frac{Δθ}{2}) \\
y_{t+1}=y_t+Δx=y_t+ΔLsin(θ_t+\frac{Δθ}{2}) \\
```

結局直線近似してるね。。。

これでは、$x_t$から$x_{t+1}$までの直線の距離をΔL（弧の長さ）としている
ここで、厳密にこの弧の長さを求めると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550140/0715fe0e-0d6d-296c-8fa8-64ec882f700a.png)

$$ΔL'=2ρsin(\frac{Δθ}{2})$$

代入して、

```math
x_{t+1}=x_t+2ρsin(\frac{Δθ}{2})cos(θ_t+\frac{Δθ}{2}) \\
       =x_t+\frac{Δθρsin(\frac{Δθ}{2})cos(θ_t+\frac{Δθ}{2})}{\frac{Δθ}{2}} \\
       =x_t+Δθρcos(θ_t+\frac{Δθ}{2})\frac{sin(\frac{Δθ}{2})}{\frac{Δθ}{2}} \\
       =x_t+Δθρcos(θ_t+\frac{Δθ}{2})sinc(\frac{Δθ}{2})
```
sinc(θ)はマクローリン展開すると、
$$sinc(θ)=1+\frac{θ^2}{3!}+\frac{θ^4}{5!}+・・・$$
ここで、１次近似してみると、

```math
x_{t+1}=x_t+Δθρcos(θ_t+\frac{Δθ}{2}) \\
       =x_t+ΔLcos(θ_t+\frac{Δθ}{2}) \\
```

同じ事になる。つまり、円弧を直線に近似する事は、ΔL'を１次近似することに対応する

```matlab:tracer_kinematics.m
function obj = simu(obj,v,omega)
          D_theta=omega*obj.DT;
          obj.theta=obj.theta+D_theta;
          if omega==0
            obj.D_L=v*obj.DT;
            DX=obj.D_L*cos(obj.theta);
            DY=obj.D_L*sin(obj.theta);
          else
            r=v/omega;
            obj.D_L=2*r*sin(D_theta/2);
            DX=obj.D_L*cos(obj.theta+D_theta/2);
            DY=obj.D_L*sin(obj.theta+D_theta/2);
          end
          obj.x=obj.x+DX;
          obj.y=obj.y+DY;
      end
```
加速度と角加速度まで考慮すると

```matlab:tracer_kinematics.m
        function obj = simu2(obj,a,alpha)
            obj.v=a*obj.DT;
            obj.omega=alpha*obj.DT;
            
            D_theta=obj.omega*obj.DT;
            obj.theta=obj.theta+D_theta;
            if obj.omega==0
                obj.D_L=obj.v*obj.DT;
                DX=obj.D_L*cos(obj.theta);
                DY=obj.D_L*sin(obj.theta);
            else
                r=obj.v/obj.omega;
                obj.D_L=2*r*sin(D_theta/2);
                DX=obj.D_L*cos(obj.theta+D_theta/2);
                DY=obj.D_L*sin(obj.theta+D_theta/2);
            end
            obj.x=obj.x+DX;
            obj.y=obj.y+DY;
        end
```
この時、作用反作用の法則により、モータには慣性力が働く
djangoのadminでブログのエディタを作りたい

#ブログを作りたい人に向けて
Djangoで作ったブログアプリケーションへ記事を投稿する際にadminサイトから行いたい人向けに書きました。
僕自身もとても迷いましたし、あれこれ調べながら行ったので参考になれば嬉しいです。

##こんな人にオススメ
・自分で作ったブログに画像を投稿して表示したい
・ブログの投稿を管理画面（admin画面）から行いたい
・ブログの記事をテキストエディタで装飾したりしたい（boldやフォントの調節など）

##参考にした記事
こちらの方の解説はとてもわかりやすかったです。
https://zerofromlight.com/blogs/detail/51/
ブログアプリケーション上で使いたい画像を投稿して使用する場合はこちらの記事がオススメです。
https://qiita.com/j54854/items/1f0560142e39d888251c
Noodlで動画を扱えるようだぞ！！！！！

#概要
 Noodl Advent Calender 18日目！
予定していた内容とは異なりますが、面白いネタだと思うのでぜひご覧ください。

【本題】
 　**Noodlに動画を埋め込んで再生と停止ができます！！！**

　実際の様子はこちら。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ちらっ <a href="https://t.co/aOUh1FI4z9">pic.twitter.com/aOUh1FI4z9</a></p>&mdash; まえぷー@アドカレ奮闘中 (@kmaepu) <a href="https://twitter.com/kmaepu/status/1206782383715827713?ref_src=twsrc%5Etfw">December 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

　全体のフローはこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/6623e980-3c7a-67b4-60bb-c27176184e09.png)

　動画を扱うには**<font color="Red">Video</font>**ノードを利用します！

#Videoノード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/125055d7-2ddd-20e7-7347-49180b72166e.png)

###どんなノード？
　Video Pathプロパティに指定されたパスにある動画を表示し、再生と停止ができるノード。扱える動画は**mp4**。
　
　動画は読み込みは、読み込ませたいNoodlプロジェクトを開いた状態で、そこに動画ファイルをドラッグ&ドロップします。

###プロパティ
- Video Path：動画ファイルのパス
- Poster path：動画が表示される前に表示される画像のパス
- Preload：動画の再生開始前にロードしておくかのチェック
- Loop：動画を最後まで再生いたら、ループして再生するかのチェック
- Muted：動画に含まれる音声をミュートするかのチェック
- Autoplay：再生トリガ（play）がかからなくても自動で再生されるかのチェック

#参考
今回はこちらのフリー動画サイトから引用させていただきました。
https://www.pexels.com/videos/

#終わりに
　動画を背景にすることでより動きのあるUIになりますね！背景以外にも、スマートカメラで記録した動画の確認等利用できそうです。🍜
【しがないラジオ】sp.59【ゲスト: oyakata2438】を聴いてみた【ふりかえり】

# おことわり
[しがないラジオMeetup4](https://shiganai.connpass.com/event/155245/)に当日申し込んで、昼休み(1時間)の間に聴きながら執筆しました
そのため、抜け漏れやふりかえりの不備などがある可能性があります

# 概要
| Podcast | しがないラジオ sp.59【ゲスト: oyakata2438】 |
|:-----------------|:------------------|
|日時|2019/12/10(火) 13:00-15:00|
| URL | https://shiganai.org/ep/sp59-oyakata2438 |
| 形式 | Podcast |
|テーマ|技術同人誌を書き始めて13年目のサークル主が語る技術書典6と楽しい技術書コミュニティ|

# 内容
## 合同誌のテーマについて
テーマが比較的包括的なものであれば、複数人での執筆がやりやすい
テーマの中でも話題がいくつかあるので筆者の棲み分けができる
筆者毎に深堀りの度合いも違えば、似た内容でも深堀りする方向性が異なるので、最終的にそれぞれの筆者の知識が集積され、体系的・網羅的な知識が集まる

## 筆者になるきっかけやモチベーション
「なんとなく書きたい」というぼんやりとした気持ちがある人は潜在的には多いと思う

筆者が増えると、「自分もできるかな」と不安を抱きながらトライしてみる人が出る
トライしてみた人は、「不安に思っていたけどできたな」と筆者になり
これをみた人が…という筆者が増える好循環

あと、合同誌だと出版費用とかのリスクを分散できるのもきっかけにしやすい

## 合同誌(書籍)では体系化されている
「体系的な整理」がなされることが合同誌(書籍)メリットが得られる
「知識の断片」はツイッターや情報商材的なサイトに遭遇しやすい
しかし、「体系的な整理」がなされた情報へのアクセスがとても難しい

## 締切があるからこそアウトプットが生まれる
「締切ドリブン」なアウトプットができる
締切がなければ、だらだらアウトプットが延期されていくこともままある
しかし、イベントや締切があると、「間に合わせないと」という心理が働いてアウトプットが(半ば脅迫的に)行える

## 技術書店とコミケや商業誌を比して
- コミケ
    - 季節的に難しい
    - 二次創作等に関する問題に巻き込まれるリスクがある
    - 技術者に寄り添った運営チームである
- 商業誌
    - 「売れない」と言われて断られることがない

# 感想
- 合同誌のテーマについて
    - 様々な筆者が集まることで、視点や考え方を複数同時に得ることができるので、読み手としても効果的な情報収集ができそうだ
- 筆者になるきっかけやモチベーション
    - 「書いてみたいな」という気持ちを持っている人は私も含めて多いと思う
    - リスク分散がされる合同誌はきっかけにしやすい
- 合同誌(書籍)では体系化されている
    - 体系的な知識を公式ドキュメント以外見つけにくい今日、とてもありがたいように思える
- 締切があるからこそアウトプットが生まれる
    - 正しくEvent Driven...
Mindによるバイナリ操作

# はじめに
ある日、私はMindでバイナリをファイルに書き込もうとしていましたが、悪戦苦闘しました。Mindでは中々バイナリをうまく扱えないので...**なら、自ら関数を作ればいいじゃない！**ということで作ってみました。後進(~~そんな人いるのか？~~)の方々の参考になれば幸いです。
本記事では、バイナリの基本的な操作や、変換の方法について扱います。

# Mindでのバイナリの概念
Mindでは、バイナリを文字列として扱います。一バイト辺りおおよそ一文字のように扱い、通常の文字列操作単語が使用できます。しかし、Mindは文字列を論理的な文字の集まりとしてみなす単語も多いため、そのような介入がない代替単語を使用するように注意が必要です。

# Mindでの定数バイナリ
Mindで、定数としてのバイナリは以下のように書きます。

```
バイナリ定数は　文字列

※単行の場合
{12 34 56 78}を　バイナリ定数に　入れ、

※複行の場合
{12 34 56 78}C
{9A BC DE F0}を　バイナリ定数に　入れ、
```
※「{」でも「｛」でも同じ。ただしそろえる必要はある。数字も半角全角は等しいものとして処理される。
「{」から「}」の中に、一バイトずつ情報を空白で区切って十六進数で書きます。このようにして書かれたバイナリは文字列として扱われます。

# 16進数を数値で書く
Mindで整数を16進数で表記したい場合は以下のように書きます。

```
十六進数データは　変数

※通常の数字(0-9)から始まる場合
９９Ｈを　十六進数データに　入れ

※アルファベット(A-F)から始まる場合
０ＦＦＨを　十六進数データに　入れ
```
※通常の数字から始まる場合も０から始めてよい。数字やアルファベットは半角全角は等しいものとして処理される。
十六進数で数値を書いた後、最後に「Ｈ」を書くことで十六進数として認識されます。アルファベットで始まる場合は、必ず最初を「０」としてください。また、整数は４バイトまでしか扱えないことも重要です。それ以上の操作をしたい場合、他の方法を使用する必要があります。

# シフト
Mindにも標準でシフト単語が用意されており、以下のように使用することができます。

```
※左シフト
０ＦＦＨを　８ビット　左シフトし　※０ＦＦ００Ｈ

※右シフト
０ＦＦ００Ｈを　８ビット　右シフトし　※０ＦＦＨ
```
「左シフト」・「右シフト」はそれぞれ指定された**ビット数**だけ数値をシフトします。なお、Mindは数助詞を解釈しない為、「８ビット」の部分を「１バイト」と置き換えても、1ビットだけシフトしてしまいます。1バイトは8ビットなので、8ビット単位でのシフトが多いのではないでしょうか。

# 本題(数値をバイナリとして文字列に変換する)
これまでの方法では、「定数しか扱えない」や「全体で４バイトまで」という制約があります。これを突破するには数値をバイナリとして文字列に変換する方法が考えられます。例えば以下のような方法です。

```
変換後文字列は　文字列実体　長さ　４バイト。
（数値・バイト数ー＞文字列）
バイト数指定で文字列化とは
    受け取り数は　変数
    繰り返し数は　変数
    操作桁数は　変数
    マスク値は　変数

    変換後文字列を　クリアし
    受け取り数と　繰り返し数に　入れ
    繰り返し数を　回数指定して
        回数を　繰り返し数から　引いて、８ビットを　掛けて、　操作桁数に　入れ、
    
        操作桁数ぶんだけ、１を　左シフトしたものを　マスク値に　入れ、

        ７を　回数指定して
            マスク値を　１つだけ　左シフトしたものと、マスク値の　ＯＲを　マスク値に　入れることを
        繰り返す

        マスク値と　受け取り数の　ＡＮＤを
        操作桁数だけ　右シフトし　変換後文字列に　一文字追加して、
    繰り返し、
    変換後文字列を　返すこと。
```
※返り値である文字列はすぐに使用するか文字列実体変数に格納すること。
※「変換後文字列」をローカル変数として定義すると、変数の有効期限の関係により、中身が破壊される可能性がある。
これは単に1バイト分ずつ数値を切り取って、それぞれを文字として文字列実体変数に一文字ずつ追加しています。
このように文字列に変換すれば、「4バイトまで」という制約を無視し、どんどん追加していけます。
例えば以下のように:

```
メインとは
　　バイナリ文字列は　文字列実体　長さ　５０桁
　　バイナリ文字列を　クリアし
　　１２３４５６７８Ｈを　４バイトで　バイト数指定で文字列化し
　　バイナリ文字列に　追加し
　　９ＡＢＣＤＥＦ０Ｈを　４バイトで　バイト数指定で文字列化し
　　バイナリ文字列に　追加し。
```
# ファイル書き込み
詳しい解説はMindのドキュメントに任せますが、ファイル書き込みは以下のようにできます。

```
メインとは
　　書き込み先は　ファイル
　　「Hello.dat」で　書き込み先を　新規オープンし
　　※エラー処理を省略
　　※バイナリを文字列で書き込み
　　｛０Ｃ　ＡＡ　３Ｆ　４６｝を　書き込み先に　書き込み、
　　※バイナリを数値で書き込み
　　０ＣＡＡ３Ｆ４６Ｈを　書き込み先に　書き込み、
　　書き込み先を　クローズし。
```

数値も文字列も同じように書き込んでくれますので、割と自由に書き込めると思います。しかし、可能な限り短く書き込むので、例えば「００ＦＦＨを　書き込み先に　書き込み」としても一バイトしか書き込まれないことには注意が必要です。(文字列に変換すれば、必ず書き込んでくれます。)

# おわりに
これで一応バイナリ操作やバイナリのファイル書き込みなどができるようになったと思います。これでいろんなバイナリ操作ができますね！
Pythonのgeoindexライブラリで近くの緯度経度の点を取得する

このように、緯度経度を表す数値のtupleが入ったリストから、指定した緯度経度で最も近い点を判定したいとします。

```python
geo_pts = [
    (35.60, 139.71),
    (35.58, 139.82),
    # 以下略
]
```

# ナイーブな実装

リストの中身をすべて計算するナイーブな実装です。

```python
import math

def find(geo_pts, target):
    return max(geo_pts, key=lambda p: dist(p, target))

def dist(p1, p2):
    return math.sqrt(sum((x1 - x2) ** 2 for x1, x2 in zip(p1, p2)))
```

こんな挙動です。AWSのEC2 t2.mediumインスタンスで、15000個程度の点を探すのに20ms程度かかってしまいました。

```python
print(find(geo_pts, (35.6, 139.7)))
# => (35.60, 139.71)
```

ちなみに、n個取得したい場合は、 [`heapq.nlargest`](https://docs.python.org/ja/3/library/heapq.html#heapq.nlargest) が使えます。


# geoindexライブラリでの実装

https://pypi.org/project/geoindex/


```python
def main():
    geo_pts = [
      # 配列で読み込み
    ]
    index = GeoGridIndex(precision=4)
    for x in geo_pts:
        index.add_point(GeoPoint(x[0], x[1]))

    prev = time.time()
    print(find(index, (35.6, 139.7)))
    # => (Point(35.687659999999994, 139.71178), 9.80482739300054)
    print(time.time() - prev)



def find(index, target):
    return next(index.get_nearest_points(GeoPoint(*target), 10, 'km'))
```

AWSのEC2 t2.mediumインスタンスで、こちらの実装では4ms程度で値が返ってきました。

ちなみに、 `GeoGridIndex` の引数のCell Sizeの単位はkmで、 `precision=4` を指定した場合は半径40/2=20kmの範囲以内で検索できます。私の要件では半径20kmでちょうどよかったため、これ以上の検証は行っていません。

| Precision | Cell size |
|--:|--:|
| 1 | 5000 |
| 2 | 1260 |
| 3 | 156 |
| 4 | 40 |
| 5 | 4.8 |
| 6 | 1.22 |
| 7 | 0.152 |
| 8 | 0.038 |
プロジェクトの無理ゲー進行を回避し、定時で帰るためのアジャイル開発イベントガイド

## はじめに
数年前、僕が勤めていた会社はメンバー全員、毎日0時まで残業することがほとんどでした。
プロジェクト開始直後から、「開発が遅いと言われたらどうしよう」「このプロジェクトを走りきれるのだろうか」という不安を感じていました。  

仕事漬けにより学習時間がとれない悪循環も生まれてしまい、数年残業漬けの日々を過ごしていました。

転職して2年ほど経ち、働き方・開発手法・考え方が大きく変わった部分があるので共有したいと思います。


## なぜ定時に帰れないか
 - プロジェクトの方針を合意できていない
 - チームメンバー同士、期待値に沿った動きができていない
 - プロジェクト全体で作るべき機能が多すぎる
 - 見積もりと作業量に差分がありすぎる
 - 問題の発見が遅れ、作業が停滞する
  - メンバー視点：弱みを見せられずに、問題の発見が遅れる
  - チーム視点：作業、問題を見える化する仕組みがない
 - 開発の手戻りが大きい

### プロジェクトの方針を合意できていない
#### これを回避したい
「そもそもこのプロジェクト必要なんですか？」  
「このプロジェクトは○○がないと成立しない」  
というプロジェクト自体の手戻り

#### 改善策 
インセプションデッキを作成して、プロジェクト方針の合意形成をします。

インセプションデッキのテンプレート↓
https://github.com/agile-samurai-ja/support/tree/master/blank-inception-deck

### チームメンバー同士、期待値に沿った動きができていない
#### これを回避したい
プロジェクトの最終局面にて「最初からそれ言ってくれればやったのに！」というミスマッチ

#### 改善策 
ドラッカー風エクササイズを行います。
以下の4つの質問に対してメンバー全員で答えていくと、期待値をすり合わせることができます。

 - 自分は何が得意なのか？
 - どういうふうに仕事するか？
 - 自分が大切に思う価値は何か？
 - チームメンバーは自分にどんな成果を期待していると思うか？

### プロジェクト全体で作るべき機能が多すぎる
#### これを回避したい
「この新機能と同じようなやつなかったっけ」
「A機能とB機能って何が違うの？」
という提供価値の重複

#### 改善策 
ユーザーストーリーマッピングを行います。
ユーザーの行動フローに沿って提供価値（ユーザーストーリー）を並べていくことで、提供価値の重複を防ぐことができます。

「ハンマーを持つ人には、すべてが釘に見える」という言葉にもある通り、
エンジニアとして技術を身につけると、何かを作ることで問題解決したくなりがちです。
提供価値から逆算して、本当に作る必要がある機能にのみ絞っていきます。

### 見積もりと作業量に差分がありすぎる
#### これを回避したい
「見積もりめちゃくちゃ時間かかる割に激しくずれますよね」
#### 改善策 
スクラム開発を行い、イテレーションを回していきます。
まずスプリントプランニングを行います。
相対的に見積もりを行うことで、チーム内でざっくりどれくらいの重みがあるのか、共通認識を作ります。
ここでは議論はせずにあくまでも情報提供のみ、 **チーム内の合意は不要です**。
スプリント毎にどれくらいのストーリーを消化できているかを確認し、見積もる際の参考とします。
直近3スプリントを平均した値にすると、ブレが少なくなって扱いやすいです。

### 問題の発見が遅れ、作業が停滞する
- メンバー視点：弱みを見せられずに、問題の発見が遅れる
- チーム視点：作業、問題を見える化する仕組みがない

#### これを回避したい
「それ、言ってくれたら一瞬で解決できたのに」
「それ僕も同じ地雷踏んだから知ってる」
というムダ

#### 改善策 
Slackの投稿ハードルを下げます。
チームのチャンネルを作って全員が垂れ流していれば素晴らしいですが、
難しい場合はtimes_(人の名前)チャンネルを作って、垂れ流すのがよさそうです。

#### 補足

僕はチームとしては問題が埋もれてしまうことが一番のリスクだと考えています。
エンジニア界隈では、よく「よく調べてから質問しなさい」と言われます。
しかし質問のハードルが高いことで、問題の発見が遅れてしまうとチームとしての生産性が大きく下がってしまうため、
以下の表において、問題が埋もれてしまう「検知漏れ」よりかは「誤検出」が多少多くても問題が共有されやすい方に
倒しておくほうが安全なように思います。

| -- | 実際に問題だった | 実際には問題ではなかった |
|:--|:-- |:-- |
|メンバーが問題として報告した | 問題を発見できた | 問題ではないものにチームの時間を使ってしまった(誤検出) |
|メンバーが問題と認識せず、報告しなかった | 問題が埋もれてしまった(検知漏れ) | 問題は起きておらず、報告も必要ない |



### 開発の手戻りが大きい
#### これを回避したい
開発完了してPRを出し、テーブル構成から修正が必要になってしまう
#### 改善策 
- 空PRを作成して、TODOを記載
 - テーブル構成や、初期にすり合わせたいこともここに書く
- slackを使ってざっくばらんに実況
 - xxむずい、など気軽な投稿


## イベントの全体像
やや粒度がバラバラですが、下記のようなサイクルで回していくと良いサイクルが作れると思います。

<img width="1106" alt="Image from iOS (4).jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200628/d4b865ca-dc68-8ad8-af10-898f50e624dd.jpeg">

## 終わりに
今回は開発・チームビルディングをメインとしたアジャイル開発に関するイベントについて書いたので、プロダクトの価値検証の部分はあまり触れていません。
時間があれば、こちらは別の記事として書きたいと思います。
Date.todayとDate.current

開発していて、「どう違うんだっけ…」と考えてしまったので備忘録。

## Date.today
下記によって決まる。
 - OSのタイムゾーン(`/etc/localtime`)
 - 環境変数`TZ`

## Date.current
`application.rb`のタイムゾーンを使う。

```
config.time_zone = 'Tokyo'
```

DBへの保存時間を変更する場合は

```
# デフォルトは:utc
config.active_record.default_timezone = :local
```
## 参考
https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
https://qiita.com/aosho235/items/a31b895ce46ee5d3b444
自作ブラックジャックのCPUが強すぎる気がしたので、自動で1万回プレイして勝率を確認してみた

# 「これプレイヤーが勝てないように仕組んでない?」
G'sアカデミーというプログラミングスクールを卒業しました。卒業生は再履修できるのでもう一周しています。

じゃんけんをJavascriptで作るという課題があり、ブラックジャックをKotlin Javascriptで作って提出しました(G'sの課題はカオスの塊)。チェックしてくれたスタッフのAさんに「昨日からプレイしているけど、1回も勝てていない。これプレイヤーが勝てないように仕組んでない?」と聞かれました。

そんな仕様にした記憶はなかったので、自分でも再度プレイしたのですが**3勝10敗**でした。確かにちょっと勝率が偏っているかもしれません。勝率が50%だとすると3勝10敗になる確率は3.5%くらい(数学苦手なので計算間違ってるかも)

# 検証しよう
たまたま運が悪かっただけかもしれないので、試行回数を1万回ぐらいに増やして勝率を計算してみましょう。手でポチポチするのはめんどくさいです。怠惰はプログラマの美徳です。めんどくさいことはプログラムにさせましょう。

という訳で、Seleniumに自分が作ったブラックジャックを1万回ぷれいさせることにしました。

# 私の環境とバージョン情報

今回は特に環境がハマりどころなので要注意(後述)

- OS: Windows10 1803
- intelliJ: 2019.3 Community Edition
- Kotlin: 1.3.41-release-150 (JRE 1.8.0_202-release-1483-b03)
- Selenium: selenium-server-standalone-3.141.59.jar
- Chrome: 79.0.3945.79
- Chrome driver: 79.0.3945.36
- npm: 6.9.0

# テストしたいブラックジャック
https://nagashimam.github.io/BlackJack/
ソース:https://github.com/nagashimam/BlackJack

# Seleniumスクリプト
ソース:https://github.com/nagashimam/BlackJackTest

# スクリプトを書く際のハマりどころ
環境構築自体はたくさん記事があるので、私がハマったところについて。

## Chromeとドライバーのバージョン
この2つの整合性が取れていないとTimeoutExceptionで強制終了になります。ドライバーのどのバージョンがどのChromeに対応しているかはドキュメントを参照してください

https://chromedriver.chromium.org/downloads

## 有効な Win32 アプリケーションではありません。
エラーメッセージを保存し忘れたので若干違うかもしれませんが、npmでドライバーをインストールすると、上記のエラーメッセージが出てスクリプトを実行できません

コマンドプロンプトで

```cmd
where chromedriver
```

と打つと

```cmd
(パス)/chromedriver
(パス)/chromedriver.cmd
```

と出てきました。正しい方法ではないかもしれませんが、私の環境ではchromedriver(cmdがついていない方)を削除すると動くようになりました。

# 検証結果

保存する前にブラウザを閉じてしまった（笑）ので、記憶違いかもしれませんが勝率は42%だったはずです。
1万回実行した後にスクリーンショットをとるようにスクリプトを変えたので、今晩もう一度実行してみます。

仮に勝率を40%とすると、3勝10敗になる確率は11%ほどなので、ありえなくはないかな、ぐらいの数字ですね。
[linux]rootのパスワードを消す

`/etc/passwd` の中の、 `x` を消せば可能になります。

```
$ vi /etc/passwd

root:x:0:0:root:/root:/bin/bash
```

左から順に、ユーザ名・パスワード・ユーザID・グループID・コメント・ホームディレクトリ・ログインシェルになってます。

ここでパスワードに当たるのは、左から2つ目の `x` です。これは暗号化されたパスワードを意味しています。見れたら怖いですからね。

ここを消してあげることで、パスワードなしでログインが可能になります。

```
- root:x:0:0:root:/root:/bin/bash

↓

+ root::0:0:root:/root:/bin/bash
```

hogeユーザからログインしてみましょう

```
[hoge@111111111111 ~]$ su -
[root@111111111111 ~]$ 
```

パスワードをきかれずにrootになることができました！

ちなみに、普通の環境だと `/etc/passwd` を編集できるのは rootユーザかsudo権限が使える人のみになります。
マンガでわかる Mediator

![86248074-7B82-4F4B-9E30-A39EC379BBB3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/9599faee-3644-cb36-7e11-20fb4b58ef6a.png)

こみっとさん、なんかすごい上司っぽいぞ! かっこいい!! みなさん忘年会が立て込むシーズンなので、めもりーちゃんみたいに、財布にゆきちしかいないなんてことないように、気をつけましょうね。

忘年会の会費を社員間で貸し借りするといった、複数のオブジェクトによる好き勝手複雑な連携は、あっという間にプログラムを混沌に陥れます。参照透過な純粋関数でない場合が多いオブジェクト指向のプログラムだと、最悪、メソッドコールが循環して、無限に再帰する可能性も...

Mediator はそんな状況を解消するのに最適なオブジェクトです。個々のオブジェクトは、この調停者オブジェクトとしか、忘年会費の支払い取引をしてはいけないことにします。そうすると、関係グラフの線の最大本数が、`(n - 1)^2` から、一気に `n - 1` に減ります。

`n = 2` のときは 1 本しかないからいいけど、それ以上になると、これ、爆発的に関係が複雑になりますね。この開発チームだと関係者が 5 人なので、最大 16 本から確定で 4 本ですよ! やったね!!

もしもこれが 20 人なら 361 -> 19 に、100 人なら 9801 -> 99 ... うーん、それ以上は考えたくありません。`^2` なのでぐいぐいやばくなります。

たった一人で収支計算しないといけない Mediator は、あらゆる調停に関係する知識が入ってくるので、そこだけはどうしても複雑になります。が、おかげで他のオブジェクトはいっさいの計算をしなくてよくなります。どうせ必要最低限の複雑さが必要なら、そりゃ分散しているより集中している方が、圧倒的に問題を認識しやすくなりますよね。もしバグっても、ひとつのクラスの単体テストを書いて修正するだけなので簡単です。(なんせ複数のクラスの関係に潜む不具合は、単体テストでは発見しにくいですからね)

ちなみに、経口摂取したアミノ酸を分解できるすごいハイテク義体の持ち主なのにアルコールだけ NG で飲めないうえ、インターンだから正社員待遇されてない AI のくるみクンのぶんは、内緒でこみっとさんが奢ってくれました。そういうイレギュラー調整も独断ででできて、他の子にバレないってとこも Mediator のメリットですね。
【kotlin】LocalStack+JUnitを用いてローカル環境でAmazonS3登録のテストを行う

## はじめに
サーバサイドkotlinでAmazonS3にファイルを登録する実装をしています。
今回、テストコードでS3登録をローカル環境で動かすためにLocalStackのJUnit統合をやってみました。
モックライブラリにはMockKを使用しています。

LocalStack / Integration with Java/JUnit
https://github.com/localstack/localstack#integration-with-javajunit

MockK
https://github.com/mockk/mockk

## LocalStackの導入と起動

```
$ pip install localstack
$ localstack start
```

## gradle
Envとかは省略してます

```
testCompile group: 'cloud.localstack', name: 'localstack-utils', version: '0.2.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.5.1'
testImplementation "org.junit.jupiter:junit-jupiter-api:5.5.1"
testImplementation("by.dev.madhead.aws-junit5:s3-v1:5.0.4")
testImplementation("by.dev.madhead.aws-junit5:s3-v2:5.0.4")
testImplementation("io.mockk:mockk:1.9.3")
```

## 本文

LocalStackのモック用S3Client生成クラス

```LocalStackS3Client.kt
object LocalStackS3Client {
    fun makeS3Client(): AmazonS3 {
        val client = TestUtils.getClientS3() // LocalStackによるS3Client生成
        val bucketName = UUID.randomUUID().toString() // なんでもよい
        client.createBucket(bucketName)
        return client
    }
}
```
本物のS3Client生成クラス

```AmazonS3Client.kt
object AmazonS3Client {
    @JvmStatic
    fun makeS3Client(): AmazonS3 {
       //aws-java-sdk-s3を用いた本物の処理。中身は省略。
       return client
    }
}
```

テストクラス

```AmazonS3UploadTest.kt
@ExtendWith(LocalstackDockerExtension::class)
@LocalstackDockerProperties(services = ["s3"], randomizePorts = true)
class AmazonS3UploadTest {
    @Test
    fun testAmazonS3Upload() {
        // File作成のprivateメソッド、省略
        val file = createFile()

        // モック用S3Clientを呼び出すように設定
        mockkStatic(AmazonS3Client::class)
        every { AmazonS3Client.makeS3Client() } return LocalStackS3Client.makeS3Client()
        
        // モック用S3Clientが生成される
        val client = AmazonS3Client.makeS3Client()
        
        // S3にファイルを送信
        try {
            client.putObject(PutObjectRequest(Env.BUCKET_NAME, file.name, file)
        } catch (e: AmazonClientException) {
            throw e
        }

        // テストクラスを終わらせるための手抜き
        assertThat("hoge").isEqualTo("hoge")
}
```

## まとめ
LocalStack+JUnitを使えば、シンプルな記述でawsのローカル環境でのテストができて良いですね！
今回はS3を使いましたが、DynamoDBやSQSなど他のサービスでも同じようなことが可能ですので、
詳しくは知りたい方は↑のgithubのReadmeをご覧ください。

間違ってるところがあるかもしれないので、
時間があれば手抜きしてるところと共に書き直します。
DynamodbLocalにJavascriptで接続する際の事前設定

DynamodbLocalにJavascriptで接続する際、アクセスキーIDとかリージョンとかを設定していないと怒られます。こんな感じに。

> Error [ConfigError]: Missing region in config

ローカルで動かしているので本来設定の必要はないはずですが……まあともかく設定が必要です。
具体的には以下の四項目を設定しておく必要があります。

* AWSaccessKeyId
* AWSsecretAccessKey
* AWSregion
* AWSendpoint

設定方法はこちら。AWSendpointだけは実際にDynamodbが動いているエンドポイントを指定する必要がありますが、それ以外は適当で大丈夫です。

```index.js
const AWS = require('aws-sdk')

const AWSaccessKeyId = 'none';
const AWSsecretAccessKey = 'none';      
const AWSregion = 'none';
const AWSendpoint = 'http://localhost:8000'
AWS.config.update({
    accessKeyId: AWSaccessKeyId,
    secretAccessKey: AWSsecretAccessKey,  
    region: AWSregion,
    endpoint: AWSendpoint
});
```
[Flutter][iOS]前の画面に戻らせないようにする

WillPopScopeウィジェットを親にして、onWillPopでFutureのfalseを返すようにする。

```dart
    WillPopScope(
      onWillPop: () async => false,
      child: Text('hoge'),
    );
```

[Flutter: Disable Swipe to Navigate Back in iOS](https://stackoverflow.com/questions/49161644/flutter-disable-swipe-to-navigate-back-in-ios)
CSSの基本単位として使うと便利なrem


CSSでのフォントサイズ指定は「px」や「em」を使うのが一般的。
CSS3で追加された「rem」という単位がとても使いやすそうなので、使い方について調べてみた。

## rem と em の違い

emが親要素を基準としたサイズであるのに対し、remはroot (根っこ)が基準となっています。簡単に言うとhtmlに指定されたフォントサイズを基準とした倍率


```index.html
<html>
	<body>
		<div> ABCDEFG </div>
	</body>
</html>
```

```style.css

html{
	font-size: 62.5%; /*10px*/
}
 
body{
	font-size: 1.5em;
}
 
div{
	font-size: 1.5em;
}
```

**`ABCDEFGの文字サイズ = 10px * 1.5 * 1.5 =　22.5px`**

emは親要素を基準とした単位なので、こういう計算になる。
次に、remを使った場合の挙動。

```style.css

html{
	font-size: 62.5%; /*10px*/
}
 
body{
	font-size: 1.5rem;
}
 
div{
	font-size: 1.5rem;
}
```

**`ABCDEFGの文字サイズ = 10px * 1.5 = 15px`**
bodyに指定されたfont-size:1.5em;は無視して、htmlに指定された10pxを基準としたサイズが求められます。
Amazon EC2 Inf1 インスタンスについて

この記事は株式会社ナレッジコミュニケーションが運営する[Amazon AI by ナレコム Advent Calendar 2019](https://qiita.com/advent-calendar/2019/knowcom-amazonai)の17日目にあたる記事になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/67939b8d-8473-463c-df34-52b3c1d5314a.png)



##はじめに
AWS re:Invent 2019にてAmazon EC2 Inf1インスタンスが発表されました！
Amazon EC2 Inf1インスタンスは、AWSが設計、開発、をしたハイパフォーマンス機械学習推論チップであるAWS Inferentiaチップを16 基まで利用でき、推論チップを最新のカスタム第2世代インテル® Xeon®スケーラブルプロセッサおよび最大100Gbpsのネットワークと組み合わせることにより、ハイスループットの推論を可能にしました。

簡単にまとめると、AWSで機械学習の推論を実行するのに最適化されたインスタンスです。

###AWS Inferentiaチップとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/11a84ff2-487a-a26a-c627-ccaf80fda8eb.png)


AWS がカスタマイズした、高パフォーマンスの機械学習推奨チップ

- 高性能

AWS Inferentiaの各チップは低電力で最大128TOPS(1秒間に数兆回の操作)のパフォーマンスをサポートしています。また、AWS InferentiaはFP16、BF16、およびINT8データ型をサポートしています。さらにAWS Inferentiaは32ビットのトレーニング済みモデルを取得しており、BFloat16を使用して 16 ビットモデルの速度での実行が可能です。

- 低レイテンシー
AWS Inferentiaは、大規模なオンチップメモリを特徴としています。このため、大規模なモデルのキャッシュが可能となり、チップ外に保存する必要はありません。この結果、AWS InferentiaのプロセッシングコアであるNeuronコアがモデルへ高速でアクセスでき、チップのオフチップメモリ帯域幅によって制限されないため、推論レイテンシーの低下に大きく貢献します。

- 使いやすさ
AWS Inferentiaには、AWS Neuronソフトウェア開発キット(SDK)が付属しています。これで、複雑なニューラルネットモデルが利用可能となり、AWS InferentiaベースのEC2 Inf1インスタンスを使って実行する一般的なフレームワークで作成およびトレーニングすることができます。Neuronはコンパイラ、ランタイム、プロファイリングツールで構成され、TensorFlow、Pytorch、MXNetなどの一般的な機械学習フレームワークにも統合済みです。このため、EC2 Inf1インスタンスの最適なパフォーマンスが実現します。


###Amazon EC2 Inf1インスタンス仕様
以下、[Amazon EC2アップデート – 高性能で費用対効果の高い推論のための AWS Inferentia チップを搭載した Inf1 インスタンス](https://aws.amazon.com/jp/blogs/news/amazon-ec2-update-inf1-instances-with-aws-inferentia-chips-for-high-performance-cost-effective-inferencing/)で公開されている仕様になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/368c8cf5-2680-cc4b-c0d5-d8b44e65a2cc.png)


###Amazon EC2 Inf1インスタンス価格
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/d784dbe4-faa1-da3b-d5ec-17838065b115.png)

###Amazon SageMakerで間もなくAmazon EC2 Inf1インスタンスをサポート
Amazon SageMakerで作成したモデルがAmazon EC2 Inf1インスタンスのAuto Scalingクラスターで複数のアベイラビリティーゾーンに分散してデプロイされ、高いパフォーマンスと可用性が発揮されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229923/224bf644-4967-581c-6f50-ebe5a262c5d9.png)



##おわりに
2019/12/17現在、バージニア北部リージョンでEC2インスタンスとしては利用可能です。
Amazon SageMakerで使用可能になったタイミングで改めてご紹介したいと思います。

###関連URL
- [AWS Inferentia](https://aws.amazon.com/jp/machine-learning/inferentia/)
- [Amazon EC2 Inf1 インスタンス](https://aws.amazon.com/jp/ec2/instance-types/inf1/)
- [AWS re:Invent 2019](http://reinvent.awseventsjapan.com/)
VS Codeで空ディレクトリ表示を元に戻す方法



## 空ディレクトリの表示方法が変更された
バージョンアップに伴い、空ディレクトリを`/test/hoge/hoge`のように表示するようになった。
デフォルト設定。

## 元に戻す方法
`explorer.compactFolders`を設定で検索して、チェックを外す。
使っていれば慣れるかもしれないが。

## 参考
[version 1.41リリースノート](https://code.visualstudio.com/updates/v1_41)