OmniAICreator/Qiita-1.07M huggingface dataset:
git で過去のコミットログを残してリポジトリを統合する方法

git で管理していると、一つのスクリプトだけリポジトリとかができてしまったりします。
そういうのを一旦を統合して、過去の履歴を残した状態にしたいことは結構あります。
というか、業務でありました。
調べて見たら情報はあるようでなかったので、まとめます。

## 想定するまとめ方

大きいリポジトリ `a` に小さいリポジトリ `b` を統合する。

## テスト環境の構築

```bash
mkdir a
cd a/
git init 
touch a.txt
git add -A
git commit -m "1"
mkdir -p script/test1/
touch script/test1/index.sh
git add -A
git commit -m "2"
mkdir -p script/test2/
touch script/test2/index.sh
git add -A
git commit -m "3"
cd ..
mkdir b
cd b/
git init 
touch b.txt
git add -A
git commit -m "101"
touch index.sh
git add -A
git commit -m "102"
echo "hogehoge" > index.sh
git add -A
git commit -m "103"
cd ..
```

以上を適当な場所で実行すると以下のようになるはずです。

```bash
$ tree
.
├── a
│   ├── a.txt
│   └── script
│       ├── test1
│       │   └── index.sh
│       └── test2
│           └── index.sh
└── b
    ├── b.txt
    └── index.sh

5 directories, 5 files
$ cd a/
$ git log --oneline --graph --decorate=full
* 57ede31 (HEAD -> refs/heads/master) 3
* 0581249 2
* b95c42d 1
$ cd ../b
$ git log --oneline --graph --decorate=full
* 0671e8d (HEAD -> refs/heads/master) 103
* 2f3dff9 102
* 492a0b7 101
```
ここから統合していきます。

## 実際の作業

```bash
cd a/
mkdir script/b
git remote add b ../b
git fetch b
mkdir script/b
touch script/b/.gitkeep
git add -A
git commit -m "hoge"
git merge -X subtree=script/b/ b/master --allow-unrelated-histories
git rm script/b/.gitkeep
git commit -m "hoge"
```

とりあえず `mastar` にマージしていますが、実際はブランチ切って、プルリクエスト投げるのが正しいと思います。

## どういう状態になるか

```bash
$ tree
.
├── a.txt
└── script
    ├── b
    │   ├── b.txt
    │   └── index.sh
    ├── test1
    │   └── index.sh
    └── test2
        └── index.sh

4 directories, 5 files
```
```bash
$ git log --oneline --graph --decorate=full
* a928c18 (HEAD -> refs/heads/master) hoge
*   ecf9fd8 Merge remote-tracking branch 'b/master'
|\  
| * 0671e8d (refs/remotes/b/master) 103
| * 2f3dff9 102
| * 492a0b7 101
* 17e5dfc hoge
* 57ede31 3
* 0581249 2
* b95c42d 1
```

確認すると分かる通り、2つが統合された形になります。

## 参考文献

https://chaika.hatenablog.com/entry/2015/06/04/173401
https://qiita.com/takanatsu/items/fc89de9bd11148da1438
Logrotate を MacOS X で使う方法


引用元
https://serverfault.com/questions/352942/equivalent-of-logrotate-on-osx

ローカルでテストをするために、logrotate を MacOS でも使えないか調べてみました。

Homebrew を使っている人はインストールできます。

## インストール

```
brew install logrotate
```

## config ファイル保存先

```
/usr/local/etc/logrotate.d/

```

例: config ファイル作成例

```
$ sudo vi /usr/local/etc/logrotate.d/test.conf
/var/log/test_*.log {
  daily
  copytruncate
  rotate 3
  size 10M
  compress
}
```

## テスト方法

```
sudo  logrotate -v -f /usr/local/etc/logrotate.d
```

## サービス起動方法

```
sudo brew services start logrotate
```

## サービス再起動

```
sudo brew services restart logrotate

```

# 自分用メモ

引用元
http://www.matsubarasystems.com/centos/logrotate



> ## 初回は空振り
> 
> logrotateでは前回ログローテーションを実行した時間が「/var/lib/logrotate.status」に記述されます。
> 登録直後はこのファイルにエントリがないためにローテーションが空振りします。日時実行の場合一度ローテーションを手動実行し、このファイルにエントリを追加させた後、前回実行日を前日に書き換えることで直近の夜間処理（実行時間は設定によります）で実行されます。
> ※ 前回実行日を書き換えるのは手動実行日から次のローテーションのタイミングが24時間後以内の場合実行済みと認識されないようにするためです。
【Vue】パラメータ付き$emitのハンドラに追加で引数を与える

## タイトルの通り
v-forのindexを追加で渡したかった。

以下で出来た。

``` {parent.vue}
<template>
  <div v-for="(item, index) in list" :key=index>
    <child :item='item' @emitting='emitted($event, index)'/>
  </div>
</template>

<script>
export default {
  ...
  methods: {
    emitted: function (eventArgs, index) {
      console.log(index, eventArgs)
    }
  },
  ...
}
</script>
```

``` {child.vue}
<template>
  <div @click='temp'>{{item}}</div>
</template>

<script>
export default {
  props:['item'],
  methods: {
    temp: function () {
      this.$emit('emitting', {item1: 'event' item2: 'args'})
    }
  }
}
</script>
```
2つ以上イベント引数があった場合の、2つ目以降の取得方法は不明。
１つのObjectにまとめることで回避。  


うまく見つけられなかったのだけどアンチパターンなのだろうか


## 追記
コメントにて指摘のあった、emitを用いない方法

``` { parent.vue }
<template>
  <div>
    <div v-for="(elm, idx) in list" :key="idx">
      <child :item="elm" :func="func(idx)"></child>
    </div>
  </div>
</template>

<script>
import Child from './Child'
export default {
  components: {
    Child
  },
  methods: {
    func: idx => (arg1, arg2) => {
      console.log(idx, arg1, arg2)
    }
  },
  data() {
    return {
      list: ['aa', 'ss', 'dd']
    }
  }
}
</script>
```

``` {child.vue}
<template>
  <v-btn @click="clicked">
    {{ item }}
  </v-btn>
</template>

<script>
export default {
  props: [ 'item', 'func' ],
  methods: {
    clicked: function() {
      this.func(this.state1, this.state2)
    }
  },
  data() {
    return {
      state1: 'ww',
      state2: 'qq'
    }
  }
}
</script>

```
GOOGLE CLOUD CERTIFIED Professional Cloud Architectへの道 ～その４．ドキュメントを読む～

