OmniAICreator/Qiita-1.07M huggingface dataset:
レポート(深層学習)　後半後編

###Tensorflowの実装演習

TensolFlow
最も使われることが多く、Googleが作成

・セッションをランしていない段階ではTensorが定義されているだけのため、printだけでは中身は見えないことに注意
→sess.runで中身が分かる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/71698a1d-4d5d-ce34-9bd0-10785a864a62.png)

・プレースホルダー
→箱のようなものになっていて、後程、値を入力できる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/c6cde4b3-530f-89a5-488f-a69d7aa1188d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/817c001e-cf5d-5f1f-f01c-3f9375e441a6.png)





###強化学習
→長期的に報酬を最大化できる仕組みを考えていく

強化学習と通常の教師あり、教師なし学習との違い
→教師なし、あり学習では、データに含まれるパターンを見つけ出す
およびそのデータから予測することが目標
→強化学習では、優れた方策を見つけることが目標

・行動価値関数と状態価値関数
ある状態の価値に注目する場合は、状態価値関数
状態と価値を組み合わせた価値に注目する場合は、行動価値関数
Laravel: Cookiesが含んでいるテスト

# 背景

### LaravelのCookieの処理
Laravelでは、ユーザーの安全を守るため、`Middleware`でCookieの情報を暗号化され、認証コードで署名しています。CookieがLaravelのフレームワークで暗号化されていない場合（例えばクライエントで弄ったCookieや暗号化されていないCookie）、そのCookieが無効になって、リクエストから削除されます。

### PHPUnitでテスト行うとき

LaravelCookieの暗号化処理はすごく良い機能と思いますが、残念ながらテストでリクエスト関数の`call`や`post`などにCookieを渡せばこの暗号化の処理は<b>自動的に行われていません。</b>

つまり、下記のようにテストでCookieをリクエストに追加して、

```HogeControllerTest.php
       public function testHoge()
       {
            $cookie = ['hoge_test' => 'sugehoge'];
            $resp = $this->call(
                'get',
                '/hoge',
                [],
                $cookie
            );
        }
```
それで下記のようにコントローラーでCookieの値を取得しようとすると`null`が出力されてしまします。

```HogeController.php
    public function testCookie(Request $request)
    {
        dd(Cookie::get('hoge_test'));
        // null
    }
```

# Cookieを含んでいるテストする方法

## Laravel 6.x　以上

