OmniAICreator/Qiita-1.07M huggingface dataset:
sk-learnによるアンサンブル学習の実装

## アンサンブル学習について
http://segafreder.hatenablog.com/entry/2016/05/24/235822

### Kaggle ensembling guide
https://mlwave.com/kaggle-ensembling-guide/
https://github.com/MLWave/Kaggle-Ensemble-Guide


## 交差検証
上記のように、２つ目のモデルの学習データに、１つ目のベースモデルの予測が使用される。
しかし、全ての学習・テストデータを一度に使ってしまうと、
テストデータを見たモデルを利用するので、次のモデルでオーバーフィットするリスクがある。
そのため、交差検証を行う。

### 交差検証の流れ
- データを $k$ 個のブロックに分割する。
- $i$ 番目のブロックをテストデータ、それ以外の$k - 1$個をトレーニングデータとして学習を行う。
- 得られた $k$ 個の精度の平均値をモデルの評価値とする。

### 実装
```python
from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
# 単純な交差検証の方法
kfold = KFold(n_splits=3)
print('Cross-validation scores: \n{}'.format(cross_val_score(model, X_test,y_test, cv=kfold)))
# 層化交差検証の方法
stratifiedkfold = StratifiedKFold(n_splits=3)
print('Cross-validation scores: \n{}'.format(cross_val_score(model, X_test,y_test, cv=stratifiedkfold)))
```

## 用いる学習器を用いて、1度目の学習をする。
```python
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.naive_bayes import GaussianNB
from xgboost import XGBClassifier
from sklearn.neighbors import KNeighborsClassifier

clfs = [RandomForestClassifier(),
        ExtraTreesClassifier(),
        GradientBoostingClassifier(),
        KNeighborsClassifier(),
        GaussianNB(),
        XGBClassifier()
       ]
```
clfsに学習器を配列として入れています。

## 作った学習器の配列を使って学習させていく。

```python
from heamy.estimator import Regressor
from heamy.pipeline import ModelsPipeline

pipeline = ModelsPipeline(*clfs)
stack_ds = pipeline.stack(k=10, seed=seed)
```

https://github.com/rushter/heamy/blob/master/heamy/pipeline.py#L104

stack_dsに入っているのは、2回目のメタモデルで用いるデータセット。
# メタモデルを作成する
```python
stacker = Regressor(dataset=stack_ds, estimator=LinearRegression)
results = stacker.predict()
```

# バリデーション
```python
results = stacker.validate(k=10,scorer=mean_absolute_error)
```
elasticsearchのlogstashで同一IDのデータを更新/マージする方法（updateとdoc_as_upsert）

# やりたいこと
logstashを使ってCSV形式でデータをelasticsearchに取り込んでいる。
以下のような取り込みパターンが必要になったので設定した。

- 一度取り込んだデータに対して、同一IDで更新データを取り込む。データのカラム構成は最初の取り込みも更新時も同じ。
- 一度取り込んだデータに対して、同一IDで追加データを取り込む。追加データは、最初のデータとは別のカラムで、そのIDのデータに対してカラム追加になる

https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-action

上記を見ると、取り込んだときの挙動は以下がある

>action
Value type is string
Default value is "index"
Protocol agnostic (i.e. non-http, non-java specific) configs go here Protocol agnostic methods The Elasticsearch action to perform. Valid actions are:

> - index: indexes a document (an event from Logstash).
- delete: deletes a document by id (An id is required for this action)
- create: indexes a document, fails if a document by that id already exists in the index.
- update: updates a document by id. Update has a special case where you can upsert — update a document if not already present. See the upsert option. NOTE: This does not work and is not supported in Elasticsearch 1.x. Please upgrade to ES 2.x or greater to use this feature with Logstash!
- A sprintf style string to change the action based on the content of the event. The value %{[foo]} would use the foo field for the action

# 基本形

CSVを取り込む基本形

- pathでファイル指定。*で日にち毎のファイルとかでも対応
- start_positionは、logstashの起動タイミングでのすでにあるファイルに対して、最初から読み込むかどうか
- tagsは、ifとか使うときの条件に使う。
- fileterのCSVでseparator指定して、カラム名を書くだけなのでとても簡単

```sample.conf
input {
  file {
      path => "/hogepath/hogedata*.csv"
      start_position => "beginning"
      tags => ["hogetype"]
  }
}

filter {
    csv {
        columns => ["hogeid","hogecolumn11","hogecolumn2"]
        separator => ","
    }
}

output {
    elasticsearch {
        hosts => ["hogeserver:9200"]
        index => "hogeindex"
    }
}
```



# すでにあるカラムのデータ更新(更新パターン)
同一IDになるように取り込めばよい。

> Default value is "index"
> 略
> - index: indexes a document (an event from Logstash).

参考
https://discuss.elastic.co/t/topic/48313
https://www.google.com/search?q=logstash+%E5%90%8C%E4%B8%80ID&oq=logstash+%E5%90%8C%E4%B8%80ID&aqs=chrome..69i57.9999j0j7&sourceid=chrome&ie=UTF-8

一意になるIDがデータに含まれているなら、
document_idにそのデータ内のIDを入れる下記だけでよい

```
output {
    elasticsearch {
        hosts => ["testserver:9200"]
        index => "testindex"
        document_id => "%{hogeid}"
    }
}
```

# 別のカラムのデータを追加する（追加パターン）
outputに下記の追加設定が必要
`doc_as_upsert => true`
`action => "update"`
参考
https://discuss.elastic.co/t/elasticsearch/175429/2

```
output {
    elasticsearch {
        hosts => ["testserver:9200"]
        index => "testindex"
        document_id => "%{hogeid}"
        doc_as_upsert => true
        action => "update"
    }
}
```
#苦労
自分の環境では複数のlogstashに分割して、
上記の別カラムの追加パターンをやろうとしたところ、
`doc_as_upsert => true`　`action => "update"`を入れてなかったので、
追加カラムのデータが反映されないと悩んだ。

`doc_as_upsert => true`　`action => "update"`に気づいた後も
片方のlogstashに設定を入れ忘れたりして、追加カラムのデータが消えたりした。

単純にデータが取り込まれていないように見えていたので、
logstashの取り込みで同じID同士が上書きして消しているのに気づくのに時間がかかった。
データベースの中から特定のカラムをSELECTする

このカラム、他にどこのテーブルで使ってたっけ:rolling_eyes:？
と思った時に使えるSQLです。

> select table_name,column_name user_tab_columns
where column_name='検索するカラム名'；

table_name ＝ テーブル名
column_name　＝　カラム名
user_tab_columns　＝　データベースの中にあるカラム



:point_up:使っているDBタイプで少し変わります

Oracle
user_tab_columns

MySQL
information_schema.cloumns
#12 Main.storyboardからUITableViewのdelegate先を指定する1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
`contrl`キーを押しながら`UITableView`を`Second View Controller`へドラッグ・ドロップする．

<img width="346" alt="スクリーンショット 2019-11-22 午前0.10.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/49b5cd36-b3fe-aa9c-526a-c7b6bf54dd09.png">



##part2
`dataSource`と`delegate`を選択する．
ただし，1度に2つ選択できない．

<img width="349" alt="スクリーンショット 2019-11-22 午前0.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/6542e828-afb9-529f-9866-2b1ef71f90c9.png">



##part3
`Second View Controller`を右クリックして下の赤枠のようになっていればOK．

<img width="315" alt="スクリーンショット 2019-11-22 午前0.12.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/c78b7732-587b-0bc0-c396-d297503b7d51.png">



##part4
後は`Second View Controller`クラスにデリゲートを批准させ，必要なメソッドを書くだけ．
Vue.js + Quasarで爆速プロトタイピング（２）〜Toolbar編〜

# 1.概要
Vue.js + Quasar Frameworkでプロトタイプ作成を行うことがあったので、メモがてら記録しておきます。

