OmniAICreator/Qiita-1.07M huggingface dataset:
✍ Slack – メンバーの状態共有や報連相に絵文字を使うのはどうだろう？ @絵文字大好きエンジニア

🌾 が付いたら 「稲浦のステート共有」みたいな。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/3ef68a07-a525-44dc-3527-06641bfd496a.png)

# サインを決める

- 絵文字は最強の視認性ツール
- 絵文字は最高の脳メッセージングツール

# その他の用例

- 「これは依頼」
- 「これは相談」
- 「これはつぶやき」

などなど。









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
初めてのvulkanプログラム第１章 Vulkan プログラムとは、何か


[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

今年もqiita アドベントカレンダーが始まりました。皆さんの興味のある分野は、c++、python、html、unity、UE4...と様々なものがあると思います。
ここは、地道に一人で、vulkan プログラムに関するチュートリアルを書いていく場所です。それでもよろしければ25日間よろしくお願いします。

##概要
このアドベントカレンダーは25日間かけてvulkan purogramingを入門していきます。vulkan purogramingに関する日本語の記事や、書籍が少ないため、入りにくい世界ではありますが。自分がグラフィクスエンジニアになるための窓口になれたら嬉しいです。

##vulkanとは
vulkanの前世代Openglは(1992年)IBMのPowerpc、pc98が流行っていた時代に登場しました。現在では、intelのcoreシリーズ、AMDのRyzen等のメニーコアCPUが主流ですが当時は、1コアのCPUが主流でした。multicore cpuができたのは2004年です。ほんとに最近のことですね。openglは、過去の遺産との互換性を維持するため、多くの弱点がある。これらのレガシーな環境をリセットして、新しくマルチスレッドや、シェーディング中間言語対応といった、近代的な技術が投入されたapiがvulkanです。vulkanはドイツ語で火山を意味するらしい.

![火山](https://d1kls9wq53whe1.cloudfront.net/articles/21454/410x615/3b5c7f5b5449930e95502d54ff76c756.jpg)

##Openglの弱点？



####1.マルチGPU
Directxの場合DXGIアダプターを列挙することで複数のGPUを搭載したシステムで任意のGPUを選択して使用することができる。これによりGPGPU演算を実行させ、アプリケーションの並行処理させ、処理性能を向上させるいった使い方ができる。OpenGLでは、GPUを選択的に使用したり、それぞれのGPUに対して操作を行うことは、標準化されていない。nvidia SLIに対応したGPUを用いてSLI構成を行うことで、GPUドライバー側で分散処理させることはできるが、SLIは主にOpenGLやDirectxのグラフィックスレンダリングを自動的に分散処理して高速化する技術のためSLI環境下でのGPGPUは、多くの制約や注意点がある。SLIでは、ハードウェアメモリーのミラーリングが行われるため、2つのGPUをつないでもGPUメモリーの合計値にならない。
####2.GPGPU機能と、レンダリングコンテキスト機能
Opengl apiは必ずウィンドウを作成してから出ないとコンピュートシェーダーを利用することができない。つまり、スクリーンを必要としない処理でも、必ずウィンドウを生成しなければいけない
####3.マルチスレッド対応
Directxでは、マルチスレッドを活用して描画パフォーマンスを向上させる仕組みが導入されているが。Openglでは、相当機能をサポートしていない。
Directxでは、デバイスインターフェースがセーフスレッドのため、サブスレッドからのソース生成や、複数のスレッドからの同時生成に標準で対応している。しかしOpenglでは、レンダリングコンテキストを生成したスレッドのみがリソースを扱えるようになっているため、サブスレッドでリソース生成を行うには、wglShareLists()といったプラットフォーム依存のAPIを利用して明示的にコンテキストの共有を行うことが必要である

*1 DXGI:　windowsから見たグラフィクスデバイスインターフェース
*2 Nvidia SLI:  複数のグラフィクスデバイスを並列動作させ、出力を一つにまとめて、描写処理を高速化させる技術

![maruticore prosessa](https://pbs.twimg.com/media/DcshIuuWkAINyBR.jpg:large)

##まとめ
openglは、互換性を保つために変えられない部分が多くある。特にGPGPUとマルチスレッド対応について、Directxと比べて更新の対応が難しい部分がある。そのため新apiとしてVulkanを開発することによってこれらの新しい技術を搭載したlinux、windows、Mac OS、androidその他環境でも使えるオープンなグラフィクスapiを作ろうとしている。

その他気になることがありましたら、コメント、メール、twitterで連絡ください

##参考書

######書籍
[Vulkan Cookbook](https://www.packtpub.com/mapt/book/game_development/9781786468154)
[Learning Vulkan](https://www.packtpub.com/mapt/book/application_development/9781786469809)
[Vulkan Programming Guide: The Official Guide to Learning Vulkan](https://www.amazon.co.jp/Vulkan-Programming-Guide-Official-Learning/dp/0134464540/ref=sr_1_2?ie=UTF8&qid=1543284425&sr=8-2&keywords=vulkan)
[Introduction to Computer Graphics and the Vulkan API](https://www.amazon.co.jp/Introduction-Computer-Graphics-Vulkan-API-ebook/dp/B07JMCWP8H/ref=sr_1_5?s=english-books&ie=UTF8&qid=1543284610&sr=1-5&keywords=vulkan)

######youtube
[The Khronos Group](https://www.youtube.com/user/khronosgroup)
[Niko Kauppi](https://www.youtube.com/user/Nigo40)
[NvidiaDeveloper](https://www.youtube.com/user/NVIDIADeveloper/videos)
[Qualcomm Developer](https://www.youtube.com/user/qualcommdev)
## 連絡先

tweeter: [tositada_nakada](https://twitter.com/nakadasanda17)
mail: nakadasanda@outlook.com

## 寄付

paypal: [tositada_nakada](https://www.paypal.me/nakadasanda)
Amazon: [欲しいものリスト](http://amzn.asia/fGpGuJo)
Windows Server 2016でIISのSMTPサーバを立ててメール送信する

### インストールと設定
- サーバーマネージャでIISのSMTPをインストールする
  - Webサーバもインストールされる
- IIS6.0マネージャを起動する
- ツリーを展開して[SMTP Virtual Server #1]を右クリックしてプロパティを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/212124/a71b7a06-2aff-33e6-c138-1ebd082473bf.png)

- アクセスタブ->中継をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/212124/5fa3249b-d997-00c9-6d41-bfe0c263aada.png)

- メール送信を受け付ける(許可する)コンピュータのIPアドレスや、セグメント、ドメインなどを指定する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/212124/90b8d7c4-887a-f75e-f9e2-83fd8cfb0e9a.png)

- デフォルトでは匿名アクセスとなっているので、認証なしにメールを送信できる

### メール送信テスト
- ここではLinuxサーバで試す
- telnetでSMTPサーバにつなげて以下のように応答に入力してく
  - 件名と本文は未入力
  - data(本文)の入力後、ドットで本文を終了し、quitでメールを送信する

```
telnet smtpserver01.contoso.com 25
helo smtpserver01.contoso.com
mail from: user01@contoso.com
rcpt to: user99@example.com
data
.
quit
```

- 標準出力は以下のようになる

```
[root@linuxserver01 ~]# telnet smtpserver01.contoso.com 25
Trying 10.0.1.2...
Connected to smtpserver01.contoso.com.
Escape character is '^]'.
220 smtpserver01 Microsoft ESMTP MAIL Service, Version: 10.0.14393.0 ready at  Tue, 27 Nov 2018 11:03:33 +0900
helo smtpserver01.contoso.com
250 smtpserver01 Hello [10.0.1.2]
mail from: user01@contoso.com
250 2.1.0 user01@contoso.com....Sender OK
rcpt to: user99@example.com
250 2.1.5 user99@example.com
data
354 Start mail input; end with <CRLF>.<CRLF>
.
250 2.6.0 <SMTPSERVER01nHM3SOl00000006@smtpserver01> Queued mail for delivery
quit
221 2.0.0 smtpserver01 Service closing transmission channel
Connection closed by foreign host.
```

- メールボックスにメールが届いたか確認する
- おしまい
俺でも解決できるCloudFrontに弄ばれた情弱の話(Geo Location編)

俺です。

AWS WAF(IP Address Match) + CloudFront + S3 な構成のとってもstaticなウェッブサイトを展開していたときにハマったしょーもない話を書きます。


- エラーメッセージ読もう問題
- 判定はGeoLocation -> WAFっぽい

# 突然の死

403を返されてしまいました。

```
The request could not be satisfied.
The Amazon CloudFront distribution is configured to block access from your country.
``` 


# GeoLocationの設定漏れてた

JPをWhitelistに入れてなかったのを思い出した

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/789bc73c-5fc9-6f6d-3fb6-847de095ae1e.png)
Apache NiFi 情報まとめ

# NiFi インストール
* [ローカルNiFi環境構築：Docker環境でApache NiFiを起動](https://qiita.com/zzeng/items/426ad07eb6cfd046671f)

# NiFi 管理
* [Ambari 経由でNiFi にログイン](https://qiita.com/zz22394/items/0985d0c9862f8385e41f)
* [AmbariからNiFiのどんなものを集められるか？](https://qiita.com/zz22394/items/4cb4bddf0b53c18a9834)

# NiFi Cookbook
* [Hello Wold: 一番シンプルなデータフローを作ってみよう](http://ijokarumawak.github.io/tutorials/nifi/hello-world)
* [FTPからデータ取得](https://qiita.com/zz22394/items/120060f91ef407f5e492)
    * [FTPファイルを並列的に取り込み、HDFSに保存](https://qiita.com/zz22394/items/c51170ea0c70ac1adc1a)
* [REST APIからのデータ取得](https://qiita.com/zz22394/items/7676ada5688f87a2acd2)
* [Apache Webサーバー アクセスログ取得](https://qiita.com/zz22394/items/3375046d3b63cca62fd6)
* [S3フォルダからファイルを取得し、HDFSに保存] (https://qiita.com/zzeng/items/f51437d247c3e02b0d71)
* [HTTPプロセッサーでリモートファイルを取得・解凍し、特定パターンのファイルを整形した後にKafkaに流す](https://qiita.com/zz22394/items/cb348277c08c29d7f85f)
* 画像処理：MiNiFiでIoT設備(RaspberryPi)から画像データを取得し、NiFiに送る。NiFiがTensorFlowを呼び出し、画像認識して結果をHDFS/Hiveに保存
* 音声処理：MiNiFiでIoT設備(RaspberryPi)から画像データを取得し、NiFiに送る。NiFiがデータをWatsonAPIに流して、分類結果をHDFS/Hiveに保存
* [RDB(MySQL/Oracle/SQL Server等)からレコードを抽出して、NiFi内で変換してHiveに保存](https://community.cloudera.com/t5/tkb/workflowpage/tkb-id/CommunityArticles/article-id/6681)
* IoTセンサーからデータを集めて、データセンターに送信
* IoTセンサーからデータを集めて、Cloudに送信
* REST APIを叩いて、結果JSONの特定のKey/Valueに基づいてデータを変換・保存
* DMPのデータ収集
* Cloudのデータ伝送コスト削減：クラウドに保存したIoTデータを違うクラウド環境（あるいはOn-Premise）に伝送して分析環境に保存
* 既存LegacyシステムのAdapter：既存LegacyシステムデータをHadoop環境に取り入れる
* [ MiNiFiでセンサーデータを取得し、NiFiに転送してHDFS、Hiveに書き込む ](https://viewse.blogspot.com/2019/06/minifinifihdfshive_5.html)
iptables / firewalldで ポート転送

必要になったのでちょっとメモ
作業中のみ有効にすればよいので設定ファイルには記述しない


## nat 状態確認

何もない状態

### iptables 

```bash
sudo iptables -t nat -L --line-numbers

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
```

### firewalld

```bash
sudo firewall-cmd --list-forward-ports 

```


## nat ポート転送設定

２１番ＦＴＰ宛の通信を ２２番ＳＳＨに転送する
（ftpのみファイアウォールで許可されてるけどＸウィンドウで作業しなきゃいけない。。ってどんな状況よ）

### iptables

```bash
sudo iptables -t nat -A PREROUTING -p tcp -m tcp  --dport 21 -j REDIRECT --to-port  22
```

### firewalld

```bash
sudo firewall-cmd --add-forward-port=port=21:proto=tcp:toport=22
```


## nat 設定確認

ちゃんと設定入ってる

### iptables

```bash
sudo iptables -t nat  -L --line-numbers

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:ftp redir ports 22

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
```

### firewalld

```bash
sudo firewall-cmd --list-forward-ports 
port=21:proto=tcp:toport=22:toaddr=
```

ちなみに永続化する場合は

```bash
sudo  firewall-cmd --runtime-to-permanent
```


## nat ポート転送設定削除

### iptables

--line-numbers の番号を指定して削除する

```bash
sudo iptables -t nat -D PREROUTING 1
```

### firewalld

```bash
sudo firewall-cmd --remove-forward-port=port=21:proto=tcp:toport=22:toaddr=
```



## nat 状態確認

消えてる

### iptables

```bash
sudo iptables -t nat  -L --line-numbers

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
```

### firewalld

```bash
sudo firewall-cmd --list-forward-ports 

```


## FTPポートでXウィンドウ作業

なぜこんなことを。。。

使うソフトは MobaXterm Home Edition 
https://mobaxterm.mobatek.net/
インストール不要なポータブルバージョンを利用

FTPなポート向けにSSH接続すると、無事ファイアウォールを超えてサーバに到達
FTPなポート向け通信を iptables がsshなポートに転送してくれるので普通にSSHログイン
xauthやらxtermやらがインストール済みでXが使える環境であること
ログインしたら環境変数 DISPLAY が設定されていること

そしたらxterm起動したりfirefox を起動したりして設定作業を行います。。。






以上
変な制約の上で作業しなくちゃならなくなった時のメモ。。。
いいのか？これ。。



こちらとか参考にさせていただきました
ありがとうございます
[80番ポートへ届いたパケットをiptablesでローカルの上位ポートに転送する - Qiita](https://qiita.com/kawaz/items/ed0030cb29c7d0497b63)
[ipTablesのルールの削除](http://d.hatena.ne.jp/nosa1/20120313/1331618377)
よく忘れるvimの操作に関して（随時更新予定）

# 概要
これまでLinuxサーバをメインで使ってたこともあり
Vimmerとしてコーディングをしていきたいと思っているのですが
ちょこちょこコマンドを忘れてしまうので、メモ書きです。
ことあるごとに更新予定です。

ちなみにvimmerになりたいといいながら
VSCodeにvimプラグイン入れて使ってる邪教徒です。

## カーソル操作
|やりたいこと|入力キー|
|---|---|
|先頭に移動|^|
|先頭に移動|$|
|上の行の先頭|-|
|下の行の先頭|+|
|単語ごとに後ろに移動|w|
|単語の先頭|b|
|単語の末尾|e|
|単語の末尾に戻る|ge|
|%|対となる括弧に移動|
|検索したい文字まで飛ぶ|f（文字）|

`abcde<html>`でaにカーソルがあった状態で、f<と入力すると
htmlタグの先頭（<)にカーソルが移動する。
連続して行う場合は`;`を入力する

## 挿入
|やりたいこと|入力キー|
|---|---|
|カーソルの左から挿入|i|
|カーソルの行頭から挿入|I|
|カーソルの右から挿入|a|
|カーソルの行末から挿入|A|
|カーソルの下段に空白行を入れ挿入モード|o|
|カーソルの上段に空白行を入れ挿入モード|O|

## 削除
|やりたいこと|入力キー|
|---|---|
|単語を削除|dw|
|行を削除|dd|
|カーソル位置から左を行頭まで削除|d^|
|カーソル位置から左を行の先頭まで削除|d0|
|カーソル位置から検索文字までを削除|dt文字|
|htmlタグ内を削除|dit|
|行の末尾から、改行を削除|J|

- dt文字に関して<br>
カーソル位置から検索文字までを削除に関しては
例えば\<html>のタグがあるとして、カーソル位置をhとtの間にあるとし
dt>とすると、\<h>となり、カーソル位置から次に現れる文字の前まで削除される。
- htmlタグ内を削除に関して<br>
例えば以下のようなコード1がある場合、\<header>の先頭にカーソルを合わせた状態で
ditと入力するとコード2のようになる。
また、\<header>の途中にカーソルを合わせditと入力すると、\<header>内が削除される。

```html:コード1
<div>
  <header>
     <h1>hoge</h1>
  </header>
</div>
```
```html:コード2
<div></div>
```

- 行の末尾から改行を削除
以下のような文字を扱っている際に、  
「おいしいごはんが食べたい」と一行で表示したい場合は、  
「おいしい」の末尾にカーソルをあわせ、「J」と入力すると改行を削除してくれる。  

```bash
（変更前）
おいしい
ごはんが食べたい
（変更後）
おいしい　ごはんが食べたい
```
削除の最初のdをcに変えると、削除後に挿入モードになる（ddはcc)

## 矩形選択
|やりたいこと|入力キー|
|---|---|
|矩形選択モード|Ctrl+v|
|選択モードで行頭まで|Ctrl+vの後に ^|
|選択モードで行末まで|Ctrl+vの後に $|

## VSCodeでの操作
|やりたいこと|入力キー|
|---|---|
|エクスプローラー移動|Ctrl+E|
|アクティブなエディターを右に移動|⌘+Kを押し、→|
|アクティブなエディターを左に移動|⌘+Kを押し、←|
railsでjavascriptが読み込まれないときに確認すべきこと


以下の3つのファイルを確認していく。

- /app/views/application.html.erb

- /app/javascripts/application.js

- /config/initializers/assets.rb

# /app/views/application.html.erb

`<script src=""></script>`はrailsでは以下のようにして書く。
必要なものが記載されているか。

```
    <%= javascript_include_tag('jquery-xxx.min') %>
```

# /app/javascripts/application.js

jsファイルをアセットパイプラインで読み込むように設定してあるか。
以下の記載で/assets/javascripts/内の全てのjsファイルを読み込んでくれる。
`//= require jquery`のように個別で記載することももちろん可能。

```
//= require_tree .
```

# /config/initializers/assets.rb

アセットのプリコンパイル対象として、例として以下のようにjavascriptが読み込まれるようになっているか

```
Rails.application.config.assets.precompile += ['*.js','*.css']
```
nodemonとは?

## メモ残しておきます
Koa.jsのチュートリアルを進めていると序盤でnodemonという見慣れないツールが出てきたのでメモを残しておきます。

## nodemonとは?
ソースを監視して、自動でサーバーを再起動してくれるツール。
nodeの代わりにnodemonを使ってコードを走らせると、コードの変更時にプロセスが自動で再起動する。
ターミナルに以下を打てばインストールできる。

```
// nodemonのインストール
$ npm install -g nodemon
```

## 特徴
- アプリケーションの自動再起動
- 監視のためにファイルの拡張子を検出
- node&coffeescriptがデフォのサポート。しかし、実行可能はファイルであれば走らせる事ができる。
- 特定のファイルやディレクトリを無視する
- 特定のディレクトリを監視する
- サーバーアプリケーションまたは1回のユーティリティとREPLを実行
- nodeのアプリでは必須
- オープンソースであり、githubを利用可能

## 実際に変更があると。
```
[nodemon] starting `node app.js`
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
```
実際にファイルの変更があると、↑こんな感じで自動で再起動してくれる。

## 参考
- [nodemon公式](https://nodemon.io/)
- [github](https://github.com/remy/nodemon/)
- [フルドキュメント](https://github.com/remy/nodemon#nodemon)
Mackerelをただのグラフ描画ソフトとして使う

#概要
Mackerel_APIをつかって、数値を投げると描画してくれるシェルスクリプトの記述。

#前提
Mackerelのアカウント作成が済んでおり、Hostsの登録とAPIkeyの取得が済んでいること。

#実装
描画させる対象の数値は予めtxtファイルに書き出しておく。それを配列に入れ、描画させる。
それを1分に1回描画させる。
まずはデータの作成。

```
$touch testdata.txt
$open testdata.txt
```
中身の記述

```txt:testdata.txt
100
200
300
```
シェルスクリプトの記述

```sh:test1.sh
#!/bin/sh

API_KEY="XXXXX"#Mackerlから取得したAPIkey
HOST_ID="YYYYY"#Agentインストール後発行されるHOSTid

list=(`cat testdata.txt|xargs`)

for i in $(seq 1)
do

    JSON="[{\"hostId\":\"${HOST_ID}\",\"name\":\"custom.random.a\",\"time\":$(date +%s),\"value\":${list[0]}}]"

    curl https://mackerel.io/api/v0/tsdb \
         -H "X-Api-Key: ${API_KEY}" \
         -H "Content-Type: application/json" \
         -X POST \
         -d ${JSON}

    sleep 60
done
```
シェルスクリプトの実行

```
$sh test1.sh
```

シェルスクリプトは空白があると空白の前後で1単語として認識するようだ。
そのため、txtファイルが以下のような形

```txt:testdata.txt
100 2011
200 2012
300 2013
```
であった場合、list[0]=100,list[1]=2011となる。
Ansible Playbookのリファクタリング


# はじめに

Ansibleを使ってて自分が好きな点が、
手抜きもできるけど、改善して綺麗に書けることです。

そこで、自分が実際にやったリファクタリングを書いてみます。
(内容は脚色しています)

CentOS 7で確認しています。

# Ansible以前

最初の手順は以下の通りです。

- /etc/profile に以下の内容を書き込む

```sh
if [ "$USER" != "foo" ]; then
  export FOO=BAR
fi
```

ここからスタートです。

# まずは素直に実装

Ansibleでそのまま素直に実装すると、[blockinfile][]を使って以下のように書けます。

```yaml
- name: /etc/profile に環境設定を追加
  blockinfile:
    path: /etc/profile
    block: |
      if [ "$USER" != "foo" ]; then
        export FOO=BAR
      fi
  become: yes
```

このとき、/etc/profileの最後に以下のように書き込まれます。

```sh
# BEGIN ANSIBLE MANAGED BLOCK
if [ "$USER" != "foo" ]; then
  export FOO=BAR
fi
# END ANSIBLE MANAGED BLOCK
```

# blockinfileはコードの臭い

これでも問題ないです。冪等性は保たれます。

しかし、`# BEGIN ANSIBLE MANAGED BLOCK` と
`# END ANSIBLE MANAGED BLOCK` が入っているのがなんとなくイヤな感じです。
間違って誰かが消してしまうとおかしくなります。

自分の中では、[blockinfile][]は扱いづらいので、避けるようにしています。
ただ**決してこのモジュールが悪いわけではないです**。
どこか改良できる点がある、そう感じさせるシグナルです。
いわゆる[コードの臭い][]です。

# blockinfile → lineinfile + copy

そこでまず、lineinfileを使うようにしました。
こんな感じです。

```yaml
- name: foo.shを /etc/profile.foo としてコピー
  copy:
    src: foo.sh
    dest: /etc/profile.foo
  become: yes

- name: profile.fooを読み込み
  lineinfile:
    path: /etc/profile
    line: source /etc/profile.foo
  become: yes
```

blockinfileは使わなくなりましたが、2つに分かれてしまい、
何をしたいのか分かりづらくなってしまいました。

# lineinfile + copy → copy

しかしそもそも /etc/profile を書き換える必要はありません。
/etc/profile に以下のように記載されているとおり、 `/etc/profile.d` 以下に
拡張子 .sh または sh.local という名前のファイルを置けば、勝手に読み取ってくれます。

```sh
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done
```

なので、以下のようにファイルコピーだけでOKです。

```yaml
- name: foo.sh を /etc/profile.d 以下にコピー(bash起動時に読み込まれる)
  copy:
    src: foo.sh
    dest: /etc/profile.d/foo.sh
  become: yes
```

**OSの仕組みを知る**ことで、よりシンプルな書き方ができました。

# おわりに

今回は比較的簡単な例でしたが、
Ansibleはコードによる自動化をするだけではなく、改善点を洗い出すために有効です。

例えば `failed_when: false` などでごまかしている場合は、
終了コードが0でないプログラムがあります。

fileモジュールで `force=yes` をつけている場合は、
そもそも手順が前後している場合があります。

AnsibleはYAMLで書くためプログラマブル要素が低めですが、
それを欠点と捉えるのではなく、改善のためのシグナルを提供していると考えればいいと思います。

だから自分はAnsibleを使ってて楽しいです( ´ω`)

[blockinfile]: https://docs.ansible.com/ansible/latest/modules/blockinfile_module.html#blockinfile-module
[コードの臭い]: http://bliki-ja.github.io/CodeSmell/
Drupal Meetup Tokyo 2018年振り返り + 日本の定期開催Drupalイベント紹介

## はじめに

Drupal Meetup Tokyoとは東京(新宿付近)でDrupalに関する話題を気軽に情報交換できるイベントです。

今回は2018年のDrupal Meetup Tokyoを振り返りつつ、日本各地で定期開催されているイベントをご紹介します。

## 2018年の開催履歴

2018年を振り返ると言いつつ、私がなんとなく運営側に回ったところからの記録です。

どの回もあるテーマについて全員で輪になって語り合う・聴きあう形式で、
全体を眺めてみると開発系のテーマ多めな2018年でした。


### [#23 (2018/6/7)](https://drupaljapan.connpass.com/event/88769/)
- 内容
  - コアの使うモジュール・使わないモジュール
  - これは定番・コントリビューションモジュール
  - 無名だけとオススメしたいモジュール
- 参加者ブログ
  - [Drupal Meetup Tokyo #23 参加メモ](https://www.bulblub.com/2018/06/DrupalMeetupTokyo_23/)

### [#24 (2018/7/12)](https://drupal-tokyo.connpass.com/event/91268/)
- 内容
    - SEO対策で入れたいモジュール
    - テーマ作成が楽になるモジュール
    - コンテンツマネジメントしたい時に入れるモジュール
- 参加者ブログ
    - [Drupal Meetup Tokyo #24 参加メモ](https://www.bulblub.com/2018/07/DrupalMeetupTokyo_24/)

### [#25 (2018/9/6)](https://drupal-tokyo.connpass.com/event/97450/)
- 内容
    - Viewsモジュール
    - Drupal 8.6の新機能

### [#26 (2018/10/4)](https://drupal-tokyo.connpass.com/event/102207/)
- 内容
    - Behatでの自動テスト
    - CDNとDrupal

### [#27 (2018/11/1)](https://drupal-tokyo.connpass.com/event/105048/)
- 内容
    -  	DrupalがCDNをコントロールするための小ネタ集
    -  	Migrate は奥が深い
    
### [#28 (2018/12/6)](https://drupal-tokyo.connpass.com/event/109947/)
- 内容(予定)
    -  	Hosting Service
    -  	Bigpipe


### その他
#### [Drupal Camp DEN](https://drupal-camp2018.den-japan.org/)
- ふたを開けてみるとDrupal Meetup Tokyoで集まる人のほとんどが参加していました。
- Drupal Meetup Tokyo として [@snize](https://twitter.com/snize) さんが登壇しました!
    - [Drupalのおいしいところ@DrupalCamp DEN](https://www.bulblub.com/2018/11/sweetspot_of_drupal/)



## 定期開催のDrupalイベント

各地でDrupalのイベント・勉強会が開催されています。
分かる範囲で(記事を書いている @kazunoko のとても個人的な)コメントを付けました。
他にあればぜひ教えて下さい。参加しに行きます！

### [Drupal Cafe 大阪](https://ja-jp.facebook.com/DrupalCafe/)
おそらく一番昔からあるDrupalイベントです。
機会あって参加した回はとても雰囲気のいい場所でのほほんと参加させてもらいました！

### [Drupal さっぽろ](https://drupalsapporo.net/)

こちらもかなり昔から開催されているイベントです。
Drupal ONSEN も開催されています。主催の方がすごく良い人！

### [Drupal Meetup 羽田](https://drupal-meetup-haneda.connpass.com/)
現時点の毎月開催イベントでは一番規模が大きく、
様々な層の方がいらっしゃるのでDrupalの全体像が見えやすいイベントだと思っています。

### [Drupal Meetup 梅田](https://drupal-meetup-umeda.connpass.com/)
大阪方面に行く時にいつか参加したい！

### [Drupal Meetup 豊田](https://drupal-meetup-toyota.connpass.com/)
[Drupal Camp DEN](https://drupal-camp2018.den-japan.org/) にブース出展されていたので、ご挨拶させていただきました。こちらもいつか参加したい！

## おしまいに

正直なところ、現時点で「Drupal」を知っている人は日本ではとても少ないです。
どんな形でも「Drupal」という言葉を知ってしまったあなた、ぜひどこかのイベントに参加してみてください。
ビジネス・仕事・趣味、いろんな枠を超えてどのイベント・コミュニティでも熱く歓迎してくれるはずです！

そして最後に・・・Drupal Meetup Tokyoもぜひ遊びに来てください！


### Drupal Meetup Tokyo 
- [Drupal Meetup Tokyo | Trello](https://trello.com/b/wGeNlNkf/drupal-meetup-tokyo)
- [Drupal Meetup Tokyo | Github](https://github.com/drupal-tokyo)
- [Drupal Japan 参加フォーム| Slack](http://bit.ly/2isyxIV)
- Drupal Meetup Tokyo中の人 [@snize](https://twitter.com/snize) | [@ShumpeiKishi](https://twitter.com/ShumpeiKishi) | [@kazuno_ko85](https://twitter.com/@kazuno_ko85)
String interpolation produces a debug description for an optional value;  did you mean to make this explicit?

#過去に出会った警告メッセージとその対処方法備忘録
##環境
- XCode
- Swift4.2

##警告メッセージ
String interpolation produces a debug description for an optional value;　did you mean to make this explicit?

##警告発生コード

```
var text:String? = nil
text = "hoge"
				
print("\(text)")//warning

```
##原因と対処方法
###原因
Optional型でwrapされている文字列を、wrapしたまま直接print出力しようとしたことが原因みたい
###対処方法
この場合は、unwrapしてから出力してあげることで解決した。

##対処済みコード1
強制unwrap

```
var text:String? = nil
text = "hoge"
				
print("\(text!)")
```

##対処済みコード2
冗長的だけど、明示的にunwrap

```
var text:String? = nil
text = "hoge"

if let text = text
{
    print("\(text)")
}
else
{
    print("nil")
}		
```
##対処済みコード3
??演算子を利用してtextがnilの時のデフォルト値を指定しても良い

```
var text:String? = nil
text = "hoge"
print("\(text ?? "text is nil")")
```

##対処済みコード4
Optionalそのままでいいから、警告を消したい時は以下のように記述する

```
var text:String? = nil
text = "hoge"
print("\(text as String?)")
```
WebGLビルドでTextMeshProのInputFieldに入力できない問題の解決方法

WebGLビルドで `TMP_InputField` に文字が入力できないときの解決方法を記す。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/127392/07aeff4f-190b-3258-96aa-5f26c01db01d.png)

## 現象
文字を入力しようとすると、 `InvalidOperationException` がスローされ、入力できない。

## 原因
WebGLビルドでは、ビルド後の容量削減のため、デフォルトでいくつかの.NETライブラリをビルドから省く設定になっている。
TMP_InputFieldで用いられる処理がそれらのライブラリを呼ぼうとするため、アセンブリが見つからず、例外を吐く。

[こちらのIssue Tracker](https://issuetracker.unity3d.com/issues/tmp-inputfield-throws-an-invalidoperationexception-on-webgl-with-net-4-dot-6
)に詳細がある。


## 対策
 [フォーラム](https://forum.unity.com/threads/enabling-embedded-resources-with-webgl.326069/)に回答があった。
次のファイルを適当なEditorフォルダに格納する。

```C#:WebGLEditorScript.cs
using UnityEditor;
public class WebGLEditorScript
{
    [MenuItem("WebGL/Enable Embedded Resources")]
    public static void EnableErrorMessageTesting()
    {
        PlayerSettings.SetPropertyBool("useEmbeddedResources", true, BuildTargetGroup.WebGL);
    }
}
```

Unityエディタのメニューから、WebGL→Enable Embedded Resourcesをクリック。

この操作以降のビルドでは、問題が解決している。
【AWS Re:Invent2018】AWS RoboMakerのセッション解説

※本記事はAWS Re:Invent2018のセッションを解説する記事です。

Re:Invent2018が始まりました。今年もいっぱいサービスが出ると思いますが、本記事ではいち早く発表されたAWS RoboMakerを解説していきます。

## TL,DR
- その名の通りロボット開発のためのクラウドサービス。
- セットアップ~開発~ビルド~動作シミュレーション~デプロイまでをクラウドで完結させることができる。
- AWSのサービスとの連携もデフォルトで用意されており、ロボット開発をよりシンプルにすることができる。

![IMG_0293.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/6d29e0da-60a6-bddf-7d68-15441552e594.jpeg)


## AWS RoboMakerとは？
AWS RoboMakerはその名の通りロボット開発におけるAWSサービスです。
ROSをベースに開発のためのコンポーネント軍をクラウドで提供することで、より早く低コストでのロボット開発を実現することを可能にしています。

※ROSについては[こちらの記事](http://techfactory.itmedia.co.jp/tf/articles/1710/27/news011.html)などに詳しいです。
![IMG_0298.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/443c82f1-8da0-ee6c-7d11-7a29df4288b2.jpeg)

## 何ができるのか
特徴は大きく4つ。

1. Deployment Environment
2. Cloud Extention for ROS
3. Simulation
4. Fleet Management

![IMG_0300.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/aff24e15-fd11-aa14-ebf6-951e2cc61425.jpeg)

ざっくりまとめるとこんな感じです。

- ROSを拡張したクラウドでのロボット開発統合環境が提供される
- AWSサービスとの連携ができるROS用Extentionが提供される
- クラウド上で実行できるシミュレーション環境が提供される
- AWSのデプロイマネジメントの仕組みを利用できる

では、ひとつひとつ見ていきましょう。

### Deployment Management
![IMG_0301.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/5df59a52-8b5a-e935-04fa-ab98e597a53c.jpeg)

### Cloud Extention for ROS
AWSのサービスをRoboMaker上のROSにインプリできるExtentionが用意されます。今まで自前で実装する必要があったのが、より簡単になった形ですね。現状、連携できるサービスは下記の5つです。

- Amazon Lex
- Amazon Polly 
- Amazon Kinesis Video Streams
- Amazon Rekognition
- Amazon Cloudwatch

![IMG_0304.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/148495fc-98ac-e8cd-cb94-a90c8c8aa963.jpeg)


### Simulation
ハードウェア開発において一番の課題となる動作シミュレーションもAWS上で実行できるようになります。
実際のシミュレーション実行のデモなどはなかったのですが、下記のような特徴があるとのことです。

- 任意の３D空間を用意することが可能
- インフラの構築やプロビジョニング、初期設定や管理は一切いらない
- 並列で異なるシミュレーションを処理できる
- 複雑なシミュレーションでもAutoScaleするのでリソースの心配もいらない

![IMG_0305.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/958bdedc-b294-42ca-b1fc-1b2f1c0e4dd9.jpeg)

- アーキテクチャの例
![IMG_0307.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/30fbc323-4a77-1be0-a5c5-733b193afe42.jpeg)

### Fleet Management
Deploymentに関してはAWS Greenglassとの連携によって実現されています。
AWS IoTを使ったことがある人ならお馴染みかもしれません。

![IMG_0308.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/b56dbd36-224b-d7fe-2889-93dc2612150d.jpeg)

- アーキテクチャの例
![IMG_0309.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/05cffdb1-f07a-13ce-9b0f-ff0eaf56df6d.jpeg)



## その他

RoboMakerのパートナープログラムも同時に発表されていました。


## 終わりに
特徴的なのは、AWSの他サービスとの強力な連携が用意されることと、シミュレーション環境がクラウド上で提供されることかなと思いました。CloudWatchとの連携が強力ですね。シミュレーション環境は自分で環境をホストしないといけないのでどれくらいのパフォーマンスが必要なのか気になるところです。

また、デプロイメントがGreenglassを用いたアーキテクチャになっていることは、AWS IoTを利用している人には馴染みの深いものかもしれません。

ハードウェアやロボットの開発はクラウドから離れている印象があったのですが、RoboMakerの出現でクラウドとの距離がぐっと縮まるかもしれませんね。
php-master-changes 2018-11-26

今日は ext/gd 自動 crop でのバグ修正、内部的にダミーのマジックメソッドで組み込みクラスのオブジェクトに対する一部操作を禁止していた箇所のリファクタリング、ext/com_dotnet のバグ修正箇所のリファクタリングがあった！

# 2018-11-26
## cmb69: Fix [#77200](https://bugs.php.net/bug.php?id=77200): imagecropauto(…, GD_CROP_SIDES) crops left but not right
- https://github.com/php/php-src/commit/a1aaec08b5a3fc0f36cf91f034b4232285c6e793
- [7.2~]
- ext/gd で、自動 crop が GD_CROP_SIDES で左側の crop はするが 右側の crop はしない問題の修正
- 背景色検出処理で分岐の条件が足りなかった問題くさい

## petk: Add re2c checking with error exit code
- https://github.com/php/php-src/commit/67b91084787bca49552f4b400a636ce58307c9f4
- ビルドシステムで re2c がない場合に警告を出していたが、生成後の字句解析器のファイルもない場合はそのむねエラーを吐いて通知するよう修正

## nikic: Remove redundant Generator::__wakeup() method
- https://github.com/php/php-src/commit/43417953f4a781a92f42c9941a2742814d43415d
- ジェネレータのアンシリアライズ防止に [__wakeup()](http://php.net/manual/ja/language.oop5.magic.php#object.wakeup) でエラーにするコードがあったが、別経路（serialize_deny / unserialize_deny）で防いでいたので削除

## nikic: Use serialize_deny for CURLFile
- https://github.com/php/php-src/commit/a624c2bd13c89891e99f2052b42c0816cc18341c
- ext/curl で、CURLFile についても同様に serialize_deny / unserialize_deny で防ぐようにし、__wakeup() でのガードを削除

## nikic: Switch PDO to use serialize_deny
- https://github.com/php/php-src/commit/6e4b20269449002c4cf21b5f50a11acf91785ce3
- ext/pdo で、PDO についても同様に serialize_deny / unserialize_deny で防ぐようにし、__wakeup() / [__sleep()](http://php.net/manual/ja/language.oop5.magic.php#object.sleep) でのガードを削除

## nikic: User serialize_deny for PDOStatement as well
- https://github.com/php/php-src/commit/28edeb2ba3551fc6cff2db0004d67435467cdaac
- ext/pdo で、PDOStatement についても同様に serialize_deny / unserialize_deny で防ぐようにし、__wakeup() / __sleep() でのガードを削除

## nikic: Remove redundant Exception::__clone() method
- https://github.com/php/php-src/commit/e7131a4e9fa0acf8fc1e486b49851e71859ef5b8
- Exception の clone を [__clone()](http://php.net/manual/ja/language.oop5.cloning.php#object.clone) でエラーにすることで防ぐコードがあったが、別経路（オブジェクトハンドラの clone_obj を null に）で防いでいたため削除

## nikic: Remove redundant __clone() methods from Reflection
- https://github.com/php/php-src/commit/55bd88ce0d1bf461546d5d0b40920491d566ed48
- ext/reflection で、Reflection の clone を同様に \_\_clone() で防ぐコードがあったが、やはり別経路（オブジェクトハンドラの clone_obj を null に）で防いでいたため削除

## cmb69: Use zend_empty_array
- https://github.com/php/php-src/commit/07d6dfbfe40848173ab2136d9c9eba862dc9fca0
- [7.3~]
- ext/com_dotnet の[一昨日の修正](https://qiita.com/sj-i/items/a8b13b15f72c31777877#cmb69-fix-77177-serializing-or-unserializing-com-objects-crashes)で、null のかわりに空のハッシュテーブルを用意して返すようにした箇所があったが、7.3 から内部でから配列を指すのに使える zend_empty_array があったのでそちらを使うよう修正
Cognos Analytics 11.1のリリースのご連絡

#Cognos Analytics 11.1のリリース
取り急ぎのご連絡だけで恐縮です。
2018年11月23日に、Cognos Analyticsの新バージョン11.1がリリースされました。

今後、色々と触ってみて、記事出して行こうと思いますが取り急ぎリリースのご連絡まで。

概要はこちらのリンクの動画を見て頂くのが一番早いかと思います。
**IBM Cognos Analytics 11.1**
https://ibm-dte.mybluemix.net/ibm-cognos-analytics-11.1

以前にこちらの投稿で、前置きしていましたが、概ねこの内容の通りの様なので、日本語が良いよという方はとりあえずこちらで。
**Cognos Analytics の今後の拡張ロードマップ（Think 2018より）**
https://qiita.com/shinyama/items/a8fd45d3ea09503ef6f5

#Cognos Analytics 11.1 無料体験
こちらもご活用下さい！
**Cognos Analytics 11.1 を無料学習しよう**
https://qiita.com/shinyama/items/1cf6039e80e516012ea6
無料で爆速なWebアプリケーションを作ろう！

# 動機
日本語にはこんな格言があります。

- 「ただより高いものはない」
- 「時は金なり」

じゃあ、無料サービスで爆速Webアプリケーションを作れば最高じゃない？？
**→作りました。**

# Qiita-Trend-PWA
https://qiita-trend-pwa.now.sh/

- Qiitaいいね数ランキング表示サイト
- ランキング上位タグの可視化

<table>
<tr>
<td>
<img width="100%" alt="screen_shot1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/fbb8b3c0-a070-2903-a5e6-48958313ea54.png">
</td>
<td>
<img width="100%" alt="screen_shot2.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/b1a62d82-9036-2daa-6c15-2caa7a72cdf5.png">
</td>
</table>

# 構成
- サーバ
    - 『now』(Node.jsサーバ)
- データストア
    - 『Firebase』
- フレームワーク
    - 『Next.js』+『next-offline』


## 『now』(Node.jsサーバ)
- 役割
    - SEO対策+パフォーマンス対策のためのSSR
- メリット
    - <font color="red">OSSプラン - FREE → **無料**</font>
    - サブドメイン取得可能
    - <font color="blue">HTTP2対応済　→ **爆速**</font>
    - HTTPS対応済

## 『Firebase』
- 役割
    - Qiitaいいね数スクレイピング結果の取得<br>
    (CloudFirestore + CloudFunctions + CloudHosting) 
- メリット
    - <font color="red">Sparkプラン　→　**無料**</font>
    - <font color="blue">CDN利用によるレスポンス取得高速化 →　**爆速**</font>

## 『Next.js』+『next-offline』
- 役割
    - PWA対策
    - SPA対応
- メリット
    - <font color="red">OSS →　**無料**</font>
    - <font color="blue">ServiceWorkerが15行程度で利用可能 →　**爆速**</font>
    

# 本当に爆速なのか？
(ここまで読んでくれた皆さんの心の声が聞こえます。。。)
#### 「本当に爆速なのか？？🤔」
<font color="blue">**→爆速です。**</font>

## lighthouse
<img width="684" alt="lighthouse_score.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/5d0ba5d2-2271-aa62-6f94-c9d9b0788106.png">

中々良いスコア👍
(Accessibilityは、Qiitaの見た目に合わせに行った結果、諦めました。。。)

## WebPageTest
https://www.webpagetest.org/

<img width="936" alt="WebPageTest_score.png" src="https://qiita-image-store.s3.amazonaws.com/0/202800/76731121-36d3-a80c-f7d7-b1d09ab73c14.png">

中々良いスコア👍
「Load Time」、「Speed Index」、「First Interactive(beta)」あたりを確認いただけると１秒を大きく下回っています。。
ServiceWorkerを利用して、各リソースのレスポンスをクライアントサイドにキャッシュしているので、２回目の表示が早くなっていますね。
(あえてサイトの比較は行いませんので、他のサイトについては皆さんで試してみてください。)

# まとめ
- 「ただより高いものはない」
- 「時は金なり」

じゃあ、無料サービスのみで爆速Webアプリケーションを作れば最高じゃない？？
#### →『now』 + 『Firebase』 + 『Next.js』 + 『next-offline』  = 無料で爆速!😀

# 追記
- 上記サイトで行った、CDN利用に関する一工夫を記載しました。
    - [無料サービスのみでCDNヒット率を上げるための一工夫](https://qiita.com/zonbitamago/items/199d758ddc7e7a08204d)
Cognos ディメンショナルモデルでの前期実績の表示方法

#前期実績のディメンショナルモデルでの表示方法
誰かにガイドしたものは何でもメモ状態で置いておきます。

Cognosレポートで、ディメンショナルモデルでの「前期実績」的なものの表示方法です。

**レポート定義**
「前期数量」データアイテム定義
「四半期」はレベルです。
「前期数量」を以下のように作成しています。
*tuple([数量],prevMember(currentMember([販売].[時間].[時間])))*
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/fc05a2b9-514f-d53b-ae4c-8be1d07f6bd1.png)

**実行結果**
Cognosサンプルの場合、「指定なし 20XX」というメンバーもあるため、ブランクが表示されてみにくいですが、年をまたいだ前期数量表示もできています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/38316fa9-6812-9c3f-f0a7-19db3853c5a0.png)

**解説**
currentMember([販売].[時間].[時間]) は、()内に階層を指定します。リストの「四半期」列の行ごとのメンバーを「前期数量」アイテムの中で認識させます。

prevMember(currentMember([販売].[時間].[時間]))は、currentMemberで取得した一つ前のメンバーを取得します。

tuple([数量],prevMember(currentMember([販売].[時間].[時間])))は、prevMemberに相当するメンバーの「数量」の値を返します。

以上です。
AWS Amplify Consoleがどれだけお手軽か試してみた所感

AWS re:Invent 2018で「AWS Amplify Console」というAmplifyの更新がアナウンスされました。「お手軽」と謳われていて、実際どの程度お手軽なのか気になったので使ってみます。

# AWS Amplify Consoleとは
[公式ページ](https://aws.amazon.com/jp/amplify/console/)に詳しく書いているので省略。

# 早速使ってみる
現状だと以下のリポジトリに対応しているようなので、GitHubにあげているコードを使ってみます。

- GitHub
- Bit Bucket
- GitLab
- CodeCommit

![スクリーンショット 2018-11-27 2.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/102769/689fa6d0-6873-2a5f-7030-d5ae2f8dd891.png)

リポジトリは、以前作った画面（AWS Amplify + Angular 6）がGitHubにちょうどあるので、それを利用します。

![スクリーンショット 2018-11-27 2.32.47.png](https://qiita-image-store.s3.amazonaws.com/0/102769/a5ce3a95-287e-62d8-8ace-b49e88e9ff98.png)

このアプリは```environment.ts```ファイルに以下のようなキーの設定が必要になります。

```ts
export const environment = {
  production: false,
  amplify: {
    Auth: {
      region: 'REGION',
      userPoolId: 'USER_POOL_ID',
      userPoolWebClientId: 'USER_POOL_WEB_CLIENT_ID',
      identityPoolId: 'IDENTITY_POOL_ID'
    }
  },

  apiBaseUrl: 'API_BASE_URL',

  localstorageBaseKey: 'LOCAL_STORAGE_BASE_KEY'
};
```

GitHubに上記を入力した状態でPUSHするわけにはいかないので、環境変数とビルドスクリプトを以下のように編集し、ビルド時に文字列を置き換えるようにします。ビルド設定は、CodeBuildの設定に似てますね。

![スクリーンショット 2018-11-27 7.56.41.png](https://qiita-image-store.s3.amazonaws.com/0/102769/f17ea1fb-4ed5-70ee-7fd9-cf9add428672.png)

環境変数はそれぞれこんな感じ。ブランチごとに設定ができそうなのはありがたいです。

![スクリーンショット 2018-11-27 7.56.45_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/4c445e53-2672-bca3-da5c-b45bc872f869.png)

ビルドが開始されてしばらく待つと、ビルド成功のメッセージがみれます。（ビルドはどうやら「手動での実行」と「リポジトリへのコミットからフックしての起動」が自動で設定されているようです。

![スクリーンショット 2018-11-27 7.56.33_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/7c77e02c-dc6b-79d9-f9a5-9430d0cc2ea8.png)

それぞれ何がビルドで行われたのかは、「ビルドアクティビティ」というところから確認ができます。（ビルド時のログが出力されます）ビルドエラーが発生するとここにエラー内容が記載されるので、デバッグもしやすかったです。

![スクリーンショット 2018-11-27 7.59.06_deco.png](https://qiita-image-store.s3.amazonaws.com/0/102769/dce08bc1-3ed2-adc8-9b18-ba63508b4f9e.png)



実際にビルドされた画面にアクセスすると、無事公開されたページにアクセスすることができました。（CognitoやAPI Gatewayとの連携もきちんとされていて、ログイン後の操作もできました）

![スクリーンショット 2018-11-27 8.11.31.png](https://qiita-image-store.s3.amazonaws.com/0/102769/dd1e8ee3-12b4-2bfa-2de1-91ace62cdcce.png)

ビルドエラーの対応には少し悩みましたが、それでも１時間そこそこでここまでできてしまいました。

# その他機能
今回使わなかった機能がいくつかあります（メニューから選択できます）。

1. カスタムドメインとの連携
2. ビルド結果のメール通知
3. アクセスコントロール
4. リダイレクト設定

CIっぽさはまだない感じです。これからアップデートされるのでしょうか。

# まとめ
今の所は「CDに特化した簡単サービス」という感覚を受けました。実際にはCIを実施してその品質レポートなどをCircle CIやJenkinsなどのように見れるといいかな、とは思いますが、「お手軽簡単CDサービス」としてはかなり魅力的です。今後のアップデートにも注目したいですね。
Entity Framework の DB 接続の解放について、 using した場合と DI コンテナを使った場合の違い。

## はじめに

今更ながら、Entity Framework の DB 接続の解放方法について、`using`ステートメントを使用した場合と ASP.NET Core 組み込みの DI コンテナを使った場合の違いについて調べました。


## **外部リソースの解放について**

DB 接続など`.NET`の管理外の外部リソース[^1]は、使い終わったら破棄する必要があります。
`EF Core`では `DbContext`を継承したクラスを使用してDB 接続を行います。

```cs:FooDbContext.cs
public class FooDbContext : DbContext {
  public FooDbContext(DbContextOptions<FooDbContext> options) :base(options) { }
  public DbSet<BarEntity> BarEntities { get; set; }
}
```

DB 接続を破棄するには`DbContext.Dispose`メソッドを呼び出します。

確実に`Dispose`するには、

- `using`ステートメントを使用する
- フレームワーク`ASP.NET Core`の DI コンテナに任せる

方法があります。[^2]

## `using`ステートメントで外部リソースの破棄する

`using`ステートメントを使用するとブロック`{}`を抜けた際に自動で`Dispose`が呼ばれます。
途中で`return`したり、例外がスローされても確実に`Dispose`されます。

アプリケーションで`DbContext`を使用する場合、後述の`ASP.NET Core`の DI コンテナに任せるので、`using`はユニットテストなどで使用することが多いです。

```cs:
using (var dbContext = new FooDbContext()) {
  var bars = dbContext.BarEntities.ToLoist();
  return bars;
} // <- ここで FooDbContext.Dispose() される
```

## `ASP.NET Core`の DI コンテナに破棄を任せる

`ASP.NET Core`の DI コンテナを使用すると、`DbContext`のインスタンスの管理はフレームワークに任されます。
DI された`DbContext`のインスタンスのライフタイムは利用側のスコープと同等で、利用側のスコープを抜けた時に`DbContext.Dispose`が呼ばれます。[^3]

DI コンテナに`DbContext`を設定するには`Startup`クラスで`AddDbContext`を使います。

```cs:Startup.cs
public void ConfigureServices(IServiceCollection services) {
  services.AddDbContext<FooDbContext>(options => {
    options.UseSqlServer("接続文字列");
  });
}
```

データベースコンテキストを利用するクラスのコンストラクタで`DbContext`を引数にとると`DbContext`のインスタンスが DI コンテナによって注入されます。
以下の`BarsController`のインスタンスが破棄された時に自動で`DbContext`の`Dispose`が呼ばれ破棄されます。

```cs:
public class BarsController {
  readonly FooDbContext dbContext;
  public BarsController(FooDbContext fooDbContext) {
    dbContext = fooDbContext;
  }
  ...
}
```

## 注意点

DI コンテナーで注入したデータベースコンテキストを`using`（`Dispose`）してはいけません。
インスタンスが破棄されたにも関わらず、DI コンテナー側で`Dispose`が呼ばれて例外が発生します。

[^1]: 不要なオブジェクトは`.NET`のガーベジコレクタによって破棄されますが、DB 接続やファイル IO は明示的にリソースを開放する必要があります。
[^2]: `try {...} finally {...}`の`finally`ブロックで`DbContext.Dispose()`しでも確実に破棄できます。
[^3]: ライフタイムがシングルトンでない理由は`ASP.NET Core`が一度読んだレコードを（`AsNoTracking`で無効にしない限り）変更を感知するために追跡し、メモリが膨れるためです。
jsdoでchip8　その２

#概要

jsdoでchip8やってみた。
アセンブラを作ってみる。設計編

#ニーモニックを変える。

覚え安く、変える。

転送命令

```
CLS  -> cls
DRW  -> disp
LD -> load
```

ビット操作命令

```
OR -> or
AND -> and 
XOR -> xor
SHR  -> rshift
SHL  -> lshift
```

算術命令

```
ADD -> add
SUB -> sub
SUBN -> nsub 
RND -> rand
```

分岐命令

```
RET ->ret
SYS -> sys
JP -> goto
CALL -> call 
SE -> eq
SNE -> neq
SKP ->keq 
SKNP ->kneq 
```

追加

```
nop  -- no op
data byte -- data
```

補足
一行は、ラベル、スペース、スペース、第一オペランド、スペース、スペース、第二オペランド、スペース、スペース、第三オペランド、スペース、スペース、第四オペランド。
orgは無く、スタートアドレスは、0200H番地から、固定。
数値は、0-255の十進のみ。
レジスタは、v0-v15の16個とI（アドレス）。

#サンプルコード
012345を表示する。

```
	load	v2	5
	load	v1	3
	load	I	0
	load	v0	11
	disp	v0	v1	6

	add	v0	6
	add	I	v2
	disp	v0	v1	6

	add	v0	6
	add	I	v2
	disp	v0	v1	6

	add	v0	6
	add	I	v2
	disp	v0	v1	6

	add	v0	6
	add	I	v2
	disp	v0	v1	6

	add	v0	6
	add	I	v2
	disp	v0	v1	6
```

#命令の組み立て方
レジスタは、4bit
アドレスは、12bit

|  2byte     |            |
|:-----------------|:------------------|
|00E0 | CLS
|00EE | RET
|0nnn | SYS addr
|1nnn | JP addr
|2nnn | CALL addr
|3xkk | SE Vx, byte
|4xkk | SNE Vx, byte
|5xy0 | SE Vx, Vy
|6xkk | LD Vx, byte
|7xkk | ADD Vx, byte
|8xy0 | LD Vx, Vy
|8xy1 | OR Vx, Vy
|8xy2 | AND Vx, Vy
|8xy3 | XOR Vx, Vy
|8xy4 | ADD Vx, Vy
|8xy5 | SUB Vx, Vy
|8xy6 | SHR Vx {, Vy}
|8xy7 | SUBN Vx, Vy
|8xyE | SHL Vx {, Vy}
|9xy0 | SNE Vx, Vy
|Annn | LD I, addr
|Bnnn | JP V0, addr
|Cxkk | RND Vx, byte
|Dxyn | DRW Vx, Vy, nibble
|Ex9E | SKP Vx
|ExA1 | SKNP Vx
|Fx07 | LD Vx, DT
|Fx0A | LD Vx, K
|Fx15 | LD DT, Vx
|Fx18 | LD ST, Vx
|Fx1E | ADD I, Vx
|Fx29 | LD F, Vx
|Fx33 | LD B, Vx
|Fx55 | LD [I], Vx
|Fx65 | LD Vx, [I]


以上。
Scala入門 スケーラブルプログラミング ①

#はじめに
Scalaスケーラブルプログラミング[第3版]で学んだことをまとめていきたいと思います。
基本的には書籍に沿った形で要約していきます。気になる箇所、改善点あれば是非ともコメントお願い致します。

#第１章スケーラブルな言語(A Scalable Language)
##スケーラブルな理由
- オブジェクト指向と関数型プログラミングが融合した静的格付け言語
- Scalaのトレイトでは任意のスーパークラスに新しい実装を追加可能(プラグイン能力が高い）
- 多重継承問題(ダイヤモンド継承)か起こりにくい言語仕様
- イミュータブルなデータ構造なデータ構造と参照透明なメソッドの推奨
- メソッドはどんな副作用も持ってはならない(手続き型の実装も可)

##Scalaを選ぶ理由
###互換性
- JVM上で動作
- Javaのメソッド、フィールドにアクセス可能
- Javaクラス、インターフェースを実装可能
- Scalaの型はJavaの型を拡張して実装

###完結さ
- Javaの半分以下のコードで実装可能

```Java:JavaConstructor
class MyClass {
 private int index;
 private Stirng name;

 public MyClass(int index, String name) {
  this.index = index;
  thisn.name = name;
}
```
```Scala:Scalaconstructor
class MyClass(var index: Int,var name: String) {}
```

簡素で余計なコードを書かなくていいのは魅力的

###高水準

ラムダ式を用いていもやや冗長??

```Java:Java8Matcher
boolean nameHasUpperCase =
   name.chars().nyMatch{
       (int ch) -> Charactor.isUpperCase((char) ch)
}
```

Scalaは簡素に書けるのがいい

```Scala:ScalaMatcher
val nameHashUpperCase = name.exists(_.isUpper)
```


##参考文献
https://www.amazon.co.jp/dp/B01LYPRFI7/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
Kubernetes入門にはブラウザだけでできるKatacodaのFree Coursesが便利。

Katacodaは、実際の端末をつかって様々なツールを予め用意されたシナリオに沿って操作することにより、基本的な使い方が学べるツールです。
各種ツールの起動、操作、停止がといった操作がブラウザ一つで利用できます。

学べるツールはDocker, Kubernetes, git, Machine Learning, Prometheus, Jenkinsなどたくさんあります。 
https://www.katacoda.com/
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77722/329f0cde-c8ce-2198-8692-e2496f247fa4.png)





中でもシナリオが多く、おすすめなのはKubernetesとDockerです。
これらのツールをローカルPCで実行すると知らない間にコンテナイメージがたくさん作られてディスクを圧迫するなんてことが発生しますが、これを使えばそういった心配は一切必要なくなります。
https://www.katacoda.com/courses/kubernetes



Github, LinkedIn, Twitter, Googleのいずれかのアカウントを持っていればログイン可能で、ログインをしてコースを完了すると以下のように進捗を管理することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77722/ecb20767-271b-e601-d9d8-6ab85cce247e.png)



シナリオを選んで開始すると、以下のような画面が常時され、サーバ側にVMが立ち上がります。
右側のTerminalにコマンドを入力すると、実際に端末を操作することができます。
この端末では、ls, cd, vi などのLinuxの基本的なコマンドが利用できます。シナリオに沿ったコマンドを入れたときのみ正しいコマンドが仮想的に返ってくるという形ではなく、実際のkubanatesを操作することができます。
（そのため、シナリオに沿って進めるか自由にコマンドを打つのかはあなたの自由…）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77722/35864b7d-9ec9-eb18-9861-333e841808b8.png)


コマンドを叩いて起動するだけでなく、立ち上げたサービスをブラウザ上から参照することもできます。
以下は起動したminikubeを開いた画面。
シナリオの中ではKubernetesを使ってロードバランサ付きでdockerを複数起動したりするのですが、その場合もブラウザから立ち上げたインスタンスにそれぞれ接続したり、Kubernetes上で確認したりできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77722/0a44d510-2d30-39fd-69c9-c6e5bf2eda5d.png)


ターミナルの上側の＋を押すと以下のような画面が表示され、参照したいポート番号を入力すると実際にアクセスが可能です。
実際の端末操作ができるので、シナリオでは一つのコンテナを起動する箇所で実際には２つのコンテナを起動させる、また、ポート番号をちょっと変えてみるなどしてもちゃんと動作します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77722/afb504d0-9773-0d28-8007-a7468c00e1e4.png)
ちなみに、Kubanateでコンテナ起動の時に指定以上の多重起動を行ったりすると１０分ぐらいサービスが使えなくなってしまうので注意！
（一人あたりに一定時間以内に起動できるコンテナの数が決まっている様です）
DeepMimicのビルド

![2018-11-26_08-27-24.gif](https://qiita-image-store.s3.amazonaws.com/0/51857/0c19e287-6293-feeb-ec7b-5794229ad50d.gif)

# 動作確認環境

> * Windows10 Pro
> * CPU: Intel Core i7-4790S @ 3.20 GHz
> * RAM: 32.0 GB
> * Arc: x64 based
> * グラフィックは以下画像参照

![nvcplui_2018-11-26_02-58-40.png](https://qiita-image-store.s3.amazonaws.com/0/51857/db9c8001-56c7-92a8-31ad-be4c32beaab5.png)


# 各種プログラムのダウンロード
* python 3.6.5 x64のインストール
* https://www.transmissionzero.co.uk/software/freeglut-devel/ からprebuiltなバイナリ落として配置しとく
* https://sourceforge.net/projects/glew/ からprebuiltなバイナリ落として配置しとく
* http://www.eigen.tuxfamily.org/index.php?title=Main_Page からEigenダウンロード
* https://github.com/bulletphysics/bullet3/releases からBullet3ダウンロード
* https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi MPIインストール
  * インストーラーは、 `msmpisetup.exe` の方を利用する。setup.exeの方が色々パス設定とかやってくれるっぽい。
* https://user.xmission.com/~nate/glut.html glutのprebuilt dllひろっておく

# bullet3 ビルドしとく

```shell
cd bullet-3.2.8
mkdir build
cd build
cmake .. -G "Visual Studio 15 Win64"
sln開いてReleaseでビルド
```

#  DeepMimicのビルド

* DeepMimic\DeepMimicCore\DeepMimicCore.slnひらく
* PYTHON_INCLUDE, PYTHON_LIB, SWIG_DIRは適切に設定しとく。インクルードディレクトリ/ライブラリディレクトリをいじってもOK.DeepMimicCore.vcxprojをいじってもいいし
    * 僕はこれがちゃんと動いてるかわからなかったので、slnを開くbatを作成しましした


```
set PYTHON_INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\include
set PYTHON_LIB=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\libs
set SWIG_DIR=C:\Users\takanori\Desktop\DeepMimic\swigwin\bin
start DeepMimicCore.sln
```

* 設定がRelease_Swig x64であることを確認


### 各種パス設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/51857/a101ec47-895c-217f-1f06-c296256e52bd.png)

#### VC++ディレクトリ>インクルードディレクトリ

* C:\Users\takanori\Desktop\DeepMimic\glew-2.1.0\include
* C:\Users\takanori\Desktop\DeepMimic\freeglut-MSVC-3.0.0-2.mp\freeglut\include
* C:\Users\takanori\AppData\Local\Programs\Python\Python35\include
* C:\Users\takanori\Desktop\DeepMimic\eigen-eigen-b3f3d4950030.tar\eigen-eigen-b3f3d4950030
* C:\Users\takanori\Desktop\DeepMimic\bullet3-2.87\src

#### VC++ディレクトリ>ライブラリディレクトリ

* C:\Users\takanori\Desktop\DeepMimic\bullet3-2.87\build\lib\Debug
* C:\Users\takanori\Desktop\DeepMimic\glew-2.1.0\lib\Release\x64
* C:\Users\takanori\Desktop\DeepMimic\freeglut-MSVC-3.0.0-2.mp\freeglut\lib\x64
* C:\Users\takanori\AppData\Local\Programs\Python\Python35\lib

#### MathUtil.hの適当な所にM_PIのdefine追加しとく
https://github.com/xbpeng/DeepMimic/issues/17

```c++
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
```

### ビルドする

C:\Users\takanori\Desktop\DeepMimic\DeepMimicCoreにDeepMimicCore.py,_DeepMimicCore.pydができあがる

# 動作確認
```shell
cd ..
python DeepMimic.py --arg_file args\kin_char_args.txt
```
ImportError: DLL load failedがでるときは必要なdllがちゃんと配置されてるか確認(glew32,freeglut,glut32)


# 課題

これをバッチ処理できない…？か？
AOJ day 4: Easy PureScript Nix

Since the beginning of time, people complained about this combination of obscure technologies of PureScript with Nix. "The derivation on nixpkgs doesn't work!" "This doesn't build!" "There are missing deps!" "Why is the nixpkgs derivation for Psc-Package not updated?" And while many users may consume Nix packages, they often do not understand how to fix broken derivations, let alone know what they even are. Well, it's not entirely their fault for not knowing though.

So instead of trying to tackle the incredibly hard problem of how to get derivations on Nixpkgs fixed and working "correctly" (whatever that means), I started looking at the problem from the other side: "Why don't I just get to work using Nix to make my own damn derivations for PureScript tooling? It's not like I even like Nixpkgs so much anyway."

Famous last words.

## "Using PureScript easily with Nix"

In this post, I talk about how I set up an easy way to get PureScript tooling installed to use from a project by using nix derivations. This approach ultimately lets us use PureScript tooling by simply running `nix-shell` in the root of a project, and also allows for being able to install tooling to our global environment by feeding an expression into `nix-env`.

<https://qiita.com/kimagure/items/de2a4ff45dd8fe8be4b1>

Since I wrote this post, some others, especially my friend Pekka in town, helped get the various expressions fixed up so that things work properly also on NixOS. Definitely check this project out if you want to easily and reliably get PureScript (and related) tooling installed and prepared easily:

<https://github.com/justinwoo/easy-purescript-nix>

And so while the Nix language is strange and doesn't provide the best tools, a combination of `nix repl` and tools like `nix-show-derivation` should help you chase down issues you run into.
【pandas】集約したある列の最大値と、その時の他の列の値を取得する

# はじめに

やりたいことは

- データを一日単位でグルーピング
- ある列の最大値と、その時の他の列の値を取得する

の2点です。
最大値取得は簡単なのですが、その値が最大値をとる時の、他の列の値を取得するのに手間取ったので記録しておきます。

# ソース

まず、データとして以下のようなCSVを読み込みました。
1ヶ月分の、1時間単位の気温と湿度のCSVです。

```sample.py
import pandas as pd

df = pd.read_csv('data.csv', index_col=0, parse_dates=True)

df

                     temperature  humidity
date                                      
2018-10-26 01:00:00         16.3        75
2018-10-26 02:00:00         16.5        70
2018-10-26 03:00:00         16.0        68
2018-10-26 04:00:00         15.3        68
2018-10-26 05:00:00         15.7        66
2018-10-26 06:00:00         15.8        69
...                          ...       ...
2018-11-26 21:00:00         13.7        70
2018-11-26 22:00:00         14.1        65
2018-11-26 23:00:00         13.4        70
2018-11-27 00:00:00         13.7        68
```
インデックスがdate,カラムはtemperature(気温)とhumidity(湿度)となっています。
ここから、一日の最大気温とその時の湿度を抽出します。

```sample.py

# 一日の最大気温
max_temp_series = df['temperature'].groupby(pd.Grouper(freq='D')).max()

# 最大気温の時のインデックス
max_temp_index = df['temperature'].groupby(pd.Grouper(freq='D')).idxmax()

# 最大気温の時の湿度
humidity_series = df.loc[df.index.isin(max_temp_index), 'humidity']

```

以上です。やってることとしては

- groupby(pd.Grouper(freq='D'))で一日単位にグルーピング
- idxmax()で気温が一日最大の時のインデックスを取得
- グルーピング前のデータフレームから、取得したインデックスで湿度を抽出

という流れです。
idxmax()がグルーピング後にも使えるということを知らなかったので時間がかかりました。

# 終わりに
もっと簡潔な方法がありそうな気がするので、何かあったらコメントをお願いします。

# 参考
[公式リファレンス](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.groupby.DataFrameGroupBy.idxmax.html)
Eclipse Plugin関連

#リンク

[プラグイン開発のTIPS集](https://www.masatom.in/pukiwiki/Eclipse/%A5ץ饰%A5%A4%A5%F3%B3%ABȯ%A4%CETIPS%BD%B8/#z76cff34)
[Eclipseプラグイン開発](http://yoichiro.cocolog-nifty.com/eclipse/)
[テキストエディタ上のカーソル位置の取得方法](http://yoichiro.cocolog-nifty.com/eclipse/2004/08/index.html)
Geolocation APIをPromiseでラップして扱う（TypeScript）

Geolocation APIを扱う場合、awaitを使えた方が便利なことが多いので
Promiseでラップするようにしました。

```sample.ts
  // API呼び出し
  getCurrentPosition() {
    return new Promise(
      (
        resolve: (value?: Position) => void,
        reject: (reason?: PositionError) => void
      ) => {
        navigator.geolocation.getCurrentPosition(resolve, reject);
      }
    );
  }

  // 使う場合はこんな感じで
  async foo() {
    const s = await this.getCurrent();
    console.log(s.coords);
    // 結果（例）
    // Coordinates {latitude: 35.681167, longitude: 139.767052,
    // altitude: null, accuracy: 40, altitudeAccuracy: null, …}
  }

```

何かの役に立てば幸いです。
Live Server for Visual Studio Code で HTTPS を有効にする

## 概要

Visual Studio Code (以下、VScode) の機能拡張 [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) で HTTPS を有効にする方法です。

### Live Server とは

https://www.nxworld.net/services-resource/vscode-extension-live-server.html こちらで

> ライブリロード機能を備えた簡易ローカルサーバーを起動できる拡張機能

と紹介されてますが、まさにその通りです。インストールした後、ディレクトリを VScode で開くと *Go Live* ボタンが出てくるので、それをクリックするだけで Live Reload が有効になったローカルサーバとブラウザが立ち上がります。

### なんで探してたのか

たとえば WebWorker とか `file:///` では実行できないようなものをサクっと実行したいなという思いからです。
今までは `python3 -m http.server` とか [Python3 でワンライナー HTTPd](https://qiita.com/masakielastic/items/05cd6a36bb6fb10fccf6)を立ち上げてたりしてたんですけど、引数を毎度忘れてしまったり、HTTPS に対応させる方法が面倒だったという背景です。

## Live Server の HTTPS を有効にする

標準では HTTPS サーバは有効になっていないので、そちらの設定方法です。
手順は

1. 証明書を作成する
2. `settings.json` を書く

となります

### 証明書を作成する

ローカルですのでオレオレ(自己署名証明書)で構わないと思います。

```console
$ openssl req -x509 -newkey rsa:4096 -sha256 \
 -nodes -keyout vscode_live_server.key.pem \
 -out vscode_live_server.cert.pem \
 -subj "/CN=example.com" -days 3650
$ ls
vscode_live_server.cert.pem  vscode_live_server.key.pem
```

※ [ワンライナーで作れちゃう](https://qiita.com/masakielastic/items/05cd6a36bb6fb10fccf6#%E8%87%AA%E5%B7%B1%E7%BD%B2%E5%90%8D%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%A8%E7%A7%98%E5%AF%86%E9%8D%B5%E3%81%AE%E7%94%9F%E6%88%90)んですね

### `settings.json` を書く

先ほど作った .pem を指定します。

```json-doc:settings.json
"liveServer.settings.https": {
        "enable": true,
        "cert": "C:\\Users\\YOUR\\Documents\\vscode_live_server_pems\\vscode_live_server.cert.pem",
        "key": "C:\\Users\\YOUR\\Documents\\vscode_live_server_pems\\vscode_live_server.key.pem",
        "passphrase": ""
    },
```

以上です。次回の "Go Live" から https://127.0.0.1:PORT でブラウザが立ち上がります。
もちろん `NET::ERR_CERT_AUTHORITY_INVALID` となりますが、そこは~~気にせず~~開いてください。

## あとがき

VScode は、もはや OS だ。

EoT