OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studio Code のデバッグで、virtualenv, venv のPython仮想環境を使う

# VS Code で venv 使ってデバッグするにはどうすればいいのか…

stack overflow で venv 起動してから `code . ` で環境変数引き継げる、とかあったけど Windows だとうまく動かなかった。

### いつも通り、 venv virtualenv 等を作る

```sh
>python -m venv .venv
```

### VS Code のデバッグ環境を作っておく。

参考：[VSCodeでPythonをデバッグする](https://qiita.com/bigengelt/items/780440a146e6a3bdffd4)

### VS Code の設定で python の実行環境を選択する 

![2018-06-12_11h52_48.png](https://qiita-image-store.s3.amazonaws.com/0/83984/0a2b6f30-1987-7e63-69d0-838bd5f5a0ce.png)

~~コマンドから変更する方法は見つからなかった。~~

[公式ドキュメント](https://code.visualstudio.com/docs/python/environments)に書いてあった。

![2018-08-11_12h22_09.png](https://qiita-image-store.s3.amazonaws.com/0/83984/5c81dd18-3a37-ae52-7971-e80fa5baa358.png)

`Ctrl` + `Shift` + `P` でコマンドパレット出して、`Python: Select Interpreter`

ドキュメントはきちんと読もう。

## 参考
[virtualenvのPython仮想環境をVisual Studio Codeにも有効させる](https://qiita.com/thatbin/items/2de0a0c1ea21af10f6e3)
XamppでComposerがエラーでInstallもUpdateもできなくなったけど直った

Xampp使ってて、composerでパッケージの追加でupdateしようとしたら↓なエラーとかがでて


>file could not be downloaded (HT
TP/1.1 404 Not Found)  
  
　
composer diag とかやったら↓とかになったりして全然UPDate出来なかったんです。  

>file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed

そこで下記のリンク辺りを色々あたって、  
cert.pemとかも差し替えましたがダメでした。

https://teratail.com/questions/7429

https://qiita.com/dora_kou/items/c9c2f7d8d53303ee1aab

https://github.com/composer/composer/issues/2798  
  
　  


結果的にはカスペルスキー一時停止にしてしばらく待ったら 
composer updateで無事Update完了しました。
  
結論：私の場合、セキュリティソフトのファイアーウォール。が原因だったようです。
Vivaldiと1Password7の相性が悪い場合の対処法

## 現象
Vivaldiを開くと
"1Password can't save or fill in Vivaldi"
と出てきてしまった時の対処法です。2018/06/12現在ぐぐっても最適な解決法がでてこなかったため記載。

Version
- Vivaldi: 1.15.1147.42
- 1Password: 7.0.4


## 対処法
~/Library/Application\ Support/Google/Chrome/NativeMessagingHosts
配下の
2bua8c4s2c.com.agilebits.1password.json
ファイルを
~/Library/Application Support/Vivaldi/NativeMessagingHosts
配下にコピーします


コマンドだと以下
```shell-session
cp ~/Library/Application\ Support/Google/Chrome/NativeMessagingHosts/2bua8c4s2c.com.agilebits.1password.json ~/Library/Application\ Support/Vivaldi/NativeMessagingHosts
```
*もし上記のコマンドでエラーの場合、該当のjsonファイルが作成されていない場合だと思われます。その場合は、該当のフォルダ(NativeMessagingHosts)を作成のうえ、1Passwordを完全に終了/起動を行うとjsonファイルが作成されます*

もし、以前(1Password6時代等)に上記処理を実行している場合は、
再度実行し上書きします。jsonファイルには1Passwordのパスも記載されているので、1Password7ではないアプリのパスが記載されている場合、うまく連携されません。
JavaScriptで要素が存在するかtrue/falseで知りたい時どうするか？

## 要素が存在するか知る必要がありました
ifの条件式で、とある要素が存在するとき(true)に処理をしたかったので、JavaScriptで実現できないか、調べました。


## 実現方法
以下のコードで実現させます。

```js
document.getElementById("id") != null
```

単純なdocument.getElementById("id")では、要素が返ってきます。
そこでnullか否かの比較演算子を使うことでtrue/falseの真偽値を得ます。
シンプルですね。

## ちなみに
ちなみにjQueryのgetとかsizeとかで判定する方法もあります。(参考をご覧ください。)
ですが、JavaScriptのみで書いた方が実行速度は速いみたいです。

## 参考
- [document.getElementById](https://developer.mozilla.org/ja/docs/Web/API/Document/getElementById)
- [[JS][jQuery] 要素の存在を確認する6通りのコードと実行速度](http://kihon-no-ki.com/check-existence-element-by-javascript-and-jquery)
素のJavaScriptプロジェクトにtsconfig.jsonを置いといてVSCodeの便利さを享受する

VSCodeの便利さを使いたいがTypeScript化するほど手間かけれない、みたいなときに`tsconfig.json`だけ作っておくとちょっと便利になりそうだったのでメモる。

**追記**： TypeScriptへ移植する予定が無い場合であれば、[`jsconfig.json`](https://code.visualstudio.com/docs/languages/jsconfig)を配置するでも十分そうです（違いはallowJSがdefaultでtrueなこととぐらい。あとは`tsconfig.json`は後述のコマンドでボイラープレートを生成できるという点ぐらいと思われます）

具体的にはこのへんとか使える

* 未使用のimport検出
* ライブラリの型情報を利用した検出
* JSDocがあればそれを利用した型検証

# やり方

まず`tsconfig.json`を生成する。npx使う

```
$ npx typescript --init
```

次に、`allowJs`と`checkJs`を`true`にする

```json
"allowJs": true,
"checkJs": true,
```

あとtscを叩いて上書きなどされないようにnoEmitも追加しておく

```json
"noEmit": true
```         

ついでに`strict`も必要があれば`false`にしておく。

```json
"strict": false,
```

Reactの場合はjsx周りのエラーを回避するために下記も追加

```json
"jsx": "react"
```

また、`@types/react`も必要

```
$ yarn add -D @types/react
```

# エラーが出たら？

## 無視するシグネチャをつける方法で回避

コメントによって一部チェックを無視することが可能。

行単位で無視したいなら下記

```js
// @ts-ignore
```

ファイルごと無視したいなら下記

```js
// @ts-nocheck
```

詳しくは下記

https://github.com/Microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files

## 型をつける方法で回避

JSDocを指定して型指定すると回避できる。
`@type {*}`で値をany扱いにするのが雑ではあるものの一番ライト。
当然型の恩恵は受けれなくなるものだが、今はVSCodeの恩恵を受けることを目的とするので目をつぶる。

```js
/** @type {*} */
const Mark = styled.div`
  background: ${
    /** @type {*} */
    props => props.primary ? 'palevioletred' : 'white'
  };
`
```

ちゃんと型を指定することもできるものの、ここまでやるならもうTypeScriptにしたほういいのでは？という感じはある。

```js
import styled, { ThemedStyledProps, StyledComponentClass } from "styled-components"

/**
 * @type {StyledComponentClass<any, any>}
 */
const Mark = styled.div`
  background: ${
    /** @type {ThemedStyledProps<{ primary: Boolean}, {}> } */
    props => props.primary ? 'palevioletred' : 'white'
  };
`
```

さらにJSDoc周りについての詳細は公式の下記を見ると良い。
https://github.com/Microsoft/TypeScript/wiki/JSDoc-support-in-JavaScript
過去に使ったコマンドを探す

過去に使ったSSHコマンドで使ったIPを忘れてしまったのでコマンド履歴の調べ方を調べたのですが、すぐに目的のコマンド履歴を見つけられなかったのでメモとして残しておきます

```bash
history | grep ssh
```

これで過去に使った`ssh`を含むコマンドの一覧が表示される
AWS Secrets Managerからdotenvの設定ファイルを作る

# 概要
今までRailsでサービス開発をしてきて、ホスト名やパスワードをdotenvを使って管理してきた。

そういった情報はハードコーディングするわけにはいかないので、手動でdotenvのファイルを書き換えていた。

[Secrets Manager](https://aws.amazon.com/jp/secrets-manager/)を使うと少し管理が楽になる。

# 環境
Rails 5.2.0
aws-cli 1.15.34
Ubuntu 18.04 LTS
dotenv-rails 2.4.0

※アプリケーション名 iauth

# シークレット値の登録
読まれたらいけない値を登録しておく。

![スクリーンショット_2018-06-12_11_10_33.png](https://qiita-image-store.s3.amazonaws.com/0/97287/d3977714-f8b4-e572-78c3-8001792b9708.png)

# secretsmanager コマンドを使えるようにする

下記のコマンドが使えるようにしておく。

```
$ aws secretsmanager get-secret-value --secret-id {keyname}
```

※新しめのaws-cliでないと secretsmanager をサポートしていないので注意する。

うまくいくと、登録した値がjsonで返ってくる。

```json

{
    "ARN": "arn:aws:secretsmanager:***",
    "Name": "***",
    "VersionId": "***",
    "SecretString": "{\"RAILS_SECRET_KEY_BASE\":\"***\",\"IAUTH_DATABASE_HOST\":\"\\\"***\\\"\",\"IAUTH_DATABASE_USER\":\"\\\"***\\\"\",\"IAUTH_DATABASE_PASSWORD\":\"\\\"***\\\"\",\"REDIS_HOST\":\"***\",\"API_MASTER_TOKEN\":\"***\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1528447946.908
}
```

# 取得した値をdotenv形式にするスクリプト
取得した値を dotenv が読めるようにする。

``` get_secrets_from_aws.rb
require 'json'

ret = `aws secretsmanager get-secret-value --secret-id iauth `
begin
  params = JSON.parse(ret)
  secrets = JSON.parse(params['SecretString'])
rescue
  return
end

envstr = "RAILS_SECRET_KEY_BASE=" + secrets['RAILS_SECRET_KEY_BASE'] + "\n"
envstr += "IAUTH_DATABASE_HOST=" + secrets['IAUTH_DATABASE_HOST'] + "\n"
envstr += "IAUTH_DATABASE_USER=" + secrets['IAUTH_DATABASE_USER'] + "\n"
envstr += "IAUTH_DATABASE_PASSWORD=" + secrets['IAUTH_DATABASE_PASSWORD'] + "\n"
envstr += "REDIS_HOST=" + secrets['REDIS_HOST'] + "\n"
envstr += "API_MASTER_TOKEN=" + secrets['API_MASTER_TOKEN'] + "\n"

print envstr

```

# secretsを取得する capistrano タスクを書く
デプロイされるディレクトリに直接ファイルを作成する。

``` deploy.rb
namespace :deploy do
  task :reload_secrets do
    on roles(:web) do
      execute "ruby /var/www/iauth/current/get_secrets_from_aws.rb > /var/www/iauth/current/.env"
    end
  end
end
```

これでデプロイタスクにsecretsの更新を含めることができた。
HTMLの input type="checkbox" の値をPHPに渡すときに詰まった

HTMLのinputタグの値をPHPに渡したい。
type="checkbox"で**「チェックしていない」**、ってことをどうしても渡したいんだ。

#何がしたいか
社員名簿の登録画面のようなものを作っていて、登録時に管理者権限のありなしを入れたい。
集計表には下表のように0,1で表示したいが、HTMLでは0,1の選択ではなくチェックマークにしたい。

|社員ID|名前|管理者権限|
|:--:|:--:|:--:|
|1|乾 巧|1|
|2|草加 雅人|1|
|3|木場 勇治|1|
|4|海堂 直也|0|

##やってみた
まず基本通りにやってみる。

```html:index.html
管理者権限：<input type="checkbox" name="kanri_flg">   ※管理者にはチェックする
```
inputのtypeをチェックボックスにして渡す。
これで試すと、チェックマークを付けた場合は集計に1と出るものの、チェックマークを付けなかった場合に"0"を表示してくれない。
どうやらcheckboxはチェックをつけないとまるで存在しないかのような挙動を見せる。

#解決策
valueを持たせてみた。
##どうやったか
同じnameを持つinputタグを２つ作り、上段のタグにvalue="0"を設定し、typeをhiddenにして隠す。
下段のタグにはvalue="1"を設定。
もしチェックマークがあれば、下段のinputタグが有効になって、上段を上書きして渡してくれるようにした。

```html.index.html
<input type="hidden" name="kanri_flg" value="0">
管理者権限：<input type="checkbox" name="kanri_flg" value="1">   ※管理者には☑する
```

##inputタグのvalueの値は文字列（String）として渡される
はじめはvalueにtrue入れたりしてみたけど、どうも正しく渡してくれない。というかvar_dumpで確認するとString(4)と書いてある。
checkboxなので、真偽値（boolean）なのかと思っていたが、どうやら文字列（String）として扱われるらしい。

#あとがき
HTMLの勉強中は気にかけなかったことも、PHPとの連携だと細かく見ていかなければいけない。
ちなみにcheckboxだとvalueは必須ではないらしい。
ローカルブランチに特定のリモートブランチをpull

よく忘れるのでメモ。

## やりたいこと

 - 特定のローカルブランチに特定のリモートブランチの差分をpullする

### ローカルのブランチ一覧  

```
$ git branch
* master
test
```

### リモートのブランチ一覧

```
$ git branch -r
origin/HEAD -> origin/master
origin/add-whitespace-mode
origin/master
```

### ローカルのリモートブランチを最新化

```
$ git fetch
```

### 特定のローカルブランチに特定のリモートブランチの差分をpullする

```
$ git pull origin REMOTE-BRANCH-NAME:LOCAL-BRANCH-NAME
```

例えば、リモートにある`add-whitespace-mode`というブランチをローカルの`test`というブランチに持ってきたいときは以下。

```
$ git pull origin add-whitespace-mode:test
```


###　関連

- [リモートブランチにチェックアウト](https://qiita.com/hinatades/items/a30ba3b8f2bd80e30258)
optional: trueってなに

外部キーの```nil```を許可する

``` ruby
# 飼い主
class Owner < ApplicationRecord
  has_many :pets
end

# ペット
class Pet < ApplicationRecord
  belongs_to :owner, optional: true
end
```

モデルが悪いのは気にしない・・・
```optional: true```にしてしまうと飼い主がいないペットができてしまう
Laravel5.6 Duskをサブディレクトリで管理する

## やりたかったこと

LaravelのブラウザテストのDuskを使っているのですが、`tests/Browser`配下にテスト用のファイルを配置するのではなくて、リソース毎にディレクトリに分けて管理がしたかった。

イメージはリソース単位といった感じ
例：`users`のブラウザテストなら`tests/Browser/users`ディレクトリ配下にファイルを配置したかった

## 方法

```
$ php artisan dusk:make 'ディレクトリ名\クラス名'
```
以上のようにすることで実現出来ます。

以下例：

```
$ php artisan dusk:make 'Hoges/HogeTest'
```

以上を実行すると`tests/Browser/Hoges/HogeTest.php`が生成されるようになっているかと思います。
Unity Editorにネイティブプラグインを入れて、そのプラグイン内からUDPデータを受信出来ないときはWindows ファイアウォールの設定を疑ってみる

UDPデータを受信できないときは、Windows ファイアウォールの設定とパブリックネットワークへのアクセス許可を疑ってみましょう。

## 現象
Windows ファイアウォールの設定が適切でないと、 **Unity Editorとネイティブプラグイン** を使って、そのプラグイン内から **UDP(データグラム)ソケットでIoT** からデータを待ち受けるときに、 socketの生成結果は正常なのに、**recvやrecvfromの呼び出し結果が戻ってこなかったり常に0のままだったり**することがあります。
(大事なところを **太字** にしてみました)

## 修正手順

1. Unity Editorを終了します。

2. Windows ファイアウォールの設定を開いて確認します。Windows 10ならタスクバーの検索のところに"Firewall"と入力すると簡単に開けるかも知れません。
以降スクショは英語版ですが日本語版でも一緒だと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/39561/59cfbab0-1279-8557-9bcf-a2fcbd43503f.png)

3. 「受信の規則」からUnity Editor.exeを探して、選択して削除します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39561/e14b4b43-5802-126a-2ecd-e86cf5bed991.png)

4. Unity Editorを再起動すると、「Windows セキュリティ重要な警告」ダイアログが出るので、 **パブリック ネットワーク(空港、喫茶店など) (非推奨)** にもチェックを入れから「アクセスを許可する」ボタンを押します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/39561/6e7de478-cbd8-be4f-1687-2f43135f9c10.png)


## そもそも何でこんな事が起きるのか?

IoTへの接続というところが肝になっていて、IoTをアクセスポイントモードにしてWi-Fi等で直接接続する場合、デフォルトゲートウェイがありません。
Windowsはこのような接続をパブリックネットワークと判断するようです。

パブリックネットワークについてはこの辺が詳しいです。
http://www.atmarkit.co.jp/ait/articles/1012/24/news127.html

Unity Editorの起動時には、「Windows セキュリティ重要な警告」ダイアログの「プライベートネットワーク(ホームネットワークや社内ネットワークなど) 」にだけチェックが入っているので、そのまま「アクセスを許可する」ボタンを押していた場合、以降プログラム内からパブリックネットワークからのデータを受信しようとしてもブロックされてしまいます。

## まとめ

「セキュリティが強化された Windows ファイアウォール」はマジで強化されてるので要チェック。
IoTからのデータを受信するなら、パブリックネットワークも許可されているか見直そう。

(検索用キーワード: Unity3D, エディタ, bind, ファイアーウォール)
Vuetifyのタブコンポーネントで各タブごとにスクロール位置を保持する

## Vuetifyのタブコンポーネント
VuetifyはVue.jsに対応したUIコンポーネントライブラリです。今回はこの中のタブ（`v-tabs`）に関するTipsです。
https://vuetifyjs.com/ja/components/tabs

## タブごとにスクロール位置を保持したい
例えば、３つのタブを作り、その中にInstagramのタイムラインのようなコンテンツのリストを表示するとします。
このとき、次のような事象が発生します。

1. タブAで`window.scrollY`が500になるまでスクロール
2. タブBに切り替え
3. タブBでもスクロール位置（`window.scrollY`）が500になっている

感覚的には、タブAで`window.scrollY=500`の位置までスクロールしても、タブBに切り替えたときには一番上（`window.scrollY=0`)の位置を表示してほしいですよね。

## 方針
次のような方針で対応していきます。

- スクロールのイベントハンドラを追加する
- スクロールが発生したら、現在表示中のスクロール位置を保持する（タブごとに別々に保持）
- `v-tabs`の`v-model`に指定したプロパティ（例: active）をwatchする
- `active`の変更を検知したタイミングで、保持しておいたスクロール位置に変更する


## 実装
Javascriptの処理はこんな感じ。

```sample.vue
<script>
export default {
	data() {
		active: 'tabA',	// アクティブなタブ名
		// 各タブのスクロール位置
		position: {
			tabA: null,
			tabB: null,
			tabC: null,
		},
	},
  	mounted() {
  		// イベントリスナの追加
		window.addEventListener('scroll', this.handleScroll);
    },
    destroyed() {
    	// イベントリスナの削除
    	window.removeEventListener('scroll', this.handleScroll);
	},
    methods: {
    	handleScroll() {
    		// 現在アクティブなタブのスクロール位置を保持
    		this.position[this.active] = window.scrollY;
    	}
    },
    watch: {
    	// activeの変更を検知
    	active() {
    		// 切り替え後のタブですでに保持されたスクロール位置があればその位置を取得
    		const y = this.position[this.active] || 0; 
    		
    		// 即時スクロールすると、切り替え前のタブの長さ ＜ 切り替え後のタブの長さである場合に、切り替え前のタブの最大値までしかスクロールされないことがある（切り替え後のタブの内容が描画される前にスクロールしようとする）ので、setTimeoutでタイミングを少しずらす
    		setTimeout(() => {
    			window.scroll(0, y);
    		}, 200);
    	},
    },
};
</script>
```

## 終わりに
省略した`<template>`の部分は基本的にVuetifyのサンプルを見てもらえばと思いますが、要望がありましたら追記します。
Railsで配列におかしな値がないかチェックする

チェックボックスなどで複数の値を受け取るフォームで、直接変な値をポストされた時に弾きたいと思ったのですが、最初から用意されてるバリデーションではできないようですね。inclusionは値が単一であることが前提なので使えません。独自バリデーターを書く必要があります。

Gistにアップしたので参考にどうぞ。

[whitelist_validator](https://gist.github.com/gomo/08f7205ab1bfb90603f421452539bedf)


ちなみに`app/validations`に独自バリデーターを置くのはよくやるっぽいですが、パスを通さないと読み込まないので注意してください。

```rb
# config/application.rb
config.paths.add Rails.root.join('app', 'validators').to_s, eager_load: true
```

本筋とは関係ないですがホワイトリストは`white list`ではなく`whitelist`という一語なんですね。
【PHP】空白を削除しつつ全角文字を半角文字に変換する

# 空白を削除しつつ全角文字を半角に変換したい

 - 空白スペースを削除
 - 全角文字を半角文字へ変換

の順番で処理を行う

# `preg_replace`を使用する方法

以下のような文字列から空白スペースを取り除きかつすべて半角文字に変換する

## コード

```php
<?php

$code = '　ＡＢＣ　ＤＥＦ　Ｇ １２３４　５６７　８　ABCD 12345　';

$print = preg_replace('/( |　)/', '', mb_convert_kana($code, 'a', 'UTF-8'));

var_dump($print);
```

↓出力結果

```
string(24) "ABCDEFG12345678ABCD12345"
```

# 処理の内容

 -  `mb_convert_kana`のオプション(以下 [PHP: mb_convert_kana - Manual](http://php.net/manual/ja/function.mb-convert-kana.php) から引用)

   - a 「全角」英数字を「半角」に変換します

 -  `preg_replace`
  -  単純に半角スペースまたは全角スペースを空文字に変換しているだけ


# `str_replace`を使用する方法

しかしながら公式のドキュメントでは以下のように書かれている

[PHP: str_replace - Manual](http://php.net/manual/ja/function.str-replace.php)

> (正規表現のような) 技巧的な置換ルールを必要としない場合、 preg_replace() の代わりにこの関数を常用するべきです。

ので`str_replace`を使用した方がいいようです。

## コード

```php
<?php
$code = '　ＡＢＣ　ＤＥＦ　Ｇ １２３４　５６７　８　ABCD 12345　aaaああ ああ　 ';

$print = str_replace([' ','　'], '', mb_convert_kana($code, 'a', 'UTF-8'));

var_dump($print);
```

↓出力結果

```
string(39) "ABCDEFG12345678ABCD12345aaaああああ"
```



# 参考

- [PHP: mb_convert_kana - Manual](http://php.net/manual/ja/function.mb-convert-kana.php)
- [PHP: str_replace - Manual](http://php.net/manual/ja/function.str-replace.php)
開発環境のDBデータを本番環境にコピーする

たまに開発環境で作ったマスターデータを`where`で絞って本番環境にコピーしたいときがある。
いつも`mysqldump`コマンドを忘れるのでメモ。

- whereで絞ったデータをmysqldump

```sql
/* mysqldump [user名] [パスワード] [ホスト] [データベース名] [テーブル名] [where句] > [ファイル名] */
/* -t オプションをつけて drop table と create table をつけない */

mysqldump -uhoge -pfuga -h 012.345.678.9 hogehoge_db -t hoge_tb --where 'id > 100 and id < 301' > dump.sql
```

- scpでローカルに落とす

```sql
scp hogehoge-develop:/path/to/dump.sql ./
```

- 本番サーバにアップ

```sql
scp ./dump.sql hogehoge-production:/path/to/
```

- インポート

```sql
/* mysqldump [user名] [パスワード] [ホスト] [データベース名] < [ファイル名] */
mysql -uhoge -pfuga -h 012.345.678.9 hogehoge_db < dump.sql
```

参考にしました。
[mysqldumpオプションまとめ。whereで条件を指定したりする](https://tech.basicinc.jp/articles/82)
稼働中RailsアプリのDBに対してカラム追加・削除する

# 前提
usersのテーブル定義は以下の状態でサービス稼働中

```ruby:user.rb
class User < ActiveRecord::Base
end

$ User.column_names
# => ["id", "name", "created_at", "updated_at"]
```

# ここにカラム`email`を追加すると起きる問題

## 1. プリペアドステートメントでエラー

以下の記事より

https://qiita.com/hirokishirai/items/d2374324c8c7d265363f

>アプリケーションが動作しているプロセス以外からRDBに定義の変更を加えると、トランザクション内部でプリペアドステートメントが発生する場合にエラーになります。

>```
ActiveRecord::PreparedStatementCacheExpired: ERROR:  cached plan must not change result type
```

>PostgreSQLの場合、テーブルに定義的な変更が加わった場合、プリペアドステートメントの再作成を必須としています。

## 2. modelのschema cacheでエラー
ActiveRecordでは`ApplicationRecord`クラスを継承したmodelはrailsがDBのschema情報から、アクセサメソッドなどを追加してくれるのですが、model毎に初回テーブルアクセス時にschema情報をキャッシュしています。
その為、キャッシュしているschema情報と実際のschemaに差分があるとエラーが発生します。
例えば以下は、稼働中に`email`カラムを増やし、cacheが残ったままアクセスした場合に発生します。

```
ActiveModel::UnknownAttributeError: unknown attribute 'email' for User.
```

# 対策

## Rails5以降

`ActiveRecord::Base.ignored_columns`で`email`カラムをActive Recordに対して隠蔽する。

```ruby:user.rb
class User < ApplicationRecord
  self.ignored_columns = %w(email)
end

$ User.column_names
# => ["id", "name", "created_at", "updated_at"]
```

## Rails4

`ActiveRecord::Base.columns`をオーバーライドして`email`を読み込ませないようにする。

```ruby:user.rb
class User < ActiveRecord::Base
  def self.columns
    super.reject {|column| column.name == 'email'}
  end
end

$ User.column_names
# => ["id", "name", "created_at", "updated_at"]
```

# to_jsonを使う場合

`to_json`を使用する時は上記では対策できずエラーになるので`except`オプションを使用します。

```ruby
$ JSON.parse(User.all.to_json).first.keys
# => SystemStackError: stack level too deep

$ JSON.parse(User.all.to_json(except: [:email])).first.keys
# => ["id", "name", "created_at", "updated_at"]
```

# 参考
https://eagletmt.hateblo.jp/entry/2017/09/24/004709
http://48n.jp/blog/2017/03/06/ignored-columns-rails5/
https://qiita.com/hirokishirai/items/d2374324c8c7d265363f
React Native 記事置き場



## Lerna

`#monorepo`

> Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.

### Official

- https://lernajs.io/
- https://github.com/lerna/lerna

### Links

- `en` [Use Lerna with React Native?](https://stackoverflow.com/q/41514167/1583560) - StackOverflow
- `en` [Nkzn/NkznTodo, multi-package](https://github.com/Nkzn/NkznTodo/tree/master/multi-package) (GitHub)
- `en` [Sharing React Components with Lerna](https://www.nearform.com/blog/sharing-react-components-with-lerna/) - Andrew Cashmore
- `繁` [透過 Lerna + CircleCI 來管理 monorepo 與發佈 NPM packages](https://medium.com/funnyfoo/%E9%80%8F%E9%81%8E-lerna-%E8%88%87-circleci-%E4%BE%86%E7%AE%A1%E7%90%86-monorepo-%E8%88%87%E7%99%BC%E4%BD%88-npm-packages-de81d527432a) - Chiahao Lin
- `简` [用Lerna管理多包JS项目](https://zhuanlan.zhihu.com/p/33858131) - Richard
- `简` [lerna管理前端packages的最佳实践](https://juejin.im/post/5a989fb451882555731b88c2) - 破晓前
- `简` [lerna基本使用](https://www.my-fe.pub/post/lerna-basic-use.html) - 小翼的前端天地
文系のHTM/CSS学習（２）

#1. CSS
##1.1　CSSとは
HTMLの要素に対して、大きさや色、配置を指定する言語
CSSはHTMLとは別のファイルに記述する

##1.2　基本文法
考え方としてはHTMLのどの要素に対して何かを行うかを指定する。

```css:stylesheet.css
/*This is a comment*/

h1 {
 color: red;
}
```

h1（対象）をセレクタ、color(変更部分)をプロパティという

要素はclassを使って名前をつけることが可能で、
それによって識別し、各々に別のCSSを適用することができるようになる。
classを指定するときは必ず.（ドット）を先頭につけるがタグにはつけない。

```css:stylesheet.css
.selected {
 color: #ff0000;
}
```

##1.3 よく使うプロパティ一覧
| プロパティ名 | 変更部分 |
|:-:|:-:|
| color  |  文字の色 |
| font-size  | 文字のサイズ  |
|  font-family | 文字のフォント  |
|  background-color | 背景色  |
| width  | 幅  |
|  height | 高さ  |
Rubyの並列HttpリクエストGem Typhoeusを使ってみる

# Typhoeusのコードの例
あまりネットにコーディングの例が載っていなかったので自分で動かしてみました。apiのURLなどのは各自で用意してください。

# 前回記事
[Rubyでhttpリクエストを並列処理](https://qiita.com/m-dove/items/62c9c5a7f4ffcbdbcaea)

# Gemのインストール
コマンドでインストール

```terminal
gem install typhoeus 
```
Gemfileでインストール

```Gemfile
gem 'typhoeus'
```

# Railsで動かしてみる
railsのrakeファイルを作って動かしてみます。想定はapiにクエリを渡し並列化してhttpリクエストを送る。返ってきたjsonを保持することです。

```terminal
rails g task typhoeus_task

//返ってくる create  lib/tasks/typhoeus_task.rake
```

すると、lib/tasks/にtyphoeus_task.rakeファイルができます。``rake``とは``ruby+make``でc言語の``make``コマンドを思い浮かべてもらえばと思います。できたてのファイルは以下のようになっているはず。(#TODOは勝手に書いています)

```ruby
 namespace :typhoeus_task do
  #TODO ここに内容を書く。                                             
 end          
```

これを次のように書く。urlやtokenは各自書き換えてください。注意点としては返ってくるjsonがそのままではUnicodeエスケープされている可能性があるので、そのままでは扱えないことがあります。JSON.load()に入れてやるとデコードしてくれます。

```ruby
 namespace :typhoeus_task do
   task :para_request => :environment do
     
     search_items = ["a","b","c"]
     items = access_api(search_itmes)
     pp items
   end  

   def access_api(search_items)
     token = "aiueo" 
     url = "https://example.com/search"
     
     hydra = Typhoeus::Hydra.hydra
 
     requests = search_items.map do |s_item| 
       body_json = JSON.pretty_generate({"hogequery": s_item}) 

       header = {"Content-Type": "application/json", "X-Auth-Token": token}
       request = Typhoeus::Request.new(url, headers: header, method: :post, body: body_json, followlocation: true)
       hydra.queue(request) #キューに入れていく
       request #これが新しい配列に入っていく
     end

     hydra.run #httpリクエスト実行。結果はrequest.responseに入る

     # responseをjsonにして新しい配列を作る。
     responses = requests.map do |request|
       JSON.load(request.response.body)
     end

     return responses
                         
 end     

```

そしてターミナルで次のように打つと動くようになる。

```terminal
rails typhoeus_task:para_request
```

もしもっと良い書き方があるよって方がいれば、教えていただけると嬉しいです。
フロントエンドの n年耐性 再考

ポエムです。自分は直近まで、中長期運用でも破綻しないために、どの様なコードにすべきか？というテーマに取り組んでいました。

クリーンアーキテクチャもそこを目指しますが、いかんせん学習コストが安くありません。誰でも今すぐ実践出来ること・脳内整理としてメモを残します。


## 経年劣化と戦うために

アーキテクチャ、ライブラリの流行に逆らうことは出来ないです。なぜなら、ひと昔前のコードベースは、保守メンバーのモチベーションを劣化させ、人員がプロダクトから離れていってしまうからです。プロダクトの本質とは無関係なこの負債要因を、誰しも感じているのではないでしょうか。

このコードベース置換は甚大な影響範囲のため、気軽に置き換えることは出来ません。この変化を受け入れる仕組みがあれば、誰しも幸せになれる、と設計者は夢を見ます。


## 将来頼れるコード

もし今、あなたが React を使っていて、Vue に移行するという決断が下された場合。何割のコードがどの様な形で残るでしょうか？ 恐らく汎化モジュールとして切り出された純関数と、少しの DOM構造くらいの、ポータブルなものだけが残ります。

筆者も過去、CoffeeScript から babel へ移行した際、この知識が切り出されていたおかげで、工数が削減出来た場面がありました。

**「ポータブルな純関数に重きを置くこと。ただし現コードで汎用的コンテキストに置く必要は無い」**これが自分の n年耐性の答えです。どんなに堅牢な設計でも、時代に合わないレールなら見直し、その時保守するメンバーのモチベーションを最大化させる、そんなコードであるべきだと思います。

未来の実装者も最新のアーキテクチャの中で、資産として残された純関数を頼りに、伸び伸びと新しいコードを書くことが出来るのではと思います。
PhpStormで不可視文字(スペース等)を表示する設定

PhpStormでスペースやタブ等の空白不可視文字を可視化するには「Preference」→「Editor」→「General」→「Appearance」の「Show whitespaces」にチェックを入れる。

<img width="1030" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/26d3222e-cb03-4c2a-f3e4-19b0e1d15255.png">
Nextcloud Meetup Tokyo #01 を開催します！

# Nextcloud Meetup Tokyo #01 を開催します。

開催概要については以下をご参照ください。

* Nextcloud Meetup Tokyo #01 - connpass  
https://nextcloudjp.connpass.com/event/91014/

**東京に来られない方も YouTubeで視聴可能です。URLはConnpassページに公開します**

## 1. Nextcloud 社 Frank Karlitschekさんが来られます。
ownCloudの創設者であり、現在はNextcloud のマネージングディレクターであるFrank Karlitschekさんが来日されます。 
 
Nextcloudの創設の経緯やNextcloudの目指しているところ、そして最新のNextcloud 13の機能や特色について様々語っていただこうと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/15176/6aab5fd6-fb79-d29c-785d-75a9df7349da.png" width=25%>

## 2. 翻訳状況についての情報共有

Nextcloudの翻訳は、Transifexというプラットフォームで翻訳がコミュニティで進められています。

Nextcloud | 日本語
https://www.transifex.com/nextcloud/nextcloud/language/ja_JP/

日本語への翻訳の状況や優先順位など情報共有を行います。

## 3. 日本でのNextcloudの利用状況や事例など

スタイルズ社で導入したNextcloudの導入実績や、Nextcloudの機能の一つであるSAML認証設定時の障害事例などをご紹介します。

* Nextcloud導入実績紹介
* SAML認証設定の注意点

## 4. Nextcloud についての情報交換

ビールやピザを食べながら、参加者からのNextcloudについて聞きたいことをFrankさんにフランクにいろいろ聞いてみます。

**質問 大募集中しています**

1. Nextcloudの今後注力する分野や機能は？
2. etc.
Macのメニューバーが反応しない全ての人へ

# 概要

突然、Macのメニューバーが押せなくなることがありませんか。

<img width="436" alt="スクリーンショット 2018-06-12 9.46.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/83509/fb70f416-bab7-965b-67ee-8486cb46c777.png">

押しても押しても反応しない。Wi-Fiの切り替えやBluetoothが...
英数・かな変換までも...
再起動するしかない...つらい...

そんな時の解決方法を見つけました！

# 解決方法

## ターミナルを起動

1. Command キー ＋ スペースバー
2. ターミナルと打ち込む

<img width="813" alt="スクリーンショット 2018-06-12 9.50.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/83509/ffbe2c0e-924d-3ddf-9ed9-a3ebc82a769c.png">

## コマンドを打ち込む

ターミナルは色は違うと思いますが、こんな画面です。

<img width="697" alt="スクリーンショット 2018-06-12 10.00.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/83509/64964c47-1276-4d5d-1137-cc56fdc749c9.png">

ここに下記のコマンドを打ち込んで、Enter...!!

```
$ killall SystemUIServer
```

これで直るはずです:raised_hands:
macのvimでクリップボードにコピーを使いたい！！

なんと、mac標準のvimではクリップボードにコピーができないらしい！！！

まあ一応確認しておきましょう。

```.bash
vim --version | grep clipboard
```
と打ってみてください。

このように、「-clipboard」と書かれていればアウトです。vimでクリップボードは使えません！！

![スクリーンショット 2018-06-12 9.00.31.png](https://qiita-image-store.s3.amazonaws.com/0/238739/23252eb3-d37a-bdaf-2c6b-445e3665df1d.png)



解決方法はHomebrewでvimをインストールしてくることです。

# Homebrewでvimをインストール

まずは最新にアップデート

```.bash
brew update
```

そして、インストール

```.bash
brew install vim 
```

# クリップボードを使えるか確認してみる

`/usr/local/Cellar/vim/8.1.0001/bin/vim`の8.1.0001の部分は人によって違うので、正しいバージョンに書き直してください。


```.bash
/usr/local/Cellar/vim/8.1.0001/bin/vim --version | grep clipboard
```
出力結果で、「+clipborad」となっていればOK!!!!!

![スクリーンショット 2018-06-12 9.07.00.png](https://qiita-image-store.s3.amazonaws.com/0/238739/c1d9c69c-c679-33d9-695a-bd3e71d35a81.png)


# 前のvimを無効にして、新しいvimを使えるようにする

前のvimの名前を変更すれば使えなくなるようになります。

```.bash
sudo mv /usr/bin/vim /usr/bin/old_vim 
```

新しいvimを使えるようにする

```.bash
sudo ln /usr/local/Cellar/vim/8.1.0001/bin/vim /usr/bin
```

# vimの設定で、クリップボードを使えるようにする

`~./.vimrc`に以下のコードを付け足す

まずは、.vimrcがあるかどうかを確認しましょう。
（前のバージョンのvimをよく使っていた方は普通に.vimrcに付け足してもらえればオッケーです。）

```.bash
ls ~/.vimrc
```

これで、`.vimrc`と出てくれば、そこに以下のコードを貼り付けてください。

```
set clipboard+=unnamed
```

`.vimrc`が出てこなければ、作ります

```.bash
touch ~/.vimrc
```
そして、`.vimrc`にさっきのコードを貼り付けてください。

# vimでクリップボードにコピーを使ってみる。

vimのいろんな使い方も同時に紹介しているので、コピーのやり方だけ知りたい方はその部分だけご覧ください。

vim初心者はコマンドを真似してください。vimコマンドやその他のコマンドがわかるようになると思います！
（コマンド練習用に新しいファイルを作りますが、そのファイルを消すコマンドも併せて使用しているので、無駄なファイルが残ることはありません。安心してください。）

## 新しいファイルを作る

```.bash
touch clipboard.php
```

## そのファイルをvimで扱う

```.bash
vim clipboard.php
```

「vim !$」でも可（次で使います）

## インサートモードにする

- 「i」を押してください。インサートモードになります。
インサートモードにすると、文字を挿入することができるようになります。

- 以下の文章を打ってください。

```
<?php echo "clipboardにコピーをする"; ?> 
```

- Escキーを押してください。(インサートモード解除)

- 「:wq」と打ってください（上書き保存）

## 文字が入力されたか確認します。

以下のコードを打ってください。

```
cat !$
```

`!$`は一つ前の、コマンドじゃないところが同じの時に使います。

さっき、`vim clipboard.php`と打ったので、`cat !$`と打つと、`cat clipboard.php`という意味になります。


`<?php echo "clipboardにコピーをする"; ?>  `と出てきたら成功です！

## もう一度vimを使用して、クリップボードにコピーをしよう

- 以下のコマンドを実施してください。
先ほど説明したように、`!$`は一つ前の、コマンドじゃないところが同じの時に使います。
vim clipboard.phpという意味になります。

```
vim !$
```

- 一番最初にカーソルを合わせて、「v」を押してください。（ビジュアルモードにします）

- 矢印キーで最後まで洗濯してください（コピーしたい範囲を選択）

- 「y」を押す（コピーします。vimではコピーのことを「ヤンク」というらしい。だから「y」なのか）

- Escキーを押します（ビジュアルモード解除）

- 「:q」を押す（vimを終了します。）

- お使いのテキストエディタを開けて、貼り付けしてみてください！できていれば成功です

## ファイルを削除する

もう使わないので、このファイルを削除しちゃいましょう。
ファイルの削除はrmコマンドです。「remove」からきたのかな？

```.bash
rm !$
```

## ファイルが削除できているか確認してみましょう

```.bash
ls !$
```

`clipboard.php: No such file or directory`と出ればオッケーです！



## 手順通りにやったら、ターミナルはこんな感じになっているはず

![スクリーンショット 2018-06-12 9.22.27.png](https://qiita-image-store.s3.amazonaws.com/0/238739/f35d949b-9a6d-a241-e23c-a0529f41df44.png)




おしまいです！
GPSの研究　その2

#概要
GPSを理解したい。

#測位の仕組み
##GPS信号
 GPS衛星は、L1（1575.42 MHz）とL2（1227.60 MHz）の2つの周波数帯域で信号を送信します。
L1帯には、全てのユーザが利用できる標準測位（SP）コードが含まれており、C/Aコード（シグネチャコードとして使用）とPコードの組み合わせとなっています。
L2帯には変調Pコードが含まれ、電離層遅延の計測に使用できます。
それにより、高精度測位サービスが利用できる際の精度を高めることができます。
昨今の商用GPS信号では、L2信号を利用して、L2帯で必要な機器を使用せずに、電離層遅延を計測することができます。

##GPSデータ
 GPSデータ信号は、1500ビット（フレーム）の長さを持ち50ビット/秒で送信される一連のデータセットです。
12分半後に、全てのデータセットが送信されます。
それらのフレームはさらに、サブフレーム（300ビット）、そしてワード（30ビット）に分割されます。
各サブフレームには、受信機が正確な位置情報を提供するのに役立つナビゲーション情報が含まれています。
 satellite time情報は、衛星伝送時間と時間修正に必要なデータを合わせたものです。
各衛星信号の遅延情報を得るため、平均電離層データが任意の位置と時間における衛星信号のおおよその位相遅延を受信機に提供します。
 また、各衛星はephemeris、つまり正確な軌道データを送信します。
このデータは制御ステーションから受信されるもので、1時間ごとに更新されます。
Ephemerisデータは誤差なしで最大4時間有効です。
このデータを使って、特定の時間における衛星の位置を計算します。
 軌道上の全ての衛星が持つAlmanacデータは、すばやく受信機を起動するのに役立ちます。
このデータは、全てのGPS衛星の近似軌道データです。

##信号の構造
 各衛星には、毎ミリ秒反復する1023ビットの疑似ランダムノイズ（PRN）からなる固有の識別子（C/Aコード）があります。
このシグネチャコード信号は、排他的論理和式（XOR）を使ってデータ信号を変調します。
その信号はさらに、バイナリ位相偏移変調（BPSK）によってL1搬送波に変調されます。
このシグネチャコードを受信機が使用して、ユーザ位置を計算します。

##位置の計算
 各GPS受信機は、特定の衛星のC/Aコードを生成して、そのデータと受信中の信号の関連性を比較します。
特定の衛星と受信機の間で相関関係が認められると、信号の遅延が計算されます（約67 ms）。
この時間に光速を乗算して、受信機と衛星間の距離を特定します。
衛星に搭載された原子時計は高精度の同期信号を生成しますが、受信機のクロックはそこまで正確ではありません。
衛星のクロックと受信機のクロックの速度にはわずかな誤差があるため、受信機が測定した時間遅延は、実際の移動時間に受信機側の時間誤差を足したものとなります。
この総時間に光速（c）を乗算したものが、疑似距離（PSR）です。
各疑似距離は、ユーザから衛星までの実際の距離に、受信機のクロックによって生じた誤差がプラスされています。
ユーザの位置（X, Y, Z）は、4基の衛星の疑似距離を算出し、X、Y、Z、および時間誤差について4つの別々の方程式を解くことで求められます。
衛星の位置は、受信機の視野内にある各衛星のephemerisデータとalmanacデータから知ることができます。

##位置精度
受信機に搭載されている精度が完璧でないクロックによる誤差の他にも、GPS計測の精度に影響をもたらす誤差の原因は存在します。
GPSでは、複数の要因が信号の精度に影響します。

大気の影響
GPS信号は、光速で移動すると考えることができます。信号は大気中（電離層）を移動するため、減速してさらに時間遅延が発生します。
データコード内を伝送される電離層データにより約70ナノ秒ほどの大気による遅延が発生するため、残余誤差は10メートルほどとなります。電離層情報が正確でなければ、位置の精度は低下します。

視野
視野が低下すると、受信したGPS信号の強度は大幅に減少することがあります。
L1帯の場合、衛星が供給する地上での最少信号強度は-130 dBmです。プラスティックのような物質でも、信号の劣化の原因となります。

マルチパス誤差
受信機近くの地表面から反射された信号が、衛星から直線経路で到達した信号と間違えられたり、干渉することがあります。
マルチパスは検知が難しく回避が困難なため、0.5 mほどの誤差の原因になります。 

精度劣化操作
精度劣化操作は、地上の監視ステーションから制御します。
C/Aコードを時変信号（極めて低周波）で意図的に偏向させ、受信機が生成するC/Aコードと受信したC/Aコードの相関関係を低下させます。信号の周波数を低く保つと、数時間に及ぶ計測を平均化しない限り意図的な誤差は平均化されません。

人為ミス
制御セグメントから送信されたデータの誤りや、受信機（ハードウェア/ソフトウェア）のエラーなども、位置の誤差の原因となります。
これらのエラーによって、数メートルから数百キロメートルの誤差が生じることがあります。

以上。
[vuejs] 無料テンプレートまとめ (Dashboard/Admin Template)


# vue-paper-dashboard

![Kobito.Hv0oTE.png](https://qiita-image-store.s3.amazonaws.com/0/170309/eb61600f-9f21-8a3f-a8e4-9c5cac5c8293.png "Kobito.Hv0oTE.png")

* Live Demo

https://demos.creative-tim.com/vue-paper-dashboard/#/dashboard

* Source

https://github.com/cristijora/vue-paper-dashboard

# vue-element-admin


![Kobito.D40pqa.png](https://qiita-image-store.s3.amazonaws.com/0/170309/f2935985-c8d3-61c0-dbe9-7b5dd3eba7c3.png "Kobito.D40pqa.png")

* Live Demo

http://panjiachen.github.io/vue-element-admin/#/dashboard

* Source

https://github.com/PanJiaChen/vue-element-admin

# iview-admin

* ![Kobito.8dXXP3.png](https://qiita-image-store.s3.amazonaws.com/0/170309/c3f2701e-6c46-6fa0-84eb-96ff157e5fca.png "Kobito.8dXXP3.png")

* Live Demo

https://iview.github.io/iview-admin/#/home

* Source

https://github.com/iview/iview-admin

# vue2-elm (Mobile)

![Kobito.CbJLuG.png](https://qiita-image-store.s3.amazonaws.com/0/170309/b338937f-3619-e959-1042-580429f63fab.png "Kobito.CbJLuG.png")

* Live Demo

https://cangdu.org/elm/#/home

* Source

https://github.com/bailicangdu/vue2-elm

# iview-vue-admin

![Kobito.EcJP3S.png](https://qiita-image-store.s3.amazonaws.com/0/170309/3a9df812-7ebc-f640-9f59-c396ed2d953f.png "Kobito.EcJP3S.png")



* Live Demo

https://tonyluo.github.io/iview-vue-admin/#/home


* Source
https://github.com/TonyLuo/iview-vue-admin
LXD + Ubuntu 18.04 + MATE + xrdpでリモートデスクトップ環境を作る

# 概要

最近、古いサーバやノートPCを実験台に使うにはLXDがいろいろと勝手が良い(少ないメモリでも動く、マイグレーションしやすい)ことがわかった。
ということで、デスクトップ環境もLXDとxrdpで準備。

* ホストOS: Ubuntu 18.04 LTS Server
* LXD: 3.1.0 (snap版)
* LXDコンテナはホストと同じネットワークにブリッジ接続(設定方法は拙記事[Ubuntu 18\.04 Server \+ LXDでブリッジ接続する \- Qiita](https://qiita.com/330k/items/9ef10da53fa9dfb1e1a9)を参照)

## コンテナ起動

~~~bash
$ lxd launch ubuntu:18.04 MATEDESKTOP
~~~

## コンテナのIPアドレス固定

Ubuntu 18.04からはネットワークの設定がnetplanになっていて設定方法が変わっているので注意。

以下のは

* コンテナのIP : `192.168.10.228`
* サブネットマスク : `255.255.255.0` (netplanでは`/24`で指定)
* ゲートウェイ : `192.168.10.253`
* DNSサーバ: `192.168.10.234`と`192.168.10.236`
* IPv6 : 使用しない

という設定。

~~~
# vi /etc/netplan/99_config.yaml
~~~

~~~:99_config.yaml
network:
  version: 2
  ethernets:
    eth0: 
      dhcp4: false
      dhcp6: false
      addresses: [192.168.10.228/24]
      gateway4: 192.168.10.253
      nameservers:
        addresses: [192.168.10.234, 192.168.10.236]
~~~

~~~
# ip addr flush eth0
# netplan apply
~~~

`lxd launch`時にDHCPで割り当てられているIPアドレスを`ip addr flush eth0`で消し、
netplanの設定を`netplan apply`で適用。

## MATEデスクトップ環境のインストール

今回はデスクトップ環境としてMATEをインストールしてみた。
もちろん他のデスクトップ環境も可。

~~~
# apt update
# apt install mate-desktop mate-desktop-environment mate-desktop-environment-extra mate-session-manager
~~~

## xrdpのインストールと設定

Ubuntu 18.04ではxrdpのバージョンも上がっているので、普通にaptでインストール。

~~~
# apt install xrdp
~~~

デスクトップ環境にMATEを使うように設定。

LXDのコンテナには、デフォルトで`ubuntu`というユーザが作成されているので、
これをリモートデスクトップの接続用ユーザにする。

~~~
# echo "mate-session" > /home/ubuntu/.xsession
# chown ubuntu:ubuntu /home/ubuntu/.xsession
~~~

接続用ユーザのパスワードを設定しておく。

~~~
# passwd ubuntu
~~~

# RDP接続する

これでWindowsのリモートデスクトップから接続できるはず

## アプリケーションをインストール

MATEターミナルから必要なソフトウェアをインストールして、
デスクトップ環境として使えるようにすればOK。

~~~
$ sudo apt install chromium-browser
$ sudo apt install firefox
~~~

# トラブルシューティング
## GUIからログアウトできないとき

インストールするパッケージが不足したりすると、デスクトップ画面にログアウトが表示されなかったりする。
そんなときはターミナルを起動(ショートカットはCtrl + Alt + T)して以下のように入力する。

~~~
mate-session-save --logout
~~~

## リモートデスクトップのセッションがフリーズしたとき

ホストから`lxc exec MATEDESKTOP /bin/bash`でコンテナに入り、
`xrdp-sesman`というプロセスを`kill`。

## どうしようもないとき

コンテナを削除してから再度作成してしまえばOK。
仮想マシンよりも高速に削除や作成ができるコンテナならでは。
特定のR/BioconductorのパッケージをインストールしたDockerイメージを作成してみる

# この記事の概要

- 特定のR/BioconductorのパッケージをインストールしたDockerイメージを作成する記事です。
- 例としてBioconductorのパッケージ [sleuth](http://pachterlab.github.io/sleuth/) をインストールしたイメージを作成します。

# Dockerfileを置くGitHubのリポジトリの作成

Dockerfile専用のリポジトリ`Dockerfiles`を作成

# Dockerfileの作成

作業用ディレクトリの準備

```
$ mkdir Dockerfiles
$ cd Dockerfiles
$ mkdir sleuth
$ cd sleuth
```

上記のディレクトリに以下の`Dockerfile`を作成。
Bioconductorのパッケージを`biocLite`でインストール。

```Docker:Dockerfile
FROM bioconductor/release_base2:R3.5.0_Bioc3.7
MAINTAINER hoge <hoge@gmail.com>

RUN R -e 'source("http://bioconductor.org/biocLite.R"); \
biocLite("devtools", ask=F); \
biocLite("getopt", ask=F); \
biocLite("remotes", ask=F); \
biocLite("pachterlab/sleuth", ask=F); \
biocLite("grimbough/biomaRt", ask=F)'

RUN mkdir /data
```

上記のDockerfileからイメージ`docker-username/sleuth`を作成
`docker-username`はDocker Hubに登録したID

`$ docker build -t docker-username/sleuth .`

イメージ作成が失敗したら、Dockerfileを修正してやり直し

作成したイメージが動くかを試す

```terminal
$ docker run --rm -it docker-username/sleuth /bin/bash
# R
R version 3.5.0 (2018-04-23) -- "Joy in Playing"
（中略）
> library("sleuth")
（正常にパッケージがロードできることを確認）
> sessionInfo()
R version 3.5.0 (2018-04-23)
（中略）
other attached packages:
[1] sleuth_0.30.0        BiocInstaller_1.30.0
（中略）
# exit
```

# DockerfileをGitHubへコミット

Dockerfileを格納したディレクトリ`sleuth`の上位ディレクトリ`Dockerfiles`をコミット

```terminal
$ cd Dockerfiles
$ echo "# Dockerfiles" >> README.md
$ git init
$ git add .
$ git commit -m "first commit”
$ git remote add origin git@github.com:username/Dockerfiles.git
$ git push -u origin master
```

コミット後のリポジトリは[このような感じです](https://github.com/youyuh48/Dockerfiles)

# DockerHubのリポジトリの作成しイメージを登録

GitHubのリポジトリに置いたDockerfileを参照

- DockerHubにログイン
- Create -> Create Automated Build -> Create Auto-build Github
- Dockerfileを格納したリポジトリを選択
- Repository Name は作成したいイメージ名 -> Create
- Build Settings タブ
    - When active, builds will happen automatically on pushes. のチェックを外す
    - Dockerfile LocationはDockerfileを置いたディレクトリを指定`/sleuth`
    - Docker Tag Nameにイメージのバージョン（メインパッケージの）を指定`0.30.0`
    - Save Changesをクリック
    - Triggerをクリックするとイメージがビルドされる
- Build Details タブ
    - Successになればビルドが完了

# Docker Hubからイメージをダウンロード

```terminal
# テストでローカルに作成したイメージを先に削除
$ docker rmi youyuh48/sleuth
$ docker pull youyuh48/sleuth:0.30.0
```

# 作成したコンテナ内でRのスクリプトを動かす

- `-v`でホストのカレントディレクトリがコンテナ内の`/data`からアクセスできる
- カレントディレクトリ内のRのスクリプト`hoge.R`を実行
- スクリプトの引数に入出力ファイルのパスを`/data/xxx`のように渡す
- スクリプトの出力ファイル`output.txt`がホストのカレントディレクトリにできる

```terminal
$ docker run --rm -it -v `pwd`:/data \
 youyuh48/sleuth:0.30.0 \
 Rscript /data/hoge.R /data/input.txt /data/output.txt
```

# 参考

- [Docker Hub と連携する - Docker User Guide - Qiita](https://qiita.com/zembutsu/items/b0fbb1ca1a759eff31e4)
- [増え続ける Dockerfile 用の GitHub Repository をなんとかする - Qiita](https://qiita.com/suecharo/items/a5e0cd3fe6d31443c536)
- [Bioconductorのパッケージ開発環境を作るためのDockerfile - Qiita](https://qiita.com/antiplastics/items/fb13f8c9cde61f3f9bd1)
- [ツールのコンテナ化 - Pitagora-Galaxy Wiki](http://wiki.pitagora-galaxy.org/wiki/index.php/%E3%83%84%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E5%8C%96)
tblsでデータベースドキュメントを生成する（2.テーブル情報補完編）

> 1. [ドキュメント生成編](https://qiita.com/k1LoW/items/2010413a8547b1e6645e)
> 2. [テーブル情報補完編](https://qiita.com/k1LoW/items/92d1be1437a259827338)
> 3. [CI連携編](https://qiita.com/k1LoW/items/1517fc4470de3f121f11)

tblsは外部キー制約を見てテーブル間のリレーションを判断します。

![posts.png](https://qiita-image-store.s3.amazonaws.com/0/808/2a559de1-723f-5112-28c8-35a5171728fc.png)

> 上記のER図のテーブルを結ぶ線がリレーション

ただ、データベースによっては、ORMにリレーション設定を任せていて外部キー制約を設定していなかったり、その他様々な理由で外部キーを張ることができないことがあると思います。

tblsでは、テーブル間のリレーションをER図やテーブル情報に補完してドキュメントを生成できます。

さらにテーブルのコメント情報なども補完できます。

これは、

- すでに大規模運用していて安易にALTERできないテーブルへのコメント追加
- VIEWテーブルへのコメント追加
- コメントサポートしていないデータベースへのコメント追加

などが可能になるため便利です。

### リレーション

リレーション情報を補完する場合、 .tbls.yml に以下のように記述していきます

```yaml
---
dsn: mysql://dbuser:dbpass@localhost:3306/dbname
docPath: doc/schema
relations:
  - # logsテーブルにおける FOREIGN KEY(user_id) REFERENCES users(id) と同様
    table: logs
    columns:
      - user_id
    parentTable: users
    parentColumns:
      - id
    def: logs->users
  - # logsテーブルにおける FOREIGN KEY(post_id) REFERENCES posts(id) と同様
    table: logs
    columns:
      - post_id
    parentTable: posts
    parentColumns:
      - id
```

### コメント

コメント情報を補完する場合は、以下のよう記述していきます。

```yaml
comments:
  -
    table: post_comments
    comment: 各投稿についたコメントの詳細確認用VIEWテーブル
    columnComments:
      post_user: 投稿したユーザ名
      comment_user: コメントしたユーザ名
```

---

このように、例えば[キーレスエントリ](https://www.google.co.jp/search?ei=Z_4eW5vEIsX58QX4t6nYBw&q=%E3%82%AD%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA+SQL&oq=%E3%82%AD%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA+SQL)なデータベースでも、コメントが十分でないデータベースでも、「使える」データベースドキュメントが生成できます。

次は[tblsをCIに組み込む方法](https://qiita.com/k1LoW/items/1517fc4470de3f121f11)を紹介します。
tblsでデータベースドキュメントを生成する（1.ドキュメント生成編）

> 1. [ドキュメント生成編](https://qiita.com/k1LoW/items/2010413a8547b1e6645e)
> 2. [テーブル情報補完編](https://qiita.com/k1LoW/items/92d1be1437a259827338)
> 3. [CI連携編](https://qiita.com/k1LoW/items/1517fc4470de3f121f11)

tblsを使うと、1コマンドでデータベースドキュメントを生成できます。

## tbls とは

https://github.com/k1LoW/tbls

tblsのKey featuresには以下のように記載しています

- **Document a database automatically in GFM format. Output database schema in many formats.**
    - 1コマンドで、Markdown形式で生成されますので、そのままGitHubなどのリポジトリにコミットして閲覧することができます（ドキュメントも更新履歴が残ったほうがいいですからね）。
    - 上記以外にもスキーマをPlantUMLやJSON、Excelファイルで出力する機能などもあります
- **Single binary = CI-Friendly.**
    - Goで書かれているため、バイナリポン置きで利用できます。つまり、CIに組み込み安いということです。
- **Support many databases.**
    - v1.24.1 時点ででサポートしているデータベースは以下の通りです
        - PostgreSQL
        - MySQL
        - SQLite
        - BigQuery
        - Cloud Spanner
        - Amazon Redshift
        - Microsoft SQL Server
        - Amazon DynamoDB
- **Work as linter for database.**
    - ドキュメント生成だけでなくLinterとしても動きます

## インストール

tblsはGo製のCLIツールなので`go get`でインストールできます。

```console
$ go get -u github.com/k1LoW/tbls
```

Macの場合はHomebrewでインストールすることも可能です。

```console
$ brew install k1LoW/tap/tbls
```

Docker imageも用意されています

```console
$ docker pull k1low/tbls:latest
```

### ~~オプション: Graphviz のインストール~~ ER図もtbls単体で生成可能

tbls v1.27.0からER図の生成もtbls単体で生成可能になっています

## データベースドキュメントの生成

以下のように `.tbls.yml` を作成します。

```yaml
# .tbls.yml

# 接続先として、データベースの種類(`mysql`)、ユーザ名(`dbuser`)、パスワード(`dbpass`)、ホスト名(`localhost`)、ポート(`3306`)、データベース名(`dbname`)を以下のように記載します
dsn: mysql://dbuser:dbpass@localhost:3306/dbname

# ドキュメントのディレクトリを指定します
docPath: doc/schema
```

あとは `tbls doc` を実行します

```console
$ tbls doc
```

これだけでデータベースドキュメントが生成されます。

これらをGitHubなどにコミットすれば、[このような感じで](https://github.com/k1LoW/tbls/tree/master/sample/mysql8)コミット可能なドキュメントとしてデータベース情報を確認できます。

<img width="1050" alt="スクリーンショット 2018-06-11 23.24.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/808/aac6a0ea-538a-2fc2-bdae-2b078864cf9a.png">

### .tbls.ymlを使わないでドキュメント作成

.tbls.ymlを作らなくてもワンライナーでのドキュメント生成が可能です。

PostgreSQLだと以下のように.tbls.ymlの `dsn`と`docPath`の情報を引数に渡すことで作成できます。

```console
$ tbls doc postgres://user:pass@hostname:5432/dbname ./dbdoc
```

（接続できない場合は `?sslmode=disable` を付与してください）

---

たった1コマンドでデータベースのドキュメント生成ができました。

次はドキュメントに[リレーション情報やコメントを補完する方法](https://qiita.com/k1LoW/items/92d1be1437a259827338)を紹介します。
Ubuntu 16.04 LTS + Google Chrome > フリーズする > ハードウェアアクセラレーションをOFFにする

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

### 症状

Google ChromeでWebを閲覧中、マウスカーソルが固まるほどのパフォーマンス低下が発生する。

### 対処

下記を見つけた。
https://askubuntu.com/questions/765974/chrome-freeze-very-frequently-with-ubuntu-16-04

記載に従い「ハードウェア アクセラレーションが使用可能な場合は使用する」をオフにしてみた。

これでどうか、様子を見る。

### 変更後
(2018/06/18 追記)

変更後、１週間弱が経過した。マウスカーソルが固まるようなパフォーマンス低下は見られない。


### 問題発生
(2018/06/20 追記)

Qiitadon閲覧時にChromeが固まった。
マウスカーソルは動くが、ターミナルの起動などはできない状態。
交差エントロピー（Cross Entropy）について

交差エントロピーってなんだろう，と思ったのでメモ．結果的に「交差エントロピーの最小化は，真の分布とのKLダイバージェンスの最小化と等価である」ということがわかった．後者の方が解釈が楽だと思うので，メモがてら書いてみる．

「距離」というのはわかりやすい．特に，「真の関数との距離を最小化する」というのは直感的に同意しやすい．今回は，確率密度（質量）関数の距離みたいなもの（正確には距離ではない）の一つ，KLダイバージェンスというものを扱う．二つの確率密度関数$p, q$間のKLダイバージェンスは以下のように定義される．

$$
KL(p||q) = \int p(x) \log \frac{p(x)}{q(x)} dx
$$

離散型なら，

$$
KL(p||q) = \sum_{x} \log \frac{p(x)}{q(x)}
$$

と定義される．

ここで，$p$を真の確率密度関数とし，そのモデルを$q$とする．$q$にはよく，softmaxや，(standard) logistic functionなんかが用いられる．これらのKLダイバージェンスを最小化する$q$を求めることを考えると，連続型の場合，

$$
\begin{align}
q^* &= \arg\min_{q} KL(p||q) \\\
&= \arg\min_{q} - \int p(x) \log q(x) dx
\end{align}
$$

となる．離散型の場合，

$$
\begin{align}
q^* &= \arg\min_{q} KL(p||q) \\\
&= \arg\min_{q} - \sum_{x} p(x) \log q(x)
\end{align}
$$

となる．結果的に，最小化しているのが，「交差エントロピー」と呼ばれているだけ．
もう少し踏み込んで，確率的二値分類を考えてみる．確率的な二値分類では，入力を$x$，出力を$y \in \\{-1, 1\\}$とすると，$p(y|x)$を推定したいわけだが，このモデルを$q(y|x)$とする．これらのKLダイバージェンスを最小化する$q^*$は以下のようになる．

$$
\begin{align}
q^* &= \arg\min_{q} KL(p||q) \\\
&= \arg\min_{q} - p(y=1|x) \log q(y=1|x) - (1 - p(y=1|x))\log(1 - q(y=1|x)
\end{align}
$$

以上．ちなみに，最尤推定も以下のようにKLダイバージェンスの最小化とみなすことができる．

$$
\begin{align}
q^* &= \arg\min_{q} KL(p||q) \\\
&= \arg\min_{q} - \int p(x) \log q(x) dx \\\
&\approx \arg\min_{q} - \frac{1}{n} \log q(x_i)
\end{align}
$$

ただし，$x_i \overset{i.i.d.}{\sim} p(x) \ \forall i = 1, \ldots, n$．
GPSの研究

#概要

GPSを理解したい。

#GPSとは

　衛星測位システムを言う。GPSは、個別案件なので、お上は、GNSSを使えと言ってる。
　米国の GPS、ロシアの GLONASS、欧州の. Galileo、中国の BeiDou、日本の QZSS、インドのIRNSS

#GPS

 GPS 測位は，1970 年代にアメリカ国防総 省により軍事目的に GPS 衛星が打ち上げられたのが始まりであるが、1990 年代後半からカー ナビゲーションシステムや一部測量技術などの民生用技術への転用が図られるようになった。
 2000年5月に、一部の紛争地域を除き、スクランブル信号が解除され、民間でも高精度な位 置計測が可能となったこともあり、民生利用が加速した。

　GPS 衛星は、基本周波数 10.23[MHz] の電波と、これを 154 倍した L1 (1575.42[MHz])、120 倍した L2 (1227.60[MHz])の 2 つの搬送 波を発信している。またそれと同時に、衛星の軌道パラメータ、原子時計の補正値、電離層、伝播遅延の補正値、衛星の健康状態などの航法メッセージも送信している。GPS 衛星による 位置計測では、未知数が、受信機の位置 X,Y,Z,および誤差の 4 つであるため、最低でも 4 つ の GPS 衛星を同時に捕捉し、各 GPS 衛星からの距離から誤差および GPS 受信機の位置を求 める。誤差の中には、衛星の原子時計の誤差、受信機の時計誤差、電離層遅延誤差、対流圏 遅延誤差がある。GPS 受信機 1 台のみの情報から位置を計測することを単独測位と呼ぶが、 単独測位では誤差が計測できず、その位置精度は 20[m]程度であり、このままでは、移動体の位置計測には使用することができない。そのため、GPS 受信機を 2 台用いることで、2 台の 受信機に共通する誤差を計算し、測位精度を高めるディファレンシャル GPS (DGPS)と呼ばれる測位手法がある。DGPS 測位では 1 台の GPS 受信機を基準局とし、座標が既知の点に設置 することで、もう 1 台の GPS 受信機の基準局からの相対位置を求める。DGPS 測位では 2 台 以上の受信機が必要となるが、現在の日本では、電子基準点と呼ばれる固定の GPS 衛星連続 観測点が全国で約 1200 箇所存在し、電子基準点を利用することで、1 台の GPS 衛星で DGPS 測位が可能となっている。電子基準点の情報は、国土地理院のホームページ上で公開されて おり、誰でも使用可能になっている。また電子基準点の情報をリアルタイムに配信するサー ビスも一般企業で行われている。GPS 衛星による位置測位は，時間による累積誤差が発生し ないというメリットがある一方で、上述のように最低でも 4 基以上の GPS 衛星を同時に捕捉 する必要がある。

#大きな出来事

##GPSのスクランブルの廃止　
　2000年５月。

##日本測地系から世界測地系（WGS84）
　測量法で規定されている「測量の基準」が、日本測地系から世界標準である世界測地系に改正され　２００１年4月1日から施行されました。


以上。
AngularのHttpHeadersの罠。set, appendの新しい名前を考えたいだけの人生だった

Angular4以降で導入された `HttpHeaders`　。
正直、これを使わなくても良い感じに `HttpClient` は書けるので、使う必要のある場面は多くはない。
でも、公式っぽいから使いたいと思ってしまい、いつも罠にはまる

`HttpHeaders` には、 `set`, `append`, `delete` メソッドが存在する。
しかし、 `HttpHeaders` は `immutable` なので、奇妙な動きをする。

例えば下記のような記述をする

```.ts
const headers = new HttpHeaders({ 'Content-Type': 'application/json' });
headers.set('Accept', 'application/json');

headers // => どうなる?
```

一見なにも間違っていない。 `headers` には、 `Content-Type` と `Accept` の両方のヘッダーが存在しているはずです。
普通なら。

しかし、上記コードでは `HttpHeaders` は `immutable` なので、変更されない。
なんと `set` は **新しく `HttpHeaders` を作って返す** メソッドなのだ。

つまり、上記コードを正しく各なら下記のように書く必要がある

```.ts
let headers = new HttpHeaders({ 'Content-Type': 'application/json' });
headers = headers.set('Accept', 'application/json');

headers // => どっちも設定される！
```

なんという罠 :scream: 

この問題、何が問題って `set` という名前が、自分を変更しているように感じるのだ。

いわゆる　**名前重要** ってやつです。

しかし、考えてみても良い名前が浮かばない。
 `Ruby` なら `!` のあるなしで判断できるのだが、 JS では、どうしたら良いかわからない。（いや本当に `Ruby` はよくできた言語です）
でもとにかく `set` で自分を変更しないのは気持ち悪い。

非常に腹立たしいのだが、良い名前が思いつかない！！

良い名前があったら `feature request` したいので、良さげな名前があれば教えてください :bow:
awkで特定の文字をカウントする

[文字列中に含まれる特定の文字数を数える awk プログラム](http://www.mogami.com/unix/awk-programing.html)によると、`split()`を使って特定の文字の数を数えることができるようなので、試してみました。

# テスト用ファイルを作成する

テスト用に、タブが4つ含まれたファイルを作成します。

```shell-session:タブが4つ含まれたファイルを作成する
miminashi@mmns2016:02$ printf 'aaa\tbbb\tccc\n' > hoge.txt 
miminashi@mmns2016:02$ printf 'aaa\tbbb\tccc\n' >> hoge.txt 
miminashi@mmns2016:02$ cat hoge.txt 
aaa	bbb	ccc
aaa	bbb	ccc
```

# 文字をカウントする

```shell-session:文字をカウントする
$ cat hoge.txt | awk '{count += (split($0, a, "\t") - 1)} END{print count}'
4
```
DonkeyCar の製作（TAMIYA GF-01）（旧バージョン2.5.1）

![3BaV8bIyFiY.jpg](https://qiita-image-store.s3.amazonaws.com/0/263672/173585ec-4b2d-0b8d-1e2e-5bbaf5f3b5ab.jpeg)
https://youtu.be/3BaV8bIyFiY
https://youtu.be/Yx5GyGCTK7g
![RIMG0241.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/778a0422-6a85-2e7a-49fe-91e7e8693aa7.jpeg)
![RIMG0242.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/3544df4e-fbea-cf6f-d3e5-ca0c5eee66e2.jpeg)
![RIMG0243.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/9d228cef-4976-55ef-1e5d-b915201ed160.jpeg)

#用意するもの
RCカーシャシ：ステアリングとスピードをPWMで制御する方式の物※1参照
バッテリー＆充電器：シャシに対応したもの
PWMドライバ：I2CをPWMに変換するPCA9685
マイコンボード：RaspberryPi3
ベースボード：部品等を配置してシャシの上に設置※2参照
ラズパイ用カメラ：広角レンズが望ましい(標準品は未確認，USBカメラは非対応)
マイクロSDカード：16Gバイトの産業用またはビデオ録画用の高耐久品を推奨
無線ゲームコントローラ：ジョイスティックが2チャネルあるもの※3参照
（スマホ等のブラウザからコントロール出来るので無くても可）
コース：照明の反射に注意

#※1 RCカーシャシ
RCカー操縦に慣れないうちはスピードが低い方が操縦が容易なためギヤレシオの大きいタミヤGF-01を選択![RIMG0215.JPG](https://qiita-image-store.s3.amazonaws.com/0/263672/5d44c3ae-7f53-f94f-82e9-80ce252b85ff.jpeg)
タイヤは標準の大径オフロードタイヤをオンロードタイプに交換
バッテリ電源分岐コード：タミヤ AO-5038 LDEライトユニット(TLU-01)電源分岐コード![84169_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/263672/77603699-766a-182a-9cd3-29181326aab0.jpeg)
RC送受信機は使用しない

#※2 ベースボード
![baseboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/263672/cf306a85-8690-7b11-5885-102acb68ac3a.jpeg)
ユニバーサル基板：シャシに4本あるボディ支持用の柱に載せる
PWMドライバボード：秋月電子通商AE-PCA9685
ラズパイ5V電源用DCDC：ストロベリーリナックスTPS63070 可変型昇降圧DC-DCコンバータモジュール(2.5V～9V)
電源コネクタ：バッテリから分岐したコードを接続する
カメラ取付台：撮影画像にコース線が写り込むようカメラを路面に向ける
六角スペーサで台を作りその上にサーボを載せてカメラを取り付ける
![wrmg90sseta.jpg](https://qiita-image-store.s3.amazonaws.com/0/263672/e03934a2-3896-e2f4-0327-32ebd0603aa5.jpeg)
http://eleshop.jp/shop/g/g402117/
配線図：![schematic.jpg](https://qiita-image-store.s3.amazonaws.com/0/263672/955cc3b9-ae35-370b-4c5a-590c0329a0f2.jpeg)
【訂正】上の図でラズパイ3からPWMドライバのVCCにつなぐ端子名が「５V」になっていますが「３．３V」の間違いです．

#※3 無線ゲームコントローラ
ロジクール ワイヤレスゲームパッド F710
![wireless-gamepad-f710.png](https://qiita-image-store.s3.amazonaws.com/0/263672/f18ac078-4fae-d3c8-beb7-c12b425df587.png)
が使用可能
確率の公式

機械学習で不確実性を扱う時は確率を使うのが最もよく使われますが、その定理。確率は論理学において不確実性を扱えるようにした物という解釈もあります。

# 余事象の定理（not）

```math
P(\bar{A}) = 1 - P(A)
```

# 加法定理（or）

```math
P(A \cup B) = P(A) + P(B) - P(A \cap B)
```

### 排反
A と B が互いに排反の時 $P(A \cap B) = 0$ であり $P(A \cup B) = P(A) + P(B) $。

# 乗法定理（and）

```math
\begin{align}
P(A \cap B) &= P(B \mid A)\ P(A) \\
P(A \cap B \cap C) &= P(C \mid A \cap B)\ P(B \mid A)\ P (A)
\end{align}
```

### 条件付き確率 
```math
P(A \mid B) = \frac{P(A \cap B)}{P(B)}
```

### ベイズの定理
```math
P(A \mid B) = \frac{P(B \mid A)\ P(A)}{P(B)}
```

上記にあたり、分子が既知なら一般的には分母は下記が使える事が多いです。

```math
P(B) = \sum_a P(B \mid a)\ P(a)
```

ベイズの定理に C を追加。

```math
P(A \mid B \cap C) = \frac{P(B \mid A \cap C)\ P(A \mid C)}{P(B \mid C)}
```

# 周辺確率
```math
P(A) = \sum_b P (A \cap b) = \sum_b P(A \mid b)\ P(b)
```

これに C を追加。

```math
P(A \mid C) = \sum_b P (A \cap b \mid C) = \sum_b P(A \mid b \cap C)\ P(b \mid C)
```
Mavenで依存関係を読み込み直す

#概要
Mavenは便利だが、依存関係でたまに頭を悩ませる。リポジトリでのパッケージの更新が反映されないことがあるからだ。
#解決策
```shell:コンソール
maven package -U
```
こうすると、強制的に依存関係を取り込み直す。
#レファレンス
https://stackoverflow.com/questions/39914204/could-not-resolve-dependencies-until-the-update-interval-has-elapsed-or-upda