OmniAICreator/Qiita-1.07M huggingface dataset:
PyCharmをコマンドラインから起動したい！

# はじめに
この記事はPython Advent Calendar 2017 2日目の記事です。
その1: https://qiita.com/advent-calendar/2017/python
その2: https://qiita.com/advent-calendar/2017/python_python

まさかのJetBrainsアドベントカレンダーもありました。PyCharmネタなのでこっちのほうが相応しかったかも？
https://qiita.com/advent-calendar/2017/jetbrains

# カレントディレクトリをPyCharmで開きたい

ターミナルでディレクトリを移動していて、カレントディレクトリをエディタ or IDEで開きたいときがあると思います。

たとえばAtomの場合、

```bash
$ atom .
```

でカレントディレクトリをプロジェクディレクトリとしてエディタをひらけます。
VS Codeでもcodeコマンドがありますね。


私はPythonを書くときJetBrains製のIDE「PyCharm」を使っていますが、同じことをPyCharmでもやりたいです。

# 開発環境

* シェル bash
* MacOSX 10.11.6 (El Capitan)
* PyCharm 2017.1.2 Pro (Community版は未検証)

![charm.png](https://qiita-image-store.s3.amazonaws.com/0/67790/01a473b4-6887-6f52-434a-781f6a00fdc2.png)

![charm_dialog.png](https://qiita-image-store.s3.amazonaws.com/0/67790/0862153d-413f-ed2e-2a47-440938bbe0b0.png)

Tool > Create Command-line Lancher...

と選択すると、コマンドを置くパスを聞かれるのでデフォルトで問題なければOKとするとターミナルからcharmコマンドが使えるようになります。

```bash
# カレントディレクトリをPyCharmでひらく
$ charm .

# デフォルトのcharmコマンドの場所
$ which charm
/usr/local/bin/charm
```

charmコマンドでは差分をとることやマージもできるようです。
使うかと言われれば微妙ですが…

```bash
$ charm -h
Usage:
  /usr/local/bin/charm -h | -? | --help
  /usr/local/bin/charm [project_dir]
  /usr/local/bin/charm [-l|--line line] [project_dir|--temp-project] file[:line]
  /usr/local/bin/charm diff <left> <right>
  /usr/local/bin/charm merge <local> <remote> [base] <merged>
```


IDEなのでAtomやVS Codeほどの軽快さはありませんが、PyCharmをお使いの諸兄姉においては、ちょっとした手間が省けて便利かと思います！


### 補足

PyCharmの初期設定画面でcharmコマンドを入れるかどうかのチェックボックスがあるようです。そちらを使っても同じようにcharmコマンドが使えます。
ASP.NET Core 2.0 Razor Pages での部分ビューの罠

結論から
--
Visual Studioでそれっぽく新規作成した部分ビューはそのままでは使えません！！（一部誇張）
部分ビュー側の`@page`を削りましょう！

環境
--
- Visual Studio Enterprizer 2017 version 15.4.5
- .NET Framework 4.7.02556
- .NET Core 2.0

再現（序）：前準備
--
1. Visual Studioから新しいプロジェクトを作成
2. `Visual C#`＞`.NET Core`＞`ASP.NET Core Webアプリケーション`を選択
3. `.NET Core`＆`ASP.NET Core 2.0`＆`Web アプリケーション`（Razorの方）を選択
4. 適当な画面に適当に実装（例ではIndex）

```HTML:Index.cshtml
@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

Title:<input asp-for="Content.Title" />
Body:<input asp-for="Content.Body" />
```

```C#:Index.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace WebApplication1.Pages
{
    public class IndexModel : PageModel
    {
        public class MyContent
        {
            public string Title { get; set; }
            public string Body { get; set; }
        }

        [BindProperty]
        public MyContent Content { get; set; }

        public void OnGet() { }

        public IActionResult OnPost()
        {
            if (ModelState.IsValid)
            {
                //登録処理とか
                return Redirect("Welcome");
            }
            return Page();
        }
    }
}
```

再現（破）：部分ビュー作成
--
1. バインドしたモデルごと別の画面でも使えるので部分ビューとして切り出しを思い立つ
2. Pagesを右クリック＞`追加`＞`Razorページ`
3. 適当な命名で部分ビューを作成（例では_Common）
     
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78880/380f4fc6-9d55-1f49-460f-b9d15de057f6.png)

```HTML:_Common.cshtml
@page
@*
    For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
```

再現（急）：動かない！！
--
1. Indexの実装を_Commonに移植して呼び出し
2. エラー

```HTML:Index.cshtml
@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

@*Title:<input asp-for="Content.Title" />
Body:<input asp-for="Content.Body" />*@
@Html.Partial("_Common")
```

```HTML:_Common.cshtml
@page
@*
    For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
*@
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

@*Indexで使っていたModelClassを_Commonで使うために@model定義*@
@model WebApplication1.Pages.IndexModel
Title:<input asp-for="Content.Title" />
Body:<input asp-for="Content.Body" />
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78880/4acac2cb-f2d0-72c0-d149-a6732a166ffa.png)

解決
--
`_Common.cshtml`の１行目の`@page`を削りましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78880/f9fe392f-00b4-3e2b-7967-264e7885575f.png)

さいごに
--
やりたいことをふつーに考えて実行したら動かなくなるってのは、困りますね。
自動生成されるキーワードが何を意味するかのドキュメントも、MSDNに完全に整備されているわけではないですし。
この小さなTipsで誰か救われますよーに！
Django 参考記事

Djangoの学習を始めたので、参考になった記事をまとめます。

[Awesome Python：素晴らしい Python フレームワーク・ライブラリ・ソフトウェア・リソースの数々]
(https://qiita.com/h_digitalhearts/items/34c91d4ee0b54bd7cb8b)
Djangoに限らず

[Djangoを最速でマスターする part2](https://qiita.com/gragragrao/items/9a85a372a9c3eec06243)
Django Debug Toolbar について

[Django1.9 チートシート](https://qiita.com/narupo/items/cde99a79aec1963b52ce)

[Django入門は「 django Girls Tutorial」から手をつける](https://qiita.com/okoppe8/items/ca8479a700b746506f61)
[Django入門にはDjango Girls Tutorialがおすすめ](https://qiita.com/takechanman/items/d711e175b32f833c5e9c)
[Django Girls Tutorial](https://www.gitbook.com/book/djangogirlsjapan/workshop_tutorialjp/details)

[Djangoで、Djangoアプリ単体でのユーザ作成・変更・認証・パスワード変更・パスワードリセットを試してみた](http://thinkami.hatenablog.com/entry/2016/01/24/223846)

[naritoブログ Django](https://narito.ninja/blog/)

[すなぶろ django-rest-frameworkのチュートリアルを超意訳してみた。](http://sandmark.hateblo.jp/entry/2017/09/30/160945)

[Djangoで、CreateViewでPOST後に動作する、ModelFormやModelのバリデーションを試した](http://thinkami.hatenablog.com/entry/2016/02/18/215236)
Djangoのバリデーションについて

[Django 管理コマンド manage.py まとめ](https://qiita.com/okoppe8/items/7e3de8a4dd40b48debea)
画面が属するディスプレイ情報を取得する方法

下記のようにして取得可能。

```csharp
var screen = System.Windows.Forms.Screen.FromHandle(
    new System.Windows.Interop.WindowInteropHelper(window).Handle);
```

試してないけど、Windows.Formではこうするらしい。

```csharp
Screen OrenoScreen = Screen.FromControl(this);
```
Safari には、1970年以前のDateが西半球で1ミリ秒ずれるバグがある

Safari の JavaScript エンジンには、バグがあるようだ。

Safari では、時間帯が負の数のときに、
1970年以前の ISO 8601 (W3C DateTime) 表記の日時文字列を
Date に突っ込むと、時刻が1ミリ秒ズレてしまう。

```js
new Date("1969-12-31T23:59:59.999+01:00").toJSON();
// OK! => "1969-12-31T22:59:59.999Z"

new Date("1969-12-31T23:59:59.999-01:00").toJSON();
// NG! => "1970-01-01T00:59:59.998Z"
```

本来なら 59.999 秒のところ、59.998 秒となる。
きっと、計算途中で小数点以下の丸め誤差が発生しているんだろう。

|タイムゾーン|1970年以降|1969年以前|
|:--|:--|:--|
|+00:00 以上（東半球）|✅ 　OK|✅  　OK |
|-00:00 未満（西半球）|✅ 　OK|❌ 　NG | 

以下のコードでバグ有無を判別できる。→ [gist](https://gist.github.com/kawanet/4947237d84ba6efb16183ffcc23e982a)

```js
function checkDateBug() {
  var date = +new Date("1969-12-31T23:59:59.999-01:00");
  return date % 1000 !== 999;
}
```

JavaScript で 64bit の `time_t` とナノ秒を扱うクラスを書いています。
https://www.npmjs.com/package/timestamp-nano
Selenium GridのJMXサポート

この記事は[Selenium/Appium Advent Calendar 2017](https://qiita.com/advent-calendar/2017/selenium)の2日目の記事です。

こんにちは！
監視してますか！！ されてますか！！！
サーバーが落ちてたのに誰も気づかないで2ヶ月放置とかほんと勘弁してくださいよ！！！！

私は、Seleniumの新バージョンがリリースされたら、一応更新内容をざっとチェックするようにしているのですが、Selenium 3.8.0のJava部分の更新内容には今までにない項目があり目を引きました。

https://github.com/SeleniumHQ/selenium/blob/master/java/CHANGELOG

```Markdown
* Added initial support for managing Grid Hubs and Nodes via JMX
```

JMXだと？？？

Selenium 3.8.0から、Selenium GridがJMXをサポートしました
========================================================

誰得！？
GitHubのissueを見ると、たまに話が上がっていたようですが...

そもそもJMXとはなんなのですか
=============================

Javaアプリの状態をいろいろ管理するためのやり方についての公開規格です。
サーバーの状態を管理するのにSNMPを使ったりしますよね。あんな感じでJavaアプリの状態を管理するのにJMXを使うというわけです。

実際にJMXでSelenium Gridのハブとノードの状態を見てみよう
===================================================

現時点でどんな情報が見られるのでしょうか。
かんたんにできる範囲で、実際に試してみましょう。

## Selenium Gridのハブとノードを適当に立ち上げておきます

   この記事では、後でロールを判別しやすくするためのラベルとして、なるべくおいしそうなシステムプロパティを与えます。

```bash
$ java -Dロールケーキ=小山ロール \
       -jar selenium-server-standalone-3.8.0.jar \
       -role hub
```

```bash
$ java -Dロールケーキ=堂島ロール \
       -jar selenium-server-standalone-3.8.0.jar \
       -role node
```

## jpsコマンドで、Selenium GridのハブとノードのプロセスIDを確認します

`l` オプションと `v` オプションをつけておくとわかりやすくなります。

```bash
$ jps -lv

32999 selenium-server-standalone-3.8.0.jar -Dロールケーキ=小山ロール
33001 selenium-server-standalone-3.8.0.jar -Dロールケーキ=堂島ロール
```

見つかりました。おいしそうですね。

## jconsoleコマンドで特定のプロセスを監視してみます

まずハブのプロセスの方から見てみましょう。ラベルが小山ロールの方です。
なお、小山ロールはたっぷりのハチミツと卵黄を泡立てて、丁寧に空気を抱き込ませた生地をじっくり焼き上げ、しっとりときめ細やかなスポンジになっているそうです。 [^1]

```bash
$ jconsole 32999
```

何か言われてしまいますが、今回はちょっと確認したいだけなのであまり気にせず「保護されていない接続」で進めてしまいます。

![セキュアな接続が失敗しました。非セキュアで再試行しますか。](https://qiita-image-store.s3.amazonaws.com/0/33963/2b93eabd-9531-62db-639f-9874a09a15c5.png)

jconsoleの画面が表示されます。タブ「MBeans」をクリックしましょう。

![jconsoleの画面](https://qiita-image-store.s3.amazonaws.com/0/33963/8c4f1146-afd5-a411-6a2c-f925cd069966.png)

MBeansタブの左側には、監視可能な内容の一覧が表示されています。
 `org.selenium.grid` というのが、Selenium 3.8.0で新しく見られるようになった部分です。中身をのぞいてみましょう。

![MBeansタブ](https://qiita-image-store.s3.amazonaws.com/0/33963/53047a5d-466d-2087-6949-55ee328438b8.png)

オッ それらしいのがいろいろありますね〜
「Hub」がハブ自身の情報で、「RemoteProxy」が接続しているノードの情報となります。

![org.selenium.gridの中身](https://qiita-image-store.s3.amazonaws.com/0/33963/baa366ef-cff8-8c71-0c04-f98a22ae6bfc.png)

いずれの項目も昔から取得するためのAPIはあったのですが、JMX経由での取得が標準で可能になったことで敷居が下がったのではないでしょうか。
ZABBIXなどJMXを利用できる監視ツールと組み合わせて使うと、また一味違ったSelenium Gridの運用ができそうですね。

次にノードのプロセスの方を見てみましょう。ラベルが堂島ロールの方です。
なお、堂島ロールは北海道産の生乳を数種厳選し、世界でも類を見ない独自の製法で仕上げたオーダーメイドクリームが、搾りたてミルクのようなフレッシュな味わいだそうです。[^2]

```bash
$ jconsole 33001
```

おや？ こちらは何も見えませんね。
JMXサポートは、ハブの方を監視すればノードまで含めてすべて見られるように設計されているようです。

![ノード側の中身](https://qiita-image-store.s3.amazonaws.com/0/33963/aa3a654e-f419-f659-e84c-01c0c3ce6394.png)


今回はここまで
===============

次回は...誰かー！ 誰か来てくれーーー！！！
Selenium/Appium Advent Calendar 2017はまだまだ君の挑戦を待っているぜ！


[^1]: http://www.es-koyama.com/eskoyama/chefs_specialite/001.html
[^2]: http://www.mon-cher.com/dojima-roll-day/#products
計測器の画像にラベリングして学習し、画像から計測値を予測する

# はじめに

以下のURLで紹介している方法でラベリングをした画像を学習する手順を以下に記します。

[機械学習のための画像ラベリングを支援するWebアプリケーションを作ってみた](https://qiita.com/mix_dvd/items/00162baf77ab5cfc3e86)

# 環境

- MacBook Air
- Python3系
- SciKit-learn

# 使ったもの

- 100円均一のお店で買った重量計
- 長女（ラベリング作業）

# ソースコード

以下のスクリプトを作成します。

```py3:train.py
# ライブラリ読込
import cv2
import sqlite3
import numpy as np
import pandas as pd

from sklearn import model_selection
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor

# ラベルデータ読込
dbname = "param.db"
table = "param"
sql = "select * from {} ORDER BY id".format(table)

conn = sqlite3.connect(dbname)

df = pd.read_sql(sql, conn)
df.index = df.pop("id")

conn.close()

# 画像データ読込
images = []

for i, row in df.iterrows():
    
    idx = i
    
    filename = "img/{:03}.png".format(idx)
    img = cv2.imread(filename)
    img = img[row.top:row.bottom,row.left:row.right]
    img = cv2.resize(img, (100,100))
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, img = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY)

    images.append(img.flatten().astype(np.float32) / 255.0)
    
