OmniAICreator/Qiita-1.07M huggingface dataset:
msgpack4zを使ってみた

## はじめに
ScalaでMessagePackがやってみたくて、色々なライブラリを調べてみたところ、このmsgpack4zが一番メンテされてそうな雰囲気がしたので試してみたところ、難儀したもののうまくいったので自分向けにメモ。

## msgpack4zの特徴
(他に比べると)よくメンテされている、実装がシンプル。ScalaJS対応。Scalaz依存。悪く言えばこのblogが作者以外がmsgpack4zについて書いた最初のblogというレベルの文章の少なさ。

## 参考リンク
http://msgpack.org/ja.html
MessagePack公式。特に仕様とか

https://github.com/msgpack4z
GitHub。最後はソースコード頼み

https://xuwei-k.hatenablog.com/entry/20150106/1420506917
作者のブログ。作成の経緯とか設計とか書いてある。

https://gist.github.com/xuwei-k/5e902a3875153cffa25f48ba7def4188
サンプル書いてほしいってお願いしたら作者からもらったやつ。大変良くできているのでこれ1つあればとりあえず動かせるとおもう。ただお願いしたときにmsgpack4z-circeとかの仕様について勘違いがあって、msgpack4z-circeの使い方をお願いしたけどぼくがやりたい事的にはいらなかったというオチがある。(のでcirceまわりは除けばそのまま普通の使い方になる)

## Codecの追加
UUIDのCodecが必要なので追加。文字列に変換するだけで良いのでこんな感じか。

```scala
import java.util.UUID

import msgpack4z._
import scalaz.\/

object MyMsgPack {
  implicit object UUIDCodec extends MsgpackCodec[UUID] {
    override def pack(packer: MsgPacker, a: UUID): Unit = packer.packString(a.toString)

    override def unpack(unpacker: MsgUnpacker): UnpackResult[UUID] =
      \/.fromTryCatchNonFatal(UUID.fromString(unpacker.unpackString()))
          .leftMap(Err)
  }
}
```

\/はscalazのEitherで、Scala本体のEitherよりリッチなもの、という認識。unpackは失敗する可能性があるのでEitherを返さないといけない。

## デバッグ
書けたけどこれどうやって正しいデータかテストするよ、という問題がMessagePack共通であるのだが、msgpack-toolsにmsgpack2jsonというコマンドがあり、curlの結果をこのコマンドで処理すれば問題なく見れる。

## その他
Codecが不足している旨のコンパイルエラーが出たら、サンプルのGistにあったcase classのmapperを実装して、`msgpack4z._`と`msgpack4z.CodecInstances.all._`をimportすれば殆ど解決する筈。Good luck!
画面が映らなくなったけど微妙にタッチに反応してるっぽいiPhoneのデータを救い出す

iPhoneの画面、よく割れますよね。
液晶部分が割れて、表示がグチャグチャ・・・でもiPhone自体反応してる！！って時に、なんとか思うような操作（データをicloudにアップするとか）を行えるようにする裏技です（要Mac）。

1. iPhoneをMacに接続する
2. Quick Time Playerを起動させる
3. ファイル→新規ムービー収録で録画ボタンの横の三角を選択してiPhoneを選択

すると、iPhoneに映し出されているはずの画面がMacに映ります。
この画面を見ながら、なんとなく操作してみましょう。
bashのbrace expansionでfor文を使いこなせ！

# 背景

退屈なことは大体`shell`でなんとかなります。特に普段からコマンドラインに生息している人は、バーっと書いてそのまま動けばこんなに楽なことはありません。

ところで、`shell`ですることと言えば、`grep`して`sort`して`uniq`みたいなことをここにあるファイル全部についてやりたい、とか、ファイルを連番でコピーして`sed`でちょっとずつパラメータを変えていきたいとか、そういうことでしょう。つまり、`for`文を書く機会がそれなりにあるはずです（前者は`grep 'hoge' piyo/*.fuga`の方が楽ですが）。

では皆さんは`bash`で`for`文を書くときどうしていますか？ 私は`seq`コマンドを使っていました。

```bash
for i in `seq -w 1 10`; do
    echo ${i}
done
01
02
03
04
05
06
07
08
09
10
```

`-w`オプションを使うと幅が調整されるので連番ファイルの時に地味に便利です。

ですが、例えば`seq`ではアルファベット順に何かをすることが難しいです。

```bash
for a in `seq A D`; do
    echo ${a}
done
A
B
C
D
# となってほしいが、ならない
```

これは、例えば以下のようにすれば動くんですが、

```bash
for a in A B C D; do
    echo ${a}
done
A
B
C
D
# 今度は動く
```

これはプログラマとしてはあまり嬉しくないです。このコードは「怠惰」ではありません。`A`から`Z`まで回したいときはどうするんですか？　プログラマが根性で問題を解決してはいけません。

といって`seq`で対応するASCIIコードを吐いて`printf`コマンドを使う、というようなことをすると化け物みたいなコードが生まれます。`bash`ワンライナーは可読性という言葉からかなり遠いところにある概念ですが、それでもASCIIコードが生で登場するワンライナーは一段階ステージが上でしょう。

# 解決策

というわけで本題です。以下が動きます。

```bash
for a in {A..D}; do
    echo ${a}
done
A
B
C
D
```

上で言っていた方法は全てお払い箱です。可読性は十分、そして簡単。これで全部なんとかなります。

これは想像以上に強力な機能で、例えば`ABCD`と回した後に`1234`と回したい時などもそれぞれ書けばできますし、

```bash
# {}間にスペースが必要
for a in {A..D} {1..4}; do
    echo ${a}
done
A
B
C
D
1
2
3
4
```

また`A1 A2 A3 A4 B1 B2 ...`と回したい時も、2重ループなんぞ必要ありません。

```bash
# {}間にスペースを入れず、詰めて書く
for a in {A..D}{1..4}; do
    echo ${a}
done
A1
A2
A3
A4
B1
B2
B3
B4
C1
C2
C3
C4
D1
D2
D3
D4
```

え、ファイルのIDはアンダースコアで区切ってある？ 中々見やすい名前をつけていますね。では一気に回しましょう。変数なんか1個でいいですよ。

```bash
for a in data_{A..D}_{1..4}.dat; do
    echo ${a}
done
data_A_1.dat
data_A_2.dat
data_A_3.dat
data_A_4.dat
data_B_1.dat
data_B_2.dat
data_B_3.dat
data_B_4.dat
data_C_1.dat
data_C_2.dat
data_C_3.dat
data_C_4.dat
data_D_1.dat
data_D_2.dat
data_D_3.dat
data_D_4.dat
```

ほう、`data_A_01.dat`のようになっているので数字の頭に0を付けたいと。幅が統一され、見目麗しくなる素晴らしい命名規約だと思います。今後もぜひ続けて下さい。同じだけ簡単にループで処理できるので。

```bash
for a in data_{A..D}_{01..10}.dat; do
    echo ${a}
done
data_A_01.dat
data_A_02.dat
data_A_03.dat
data_A_04.dat
data_A_05.dat
# ... (中略) ...
data_D_06.dat
data_D_07.dat
data_D_08.dat
data_D_09.dat
data_D_10.dat
```

最高ですね。

# 補遺

もちろん、刻み幅も変えられます。

```bash
for i in {01..10..2}; do
    echo ${i}
done
01
03
05
07
09
```

アルファベットでもお構いなしです。

```bash
for a in {A..G..2}; do
    echo ${a}
done
A
C
E
G
```

# 参考

[Bash Reference Manual -- 3.5.1 Brace Expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html)
geth起動

ターミナルってやつにぶち込む

# 最初の設定
```
sudo mkdir -p /tools/ethereum/Geth-1.6.5
```

```
sudo chmod 777 /tools/ethereum/Geth-1.6.5
```

# パスを通す
```
export PATH=$PATH:/tools/ethereum/Geth-1.6.5
```

# データの初期化
```
geth --datadir /tools/ethereum/Geth-1.6.5/home/eth_private_net init /tools/ethereum/Geth-1.6.5/home/eth_private_net/genesis.json
```

# geth起動
```
geth --networkid "10" --nodiscover --datadir "/tools/ethereum/Geth-1.6.5/home/eth_private_net" --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" --rpcapi "eth,net,web3,personal" --targetgaslimit "20000000" console 2>> /tools/ethereum/Geth-1.6.5/home/eth_private_net/geth_err.log
```

ブロックチェーンアプリケーション開発の教科書を見ました
gethバージョンは少し違いますが,,,
Rosserialで大きなサイズのデータを送受信する。

###目的
M5stack/ESP32のある程度CPUが早い環境で、負荷の高い処理を行わせるために、
rosserial_arduinoで大きなサイズのデータを送ろうとすると、
以下のエラーが発生する場合がある。

>$ rosrun rosserial_python serial_node.py tcp >log
>[ERROR] Message from ROS network dropped: message larger than buffer.


###解決策

node_handle.hのINPUT_SIZE/OUTPUT_SIZEを大きくする


