OmniAICreator/Qiita-1.07M huggingface dataset:
CRISPORを使ったsgRNAのオンターゲット/オフターゲットスコアの算出


CRISPRの論文をみているとsgRNAの選定基準として活性予測スコアやらオフターゲットスコアやらがでてくることがあります。こうしたものは原著論文をたどると機械学習アルゴリズムを利用していたりするため気軽に計算できるというものではありません。
実際に自分のsgRNA配列でだす場合は[CRISPOR](http://crispor.tefor.net/crispor.py "CRISPOR")というウェブサイトが便利です。このサイトは与えられた配列情報からsgRNAサイトを網羅的に見つけ出し、一括で種々のオンターゲット・オフターゲットスコアを算出してくれるものとなっています。

利用の仕方は以下のビデオが参考になるかと思います。
[![Screen Shot 2019-12-20 at 3.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521610/77d8010f-5ee2-cd45-6b1d-669a94fa1622.png "Screen Shot 2019-12-20 at 3.16.30.png")](https://www.youtube.com/watch?v=PQj3P9G-Ma8)

最初の画面にあるSequence nameの項目はoptionalと書いてありますが、私の環境では入力しないとエラーになります。

このウェブサイトは単純なスコアだけでなく、実際のオフターゲットサイトの配列やらクローニングのためのプライマー、さらにはNGS解析時の解析コマンドまで提示してくれるかなり包括的なツールになっています。そのためsgRNA設計の際には第一選択として利用する価値は十分あると思います。

ただ一つ注意して頂きたいのは、こうしたスコアが高いからといって必ずしもその通りの結果になるわけではないという点です。特にオンターゲットスコアに関しては、「数十、数百のスケールで行うと過半数は合ってる」という感じの「統計的な正しさ」でしかありません。逆に「このsgRNA配列はオンターゲットスコアが低いから絶対ダメ」と考えなくてもよいと思います。


以上です。ありがとうございました。
[日記] AtCoder 最近解いた問題 (ABC144)

今日は ABC144 の青以下の過去問を埋めました。

問題文がちょっとストーリーになっていたり、珍しく幾何があったり面白い回でした。

# ABC144
## ABC144 A 9x9

二つの整数が与えられるので、どちらも一桁ならその積を、そうでないなら `-1` を表示する

### 印象

やるだけ

### 解法

問題文どおりに条件分岐を書いて掛け算するだけ

## ABC144 B 81 [全探索]

一つの整数 `N` が与えられるので、それが一桁 x 一桁の掛け算に分解できるか判定する

### 印象

やるだけ。 B 問題にしては最低限全探索の練習になるしいい問題っぽい気がする。

### 解法

`1 <= i <= 9` についてループ回して、 `N` が `i` で割り切れて (`N % i == 0`) かつ割った結果が一桁 (`N / i < 10`) になったら `Yes` と言って終わり。最後まで見つからなかったら `No` と言う

## ABC144 C Walk on Multiplication Table [全探索]

一つの整数 `N <= 10^12` が与えられるので、 `a * b = N` になるような `a, b` の組のうち `a + b` がもっとも小さくなるようなものを探して、その値を求める

### 印象

`√N` らへんが一番小さそう

### 解法

印象通り。

`a + b` の値を固定する (たとえば `6`) と、 `a, b` の偏りが一番小さい時に積が一番大きくなる。

```
0 * 6 = 0
1 * 5 = 5
2 * 4 = 8
3 * 3 = 9
```

逆に言えば、掛け算を分解するときもなるべく偏りのないように (理想的には `√N * √N` に) 分解すると和が小さくなるはず。

`i = √N` からスタートして、 `N` を割り切れるような `i` が見つかるまで総当たりする。見つかったら `i + N / i` が答え。

## ABC144 D Water Bottle [幾何]

底面が `a` cm の正方形で、高さが `b` cm ある四角い水筒がある。ここに `x` cm^3 の水をいれて水筒を一方向に傾けたとき、何度以上傾けると水がこぼれるか。ただし傾けるときの軸は底面の辺で、頂点ではない。

### 印象

`arctan` で一撃で求まる系っぽい

### 解法

だいたい印象通り。ただ実際解いてみると場合分けが必要なことに気づく (水多めパターン・少なめパターン)。

<img width="1072" alt="スクリーンショット 2019-12-20 2.36.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54240/7f1a8338-ecdf-5fca-7a10-b92222c18c16.png">

とりあえず奥行きは考える必要なさそうなので、横から見たときの面積 `S = x / a` で考えていく。

まずは水多めパターン（図左）を試す。

傾けても水は減らない（面積は変わらない）はずなので、オレンジの線より下の面積が `S`。したがって上の三角形の面積は `a * b - S`。一辺が `a` とわかっているので、もう一つの辺は三角形の面積の公式から求まる。

```
面積 = 底辺 x 高さ / 2

なので

高さ = 面積 x 2 / 底辺
    = (a * b - S) * 2 / a
```

このとき、求まった高さが `b` より大きかったら図と矛盾するので水多めパターンではない。水少なめパターンに進む。

`b` 以下だった場合、水多めパターンで合っているので、そのまま `arctan` で角度を求めて終了。

水少なめパターン（図右）では、今度はオレンジより下の面積 `S` のエリアが三角形になる。こちらに対して同じように面積の公式を使うと

```
高さ = S * 2 / b
```

同様に `arctan` で角度を求めれば答え。

## ABC144 E Gluttony [二分探索]

`N <= 2 * 10^5` 人のメンバーがいて、それぞれの人にお腹の弱さ `A[i] <= 10^6` が決められている。 `K <= 10^18` の予算が用意されていて、 `1` 使うごとにメンバー 1 人のお腹の弱さを `1` 改善することができる (`0` 未満にはならない)。

一方、料理も `N` 種類用意されていて、それぞれの料理に消化の悪さ `F[i] <= 10^6` が決められている。お腹の弱さが `a` の人に消化の悪さ `f` の料理を食べさせると、食べきるのに `a * f` の時間がかかる。

メンバーたちを適切に鍛えて、料理を適切に割り当てたとき、すべて食べきるのにかかる時間（一番遅い人が食べ終わる時間）はいくらか。ただし一人のメンバーには一つの料理しか割り当てられない。

### 印象

一番お腹の弱いメンバーに一番消化のいいものを食べさせればいいので、料理の割り当て方は決め打ちで良さそう。

あとはどう鍛えるかが問題。

`K` がかなりでかいので、一番遅い人を検索しては `1` ずつ鍛える、というのを延々繰り返していても埒が明かない。

`A[i] * f[i]` の配列を作ってソートして、ガッと大きい方から「ここからここまで鍛える」みたいにやれるのかな…、うーん。

### 解法

二分探索で一撃 (`log N` 撃) だった。「ほげほげできる最小の `x` を求めよ」を見たらとりあえずにぶたんを疑ってみるのが正解な気がする。これは思いつきたかったな…。

「予算 `K` で `t` 分以内に食べきれるか」は判定可能。各メンバーについて、必要な予算を次のように計算できる：

- `F[i]` のものを `t` 分で食べきるのに必要なお腹のコンディションは `t / F[i]`
- もし `t / F[i] > A[i]` なら、これ以上鍛えなくてもこのメンバーは食べきれるので予算０
- そうでない場合、このメンバーは足りない分 `A[i] - t / F[i]` だけ鍛える必要がある

全員の予算の合計が `K` を超えてしまったら、 `t` 分以内には食べきれない。

あとは絶対食べきれない `-1` 分と絶対食べきれる `10^12 + 1` 分のちょうど真ん中からスタートして、範囲を半々に絞り込んでいけば境目が見つかる。総当たりでは間に合わない。
Kaggleの特徴量管理をPostgreSQLでやったら思ったより捗ったので,Dockerで誰でも使えるディレクトリを作ってみた

この記事は [Kaggle Advent Calendar 2019](https://qiita.com/advent-calendar/2019/kaggle) の 19 日目の記事です。

どうもこんにちは、[kiccho1101](https://github.com/kiccho1101)と申します！
人生で初めて記事を書きます！よろしくお願いします！

## はじめに
 
今回は、Kaggleの特徴量管理をPostgreSQLでやってみたら思ったよりも捗ったので、紹介したいと思います。

作ったディレクトリはこちら: [https://github.com/kiccho1101/datascience-template](https://github.com/kiccho1101/datascience-template)
↑READMEには[Titanicコンペ](https://www.kaggle.com/c/titanic)のデータを使った使用例が書いてあります。

## 特徴量管理とは？

Kaggleコンペでは、(以前の)僕のように何も考えずにコードを書きまくってると、以下のような問題が発生します。

- 特徴量が何を表してるのかわからない
- notebookがカオス状態に(exp1.ipynb, exp1_tmp.ipynb, exp1_tmp_tmp.ipynbなどが大量に発生)
- 半年後見返したときに、書いた自分でも？？？となるコードが生成される

これらの問題を解決するために、何らかの方法で特徴量を管理する必要があります。

特徴量管理については、[Takanobu Nozawaさんのスライド](https://speakerdeck.com/takapy/detafen-xi-konpenioite-te-zheng-liang-guan-li-nipi-bi-siteiruquan-ren-lei-nichuan-etaixiang-i)がとてもわかり易いので、こちらを是非参考にしてもらえれば幸いです。


## 概要
このディレクトリの特徴をまとめると以下のとおりです。

- データをDockerコンテナ上のPostgreSQLで管理
- SQLとPythonの両方でデータの操作ができる
- Makefileを使って一連の流れ(特徴量生成, 交差検証, 予測)をコマンドラインツール化
- 実験内容をconfigファイルで管理

## データをDockerコンテナ上のPostgreSQLで管理

データベースを用いることにより、

- [pgAdmin](https://www.pgadmin.org/)
- [pgweb](https://github.com/sosedoff/pgweb)
- [TablePlus](https://tableplus.com/)
- [DataGrip](https://www.jetbrains.com/datagrip/)

などのデータベースビューアーでデータを見れます。これがすごくいい。
pandasでやるよりも、EDAが格段にしやすいです。


## Makefileによるコマンドラインツール化

### 特徴量生成

![feature.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271771/7703ad3e-71f1-f5a5-77d2-e0b70bfbc88b.gif)

### 交差検証 (Cross Validation)

![cv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271771/f7431cc1-10a3-2d05-f41c-839f55424024.gif)

### 予測

![predict.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271771/7e883a47-a09d-2241-d39a-e063d41b9e41.gif)

こんな感じで、よくやる操作はmakeコマンドで実行できるようにしました。
コードを書く量がただ減っただけなのですがかなり快適にコーディングできます。

## まとめ

今回は、コードがメインになるので、記事のなかではサラッと説明するだけにとどめました。
「面白そう」と思った方は、是非是非Cloneして使ってみてください！！

最後に
プルリク&フォーク歓迎です！！！どなたでも気軽にお願いします！！！
AOSP をビルドして海外版 Xperia XZ にインストールして気が付いた話。

# tl;dr
AOSP をビルドして海外版 Xperia XZ にインストールしたければ、[Sony の Open Devices](https://developer.sony.com/develop/open-devices/) と [Google 公式](https://source.android.com/) は必ず読むべき。

以下、一問一答形式でお送りします。

# なぜ AOSP をビルドするのか？

__そこに AOSP と Xperia XZ があるから__

という人もいるでしょうが、思う存分 root がとりたい人や Android をハックしたい人が主にやりたくなるようです。

# なぜ Xperia XZ か？

__比較的英語の情報が集めやすいから__ 

の一言につきます。
Project Treble より少し前の端末で、中古でお値段が比較的手ごろになってきたからのようです。
メルカリ等で時々お宝がでます。要チェック！

# なぜ海外版か？

__そうでなければ Unlock できないから__

同じ機種でも国内版はほぼアンロックできません。
対象機種は Sony の Open Source Devices のサイトにあります。

# Pixel とどっちがいい？

__検索しまくるのが嫌いなら Xperia__

Pixel は Google 謹製で、ほぼビルドに失敗しないところが美点ですが、A/B update に対応しているので、今までの知識に加え、最新の知識を仕入れてからでないと面倒くさいです。公式以外はなかなか情報が探しづらい。

そして、最新の知識はネットにはなかなか流通していないのだった。特に日本語。

日本人ならば一度は Xperia でビルドしておくべき！と元 Sony 信者が煽ってみるテスト。

# ビルドは難しい？

__やれと言われていることが注意深くできれば一発ビルドも夢ではない__

とお答えしておきましょう。実際そうだったし。

ビルドする「だけ」なら別に難しい話ではありません。
難しいのは、ビルドできなかった時、ちゃんと動いてくれなかった時、いったい何が原因なのかが最初は全くわからないことです。

失敗しても大丈夫なように、バックアップと復元の仕方の調査は、いの一番にやっとくべきでしょう。

# ほかになんか難しいこととかやっとくことってある？

__チップベンダのドライバとかはちゃんとメーカ公式からダウンロードしておくべし__

AOSP に Google Play 開発者サービス入れたいとか root とったままプロプライエタリなソフトを入れたいとか無茶ぶりする人の要望に応えるのも難しい。なんとか要望に応えたと思ったら、不安定だと文句を言われる理不尽さ。一体どんだけ貴重な休日と睡眠時間を削ったと思っているんだ。私の時間を返せ。

あとは、ネットは極力早い回線を、PC は絶対に早いマシンでないとどうしようもありません。
Intel Core i9 を 15コアでぶん回してもダウンロードもビルドもそれぞれ2時間前後かかります。
外付けハードディスクなどもってのほか。数年前の型落ち MacBook Pro は一日かかってもビルドできなかったよ orz
そして一部のツールが MacOS に対応していないという苦難。
こんだけ苦労しているのに、まったく必要性を理解されない理不尽さ。

公式や Sony のドキュメントで要求されたことはあらかじめこなすのは必須。
何事にもめげない強い心に鍛えたうえで、ビルドに挑むことをおすすめします。
HP も MP も Gold も削った私の命は風前の灯です。

<h3>ようこそ、文鎮製造の世界へ！</h3>

# AOSP なんてビルドする意味がわからない

__ではこの記事はあなたのための記事ではなかったということです__

と、ミサカはすこし怒ったような残念そうな顔をして呟いてみます。

でも何が何でもやらなくてはいけない人だっています（そう、俺のようにな）

「意味がわからない」などど、自分の無知をひけらかすような言い方はよくないですね。
意味が分からなくても、そのうち慣れるということもあります。

いつか自分にもわかる日が来ることを、人に理解されない無駄なビルドをしつつ、世界の平和とともに祈りましょう。

# 自分で Android を魔改造したい！

__素人の出る幕じゃない。やめておけ...__

と止められても、もうビルドする気満々ですね。誰しも最初は素人。いいでしょう。

そういう人のために [XDA Developers](https://www.xda-developers.com/) があります。日本語で質問してハブられるもよし、あきらめずにチャレンジして仲間に入れてもらうのもよし。楽しめます。

<h3>Enjoy!</h3>
LookerのダッシュボードにURLリンクを貼る方法(htmlを利用可能）


当エントリは2019年アドベントカレンダー[『Looker Advent Calendar 2019』](https://qiita.com/advent-calendar/2019/looker)の20日目のエントリとなります。


今回は、LookerでのURLリンク設定方法の紹介です。

## 機能概要
ダッシュボードのTextからURLリンクを設定することで、関連したLookや、内部、外部サイト、スライドやスプレッドシートなどにワンクリックで飛ぶことができます。

## URLリンクの活用例とメリット
BIツールを運用していくと、要件や施策が増えることに比例してダッシュボード数が増加していきます。そしていつかは大量のダッシュボードが溢れることになると思います。そうなると`BIを活用するビジネスメンバーは定常的に業務上で必須で見る必要があるダッシュボードのみをお気に入りなどに登録して、日々それだけを参照する`ようになってきます。

この時にお気に入り登録したダッシュボードから他のダッシュボードへURLリンクを設定しておくと便利な場合があります。


例えば、
ゲームなどのアプリケーション運営を例に挙げると、

日々の顧客数の推移や、売上推移を参照するダッシュボードが構築してあるとします。
この時、顧客数が前日比で急激に変化した場合、なぜそうなったのか？を運営側で把握する必要が出てきます。

そういった場合、以下のように顧客数を分解して考えます。

```

顧客数　＝　新規顧客　＋　継続利用顧客　＋　カムバックした顧客　ー　前日からの離脱顧客
```

この情報が見えると、
`・新規顧客が増えたから顧客数が増えた`
`・継続利用顧客が減少したから顧客数が減った`
`・カムバックした顧客が増えたから、顧客数が増えた`
などの判断がつくわけです。

上記の通り、**顧客数の入ったダッシュボードからURLリンクを設定しておくことで、顧客数の分解情報が見れるダッシュボードへワンクリックで移動できるようにしておくのは結構なメリットがある**のです。


## LookerへのURLリンク設定手順

・Lookerのダッシュボードを開き、右上の**Edit**をクリック
![URLリンク1_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/222ed660-f96e-1544-523c-544fab4cb329.png)


・左上の**Text**を選択して、表示された**Add Text**の**Title欄にhtml形式でURLリンクを記入**する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/2d3b1b6c-a248-85dc-f72a-05bab3a7f3ae.png" width=80%>

記入したhtmlのコードはこちら(yahooファイナンスの株価情報へのリンクを貼らせていただきました)

```html

<a href=https://stocks.finance.yahoo.co.jp/stocks/chart/?code=9684.T>スクエニの株価リンク</a>
```

・URLリンク入りのTextが作成されるので、**スクエニの株価のテキストをクリック**する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7fb67337-b75e-ba4b-614b-e75346d5e1c9.png" width=80%>

・URLリンク先へ遷移した！（完成）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/3023f439-d3d2-7f0e-c8c2-27bb0d0b9bac.png" width=80%>


## まとめ
Lookerではhtml ~~とbootstrap~~(Looker７.０以降から利用できなくなった模様！？）が利用可能ですので、**URLリンクはhtmlのコードを活用することで対応可能となってます。**

以外にもテキストの文字を大きくしたり、色をつけたりも可能です。↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242038/7bebaa77-383b-81b4-31fa-cbd66407317d.png" width=110%>

```html

<center><font size="10" color="blown"><b>好きな文字を入れよう</b></font></center>
```

ちなみに、ライブチャットで問い合わせたらbootstrap ~~html~~の利用も可能だが推奨はしていない（いずれサポート対象外で使えなくなるかも？）ということでしたので、今後も使えるかは微妙かもしれませんが、現時点では利用可能ですので、色々試してみることをお勧めします。

そして他にもいい感じのhtmlコードがありましたら、是非Lookerブログに書いて紹介いただければと思います！
Nordic nRF5340 PDKを使おう インプレッション

Nordic SemiconductorからデュアルコアSOC nRF5340が販売されました。

##nRF5340
https://www.nordicsemi.com/Products/Low-power-short-range-wireless/nRF5340

##スペック
###・ 高性能アプリケーションコア
128/64 MHz Arm Cortex-M33 with FPU & DSP instructions
1 MB Flash + 512 KB RAM
8 KB 2-way set associative cache
###・ 低消費電力　ネットワーク通信コア
64 MHz Arm® Cortex®-M33 with 2 KB instruction cache
256 KB Flash and 64 KB RAM

###・セキュリティ
Trusted execution with Arm TrustZone®

###・通信部
###Bluetooth
Ultra-low-power 2.4 GHz multiprotocol radio
Bluetooth 5.1 Direction Finding capable(AoA,AoD)
Bluetooth 5 Long Range
Bluetooth mesh, Thread and Zigbee
####NFC

###・ハード部
####パッケージ　7x7xmm　aQFN　94ピン

####PIO　48本
12 Mbps full-speed USB
96 MHz encrypted QSPI for external memory
32 MHz high speed SPI for displays and fast sensors
4xUART/SPI/TWI, UART/SPI/TWI
I2S, PDM, 4xPWM, 2xQDEC
12-bit 200 ksps ADC
###・温度耐性
105 °C extended operating temperature
###・電源
1.7-5.5 V supply voltage range
##最大の特徴は？
nRF5340はArm Cortex-M33をアプリケーション部とネットワーク部に搭載したデュアルコアSoCになります。
最大の売りは、ArmCortex-M33を2機搭載したことです。
##Bluetooth機能は？
もちろん既存のBluetoothの機能はそのままに、Bluetooth5.1で策定された位置検出技術AoAやAoDに対応しています。
##仕様は？
nRF5340のパッケージはaQFN(7x7mm)となり48本のGPIOを有しています。(ピン総数は94ピン）
##さらなる特徴は？
NordicのSoCは、ほかのArm系SoCよりもピン配列の自由度が高いのが特徴です。
このために、スペックとして、タイマーがいくつなどという表記がそぐわないことが特徴であり、
今回も、それが継承していると言えます。（ただし、ADCなどに制限はあります）
##もちろん低消費電力である上に
さらに、低消費電力であることは当然ですが、105度対応したことで、温度条件の厳しい場所での使用が可能です。
（残念ながら150度対応ではないので車載グレードではありません）
また、高性能なLDOなどの電源系もありますが、実際には、充放電回路が必要なので割愛します。
##量産までには？
今回、aQFNで登場しましたがWLCSPパッケージの予定があることが発表されており、量産開始の2020年春ごろには、新しい情報が手に入ると思われます。

##製品プレビュー
さて、それでは製品を見ていきましょう。
![pop-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d68e25c3-393c-6ac6-36b4-4f5cc94afc52.jpeg)

今回からギフトボックス入りとなりました。
今までのように、帯電防止袋に入ったままではありません。
付属は、NFCのアンテナです。

##使用するには？
nRFConnectをインストールして使用します。

##触ってみましょう
nRFProgrammerを起動してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/449ad847-7b7c-31ff-7cca-bf0349af24ce.png)
こんな形でプログラムが入っています。

##デモを触るよ
Heart Rate Monitor Demoファイルがデモとしてダウンロード可能です。
NordicのHPのDownloadsからファイルをダウンロードして、AddHexFileにファイルを追加しErase&writeをクリックして書き込むことで使用できます。
https://www.nordicsemi.com/Software-and-tools/Development-Kits/nRF5340-PDK/Download#infotabs
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d2953914-a7a4-762a-f5e3-a212e4c6a277.png)

次は、実際に、Zephyのプログラムを作っていきましょう。

##nRF5340を使おう　nRF Connect SDKをインストールしてZephyを使おう
https://qiita.com/usashirou/items/e4759cdf172199d667fc
[zsh] scp *.py がNo such file になる

# 答え
```
\scp *.py
```

scp の前に' \ ' バックスラッシュをつける。

# 原因
Prezto のalias によって、scp='noglob scp' とされるため。問題の設定ファイルは、~/.zprezto/modules/utility/init.zsh
【Excel VBA】相対参照を含む数式を、参照先セルを変えないままほかのセルにコピペする（複数セルをまとめて処理）ショートカットを作成したい

#1.この記事について
###こんなケースを想定。
・業務効率化したい
・数式をコピペすると参照先が自動的に変化する場合にそれを防ぎたい（特に相対参照と絶対参照が混ざった数式）
・複数セルの数式をまとめてほかのセルに持っていきたい

#2.やりたいこと

先日投稿した下記の記事の応用。
[【Excel VBA】改行コードなしでエクセルのセル内容をコピーするショートカットの作成 - Qiita](https://qiita.com/dede-20191130/items/afde0ce967620f599d30)

今度は値ではなく数式をショートカット押下いっぱつでコピペできるようにする。

###作成のきっかけ
下記のようなやりかたもあるらしい↓
[相対参照を含む数式を、参照セルを変えないままコピーする方法 | エクセルスキル向上事典](http://excel.jiten.org/tips/copy-rel-ref-formula/)

ただしこのやり方だと置換をする分時間がかかり業務効率は落ちるし、
すべてのケースで使えるわけではないようだ。

今回のコードでその問題点を解決したい。

#3.使用したツール・環境
・Office2016

#4.作成したコード

- ※　20191221追記　※
 - 数式内に改行コードがある場合にも対応できるようにした。
 - 参照形式がR1C1形式を用いている場合にも対応できるようにした。

```vb

'******************************************************************************************
'*関数名    ：copyCellFormulaToCB_SupportMultiCells
'*機能      ：選択セルの数式をすべてクリップボードにコピー
'*引数(1)   ：無し
'******************************************************************************************
Public Sub copyCellFormulaToCB_SupportMultiCells()
    
    '定数
    Const FUNC_NAME As String = "copyCellFormulaToCB_SupportMultiCells"
    
    '変数
    Dim tempStr As String
    Dim rowCnt As Long
    Dim colCnt As Long
    Dim is_A1_ReferenceStyle As Boolean
    
    On Error GoTo ErrorHandler
    '---以下に処理を記述---
    
    '参照形式がA1形式ならTRUEとなるフラグ
    is_A1_ReferenceStyle = (Application.ReferenceStyle = xlA1)
    
    '選択範囲の数式を取得
    For rowCnt = 1 To Selection.Rows.Count
        For colCnt = 1 To Selection.Columns.Count
            '数式をコピー（数式内の改行コードは予め除去しておく）
            '※　参照形式ごとに取得メソッドが異なる
            If is_A1_ReferenceStyle Then
                tempStr = tempStr & Replace(Selection(rowCnt, colCnt).Formula, vbLf, "")
            Else
                tempStr = tempStr & Replace(Selection(rowCnt, colCnt).FormulaR1C1, vbLf, "")
            End If
            '最終列でなければ列のセパレータを付与
            If colCnt <> Selection.Columns.Count Then
                tempStr = tempStr & vbTab
            End If
        Next colCnt
        '最終行でなければ行のセパレータを付与
        If rowCnt <> Selection.Rows.Count Then
            tempStr = tempStr & vbLf
        End If
    Next rowCnt

    'クリップボードに文字列を格納
    With CreateObject("Forms.TextBox.1")
        .MultiLine = True
        .Text = tempStr
        .SelStart = 0
        .SelLength = .TextLength
        .Copy
    End With

ExitHandler:

    Exit Sub
    
ErrorHandler:

    MsgBox "エラーが発生しましたので終了します" & _
           vbLf & _
           "関数名：" & FUNC_NAME & _
           vbLf & _
           "エラー番号" & Err.Number & Chr(13) & Err.Description, vbCritical
        
    GoTo ExitHandler
        
End Sub

```


#5.解説

上記関数をALT + F8でショートカットに割り当てて、
選択範囲に対して使えばコピペできる。


###セパレータについて
複数セルの値をクリップボードに張り付ける場合、
行の場合は改行を、列の場合はタブを用いれば別々のセルに値を格納できるので
セパレータとして用いることが可能。

#6.終わりに

なにか補足がありましたらコメントください。
AWS IoT Device SDK for Embedded Cを使って、443番経由でIoT CoreにMQTT Pubする

# どんなときに必要か
C言語で開発しているアプリケーションから、MQTTのPubSubを行いたい場合、MQTTSのポート8883を使うとファイアウォールで通信できない可能性があるので、443を使いたい
詳細： https://aws.amazon.com/jp/blogs/news/mqtt-with-tls-client-authentication-on-port-443-why-it-is-useful-and-how-it-works/

# 手順
基本的なやり方は、以下の流れに従います。
https://docs.aws.amazon.com/iot/latest/developerguide/iot-embedded-c-sdk.html

1. ラズパイが手元に無い＆自分のPC環境を汚したくないので、Cloud9を立ち上げて、ラズパイ代わりに使います。
2. 上記URLをもとに、`aws-iot-device-sdk-embedded-c` をクローン
3. mbedtls をダウンロードして、クローンしたソースコードの `external_libs/mbedTLS` 下に置く(※2020/03/10時点で最新のMasterをクローンするとビルドが通りません。[こちら](https://github.com/aws/aws-iot-device-sdk-embedded-C/pull/819/files)の修正が必要です) 
4. AWS IoTでThingを作成し、証明書、ポリシーをアタッチ　※やり方：(https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/register-device.html)
5. デバイス証明書、 ルートCAの証明書、秘密鍵を certフォルダ下に置く
6. それらのファイル名を、 `aws_iot_config.h` にセットする

```c:/aws-iot-device-sdk-embedded-C/samples/linux/subscribe_publish_sample/aws_iot_config.h
// Get from console
// =================================================
#define AWS_IOT_MQTT_HOST              "a3gevvffsj7zer-ats.iot.ap-northeast-1.amazonaws.com" ///< Customer specific MQTT HOST. The same will be used for Thing Shadow
#define AWS_IOT_MQTT_PORT              443 ///< default port for MQTT/S
#define AWS_IOT_MQTT_CLIENT_ID         "tls-test" ///< MQTT client ID should be unique for every device
#define AWS_IOT_MY_THING_NAME 		   "tls-test" ///< Thing Name of the Shadow this device is associated with
#define AWS_IOT_ROOT_CA_FILENAME       "rootCA.crt" ///< Root CA file name
#define AWS_IOT_CERTIFICATE_FILENAME   "cert.pem" ///< device signed certificate file name
#define AWS_IOT_PRIVATE_KEY_FILENAME   "privkey.pem" ///< Device private key filename
// =================================================

```
AWS_IOT_MQTT_CLIENT_ID, AWS_IOT_MY_THING_NAME には、AWS IoT で作成したThing名を入れます。
7. subscribe_publish_sample_appディレクトリで、`make -f Makefile`
8. `./subscribe_publish_sample` で実行

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/bc25b0ab-c980-16b0-aec1-c7677b490997.png)

AWS IoTのテストでメッセージが受信できていることが確認できました。

## 本当に４４３で送られているのか

パケットを確認してみます。Cloud9上で、別ターミナルを開いて以下を実行します。

```sh
sudo yum install tcpdump
sudo tcpdump -i eth0 not host <ssh接続先のIP>
```

ログ

```
15:59:51.152221 IP ip-xxx.ap-northeast-1.compute.internal.39344 > ec2-xxx.ap-northeast-1.compute.amazonaws.com.https: Flags [.], ack 6760, win 296, options [nop,nop,TS val 243019003 ecr 2556610739], length 0
```

試しにポートを８８８３（MQTTS）にして、再度makeします。

```c
#define AWS_IOT_MQTT_PORT              8883 
```

ログ

```
16:26:51.128650 IP ip-xxx.ap-northeast-1.compute.internal.32862 > ec2-xxx.ap-northeast-1.compute.amazonaws.com.secure-mqtt: Flags [.], ack 343, win 295, options [nop,nop,TS val 1114204944 ecr 214004673], length 0
```

ログを見比べると、 .httpsが、.secure-mqtt に変わっていることがわかります。outboudのポートを制限して試したいところですが、一旦ここまで。。
SQLSTATE[HY000]: General error: 1364 Field **** doesn't have a default value

# MySQLのフィールドにDefaultが設定されていない場合のエラー

サーバー移行が終わって、さてちょっと検証するか、と思ったら以下のエラーが。。

```
SQLSTATE[HY000]: General error: 1364 Field **** doesn't have a default value
```
****にはフィールド名が入っています。

どうやら、データベースに登録しようとしたけれど、****のフィールドに何も入れてないからエラーになったよ、ということらしいです。


しかしおかしなことに、移行前のサーバーでは起きなかったんですよね。。


と思って調べたら、


### MySQLのバージョンによって動作が変わったみたいです。


#### 旧サーバーは以下

```
# mysql --version
mysql  Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
```

まあ正確にはMariaDBですが。。


#### 新サーバーは以下

```
# mysql --version
mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrapper
```

### MySQL5.5→5.7に変更したことによって起きたエラーなのです。

# 解決方法
### my.cnfに設定を追加

```
# vi /etc/my.cnf
```

my.cnfの一番下に以下の設定を追加します。

```
sql_mode=NO_ENGINE_SUBSTITUTION
```

MySQL再起動

```
sudo service mysqld restart
```

### 以上で、無事にMySQL5.5と同じく、default未設定のフィールドにデータを入れなくても、エラーにならないようになりました。
remote-jsでcommon Lispからjavascriptを送信

本記事は[Lisp Advent Calendar 2019](https://qiita.com/advent-calendar/2019/lisp) 19日目の記事です。

<font color="red">***遅刻しましたすいません！！！***</font>
前々から気になっていたremote-jsを使ってみました。もっと色々したかったのですが、時間の都合で動かしてみただけになってしまいました。

# remote-js
[remote-js](https://github.com/ceramic/remote-js)はcommon Lispからevalでブラウザに対してjavascriptのコードを送信することができます。

## 動かしてみた
- ubuntu18.04
- roswell 19.09.12.102  

```bash:インストール
ros install remote-js
```

```common-lisp
(ql:quickload :remote-js)
```
```common-lisp
(defvar context (remote-js:make-context))
(remote-js:start context)
```
websocketサーバーをスタートします。

```common-lisp
(with-open-file (stream (merge-pathnames #p"index.html" (user-homedir-pathname))
                        :direction :output
                        :if-exists :supersede
                        :if-does-not-exist :create)
  (write-string (remote-js:html context) stream))
```
htmlファイルを生成、remote-jsが接続するための最低限の中身を用意してくれます。
githubのissueにも上がっていますがデフォルトだとアドレスが0.0.0.0になっていてwindowsではうまく動かないため

```common-lisp
(remote-js:make-context 
                    :address "127.0.0.1")
```
こんな感じでアドレスを指定してあげる必要があります。

```html:index.html
<!DOCTYPE html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"></head><body><script>window.RemoteJS = {};
var RemoteJS = window.RemoteJS;

RemoteJS.send = function(data) {
  RemoteJS.ws.send(data);
};

RemoteJS.connect = function() {
  var ws  = new WebSocket("ws://0.0.0.0:40000/");

  ws.onmessage = function(evt) {
    (1, eval)(evt.data);
  };

  ws.onopen = function() {
    RemoteJS.send('connected');
  };

  ws.onclose = function() {
    setTimeout(RemoteJS.connect, 1);
  };

  RemoteJS.ws = ws;
};

RemoteJS.connect();</script></body></html>
```
生成されたhtmlファイルはこんな感じになっています。

```common-lisp
(remote-js:eval context "alert('hello!')")
```
このように文字列でjsのコードを送信するとindex.htmlを開いているブラウザ上でも
![Screenshot_from_2019-12-20_00-54-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256522/fb547752-891e-3873-3485-0a136674295e.png)
アラートが出ました。
他にも`document.write()`なども問題なく動作をします。

htmlのbodyに次のdivタグを追加して

```html
<div id="text"></div>
```

```common-lisp
(remote-js:eval context "document.getElementById('text').innerHTML='hello world!'")
```
を実行すると
![Screenshot_from_2019-12-20_01-04-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256522/451618b1-3856-e6ee-6f26-cfa37ceabb4b.png)
こんな感じでhello world!が表示されました。

# おわり
web系のlispプログラミングも調べれば調べるほど色々できて面白いですね。
今回動かすだけで終わってしまったのが残念なのでcaveman2と組み合わせてみたり色々試してみたいことはあるので何か活用してみたいと思います。

お付き合いいただきありがとうございました。
高校時代、数学ができないことで馬鹿にされてきた僕は機械学習エンジニアになった




## はじめに

現在、機械学習エンジニアとしてお仕事をしています。
一応、会社での立ち位置は機械学習エンジニアですが、SESなので、
やることは現場によってまちまちです。今は分析をしつつ推薦ロジックをつくっています。
まだ、この職について半年、実際に業務に携わって３か月くらいの新米のぺーぺーですが、
この半年を振り返りつつ、これからしたいこと、やってきた勉強などを書いていきたいと思います。

そして、私のような経歴の方で、機械学習に挑戦したい方の参考になればと思います。
綺麗事は、書くつもりはなく、ありのままの現実を書きますので、参考にしていただければ幸いです。


これは完全なポエムとなっています。ご了承を。
あと、僕のことを知ってる身内へ。
恥ずかしいので、あまり広めないでね。


## 私について

私は、地方私立Fラン大学出身です。
数学とプログラミングとは無縁の生活をしていました。

勉学と無縁だったと言っても過言ではありません・・・
（本当に勉強していなかったなあ・・・）

タイトルの通り、私は、高校時代に数学が大の苦手でした。
赤点だらけでしたが、なんとか補講でセーフの繰り返しでした。

そんな僕が機械学習エンジニアになりました


## 機械学習エンジニアになるまでの流れ

卒業後の私の流れ

契約社員
↓　転職
IT会社（けっこう地獄)
↓　退職
プログラミングスクール（行って後悔,途中でやめる）
↓
今、機械学習エンジニア


途中、結構省きましたが、気になる方がいれば、聞いてください。
ツイッターにいるようなキラキラエンジニアライフとは全く真逆の世界にいたので。
（よく見るあの世界は、本当にあるのか？？）

そんなこんなで今に至ります。

今の仕事に就くまでのプログラミング歴は、半年くらいでした。

IT企業にいたものの、プログラミングとは無縁の会社だったため（騙された）、
勉強しようと思いましたが、一人でやり切る自身はなかったので、
プログラミングスクールに入ろうと思いました。

その当時くらいがAIという言葉が流行り出したくらいでした。
当時の私も興味があり、入るならAIも勉強できるスクールを探そうと思い、
ネットで探していました。

１つヒットするところがあり、そこで相談会があり、
AIを勉強したいということを相談したら

**「うちのスクールではAIを学ぶことも可能だが、まだ、**
**まだAIエンジニアは仕事がない。なのでまずはwebエンジニアになってから**
**キャリアチェンジするくらいが市場ができあがると思うから、それからでいいんじゃないか？？**


なるほど。そういうものなのか。
当時、なにも知らない私はそのままスクールに入学。
そこでRubyを勉強していました。
ただ、自分のやりたいことと、勉強していることは違うと感じて、スクールをやめました。

じゃあどうやって機械学習エンジニアになるか考えた際に、


**なってしまえばいいのか**
と思いました。


そこからは怒涛の応募です。
あらゆるサイトから機械学習やデータサイエンティストを扱ってるサイトに応募しました。

ただ、返事が返ってきません。
それはそうです。

**機械学習エンジニアに必要な素養はまったくありませんでしたから。**


仕方ありません。
自分が今まで勉強しこなかったツケがこんなとこでまわるとは・・・・


ただ１社だけ、合格をくれました。
それが、今の会社です。


正直なんで私が受かったのかわかりません。
（怖くて聞けません笑）

##機械学習エンジニアになってから


入社してから研修でした。

**数学**
**数学**
**数学**

ひたすら数学でした。
コードがかければいいと思っていたので、正直研修の２か月くらいは地獄でした。


今でも覚えています。


**log**
ってなに？

って同期に聞いたのを笑


この２か月で

・線形代数
・微分積分
・統計

ここらへんを徹底的にやりました。
ただ、そんなの１、２か月で身に付く能力ではありません。


そんな付け焼き刃の能力では、今まで勉強してきた人たちには、
太刀打ちできないでしょうし、仕事を奪われていくと思います。

しかし、勉強をやめると理解のないまま時間は進んでいきます。
このジレンマは日々感じています。
正直どこに帰結するのかわかりません。

私は、現在も数学の勉強は続けています。
やっぱり圧倒的に劣っているのは数学力だなと感じているからです。
そして、絶対必要だなとも感じています。


数学は、説明する時に圧倒的に役にたちます。
これがあるのとないのとで、信用度が違います。良い意味でも、悪い意味でも。

## コーディング
数学を勉強し続けると今度はコードを書く時間がなくなります。
この塩梅がとても難しいです。

**データサイエンティストにはコーディング力は必要ない**

という人に会いますが、最低限として
自分の頭の中の数式や考えを不自由なくコードの起せなければ意味がないので、
ある程度のコーディング力は必要だと思います。

ただ、プログラミングを扱う身として、
アルゴリズムの理解は必要だと思っているので、今は、基礎的なアルゴリズムを理解しようと
勉強をしています。

正直遊ぶ暇はありません笑


でも、とても楽しいので続けることができますというのが現実です



## 今からデータサイエンティストを目指している人へ


これは数学に触れてこなかった人に向けて書きます。


正直数学の知識がないとなにも始まりません。
本当に数学が嫌いで、やりたくないという方はこの仕事は向いていないかもしれません。

ただ、僕も半年前まではそうでしたが、今は数学がとても好きになりました。
これは、同期と研修の講師のおかげです。彼らがいなければ、仕事を続けれていなかったと思います。

一人で、続けるのはとても苦しいかもしれません。
まずは、仲間を探しましょう。


[データラーニングギルド](https://guild.data-learning.com/)に参加するのが、
仲間探しにはいいかもしれません。

私のようなビギナーもいれば、驚くほど強い方がたくさんいます。
今のところ、私の投げた質問は１００%解決しています。

とてもおすすめです。



上を見ても、横を見ても、下を見ても強い人しかいない


私の同期の人が言っていました。
これは間違っていません。

若い方でも、かなり優秀な方がいます。
でも、こんなギリギリの世界はなかなかないと思います。
明日には自分の立場が危ういなんて世界はそうそうないと思います。
この状態を楽しむくらいの精神論は必要かと。


まだまだひよっこの私ですが、
これからも頑張ります。

会社の同期にはいつも救われています。ありがとうございます。
コミュニティのみなさまにも日々助けていただいていますありがとうございます。
pyenvを用いたPython3の環境構築 + PythonでHello World

## はじめに
本記事は[Volare Advent Calendar 2019](https://qiita.com/advent-calendar/2019/volare)の17日目の担当分です。
当記事では、Pythonを初めて使う人がPython3でHello Worldすることが出来るまでを取り扱います。

## もくじ
* この記事の対象
* 前提
* 手順
    * Homebrewの導入
    * pyenv/Pythonの導入
    * PythonでHello Worldする

## この記事の対象
macOS
Windowsは対象じゃありません、ごめんなさい。

## 前提
##### Xcodeがmacにインストールされている。
アプリケーション一覧から確認してなかったら、AppStoreからXcodeをインストールをしてください。

##### ターミナルが利用できる
commandキー+spaceキーでSpotlight検索を開いてterminalを起動します。
出てきた黒い画面(白い画面)にコマンドを入力し、環境構築を進めていきます。

## 手順

### 1. Homebrewの導入
HomebrewとはmacOS用のパッケージマネージャーです。
Pythonを動作させる環境もパッケージのひとつなのでHomebrewを用いてインストールする準備をします。
公式サイトは[コチラ](https://brew.sh/index_ja)です。

まず、Homebrewが導入されているか以下のコマンドで確認します。

```bash:terminal
$ which brew
``` 
`/usr/local/bin/brew`と表示されているとすでにインストール済みなのでこのステップは飛ばして大丈夫です。
なにも表示されなければインストールされていないので以下のスクリプトをターミナルで実行してインストールしてください。

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

もう一度以下のコマンドを実行して`/usr/local/bin/brew`と表示されればHomebrewのインストールは完了です。

```
$ which brew
```

### 2. pyenvの導入
先ほどインストールしたhomebrewを用いて、pyenvをインストールします。
以下のスクリプトをターミナルで実行。

```bash:terminal
$ brew upgrade
$ brew install pyenv
```
.bash_profileに追記

```txt:.bash_profile
export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
```

以下のコマンドを実行して`/usr/local/bin/pyenv`と表示されたらpyenvのインストールは完了です。

```bash:terminal
$ which pyenv
```

次にインストールしたpyenvを使ってPythonをインストールします。
Atcoderで使われているPythonはPython3.4.3なので以下のように設定します。

```bash:terminal
$ source ~/.bash_profile
$ pyenv install 3.4.3
$ pyenv global 3.4.3
```
以下のコマンドを実行して設定したPythonのバージョンが表示されたらPythonのインストールは完了です。

```
$ python -V
```

### 3.PythonでHello Worldする
エディターを使ってプログラムを書いていきます。
この記事では、Microsoft社の無料のエディタであるVScodeを使って進めていきます。

以下のリンク先からVSCodeをダウンロードする。
[Download Visual Studio Code](https://code.visualstudio.com/download)

Visual Studioを起動する
<img width="513" alt="スクリーンショット 2019-12-20 1.52.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318449/9d3e43bc-4b89-c5f9-525d-f57466d21c6f.png">
こんなかんじで起動できたらOK

一旦ターミナルに戻ってフォルダを作るために以下のコマンドを入力。
操作が終わった後もターミナルは消さずに残しておく。

```bash:terminal
$ cd ~/Desktop
$ mkdir Study_Python
$ cd Study_Python
$ touch main.py
```
デスクトップに出来たStudy_PythonフォルダをVScodeにドラッグする。
VScodeの画面左端のmain.pyを押して以下のようになってるとOK
<img width="513" alt="スクリーンショット 2019-12-20 2.02.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318449/1a5e5609-6cf9-1889-6c8e-b71f25ed4bf0.png">

ここに以下のプログラムを記入

```python:main.py
print('Hello World')
```

ターミナルに以下のコマンドを入力

```bash:terminal
python main.py
```

うまくいっているとターミナルに`Hello World`が出力されていると思います。
今後ここにプログラムを書いて[今後のプログラムの学習](https://qiita.com/kgrlizst/items/ef1e232e85322e143ce7)を進めていきましょう！
Mac自動化の落とし穴——闇のツールMurGaa Recorder



## 前置き

これは僕がまだ20代前半のころ、駆け出しのデザイナーだったときのお話です。

そのときは、開発中のWebアプリケーションへ、入力手順が複雑だけど内容は同じで良いサンプルデータを何十件と登録しまくるという作業を手伝っていました。当時の自分にDBを直接いじる手立てはなく、まともに使える手段はGUIからのマウス／キーボード操作だけ。

**どうにかして、この不毛な繰り返し作業を自動化できないか?**

そのときに見つけたのが、今回紹介する闇のツール[MurGaa Recorder](http://www.murgaa.com/macro-recorder-mac/)です。

## Murgaa Recorder

[MurGaa Recorder](http://www.murgaa.com/macro-recorder-mac/)は、Mac用の強力なマクロツールです。

このツールを使うと、キー入力やマウス操作を完全に記録して再現することができます。それだけではなく、**マクロの反復回数や再生速度倍率の変更まで可能**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48238/2e149bc7-b6f9-9f2e-9672-fb85268059cd.png)

（上図）実際はa.b.ボタンを押す動作まで記録されてしまうので、ショートカットキーを登録して記録することを推奨します。

前置きにあったデータ登録の量産作業であれば、**1回分の作業を記録して10倍速でリピートさせれば、あとは眺めているだけで一瞬で作業が終わる**ことになります！

さらに、記録したマクロはXMLファイルに書き出しと読み込みができます。これを同僚に配ってさらに量産効率を高めることも可能になりました。

この革命的とも言える効率化手法を発見した僕は、その闇の力に魅入られてしまったのです。

## GUI操作自動化の落とし穴

しかし、MurGaa Recorderは決して賞賛できる手法ではありませんでした。

### マクロを記録したときの環境を再現しにくい

記録したマクロと完全に同じGUI環境を整えなければ、マクロを再生しても期待した通りに動作しません。

画面サイズ・ウィンドウサイズと位置・OS／ブラウザの表示設定など、パソコンのGUIには数多くの状態があり、これらを記録したときの状態と揃える必要があります。たとえ同僚に自分のマクロを渡したとしても、ほとんどの場合うまくいきません。

### 記録時と再生時でタイミングが合わない

スペックの違い・PCへの負荷のかかり具合・サーバのレスポンスの違い・ネットワーク速度の違いなど、時間的な不確定要因によって、記録したマクロは簡単に想定外の挙動を引き起こします。

サーバに情報を送信したあと、ブラウザが処理を完了させる前にマクロの次の操作が始まってしまうことはザラでした。その部分も加味してマクロの再生速度をチューニングすると、当初の期待ほど再生速度を上げることはできませんでした。

### 間違った操作が始まっても止まらない

最も恐しいのが、何かの間違いでマクロが想定外の挙動を始めても手動で停止させるしかないことです。もし**マクロが10倍速で動いていた場合、誤った操作も10倍速で実行される**ことになります。記録した操作が少しズレてしまうだけで、自分のPCやサーバ上のデータを予期しない型で壊してしまうことにもなりかねません。

結局、マクロの動作中は変なことが起きないか目視で監視する必要があったため、ここでも期待したほど楽をすることができませんでした。

## おわりに

MurGaa Recorderはどんなものでも反復処理できるため便利な側面もありますが、GUIの自動化に伴う深い闇も教えてくれました。
(あとで知ったことですが、RPAやE2Eテストツールでも同種の難しさがあるようです。)

特にマクロが意図しない動作をしたときの被害は予想がつきにくいため、MurGaa Recorder使う場合は自己責任でお願いします！
放浪系DataScientist見習いのキャリア、業界観

##はじめに

さて人生初のQiitaである。[^0]
データ分析、自分のキャリアという題材で、お声がけ頂いたので何か書く。

場所は欧州最西端、ポルトガルの某都市のカフェ。
Fad[^1]の情熱的な調べに浸かり、大西洋にほど近い海岸からの風が大航海時代へと思いをいざなってってくれる。私はコーヒーを片手にMACBOOKPRO[^2]を開き優雅にドヤリングする。

…と雰囲気についてうそを書いても別に誰にもばれないのだが、現実の光景は雑多な道沿いの薄暗いBar兼Cafeでこの記事を〆切に追い詰められつつ書いている。店の外ではお薬売りの兄ちゃんが旅行客に対して一時期の歌舞伎町の客引きのごとく声をかける。耳を澄ますと聞こえてくるのは波の音ではなく、“お薬あるよ。”の声。　隠語とか使ってほしい。

本題に移る。

##想定読者
自分はデータ分析の分野は駆け出しもいいところで有識者に有意義なことは何も書けない。ある程度年齢を重ねてそれなりな仕事をしているが最近Data Scienceに興味を持って参入した、もしくは学習を始めたというタイミングの人ならばひょっとしたら得何らか共感くらいはあるかもしれない。思ったことをつらつら書く。

##自己紹介
欧州在住で働いていて欧州内をぶらぶらとしている三十代後半日本人。
以前は全く違う専門のキャリアで近年スキルを磨いていたつもりだったのだけど、大都市、大企業以外での転職需要が想像以上に少なく、比較的小さな都市でも仕事を見つけられるよう人生のフレキシビリティを求めてこの界隈に流れてきた。文系ではあるが、一時金融工学で多少数学と統計は多少学んだので、行けるんじゃないだろうかと勘違いをした。今年の夏、欧州の別の国でよくあるBootcampを受けたりして社内でのDataScientistの真似事みたいな仕事を初めてみた。

##データ分析界隈
ただ段々と気づいてきたのが、この業界は未経験のおっさんが後から参入するにはさほど魅力的な領域ではないんじゃないかということである。[^3]
もちろんDataScientistに簡単になれると夢を見させた方がメリットがあるステークホルダは多いが中々現実は厳しい。
一般的に日本の会社の構造上、若いころは搾取されがちで年を取ってから役職なりなんなりで下駄をはかせてもらえる。実力勝負という言葉は非常に魅力的ではあるが、それを魅力的に思っていいのは実力がある人か、もしくはそれ以上に搾取されている人々である。均等に搾取されてきた後に年を経て実力主義に飛び込む。考えうる限りマゾなんじゃ？と自分の性癖を疑いかねない状態である。

実際問題全く未経験の分野でおっさんが鎬を削るのは厳しい。なぜならば自分より若い人材が自分より経験を持ってたりするからである。つまり経験も実力も劣る人材が、この中途半端に儒教の思想を残すこの国で戦っていく必要がある。[^4]ひとえに言うと立場ない。ましてやこれからは様々学習環境がそろってきて学部大学院で正規の教育を受けてきた20代が大量になだれ込んでくるだろう。

非常にホットなマーケットではあるのだけどかなり近い将来、あっという間に低レベル人材が淘汰されるような気がする。Top Tierは関係ないが自分のような層には正直長期的に見て余り美味しい市場ではないのではないかと疑っている。しかもめっちゃ苦労して身に着けたスキルの大半がものすごい勢いでスキルが陳腐化するであろうことは容易にを想像がつく。

まあ立場なんか気にする人間はそもそもこんな動きはしないわけで、それをどう考えるかは各人の自由。扱ってる対象が結構面白いのは救いではある。

**実力主義が魅力的に映るのは若手**


##参入、および学習のハードル
現時点でそれなりの職についている方が本当に移るほど中長期的に魅力がある業界なのかという点については真剣に考える必要があるが、仮にそこは棚上げすることにする。問題になるのが、現時点では割と業界へ入るのも現時点ではハードルが高いという事実である。スキルが無いと入れないが、そのスキル自体がこの業界に入らないと身に着けにくかったりする。
完全に素人独習で進めると何が必要なのかもわからずめっちゃ効率悪い。高額なプログラミングスクールが蔓延るのもよくわかる。

東京にお住いの方々は東京のネガティブなところを見がちではあるが、殊こういう新しいジャンルの学習環境に関しては異常に恵まれている。人口は力である。海外では、もちろんロンドンやLAに住んでいて英語に困らなければ問題ないが、そもそも勉強会がかなりレアだし、現地語が多少喋れる程度でその輪に入るのが難しい国も割と多い。


##ラーニングギルド
そういった点ではこのオンラインサロンは海外に限らず地方勢に結構おすすめである。

対象によってそれぞれの有効活用の方法が考えられるが、仮によちよち歩きのし始めた人にとってはこのギルドはなかなか暖かいコミュニティである。有識者の会話からは現状の業界構造の問題点や、習得すべきスキルが見えてくる。また代表の村上さんは講師経験もあるせいか自分のような初学者に対して絶妙にアドバイスをくれたり。色々な気付きを与えてくれたりもする。本来この種のコミュニティでは参加者はGiverでありTakerであるべきだが、現時点では正直自分はTakeの割合が高いと思う。

まあ将来どういうコミュニティになるかは全然わからないのではあるが、現時点では学びの多い仮想空間である。

##これから
突然クロージングに移ることにする。〆切の時間の都合である。[^5]:俺たちの戦いはこれからだ。[^6]:

正直数年後自分のキャリアがどうなっていくかは、どこに住んでるかと同じくらい見えない所ではあるがとりあえず当面このまま突っ込んでいこうと思う。ガツガツ新しいスキルを磨きつつ、実戦に投入していきたい。

ダメだったら戻るか別の道を探しますわ。ではどこかでお会いしましょう。

[^0]: タイトルは投稿直前まで必要とわかってなくて勢いで書いた。内容と若干ずれてる気もする。
[^1]: もし一度も聴いたことなければ、ググってみてもいいかもしれない。筆者はフラメンコの曲より好みである。[Wikipedia](https://ja.wikipedia.org/wiki/ファド)
[^2]: だいぶ古いためまれに異音が旧車會のごときハーモニーを奏でる。
[^3]: 身も蓋もない主張ではある。
[^4]: 日本の場合
[^5]: というか〆切はすでに過ぎている。
[^6]: 応援ありがとうございました。Yan先生の次回作にご期待ください[坂道](https://images.app.goo.gl/kkzsW6tSQhdeNn1A6)
Raspberry PiとEWI USBでSD-90を吹く

## はじめに
サイバーマンデーで管楽器のようなMIDIコントローラ「EWI USB」を買ったので、
なぜかみんな持ってる音源モジュール「SD-90」をラズパイを使ってEWI USBで演奏できるようにしました。

PCでも同等のことは可能ですが、今回の方法ではラズパイの電源を入れるだけで演奏可能な状態になる
半スタンドアロン的な形にできます。発音の遅延も少ないので頑張ればライブとかで使えるかも。

## 使ったもの
* Raspberry Pi
    * USBポート2つ（SD-90とEWI USB用）があり、RaspbianがインストールできるモデルならOK
* セットアップ用のPC
    * Raspberry PiとEWI USBの設定に使う
* SD-90
* EWI USB
* [Akai EWI USB Control 1.3.2](https://www.cognitone.com/downloads/index.stml?p=5)
    * EWI USBの設定に使う。公式のツールでも可能だけど挙動が不安定で扱いにくいのでこっちにした
* スピーカー
    * SD-90に繋げて音を鳴らす

## EWI USBのセットアップ
EWI USBは初期設定だと吹いたときの息の強さをMIDIのVelocityに動的に反映してくれるのですが、
それによってSD-90の出音の音量が決まってしまうため、一音目がかなり小さくなりがちでした。

なのでAkai EWI USB Controlを使ってVelocityは好みの値に固定にして、
Breath CCをVolumeなどに割り当てるのが良さそうです（まだ手探り状態）。
設定はEWI USB側に記録されるので、この後ラズパイにつなぎ替えた後も保持されます。

## Raspberry Piのセットアップ
Raspbianがインストールされている前提です。今回はRaspbian Buster Liteで動作確認しています。
以下の手順で、ラズパイ起動時にSD-90とEWI USBを自動でルーティングする設定を仕込みます。

### SSH接続
ラズパイにSD-90とEWI USBを接続した状態で、PCからSSH接続します。
筆者はPCとラズパイをLANケーブルで直結して`raspberrypi.local`でアクセスしてます。

### MIDI接続の確認
`aconnect -l`コマンドで接続されているMIDIデバイスが確認できます。

```shell-session:表示例
pi@raspberrypi:~ $ aconnect -l
client 0: 'System' [type=kernel]
    0 'Timer           '
    1 'Announce        '
client 14: 'Midi Through' [type=kernel]
    0 'Midi Through Port-0'
client 20: 'SD-90' [type=kernel,card=1]
    0 'SD-90 Part A    '
    1 'SD-90 Part B    '
    2 'SD-90 MIDI 1    '
    3 'SD-90 MIDI 2    '
client 24: 'EWI-USB' [type=kernel,card=2]
    0 'EWI-USB MIDI 1  '
```

MIDIデバイスのルーティングは`aconnect "sender" "receiver"`の形です。
なので今回の場合は`aconnect EWI-USB SD-90`で接続できます。

この時点でEWI USBを吹けばSD-90の音が鳴らせる状態になりますが、
毎回このコマンドを打たずに済むように起動時に実行されるスクリプトに上記コマンドを追記します。

### 起動時スクリプトの設定
起動時に実行される`/etc/rc.local`に上記のルーティング用コマンドを追記します。
`sudo vi /etc/rc.local`で以下のような感じに`exit 0`の手前に追記しました。

```shell-session:/etc/rc.local
# Connect MIDI devices
aconnect EWI-USB SD-90

exit 0
```

## 吹いてみる
SD-90で好みの音を選択して、EWI USBを吹いてみて音が鳴れば完成です。
EWI USBで音色選択ができるともっとうれしいけど、割り当てられるCC的に難しいかも。。

## 参考
* [EWI USBで設定可能なMIDI CC（コントロールチェンジ）について](http://sir.cocolog-nifty.com/blog/2019/09/post-fdeb06.html)
* [windsynth @ ウィキ｜他の音源の制御](https://w.atwiki.jp/windsynth/pages/38.html)
* [Raspberry piでUSB-MIDIとレガシーMIDIのお手軽相互変換](http://www.dm9records.com/index.php/raspberry-piusb-midimidi/)
Postmanからカスタムコネクタを作成するときのTips

# まことにすみません

本件は、Power Apps Advent Calendar 2019 の記事ですが
アップにかなり時間を要しました。
ほんと、すみません。

# カスタムコネクタ

Power Apps および Power Automate には、既に数多くのコネクタが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/2361fbfa-8d9f-10ba-a9f7-582a1700029c.png)

が、そこに存在しないAPIを使いたい場合は、HTTPコネクタを使用するのも手ですが
オリジナルのコネクタを作成するという機能があります。

## どこから行くの？？

メニューからデータ＞カスタムコネクタ　でアクセス可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/09a01cd6-ce18-0432-7583-068fa2ebc68a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/ebb2ea03-e10f-19e2-a09c-40af89149d7d.png)

## 新規作成メニューを開いてみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/0ab51066-2090-e631-68bc-c9846e63eb52.png)

Postman コレクションを使うことができます！
APIのテストでよく使うPostman！
そのセーブデータがそのまま使用できちゃうのです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/6829cc0a-a5d4-9a57-7911-da3ebf048197.png)
データ形式はV1のみ対応しているようですので、PostmanからExportしちゃいましょう！

# Postman

## エクスポート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/6177de4b-f45a-1779-cedf-18a5608f856e.png)

対象のコレクションのメニューから「Export」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/457b0106-b67c-c235-24ff-9dc55b8e48d0.png)

読み込み可能なバージョンはV1なので、V1を選択してExportしちゃいましょう。

## 動的パスの指定の仕方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/279c5cab-fd52-322b-617d-aa21e6e34ad2.png)

この赤枠で示すような、URLが動的に変化するようなAPIの場合は、Postman側では以下のように設定しましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/8e4533fc-3597-72d9-da5c-25cb8dee711a.png)

```
https://XXXX.com/public/zzzzz/:<Key名称>
```

すると、Paramsタブが以下のように変化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/fe004418-7ad8-2da0-770b-422aaff49234.png)


# まとめ

というわけで、Postmanのコレクションからカスタムコネクタを作成するときのTipsを簡単にまとめてみました。
実は、私もこれハマってたところ Twitterにて [idea.toString();](https://idea.tostring.jp/) の管理人でおなじみの
@hrfmjp さんに教えてもらいました！本当にありがとうございます！
Ubuntu 18.04 LTS上にGitLab CEをdocker-composeで構築する

この記事は、シリーズ記事「[「C#のライブラリプロジェクトをGitLabにpushしたら自動でDLLが書き出されてついでにDocFXで作成されたドキュメントがCloud Run上にデプロイされる」っていうやつをやる](https://qiita.com/soumi/items/c13668052209a35a0965)」の一部です。

# はじめに

とりあえず ``docker`` を入れておけば、何かサーバーを立ち上げたいと思った時にさくっと立ち上げる事が出来て便利ですよね。
今回はそんな ``docker`` と ``docker-compose`` を使用して、GitLab CE が動作するサーバーを立ち上げてみます。

Ubuntu 18.04 LTS 上に ``docker`` と ``docker-compose`` がインストールされている前提で進めていきます。
サーバーのセットアップについては、以前書いた記事がありますので良ければ見てみて下さい。

[Ubuntu 18.04 LTS にDocker環境をインストールする](https://qiita.com/soumi/items/5b01d88c187b678c0474)

# TL;DR;

環境が整っていれば、

## 1. 以下の内容のファイルを用意して

```docker-compose.yml
version: '3'

services:
    git:
        image: 'gitlab/gitlab-ce:12.4.2-ce.0'
        restart: always
        hostname: 'gitlab-ce'
        ports:
            - "80:80"
            - "22:22"
        environment:
            GITLAB_OMNIBUS_CONFIG: |
                external_url 'http://localhost'
                gitlab_rails['lfs_enabled'] = true
                gitlab_rails['lfs_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/lfs-objects"
                gitlab_rails['time_zone'] = 'Asia/Tokyo'
        volumes:
            - ${PWD}/config:/etc/gitlab
            - ${PWD}/logs:/var/log/gitlab
            - ${PWD}/data:/var/opt/gitlab
```

## 2. 同じディレクトリで以下のコマンドを実行するだけです

フロントエンドで立ち上がって、ログなどが見れる

```
docker-compose up
```

or

バックグラウンドで立ち上がる

```
docker-compose up -d
```

# ymlの設定について

## 使用するイメージ

```yml
image: 'gitlab/gitlab-ce:12.5.3-ce.0'
```

[DockerHub](https://hub.docker.com/)にアップされているイメージを使用します。
GitLabCE イメージのタグ一覧は以下から見る事が出来ます。

https://hub.docker.com/r/gitlab/gitlab-ce/tags

## ポート設定

```yml
ports:
   - "80:80"
   - "22:22"
```

マウントするポートです。
GitLab CE が使用しているポートを素直にそのままホストのポートにマウントしていますが、

```yml
ports:
   - "8080:80"
   - "2222:22"
```

のような設定ももちろん可能です。

## GitLabの設定

```yml

environment:
    GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost'
        gitlab_rails['lfs_enabled'] = true
        gitlab_rails['lfs_storage_path'] = "/var/opt/gitlab/gitlab-rails/shared/lfs-objects"
        gitlab_rails['time_zone'] = 'Asia/Tokyo'
```

GitLab CE の設定です。
他に、それぞれの設定が環境変数を持っているようで、それを直接指定する方法もあるようなのですが、対応する環境変数を探すのが面倒だったのでこの方法にしました。

あまりちゃんと試していませんが、ざっくりとこの辺りに書いてある事なら設定できるような気がしています。

https://docs.gitlab.com/omnibus/settings/configuration.html

ちなみに、``external_url `` は立ち上がっているサーバーのipか、外向けのサーバーならドメインを指定する必要があります。

## マウントするボリューム

```yml
volumes:
    - ${PWD}/config:/etc/gitlab
    - ${PWD}/logs:/var/log/gitlab
    - ${PWD}/data:/var/opt/gitlab
```

設定と、ログと、データそのものをバックアップしたかったので、僕は上の3つをホストにマウントする事にしました。
これによって、単にUbuntu上でデータをコピーするだけでバックアップできるようになります。

ちなみに、 docker-compose.yml と ``docker`` 環境さえあれば windows でも起動できますが、**現時点では仕様上 windows に docker のファイルをマウントできないので、ご注意ください。**

# 終わりに

ソースコードは大分センシティブものなので、クラウドに預けるのはまだ抵抗がある、という人は多いと思います。機密なデータを扱っていればなおさらですね。
オンプレミスで GitLab のサーバーを立ち上げていれば、イントラのみでの運用にできる等運用の柔軟性が生まれ、なおかつ ``git`` を使用したバージョン管理システムの恩恵が受けれるので、お勧めです。
「C#のライブラリプロジェクトをGitLabにpushしたら自動でDLLが書き出されてついでにDocFXで作成されたドキュメントがCloud Run上にデプロイされる」っていうやつをやる

# はじめに

京都のUI/UXデザイン事務所でデザイナーをしています。
この記事を含む一連の記事は、

[softdeviceのみんなでゆるく記事を書く。 Advent Calendar 2019](https://adventar.org/calendars/4795)

の12/4～12/9分の記事として公開しています。

# 今回のシリーズ記事について

今回は以下のような構成で記事を書いていきます。

1. [Ubuntu 18.04 LTS上にGitLab CEをdocker-composeで構築する](https://qiita.com/soumi/items/baaa35b37f6c90a66c0c)
1. [C#でドキュメントつきライブラリプロジェクトを作成する](https://qiita.com/soumi/items/ddb81dc02ea445081aa4)
1. [GitLabにWindowsのrunnerを追加する](https://qiita.com/soumi/items/3344dc2fa9538929390b)
1. [GitLabのCI/CDパイプラインでC#のDLLとドキュメントを書き出す](https://qiita.com/soumi/items/ae24cf779ca539b875d6)
1. [GitLabのCI/CDパイプラインからCloud RunにC#のドキュメントをデプロイする](https://qiita.com/soumi/items/0047301ebefabc837dad)


全体として、  

**「C#のライブラリプロジェクトをGitLabにpushしたら自動でDLLが書き出されてついでにDocFXで作成されたドキュメントがCloud Run上にデプロイされる」っていうやつをやる**  

ために必要な要素なのですが、それぞれの記事単体でも読めるように書いているつもりです。
(最後の三つだけは直接的な関連性がありますが)

タイトルにするとかなりややこしい話に感じますが、CI/CDという言葉を知っている人なら、結構すぐにやりたくなるような事なんじゃないかなと思っています。
僕もCI/CDという言葉や、こういった事が出来る事は知っていたのですが、中々難しそうで手が出せていませんでした。

今回不便が重なったので思い切って取り組んでみたのですが、その背景や経緯を書いておこうと思います。

## デザイン事務所とプロトタイピング

デザイナーというと絵を描いているイメージが強いかと思いますが、そもそもデザイン(design)は設計という意味なので、原理主義的に言うとデザイナーは「設計する人」になります。「絵を描く」というのは、デザインしたものの表現手段の一つ、という事ですね。

UI/UXのデザインでは、単体画面の構成や綺麗さだけでなく、画面遷移やその整合性等を統合的に考えてデザインしていく必要があります。そういったものを検討する上では、**想像上で検討するよりも実際に動くものを作った方が圧倒的に提案の説得力が上がります。**

絵を描いて表現するのと同じように、プロトタイピングを作って検討したり、そのプロトタイプを用いてプレゼンテーションしたりする事もデザインしたものを表現する手段の一つになるのです。


## プロトタイピングとプログラミング

プロトタイプを作って確認する、あるいはプレゼンテーションするというプロセスを、古くは Hypercard の時代からやってきているのですが、ツール自体は Adobe Director、 Adobe Flash(現Animate) と変遷してきて、最近では Unity を使う事が多くなってきています。最近は HTML + CSS + Javascript も強いので、Vue や electron を使う事もあります。

ちなみに僕がちゃんと使った事があるのは Flash からです。年齢が分かりますね。

こういったツールを使用してプロトタイピングをする事になるのですが、**インタラクティブなものを作る時は必ずと言っていいほどプログラミングをする事になります。**

## プログラミングとライブラリ化

プログラミングをしているとしばしば

> この機能、前も作ったじゃん！

となり、

> これ使いまわせるようにしたいな…

ときて、

> **どうせ使いまわすならスマートにやりたい**

となるわけです。

Flash で AS3 を使用していた時代でも、``compc``を使用して swc を書き出し、``asdoc`` を使用してドキュメントを書き出していました。Unity の場合は C# のライブラリを作る事になるので、Visual Studio を使ってDLLを作成しています。

## ライブラリ化と.NET Framework & Macの壁

しかし…

Unity の C# は .NET Core ではなく .NET Framework 系なので、ビルド(DLL化)する時に Windows 環境が必要になります。そしてデザイン事務所あるあるなのですが、**基本的にみんな Mac を使ているので、ほとんどのスタッフの端末でビルドが出来ません…**

しかし Mac で Unity を使っているユーザーも当然いて、そういったユーザーからライブラリを作成したい、あるいは既存のライブラリに追加したいという要望も出てきます。

## .NET Framework & Macの壁をCI/CDパイプラインで解決する

CI/CDパイプラインを使ったビルドを使うと、こういった状況を一気に解決できます。
導入前はライブラリに更新があるたびに Windows を使っているスタッフ(僕とか僕とか僕)がビルドを実行して結果を共有していましたが、**ソースを書いてGitLabにpushさえすればいつでもだれでもビルドを実行する事ができ、しかも変更が即座に反映されます。**

また、DLLライブラリはドキュメントを共有するのが意外と大変で、せっかく作った機能も使い方が伝わっておらず、中々使ってもらえなかったりしたのですが、今回はドキュメントの書き出しとデプロイも自動で行うようにしたので、その点も一気に解消しました。

# おわりに

今回も、僕が実際に構築する上でつまずいたポイント等をまとめています。
同じところでつまずいていている方や、やってみたかったけど躊躇していた方の一助になれば幸いです。
Yumemi.vue #4 の報告アプリを作ってみた - 前編 -

こんにちは、カメドットです。

## 今日のテーマはこれ何？
Yumemi.vue ( https://yumemi.connpass.com/event/157720/ ) 勉強会に参加してきて
宴で報告アプリを作ってみました

## なぜ報告アプリ？
最近巷のXR界隈で、「今どきは、スライドより実物だよねー」と言われて、
それなら話を聞いて参考になったところもアプリにしてみようとおもいました
*普通のゲームより演出軽くて、いけそうという強かな狙いもあったりします（ぇ

## 開発校生
Excel+Unity 2018.4 で作成しました。

## アップロードしたもの
勉強会で、聞いた内容の全編をまとめた内容が以下です
!(^^)!
https://unityroom.com/games/yumemi_vue_report

## これからの課題
自作品では、ゆめみちゃんのキャラクターの画像を追加する
XR関連でも、報告してみたい心持
単体/結合テストの違い

以下のTwitterをみて、自分でもこのへんの言葉ちゃんと説明できないな、と思ったのでちょっと整理しようとしてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">さらっと書かれているけれど、特に「単体テスト」「結合テスト」についてはフェーズとレベル、どちらも同じ単語で表現されることが多いので混乱が生じがち。<br>JSTQBの用語集を見ておくとこの辺りの違いが理解できて良いです。 <a href="https://t.co/QGEEetcyzL">https://t.co/QGEEetcyzL</a></p>&mdash; しましま(偽) (@shimashima35) <a href="https://twitter.com/shimashima35/status/1184638625633325056?ref_src=twsrc%5Etfw">October 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こちらのTweetで言及されている、用語集というのは、おそらくこの2つ。

ソフトウェアテスト標準用語集： http://jstqb.jp/dl/JSTQB-glossary.V2.3.J01.pdf
JSTQBシラバス： http://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018.J03.pdf

引用もこの2つから行っています。

## テストレベルとしての考え方
Twitterで言及されている順序と違いますが、まずはテストレベルから整理してみましょう。
テストレベルとは、以下のように説明されています。

> 系統的にまとめ、管理していくテストの活動のグループ。各テストレベルはプロジェクトの特定の責務と対応付けができる。テストレベルの例には、コンポーネントテスト、統合テスト、システムテスト、受け入れテストがある。

まさにテストの「レベル」、あえて日本語にするとすれば、段階とかそういう概念なのかな、と思います。

そして引用中にあるように、テストのレベルの中には、単体テスト/結合テストという言葉は**ありません。**
それに対応するのは、用語集を見る限り、**コンポーネントテスト**、**統合テスト**という言葉になりますね。

ではそれぞれどういう物を指すのでしょうか。

### コンポーネントテスト
> コンポーネントテスト（component testing）： 個々のソフトウェアコンポーネントのテスト。

ふむ。個々のコンポーネントに対するテスト、というのはわかります。しかし、コンポーネントとは具体的にはどのようなものを指すんでしょうね。他の用語からヒントを探ってみましょう。以下はシラバスでのコンポーネントテストの解説になります。

> コンポーネントテスト（ユニットテストまたはモジュールテストとも呼ばれる）は、個別にテスト可能なコンポーネントに焦点をあてる。コンポーネントテストの目的は以下の通りである。

> - リスクの軽減
> - コンポーネントの機能的/非機能的振る舞いが設計および仕様通りであることの検証
> - コンポーネント品質に対する信頼の積み上げ
> - コンポーネントに存在する欠陥の検出
> - 欠陥がより高いテストレベルまで見逃されることの防止

> 特にコード変更が継続して行われるインクリメンタル開発モデルやイテレーティブ開発モデル（アジャイルなど）では、コンポーネントテストのリグレッションテストを自動化して、変更が既存のコンポーネントを破壊していないという信頼を積み重ねていくことが重要である。

長めに引用しましたが、重要なことは**「個別にテスト可能なコンポーネント」**という言葉。つまり個別にテスト可能なソフトウェアの部分であればそれはコンポーネント足りうる、ということです。

一見言葉遊びみたいになっていますけれど、テストができるということは、つまりそのコンポーネントの振る舞いを定められる、すなわち仕様を定義できる、ということになります。

関数、クラス、モジュールなど様々な単位が考えられますが、仕様を定義可能な範囲がコンポーネントであり、そのコンポーネントに対するテストがコンポーネントテスト、ということですね。

### 統合テスト
では結合テストとはどのようなテストでしょうか。まずは定義を見てみましょう。

> **統合テスト（integration testing）**： 統合したコンポーネントやシステムのインターフェースや相互作用の欠陥を摘出するためのテスト。component integration testing, system integration testing も参照のこと。

> **コンポーネント統合テスト（component integration testing）**： 統合したコンポーネント間のインターフェースや相互作用の欠陥を検出するためのテスト。

> **システム統合テスト（system integration testing）**： システムやパッケージを統合して行なうテスト。
外部機構とのインターフェース（たとえば、電子データ交換やインターネット）をテストすること。

と、かなり広い概念です。
これはコンポーネントの粒度がテスト対象によってバラバラなのですから、その統合レベルも自然とブレが発生してしまうわけですね。

というわけで、レベルとしてコンポーネントテストと統合テストという段階があるのがわかりましたが、実際の粒度はテスト対象のシステムや組織の体制によって異なる、と言えるのではないでしょうか。

## テストフェーズとしての考え方
では、テストフェーズとしては、単体テストや結合テストに対応する概念はあるのでしょうか。定義を見てみましょう。

> **テストフェーズ（test phase）**： テスト活動をプロジェクト中で管理（マネジメント）しやすいフェーズにまとめたセット。たとえば、あるテストレベルの実行活動。

この言葉からわかるように、テストフェーズというのはあくまで管理上の視点にすぎません。そして実際には、そのフェーズではどのレベルの実行をどの程度やるのか、ということが重要になります。

## 結局はテスト設計
このあたりの議論を突き詰めていくと、結局は「どのような単位でテストを管理してフェーズにまとめ、各々のフェーズでどのようなテストレベルの活動をするのか」というテスト設計が重要になってくるわけですね。

最終的に結合するシステム全体の複雑度から逆算して、コミットごとのごく細かいレベルでのテスト、イテレーション毎のある程度大きなテストイベント、最後のQAフェーズと、各段階でどのようなテストを行うのか。
そのように考えると、じつは最終のシステム全体以外は、全てテスト可能なコンポーネントごとにテストしているわけで、ある種のコンポーネントテストですし、直前のテスト段階よりも大きな塊の結合をしているので、ある種の統合テストである、といえます。

テストフェーズという観点でまずテストするチェックポイントをある程度見定めて、各チェックポイントにおいて何をテストするのか。

このあたりを考えないといけない、ということですね。