#GCPのドキュメント
Qwiklabsが有料だった「[～その３．Qwiklabs で実践演習～を参照](https://qiita.com/sakuraya27/items/5fb4818fc1a94d8aa4ef)」ので、ドキュメントを用いて学習を進めることにした。


[GCPのドキュメント](https://cloud.google.com/docs/?hl=ja)

#ドキュメントの概要について
GCPの全体像が記載されている。
[GCP概要](https://cloud.google.com/docs/overview/?hl=ja)

リージョンやゾーンなどの説明も記載されており、AWSとの違いや考え方が類似している点などを学んだ。
[地域とリージョン](https://cloud.google.com/docs/geography-and-regions?hl=ja)


#ソリューションとチュートリアルを試してみる
ドキュメントにあるチュートリアルのボタンを押すと、下記サイトが立ち上がる。
[ステップバイステップチュートリアル](https://cloud.google.com/docs/tutorials?hl=ja#getting%20started)

検索して表示されるまでに少し時間がかかる感じ。
表示された項目をクリックすると、クイックスタートのリファレンス画面が表示される。

クイックスタートの内容は、Googleアカウントがあれば利用できる形。
（未ログイン時は下記赤枠部分にGoogleアカウントログインを促すアナウンスが出た）
![GCP7.png](https://qiita-image-store.s3.amazonaws.com/0/297179/458bfe97-0fea-145b-4de5-6ec6e675df33.png)

Googleアカウントでログインして、リソースの管理ページに移動すると無料トライアルのアナウンスが。
無料トライアルに申し込むと、300ドル分のお試しが可能に。
![GCP8.png](https://qiita-image-store.s3.amazonaws.com/0/297179/8f104f26-286c-3b70-c940-22963932d66c.png)


チュートリアルには、多くのGCPサービスのクイックスタートガイドがあるので、
一通り実施したうえで、結果を報告します。
[Illustrator_script] windowメソッドでpalleteを設定した際に、なぜ#targetengineを設定する必要があるのか

ExtendScriptを使ってIllustratorにダイアログを表示しようと思ったのですが、#targetengineの設定でおもった以上にハマったので備忘録として。

## 環境
OS:macOS 10.14
editor:Sublime Text3
application:illustrator CC2018


## やりたいこと
ExtendScriptでIllustratorにキャンセルボタンがあるだけのシンプルなダイアログを表示させます。


## やったこと
```javascript:test.jsx
#target "illustrator"

var winObj = new Window('palette', 'sample', undefined);
//ボタンを作成する
var btnCancel = winObj.add("button",[100,70,170,100],"cancel",{name:'cancel'});

winObj.center();
winObj.show();

btnCancel.onClick = function(){winObj.close();}
```
windowメソッドの第１パラメータは以下の３つから選べるみたいなのでpalleteを選択。

|windowメソッドの第１パラメータ|
|---|
|window|
|dialog|
|pallete|

が、このコードではスクリプトを実行してもダイアログは表示されず。（エラーも出ない…）
調べてみたら \#targetengine を指定しないといけないらしく以下コードに修正。

```javascript:test_2.jsx
#target 'illustrator'
#targetengine 'test'

var winObj = new Window('palette', 'sample', undefined);
//ボタンを作成する
var myBtn = winObj.add("button", [50,100,270,120],"押してください");
var btnCancel = winObj.add("button",[100,70,170,100],"cancel",{name:'cancel'});

winObj.center();
winObj.show();

btnCancel.onClick = function(){winObj.close();}
```
このコードで無事動作しました。

## なぜ#targetengineを指定しないといけなかったのか？
以下サイトで詳しく解説されていました。
[targetengineについて](http://nakatoji.lolipop.jp/index.php/extendscript/estk/etsk-list/11-2014-05-09-04-06-50)

>直列的に処理をこなして終了するスクリプトは同時に２つ以上実行されることはないので、結果的に排他的な環境で実行されます。adobeのJavaScript環境（ExtendScript）であれば、スクリプトは「main」という空間で実行され、終了後は暗示的にクリアされます。

>それに対して常駐するスクリプトは、その実行環境を維持し続けるための「居場所」が必要になります。その場合、同じ居場所で不特定多数のスクリプトが実行されると、変数名の衝突が起こるなどの不都合が生じます。

>>常駐型スクリプトを走らせる場合、それぞれのスクリプトは変数名の衝突を避けるために固有の名前空間が必要です。

とのことで、今回のスクリプトではwindowにpalletを指定した「常駐型スクリプト」なのでスクリプトを実行する空間を#targetengineで設定してあげないといけなかったみたいです。

## わからない点
常駐型スクリプトの場合、変数名の衝突などを防ぐために固有の名前空間をつくってあげないといけないことは理解しました。
しかしなぜ **test.jsx** のスクリプトで動作をしなかったのかまでは分かりませんでした。
Windows Subsystem for LinuxのUbuntuターミナルログの自動取得

#はじめに

Windows環境でTeraTermみたいな操作ログをPowerShellでも取得したいと思い立って[記事](https://qiita.com/rjegg/items/3f10228c780769dd553c)を書いたものの、WindowsならWSL（Windows Subusystem for Linux）だよねということで、WSLのUbuntuでのターミナルのログ出力設定（自動）について記載します。

#TL;DR
内容はscriptコマンド使うだけ・・・

#環境
Windows：Windows10 Ent v1803
Ubuntu：Ubuntu 16.04.3 LTS

#自動でログを取得する方法
Ubuntuを起動し、~/.profileファイルに下記を追記する

```~/.profile
script -f <ディレクトリ>/$(date +%Y%m%d%H%M%S).log
```
出力先ディレクトリはやはりWindowsなのでマイドキュメントに書き出したく、その場合は次のように記載。参考[[1]](https://qiita.com/keigodasu/items/3eebbc079274ad8dd2c2)

```~/.profile
script -f /mnt/c/Users/<ユーザー名>/Documents/$(date +%Y%m%d%H%M%S).log
```

#試してみると

なんだか読みづらい

```
]0;user@DESKTOP-3GQ2JQM: ~[01;32muser@DESKTOP-3GQ2JQM[00m:[01;34m~[00m$ ls -la
total 24
drwxr-xr-x 1 user user   512 Oct  2 18:04 [0m[01;34m.[0m
drwxr-xr-x 1 root root   512 Jan 31  2018 [01;34m..[0m
-rw------- 1 user user 10960 Oct  2 17:59 .bash_history
-rw-r--r-- 1 user user   220 Jan 31  2018 .bash_logout
-rw-r--r-- 1 user user  3771 Jan 31  2018 .bashrc
drwx------ 1 user user   512 Jun  4 17:43 [01;34m.cache[0m
```

実際のターミナル上の表示はこちら。

```
user@DESKTOP-3GQ2JQM:~$ ls -la
total 24
drwxr-xr-x 1 user user   512 Oct  2 18:04 .
drwxr-xr-x 1 root root   512 Jan 31  2018 ..
-rw------- 1 user user 10960 Oct  2 17:59 .bash_history
-rw-r--r-- 1 user user   220 Jan 31  2018 .bash_logout
-rw-r--r-- 1 user user  3771 Jan 31  2018 .bashrc
drwx------ 1 user user   512 Jun  4 17:43 .cache
-rw-r--r-- 1 user user   727 Oct  2 17:59 .profile
drwx------ 1 user user   512 Oct  2 18:04 .ssh
-rw-r--r-- 1 user user     0 Apr 17 16:23 .sudo_as_admin_successful
-rw-rw-rw- 1 user user     0 Oct  2 18:04 test.dat
-rw------- 1 user user  3879 Oct  2 18:04 .viminfo
```

どうもscriptコマンドだとしょうがないらしい。
対応として、簡単なのが-rオプションをつけることが良さそう[[2]](https://qiita.com/networkelements/items/aa4aec5417306b4c7e71)。
>lessの-rや-Rオプションで開く

-rオプションをつけて表示した結果、

```
$ less -r 20181002175946.log

user@DESKTOP-3GQ2JQM:~$ ls -la
total 24
drwxr-xr-x 1 user user   512 Oct  2 18:04 .
drwxr-xr-x 1 root root   512 Jan 31  2018 ..
-rw------- 1 user user 10960 Oct  2 17:59 .bash_history
-rw-r--r-- 1 user user   220 Jan 31  2018 .bash_logout
-rw-r--r-- 1 user user  3771 Jan 31  2018 .bashrc
drwx------ 1 user user   512 Jun  4 17:43 .cache
-rw-r--r-- 1 user user   727 Oct  2 17:59 .profile
drwx------ 1 user user   512 Oct  2 18:04 .ssh
-rw-r--r-- 1 user user     0 Apr 17 16:23 .sudo_as_admin_successful
-rw-rw-rw- 1 user user     0 Oct  2 18:04 test.dat
-rw------- 1 user user  3879 Oct  2 18:04 .viminfo
user@DESKTOP-3GQ2JQM:~$
(END)
```

これで見やすくなりました。
でもC:\配下に出力させる意味がなくなってしまった。。 :cold_sweat:

目的はWindowsのテキストエディタで気軽にログを確認できるようにしたかったのだが。。

良い方法が見つかったら追記します。

#参考
[[1]まずはここから！Linuxサーバでカジュアルに作業ログを取得する方法](https://qiita.com/keigodasu/items/3eebbc079274ad8dd2c2)
[[2]scriptなどでログを取るときに変な文字(制御文字)のない状態で読めるようにする](https://qiita.com/networkelements/items/aa4aec5417306b4c7e71)
swagger(OpenAPI)でかんたんmockデバッグ 

# 概要
Swagger3.0(OpenAPI3.0)を使って簡単にmockを立ててデバッグしていきます。
NodeJSとかも使いません※ので、手軽にできるかと思います。

※ コードジェネレータを使う場合でも、OnlineEditor(https://editor.swagger.io/) からやれば、NodeJSとかは必要ありません。

### 既にSwagger2.Xで運用してる場合
https://openapi-converter.herokuapp.com/
こちらでコンバートしてください。
現在(2018/9)Swagger3.0(OpenAPI3.0)がrc版となっているので、ぼちぼち対応し始めても良いのではないでしょうか？


# 用意するもの

### VSCode
<img width="224" alt="スクリーンショット 2018-09-05 14.32.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/235020/f92a6efd-e319-0f40-e5ae-018c1ac35517.png">
https://code.visualstudio.com/

公式のSwaggerEditorも有るのですが、重いし、操作性が悪いのでVSCodeをオススメします。
プラグインとして以下もインストールしてください。

- openapi-lint
- openapi-viewer
- YAML Support by Red Hat

### APIsprout

<img width="356" alt="スクリーンショット 2018-09-05 14.03.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/235020/d1bd96dd-f7e0-4e1d-1aef-e5eca36815af.png">
https://github.com/danielgtaylor/apisprout

簡単にmockを立てるためのツールです。
goの環境入ってればgo getでinstallできますが、以下の方法でもできるようです。(未検証)

https://qiita.com/TAC_yacht/items/de1501966f1c291d3c40

# YAMLを用意する
すでにある場合や、自動生成されている場合はスキップしてください

書き方はここに載っています。
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md

最初から全部読まず、こちらからコピペしていけば良いと思います。
https://github.com/OAI/OpenAPI-Specification/tree/master/examples/v3.0


# mockのresponseとなる値を入れる

mockデバッグをする際、各パラメータのexampleがそのまま値となって入ってくるので
こちらを参考に値をいれてください。
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.1.md#exampleObject

こんなかんじでjsonをペタッと貼ったものをexampleにもできます。
<img width="698" alt="スクリーンショット 2018-09-05 14.07.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/235020/0cc43add-28bd-534f-5746-82d2ad7c155b.png">
できれば公式の参考コードみたいに、パラメータごとに書いたほうが良いのですが
使い捨て前提みたいな使い方をする場合、SwaggerUIのresponseをコピって整形もアリです。


# SwaggerUIで確認

VSCodeでYAMLを開いた状態で

1. ⇧⌘P
2. OpenAPI:Preview 

で表示できます。
YAMLに見慣れてくると、SwaggerUIでは
responseのjsonを確認したり、curlのコマンドを生成するときに開くくらいになるかと思います。

# APIsproutでmock立ち上げ
以下のコマンドを実行するだけです

```
$ apisprout [YAMLファイルのパス]
```

**完成!!**
デフォルトのポートは8000です。
共有フォルダにあるsvnリポジトリのhooksスクリプトは誰が実行するのか

答え：　ローカルのsvnクライアントが実行する。

---



httpとfileプロトコルでアクセスされるリポジトリがあります。
ある日、fileプロトコルでアクセスするとhooksスクリプトが動いていないことに気が付きました。

で、ふと思ったのがhooksスクリプトはだれが動かしているのかということです。
http経由ならApacheが動かしているようです。Sambaの共有フォルダの場合はSambaが動かす？

共有フォルダのリポジトリのhooksの中にあるpost-commitをバッチ化して、
適当なファイルを試しにコミットしてみたところ、確かにpost-commit.batが実行されました。

svnクライアントってサーバーと通信するものって思い込んでたのでへーっておもいました。
【OSX】日本語入力中の英数2回押しが効かない問題の解消

# US配列をお使いのあなたへ
英数キーボードを使っていて,日本語ユーザーのみなさんこんにちは.
僕もその一人です.
karabinerなり,英かななりを使ってcommandキーを`英数キー`と`かなキー`に割り当ててますよね?これ便利ですよねー.必須ですよねー.英語モードで文字を打ち込もうと思ってかなモードで打ち込んでた!ってときに`英数キー`を2回押しで英数にしてくれるモードありますよね.今回はこの機能についてのお話です.

## 入力中の2回押しで英数になってくれない!
いつこうなったのかはわからないのですが,ある日こうなっちゃったんですよね.はじめは「英かな」のせいかな?とかで流してたのですが,mojaveにアプデしたタイミングでちゃんとこの問題に立ち向かうことを決めました.

## 英かなのせいじゃない!
あ,karabiner(karabiner-elements)使えるようになってるんだ.じゃあそっち使えば直るかな?とおもってkarabinerにしてみました.
**直らない...**
原因は英かなではありませんでした.すいません...

## 原因
もったいぶらずに原因です.
<img width="780" alt="スクリーンショット 2018-10-02 17.49.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/139991/82fc0425-b615-bddc-0ce2-fa269d9ca490.png">
この状況が原因でした.
google日本語入力とU.S.が入力ソースにあることです.

## 解決策
じゃあgoogle日本語入力の`かな`と`半角英数`にすればいいじゃんってことですが,一筋縄ではいかなかった.

### 1. google日本語入力の半角英数を追加する.
<img width="780" alt="スクリーンショット 2018-10-02 17.49.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/139991/8e8ac4c6-b71f-4696-0158-55cd2946e976.png">

### 2. U.S.を消そうとする.
<img width="780" alt="スクリーンショット 2018-10-02 17.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/139991/7b261eda-2120-a6d0-89a2-86f2e68b3d6a.png">
**消えない!**
マイナスボタンがグレーアウトしちゃって消えない!むーん...

### 3.【解決策】日本語の入力ソースを追加する.
<img width="780" alt="スクリーンショット 2018-10-02 17.52.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/139991/3fe24782-d83e-e272-9c3b-fc581ed68c1c.png">
するとU.S.のマイナスボタンがアクティブになる!これでU.S.を消す.

### 4.なぜか日本語はふつうに消せる.
<img width="780" alt="スクリーンショット 2018-10-02 17.52.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/139991/2b00e3eb-360d-c742-26af-52ce81aeff18.png">

### 5.完成!
<img width="780" alt="スクリーンショット 2018-10-02 17.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/139991/348dcd1c-7ed8-34d0-7f83-5f4e4d26620c.png">

これで無事`二度押し`が使えるようになりました.
めでたし,めでたし.
GraphCNN


[割りとわかりやすい](http://tkipf.github.io/graph-convolutional-networks/)

# [SPECTRAL GRAPH THEORY (revised and improved)](http://www.math.ucsd.edu/~fan/research/revised.html)
スペクトル解析の範疇のグラフ理論

# [Graph-based Neural Networks](https://github.com/sungyongs/graph-based-nn)
基礎的なグラフ理論やスペクトルグラフ理論、グラフ信号処理等
その他GCNの実装等まとめ
# [Laplacians and the Cheeger Inequality for Directed Graphs](https://link.springer.com/article/10.1007/s00026-005-0237-z)

有向グラフのグラフラプラシアンとCheeger Inequalityについて

# [Modeling Relational Data with Graph Convolutional Networks](https://arxiv.org/pdf/1703.06103.pdf)
有向グラフのネットワークをNNに落とし込むというもの。
ノード$i$に隣接するノード$j$に対し下記のような変換をする。

![image.png (13.2 kB)](https://img.esa.io/uploads/production/attachments/7838/2018/05/03/35185/73be1674-bfdc-4bd0-ad7e-435276a411c3.png)

$\sigma$は何らかのアクチベーション、$h$は隠れ層のstate、$g_m$は何らかの変換である。

gm(·, ·) is typically chosen to be a (message-specific) neural network-like function or simply a linear transformation gm(hi , hj ) = W hj with a weight matrix W such as in Kipf and Welling (2017).

と書かれているので、Schlichtkrulは[Kipf のグラフコンボリューション](https://openreview.net/pdf?id=SJU4ayYgl)に則り$g$を線形変換で表している。よって以下の式で表される。

![image.png (18.5 kB)](https://img.esa.io/uploads/production/attachments/7838/2018/05/02/35185/3eb7c264-ea2f-4a1f-83e1-cb6c8efc0d67.png)

そしてそれは以下の図に示される遷移を表している。

![image.png (61.6 kB)](https://img.esa.io/uploads/production/attachments/7838/2018/05/02/35185/32e04bcf-8f7f-4726-9cd4-70d9c4055b52.png)

赤で示されたノード$i$に隣接するノード$j$に対し、向きを考慮した重みをかけて総和をとる(self-loopも含む)。$r$は赤方向、青方向等を定義する。微妙にわかりづらいがサメーションは第一項にしかかかっていない([慣例でカッコなしでも総和の範囲が及ぶ書き方もある](https://math.stackexchange.com/questions/366302/should-parentheses-be-used-in-sums-of-the-form-sum-i-1k-a-ib-ic-i?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)ので、カッコを明示したほうが良いと思うが)。rの軸に0を、$j$の軸に$i$を追加すれば、右辺第二項は第一項に吸収されるため、単純な行列積になる。そのため(だと思う)、[kipfのgithubリポジトリ](https://github.com/tkipf/relational-gcn/blob/master/rgcn/layers/graph.py)では上記演算は単純な全結合で行われている(が、$r$が2つ以上場合$W$はランク3のテンソルになる)。

## 所感
カテゴリカルデータをダミー変数にするようなアプローチに感じた。$r$はカテゴリデータなので1,2,3のようにするとマルチコがおこるような。

# [RDF2Vec: RDF Graph Embeddings for Data Mining](https://ub-madoc.bib.uni-mannheim.de/41307/1/Ristoski_RDF2Vec.pdf)

データセットによってはR-GCNより良い性能

# [Dynamic Graph CNN for Learning on Point Clouds](https://arxiv.org/pdf/1801.07829.pdf)
![image.png (146.0 kB)](https://img.esa.io/uploads/production/attachments/7838/2018/05/02/35185/ecab8b6e-d694-4ba8-b3d3-a409aa108bee.png)

ポイントクラウドの3Dデータのセグメンテーションに使用。edgeConvというコンボリューションを使用。
【備忘録】dos2unix 改行コード変換

ファイルの改行コード( LF -> CRLF )を変更するためのコマンド、すぐ忘れるので自分用にメモです。

# Homebrewでdos2unixをインストール
Homebrewが入っていれば dos2unixを下記のコマンドでインストール

```
$ brew install dos2unix
```
[dos2unix](https://sourceforge.net/projects/dos2unix/)


## LF（Unix） -> CRLF（Windows）

### 単一ファイルの場合

```
unix2dos hoge.txt
```

### ディレクトリ内のファイルを一括変換する場合

```
$ cd path/to/folder
$ find . -type f -print0 | xargs -0 unix2dos
```

## CRLF（Windows） -> LF（Unix）
### 単一ファイルの場合

```
dos2unix hoge.txt
```

### ディレクトリ内のファイルを一括変換する場合

```
$ cd path/to/folder
$ find . -type f -print0 | xargs -0 dos2unix
```
V6プラス固定IPとRTX1210でハマったVPNの件

#V6プラス固定IPでVPN
https://www.jpne.co.jp/service/v6plus-static/ こちらのサービスを利用してRTX1210のIPIPトンネルでVPNをしようとしてもネゴシエーションの途中で切断してしまうのでYAMAHAのサポートに連絡をして色々教えてもらいましたが、最終的には**精査したところ仕様上できないことが判明しました**と返答がありました。
幸い手元にNVR500があったのでNVR500でIPIPトンネル処理をしてRTX1210でVPNサーバーとして動かせるか聞いたところ技術的には可能だと思いますが、検証はしておりませんとのことで**自己責任**でやってみました。

尚、HGW(PR-500KI)とひかり電話も共存させております。
あとHGWのWi-Fiも契約して同じIPv4サブネットに収容しております。
機能的には何も欠落してないけど繋がってるものが無駄に増えた気がします。

※filter等は記載しておりませんので必要な設定を追記ください。

##突然ですがWAN(LAN2,LAN3)は使いません
RTX1210もNVR500もLAN1とHGWのLANポートに接続してIPv6の処理は全てHGW任せにします。
IPv4 DHCPサーバーはお好きなものから配布していただければと思います、私はRTX1210のLANマップを使いたかったのでHGWとNVR500のIPv4は固定でDHCPサーバーは無効にしておきました。

ここでは下記を例として
HGWを192.168.11.252/24
RTX1210を192.168.11.1/24 IPv4 DHCPサーバー
NVR500を192.168.11.254/24
として記載します。

###RTX1210のconfig
<pre>
ip route default gateway 192.168.11.254 filter (必須192.168.11.1のL2TP/IPsecはここを使うこと) gateway 192.168.11.252
ipv6 route default gateway dhcp lan1
ngn type lan1 ntt
ipv6 prefix 3 ra-prefix@lan1:3::/64
pp select anonymous
 pp bind tunnel1
 pp auth request chap-pap
 pp auth username (name) (pass)
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ccp type none
 (例:ip pp remote address pool 192.168.11.193-192.168.11.220)
 ip pp mtu 1258
 ppp ipv6cp use on
 ipv6 pp address ra-prefix@lan1:3::1/64
 ipv6 pp rtadv send 3 o_flag=on
 ipv6 pp dhcp service server
 ipv6 pp tcp mss limit auto
 pp enable anonymous
tunnel select 1
 tunnel encapsulation l2tp
 ipsec tunnel 1
  ipsec sa policy 1 1 esp aes-cbc sha-hmac
  ipsec ike keepalive use 1 off
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 text (認証鍵)
  ipsec ike remote address 1 any
 l2tp tunnel disconnect time off
 l2tp syslog on
 ip tunnel tcp mss limit auto
 tunnel enable 1
ipsec auto refresh on
ipsec transport 1 1 udp 1701
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 (例:192.168.11.2-192.168.11.192/24) gateway 192.168.11.252
dhcp scope 2 (例:192.168.11.221-192.168.11.254/24) gateway 192.168.11.254
dns service off
dns server (HGWに書かれているIPv6 DNSサーバー) 192.168.11.252
l2tp service on
</pre>

###NVR500のconfig
<pre>
ip route default gateway tunnel 1
ipv6 route default gateway dhcp lan1
ip lan1 address 192.168.11.254/24
ipv6 lan1 address ra-prefix@lan1::(通知のされたインターフェースID)/64
ipv6 lan1 dhcp service client
ngn type lan1 ntt
tunnel select 1 #任意
 tunnel encapsulation ipip
 tunnel endpoint address (通知されたBRアドレス)
 ip tunnel nat descriptor 1 #任意
 ip tunnel tcp mss limit auto
 tunnel enable 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 (通知された固定IPv4アドレス)
nat descriptor masquerade incoming 1 (reject や forward 192.168.11.1 等任意)
nat descriptor masquerade static 1 1 192.168.11.1 udp 500
nat descriptor masquerade static 1 2 192.168.11.1 esp
nat descriptor masquerade static 1 3 192.168.11.1 udp 4500
nat descriptor masquerade static 1 4 192.168.11.1 udp 1701
</pre>
※LAN2ではなくLAN1でIPIPトンネルを掘っている

この方法を使えば一つのIPv4サブネットでLANが構築出来て、ひかり電話や内線も普通に使えます。
さらに通常のV6プラスをHGWが処理しているのでゲートウェイを変えるだけで負荷分散も可能になります。

我が家では無事、スマートフォン等からL2TP/IPsecのVPNが使えるようになりました。
あとは、RTX1210のフィルター型ルーティングでゲートウェイを変えたりしても正常に動作しますので色々出来ました。

※L2TP/IPsecでIPv6を配布する方法を試行錯誤してます。
Cannot read property 'toLowerCase' of undefinedのとき何を確認すべきか？

javascriptやjQuery、Vue.js、Reactなどの関連のライブラリをコーディングしていると頻繁に遭遇するエラーメッセージ。

**Cannot read property 'toLowerCase' of undefined**
 
これって何ぞや？日本語で直訳すると

**"未定義のtoLowerCase"のプロパティが読み取れません**

という意味になります。では`toLowerCase`とは何でしょうか？答えは`toLowerCase()`メソッドを呼び出そうとして起こるエラーで、`toLowerCase`メソッドとは、文字列の値を小文字に変換して新しい文字列を返す働きを持ちます。

…とはいえ、ソースを確認しても、どこにもそのようなコードで思い当たる場所が存在しない、ということがよくあります。どうやらそのエラーは、イベントを実行した際に、**DOM要素に対する子要素が定義されていない（読み取れない）**ときに起こります。

#具体的に？
たとえば、このようなときに起こります。まずはサンプル1のjQueryにあるような、プルダウンメニューから選択した値を取得するだけの、簡単なプログラムを記述してみます。

```javascript:サンプル1
$('select').on("change",function(){
    val = $(this).val();
    console.log(val);
})
```

このイベント部分を、サンプル2のように関数化させます。

```javascript:サンプル2
$('select').on("change",function(){
    myFunc();
})

myFunc = function(){
   val = $(this).val(); //thisが何なのか関数内で示されていない！
   console.log(val);
}
```

このときプルダウンメニューのchangeイベントが実行されたタイミングで、`this`が何を指しているのかわからないので、上記のエラーが発生します。特に、**プログラムの一部を関数化、外部ファイル化しようとしたときに、そのままコピーアンドペースト**なんてことをしてしまうと、このエラーに遭遇する率が高いわけです。

この場合は、DOMオブジェクトも関数の引数に入れないといけません。

```javascript:サンプル3
$('select').on(change,function(){
    sel = $(this);
    myFunc(sel);
})

myFunc = function(sel){
   val = sel.val();
   console.log(val);
}
```

これは一部の例ですが、このエラーが出たら、まずは、**自分で定義した関数を見直してみること**をオススメします。なお、ブラウザの開発ツールなどでエラー元を辿っても、複雑なライブラリのソース上（toLowerCaseメソッドの定義関数部分）に飛ばされてしまい、余計に混乱するだけです。

※類似のエラーもだいたい、**代名詞部分の定義をプログラムが読み取れない、つまり具体的な値が示されていない**ときに起こります。借り物のプログラムをコピペしたときのセレクタ名が異なっていないか（同様にオブジェクトが読み取れない場合にはエラーが発生します）、関数の外部ファイルなどでthisの定義が曖昧になっていないか、などに注意を払いましょう。
macOS MojaveでVagrantが使えなくなった時の対処法

Mojaveにアップグレードしてから、`vagrant up`ができなくなったので、その時の対処方法。

##vagrant upした時のエラー

いつも通り`vagrant up`したらこんなエラーが出た。

```
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set network interfaces...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage: error: Context: "RTEXITCODE handleCreate(HandlerArg *)" at line 94 of file VBoxManageHostonly.cpp
```

##対処した方法。Virtual MachineのReinstall

`brew cask uninstall virtualbox`をしてもエラーが出たので、そのエラーに吐き出された通りに`xcode-select --install`を行う。

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

その後、`brew cask uninstall virtualbox`をした後、`brew cask reinstall virtualbox`を実行。最初からreinstallで大丈夫だったかな？

```
$  brew cask uninstall virtualbox
==> Tapping caskroom/cask
Cloning into '/usr/local/Homebrew/Library/Taps/caskroom/homebrew-cask'...
remote: Enumerating objects: 4135, done.
remote: Counting objects: 100% (4135/4135), done.
remote: Compressing objects: 100% (4117/4117), done.
remote: Total 4135 (delta 25), reused 636 (delta 15), pack-reused 0
Receiving objects: 100% (4135/4135), 1.30 MiB | 1.46 MiB/s, done.
Resolving deltas: 100% (25/25), done.
Tapped 0 formulae (4,145 files, 4.2MB)
Error: Cask 'virtualbox' is not installed.



$  brew cask reinstall virtualbox
==> Creating Caskroom at /usr/local/Caskroom
==> We'll set permissions properly so we won't need sudo in the future
Password:
==> Caveats
```

##問題解決

`vagrant up`を行なって動作を確認。問題なしでした。
GSON でアノテートした Enum 値の SerializedName をコードから逆引きする

```kotlin
enum class SortOrder {
  @SerializedName("asc") Ascending,
  @SerializedName("desc") Descending,
}
```

GSON の SerializedName でアノテーションした列挙値があったとして、この値をコードから参照したくなった。

JSON としてシリアライズ・デシリアライズする値の範囲が限られていたため、コード上 `enum` で表現した。そして GSON での `toJson` や `fromJson` 意外の場所で、この名前を参照したくなった。
enum 自身に値を持たせてもよいけれど、 SerializedName と二重に同じ名前を管理したくない。

ということで以下のようなコードを書いた。（`Enum` 値限定）

```kotlin
inline fun <riefied T> serializedNameOf(value: T) =
    T::class.java.getField(value.toString()).getAnnotation(SerializedName::class.java).value
```

```kotlin
serializeNameOf(SortOrder.Ascending) // => "asc"
```
渡されたパスにディレクトリが存在しない時に、空のディレクトリを新規作成するアロー関数/Lambda関数

最近よく使うのでメモ。

### アロー関数（Node.js）

```js
const fs = require('fs')

const mkdirExceptExist = (dirPath) => {
    if (!fs.existsSync(dirPath)) { fs.mkdirSync(dirPath); }
};
```

参考: https://www.gesource.jp/weblog/?p=7672

###Lambda関数（Python）

```Python
import os

mkdirExceptExist = lambda path: "" if os.path.exists(path) else os.mkdir(path)
```

【Updated: 2019-07-21（Lambda関数を追加）】
FANZA動画の月間人気女優ランキングをスクレイピングした

Pythonで、FANZA動画(旧:DMM.R18)の月間人気女優ランキングをスクレイピングして上位20名だけ抜き取るやつを作りました。それだけです。


```python
import requests
from bs4 import BeautifulSoup

Fanza = requests.get('http://www.dmm.co.jp/digital/videoa/-/ranking/=/type=actress/')
soup = BeautifulSoup(Fanza.text,'html.parser')
joyu_list = soup.find_all('div', class_='data')


for rank, joyu in enumerate(joyu_list, 1):
    print(str(rank) + "位:" + joyu.a.get_text())
```




以上！！
windowsのVScodeでsolidityのpragmaでlinebreak-styleのエラー

### はじめに
最近スマートコントラクトに興味を持ち始めて、solidityというスマートコントラクト開発のためのプログラミング言語で開発を始めてみたのは良かったものの、１行目からさっそくエラーが出て泣きそうになり、ググっても日本語の情報がなかったので、エラーの解決策を共有しておきます。
※エラーというかワーニングかな。。？

### 現象
![vscode-solidity.png](https://qiita-image-store.s3.amazonaws.com/0/230651/9939694b-fa87-c243-36b4-0fa48e80ed7f.png)

### 解決策
Settingで以下を設定する
※デフォルトだとLinuxになっているらしいです
"solidity.soliumRules": {
    "linebreak-style": "windows"
}

### 参考
https://github.com/juanfranblanco/vscode-solidity/issues/86

よーしこれでスマートな開発してくぞ～
pillow で画像に文字を挿入

入力データ
![in01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/fed58c5a-8783-1522-2b61-35b89e83d653.png)

出力データ
![out01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/92e19bde-7383-d5b2-3b57-9d74553f0c02.png)

```py:draw_img_text.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	draw_img_text.py
#
#						Oct/02/2018
#
# ------------------------------------------------------------------
import sys
import numpy

import PIL.Image
import PIL.ImageDraw
import PIL.ImageFont

# ------------------------------------------------------------------
def draw_text_proc(img,text,pos):
	draw = PIL.ImageDraw.Draw(img)
	font_ttf = "/usr/share/fonts/OTF/TakaoPMincho.ttf"
	draw.font = PIL.ImageFont.truetype(font_ttf, 10)

	img_size = numpy.array(img.size)
	txt_size = numpy.array(draw.font.getsize(text))

	color = (0,0,255)
	draw.text(pos, text, color)

# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#
img_base = PIL.Image.open(file_in)
#
text = "Oct/2/2018"
pos = (100,20)
draw_text_proc(img_base, text,pos)
text = "こんにちは"
pos = (100,35)
draw_text_proc(img_base, text,pos)
img_base.show()
img_base.save(file_out)
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

実行方法

```bash
./draw_img_text.py in01.png out01.png
```

次のバージョンで確認しました。

```text
$ python
Python 3.9.1 (default, Feb  6 2021, 06:49:13)
>>> import PIL
>>> PIL.__version__
'8.1.0'
```
[MAC] Node.js + MongoDB

MacでNode.js+MongoDBを試してみた。
とても簡単に使えるようになりますね。

# Install MongoDB
```shell
$ brew -v
Homebrew 1.7.6
$ brew update
$ brew install mongodb
$ mongo --version
MongoDB shell version v4.0.2
```

# Case `/data/db not found.`
ガバいPermissionとかに抵抗なければシンボリックリンクを貼る。

```shell
$ sudo mkdir /data
$ sudo chmod 777 /data
$ ln -s /usr/local/var/mongodb /data/db
$ mongod --repair
```

# Setup MongoDB for Node project.
```shell
$ node -v
v10.10.0
$ yarn -v
1.9.4
$ npm install -S mongodb
```

# Node module
```js
import { MongoClient } from 'mongodb';

const url = 'mongodb://localhost:27017/';

function insert(data) {
  console.log('[MongoModule] insert data:', data);
  MongoClient.connect(url, function (err, db) {
    if (err) throw err;
    const dbo = db.db('testdb');
    dbo.collection('datas').insertOne(data, function (err, res) {
      if (err) throw err;
      console.log('[MongoModule] inserted. ', res);
      db.close();
    });
  });
}

module.exports = {
  insert: insert,
};
```

# Check with Mongo.
```shell
$ mongo
> use testdb
> db.datas.find()
```
GOOGLE CLOUD CERTIFIED Professional Cloud Architectへの道 ～その３．Qwiklabs で実践演習～

#Qwiklabs って何？
Google Cloudのオンデマンドラボを利用したハンズオンです。
PCAのステップガイドでは、以下の順で進めるよう手引きが書かれている。

「GCPの基礎」　→　「チャレンジ：GCPアーキテクチャ クエスト」

#GCPの基礎

GCPの基本的なツールやサービスに関する実践演習を行う。
[GCPの基礎](https://google.qwiklabs.com/quests/23?locale=ja)

以下のアウトラインに沿って進める形。
![GCP5.png](https://qiita-image-store.s3.amazonaws.com/0/297179/245af5f5-bac3-1971-5165-8e2ad1926e60.png)


#チャレンジ：GCPアーキテクチャ クエスト
[チャレンジ：GCPアーキテクチャ クエスト](https://google.qwiklabs.com/quests/47?locale=ja)

GCPの基礎と比べて、実践的なアーキテクチャチャレンジがある。
GCPサービスを用いて、ソリューションを構築しながら学ぶ形。

#さて演習を・・・
さて実践演習をしてみますか。

![GCP6.png](https://qiita-image-store.s3.amazonaws.com/0/297179/d690c297-4313-6f86-849e-ea418759a4d5.png)


**ん？ クレジットって何ぞ？**
**Qwiklabsは有料サービスだったのか・・**


・・・

**よし、Qwiklabsを使わずにPCA取得を目指そう。（あくまでも無料でやりきる）**
Macの時刻をターミナルから設定

# Mac OS Xの時刻をターミナルから設定する

Macの時刻が自動で同期されないので手動でコマンド一発で設定するワンライナーをメモ

NTPでの時刻同期は事前に環境設定でOffにするか、`sudo systemsetup -setusingnetworktime Off`をする

```
# 日付の再設定
date -r "$(wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O - | sed -n 4p | cut -d. -f1)" "+%m:%d:%y" | xargs -IDATE sudo systemsetup -setdate DATE

# 時刻の再設定
date -r "$(wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O - | sed -n 4p | cut -d. -f1)" "+%H:%M:%S" | xargs -ITIME sudo systemsetup -settime TIME
```

wgetがない場合にはcurlを使えばOK!
これで一発!!
JenkinsをDockerで構築した時、ホストマシン(Mac)上でもジョブ動かしたい

タイトルまんまですが

例えばJenkins経由でUnityのiOSビルドをしたい時、Dockerで構築したJenkinsだと無理といったケースで使えると思います

## ホストマシンをスレーブに設定する

> 参考: [開発者（個人）のためのJenkins - Slave編 - Qiita](https://qiita.com/yasuhiroki/items/d618796a1ba1366c4f80)

簡単ですね

ホストマシンをスレーブノードとして設定させて、実行させるジョブでノードを指定させればOKです

参考までに...
![image.png](https://qiita-image-store.s3.amazonaws.com/0/53200/c21a57f6-b00e-b358-b88a-823683f9e519.png)

ホストにはホストマシンのローカルIPをそのまま指定

認証情報は適宜設定する

設定完了後、ノードの状態が**『オンライン』**になっていれば適当なジョブを作成して実行して確認してみてください
VB.NETで文字列分割

VB.NETのレガシーコードを眺めていたところ、1つの文字列を特定文字列で分割し配列に収めるという処理を力技でやっている関数にぶち当たった。だいたいこんな感じ。

```vb
orgStr = "あ,いうえ,お"
delim = ","
d1 = 0
d2 = 0
Do
    ' 次の区切り文字の位置を取得
    If i = 0 Then
        d2 = InStr(1, orgStr, Chr(delim))
    Else
        d2 = InStr(d1 + 1, orgStr, Chr(delim))
    End If

    If d2 > 0 Then
        ' 次の区切り文字までの部分文字列を配列に取得
        If i = 0 Then
            destArr(i) = Mid(orgStr, 1, d2)
        Else
            destArr(i) = Mid(orgStr, d1 + 1, d2 - d1)
        End If
    Else
        ' 最後の区切り文字以降の部分文字列を配列に取得
        If i = 0 Then
            destArr(i) = orgStr
        Else
            destArr(i) = Mid(orgStr, d1 + 1)
        End If
        Exit Do
    End If
    i += 1
    d1 = d2
Loop

For Each row As String In destArr
    Console.WriteLine(row)
Next
```

出力はまあこうなる

```console
あ
いうえ
お
```

解析にも時間がかかってしまった。
似たような配列を生成する関数を作る必要が出てきたが、さすがにこの処理をまるっと採用することには抵抗感を禁じ得ない。VBには明るくないが、もっと楽な方法はないものか。
やれやれ。僕は検索した。

-----
### 検索結果

[**文字列を文字列により分割するには？（VB.NET関数活用）**](http://www.atmarkit.co.jp/ait/articles/0506/24/news134.html)

あるじゃねーの。

[**Split関数の「Limit」の使い方**](http://www.excel-wing.com/study/tips/1377)

こちらはVBAで、厳密に同じ関数ではないのだが、Limitの使い方は同じようなイメージでよさそう

-----

### 書き換え

```vb
orgStr = "あ,いうえ,お"
delim = ","
destArr = Split(orgStr, Chr(delim), -1)

For Each row As String In destArr
    Console.WriteLine(row)
Next
```

そしてこうなる

```console
あ
いうえ
お
```

1行にまとまった。標準関数を信じろ。

-----
### おまけ

配列A`arr1`の添字0以降の要素を5個、配列B`arr2`の添字3以降にコピーする。

```vb
Array.Copy(arr1, 0, arr2, 3, 5)
```
VBAからGAS経由でデータ取得

##やりたいこと
・GoogleSpreadSheetのデータを読み出してExcel側で使いたい

##実行環境
・Excel for Office365 MSO(16.0.10730.20102) 64bit

##対応
###GAS
・「ウェブアプリケーションとして導入」する(権限は全員匿名)
・SpreadSheetから取得したデータをカンマ区切りのCSV変換(改行は;)
・preタグで囲んだテキストとして返却する

```js:GAS側

var SHEET_ID = '*************';

function getMasterData() {
  var inSheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(
    'データシート'
  );
  // F-U列を取得
  return inSheet.getRange(3, 6, 150, 16).getValues();
}

function convertCSV(masterData) {
  var csvData = '';
  masterData.forEach(function(value) {
    if (!value[0]) {
      return;
    }
    csvData += value.join();
    csvData += ';';
  });

  return csvData;
}

function doGet(e) {
  var data = convertCSV(getMasterData());
  return ContentService.createTextOutput(data).setMimeType(
    ContentService.MimeType.TEXT
  );
}

```

###VBA
・IEオブジェクトを使ってHTML取得
・取得データをパースして使う

```vb:VBA側
Sub GetMaster()
    Dim objIE As Object
 
    'IE起動
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = False
 
    'APIを叩く(今のところ、権限制御一切してないけど)
    objIE.navigate "https://script.google.com/macros/s/***/exec"
 
    'IEを待機
    Call IEWait(objIE)
    
    'Debug.Print objIE.document
    Dim objLink As Object

    For Each objLink In objIE.document.getElementsByTagName("PRE")
        ' 変数に入れるなりなんなりして、パースする。
        ' 項目はカンマ区切り、行はセミコロン区切り。
        Debug.Print objLink.innerText
    Next
 
    'IE終了
    objIE.Quit
 
    Set objIE = Nothing
End Sub
 
'IEを待機する関数
Public Function IEWait(ByRef objIE As Object)
    Do While objIE.Busy = True Or objIE.readyState <> 4
        DoEvents
    Loop
End Function
 ```

##お世話になったサイト
この情報がなければ即死だった。→[VBAによるIE自動制御](https://vba-code.net/ie/)

最初はMSXML2.XMLHTTPを使おうとするも
64bit故なのか、期待通りの挙動とならず断念。
SourceTreeでcloneしようとしたらバグって先に進まない話

## 環境

SourceTree Version 2.6.10.0

# ファッキンSourceTreeにはいつも悩まされる。

今回、新しいPCをゲットしたので相変わらず諸々の環境構築をしていたわけですが、またしてもSourceTreeに足止めを食らう。

これが初めてではない。
[SourceTreeの内臓Gitのバージョンが上がらなかった話](https://qiita.com/zeroichi/items/51ba84a548312c2710db)

毎度お騒がせなSourceTreeですが、今回の症状は

**Remoteのリポジトリをcloneしようとすると無限にgithubのログイン画面が出てくる！！！！**

アカウント設定からgithubアカウントの紐づけは完了している。

しかし、いざクローンを試みると2個ログイン画面が出て入力しては消え、すぐにまた2つ出てくる状況・・・

※参考画像
![d5878c2463ec67da7e752812ea9547dd.jpg](https://qiita-image-store.s3.amazonaws.com/0/82250/bdc9082f-29bd-0d8a-5fe7-6697174a96f6.jpeg)

# 症状

上記のことが全てでここをクリアしないと何も作業ができないわけですが、ひっかかる点がもう一つ。

アカウントの紐づけが**Basic**でははじかれ、**OAuth**だと通る、謎

早いとこ決着をつけたいのでここはOAuthを選択。

# 解決方法

ひたすらHTTPSでの接続を試みても埒が明かなそうだったので、心機一転してSSHでの接続に切り替えてcloneを試みると・・・

**何事もなかったかのようにcloneできました。**

# まとめ

毎回こういう問題にぶち当たるたびに

「くっそ～、マジでいいかげんにしてくれ～～～、もう一生使わないでCUIでGit操作してやる！！！」

という気持ちにはなるのですが、なんだかんだGUIで操作できるのは便利だし、CUIとか怖いからこれからもSourceTreeと共に生きていきます。
SELECT文の実行結果からフッターのみ非表示にする[psql]

#はじめに
SELECTの実行結果からフッターのみを削除する方法（メモ）を記載しますが、
ついでに TableauなどのBIツールでデータを可視化する際に、
DBのカラム名をヘッダーとして使用し、出力したデータをそのまま利用できると便利なので、
併せて簡易なデータの整形方法を記載します。

#使用したDB

- PostgreSQL、Redshift 9.2系 

#データ整形
**何も指定せずにSELECTすると下記のようなデータが出力されます。**
※『』で囲まれた数値は後述する識別番号です。
select * from book;

```
  id   |   author   |　←『３』  title
-------+------------+---------------------　←『２』
  1000 | 太宰治     | 人間失格
  2000 | 太宰治     | 走れメロス
  3000 | 太宰治     | 斜陽
  4000 | 芥川龍之介 | 羅生門
  5000 | 芥川龍之介 | 蜘蛛の糸
  6000 | 芥川龍之介 | 河童
  7000 | 夏目漱石   | 坊ちゃん
  8000 | 宮沢賢治   | 銀河鉄道の夜
  9000 | 宮沢賢治   | セロ弾きのコ"ーシュ
 10000 | 宮沢賢治   | 注文の多い料理店
(10 行)　←『１』
```
データとして取り込むには不要な要素が多いのでコマンドを利用してデータを整形します。

##『１』フッター表示をOFF
```
DB=>\pset footer
デフォルトのフッタは off です。
```
※ ヘッダーもフッター必要ないときは「\t」を指定すれば消せます。

select * from book;

```
  id   |   author   |        title
-------+------------+---------------------
  1000 | 太宰治     | 人間失格
  2000 | 太宰治     | 走れメロス
  3000 | 太宰治     | 斜陽
  4000 | 芥川龍之介 | 羅生門
  5000 | 芥川龍之介 | 蜘蛛の糸
  6000 | 芥川龍之介 | 河童
  7000 | 夏目漱石   | 坊ちゃん
  8000 | 宮沢賢治   | 銀河鉄道の夜
  9000 | 宮沢賢治   | セロ弾きのコ"ーシュ
 10000 | 宮沢賢治   | 注文の多い料理店
```
##『２』位置揃えをOFF
```
DB=>\a
出力フォーマットは unaligned です。
```
select * from book;

```
id|author|title
1000|太宰治|人間失格
2000|太宰治|走れメロス
3000|太宰治|斜陽
4000|芥川龍之介|羅生門
5000|芥川龍之介|蜘蛛の糸
6000|芥川龍之介|河童
7000|夏目漱石|坊ちゃん
8000|宮沢賢治|銀河鉄道の夜
9000|宮沢賢治|セロ弾きのコ"ーシュ
10000|宮沢賢治|注文の多い料理店
```
##『３』（必要に応じて）区切り文字を変える（例：タブに変換）
```
-- ファイル出力に変更
DB=>\o /home/userA/test.txt
DB=>\pset fieldsep '\t'
フィールド区切り文字は "        " です。
DB=>select * from book;
DB=>\o
```
※ 区切り文字はデータに含まれない文字を指定しましょう。

cat /home/userA/test.txt

```
id      author  title
1000    太宰治  人間失格
2000    太宰治  走れメロス
3000    太宰治  斜陽
4000    芥川龍之介      羅生門
5000    芥川龍之介      蜘蛛の糸
6000    芥川龍之介      河童
7000    夏目漱石        坊ちゃん
8000    宮沢賢治        銀河鉄道の夜
9000    宮沢賢治        セロ弾きのコ"ーシュ
10000   宮沢賢治        注文の多い料理店
```
##コマンドラインで実行するなら
下記のようにすることで同様の結果が得られます。

```
psql -U xx -h xx -p xx -d xx -A -F '	' --pset footer -c 'select * from book' > test.txt
```
※ ターミナルでタブを入力するには「Ctrl+V」を実行後、Tabキーを押すことで入力出来るかも。

#おわりに
他にも便利なオプションが多く用意されていますので、
これらを知っていることで前処理にかける時間を減らすことが出来ますね。
pillow で図形をトリムして透過にする

こちらのプログラムを改造して、変換されら部分を透過にしました。
[pillow で図形をトリム](https://qiita.com/ekzemplaro/items/62acaf26a3939be6275e)
入力データ
![in01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4a4bc4c9-1b8c-33b9-8cb0-3b404d61171f.png)

出力データ
![out01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f3594358-d5b9-9c0e-e52f-581ab107666e.png)

```py:circle_transparent.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	circle_transparent.py
#
#						Oct/02/2018
#
# --------------------------------------------------------------------
import sys
import math
from PIL import Image
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#
img = Image.open(file_in)
img = img.convert("RGBA")
pixdata = img.load()

width, height = img.size
sys.stderr.write("%d\t%d\n" % (width,height))
#
xx_center = width / 2
yy_center = height / 2
rr_max = 90
#
for xx in range (width):
	for yy in range (height):
		delt_x = abs (xx_center - xx)
		delt_y = abs (yy_center - yy)
		arm = math.sqrt (delt_x * delt_x + delt_y * delt_y)
		if (rr_max < arm):
			pixdata[xx, yy] = (255, 255, 255, 0)
#
img.save(file_out)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

実行方法

```bash
./circle_transparent.py in01.png out01.png
```
DBMSのメモリについて学習したことまとめ

DBMSを今よりももっと正しく扱うために、DBMSで使用されるメモリについて学習したことのまとめ

## バッファマネージャとは
どのようなデータをどの程度の期間、バッファに載せておくかといったことを管理する機能。
HDD上のデータにアクセスするよりも`メモリ(バッファ/キャッシュ）にアクセスする方が高速`である。データベースのパフォーマンスにおいて重要な役割を担う。

### バッファ/キャッシュとは
パフォーマンスの向上を目的として、データを保持するメモリのこと。
`バッファ`はユーザとストレージとの間に割って入ることでSQL文のディスクアクセスを減らす。
`キャッシュ`もユーザとストレージの中間に位置することで、データの転送遅延を緩和する。

## メモリ上の2つのバッファ
### データキャッシュ
`ディスクにあるデータの一部を保持するためのメモリ領域`。SELECT文でデータキャッシュの中のデータを取得できた場合は、非常に高速なレスポンスが期待できる。

### ログバッファ
更新処理(INSERT, UPDATE, DELETE, MERGE)の実行に関係する。
DBMSは更新SQL文を受け取った際、`即座にストレージ上のデータを変更はせず、一度ログバッファ上に更新情報をためて、ディスクへの更新はあとでまとめて行う(commit時)`。

## メモリの欠点
メモリの欠点として、`揮発性(データの永続性がない)`が挙げられる。
`DBMSが何らかの障害でプロセスダウンした場合にメモリ内の全てのデータが消失してしまう`ため、機能的に完全にディスクの代替ができるわけではない。
データキャッシュはあくまでもキャッシュなので、消失してもオリジナルのデータは存在しているが、`ログバッファの消失の際は、データ不整合の問題が発生する`。

## 耐障害性・データ整合性とパフォーマンス
これを回避するため、コミットのタイミングで更新情報をログファイルに書き込むことで、データ整合性を担保している。その際、ディスクへの同期アクセスが必要になるため、遅延が発生する可能性がある。
`ディスクへの同期処理をすればデータ整合性と耐障害性は高まるが、パフォーマンスは低くなる。逆に、パフォーマンスを追求すると、データ整合性と耐障害性は低くなる(トレードオフの関係)`。

## 検索と更新のどちらを優先すべきか
メモリの限られたリソースを最大限有効活用するためには、`検索と更新のどちらを優先すべきか`というトレードオフに直面する。
システムが検索に比べて更新処理の多い特性を持っているならば（バッチ処理など）、ログバッファにメモリを多く割り当てるといったチューニング（最適化）が必要になる。

## ワーキングメモリ
ソートやハッシュなど特定の処理に利用される作業用の領域として、`ワーキングメモリ`がある。
ソートはORDER BY句、集合演算、ウインドウ関数など、ハッシュは主にテーブル同士の結合でハッシュ結合が使用された場合に実行される。メモリ領域の名称や管理方法はDBMSによって異なる（MySQLではソートバッファ）。
このメモリ領域は`必要なときにのみ使用され、使用後は開放される一時的な領域であり、不足した場合はストレージを使用する（パフォーマンス悪化につながる、通称TEMP落ち）ため、性能的に重要`である。

## 参考
参考図書 : [SQL実践入門](http://amzn.asia/d/23lKxxQ)
pillow で図形をトリム

入力データ
![in01.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/fed493ed-6ea3-8993-02ae-609f6e908779.jpeg)

出力データ
![out01.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/8e26c722-3d39-bf3c-f816-5d7fa0a56e69.jpeg)

```py:circle_trim.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	circle_trim.py
#
#						Oct/02/2018
#
# --------------------------------------------------------------------
import sys
import math
from PIL import Image
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#
img = Image.open(file_in)
if img.mode != "RGB":
	img = img.convert("RGB")
width, height = img.size
sys.stderr.write("%d\t%d\n" % (width,height))
#
xx_center = width / 2
yy_center = height / 2
rr_max = 90
#
for xx in range (width):
	for yy in range (height):
		delt_x = abs (xx_center - xx)
		delt_y = abs (yy_center - yy)
		arm = math.sqrt (delt_x * delt_x + delt_y * delt_y)
		if (rr_max < arm):
	        	img.putpixel((xx, yy), (255, 255, 255))
#
img.save(file_out)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

実行方法

```bash
./circle_trim.py in01.jpg out01.jpg
```
リモートホスト上のNodeJSからローカルのchromeでデバッグする

リモート環境：centos6.10 (vagrant)


「node --inspect=0.0.0.0:9229  --inspect-brk helloworld.js」

をhelloworld.jsのあるフォルダ上から実行し、chromeのURLで「chrome://inspect/#devices」を開く。すると、Remote Target上にfile:///home/vagrant/nodejs/helloworld.js で表示されるので、それを開くとデバッグ画面を開くことができる。ちなみに--inspect-brkは、ファイルの最初の行にブレークポイントを仕掛けるということらしい。
ランチガチャ！

今日のお昼は何にしようかな～。


# ランチ確率設定
```js:JavaScript
var lunch = [
	{
		"text": "もやし(メキシコ料理)",
		"weight": 270
	},
	{
		"text": "カレー",
		"weight": 265
	},
	{
		"text": "餃子",
		"weight": 240
	},
	{
		"text": "烏龍茶おいしい",
		"weight": 220
	},
	{
		"text": "刀削麺",
		"weight": 200
	},
	{
		"text": "ふりかけ",
		"weight": 180
	},
	{
		"text": "しょうが焼き",
		"weight": 100
	},
	{
		"text": "店員さんかわいい",
		"weight": 80
	},
	{
		"text": "寿司",
		"weight": 35
	},
	{
		"text": "ハンバーグ",
		"weight": 30
	},
	{
		"text": "焼肉",
		"weight": 20
	},
	{
		"text": "第二しょうが焼き",
		"weight": 10
	}
];
```

# 抽選関数
```js:JavaScript
function getTodayLunch(lunch){
    var total = 0;
    for(var i = 0; i < lunch.length; i++){
        total += lunch[i].weight;
    }
    
    var random = Math.floor(Math.random() * total);
    
    var target = 0;
    
    for(var i = 0; i <= lunch.length; i++){
        target += lunch[i]['weight'];
        if (target >= random) {
            var result = "今日のお昼は、" + lunch[i]['text'] + "\n";
            break;
        }
    }
    
    return result;
}
```

# ランチガチャ！
```js:JavaScript
console.log(getTodayLunch(lunch));
```
horovodの動向メモ

# 最近のサポート状況
自分のメモ用も兼ねて，horovodに最近どのような機能が追加されたか簡単に書きます．

(2018/10/2 記載)

## GPUでのFP16サポート[#529](https://github.com/uber/horovod/pull/529)
allreduceするgradientをfloat32からFP16にキャストするというもの．
こういう事しても，学習精度に影響ないのですかね？[chinerMN](https://research.preferred.jp/2018/05/chainermn%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E7%92%B0%E5%A2%83%E5%90%91%E3%81%91%E6%96%B0%E6%A9%9F%E8%83%BD%E3%81%A8aws%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E6%80%A7%E8%83%BD%E8%A9%95/)も似たようなことやってそう．

## tf.keras[#513](https://github.com/uber/horovod/pull/513)
もともと，kerasはTensorflow専用ではありませんが，
kerasがTensorflowに統合され高レベルのAPIの一つとして利用可能になりました．
horovodでも対応したようです．

## hierachical allreduce algorithmの改善[#411](https://github.com/uber/horovod/pull/411)
NCCL ReduceScatter - Parallelized MPI Allreduce - NCCL Allgather を利用してパフォーマンス改善．
これって，Rabensifnerのアルゴリズム([論文](https://pdfs.semanticscholar.org/8d44/e92b3597d9e3f5245e152c9e0ce55b3e68a4.pdf))を実装しましたって話かな．

## IBM PoerAI DDLのサポート([紹介記事](https://developer.ibm.com/linuxonpower/2018/08/24/distributed-deep-learning-horovod-powerai-ddl/))
IBMが開発したGPUの分散向けライブラリDDL(distributed deep learning)に対応

## horovod on Spark
[HorovodEstimator](https://docs.azuredatabricks.net/applications/deep-learning/distributed-deep-learning/horovod-estimator.html)

# 気になるもの 
## Deep gradient compression implementation[#453](https://github.com/uber/horovod/pull/453)
DGCと呼ばれる，gradientを圧縮する仕組みをHorovodに取り入れたいというPR．
(ある閾値以上のgradientのみをallreduceしたりとか)
PRした人は，RestNet50 で同様のaccuracyを維持して5~10%の性能改善したよと．
本体に取り入れられるかどうかはわからないが，測定データとか見てみたい．
Vuetifyを使ってみる:備忘録

Vuetifyを使う必要があったので色々と手順などをメモ

#Quick Start

##Vue　CLI-3　Install
yarnとnpｍがあるけどnpmを利用

```
$ npm install @vue/cli -g
```

scaffoldでプロジェクトを作成

```
$ vue create my-app
$ cd my-app
```

ここでvuetifyをプロジェクトに追加

```
vue add vuetify
```

なんか色々聞かれるからそれ相応の設定を返答。
とりあえずテスト的に入れてみたいだけなのでいい加減に回答。

最後に`npm run serve`すると見れ…ない。
エラー内容は下記。

```
contains both .browserslistrc and package.json with browsers
```

詳しくはないのだけどこれ両方あるとだめなの？
片方(.browserslistrc)の最後にアンダーバー(_)つけて再度実行すると動いた。
ココらへん一度調べたい。

とりあえずは動いた。
Git関連のターミナルコマンドを忘れた時の覚え書き。

<h2>はじめに</h2>
◆環境設定
・機種：Mac
・ブラウザ：Google Chrome

◆使用する状況
すでに、GitやGithubを使い始めており、
業務を行う上で、コマンドを忘れた際に見返す。

<h2>基本的なターミナルコマンド</h2>
◆現在いる場所の確認
pwd 

今現在どこにいるかによって、addする際など、ファイル名にディレクトリを記載してあげるかどうか変わってくる。
※追加するファイルが一個上もしくは下の階層に入ればいいが、そうでない場合は記載する。

<h2>Gitのいつもの流れ</h2>
◆gitに最新の状態を反映する
① git add ファイル名
② git commit -m"なぜ変更したかなどのコメントを書く"
③ git push　origin　ファイル名

※②で、なぜしたか(why)を書くのは、
 5w1hは、git logで変更時間(when)や変更した人（who)
 何をどうやっては、whatやhowはコードを見ればわかる。

<h2>Gitの今の状況を確認したい場合</h2>
◆履歴を見る
git log　

◆差分を見る
git status　

<h2>Githubにあるコードをローカルにダウンロードしたい時</h2>
git clone 　「緑のボタンをクリックし、赤で塗りつぶしてあるところのリンクをコピー＆ペースト」。
<img width="350" alt="スクリーンショット 2018-10-02 15.13.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/286126/70d34b4e-7326-55bc-fbd4-91cffdb22623.png">


※zipでダウンロードしても良いけど、フォルダ名や保存場所を考えると、
　コマンドを打ち込んだほうが、後ほどpushした時に、
ファイル存在してないよと言われるのを避けれるかも。
　

<h2>ブランチをきれと言われたら</h2>
◆ブランチをきる
git  branch ブランチ名

◆現在のブランチを確認
git  branch　

◆　指定したブランチ名に切り替える。
git checkout ブランチ名
/dev/null に関するメモ

`/dev/null`に関してメモっとく。

## `/dev/null` って結局なんなん？
`/dev/null`は空ファイルって意味なんやて。要するにゴミ箱って認識でいいと思うの。
結果を出力したくないとか捨てたいときに使う。

## 出力結果を捨てる
`command > /dev/null`みたいに出力結果を捨てるときに`/dev/null`を使う。`>`はリダイレクト。

例えば、if文とかで出力結果は捨てたい時とかに使う。

```
PC0339% if which cd > /dev/null; then echo "hoge"; fi 
hoge
PC0339% if which cd; then echo "hoge"; fi
cd: shell built-in command
hoge
PC0339% 
```

1回目のコマンドはif文の結果の`hoge`しか出力されていないが、2回目のコマンドは`which`の結果も出力されている。

## `command > /dev/null 2>&1`について
よくcrontabで見かける記述だが、これは標準出力とエラー出力をどっちも捨てるという意味。コマンドをそれぞれ分解すると、

- `１`  : 標準出力
- `2`  : 標準エラー出力
- `>&` : マージ

つまり、`2>&1`は標準エラー出力を標準出力にマージという意味。
よって、上記のコマンドの意味は、標準エラー出力を標準出力にマージしてから捨てるという意味になる。まどろっこしいぜ。