````
...
namespace ros {
  using rosserial_msgs::TopicInfo;
  /* Node Handle */
  template<class Hardware,
           int MAX_SUBSCRIBERS=25,
           int MAX_PUBLISHERS=25,
           int INPUT_SIZE=512, 
           int OUTPUT_SIZE=512> 
  class NodeHandle_ : public NodeHandleBase_
  {
...
````

````
...
namespace ros {
  using rosserial_msgs::TopicInfo;
  /* Node Handle */
  template<class Hardware,
           int MAX_SUBSCRIBERS=25, // Reduced from 25
           int MAX_PUBLISHERS=25, // Reduced from 25
           int INPUT_SIZE=200000, // Increased from 512
           int OUTPUT_SIZE=200000> // Increased from 512
  class NodeHandle_ : public NodeHandleBase_
  {
...
````


参考：
ROSWiki:Message from ROS network dropped: message larger than buffer.
https://answers.ros.org/question/215076/message-from-ros-network-dropped-message-larger-than-buffer/
Chromeなどでお気に入りのサイトをMacのTerminalから簡単に開く方法

[p]:https://prog-8.com
自分は[Progate][p]が好きなので[Progate][p]のサイトを簡単に開けるようにする

# やりたいこと　　
`open /Applications/Google\ Chrome.app https://prog-8.com/users/sign_in` と入力して起動しているのを
↓
`chrome $Progate`と打つだけで起動できるようにしたい

# やること
1. Chromeアプリを`chrome`コマンドだけで起動できるようにする
2. `https://prog-8.com/users/sign_in`を環境変数に登録し`$Progate`でサイトURLをよびだせるようにする

# Chromeアプリを`chrome`コマンドだけで起動できるようにする
 1. bash_profileを開く
 2. `alias chrome="open /Applications/Google\ Chrome.app`を追記する
 3. ターミナルを開き直す
 4. ターミナルに`chrome`と入力しChromeが起動するのを確認する

参考：[Mac: ターミナルからFirefox, Safari, Chromeを起動](http://tkymtk.hatenablog.com/entry/2013/11/07/115838)

# サイトURLを環境変数に登録し`$Progate`でサイトURLをよびだせるようにする
 1. .bash_profileを開く
 2. `export Progate=https://prog-8.com/users/sign_in:$Progate`を追記する  
   →これでProgate環境変数が追加され`$Progate`で呼び出す事ができるようになる
 3. ターミナルを開き直す

参考：[[Mac]環境変数PATHの設定・変更・追加・確認・順番入れ替えの方法](https://gabekore.org/mac-path-environmental-variable)

# 起動する
ターミナルに`chrome $Progate`と入力してChromeで[Progate][p]のサイトURLが起動するのを確認する
【GAS】Gメールでファイルを添付して自動返信

#概要
- GASの時間主導型トリガーで動く
- Gメールで未読のメールについてfizzbuzzを含むものを検索
- 見つかったらhogeフォルダのファイルを添付して送信
- 既読をつけて終了

#コード
```javascript

function main() {
  autoReply('(is:unread "fizzbuzz")', //未読かつfizzbuzzを含むもの
            'タイトル',
            'メールを受け取りました。',
            getFilesByFolderName('hoge');
           );
}

function autoReply(str, subject, body, files) {
  var mails = GmailApp.getMessagesForThreads(GmailApp.search(str)); //検索と配列へ変換
  
  if(mails.length == 0) //メールがなければ終了
    return;

  mails.map(function (mail) {
    MailApp.sendEmail({
    to: mail[0].getFrom(),
    subject: subject,
    body: body,
    attachments: files
    });

    mail[0].markRead(); //既読付け
  });
}

//フォルダの名前から検索して中のファイルを配列で返す
function getFilesByFolderName(folderName) {
  var folder = DriveApp.getFoldersByName(folderName).next();
  return iteratorToArr(folder.getFiles());
}

function iteratorToArr(files) {
  var arr = [];
  
  while(files.hasNext()) {
    arr.push(files.next());
  }
  
  return arr; 
}
```
#問題点
- getFilesByFolderNameや添付フォルダの検索はメールの有無を確認してからした方がよさそう
- Gmail側で誤って既読を未読に変更したら再送信されてしまう。
- また、GASが動く前にうっかりメールを見てしまうと既読になり自動送信してくれない。
- フォルダの名前がかぶるとまずい。IDで指定すればいい。

#参考資料
[Class GmailApp  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/gmail/gmail-app)
[【GAS】新たな問い合わせメールをGmailで取得しスプレッドシートに随時追加する](
  https://tonari-it.com/gas-add-contact-mail/)
GPSの研究　その12

#概要

GPSを理解したかった。
NMEAをパースして、衛星の情報を取ってみた。

#サンプルコード


```
import micropyGPS

gps = micropyGPS.MicropyGPS(9, 'dd')
f = open("test10.nmea")
while True:
    line = f.readline()
    if not line:
        break
    if (line[0 : 6] == "$GPGSV"):
        for x in line:
            gps.update(x)
        for k, v in gps.satellite_data.items():
            print ('%d: %s' % (k, v))
        print ('')


```


#結果


id, 人工衛星の仰角, 人工衛星の方位角, SN比


```
18: (66, 209, 30)
15: (13, 234, 18)
5: (66, 130, 30)
22: (52, 297, 27)
26: (16, 103, 17)
29: (12, 107, 14)
30: (37, 186, 24)
21: (6, 212, 22)
9: (49, 41, 31)


```


以上。
Jupyter-notebookからtex, pdfを作成するための覚え書き（仮）

# latexの日本語対応環境の構築
下記ページをそのまま実施。（使用OS:macOS Sierra）
[MacTeX 2018 のインストール＆日本語環境構築法](http://doratex.hatenablog.jp/entry/20180501/1525144736)
# latex, pdfへの変換
下記ページを参考に実施。
[jupyter notebookをTex，PDFへと変換](http://ossyaritoori.hatenablog.com/entry/2017/10/25/jupyter_notebookをTex，PDFへと変換)

ターミナルで下記コマンドを実行し`hoge.tex`を作成する。
`jupyter-nbconvert --to latex hoge.ipynb`
`jupyter-nbconvert --to latex --output-dir ./. hoge.ipynb`
次にtexにコンパイルを行い、hoge.pdfを作成する
`platex hoge.tex`
`dvipdfmx hoge.dvi` 

#latex編集
数式の書き方は以下のサイトを参考にする。
[LaTeXコマンド集](http://www.latex-cmd.com/index.html#equation)
Concourse CIのよく使うコマンド集

# mainチームにログイン
```
fly -t localhost_main login -c http://localhost:8080 -n main -u concourse -p concourse
fly targets
```

# チームを作成
```
fly -t localhost_main set-team -n SAMPLE_TEAM --basic-auth-username SAMPLE_USER --basic-auth-password SAMPLE_PASS
fly -t localhost_main teams
```

# チームにログイン
```
fly -t localhost_SAMPLE_TEAM login -c http://localhost:8080 -n SAMPLE_TEAM -u SAMPLE_USER -p SAMPLE_PASS
fly targets
```

# チームにパイプラインを作成
```
# バリデーション
fly -t localhost_SAMPLE_TEAM validate-pipeline -c SAMPLE_PIPELINE.yml

# パイプライン作成/更新
fly -t localhost_SAMPLE_TEAM set-pipeline -p SAMPLE_PIPELINE -c SAMPLE_PIPELINE.yml

# パイプライン解除
fly -t localhost_SAMPLE_TEAM unpause-pipeline -p SAMPLE_PIPELINE

# パイプライン一覧
fly -t localhost_SAMPLE_TEAM pipelines
```

# パイプラインを実行
```
fly -t localhost_SAMPLE_TEAM trigger-job -j SAMPLE_PIPELINE/SAMPLE_JOB_1 -w
```
awscliからDynamoDBのインデックスへQueryするコマンドと引数

例えば user_id と date カラムで検索したい場合は下記のようなコマンドになる

```console
$ aws dynamodb query \
     --table-name {{ テーブルの名前 }} \
     --index-name {{ インデックスの名前 }} \
     --key-condition-expression '#p = :1 AND #s > :2' \
     --expression-attribute-values '{":1": {"N": "12345"}, ":2": {"S": "2018-06-05"}}' \
     --expression-attribute-names '{"#h": "user_id", "#s": "date"}' \
     --return-consumed-capacity INDEXES
```

### `--key-condition-expression`

> \#p = :1 AND #s > :2

等号や不等号でクエリの条件関係を書くところ。
`#p` や `:2` などのカラム名、変数名はこの後の引数で埋めていく

### `--expression-attribute-values`

> {":1": {"N": "12345"}, ":2": {"S": "2018-06-05"}}

jsonでクエリのバインド変数みたいなところを埋める
数値型 (`"N"`) のカラムの条件値でもjson上は文字列として渡す必要があるようだ


### `--expression-attribute-names`

> {"#h": "site_id", "#s": "date"}

カラム名を側を埋めるための指定をjsonで記述する
`date` が予約語だそうで、今回はそのワークアラウンドで使用した

ちなみに `#h` は ハッシュキーで `#s` はソートキー


#### `--return-consumed-capacity INDEXES`

キャパシティユニットの使用量をインデックスごとテーブルごとに詳細に出してくれる


## 参考

- [query — AWS CLI 1.15.40 Command Reference](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/query.html)
reduce使えばJavaScriptで簡単に線形補間できる

# 簡単に線形補間する方法
reduceを使えば、ある数値が昇順に並んだ配列の何番目と何番目の間かがすぐわかります。

```javascript
const index= x.reduce((pre,current,i)=>current <= x0 ? i : pre, 0)
````

これにより、線形補間を簡単に計算できます。

```javascript
const linear = (x, y)=>{
  return (x0)=>{
    const index= x.reduce((pre,current,i)=>current <= x0 ? i : pre, 0) //数値が何番目の配列の間かを探す
    const i = index === x.length-1 ? x.length-2 : index //配列の最後の値より大きい場合は、外挿のために、最後から2番目をindexにする

    return (y[i+1]-y[i])/(x[i+1]-x[i])*(x0-x[i])+y[i] //線形補間の関数を返す
  } 
}

const x = [0,1,2,3,4,5] 
const y = [0,2,4,6,8,10]
const linear0 = linear(x,y) //線形補間関数を作成

const x0 = 2.5 
const y0 = linear0(x0) 
console.log(y0) // -> 5
````

jsnoteにコードを張り付けてで試してみてください。

[![Imgur](https://i.imgur.com/HstpPha.png)](https://toyoharu-nishikawa.github.io/jsnote/)
UE4で作ったOculusGoのアプリをMirageSolo対応に変える方法

スタンドアロンVRハッカソンにて
周り全部のチームがUnityの中で
僕たちのチームがUE4でOculusGoとMirageSolo両対応のアプリを作るという
チャレンジをしてみた！
という前回の記事から

https://qiita.com/mizuki_izuna/items/33519efdb2fb95446cdb

OculusGo向けに作ったアプリをMirageSolo向けに対応しまーす（ΦωΦ）

#簡単に差し替えます。

もともとあるOculusGo用のアプリのプロジェクトをそのまま使うとビルドエラーをすることが多かったので
ちょっと調査中ですが
今回は前回の記事の用にMirageSolo用に作ったアプリのプロジェクトにOcuulusGoで作ったプロジェクトを
一式Migrateでコピーします。

プラグインのOculus用のプラグインを一旦外して
GoogleVRとGoogleVRInputのプラグインをセットします。

##コントローラーの変更
コピーが完了したらカメラのPawnについてるMotionControllerをちょっと切り替えます。

もともとMotionContorollerだけだったのを
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/62400/8c1d8305-14b5-9320-a868-0c16edb8ecc2.jpeg)



GoogleVRMotionControllerを追加しての下に
MotionControllerを入れます。
Controllerの位置とか取りたいけどGoogleVRMotionControllerだととれなかったので
GoogleVRMotionControllerのしたに追加しました

![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/62400/d14072e2-eb34-9af1-0c5d-f560cecc17c8.jpeg)


これで差し替えできました（ΦωΦ）
リーダブルコードを今更カンタンにまとめてみた

# リーダブルなコードにする
リーダブルなコードにするとは、コードを読んで**理解する時間**を**最短**にするということ。

**優れたコード=短いコード** ではない

**他人のため**だけでなく**未来の自分のため**でもある

# 名前に情報を詰め込む
tmp, retvalなどの汎用的な名前は避け、短すぎたり長すぎる名前も避ける。
→**エディタの単語補完機能**があるので、名前の長さで開発スピードが落ちることはない。

### 名前の長さは**スコープ**に強く依存する
スコープが小さければ短い名前でもいい。
**メンバ変数**や**グローバル変数**であれば名前に十分な情報を詰め込むべき。

# 目にも優しいコード
### 原則
- **読み手が慣れているパターンに**
- **一貫性のあるレイアウトに**
- **似ているコードは似ているように**
- **関連するコードはまとめてブロックに**

``` Java
class Logger {
    ...
};
```

``` Java
class Logger
{
    ...
};
```

上記は完全にエンジニアとしての好みによる書き方の違いだが、これらも**一貫したレイアウト**の原則に従ってどちらかのスタイルのみを使用するべき。
プロジェクトによっては**間違ったスタイル**を使用している場面もあるが、それはプロジェクトに従うべきであるとのこと。

# コメントは本当に必要か
リーダブルなコードとは読み手の理解する時間を最短にすることであった。
**ひどいコメント**は貴重な理解するための**時間を奪う**。
変数と同じで、コメントにも**必要な情報**を詰め込む

### コメント**すべきではない**こと
- コードからすぐに読み取れること
- ひどいコードを補う**補助的なコメント** → コメントに頼るのではなくコードを修正する

### コメント**すべき**こと
- なぜコードが他のやり方ではなくこうなっているのか
- コードの注意書きをする(TODO:, XXX: の記法を使って)
  - TODO: あとで手をつける
  - FIXME: 既知の不具合があるコード
  - HACK: あまり綺麗じゃない解決策
  - XXX: 危険！ 大きな問題がある
- 定数の値にまつわる背景

# 条件式も読みやすく

``` Python
if length > 10:
```

``` Python
if 10 < length:
```

であれば読みやすいのは**前者**。
なぜならば、評価の対象(length)が最初に目に入るからである。

``` Java
time_str += (hour >= 12) ? "pm" : "am"
```

``` Java
return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);
```
三項演算子は、前者は読みやすいが、後者は読みにくくなってしまう。
**これが1行で記述することがリーダブルコードとはならない例である。**

その他にも`do-while`、`条件文のネスト`は避けたほうがよい。

# 低レベルの問題はモジュールに切り分ける

### 原則
- プロジェクトと無関係な問題は**汎用コード**として切り分けるべき(→複数のプロジェクトで再利用)
- 既存のインターフェースが使いづらければ**ラップ**するべき

# 読んだ後にやるべきこと
- 実際にやる
- 当たり前にする
- コードで伝える

読みやすいコードを書く、忘れてもいいコードを書く。
Ingressでサービスのコンテキストパスを書き換える

# 経緯

KubernetesはIngressを使うことでサービスをクラスタの外部に公開することができますが、外部に公開したいパスとサービスの実際のパスが異なるケースがあります。例えば、サービスはコンテキストパスが`/`ですが、外部公開する場合は`/hoge`としてアクセスさせたいケースです。例えば、Ingressでは`/`はデフォルトバックエンドのために使うべきとされていますので、`/`を使いたくない場合があります。

# 方法

## アプリ内URIの相対パス化

常識的なことかもしれませんが、アプリ内で使われるURIは`/a/b`のような絶対パスではなく、現在のURIからの相対パス、例えば`/a`にいる場合は単に`b`とします。このあたりはフレームワークやテンプレートエンジンの仕様に依存しますので確認ください。

## Ingressのマニフェストでrewrite-targetを指定

sample-svcサービスに/sampleでアクセスするとsample-svcの/と見なす定義です（ややこしい）。rewrite-targetアノテーションを使います。

```
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sample-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /sample
        backend:
          serviceName: sample-svc
          servicePort: 8080
```

以上です。
文字列定義を使わずにHello World

# TL;DR
* またつまらないものをつくってしまった

# レギュレーション
* 文字リテラル(`"` および`'`)、ヒアドキュメントの使用禁止
* クラス、メソッドを作成してその名前を利用することを禁止

# 実際作ったの

```php
<?php
error_reporting(E_ALL);

$h = substr(key(parse_url(1)), 3, 1); // 'path' の h
$e = substr(key(pathinfo(1)), 6, 1); // 'dirname' の e
$l = substr(array_keys(pathinfo(1))[2], 2, 1); // 'filename' の l
$o = substr(gettype(true), 1, 1); // 'bool' の o

ob_start();

http_build_query(); // '\nWarning: http_build_query() expects at least 1 parameter, 0 given in'
$buffer = trim(ob_get_contents());

$W = substr($buffer, 0, 1);
$r = substr($buffer, 2, 1);
$d = substr($buffer, 18, 1);
$space = substr($buffer, 8, 1);

ob_end_clean();

$helloWorld = ucwords($h . $e . $l . $l . $o) . $space . $W . $o . $r . $l . $d;

echo $helloWorld, PHP_EOL;
```
IntelliJ IDEAでVue.jsを動かす


何かと便利らしいのでVue.jsもIntelliJ IDEAで動かした。
ただ動かしたかった。
基本ここに書いてるけど、僕はIntelliJ 力がないため、その部分も補完した記事になってるはずです。
https://pleiades.io/help/idea/vue-js.html


これを読めばとりま　こうなります。

<img width="1350" alt="スクリーンショット 2018-06-16 18.22.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/7139f6dc-09e0-a1e3-6ea4-580ee5e1a324.png">


# 前提
- mac
- Vue.jsの環境できてる
- IntelliJ IDEA Ultimate最新版

サムライズのハンズオンに行った時には、常に最新を取得してくださいと言われました。
ここからIDE買えるみたいですが、僕は知らなくて公式から買いました。
試用期間は無料で使えるようです。
https://samuraism.com/jetbrains/intellij-idea

#とりあえず新規作成

動かす方法に２つあって「空のIntelliJ IDEAプロジェクトを作成」と「静的 WebからVue.jsを作成」するパターンとある。
今回は「静的 WebからVue.jsを作成」をやってみる。

##Vue.jsプラグイン入れる

インテリジェーマーク>>Preferences>>Plugins
or
cmd+,
Pluginsタブ選択

<img width="996" alt="スクリーンショット 2018-06-16 14.39.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/e408a052-e384-4c49-71be-29db49454aab.png">

Install JetBrains plugi...をクリック
Vue.js検索してインストール

<img width="1148" alt="スクリーンショット 2018-06-16 14.40.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/5df05b2c-890a-0fa1-22e1-b188d1b02cda.png">


##vue-cli入れる

```
npm install --global vue-cli
```

##プロジェクト作る

File>>New>>Project

<b>※IDEは全般的にインクリメント検索が効くのでStaticと入力しても移動できる。</b>
Static WebにVue.jsが現れてるのでネクストボタン。


<img width="803" alt="スクリーンショット 2018-06-16 14.41.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/7da91388-eff9-595a-0d9d-12eb6057f677.png">

名前つけて場所指定してネクスト。

初めはあまり気にせず、どんどんネクストすれば作れる。
ちなみにvue-cliが入ってないと、Project Create中に動かなくなります。
なんの警告も出ず作れずキャンセルボタンしか押せないので注意。
「IntelliJ IDEAでVue.jsを動かす」とか「IntelliJ IDEAでVue.jsが動かない」とか英語で調べたり色々やってしまった。

<img width="841" alt="スクリーンショット 2018-06-16 14.42.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/5e510a58-d3e6-a190-5897-5a87d6aa6bdd.png">

普通はサクッと作れます。あとインテリジェー全体的に初めにインデックスを作るそうで、プロジェクト作成直後重いです。我慢です。

<img width="956" alt="スクリーンショット 2018-06-16 18.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/00facb8a-5c00-45a0-b938-b77ae1403896.png">



#実行する

動いた感が早く欲しいので動かします。

Run>>Run

をクリック
Edit Configurations...をクリックし

<img width="368" alt="スクリーンショット 2018-06-16 17.36.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/dc44ed61-2940-0e65-67ea-2eef97feccfe.png">

npmを選択しstartにする

<img width="1095" alt="スクリーンショット 2018-06-16 17.36.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/89dee5d3-28ec-1c7f-7f7d-b344757ecc4f.png">

左上のプラスボタンで追加する

<img width="252" alt="スクリーンショット 2018-06-16 17.38.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/4e741856-ea9e-0cf3-dbd9-ef8ef1acafd0.png">

Runする

<img width="1070" alt="スクリーンショット 2018-06-16 17.39.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/6a41559e-a9ef-b47f-3986-abfd287bf170.png">

なんか動き出し、localhost:8080 なんたらって出てくるので、押せば動いてる。でけた。

<img width="762" alt="スクリーンショット 2018-06-16 17.39.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/1604cbe3-8128-1be2-c75a-1745516ab79c.png">


これで色々遊べそう。せっかく学んだインテリジェー機能を復習していきた。
Vueもやっていきたい。



# 参考

https://pleiades.io/help/idea/vue-js.html
https://qiita.com/nirasan/items/7499a2c7fe9d7e834207
https://qiita.com/miyamotok0105/private/5dcbd69a288526bb5580
全角必須入力フォームを撲滅するためにmojimojiというgemを作った



## 概要
mojimojiというgemを作った。RubyのStringクラスを拡張するgemである。

https://github.com/mikaji/mojimoji
https://rubygems.org/gems/mojimoji

## 背景

よく日本のWebサービスの入力フォーム内で、全角入力のみを強いられることがある。例えば住所の入力などに多い。
しかしユーザにそのような強制をさせるのはサービス開発者としてダサいし、サービス側の都合なんだからサービス側で対応すべきである。

## 目的

ユーザがストレスなく入力できるようにしたい。そして入力の不備があることでコンバージョンが下がることを防ぐ。

というわけで、半角→全角に自動的にコンバートするメソッド拡張を提供するmojimojiというgemを作った。

## mojimojiの特徴

https://github.com/mikaji/mojimoji のREADMEを読んでくれ。
簡単にいうと、

```rb
using Mojimoji

> string = 'HOGE'
=> "HOGE"

> string.to_em
=> "ＨＯＧＥ"

```

のように半角を全角に変換する。このようなgemはほかにもあって、
https://github.com/gimite/moji
が有名だ。このgemは素晴らしく、私の作ったmojimojiも裏側はほとんどmojiを呼んでいる。つまりString用に使いやすくしたラッパーみたいなものだ。つまり、例えば半角→全角をmojiのまま使う場合、

```rb
> Moji.han_to_zen("Ruby")   
```

のように独自のMojiクラスのメソッドを使う必要がある。そこでStringクラスを拡張することで

```rb

> string.to_em
=> "ＨＯＧＥ"

```

のように呼び出すことができる。

あと地味に空白を除いてくれる `String#strip_all_spaces` というメソッドも用意した。ぜひ使ってみてほしい。

## 仕様

またmojiからの拡張として、バッククオートの変換規則を変更した。

mojiの場合、

```rb
> Moji.han_to_zen("`")
=> "‘"
```

となる。規則上は正確だが、mojimojiではイメージしやすいように

```rb
> "`".to_em
=> "｀"
```

にしている。ただこれは規則とは異なる変更なので、オプション引数で切り替えても良いかなと思っている。

また大きいポイントとして、refinementsを使用している。
理由としては、RubyのコアクラスであるStringクラスを拡張するのは危険だと思っていて、たとえ便利なメソッドだとしてもその影響範囲が使うところだけに限定したいからだ。したがって、利用する場合は毎回

```rb
using Mojimoji
```

を呼ぶ必要がある。気をつけてくれ。

## 最後に

全角→半角の変換機能がなかったりまだまだメソッドが足りなかったり、mojiに依存しているので、mojimoji単独で動くようにしていきたい。issue, PRも待っているので、その気がある人はぜひ送ってくれ。

最後に、mojimojiによって日本中の全角必須入力フォームを駆逐していくことが、このgemの達成する未来である。
私はその未来に向けて、開発を続けていく。
Mac+iTerm2 から byobu で vertical split(^F2) する

# 1. Macのショートカットを解除(必要ないかも)
System Preferences
-> Keyboard
-> Shortcuts
-> Keyboard
-> `Move focus to the menu bar` のチェックを外す

# 2. iTermから^F2をエスケープして送るように設定する
iTermのPreferences
-> Profiles
-> Keys
-> +
-> click to set のところで ^F2(Ctrl+F2)を入力
-> action を `Send Escape Sequence` に設定
-> テキストボックスに `[1;5Q` を入力してOKを押す

他のキーも同じ要領でいけるはず
今回の場合は，
- 5 => Ctrl
- Q => 2
です
JDLA Deep Learning for GENERAL 2018 #1 を受けてみた

#**JDLA Deep Learning for GENERAL（G検定）とは？**
日本ディープラーニング協会が実施している検定試験。
ディープラーニングの事業活用する人材（ジェネラリスト）を育成することを狙いとしている。
第一回は2017年12月に実施。申込者数1500名。うち、受験者数1448名、合格者数823名で6割弱の合格率。

http://www.jdla.org/business/certificate/#education

#**受験動機**
会社で先進ITの活用検討するチームに入ったため、AI Academy等の講習会に自主参加するようになった。
より体系的な知識を得たいと思っていたため、学習の習慣化には資格試験というわかりやすい目標があるとよいと思った。
エンジニア向けのE資格を受講したかったが、受験者に条件があるため、まずは手軽に受験できるこちらを選択しました。

#**試験準備**
- 事前知識レベル
    - 「ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装」の講習会受講
    - 「自然言語処理の基礎」をざっと一読
    - Udemyの画像認識・自然言語処理の講座をいくつか受講・実装

初学者よりは多少触っているが、「〇〇について説明して」と言われても多分説明できないくらいの知識レベル。
まだまだ自分の中で消化しきれていない感じ。

- 勉強方法

    - 参考書籍
        1. 「人工知能は人間を超えるか ディープラーニングの先にあるもの」
            - 一周した。初学者は全体像把握のためにまずはコレから手をつけるとよいと思います。
        2. 「AI白書　2017」
            - 1，2章をサラッと読んだ。読み物としてとても面白い。
            - かなりボリュームがあり、熟読するのは難しいので、さらっと全体に触れる感じでいいと思いました。
        3. 「深層学習 機械学習プロフェッショナルシリーズ」
            - ガッツリ数式がでてくる。全部理解するのは大変そうだが、よくまとまって書籍。
        4. 「これならわかる深層学習入門」
            - 3と同じく数式がでてくるが、2017年10月刊行なので比較的新しい内容もカバーしていた。
    - 動画教材　
        - Coursera 「Machine Learning」
            - 第一回G検定受験者がおすすめしていた。
            - AI・機械学習界隈で有名な講座で、説明がわかりやすい。
            - 音声は英語だが日本語字幕もある。

受験日（2018年6月16日）の一か月ちょっと前くらいから、毎日朝と夜に30分～1時間程度を学習時間にあてた。
が、色々欲張りすぎたため、全体的に中途半端な進捗になってしまった・・・

#**試験内容**

- 人工知能の歴史（第1次～第3次ブーム,フレーム問題,シンボルグラウンディング問題など）
- 人工知能に関する著名人の見解（シンギュラリティ）
- 機械学習（教師あり,教師なし,半教師あり,クラスタリング,決定木,SVM,ニューラルネットワークなど）
- 画像認識（物体検出,セマンティックセグメンテーションなど）
- 自然言語処理（形態素解析,構文解析,照応解析,談話構造解析など）
- 音声認識（音響特徴量,音素など）
- ディープラーニング（CNN,R-CNN,RNN,LTSM,Seq2Seq,DQN,GANなど）
- 学習方法（過学習,学習率,交差検証,正規化,ドロップアウト,ミニバッチ学習など）
- フレームワーク（Tensorflow,Keras,Chainer,Pytouch）
- IoT（エッジコンピューティング）
- 自動運転（開発状況,レベル,規制）
- 人工知能と法

ざっと思い出せるものを列挙してみました。
推薦図書3冊のみではおそらく出題内容全部はカバーできなかったと思います。
事業活用者向けの試験なので、数式やプログラミングに関わる問題はほぼなかったです。

#**所感**
自信をもって回答できたと思えるのは半分程度なので、多分落ちたかな・・・
合格自体は主目的ではないので、そこまで気にしませんが。
合格を真剣に狙うならば他の資格試験同様に、

- インプットばかりでなくアウトプットする
- 推薦図書を複数周回する
- 教材を絞る

などが必要だったかなー、と思います。

「AIを活用するうえで最低限わかっておいてほしいこと」をまとめた試験という印象でした。
会社でIT戦略や企画を担当している方にオススメしたい試験だと思います。

勉強はしましたが、まだまだ人に説明できるだけの知識は身についていないし、やはり知識と実際の実装は異なるため、
今後はE検定の受験を目指してコード書いて何かしら作ることを習慣化していきたいところです。

# 2018-09-01 追記
追記し忘れてましたが、合格しました。
マークダウンでブログ書きたかったのでBloggerにStackEdit導入してみた

#QiitaでMarkDownが書きやすかったのでBloggerに導入してみた
Qiitaでちょこちょことまとめていたら、自分用に情報集約ツールが欲しくなった
MarkDown書きやすい、やりやすい、編集しやすいから、MarkDownができるツールがいい
少し調べたら出てきたもの　

・Qiita（今書いてるサイトね、IT系のみならこれだけでいい気がしてくる）
・[MarkDownでドキュメントをまとめられるMkDocs](https://www.mkdocs.org/) 
**・BloggerでStackEdit導入してMarkDownで書く**(今回はここ)
・[Githubでテキスト管理できるGaaTS](https://qiita.com/sta/items/e85dc381774acc9ac3c2)

メモ
<details><summary>Qiita(キータ)は、プログラマのための技術情報共有サービスです。</summary>
プログラミングに関することをどんどん投稿して、知識を記録、共有しましょう。
Qiitaに投稿すると、自分のコードやノウハウを見やすい形で残すことができます。
技術情報はテキストファイルへのメモではなく、タグを付けた文章、
シンタックスハイライトされたコードで保存することで初めて再利用可能な知識になる、そうQiitaでは考えています。
***プログラマの為以外のものもまとめたいのよね***
</details>

<details><summary>チーム作業ではMkDocsとBoxdriveでドキュメント管理すれば楽になる？</summary>
MkDocsはMarkdownでドキュメントを書くためだけのツール
それに加えて、Excelとか既存のドキュメントやテキスト資料がある場合はBoxdriveを使用すれば
同時編集、リアルタイム共有、コメント付与ができて捗るらしい？
BoxdriveとBoxsyncではできることが違うので注意
***なんか導入めんどいな***

</details>

##BloggerにStackEditを導入する
まずはgoogleの自分のアカウントから、googleドライブのアプリを起動
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/df5ac85b-c2b7-05b8-0035-e3aab8a54e17.png)
##googleドライブのページで左の新規アイコンをクリックする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/f7b0d465-eeaf-4295-2fb2-a25f8b677cbf.png)
##アプリを追加を押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/e95e839a-f805-bdeb-db3b-349caba69fa4.png)
##StackEditを探してインストールするだけで終了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/bbe3f632-7df7-34a5-6e26-0227165e3cdd.png)


#StackEditを使ってみる
googleドライブの新規→その他にStackEditがあるのでクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/3c0f76fc-87bb-0d38-b6d4-34a75a2c5c0f.png)
サイトに飛んですぐに使用可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/4530d730-a547-d99a-e24e-92e46860e894.png)

##Bloggerにアップロード
右上のアイコンをクリックするとサイドバーば開くので
***Publish***をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/32ca92f1-f70a-ae20-0677-a6e73743b243.png)
自分のブログアドレレスを入力してOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/af9914ae-2aad-fc0f-bef1-47208430485c.png)
記事が投稿される

このタグを入れると下書き設定でアップできるよーみたいな情報があったけど、
今は別の方法みたいで失敗しました。
とりあえず公開ができるのでいいかなって、
一時保存も、googledrive内にされるので問題ないかと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/128358/676f120e-49c5-9900-623e-fbd61fad49a6.png)


#StackEditのHP
詳しい使い方やアップデートが知りたくなった時に
[StackEdit](https://benweet.github.io/stackedit.js/)
##1分で導入できるのでおすすめ！
単純に自分が使いたかったので、導入までまとめてみました　
５ドルで開発者を支援できる為、気に入ったら支援して下さい。
Linuxで使えるキーロガーをPythonで作ってみた

##はじめに
エディタよりもターミナルを触る時間のほうが長い今日この頃。
「ターミナル上での操作を記録させたいな…」と思い、作ってみた。

##キーロガーって?
キーボードの入力を記録してくれるシステム。
悪用されることがほとんどだけど、個人的に使うくらいなら便利になるのでは?
ただ、すべての入力が記録されるため、セキュリティに気をつけたり、パスワードの入力を避けるたりする必要がある。

##前準備
まずは`Python`があるか確認

```
Python --version

Python3 --version
```

次に、`pip`の確認

- `pip`とは:pythonのモジュールがあるパッケージを簡単にインストールできるコマンド

```
pip -V
```

なければインストール(下記はUbuntuでの操作)

```
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py
```

最後に、今回使うパッケージの`pyxhook`をインストール

```
sudo pip install pyxhook
```

##作ってみた
###参考サイト
参考にさせてもらったのは、以下のサイトたち。

- http://whitelily6u6.hateblo.jp/entry/2018/01/14/233327
- Github:(https://github.com/JeffHoogland/pyxhook)
- ASCIIコード:(http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)

それぞれの役割を少し説明

- http://whitelily6u6.hateblo.jp/entry/2018/01/14/233327  
今回作成するファイルのコードは、ほとんどここから。  
「どういう風に動くのか」を説明してくれる動画があるため、作る前に確認しておくことをオススメ。
- Github:(https://github.com/JeffHoogland/pyxhook)
`pyxhook`モジュールを用いたキーロガー作成の公式(?)情報が乗っている。　　
- ASCIIコード:(http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)  
今回のキーロガーでは記録を止めるのにASCIIコードを使う。  
どのコードで止めるか決めるためにも読んでおこう

###コード

```Key_log_en.py
import pyxhook
# install module

log_file = 'user/log.txt'
# setting log file

def kbevent(event):
# runninf function when pressed anything keys on keybord

    log = open(log_file,'a')
    log.write(event.Key)
    # output log_file(/home/kaitaku/today_log.txt)

    if event.Ascii == 94:
        log.close()
        hookman.cancel()
    #if input ^, stop run
    #customise number 

hookman = pyxhook.HookManager()
# def HookManager
hookman.KeyDown = kbevent
# if input keys on keybord,runnning `kbevent` function
hookman.HookKeyboard()
# setting HookKeyboard
hookman.start()
# start Hookmanager
```

```Key_log_jp.py
import pyxhook
#使用するモジュールの指定

log_file = 'user/log.txt'
#記録するファイルの設定

def kbevent(event):
#関数の定義

    log = open(log_file,'a')
    log.write(event.Key)
    #ログファイルに記録

    if event.Ascii == 94:
        log.close()
        hookman.cancel()
    #^が入力されたら終了
    #なにで終了させるかは数字の部分を変えれば個人で設定できる

hookman = pyxhook.HookManager()
#HookManagerの定義
hookman.KeyDown = kbevent
#キーボード入力時、kbeventを起動
hookman.HookKeyboard()
#HokKeyboardの設定
hookman.start()
#Hookmanagerの開始
```
###使い方  
ターミナルで

```
python Key_log.py
(やめるときは^)
```


##今後の課題
現状はキーボードの入力をそのまま反映するだけ。
`Ctrl_L`や`space`、方向キーがそのまま反映される。
可能であれば、変換したら日本語が入力できるようにしたいなぁ。
そうすればターミナル上以外にも使いみちができるし。
少しずつ進めていくか。
Access VBA：Excelファイル をインポートする

#処理概要
Excelファイルを Accessのテーブルにインポートする処理についてです。

VBAで作成するには、次のような手順になります。

- ExcelファイルをAccessのテーブルに変換する。
- 変換したテーブルを既存のテーブルに追加する。

##マニュアル操作で行うと
ExcelのファイルをAccessにインポートするには、次のような操作で、インポートすることができます。

［新しいデータソース］－［ファイルから］－［Excel］を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/18b4813f-035f-61fe-f3ed-625bae2a94ea.png)

画面に従って、［次へ］を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/1d22b5e7-7b3e-7064-f068-00bfbb3a80a1.png)

##プログラムコードで書くと
インポートする処理をプログラムコードで書くと、次のような1行で書くことができます。
sample.xlsx を テーブル T_ExcelImport に変換する処理です。

```VisualBasic
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "T_ExcelImport", "c:\sample.xlsx", True
```

## サンプルファイル ダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/f11811a2-bc02-4b14-2933-03259cf3f1c9.png)

サンプルファイルは、下記の OneDrive からダウンロードできます。

【エクセルインポート】
https://1drv.ms/u/s!AiwZpyuHUgQBj7YoW1x_c1H_yELVIA?e=luFsf6

【サンプルファイル一覧】
https://1drv.ms/u/s!AiwZpyuHUgQBj7Yj0iyQ2-RXKtPUtg?e=4D2gyf

##読込用の画面を作成
しかし、実際にシステム化するには、次のような手順が必要になります。

1.インポートするExcelファイルを指定する。
2.テーブル［T_ExcelImport］が、存在する場合は、削除する。
3.管理しているテーブルに、項目を照合してSQL文を作成する。
4.Excelファイルをインポートする。

Access で、読込用の画面を作ると、下図のようになります。

1.項目名が、一致すると［（読込）Excel項目名］に表示されます。
2.一致しない項目名は、［（読込まない）Excl項目名］に表示されていますので、リストから選択してください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93227/c257d163-656c-8141-aa3d-281ccd21b30d.png)


#AccessとExcelを連携したシステムを公開しています
データベースをAzure SQL にセットして、AccessやExcelのプログラムから データベースを遠隔地間で共有するシステムを公開しています。

[<img src="https://qiita-image-store.s3.amazonaws.com/0/93227/1e640f8b-edfd-2b4e-aafe-ce96a835dd7b.png" width=70%>](http://access-cloud.hatenablog.com/entry/database)
http://access-cloud.hatenablog.com/entry/database
超便利！PDF用プレゼンツール pdfpc

こんにちは。Fukinoです。
世の中にはgoogle slideとかMicrosoftのOffice Presentationとか優秀なプレゼン作成ソフトがありますが、理系技術者がプレゼンを作るときにぶち当たる壁、それは...
**数式　( ・ω・)ﾄﾞｰﾝ**　
数式いっぱい、それも複雑なのをプレゼンに入れたいときはどうしてもTexを使いたい！そしてTexなんかで作ったプレゼンはPDFファイル。
**PDFファイルでプレゼンするときもタイマーとかスピーカーノートとか、
発表者ツールが欲しい...(´；ω；｀)**
そんなときに便利なのがこのpdfpcというソフトです。

#　前置き

pdfpcはここに置いてあります。OSSです。
https://github.com/pdfpc/pdfpc

筆者はMacを使っておりましてMacに入れたかったでんすが...
`apt-get`でいれようとして`apt-get`をMacで使うために
finkを入れようとして失敗しました。(´・ω・|||)

多分頑張れば入れられると思うんですけど外部画面に繋いだ時とかの不具合報告もあるしどれくらい良いソフトかわからないしということでとりあえずVirtual boxの上のUbuntuに入れてみました←
（Ubuntuはapt-get標準装備なので。）

# インストールの仕方（apt-get使える状況で、他は公式参照）

追記:　brewにもありました　→　[pdfpcのmacへのインストールはbrewで出来た](https://qiita.com/fukino/items/143194c1e3ce7ebc8ba6)

コマンドラインで
`sudo apt-get install pdf-presenter-console`
といれる。
これだけです。数秒でインストールは終わりです。

# 基本の使い方
## 起動
コマンドラインで立ち上げます。
`pdfpc` の後にプレゼンしたいpdfファイル名を入れます。
こんな感じ。
`pdfpc pdfpc-demo.pdf`

（pdfpc-demo.pdfファイルpdfpc作成サイトからお借りしました。)

立ち上げるとこんな感じ。

<img width="1260" alt="スクリーンショット 2018-06-16 16.54.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/245054/5cbe756e-e830-50e4-303b-66efd6a92fd1.png">

タイマーとか次のスライドとかも表示されて良い感じですね！

## 操作方法

矢印キーで動かせます。
~~（感覚的にあちこち押してれば動かせます。）~~
終了するときはescキー。

## スピーカーノート
んん..あれスピーカーノートはどこに...
と思って調べていると、どうやらnキーを押すと。プレゼン画面から直接ノートの編集ができるようです。編集し終わったらescキーです。こんな感じです。

<img width="1260" alt="スクリーンショット 2018-06-16 16.55.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/245054/9e1da22e-0423-b3ec-fa8a-87ff87d9b42c.png">

他にもbeamerのnoteタグとかにもちゃんと対応してるっぽいです。

詳しいキー操作、ノートの編集についてはこのページが良さそうです。
https://pdfpc.github.io/manpage.pdfpc.1.html

# まとめと感想
というわけでPDF用プレゼンツールpdfpcの紹介でした。
~~思った通り良さげなので願わくばMacに入れたい...
ソースコード持ってきてコンパイルした方が早いのか...~~
追記: brewでmacに入れられました笑　→[pdfpcのmacへのインストールはbrewで出来た](https://qiita.com/fukino/items/143194c1e3ce7ebc8ba6)
でも良く考えたらInkscapeをmacに入れたときも手こずったので
もうLinux系ソフトは割り切って仮想マシン上で使うというのも一手かもですね。
ただその場合外部画面に繋いだときに画面の割り当てがどうなるのか不安ですが...
もうちょっと使ってみて何かわかったら書こうと思います。ではでは。
Navigation Controllerを間に挟んだ遷移

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118756/49aceea9-5ea5-f286-7483-ac5de247fca9.png)
FirstView→NavigationController→SecondView
のように遷移したい


#同じストーリーボードでセグエは使わない方法
 FirstView→NavigationController→SecondView
 
```swift:sample.swift
 func test() {
    let storyboard = UIStoryboard(name: "view1", bundle: NSBundle.mainBundle())
    let naviView = storyboard.instantiateViewControllerWithIdentifier("Second") as! UINavigationController
    let view = naviView.topViewController as! SecondView
    view.hogehoge = "ほげほげ"
    self.navigationController?.pushViewController(view, animated: true)
}
```

#セグエを使う場合
FirstVCからpresent modallyでの遷移をつくる
その後、SecondVCにEmbed inでnavigation controllerを入れ込めばよい
Electronのwebviewの`new-window`イベントで取得できるurlが`about:blank`になってしまう

https://electronjs.org/docs/api/webview-tag#event-new-window

webviewの`new-window` イベントを使って別ウインドウへのリンクをブラウザに飛ばす。
というやつをやりたかったのだが、callbackで得られるurlが `about:blank` になってしまって開く先のURLがわからないという問題に遭遇した。

https://github.com/electron/electron/issues/1458
このissueっぽいが治ってない?
issueの一番新しいコメントで言われている方法で解決してみたメモ。


``` html
<body onload="onLoad()">
  <webview src="https://paper.dropbox.com/"></webview>
</body>
```

``` js
let clientX, clientY
function onLoad() {
  const {shell} = require('electron')
  const webview = document.querySelector('webview')
  window.addEventListener('mousedown', e => {
    // mousedownイベント時に座標を保存しておく
    clientX = e.clientX;
    clientY = e.clientY;
  })
  webview.addEventListener('dom-ready', () => {
    webview.addEventListener('new-window', (e) => {
      e.preventDefault();
      const bbox = webview.getBoundingClientRect();
      const guestPageX = clientX - bbox.left;
      const guestPageY = clientY - bbox.top;
      // 座標からaタグを取得し、そこからhrefを取得する
      const script = 'document.elementFromPoint('+guestPageX+','+guestPageY+')["href"]'
      webview.executeJavaScript(
        "document.elementFromPoint(".concat(guestPageX, ",", guestPageY, ")['href']"),
        false,
        (realURL) => {
          shell.openExternal(realURL);
        }
      );
    })
  })
}
</script>
```
Flutterにおけるアプリアイコンの変更

# Flutterにおけるアプリアイコンの変更方法
https://pub.dartlang.org/packages/flutter_launcher_icons
このライブラリを使うとぱぱっと変更できます。

```pubspec.yml
dev_dependencies: 
  flutter_test:
    sdk: flutter
    
  flutter_launcher_icons: any
```
とりあえずFlutterプロジェクトのpubspec.ymlにflutter_launcher_iconsを追加します。
```$ flutter packages get```

それから、同じくpubspec.ymlにアイコンのパスと、それぞれのOSでアプリアイコン指定のものに変更するかを定義します。

```pubspec.yml
flutter_icons:
  android: true 
  ios: true
  image_path: "assets/icon/icon.png"
```
アイコンを作り、指定したパスに配置し、最後の仕上げで以下のコマンドでアプリアイコンを生成します。
```$ flutter pub pub run flutter_launcher_icons:main```

## まとめ
めっちゃ楽
JDLA Deep Learning for GENERALを受検してきました

# はじめに

6/16(土)に行われた[JDLA Deep Learning for GENERAL 2018 #1](http://www.jdla.org/business/certificate/)を受けました。

まだ始まったばかりで、今回が2回目の開催で情報が少ないため、受検を考えている人の参考になればと思い、受験記を残します。

# 前提

一応、仕事はデータサイエンティストみたいな人。そのため、ある程度データサイエンス系の素養は持っているつもり。
ただ、業務でそこまでディープなラーニングはしてなくて、関連知識は学生時代にちょこっと齧っていた程度。
トピック的にそういった情報を収集してはいながらも、最先端の技術に流石に追いつけなくなってきたと感じてきたので、今回の受検へ至りました。

# 試験内容

[公式シラバス](http://www.jdla.org/business/certificate/)より抜粋すると

> - 人工知能（AI）とは（人工知能の定義）
> - 人工知能をめぐる動向例題
>  - 探索・推論、知識表現、機械学習、深層学習
> -人工知能分野の問題例題
>  - トイプロブレム、フレーム問題、弱いAI、強いAI、身体性、シンボルグラウンディング問題、特徴量設計、チューリングテスト、シンギュラリティ
> - 機械学習の具体的手法
>  - 代表的な手法、データの扱い、応用
> - ディープラーニングの概要
>  - ニューラルネットワークとディープラーニング、既存のニューラルネットワークにおける問題、ディープラーニングのアプローチ、CPU と GPU
>  - ディープラーニングにおけるデータ量
> - ディープラーニングの手法
>  - 活性化関数、学習率の最適化、更なるテクニック、CNN、RNN
>  - 深層強化学習、深層生成モデル
> - ディープラーニングの研究分野
>  - 画像認識、自然言語処理、音声処理、ロボティクス （強化学習）、マルチモーダル
> - ディープラーニングの応用に向けて
>  - 産業への応用、法律、倫理、現行の議論

確認していただいて分かる通り、ディープラーニングだけでなくAI絡みの内容も多く含んでいます。
JDLAの目的が「ディープラーニングを中心とする技術による日本の産業競争力の向上」なので、理論的なところだけでなく、応用に必要な知識も含んでいます。

## 今回の試験を受けてみて

120分で228問。結構多いです。

オンラインテストの機能として、問題ごとにチェックを入れる機能があります。
わたしの場合、分からないor見直したい問題にはチェックを入れて、1巡手早く解きましたが、チェックした問題に関して確認はしきれませんでした。


問題に関して、ざっくりと整理すると、

1. AIに関する基本教養
2. 機械学習の知識(ディープラーニング含)
3. 応用について(クラウド、GPU、ビジネスや法関連)

としたうち、今回の試験では35%:50%:15%くらいの印象でした。

# 勉強した内容

基本的には書籍を使いながら、書籍ではよく分からない概念等をネット上で調べて勉強しました。

## 参考図書

### 人工知能は人間を超えるか ディープラーニングの先にあるもの

簡単ですぐ読めるので、まずはここから。
しかし、AI周りの基礎知識は身につきます。

### 深層学習 機械学習プロフェッショナルシリーズ

ディープラーニングの基本知識はこちらで。
数式は結構エグいので、一部読み飛ばしていった。

### ＡＩ白書　２０１７

技術動向や政策動向などはこちら。
内容はそれなりに面白いけど、大分量が多いので心が折れそうになる。

法律、政策周りは確実に出るだろうと思って、どこに何がかいてあるのか把握できる程度に読み回した。
（間に合わなかったけど）

## その他の書籍

### 実践DeepLearning

ニューラルチューリングマシンや強化学習周りの勉強に。

### scikit-learnとTensorFlowによる実践機械学習

こちらも生成モデルや強化学習周りの勉強に。
それ以外のところはあまり読んでなかったけど、結構試験問題と被っていたので役立ちそう。
コードがばんばん出てくる実装よりの本で、やはり非エンジニアにはきついかもしれないけど・・・。

# 受検した感想

結構しんどかったです。
シラバスの内容+周辺領域をまんべんなく理解してないと、解けないような問題の幅広さでした。
一部、AI白書内の表現を引用した問題があり、試験の本質的にどうなんだと思うところはありましたが、全体的にはいい問題だと思いました。
オンライン受検だし、多少は調べることを前提にしているのか、結構エグい問題があったり、最新手法や政策動向なども出てきていたので、出題される問題に全て対応するのはかなり大変だと思います。

問題数が多く時間に余裕が無いので、自分の得意分野をいかに増やしてスピーディーに解答できるかが重要な気がします。
自分の場合は、機械学習や自然言語処理をそこそこやっていたので、そこで大分時間に余裕が取れたかなと思います。

結果については、それなりに解けたとは思いますが、見直ししきれなかったので不安です。

本来の目的のディープラーニングの勉強に関しては、基本的なところは細かく、周辺知識も色々身につけることが出来たのでいい機会でした。
最先端の研究内容を把握できるレベルに至ったかというと、流石に無理ですが、本屋の技術書に載っているようなレベルの話は大体分かるような感じに。

まずは今回の結果を見てからですが、E検定についても受けたいですね。しかし、流石に費用が・・・。悩みどころですね。

# 20180620追記

無事合格しました。
ハリボテにならないよう実務で使いたいですね。

# 他の方の受験期

- [ガチ素人が1ヶ月でディープラーニングのジェネラリストになった話](https://qiita.com/kemi/items/c8469e3ea8c02dd9fed2)
- [ディープラーニング検定 for GENRALを受けた。受験の勧めと、勉強法
](https://qiita.com/piyoSakai/items/9900324c8b0313b4fa36)
- [JDLAのG検定に合格できたのでまとめてみる](http://tech.mti.co.jp/entry/2018/01/04/174706)
CentOS6.9でpostfixを使ってGmail経由でメール送信する方法

# 内容

`Docker`で`CentOS6.9`のコンテナを起動し、
`postfix`で`Gmail`を経由してメール送信する方法を記載します。

`Docker`を実行する環境に関しては構築済みと言う前提です。

# 参考サイト

* https://qiita.com/hkato/items/e6e58abfc416d2820f4c

# 環境

|項目||
|---|---|
|OS|Windows10|
|Vagrant|2.0.1|
|VM|CentOS7|
|Docker|17.12.0-ce|

# 流れ

1. `Gmail`の設定
1. `Docker`で`CentOS6.9`のコンテナ起動
1. コンテナに`postfix`等をインストール
1. `/etc/postfix/main.cf`を設定
1. `/etc/postfix/sasl_passwd`を作成
1. `postfix`のサービスを起動
1. メール送信

# 1. `Gmail`の設定

以下のURLから「安全性の低いアプリ」を許可する
https://myaccount.google.com/lesssecureapps

# 2. `Docker`で`CentOS6.9`(以降コンテナ)のコンテナ起動

```bash
$ docker run --rm -it centos:6.9 bash
```

# 3. コンテナに`postfix`等をインストール

```bash
[centos6.9]# yum update -y
[centos6.9]# yum install -y postfix cyrus-sasl-plain mailx
```

# 4. `/etc/postfix/main.cf`を設定

```bash
[centos6.9]# vi /etc/postfix/main.cf
# 以下2点は変更
inet_interfaces = localhost
↓
inet_interfaces = all

inet_protocols = all
↓
inet_protocols = ipv4

# ファイル末尾に追記
relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
```

# 5. `/etc/postfix/sasl_passwd`を作成

* ファイル作成

```bash
[centos6.9]# vi /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 <Gmailのメールアドレス>:<Gmailのログインパスワード>
```

* DB化

```bash
[centos6.9]# chmod 600 /etc/postfix/sasl_passwd
[centos6.9]# postmap /etc/postfix/sasl_passwd
```

# 6. `postfix`のサービスを起動

```bash
[centos6.9]# service postfix start
```

# 7. メール送信

```bash
[centos6.9]# mail <送信先のメールアドレス>
Subject: <適当なタイトル>
<メール本文>
.
```
第2回G検定を受けてみた

# 1.本稿の目的

　2018/6/16(土)に実施されたG検定を受験した経験を踏まえ、今後の受験予定者のために以下を提示すること

* 今回の出題傾向
* 出題傾向を踏まえたおススメの学習スタンス

　おまけ的な位置付けで、気になる方もいらっしゃるでしょうというスタンスで以下もつらづらと

* 受験の目的
* 受けてみてどうだったか？

# 2.お断り

以下、本稿を参照される上でのお願い事項です。
1. 次回以降で出題傾向が変わる可能性もあります。あくまで参考情報としてください。
2. 個人的な意見を述べています。そんな風に考える人もいるんだなくらいにとらえてください。

# 3.出題傾向
### 3.1. 一番の特徴

一般的なディープラーニングの学習では頻出となる数式はほとんど出題されない。
※全200問超の中で、数問しかありませんでした。結果的に、以下さえ押さえれば問題なかったです。

* 簡単な行列の計算
* 簡単な二次関数の偏微分

### 3.2. で、どんな問題が出たの？

要約すると

* 人口知能の知識セグメントで使用される種々の用語の概念
* 人口知能を取り巻く社会的な現況に関する理解度

を問う問題がその太宗を占めていました。

少し細かく分類すると以下の通りです。

- 人口知能に関する歴史、キーパーソンに関する知識
- 機械学習の実装理論に関する知識
- 機械学習の社会活用状況に関する知識
- 人口知能に関する各国の取り組み・法整備状況に関する知識

基本的に文章の虫食い問題(選択式)なので、分類したそれぞれのセグメントにおいて、キーワードをしっかりとおさえることが重要と感じました。

### 3.3.推薦図書ってぶっちゃけどうだった？

以下が推薦図書だったわけですが

1. ＡＩ白書　２０１７
2. 人工知能は人間を超えるか ディープラーニングの先にあるもの
3. 深層学習

設問との関連度の高さがそのまま上記の並び順に表れてます。

1.は、読むのにかなり難儀しましたが、出題量が多かったです。ほとんどの設問が、本書をベースに出題された印象を受けました。

2.は、1.を読む前に読むことをお勧めします。1.を読むにあたり最低限必要な知識が本書によってインプットされます。1.を読む練習くらいにとらえるとよいかもしれません。

3.はほとんど出題されなかったといっても過言ではないかもしれません。

少しいいかえると、3.で述べられている各理論の概念的なところは押さえる必要がありますが、数式に関する知識はほぼ不要です。3.のほとんどの内容は数式に関することですから、紙面の量に対して(試験対策という観点で)得られる知識量は少なかったと言えます。

推薦図書ではカバーしきれていないのが

- 機械学習の実装理論に関する知識

に分類される知識です。シラバスに記載のすべてを1.で網羅しているわけではありません。気になったワードを基にQiitaなど、Webを利用して補完するとよいと思います。

# 4.出題傾向を踏まえたおススメの学習スタンス

若干前項の内容と重複しますが、以下の通りに学習されることをお勧めします。

1. 推薦図書を2.⇒1.の順番で読みましょう。2.はさらっと読めると思います。1.は滅茶苦茶重いです。一度に摂取しようとすると死んでしまうので、以降に記載の内容に行ったり来たりしながら読むと良いでしょう。
2. 推薦図書の3.は、概念的なところを理解するつもりで読みましょう。数式を理解する必要はありません。
3. 推薦図書の1.やシラバスに記載されている用語で、書籍だけでは分からない内容をピックアップしてWebから知識を習得しましょう。

　※ある程度体系立てた学習が必要と判断するのであれば別途書籍を購入してもよいかもしれません

◆参考
数式を交えた実践的な理論を学ぶという観点では、(各所で言われていますが)Courseraにて無料で開放されているStanfordUniversityのAndrewNg氏による講義「Machine Learning」がおすすめです。

日本語字幕がついているので、英語が読めなくても最低限の理解はできます。
※音声にしか字幕がついておらず、演習問題はすべて英語ですが

https://www.coursera.org/

本稿の主題については以上です。
以下おまけ。

# 5.受験の目的

ディープラーニングを利用した事業開発や事業提案に興味があったため、知識理解のマイルストンとするために受験しました。

# 6.受けてみてどうだったか
​
役立ったかどうかについて、2つの観点があります。

* 知識獲得に有意だったか
* 目的にとって有意だったか

まず、前者について。結論としては有意でした。

人工知能・機械学習に関する領域の知識は広く・浅くキャッチアップできたように感じます。ですが、詳細な理解にはまだ遠いと感じています。

実際、設問が選択式の虫食いだったからよかったものの、自由記述形式だったらほとんど絶望的に出来なかったと思います。(そもそも今回合格したかすらまだ分からないですが ※）
※2018/6/20 追記
 本日結果の通知があり「合格」でした。合格証の発行については6/30までに通知があるそうです。

続けて、後者。(当たり前かもしれませんが)まだ評価できないという結論です。

現時点ではまだ学習したのみで、ビジネスにおいて何か結果を出しているわけではありません。

どの資格試験もそうだと思いますが、重要なことは資格を取ることではなく、資格を取るために何をしてきて何を身に着けることができたかだと思います。

新しいことを始めようとしたときに、マイルストンとして資格取得を置くのは良いですが、資格取得をゴールにするべきではないでしょう。

今回学習したことを下地に、ビジネスとして何ができるかを考え行動していこうと思っています。

以上で本稿を終わります。
ここまでお読みいただきありがとうございました。
AWSアカウント間AZ間レイテンシ

って、ググっても意外にまとまった数値が出てない。

EC2からRDSへのレイテンシを知りたい。アベイラビリティゾーンを跨いだときと、AWSアカウントを跨いだとき、その組み合わせで、レイテンシがどのように変化するか知りたい。

# 手法

RDSはICMPを閉じているので、pingコマンドでは計測できません。

pingっぽく計測できいる **npingコマンド** を利用しました。EC2はAmazon Linux、nmapパッケージに含まれています。

```bash
$ sudo yum install nmap
```

このように実行すると、pingっぽく通信状況と、最後にサマリーが出てきます。

```bash
$ sudo nping -c 100 rds-sample.xxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p3306 --tcp
```


# 実験結果

EC2インスタンスから、4つのRDSに、npingでTCP3306で100回通信。レイテンシの最頻値をフキダシに記載しました。npingはmax/min/avgは出してくれますが、max/minのアホみたいな数値に引っ張られるので、google spreadsheetでペタペタゴニョゴニョして最頻値を計算しています。

おなじアベイラビリティゾーンなら **0.5ms**。AWSアカウントを跨いでも変わらず。
異なるアベイラビリティゾーンなら **2.6ms**。AWSアカウントを跨いでも変わらず。

<img width="785" alt="AWSアカウント間AZ間レイテンシ.png" src="https://qiita-image-store.s3.amazonaws.com/0/22947/fcb74b95-998a-7e15-0f1c-637fa6cd2662.png">

上の枠のAWSアカウントは、EC2 Classicネットワークで、EC2とRDSを設置しています。年代物ですね。EC2はm3.xlarge、RDSはdb.m3.medium。

下の枠のAWSアカウントは、VPCで、RDSを設置しています。比較的最近つくったAWSアカウントです。RDSはt2.small。パブリックアクセスをONにして、セキュリティグループで実験用EC2インスタンスからの接続を許可しています。

# 注記

書いたとおりの条件のもとで、このようなレイテンシに関する数値が得られました。細部の条件や構成が異なれば当然異なる数値が得られるでしょうから、これを鵜呑みにして「違うじゃねえかー」って電凸とかすんなし。
Syntax error: You're trying to assign to a parenthesized expression, eg. instead of `({a}) = 0` use `({a} = 0)

# Syntax error: You're trying to assign to a parenthesized expression, eg. instead of `({a}) = 0` use `({a} = 0)


#解決策
`const GeocodeResult = ({ props }) = (`

から

`const GeocodeResult = ({ props }) => (`

に直したら解決した
OSX High Sierra で gdb を使おうとしたらエラー

# 再現する環境と現象
OSX High Sierra。
gdb の version は 8.1

```bash
[Shumo:~/develop/ruby]$gdb -v
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin16.7.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
```

codesign の認証はしている
(詳しくは[こちらの記事](https://qiita.com/yuzu_afro/items/988020dd65fb4f43962a)などを参照のこと)

```bash
[Shumo:~/develop/ruby]$codesign -vv `which gdb`
/usr/local/bin/gdb: valid on disk
/usr/local/bin/gdb: satisfies its Designated Requirement
```

↓で落ちる

```bash
[Shumo:~/develop/ruby]$gdb ./ruby
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin16.7.0".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./ruby...Reading symbols from /Users/Shumo/develop/ruby/ruby.dSYM/Contents/Resources/DWARF/ruby...done.
done.
(gdb) run
Starting program: /Users/Shumo/develop/ruby/ruby
[New Thread 0x1103 of process 1997]
[New Thread 0x1403 of process 1997]
During startup program terminated with signal ?, Unknown signal.
```

# 原因と解決策

## その1
https://stackoverflow.com/questions/49001329/gdb-doesnt-work-on-macos-high-sierra-10-13-3
↑の通り、gdb 8.1 で起きる不具合のようだ。
以下で解消した。

```bash
$ brew unlink gdb
$ brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/9ec9fb27a33698fc7636afce5c1c16787e9ce3f3/Formula/gdb.rb
$ brew pin gdb
```

## その2
↓も実行する必要がある

```bash
$ echo "set startup-with-shell off" >> ~/.gdbinit
```
androidでkotlinの入門　リバーシー3

リバーシー(≒オセロ）のおまけ
前回、GitBuhに上げたコードには、一応　人対マシンのモードがありました

[オセロ（リバーシ）の作り方（アルゴリズム） ～石の位置による評価～](http://uguisu.skr.jp/othello/5-1.html)を参考
させていただき

```AUTO1.kt
class AUTO1( val ban : Array<Array<GAME_STATUS.MASU_STATUS>> )  {

    // マスの重みで判断する思考パターン
    private val weight = arrayOf<Array<Int>>(
            arrayOf<Int>(  30,-12,  0, -1, -1,  0,-12, 30 ),
            arrayOf<Int>( -12,-15, -3, -3, -3, -3,-15,-12 ),
            arrayOf<Int>(   0, -3,  0, -1, -1,  0, -3,  0 ),
            arrayOf<Int>(  -1, -3, -1, -1, -1, -1, -3, -1 ),
            arrayOf<Int>(  -1, -3, -1, -1, -1, -1, -3, -1 ),
            arrayOf<Int>(   0, -3,  0, -1, -1,  0, -3,  0 ),
            arrayOf<Int>( -12,-15, -3, -3, -3, -3,-15,-12 ),
            arrayOf<Int>(  30,-12,  0, -1, -1,  0,-12, 30 )
    )

    fun actSelect() : SELECT_MASU {
        var maxW = -100
        var slectAct : SELECT_MASU = SELECT_MASU(0,0,SELECT_MASU.IN_STATUS.PASS)
        for( x:Int in 0..7) {
            for(y:Int in 0..7) {
                if ( ban[x][y] == GAME_STATUS.MASU_STATUS.READY ) {
                    // 置けるマスの中で
                    if ( weight[x][y] > maxW ) {
                        // 最も「重み」のあるマスを取る
                        maxW = weight[x][y]
                        slectAct.x = x
                        slectAct.y = y
                        slectAct.InSw = SELECT_MASU.IN_STATUS.MASU_SELECT
                        println("->"+x.toString()+","+y.toString())
                    }
                }
            }
        }
        return slectAct
    }
}
```

として実装しています。
actSelect() で選択マス座標を返す

ここを強くすれば、強くなります
いつか、ここ育ててみようかなと思ってます。
AIとかに興味がでていたら、実験用にちょうどいいかなと。
（かなり遠い未来の話ですが）