OmniAICreator/Qiita-1.07M huggingface dataset:
ディレクトリ・サブドメインの設定

今回はディレクトリを作成し、サブドメインを設定します。

前回同様の環境です。
**〜さくらのVPS 1Gプラン〜**
メモリ：1G
CPU：仮想2Core
ストレージ：HDD 100GB
OS：CentOS 7（カスタムOS）

仮として、アカウント名はrootもしくはabc123、ドメインはabc.comとします。

#はじめに
Terminalでログインできていることを前提とする。

```
[root@abc ~]# 
```

#1．所有者・グループ・権限を変更する
デフォルトではhttp://"ご自身のIPアドレス"/にアクセスした際の参照先は/var/www/htmlとなっている。
しかし、FileZillaなどFTPソフトでファイルをアップロードしようとするとエラーが返される。
所有者とグループ、パーミッションを変更する必要がある。
次のコマンドを実行し、/var/wwwまで移動する。

```
[root@abc ~]# cd /var/www
```
次のコマンドを実行し、現在の状況を確認する。

```
[root@abc www]# ls -l
```
```
合計 0
drwxr-xr-x 2 root root 6  6月 27 22:49 cgi-bin
drwxr-xr-x 2 root root 6  6月 27 22:49 html
[root@abc www]# 
```
デフォルトのhtmlディレクトリの所有者とグループはrootであるため、所有者とグループを変更する。
次のコマンドを実行し、所有者をapacheに、グループをabc（suに切り替える前のアカウント）にする。

```
[root@abc www]# chown apache:abc html
```
再び次のコマンドを実行し、所有者とグループが変更されていることを確認する。

```
[root@abc www]# ls -l
```
```
合計 0
drwxr-xr-x 2 root root 6  6月 27 22:49 cgi-bin
drwxr-xr-x 2 apache abc 6  6月 27 22:49 html
[root@abc www]# 
```
次に、htmlディレクトリの権限を変更する。
htmlディレクトリのデフォルトはdrwxr-xr-xとなっている。
これを数字に置き換えると755、つまりは所有者はReadable・Writable・eXecutableの権限あり、それ以外はReadable・eXecutableのみの権限がある。
グループにもWritableの権限を与えることでabcで書き込みができるようになる。
次のコマンドを実行し、abcにもReadable・Writable・eXecutableの権限を与える。

```
[root@abc www]# chmod 775 html
```

再び次のコマンドを実行し、Readable・Writable・eXecutableの権限が変更されていることを確認する。

```
[root@abc www]# ls -l
```
```
合計 0
drwxr-xr-x 2 root root 6  6月 27 22:49 cgi-bin
drwxrwxr-x 2 apache abc 6  6月 27 22:49 html
[root@abc www]# 
```

#2．ディレクトリを作成する
次のコマンドを実行し、htmlディレクトリに移動する。

```
[root@abc www]# cd html
```
ここにindex.htmlなどをアップロードすれば、http://"ご自身のIPアドレス"/にアクセスしたとき、index.htmlが表示される。
一つのサーバーで複数のサイトを運営したいこともあるだろう。
htmlディレクトリにサイトごとディレクトリを作成して分けることで管理が容易になる。
仮にa1b2c3.abc.comというサイトを運営しようとする。
次のコマンドを実行し、a1b2c3ディレクトリを作成する。

```
[root@abc html]# mkdir a1b2c3
```
次のコマンドを実行し、所有者・グループを変更する。

```
[root@abc html]# chown apache:abc a1b2c3
```
次のコマンドを実行し、権限を変更する。

```
[root@abc html]# chmod 775 a1b2c3
```
ほかにもサブドメインを用いたサイトを運営するのであれば、ディレクトリを作成するところから繰り返す。
ディレクトリや所有者・グループ、権限を一括で作成・変更することができる。
次のコマンドを実行すると、G7H8I9ディレクトリ、4m5n6oディレクトリ、3X1y2Zディレクトリが一括で作成される。

```
[root@abc html]# mkdir G7H8I9 4m5n6o 3X1y2Z
```
ディレクトリ名の代わりに"*"を入力することで、/var/www/htmlディレクトリ内にあるすべてのディレクトリの所有者・グループ、権限が一括で変更できる。
次のコマンドを実行すると、/var/www/htmlディレクトリ内のすべてのディレクトリの所有者をapache
に、グループをabcにすることができる。

```
[root@abc html]# chown apache:abc *
```

同じく、次のコマンドを実行すると、/var/www/htmlディレクトリ内のすべてのディレクトリの権限を775にすることができる。

```
[root@abc html]# chmod 775 *
```
所有者・グループ、権限はご自身の環境に合わせて変更を。

#3．サブドメインを設定する
デフォルトのままでは、2で作成したディレクトリはhttp://"ご自身のIPアドレス"/a1b2c3でなければアクセスできない。
http://a1b2c3.abc.com/ でアクセスできるようにするにはhttpd.confの設定を変更する必要がある。
次のコマンドを実行し、httpd.confを開く。

```
[root@abc ~]# vim /etc/httpd/conf/httpd.conf
```
最終行のあと1行あけて次のように追加する。

```apache:/etc/httpd/conf/httpd.conf
NameVirtualHost "ご自身のIPアドレス":80
<VirtualHost "ご自身のIPアドレス":80>
 ServerAdmin 管理者のメールアドレス
 DocumentRoot /var/www/html/a1b2c3/
 ServerName a1b2c3.abc.com
</VirtualHost>
```
保存したら次のコマンドを実行し、Apacheを再起動する。

```
[root@abc ~]# systemctl restart httpd
```
これで<a>http://a1b2c3.abc.com/</a>にアクセスできるようになる。
この時点では、HTTPSの設定が済んでないため、<a>https://a1b2c3.abc.com/</a>でアクセスするとエラーが表示される。
Ansibleのlineinfileモジュールで該当行を削除

ansibleでファイルの特定の行を置き換えたい場合、
`replace` or `lineinfile` or `blockinfile` を使うと思いますが、
regexpで該当した行の削除を改行コード込みで行いたいと思い調べてみました。

# 結論
`lineinfile` モジュールの `state=absent` を使えば行削除できるようです。
https://docs.ansible.com/ansible/2.5/modules/lineinfile_module.html

# 設定例

```yaml
- name: Delete Line
  lineinfile:
    dest: '/path/to/file'
    regexp: 'deleteしたい箇所'
    state: absent
```
bluetoothの研究　その2

#概要
bluetoothを理解したかった。

#bluezとは。
Linux 2.4.6から正式採用となった。　Bluetooth プロトコルスタックです。

#bluez utilsとは。

対話的に使う方法は bluetoothctl コマンドで、プログラム的には bluetoothd の提供する DBus API を使う。

|廃止されたツール	|代わりとなるツール|
|:-----                |:-------|
|gatttool	|btgatt-client|
|hciattach	|btattach
|hciconfig	|btmgmt (と bluetoothctl)
|hcidump	|btmon (と btsnoop)
|hcitool	|存在しません。D-Bus Device API から利用できます。|
|rfcomm	|存在しません。D-Bus Profile1 API で実装できます。|
|sdptool	|存在しません。複数の D-Bus オブジェクトに機能が分散されています|

#dbusとは。

D-Bus は１台のコンピュータ上で動作する複数のプログラムの間で情報を交換するシステム(IPC:　Inter Process Communication)です。
IPCとは、パイプ、名前付きパイプ、シグナル、共有メモリ、Unix ソケット、ループバックソケット等です。
D-Bus もリンク層は Unix ソケットで動作していますが、手順とフォーマット(プレゼンテーション層)が既定されていることが「生の」Unix ソケットとは異なります。

#bluetoothctlコマンド

- list : ローカルコントローラのリスト表示
- show : コントローラの状態表示
- power on : コントローラ起動
- power off : コントローラ停止
- scan on : デバイス検索モード
- devices : デバイス表示
- pair (dev) : ペアリング
- trust (dev) : デバイスを信用する。自動接続に登録
- paired-devices : ペアリング済デバイス表示
- connect (dev) : 接続
- info (dev) : デバイスの状態
- select (ctrl) : コントローラ (ローカルの BT) 選択
- discoverable (on/off) : on で発見可能にする
- agent (on/off/capability) : リモートデバイスからペアリングを行う時使う。
- default-agent : リモートデバイスからペアリングを行う時使う。
- pairable (on/off) : ペア機能の ON/OFF
- remove (dev) : ペアリングの削除
- disconnect (dev) : デバイス切断
- exit : 終了


以上。
GitHubのDeploy Keyで複数Repositoryに接続する方法

GitHubのDeploy Keyに公開鍵を登録しようとすると。

```
Key is already in use
```

とか怒られて登録できない。

他で使っている鍵は登録できなないのだけど、
Jenkinsとか複数のプライベートリポジトリーにアクセスしたい場合、
ssh configで接続先を変えて対処します。