[このPR](https://github.com/laravel/framework/pull/30101) で簡単にCookieの処理ができるように関数を追加がしました。

### withCookies()

テストでリクエストを呼ぶとき`withCookies($array)`関数を追加して、`['キー' => '値']`の配列を引数としてわたすだけで、Cookieの暗号化の処理が行われます。

#### 注意点

PRによると

> To remain backwards compatible, the call method does not honor cookies set by these new methods.

後方互換のためこの新しい追加した機能は`call()`関数対応ではありません！つまりこの機能使いたいときリクエストの種類の名前の`post()`や`get()`などの関数を使う必要があります。

```HogeControllerTest.php
   public function testHoge()
   {
        $cookie = ['hoge_test' => 'sugehoge'];
        // withCookiesの関数追加
        // call()ではなく、get()にする
        $resp = $this->withCookies($cookie) 
            ->get('/hoge', []);
   }
```

テスト実行すれば、`sugehoge`がちゃんと出力されます。

ちなみに、Cookieを一つだけ設定する`withCookie($name, $value)`の関数も用いて、Cookieの`キー`と`値`を引数としてわたせば、`withCookies($array)`と同じようにCookieが正しく設定されます。

すごく便利な機能ですね！

##  Laravel 5.x 以上

勿論、下記に書いてある項目の方法はLaravel 6.x でも使う可能で、それがこのみなら使っても構いません！

### Middlewareを無効にする

Cookieの暗号化は`EncryptCookies`のミドルウエアで行われているので、それを無効すれば、テストが無事に走るはず。Laravelのテストではミドルウエアを無効にする`WithoutMiddleware`のトレイトが用いていて、それが使えます。

```HogeControllerTest.php
   use WithoutMiddleware;

   public function testHoge()
   {
        // middlewareを無効
        $this->withoutMiddleware(EncryptCookies::class);
        $cookie = ['hoge_test' => 'sugehoge'];
        // post()じゃなくて、call()つかいます
        $resp = $this->call('get', '/hoge', [], $cookie);
    }
```
今回テストをはしると,`sugehoge`、がちゃんと出力されます！

### Cookieを暗号化する

テストで暗号化が行われていないので、Cookieの値を暗号化するとテストが走るはず。Laravelのヘルパー関数`encrypt()`で暗号化処理ができる。

```HogeControllerTest.php
   public function testHoge()
   {
        // Cookieの値の暗号化行う
        $cookie = ['hoge_test' => encrypt('sugehoge', false)];
        $resp = $this->call('get', '/hoge', [], $cookie);
    }
```
テストをはしると,`sugehoge`が出力されます。

#### 注意点

`encrypt('値', false)`の関数に`false`を渡さないと値が`serialize`され、`"s:12:"sugehoge";"`が出力されてしまいます。なので、`false`を渡すのを忘れないで下さい。

## 終わり

いくつかの方法があります。
これから自分のテストにつかってみてください！

# 参照のリンク

https://readouble.com/laravel/6.x/ja/requests.html#cookies
https://readouble.com/laravel/5.1/ja/testing.html#disabling-middleware
https://github.com/laravel/framework/pull/30101
https://laravel.com/api/6.x/Illuminate/Contracts/Encryption/Encrypter.html
https://github.com/laravel/framework/issues/12032
私のためのgpu parallel

### ファイルから実行したいとき

````
ENSG00000000419 DPM1
ENSG00000000457 SCYL3
ENSG00000000460 C1orf112
ENSG00000000938 FGR
````

とかいうtsvファイルがあって、各行に対して

```
$ fx ENSG00000000419 DPM1
$ fx ENSG00000000457 SCYL3
$ fx ENSG00000000460 C1orf112
$ fx ENSG00000000938 FGR
```

をparallelで実施したい場合。

```
$ parallel -j 12 --colsep '\t' fx :::: genefile.txt
```

とすれば良い。

### パイプから実行したいとき

```
cat genefile.txt | parallel -j 12 --colsep '\t' fx 
```

とすれば良い
クロージャー 関数に引数を入れて後で実行したい場合

```py:
def outer(a, b):

    def inner():
        return a + b

    return inner# inner関数を呼び出すのではなくオブジェクトを返す

f = outer(1,3)
print(f)
print(f())
```

```:実行結果
<function outer.<locals>.inner at 0x7**c3dfa*****>
4
```
print(f)では
innerオブジェクトの情報が返ってきて、
a + bは実行されていない。

f()とするとinnnerが実行される。
#Rails + #MySQL /  Transaction と INSERT RECORD と ROLLBACK で排他制御の実験



# パターン1 - プロセスA

INSERTのあと、しばらく後続の処理が続くが、最後には失敗するケース
Transaction内の処理が失敗してロールバックする

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X1'); sleep 15; raise; }
# (0.7ms)  BEGIN
# User Create (0.9ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X1', '2020-01-09 08:18:34')
#
# ... wait ...
#
#  (10.4ms)  ROLLBACK
# from (pry):14:in `block in <main>'
```

# パターン1 - プロセスB 

プロセスAのTransaction内での処理と重複するレコードをINSERTする
プロセスAの処理が失敗するのを待ってからコミットされ、さらに後続の処理が開始・成功する

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X1'); puts 'OK!'; }
# 
# (0.5ms)  BEGIN
#
# ... wait ...
#
# User Create (2573.1ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X1', '2020-01-09 08:18:41')
# OK!
#  (9.4ms)  COMMIT
# => nil
```

# パターン2 - プロセスA

INSERTのあと、しばらく後続の処理が続いて、最後に成功するケース

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X2'); sleep 15; puts 'OK!'; }
# (1.0ms)  BEGIN
# User Create (2.2ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X2', '2020-01-09 08:22:14')
#
# ... wait ...
#
# OK!
#  (19.2ms)  COMMIT
# => nil
```

# パターン2 - プロセスB

プロセスAの処理が成功するまで INSERT は待ち受け状態になる
プロセスAの処理が成功してTransactionが終了すると、こちらのINSERTはユニーク制限に反することが確定するため、そのタイミングで処理が失敗する
INSERT より後続の処理は実行されない

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X2'); puts 'OK!'; }
#
# ... wait ...
#
#    (0.6ms)  BEGIN
# User Create (6831.2ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X2', '2020-01-09 08:22:22')
# (5.2ms)  ROLLBACK
# ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'X2' for key 'index_users_on_unique_id': INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X2', '2020-01-09 08:22:22')
```

# パターン3 - プロセスA

他のパターンと同じく、INSERTの後にしばらくTransaction内の処理が続く

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X3'); sleep 15; puts 'OK!'; }
```

# パターン3 - プロセスB

プロセスAのTransaction内での処理とは重複しないレコードをINSERTする
ユニーク制限に弾かれない登録なので、すぐコミットされる

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'Y1'); puts 'OK!'; }
# (0.8ms)  BEGIN
# User Create (0.9ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('Y1', '2020-01-09 08:18:38')
# OK!
#  (2.9ms)  COMMIT
# => nil
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Rails + #MySQL /  Transaction  & INSERT RECORD & ROLLBACK / Lock and wait example


# Pattern1 - ProcessA

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X1'); sleep 15; raise; }
# (0.7ms)  BEGIN
# User Create (0.9ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X1', '2020-01-09 08:18:34')
#
# ... wait ...
#
#  (10.4ms)  ROLLBACK
# from (pry):14:in `block in <main>'
```

# Pattern1 - ProcessB 

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X1'); puts 'OK!'; }
# 
# (0.5ms)  BEGIN
#
# ... wait ...
#
# User Create (2573.1ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X1', '2020-01-09 08:18:41')
# OK!
#  (9.4ms)  COMMIT
# => nil
```

# Pattern2 - ProcessA

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X2'); sleep 15; puts 'OK!'; }
# (1.0ms)  BEGIN
# User Create (2.2ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X2', '2020-01-09 08:22:14')
#
# ... wait ...
#
# OK!
#  (19.2ms)  COMMIT
# => nil
```

# Pattern2 - ProcessB


```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X2'); puts 'OK!'; }
#
# ... wait ...
#
#    (0.6ms)  BEGIN
# User Create (6831.2ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X2', '2020-01-09 08:22:22')
# (5.2ms)  ROLLBACK
# ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'X2' for key 'index_users_on_unique_id': INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('X2', '2020-01-09 08:22:22')
```

# Pattern3 - ProcessA


```
ActiveRecord::Base.transaction { User.create!(unique_id: 'X3'); sleep 15; puts 'OK!'; }
```

# Pattern3 - ProcessB

```
ActiveRecord::Base.transaction { User.create!(unique_id: 'Y1'); puts 'OK!'; }
# (0.8ms)  BEGIN
# User Create (0.9ms)  INSERT INTO `users` (`unique_id`, `created_at`) VALUES ('Y1', '2020-01-09 08:18:38')
# OK!
#  (2.9ms)  COMMIT
# => nil
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
プログラミングElixir 第11章 StringAndBinaries-6

#StringAndBinaries - 6

ネット上にこの問題だけ記載がされていなかったので（今の学習時点で）自分なりに解いたものを載せようと思います。

``` Elixir:StringAndBinaries-6.exs

defmodule Capitalize do
  def capitalize_sentences(str) do
    str_sp = String.split(str, ". ") |> List.delete("")
    _capitaliza_sentences(Enum.map(str_sp, &(String.capitalize/1)))
  end
  defp _capitaliza_sentences([]), do: ""
  defp _capitaliza_sentences([head | tail])  do
    head <> ". " <> _capitaliza_sentences(tail)
  end
end

Capitalize.capitalize_sentences("oh. a Dog. woof. ") |> IO.inspect # => "Oh. A dog. Woof. "

```

また、載っていないものがあったら載せようと思います！では！！
アイデアは早めに形にした方がいいぞ！2020

# アイデアは早めに形にした方がいいぞ！2020

似たような内容の記事は探せば５万と出てくると思います。
私もインターネットをクロールしているときに見たことがある気がします。

ですがそういった歴史上の出来事がすっかり頭から抜け落ちていた私は、どちらかといえば経験から学ぶタイプ、つまり愚者側の人間だったためこのような事態になってしまいました。

今後このようなことがないよう戒めのために記録を残しておくことにします。
読み物と思って見ていただければ感激です。

## :bookmark_tabs: TL;DR
アイデアは早い段階で形にしたほうがいいぞ！

## :house: 前書き
令和時代になった今、AWSをまともに触っていないのは自分だけなのではないかと思い、何かしらのWebアプリケーションをデプロイしてみようと思った9月の秋が始まりである。

## :wrench:何を作った？
動画の切り抜きをシェアするWebアプリを開発した。
個人的にめちゃくちゃ欲しかった。

<img width="1428" alt="スクリーンショット 2020-01-08 13.16.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367377/fb9aa392-16f2-224c-86ff-bce992b99bf0.png">

[https://cutters.work/home](https://cutters.work/home)
> 隙間時間を有効に
> CUTTERSは、動画や生放送を見たいが時間がない人のためのツールです。
> 他人が投稿したおすすめの動画ポイントをシェアして、盛り上がりましょう。

仕組みとしては単純で、youtubeの動画はパラメータを指定してやることで一定の範囲内を再生することができるため、これを利用したものになる。

入力値として`動画のURL`、`切り抜きの開始時間`、`切り抜きの終了時間`を指定してやることで下記のようなクエリを作成する。

```html:切り抜きのiframe要素
<iframe 
  src="https://www.youtube.com/embed<%= @uri.path %>?start=<%= @cutter.start_time %>&end=<%= @cutter.end_time %>" 
>
</iframe>
```

これをiframeなどの要素で表示することで切り抜きを簡単に投稿、シェアすることができるというサービスである。

<img width="1428" alt="スクリーンショット 2020-01-08 14.51.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367377/321fb246-dded-743d-36a5-99545cb84a69.png">

今回はAWSに慣れるということに重きを置いていたので、Webアプリケーションを楽にデプロイできるという認識のもと<b>Elastic Beanstalk</b>というAWSのサービスを利用することにした。

また、慣れているという理由から<b>Ruby on Rails</b>を使用して開発をすることに決めた。
<b>仕組み自体は難しいものでもなく、EC2を利用したことはある</b>。

短い時間で公開ができそうだな。

## :computer: 開発環境
* Mac book pro
* Runy on Rails 6.0.2
* ruby 2.6.3
* Docker

## :poop: 問題が発生する
だが、アプリの<b>公開</b>は順調に進まなかった（今では<b>後悔</b>ばかりだ）

### 問題1. Elastic Beanstalkわからない
単にWebアプリを開発してデプロイするだけなら簡単そうだと考えた俺は背後から近づいてくるwenpackerに気づかなかった。

Rails6は標準でwebpackerでのjavascriptの処理をサポートしており、Elastic Beanstalkでデプロイするときにも、独特の設定を記述しないといけない（例えば`yarn`などのコマンドがインストールされていないといけないなどだ。）

設定ファイルは以下のドキュメントを見ながら設定することができる。

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/ebextensions.html

まずここの設定で詰まってしまった。

[あるブログ](https://austingwalters.com/rails-6-on-elastic-beanstalk/
)を参考に、公開されている設定ファイルに追加で以下のように記述することでエラーログが発生しなくなった

```
19_install_webpack_rails:
     command: "bundle exec rails webpacker:install"
     command: "rails webpacker:install"
```

しかし、今度はエラーログが発生していないのにもかかわらず、状態が`Failed`になるという問題にぶつかってしまった。
sshで接続し、直接エラーログを参照しても、コマンドは正常に終了していると表示されており、エラーが発生していないため原因は謎だ。

***

余談だが私はAWSの無料枠を利用しており、無料枠の80%を超えると「そろそろ超えるよ」というメールを受け取るように設定していたのだが、「そろそろ超えるよ」メールと、料金発生メールが同時にくるという現象に襲われてしまった。

***

このようにAWSと格闘していると２週間の時がすぎてしまった

### 問題2. 先駆者現る
もたもたしている間に同じことを考えていた人が似たサービスを公開してしまった。

完全にレスポンシブデザインで作成された美しいそれはcssやWebデザイン初学者の私を過去へ置き去りにした:walking_tone3:

AWSを学ぶことに重きを置いていたとはいえ先をこされてしまったのは純粋に悔しかった。
主機能さえ作ってしまえば細かいところはあとで足していけば良かったのである。

物づくりのモチベーションが落ちるのは、自分の作っているものに価値がないと気がついたときだと知った。

## :bow_tone1: 結論
主機能が出来次第デプロイし、徐々に改善していくのがいいかも
Maya USD(Universal Scene Description) prebuilt binary のメモ

## 背景

* Maya で USD テストシーンをつくりたい
  * Blender 2.82 から USD 対応っぽいが, nightly ビルド(2020/01/09 時点)ではまだだった.
    * (2020/01/15) 2.82 beta から対応しました! Export ができます(Import はまだ) 
 
NVIDIA に prebuilt ありますが, Maya などの third_party plugin はありません.

Building Pixar's USD for Maya
https://polycount.com/discussion/210698/building-pixars-usd-for-maya

Windows ですと prebuilt を作ってくれている方がいました. ありがたく使わさせていただきましょう.

https://github.com/VictorYudin/saturn/releases

(2020/01/09 時点で USD 19.11)

Maya plugin は, MODULE 形式になっています(`.mod`). パッケージ一式をどこかに配置し,  Maya.env あたりで


```
MAYA_MODULE_PATH=C:\Users\syoyo\local\usd\third_party\maya;%MAYA_MODULE_PATH%
```

などとして, `usd.mod` へパスを通します.

あとは Maya plugin window で `pxrUsdExport` あたりにチェックを付ければいけます!

![usd-exporter.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/d960edea-8b07-d144-f74b-569c11eff5c3.png)
レポート(深層学習)　後半前編

###再帰型ニューラルネット ワークの概念
####RNNの重み
1．入力から現在の中間層を定義する際にかけられる重み(W＿IN)
2．中間層から出力を定義する際にかけられる重み(W_out)
3．中間層から中間層の重み(W)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/96fe13cb-faa1-4de7-a4d8-081bef1a7bdc.png)

weight_init_stdを1→0.5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/7185e54a-f6fa-611f-6a9c-a6eb47258a4a.png)

