OmniAICreator/Qiita-1.07M huggingface dataset:
getting started: SQLite3 on Python3

## 背景

* Web 系の実装を少しくらいは自分でできるように、まずは  
data の保存に必要な DB を Python から扱えるようにします。
  * DB は、手軽な SQLite3 を利用します。

## 環境準備

* import sqlite3 は初めから利用可能なので不要。

## コード

* file: **example.sqlite3** を作り、読み出す。
  * file が not exist なら create_new_table() を実行する。
  * data の内容はてきとう

~~~python
from __future__ import absolute_import, division, print_function, unicode_literals

import sys
import os
import sqlite3


def	create_new_table( s3f) :

	con	= sqlite3.connect( s3f)
	c	= con.cursor()

	sql_str	= "create table logs ({} integer, {} integer, {} integer, {} integer, {} integer, {} integer, {} integer, {} integer, {} integer, {} integer, {} integer)".format(
		'user_id', 'pref_code', 'year', 'month', 'day', 'rain_pct', 'w_temp', 'y_steps', 'self_exp', 'result', 'm_expect' )
#	print( sql_str)
	c.execute( sql_str)

	cols	= "({}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {})".format(
		'user_id', 'pref_code', 'year', 'month', 'day', 'rain_pct', 'w_temp', 'y_steps', 'self_exp', 'result', 'm_expect' )
	sql_str	= "insert into logs " + cols + " values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
	c.execute( sql_str, (1, 1, 2019, 4,  6, 10, 12, 0, 90, 90, 0))
	c.execute( sql_str, (1, 1, 2019, 4,  7, 30, 14, 0, 80, 70, 0))
	c.execute( sql_str, (1, 1, 2019, 4,  8, 50, 16, 0, 60, 50, 0))
	c.execute( sql_str, (1, 1, 2019, 4,  9, 70, 18, 0, 50, 30, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 10, 90, 20, 0, 60, 10, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 11, 50, 22, 0, 80, 50, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 12, 10, 20, 0, 90, 90, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 13, 10, 18, 0, 90, 90, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 14, 50, 16, 0, 80, 50, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 15, 90, 14, 0, 60, 10, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 16, 70, 12, 0, 50, 30, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 17, 50, 10, 0, 80, 50, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 18, 30, 12, 0, 80, 70, 0))
	c.execute( sql_str, (1, 1, 2019, 4, 19, 10, 14, 0, 90, 90, 0))

	con.commit()
	con.close()


''' SQLite3 '''
s3f	= 'example.sqlite3'

if not os.path.exists( s3f) :
	create_new_table( s3f)

con	= sqlite3.connect( s3f)
c	= con.cursor()

c.execute( "select * from logs")

data	= c.fetchall()
for line in data :
	print( line)

con.close()

~~~

* connect() と cursor() は create の後に再度実行する必要があった。

* 簡単にできたので、手軽に DB R/W の Lib. を作れそう。
5分で5Gについてざっくり知る時のメモ