例えば `repository-second` というリポジトリーの場合

## 鍵を作成

```
$ ssh-keygen -f ~/.ssh/repository-second
```


## ssh configに追記

もしconfigがなかったらファイルを作成する。

```
$ touch ~/.ssh/config
$ chmod 600 ~/.ssh/config
$ vim ~/.ssh/config
```

```config:~/.ssh/config
Host github-repository-first
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/repository-first
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github-repository-second
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/repository-second
  TCPKeepAlive yes
  IdentitiesOnly yes
```


## GithubのDeploy Keysに公開鍵を登録する

```
$ cat ~/.ssh/repository-second.pub
```
の中身を登録する

<img width="1039" alt="Screen Shot 2018-07-12 at 12.41.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/7132/c512300f-cc66-a2e3-e050-a09e5b57697b.png">


## GitHubにアクセス

接続先のホスト名をconfigで指定したホスト名に変更します。

`git@github.com:narikei/repository-second.git`
↓
`git@github-repository-second:narikei/repository-second.git`


これで、

```
$ git clone git@github-repository-second:narikei/repository-second.git
```
でcloneできるはず
WSL（Windows Subsystem for Linux）+ Hyper + Proxyの環境で「apt-get update」が「Failed to fetch...」

## はじめに
前までwslを普通に立ち上げて、apt-get updateしていましたが、ふとhyper使おうと思いインストールして、hyper上で同じことをしたら「Failed to fetch http://...」で困った状態に（久しぶりにwslそのものでやっても発生（いや、頻繁にやっておけよとも思うが、開発環境なのであまり頻繁に更新したくない。。））。
ローカルエリアネットワーク（LAN）の設定はきちんとしているのに、なんか上手くいかないので、調べてみました。
とりあえずの解決策をメモ( ..)φ。

## 環境
こんな環境で発生。

- WSL (Windows 10)
- hyper 2.0

## 何をしたか
apt.confに追記する（無ければ作る）。

```bash
$ vim /etc/apt/apt.conf
```
```vim
Acquire::ftp::proxy "ftp://[IP]:[Port]/";
Acquire::http::proxy "http://[IP]:[Port]/";
Acquire::https::proxy "https://[IP]:[Port]/";
```

ProxyにIDやPasswordがある人はこっちですね。

```vim
Acquire::ftp::proxy "ftp://id:pass@[IP]:[Port]/";
Acquire::http::proxy "http://id:pass@[ip]:[port]/";
Acquire::https::proxy "https://id:pass@[ip]:[port]/";
```
ネットワークの設定自体はWindowsにされているものに依存しているようですが、細かいところは調整が必要な感じですね。
情報処理安全確保支援士（登録セキスペ）を登録すべきか？


#はじめに
情報処理安全確保支援士（登録セキスペ）の登録権利を持っている方向けの記事です。

個人的な結論は、
「属している（or属したい）組織が**登録**セキスペを評価するのであれば、登録すればいい。」です。
私は「**未登録**セキスペ」と名乗ることにします。

#公式情報
「情報処理安全確保支援士」が正式名称で、略称で「登録セキスペ」とも呼んでいる。~~名前が全くかぶってないじゃないか。~~
2018年8月が権利者の登録申請締め切り。
2018年6月時点で、約9000人登録している。

#メリット
国家資格の肩書が持てる。名乗れる。
国家開催の講習に参加できる。講習時にコネができるかもしれない。

#コスト
3年で約14万円のお金が必要。
講習参加や移動の時間が必要。

#リスク
罰金刑・懲役刑を受ける可能性がある。
（よほど意図的な悪さをしない限り、そうそうないでしょうが。しかし、ゼロではない。）

#個人的な所感
そもそも未登録セキスペでも、ある水準以上の能力証明にはなる。
それ以上の付加価値が登録セキスペにあるのだろうか？

業務独占の資格ではないため、登録セキスペだからできる仕事というものは2018年時点では存在しない。
（将来的に法整備される可能性もあるが。。。）

知識を重視するのであれば、もう一回合格するなり、自習したらよい。
そのほうが、金も時間もそのほうが安く上がるように思われる。


