OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Transit Gateway 試してみた

#1.環境の準備#
各VPCから双方向に通信を実施してみたいと思います。以下のように２つの環境を準備しておきます。

|---|A|B|
|---|---|---|
|VPC |10.0.0.0/16 |172.16.0.0/16| 
|subnet|10.0.0.0/24 |172.16.0.0/24|
|EC2|10.0.0.10|172.16.0.20|
|SG|icmp 172.16.0.0/24|icmp 10.0.0.0/24|

#2.Transit Gatewayの作成#
Transit Gateway を作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b23ca864-7b49-ff4e-087b-2cb7855cbc28.png)


#3.Transit Gateway Attachmentの作成#
Transit Gateway にVPC/subnetを紐づける。

A
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/24002bcf-79a0-e10c-55d4-32d2bec7f561.png)

B
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7669d24a-bf4e-2f67-08c1-b45b881a77e5.png)


#4.Transit Gateway Route Tableの作成および設定#

今回は【2.Transit Gatewayの作成】で、
Default route table assciation　
Default route table propagation
にチェックを入れてましたので、既に作成されています。

[Assciation] 【3.Transit Gateway Attachmentの作成】でアタッチしたVPC/subnetがルートテーブルにひもづいていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d875a382-fd71-a8fa-cece-7a692d327bbb.png)

[Propagations]　アタッチメントしたリソース間で通信が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a9cfc7f5-4c57-5df0-2a3f-3b74541a39b4.png)

[Routes] を確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/64cb98f5-bf87-f676-aa6e-c37d5ca8b7ee.png)


#5.サブネットへのRoute Tableの編集#
A
172.16.0.0/24　tgw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e27b0e52-ffb0-75e5-6f9d-c70ee8aebca1.png)

B
10.0.0.0/24　tgw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/aa049fec-6644-370c-cafb-4d745643e857.png)


#6.pingテストしてみる#

A→B

```
[ec2-user@ip-10-0-0-10 ~]$ ping -c 3 172.16.0.20
PING 172.16.0.20 (172.16.0.20) 56(84) bytes of data.
64 bytes from 172.16.0.20: icmp_seq=1 ttl=254 time=3.16 ms
64 bytes from 172.16.0.20: icmp_seq=2 ttl=254 time=2.77 ms
64 bytes from 172.16.0.20: icmp_seq=3 ttl=254 time=2.81 ms
```

B→A

```
[ec2-user@ip-172-16-0-20 ~]$ ping -c 3 10.0.0.10
PING 10.0.0.10 (10.0.0.10) 56(84) bytes of data.
64 bytes from 10.0.0.10: icmp_seq=1 ttl=254 time=3.13 ms
64 bytes from 10.0.0.10: icmp_seq=2 ttl=254 time=2.76 ms
64 bytes from 10.0.0.10: icmp_seq=3 ttl=254 time=2.74 ms
```
Docker メモ

# Dockerのメモ
筆者のつぶやき

つぶやきたくなったら追記していきます。（2019.10.17)

## ホストとコンテナをマウントする
`docker run` の時に下記オプションを追記
`-v /hostdir/:/condir/`

## docker build の時、いらないものもbuildされて困る場合 
.dockerignore　で指定

```terminal:command
#テキストエディタで開いて
nano .dockerignore
```