前回の記事 -> [Vue.js + Quasarで爆速プロトタイピング（１）〜Hello World編〜](https://qiita.com/tsumasakky/items/ff8ec248ba45311fc4fc)

今回はヘッダーナビゲーションを作成します。

# 2.コーディング
## 2-1.フォルダ構成

/vue-sample
　├ css/
　│　└ style.css
　├ pages/
　│　└ main.html
　└ app.js

# 2-2.main.html

```html:main.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <link rel="shortcut icon" type="image/x-icon" href="../../favicon.ico" />
    <title>Vue.js + Quasarで爆速プロトタイピング</title>
    <link
      href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons"
      rel="stylesheet"
      type="text/css"
    />
    <link href="https://cdn.jsdelivr.net/npm/animate.css@^3.5.2/animate.min.css" rel="stylesheet" />
    <link
      href="https://cdn.jsdelivr.net/npm/quasar-framework@0.17.20/dist/umd/quasar.mat.min.css"
      rel="stylesheet"
      type="text/css"
    />

    <link rel="stylesheet" type="text/css" href="../css/style.css" />
  </head>

  <body>
    <script src="https://cdn.jsdelivr.net/npm/vue@latest/dist/vue.min.js"></script>

    <div id="app">
      <q-layout id="main">

<!-- 今回追加 START -->
        <q-layout-header>
          <q-toolbar color="secondary">
            <q-btn flat round dense icon="menu"></q-btn>

            <q-toolbar-title>
              {{ title }}
            </q-toolbar-title>
          </q-toolbar>
        </q-layout-header>
<!-- 今回追加 END -->

        <q-page-container>
          <div class="page">
            <q-input stack-label="greet" v-model="greet"></q-input>
          </div>
        </q-page-container>
      </q-layout>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/quasar-framework@0.17.20/dist/umd/quasar.ie.polyfills.umd.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar-framework@0.17.20/dist/umd/quasar.mat.umd.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/quasar-framework@0.17.20/dist/umd/i18n.ja.umd.min.js"></script>

    <script src="../app.js"></script>
  </body>
</html>
````

# 2-3.app.js

```js:app.js
// Quasar
Vue.use(Quasar);

var app = new Vue({
  el: "#app",
  data: function() {
    return {
      title: "Vue.js + Quasarで爆速プロトタイピング", // <- 今回追加
      greet: "Hello World!"
    }
  }
});

app.$mount("#app");
```

# 2-4.説明

Quasarではヘッダーナビゲーションのことを「Toolbar」と言います。
https://v0-17.quasar-framework.org/components/toolbar.html

ナビゲーションの左のハンバーガーアイコンは後々サイドメニューを実装する関係で配置しています。

app.jsに実装した`title`というプロパティは文字通りヘッダーナビゲーションのタイトルを表しています。

template内では`{{ title }}`とすることでマウントされたVueインスタンスのdataに記述したプロパティ`title`がバインドされます。

# 3.完成！

あっさりお洒落なヘッダーナビゲーションが表示されました！
次回はヘッダーと連携したサイドメニューを作っていきます！

読んでいただき、ありがとうございました！

次回 -> [Vue.js + Quasarで爆速プロトタイピング（３）〜Side Drawer編〜](https://qiita.com/tsumasakky/items/9b8800870d88270662a9)

<img width="1440" alt="スクリーンショット 2019-11-22 0.12.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147118/c93d03ab-1b49-c31b-1ddc-85ee4c193d44.png">
動画再生時間を表示してみた(OpenCV:Python版)

# きっかけ
とあることをしたいが為に、前の前の前の段階での処理として動画再生時間を表示してみました。

# 開発

```Python
import cv2
import numpy as np

if __name__ == '__main__':

	cap = cv2.VideoCapture('one_minutes.mp4')

	cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
	cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
	fps = cap.get(cv2.CAP_PROP_FPS)

	telop_height = 50

	fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
	writer = cv2.VideoWriter('telop_time.mp4',fourcc, fps, (cap_width, cap_height + telop_height))

	count = 0
	try :
		while True:
			if not cap.isOpened():
				break

			if cv2.waitKey(1) & 0xFF == ord('q'):
				break

			ret, frame = cap.read()

			if frame is None:
				break

			telop = np.zeros((telop_height, cap_width, 3), np.uint8)
			telop[:] = tuple((128,128,128))

			images = [frame, telop]

			frame = np.concatenate(images, axis=0)
			font = cv2.FONT_HERSHEY_SIMPLEX
			cv2.putText(frame, "{:.4f} [sec]".format(round(count/fps, 4)), 
						(cap_width - 250, cap_height + telop_height - 10), 
						font, 
						1, 
						(0, 0, 255), 
						2, 
						cv2.LINE_AA)
			writer.write(frame)
			count += 1

	except cv2.error as e:
		print(e)	

	writer.release()
	cap.release()

```

## 補足

```Python
telop = np.zeros((telop_height, cap_width, 3), np.uint8)
telop[:] = tuple((128,128,128))
images = [frame, telop]
frame = np.concatenate(images, axis=0)
```

ここで下に文字を表示するスペースを作成しています。 `telop = np.zeros((telop_height, cap_width, 3), np.uint8)　telop[:] = tuple((128,128,128))` で単一色で塗り潰した画像を作成して、 `images = [frame, telop] frame = np.concatenate(images, axis=0)` では `numpy` を使って垂直に画像合成しています。


# 結果
![output_telop_time.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/52b030c3-b0b0-2bec-018b-6fcd818b573b.gif)

# おわりに
`cv2.putText` は日本語に対応していません。
もし表示したい場合はgithubで凸するか、Pillowを使うしかなさそうです。
issueで検索してみると、[freetype](https://github.com/opencv/opencv_contrib/tree/master/modules/freetype)モジュールが使えそうですがC++のみです:weary:

# 参考にしたリンク
- [Pythonでの画像の連結](https://blog.imind.jp/entry/2019/01/15/005935)
- [画像にテキストを書き加える](http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_gui/py_drawing_functions/py_drawing_functions.html#id8)
JavaScript(ES6)で二次元配列から連想配列への変換を行う

ちょっと調べるのに時間がかかったのでメモ。


```javascript
var array = [["foo", 1], ["bar", 2]];
var obj = new Object;

for (i = 0; array[i]; i++) {
  var k = array[i][0];
  var v = array[i][1];
  obj[k] = v;
}

console.log(obj);
```

こんな感じの古い処理をES6の記法を使って書き直すことがあった。

---

stackoverflowにも同じような質問があって、以下の回答が一番参考になった。
(他の回答も勉強になった)

https://stackoverflow.com/questions/4215737/convert-array-to-object#comment70292559_4215753

**19/11/25追記: コメントをもとに更新しました。@shiracamus さんありがとうございます。**

```javascript
const array = [["foo", 1], ["bar", 2]];
const obj = array.reduce((obj, [key, value]) => Object.assign(obj, {[key]: value}), {});

console.log(obj);
// => { foo: 1, bar: 2 }
```


<details><summary>古いコード</summary><div>

```javascript
const array = [["foo", 1], ["bar", 2]];
const obj = array.reduce((obj, e) => {
  Object.assign(obj, {[e[0]]: e[1]});
  return obj;
}, {});

console.log(obj);
// => { foo: 1, bar: 2}
```
</div></details>

---

記事中ではスプレッド演算子を利用していて, `Object.assign`より簡潔に記述できる。

```javascript
const obj = array.reduce((obj, [key, value]) => ({...obj, [key]: value}), {});
```

ただ, オブジェクトに対するスプレッド演算子は一部標準化されてないブラウザがあるみたいなので, 今回は`Object.assign`を利用した。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax

---

**2019/11/25追記: @htsign さんありがとうございます。**

もっと簡潔に記述できる`Object.fromEntries`というものもある。
こちらもまだ標準化されていないようなので今回は見送り。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries

```javascript
const obj = Object.fromEntries([["foo", 1], ["bar", 2]]);
console.log(obj);
// => { foo: 1, bar: 2 }
```


---

ES6は使い始めたばかりだけど結構面白い書き方ができて良い。
でも可読性はちょっと下がる気もする。難しい。
年末まで毎日webサイトを作り続ける大学生 〜34日目 ナビバー ロゴとメニューを分けるシンプルな書き方〜

##はじめに
こんにちは！@70days_jsです。

今日はロゴとメニューが別れているシンプルなナビバーを作成しました。

今日は34日目。(2019/11/21)
よろしくお願いします。

##サイトURL
https://sin2cos21.github.io/day34.html

##やったこと
こんな感じのナビバーをシンプルに作りました。↓

![スクリーンショット 2019-11-21 23.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/a16c1b30-ed4d-5cbd-93de-722b3a900d6c.png)

以前もナビバーを作りましたが、それは横に均等に並ぶタイプのものでした。
今回はナビだけ左端に寄せて、メニューは右側にあるものです。

htmlはこんな感じです。↓

```html
            <div class="header-more-than-751px">
                <div class="header-menu"><a href="" class="header-logo"></a></div>
                <div class="header-menu"><a href="">メニュー1</a></div>
                <div class="header-menu"><a href="">メニュー2</a></div>
                <div class="header-menu"><a href="">メニュー3</a></div>
                <div class="header-menu"><a href="">メニュー4</a></div>
            </div>
```

ロゴもメニューも1つのdivに入れています。

cssはこんな感じです。↓

```css
 .header-more-than-751px {
        display: flex;
        justify-content: flex-end;
        width: 100vw;
        height: 50px;
}

.header-menu {
    margin-right: 5%;
    line-height: 50px;
}

.header-menu:first-of-type {
    margin-right: auto;
    margin-left: 5%;
}

.header-logo {
    display: inline-block;
    height: 50px;
    width: 50px;
    background-image: url("day34-logo2.png");
    background-size: cover;
}
```
大枠はflexboxflex-endを指定しているので右に寄っています。
ポイントはheader-menu:first-of-typeのこの一行です。↓

>     margin-right: auto;

これで最初の要素だけ右側に寄るようになります。


##感想
とてもシンプルなものですが満足感は高いです。
実際にサイト制作で使うものを今後も積極的に作っていこうと思います。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。
Google Apps の API を使用せずに数値表記の列番号をアルファベットによる列番号へ変換する方法

Google スプレッドシートにおける「数値列番号→アルファベット列番号」変換についてのメモ書き。

数値表記の列番号をアルファベットによる列番号に変換する方法として、 Excel と同じくセルの座標から行番号を取り除く方法がある ( list1.gas ) 。
しかしこの方法は API を使用するため、大量に変換を行う場合にボトルネックになってしまう。

```js:list1.gas
function convertAlphabetColumnToNumeric(num) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var result = sheet.getRange(1, num).getA1Notation().replace(/\d/,'');
  
  return result;
}
```

したがって、 API を使用せずにこれらの変換処理を行えることが望ましい。

『[数値と、Excel の列番号風のアルファベット表記の相互変換 in JavaScript - penultの日記](https://penult.hatenablog.com/entry/20110329/1301410546)』に API を経由せずに直接変換するコードがあったため、ここにメモしておく ( list2.gas ) 。

```js:list2.gas
var ExcelUtils = (function() {
  const RADIX = 26; //アルファベットの文字数
  const A = 'A'.charCodeAt(0);

  return {
    /**
     * アルファベット表記の列番号を、始まりを1とした数字にる列番号に変換する。
     * @param {string} str
     * @return {number} 
     */
    convertAlphabetColumnToNumeric: function(str) {
      var s = str.toUpperCase();
      var n = 0;
      for (var i = 0, len = s.length; i < len; i++) {
        n = (n * RADIX) + (s.charCodeAt(i) - A + 1);
      }
      return n;
    },

    /**
     * 始まりを1とした数字にる列番号を、アルファベット表記の列番号に変換する。
     * @param {number} num
     * @return {string} 
     */
    convertNumericColumnToAlphabet: function(num) {
      var n = num;
      var s = "";
      while (n >= 1) {
        n--;
        s = String.fromCharCode(A + (n % RADIX)) + s;
        n = Math.floor(n / RADIX);
      }
      return s;
    }
  };
})();
```

以下のようにして使う。

```js:testcode.gas
function test() {
  Logger.log(ExcelUtils.convertAlphabetColumnToNumeric("A"));   // => 1
  Logger.log(ExcelUtils.convertAlphabetColumnToNumeric("Z"));   // => 26
  Logger.log(ExcelUtils.convertAlphabetColumnToNumeric("AA"));  // => 27
  Logger.log(ExcelUtils.convertAlphabetColumnToNumeric("ZZ"));  // => 702
  Logger.log(ExcelUtils.convertAlphabetColumnToNumeric("AAA")); // => 703
  Logger.log(ExcelUtils.convertNumericColumnToAlphabet(1));      // => "A"
  Logger.log(ExcelUtils.convertNumericColumnToAlphabet(26));     // => "Z"
  Logger.log(ExcelUtils.convertNumericColumnToAlphabet(27));     // => "AA"
  Logger.log(ExcelUtils.convertNumericColumnToAlphabet(702));    // => "ZZ"
  Logger.log(ExcelUtils.convertNumericColumnToAlphabet(703));    // => "AAA"
}
```
unix domain socketよりもlocal宛のtcp socketの方が速い？

[元ネタ](https://www.mathkuro.com/?p=270)


以前、UNIXソケットとTCPソケットの性能比較を行ったところ、以下のような結果になりました。

|送信データ[GB]|tcpソケット  |unixドメインソケット  |
|---|---|---|
|1|1.0  |1.33  |
|4|1.56  |2.17  |
|16|4.20  |6.91  |
※各10回測定

今までUNIXドメインの方が速いと思っていたのでループバックアドレス(127.0.0.1)宛のTCPソケットの方が速くてびっくりです。

UNIXドメインソケットってただのmemcopyだと思ってたんですけどね。
謎。
【React】sftpでuploadしてもwebpack-dev-serverで監視させる方法

# webpackはsftp監視しない問題
sftpでuploadしたものはwebpackは監視しないらしい。
reactでdevelop server立てている場合は自動更新をしなくなってしまう。

## いつ使うか
vagrant等でディレクトリをマウントしている場合も同様に更新しなくなってしまう。
しかしwatchOptionsを変更することで定期更新をすることになる。

## 更新箇所
Reactの場合は次のファイルを更新すればOK。
`node_modules > react-scripts > config > webpackDevServer.config.js`

```javascript
    watchOptions: {
      ignored: ignoredFiles(paths.appSrc),
      poll: 500,  //←ここを追加
    },
