OmniAICreator/Qiita-1.07M huggingface dataset:
ビットコインエクスプローラー(3)

# ビットコインエクスプローラー(3)

## シードを暗号化する方法


ウォレットのシードを暗号化する方法は、二つある。
キー暗号化は、既存のウォレットシードを暗号化する方法である。
ムネモニックは、一時的なシードからウォレットシードを受け付けるよう要求するものである。

#### キー暗号化を使う

256ビットのシードから、HDウォレットキーを作成する。

```
bx seed -b 256 | bx hd-new
```

```
[256 bit seed]
b765f475e80371a7c376cbb5407c5fb88d918df1fe9a4c26d9acf24bd4459f00

[HD key]
xprv9s21ZrQH143K4QKRy4RQ5739bERyyfqhPfaLuvoFkWcaPiRSuUaeesLThKeWnmuJZbjUy5bEAsHndFm1JKFAhaJuLSKAxQDDTt6FKiaE8cp
```

シードを暗号化する。(強いパスフレーズの入力)

```
bx ec-to-ek "coffeeandcode" b765f475e80371a7c376cbb5407c5fb88d918df1fe9a4c26d9acf24bd4459f00
```

```
6PYKSSJ9YccwqvwNwg4gzeAEkvUehvH4quaEEPvdeQhhYS8YttAs7nTHFx
```

HDキーが復活するか検証する。

```
bx ek-to-ec "my passphrase" 6PYKSSJ9YccwqvwNwg4gzeAEkvUehvH4quaEEPvdeQhhYS8YttAs7nTHFx | bx hd-new
```

```
xprv9s21ZrQH143K4QKRy4RQ5739bERyyfqhPfaLuvoFkWcaPiRSuUaeesLThKeWnmuJZbjUy5bEAsHndFm1JKFAhaJuLSKAxQDDTt6FKiaE8cp
```

暗号化された秘密鍵を保存し、パスフレーズを覚えておいてください。


#### ムネモニックを使う。

一時的なシードから、ムネモニックを作成する。

```
bx seed -b 128 | bx mnemonic-new
```

```
[256 bit seed]
b765f475e80371a7c376cbb5407c5fb88d918df1fe9a4c26d9acf24bd4459f00

[mnemonic]
resist cook buddy source damage stadium assist sunny relief advance blood illegal suit shoulder side spy equip cycle hen tonight run carpet lab asthma
```


ムネモニックコードから、HDキーを作成する。(強いパスフレーズの入力)

```
bx mnemonic-to-seed -p "coffeeandcode" resist cook buddy source damage stadium assist sunny relief advance blood illegal suit shoulder side spy equip cycle hen tonight run carpet lab asthma | bx hd-new
```

```
xprv9s21ZrQH143K2P39P5ZXFFXcvjAV8kjQY9idBKUSH4K77MbRat3qbsttMSA5gS9uUHw6xT3neogDdFXDHKxHzCwinKNqLpwEwPzigazPoQE
```

ムネモニックコードと、パスフレーズを覚えておいてください。
リストのすべての要素が特定の条件にマッチするか判定する

```python:qiita.py
lis=[2,4,40]
print(all(elem %2==0 for elem in lis))
#>>>True
print(all(elem //2<=3 for elem in lis))
#>>>False
```

... for ... in ... のような表記は、[] で囲んでリスト内包表記として使う他に、 [] で囲まずにジェネレータ式というものにして all の引数に直接渡す使い方もあるらしい。 all にはリスト内包表記よりもジェネレータ式を渡したほうが速い。
keras-rlとOpenAI Gymで強化学習（cartpoleサンプル）

# はじめに
 今回はkeras-rlとOpenAI Gymで強化学習を試します。まずはサンプルのcartpoleから。

# 参考にしたブログ、コードなど
　cartpoleサンプルについては、多くのブログ、githubを参考にさせていただきました。

http://cookie-box.hatenablog.com/entry/2017/01/15/235916
https://qiita.com/inoory/items/e63ade6f21766c7c2393
https://gym.openai.com/envs/CartPole-v0/
https://github.com/matthiasplappert/keras-rl/blob/master/examples/dqn_cartpole.py

# cartpole サンプル
　はまったところは一点だけ。h5pyが入っていないとエラーになる。

```
ImportError: `save_weights` requires h5py.
```

# トレーニング結果
　20000stepぐらいだと、まだ倒しまくるが、

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/keras?src=hash&amp;ref_src=twsrc%5Etfw">#keras</a>-rl と <a href="https://twitter.com/hashtag/opengym?src=hash&amp;ref_src=twsrc%5Etfw">#opengym</a> で強化学習。学習し始めはポールを倒しまくるwww   reinforcement learning by opengym, cartpole sample (20000steps) <a href="https://t.co/vlWvOnWcmD">https://t.co/vlWvOnWcmD</a> via <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a></p>&mdash; Kazutoshi Nakano (@kznx) <a href="https://twitter.com/kznx/status/962204034433146880?ref_src=twsrc%5Etfw">February 10, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


　50000step完了すると、ほぼ安定する。

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/keras?src=hash&amp;ref_src=twsrc%5Etfw">#keras</a>-rl と <a href="https://twitter.com/hashtag/opengym?src=hash&amp;ref_src=twsrc%5Etfw">#opengym</a> で強化学習。50000 step 完了すると、ほとんど倒さなくなる WWW    reinforcement learning by opengym, cartpole sample (50000 steps) <a href="https://t.co/dC0cCyI3Y1">https://t.co/dC0cCyI3Y1</a> via <a href="https://twitter.com/YouTube?ref_src=twsrc%5Etfw">@YouTube</a></p>&mdash; Kazutoshi Nakano (@kznx) <a href="https://twitter.com/kznx/status/962204719920721920?ref_src=twsrc%5Etfw">February 10, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 最後に
　まずはシンプルなcartpoleを試してみました。次は atari breakoutです。now on training. coming soon!
Visual Studio 2017 で最小限の Win32 アプリケーションを作る手順

投稿のテストを兼ねて……。
Visual Studio は既にインストールしたものとします。

# プロジェクトを作る

1. メニューから ファイル→新規作成→プロジェクト (Ctrl+Shift+N)
2. 「Visual C++」→「空のプロジェクト」を選び、名前や場所を適当に決める

# プロジェクトの設定をする

1. メニューから プロジェクト→プロパティ (Alt+F7)
2. 「構成」を「すべての構成」、「プラットフォーム」を「すべてのプラットフォーム」を選び、「文字セット」を「Unicode 文字セットを使用する」に変更する（図を参照）。OK を押してダイアログを閉じる。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/235904/c0b0f9b8-ad9e-9561-48aa-18ffc1d23984.png)

# ソースファイルを作成する

1. メニューから プロジェクト→新しい項目の追加 (Ctrl+Shift+A)
2. 「C++ ファイル (.cpp)」を選び、名前を適当に決める（とりあえず、 "main.cpp" とする）。OK を押してダイアログを閉じる。
3. エディタ画面に空の main.cpp が開かれるので、以下のコードを入力する。

```cpp:main.cpp
#include <windows.h>

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpCmdLine, int nCmdShow)
{
    MessageBoxW(NULL, L"やったね", L"タイトル", MB_OK | MB_ICONINFORMATION);
    return 0;
}
```

# ビルドと実行

1. メニューから ビルド→ソリューションのビルド (F7) を押すとビルドが開始される。問題なければ出力パネルに「1 正常終了」と表示される。
2. メニューから デバッグ→デバッグなしで開始 (Ctrl+F5) を押すと実行される。以下のようなメッセージボックスが出れば成功。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/235904/fac213e9-1879-abe3-94e6-2678aa7a1a37.png)


# 付録

Visual Studio のバージョンは、 Community 2017 Version 15.5.6 を使用しました。
Opencv PerspeciveTransformの罠

当方 Python3.5or3.6 そしてOpencvは3.1.0or3.2.0を用いています。
Python2系やOpencv2系は記法が違ったりするので注意。


Pythonを使って透視変換をする時，画像の変換には次の関数を使う。

```py3
dst= cv2.warpPerspective(src, Matrix, (rows,cols), flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, fillval=(0, 0, 0, 0))
```

##  点群の座標変換


一方で，点群の座標を変換する際には

```py3
cv2.perspectiveTransform(points,perspective)
```
のように記述する。点群の方が先にくるなんてなんか違和感がある。

さらに違和感があるのは記述法だ。次の例を見て欲しい。

```py3
import cv2
import numpy as np

a = np.array([[1, 2], [4, 5], [7, 8]], dtype='float32')
h = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32')

pointsOut = cv2.perspectiveTransform(a, h)
```

一見正しそうに見えるがこれは以下のようなエラーを起こす。

```
cv2.error: /build/buildd/opencv-2.3.1/modules/core/src/matmul.cpp:1916:
error: (-215) scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F)
in function perspectiveTransform
```

公式Docmentには入力は「two-channel or three-channel floating-point array, where each element is a 2D/3D vector」と書いてある。
各要素に2/3次元ベクトルが詰まった2/3チャネルのarrayということなのである。

ということで正解はこちら

```py3
import cv2
import numpy as np

a = np.array([[1, 2], [4, 5], [7, 8]], dtype='float32')
h = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype='float32')
a2 = np.array([a])

pointsOut = cv2.perspectiveTransform(a2, h)
```