```text:.dockerignore
#いらないフォルダやファイルを記入して保存
iranai
iranai.txt
iranai.fa
```
参考URL:[.dockerignore アンチパターン](https://qiita.com/munisystem/items/b0f08b28e8cc26132212)
redmineで担当者プルダウンを選択しやすくするChromeプラグイン

## Redmine Issue Assigned Auto Complete
https://chrome.google.com/webstore/detail/redmine-issue-assigned-au/gpjfkokdifpdhedmpciiihefkcaddpla

redmineで担当者が多い時にプルダウンで選ぶのが大変な時がありますが、
こちらのプラグインは選択＋入力での絞り込み・補完ができます。
チケット管理で少しでも効率化したい方には便利です。

![redmine.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/b55a1509-c975-1712-45f3-b70abf4dbc17.jpeg)

## Select box filter
その他Redmineに限らないselect boxのツール

https://chrome.google.com/webstore/detail/select-box-filter/ohgdgoglcbcfofphmmnkkdbpffklhjgh
JavaAPIとは-java

```java:sample
	public class HelloWorld{
         public static void main(String[] args) {
           System.out.println("hello");
	   }
	}
```
※エクリプスでの開発環境を前提としている※

プログラミング初心者のおまじないとして
学習の初めにHelloWorldクラスを作ることが慣行(?)となっているが
HelloWorldいうクラスは自分で作ったたった一つのクラスであると思いがちだが
実際にはほかの347個のクラスと連携してうごく計348クラスからなるプログラムである。

自分で作った一つのクラスを除く347個のクラスは、Javaに初めから標準添付されているクラスであり
それらは**API**(Application Programming Interface)と称される。

このAPIは200を超えるパッケージと3500以上のクラスが標準提供されており、いつでも自由に使うことができる。
APIは世界中の開発者が作り出したもので、高速かつバグがない。

代表的なパッケージは以下の表の通り

| パッケージ名|説明|   
|:-----------------|------------------:|
| java.lang             |Javaに欠かせない、重要なクラス群 |
| java.util           |プログラミングを便利にするさまざまなクラス群| 
| java.math          | 数学に関するクラス群| 
| java.net        | ネットワーク通信などを行うためのクラス群| 
| java.io         |ファイルの読み書きなど、データを遂次処理するためのクラス群| 

特に**java.langのパッケージに属するクラスは頻繁に利用するものが多い**ので
特別にインポートしなくても**自動的にインポートされる仕様**になっている。
System.out.println()のSystemはjava.lang.Systemクラスである。
AmplifyでS3のコンテンツ閲覧にユーザー認証をかける

Amplify+Vue の開発が爆速すぎて感動する日々です
今回はS3とCognitoの連携があまりに簡単に設定出来たので記事にしました

## 前提

* Amplifyを利用している
* フロントフレームワークは `Vue.js`

## やりたかったこと

S3バケット内にあるコンテンツをCognitoユーザーのみ閲覧出来るようにする

## 署名付きURL

* presigned_url
* 認証で許可されたユーザーにのみ発行される
* 一定期間のみ閲覧可能
* 発行されたURL自体は誰でもアクセス可能

## amplifyのStorageを使う

amplifyでAuthを使用している場合、Storageとして追加したバケットは自動的に認証がかかる(便利!!)

* Authの追加 ... `$ amplify add auth`
* Storageの追加 ... `$ amplify add storage`

## すでにあるS3バケットを使う

以下のようにバケット名とリージョン名を設定するだけ

```main.js
import Amplify from 'aws-amplify';

Amplify.configure({
    Storage: {
        AWSS3: {
            bucket: 'バケット名',
            region: 'リージョン名',
        }
    }
});
```
※ パブリックアクセス設定はすべて `オン`

## URLを取得する

バケット情報を設定したらあとは `Storage.get()` するだけ(超簡単!!)

```js
import {Storage} from 'aws-amplify';

Storage.get("文書名", {expires: 有効期限(秒)})
  .then((re) => {
    //  re = 署名付きURL
  })
```

## URLが取得出来ない場合

`Storage.get()` で認証エラーが返ってきてしまう場合以下を確認

#### Cognitoのauthロール

Authを追加すると、ロールがいくつか作成される
今回確認するのは、末尾が `-authRole` のロール
もう一方の `-unauthRole` は非認証状態のユーザーに対する権限
![スクリーンショット 2019-10-17 10.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/01747824-13a2-4a3d-43bb-f18b33973bc5.png)

ポリシー名 `CognitoUserS3Access` のActionとResourceの設定を確認

[Action] ... `S3:GetObject` が許可されていればok
[Resource] ... 塗りつぶし部分が対象のバケット名であればok
![スクリーンショット 2019-10-17 10.42.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252165/3700ddce-5dd6-a6c6-450b-dadce4827359.png)

## 取得したURLでアクセス出来ない

署名付きURLの取得には成功したが、アクセスするとブロックされる場合、
`バケットポリシーでブロックされている` または `対象の文書がない` 可能性がある

署名付きURLは、
バケットと対象のリソースを示すキーをもとに自動生成された公開URLに、認証情報を付加しているだけ

つまり、URL発行時に `バケットポリシー` や `キーとして指定したリソースの有無` は確認されない
Antを実行してJRE version less than 1.8 is not supported.となった時の対応方法

- 環境
    - Windows10 Pro 64bit
    - Eclipse Version: Oxygen.3a Release (4.7.3a)
    - (プロジェクト用)java version "1.7.0_79"
    - (Eclipse用)java version "1.8.0_231"

# 事象 : AntビルドしたらJRE version less than 1.8 is not supported.となった
メッセージダイアログで[問題が発生]ダイアログが出た

```text
'ploject-name Ant用のxml の起動'に問題が発生しました。
JRE version less than 1.8 is not supported. 
```

## A Java Exception has occurred. というエラーダイアログが出たりもする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/e9b3f1dc-a04a-2d47-35af-e058b006fc58.png)

# 原因 : プロジェクトで使っているバージョンとEclipseにデフォルトで入っているAntのバージョンがあっていないから
### Eclipseにデフォルトで入っているAntのバージョンを見てみると「1.10.1」だった
1. [設定] > [Ant] > [ランタイム] > [クラスパス] > [Antホーム項目(デフォルト)]
1. jarの格納されているディレクトリパスを見ると[org.apache.ant_1.10.1.v20170504-0840]となっている

### Apache AntのサイトによるとAntのバージョンが「1.10.x」だと「Java8」でなければならないらしい
> The 1.9.x releases require Java5 at runtime and 1.10.x requires Java8 at runtime.
> [Apache Ant - Welcome](https://ant.apache.org/index.html)

## 対応 : Antで使用するJavaのバージョンを変える
[kakakikikekeのブログ: &#12304;eclipse&#12305;Antで実行するJavaのバージョンを指定する方法](https://blog.kakakikikeke.com/2013/07/eclipseantjava.html)
1. [パッケージ・エクスプローラ]にあるAnt用のxmlで右クリック
1. [実行] > [外部ツールの構成...]で[外部ツール構成]ダイアログを開く
1. [JRE]タブを開くと[別のJRE]でプロジェクトで使っているjdk1.7が指定されている > セレクトボックスからEclipse用のjdk1.8を選択 > [適用]
1. [実行]ボタンで実行する
セイウチ演算子って何？

#目的
友人からPython3.8で「セイウチ演算子」なるものが導入されたと聞いたのでまとめてみる

#セイウチ演算子とは
>:=

イコールの前にコロンをつけた演算子
横向きに見るとセイウチの顔っぽく見えるから…らしい
英語ではWalrus operator
Walrusはセイウチの意

#動作
__変数への代入__と__変数の使用__を同時に行える

```python
(n := len(array)) > 4
```

とするとnに値(arrayの長さ)を代入しつつ4と比較することができる
代入されているのでそのあとにnを使うことも可能
主に見やすさを高めるために使う

#どんな時に使う？
##リストで使う
例えばリストの長さで条件分岐して、そのあとリストの長さを使いたいとき

```python
array = [1,2,3,4,5,6,7]
if len(array) > 5:
    print(len(array))
#7
```

len()を2回呼び出さなくてはいけない
まどろっこしいので一回で済ませたいときにセイウチ演算子を使う

```python
array = [1,2,3,4,5,6,7]
if (n := len(array)) > 5:
    print(n)
#7
```

ちょっとすっきり書けるようになる

##ファイル読み込みで使う
ファイル読み込みはかなりすっきり書くことが可能
一行ずつ読み込む場合にはwhileでreadline()を回すことが多い
さっきと同じようにreadline()が2回出てきてまどろっこしい

```python
f = open("sample.txt")
text = f.readline()
while text:
    #何らかの処理
    print(text)
    text = f.readline()
```

これを以下のようにすっきり書ける

```python
f = open("sample.txt")
while text := f.readline():
    #何らかの処理
    print(text)
```

#注意点
代入して比較する際にはセイウチ演算子の範囲をかっこで囲む必要あり

```python
if (n := 5) > 4:
    pass
print(n)
#5

if m := 5 > 4:
    pass
print(m)
#True
```

下の例では5>4の結果が代入されてしまった模様
値を後で使いたいならかっこで囲むべし

#まとめ
見やすさを高めるために使うもの
慣れるまでは少し時間がかかりそう
使いたいのであればPythonのバージョンを上げよう

#参考文献
リリースノート　What's New In Python 3.8
https://docs.python.org/ja/3.8/whatsnew/3.8.html#new-features

Python3.8の新機能 | Yakst
https://yakst.com/ja/posts/5567
Linux基礎(Localization&Internationalization)

#Lovalizationとは
国や地域に応じた言語、日付、通貨単位などhはLocaleと呼ばれる表現規則そして扱われる。そして、言語、日付、通貨単位などを国や地域に合わせることをLocalizationという。国ごとにLocalizationを行うのは大変だが、最近のソフトウェアはあらかじめ多言語、他地域に対応するように作成されている。これをInternationalizationという。

#Localeとは
Locale(利用者の地域情報)は以下の通りカテゴリに分類されており、これらのカテゴリは個々に設定することができるので、例えばメッセージは日本語であるが日付や通貨単位は英語にすることができる。全てのカテゴリに同じ値を適用するためには、環境変数LANGまたはLC_ALLを設定する必要がある。

##Locale(ロケール)用の環境変数

|環境変数|説明|
|---|---|
|LANG|言語の設定|
|LC_CTYPE|文字の種類、大文字/小文字の変換などの文字属性を定義|
|LC_MESSAGES|出力されるメッセージの言語を指定|
|LC_MONETARY|通過に関する規定|
|LC_NUMERIC|数値の書式に関する指定|
|LC_TIME|日付や時刻の書式に関する規定|
|LC_ALL|ロケールの環境変数全て|

##現在のLocale設定確認
locale [オプション] ユーザー名

|オプション|説明|
|---|---|
|-a|設定できるロケールを全て表示|
|-m|利用できる文字コードを全て表示|

|Localeの設定値|説明|
|---|---|
|C|英語|
|en_US.UTF-8|英語(米)/Unicode|
|ja_JP.utf8|日本語/Unicode|
|ja_JP.eucJP|日本語/EUC-JP|
|ja_JP.shitJIS|日本語/ShiftJIS|

#タイムゾーン
地域ごとに区分された標準時間帯をタイムゾーンという。タイムゾーンの情報は/usr/share/zoneinfoディレクトリ配下のバイナリファイルに格納されている。Linuxで利用するタイムゾーンは上記ファイルを、/etc/localtimeにコピーすることで設定するか、シンボリックリンクを作成することで定義できる。

```shell
# 日本のタイムゾーンの設定
$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# 日本のタイムゾーンの設定(シンボリックリンク)
$ ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# tzselectコマンドを利用することで一覧からタイムゾーンを設定することができる
$ tzselect
```
WebSocketを検証するための環境構築

# 経緯
作ったWebsocketをテストしたいですが、検証用のツールが見つからず、pythonで検証コードを書こうと思いますした。
書く途中で、以下のライブライリーを見つかって、自分で作れなくで済むことになりました。
忘れないようにメモします。
＊ホストの環境で構築するため、環境を汚したくない人は[pyenv＆pyenv-virtualenv](https://qiita.com/EasonYo/items/bc71f013b32aa6c78502)を利用してください。

## Pythonのインストール
Pythonを利用するので、まずはPythonをインストール 

```
brew install python 
``` 

## 今回利用するライブラリーのインストール
websocket、websocketsもあるので間違いないようにwebsocket-clientをインストール

``` 
pip3 install websocket-client 
```

## Githubからライブラリーのソースをダウンロードする
[websocket-client](https://github.com/websocket-client/websocket-client)

## 検証用dumpを利用し、簡単なWebSocketを行う
```
cd [ソースのフォルダ]
python3 bin/wsdump.py [url]
```
## [option]python3やpip３の３を省略したい場合
`.bashrc`に

``` 
alias python=python3
alias pip=pip3
``` 
を書いておくと、python, pipでそれぞれ今回インストールしたものを使えるようになります。

以下のコマンドで修正を適用する。

```
source .bash_profile 
```

ご参考までに。
UserDefaultsに辞書型を入れるとき、KeyはStringでなければならないという制約がある

UserDefaultsに辞書型を突っ込んだ際に、こんなエラーになりました。

> Attempt to set a non-property-list object

このときは突っ込んだのが辞書型で、KeyにInt型、Valueに配列が入ったちょっと複雑なやつだったので、
配列がHashableじゃなかったからダメなのかな〜と思って（←誤解）、
突っ込もうとしていたデータを分割して、
Keyだけの配列、Valueだけの配列をそれぞれUserDefaultsに突っ込んで、配列のindexで紐付けようかと思ったんですが、
これでもできなくはないんですが、バグがあったときに収集つかなくなるなと思い、ちゃんと原因を調べました。

# 辞書型のKeyにできる値
まず僕が最初にした誤解について。

> @frozen struct Dictionary<Key, Value> where Key : Hashable

https://developer.apple.com/documentation/swift/dictionary

辞書型のKeyはHashableである必要があります。
ただValueに関しては自由なので、配列でも辞書型でも突っ込めます。
Hashableに準拠しているかどうかは、公式ドキュメントかXcodeで定義を参照するかするとわかりますが、
IntやStringなど標準的な型はHashableです。
ただ、ArrayやDictionaryはHashableには準拠していないので、Keyにはできません。

※公式ドキュメント見ると、Conforms Toの中にHashableがあるので、一瞬準拠しているように見えるのですが、「Conforms when Value conforms to Hashable.」と注意書きがあります。

# property-listとは？
どうやらエラーの原因は辞書型のエラーというよりは、UserDefaultsのエラーっぽいぞ？　と気づきました。
僕が打ち込もうとしていた型は、KeyをInt型にしていたので、Hashableはクリアしています。
というかそもそもエラー文はそんなこと言っていない。。。
エラーに真面目に向き合ってみると、Property Listsに入っていないことが問題っぽいですが……？

[About Property Lists](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html#//apple_ref/doc/uid/10000048i-CH3-54303)

この一覧を見る限り、Dictionaryも使えるはずで、NSDictionaryにキャストするといけるのかな？　とか試してみたんですが、結果は変わらず。

ところが、

> And although NSDictionary and CFDictionary objects allow their keys to be objects of any type, **if the keys are not string objects, the collections are not property-list objects** 

ん？

**if the keys are not string objects, the collections are not property-list objects**

えーっ！

というわけで、KeyをInt型→String型にキャストしたら解決しました。
StringにキャストできないKeyを使いたい方は、一度Data型（JSON Decodeを使うといいみたい）にすると突っ込めるらしいです。

# 参考
[[Int:String]はUserDefaultsに入れると実行時エラー](https://qiita.com/crenieq/items/b91519791059a1057302)
Rによるクロス集計表の作成と割合表記について

kaggleのtitanicをRで統計的手法を使って処理していたのですが、
クロス集計について詳細に解説されてる情報が少なかったのでのせます。

titanicのtrain.csvの生存の場合1を取るダミー変数train\$Survivedと乗客の社会的経済的地位を代理するカテゴリカル変数train\$Pclassを使ってクロス集計表を作ります。

titanicでのデータの読み込み方についてや解き方は以下をご覧ください。

【Kaggle入門, R言語】Titanic号の乗客データを用いた生存者予測―ロジスティックモデルでスコア80%を超えることができるか挑戦してみた― [http://zeema.hatenablog.com/entry/2017/09/04/003400]

ここではクロス集計表に絞って説明していきます。

```R
SP <- table(train$Survived,train$Pclass)
print(SP)
```
table()関数の第1引数と第2引数に質的変数を指定することによってクロス集計表が作成できます。

結果は以下のとおりです。

```
            1   2   3
  Died      80  97 372
  Survived 136  87 119

```

さらにクロス集計表の相関について考察するために度数を割合表記に変換していきます。
ここでは先程作ったクロス集計表を格納した変数SPを使っています。

```R
prop.table(SP)
          
                    1          2          3
  Died     0.08978676 0.10886644 0.41750842
  Survived 0.15263749 0.09764310 0.13355780
> prop.table(SP,1)
          
                   1         2         3
  Died     0.1457195 0.1766849 0.6775956
  Survived 0.3976608 0.2543860 0.3479532
> prop.table(SP,2)
          
                   1         2         3
  Died     0.3703704 0.5271739 0.7576375
  Survived 0.6296296 0.4728261 0.2423625
```

prop.tabele()関数で割合表記が作成できます。propとは確率のことです。
prop.table()関数の第1引数にクロス集計表を、第2引数には割合を行方向にとる場合(1)、列方向に取る場合(2)をとります。第２引数に何も指定していない場合は全度数を基準にした割合が返されます。



以上です。ありがとうございました。

###参考

オーム社
Rによる多変量解析入門　データ分析の実践と理論
川端一光、岩間徳兼、鈴木雅之

http://zeema.hatenablog.com/entry/2017/09/04/003400
AWS SDKで検証用のRedshiftを作成


## 背景
データ基盤を開発する上で、Redshiftを立ち上げて検証する必要がありますので、Redshiftを立ち上げるスクリプトを作りました。

## Redshiftを作成する
AWS上の全てのリソースに対して、AWS SDKから操作できるので、Javascript用のSDKをTypescriptで使いました。

```typeScript
    import AWS_SDK = require("aws-sdk");
    const Redshift = new AWS_SDK.Redshift();
    const STG_REDSHIFT_CLUSTER_NAME = "stg-redshift";
    
    AWS_SDK.config.update({ region: "ap-northeast-1a" });
    
    export const stgRedshiftConfig = {
        clusterName: STG_REDSHIFT_CLUSTER_NAME,
        endpoint: `${STG_REDSHIFT_CLUSTER_NAME}.[クラスタ立ち上げ時に使われるURL]`,
        masterPassword: "password",
        masterUsername: "username",
        dbName: "databaseName",
        nodeType: "dc1.large", // 2019-10-15で一番安いインスタンスタイプ
        clusterSubnetGroupName: "production", //本番Redshiftの同じVPC, Subnet
        clusterType: "single-node"
    };
    
    export function createStgRedshift(): void {
        const params = {
            ClusterIdentifier: stgRedshiftConfig.clusterName,
            MasterUserPassword: stgRedshiftConfig.masterPassword,
            MasterUsername: stgRedshiftConfig.masterUsername,
            NodeType: stgRedshiftConfig.nodeType,
            AllowVersionUpgrade: false,
            // AvailabilityZone: "ap-northeast-1",
            ClusterSubnetGroupName: stgRedshiftConfig.clusterSubnetGroupName,
            ClusterType: stgRedshiftConfig.clusterType,
            DBName: stgRedshiftConfig.dbName,
            Encrypted: false,
            EnhancedVpcRouting: false,
            IamRoles: [
                "RedshiftのRole"
            ],
            Port: 5439,
            PubliclyAccessible: false,
            VpcSecurityGroupIds: ["VPCSecutiryGroup"]
        };
        Redshift.createCluster(params, function(err, data) {
            if (err) console.log(err, err.stack);
            else console.log(data);
        });
    }

    createStgRedshift();
```

上のスクリプトを実行
```shell
npx ts-node redshift.ts
```

以上、の本番同等のRedshiftを作ることができました。
AWS CDKでRDSデータベースを作成する方法

## 背景
あWSで開発していて、RDSデータベースを複製し、検証・開発する必要があります。そこで、瞬時に新しいデータベースを作れるように、
AWS CDKでデータベースを作成するスクリプトを作ります。


## 1. How to code

```Typescript
import AWS = require("aws-sdk");
AWS.config.update({ region: "ap-northeast-1" });
const rds = new AWS.RDS();

function rdsGenerator() {
    const rdsParams = {
        DBInstanceIdentifier: "production-replica-fortools",
        DBInstanceClass: "db.m3.medium",
        AvailabilityZone: "ap-northeast-1a",
        Engine: "mysql",
        MasterUsername: "MYACCOUNTID",
        MasterUserPassword: "MYPASSWORD",
        AllocatedStorage: 10,
        PubliclyAccessible: false,
        DBSubnetGroupName: "default-vpc-9qe6ce5d",
        VpcSecurityGroupIds: ["sg-eqweq5b9b"],
        StorageType: "standard"
    };

    rds.createDBInstance(rdsParams, function(err, data) {
        if (err) {
            console.log("error. Failed to create database instance", err);
        } else {
            console.log("successfully create database instance ", data);
        }
    });
}

rdsGenerator();
```
Javadoc生成　エラー: この文字は、エンコーディングMS932にマップできません

# 状況
Javadocを作ったが、エンコードエラーが発生した
（エラー: この文字は、エンコーディングMS932にマップできません）

- ソースコードはUTF-8

# 解決方法
Javadoc生成時に、以下のオプションを設定する。
-encoding UTF-8
-charset UTF-8


![javadoc_option.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467228/de95b56d-8ea0-bef9-f694-a6f7020ee735.png)
LaravelのMigrationファイルをまとめる

# 概要
Laravelで開発を続けているとMigrationファイルが溜まってくると思います。
Migrationにカラムの追加、変更、削除、テーブルの削除などが溜まっていくと、開発時などに不必要なMigrationの工程が増えてしまいます。

ある程度Migrationが溜まってきたら、どうせもうrollbackしないし、開発環境での実行とかのことも考えると、過去のMigrationをまとめたほうが、Migrationの実行時間が短くなって良いですね。

実際に開発中のプロジェクトでではMigrationにかかる時間が__3分の2に減りました。__

# やり方
Migrations Generatorを使います。

[Xethron/migrations-generator](https://github.com/Xethron/migrations-generator)

最終のリリース2年前だし大丈夫なのか？と疑いましたが、ちゃんと動きました。

仕組みとしては今あるDBの情報をマイグレーションファイル化するという仕組みです。なので、自分たちがいたMigrationファイルを元にMigrationを作ってくれるわけじゃないです。

逆に言うと今までMigrationを使っていなかったプロジェクトでも、これを使えばMigrationでの運用に移行できます。

## インストール

`composer require --dev "xethron/migrations-generator"`

## 実行

`php artisan migrate:generate`

これで今のDBの状態からMigrationファイルを作ってくれます。

## 過去のMigrationファイルとmigrationsテーブル内の履歴を削除する
過去分のmigrationsと内容が被るので、Migrationファイルとmigrationsテーブル内の履歴を削除します。

# 追記
細かく使ってみましたが、以下の点で問題があるので万能ではなさそうです。

- tinyint型がlengthに限らずbooleanに変換される
- created_at、updated_at以外のtimestamp型がdatetime型に変更される

これらは全て内部で使っているdoctrineの影響です。
doctrineではmysqlのtinyint型はbooleanに変換される、mysql固有のtimestamp型はdatetime型に変換されます。

ここらへんが問題ない場合はお使い下さい。
【#LINE】 LIFF v2 (LINE Front-end Framework v2) を使って 2次元バーコード(QRコード)を読み取る

# 概要

今までのLIFF v1 ではできなかった 2次元バーコードの読み取り機能が LIFF v2 に登場したので、サンプルアプリを使ってQRコード読み取りを試してみます。

# 前提条件

- LINE Messaging API を利用できるアカウントを持っていること
- Heroku アカウント

# LIFFとは

公式のから引用

>LINE Front-end Framework（LIFF）は、LINEが提供するウェブアプリのプラットフォームです。このプラットフォームで動作するウェブアプリを、LIFFアプリと呼びます。

https://developers.line.biz/ja/docs/liff/overview/

# 試す

## サンプルアプリのデプロイ
LIFF v2のサンプル を Heroku にデプロイします。

https://github.com/line/line-liff-v2-starter/blob/master/README.md

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/0cc8037b-2e2d-b5f6-0435-6605c1072987.png)

ログイン後必要な情報を入力（ここで新規Herokuアカウントを作ることも可能です）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/a19e6854-b581-1585-de26-358ad2d4c0db.png)

デプロイ (Deploy app) します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/08db6d64-66d0-13b9-1005-c676964b6acc.png)


## LIFF アプリの作成

作成したアプリのURLを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/333b8251-c545-53fb-879f-7161274b2ec3.png)
今は設定情報が正しくない為正しい画面は表示されません。(setting から確認することもできます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/eb33fa7e-25d8-d152-13a6-c51f40adbd58.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/a43bb1d2-53e9-f913-446a-71c865c9e1c2.png)

作成後　LIFF ID を保管します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/7216d6ba-7943-6578-7d27-a01ea299ec05.png)

line://app/{liffId}.です。

## サンプルアプリの設定
環境変数（LIFFに必要な情報）を設定するためにダッシュボードに遷移し先ほど保管した LIFF ID を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/8913f7af-d291-affd-29e4-448a5aadd0cc.png)

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/74703d18-94e9-f0c5-1625-377c95dc1a88.png)

KEY に MY_LIFF_ID
VALUE に 先ほど保管した LIFFID
を入力し追加(Add)します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/d257a7a1-133a-a9c0-8ec3-6dfe4e232d19.png)

以上で完了です。
LINE 上で LIFF を開き、動作を確認しましょう。

# 動作検証

基本はLINEで友達登録などを開くときと同じ(LINE 公式的には隠されていた機能のはず)QRコードリーダーが開かれます。
その為、Android の場合は URL 以外の値は形式エラーとなり取得できません。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183354/45cc9edc-561e-2fca-e8e1-eabee15fdf2e.png)

