OmniAICreator/Qiita-1.07M huggingface dataset:
Cosmos DB に格納したデータでサンタの居場所（推測）を可視化する

この記事は、[Microsoft Azure Tech Advent Calendar 2018](https://qiita.com/advent-calendar/2018/microsoft-azure-tech)のための記事となります。
__本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります__

# これまでのあらすじ
[サンタの軌道に思いを馳せたドキュメント型のデータを VS Code で準備する](https://qiita.com/mihochannel/items/65cf17dea3ec054c7684)で妄想から検索用のJSONファイルを準備しました。

さて、今回はそのサンタさんの通過予測データを __Azure Data Explorer__ に喰わせてあれこれしようとしていたのですが、風邪を患ってしまったので少し軽めに __Power BI__ で可視化させる形でいかせてください。
（すみません。休みの日に風邪を引くという損な身体をしております。。。）

# 導入編
データの可視化と言うと、一番便利でお手軽なのが __Power BI__ です。「__Power BI__ って厳密には今回のテーマである __Microsoft Azure では無い__ジャナイか！」というお声が聞こえてきそうですが、__Power BI__ には数種類存在し、__Power BI Embedded は Azure のサービスのひとつです。__ すみません。言い訳がましい。

- __Power BI Desktop__ (無償から始められる Windows のアプリケーション。実際のレポートを開発する際に使うツールのことも指しています。）
- __Power BI Pro, Premium__（レポートを共有することができるSaaSサービス。前述のクライアントで開発したレポートを組織内で共有したりできます。）
- __Power BI__ モバイル（Windows, iOS, Android 対応のレポートのビューアーアプリ。前述のSaaSサービスユーザーの利用用途が主です。）
- __Power BI Embedded__（__Azure のサービス__ ISV さんが自社のソリューションにレポートやダッシュボードを部品として組み込むために存在。）
- __Power BI Report Server__ (オンプレミスでのレポートやダッシュボードの共有を目的としたサーバーPremiumのライセンスにライセンス包含されています。）

## Power BI から Cosmos DB 接続
Power BI の　Get Data から接続情報を入力します。
<img width="457" alt="2018-12-23_19h08_46.png" src="https://qiita-image-store.s3.amazonaws.com/0/135357/8b8d93e8-9371-9bf8-a4b7-945d8d5a2b3b.png">


<img width="525" alt="2018-12-23_19h26_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/135357/eb31c3b6-ce39-87d9-e744-701fb5112b97.png">

<img width="525" alt="2018-12-23_19h27_41.png" src="https://qiita-image-store.s3.amazonaws.com/0/135357/e1f61104-a8df-38b5-294c-7a9296143e20.png">

そして、クエリで必要なデータだけ（位置情報、リージョン名、到着時間）を抽出するため、編集します。
チェックボックスポチポチです。最終的には画面とは異なり__displayName,SantAarrival,latitude,longitude__ を選択しました。
<img width="860" alt="2018-12-23_19h28_45.png" src="https://qiita-image-store.s3.amazonaws.com/0/135357/14d06fc5-c43c-c59a-b0da-3db61057279c.png">

こんなかんじ。
<img width="960" alt="2018-12-23_19h32_54.png" src="https://qiita-image-store.s3.amazonaws.com/0/135357/3d5de2f8-2233-4de2-701d-102141cb8973.png">


コントローラーは、地図が2種類あるのですが、時刻まで表現できるArcGISを使用するときれいに表示できますよ。
<img width="929" alt="2018-12-23_19h50_31.png" src="https://qiita-image-store.s3.amazonaws.com/0/135357/9079b325-9705-6d82-2798-237f98827ea9.png">

なお、 __yyyymmddhhmmss__ で入っているSantAarrivalデータは、そのままだと扱いにくいので変換するとわかりやすいと思います。


# 参考リンク
- [かつてないビジネス インテリジェンス](https://powerbi.microsoft.com/ja-jp/)
- [サンタの軌道に思いを馳せたドキュメント型のデータを VS Code で準備する](https://qiita.com/mihochannel/items/65cf17dea3ec054c7684)
- [Power BI で "YYYYMMDDHHMMSS"型の日付文字列をdatetimeに変換する](https://qiita.com/Masutani/items/32d24b93c1e176f07a9a)
中国でのGFW&VPN事情

# はじめに

中国に滞在する機会があったので，VPNの接続可否を少し検証してみました．なお，商用サービスは利用していないので分かりません．

後半ではShadowSocksの環境構築と，Google BBRによる高速化についてまとめておきます．

# VPN事情@北京，2018年12月

とりあえず出発前に自前のサーバで，L2TP/IPSec, SoftetherVPN, ShadowSocksの3つを用意していきました．SoftetherVPNはOpenVPN互換機能があり，AndroidからはOpenVPNのプロトコルで接続できます．

**使えたプロトコル**

* SoftetherVPN (port: 443)
* ShadowSocks (port: 443, 993, 1212)

**ブロックされたプロトコル**

* L2TP/IPSec (port: default)
* OpenVPN (Port: 443)

試したところ，サーバ側のPortはあまり関係ないようなので，Over SSLのプロトコルだからといってSSL関連のPortに拘る必要はないようです．
SoftetherVPN と ShadowSocks を比較するとShadowSocks のほうが圧倒的に快適です．ただし私の環境では，SoftetherVPNを使用した場合とShadowSocksを使用した場合で，Globalに出ていくまでのネットワーク構成が異なるので，純粋なプロトコルの比較ではありません．

AndroidのスマートフォンはShadowSocksによってほぼ常時VPNを張り続けた状態でしたが，非常に安定して使えました．

## その後
AWSで固定のIP/Portを使ってShadowSocksを運用し，スマートフォンからほぼ常時接続していたのですが，1か月ほどたったところで繋がらなくなりました．このPortでNginxを走らせてもTimeoutしますし，GFWで規制されたっぽい？ちなみに同じIPの他のPortは繋がります．

# ShadowSocksの構築

## Server

個人的にはAmazonのLightsailが楽でした．最小構成で 3.5ドル/月 です．インスタンスを破棄することでグローバルIPを変更できるのも嬉しい点です．(ただし個人で使っている限りはGFWによってIPがブロックされることはないようです？) もちろんEC2などでも良いと思いますが，Lightsailはトラヒックに関しても基本的に定額なので安心です．

dockerを使うと一瞬でShadowSocksのサーバを立てることができます．インスタンスの起動スクリプトでDockerを導入しておきます．

```:起動スクリプト
curl -fsSL https://get.docker.com/ | sh
usermod -aG docker ubuntu
```

こちら (https://hub.docker.com/r/shadowsocks/shadowsocks-libev/) を参考にShadowSocksを起動します．
最低限必要なのは，PASSWORDとPORTです．またMETHODで暗号化方式を指定できます．**ここで指定したportに対して外からアクセスできるようにLightsailの管理画面からFWの設定を変更する必要があります．**

```
$ docker run -e PASSWORD=PASSWORD -e METHOD=chacha20-ietf-poly1305 -p PORT:8388 -p PORT:8388/udp -d shadowsocks/shadowsocks-libev
```

## Client

For Windows: https://github.com/shadowsocks/shadowsocks-windows
For Android: https://play.google.com/store/apps/details?id=com.github.shadowsocks
Others: https://shadowsocks.org/en/download/clients.html


## Google BBR

BBRはGoogleが開発しているTCPの輻輳制御アルゴリズムです．特に通信が不安定な状況で効率化が期待できるらしく，中国<=>日本などは特に効果が期待できそうなので導入してみました．
導入はこちらのスクリプトを使用すると簡単でした(**要再起動**)．たぶん信頼して大丈夫だと思います: 
https://raw.githubusercontent.com/teddysun/across/master/bbr.sh



### BBRの効果

AWS Lightsail@TOKYO に2つのインスタンスを立ててほぼ同時刻に切り替えながら速度計測をしてみました．接続元の回線はChina Telecom で，計測には https://fast.com を使用しました (下り5回平均)． (Server: ubuntu 16.04, 512MB, Client: shadowsocks-windows)

* ShadowSocks w/o BBR: 10.8 MBps
* ShadowSocks w/ BBR: 39.2 MBps
* (No VPN: 1.6 MBps)

圧倒的に高速化されました!!
VPNを接続しない場合が激遅ですが，これはfast.comがNetflixによって運営されている計測サービスでSeattleにあるサーバに接続しているから，ですかね？ちょっと納得いかないですけど...
DevTools tips — day 9: コンソールで時間を計る

この記事は[Tomek Sułkowski](https://medium.com/@tomsu)さんによる
フロントエンドエンジニア向けアドベントカレンダーの翻訳記事です。
とても勉強になったので許可を得て翻訳させていただきました。元記事は[こちら](https://medium.com/@tomsu/devtools-tips-day-8-timing-the-console-19c7bef9325d)。
 
---

*休暇まであと24日です。私はこれからDevToolをより効果的に、そしてもっと楽しく使うためのコツを紹介する短い記事を書いていきたいと思います。[昨日](https://qiita.com/rena_m/items/1c902079cc2c4ccf14a3)は万能color pickerで遊びました。今日は時間を扱う2つのちょっとしたコツをご紹介します。*

# 26. ログのタイムスタンプ
アプリケーションで特定のイベントが起きた正確な時間の記録をとりたいときはタイムスタンプをオンにしましょう。*Settings*の画面(開発者ツールの`⋮`ドロップボタンか`F1`を押すことでアクセスできます)か[Commands Menu](https://qiita.com/rena_m/items/31c11def5a83676f482f)から変更できます。
![16.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/62d2b944-91fa-78b4-0bbe-98777a6f636e.gif)

# 27. 実行時間を測定する
全てのタイムスタンプを表示するのではなく、スクリプトのある場所からある場所までにかかる時間を知りたいかもしれませんね。

そういう場合には、便利なコンソールメソッドを組み合わせて活用すると良いでしょう。

- `console.time()` — タイマーを起動する
- `console.timeEnd()` — タイムの計測をやめ、結果をコンソールに表示する
同時に複数のタイムを計りたい場合には、異なるラベルをメソッドに与えてください。(例：`console.time('loading')`、 `console.timeEnd('loading')`)

![17.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/8b10048a-69e6-b96f-129e-2fca5f8e64ad.gif)

---

いつも通り、**なにか新しいことを学べたらぜひ**
→ もっと多くの人の目に止まるように**拍手👏ボタンをお願いします！**
→ 他の投稿も見逃さないように**[Twitter (@sulco)をフォロー](https://twitter.com/sulco)**してください！
ローカルで作成したgit repoをあとからgithubに

https://qiita.com/ka2uk/items/461736b0d0e4efd5d307

まさにこの記事の通りです！

誰かに、リモートのクローンしたリポジトリーじゃないと、
プッシュできないよ　みたいなことを教わりましたが、
このコマンドでマージすればたぶんできますね！

git merge --allow-unrelated-histories origin/master

gitは奥が深い。

まだ、ヒヨッコでソースツリー使ってる僕からすると、
経験不足を感じますねー。
Nutanix導入とともに運用改善を

# はじめに
この記事は[Nutanix Advent Calendar 2018(1枚目)](https://adventar.org/calendars/3014)、12月23日分です。
私はSIerで運用エンジニアをしている(はず)のですが、古くさい運用とNutanixってあわないよなぁ、思い。逆に古くさい運用に悩んでいる方は、やり方によっては、Nutanix導入をきっかけにいろいろと改善できるよなぁ、と思いこの記事を書きました。うちの環境も、もっともっと改善をしていきたいなぁ。
なお私は、将来的にはわかりませんが、今のところNutanixを販売する側の人間ではありません！

[Nutanix Advent Calendar 2018(1枚目)](https://adventar.org/calendars/3014)
[Nutanix Advent Calendar 2018(2枚目)](https://adventar.org/calendars/3174)
[Nutanix Advent Calendar 2018(Frame版)](https://adventar.org/calendars/3239)

# こんなところが合わない＝変えられるかも
## 手順書運用が変えられるかも。
運用の現場では、WordやExcel(これ表計算ソフトなのにね)などを利用し、画面ショット付きのボリューミーな運用手順書を用意するところがほとんどではないでしょうか。
そんな現場の大敵が、**UIの変更**です。Nutanixまったく関係ありませんが、vSphere Classic Clientの廃止に伴い、連日夜中まで残って、全ての運用手順書をvSphere Web Client向けに書き換えたのは苦い思い出です。そしてHTML5 Client…

変化を嫌う方々は、人型アイコンがクビになる・手順書のアイコンが変わっている・英語だったものが翻訳されている・新しい項目が増えている、というのに非常に敏感であり、そういった方々に合わせてAOSのバージョンアップのたびに、手順書の(主にスクリーンショット)を差し替えるのは大変な労力がかかります。
PrismのインターフェースはUIこそころころ変わるものの直感的で非常に使いやすいため、少数のエンジニアで大量のノードを管理することができます。ボリューミーな手順書を作るのに膨大な工数をかけるのはやめにしませんか。
定型作業をボリューミーな手順書とともにオペレータに移管するのではなく、CLIやPowerShell、REST APIを利用して自動化をする仕組み作りに工数を費やしてはいかがでしょう。
**これで楽ができるかもしれません！！**

## 縦割りの組織見直し
運用の現場では、例えばサーバーチーム、ネットワークチーム、DBAチーム、ストレージチーム、VMチーム、などと組織が細分化されているところもあるかと思います。
そういったところで、とあるプロジェクトで仮想マシンを作る場合
1.領域の払い出し　→　ストレージチーム
2.IPアドレスの払い出し　→　ネットワークチーム
3.仮想マシンの払い出し　→　VMチーム
4.サーバー構築　→　サーバーチーム
といった流れを踏むのではないでしょうか？これ、Nutanixで全部できますよね。
Calmなどで自動化を作り込み、Self Service Portalを利用すれば1～4はすべてサーバーチームでできますし、Nutanixの管理チームは仕事が減り、自動化の仕組みのメンテと基盤自体の管理だけで済むのではないでしょうか。
**これで楽ができるかもしれません！！**

## 某DBなどめんどくさいライセンス
[昨年のAdvent Calendar](https://qiita.com/hage_bowz/items/927090178db2918dccba)でも言及したことではありますが、2ソケットモデルが多いことと、CVMがある程度のリソース予約をすることから、ソケット課金のソフトウェア、Hypervisorのコア課金のライセンスとNutanix(というよりエージェントVMなどが稼働するHCI)の相性は、非常に悪いです。反面、そもそもライセンス費用がかからない一部のLinuxや、インスタンス単位や同時接続ユーザー単位のライセンスであるVDI環境などは非常に相性が良いのですが。

それはさておき。某データーベースで有名なソフトウェアベンダーさん製品のソフトウェアを購入する際などに「ライブマイグレーションができるから、Hypervisor全台分のCPUライセンスを買え！」という恐ろしいことを言われたことのある方々はいらっしゃいますか。私が言われた訳ではありませんが、私の職場でもそんなことがあったようです。
もっとも、これ、単なるセールストークで実際は「絶対にライブマイグレーションさせません」という紳士協定を結び、「必要なソケット分のライセンス価格で、存在するHypervisorのソケット数分のライセンスを購入する」みたいな感じらしいのですが、非常に労力がかかると聞いています。
そんな面倒くさい製品を動かすのに、相性の悪いNutanixを利用すると、更にややこしくなりまえせんか？いえいえ。
NutanixクラスタはHypervisorが異なっても構成できます。
メインは既存と同様のvSphereやHyper-VにしNutanixクラスタのホストを2,3台だけAHVにしてはかがでしょう。そして専用環境として、面倒くさいライセンスのサーバーを動かすのはいかがでしょう。AHVは2,3台しかありませんので、営業さんと面倒な紳士協定を結ぶ必要がなくならないでしょうか。
**これで楽ができるかもしれません！！**


# おわりに
実名は伏せさせていただきますが、日頃よりお世話になっておりますNutanix社の担当営業およびSEの方々や丁寧に回答をいただけるサポートの方、さまざまな支援をくださる販社の皆さま、技術情報を発信されている方々に敬意を表するとともに、心より御礼申し上げます。ありがとうございます！今後ともよろしくお願いします。

# 蛇足
Nutanix社の~~1株~~株主になりました。(このネタをやるためだけに株を買いました)
ちなみに評価損のほとんどは買い付け手数料です。
![kabu.png](https://qiita-image-store.s3.amazonaws.com/0/195654/33e86e8a-c6d5-cb50-6d3b-a472aa690d55.png)
離散数学 応用情報技術者試験 対策日記@1

#離散数学ってなに？
離散数学とはとびとびの数字を扱う数学の分野。
コンピュータは0と1の2種類の数字で全てを表現してるから、離散数学によってデータを処理しています。　・・・ふーん。以下用語の整理。

**基数** n進数におけるnのこと。
**正規化** ある形式に従って数値を変換すること。
**固定小数点数表現** 小数点と数字だけで小数を表現する方法
**浮動小数点数表現** 固定小数点数表現と基数のべき乗で小数を表現する方法

### 1-1 補数
補数とは！ 足したときに位が上がる最も小さい数。
つまり2桁の10進数では15の補数は85、33の補数は67ということ。
同じ様に、6桁の2進数では001111の補数は110001、100001の補数は011110となる。
(足し算をすると100000000になる数字)
**2進数の補数は1を0に、0を1に反転させたものに1を足すと求められる!**

33-15=18の計算をするときに、2進数の補数を使って
 100001 - 001111 
= 100001 + (-001111)
= 100001 + 110001 - 1000000 (引く数の補数を足して、溢れた7桁目の1を消去)
= 100010
っていう風に計算してるんやって。

つまり、補数は引き算とか負の数を表すときに使う！！

### 1-2 誤差
**桁落ち** 近い二数の和を求めることにより有効桁数が減るために生じる誤差
**情報落ち** 極めて小さい数の加減が反映されないために生じる誤差
**丸め誤差** 切り捨てや四捨五入により小さな桁を削除するために生じる誤差
**打ち切り誤差** 無限級数の計算を途中で打ち切ることにより生じる誤差
**オーバフロー** 演算結果が有限の桁内で表現できなくなること
**アンダーフロー** 浮動小数にて指数部が小さくなりすぎて表現できなくなること

### 1-3 論理和と論理積
**論理和(OR)** 
各ビットごとに、どちらか一方が1なら1とする。
例) 1001 OR 0100 = 1101

**論理積(AND)**
各ビットごとに、両方が1なら1とする。
例) 1001 AND 0101 = 0001

**排他的論理和(XOR)**
各ビットごとに、どちらか一方が1なら1とする。
例) 1001 XOR 0101 = 1100

------
[ホームへ](https://qiita.com/k-y/items/dc2c9a3a8425712253e8)
SceneKitのSCNMaterialのpropertyを動的に変えて確認してみる

AppEngineというブログで、materialについて詳しく解説されていてとても分かりやすいです。

- http://appleengine.hatenablog.com/entry/2017/07/19/192726
- http://appleengine.hatenablog.com/entry/2017/07/20/202216

ですが、実際にどこをどう変えたら、どういう見た目になるのか、よくイメージできなかったので、サンプルを作ってみました。

# 作ったもの

|Lightning Model調整|Material Property調整|Intesity調整|
|:--:|:--:|:--:|
|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/lightning_model.gif" width=140>|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/material_property.gif" width=140>|<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/intensity.gif" width=140>|

https://github.com/kboy-silvergym/ARKit-Emperor のMaterial

それぞれ紹介していきます。

# Lightning Model調整
<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/lightning_model.gif" width=140>

ライティングモデルを変更すると、光の処理の仕方が変わるので、反射の様子などが変わります。

種類は、

- Constant
- Lambert
- Blinn
- Phong
- Physically Based

があります。

# Material Property調整
<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/material_property.gif" width=140>

物体の質感を変更するためのPropertyが色々あります。

- Diffuse
- Specular(Constant以外にある)
- Normal(ConstantとLambert以外にある)
- Reflective
- Transparent
- AmbientOcclusion
- SelfIllumination
- Emission
- Multiply
- Ambient
- Displacement
- Metalness(Physically Basedだけある)
- Roughness(Physically Basedだけある)

# Intesity調整
<img src="https://github.com/kboy-silvergym/ARKit-Emperor/raw/master/images/intensity.gif" width=140>

それぞれのPropertyの強度を0~1で調節できます。ただし、NormalとEmissionには強度の概念はないようなので、変更しても何も変わりません。

# まとめ
- 色を変えるためのpropertyはdiffuseだけじゃない
- Lightning Model, Material Property, Intensityなどを調整して質感が変えられる
ログインせずにお気に入り機能を実装するための考察

ログインせずにお気に入り機能を実装するための考察をしてみたのでまとめ。

## 簡単仕様比較

| 名前 | Cookie | Session | sessionStorage | localStorage |
| --- | --- | --- | --- | --- |
| 有効期限 | 指定可能 | 削除操作をするまで | ブラウザを開いている間 | 削除操作をするまで |
| 容量 | 4KB | 実装による | 5MB-(ブラウザによる) | 5MB-(ブラウザによる) |

## 仕様まとめ
###  Cookie
https://ja.wikipedia.org/wiki/HTTP_cookie

#### 概要
RFC 6265などで定義されたHTTPにおけるウェブサーバとウェブブラウザ間で状態を管理する通信プロトコル、またそこで用いられるウェブブラウザに保存された情報のことを指す。ユーザ識別やセッション管理を実現する目的などに利用される。(by wikipedia)

#### セキリティ面

- セッションハイジャック
- トラッキング・クッキー

らへんが一般的。


### Session
#### 概要

ログインしてログアウトするまでの一連の動作や時間のことで、
サーバサイドで情報を扱いたい時に、識別できるidなどの要素だけを保存して該当の操作が終了する段階で削除するのが一般的。

#### セキリティ面
- セッションハイジャック
-  セッション固定攻撃


### Web storage
https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API

#### 概要
Cookie を使用するよりも直感的な方法で、ブラウザがキーと値のペアを保存できる仕組み。
sessionStorageとlocalStorageの2 種類で、仕様はそれぞれこんな感じです。

- sessionStorage
  - ページのセッション中 (ページの再読み込みや復元を含む、ブラウザを開いている間) に使用可能な、生成元ごとに区切られた保存領域を管理します。
- localStorage
  - 上記に加えて、ブラウザを閉じたり再び開いたりしても持続します。

#### セキリティ面

該当サービスにてアカウントの乗っ取りをされた場合に、挙動を変更されてしまう。

ユーザAとしてローカルストレージを用いた機能操作をした際に、ユーザBとして振る舞うことができる。

のでアカウントが乗っ取られても問題ない範囲で使う。

## ここまでで一旦個人的な理解を整理すると
- webStorage
  - クライアント側だけでデータをちょっと持っておきたい場合は、これ一択。
- cookie 
  - ユーザを識別してなんらかの事象を保持しておきたい時に使うが基本稀。 
- セッション
  - ある一定の一連の流れでだけ使いたい場合に最適。
- まとめ
  - 基本的には、全ての操作は乗っ取られても問題ない情報しか載せない。


## 実装に入る
今回自分がやりたかったこと的には、webStorageのlocalStorageかなと思いその用途だけ確認。

と思ったらかなりまとまってるページがあったのでこれでいいかな。
https://dev.classmethod.jp/references/webstrorage_favorite-condition/

## 終わり
これから実用段階で使ってみて問題なければlocalStorage使ってみようと思います。
AWS Lambda error : Unable to import module 'index'

# AWS Lambda error : Unable to import module 'index'

多くの場合、node_modulesにコードが利用したいモジュールが入っていないことでUnable to import module 'blah blah'といったエラーがでます。

コード例：

```javascript
//index.js
let hoge = require('Hoge')
```

エラー例：

```
Unable to import module 'Hoge': Error
```





***しかし `module 'index'`とは！***



この場合は、次の理由が考えられます。

**LambdaにアップロードするZIPファイルの問題**



これは私の場合ubuntu環境からWindows環境に移したときに起きました。





わたしのubuntuでフツーに使用している`package.json`、それを以下のように書いて、

`npm run deploy`

のコマンドで一発でLambdaにアップロードできるようにしているのですが、

```json
//package.json
・・・前略・・・
  "scripts": {
"deploy": "aws lambda update-function-code --function-name arn:aws:lambda:ap-northeast-1:012334455667:function:auto_Hoge --zip-file fileb://Lambda-Deployment.zip",
"predeploy": "zip -r Lambda-Deployment.zip * -x *.zip *.json *.log"
},
・・・後略・・・
```

問題なのはこの中の、`"predeploy":` に記述してあるコマンド。

`zip -r Lambda-Deployment.zip * -x *.zip *.json *.log`





この部分、**ZIPコマンドはWindowsでは使えない**ということで、[Windowsのコマンドプロンプトでzipコマンドを使用可能にする方法](https://qiita.com/Shi-nakaya/items/83d2b2e2b34b897d3df8)を参考にして使用可能にしました。それでZIP化するようにして`npm run deploy`でLambdaにアップロードし実行したところ、`Unable to import module 'index'`エラーが出て使い物になりませんでした。
（ZIPが問題だとわかるまで長い長い道程でした・・・人生とは遠き道程を歩くがごとし。徳川家康）


そのZIP化したファイルの中を覗いてみても、特におかしなところはなさそうです。




ちなみに、PowerShellのCompress-Archiveでなんとかしようと思いましたが、さらに迷宮入りしました。

### Windowsだと、右クリックでZIP化してAWSコンソール画面から手動アップロードするしかないのが現状です。
[MacOS Mojave]mysql2のbundle installに失敗してハマった件

Railsアプリを作る際、mysql指定でやってみたら思いの外ハマってしまったので、解決した時の事をメモしておく。
結論を書いておくと、Mojave用のmacOS SDK headerを追加インストールしたら解決した。

# 環境
Mac OSX Mojave 10.14.1
Ruby 2.5.3

# やったこと
```
rails new hogeapp -d mysql
```

# おきたこと
```
Installing mysql2 0.5.2 with native extensions

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/user_name/Programs/web/foobar-repo/vendor/bundle/ruby/2.5.3/gems/mysql2-0.5.2/ext/mysql2
/Users/user_name/.rbenv/versions/2.5.3/bin/ruby -r (以下略)
```
どうやらmysql2のビルドに失敗している模様。

# 試したこと
### ``$ xcode-select --install``

```
$ xcode-select --install                                          
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```
もう入ってた。

### ビルド時のパス追加

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```
事象変わらず。

### Mojave用のmacOS SDK header追加(これで解決)

```
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```
上記コマンドでSDK headerを追加インストールした後、``$ bundle install``したら解決した。
``$ xcode-select --version``でコマンドラインツールのバージョンを見てみたら2354だったのだけど、このバージョンでpythonインストールに苦戦してた方の[記事](https://qiita.com/zreactor/items/c3fd04417e0d61af0afe)に助けられた。

SierraあたりからOSXのバージョンアップの度に環境問題起きている気がする。
c++でatomic

#概要
C++でatomicを使って、threadを止めてみた。

#サンプルコード


```
#include <iostream>
#include <atomic>
#include <thread>
#include <iostream>
#include <unistd.h>
using namespace std;

std::atomic<bool> flag(false);
void run() 
{
    while(!flag)
    {
        std::cout << flag << std::endl;
    }
}
int main(int argc, char const * argv[]) 
{
    std::cout << "start" << std::endl;
    std::thread th(run);
    sleep(0.1);
    flag = true;
    th.join();
    std::cout << "end" << std::endl;
    return 0;
}



```

#成果物

https://paiza.io/projects/WL8ZfkRe1Qyl7CLCSF9Z-g


以上。
Jupyter でPythonモジュールを作成・インポートするときに気を付けること

**Juputerでのモジュール作成・インポートで1時間くらいハマったのでメモ。**
---
1. ipynbはモジュールとして認識されない！
2. 元のipynbファイルと同じ名前でpyファイルを作成すると干渉してimportに失敗する！

#対処法
１．「File」→「Download as」から.py形式でモジュールを保存。
２．pyファイルの名前がipynbの名前と被らないように変更する。
php-master-changes 2018-12-22

今日は zend_vm_gen.php の出力書式調整、アンシリアライズされた空の ArrayObject へのプロパティ追加で SEGV が起きる問題の修正があった！

# 2018-12-22
## dstogov: Removed /e modifirer and fixed ws.
- https://github.com/php/php-src/commit/8db63adb6df9727962f1f0498389f841866654a1
- [7.2~]
- zend_vm_gen.php で正規表現の e 修飾子を削除、出力に改行を追加

## dstogov: Fixed ws
- https://github.com/php/php-src/commit/6ccdb904ae9a75f713cb0b056d273e786bcd5e79
- zend_vm_gen.php で出力の改行を 1 つ削除

## jhdxr: Fix [#77298](https://bugs.php.net/bug.php?id=77298): segfault occurs when add property to unserialized empty ArrayObject
- https://github.com/php/php-src/commit/b15189f4d8af396cc5731a7b7eaeb0791cf0bced
- [7.3~]
- ext/spl で、アンシリアライズされた空の ArrayObject にプロパティを追加する際、SEGV が起きる問題の修正
EOS dapp ハッキング事件と解説

## 事件内容
12月18日の夜から19日の早朝まで、複数の EOS トップ DApp が攻撃されました。
EOSMax、ToBet、BigGame、および BetDice がトランザクションロールバック攻撃を受け、それぞれ 55,000 EOS、22000 EOS、14903.18 EOS、および 200000 EOS を失いました。
さらに、ハッカーはリプレイ攻撃の脆弱性を悪用してクイズゲーム TRUSTBET を攻撃し、11501 EOS を得ています。
現在 EOS の価格は 18 中国元で計算すると、合計約 546 万中国元の 303404.18 EOS 失いました。

ハッカーは攻撃で得た EOS を ２０００ 程度のアカウントを作って送金しようとしているので、追跡対応が難航しています。

参考リンク

- [500万程度のハッキング事件の始末は？(席卷EOS游戏超500万元黑客攻击，究竟是怎么回事？)](http://qianba.com/4917.html)
- [EOS DApp ハッキング解析　トランザクション拒否によるなりすまし攻撃(原创| EOS DApp 攻击解析之利用交易未上链进行欺骗攻击)](https://eos.live/detail/19215)
- [EOS DApp ハッキング解析　ブラックリストによるなりまし攻撃(原创| EOS DApp 攻击重现之利用黑名单账号进行欺骗攻击
)](https://eos.live/detail/19255)

## 事件分析
事件が起きたあと、いくつの分析が出ていましたが、 `Jerry@EOS LIVE`さんが `ToBet` のコントラクトを使って実際の動きを再現できたので、事実と一番近いじゃないかと思われます。再現手順は [EOS DApp ハッキング解析　ブラックリストによるなりまし攻撃(原创| EOS DApp 攻击重现之利用黑名单账号进行欺骗攻击
)](https://eos.live/detail/19255) でまとめられています。

攻撃が成り立つのは、下記の前提があります

> - API ノードには、ブラックリスト機能が動いていない、かつ、デフォルトの `SPECULATIVE` モードで実行している
> - ゲームコントラクトの実装は
>     - トランザクションがロールバックする時、次のトランザクションはロールバックされたトランザクション同じ結果になる
>     - ゲーム結果に従って賞金を送金する処理が非同期アクションで行っている、かつ、元のトランザクションと関連していない

## 攻撃流れ
[EOS DApp ハッキング解析　ブラックリストによるなりまし攻撃(原创| EOS DApp 攻击重现之利用黑名单账号进行欺骗攻击
)](https://eos.live/detail/19255)　の再現手順を参考し、アカウント名は下記としています。

|アカウント名|説明                    |
|--------|------------------------|
|attack  |攻撃処理が仕込んでいるコントラクト|
|blacklist|ブラックリストに入っているアカウント|
|tobetioadmin|攻撃ターゲットのゲームコントラクト|

攻撃の流れは下記になっています

- 攻撃者は API ノードに対して `attack` コントラクトで、 `blacklist` アカウントの権限で `tobetioadmin` に `EOS` を送金トランザクションを送信する
- ゲームコントラクトが送金を受けるとゲームをプレイする
- プレイヤーが勝つと、非同期アクションで `EOS` を `attack` アカウントに返金する
- BP ノードが送金トランザクションを受けた時、`blacklist` アカウントがブラックリストに入っているのでトランザクションを拒否したため、トランザクションがロールバックされる

結果的に、`attack` アカウントからの送金がロールバックされたにも関わらず賞金がもらってしまいました

## シーケンス図
![Screen Shot 2018-12-23 at 16.04.34.png](https://qiita-image-store.s3.amazonaws.com/0/4777/f1159e9c-e59d-eb8e-30a5-11f9d6fa356f.png)

## 対策
- API ノード側
    - 実行のモードをちゃんと意識して、dapp 側に明示的に提示しておくほうが良い
- dapp 側
    - 非同期アクションで処理を実行するときに、必要がある場合は、元のトランザクションと関連させて、元のトランザクションのステータスをちゃんと確認する

## まとめ
BP 以外のノードでは、dapp 側のリクエストに対するレスポンスを早くするため、デフォルトのモードでは、トランザクションのリクエストを受けたら、ステートデータを更新するようにしています。
EOS は、このように、パフォーマンスのためいろいろ工夫していますが、気をつけないと膨大な被害が受けてしまいました。

この辺の実装の詳細と影響範囲は、もっと公式なドキュメントなどで dapp 開発者に告知してほしいですね。
NetBSD kernelのcompilation databaseを生成する

![Peek 2018-12-23 16-49.gif](https://qiita-image-store.s3.amazonaws.com/0/167409/744421a3-26f2-50ca-a59f-46fcc9fec6a4.gif)
[English](https://dev.to/wataash/create-compilation-database-compilecommandsjson-for-netbsd-kernel-source-3c3n)

NetBSD kernelのソース (`netbsd-src/sys/`) の構造は単純ではなく、cscopeなどの静的ソース解析ツールで正確なコードジャンプを行うのは不可能です。例えば、`<machine/endian.h>` は

- `sys/arch/hpc/stand/include/machine/endian.h` ではなく
- `sys/arch/hpcmips/stand/include/machine/endian.h` でもなく
- `${OBJDIR}/sys/arch/amd64/compile/GENERIC/machine/endian.h` にある

なんてことはcscopeには分かりません。コンパイルが `${OBJDIR}/sys/arch/amd64/compile/GENERIC` で `-I.` フラッグと共に行われたなんてことはケアしないわけです。

正確なコードジャンプを行うには、コンパイル時の情報が必要になってきます。その1つの手法が[compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html) (`compile_commands.json`) です。

Linux (Ubuntu 18.04) 上ではこんな感じに作れました：
（近いうちにNetBSD、macOS上での生成手順も載せる予定です。ほぼ一緒ですが、NetBSDでは[bearのissue](https://github.com/rizsotto/Bear/issues/212)に当たるかもしれません。[scan-build](https://github.com/rizsotto/scan-build)だと回避できた記憶があります。macOSはリンク時に警告が出ます。）

```sh
# https://github.com/rizsotto/Bear/
sudo apt install bear

cd netbsd-src/

# First, create ${OBJDIR}/sys/arch/amd64/compile/GENERIC/Makefile
# and confirm that the kernel can be built
./build.sh kernel=GENERIC

cd ${OBJDIR}/sys/arch/amd64/compile/GENERIC/
${TOOLDIR}/bin/nbmake-amd64 clean
bear ${TOOLDIR}/bin/nbmake-amd64 -j3         # creates compile_commands.json
mv compile_commands.json ${NETBSD-SRC}/sys/  # optional
```

Compilation databaseをサポートするお好みのエディタでソースを開いてみます。vimだと[YouCompleteMe](https://github.com/Valloric/YouCompleteMe#c-family-semantic-completion)などのプラグインを使えばOKで、CLionは[マニュアル](https://www.jetbrains.com/help/clion/compilation-database.html)に従えばOKです。この記事ではCLionを使っています。開くと `cc` のエラーが出るかもしれません：

```
Compiler exited with error code 1: /usr/bin/cc -xc -c -mcmodel=kernel (snip) -v -dD -E
    Using built-in specs.
    (snip)
    End of search list.
    cc1: error: code model kernel does not support PIC mode
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/167409/aba7814e-7157-603e-94f9-4507b3a03d35.png)
エディタは `compile_commands.json` に従って `/usr/bin/cc` を実行しますが、`${TOOLDIR}/bin/x86_64--netbsd-gcc[--<target>]` であるべきです。`compile_commands.json` を書き替えます：

```sh
cp compile_commands.json compile_commands.json.bak
sed -i s!'"cc",'!'"/home/wsh/src/netbsd/tools/bin/x86_64--netbsd-gcc",'!g compile_commands.json
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/167409/c9d37160-1359-8671-4784-b3935f452ec1.png)
正常に読み込めました。これで冒頭のGIF動画のようにサクサクコードジャンプできるはずです。

## ライセンス

<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">クリエイティブ・コモンズ 表示 4.0 国際 ライセンス</a>の下に提供されています。

関連するソフトウェアの公式ドキュメントのメンテナの方へ：この記事の内容を公式ドキュメントに記載して頂ける場合、この記事にコメントして頂くか、twitter [@wata_ash](https://twitter.com/wata_ash) にご連絡下さい。
【MATLAB】警告の有無で処理を分岐させたい場合

Matlabの実行時に警告が出た際に別の処理をしたいと思ったが、
普通の例外処理（try、catch）はエラーのみにしか使えない。

例えば、addpathコマンドを使用して検索フォルダに任意の
パスを追加する場合、記載したパスがそもそも存在しなかった
ケースを検知して別の処理に移行したい。

そこで、警告が出たことを別の方法で検知しようと考えた。

[方法]

latwarn（最後に出た警告内容）を利用

[詳細]

```matlab

clear all; % ワークスペースからアイテムを削除

lastwarn(''); % 最後に出た警告の内容をリセット

crnt = pwd; % カレントフォルダを格納

% 以下フォルダを検索対象に追加
addpath(strcat(crnt, 'folder_A'));
addpath(strcat(crnt, 'folder_B'));
addpath(strcat(crnt, 'folder_C'));

[msg, msgID] = lastwarn; % 最後に出た警告の内容を格納

if strcmp(msgID, 'MATLAB:dispatcher:pathWarning')

　　% 警告が出た時に実施したい処理を記述

else

　　% 警告が出なかった時に実施したい処理を記述

end
```
RGB値だけでは色は1つに定まらない

記事の内容はこちらを参照してください。
https://mishimay.github.io/e1e2f536068c3dafd01c/
<!--


## TL;DR
色を一意に決めるには**RGB値**と**RGB色空間[^a]**の両方の指定が必要。

## RGB色空間とは 
テレビやスマホのディスプレイは人間が見ることのできるすべての色を表現することはできません。
人間が見ることのできるすべての色のうち、特定の範囲に限定されたRGB色空間がいくつも定義されています (e.g. sRGB, Adobe RGB, Display P3)。
RGB色空間の定義は例えばディスプレイの性能を表す際に使われます。

> iPhone SE - 技術仕様
> ディスプレイ
> フルsRGB規格
https://support.apple.com/kb/SP738?viewlocale=ja_JP&locale=ko_KR

以下のような図[^c]をCIE色度図と言い、色の塗られている範囲が人が見ることのできるすべての色の範囲を表しています。
三角形で表された範囲がさまざまに定義されたRGB色空間です。
![Image.jpg](https://qiita-image-store.s3.amazonaws.com/0/23679/653d60ef-6baf-442a-cacf-a5a7e88608ce.jpeg)


## RGB値（カラーコード）とは
RGB値とは、それぞれのRGB色空間の中における特定の色が(赤, 緑, 青)の要素をどれだけ含んでいるかを表したものです。
通常各要素は0から255の範囲で記述されると思います。
ここで注意が必要なのは、**同じRGB値でもRGB色空間が違えば違う色を指す**ということです。
CIE色度図を見ると、例えば三角形の上側の頂点が (R:0, G:255, B:0) を指しますが、RGB色空間によってその値が示す緑色が大きく違っていることが分かります。


## Digital Color Meterで実験
macOSには標準で Digital Color Meter というアプリケーションが入っています。
これを使うと画面上に表示されている色を調べられるのですが、このとき各種RGB色空間とそのRGB値が何であるか見ることができます。
￼
<img width="374" alt="Screen Shot 2018-12-23 at 14.57.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/23679/4a1370eb-f55a-e46c-6ea9-0b740925ae33.png">
<img width="374" alt="Screen Shot 2018-12-23 at 14.58.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/23679/e263e3e3-94e9-4ed0-0587-6da5721e03b4.png">
<img width="374" alt="Screen Shot 2018-12-23 at 14.57.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/23679/cab21bc4-7690-5821-c3d1-9a8e1217d4aa.png">

同じ色でもRGB色空間によってRGB値が違うことが分かります。

## 実務における注意点
デザイナーさんからもらったデザイン指示書にRGB値が書かれていた場合、それをそのままコーディングするのではなく、何のRGB色空間かも合わせて確認する必要があります。

また、コーディングする際はRGB値がどのRGB色空間上で指定されるのかを確認する必要があります。
たとえば、iOSのUIColorクラスには `init(displayP3Red:green:blue:alpha:)` というイニシャライザーがあり[^b] Display P3 空間でRGB値を指定したい場合はこちらを使用します。

受け取ったRGB色空間とコーディングの際に使用するRGB色空間が違うときは、RGB値を適宜変換する必要があります。

## 参考にした書籍

色についての基本的な知識はこちらの本から得ました。
分かりやすく深い知識が得られるのでおすすめです。
[色彩心理学入門―ニュートンとゲーテの流れを追って](https://www.amazon.co.jp/dp/4121011694)


[^a]: 「RGB色空間」という表現は英語版Wikipediaを参考にしました。
  > sRGB (standard Red Green Blue) is an RGB color space that HP and Microsoft created cooperatively in 1996 to use on monitors, printers, and the Internet.
  https://en.wikipedia.org/wiki/SRGB

[^b]: https://developer.apple.com/documentation/uikit/uicolor/1648568-init

[^c]: https://nikonimglib.com/nvnxi/onlinehelp/ja/nk146000.html




-->
確率論の基礎

# はじめに
AI・機械学習等の機運が高まる昨今、それら文献等では確率を使ったものが頻繁に現れます。これらでは確率論の基本は半ば常識のように用いられています。本記事では確率論の基礎となる事項について簡単にまとめておきたいと思います。
なお、文献によっては記法等異なる場合がありますが、本記事では数学としての確率論の分野で一般的な記法の1つを採用し、記述することにします。

# 確率空間
何といっても、まず確率を考える対象として確率空間を定めなければ先に進みません。
確率空間とは、集合 $\Omega$、$\Omega$ の $\sigma$-加法族 $\mathcal{F}$、$\mathcal{F}$ 上の確率測度 $P$ の3つ組 $(\Omega,\mathcal{F},P)$ のことをいいます。
つまり、$\mathcal{F}$について、

1.  $\emptyset\in\mathcal{F}$,
2.  $A\in\mathcal{F}$ ならば $A^c:=\Omega\setminus A\in\mathcal{F}$,
3.  $A_1,A_2,\cdots\in\mathcal{F}$ ならば、$\bigcup_{j=1}^\infty A_j\in\mathcal{F}$,

が成り立ち、$P$については、

1. $P(\emptyset)=0$, $P(\Omega)=1$,
2. $A_1,A_2,\cdots\in\mathcal{F}$ かつ $A_i\cap A_j=\emptyset~(i\neq j)$ならば、$$P\left(\bigcup_{j=1}^\infty A_j\right)=\sum_{j=1}^\infty P(A_j)$$

が成り立ちます。

# 確率変数
測度論の言葉でいうならば、確率空間上で定義された可測関数のことをいいます。
すなわち、$X\colon\Omega\to\mathbb{R}$ が(実数値)確率変数であるとは、任意の $a\in\mathbb{R}$ に対し、

```math
\begin{align*}
    \{X>a\}:=\{ \omega\in\Omega ~;~ X(\omega)>a \}\in\mathcal{F}
\end{align*}
```

が成り立つことです。
多次元の $\mathbb{R}^d$-値確率変数の場合は、各成分ごとに確率変数であるときをいいます。

#### 一般の確率変数
一般の場合の確率変数は次のように定義されます。
$(S,\mathcal{B})$ を可測空間とするとき、確率変数 $X\colon\Omega\to S$ が $S$-値確率変数であるとは、任意の $A\in\mathcal{B}$ に対し、

```math
\begin{align*}
    \{X\in A\}:=\{\omega\in\Omega~;~X(\omega)\in A\}\in\mathcal{F}
\end{align*}
```
が成り立つことです。

以後、単に確率変数という場合は、実数値確率変数を表すものとします。

#### 例
これまで非常に抽象的なので、例を挙げたいと思います。

1. $(\Omega,\mathcal{F},P)=([0,1),\mathcal{B}([0,1)),\lambda)$ は確率空間で、$X\colon \Omega\ni\omega\mapsto\omega\in [0,1)$ は区間 $[0,1)$ 上の一様分布確率変数です。ただし、$\mathcal{B}([0,1))$ は $[0,1)$ のボレル集合族を表し、$\lambda$ は1次元ルベーグ測度とします。
2. $(\Omega,\mathcal{F},P)$を次のように定義すると、確率空間です。

```math
\begin{align*}
   & \Omega = \{ 0,1 \},\\
   & \mathcal{F} = \{\emptyset, \{0\}, \{1\}, \{0,1\} \},\\
   & P(\{0\})=p, \quad P(\{1\})=q, \quad p,q\geq 0, \quad p+q=1.
\end{align*}
```
確率変数 $X(\omega)=\omega$ とすると、これは、表裏がそれぞれ確率 $p$, $q$ で出るコイントスを表しています。

# 確率変数の分布
確率変数 $X$ に対し、集合関数 $\mathcal{B}(\mathbb{R})\ni A\mapsto P(X\in A)\in [0,1]$ は可測空間 $(\mathbb{R},\mathcal{B}(\mathbb{R}))$ 上の確率測度となります。この確率測度を $X$ の分布といい、 $P_X$ とかきます。

# 期待値
確率変数 $X$ の期待値とは、$X$ の確率測度 $P$ による(ルベーグ式の)積分です。すなわち、確率変数 $X$ の期待値 $E[X]$ は次で定義されます。

```math
\begin{align*}
    E[X] &:= \int X(\omega) P(d\omega).
\end{align*}
```
確率変数 $X$ の分布 $P_X$ を使えば、$$E[X]=\int xP_X(dx)$$とかけます。

ゆえに$X$ が連続型確率分布に従い、確率密度関数を $p(x)$ とするとき、すなわち $X$ の分布 $P_X(dx)=p(x)dx$ であるとき、$$E[X]=\int xp(x)dx$$ となります。

$X$ が離散型確率分布に従う場合、$P_X=\sum_jP(X=a_j)$ であるので、$$E[X]=\sum_j a_jP(X=a_j)$$となります。


# つづく
次回は、条件付き期待値について書きたいと思います。
これも機械学習系の論文なんかでよく見るので押さえたいところです。
GoでAPIをシュッと書く

この記事は <a href="https://qiita.com/advent-calendar/2018/gamewith">GameWith Advent Calendar 2018</a> の２３日目です。Adventも終わりかーと思うともう目の前にはお正月ですね。1年も早いものですね。
今回もGolangです、周りがPHPばかりですが挫けずやっていきましょう。

## 前段

Golang、基本的に社内ではCLIツールを作成するのに使う事が多いのですが個人的な趣味でAPIもGolangで書くことが多いです。
今回はAPIをシュッと書いていこうぜという感じです。

## Framework

Golangの世界では「Frameworkを使わなくてもスリムに書けるぜ」というお話をよくお見かけしますし、たまに使わずに書く事もありますがあるものは使っていきましょう。
私は普段このWebFrameworkを使っています。

* [echo](https://echo.labstack.com/)

他にもGinなど使う事も多いのですがなんだかんだ私はこちらを使うことが多いです。
程よい薄さが良い。といえば良いのでしょうか…？

## Get Starting

ドキュメントは基本的に英語ですがコードがスッキリしているのである程度読めちゃったりします。

```golang
package main

import (
	"net/http"
	"github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello")
	})
	e.Logger.Fatal(e.Start(":8080"))
}
```

実質5行ですね。基本的にVer3以降のechoはほとんど　`net/http` への薄いラッパーです。
実際に `echo.New()` で返却される `Echo` 構造体の中身を見ると [この様](https://github.com/labstack/echo/blob/master/echo.go#L64)になっています。実質 `net/http` では？（錯乱

## Routingを少しちゃんとする

上の例ではMainの中でRouting設定も行っています。ただこれだとRoutingが増えるたびにMainの中身が大きく膨れ上がってしまいます。
なのでこんな感じに。

```golang
package main

import (
    "net/http"
    "github.com/labstack/echo"
)

func main() {
	e := echo.New()
	e.GET("/", hello)
	e.Logger.Fatal(e.Start(":8080"))
}

func hello(c echo.Context) error {
	return c.String(http.StatusOK, "Hello")
}
```

他にも別ファイルに設定を配置するなどの方法がありますが簡単に書くならこんなところでしょうか。

### RoutingRule とか

他のフレームワークにもあるようにPathParameterをいじる事も出来ます。

```golang
func main() {
	e := echo.New()
	e.GET("/:id", hello)
	e.Logger.Fatal(e.Start(":8080"))
}

func hello(c echo.Context) error {
	id := c.Param("id")
	return c.String(http.StatusOK, "Hello "+id)
}
```

他にもGroupの機能が `admin := e.Group("/admin")` の様に設定出来たり
Methodも `GET`, `POST`, `DELETE`, `PUT`のように指定出来ます。必要最低限ですね。

## JSON を返す

これで簡単に文字列を返すところまでいけました。ではAPIらしくJSONでResponseを返しましょう。
基本的にはRequest毎に構造体を宣言する必要があります。

```golang
package main

import (
	"net/http"
	"github.com/labstack/echo"
)

type User struct {
	ID int `json:"id"`
	Name  string `json:"name"`
	Email string `json:"email"`
}

func main() {
	e := echo.New()
	e.GET("/", hello)
	e.Logger.Fatal(e.Start(":8080"))
}

func hello(c echo.Context) error {
	user := &User{
		ID: 100,
		Name: "sample user",
		Email: "sample@test.com",
	}
	return c.JSON(http.StatusOK, user)
}
```

返却時はこんな感じ。

```json
{
    id: 100,
    name: "sample user",
    email: "sample@test.com"
}
```

構造体にアノテーションを付与することで返却時のキーを定義する事が出来ます。簡単ですね。

## 他の機能とか

APIの開発をするとなると共通系のOAuthやLogger、CORSなどが必要だったりします。そんなときはMiddleware機能を利用すると良いです。

```golang
e.Use(middleware.Logger())
e.Use(middleware.CORS())
```

Middlewareは自前で実装することも出来るのでOAuth系の処理なんかをまとめることもできちゃったりします。便利ですね。

## まとめ

もっと書きたい事は沢山あったのですがとりあえずはこんなところで。
【プレゼン】1分で相手を動かす話し方 1 / 2【読書メモ】

伊藤羊一氏の「1分で話せ」を読んでいるところなので、気になった部分をこちらにメモ。
https://www.amazon.co.jp/dp/B07BFNPD6Q/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
※対人で話す場合に必要な要素のみを抜粋


## 人はあなたの話の80%を聞いていない
- 「自分が伝えたいことを話せば、人は聞いてくれる」という前提は捨てる。
- あなたが話した内容の8割を相手は理解していないと考える。

## 8割の話を聞いていない相手を動かすには
- 「1分で話せるように話を組み立て、伝える」  
- 1分なら忙しい人でも聞いてくれる可能性が高い  
**1分にまとまらない話は、結局何時間かけて話しても伝わらない　= どんな話でも1分で伝えることは可能**

## 正しいことを言って人が動くなら、苦労はしない
**必要な要素**
- 左脳と右脳に働きかける
- ロジカルな伝え方
- 熱狂的なマインド

## そのプレゼンのゴールは何か？
- 「誰に、何を、どうしてもらいたいのか」
- 理解してもらうのか、動いてもらうのか、賛成してもらうのか・・・

## その相手とは・・・？
- どういう立場にいるのか
- どんなことに興味があるのか
- どんなことをこのプレゼンに求めているのか
- 専門的な要素についてどのくらい理解できるか
- 何をどんな風に言うとネガティブな反応をするのか

## ピラミッドストラクチャーを意識する
- ピラミッドストラクチャーとは？(http://k-kangaeru.com/pyramidstructure/)
- 話には結論と根拠があり、結論がないと、聞き手は「うんうん、そうですか。で？」となる。

## ピラミッドでロジカルにストーリーを考えよう
- 「これが結論です。理由は、A、B、Cだからです。」「なるほど、了解」

## 結論とは？
- A: 「これは売れます」
- B: 「こういう企画です」
- 結論はA。結論とは、**相手に動いてほしい方向を示したもの**

## 根拠の基本は３つ
- 根拠が多い => 印象に残らずに終わる
- 根拠が1つ => 論破されやすい
- 根拠の目安は3つ。  
**「私の主張はこうです。理由は3点あって、1点目はこう、2点目はこう、3点目はこうです。」**  
これをプレゼンでやると、聞き手は驚くほど3点に反応し、

```
理由：
1.
2.
3.
```

のようなメモを書き始める。
つまり、
プレゼンとは、**相手の頭の中に、自分が伝えたいことの骨組みや中身を「移植していく」作業**

## ロジカルとは
- 聞いている人にとって、意味がつながっているとすぐにわかること。

```
「僕は、自分が勤めている会社が好きだ。理由は3つあって・・・」
1. 働きやすいから。
2. 一緒に働いている人たちが素敵だから。
3. 会社の業績がいいから。
```
↓

```
1. 働きやすいから、僕は、自分が勤めている会社が好きだ。 -> わかる
2. 一緒に働いている人たちが素敵だから、僕は、自分が勤めている会社が好きだ。　-> わかる
3. 会社の業績がいいから、僕は、自分が勤めている会社が好きだ。 -> ？
```

３はロジックが隠れている。聞き手は勝手に補足してしまう。

```
3-a. 会社の業績がいいから、（給料がどんどん上がるから）僕は、自分が勤めている会社が好きだ。
3-b. 会社の業績がいいから、（将来に不安を抱えなくて良いから）僕は、自分が勤めている会社が好きだ。
```
聞き手に勝手な解釈をさせてしまい、伝わっているようで、実は伝わっていないことがある。

ロジカルにするには・・・
- 聞き手がどう受け取るかを想像し、意味が繋がっていると聞き手が判断するように、主張と根拠を考える。
- 声に出して読んでみる
- 人に聞いてもらう

## 要らない言葉は削る

```
「基本的には、先に述べたように、「スッキリ、カンタン」の観点で、「削る」ことを念願にブラッシュアップしていきます」
```

↓

```
「スッキリ、カンタン」「削る」べく、磨いていきます」
```
1.無くても通じる言葉は、削る・・・「基本的には、先に述べたように〜、〜の観点で」
2.シンプルに分かりやすくする・・・「削ることを念願に」 -> 「削るべく」　「ブラッシュアップしていきます」 -> 「磨いていきます」


## 前提を相手のピラミッドと揃えておく
「あの人と仕事がしたい」

これだけ話しても、相手には、正しく伝わらない可能性がある。

「もし、あの部署に移動したら・・・」などの前提が必要となる。

- こんな事例において
- 今の時代において
- このコミュニティで


## ここまでのまとめ 1分で伝わるには
- 前提を相手と共有する。
- 主張（結論）を明確にする。
- 主張を説明する根拠を複数用意する（できれば３つくらい）。
- 意味がつながっているか「〜だから、〜だ」と、読んでみて、チェックする。

前提：もし自分があの職場に移動したら
主張：この人と仕事がしたい。
理由：
１.ビジョンがある
2.お茶目である
3.ブレない

次-> https://qiita.com/h_sasaki_223/items/e0f10dee2c89ed914501
ごあいさつ

## はじめに
初めまして。
今年からシステムエンジニアとして入社した新人OL23歳です。
全くプログラミングは出来ないのですが、
周りの期待もありますのでこの状況を何とかしよう！ということで
本格的に自学自習する事にしました。
その備忘録としてブログに書き残そうと思った次第です。
今はJavaを中心に書いていこうと思っていますが、
プロジェクト次第では他の言語についても触れるかもしれません。


## これから使用するPC(余談)
これまで所持していたPCはWindowsでしたが、5年以上使っていたので
クリスマスだし自分にご褒美を、と思い切って買いました。

**Mac**のパソコンを...

単純に憧れです。
だって、見た目とかMac持ってるだけでデキる感じするじゃないですか。
私も外に出掛けてMac見せびらかしたくなって...
こんな出来心で買ってしまいました。笑

触って見ると全然違うんですね...コピペとか、Finderとか...
実は会社ではWindowsなのに、
こんなに操作方法が違うパソコン買って良かったんでしょうか。
不安しかありません。笑

## 最後に
ちなみに私は長い文章を読むのが苦手で、図とか写真を多用することを好みます。
ちゃんと読めるようにならないと、とは思うのですが...
こんな私ですが、初心者だからこそ出来るだけ分かりやすく、
皆さんにも共有出来ること、伝えられることを残していきたいと思っています。
(何か変なことを言っていたらご指摘頂けますと幸いです。)

たまに学習のこと以外にもくだらないことも残しちゃおっかな
なんて思っています。

これからどうぞよろしくお願い致します。
Adaptiveなアイコンを作ってみよう

## はじめに
ちょっと遅くなりましたが，
Life is Tech !アドベントカレンダー21日目を担当するカーキです．
実は12/21は「シュガーラッシュ・オンライン」の公開日でもあります．

皆さんはもう観ましたか？
僕はもう観ました！

「そんなん観てないで先にアドベントカレンダーかけや！」と聞こえてきそうですが
何はともあれ作中ではたくさんのインターネット企業が出てきて面白かったです！
さて，この作品のエンドロールでは様々なアプリのアイコンが登場してきます．

そこで僕は思いつきました！

**『アイコンについて書こう』と**
ということで21日目の今日はAndroidの**AdaptiveIcon**を実際に使ってみたいと思います．

## Adaptive Iconとは
簡単に説明すると
Androidのランチャーによって勝手に丸やら四角やらにトリムされてしまうアイコンをうまーくいい感じに調整できる機能です．
こちらの記事に詳しくまとめられています
[3分で分かる？Android OのAdaptive Iconに対応しよう
](https://qiita.com/takahirom/items/696fb5ecaa230fa8f755)

AdaptiveIconでは**見切れても問題ないバックグラウンド**と**絶対アイコンに表示させたいフォアグランド層**に分けて設定することができます．
今回は次のような画像で作成していきます．
### バックグラウンド
![Group.png](https://qiita-image-store.s3.amazonaws.com/0/82263/69fe35a1-1691-03eb-b82c-f452a984ddb1.png)
グーグルっぽい配色です

### フォアグラウンド
![curryw.png](https://qiita-image-store.s3.amazonaws.com/0/82263/4c05881d-ec71-72d1-582d-1e8edb950cc5.png)
カレーですね

## 実践
AndroidStudioのプロジェクトファイル一覧を右クリックし**New>ImageAsset**を選択します．
<img width="1644" alt="スクリーンショット_2018-12-22_21_46_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/82263/caf3ccf3-60c9-dc96-d3ae-01a8bbb85dc0.png">

するとこんなウィンドウが出てきます．
アイコンのパターンんってこんなにあるんですね．．．
矢印のところから画像を指定できます．
早速先ほどの画像をBackgroundとforegroundに指定していきます．
<img width="1132" alt="スクリーンショット_2018-12-22_22_33_51.png" src="https://qiita-image-store.s3.amazonaws.com/0/82263/0ba6875d-24c0-2fd5-5846-76eb81263074.png">
backgroundには単色も選べるようです．
foregroundのサイズが大きすぎたり小さすぎるときは矢印のインジゲータでサイズの変更ができます．
<img width="1132" alt="スクリーンショット_2018-12-22_22_41_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/82263/ca3a5079-6730-e00a-abfe-d5e2c7c8a15a.png">

なんともカオスなアイコンができてしまいました．．．

Nextで次へ進みます

<img width="1132" alt="スクリーンショット 2018-12-22 22.41.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/82263/6efed817-a02b-6820-e0fe-5b0f8a104fef.png">
Androidのアイコンでは様々なデバイスの画素数に対応するためにはいくつかのサイズを用意する必要がありますが，このAdaptiveIconを使用すると自動で全サイズ分作成してくれます．
**便利!!　最高!!**

わざわざ全サイズ分用意するのが面倒な個人プロジェクトなら背景色も一緒に選択できるこの方法が一番手っ取り早くて楽かもしれませんね．

さて，
実際のアイコンがどのようになっているかエミュレータで確認してみます．
<img src="https://qiita-image-store.s3.amazonaws.com/0/82263/2b23bbcf-baef-179a-e0da-2467397f8c2f.png" width="300">
いい感じです！
アイコンを長押ししてからゆらゆらしてみるとアニメーションも確認できます！

##　まとめ
さてAdaptiveIconいかがだったでしょうか？
アイコンにpngなど透過画像を使おうとしている際でもこれで簡単に背景色などをつけられて，それぞれのサイズのアイコンを自動で生成してくれるのは便利ですよね！
Juliaをインストールしてみた(windows)

みなさんは普段どの言語を使ってますか？
僕は研究なんかでC++やpythonを使っています．ですが，研究とは関係なしに他の言語も触ってみたいなぁと思っていました．
そんな折，Twitterでちょくちょく「Juliaめっちゃ書きやすい」「Julia使ってpythonに戻るとこんなに書きづらいのかって思う」などJuliaという言語についてのツイートが散見されました．
RubyやJavaScriptなどさまざまな選択肢がありましたがpythonを普段使っているということもありいったいどれだけ書きやすいんだろうと気になり今回はJuliaを選びました．

今回はインストールから"Hello World"までをサクッと紹介していこうかと思います．
# インストール
それではさっそくインストールしていこうと思います．まずは[公式サイト](https://julialang.org/)からインストール用のexeファイルをダウンロードしてきます．
僕がダウンロードしてきたのはv0.6.3です．(まだバージョン1がリリースされてないんですね)
![Install.png](https://qiita-image-store.s3.amazonaws.com/0/184862/e313f49b-5e7f-81f2-d440-0b75f5367751.png)
まぁインストール先のディレクトリに変更はないのでこのまま"Install"をクリック
![Install_finish.png](https://qiita-image-store.s3.amazonaws.com/0/184862/2d97a869-544e-f003-7d00-296e04fe9b97.png)
終わりました．
簡単ですね．
このまま"Finish"をクリックするとJuliaがインストールされたフォルダが開きます．
ここからは[公式ドキュメント](https://docs.julialang.org/en/stable/)に従ってJuliaをサクッと試してみたいと思います．
(普段pythonをよく使うのでちょくちょくpythonと比較した表現が出てきます．)

# Hello World
Julia.exeを実行するとこんな画面になります．（カラフルだなぁ）
![Julia_start.png](https://qiita-image-store.s3.amazonaws.com/0/184862/fdc99ec8-c843-0c00-83f6-758c0d7ab17f.png)
ちなみに僕はexeのある場所にパスを通してコマンドで実行できるようにしました．
それではインタラクティブモードで実行していきます．（REPLですね．）
![Julia_start1.png](https://qiita-image-store.s3.amazonaws.com/0/184862/e4a1050b-cb5e-6670-3593-f6968459c55c.png)
計算式を打つとその答えを返してくれますね．これはpythonと同じですね．
Juliaでは`ans`と打つと最後の計算結果を返してくれるとのこと．ただしこれはインタラクティブモードでしか有効ではないとのこと．便利かどうかは今のところ不明．．．

次は変数の定義です．まぁ定義の仕方や上書きができるっていうのはpythonと同じですね．ただ，文字列のときにはシングルクォーテーションは使えないようです．
また使い道があるのかどうかは置いといてユニコードの文字ならなんでも変数として定義できるそうです．
![Julia_start2.png](https://qiita-image-store.s3.amazonaws.com/0/184862/c18d2ea3-0624-ed68-7b2d-6671e73211e6.png)
また，JuliaではLaTeXでのギリシャ文字等にも対応しているとのこと．（なぜか僕の環境では`\hat`とかが使えなかった．．．）
標準で$\pi$にも対応していますね．
![Julia_start3.png](https://qiita-image-store.s3.amazonaws.com/0/184862/463d8017-77f1-1a3b-9d24-831f2a846b7a.png)

という感じでインストール～Hello worldまではこんな感じでしょうか
今回は古いバージョンでしたが[バージョン1.0](https://julialang.org/downloads/)がついにリリースされたので今後も追っていきたいと思います．
愛知県の電車+徒歩でいける範囲まとめ

#なんで作ろうと思ったか
東山線の名古屋駅・伏見駅間に新駅(柳橋新駅)を作るとか作らないという話を名古屋市がしてるので、新駅がないとあの辺をぶらぶら歩くのがしんどいのかどうかを検証してみました。

あと、高辻のあたりって徒歩で移動すると死ぬよねー、とか、豊明市とみよし市の境あたりって鉄道全然ないから、桜通線伸ばして三河豊田まで到達させるとハッピーな人多いんじゃないかな? みたいのも示そうかと思いました。(収益性についての話はさておき)


#実行環境
* macOS 10.14.2

* Anaconda 1.9.4 でjupyter notebokを起動。

* あと、foliumはAnacondaで初期インストールされてなかったので、pip3 install foliumでインストールしてます

* 地図データはhttp://www.ekidata.jp/のデータを利用。再配布OKと規約に書いてあるので、githubにそのまま載せてます。
使いたい場合は、[https://github.com/takinou/station_sim/blob/master/datas/ekidata.jp/station20180330free.csv]から落としてください。

#その他前提
* 半径800mを駅から歩ける距離として採用。不動産会社としては、徒歩10分 = 800mらしいので。

* 愛知県に所在する駅データだけを元にしてるので、岐阜・三重・静岡の駅は乗ってません。


#コード

```python
import folium
import pandas as pd

#駅からの距離を設定
RADIUS=800

#名古屋市の全体を表示してみる
mp_Nagoya = folium.Map(location=[35.14, 136.9064], zoom_start=12)
mp_Nagoya

#愛知県も作る
mp_Aichi = folium.Map(location=[35.0, 137.25], zoom_start=10)
mp_Aichi

df_free = pd.read_csv("./datas/ekidata.jp/station20180330free.csv")

#愛知県だけのデータに絞る
df_free=df_free[df_free['pref_cd']==23]

#駅からの半径で色ぬり
#ちなみに、Circleだとm単位、makeCircleだとpixel単位で色ぬりするらしい。
for i,row in df_free.iterrows():
    folium.Circle(
            [row['lat'], row['lon']],
            radius=RADIUS,
            popup=row['station_name'],
            color='#3186cc',
            fill_color='#3186cc',
    ).add_to(mp_Nagoya)
    
    folium.Circle(
            [row['lat'], row['lon']],
            radius=RADIUS,
            popup=row['station_name'],
            color='#3186cc',
            fill_color='#3186cc',
    ).add_to(mp_Aichi)

mp_Nagoya
mp_Aichi
```

#結果
こんな感じ

##### 柳橋駅(の候補地)
一応、徒歩圏内に入っているけれど、名鉄名古屋駅・近鉄名古屋駅・JR名古屋駅・地下鉄名古屋駅・地下鉄丸の内駅・地下鉄伏見駅からみて円の縁にギリギリかかっているかどうかという感じなので、アクセスが悪いといえば悪いかもしれない。

でも国際センター駅から徒歩5分くらいのエリアに含まれてるので、やっぱ問題ない気はする。ほらわがまま言わず桜通線使いなさいよ桜通線。
<img width="983" alt="reachable_Yanagibashi.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/254176/64c35ee0-6697-8958-a537-29b57d45504f.jpeg">


#####名古屋全体
地下鉄のおかげもあってだいたいのエリアが徒歩圏内に収まっているけれど、中川運河のあたりと高辻のあたりは、車がないとしんどい。
庄内川の沿線もしんどい。
あと、市東部のあたりもところどころおっきな空白地帯があるのでしんどそう。
![reachable_Nagoya.jpg](https://qiita-image-store.s3.amazonaws.com/0/254176/9f996f19-3ca5-0981-4151-7b42f80d7add.jpeg)

#####愛知県全体
東三河は車がないと生きていけない。。。

あと、やっぱみよし市と豊明市のあたりがすっぽり空白。名古屋市近郊エリアなのにここだけ線路網が薄い。市内でも人口多いエリアなのに。。。
桜通線を三河豊田駅まで伸ばしてくれると嬉しい。
![reachable_Aichi.jpg](https://qiita-image-store.s3.amazonaws.com/0/254176/2ded4336-795e-51b8-5277-ffe4f2ec727c.jpeg)



#参考にしたところ
[https://ohke.hateblo.jp/entry/2018/03/02/230000:title]

[https://qiita.com/nanakenashi/items/824c0cb16860ca59a424:title]
【GO】dep でインストールしたパッケージを VScode で補完が効くようにする方法

## Overview

`go get` ではなく、パッケージ管理ツール( `dep` )でインストールしたパッケージを VScode 上で補完が効くようすることを目指します。（ここ上手な日本語が見当たりませんでした。）

## Introduction

`go get` を用いてインストールされたパッケージは GOPATH 配下に配置されます。
しかしながら `go get` を用いてインストールされたパッケージは __そのPCにグローバルに__ インストールされることになるため、共同開発においては環境差分を生む要因となってしまします。

そこで用いられるのがパッケージ管理ツールです。
依存パッケージをプロジェクトごとにファイルで管理することにより、環境の再構築を容易に実現します。
Go のパッケージ管理ツールは複数存在しますが、本記事では Go 公式のパッケージ管理ツールである `dep` に焦点を当てます。
(`dep` も Go 公式ですが、今後は `Go module` が[デファクトスタンダードになるという話](https://qiita.com/nekketsuuu/items/60634417e6279ccfd95b)もちらほら)

このようなパッケージ管理ツールを用いる際に困ったことがひとつ。
それは、パッケージを `GOPATH` 配下にインストールする訳ではないので、そのままでは IDE の補完機能の対象にならないことです。

![スクリーンショット 2018-12-23 16.20.57.png](https://qiita-image-store.s3.amazonaws.com/0/237863/5a2d5f22-21ea-f977-f492-7e51ee2152e9.png)


今回は `VScode` の場合のこの問題への対処法を探ってみました。

## Environment

- macOS,  Mojave v10.14.2
- Visual Studio Code,  v1.30.1
    - 拡張機能:Go,  v0.8.0
- Go,  v1.11.2

## How to

さて、それでは実際に `dep` でインストールしたパッケージに `VScode` の補完が効くように作業していきます。
作業自体は一瞬で終わります。

作業内容を一言で表すと、「 `GOPATH` を IDE に対して明示的に指定する。」です。

設定の `GOPATH` オプションを編集します。

![スクリーンショット 2018-12-23 16.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/237863/f8dcd126-f5d6-daa4-cc1b-05f66123500e.png)
![スクリーンショット 2018-12-23 16.38.38.png](https://qiita-image-store.s3.amazonaws.com/0/237863/72d02b3d-f58b-bb3f-2225-ad4f2c9a7784.png)
![スクリーンショット 2018-12-23 16.39.08.png](https://qiita-image-store.s3.amazonaws.com/0/237863/b1ac3fdb-95f6-f783-1803-594b5c3c3059.png)
![スクリーンショット 2018-12-23 16.40.10.png](https://qiita-image-store.s3.amazonaws.com/0/237863/99ee6f7a-6882-2c20-91dd-7729a038c4a3.png)
![スクリーンショット 2018-12-23 16.41.53.png](https://qiita-image-store.s3.amazonaws.com/0/237863/293b8270-8561-3c12-9794-af23a4ebbfef.png)
![スクリーンショット 2018-12-23 16.42.22.png](https://qiita-image-store.s3.amazonaws.com/0/237863/2bed8593-4c0f-de7e-fa91-571ce0b3e7d0.png)

`.vscode/setting.json` に

```
"go.gopath": "${workspaceFolder}"
```

を追加して保存したら、一旦 VScode を閉じて起動し直します。
起動できたら Go のファイル (画像の例では `main.go`) を選択してアクティブにします。

![スクリーンショット 2018-12-23 16.43.44.png](https://qiita-image-store.s3.amazonaws.com/0/237863/f1ab265e-ada3-ed4e-178d-f0af2e1dd5ad.png)
![スクリーンショット 2018-12-23 16.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/237863/cb45d61a-f5fd-d696-3d3d-29d2eb1dd9b6.png)

すると、プロジェクトルート配下に `pkg` ディレクトリが作成され、ここに `dep` でインストール済みのパッケージが再配置されます。
ここでパスの解決が行われ、IDE の補完が効くようになります。
画像の問題タブを見ても、設定前は検出されていた問題が検出されなくなっています。

おわり。
サーバーサイドエンジニア向け AWS re:Invent 2018 まとめ

AWS re:Invent 2018で発表された新サービス・機能は100を越えるため、全てを追うことは非常に大変です。そのため、サーバーサイドエンジニアが利用しそうなものをピックアップしてまとめてみました。

# 参加者が最も興味があるのは
会場に来ていた人に最も興味があるのは何か？をアンケートした結果、以下の順位になったそうです。
1. サーバーレス
2. セキュリティ
3. ML/DB

コンテナはもうランク外。 今後クラウドはサーバーレスメインになっていく。 KeyNoteで最も盛り上がってたのもサーバーレスの話題。

# 発表内容
## Compute
### EC2 A1インスタンス
ARMベースのAWS Gravitonプロセッサーを搭載したEC2インスタンス。
他ファミリと比較して低コスト。スピードは出ないが、バックで使うにはいいかも。

### EC2がハイバネーションをサポート
サーバーの状態を維持したままインスタンスを停止できるように。
(ハイバネーション = シャットダウンする前にメインメモリの内容をハードディスク等に退避し、次回起動時にまたメインメモリに読み込んで、シャットダウンする前と同じ状態で起動する)

### FirecrackerがOSSとしてリリース
Firecrackerはサーバーレスコンピューティングのためのセキュアなコンテナマシン。AWSのサーバーレスの基盤技術である。
従来のコンテナと同等のセキュリティを保ちつつ Lambdaのスタートアップタイムが125ms(理論値)になる。

## ストレージ
### Glacier Deep Archive
すぐには取り出せないが、非常に低コストなストレージ。

### Automatic Cost Optimization for Amazon S3 Intelligent Tiering
アクセスによって自動的にコスト削減してくれる。アクセスなければ安いストレージサービスに変換。

## セキュリティ
### AWS Control Tower
多数のアカウントを保有しているAWS利用者が、各アカウントのセキュリティ設定を簡単に統制できるようになるサービス。

## デベロッパー
### AWS Toolkits for Popular IDEs
以下のIDEにAWS Toolkitをいれられるようになった。
- PyCharm
- IntelliJ
- VSCode

### AWS Amplify Conssole
Webアプリ向けの簡単なCI/CDサービス。

### Lambda
ついにRubyが公式対応。ベンチャーのRails勢が一斉にサーバーレスに傾くかも？
また、Custom Runtimeで好みの言語を利用することが可能に。 パートナーからもいくつかの言語のランチムが提供される。ただし、 現状は公式サポート言語にしたほうがいいと思われる。Custom Runtimeを使うとマネージドする必要が出るので、サーバーレスの恩恵を受けれなくなる。

### ALB Support for Lambda
APIGatewayをかまさなくてもLambdaにアクセスできるように。
 
### AWS App Mesh
AWS上のマイクロサービスアプリケーション間の通信を簡単に監視、制御できるサービス。

### AWS Market Place for Containers
AWS Marketplaceでコンテナベースのプロダクトを調達可能に。

### AWS Lambda Layers
共通部を記述できる層。
従来のLambdaではそれぞれの関数ごとにパッケージングしてデプロイしなければならなかったが、AWS Lambda Layersを使えば複数のLambda関数でコードを共有できるように。

### Step Functionsの連携先が増えた。
Dynamo DBなど新たに8つの連携先が増えた。
コードを書かずにAWSサービスを結合することが可能に なったので、無駄なLambdaラッパーを使わずに済むように。

### Web socket APIGateway
APIGatewayがWeb socketをサポート。

### Amazon MSK
Amazon Managed Streaming for Kafkaの略。
フルマネージドのKafkaサービス。

### CloudWatch Log Insights
フルマネージドのログ分析、可視化サービス。


## データベース
### QLDB(Quantum Ledger Database)
フルマネージドな元帳データベース。

### Managed Blockchain
フルマネージドなブロックチェーンネットワークサービス。

### Timestream
フルマネージドな時系列データベース。IoTなどに使う。

### DynamoDB Transactions
DynamoDBでトランサクションできるようになった。
分離レベルはシリアライズ。

### DynamoDB On-Demand
DynamoDBで、読み書きリクエスト数に応じたPay-per-Requestモデルの請求モードが選択可能に。