learning_ratを0.1→0.5
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/031d70cc-761a-122c-5c8c-b612849307b5.png)

hidden_layer_sizeを16→30
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/8a9236a8-ef63-bf75-59a5-c0b167ad0e97.png)

・重みの初期化方法を変更
Xavier
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/74086d86-db72-e09f-c4a2-0ef16565410f.png)

He
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/399be476-9e18-1200-c670-747f5a22e3ea.png)


ReLU関数
→勾配が激しい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491045/d883ed38-6489-2cdd-86e7-31cc115e4053.png)

・BPTT
→RNNにおいてのパラメーターの調整方法の１つ

・ビジネス事例
→GPU周り等のインフラ(AWSやGoogle Cloud)
→スマートミラー(鏡とコミュニケーションが取れる。化粧の仕方)
→肌の異常検知
→ニキビができる箇所と推測される原因を組み合わせて、
　おすすめレシピやサプリメントの提案もできるのではないか

→筋トレやセルフエステに使用できるのではないか。
(本来のフォームとは異なるフォームを以上として判断するなど)

###LSTM 
時系列をさかのぼるほど勾配が消失していく。
構造自体を変えて解決したものがLSTM

・勾配消失問題とは
→誤差逆伝番法が下位層に進むにつれ、勾配が緩やかになり、
収束しなくなる

・勾配爆発
→かけあわされていき、指数関数的に大きくなっていく

・クリッピング
gradient*rareが返される

・CEC
→勾配爆発の解決法として、勾配が1であれば解決できる
→時系列データの学習特性が無い、重みが一律化してしまう

・忘却ゲートとは
→キャッシュのようなもの

・セルの状態を更新
input_gate*a+forget_gate
→新しいセルの状態は、計算されたセルの入力と1ステップ前のセルの状態に入力ゲート、忘却ゲートをかけて足し合わせたもの

###GRU

・LSTMではパラメーター数が多く計算負荷が高くなる
　→GRUではパラメーターを大幅削減し精度は同等またはそれ以上

・GRUの新しい中間状態
→(1-z)*h+z*h_bar

・LSTMとGRUの違い
　→LSTMのほうがパラメーター数が多い
　→両方使用してみて、向いているほうを使う

GRUは、LSTMよりもゲートが1つ少なく、入力ゲート、出力ゲート、忘却ゲートの代わりに更新ゲートがある
更新ゲートは最後の状態からどれだけの情報を保持し、前の層からどれだけの情報を取り込むかを決定する
更新ゲートはLSTMの忘却ゲートのように機能するが、位置付けが異なり、出力ゲートはない
GRUの方が高速で簡単に実行できるが、表現力を必要とする場合は向かない

###双方向RNN (BidirectionalRNN)
→過去の情報だけでなく、未来の情報を加味する
→入力層、中間層においては順方向(過去から未来)の部分は通常のRNNと同じ
出力層においては逆方向(未来から過去)の部分と統合される


双方向RNNでは順方向と逆方向に伝番した時の中間層表現を合わせたものが特徴量となる
→np.concatenate([h_f,h_b[::-1]], axis=1)


###Seq2Seq 
機械翻訳などのモデルに使われる
一問一答しかできない

・Encode　RNN
→ユーザーがインプットしたテキストデータを単語等のトークンに区切って渡す

最後のベクトルを入れたとき、final stateとしてとっておく
final stateがthought vectorと呼ばれ、入力した文の意味を表すベクトルとなり、これがデコーダーに渡される

・Decodee RNN
→システムがアウトプットしたデータを単語等のトークンごとに生成する構造

→次にくる単語を予測して、渡していく
→ベクトルを言語化していく


単語はベクトルであり、単語埋め込みにより別の特徴量に変換する
→E.dot(w)

HRED・・・同じ回答になる
VHRED・・・文脈に沿いつつ、ランダムな回答

VAE
→自己符号化器の潜在変数に、確率分布を導入したもの

###Word2vec 
学習データからボキャブラリを作成

####one-hotベクトル
→合っている場合は1、違う場合は0

・ポイント
ボキャブラリ×任意の単語ベクトル次元で重み行列が誕生するため、
次元を減らした状態でも単語を意味がある値として算出できる

・CBOW
→コンテキスト(周囲の単語)からターゲットの単語を予測
 コンテキストを入力値としてターゲットとする単語の事後確率が最大になるよう学習する
予測した出力結果(確率)と正解値の差をみて、誤差が小さくなるよう重みを更新することで学習を行う

・skip-gram
→中央の単語からコンテキスト(周囲の単語)を予測する

###Attention Mechanism
「入力と出力のどの単語が関連しているのか」の関連度を学習
重要度や関連度の学習により、長い文章への対応も可能となった

ネットワークは翻訳前後の単語の対応関係を学習し、単語列の出力時に対応する入力の単語を引っ張ってくることで長い文書でも翻訳の精度をあげる
GitLabをDocker+Apacheでサブディレクトリ運用する