# 5Gって
GはGenerationの略。1G2Gで初期の携帯が普及。3Gで音楽や画像がダウンロードできるように。3Gと4Gの間にLTEがあったが、今ではほぼ4G=LTEになりつつある。4Gでスマホで映画など可能に。そして5Gが2020年ほどから導入が始まるが、いきなり変わるわけではない。徐々に変わっていく。全国展開というより都市部の導入が現実的。[参考](https://gasket.bizright.co.jp/2018/12/0501-3/)

特徴は３つ
- 早い
- 遅れない
- マルチ

4Gより通信早くなるよ。最大で20Gbpsなので、LTEの<b>100倍</b>程。
[参考](https://www.softbank.jp/support/faq/view/11065)

softbankの下りで最大300Mbps程。[参考](https://www.softbank.jp/mobile/network/service/speed-survey/)

より高周波数帯を使うので電波が直進しかできないので、アンテナの数が増えそう。

# 従来の携帯アンテナ


<img width="261" alt="スクリーンショット 2019-05-14 10.21.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/db564158-4b77-c5d9-5f43-cc24d928c346.png">


#Massive MIMO（マッシブ マイモ）

こういう板状のアンテナが増えます。同時に処理できるようになるので、ライブ会場など人がいっぱいくる場所でも通信しやすくなります。（予定）

<img width="306" alt="スクリーンショット 2019-05-03 15.37.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/6d2e954f-cfe8-3718-877d-8cbff2daf988.png">

<img width="269" alt="スクリーンショット 2019-05-03 15.29.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64334/8a27b795-aa8d-2b9c-0947-137a4a4a766b.png">


横浜スタジアム、東京ドーム、京セラドームには付いてるみたい。
https://news.line.me/articles/oa-rp48470/9cce566109ae
東京臨海広域防災公園の横にあるガン研究所の上にも。
https://twitter.com/denpa893/status/1028099141497278465

より詳細
https://simchange.jp/massive-mimo/
free book
https://massivemimobook.com/wp/free-pdf/
動画
https://www.youtube.com/watch?v=l-CdJTIgGpI


# 3GPP
標準化団体。この辺りが主導してる。


# どこで使うの？
データをいっぱい送りそうな分野で使う。

ネットテレビ
自動運転
ヘルスケア
遠隔手術
IOT
VR動画

2019.07.28
YouTubeでVR映画を無料配信、厳選された5本が順次公開予定
https://www.moguravr.com/tribecca-vr-movie-5-youtube/

2019.07.28
欧州王者リヴァプールのサッカーをVRで 徐々に広がるVR観戦
https://www.moguravr.com/vr-live-watching-liverpoolfc/


#インフラエンジニアの仕事

- 5G機器に入れ替える
- 基地局を増やす、調整する
- 大量のトラフィックの運用監視

[参考](https://netvisionsystems.info/news/32)


# 参考

IHS
https://ihsmarkit.com/Info/0419/promise-and-potential-of-5g.html
総務省の資料
http://www.soumu.go.jp/main_content/000555464.pdf
docomo
https://www.nttdocomo.co.jp/corporate/technology/rd/technical_journal/bn/vol27_1/index.html
softbank
https://www.softbank.jp/mobile/network/5g/
ms
https://azure.microsoft.com/ja-jp/blog/healthcare-on-5g/
その他
https://denpanews.jp/denpainfo/base/20170221_13306.html
https://www.yomiuri.co.jp/fukayomi/20180323-OYT8T50015/
https://qiita.com/shiso_sky/items/f3587281f05824b2e000
https://qiita.com/Black_Kite/items/cebd5eca3d2879f227ed
https://www.sbbit.jp/article/cont1/33874
Mac IntelliJでのpropertiesファイルのnative2ascii変換設定

以外に記事が見つからなかったのでメモ。

| intelliJ version|
|:----------------|
| ultimate 2018.3|

###1. メニューバーのintelliJ IDEAを押下し、[preference]を選択する。
<img width="194" alt="スクリーンショット 2019-05-03 15.40.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41637/3d92a55f-8f9e-48cd-14ad-e70a479dce9b.png">

###2. Transparent native-to-ascii conversionのチェックボックスにチェックを入れ、[Apply]押下
<img width="1009" alt="スクリーンショット 2019-05-03 15.40.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41637/6099eca8-1677-c61a-3491-1aa373af534e.png">

以上。
Windows Update Error 0x8e5e0147 の解決

# 概要
「KB4493509」のインストールをするが失敗、「0x8e5e0147」というエラーコードがでた。
Microsoftの「[Windows Update エラーを修正する](https://support.microsoft.com/ja-jp/help/10164/fix-windows-update-errors)」の手順に従うも失敗。
最終的にTwitterに流れてきた**「Windows updateコンポーネントと更新履歴のリセット」**をしたら解決した。
自分で忘れそうなので、今後似たようなことが起きたときのために記録しておく。

# Microsoftの公式の手順での失敗状況
　1.「トラブルシューティング」では”Service registration is missing or corrupt”のまま未解決
　2.「最新の Servicing Stack Update」はインストール済み
　3.「[Microsoft®Update カタログ](http://www.catalog.update.microsoft.com/Home.aspx)」から直接「KB4493509」をダウンロード・インストールするも失敗
　4.「DISMおよびSFCの実行」も特に効果なし。

# Windows updateコンポーネントと更新履歴のリセット
Windows 10 Help Forumsの「[Reset Windows Update in Windows 10 | Tutorials](https://www.tenforums.com/tutorials/24742-reset-windows-update-windows-10-a.html)」より「Reset_Reregister_Windows_Update_Components.bat」をダウンロードして実行。
コード内容や実行手順についてはリンク先に書いてあるため割愛。
JSエンジニア必見！アプリ開発の際のReact Nativeことはじめ

## 開発環境や前提の知識など

事前環境

• Android, iOS のクロスプラットフォーム・アプリ開発フレームワークです。
  画面デザインとロジックのコードを共通で利用することができます。
  JavaScript でコーディングし、React で画面をデザインできます。

・Node.jsやライブラリ管理にnpmなどが活用されます。
・Homebrew
・＊watchmanをインストール（よく、忘れがちです）

```
brew install watchman
```

## メリット
Android、iOSでコードが共通化できるので、両方開発する場合は開発効率が良い
JavaScript で開発するため、、Web開発者の学習コストが低い
Facebook, Instagram, CookPad, メルカリ など大手で実績がある。

## デメリット
アップデート、保守管理が大変
業務で、少し触れていますが、React Native はソースの管理が難しく、
バージョンをあげたりすると、コマンドが通らなくなったりして、意外と神経を使います


## おすすめツール

Visual Studio Code

PowerShell (Windowsのみ)

Android Studio (Android アプリのビルドに必須)
Android アプリの IDE
Xcode (iOS アプリのビルドに必須)
iOS や macOS アプリ の IDE
Node.js (必須)
React Native アプリのビルドやデバッグに必要。
yarn (必須)
Node.js のパッケージ・マネージャ。npm の改良版で、置き換えが可能。
必須、と書いたが、npm でも代替は可能。ただしメリットはない。

## 参考URL 

React Native開発のすすめ
・https://qiita.com/janus_wel/items/787732d2bf03ed53a3ba

ReactNativeを使ってみる
https://qiita.com/kurohune538/items/fb9f5ff0b005a39fcc27
RailsでSimStringを使う

# 概要
* railsの検索で曖昧な語句を検索するためのモジュール （gem） です。
* 検索は[simstring_pure](https://github.com/davidkellis/simstring) をつかっています。

# ソース
https://github.com/junara/simstring_searchable

# 使い方
## インストール

```Gemfile
gem 'simstring_searchable', github: 'junara/simstring_searchable'
```

```
bundle install
```

使用したいモデルに `SimstringSearchable` を追加する

```your_model.rb
class YourModel < ActiveRecord
  include SimstringSearchable
```

これで準備完了

## 検索
### インデックス作成
最初にインデックスを作成する必要があります。インデックスの作成は、 `create_simstring_index` methodでおこないます。
引数には、検索したい（インデックスを作成したい）カラム名を指定してください。
インデックス作成後、追加したデータでインデックスを更新したい場合も同じメソッドを実行してください。（更新のみをおこなうメソッドは用意していません）
作成された、インデックスは後述の `remove_simstring_index` で破棄するまで有効です。

```irb
irb> YourModel.create_simstring_index(:name)
```

オプションとして 連続したn個の文字で分割するかを第2引数に渡して（整数）設定することができます。デフォルトは3です。

### 検索
検索は、 `simstring_search_result` でおこないます。
第1引数に検索したいカラム。第2引数に `検索文字列` を入れてください。」

```irb
irb> YourModel.simstring_search_result(:name, '検索文字列')
```

オプションとして閾値（threshold （0から1。1が最もマッチしていることを示す））とデータ数（limit。上位いくつのデータを表示するか）を設定することができます。閾値のデフォルトは0.5、データ数のデフォルトは10です。

最もマッチしたデータのみ取得する場合は、 `simstring_find_by` を使ってください。イメージとしては、railsのfind_byに似たかんじのメソッドです。

### インデックスの破棄

作成されたインデックスは破棄するまで有効です。メモリを喰うので、使わなくなったら破棄してください。

```irb
irb> YourModel.remove_simstring_index(:name)
```

なお、まとめてインデックスを破棄できるメソッドはこちらです。

```irb
irb> YourModel.remove_whole_simstring_indexes
```

## アドバンスド

インデックス作成の際に、ブロックを渡すことで文字列を加工する事ができます。
全角英数字を半角英数字に修正したいとうありましたらこちらを利用してください。

下記では、空白（全角 or 半角）を削除してインデックスを作成する例です。

```irb
irb> YourModel.create_simstring_index(:name, gram = 3) {|str| str.gsub(/( |　)/, '')} # replace space by ''
```


## その他

検索結果が空 `[] or nil` の場合はthresholdの値を低く（たとえば 0.1） して検討してください。
また、 結果の順位が印象と合わない場合は、 `gram` の値を変更すると良くなることがありますので調整してみてください。

以上。
Chainer と TensorFlow と PyTorch の Dropout 実装メモ

# 背景

* TensorFlow Lite など, 推論エンジンでは乱数が使えない場合が多い(もしくは IoT 系デバイスだと, メルセンヌツイスターなどの擬似乱数を処理させると重い)
* 既存の機械学習ライブラリで Dropout をどのように実装しているか調べ, 推論でどう扱うかの判断をしたい

## Chainer(v5.4)

Chainer では CPU では numpy.random を使い, GPU では CUDA の random を使っています.

function/link レベルでの seed の設定はありません.

https://docs.chainer.org/en/stable/reference/generated/chainer.functions.dropout.html

https://github.com/chainer/chainer/blob/v5/chainer/functions/noise/dropout.py

deterministic に評価する場合は forward(backward) 実行前に numpy で seed を設定すればいいのかしら?

## Tensorflow r1.13

Tensorflow 自体には `Dropout` という builtin op はありません.

`RandomUniform`, `Scale`, `Division`(+`Floor`) に分解されます.

https://github.com/tensorflow/tensorflow/blob/r1.13/tensorflow/python/ops/nn_ops.py#L2983

TensorFlow では, graph レベルと op レベルで seed を設定することができます.

https://www.tensorflow.org/api_docs/python/tf/random/set_random_seed

TensorFlowで乱数シードを固定する
https://qiita.com/yuyakato/items/9a5d80e6c7c41e9a9d22

これにより, deterministic な実行にさせることができる... はず.

TensorFlow Lite の場合, `RandomUniform` builtin op はありません.

`toco` の graph transformation で `RandomUniform` は定数のテンソルに変換されます(`seed` が設定されている場合. `seed` が設定されていないと純粋にランダムになり定数化できないので変換エラーになります)
このとき, 乱数には tf 側の乱数ルーチンを使って, 振る舞いを同一にしています.

自作の tflite コンバーターを作る場合は, 乱数の生成をどうするか考える必要がありますね.

## PyTorch 1.3.x

PyTorch の `nn.Droput` は, いろいろ関数呼びまくりでソースコードを追うのが面倒なのですが, どうも最終的には `ATen/native/Dropout.cpp` の実装を呼んでいるようです

https://github.com/pytorch/pytorch/blob/master/aten/src/ATen/native/Dropout.cpp

乱数はベルヌーイ分布を使っていますね.

https://pytorch.org/docs/stable/_modules/torch/nn/modules/dropout.html

### 推論側での対応について

基本は deterministic にして事前計算ですが, 実行時に乱数生成することも考えてみます.

WebGL などの GPU 実行で, 本質的に乱数を生成するのが難しい環境では, ノイズテクスチャを作ったり, 近似の乱数生成関数や, シェーダで評価しやすい乱数生成関数を使うことができそうです.

CPU で組み込み系であれば, xorshift や pcg32 などがよいでしょうか.

推論の呼び出し回数などが, ランタイム側で取得できれば, 呼び出し回数を seed にして事前計算した乱数のテンソルを切り替えるという手もありそうです.

## モンテカルロレイトレーシング業界からみた Dropout のふるまい

機械学習でいう Dropout は, モンテカルロレイトレーシング業界からみると russian roulette に似ていますね. 

## TODO

* pytorch での実装を調べる(pytorch では dropout での乱数は, 一様分布ではなくベルヌーイ分布を利用している模様)
* xorshift とかの軽量乱数生成で学習させるとどうなるか調べる
* Halton 列などの準モンテカルロで学習させるとどうなるか調べる
* Deterministic(seed 固定)で学習させると, 学習の精度がどうなるか調べる
* 学習時は non-deterministic で, 推論時だけ deterministic にすると, 推論の精度がどうなるか調べる
ssh用に単一のknown_hostsを生成する方法

毎回ssh初回接続時に聞かれる yes/no で勝手にknown_hostsに追記されてたけど、今回Cloud Buildで個別のknown_hostsを用意したかった。

けど、いまいち自分の ~/.ssh/known_hosts から該当サーバー用のを切り貼りして作るのがイケてない気がしたので諦めて調べた。

```
ssh-keygen -H some.host.name.com >> known_hosts
```

**-H** で 出力されるipをハッシュ化してくれるらしい。

sshはそのままハッシュ化されたipで内容がわかるので出力したファイルはそのまま使えるっぽい。

また、公開鍵が複数用意されてる場合、

```
ssh-keygen -H -t rsa some.host.name.com >> known_hosts
```

のように **-t rsa** などと、鍵の種類を特定できる模様。
PHPの学習方法【GW連投企画】

# XAMPPをフル活用しよう。
環境構築は重要です。でもそれ以上にコード自体を書く事の方が重要です。
LinuxにLAMP環境を作り本格的な環境を作るのは必須なのですが、最初は
挫折率を下げるために避けましょう。

# フレームワークについて
フレームワークは複合技術なので、いきなり学習すると挫折する可能性が飛躍的に上がってしまいます。
PHPだけでログイン機能付きの掲示板アプリ程度のものを作れるようになってから挑戦しましょう

# パーフェクトPHPについて
有名な書籍ですが、入門時には敷居が高いので最初に手をつけるのは避けましょう。
独自でフレームワークを作るところがとても勉強になるのである程度PHPでウェブアプリを
作れるようになってから挑戦しましょう

# 事前準備について
DBと連動しないJava ScriptでDomを操作するチュートリアルと、
DB中心のチュートリアルを学ぶと挫折率はグッと下がります。

# 進め方

## 事前準備
[はじめてのJavaScript](https://dotinstall.com/lessons/basic_javascript_v3)
[詳解JavaScript DOM編 ](https://dotinstall.com/lessons/basic_javascript_dom)
[MySQL入門](https://dotinstall.com/lessons/basic_mysql_v3)

## 本番
[PHPの絵本 第2版 Webアプリ作りが楽しくなる新しい9つの扉](https://www.amazon.co.jp/PHP%E3%81%AE%E7%B5%B5%E6%9C%AC-%E7%AC%AC2%E7%89%88-Web%E3%82%A2%E3%83%97%E3%83%AA%E4%BD%9C%E3%82%8A%E3%81%8C%E6%A5%BD%E3%81%97%E3%81%8F%E3%81%AA%E3%82%8B%E6%96%B0%E3%81%97%E3%81%849%E3%81%A4%E3%81%AE%E6%89%89-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%A2%E3%83%B3%E3%82%AF-ebook/dp/B06ZZDQYYX/ref=sr_1_19?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=php&qid=1556864471&s=gateway&sr=8-19)
プログラミング自体が入門の方向け。変数の概念からイラストでわかりやすく説明してくれます。

[いきなりはじめるPHP~ワクワク・ドキドキの入門教室~ ](https://www.amazon.co.jp/%E3%81%84%E3%81%8D%E3%81%AA%E3%82%8A%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BPHP-%E3%83%AF%E3%82%AF%E3%83%AF%E3%82%AF%E3%83%BB%E3%83%89%E3%82%AD%E3%83%89%E3%82%AD%E3%81%AE%E5%85%A5%E9%96%80%E6%95%99%E5%AE%A4-%E8%B0%B7%E8%97%A4%E8%B3%A2%E4%B8%80/dp/4897978858/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=php&qid=1556864471&s=gateway&sr=8-1)
ちょうど良いボリュームなので繰り返し学習するのに最適です。

[独習PHP 第3版](https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92PHP-%E7%AC%AC3%E7%89%88-%E5%B1%B1%E7%94%B0%E7%A5%A5%E5%AF%9B-ebook/dp/B01FH3KVNU/ref=pd_sim_351_1/357-0805464-3509835?_encoding=UTF8&pd_rd_i=B01FH3KVNU&pd_rd_r=623f7781-6d6d-11e9-88d4-ab3a808ca57b&pd_rd_w=CCZZ2&pd_rd_wg=md2IE&pf_rd_p=b88353e4-7ed3-4da1-bc65-341dfa3a88ce&pf_rd_r=WZ5PFG8D0713QT64V37W&psc=1&refRID=WZ5PFG8D0713QT64V37W)
上記本をある程度理解してから本格的な参考書に挑む方が挫折率を抑えれると思います。

[PHPフレームワーク Laravel入門](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83-ebook/dp/B07CLLW4MX/ref=sr_1_8?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=php&qid=1556864471&s=gateway&sr=8-8)
フレームワークは最近採用が増えてきたLaravelが無難でしょう。

[PHP逆引きレシピ 第2版](https://www.amazon.co.jp/PHP%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94-%E7%AC%AC2%E7%89%88-PROGRAMMER%E2%80%99S-RECiPE-%E9%88%B4%E6%9C%A8/dp/4798119873/ref=sr_1_16?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=php&qid=1556864954&s=gateway&sr=8-16)
逆引き辞書はある程度わかってから全部通して読んでみると欠けている知識を確認できたりします。
HOME

[ ](https://qiita.com/knwldg_base/private/649ddad6f016013f75ed)

***
### Computer Science
[ネットワーク](https://qiita.com/knwldg_base/private/c79e2bf0c284af0097c9)

***
### 選定
[サーバー選定](https://qiita.com/knwldg_base/private/cac77a5792413e740e77)
[ミドルウェア選定](https://qiita.com/knwldg_base/private/384e69885654fe5e2c24)

***
### クラウド
[AWS](https://qiita.com/knwldg_base/private/b2d142fb1ced41d16ebb), [GCP](https://qiita.com/knwldg_base/private/d4f701b3c6c9ef9864a0)

***
### パッケージマネージャ
[Homebrew]()

***
### 仮想化
[Docker](https://qiita.com/knwldg_base/private/da4390208765830cc73e)
[Kubernetes](https://qiita.com/knwldg_base/private/a799d4135f021919a8db)

***
### ミドルウェア
[Hadoop](https://qiita.com/knwldg_base/private/53602e0959646cc060b9)
[Hive](https://qiita.com/knwldg_base/private/8680ec4caa6fc412a7ef)
[Spark]()

***
### 言語
[Java](https://qiita.com/knwldg_base/private/1e233ae1868584e376d6), [JavaScript](https://qiita.com/knwldg_base/private/e397149fdc9427c7889d), [Python](https://qiita.com/knwldg_base/private/f116b0088b8f508b97ef)

***
### その他
[設計書の書き方](https://qiita.com/knwldg_base/private/0d06d038e7c9a8523e3d)
[Git](https://qiita.com/knwldg_base/private/a29972c82f07b586ec3b)
[IT用語集](https://qiita.com/knwldg_base/private/585517b99c7fe10c0cc9)
[Linux](https://qiita.com/knwldg_base/private/11187c605253dd7461a3)
[Mac](https://qiita.com/knwldg_base/private/95d0800682f956c206f8)

[Udemy](https://zine.qiita.com/products/udemy_tob_recommend/)



[勉強記録](https://qiita.com/knwldg_base/private/1360b840a0b9f551efc3)

[データ分析基盤](https://qiita.com/knwldg_base/private/aa33520c476a465570f5)

#### 業務知識
[GPS](https://qiita.com/knwldg_base/private/6c814357a14129336eb7)


#### [数学](https://qiita.com/knwldg_base/private/c006631f8f32357e25a3)
windowsでRails + elasticsearch環境を構築する

## はじめに
最近、個人的に作っているアプリで全文検索を使ってみたくなり、Elasticsearchの環境を構築しました。

しかし、家のPCのOSはWindowsで、Qiitaや開発ブログなどでは大体Mac(Linux)で書かれていて、Windowsを使っている身としては肩身が狭いです。。。そして、Elasticsearchを取り入れる時にも、エラーが結構出ました。

Windows + Railsでelasticsearchを取り入れた時に躓いた部分などを備忘録的に投稿します。elasticsearch初心者なので、初歩的なエラーが多いです。

## アプリにelasticsearchをセットアップ
なお、セットアップには[こちら](https://qiita.com/katsuhisa__/items/264f0c0c2085e6c27bd2)を参考にさせて頂きました。

```
gem 'elasticsearch-model', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
gem 'elasticsearch-rails', git: 'git://github.com/elasticsearch/elasticsearch-rails.git'
```

```ruby
class PoolHall < ActiveRecord::Base
  include Elasticsearch::Model
end
```

以上をGemfileに記載して、bundle installを実行。Elasticsearch::Modelをincludeして、ためしにPoolHall.search 'test'をしてみました。

検索は出来ているように思えましたが、検索結果を出力してみようと思い、resultsのeachやmapを呼び出すと以下のようなエラーが出ました。

```
Faraday::ConnectionFailed in PoolHallsController#new

Failed to open TCP connection to localhost:9200 (Connection refused - connect(2) for "localhost" port 9200)
Extracted source (around line #6):
```

調べたところ、elasticsearchをlocalhost:9200で起動しないと駄目だと知りました。

## elasticsearchをインストール
elasticsearchはJavaを実行できる環境が必要なので、[こちら](https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html)からJREをダウンロード。

Javaはインストールしていたので、実行できるかと思いきや、elasticsearchを実行するとエラーが出ました。こちらは、Javaのバージョンが古かったので、アップデートしたら実行できました。 Java SE Runtime Environment 8u211のWindows x86 Offlineをダウンロードし、インストールしました。

[こちら](https://www.elastic.co/jp/downloads/elasticsearch)のDownloadsのWindowsから、elasticsearchをダウンロード。バージョンは7.0.1です。

elasticsearchをダウンロードし、解凍したら、elasticsearch-7.0.1-windows-x86_64.zip\elasticsearch-7.0.1\bin\elasticsearch.batを実行すると、elasticsearchが起動できます。

## インデックスを作成
以下のコマンドを実行。

```
rails c
```

elasticsearchを起動し、インデックスを作成し、登録。

```
PoolHall.__elasticsearch__.create_index! force: true
PoolHall.import
```

いちいち、コンソールを起動してやるのも面倒なので、[こちら](https://morizyun.github.io/blog/elasticsearch-rails-tutorial/index.html)を参考にタスクを作成。

```ruby
# rails g task elasticsearchで作成
namespace :elasticsearch do
  desc 'Elasticsearch のindex作成'
  task create_index: :environment do
    PoolHall.__elasticsearch__.create_index! force: true
  end

  desc 'Article を Elasticsearch に登録'
  task import_hall: :environment do
    PoolHall.import
  end
end
```

これで以下のコマンドでインデックスを作成できる。

```
rake elasticsearch:create_index
rake elasticsearch:import_hall
```

## 検索結果をactiverecordとして扱いたい
これで、検索の準備が整い、検索をしてみました。

```ruby
@hall = PoolHall.search(params[:word)
```

viewで、検索結果を表示しようとしたところ、インスタンスメソッドを呼び出すところでメソッドが定義されていないとエラーが発生しました。

thumbnailというメソッドは、PoolHallモデルのインスタンスメソッドで、サムネイルを返すメソッドでした。

```erb
<%= @hall.each do |h| %>
  <%= image_tag h.thumbnail %>
<% end %>
```

調べてみると、検索結果はElasticSearchのオブジェクトとして返ってきていたので、当然の結果でした。activerecordとして扱いたい場合は以下の通り。

```ruby
@hall = PoolHall.search(params[:word).records
```

## おわりに
elasticsearchは非常に便利ですね。
今後はkibanaなどにも手を出していきたいです。
Discourse

css


```.topic-thumbnail {
    background-position: center center;
    background-size: cover;
    border-radius: 3px;
    float: left;
    height: 90px;
    width: 130px;
    margin-right: 2em;
}
.topic-list .posts,.topic-list .views,.topic-list .activity {
    display: none
}
.upload-selector {
  label,
  input[type="radio"],
  .radios:nth-of-type(2) {
    display: none;
  }
}```

head

```<script type='text/x-handlebars' data-template-name='list/topic-list-item.raw'>
<td class='main-link clearfix'>
   {{raw "topic-status" topic=topic}}
    {{#if topic.image_url}}
    <a href="{{topic.url}}" class=topic-thumbnail style="background-image: url({{topic.image_url}});"></a>
     {{topic-link topic}}
    {{else}}
     {{topic-link topic}}
    {{/if}}
</td>
</script>```
①WinMergeを使おう！

#WinMergeとは
WinMergeは、オープンソースのWindows用比較・マージツールです。
フォルダとファイル両方が比較でき、理解しやすく扱いやすいテキスト形式で差異を
ビジュアルに表現します。

#1 WinMergeをインストール
[WinMerge公式サイト](http://winmerge.org/downloads/?lang=ja)
(インストールの手順は省かせていただきます。)

#2 準備
1.画面左上にある[ファイル]を選択し、[新規]を選択。
<img width="956" alt="2019-05-03 (4).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/1309ba6a-89b4-55f1-938e-c0f8ed9ec93d.png">

このような画面になればOKです！
<img width="960" alt="2019-05-03 (6).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/43eca015-f557-acb3-b3fc-323cf6ce943d.png">

#3 テキストドキュメントの比較
左側、右側に次のように入力します。
<img width="956" alt="2019-05-03 (17).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/d3954e3c-137e-93e1-dc87-556bd82be326.png">

更新ボタンを押します。
<img width="517" alt="2019-05-03 (13).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/8c6ca041-fda4-50a9-6941-38ddfecb0d33.png">

するとこのようになります！
<img width="960" alt="2019-05-03 (19).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/7a0ccec7-033f-01a7-ce5c-c64c5bfd936e.png">

現在の差異を押します。
<img width="520" alt="2019-05-03 (20).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/2e66ba6a-9e0b-d0ac-fdd3-15a59f9d9d12.png">

するとこのようになります！
<img width="956" alt="2019-05-03 (22).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/afd529cc-7eaf-4c2c-a227-e9575a8e63f7.png">
このように誤字を探すことができます！
今回だと「は」と「わ」ですね！

右側へコピーを押します。
<img width="501" alt="2019-05-03 (27).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/08d53212-5c19-71aa-0d66-796c65c3dbc0.png">

するとこのようになります！
<img width="956" alt="2019-05-03 (24).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407019/5e22b2ca-8696-d43e-09be-2001a0679bca.png">
左側の文字が右側へコピーされ、誤字が修正できました！

#最後に
今回の記事は以上になります！
初めての投稿だったので、読みやすい記事ではないと思いますが、
また機会があれば投稿していき、参考になる記事を書いていきます！！
MacでWindowsからのテキストをiconvで一括変換する

ほんと大した話ではないのだけど、何故か検索するとnkfしか出てこないから。
macで直下のディレクトリすべてのcppファイルをcp932からutf8に変換するだけのスクリプトです。

```
find . -type f | grep "\.cpp$" | xargs -t -I{} sh -c "iconv -f cp932 -t utf8 {} > {}.utf8.cpp"
```
https://gist.github.com/bhind/b85cb780fb349647654436645f1f03af

以上、解散！！
DNSサーバ(bind)を仮想マシンとして作成／＃３：dnsクエリー

# bindを立てたので、クエリー方法を整理する。

## コマンド
- dig
- nslookup
- host

### dig 
| 用法 | コマンド例 |
| :--- | :--- |
| 正引き(TYPE指定なし) | dig HOSTNAME @DNS-SERVER [queryoption] |
| 正引き(TYPE指定あり) | dig HOSTNAME @DNS-SERVER TYPE [queryoption] |
| 逆引き | dig -x ADDRESS @DNS-SERVER [queryoption] |

@DNS-SERVERは省略可(OS設定に従う）

TYPE
- A : ipv4アドレス
- AAAA : ipv6アドレス
- CNAME : C-NAME
- NS : ネームサーバ
- MX : メールサーバ
- SOA : SOA

queryoption
- +[no]edns
- +[no]recurse

### nslookup
| 用法 | コマンド例 |
| :--- | :--- |
| 正引き（TYPE指定なし) | nslookup HOSTNAME DNS-SERVER |
| 正引き（TYPE指定あり) | nslookup -type=TYPE HOSTNAME DNS-SERVER |
| 逆引き（TYPE指定要) | nslookup -type=PTR ADDRESS DNS-SERVER |

TYPE : digと同じ
DNSーSERVERは省略可(OS設定に従う）

### host
| 用法 | コマンド例 |
| :--- | :--- |
| 正引き（TYPE指定なし) | host HOSTNAME DNS-SERVER |
| 正引き（TYPE指定あり) | host -t TYPE HOSTNAME DNS-SERVER |
| 逆引き（TYPE指定要) | host -t PTR ADDRESS DNS-SERVER |

TYPE : digと同じ
DNSーSERVERは省略可(OS設定に従う）
Androidアプリ開発入門①　新規プロジェクトの作成～Hello Qiita

#環境
AndroidStudio　Ver3.4
Windows10
言語：Kotlin

#新規プロジェクトの作成
1.Start a new Android Studio projectをクリック
![スタートメニュー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/c734105e-ff90-efab-c00d-fa607547d9bb.png)


2.プロジェクト選択画面で自分の作成したいプロジェクトを選択(今回はEmpty Activity)
![プロジェクト選択.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/9af0acd0-6607-0675-7253-8d75ec848df3.png)

3.プロジェクト名などをきめNextボタンクリック
![プロジェクト作成.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/1194d6bd-1b21-4631-f33c-6643e0e3f75f.png)


4.AndroidManifest(今回は編集しない)
・アプリケーションのパッケージ名や振る舞いを指定する
[詳しくはこちら](https://developer.android.com/guide/topics/manifest/manifest-intro?hl=ja)
![マニフェスト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/f063a813-3b00-db64-cb9d-7236d1273fc0.png)

5.MainActivity(今回は編集しない)
・プロジェクト作成時に自動作成される
・アプリケーション起動時にここのonCreateメソッドが呼ばれる
![メインアクティビティ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/7df9582c-d728-f9fc-71e0-01f327df3ef8.png)

6.activity_main
・ビュー(外観)の設定
・Designタブでレイアウトの確認および編集、Textタブでコードの編集ができる
![アクティビティメイン.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/7dc773ab-a78a-5da1-5bdc-ae2c4eacca43.png)
![メインアクティビティ_text.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/7d586436-7d2d-b49f-14e6-2df8a084938a.png)

7.エミュレータで実行
・Hello World!と表示された
![エミュレータ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/4686087f-d2d1-eccd-1a77-0e4fdfa0a859.png)

8.「Hello World!」→「Hello Qiita」
・activity_mainのDesignタブを開き、textの右側をクリック
![ハローキータ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/94a4f780-ccbf-4c6c-1c8f-f9ad632a4315.png)

・Add new resourceをクリック
![ハローキータ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/0b6b2832-df85-21da-fcf8-d3b334a3aeaa.png)

・nameとvalueをそれぞれ入力しOK
![ハローキータ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/0f28981d-2483-5eb6-751f-3f919b12fac0.png)

・上で入力したnameが指定されていることを確認
![ハローキータ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/89d895b6-54dd-aeb4-b7f0-a4e4955e3a17.png)

・ビルドしエミュレータで実行し「Hello Qiita」と表示されていることを確認
![ハローキータ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/4d2246a5-8450-cf80-8e83-e45d382ccaa4.png)

・おまけ
13行目「android:text="@string/hello"」を「android:text="Hello Qita"」とすることでも変更可能
(「ちゃんと」つくるなら、上の手順でリソースの登録、リソースの指定をすべき？)
![ハローキータ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406471/1fd962ea-1103-361a-94ce-a8f96d2e47ee.png)
パスワード変更システムの製作（Ｊａｖａ）その２

Eclipseを利用している。

まずプロダクト名である。
これには、「ExreciseJavaSe_DesktopApplication」と名付ける。

その後、(srcパッケージ下に)パッケージ名として
「exerciseJavaSe_DesktopApplicationDAOInterlocking」を作成する。

同パッケージ配下に、

クラスを４つ、
インターフェースを１つ、
ユーザーインターフェースを１つ設ける。

・クラスとは、１つのプログラム
・インターフェースとは、処理内容をメモしたもの
・ユーザーインターフェースは、処理の窓口（データを受け付ける画面のこと）

を設ける。

【クラス】
「Entity_passwordupdate」
「DAO_passwordupdate」
「BLImple_passwordupdate」
「DTO_passwordupdate」

【インターフェース】
「BL_passwordupdate」

【ユーザーインターフェース】
「UI」

をそれぞれ作成する。

とりあえずここまで。。
FlutterでCloud Firestoreがdex file cannot exceed 64Kで動かないときの対応

下記のように`dex file cannot exceed 64K`と出た場合

```
> com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
  The number of method references in a .dex file cannot exceed 64K.
  Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
```

android/app/build.gradleに下記のような設定をおこなうことで解消します。

```gradle

...
android {
  ...
  defaultConfig {
    ...
    multiDexEnabled true
  }
  ...
}
...
dependencies {
  implementation 'com.android.support:multidex:1.0.3'
  ...
}
...
```
  
[FlutterでCloud Firestoreが動かない](https://qiita.com/superman9387/items/dadd0a67a253079b69c1)の対応の方がよいかもしれない。

## 参考
[Issue with cloud_firestore - Cannot fit requested classes in a single dex file.](https://github.com/flutter/flutter/issues/20747)

[64K を超えるメソッドを使用するアプリの設定](https://developer.android.com/studio/build/multidex?hl=ja)
progateの「Ruby on Rails」レッスンを自分のPCで再現したい。が、データベースの構築方法がわかりません。

現在、Progateでプログラミング学習をしている者です。
Webアプリを開発したく、Ruby on Railsのレッスンを学んでいます。

レッスンで学んだSNSアプリを自分のPCにて開発しているのですが、データベースの構築の方法がわからず、同じように開発をすることができません。

開発はatomを使用しております。

お分かりの方、教えていただけますと幸いです。

PCなどの状況は下記の通りです。

OS:macOS Mojave(バージョン10.14.4)
Rails 5.0.3

↑progateのコラム通りに構築をしました。

お分かりの方、教えていただけますと幸いです。
Fedora に LXC, LXD をインストール

# LXC, LXD インストール

```
sudo dnf install -y snapd
sudo systemctl start snapd.seeded.service
reboot

sudo setenforce 0
sudo snap install lxd
sudo gpasswd -a <ユーザ名> lxd
sudo reboot

lxd init
```

lxd init は色々質問されるけど、とりあえず動かすなら default のままで。気になったのは以下

```
Name of the storage backend to use (btrfs, ceph, dir, lvm) [default=btrfs]:
⇒ デフォルト btrfs だけど嫌なら dir とか

Would you like LXD to be available over the network? (yes/no) [default=no]:
⇒ うーんこれなんだ???
```
Openshift Origin (OKD) を Ansible でインストールする

OKD 3.11 を [openshift-ansible](https://github.com/openshift/openshift-ansible) でインストールしたときのメモ。
完全に自分用のメモ。

## 環境

* CentOS 7: 仮想マシン、メモリ 8GB
* シングルマスタ・シングルノード構成 (1台のマシンにマスタ・ノードを同居させる)

なお、メモリ 4GB だと全然足りない(スワップしまくる)。

## 手順

基本的には [Installing Clusters](https://docs.okd.io/3.11/install/index.html) に従ってインストールしていく。

### DNS 設定

インストールするホスト名は DNS で解決できるようにする必要がある。これが意外と地味に面倒。
詳細は [DNS Requirements](https://docs.okd.io/3.11/install/prerequisites.html#prereq-dns) を参照。

自前で DNS サーバを立てるか、既存の DNS サーバにホスト登録を行っておく。
自前で立てる場合は dnsmasq などを使えばよい。ただし、OpenShift をインストールするノードにはインストールしてはいけない。これは OpenShift 自身が dnsmasq を起動するので、UDPポート53番が衝突するためである。

### ホストの準備

#### Proxy設定

Proxy 設定が必要な場合は /etc/environments とインベントリファイルに予め記述しておく。
no_proxy に細かく設定が必要なので注意。なお、no_proxy には CIDR は使えない(10.0.0.0/24などが使えない)が、ドメインサフィックスは使える。

詳細は [Setting proxy overrides](https://docs.okd.io/3.11/install/host_preparation.html#setting-proxy-overrides) と [Configuring Global Proxy Options](https://docs.okd.io/3.11/install/configuring_inventory_file.html#advanced-install-configuring-global-proxy)を参照。

#### ベースパッケージのインストール

ベースパッケージをインストールする

```bash
sudo yum install wget git net-tools bind-utils yum-utils iptables-services bridge-utils bash-completion kexec-tools sos psacct
```

EPEL を有効化する。マニュアルには RHEL7 の手順が書いてあるが、ここでは CentOS 7 の手順で実施。マニュアルでは epel は無効化しておくように指示があるが、面倒なのでそのままにしておく。

```bash
sudo yum -y install epel-release
```

EPEL 経由で必要なパッケージをインストールする。

```bash

sudo yum -y --enablerepo=epel install ansible pyOpenSSL
```

openshift-ansible リポジトリを clone する。

```bash
cd ~
git clone https://github.com/openshift/openshift-ansible
cd openshift-ansible
git checkout release-3.11
```

#### Docker のインストール

Docker をインストールする

```bash
sudo yum install docker
```

Docker ストレージの設定を適宜行う。とりあえず何もしなくても動作はする。

## Ansible インベントリファイルの準備

Ansible インベントリファイルを準備する必要がある。ここではシングルマスタ・シングルノード構成なので、inventory/hosts.localhost をそのまま使うことにする。

## OpenShift のインストール

Ansible を使用して OpenShift をインストールする。sudo が必要なので注意。

```bash
cd ~/openshift-ansible
sudo ansible-playbook -i inventory/hosts.localhost playbooks/prerequisites.yml
sudo ansible-playbook -i inventory/hosts.localhost playbooks/deploy_cluster.yml
```

## ログイン

system:admin でログインできることを確認する。

```bash
sudo oc login -u system:admin
```

なお、system:admin でログインするときは sudo が必要なので注意すること。これは ~root/.kube/config に system:admin のトークンが保存されているため。
このファイルを一般ユーザの ~/.kube にコピーしてやれば、一般ユーザでも system:admin でログインできるはず。

## Webコンソールアクセス

https://[hostname]:8443 にブラウザからアクセスすれば、OpenShift Web コンソールにアクセスできる。
初期アカウントは developer:developer である。
Elasticsearchのバージョンを指定してバージョンアップ（6.x→6.y)


ElasticsearchのSnapshotデータを開発チームでやりとりしようと思うとElasticsearchのバージョンがあわせる必用がある。

今回Elasticsearch6.7.1用のSnapshotを復元したかったので、開発環境にあるElasticsearch6.4.2を6.7.1にバージョンアップします。

# yum update

バージョン指定は下記で.

```
$ sudo yum update elasticsearch-6.7.1
```

インストール可能なバージョンを調べるのは下記コマンド


```
$ sudo yum --showduplicate list elasticsearch
```

間違ってバージョンあげすぎたらダウングレード^^;

```
$ sudo yum downgrade elasticsearch-6.7.1
```



# Elasticsearchのプラグインバージョンアップ

やることはプラグインの入れ直し

いれてあるプラグインの確認

```
$ cd /usr/share/elasticsearch/bin
$ sudo ./elasticsearch-plugin list
```

上記で表示された各プラグインをremove してからinstall

例

```
sudo ./elasticsearch-plugin remove analysis-icu
sudo ./elasticsearch-plugin install analysis-icu
```

某プロジェクト用に用意したやつ再インストールスクリプト → [reinstall-elasticsearch-plugins.sh](https://gist.github.com/RyujiAMANO/c39d1e679a86f52f3f07283cc3c3e015)


# おまけ
まちがってバージョン指定しないでyum updateしたElasticsearchとともにKibanaも6.7.2に。
というわけで下記実行してkibanaも6.7.1にダウングレードしました^^;

```
$ sudo yum downgrade kibana-6.7.1
```
JavaScript: 時計の短針と長針はいつ重なるか

# 報われないのは鐘のあと
> 時計ってすごくおもしろくて。
> 毎時1回は重なるようにできてるんですけど、11時台だけは重ならないの。11時台だけは短針が先に逃げ切っちゃって、ふたつの針って重ならないんですよ。
> 伝えたいメッセージが何かというと『鐘が鳴る前は報われない時間があるということ』

ここで感動した人は、科学的に考えるくせをつけた方がよいでしょう。鐘がなったのちの0時から1時までの間に、ふたつの針が重なることはありません[^1]。長針が短針に追いつくまでに要する時間は、約65分27秒だからです。この話でいうなら、鐘が鳴ったあとこそ報われないことになります。話を1時から始めているのがトリックです。

この計算は、算数で「[旅人算](https://ja.wikipedia.org/wiki/%E6%97%85%E4%BA%BA%E7%AE%97)」または「追越算」と呼ばれます。先に外出した弟の忘れ物を、兄が追いかけて渡そうとしたりするアレです(下はイメージ動画)。

#### 英進館CM：「歩く男」
[![英進館CM：「歩く男」 60秒ver](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128949/71930377-a262-3923-e349-5a45ad197ac4.png)](http://www.youtube.com/watch?v=6I58kZybVUU)
[\>\> YouTubube動画](http://www.youtube.com/watch?v=6I58kZybVUU)


# 分単位の近似値
算数としては、1時から12時まで場合分けして計算することになります。でも、面倒なので近似値をJavaScriptコードで求めてみましょう。知りたいのは時刻ですから、角度は使いません。長針が60分で1周するトラックを、短針の1周にかかる12時間で、長針はいつどこで追い越すか考えればよいのです。

```js
for (let t = 0; t < 60 * 12; t += 0.1) {
    const hours = t / 12;
    const minutes = t % 60;
    if (Math.floor(hours * 10) === Math.floor(minutes * 10)) {
        console.log(Math.floor(hours / 5), Math.round(minutes));
    }
}
```

コンソールの出力はつぎのとおりです。分未満は丸めてあります。ひとつめの数字が時、ふたつめが分です。11時台は60分に追いつくとみなせます。

```console
0 0
1 5
2 11
3 16
4 22
5 27
6 33
7 38
8 44
9 49
10 55
11 60
```


# 秒まで測ってみる
もう少し正確に、秒まで測ってみましょう。今度は、トラックを12時の単位で刻むことにします。時速は、長針が$12メモリ/h$、短針は$1メモリ/h$ということです。長針が$1:00$ちょうどから、初めて短針に重なるまでにかかる時間を$t$として、算数ですけど方程式を使わせてもらいます。1メモリ先にいる短針に、長針がいつ追いつくかです。

```math
12t = 1 + t\\
t = \frac{1}{11}
```

よって、$0:00$から数えれば、長針が短針に追いつくのに要する時間は約$65.455$分となります[^2]。

```math
60 \times (1 + \frac{1}{11}) = \frac{60 \times 12}{11} \approx 65.455
```

時刻表示に直すのは、JavaScriptに任せましょう。`Date`オブジェクトの日時メソッドは、引数に大きな値を渡すと、繰り上げて設定してくれます。ですから、ミリ秒に換算して加えました。

[追記: 2019/05/04] 以下のコードの計算精度を高めました。前の記述は、ご参考までにコメントアウトで残してあります。これにより、最後の出力がミリ秒の誤差を積算した11:59:59から改善されました。

```js
const interval = 60 * 12 / 11;
// const time = new Date(2019, 4, 3);
for (let hours = 0; hours < 12; hours++) {
    const time = new Date(2019, 4, 3);  // 移動
    time.setMilliseconds(hours * interval * 60 * 1000);  // 修正
    console.log(time.toString().split(' ')[4]);
    // time.setMilliseconds(time.getMilliseconds() + interval * 60 * 1000);
}
```

```console
00:00:00
01:05:27
02:10:54
03:16:21
04:21:49
05:27:16
06:32:43
07:38:10
08:43:38
09:49:05
10:54:32
12:00:00
```

[^1]: いや、0:00に重なって始まっている、という指摘があろうことは承知です。この重なり合いが11時台と重複する、それをどちらにカウントするかで「報われない時間」は変わります。でも、0:00の鐘をスタートとするなら、重なりは始まりだということです。そうすると、10:54の鐘ではじまった時間が、0:00に静かに幕を閉じるとしなければなりません。重なりを終わりで数えるのであれば、0:00の鐘はスタートでなく、11:60の鐘で11時台を終えなければならないはずです。

[^2]: $\frac{12}{11}$という分数は、12時間の11等分を意味します。つまり、ふたつの針が重なるのはその時刻だということです。
nvidia-docker+Dockerfileなコンテナの立て方

# とどのつまり

予めDockerfileをしっかり書きたい、しかしnvidia-docker(2)使うときは、

```bash
# Test nvidia-smi with the latest official CUDA image
$ docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
```

みたいにnvidia製のイメージを使わないとうまくいかなそう、どうすればいいの...?って思ったのでいろいろやってみた

結論、

```bash
$ docker run --runtime=nvidia オリジナルのDockerfileをビルドしたイメージ
```

でいけた。ただしDockerfileは本家に倣う必要あり。

# ホスト環境
- ubuntu16.04
- cuda9.0
- nvidia-docker2

# 作りたいコンテナ
- ubuntu16.04
- cuda9.0 + cudnn7
- とりあえず `nvidia-smi` が動いてほしい

# やったこと

## Dockerfileを書く

- 本家nvidia/cudaの[Dockerfile](https://gitlab.com/nvidia/cuda/blob/ubuntu16.04/9.0/devel/cudnn7/Dockerfile)を拾ってきました。
  - 他のcudaやcudnnのバージョンのDockerfileも
https://gitlab.com/nvidia/cuda/
から拾ってこれます。

- 変な環境変数?等あったので適当にコメントアウトしつつ書き換えました

```dockerfile
# ARG IMAGE_NAME
# FROM ${IMAGE_NAME}:9.0-devel-ubuntu16.04
FROM nvidia/cuda:9.0-devel-ubuntu16.04
# LABEL maintainer "NVIDIA CORPORATION <cudatools@nvidia.com>"
ENV CUDNN_VERSION 7.5.0.56
# LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"
RUN apt-get update && apt-get install -y --no-install-recommends \
            libcudnn7=$CUDNN_VERSION-1+cuda9.0 \
            libcudnn7-dev=$CUDNN_VERSION-1+cuda9.0 && \
    apt-mark hold libcudnn7 && \
    rm -rf /var/lib/apt/lists/*
```

## イメージを作る

- 書いたDockerfileがあるディレクトリで

```bash
$ docker build ./ -t cuda-9.0-cudnn7-devel
```

- `-t` オプションで適当にcuda~~~っていう名前をつけました

## じっこう！

```bash
$ docker run --runtime=nvidia --rm cuda-9.0-cudnn7-devel nvidia-smi
```

![Screenshot from 2019-05-03 14-25-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188173/133dfcb0-4609-ecd8-aa3a-20a03a909b27.png)

# 以上！

1マイクロミリバイト以上の情報を得たらいいねしよう☆
mysql sockの理解  webbrick（アプリケーションサーバー）


### 概要

DBと、アプリケーションも通信でやりとりしている。

その通信を担っているのが、
mysql.sock

### クライアントに表示するまで


クライアント →（リクエスト）→webアプリケーションサーバー（webbrick:localhost:3000）

→DBサーバー（127.0.0.1）


### mysql設定ファイル

https://qiita.com/is0me/items/12629e3602ebb27c26a4

### 中身

ipアドレス
```

  1 # Default Homebrew MySQL server config
  2 [mysqld]
  3 # Only allow connections from localhost
  4 bind-address = 127.0.0.1```
```
logger コマンド

■ログに出力させる

logger default-log
→何も指定しない場合、/var/log/messagesにメッセージを出力させる。
[root@localhost ~]# cat /var/log/messages | grep default
Apr 30 15:49:56 localhost root: default-log

logger -p cron.info nanase
→cronに指定する場合、/var/log/cronにメッセージを出力させる。
[root@localhost ~]# cat /var/log/cron | grep nanase
Apr 30 16:09:27 localhost root: nanase
思い立って〇〇分で即SSL化！Let's Encrypt！！

#はじめに
まだHTTPで消耗してるの？（挨拶
HTTPSはGoogleがHTTPは検索から除外するという話などから重要性については理解していたつもりでしたが、自宅サーバのサイトについてはそのままにしていました。

仕事で証明書の事について調べる機会が多かったのですが、その中でLet's Encryptというものがあって無料で証明書が入手可能とわかったので令和の良いスタートにこれを入れたいと思います。

ITでお金を頂いてるだけに素人とは言いませんが、まったく同じことを仕事でしているわけではないので、どれだけの時間でSSL化が可能なのか見てみましょう。

#結論からつまずいたところを紹介
httpd.confではなく、ssl.confの設定が優先されていたため。
httpd.confを一生懸命いじりながら、あーでもないこーでもないを繰り返してた。

#【開始10分】まずはお手本通りに設定
[無料でHTTPS化できる「Let's Encrypt」をやってみた ※install.sh付き](https://qiita.com/daiki_44/items/a3616390f277722b97e0)
上記のサイトを参照して作業を実施しました。とりあえず証明書の発行まではスムーズにいきました。VirtualHostの設定も終わりアクセスしてみますが、保護されてない通信との表示…。スマホからアクセスしてみますが、やはりhttpsだけ繋がりません（コメントにも記載ありますが、この人はUbuntu環境らしく、自分はCentOSなのでそのあたりの環境差異も今回うまくできない原因のひとつだったかも。）

#【開始20分】フルチェインが対応してないことに気付く。
色々調べていたところ、証明書と中間証明書の合体したfullchainとやらはApache 2.4.8以降しか対応してないとのこと。私の環境ではCentOSで、最新を入れても現状では2.4.6なのです。つまり上記で参照したサイトそのままでは対応できないようです。なので中間証明書の記述をfullchainからchainに変更。
…してみましたが、まだうまくいきません。
参考：https://www.slogical.co.jp/ssl/faq/install_apache/

#【開始35分】443ポートが開いてない
スマホ側で表示されているエラーを頼りに調べます。えぇっと「ERR_CONNECTION_REFUSED」…。
調べた結果、そもそも443ポートが空いてない事に気付きました（保護されてない通信が表示されたのはローカルネットワーク内）問題の真因では無いでしょうけど、どちらにせよ対応しなければならないのでルーターの設定をしておきました。

#【開始55分】中間証明書指定の書き方が二種類ある？
色々なサイト見てると中間証明書の指定がSSLCACertificateFileとSSLCertificateChainFileで二種類あるっぽい？SSLCA…から始まるほうを試してみるもダメ。
そういえばそもそもSSLのモジュールあったっけ？
　→ありました。有効にもなってました。

#【開始65分】中間証明書のせいにする。
中間証明書がダメっぽいので絶対中間証明書まわりの設定だと思う。
（結果で言えばそうではなかったけど、何故そう思ったのかと言うとオレオレ証明書であっても証明書は表示されていたから。
ドメイン名とかも設定した内容と同じだったのでLet's Encryptで作成した証明書が当たってるんだとばかり思ってたけど有効期間が１年間になってたし（Let's Encryptは90日間）その時点で違和感を感じるべきだった。）

また、FQDNを入力してSSL化されているかどうか確認するサイトにて中間証明書が正しくインストールされていません。というメッセージが出ることもその方向性に拍車をかけた。
SSL化確認サイト：https://sstool.cybertrust.ne.jp/support_tool/index01.php

#【開始80分】色々やった
SSL設定を外にも記述する、SSLの中身を二重に記述する…など色々やってみたけど反応無し。これはもうApacheの記載自体を疑う必要あり？とりあえず艦これして寝る（本作業に関わってる時だけタイマーを動かしてるので本当はもっと時間かかってて、現在朝の8時。良い子は寝る時間。

寝る前に念のため再確認。
試行錯誤した時のままfullchainになってたのでchainに戻す。当たり前だけどダメ
chainを適当な文字に変える。エラーで再起動失敗するので、設定はやっぱりちゃんと読み込まれてるぽい。

#【開始90分】ssl.confだった。
ssl.confを設定したらようやく正しく表示されるようになりました。
後は流れで、htaccessのリダイレクトと、cron設定して終わり。
疲れた。寝ました。

#もっと早く対処するにはどうすべきだった？
・証明書の有効期限がLet's Encryptの仕様と異なることにもう少し違和感を感じるべきだった。

```
[root@hayate wordpress]# httpd -t -D DUMP_CONFIG 2>/dev/null | grep '# In' | awk '{print $4}'
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/php.conf
/etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
```

あと、こんなコマンドもあるらしい。
これを最初に確認しておけばssl.confに対する気付きも早かった筈。

以上で終わります。本当疲れた！！！
VSCode の Vim モードをオフにするなら toggleVim コマンド

VSCode を Vim Extension で利用していて Vim モードをオンオフしたいときはコマンドパレットで toggleVim コマンドを打てばOK。

`ctr + shift + p` => `toggleVim`

[VSCodeVim/Vim: Vim for Visual Studio Code](https://github.com/VSCodeVim/Vim)
> Disable VSCodeVim extension. This setting can also be toggled using toggleVim command in the Command Palette
Elm開発環境セットアップ for Windows

> 内容が古くなってしまったので昔の話と思ってお読みください。今はVSCodeを使う方が主流です。VSCodeを使う場合は、[VSCodeのElmプラグイン](https://marketplace.visualstudio.com/items?itemName=Elmtooling.elm-ls-vscode)のドキュメントの冒頭にあるInstallの内容に従ってインストールするだけで完了です。
(2021/04/06追記)

# この記事は？
Windowsで何もないところからElmの開発環境を構築したメモです。
@ababup1192 さんのリポジトリを使わせていただいています。
https://github.com/ababup1192/elm-webpack-starter

# 各種ソフトウェアのインストール

>※インストールにあたっての事前確認
自分のPCが64ビットマシンかを確認しておいてください。
確認するには、画面左下のWindowsロゴマークを右クリック　＞　システム
「システムの種類」欄を確認。大抵64ビットのはず。

### Atom（テキストエディタ）
https://atom.io/
インストールが完了するとエディタが起動して、URLにatom://と付与して良いか訊かれるのでYes。
とんでもないところにインストールされているので、スタートにピン留めとかすると良い。
C:\Users\（自分のユーザー名）\AppData\Local\atom\

### Git
https://git-scm.com/downloads
Windowsを選択すると64ビット版がダウンロードされる。
インストール中に6個ほど訊かれるが全て初期状態のままNextでOK。

### Node.js
https://nodejs.org/ja/
10.15.3 LTSをダウンロード（2019/5/3時点）

### Elm
https://guide.elm-lang.jp/install.html

### elmjutsu（Atomプラグイン）
Atomを起動して、画面上部のメニューを選択。
File　＞　Setting
Settingsタブが開くので＋Installをクリック。
検索窓に「elmjutsu」と入力し、HITしたものをInstall。
インストールの途中で、language-elmもインストールして良いかきかれるのでYes。

### elm-format
Elmのソースコードをきれいにフォーマットしてくれるもの。
コマンドラインから使うものだが、Atomプラグインとしても使えるようにセットアップする。

1. コマンドプロンプトを起動（Windowsキー+R　＞　cmd）。

1. npm install -g elm-format と入力してインストール
インストールが完了すれば、コマンドプロンプトで「elm-format」と打つと動く。

> （2019/05/16追記）
コマンドプロンプトで「elm-format」と打って動いた風に見えても、最後の行で以下のメッセージが表示されていることがある。原因不明。
```Access violation in generated code when reading …```
この場合は、elm-formatの導入はやめておきましょう。

1. elmjutsuと同じ要領でAtomプラグイン「elm-format」で検索しインストール。
これを使うと.elmファイルを書き換えて保存したときに自動的にフォーマットされる。
binary path のnot foundのエラーが出る場合は、コマンドプロンプトでelm-formatと打って動くか確認。
コマンドプロンプトで動くのにAtomからだと動かない場合は、Atomで
File　＞　Settings　＞　Packages　＞　「elm-format」
で表示されたelm-formatの「setting」をクリック。
Binary Pathの欄に、
c:¥Users¥（ユーザー名）¥AppData¥Roaming¥npm¥elm-format.cmd
と入力。ちょっと遅いけど動くようになる。

# Elmプロジェクトのセットアップ

任意の場所にフォルダを作成
（例）C:\elm

> ※ここからちょっとコマンド打ち込みが始まります。

1. コマンドプロンプトを起動（Windowsキー+R　＞　cmd）。

1. cd 先ほど作成したフォルダ
（例）
cd c:\elm

1. git clone https://github.com/ababup1192/elm-webpack-starter newproject
（newprojectは任意の名前で良い）

1. cd 先ほど入れた任意の名前
（例：cd newproject）

1. npm install
必要なパッケージがインストールされる。

1. npm run dev
コンパイルが終わると自動的にchromeが開いて、＋－ボタンがあるページが開く。
エラーが出てchromeが自動で開けない場合は、任意のブラウザで以下のURLを開く。
localhost:8080
コマンドプロンプトは開きっぱなしでOK（サーバーが動いている）。

# Elmを書いてみよう
1. Atomで File　＞　OpenFolder...
Elm開発環境のセットアップで作ったフォルダを開く
（例）c:\elm\newproject

1. srcの中のMain.elmを開く
任意の箇所を編集して保存。
（例）最後の方にあるtitleを書き換える
title = "カウンター"
↓
title = "カウンターアプリ"

1. Ctrl + Sで保存
自動的にコンパイルされる。
（開きっぱなしのコマンドプロンプトを見るとわかる）
i ｢wdm｣: Compiled successfully.　と表示されればコンパイル正常終了。
もしエラーがあればここにエラー内容が出力される。

1. 開いていたブラウザに戻り、再読み込みする。
（IEやEdgeならF5、ChromeやSafariならCtrl+R）
↓
**先ほど編集した内容が反映されている！**
Alexaスキルの多言語対応

#Alexaスキルの多言語対応

##概要
本ページは、Alexaスキルの多言語がにあたって参考となる情報、および注意するべき事項を整理するものです。公式ドキュメントにだいたい書いてあるのですが、具体的な意味が分かりづらかったり、追加の参考情報があったほうが分かりやすいものなどある気がしました。

以下の環境を前提とします。

- SDK、ランタイム：ASK SDK v2 for Node.js
- バックエンド：AWS Lambda


##参考情報
- 公式ドキュメント：多言語に対応するスキルを開発する
    - 基本的な流れや注意事項はこちらに記載されています。
        - https://developer.amazon.com/ja/docs/custom-skills/develop-skills-in-multiple-languages.html


##注意事項

### 1つのLambdaファンクションの対応するべき言語

公式ドキュメントに以下の記載があります。


>”カスタムスキル用に作成したクラウドベースのサービスは、サポートされているすべての言語からのリクエストを処理できる必要があります”


バックエンドに何がくるかわからないので公式マニュアルでは抽象的な言い方になっていますが、Lambdaファンクションの場合は、 **バックエンドのLambdaファンクション一つで対応したい言語の全てを正常に処理できるようにする（言語別にファンクションを分割できない）** という意図になります。

下図のように、スキルには複数のエンドポイント（Lambdaファンクションの場合は複数のARN)を指定することができますが、あくまで性能面（レイテンシ）改善のための機能であり、言語別に呼び分けるものではありません。つまり、"北米から呼ばれるLambdaファンクションは英語だけ処理するロジック"、などではNGであり、"同一のコードで複数の言語の処理を行う"必要があります。

![endpoint01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179480/22771527-8fbd-8bd4-a08f-4e994d24bdcf.jpeg)



公式ドキュメントのヒントにも以下の記載があります。

```
 ヒント： レイテンシーを低減するには、コードを複数のエンドポイントにデプロイすることをお勧めします。
```

フォーラムでも以下のやり取りがありました。参考まで。
[ Alexa Skills Kit (ASK) (日本語) Question: エンドポイントの同一コードの意味](https://forums.developer.amazon.com/questions/170803/%E3%82%A8%E3%83%B3%E3%83%88%E3%83%9B%E3%82%A4%E3%83%B3%E3%83%88%E3%81%AE%E5%90%8C%E4%B8%80%E3%82%B3%E3%83%BC%E3%83%88%E3%81%AE%E6%84%8F%E5%91%B3.html)

＃最初は”もしかして呼び分け可能？”と勘違いしそうになったので念の為記載。

### Lambdaファンクションの複数言語対応

- ユーザの言語の判別
    - request オブジェクトのlocaleプロパティを利用します。
    - [localeプロパティの種別](https://developer.amazon.com/ja/docs/custom-skills/develop-skills-in-multiple-languages.html#h2-code-changes)

- サンプルコード（skill-sample-nodejs-howto）
    - https://github.com/alexa/skill-sample-nodejs-howto/blob/master/lambda/custom/index.js


### その他
記載中。
Linux directoryのbackupとrecovery 

directoryのBackup方法ですが、工夫をして頑張りました。

単純に現時点のディレクトリーをアーカイブにしているだけです。
バックアップファイルの格納ですが
Debian系Linuxにはデフォルトで/var/backupsがあります、しかしバックアップしたファイルの保管がローカルの/var/backupsディレクトリーだけではローカルにトラブルがあった時に不安なのでリモートにもバックアップを保管しています。
取り外し可能なメディアがあれば、そこにも格納をしたいのですが...

ここでの方法はNFS共有を使用していますが
ファイルの転送コマンドである
ftpでのput get
scpでのsshを使ったファイルの転送でも同じ事が簡単に出来ると思います。

*NIX系 のマシンが２台必要になります。

まずBackupしたいマシンにNFSのMountPointを作ります。
$ sudo mkdir /mnt/NFS

そこにBackupServerの/srv/NFSディレクトリーをNetwork経由でBackupしたいマシンのMountPointにMountします。
$ sudo mount -t nfs 192.168.xxx.xxx(IpAddress):/srv/NFS /mnt/NFS

コマンドが長いので面倒であれば/etc/fstabに設定を書き込みます。
以下のエントリを追加する。
192.168.1.X:/srv/NFS   /mnt/NFS   nfs   rw,nosuid,_netdev,noauto,hard,intr 0 0

これで $ sudo mount /mnt/NFS だけでマウントするようになります。

【BackUp】
Backupしたいマシンの / ディレクトリーに移動して
directoryにはBackupしたいdirectoryを指定してください。
tarコマンドでアーカイブにします。
$ sudo tar zcvf directory.tar.gz /directory

圧縮したdirectory.tar.gzをNFSserver(BackUpServer)にCopyをする。
$ sudo cp -p directory.tar.gz /mnt/NFS

Recoveryには
NFSserver(BackUpServer)の/srv/NFSから圧縮したdirectory.tar.gzファイルをRecoveryしたいマシンに、copyをして

$ sudo mount -t nfs 192.168.xxx.xxx:/srv/NFS /mnt/NFS
$ cd /mnt/NFS
$ sudo cp -p directory.tar.gz /var/tmp
$ cd /var/tmp
$ sudo tar zxvf directory.tar.gz 圧縮したdirectoryを解凍する。
$ sudo rsync -av directory / 解凍したdirectoryを/ディレクトリーに同期させる。
$ sudo rm -r /var/tmp/directory バックアップ元のディレクトリーを削除。

最後にNFSをUmountします。
$ sudo umount /mnt/NFS

【利点】Network経由で別のマシンにバックアップをするのでローカルの情報をリモートに保存をする事で、万が一ローカルにトラブルがおきたとしてもバックアップを堅実にする事が可能になります。

まだ不安であればリモートの/media/usb0等の取り外しが可能なメディア(記録媒体)にコピーをしておいてバックアップを堅実にするのも良いかもしれません。

沢山のサイトで学びましたが、未熟な点があります事をご理解くださいませ。。
AWS, Azure, GCP and IBM Cloudの比較メモ

マルチクラウドやハイブリッドクラウドを考える上で、3大クラウドのサービス内容を勉強する機会がありました。そこで、整理のために、対応表を作成してみました。各社のすべてのサービスを網羅しているわけではないですが、仮想サーバーやオブジェクトストレージなどのコアとなるサービスを中心として表にしました。 そして、各社の中で、何処が優れ、どれが劣っているとかの比較をするものではありません。 主要なサービス名の言葉の対応を目的としたものです。

最近１ヶ月くらいで勉強したことを、外観的に整理したものなので、間違いも含まれると思います。 気づいた方は、コメントを頂けると幸いです。

後になって知ったのですが、こんな比較表より、もっと、良い資料がありましたので載せておきます。[Public Cloud Services Comparison (March 18th,2019) ](http://comparecloud.in/?fbclid=IwAR2UXuPCL-15NlaHaqhzp4SKPkcwnQX9JQGg1v3my-EGyo_MNEFN6S-sl1E)



|比較項目              |AWS       |Azure       |GCP         |IBM Cloud        |
|:--------------------|:--------------------|:--------------------|:--------------------|:--------------------|
|クラウド利用の親ID|アカウント|アカウント|アカウント|アカウント|
|アカウントの分割管理||ディレクトリ|プロジェクト||
|識別とアクセス管理|IAM|Azure Active Directory|IAM|IAM|
|仮想ネットワークとアクセス管理|VPC|仮想ネットワーク|VPC ネットワーク|Security Group for VPC (Beta)|
|仮想サーバー|EC2|Virtual Machines|Compute Engine|Virtual Server|
|オブジェクト・ストレージ・サービス|S3|BLOB|Storage|Cloud Object Storage (ICOS)|
|稼働監視と警報|CloudWatch|モニター|Stackdriver|IBM Cloud Monitoring with Sysdig|
|ログ管理|CloudTrail|モニター|Stackdriver|IBM Cloud Log Analysis with LogDNA|
|メッセージ通知|SNS|モニター|Stackdriver|Alert Notification|
|ロードバランサー|ELB|ロードバランサー|負荷分散|Load Balancers|
|オートスケーリング|Auto Scaling|Virtual Machine Scale Sets|インスタンスグループ|Auto-Scaling|
|DNSサービス|Route53|DNS zones|Cloud DNS|Internet Services - DNS|
|キャッシング(CDN)|CloudFront|CDNのプロファイル|Cloud CDN|Internet Services - CDN|
|自動プロビジョニング|CloudFormation|Azure Resource Manager|Google Cloud Deployment Manager||
|SQLデータベース・サービス MZ対応|	RDS（Amazon Aurora, MySQL, MariaDB,PostgreSQL, Oracle, MS SQL Server)| CosmosDB SQL|Cloud SQL (MySQL, PostgreSQL),Spanner|Databases for PostgreSQL|
|SQLデータベース・サービス  HA on SZ|RDSでは同一ゾーン、他ゾーンの選択可|MySQL,PostgreSQL,MariaDB,MS SQL Server||Compose for MySQL, Db2, Db2 Warehouse|
|NoSQLデータベース・サービス MZ対応|	DynamoDB|	Azure Cosmos DB for MongoDB API|Cloud Datastore,Cloud Firestore,Cloud Bigtable|Cloudant,Databases for MongoDB|
|キャッシング(KVS)|ElastiCache (memcache, Redis)|Redis|Cloud Memory Store (Redis)|Databases for Redis|
|メッセージング・サービス|Amazon MQ|Service Bus|Cloud Pub/Sub|MQ,Messages for RabbitMQ|
|アプリ・ランタイム|Elastic Beanstalk|App Service|App Engine|Cloud Foundry|
|サーバーレス|Lambda	| Function App| Google Cloud Functions |IBM Cloud Functions|
|Kubernetesサービス| Elastic Container Service for Kubernetes (EKS)|Azure Kubernetes Service (AKS)|Kubernetes Engine (GKE)|Kubernetes Service (IKS)|
|Container Registry|Amazon Elastic Container Registry|Container registries|Container Registry|Container Registry|
|OpenShift|セットアップガイド https://aws.amazon.com/jp/quickstart/architecture/openshift/|マーケットプレイス Red Hat OpenShift Container Platform Self-Managed|ソリューションガイド https://cloud.google.com/solutions/partners/openshift-on-gcp|予定|


## 参考資料
[1] AWSドキュメント、https://docs.aws.amazon.com/index.html#lang/ja_jp
[2] Azureドキュメント、https://docs.microsoft.com/ja-jp/azure/
[3] GCPドキュメント、https://cloud.google.com/docs/?hl=ja
[4] IBM Cloud ドキュメント、https://cloud.ibm.com/docs