```
#11 Xcodeで画像を貼り付ける1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
Xcodeで`Image View`と検索して，Viewに乗せる．

<img width="675" alt="スクリーンショット 2019-11-21 午後11.04.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/589e12f6-fb7a-f435-e97c-9a797cb47958.png">



##part2
必要な制約を付ける．
Width=120，Height=120，センターに配置．

<img width="375" alt="スクリーンショット 2019-11-21 午後11.06.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/9a39eba5-efe9-911d-88cc-c59c92383976.png">



##part3
Xcodeで`Assets.xcassets`に画像をドラッグ・ドロップ

<img width="1180" alt="スクリーンショット 2019-11-21 午後11.07.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/bc472a83-fe66-0b32-6398-5b166e4b5d3f.png">



##part4
UIImageViewを選択した状態で，`Attributes inspector`の`Image`を先ほど`Assets.xcassets`にドラッグ・ドロップした画像を選択する．

<img width="258" alt="スクリーンショット 2019-11-21 午後11.07.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/1158beb4-2472-b1ec-90fb-9eaae5552e43.png">



##part5
UIImageViewを選択した状態で，`Attributes inspector`の`Alpha`も任意に設定する．

<img width="257" alt="スクリーンショット 2019-11-21 午後11.08.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/b2511229-6f45-8620-9f70-18043d55919e.png">



##part6
ビルドして画像が表示されたらOK．

<img width="370" alt="スクリーンショット 2019-11-21 午後11.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/36729a0b-33fb-e844-7220-a7529fc3773f.png">
MyBatisのforeachエラーに悩まされた

# MyBatisのforeachでハマった件

MyBatisの`<foreach>`を利用して、複数データのバルクINSERTしようと思ったのですが 
何故かこんなエラーが発生。
MyBatisのバージョンは3.2です。

```
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [addItems, param1]
```

# 実装

```ItemMasterMapper.java
void addItems(@Param("addItems") List<Item> addItems);
```

```ItemMasterMapper.xml
<insert id="addItems">
INSERT INTO item_master(name, price, option) VALUES
<foreach item="item" collection="addItems" separator=",">
    (#{item.name}, #{item.price}, #{item.option})
</foreach>
</insert>
```

```Item.java
public class Item {
    private String name;
    private long price;

// ～～～以下setterやgetterは省略～～～
}
```

この程度のものがなんで？？エラーの内容的に、`@Param`で指定したパラメーター名のtypoなのか？ 
それとも使っているMyBatisが古すぎて、バルクインサートに対応していないのか？
とひたすらエラーメッセージをググって探しました。

# 原因

よく見てみると、`Item`クラスに`option`が定義されていません。

```Item.java
public class Item {
    private String name;
    private long price;
    // ↓　これが抜けていた
    private String option;

// ～～～以下setterやgetterは省略～～～
}
```

Mapper XMLに記載した変数名と、実際のモデルクラスのメンバ変数の不一致が
`<foreach>`タグの内部で起きていたことで
`'__frch_item_0' not found`なんていうエラーが発生してしまったようです。
なぜここで、突然`item`の存在が無かったことになるのか・・・・
そこは普通に`optionがないよ`って教えてくれたらいいのに・・・
僕の1時間半返して・・・・
STM32マイコンではじめる組込みAI を受講したよ! ET&IOT 2019 STマイクロエレクトロニクス（2019年11月21日実施）

ET ＆ IoT Technology2019内においてSTマイクロエレクトロニクスのプライベートカンファレンス
STM32マイコンではじめる組込みAIが実施されました。
これを受講しましたので報告させていただきます。

なお、午前中のGUI設計ツール「TouchGFXDesigner」で組込みシステムのGUI開発を手軽に！は以前受講したものと同じだそうで今回は受けられませんでした。
（STM32マイコン体験セミナー（グラフィック描画編）TouchGFX Designer 2019年5月13日実施）
https://qiita.com/usashirou/items/b51ec6f8a061290d153c

先に紹介しておきますと、現在キャンペーンがあります。
###STM32マイコンではじめる組込みAI開発トレーニング資料ダウンロード･キャンペーン
資料ダウンロードと、製品が当たるそうです。

今回の資料とボードです。
Discovery kit IoT Node（B-L475E-IOT01A）を使用します。（SensorTileじゃないんですよ・・・）
https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/6358718c-e5a5-cff4-016f-e2b37720bdfb.jpeg" alt="" width="600" height="" border="0" />

セミナー内容は以下でした。
##講義（マッテオさん）
###・AIについての学習
マッテオさん
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/11c7cf46-cbfe-21fb-9986-454999cf1ffd.jpeg" alt="" width="800" height="" border="0" />
##実習（塩川さん）
###・AIサンプルプログラムの動作確認
###・データ収集およびニューラル･ネットワークの学習
###・学習済みニューラル･ネットワークの既存アプリケーションへの実装
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/0ffae42b-5fce-7bd1-1a6f-c33707af483e.jpeg" alt="" width="800" height="" border="0" />

実施に当たり、以下インストールが必要です。（*結構大変です）
1. STM32 ST-LINK Utility のインストール
2. IAR 社 EWARM のインストール（30日の期間限定版）
3. STM32CubeMX のインストールおよびセットアップ
STM32CubeL4 のインストール
X-CUBE-AI のインストール
4. Python のインストール
5. 実習プロジェクトファイルのダウンロード
6. スマートフォンアプリ「ST BLE Sensor」のインストール




2時間半でBLE通信でAIデータを取得し、Pythonで学習し、検知させるというものですが
正直、時間が短すぎます。
それと、BLEが繋がらない為に苦戦した人が多数いました。（私もです）
P49の
• ブートローダのダウンロード
• ファームウェアのインストール
ここら辺は特に要注意のようです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f5e947e9-88da-1123-edc3-4bd604c1dcbb.png" alt="" width="600" height="" border="0" />
Windows バッチファイルで変数の中の文字列を置換する

# 目的

- バッチファイルやコマンドプロンプトで変数に格納された文字列を置換する方法を書く。

# 書き方の例

- 変数には任意の文字列が格納されているものとする。
- 下記に変数に格納された文字列を置換して表示する処理を記載する。

```
echo %変数名:置換対象の文字列=置換後の文字列%
```

# より具体的な例

- 変数`string`には文字列「aaabbbccc」が格納される。
- 変数`string`の「aaa」を「bbb」に置換して出力する処理を記載する。

```
REM [変数の定義と値の格納]
set string=aaabbbccc

REM [変数内文字列の置換と出力]
echo %string:aaa=bbb%
>bbbbbbccc
```
二項係数のmod10^9+7

# はじめに
[「1000000007 で割ったあまり」の求め方を総特集！ 〜 逆元から離散対数まで 〜](https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a#5-%E4%BA%8C%E9%A0%85%E4%BF%82%E6%95%B0-ncr)
こちらの資料の **5. 二項係数 nCr** のコードをPythonに書き換えたものになります。
(drkenさんいつもありがとうございます)

# コード
```python
MAX_NUM = 10**6 + 1
MOD = 10**9+7

fac  = [0 for _ in range(MAX_NUM)]
finv = [0 for _ in range(MAX_NUM)]
inv  = [0 for _ in range(MAX_NUM)]

fac[0]  = fac[1] = 1
finv[0] = finv[1] = 1
inv[1] = 1

for i in range(2,MAX_NUM):
    fac[i] = fac[i-1] * i % MOD
    inv[i] = MOD - inv[MOD%i] * (MOD // i) % MOD
    finv[i] = finv[i-1] * inv[i] % MOD

def combinations(n,k):
    if n < k:
        return 0
    if n < 0 or k < 0:
        return 0
    return fac[n] * (finv[k] * finv[n-k] % MOD) % MOD
```
【Python】リストの値を順番に出力する方法

## サンプルコード

(追記: 2019年11月22日 20時15分)
@kaizen_nagoyaさんにコメントでご指摘いただいた方法に修正しました。

```python
l = [1, 2, 3, 4, 5]

print(*l, sep='\n')
# => 1
#    2
#    3
#    4
#    5

```

## 参考

- [【Python】リスト要素を並べて表示する｜東雲あずら｜note](https://note.mu/azura35/n/ndf3194de0a74)
ただlocal環境でjsonファイルを作れば、モックサーバー(Mockup Server)が起動できるアプリを開発しました

## Mockup Serverとは
 プロントエンドとバックエンドを同時に開発する場合、バックエンドのapiとデータ名などが合わない時が多いです。
でもMockup Serverを使用したら、Local環境で簡単にDirectoryとJsonをファイルを作成し、サーバー起動ができます。
作成した物をGitで管理したらフロントエンドとバックエンド開発者が幸せに開発ができます。

## 使用方法
<img src="https://raw.githubusercontent.com/joon610/imageRepo/main/image/mockup-server/process.png" alt="graph">

1. Mockupサーバー化ためのDirectoryを作成。
2. １番から生成したDirectoryの中にindex.json(成功)、error.Json(失敗)を作成。
3. Mockup Server スタート！！

## <a id="indexJson"></a> index.json
``` jsonc
// response json
[
  {
        "id": "1",      //dynamic api key   ex) localhost/bla/:id
        "name": "Sara",
        "age": "13"
    },
    {
        "id": "2",
        "name": "teddy",
        "age": "14"
    }   
]
```

## <a id="settingJson"></a> setting.json
```jsonc
// setting header, cookies, api description etc 
{
    "header": {
        "Content-Type": "application/json; charset=utf-8",
        "Content-Length": "123",
        "ETag": "12345"
    },
    "cookies": [
        {  //cookie1
            "cookiekey": "cookieName",
            "options": {
                "maxAge": 30000
            }
        },
        { //cookie2
            "hello": "hi",
            "options": {
                "maxAge": 10000
            }
        }
    ],
    "dynamicRoute":"hello",      //  ex) localhost/bla/:hello
    "description": "this API is holy shit" // api description

}
```
#### Set Cookies
<img src="https://joon610.github.io/assets/images/mockupServer/headerSetting.png" alt="headerSetting">

#### API Description tooltip
<img src="https://joon610.github.io/assets/images/mockupServer/tooltip.png" width="300" height="300" alt="tooltip">


## <a id="crud"></a>CRUD (Create, Read, Update ,Delete)
``` jsonc
// index.json
[
  {
        "id": "1", 
        "name": "Sara",
        "age": "13"
    },
    {
        "id": "2",
        "name": "teddy",
        "age": "14"
    }   
]
```
## CRUD (Create, Read, Update ,Delete)
## Post, Get
- http://localhost:9000/nice2/test   if you send params object, and then add object in response data  (POST)

```jsonc
//response data
[
    {
      "id": "1", 
      "name": "Sara",
      "age": "13"
    },
    {
      "id": "2",
      "name": "teddy",
      "age": "14"
    }   
]
```
- http://localhost:9000/nice2/test/1

```jsonc
//response data
[
    {
      "id": "1",   
      "name": "Sara",
      "age": "13"
    }
]
```
## Put
- http://localhost:9000/nice2/test/1 
  
```jsonc
//request data
{
  "id": "3", 
  "name": "Sara",
  "age": "13"
}
```

```jsonc
//response data
[
    {
      "id": "3",   
      "name": "Sara",
      "age": "13"
    },
    {
      "id": "2",
      "name": "teddy",
      "age": "14"
    }   
]
```

## Delete
- http://localhost:9000/nice2/test/1

```jsonc
//response data
[
    {
        "id": "2",
        "name": "teddy",
        "age": "14"
    }   
]
```

### DownLoad
- Mac, Windows: 
  - <https://github.com/joon610/mockup-server/releases>
【この１記事で完結】マッチングサービスに必要な法規制をクリアするためキットを公開します！

#マッチングサービス公開に必要な法的ハードル
[こちらの記事](https://note.mu/daikiichikawa/n/n4728d01dfc8a)で１年半ほど運用したマッチングサービスをクローズした記事を公開しましたが、**マッチングサービスは警視庁に届け出が必要**（無許可でリリースし逮捕された事例もあります）だったり、**仕様・運用含め法律の規制に沿った仕組みにする必要**があったりと、開発・リリースする上で経験がないと色々止まってしまう要素が多いです。

一方で**マッチングサービスは市場規模も2019年度時点で約５００億円と比較的大きく**、さらに（主に男性の）**課金率もゲームよりはるかに高い**割には、ユーザー数さえ一定確保すればそれなりに売り上げを確保できるシンプルなビジネスモデルであり、身辺の受託起業やフリーランスの知り合いからも開発案件が多いと聞きます。

そのような背景もありマッチングサービスを開発・リリースする際のノウハウを求められるケースが増えてきたので、マッチングサービスで起業したい！１発当てたい！という方々のために、**開発・リリースする上でここだけ抑えておけば最速でリリース出来るよ！**という点を以下にまとめていきます。


#抑えておくべき点
結論から言うと、以下の３点を抑えておけばOK
####①インターネット異性紹介事業届けを提出し、警視庁の許認可を得る

####②サービス利用者が児童でないことの確認方法を明確化し、仕様・運用に反映する

####③利用規約・プライバシーポリシーを作成する

では、それぞれ内容を説明していきます。

＊[こちらの記事](https://note.mu/daikiichikawa/n/n05a68fc7bd20)に上記の①〜③を実現するため専門家と相談の上作成した各種テンプレート（届出提出チェックリスト、年齢確認証跡テンプレート、利用規約テンプレート）を添付しております。是非ダウンロードしてご活用ください！


#①インターネット異性紹介事業届けを提出し、警視庁の許認可を得る
こちらに関しては、[警視庁の公式ウェブサイト](https://www.keishicho.metro.tokyo.jp/smph/tetsuzuki/other/internet_iseisyokai/kaishi.html)からフォーマットをダウンロード、必要事項を記入し然るべき警察署（*1）の少年課に提出します。この際質疑応答が行われるのですがその内容については②で説明します。

![format.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69560/24dc149c-1beb-b9a1-27d5-640e70e76967.png)
`（*1）の「然るべき警察署」というのは上記のフォーマットをご覧になればわかるかと思いますが、事務所の所在地管轄の警察署です。事務所と聞くと法人のみかと思われる方もいらっしゃるかもしれませんが、個人事業主でも問題ありません。そのため自宅住所も使用可能ですが、警察署の公な書面に記載されるということに留意してください。私はレンタルオフィスを契約しました。`

なお、この届けを提出する際には合わせて以下のドキュメントも提出が求められます。地道に集めましょう。
**・住民票の写し**
**・身分証明書**
**・登記されていないことの証明書**
**・送信元識別符号を使用する権限があることを疎明する資料**（*2）

`（*2）の「送信元識別符号を使用する権限があることを疎明する資料」については「？」って感じかと思いますが、細かな説明はさておき、実際本当にに必要だったものは、利用するAPIやウェブサイトのURLを取得した際にドメイン業者からメールで送付されてくるWHOIS証明やその他ドメイン情報をプリントアウトしたものがあればOKです。`



#②サービス利用者が児童でないことの確認方法を明確化し、仕様・運用に反映する


こちらは①と関連しますが、**インターネット異性紹介事業届を提出する際には質疑応答が行われます**。この質疑応答でメインのトピックとなるのがこの「児童でないことの確認の方法」です。

こちらはネイティブアプリにせよウェブアプリにせよ、基本的には以下の２通りのどちらか、もしくは両方の機能をサービス内に実装することが必須要件となります。

**A）クレジットカード等、児童が通常利用できない方法で料金支払いの同意を得る**

**B）児童でないことの確認が取れた者に対して、識別符号(ID・パスワード)を付与し、以後の利用の際にはこの識別符号の送信を受ける**

個人的にいきなりクレジットカードの登録が求められるサービスに抵抗があるのと、市井を見渡してもまずは無料で使用できる類似サービスが殆どのため、今回私のケースではBを選択しました。届記述方法がやや特殊ですが、不備がある場合は面接官がその場で記述方法を支持してくれるのであまり心配せずとも大丈夫です。

ここで注意すべき点は、**年齢を確認していることを何らかの形で証跡として残し、法律的理由から提出が求められた場合は提出できるよう準備しておく必要がある**ということです。より具体的にいうと、法律で定められている、**年齢確認の際に有効な書類は「免許証」、「健康保険証」の２種類**あるのですが、こちらを確認したという事実を一定のフォーマットで記録しておく必要があるということです。

私の場合はここが内実がわからず悩みどころでしたが、知り合いづてに某大手マッチングサービスではどう管理しているか聞くことができました。そちらを元に証跡記録表を作成し有償でテンプレート化しておりますので、運用面で心配のある方は是非[こちらの記事](https://note.mu/daikiichikawa/n/n05a68fc7bd20)からダウンロードしご活用ください。

#③利用規約・プライバシーポリシーを作成する
続きは[こちらの記事](https://note.mu/daikiichikawa/n/n05a68fc7bd20)をご覧ください！
Spark 2 で spark-shell の起動から RDD の生成まで

/usr/local/spark に spark2 をインストールしている前提として。

##### spark-shell 起動
```bash:spark-shell
$ /usr/local/spark/bin/spark-shell
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1
      /_/
         
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_222)
Type in expressions to have them evaluated.
Type :help for more information.
```

##### バージョン確認
```bash:spark-shell
scala> sc.version
res0: String = 2.1.1
```

##### 配列からRDD生成
```bash:spark-shell
scala> val rdd1 = sc.parallelize(Array("Japan","America","Brazil","China","Jamaica","Japan"))
rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:24

scala> rdd1.collect
res1: Array[String] = Array(Japan, America, Brazil, China, Jamaica, Japan)
```

##### ”J”で始まる国名でフィルターする
```bash:spark-shell
scala> val filterrdd1 = rdd2.filter(s => s.startsWith("J"))
filterrdd1: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at filter at <console>:26

scala> val filterlist = filterrdd1.collect
filterlist: Array[String] = Array(Japan, Jamaica, Japan)

scala> filterlist
res4: Array[String] = Array(Japan, Jamaica, Japan)
```
【Python】リストから重複している値を削除する方法

## サンプルコード

```python
some_list = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]

