OmniAICreator/Qiita-1.07M huggingface dataset:
JavascriptからSlackにスニペットを投稿する

GreasemonkeyやtampermonkeyのスクリプトからSlackにスニペットを投稿しようとしたら色々はまったのでまとめておきます。別に短い内容なら、普通に`chat.postMessage`のAPIでいいんですが、内容がながいと受け付けてくれないので`files.upload`を使う必要があり嵌ってしまいました。

## やりたかったこと

* ブラウズしているサイトの任意の要素のテキストをSlackへ投稿
* ファイルは生成せずに、投稿内容はスニペットとする

Slackのfiles.uploadには`file`と`content`という属性があり、`content`にスニペット内容を指定すればファイル生成せずに利用できます。

### slack api tokenの発行

https://api.slack.com/custom-integrations/legacy-tokens

からTokenを発行しておきます。

### Ajaxで投げるスクリプト

Ajaxで投げる際はfetchを使用しましたが、jQueryでもなんでも大丈夫でしょう。結論としては**JSON形式ではなくFormDataとしてちゃんとなげる必要があった**ということです。

コードは以下になります。TokenとChannelだけ書き換えれば動きます。


```javascript
const SLACK_TOKEN = 'YOUR_TOKEN';
const CHANNEL_NAME = 'YOUR_CHANNEL';
const SLACK_POST_URL = 'https://slack.com/api/chat.postMessage';

const data = {
    token: SLACK_TOKEN,
    channels: CHANNEL_NAME,
    title: "スニペットタイトル",
    filename: "sample.txt",
    content: "投稿内容",
    initial_comment: '投稿時のコメント',
};

// formDataの組み立て
const formData = new FormData();
for(let key in data){
    formData.append(key, data[key]);
}

fetch(SLACK_UPLOAD_URL + '?token=' + SLACK_TOKEN, {
    method: 'POST',
    body: formData,
}).then((response)=>{
    return response.json();
}).then((data)=>{
    console.log( 'Can I post to Slack? :' + data.ok );
    console.log(data);
    if (data.ok ){
        alert("SLACK への投稿が完了しました");
    }else{
        alert("SLACK への投稿が失敗しました:" + data.error);
    }
}).catch((data)=>{
    console.error(data);
    alert('error:' + data);
});
```

あとはこれをベースに、`const data `内で指定している内容を置き換えるような処理をかけば好きな内容をSlackに投稿できるようになります。
汎用LED MATRIX DISPLAYを、ラズパイで使ってみる1

Raspberry Piと、汎用なRGBマトリクスLEDパネルを使って。
こんな、壁掛け温度計を、作る記事です。
![DSC_0279.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/c037296a-c158-a03c-efbd-210dda1068ae.jpeg)

書き散らしてたら、複数記事になっちゃったので、ここにポインタ、置いておきます。
その１：https://qiita.com/eucalyhome/items/e871e297bfd527ccaf2c
その２：https://qiita.com/eucalyhome/items/dbcb2404c53585ecec8a
その３：https://qiita.com/eucalyhome/items/bb578b9e7accb947e61d
その４：https://qiita.com/eucalyhome/items/84a90883cb16c58dadb2
その５：https://qiita.com/eucalyhome/items/2856f6d6a3dd36d36b9d


はじめまして。
eucalyptus.[ゆうかり]と申します。
ま、元電気屋、今はてきとーなIT屋さん、してますー。

さて。

最近めっきりお部屋が寒くなり、暖房投入判断を迷うようになり。
それなりに精度のある温度計を、壁に欲しいなと。

まあ、温度計自体は適当に３線シリアルだのI2Cだのでイケそうなのですが。
問題は、「壁掛け」。
でっかい７セグだのは、意外と取り回し面倒くさいし、まさか普通の液晶を壁掛けなんてカッコワルイ真似したくないし。
プロジェクタ？だのいっそのこと針式アナログ？とかもアレしたのですが。

