OmniAICreator/Qiita-1.07M huggingface dataset:
dotnet core のすゝめ

この記事はSFC-RG Advent Calendar 2017の３日目です。

## 動機
webもGUIもコンソールアプリケーションもアプリもおなじげんごでかけて、ふくすうのプラットフォームでうごいたらいいなとおもいました。

## dotnet core とは
>.NET では、クラウド、IoT、ゲームなどのさまざまな種類のアプリを、無料のクロスプラットフォーム ツールを使用して構築できます。 アプリは、Android、iOS、Linux、macOS、Windows で実行できます。 サーバーまたはデスクトップにアプリを展開し、モバイル デバイスへの展開用としてアプリ ストアに発行します。 .NET は学生やプログラミング愛好者も利用することができ、海外の活気ある開発コミュニティに参加したり、多くの .NET テクノロジに貢献したりできます。 
https://docs.microsoft.com/ja-jp/dotnet/welcome

なんか良さげ。

## 導入方法
過去記事参照
https://qiita.com/kumasan1011/items/49748c5587a7d9d0f9f1

## 動かしてみる
バージョン確認

```
kumasan@desktop:~$ dotnet --version
2.0.2
```

プロジェクトの作成

```
kumasan@desktop:~$ dotnet new console -o test
テンプレート "Console Application" が正常に作成されました。

作成後のアクションを処理しています...
'dotnet restore' を test/test.csproj で実行しています...
  Restoring packages for /home/kumasan/test/test.csproj...
  Generating MSBuild file /home/kumasan/test/obj/test.csproj.nuget.g.props.
  Generating MSBuild file /home/kumasan/test/obj/test.csproj.nuget.g.targets.
  Restore completed in 126.28 ms for /home/kumasan/test/test.csproj.


正常に復元されました。
```
ビルド

```
kumasan@desktop:~$ cd test
kumasan@desktop:~/test$ dotnet build
.NET Core 向け Microsoft (R) Build Engine バージョン 15.4.8.50001
Copyright (C) Microsoft Corporation.All rights reserved.

  test -> /home/kumasan/test/bin/Debug/netcoreapp2.0/test.dll

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:01.41
```
実行

```
kumasan@desktop:~/test$ dotnet run
Hello World!
```

動いた。

このままだとdotnet runでしか動かないので、自分のプラットフォーム向けにビルド。

```
kumasan@desktop:~/test$ dotnet publish --runtime ubuntu.14.04-x64
.NET Core 向け Microsoft (R) Build Engine バージョン 15.4.8.50001
Copyright (C) Microsoft Corporation.All rights reserved.

  test -> /home/kumasan/test/bin/Debug/netcoreapp2.0/ubuntu.14.04-x64/test.dll
  test -> /home/kumasan/test/bin/Debug/netcoreapp2.0/ubuntu.14.04-x64/publish/
```

```
kumasan@desktop:~/test$ cd /home/kumasan/test/bin/Debug/netcoreapp2.0/ubuntu.14.04-x64/publish/
kumasan@desktop:~/test/bin/Debug/netcoreapp2.0/ubuntu.14.04-x64/publish$ ./test
Hello World!
```

おお動いた。

##まとめ
マルチプラットフォームで何でもできたら嬉しいよねって話でした。C#はいいぞ。
[Cinema 4D] Pythonプラグインのsymbolが認識されない

Pythonにてタグプラグインを作成していたところ，ヘッダーファイルに記述したはずのDescIDが正常に認識されていない状況に陥った．

Cinema 4D上ではstrファイルに記述した文字情報はパラメータ名として表示されているし，.resファイルで指定したパラメータとしても読み込まれている．

しかし，このパラメータ値をINIT関数で初期化しようとしたり，値を代入しようとするとAttributeErrorが出てしまい，そのIDは存在しないと言われる．こちらとしてはパラメータ上には見えているし，問題はなさそうだが，パラメータをスクリプトマネージャにドラッグ&ドロップしたところ，IDがグレーの文字になっている...通常はIDはオレンジ色になる．

ヘッダーファイルもリソースファイルも読み込まれており，パラメータは見えるのに，何故か使えない．そんな状況．

そこで，plugincafe.comで似たようなスレッドがないか探してみると，同様の症状を発見．どうもsymbolcacheファイルを一旦削除すると認識されるようになるらしいので，さっそく試した．
[plugincafe.comのスレッド]
http://www.plugincafe.com/forum/forum_posts.asp?TID=5891&KW=AttributeError&PID=24703#24703

削除するファイルは，
C:\Users\ユーザー名\AppData\Roaming\MAXON\CINEMA 4D R19\prefs\symbolcache

すると，symbolは無事に認識され，パラメータもコンソール上でオレンジ色表記になった．

というわけで，相変わらず乱暴な記事だが備忘録として記しておく．
Juliaデータサイエンスを読んだ感想