# 感想

LIFF で QRコードを読むのは結構な人が待っていた機能ではないでしょうか？
LIFF v2 になり他にも新たに追加された機能が多数あるので試す予定です。

注意点として、 これまであった LIFF v1 は公式ドキュメントにもある通り廃止予定との事ですので、移行するようにしましょう。
WSL + Ubuntu + dockerで環境構築

# はじめに
windowsでのローカル開発環境構築に死ぬほど手間取ったためまとめておきます。

## やりたいこと
wslのubuntuでlaradockを使ってlaravelローカル環境を作りたい。
#### 但し書
- 今回利用したプロジェクトには、すでにlaradockがインストール済みのため、その直前までの手順を記す。

# 環境
- Windows 10 Pro
    - docker Desktop 2.1.0.1
    - Engine 19.03.1
    - compose 1.24.1
- Ubuntu 18.04.3
    - docker 19.03.3
    - docker-compose 1.17.1

**dockerはwindowsとubuntu両方に入れておくこと。**

# windows の dockerの設定
1. Settings < General
    - Expose daemon on tcp://localhost:2375 without TLSにチェックを入れる
2. Settings < Shared Drives
    - Cにチェックを入れる

3. ホスト指定

```
ery@DESKTOP:~$ echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc
```

# WSL + docker for Windows
### docker for windowsのデーモンを利用して、WSL上でdocker動かす

