OmniAICreator/Qiita-1.07M huggingface dataset:
【環境構築】Xcodeにプラグインマネージャを入れる

何事も形から。。ということでXcodeを使いやすくするためのプラグインマネージャを入れる。

## 何ができるのか。
・テーマを変える（自分はこれのために入れました。。）
・便利な機能を入れる。(便利なプラグインがあるのでしょう)

## 登場人物

### Alcatraz

プラグインマネージャです。
みんな一番有名っていっているので一番有名でしょう。。。

#### インストール方法

下記のようになれば成功。一発で成功したので失敗した方いたら教えてください。

```bash
~ % curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
・・・・
Alcatraz successfully installed!!1!🍻  Please restart your Xcode (9.1).
```

ここでXcodeをRestartして Window->PackageManager　と行くはずですが、、、、

AlcatrazはXcode8以降はサポートしてくれていないらしく8以降は下記の対応をする必要があります。

#### Xcode8以降の人

update_xcode_pluginsを入れます。

Elcapitan以降root権限を持つユーザーでも下記階層はPermissionDeniedになるのでご注意
その際はgemのインストール場所を`/usr/local/bin/`配下に変更する必要があります。
cocoapodsもこの配下にインストール場所変えるほうがいいそう。

```bash
sudo gem install xxx -n /usr/local/bin/
```

というわけで

```bash
sudo gem install update_xcode_plugins -n /usr/local/bin/
Successfully installed term-ansicolor-1.6.0
Fetching: inquirer-0.2.1.gem (100%)
Successfully installed inquirer-0.2.1
Fetching: update_xcode_plugins-0.4.0.gem (100%)
Successfully installed update_xcode_plugins-0.4.0
Parsing documentation for term-ansicolor-1.6.0
Installing ri documentation for term-ansicolor-1.6.0
Parsing documentation for inquirer-0.2.1
Installing ri documentation for inquirer-0.2.1
Parsing documentation for update_xcode_plugins-0.4.0
unable to convert "\xCA" from ASCII-8BIT to UTF-8 for lib/bin/unsign, skipping
Installing ri documentation for update_xcode_plugins-0.4.0
3 gems installed
```

#### コマンド実行
```bash

~ update_xcode_plugins
Updating...
Added C3998872-68CC-42C2-847C-B44D96AB2691 to Alcatraz (1.2.0)

Finished! 🎉
```

#### unsignする
```bash
~ update_xcode_plugins --unsign

Looking for Xcode...
・・・
Password:　// パスワード入力
Finished! 🎉
```

#### Xcodeを開き直す
開き直すとダイアログがでるので `LoadBundle`を押下
機密情報が〜のダイアログもパスワードを入れて許可


XcodeのWindowタブを開いて下記がでていれば完了です。

<img width="300" alt="スクリーンショット 2017-11-12 13.16.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/164151/ffd3e6bd-4487-5764-ddab-2f68917f2a7c.png">


# 参考(大変勉強になりましたありがとうございました)
http://alcatraz.io/
https://qiita.com/mukoya/items/c0c545e28ab162af2b91
https://qiita.com/YamagishiRyu/items/5667ea8b87beb4792469
https://qiita.com/tattn/items/238b2b813be16f830bd4
【GAS】住所から緯度経度を取得してスプレッドシートに書き込む

# 住所から緯度経度を取得してスプレッドシートに書き込む
https://qiita.com/OUIEA/items/bcbeacd0fff53d5a4d2b
をまるっと引用しています。

追加情報として

- APIキーが必要だった
- 無料の範囲で、大量にリクエストを投げるときはスリープが必要
- ついでにモジュールパターンを採用
- ついでにスプレッドシートに書き込む実装

# あとはコードで語ります。

```js

/*
 * 住所変換スクリプト
 */
function convert() {
  const COLUMN = {
    ADDRESS: 5,
    LAT: 37,
    LON: 38,
  }
  const sheetName = 'フォームの回答 1'
  const sheet = SpreadsheetApp.getActive().getSheetByName(sheetName)
  const startRow = 2
  const lastRow = sheet.getLastRow() - 1
  const lastCol = sheet.getLastColumn()

  const dataRange = sheet.getRange(startRow, 1, lastRow, lastCol);
  const data = dataRange.getValues();

  for (var i = 0; i < data.length; ++i) {
    var row = data[i]

    var latitude = row[COLUMN.LAT]
    var longitude = row[COLUMN.LON]
    // 既に変換済みの場合は何もしない
    if (latitude != "" || longitude != "") {
      continue
    }

    var location = APP.util.common.convertAddress(row[COLUMN.ADDRESS])
    Logger.log(location)
    if (typeof location === 'undefined') {
      continue
    }

    // 50回リクエストを送信したら1秒スリープする
    APP.util.common.sleepByCount(1000, 50)

    // スプレッドシートに出力
    sheet.getRange(startRow + i, COLUMN.LAT + 1).setValue(location['lat'])
    sheet.getRange(startRow + i, COLUMN.LON + 1).setValue(location['lon'])

    // Make sure the cell is updated right away in case the script is interrupted
    SpreadsheetApp.flush()
    Logger.log(row)
  }
}

// namespace
var APP = APP || {
    util: {
      common: {}
    },
  }

APP.util.common = (function () {
  /*
   *一定の回数になると1秒スリープし、カウンタが0になる
   * sleepMS: sleepする時間(ms)
   * limit: スリープするタイミング
   */
  sleepByCount = function (sleepMS, limit) {
    if (typeof limit === 'undefined') {
      // limitが引数として指定されていなければカウントしない
      return
    }

    if (typeof sleepByCount.count === 'undefined') {
      // 関数内カウンタ初期化
      sleepByCount.count = 0
    }
    if (sleepByCount.count % limit === 0 && sleepByCount.count !== 0) {
      Utilities.sleep(sleepMS)
      Logger.log('おやすみ')
    }
    sleepByCount.count += 1

    Logger.log(sleepByCount.count)
  }

  /*
   * 住所から緯度、経度を変換する
   * Google Geocoding APIにはAPIキーが必要
   * https://developers.google.com/maps/documentation/geocoding/get-api-key?hl=ja
   * 制限について
   * 2500リクエスト/日
   * 50リクエスト/秒
   * 大量に取得したい場合は、50reqごとに1秒のwaitを入れるような実装が必要
   */
  convertFromAddressToLocation = function (address) {
    if (address === '') {
      return
    }

    var api_url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + encodeURI(address);
    api_url += '&key=[見せられないよ！]'
    var response = UrlFetchApp.fetch(api_url);
    var result = JSON.parse(response);
    var location = result['results'][0]
    if (typeof location === 'undefined') {
      return
    }
    location = location['geometry']['location']
    return {lat: location['lat'], lon: location['lng']}
  }

  // Public API

    sleepByCount: sleepByCount,
    convertAddress: convertFromAddressToLocation
  }
}())
```

以上です。
コードが汚い！こう書いたほうがいい！編集リクエスト待っています。

実は、sleepByCountのところが納得いっていません。別途sleepByCountを読んだ場合に同じcountを参照してしまうので。
JavaScript, CSS, 画像ファイルをHTMLに自動で埋め込む方法

JavaScriptやCSSなどをひとつのHTMLに埋め込んでおけば、HTMLファイルだけ保存するとローカル(インターネットに繋がらない環境)で利用できるツールを作ることができます。
もちろん、jsファイルやcssファイルの中身をコピーし、JavaScriptやCSSを手動でHTMLに埋め込むこともできるのですが、jsファイル、cssファイル、jpgファイルなどを自動で埋め込む方法を見つけましたので紹介します。

# サンプル
## どんな感じのHTMLが出力されるか?
このHTMLファイルが

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <link rel="stylesheet" href="assets/style.css" inline>
  <title>inline-sourceのテスト</title>
</head>
<body>
  <main id="main"></main>
  <img src="assets/kominka-light.jpg" inline>
  <script src="assets/script.js" inline></script>
</body>
</html>
```

このようになるイメージです。

* `script` タグは `src` 属性が無くなり、 `<script>` と `</script>` の間にJavaScriptが埋め込まれる
* `link` タグは `style` タグに変更されてCSSが埋め込まれる
* `img` タグは `src` 属性で指定された画像ファイルがデータURIスキームに変換され埋め込まれる

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <style>#main {
  font-size: 100px;
}
</style>
  <title>inline-sourceのテスト</title>
</head>
<body>
  <main id="main"></main>
  <img src="data:image/jpeg;base64,/9j/4Q/+RXhpZgAATU0A(省略...)">
  <script>(function() {
  document.getElementById('main').innerText = 'Hello, World!';
})();
</script>
</body>
</html>
```