Amazonぼーっとみてて。
ステキデバイスを発見。
![Image4.png](https://qiita-image-store.s3.amazonaws.com/0/216885/2ddf9d60-7d41-b354-a6f1-8985283d2752.png)
３０００円ちょいで、フルカラーRGBだなんて、ステキじゃない？。
Arduinoでも使えばいけそうだしね。

で、まあ、勢いで買っちゃったワケですが。
まあこいつ、汎用品みたいで。
中国あたりで、「P3」だの「P4」だの言われる、シリーズみたいです。

解像度低いのはAdafruitでも扱っており、みんな大好き秋月にも、転がっています。
![Image6.png](https://qiita-image-store.s3.amazonaws.com/0/216885/2c107036-f750-45da-4867-16b19acd55d9.png)
http://akizukidenshi.com/catalog/g/gM-07764/

まあ、アキバだのにある、LED屋さんで扱っているのも、同じよーなもんでしょう。

さて。
こいつですが。
１６ピンのフラットケーブルで制御を渡し、まあLEDの塊なので、5Vの電源線を別途付けるのが基本フォーマットみたいです。
１６ピンフラットケーブルは、数珠繋ぎできるようINとOUTがあり、電源線はVHコネクタだったり、ファストン端子だったり、ネジ止めだったりするみたいです。

ま、裏は、こんなかんじ。
![DSC03444.jpg](https://qiita-image-store.s3.amazonaws.com/0/216885/a8abb7fe-9d8a-9c33-eed1-fdf829b9221b.jpeg)
キットにもよるとは思いますが、オイラが入手したのは、フラットケーブルとVHケーブルが、付属しておりました。

で、制御方法を軽くぐぐってみたら。
ラズパイ用のライブラリがありました、とさ。
https://github.com/hzeller/rpi-rgb-led-matrix

実際作ってる人がいて、まあ参考に。
http://a-tak.com/blog/2017/03/05/raspberry-pi-led-clock-4/

ただ、このライブラリ、BCMライブラリでガッツリハードコーディングしてあるので、Raspberry Pi以外（nanopi）とかは厳しそうな印象です。
実はnanopiを衝動買いして、使おうかと思ったのですが、、、まあこの辺弄ればなんとかなるかも知れません。

```c:/lib/hardware-mapping.h
    .output_enable = GPIO_BIT(18),
    .clock         = GPIO_BIT(17),
    .strobe        = GPIO_BIT(4),

    /* Address lines */
    .a             = GPIO_BIT(22),
    .b             = GPIO_BIT(23),
    .c             = GPIO_BIT(24),
    .d             = GPIO_BIT(25),
    .e             = GPIO_BIT(15),  /* RxD kept free unless 1:64 */
```

さ、次は、繋げてみますよ。

続き：https://qiita.com/eucalyhome/items/dbcb2404c53585ecec8a
PHPで数字を0埋めして桁を揃える

うーーーん。。str_padよりsprintfの方が読みやすいかな。(他の言語でも標準的だし)

## `str_pad`を使う

http://jp2.php.net/manual/ja/function.str-pad.php

```php
$i = 1;
echo str_pad($i, 10, '0', STR_PAD_LEFT);
// 0000000001
```

第4引数をSTR_PAD_LEFTに指定すると、埋める場所が左側になるのでそれっぽい感じに。

## `sprintf`を使う

%dに、0(０で桁埋めする)と10(桁にする)オプションを指定してフォーマットする。

```php
$i = 1;
echo sprintf('%010d', $i);
// 0000000001
```
高エネルギー効率プログラミング言語C

International Conference on Software Language Engineering(SLE) 2017年採択ペーパー "[Energy Efficiency across Programming Languages -- How Do Energy, Time, and Memory Relate?][sle]" の雑な紹介。

（要旨/Abstractより抄訳）

> 本稿では、良く知られた27種類のプログラミング言語毎のメモリ使用やエネルギー消費といった、実行時における調査結果を示す。10種類の異なる問題をそれぞれのプログラミング言語によって実装し、それらのパフォーマンスを測定する。結果は興味深いものであり、遅い／速い言語ほど少ない／多いエネルギーを消費し、またメモリ使用量がエネルギー消費に影響を及ぼすことが明らかとなった。エネルギー消費量が重要な状況において、ソフトウェア技術者がプログラミング言語を選定する手助けとして、この調査結果の活用方法を示す。

簡単に言ってしまえば、「実行時効率が良いプログラミング言語はどれ？」への回答（の一つ）です。評価の観点は3つ：

- エネルギー(Energy)： 低消費電力ほど望ましい。地球に優しく。
- 時間(Time)： 短時間ほど望ましい。"速さ"は正義。
- メモリ(Memory)： 低使用量ほど望ましい。メモリは有限資源。


詳細は[ペーパー本文][paper]や[補足サイト][site]に譲り、ここでは各観点でベスト3を取ったプログラミング言語を見てみましょう：

|順位|エネルギー|時間|メモリ|
|:---:|:---:|:---:|:---:|
|1st|**C**|**C**|Pascal|
|2nd|Rust|Rust|Go|
|3rd|C++|C++|**C**|

やはり C言語 は強い。3部門全てで入賞しています。

> ？？「C言語最強とあまりいうと他の一般プログラマ言語が嫉妬するのであまり連呼すべきではない マシンを支配する能力はすばらしいがそれも他のプログラマの人がやさしくフォローしているおかげ おれの知っているC言語そうやっていつも謙虚にUB(未定義動作)でも実行していたので人望もすばらしかった」[^1]

[^1]: ブロント様言行録 [一般的に言ってナイトが最強か](https://www7.atwiki.jp/buront/pages/56.html) >> 39 より

絶対王者 C を除くと、古参のプログラミング言語（C++とかね）を抑えて [Rust言語][rustlang] や [Go言語][golang] が2位になった点は注目に値すると思います。2つとも今まさに“ホット”なプログラミング言語ですね！今年(2017)のAdvent Calendarも大盛況ですから、興味を持った方は覗いてみるのはいかがでしょう。

- [Rust関連のAdvent Calendar](https://qiita.com/advent-calendar/2017/calendars?q=rust)
- [Go関連のAdvent Calendar](https://qiita.com/advent-calendar/2017/calendars?q=go) （無印GoとGo2～Go4が該当します）

一方、[C言語 Advent Calendar](https://qiita.com/advent-calendar/2017/c_lang)


---

**警告：** 本投稿で紹介したプログラミング言語は、あくまでソフトウェア実行時効率という評価軸で高スコアを取ったにすぎません。現実のプログラミング言語選定では、実行時効率以外のさまざまな要因も考慮にいれるべきですから、このデータを短絡的に解釈・利用しないようご注意ください。

[sle]: http://www.sleconf.org/
[paper]: http://greenlab.di.uminho.pt/wp-content/uploads/2017/10/sleFinal.pdf
[site]: https://sites.google.com/view/energy-efficiency-languages
[rustlang]: https://www.rust-lang.org/
[golang]: http://golang-jp.org/
仮想通貨LISKの勉強資料まとめ

# 概要
* JSでできていて、JSのSDKがでている仮想通貨LISKに関する資料があつまる場所
* 随時更新予定。編集リクエストとかもらえるととても喜びます

# 前提
* 仮想通貨のビッグウェーブに乗ってちょっとだけLISKを買った
* ブロックチェーンも仮想通貨もよくわかってない人がまとめています


# 公式サイト
* [Top](https://lisk.io/)
* [Documentation](https://docs.lisk.io/docs)
* [FAQ](https://docs.lisk.io/docs/faq)
* [blog](https://blog.lisk.io/)

# wallet
* [Lisk Nano
](https://lisk.io/download)


# repository
* [lisk](https://github.com/LiskHQ/lisk)
* [lisk-js](https://github.com/LiskHQ/lisk-js)
* [lisk-docker](https://github.com/LiskHQ/lisk-docker)

# SNSとか
* [LiskHQ](https://twitter.com/LiskHQ)
* [youtube](https://www.youtube.com/channel/UCuqpGfg_bOQ8Ja4pj811PWg)


# 参考になりそうな二次ソース(解説記事系)
* [LISKとは？－サイドチェーンを用いたスマートコントラクトとDAppsのプラットフォームへ](http://businessblockchain.org/about-cryptocurrency-lisk)
* [リスクCEOマックス・コーデック氏にインタビュー](https://www.blockchain-labo.jp/interview/maxkordek)

# 今後
* ICOが簡単にできるようになる仮想通貨と書いてあった気がするのだが、自分の仮想通貨をサイドチェーンで作れるってことなのかな？（まだよくわかってない)
* せっかく投資した分野なので、なんでもいいので動くものを作ってみたい
スクラムのリファインメントをうまく運用するためのポイント

私たちのチームでは、今年の4月からスプリントで開発する項目（以下ユーザーストーリーと呼びます）の見積もりをリファインメントにて行なってきました。
今回は、このリファインメントで試行錯誤してきた内容をまとめます。

# 前提

## リファインメントとは？

[スクラムガイド](http://www.scrumguides.org/docs/scrumguide/v2017/2017-Scrum-Guide-Japanese.pdf)より

> プロダクトバックログに含まれるアイテムに対して、詳細の追加、見積り、並び替えをすることを、プロダクトバックログのリファインメントと呼ぶ。これはプロダクトオーナーと開発チームが協力して行う継続的なプロセスである。プロダクトバックログのリファインメントによって、アイテムのレビューと改訂が行われる。いつどのようにリファインメントをするかは、スクラムチームが決定する。リファインメントは、開発チームの作業の 10%以下にすることが多い。

## 私たちのチーム

エンジニア6名、デザイナー3名(1名増えた！)のチームで1週間で1スプリントのペースで実施しています。

## リファインメントの概要

### 目的
ユーザーストーリーの見積もりと、必要な機能や実装方法の認識合わせを行う

### 流れ

準備: 
プロダクトオーナーがプロダクトバックログのユーザーストーリーの優先順を決定

1. 開発者から優先順をあげたいユーザーストーリーがないか確認
2. 優先順の高いユーザーストーリーから3~7を実施
3. プロダクトオーナーにユーザーストーリーと、受け入れ条件の内容を説明してもらう
4. 開発者と話し合い、ユーザーストーリー、受け入れ条件の内容の調整
5. プランニングポーカー(*)にて、ポイントを提示
6. ポイントを提示した理由について話し、必要な作業について認識を合わせる
7. ユーザーストーリーに対するポイントを決定

* プランニングポーカーについては、「[ユーザーストーリーとプランニングポーカーを使ってアジャイルに見積もりしよう！](http://tracpath.com/works/development/agile_planning_poker_and_userstory/)」が詳しい記載ありわかりやすいです。

# リファインメントをうまく運用するためのポイント

上に挙げた通り、リファインメントはユーザーストーリーの内容を修正しつつ、見積もりをした上で共通認識の構築し、スプリント中の開発に繋げる重要な役割を持っています。リファインメントをうまく運用するための、ポイントを以下にまとめます。

## ユーザーストーリーと受け入れ条件の内容について、プロダクトオーナーと調整し、合意する

スプリント期間中に開発した際に曖昧な点や、認識違いを残さないためにもプロダクトオーナーとの認識合わせを見積もりの前に行います。「××のように作った方がよりユーザが使いやすいのではないか？」、「○○のように作れば開発の時間が短くできます」等の会話を通して、ユーザーストーリーを良い形にしていきましょう。良いユーザーストーリーの作り方に関しては「[ユーザーストーリーの”INVEST”とどう付き合うか](https://blog.guildworks.jp/2015/06/03/how_to_deal_with_invest_of_userstory/)」が参考になります。

また、リファインメント中の会話のログを取っていたこともありましたが、現在はユーザーストーリーと受け入れ条件に重要なポイントを反映するようにしています。（ログ取りはメンバーの負担が大きいため、継続できず断念しました。。）

## ユーザーストーリーを小さく保つ
大きいユーザーストーリー程正確に見積もるのが難しいため、見積もり時に大きなポイントが出た場合は、複数に分割する等して、ユーザーストーリーを小さく保つようにしています。「1スプリントで終えることができるかどうか？」を基準にし、大きいポイントが出た場合には、ユーザーストーリーの分割を行いましょう。

## 開発者間の会話で、実装のイメージを固める
プランニングポーカーにてポイントを提示したあとは

- どのような作業を想定しているか？
- なぜそのポイントになったのか？

を数人に話してもらい、チーム内で同じ実装イメージを作っていきます。単純な多数決にはせず、ポイントが異なる人にも意見を聞きましょう。開発工数を短縮するアイディアや、予想していなかったリスク等が出ることも。

## 見積もりしてから開発するまでを短く保つ

「3週間先のスプリントまでが見えるようになっていることが理想」という話もありますが、私たちのチームでは1スプリント+α分の見積もりができれば、その週のリファインメントは終了するようにしています。あまり先のユーザーストーリーの見積もりをし過ぎても、

- 見積もり後に状況が変わってしまい、再度検討が必要になる
- リファインメント時の会話から時間が経過すると記憶が薄れてしまう

等の問題が発生し、現在の形に落ち着きました。

ただし、「欲しい機能がいつ完成するか予想したい」等のケースがある場合は、関連するユーザーストーリーを全て見積もりをして予想を立てています。

## プロダクトオーナーに同席してもらう
リファインメントに慣れてくると、「プロダクトオーナーがいなくても、見積もりができるだろう」と思ってしまうことがありますが、上述した認識合わせがされないまま実装されてしまうため、認識ずれや実装漏れが発生しやすくなります。私たちのチームでもこの失敗を経験しており、以降は「非公式リファインメント禁止」の約束が掲げられました。

# 今抱えている課題

## 会話をしつつ、短時間でストーリーの見積もりを合意したい
会話を重視し過ぎるあまり、予定していたリファインメントの時間内に終わらないこともしばしばあります。タイムキーパーを設置して時間を意識するようにしたこともありましたが、ポイントが大きいストーリー程時間を掛ける必要があり、難しいです。。誰か良い方法を知っていたら教えてください！
JavaでもDockerでマルチステージビルド

[最小のNode.jsのDockerイメージを目指すスレ](https://qiita.com/shibukawa/items/f7076cf4b181ee141bcd)でNode.jsのマルチステージビルドをやったので、今度はJavaでもマルチステージビルドをやってみます。

Javaは大学１年の授業で書いたっきりで17年ぐらいまともに書いてないし、当時はIntelliJ IDEAはおろか、Eclipseもなくて、NEWS上のEmacsじゃなくてMuleでコードを書いた記憶あります。世間ではVisual Age for Javaとか、シマンテックとかボーランドのIDEとか、Visual J++の時代でしたね。BeOSで動かない言語はこの世に存在しない言語と思っていました。Gradleはかなり良い感じですね（CMakeに比べて）。

src/main/java以下がコード置き場のルートらしいので、その下のhelloパッケージとしてコードをおきます。

```java:src/main/java/hello/HelloWorld.java
package hello;

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("🆒");
  }
}
```

Gradle用のビルド設定ファイルを作成します。

```groovy:build.gradle
apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'hello.HelloWorld'
applicationName = 'HelloWorld'
jar.baseName = 'helloworld'

distributions {
    main {
        baseName = 'HelloWorld'
    }
}
```

Dockerファイルはこんな感じにしました。

公式パッケージにはjavaというのもあれば、gradleもあります。gradleはJavaの方に依存しています。ビルドする方のイメージではgradleのイメージを使います。

実行環境と合わせるためにAlpineベースのイメージにしていますが、その中に入ってビルドとか開発したいなら通常のDebianベースの方にするとか、ローカルのビルドの設定とかソースはマウントしたローカルのボリュームを参照するようにした方が良いと思います。

```Docker:Dockerfile
FROM gradle:jdk8-alpine as builder

ADD --chown=gradle:gradle build.gradle .
ADD --chown=gradle:gradle src src
RUN gradle installDist


FROM java:8-jre-alpine as runner

RUN addgroup -S -g 1000 app \
	&& adduser -D -S -G app -u 1000 -s /bin/ash app
USER app
WORKDIR /home/app
COPY --from=builder --chown=app:app /home/gradle/build/install .
CMD HelloWorld/bin/HelloWorld
```

この前のNode.jsよりも少し複雑になっていますが、理由は権限です。

* gradleイメージはgradleユーザーで動き、ホームも/home/gradle
    * ビルドイメージの方であとでイメージに入って試行錯誤できるように、gradleユーザー権限でファイルコピーするようにした
* 実行環境の方も、ユーザーを追加して、root以外で動くようにした
    * ユーザー作成のRUN/USERコマンドでユーザー指定、WORKDIRでワークフォルダ作成が追加

はい。これで``docker build .``すれば、イメージができます。ビルド環境は180MB、実行環境のイメージは100MBです。少し小さくなりました。実行もできました。

```shell-session
$ docker run -it --rm イメージ
🆒
```
RaSCSI のEtherNetをNetBSD/X68kでつかえるようにしてみた。

# はじめに
この記事は一応かいてみましたというものです。で、こんなことをしました、という、メモみたいなものになります。
ちなみに、最終結果のソースは[こちら(Github)](https://github.com/jr9qnj/NetBSD-X68K)になります。

# RaSCSIについて
RaSCSIとは、ここ[(Geocities)](http://www.geocities.jp/kugimoto0715/rascsi/)で紹介されている「RaspberryPIをSCSIデバイスにしてしまう」というものです。作者は [GIMONS](https://twitter.com/kugimoto0715)さんです。自分が最初にこれを見たときは、なんて面白いんだ！ とおもいました。古いPCやWSには、外部記憶装置を接続するインタフェースとして、SCSI([Wikiペディア](https://ja.wikipedia.org/wiki/Small_Computer_System_Interface))というインタフェースが付いていました。そのインタフェースにつながるデバイスを、RaspPIのGPIOで実現する、というものです。ここでエミュレーションを行うのは主にSCSIディスクとSCSI-CDROMになります。

#RaSEtherについて
RaSCSIには、最初に述べたSCSIディスクやCDROMデバイスをエミュレーションする機能の他に、SCSI接続のイーサネットをエミュレーションする機能もあります。これを使うと、イーサネットのないPCにも、SCSI経由でイーサネットをつけることができます。

#X68000/X68030について
X68000/X68030は、はるか昔のPCです。最初の機種は３０年以上前に発売されたました。([Wikiペディア](https://ja.wikipedia.org/wiki/X68000))。自分は古い人間ですので、強いあこがれがありました。今は、このシリーズの最終機種であるX68030と、要修理となるX68000ACE-HDを持っています。もちろん、今のPCと比べると、性能はとんでもなく低いです。（メモリが12MB! までしか増やせられない) しかし、X68030環境でCPUを交換すると、NetBSDが動作します。　しかし、NetBSDが動作するにもかかわらず、X68000/X68030のネットワーク環境は弱いものでした。この機種が発売された当時は、イーサネットはとても高価なインタフェースでしたし、X68000もネットワーク接続は昔のシリアルポートだけしか考慮されてないものでした。そして、ネットワークインタフェースは今では入手困難となっています。

#X68000/X68030のネットワーク参加
ということで、X680x0をネットワークに参加させるには、ちょっと苦労します。ハードもない、ソフトも、、、しかし、そんな中で、RaSCSIが登場し、ネットワーク参加がやりやすくなりました。とはいっても、ドライバはHuman68Kのみ。　じゃぁ、、NetBSDで参加しようではないか、ということで、かいてみることにしました。

#元ネタドライバ探し
ドライバを書くといっても、さすがに０から作る実力はありません。ですので、使えそうなドライバをNetBSDのソースからさがしてみました。　で、みつけたのがif-se.c。これは「Cabletron EA41x scsi ethernet adaptor.」というSCSI接続のイーサネットアダプタ用のドライバです。 SCSI接続のイーサネットアダプタということで、ではこれをちょこっといじればできるかなぁ、、とおもったのですが、ことはさすがに簡単ではありませんでした。

#どうやって認識するの？
デバイスドライバである以上、最初のハードルは「認識する」ということになります。SCSIデバイスでは、接続する、という動作で認識します。そのとき、SCSIのホスト側（この場合はX68030本体)は「△△という名前のデバイスありますか？」と質問し、それぞれのデバイスは「自分は○○である」ということを　SCSIホストに返します。それによって、ホスト側はデバイスが接続されていることを認識します。ということで、RaSCSIでイーサネットがどのように返事をしているかをRaSCSIのソースから見てみました。そして、それをもとにデバイスドライバの名前の部分を書き換えました。その結果、まずは、dmesgにあらわれるようになりました。

#認識したらつぎは初期化だよね？
さて、認識はしました。次は、初期化ということになります。初期化は、これまた一筋縄ではいかないものでした。attach()で行うのですが、最初のうちはなにをどうすればいいのかさっぱり、でした。が、ソースを何度もよんで、なにしてるかなぁ、というのがなんとなくわかってきた気がしました。具体的にしてたのはこんなことでした。
　1.ベースドライバへの登録。ようするに、親玉に「自分はこれこれこういう者です」と名乗ることです。
　2.デバイスの初期化。RaSCSIは、エミュレータといえど、ホストから見たら実際のデバイスですので、初期化する必要があります。SCSIデバイスなので、SCSIコマンドで初期化します。
　3.作業領域の確保と情報の取得。デバイス用のバッファとかを確保し、デバイスの情報、ここではMACアドレスを取得します。
　4.上位への登録。上位ドライバに自分を登録します。

#さて、データのやりとりはどうするの？
初期化はできました。次は、データのやり取りです。今回のSCSIデバイスは、一定時間ごとにポーリングするような動きになっています。で、データがあったらとってくる。ということを繰り返します。データのやりとりの仕方はSCSIデバイスのお作法に従うようにしています。

ということでつくってみました。。。実用性という意味では、じつは「X68030が遅すぎて」あまりないかもしれませんが、デバイスドライバをでっちあげるというのはいい経験になったと思います。
ちなみに、NetBSDでつくってる、ということでハードウエア独立で作っています。なので、　X680x0以外でもうごく、、、、かもしれません。たぶん。　でも、　X680x0以外のNetBSDが動くマシンで、　SCSIはあるけどイーサネットはない、というマシンはたぶんないと思います。


#さいごに
自分のX68030には、040turboがつんであります。ですので、実際の動作は、040turbo上でおこないました。しかし、040turboは、「メモリを増設できない」という問題があります。ですので、「メモリが増設できる」060Turboがほしかったりもします。しかし、たまにヤフオクとかででると、それこそ、「Xeonマシンがかえるような」値段になったりします。
あと、X68000の筐体だけ、というのがあるので、その中に異機種改造で、Ryzenか、XeonDを入れたマシンを作りたいなぁ、とも思っています。しかし、まずは先立つものが、、です。
*と変数の代入の関係


## はじめに

この記事は書籍「[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの9日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は`*`を使って配列の一部を取り出す方法を説明します。

## *と変数の代入の関係

あまり積極的に使うテクニックではありませんが、`*`と変数の代入の関係について、少し詳しく見ていきましょう。

4.7.5項では左辺の変数に`*`を付けて残りの全要素を配列として受け取るコードを紹介しました。

```ruby
e, *f = 100, 200, 300
e #=> 100
f #=> [200, 300]
```

`*`は最初の変数に付けることもできます。実際にやってみましょう。

```ruby
*e, f = 100, 200, 300
e #=> [100, 200]
f #=> 300
```

ご覧のとおり、最初の要素から最後の一つ前の要素が`e`に、最後の要素が`f`に代入されました。

最初や最後だけでなく、次のように途中の変数に`*`を付けて代入することも可能です。

```ruby
a, b, *c, d, e = 1, 2, 3, 4, 5, 6
a #=> 1
b #=> 2
c #=> [3, 4]
d #=> 5
e #=> 6
```

配列の要素が左辺の変数よりも少ない場合は、`*`が付いていない変数から優先的に代入されます。

```ruby
# 変数と配列の要素数が同じ
a, *b, c = 1, 2, 3
a #=> 1
b #=> [2]
c #=> 3

# 配列の要素数が1つ少ない
a, *b, c = 1, 2
a #=> 1
b #=> []
c #=> 2

# 配列の要素数が2つ少ない
a, *b, c = 1
a #=> 1
b #=> []	
c #=> nil
```

ちなみに、上のような挙動は可変長引数を持つメソッドに引数を渡す場合も同じです。

```ruby
def m(a, *b, c)
  puts "a: #{a}, b: #{b}, c: #{c}"
end

m(1, 2, 3) #=> a: 1, b: [2], c: 3
m(1, 2)    #=> a: 1, b: [], c: 2
# 引数は最低2つ必要なので、引数が1つの場合はエラー
m(1)       #=> ArgumentError: wrong number of arguments (given 1, expected 2+)
```

無理に`*`を駆使したコードを書く必要はありませんが、頭の片隅に置いておくと何かの際に役立つかもしれません。

## 次回予告

次回は範囲式を使ったフリップフロップを紹介します。
geometry > Euler angle rotation > beta, gamma に関する式 > 天頂角と方位角の式

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

関連: [ADDA > Euler angle rotation > beta, gammaに対して計算する](https://qiita.com/7of9/items/717c08d9c161e2d66f23)

[pySpherepts](https://qiita.com/7of9/items/3f81de6d1b2337ac6a9e)により、2つのnode setsのx,y,z座標セットを得ることはできている
(Icosahedral nodesとHammersley nodes)。

### 関係式

これをADDAの計算で使うには、Euler angle rotationのbeta, gammaの値に変換する必要がある。

ADDAでは下記の手順でrotationを行う。

1. beta: y軸に対して回転する
2. gamma: z軸に対して回転する

```math
P_2 = R_z(\gamma) R_y(\beta) P_1 ... (1)
```
 
https://en.wikipedia.org/wiki/Rotation_matrix

上記の式を具体的に書くと以下となる。

```math
\left[
\begin{array}{c}
x_2 \\
y_2 \\
z_2 \\
\end{array}
\right]
=
\left[
\begin{array}{ccc}
cos\gamma & -sin\gamma & 0 \\
sin\gamma & cos\gamma & 0 \\
0 & 0 & 1 \\
\end{array}
\right]

\left[
\begin{array}{ccc}
cos\beta & 0 & sin\beta \\
0 & 1 & 0 \\
-sin\beta & 0 & cos\beta \\
\end{array}
\right]

\left[
\begin{array}{c}
x_1 \\
y_1 \\
z_1 \\
\end{array}
\right] ... (2)
```

展開すると以下となる。

```math
\left[
\begin{array}{c}
x_2 \\
y_2 \\
z_2 \\
\end{array}
\right]
=
\left[
\begin{array}{ccc}
cos\gamma cos\beta & -sin\gamma & cos\gamma sin\beta \\
sin\gamma cos\beta & cos\gamma & sin\gamma sin\beta \\
-sin\beta & 0 & cos\beta \\
\end{array}
\right]

\left[
\begin{array}{c}
x_1 \\
y_1 \\
z_1 \\
\end{array}
\right] ... (3)
```

pySphereptsのx,y,z座標セット(x_2, y_2, z_2?)と上記の式からbeta, gammaを得ることはできるのだろうか?

他に関係しそうな式としては以下がある。

```math
x_1^2 + y_1^2 + z_1^2 = 1 ... (4)
```

```math
x_2^2 + y_2^2 + z_2^2 = 1 ... (5)
```

### 方向(0,0,1)からの入射光

z軸方向の入射光を考える。
ベクトルは(0,0,1)となる。

式(3)に代入すると以下となる。

```math
x_2 = cos\gamma sin\beta \\
y_2 = sin\gamma sin\beta \\
z_2 = cos\beta \\
... (6)
```

上記の式は一般的に見る、天頂角と方位角による座標変換の式と同一である。

式(6)ならgamma, betaを解くのは朝飯前だ (piece of cake)。
朝飯はもう食べたけど。

### 所感

昔の上司の教授が「一見難しい問題は初期条件や境界条件を与えると簡単に解けるようになる」と言っていたのを思い出した。「z軸方向の入射光」という条件を与えることで簡単に解けた。
Go 言語で改行コードを変換する（正規表現以外の解）

改行コード（LF, CR, CRLF）を変換する [Go 言語]のコードを考える。

真っ先に浮かぶのは [regexp] パケージを使って，たとえば

```go
package main

import (
	"fmt"
	"regexp"
)

var regxNewline = regexp.MustCompile(`\r\n|\r|\n`) //throw panic if fail

func convNewline(str, nlcode string) string {
	return regxNewline.Copy().ReplaceAllString(str, nlcode)
}

func main() {
	before := "あ\nい\rう\r\nえ"
	fmt.Printf("%U\n", []rune(before))

	after := convNewline(before, "\n")

	fmt.Printf("%U\n", []rune(after))
}
```

と書く[^r1]。これの実行結果は以下の通り。

[^r1]: `regexp.Regexp.ReplaceAllString()` メソッドを教えていただいた。感謝。なお Go 1.12 では複数の goroutine 下で `regexp.Regexp` インスタンスを使う際に `Copy()` メソッドでコピー・インスタンスを作らなくても処理がブロックされることはなくなった。

```
[U+3042 U+000A U+3044 U+000D U+3046 U+000D U+000A U+3048]
[U+3042 U+000A U+3044 U+000A U+3046 U+000A U+3048]
```

私も最初はこんな感じで書いていたのだが，**「[Go 言語]で正規表現を使ったら負け」**な気がして，何か方法はないかと [strings] パッケージをつらつら眺めてたら `strings.Replacer` 型が使えそうである。

たとえば，こんな感じで書ける。

```go
package main

import (
	"fmt"
	"strings"
)

func convNewline(str, nlcode string) string {
	return strings.NewReplacer(
		"\r\n", nlcode,
		"\r", nlcode,
		"\n", nlcode,
	).Replace(str)
}

func main() {
	before := "あ\nい\rう\r\nえ"
	fmt.Printf("%U\n", []rune(before))

	after := convNewline(before, "\n")

	fmt.Printf("%U\n", []rune(after))
}
```

これの実行結果は以下の通りで同じ結果が得られた。

```
[U+3042 U+000A U+3044 U+000D U+3046 U+000D U+000A U+3048]
[U+3042 U+000A U+3044 U+000A U+3046 U+000A U+3048]
```

あぁ，これで気持ちよく週末を過ごせる（笑）

[strings] パッケージと（今回は使わなかったが）[unicode] パッケージを組み合わせるとかなり色々できるので正規表現に手を出す前に検討してみるのもいいかもしれない。

[Go 言語]: https://golang.org/ "The Go Programming Language"
[regexp]: https://golang.org/pkg/regexp/ "regexp - The Go Programming Language"
[strings]: https://golang.org/pkg/strings/ "strings - The Go Programming Language"
[unicode]: https://golang.org/pkg/unicode/ "unicode - The Go Programming Language"
機械学習論文読みメモ_106


[Understanding Black-box Predictions via Influence Functions](https://arxiv.org/abs/1703.04730)
本論ではロバスト統計などの分野で用いられるinfluence functionを用いたブラックボックスモデルの予測結果を説明する手法を提案する．
Influence functionを用いる事で訓練データサンプルの微小変化が学習されるモデルのパラメータへどのような影響を与えるかを分析する．
これによりどのサンプルが最も現在の解析したい予測に対して影響を与えているかを知る事が可能になる．
本論では特に，現在の複雑な機械学習モデルへも適用可能にするために，新たな手法を提案する．
この手法はgradientとhessian-vector productへのアクセスさえあれば利用可能になっている．

[A Connection Between Generative Adversarial Networks, Inverse Reinforcement Learning, and Energy-Based Models](https://arxiv.org/abs/1611.03852)
GANアプローチはdiscriminatorによって学習されたコスト関数を最適化する事で生成モデルを学習する手法である．
生成モデル学習においては，コスト関数の学習は新しいが，制御や強化学習の分野においてはそれは長い間研究がなされてきた．
特にそれは例えばimitation by demonstrationのタスクである．
このような分野においてはinverse reinforcement learningやinverse optimal controlと呼ばれる分野で研究がなされている．
実際いくつかのIRL手法においてはそれはGANと数学的に等価である事が言える．
特にmaximum entropy IRLに対しては，GANにおいて生成モデルの分布が判別モデルのもう一つの入力，また評価にも用いる事に使われる場合において同じになる．
また興味深い事にmaximum entropy IRLはenergy based modelの特別なケースであるため，そことの関連も言える．
本論ではenergy based modelとGANとの理論的関係においても探索を行った．

[Cognitive Mapping and Planning for Visual Navigation](https://arxiv.org/abs/1702.03920)
新しい環境におけるnavigationを実現するためのネットワークを提案する．
提案するネットワークは主観視点のカメラから地図を作成する．
そしてその環境におけるゴール地点へ到達するための行動シーケンスを計画する．
この提案するcognitive mapper and planner (cmp)では，mappingとplannerを組み合わせた構造を提案し，これによりmappingはplannerのニーズに基いて行われる．
planningが可能な空間的メモリを不完全な観測から構築する．
cmpはtop downなbelief mapを持ち，plannerはそれに基いて行動を決定する．
ADDA > Euler angle rotation > beta, gammaに対して計算する

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
```

### ADDA

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

非球形粒子の散乱特性を計算するADDAにおいて、粒子が様々な方向を向いて存在する状況を考慮したrandom orientation averagingの計算では、Euler angle rotationを用いる。

https://en.wikipedia.org/wiki/Euler_angles

https://github.com/adda-team/adda/blob/master/doc/manual.pdf
last revised: Februrary 20, 2014
p21 
8.2 Orientation averaging

> Orientation averaging is performed over three Euler angles ($\alpha$, $\beta$, $\gamma$). Rotating over $\alpha$ is equivalent to rotating the scattering plane without changing the orientation of the scatterer relative to the incident radiation.

３つのEuler angleについてalpha関連の計算は、ADDAの１方向の計算で処理される（散乱面の計算がされる）ため、こちらでは実施しなくて良い。

残りのbeta, gammaに対して値を指定して計算することになる。

Euler angleのそれぞれの値の範囲は以下だろう。

- gamma: [0, 360 deg.)
- beta: [0, 180 deg.)
- alpha: [0, 360 deg.)

betaは天頂角(polar angle)、gammaは方位角(azimuth angle)に対応するのかどうか。

manual.pdf 
p58
B.2 avg_params.dat

> using "zyz-notation"

p20
8.1 Single orientation

> In short, coordinate axes attached to the particle are first rotated by the angle $\alpha$ over the z-axis, then by the angle $\beta$ over the current position of the y-axis (the line of nodes), and finally by the angle $\gamma$ over the new position of the z-axis (Fig. 5).



### T-matrix for clusters of spheres

2008年の論文の計算実施時には、T-matrix for clusters of spheres (Multiple Sphere T Matrix code)を用いた。

こちらの場合、Euler anglesのうち、gamma方向の計算が１方向の計算内で実施されるため、alpha, gammaに対する方向指定で計算を行った。

下記のコードの旧バージョン(v1.0?)を用いていた。
http://eng.auburn.edu/users/dmckwski/scatcodes/

[mstm-manual-2013-v3.0.pdf](http://eng.auburn.edu/users/dmckwski/scatcodes/mstm-manual-2013-v3.0.pdf)
p17
target_euler_angles_deg:

> The Euler rotation first rotates each sphere $\theta_1$ about the z
axis, then rotates $\theta_2$ about the new y axis, then rotates $\theta_3$ about the new z axis. 

こちらもADDAと同じ、zyz-notation。
トランザクションその２

ビットコインのトランザクションは、標準的なトランザクションであり、**どのアカウントからどのアカウントにどのぐらい送金する** かを記録するだけであり、仮想通貨を目指すビットコインの場合これで十分でした。
イーサリアムの場合は、**分散アプリケーションのプラットフォーム** を目指して設計されたので、スマートコントラクト作成やスマートコントラクト間のやり取りの為、特別なトランザクションが存在しています。

1. コントラクトを登録するトランザクション
2. コントラクトの関数を呼び出すトランザクション

標準トランザクションを含めて、各トランザクションに渡すパラメータをまとめました。

### トランザクションタイプ毎のパラメータ内容

| パラメータ | 標準トランザクション           | コントラクト登録するトランザクション         | コントラクトの関数を呼び出すトランザクション |
| ---------- | ------------------------------ | -------------------------------------------- | -------------------------------------------- |
| from       | 送金するアカウントのアドレス   | コントラクトを登録するアカウントのアドレス   | 呼び出す元のアドレス             |
| to         | 送金の宛先アカウントのアドレス | **空**                                       | 呼び出し先コントラクトのアドレス             |
| value      | 送金の金額                     | **空**                                       | **空**                                       |
| data       | **空**                         | **コントラクトがコンパイル済みのバイト配列** | **呼び出し先の関数に必要な情報**             |

- ３つのタイプとも、`gas / gas price / nonce` パラメータがありますが、違いがないので、上記のテーブルに書いてない
    - `gas はそのトランザクションの処理の中、各処理ステップ毎に払う手数料の合計値以上である必要がある` ことは既に把握できました。コントラクトの関数を呼び出す場合気をつけないといけないのは、たとえコントラクトAの関数Xを呼び出すだけでも、中の処理で更に呼び出したコントラクトBの関数Y、コントラクトCの関数Zなど、最初の呼び出しを起点として、一連の呼び出しに必要な `gas` は全部合計されるので、その最終的な合計値の分の手数料を払わないと行けないこと。同じく途中まで `gas` が足りなくなったら、一連の呼び出すは全部取り戻され、変更がブロックチェーンに適用されないこと。
- `data` パラメータは、まさに標準トランザクション以外のトランザクションのためのパラメータなので、標準のトランザクションの場合は空です
- コントラクトを登録するトランザクションの場合は、
    - `to` は空（**システムというか、ブロックチェーンプラットフォーム宛みたいな感じ**）
    - `value` は空
    - `data` は事前にコントラクトのソースをコンパイルし、できたバイト配列をここに格納する
- コントラクトの関数を呼び出すトランザクションの場合は
    - `to` は呼び出す先のコントラクトのアドレス
    - `value` は空
    - `data` は、呼び出す関数に必要な、パラメータのデータ型と値をエンコードした内容（詳細は参考記事の２番目を参照ください）

## 参考記事
- [EthereumのContractをSolidityで書いて遊んだ - Qiita](https://qiita.com/IKEA_dless/items/1f7c49384fd90cde4646)
- [Ethereum Contract ABI · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI)
vimでバッファやレジスタをコマンドラインに貼り付け


# 無名レジスタの内容をコマンドラインに貼り付け
``` :<C-r>" ``` 
で無名レジスタの内容をコマンドラインに貼り付け

また，挿入モードやコマンドラインモードで
```<C-r>"```
とするとカーソル位置に無名レジスタの内容を貼り付け.
```"```
の部分はレジスタ名.

# 例
バッファの内容が
```1 abc def ghi```
で```d```の位置にカーソルがあり，ノーマルモードとする.
```yw:<C-r>"```
とタイプするとコマンドラインモードで以下となる.
```:def_```　(_はスペース)
(カーソル位置はスペースの1つ後ろ.)

# 上の例の解説
(レジスタについての解説はしません.)
```yw```
で```"```(無名レジスタ) に ```def_```をコピー.
```:<C-r>```
とタイプするとコマンドラインモードで以下の状態になる.
```:"```
(カーソルは```"```の位置)
この状態でレジスタ名をタイプするとそのレジスタの内容をカーソル位置に貼り付け.
つまり```"```(無名レジスタ)を張り付けたい場合は```"```(ダブルクォーテーション)をタイプ.

# おまけ
``` : ```
でコマンドを打ち込める状態は
```Command-line mode```
と言うそうです.
[```:help command-line-mode```]
(http://vim-jp.org/vimdoc-ja/cmdline.html)
中西先生のM式

#早逝な秀才
和田英一先生の「中西流プログラミングを読み解く」より

引用開始
私は週に1度慶應病院に通っている状態で，ふ だんは酒も飲めるようになっております(食べる ことだけがちょっと不自由ですが)． メールは 家内のアドレスを通して交換できるようにして おります． また中西を思い出していただければ 幸いです． こういう悲しいメイルを残し， 中西君はわれわれの前から去っていった。
引用終わり

中西先生は1943年のお生まれです。2000年、ご病気により57歳の若さで惜しまれつつもお亡くなりになりました。先生は日本のLisp黎明期においてLispの研究、教育に尽力されました。「Lisp入門　－システムとプログラミング－」が有名です。また、「やさしいコンパイラの作り方」「6502アセンブリプログラミング」にもお世話になりました。

#はじめてのLisp
中西先生は日本にまだLispの処理系が存在していない頃にLisp処理系を作ったそうです。参考にした文献は９０ページほどの「LISP1.5　Programmer's　Manual」だけだったそうです。

以下bit1997年1月号「バグを出さない」（中西正和）より引用します。

引用開始
　ともかく、Lispは完成した。ここからが面白い作業である。Lisp言語は、思想としてS式（私はS表現と呼ぶが）で書くべきものであり、その必然性は十分に理解できるのだが、プログラムが書きにくい。括弧の多さは筆舌に尽くしがたい。そして何よりも関数と引数の書き方が伝統的な数学の書法やプログラミング言語と異なるのが恐ろしい。
　私が参考にした前出の文献（補注Lisp1.5のマニュアルのこと）は、説明にはS式ではなく伝統的な数学の表記に近いM式というもので書かれていた。なぜM式で書かれていたかを想像するに、多くの人に理解してもらいたかったから、というのが真実だろう。私も、Lispを日本で流布させるには、S式ばかりでなくM式でもLispのプログラミングを書くことができなければいけないのではないか、と考えた。コンパイラをたくさん作っていた私にはこのくらいの変換系を作るのはやさしいことだった。
引用終わり


![ArcSoft_画像183.PNG](https://qiita-image-store.s3.amazonaws.com/0/33927/604860b7-74dd-aa60-2a9b-5a863ffe425a.png)


#中西流M言語
手元にある「Lisp入門」は第２版で1981年のものです。M言語に近い形で入力・評価させる、という例として次のようなコードが掲載されていました。

以下、「Lisp入門」より引用

```
PREM[X]
  <= [NULL[CDR[X]] -> LIST[X];
      T -> MAPCON[PERM[CDR[X]];
                  QUOTE[LAMBDA[Y};INSERT[NIL;CAR[X];CAR[Y]]]]
           ]
     ]
.

INSERT[X;A;Y]
  <= [NULL[Y] -> LIST[APPEND[X;CONS[A;Y]]];
      T -> CONS[APPEND[X;CONS[A;Y]];
                INSERT[NCONC[X;LIST[CAR[Y}]];CDR[Y]]
           ]
      ]
.
```

このコードはおそらくAPPLE-LISPあるいはKLISPで動かした例ではないかと思います。M言語に近い言語を受け付けるLispとしては他にもGorgia Tech LISPという処理系もあったとのことです。

M言語は小文字を原則としているのですが、大文字になっています。おそらく当時の端末が大文字しか扱えなかったからだろうと思います。M式のなかでのS表現には先頭に’を付けることとなっていました。cond節はM言語では矢印　→　を使うのですが、->と書きます。関数の定義には　<=　を使います。

例

```
fn[x1;...;xn] <= e
```

#時代の変遷
「Lisp入門」は1977年に出版され、M言語を使ってLispプログラムを説明していました。1981年の第二版ではS式が取り入れられています。以下第2版の序文より引用します。

引用開始
本書は、1977年に著したものを改訂したものであるが、大きく変わった点としては、M言語ばかりでなく、コンピューターに入力できるS表現のプログラムをいくつか入れたことがあげられる。S表現のプログラムのほうが読みやすいという読者がいることを考えたためである。
引用終わり


TECOエディタを基にしたEmacsは1970年代より開発が開始されました。1981年頃にはEmacsによるS式サポートが普及し始めていたのかもしれません。しかし、当時のパソコンは初代PC-9801が登場したばかりでした。当時のパソコンではEmacsは動かなかったはずで、メインフレームで利用されていたのだろうと思います。

#M言語の後継者たち（？）

Lispハッカー、竹内郁雄先生は下記の記事で次のようにおっしゃっています。
http://www.atmarkit.co.jp/ait/articles/0807/23/news141.html

引用
竹内氏によると、Lispはすべての言語の原点なのだという。「いまRubyがブームだが、Rubyは要するにカッコのないLisp。XMLもぶ厚いカッコのあるLisp。いろいろなプログラミング技法を見ますが、『Lispにあった』ということが多いです」（竹内氏）
引用終わり

M言語はその後、姿形を変えつつも現代のプログラミング言語の中に密かに隠れているのではないかと私は思っています。それは例えば　まつもとさんのRubyです。そして、Mathematicaもひょとしたらそうかもしれません。あれは中身はLispのようです。エンジンバラPrologもそうかもしれません。Lisp的な考え方をする各種言語には伝統的な数学表記に近いM言語風の表記が与えられています。それらには中西先生の思いが詰まっているように私には思えてなりません。
機械学習論文読みメモ_105


[Wider or Deeper: Revisiting the ResNet Model for Visual Recognition](https://www.google.com/search?q=Wider+or+Deeper%3A+Revisiting+the+ResNet+Model+for+Visual+Recognition&oq=Wider+or+Deeper%3A+Revisiting+the+ResNet+Model+for+Visual+Recognition&aqs=chrome..69i57.334j0j4&sourceid=chrome&ie=UTF-8)
最近のdeepnetの研究トレンドはnetworkをより深くしていく事で性能向上を行う手法になってきている．
しかしながらただ深さを増やす事は必ずしも最適な性能向上手法ではない事が実験的に観測されてきた．
またresnetに対する研究によれば，resnetは浅いネットワークのアンサンブルとして学習されている事が分かっている．
これらの事実をより分析する事で本論では浅い構造を持つresnet構造を提案し，従来手法よりも高性能を実現した．

[Image De-raining Using a Conditional Generative Adversarial Network](https://arxiv.org/abs/1701.05957)
画像認識において，悪天候下や，質の低い画像はその性能を悪化させる要因である．
そこで，特に悪天候画像に対する手法として悪天候の影響を取り除くderaining/desnowing手法を提案する．
しかし問題はill-posedであり，従来手法ではこれを事前知識を用いてwell-posedな問題へ変換する．
本論では別のアプローチを提案し，GANのフレームワークを用いてde-rainされた画像が現実の雨でない画像と見分けが付かないようにする．
これにより，その後に適用されうる画像認識手法の性能をderainにより低減されないようにする．

[UNDERSTANDING DEEP LEARNING REQUIRES RETHINKING GENERALIZATION](https://arxiv.org/abs/1611.03530)
その大きさにも関わらず，deep learning手法はtrainとtestデータの間で大きな予測誤差が出てこない．
従来の理解ではそれはモデルの特性や学習時に用いられる正則化手法による物であると考えられてきた．
たくさんの実験が行われてきたにも関わらず，しかしながらなぜ大規模なネットワークが良く一般化されやすいのかについての説明はなされてこなかった．
特に，本論では訓練データにランダムなラベルを与えたとしても，通常のネットワークと学習によって適合する事が可能である事が分かった．
またこの現象は正則化による影響を受けず，また入力画像をただのランダムノイズに変えたとしても有効であった．
この事は，正則化は汎化誤差を改善させるかもしれないが，汎化誤差をコントロールするにあたっては，必要でも十分でもないことを示唆している．
[ios]TableViewでカスタムセルを設定しようと思ったら、詰まった話

下記の画像のように、TableViewでcell間に余白を入れるUIを実現しようとしました。
<img width="375" alt="fullsizeoutput_94e.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/175906/70c67703-4435-c175-6712-514bf1782575.jpeg">

そこまではできたので、あとは部品を配置して、実装進めるだけだと思い、以前collectionViewで下記の記事の通り実装したので、そのまんまTableviewでも実装進めたら、うまくいかず・・・
https://i-app-tec.com/ios/collectionview.html

色々調べてたら、「もしかしてCustomcellで部品を指定しないといけないのか・・・」と思ってたところ、下記の記事に遭遇。ストーリーボードで実装を進めていたので、Customcellにoutlet接続できるとは知らず、完全に勉強不足でした。。。
http://totutotu.hatenablog.com/entry/2014/10/14/%E3%80%90swift%E3%80%91%E3%82%AA%E3%82%B7%E3%83%A3%E3%81%AACustomCell%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%80%90CoffeeNote%E9%96%8B%E7%99%BA%E8%A8%98%E3%80%91

iosは部品の使い方に慣れるのが上達の一歩ですね。
Kubernets で　GPU を使って tensorflow を学習させる（１）

Azure Container Service と tensorflow を使って、学習をさせる時の設定のポイントを自分のメモとして書いておく。

* [Kubernets で　GPU を使って tensorflow を学習させる（２）](https://qiita.com/TsuyoshiUshio@github/items/f3c28498e75ff1294114)

* [Kubernets で　GPU を使って tensorflow を学習させる（３）](https://qiita.com/TsuyoshiUshio@github/items/33217e66067891f34fd1)

最強チュートリアルを貼っておく。これを基本フォローしている。

* [wbuchwalter/tensorflow-k8s-azure](https://github.com/wbuchwalter/tensorflow-k8s-azure)

![Screen Shot 2017-12-08 at 11.52.49 AM.png](https://qiita-image-store.s3.amazonaws.com/0/3470/e940d839-747e-dc58-1b27-bbf05eb72f63.png)


# 1. GPU 用のベースイメージを使う

最初のポイントは、tensorflow のイメージがあるが、GPU向けのものを使う。CPU用のサイズが400MB 程度なのに対して　GPU用は1G, 2G ぐらいのサイズになるがそんなもの。

* [tensorflow/tensorflow](https://hub.docker.com/r/tensorflow/tensorflow/tags/)

# 2. Kubernetes を　GPUのVMでプロビジョンする

`westus2` もしくは `uksouth` で GPU VM を指定してプロビジョンする。例えば　Standard_NC6。GPUのクラスタのデプロイは通常のより多くかかる(10-15 min) これは、NVIDIAのドライバーをインストールしているから。リージョンによっては、キャパシティが制限されているので、要確認。

こんな感じ。

```
az group create --name RemoveGPU --location westus2
az acs create --agent-vm-size Standard_NC6 --resource-group RemoveGPU --name gpucluster --orchestrator-type kubernetes --agent-count 2 --location westus2 ```

kubeconfig の取得は下記の通り。

```
az acs kubernetes get-credentials --name gpucluster --resource-group RemoveGPU
```

ちなみにこのコマンドだと、既存の kubeconfig が存在する場合は、`~/.kube/config` を消さずクラスタが追加されるので、context を切り替えて新しいクラスタが使えるようになる。

確認方法は

```
$ kubectl get nodes
NAME                        STATUS    ROLES     AGE       VERSION
k8s-agentpool0-03479696-0   Ready     agent     21h       v1.7.9
k8s-agentpool0-03479696-1   Ready     agent     21h       v1.7.9
k8s-agentpool0-03479696-2   Ready     agent     17h       v1.7.9
k8s-master-03479696-0       Ready     master    21h       v1.7.9
$ kubectl describe node k8s-agentpool0-03479696-0
   :
Capacity:
 alpha.kubernetes.io/nvidia-gpu:  1
   :
```

ちなみに、エージェントの数を変えたい場合は

```
az acs scale -g RemoveGPU -n gpucluster --new-agent-count 3
```

# GPU イメージ向けのyamlファイルの書き方

## GPU イメージの選択

### tensorflow の場合のイメージ

tensorflow/tensorflow:1.4.0-gpu-py3 (GPU)
tensorflow/tensorflow:1.4.0-py3 for (CPU)

### CNTK

microsoft/cntk:2.2-gpu-python3.5-cuda8.0-cudnn6.0 (GPU)
microsoft/cntk:2.2-python3.5 for (CPU) 

## GPUのリクエスト

k8s は　CPUに関してはデフォルトで CPUを確保してくれるが、GPUはそうでは無いので、YAMLにリソースの設定をする。

```
containers:
      - name: tensorflow
        image: tensorflow/tensorflow:latest-gpu
        resources:
          limits:
            alpha.kubernetes.io/nvidia-gpu: 1 
```

こんな感じ。

## ドライバをコンテナにシェアする

NVIDIA のドライバをコンテナから参照するようにセットアップする

```
        volumeMounts: # Where the drivers should be mounted in the container
        - name: lib
          mountPath: /usr/local/nvidia/lib64
        - name: libcuda
          mountPath: /usr/lib/x86_64-linux-gnu/libcuda.so.1
      volumes: # Where the drivers are located on the node
        - name: lib
          hostPath: 
            path: /usr/lib/nvidia-384
        - name: libcuda
          hostPath:
            path: /usr/lib/x86_64-linux-gnu/libcuda.so.1
```

# まとめ

GPU のクラスタを作って、下記の３つをセットアップすればOK

* GPU イメージの選択
* GPU　のリクエスト
* NVIDAのドライバをコンテナから参照

次は、k8s で使える便利ツールや、スケール時の考慮など
Tone.jsを使ってテキストからメロディを鳴らしてみた

ブラウザで音声を鳴らすことができるJavaScriptライブラリ「[Tone.js](https://tonejs.github.io/)」を使って、試しにテキストを音楽に変換するコードを書いてみました。

# Hello Tone

まずは何か音を出してみます。
Tone.jsを読み込んで2行書くだけです。

```html:HTML
<script src="https://tonejs.github.io/build/Tone.min.js"></script>
```

```js:JavaScript
// 使用する音源を用意する
var synth = new Tone.Synth().toMaster();
// C5(音程)を4分音符で鳴らす
synth.triggerAttackRelease('C5', '4n');
```

これでポーンという単音が鳴りました。
簡単ですね。

コード＆サンプル
http://jsbin.com/torufil/edit?html,js,output

# メロディを鳴らす

次に複数の音を連続して鳴らします。
いきなり複雑になりますが、以下のようにします。

```js:JavaScript
// メロディを鳴らす音源
var synth = new Tone.Synth().toMaster();
// メロディの音階データ
var melody_data = [
  'E5', 'C5', 'G4', 'C5', 'D5', 'G5', null, 'G4',
  'D5', 'E5', 'D5', 'G4', 'C5', null, null, null // nullは休符
];
function addMelody(time, note) {
  synth.triggerAttackRelease(note, '8n', time);
}
var melody = new Tone.Sequence(addMelody, melody_data).start();
// テンポを指定
Tone.Transport.bpm.value = 140

function play_music() {
  Tone.Transport.start();
}
```

コード＆サンプル
http://jsbin.com/qaxobun/edit?html,js,output

どこかで聞いたことのあるメロディではないでしょうか？

# マルチトラック再生

今度は複数のメロディを同時に鳴らしてみます。
先ほど作ったメロディにベースラインのようなものを追加しました。

```js:JavaScript
var melody_synth = new Tone.Synth().toMaster();
var bass_synth = new Tone.Synth().toMaster();
var melody_data = [
  'E5', 'C5', 'G4', 'C5', 'D5', 'G5', null, 'G4',
  'D5', 'E5', 'D5', 'G4', 'C5', null, null, null
];
var bass_data = [
  'C3', null, null, 'C3', 'G2', 'G2', null, null,
  'G2', 'G2', null, 'G2', 'C3', null, null, null
];
function addMelody(time, note) {
  melody_synth.triggerAttackRelease(note, '8n', time);
}
function addBass(time, note) {
  bass_synth.triggerAttackRelease(note, '8n', time);
}

var melody = new Tone.Sequence(addMelody, melody_data).start();
var bass   = new Tone.Sequence(addBass, bass_data).start();
Tone.Transport.bpm.value = 140

function play_music() {
　// 複数のSequenceを同期再生させる
  Tone.Transport.start();
}
```

コード＆サンプル
http://jsbin.com/dutotix/edit?html,js,output

# ドレミのテキストからメロディを鳴らす

最後にテキストをメロディに変換してみます。
入力は以下のようなテキストで、これを適当にパースしてTone.jsにメロディデータとして渡してやります。

```
ドレミファミレドー
ミファソラソファミー
ドードードードー
ドレミファミレドー
```

```js:JavaScript
var melody_synth = new Tone.Synth().toMaster();
var tone_texts = {
  "ド": "C5",
  "レ": "D5",
  "ミ": "E5",
  "ファ": "F5",
  "ソ": "G5",
  "ラ": "A5",
  "シ": "B5",
  "ー": null
}
function addMelody(time, note) {
  melody_synth.triggerAttackRelease(note, '8n', time);
}

Tone.Transport.bpm.value = 140

function play_music() {
  var melody_data = [];
  var score = document.getElementById('score');
  var score_source = score.value
  while (score_source.length > 0) {
    for(text in tone_texts){
      if (score_source.indexOf(text) == 0) {
        melody_data.push(tone_texts[text]);
        break;
      }
    }
    score_source = score_source.slice(1);
  }
  var melody = new Tone.Sequence(addMelody, melody_data).start();
  Tone.Transport.start();
}
```

コード＆サンプル
http://jsbin.com/levuwah/edit?html,js,output

無事に曲が流れました。めでたしめでたし♪

# まとめ

今回はTone.jsを使ってテキストを入力として単純な曲を再生するところまでやってみました。
Tone.jsは他にも楽器を選択したり、音そのものを加工したり、音を可視化したりできるようです。JavaScriptで扱えるので、Three.jsなど他のライブラリと連携させると面白いことができそうな気がしました。
また今度、遊んでみたいと思います。
julia で使う python を 3系にする

julia advent calendar の８日目の記事です

## 概要

- julia の docker image を作ってみました
[独自の julia docker image を作ってみる](https://qiita.com/ysaito8015@github/items/eb3917cc108b4af4ec20)
- Dockerfile をいじっている内に、julia が導入する miniconda が 2.x であることに気がつきました
- python3.x にしよう

## julia 内で miniconda を導入するPkg
`Pkg.add` によって, `IJulia.jl` や, `PyPlot.jl`を導入するとき, `Conda.jl` や, `PyCall.jl`  がよばれます

### [Conda.jl](https://github.com/JuliaPy/Conda.jl#miniconda-python-version)


`PyCall.jl` が参照しているpythonは windows , osx の場合, `PATH` ではなく、`Conda.jl` の `CONDA_JL_HOME` を参照します. linux の場合は, `PATH` を参照します
[参考](https://github.com/JuliaPy/Conda.jl/blob/6ca6a3b58b24b985f57fde5736fd085f302cb8c1/deps/build.jl#L15)

`CONDA_JL_HOME` に miniconda 下の仮想環境 `conda_jl` へのパスを設定しておけば、`Pkg.add("Conda.jl")` 時に, conda_jl 環境が作成され、参照されます

 また、`Conda.jl`を追加する前に
`CONDA_JL_VERSION` に`"3"`を設定しておけば、python3.x が利用できます
デフォルトでは`"2"` [参考](https://github.com/JuliaPy/Conda.jl/blob/6ca6a3b58b24b985f57fde5736fd085f302cb8c1/deps/build.jl#L11)

```bash
export CONDA_JL_VERSON="3"
/paht/to/miniconda/bin/conda update --all -y
export CONDA_JL_HOME="/path/to/miniconda/envs/conda_jl"
```

```julia
Pkg.add("Conda.jl")
using Conda
Conda.PYTHONDIR          # python のパス
Conda.list()             # インストールされている python パッケージのリスト
Conda.add("パッケージ名") # python パッケージのインストール
Conda.rm("パッケージ名")  # python パッケージのアンインストール
Conda.update()           # python パッケージのアップデート
``` 

[その他のUsage](https://github.com/JuliaPy/Conda.jl#basic-functionality)

### [PyCall.jl](https://github.com/JuliaPy/PyCall.jl)
`Conda.jl` によってインストールされます

```julia
Pkg.add("PyCall.jl")
using PyCall
PyCall.pyversion      # python のバージョンを表示
PyCall.pyprogramname  # python の絶対パス
PyCall.libpython      # python lib のパス
PyCall.conda          # Conda Python をつかっているか true, false
```
`PyCall` での python パッケージの追加

```julia
using PyCall
#@pyimport: import マクロ
@pyimport math
math.sin(math.pi / 4) - sin(pi / 4)  # 0.0

@pyimport matplotlib.pyplot as plt
x = linspace(0,2*pi,1000); y = sin(3*x + 4*cos(2*x));
plt.plot(x, y, color="red", linewidth=2.0, linestyle="--")
plt.show()

# Python の型とJulia の型を相互に変換
# TODO: Numpy array 多次元配列の渡し方について後で書き足す

#@pywith: with ステートメントのマクロ
@pywith pybuiltin("open")("file.txt","w") as f begin
    f[:write]("hello")
end
#オブジェクトのアトリビュート/メンバーズの扱いについてpythonとの違い
@pyimport Bio.Seq as s
@pyimport Bio.Alphabet as a
my_dna = s.Seq("AGTACACTGGT", a.generic_dna)
my_dna[:find]("ACT") # Python の場合は my_dna.find("ACT")
# Python での `o.method(...)` を `o[:method](...)` に置き換える
```
gensim word2vecのモデルファイル読み込みで_pickle.UnpicklingErrorが出たときの対処法

> python3.5.2

```python3:calc_w2v.py
import better_exceptions
from gensim.models import word2vec

file_name = "./model.txt"
model = word2vec.Word2Vec.load(file_name)
...
```

上記pythonコードで```./model.txt```というword2vecモデルファイル(```binary=False```)を読み込もうとすると、以下のようなエラーが出る。(```bettter_exceptions```あり)

```shell:
Traceback (most recent call last):
  File "calc_w2v.py", line 7, in <module>
    model = word2vec.Word2Vec.load(file_name)
            │                      └ './model.txt'
            └ <module 'gensim.models.word2vec' from '/Users/user/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/gensim/models/wo...
  File "/Users/user/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/gensim/models/word2vec.py", line 1520, in load
    model = super(Word2Vec, cls).load(*args, **kwargs)
                  │         │          │       └ {}
                  │         │          └ ('./model.txt',)
                  │         └ <class 'gensim.models.word2vec.Word2Vec'>
                  └ <class 'gensim.models.word2vec.Word2Vec'>
  File "/Users/user/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/gensim/utils.py", line 280, in load
    obj = unpickle(fname)
          │        └ './model.txt'
          └ <function unpickle at 0x10580e8c8>
  File "/Users/user/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/site-packages/gensim/utils.py", line 933, in unpickle
    return _pickle.load(f, encoding='latin1')
           │            └ <_io.BufferedReader name='./model.txt'>
           └ <module 'pickle' from '/Users/user/.pyenv/versions/anaconda3-4.2.0/lib/python3.5/pickle.py'>
_pickle.UnpicklingError: could not find MARK
```

gensimで生成したファイルを読み込む際、```load```関数に対応するフォーマットとは違うことからエラーが出るらしい。読み込む関数を変える必要があるようだ。([詳しくはwebで。](https://github.com/RaRe-Technologies/gensim/issues/1447))

そこで、下記のようにpython3コードを修正。

```python3:calc_w2v.py
import better_exceptions
from gensim.models import word2vec

file_name = "./model.txt"
model = word2vec.KeyedVectors.load_word2vec_format(file_name)
...
```

無事に読み込めた。

---

```python3:calc_w2v.py
import better_exceptions
from gensim.models import word2vec
import sys
import cython

file_name = "./model.txt"
# model = word2vec.Word2Vec.load(file_name) ### _pickle.UnpicklingError: could not find MARK
model = word2vec.KeyedVectors.load_word2vec_format(file_name)

def word_subtraction(pos, neg):
	pos_list = [pos]
	neg_list = [neg]
	result = model.most_similar(positive=pos_list, negative=neg_list, topn = 10)
	for r in result:
		print(r)

pos = sys.argv[1]
neg = sys.argv[2]
print(model[pos])
print(model[neg])

print(pos, " - ", neg, " = ")
word_subtraction(pos, neg)
```

```shell:
$ python3 calc_w2v.py アメリカ 日本
```
ファイル名を書き換えてもLinuxのタイムスタンプが変わらない


調べたのでメモ
## ファイル名を書き換える


```
17:28 $ls -l
合計 4
-rw-rw-r--. 1 vagrant vagrant 4 12月  8 17:28 2017 hoge

17:29 $mv höge fuga

17:29 $ls -l
合計 4
-rw-rw-r--. 1 vagrant vagrant 4 12月  8 17:28 2017 fuga
```
17:28にファイルを作成、17:29にファイル名を変更しても
タイムスタンプは17:28のまま

理由は以下のとおり

## Linuxのタイムスタンプ3種類

Linuxのタイムスタンプには以下の3つがある

- atime
  ファイルを最後に読み込んだ時刻
- mtime
  ファイルに最後に書き込みした時刻
- ctime
  ファイルステータスを最後に変更した時刻

"ls -l"で表示されるのはmtimeである。
そしてファイル名変更は「ファイルへの書き込み」ではなく「ファイルステータスの変更」に当たるため、mtimeは更新されなかった

## ctimeを表示すると
cオプションでタイムスタンプをctimeに

```
17:47 $ls -lc
合計 4
-rw-rw-r--. 1 vagrant vagrant 4 12月  8 17:47 2017 hoge

17:48 $mv hoge fuga

17:48 $ls -lc
合計 4
-rw-rw-r--. 1 vagrant vagrant 4 12月  8 17:48 2017 fuga
```
このように、ctimeはファイル名変更で更新されていることがわかる

[参考](http://x68000.q-e-d.net/~68user/unix/pickup?%A5%BF%A5%A4%A5%E0%A5%B9%A5%BF%A5%F3%A5%D7)
systemd-nspawnをGCPで使ってみる

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 7日目の記事です。

GCPでsystemd-nspawnをやってみます

こんな構成にしてみたいと思います
ubuntuの中で走らせたApacheにリバースプロキシできればOK

![gcp.png](https://qiita-image-store.s3.amazonaws.com/0/106549/d18480fb-32bf-b61e-c7c0-e2f7405b3d98.png)

```bash
# ブリッジインターフェイス作成
apt install bridge-utils
systemctl enable systemd-networkd
cd /etc/systemd/network/
curl -sL https://goo.gl/LygWai > br.network
curl -sL https://goo.gl/iHeGDK > bridge.netdev
curl -sL https://goo.gl/8KbBsW > eth0.network

# 転送設定
cd /etc/network/if-pre-up.d
curl -sL https://goo.gl/KX1qH3 > ore_iptables
chmod +x ore_iptables
curl -sL https://goo.gl/5N9v8K > /etc/sysctl.conf

# systemd-nspawn設定
apt install -y systemd-container debootstrap
curl -sL https://goo.gl/Y1KGge > /etc/systemd/system/systemd-nspawn@.service

# コンテナ配置
cd /var/lib/machines/
debootstrap --arch amd64 xenial ./ubuntu http://archive.ubuntu.com/ubuntu
curl -sL https://goo.gl/MogJPf > ubuntu/etc/systemd/network/80-container-host0.network

# コンテナ内部設定
systemd-nspawn -D ubuntu/ # コンテナ内へ
passwd # パスワード設定
systemd-nspawn -b -D ubuntu/ # bootしてログイン
systemctl enable systemd-networkd systemd-resolved.service
systemctl start systemd-networkd systemd-resolved.service
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
apt update && apt upgrade
apt install dbus
systemctl poweroff
machinectl start ubuntu

# nginx設定
apt install -y nginx
curl -sL https://goo.gl/mEHzTa > /etc/nginx/sites-available/default
systemctl restart nginx
```

できました(｀・ω・´)v
Ionic Viewが使いたくてionic uploadしたいけどなかなかできない - Ionic Proの場合は？

# `ionic upload` なんて知らないよ！

Ionic Proと連携していないプロジェクトで、タイトルの通り Ionic View を使いたくてIonic Proのアカウント作成からはじめてみました。

`ionic login` でIonic Proのアカウントを設定し、`ionic link` でプロジェクトをIonic Proと連携させるところまでは上手くいきましたが、Ionic Viewをしたいアプリをアップロードするために `ionic upload` を実行すると次のエラーが出て軽く悩みました。

```bash
$ ionic upload
[ERROR] Sorry! The configured backend (pro) does not know about ionic upload.

        You can switch backends with ionic config set -g backend (choose from pro, legacy).
```

# 解決法

Ionic Proでは `ionic upload` の代わりに `git push ionic master` でアップロードします。

"fatal: your current branch 'master' does not have any commits yet" と出た場合はローカルのリポジトリにファイルをコミットすると治りました。

その後は、 Ionic Proのダッシュボードを開き、アプリの CODE > Builds から各コミットの DEPLOY をクリックしてデプロイするとスマートフォンのIonic View側で表示されます。
DEPLOY が表示されないときはビルドが完了していません。

<img width="1014" alt="Screenshot 2017-12-09 02.25.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/216963/1f460ea9-6aec-1a7e-d590-edded1aaa1bd.png">


# 追伸

`ionic upload` のリファレンスを見ると理由が分かりました。

> WARNING: Ionic Cloud is deprecated and will reach end-of-life on January 31st, 2018. This command will not be supported afterwards. Ionic Pro takes a different approach to uploading. See the Getting Started documentation for details: https://ionicframework.com/docs/pro/basics/getting-started/

ionic upload - Ionic CLI Documentation 
https://ionicframework.com/docs/cli/upload/
Advent of Code day5をPerl 6で

こんにちは、8日目の投稿になります。
今日は投稿がなかったようなので、私の[Advent of Code day5](https://adventofcode.com/2017/day/5)の回答を貼っておきます。

```
use v6;                                                                                                                                                
my Int @maze = $*IN.lines>>.Int;                                                                                                                       
my Int $pos = 0;                                                                                                                                       
do while $pos != +@maze {                                                                                                                              
    $pos += @maze[$pos]++;                                                                                                                             
    1                                                                                                                                                  
}.sum.say;                                                                                                                                             
```

+ ポイント
  +  do-whileを使うとブロックの最後の値が評価されたもののリストを作ることができます

以上、8日目の投稿でした。
chrome remote desktopはdual displayに非対応

下記を機械翻訳した結果をざっくりまとめると
https://productforums.google.com/forum/#!topic/chrome/-RxiRwf_-a8
 -Windows 7でも同様に発生する
 -クライアント側はiPhone, iPad問わず発生する
 -Macをミラーディスプレイに設定すると、リモート接続が正しく機能

下記リンク先でバグフィックスされたような記載もあるけど自分の最新のchromeでは発生している
https://bugs.chromium.org/p/chromium/issues/detail?id=450254

それはそれとしてgoogle翻訳が2,3年前に比べると遥かに精度が良くなってるので英語のテキストがんがん読めるのでオススメ
pythonを使って機械学習をしたい

pythonで機械学習を用いて文字領域を検出するプログラムを作りたいと思っています。
数百枚の画像を白黒の二値化し、黒い部分の面積、周囲の長さを求めるプログラムを作りたいのです。フォルダ内に数百枚の画像があるのですが、この画像を一気に二値化し面積、周囲の長さを求めるプログラムを教えて頂けませんか。