- wslでマウントする設定を記述。
- 設定を反映させるため、Windowsを再起動する。

```
ery@DESKTOP:~$ sudo vi /etc/wsl.conf
[automount]
root = /mnt/
options = "metadata"
```

- windowsのC:ドライブがWSLのrootした場所からアクセスできることを確認する。

```
ery@DESKTOP:~$ cd /mnt/c/
ery@DESKTOP:/mnt/c$ ls
....
```

- この配下にプロジェクトを設置(個人的にもう1つディレクトリ作成して実施)

```
ery@DESKTOP:/mnt/c/linux_projects$ git clone git@hogehoge.git
```

- clone したプロジェクトにはすでにlaradock導入済みだったため、laradock配下まで移動。

- docker立ち上げ
 `docker-compose up -d nginx mysql redis beanstalkd`

- コンテナ内に入って、composerでlaravel導入
  `docker exec -it laradock_workspace_1 bash`
  `composer install`

### 参照
https://qiita.com/endo_hizumi/items/0cc50bdfbd827579733e
https://qiita.com/gentaro/items/7dec88e663f59b472de6
https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly
https://docs.microsoft.com/ja-jp/windows/wsl/faq
macOS Catalinaのターミナルでの「デフォルトのシェルがzshになりました」というメッセージを抑止する方法

macOS Catalinaにアップデートしてからターミナルを開くと毎回鬱陶しいメッセージが表示されるようになった。

```
The default interactive shell is now zsh.
To update your account to use zsh, please run `chsh -s /bin/zsh`.
For more details, please visit https://support.apple.com/kb/HT208050.
```

これを抑止する方法。

~/.bash_profile に以下の１行を追加。

```
export BASH_SILENCE_DEPRECATION_WARNING=1
```

[元記事]

https://apple.stackexchange.com/questions/371997/suppressing-zsh-verbose-message-in-macos-catalina

ps.
zshはbashと（ほぼ）コンパチブルというようなことがどこかに書いてあったが、試したところいくつか動かなくなるスクリプトがあったので、すぐにbashに戻した。
Sentryで 413 (Request Entity Too Large) と怒られたので対処（React × Redux）

React×ReduxでWebアプリを作って、そこにSentryをいれています。
なにかエラーが出たときにReduxのStateとともにログが送信されて非常に便利。


しかしながら、最近エラーの送信時に `413 (Request Entity Too Large)` という返ってくるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26383/c910ef7f-ee23-4c0d-6eeb-41fa8df40e6c.png)

おそらくAPIから獲得したテーブルのデータを全部Redux Stateに入れてるせいで、サイズが大きくなりすぎてしまったのでしょう。
なにか問題が起きたかどうかすら検知できないのは不便が過ぎます。
しかも、エラーの解析をするのにテーブルの中身はほとんど必要ないはず。

Sentryにデータを送るときにStateの中からエラーの解析に必要のないデータを削除して、サイズを小さくして413で怒られないようにしましょう。

# 方法

たぶん、Sentryを入れてる部分ってこんな感じになってると思います。