## 埋め込み方法
[Node.js](https://nodejs.org/ja/)と `inline-source` という[npm](https://www.npmjs.com/)パッケージを用いて埋め込みを実施します。

まず、npmコマンドで `inline-source` をインストールします

```
$ npm install inline-source
```

以下のスクリプトは `inline.js` と同じディレクトリにある `index.html` を読み込み、 `dist/index.html` に埋め込み後のHTMLを出力する例です

```js:inline.js
const { inlineSource } = require('inline-source');
const fs = require('fs');

inlineSource('./index.html', {
  compress: false
})
.then(html => {
  fs.writeFileSync('./dist/index.html', html);
});
```

埋め込みを実施したいタグ(`script`, `link`, `img` タグなど)には `inline` 属性を付与しておきます。

上記の `inline.js` では `dist/` ディレクトリを作っておかないとエラーが出るので、作成しておいてください

```
$ mkdir dist/
```

以下のコマンドで埋め込みを実施します

```
$ node inline.js
```

## サンプルリポジトリ
以下のリポジトリにJavaScript, CSS, 画像ファイルを埋め込むサンプルを置きました。

https://github.com/mascii/inline-source-test

`node inline.js` or `npm run inline` を実行すると、`inline.js` と同じディレクトリにある `index.html` を基としてJavaScript, CSS, 画像ファイルを埋め込んだHTMLを `dist/index.html` に出力します


# 実例
以前に[Vue.js](https://jp.vuejs.org/index.html) + [webpack](https://webpack.js.org/)を用いて、Raspberry Piの無線LANの設定ファイルを**ブラウザ上で生成する**ツールを製作しておりました。

<img width="600" alt="wpa-supplicant-conf-tool.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/67e67a87-27f1-2aef-43a5-739d6e0755d7.png">
[Raspberry Piの無線LANをmicroSDで簡単に設定するためのツールを作った](https://qiita.com/mascii/items/a43d71572e1919e56398)

このツールのHTMLファイルにJavaScriptとCSSを埋め込むことで、HTMLファイルだけ保存すればローカルで利用できるようになりました。

`inline-source` に依存したwebpackのプラグインを用いて埋め込みを実施することも考えましたが、 webpackでやるメリットがあまりなかったため、webpackでJavaScript, CSSをプロダクションビルドした後に埋め込みを別途実施するようなやり方にしました。
フォルダ名の変更

ユーザに明示的にフォルダを使わないようにお願いするときがあれば
つかえそうですが（ないか）。

①フォルダで名前が[test]を含むものだけ検出
PS C:\Users\user\Desktop> Get-ChildItem | where{$_.mode -match "d" -and $_.basename -match "^\*test*"}

Mode                LastWriteTime     Length Name
d----        2017/11/12     11:50            test_1
d----        2017/11/12     11:50            test_2
d----        2017/11/12     11:51            test_3
d----        2017/11/12     11:49            test_5

②対象のフォルダのみ先頭を[禁止]に変更
PS C:\Users\user\Desktop> Get-ChildItem | where{$_.mode -match "d" -and $_.basename -match "^\*test*"} | Rename-Item -NewName {$_.name -replace '^','禁止'}

実行結果
PS C:\Users\user\Desktop> Get-ChildItem | where{$_.mode -match "d" -and $_.basename -match "^\*test*"}

Mode                LastWriteTime     Length Name
d----        2017/11/12     11:50            禁止test_1
d----        2017/11/12     11:50            禁止test_2
d----        2017/11/12     11:51            禁止test_3
d----        2017/11/12     11:49            禁止test_5


※補足
元に戻したいときは、フォルダの先頭から[禁止]を削除。
PS C:\Users\user\Desktop> Get-ChildItem | where{$_.mode -match "d" -and $_.basename -match "^\*test*"} | Rename-Item -NewName {$_.name -replace '禁止',''}

実行後
PS C:\Users\user\Desktop> Get-ChildItem | where{$_.mode -match "d" -and $_.basename -match "^\*test*"}

d----        2017/11/12     11:50            test_1
d----        2017/11/12     11:50            test_2
d----        2017/11/12     11:51            test_3
d----        2017/11/12     11:49            test_5
VL53L0XをM5Stackで使う

##目的
TOFレーザー測距センサ VL53L0XをM5Stackで使う。
VL53L0Xは、I2Cポートのセンサで、M5StackのI2Cポートと接続すると、通信することができる。


##M5StackのIO
VL53L0Xの5V,GND,SCL,SDAポートと、M5Stackのの5V,GND,SCL,SDAポートとを接続する。

##Arduino IDEにVL53L0Xのラインブラリをインストール

ArduinoIDEのスケッチ→ライブラリをインクルード→VL53L0Xから、
ライブラリをインストールする。

![test0704.png](https://qiita-image-store.s3.amazonaws.com/0/73020/d0d31bb5-c085-be1a-0973-0fdcb1efcf03.png)


##Arduinoへの書き込み
ArduinoIDEに下記のソースを貼り付けて、
「スケッチ」→「検証・コンパイル」→「マイコンボードに書き込む」

シリアルコンソールとディスプレイに距離が表示される。

```

#include <M5Stack.h>
#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
void setup() {
  Serial.begin(115200);
  Wire.begin();
  M5.begin();
  sensor.init();
  sensor.setTimeout(500);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(10, 10);
  M5.Lcd.setTextColor(WHITE);
  M5.Lcd.setTextSize(10);
}
void loop() {
  int distance = sensor.readRangeContinuousMillimeters();
  if (!sensor.timeoutOccurred()) {
    Serial.println(distance);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.println( distance);
  }
}

```

##デモ動画

https://twitter.com/nnn112358/status/988062576897478664


##参考
作りながら学ぶArduino+=電子工作入門　距離を正確に測る　その2　レーザーVL53L0X
https://www.denshi.club/cookbook/sensor/distance/2vl53l0x.html
[kvm]qcow2からzfs(zvol)運用に切り替える

qcow2で運用していたイメージをzfs上のzvolに移行したので、その時のメモ

#環境
- ubuntu server 16.04 lts
- qemu-kvm
- libvirt
- zfs on linux


#手順
```bash:マウント
modprobe nbd max_part=63
qemu-nbd -c /dev/nbd0 ファイル.qcow2
```
```bash:zvolの作成
zfs create -s -V 20G tank/hogehoge
```
```bash:qcow2のデータをzvolに複製
dd if=/dev/nbd0 of=/dev/zvol/tank/hogehoge ibs=512 obs=1024k
```
あとは作成したhogehogeをVirt-managerから起動ディスクとして指定すれば完了です
<img width="502" alt="スクリーンショット 2017-11-12 12.09.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/213392/7e7c8c8d-1e8e-11f4-fdbf-bf0f30c25360.png">

#感想
zfsで利用するメリットはまだはっきり分かりませんが、スナップショットはzfsの方が使いやすように思います。

#参考
* [qcow2イメージのマウント](https://qiita.com/tukiyo3/items/afc601ea72c546edb990)
* [KVMのGuestOSにZVOLを使う](http://d.zinrai.info/blog/html/2014/02/06/debian_wheezy_kvm_zfs.html)
MacBookPro(macOS 10.13.1)を購入したのでPythonに必要な開発環境を構築してみた

WindowからMacBookPro(2017)へ切り替えたので、Pythonに必要な開発環境を構築したので雑なメモ
パソコン(Mac)むずかしい。。。

### ひとまず現在の環境はこんなかんじ
- macOS 10.13.1
- 購入したばかりなのでデフォルトとして Python 2.7.10 が入っている感じ

Python3 をインストールしつつ、Python2でも使えるようにしたい
エディタは当初はsublime textが良いと思ったが、巷ではAtomが流行っているらしく、最低限のその設定をやる

### pyenv のインストール
まずはPythonのバージョンを確認

```
$ python --version
>= Python 2.7.10
```

pyenv を使えば簡単に2系や3系のバージョンの切り替えができそうなのでインストールする

homebrew で pyenv をインストールします。
（homebrew を事前にインストールする必要あり。その辺はググってね）


```
$ brew install pyenv
```

インストールが完了したら、バージョンを確認しておく

```
$ pyenv -v
> pyenv 1.1.5
```

### Python3 のインストール

まず、インストールできるバージョンを確認しておく

```
$ pyenv install --list
> 2.7.1
> 省略
> 3.6.3
```

2017/11/12時点ではPython3.6.3が最新版みたいなのでそれをインストール

```
pyenv install 3.6.3
Downloading Python-3.6.3.tar.xz...
-> https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
Installing Python-3.6.3...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```

おやおや、エラー？
https://qiita.com/kasama123/items/ab9eea7a9c42e3941a14
に答えが書いてあったのでこの手順通りやってみると今度はうまく行った模様

インストールされているPythonのバージョンを確認する

```
$ pyenv versions
* system (set by /Users/admin/.pyenv/version)
  3.6.3
```

3.6.3に切り替えてみる

```
$ pyenv global 3.6.3
```
バージョンを切り替えたら、rehash でリロードする必要がある。

```
$ pyenv rehash
```

pyenv-pip-rehashというプラグインがあって、それを使えば`pyenv rehash` を実行しなくでも良い感じに自動やってくれるらしい。

### Atom エディタのインストール
https://atom.io/ ここからダウンロードできる

#### Atom Runner プラグインのインストール

エディタでPythonの実行結果を確認できる。開発が捗りそうなのでインストールしておく
Macの場合は、Control + R で実行できる

その他追記中
fastlane deliverのkeywordをtxtで指定するときに気をつけること

久しぶりにfastlaneを使ってappstoreにアプリをアップしたらkeywordのカンマ区切りが全部なくなっててた。
のを解決したメモ。

こんな感じ。

```
freehogemogefoobar
```
こんなのどんなキーワードにも引っかからんやんけ。（なんか前回のアップデートで新規インストール数がっくり落ちたはそのせいかもな。。。）

原因はfastlane deliverで使う`keywords.txt`だった。自分の場合は`{Project root}/fastlane/metadata/en-US/`配下に色々txtがあり、そのうちの１つ。内容は普通に、

```
free
hoge
moge
foo
bar
```
と書いてあって大丈夫そうなのに。。。。

[2015年のfastlaneのissue](https://github.com/fastlane/fastlane/issues/2213)をみたら、[Krauseさん自身が改行しないでカンマで繋げて書いてね](https://github.com/fastlane/fastlane/issues/2213#issuecomment-193479775)みたいなこと言ってるのを見つける。

このファイル自分で作った覚えがないから自動生成されたんだと思うだけどねぇ。。。。
一応改行しても大丈夫ないようだが、改行が１文字分としてカウントされる（きっとスペースに変換されるのかな？）ので、結局

```
free,hoge,moge,foo,bar
```
と一行で一気に書くことに。これで無事１００文字制限ギリギリのキーワードをiTunes Connectに設定できた。
Rで暇な女子大生のツイートをテキストマイニング

# やりたいこと

* Twitterの肉食女子大生アカウント　暇な女子大生のツイートをテキストマイニング
    * 暇な女子大生がよく使う単語の可視化

# 結果

* 優勝、エリート、ﾄﾞｶﾀ、早慶、東大、Tinderなどの言葉が検出された

![himanajoshidaisei.png](https://qiita-image-store.s3.amazonaws.com/0/134704/e25c87e3-9a16-e4d4-d3ad-01c6f64b9fcb.png)

# ソースコード

```r:textmining.r
#TwitteR

consumerKey <- "Consumer Key (API Key)を入力"
consumerSecret <- "Consumer Secret (API Secret)を入力"
accessToken <- "Access Tokenを入力"
accessSecret <- "Access Token Secretを入力"
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)

#過去2000件のツイートを分析
tweets <- userTimeline("boredjd", n = 2000)


#データフレームに変換し、テキスト部分だけを指定しツイートを取得

tweets <- twListToDF(tweets) #これでデータフレームにできます
tweets <- tweets$text #テキストデータだけ取得します

#テキスト変換

write.table(tweets,"tweets.txt") #一時的にテキストデータに保存します

#日本語テキストの解析用に、パッケージ「RMeCab」を呼び出し、名刺、形容詞、動詞のみ抽出

tweetsFrq <- RMeCabFreq("tweets.txt")
tweetsFrq2 <- tweetsFrq %>% filter(Freq>10&Freq<400, Info1 %in% c("名詞"), Info2 != "数")

#URLや@などを削除

tweetsFrq2  <- gsub("^RT\\s@[0-9a-zA-Z\\._]*:\\s+","",tweetsFrq2 )
tweetsFrq2   <- gsub("https?://t.co/[0-9a-zA-Z\\._]*","",tweetsFrq2 )

wordcloud(tweetsFrq$Term,tweetsFrq$Freq,random.order=FALSE,
  color=rainbow(5),random.color=FALSE,scale=c(3,1),min.freq=10)

```

# 参考

* 詳しい実装方法はこちらの記事を参考にしてください

【R】テキストマイニングを利用して、東京ちんこ倶楽部と暇な女子大生を分析する
https://review-of-my-life.blogspot.jp/2017/08/r-text-mining.html
Google Spread SheetでWebスクレイピング

# やりたいこと

* スクレイピングするコード書くのだるい
* Google Spread Sheet（Google版エクセル）にURL入れるとそのサイトの指定した箇所のWebスクレピングしてくれる処理を実装すれば、URLとXpath入れるだけでデータとってきてくれた
    * News Picksの記事で、URL入れると以下のデータを自動でスクレイピングする関数を使う
        * タイトル    
        * Picks数（シェア数）

# 結果

* URL指定してあげると、Webから自動でデータとってきてくれます。こんな感じになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/73e883fb-2a2c-7054-73fa-7065d336de55.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/f7301183-793b-18e2-7c40-e9a148a440ed.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/e01b5546-04c5-4c7b-a773-70972e86258c.png)

# 実装方法・参考

* 詳しいやり方は下の記事にまとめておいたので読んでください
    * Xpathの指定とかもろもろ

スクレイピングの最強ツールはGoogle Spreadsheetで決まり！面倒な情報収集はGoogle Spreadsheetにやらせよう！

https://review-of-my-life.blogspot.jp/2017/07/google-spreadsheet-information.html
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part1-3,1-4

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part1-3 Bootstrapでnavbarを作成
[bootstrapのnavbar](https://getbootstrap.com/docs/3.3/components/#navbar)のexampleがここに。


#自己課題
- navbarを導入し、BrandとLinkのみにせよ。
- link部分を複製し、「シッターになる」「利用の流れ」「アカウント作成」「ログイン」を作成せよ。

#part1-4 さらにBootstrapを使ってみる
##jumbotron（ジャンボトロン）とは？
サイトのトップページに横幅いっぱいに画像が広がっているデザインをよく見ませんか？それです。bootstrapに内蔵されているクラスjumbotronを使えば簡単に実現できるのだ。
[ここ](https://v4-alpha.getbootstrap.com/components/jumbotron/)がリンクです。

##cssを解読

    .class{----}
.classでclassというクラスにこのCSSが適応される。
    
     padding-top: --px;
上のpadding,つまり要素内の上の余白を決める。よく混合するものにmarginがあるがこれは要素間の余白を決めるもの。

    background: linear-gradient(上の色, 下の色 ), url(---.jpg);
背景をグラデーションできる。第一引数が上の色で第二引数が下の色。urlは画像のURL。imageフォルダがデフォルトになっている。

    background-size: cover;
背景画像のサイズを決めるときに使う。
auto
自動的に算出される（初期値）
contain
縦横比は保持して、背景領域に収まる最大サイズになるように背景画像を拡大縮小する
cover
縦横比は保持して、背景領域を完全に覆う最小サイズになるように背景画像を拡大縮小する
長さ
背景画像の幅・高さを指定する
パーセンテージ
背景領域に対する背景画像の幅・高さのパーセンテージを指定する
[参照　http://www.htmq.com/css3/background-size.shtml](http://www.htmq.com/css3/background-size.shtml)

    background-position: 50% 50%;
背景画像の位置を決めるもの。50% 50%だと左から50% 上から50%の位置が真ん中に来る。
    background-position: 50px 100px;
だと、左に右に50px、上から100px下に動く。

    height: 100px;
高さが１００pxになる。

    z-index: 10;
この値が大きい方が上に来る。重なったときの優先順位を決めるための値。

    .navbar > li > a {}
これは、navberクラスの中にあるliの中にあるaに適応される。

#自己課題
- jumbotronを導入。
- pタグを決して、中にnavbarを配置せよ。
- 画像をダウンロード、cssを適用させよ。
リモートレポジトリ作成後のローカルレポジトリ作成

ローカルにプロジェクトファイル作成
↓
ファイル内でgit init
↓
git remote add origin リモートレポジトリURL
↓
git add .
↓
git commit -m "first commit"
↓
git push -u origin master

これでローカルとリモートが繋がる
列挙体のリストを作るMarkupExtension

#概要
UWPやWPFで列挙型から1つの値を選ぶ目的でComboBoxやListBoxを使用することはよくあります。
その場合、ItemSourceに列挙型の値のリストを入れる必要があります。
ViewModelや別リソースでそれらのリストを用意しても良いですが、どうせ全値を列挙するなら自動でやってほしい。
そこで指定した列挙型の全値を提供するMarkupExtensionを作ります。

※17/11/15追記[より高度な方法として添付プロパティを利用して、SelectedItemから自動で列挙型のリストを作る方法があります](https://qiita.com/soi/items/1b18e703d46a8ac85790)。

#使用方法
ComboBoxやListBoxのItemSourceに列挙型を指定したMarkupExtensionを使用します。

下記サンプルコードでは
ItemSourceにVisibility列挙型を指定しています。
さらに本題とは関係ありませんが、TextBlockのVisibilityをそのComboBoxのSelctedItemにBindしています。
ViewModelやコードビハインドは何も書いていないので省略します。

```xml:MainWindow.xaml
<Window
    x:Class="EnumCreateMarkupExtensionTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:EnumCreateMarkupExtensionTest"
    Width="325" Height="150">
    <StackPanel>
        <TextBlock
            Margin="10"
            Background="Red"
            Visibility="{Binding SelectedItem, ElementName=comboBox}" />
        <ComboBox x:Name="comboBox" ItemsSource="{local:EnumCreate Visibility}" />
    </StackPanel>
</Window>
```

#実行結果
Visibleを選択するとTextBlockが表示されます。

![スクリーンショット 2017-11-12 11.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/120077/606bc8d7-937b-64ee-421b-df74bc168c09.png)

Collapsedを選択するとTextBlockが非表示になります。

![スクリーンショット 2017-11-12 11.19.56.png](https://qiita-image-store.s3.amazonaws.com/0/120077/eb635682-d7b9-cc7a-f164-4d5b57162813.png)


#MarkupExtension実装
指定された型が列挙型の場合、`GetEnumValues()`で返すだけです。

```csharp:EnumCreateExtension.cs
[MarkupExtensionReturnType(typeof(IEnumerable))]
public class EnumCreateExtension : MarkupExtension
{
    [ConstructorArgument("prefix")]
    public Type Type { get; set; }

    public EnumCreateExtension(Type type)
    {
        this.Type = type;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
        => Type.IsEnum ?
        Type.GetEnumValues() :
        null;
}
```

#環境
VisualStudio2017
.NET Framework 4.7
C#7
ubuntuの#!bin/shでブレース展開が機能しなかった

# 現象
Ubuntu16.04で以下のスクリプトが機能しなかった。

```sh
#!bin/sh

# いろいろ処理
ls /home/{userA,userB}/
# いろいろ処理
```

ls の結果をパイプで繋いであれこれしてた部分が動かなくなってた。（CentOSでは動いてた）
出力を見ると、ブレース展開{A,B}がうまく機能していないっぽい。

# 結果
以下のように、シバンを変更したら動いた。

```bash
#!bin/bash

# いろいろ処理
ls /home/{userA,userB}/
# いろいろ処理
```

# 原因
どうやらUbuntuは、/bin/sh -> dash らしい。

```sh
~$ readlink -f /bin/sh
/bin/dash
```

そして、dashでは、ブレース展開がサポートされていない。
CentOSでは、/bin/sh -> bash なので気にしてなかった。
ポインタを左端から右端に移動する

####4displays
4台ディスプレイをつないで使っている。4K×2台と、あとは2560×1440(3K?)と1920×1080(2K)。
画面が広くて作業性は高い。
やっと画面の広さが、本物の机に近づいてきた気がしている。

####Pointer Location
困っているのが、ポインタを左端から右端に移動する作業。
左端のディスプレイと、右端のディスプレイには、基本的に情報を得るだけ(ビューオンリー)のウィンドウを配置しているが、基本的にWindowsはウィンドウの位置を覚えないので、操作が必要なこともわりとある。

####Watch PointerLocation
そこで、自作常駐ソフトで、ポインタの位置を監視し、ポインタを右端から左端に飛ばすことにした。前に、複数のPC(Windows/Mac)でポインタを連携できるSynergeyというのを使ったことがあるが、それみたいにするわけだ。

####Coding
具体的には、x=5279でx=-3240にすればよい。
下記コードでできた。

```C#
using System.Drawing;
using System.Windows.Forms;

namespace reportDisplays
{
	public partial class Form1 : Form
	{
		Point PastPoint = new Point();

		private void LeftRightJump(Point pointerlocation)
		{
			if (pointerlocation.X == 5279 && PastPoint.X < 5279)
			{
				pointerlocation.X = -3240;
				Cursor.Position = pointerlocation;
			}
			else if (pointerlocation.X == -3240 && -3240 < PastPoint.X)
			{
				pointerlocation.X = 5279;
				Cursor.Position = pointerlocation;
			}

			PastPoint = pointerlocation;
		}
	}
}
```
AWSさわって学ぶ 1 準備

# AWSをさわって学ぶ 1 準備
Javaの開発主な仕事としているが、インフラの知識を少しでも学ぶためにAWSをさわって学ぶ。
特に目的は決めずにいろいろさわってみる。
# 準備
## アカウント作成
[ここらへん](https://aws.amazon.com/jp/?nc2=h_lg) で登録する。

が、本人確認でセキュリティチェックでうまくいかなかった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213269/1f5145cc-6070-16eb-4432-f304000ef1ed.png)
↓入力後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213269/b3dd8c12-fc75-3021-3069-eee412c671bf.png)
> * セキュリティチェックの文字が正しくありません。再度お試しください。

`2017/11/12 10:00問い合わせ中・・・`
`2017/11/14 22:10更新`
サポートに連絡して、AWSカスタマーサービスからの手動電話にて認証完了した。
## 経緯
- 2017/11/13 15:00 AWSカスタマーサービスから連絡先を編集して、電話を受けることができる時間を指定するよう連絡がきた。
- 2017/11/14 09:30 連絡先を編集し、Webのサポートセンターの該当ケースに上記指示通り時間を指定して返信した。
- 2017/11/14 10:00 AWSカスタマーサービス電話がきて、この電話をもって認証が完了した。Webでサインアップの続きをするようアナウンスがあったのでWebで続きを行い登録完了した。

### 感想
スピーディな対応だったと思う。
受付時間がもう少し遅くまでやっているとよいと思う。
Integromatによるプログラミングレス/サーバーレスwebAPI作成 その3(Read/Delete編)

# Webhookの中身を実装する(Read編)
その2(https://qiita.com/nendocode/items/c0d2f9fd1e812ea3e3bd) のCreate編と基本的に同じようにシナリオを作っていきます。

今度はデータストアでのアクションを「Get a Record」にします。
<img width="355" alt="スクリーンショット 2017-11-12 9.26.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/349f8cd5-9db5-8739-7176-cf73db39bcf9.png">

データストアから、「Id」をキーにしてレコードを検索します。
<img width="403" alt="スクリーンショット 2017-11-12 9.26.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/ad526bc0-bc17-85fc-93b1-9e8e1129227f.png">

レスポンス用のJsonデータを作るため、シナリオ画面のFAVORITESの「+」アイコンから、「JSON」→「Create JSON」を選択し、下記のように繋ぎます。
<img width="1157" alt="スクリーンショット 2017-11-12 9.33.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/999b137e-1785-420b-9fa4-91f2e33e5668.png">

下記のようにデータストアからの検索結果を、Book型のJsonデータに変換します。
<img width="613" alt="スクリーンショット 2017-11-12 9.30.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/48f92a5f-046d-ba1e-8a49-7f91bfe053e7.png">

最後にWebhookレスポンスにJsonデータと、レスポンスヘッダを設定します。
<img width="402" alt="スクリーンショット 2017-11-12 9.31.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/aa22f4de-8d5d-ef0d-f5fe-37df0d6fed2f.png">


適当なRESTクライアントツールからリクエストを投げて実行してみます。
情報のReadなのにPOSTを使うのは違和感を感じるかもしれませんが、Webhookを使う以上、こうなります。
<img width="806" alt="スクリーンショット 2017-11-12 9.55.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/d1e8d4be-ae00-2edc-cbf9-86fb30096fb4.png">


# Webhookの中身を実装する(Delete編)
その2(https://qiita.com/nendocode/items/c0d2f9fd1e812ea3e3bd) のCreate編と基本的に同じようにシナリオを作っていきます。

今度はデータストアでのアクションを「Delete a Record」にします。
<img width="353" alt="スクリーンショット 2017-11-12 9.35.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/a77b8e4f-17eb-554b-9887-e304396611ec.png">

「Id」をキーにしてデータを削除します。
<img width="401" alt="スクリーンショット 2017-11-12 9.36.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/a3d6b473-222d-48e7-d2ca-0a20ff64b87b.png">

適当なRESTクライアントツールからリクエストを投げて実行してみます。
<img width="800" alt="スクリーンショット 2017-11-12 9.55.52のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/211743/745cff04-6724-ed92-8736-11ab51ff324a.png">

データが削除できたどうかはメニューから「Data Stores」を選択し、「Browse」をクリックする事で確認できます。

# まとめ
お手軽にプログラミングレス/サーバーレスでwebAPIを作成できました。
Integromatでは、他webサービスとの連携や、ちょっとした計算ロジックを仕込んだり分岐したりもできるので、プログラミングレスでそこそこのモノが作れます。オススメです。

# 記事一覧
その1(https://qiita.com/nendocode/items/756b59b33d3e0cab4108)
その2(https://qiita.com/nendocode/items/c0d2f9fd1e812ea3e3bd)
その3(https://qiita.com/nendocode/items/f71982042018ddb8c74a)
IBM Cloudライト・アカウントでWatsonをさわってみた

無料で利用できるIBM Cloudライト・アカウントがリリースされたので、Watsonをさわってみました。

# ライトアカウントで利用できるAPI

全APIではないですが、ある程度利用できるようです。

- Conversation
- Discovery
- Language Translator
- Natural Language Understanding
- Personality Insights
- Speech To Text
- Text to Speech
- Tone Analyzer

# Language Translator APIを試してみる
APIの認証はBasic認証です。
[チュートリアル](https://console.bluemix.net/docs/services/language-translator/getting-started.html#gettingstarted)や[APIドキュメント](https://www.ibm.com/watson/developercloud/language-translator/api/v2/?curl#introduction)にcurlコマンドのサンプルがのっているので試してみました。

#### 1. Language Translator APIをコンソールから作成する
仕組みが違うからなのでしょうが、AWSに慣れているとちょっと面倒な手順だと感じます。
#### 2. 認証情報を確認する
作成したAPIのサービス資格情報からusernameとpasswordを取得します。
#### 3. curlコマンドでAPIを叩く
英語(en)からスペイン語(es)に変換されます。

```bash:リクエスト
USERNAME=hogehoge
PASS=fuga
curl -X POST --user "$USERNAME":"$PASS" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{"text":"Hello, world!","source":"en","target":"es"}' \
"https://gateway.watsonplatform.net/language-translator/api/v2/translate"
```
```bash:レスポンス
{
  "translations" : [ {
    "translation" : "Hola, mundo!"
  } ],
  "word_count" : 2,
  "character_count" : 13
}
```

# proxyとしてAmazon API Gatewayを利用してみる
#### 1. API GatewayでAPIを作成する
<img width="817" alt="1_create_api.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/c78b3c68-0566-f9a8-e7d4-fe079c53825d.png">

#### 2. APIのリソースを作成する
<img width="917" alt="2_create_resource.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/31078952-a56d-0606-951b-03034ed8c869.png">

#### 3. proxyを設定する
文字が切れている部分は{proxy}です。
<img width="883" alt="3_proxy.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/6a668c9c-5d52-c6c5-cec1-39437bec5fd3.png">

#### 4. Basic認証用のヘッダーを設定する
Basic認証用のヘッダーを設定します。
USER/PASSのエンコードは[こちらの記事](https://qiita.com/reoring/items/c73291229a2826d52132)を参考にさせて頂きました。
<img width="876" alt="4_authorization.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/47cb0262-2c7d-6308-bb68-f14e9d7354ea.png">

#### 5. APIをテストする
APIをデプロイする前に、テストしてみます。
<img width="282" alt="5_1_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/2093b7ea-b44d-fb34-2816-4896a3c508d1.png">
<img width="321" alt="5_2_test.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/b6367be0-c9df-796d-8bc9-a8f82f08253a.png">

#### 6. テスト結果
「こんにちは」が日本語(ja)と判定されました。
<img width="466" alt="5_3_result.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/bfaa3161-8739-1423-7b7f-0958281e8deb.png">

あとはIAM等を設定してAPIをデプロイすれば、AWSからWatsonのAPIを叩きまくれますね。



# 感想
東京リージョンまだー？
geometry + Python > 四面体結合体 > 隠面の「頂点インデックス組合せ」を見つける > v0.1

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

### 背景

[MATLAB > freeBoundary()を試してみた > tetmeshを処理してみた > 疑問点](https://qiita.com/7of9/items/2c0d30a618efcdeabb0f)

MATLABにはfreeBoundary()というAPIがある。Numpyのビルトインにはない。
作るしかない（泥縄式開発方式: DDD[Doronawa Driven Development])

### テストデータ

[MATLAB > 四面体メッシュプロット > tetramesh() | view(30,30) | サブセット表示 tetramesh(tet(2:3,:),X)](https://qiita.com/7of9/items/40c40b2c789c7e845bbb#%E3%82%B5%E3%83%96%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E8%A1%A8%E7%A4%BA)

上記にて隠面ありの四面体結合体の情報が得られている。

### 問題の整理

- 三角形の座標が与えられる
- 三角形の座標のインデックスの組合せが与えられる
- 隠面となる三角形のインデックス組合せを求めよ

上記の例の三角形のインデックス(以下)を用いる。

MATLABコード。

```matlab
>> load tetmesh
>> tet(2:3,:)

ans =

        1092         856        1094        1095
        1092        1095         896         856
```

### 解き方 (案)

思いついたのが以下。

異なる２つの四面体において、インデックスが３つ重なっていれば隠面である。


### code v0.1

https://ideone.com/ElYnJp

Python3コード。

```py3
alist = [ 1092, 856, 1094, 1095 ]
blist = [ 1092, 1095, 896, 856 ]
#print(alist)
#print(blist)

overlap = []
for elem in alist:
	if elem in blist:
		overlap += [ elem ]
print(overlap)
```

```txt:run
Success	#stdin #stdout 0.02s 27704KB
[1092, 856, 1095]
```
JBoss EAP 6.3.0 GA で MariaDB datasource を設定

[Red Hat JBoss Enterprise Application Platform](https://www.redhat.com/en/technologies/jboss-middleware/application-platform)でMariaDBデータソースが利用できるよう設定してみました。

# テスト環境:

* JBoss EAP : 6.3.0 GA
* [MairaDB Server 10.2.9](https://downloads.mariadb.com/MariaDB/mariadb-10.2.9/yum/rhel/mariadb-10.2.9-rhel-7-x86_64-rpms.tar)
* [MariaDB Connector/J 2.2.0 GA](https://downloads.mariadb.com/Connectors/java/connector-java-2.2.0/mariadb-java-client-2.2.0.jar)

JBoss EAP は Windows PC に、MariaDB Server は仮想マシン上にインストールしました。


# MariaDB Connector/J 2.2.0 のインストール

ドライバー自体は JBoss EAP の modules/org/mariadb/main にコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/1704979a-e08c-8cb9-b5e6-399ebd4d0768.png)

```module.xml:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.mariadb">
  <resources>
    <resource-root path="mariadb-java-client-2.2.0.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
  </dependencies>
</module>
```

# JBoss management console 

http://localhost:9990/console/App.html#datasources

から管理コンソールにアクセス、datasourceを追加しました。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/999c7062-c1ff-c807-4d23-35f18b53d715.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/eba47e1f-b12e-7394-eec8-aaed84299156.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/1f533bbd-682c-d57b-6d1e-e2af5db9ecbb.png)


* Name: MariaDB
* JNDI: java:jboss/datasources/MariaDB
* Driver: mariadb
* Driver Class: org.mariadb.jdbc.Driver
* Connection URL: jdbc:mariadb://mariadb_server:3306/test

JBoss Management Console - Datasources - Connection で
 Test Connection を押下し、テスト接続を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/f86b4bed-f95b-8496-7c55-c95acb5b619b.png)

上記のようなテスト結果となれば問題ありません。
『初めての自動テスト ―Webシステムのための自動テスト基礎』（オライリー）をまとめました

# やったこと

* オライリーから出ている、「初めての自動テスト」の要点をまとめてみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134704/07dd0f84-1518-1ece-b532-6bd1da74e26f.png)

# 本の参考になったところ

* 自動テストでやりがちなアンチパターン
* テストのピラミッド
    * UIテスト
    * 統合テスト
    * ユニットテスト
* 親指の法則
* ユニットテスト VS UIテスト
* 開発者 VS テスター
* UIテストに触れる
* 統合テストを学ぶ
* Webの仕組み
* REST(Representational State Transfer)
* テストのコツ
* モックテスト
* クライアントサイドとサーバーサイドの言語
* 静的型付けと動的型付け
* ピラミッドの型を上る
* テスト初心者のアンチパターン
* テストファースト(TDD)

# 得られた知識

* 「テスト」 = UIテストだと思い込んでいたけど、目的によってすみわけがあるんだなぁと感じた。以下のテストのすみわけがわかるようになった
    * UIテスト
    * 統合テスト
    * ユニットテスト
* 「なるべくUIテストを減らせ！UIテストにのみ頼るのは犬の道！まずはユニットテストから実装しろ！」という理論も新鮮だった（親指の法則）
* テストのアンチパターンを学ぶことができた
* テスト稼働開発を、Ruby on RailsのRSpecのサンプルコードで書いていたので、実際にどうコードを書くかという視点でもとても参考になった

# 参考

まとめの詳細はこちらを参考にしてください。

初めての自動テスト ―Webシステムのための自動テスト基礎の要点をまとめました

https://review-of-my-life.blogspot.jp/2017/11/first-auto-testing.html
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part1-2

Udemyの[こちらのコース](https://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=0ahUKEwjBu4a35bfXAhXQ16QKHfxQCvIQFggyMAE&url=https%3A%2F%2Fwww.udemy.com%2Fruby-on-rails-g%2F&usg=AOvVaw2zf_7hwBdtTsJHjjVy_0-6)を受けながら、疑問に思ったこと、調べた結果、大事なことをまとめていきます。

#part1-2 Bootstrapの導入
##Rails bootstrap sassとググってみる。
bootstrapはいいとして、sassについて軽く調べてみた。cssのすごいバージョンといった感じ。

[導入するbootstrapのリンクはここ](https://github.com/twbs/bootstrap-sass)

##Gemfileの表記

    gem 'bootstrap-sass', '~> 3.3.7'
    gem 'sass-rails', '>= 3.2'
これをGemfileに書き込めばいいのだが、~>とか=>が気になったのでまとめる。

|バージョン|説明|
|:---|---:|
|x.x.x|バージョンを固定|
|>= x.x.x|x.x.x以上のバージョンが必要|
|>= x.x.x, < y.y.y|x.x.x以上、y.y.y以下のバージョンが必要|
|~> x.0|x.1からx.9は良いが、メインのバージョンがあがるとは不可例えば、3.2は良いが、4.0は不可など|

最後のがややこしい。ニョロニョロが。xの数字は固定ってことだ。

参照[http://railsdoc.com/references/gemfile](http://railsdoc.com/references/gemfile)


#自己課題
 -Railsにbootstrapを導入。
MATLAB > freeBoundary() > 四面体結合物への適用 > 隠面以外の三角形の情報を取得する

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

### 前置き

[MATLAB > freeBoundary()を試してみた > tetmeshを処理してみた > 疑問点](https://qiita.com/7of9/items/2c0d30a618efcdeabb0f)
にてtetmeshに対するfreeBoundary()の結果について不明であった。

### 試したこと

tetmeshのデータからサブセットを作り、それを見てみる。

```matlab
>> load tetmesh
>> tetsub=tet(1:5,:)
>> tetsub

tetsub =

        1092        1093         858         891
        1092         856        1094        1095
        1092        1095         896         856
        1092        1096        1097         891
        1092        1094        1098        1095
>> tetramesh(tetsub,X)
>> % rotate arbitrary by manual
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9256af87-be42-728f-8280-501cf8c5d39a.png)

tetmeshは四面体の結合物であると認識した。
上記の座標例の場合、4つの三角形が隠面になっている (黄色、緑、と薄い青の結合部分）。

### freeBoundary適用

```matlab

>> [tri xf] = freeBoundary(trep)

tri =

     1     7     8
     2     8     7
     2     1     8
     2     7     1
     3     6     4
     2     6     3
     4     9     3
     2     3     9
     2     9     4
     5    10     8
     2     8    10
     2     5     8
     2    10     5
     6    11     4
     2     4    11
     2    11     6


xf =

   -7.3299  -28.4969    8.2244
   -4.5873  -30.5595    8.1954
   -0.9787  -33.7358    5.0000
   -0.6085  -30.3316    6.7757
   -1.9193  -29.6506   11.1787
   -3.3866  -29.3811    2.8471
   -8.5236  -32.6560    5.0000
   -5.5716  -33.2869   10.0000
   -1.9624  -33.6929   10.0000
   -5.2360  -29.7786   13.4800
   -3.6079  -27.8457    6.3998
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9dcb4f64-71d6-a6c2-3a92-83208b6a6c16.png)

- tetsub: 5つの四面体
    - 5 x 4の三角形
    - 4つの三角形が隠面
    - -> 16が「自由境界の小平面」
- tri: 16の三角形

**freeBoundary()の振る舞いとしては「隠面以外の三角形の情報を取得する」なのだろう。**
astah* community6.9で モデル駆動開発m2t(Model to Text)  プラグイン を実行させる

#はじめに
UMLモデリングツール astah* のモデル駆動開発m2t(Model to Text)  プラグイン、
これを自宅のPCで環境（astah* community 6.9(商用利用可)しか入っていない環境）で動作させようとしたときのメモです。
※プラグインの作者のかたは、メールアドレスも公開されていたのですが、ひとまず自分で調査しました。

#調査した状況
astah* community 6.9では、インストールしてメニューは追加されるのですが、ダイアログが立ち上がりません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/59377968-526f-431f-cc4d-469a67f7e884.png)
(↑で、GererateやSettingを選んでも、うんともすんとも言わなかった。)

※ astah* commyniti 7.0以降(商用利用不可)の環境では、普通に動きます。

[m2tのgithub](https://github.com/s-hosoai/astahm2t)から、プラグインプロジェクトをダウンロードして、
[UMLモデリングツールastah*(Community版)でプラグイン開発環境を試してみた（１）](https://qiita.com/azuki8/items/348cf76f8ffec1357c5c)
[UMLモデリングツールastah*(Community版)でプラグイン開発環境を試してみた（2）](https://qiita.com/azuki8/items/73d14587444bd749655b)
で整えた「astah* プラグイン開発環境」上で、
コマンドプロンプトで、`astahm2t-master`フォルダに移動して、
ビルド`astah-build`　および　起動`astah-launch`して、起動しない原因を探ってみました。

#環境
Windows10 Home
64ビット オペレーティングシステム x64ベースプロセッサ
Intel(R) Core(TM) i5-7400 CPU @ 3.00GHz
RAM 8.00GB
astah community 6.9 をインストール済。

#試した手順と結果
##ビルドした結果
astah-api.jar と astah-pro.jar がないと怒られました。

astah-api.jar は、公式ホームページに再配布禁止と書いてあったので、
astahのインストールパスを探したら、ありました。
これは、下記の「変更点1」で対応です。

astah-pro.jarは、今回の開発環境内を探してもありません。
代わりに、astah-community.jar があるのではないかと探したら、astah-api.jarと同じ場所にありました。
これは、下記の「変更点2」で対応です。

##変更点1
環境変数 ASTAH_HOME をPCに追加(astahのインストールパス)。
単に、環境変数不足で、ビルドが通らないだけでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/8b8cb1f0-6d35-f93c-5d47-a395c98bcbcd.png)

##変更点2
xml:astahm2t-master\\pom.xml の一部変更

変更前
　proが2か所ある

```xml:astahm2t-master\pom.xml
		<dependency>
			<groupId>com.change_vision.astah</groupId>
			<artifactId>astah-pro</artifactId>
			<version>${astah.version}</version>
			<systemPath>${ASTAH_HOME}/astah-pro.jar</systemPath>
			<scope>system</scope>
		</dependency>
```

変更後
　communityに置換

```xml:astahm2t-master\pom.xml
		<dependency>
			<groupId>com.change_vision.astah</groupId>
			<artifactId>astah-community</artifactId>
			<version>${astah.version}</version>
			<systemPath>${ASTAH_HOME}/astah-community.jar</systemPath>
			<scope>system</scope>
		</dependency>
```

これで、
ビルド`astah-build`　および　起動`astah-launch`すると、起動するようになりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/59377968-526f-431f-cc4d-469a67f7e884.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/a5837e79-0e4a-b572-59c8-622fff856cb5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197297/e3c4fa98-d33a-1c80-8077-600f0457f9b9.png)

#おわりに
astah community 7.0以降では動作するのに、6.9では動作しないのですが、
作者のかたが悪いわけではないと思いますので、そこのところ、この記事を読み違えないようにお願いします。

別記事「[UMLモデリングツールastah*(Community版)でプラグイン開発環境を試してみた（3）C#コード出力](https://qiita.com/azuki8/items/6aadbe309ba6b004d9af)」で、自前のフルスクラッチC#出力プラグインを書きましたが、m2tなんて使えそうなものがあったのに気づき、これでもC#出力を試してみたいと思います。

引き続き、記事にしてみたいと思います。
filterエフェクトをwebglで実装してみました。

# 概要

インスタとかにある、カメラのフィルターエフェクトをwebglで実装してみました。

<img width="1018" alt="スクリーンショット 2017-11-12 9.05.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/61067314-397b-8bc3-f0b8-179c42b9547b.png">

とりあえずchromeで動作させてみました。

今回の実装にあたっては、MagicCameraというgithubにあるプロジェクトをベースにさせてもらいました。
Sourcemod ［TF2］ゲームモードを判定する方法

#マップのタイプを知りたい

####前置き
ゲームモードごとに違う動作をさせるために今がなんのルールなのかを判定したかった
で、KOTH、PL、PLR、CTFはマップ名で判断が付くが　コントロールポイントと攻撃防衛マップは同じcp_...なのでマップ名からの判断ができない。

まぁ、ゲームモード格納されてるデータあるでしょ？って思って探したが使い物にならないものばかり(cp_...マップだと同じ値が出てしまう)

####本題
俺がちゃんと探してないだけかもしれんけど、見つからなかったので他の方法を考えました
その方法は
>1.マップ名に"cp_"が含まれている
>2.コントロールポイントがある
>3.コントロールポイントはすべて赤チームの所属である

といった流れです、当然ながらマップ開始直後に判定しないとだめです（青チームが占領するから）

ソースコード

```cpp:sourcemod.sp
public int GetMapType()
{
	//マップの名前を取得
	GetCurrentMap(MapName,255);
	//...に「PL」が含まれる
	if(StrContains(MapName,"pl_",false) != -1)
	{
		return 0;
	}
	//...に「KOTH」が含まれる ...に「event」が含まれない
	if(StrContains(MapName,"koth_",false) != -1 && StrContains(MapName,"event",false) == -1 )
	{
		return 1;
	}
	//...に「KOTH」が含まれる
	if(StrContains(MapName,"koth_",false) != -1)
	{
		return 2;
	}
	//...に「CP」が含まれる
	if(StrContains(MapName,"cp_",false) != -1)
	{
		new iTeam;
		new iEnt = -1;
		//CPを検索
		while ((iEnt = FindEntityByClassname(iEnt, "team_control_point")) != -1)
		{
			//見つかったらそれが青チームか検証
			iTeam = GetEntProp(iEnt, Prop_Send, "m_iTeamNum");
			if (iTeam != 2)
			{
				return 3;//青チームのCPが見つかったのでこれは普通のCP
			}
		}
		return 4;//すべて赤チームのCPだったら攻撃/防衛マップである
	}
		//...に「ctf」が含まれる
	if(StrContains(MapName,"ctf_",false) != -1)
	{
		return 5;
	}
	//...に「plr」が含まれる
	if(StrContains(MapName,"plr_",false) != -1)
	{
		return 6;
	}
	
	return 0;
}
```
これでOK、もっといい方法知ってる人いたら教えてください

もしSourcemodに興味を持ったら、ぜひwikiを[訪れて](https://www.sourcemod.net/)みてくださいね
日本人MOD作者が指で数えられるほどしかいないので...
MATLAB > 四面体メッシュプロット > tetramesh() | view(30,30) | サブセット表示 tetramesh(tet(2:3,:),X)

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

https://jp.mathworks.com/help/matlab/ref/tetramesh.html

tetramesh()というAPIにて四面体を表示できるようだ。
以下の構文を使ってみる。

> tetramesh(T,X)

```matlab
>> load tetmesh
>> tetramesh(tet,X)
>> 
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f93d87e0-ffd1-7c6e-fccb-aa21f7fc83b8.png)

三角形に分割された上で表示される。

３次元回転ツールを使って方向を変えた後で、以下で最初の表示の方向に戻せる。

```matlab
>> view(30, 30)
```

### サブセットの表示

サブセットを表示するには以下の方法もできる。

```matlat
>> load tetmesh
>> tetramesh(tet(2:3,:),X)
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9191e73e-9222-567b-a107-2e09ff6bed95.png)
Udemyのコース「【作りながら覚える！】 Ruby on Rails を用いたウェブ開発(Airbnbを作ろう！) 」を学ぶ。part1-1

このコースで困ったことや、メモ書きを淡々としていきます。

#part1-1 初めてのコントローラーを作成。

##コントローラーとは何か？
railsはMVC Model View Controllerでできている。Controllerでは、ブラウザからデータを受け取り、ModelやViewへの橋渡し役、そしてブラウザへのデータの返答も行うといったイメージ。

##作成方法

    rails g controller コントローラー名

これを行うと、app/controllersフォルダに「コントローラ名_controller.rb」ができる。またapp/view/コントローラー名 フォルダが作成される。

ちなみに、コントローラーは複数形で命名される。それに対応するモデルは単数形になるようだ。

##actionも作成する方法。
actionとは、コントローラーの中にある関数みたいなもので、actino一つ一つに対してviweファイルが割り当てられる。

    rails g controller コントローラー名 action名

で同時にコントローラーとactionを作成可能。

##例えば・・・
    rails g controller Times cut
というコマンドを行ったら、Timesコントローラーとその中にcut　actionが作成される。

ほんで、URL/Times/cutにアクセスすると、app/view/timesフォルダにあるcut.html.erbが表示される。
これは、routes.rbを見れば確認可能だ。

    get 'times/cut'
という記述があるはず。

#自己課題
Task
- pagesコントローラーとその中にindexアクションを作成せよ。
- サーバーを起動し、indexアクションを起動させよ。
- 表示の流れを追って。
MATLAB > freeBoundary() > 四角形をfreeBoundaryしてみる > 2つでなく4つの三角形のインデックスが得られる

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

### 関連

[MATLAB > freeBoundary()を試してみた > tetmeshを処理してみた](https://qiita.com/7of9/items/2c0d30a618efcdeabb0f)

### 調査内容 > 正面の四角形

単純な四角形に関して、freeBoundary()を適用してみた。
X3の座標は左上から時計回り。

```matlab
>> X3 = [0 0 0; 1 0 0; 1 1 0; 0 1 0;]

X3 =

     0     0     0
     1     0     0
     1     1     0
     0     1     0

>> tet3 = [1 2 3 4]

tet3 =

     1     2     3     4
>> trep=TriRep(tet3,X3)

trep = 

  TriRep のプロパティ:

                X: [4×3 double]
    Triangulation: [1 2 3 4]

>> [tri3 xf3] = freeBoundary(trep)

tri3 =

     1     3     4
     2     4     3
     2     1     4
     2     3     1


xf3 =

     1     0     0
     0     0     0
     1     1     0
     0     1     0
```

２つの三角形ではなく、(LB,RB,LT,RT)という4つの三角形のインデックスがtri3に得られる。
(ここでL:Left, R:Right, B:Bottom, T:Top)。

領域は重なっている部分がある。

### 調査内容 > 正面の四角形 + 上面の四角形

正面に加えて、上面の四角形も足してみた。

```matlab
>> X4 = [0 0 0; 1 0 0; 1 1 0; 0 1 0; 0 0 1; 1 0 1;];
>> tet4 = [1 2 3 4; 1 2 6 5];
>> trep = TriRep(tet4, X4)

trep = 

  TriRep のプロパティ:

                X: [6×3 double]
    Triangulation: [2×4 double]

>> [tri4 xf4] = freeBoundary(trep)

tri4 =

     1     3     4
     2     4     3
     2     1     4
     2     3     1
     1     5     6
     2     6     5
     2     1     6
     2     5     1


xf4 =

     1     0     0
     0     0     0
     1     1     0
     0     1     0
     1     0     1
     0     0     1
```

2つの四角形から8つの三角形(tri4)が生成される。
VagrantにSparkをインストールする


## Java1.8のインストール
※ 1.9だとSpark2.2.0でエラーになる
## Sparkをダウンロード

[Download Apache Spark](https://spark.apache.org/downloads.html)

下記ページからWgetするURLを選択する
[spark2.2.0 hadoop2.7](https://www.apache.org/dyn/closer.lua/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz)


```bash
cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache/spark/spark-2.2.0/spark-2.2.0-bin-hadoop2.7.tgz
tar zxvf spark-2.2.0-bin-hadoop2.7.tgz
cp spark-2.2.0-bin-hadoop2.7 /usr/local/spark2.2
```
## Hadoopをダウンロード

### hadoop ユーザー作成

```bash
groupadd hadoop
useradd -d /home/hadoop -g hadoop -m hadoop
passwd hadoop
```

### Hadoop をダウンロード
[2.7.4をダウンロード](http://hadoop.apache.org/releases.html#Download)

```bash
cd /usr/local/src/
wget http://ftp.jaist.ac.jp/pub/apache/hadoop/common/hadoop-2.7.4/hadoop-2.7.4.tar.gz
tar zxvf hadoop-2.7.4.tar.gz
chown -R hadoop. /usr/local/src/hadoop-2.7.4
mv /usr/local/src/hadoop-2.7.4 /usr/local/hadoop
```
※/vagrant直下で権限変更出来ない為 /usr/local/srcなどの適当なディレクトリで権限変更を行う

### Hadoopの設定
/usr/local/hadoop/etc/hadoop/core-site.xml

```xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
```

## 環境変数設定
```bash
vi /home/hadoop/.bash_profile
```

```bash
export SPARK_HOME=/usr/local/spark2.2
export JAVA_HOME=/usr/java/jdk1.8.0_151
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/bin
export SPARK_LOCAL_IP=192.168.33.11
```

## VagrantFile

追記

```bash
  config.vm.network "private_network", ip: "192.168.33.11"
  config.vm.hostname = "localhost"
```


## Windows環境 hosts編集
C:\Windows\System32\drivers\etc\hosts
追記

```
192.168.33.11 localhost
```

## vagrant 再起動

## hadoopユーザーでSpark実行

``` 
su hadoop
cd $SPARK_HOME
bin/spark-shell
```
【聴講メモ】IoT 時代を生き抜くエンジニアに必要な技術とは ～Developers Festa Sapporo 2017より

2017年11月10日(金)に開催されたDevelopers Festa Sapporo 2017を聴講してきました。

3コマほど聴講してきましたが、こちらが一番引き寄せられましたかね。

#**IoT 時代を生き抜くエンジニアに必要な技術とは**
松下　享平(株式会社ソラコム)

---

大きく分けて以下の3テーマについてのお話でしたが、時間配分としては6:3:1ぐらいでしたかね。
表題が最後の5分ぐらいでした( ﾟ∀ﾟ)･∵. ｶﾞﾊｯ!! 

##**１．なぜ今IoTなのか？**

約15年前に登場した、鉄道会社の自動改札機の仕組みを現在に置き換えての説明でした。

自動改札機(**すごいモノ**)に通したデータを
ネットワーク回線(**すごいネットワーク**)を経由して
データセンター(**すごいデータセンター**)に送る

15年前だとすごすぎて(というか一部利権に囲い込まれてと言った方が適切かも)我々のような一般庶民には手が届かなかったものが民主化されて手が届く範囲に来ている。

####▼すごいデータセンター→**民主化されたクラウド**

・必要な時に
・必要なだけ
・誰でも使える

☆IoTとビジネス的な相性がいい

####▼すごいモノ→**民主化されたモノづくりの道具**

・プロトタイピングが容易に
　- Arduino
　- Raspberry Pi

・3Dプリンタによるデジタル・ファブリケーション
　デジタル・ファブリケーションとはデジタルデータからモノを創る技術のこと。
　航空機のエンジン部品も3Dプリンタから作られているらしいです...
　[航空機エンジン部品はもはや3Dプリンターなしでは作れない！](https://newswitch.jp/p/8923)
　課題としては時間がやたらかかることらしく、例えばラズパイぐらいの大きさで数時間らしい。

####▼すごいネットワーク→**民主化された無線通信ネットワーク**
　・現在の通信ネットワークの課題→接続方法、セキュリティ通信の管理
　・無料で使えるwi-fiは増えてきているがセキュリティ的に緩かったり、人手での認証が前提だったり
　・3G/4G/LTEはキャリア経由が前提(高い、2年縛り...)

　**それを解決するのが SORACOM Air です(｀∀´)ﾄﾞﾔｯ**

　ようやくここでSORACOMの話題が出てきました...
　が、ご本人曰く、「自分あまり楽しく話してませんね(苦笑)」　
　少なくても(｀∀´)ﾄﾞﾔｯ顔はしてませんでしたｗ

　SORACOM Air、詳しくは公式に書いておりますが、一言で言うとIoT通信プラットフォームですね。
　[今すぐ始められる IoT 通信プラットフォーム SORACOM]()
　従来の回線よりは低速ですが、その分安く気軽に利用できるのが強み(1日10円1回線～ + 通信料)
　SIMを購入して、通信するIoT機器に挿すというのが基本的な利用手順、ここら辺は携帯電話と同じですね。
　コンソールやAPIによるSIMの制御(通信速度、休止/再開、監視)が行える。

**異業種からのハードウェア参入**

　ハードウェアはサービスの部品の一つとなっており、
　ハードウェアの価値は(見かけ上)限りなくゼロへ
　しかし本質は、
　<font color=red>**ハードウェアは囲い込みに最適な入口になっている**</font>
　(だからこそ、こぞって異業種から参入してくる)

**お客様事例の紹介**
　- AGC旭硝子：ウェアラブル型ロガーで工場の作業動態を分析・可視化
　- 大阪ガス：簡易データ計測サービス「ekul(イークル)」
　- 積水科学：下水熱利用システム
　- チカク：[まごチャンネル](https://www.mago-ch.com/)

 ・ポイント
　　- いかに作らないか
　　　→すでにある製品、サービスを組み合わせて使う
　　- 今あるものからどうやってデータを取るか
　　　→今使っているレガシーな機器を置き換えるのではなく、そこからデータを取る手段を考える

　・IoT技術の活用指針
　　目的：作業の改善、運用の省力化
　　成果：費用削減

　　目的：新たな価値総主値
　　成果：収益増加

##**２．IoTの基本要素とスキルマップ**

・必要なスキル幅が広い
　- センサー／デバイス("モノ")
　- ネットワーク
　- アプリケーション

・ハードウェア制約志向 vs 生産性志向
　- ハード資源の制約でアセンブラetc...
　- イテレーションサイクルの違い(24週 vs 1～2週)

・新規のIoTシステム構築
　- デバイス数、データ量が予測しづらい
　- 直接収益に結びつかない実装がある(主にセキュリティ周り)
　　→[SORACOM Funnel](https://soracom.jp/services/funnel/)でそこを補える

・デバイスのクラウドファースト化
　利用者はデバイスの機能だと思ってたら、実はその機能はクラウド下で動いているというお話し。
　[POCKETALK（ポケトーク） | ソースネクスト企業サイト](http://sourcenext.co.jp/pressrelease_html/JS/2017/2017102301/)
　　SORACOM AirのSIMが内蔵されており、クラウド上の翻訳エンジンがその機能を担っている。
　[Amazon Dash Button 通販 | Amazon](https://www.amazon.co.jp/Amazon-Dash-Button-%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5-%E3%83%9C%E3%82%BF%E3%83%B3/b?ie=UTF8&node=4752863051)
　　SORACOM Airとは無関係ですが、これも仕組みは同じですね

##**３．IoT 時代を生き抜くエンジニアに必要な技術とは**

**手を動かして様々なコンポーネントやサービスを知ること**
↓
**可能なことと課題を見極められること**
↓
**得意な実装パターンを編み出すこと**

上記を繰り返していくことが大事だそうです。
これを言っては身も蓋もないんですが、、、まあ地道に試行錯誤(トライアンドエラー)して頑張れやってことですねｗ

以上
MATLAB > ; を最後につけない > 変数の内容が表示される

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

```matlab
>> x = [1 2 3; 4 5 6]

x =

     1     2     3
     4     5     6

>> x = [1 2 3; 4 5 6];
>> 
```

最後に`;`をつけない場合は、変数の内容が表示されるようだ。

`;`をつけることで、出力を抑制できる、とも捉えられる。