# setに変換してからlistに変換し直す
uniq_list = list(set(some_list))

print(uniq_list)
# => [1, 2, 3, 4, 5]
```

## 参考

- [Pythonでリスト（配列）から重複した要素を削除・抽出 \| note\.nkmk\.me](https://note.nkmk.me/python-list-unique-duplicate/)
LPについて【説明できる？】

##最初に
キャリアチェンジにあたって、転職活動中に人事の方から「LPの説明できる？」という問いがきました。
その問いに対して、「名前は知ってるしなんとなくLP制作はしていたが、いざ説明しろと言われらできない」ということに気づきました。（人事の方には素直に説明できないことを伝えました;;）
それにより、今回改めてLPについて調べたので、ここにまとめます。

##LPとは
LP=ランディングページ

>インターネット広告やリンクをクリックした際、「ユーザーが最初にアクセスしたページ」をランディングページと言います。
ランディングページそのものの名前には、「landing page＝着地ページ」という意味をもち、リンクを経由して、ユーザーがはじめに訪問する着地点として利用されています。ランディングページは別称として、「LP 」などと呼ばれており、「入口ページ」や「集客ページ」としての役割をもっている重要なツールのひとつなのです。

つまり、WEBサイトというのは複数のLPで成り立っているものということですね。


##参考にしたサイト

- <a href="https://liskul.com/lp-toha-1530">ランディングページとは？10分でわかるLPの目的、メリットを解説</a>
- <a href="https://digital-marketing.jp/creative/what-is-a-landing-page/">ランディングページ（LP）とは？メリット・デメリットと制作時のポイント</a>

個人的には上のサイトの方が図があって理解しやすかったです。

なぜLPは必要なのか、LPのメリットデメリットについて詳しく書かれています。
（しっかり学んで改めて、個人ブログにまとめよう。）


##次は正確に説明できそう
これで次聞かれたときは大丈夫だ・・・( ´▽｀)
日本語プログラミング言語「プロデル」でグラフを描く

## はじめに
グラフ理論のグラフです。チャートではありません。

## 実装

今回は，隣接行列を内部に持つグラフ構造種類を定義して，その上でサクッとグラフを描いてくれるようにしたいと思います。
図形描画は面倒なので，今回はグラフ描画老舗最大手の[graphviz](https://www.graphviz.org/)を使います。

### コンストラクタ

日本語プログラミング言語なので，日本語をラベルに持ったノードも使うことがあるかもしれません。その際に問題になるのがフォントです。そこで，フォントを指定できるようにしておきます。

```プロデル:グラフ構造.rdr
グラフ構造とは
	＋隣接行列：行列
	＋ラベル：配列
	－フォント名：文字列
	－大きさ：整数
	はじめ（V）の手順
		隣接行列は，行列（V，V）を作ったもの。
		V回【あ】にカウントして繰り返す
			ラベル（あ）は，あ。
		繰り返し終わり。
		大きさは，V。
		フォント名は，「」。
	終わり
	はじめ（V，F）の手順
		隣接行列は，行列（V，V）を作ったもの。
		V回【あ】にカウントして繰り返す
			ラベル（あ）は，あ。
		繰り返し終わり。
		大きさは，V。
		フォント名は，「node ［[］fontname = "［F］"［]］;［改行］」。
	終わり