```js
import { createStore, applyMiddleware, combineReducers } from 'redux';
import reducer from '../reducers/index';
import Raven from 'raven-js';
import createRavenMiddleware from 'raven-for-redux';
import thunk from 'redux-thunk';

export default function configureStore() {
  Raven.config(SENTRY_KEY).install();
  const middlewares = [thunk, createRavenMiddleware(Raven, {})];

  return createStore(
    combineReducers(assign({}, reducers)),
    applyMiddleware(...middlewares)
  );
}

```

変更するのはcreateRavenMiddlewareの部分

```js
  const middlewares = [thunk, createRavenMiddleware(Raven, {})];
```

ここの第2引数にはいろいろとオプションをつけられます。
で、オプションの一つに`stateTransformer`というStateの変換を行うためのオプションがあるんですね
https://github.com/captbaritone/raven-for-redux/blob/master/README.md#statetransformer-function

このオプションを入れるとこんな感じ

```js
  const middlewares = [thunk, createRavenMiddleware(Raven, {
    stateTransformer: (state) => {
      // いらないデータを消す
      const returnState = state;
      delete returnState.table;
      delete returnState.bigData;
      delete returnState.largeData;
      return returnState;
    },
  })];
```

これでいらないデータをエラーログに含まないようになり、 `413 (Request Entity Too Large)` を解消することができました。

##注意すべき点
第1引数に入ってくる`state`をいじっても、元のstateには何も影響を及ぼさないので、「何かエラーが起きたときにstateを調整して、怪しいデータを削除」みたいなことはできません。

逆にstateを直接書き換えてしまっても問題は起きないということなので、それはそれで安心かも。

同じエラーで困ってる人のお役に立てれば幸い。
JavaScriptの==と===の違い

JavaScriptには `==` と `===` という演算子がありますが、これらは挙動が違います。

`==` は等価演算子といい、左右の型が異なる場合、暗黙的に型変換を行います。

```js
1 == '1' // true （文字列の '1' が数値の 1 に変換されるため）
```

`===` は厳密等価演算子といい、左右の型が異なる場合でも暗黙的に型変換を行いません。

```js
1 === '1' // false
```

暗黙的な型変換はバグを生みやすいので、JavaScript において `==` を利用することは推奨しません。おとなしく `===` を利用しましょう。

### `==` が使える場合

`==` が使われるケースとして、`null` と `undefined` のチェックがあります。

```js
if (val === null || val === undefined) {
  // 何か処理
}
```

この場合、

```js
if (val == null) {
  // 何か処理
}
```

と書くことによって暗黙的な型変換により、`undefined` のチェックも同時に行ってくれます。

しかし、個人的には明示的に比較したほうがわかりやすいと思うので、（紹介しておいてアレですが）前者の比較のほうが好みです。

ちなみに、少ないサンプルですが以前アンケートをとったときもこのように `val === null || val === undefined` での比較をする人の方が多かったです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">JavaScript で null or undefined のチェック</p>&mdash; Yuki Terashima (@y_temp4) <a href="https://twitter.com/y_temp4/status/1100363455050076160?ref_src=twsrc%5Etfw">February 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ラスター地図タイルサーバーを作ってみた

# はじめに