違いはこうなる。

```py3
a=
array([[ 1.,  2.],
       [ 4.,  5.],
       [ 7.,  8.]], dtype=float32)

a2=
array([[[ 1.,  2.],
        [ 4.,  5.],
        [ 7.,  8.]]], dtype=float32)
```

なんとなくで公式documentを読んでいてもダメなのだ。
useradd コマンド

# useradd コマンド
ユーザの追加は、一般ユーザでは行えない。
管理者権限を持つアカウントで操作する。

任意のユーザ名でユーザを追加するコマンドは次の通り。

```
# useradd [オプション] username
```

```man
useradd [-c comment] [-d home_dir]
        [-e expire_date] [-f inactive_time]
        [-g initial_group] [-G group[,...]]
        [-m [-k skeleton_dir]] [-o] [-p passwd]
        [-s shell] [-u uid] login
```

## オプション
| オプション                      | 説明 |
|:--                             |:--|
|  -b, --base-dir BASE_DIR       |新アカウントのホームディクトリのベースディレクトリ|
|  -c, --comment COMMENT         |新アカウントの GECOS フィールド|
|  -d, --home-dir HOME_DIR       |新アカウントのホームディレクトリ|
|  -D, --defaults                |useradd のデフォルト設定を表示または変更|
|  -e, --expiredate EXPIRE_DATE  |新アカウントの期限切れ日付|
|  -f, --inactive INACTIVE       |新アカウントのパスワード無効化日数|
|  -g, --gid GROUP               |新アカウントの主グループの名前または ID|
|  -G, --groups GROUPS           |新アカウントの補助グループのリスト|
|  -h, --help                    |このヘルプを表示して終了する|
|  -k, --skel SKEL_DIR           |雛型ディレクトリに指定のものを使う|
|  -K, --key KEY=VALUE           |/etc/login.defs のデフォルトより優先される|
|  -l, --no-log-init             |ユーザを lastlog, faillog のデータベースに追加しない|
|  -m, --create-home             |ユーザのホームディレクトリを作成する|
|  -M, --no-create-home          |ユーザのホームディレクトリを作成しない|
|  -N, --no-user-group           |ユーザと同名のグループを作成しない|
|  -o, --non-unique              |UID が同じユーザの作成を許す|
|  -p, --password PASSWORD       |新アカウントの暗号化されたパスワード|
|  -r, --system                  |システムアカウントを作成します|
|  -R, --root CHROOT_DIR         |chroot するディレクトリ|
|  -s, --shell SHELL             |新アカウントのログインシェル|
|  -u, --iud UID                 |新アカウントのユーザ ID|
|  -U, --user-group              |ユーザと同じ名前のグループを作成する|
|  -Z, --selinux-user SEUSER     |SELinux のユーザマッピングに指定したSEUSER を使う|

## デフォルト値の変更
-D オプションを指定すると、 useradd は現在のデフォルト値を表示するか、
またはオプションで与えられた値に応じて、デフォルト値を変更する。使用可能なオプションは次の通り。

```
# useradd -D [オプション]
```

```man
useradd -D [-g default_group] [-b default_home]
           [-e default_expire_date] [-f default_inactive]
           [-s default_shell]
```

| オプション                      | 説明 |
|:--                             |:--|
| -b,  --base-dir                | デフォルトのホームディレクトリを指定|
| -e,  --expiredate              | デフォルトのアカウントが無効になる日数を指定|
| -f,  --inactive                | デフォルトのパスワードの仕様期限が切れてから使用不能になるまでの日数を指定|
| -g,  --gid                     | ユーザの初期グループを指定|
| -s,  --shell                   | ユーザのログインシェルを指定|
primary,secondaryの次は、、？

## 数(number)系の英語
- よくprimary,secondaryという用語をプログラム中で用いると思います。
- ただ、3番目、4番目をどのように書くのか知らない方も多いのではないでしょうか。
- というわけでまとめてみました。

|数|番目|序数|基数|
|:-:|:-:|:-:|:-:|
|1|primary|first|one|
|2|secondary|second|two|
|3|tertiary|third|three|
|4|quaternary|fourth|four|
|5|quinary|fifth|five|
|6|senary|sixth|six|
|7|septenary|seventh|seven|
|8|octonary|eighth|eight|
|9|novenary|ninth|nine|
|10|decenary|tenth|ten|

## 月(month)の英語
- 僕は英語が苦手です。
- 毎回「なんだっけ〜？」と調べます。
- 月に関しても同様です。
- なのでまとめました。

|月|英語|短縮|
|:-:|:-:|:-:|
|1月|January|Jan.|
|2月|February|Feb.|
|3月|March|Mar.|
|4月|April|Apr.|
|5月|May|May.|
|6月|June|Jun.|
|7月|July|Jul.|
|8月|August|Aug.|
|9月|September|Sep.|
|10月|October|Oct.|
|11月|November|Nov.|
|12月|December|Dec.|

## 曜日(days)の英語
- 曜日は数ではないですが、dateを使うとよく遭遇しますよね、、
- これもまとめちゃいます。

|曜日|英語|短縮|
|:-:|:-:|:-:|
|日曜日|Sunday|Sun.|
|月曜日|Monday|Mon.|
|火曜日|Tuesday|Tue.|
|水曜日|Wednesday|Wed.|
|木曜日|Thursday|Thu.|
|金曜日|Friday|Fri.|
|土曜日|Saturday|Sat.|

## 季節(seasons)の英語
- 流れで四季もまとめちゃいますｗ

|季節|英語|
|:-:|:-:|
|春|Spring|
|夏|Summer|
|秋|Fall/Autumn|
|冬|Winter|

以上、よく使う数字関連の英語でした。
VTKライブラリのビルド手順

# VTKライブラリのビルド手順

## ダウンロード