終わり
```

### エッジを引く

これは隣接行列に1を立てるだけです。

```プロデル
自分で【始点：整数】から【終点：整数】にエッジを引く手順
	隣接行列の中身（始点，終点）は，1。
終わり
```

### dotを作成する

有向グラフと無向グラフの場合で書き方が少し違うので，手順を2つ用意しました。

まず，有向グラフです。

```プロデル
自分を有向グラフとして描画する手順
	【ドット：文字列】は，「」。
	ドットは，ドット＆「digraph{［改行］［フォント名］」。
	大きさ回，【行】にカウントして繰り返す
		大きさ回，【列】にカウントして繰り返す
			もし隣接行列の中身（行，列）が1なら
				ドットは，ドット＆「［タブ］"［ラベル（行）］" -> "［ラベル（列）］";［改行］」。
			もし終わり
		繰り返し終わり
	繰り返し終わり
	ドットは，ドット＆「}」。
	ドットをよしなにする。
終わり
```

まあそうだよね，という感じです。次に，無向グラフ。


```プロデル
自分を無向グラフとして描画する手順
	【ドット：文字列】は，「」。
	ドットは，ドット＆「graph{［改行］［フォント名］」。
	大きさ回，【行】にカウントして繰り返す
		大きさ回，【列】にカウントして繰り返す
			もし隣接行列の中身（行，列）が1なら
				もし（行＜＝列）または（隣接行列の中身（列，行）が0）なら
					ドットは，ドット＆「［タブ］"［ラベル（行）］" -- "［ラベル（列）］";［改行］」。
				もし終わり
			もし終わり
		繰り返し終わり
	繰り返し終わり
	ドットは，ドット＆「}」。
	ドットをよしなにする。
