OmniAICreator/Qiita-1.07M huggingface dataset:
経営者の皆さんにIBM cloud/node-red がクリスマスプレゼントになる話

本ブログエントリは IBM Cloud Advent Calendar 2019 に参加しています。
12/24 分のネタです。まったく外の出来事とは、関係ないネタですが
まあ、お付き合いください。
（社員のスキル高度化にお悩みの、
経営者さんにとってクリスマスプレゼントとなりますよう）

#要約：
年功序列のため成長戦略がない企業は、AIなど高度人材が圧倒的に少ない。
その会社の仕組みそのものは、変えようがないので、
IBM cloud/node-red を活用して今の人員のスキルのまま
高度な対応を実施させればいい。


#話の前に

[ＮＨＫ新会長　ネット常時同時配信「分かってない、勉強中です」]
(https://headlines.yahoo.co.jp/hl?a=20191210-00000083-dal-ent)

ネットの反応
>確かにトップの人間が事業の全てを理解しなければいけないわけではない
>だがこれから大事になるであろう事業を全く理解出来ていない人間をトップに据えるのは問題だ

#(1)課題
AIに対応できる高度人材が圧倒的に少ない。
![AI高度人材.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387051/b6f4e209-5c26-bb4b-9916-b4e4100cc039.png)


>急速に進化を遂げる人工知能（ＡＩ）分野では、研究、実用化する人材の獲得競争も激しさを増している。
>産業への応用や開発面で「周回遅れ」とされる日本にとっても、ＡＩ人材の確保は大きな課題になる”
[参照元](https://www.asahi.com/articles/ASM4K6GFCM4KULFA03D.html)

しかし、経済産業省の「IT人材の最新動向と将来推計に関する調査結果」によると、

"マクロな規模でのＩＴ人材（IT企業及びユーザ企業情報システム部門に所属する人材）は、
現在の人材数は約90万人、不足数は約17万人と推計された。
今後2019年をピークに人材供給は減少傾向となり、より一層不足数が拡大する"

とくに

>先端ＩＴ人材は、現在約9.7万人、不足数は約1.5万人であるが、2020年には不足数が4.8万人に拡大
[参照元](https://www.meti.go.jp/press/2016/06/20160610002/20160610002.html)

一言でいうと、年功ではなくスキルや能力で給与を決めることが、
日本企業の慣行に反するから、です。


#(2)原因
年功序列のせいです。

一方、年功序列の中で、最新の技術に対応できない人が増加しています。
つまり、年功序列がITも含め、スキル転換をスムーズに進めることを妨害してしまう。
（年がたてばたつほど偉くなるのですから、当然といえば当然）

かつ、事務部門のように、既存の提供業務をRPA（ロボティック・プロセス・オートメーション）を
使って自動化するという動きが活発化しており、転換できない人をさらに増加させています。

つまり、ヒトが大量に余っているにもかかわらず、ヒトが足りない、という状態なわけです。

この人手不足を解消していくためには、年功序列で終身雇用があったから有効であった再教育とは異なるアプローチが必要になってくるはずです。

###※成長戦略が”リストラです！”という企業に、優秀な人ほど残らない。
結果、人間関係”だけに依存する”人が残ることになる。

#（３）data
先進国のなかで、一番勉強しない日本の会社員
![勉強しない日本のサラリーマン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387051/37fbc930-c0f9-9f3d-9be7-e0e85cb22adf.png)
[参照元](https://newspicks.com/news/2647674/body/)

先進国のなかで、日本の会社員一番勉強しない理由についてこうあります。

>新卒一括採用、年功序列、終身雇用という「日本型雇用システム」において、
>社会人は勉強しても、報酬や待遇という形でその見返りが期待しにくい。
>これでは、勉強することに対する意欲が低下するのは自明の理

そりゃ、そうですよね、スキルや能力で給与を決めることが、
だめなのですから。

#（４）提案
今のスキルのままでもOKでは？

先ほどのコラムの先頭で、落合陽一氏がいい放った言葉。

>「5年前までは、修士論文レベルだった価値が、
>今では15歳ができるようになりました。
>8歳の年齢差がわずか5年でなくなる時代なのです」

高度化はどんどん進みます。年功序列のせいで意欲のない人に
追いつかせるのは無理です。
###（意欲のある人は、すでに出ていってます）

逆にいうと、今のスキルのまま高度な対応を実施させればいいのでは、ということ。
具体的には、AI導入障壁を消滅させることで、誰でも使いこなせるようにすることです。

#（５）AI導入障壁を消滅させるツール
AI導入障壁を消滅させるとは、IBM Cloud/node-red です。

node-red は、この”導入障壁を消滅させて、
まず誰でも使いこなせるようにする”ことに秀でたツールである、ということなんです。

簡単にいうと、Node-REDはビジュアルなフロー記述言語、
つまり、つなげるだけで実際に動かすことができます。

それがnode-red を押す理由です。

ではどこに導入すればいいのか？　結論から言うとマーケティングです。
以降は[こちら！](https://qiita.com/miraimeisatu/items/66b77e619e47b5443fd2)
Microsoft Learn 21日目

12月は、毎日 [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) を受講していこうという記録。
※受講後に書き込むので公開に間に合わないこと多々あります(アドベントカレンダーの意味ｗ)

12/21 は
**Core Cloud Services - Azure ネットワークオプション**
 - サイトを Azure にデプロイする

を受講。以下、簡易メモ。

# Core Cloud Services - Azure ネットワークオプション
## サイトを Azure にデプロイする
### e コマースサイトの概要
#### 疎結合アーキテクチャの利点
疎結合システムの構築に使用できるアーキテクチャパターンは、"n 層"である。
[n 層アーキテクチャ](https://docs.microsoft.com/ja-jp/azure/architecture/guide/architecture-styles/n-tier)では、アプリケーションが 2 つ以上の論理層に分割される。
アーキテクチャ上、上の階層は下の階層からのサービスにアクセスすることができるが、下の階層が上の階層にアクセスすることはできない。
階層は問題を切り離すのに役立ち、再利用できるように設計するのが理想的。
e コマース Web アプリケーションは、3層アーキテクチャに従っている。
・Web 層：ブラウザーを介して、ユーザーに Web インターフェイスを提供。
・アプリケーション層：ビジネス ロジックを実行。
・データ層：製品情報と顧客の注文を保持するデータベースとその他のストレージが含まれる。
iOS12のSafariでは属性セレクタのエスケープが解釈できない？

## 問題

iOS13のSafariでは動くのにiOS12のSafariで動かない、まさかのシンタックスエラー

<img width="809" alt="1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82438/cfc23ff8-800e-17f7-129d-0c8c60caae60.jpeg">

## 原因

横着してライブラリが生成する情報から属性セレクタを使って無理やり指定していた

```javascript
'input[name=export_diploma_supplements_form\\[export_type\\]]:first-child'
```

## 解決方法

横着せずIDなりクラスなりを定義してそれを用いて指定する

```javascript
'input.js-diploma-supplement-export-type:first-child'
```

## 感想

13にできない端末が生まれたから検証パターンが増えて地味に辛い

## 参考

* [jQueryセレクタのエスケープ](https://qiita.com/mk_summer/items/6eb745c7babf2abfc03c)
* [実機のMobile Safariのページデバッグについて](https://qiita.com/yuxx/items/a1b79bff45fba239f2f1)
listの中にlistを入れたい！

#今回の目的：Pythonのlist配列の中にlist配列を入れ込む
#####+=とappend()

```python
#外側のリスト配列の作成
db=[]
#内側のリストの個数をxに入れる
#手法１appendを使う
x=10
[db.append([])for _ in range(x)]
print(db)

結果:
[[], [], [], [], [], [], [], [], [], []]
```
appendは＋＝と違い，配列の一番後ろに要素を追加してくれます

 また，以下の方法でも同じことができます
(コメントで教えていただきました)

```python
#外側のリスト配列の作成
db=[]
#内側のリストの個数をxに入れる
#手法２
x=10
db = [[] for _ in range(x)]
print(db)

結果:
[[], [], [], [], [], [], [], [], [], []]
```
こちらのほうがすっきりしていますね
coq-hammerを試してみる

Isabelle方面から来た人間としてはやっぱりsledgehammerがほしいなー、と思うわけです。

そんなわけで探してみると、まさにそのものという感じの coqhammer というプロジェクトがあります。
[いかにも公式っぽいサイト](http://cl-informatik.uibk.ac.at/cek/coqhammer/)がありますが、[GitHubのREADME](https://github.com/lukaszcz/coqhammer)のほうがビルド・インストール方法など最新のものになっているので、とりあえず試すという場合にはこちらをみたほうがいいでしょう。

インストール方法はopamを使うのが一番簡単です。
coq-hammerを使うには当然事前にcoqを入れておく必要があります。最新のcoq-hammerはcoqのバージョン8.10を要求するので注意してください。

```console
$ opam repo add coq-released https://coq.inria.fr/opam/released
$ opam install coq-hammer
```

実際に動かしてみます。ここでは対話的環境であるcoqtopを使っています。

```
$ coqtop
Welcome to Coq 8.10.1 (December 2019)
```

まずは以下のようにしてhammerプラグインをロードします。

```
Coq < From Hammer Require Import Hammer.
[Loading ML file newring_plugin.cmxs ... done]
[Loading ML file omega_plugin.cmxs ... done]
[Loading ML file hammer_plugin.cmxs ... done]
```

動作確認用の関数を定義します。

```
Coq < Fixpoint pow a k :=
Coq <   match k with
Coq <   | 0 => 1
Coq <   | S(k') => a * (pow a k')
Coq <   end.
pow is defined
pow is recursively defined (decreasing on 2nd argument)
```

上で定義した関数について、成り立って欲しい性質を書いてみます。ここでは「全ての自然数 n にたいして `pow n 0 = 1` である」というのを書いています。

```
Coq < Theorem le1: forall n:nat, pow n 0 = 1.
1 subgoal

  ============================
  forall n : nat, pow n 0 = 1
```

ここで `hammer` コマンドを使うと裏側でproverが動き、タクティックを組み合わせて現在のゴールを解消するような自動証明をやってくれます。

```
le1 < hammer.
Replace the hammer tactic with: Reconstr.scrush
No more subgoals.
```

`Restart` を使うと `hammer` コマンドを使う前の状態に戻せます。ここで `hammer` が導き出したタクティックの組み合わせで証明をやりなおすことができます。

```
le1 < Restart.
1 subgoal

  ============================
  forall n : nat, pow n 0 = 1

le1 < Reconstr.scrush (** hammer *).
No more subgoals.

le1 < Qed.
le1 is defined
```

`Reconstr.scrush`はcoq-hammerが中で持ってるLtacです。

定義をみると (coq-hammerレポジトリの `theories/Tactics/Reconstr.v` にあります)

```
Ltac scrush := solve [ yisolve | eauto with yhints | scrush0 ].
```

みたいな感じで、あまりちゃんと読んでないですが単純化したり書き換えたりをいろいろ試して自動証明(auto)できる形まで持っていこうとしているっぽい。。？ ~~(ん、嬉しいんかこれ。。？)~~

「なんかわからんけどとりあえず証明できることはわかった！」みたいな状態になりたいときは便利かもしれません。

強者からのツッコミお待ちしています！
Elasticsearch Kuromoji Pluginを使用したindexの生成方法

以下のようにします。(Kuromoji Pluginインストール済み前提)

```bash
curl -H "Content-Type: application/json" -XPUT http://localhost:9200/[index名] -d '
{ 
    "settings": {
        "index": 
            { "analysis": 
                { "tokenizer": 
                    { "kuromoji_tokenizer" : 
                        { "type":"kuromoji_tokenizer" }
                    },
                    "analyzer": 
                    { "analyzer": 
                        { "type":"custom", "tokenizer": "kuromoji_tokenizer" }
                    }
                }
            }
        },
    "mappings": {
          "properties": {
            "[カラム名1]": {
              "type": "text",
              "analyzer": "analyzer"
            },
            "[カラム名2]": {
              "type": "text",
              "analyzer": "analyzer"
            }          }
      }
}'


```
オカンが「いつ帰ってくるの？」ってうるさいから。

#はじめに#
こんにちはqnoteのいがらsです。
急遽、都合によりアドベントカレンダー2回目の登場となります。
んで、仕事帰りに「何書こうかな〜〜」と思っていた所に、何通もLINE通知が、、、


**「いつ帰ってくんの？」**
**「何時に帰って来るの？？」**
**「返信は？？」**

オカンからの怒涛のLINEが来る。
「あゝ、とても~~うるさい~~笑」
そりゃ、心配してるのは分かる。
でも俺はもう21歳だ。仕事から帰ってるだけでこんなにLINE送って来るか？？
せっかく座った電車、寝させてくれ、、、、、

睡眠に落ちて行く最中ふと思った。
「どうにかして自動で送ってくんねーかな〜〜〜」

**「そうか！！！」**
俺は閃いた。
「あれを使おう。」




#うるさいオカン対策にとっても便利なIFTTT(イフト)#
IFTTTとは、「異なるプラットフォームを連携させる便利ツール」です。
例えば、twitterとInstagram、LINEとtwitter、InstagramとDropbox、などを連携させ、より便利に使えるようにする為のツール。
###連携させてどうするの？？###
って思った方もいるかも知れませんが、「IFTTT」の名前からその疑問を解いていくことができます。
「IFTTT」は『If This Then That』の略で、「もし、これをしたら、あれをする」という意味になります。
例えて言えば、instagramで画像投稿をしたらDropboxに画像を保存するなど、２つのプラットフォーム間で連携させる事により、より便利にする事ができる。


##これを使いオカン対策##
さあ早速始めていこう。
まず、[IFTTTの公式ページ](https://ifttt.com/)　にアクセスし、sign upを済ませる。
IFTTTの使い方としては「Applets」（アプレット）を検索して自分が使いたいものを見つけるか、Appletsを自分なりに設定するかの方法があります。
※Appletsとは、「どのプラットフォーム」で、「何をするのか」を指示するもの。

**今回は時間の都合上Appletsを検索して使用していきます。**
<img width="1271" alt="スクリーンショット 2019-12-18 16.43.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439150/471c1d08-fa59-44c9-71cc-2b88d4e0b8f3.png">
sign upが済んだら左上の「Search」から検索ができるので、自分がやりたいことを検索する。
次に、連携させたいプラットフォームの名前などを検索する。
そうすると、使いたいプラットフォームに関係するAppletを見つけることができます。

<img width="1229" alt="スクリーンショット 2019-12-20 13.17.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439150/df5d4132-e9a8-4e14-02e1-85e66a2386bf.png">

検索した中から好きなappletを選択していきます。
今回、僕が使うのがこちら。
<img width="867" alt="スクリーンショット 2019-12-20 13.23.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439150/2ed5bf17-3406-37ec-a6a2-f77f68463420.png">

このappletは地図と、LINEを連携させたものになっていて、「ある指定した地域を17:00~21:59の間に自分が通過したら指定したLINEの相手に自動でメッセージを送る」というもの。

##実際に使うには##
上の画像に「Connected」というスライドするボタンがあります。
こちらを右にずらすと、各プラットフォームの認証作業画面になります。
認証を終わらせると、LINEにこちらのアカウントからメッセージが届きます。
<img width="347" alt="スクリーンショット 2019-12-20 13.39.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439150/52c2cba5-b773-b748-056f-77d16bb7a313.png">
このアカウントを自分がメッセージを送りたいグループに招待しておく。
（そうすると、このアカウントからメッセージが届くのではないかと思っています。）
まだ僕自身が指定の時間帯に指定した場所を通れていないので検証はできていないのですが、おそらくこのアカウントから設定しておいたメッセージが出力されるのかなと思っています。
（検証が出来次第、追記予定）
##最後に##
これでようやくオカンからの「怒涛のライン通知」を防ぐことができるであろう。。。
アドベントカレンダー発表日までに検証ができなかった事は残念ですが、こうやって知らない知識を勉強して、実際に試してみて、それをアウトプットすることはとても楽しいなと思いました。
まだまだ勉強することは多いですが一つ一つしっかり身につけて、僕の今までの環境を変えてくださった方達に恩返しできればなと思います。
間違っているところ、文字化けなどありましたら教えていただけると助かります。
MySQLのGIS機能を手軽に試せるように、市町村の境界データを配布しています

# はじめに
本記事は [RDBMS-GIS(MySQL,PostgreSQLなど) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/rdbms_gis) の3日目です。

MySQLでは5.7でGIS機能をBoost.GeometryというC++のオープンソースライブラリを採用して再実装し、[8.0でも引き続き機能強化](https://www.slideshare.net/yoyamasaki/mysql-80gis)しています。本記事をきっかけにMySQLのGIS機能に興味を持ってもらえると嬉しいです。

# この記事で伝えたいこと
MySQLのGIS機能を手軽に試せるように、MySQLのダンプファイルの形式で以下データを配布しています。

　・e-Statで配布されている境界データのシェープファイルをogr2ogrを使ってMySQLに取り込んで、Spatialインデックスを追加したもの

　※配布先は[こちら](https://github.com/YoshiakiYamasaki/MySQL-GIS-Data-Japan-eStat)

# 背景
MySQLのGIS機能を使う時に、シェープファイル(GIS系のデータフォーマットの一つ)を取り込めると出来ることが広がります。そこで、シェープファイルを取り込む方法について以下の資料やQiitaの記事で解説していますが、事前にGDALをインストールしないといけない、など一般のMySQLユーザーには少し敷居が高くなっています。

　・[MySQL 8.0で強化されたGIS機能と使用事例のご紹介＋α](https://speakerdeck.com/yoshiakiyamasaki/mysql-8-dot-0deqiang-hua-saretagisji-neng-toshi-yong-shi-li-falsegoshao-jie-a)
　・[MySQL 8.0にシェープファイルを取り込んで、MySQL Workbenchでポリゴンの形を確認する](https://qiita.com/yyamasaki1/items/073450d6987565223ba0)

そこで、まずは手軽にMySQLのGIS機能を試してもらうために、MySQLに取り込んだ状態のデータの配布を始めました。以下のGitHubリポジトリで市町村の境界データを配布していますので、MySQLに取り込んでGIS機能を試してみて下さい！

　・[MySQL-GIS-Data-Japan-eStat](https://github.com/YoshiakiYamasaki/MySQL-GIS-Data-Japan-eStat)

今配布しているのはPOLYGONデータだけですが、より手軽に試せるように、POINTデータも配布できればと検討中です。(POINTとPOLYGONがあれば、「ある地域に含まれる〇〇を探す」、「2点間の距離を計算する」、など、試せることの幅が広がると思うので)

# 備考1
GDALのインストール方法については、以下のQiitaの記事が参考になります。

　・[MySQLに対応したogr2ogr(GDAL)をインストールする方法まとめ](https://qiita.com/miyauchi/items/87921eb3ad630db1624a)

# 備考2
OSM(OpenStreetMap)のデータをMySQLにインポートする方法については、以下のQiitaの記事が参考になります。取り込んだ市町村に含まれるOSMの建物データのPOLYGONやPOINTデータを取り込むと、試せることの幅が広がると思います！

　・[OSM の建物のデータをMySQL8系にImportしてQGISで表示してみた](https://qiita.com/mottie0911/items/9aa0705f83687d2ad112)
Java VS PHP VS Python VS Ruby

##古き良きツールはいまだに顕在

ITの世界は日々色々なものがリリースされてワクワクしますが
同時に**古き良きツールがなくなるか改悪化されることもしばしあります。**

私の中で改悪されたサービスは**Google finance**([リンク](https://www.google.com/finance))です。

以前は高機能チャートがついていて、様々なテクニカル指標を載せることができました。

しかし今はそのころの原型を留めておらず、検索エンジンの1便利機能になってしまいサービスとも呼べない代物になってしまいました。

今回は古き良き[Google Trend](https://trends.google.com/trends/explore?geo=JP)でIT界隈を調査したので共有させていただきます。
##Java Vs. PHP Vs. Python

5年間のこの4言語を比較すると以下のようになりました。
[調査結果のGoogle Trendのリンク](https://trends.google.com/trends/explore?date=all&geo=JP&q=%2Fm%2F05z1_,%2Fm%2F07sbkfb,%2Fm%2F060kv,%2Fm%2F06ff5)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/776898fc-bf82-5ef3-f332-d43fce4c77da.png)


Javaは依然として最も検索回数が多いです。しかしここ2，3年はPythonが急激にこれらふたつの言語より注目されるようになったことがわかります。

##Git Vs. SVN

以下は、運用管理で使われているツールの過去5年間の検索トレンドです。
[調査結果のGoogle Trendのリンク](https://trends.google.com/trends/explore?date=all&geo=JP&q=%2Fm%2F05vqwg,%2Fm%2F012ct9,%2Fm%2F0464wfc,%2Fm%2F0wkcjgj,%2Fg%2F11b7lxp79d)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/fdf9626d-a746-392f-38bf-6b5ac794beec.png)

Subversionによるバージョン管理のみの運用は下火になり、
Githubなどのリポジトリ運用へと切り替えが進んでいる、
同時に、一度作った環境をDockerでコンテナ化して効率化する動きが増えている、
更に、複数のDockerコンテナを管理するKubernetesの需要が右肩上がりに増えています。
Redmineも悲しいことに下火のようです。

##備考
チャートが急落している部分はGWと年末年始です。

##更新履歴
- 2019/12/20 新規作成
- 2020/1/1 Google Trendの調査結果のリンクを追加しスクショ撮り直し
blueqatでDeutsch-Jozsaのアルゴリズム

## この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は[公式のチュートリアル](https://github.com/Blueqat/Blueqat-tutorials/tree/master/tutorial-ja)を元に作成しています。
今回はDeutsch-Jozsaのアルゴリズムを実装していきます。

## Deutsch-Jozsaのアルゴリズム
詳しい内容は[ここ](https://qiita.com/KeiichiroHiga/items/6c13657bcd59f9a805a1)に書いてます。
今回は Oracle が2量子ビットの実装を行います。

このアルゴリズムでは Oracle が下の1. か 2. かを判別するアルゴリズムです。

1. 全ての入力で $f(x)$ が同じ
→ 全ての $x$ で $f(x)=0$ または 全ての $x$ で $f(x)=1$

2. 入力の半分で $f(x)$ が異なる
→ $2^{n−1}$ 個の $x$ で $f(x)=0$ 、残りの $x$ で $f(x)=1$

今回は 1. ならば 00 が 2. ならば 10, 01, 11 のどれかが取れます。

2 の場合を考えます。
回路の作成には Oracle の結果を出力させるビットを加えた 3量子ビット使います。

``` math
\left|0\right> \otimes \left|0\right> \otimes \left|1\right>
```
また Olacleを出力させるビットは $\left|1\right>$ にしておきます。

始めに重ね合わせの状態を作ります。

``` math
\left|0\right> \otimes \left|0\right> \otimes \left|1\right> \xrightarrow{H \otimes H \otimes H} \frac{1}{2}(\left|00\right> + \left|01\right> + \left|10\right> + \left|11\right>) \otimes \frac{1}{\sqrt2}(\left|0\right> - \left|1\right>)
```
ここでは Oracle を CXゲートします。

``` math
\left|00\right> \xrightarrow{CX} \left|00\right>, \left|01\right> \xrightarrow{CX} \left|01\right>\\
\left|11\right> \xrightarrow{CX} \left|10\right>, \left|10\right> \xrightarrow{CX} \left|11\right>
```
Oracle の出力を 1 番目のビットと見ると 0 から 1 番目に CX ゲート を施したとき 01, 10 で 1番目のビットが 1 になりますので Deutsch-Jozsaのアルゴリズムが使えることがわかります。

この出力を 2番目のビットに送るので以下のようにします。

``` math
\frac{1}{2}(\left|00\right> + \left|01\right> + \left|10\right> + \left|11\right>) \otimes \frac{1}{\sqrt2}(\left|0\right> - \left|1\right>)\\ \xrightarrow{CX[0,1]} \frac{1}{2}(\left|00\right> + \left|01\right> + \left|11\right> + \left|10\right>) \otimes \frac{1}{\sqrt2}(\left|0\right> - \left|1\right>) \\
\xrightarrow{CX[1,2]} \frac{1}{2}(\left|00\right> - \left|01\right> - \left|11\right> + \left|10\right>) \otimes \frac{1}{\sqrt2}(\left|0\right> - \left|1\right>) \\
\xrightarrow{CX[0,1]} \frac{1}{2}(\left|00\right> - \left|01\right> - \left|10\right> + \left|11\right>) \otimes \frac{1}{\sqrt2}(\left|0\right> - \left|1\right>) 
```
これは $CX[0,1]$ で Oracleの出力を 1番目に集約して、その結果を $CX[1,2]$ で2番目に送り、また $CX[0,1]$ で中身の順番を戻すという作業をしています。
Oracle の結果で符号が反転していることがわかります。

最後に重ね合わせを戻します。

``` math
\frac{1}{2}(\left|00\right> - \left|01\right> - \left|10\right> + \left|11\right>) \otimes \frac{1}{\sqrt2}(\left|0\right> - \left|1\right>) \xrightarrow{H \otimes H \otimes H} \left|11\right> \otimes \left|1\right>
```
0, 1 番目のビットを見ると 11 になっているので 2. の場合の Oracleだとわかります。

### 回路の作成
回路は以下のようになります。

``` math
\begin{array}{cccc}
\left|0\right> &-&H&-&*&-&*&-&H&-&→出力 \\
&&&&|&&|& \\
\left|0\right> &-&H&-&X&*&X&-&H&-&→出力 \\
&&&&&|& \\
\left|1\right> &-&H&-&-&X&-&-&H&- \\
\end{array}
```
始めの Hゲートで重ね合わせを作っています。
次の CXゲートが Oracle です。
この Oracle の出力を $\left|1\right>$ の行に CXゲートで送って、そのあとの CXゲートで順番を戻しています。

実装します。

``` python:sample.ipynb
from blueqat import Circuit

c = Circuit().x[2].h[:]
c.cx[0,1].cx[1,2].cx[0,1]
c.h[:].m[:].run(shots=1000)

出力
Counter({'111': 1000})
```
11 が取れたのでこの Oracleは 2. の場合だとわかります。

## まとめ
今回はblueqatを用いてDeutsch-Jozsaのアルゴリズムを実装しました。
次回はBernstein-Vaziraniのアルゴリズムをblueqatで実装してみます。
Spring Framework RestTemplateをElasticsearchのクライアントとする場合の注意

ElasticsearchのクライアントとしてSpring Framework RestTemplateを使用する際に引っかかったので以下の点に注意です。

```java
HttpHeaders headers = new HttpHeaders();
headers.setContentType(new MediaType("application", "json", Charset.forName("utf-8")));
String q = "{\"query\":" + [クエリ] +"}";
HttpEntity<String> entity = new HttpEntity<String>(q, headers);
HttpEntity<String> result = restTemplate.exchange([URL], HttpMethod.POST, entity, String.class);

```

以下のようにHttpEntityでString型を指定した場合

```java
HttpEntity<String> entity = new HttpEntity<String>(q, headers);
```
以下のようにヘッダにContentsTypeを指定しなければElasticsearchがエラーとしてHTTPステータスコード**406 Not Acceptable**を返却します。

```java
headers.setContentType(new MediaType("application", "json", Charset.forName("utf-8")));
```
【Swift】型に!つけると何が起こるんや……？＞🐧

Optional型は完全に理解したつもりでしたが、Implicitly Unwrapped Optional（暗黙的アンラップ）についてよくわかってなかったので、備忘で書きます。

フォースアンラップはよく使います。

```swift
let hoge: String?
hoge = "!!!"
print(hoge!) //!!!
```

これはわかりやすい（というかわかってる人に対する記事としてこれを書いています）と思うのですが、
変数の型に、!をつけるとどうなってしまうのでしょうか？

```swift
let hoge: String!
```

# Implicitly Unwrapped Optional
？と！という記号は、なんか全部Optional型に関係するものなのですが、
使う方法によってそれぞれ名前がついていて、若干挙動が違ったりします。
正確なところが知りたければ、Swiftの公式ドキュメントを参照するとよいでしょう。

[Implicitly Unwrapped Optionals
](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID334)

String?はOptional(String)のSyntax Sugarですが、String!はちょっと違います。
型としてはOptional型になりますが、Implicitly Unwrapped Optional（暗黙的アンラップ）という属性がつき、下記の特徴を持ちます。

- 取り出し時に必ずフォースアンラップされる
    - 従ってnilの場合実行時エラーになる可能性がある

サンプルコードとしては下記です。

```swift
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark
```

String?だと取り出し時に!をつけてフォースアンラップしていますが、
Implicitly Unwrapped Optionalだと、フォースアンラップがデフォルトなので、!なしでフォースアンラップとなります。
if let〜やguard let〜を使って、安全に取り出すことも可能です。

```swift
if let definiteString = assumedString {
    print(definiteString)
}
// Prints "An implicitly unwrapped optional string."
```

なるほどですね〜！

# 修正
[【Swift 4.2】Implicitly Unwrapped Optional（IUO）が再実装されたらしいので Xcode で試した](https://qiita.com/takehito-koshimizu/items/5bdef0c575169795ba2e)
コメント欄で指摘頂いたんですが、Implicitly Unwrapped OptionalはSwift4.2以降では型ではなくて、属性に格下げされてました。
そのため本文も修正しました。

# 参考
[どこよりも分かりやすいSwiftの"?"と"!"](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)
[Implicitly Unwrapped Optionals
](https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html#ID334)
Unityで Google AdManagerの広告をGMA（GoogleMobileAds）で表示する方法　

# 概要
https://developers.google.com/admob/unity/start?hl=ja
Admobの仕様は上記の通りで詳しい実装方法も記載してある。(2019年12月時点）
AdmanagerはどうやってGMA使って出すんだろ〜って思ったので・・・
## 調査
「アプリで AdMob ではなくアド マネージャーを使用している場合は、[Google Ad Manager] セクションの [Enabled] チェックボックスをオンにして、アド マネージャーを有効にします。」
と記載があるのでUnityのAdmob用パッケージで同処理ができるみたい。

とりあえず下記のAdmanagerにチェック入れました。Admobの広告と共存できるのでAdmobにもチェック入れても平気です

![スクリーンショット 2019-12-20 15.42.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549803/1fbb1b25-b683-85b9-da3d-83e85311e4ac.png)

## 実装サンプル
```Unity:C#
MobileAds.Initialize(initStatus =>
{
    this.bannerView = new BannerView("{広告ユニットID}", AdSize.Banner, AdPosition.Top);

    // Show　Bannar.
    this.bannerView.LoadAd(this.CreateAdRequest());
});
```
## 感想・備考
直感的にわかる事なんですが、DemoScriptを見るとAdmobのAppIDを渡してInitしてるんですよね。
でもAdmanager単体なら、AppIDいらないんです。初期化して、ユニットIDだけ渡せばいいんです。

いじょー
dockerコンテナ内で実行したviで、マウス右クリックでペーストしようとしたら"(insert) VISUAL"となってペーストできない場合の対応方法

通常はしないオペレーションですが、dockerコンテナ内で一時的に設定ファイル等を手動で変更したい場合があると思います。

その場合、普段と同じように、マウス右クリックで設定内容をペーストしようとすると、よくあるコンテナ設定では"(insert) VISUAL"となってペーストできないかと思います。（そもそもvi自体インストールされていない場合も多いかと思いますので、その場合はまずインストールして下さい。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/1db6c0e5-f3e0-f589-258f-06273af8abc7.png)

これはマウスが使えていないのではなく、クリップボードの共有設定がされていないためで、`p` あるいは `P` コマンドでペーストしようとしても `E353: Nothing in register` というエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/893b8790-508e-4009-e1db-824358ab148d.png)

対応としては、実行するユーザのhomeに .vimrcを作成し、下記設定を追加します。

```file:.vimrc
set clipboard=unnamed,autoselect
```

設定後viを起動するとペーストできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/9f3ce7f1-de06-11e6-3650-b0d2d0e1436c.png)

そもそも発生しないに超したことはない操作ですが、いざ起きると焦ってしまうので記事にまとめてみました。

# 参考資料

- [Vim: クリップボードとプットビジュアルモード](https://www.kickbase.net/entry/vim-clipboard-put-visual)
理想のCSSとFLOCSS

#前提
そもそも理想的なcssとはどうあるべきか？


**１・予測可能である**
予測可能なcssは、期待した場所に期待した通りの振る舞いをする。何が起きるかわからないcssではいけない。

**２・再利用可能である**
再利用可能なCSSは、ある場所で解決した動作を、再びコーディングすることなく別の場所で用いることができる。一つのルールで「こんな見た目でこんな配置、こんな風に動く」と定めてしまうことは再利用できる可能性を奪う。できるだけ抽象的に、機能を分離する必要がある。

**３・維持できる**
維持できる（＝保守性の高い）CSSは、新たな機能を追加しても、既存の機能を阻害しない。新しく機能を追加した際に、それが別の機能を阻害してしまっては、都度見直しが必要なる。作業工数が増えてしまう（非効率的）

**４・拡張性がある**
拡張性があるCSSは、多くの開発者の手によって拡張されていく際に、管理コストを下げます。
例えば、学習コストが低いことで、書いた本人でなくても修正が可能である必要がある。

# FLOCSSを使用するメリット
上記の４つの理想に限りなく近づけたのがFLOCSSで、FLOCSSはHiroki taniによって考案された。

使用するメリットしては

**・ドキュメントが日本語**
国産のCSS設計思想なので、ドキュメントが充実している。
実際に考案したHiroki taniさんのgithubにドキュメントが乗っている。
➡︎[FLOCSSドキュメント](https://github.com/hiloki/flocss)

**・プロジェクト固有パーツをComponentと別に分けておける**

#FLOCSSの基本構成
FLOCSSは３つのレイヤー、そして３つの子レイヤーで構成されている。

- Foundation
- Layout
- Object
 - Component
 - Project
 - Utility

#FLOCSSの各レイヤーについて

##Foundation
Reset.cssやNormalize.cssなどを用いたブラウザのデフォルトスタイルの初期化や、プロジェクトにおける基本的なスタイルを定義する。 ページの下地としての全体の背景や、基本的なタイポグラフィなどが該当する。
**例　base.scss**

##Layout
ページを構成するヘッダーやメインのコンテンツエリア、サイドバーやフッターといったプロジェクト共通のコンテイナーブロックのスタイルを定義する。基本的にはページ単位の存在になるので、idセレクタを使うことも可能。
**例　header.scss**

##Object
プロジェクトに置ける繰り返されるビジュアルパターンを全て定義する。また下記の３つの子レイヤーをもつ。

**1 Component**
再利用できるパターンとして小さな単位のモジュールを定義する。最低限の機能を持ったものとして定義されるべきであり、それ自体が固有の幅や色などの特色を持つことを避ける。
**例　button.scss**

**2 Project**
プロジェクト固有のパターンであり、いくつかのcomponentと、それに該当しない要素によって構成されるものを定義します。例えば、記事一覧や、ユーザープロフィール、画像ギャラリーなどが該当する。

**3 Utility**
componentとprojectレイヤーのObjectのモディファイアで完結することが難しい、適切ではない、わずかなスタイルの調整のための便利クラスなどを定義する。

*※モディファイアとは*
BlockやElementに対するフラグのようなもので 見た目や状態(disabledやfocus、highlightedやsize-bigなど)の情報を付け加える。


#FLOCSSの命名規則
FLOCSSでは、**MindBEMding** を使用します。
これは、BEMという設計思想を元にした命名規則です。

モジュールをBlock、Element、Modifierにわけて考え、それぞれを.Block__Element--Modifierのようにつなげて記述する。

**接頭辞（プレフィクス）をつける**
FLOCSSでは、クラスがどのレイヤー属しているかによってそれぞれプレフィックスをつける。
これにより、クラスがどのような役割を持っているのかわかるため、「予測しやすく」 なる。
また、予測しやすいことは開発者にとっても意図がわかりやすいため 「拡張しやすい」 とも言える。

レイヤーとそれに対応する接頭辞は下記の通り

**Component : .c-**
**Project : .p-**
**Utility : .u-**

さらに、状態を表すクラスの接頭辞として.is-を使う。


[引用元](https://github.com/hiloki/flocss)
split(),join()

#split()

特定の文字を引数に渡すとその文字で区切って配列にしてくれる。

```js
var str = 'a k';
var spl = str.split(" ");　#引数に入っているのは半角スペース
console.log(spl);

=> [a,k]
```

#join()

配列の区切りを渡した引数に置き換えて文字列に変換する。

```js

var array = ['a','k'];
var ary = array.join("-");

console.log(ary);

=> 'a-k'
```
Nutanix VMのvDiskインポート

[2枚目]Nutanix Advent Calendar 2019 12/16分の記事です。

#vDiskの対応形式について
ディスクのイメージはソフトウェアや各種ハイパーバイザーで形式が決まっております。
Nutanixの場合は基本的にKVMベースとなっており、最終的にはqemu-imgを使用しているようです。
つまり、qemu-imgに対応するイメージであれば基本的に使用できると考えて大丈夫なようです。

Openstackの[解説](https://docs.openstack.org/ja/image-guide/convert-images.html)によりますと以下の形式に対応しております。

QCOW2 (KVM, Xen)
QED (KVM)
raw
VDI (VirtualBox)
VHD (Hyper-V)
VMDK (VMware)

よって、基本的に広く使われているハイパーバイザー型やホスト型で使用されている形式は対応していると考えられます。

#rawイメージについて
もし仮にrawイメージを使われる方がいらっしゃいましたらqcow2などに圧縮されることをおすすめします。
容量によっては転送時間が大きくなるためです。圧縮方法については、上記Openstackのサイトに記述がありますので参考にしてください。

#ファイルアップロードの前に
windowsの仮想マシンの場合には事前にvirtioをインストールする必要があります。
他にも、webサーバーを立てる必要があります。
Prism上からURLの指定がない場合タイムアウトしてしまうからです。
webサーバーの必要スペックですが、ストレージ容量があり、ギガビット対応のNICがあれば基本的に大丈夫でしょう。

#アップロード方法
CE-20180211のイメージでは、prismからアップロードができませんでした。ですのでCLIにて行う必要があります。
※最新版ではできる可能性がありますが、確認し次第追記します。
cvmにSSH接続し、acliから以下のコマンドを入力します。

```
acli image.create [イメージ名] image_type=kDiskImage source_url=http://webサーバーのIPアドレス/イメージファイル名 container=アップロード先のコンテナ名

```

#確認
prismの設定、イメージからディスクイメージが登録されていれば大丈夫です。
もし、何かあればエラーから確認を行ってください。

ディスクイメージを登録後からは通常の仮想マシンを作成する際にアップロードしたイメージを指定すればそのまま起動することができます。
Android 画面タッチでキーボード非表示、画面上の全EditTextと個別EditText対応

EditText等でテキスト入力後forcusが外れるとキーボード非表示にする例。

```android:android
public class MainActivity extends AppCompatActivity {
    // キーボード表示を制御するためのオブジェクト
    InputMethodManager inputMethodManager;
    // 背景のレイアウト
    private LinearLayout mainLayout;

 　　@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    //入力エリアEditTextはforcusが外れればキーボードが非表示となる。   
    inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    mainLayout = (LinearLayout) findViewById(R.id.main_layout);
    EditText input1 = (EditText)findViewById(R.id.input1);
  }
}
```

```xml:xml
//上記例のlayoutXMLは下記。LinearLayout android:id="@+id/main_layout"必須
  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/main_layout"
    android:orientation="vertical" >

........
        <EditText
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:id="@+id/input1"/>

```
Pythonで混同行列の各要素のインデックスを取得する

`scikit-learn`の`confusion-matrix`ではそれぞれのインデックスを取得することができなかったので。
(もしかしてできる？)

# 条件

例えば猫かどうかを判定するとして、１が猫、０が猫でないとする。
`preds`を予測、`labels`を正解データとする。

# 手順

numpyの行列に変換する

```python
import numpy as np

preds = [0., 1., 1., ..., 0., 1., 0.]  # 適当な0or1のリスト
labels = [0., 1., 1., ..., 0., 1., 0.]  # 適当な0or1のリスト

preds = np.array(preds)
labels = np.array(labels)
```

猫のインデックスを取る

```python
one_ind_p = preds == 1
one_ind_l = labels == 1
zero_ind_p = np.logical_not(one_ind_p)  # boolの反転
zero_ind_l = np.logical_not(one_ind_l)
# array([False,  True,  True, ..., False,  True, False]) みたいなデータになる
```

混同行列の各要素のインデックスを取得する

```python
tp = np.argwhere(one_ind_l & one_ind_p)
fp = np.argwhere(zero_ind_l & one_ind_p)
fn = np.argwhere(one_ind_l & zero_ind_p)
tn = np.argwhere(zero_ind_l & zero_ind_p)
```

# appendix
混同行列はこれ
![スクリーンショット 2019-12-20 15.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190157/4b02d1d9-ea36-f8b4-d080-a6de216370be.png)
http://ibisforest.org/index.php?F%E5%80%A4
terraformからroleにpolicyをattachするときの話

## 概要
* terraformにおける`aws_iam_policy`と`aws_iam_role_policy`の違いについて
* `aws_iam_policy`で生成したpolicyをattachする(`aws_iam_policy_attachment`)方が良さそう

## はじめに
今年の4月ごろにAWSのアカウントを作ってから、LambdaやKMSやEC2に触れてきました。

SAMを用いるとlocalでテストもしやすくて便利なので、使っていたのですが、
deployする先はcloud formationであり、cloud formationでできることはterraformでもできる場合があるという話になり、
terraformから触ってみた時にpolicy周りで混乱した話です。

## 詳細
policyを定義して、roleにattachするときのことです。

まずは [`aws_iam_policy_document`](https://www.terraform.io/docs/providers/aws/d/iam_policy_document.html) でdata sourceを定義します。

```hcl
data "aws_iam_policy_document" "example" {
  statement {
    sid = "1"
    actions = [
      "s3:ListAllMyBuckets",
      "s3:GetBucketLocation",
    ]
    resources = [
      "arn:aws:s3:::*",
    ]
  }
}
```

次に、このexampleをroleにattachしようと思うわけですよね。
ここで、二つの選択肢があるんじゃないかと気づきました(初心者ゆえにこの考え方が間違っている可能性もありますが…)。
1. `aws_iam_policy`からpolicyを生成してから、`aws_iam_policy_attachment`や`aws_iam_role_policy_attachment`を用いてroleにattachする
2. `aws_iam_role_policy`からroleにpolicyをattachする

### 試し方

#### `aws_iam_policy`からpolicyを生成してから、`aws_iam_policy_attachment`や`aws_iam_role_policy_attachment`を用いてroleにattachする

```hcl
resource "aws_iam_policy" "policy" {
  name        = "test-policy"
  description = "A test policy"

  policy = "${data.aws_iam_policy_document.example.json}"
}

resource "aws_iam_policy_attachment" "test-attach" {
  name       = "test-attachment"
  roles      = ["${aws_iam_role.role.name}"]
  policy_arn = "${aws_iam_policy.policy.arn}"
}
```

#### `aws_iam_role_policy`からroleにpolicyをattachする

```hcl
resource "aws_iam_role_policy" "test_policy" {
  name = "test_policy"
  role = "${aws_iam_role.test_role.id}"

  policy = "${data.aws_iam_policy_document.example.json}"
}
```

どっちも試してみた結果は以下の通りでした。

| |policy|attach|
|:-:|:-:|:-:|
|1|生成される|管理ポリシーとしてattachされる|
|2|生成されない|インラインポリシーとしてattachされる|

書く手間が少ないという意味では、2の方がいいと言えますが、
他のroleに同じpolicyをattachする場合や、policyの管理を考えると、1の方が便利だとは思えますね。

ということで、玄人目線では当たり前になるかもですが、僕の中では概要で示した結論のようになりました。

今後、policy周りに触れる人の参考になればと思いますー
背景画像でスライドショー、ドット付き（自作）

# はじめに
jsのスライドショーのライブラリといえば、[slick](https://kenwheeler.github.io/slick/)が有名でよく使っていますが、背景画像のスライドショーができない？ような気がしたので、背景画像(`background-img`)のスライドショーを自作しました。

動きとしては、ふわっと画像が切り替わって、ドットが表示されるやつです。

背景画像じゃないと、画面の幅に合わせての表示がちょっとむずかしいねん。

# コード
```html:html
<div class="top-page-header">
    <div id="top-slide">
        <div class="slide-img slide1"></div>
        <div class="slide-img slide2"></div>
        <div class="slide-img slide3"></div>
        <div class="slide-img slide4"></div>
        <ul class="slide-dots">
            <li>・</li>
            <li>・</li>
            <li>・</li>
            <li>・</li>
        </ul>
    </div>
</div>
```


```scss:scss
.top-page-header {
    position: relative;
    height: 100vh;
}

#top-slide {
    position: absolute;
    width: 100vw;
    height: 100vh;
}

.slide-img {
    position: absolute;
    width: 100vw;
    height: 100vh;
    background-size: cover;
    background-repeat: no-repeat;
    background-position: center;
    z-index: 1;
}

.slide1 {
    background-image: url('../images/top/topimg_1.jpg');
    opacity: 1;
}

.slide2 {
    background-image: url('../images/top/topimg_2.jpg');
    opacity: 0;
}

.slide3 {
    background-image: url('../images/top/topimg_3.jpg');
    opacity: 0;
}

.slide4 {
    background-image: url('../images/top/topimg_4.jpg');
    opacity: 0;
}

.slide-dots {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    right: 55px;
    color: #fff;
    width: 15px;

    li {
        display: block;
        cursor: pointer;
        font-size: 34px;
        line-height: 0.9;
        opacity: 0.4;

        &:nth-of-type(1) {
            opacity: 1;
        }
    }

    z-index: 3;
}

```


```js:javascript
//スライド
var slideNumber = 1
var allSlide = [1, 2, 3, 4]

setInterval(toggleSlide, 8000)

//スライドを切り替える
function toggleSlide() {
    slideNumber++

    if(slideNumber > 4) {
        slideNumber = 1
    }

    //対象のスライドを表示する
    $('.slide' + slideNumber).animate({opacity: 1}, 800)
    $('.slide-dots li:nth-of-type(' + slideNumber + ')').animate({opacity: 1}, 800)

    //他のスライドはopacity: 0にする
    for(var i = 1; i <= allSlide.length; i++) {
        if(i !== slideNumber) {
            $('.slide' + i).animate({opacity: 0}, 800)
            $('.slide-dots li:nth-of-type(' + i + ')').animate({opacity: 0.5}, 800)
        }
    }
}

//ドットをクリックしたとき
$('.slide-dots li').on('click', function() {
    var index = $('.slide-dots li').index(this)

    slideNumber = index
    clearInterval()
    toggleSlide()
})

```

# 最後に
コードしか載せてないけど...

ちなみに4枚のスライドにしか対応してないので、適宜書き換えてください。

多分[こちらのライブラリ](http://rewish.github.io/jquery-bgswitcher/)でもよかったのですが、デザインでドットが表示されていたんで、諦めたんやった...
スクール卒業生2年目の生存報告

ご無沙汰しています！@aocoryです。
以前、保育園落ちたアラフォーがプログラミングを学び、2か月でWebサービスを作った話でQiitaに初めて投稿しました。

プログラミングスクール卒業生が、どうなったのか？という点について皆さん少し興味があると思うので私が今どのようになっているのかについて少しお話しさせていただきます。

結論を言うと**何者にもなっていない。なれていない。**となりますが、よろしくお願いします。あと、**保活広場を作りましたが、子供は保育園には行かず幼稚園に行っています。**

## キャリアについて
個人的には、プログラミングは今でも大好きですが、**エンジニアにはなっていません。**ただの、**個人開発者**です。僕も、**来年40歳** になる立派なおっさんです。エンジニアに転職したいと思ったことがないかと言われれば嘘になりますが、エンジニアにならなくてもプログラミングを続ければいいのではないか？と考えています。

僕は、地方の個人事業主の息子で、親が歳でそろそろ家業を継げというプレッシャーの中で社畜をしています。

少しですが親孝行のために家業を手伝うようになりました。。そこで、みたのは想像していたモノとは違うモノでした。父親の専門知識は、若干時代遅れで少し危機感を私は覚えました。独立してフリーランスになると言うことは、常に自分で知識を最新にアップデートしていかなければならない。そのプレッシャーと隣り合わせです。家業を継いだら、僕の知識もいずれ怠惰とともに落ちていくのか？そして、息子が家業を継ぎたいと言ってくれたらその時、このような落胆を息子が味あうのか？を考えると恐怖でした。そう考えると、この半年でトレンドが変わるプログラミングを追いかけていくのは**少し仕事としてはしんどいな**そう感じました。そして、**僕は、本業にプログラミングをゆるく融合できないか？**そのように考えていくようになりました。

## 偉い人をぶっ飛ばせ！
仕事で、偉い人の話を聞いていたときです。偉い先生はこのように仰いました。

**「僕くらいになると、コレはみるだけで分かる。だけど、普通の人だと分からないと思う。」**

これを聞いた時、おそらく今までの僕なら「ふーん、そうか。」と思っていたと思います。しかし、そのとき思ったんです。

**「このおっさんができるのなら、機械学習でできるんじゃね？」**

そう思いました。そこで、Pythonを勉強しはじめました。

# AIメーカーとAichi勉強会
そこから、競プロやったり、静的サイトジェネレーター作ったりふらふらしながら月日は経ち、このままではいけないと@karaage0703 さん主催の愛知勉強会に参加しました。僕は当然ですが、年長おっさんの部類でしたが、非常に熱のある勉強会で異業種の人にも温かく、書籍とQiitaとかでしか学びを得ていない僕にとって初めての勉強会で非常に勉強になりました。@upura さんのでもは、機械学習のもやっとしたところをすっきりして非常に勉強になりました。あと、ディープラーニングおじさんは僕の希望です。凄く、熱とやる気を頂きました。そしてその頂いた力を元に一気に作りました。

# 作ったモノ「希少癌の分類モデル」
図1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248102/88f790bd-d620-383c-30c4-8a85615b5979.png)
図2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248102/24823a10-4428-8ba8-847c-ffa9b9518225.png)

それぞれなんか紫色の細胞が見えると思います。これは、それぞれ同じ癌です。しかし、**ウイルスが関係しているモノと関係していないモノ**です。原発だけならほぼ90％あてることができるモデルになっています。今、今年、家業をいよいよ継がないといけなくなったので論文を**最後の仕事**として書いています。
ちなみに、今現在それで治療方法は一緒です。
つまり、**コレができたところで患者なんの未来は変わりません。**
しかし、ウイルスに対する治療ができれば？これは化ける可能性があります。
この仕事は、誰かは分からないけど**未来の誰かへの手紙**です。
僕が生きてる間に出るかも分かりません。
ただ、**間違いなくプログラミングをしていなければ出会えなかったテックコミットの方や個人開発ギルドの仲間との出会い** や保活広場の記事を書いた時にはげましてくださった方のおかげで少し僕の人生は変わったと思います。


以上「スクール卒業生2年目の生存報告」でした。

実家ついでもプログラミングは楽しいから続けるよ。

Happy！Cording！

最後まで読んでいただき、ありがとうございました。
また、どこかでお会いしましょう！
PHPでバリデーションライブラリの「Varitron」を使ってみる

# Valitron便利。ってことで記事に残しておく

## 前提

- PHP7.3
- Composer使える環境

## 概要

**後でValitron使ったお問い合せフォームの記事も書く**

仕事でピュアPHP書いててバリデーション0から作るのアホらしいな〜と思い、
いい感じのバリデーションライブラリ無いかと探してたら見つけました。

[vlucas/valitron](https://github.com/vlucas/valitron)

スター数も多分PHPのバリデーションライブラリで一番スター付いてるんじゃ無いでしょうか（鼻ホジ）
> 2019 12/20現在 1.2k

## インストール

早速Composer使ってインストール

```terminal
php composer.phar require vlucas/valitron
```

vendorディレクトリに`vlucas`というディレクトリがあれば成功

> composerじゃなくても[このファイル](https://github.com/vlucas/valitron/tree/master/src/Valitron)をプロジェクトフォルダに置いても使えると思う（日本語化は別でしないといけないけど）

## 使ってみる

適当にFormRequestClassにvalidate()とかいうメソッド作ってそこで試す。
> あとでお問い合せフォームの実践例も別記事で書く予定。

フォームから$postを受け取ってその値に対してバリデーションをかけていく

```php:FormRequesrClass.php
<?php

namespace App;

require __DIR__ ."/../bootstrap.php";

use Valitron;

class FormRequestClass
{
    protected $post;
    protected $validator;

    public function __construct(array $post)
    {
        $this->post = $post;
    }

    // バリデーション処理
    public function validate() : ? array
    {
        // 日本語に設定
        Valitron\Validator::lang("ja");
        $this->validator = new Valitron\Validator($this->post);

        // 必須項目のチェック
        $this->validator->rule("required", $this->formItems())->message('{field}は必須項目です');
        // フリガナの形式チェック
        $this->validator->rule("regex", "name_kana", "/^[ァ-ヾ\s　]+$/u")->message('{field}を正しく入力してください');
        // 電話番号の形式チェック
        $this->validator->rule("regex", "tel", "/\A0[0-9]{9,10}\z/")->message('{field}を正しく入力してください');
        // メールアドレスの形式チェック
        $this->validator->rule("email", ["email", "verify_email"])->message('{field}はメールアドレス形式で入力してください');
        // メールアドレスと確認用メールアドレスの一致チェック
        $this->validator->rule("equals", "email", "verify_email")->message('{field}が一致しません');

        // ラベルを定数ファイルの内容に変換
        $this->validator->labels([
            "name"         => "名前",
            "name_kana"    => "フリガナ",
            "email"        => "E-Mail",
            "verify_email" => "確認用E-Mail",
            "tel"          => "電話番号"
        ]);
        
        // エラーチェック
        if ($this->validator->validate()) {
            $errors = [];
        } else {
            $errors = $this->validator->errors();
        }

        return $errors;
    }

    // フォームの必須項目
    protected function formItems() : array
    {
        return [
            "name",
            "name_kana",
            "email",
            "verify_email",
            "tel"
        ];
    }

}
```

validate()メソッドではそれぞれの項目に対してバリデーションを行なっている。

## 使い方説明

上記のコードを上から順に説明

日本語設定

```php
Valitron\Validator::lang("ja");
```

引数で入力値を渡してインスタンス化

```php
$this->validator = new Valitron\Validator("ここに$_POSTをぶち込む");
```

バリデーション設定

```php
$this->validator->rule("バリデーション名", "項目名(配列も可能)")->message("エラーメッセージ");
```

ラベルを設定

> 初期はnameで表示されるので日本語でエラー出すなら必須な気がする

```php
$this->validator->labels("項目名(配列も可能)");
```

エラーチェック

```php
// エラーチェック
if ($this->validator->validate()) {
    $errors = [];
} else {
    $errors = $this->validator->errors();
}
```

> 結果に対してエラーがなければ`$errors`に空の配列を渡して、エラーがあれば`$errors`にエラー結果が入ってくる。

# 最後に

しつこいけど後でValitron使った実践的なお問い合わせフォームの記事も書く
vueよりも満足度の高いjsフレームワーク、svelteについて

## 概要
こちらはsvelteについての記事です。svelteは2016年に開発されたフレームワークです。
読みは多分、スヴェルトです。
[こちら](https://2019.stateofjs.com/front-end-frameworks/
)のページの「Awareness, interest, and satisfaction ratio rankings」において、vueよりも上位のフレームワークsvelte。ほぼ日本語の情報がなかったので翻訳しまとめたものをこちらに記載します。
今後、果たしてどうなるかはわかりませんが新しいjsのフレームワークを使用してみたい方に参考になると嬉しいです。

## svelteって何？
svelteは高速Webアプリケーションを構築するためのツールで、ReactやVueなどのJavaScriptフレームワークに似ており滑らかでインタラクティブなユーザーインターフェイスを簡単に構築できるようにするという目標を共有しているとのこと

### ReactやVueとの相違点
> Svelteは、実行時にアプリケーションコードを解釈するのではなく、ビルド時にアプリを理想的なJavaScriptに変換します。 これは、フレームワークの抽象化のパフォーマンスコストを支払わず、アプリを最初にロードするときにペナルティが発生しないことを意味します。 Svelteでアプリ全体をビルドすることも、既存のコードベースに増分的に追加することもできます。 従来のフレームワークへの依存のオーバーヘッドなしで、どこでも動作するスタンドアロンパッケージとしてコンポーネントをexportすることもできます。

[こちら](https://svelte.dev/tutorial/basics)より引用

ちなみにロゴはこんな感じです。
<img width="100px" alt="svelte公式ロゴ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293094/6c27e686-c9b9-5986-aa48-d2fa8294ffaf.png">

## svelteの特徴
### 少ないコードでかける（Write less code）
例えば、2つの入力ボックスに入力した結果の和を出力したい場合、Reactなら442文字、Vueなら263文字のところsvelteなら145文字出かける

詳細は[こちら](https://svelte.dev/blog/write-less-code)

### 仮想DOMではない（No virtual DOM）
「仮想DOMが早いというのは神話でしかない」とのスタンスを元にsvelteは仮想DOMを使用していない

詳細は[こちら](https://wa3.i-3-i.info/word12471.html)

### 真にリアクティブ(Truly reactive)
Svelteは、ReactやVueのようなコンポーネントフレームワークだけれど、宣言型の状態駆動型コードを記述ではなく、ビルド時に実行され、コンポーネントを非常に効率的な命令コードに変換し、DOMを外科的に更新するとのこと。
ただ、まだ完成にはいたっていないとのこと。

詳細は[こちら](https://svelte.dev/blog/svelte-3-rethinking-reactivity)



## コード例
以下は[公式ドキュメント](https://svelte.dev/)より引用します

### データをhtmlに出力するコード
```
<script>
	let name = 'world';
</script>

<h1>Hello {name}!</h1>
```

### cssのスコープについてのコード
```
<script>
	import Nested from './Nested.svelte';
</script>

<style>
	p {
		color: purple;
		font-family: 'Comic Sans MS', cursive;
		font-size: 2em;
	}
</style>

<p>These styles...</p>
<Nested/>
```
<Nested/>については別ファイルのコンポーネント、こちらでは省略させていただきます。
この場合、cssが当たるのは「These styles...」のみ。
つまりコンポーネントごとにスコープされる。

### 　ボタン押下時に文言を変えるコード

```
<script>
	let count = 0;

	function handleClick() {
		count += 1;
	}
</script>

<button on:click={handleClick}>
	Clicked {count} {count === 1 ? 'time' : 'times'}
</button>
```


## svelteを触ってみたい方へ
チュートリアルがありますので、こちらで触ってみてください
https://svelte.dev/tutorial/basics

## まとめ
svelteについて今回は記述させていただきました。
こちらのフレームワークがどの程度、使用されるかはわかりかねますが、何らか参考になれば嬉しいです。
お読みいただきありがとうございました。

## 参考
### 公式ドキュメント
https://svelte.dev/
眼精疲労には気をつけよう！

 こんにちはヨースケです。一昨日の夜に激しい悪寒に襲われ、翌日激しい頭痛や発熱に悩まされたので内科に行きました。症状はインフルっぽいですが検査は陰性だったので総合風邪薬をもらい１日安静。今はだいぶよくなりました。
 この１週間振り返ってみると、アプリ開発やなんやらでスマホやパソコンを長時間使っていたので、**眼精疲労**から来てるんじゃないかなーと思います。目の疲れは身体中に来るので要注意ですね！アプリ開発が中々進みませんがスマホやパソコンの使い方には考えなければ...
インターフェイス VPC エンドポイント (AWS PrivateLink)についてのメモ

# メモ

- AWSサービス毎、サブネット毎（ただし同じAZのサブネットは2つ以上指定できない）に有効にできる
    - 例えば「EC2」のAPIエンドポイントに対して、既存のサブネット4つのうち2つをインターフェイス VPC エンドポイントを有効にする、等
- 有効にするとそのサブネットでENIが生成される
- 有効にしたサブネット（AZ）毎にプライベートDNS名が払い出される
- 「Private DNS names enabled」をEnabledにするとデフォルトのAPIエンドポイントのIPアドレスがVPCエンドポイントになる

![kousei.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/ea97f21e-b9aa-6f3f-0778-d13829aefdda.png)

# 検証

上図のようにインターネットへの到達性の無いプライベートサブネットのインスタンスに踏み台からログインし、動作確認する。

## 「Private DNS names enabled」が有効の場合

デフォルトのAPIエンドポイントに対して dig する。VPCエンドポイントのIPアドレスが返答されている

```
[ec2-user@ip-10-0-1-64 ~]$ dig ec2.ap-northeast-1.amazonaws.com

;; ANSWER SECTION:
ec2.ap-northeast-1.amazonaws.com. 60 IN A       10.0.0.254
ec2.ap-northeast-1.amazonaws.com. 60 IN A       10.0.1.11
```

当然、インターネット（例: 8.8.8.8）には到達性は無いが、AWS APIは使用できる。

```
[ec2-user@ip-10-0-1-64 ~]$ ping 8.8.8.8 -c 1 -W 3
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.


--- 8.8.8.8 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms


[ec2-user@ip-10-0-1-64 ~]$ aws ec2 describe-instances --query 'Reservations[].Instances[].{ipaddress:NetworkInterfaces[].PrivateIpAddress[]'}
[
    {
        "ipaddress": [
            "172.31.15.184"
        ]
    }
]
```

## 「Private DNS names enabled」が無効の場合
デフォルトのAPIエンドポイントは普通にグローバルIPアドレスが返答される。

```
[ec2-user@ip-10-0-1-64 ~]$ dig ec2.ap-northeast-1.amazonaws.com

;; ANSWER SECTION:
ec2.ap-northeast-1.amazonaws.com. 15 IN A       54.239.96.159
```

プライベートサブネットからはインターネットに到達性が無いので、当然APIも実行できない

```
[ec2-user@ip-10-0-1-64 ~]$ aws ec2 describe-instances --query 'Reservations[].Instances[].{ipaddress:NetworkInterfaces[].PrivateIpAddress[]'}
```

ただし、プライベートDNS名で発行されたエンドポイントのURLを直接指定( `endpoint-url` )すれば実行できる。

```
[ec2-user@ip-10-0-1-64 ~]$ aws ec2 describe-instances --query 'Reservations[].Instances[].{ipaddress:NetworkInterfaces[].PrivateIpAddress[]'} --endpoint-url "https://vpce-0c428aae6eb77d7a8-hekvq062.ec2.ap-northeast-1.vpce.amazonaws.com"
[
    {
        "ipaddress": [
            "172.31.15.184"
        ]
    }
]
```
AWS Lambda@Pythonで相対importする

## 実装

`test` というパッケージを作って`lambda_handler`の位置を一階層下げる。

で、起動ハンドラの指定を
`lambda_function.lambda_handler`　から
`test.lambda_function.lambda_handler` へ変更する。

### イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/a1a7d679-8334-05eb-6005-de897574abb7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299475/d21b8f30-880a-1b09-3b04-4e141fa46376.png)

※ `__init__.py` は必須
どこでもボルケーノ！

#はじめに
今年もFOSS4G年末隠し芸大会の時期がやってまいりました。
最近はディープラーニング周りしかやっていなかったので、久々にCesiumで趣味的な実験をやってみようかと思いました。
結構前のFOSS4GでCesiumでリアルタイム物理演算デモをやったのですが、やっつけコード＆岩手山周辺しか対応していなかったため、全国版に対応して、かつ劇重コードだったのでちょっと軽くしてみようと昔のコードを思い出しつつ、整理して公開してみました。
しかし、昔の自分のコードは動作確認用のやっつけ用でコメントしていなかったので、何書いているか思い出すのに苦労しました・・・。

#諸君。私は噴火が好きだ。
諸君。私は噴火が大好きだ。
と某代行殿のもおっしゃっておりましたが、噴火を見ていると心が震えます。

噴火ができると、ちょっと嫌なことがあっても「まあ噴火できるしな」ってなるし仕事でむかつく人に会っても「そんな口きいていいのか？私は噴火とよろしくやってる身だぞ」ってなれる。戦闘力を求められる現代社会において噴火できることは有効なはず。

噴火させたいと思うことは誰しもがあるはずです。
しかしながら神ならぬ身では噴火などそう簡単には起こせない。
そう考えたことは？
喜べ少年。君の望みはようやく叶う。
そう、Cesiumならね。

#Cesiumで物理演算ってどうすんの？
とはいってもCesiumでは標準では物理演算は用意されていません。
Google summer of codeのアイディアでoimo.jsとか使った物理演算とか実装出来るとクール！ とか書いてあったので、現時点では物理演算機能は実装されていない模様。

#oimo.jsってそもそもなんだ？お芋？
元々はOimoPhysicsというactionscript3で実装された物理演算ライブラリをjavascriptに移植した軽量物理演算ライブラリのようです。
とりあえず、物理演算だけを実装するには向いてそうなので採択してみることに。

#ではこれをどうやってCesiumに組み込むか？
まず座標系が異なると変換が必要なので確認してみます。
Cesiumではcartesian（カーテシアンと読みます。デカルト座標系＝直交座標系）という地球楕円体の中心を原点とした座標系を採用しているため、oimo.js等、物理演算系は大抵直交座標なので、cartesianで渡してやればいけそうです。

#地面はどうする？
また、oimo.jsの地面が必要となります。
ここはお約束の[地理院標高タイル](https://maps.gsi.go.jp/development/demtile.html)を使ってみることに。
標高タイルは256*256の行列なので、左上の原点を下に緯度経度標高を算出してからカーテシアン座標に変換する必要があります。
oimo.jsでは平面ポリゴンが存在しないため、球体オブジェクトを敷き詰めて地面の代わりとしました。

#ただでさえ重いCesiumが物理演算とか耐えれるんか
oimo.jsとかの物理演算等のCPUバウンド処理はworkerで別スレッドで実行すれば多少は軽くなるのではないかということで、worker使ってみることに。Cesiumでもオブジェクト作成時などにworkerで処理しているぽいです。
ほんとはWebGPUとかつかってみたかったけど、あれはそもそもSafariのベータ版でしか使えないし、どうも見ていると描画の方が重そうです。
シェーダー言語であるGLSLを使えば簡単な演算であれば出来るし、こういう大量の粒子が動く系の表現にはフラグメントシェーダーが有効らしいが、習得に時間がかかりそうなので今回はパスしました。

#oimo.js with worker
oimo.jsはworker版が用意されていたのでそちらで実装してみました。
Step毎にworker版oimoで計算された位置及び回転情報をメインスレッドで受け取り、three.jsのオブジェクトに適用し、カメラ位置をCesiumと同期することで、あたかもCesiumで物理演算しているように表示することが出来ました。
GTX980Mとかであれば2万オブジェクトくらいまでは問題なく表示できているので、最新のGPUだともうちょっといくかもしれません。

#いつでも、どこでも、どんなときでも
[Let's 噴火!](https://makinux.github.io/dokodemoVolcano/index.html)
ソースコードは[こちら](https://github.com/makinux/dokodemoVolcano)。やっつけなんで使用する際は適当にきれいにしてください。
VBA 改行をOSによって切り替える

Excel For MacでVBAいじってて、
改行をOSで切り替えたいなと思ったら、案外簡単だった。
MacだとActiveXが使えなかったりしていろいろ不便ですね・・

```vb
Private Function LinefeedCode() As String
    If Application.OperatingSystem Like "*Mac*" Then
      ' Mac 向け
      LinefeedCode = vbCr
    Else
      ' Windows 向け
      LinefeedCode = vbCrLf
    End If
End Function
```

追記：
@nukie_53さんがもっと簡単な方法を教えてくださいました。
ありがとうございます！

vbNewLineというのが、使えるそうです！
※以下、コメントでご紹介頂いたものを貼らせて頂きました

[その他の定数 | Microsoft Docs](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/miscellaneous-constants)

| 定数 | 値 | 説明 |
|:--|:--|:--|
| vbNewLine | Chr(13) + Chr(10)。Macintosh の場合は、Chr(13) | プラットフォーム固有の改行文字。現在のプラットフォームに対応する文字が使用されます。 |
terraform の JSON 部できれいに for ~ endfor  を回したい (jsonencode 関数)

## jsonencode 
S3 の Policy 情報など、terraform の tf ファイル中に JSON を書くケースはそれなりにあります。

terraform 0.12 から `for ~ endfor` に対応したので、リストなどの情報を foreach 的に回して記述をしたいケースがあります。
https://www.terraform.io/docs/configuration/expressions.html

上記２つが交わったときに、いかに JSON に適合した記法にできるか、という課題があります。端的に言うと「ケツカンマ問題」とかです。

同じような課題は他の人も同じように抱えているのか、terraform の公式リポジトリの Issue に以下のようなものが投稿されていました。

[github.com/hashicorp/terraform - template for loop trailing comma in JSON](https://github.com/hashicorp/terraform/issues/23282)

結論としては、 `jsonencode` という組み込み関数を使うと解決します。

Issue に書かれた内容を例にすると

```
      "mountPoints": [
      %{ for mount in mount_map }
          {
           "sourceVolume": "${mount.source}",
           "containerPath": "${mount.path}"
          },
      %{ endfor }
      ]
```
と書くと、ケツカンマ問題が発生し構文エラーになります。

```
      "mountPoints": ${jsonencode([
        for mount in mount_map : {
          sourceVolume  = mount.source
          containerPath = mount.path
        }
      ])}
```

と書くと、ループの内容を JSON 記法に置き換えてくれます。

## Reference 
`jsonencode` の仕様については以下の公式ドキュメントにも記載されています。
https://www.terraform.io/docs/configuration/functions/jsonencode.html

なお、 jsonencode の逆の処理を行う `jsondecode` という関数も存在します。
https://www.terraform.io/docs/configuration/functions/jsondecode.html


jsonencode のような組み込み関数は、terraform のソースの中では以下で定義されているので、どのような機能が使えるか概観したいときはこちらを読むとわかりやすいと思います。
https://github.com/hashicorp/terraform/blob/285e5457352530ba0fe8ff2840260d12f5237028/lang/functions.go#L32-L133

なお jsonencode は内部的には `go-cty` の `JSONEncodeFunc` を呼び出しているんですね。
https://github.com/zclconf/go-cty/blob/master/cty/function/stdlib/json.go#L9-L34
ExcelとGoogleのAPIで緯度・経度情報を取得する方法

Googleが提供しているAPIを使えば緯度・経度の情報を取得することが可能です。一般的にAPI利用は何らかのアプリ開発を伴うものですが、ここではExcelを使ってノンプログラミングで実現する方法をご紹介します。

# GoogleマップのAPIキーの取得

まずはじめにGoogle Maps PlatformのAPIキーを取得する必要があります。

なお、今回作成したレポートサンプルのように、GoogleマップをYellowfinに組み込む場合にもこのAPIキーが必要になります。

APIキーを取得する具体的な手順は以下のサイトを参考にしてください。

https://www.zenrin-datacom.net/business/gmapsapi/api_key/index.html

上記サイトでは「Maps JavaScript API」を選択していますが、今回の例では「Geocoding API」を選択してください。

# Excelファイルの作成

## 項目名の記入

![Excelの編集１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/0e699b6c-d877-1a3d-1fbd-18a6fb3cbfed.png)

わかりやすいように、1行目に以下の項目を入力します。

* 住所
* URL
* XML
* 緯度
* 経度
* 状態

## 住所の入力

![Excelの編集２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/f3fe8844-d06e-fbd4-52aa-20358a6828b7.png)

A列に住所を入力します。

## URLの入力

![Excelの編集３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/2b8cc806-fbd1-a148-68c7-630424f624e4.png)

B2のセルに `="https://maps.googleapis.com/maps/api/geocode/xml?address="& A2&"key=[GoogleのAPIキー]` と入力します。

[GoogleのAPIキー]の箇所には、最初の手順で取得したAPIキーを入れてください。

## XMLを取得

![Excelの編集４.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/5a480bcf-87ff-df53-49a7-93cc033884c2.png)

C2のセルに`=WEBSERVICE(B2)`と入力します。

これはB2のURLにアクセスしてデータを取得する関数です。成功しているとC2のセルにはXMLの文字が長々と入っていると思います。

## 緯度を取得

![Excelの編集５.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/ee3efa42-0702-9d39-22d7-7d7433ddd628.png)

D2のセルに`=FILTERXML(C2,"//location/lat")`と入力します。

先ほど取得したC2のセルにあるXMLのデータから、locationタグ＞latタグにある緯度を抽出しています。

## 経度を取得

![Excelの編集６.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/63e8cbfc-35e1-7ebc-6703-b8ee3591f83b.png)

E2のセルに`=FILTERXML(C2,"//location/lng")`と入力します。上記と同様にして経度を取得しています。

## ジオコーディングの状態を表示

![Excelの編集７.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/e72c51b2-8212-48e3-27a8-e1fe963cfb56.png)

F2のセルに`=FILTERXML(C2,"//status")`と入力します。

「OK」が入っていれば正常に緯度・経度が取得できています。エラーが発生している場合はエラーコードが返ってきます。コードの詳細は以下をご参照ください。

https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes

## セルのコピー

![Excelの編集８.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116818/d9ceb46c-3bd9-d68b-de5b-e74a5aef05ee.png)

他の行にもコピーすれば自動的にデータが埋まります。

# 注意点

このように、Excelで簡単に緯度・経度を取得することが可能ですが、実際に使用するにあたっては以下の注意点があります。

まず、**大量のデータを取得すると費用が発生**します。Google Maps Platformには1か月200ドルの無料枠がありますが、Geocoding APIの場合、40,000回を超えると費用が発生してしまうようです（2019/11/29現在）。詳しくは以下をご参照ください。

https://cloud.google.com/maps-platform/pricing/sheet/?hl=ja

また、上記のExcelではURLとXMLが見えてしまっているのも好ましくありません。特に**APIキーが丸見えになっている**のは問題です。業務で活用する際には、URLとXMLの列を非表示にしたうえで、Excelのセキュリティでパスワードを設定する等の対策を取る必要があります。

最後に、**Windows版のOffice 2013以降のExcel**でしか動作しません。それ以前のバージョンやMac版は不可となっています。