この記事は、[Julia Advent Calender](https://qiita.com/advent-calendar/2017/julialang)２日目の記事です。

# 概要
11月3日に[Juliaデータサイエンスワークショップ \- connpass](https://data-refinement.connpass.com/event/70804/)を開催し、[Juliaデータサイエンス―Juliaを使って自分でゼロから作るデータサイエンス世界の探索](https://www.amazon.co.jp/Julia%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E2%80%95Julia%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E8%87%AA%E5%88%86%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E4%B8%96%E7%95%8C%E3%81%AE%E6%8E%A2%E7%B4%A2-Anshul-Joshi/dp/486043501X)の１章から５章を読んでJuliaに入門してみようというワークショップを行いました。
この記事では、これからこの本を購入しようか迷っている方などに向けて、ワークショップに参加して初めてJuliaを使ってみた感想と、私が担当だった３章（データ探索）において、本のコードが動かなかった箇所や、面白いと思った箇所について書きます。

# 感想
休日の10時から16時までのワークショップと長時間にもかかわらず、20人弱の方に参加いただき、私が発表の時にはわからない箇所も教えてもらうなど、活況に終わりました。
Juliaの実行速度の速さという魅力に多くの人が興味があるんだなという感想です。とはいうもののまだまだ「一部で人気の言語」という段階であり、今後のv1.0のリリース以降は更に盛り上がると思うのでとても楽しみです。


# 本（Juliaデータサイエンス）の内容
Juliaデータサイエンスは、[Julia for Data Science: Anshul Joshi: 洋書](https://www.amazon.co.jp/Julia-Data-Science-Anshul-Joshi/dp/1785289691/ref=pd_sbs_14_2?_encoding=UTF8&psc=1&refRID=40ZMJ7KZK4ZHZ388KKC9)を訳した本であり、1章から5章でJuliaの環境構築や、関数、可視化の方法などを学んだあと、６章から１１章で機械学習や深層学習についての内容となっています。よいところと悪いところは、以下のように感じました。
## 良いところ
- (Julia言語の持ち味かもしれないが)他の言語をかじったことがあれば、理解な記述が多くわかりやすい
- 日本語訳がわかりやすい（主観的な感想ですが、不明なところはない訳でした）
- サンプルコードが上がっている
## 悪いところ

- サンプルコードがJupyterNotebook形式で上がっていない
- 一部のコードが最新のJuliaのバージョンでは動かない

最新のバージョンで動かないものがあるのは当然なので、全体としてとても良書だと思います。


# ３章データ探索について
ワークショップで私は、３章を担当したので3章について書いていきます。
ワークショップで使ったコードは、[gist](https://gist.github.com/currypan/605482f68cab763d04f40dd28be835df)にあげたので参照ください。

## ３章で関心したこと
### ヒストグラム(76頁)
ヒストグラムは、以下のコードを書くだけで、こんなに綺麗な図を描くことができまて、感動しました。
![Chapter3_hist.png](https://qiita-image-store.s3.amazonaws.com/0/18991/d627fb7e-28f2-3e1d-48db-7a1fde37c683.png)


```julia

plot(x = sleep[:Reaction],Geom.histogram(bincount = 30), color = sleep[:Days])

```



## ３章で動かなかった箇所など
v0.6.1の私の環境では、本のコードで一部動かない箇所や推奨されないと表示された箇所があったので、参考にかいておきます。

### Trimmean(61頁)
上位と下位を除いて平均をもとめるtrimmeanは推奨されないと表示されました。今後は`use mean(trim(x,p/2)`というように書いて、`trim`関数で上位と下位を除いてから`mean`関数で平均をとる方が推奨されるようです。

### 平均絶対偏差
６６頁に`mad(a,5)`という記載がありますが、`mad!(a,5)`というように書く必要がありました。

### ヒストグラム（75頁）
以下のようにどちらに閉じているか、境界での扱いを指定してやる必要がありました。

```julia

# 本のコード
h = fit(Histogram,(rand(100),rand(100)),nbins=10)

# 修正後
h = fit(Histogram,(rand(100),rand(100)),nbins=10,closed=:right)

```

# 最後に
Juliaに入門してみた感想を書きました。
Juliaの下手なコードを受け入れてくれる懐の深さはとても魅力に感じているので、もう少し学びたく、今後のアドベントカレンダーの記事をとても楽しみにしています。
Tryとパターンマッチで例外処理を整理する

例外を投げるライブラリを使おうとすると途端に泥臭くなりがちです。
渡された数値で日付を生成するときなど、DateTimeExceptionを考慮しtry-catchで分岐して…などやり始めるとコードの見通しが悪くなります。

####例題
2組の年・月・日の数値から、より未来の日付を導く

```scala:ｺﾃｺﾃにtry-catch
def dateOrMin(y:Int, m:Int, d:Int): LocalDate = {
  try {
    LocalDate.of(y,m,d)
  } catch {
    case _: Throwable => LocalDate.MIN
  }
}

val d1 = dateOrMin(2017,0,1)
val d2 = dateOrMin(2017,12,3)

if (d1 == LocalDate.MIN && d2 == LocalDate.MIN){
  throw new DateTimeException("どっちも不正な日付です…")
}else if(d1 isAfter d2) {
  d1
} else {
  d2
}
```

`scala.util.Try` が便利でした

```scala:ｽｯｷﾘ
def tryDate(y:Int, m:Int, d:Int): Try[LocalDate] = Try{ LocalDate.of(y,m,d) }

(tryDate(2017,0,1),tryDate(2017,0,1)) match {
  case (Success(d1),Success(d2)) => if(d1 isAfter d2) d1 else d2
  case (Success(d1),Failure(_)) => d1
  case (Failure(_),Success(d2)) => d2
  case _ => throw new DateTimeException("どっちも不正な日付です…")
}
```

Tryは`toEither`や`toOption`を備えているので、forの中で扱うにもよいです。
組合せ最適化でボンバーパズルを解く

Advent Calendar 2日目の記事 [組合せ最適化でカックロを解く](https://qiita.com/SaitoTsutomu/items/76e13aea15be17b9fd06)
Advent Calendar 4日目の記事 [組合せ最適化でエデンの園配置を証明する](https://qiita.com/SaitoTsutomu/items/a6456ecc781bd0b5b567)

## これなに

**ボンバーパズル**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題

下図の白いマスに爆弾が隠れています（下図は答えなので爆弾（●）が見えています）。
数字はヒントで、周囲9マスの爆弾の数になります。数字のマスに爆弾が入ることはありません。
![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/bomber.png)

`data`にヒントの数字が入っているとします。

```py3:python
import numpy as np, matplotlib.pyplot as plt
from pulp import LpProblem, lpSum, value
from ortoolpy import addbinvars
data = """\
12..1
..3.1
.4.3.
..4.2
22..2""".splitlines()
```

## 変数表

下記のような変数表を作成します。各行の変数は0または1をとります。
変数の値が1ならば、該当行 該当列のマスに爆弾があります。
「字」は`data`の値です。「`.`」でないならば、爆弾はないので、`Var`に0を代入します。

<table><tr><th></th><th>行</th><th>列</th><th>字</th><th>Var</th></tr>
<tr><th>0</th><td>0</td><td>0</td><td>1</td><td>0</td></tr>
<tr><th>1</th><td>0</td><td>1</td><td>2</td><td>0</td></tr>
<tr><th>...</th><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

```py3:python
ni,nj = len(data),len(data[0])
a = pd.DataFrame([(i,j,data[i][j]) for i in range(ni)
    for j in range(nj)], columns=list('行列字'))
a['Var'] = addbinvars(len(a))
a.loc[a.字!='.','Var'] = 0
a[:2]
```


## 数理モデルを作り解く

変数表ができたので、ボンバーパズルの解になるように、制約条件を追加し数理モデルを作成し、解きましょう。

- 周囲9マスの爆弾の合計を数字の通りに。 …(1)
    - 周囲9マスは、`DataFrame.query`で簡単に取り出せます。

```py3:python
m = LpProblem()
for i in range(ni):
    for j in range(nj):
        if data[i][j].isdigit():
            q = f'{i-1}<=行<={i+1}&{j-1}<=列<={j+1}'
            m += lpSum(a.query(q).Var) == int(data[i][j]) # (1)
m.solve()
```

### 結果の表示

```py3:python
a['Val'] = a.Var.apply(value)
a.loc[a.Val>0.5,'字'] = '●'
print('\n'.join(' '.join(c) for c in a.字.values.reshape(ni,nj)))
>>>
1 2 ● . 1
● . 3 ● 1
. 4 ● 3 .
● ● 4 ● 2
2 2 . ● 2
```

解けていることが確認できます。

以上
Snaptube app

<a href="https://snaptubeappapkdownload.com/">Baixar snaptube</a> is a video download application specially designed for Android OS. Nowadays we can not download video on Youtube, but Baixar snaptube is an app where you can download video from facebook, instagram, youtube and many other social sites. <a href="https://snaptubeappapkdownload.com/">Click here</a> to know more
ブロックチェーンが導いてくれるかもしれない日本の未来

大仰なタイトルをつけてしまいました。
[Startup Weekend Advent Calendar 2017](https://adventar.org/calendars/2374) の2日目の記事となります。

## ブロックチェーンという技術で日本に革新が起こるかもしれない

プロックチェーンと聞いて、よく分からないという感想を持たれる方は多いのではないのでしょうか。
あるいは、投資やICO、違法取引に使われる技術で、自分には関係がないと思われているかもしれません。

私は、ブロックチェーンが日本の社会構造を変える力を持っているんじゃないかと最近思い始めました。
本やネット記事からの知識を、自分なりの気付きも含めてまとめたいと思います。

NOTE: ここでのブロックチェーンは、Bitcoin のような価値移転としてのブロックチェーンだけでなく、Ethereum のような「分散アプリケーション基盤としてのブロックチェーン」の意味合いを強く含んでいます。というか、かなりそちら寄りなので注意してください。

## ブロックチェーンは中間者をなくす

ブロックチェーンは、取引における中間者業務を取り払います。

ブロックチェーンは自律化組織として側面を持ちます。
対象的なものが、ロボットによる自動化です。Ethereum 創設者のヴィタリックによると、ロボットは労働の代替となり、管理は人間が行います。ブロックチェーンは管理の代替であり、労働は人間が行います。

日本は、このままでは超高齢社会が確実に来ます。
ブロックチェーンや AI といった技術が革新的な変化をもたらすとき、よく「人間の仕事が奪われる」と言われます。
しかし日本では、人間の仕事が技術に奪われることを心配するよりも、仕事ができる人間が少なくなることを心配すべきと思います。
現在ですら、日本国民の3人に1人は60歳以上です。今後はさらに働ける人は減っていき、働けない人が増えていくはずです。だから今ある仕事を減らさなければならないのです。

ブロックチェーンによって契約の自動化が一般的になれば、複雑な契約の手順を人間が行う必要はなくなります。
フリマアプリでの取引を例として挙げてみます。

1. Aさんが商品を送れば、Bさんはお金を払います
2. ただし、発送の証明として送り状の控えを写真で送るまでは送金されません
3. もし1週間以内に送り状の控えが送られなければ、取引がキャンセルされます
4. もし送り状の控えに不備があることをBさんが申告すれば、取引がキャンセルされます
5. もし送金後に商品の到着で不備があることをBさんが申告すれば、返金処理を行います

これらは例ですが、恐らく取引の中でこのような手順を踏んでいるはずです。複雑な手順を管理することは、人間よりもコンピュータが向いています。
ブロックチェーンでは、こういった手順を自動化できます。これにより、取引を仲介する人がいなくなる日がくるかもしれません。

取引の仲介者としての仕事がなくなったとき、人間はもっと本質的な仕事に取り組めるようになるはずです。
人間にしかできない、もっと知的な作業、創造的な作業です。
こうした知的作業、創造的作業こそ、高齢者に向いている仕事ではないかと私は思います。
ものを売ったり買ったり作ったりする仕事です。60歳、70歳を超えた人が体力や場所に関わらず続けられ、認知症予防になり、いつまでも社会との接点を持ちながら、若々しくいられる仕事です。

## ブロックチェーンはフラットな社会を作る

日本人には自信を持って働いている人が少ないと、私は思います。
なぜ自信を持って働けていないのかというと、恐らく日本社会の階層構造です。

日本では経験を積んだ人や上に立つ人、有名な人が偉い。だからそういった立場になれないとダメだと思い込んでしまいやすいのです。誰もが初めは何もないところからスタートするにもかかわらず。
そして下の人は、創造的な仕事をさせてもらえない。正しくは、理由を持たない仕事が多いと思います。上からの命令だから、が理由として通じてしまうのが問題だと思います。
それでもイノベーションは海外からどんどん入ってくるし、その潮流に敏感な人はすぐ日本の階層構造から抜け出していくし、日本では大きな組織にいることが安定とも言われなくなるし、日本の多くの人はそういった悩みに晒されています。
組織の中では上からの命令を聞けることが良しとされ、社会の中では組織を抜け出すことが良しとされる。この矛盾を抱えながら、組織の中で苦しんでいる人は多いのではと考えています。

だから個人でも仕事ができる、働ける世の中にしていくべきだと思います。
一人一人が、自分でお金を稼ぐ力を身に付けられれば、自信を持っていきいきと働けるはずです。

インターネットは個人が強い社会を生み出してくれると思われましたが、実際は違いました。

インターネットが生まれたことで、誰にでも世界への情報流通が可能になり、ものを売り出せるようになりました。しかし、インターネットには信頼の概念がありません。今のインターネットでは、皆が Google の検索結果しか信用せず、Amazon か楽天でしかものを買いません。

Amazon や楽天はユーザにとっては便利ですが、ものを売る人にとっては、Amazon や楽天に店舗として登録しないとものが売れないことになります。Amazon や楽天に利益は集まりますが、個人での商売は成り立たなくなってしまいます。しかし Amazon や楽天に頼らなければ、決済や在庫管理、発送通知などを個人で行わなければならないかもしれません。そもそもユーザからすると、誰かも分からない個人にクレジットカードの情報を渡すのは抵抗があるでしょう。

ブロックチェーンは、相手を信頼しなくても安心に取引ができる技術です。
取引に信頼できる仲介者は必要ありません。取引における手順はすべて公開され、自動化されます。例え決済の専門家でなくとも、決められた手順を実行するだけで良くなります。

個人が階層社会に頼らずにお金を得られるようになる。
ブロックチェーンはその基盤になってくれるかもしれないと、私は期待しています。

## 宣伝

来年3月、ブロックチェーンをテーマにした Startup Weekend を初開催します。

日本の社会構造を変えるインパクトをもたらせるのは、やはりスタートアップだと私は信じています。
スタートアップの登竜門と言われる Startup Weekend で、日本のブロックチェーンスタートアップを増やしたいと考えています。

この記事を見て、少しでもブロックチェーンに興味を持っていただけたら幸いです。
動くGIFのチュートリアルを作ってみた

##はじめに
[アドベントカレンダー3日目](https://adventar.org/calendars/2289#list-2017-12-01)は新潟県十日町市で開発したアプリ[まちかどギルド](https://itunes.apple.com/jp/app/まちかどギルド/id1263820744?mt=8)についてです。
開発時に色々と大変なことがあったのですが、その中の一つの動くチュートリアルを作った時のことについて書きます。

※どんなアプリなのかは[こちらの動画](https://mobile.twitter.com/townsguild/status/914991553071874048?ref_src=twsrc%5Etfw&ref_url=https%3A%2F%2Fnote.mu%2Fwest2538%2Fn%2Fnf351793ccfc2)をご確認ください。

##動くチュートリアル
下記のようなチュートリアルを作成しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/89206/20d9a8c8-e2c0-8ef6-64f9-ab0bc973d9c0.gif" width="300">

##GIFをiOSアプリで再生
GIFを再生しているのですが、iOSアプリで再生するのは結構めんどくさいです。
なぜならGIFを簡単に再生する方法がXcodeでは提供されていないからです。
そのため下記のような方法でGIFを細切れの画像(UIImage)に変換して、それをパラパラ漫画のように再生しています。

```ruby:Swift
guard let gifFile = Bundle.main.path(forResource: fileName, ofType: "gif"),
     let data = NSData(contentsOfFile: gifFile),
     let cgImageSource = CGImageSourceCreateWithData(data, nil) else {
         return []
}

return (0...CGImageSourceGetCount(cgImageSource)).flatMap{ CGImageSourceCreateImageAtIndex(cgImageSource, $0, nil) }.map{ UIImage(cgImage: $0) }
```

##こだわった点
見終わった感を出すため、ページをスクロールすると今見ていたGIFは途中でも最後の画像になるようにしました。
新しく開くページは必ず最初から再生されるようにしています。
またGIFを細切れの画像に変換する処理は少し重いため、必要最低限の回数で処理しています。
例えば下記のように画像の最初と最後、枚数をキャッシュして変換を何度もしなくて良いようにしています。
UIImageViewから取ってきたら良いと言われるかもしれませんが、次の項目の困ったことを解決するためにそれができませんでした。

```ruby:Swift
tutorialItems.enumerated().forEach { i, tutorialItem in
    var images = tutorialItem.images
    let tutorialImageInformation = TutorialImageInformation(first: images.first, last: images.last, count: images.count)

    ....

}
```

##困ったこと
リリース後に発覚したのですが、古いデバイス(iPhone 4s、iPhone 5s、初期のiPad)だと落ちることがわかりました。。
原因はUIImageViewに細切れの画像を持っていたためです。
そこで再生しているGIFの画像以外は持たないようにしました。
シンプルに下記のような感じで画像を解放しています。

```ruby:Swift
imageView.animationImages = []
```

##今後の課題
今回はこれでよかったのですが、おそらく長い時間のGIFだと落ちるかもっさりします。。

##最後に
こうしてできたチュートリアルを[GitHub](https://github.com/hideyukitone/HorizontalScrollTutorialViewController)から確認できます。
もしよかったら見てください。ついでにスター付けてもらえると嬉しいですw

##余談
新潟県十日町市は縁もゆかりもないところでしたが、皆さまにあたたかくしてもらいました。
正直都会にしか住みたくないと思っていましたが、今は田舎の魅力にとりつかれていますw
とても良いところですので、もし良かったら皆さんも行ってみてください。個人的には夏がオススメです。
Aptana3からgithubを操作する

すでにgithubにRepositoryを作成していることが前提です。
(今回はREADME.mdファイルのみ存在する状態にしてます)

Apatana3のインストール手順はこちら。

[WindowsでのRails開発用にAptana Studioをインストールする手順](https://qiita.com/bosoboso/items/7c583d6839e8b782dd99)

#githubのrepositoryをcloneする
以下の手順でcloneする。

```
File > Import > Git - Git repository as New Project

Nextを選択して以下を入力
Username：githubのユーザ名
Password：githubのパスワード
URI：cloneしたいrepositoryのURL
例)https://github.com/bosoboso/GitHubTest.git
→https://github.com/[ユーザ名]/[Repository名].git
```

これで指定したフォルダにREADME.mdと.gitフォルダが出来ているはずです。
また、Aptana3のプロジェクトエクスプローラーにもgithubのRepository名でプロジェクトが作成されていると思います。

#プロジェクトを編集する
コマンドプロンプトを起動します。
画面上部のターミナルアイコンをクリックすると、プロジェクトディレクトリをカレントディレクトリにしてターミナルが画面下部のペインに表示されます。
![スクリーンショット 2017-12-03 00.47.46.png](https://qiita-image-store.s3.amazonaws.com/0/216980/6429b2dd-ff80-a28a-a685-0d8cb3c3c149.png)

ターミナルに以下コマンドを入力し、とりあえず動くものを作ってみます。

```
>cd ..
>rails new GithubTest
>cd GithubTest
>rails g scaffold GithubTest user name:text id:integer
>rails db:migrate
Gemfileに「gem 'coffee-script-source', '1.8.0'」を追記
>bundle update coffee-script-source
>rails s
```

この状態でAptana3のメニューから
Window > Show View > Web Browserでブラウザタブを表示し、
URLに以下を入力すると、↓のような画面が表示されるはずです。
>http://localhost:3000/users

![スクリーンショット 2017-12-01 19.29.46.png](https://qiita-image-store.s3.amazonaws.com/0/216980/df081999-4d34-b0b8-843e-31900240357b.png)

#githubにpush(アップロード)する
ターミナルから以下を入力。

```
>git add . 
>git commit
コミットメッセージ入力(デフォルトではviエディタが起動します)
面倒な場合はgit commit -m "Test commit"のようにオプションでメッセージを入力します
>git push
このあとgithubのユーザ名とパスワードを聞かれるので入力する
```

これでgithubにアップロードされます。

(ただAptana3上でコマンド入力しただけだった・・・。)
AWS Cloud9でLambdaの作成、テスト、デプロイまでの手順まとめ

# はじめに
2017/11/30にリリースされた[AWSCloud9](https://aws.amazon.com/jp/cloud9/)環境で
Lambdaに関する以下手順をまとめました。

* AWS Cloud9にLambda作成
* AWS Cloud9でローカルテスト
* AWS Lambdaへデプロイ

AWS Cloud9の環境作成方法は以下記事で行っています。
**[AWS Cloud9を動かしてみた](https://qiita.com/icck/items/7705ef6871e261d6535e)**

# AWS Cloud9にLambda作成

1. AWS Cloud9の右側にAWS Resourcesタブがあるのでクリック
2. 上にあるλ+マークをクリック。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/2e0fd4e1-bb92-bad9-b992-d2b526e9ef2b.png)

3. ファンクション名、テンプレートを決めてNext

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/13e8d3fb-b5cb-bc1c-65bf-1ce65a05231f.png)
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/039a73d4-ad2e-f19f-4682-240d0b97b3d0.png)

4. トリガーは今回はnoneを選びました。

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/01e385db-a90d-117b-f1ba-2f70c5e97fe7.png)


5. メモリとロールを選択。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/a668c9a3-abdc-925f-e841-7591bb269dcf.png)

6. FinishをクリックしてLambda functionの完成です

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/f417d965-a2e5-a929-4520-bd22352ca6a5.png)

7. 各種ファイルが出来ました。
  * 左にAWS Cloud9上の環境
  * 真ん中にLambdaのソース
  * 右上にAWS Cloud9のローカルにできたファイル
  * 右下にAWS Lambda上にできたファイル

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/56c09193-d52c-7a4b-310d-d7b5eb6b3c8f.png)

8. AWS Lambdaを確認。ローカル作成と同時に初回デプロイは完了していました。

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/47580e0e-fc17-58d7-ff0d-1cac5024c8ea.png)

# AWS Cloud9でローカルテスト
AWS Cloud9上でハロワを書いて実行してみます。
テスト用のJSONファイルを作成し、実行。

* 左側環境に「lambda-payloads.json」が自動で保存されました。
* また、Function Logsに実行結果ログが表示されました。

※2017/12/02現在はLambda+pythonの場合ブレークポイントデバッグはできません。
公式サイトではNode.jsはデバッグ出来てるようです。

>Debug the Local Version of a Lambda Function or Its Related API Gateway API
>
You can debug local Lambda function code or its related API Gateway API in your environment using common debugging aids such as breakpoints, stepping through code, and setting watch expressions.
>
Note
You cannot debug the remote version of a Lambda function or its related API Gateway API in your environment. You can only invoke it.
>You cannot debug local Lambda function code that uses Python.


![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/de693045-a2c5-9740-9cea-74a4b0fc0b21.png)

# AWS Lambdaへデプロイ

右側「↑」をクリック。1アクションでAWS Lambdaへデプロイ完了。

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/3f6e425b-682e-ab33-51ea-264da98f634c.png)

AWS Lambdaのダッシュボードから編集内容が反映されていることを確認。

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/216527/92927d40-3ab3-6e65-5cd0-35c01c97d575.png)

# まとめ
* AWS Cloud9を使いブラウザ上でLambda開発、テスト、デプロイができました。
* クライアント端末の環境構築がいらない分Lambda開発のハードルが下がったと思います。
Cで一見FizzBuzzに見えないFizzBuzz (未定義っぽい動作もあるよ。リトルエンディアン専用)

```c
#include <stdio.h>

int main(void)
{
    int i;

    for(i=1;i<=100;i++) {
        long long int f = ((21846*i>>16)-(21845*i>>16))*2054842694;
        long long int b = ((13108*i>>16)-(13107*i>>16))*2054845762;
        printf((char*)&f);
        printf((char*)&b);
        f||b||printf("%d",i);
        puts("");
    }
}
```

整数型のポインタを`char*`に読み替えるの、未定義動作だった気がするけど、よく理解していない。
さらには、文字コードがASCII互換かどうかは処理系依存だったはず。
私の処理系ではintは4バイトだったので、long long intにしておかないとNUL文字を入れる場所がなくなって、ちゃんと表示できない。

`(21846*i>>16)-(21845*i>>16)`の部分について。
`(1<<16)/3.0`は21845.3333...になる。なので、iが十分に小さければ `21846*i>>16`は`i/3`になる。
で、3回引き算して`i%3`にしようかと考えていたが、`21845*i>>16`は、ちょうど`i%3==0`のときだけ、`21846*1>>16`と答えが違うことが分かった。なので、それを使った。
その下の行も同様。
IoTシステム技術検定試験(中級)を受けてみた

2017/12/2にIoTシステム技術検定試験中級を受けてきたので所感をまとめておく。

# 試験内容について

カリキュラムは[公式](http://www.mcpc-jp.org/iotkentei/)や[前回記事](https://qiita.com/h-sakano/items/98a97056ef381c51fd56)を参照のこと。

発表されているカリキュラム通りの割合で各項目、公式テキストから出題された。
苦手部分と思われたセンサに関して、
テキストではセンサ毎に回路図などを用いて仕組みを細かく解説されているが、
試験的には各センサが何に使われるかなど、概要がわかっている程度で良かったみたい。

あとは、IoTシステムの構成に関する問題や、IoTシステムの構築に必要なPANやWANの無線通信技術に関する問題が多かった気がする。

計算問題は帯域幅の計算に関する問題が１題だけあった。

# 出題方法について

形式は覚えている範囲で以下のパターンがあった。

+ 〜について正しい記述の組み合わせを選択せよ
+ 〜について適切な記述を1つ選択せよ
+ 〜について不適切な記述を１つ選択せよ
+ 空欄に入る適切な語句を選択せよ
    + 2つ空欄があり、その組み合わせを回答するもの
    + 1つだけ空欄があるもの

# 試験時間について

選択式80問に対して試験時間が90分。
悩む問題や計算問題がほぼ無いので、時間は50分ほどあまった。
残り時間を見直しや自己採点に当てることができた。

# 受験者について

イケイケWebエンジニアより、古参風オッサンエンジニアが圧倒的に多かった。
若い層はIoTに手を出してる人は少ないのか、資格試験勉強よりも実践的に手を動かして頑張っているのか・・・。
後者ならいいんだけど、前者の場合は若い人にも頑張って欲しい。
オッサン達は今から勉強してもなかなかフルスタックにはなれないと思う。

# まとめ

「広く浅く」な出題内容で、「IoTシステム開発入門」といった内容だった。
中級はたぶん受かったが、これに受かったからといって、製品レベルのIoTシステムが構築できるわけではない。
例えばテキストではクラウドサービスに関する情報はほぼ皆無である。
プライベートインフラが無い人にとってはGCPやAWSなどの知識は必須だろう。

また、この分野は移り変わりも激しいので、注意が必要である。
例えば、公式テキストでは分散データ処理プロダクトとして、Hadoopが挙げられているが、
個人的には最近はApache Beamが良い感じだと思っている。
常に情報にアンテナを貼る必要はあるだろう。
オプトに転職して7ヶ月が経ちました。

[Opt Technologies Advent Calendar 2017](https://qiita.com/advent-calendar/2017/opt-technologies)の4日目です。

ちきさんです。

2017年5月に[オプトテクノロジーズ](https://www.opt.ne.jp/opttechnologies/)に転職して7ヶ月が経ちました。
アドベントカレンダーに何を書こうかなと思っていたら、オプト以前と以後では随分と変わったなあとしみじみ思ったのでそのあたりを書いていこうと思います。

# GitHub

### オプト以前

リポジトリを作ってmasterにpushするぐらいしかしたことなかった。

### オプト以後

トピックブランチを切って開発をしてPR出してレビュー受けてdevelopブランチにマージしてとか本格的に使ってる。issueとかがんがん使ってる。

# Git

### オプト以前

VSCodeのGit機能とSourceTreeを使ってGit操作をしていた。

### オプト以後

全てTerminalでやるようになった。SourceTreeとかだとむしろやりづらくなった。

# 言語とか

### オプト以前

TypeScriptとかAngularとかRxJSとかよくやってた。

### オプト以後

TypeScriptもやってるけどScalaやってる。Scalaは何かを知らない人のために説明すると、読みやすさのために読みやすさを犠牲にした言語です。慣れると読みやすいらしいです。本件に関してコメントは受け付けません。

# クラス設計

### オプト以前

なんか適当にやっていた。

### オプト以後

役割をちゃんと考えて適切な設計を考えるようになった。

# 周りの人達

### オプト以前

特に強い人はいなかった。

### オプト以後

強い人達ばかりになった。

# 受賞とか

### オプト以前

特になし

### オプト以後

オプト全体では700人くらいだが、その中で(多分)200人くらいの領域という括りがあり、領域の中で準MVP賞をいただいた。なんかよくわからないけどがんばっていたらしくて認められたらしい。少しだが賞金もいただいた。

# 優勝とか

### オプト以前

特になし

### オプト以後

開発合宿という1泊2日の温泉旅館に泊まって8チームに分かれて「突破力」というテーマで競うイベントがあり、僕がリーダーを務めたチームが優勝した。そしてチームはアメリカ旅行に行く権利を手にした。

# 電話とか

### オプト以前

毎日電話で受け答えをしていた。

### オプト以後

職場にいるとき電話を使ったことがない。

# 平日の朝

### オプト以前

6時前には起きて7時過ぎの満員電車に乗っていた。

### オプト以後

8時過ぎくらいに起きて適当な時間の電車に乗ってゆったりと座ってPCを開くなどしている。

# 業務時間の過ごし方

### オプト以前

超絶キャッチアップしていた。(職場にはいたが)

### オプト以後

仕事をするようになった。

# 休日の過ごし方

### オプト以前

超絶キャッチアップしていた。

### オプト以後

ゆっくりと映画を観て過ごすなどしている。

# 充実感

### オプト以前

ただ暇なだけだった。(職場にはいたが)

### オプト以後

あの優雅だった暇な時間はなくなったがとても充実している。

---

以上です。ありがとうございました。
[python]scipyで距離行列を作る

##目標
行列$M$の行$m_i, m_j$の距離からなる距離行列$dist(M)$を作る。

```math
M = 
\begin{pmatrix}
m_1 \\
m_2 \\
\vdots \\
m_k
\end{pmatrix}\\

dist(M) = 
\begin{pmatrix}
dist(m_1,m_1) & dist(m_1,m_2) & \dots & dist(m_1,m_k)\\
dist(m_2,m_1) & dist(m_2,m_2) & & \vdots\\
\vdots & & \ddots & \\
dist(m_k,m_1) & \dots & & dist(m_k,m_k)
\end{pmatrix}
```

##ソース

```python
import numpy as np
from scipy.spatial import distance

M = np.random.randint(0, 10, (5, 2))
dist_M = distance.cdist(M, M, metric='euclidean')

# M =>
# [[8 7]
#  [8 0]
#  [8 3]
#  [9 6]
#  [3 4]]

# dist_M =>
# [[ 0.          7.          4.          1.41421356  5.83095189]
#  [ 7.          0.          3.          6.08276253  6.40312424]
#  [ 4.          3.          0.          3.16227766  5.09901951]
#  [ 1.41421356  6.08276253  3.16227766  0.          6.32455532]
#  [ 5.83095189  6.40312424  5.09901951  6.32455532  0.        ]]
```

## おまけ
```python
import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(dist_M)
plt.show()
```
$m_0$と$m_3$の距離が小さいことが視覚的にもわかりやすくなります。
![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/196110/e4852661-4775-ea44-f6e7-eaa63c948ae2.png)

## 参考
https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html
https://seaborn.pydata.org/generated/seaborn.heatmap.html
アロケータを作ってみた話

### 概要  
この[スライド](https://www.slideshare.net/alwei/ss-11521742)を見ている時に思いついた。
こんなアロケータあってもいいんじゃない？って言う提案。（ガベコレとかマルチスレッドの話はしません）

### 前置き
メモリプール・スモールオブジェクトアロケータ・TLSFなど、速度と割当の正確性がトレードオフになっているメモリアロケータは数多く存在します。

その一方、寿命の制御を手放すことで高速且つ正確な割当を実現しているアロケータもあります。
これらのいいとこ取りを出来ないでしょうか。


という事で、高速で割り当てる層と正確に割り当てる層の二層で構築されるアロケータを組んでみました。

### フロー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/139188/edf0af80-19fd-3827-6231-80899919d4dc.png)

### 実装
[こちら](https://github.com/Himatyu/Qiita/tree/master/SUKUNA)

### まとめ

今回実装した二層アロケータは、速度を優先としたFrontと正確性を優先したBackのと言った実装でした。
今回はFrontとBackの二度割当をしていますが、Backを別スレッドなどで行うことでさらなる高速性を得られそうです。
Google FormからFusion Tablesに自動的にデータを追加

# はじめに
　「RDBを使ったWebアプリを作ってくれと言われた。でも使用頻度はそんなに高くないから速度とかはほとんど追求しなくていい。そんなアプリをユーザーに便利でしかも自分も簡単に作れるようなサービスがないかな。もちろん**無料で**」
　これが今回僕がGoogle Fusion Tablesを選んだ理由です。
　[Fusion Table](https://support.google.com/fusiontables/answer/2571232?hl=en)とはGoogle Drive上で使えるRDBアプリケーションで、本来はGoogle Mapとの連携や複数のユーザー間での共有（マージ）に強みがあります。ですが、一人で、通常のRDBとして使用する場合でもGoogle Drive上で使えるというのはなかなか魅力的です。
　Fusion Tableには[悪いうわさ](http://www.minemura-coffee.com/entry/2016/06/24/001419)もありますが、そのあたりはおいおい検証することにして、今回はGoogle Formから入力されたデータを自動的にFusion Tableに追加する方法について説明したいと思います。実は[公式のサイト](https://cdn.rawgit.com/fusiontable-gallery/fusion-tables-api-samples/master/FusionTablesFormSync/docs/reference.html)に説明が載っているので、英語が読めればこちらを読んで下さい。

# Form を作る
Fusion Tableに入れ込むデータを入力するインタフェースの部分です。普通にGoogle Drive上で`New->More->Form`を選べば作れます。今回はこんな感じのフォームを作りました。

![s_Screenshot from 2017-12-02 23-36-02.png](https://qiita-image-store.s3.amazonaws.com/0/176789/9b331b4a-b3b9-014b-18b9-8019c7c1eba7.png)

FormはデフォルトでSpreadSheetと連携するようになっているので、なにかデータを入れれば自動的にそれに対応するスプレッドシートが作られるはずです。

# Fusion Tableを作る
はじめて作る方は`New->More->Connect more app`からFusion Tableを追加して下さい

![Screenshot from 2017-12-02 23-41-05.png](https://qiita-image-store.s3.amazonaws.com/0/176789/a58370c2-9377-3bcb-51ee-cb5843e30419.png)

追加できたら、フォームと同じように`New->More->Fusion Table`が選べるようになっているはずなので、クリックしてテーブルを作成して下さい。
この時テーブルのカラム名はフォームで作った項目名と揃える必要があります。
Fusion Table上の`Edit->Change Columns`を選んでデフォルトの設定を変更して下さい。この時、GoogleFormが自動的に作成するカラムでTimestampもあるので、これも追加してやる必要があります。

![Screenshot from 2017-12-02 23-44-46.png](https://qiita-image-store.s3.amazonaws.com/0/176789/d4f4bccf-0358-61a3-c30f-4ec4026f73a2.png)

（まだデータは入れなくて大丈夫です）

# スクリプトを設定する
今度はスプレッドシートを使います。フォームの出力先のスプレッドシートを開いて`Tools->Script Editor`からスクリプトエディタを起動して下さい。開いたら`File->Project Properties`で出てくるダイアログボックスにdocidというカラムを追加して下さい。

![docid.png](https://qiita-image-store.s3.amazonaws.com/0/176789/bd3552fb-4787-ac5b-e245-72e9ceff58cd.png)

valueのところにはFusion Tableのidが入ります。idはFusion Tableに移動して`File->About this table`から見れます。
終わったらこの[インストラクション](https://developers.google.com/apps-script/guides/services/advanced#enabling_advanced_services)にしたがってFusion APIを有効にします。あとはこの[コード](https://cdn.rawgit.com/fusiontable-gallery/fusion-tables-api-samples/master/FusionTablesFormSync/src/formsync.js)をエディタにコピペするだけです。

最後にパーミッションの設定のため`Run > checkAuthorization`で認証をして、フォームが送信されたらスクリプトを起動するように設定しましょう。![Screenshot from 2017-12-02 23-57-25.png](https://qiita-image-store.s3.amazonaws.com/0/176789/94f74311-aeb0-9aaf-d953-0ace43007f1a.png)

# 試してみる
Google FormからデータをSubmitすると・・・

![s_Screenshot from 2017-12-02 23-59-54.png](https://qiita-image-store.s3.amazonaws.com/0/176789/d06050fc-efca-9760-0966-afe6097ef48d.png)

数秒後にはFusion Tablesに反映されている！（要リロード）

![Screenshot from 2017-12-03 00-00-07.png](https://qiita-image-store.s3.amazonaws.com/0/176789/aee64be7-ec0d-6dbf-ca40-1158e233f0c4.png)

進捗があればまた報告します。

2017/12/14追記
結局Google Fusionは使わずにherokuでやろうと思います。個人的にはAPIのハードルやジョインの困難さが今回見送った要因です。
OpenFOAM ソースコードの探し方

# OpenFOAMはオープンソース

OpenFOAMはマニュアル等がないわけではないが、機能の使い方を網羅しているドキュメントはない。場合のよっては処理内容を知るためにソースコードを読んだ方が早い場合がある。
今回はソースコードの探し方についてのメモ。


# ソースコードの場所

OpenFOAMが実行可能な状態で以下コマンドを実行。

```code:境界条件、乱流モデルのソースの場所
$ echo $FOAM_SRC
```

```code:ソルバのソースの場所
$ echo $FOAM_SOLVERS
```

```code:ユーティリティのソースの場所
$ echo $FOAM_UTILITIES
```

# 検索してみる

場所が分かってもたくさんあるソースコードをひとつづつ探すと手間だし、めんどくさい。
なのでfindとgrepを使って検索する。

例えば乱流モデルのk－ωモデルに関するソースコードは以下のようにして探す。

```
$ find $FOAM_SRC | grep "kOmega"
```

inletOutetの境界条件のソースを探すときは次のような形で探す。

```
$ find $FOAM_SRC | grep "inletOutlet"
```

simpleFoamソルバのソースは以下のように探す。

```
$ find $FOAM_SOLVERS | grep "simpleFoam"
```


ユーティリティmapFieldsのソースは以下のように探す。

```
$ find $FOAM_UTILITIES | grep "mapFields"
```

それぞれ実行するとgrepで指定したキーワードの付いたファイルパスのリストが帰ってくる。
OpenFOAMではケースフォルダのインプットファイルで指定する各項目の名前がファイル名になっていることが多いため、似た名称のファイルを調査する。
特に、*.H、*.Cのファイルを読むようにする。

拡張子を絞って検索するには次のようにすればよい。

```
$ find $FOAM_UTILITIES -name *.C | grep "ideasUnvToFoam"
```

# まとめ

OpenFOAMはオープンソースなので、ソースコードもドキュメントである。ネットで出てこない情報はソースコードを見た方が早いこともあるので、検索の方法は知っておくと便利だと思う。
特にカスタマイズをするときは類似のコードをベースにした方が早いし、参考になる。
[Docker] Node.js以外のコンテナに追加でNode.jsの最新版をインストールするDockerfileの記述

Node.jsをメインで使う場合は公式のイメージを使えばOK。
https://hub.docker.com/_/node/

他の言語のイメージに、Node.jsを追加したい場合

```
apt-get update
apt-get install nodejs
```

でも良いが、これだと最新版ではないケースが多いので
任意のバージョンを取得したい場合は以下の記述にする。

```
RUN curl -SL https://deb.nodesource.com/setup_{Node.jsのメジャーバージョン}.x | bash
RUN apt-get install -y nodejs
```

https://deb.nodesource.com/setup_{Node.jsのバージョン}.x
は公式が提供しているインストール用スクリプト
https://github.com/nodesource/distributions
HTMLにJavaScriptを埋め込む(メモ)

#HTMLにJavaScriptを埋め込む方法
1.外部スクリプト - HTMLファイルとは別にJavaScriptファイルを作って、\<script>タグのsrc属性にパスを書く
2.インラインスクリプト - HTMLファイルの\<script>タグの中に書く
3.イベントハンドラ - タグの中にイベントを書く

##1.外部スクリプト - HTMLファイルとは別にJavaScriptファイルを作って、\<script>タグのsrc属性にパスを書く
・コードとロジックを分離できるので、管理が楽、再利用もしやすい
・JavaScriptファイルがキャッシュされるので、パフォーマンス向上に繋がる

##2.インラインスクリプト - HTMLファイルの\<script>タグの中に書く
・body要素の配下に書くことができる、基本的にbody要素の中に書く場合は \</body>の直前に書く。
そうすることで、描画後にスクリプトが読み込まれるようになる
・head要素の配下に書くことができる、JSは、関数を呼び出すscriptよりも、関数を先に定義しなければいけないので、head要素内に書かないといけないときもある
※個人的にはコードとロジックの分離的な面で、JSは外部ファイルに移すべきではないかと思う。どうなんでしょうか。

##3.イベントハンドラ - タグの中にイベントを書く
・コードとロジックが混在してしまうので、読みにくい
・UIに依存してしまうので、再利用がしにくい。
・修正、変更する際に大変 ※ロジックとコードを分けておけば、ロジックの変更だけですんだりする
CommandLineからGithubにPullRequest/Issue/ReleaseNoteを作成する

# Hubコマンド
[Hub](https://github.com/github/hub)を使うことでコマンドラインからPullRequest、Issue、ReleaseNoteを作成することができます。


# 導入方法
```
brew install hub
```

```
hub --version
> git version 2.15.0
> hub version 2.2.9
```

# PullRequest作成
まずは、pullRequestのためのテンプレートを作成します。

```pullRequest.txt
This is a Title

### Issue
 - The issue is blah blah blah

### Overview 
 - fixed something

### Links
 - https://example.com/link/to/your/issue

### PR ステータス
 - [ ] 実装完了
 - [ ] レビュー
 - [ ] レビュー指摘対応
 - [ ] 完了
```

最初の一行目の「This is a Title」がpullRequestのタイトルになります。
二行目移行が本文になります。

```
hub pull-request -F pullRequest.txt -b takusemba:master -h takusemba:your-branch
```

PullRequestが作成されました。

<img width="782" alt="スクリーンショット 2017-12-02 23.49.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/93589/38f493a4-0495-a8e9-1db3-da98d85cb7e1.png">


# Issue作成
次にIssueを作成します。作成方法はPullRequest時とほぼ同じです。


まずは、 Issueのためのテンプレートを作成します。

```issue.txt
This is a Issue

### Overview 
 - I think blah blah blah

### Links
 - https://example.com/link/to/your/issue
```

PullRequestと同じように最初の一行目の「This is a Issue」がIssueのタイトルになります。
二行目移行が本文になります。

```
hub issue create -f issue.txt
```

Issueが作成されました。

<img width="772" alt="スクリーンショット 2017-12-02 23.56.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/93589/9e5b687f-0a5f-4d75-7db9-2673a0bec101.png">

# ReleaseNote作成

最後にReleaseNoteを作成します。

```releaseNote.txt
Version 1.0.0

## whats new
 - FeatureA is added
 - Fixed bugs
```

こちらも同様に最初の一行目の「Version 1.0.0」がReleaseNoteのタイトルになります。
二行目移行が本文になります。


```
hub release create -f release.txt your_tag
```


ReleaseNoteが作成されました。

<img width="769" alt="スクリーンショット 2017-12-03 0.03.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/93589/69282216-2264-5eaa-66fb-93b0dfff22ce.png">



# 感想
Jenkinsと組み合わせると良さそう。
itemgetter/attrgetterでsortedのkeyをスッキリさせる

この記事は [Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017](https://qiita.com/advent-calendar/2017/python-short-code) の3日目です。

# はじめに

[sorted関数]やlistの[sortメソッド]でソートキーを指定するには、引数keyにソートキーを取得する関数を指定します。
keyは[ラムダ式]で書くことが多いですが、特定の条件では[itemgetter]と[attrgetter]を使うとスッキリ書くことができます。


[sorted関数]:https://docs.python.jp/3/library/functions.html#sorted
[sortメソッド]:https://docs.python.jp/3/library/stdtypes.html#list.sort
[ラムダ式]:https://docs.python.jp/3/tutorial/controlflow.html#lambda-expressions
[itemgetter]:https://docs.python.jp/3/library/operator.html#operator.itemgetter
[attrgetter]:https://docs.python.jp/3/library/operator.html#operator.attrgetter

# [itemgetter]

指定インデックスの値を取得する関数を作成します。
listやdictのような`[]`で要素を指定するオブジェクトから値を取得するのに使用します。

```py3:ソート対象データ
values = [
    {'name': 'tarou', 'kokugo': 60, 'sansuu': 70},
    {'name': 'jirou', 'kokugo': 90, 'sansuu': 70},
    {'name': 'hanako', 'kokugo': 60, 'sansuu': 30},
]
```
```py3:ラムダ式を使う場合
sorted(values, key=lambda x: (x['kokugo'], x['sansuu'],), reverse=True)
# [{'name': 'jirou', 'kokugo': 90, 'sansuu': 70}, 
#  {'name': 'tarou', 'kokugo': 60, 'sansuu': 70}, 
#  {'name': 'hanako', 'kokugo': 60, 'sansuu': 30}]
```

```py3:itemgetterを使う場合
from operator import itemgetter
sorted(values, key=itemgetter('kokugo', 'sansuu'), reverse=True)
# [{'name': 'jirou', 'kokugo': 90, 'sansuu': 70}, 
#  {'name': 'tarou', 'kokugo': 60, 'sansuu': 70}, 
#  {'name': 'hanako', 'kokugo': 60, 'sansuu': 30}]
```

# [attrgetter]

指定属性の値を取得する関数を作成します。
`obj.attr`のように`.`で属性を指定するオブジェクトから値を取得するのに使用します。

```py3:ソート対象データ
from datetime import date
values = [
    date(2017, 12, 1),
    date(2015, 11, 3),
    date(2016, 10, 3),
]
```
```py3:ラムダ式を使う場合
sorted(values, key=lambda x: (x.month, x.day,))
# [datetime.date(2016, 10, 3), 
#  datetime.date(2015, 11, 3), 
#  datetime.date(2017, 12, 1)]
```
```py3:attrgetterを使う場合
>>> from operator import attrgetter
>>> sorted(values, key=attrgetter('month', 'day'))
[datetime.date(2016, 10, 3), datetime.date(2015, 11, 3), datetime.date(2017, 12, 1)]
```

# 参考

- Python3 ドキュメント
    - チュートリアル
        - [ラムダ式]
    - ライブラリーリファレンス
        - [組み込み関数 - sorted][sorted関数]
        - [list - sort][sortメソッド]
        - [operator.itemgetter][itemgetter]
        - [operator.attrgetter][attrgetter]
BitVisor tools/logの使い方

もうみなさんご存知かも知れませんが、BitVisorのtools/logの使い方の紹介です。

# tools/logとは

このディレクトリには、BitVisorのログをLinuxのログに出すためのカーネルモジュールのソースコードが入っています。

BitVisorのログを見る手っ取り早い方法としてはtools/dbgshがありますが、インタラクティブなインターフェイスでprintfデバッグのログを観察するには不便なところがあります。tools/logでは、Linuxカーネルのタイマー機能を用いて自動的にログをポーリングして出してくれて、しかもたいていのGNU/Linuxディストリビューションでは最初からカーネルログがファイルに書き込まれる設定になっているので、ファイルにも残って便利というわけです。

# BitVisor側の設定

make configでLOG_TO_GUESTを有効にしましょう。

```
$ make config
```

本機能はdbgshとは異なり、特権レベル0からしか制御できないようになっていますので、一般ユーザーからどうこうできるようなものではありませんが、デフォルトではオフになっています。

# カーネルモジュールのビルド

tools/logディレクトリでmakeコマンドを実行すると、現在動作中のカーネルソースあるいはヘッダーを用いてカーネルモジュールがビルドされます。

```
$ make -C tools/log
```

Debian GNU/Linuxをお使いであればlinux-headers-amd64などの必要なパッケージをインストールしておきましょう。別のカーネルソースを利用する場合は、そのディレクトリに移動して、make SUBDIRS=/path/to/tools/log modulesという風にしてビルドします。

# カーネルモジュールのロード

BitVisor上でGNU/Linuxを起動したら、tools/logディレクトリでmake loadコマンドを実行すると、カーネルモジュールがロードされます。

```
# make -C tools/log load
```

余談ですが、GNU Make 4.0からはload directiveというものが追加されたため、以下のMakefileの記述はload directiveに:という引数を与えたと解釈されてしまい、エラーになります:

```
load :
```

これの対策のため現在は以下のようにスペースを除いた記述となっています:

```
load:
```

なお、GNU Makeのinfoを見ても:の前後にスペースを入れるのは普通のことであるようですし、他のmakeコマンドの実装ではload directiveなどというものは存在しないので、こんな回避策を入れなければならないのは奇妙な話ではあります。loadというファイルをターゲットにすることはありそうですが、:なんてファイル名を使うことはまず考えられないので、GNU Make側でうまく解釈してくれよ、という感じがします。

# ログの確認

カーネルモジュールをロードしたらログが出るようになっています。試しにdbgshで以下のように"free"宛にmsgsendintします:

```
$ ~/dbgsh
> sendint 
sendint> free
send 0 to free
sendint>
> exit
```

これはBitVisor内の空きメモリーの容量を出力するものです。以下のように出力されていることが確認できます:

```
$ dmesg|tail -1
[  438.934984] VMM: 2663 pages (10652 KiB) free
```
12月2日「初心者向けXamarinハンズオン #4」を振り返って

このカレンダーは、[Xamarin その1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/xamarin-student)[初心者さん・学生さん大歓迎！] 　3日目の記事です。

昨日の「[初心者向けXamarinハンズオン](https://jxug.connpass.com/event/64867/)」、大変お疲れ様でした。
今回はやはり最初に躓く「環境」でのはまりどころがかなりのウエイトを占めたかと思います。

自分自身もXamarin環境を構築する時、自分で更新プログラムを適用しないといけないことがまず構築する際につらいポイントでした。
そして、このハンズオンでやっとAndroidエミュレーターでデバッグをすることができたので、本当にコミュニティの皆様にはとても感謝しております。

さて、その「環境構築」に関してのお話です。
Xamarinでアプリを作る際の誰もが嫌になるのは、「初回のビルドが失敗すること」。これをみんなで解決できることがこのハンズオンにはあると思います。
では、大幅な流れを見ておきましょう。

１．PCスペックの確認
２．開発環境投入
３．デバッグ機器の用意
４．初めての「Hello World」

となります。これを見ると、一見どのプログラミング界にあり得ることだと思われます。しかし、Xamarinをやるのにあたって、慎重な見極めが必要となってくると思います。

１．PCスペック
これに関ては、本日多くの人が苦しい結果になった方もいると思います。というのは、Xamarinに関しては少々多めのメモリを必要とします。
残念ながら最低でも8GBのRAMが必要になってきます。というのも、親元の統合開発環境（Visual Studio）が最近大容量のメモリを要求してくるのです。これを考えると、最低でも8GBはあったほうがいいでしょう。また、仮想環境での開発となってくるとその分メモリを消費します。となると、16GBのほうが「人権がある」といえるのです。（その分余裕持てるはずだ）
また、ストレージに関しては500GB以上の容量があると理想的なのかなと思います。まあねがわくはSSDでの開発のほうがもっと効率的だと感じます。

MacではMac BookとかProのエディションで高スペックの容量を確保できます。ですので、パソコン買い、初期投資惜しまずにね。


２．開発環境投入
開発には、WindowsではVisual Studio、MacではVisual Studio For Macです。個人利用の場合は無償で利用できます。
最新の2017では、Xamarinの開発関連のツールをワンタッチでインストールを行えます。デバッグ時間短縮のためにもぜひともUWPは入れておきたいものです（Macでは利用不可）。インターネットは安定環境かつ制限なしの回線でやるのがいいでしょう。
VSインストール後はAndroid SDKの確認もしておきましょう。ここがうまくいかないとデバッグにものすごい時間を食う可能性があります。

３．デバッグ機械の用意
Androidは手持ちの機器でやるのがいいと思います。しかし、残念ながら一部は相性の関係もあるので、自動ツールでの開発も検討してみてください。（今度ハンズオンやろうと検討中）
一部界隈では五輪までに技適ない端末の使用ができなくなるとかの話もあるようです。
一番いいのはNexus端末がいいとか。最近はドライバの相性の問題は少ないようです？？

４．Hello World
Xamarinで一番神経を使うのはまさに「Hello World」だと思います。
今回のハンズオンではかなりエラーメッセージが出るなどして環境面で2時間も時間を食ってしまいました。　今回はここの知見について書きたいと思います。

VS17において、Android実機デバッグの際にAPIがないとかの場合、下記の方法を試してください。
ソリューションファイルのAndroid部分を右クリック→プロパティ―表示→最初の画面の「ターゲットフレームワーク」のドロップダウンリストがありますよね？「Androidバージョンを使用したコンパイル」のところを、「最新のプラットフォーム」にすると現在の流通している端末でのデバッグがほとんどで簡単になると思います。

もしAndroidの用意ができない時の暫定版としては、X86・UWPにターゲットを変更しローカルコンピューターでデバッグする方法もあります。その場合はデバッグ前に設定画面が出るので「開発者モード」にしてくださいね。

Androidのデバッグに関しては、プロジェクトを作成して直ちに初回のビルドを余裕のあるうちにやっておきましょう。
大量のパッケージのダウンロードを行うのがあり、これを中断してしまうとあとあと大変なことになってくるので・・・

これをやっとくと楽になりますよ。

10人十色の環境構築、Xamarinの様々なトラブルに悩まされるなら、一度不定期に開催されるJXUG主催の「初心者向けハンズオン」に参加してみるといいかもしれません。
JXUGのイベントページは[こちら](https://jxug.connpass.com/)です。


Xamarinをやるうえで私の考えていることは、１に環境、１に環境、その次にハンズオン教材だと・・・
環境が安定するまでいろいろ粘ると思いますが、悩んだら一度、[#JXUG](https://twitter.com/search?q=%23JXUG&src=tyah)で呟いてみてください。
【Ruby】「これが解けるような秀才は募集しておりません^^」を解く！

# はじめに
@Kuniwakさんが投稿していた
[「これが解けるような秀才は募集しておりません^^」Prolog「まかせろ」](https://qiita.com/Kuniwak/items/4fbeb4bd574b2980626f)を読みました．

この問題自体は解いたことがあったのですがプログラムにしたことはなかったので，自分自身のスキルアップがてら挑戦してみることにしました！

（Rubyマスターでもなんでもないので，こうした方がいい，こう考えた方がいいなどあれば，是非コメントください！）

# 問題「これが解けるような秀才は募集しておりません^^」
```
みなみとかおりの二人が数当てゲームをしていて、さやかが横で見ている。

このゲームは二人が1～13のトランプのカードの中から1枚取り、
先に相手の数字を当てた方が勝ちになるもので、みなみとかおりは自分のカードの数字しか見ることはできないが、さやかは二人のカードの数字を見ている。
3人が次の順で会話したとき、みなみとかおりのカードの数字を答えなさい。

さやか「二人のカードは異なる数字で、どちらも１ではない。片方がもう一方の整数倍の数字になっている」
みなみ「うーん、わからない」
かおり「私もわからない」
みなみ「そうか、今わかった」
```

# プログラム
```ruby:solution.rb
# 「どちらも1ではないわ」ということなので2からスタート
2.upto(12) do |minami_number|  
  # 「二人のカードは異なる数字」
  # 「片方がもう一方の倍数になっているわよ」
  # 上記条件に合うかおりのカード候補を取得
  candidate_arr = (2..12).select do |kaori_number|
    ((minami_number % kaori_number).zero? || (kaori_number % minami_number).zero?) && minami_number != kaori_number
  end

  # 「うーん、わからないわ」
  # => kaoriの候補番号が2つ以上ある状況
  next if candidate_arr.size < 2
  delete_arr = Array.new
  candidate_arr.each do |num|
    multiple_arr = Array.new
    2.upto(12) do |divisor|
      next if num == divisor
      
      # kaoriの候補番号の倍数を調べる（1つしかないならkaoriは分かるはず）
      if num % divisor == 0 || divisor % num == 0
        multiple_arr << divisor
      end
    end
    # 「私もわからないわ」
    # => kaoriの候補番号の倍数が1つの場合は「私はわかる」はず
    if multiple_arr.size == 1
      delete_arr << num
    end
  end
  delete_arr.each do |num|
    candidate_arr.delete(num)
  end

  # 「そうか、いま、わかったわ」
  if candidate_arr.size == 1
    puts "minami : #{minami_number}"
    puts "kaori  : #{candidate_arr.first}"
    break
  end  
end
```
今の自分にはこれが限界のようです…

# おわりに
当たり前ですが，本問題では，会話の内容が相手の番号を当てるためのヒント，すなわちプログラム内の条件式となります．

会話の中から条件となる部分を抽出し，プログラムに記述する中で，
「こうやって現実にある問題をプログラムに落とし込んでいくんだなー」と実感しておりました：）

最近，設計に興味を持ち，「エリック・エヴァンスのドメイン駆動設計」を読んでいるのですが，上述した作業がDDDにおける現実の問題をドメインに落とし込む作業に近いんですかね？どうなんですかね？

というわけで，プログラムや最後のDDDっぽいのかな？などの点について，あなたのコメントをお待ちしております！

ありがとうございました．

# 編集
・2017年12月4日（月） @t2kojima のコメントをもとに修正
修正前

```ruby
candidate_arr = Array.new
  2.upto(12) do |kaori_number|
    # 「二人のカードは異なる数字」
    next if minami_number == kaori_number
    # 「片方がもう一方の倍数になっているわよ」
    if minami_number % kaori_number == 0 || kaori_number % minami_number == 0
      candidate_arr << kaori_number
    end
  end
```
修正後

```ruby
# 「二人のカードは異なる数字」
# 「片方がもう一方の倍数になっているわよ」
# 上記条件に合うかおりのカード候補を取得
candidate_arr = (2..12).select do |kaori_number|
  ((minami_number % kaori_number).zero? || (kaori_number % minami_number).zero?) && minami_number != kaori_number
end
```

*他にもArray.newがあるけど…さて，どう消すべきか*
PomeraのデータにNetBSDからアクセスしてみる。

[NetBSD Advent Calendar 2017](https://qiita.com/advent-calendar/2017/netbsd) 2日目は、[Pomera](http://www.kingjim.co.jp/pomera/)のデータにNetBSDからアクセスしてみる話をしようと思います。

## Pomera DM20

といっても、手元にあるのは[Pomera DM20](http://www.kingjim.co.jp/pomera/dm20/)という、生産終了している製品なのです...。小型で持ち運びやすく、単四電池2本で駆動するという点が魅力だったのですが、だいぶ酷使してしまったので故障してしまいました。折りたたみ式のキーボードだったので、開閉を繰り返しているうちに内部のケーブルが一部断線してしまったようです。
サポートセンターに問い合わせてたところ、2014年8月にディスコンになっているけど、それから数年くらいは修理対応できますとのことだったので、どうしようか思案中です。

## NetBSD的にはPomera DM20ってどう見えるの？

PomeraをUSBでNetBSDに接続すると、デバイスとして `dev/sd*` として見えます。Pomeraの内蔵メモリと外付けSDカード、それともう一つの領域があるようで、実際には `/dev/sd{0..2}` のデバイスが一度に生えてくる形になります。
ファイルシステムはFATで、そのまま `mount_msdos` でmountできます。

## NetBSDからファイルを編集する際の注意

ファイルシステムがFATということもあり、ファイルエンコーディングはcp932になっています。Pomera上で作成したファイルだと注意は不要ですが、NetBSD側からファイルを作成するような場合はファイルエンコーディングの変換が必要になります。
(emacsを使っている場合は、エンコーディングが `EES(DOS)` と表示されていればOKです)

## PomeraでMagicPointのスライドを作成する

個人的なPomeraの使用用途としては、通常のメモ作成ということもありますが、[MagicPoint](http://member.wide.ad.jp/wg/mgp/)のスライドを作成するという用途でも使っていました。
ただし、チルダが `iconv` コマンドでコード変換がエラーに鳴るため、別の文字に置き換えておく等の一手間が必要でした。

## 応用例

USBで接続すると `/dev/sd*` として見えるガジェットはたくさんあるので、NetBSD的な操作をユーザに見せないような形にすると、意外と需要はあるのかなとも思います。
ガジェットの製造元が提供する専用アプリはWindowsのみでの動作だったり、古い機種ではアプリのサポートが終了していたりするので、単にファイルシステムの中身を見るだけであれば、例えばNetBSD+Raspberry Pi等でUSBを指したらSamba経由で `/dev/sd*` が家庭内LANから参照できるといった使い方でも十分な気もします。

## まとめ

簡単ではありますが、PomeraをNetBSDから使っていたよという話を書いてみました。
`/dev/sd*` として扱えれば応用ができそうという話は、具体的な利用シーンを思いつけばNetBSDの組み込み周りに強いという利点を活かせそうな気がしています。
Google Home x IFTTTで、ラジオ体操報告ツイート！


[スマートスピーカーIFTTT 大喜利 アドベントカレンダー](https://qiita.com/advent-calendar/2017/ssifttt)3日目です。

昔のフジテレビでやってた「ひょうきん族」の「懺悔の部屋」というコーナーを真似て、懺悔をする（日記をかく）アプレットを作ろうと頑張ってたのですが、色々つまづいてしまい、IFTTTで日本語はまだ厳しいのではとぐったりしてました。
時間が迫ってきたので、以前作ったアプレットをご紹介します。





# 概要

- 名前：ラジオ体操をしたことをGoogle Homeでツイッターに報告
- URL：https://ifttt.com/applets/wYHRBFah-google-home
- 使ったもの：Google Home Mini、Twitter

腰痛がひどくて整体に通っていたところ、ラジオ体操を勧められました。[個人用のAlexa skillを作って](https://qiita.com/sitopp/items/d398893722386bb08cb6)体操しているのですが、朝忙しかったりしてサボリがちです。そこでツイッターによる衆人環視の助けを借りることにし、このIFTTTアプレットを作りました。


## 使い方

- 上記のURLで、アプレットを「ON」にする。
- Tweet textや、Image URLが変更できるので、そのままでもいいし、変更しても良い。
- どのtwitter IDにログインするかを聞かれるので、ログインする。
- 3分くらい待つ。
- Google Home に「OK グーグル、ラジオ体操をしたよ」と話しかける。
- 正常に認識した場合、「お疲れ様でした。ツイートします！」と音声応答。
- 自分のtwitter IDにツイートされる。


## IFTTTのコンフィグ


![スクリーンショット 2017-12-02 22.53.15.png](https://qiita-image-store.s3.amazonaws.com/0/173392/332ec151-9c62-a310-17bf-c6bb4cd1dff6.png)

上のスクショでは見れないところをイカに書いときます。

### IF

Trigger：Google Assistant, "Say a simple pharase"


- What do you want to say?： 「ラジオ体操をしたよ」
- What's another way to say it? ：「ラジオ体操をしました」
- What do you want the Assistant to say in response?：「お疲れ様でした。ツイートします！」
- language：Japanese

### Then

Action:Twitter, "Post a tweet with image"
Tweet text: 
　ラジオ体操をしました！
　Google Home  - IFTTT
Image URL:[イラストやさんの画像のURL。](https://1.bp.blogspot.com/-a9hBgh2eC2A/WYAypwegupI/AAAAAAABF3c/TCsj9f8l4IkttfA3PIRJGGlGMlBaxxrMQCLcBGAs/s180-c/undoukai_fuusenwari.png)


# 大事な点

- 最初、ラジオ体操を「何回」やったか、を拾ってツイートさせようとしたのですが、Google Home側で、可変部分の聞き取りの精度が低く、「すみません、わかりません」の連発になってしまい心が折れてやめました。
- [Google Home Miniは明日から半額セール](https://akiba-pc.watch.impress.co.jp/docs/wakiba/find/1094438.html)するそうですし、これでまたユーザーが増えればデータもたまり、学習が捗ると思いますので、半年後くらいにまたチャレンジしてみようと思います。

こんなつまらんものを一般公開して果たしてニーズがあるのか謎ですが、公開されてる日本語の音声アシスタント向けIFTTTが皆無なので、まぁ、日本人も頑張ってるぞと言うことで出しときます。
怒られたら下げます(^^;)

# 健康増進！

以上です！
STM32F070xBで組み込みBootloaderを使って書き込んでみる

[高知工科大 Advent Calendar 2017](https://adventar.org/calendars/2305) 3日目の記事です。
# 概要
- STM32F070xBの組み込みブートローダーを使って書き込む話。
- あとハマった話とかも。

# 環境
Windows 10
STM32F070RB
System workbench for STM32
STM32CubeMX 4.16.1
STM32CubeF0 1.6.0

# Boot mode

STM32F0には三種類のBoot状態がある。
BOOT0 pinを操作することによりFlash起動かそれ以外かを切り替えることができる。
nBoot1 bitを操作することによりFlash起動じゃない場合に組み込みブートローダー(System memory)か内蔵SRAMか選択できる。
nBoot1 bitはOption ByteというFlash領域に存在する。(Main Flash memoryではない)
![boot_mode.png](https://qiita-image-store.s3.amazonaws.com/0/67288/148ae327-1f3c-3d6c-83de-7af3ccedd3c3.png)

- **Main Flash memory**
    - 通常は Main Flash memoryで起動する。
    - 動作としてはブートメモリ空間(0x0000 0000)にMain Flash Memory(0x0800 0000)がエイリアスされる。
- **System memory**
    - System memoryはSTM32系固有の組み込みBootLoader
    - UART,I2C,DFU(USB)などを用いてFlash全領域を書き換え可能。
    - System memory自体の書き換えはできない。
- **Embedded SRAM**
    - ブートメモリ空間(0x0000 0000)に内蔵SRAM(0x2000 0000)がエイリアスされる。
  
今回は組み込みBootloderであるSystem memoryを使うため、
nBoot1 bit = 1
BOOT0 pin = 1
となる。
nBoot1 bitは工場出荷時状態が1なのでそのままで良い。
BOOT0 pinはタクトスイッチで行うことにした。 
# 組み込みBootloader
_**AN2606 STM32 microcontroller system memory boot mode**_を読むとマイコンのシリーズごとにSystem memoryの内容が異なることがわかる。
今回は**STM32F070xB**を使用するので、その項目を見ると以下のようなbootloaderがある。

- **USART1 bootloader**
- **USART2 bootloader**
- **USARTx bootloader**
- **I2C1 bootloader**
- **DFU bootloader**

今回はUSBからFlashを書き換えたいのでDFU(Device Firmware Upgrade) bootloaderを使う。
# 書き込みファイル準備
PC側はSTMicroの[DfuSe](http://www.st.com/ja/development-tools/stsw-stm32080.html)を用いて書き込む。
DfuSeから書き込む場合のファイル形式は\*.dfuである必要があるので\*.elfから変換する。
fw.elfが書き込みたいファイルだとする。
elfファイルから直接dfuに変換する方法は見つからなかったので、一旦intel HEXフォーマットにしてからdfuにする。
```
$ arm-none-eabi-objcopy -O ihex fw.elf fw.hex
```

DfuSeをインストールすると付属するDfu File Manegerを起動する。
S19 or Hexをクリックしfw.hexを選択する。
Generate をクリックするとdfuファイルが生成される。

# 書き込み
System memoryを起動した後、どうすればDFUが有効になるかわからないのでフローチャートを見てみる。
![bootloader_selection.png](https://qiita-image-store.s3.amazonaws.com/0/67288/ce461c47-a4b8-ff41-def1-8a7bdaee4f2a.png)
このフローチャートを見ると、USBがDetectすればいいことがわかる。要するにUSB挿せばDFUモードになる。

System memoryに入った状態のボードをPCに挿すとデバイスドライバのインストールが行われた。
DfuSeのAvailable Devicesを見ると **STM32 Device in DFU Mode**と表示されていた。
この状態でChoose...で生成したdfuファイルを選択し、Upgradeを押せば書き込みが完了する。
![dfuse_successful.png](https://qiita-image-store.s3.amazonaws.com/0/67288/5f69d5b6-d419-3c01-d9ef-640b8e47c5da.png)

# まとめ
- STM32F070xBで組み込みBootloaderから書き込むことができた。

# ハマったこと
ハマったことを書いておく。
## STM32F070xB のあるロットのSystem memoryの不具合
最初どうあがいてもSystem memoryが起動しなかった :innocent: 
STM32 ST-LINK UtilityでSystem memory(STM32F070xBの場合は0x1FFF C800)を見てみると明らかにベクターテーブルがおかしい :innocent: 
STM32F070xBのエラッタシートを見ても特に記載なし :innocent: 
いろいろ調べてみるとSTmicroのCommunity siteを見るとなにやら同じような状態の人がいる...
どうも動作しないBootloaderが焼かれたロットがあるらしいことが書いてあった:scream:
https://community.st.com/thread/18955?commentID=139468&et=watches.email.outcome#comment-139468
ハズレを引いたと思って、別の所で買いなおしたらあっさり解決。
## HSEを外したら動かなくなった
クリスタル外したくて内部クロックにしたら動作しなくなった。
AN2606のNoteをちゃんと読むとSTM32F070xBの場合HSE（外部クロック）が存在しないとDFUのみ使えなくなるとのこと。
AN2606のNoteに書いてあるのでデータシートちゃんと読め案件。
でもSTM32F071xx/72xxは内部クロックでもDFUが動くよ！紛らわしいね！
Xamarin Live Playerで出来ること、出来ないこと

# はじめに

WindowsでXamarin開発していると困るのがiOSの扱い。
Mac使えよ、と言われてしまえばそれまでなのですが、いやMac高いじゃないですか。

そこで、彗星のごとく現れたのが **Xamarin Live Player** 。
このXamarin Live Playerについて、まだ使って日は浅いですが、使っている中で気付いた「出来ること」「出来ないこと」をまとめてみます。

# Xamarin Live Playerとは

iOS / AndroidのアプリとしてXamarinから提供されているテスト実行用のアプリです。

1. アプリをインストール(GooglePlay / AppStore どっちでも配布中！)
2. PCとスマホを同じネットワークに接続(ケーブルいらず！)
3. VisualStudioから呼び出すだけ

これだけで簡単にアプリをiOSやAndroid上でテスト実行出来るというシロモノです。
元々VS2017ではPreview版での限定機能になっていましたが、執筆段階での最新バージョン15.4.4では普通に使えるようになってました。

なんとこれ、 **WindowsからiPhoneでプレビューすることも出来ます** 。

えっ、Macいらなくね。

「Xamarinは銀の弾丸ではありません」と、XamarinのユーザーグループJXUG主宰の田淵さん(@ytabuchi )が至る所で仰ってます。
このXamarin Live Playerも、銀の弾丸ではありません。
出来ること、出来ないことがあったりします。

# 出来ること

## Mac持って無くてもiPhoneでテストが出来る

**半分本当です。**
iOSアプリをビルドするためには、その仕様上MacとXcodeが必要です。
なので、iOSアプリを実際にデバッグするためには必然的にMacとXcodeが必要になるのですが。。

**Macも、Xcodeも無し** に、WindowsからiPhone上での実機テストが出来ちゃいます。

私もWindowsでXamarinの勉強をしていますが、レイアウトの練習する時には非常にお世話になってます。
Xamarin.FormsではそれぞれのOSに合ったUIになりますが、こういう見た目になるのか、というのがすぐ確認出来て非常に楽です。

どうやら「Xamarin Live Player」というアプリの中でいろいろ再現してくれているようです。

なぜ **「半分」** なのか？それは後述します。

## デバッグが出来る

シミュレーター同様、普通にデバッグ実行が出来ます。
ブレークポイントもちゃんと利く。
ネットワークで繋げてるだけなのに…不思議。

## レスポンスは良好

アプリ上でいろいろ再現して動かしている割に、レスポンスは非常に良好で、普通にアプリ使っているのと変わりません。
本当どうなってるの。

# 出来ないこと

## 制約が多い

**ある意味これが本題。**
Xamarin Live Playerは、執筆段階では多くの制約を抱えています。
[https://developer.xamarin.com/guides/cross-platform/live/limitations/](https://developer.xamarin.com/guides/cross-platform/live/limitations/)

例えば。

> Limited support for reflection (currently affects some popular NuGets, like SQLite and Json.NET). Other NuGets are still supported.

リフレクションを使用するようなものについては限定的なサポートに留まる、としています。
C#でJSONを扱うのによく使われるらしいという、「Json.NET」などは影響がある、とのことです。
Json.NETがちゃんと動かないので、ちょまどさんのGitHubでも紹介されているこのハンズオン
[https://github.com/xamarin/dev-days-labs/](https://github.com/xamarin/dev-days-labs/)
これですら動きません。 **ハンズオンレベルですら動かないのかいっ**

他にも。

> Custom Renderers are not supported.

「Custom Renderers」とは、Xamarin.Formsでプラットフォーム固有の機能を実装するための手段で、OS固有のビューを実装したい時などに使われます。
それが思いっきり **「not supported」** だそうで。
ビューの練習だけなら、と思っていたら、こんなところでも罠が。

…ということで、まだまだ限定的なところでしか使えない、というのが実情っぽいです。

# まとめ
* アプリをインストールするだけで簡単に設定可能
* **Mac持って無くても、一応iPhoneでの動作テストが出来る**
    * ある程度の練習には十分活用出来るので、そこは非常に楽
    * レスポンスも全然悪くない
* ちゃんとブレークポイントを貼ってのデバッグも出来る
* ただし、非常に制約が多い
    * 割といろいろ動かない
    * **iOSシミュレーターや、実機テストを置き換えるものではない** (Xamarin Live Playerだけでのテストは出来ない)

# さいごに
Xamarinの勉強会に参加した際に、「Xamarin Live Playerは全くオススメしません」とまで言い切られてしまったのですが、これ自体は非常に良い技術だと思っているので、少しでも制約が減って、もう少し使い勝手の良いものになると良いなと思います。
なんだかんだ、練習アプリを作るレベルでは非常にお世話になっているアプリなので。

# おまけ
しかしまあ、**そもそもMac買え** って話ですね。はい。それで全て解決する話ではある。つらい。