終わり
```

無向グラフは，A→Bというエッジと，B→Aというエッジがあった場合に，2本エッジを引く意味が無いので，2回目の描画をしないようにしています。行＜＝列の場合に絞るという手もありますが，隣接行列にどのようにデータが入るか分からないので，採用しませんでした。

### dotを起動して画像化し，表示する

```プロデル
【ドットデータ：文字列】をよしなにする手順
	ドットデータを「_temp.dot」へ「UTF8」で保存する。
	「dot.exe」を「-Tpng -O _temp.dot」として起動して待つ。
	グラフ画像という画像（「_temp.dot.png」）を作る。
	画像表示というウィンドウを作る。
		その実質大きさは，グラフ画像の大きさ。
		そのタイトルは，「グラフ」。
	画像表示へ画像領域というピクチャーを作る。
		その位置は，｛0，0｝。
		その大きさは，画像表示の実質大きさ。
		その画像は，グラフ画像。
	画像表示を表示。
	「_temp.dot」を削除する。
	「_temp.dot.png」を削除する。
終わり
```

仮に`_temp.dot`にdotファイルを出力し，dotを起動しています。dotはPATHが通っていることが前提です。出力されたPNG画像を読み込んで，ウィンドウに表示しています。

## なんか描く

何か描いてみたいと思います。

```プロデル
「行列.rdr」を参照する。
「グラフ構造.rdr」を参照する。

路線図というグラフ構造（8，「Yu Gothic」）を作る。
路線図のラベルは，｛「荻窪」，「中野」，「新宿」，「飯田橋」，「四ツ谷」，「東京」，「大手町」，「御茶ノ水」｝。
’中央線
路線図で1から2にエッジを引く。
路線図で2から3にエッジを引く。
路線図で3から4にエッジを引く。
路線図で4から5にエッジを引く。
路線図で5から8にエッジを引く。
路線図で8から6にエッジを引く。
’東西線
路線図で2から4にエッジを引く。
路線図で4から7にエッジを引く。
’丸ノ内線
路線図で1から3にエッジを引く。
路線図で3から5にエッジを引く。
路線図で5から6にエッジを引く。
路線図で6から7にエッジを引く。
路線図で7から8にエッジを引く。

路線図を無向グラフとして描画する。
待機。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/4aae71b5-f413-b48f-e22c-5829dad020fe.png)

きちんと動きました。

有向グラフも描いてみます。