[静的地図サービスを作ってみた](https://qiita.com/task_jp/items/6c57c7fc33ad9b63751d) の派生でできた [ラスターマップ](https://task-jp.github.io/rastermap/) の説明です。

## 地図タイルとは？

Google Maps をはじめ様々な地図サービスで採用されている、地球を正方形のタイルで表現するための仕組みです。

詳細は [国土地理院 地図タイル仕様](https://maps.gsi.go.jp/development/siyou.html) や [OSM のタイル](https://wiki.openstreetmap.org/wiki/JA:タイル) をご覧ください。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/28f5b942-dc90-9944-4e7d-3ea2bb5ec3ec.png)
> [国土地理院 地図タイル仕様](https://maps.gsi.go.jp/development/siyou.html) より引用

# 開発

## 地図タイルサーバー

任意の範囲の地図の描画の機能は [静的地図サービスを作ってみた](https://qiita.com/task_jp/items/6c57c7fc33ad9b63751d) で実装済みなので、残りは `{style}/{z}/{x}/{y}{r}.{ext}` から緯度経度の範囲に変換して、描画した地図を返すだけです。
※ `{r}` は Retina Display 用のパラメータで、`@2x` などの値が入ります
※ `{ext}` は今回は `png` です。

## 表示側

[Leaflet](https://leafletjs.com/) を利用しています。
もともと地図描画のデバッグ用に作ったものなので、右クリックで OSM の編集画面を開きます。

# パフォーマンスチューニング

## 地図タイルのキャッシュ

リアルタイムで地図描画した結果を返しているのですが、地図データ自体はそれほど頻繁に変わるものではない（というか更新の予定がそれほどない）ので、上記の描画結果を HDD にキャッシュとして保存するようにしました。

1. キャッシュが見つかった場合はそれを返す
2. 地図を描画し、キャッシュに保存し、返す

という流れです。

## 地図タイルのキャッシュの最適化

生成された png ファイルを [zopflipng](https://ja.wikipedia.org/wiki/Zopfli) を利用してバックグラウンドで最適化したものを別のキャッシュとして生成しています。

1. zopflipng キャッシュがあればそれを返す
2. 自分で生成したキャッシュがあればそれを返す
3. 地図を描画し、キャッシュに保存し、返す

という感じです。

zopflipng は `--iterations=20 --filters=0me` オプションを指定していて、地図画像の場合は概ね30%程度サイズを減らすことができています。

## 地図タイルサーバーの並列化

サーバープログラムは [QtHttpServer](https://qiita.com/task_jp/items/fe1a4f5c4724a3eca303) を雑に使っていて、1プロセス１スレッドで動くようなものになっています。

それを [GNU parallel](https://ja.wikipedia.org/wiki/GNU_parallel) で10プロセスほど動かし、nginx の upstream に指定して動かしています。

## データベースの速度の改善

データ量の関係で、DB の本体は HDD 上で動かしているのですが、地図描画時の問い合わせで IO がボトルネックになっていたので、PostgreSQL の [ロジカルレプリケーション](https://www.postgresql.jp/document/11/html/logical-replication.html) 機能を利用して、描画時に必要なテーブルのみを SSD 側に複製し、そちらを参照するようにしました。

# TODO

フロントエンドは daemon 化をするなり Docker 化をするなりして、もう少し雑さを減らしたい。
phalcon 3.4 でMySQL（MariaDB）を使うときのTips

phalconでMySqlを使う場合、
だけではないと思うけど、Laravelでも同じ現象が報告されている

[🚨Laravel 絵文字が通らない問題](https://error-search.com/error-post/detail/332/%25F0%259F%259A%25A8Laravel%2B%25E7%25B5%25B5%25E6%2596%2587%25E5%25AD%2597%25E3%2581%258C%25E9%2580%259A%25E3%2582%2589%25E3%2581%25AA%25E3%2581%2584%25E5%2595%258F%25E9%25A1%258C)


```
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF0\x9F\x94\xB5\xE3\x81...'
```



勝手にDatetimeって判定してる。。。

可能性としては、phalconでもLaravelでもPHPなんで、mysql or mariadbのClientあたりの設定？
と思って調べてみても、my.cnfは、サーバー側、クライアント側共にutf8mb4が指定されている。


エラーメッセージで一瞬混乱してしまって、テーブル定義を疑ってしまうかもしれないのでしっかりとメモを残しておく。
これは絵文字入れたときにutf8に入ってないのでダメですよってことです。
utf8mb4これを指定してあげればOK

一部抜粋。

```
return new \Phalcon\Config([
    'database' => [
        'adapter' => 'Mysql',
        'charset' => 'utf8mb4',
    ],
```

しかし、これまでutf8でも絵文字が通ってたんだけどな。

設定からすると、これまではPHP7.2だったのを7.3にしたからかな。厳密にチェックするようになったのかな。
しかし、誤作動というか間違ったエラーメッセージは困りますな。
vue-cli-service: command not found と言われて困ったときの備忘録

```
vue-cli-service: command not found
```
と言われて困ったときの備忘録

```
rm -rf node_modules && yarn install
```
を試すも改善せず。

```
rm -rf node_modules package-lock.json && yarn install
```
で改善した。ふー。
Python学習

# ファイルの入出力

## ファイルの読み込み

* ファイルの読み込みには２種類の方法がある

  * 文字として読み込む
  * バイナリ(Byte型)として読み込む

## ファイル制御モード一覧

|mode &nbsp;|意味|
|:--:|:--|
|`r`|読み込み用に開く (デフォルト)|
|`w`|書き込み用に開き、まずファイルを切り詰める|
|`x`|排他的な生成に開き、ファイルが存在する場合は失敗する|
|`a`|書き込み用に開き、ファイルが存在する場合は末尾に追記する|
|`b`|バイナリモード|
|`t`|テキストモード (デフォルト)|
|`+`|ディスクファイルを更新用に開く (読み込み／書き込み)|

|応用|意味|
|:--:|:--|
|`rb`|バイナリで読み込み|
|`wb`|バイナリで書き込み|

## 文字列として読み込む方法

```text:text.txt
abc
```

```python:read.py
# ファイル名を指定
filename = "text.txt"
# 第一引数にファイル名
# 第二引数にファイルの制御モードを指定
# キーワード引数(encoding)には読み込みたい文字コードを指定する
# 制御モードについては上記を参照
# その他の引数についてはURLを参照
# https://docs.python.org/ja/3/library/functions.html#open
with open(filename,"r",encoding="utf-8") as f:
    print(f.read())
>> abc
```

## バイナリを読み込む方法

```text
abc
```

```python:bytes.py
filename = "binary.bin"

with open(filename,"rb") as f:
    print(f.read())
>> b'abc'
```

バイナリモードでファイルを読み込むと、バイト型となっているため、文字列として扱う場合は

```python:bytes2text.py
text = binary.decode()
```

バイト型から文字列型へ型変換を行う必要があります。

## 文字列を書き込む方法

```python:text.py
filename = "text.txt"
with open(filename,"w",encoding="utf-8") as f:
    f.write('abc')
```

```text:text.txt
abc
```

## バイト型で書き込む方法

```python:binary.bin
filename = "binary.bin"
with open(filename,"wb") as f:
     f.write('abc'.encode())
```

```text:binary.bin
abc
```

バイト型で書き込むには文字列をバイト型に変換する必要があります。

```python:text2bytes.py
binary = text.decode()
```

※社内学習向けに記載した記事を全体公開
TypeScriptでCircleCIのステータスを表示するVSCode拡張機能を作った

タイトル通り、TypeScriptで「CircleCI Status」というビルドステータスとかを表示できるVSCode拡張機能を作って公開しました！
「Circle CI」とかで検索すれば出てくると思うので、ぜひ使ってみてください！（アイコンがまだないので若干寂しいです）

- Marketplace  
https://marketplace.visualstudio.com/items?itemName=kuromoka.circleci-status
- GitHub  
https://github.com/kuromoka/circleci-status

機能の一部分のスクショです。
<img width="603" alt="65831450-77201680-e2f4-11e9-8cba-7bad933834b7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232357/1c5f58d1-15b7-b740-61f4-b827697b0996.png">

元々は勉強会の話のネタとして作っていたのですが、このときはまだ完成しておらず開発中でした。
[We Are JavaScripters! @36th で登壇してきた #wejs](https://kuromoka16.hatenablog.jp/entry/2019/10/03/102108)

## 機能
細かくは[GitHubのREADME](https://github.com/kuromoka/circleci-status/blob/master/README.md)に書いていますが、ざっくり以下のようなことがVSCode上できるようになります。

- 直近ビルドの成功や失敗などのステータス表示
- 直近ビルドのやり直し
- 過去ビルドの一覧表示とCircleCIのビルドページへのリンク

## 使用技術
TypeScriptを初めて使いました。TypeScriptは触れてみたいと思いつつなかなか機会に恵まれなかったので、使うきっかけとしてVSCodeの拡張機能の開発をやってみました。
最初に[Your First Extension](https://code.visualstudio.com/api/get-started/your-first-extension)に書かれているジェネレータでひな形を作って、それを元にTypeScriptでカスタマイズしていく流れで進めました。

## CircleCI API
CircleCIのステータスを表示するのに、APIを使っています。以下の公式ドキュメントを参考にしました。
https://circleci.com/docs/api/#circleci-api

余談ですが開発中は`v1.1`ベースの内容だったのでコード上でも`v1.1`のエントリーポイントを呼び出しているのですが、ちょうど最近`v2`ベースのドキュメントに更新されたようです（なのでどこかでアップデートしたい）。

## 拡張開発の公開
公開する前に、Marketplaceのページで表示されるGitHubリポジトリや検索用のキーワードなどを、`package.json`に定義しておきます。[Extension Manifest](https://code.visualstudio.com/api/references/extension-manifest)に詳しく書かれています。特に`publisher`フィールドは公開するのに必須らしく、少し手間取りました。
公開作業については[Publishing Extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension)を参考にしました。

## 最後に
TypeScript初めてでしたが、なんとか動くものが作れてまず良かったです！
普段はPHPを書いていてそのときもVSCodeを使っているんですが、TypeScriptを書いていると補完がガンガン効くのでとても快適にコーディングできました。
今後はワークフロー機能やBitbucketへの対応などをやっていきたいなーと思っているので、今後もウォッチしていだけると幸いです！
CloudFormationでUnable to load paramfileエラー

# 最初に
AWS CliでCloudFormationのスタックを作成しようとしたときにエラーが発生したのでメモ。

```terminal:実行したコマンド
aws cloudformation update-stack --stack-name XXXXXXXXXXX  --template-body file://XXXXXXXXX.yaml
```

```terminal:エラー内容
Error parsing parameter '--template-body': Unable to load paramfile (XXXXXXXXX.yaml), text contents could not be decoded.  If this is a binary
```

# 結論
ファイルの文字コードが原因。
テンプレートファイルのyamlにコメントで日本語を記載していた。ファイルの文字コードがUTF-8になっていた。
ファイルの文字コードをSJISにしたら解消しました。
sklearnのPCAの再現性についてメモ

scikit-learnのversionは0.21.3。
random_stateを指定しても、explained_variance_ratio_が同じ値の軸があると、transformの結果が一意でない。
当然といえば当然な気がするけど、最初再現性がない理由がわからなくて戸惑った。
今は、explained_variance_ratio_内に重複がないか確認している。
SwiftLintで引っかかったエラーの種類ごとに集計するワンライナー

# 経緯
SwiftLintを導入するにあたり、autocorrectで修正されない部分を修正するのにルールごとの違反数単位で優先度を付けたかった
(あまりにも違反数が多い場合は一旦disableにして追々有効にして直す等の回避策も考えられるように)

# 愚直に書いた結果

```shell
swiftlint --quiet | awk '{ print $NF }' | sed -E 's/^\((.+)\)$/\1/g' | sort | uniq -c | sort | awk '{ printf "%s : %s\n",$2,$1 }'
```

<details><summary>出力結果(例)</summary><div>

```shell
class_delegate_protocol : 1
empty_string : 1
prohibited_super_call : 1
unused_capture_list : 1
unused_setter_value : 1
contains_over_filter_count : 2
function_parameter_count : 2
large_tuple : 2
valid_ibinspectable : 2
contains_over_filter_is_empty : 3
control_statement : 3
fatal_error_message : 3
multiline_parameters : 3
reduce_boolean : 3
syntactic_sugar : 3
discouraged_direct_init : 4
sorted_first_last : 4
vertical_parameter_alignment_on_call : 4
collection_alignment : 6
nesting : 6
operator_whitespace : 7
reduce_into : 7
toggle_bool : 7
for_where : 8
unavailable_function : 8
yoda_condition : 10
cyclomatic_complexity : 11
weak_delegate : 11
unneeded_break_in_switch : 12
first_where : 15
multiline_arguments : 30
private_action : 39
todo : 55
```

</div></details>

# 余談
`sort | uniq -c` の代わりに `awk` で集計する方法もあるみたいだけど、どうしても欲しい結果(件数順にソートして欲しいフォーマットで出力)にならなかったので諦めた😔

<details><summary> 格闘の様子</summary><div>

```shell
swiftlint --quiet | awk '{ print $NF }' | sed -E 's/^\((.+)\)$/\1/g' | awk '{ v[$0]++ } END { for ( k in v ) print k ": " v[k] }'
```
ソートも何もされてないので論外

```shell
brew install gawk
swiftlint --quiet | awk '{ print $NF }' | sed -E 's/^\((.+)\)$/\1/g' | awk '{ v[$0]++; n = asorti(v, s) } END { for (i=1;i<=n;i++) print s[i] ": " v[s[i]] }'
```
キー(エラー種別)でソートされる(違う、そうじゃない)

```shell
lint --quiet | awk '{ print $NF }' | sed -E 's/^\((.+)\)$/\1/g' | awk '{ v[$0]++; n = asorti(v, s); for (i=1;i<=n;i++) a[i] = v[s[i]] ": " s[i]; asort(a) } END { for (x in a) print a[x] }'
```
文字列ソート扱いになった結果 `1->20->2` みたいな出力になってｵﾜﾀ＼(^o^)／

</div></details>

誰か `sort | uniq -c` 使わずに綺麗に書けた方いたら教えて下さい🙏

# 参考
https://qiita.com/kazinoue/items/e7b98512186bace00097
http://tounderlinedk.blogspot.com/2010/09/asorti-awk.html
https://qiita.com/eumesy/items/3bb39fc783c8d4863c5f
EntrySetが便利な件

##Map
ListとMapといえば有名なアレですけども
ListならできるのにMapのkeySetならできないみたいなこと、実は結構おおくて不便に感じません？

そんなときにEntrySetです

keySetより処理早いらしいので何もなくてもおぬぬめ

##やってみよう

```EntrySet.java
package entrySet;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

/**
 * To practice Map
 * 
 * @author me
 *
 */
public class practiceMap {
	/**
	 * main
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		run();
	}

	/**
	 * run

	 * @throws NumberFormatException if conversion to numeric number is impossible.
	 */
	private static void run() throws NumberFormatException {
		int sum = generate.get().entrySet().stream().filter(Objects::nonNull).map(avoidNullSum)
				.collect(Collectors.summingInt(Integer::intValue));
		echo.accept(sum);
	}

	/** Generate Map */
	static Supplier<Map<Integer, String>> generate = () -> {
		Map<Integer, String> map = new HashMap<Integer, String>();
		map.put(null, null);
		map.put(1, "1");
		map.put(2, "2");
		map.put(3, "3");
		map.put(4, "4");
		map.put(5, "5");
		return map;
	};
	/** Avoid null and sum */
	static Function<Entry<Integer, String>, Integer> avoidNullSum = v -> Optional.ofNullable(v.getKey()).orElse(1)
			+ Integer.parseInt(Objects.toString(v.getValue(), "1"));
	/** Output */
	static Consumer<Object> echo = v -> System.out.println(v);

}

```

主にここに注目です

```.java
	/** Avoid null and sum */
	static Function<Entry<Integer, String>, Integer> avoidNullSum = v -> Optional.ofNullable(v.getKey()).orElse(1)
			+ Integer.parseInt(Objects.toString(v.getValue(), "1"));
```

null回避してるので見にくいかもしれませんが
EntrySetとは、<key, value>のSetのことで
繰り返し処理中のみつかえるものです。
ようは
<b>List&lt;Integer, String&gt;</b>
みたいなもんです

&lt;Integer, String&gt;の組み合わせを一つずつあつかうループになるわけですね

こっちのがわかりやすいかもです

```Wakaru.java
package entrySet;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Supplier;

public class Wakaru {
	public static void main(String[] args) {
		for (Entry<Integer, String> model : generate.get().entrySet()) {
			model.getKey();
			model.getValue();
		}
	}
	/** Generate Map */
	static Supplier<Map<Integer, String>> generate = () -> {
		Map<Integer, String> map = new HashMap<Integer, String>();
		map.put(null, null);
		map.put(1, "1");
		map.put(2, "2");
		map.put(3, "3");
		map.put(4, "4");
		map.put(5, "5");
		return map;
	};
}

```

Optionalもstreamも捨てるとまじで旧時代のコードに見えてくる...w
google ColaboratoryでPCのカメラを使う

ちょっと感動したので広めたいと思う。
**colabでPCのカメラ(webカメラ)が使える！！しかもお手軽に！！**

#早速使おう
お手軽って本当にお手軽なところが素敵。

左上の ＞ をクリックして
![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357134/6b9ec0b6-77fc-25a7-1628-fe6b90dbddc3.png)

コードスニペットから、「Camera Capture」選択して挿入する。
![hoge2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357134/24265015-8886-b04a-cf02-bf297032fa00.png)

あとは挿入された二つのセルを実行するだけ。

これでYOLOとかの物体検出をcolab上でカメラに適用できるようになるかも？
コードスニペットを見てみると、他にも面白そうな機能がいっぱいありそうなので探索してみようと思う。
Macで色々環境構築

# gcc (C, C++コンパイラ)

アプリケーション -> ユーティリティ -> ターミナルを開いて以下をタイプします。

```
$ gcc
```

すると

```
xcode-select: note: no developer tools were found at '/Applications/Xcode.app', 
requesting install. Choose an option in the dialog to download the command line 
developer tools.
```

のようなエラーののち、以下のようなダイアログが出現します。素直にこれをインストールしましょう。
![スクリーンショット 2019-10-17 9.09.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335400/7bce2fa6-2d5b-20da-a669-cbab75134a24.png)

# Homebrew

[Homebrewのウェブサイト](https://brew.sh/index_ja.html)から「このスクリプトをターミナルに貼り付け実行して下さい。」部分をコピーし、ターミナルに貼り付け、そのままEnterで実行を行います。

```
$ brew doctor
```

とタイプしEnterを押して

```
Your system is ready to brew.
```

と返ってくれば、Homebrewのインストールは完了です。

# Python環境

## Python

[このリンク先](https://www.python.org/downloads/)からPython3.8のpkgファイルをダウンロードし、実行します。

その後ターミナル上で

```
$ python3
```

とタイプすると

```
Python 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

となって、無事にPython3環境が構築されたことがわかります。

## pip

[PyPI](https://pypi.org/)からモジュールをインストールしたりするための、パッケージ管理ライブラリです。デフォルトでは

```
$ pip3
```

で起動するようになっていますが、バージョンが古いのとわざわざ数字の'3'を打たなければならないなど、面倒なことが多いので

```
$ pip3 install --upgrade pip
```

とすることで、アップグレードとコマンドをpip3からpipに変更する作業が一度に行えます。

## Pipenv

```
$ pip install pipenv
```

でインストールできます。PipenvはPythonの仮想環境を構築するためのツールです。

# その他インストールしたもの

## Google Chrome

言わずと知れたウェブブラウザです。

## Sourcetree

弊社ではBitbucketを利用してコード管理を行なっているため、ブランチの状況がどうなっているかをこのGUIツールで可視化しています。

## Visual Studio Code

テキストエディタ。主にPython, C, C++のソースコード用です。
レガシーASPブラウザエラー表示方法

■IIS設定
・ASP設定
IISマネージャー起動 → サーバorサイトを選択 → ASP → コンパイルのデバッグのプロパティのブラウザへのエラー送信項目をTrueにする。

・エラーページ
サーバorサイトを選択 → ASP → 機能設定の編集 → ダイアログから詳細なエラーを選択

■インターネットオプション設定
IE → ツール → インターネットオプション → 詳細設定タブ → スクロール真ん中あたりのブラウズのHTTP エラーメッセージを簡易表示するのチェックを外す
Azureにて、IP→ドメインの逆引き設定をする



# Azure上のホストから送ったメールがrejectされる

Azure上にサーバを構築し、定期的にメールを送信する機能を実装。Azure単体ではメール送信できないため、送信する部分はSendGridを利用。

参考：
[Azureではメール送信できないし、メールサーバもつくれない](https://qiita.com/CloudRemix/items/e505e5cf790c981ec5ee)

cronで定時にメールを送っていたら、ある相手のサーバから、弾かれる。mail.logを見ると、（見やすいように改行入れています）

```
Oct 16 19:09:01 （ホスト名） postfix/smtp[57917]:
 A8D14809EC: to=<xxxxxxx>, relay=xxxxx[xxx.xxx.xxx]:25, （省略）
 status=deferred (host xxxxx.xx.xx.jp[xxx.xxx.xx.xxx] 
refused to talk to me: 450 4.7.1 Client host rejected: 
cannot find your reverse hostname, [自ホストのIP])
```

IPからホスト名を逆引きできないので弾きましたと。

まぁ、そうだね。逆引き設定しておこう。と思ったら、結構手こずりました。

# Azure Portal で DNSゾーン編集

すでに、該当ホストにてSendgrid用の設定や、その他DNSゾーンの設定を行っていたので、そこにPTRレコードを追加する。(PTRレコードの書き方については省略）

[PTRレコードとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12291.html)

よっしゃできたー！と思ったら、、、

**何時間経っても逆引きできない:skull:**

逆引きできるかできないかの確認は、nslooupで、ipを入力してhostが帰ってくればOK。

# Azure Portalだけでは、逆引き設定を完了できない

いろいろ調べたら驚きの記述が。

[Azure でホストされているサービスの逆引き DNS を構成する] (https://docs.microsoft.com/ja-jp/azure/dns/dns-reverse-dns-for-azure-services#add-reverse-dns-to-an-existing-publicipaddresses) より、

> Azure Portal を使った PublicIpAddress リソースの逆引き DNS の構成は、現在はサポートされていません。

ではどうするか。Power Shellか、Azure CLIを使ってコマンドで設定を変更する必要がある（やだなぁ～こわいな～:ghost:）

# Azure Portal > Azure CLIにてコマンド投入

Azure Portalの右上のコンソールアイコンから、Cloud Shellを開く。（Cloud Shellを初めて使う場合は、その分のstorageを最初に作る）

Cloud Shellは、Bashか、PowerShellかを選択可能。今回はBashを選択。

```
Requesting a Cloud Shell.Succeeded.
Connecting terminal...

Welcome to Azure Cloud Shell

Type "az" to use Azure CLI
Type "help" to learn about Cloud Shell

（アカウント名）@Azure:~$
```

次に、[Azure でホストされているサービスの逆引き DNS を構成する] (https://docs.microsoft.com/ja-jp/azure/dns/dns-reverse-dns-for-azure-services#add-reverse-dns-to-an-existing-publicipaddresses) をより

```
$ az network public-ip update --resource-group MyResourceGroup 
  --name PublicIp --reverse-fqdn contosoapp1.westus.cloudapp.azure.com.
```

を参考にして、自分のリソース名に置き換える

```
$ az network public-ip update --resource-group （リソースグループ名） 
  --name (パブリックIPアドレスのリソース名) --reverse-fqdn （逆引きしたいホスト名）
```

この--name欄が、PublicIpと書いてるので、最初IPアドレスを入れていたが、IPアドレスではなく、IPアドレスのリソース名を指定する必要がある（分かりづらい）

実行結果は、

```
The domain name label in the dnsSettings section of 
the public IP address (IPリソース名) is null or empty. 
If a dnsSettings section exists, its domain name label must not be null or empty.
```

# Azure Portalで"パブリックIPアドレス"リソースを編集

逆引きの元となるIPを管理しているパブリックIPアドレスのリソースを開き「構成」メニューを開く。

DNS名ラベル（オプション）

があるので、そこに自ホスト名を入力し保存。再度、コマンド投入

```
$ az network public-ip update --resource-group （リソースグループ名） 
  --name (パブリックIPアドレスのリソース名) --reverse-fqdn （逆引きしたいホスト名）
```
JSONのレスポンスがわーっと出てきたら成功。

nslookupやdigコマンドにて、IPアドレスからホスト名が引けたら設定完了:joy:

# Azure上のホストからIP→ホスト名の逆引き設定を行うための要点

* Azure Potarl上のDNSゾーン編集では、**逆引き設定(PTR)が出来ない**
* azコマンドの--name には、IPアドレスではなく、**パブリックIPアドレスのリソース名**を指定する
* パブリックIPアドレス リソース中にて、**DNSラベル名**を設定する

以上です。
GCP アップデート (10/11-10/17 2019)

### Composer: [Oct 8, 2019 日付不正?](https://cloud.google.com/composer/docs/release-notes#October_08_2019)
- 新しいバージョン(composer-1.7.7-airflow-1.9.0, composer-1.7.7-airflow-1.10.1, and composer-1.7.7-airflow-1.10.2)がリリース。
  - デフォルトがcomposer-1.7.7-airflow-1.9.0に。

### BigQUery: [Oct 9, 2019 日付不正?](https://cloud.google.com/bigquery/docs/release-notes#October_09_2019)
- arrayの中のどのビンに属するか教えてくれる、[Range_BUCKET](https://cloud.google.com/bigquery/docs/reference/standard-sql/mathematical_functions#range_bucket)が追加されたよ。
  - パーティション作ったり、MLでビニングしたい場合に使えそう。

### GKE: [Oct 11, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#october_11_2019)
- 新しいバージョンのお知らせ。
  - デフォルトがv1.13.10-gke.0になった。(前は1.13.7-gke.24)

### AI Platform: [Oct 11, 2019](https://cloud.google.com/feeds/ai-platform-deep-learning-vm-image-release-notes.xml)
- M36リリース。
  - TF2.0のイメージがexperimentalじゃなくなったよ。

### CloudSQL: [Oct 15, 2019](https://cloud.google.com/sql/docs/release-notes#october_15_2019)
- SQL Server for CloudSQLがベータになったよ。

### Spanner: [Oct 16, 2019](https://cloud.google.com/spanner/docs/release-notes#October_16_2019)
- Hibernate ORM使うときの[ガイド](https://cloud.google.com/spanner/docs/spanner/docs/use-hibernate)をリリースしたよ。

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
[量子コンピューター]Qiskitの使い方

基本的にはこの記事の解説となります。
https://quantum-computing.ibm.com/jupyter/tutorial/fundamentals/1_getting_started_with_qiskit.ipynb


##Getting Started with Qiskit

Qiskitでの作業の外観を提供する。Qiskitの基本的なパッケージはTerraである。これは量子コンピュータをプログラムするのに必要な基本的なブロックを提供する。Qiskitの基本的なユニットは量子回路(https://en.wikipedia.org/wiki/Quantum_circuit) である。Qiskitを用いた基礎的なワークフローは2つのステージからなる。**Build**と**Execute**である。**Build**はあなたが解きたい問題を表す異なる量子回路を作る。**Execute**はそれらを異なるバックエンドで実行する。ジョブが実行された後は、データが集められ結果が出力される。

- 本記事の目次
 - 回路の基礎
 - 回路の可視化
 - Aerでの回路のシミュレーション
 - IBM Q実機での実行

```python

import bumpy as np
from qiskit import *
%matplotlib inline
```

###Circuit Basics

####回路を作る

プログラムを書き始める上で基本要素は量子回路である。3量子ビットからなる`QuantumCircuit`を作成することから始める。

```python
#Create a Quantum Circuit acting on a quantum register of three quits
circuit = Quantumcircuit(3)
```


レジスターに回路を作り終わった後、レジスタを操作するためのゲート(オペレーション)を加える。ここでは3量子ビットのGHZ状態を作る量子回路を例にとって説明する。


<img width="597" alt="スクリーンショット 2019-10-12 18.16.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278640/810f74cb-9709-1579-45c3-e96f7f17295b.png">


このような状態を作成するために、私たちは3量子ビットの量子レジスターから始める。デフォルトでは、それぞれのレジスターの中にある量子ビットは0の状態になっている。GHZ状態を作るために、以下のような回路を適応させる。

 - アダマールゲートを0量子ビットにかける。すると、0と1の以下のような重ね合わせ状態となる。<img width="318" alt="スクリーンショット 2019-10-12 18.20.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278640/565268ad-6030-1160-2217-37ee39e2825e.png">
 - コントロールドノット(C-NOT)を0量子ビットと1量子ビットの間にかける。
 - 同じくC-NOTを0量子ビットと2量子ビットにかける。

理想的な量子コンピューターであれば、この回路を実行して得られる状態は上記のGHZ状態である。

----------------------------------------------------------
SQL小技集
https://qiita.com/ool/items/75da830e7373138c8125
UTCとJST
https://qiita.com/ool/items/6be9cc290c8ad9e0f5bc
今流行りの量子コンピューター
[量子コンピューター]Qisikitでアダマールゲートを実装する
https://qiita.com/ool/items/1a5041edddc11b14efc0
[Qiskitのアカウント認証の仕方]Qiskit IBMQ プロバイダー
https://qiita.com/ool/items/e80c1266cda68984a103
Qiskitの使い方
https://qiita.com/ool/items/2227d2d515caa5087752
[量子コンピューター]Qiskit Tutorials
https://qiita.com/ool/items/2a5038df1471635d442c
[git編]commit,pushの違いをゲームに置き換えて説明する

## この記事の目的

Gitについて、調べてもリモートリポジトリとか、ステージングとか専門用語ばっかで説明されることに飽き飽きしている人がいると思います。もっと短に感じて欲しくて図化しました。

## ローカルとリモート

ローカル：自分のパソコン

リモート：オンライン上のクラウド

もっと言うと・・・

ローカル：PS4

リモート：PlayStationNetwork

みたいなものだ。

## git commit　と　git pushの違いについて

git commitは進めたゲームのセーブデータをPS4(HDD)にセーブすること。

git pushはそのデータを更にPlayStationNetwork(クラウド)に保存すること。

![gitのイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453260/f9ea182f-c2f2-9257-74f7-016e3911bbd9.jpeg)

## 使い方

 git add ファイル名(特定のファイルの変更を記録) or $ git add .(全部記録)
 git commit -m "◯◯"(◯◯ってコメント付きでローカルに保存)
 git push origin ローカルリポジトリ名(PS4):リモートリポジトリ名(PlayStationNetwork)

## 終わりに

専門用語を使わずに概念理解をする、または説明するって難しいですね><

## 参考記事
https://teratail.com/questions/79531