df_img = pd.DataFrame(images)

df = pd.concat([df, df_img], axis=1)

# 学習用データ作成
cols = df.columns.tolist()
cols = cols[4:]

df_train = df[cols]
df_train.shape

X = df_train[cols[1:]].as_matrix().astype("float")
y = df_train["val"].as_matrix().astype("int").flatten()

# テストデータの割合設定
test_size = 0.05

# 教師データを学習データと検証データに分割
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=test_size, random_state=42)

# 正規化
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

mlp = MLPRegressor(batch_size=20, max_iter=1000, random_state=42)

model = mlp

# 学習データを2倍にしてみる（不要）
#X_train = np.r_[X_train, X_train]
#y_train = np.r_[y_train, y_train]

# 学習と予測
model.fit(X_train, y_train)
print(model.score(X_test,y_test))
```

作成したら、以下のとおり実行。

```
$ python train.py
0.76047251454038367
```

できた(^-^)/

でも、精度が悪すぎるのでまだまだ工夫が必要ですね(-_-;)
RaspberrypiでSSHができなくて試したこと

久しぶりにラズパイいじって見よーと思ったらSSHができなくてビビりました．

で，基本的にはここを見てやりました．
https://qiita.com/Halhira/items/1da2ae543217be26988a

SSHがなぜかうまくいかなくて

```
$ ssh pi@raspberrypi.local
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:tkeCkp3+1TuManZJaXXeS3IiFq0ySSTElcKlUslay9g.
Please contact your system administrator.
Add correct host key in /Users/hayate/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/hayate/.ssh/known_hosts:18
ECDSA host key for raspberrypi.local has changed and you have requested strict checking.
Host key verification failed.
```
こんなわけのわからないものがぁ
どうやらSSHのホストキーが変わることが原因らしい．
SSHで接続するときにホストキーを再生成していたり、同じIPアドレスやホスト名だけど違うサーバに接続したり、再インストール後に接続したり、とにかくそういったときに表示されるメッセージだそうです．

いろいろ調べた結果前に接続したことがあるラズパイが原因みたい
ssh-keygenの-Rオプションでraspberrypi.localに属してるキーを全部削除して
```$ ssh-keygen -R raspberrypi.local```
接続し直すとうまくいきました．
 ```$ ssh pi@raspberrypi.local```
raspberrypi.localの部分はホスト名です
IFTTTでGoogleスプレッドシートに日時が書きだしできない時の対処法

Google Spread Sheetに書き出しする際、 {{CreatedAt}}のように日時パラメタを渡しても、ちゃんと書いてくれません。

調べたら同じ不具合を見つけた方がいて、対処方法を参考にさせていただきました。
https://do-gugan.com/~furuta/archives/2017/10/google-home_spreadsheet.html

## Google Spread Sheetの設定
上のページでご紹介されている動画のままやればできるのですが、英語なんで、一応自分がやったことを書いておきます。

スプレッドシート＞ツール＞スクリプトエディタを開き、
「無題のプロジェクト」を自分の好きな名前に書き換え、（この例ではRed Diet。）
任意の名前でfunctionを作成。（この例ではデフォルトの「コード.gs」で作成。）

![スクリーンショット 2017-11-30 2.22.45.png](https://qiita-image-store.s3.amazonaws.com/0/173392/c12823c0-f40d-3595-09c3-2d8b57aa469d.png)

```
function addDate(e) {
    var lr = SpreadsheetApp.getActiveSheet().getLastRow();
    SpreadsheetApp.getActiveSheet().getRange(lr, 1).setValue(new Date());
}
```

次に、トリガーを設定するため、時計のアイコンをクリックする。

![スクリーンショット 2017-11-30 2.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/173392/261ad6d4-b775-4dbf-62db-f7a64c26fdd9.png)

↓
ポップアップが開き、「トリガーが設定されていません」という文字の部分がリンクになってるのでクリック
↓
以下のように入力して「保存」をクリック
![スクリーンショット 2017-11-30 2.23.17.png](https://qiita-image-store.s3.amazonaws.com/0/173392/cda1ba24-b42d-4dfb-af09-91571caeb601.png)
↓
「承認が必要です」というメッセージが出たら、「許可を確認」をクリック
↓
危険を承知で続行しますかという画面がでる。自分の作ったアプリが指定されてるか、隅々までよく読みながら慎重に承認画面をいくつか進める。
↓
完成。
試しに、スプレッドシート上で、1行めのB列に適当な数字を記入して、エンターを押すと、１〜2秒経ってから、1行めのA列に、ふっと日時が表示されます。


早くこのバグが治ってくれますように！
heroku fork is deprecated and will be sunset 2017-12-01


本日 2017/12/01 を以て Heroku Fork は終了となります。

https://devcenter.heroku.com/articles/fork-app

## Heroku Fork ってなに？

似たような Heroku 環境を構築する時に便利なやつです。

````
$ heroku fork --from sourceapp --to targetapp
Creating fork targetapp... done
Copying slug... done
Adding heroku-postgresql:dev... done
Creating database backup from sourcapp... .. done
Restoring database backup to targetapp... .. done
Copying config vars... done
Fork complete, view it at http://targetapp.herokuapp.com/
````

`from` `to` を指定して新しいアプリケーションを構築します。

環境変数やaddonsがまるっとコピーされます。

## 今日からどうすんの？ 

今日から Heroku Fork が使えません。

適当に ua 環境とかサクッと作りたいときとかどうすれば…ってやつですが、幾つか方法はあるみたいです。

## Review Apps を使う

公式で推奨されている方法

紐付いている Github リポジトリに PR を投げるとそこ経由で App を立ててくれる。

https://devcenter.heroku.com/articles/github-integration-review-apps#review-apps-and-heroku-private-spaces

## Heroku Button を使う

これが一番ラクそう。詳細は過去記事のこちらを。

https://qiita.com/mikakane/items/f24a691b6d7360907870

## CLI Plugins

以下のプロジェクトを自分でプラグインとして利用することが出来る。

https://github.com/heroku/heroku-fork

````
$ git clone https://github.com/heroku/heroku-fork
Cloning into 'heroku-fork'...
remote: Counting objects: 946, done.
remote: Total 946 (delta 0), reused 0 (delta 0), pack-reused 946
Receiving objects: 100% (946/946), 165.68 KiB | 0 bytes/s, done.
Resolving deltas: 100% (411/411), done.
$ cd heroku-fork/
$ heroku plugins:link
Linking ~/heroku/heroku-fork...
Installing dependencies for ~/heroku/heroku-fork... done
$ heroku plugins
heroku-fork 4.1.25 (link)
````

動く限りはコレでもなんとか
Project Euler Q30 【各桁の5乗】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
驚くべきことに, 各桁を$4$乗した数の和が元の数と一致する数は3つしかない.
$1634 = 1^4 + 6^4 + 3^4 + 4^4$
$8208 = 8^4 + 2^4 + 0^4 + 8^4$
$9474 = 9^4 + 4^4 + 7^4 + 4^4$

ただし, $1=1^4$は含まないものとする. この数たちの和は $1634 + 8208 + 9474 = 19316$ である.

各桁を$5$乗した数の和が元の数と一致するような数の総和を求めよ.

## 解答

> 9^5が6つあっても100万いかないので6桁に収まる

引用元：http://kingyojima.net/pje/030.html

なんとなく分かったが自分の言葉にできるほど理解できなかったので引用させて頂く。

実際には最大の数字でも$194979$であった。

```bash
seq 999999 |
awk -v FS= '{s=0;for(i=1;i<=NF;i++){s+=$i^5;printf $i};printf " "s"\n"}' |
awk 'BEGIN{s=-1}$1==$2{s+=$1}END{print s}'
443839
```

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/030.html
Azure上のVMのNICをリセットする方法

# 目的
Azure上のVMをいじっていて、ネットワークアダプタの構成変更をしたらRDPできなくなった！ってのが背景です。
それを解消するために実施したことを記載します。


# そもそも
なぜそんなことになったのかというと、
Azure上でnestedhyper-vをためしていて、
nestのVMから外部接続を行うために、VM上の仮想NICと物理NIC（正確には仮想だけど）をブリッジ接続してみたら、つながらなくなりました。（あまり理解できていないですね。。。）


# 結論
NICの構成変更をしてやると、NICがリセットされ、RDPできるようになりました。

①Azureポータルから該当のVMのネットワーク⇒ネットワークインターフェイスを選択
②IP構成で、プライベートIPを静的＆別のIPに変更
③再起動後、RDP接続

# ボツ案
<d1><dt>RDP構成のリセット</dt><dd>Azureポータルからパスワードのリセット⇒RDP構成のリセットを実施しましたが、VM拡張機能のプロビジョニングがタイムアウトし、リセットできず。
もちろんVMにもRDPできない。</dd>
<dt>再デプロイ</dt><dd>Azureポータルから再デプロイを実行。
再デプロイ自体はうまくいきましたが、相変わらず接続できず。</dd></d1>




■参考
https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/reset-network-interface
Colaboratoryでローカルファイルの読み書き

Colaboratoryでデータを取得するにはいくつかの方法があります。
1. 数値を直接書き込む
2. HTTPでデータをダウンロードして取り込む
3. Google DriveのAPIを使用してデータを取り込む
などです。

自分の手元にある比較的大きなデータを扱いたいが、サーバーにアップロードしたり面倒な手続きを経て余計なAPIを使いたくない場合には、第四の方法としてローカルファイルの直接の読み書きを行うことができます。
以下の例ではファイル名をキーとしてファイルのバイナリを読み込みそのサイズを表示します。ファイル名にはディレクトリの名前を含みません。

```
import google.colab
for filename, contents in google.colab.files.upload():
    print('{}\t{} bytes'.format(filename, len(contents))
```

バイナリを内容に応じた形で処理するにはそれぞれのファイル形式ごとの方法をとることになります。

また、Colaboratoryの処理結果をファイルで得たい時はgoogle.colab.files.downloadを用います。

```
import tempfile
import google.colab

filename = tempfile.mktemp(".txt")
with open(filename, "w") as fo:
    fo.write("Hello Colaboratory File I/O.")
google.colab.files.download(filename)

```

この処理をすると自動的にファイルのダウンロードが始まってしまうので、ループで多数のファイルが作成されないように気をつけて下さい。
GraphQLを触って見た

一発目なので、ここ最近検証したネタから行こうと思います！

最近 WebAPI の世界でRESTfulとGraphQLの話がよく出てきます。
GraphQLの説明はいろんな情報がネットにあるので、
実際に仕事などで感じた事と比較して書こうと思います。

## RESTだと厳しくなってきた現状
- API利用側の要件増加
- 利用側がかならずしてもドメイン単位で、利用するとは限らない
- 通信コスト増加  (一部データの利用しかなくても付随データが通信上にながれる)
- endpointの増加  (要件ごとに増える)

![スクリーンショット 2017-12-01 1.06.04.png](https://qiita-image-store.s3.amazonaws.com/0/103324/81e5e12c-5e0c-f4dd-a725-299baf0db054.png)

## よく見られる現場での対応方法
- endpointを増やす
- endpointに必要になった段階で情報を増やす (マイクロサービスでなくなっていく。。。)
    - こっちの方が多そう

![スクリーンショット 2017-12-01 1.06.18.png](https://qiita-image-store.s3.amazonaws.com/0/103324/a6aebaef-0882-5eee-356a-65a3550e1d1e.png)

外向けに公開しない場合は、正直そこまで綺麗に分ける必要もないと思いますが、
通信コストと技術的負債の加速的な影響がありそうなので、できればキレイにしたいとこです。

# GraphQLとRESTfulの特徴の比較 (Queryのみ)
|               |   RESTful      |    GraphQL      |
|:--------------|---------------:|:------------------:|
| 条件付与   　　|  GETパラメータ | リクエストボディ(POST)     |
| エンドポイント |      複数       |      1つ       |
| スコープ       | ドメイン単位    |  関連データすべて |
| キャッシュ     |  responseキャッシュ|  データキャッシュ |

[[GitHub Developer]](https://developer.github.com/v4/explorer/) でexplorerが
利用できるので試してみるとイメージがつかみやすいと思います。

# GraphQLを体感してみる
[[GitHub Developer]](https://developer.github.com/v4/explorer/) でexplorerが
利用できるので試してみるとイメージがつかみやすいと思います。

# 実際のイメージ
[rubyplus](https://rubyplus.com/articles/4361-GraphQL-in-Rails-5)さんの記事をもとにサンプルを作ったので
画面で確認したいと思います。

記事につかったものは[github](https://github.com/feat-kj/graphql_sample)にあげてあります。

#### 階層がないパターン
<img width="929" alt="単層.png" src="https://qiita-image-store.s3.amazonaws.com/0/103324/31aaa3ed-1754-8fda-99df-b6e4b1bf9d72.png">

- Query
    - [allPeople]内で欲しい情報を定義しています [id, fullName] 
- Response
    - Queryで指定した[field]の値のみが返ってきています 
- Document
    - Queryとして実行できるものが表示されています。 

#### 階層があるパターン
<img width="1064" alt="改層.png" src="https://qiita-image-store.s3.amazonaws.com/0/103324/049db41c-f1c3-eedb-3681-b4a47c58148a.png">

- Query
    - [allPeople]内で欲しい情報を定義しています [id, lastName]
    - [friends]で異なる情報を指定しています[fullName] 
- Response
    - Queryで指定した[field]の値のみが返ってきています 
    - 階層化していした[friend]も指定した[field]の値のみが返ってきています.
- Document
    - People(Person)で取得できる[field]を見ることができます


# GraphQLを触って思ったこと
## メリット
- ドキュメントメンテしなくてよいので、運用や実装が楽
    - GraphQLのスキーマを定義するとExplorerで確認できる。  
- データアクセスが直観的で、ExplorerでQueryが試せるので開発効率がよさそう
- スキーマ設定がプログラム指定なので、メンテが楽(XMLとかよりは)

## デメリット (と言うか気になる点)
- サーバーサイド実装がちょっと大変になるかも
- Schema定義が肥大化しないアプローチは検討したい
- キャッシュのアプローチを検討
　(endpointが一つになるのでCDNが使えない？？)
- 見えてない課題もあるので、ちょっと一息

## まとめ
RESTとGrapQLの2択というよりは、お互いのメリットを生かして使っていければと思います。
大量データを返すAPI(肥大化したAPI?)を利用する場面が増えるかもしれないので
積極的に検証していきたいと思います。


次回はスキーマ定義や実装部分についてかければよいなと思います。
Elasticbeantalkでnginx.confの編集を避ける方法

<img src="https://qiita-image-store.s3.amazonaws.com/0/18168/b6c18072-63c9-34f3-908d-b238ad608e3b.png"/>

## ことの発端
ElasticbeanstalkのNode.jsプラットフォームを使ってデプロイする時に`.ebextensions`に`nginx.config`の設定を変更する処理を作成していたのですが、思ったようにnginxが起動しませんでした:sob:


デプロイ後の`nginx.config`を確認したところ、Elasticbeanstalkのスクリプトが設定ファイルを書き換えていたのが原因でnginxが起動していないことがわかったので、その時の回避方法をメモしておきます。

## 原因
Elasticbeanstalkの起動処理で、`/etc/nginx/nginx.conf`に`EB_INCLUDE`という文字列が含まれていない場合、Elasticbeanstalk用の設定をファイルに追記する処理が発生します。これが原因です。（`/opt/elasticbeanstalk/containerfiles/ebnode.py`）

<img src="https://qiita-image-store.s3.amazonaws.com/0/18168/fcabb546-63a4-85ef-d579-20f39a038e8a.png"/>< てへぺろ

## 回避方法
事前に`/etc/nginx/nginx.conf`に`EB_INCLUDE`という文字列を追加することで、この追記処理を回避できます。

```nginx:.ebextentions/00.nginx.config
files:
  "/etc/nginx/nginx.conf" :

    ...

    content: |
      # ebnode.pyの追記を避けるために、適当なところにEB_INCLUDEの文字を追加
    
    ...
    
```

本来ならこんな設定を書きたく無いので、暫定対応としてご活用ください :pray:
初心者のためのLinuxコマンド

## はじめに
HAL大阪WEB開発学科3年のoe kazumaです。
「HALAdventCalender」にはじめて参加させてもらいます！
Linuxコマンドって何？とか今、勉強しているけどコマンドなんだったけなって忘れてしまう人に読んでもらえたらなと思います。

## Linuxコマンドとは
WEBアプリケーションが動いている「サーバー」と呼ばれるコンピュータは、殆どがLinuxOSで動いています！
なのでWEBアプリケーションを公開する為には、Linuxを使わなければいけないということになっていくわけです。

Linuxの操作は基本的にマウスでポチポチカチカチと操作する**「GUI方式」**ではなく、黒い画面でコマンドを打って（キーボードだけで）作業していく**「CUI方式」**というものになります。

この**「CUI方式」**の操作を行うためにコマンドを使います。
マウスで操作する代わりに、コマンドでコンピュータに命令をして動かすイメージです。

そのためLinuxコマンドを勉強しておく必要があるというわけです！

それではさっそくコマンドの紹介をします。

## ディレクトリを作成する

```
$ mkdir ディレクトリ名
```


## ディレクトリを削除する
ディレクトリを削除の対象とする場合は、`-r`オプションを指定する必要があります。

```
$ rm -r ディレクトリ名
```

## カレントディレクトリの表示をする

```
$ pwd
```

## ディレクトリを移動する

```
$ cd ディレクトリ名
```

## 現在ディレクトリのファイル一覧表示する
`-a`オプションを付けると隠しファイルも表示されます。

```
$ ls
```

## 新規ファイルを作成する

```
$ touch ファイル名 
```

## ファイルを開く

```
$ open ファイル名
```

## ファイルの内容を閲覧する
閉じるときは`q`を入力

```
$ less ファイル名
```
## ファイルの内容を標準出力に出力する

```
$ cat ファイル名
```

## ファイルを編集する

```
$ vi ファイル名
```
**追加/挿入モード** iを入力する
**編集モード** escキー
**編集モード**から**コマンド・モード**へ移行するには「:」キー
**ファイルの読み込み・保存コマンド**
:w ファイルに保存する
:q viを終了する

## ファイルの移動をする

```
$ mv 移動したいファイル名 移動する場所
```

## ファイル名を変更する

```
$ mv 変更したいファイル名 新しいファイル名
```

## ファイルを削除する

```
$ rm ファイル名
```

## ファイルをコピーする

```
$ cp コピーしたいファイル名 コピーするファイル名
```

## 文字列を検索する

```
$ grep 検索正規表現 ファイル名
```

例：hogeディレクトリ内のファイルすべての中からaという文字を検索する場合。

```
$ grep a hoge/*
```
## 権限を設定する

```
$ chmod 権限 ファイル名
```

### ユーザーと権限を指定するもの
* 誰に u(所有者の権限), g(グループの権限), o(その他のユーザーの権限), a(すべての権限
)
* どのように +(後に記述した権限を付加する), -(後に記述した権限を削除する), =(後に記述した権限にする)
* どの権限を r(読み込み権限), w(書き込み権限), x(書き込み権限)

```
$ chmod u+x hoge
$ chmod a+w index.html
```
### 数字表記
* 権限によって数字が加算される
 * r = 4
 * w = 2
 * x = 1

読出・書込・実行が可能であれば 4+2+1=7
読出・実行が可能であれば 4+1=5
読出のみなら4 

```
$ chmod 777 hoge
$ chmod 655 index.html
```

## さいごに
Linuxコマンドは3年の11月頃から授業で習うので1年、2年から勉強しておくととても役立つと思います！
ここに書いているコマンドは初歩中の初歩なのでもっと詳しく知りたいならググったり本を読んだりすることをおすすめします！
後、勉強するときはコピペじゃなくて自分でコマンドを打ち込むことで覚えるので何回も練習してみましょう！
Project Euler Q29 【個別のべき乗】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$2 ≤ a ≤ 5$ と $2 ≤ b ≤ 5$について, $a^b$ を全て考えてみよう:
$2^2=4, 2^3=8, 2^4=16, 2^5=32$
$3^2=9, 3^3=27, 3^4=81, 3^5=243$
$4^2=16, 4^3=64, 4^4=256, 4^5=1024$
$5^2=25, 5^3=125, 5^4=625, 5^5=3125$

これらを小さい順に並べ, 同じ数を除いたとすると, $15$個の項を得る:

$4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125$

$2 ≤ a ≤ 100$, $2 ≤ b ≤ 100$ で同じことをしたときいくつの異なる項が存在するか?

## 解答

```bash
seq 2 100 |
awk -M '{for(i=2;i<=100;i++){print $1^i}}' |
sort -nu |
wc -l
9183
```

`-M`オプションが使用できない`awk`では計算結果が異なるよう。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/029.html
一攫千金プログラミング〜ボットdeジャックポットでブラックジャックを遊んだよ

# 背景

paizaさんから
<a href="https://paiza.jp/paizajack/">一攫千金プログラミング〜ボットdeジャックポット</a>というサービスが最近リリースされたんで遊んでみた。
ブラックジャックですね。

# ブラックジャック

多分ルールぐらいはエンジニアの皆さんなら知ってそうですが、
２１に数字を近づけるゲームです。
絵札は10としてカウントして
A(エース)は1or11としてカウントできるやつです。

二枚の手札が絵札と（１０もか）Aの組み合わせの時のみ、ブラックジャックとして
他の合計21よりも強くなり、倍率も変わったりします（だっけ？）

22越えた瞬間バーストで負け。

同数値ならばディーラー（親）の勝ち。

というシンプルなやつです。

# コーディング

これはpython3のサンプルコードなんですが、こんな感じ。
インプット情報が自分の手札だったり（後半は相手の手札情報だったり）する。
アウトプットで行動を決める。


```
# coding: utf-8
line_1 = input()
my_card = list(map(int, line_1.split(" ") ))

if my_card[0] == 0:
    print("1") # 賭けチップ数

else:
    if sum(my_card) < 10: # ★カードを引く条件の合計値を変えてみよう！★
        print("HIT") # カード引く
    else:
        print("STAND") # 勝負
```

これにやれ、Aが来た時はどうする（1として入力される）、や相手の手札よりすでに強かったらどうする、とか、今二連勝中だから勝負にでる、やら検討してやっていくわけです。
たぶん。

# 感想

### ※最初の３ステージまでの感想です

運ゲーかよ、と思うなかれ。（最初は運の要素も強いですが）
コンピューター（相手）にはある程度の法則があり
（ただ、ステージが進むにつれ強さが変わますが）
得られる情報も多くなる。
なので、ちゃんと命令しておけば、ほっておいてもコインが増えるようになります。

楽しくプラグラミングが学べるのでいろんな言語でちょこちょこやってみるのもいいんでないでしょうか。
自分のコードが自爆したりするので楽しい。

ブラックジャックなのでできることも限られているし、
考慮することも限られているので、おそらく中堅以上のプログラマーの方には物足りなくなるんでないでしょうか。（後半ステージはすっげえのかもしれないですが）
逆にプログラマー初心者〜中堅の方は楽しく学習できるかと思います。
上位の人のコードもコインで閲覧可能なようですし。

#　感想（要望寄り）
- なんかもっさりすることがあるので、高速に回したいなあ。
入出力だけの表示モードとか、何戦も連続でできるモードがあったら楽なんですが。  
（まあ、それだとほっとくとコイン数が跳ね上がるんで、性質上ダメですね）  
<br>
- 100戦連続の結果で勝負、とかいいんでないでしょうか？?
(勝率でランキング・・・まあ最後は運になりそうですが・・・）
<br>

- 入出力が常時画面上に出てると嬉しい。（試してないけど仕込めば出せるのかな？）
<br>

- なんでだろう・・・・小さい数字が連続しすぎることが多い。
手札が、3,1,1,2,2,4,5
とか何回か見たぞ。

では、昼休みも終わるんでこの辺で。

# 2017/12/04追記
ブラックジャックなのに負けた・・・
![スクリーンショット 2017-12-04 17.08.47.png](https://qiita-image-store.s3.amazonaws.com/0/105662/8b02f734-fc0e-9778-fd41-b07e5146df13.png)


# 参考
ここぞ
https://paiza.jp/paizajack/
Webページで画面サイズいっぱいのレイヤーを載せたい

半ば自分の備忘のため。

## ポップアップのレイヤー
ポップアップで何かコンテンツを表示するようなページで、
画面を暗くするために半透明のレイヤーを表示するとします。
（参考）[【JavaScript】ポップアップを自前で作ろう【HTML】](https://qiita.com/PG0721/items/1fe4cedc360d980e933c)

このとき、元のページが縦長・横長でスクロールが出ているとき、
レイヤーを出した状態でスクロールするとレイヤーが表示域までで切れてしまったりしました。

```css
height: 100%;
width: 100%;
```
これは元のbodyのサイズいっぱいでしかないわけです。

## スクロール幅いっぱいのサイズを取得する
そこで、JavaScriptで画面サイズを取得できないかとぐぐってみたところ…


```js
document.body.scrollHeight
document.body.scrollWidth
```
これでスクロールいっぱいのサイズを取得できました。

## 様々なサイズ取得メソッド
スクリーンのサイズ、表示内のサイズなど、様々な画面サイズ取得メソッドが以下にまとめられています。
[windowサイズ取得JavaScript関数](https://web-designer.cman.jp/javascript_ref/window/size/)
Project Euler Q28 【螺旋状に並んだ数の対角線】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
1から初めて右方向に進み時計回りに数字を増やしていき, 5×5の螺旋が以下のように生成される:

|<font color="red">21</font>|22|23|24|<font color="red">25</font>|
|---|---|---|---|---|
|20|<font color="red">$7$</font>|8|<font color="red">$9$</font>|10|
|19|6|<font color="red">$1$</font>|2|11|
|18|<font color="red">$5$</font>|4|<font color="red">$3$</font>|12|
|<font color="red">$17$</font>|16|15|14|<font color="red">$13$</font>|


両対角線上の数字の合計は$101$であることが確かめられる.

$1001×1001$の螺旋を同じ方法で生成したとき, 対角線上の数字の和はいくつか?

## 解答

```bash
seq -s" " 2 $((1001**2)) |
awk '{for(i=1;i<=NF;i++){printf $i" ";if($i==int(sqrt($i))^2 && ($i-1)%8==0){print ""}}}' |
awk 'BEGIN{s=1}{for(i=1;i<=4;i++){s+=$(2*i*NR)}}END{print s}'
669171001
```

2個目の`awk`ではそれぞれの週で何個目を取ればよいかを計算した結果、`2*i*NR`となった。計算する前は`2*(NR+(i-1)*NR)`である。


## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/028.html
Nuxt.jsのtypescriptにlintをかけたい

Nuxtを使ってるんだけど、.vueファイルをtypescriptを使っている場合にlintをかけるには何をしたらいいの？って話

Webpackにちょうどいいloader（[tslint-loader](https://www.npmjs.com/package/tslint-loader)）があってこれを噛ませればいいっぽい。

# 必要なもの
- [tslint](https://www.npmjs.com/package/tslint)
- [tslint-loader](https://www.npmjs.com/package/tslint-loader)
- typescriptが使えるようにセッティングされたNuxtのプロジェクト

# 設定
普通はwebpack.configに書くんだけど、Nuxtではwebpackの設定をNuxtが握っているため拡張する処理を書かなきゃいけない。ので、moduleを定義して設定を拡張させてみる。ちなみにベースとなってるのは[typescript-template](https://github.com/nuxt-community/typescript-template)なんだけど、最新のNuxtには追従してないみたいなのでちょっと修正加えている。

```ts:modules/typescript.ts
module.exports = function (options) {
  // Extend build
  this.extendBuild((config) => {
    config.module.rules.push({
      test: /\.ts$/,
      loader: 'tslint-loader',
      enforce: 'pre',
      options: {
        configFile: 'tslint.json',
        tsConfigFile: 'tsconfig.json',
      },
    });
    config.module.rules.push({
      test: /\.ts$/,
      loader: 'ts-loader',
      options: {
        configFile: 'tsconfig.json',
      },
    });
    for (const rule of config.module.rules) {
      if (rule.loader === 'vue-loader') {
        rule.options.loaders.ts = 'ts-loader?{"appendTsSuffixTo":["\\\\.vue$"], "configFile": "tsconfig.json"}!tslint-loader';
      }
    }
  });
};

```

これを、`nuxt.config.json`で渡してあげればOK。

CLIでlintだけ実行するにはどうするかまだわからないんだけど何か方法あるのかな。
ちなみにlintの定義は有名な[airbnbのやつ](https://www.npmjs.com/package/tslint-config-airbnb)使ってます。
PDFをブラウザで表示

# ソース

```php
$path_parts = pathinfo($pdf_path);

header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="' . $path_parts['basename'] . '"');
header('Content-Length: ' . filesize($pdf_file));
readfile($pdf_path);
```

# ポイント

`Content-Disposition`で`inline`と`filename`を設定してください。
これを設定しないとブラウザのPDFビューワーのダウンロードボタンで保存されるファイル名がデフォルトのものになってしまいます。

（ChromeとFirefoxは問題ありませんでしたが、これを設定しても、IE11はdownload.pdf、Edgeは無題.pdfになってしまいました。）
IEとEdgeの方のPDFビューワーからダウンロードする際の名前を設定するのは厳しいようです。

https://stackoverflow.com/questions/5478456/view-pdf-in-browser-but-save-with-wrong-file-name


# 関連

`Content-Disposition: attachment; filename="ファイル名.pdf"`でダウンロードさせる場合にIEは日本語ファイル名が文字化けする現象がありましたが、以下で対応できるとのことです。

https://qiita.com/takehironet/items/79c025e4140e29c57abe
スプレッドシートで管理するアラートシステム


研究室には喋れる Raspberry Pi がある。[研究室の Raspberry Pi \(1才2ヶ月\)に愛着が湧いている \- Qiita](https://qiita.com/elzup/items/baab23ed37000cdb7384)

院生室に移動してから maimai とはお別れしたので、初代ラズパイ (通称 maimai) に続き 2代目の neinei を作りました。

neinei の機能の１つにアラート機能があり、ゆっくりボイスで「お昼の時間ですよ」や「4限開始前です」など教えてくれます。
今回はそのアラートはスケジュールをスプレッドシートで管理出来るようにしたので、それについて話したいと思います。

# 管理方法

![nainai_alert_-_Google_スプレッドシート_and_TakayaSensorWare__production__–__jlog.png](https://qiita-image-store.s3.amazonaws.com/0/40717/642233b1-aa38-bf62-5ac2-0b86a5f8c93d.png)

こんな感じで管理しています。
定期的なスケジュールの定義方法は cron の記法を使いました。

# スプレッドシートをAPI化

Google App Script を使うことで Google Spread Sheet のデータにアクセスできるようになります。
[動的に表示したいコンテンツをスプレッドシートで管理する楽なモデル \- Qiita](https://qiita.com/elzup/items/25aaf88dfedbef013932)


# Raspberry Pi から読む


```py
# -*- coding: utf-8 -*-
import os
import subprocess
import datetime
import json
import requests
from say import say

home_path =  os.environ['HOME']
base_path = os.path.dirname(os.path.abspath(__file__))
data_path = os.path.join(base_path, 'data.json')
data_url = "https://script.google.com/macros/s/***** - API の URL"

def main():
    now = datetime.datetime.now()
    check = {
        'month': now.month,
        'day': now.day,
        'week': now.weekday() + 1,
        'hour': now.hour,
        'minute': now.minute,
    }
    # print(check)
    r = requests.get(data_url)
    data = r.json()
    for schedule in data:
        # month, day... それぞれの値についてチェック。空または現時刻と一致するか
        if not all([len(schedule[k]) == 0 or v in schedule[k] for k, v in check.items()]):
            continue
        say(schedule['message'])
        

if __name__ == '__main__':
    main()
```

力技ですがこれを cron で毎分呼び出してます。もっと長間隔で fetch してキャッシュデータを使うほうが理想です。
音声出力は aquestalkpi です。

# スプレッドシートを使うと面白い点
メッセージテキストに**スプレッドシートの演算**が使えます。
例えば

## 日付の計算
特定の日まであと何日なのかをスプレッドシートの関数を使って計算し、毎日カウントダウンさせたりできます。

![nainai_alert_-_Google_スプレッドシート.png](https://qiita-image-store.s3.amazonaws.com/0/40717/99ae6b27-92af-98e9-7238-e2fff5e8182d.png)
Android Things DP 0.6.0で追加されたcliツール pio を使ってLチカ/サーボぐりぐり


先日リリースされたDP 0.6.0には新たにCLIからGPIOなどを触れる`pio`が追加されました。
今回はこの`pio`を使って、コードを書かずにAndroidThingsからGPIO等などを触ってみたいと思います。

[PIO](https://developer.android.com/things/sdk/pio/pio-cli.html)

## 準備

`pio`は`adb shell`経由で利用します。
Android Thingsの場合`adb shell`を使うには`adb connect`する必要があるので、繋ぎます。

```bash
$ adb connect Android.local
```

## pioを触ってみる

### PINのリストを取得 `pio list [device]`

引数なしだと一覧が全て表示されます。

```bash
$ adb shell pio list
gpio BCM10
gpio BCM11
gpio BCM12
gpio BCM13
gpio BCM14
gpio BCM15
gpio BCM16
gpio BCM17
gpio BCM18
gpio BCM19
gpio BCM2
gpio BCM20
gpio BCM21
gpio BCM22
gpio BCM23
gpio BCM24
gpio BCM25
gpio BCM26
gpio BCM27
gpio BCM3
gpio BCM4
gpio BCM5
gpio BCM6
gpio BCM7
gpio BCM8
gpio BCM9
pwm PWM0
pwm PWM1
i2c I2C1
spi SPI0.0
spi SPI0.1
uart MINIUART
uart UART0
```

gpioのみなどdeviceを指定すると絞れます。

```
$ adb shell pio list gpio
BCM10
BCM11
BCM12
BCM13
BCM14
BCM15
BCM16
BCM17
BCM18
BCM19
BCM2
BCM20
BCM21
BCM22
BCM23
BCM24
BCM25
BCM26
BCM27
BCM3
BCM4
BCM5
BCM6
BCM7
BCM8
BCM9
```

## GPIOを触る(Lチカしてみる)  `pio gpio name subcommand [arg]`

以下のように配線します。
今回抵抗は330Ωにしました。

![raspi.png](https://qiita-image-store.s3.amazonaws.com/0/2965/41bdd229-f8cf-1606-9aec-44b7e5d75547.png "raspi.png")

gpioにwriteするには `pio gpio DEVICE_NAME write`コマンドを使います。

```bash
$ adb shell pio gpio BCM16 write 1
```

`pio gpio DEVICE_NAME read`すれば読み取れます。

## サーボを動かしてみる `pio pwm name subcommand [arg] [opt]`

次はサーボを触ってみたいと思います。
サーボを触るには`pio pwm`を使います。
~~おもったのですが... 今回リファレンスを読みながらpwmを触ってみたのですがどうやっても出来ません。~~
~~そのうち治ると期待したいですが、治すためにはまだOSアップデートが非強ですねきつい~~

~~issueは以下です。~~
~~https://issuetracker.google.com/issues/69986139~~
[2017/12/04 更新]
↑私のイメージが悪かったみたいです。 すみません。

配線は以下です。
![servo.png](https://qiita-image-store.s3.amazonaws.com/0/2965/dfbfd5da-dafd-0899-51d7-6e78cab5bcf0.png)

以下のコマンドでpwmを送れます。
`$ adb shell pio pwm PWM1 enable 1 --duty=55.0 --freq=200`

dutyはDutyのサイクル、freqは周波数です。


# まとめ

今後は簡単な確認なら`pio`ツールのみでよくなりました。
~~まだDP0.6.0が出たばかりなのでバグがある感じがしますが....~~
IoTシステム技術基礎検定を受けに行ってきます

#はじめに
明日（2017/12/02）、**IoTシステム技術基礎検定**を受けに行ってきます。
なんとか今日までテキストを読了しました。

#試験概要
IoTシステム技術　基礎検定　受検要項
http://www.mcpc-jp.org/iotkentei/kentei_msg_kiso/index.html

#検定時間
受付時間　09：00～09：30　 
事前説明　09：30～09：50　 
試験　　　09：50～10：50

#会場
9都市。
東京、神奈川（横浜）、愛知（名古屋）、
大阪、北海道（札幌）、宮城（仙台）、埼玉、広島、福岡

自分のところは、市のメイン駅から15分程度の所でした。
他の会場は公開されてないので受験者しか分かりませんが、
アクセスに不便な場所は選んでないかと思います…

北陸、四国とかはちょっと不便。

#費用
10800円（税込）
申込時に支払い済みなので不要。

#試験問題
マークシート60問を1時間で。
単純に考えて1問/分。
テキストを見る限り、数式を使った計算とかは基本出てこなそうなので、
ほぼ覚えているか否かの勝負になりそう。

#注意事項
　1.事前に会場へのアクセス方法、所要時間等をご確認ください。
　2.試験会場への直接の問合せは固くお断りします。
　3.試験会場では試験官の指示に従ってください。
　4.試験中はスマートフォン・携帯電話の使用を一切禁止します。
　　時計としての使用も出来ません。
　　会場内ではスマートフォン・携帯電話および、
　　その他の音の出る電子機器の電源はお切りください。
　5.特別の事情を除き、試験開始5分前までに入場しない場合は受検出来ません。
　　また、検定中の退場は認められません。

#持ち物
・受験票（PDF印刷または端末での画面提示。端末の不調に備え、印刷物推奨）
・身分証明書（免許証、社員証、学生証など）
・筆記用具（マークシート使用。HBのシャープペンシルか鉛筆、消しゴム）
・腕時計（会場によっては時計がない、鳴らないように）
#合否連絡
約4週間後、12/02の試験なら年末辺りに判明？

#関連リンク
[自分の勉強メモ]
(https://qiita.com/yamato031033/items/af01dae81e4c9cb1c128)　
[対応テキスト（白表紙、緑帯のほう）]
(http://www.mcpc-jp.org/iotkentei/text.html)
　
[基礎例題（問題）]
(https://qiita.com/yamato031033/items/af01dae81e4c9cb1c128)
[基礎例題（解答）]
(http://www.mcpc-jp.org/iotkentei/pdf/kisosampleanswer.pdf)　

（参考）中級のサンプル問題
[中級例題](http://www.mcpc-jp.org/iotkentei/pdf/sample.pdf)
[中級例題（解答）](http://www.mcpc-jp.org/iotkentei/pdf/sampleanswer.pdf)
centos7 yum updateでGPG Keysエラーが出た時

VagrantでCentos7.2をインストールし、環境構築のはじめにyum updateをしたところ以下のようなエラーが出た

```
warning: /var/cache/yum/x86_64/7/puppetlabs-pc1/packages/puppetlabs-release-pc1-1.1.0-5.el7.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID ef8d349f: NOKEY
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1 から鍵を取得中です。

The GPG keys listed for the "Puppet Labs PC1 Repository el 7 - x86_64" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.

 Failing package is: puppetlabs-release-pc1-1.1.0-5.el7.noarch
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1
```

以下で対応

sudo -i
curl -L https://yum.puppetlabs.com/RPM-GPG-KEY-puppet -o /tmp/RPM-GPG-KEY-puppet
gpg --with-fingerprint "/tmp/RPM-GPG-KEY-puppet"
cp /tmp/RPM-GPG-KEY-puppet /etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs-PC1
yum update

参考：http://deblock-technologies.com/centos-7-2-gpg-key-issue/
ジョブカン勤怠管理で疲弊しない

この記事は [SmartDrive Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/smartdrive) の1日目です。

# まえがき
## ジョブカンとは
勤怠管理ができるWebサービスです。
[No.1勤怠管理・シフト管理システム「ジョブカン」 クラウド勤怠管理システムの「ジョブカン」](https://jobcan.ne.jp)

他の勤怠管理サービスを使ったことがないので比較はできないのですが、一通り勤怠管理に必要な機能があるようでした。

## ジョブカンで出退勤するには
ジョブカンという勤怠管理サービスで出退勤するには通常以下の手順を踏む必要があります。

1. PC/スマホでログインページを表示する
1. ログインする
1. 出勤/退勤ボタンを押す

そんなに大変ではないけど、毎日やるの地味に大変ですね。
特に、「毎日決まった時間に出退勤する」or「時間だけ把握できていればいい」という場合にはなおさらです。

# ブラウザを使わずに出退勤してみる

例えばターミナルからコマンド1発でシュッと出退勤できたら楽ですよね。

[monoqlo/JobcanAuto](https://github.com/monoqlo/JobcanAuto) を使います。

パスワードの扱いがセキュリティー的にザルだったり、複数のグループを使い分けたい場合には使えませんが、とりあえずこんな感じで使えます。

```
# 出勤
$ ./jobcan.sh -c YOUR_CLIENT_ID -m monoqlo@hoge.com -p YOUR_PASSWORD -t start

# 退勤
$ ./jobcan.sh -c YOUR_CLIENT_ID -m monoqlo@hoge.com -p YOUR_PASSWORD -t end
```

単純なシェルスクリプトなので、何か適当にフックを用意してあげれば自動化できますね。
業務形態に寄ってはcron回して何時になったら出退勤とかでも良いですね。

※ 現状エラー処理は何もないので、インターネットにつながっていなかったとか、ジョブカンがエラー吐いた場合などは欠勤またはブラックな感じになります🙄

# あとがき
ガガガっと書ききった数日後にICカードリーダーで出退勤ができるようになったので、それが案外面倒ではなくて、JobcanAutoは現在積極的に利用していません😇
あと工数管理にも対応したかったけど面倒くさくて放置されています😞

ご利用は計画的に。

## あとがきのあとがき

 [SmartDrive Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/smartdrive) で埋まっていないところは記事書く余裕があればこんな感じでゆるく…
IoTシステム技術基礎検定 #16(Last)　この選択肢を並べてきそう

#はじめに
いよいよ、明日（2017/12/02）が試験本番です。
個人的に、**選択肢**で並べてきそうな用語をまとめてみました。
違いを理解しておくことが、出題されても慌てず対応できるカギになります。
**太字**が、特に注意が必要なもの。

#1章　IoTの概要を知る
M2M：CPS
IoTデバイス：IoTゲートウェイ：IoTサーバ
パブリッククラウド：プライベートクラウド：オンプレミス
**IaaS：PaaS：SaaS：BaaS**
クラウドコンピューティング：エッジコンピューティング

蒸気：電話、電力：インターネット：IoT
第1次産業革命：2次：3次：4次
**シェアリングエコノミー：フィンテック：テレマティクス：ブロックチェーン**

#2章　IoTデバイスを理解する
センサ：アクチュエータ
電気式：熱膨張式：熱電効果：赤外線
**ゼーベック効果：ペルティエ効果**
**GPS：SNSS**
オドメドリ：デッドレコニング
緯度：経度：高度：時間
CT：OCR：CG
カメラのF値を、小さく：大きく　すると、どうなるか

**VR（仮想現実）：AR（拡張現実）：MR（複合現実）**
光発電：熱発電：振動発電：電波エネルギー

垂直多関節（アーム）：水平多関節（SCARA）：直交（ガントリー）：パラレルリンク
コネクテッドカー：オートノマスカー：テレマティクス
**自動運転レベルの、０：１：２：３：４：５**

#3章　IoTにおける通信方式を知る
**IoTエリアネットワーク（LAN）：WAN：PAN**
**有線通信：無線通信**
**PLC：WAN：FTTH：ADSL：ZigBee：Bluetooth：IrDA：LTE：3G**
Bluetooth：IEEE802.15.4：920MHz特定小電力無線：RFID/NFC

**無線LAN：Bluetooth：ZigBee：Wi-SUN：Z-Wave：NFC：IrDA：ECHONET**
**HEMS：MEMS：FEMS：CEMS：（MEMS）**

**VoLTE：LPWA**
**LoRaWAN：Sigfox：3GPP：LTE Cat.xx：LB-IoT**
**免許の　いる：いらない　LPWA**
微弱無線局：特定小電力無線局：小電力データ通信システム：簡易無線局
**HTTP（REST）：CoAP：MQTT**
パブリッシャー：サブスクライバー：ブローカー：トピック
#4章　モバイル環境とその活用を知る
LTE：5G
**スマートデバイス：ウェアラブルデバイス**
腕時計型：メガネ型；リストバンド型
無線LAN：ビーコン：可視光：PDR（デッドレコニング）：IMES
動的：准動的：准静的：静的
モバイル：路車間通信：車車間通信
#5章　IoTでデータを活用する
**Ploblem：Plan：Data：Analysis：Conclusion**
分散：平均：標準偏差
**正規分布：相関分析：回帰分析**
**機械学習：教師あり学習：教師なし学習：強化学習：深層学習**
学習フェーズ：識別フェーズ
#6章　プロトタイピングを知る
パーソナル・ファブリケーション：メイカー・ムーブメント
プロトタイピング：従来の製品開発
ハッカソン：アイデアソン：クラウドファンディング
RaspberryPi：Arduino
GPIO：PWN
オープンラボ：ファブラボ
#7章　情報セキュリティを知る
**リスクの、回避：低減：移転：需要**
物理セキュリティ：論理セキュリティ（システム、人材）
ホワイトリスト：ブラックリスト
インターネットVPN（IPsec,SSL）：IP-VPN(MPLS,VLAN)
DoS攻撃：標準化攻撃：ソーシャルエンジニアリング：ショルダーサーフィン

**MDM：MAM：MCM**
セキュアブート：HSM：ARM　TrustZone
#8章　IoTのエコシステムを知る
IoTサービス利用の留意事項、機能：費用：制度
セルラー系（3GPP）：非セルラー系
Nucoアドベントカレンダーと機械学習案件の注意点について

# Nucoアドベントカレンダー
株式会社Nucoは企業様に対して機械学習システム導入のお手伝いをさせて頂いてます。

自然言語処理、画像処理あたりがメインです。
本番環境へ組み込むためのインフラやWebシステムの開発もやってます。
といっても、まだ社員は3人+入社予定1人しかいません。
アドベントカレンダーにチャレンジした理由は、こんな少人数な会社でアドベントカレンダーやったら、おもしろいかな、くらいの理由です。
機械学習以外の内容も多分書かれるんじゃないかな、と思いますが早速始めていきます。


# 機械学習案件の注意点
設立から間もないですが、いくつかお仕事させて頂いたり、相談頂く中でこんなことに注意した方がいいんじゃないのかな、と思うことをシェアさせて頂きます。

##　KPIを確認する
ご相談頂く中で1番最初に確認するのは、機械学習をシステムに導入することによって達成したいKPIです。
これを確認することで、『AI使って○○したいんだけど～』みたいな~~地雷~~失敗しそうな可能性の高い相談を排除したり、お客様をよりよい方向に導くことが出来ます。

機械学習を使おうが使わまいが、手段と目的を逆にしてしまった場合その計画は破綻します。
AIを使うこと自体が目的になってないか、そもそも何を達成したいのかを確認しましょう。
~~あとAIっていう言葉使うのヤメテ~~


ま、機械学習に限らずですね。


##　データの形式を確認する
これに関しては完全に私が悪いのですが、以前こんなことがありました。

お客さん『こんなデータ（CSV）なんですけど、人手でやってる分類を自動化したいんですよー』
僕『ほうほう、ふんふん。はい、大丈夫そうです。とりあえずどの程度精度がでるか一旦検証してみましょう。御見積出しますね。』
お客さん『おっけー』
僕『データはこれで全量ですか？』
お客さん『これはサンプルデータで一部になります。全量は渡すのは時間かかるので、今度でいいですか？』
僕『サンプルデータでも十分な量あるので、大丈夫と思います。』


～～前処理実装～～
～～分類器実装～～

僕『こんな感じになりました～。テストデータでの精度がこんなんで～（略』
お客さん『おお！これは使えそう！』
僕『本番データもらえたら、そっちで学習と予測やってみますよー』
お客さん『おｋやで～。FTPサーバの情報おくるで～。』
僕『おｋやで～』

～～ファイルローカルで確認～～

僕『あれ、サンプルデータと全然ちゃうやんけ！』
僕『これどうなってるんですか？』
お客さん『DBからの生データはこれなんですよー』
僕『ひぇっ…』

どうやら本番のDBは、正規化されておらず。下記のようなDB構造になっていた。（実際とは異なりますがイメージはこんな感じです。）


| ID       |       USER_ID |    KEY    | VALUE |  
|:----------------:|:-----------------:|:------------------:|:------------------:|
| 000001             |              0000001 |        name        |　ほげ太郎 |
| 000002           |            0000001 |       登録日       | 20171201  |
| 000002             |              0000001 |        ○○Flag        | 1 |
| 000003           |                0000001 |         最寄り駅         | 13392  |
| 000004              |             0000001 |       地域       | 1239 |

サンプルデータはなぜかきれいにUSER_ID毎に各カラムの値が一行に収まっていたが、
本番データはそうではなかった。しかもNullableなデータはレコード自体が存在していない場合もあったり、
まあ、細かいことは良いとして、とにかく本番データとサンプルデータの形式が全然違っていた。

しかも謎に同じような構造の他のテーブルがあって、そっちにも同じユーザーの他のデータがあったりと、なかなかつらみの深いデータ構造だった。

事前に確認しなかった僕が悪いのだが、
ここから徹夜でデータ構造を変換するプログラムを書く羽目になって、
ちょっと大変な目にあった。

# 最後に
他にも機械学習案件進めていく上で、
注意点はたくさんありますが、一日目はここまでにしましょう！
他のメンバーが書く記事も是非読んでください。
[PHP] LINE Messaging API を使ったチャットボットをテストしてみた

この記事は、[NIFTY Advent Calendar 2017](https://qiita.com/advent-calendar/2017/nifty)の1日目の記事です。

ニフティでエンジニアをしていますkiwiです。
niftyアルバイトというサービスで、LINE Messaging APIを活用したチャットボットを今年リリースしました。

このボットは、特定の文字列やパターンに反応してタスクをこなす「人工無能」と呼ばれるタイプです。意味解釈などは実現できていませんが、それでも現時点できちんと使えるボットになっている（と思います）。

さて、このようなチャットボットを開発する際には、「Aというメッセージが届いたら、Bというメッセージを返す」というテストや動作確認がしたくなります。

実際に正しく受送信できるかどうかは、サーバにデプロイし、LINEアプリからメッセージを送信して確認することになりますが、簡易的にテストできるような仕組みがあっても良いかなと思い、作ってみることにしました。

<img width="580" alt="テスト結果スクショ" src="https://qiita-image-store.s3.amazonaws.com/0/43540/f712c56a-fa89-0a79-f7ef-475c3a511203.png">

## 作成したもの

line-bot-test-helper
https://github.com/kiwi-26/line-bot-test-helper

### 中身

- ユーザーからメッセージが送信されたとき、LINEサーバから送信されるJSONを作成できる`WebhookEvent`
- `HTTPClient`として動作し、getやpostされたリクエストをサーバに送信せず内部に溜めておく`StockHTTPClient`

ただし（記事執筆段階では）`WebhookEvent`については、Webhookイベントのうちテキストメッセージのみ実装されています。

### 使い方

composer 経由で導入できます。

```bash
composer require kiwi-26/line-bot-test-helper --dev
composer update
```

たとえば、「メッセージを受け取って次の応答を送信する」ような処理（下のコードでは`MessageHandler`）に対して、こんな感じのテストができるようになります。

```php
public function testReply()
{
    $channelToken = env('LINE_CHANNEL_TOKEN', 'sample-token');
    $channelSecret = env('LINE_CHANNEL_SECRET', 'sample-secret');

    // LINEから受け取る（想定の）メッセージを作成
    $source = WebhookEvent\EventSource::user('dummy-user-id');
    $event = new WebhookEvent\TextMessageEvent($source, 'test message', $channelSecret);
    $client = new StockHTTPClient($channelToken);

    // テスト対象。LINEからのWebhookリクエストをパースし、応答の送信まで行っている
    // 引数: RequestBody(string), Signature, HTTPClient
    $handler = new MessageHandler($event->body(), $event->signature(), $client);
    $handler->handle();
    
    // アサーション
    $this->assertEquals(count($client->queue), 1);
    $this->assertEquals($client->queue[0]->body['messages'][0]['type'], 'text');
    $this->assertEquals($client->queue[0]->body['messages'][0]['text'], 'reply text');
}
```

サンプルは以下のリポジトリです。
https://github.com/kiwi-26/line-bot-test-helper-sample

メッセージを受け取り、次の応答を送信する[MessageHandler](https://github.com/kiwi-26/line-bot-test-helper-sample/blob/master/app/MessageHandler.php) では `parseEventRequest` メソッドを使っていますが、テストでも実際にLINEからメッセージが来たときと同じようにイベントをパースすることが可能です。

`StockHTTPClient`については、これを使って初期化した`LINEBot`で行われるメッセージ送信（`replyMessage()`など）を、すべて`queue`という配列に入るようにしてあります。処理が完了後、意図したメッセージ送信が行えているかの確認が可能です。

### 今後の主な課題
#### `WebhookEvent`
- テキストメッセージにしか対応していないので、それ以外のイベントに対応する
- イベントが複数同時に入っているケースを作成できないので、作成できるようにする

#### `StockHTTPClient`
- `queue`の使い勝手が悪すぎる(assertしづらすぎる)のでどうにかする

## 以下感想
サンプルではHandlerにpostのbody部やシグネチャ、HTTPClientを渡しており、若干不自然かなという作りになってしまいました。責務が大きすぎる気がなんとなくしています。

また、自分が欲しいと思ってライブラリを作ったつもりだったのですが、特に`StockHTTPClient`については（設計・実装にもよりますが）単体テストでまかなえる部分が大きそうです。
`WebhookEvent`については、受け取ったメッセージによる分岐などのテストに利用できそうだなと思っており、その他のWebhookイベントについても早めに揃えたいなと思っています。

## 最後に

OSSのライブラリを作ったのは初めてですが、サンプルを作って実際に使ってみないと気づけないことが多く、作る側にとってもサンプルって大事だなと実感しました。GitHubのほうはREADMEも整えられていないので、引き続き改修していきます。

なお、本文中のコードは執筆現在（v0.1.0）のものです。最新の利用方法については、リポジトリのREADMEをご覧ください。

2日目の明日は @hicka04 さんの記事です。お楽しみに！
Counterparty の周辺をざっくり解説してみる

一日目なので、いきなりコーディングに入らず、肩慣らしから。

## そもそも Counterparty ってなに?

Counterparty は、仮想通貨 Bitcoin のブロックチェーンを使って独自の通貨(トークン)を発行し、またそのトークンを使った経済圏を作るためのフレームワークです。

全てのソースコードは、[GitHub 経由で入手](https://github.com/CounterpartyXCP)できます。

今のところ、トークンの送付、分散取引所 (DEX)、賭け事 (Binary bet) 、テキストメッセージのブロードキャスト配信、トークン保持者に対する配当等ができます。

かつては、Ethereum の実行エンジン EVM を移植したスマートコントラクトの試験実装が行われていましたが、開発中止が決定され、[2017年11月に削除されました](https://github.com/CounterpartyXCP/counterparty-lib/pull/1016)。(残念)

### Qiita なのでコードに関わる情報を…

具体的にどんなことができるのかは、[ドキュメントの create_ 系 API](https://counterparty.io/docs/api/#actionwrite-api-function-reference) を読むと解ります。

## そもそも Monaparty ってなに?

Monaparty は、Counterparty のソースコードを基に、使用するブロックチェーンを Bitcoin から Monacoin に変更したものです。Monaparty も Counterparty と同様に [Github からソースコードを入手](https://github.com/monaparty/)できます。 [^burn]

[^burn]: しかし2017年12月1日現在、全てのソースコードがcommitされていません。2017年中に全ソースコードが commit され docker イメージとしての配布も開始される予定です。

## なんで Counterparty があるのに Monaparty が登場したの?

Monaparty の開発者が、モナコイナーだからっぽいです。冗談です。

Counterparty は Bitcoin のブロックチェーンを使っているため、Counterparty が提供する機能を使うたびに Bitcoin の送金手数料がかかります。
昨今の Bitcoin ブロックチェーンの混雑により送金手数料が高騰し、「100円相当のトークンを送るために1000円の送金手数料を要する」というような状態に陥っています。

一方、Monacoin は、オフチェーンのサービスが多く、ブロック生成間隔が Bitcoin よりも短いため、ブロックチェーンはスカスカです。また、Monacoin は Bitcoin よりも3桁以上安いので、対円での送金手数料も低くなります。

使いやすく高性能のトークンプラットフォームを目指して Monaparty は移植されました。

## どういう原理になっているの？ ブロックチェーンを使わず説明してよ

(以下、単に Counterparty や Bitcoin と記した場合には、Monaparty や Monacoin にも当てはまります。)
 
ブロックチェーンに関する細かいことを省いて説明すると、Counterparty はキューイングされたメッセージにより状態遷移する処理系です。

Counterparty を使うアプリは create_* 系の API でメッセージを作り、それをキュー(実際はブロックチェーン)に積んでいきます。

Counterparty のコアは、データベース(実際 sqlite3 です)を持っていて、キューに貯まっているメッセージを古い順から読んでデータベースの情報を書き換えていきます。

この設計は、Bitcoin のブロックチェーン上に構築されているものの、むしろライバルである Ethereum に近いです。実際、Counterparty の公式 Slack では、開発者たちが「Ethereum に近いけど、違うのはコントラクトがハードコードされていることだね。だから Ethereum よりも安全(ユーザ作成コントラクトのバグで GOX したり資金凍結になったりするリスクが低い)」と説明している場面をしばしば見かけます。

## Bitcoin を直接使うアプリと比べて難易度はどうよ？

Counterparty には JSON と REST の API が用意されています。Bitcoin-core にも JSON API がありますので、この点では互角です。

しかし、データの実体がブロックチェーンではなく構造化されたデータベースに格納されているので、参照系の API は Counterparty のほうがかなり楽です。
別記事で解説しますが、(高機能 NoSQL によくある) JSON を使ったクエリ言語を含められる API もあります。

Counterparty の内部状態に影響を及ぼす API も、Counterparty のほうが楽かもしれません。

Bitcoin を使ったアプリケーションの場合、たかが送金だけで「utxo をかき集めて、お釣りを設定して未署名トランザクションを組み上げて」のような手順を踏む必要があります。
一方、Counterparty の場合は、未署名トランザクション署名の組み上げまでの面倒を API で見てくれます。

秘密鍵管理やトランザクション署名等の、暗号通貨特有の面倒なところは Counterparty API を使ったアプリにもあるのですが、薄いライブラリに隠蔽可能なレベルです。

## まとまっていないまとめ

Advent calendar 初日ということで、コードに深入りせず、概観の説明としました。
もし「これがわからん」ということがありましたら、コメント頂ければ本記事を修正するなり、別記事を立てるなりいたします。