```プロデル
「行列.rdr」を参照する。
「グラフ構造.rdr」を参照する。

進路というグラフ構造（10，「Meiryo」）を作る。
進路のラベルは，｛「幼稚園」，「小学校」，「中学校」，「中等教育学校」，「高等学校」，「高等専門学校」，「大学」，「大学院」，「大学病院」，「通商産業省工業技術院」｝。
進路で1から2にエッジを引く。
進路で2から3にエッジを引く。
進路で2から4にエッジを引く。
進路で3から5にエッジを引く。
進路で3から6にエッジを引く。
進路で4から7にエッジを引く。
進路で5から7にエッジを引く。
進路で6から7にエッジを引く。
進路で6から8にエッジを引く。
進路で7から8にエッジを引く。
進路で7から9にエッジを引く。
進路で8から9にエッジを引く。
進路で9から8にエッジを引く。
進路で7から10にエッジを引く。

進路を有向グラフとして描画する。
待機。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150160/9147dafd-3f63-a36d-af75-424dc1f02154.png)

きちんと動きました。

なお，グラフ構造.rdrでは，

```
路線図で「荻窪」から「中野」にエッジを引く。
```

などと書いても動きます。
ElasticBeanstalk Blue-Green Deployment

# はじめに
ElasticBeanstalkでのBlue-Green Deploymentの方法をネットを探してみたものの、まとまったものが見つかりづらかったので、他の方の参考になればと思いあげさせていただきます。


# Blue-Green Deployment とは
* アプリケーションの動作を事前確認しつつ、ダウンタイム無しのリリース
    * Blue - 本番環境へのデプロイ
    * Green - テスト環境へのデプロイ

<b>つまり、テスト環境で問題がないことを確認して、そのテスト環境と本番環境のURLを交換することによって、ダウンタイム無しのリリースを実現しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/dc057006-674c-1a20-845f-a09c684f5be3.png)

# 操作方法
## 前提条件
* アプリケーションが参照するDBは同じ場所を指していること（Blue-Green Deploymentがダウンタイムなく環境を更新・変更する方法なため。）

## ElasticBeanstalk
* ElasticBeanstalkのコンソールへいき、アプリケーションごとに右上にある"アクション"アイコンを押すと"環境URLのスワップ"があるので押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/63611abe-f618-8de9-eb08-7a2017f6ef63.png)

* テスト環境と本番環境を間違えないように指定して、右下のスワップを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/6f1a0865-d6db-6475-7f15-85d9a6bc63bd.png)

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
ロボット作り体験セミナー！GR-ROSEとサーボを使って関節を作ろう！を受講したよ! ET&IOT 2019 株式会社コア（2019年11月20日実施）

ET ＆ IoT Technology2019内において株式会社コアのプライベートカンファレンス
ロボット作り体験セミナー！GR-ROSEとサーボを使って関節を作ろう！が実施されました。
これを受講しましたので報告させていただきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4dc4cf83-6cb0-f6da-55b5-1ed8948308cd.jpeg" alt="" width="600" height="" border="0" />
今回は、株式会社コアが製作したGR-ROSEを使ったセミナーになります。
GR-ROSEはRX65Nを搭載したマイコンボードで
有線LAN、無線LAN,UART,そして、1Wireサーボやステッピングモーターを動作可能です。
さらに、ROS2にも対応しています。
https://www.renesas.com/us/ja/products/gadget-renesas/boards/gr-rose.html

１Wireサーボは、普通のサーボモーターと異なり、数珠つなぎで使用することが可能です。
この為PWMのサーボと異なりピンの数が少なくて済みます。

###・GR-ROSEのリファレンスはこちら
https://www.renesas.com/us/ja/products/gadget-renesas/boards/gr-rose/rose-sketch.html#library

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/cd7fe8a9-395a-fc91-bb4c-980c4f52f33a.jpeg" alt="" width="800" height="" border="0" />
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b6de6460-f9c2-c7c7-28cb-ea84b50ce3b9.jpeg" alt="" width="800" height="" border="0" />

今回のセミナーはルネサスのがじぇるね担当岡宮さんが講師を務められました。

##セッション一覧
###・LED点灯しよう！
###・サーボの位置検出をしよう！
###・サーボを動かしてみよう！
###・ROS2のPub&Sub通信を行おう！

最後のROS2のPub&Sub通信では、全員のサーボを同期して動作させることが出来ました。
（なんでも初の実験だったとか）
JetsonNanoをパブリッシャーにし、GR-ROSEをスブスクライバーとします。
パブリッシャーとは発行者であり、購読者となるサブスクライバーにトピックという命令を送る事で動作します。

以下動作の様子です。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GR-ROSEでのROS2動作の様子 <a href="https://twitter.com/usashirou1/status/1197516073861431297</a></p>&mdash; GR-ROSE ROS2動作の様子 <a href="https://twitter.com/usashirou1/status/1197516073861431297">GR-ROSEでROS2動作の様子</a></blockquote>
+<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
picoCTF 2019 asm1 - Points: 200

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/98e1b80d-7270-d75a-21b5-2723817fbbf3.png)

#解いてみた

asm1（0x610）は何を返しますか？
つまり引数0x610でasm1を実行したときに最終的にeaxに何が入ってますか？という問題だと思います。
eaxが戻り値。

問題を見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/39f98bd7-b7a3-95f4-6c40-5aa3216016e2.png)

```
<+0>:	push   ebp
<+1>:	mov    ebp,esp
<+3>:	cmp    DWORD PTR [ebp+0x8],0x3b9
<+10>:	jg     0x50f <asm1+34>
```

引数0x610と0x3b9を比較しています。
0x610＞0x3b9なのでasm1+34にジャンプする。

```
<+34>:	cmp    DWORD PTR [ebp+0x8],0x477
<+41>:	jne    0x520 <asm1+51>
```

引数0x610と0x477を比較しています。
0x610≠0x477なのでasm1+51にジャンプする。

```
<+51>:	mov    eax,DWORD PTR [ebp+0x8]
<+54>:	add    eax,0x11
<+57>:	pop    ebp
<+58>:	ret    
```

eaxに引数0x610を代入。
eax(0x610)に0x11を足す。

これが答え。
Excelって名前しか知らないPCに不慣れな感覚派22歳プログラミング完全未経験者がRubyを習得するまでの軌跡。Part2

実践編
-----
progateのRubyのレッスンは全５章。高校以来こういう小難しいものとは無縁だったわたしからすると少々不安が多かったが実際はこんな感じだった。

【１章】　スライドと説明を見れば自分で答えを考えてスルスルっと正解してサクサク進める。
-----------------------------------------------------------------------------
最低限の用語
----------
文字列　　  （"文字列"）　（"）で囲んだ言葉、数字のこと　囲まないとプログラミングされちゃう。
コメント   　　（#）をつけると1行だけその後ろは全てプログラミングとは関係ないメモ帳にできる　応援メッセージやそのときの気分を書くのに使える。
計算記号　　　普段の日常通り。　（％）はあまり馴染みがないから注意割り算したときの余り。
変数　　　  　　箱。一つ厄介なのは大きさがミニマムな時もあればハッシュが入るくらい大きい時もありサイズの概念がない？
要素　　　　　なにかすごい大切ななにかのように感じるが見かけだけ。要は箱（変数）の中身
比較演算子　　イカついのは名前だけ。比べて大きいか小さいか同じかってだけ。同じとき（==）同じじゃないとき（!=） (=)を使いたくなるから注意。

-----------------------------------------------------------------------------
最低限の命令
----------
puts 　　レッスン中これを使わないことはほぼない。「これを表示して！」って命令　意識高いと「出力」という言葉を使う
変数展開　　　文字列の中に変数をぶっこむ方法。最低限のマナーとして#{変数}という形で繕う。
if-end     　説明に条件式とかでたらまずこれ。ifから始まってendで終わる。間に条件と処理を記述。
elsifとelse   ifじゃなかったときのパターンを書く。何パターンでも書けるがelseは最後に一度だけelsifは何回でもok

-----------------------------------------------------------------------------


【２章】　１０分どこがダメなのか分からず答えを見た。
-------------------------------------------
(=)一つで動かないとか忖度してくれと心の中で叫びを上げた。カッコの中にカッコがでてきてどのカッコ使うのか時たまわからなくなる。

![スクリーンショット 2019-11-21 20.51.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537074/5ef8c845-c4fd-6ad9-e8ca-6851aec89775.png)

-----------------------------------------------------------------------------
最低限の用語
----------
**配列**　　 　変数の箱より大きな箱イメージとしては押入れ　（,）で区切れば複数入れることができる
**ハッシュ**　　　鍵付きの箱のことイメージとしては銀行の貸金庫　鍵と箱で１つのハッシュ　目印は（：）
**シンボル**　　　鍵だと分かるようにつける目印（：）。ハッシュで[:name]と書く記法名
**インデックス番号**　　　なんの番号！？ってなるけど簡単。奥に置いた箱から順に0,1,2..と自動でついてくシール　
**nil** 　　箱に対してこれあるでしょ？って聞いたときに「いやないけど。。。。」っていう機械が返す無言。空白で返事が帰ってくる。シュール。

-----------------------------------------------------------------------------
最低限の命令
----------
**配列-each-do-|変数|-end** 「eachして！」っていうと箱の上から一つづつ取り出してくれる

-----------------------------------------------------------------------------

《今回のデットロック》
-----------------------------------------------------------------------------
exams = [
  {subject: "Math", score: 80},
  {subject: "Science", score: 55}
]
exams.each do |exam|
  puts "#{exam[:subject]}の結果は#{exam[:score]}点です"
end

今回のデットロックは①文字列の中に[:subject]という要素のキーを入れたい②文字列に変数examを入れるから変数展開しないといけない。と２つのことを同時にしないといけなかった。そのため[]と{}の２つのカッコがでてきてまさにデットロックだった。　答えとしては#{}>[]ということ。




やってて思ったこと
-------------
①箱のなかに箱を入れないでください。マトリョーシカみたいで嫌です。
Mac に Git を導入して Github に反映するまで


Mac に [Git](https://git-scm.com/) を導入し、 [Github](https://github.com) に反映するまでの方法のメモ
## [Git](https://git-scm.com/) とは
バージョン管理システム  

## [Github](https://github.com) とは
Gitの仕組みを利用して、プログラムコードやデザインデータなどを保存、公開することができるようにしたウェブサービス

## Git の導入方法

```
git --version
```

[terminal](https://support.apple.com/ja-jp/guide/terminal/apd5265185d-f365-44cb-8b09-71a064a42125/mac) や [iTerm](https://www.iterm2.com/) で上のコマンドを入力して、バージョンが表示されたら既に Git がインストールされているので、以下の1.および2.は不要。その場合は3.から始める。

1. **[Homebrew](https://brew.sh/index_ja) (macOS用パッケージマネージャー) をインストール**  

    ```
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
    ```

2. **Git をインストール**

    ```
    brew install git
    ```

    インストールできたら試しにバージョン確認してみる  

    ```
    git --version
    ```

3. **Git の初期設定**

    ```
    git config --global '[ユーザー名]'
    git config --global '[メールアドレス]'
    ```

4. **ローカルレポジトリ (Mac内のフォルダ) をGitで管理する**

    ```
    cd [レポジトリ名]
    git init
    ```

5. **Github で新しいレポジトリを作成する**
    1. [Github](https://github.com) > Repositories > [new](https://github.com/new) にアクセス
    1. リモートレポジトリ名を `Rpository name` に入力 ( `Owner` には既にログインアカウント名が入っている )
    1. `Create repository` をクリック
    ![github.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230954/abbbf437-d06c-01d1-dcaf-7a203fdbc942.jpeg)


6. **既存のローカルレポジトリをリモート (Github) に反映させる**

    ```
    git remote add origin https://github.com/toshikisugiyama/[レポジトリ名].git
    git push -u origin master
    ```

---

## 作業の進め方
1. ローカルの `master` を最新のリモートの `master` に合わせる
1. `master` からブランチを切る
1. 変更を加える
1. 変更を加えたファイルをステージングする
1. ステージングしたファイルをコミットする
1. コミットした変更をリモートに反映させる

## よく使うコマンド
### ローカルの `master` を最新に合わせる

```
git pull origin master
```

---

### 新しいブランチを切る

```
git checkout -b [ブランチ名]
```
---

### 変更したファイルを全てステージングする

```
git add .
```

`.` は全てのファイルを意味します。  
各ファイルを個別に指定してステージングしたい場合は、

```
git add [ファイル名]
```

です。  

このとき、ステージングされていないファイルを調べるためには、

```
git status -sb
```

で作業状況を確認できる。  

- `git status` は作業状況を確認するコマンド 
- `-s` は `git status` で出てくる表示を短くするオプション
- `-b` は現在のブランチも表示させるオプション
- `-s` と `-b` を合わせて `-sb`

ちなみに、間違えてステージングした場合は、

```
git reset [ファイル名]
```

で戻せる。

---

### ステージングしたファイルをコミットする

```
git commit -m '[コミットメッセージ]'
```

『コミットしてしまったけど、このファイルの変更もさっきのコミットに入れておきたかった！』 という場合は、

```
git add [さっきのコミットに入れておきたかった変更のあるファイル名]
git commit --amend --no-edit
```

コミットの履歴を確認する場合は、

```
git log --oneline --graph
```

- `--oneline` オプションを付けることで、各コミットが1行で表示される
- `--graph` オプションを付けることで、図のように見やすく表示される
- 直近の何件かのコミットだけ表示させたい場合は、 `-件数`オプションも使える。 `件数` には数字を入れる。

---

### コミットした変更をリモートに反映させる

```
git push origin head
```

---

他のコマンドやそれぞれのコマンドのオプションを調べたい場合は、

```
git --help
```

や

```
git add --help
git commit --help
git push --help
```

などで確認できる。
Flexbox で要素を変芸自在に並び替える

# Flexbox
inline-blockを使用してもできるが、細かいところを自動で修正してくれ、簡単にレイアウトを作成することができるプロパティー。
正式名称は「Flexible Box Layout Module」
横並び、縦並びどちらもできる。
レスポンシブのときはdisplay:blockではなく、flex-directionプロパティをつかって縦並びにするといい感じ

#使い方
親要素に`display:flex;`を指定する。

```html
<div class="f-container">
	<div class="f-itema">1</div>
	<div class="f-itemb">2</div>
	<div class="f-itemc">3</div>