#参考
[IPA:制度について](https://www.ipa.go.jp/siensi/whatsriss/index.html)
[未登録情報セキュリティスペシャリスト](https://www.maruoka-digital.jp/blogcontent/1609053338/#314)
[法律で読む情報処理安全確保支援士](https://qiita.com/httpd443/items/88c8c25618dd93958084)
[情報処理安全確保支援士に科せられる懲役刑・罰金刑の罰則まとめ](http://nakameguro.jpn.org/jtec/riss-penalty/)
FileZillaで誤操作対策設定(デバッグメッセージログを味方に！)

FileZillaの設定についての社内向けConfluenceを書いたので、自分用の備忘録も兼ねて転記しました。
CUIソフトって便利な半面、「うっかり誤操作」が怖いですからね。
社内的にも「うっかりし辛い／してもすぐに検知できる」設定を目指しています。

## インターフェース
[編集] > [設定] > [インターフェース] > [ファイル一覧(ファイル リスト)] > [ダブルクリック時の動作] > [ファイルをダブルクリックしたときの動作]を「転送」（デフォルト値）から「**表示/編集**」に変更。
*※誤動作でファイルがアップされてしまうのを防ぐため。*

![filezilla_opt1.png](https://qiita-image-store.s3.amazonaws.com/0/143784/0cba13cb-1436-e96b-3cd1-f0abb9549b48.png)

## ログ
[ログ] の[**メッセージ ログのタイムスタンプを表示する**]と[**ファイルにログを記録する**]にチェックを入れる。
*※FileZillaを一度終了した後も、操作ログを残しておくため。*

![filezillalog.PNG](https://qiita-image-store.s3.amazonaws.com/0/143784/cc2bf5a8-6a09-1605-63c8-94809b65c900.png)

## デバッグ
[デバッグ] > [**デバッグ メニューを表示する**]にチェックを入れ、[**メッセージ ログのデバッグ情報**]は[**デバッグ**]を選択する。
*※これでメッセージログに、より詳細なデバッグメッセージが表示されるようになる。*

![filezilla_debug.png](https://qiita-image-store.s3.amazonaws.com/0/143784/ed19cb4d-8a68-3cf7-337f-222d8fc48974.png)

NO MORE, インシデント！！(๑•̀ㅂ•́)و✧

## 参考サイト
- [FilleZillaのメッセージログを少しだけ使いやすくする](https://www.doe.co.jp/hp-tips/server/fillezilla%E3%81%AE%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%83%AD%E3%82%B0%E3%82%92%E5%B0%91%E3%81%97%E3%81%A0%E3%81%91%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B/)
- [[インフラ] FileZillaでデバッグメッセージを表示する](http://www.84kure.com/blog/2014/11/05/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9-filezilla%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/)
Drupal7 フォームをキャッシュから生成するときbuild_idをrebuildする方法

## 画面がキャッシュから生成されるとは

画面がキャッシュから生成されたかどうかは、開発ツールで確認できる。

### キャッシュじゃない場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49070/b46311f6-e2d3-42aa-987d-0baf8f194c57.png)

### キャッシュから生成された場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49070/9f546039-9a8b-c4b0-f334-c66187d1ed4d.png)

### 通常時とキャッシュから生成されるパターン

新規に画面を開く、URLから遷移する、Submitで次の画面に遷移するなどの場合、通常生成。history back（ブラウザの戻るボタン）などで戻った場合、キャッシュから画面が生成される。

## Drupalのrebuild

Drupalでフォーム画面を表示した際、build_idを持っている。
同じURLでも `$form_state['rebuild'] = TRUE;` とすることで、build_idが再生成される。
しかし、history back等で戻った場合は、build_idの再生成は行われない。

### build_idをrebuildしないことで発生した問題

画面はrebuildを行わなくても問題なく表示されたが、ajaxによるcallback関数が実行されず、正常に動作できない問題が発生した。

### 解決策

解決策としては、キャッシュから画面を生成した場合でも、build_idを再生成してあげる。

## キャッシュから画面を生成したときにbuild_idをrebuildする方法

`immutable` を使用する。

[Drupal 7 の $form_state についてのまとめ | Drupal専門の開発会社 Studio Umi](https://drupal.studio-umi.jp/blog/Drupal-7-form-api-form_state-variable)

以下、一部抜粋

>
- `$form_state` の代表的な要素:
  - `build_info`: 内部で使用。 Form API によって保持される情報の連想配列。もともとのコンテクストが利用できなくなったときにフォームをキャッシュからビルド/リビルドするときに必要です。
      - `immutable`: このフラグが TRUE にセットされると、フォームがキャッシュから読み込まれるときにフォームビルド ID が新たに生成されます。後ほどキャッシュへの保存が再度行われる際には別のキャッシュ ID を持ちます。結果として、もともとのフォームと form_state は変更されずに残ります。これは、ページキャッシュが有効なときに匿名ユーザの間で form_state が漏れるのを防ぐために重要です。


`$form_state['build_info']['immutable'] = TRUE;` を設定することで、history backした際でもbuild_idがrebuildされるようになった。

結果、ajaxのcallbackも呼ばれるようになった。
macOS+Unity2018 で Blend Modes v3 が動かない場合の対処法

オブジェクト間で、Photoshopライクな合成ができるので、愛用してる人も多いだろう「[Blend Modes](https://assetstore.unity.com/packages/tools/particles-effects/blend-modes-28238)」。

Unity2018にしたときに挙動が怪しかったので、2系から3系に上げたのだが、こんな感じで、どうにも期待通りに動かない。。

![スクリーンショット 2018-07-12 12.20.12.png](https://qiita-image-store.s3.amazonaws.com/0/6047/ca08e7fa-ecb3-98f7-051a-f82487420655.png)

あれこれソース見てたら、コンポーネント定義を見つけられずに逝っている模様...
ふと、定義元（/Assets/BlendModes/ExtensionSources.asset）の設定を見てたら、

![スクリーンショット 2018-07-12 12.20.38.png](https://qiita-image-store.s3.amazonaws.com/0/6047/53b4d253-4f1b-c8f4-edf9-aef100d409d1.png)

ほう...
つまり、、macの場合にはこうじゃ！

![スクリーンショット 2018-07-12 12.43.24.png](https://qiita-image-store.s3.amazonaws.com/0/6047/163ee1a0-c9f0-29a5-186c-98b9f021b7f0.png)

と直したら、無事、

![スクリーンショット 2018-07-12 12.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/6047/fad45e6b-9dec-1b4a-e9fe-e8d92c0bab8f.png)

と期待通りに。

パス周りとか環境変数周りは地味にMac/Win両対応でハマりやすいから、オレオレEditor拡張でも気をつけないとなー。（Windows触る気なんて、全然ないけど）
Webpack4 + Vue.js + Pug + Sass


webpack4でvue.js + pug + sass 環境つくろうとしてハマったのでメモ

## やりたかったこと

単純に `.vue` の **template** を **pug** で、
**style** を **sass(scss)** で書きたかっただけ。

sass(scss)は特に問題なかったけど、
templateで `lang="pug"` を指定するとエラーが出て先に進めなかった。


ググって出てくる記事のほとんどは、
webpackのバージョンが3以前だったり、
特に設定いらないと書かれていたりで参考にならず。。

## 答えは vue-loaderの webpack.config.js 設定

今回の環境構築でインストールした `vue-cli` のバージョンが `2.9.6` 、`vue-loader` のバージョンが `15.2.4` だった。

vue-loaderのサイトに **[Migrating from v14](https://vue-loader.vuejs.org/migrating.html)** と書かれたページを発見。

そこの [template](https://vue-loader.vuejs.org/migrating.html#template-preprocessing) に関する記載箇所には
> v14 and below uses consolidate to compile &lt;template lang="xxx"&gt;. v15 now applies preprocessing for them using webpack loaders instead.
> 
> Note that some template loaders such as pug-loader exports a compiled templating function instead of plain HTML. In order to pass the correct content to Vue's template compiler, you must use a loader that outputs plain HTML instead. For example, to support &lt;template lang="pug"&gt;, you can use pug-plain-loader:

と書かれていて、ざっくり理解した感じだとプレーンなHTMLを渡すのに、 今まで使っていた `pug-loader` ではダメで、 `pug-plain-loader` を使いましょう。ということみたい。

なので

```:bash
$ npm i -D pug-plain-loader
```

して

```:webpack.confg.js
{
  module: {
    rules: [
      {
        test: /\.pug$/,
        loader: 'pug-plain-loader'
      }
    ]
  }
}
```

でいけました。

なお、
> If you also intend to use it to import .pug files as HTML strings in JavaScript, you will need to chain raw-loader after the preprocessing loader. Note however adding raw-loader would break the usage in Vue components, so you need to have two rules, one of them targeting Vue files using a resourceQuery, the other one (fallback) targeting JavaScript imports:

とあり、JavaScript内にHTML文字列として `.pug` をインポートしたい場合は `raw-loader` を使う必要があるらしいんだけど、そのまま突っ込むと Vueコンポーネントの処理を止めちゃうそうなので設定を分けていれましょう。とのこと。

```:bash
$ npm i -D raw-loader
```

して

```:webpack.config.js
{
  module: {
    rules: [
      {
        test: /\.pug$/,
        oneOf: [
          // this applies to `<template lang="pug">` in Vue components
          {
            resourceQuery: /^\?vue/,
            use: ['pug-plain-loader']
          },
          // this applies to pug imports inside JavaScript
          {
            use: ['raw-loader', 'pug-plain-loader']
          }
        ]
      }
    ]
  }
}
```
とすればいいらしい。

英語苦手なんでざっくり理解なんだけどとりあえず解決。

解釈間違ってたらご指摘いただけると嬉しいです(＞人＜)
Azureを利用したDR対策ハンズオンに参加してきた！

「Azure 東西リージョンでのディザスター リカバリー環境の実現」と題された
ハンズオンを受けるべく渋谷ヒカリエの8階へ行ってきました。
おしゃれな建物ですが、8階は一部、工事中のためか、時々物音が聞こえてきます。
![blog_antenna.jpg](https://qiita-image-store.s3.amazonaws.com/0/270447/90649391-87d2-367c-d69b-049f680106b5.jpeg)

Azureの東日本リージョンで動かしているシステムを、災害時などに西日本リージョンへ
切り替えるというシナリオで行われました。

私が過去に災対プロジェクトに携わらせて頂いたときは、1年単位のプロジェクトでしたが、午後からの、わずか数時間で出来てしまいました。

システムの切替に必要なサービスは主に下記の2つ
・Recovery Services Vault
・Trffic Manager

Recovery Services Vaultは、Recovery Services コンテナと表示されていることもあります。
こちらのサービスがディスクのバックアップ/リストアを行ってくれます。
自動リストア時にカスタムデプロイさせるためにRunbookを作成しました。
当日、利用したサンプルは下記にあります。
https://github.com/Yuichi-Ikeda/PowerShell

LB、VNET、PublicIP、管理ディスクなどは課金されないので事前に用意しておいて東日本リージョン側で障害が起きたらTraffic Managerがアクセスを切り替えてくれる動きとなりました。
![blog.jpg](https://qiita-image-store.s3.amazonaws.com/0/270447/ef72b7cb-f90b-468d-39da-269d3bf1352b.jpeg)

AzureでDRを行うには、下記のリージョン
・同じ地理クラスター内の2つのリージョンでレプリケートが可能
・2つのコア、1GBメモリを備えたスペックのVMが対象

Microsoft decodeでも登壇されているとのことで下記より資料がダウンロード可能です。
また、Azure Antenna、この他にも多数のハンズオンが行われています。

Azure Antenna
https://azure.connpass.com/

decode時の資料と動画
資料　https://goo.gl/jcXgXd
動画　https://youtu.be/GZzfjOItGW8
SQL::Translatorをインストールする

# 概要
migrationを導入していないある案件で`開発中DB`と`次期version開発中DB`とに差分が出てきて、同期をとる必要があった。
そこでその差分をチェックし、同期を取るためのSQLを生成してくれる[SQL::Translator](https://github.com/dbsrgits/sql-translator)をインストールして使ってみたのでそのメモ。

他にも色々な機能があるようだが詳細は[公式サイト](http://sqlfairy.sourceforge.net/)を参照。

# インストール手順
## MacOS
homebrewからinstallする事が出来る。

```
brew install sql-translator
```

## CentOS
```
yum install perl-SQL-Translator.noarch
```
## 確認

```
# コマンドの第一引数がoldDB, 第二引数がnewDB
sqlt-diff oldDB newDB 
```

```
# 引数には[ファイルパス=RDBMS名]で指定。比較結果をリダイレクトでファイル出力
sqlt-diff sample.sql=MySQL sample2.sql=MySQL > ~/Desktop/sample-diff.sql
```

## 参考
* https://qiita.com/yangci/items/95988da67e241b68f5ed
【AWS勉強メモ】AWS CLIでDynamoDBにデータを投入 (aws dynamodb batch-write-item)

DynamoDBを利用して開発していると, [CloudFormation](https://aws.amazon.com/jp/cloudformation/)あるいは[Serverless Framework](https://serverless.com/)で環境構築後に，初期データをDynamoDB投入する必要があったので，その方法をメモとして記載します．

# 目次

- 1. 実行環境
- 2. スクリプト
- 3. 実行
- 4. 補足

# 1. 実行環境

DynamoDBのheightとweightテーブルの2つを事前に作成します．

![image00.png](https://qiita-image-store.s3.amazonaws.com/0/262328/b01c756b-fb86-678f-435d-037dc57cda24.png)
[【AWS勉強メモ】Serverless Frameworkで暗号化をサポートしたDynamoDBテーブルを作成](https://qiita.com/akatsukaha/items/7ffd5a7eb230cf3607f2)にて記載の環境を事前に作成

# 2. スクリプト

データ投入用スクリプト

```bash:init_dynamodb.sh
#!/bin/bash
set -eux

# REGION
AWS_REGION="ap-northeast-1"

# PROFILE
PROFILE="dynamodb-admin"

aws dynamodb batch-write-item --request-items file://dynamodb.json --region $AWS_REGION --profile $PROFILE
```

投入データ

```bash:dynamodb.json
{
  "weight":[
    {"PutRequest":{"Item":{"user_id":{"S":"0001"},"value":{"N":"160"}}}},
    {"PutRequest":{"Item":{"user_id":{"S":"0002"},"value":{"N":"180"}}}}
  ],
  "height":[
    {"PutRequest":{"Item":{"user_id":{"S":"0001"},"value":{"N":"60"}}}},
    {"PutRequest":{"Item":{"user_id":{"S":"0002"},"value":{"N":"75"}}}}
  ]
}

```

パラメータについて

- AWS CLI 共通
    - `--region`で使用リージョンを指定
    - `--profile`で利用する[プロファイル（権限）](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html)を指定
- dynamodb batch-write-item
    - `--request-items`で投入するデータを格納したファイルパスを指定

# 3. 実行

```bash
$ ./init_dynamodb.sh

+ AWS_REGION=ap-northeast-1
+ PROFILE=dynamodb-admin
+ aws dynamodb batch-write-item --request-items file://dynamodb.json --region ap-northeast-1 --profile dynamodb-admin
{
    "UnprocessedItems": {}
}
```

下記の出力から全てのデータが投入できたことがわかる．

```
{
    "UnprocessedItems": {}
}
```

# 4. 補足

Serverless FrameworkでDynamoDBを構築しているので，`sls remove`でDynamoDBのデータ含めてテーブルを削除している
【Coq】1+1=2の証明


#coqとは
いろいろ証明したりできます。

今回は1+1=2を証明しました。
参考文献は[Coq/SSReflect/MathCompによる定理証明:フリーソフトではじめる数学の形式化](https://www.amazon.co.jp/Coq-SSReflect-MathComp%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E-%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%95%B0%E5%AD%A6%E3%81%AE%E5%BD%A2%E5%BC%8F%E5%8C%96-%E8%90%A9%E5%8E%9F/dp/4627062419)
これに解説が丁寧に書かれていますので、なにか分からないことがあったらこの本を見ればいいと思います。
というか導入とかまともに解説しようとすると丸パクリになってしまうので、気になる方は[Coq/SSReflect/MathCompによる定理証明:フリーソフトではじめる数学の形式化](https://www.amazon.co.jp/Coq-SSReflect-MathComp%E3%81%AB%E3%82%88%E3%82%8B%E5%AE%9A%E7%90%86%E8%A8%BC%E6%98%8E-%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BD%E3%83%95%E3%83%88%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%95%B0%E5%AD%A6%E3%81%AE%E5%BD%A2%E5%BC%8F%E5%8C%96-%E8%90%A9%E5%8E%9F/dp/4627062419)を買ってください。p42-p46に参考にさせていただいた記述があります。
もっと正確な内容を知りたいという方は[公式のドキュメント(英語版)](https://coq.inria.fr/distrib/current/refman/)をみてください

#コード

```Coq:1+1.v
From mathcomp
  Require Import ssrnat.

Section naturalNumber.

Lemma unko_of_legends (n : nat): 1 + 1 =  2.
Proof. 
rewrite addn1.
reflexivity.
Qed.

```

#かいせつ

自然数[Coqの標準ライブラリ](https://coq.inria.fr/distrib/current/refman/language/coq-library.html?highlight=nat)で以下のように帰納的に定義されています。

```Coq
Inductive nat : Set := O | S (n:nat).
```
O、S(O)、S(S(O))とかS(S(S(S(O))))とかが自然数です。
自然数の加法は[ssrnatの公式ドキュメント](http://ssr.msr-inria.inria.fr/doc/ssreflect-1.5/Ssreflect.ssrnat.html)というライブラリで定義されています。
複雑でよくわからないのでssrnatの解説はパスで
1,2行目

```Coq
From mathcomp
  Require Import ssrnat.
```

ssrnatのライブラリを読み込んでいます。これで自然数の加法の定義を読み込めました。

3,4行目

```Coq
From mathcomp
  Require Import ssrnat.

Section naturalNumber.

Lemma unko_of_legends: 1 + 1 =  2.
```
まで読み込み、Coq IDEの上部のViewからDesplay notationsのチェックを外すとゴールエリアに

```Coq
1 subgoal
______________________________________(1/1)
eq (addn (S O) (S O)) (S (S O))
```
と表示されます。
addn (S O) (S O)) は 1 + 1　について+を関数として書いたもので、項(term)です。


eq (addn (S O) (S O)) (S (S O)) が　1 + 1 = 2　について=の関数として書いた命題(Proposition)です。

eqは
[公式のドキュメント](https://coq.inria.fr/distrib/current/refman/language/coq-library.html?highlight=equal)
で一般に以下のように定義されています。　

```Coq
Inductive eq (A:Type) (x:A) : A -> Prop :=
  eq_refl : eq A x x.
```
Propつまり命題と書かれているのがみればわかります。
自然数のequalの定義はペアノの公理とか言ってもっと混み合っているので、詳しくは[公式のドキュメント](https://coq.inria.fr/distrib/current/refman/language/coq-library.html?highlight=nat)
rec

細かい言葉の使い方はよくわかりませんが意味としてはだいたいこんなもんです。たぶん。
[Angular] Angularアプリをブラウザのコンソールからデバッグする方法

**(2020年12月追記)**

最初に書いた`ng.probe`はなくなった(?)ようです。
代わりに下記のようにすると、指定したエレメントを含むコンポーネントを取得できます。

```js
ng.getOwningComponent($0)
```

----

Angularのコンポーネントを、ブラウザのコンソールからちょっと覗いてみる方法です。

AngularJS時代は、[angular.element($0).scope()](https://qiita.com/sengoku/items/02029aad29cd7f5744bb)なんて方法でいけました。それのAngular時代版です。

# 見たいエレメントを選ぶ

インスペクタから見たいエレメントを選びます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/6133c83a-f28b-001d-6175-a3b410bf57a0.png)


# コンソールへ`ng.probe`と入力

次のように入力すると、コンポーネントオブジェクトがダンプできます。

```js:
ng.probe($0).componentInstance
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/7f7d739d-1104-10c9-9a13-4d7d6b4154bc.png)


何かエラーが出たら、間違ったエレメントを選んだか、デバッグモードが無効になっていると思われます。
OpenCVでかすんでる文字をクッキリさせる方法

光学文字識別(OCR)を実装する際、ソース画像の文字がかすんでると識別精度が著しく落ちてしまう事がよく見られる。今回かすんでる文字のサンプルを使って、OpenCVで色々な画像処理アルゴリズムを試してみました。

ソースコードが下記になります：

```python
import cv2, os
import urllib.request as url
import numpy as np
from matplotlib import pyplot as plt

def main():
    # Load sample image from URL
    req = url.urlopen('https://i.pinimg.com/originals/d3/1b/31/d31b31653d7cc0d672fc72fb1de9bf7a.png')
    arr = np.asarray(bytearray(req.read()), dtype=np.uint8)
    img = cv2.imdecode(arr, -1) # 'Load it as it is'
    h, w, ch = img.shape
   
    print('Width: {}'.format(w))
    print('Height: {}'.format(h))
    print('Channel: {}'.format(ch))

        
    # If reading local image, use below:
    # img = cv2.imread('local_image.jpg')

    #### (1) Effect - Gamma Adjustment ####
    
    # Convert from RGB to gray scale
    gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    gamma = 0.4 # r<1 will increase bright contrast ratio

    # Gamma adjustment
    pic1 = gray.max() * (gray/gray.max()) ** (1/gamma)
    cv2.imwrite(os.path.join('output_image','1_gamma_adjusted.png'), pic1)

    #### (2) Effect - Adaptive Binary Thresholding ####
    pic2 = cv2.adaptiveThreshold(gray,20,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,67,2)
    cv2.imwrite(os.path.join('output_image','2_binary_thresholding.png'), pic2)

    pic3 = cv2.adaptiveThreshold(gray,20,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,33,2)
    cv2.imwrite(os.path.join('output_image','3_binary_thresholding_gaussian.png'), pic3)

    #### (3) Effect - Laplacian Filter ####
    pic4 = cv2.Laplacian(gray,cv2.CV_16SC1, ksize=29)
    cv2.imwrite(os.path.join('output_image','4_laplacian_filter.png'), pic4)

    ### Plot results
    titles = ['Original (Blurry Word)', 'Gamma Adjusted (r=0.4)','Adaptive Mean Thresholding (blocksize=67)', 
                'Adaptive Gaussian Thresholding', 'Laplacian (kernel size=29)']
    images = [img, pic1, pic2, pic3, pic4]

    for i in range(len(images)):
        plt.subplot(-(-len(images)//2),2,i+1),plt.imshow(images[i],'gray')
        plt.title(titles[i])
        plt.xticks([]),plt.yticks([])
    plt.show()

if __name__ == '__main__':
    main()

```
[Python 3.5+で実行]

実行すると、左上のオリジナル画像と変換処理した結果が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/263382/49756654-80c7-e0f2-742b-240bf5382caf.png)


パラメータの調整は試行錯誤とある程度の経験にもよりますが、シンプルなコードで割とオーライな結果だと思います。
vagrant-docker-compose プラグインの使い方

### 概要

vagrant でお手軽に docker-compose 実行環境が導入できる vagrant-docker-compose プラグインというものがあるようなので使ってみました。
https://github.com/leighmcculloch/vagrant-docker-compose

本記事では nginx コンテナに index.html を配置してブラウザで表示するサンプルを紹介します。

### 実行環境

* Windows 10 pro
* VirtualBox 5.2.12
* Vagrant 2.1.2
* vagrant-docker-compose 1.3.0


### インストール

Vagrantがインストールされた状態で次のコマンドを打ちます。

```
vagrant plugin install vagrant-docker-compose
```

### フォルダ構成

```
├─ docker
│  ├─ docker-compose.yml
│  └─ www
│     └─ index.html
└─ Vagrantfile
```

* dockerフォルダをマウントするので、docker-compose.ymlで使うフォルダ（ここではwww）はdocker配下に置いています。

### ファイルの編集

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  # Ubuntu 16.04を使う場合
  config.vm.box = "minimal/xenial64"
  
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./docker", "/vagrant/docker"
  
  # docker の設定
  # 注）run: "always" が必須
  config.vm.provision :docker, run: "always"
  
  # docker-compose の設定
  config.vm.provision :docker_compose,
  	yml: "/vagrant/docker/docker-compose.yml",
  	compose_version: "1.21.2",
  	run: "always"
end
```

```docker/docker-compose.yml
version: '2.0'
 
services:
  web:
    image: "nginx:1.15.0"
    ports:
      - '80:80'
    volumes:
      - ./www:/usr/share/nginx/html
    restart: always
```

```docker/www/index.html
<!DOCTYPE html>
<html>
<head>
  <title>Hello</title>
</head>
<body>
  <h1>Hello from Vagrant Docker Compose</h1>
</body>
</html>
```

* Vagrantfile
    * コメントにも書いていますが、`run: "always"`を書かないと「Couldn't connect to Docker daemon. You might need to install Docker」というエラーが出てしまいます。（参考: [#38](https://github.com/leighmcculloch/vagrant-docker-compose/issues/38)）
    * `compose_version` は使用する docker-compose のバージョンです。READMEによるとデフォルトは1.8.0のようなので、現時点での最新バージョン（1.21.2）にしています。


### 実行

ターミナルで `Vagrantfile` の置いてある場所に移動して↓を実行します。

```
vagrant up
```

ブラウザで http://192.168.33.10 にアクセスすると"Hello from Vagrant Docker Compose"が表示されます。
viの使い方メモ

##概要
自分がviエディタを使う時に毎回毎回コマンドを調べているのでまとめておこうと思って
注:私がよく使うものしか載せてないです

##基本的操作
###起動
vi ファイル名.py (pythonの場合)

###モード
viにはコマンドモード・編集モードの2つのモードがある.

・[Esc]キーで常にコマンドモードになる.
　→コマンドモードでviを保存や終了できる

###コマンドモードコマンド
<コマンド> 作業 というように記述
  
~終了系~           
  <:q>   セーブせずに終了     
  <:w>   セーブするが終了しない
  <:wq>  セーブして終了　　　　

~編集モードに移る~
  < i > 現在のカーソル位置から編集可能




メモ　これから随時更新予定
Proxy環境下のCentOS7にDockerとre:dashをインストールする手順

## はじめに
Proxy環境下でCentOS上にdocker環境を構築し、その上にredashをインストール起動させるまでの手順をメモに残しておきます。基本は[公式ドキュメント](https://docs.docker.com/install/linux/docker-ce/centos/)に記載されているので詳細を知りたければそっちを読んだほうが良いです。
また`git`がインストールされていない環境などは想定していないので適宜対応してください。
あとポート番号やドメイン名は仮ものです。

## 構築環境 2018.07
product | version
--------- | ---------
CentOS | CentOS7
docker | 18.03.1-ce
docker-compose  | 1.21.2
redash  | 4.0.1

## 作業手順
### dockerインストール
* dockerインストール

    ```shell
    #必要パッケージのインストール
    $ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

    # リポジトリ追加
    $ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

    # yumのパッケージインデックスを更新
    $ sudo yum makecache fast

    # dockerインストール
    $ sudo yum install docker-ce

    # インストール確認
    $ docker --version
    ```

    ```shell:docker用ストレージを使ってdockerデーモン起動させる設定追加
    # `/etc/sysconfig/docker-storage` の末尾に下記を追加
    DOCKER_STORAGE_OPTIONS=--storage-driver=devicemapper --storage-opt dm.datadev=/dev/vg-docker/data --storage-opt dm.metadatadev=/dev/vg-docker/metadata
    ```

    ```shell:dockerの起動
    $ sudo systemctl start docker
    ```

* dockerのproxy設定

    ```shell:Docker用のsystemdディレクトリを作成します
    $ sudo mkdir -p /etc/systemd/system/docker.service.d
    ```

    ```shell:HTTP_PROXY用の設定ファイルを作成し設定を書き込みます
    $ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

    [Service]
    Environment="HTTP_PROXY=http://proxy.hoge.jp:9999/”
    ```

    ```shell:HTTPS_PROXY用の設定ファイルを作成し設定を書き込みます
    $ sudo vim /etc/systemd/system/docker.service.d/https-proxy.conf

    [Service]
    Environment="HTTPS_PROXY=http://proxy.hoge.jp:9999/"
    ```

    ```shell:設定を反映します
    $ sudo systemctl daemon-reload
    ```

    ```shell:Dockerを再起動します
    $ sudo systemctl restart docker
    ```

    ```shell:設定適用の確認
    $ systemctl show --property=Environment docker
    Environment=HTTP_PROXY=http://proxy.hoge.jp:9999/ HTTPS_PROXY=http://proxy.hoge.jp:9999/
    ```

### docker-composeインストール
redashはコンテナ管理にdocker-composeを利用しているため必要。

* `https://github.com/docker/compose/releases`に記載された最新のインストールコマンドでインストールする。

    ```shell
    # Proxy設定
    $ export http_proxy=http://proxy:9999/
    $ export https_proxy=https://proxy:9999/

    # docker-composeのインストール
    $ sudo -E curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    $ sudo chmod +x /usr/local/bin/docker-compose

    # インストールの確認
    $ docker-compose --version
    ```

### redashインストール手順

    ```shell
    # とりあえずwwwに環境構築する
    $ mkdir /var/www

    # redashリポジトリから取得する
    $ git clone https://github.com/getredash/redash.git

    # redashディレクトリへ移動
    $ cd /var/www/redash/

    # docker上に環境構築
    $ docker-compose -f docker-compose.production.yml run --rm server create_db

    # docker上のredash起動
    $ docker-compose -f docker-compose.production.yml up
    ```
CloudTrailのログをAthenaで見る【DataLake入門】

# CloudTrailがS3に溜め込んだログをAthenaを使って読み込む


# CloudTrailとは

AWS CloudTrail は、AWS アカウントのガバナンス、コンプライアンス、運用監査、リスク監査を可能にするサービスです。 CloudTrail を使用すると、AWS インフラストラクチャ全体でアカウントアクティビティをログに記録し、継続的に監視し、保持できます。CloudTrail では、AWS マネジメントコンソール、AWS の SDK やコマンドラインツール、その他の AWS のサービスを使用して実行されるアクションなど、AWS アカウントアクティビティのイベント履歴を把握できます。このイベント履歴により、セキュリティ分析、リソース変更の追跡、トラブルシューティングをより簡単に実行できるようになります。


# 何もしなくても９０日間はイベントをログとして保持している。


![名称未設定.jpg](https://qiita-image-store.s3.amazonaws.com/0/97564/93d1f0cb-6961-55fc-65ea-3ad7cbaa9f3c.jpeg)




# まずは証跡を作る
![名称未設定2.jpg](https://qiita-image-store.s3.amazonaws.com/0/97564/03dc7c42-45a2-a5fc-dbdf-0d34f19bccb5.jpeg)

　

# Athenaで使うテーブルを作成する
![名称未設定3.jpg](https://qiita-image-store.s3.amazonaws.com/0/97564/229c823f-71e0-0316-e632-fc524a7614e2.jpeg)
![名称未設定4.jpg](https://qiita-image-store.s3.amazonaws.com/0/97564/7283c4ac-ddaf-b38e-6de9-a0b9d41ab2ff.jpeg)






# Amazon Athena
- Athenaとは

Amazon Athena はインタラクティブなクエリサービスで、Amazon S3 内のデータを標準的な SQL を使用して簡単に分析できます。Athena はサーバーレスなので、インフラストラクチャの管理は不要です。実行したクエリに対してのみ料金が発生します。
Athena は簡単に使えます。Amazon S3 にあるデータを指定して、スキーマを定義し、標準的な SQL を使ってデータのクエリを開始するだけです。多くの場合、数秒で結果が出てきます。Athena を使用すると、分析用データを準備するための複雑な ETL ジョブは不要になります。これによって、誰でも SQL のスキルを使って、大型データセットをすばやく、簡単に分析できるようになります。
Athena は初期状態で AWS Glue データカタログと統合されており、さまざまなサービスにわたるメタデータの統合リポジトリを作成できます。データソースのクロールとスキーマの解析、新規および修正したテーブル定義とパーティション定義のカタログへの入力、スキーマのバージョニング保持が可能です。また、Glue の完全マネージド型 ETL 機能を使用すると、データ変換や列指向の形式への変更を実行でき、コストを最適化してパフォーマンスを向上できます。



# さっき作ったテーブルに対してクエリを投げてみる

![名称未設定5.jpg](https://qiita-image-store.s3.amazonaws.com/0/97564/4cce4b54-db0b-d450-eec3-4a161fddf251.jpeg)


# 結果を確認する

![名称未設定6.jpg](https://qiita-image-store.s3.amazonaws.com/0/97564/1fd53d62-1247-8f3b-0415-bd806c132401.jpeg)

結構簡単にデータが取れるのでDataLake入門には良さそう
https://gist.github.com/fs-wu/7f1df17126213d18048dc2d57aaaf417

自分のためのメモ
https://gist.github.com/fs-wu/7f1df17126213d18048dc2d57aaaf417

C:\Program Files\Oracle\VirtualBox\drivers\vboxdrv\VBoxDrv.inf　ファイルを右クリックしてインストール
コマンドプロンプトを管理者モードで開いたうえで、sc start vboxdrvを実行する
その後仮想マシンを起動すると成功！
EC2からRDS(MySQL)への接続を行う

EC2からRDSへの接続を行う手順になります
あらかじめRDSのDBインスタンスの作成をしている前提になりますのでご了承ください。

## 準備
Amazon RDSのDBインスタンスのセキュリティグループで、MySQLポートを開けておきましょう
<img width="315" alt="スクリーンショット 2018-07-12 11.51.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/186277/ba2181c5-879c-8065-0b22-36db2790f902.png">


### mariaDB削除
```bash
$ sudo yum remove mariadb-libs
$ sudo rm -rf /var/lib/mysql
```
### mysqlがインストールされているか確認
```bash
$ yum list installed | grep mysql
```

### mysqlインストール
```bash
$ sudo yum install mysql
```

### Amazon RDSヘ接続する
```bash
$ mysql -h {ENDPOINT} -P 3306 -u {Username} –p {Name}
password: hogehoge
// こんなのが表示されれば成功
Server version: 5.6.39 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

## 番外編：アンインストール方法
### yumでアンインストール処理を実施
```bash
$ yum remove mysql
```
### データが入っているディレクトリを削除
```bash
$ rm -rf /var/lib/mysql
```
MAMPを使って複数バーチャルホストのローカル環境を設定する

案件を回す時に便利なバーチャルホストの複数設定の備忘録

##MAMPをダウンロード&インストール
公式からMAMPをダウンロード
https://www.mamp.info/en/

（MAMP PROはまだ使ったことがない。）

・ダウンロードしたらインストール
・インストール手順は割愛

##バーチャルホスト設定を有効化する

おそらくこの場所に入っている
/Applications/MAMP/conf/apache/httpd.conf 

ファイル内を[virtual hosts]で検索すると、574行目あたりに

```html:httpd.conf
# Virtual hosts
#Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```

これがあるので、Includeのコメントアウトを外す

```html:httpd.conf
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
```

##複数ホストの設定
おそらくこの場所に入っている
/Applications/MAMP/conf/apache/extra/httpd-vhosts.conf 

27行目くらいからサンプルの設定記述が書いてある

```html:httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/Applications/MAMP/Library/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error_log"
    CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/Applications/MAMP/Library/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>
```

これを参考に、自分の設定したいホストを指定する

```html:httpd-vhosts.confの例
<VirtualHost *:80>
    DocumentRoot "/Applications/MAMP/htdocs/test.tanitani.local"
    ServerName test.tanitani.local
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/Applications/MAMP/htdocs/tanitani.development"
    ServerName tanitani.development
</VirtualHost>
```

DocumentRoot
→プロジェクトのドキュメントルートに設定したいフォルダのパス
ServerName
→アドレスバーに打って表示させたいホスト名

##ホストの設定
おそらくこの場所に入っている
/private/etc/hosts

ターミナルから作業した方が早い（というか慣れている）ので、
1.ターミナルを開いて
2.sudo vi /etc/hostsを入力してenter
3.パスワードを入力する
4.viでhostsファイルが開く

```html:/private/etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
```
こんな感じの中身

5.iを押下してinsertモードにする
6.下の方にさっき設定したServerNameを設定

```html:/private/etc/hosts

127.0.0.1       test.tanitani.local
127.0.0.1       tanitani.development
```

7.escキーを押下
8.「:wq」を入力してenter

これでhostsファイルの設定完了

##MAMPのポート設定を変更する

MAMPメニューの「Preference」→[Ports]タブ→「Apache Port」を「80」に設定してOK

##MAMPを起動する
起動先にしてた場合は再起動してね。

##ブラウザで確認

アドレスバーにServerNameにいれてたホスト名を入力してEnter
例）tanitani.development/

![スクリーンショット 2018-07-12 11.45.34.png](https://qiita-image-store.s3.amazonaws.com/0/75345/bc8e86d7-037b-13ff-c8cb-7a240106233e.png)

うまく表示されればOK
GraphQL を練習するための小さなスクリプトの例

話題の GraphQL を試してみようと graphql gem に加えて graphiql-rails を入れ、ジェネレーターを実行し、その上 yarn で apollo-boost graphql-tag graphql を入れ、Vue 用に vue-appollo も入れとくか、としていたら自分が何をしているのかわからなくなってきたのでスタート地点に戻って GraphQL のみを単体で簡単に試せる方法を調べました。

下のコードは手動で `gem i graphql` すれば ruby ですぐに実行できます。

# ping に対して pong を返す

```ruby
require "bundler/inline"

gemfile do
  gem "graphql"
end

GraphQL::VERSION                # => "1.8.5"

class QueryType < GraphQL::Schema::Object
  field :ping, String, null: false, description: "疎通確認"
  def ping
    "pong"
  end
end

class FooSchema < GraphQL::Schema
  query(QueryType)
end

FooSchema.execute("{ ping }").to_h # => {"data"=>{"ping"=>"pong"}}
```

# User.find(1) の結果を返す

```ruby
require "bundler/inline"

gemfile do
  gem "graphql"
end

GraphQL::VERSION                # => "1.8.5"

class UserType < GraphQL::Schema::Object
  field :id,   ID,     null: false
  field :name, String, null: false
end

class QueryType < GraphQL::Schema::Object
  field :user, UserType, null: true do
    description "指定IDのユーザーを取得"
    argument :id, ID, "ユーザーID", required: true
  end

  def user(id:)
    Struct.new(:id, :name).new(id, "alice") # User.find(id) したことにする
  end
end

class FooSchema < GraphQL::Schema
  query(QueryType)
end

FooSchema.execute(<<~QUERY).to_h # => {"data"=>{"user"=>{"id"=>"1", "name"=>"alice"}}}
{
  user(id: 1) {
    id
    name
  }
}
QUERY
```
JS初心者がReactを始める上でつまづいたこと

Reactを始めてから１週間がすぎ、色々とわかってきたことやわからないことも増えてきたので復習も兼ねて投稿してみます。
Reactをこれから始める方やjsを始めて触る位の方を想定しています。

ちなみに筆者はjs自体もreactと同時に始めた程度のため、必ずしも適切な表現を使っているとは限らないことにはご注意ください。

# ReactはSPAである
SPAとは`Single Page Application`のことです。
どこにでも書いていることだとは思いますが、これと『SPAでない』ものの差を考慮しておかないといけません。
なお、SPAは『一枚のhtmlファイルに対して動的にjsで変更を加えながらブラウザに描画する』ことができます。

## どんな時に迷った？
Flask(Pythonのサーバーサイドフレームワーク) + jQueryで書かれているソースコードをReactで書き直そうと思った時

## どういう風に迷った？
Flask+jQueryでは(rails, djangoでも同様だと思いますが)、`render_template`など「htmlファイルをレンダリングのためのメソッド」を呼び出すことで、
『別々の`html`ファイルを各ページに対してレンダリングしている』ので、それをどう
『一枚の`html`ファイルに対して変化を及ぼすように変更するのか』という点

## どういう風に解釈した？
FlaskはAPIサーバーであり、`JSON`形式のデータをReactに渡すためのものだと解釈した。
つまり最初に描画する1枚の`html`ファイルは`render_template`を使って呼び出すことが必要であるものの、それ以外の(ボタンを押すなどの)処理については`201 Created`などをデータと一緒に渡すためのものとして活用するようにした。

# データの流れが違う
上記の問題と関連性が強いですが、Flask+jQueryのものを書き直そうとした時に悩んだことです。

## どういう風に解釈した？
- Flask+jQueryの場合: 
    - Flaskで`html`をレンダリング -> レンダリングした`html`ファイルが内部に書かれているjsファイルを読みに行く
- Flask + Reactの場合:
    - 最初のページの描画:
        - Flaskで`html`をレンダリング -> レンダリングした`html`ファイルが内部に書かれているjsファイルを読みに行く
    - 2回目からの描画:
        - Reactで書かれたjsファイルがユーザーの入力に応じてデータをFlaskに要求　-> FlaskはJSON形式のデータをReactに返す -> 変更箇所を描画

と解釈した。


# SPAの`HTML`ファイルは一枚とは限らない
SPAを理解した気になったあと、理解しづらかったのがこれについてでした。

## どんな時に気付いた？
(大きなコードを書いていた時)どう考えてもページ遷移した方がいい(orしたい)と思った。

## どういう風に迷った？
SPAという名前なんだから`html`ファイルは１枚なんだろうという思い込でしまっていた。

## どういう風に解釈した？
SPAは『一枚のhtmlファイルに変更を加えながら描画する』ものであって、それがページ全体として必ずしも一つでなくてもいいと考えた。
でも、**コンポネントを使いまわせるとことがReactの強みなので、別ページの`html`であってもコンポネントは使い回せばいい。**

具体的には、例えば`facebook`などを見ればいいと思いますが個人ページのボタンをクリックした時、`url`が遷移します。
デフォルトではSPAではページ内であればurl遷移はしない(後述していますが同HTML内で遷移している可能性もありますので断言はできませんが)ので、**仮想DOMなのに全とっかえしないといけない程度に激しいコンテンツ変化**等の場合であれば、`html`ファイルを分ければいいのかなと思いました。

# SPAでも`HTML`内で`URL`遷移はすることがある
これを『ルーティング』と呼ぶそうです。
もっとわかりやすく言えば、『ユーザーからの入力を受け取った時、それに応じて表示させるページを出し分ける』処理のことを言います。
通常SPAでは同html内で動作が行われた時、そのURLは遷移しませんが、履歴などを残したい時などで苦労をします。

## どんな時に気付いた？
tutorialなどで作るメモアプリを拡張しようとしていた時に、『同じhtmlファイルだけどurlの遷移を行いたい』と思った時

## どういう風に迷った？
Flaskでサーバーサイドの処理を行なっていたのですが、『データを渡すと同時にhtmlファイルを新たにレンダリングしないといけないのか？』と考えてしまった。具体的にはこんな感じにしないといけないのかなと思った。

```python:mistake.py
app.route('/')
def index():
    return render_template('index.html')  # htmlを描画するための関数

app.route('/hoge', methods=['POST'])
def hoge_data():
    json_data = {}  # 何かしらのjsonデータ
    return json_data

app.route('/hoge')
def hoge_page():
    return render_template('index.html')
```

## どういう風に解決した？

完全にこれの解決策に合致するものだったので、`react-router-dom`を使った。
例としては[qiita - react-router@v4を使ってみよう：シンプルなtutorial](https://qiita.com/m4iyama/items/b4ca1773580317e7112e)などを見るとわかりやすいと思います。



# 迷ったらFacebookを見ればいい
Reactを始めてやって行く中で『どういうページを作りたいのか』などの指針が存在すると思います。
それでいうならば結局、Reactで作って行くにあたりプラクティスの多くはReactを作ったFacebookに詰まっていると思いますので、Facebookを見ながらコンソールにらめっこをするのが一番いいと思います。
Jabra Stealth UCの日本語化

# Jabra　Stealth UCとは

Bluetoothのハンズフリーヘッドセットです。
あまりにもドキュメントが少ないため、メモ代わりに投稿しました。

[製品ページ](https://www.jabra.jp/bluetooth-headsets/jabra-stealth)

# 日本語化作業
デフォルトの英語のガイダンスも良いのですが、ちょっと鬱陶しいので、
変更します。
1. [製品サポートページ](https://www.jabra.jp/supportpages/jabra-stealth#/#100-99800000-36)より、ファームウェアをダウンロード。
2. デバイスの電源をOFF。付属のUSBケーブルでPCと接続する。
3. １でダウンロードした、バイナリを起動。
4. 英語で説明が出てきますが、要は、以下を実行すればよろし。  
4-1. マイクミュートボタンと、通話オフボタンを同時に長押し。  
4-2. ランプが薄紫に光ると、長押しをやめる。  
4-3. ファームウェアのインストールが開始される。  
5. インストールが終わると、ケーブルを抜いて接続を解除。
6. Bluetooth接続を行えば、日本語のガイダンスが流れる。

# トラブルシューティング
 - リセット方法  
 電源をONにした後、マイクミュートボタンと通話オフボタンを長押し。  
 ランプが薄紫に光ると、再起動が始まり、ペアリング待機状態になります。  
このとき、今まで接続していたPCなどの各種デバイスは、再度ペアリングが必要なため既存のペアリング情報は削除してください。

※自分用メモですが、何かあればコメントをお願いします。
RedmineでGitの履歴が表示されなくなった件

なんか、ブランチが表示されなくなったので・・・・調べて解決したのでまとめ

結論このページの通りにやったら修正できた。
http://www.redmine.org/attachments/11617/git_adapter.rb.patch


Redmine version                3.4.6.stable.17417
Ruby version                   2.4.1-p111 (2017-03-22) [x86_64-linux]
Rails version                  4.2.8
Git                            1.8.3.1

エラーはこんな感じ

```

Completed 500 Internal Server Error in 200ms (ActiveRecord: 21.5ms)

ActionView::Template::Error (incompatible character encodings: UTF-8 and ASCII-8BIT):
    30:   <% end -%>
    31: 
    32:   <% if !@repository.tags.nil? && @repository.tags.length > 0 -%>
    33:     | <%= l(:label_tag) %>:
    34:     <%= select_tag :tag,
    35:                    options_for_select([''] + @repository.tags, @rev),
```

なんか　gitの方で tagに日本語を使ったのがあかんかったっぽい

cd /var/lib/redmine/lib/redmine/scm/adapters/
で移動して
vim git_adapter.rb
で編集

~~branch_rev = line.match('\s*(\*?)\s*(.*?)\s*([0-9a-f]{40}).*$')~~ 
branch_rev = line.force_encoding('UTF-8').match('\s*(\*?)\s*(.*?)\s*([0-9a-f]{40}).*$')
に変更
 ~~@tags = io.readlines.sort!.map{|t| t.strip}~~
 @tags = io.readlines.sort!.map{|t| t.strip.force_encoding('UTF-8')}
に変更

上記二箇所変更で修正された。
AlibabaCloudのオブジェクトストレージを作成する(ROS版)

# はじめに
今回は、AlibabaCloudのオブジェクトストレージを
ROSで構築します。

# コンソールでログインして、サンプルテンプレートを使用して構築します

![d59330af.png](https://qiita-image-store.s3.amazonaws.com/0/241104/9613bc9f-f417-3e36-ac41-63f026646c39.png)

# まとめ
今回はこれだけの単なる紹介です。
検証用などで単純に作るだけなら、こちらで十分ですネ。
Anaconda3をアンインストールする

Anacondaで環境構築をしていたが、Dockerに乗り換える場合などに。

## 前提条件
```sh:console
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.5
BuildVersion:	17F77
```

## anacondaのお掃除
anaconda-cleanを使います。

```sh:console
conda install anaconda-clean
anaconda-clean # 問題がなければすべてyで答える
sudo rm -rf /anaconda3 # which condaの結果を削除する
```

## .bash_profileや.zshrcからPATHを削除
以下の記述を削除します

```sh:.bash_profile
export PATH="/anaconda3/bin:$PATH"
```

## SHELLの再起動
```sh:console
exec $SHELL
which python # /usr/local/bin/pythonなどが表示される
```
`/anaconda3/bin`を見ていなければ終了。
MongoDB 4.0 のトランザクション機能をMongoシェルから試す

MacOSにMongoDB 4.0をインストールしてトランザクションを試します。

まずはMongoDB 4.0をダウンロードして解凍


```
wget https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.0.tgz
tar zxvf mongodb-osx-ssl-x86_64-4.0.0.tgz
```

データディレクトリを作る

```
cd mongodb-osx-x86_64-4.0.0/
mkdir data
```

MongoDBをレプリカセットモードで起動（通常モードだとトランザクションは使えないため)

```
./bin/mongod --dbpath data --replSet rs1
```

別のターミナルでMongoシェルで接続して、１台のmongodからなるレプリカセットを設定して、初期化

```
./bin/mongo
> rs.initiate({"_id":"rs1",members:[{_id:0,host:"＜IPアドレス＞:27017"}]})
```

プロンプトが　`rs1:PRIMARY>` 　になればレプリカセット構築完了OK

testデータベース　のmycolコレクションに、まず１つデータを入れる

```
rs1:PRIMARY> use test
switched to db test
rs1:PRIMARY> db.mycol.insert({"a":1})
WriteResult({ "nInserted" : 1 })
```

トランザクションを開始しして、２つ目のデータを入れる

```
rs1:PRIMARY> session = db.getMongo().startSession()
session { "id" : UUID("0277f85e-b00f-4d3e-8398-7afa22fc5e97") }
rs1:PRIMARY> session.startTransaction()
rs1:PRIMARY> mycol = session.getDatabase("test").mycol
test.mycol
rs1:PRIMARY> mycol.insert({"a":2})
WriteResult({ "nInserted" : 1 })
```

この時点では、他のクライアントからは{"a":2}のドキュメントは見えない

トランザクションをコミットする

```
rs1:PRIMARY> session.commitTransaction()
```

これで、他のクライアントからも{"a":2}のドキュメントは見えるようになった
単語分散表現の最適な次元数を決めるための指針

単語の分散表現は現在の自然言語処理では不可欠な技術です。ニューラルネットワークベースのモデルで自然言語処理の問題を解く際は、入力としてよく使われています。最近では[Elmo](https://kamujun.hatenablog.com/entry/2018/07/06/173931)のような言語モデルと組み合わせて使うことでタスクの性能向上をはかっています。

単語分散表現はよく使われていますが、その次元数をどのくらいの値に設定すればよいかは自明ではありません。おそらく、ほとんどの場合に50次元〜300次元程度の値を設定しているのではないでしょうか？


本記事では、単語分散表現の最適な次元数について論じた以下の論文について紹介します。結論としては、単語分散表現の最適な次元数はタスクに依存するのですが、固有表現認識のような構文が重要なタスクでは次元数が低いほうが良い結果になります。

* [The Role of Context Types and Dimensionality in Learning Word Embeddings](https://arxiv.org/abs/1601.00893)

記事の構成としては、最初に論文の概要について簡単に述べ、そのあと最適な次元数について述べることにします。

## 論文の概要

論文について一言でいうと、単語分散表現を学習できるモデルの一つであるskip-gramの学習に異なるタイプの文脈を使って学習・評価を行ったという話です。モチベーションとしては、様々な文脈を使って学習したモデルの性能について調査した研究がないというところにあります。Skip-gramについては以下を参照。

* [絵で理解するWord2vecの仕組み](https://qiita.com/Hironsan/items/11b388575a058dc8a46a)

実際に検証しているのは3つのタイプの文脈を使って、次元数を変化させた時の単語分散表現の性能を評価しています。性能については、大きく分けて以下の2通りで評価しています。

* 内省的評価
* 外省的評価

内省的評価と言うのは、単語分散表現の性能を直接評価する方法のことを指しています。たとえば、人間が判断した単語類似度と分散表現による単語類似度の相関によって性能を評価します。要するに、人間の評価に近い評価をできるようになれば良い分散表現に違いないということです。評価用データセットとしては[WordSim353](http://www.cs.technion.ac.il/~gabr/resources/data/wordsim353/)や[SimLex999](https://www.cl.cam.ac.uk/~fh295/simlex.html)がよく使われています。

外省的評価と言うのは、実際のタスクに単語分散表現を使って評価する方法のことを指しています。たとえば、文書分類の入力に単語分散表現AとBを使って、文書分類の性能によって単語分散表現の優劣を比較するということが行われます。このメリットは、実際のタスクにどれだけ役に立つのかがわかるということが挙げられます。デメリットとしては、評価に時間がかかることが挙げられます。

論文では外省的評価の対象タスクとして、以下の4つを使っています。

* 構文解析(PARSE)
* 固有表現認識(NER)
* 共参照解決(COREF)
* 評価分析(SENTI)


## 最適な次元数

内省的評価の結果は以下の図で表されます。内省的評価では特定の文脈と高次元の分散表現を好む傾向があります。全体的には文脈としては通常使われるウィンドウベースのものと依存関係ベースのものが性能が良い傾向にあり、次元数は高いほど性能が良い傾向があります。

<img width="584" alt="intrinsic.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/ec0f8393-9e2d-5a56-ac4a-50d18708525b.png">

外省的評価の結果は以下の通りです。外省的評価では内省的評価と違って高次元の分散表現が良いとは一概には言えない結果となっています。固有表現認識では次元数が低い方が性能が良い傾向があり、評価分析では次元数が高いほうが性能が良い傾向があります。

<img width="584" alt="extrinsic.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/aa2e2605-04d6-e74c-8fdd-d5c3df9a96e7.png">

PARSEやCOREFは次元数に関してはなんとも言えない結果になっています。しかし、PARSEについては分散表現のタイプ的には面白い結果になっています。それは、PARSEではトピック的類似度(e.g. lion:zoo)より機能的類似度(e.g. lion:cat)を重視した分散表現が良い結果となっている点です。したがって、PARSEでウィンドウベースの分散表現を使う場合はウィンドウサイズを狭くしたほうが良いでしょう。


これらの結果はあくまでもskip-gramを使って分散表現を学習し、かつある分類器で分類した結果であることに注意する必要があります。しかし、単語分散表現の次元数を決める際の１つの指針にはなるのではないかと思います。


# おわりに

単語分散表現は自然言語処理では不可欠な技術です。単語分散表現の次元数をどのくらいの値に設定すればよいかは自明ではありません。本記事では単語分散表現の最適な次元数について述べた論文を紹介しました。本記事が皆様のお役に立てば幸いです。

私のTwitterアカウントでも機械学習や自然言語処理に関する情報をつぶやいています。
[@Hironsan](https://twitter.com/Hironsan13)

この分野にご興味のある方のフォローをお待ちしています。

# 参考資料

* [The Role of Context Types and Dimensionality in Learning Word Embeddings](https://arxiv.org/abs/1601.00893)
ラジオボタンを使うときのメモ

##**Radiobutton**を複数利用するとき。
####条件
- **Radiobutton**を二つ設置する。
- **Radiobutton**は**Panel**の中に入れる。

####プロパティ設定ポイント
- **ValidationGroup**を同じものにする(任意)
 - **Radiobutton**二つとも**Radiobuttonteem**にする。

`↑やらなくてもたぶん出来るかもしれないけれどわかりやすいため`
`(Group単位でのコントロールとかあるのだろうか？一括でCheckedをFalseにするとか……)`

- **AutPostBack**をTrueにする
 - しないとイベントハンドラー走らないため。 

####イベントハンドラー設定ポイント
 - 該当でない**Radiobutton**のプロパティ**Checked**を設定すること。
  -  **Radiobutton1**のイベントハンドラーのとき**Radiobutton2**の**Chedked**プロパティを**False**(非選択状態)にすること。

`せっかくグループに設定したのにそこも反応してほしいところだなぁ。`

---
後日修正あり
修正履歴
######(2018/07/12) 
・タグの修正　*ASP.NET* を追加 
・誤字修正
【競プロメモ】標準出力に桁数指定でdoubleを出す方法

C++のdouble出力は標準が６桁になっているらしく、精度が足りなくてWAになることがあったのでメモ

# 小数点以下の桁数を指定する方法
```c++
#include <iomanip>
```
```c++
// 小数点以下の桁数を指定できるように
cout << fixed;
// setprecisionで小数点以下8桁を出すように
cout << setprecision(8) << result << endl;
```
fixedにしないと、小数点より上含めて全部で8桁出力になってしまうので注意。