OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで矩形を追加

# はじめに
Unityプロジェクト内に仮のSpriteを取り敢えず配置したいけど画像を用意する程でも無い場合にUnity Editorで矩形を追加する方法を説明します。
(自分が追加方法をすぐ忘れるのでメモ…)

# 矩形の追加
メニューの [Asset] - [Create] - [Sprites] から追加したいSpriteの種類(Squareなど)を選択します。

![Sprite](https://qiita-image-store.s3.amazonaws.com/0/242340/778e5ead-1603-5f74-f2dc-b4646d233545.png)

選択するとProjectビューにSpriteが追加されます。
(下の画像はSpritesフォルダ内に追加)

![Square](https://qiita-image-store.s3.amazonaws.com/0/242340/14a58082-066b-6124-2e4d-06d7d3afc3ca.png)

Inspectorビューで任意の設定を行います。(仮に配置するだけなので、基本はデフォルト設定でOK)

後はSceneに配置し色なりサイズなり変更して使用します。

![Sprites](https://qiita-image-store.s3.amazonaws.com/0/242340/c6fd1940-f06a-d33f-8d61-8bb01bc8b5fe.png)

左から Square Triangle Diamond Hexagon Circle Polygon

おわり
Raspberry Pi Zero でBeaconの送受信は同時にできるのか検証

[link_1]:https://itunes.apple.com/jp/app/beacon%E5%85%A5%E9%96%80/id1088591228
[app]:アプリ「[Beacon入門][link_1」」

Raspberry Piを使って、Beaconのスキャン（入力）、アドバタイジング（出力）を実現できるのは既知だが、
１台で両方同時にできるかはググってもよくわからなかったので、実際にやってみた。

# この検証で使用するもの
* Raspberry Pi Zero 1台
* SDカード（8GB以上推奨。4GBでもいけるかもしれないが未検証。）
* iPhone（アプリ「[Beacon入門][link_1]」を使用）
* 開発PC（私はMacOSを使用）

# Raspberry Piセットアップ

RaspbianをSDカードに焼く手順や、PCからリモートログインする方法は、既にいろいろな方が記事をアップしてくれているので割愛する。
なおOSイメージは起動速度の早い「RASPBIAN STRETCH LITE」を推奨する。

Raspbianが起動したら、apt-getを最新にする。

```
$ sudo apt-get update
$ sudo apt-get upgrade # 念の為
```

Nodejsをインストールする

```
$ sudo apt-get install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install npm n -g
$ sudo n 9.10.1
```

Nodejsのインストール成功を確認する

```
$ node -v
v9.10.1
$ npm -v
5.6.0
```

Bleaconをインストールする

```
sudo apt-get install libbluetooth-dev
npm install bleacon
```

# ソースコード

ソースを以下のように実装する。
本プログラムはスキャンとアドバタイジングの両方を実行するものである。

```js:beacon.js
Bleacon = require('bleacon');
const uuid = 'aaaaaaaabbbbccccddddeeeeeeeeeeee';
const major = 12;
const minor = 34;
const measuredPower = -59;

Bleacon.startScanning(uuid);
Bleacon.on('discover', function(bleacon) {
   console.log(bleacon);
});
Bleacon.startAdvertising(uuid, major, minor, measuredPower);
```

実行する

`$ sudo node beacon.js`

# 検証

iOSアプリ「[Beacon入門][link_1]」を使用した。（とても便利なアプリで感謝しています）

## アドバタイジング確認

まず、Raspberry PiからiBeaconの電波がアドバタイジングされていることをiPhoneで確認する。

アプリ「[Beacon入門][link_1]」を起動し、設定（UUID等の初期設定）で以下のように設定する

* UUID
  * AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE
* Major
  * 未設定
* Minor
  * 未設定

ビーコン距離計測（距離を測定し一覧表示）を選択し、実行する。
一覧にmajor=12 minor=34のビーコンが表示されればOK。


## スキャン確認

今度はiPhoneからiBeaconのパケットをアドバタイジングして、Raspberry Piで電波を拾う。

アプリ「[Beacon入門][link_1]」を起動し、ビーコン発信を選択し、実行を押す。
iPhoneからiBeaconのパケットが出力されるので、Raspberry Piのターミナルに以下のようにrssiなどの情報が表示される。

```
{ uuid: 'aaaaaaaabbbbccccddddeeeeeeeeeeee',
  major: 100,
  minor: 1,
  measuredPower: -57,
  rssi: -34,
  accuracy: 0.22223443385817412,
  proximity: 'immediate' }
```

# 結果

以上から、Raspberry Pi ZeroでBeaconのスキャンとアドバタイジングは同時にできることがわかった。
また、両者を別々のプロセスで実行するとアドバタイジングだけが停止してしまうことがあったが、原因はいまのところ不明である。


# 参考URL

まことに勝手ながら以下のページを参考にさせていただきました。

* [たった5行!最も簡単にiBeaconの電波を「受信」する方法](https://qiita.com/kpkpkp/items/c2899e548da1c5e2c28e)
* [たった6行!最も簡単にiBeaconの電波を「発信」する方法](https://qiita.com/kpkpkp/items/a0dd3cfcd1eef8dbd492)
【vimめも】 12. タブ


### タブを追加

`:[count]tabnew` or `:[count]tabe[dit]`

カレントタブの後ろに空のウィンドウを持った新しいタブを作成する
`[count]`を指定した場合、新しいタブは`[count]`番目のタブの後ろに作成される

```vim
" カレントタブの後ろに作成
:tabnew

" カレントタブの右のタブの後ろに作成
:+tabnew

" カレントタブの前に作成
:-tabnew

" 左端に作成
:0tabnew

" 右端に作成
:$tabnew
```

ぜんｋ
### タブを閉じる

`:tabc[lose]` カレントタブを閉じる
`:tabc[lose] {count}` or `:{count}tabc[lose]`
指定した`{count}`番目のタブを閉じる

`tabo[nly]` カレントタブ以外のタブをすべて閉じる

### タブを切り替え

`:{count}tabn[ext]` or `:tabn[ext] {count}`

```vim
" 次のタブへ移動
:tabn

" 前のタブへ移動(先頭の場合は失敗)
:tabn -

" 先頭のタブへ移動
:1tabn

" 末尾のタブへ移動
:$tabn

" n番目のタブへ移動
:3tabn
```

---

`gt` 次のタブへ移動する
`{count}gt` 指定した番目のタブへ移動する

`gT` 前のタブへ移動する(先頭の場合は末尾へ移動する)

### タブを一覧で表示

`:tabs` タブの番号と、含まれてるウィンドウを表示する
">" がカレントウィンドウ
"+" が変更のあるバッファ

### タブを移動

`:tabm[ove] [N]` or `:[N]tabm[ove]`
カレントタブを指定したタブの後ろに移動する
一番目のタブにする際は0を指定する
`[N]`を省略すると末尾に移動する

```vim
" タブを左に移動
:-tabm

" タブを右に移動
:+tabm

" タブを先頭に移動
:0tabm

" タブを末尾に移動
:tabm

" 2番目のタブの後ろに移動
:2tabm
```

前回: [【vimめも】 11. バッファとウィンドウ](https://qiita.com/r12tkmt/items/1f396ddb4c701b59e1e8)
次回: [【vimめも】 13. プラグイン](https://qiita.com/r12tkmt/items/21ebf99daeff0cc78c35)
PLCソフトについて

http://soup01.com/ja/2018/04/08/aboutplc/
この文章もこのプログにのっています。

#PLCについて。
現場Troubleshootingする人どんな思考回路であなたのプログラムを推測すると思いますか？普段私はこうな結果がほしい->デバイスメモリを作成し->プログラム->結果（少なくとも私はこうです。）ですが、現場の人は？例えば、IOならまずこのOutputはどこからきてる？そして長い長いのCross-refernceの旅が始まり、最後のこのOutputの回路が見つかってあれ？前はなにを考えましたっけ？そしてまた繰り返し、デバイスメモリをさかのぼるの地獄ループ。
ここでまず個人的意見を話しします。

#―ラベルを使えましょう
国産PLCに慣れたみんなさんにとってちょっとえ？と言われるかもしれせんがラベルを使うようにしましょう。
M0:=True;
Pump1.SW:=True;
どっちの方がわかりやすいでしょうか？名前つけは哲学的なもので、メモリを名前につけてることによって自分の頭にこのプログラムの中にこのメモリはなんのために存在するでしょうか？という質問がもう一度深く考えることができます。

#➖間接アドレスをやめましょう
プログラムは最終的には機械がみるものではなく人間がみるものです。Omronには*マークのPointerあり、三菱にはZIndexがあり、SiemensにもP#があります。それならのPointerを使うと確かに楽？そうにデータをアクセスできますし賢くに見えますよね！実は違います。現場の人はあなたを殺したいくらい呪ってるだけです。現場がトラブルが出てきてそのデバイスをまた何Bit目を数えたり間接アクセスするアドレスを計算したりそれはイライラでたまりません。しかも結果的に効率が悪いです。しかも間接アドレスのプログラムの修正は非常に気をつけないといけなくてちょっと間違いたらもうメモリが一切変な数字に書き込まれます。だから…ちょっと面倒くさいと思うかもしれないけｄ間接アドレスを使うのはやめましょう。

#➖続・どうしても使えたいのなら配列をしましょう
配列はいまのどのメーカーのPLCもSupportすると思います。中のIndexをいじれば何番目のデータをアクセスしてるのかある程度把握できます。
例えば三菱のPLCで　MOV K10 D10Z0　だとすれば、Z0の値によって実際アクセスしてるのアドレスが違います。そして不幸なこと、もしZ0間違って変な数字いれたら、わけわからないのアドレスが書き込まれます。配列使うことによってまず使うのメモリ量が強制的に決められます。そうすると誤ってたのアドレス踏んでしまうの心配がありません。ですが、逆にArray[i]のIndex i はちゃんと適切な値を入れないと、もし配列以外のINDEXをアクセスしようとするとPLCが止まることもあります。（シーメンスの場合）
もちろん、レシピとかパラメータなどは間接アドレスは全然問題がありません。ですが、メインの制御はやっばり大人しくしましょう。
シンプルなものは美しい。

#➖プログラムは再利用できるように作りましょう
多分うん？なにいってるの？と聞かれる方も多いと思いますが、プログラムは再利用できるのはわざわざ毎回も新しく作るｰ>デバックするｰ>くそ！なんでうまく動かない？！怒りの繰り返しが避けます。そのためにどうすればいいですか？まずGlobal変数はやめましょう。PLCをずっとやっていた方はGlobalとLocal変数の概念よくわからないのも多いですが、いわゆる：
何処でも使えるのデバイスーこれはGlobal
自分のBlockしか使えないデバイスーこれはLocal
これはかシーメンスだけできるものではないです。GX-worksにも設定すればこんなこともできますので、慣れないとかは言い訳です。Global変数を使わないってことはたとえ他のプロジェクトからこのプログラムを持っていっても現在のプロジェクトが使ってるデバイスと被ることがありません。
プログラム再利用できるってことは現場にいる人たちがまた別の人間が作ってものを考えなくてはならないのことを避けることができます。

#➖小さいなプログラムを組みましょう
小さいなプログラムを作ってたくさん組んで最後に大きなプログラムになります。一つのBlockが任された仕事はできるだけ少なめしましょう。そうすると変更したとしても他のBlockへの影響が減ります。現場の人と遠距離操作してるときもこのBLOCKのなかだけをみて！と言い切れる。

#➖自分のツール使いこなせるようにしましょう
常にマニュアルを読み、ツールをちゃんと理解できるようにしましょう。中国の孫子曰わく、知己知彼、百戦百勝。

PLCの世界では機械止まるってことはお金が生まれなくなるってことですので、できるだけメンテナンスの人にわかりやすくプログラムを作りましょう。
開発合宿のススメ

はじめまして、overq(おばきゅー)と名乗っています。
初めての投稿でいきなりですが開発合宿について語ってみたいと思います。

# 1.なぜ合宿について書こうと思ったか
これは実際に最近行ってきて開発合宿に参加したことがない方に
「よかった点を伝えたい！」という超シンプルな理由からです。
会社で参加者を募り、私を含めて5名で行いました。
~~そしてあわよくば、この記事を見て「合宿してみたよ」という人が一人でもいたらいいなという目論見~~

# 2.選んだ宿
開発合宿でググるといくつかの宿が出てくると思います。
今回は「土善旅館」さんにお願いしました。
理由は
・なんといっても安い
・合宿プランについている無料レンタル品が豊富で持っていくのはPCだけでよい
・安いのに一泊二食付き(ご飯/味噌汁はおかわり自由)
・関東で探していた
・行ったことがある方からの評判もすこぶるよかった

# 3.というかなぜ開発合宿をやろうと考えたか
これが最初にくるべき項目のような気もしますが、こちらも理由はシンプルで「 *普段と違う環境で勉強しようぜ！！* 」という理由です。
正直私自身も(仕事に関連することは除きますが)がんばって1週間に2-3時間程度しか勉強や業務外の開発が出来ておらず
集中してやるには、いっそせざるを得ない環境を作ろうと考えたからです。
なんだかんだ言って家は誘惑が多いし、近所のカフェや図書館だと長時間いるのは椅子の座り心地にもよりますが疲れます。
とは言ってもカフェでの作業も好きで週末はカフェでやることのほうが多いです。
普段は```家:カフェ = 1:4```ぐらいの割合です。理由は別途記事にするかもしれません。

# 4.ルール
開発合宿を行う上でルールを作りました。

* 何をやるかは制限はなく個人で決めてよい
 - 個々人で興味があることは違うため
 - ただし最初に作るもの宣言し、最終日には成果物を全員の前では発表する
* やることに対して文句は言わない
 - 識者からすると容易いことでも本人にとってはチャレンジ
* 時間の使い方は自由
 - 食事や発表の時間など大まかなスケジュールは立てましたが、基本的には自由に時間を使ってOK。リフレッシュしたいタイミングも人それぞれでしょうし
* ただし仕事に関連することはやらない
 - これだと業務の続きになってるだけなので出勤しているのと変わりません

# 5.結果
これはもう **よかった** の一言につきます。
ルールにあるとおり時間の使い方は自由にしているので
「いざ始まったらダラダラしちゃうかも・・・」と想像をしていたのですが
そんなことはなく意外にも部屋でする音はキーボードの音だけで
集中してそれぞれの開発を行うことが出来ていました。
「これを作る」とみんなの前で宣言した手前、なんとか作りあげようと努力するんですよね。
一泊二日というあまり時間がない中で全員が違うことをやっているので自分でなんとかするしかなかったのです。
これは意外なことでもあり期待していたことでもありました。

# 6.最後に
やりたいと思っているけど悩んでいるなら仲間を募ってやってみてください。
(友達や転職経験がある方ならば元同僚でもいいと思います)
今回紹介したことが起きるか保証はできませんが、一緒にやってくれる仲間がいればいい経験になるはずです。
自分が思っているより本気で取り組みますよ。
↑これは意識低い系の私が言うのでこれは間違いないです。

以上です、まとまっていない文章ではありますが、ここまで読んでいただいてありがとうございました。
VSCodeでGoのユニットテストをデバッグしよう


# はじめに

Visual Studio Code(以下VSCode)にてGo言語開発での単体テスト実行をデバッグする手順を記載します。

# 前提条件

VSCodeにGoのデバッグ環境を導入する必要があります。
[Visual Studio CodeでGo言語のデバッグ環境を整える](https://qiita.com/momotaro98/items/7fbcad57a9d8488fe999)という記事を以前作ったのでこちらなどを参考に環境を準備してください。

# 全テストケースをデバッグ

```
$ cd $GoProjectRoot
$ go test -v
```

上記実行のデバッグをするための手順を示します。

### GoプロジェクトのディレクトリをVSCodeで開く

対象のGoプロジェクトのディレクトリをVSCodeで開きます。

### launch.jsonファイルを開く

下記スクショのようにデバッグボタン🐞→設定ボタン⚙でlaunch.jsonファイルを確認します。

![スクリーンショット_2018-04-08_20_40_49.png](https://qiita-image-store.s3.amazonaws.com/0/91562/7eb35996-4fe5-3fc9-2764-65d14b123d0e.png)


### launch.jsonを単体テストのデバッグ用に修正する

launch.jsonを下記に修正します。

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "test",
            "program": "${workspaceRoot}",
            "env": {},
            "args": ["-test.v"],
            "showLog": true
        }
    ]
}
```

* `"mode"`には`"test"`を設定し`go test`を実行することをデバッガに伝えます。
* `"program"`には`"${workspaceFolder}"`を設定し、実行場所をプロジェクトのルートディレクトリに指定します。
  * VSCodeの予約語の詳細は[こちら](https://code.visualstudio.com/docs/editor/variables-reference)で確認できます。
* `"args"`に`["-test.v"]`を設定することで`-v`のVerbose outputになります。

### デバッグを実行

F5でデバッグを実行します。

# 特定のテストケースのみ指定してデバッグ

`func TestSample(t *testing.T) {...}`というケースがあり、このテストだけをデバッグしたい場合はlaunch.jsonを以下のように設定します。

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "test",
            "program": "${workspaceRoot}",
            "env": {},
            "args": [
                "-test.v",
                "-test.run",
                "TestSample"
            ],
            "showLog": true
        }
    ]
}
```

`"args"`に`"-test.run", "TestSample"`を設定することで対象ケースのみをデバッグ実行できます。

# 参考

* https://github.com/Microsoft/vscode-go/wiki/Debugging-Go-code-using-VS-Code
* https://code.visualstudio.com/docs/editor/variables-reference
* https://github.com/Microsoft/vscode-go/issues/318
公開鍵認証でパスワード入力を省略する

ローカルで起動しているサーバにログインする際
毎回パスワードを入力するのが面倒なので、公開鍵認証を使用して省略します。

#環境

- 端末A（Ubuntu17）　ー接続する側
- 端末B（CentOS7）　ー接続される側

Linux以外でも多分同じ。

#公開鍵認証で接続するための4ステップ

![スライド2.JPG](https://qiita-image-store.s3.amazonaws.com/0/237938/114fe3ae-4376-ad9d-2014-da61891007ac.jpeg)

1. 「接続する側」で秘密鍵と公開鍵を作る。
2. 1で作った公開鍵を「接続される側」に送る。
3. 「接続される側」で、送られてきた公開鍵をauthorized_keysファイルに登録（追記）する。
4. 「接続する側」から「接続される側」にSSH接続し、パスフレーズを入力。

これ以降はSSHなどで接続した時、パスワードを聞かれなくなります。

#公開鍵認証で使用する3つのファイル

![スライド1.JPG](https://qiita-image-store.s3.amazonaws.com/0/237938/4a3aadff-97b2-f38a-d128-c9d7eee57971.jpeg)



#実際にやってみる

##「接続する側」で秘密鍵と公開鍵を作る

まず端末A「接続する側」で秘密鍵と公開鍵を作るため、
以下のコマンドを実行します。

```shell
$ ssh-keygen -t rsa
```

コマンド実行後パスフレーズの入力を求められます。

```shell
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): Enterキー
Created directory '/home/user/.ssh'.
Enter passphrase (empty for no passphrase): パスフレーズ入力
Enter same passphrase again: 再度パスフレーズ入力
```

パスフレーズは忘れたら鍵を作り直さないといけなくなるので注意。

以上の入力が終わって、こんなのが出たら秘密鍵と公開鍵の作成は終了です。
鍵は/home/user/.sshに保存されています。

```shell
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
（フィンガープリント）
```

##「接続される側」に公開鍵を送る
端末A「接続する側」で作った公開鍵を端末B「接続される側」に送ります。
いろんな方法がありますが、今回はscpコマンドを使います。

```shell
$ scp ~/.ssh/id_rsa.pub user@host:~
```

##「接続される側」で、公開鍵を登録する
端末Aから送られてきた公開鍵を登録します。
端末Bに.sshディレクトリがない場合はmkdirなどで作っておきましょう。

```shell
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
```
コマンド実行後は送られてきたid_rsa.pubを削除しても大丈夫です。

##接続する
鍵の登録が済んだのでsshコマンドで公開鍵認証で接続できるか確認しましょう。
最初の接続は鍵を作った際に入力したパスフレーズを聞かれるので入力します。
接続できたらexitで一旦抜けて、再度接続してみてください。
パスワードを聞かれなければ公開鍵認証成功です。

#補足
接続できない場合は以下の点を確認してください。

- [ディレクトリ・ファイルのパーミッション](https://www.pistolfly.com/weblog/2007/02/ssh.html)
- SELinux

#参考
[公開鍵暗号 - wikipedia](https://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7)
https://www.pistolfly.com/weblog/2007/02/ssh.html
Unity Remoteを使って実機で動作確認

# はじめに
Unityで開発したプロジェクトをスマホなどの実機で確認するには、各プラットフォーム向けにビルドする必要がありますが、ビルドは時間が掛かり実機確認の度にビルドするのは手間なので、Unity Remoteを使用してサクッと実機確認する方法を説明します。
※現在はiOS・Androidのみ

# Unity Remoteとは
Unity RemoteはiOS端末やAndroid端末をPCやMacとUSB接続して動作確認を行う為のアプリです。(Remoteと言う割には有線...)
Unity RemoteではPCやMac上では確認できない以下データを端末から入力することによって、Unity Editor側にストリーミングされ動作を確認することができます。

- タッチとスタイラスによる入力
- 加速度計
- ジャイロスコープ
- デバイスのカメラストリーム
- コンパス
- GPS
- ジョイスティックの名前と入力

# 使い方
## 1. Unity Remoteをインストール
実機確認したい端末にUnity Remote 5アプリをインストールします。

- iOS：[App Store](https://itunes.apple.com/us/app/unity-remote–4/id871767552)
- Android：[Google Play](https://play.google.com/store/apps/details?id=com.unity3d.genericremote&hl=ja)

## 2. 端末とPCまたはMacと接続
Unity Remote 5 をインストールした端末とPCまたはMacをUSBで接続します。
※iOS端末はMacに接続しないとUnity Remoteは使用できません。

## 3. Unity Editor側の設定
確認したいプロジェクトを開き、メニューから [Edit] - [Project Settings] - [Editor] を開いて以下設定を行います。

![Editor Settings](https://qiita-image-store.s3.amazonaws.com/0/242340/ba9f35f4-df38-af63-e4ed-7d053782d76a.png)

- Device：動作確認する端末を指定(iOSは接続した端末名かAny iOS Device、AndroidはAny Android Deviceを選択)
- Compression：圧縮形式(JPEG・PNG)
- Resolution：解像度(Downsize・Normal)
- Joystick Source：入力元(Remote・Local)

## 4. Unity Remoteを起動して動作確認
Unity Remoteを起動すると以下の様な画面が表示されます。

![Unity Remote](https://qiita-image-store.s3.amazonaws.com/0/242340/0e6813b9-2ecd-4cc1-5719-223529d75e34.png)

この画面が表示されている状態でUnity Editor側のプレイボタンをクリックすると、端末側でプレイモード画面がエミュレートされ動作確認を行うことができます。

# トラブルシューティング
## 端末接続してるのにDeviceにiOS端末名・Any iOS Deviceが表示されない
iOSビルドサポートComponentがインストールされていないとiOS端末を接続してもDeviceに表示されないので、入れていない場合は以下からインストールして下さい。
メニューの [File] - [Build Settings…] からBuild Settingsウィンドウを表示し、 Platformから「iOS」を選択して「Open Download Page」ボタンをクリックします。
![Build Settings](https://qiita-image-store.s3.amazonaws.com/0/242340/dc6a89c9-9ede-d031-3c1d-066c4d642f66.png)
インストーラがダウンロードされたらインストールを行い、Unity Editorを再起動して下さい。
※Unity Hubを使用してインストールする場合は[こちら](https://qiita.com/cs1000/items/61e639ad441b2fcb490d)

それでも表示されない場合は以下を試してみて下さい。

- iOS端末を接続し直す
- iOS端末を再起動
- Deviceで一旦「Any Android Device」を選択した後にリストに表示されるか確認

## 端末側の画質が悪い…
設定時のCompressionをPNGにすると非圧縮で動作確認できますが、JPEGに比べてパフォーマンスが低下します。
画像の確認をするならPNG、入力の確認をするならJPEGと切り分けて使うのが良いかも。

# 最後に
Unity Remoteを使用すると簡単に実機で動作確認できますが、ビルドした場合に比べて画質もパフォーマンスも劣ります。
公式マニュアルにも記載されている通り、Unity Remoteはゲームが実機でどの様に見えてどの様に動作するかを簡単に確認するのが目的なので、最終的にはビルドして本当の動作確認が必要になります。

おわり
第1回 eclipseからIntelliJへ移行 - プロジェクトの考え方・プロジェクト作成について

#はじめに
eclipseでの開発になれている方がIntelliJに移行する際の手助けになればと思い、何回かに分けて移行に必要な知識を載せていこうと思います。
最初は、何でこれが出来ないの？やりにくいなーって思っていたのだけど、実際に操作が分かると、IntelliJの方が優れた部分があることに気付いていきます。
そういった部分も移行当初の今の気持ちだからこそ書ける記事だとおもうので完璧な状態ではないですが、現時点から書いていけたらと思います。
書いた記事をある一定期間はブラッシュアップしていくため、内容が変化することをご了承ください。

今後の予定記事は、ショートカット、Git操作（EGit）との比較、Javaコーディング効率化に必要な知識を考えています。

#workspaceについて
eclipseでは、workspace内に複数のプロジェクトを含めることが可能ですが、IntelliJでは、１つのプロジェクトしか開くことができません。
Webアプリケーションを作成しているときに、サーバーでの動作確認前に動作確認用にプロジェクトを別途用意してコードの確認をしたい場合などは、とても不便に感じます。
複数プロジェクト（メインプロジェクト、共通機能プロジェクト）の場合は、1つのプロジェクト内に複数moduleを含むようになります。
	
| IntelliJ IDEA       |       Eclipse |    
|:-----------------|------------------:|
| プロジェクト|              ワークスペース|
| モジュール	|              プロジェクト|

#プロジェクトの作成方法
プロジェクトの作成について、いくつか興味があると思います。
１つは、既存のプロジェクトを取り込む方法、もう１つは、新たにプロジェクトを作成する方法だと思います。
どちらも共通的に設定しなければいけない項目については、以下のConfigure > Settingsにて設定可能です。
例えば、proxyなど。
 <img src="https://qiita-image-store.s3.amazonaws.com/0/58199/35374329-c9ec-d3dc-642e-9837aee9bac5.png" width=50%>

## 新規プロジェクト作成
こちらは、上記の画像の「Create New Project」から出来るのですが、Community版とUltimate版では、プロジェクト作成補助機能が異なります。
特にSpring Bootプロジェクトを作成する場合は、Community版だとeclipseで普通にSTS Pluginをインストールしていれば出来ることが出来ず、Ultimate版を使用しなければなりません・・・
残念ながら、Spring Boot、springの補助機能は、eclipseの方がUltimate版よりも優れており各種Spring用のファイルやSpring Boot用のファイル、クラス作成の補助機能が充実しています。
後々紹介できたらと思います。

＜Community版プロジェクト作成画面＞
 <img src="https://qiita-image-store.s3.amazonaws.com/0/58199/47069b03-bc14-ab92-cd3a-6b8e3b7b76b3.png" width=75%>

＜Ultimate版プロジェクト作成画面＞
 <img src="https://qiita-image-store.s3.amazonaws.com/0/58199/62ea63ff-f3c3-3560-d8b5-7812fddcd2b9.png" width=75%>

＜Ultimate版-Spring Bootプロジェクト作成画面＞
Spring Initializrを選択して「Next」ボタンを押下し、Nextボタン押下。

||| 
|:-----------------|------------------:|
|  <img src="https://qiita-image-store.s3.amazonaws.com/0/58199/39c306c7-0e6f-b321-2e62-cf3cb1401b2c.png" > |  <img src="https://qiita-image-store.s3.amazonaws.com/0/58199/96d5c159-f118-b1b1-c2cf-25c29a7b5495.png" >|







## 既存のプロジェクト取込
「Import Project」から取り込む場合もあるかもしれませんが、基本的にはGitサーバー上（Githubなど）から取り込むことが多いと思います。
その場合は、「Check out from version Control」からCloneしてプロジェクトを持ってきます。
 <img src="https://qiita-image-store.s3.amazonaws.com/0/58199/bc00a89c-ff66-bdf7-fb73-5f358bc4a800.png" width=75%>

この章ではここまでにしたいと思います。
Gitのところに関しては色々と記事があると思うので、そちらを参照して頂けたらと思います。
他のサービスやコンテナ上のボリュームをマウント(volumes_from)


自分用のメモ
`volumes_from`を使いたいときの`docker-compose.yml`

[リファレンス](http://docs.docker.jp/compose/compose-file.html#volumes-from)に書いてあることを書いただけ。


- アクセス権は省略すると`rw`
- `/test1`に作ったファイルはコンテナcにのみ存在
    - コンテナcを消したらファイルも消える
- `/test2`に作ったファイルは`docker-compose.yml`と同階層に存在
    - コンテナcを消してもファイルは消えない

```docker-compose.yml
version: "2"

services:

  a:
    image: alpine:latest
    tty: true
    volumes_from:
      - d

  b:
    image: alpine:latest
    tty: true
    volumes_from:
      - d:rw

  c:
    image: alpine:latest
    tty: true
    volumes_from:
      - d:ro

  d:
    image: alpine:latest
    tty: true
    volumes:
      - /test1
      - .:/test2
```


## アクセス権の確認結果

コンテナcからは書き込めないことを確認

```
$ docker-compose exec a ash
/ # touch test1/a1
/ # touch test2/a2

$ docker-compose exec b ash
/ # touch test1/b1
/ # touch test2/b2

$ docker-compose exec c ash
/ # touch test1/c1
touch: test1/c1: Read-only file system
/ # touch test2/c2
touch: test2/c2: Read-only file system
```

コンテナdの中身を確認すると
`test1` と `test2` にそれぞれ他のコンテナで作ったファイルが存在している。

```
$ docker-compose exec d ash
/ # ls -la /test1
total 8
drwxr-xr-x    2 root     root          4096 Apr  8 12:25 .
drwxr-xr-x    1 root     root          4096 Apr  8 12:22 ..
-rw-r--r--    1 root     root             0 Apr  8 12:25 a1
-rw-r--r--    1 root     root             0 Apr  8 12:25 b1

/ # ls -la /test2
total 8
drwxr-xr-x    5 root     root           160 Apr  8 12:26 .
drwxr-xr-x    1 root     root          4096 Apr  8 12:22 ..
-rw-r--r--    1 root     root             0 Apr  8 12:25 a2
-rw-r--r--    1 root     root             0 Apr  8 12:26 b2
-rw-r--r--    1 root     root           339 Apr  8 12:22 docker-compose.yml
```

Mac上のdocker-compose.ymlと同階層を確認すると`test2`に作ったファイルが存在している。

```
$ ls -la
total 8
drwxr-xr-x  5 sakuraba  staff  160  4  8 21:26 .
drwxr-xr-x  7 sakuraba  staff  224  4  8 20:50 ..
-rw-r--r--  1 sakuraba  staff    0  4  8 21:25 a2
-rw-r--r--  1 sakuraba  staff    0  4  8 21:26 b2
-rw-r--r--  1 sakuraba  staff  339  4  8 21:22 docker-compose.yml
```
Vagrant上のフォルダをマウントしてFinderで確認する

`この記事ではVagrant 2.0.0, CentOS 6.9を使用しています。`
##概要
ドットインストールを見ながら環境構築し、勉強していたら、あれ？Cyberduckいらないじゃん！って思ったので紹介します。
VagrantではVagrantfileに一行書き加えるだけで仮想マシンとホストマシンでファイルの共有ができます。
他にhomebrewしてなんたらかんたら〜と言う方法もありますが、少なくともvagrantを使っている場合はする必要がないです。

##ホストマシン(Mac)側
共有したいフォルダを作成します。私の場合、
`/Users/(ユーザ名)/MyVagrant/MyCentOS/(ディレクトリ名)`　としました。

##Vagrant側
```
vagrant ssh //で仮想マシンにログインします。
cd /var/www/html/ //Webのドキュメントルートに移動します。
mkdir (ディレクトリ名) //ホストマシン側のディレクトリと共有したいディレクトリを作成します。

```
##Vagrantfile
Vagrantfileの該当箇所に、
`config.vm.synced_folder "./", "/var/www/html", mount_options: ['dmode=777','fmode=755']`
と追加します。

##Vagrantを再起動
```
vagrant up
vagrant reload
```

これでできるはずです！確認してみましょう！
ServerNowのUI Pageで画面とサーバースクリプト間で値の受け渡しを行う

# 概要

ServiceNowでは、 UI Pageを使用するとHTML(+Jelly)で作成したページからサーバーサイドのスクリプトを起動し、その処理結果を再び、HTMLのページに返して表示することが可能。

## 準備
studioのメニューから「File」「Create File」を選択する。表示された画面でForm & UIカテゴリーの「UI Page」を選択してCreateをクリックして、UI Pageを作成する。

## HTMLからサーバーのスクリプトに値を渡す方法
作成したUI PageのHTMLに下記のように入力する。

```xml
<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<g:ui_form>
		<input type="text" name="myparam" value="${myparam}" />
		<button type="submit" name="search" value="search">検索</button>
		<p>${serverParam1}</p>
	</g:ui_form>
</j:jelly>
```

上記のように「input type="text"」で入力した値をサーバー側で受け取る事が可能となる。上記では検索ボタンを押下すると、HTTPのリクエストパラメーターに

<pre>
myparam=入力した値
</pre>

を設定して送信できる。
## サーバー側の処理
サーバー側では、HTMLからリクエストパラメーターとして送信された値を直接受け取ることができる。
UI PageのProcessing scriptに次のように入力する。

```javascript
gs.info('myparam = ' + myparam);
```
リクエストパラメーターの「myparam」の値を直接上記のように取得してログに出力することが可能。

## 動作確認

動作確認するために、メニューにUI Pageへのリンクを作成する。
Studioから「File」「Create File」で、NavigationカテゴリのApplication Menuを選択してCreateをクリックする。
作成されたApplication MenuにModuleを追加する。
作成されたMuduleのLinkTypeにURLを入力し、Argumentsに、UI PageのURLを入力する。
なお、UI PageのURlは、UI Pageを作成した画面のリンクをクリックしてブラウザのURLをコピーして取得する。

![LinkUrl.png](https://qiita-image-store.s3.amazonaws.com/0/197947/48d0d42d-3773-daf2-0c8f-e15809f74108.png)

これで、NavigationメニューにUI Pageへのリンクが表示される。

![UIMenu.png](https://qiita-image-store.s3.amazonaws.com/0/197947/23d0a165-3c74-2d4c-4498-35fd4f6be25d.png)

表示された画面のテキストボックスに入力して、検索をクリックする。

![UIPageInput.png](https://qiita-image-store.s3.amazonaws.com/0/197947/0b6dd5b3-7424-2393-8961-a77dbbdc411c.png)

Application Logsからログにmyparamの値が出力されていることを確認する。

![applog.png](https://qiita-image-store.s3.amazonaws.com/0/197947/e5d24c63-57a2-5ebe-c317-8e90516b2f5b.png)

# サーバーで設定した値をクライアントに渡す方法

UI PageのProcessing Scriptに次のようにserverParam1の値を設定する。

```javascript
var serverParam1 = 'これはサーバーで設定した値です。';
```

クライアント側のHTMLで次のように取得ができる。
下記のように${変数名}でProcessing Scriptで設定した値が取得できる。

```xml
<?xml version="1.0" encoding="utf-8" ?>
<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">
	<g:ui_form>
		<input type="text" name="myparam" value="${myparam}" />
		<button type="submit" name="search" value="search">検索</button>
		<p>${serverParam1}</p>
	</g:ui_form>
</j:jelly>
```

## 動作確認

検索ボタンクリック後に下記のようにサーバーで設定した値が表示される。

![htmlrecieve.png](https://qiita-image-store.s3.amazonaws.com/0/197947/511bc109-5978-18cc-aea1-ab4b872dd924.png)

# さいごに
サーバーサイドのスクリプトとHTML内での値の受け渡しがダイレクトに出来るのは非常に使いやすい。また注意事項として上記のサーバーサイドのスクリプト(Processing script)は、HTMLのフォームでサブミットした時のリクエストに対して実行される。
そのため、初期表示時の画面制御はできない。
初期表示時の画面表示の制御を実施するには、おそらくクライアントスクリプトに起動時の処理を書いた関数を置いておき、HTMLタグ内から呼び出す必要がある。
EC2をAMIからリストアする際にキーペアをどうするか

#AMIからリストア時に別のキーペアを選択するとどうなるか

そもそもの始まりは、東京リージョンで作成したEC2をAMI取得してバージニアリージョンで
新しく起動させる際に「キーペア」の選択画面で既存のキーがなかったのであれ？と思い調べた次第です。
ついでにキーペアを別のものを選択したら上書き？とかいろいろ疑問で調べました。

##キーペアはリージョン別
まず調べてみたところ、キーペアはアカウント内共有ではなくリージョン別のようです。
明確にドキュメントに記載は見つかりませんでしたがリージョンあたりと記載があるので間違いないと思います。

>https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html
**キーペアを作成する**
Amazon EC2 が使用するキーは、2048-bit SSH-2 RSA キーです。リージョンあたり最大 5000 のキーペアを持つことができます。

##検証してみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240644/d22678da-1222-cf25-9cbb-17f4da0f3494.png)

東京リージョンにAmazonLinuxを起動させて、AMIを取得して3パターン試しました。

①AMIから東京リージョンで作成した別のキーペアを選択して起動

②AMIをバージニアにコピーして、バージニアリージョンに作成したキーペアを選択して起動

③AMIをバージニアにコピーして、キーペアの選択はなしで起動

##①AMIから東京リージョンで作成した別のキーペアを選択して起動

まずは起動したEC2に接続してみます。

```bash
$ ssh -i ap-northeast-1-001.pem ec2-user@10.0.136.237
```

接続先のauthorized_keysを確認します。

```bash
$ cat .ssh/authorized_keys
ssh-rsa xxxxxxxx........  ap-northeast-1-001

$ md5sum .ssh/authorized_keys
f6128bdb94c2179c6f9183d40dedd908  .ssh/authorized_keys

```
次にAMIを取得して、先ほどとは別のキーペアを指定して新しいインスタンスを作成します。
(EC2の作成過程は省略します)

```bash
ssh -i ap-northeast-1-002.pem ec2-user@10.0.136.160
[ec2-user@ip-10-0-136-160 ~]$

```

では、先ほどのAMIの取得したEC2に選択したキーペア「ap-northeast-1-001.pem」でログインを試します。

```bash
ssh -i ap-northeast-1-001.pem ec2-user@10.0.136.160
[ec2-user@ip-10-0-136-160 ~]$
```
無時ログインできました。authorized_keysを見てみましょう。

```bash
$ cat .ssh/authorized_keys
ssh-rsa xxxxxxxx........  ap-northeast-1-001
ssh-rsa xxxxxxxx........  ap-northeast-1-002

$ md5sum .ssh/authorized_keys
c87931fc2d2949c6bb7304152c3d3381  .ssh/authorized_keys
```

##②AMIをバージニアにコピーして、バージニアリージョンに作成したキーペアを選択して起動

AMIもキーペアと同じく、リージョン別になるためAMIはコピーしておき
コピーしたAMIからインスタンスを作成します。

```bash
$ ssh -i us-east-1.pem ec2-user@172.31.38.107
[ec2-user@ip-172-31-38-107 ~]$

$ cat .ssh/authorized_keys
ssh-rsa xxxxxxxx........  ap-northeast-1-001
ssh-rsa xxxxxxxx........  us-east-1

$ md5sum .ssh/authorized_keys
de006191497abe8ba53e88856c3fcda8  .ssh/authorized_keys

```
##③AMIをバージニアにコピーして、キーペアの選択はなしで起動

東京リージョンでAMIを取得しキーペアはなしで起動します。

```bash
$ ssh -i ap-northeast-1-001.pem ec2-user@172.31.39.140
[ec2-user@ip-172-31-39-140 ~]$

$ cat .ssh/authorized_keys
ssh-rsa xxxxxxxx........  ap-northeast-1-001

$ md5sum .ssh/authorized_keys
f6128bdb94c2179c6f9183d40dedd908  .ssh/authorized_keys
```

##まとめ
結論はキーペアを別のものを選択するとssh/authorized_keysに鍵が追記されていくでした。

ちゃんと読んだらドキュメントにも書いてありました。。。
>
インスタンスから Linux AMI を作成し、AMI を使用して別のリージョンまたはアカウントの新しいインスタンスを起動すると、新しいインスタンスには元のインスタンスからのパブリックキーが含まれます。これにより、元のインスタンスと同じプライベートキーファイルを使用して新しいインスタンスに接続できます。

勝手に自動で上書きかと思ってました。
まあ鍵なくしたらAMIからキーペアを作成して起動すれば問題ないですね!(鍵なくすなよ)

以上です。
Xamarin.Forms+ReactivePropertyでスマホアプリ開発！《ファイル読み込み編》 

【記事ツリー】

- [スマホアプリ開発！《本編》](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)
 - [スマホアプリ開発！《MasterDetailPage編》](https://qiita.com/YSRKEN/items/521d2962ac664fa95ebe)
 - [スマホアプリ開発！《ReactiveProperty編》](https://qiita.com/YSRKEN/items/d6835ac9f1338eeaab05)
 - [スマホアプリ開発！《ファイル読み込み編》](https://qiita.com/YSRKEN/items/36fb3b4ae0c0cf7476db)
 - [スマホアプリ開発！《リリース・署名編》](https://qiita.com/YSRKEN/items/cf22da85013197949742)

# 概要

　[Xamarin.Forms+ReactivePropertyでスマホアプリ開発！《本編》](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)において、どのように内部ファイル(リソースファイル)を読み込んだのかといった話です。**この記事は短めです。**

# やり方

## プロジェクト内に読み込みたいファイルを組み込む

　WPFとかでもお馴染みですね。[今回の開発](https://qiita.com/YSRKEN/items/0036c6506155b9bf8051)ではShared Projectで開発していますので、Shared Project内にファイルを設定しましょう(下記画像では「Resources」フォルダ内に設置)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/55d687d9-3996-161b-a2bb-d8134135b61c.png)

　また、ソリューションエクスプローラー内で当該ファイルをクリックし、プロパティ欄でビルドアクションを「埋め込みリソース」にしておくのを忘れないようにしましょう。もちろん、出力ディレクトリにコピー**しない**ようにします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29802/47b60e08-fde9-e10f-4165-f9aee4091099.png)

## 読み込み用コード

　まず、`System.Reflection.Assembly.GetExecutingAssembly()`により、`System.Reflection.Assembly`型のアセンブリ情報を得ます。ここで言うところの「アセンブリ」とは、アセンブリ言語のことではなく、「ソフトウェア自体の設定情報」とでも考えて下さい。
　次に、`System.Reflection.Assembly#GetManifestResourceNames()`メソッドにより、`string[]`型でリソース名の一覧を取得します。ここで言うところの「リソース」とは、「アセンブリ」に埋め込まれている、ファイル等のデータのことです。
　後は、そこから目的のファイルに対応したリソース名を探しだし、`System.Reflection.Assembly#GetManifestResourceStream(リソース名)`メソッドで当該リソースにおける`Stream`を取得すればそこから読み込めます。……ただ、そのリソース名が

![2018-04-08_205250.png](https://qiita-image-store.s3.amazonaws.com/0/29802/c6babbe7-110e-dd4c-e873-42eace2c4118.png)

といった風に**長ったらしい感じになります**ので、検索用のユーティリティ関数を作成し、それを叩くようにすることをお勧めします。

```sample.cs
// ユーティリティ
static class Utility
{
	// リソースのStreamをファイル名から取得する
	public static Stream GetResourceStream(string name) {
		// リフレクションにより、アセンブリ情報を取得する
		var assembly = System.Reflection.Assembly.GetExecutingAssembly();
		// アセンブリ情報から、リソース名の一覧を取得する
		string[] resnames = assembly.GetManifestResourceNames();
		// リソース名の一覧を検索し、条件に合ったものを返す
		var regex = new Regex($"Resources.{name}$");
		foreach(string resname in resnames) {
			if (regex.IsMatch(resname)) {
				return assembly.GetManifestResourceStream(resname);
			}
		}
		return null;
	}
}

// 使用例
using (var stream = Utility.GetResourceStream("LevelExpList.txt")){
	// 中略
}
```
WiringPiでGPIOとPWM（工事中）

# WiringPi

WiringPiについてのまとめをしておく（工事中）

## 概要
Raspberry PiのGPIOをC言語から扱うライブラリ
http://wiringpi.com/

## ダウンロード
工事中
## インストール
工事中

## コマンドラインで使う

## ソースコードで書く
### 初期化
WiringPiを使う前には初期化関数を呼び出す。
```
wiringPiSetup();
```

### GPIO
GPIOで入力や出力をする。

出力は下記のように

```
#include <wiringPi.h>

#define WRITE_PIN0 0
#define WRITE_PIN1 1

int main(void){
  if(wiringPiSetup() == -1){
    return -1;
  }
  pinMode(WRITE_PIN0, OUTPUT);
  pinMode(WRITE_PIN1, OUTPUT);

  digitalWrite(WRITE_PIN, 0);  //0を出力
  digitalWrite(WRITE_PIN, 1);  //1を出力

  return 0;
}
```

### PWM

PWMはPWM出力可能なポートにPWMの設定をして行う。

```
 #include <wiringPi.h>
 #include <stdio.h>
 
 #define PWM_PIN (1)     // PHY 12
 #define RANGE (100)     //0～100%の整数で指定
 #define FREQ (20000.0)  // 周波数
 #define CLOCK ((int)(19200000.0 / FREQ / (float)RANGE + 0.5))

int main(void){
  if(wiringPiSetup() == -1){
    printf("error\n");
    return -1;
  }
  
  pinMode(PWM_PIN, PWM_OUTPUT);

  pwmSetMode(PWM_MODE_MS);
  pwmSetClock(CLOCK);
  pwmSetRange(100);
  pwmWrite(PWM_PIN, 50);  // 50%で出力

  while(1){
    ;  //無限ループ
  }

  return 0;
}
```
IntelliJで"Haskell module can not be created"となるときの対処法

## 環境

<img width="365" alt="Screen Shot 2018-04-08 at 20.50.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/63c19275-f149-56f3-d424-163330a54d6f.png">

(<https://github.com/rikvdkleij/intellij-haskell>)


## エラー

以下の記事でやっているように、"Import Project"をすれば、通常読み込めるのですが、以下のようなエラーが出たときの対照法です。
[IntelliJでHaskellを実行する（haskell stackプロジェクト） - Qiita](https://qiita.com/nwtgck/items/d64647c05a0ba52db63c)

<img width="447" alt="Screen Shot 2018-04-08 at 20.43.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/a7be7e8b-cd77-c71b-3fef-2e3290cce604.png">

## 対処法

ターミナルを開いて、自分のプロジェクトまで移動して以下のコマンドを叩きます。

```bash
cd <自分のプロジェクト>
# 上記のエラーがでてもウィンドウが開かれて.ideaディレクトリが生成されているので、削除
rm -r .idea/
# buildしてcabalを作成する
stack build
```

コマンドが終了したら、また同じように"Import Project"すれば、うまく開くことができました。

## エラーの原因

Cabalファイルが見つからないって言っているので、
おそらく原因は`package.yaml`を使っているstack projectで発生するのだと思います（多分ですが...）。
はじめてのAWS ~S3にファイルアップロード~

[これまで](https://qiita.com/yuni/items/7edfe68de918e12af0ee)Azure VM上で画像分類をしてみたのですが、何も知らないわたしは当然のごとく学習に使う画像をVM上に保存してました。
普通はストレージサービスに保存するよ！と言われたので、さっそくS3を使ってみます。

##S3新しいバケットの作成
+バケットを作成するをクリックします
<img width="1270" alt="スクリーンショット 2018-04-08 16.18.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/8c9decc1-638b-6afd-39b0-fd3ba4675ee9.png">

名前とリージョンを決めます
<img width="701" alt="スクリーンショット 2018-04-08 16.19.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/6f158854-2211-3a1d-7c7b-3e14aec69101.png">

プロパティの設定をした後、アクセス許可の設定をします。
azureVMからアクセスしたいので、パブリックアクセス許可にします。
<img width="700" alt="スクリーンショット 2018-04-08 16.20.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/ba5a13c5-782a-2bbd-dc07-cded009ada55.png">

これで進めていくと、バケットの作成ができました。

##ファイルのアップロード
ファイルのアップロードは、
①コンソール画面からのアップロード
②CLI(Command Line Interface)を使ってコマンドからのアップロード
の方法ができるみたいです。

###①コンソール画面からアップロードしてみる
+アップロードをクリック
<img width="1182" alt="スクリーンショット 2018-04-08 16.29.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/cf039036-8e21-1182-ad98-fe6e6aa95bc2.png">

ファイルを追加してアップロード
<img width="694" alt="スクリーンショット 2018-04-08 16.35.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/7ce55c6b-8f27-a401-fed7-0e002892cd5d.png">

追加したファイルは、ファイルを開いたり、ダウンロードできます。
<img width="713" alt="スクリーンショット 2018-04-08 16.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/ce81f8b5-8a38-9252-5db1-6305829d24d6.png">

###②CLIで画像をアップロードしてみる
AWS CLIをインストールします```
$ sudo pip install awscli```

バージョンを確認してみます

```
$ aws --version
aws-cli/1.15.2 Python/3.6.0 Darwin/17.4.0 botocore/1.10.2
```

CLIがAWSとやりとりする際に必要な認証情報を設定します。
まず、[IAMコンソール](https://console.aws.amazon.com/iam/home?#home)からアクセスキーを取得します。

左側ナビメニューのユーザーを選択し、「ユーザーを追加」をクリック
<img width="1225" alt="スクリーンショット 2018-04-08 19.36.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/513deb59-fc15-638b-2b69-f574ec51d3f2.png">

ユーザー名を入れて、アクセスの種類を選択
<img width="1207" alt="スクリーンショット 2018-04-08 19.37.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/7c7d54df-06fe-64dc-3099-331fe0247c4f.png">

S3FullAccess権限を設定する
<img width="1217" alt="スクリーンショット 2018-04-08 19.38.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/edc43206-4294-c6bd-7533-acf487cacbfd.png">
本当はちゃんとポリシー設定した方がいいそうです(汗)

アクセスIDとシークレットアクセスキーが取得できました
<img width="1175" alt="スクリーンショット 2018-04-08 19.40.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/223989/2b586593-8d71-f446-3507-2e638954ac07.png">

それでは早速、取得したアクセスIDを設定します

```
$ aws configure --profile= ユーザー名
AWS Access Key ID [None]: アクセスID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json
```
region：「ap-northeast-1」がtokyoリージョン
output format："text","JSON","table"のどれかを指定


ようやく画像のアップロードです

```
$ aws s3 cp <ファイルpath> s3://<バケット名>/ --acl public-read --profile=<IAMコンソールで作ったユーザー名>
```
コンソール画面から無事アップロードされたことが確認できました。ぱちぱち。
Visual Studio CommunityでAndroid-SDK入った

Visual Studio Communityでエミュレーターをインストールを選択して、色々と試していたら、Android SDKマネージャーとAVDマネージャーをインストールすることが出来ました。

![キャプチャ040802.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/eef96c05-0763-91c5-dfaa-0151144006f3.png)


![キャプチャ040803.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/58bdd340-e3b6-b161-f0a1-da9ef7093843.png)

ただ”パッケージ 'AndroidBuildSupport,version=1.0.40' のインストールに失敗しました。”というエラーが出てしまいました。
内容は、ファンクションが間違っているというものです。

スマホのドライバーも無事にインストールできました。
SC-04EのUSBドライバーが日本のSamsungのサイトで見つからず、アメリカのサイトで見つけました。
でも、ダウンロードしてインストールしたら、ちゃんと日本語で使えるので安心しました。

https://www.samsung.com/us/support/owners/app/kies

ターゲットのデバイスのSDKをインストールして試してみます。
コードファーストでのbool型の罠

小ネタ。
コードファーストのbool型のフィールドがチェックボックスではなくコンボボックスに化ける現象に遭遇。
何やこれと思っていろいろ試したところオチはbool?型にしていたため。
つまり、

bool : true / falseの2通りの値
bool? : true / false / **null** の3通りの値

であることが原因な模様。

教訓：安易なnull許容型は破滅への近道。
＠SpringApplicationConfiguration -> ＠SpringBootTestに書き換えたときにハマったところ

Spring5.0.xやSpring Boot2.0.xがリリースされていますが、今回は古いSpringのバージョンを用いて実装されているコードをリファクタリングした際にハマったところを書いていこうと思います。

# やりたいこと
Spring1.4から@SpringApplicationConfigurationがdeprecatedになっているので、代替のアノテーションとして用意されている@SpringBootTestに置き換えたい。環境は、Spring Boot(1.4.8), PowerMock(1.6.5)
# ハマったところ
[公式ブログ](https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4)をみると、アノテーションを書き換えるだけでよさそうですが、テストを走らせようとすると、ClassNotFoundExceptionで落ちてしまいます。

```java:TestSample.java
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@PrepareForTest(Hoge.class)
public class TestSample
{
   @Before
   public void setUp() throws Exception {
       PowerMockito.mockStatic(Hoge.class);
   }
 ...
}
```

```
java.lang.ClassNotFoundException: com.example.PowermockClassLoadTest$Config$$EnhancerBySpringCGLIB$$e0ecd163
```

# 原因
PowerMockのv1.6.5以前を併用していると、PowerMockのバグでClassNotFoundExceptionが起きてしまうようです。[参考issue１](https://github.com/spring-projects/spring-boot/issues/6808), [参考issue２](https://github.com/powermock/powermock/issues/695)

# 対応
1.6.6でバグ修正がされているので、Springのアノテーションの書き換えだけでなく、PowerMockのversionを1.6.6以降に指定するようにしましょう。

```xml:pom.xml
<dependencies>
  <dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.6.6</version>
    <scope>test</scope>
  </dependency>
</dependencies>
```

# 参考
- https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4
- https://github.com/spring-projects/spring-boot/issues/6808
- https://github.com/powermock/powermock/issues/695
kotlinを学ぶためのIntelliJの開発環境構築

android appに興味があり、せっかくならktolinでと思い開発環境を構築したので記載
android appならAndroid studioがいいのだろうけど、まずは素のkotlinをいじろうと今回はIntelliJをインストール

環境
Windows10 64bit

#1.JDKのインストール
kotlinの開発にはJDKが必要なのでまずこれを下記からインストール
http://www.oracle.com/technetwork/java/javase/overview/index.html
DownloadsタブからJDK downloadを選択
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/207883/00e571da-9fed-9c56-6e40-d59aad731e22.png)
画面が切り替わったらAccept License Agreementを選択して、Windows用を選択してdownload
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/207883/89e4dd65-d188-cecc-1bdb-83108a3625ab.png)
downloadが終わったらインストール。Nextを押してればおｋ。

#2.JDKの環境設定
次にIntelliJでJDKを使うために環境設定を行う。今回はシステム環境変数に設定します。
Windowsキー + Pause/Breakキーを押すとシステムが表示されるのでシステムの詳細設定を選択


詳細設定タブが開いているので、環境変数を選択
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/207883/efb7873d-7e08-1a88-f83e-bcd16798fbc6.png)

システム環境変数にPathとあるのでそれをダブルクリック
![名称未設定 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/75e31d95-7b09-4a10-289f-c25a8dc0c6f2.jpeg)

空欄をダブルクリックすると入力できる感じになるので、binフォルダのpathを入力してOKを押す
![名称未設定 6.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/bb2770dd-e272-06b0-7383-136eb7eacae4.jpeg)
Nextだけ押していれば、Javaのインストール先はC:\Program Files\Java\jdkXXX\binのはず
![名称未設定 23.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/2a6ba64e-6aaa-f18a-73a8-ff93f41c2aff.jpeg)

#3.IntelliJのインストール
IntelliJの公式にaccessして、右上のDownloadを選択
https://www.jetbrains.com/idea/
![名称未設定 10.png](https://qiita-image-store.s3.amazonaws.com/0/207883/bd1fa906-856a-fa3c-c336-5b3a61e8c237.png)

無料のCommunityをDownload
![名称未設定 12.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/eb90cec5-9d88-6483-1fbe-cf45e14ac720.jpeg)
downloadが終わったらインストール。Nextを押してればおｋ。

インストールが終わったら、すべてのプログラムから起動
![名称未設定 14.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/e5bc000f-e3e1-5577-97aa-7028e3f17f4a.jpeg)
Create New Projectを選択
![名称未設定 15.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/e7881860-df47-7654-7093-bffedfd7280d.jpeg)
Project SDKはNo SDKなので、SDK選択する。右のNewを選択
![名称未設定 17.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/7b9b191f-4f69-2250-9937-b4d544a04f66.jpeg)

C:\Program Files\Java\jdkXXXを選択して、OKを押す
![名称未設定 21.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/14d702de-ae3d-17ce-f665-833a1815e920.jpeg)

Kotlin/JVMにチェックを入れて、Next
![名称未設定 2.jpg](https://qiita-image-store.s3.amazonaws.com/0/207883/14fd4cbb-7aa5-14f6-f8d6-6c463b96ea44.jpeg)

project名と保存先は適当に設定して完了
wiringPiについて

ラズベリーパイでC言語でプログラムを組むにはwiringPiというライブラリを使うらしい。

どんな機能を持ったライブラリなのか調べてみた。

http://nanicananica.blog.fc2.com/blog-entry-10.html

上記のサイトでWiringPiのAPIについての説明があった。

なんとなく思ったのは
①Arduinoのポート関連をRaspberry Piへ移植している。（関数名が同じなので、コードを移植しやすい）
②デジタル入出力ポートとPWMの機能を移植している気がする。

A/DとかI2Cは別なライブラリがあるんだろうなと思った。RS-232とかTCP/IPなら普通にLinuxとしてコーディングすればいいんだろうな。
OpenFace+機械学習で視線検知

### Githubでコードを公開しました！（2018.05.01 追記） https://github.com/29Takuya/EyeSight

#0. 背景
こんにちは、@29Takuyaです。（[プロフィールページ](https://29takuya.github.io/)）
この記事は、僕が学部3年(2016年後半)に授業の一環として行った活動をまとめたものです。
Pythonや機械学習の知識を身につけることが主な目的であったため、新規性などは特にありません。（暖かい目でご覧頂けると嬉しいです）

#1. 目的
顔が写った一枚の画像を入力として、その人の視線がカメラを向いているかそうでないかを判定するします。（二値分類）
僕の研究室では、対話ロボットの研究を行っているのですが、視線を検知することでよりスムーズな対話が実現できるのではというのがモチベーションです。

![data.png](https://qiita-image-store.s3.amazonaws.com/0/170782/a0c0a005-ca95-6340-1323-e7c44eb0b3b2.png)


#2. 関連技術(OpenFace)
顔が写った画像と言っても、顔のサイズや位置などは様々です。
そのため今回は、[OpenFace](https://cmusatyalab.github.io/openface/)というAPIで顔を検出した後に、視線判定を行うことにしました。
OpenFanceには色々な機能があるのですが、今回利用したのは主に二つです。

1. ランドマークの座標取得（下の画像で黒い点がついている部分）
2. 顔領域の切り出し

![openface.jpg](https://qiita-image-store.s3.amazonaws.com/0/170782/e4aed818-6c38-4776-a612-fd0ce8a8d5a5.jpeg)

顔のランドマークは下の画像のような感じで、計64個検出されます。
切り出しは特定のランドマークを基準に行われます（確か目の位置？）。
また、各ランドマークの座標も取得することができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/170782/92dfba6c-2ce7-55c5-464a-f32f5b6c5f90.png" width=60%>

#3. モデルの作成
今回試した視線検出モデルは以下の3つです。

1. 画像（画素値）をそのまま入力としてSVMを学習
2. SIFT特徴量を入力としてSVMを学習
3. 画像を入力としてCNNを学習

それぞれのアルゴリズムを以下で説明します。

###1. 画像（画素値）をそのまま入力としてSVMを学習
OpenFaceで切り出した顔画像（96×96）にヒストグラム平坦化をしたものの上1/3部分の画素値を入力とします（3072次元のベクトル）。
図を使うとこんな感じ。

![raw_svm.png](https://qiita-image-store.s3.amazonaws.com/0/170782/ccfa9268-afbe-cba8-ee09-b7968e3fbcb5.png)
ちなみに、モノクロ化と1/3のみの切り出しは、次元削減を目的としていて、ヒストグラム平坦化についてはコントラストの違いに頑健にすることが目的です。
このようにしてベクトル化したものを入力として、SVMを学習させました（ハイパーパラメータはグリッドサーチで決めました）。

###2. SIFT特徴量を入力としてSVMを学習
画像特徴量としてよく用いられているものがSIFT特徴量です。
今回は、OpenFaceのおかげで目の周りのランドマークの座標が分かっているので、その12点におけるSIFT特徴量を利用しました。

![sift.png](https://qiita-image-store.s3.amazonaws.com/0/170782/fd23f0cb-e732-24d1-315c-6027000b24fd.png)
この方法で得られた1536次元の特徴量を入力として、SVMを学習させます。

SIFT特徴量については中部大の藤吉先生の資料が非常にわかりやすかったです。
（スライド）[画像局所特徴量と特定物体認識- SIFTと最近のアプローチ - ](http://www.vision.cs.chubu.ac.jp/cvtutorial/PDF/02SIFTandMore.pdf)



###3. 画像を入力としてCNNを学習
入力は1.と同じく前処理をした顔画像の上1/3です。
モデルは畳み込み2層と全結合2層のシンプルなネットワークにしました。

![cnn.png](https://qiita-image-store.s3.amazonaws.com/0/170782/8dd288cc-ab14-decc-6722-83fd08870b23.png)

#4. 評価実験
### データセット
今回用意したデータは、正例（カメラを見ている）画像1300枚と、負例（カメラを見ていない）画像600枚です。
学習データと訓練データを9:1に分け、ホールドアウト検証を行いました。
![dataset-min.png](https://qiita-image-store.s3.amazonaws.com/0/170782/fd5e89d0-215b-7871-7fbf-55a75d311cba.png)


### 実験結果
| Model | Accuracy [%] |
|:-----------|------------:|
| 1. SVM(Input: Raw pixel) | 81.3 |
| 2. SVM(Input: SIFT Features) | 82.3 |
| 3. CNN | 88.7 |

### 結論（感想）
ニューラルネットすごい

#5. おまけ
Webカメラで撮影した映像に対して、フレーム単位で識別結果を表示してみました。
青がカメラを見ている、赤がカメラを見ていないという予測です。

###1. SVM(Input: Raw Pixel)の場合
![output_svm.gif](https://qiita-image-store.s3.amazonaws.com/0/170782/de659fbf-fd5c-f930-e4c9-cb9467a4ae1f.gif)

###2. CNNの場合
![output_cnn.gif](https://qiita-image-store.s3.amazonaws.com/0/170782/a812ab3a-103c-0853-0397-0142445bf8cc.gif)

うーん、なんとなくCNNの方が安定している気がしているような…
やはり顔自体がカメラを向いていない時には予測が難しいようです。データセットにそのような画像が足りていないのが原因かもしれません。
加えて、もし動画に適用することが前提であればスムージングや時系列モデルを用いることで、より精度が安定するのではと思いました。

ソースコードは[こちら](https://github.com/29Takuya/EyeSight)で公開しています。
ここまで読んで頂いてありがとうございました！
Ansibleを用いた構成管理入門

Ansibleという存在はうっすら頭の片隅に常にいたわけではあるが、何しろ私は面倒なことが嫌いなので、DevOpsなんてことは気にせず、自分でサーバーにssh接続してメンテやらなんやらをこなしてきたわけだ。

しかし、このAnsibleという奴がすっごい便利だということにふと気づかされることになった。

したがって、今までの己の馬鹿さを改めるために今回Ansibleというやつをちゃんと勉強してみようと思ったのである。

###目標
Ansibleを使ってnginxを仮想環境にインストールされた状態を作る

### Ansible基本

Ansibleは構成管理ツールの一環で、いわゆる所のShefやPuppetのようなものである。後発のツールであるが、(2012年誕生）人気は高く、エージェントをサーバーに入れる必要性がないため管理が楽であることがなどが挙げられる。Ansibleは主にPlaybook, Ansible本体, Inventoryファイル，Moduleから構成されている。

### Ansibleインストール

今回はVM+Vagrant+Ansibleの構成で触ってみたいと思う。(VM,Vagrantはすでにインストールされている前提で話を進めて行きたい。)

開発環境はMACなのでhomebrewを用いてAnsibleをインストールして行きたいと思う。

```ruby:Ansibleのインストール
brew install ansible
```
上記コマンドでAnsibleをインストール完了できたら、

適当なパスに移動して今回のチュートリアル用の仮想空間を作る

```ruby:仮想環境のインストール
mkdir ansible/test
cd ansible/test
vagrant init bento/centos-7.2
vagrant up
```

エラーが出る。。。ぐぬぬ。

```ruby:vboxsfエラー
Vagrant was unable to mount VirtualBox shared folders. 
This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

```ruby:vagrant-vbguestをインストール
vagrant plugin install vagrant-vbguest
```

vagrant ssh-configで表示される中身は後々必要になるのでメモしておきましょう。
好好

### Inventoryファイルの作成

InventoryファイルはAnsibleが捜査対象に接続するための定義のこと。
どうやらInventoryファイルはいろいろなことができるらしいが今回は初心者向けということで簡易的な物を組むことにする。

hostsという名前のファイルを作成する(Inventoryファイル)

```ruby:hosts
vagrant-machine ansible_host=127.0.0.1 ansible_port=2202 ansible_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/default/virtualbox/private_key
```

ansible_*** で記載されている情報は全てvagrant ssh-configによって参照される値を入れればよい

Inventoryファイルを作成したらまずはテストをしてみよう

```ruby:ansibleテスト
ansible all -i hosts -m ping
```

iオプションは Inventoryファイルへのパスを指定することができる。
allはInventoryファイル場で定義されている全てのホストに対して当てはまるグループ名である。pingはPingモジュールである。

基本の部分であとマスターする必要があることはtaskの実行内容を記載したymlファイルを作成すること

今回はsite.ymlという名前のものを作成しておきたいと思う。

```ruby:site.yml

---
  
- name: チュートリアル
  hosts: all
  tasks:

```

中身の説明をしていこう。。

- nameはログに表示される名前。
- hostsはデプロイ対象ホスト名。allによって　Inventoryに定義されているすべてのホストに対して実行する.
- tasksは実タスクの定義。今はからになっている。

```ruby:site.ymlの実行方法

ansible-playbook -i hosts site.yml
```


```ruby:site.yml最終系

- name: Playbookチュートリアル
  hosts: all
  become: true
  tasks:
    - name: libselinux-pythonをインストール
      yum:
        name: libselinux-python
        state: present
    - name: EPELリポジトリをインストール
      yum:
        name: epel-release
        state: present
    - name: Nginxのインスト〜る
      yum:
        name: nginx
        state: present
    - name: Nginxサービスの自動起動を設定
      service:
        name: nginx
        state: started
        enabled: true

```

これを入力して最後に http://192.168.33.10/
を入力すると無事nginxのページが表示されました！

Ansibleなかなか使い勝手良さそう〜
次回編ではもっと高度なものに挑戦して行きます！
JuliaでTensorFlow その1

Julia 0.6.2でTensorFlowを使ってみる。
TensorFlowとは、機械学習のフレームワークの一つで、Pythonでよく使われている。
Juliaで使った文献が英語も含めてほとんどなかったので、少し書いてみる。
ついでに、TensorFlowの考え方について「小人モデル」で解説を試みる。
その１では、単純な計算をやってみる。


Juliaでは、TensorFlow.jlというラッパーを使うことでTensorFlowを使うことができる。
https://github.com/malmaud/TensorFlow.jl

## JuliaでTensorFlowを使う利点
### 向いている人
1. TensorFlowの独特の文法を使いたくなく、Juliaっぽく普通な感じで書きたい人
2. 学習に入れるためのインプットのデータを作成する際に、Pythonが遅すぎてPython独自の考え方（全てをnumpyの演算に乗せる）を強いられるのが辛い人


### 必要のない人

1. Pythonとnumpyを使った高速化手法が苦にならない人
2. TensorFlowにすでに慣れてしまった人


## JuliaでTensorFlowを使う欠点
1. 文献が英語も日本語も含めて全然ない

 
#インストール
Juliaでいつも通りに
```Pkg.add("TensorFlow")```
で入れれば入るはず。

#TensorFlowの仕組み〜二人の小人モデル
TensorFlowでは、計算を定義してから、実行する。
これは通常のプログラミングとは大分異なっている印象を与えており、戸惑う原因の一つとなっている。
これに慣れるためには、**TensorFlowには二人小人がいて、それぞれに作業指示を出している** と考えてみよう。
小人でも妖精でも良いが、寝ている間に靴を作ってくれたりする謎の生き物程度に考えてもらえればよい。

- 小人A（グラフ生成職人）

この小人は、小人Bに指示を出す小人で、小人Bが作業しやすい最高の設計図（グラフ）を書いてくれる。私たちは小人Bが気持ち良く作業できる設計図を書くことができない。小人BはTensorFlow界のグラフ言語しか読めないのである。そこで、私たちはPythonなりCなりJuliaなりでグラフの描き方を小人Aに教える。

- 小人B（グラフ計算職人）

この小人は、小人Aから受け取ったグラフを使って、高度に最適化された最高の仕事をしてくれる（はず）。小人Bに対しては、私たちは「これが欲しい」としか言えない。計算の仕方とかその他は全部小人Aを通さないと小人Bは理解してくれない。

#TensorFlowでの基本的事項〜小人に仕事をさせる前に
グラフ生成職人である小人Aに何かを伝えるために、TensorFlow界で重要な数の種類について知っておく必要がある。主に3種類ある。
1. constant
文字通り、定数である。小人Bがやってくれる最高の仕事（グラフ計算）中に値が変わらないものである
2. Variable
変数である。これは、他のプログラム言語で言う「変数」と同じ意味を持ち、小人Bのグラフ計算の間に値が変更されるものである。機械学習で用いる場合には、この値は最適化されたりする。
3. placeholder
インプットの引数である。小人Bに指定できるのは「これが欲しい」ということと、「これを使って欲しい」ということだけであり、placeholderは引数になり得るもののことである。機械学習では、ここにインプットするデータを入れることになる。


#TensorFlowでの基本的計算〜小人に仕事をさせてみよう
TensorFlowでは、たとえ簡単な和でも、小人Aを通してから小人Bに仕事をさせなければならない。
https://github.com/malmaud/TensorFlow.jl
にもある簡単な計算を再現してみよう。

```julia:test1.jl
using TensorFlow
x = constant(Float64[1,2])
y = Variable(Float64[3,4])
z = placeholder(Float64)
w = exp(x + z + -y)

sess = Session()
run(sess, global_variables_initializer())
res = run(sess, w, Dict(z=>Float64[1,2]))
println(res)
close(sess)
```
となる。まずはじめに、x,y,zが何であるかを小人Aに指示し、wというOperation(計算)を指示している。
次に、行列演算を含んだものをやってみよう。計算としては
$$
w = x W + b
$$
を考えてみる。ここで、wやxやbは横ベクトルである。まだよくわかっていないが、横ベクトルを使うことがTensorFlowでは多い。これを計算するJuliaコードは

```julia:test2.jl

b = Variable(Float64[1 2])
x = placeholder(Float64)
W = Variable(Float64[1 2 
    3 4])
y = x*W + b
sess = Session()
run(sess, global_variables_initializer())
println(run(sess, y, Dict(x=>Float64[1 2])))
close(sess)
b0 = Float64[1 2]
x0 = Float64[1 2]
W0 = Float64[1 2
    3 4]
y0 =x0*W0+b0 
println(y0)
```
となる。このコードの後半は、普通にJuliaで計算した場合であり、値が同じであることを確かめることができる。
Python版と違って、掛け算が\*で定義できていることに注意。Juliaでは行列の演算を\*で表現でき、Tensorflowでもそのまま使うことができる。同様に、足し算+も同じである。

三角関数などの計算も同様にできる。Juliaの場合、.をつけることで要素毎に演算することができる。

```julia:test3.jl

b = Variable(Float64[1 2])
x = placeholder(Float64)
W = Variable(Float64[1 2 
    3 4])
y = x*W + b
y2 = sin.(y)
sess = Session()
run(sess, global_variables_initializer())
println(run(sess, y2, Dict(x=>Float64[1 2])))
close(sess)
b0 = Float64[1 2]
x0 = Float64[1 2]
W0 = Float64[1 2
    3 4]
y0 =x0*W0+b0 
y20 = sin.(y0)
println(y20)
```
このように、JuliaでTensorFlowを使うことで、見た目がほとんどJuliaそのままでTensorFlowの計算ができることがわかる。
OSバージョン確認コマンドリファレンス（Windows/Mac/Linux）ー2018.04版

※随時更新します

## はじめに

ブログ記事を書くとき、前提環境の情報としてOSのバージョンを書くことがあります。

状況に応じてWindows/Mac/Linuxと色々なOSに触ることがあるので、その自分用の備忘リファレンスが欲しかったのでまとめました。

以下2つをOSごとにまとめていきます。

1. OSバージョン確認コマンド
2. コマンド実行結果例

## Windows

```
※コマンドプロンプトで実行
> ver
Microsoft Windows [Version 10.0.15063]
```

## Mac OS X

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.3
BuildVersion:   17D102
```

## Linux

### Debian系

#### Debian

```
$ cat /etc/debian_version 
6.0.7
```

#### Ubuntu

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04 LTS"
```

#### Raspbian (Raspberry Pi)

```
$ cat /etc/debian_version
7.8

または

$ cat /etc/issue
Raspbian GNU/Linux 7 \n \l
```

### RedHat系

#### CentOS / RedHat

```
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

#### Fedora

```
$ cat /etc/fedora-release 
Fedora release 26 (Twenty Six)
```

### SUSE Linux

```
$ cat /etc/os-release
NAME="openSUSE Leap"
VERSION="42.3"
ID=opensuse
ID_LIKE="suse"
VERSION_ID="42.3"
PRETTY_NAME="openSUSE Leap 42.3"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:42.3"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"
```

### Alpine Linux

```
$ cat /etc/alpine-release
3.7.0
```

### Amazon Linux

```
$ cat /etc/system-release
Amazon Linux AMI release 2016.09
```

## 最後に

ここに書いていないOSのバージョン確認コマンドあればコメントいただけますと幸いです。

## 参考URL

* https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg
* https://eng-entrance.com/linux-os-version
* https://pc-karuma.net/check-mac-os-x-version/
* https://linuxfan.info/post-2913
* https://webkaru.net/linux/debian-version/
* https://www.cyberciti.biz/faq/find-opensuse-suse-enterprisel-inux-version-command/
* http://www.checksite.jp/raspbian-version-check/