## はじめに
OSSのGitリポジトリマネージャ[GitLab](https://about.gitlab.com/)をDockerのコンテナ上で運用します
サブディレクトリで運用し，https&#58;//example.com/gitlab みたいなURLからアクセスできるようにします

## 構成
* Apacheでwebブラウザからの接続を受け，リバースプロキシでlocalhost:3000にHTTP接続
 * HTTPSを使う場合でも，ApacheでHTTPS接続を終端
* Dockerで3000番ポートからコンテナの80番ポートに接続

これにより，システムの環境とGitLabの環境をコンテナで分離して運用できます
また，ApacheでHTTPS接続を終端するので，GitLab側で余計な設定が不要になります

## 環境
* Debian 9.11
* Apache 2.4.25
* Docker 1.13.1
* docker-compose 1.16.1
* GitLab 12.5.0

## 前提条件
ApacheやDocker, docker-composeのインストール及び基本的な設定は完了している事
HTTPSを使うならその設定も

## 手順
### 1.Dockerのコンテナを作成
* 以下の内容で`docker-compose.yml`を作成し，コンテナを起動します
* ポート番号は3000で最低限の設定を記述
* 3000 や example.com とした箇所は必要に応じて書き換えてください

```yaml:docker-compose.yml
web:
  image: 'gitlab/gitlab-ce:12.5.0-ce.0'
  restart: 'always'
  hostname: 'example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://example.com/gitlab'
  ports:
    - '3000:80'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'
```
```bash
$ sudo docker-compose up -d
```

### 2.Apacheでリバースプロキシの設定を追加
* 以下の内容で`/etc/apache2/sites-available/gitlab.conf`を作成し，設定を有効にします

```apache:/etc/apache2/sites-available/gitlab.conf
<Location /gitlab>
ProxyPass http://127.0.0.1:3000/gitlab/ nocanon
ProxyPassReverse http://127.0.0.1:3000/gitlab/
Header edit Location ^http:// https://
</Location>
```
```bash
$ sudo a2ensite gitlab.conf
$ sudo systemctl reload apache2
```
## 動作確認
* 以上の設定で https&#58;//example.com/gitlab からGitLabにアクセスできるはずです
 * コンテナの再起動直後はProxy Errorや502が表示されますが，数分でアクセスできるようになります


## その他
* GitLabの設定ファイルは`/srv/gitlab/config/gitlab.rb`から編集可能
* 変更後は以下のコマンドでGitLabを再構成します

```bash
$ sudo docker ps # コンテナ名(NAMES)を確認
$ sudo docker exec -it (コンテナ名) gitlab-ctl reconfigure
```

## 参考
[GitLab Docker images | GitLab](https://docs.gitlab.com/omnibus/docker/)
[ApacheやNginxでHTTPS通信をリバースプロキシする - grep Tips *] (https://www.greptips.com/posts/1238/)
Convex Hull Trickを知っていますか？僕は知っています。

今回は、Convex Hull Trickを履修したので解説記事を書きます。
# Convex Hull Trick とは
[COLOCON -Colopl programming contest 2018- Final-C スペースエクスプローラー高橋君](https://atcoder.jp/contests/colopl2018-final-open/tasks/colopl2018_final_c)
を解こうとして、わからなくて、解説を見て、詰まりました。
知らないデータ構造は勉強しなきゃだめですか？だめですね
ということで、やってみたので記事にします。
Convex Hull Trickは、次のような操作ができるデータ構造(?)です。
・直線集合に直線を追加する( $ax+b$ の形で）
・ある $x$ に対し、集合の中で最小値（最大値）をとるような直線の値を求める

愚直に実装すると、追加される直線の本数を $N$ 本、最小値クエリの数を $Q$ 回として、当然 $O(NQ)$ かかるのですが、Convex Hull Trickを使うことで、追加を含めても計算量を $O((N+Q)\log^2 N)$ （特殊な場合は $O((N+Q)\log N)$ とか $O(N+Q)$ にできます。）
# 全体的な方針
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/23bda00f-fe64-4033-3567-614b5b107e7c.png">
このようなグラフを考えてみます。
固定された $x$ について、選ぶ直線の傾きを増加させていったときにとる値は下に凸になります。
よって、直線集合をキーとしてソートしておくことにより、二分探索で最小値を求められます。
# 不要な直線の削除
さて、これを実現するには「不要な直線の削除」という操作が不可欠になります。
次のグラフを見てください。
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/3b9796cd-3ddc-f4d7-ba34-f9a880adffe9.png">
先ほどのグラフにはなかった直線が追加されています。
また、この直線は、いかなる $x$ についても最小値をとらないので、不要です。
実は、このような不要な直線があると、先に挙げた凸性が成り立たず、二分探索ができなくなってしまいます。
そこで、このような不要な直線を取り除く操作が必要となります。
直線を追加する操作のたびにこの削除操作が必要になりますが、この操作がどんなときに必要か考えてみます。
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/f9775f44-5e72-0e90-3b8d-cd866b55fadb.png">
黄色い直線を赤い直線と青い直線があるところに追加するときのことを考えます。
この黄色い直線は、
このとき、黄色と青の交点は赤と青の交点より左側（ $x$ 座標が小さい）にあります。
逆に、次のような場合を考えます。
<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550283/22472620-41d8-9bd8-e826-8aacb001328b.png">
この場合、上の場合とは逆に、黄色と青の交点は赤と青の交点より右側にあります。
結局、この交点の位置関係は、黄色の直線が赤と青の交点より下を通るか、つまり必要かどうかと対応するので、これを調べれば黄色の直線の必要性が判定できます。
黄色の直線が直線集合に入るとした時、傾きがその前後にある2直線の間に入り込むことになるので、傾きが前後にある2直線との判定を行えばいいです。
また、その前後の直線が不要になるか、なども同様に判定できます。
# 実装
上に挙げたように必要ない直線の削除を次のように行っていけばいいです。
・直線 $l$ を追加するとする。傾きが $l$ の前後に位置する直線をそれぞれ $l',l''$とする。
・直線 $l$ の必要性を $l',l''$ から判定する。必要なかったらここでおしまい。
・$l$ を追加したら、$l'$ の必要性も判定する。ここで $l'$がいらなかったらその前も、と以下同様に
・$l$ を追加したら、$l''$ の必要性も判定する。ここで $l''$がいらなかったらその後も、と以下同様に
削除される直線の数は最大で追加される直線の数だけなので、削除の計算量は特にボトルネックに影響を与えません。
直線の任意位置への追加と削除を効率的に行い、二分探索も行う必要があるので、std::mapなどの連想配列が適役です。
ただ、次に挙げる場合はmapを使う必要がないので計算量を削減できます。

・追加する直線の傾きが単調減少（単調増加）の場合
先頭や末尾にしか追加をしないので、std::vectorやstd::dequeで十分です、logがひとつ落ちます。
・クエリで与えられる $x$ が単調減少（単調増加）の場合
std::dequeで先頭や末尾を削除しながらどんどん進んでいくと二分探索がいらなくなるので、logがひとつ落ちます。
・上の二つを同時に満たす場合
両方実装すればいいのでlogがふたつ落ちます。

同じような感じで、追加する直線の傾きが今までのすべての直線より大きいか小さいかのどちらかの場合、とかもできますがなかなかに意味不明なクエリなので気にしなくていいでしょう。
自分はこんな感じの、クエリの種類によって計算量が異なるタイプのデータ構造はそれぞれ最適に実装したくなるんですが、「logがふたつついてもしらん！」みたいな人は、mapだけで実装してライブラリ化してもいいと思います。
実装を分ける場合は、クラスにしてコンストラクタ引数で種類を見分けるとらくです。引数を忘れて使うとき困りそうな場合は別のクラスに継承して自分で分かる名前にしておくともっとらくです。自分はセグ木とかはこうしています。
# サンプルコード
現在実装が完成している、直線追加クエリの単調性にのみ対応したものを貼ります。
[Convex Hull Trick サンプル](https://ideone.com/sNcvvu)
N=100000で1.5倍以上速くなったので、logを落とすのは大事そうです。
# おわりに
Convex Hull TrickはAtCoderではたぶんあまり出てきません（今更）
結構高度なアルゴリズムですが、JOI本選などで出てきそうな雰囲気の問題はいくらでも思いつき、また、最近のAtCoder企業コンテスト本戦などでも高度アルゴリズムがよく出るので書けて損はないでしょう。
オンプレ環境のGitlabでPipeline statusのバッジを貼るには

# 概要
オンプレミス環境でのGitlabでCIのビルド状況をバッジでREADMEに貼りたい場合の方法を説明する。

# 方法
以下のようにREADMEに記載すればよい。

```markdown
![pipeline status](<オンプレGitlabのURL>/<group>/<project>/badges/<branch>/pipeline.svg)
```
`<>`の中身を適した内容にすればよい。
こんな感じでバッジができれば成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267287/7813bf09-6964-2547-95a4-eeaec4811899.png)
Ubuntu18.04で warning: Settings locale failed. が出るのでLocaleの設定を行って解決する

こんにちは、WSL2のRelease版が待ち遠しいかめねこです。
Localeに関するwarningが出てウザかったので解決した備忘録です。

## 前置き
WSL2ではファイルシステム周りが大幅に改善されるらしいですね。
ただ、執筆時点ではまだInsider Previewにしか配信されておらず、会社のマシンで使うにはもう少し時間がかかりそうです。
そこで、私はHyper-V上にUbuntuをインストールして、WSL1からSSHして利用しているのですが、例えば`apt update`などをするたびに以下のようなwarningが出るようになりました。

```
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
```

warningが出るだけで特に動作には問題ないのですが、出続けるのも気持ち悪いので修正しました。

## 環境
- OS: Ubuntu 18.04
- プラットフォーム: Hyper-V
- WSLからSSHで接続

## 私はLocaleの再設定でなおりました
`perl: warning: Setting locale failed.`でググるといっぱい出てきます。
その中にはいろいろな対処法や原因があるのですが、私の場合はタイトル通り、Localeの設定を行うことででなくなりました。

初期状態では入っていなかった（であろう）日本語のLocaleを追加し

```
> sudo locale-gen ja_JP.UTF-8
[sudo] password for takuma:
Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.
```

追加したLocaleから再度Localeを設定します。

```
> sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
```

このとき、以下のように様々な言語がつらつらと並んでいるのですが、そのうち（私の場合は）以下の2つにチェックが入っていることを確認します。
多分デフォルトで入ってくれます。

- en_US.UTF-8
- ja_JP.UTF-8

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182057/473338b4-8293-054a-b841-29af456f4862.png)

そして、デフォルトの言語を選択します。
`en_US.UTF-8`を選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182057/0bca6d4e-5a64-7583-9d7f-950d4b3d3f05.png)

`Generation complete`と出れば完了です。

```
> sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
```

適当なコマンド（`apt update`とか）を叩いてwarningが出ないことを確認して完了です👍

## おわり
人によってはSSHの設定だったりすることもあるようで、一概にこの方法でうまくいくわけではないようです。
ということで、私はこんな方法で直りましたよという備忘録。
Gutenbergのブロック作成の前に知っておくこと

#Gutenbergとは
Gutenbergとは、WordPress5.0から標準となったエディタです。
読み方：ぐーてんべるぐ
どんなものなのかは公式のドキュメントに載っています。
https://ja.wordpress.org/gutenberg/
WordPress5.0からTinyMCEエディタ（便宜上、以下クラシックエディタと呼びます）はGutenbergエディタに置き換わりました。
エディタをどちらかから選べるようになったではなくて、置き換わりました。
今回はその新しいエディタ「Gutenberg」について調べたことを書きます。
よくある導入記事だと思ってください。色々と試行して感じたことを中心に書いています。

##Gutenbergからクラシックエディタに戻すことができる
###プラグインから戻す
これまでのクラシックエディタは公式からプラグインとして提供されています。
https://ja.wordpress.org/plugins/classic-editor/
こちらのプラグインをインストールして有効化すればGutenbergがクラシックエディタに置き換わります。
記事フィールドが対象となります。プラグインにもよりますが、カスタムフィールドは置き換わりません。
一括で置き換わるので、エディタの併用はできません。
また、TinyMCEで使用していたエディタ装飾のプラグインはGutenbergでは使用できない、というものがほとんどです。
###コードからフィルターを使用して戻す
use_block_editor_for_postフィルターを使用すると、クラシックエディタを使用するかしないかを切り替えることができます。
こちらの方法だと投稿タイプごとの分岐も作成できます。
https://developer.wordpress.org/reference/functions/use_block_editor_for_post/

```
function my_use_block_editor_for_post($use_block_editor, $post)
{
	if($post->post_type == 'fuga') 
	{
		return true;
	}
	return false;
}
add_filter( 'use_block_editor_for_post', 'my_use_block_editor_for_post',10,2);
```

参考
https://www.nxworld.net/wordpress/wp-disable-gutenberg.html

##Gutenbergでの入力/表示のカスタマイズはほぼJavaScriptで行う
Gutenbergのカスタマイズ…というはほぼブロックの作成になるのですが、ブロックの作成自体はJavaScriptで行います。
カスタマイズしたブロックをプラグインとして登録します。登録する処理はPHPで書きますが、ブロックの作成はJavaScriptです。
どうにかしてPHPのみでできないのか…というのはほぼ不可能なのでカスタマイズが必要な場合はJavaScriptを覚えましょう。
（注：React+JSXで作成しますが、そのあたりは別で書きます）

誤解の招かないように書いておくと、JavaScriptのみでも作成できません。PHPとJavaScript両方の知識が必要です。
複数人で分業して作成もできなくはない…ですが、だれかが完璧でなくてもいいので、両方を知っている方が楽なように感じます。

HTML/CSSについては書けなくてもいいのですが、人が書いたものを理解できる程度の知識はあったほうがいいです。
実際にブロックを作った時には、ブロック要素/インライン要素についてと、class名とid名の違い、セレクタについては頭に入れておいたほうがいいと感じました。

##解説サイトは少ない
2020年1月現在、Gutenbergについて解説しているサイトは本当に少ないです。
エディタの使用方法についてという観点ではそれなりに存在しますが、カスタマイズについては少ないです。
そのため「コピペして動かせる」というようなサンプルはほぼ出回ってません。

##カスタムフィールドとの併用について
カスタムフィールドとは併用できます。こちらの場合、エディタにWYSIWYGを指定するとクラシックエディタを使用できます。
（むしろエディタとしてGutenbergを使用するプラグインは今のところ少数派なような気がします）
おそらくなのですが、カスタムフィールドを操作するプラグインの場合はプラグイン独自でWYSIWYGエディタを持っているので、WordPressの変更点とはあまり関係がないのかも…ですね。
画像はカスタム投稿に記事入力としてGutenbergを使用して、カスタムフィールドのプラグイン「Smart Custom Fields」にてカスタムフィールドを追加してみたものです。
![gutenberg_and_customfields.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404526/e0ed70f9-099e-6a0d-ef1b-9e450d1a1874.png)


##作成した独自ブロックはプラグインとして登録する（ほうが良い）
Gutenbergをカスタマイズする場合は、だいたいは「独自のブロックを作成」という方法になります。
作成した独自のブロックをプラグインとして登録し、有効化させることで独自ブロックが使用できます。
また、使用しないときは作成したプラグインを停止させます。
functions.phpに書かなくても良いので、コードがしっちゃかめっちゃかにならなくて済みますね。
（プラグイン化せずともfunctions.phpで登録できなくもないですが、管理が面倒になります）
プラグインにしておくと、別のサイトでも使おうとなった時に設定が楽です。プラグインを持ってくれば良いだけなので。

#チュートリアルに沿ったブロック作成+開発環境について
長くなりましたので、記事を分けました。続きは次回に。


#追記
2020/1/15
クラシックエディタに戻す方法にフィルターでの方法を追記しました。
Google Apps Script 現在の日付を取得（スプレッドシート）

#はじめに
[Google Apps Script 見積書からデータを転記し、請求書を作成（スプレッドシート）](https://qiita.com/kokogento/items/420b80924c36e2674d5b)

上記の記事に追加情報という感じですが、**請求書を作成した日の日付を記載したい**としましょう。

#今日の日付を取得

```javascript
//今日の日付
  var today = new Date();
//表示フォーマットを設定
  var todayData = Utilities.formatDate(today, 'Asia/Tokyo', 'yyyy年 MM月 dd日');
```

フォーマットは`'yyyy/mm/dd'`にすることもできます。

あとは`todayData`を

```javascript
var sheet = SpreadsheetApp.getActiveSheet(); 
sheet.getRange('H2').setValue(todayData); //日付
```

みたいな感じにしてやればOK。

#最後に
[Google Apps Script 見積書からデータを転記し、請求書を作成（スプレッドシート）](https://qiita.com/kokogento/items/420b80924c36e2674d5b)
の場合だと、

```javascript
invoice.getRange('H2').setValue(todayData); //日付
```

となります。
HoloLens 2 開発入門 ～ManipulationHandlerとAppBar～（Unity2018.4.2f1、MRTKv2.2）

前回の記事 [HoloLens 2 開発入門 ～BoundingBoxとAppBar～（Unity2018.4.2f1、MRTKv2.2）](https://qiita.com/SatoshiGachiFujimoto/items/b02ac516dded52d9a021) では、Cubeの移動ができません。
MRTKのManipulationHandlerを用いれば、Cubeの移動・回転・スケールを変更することが可能です。
しかし、AppBarと併用するとAdjust中に回転やスケールを変更したいのに誤って移動してしまい困難だったため、Adjust中は移動しない設定にしてみました。他の案としては、手のメッシュを表示して、それぞれの操作時の挙動を変えるなどの工夫でもいいかと思います。

# 開発環境
- HoloLens 2
- MRTK v2.2.0
- Unity 2018.4.2f1
- Visual Studio 2019
- Unity Hub 2.2.2

# 仕組み
AppBarのStateがAppBar.AppBarStateEnum.Manipulationの時にManipulationHandlerをfalse、それ以外の時にManipulationHandlerをtrueにします。

1．前回の[記事](https://qiita.com/SatoshiGachiFujimoto/items/b02ac516dded52d9a021)に従ってプロジェクトを作成してください
2．CubeにManipulationHandlerをアタッチ、図のようにHost Transform／One Handed Only／Move Scale／Eventsのパラメータを設定します
3．ManipulationHandlerManager.csを作成（下に記述）、Cubeにアタッチします
4．Cubeの子オブジェクトのAppBarをManipulationHandlerManagerのAppBarにアタッチします
 ![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/0c3995b2-af93-5e1f-d9fc-38f44c82175c.png)

# プログラム

### ManipulationHandlerManager.cs

~~~CSharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.Toolkit.UI;

public class ManipulationHandlerManager : MonoBehaviour
{
    public AppBar appBar;
    private AppBar.AppBarStateEnum state;
    
    // Update is called once per frame
    void Update()
    {
        state = appBar.GetComponent<AppBar>().State;
        // Debug.Log(state);

        if (state == AppBar.AppBarStateEnum.Manipulation){
            this.GetComponent<ManipulationHandler>().enabled = false;
        } else {
            this.GetComponent<ManipulationHandler>().enabled = true;
        }
    }
}
~~~

# デモ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">AppBarで回転とスケールの調整、ManipulationHandlerで移動のみにした <a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> <a href="https://twitter.com/hashtag/MRTK?src=hash&amp;ref_src=twsrc%5Etfw">#MRTK</a> <a href="https://t.co/5zdjYF1Ld7">pic.twitter.com/5zdjYF1Ld7</a></p>&mdash; 藤本賢志(ガチ本)@HoloLens2 Ready (@sotongshi) <a href="https://twitter.com/sotongshi/status/1215538776459505664?ref_src=twsrc%5Etfw">January 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 参考文献
- [Manipulation Handler](https://microsoft.github.io/MixedRealityToolkit-Unity/Documentation/README_ManipulationHandler.html)
エンターキーでsubmitしたくないフォームをJavaScriptで制御する

入力フォームを選択した状態でエンターキーではsubmitしたくない(送信ボタンを押下した時だけsubmitしたい)場合、以下JSで制御できる。

```js

// 当該formのdata属性にdisallow-enter-submitを指定している前提
const forms = Array.from(document.querySelectorAll('form')).filter(el => el.getAttribute('data-disallow-enter-submit'));
if (!forms.length) return;

for (let i = 0; i < forms.length; i += 1) {
  const form = forms[i];
  form.addEventListener('keydown', e => {
    if (
      ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) && e.target.tagName !== 'TEXTAREA'
    ) {
      e.preventDefault();
      return false;
    }
    return true;
  });
}
```

## 補足

```js

((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) && e.target.tagName !== 'TEXTAREA'
```
- `13`はエンターキーのこと。
- `which`と`keyCode`の両方を指定しているのは、ブラウザによって挙動が異なるため。
- テキストエリア(複数行)を選択した状態だと、改行のためにエンターを押しただけでイベントがトリガーされて改行ができなくなってしまうため、`TEXTAREA`でない場合という条件も追加している。
APIとは何か、メリットも理解する

#はじめに
当初個人的にWebアプリケーションを空いている時間に作っていたのですが、**SPA**作りに挑戦してみようと思い、**API**という言葉にたどり着きました。その際、色々とQiita、Youtubeなどで調べてみたのですが、理解するのに思ったより苦労したのでこの記事に残していきたいと思います。今回は**API**（正確にはWeb API）というIT用語について、かなり掘り下げて解説していきます。

#対象読者
**API**という単語は聞いたことがあり、実際調べてみたものの難しい用語が多くてイマイチ理解できなかった方。（＊今回の記事では分かりやすさを重視しているので、かなり噛み砕いて説明しています。）

#APIとは何か
[IT用語辞典](http://e-words.jp/w/API.html)によると、
>**API**とは、あるコンピュータプログラム（ソフトウェア）の機能や管理するデータなどを、外部の他のプログラムから呼び出して利用するための手順やデータ形式などを定めた**規約**のこと。

ここから読み取れるのは**APIとは何かしらの規約である**というのが読み取れるかと思います。私も初めて説明を読んだときは何かしらの**規約**があるんだなくらいでした。しかし**API**を略さず読むと**Application Programming Interface**となり、APIは**インターフェース**でもあるのです。何かしらの規約であり、かつインターフェースである。少し分かりづらいですね。
ではまず**API**を少し分かりやすく和訳すると**『アプリケーションをプログラムして出来たインターフェース』**となります。つまり何かしらのアプリを加工（プログラミング）することで、何かと何かを繋ぐもの（インターフェイス）を作ることが出来るよ、を表しています。![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/568c7091-e01d-f6b6-214b-88fb54b5049f.jpeg)
では**アプリケーション**とは何か、上記の図の**『なにか』**とは何なのか。まず**アプリケーション**ですが皆さんお持ちのスマートフォンに入ってる**instagram**、**twitter**、**ライン**などです。ただ次に**なにか**を理解するためにはアプリケーションの構造を少し理解している必要があります。
通常、アプリケーションを開発するときは大まかに二つのものを作成しなければなりません。**フロントエンド**と**バックエンド**です。フロントエンドはアプリケーション内でアプリの**デザイン**を担当します。アプリを開いたときに描画されているものは基本的に全てフロントエンドの部分が作っていると考えて下さい。じゃあバックエンドは？となりますよね笑。バックエンドは大雑把にはアプリで扱う**データ**を担当しています。instagram、twitterなら**自分も含む全ての投稿された写真、文章**などです。ユーザーがページを開いたときに表示されるデータの部分は全て**バックエンド**からフロントエンドを通して画面に描画されているのです。例えばユーザーがアプリで何か投稿したら、フロントエンドからバックエンドにデータが送られ、逆に他人の投稿を見るときはバックエンドからフロントエンドにデータが送られます。下の図で理解してみましょう。![スライド2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/a0f85823-a37b-9fb3-d983-f88db495e18b.jpeg)
ここで一つ通常のアプリケーションの特徴をまとめておきます。
>1. フロントエンドとバックエンドの二つとも自分の中に置いている。
>2. フロントエンドはバックエンドとデータのやり取りをしている。

このようになりますね。それではもう分かっているかもしれませんが、上の図の二つの**なにか**を考えてみましょう。答えから言いますと二つの**なにか**はフロントエンドとバックエンドです。つまり**API**とはフロントエンドとバックエンドを繋ぐものなのです！
ここで恐らく『アプリの中でデータのやり取りが出来てるのに、何でわざわざフロントエンドとバックエンドを繋ぐものを作る必要があるの？』という疑問が出てくると思います。ただ下の図を見ると分かりやすいと思いますが、**バックエンド**をアプリケーションから完璧に**切り離します**。そして、切り離したバックエンドの部分と正確にはデータのやり取りする部分が**API**と呼ばれます。では何故もともと一つのアプリケーション内でまとめていたフロントエンドとバックエンドを切り離す必要があったのでしょうか？![スライド3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/480d8f80-4f55-7414-0512-46d24a04aead.jpeg)

#APIを使う理由は？
**API**を用いて、フロントエンドとバックエンドを分けると、ユーザーにとっても、アプリ開発者にとってもメリットが生じます。まずユーザーに関してはUIを通して**必要なデータのみ**サーバーからロード（Ajaxを用いて）すれば良いので**snappyな（サクサクな）**アプリが作れます。次にアプリ開発者にはフロントエンドとバックエンドを分けて**同時に開発**することができるのでアプリ開発にかかる時間を大幅に短縮させることができます。またバックエンドがフロントエンドと分離しているので、一つのAPIを準備出来れば、**複数のフロントエンド**を作れます。つまりPC版、iPhone版、Android版など様々なデバイスに対応するアプリケーションが作れます。（ただこれにはAPIが同じjson形式のデータを吐き出す為という理由もあります。）このように**API**を用いてアプリケーションを開発すると様々なメリットが得られます。

#最後に
記事の内容はいかがだったでしょうか？**API**に関して少しでも理解が深まれば幸いです。間違い、誤字などございましたら、お気軽に指摘していただけると助かります。次回はPythonを用いて実際に**API**を構築していきたいと思います。
[WSL] VS CodeでNext.jsのデバッグ

#環境
- WSL Ubuntu 16.04.6 LT
- Next.js 9.1.7

#手順

[Microsoft公式](https://github.com/microsoft/vscode-recipes/tree/master/Next-js)を参考にしますが、一部アレンジする必要があります。

それは以下の2点です。さくっと終わります。

- launch.jsonを変更
- VS CodeでRemote Debugを可能にする設定

以下、それぞれの手順です。

## launch.jsonを変更

```code:launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Next: Chrome",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}",
      "skipFiles": [
        "${workspaceFolder}/node_modules/**/*.js",
        "<node_internals>/**/*.js"
      ]
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Next: Node",
      "runtimeExecutable": "${workspaceFolder}/node_modules/next/dist/bin/next",
      "port": 9229,
      "env": {
        "NODE_OPTIONS": "--inspect"
      },
      "skipFiles": [
        "${workspaceFolder}/node_modules/**/*.js",
        "<node_internals>/**/*.js"
      ]
    }
  ],
  "compounds": [
    {
      "name": "Next: Full",
      "configurations": [
        "Next: Node",
        "Next: Chrome"
      ]
    }
  ]
}
```

参考：https://spectrum.chat/next-js/general/debugging-in-vscode~f93e5e29-6cce-4b43-8fed-e5a6d302d04e

## VS CodeでRemote Debugを可能にする設定

[こちらの記事](https://qiita.com/nj_ryoo0/items/a42c47436b77310f5430
)を参考に設定するだけです。
LaravelにてEloquentのfindとfirstOrFailにハマったけど、解決した話

# はじめに
以下のような使い方をしてしまい、想定した結果にならずハマりました

```php
// $idには1が入っている
$user = User::find($id)->firstOrFail();
```

知ってしまった今、なんてこと無い話になりますが、未来の自分に向けて備忘録を残しておきます

# Laravelのバージョン
```
$ php artisan -V
Laravel Framework 5.8.29
```

# 前提
- 以下のモデルは作成済み
  - App/User.php

# 結論
```php
// $idには1が入っている
$user = User::find($id)->firstOrFail();
```
上記のような使い方をすると、以下のように2回SQLが実行されていました

```sql
select * from users where id = 1;
select * from users limit 1;
```

そのため、変数には２回目のSQLの実行結果が入っており、想定した動作になっていませんでした

# 対策
以下の書き方であれば、同じ動きになるようです

## その①
```php
// $idには1が入っている
$user = User::findOrFail($id);
```

## その② firstOrFailを使用する場合（where句のあとはOKでした）
```php
// $idには1が入っている
$user = User::where('id', $id)->firstOrFail();
```

# 参考
[Laravel 5.8 Eloquent：利用の開始](https://readouble.com/laravel/5.8/ja/eloquent.html)
Typescriptで極力undefinedを書かない方法

# はじめに
Typescriptで未定義になる可能性のある変数や戻り値に``undefined``や``null``を出来るだけ割り当てたくないって話。

## 例
*注: ``users.find``は見つからなかった場合、`undefined`を返すとします。*

```typescript
function getUser(id: number): User | undefined {
  return users.find(v => v.id === id);
}

const a = getUser(1);

// しばらくのち
if (a) {...} // 'boolean'か'undefined'か'null'か曖昧

a.name // <- ガード忘れもあるよ
```

通常、このように`undefined`や`null`を返さざるをえないパターンってあると思いますが、これが長い式の間に入っていたりすると文脈上、正に不明な値になってしまったりするわけです。

という訳で一工夫してみます。


## 一工夫
```typescript
function getUser(id: number): { ['*']?: User } {
  const maybeUser = users.find(v => v.id === id);
  
  return maybeUser ? { ['*']: maybeUser } : {}
}

const a = getUser(1)

if (a['*']) {...} // 主張感あると思いません？

a.name // <- コンパイルが通らない

a['*'].name // <- こんなガード忘れしないでしょ
```

これで戻り値は`{ ['*']: value }`か`{}`のいずれかになり、文脈上でもしっかり主張してくれます。

``['*']``が気持ち悪かったら何でも良いです。個人的にピンとくる名前がなかったので記号にしちゃえってだけなので・・・。


## 参考

TypeScript Deep Dive 日本語版 NullとUndefined: https://typescript-jp.gitbook.io/deep-dive/recap/null-undefined
Visual Studio 2019 上の clang-cl と ARM64

（この記事は私の blog の http://umezawa.dyndns.info/wordpress/?p=7419 の転載です）

Visual Studio 2019 (Visual C++ 2019) ではプラットフォームツールセットとして clang-cl が公式に直接サポートされました。つまり、<a href="http://umezawa.dyndns.info/wordpress/?p=7216">以前書いた（※blogの方へのリンク）</a>ような感じで Visual Studio Installer 以外で別途何かをダウンロードする必要はありません。やったぜ。

以下の2つを両方ともチェックしてインストールすればよいです。依存関係があるはずですが、それを自動で解決してくれないのはイケてません。
![vs2019-clang-cl-install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395443/fc8a745f-5aa8-9037-d134-0e6e570f91ae.png)

多少楽になってハッピーなのですが、画像を見ての通りこの clang-cl は相変わらず x86/x64 のみのサポートで、 ARM/ARM64 はサポートされていません。 Windows 固有の何か（SEH とか？）がうまく動かないせいでまだサポートできていないのか、それともマイクロソフトがサボってるのかまではよく分かりませんが、残念です。せっかく Clang に移行しつつ ARM64 を研究しようかと思ったのですが。
AWS CodePipelineでgoアプリのDockerイメージをECRに格納する

## 実現したいこと
1. CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに  
   masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい
1. hoge-repoはgolangのアプリを持っているので，イメージ作成時にアプリのビルドも行う

## 環境
- Golang 1.13.5
- Docker 18
- AWS 東京リージョン


## やったこと
### CodeBuild構築
- プロジェクト名は任意の名前

- 送信元  
送信元はCodeCommitの対象リポジトリを選択

<img width="795" alt="スクリーンショット 2020-01-10 15.53.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/564850/ced38fce-09ee-1c37-5ef7-9c8ffbd0c0ee.png">

今回はmasterマージをトリガーにするのでリファレンスタイプはブランチ
対象ブランチはmasterを指定

- 環境  
Build環境は特に制限がなかったので`aws/codebuild/amazonlinux2-x86_64-standard:2.0
`を選択  
残りの環境設定はデフォルト

- Buildspec
Buildspecファイルを使用するを選択
buildspec.yamlは後ほど

- アーティファクト
今回はDockerイメージのpushまでで，実際にEKSでコンテナの立ち上げまで行わないので
アーティファクトはなしを選択

- ログ
ログの監視も今回は行わない

### CodeBuildの権限追加
今回はCodeCommitからソースをダウンロードし，ECRにイメージプッシュするため
CodeBuildのサービスロールに以下ポリシーを付与
```AWSCodeCommitReadOnlyAccess
AmazonEC2ContainerRegistryFullAccess
```

### buildspec.yml作成
codebuildでデフォルト設定にしたので hoge-repoのルートディレクトリにbuildspec.ymlを配置

```
hoge-repo
|
|-- buildspec.yml
|-- Makefile
|-- Dockerfile
|-- main.go
...
```

  
  
buildspec.yaml

```yaml

version: 0.2

phases:
  install:
    runtime-versions:
      docker: 18
    commands:
    # ECRにイメージプッシュするためにログインする
    - $(aws ecr get-login --no-include-email --region ap-northeast-1)

  pre_build:
    commands:
    # go test -v -cover ./...
    - make test

  build:
    commands:
    # go build -v .
    - make build

  post_build:
    commands:
    # docker tag \code-commit-repo-name\:latest \erc-repo-name\:latest
    # docker push \erc-repo-name\:latest
    - make push-image
```

### CodePipeline構築
CodePipelineの新規作成

- パイプラインの設定
パイプライン名は任意の値を入力し，残りはデフォルト

- ソースステージ
ソースプロバイダにAWS CodeCommitのhoge-repo masterブランチを選択
検索はAmazon CloudWatch Eventsを選択

- ビルドステージ
AWS CodeBuildの先ほど作成したプロジェクトを選択
今回環境変数は使用しないので残りはそのまま

- デプロイステージ
実際にコンテナを立ち上げないのでデプロイステージはスキップする


### 完成
ここまでの設定でCodeCommitのmasterブランチの更新をトリガーに
GoアプリがビルドされたDockerイメージを作成し，ECRにプッシュする構成ができた．


## この後
Pipeline実行する毎に goモジュール(外部ライブラリ)をダウンロードするのはイケてない(5分ぐらいかかる)
一度ダウンロードしたモジュールはキャッシュしておきたい(この後盛大にハマる)
[ハマった記事](https://qiita.com/Static_Novice/items/9333359c36b8b5957395)
VScode のターミナルで、キーボードショートカットをストレスなく使う 

# はじめに

VScode の Remote SSH 便利ですよね！

とても便利なのですが、VScode で接続した先のターミナルで bash のキーボードショートカット (`Ctrl+p` とか) を使おうとすると、VScode のデフォルトで指定されているものと衝突しそちらが優先されてしまうので使えません。

ショートカットを手癖のように利用しているので、これが使えないと結構なストレスです。というわけで、対策してみました。

そもそもターミナルのショートカットについては、こちらの記事が参考になります。

- [爆速でターミナルを使うためのショートカット集](https://qiita.com/akito/items/d09a2d5b36d4cf7bac6d)

# やりかた

## keybindings.json にショートカットキーを登録

`Ctrl+Shift+p` で key と打つと「基本設定: キーボードショートカットを開く (JSON)」というものが出てくるので開きます
![kybindings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200620/0f8ba50d-c8cd-5c41-15eb-b34a225ae9ba.png)


keybindings.json というファイルが開かれるので、この中にショートカットを記載していきます

```json
// 例
{
  "key": "ctrl+f",
  "command": "cursorUp",
}
```

- `key` にショートカット、`command` に実行コマンドを指定します
- 細かい指定方法や実行コマンドについては、ドキュメントに詳しく書かれています
  - [Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/getstarted/keybindings)

  
## ポイント

単純にキーバインドを設定すると、デフォルトのショートカットが上書かれてしまいます。

デフォルトのショートカットも便利なので使いたいのですが、わざわざキーバインドを退避するのも面倒なので、ターミナルで使いたいショートカットには「ターミナルにフォーカスしているときだけ」という条件を指定することでこれを回避します。

指定の方法は簡単で、`"when": "terminalForcus"` というメンバーを追加するだけです。GUI の設定画面からでは「いつ」という条件が選択できないので、keybindings.json に追加する必要があります。

# サンプル

こんな感じで設定してみました。参考までにどうぞ。

```json:keybindings.json
[
    {
        "key": "ctrl+p",
        "command": "cursorUp",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+n",
        "command": "cursorDown",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+f",
        "command": "cursorRight",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+b",
        "command": "cursorLeft",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+a",
        "command": "cursorHome",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+e",
        "command": "cursorEnd",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+d",
        "command": "deleteRight",
        "when": "terminalFocus"
    },
    {
        "key": "ctrl+h",
        "command": "deleteLeft",
        "when": "terminalFocus"
    }
]
```

# おわりに

ターミナルをフォーカスしているときだけショートカットが上書きされるため、それ以外の場合は今まで通りに VScode のショートカットが使えます。
今のところストレスフリーで作業できています。

こうするともっと便利だよ！などあれば教えて下さい。
Azure CognitiveServicesのSpeakerRecognition APIによる話者識別をPythonで検証してみた。#1

## はじめに

Cognitive Servicesでは、様々なAPIが提供されていますが、今回はそのうちの「Speaker Recognition API」にて話者識別を試してみました。
（日本ではあまり流行ってないっぽいですが。。）

ちなみに話者識別とは「いま誰が話しているのか」を識別してくれるもので、試した感じ、なかなかの精度かも。。と感じました。（まぁ自分の声でしか試してないんですけどね）

という訳で、早速検証していきたいと思います！

## 事前準備

まずはAzureにリソースを準備していきます。
Azureにログインして「リソースの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401336/927c740a-e844-25f8-8d84-31cd797b0859.png)

画面左上の検索boxに `Speaker Recognition` と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401336/aae71fa0-b60c-24ee-cd73-b392cebcf991.png)

以下の画面で「作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401336/33623897-de03-0b5b-5e1f-95ff179d86c2.png)

作成画面に移動するので、各項目を入力していきます！
ちなみにF0だと10,000 無料トランザクション / 月とのこと（検証には十分ですね）
入力が完了したら、画面下部の「Create！」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401336/a324cfed-640d-6145-e24d-dbe1b055eb2e.png)

リソースのデプロイが完了したので、「リソースに移動」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401336/cb5e90c2-7d0f-893b-628a-39873b59c1e9.png)

サブスクリプションキーが表示されました。
これは後で使うので、コピーボタンを押して保管しておきます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401336/d0efb484-2aea-5561-4190-ba2cf514fc11.png)

これでSpeaker Recognition APIを使用する準備が整いました。

### 見づらくなりそうなので、実際の処理は次の記事に記載します！

## 次の記事（実際の検証）
[Azure CognitiveServicesのSpeakerRecognition APIによる話者識別をPythonで検証してみた。#2](https://qiita.com/BA-KAZU/items/a2793030179713288b7d)
GoでデバッグのためにgRPCのリクエストをトレースする

Go で gRPC が使われているライブラリを使っている時に、ライブラリが投げている実際の gRPC のリクエストをトレースしたい場合には Go の gRPC ライブラリが `golang.org/x/net/trace` に対応している為、お手軽に確認する事ができる。

```golang
grpc.EnableTracing = true

go func() {
    http.ListenAndServe(":8080", nil)
}()
```

そのあと、 `localhost:8080/debug/requests` を開けば以下のような出力が得られる。

![スクリーンショット 0002-01-10 17.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974/9453223b-d16b-1b79-48e3-34bae47c05ab.png)

詳細は [golang.org/x/net/trace](https://godoc.org/golang.org/x/net/trace) を確認してもらえれば。
VPC再構築に伴うDirect Connectとサイト間VPN接続の移行について

とあるAWS環境でDirect Connectでの接続と、VPN接続を両方行っているVPCの再構築を行うことになりました。
当初は「うわ、ルータ設定とか全部やり直しになんの！？」って思っていましたが、調べてみたら全然簡単でした。

だいぶ端折っていますが、環境はこんな感じ。

![before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37463/bf3ab3ea-94d4-ce2a-74e4-c4b1cc27b3d5.png)

### AWS側
- 現行VPC(10.0.0.0/16)
- 新規構築VPC(新しいCIDRで再構築 10.1.0.0/16)
- VGW(これが無いと始まらない)
- Direct Connect Gateway(VGWを関連付け)
- カスタマーゲートウェイ(サイト間VPN用設定に必要)

### オンプレミス(顧客)側
- サブネット(10.100.0.0/16)

### オンプレミス(オフィス)側
- サブネット(192.168.0.0/24)


で、実際に行う作業はこれだけ。
### 作業内容
- 再構築前のVPCからVGWをデタッチ  
  (※デタッチしたことでVGWとDirect Connect Gatewayとの関連付けもなくなるので注意！)
- 新たに構築したVPCへVGWをアタッチ
- VGWをアタッチしたVPCに紐づくルートテーブルで「Route Propagation(ルート伝播)」を有効化(※1)
- VPCにアタッチしたVGWをDirect Connect Gatewayに再度関連付け実施  
  その際に「許可されたプレフィックス(Allowed prefixes)」を新しいVPCのCIDRで設定(※2)  

\----------
  ※1 ルート伝搬を有効化する前に通信に必要なルーティングを追加しておくようにする
  ※2 オンプレ側に許可してもらうための広告を実施するので、通信に必要なサイズのCIDRでもOK
\----------

そうするとこんなふうになります。
![after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37463/6a2918d8-febe-39c3-be23-85b9da9e9dde.png)

注意しなければいけないのが、セキュリティグループの設定。

新規に作る場合は良いのですが、既存の設定をコピーして作成する時にインバウンド/アウトバウンドのソースIPの書き換えを忘れがちです。
これを忘れると、後で「え？何？なんで通信できないの？ BGPのステータスもUPになってるし、VPNも利用可能なのに..」と言った感じで、途方に暮れた挙げ句、全然関係ないルートテーブルをいじったりする羽目になります(私です)。

今回はVGWの付け替えでの対応だったのですが、どうせならばTransit Gatewayでの設定にすればよかったなぁと思っています。
が、何分自分の環境ではないため、思いきれなかったのは事実です。

今度、自分の検証環境で[VPN接続をTransit Gateway経由に変更](https://dev.classmethod.jp/cloud/aws/migrate-vpn-connection-vgw-to-tgw/)してみようかなと思います。

今回の記事も誰かのお役に立てれば幸いです。
coc-explorer使ってみる

# coc-explorer

![スクリーンショット 2020-01-10 15.55.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/d539bf83-66c2-318a-2686-3304b744d579.png)
（画像の黒く塗りつぶしてあるところは気にしないでください。ファイルのパスが表示されてます。）

ディレクトリのツリー表示をしてくれるNERDTreeをずっと使っていたのですが、良さげなプラグインがあったのでしばらく使ってみようと思います。
coc系は設定をjson形式で記述するところが個人に好きです。

NERDTreeで（僕が）使っていた機能はひととおり使えました。
例えばrenameは対象ファイルにカーソルを持っていってrキーです。


![スクリーンショット 2020-01-10 16.07.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/0ca6a077-06f4-eab6-b90a-604dd7b18fc2.png)

temp.tctをtemp.txtに変更しました。ファイル名の横にアイコンが出てきましたが、git mvではなくmvしたためuntrackedになったようです。 
gitの情報を表示するための設定は特にしていないのですがデフォルトで表示されるみたいですね。

# バッファ一覧表示

<img width="320" alt="スクリーンショット 2020-01-10 17.10.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/aad7f6da-6722-e80f-b377-5235232ed87a.png">

実はいままでバッファの恩恵をほとんど受けることなくvimを使ってきたのですが、coc-explorerを使うとバッファ一覧を表示してくれます。
左の数字がバッファ番号になっているので:lsすることなく

```
:b バッファ番号
```

で一発で開けちゃいます。地味に嬉しかったです。

# インストール
今更ですがインストールコマンドです。coc.nvimが必要です。

```
:CocCommand install coc-explorer
```
2020年IT展示会をまとめてみた。行きたい展示会はあるかな！？

毎回応募ギリギリになってしまいがちなIT技術展。
2020年に開催される大きな展示会について、日程と会場を調べました。

#展示会情報

##Japan IT Week
###第4回 Japan It Week 関西
日程：2020/1/29(水)～31(金)
場所：インテックス大阪
URL：https://www.japan-it-osaka.jp/ja-jp.html

###Japan IT Week 春
日程：2020/4/8(水)～10(金)
場所：東京ビックサイト
URL：https://www.japan-it-spring.jp/ja-jp.html

###Japan IT Week 秋
日程：2020/10/28(水)～30(金)
場所：幕張メッセ
URL：https://www.japan-it-autumn.jp/

##CETEC 2020
日程：2020/10/20(火)～23(金)
場所：幕張メッセ
URL：https://www.ceatec.com/ja/

##Interop Tokyo 
日程：2020/4/13(月)～15(水)
場所：幕張メッセ
URL：https://www.interop.jp/

##ワイヤレスジャパン
日程：2020/5/13(水)～15(金)
場所：東京ビックサイト
URL：https://www8.ric.co.jp/expo/wj/

##日経XTECH EXPO 2020
日程：2020/10/14(水)～16(金)
場所：東京ビックサイト
URL：https://expo.nikkeibp.co.jp/xtech/ex/

##教育ITソリューションEXPO, STEAM教育EXPO
日程：2020年5月20(水)～22(金)
場所：青海展示棟
URL：https://www.edix-expo.jp/ja-jp.html
教育総合展の展示の一部にこのようなITの展示会も含まれています。
教育にもITが進出している現れですね。
今年からプログラミングも教育に含まれていくので、個人的に注目していきたい分野です。

#まとめ
行きたい展示会、興味のある展示会はありましたでしょうか？
私は、2019年はJapan IT Week秋へ参加させていただきました。
今年はどの展示会へ行けるか、とても楽しみです。
オリンピックも開催される2020年。
どんな新しい技術と出会えるか、ワクワクしますね。