[Kitwareの公式サイト](https://www.vtk.org/download/)から最新版のVTKライブラリをダウンロードし解凍する。

```bash
cd $HOME/Downloads
wget https://www.vtk.org/files/release/8.1/VTK-8.1.0.tar.gz
tar -zxf VTK-8.1.0.tar.gz
```


## ビルド手順

ここでは管理者権限がないものとして、ユーザーのローカルフォルダでビルドする方法を示します。（大学のPCを使っている場合など）
ビルド方法は[ここ](https://www.vtk.org/Wiki/VTK/Configure_and_Build#Download_And_Install_CMake)を参考ししました。

### 各種変数の設定

#### ccmakeを使用

あらかじめ`cmake-curses-gui`パッケージをインストールしておきましょう。

```bash
cd VTK-8.1.0    # 解凍したディレクトリに移動
mkdir build     # ビルド用のディレクトリを作成
cd build
ccmake ..       # 親ディレクトリを指定(..)するのを忘れずに
```

1. 最初の空の画面が出てきたら`c`キーを押してconfigureを行います。
2. `CMAKE_INSTALL_PREFIX`を変更する。デフォルトは`/usr/local`ですが、私の場合は`$HOME/.local`としました。オプションの変更方法は下記の通り。
    - オプションの行に移動してEnterを押す。
    - 保存するディレクトリのパスを入力する。
    - Enterを押してそのオプションへの入力を終了する。
3. `c`キーを押して再度configureを行います。
4. `g`キーを押してビルド設定ファイルを作成する。
5. `q`キーを押して終了する。

#### cmakeを使用

インストール場所やビルドタイプの設定のみデフォルトから変更するだけならば、ccmakeは不要です。
下記のようにコマンドラインからconfigureすることができます。

```bash
cd VTK-8.1.0    # 解凍したディレクトリに移動
mkdir build     # ビルド用のディレクトリを作成
cd build
# デフォルトのビルドタイプはDebugとなっている
# ローカルフォルダにインストールする場合は-DCMAKE_INSTALL_PREFIXでパスを指定する
cmake -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_INSTALL_PREFIX:PATH=$HOME/.local ..
```

### ビルド

ここまでできたらあとは`build`ディレクトリ内でmakeするだけです。

```bash
make && make all install
```

VTKライブラリのコンパイルには結構時間がかかります。
ビットコインエクスプローラー(2)

# ビットコインエクスプローラー(2)

## 同意義コマンド

異なるコマンドのコンビネーションを使って、同じ目的を達成することができる。

#### ビットコインアドレスの生成

```
bx ec-new 9bb08de6bcc361df764c1edd9cc93059 | bx ec-to-public | bx bitcoin160 | bx address-encode
```

`address-encode`の代わりに、`base58check-encode`を利用し、同じアドレスをえることもできる。

```
bx ec-new 9bb08de6bcc361df764c1edd9cc93059 | bx ec-to-public | bx bitcoin160 | bx base58check-encode
```

`base58check-encode`の代わりに`wrap-encode`と`base58-encode`を使い同じアドレスを得ることもできる。

```
bx ec-new 9bb08de6bcc361df764c1edd9cc93059 | bx ec-to-public | bx bitcoin160 | bx wrap-encode | bx base58-encode
```

`bitcoin160`の代わりに、`sha256`と`ripemd160`を使い同じアドレスの得ることもできる。

```
bx ec-new 9bb08de6bcc361df764c1edd9cc93059 | bx ec-to-public | bx sha256 | bx ripemd160 | bx wrap-encode | bx base58-encode
```
Cordovaのチュートリアルをやってみる 第一回

# 使用したもの(環境)
 1. cordova
 1. visualStudioCode
 1. windows10
 1. Android
 

---

# チュートリアルを訳しながらやってみる
チュートリアルのページは下記。

[Apache Cordova Tutorial](http://ccoenraets.github.io/cordova-tutorial/create-cordova-project.html)

環境構築については別途まとめてあるので下記参照。

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)

---


# Module 1: Creating a Cordova Project
1～3までは環境構築で済んでいるので飛ばす。

4. Cordova CLIを使用して、Workshopと名付けたCordova projectをworkshopディレクトリの中に作ります。  
カレントディレクトリ内に作成されるので、cdコマンドなどで階層を移動しておくこと。  
また、yournameのところは好きに変えて良いです。

```console
cordova create workshop com.yourname.workshop Workshop
```

正常終了していれば  
Creating a new cordova project.  
と表示されます。


5. 作成したプロジェクトのディレクトリに移動します。
6. 
```console
cd workshop
```

6. iOSプラットフォームをサポート対象に加えます。(オプション)
7. Androidプラットフォームをサポート対象に加えます。(オプション)

```console
cordova platforms add android
```

本記事ではAndroidだけ追加します。  
念のため下記コマンドを実施してAndroidがnstalled platformsに含まれていることを確認しましょう。

```console  
cordova platforms ls
```

実行結果は下記のように出るはずです。

```console
Installed platforms:
  android 7.0.0
Available platforms:
  browser ~5.0.1
  ios ~4.5.4
  osx ~4.0.1
  windows ~5.0.0
  www ^3.12.0
```

8. 基本的なプラグインの追加を行います。  
チュートリアルにあるコマンドは古いようです。(下記を参照しました)  
[Error when adding cordova plugin](https://stackoverflow.com/questions/37052771/error-when-adding-cordova-plugin/37053130)

実際に実行したコマンドは下記になります。

```console
cordova plugin add cordova-plugin-device
cordova plugin add cordova-plugin-console
```

9. 生成されたものを確認しましょう！
下記はgoogle先生の翻訳そのまま。
 * wwwフォルダは、HTML / JavaScriptアプリケーションをコーディングする場所です。 ブラウザでindex.htmlファイルを開き、Cordova CLIで作成されたデフォルトアプリケーションを表示します。
 * プラットフォームフォルダは、Cordovaがさまざまなプラットフォーム（iOS、Androidなど）用にアプリケーションをビルドする場所です。 このフォルダの内容は、Cordova CLIによって自動的に生成されます。そのディレクトリ内のコードは決して編集しないでください。
 * プラグインはpluginsディレクトリにインストールされます。
アプリケーションパラメータ（名前、作成者など）はconfig.xmlに格納されます。

Androidを接続し、デバッグから実行。DEVICE IS READYと表示されることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/9a4459fc-0678-b03c-9f17-99a29f31e699.png)
---

# 参考URL


[Apache Cordova Tutorial](http://ccoenraets.github.io/cordova-tutorial/create-cordova-project.html)

[cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)

[Error when adding cordova plugin](https://stackoverflow.com/questions/37052771/error-when-adding-cordova-plugin/37053130)
ビットコインエクスプローラー(1)

# ビットコインエクスプローラー(1)

## ペイメントアドレスの構築


#### 0 - プライベートECDSAキーを用意する。

```
18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725
```

#### 1. ECDSAに対応する公開鍵を作成する。(65バイト：1バイト<0x04> + X軸32バイト + Y軸32バイト )
```
bx ec-to-public -u 18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725
```
```
0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6
```

#### 2. 公開鍵をSHA256ハッシュ化

```
bx sha256 0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6
```

```
600ffe422b4e00731a59557a5cca46cc183944191006324a447bdb2d98d4b408
```

#### 3. RIPEMD-160で変換

```
bx ripemd160 600ffe422b4e00731a59557a5cca46cc183944191006324a447bdb2d98d4b408
```

```
010966776006953d5567439e5e39f86a0d273bee
```

#### 4. version Code(1バイト:mainnet 0x00)を頭につける

```
00010966776006953d5567439e5e39f86a0d273bee
```

#### 5. SHA256で変換する。

```
bx sha256 00010966776006953d5567439e5e39f86a0d273bee
```

```
445c7a8007a93d8733188288bb320a8fe2debd2ae1b47f0f50bc10bae845c094
```

#### 6. SHA256でもう一度変換する。

```
bx sha256 445c7a8007a93d8733188288bb320a8fe2debd2ae1b47f0f50bc10bae845c094
```

```
d61967f63c7dd183914a4ae452c9f6ad5d462ce3d277798075b107615c1a8a30
```

#### 7. 最初の4バイトを取り出す。チェックサムとなる。

```
cut -b1-4 d61967f63c7dd183914a4ae452c9f6ad5d462ce3d277798075b107615c1a8a30
```

```
d61967f6
```

#### 8. 4.の結果と、7.の結果をくっつけ、25バイトの列を作成

```
00010966776006953d5567439e5e39f86a0d273beed61967f6
```

#### 9. BASE58でエンコードする。

```
bx base58-encode 00010966776006953d5567439e5e39f86a0d273beed61967f6
```

```
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
```

#### 10. 上記操作を省略する方法

```
bx ec-to-public -u 18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725 | bx sha256 | bx ripemd160 | bx address-encode
```

```
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
```
ブックマークレット活用・すばやい登録と呼び出し

常に実行するコードは Tampermonkey で充分ですが、特定のタイミングで実行したい軽いスクリプトにはブックマークレットを使っています。

例

```js
javascript: alert("ドッカーン！");
```

# 一瞬で登録
1. ブックマークレットのコードをコピー
2. Cmd + D(このぺーいでいいので「ブックマークに保存」を開く)
3. Edit を開く
4. URL にコードを貼り付けして保存


![](https://qiita-image-store.s3.amazonaws.com/0/40717/91772c4d-95ba-9fb9-895d-17fdeac0a848.png)

![「ブックマークレット活用・すばやい登録と呼び出し」を編集_-_Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/40717/2a9bb899-23c7-3669-94cd-e0b919a09937.png)


# アドレスバーから使う

![dokkan.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/c12054ac-31fd-43b1-b81d-0a8c3c6b37d0.gif)

補完で呼び出しています↑
登録時の画像(2枚目)にありますが `#code-dokkan` などブックマーク名にタグ付けをしておくと絞り込めます。

![Fullscreen_2018_02_10_12_43.png](https://qiita-image-store.s3.amazonaws.com/0/40717/b5714882-d6eb-51e3-b04b-872d44f9b548.png)
tmuxで新しいpaneやwindowの作成が遅い


tmuxはpaneやwindowを作成するときにログインシェルを使うようになっている。
~/.profile には anyenv の初期設定コマンドがあり、新しいwindowの作成に1.5秒ぐらいかかっていた。これは遅い。
tmuxの設定 `default-command` を使えばインタラクティブシェルで新しいpaneやwindowを作成できる。

```~/.tmux.conf
set -g default-command "${SHELL}"
```

- https://github.com/tmux/tmux/issues/1087
- https://qiita.com/magicant/items/d3bb7ea1192e63fba850
KVC(Key Value Coding) with Foundation in Swift


# KVCとは
* Key Value Codingの略
* オブジェクトの属性値にたいしてプロパティや変数から直接アクセスするのではなく、間接的に文字列(key)を通してアクセスする手法

# SwiftでKVCを行うには

* NSObjectを継承する
	* [NSKeyValueCoding](https://developer.apple.com/documentation/foundation/object_runtime/nskeyvaluecoding)プロトコルが自動的に適合される
* keyの指定は、#keyPath式が使える

* サンプルコード

```foo_kvc.swift
import Foundation

class Person: NSObject {
    @objc let name: String
    @objc let age: Int
    @objc var income: Int
    init(_ name: String, _ age: Int) {
        self.name = name
        self.age = age
        self.income = 0
    }
}

let p = Person("tanaka", 27)

// keyを通しての値の取得
print(p.value(forKey: #keyPath(Person.name)) as! String)


// letプロパティを変更するとクラッシュ
// p.setValue(30, forKey: #keyPath(Person.age)) クラッシュ

// varプロパティは変更出来る
p.setValue(350, forKey: #keyPath(Person.income))
```

# NSKeyValuCodingプロトコル

以下のメソッドが用意されている。

* keyを使った属性へのアクセス
	* value(forKey:)
	* setValue(_: forKey:)
* keyPathを使った属性へのアクセス = 「.」を使って、オブジェクトの属性を横断することが出来る
	* value(forKeyPath:)
	* setValue(_: forKeyPath:)

* それぞれ動作のカスタマイズが可能 (メソッドをオーバーライドする）

# keyPathテクニック

* 配列の要素に対しても行える

```配列の要素に対してKVCによる値の取得.swift
class Child: NSObject {
	@objc var value: Int
	init(_ value: Int) { self.value = value }
}

class Parent: NSObject {
	@objc var children: [Child]
	init(_ children: [Child]) { self.children = children }
}

let p = Parent(Array(1..<5).map(Child.init))
let values = p.value(forKeyPath: #keyPath(Parent.children.value)) as! NSArray // (or [Int] | [NSNumber]
```

* 配列演算子も用意されている

```swift_kvc_collection_operator.swift
// KVCを使って平均値を求める
let avg = p.value(forKeyPath: "children.@avg.value") as! Float
```

**NOTE:**
* mapメソッドやfor文を使用した方が断然速い (5倍ぐらい差がありました）


# KVCを使ってコードのシンプル化例

```シンプル化前.m
- (id)tableView:(NSTableView *)tableview objectValueForTableColumn:(id)column row:(NSInteger)row
{
    id result = nil;
    Person *person = [self.people objectAtIndex:row];
 
    if ([[column identifier] isEqualToString:@"name"]) {
        result = [person name];
    } else if ([[column identifier] isEqualToString:@"age"]) {
        result = @([person age]);  // Wrap age, a scalar, as an NSNumber
    } else if ([[column identifier] isEqualToString:@"favoriteColor"]) {
        result = [person favoriteColor];
    } // And so on...
 
    return result;
}
```

```シンプル化.m
- (id)tableView:(NSTableView *)tableview objectValueForTableColumn:(id)column row:(NSInteger)row
{
    return [[self.people objectAtIndex:row] valueForKey:[column identifier]];
}
```


# KVCが使われている箇所
* Core Data
* Key Value Observer (KVO)
* Cocoa binding (iOSにはない)


# 参照

* [KVO(Key Value Observe)について](https://qiita.com/ysn/items/9ca0248362f47d563f38)
KotlinでLogger Classを実装


こんにちは。m_saekiです。

kotlinを初めて2日目です。
Javaで実装していた時のLogger Classをkotlinに変換して今後コピペでいいように投稿しておきます。

こう修正した方がいいよは是非受け付けますのでよろしくお願いします。

## Logger Class

``` kotlin:Logger.kt
val TAG = "Application Name"

inline fun d(value: () -> String) {
    if (BuildConfig.DEBUG) {
        Log.d(TAG, value())
    }
}

inline fun d(tag: () -> String, msg: () -> String) {
    if (BuildConfig.DEBUG) {
        Log.d(tag(), msg())
    }
}

inline fun e(value: () -> String) {
    if (BuildConfig.DEBUG) {
        Log.e(TAG, value())
    }
}

inline fun e(tag: () -> String, msg: () -> String) {
    if (BuildConfig.DEBUG) {
        Log.e(tag(), msg())
    }
}

inline fun w(value: () -> String) {
    if (BuildConfig.DEBUG) {
        Log.w(TAG, value())
    }
}

inline fun w(tag: () -> String, msg: () -> String) {
    if (BuildConfig.DEBUG) {
        Log.w(tag(), msg())
    }
}
```

これからkotlin記事などをちょくちょく上げて行きますのよろしくお願いします！！
Google 検索結果画面で同じキーワードを Twitter でも検索する

Google で調べ物をしてから、Twitter でも同じ内容で調べたいことがたまにあるので Bookmarklet で作りました。

```js
javascript: (() => {
  const q = location.search
    .substr(1)
    .split('&')
    .reduce((p, c) => {
      const [k, v] = c.split('=');
      return Object.assign(p, { [k]: decodeURIComponent(v) });
    }, {});
  const keywords = q.q.replace('+', ' ');
  const url = '//twitter.com/search?q=' + encodeURIComponent(keywords);
  location.href = url;
})();
```


# 使う

![book toshino.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/51f2a52a-147a-d9ad-3728-c2594517ae72.gif)

Google検索結果ページでアドレスバーから補完で呼び出す例です↑

上記例の登録や呼び出しについてはここに書きました。↓
[ブックマークレット活用・すばやい登録と呼び出し \- Qiita](https://qiita.com/elzup/items/1698767d77af39d8dd19)
交通系ICから抜き出したcsvをFreeeのアップロード形式に変換

嫁がフリーランサーですが数字がクソみたいに苦手なので私が代わりにFreeeを使って事務処理してます。私が商業高校出身という意地もありますけどｗ

会計処理やってる人はわかってもらえると思いますけど、交通費精算は少額な割に発生頻度が多いので、鬼のように面倒。
交通系ICカードならまだ券売機で履歴を出力できますが、それでも印字可能なのは直近20件だけな上に、出力されるデータは下記のフォーマットです。

|No |項目   |備考|
|--:|:------|:------|
|1|月日|mmdd形式|
|2|種別(入場)|通常なら「入」<br>電車以外は「バス等」<br>ノーラッチで定期券外へ出た場合は「定」<br>現金チャージは「現金」等|
|3|利用駅(入場)|入場駅名・バス路線名・チャージした駅|
|4|種別(出場)|通常なら「出」<br>ノーラッチで定期券内へ入った場合は「定」<br>窓口から出た場合は「窓」等|
|5|利用駅(出場)|出場駅名|
|6|残高|利用後・チャージ後のIC残高|

1行前の記録から残高を引かないといくら引かれたのか・チャージされたのかがわかりません。一旦すべてExcelに入力して額を求めてFreeeに手打ちで入力をしていましたが、この作業が面倒で仕方なかったので、PaSoRiを使って履歴をCSVとして管理することにしました。

#使ったもの
- MacBook Pro(2011 Early OS: HighSierra)
- PaSoRi SONY RC-S320(メルカリで700円で購入）
- [Reciept Keeper](https://itunes.apple.com/jp/app/receiptkeeper/id413449473) (App Storeから360円で購入) 
- **Python3 + Pandas**

# 手順
MacBookにPaSoRiを接続しReciept Keeperを起動。サイドバーのデバイスにPaSoRiが認識されていることを確認してから、PaSoRiに嫁のPASMOを載せると、Reciept Keeperにデータが吸い出されます。
![recieptkeeper.png](https://qiita-image-store.s3.amazonaws.com/0/236279/a4f4766f-7830-8aa8-d904-e5b141cebd41.png)

※最初の吸い出しは20件ですが、２回目以降は差分のみ吸い出します。
続いて、メニューの「レシート」→「レシートを書き出す」からCSVファイルをエクスポートします。

# 変換方法
こんなコードを書きました。私初のPythonです。
https://github.com/Akagire/RecieptKeeperCSV2Freee

#実行
```bash
$ python3 rkc2f.py 
入力するRecieptKeeper出力のCSVを指定してください:
pasmo.csv #入力ファイルを指定
交通系ICへチャージする際に使用する口座を入力してください:
現金 #ICカードへチャージする口座名
交通系ICの口座を入力してください:
PASMO #ICカードの口座名。現金と分けていない場合は「現金」で良いです
1:乗車
2:乗車
3:乗車
4:チャージ
5:乗車
6:乗車
7:乗車
8:乗車
9:乗車
10:乗車
11:乗車
12:乗車
13:乗車
done!
```

#　出力
- 支払.csv
    - ICカード１行分の乗車履歴です（実行結果で「乗車」となった分）
    - 勘定科目は「旅費交通費」です。部門には電車なら「電車」、バスなら「バス」と表示するようにしています（実験中）
- 振替.csv
    - ICカード１行分のチャージ履歴です（実行結果で「チャージ」となった分）
    - 指定したチャージ元口座からICカード口座への振替情報です。
    - ICカード用の口座を切っていない場合はこのファイルは不要です。

#　Freeeへのインポート
支払.csvは「取引」として、振替.csvは「口座振替」としてアップロードしてください。
ICカード用の口座を切っていない人は口座振替のアップロード処理は不要です。

利用する画面は、「取引の一覧・登録」画面の「その他機能」の「取引のインポート」です。詳細は[Freeeのヘルプ](https://support.freee.co.jp/hc/ja/articles/202847320?_ga=2.242779138.124979895.1518217116-1525393998.1515900304&_gac=1.184608475.1517623557.CjwKCAiAtdDTBRArEiwAPT4y-5EQY-eFKBjfRN_M1OQakVK3-L2OVNukJDFkZP-azOKOMsTS2f2lZBoCdnEQAvD_BwE)を参照。

# ちょこっと解説
* PandasにCSVを取り込んだ際、からのデータが```NaN```になってしまうので、比較が楽なようにブランクへ置換してます。

```python3
import Pandas as pd
import numpy as np

tlog = pd.read_csv(filePath, encoding="utf-8")
tlog = tlog.replace(np.nan, '', regex = True)
```

* 出力したCSVをExcelで見たかったので、出力はShift-JISです。Freeeへの入力はUTF-8でもいけます。

```python3
df.to_csv("支払.csv", index = False, encoding = "shift_jis")
```

#ちなみに
現金から仕事用のICカードにチャージした分の領収書をつけるだけでも問題はないです。税務署からの問い合わせが発生した祭には明細を提出する必要があるので、私は毎回記帳することにしています。

# 今後
[この記事](https://qiita.com/alt-core/items/abc83b3c1e2dd176717f)を参考にして、Reciept Keeperを使わないでも行けるようにしてみたいなあと考え中。
[Windows] Windows Management Instrumentation (WMI)にある__EventConsumerクラス達

# これはなに？

Windowsイベント(イベントビューアで見られるあれ)を受信できるヤツら(クラス)の紹介です。

Windows Management Instrumentation使ってますか？
Windowsのマジ痒いところに手が届くできるヤツです。

、、、けど、今どきはあんまし使わないんですかね？Qiitaでも情報少ないですし。



## Windows Management Instrumentation (WMI)に親しむ

WMIに親しむにはwbemtestアプリを使います。多分どなたのWindowsにも入っているはずです。

起動するとこんな感じ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/7f971074-f8b9-dfb9-af2f-51b4c526561a.png)

おもむろに[接続...]ボタンを押して`root\subscription`名前空間に接続します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/5bee01d7-b9d4-6fde-5dd2-835e4841b412.png)

他にどんな名前空間があるかって？
すみません。知らないです。

[クラスの列挙...]ボタンを押して、スーパークラス名に`__EventConsumer`と入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/2cd1d121-e3ec-ac27-05db-cf4bbdd8d5b9.png)

ずらずらとクラスが表示されます。
このクラス達を紹介したいと思います。


# ActiveScriptEventConsumerクラス

ActiveScript(VBScriptやJScript等)を実行してくれます。
ActiveScriptでできることなら、なんでもできるはず。

MSDN → https://msdn.microsoft.com/ja-jp/library/aa384749(v=vs.85).aspx

## 主なプロパティ

| プロパティ | 説明 | 例 |
|:--|:--|:--|
| Name | 一意な名前です。自由に設定できます。  | "SendMail"  |
| ScriptEngine  | 使用する言語です。  | "VBScript"  |
| ScriptText  | プログラムです。指定した言語で記述します。   | (略）  |

# CommandLineEventConsumerクラス

指定したコマンドを実行してくれます。

MSDN → https://msdn.microsoft.com/ja-jp/library/aa389231(v=vs.85).aspx

## 主なプロパティ

| プロパティ | 説明 | 例 |
|:--|:--|:--|
| Name | 一意な名前です。自由に設定できます。  | "SaveDB"  |
| CommandLineTemplate  | 実行するコマンドラインです。引数も書けます。   | "powershell.exe -ExecutionPolicy RemoteSigned InsertSql.ps1" |


# LogFileEventConsumerクラス

Windowsイベントをファイルに記録してくれます。

MSDN → https://msdn.microsoft.com/en-us/library/aa392277(v=vs.85).aspx


## 主なプロパティ

| プロパティ | 説明 | 例 |
|:--|:--|:--|
| Name | 一意な名前です。自由に設定できます。  | "WriteLog"  |
| Text  | 記録する文字列です。  | "%TargetInstance.Message%" |
| Filename  | 記録先のファイル名です。   | "C:\var\log\error.log" |


# NTEventLogEventConsumerクラス

Windowsイベントをさらに別のイベントとして記録してくれます。
あんまり使う機会ないかも。

MSDN https://msdn.microsoft.com/ja-jp/library/aa392715(v=vs.85).aspx

# SMTPEventConsumerクラス

Windowsイベントをメール送信してくれるのですが、SMTP認証に対応していなかったりで使えないので割愛です。

# リンク

* [Monitoring and Responding to Events with Standard Consumers](https://msdn.microsoft.com/en-us/library/aa392395(v=vs.85).aspx)
PHPのビルドインサーバーを使ったデバッグ(Atom x Xdebug)

はじめまして。

数年のブランクを経てWebエンジニアの世界へ戻ることになりました。これを期に、見てるだけだったQiitaも使ってみようと思い、練習がてら。

#前提条件
- OS: macOS HighSierra
- PHP: 7.0.27
- Laravel: 5.5.24
- エディタ: Atom 1.23.3

#用意したもの
- Xdebug

Homebrewでインストールしました。

```bash
$ brew install php70-xdebug
```

- PHP-debug

AtomにPHP-debugをインストールしました。

Atom - PHP-debug
https://atom.io/packages/php-debug

# Xdebugの設定

homebrewでインストールされたxdebugの設定ファイルはここ。

```
/usr/local/etc/php/7.0/conf.d/ext-xdebug.ini 
```

PHP-debugの説明の通り修正します。

```
[xdebug]
zend_extension="/usr/local/opt/php70-xdebug/xdebug.so"
#ここは環境やバージョンに応じて変化すると思います。
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_connect_back=1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart=true
```


# PHP-debugの設定
AtomのConfigファイル`config.cson`に下記を追記。

```
"php-debug":
  {
    ServerPort: 9000
    ServerAddress: "127.0.0.1"
  }
```

今回はリモートデバッグしないのでPath Mapは書きませんでした。

これでAtomの左下に追加された**PHP Debug**ってボタンをクリックするとデバッグウィンドウが表示されます。

適当にソースコードへブレイクポイントを仕掛けます。行番号の右側のをクリックすると、$\style{color:blue;}{\text{●}}$が表示され、ブレイクポイントが設定されました。

この状態でビルドインサーバーを起動。

```bash
$ php artisan serve
```

で、`127.0.0.1:8000/****`へアクセスします。ちゃんと止まります。うまくいきました。**Xdebugがリッスンするポートとサーバーのポートは別でOK**です（ここでちょっとハマった）。

#未解決事象

しかし、何度かやっているうちにビルドインサーバーへアクセスするとLaravelのserver.phpが固まってしまう現象に直面。このときは、プロセス一覧からIDを見つけてkillして対応。

```bash
$ ps -rf | grep laravel

  501 20235 20226   0 11:14AM ttys000    0:00.00 grep laravel
  501 20221 20217   0 11:14AM ttys003    0:00.04 /usr/local/Cellar/php70/7.0.27_19/bin/php -S 127.0.0.1:8000 /Users/akagire/dev/laravel/server.php

$ kill 20221
#プロセスIDは時と共にに変化します...
```

結果的にはconfigに追記した**php-debugの設定を削除**でうまくいきました。理由がわからないので気持ち悪いですが、今のところなんとか動いています。
JS で url query 文字列の parse ワンライナーメモ

Bookmarklet や DevTool console 上で使いたい時用です。

```js
location.search
// => "?ei=nD5-WuKLBYLK0gTr_LioBw&q=atom+eslint+error+%E5%85%A8%E4%BD%93&oq=atom+eslint+error+%E5%85%A8%E4%BD%93"

const queries = location.search.substr(1).split('&').reduce((p, c) => {
 const cs = c.split('=');
 return Object.assign(p, { [cs[0]]: cs[1] })
}, {})

/*
=> {
  "ei": "nD5-WuKLBYLK0gTr_LioBw",
  "q": "atom+eslint+error+全体",
  "oq": "atom+eslint+error+全体"
}
*/
```
ブックマークを保持したままSourcetreeをアンインストール/再インストールする方法

## はじめに
GitのGUIアプリケーションとして、見やすくて便利なので、Sourcetreeが好きです。ですが、Sourcetreeは割りとバグが多いイメージで、何度ログインしても、ログインを迫られるプロンプトが出続けたり、色々バグぽいものがあります。

そこで、この記事ではこういう不具合を解消するために、よくやっているSourcetreeのアインストール方法を紹介します。

ただ、完璧にアンインストールすると、リポジトリのブックマークもなくなってしまうので、「**リポジトリのブックマークを保持したままアンインストール**」する方法の紹介です。

Macでの説明です。
お決まりですが、うまく行かなくても責任は取れません（自己責任です）。ですが、何度も使っている方法で今のところ上手くいっています。

## 方法

### `browser.plist`のバックアップ

方法は単純で、
以下のファイルをどこかにバックアップしてください（このファイルにブックマークの情報が含まれています）。
`"$HOME/Library/Application Support/SourceTree/browser.plist"`

### アンインストール

あとは、Sourcetreeを[AppCleaner](https://freemacsoft.net/appcleaner/)でアインストールします。

<img width="539" alt="Screen Shot 2018-02-10 at 10.36.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/b464755f-0981-b55b-def3-1705a31def06.png">
（`SourceTree.app`をゴミ箱に入れるだけだと、設定ファイル系などが完璧に削除できないので、このアプリを使ってアインストールしています）


### 再インストール

公式からSourcetreeをインストールし直します
<https://www.sourcetreeapp.com/>

### Sourcetreeのセットアップをする


指示通り進んでいきます

![Screen Shot 2018-02-10 at 10.40.02.png](https://qiita-image-store.s3.amazonaws.com/0/84451/79504894-4a59-574c-2628-947fa04ca349.png)

それで、以下表示されるところまで行きます。

<img width="592" alt="Screen Shot 2018-02-10 at 10.41.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/28c2a869-f176-880d-3111-1dc4c95cdd95.png">
（空っぽですが心配しないでください。これから復活します）

Sourcetreeを<kbd>⌘</kbd> + <kbd>Q</kbd>などで終了させます。

### ブックマークの復元

あとは、`browser.plist`をもとの場所に戻せば復元されます

```bash
cd <broswer.plistをバックアップした場所>
cp browser.plist "$HOME/Library/Application Support/SourceTree/browser.plist"
```

開くとブックマークは無事に復活しました！

<img width="592" alt="Screen Shot 2018-02-10 at 10.45.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/6e9d3340-db19-1e4c-acf9-51ad9c5728f8.png">



## おまけ - `browser.plist` について

以下のコマンドで`browser.plist`の中身をXMLとして読むことができます（標準出力に表示されます）。

```bash
plutil -convert xml1 -o - "$HOME/Library/Application Support/SourceTree/browser.plist"
```

（参考：http://ilostmynotes.blogspot.jp/2011/09/reading-and-modifying-os-x-plist-files.html）

これで中身を見る感じだと、やはり、リポジトリ名とリポジトリの場所のパスの集まりぽいです。
テスト駆動開発による組み込みプログラミングをgoogletestでやる～SOLIDな設計編～

## はじめに

[Amazon.co.jp: テスト駆動開発による組み込みプログラミング ―C言語とオブジェクト指向で学ぶアジャイルな設計](https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E2%80%95C%E8%A8%80%E8%AA%9E%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%81%AA%E8%A8%AD%E8%A8%88-James-W-Grenning/dp/4873116147)

本書で学習を始める人が、環境構築で躓かないようにしよう！で始めたシリーズの最終回です。
これまでのシリーズ一覧はこちら。

[テスト駆動開発による組み込みプログラミングをgoogletestでやる](https://qiita.com/tomoyuki-nakabayashi/items/816e35f2099b021992dd)
[テスト駆動開発による組み込みプログラミングをgoogletestでやる8章](https://qiita.com/tomoyuki-nakabayashi/items/19014f5904cfe2d860f8)
[テスト駆動開発による組み込みプログラミング～モック＆フラッシュドライバ編～](https://qiita.com/tomoyuki-nakabayashi/items/859f1ca077332d4197f6)

## SOLIDな設計

本章では、密結合したLEDドライバコントローラを、SOLID原則のうちオープン・クローズドの原則とリスコフの置換原則を適用して動的インタフェースに変更していきます。
詳細は、書籍をご覧下さい。

【密結合したLEDドライバコントローラ】
![tightly_coupled_design.png](https://qiita-image-store.s3.amazonaws.com/0/204676/2e0c9c37-283a-c8af-bdb5-b04606eff459.png)




↑を↓に。

【SOLID原則を適用したLEDドライバコントローラ】
![solid_design.png](https://qiita-image-store.s3.amazonaws.com/0/204676/05961c63-0a11-50fa-a6ce-65a027b1bccd.png)

## レポジトリ

https://github.com/tomoyuki-nakabayashi/TDDforEmbeddedC_SolidDesign
下準備完了したコミット：
SHA：4b0857eeb273736d7e5cf9d2c424e99797f31fbd

今回、かなり下準備に手間取りました。（サンプルにノイズが多い…）
書籍を写経しながら進める場合は、↑のコミットから開始してください。

## さいごに

本書では、C言語でTDDを行う方法だけにとどまらず、C言語でテスト容易な、柔軟な設計を実現する方法が解説されています。
そのためには、関数ポインタを有効利用することが必要になります。
書籍内で指摘されていますが、関数ポインタは設計に重要な役割を果たすのに、C言語プログラマに見落とされがちです（私自身も含めて）。
このような重要なテクニックを学べる本書は非常に価値あるものであり、多くの組込みプログラマの皆様に読まれて欲しいと感じました。

TDDによるC言語プログラミングは、非常に楽しいです。
組込み開発に従事しているプログラマが、C言語でのTDDを始めるのに、この記事が役立つと幸いです。

現在、CMakeでのビルド環境を準備中です。
幅広い環境で勉強できるように環境構築していく予定です。
google検索時に日本語検索、英語検索を簡単に切り替える方法

プログラミングに関する調べ物は基本英語でするようにしているのですが、日本語で検索したくなる時も出てきます。
そんな時に簡単に言語の切り替えができる方法を知ったので紹介。

## 拡張機能を入れる

[https://chrome.google.com/webstore/detail/add-links-to-change-langu/eemleifbnibgnoifdjohpchdemidjibj/related](https://chrome.google.com/webstore/detail/add-links-to-change-langu/eemleifbnibgnoifdjohpchdemidjibj/related)

この拡張機能を入れることで、

![スクリーンショット 2018-02-10 10.36.56.png](https://qiita-image-store.s3.amazonaws.com/0/202653/014eb311-54b8-1e68-e75e-e2f5b049f446.png)

このように簡単に言語を切り替えることができます。
macにHomebrewでpostgresqlをインストール

### 環境
mac
Homebrew インストール済み

### インストール
brew install postgresql

### バージョン確認
psql --version

psql (PostgreSQL) 10.1

### 自動起動設定
brew services start postgresql

### 自動起動状況確認
brew services list

### 自動起動の停止
brew services stop postgresql

### データベース作成
createdb test

### データベース接続
psql test

### テーブル作成
create table test_table (id integer not null,name varchar(20),primary key(id));



### 参考
https://qiita.com/uhooi/items/cd6256a72c6a03621c09
http://t-shimohara.com/pc/postgressql
https://qiita.com/gooddoog/items/1f986c1a6c0f253bd4e2
ivy-modeで、パスのドライブレター（C:など）を変更する。

find-file時に例えばD:に変更するなら、ミニバッファで

    d:/

と入力。

ido-modeと同じ。

## 参考
- [How do I change drive letter in ido mode (Emacs)? - Stack Overflow](https://stackoverflow.com/questions/4050913/how-do-i-change-drive-letter-in-ido-mode-emacs)
ivy-modeで、候補があることによりファイルやフォルダを作成できないとき。

    C-M-j

により、find-fileやdired-modeで候補があっても、入力したファイルやフォルダを作成できる。

## 参考
- [Ivy User Manual - 5.2.2 Key bindings for single selection, action, then exit minibuffer](http://oremacs.com/swiper/#key-bindings-for-single-selection-action-then-exit-minibuffer)

- [ivy-mode: create directory when name of directory matches filename in current directory ・ Issue #183 ・ abo-abo/swiper ・ GitHub](https://github.com/abo-abo/swiper/issues/183)
phpbrew install で  Please reinstall the BZip2 distributionと出た時の対処法

phpの環境構築をしていた時に

```shell
phpbrew install 5.6.23 +default +mysql  +openssl=$(brew --prefix openssl)

=> configure: error: Please reinstall the BZip2 distribution
```

のようなエラーが出たので、解決策を書いておきます。

## 解決策

```shell
xcode-select --install
```

これだけで解決します。

## 解説

上記のエラーはbzip2というものが、ないぞ！ってエラーなので、入れてあげつ必要があります。

[bzip2とは何かの解説wiki](https://ja.wikipedia.org/wiki/Bzip2)

bzip2はもともとmacのOSに入っているものなので、

```shell
xcode-select --install
```

でインストールすることができます。
ちなみにこのコマンドはXcodeのコマンドラインツールをインストールするためのコマンドらしい

[参考サイト](http://d.hatena.ne.jp/nakamura001/20140503/1399116353)
Swift4でのreflection

Swift3.X → Swift4.X 移行の時に
reflectionを使っているところで以下のようなビルドエラーが出て困る。
"this class is not key value coding-compliant for the key Name."
"This class is not key value coding compliant"

具体的なソースでいうとたぶんこんな感じのところ

```swift
class Person : NSObject
{
    var Name:String = ""
}

let taro = Person()
taro.setValue("山田太郎", forKey: "Name") <<<<<ここでエラー！！
```
と、setValueで値を格納しているところで上記のようなエラーが出ると思う。
解決策だけさらっと書くと

```swift
@objcMembers class Person : NSObject
{
    var Name:String = ""
}
```
のように、"@objcMembers"をclass定義の頭につけてやる。
Objective-Cから離れたいのになぜか離れられないSwift、中の人は何か苦労があるんだろうな・・・

Swift4からはJsonのエンコードではCodableが使えるようになったのでリフレクションを使う場面は少し減るかも。

##参考

https://stackoverflow.com/questions/44762460/swift-4-this-class-is-not-key-value-coding-compliant

[Swift reflectionについて](https://qiita.com/bannzai/items/96b912a9db43cefdb728)

[Codableで色々なJSONに対応する](https://qiita.com/Mt-Hodaka/items/d14447a429948a3fb28c)
[読書メモ]学習する組織 - 9章メンタル・モデル

# メンタルモデルとは？
物事に対する自分の認識のこと。
自分の中の常識と言い換えてもいいかもしれない。

自分の世界の見方を反映するものであり、同時に、そうであるが故に自分の行動にも強い影響を与えるものである。
例えば裸の王様という童話を例にとると「王様には威厳がある」というメンタルモデルのせいで、人々には裸の王様のありのままの姿が見えなかった。

つまり、人は選択的に物事を見ているということです。
アインシュタインの「何を測定するかを決定するのは理論なのだ」という言葉にも上記の内容が言い表されています。

# （So what?）だからなんなのか？
このメンタルモデルが潜在意識下で作用している場合に、問題になることがある。

## なぜか？
それは下記のような状態になってしまうからです。

1. 自分の中で当たり前のことなので、その存在に気づきません。
2. そのため、その前提が検証されることがありません。
3. すると、改善（変更）されることもありません。
4. いつのまにか現実から乖離した認識を持ってしまっている。
5. そのため、現実からかけ離れた逆効果の行動を取ってしまう。

例えば、かなり無理がある以下の例を考えて見てください。
1. 若いうちは無茶しても大丈夫、という認識を持っていたとします。
2. 潜在意識下での認識なので、疑問に思いません。そのため、その前提を疑いません。
3. 前提を疑うことがないので、無茶は良くないという認識に変わることはありません。（暴飲暴食など）
4. 暴飲暴食は年に関係なく、体に良くないが、その現実と認識の乖離に気づかない。
5. よくないけど、それを続けてしまう。

# （Then what?）じゃどうするか？
常に、自分が持っているメンタルモデルを意識して、検証・改善をする必要があります。
この時に意識する必要があることとして、以下4点に注意する必要があります。

1. 信奉理論と使用理論の乖離にむきあう
2. 抽象化の飛躍を認識する
3. 左側のセリフ（本音）を明らかにする。
4. 探求と主張のバランスをとる

## 1. 信奉理論と使用理論の乖離にむきあう
自分で信じていると言っている現実と実際の行動の乖離を見つめます。
例えば、以下の例を考えて見ます。
1. Aさんは「人を信じている」という信奉理論を持っていたとします。
2. だが、Aさんは人にお金を貸すことは頑なに拒むし、人に仕事を任せることもありません。

この場合、（人を信じるということとお金を貸せることがイコールかどうかという議論はあるとして）Aさんが言っていることと実際にやっていることが異なっていますね。
ただ乖離自体は悪いことではありません。
なぜならこの乖離が認識されない限りは、どんな学習も起こらないためです。
学習のため一歩ということです。

これは自己マスタリーのところでもあった様に、創造的な緊張ですね。
ここで重要なのは、この信奉（理想）が本当に自分にとって大切なものなのか（本当に自分のビジョンの一部なのか）を問うことです。

もしこの自問に対する回答がNOなら、この乖離はビジョンと現実の乖離ではないでしょう。
おそらく、（世間の目を気にして）推進する考え方との間の乖離ということになります。

## 2. 抽象化の飛躍を認識する
自分が思っている一般原則というのは、ある事象から抽象化したものであることがほとんどです。
この時、その抽象化は本当に妥当なのかを検証することが重要です。

例えば、投稿リストからグリッド表示を削除しました。
何人かのユーザから不満の声が届いています。
それに対して、「ユーザから不満が出ている」という観察された事象を「ユーザはグリッド表示を求めている」という抽象化をしてしまうとします。

この抽象化が何の疑問もなく受け入れられると、グリッド表示は必要という一般化が定着してしまいます。
そうなるとグリッドがなくなったことで何が問題なのか？などの学習機会が奪われてしまいます。（ちょっと適当になっちゃいましたが、要旨が伝われば問題ないです）

## 3. 左側のセリフ（本音）を明らかにする。
自分の行動や、会話の時の本音を明らかにすることです。
あの時言わなかったけど、本当はこう考えていた。
こう言ったのは、こういう思いがあったからだと言った、自分の行動のパターンとその構造的な要因を把握するのに役立ちます。

## 4. 探求と主張のバランスをとる
主張するというのは、多かれ少なかれ自分の考え方を相手に押し付けている状態です。
主張の背景にあるのは、自分の前提です。（メンタルモデル）
主張ばかりしていると、自分のメンタルモデルを変化させるチャンスを失います。

そのため、自分の主張や前提に対して相手からのフィードバックを求める探求という行動が必要になります。

しかし、ただ探求だけをすればいいということでもありません。（探求というよりは、相手の意見を聞いているだけ）
なぜなら、人は何かしら意見を持っています。
探求だけをしているというのは自分の意見を人の目に触れさせて、検証されるのを恐れているために気づかない間にとっている行動です。
自分の意見を隠している場合にも、それが検証されることがないため自分のメンタルモデルを変化させる機会は失われます。

# 所感
組織に対しても同じことが言えますね。（そもそも本では組織への適用についても書いてますが、個人の視点でまとめ始めた方が得るところが大きいと思ったので割愛）
画期的なアイデアも、決断する人の常識から考えてそれが正しく見えなければ実行されることはありません。

そのため、みんながこのメンタルモデルの考え方を共有して、変革に対してオープンでいる必要があります。

自己マスタリーのところで述べられていた、真実を認識すること（自分の行動に対して、内面的にネガティブな圧力がかかったりしたときに、何がおきているのかどういう感情なのかを言語化して認識すること）がなぜ大切なのかがわかった気がします。

言語化して、認識することで次のアクションに繋げられるからっていうことですね。
何かわからない、何となくXXな状態って放っておくと今後も同じことが起きたときに、その圧力に屈するしか無くなりますが、そういう現実と友達になって対処法を見つけることが大切なんだなと思いました。
4. yEDをつかってRoBoHoN用hvmlをサンプルコードをベースに作ってみる

#はじめに
**2017/12/12にRoBoHoNが我が家にやってきた！
**やりたいことは？　RoBoHoN キャラでオリジナル対話シナリオを話してもらう！
**　RoBoHoN SDK のサンプルコードとガイド資料が揃っているようだ！

#やりたいこと全体手順と、いまここ
1.RoBoHoNのための Android 開発環境をもつ
2.RoBoHoNのための Android 実行環境を開発環境とつなぐ
3.RoBoHoN SDKで提供されるサンプルプログラムをRoBoHoNで試動作してみる
4.yEDをつかってサンプルコードをベースにRoBoHoN用hvmlを作ってみる　＜＜　いまここ
-[]yED導入
-[]python導入 イメージ編集ファイルをhvml形式にexportするためにpythonが必要
-[]yED導入

5.サンプルプログラムの hvml を自分の hvml に置き換えてRoBoHoNで試動作してみる 

#参考にしたのは
https://isana.blog/2016/09/sdk-html/
https://www.python.org/downloads/
SDK 901

#yED 導入
#python 導入
これは、簡単！　export まであっという間！
#SDK 091 解凍

#認識しない理由が・・
ケーブル間違いだったよ
Registryを変えてみたりいろいろやったが
ちがうケーブルつかってちゃつながらない　笑

#対話カスタマイズ
Applicatio Programming Guide
HVML Specification を半日熟読
「MLPでXORが学習できない」みたいな投稿を見たので確かめてみる

はじめに
========
今朝 ぼーっとTwitterを眺めていると、 [Unable to Learn XOR Representation using 2 layers of Multi-Layered Perceptron (MLP)](https://discuss.pytorch.org/t/unable-to-learn-xor-representation-using-2-layers-of-multi-layered-perceptron-mlp/13287) みたいなのが流れてきました。
「2層のMLPでXORが学習できない」と。
そんなわけないだろ、と思ったのですが、少し気になったので確かめてみます。

検証
======

```python3
# Keras2, Python3, Jupyter用 です。
# 動かす場合、Jupyterではない環境では `%matplotlib` の部分はコメントアウトしてください。

import matplotlib.pyplot as plt
%matplotlib inline

import numpy as np
import keras.backend as K
from keras.models import Model
from keras.layers import Dense, Input
from keras.optimizers import SGD
from keras.objectives import binary_crossentropy
from keras.utils import to_categorical

X = np.array([[0,0], [0,1], [1,0], [1,1]]) * 1.0
Y = np.array([[0,1,1,0]]).T

def training():
    in_x = x = Input((2, ))
    x = Dense(8, activation="tanh")(x)
    x = Dense(1, activation="sigmoid")(x)
    model = Model(in_x, x)

    model.compile(loss=binary_crossentropy, optimizer=SGD(0.5, momentum=0.9))
    history = model.fit(X, Y, epochs=100, verbose=0)

    accuracy = np.average((model.predict(X).T[0] > 0.5) == Y.T[0])
    return history, accuracy, model

results = []
for _ in range(20):
    history, accuracy, _ = training()
    results.append(accuracy)
    if accuracy < 1:
        print(accuracy)
        break

print(results)
plt.plot(history.history["loss"])
```
こんな感じで20回モデルを作って学習して精度をみましたが全て100%でした。

結果を見ると「そりゃまあ、そうだよね」と思いますが、実は最初の数回は100%にならなかったので、その経緯を書きます。

## 失敗１：学習が収束していなかった

今回の実験で最初は精度が50%くらいで「あれ？」と思いました。
モデルの構造をいくらいじっても駄目です。
で、とりあえず、学習過程のLossをPlotしてみると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11124/572f18af-f170-2e31-aef9-768cbe6c1ae9.png)

という感じで見事に収束前でした。
このとき `SGD(0.01)` とだけ指定していて、`momentum` などは指定していませんでした（まあ、別に要らんやろ、と思っていた）。
そこで、今回のようにすることで、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/11124/24268803-666b-260a-c6f4-dea43a35be64.png)

という感じで素早く収束してくれました。

**教訓： 学習過程はちゃんと観察すること**

## 失敗2： モデルが小さすぎた

まあ、XORくらい2Node 1層で十分だろ、と思って、

```
    x = Dense(2, activation="tanh")(x)
```

としていたのですが、その場合、20回の試行のうち数回は精度100％になりませんでした。で、8Nodeにしてみると20回の試行では1回も100%未満になることはありませんでした。ちなみに2層8Nodeでももちろん大丈夫でした（他はあまり試してないです）。

**教訓?: 小さすぎるモデルはやはり学習しない**

さいごに
=======

DeepLearningは過学習して良いのならかなり強力な仕組みですので、XORくらい楽勝...と思っていたけど順調に躓くものだな、という話でした。
Oracle SQL 連番や連続した日付を取得

```SQL
-- こんな感じで連番や連続した日付を取得できる。
--

-- 連番(昇順)
SET PAGESIZE 100
-- NUMBER型で
-- NUMBER_FROM <= 範囲 <= NUMBER_TO
SELECT A.NUMBER_FROM + ROWNUM - 1 AS NUMBERS
FROM(
    SELECT -10 AS NUMBER_FROM  -- first number
         ,  10 AS NUMBER_TO    -- last number
    FROM DUAL
    ) A
CONNECT BY LEVEL <= A.NUMBER_TO - A.NUMBER_FROM + 1 ;

   NUMBERS
----------
       -10
        -9
        -8
        -7
        -6
        -5
        -4
        -3
        -2
        -1
         0
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

21行が選択されました

-- 連番(降順)
SELECT A.NUMBER_FROM - ROWNUM + 1 AS NUMBERS  -- DESCENDING
FROM(
    SELECT  10 AS NUMBER_FROM  -- first number
         , -10 AS NUMBER_TO    -- last number
    FROM DUAL
    ) A
CONNECT BY LEVEL <= A.NUMBER_FROM - A.NUMBER_TO + 1 ;

   NUMBERS
----------
        10
         9
         8
         7
         6
         5
         4
         3
         2
         1
         0
        -1
        -2
        -3
        -4
        -5
        -6
        -7
        -8
        -9
       -10

21行が選択されました。


ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY/MM/DD HH24:MI:SS' ;

-- 連続した日付(昇順)
-- DATE型で
-- DATE_FROM <= 範囲 <= DATE_TO
SELECT A.DATE_FROM + ROWNUM - 1 AS DATES
FROM(
    SELECT TO_DATE('2018/02/25', 'YYYY/MM/DD') AS DATE_FROM
         , TO_DATE('2018/03/05', 'YYYY/MM/DD') AS DATE_TO
    FROM DUAL
    ) A
CONNECT BY LEVEL <= A.DATE_TO - A.DATE_FROM + 1 ;

DATES
-------------------
2018/02/25 00:00:00
2018/02/26 00:00:00
2018/02/27 00:00:00
2018/02/28 00:00:00
2018/03/01 00:00:00
2018/03/02 00:00:00
2018/03/03 00:00:00
2018/03/04 00:00:00
2018/03/05 00:00:00

9行が選択されました。

-- 連続した日付(降順)
SELECT A.DATE_FROM - ROWNUM + 1 AS DATES -- DESCENDING
FROM(
    SELECT TO_DATE('2020/03/05', 'YYYY/MM/DD') AS DATE_FROM
         , TO_DATE('2020/02/25', 'YYYY/MM/DD') AS DATE_TO
    FROM DUAL
    ) A
CONNECT BY LEVEL <= A.DATE_FROM - A.DATE_TO + 1 ;

DATES
-------------------
2020/03/05 00:00:00
2020/03/04 00:00:00
2020/03/03 00:00:00
2020/03/02 00:00:00
2020/03/01 00:00:00
2020/02/29 00:00:00
2020/02/28 00:00:00
2020/02/27 00:00:00
2020/02/26 00:00:00
2020/02/25 00:00:00

10行が選択されました。

-- なお、西暦0年は存在しないとか、
-- ユリウス暦からグレゴリオ暦切り替えのため1582年10月4日(木)の翌日を1582年10月15日(金)に調整されたのは当SQLでは対応していない。
```
-- Oracle 以外のデータベースでCONNECT BY LEVELが使えるかは未確認。
DNSサーバ(ネームサーバー)とドメインとは？

DNS(ドメインネームシステム)とはドメインをIPアドレスに変換(名前解決)
してくれるシステムである
ドメインは人が識別しやすくした住所的なもの

## 特徴
1.ルートサーバと呼ばれる親玉が世界に13ある
※ちなみに日本にも1台ある

2.コンテンツサーバ(特定の範囲のみ)とキャッシュサーバがある
※クライアントに近いところはキャッシュ、その他がコンテンツのイメージ
※コンテンツサーバとは問い合わせに応える

3.ドメインの管理はレジストリ、登録はレジストラが行う
※登録したい人はレジストラに依頼する形

4.ドメインにはwhoisというレジストリが情報提供するサービスがある
※ドメインとDNSサーバ(IPアドレス)の関係性が見れる

5.レジストラは定期的にドメインの生存確認を行っている

6.リゾルバとはクライアント側のこと

7.コンテンツサーバは冗長化としてプライマリとセカンダリがある
※マスター(プライマリ)、スレーブ(セカンダリ)と呼ぶこともある

##　感想
項目5のドメインの生存確認に注意！！
確認メールを見逃さないこと
git lfsですでにコミットしてしまったファイルを取り除く

小一時間ハマったので、備忘録。

git lfs already commit とかでググっても、欲しい情報がでてこない。

エラーメッセージでググるとでてきた。
"this is larger than GitHub's recommended maximum file size of 50.00 MB"

http://www.thisprogrammingthing.com/2013/fixing-the-this-exceeds-githubs-file-size-limit-of-100-mb-error/

で、忘れずに

```git lfs track "でかいファイル名（のパターン）"```

して、あとは普段通りでおｋ。

じゃ、金曜なのでお先に帰ります！
Mastodon API からローカルタイムラインを取得する（「LTL」取得の 1 行サンプル）

## マストドンのローカルタイムラインを `curl` で取得する

## TL;DR

> タイムラインのエンドポイントのクエリ引数に`local=hoge`を加える。（`hoge`は何でもよい）

```bash:LTLのcURL構文
$ curl -X $method -sS $schema://$host$endpoint?local=true
```

```bash:Qiitadonの例
$ curl -X GET -sS https://qiitadon.com/api/v1/timelines/public?local=something
```
- [オンラインで動作を見る](https://paiza.io/projects/ROmknmcjJJESscmZaI6KIA) @ paiza.IO

なお、ローカルタイムライン（LTL）と連合タイムライン（FTL）はアクセストークンを必要としません。

cURL を叩きすぎると一時的にブロックされるので、毎回断続的に cURL を叩かずにストリーミングとして取得したい（つなげっぱでリアルタイムに取得したい）場合は [Streaming API](https://qiita.com/KEINOS/items/75febc1d5391ae5c7bd9) を利用します。

## TS;DR

連合タイムラインと同じエンドポイントですが、**違うのはエンドポイントのクエリの引数に `local` キーと空白以外の値を入れてリクエストすること**です。（値は空でない文字列であれば何でもよい）

つまり [Qiitadon](https://qiitadon.com) の場合 `https://qiitadon.com/api/v1/timelines/public?local=hoge` にリクエストします。

上記 cURL 文を PHP から外部コマンドとして実行する場合のサンプルです。

```sample.php
<?php

$schema   = 'https';
$host     = 'qiitadon.com';
$endpoint = '/api/v1/timelines/public';
$method   = 'GET';
$args     = 'local=true'; //LocalTimeLine用引数

/* cURL リクエストの作成 */
$query  = "curl -X ${method}";
$query .= " -sS ${schema}://${host}${endpoint}?${args};";

/* cURL リクエストの送信 */
$result_json  = `$query`; //バッククォートで $query の cURL 実行
$result_array = json_decode(trim($result), JSON_OBJECT_AS_ARRAY);

print_r($result_array);
```

無理して外部コマンドの `cURL` を使わずに **`file_get_contents()` 関数を使う**場合。

```php
<?php

$url_request  = 'https://qiitadon.com/api/v1/timelines/public?local=something';
$result_raw   = file_get_contents($url_request);
$result_array = json_decode(trim($result_raw), JSON_OBJECT_AS_ARRAY);

print_r($result_array);
```

---

### 検証環境（動作確認済み環境）

<details><summary>macOS HighSierra</summary><div>

- HighSierra (OSX 10.13.5)
- PHP 7.2.6 (cli)
- curl 7.54.0 (x86_64-apple-darwin17.0)
    - libcurl/7.54.0
    - LibreSSL/2.0.20
    - zlib/1.2.11
    - nghttp2/1.24.0
</div></details>

<details><summary>Raspbian Jessie</summary><div>

- Raspbian Jessie(Debian V8)
- PHP 7.0.27-0+deb9u1 (cli)
- curl 7.38.0 (arm-unknown-linux-gnueabihf)
    - libcurl/7.38.0
    - OpenSSL/1.0.1t
    - zlib/1.2.8
    - libidn/1.29
    - libssh2/1.4.3
    - librtmp/2.3
</div></details>

<details><summary>CentOS 7</summary><div>

- CentOS Linux release 7.5.1804 (Core)
- PHP 5.6.36 (cli)
- curl 7.29.0 (x86_64-redhat-linux-gnu)
    - libcurl/7.29.0
    - NSS/3.34 zlib/1.2.7
    - libidn/1.28
    - libssh2/1.4.3
</div></details>

### 関連記事

- [Mastodon API から「返信」をトゥートする 1 行サンプル](https://qiita.com/KEINOS/items/68ae99c7f98fe309f9bf) @ Qiita
- [Mastodon API から「未収載」でトゥートする PHP サンプル](https://qiita.com/KEINOS/items/27d201afed4ed665cb11) @ Qiita
- [Mastodon API で「You are being redirected」とアクセストークンの取得](https://qiita.com/KEINOS/items/78445aad59e5818bf87e) @ Qiita

### 参考記事
- [マストドンAPIの解説](https://yamasakimasaki.com/blog/125.html) @ ヤマサキマサキ.com
- 公式 [Qiitadon API | Timelines](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#timelines) @ GitHub