OmniAICreator/Qiita-1.07M huggingface dataset:
メモ：「３０日でできる！OS自作入門 」5日目

## 構造体、文字列表示、GDT/IDT 初期化

1) bootinfoの情報とscreenの情報ポイントを使って受け取る
見た目は特に変化なし

2) 構造体使う

```
struct BOOTINFO {
  char cyls, leds, vmode, reserve;
  short scrnx, scrny;
  char *vram;
}
```

- `binfo　= (struct BOOTINFO *) 0x0ff0;` // 構造体ポインターとしてキャスト
- `xsize = (*binfo).scrnx;` // (*binfo) 構造体ポインターからフィールドの値を取り出す

構造体のフィールドアクセス `binfo.` と構造体ポインターのフィールド `(*binfo).` アクセスの説明とか

３） では -> の使い方

```
init_screen(binfo->vram, binfo->scrnx, binfo->scrny);
```
良さそう

4) 文字の出力 (Aという文字を出してみる）

こんな感じで定義して

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

vram に 1 pixel ずつ書き出す。

![スクリーンショット 2018-12-21 0.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/109145/a466bc5f-70cb-715d-6068-2989f6ccb72a.png)

5) フォントいっぱい使う (makefont と bin2objというツールが増えた）

一文字16バイト。256 * 16 = 4096

６文字を個別に描画した結果

![スクリーンショット 2018-12-21 0.31.06.png](https://qiita-image-store.s3.amazonaws.com/0/109145/f571508b-e6aa-dbfd-7b6d-bc5a70e23a27.png)

6) 文字列を表示
今までは一文字ずつしか表示できなかったが、文字列を受けてループで回して表示する関数を追加

![スクリーンショット 2018-12-21 0.38.23.png](https://qiita-image-store.s3.amazonaws.com/0/109145/ead009f3-fc8c-e92d-adda-56c003e6bb28.png)

※ シャドーがあるように見えるのは文字をずらして２回描画しているからですねｗ

7) なんと　OS に依存しない関数などを stdio.h を import して使える (今回は sprintf)

```
sprintf(s, "scrnx = %d", binfo->scrnx);
```

![スクリーンショット 2018-12-21 0.43.37.png](https://qiita-image-store.s3.amazonaws.com/0/109145/b87c5226-ad3e-6eab-88f6-27d82795f0ad.png)

8) マウスポインターを作る (文字の一種ｗ）

```
"**************..",
"*OOOOOOOOOOO*...",
"*OOOOOOOOOO*....",
"*OOOOOOOOO*.....",
"*OOOOOOOO*......",
"*OOOOOOO*.......",
"*OOOOOOO*.......",
"*OOOOOOOO*......",
"*OOOO**OOO*.....",
"*OOO*..*OOO*....",
"*OO*....*OOO*...",
"*O*......*OOO*..",
"**........*OOO*.",
"*..........*OOO*",
"............*OO*",
".............***"
```

![スクリーンショット 2018-12-21 0.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/109145/8c5d6bde-fb55-bd8b-4777-35468d6bca1d.png)

ほう、すごい
だが、マウスはもちろん動かない

9) 
- マウス動くためには複数プログラムを同時に実行する必要がある
- そこで GDT / IDT 登場
- セグメンテーション
    - セグメンテーションすることによってどのプログラムも ORG 0 を使える
    - （ページングでも同じ問題は解決はできる）

GDT: Global (Segment) Descriptor Table
- メモリのどこかにセグメントの設定をずらーっと並べて、先頭の番地と個数をもっている。 CPUのGDTRと連携して使う

IDT: Interrupt (Gate) Descriptor Table
- 各デバイスすの割り込みの情報を持っている表
- マウス使うには割り込みを設定する必要がある
- どの割り込みの場合は、どの関数を呼び出すなど

load_gdtr と load_idtr はアセンブリから呼び出す

画面的に特に変化ないですが、Segment Descriptor と　Gate Descriptorの実装

第５章は以上、次はもっと割り込みの実装に入って行くぞ
明日役に立たないLaTeXの数式

ビルドの数式を楽しんで覚えられそうなゲームを作っていました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">GarbageCollectionのコミケの告知です<br>新刊はベストマッチカードゲーム！<br>サブタイトルと数式が一致したらベストマッチが完成！<br>パンドラパネルで数字を読み取れ！<br>3日目 U-36bでお待ちしています<a href="https://t.co/l9mbpsV0UY">https://t.co/l9mbpsV0UY</a> <a href="https://t.co/cUWlNI1CeL">pic.twitter.com/cUWlNI1CeL</a></p>&mdash; 出水@3日目(月)東Ｕ36b (@izmktr) <a href="https://twitter.com/izmktr/status/1075773702573150209?ref_src=twsrc%5Etfw">2018年12月20日</a></blockquote>

さて、これらの式はLaTeXで作ったのですが、
すぐに見つからないようなマニアックな記号や書式を記録として残しておきます。

## argmin,argmax
標準ではargmin,argmaxがないので、定義してやるといいです。
ちなみに、Qiitaだと、Blogの最初でこの定義を入れておけば、
別ブロックのmathの中でも定義が適用されるようです。

```latex
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
\argmin_n \left[S_n \notin \{solveable\}\right]=5\\
\argmax_{n} [2^n-7=m^2]=15
```

```math
\newcommand{\argmax}{\mathop{\rm arg~max}\limits}
\newcommand{\argmin}{\mathop{\rm arg~min}\limits}
\argmin_n \left[S_n \notin \{solveable\}\right]=5\\
\argmax_{n} [2^n-7=m^2]=15
```

## 多重添字

添字が二段になっている式です。
今回はargmaxで使っていますが、Σやlimでも使えるはずです。

```latex
\argmax_{\substack{n \\ z:bilinear}}\left[\sum_i^n x_i^2 \sum_i^n y_i^2 = \sum_i^n z_i^2 \right]=8
```

```math
\argmax_{\substack{n \\ z:bilinear}}\left[\sum_i^n x_i^2 \sum_i^n y_i^2 = \sum_i^n z_i^2 \right]=8
```

## 床関数、天井関数

切り捨てや切り上げを表す括弧の床関数、天井関数の書式です。

```latex
\lfloor 1.30637…^{3^2} \rfloor=11\\
\lceil \log_{10} \log_{10} \log_{10} Sk_1 \rceil=34
```

```math
\lfloor 1.30637…^{3^2} \rfloor=11\\
\lceil \log_{10} \log_{10} \log_{10} Sk_1 \rceil=34
```

## ハイフン

数式中にハイフンを入れたくても引き算の記号になってしまいます。
ハイフンがほしいときは\mathchar`- と入力するのですが、Qiitaの場合はうまくいきません。
(誰かうまくいく方法があったら教えて…)

```latex
\#\{exotic\ 7\mathchar`- sphere\}=27
```

```math
\#\{exotic\ 7\mathchar`- sphere\}=27
```

本当はこんな感じで表示されるはず…
![27.png](https://qiita-image-store.s3.amazonaws.com/0/985/1cdb4906-b2ad-b04c-5350-75364da58c1c.png)
DartでHttpリクエストをリトライ

　[Dart Advent Calendar 2018](https://qiita.com/advent-calendar/2018/dart) 20日目の記事です。
　
　FlutterでもAngularDartでもDartでHttpのリクエスト処理を書く事は多いと思います。その際にリトライ処理が必要になったりする事ってあると思うんですが、普通に書こうとすると結構面倒ですよね。今回はそんなHttpのリトライ処理を簡単に書けるライブラリーを紹介します。
　
## 依存関係を追加
　httpクライアントのライブラリーとリトライ処理のライブラリーを依存関係に追加します。


```yaml:pubspec.yaml
dependencies:
  http: ^0.12.0 #ここを追加
  http_retry: ^0.1.1+3 #ここを追加
```

## 使い方
　使い方は簡単でhttpライブラリーのClient(Webの場合はBrowserClient)をRetryClientでラップするだけです。

```dart
void main() async {
  var client = new RetryClient(new Client());
  var response = await client.get("http://localhost:8080/");
  print(response.body);
  client.close();
}
```

　デフォルトで下記の動作になります。

- リトライ回数の上限は3回
- 2回目のリトライまでに500ミリ待ち、以降は前回に待ったミリ秒に1.5倍したミリ秒待つ
- リトライするのはレスポンスが503のステータスコードの場合

## いろいろ調整
　RetryClientの引数でいろいろ動作を調整することが出来ます。

```dart
void main() async {
  var client = new RetryClient(
      new Client(),
      retries: 5,
      when: (response) => response.statusCode == 404,
      whenError: (dynamic error, StackTrace stackTrace) {
        print(stackTrace);
        return true; //falseを返した場合はリトライしない
      },
      onRetry: (BaseRequest request, BaseResponse response, int retryCount) => print("retry!")
  );
  var response = await client.get("http://localhost:8080/");
  print(response.statusCode);
  client.close();
}
```
上記の場合だと

- リトライ回数は5回(retries)
- レスポンスのステータスコードが404の場合にリトライをする(when)
- リクエストに失敗した場合にStackTraceを出力し、リトライを実行(whenError)
- リトライ時に 「retry!」 と出力する(onRetry)

どうでしょうか。愚直に書くと結構面倒なリトライ処理がかなり簡潔に書けるようになると思います。
[Android] Google Playにアプリをリリースするまでにやったこと

# はじめに

Androidのアプリケーションを初めてGoogle Playにリリースしました。
リリースしたアプリケーションはMicheTimerというタイマーアプリです。
このタイマーアプリの機能はとてもシンプルですがコツコツ個人開発しました。

自身の振り返りも兼ねて、アプリをリリースするまでにやってきたことをまとめます。
この記事がAndroid開発を始める初心者の方の参考になればと思います。

##### [MicheTimer](https://play.google.com/store/apps/details?id=kaleidot725.michetimer)

![k_snPUOAe-miche_timer.png](https://qiita-image-store.s3.amazonaws.com/0/79387/da055251-1d95-3e46-be07-930f2613f203.png)

# どの言語で開発するか？
はじめに考えなければいけないのがどの言語で開発するかだと思います。
今だとJava,Kotlin,C#(Xamarin),Javascript(React Native)などの言語で開発できます。

私は将来性とかは考えずに単純に面白そうな言語を選択しました。
Androidの公式言語としてKotlinが2017年に採用されたこともあって、
今から始めるならKotlinでしょといった軽い感じで選びました。

学んだ言語が廃れてしまうのではないかという不安はつきものですが、
そう言っている間に月日が経ってしまいます。
とりあえず好きな言語を選んで手を動かすことを最優先にしました。

##### [Kotlin](https://kotlinlang.org/)

![tvxfZWX2S-logo-text.png](https://qiita-image-store.s3.amazonaws.com/0/79387/fcbcb29e-7cfd-9fb6-d0d1-02a1dd256a4c.png)

# どうKotlinを学ぶか？

といった感じでKotlinを選びましたので、Kotlinの学習から始めました。

Kotlinを学ぶのには「[Kotlin入門までの助走読本](https://drive.google.com/file/d/0Bylpznm149-gTGRjOFRkWm9PODg/view)」がよかったです。
Kotlinの基本文法はこれで十分学べましたし、Kotlinのコンセプトも知ることができました。

新しい言語を学ぶときには辞書のような専門書を買いたい気持ちを抑えて、
このような簡単なものから読み進めるのが良いのかなと思います。

詳しく知りたいことがあるときには「[Kotlinイン・アクション](https://www.amazon.co.jp/dp/B076Q2L1M6/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)」を参考になりました。
ちょっと踏み込み過ぎてわからないところもあり挫折気味ですがとても勉強になる書籍です。💦

# どうAndroidを学ぶか？

開発言語の話ばかりでAndroidについて置き去りになってしまっていますが、
Kotlinを学習したのもAndroidアプリケーションを開発するため…

Androidの基礎知識の学習には「[Welcome to Android Development Training Course](http://mixi-inc.github.io/AndroidTraining/)」を使いました。
まえがき、基礎編、実務編とAndroidアプリケーション開発のいろはを学ぶことができます。

「[Welcome to Android Development Training Course](http://mixi-inc.github.io/AndroidTraining/)」はJavaでサンプルが
記述されていますのでJavaからKotlinに置き換えながら写経する必要がありますが、

これ以上に体系的にまとまった良い資料はないので、
Kotlinで書かれてなくてもこれで学習を進める価値はあるかと思います。
特にコンポーネントの使い方を知りたい場合にはこれで十分だと思います。

他には私はAndroidのアーキテクチャにも興味があったので、
別途「[Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)」という書籍を読みました。

きの書籍では「Android Architecture Blueprints」（青写真）の例として 
MVVMやMVPなどの代表的なアーキテクチャをAndroidでどう実装すれか解説しています。

機能を満たすだけではなく保守性に優れたアプリを
作りたいと思う方は必ず読むべき書籍だと思いました。（非常におすすめです）

# どんなアプリを作るか？

私は当初、Evernoteのようなノートアプリを作りたいと考えてました。
しかし始めてみると思ったとおりに進めず挫折しました。

個人開発でやっている場合は大きな目標は挫折します。
作るものはシンプルに実装できるものを選んだほうがよいです。

私は方向転換しシンプルなタイマーアプリを題材として選びました。
シンプルなタイマーアプリは難易度的にもちょうどよく楽しく開発できました。

役立つものを作るということはもちろん大事ですが、
楽しく開発するというのも個人開発では重要だと思います。

# 最終的にできたもの

これが最終的にできたアプリのメイン画面です。
複数のタイマーの登録と操作ができるものです。
よければ[ダウンロード](https://play.google.com/store/apps/details?)お願いします。

![untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/79387/e2f7b2b0-4808-840a-1092-c38e0a12b5d0.gif)
PHP JSキャッシュ対策

とりあえず引数を追加でキャッシュ回避。。

```PHP
?=<?php echo date('YmdHis'); ?>
```

```PHP
<link rel="stylesheet" href="./css/style.css?=<?php echo date('YmdHis'); ?>">
```

```HTML
<link rel="stylesheet" href="./css/style.css?=20181221002355">
```
AWS Lambdaの実行コンテナが使いまわしされる＆スケールアウトするところの確認

# AWS Lambdaがスケールアウトしているところの確認

## 環境

下記の Lambda を API Gateway からの呼び出し先に指定してある。

* 実行されると /tmp 配下にランダムなファイル名のファイルを生成する Lambda を作成する

## 目的

* 同じLambdaを実行している間、Lambdaを実行しているコンテナが使いまわされていること
* 同時アクセス数が増えたりした場合、Lambdaを実行している環境がスケールアウトされていくこと

を確認する。

具体的には下記で確認。

* 同じコンテナが使いまわされている場合は、/tmp にファイルが増えていく。
* スケールアウトされた場合、 その時の /tmp 配下は１つしかファイルがない状態になる。

## やってみる

### 1つのURLをシーケンシャルに10回叩く

```bash
ab -n 10 -c 1 https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/xxxxx
```

#### ログ確認

作成されるログストリームは1つだけ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/76263383-6331-ebff-a240-4e32478d57e7.png)

実行結果ログも/tmpの中にファイルが10個ある状態
※Lambdaの中で /tmp の配下をlsした結果をログに出してます。。

```
/tmp
['test1_5591.txt', 'test1_9376.txt', 'test1_9482.txt', 'test1_4822.txt', 'test1_7072.txt', 'test1_9011.txt', 'test1_3376.txt', 'test1_1117.txt', 'test1_804.txt', 'test1_8941.txt']
10
```

### 1つのURLを同時に10回叩く

```bash
ab -n 10 -c 10 https://xxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/xxxxx
```
#### ログ確認

ログストリームが大量に生成される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/36701720-cd74-acc8-f4fa-a7d5e41525df.png)

ログの中身を全部張るのはきついので文章で中身の状況説明すると、

* /tmp 配下のファイルが1ファイルのログが8つ
* /tmp 配下のファイルが12ファイルのログが1つ※

※シーケンシャルに叩いた時のコンテナが再利用されたため、abコマンド実行時点で10ファイルある状態。
※コンテナの1つ（↑のコンテナ）が2回使いまわされている。

という状況になった。

## 結論

* Lambdaのコンテナは使いまわされる。
* 負荷に応じて自動でスケールアウトする。

※ちなみに実行するLambdaが同じであれば、別々のURLを同時に叩いても同じ結果。
キーボードとマウスとコーヒーと

#キーボード
##Apple 拡張キーボード
![拡張1.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/14a68fad-16fe-2f6f-edd6-faacddcab2d8.jpeg)
![拡張2.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/9065242f-50d2-5919-010d-26f2b7d7c9df.jpeg)
どういうわけか1,2ともある拡張キーボード。i-Mate使ってUSBキーボードとして使ってました。
CapsLockをCtrと入れ替えたいところですが、1はソフトロック、2はメカニカルにロックがかかるタイプで入れ替えできず、出番が減って死蔵されています。
##IBM　Model M Space Saver 
![IBM_M84.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/715aeeaa-0ca2-55d2-ad72-f73d5e427668.jpeg)
お気に入り。ただし夜に打つのは憚られる打鍵音。
## Majestouch US配列
![MJ_US.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/9c19480a-1f4f-a78f-c74b-ff5509daabb7.jpeg)
USB接続なので、Raspberry Piのセットアップ時などに重宝。
ノートPCの平たいキーボードに慣れるとミスタッチが増える気がするのはどうしてでしょうか。
##IBM 5576-A01
![5576A01.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/8d2da25f-9172-d254-60f9-6cdb4e3ea7a7.jpeg)
JIS106配列の元祖。Model Mに似た座屈ばね機構だけど音は小さめ。職場がJIS配列なので、PS/2端子がなくなるまではこれを使ってました。
##現在
HPのワークステーション付属のアイソレーションキーボード（JIS109配列)、自宅ではMac Book Pro15インチのUS配列キーボードそのまま使ってるので、上記のキーボードはほぼ死蔵中。
右手小指でEnterを押すので、１キー分Enterが近いUS配列。他にも記号類の位置のために、vimはUS配列でないと使えません。職場では、vim使うことはないのでJISで、となんとなく切り替えできています。US配列使うときはCapsLockは左Shiftの下、CtlはAの左が好みです。
ノートPCによくある、幅詰めるための変な配列になるとてきめんに使えなくなります。
##NeXT キーボード
![keyb02.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/13265520-a079-fce4-86b8-3b946be728b2.jpeg)
[徒然ちょっとメモ'](http://lesyn.com/nikki/2011/08/amiga.html)から写真引用
そもそもこういう好みになったのは、初めて触れたキーボードがNeXT　Stationのそういう仕様のキーボードだったからでしょう。
#マウス
![MS3.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/873a64d3-fc39-59c8-698a-f54be82e32da.jpeg)
![IMO.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/77546675-65a2-c73c-f7f2-a1ef7b68756a.jpeg)
![MS2.JPG](https://qiita-image-store.s3.amazonaws.com/0/23964/f90eca6a-5ca0-a01b-5a07-2c3c4012a4fd.jpeg)
手元にあったマウス。Microsoftが4個、Logicoolが１個
左右対称の５ボタンが好み。Sculpt Comfort Mouseが例外だけど、Bluetooth接続かつ左右対称のものが無いので妥協。
一番古いInteli mouse opticalは職場で今も使用中。
自宅ではMac Bookのタッチパッド。
#コーヒー
職場に給湯室があるので、ペーパーフィルタとドリッパー持ち込んで日に２杯煎れて飲んでます。
##ドリッパー
サーモスの[ドリッパー付き保温マグカップ](https://www.amazon.co.jp/dp/B005HN16TO/)を使っているんですが、セットは販売終了なってるようです。
![51RNGdQz1nL._SL1000_.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/09d3def5-be11-bd5a-f3f8-6de7e4dcd855.jpeg)
##豆
![61slJNf8C1L._SL1280_.jpg](https://qiita-image-store.s3.amazonaws.com/0/23964/c85bf13a-4776-d827-979e-843c54a055df.jpeg)
容器として３ヶ月に1度くらい、Amazon定期便で購入、中身もちゃんとドリップして飲んでます。
これが空になったら、近所にあるロースターで２００gづつ購入。容器持参で10%増量、スタンプカードを2度いっぱいにすれば10%増量、で２４０g入れてもらえます。
OpenCVでHoloLensの映像を共有する

[HoloLens Advent Calender 2018](https://qiita.com/advent-calendar/2018/hololens)の10日目の記事です。

OpenCVでHoloLensの映像（Mixed Reality Capture）を共有してみましょう。
やり方は超簡単、OpenCVのVideoCaptureにネットワークURLを入れるだけ。
ユーザ名とパスワード、HoloLensのIPアドレスを挿入してください。

~~~
import numpy as np
import cv2

cap = cv2.VideoCapture("https://<UserName>:<Password>@<IP>:443/api/holographic/stream/live_low.mp4")

while(True):
    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('s'):
        cv2.imwrite("out.jpg", frame)
    if key == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

~~~

こんな感じ。
![out.jpg](https://qiita-image-store.s3.amazonaws.com/0/63863/30877c9c-7f5d-1d9f-156b-7323e1bb0466.jpeg)

安定してるし、結構いいかも。

参考まで
- [Microsoft HoloLens](https://www.microsoft.com/ja-jp/p/microsoft-hololens/9nblggh4qwnx?activetab=pivot:overviewtab)
- [HoloLens デバイスポータルへ接続し、映像を確認する３つの方法](https://azure-recipe.kc-cloud.jp/2017/07/hololens-%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB%E3%81%B8%E6%8E%A5%E7%B6%9A%E3%81%97%E3%80%81%E6%98%A0%E5%83%8F%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%EF%BC%93/)
POSTとSESSIONの違い

PHPでフォームを作るにあたって、postとsessionは必ずどこかで使います。

今回は、この二つの違いについて執筆したいと思います。

#$_POST（ポスト変数）
$_POSTとは、スーパーグローバル変数の一種にある変数です。
そのため、スクリプトのどこからでもアクセスができます。
そして、これはフォーム送信のメソッドで連想配列として使われます。

例としては、以下の通りです。

```
<?php

<form method="post" action="complete.php">

?>
```
また、フォームからデータが送られてきたときの処理は、以下の方法です。

```
<?php

変数 = $_POST["フォームに付けた名前"];

?>
```


#$_SESSION（セッション変数）
sessionもpostと同じく、スーパーグローバル変数の一つです。
そのため、どこからでもスクリプトにアクセスできます。
しかし、postとは違って大量の情報を保持することができます。
postは一度しかアクセスできませんが、sessionは何回でもアクセスできるのです。

また、これも連想配列として使用します。

例としては、以下の通りです。

```
<?php

session_start();
$_SESSION["id"] = "confirm.php";
echo $_SESSION["id"];

?>
```


※スーパーグローバル変数：プログラムにどこからでもアクセスできる変数のこと。
※連想配列：好きな名前「キー」で配列に添字すること（「ハッシュ」とも呼ばれます）。


以上のように、postとsessionの違いは、アクセスできる量であるとわかりました。
VRMフォーマットで使われるMToonシェーダーのキャラクターセットアップ

# 概要
Unityのトゥーンシェーダーは様々な物があり、VRMフォーマットで採用されたことで広く使われるMToonシェーダーもその中の1個です。

同じくUnityのトゥーンシェーダーでよく使われるUnityChanToonShader2.0と比較して

- 設定項目がシンプル
- 単一のMToonシェーダーで完結している(UTSはMobileかどうか、両面レンダリングするかどうか、ステンシルがあるか等でUTS内でシェーダーを選ばなければいけない）
- ドワンゴ社、およびバーチャルキャスト社のVTuber案件で使われていて、多くのVTuberが可愛くセットアップされている実績

があるので、もしかするとUTS2.0より取っつきやすいかもしれません。
ただし現時点(2018.12)であまりドキュメントが揃っていないので、この記事が補足になれば嬉しいです。

この記事は本家のドキュメント
https://dwango.github.io/vrm/univrm/shaders/mtoon/
を読み解きつつ、30分程度触っただけの入門記事です。

誤りや分かりにくいところ等有るかと思うので、お気軽にコメントや編集リクエストを貰えると嬉しいです。


トゥーンシェーダー自体が始めて、という方はもし良ければこんなブログ記事を書いています。  
ユニティちゃんトゥーンシェーダー入門以前 あるいは現代トゥーンシェーダーへの橋渡し
http://izm-11.hatenablog.com/entry/2018/05/12/033543




# MToonは最初に何を設定すれば良いのか
## Color Textureを設定する
1. Shaderを VRM/MToonに変更します。
2. ColorのTextureに2カ所のテクスチャ設定場所があるので「同じテクスチャ」を当てます。(Unlitあるいはアルベドで当てるテクスチャです)
3. LitColor,Alphaが「光が当たっている場所」「Unlitシェーダーの色」「UTS2.0で言うBaseMap」の色になるようにカラーピッカーで調整します。**とりあえず真っ白** を当てましょう。
4. Shade Colorを **3.より暗い色に設定します。**「光が当たった影になる場所の色」「UTS2.0で言う1st Shadow」「トゥーンシェーダー用語で言う1影」です。**とりあえず灰色** を当てましょう。
    
![image.png](https://qiita-image-store.s3.amazonaws.com/0/40627/a69391c8-73ac-bc8a-b3ef-ca1870dd3e0a.png)


※MToonにはUTS2.0で言う2nd Shadowあるいはトゥーンシェーダーで言う2影はありません。現代において2影が必要になるシーンはそれほど多くないですしね。

※手順3,4のカラー設定は目安が無いので見た目で合わせて下さい。余談ですが トゥーンシェーダー使うならUnityのDirectionalLightのカラーは**初期状態の黄色ではなく真っ白**にしてください。


## 影がフワッとしてほしいかパキっとして欲しいかを決める
トゥーンシェーダーで見た目の印象を大きく左右する**影がパキっとするかフワッとするか**を決めます。
LightingタブのLit&Shade mixingにある「Toony」というスライダが調整項目です。0だとほとんど普通のStandardシェーダーあるいはPhongシェーダーっぽい見た目で、1だとパキッとします。0.3くらいが可愛いこと多いと思います。
**UTS2.0で言うFeather**パラメータです。

![MToonFeather.gif](https://qiita-image-store.s3.amazonaws.com/0/40627/f9da95b1-0e3a-d63b-1651-3a1d6c31d6b3.gif)


## 輪郭線(アウトライン)を設定する
MToonが初期値だとアウトラインが非表示なので、びっくりしてシェーダー設定止めちゃう人が居ますが、凄く簡単にアウトラインも設定できるのでやりましょう。

アウトライン不要ならOutlineのModeは「None」のまま
![image.png](https://qiita-image-store.s3.amazonaws.com/0/40627/3df87d93-2442-864b-5c80-ab635b313d84.png)

アウトラインが必要ならModeは**WorldCoordinatesを選んでWidth(アウトラインの太さ)を0.05**にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/40627/d27223ac-1448-b292-8411-fadd61d59e91.png)

//かわいいキャラ系なら、アウトラインは大体ScreenCoordinatesじゃなくてWorldCoordinatesにしがち
//Widthは大体0.05くらいを初期値にしつつ、可愛い太さにしてください。
//アウトラインの色は0,0,0の黒じゃなくてちょっと灰色気味の黒がオシャレ！



とりあえず**ここまで設定したら、十分可愛いですよ！**

# ここから細かい調整
## 影が落ちて欲しくない場所をなんとかする
Lit Colorと ShadeColorのカラーを同じにして、ShadeColorのテクスチャ自体に影を描く。
っていうかLit Colorテクスチャから明度下げた+影が出て欲しくない場所だけを元の色のテクスチャを作ってShadeColorに当てる。

## 影の領域を少なくしたり多くしたりする
影色の面積が少なめか多めかを決めます。

## 白目部分などにアウトラインが出ないようにする
Outline Widthのテクスチャを描く

## アウトラインの色をなじませる
MixedLighting頑張って

## テカテカした感じを出したい
UTS2.0で言うMatcapはRim Additiveテクスチャです。

# 僕も分かってないこと
- ステンシルバッファと言うか、眉を前髪より前に描くやつ。
- UTS2.0で言うところのRimLight的な見せ方

# もっと詳しく知りたいぞ！な人向けの参考URL
【バーチャルキャスト】MToonシェーダーの使い方
https://www.nicovideo.jp/watch/sm34190356

VRM 標準シェーダ MToon の使い方
https://niconare.nicovideo.jp/watch/kn3485
Railsチュートリアル・第二章・演習2.3.3.1の解答

ちょっと難しかった。

以下に回答を書く。

`<%= @user.microposts.first.content %>`

が肝。


```show.html.erb--users
<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @user.name %>
</p>

<p>
  <strong>Email:</strong>
  <%= @user.email %>
</p>

<p>
	<strong>Posts:</strong>
	<%= @user.microposts.first.content %>
</p>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>
```
新卒エンジニアがSlackに#Doyaチャンネルを作ったら社内の「グッとくる」が増えた話。

### はじめまして
こんにちは。普段は餃子のことを考えながらDMM WEBCAMPの裏で開発をしています。
餃子部の部長です。~~折角なので餃子について少し語りたいのですが、~~

弊社で導入した**Doyaチャンネル**が思いのほか、面白くなってきたので書き綴らせてください。


## チャンネルの導入背景
そもそも。 \エンジニアの皆さん。/
いや、エンジニアではなくても仕事をやっている皆さんは、
「何かを達成した時にちゃんとどのように評価されていますか。」

もし **「こんな評価されています、おすすめです！」** みたいな仕組みがあれば是非教えてください。
私は新卒でエンジニアとして働き始めてから、なかなか自分のやっていることが周りには共有できていないなと課題感を持つことがありました。個人的にはコードを書いて達成感があるのに、周りのメンバーから見たら「毎日パソコンの黒い画面とにらめっこをして何やってるんだろう〜」「何かを実装しているんだろうな。」と思われていたに違いないです。



そこで社長と1on1をした時に、私の課題から生み出されたのがこの**Doyaチャンネル**です。



## Doyaチャンネル作成

Slackは便利ですね。コストもかからず、1分もたたずにチャンネルを作成できます。

<img width="992" alt="Slack_-_infratop.png" src="https://qiita-image-store.s3.amazonaws.com/0/168550/8e764562-c5f9-ac41-cdf2-61f16b74ab38.png">

そして折角Doyaをつぶやいでも反応がないのは寂しいので、
**リアクションをつける**といったルールだけ決めておきましょう。ここがミソです。

```
-----------------◇ルール◇-----------------
1. ドヤのタイミングは自由です！自分の成果をドヤりたい時につぶやいてください。
2. 他のメンバーのドヤにはスタンプ・コメント・リアクションしましょう！
3. 周りのメンバーのドヤを見つけて代弁するのも良いです◎
-----------------------------------------
```


最初はどんなことでも発信して問題ないので、まずは気軽につぶやきます。
~~コーヒー５杯とかどうでもいいとか思わない~~
とにかく**リアクション芸人ばりにリアクション**します。


### すると見えてくる、社内メンバーの活躍。

<img width="746" alt="Slack_-_infratop.png" src="https://qiita-image-store.s3.amazonaws.com/0/168550/0e1ff778-176e-5049-9d66-1bcb4864b72b.png">


うちのメンバーめちゃめちゃ手厚いサポートだなあ〜
**「グッとくる」**




### そして、新しく見えてくる社内メンバーの活動やキャラクター。

<img width="784" alt="Slack_-_infratop.png" src="https://qiita-image-store.s3.amazonaws.com/0/168550/9736c0eb-e780-6b93-ddd8-4cf35dae1cf8.png">


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">メンターの<a href="https://twitter.com/0810kayo?ref_src=twsrc%5Etfw">@0810kayo</a> ちゃんが作ってくれたパーカー届いたー😌シンプルで気に入った。たくさん着よう。 <a href="https://t.co/Vo81KqAUuu">pic.twitter.com/Vo81KqAUuu</a></p>&mdash; あやのぶ@DMM.WEBCAMP (@ayanobu411) <a href="https://twitter.com/ayanobu411/status/1073778339666550784?ref_src=twsrc%5Etfw">2018年12月15日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


何といっても`display: block;`なので、存在感抜群になっていました。



他にも変わった部活の取り組みや、売り上げ、活動報告などなど、、、
働くメンバーが増えれば増えるほど、なかなか話せない相手も増えたり、後ろの席の人が何をやっているのか分からなかったりしましよね。ですが、メンバーの頑張りをドヤしたり、自分から発信することで
意外にも「自慢ばっかりするな」というネガティブな空気ではなく、「あの人すごい！」「負けていられない」といったポジティブな空気を生み出すことができました。


## チャンネル一つで絶大なる効果
```
1. Doyaが話の種になる
2. 自分を出せて働けるから、仕事で何か問題があった時でも相談しやすい
3. 風通しの良い雰囲気
```

「なかなか評価されない...」のではなく、自分から評価されに行くという斬新奇抜なアイディアは意外と社内でも受け入れられます。もしかすると、社内の文化的に合う合わないはあるかと思いますが、興味を持った方は是非！まずは少人数から気軽に取り入れてみてはいかがでしょうか。個人的には、とてもおすすめです。そして、Doyaチャンネルでの成功体験があれば是非コメントいただけると嬉しいです。


#### 最後に

是非一緒に働きたい方、 **we are hiring!** です。
https://www.wantedly.com/companies/infratop3
餃子と共に、お待ちしております！

今後は技術的な記事も投稿して参ります。
最後まで読んでくださり、ありがとうございました。
遺伝子発現データのモデリングに”負の二項分布”を用いることがあるのはなぜか？

# 本記事について
**＜対象読者＞**

- バイオインフォマティクス(生物情報学・生命情報学), 遺伝子データの統計解析について学んでいる。
- 遺伝子解析関連の論文中でよく出てくる, ポアソン分布・ガンマ分布・負の二項分布について、関係性を整理したい。

# はじめに
- 遺伝子解析系ツール内のアルゴリズムについての論文やドキュメントで、遺伝子発現量が”負の二項分布に従う”と仮定して統計解析を行なっている論文に出会うことがしばしばある。
- 例えば、R用シングルセル解析ソフトウェア Seurat の[FindMarkers関数](https://www.rdocumentation.org/packages/Seurat/versions/2.3.4/topics/FindMarkers)では、「負の二項分布に従うと仮定して尤度比検定を行う」という検定手法のオプションが用意されている。
- では、どのようなときに負の二項分布を用いればよいのだろうか？

# 負の二項分布とは？
**＜一般的な定義＞**

- 互いに独立な[ベルヌーイ試行](https://to-kei.net/distribution/bernoulli-distribution/bernoulli-trial/)を考える。このとき、「互いに独立で、確率 $p$ で成功する試行が、 $k$ 回成功するまでに必要な試行回数 $X$」が従う確率分布が負の二項分布である。
- 定式化すると、負の二項分布に従う確率変数 $X$ の確率関数は（1）で表現される。
$$
P(X=x) = {}\_{x-1} C_{k-1}  p^{k} (1-p)^{x-k}\,\,\,\,・・・(1)
$$

# カウントデータに対するモデリング：ポアソン分布
- 遺伝子発現量データは、リード数のカウントデータ（0以上の整数で表現される離散データ）である。
- ある遺伝子について、各リードが得られる確率が一定であると考えたとき、各リードは[ポアソン過程](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E5%88%86%E5%B8%83#%E3%83%9D%E3%82%A2%E3%82%BD%E3%83%B3%E9%81%8E%E7%A8%8B)に従って発生していると考えることができる。
- ポアソン過程に従って発生する, 平均 $\lambda$ の離散確率変数 $X \,(X = 0, 1, 2, ...)$ は, ポアソン分布（2）に従う。
$$
P(X=x) = \cfrac{e^{-\lambda}\lambda^x}{x!}\,\,\,\,・・・(2)
$$
- また、**平均 $\lambda$ のポアソン分布は、分散も $\lambda$** である。

# ポアソン分布のパラメータの"ばらつき"を考慮する
- 遺伝子発現量データは, ポアソン分布に従うと考えることができるとわかった。
- パラメータ $\lambda$ のポアソン分布の平均と分散は $\lambda$ で等しいこともわかった。
- しかしながら、現実のデータは、平均と分散がおよそ等しくなるとは限らず、実際は、分散が平均よりも大きくなる**過分散**となっていることが多い。
- 過分散は, それぞれのリードの生起確率が実際には一定でなく, ばらついていることから生じる。
- ばらつきを考慮するために、**パラメータ $\lambda$ が、何らかの確率分布に従っている**と考えることにする。

# ポアソン分布と負の二項分布の関係
- では、（天下り的ではあるが）パラメータ $\lambda$ がガンマ分布 $Ga(k, \frac{p}{1 - p})$ に従っていると考えて, リード数カウントの確率分布を考えてみる。
$$
Ga(k, \frac{p}{1 - p}) = \cfrac{1}{\Gamma(k)}\lambda^{k - 1}e^{-\frac{p}{1-p}\lambda}
$$

- このとき、「パラメータ $\lambda$ のポアソン分布 $Po(\lambda)$ を, $\lambda$ についてガンマ分布 $Ga(k, \frac{p}{1 - p})$ で混合する」と表現し、混合した後の確率分布を $Q(X)$ として次の積分を計算する。
$$
Q(X = x) = \int_0^\infty\cfrac{e^{-\lambda}\lambda^x}{x!}\cfrac{1}{\Gamma(k)}\lambda^{k - 1}e^{-\frac{p}{1-p}\lambda}d\lambda
$$
- 上記の積分の計算結果として,$(1)$ の式で表される負の二項分布が現れる。
$$
Q(X=x) = {}\_{x-1} C_{k-1}  p^{k} (1-p)^{x-k}
$$

# 結局、どのような時に負の二項分布でモデリングするのか？
- リード数カウントについて, 分散が平均よりも大きい**過分散**となっており、ポアソン分布の仮定を置くことが適切でないと考えられるとき。
ASUS VivoBook R209HAをUbuntu専用機にしてPythonをセットアップするまで

PCはノート、デスク共に足りているのだが、ふとメルカリを眺めていたらVivoBookが安かったので購入。
最近は分析用途に限らずPythonやDockerを触る機会も増えてきていたので、これを機にLinux専用マシンを持つかーということで試してみた次第。

今更書くような記事でもないですが、R209HAの中身をまるまる入れ替えた記事があまり見当たらなかったので、備忘も兼ねて。

# <b>1．事前準備
Ubuntuを導入するにはLive USBかLive DVDによるライブメディアの用意が必要。
DVDはめんどくさそうだったのでUSB一択。

###■Ubuntu ISOファイルのDL
下記URLからUbuntu 18.04.1 LTSをダウンロード。
https://www.ubuntu.com/download/desktop

###■Live USBの作成
[Universal USB Installer](https://universal-usb-installer.jp.uptodown.com/windows)という選択肢も見かけたが、[Rufus](https://rufus.ie/ja_JP.html)が簡単そうだったのでこれで決定。

上記でDLしたISOとUSBメモリをセットする、という手順だが不安な場合は下記などを参照。
[Linuxをインストールできる「ライブUSBメモリ」をWindowsで作成する方法](https://linuxfan.info/make-linux-install-usb-on-windows)

![capture01.PNG](https://qiita-image-store.s3.amazonaws.com/0/152044/5db6687a-c747-92a4-ddc0-252e5cb0e3e8.png)

# <b>2．インストール

###■BIOSでOS起動順序を切り替え
ライブメディアの用意が出来たので、実際にR209HAにUSBを挿して起動。
起動画面でBIOS設定のヒントが出るかと思ったら、出ない。[F2]キーでBIOSにアクセスとのこと。
（[F2]押しっぱなしより連打のほうが上手くいきやすい）

###■インストール実施
インストール手順画面が出るかと思ったら、普通に起動してしまった。
デスクトップに`Install Ubuntu 18.04.1 LTS`とあるのでこれをダブルクリック。

「グラフィックスとWi-Fiハードウェアと追加のメディアフォーマットのサードパーティ製ソフトウェアをインストールする」にチェックを入れて続ける。

既存のWindowsを上書きしたいので、
「ディスクを削除してUbuntuをインストール」にチェックを入れて続ける。
デュアルブートにしたい場合は別のストレージ（MicroSD等）へ。あとはよしなに。

###■BIOSでOS起動順序を戻す
USB起動優先に変えた設定を元に戻す…つもりがもう戻ってたので対応不要だった。

# <b>3．動かしてみる
過去にはタッチパッドやSDカードが反応しないというバグもあったようだが、現状はどちらも特に問題はなかった。ただ、やっぱり音は出ないのかな～。
取り敢えずCanonical LivePatchの設定を済ませてターミナルで色々入れてみる。

###■Ubuntu関連
```Ubuntu
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
```
とかとか。この辺りを参考にして追々入れてみる。
[Ubuntu 最低限抑えておきたい初期設定](https://qiita.com/kotarella1110/items/f638822d64a43824dfa4)

###■Git関連
そのまま`$ sudo apt-get install git`を実行すると古いバージョンのGitが入ってしまうので、リポジトリ追加して最新のものを取得。

```Ubuntu
$ sudo add-apt-repository ppa:git-core/ppa
  add-apt-repository: command not found
```
`add-apt-repository`コマンドがないって怒られた。

```Ubuntu
# add-apt-repositoryのインストール
$ sudo apt-get install apt-file
$ sudo apt-file update
$ sudo apt-file search add-apt-repository

# 最新のGitリポジトリを追加
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get upgrade

# Gitのインストール
$ sudo apt-get install git

$ git --version
  git version 2.20.1
```
因みに`$ sudo apt-get install git`だけだとバージョンは2.17.1になる（最初そのまま入れた）。


###■Python関連
ようやくタイトル回収できるところまで来た。。

```Ubuntu
$ python3 --version
Python 3.6.7
```
Pythonに関してはもう`Python 3.6.7`が入ってた（タイトル決めて順に記事を書いてきてここで気付く）。
pipは入っていなかったのでこの辺りから触ってみようかな。

コマンド叩く分には快適だけど、ブラウジングはまあまあしんどそう。

# <b>*その他参考記事
・[Windowsを削除してUbuntuをUSBからインストールする](https://yoshinorin.net/2017/04/29/remove-windows-and-install-ubuntu-from-usb/)
・[ubuntuのapt-getで最新版のgitをインストールする方法](http://spangled-shalalala.hatenablog.com/entry/2017/09/05/060106)
Gradleタスクを指定して特定Flavorをbuildしようとしたらハマった話

この記事は[Android #2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/android2) 21日目の記事です。  

# はじめに

複数のproduct flavorを持つアプリ開発中、予想外の箇所でハマったので対応策を記載します。  想定読者は初級のAndroidアプリ開発者です。
なお、現時点で本事象の根本原因は分かっておらず、知見のある方がいらっしゃったらコメントくださると大変ありがたいです。

# TL;DR
## 事象
特定Flavorの署名付きapkを作成するGradleタスクの実行に失敗する。 条件は以下。

- どのFlavorも、署名情報（storePassword等）は環境変数から取得
- build対象Flavorの署名情報の環境変数は設定済み
- build対象ではないFlavorの署名情報の環境変数は未設定

## 対策
build対象ではないFlavorのAPK署名用環境変数も正しく設定する。

# 詳細
ここからはサンプルコードを用いて説明します。サンプルコード: [multi-flavor-app](https://github.com/mgmgpkpk/multi-flavor-app.git)

## アプリ構成

Flavorは2種類（darjeeling, assam）、各Flavorの`signingConfigs`は以下となっています。
署名に必要な`storePassword`, `keyAlias`, `keyPassword`を直接Gradleファイルに書くことは避けています。

AndroidStudioのGUIで指定する（Build -> Generate signed APK）以外の場合、buildを実行する環境に環境変数としてstorePassword等を設定しておく必要があります。

```gradle:flavor-darjeeling.gradle
signingConfigs {
    release {
        storeFile file("./src/darjeeling_prd/keystore/darjeeling-prd.keystore")
        storePassword System.getenv("darStorePass")
        keyAlias System.getenv("darKeyAlias")
        keyPassword System.getenv("darKeyPass")
    }
}
```

```gradle:flavor-assam.gradle
signingConfigs {
    release {
        storeFile file("./src/assam_prd/keystore/assam-prd.keystore")
        storePassword System.getenv("asmStorePass")
        keyAlias System.getenv("asmKeyAlias")
        keyPassword System.getenv("asmKeyPass")
    }
}
```

## アプリのbuild
フレーバー:`darjeeling`のリリース用apkだけをbuildしたい場合、想定されるbuild手順は以下です。

- 1. build環境に合わせて環境変数を設定  
   例）Mac OSで実行する場合  

   ```
   $ export darStorePass=XXXXXX
   $ export darKeyAlias=XXXXXX
   $ export darKeyPass=XXXXXX
   ```

- 2. Gradleタスク:`assembleDarjeeling_prd`を実行  
   【補足】  Gradleタスクは、AndroidStudioのGUI上で指定/もしくは以下コマンドで実行できます。  
 **AndroidStudio**  
   Gradleタブを開き、実行したいタスク名をダブルクリック
![AndroidStudio.png](https://qiita-image-store.s3.amazonaws.com/0/122653/ea47a1f1-2080-9aed-0f18-b2cf582b9b82.png)  
**コマンド**  
`./gradlew <実行したいタスク名>`

## 遭遇したエラー
で、想定ではここで`darjeeling`のリリースapkが作成されるはずだったのですが、実際には以下のようなエラーが出ました。

```
FAILURE: Build failed with an exception.

* What went wrong:
Some problems were found with the configuration of task ':app:packageDarjeeling_prdRelease'.
> No value has been specified for property 'signingConfig.keyAlias'.
> No value has been specified for property 'signingConfig.storePassword'.
```

名前的に`darjeeling`関連のタスクで何か起きている、かつ環境変数の読み込みに失敗していそうな気配が漂います。  
そこで再度環境変数を設定しなおしてみたり、Dockeでのbuildに切り替えてみたりしてみたのですが、結果は同じでした。
またGradleファイルにログを仕込んで環境変数の値が正しく取得できていることも確認しました。  
それでもやはり`:app:packageDarjeeling_prdRelease'`で何か起きているようです。

## 解決策
`darjeeling`のbuildに必要な設定に問題がないのであれば、疑うべきは`assam`側の設定です。  
いやーでもわざわざ`darjeeling`のタスクを指定して実行しているし、別のFlavorの設定が影響することってある？エラーメッセージだって`darjeeling`関連のタスクに問題があるよと言っているし？と疑いつつ、`assam`用の環境変数も設定して再度実行します。  
すると結果はあっさり**BUILD SUCCESSFUL**。  
つまりは、特定Flavorをbuildしたいときは、他Flavorのbuildも通る状態になっていることが必要ということでした。

# 雑感
普段はGUIから署名しているのですが、たまにコマンド叩いてみると意外な所で引っかかるんだなと勉強になりました。
あとGradleについて全然わかっていない。

以下は箇条書きで思ったことなど。

- Gradleのエラーハンドリングがよろしくなさそう
- タスク名に囚われるのはよくない
- もしかして署名情報を環境変数で保持する形式自体がイケてない…？（CI回すこと考えるとこうしておいたほうが管理しやすい気はする）
BeagleBone Black（Debian8.6）で GPIO を unexport できないときの対処法

# 環境
- BeagleBone Black Rev.C 
    - BeagleBoard.org Debian Image 2016-11-06（/etc/dogtag）
    - Debian8.6（2016.11.6）

# 概要
[このページ](https://github.com/fivdi/onoff/issues/50)によると，8.4以降のバージョンの Debian がインストールされている Beaglebone Black では，特定の GPIO ピンがデフォルトで常時 export されており，unexport することができないらしい．自分も Debian8.6 で同じ現象が起きたため，その対処法をここで紹介する．

以下のように，最初からいくつかのピンが export されている上に，これまでの unexport する手順ではエラーが出てしまう．

```
root@beaglebone:~# cd /sys/class/gpio/
root@beaglebone:/sys/class/gpio# ls
export   gpio115  gpio15  gpio22  gpio27  gpio31  gpio45  gpio48  gpio50  gpio61  gpio67  gpio7       gpiochip64
gpio112  gpio116  gpio2   gpio23  gpio3   gpio4   gpio46  gpio49  gpio51  gpio65  gpio68  gpiochip0   gpiochip96
gpio114  gpio14   gpio20  gpio26  gpio30  gpio44  gpio47  gpio5   gpio60  gpio66  gpio69  gpiochip32  unexport
root@beaglebone:/sys/class/gpio# echo 48 > unexport
bash: echo: write error: Invalid argument
```

# 手順
## 1. cape-universal を無効化

```
root@beaglebone:~# vi /boot/uEnv.txt
```

uEnv.txt を root 権限で編集する．

uEnv.txt の 
cmdline=coherent_pool=1M quiet cape_universal=enable を
cmdline=coherent_pool=1M quiet cape_universal=disabled に変更して上書き保存．

```uEnv.txt（変更後）
#Docs: http://elinux.org/Beagleboard:U-boot_partitioning_layout_2.0

uname_r=4.4.30-ti-r64
#uuid=
#dtb=

##BeagleBone Black/Green dtb's for v4.1.x (BeagleBone White just works..)

##BeagleBone Black: HDMI (Audio/Video) disabled:
#dtb=am335x-boneblack-emmc-overlay.dtb

##BeagleBone Black: eMMC disabled:
#dtb=am335x-boneblack-hdmi-overlay.dtb

##BeagleBone Black: HDMI Audio/eMMC disabled:
#dtb=am335x-boneblack-nhdmi-overlay.dtb

##BeagleBone Black: HDMI (Audio/Video)/eMMC disabled:
#dtb=am335x-boneblack-overlay.dtb

##BeagleBone Black: wl1835
#dtb=am335x-boneblack-wl1835mod.dtb

##BeagleBone Green: eMMC disabled
#dtb=am335x-bonegreen-overlay.dtb

cmdline=coherent_pool=1M quiet cape_universal=disabled

#In the event of edid real failures, uncomment this next line:
#cmdline=coherent_pool=1M quiet cape_universal=enable video=HDMI-A-1:1024x768@60e

##Example v3.8.x
#cape_disable=capemgr.disable_partno=
#cape_enable=capemgr.enable_partno=

##Example v4.1.x
#cape_disable=bone_capemgr.disable_partno=
#cape_enable=bone_capemgr.enable_partno=

##enable Generic eMMC Flasher:
##make sure, these tools are installed: dosfstools rsync
#cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh

uuid=850b0ebc-fda6-45f7-8b68-df180bc7e37c
```

## 2. 再起動

```
root@beaglebone:~# reboot
```

再起動後，デフォルトで export されていた gpio がなくなった．

```
root@beaglebone:~# cd /sys/class/gpio/
root@beaglebone:/sys/class/gpio# ls
export  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport
```

さらに，自由に export / unexport できるようになったことを確認できた．

```
root@beaglebone:/sys/class/gpio# echo 48 > export
root@beaglebone:/sys/class/gpio# ls
export  gpio48  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport
root@beaglebone:/sys/class/gpio# echo 48 > unexport
root@beaglebone:/sys/class/gpio# ls
export  gpiochip0  gpiochip32  gpiochip64  gpiochip96  unexport
```
DevTools tips — day 4: Elementsタブ

この記事は[Tomek Sułkowski](https://medium.com/@tomsu)さんによる
フロントエンドエンジニア向けアドベントカレンダーの翻訳記事です。
とても勉強になったので許可を得て翻訳させていただきました。元記事は[こちら](https://medium.com/@tomsu/devtools-tips-day-4-console-methods-47c854782cef)。
 
---

*休暇まであと24日です。私はこれからDevToolをより効果的に、そしてもっと楽しく使うためのコツを紹介する短い記事を書いていきたいと思います。[昨日](https://qiita.com/rena_m/items/97066dc981376731faf7)までで計11個なので今日は12番から、Elementsタブのテーマで始めます。*

# 12. “h”で隠れる
Elementsタブで選択した要素は"`h`"と打つだけで隠すことができます。"`h`"ともう一度打つと再度表示させることができます。これは、例えばスクリーンショットを撮りたいけれども、取扱いに気をつけなければいけないデータがうつっているので隠したいといった場合に非常に便利です。
![13.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/6f5335b0-13a9-cac7-815d-2392ff3a428f.gif)
# 13. 要素をドラッグ&ドロップする
htmlの1部がDOMツリーの別の場所でどのように見えるか確認したい時は、ドラッグ&ドロップしてみてください。パソコンで色々なものをどこへでもドラッグ&ドロップできるのと同じ要領です（´-`)
![14.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/b39a66ec-552e-1b87-71e6-41b58a786634.gif)

# 14. ...もしくはコントロールを使いましょう！
現在選択している要素をDOM構造の中で少し上に動かしたり下に動かしたりしたい時は、ドラッグ&ドロップのかわりに`[ctrl] + [⬆]` / `[ctrl] + [⬇]`(`[⌘] + [⬆]`/ Macでは`[⌘] + [⬇]`)を使うこともできます。
![15.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/312a0f5f-0fce-29bb-c32c-20c3918754ca.gif)

# 15. 基本的にはエディタです
ここまででドラッグアンドドロップ、編集、コピーが(もちろん`[ctrl]+[v]`でペーストも)出来るようになりましたね。ですから他のテキスト/ペイントエディタでも標準的に使えるコマンドで操作ができると聞いてもさほど驚かないでしょう。
例えば、1度Elementsタブのhtml構造をぐちゃぐちゃにしたとして、`[ctrl] + [z]` (Macでは`[⌘] + [z]`)でどんな変更も元に戻せますし、`[ctrl] + [shift] + [z]`でやり直しもできます。
![16.gif](https://qiita-image-store.s3.amazonaws.com/0/318825/ac9f401d-3a4d-3530-fedb-fa347cd770dd.gif)

---

Elementsパネルは楽しいですね！今日は4つのtipsを駆け抜けてきました。
それではまた明日おあいしましょう:grinning:
ここからはいつも通り。**なにか新しいことを学べたらぜひ**
→ もっと多くの人の目に止まるように**拍手👏ボタンをお願いします！**
→ 他の投稿も見逃さないように**[Twitter (@sulco)をフォロー](https://twitter.com/sulco)**してください！
UWPでTextBlockに数値を表す　C++

TextBlockに数値を表すことぐらい何ともないやと思っていたら全然そんなことはなかったので忘備録として残す。

##まずはじめに
UWPでTextBlockに何かしらの内容を追加しようとするときは、必ずデータ型がPlatformString型にしなければいけない。（ここで躓いた）
テキストにしろ数値にしろ、通常のInt型やString型のままではこの中に突っ込めない。だから先に変換してやる必要がある。

##変換方法
ざっくり言って
1, 任意のデータ型からwstring型に変換する
2, wstring型からPlatformString型へ変換する

直接PlatformString型へ変換できればよかったのだがやり方わかんなかった(ﾃﾍﾍﾟﾛ

コードは以下の通り。
この例ではInt型の"num"をTextBlockの"Number"に入れるまでである。

```C++
#include <string> //std::to_wstringを使うため必須
～省略
int Num;//任意のデータ
std::wstring wsNum; //wstring型への返還のための変数

wsNum = std::to_wstring(Num); //ここでwstring型へIng型から変換
Platform::String ^outSt = ref new Platform::String(wsNum.c_str()); 
//ここで出力用変数を宣言してから変換
Number->Text = outSt; //出力
```

一番最初にstringをインクルードしているが、VisualStuioで新規に作っただけだと最初からはインクルードされていないので追記してやる必要がある。

ちなみに、PlatformString型で変数宣言するときは

```C++
Platform::String ^ST;
```
と

```C++
String^ ST; 
```
はまったく同じ内容である。短いほうが何かとすっきりしやすいかもしれない
PowerAppsでQRコード読み取りしたらResetする方法が分からなかったので調べた


QRコードが読み取れるようになった話はこちらをご覧ください。
https://memo.tyoshida.me/powerapps/new-barcode-scanner-with-qr-code-capabilities/

バーコードスキャナーを挿入してQRコードを1度でも読み込むと、それを容易にクリアできなかったので調べました。（2018年12月20日時点）
他のコントロールですとUpdateContextやSet使って初期化したりResetを使ったりしますが、バーコードスキャナーはまだできないようです。

## Resetの手順
Galleryの下にBarcodeScannerを配置します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97601/c20338a7-fb91-52cc-9160-9e64d45539af.png)

そして以下のようにどこかのタイミングで予めCollectionを作成します。(```Barcode```とします。)

```C#
Collect(Barcode,{id:1})
```

そしてギャラリーと紐づけます。これで準備完了です。

```C#:Gallery.Items
First(Barcode)
```

Resetしたいときは以下を実行します。

```C#:Button3.OnSelect
Clear(Barcode);Collect(Barcode,{id:1})
```

すると```BarcodeScanner```がリセットされるようです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ClearとCollectでバーコードをリセットできた。 <a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> <a href="https://t.co/BnEUcpqgtx">pic.twitter.com/BnEUcpqgtx</a></p>&mdash; パパセンセイ (@10mikiya) <a href="https://twitter.com/10mikiya/status/1075765538658254849?ref_src=twsrc%5Etfw">2018年12月20日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ClearCollectではうまくリセットできませんでしたので、ClearとCollectに分けています。

今後改善されるとは思いますので、それまでの代替ということで。
開発を支える科学的な目標設定の仕方とモチベーションの持続について


開発をしていてどんな計画を立てて、ゴールに向かってモチベーションを維持して開発していくのは意外と大変だったりします。

今回は実験や研究からわかっている、科学的で効果的な目標設定の仕方、モチベーション維持に関してまとめてみました。


（心理学、行動経済学な知見をデザインにいかす記事なんかも書いていますので良ければみてみてください👇）
[心理学、行動経済学を活用してより良いプロダクトを作るためのTIPSまとめ](https://qiita.com/yyokii/items/92ec2b2f96ad860fa60d)


## 目標設定の段階で考えること

- 無茶な計画は絶対に立てない
    - 人は自分ができると錯覚しがちです。目標を高く設定しすぎると「叶わない」と感じてしまいモチベーションは落ちてしまいます。高い目標を設定→達成できない→次で取り返そうとまた高い目標を立てる→また失敗・・・とスパイラルに陥ってしまいます。無茶な計画、目標だと感じたら修正しましょう。

- 目標設定には±30%の幅を持たせる
    - うまくいかないことを最初から許容しておきましょう。期限だったり、対応するタスクの数にはある程度の幅を持たせておくことで、うまくいかなそうになった時にモチベーションが下がることを防げます。

- 目標達成時の利益、乗り越える障害とそれへの対策を書く
    - 目標を達成したときにどんな自分になれるのか、何が得られるのかを考えておきましょう。また、例えば働きながら個人開発をしていく場合だと時間を確保する事が難しかったりします。帰宅後ではなく昼休みに時間を取るようにしたり、平日は軽めのタスク、休日に重めのタスクをやるようにしたりして予め対策を考えておくことでうまく行かなかった時（障害が会った時）に計画が崩れることを防げます。

- 複数のゴールを設定しない
    - 複数の目標を作ると本当に大事な目標を見失う可能性があります。また、簡単なとこだけやろうとしてしまい、目標にたどり着かないことになってしまいます。

- 消費ゴールは8週間
    - 目標達成したら〇〇買おう、みたいに自分にご褒美（消費）をあげて頑張ろうとすることがあると思います。それを消費ゴールと言います。そしてその消費ゴールは設定してから8週間、消費してからは2週間幸福度をあげることがわかっています。なので、ご褒美を設定する場合は８週間毎に設定すると心理学的には効果的です。

### やる気を維持する

- 進捗の見える化
    - 例えばカレンダーにチェックを付けて自分がゴールに向かって進んでいることを明確にすることはやる気の維持につながります。タスクの達成率を出すのも良いでしょう。ゴールがありそれに向かっていて、決して永遠に続くものではないと感じることが重要です。進んでる感覚がないとやる気は落ちます。また、進捗が可視化されていると、切羽詰まったときは「頑張らないと」とエンジンがかかりますし、残された時間でなにをやるべきか、を考えるようになるので重要なタスクを選別して取り組むようになったりもします。

```
コロンビア大学の研究
① 0/10からスタートのスタンプカード
② 2/12からスタートののスタンプカード

②を渡された人の方が12/12を達成する。
→　両方同じスタンプ数（10個）が必要なのにゴールが近づいてる感覚が見える②の方がモチベーションが上がる。
```

- 手順を書き出す
    - 理由を考えるより手順を書き出したほうが行動に移しやすくなることがわかっています。（心理学者のヤコブ・トローベ＆ニラ・ベルマンさんの研究）なぜやるかより、やる気をあげたいなら「何をやってくのか」を明確にしてくことが重要です。

- 環境を変えましょう
    - 人は同じ環境だと飽きてしまいます。場所、温度を変えてみましょう。

- やらない場合の損失を考える
    - 人間は「損失」をひどく嫌います。（プロスペクト理論、損失回避の法則）失うものを考えることでそれを取り戻そうと積極的になります。

- 失敗後そこから立ち直った回数を数えてみる
    - できない、うまくいかないことが出てくるのは当然です。そのときに「ああ、だめなやつだ」とか「もういいや」と思うのではなく、失敗から立ち直った経験を思い出してみましょう。今回もうまくやれるという気持ちに変えてくれます。失敗後そこから立ち直った日をカレンダーにチェックしておくのも効果的です。

- 必要なアクションを減らす
    - 人はタスクをするまでに手間がかかるとやりたくなりません。本やペン、ノートはあえて出したまま開いたままにしておく方が、次の時にすぐ作業に取り掛かれるようになります。パソコン出すのめんどくさい、やる気起きない、やらない、みたいなこと経験ありませんか？

```
実験
① むき出しのクッキー
② 個別に包装されているクッキー

①6日、②は２４日間で完食された。
→　手間が省けるとアクションはされやすい
```

- 完璧主義を避ける
    - 時間どおり、計画通りに行くことが大事ではないです。その日のタスクを完璧にこなす事が目標ではありません。人生を変えることが目標だと自覚しましょう。


## 参考

* [成功する計画の立て方をメンタリストDaiGoが！](https://daigobook.xyz/成功する計画の立て方をメンタリストdaigoが！/)
* [脳科学から見えてきた！やる気を高める４つの方法](https://shuchi.php.co.jp/the21/detail/2260)
* [メンタリストDaiGoがやる気モチベーションを持続する目標設定とおすすめの本を！](https://daigobook.xyz/%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%82%B9%E3%83%88daigo%E3%81%8C%E3%82%84%E3%82%8B%E6%B0%97%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%8C%81%E7%B6%9A%E3%81%99/)
* [目標達成の心理学とおすすめの本をメンタリストDaiGoが！](https://daigobook.xyz/%E7%9B%AE%E6%A8%99%E9%81%94%E6%88%90%E3%81%AE%E5%BF%83%E7%90%86%E5%AD%A6%E3%81%A8%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%81%AE%E6%9C%AC%E3%82%92%E3%83%A1%E3%83%B3%E3%82%BF%E3%83%AA%E3%82%B9%E3%83%88da/)
楽しい！liboctaveをWSL上に導入する方法🌎

#あっ！C++で行列計算しなきゃ！ 
っていうときありますよね。
そんなあなたには『liboctave』ライブラリがお勧めです。
liboctaveライブラリは，ベクトルのクラス『ColumnVertor』とか行列クラス『Matrix』などが標準で用意されているので，まるで数値を扱うかのようにベクトルや行列を扱うことができるんです！すごい！
今回は，WSL(Windows Subsystem for Linux)上でliboctaveライブラリを使用する方法を紹介していきます。
おそらくUbuntu上でもほぼ同じ方法で使用できると思います！(未確認)

#インストール方法
apt-getを用いてインストールを行います。
以下のコマンドを入力してインストールしてください。

```bash:WSL
$ sudo apt-get install octave 
$ sudo apt-get install octave-dev  
```

インストール後は，C++のライブラリとしてliboctaveがつかえます！

# liboctaveを使ったサンプルプログラム
行列とベクトルの積を計算してみます！

今回は，以下のような行列Ａとベクトルxを用意しました！

```math
  A = \left(
    \begin{array}{ccc}
      1 & 2 \\
      3 & 4 \\
    \end{array}
  \right), 
  x= \left(
    \begin{array}{ccc}
      5 \\
      0 \\
    \end{array}
  \right)
```

Aとxの積は↓のようになるはずです！！！

```math
Ax = \left(
    \begin{array}{ccc}
      5 \\
      15 \\
    \end{array}
  \right)
```

```C++:MatrixVector.cpp
/* MatrixVector.cpp
 * 行列とベクトルの積の計算
 */

#include <octave/config.h>
#include <octave/Matrix.h>
#include <iostream>

using namespace std;

int main(){
	Matrix A(2,2);     /* 2x2行列 */
	ColumnVector x(2); /* 2次元ベクトル */
	ColumnVector b(2); /* 2次元ベクトル*/

    /*  各要素の値を代入する */
	A(0,0) = 1;
	A(0,1) = 2;
	A(1,0) = 3;
	A(1,1) = 4;

	x(0) = 5;
	x(1) = 0;

	b = A * x; /* 掛け算する */

	cout << "A = " << endl;
	cout << A << endl;

	cout << "x = " << endl;
	cout << x << endl;

	cout << "b = " << endl;
	cout << b << endl;

	return 0;
}
```

# コンパイル・実行方法

上のプログラムをコンパイルする場合，以下のコマンドを入力します。
（環境によっては微妙にパスが違うかも）

```bash:WSL
$ g++ MatrixVector.cpp –l/usr/include/octave-`octave-config -v` -L/usr/lib/octave-`octave-config -v` -l octave
```

実行すると，以下のように表示されました。

![liboctave.png](https://qiita-image-store.s3.amazonaws.com/0/320452/3a2fddb7-e1ba-b39e-ce13-019f19af678a.png)

行列とベクトルの積が求められていますね！！！めでたしめでたし！！！🌎🍵



# まとめ
liboctaveは素晴らしい！
もっとliboctaveやOctaveのことを知りたくなったら，下記のページを見てみてください！！！！

[liboctave の基礎：コンパイルと型と基本演算 - akihiko’s tech note](http://d.hatena.ne.jp/aki-yam/20080721/1218193668)
liboctaveの基礎的な使い方がかかれている素晴らしいページです。

[Octave を用いた画像処理や統計処理，Octave と OpenCV との連携](https://www.kunihikokaneko.com/free/octave/index.html)
Octaveを用いた画像処理など発展的な内容の素晴らしいページです。
Elmでportもネイティブモジュールも使わずJSと通信する方法

![800px-English_Elm_avenue.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/886d5e6d-9ea5-af82-d518-f401f68c09f8.jpeg)




ElmでウェブブラウザのAPIを直接叩けるのは公式のパッケージだけで、サードパーティのパッケージではネイティブなモジュールもportも使うこともできません。でも、**[joakin/elm-canvas](https://github.com/joakin/elm-canvas)** というパッケージが存在していて、公式で対応していないはずのCanvas APIを叩いているのです。どないなっとんねん！と思って調べたので、どんな方法でやっているのか簡単に紹介しておきます。

## 1. 外部に送信したいデータを、`property`を使って要素の"cmds"というプロパティに突っ込む

```elm 
commands : Commands -> Attribute msg
commands list =
    list
        |> Encode.list identity
        |> property "cmds"
```

既存のプロパティでなければどんな名前でもいいはずですが、em-canvasでは"cmds"というプロパティに突っ込んでいるようです。ちなみのこのデータの中身は、次のような感じのJSONになっていました。

```js
[
    {type: "function", name: "restore", args: []},
    {type: "function", name: "fill", args: ["nonzero"]},
    {type: "field", name: "fillStyle", value: "rgba(0%,0%,0%,0.3)"},
    ...
```


## 2. `elm-canvas`というCustom Elementsを描画する

```elm 
toHtml : ( Int, Int ) -> List (Attribute msg) -> List Renderable -> Html msg
toHtml ( w, h ) attrs entities =
    Html.node "elm-canvas"
        [ commands (render entities) ]
        [ canvas (height h :: width w :: attrs) []
        ]
```

1で定義した`commands`を使って、その`elm-canvas`の`cmds`プロパティにデータを突っ込んでいるわけです。ついでに、その内側に実際の描画先となる`canvas`要素も作ってあります。

## 3. そのCustom Elementsの定義の`set`アクセサで、Elm側から送られたデータを受け取る

```js
customElements.define(
  "elm-canvas",
  class extends HTMLElement {

    ...

    set cmds(values) {
      this.commands = values;
      this.render();
    }

    ...

  }
);
```

JavaScript側の`elm-canvas`要素の定義で、`cmds`の`set`アクセサを用意して、そこでデータを受け取ります。あとは受け取ったデータを元にCanvasの描画を行うだけです。

# まとめ

というわけで、Custom Elementsのプロパティ越しにデータを送れば、`elm-canvas.js`というスクリプトを別に読み込む必要はあるものの、ネイティブモジュールもportも使わずに、Elmのパッケージから外部のAPIを叩くことができるということがわかりました。このやり方ではJavaScript側からElm側へデータを送ることはできないので、`measureText`のような機能は実現できないという制限はあるでしょうが、簡単な描画であればこれで十分でしょう。


……闇の魔術じゃん！


# 追記

……と思いきや、akira_さんから [カスタムイベントでJSからElmへデータを送る方法](https://qiita.com/akira_/items/6218f049416b3daf406a)が提案され、ElmからJSだけでなくJSからElmへとデータを送ることも問題なくできることがわかりました。portガン無視でデータを送りまくれるぞ！　悪の枢軸ッ！
VScode&Python設定のメモ

WindowsPCのSSDが壊れてしまったので入れ替えました。
このタイミングで中身をリフレッシュしたらVScodeもなくなったので、改めてインストールしたメモ

#ツールのインストール
##VScodeのインストール
[https://code.visualstudio.com/](https://code.visualstudio.com/)からインストールしました
スクリーンショット撮るの忘れましたが、忘れるくらい簡単でしたが、下で見るようにAnacondaのインストールの過程で追加インストール可能です。そのほうが楽だと思う

##Anacondaのインストール
PythonはHomebrewを以前使っていたので、今回はAnacondaを使ってみることにします
[https://www.anaconda.com/download/](https://www.anaconda.com/download/)
<details><summary>インストール画面遷移</summary>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/2645d2c0-fda9-3403-bc15-d01f1e49ad68.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/1bdc0dbc-9382-1915-6216-992383cde081.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/e677f723-a244-83f7-1a9b-9aa7af4da167.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/165b768b-e02b-5ea8-b8ce-54447a32ce71.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/f5ca1f30-ee75-fb80-a0cb-572c6af869a7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/bcc06586-5a90-e514-1d0e-2b9563f00bad.png)
</details>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/0e77a512-6dbd-d63c-07b0-3262322e2c64.png)
ここでVScodeインストールできるじゃないか...<details>
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/55c086df-f101-c63c-8db2-4ebb920c032f.png)
</details>
#日本語化
Extensions→japanese で検索して、Japanese Language Pack for Visual Stucio Code をインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/c47b24cc-ef36-529f-b298-ee5c71653b97.png)
使用法の指示通り、jsonファイルをen→jaに書き換える
VScodeを再起動すると日本語化
Windows10でTypeORMのCLIを実行するとエラーがでる


# 環境
Windows 10 

# typeormが実行できない

```shell-session
c:\temp\test-typeorm>.\node_modules\.bin\ts-node .\node_modules\.bin\typeorm  migration:generate  -n Initialize
c:\temp\test-typeorm\node_modules\.bin\typeorm:2
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
          ^^^^^^^

SyntaxError: missing ) after argument list
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at Object.<anonymous> (C:\Program Files\nodejs\node_modules\npm\node_modules\ts-node\src\bin.ts:157:12)
    at Module._compile (module.js:652:30)
```

下記も同じエラー

```shell-session
c:\temp\test-typeorm>ts-node typeorm  migration:generate  -n Initialize
```

ts-nodeかまさないと別のエラー

```shell-session
c:\temp\test-typeorm>typeorm  migration:generate  -n Initialize
Error during migration generation:
c:\temp\test-typeorm\models\task.ts:1
(function (exports, require, module, __filename, __dirname) { import {
                                                              ^^^^^^

SyntaxError: Unexpected token import
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Function.PlatformTools.load (C:\Program Files\nodejs\node_modules\npm\node_modules\typeorm\platform\PlatformTools.js:131:28)
```

# 結論
```
.\node_modules\.bin\ts-node ./node_modules/typeorm/cli.js  migration:run
```
RDBMS-GIS における小技

# はじめに
皆さん位置情報を取り扱ってますか？位置情報データをどのように蓄えてますか？
elasticsearch？ひとつの選択肢ではありますが、RDBMS(MySQLやPostgreSQL)でやるのもいいですよ、ということで、RDBMSで位置情報を取り扱うときのtipsをご紹介。サンプルのクエリは PostgreSQL w/PostGIS 向けになっております。

# 都道府県
都道府県ごとのポリゴンデータを持つテーブルを用意して、任意の都道府県情報を持たない位置情報(Point なり Polygon なり)を都道府県ごとに取り出すことができます。データの正規化をきちんとやっていけるのが大きなメリットですね。

以下の
- id と name カラムを持つ prefectures テーブル
- prefecture_id と boundary(Polygon) カラムを持つ prefecture_zones テーブル
- boundary(Polygon) カラムを持つ hoges テーブル

の3テーブルがあるとすると

```SQL
SELECT hoges.*
FROM hoges
INNER JOIN prefecture_zones ON ST_Intersects(hoges.boundary, prefecture_zones.boundary)
INNER JOIN prefectures ON prefecture_zones.prefecture_id = prefectures.id
WHERE prefectures.name = '東京都';
```

というクエリで、東京都の範囲を含む hoge を抽出できます
(記法は PostGIS)

## おまけ・都道府県のポリゴンデータの作り方
ポリゴンデータは[国土交通省](http://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N03.html)から頂いて、[QGIS](https://www.qgis.org/ja/site/forusers/download.html)で適当にリダクションして使用すると良いでしょう。市区町村レベルまではこれで行けます。
それより細かいデータは[総務省統計局](https://www.e-stat.go.jp/gis)にあります。

# 特定ジオグラフィーから一定距離内にあるジオグラフィーを得る
tips記事なので「ジオグラフィーとは？」という説明は省略します

`ST_DWithin` を使います。距離を測るのは`ST_Distance`ですが、制約条件(WHEREとか)に ST_Distance を使ってもインデックスを利用しないので、インデックスを使う ST_DWithin を利用するべきです。

2回やればドーナツ状の検索もできますね。
↓サンプル
- name と boundary(Polygon) カラムを持つ hoges テーブル

```
SELECT
  hoges.name as name,
  ST_Distance(hoges.boundary, ST_GeographyFromText('POINT(139.707345 35.658634)')) as distance
  
FROM
  hoges
WHERE
  not ST_DWithin(hoges.boundary, ST_GeographyFromText('POINT(139.707345 35.658634)'), 0)
AND
  ST_DWithin(hoges.boundary, ST_GeographyFromText('POINT(139.707345 35.658634)'), 1000)
GROUP BY name, ph.user_id, distance
ORDER BY distance asc;
```
指定座標を含んでいないが boundary が指定座標からの距離が 1000m 以内の hoge の name と 距離を得ます。


# 終わりに
位置情報は楽しいのでみんな気軽に取り扱っていきましょう