</div>
```
```css
.f-container{ 
  display:flex;
}
```

## デフォルト
アイテムが水平方向に左から右へと配置される。

```css
.f-container{
  display:flex;
  width: 200px;
  color: white;
  font-size: 50px;
}
.f-itema {
  background-color: blue;
  height: 100px; 
  width: 100px;
}
.f-itemb {
  background-color: tomato;
  height: 100px; 
  width: 100px;
  
}
.f-itemc {
  background-color: pink;
  height: 100px; 
  width: 100px;
}
```
<img width="267" alt="スクリーンショット 2019-11-21 22.42.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/840be463-2423-43a6-502e-46220701b79f.png">

## 逆順にしたい
```css
.f-container {
  display:flex;
  flex-direction: row-reverse;
}
```

<img width="248" alt="スクリーンショット 2019-11-21 22.46.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/132b47c2-d955-f42e-5ee9-3e5c6f23d378.png">


## 垂直にしたい

```css
.f-container{
  display:flex;
  flex-direction: column;
}
```

<img width="218" alt="スクリーンショット 2019-11-21 22.49.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/e38b9a49-99ff-74b8-1b1e-5eedc23ae353.png">

## 子要素を折り返したい

```css
.f-container{
	display:flex;
  flex-wrap:wrap;
  width: 200px;
  color: white;
  font-size: 50px;
}
```
<img width="217" alt="スクリーンショット 2019-11-21 22.52.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/64f3fa3c-9daa-8807-49f2-c7e411c83e6d.png">

親のwidthが200pxで、子のboxにwidth 100px,height 100px を指定しているので、親のwidth幅を超え、要素が折り返される。

# 参考
https://webdesign-trends.net/entry/8148
【Python】10進数を2進数、8進数、16進数に変換する

## サンプルコード

`bin`, `oct`, `hex`を使用する。

```python
num = 100

# 2進数に変換
bin(num) # => '0b1100100'

# 8進数に変換
oct(num) # => '0o144'

# 16進数に変換
hex(num) # => '0x64'
```

もし`0b`, `0o`, `0x`のようなプレフィックスを除きたい場合は`[2:]`を末尾に追加すればいい。

```python
num = 100

# 2進数に変換
bin(num)[2:] # => '1100100'

# 8進数に変換
oct(num)[2:] # => '144'

# 16進数に変換
hex(num)[2:] # => '64'
```

## 参考

- [python \- How can I make \`bin\(30\)\` return \`00011110\` instead of \`0b11110\`? \- Stack Overflow](https://stackoverflow.com/questions/1395356/how-can-i-make-bin30-return-00011110-instead-of-0b11110)
IAMの自分なりのまとめ

#AWSにおける、IAM,ロール,ポリシーについて
入社して３週間経ちますが、今後実務でデータベースを扱うにあたり、AWS周りの単語を学ぶ機会が増えたので、忘れないように自分なりにメモしました。おそらく、まだまだ理解が浅いところ多々あると思います。認識の違いなどがありましたら、ご指摘いただけると幸いです。
IAMには、４種類あると教えていただきました。

##IAMとは
様々なリソース（EC2,RDS,S3,Lambdaなど）へのアクセスを安全に制御するためのウェブサービス。IAMを使用することによって、許可されたユーザーだけがリソースにアクセスできるように制御する。
（公式ではコンソールするためのサービスと書いていましたが、制御と変換しました。）

##なぜIAMを使うのか??
AWSに初めてサインインした時の初期状態だと、rootユーザーで全ての権限を持ってしまっているので、IAMを使うことにより、ユーザーのリソースへのアクセスを安全に制御することができる。

##ポリシーとは
ユーザーに対して、どのリソースを、どこまでの操作を許可するのかを、JSON形式で記述したもの。
※JSONは、keyとvalueで成り立っているものが多い。
例：ユーザーAに、S３にFullAccess(作成、読み込み、更新、削除）できるようにポリシーを付与する。
ユーザーAは、S３にアクセスすることができ、編集作業をすることができる。
何もポリシーを付与されていないユーザーBは、どのリソースにもアクセスできない。

##ロールとは
Rolesの和訳:役割。ロールプレイングゲームなどの、ロール。
ポリシーをまとめたもの。ロールは、リソースに対して付ける（アタッチ？）ことができる。

##グループとは
IAMユーザーの集まり。グループに分けることによって、100人のユーザーにポリシーを付与したいとなった時に、一人一人ポリシーを付与しないといけなくなり、手間がかかる。その100人をグループ化しておけば、グループに１つポリシーを付与するだけなので、管理が楽になる。
#10 XcodeのUIButtonの角を丸くする1例

#はじめに
個人のメモ程度の出来なのであまり参考にしないで下さい．


#環境
Xcode：11.2.1
Swift：5.1.2
2019/11



##part1
Veiwに`UIButton`を置き，制約を付ける．

<img width="298" alt="スクリーンショット 2019-11-21 午後10.26.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/3be1e73a-fc3a-c80e-c548-39bb3bcaded0.png">

<img width="377" alt="スクリーンショット 2019-11-21 午後10.26.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/d873a4af-d914-79ad-28dc-813e506cef93.png">



##part2
テキストの大きさ，テキストの色，テキスト，背景色を変更する．

<img width="371" alt="スクリーンショット 2019-11-21 午後10.32.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/91604c31-7bd3-3959-1426-19271974e1c8.png">

##part3
UIButtonを選択した状態で，`Identity inspector`の`User Defined Runtime Attributeds`に新規の行を追加する．
- `Key Path`は`layer.cornerRadius`
- `Type`は`Number`
- `Value`はUIButtonの`hight`の半分

<img width="260" alt="スクリーンショット 2019-11-21 午後10.42.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/5949c7da-e926-1015-12f2-c9ca7bb23518.png">


##part4
`Main.Storyboard`では角が丸く見えないが，ビルドすると端末上では角が丸くなる．

<img width="373" alt="スクリーンショット 2019-11-21 午後10.41.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534708/821e66dd-8cd3-1723-dd17-6e61f0d673aa.png">