OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftUIでfillとstrokeを同時に指定する

# 実装方法

Shapeクラスを拡張します

```Shape+.swift
import Foundation
import SwiftUI

extension Shape {
    /// fills and strokes a shape
    public func fill<S:ShapeStyle>(
        _ fillContent: S,
        strokeContent: S,
        strokeStyle: StrokeStyle
    ) -> some View {
        ZStack {
            self.fill(fillContent)
            self.stroke(strokeContent, style: strokeStyle)
        }
    }
}
```

# 使用例

```PieceBackground.swift
import SwiftUI

struct PieceBackground: View {
    static let backgroundColor = SwiftUI.Color(red: 245 / 255, green: 222 / 255, blue: 179 / 255)

    var body: some View {
        GeometryReader { geometry in
            Path { path in
                let width = min(geometry.size.width, geometry.size.height)
                let height = width
                let spacing = width * 0.06
                let middle = width / 2
                let topWidth = 0.38 * width
                let topHeight = 0.12 * height

                let topPoint = CGPoint(x: middle - topWidth, y: topHeight + spacing)
                path.addLines([
                    topPoint,
                    CGPoint(x: spacing, y: height - spacing),
                    CGPoint(x: width - spacing, y: height - spacing),
                    CGPoint(x: middle + topWidth, y: topHeight + spacing),
                    CGPoint(x: middle, y: spacing),
                    topPoint
                ])
            }
            .fill(Self.backgroundColor, strokeContent: Color.black, strokeStyle: StrokeStyle(lineWidth: 0.5))
        }
    }
}

struct PieceBackground_Previews: PreviewProvider {
    static var previews: some View {
        PieceBackground()
    }
}
```

![preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9875/32c7653a-50e6-22d2-f0b5-13de802c6a17.png)

# 参考

https://stackoverflow.com/a/60425421
Ubuntu 20.04でFujifilm X-T3をwebcamとして使う方法

Summary 
========

+ Fujifilm X-T3をwebcamとして使うためのソフトウェア「FUJIFILM X Webcam」はWindows, Mac向けのみでLinuxは非対応。
+ 普段使用のUbuntu 20.04でもFujifilm X-T3をWebcamとして使用したい。
+ Gphoto2とffmpegを使えばできるので、以下に手順を纏める。


# セットアップ

まずは必要なパッケージをインストール

``` bash
sudo apt-get install gphoto2 v4l2loopback-utils v4l2loopback-dkms ffmpeg
```

インストール完了後に現状の/dev/video*を確認

``` bash
ll /dev/video*
```

手元環境はノートPC、内蔵カメラ付きで以下の表示

``` bash
crw-rw----+ 1 root video 81, 0  8月 25 15:00 /dev/video0
crw-rw----+ 1 root video 81, 1  8月 25 15:00 /dev/video1
```

次にdummy video deviceを追加

``` bash
sudo modprobe v4l2loopback exclusive_caps=1 max_buffers=2
```

追加されたデバイスの番号を確認

``` bash
ll /dev/video*
```

手元環境では以下の表示

``` bash 
crw-rw----+ 1 root video 81, 0  8月 25 15:00 /dev/video0
crw-rw----+ 1 root video 81, 1  8月 25 15:00 /dev/video1
crw-rw----+ 1 root video 81, 2  8月 26 09:45 /dev/video2
```

`/dev/video2`が追加されたダミーデバイス。これを後で使う

追加されたデバイスの情報を確認

``` bash 
v4l2-ctl --device=/dev/video2 --info
```

手元ではこのような表示

``` bash
Driver Info:
        Driver name      : v4l2 loopback
        Card type        : Dummy video device (0x0000)
        Bus info         : platform:v4l2loopback-000
        Driver version   : 5.4.44
        Capabilities     : 0x85208000
                Video Memory-to-Memory
                Read/Write
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x85208000
                Video Memory-to-Memory
                Read/Write
                Streaming
                Extended Pix Format
                Device Capabilities
```

X-T3とPCをUSB接続し、以下を実行するとgphoto2が標準出力にビデオを映像を流し、
ffmpegが流れてきたrawvideoを/dev/video2にyuv420pフォーマットで書き込んでいく。

``` bash
gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video2
```

ここで、zoomを立ち上げ、ビデオデバイスにdummy deviceを選択すれば
X-T3のWebcam化完了


# 仕上げ

以下のコマンド毎回打つのは手間なので、自動で実行するよう仕上げておく

``` bash
sudo modprobe v4l2loopback exclusive_caps=1 max_buffers=2
```

dslr-webcamというモジュールを作って、読み込んで欲しいリストに入れておく

``` bash
cat << 'EOS' >> /etc/modprobe.d/dslr-webcam.conf
# Module options for Video4Linux, needed for our DSLR Webcam
alias dslr-webcam v4l2loopback
options v4l2loopback exclusive_caps=1 max_buffers=2
EOS

echo "dslr-webcam" >> /etc/modules
```

追記
===

再起動したら、`/dev/video0`がDummy deviceになっていた。

以下のコマンドで確認

``` bash 
v4l2-ctl --device=/dev/video0 --info
```

キャプチャ開始の度にコマンドを覚えていられないので、`fuji`コマンド作成。

``` bash
cat << 'EOS' > ~/bin/fuji
gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video0
EOS
chmod +x ~/bin/fuji
```

もう一度再起動した後も`/dev/video0`がDummy deviceだったので、手元環境ではノートPCのカメラよりも先に`dslr-webcam`がロードされているみたい。

zoomではwebcamとして使えるが、Skypeでは真っ黒。
Skypeで使う時は下記URLを参考にスケールを変更`-vf scale=1024:567`するとOK。

``` bash
gphoto2 --stdout --capture-movie | ffmpeg -i - -vcodec rawvideo -vf scale=1024:567 -pix_fmt yuv420p -f v4l2 /dev/video0
```

https://answers.microsoft.com/en-us/skype/forum/all/video-feed-from-capture-device-elgato-cam-link-4k/e596fff6-c7df-49b8-8d25-e19b5235aea4

# 参考資料

https://medium.com/nerdery/dslr-webcam-setup-for-linux-9b6d1b79ae22
【Ruby on Rails】Railsのバージョンを変更する方法

# 【Ruby on Rails】Railsのバージョンを変更する方法

Ruby on Railsはv5.1以降と以前で、form_withヘルパーメソッドが使えたり使えなかったりなど、バージョンによる差異がある。


cloud9でデフォルトでインストールされているrailsはv5.0のため、Railsオフィシャルページに沿って実装を進めていくとエラーが発生する。


##目次

1. [バージョンを指定してアプリ作成する](#バージョンを指定してアプリ作成する)
2. [古いバージョンの削除](#古いバージョンの削除)
3. [v6.0以降の注意点](#v60以降の注意点)




##バージョンを指定してアプリ作成する

```
#1) 現在使用しているバージョンを確認
rails -v


#2)インストール済みのrailsのバージョンを確認
gem info rails
```


5.0系が２つインストールされている場合
例：`rails (5.0.7.2, 5.0.0)`と表示される。

<br>

```
#3)最新版をインストール
gem install rails


#3')バージョンを指定してインストールする場合
gem install -v 5.2.3 rails


#4) インストール済みのrailsのバージョンを確認
gem info -e rails
```

バージョンが追加されていればOK
例：`rails (6.0.3.2, 5.2.3 5.0.7.2, 5.0.0)`


<br>

```
#5) バージョンを指定してアプリを作成
rails _5.2.3_ new アプリ名
```

以上で新しいバージョンで、アプリを作成することができる。



##補足
作成したアプリでrailsのバージョンを確認する。

Gemfileを開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563526/39d11970-12f1-9348-b755-1bcc535e8e6c.png)

```:Gemfile
gem 'rails', '~> 5.2.3',
```



##古いバージョンの削除

```
gem uninstall rails -v バージョン
```



<br>
##v6.0以降の注意点
v6.0以降よりwebpackerのインストールが必須となった。
これがないと、サーバー立ち上げ時やbundle install時にエラーが発生する。


```:エラー
Please run rails webpacker:install
```

<br>
▼追加でインストールが必要なツール

・node: yarnをインストールするために必要
・yarn: JSのパッケージ管理ソフト。webpackerをインストールするために必要。
・webpacker
javascriptのwhile文とif文でゲームっぽい練習

```javascript
<script>
//変数を作る
let enemy = 100;
let command;
let kougeki;
```
これは最初に変数を用意すべきなのかな？
この場所で宣言しているだけなのかな？

```javascript
while(true){
//promptは()の中に表示される文字を記載する
//選択肢は更に中に（）で記載し【番号】で選択する
command = prompt('敵が現れた！(【1】戦う【2】逃げる)');
kougeki = Math.floor(Math.random()* 40);
```
このwhile文でこの後のif文が成立している間は繰り返すという処理になっているのかな？

```javascript
if(command === '1'){
  
  //敵の体力からランダム数値の攻撃ダメージを引く
  enemy = enemy - kougeki;
  
  //ランダムダメージ数を表示
  console.log(kougeki + '攻撃！')
    
  //倒した時の処理
  //下記if文の(enemy <= 0)がtrueになるまで繰り返す
  if(enemy <= 0){
  console.log('敵を倒しました！')
  break;
  }
    //敵の残体力を表示
  console.log('敵の残り体力は' + enemy + 'です！'　)
}
```
【１】を選んだ場合は＜enemy(敵の体力)＞からランダムで選ばれた＜kougeki（攻撃）＞の数値を引く
<enemy(敵の体力）>が0より小さくなったら、'敵を倒しました。'
<enemy(敵の体力）>が0よりも大きかったら、'敵の残り体力は・・・'と表示する。


```javascript
　//ifの｛｝の外に記載する。【２】を選んだ時の処理
  else if(command === '2') {
  console.log('無事に逃げれました');
  break;
}  
```
最初の選択肢で【２】を選んだ時の処理。

```javascript
}//while文の閉じ｝です。
 //
console.log('ゲーム終了です！')
</script>
```
敵を倒すか、無事に逃げるかしたら処理終了

### 全文
```javascript
<script>
//変数を作る
let enemy = 100;
let command;
let kougeki;

while(true){

//promptは()の中に表示される文字を記載する
//選択肢は更に中に（）で記載し【番号】で選択する
command = prompt('敵が現れた！(【1】戦う【2】逃げる)');
kougeki = Math.floor(Math.random()* 40);

if(command === '1'){
  
  //敵の体力からランダム数値の攻撃ダメージを引く
  enemy = enemy - kougeki;
  
  //ランダムダメージ数を表示
  console.log(kougeki + '攻撃！')
    
  //倒した時の処理
  //下記if文の(enemy <= 0)がtrueになるまで繰り返す
  if(enemy <= 0){
  console.log('敵を倒しました！')
  break;
  }

    //敵の残体力を表示
  console.log('敵の残り体力は' + enemy + 'です！'　)

　//ifの｛｝の外に記載する。【２】を選んだ時の処理
} else if(command === '2') {
  console.log('無事に逃げれました');
  break;
}  
}

console.log('ゲーム終了です！')
</script>
```
oracleからsqlserver入門（最初につまづいた事）

DBならほぼOracleを住みかとしていた筆者は、PostgreSQLなど他のDB案件を対応してもそこまで困りませんでした。
そのためRDBなら大枠の仕掛けは同じと思っていたら、突然に躓きました。
それは、`初めてSQLServer`を使った時でした。

細かく書いてしまうと纏まらないため、手始めにこれだけ前知識として持っていれば良かったなと思う部分を記述していきます。
後は問題あれば都度ググって方針を決めていけば、、といった所です。

#はじめに困ったこと#
**・大文字/小文字の区別をしない（デフォルト）**
　`サーバーレベル`か`SQL単位`で変えられますが、これが一番面をくらいました（苦笑
　例えば、aとAを区別しません。
**・半角/全角の区別をしない（デフォルト）**
　カタカナが代表例でしょうか。これも地味にいやらしい気がします。

#コレーション（collation）#
SQL単位での検索方法を指定するやり方があります。具体的には下記です。
参考: [T-SQL: ケースセンシティブ（大文字と小文字を区別して）で文字列を比較する](https://sql55.com/query/t-sql-case-sensitive-string-comparison.php)
**・CI、CS**
　一文字目の` C は大文字小文字(Case) `という意味です。 二文字目の` I (Insensitive) `は区別なし` S (Sensitive) `は区別ありです。
**・WS**
　全角・半角文字を区別するオプション

#コレーション（collation）　※サーバーレベルで変更する場合#
やり方は公式サイトで公開されています。
参考: [サーバーの照合順序の設定または変更](https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/set-or-change-the-server-collation?view=sql-server-ver15)
ただし、変更は可能なんですが、SQL単位に指定するのが面倒だという理由で安易に設定するのはやめましょう。
その影響範囲を把握しておかないと大変なことになるかも知れません。
どうしても設定したい場合は、格納されるデータとSQL検索されるケースをしっかり把握してから利用しましょう。

筆者は、大文字小文字の区別をしない方が利用者にとってメリットがあったため、デフォルト設定を仕様として定める事にしました。

#その他#

**・null値と空文字**
完全に区別されます。
DBによって仕様差異が散見されるやつです。
※この仕様を把握しておかないと兎に角、不具合を起こしやすいです。

>例えば、テーブル定義でnull不可として空文字をセットする仕様として、DBデータからnull値を排除した方が扱いやすいように思えますが、、
>残念ながら`外部結合`した場合、対象レコードが無いと`null値`がとれるため上手くいきません。もちろん、手間をかければできます。
>この事を知らずに後で知ったとき、プログラマーがSQLを書くという環境の場合、プログラマーがめっちゃ苦労します。
>不具合の発生率も高まることになりますので、方針を決める方はよくよく留意してほしいところかと思います。

**・文字連結のときのnull値**
文字とnullを連結すると、結果がnullになります。
※例えば`COALESCE関数`などで空文字に置き換えてやる必要があります。


#接し方をかえてみる#
総じて感じたのは、SQLServerはOffice製品（筆者はExcelがイメージしやすい）の方を向いている気がしました。
特に検索は、表現が正しいとは思いませんが`デフォルト設定はExcelの検索`に寄っているような感触です。
RDBのガチガチの検索イメージから少し切り替えて、`Excelのデータを検索しているくらいの感覚`を取り入れれば、うまく付き合って行けそう、、。
案外、大文字小文字の区別をしない検索は、利用者が求めている機能だったりします。

ここでは書きませんが、SQLServerは便利機能がモリモリで、いいところも沢山あります。うまく使えば強い味方になりそうです。


以上になりますが、参考になれば幸いです。
Main Thread の Unit Test（UnitTest探求記3）

Unit Test 探求記は、unit test に関してまったりと実験しつつその過程を綴ってみるというものです。

# 今回のお題
MainThread(Ui Thread)の unit test を行ってみます。

# テスト対象
今回は、current thread が main thread かどうかを判断する val を作成して、それをテスト対象とします。

[source tree](https://github.com/beyondseeker/of-commons/tree/c23ccd94c73ab67f923c0b53abf42b740ba41a71)

## ◆ isMainThread

[soruce](https://github.com/beyondseeker/of-commons/blob/c23ccd94c73ab67f923c0b53abf42b740ba41a71/android/src/main/java/com/objectfanatics/commons/android/os/package.kt)

```kotlin
val isMainThread: Boolean
    get() = Thread.currentThread() == Looper.getMainLooper().thread
```

# Unit Test
- `Looper` を直接利用するので、instrumented test を用います。
- `@UiThreadTest` を用いて main thread 上での実行をテストします。
- Assertion に `Google Truth`, `AssertJ`, `Hamcrest` を利用してみます。[^1]

## ◆ build.gradle.kts
`UiThreadTest`, `Google Truth`, `AssertJ` への依存関係を追加します。

[source](https://github.com/beyondseeker/of-commons/blob/c23ccd94c73ab67f923c0b53abf42b740ba41a71/android/build.gradle.kts)

```kotlin
// for androidx.test.annotation.UiThreadTest
androidTestImplementation("androidx.test:rules:1.2.0")

// for Google Truth
androidTestImplementation("com.google.truth:truth:1.0.1")

// for AssertJ
androidTestImplementation("org.assertj:assertj-core:3.12.2")
```

## ◆ Unit Test

使い勝手の違いに興味があったので、Assetion に `Junit`, `Google Truth`, `AssertJ`, `Hamcrest` を同時に利用してみました。[^1]

[source](https://github.com/beyondseeker/of-commons/blob/c23ccd94c73ab67f923c0b53abf42b740ba41a71/android/src/androidTest/java/com/objectfanatics/commons/android/os/PackageKtInstrumentedTest.kt)

```kotlin
/**
 * Running on worker thread.
 */
@Test
fun isMainThread_ReturnsFalse() {
    // Junit
    Assert.assertFalse(isMainThread)

    // Google Truth
    Truth.assertThat(isMainThread).isFalse()

    // AssertJ
    Assertions.assertThat(isMainThread).isFalse()

    // Hamcrest
    MatcherAssert.assertThat(isMainThread, `is`(false))
}

/**
 * Running on main thread.
 */
@Test
@UiThreadTest
fun isMainThread_ReturnsTrue() {
    // Junit
    Assert.assertTrue(isMainThread)

    // Google Truth
    Truth.assertThat(isMainThread).isTrue()

    // AssertJ
    Assertions.assertThat(isMainThread).isTrue()

    // Hamcrest
    MatcherAssert.assertThat(isMainThread, `is`(true))
}
```

## ◆ テスト結果
下記のように、テストに成功しました。

```
$ ./gradlew connectedAndroidTest

> Task :android:connectedDebugAndroidTest
Starting 2 tests on ASUS_X00PD - 8.0.0

BUILD SUCCESSFUL in 33s
59 actionable tasks: 9 executed, 50 up-to-date
```

# まとめ
今回は、`@UiThreadTest` を用いた main thread のテストを行い、Assetion に `Junit`, `Google Truth`, `AssertJ`, `Hamcrest` を利用してみました。

[^1]: どれか1つでよいわけなのですが、比較検討するために、しばらく併用してみようと思います。
Slackの分報をリアクションで分類する

# 2014年くらいからずっとSlackで個人の分報を続けている

思い出したようにメモったり忘れたり。
ブログに書くようなことではなかったり、いつ頃何やっていたか、どうしてこういう設計にしたか、
などを思い出すために書いている。
もしくは、そこからブログや勉強会のネタを探したり。

# ある程度メモが溜まってくるといつメモったか分からなくなる

検索ワードも思ったような単語ではヒットしなかったりする。
余談だが最近はチャンネルから日付指定で特定の場所まで飛べたりするので便利。

# それでSlackのリアクションをタグ代わりにしてメモを分類している

絵文字はAWSとかNPMとか適当にロゴを絵文字として追加して利用している。
以前、SlackのリアクションはWebサイトから追加しないといけなかったので、カテゴリ用の絵文字を追加するのは面倒だったが、最近はSlackアプリから追加できるようになったので、以前ほど億劫ではなくなった。

Slackにはポストという機能もあるが、あれは検索にヒットしないような気がするので、
ポストの分類もできるのが何気に嬉しい。いや、ポストはそんなに使ってないかも。

# 絵文字を登録したら自分のメモにリアクションするだけ

どんな絵文字があるか覚えられないので `:aws_*:` のようにプレフィックスを付けたりしている。
ちなみに、AWS用の絵文字はここに公式アイコン集があるので、それを利用している。
https://aws.amazon.com/jp/architecture/icons/

# `has:` という検索モディファイアを使って絵文字を検索する

`:aws_appsync:` という絵文字を検索するには `has::aws_appsync:` と入力する。
途中コロンが2つになるので注意。
さすがに絵文字名の前方一致とかはできないらしい。

動画の通り、絵文字が存在すれば表示が変わるので分かりやすい。 

![slack.search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379/55f65860-a8a8-c1fb-fd8e-148e99a19932.gif)

# もし複数人がいるチャンネルだったら

1人なら何も気にすることはないが、複数人いる分報のような情報共有のようなチャンネルがあった場合、
誰かが誰かのメモにリアクションで分類してくれるかもしれない。
:thumbsup: とか分類用のリアクションではないリアクションがされたとしても、
別に検索に影響ないし問題ないと思う。
Fetchmail で IMAP のメールをどこかに転送

私の設定を並べておく。

まず、fetchmail は **未読フラグを元に配送の可否を決める** ので、事前に**すべてのメールを既読に**しておくこと。


# インストール

```sh
sudo apt install fetchmail
vim /etc/default/fetchmail # START_DAEMON=yes にする
```

メール転送のSMTPサーバーとして exim4 も入れておく。

```sh
sudo apt install exim4
```

デーモン有効化 & 起動 (注意: 以下「確認」で動作確認しておいたほうがよい)

```sh
systemctl enable fetchmail
systemctl start fetchmail
```

# /etc/fetchmailrc

以下の内容で、

- 60秒おきにフェッチ
- 未読メールを転送
- サーバーからメールを削除しない

という設定になる。

パスワードは平文になってしまうため、 `chown root /etc/fetchmailrc; chmod go-rwx /etc/fetchmailrc` が必要。


```
set daemon 60
set postmaster root
set syslog

# 送信者にメールを返送しない（重要！）
set no bouncemail

defaults
  bad-header accept
  protocol auto
  no mimedecode
  no fetchall
  # メールをIMAPサーバーから削除しない
  keep

poll hostname.of.your.imap # IMAPサーバーのホスト名
  protocol imap
  port 993
  # IMAP にログインするためのユーザ名/パスワード
  username "your_user_name" 
  password "pasSsw0Rd"
  ssl
  # 転送先
  smtpname "foobar@exapmle.com" 
  # 転送に使うSMTPサーバー
  smtphost localhost

```


# 転送用ローカル SMTP サーバー (exim4) の設定

exim4 からプロバイダなりのメールサーバーを経由して送る。
注意しなければならないのは、Gmail だと (確か) From が送信者に書き換わってしまうことだ。私はプロバイダのメールを使っている。

## /etc/exim4/update-exim4.conf.conf

`sudo dpkg-reconfigure exim4-config` で設定して、以下のような内容であることを確認しておく。　

```
dc_eximconfig_configtype='smarthost' # 'satellite' でもよいが, ローカルユーザー向けのメールも外に行ってしまう
dc_other_hostnames='your.host.name' # dpkg-reconfigure が適当に埋めるはず
dc_local_interfaces='127.0.0.1 ; ::1'
dc_readhost='your.host.name' # dpkg-reconfigure が適当に埋めるはず
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='your.smtp.server::25' # 適当に置き換える。プロバイダのメールなら hostname::port のようにコロンが2つでないとNG. プロバイダなら ::587 かもしれない
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='true'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'
```

## /etc/exim4/passwd.client

送信メールサーバーに認証が必要なら、`/etc/exim4/passwd.client` にユーザ名とパスワードを書いておく。

```
your.smtp.server:your_user_name:pasSw0Rd
```


# 確認

fetchmail を、上記の `/etc/fetchmailrc` を参照しつつコマンドライン起動する。

```sh
sudo -ufetchmail bash
FETCHMAILHOME=/var/lib/fetchmail fetchmail -c -f /etc/fetchmailrc -v -v
```

ここで `-c` は `set daemon 60` を無視して1度だけメールを取得して終了するオプション。 `-f ファイル` は設定ファイルの指定、 `-v -v` は ログの詳細度の増加. `FETCHMAILHOME=/var/lib/fetchmail` は、fetchmail ユーザのホームディレクトリの指定 (必要でないかもしれない)。
LinuxでWiFiが使えない時の対処法

#目次
1.linuxでWiFiが使えない時の対処法
　必要なファイルの調達
　実行
2.なぜWiFiが使えないのか

#linuxでWiFiが使えない時の対処法
最近linuxでdockerをいじりたいという気持ちが芽生え（筆者はWindows homeなのでWindowsでは使えない)linuxを触ったときにつまずいたので対処法について紹介する。
よくみるのがLANでつなげて色々するというものなのだが、LANポートないパソコンだとわざわざアダプターを買いたくはないのでそのPCにおいてはオフラインでやる方法を考え付いたので共有したいと思う。
###必要なファイルの調達
WiFiがつながらないPC以外のPCで以下のURLからファイルをダウンロードしUSBに入れる。
https://drive.google.com/folderview?id=1wZjIoR3OiR6AtsWSOCHfGPerKBPSxrjm
###実行
使いたいlinuxにさっき入れた三つのファイルを入れる（無難にデスクトップとかドキュメント）wifi.shがあるディレクトリで端末（ターミナル）を開いて、
```bash:
sudo sh wifi.sh
```
で実行すればOK
#なぜWiFiが使えないのか
理由はドライバーが対応していないかららしい。なのでこの動作でドライバーを入れてあげている。原理は簡単。間違ってもLANアダプターは買わないように。あとzorin mint ubuntuしかテストはしてないです。たぶんubuntuとファイル系統が同じOSなら全部行ける。
この記事においての損害においていかなる責任は取りかねます。
ある文字列から複数の文字列を検索したい～preg_matchを使ってみた

#ある文字列から複数の文字を検索したい

始めは**strstr**を使い一つの文字列だけを検索していたのですが、途中で複数の文字列を検索できるようにしたくなり、考える考える．．．

悩んだ結果、解決方法を考えてみたのでメモします。

**strpos**や**strstr**を使用していたのですが、どうしても1つの文字列しか検索できず．．．
複数の文字列を検索したい場合はどうすれば良いのか試行錯誤しました。

**preg_match**を用いてみました。
**preg_match**は正規表現によるマッチングを行います。
対象の文字列に検索したい文字列があった場合(マッチした場合)1を返します。検索文字列がなかった場合は0を返します。




```php
<?php 
//変数に検索したい複数の文字列を入れておく
$search1 = '/赤|黄|青/';
$search2 = '/黒|白/';

//検索対象の文字列
$val = '赤緑黄黒桃橙';

if(preg_match($search1, $val) === 1){
 print('赤か黄か青を含みます');
}else if(preg_match($search2, $val) === 1){
 print('黒か白を含みます');
}else{
 print('指定された色は含みません');
]

```

ポイントは変数部分の書き方です。
**/**で囲い、**|**でOR表現となります。

以上、**preg_match**を使用すると複数条件で文字列検索を行うことができました。
RubyのHashは引数が多いとスタックオーバーフローする

ActiveRecordを使い、key=>valueのHashを作成していた。

* コメントで指摘いただいた箇所について修正しました。
指摘箇所である `.map { |x| x }` ですが、 `Mysql2::Result` に対しては直接 `.flatten` が使えないため `.to_a` の代わりとして呼び出していました。
```ruby
@users = Hash.send :[], *ActiveRecord::Base.connection.execute('SELECT `id`, `name` FROM `users`').to_a.flatten
@users[1]
# => "ユーザー１"
```

Hash[*Array] をしているため、`.execute` で取得してくるレコード数が一定を超すとスタックオーバーフローとなる。
```ruby 
records.size
 => 10000
Hash.send :[], *records.flatten
SystemStackError: stack level too deep
```

ActiveRecordの使い方やHashの作り方の両方に問題があるため修正

```ruby
@users = User.pluck(:id, :name).to_h
@users[1]
# => "ユーザー1"
```

`.pluck`で必要なカラムを取得し `.to_h` でHash化することで解決しました。
IBM Cloud: VPCのサーバー・プロビジョニング時に指定したスクリプトを自動実行する

#1. はじめに
IBM CloudのVPCでサーバープロビジョニング時に自動的に初期化処理をしたいという要件がある（例えば、特定のSoftwareを導入する、など）。VPCのサーバーはcloud-initを利用しているので、このcloud-initにユーザーデータ（スクリプトやcloud-configなど）を送りこむことができる。今回はその機能が稼働することを試してみた。

#1. public gatewayの事前構成
サーバーから外部サイトのGitHubにインターネットアクセスできるようにしたいため、以下の設定を構成しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/c7526196-87ee-6f0a-5803-5840e85da872.png)

#2. サーバープロビジョニング時に、`User data`にスクリプトを指定
VPCのVSIは内部的にはcloud-initを利用しているので、`cloud-config`形式やシェル形式で記載できる。IBM Cloud docsでの記載は[こちら](https://cloud.ibm.com/docs/vpc?topic=vpc-user-data&locale=en)。今回はシェルを記載した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d342e3bd-0a1d-528a-1185-35024d5b50db.png)


```shell:スクリプト例（タイムゾーンを反映させるためにApacheの自動起動を設定した後に再起動）
#!/bin/sh
timedatectl set-timezone Asia/Tokyo
yum install -y httpd mod_ssl openssl git
git clone https://github.com/nin2yasu/sampleweb.git
mv sampleweb/docs/* /var/www/html/
systemctl enable httpd
reboot
```

#3. テスト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f6d1e8de-a214-fcd4-0008-74a191f06a88.png)

```
# curl -I http://10.0.0.8
HTTP/1.1 200 OK
Date: Wed, 26 Aug 2020 03:19:00 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Wed, 26 Aug 2020 03:17:47 GMT
ETag: "153-5adbf439494f8"
Accept-Ranges: bytes
Content-Length: 339
Content-Type: text/html; charset=UTF-8
```

```
（他のVPC内部のサーバーからアクセスする）
# ssh root@10.0.0.8
The authenticity of host '10.0.0.8 (10.0.0.8)' can't be established.
ECDSA key fingerprint is SHA256:lmnbQ+aGJBrharZzfZNUFOlz4LTvMKhKeRMbQKgaf6U.
ECDSA key fingerprint is MD5:49:96:bd:68:48:d0:2f:28:0e:d1:65:f4:de:95:65:8d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.8' (ECDSA) to the list of known hosts.
[root@web1 ~]# date
2020年  8月 26日 水曜日 12:29:16 JST
```
Javaの3つのBlockingQueuesがもたらす問題を解決する方法

最近、私と私のプログラマーチームは、アプリケーションのリクエスト機構に些細な障害を発見しました。いくつかのチェックの後、その根本的な原因を見つけました。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/learning-through-mistakes-javas-three-blockingqueues_62942)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*


#障害と診断

アプリケーションの処理要求のためのスレッドプールが一杯になっていたため、追加の要求を処理できませんでした。スレッドをダンプした後、ログ書き込み領域でスレッドスタックがブロックされているのがわかりました。スレッドスタックがログ書き込み領域でブロックされるのは新しい問題ではありませんが、以前はこれは他の何かの結果だと考えていました。したがって、過去の経験に基づいて、問題はログ書き込み領域にはないと仮定しました。

多くのトラブルシューティングを使用し、問題の根本的な原因を見つけられずに挫折した後、私たちはソースコードを見て、何が問題を引き起こしているのかについていくつかの手がかりを得ようとしました。コードにログロックがあることを発見しました。このログロックから、スレッドスタックからArrayBlockingQueue.putにブロックがあることがわかりました。さらに調べてみると、それは1024長のBlockingQueueであることがわかりました。これが何を意味するかというと、このキューに1024個のオブジェクトがあると、後続のputリクエストがブロックされてしまうということです。

 

このコードを書いたプログラマは、BlockingQueueが一杯になったら、そしてそのデータが処理されるべきだと考えていたようです。問題のコードは以下の通りです。

`if (blockingQueue.retainCapacity() < 1) { //todo } blockingQueue.put`


ここで、問題には大きく分けて2つの部分があります。


1. 完全な判定は、「else」ではなく「put」に直接行く。

2. キューが一杯になった後も処理ロジックは //todo...となる。

上記のコードは、この特定のプログラマがBlockingQueueインターフェイスに精通していないことを示しています。この結果を得るためには、最初にこの判断を行う必要はありません。より良い方法は、blockingQueue.offerを使用することでしょう。これが'false'として返ってきたら、関連する例外処理を実装することができます。

 

#BlockingQueuesの種類

BlockingQueue は、プロダクション/コンシューマー・モードで一般的に使用されるデータ構造です。最も一般的に使用される型は、ArrayBlockingQueue、LinkedBlockingQueue、およびSynchronousQueueです。


ArrayBlockingQueueとLinkedBlockingQueueの主な違いは、キューに配置されるオブジェクトにあります。一方は配列に使用され、他方はリンクテーブルに使用されます。その他の違いについては、コードノートにも記載されています。

リンクされたキューは、典型的にはアレイベースのキューよりも高いスループットを持ちますが、ほとんどの同時実行アプリケーションでは予測可能なパフォーマンスは低くなります。

SynchronousQueue は、特殊な BlockingQueue です。これは、offer中に使用されます。現在他のスレッドがテイクやポーリングを実行していない場合、offerは失敗します。テイク中、他のスレッドが同時にofferを実行していない場合も失敗します。この特別なモードは、高い応答要件を持つキューや非固定スレッドプールからのスレッドに適しています。

#問題の概要

オンラインビジネスのシナリオでは、同時実行と外部アクセスがブロックされているすべての領域にタイムアウトのメカニズムが必要です。タイムアウトメカニズムの欠如がオンラインビジネスの重大な障害の根本原因になっているのを何度見てきたかわかりません。
オンラインビジネスでは、リクエストを素早く処理し、完了させることを重視しています。そのため、オンラインビジネスシステムの設計やコードプログラミングでは、高速に失敗することが最も重要な原則となります。この原則によると、上記のコードの中で最も明らかな間違いは、タイムアウトの仕組みを使ったofferではなく、putを使っていることです。あるいは、重要でないシナリオでは、offerを直接使用すべきであり、'false'の結果は、直接例外を投げたり記録したりする原因になると言うこともできます。


BlockingQueueシナリオに関しては、タイムアウト機構に加えて、キューの長さを制限しなければなりません。それ以外の場合は、Integer. MAX_VALUEがデフォルトで使用されます。この場合、コードにバグがあるとメモリが停止します。

BlockingQueueについて語る際には、BlockingQueueの中で最も使われている領域、つまりスレッドプールについても触れておきましょう。


ThreadPoolExecutorにはBlockingQueueパラメータがあります。ここでArrayBlockingQueueまたはLinkedBlockingQueueが使用され、スレッドプールのcoreSizeとpoolSizeが異なる場合、coreSizeのスレッドが占有された後、スレッドプールはまずBlockingQueueにoffer
を送信します。成功した場合、プロセスは終了します。
しかし、 このシナリオはオンラインビジネスのニーズに常に適合するわけではありません。


オンラインビジネスはテンポの速い環境で運営されており、キューにリクエストを配置するのとは対照的に高速な処理を必要としています。要求がすべてでキューに積み重ねられていない場合、実際には、それはオンラインビジネスのために最善です。オンラインビジネスの構造のこの種のものは、簡単に崩れやすく、システムの処理能力を超えているリクエストを直接拒否して、代わりにエラーメッセージを出すことは、比較的シンプルでありながらも良い方法です。しかし、それは制限されたメカニズムです。

高コンカレントで分散型のコードを書くときには、システム設計だけではなく、コードの細かい部分にも注意を払うことが重要であることを忘れないでください。そうすることで、上記のような問題を回避することができます。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*
【Django】大容量ファイルをPOSTしたときのテストがしたかった【TDD】

大容量のファイル(今回は200MBくらい)をPOSTした時に正しくバリデーションではじかれるかのテストがしたかった。
したかったんだけど、実際に200MBほどのファイルを使ってテストしようとしたら`MemoryError`って怒られちゃった。

# ダミーデータみたいなのが作れる！
どうしたもんかと思ってたら、TemporaryUploadedFileってのがあるらしい。

```python:test.py
from django.core.files.uploadedfile import TemporaryUploadedFile
from django.test import TestCase

# 中略
class TestClass(TestCase):
  def test_testfunction(self):
    form_data = {
      'upload_file': TemporaryUploadedFile("test.csv", "csv", 214958080, "utf8")
    }
    response = self.client.post('/test/path/', form_data)
    self.assertEqual(302, response.status_code, "ちゃんとリダイレクトしなかったぞ")
```

だいぶ端折ってるけどこんな感じにつかえるみたい。
引数3つ目で容量をb単位で指定できる。今回は200MBを少し超えるくらいの値を入れてる。
(桁は1024で変わるよ。1000じゃないことに注意。)

# まとめ
めっちゃ短いけど、備忘録的な意味ではいいのかな。
ちなみに、少量データだったら`InMemoryUploadedFile`ってのもあるらしい。

参考
> https://docs.djangoproject.com/ja/3.0/_modules/django/core/files/uploadedfile/
AWS IAMユーザーにて、アクセスキーをリセットしたらCLIツールも更新しよう

# アクセスキーとシークレットキーを漏出する

- 漏出したキーを使用していたIAMユーザーにdeny権限を付与される。
- 漏出したキーを再作成する。
- railsアプリのcarrierwaveで使用していたキーを更新(.env)

# キーの更新を完了。いざcodepipelineを実行
- codedeployで落ちる。
- aws-cliとecs-cliのcredentials情報を更新していなかった。

```text:aws-cli情報
cat ~/.aws/credentials
[[ キー情報 ]]

vim ~/.aws/credentials
[[ 更新する ]]

```

```text:ecs-cli情報
cat ~/.aws/credentials
[[ キー情報 ]]

vim ~/.ecs/credentials
[[ 更新する ]]
```

codepipelineが無事動く。
Mendeley が出力する bib ファイルにおける month フィールドの不適合とその対策

# はじめに
[Mendeley](https://www.mendeley.com) は [Elsevier](https://www.elsevier.com/) が提供する文献管理ツールである．

自分の手元にある論文や記事の PDF を投げ込み，著作情報などを入力しておけば，一元的に管理できて便利である．

登録された文献を引用したいときには様々な引用形式で情報を提示してくれる．

もちろん，BiBTeX 形式のファイル出力にも対応している．

# 問題点
Mendeley の BiBTeX 出力では，`month` フィールドが以下のように出力される．

```tex
month = {jan},
```

一見問題ないように見受けられるが，`bibtex` コマンドを用いる場合には右辺の中括弧を外さなければ認識してくれない．すなわち，

```tex
month = jan,
```

とする必要がある[^1]．
> ちなみに，`biber` + `biblatex` であれば，前者の形式でも問題なく読み込んでくれるそうだ．
> `month = {1}` などもまた問題なし．jan，feb，... を用いるときのみ問題が生じる．

# 対策
出力された `bib` ファイルに対して，以下の `sed` コマンドを実行すれば `month` フィールドの括弧を取り除いてくれる．

```bash
sed -i '' -e '/^month = /s/[{}]//g' <filename>
```

なお，上記の `sed` の記法は BSD 形式（Mac 対応）となっており，GNU 形式（Linux）ではない点に注意する．


[^1]: Incompatible month formats between biblatex and Mendeley, https://tex.stackexchange.com/questions/286261/incompatible-month-formats-between-biblatex-and-mendeley
bashでdo...whileする

bashには do...while が(たぶん)ないが、while文の条件式に全てを詰め込めば似たようなことができる。
条件式が true を返せばいいので最後に判定を入れとけばいい。

この例では、AWS CloudMapのサービスインスタンスが5つ登録されるまで待機している。
`((n < 5))` が true の間 `sleep 1` で待機する。

```bash
n=0
while
  values=$(
    aws servicediscovery list-instances \
      --service-id srv-xxx \
      --query 'Instances[].Attributes|sort_by(@,&order)|[].value'
  )
  n=$(echo "$values" | jq length)
  (( n < 5 ))
do
  echo "wait..."
  sleep 1
done
```
WebカメラとJetsonと機械学習を利用したスマート介護カメラ　アイディア　要件定義

##WebカメラとJetsonと機械学習を利用したスマート介護カメラ　アイディア　要件定義
WebカメラとJetsonと機械学習の組み合わせで、思いついたアイディア
####スマート介護カメラ使用例
#####準備
　介護者、関係者、ヘルパーの顔を登録しておく
　トイレ　風呂場　玄関　食器に定義用バーコードを貼る　
　玄関にスピーカーとマイクを設置しておく
#####体調管理　データに記憶する
　具合悪そう　顔の表情で判断　機械学習とラズベリーが判断　メールする
　寝ている時間をカメラ画像と機械学習で判断する　記憶する
　便を機械学習で判断。便が正常化判断する　記憶する
　食べ物を残した　カメラ画像から判断　食器をバーコードを張って識別
　食事をちゃんと食べたか記憶　食器が空かどうかで判断する
　食べ物以外を口に運んでしまった　カメラ画像から画像で判断　緊急メールする
　サーモセンサーで火元を管理する　緊急メールする
#####行動
　２４時間カメラを稼働させて、機械学習で物体検出から人を判断する
　転倒したかどうか判断　カメラ画像から転倒しているか機械学習　してたら緊急メールを送る
　部屋の中を徘徊している　玄関から外に出て行きそう　ドアをロックする
　入浴してから出てこない　緊急メール　風呂場の前にバーコードを貼る　時間をチェックする
　トイレから出てこない　緊急メール　トイレの前にバーコードを貼る　時間をチェックする
#####トイレ
　漏らしているかどうか　臭気センサTP-401Aをベットに仕込んでおく　におったらおむつを替える
#####安全
　部屋に人がいるかどうか　人感センサで判断
　知らない人（登録顔以外）と玄関で会話している　押し売りかもしれない　緊急メールを送る　玄関にスピーカーとマイクを置き代わりに話す。
　格好で判断する。スーツ姿　サラリーマン　押し売りと判断
　徘徊しそうで外でに出そう。ドアをオートロック　注意をJetsonが発する
　強い音がした検知　緊急メール　
　焦げ臭い匂いがした　緊急メール
　悲鳴が聞こえた　音声で認識　緊急メール
#####コミュニケーション
　話がしたい。人工知能に会話させる　　AquesTalk PI
#####特徴
　Jetsonが中心　（中央サーバーに画像は送信しない）
　Yoloで物体検出をやる
　中央サーバーに画像を送信しない。パケが超えてしまう　プライバシーの問題
　アップデート、パターンデータのみダウンロードする
　画像解析はJetson内のローカル機械学習でやる
　ネット環境のない場所で運用することが前提　
　Jetsonが体調管理データを管理する
　Jetsonがメールの送信、緊急メールをやる
　JetsonにローカルWebサーバーを搭載　日報の作成や設定画面に使用する
　超広角カメラモジュールで幅広い管理が可能
　360度カメラ　広角モジュールで幅広く介護
　秘密の言葉を発するとJetsonが音声認識し警察に通報してくれる
#####オプション
　クラウドストレージ(OneDrive Appleストレージ DropBox)は非同期に
　データーをアップロードできる
　パターンデータを管理会社からダウンロードできる
　アップデートで機能追加
#####Jetson
　臭気センサー　TGS2450
　温度センサー　DHT11 温湿度センサー
　音声認識　Julius
　しゃべらせる　AquesTalk Pi（ゆっくりのやつ）
　バーコードリーダー
　スピーカー
　超広角カメラモジュール(VR220)で360度にも対応
　サーモグラフィ機能　赤外線で夜の画像に対応
　サーモセンサーモジュール　火を検知する
　設定画面をタッチパネルとキーボードで操作できる
　Webサーバー　日報作成し閲覧用　管理画面用
　SDカードを使用できる
　HDD差し替えられる　容量の増量に対応
#####専用アプリ　
　詳細設定する画面
　緊急メールを受信
　Jetsonが一週間の日報を作成しアプリで閲覧できる(ローカルWebサーバー)
#####カメラ　
　超広角カメラ
　隠しカメラ型
　ミニカメラ型
　赤外線カメラ
　サーモカメラ
####その他
　[スマート防犯カメラ](https://qiita.com/raspberryPiLove/items/e90b12cfd07d6b06a77a)
　[スマート介護カメラ](https://qiita.com/raspberryPiLove/items/cf549f23952bfeba17aa)
　[スマート畑盗難防止カメラ]
(https://qiita.com/raspberryPiLove/items/24e81cebde33eb8c8366)

　スマート育児カメラ
　スマート園児カメラ
　スマート小学生カメラ
　スマート病院用カメラ
　スマート害獣カメラ
　スマートペットカメラ
　スマート酪農カメラ
　スマート牧場カメラ
　スマート田んぼ畑監視カメラ
　スマートお留守番カメラ

####Jetsonを使うメリット
強力なGPUで深層学習が使える。
エッジAIが使える。開発がコンパクト。ネットワーク経由のAIは手間と費用がかかる
ラズパイのようなiOTができる
CudaやOpenCvのような[機械学習に必要なソフトがプレインストール](https://developer.nvidia.com/embedded/jetpack)されおり、すぐに開発に取り掛かれる
同じ開発環境、機械学習ソフトを使うため、サンプルが出やすい。サンプルが実行しやすい
具体的なサンプルソースが公開されており、目標が実現しやすい

[具体的なサンプルソース](https://developer.nvidia.com/embedded/community/jetson-projects)

![index.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565877/aaaa3c4f-ff9b-f39a-e263-592006a1ef34.jpeg)
[NVIDIA Jetson Nanoコンプリートスターターキット 19850円](https://www.amazon.co.jp/Physical-Computing-Lab-NVIDIA-Nanoコンプリートスターターキット/dp/B082F9JFP6/)
WebカメラとJetsonと深層学習を利用した スマート畑盗難防止カメラ アイディア

##WebカメラとJetsonと深層学習を利用した スマート畑盗難防止カメラ アイディア

###構成

　Jetson　５台

　1台　管理機　送信用 iOT用のsim　管理者画面 Webから見れる


　4台　子機　無線アンテナを取り付ける　赤外線カメラをつける

####要件定義
畑に設置し、畑を監視する。警告音を鳴らす。証拠映像を撮る
Yoloを使い物体検出をおこなう。物体検出から動物かどうか判断する
動物を物体検出したらスマホなどに通知する
無線LanアンテナをJetsonに取り付け、無線ルーターを使わないようにしコストを減らす。Jetsonだけで通信網を作る
センサーを使いCPUの負荷を軽くする。
すべてのJetsonを無線中継器にする。無線中継器同士をつなぐ　
Dockerとノウハウを販売するビジネスモデルも考えてみる

#####センサー
人感センサーではなくYoloなど深層学習で物体検出をし動物かどうか判断する
24時間カメラが稼働している状態にする
Lineやslack Mailなど　スマホアプリに通知を送る
通知を受けアプリからブザーが鳴る　

#####通信構成
管理機　＋　SIM　－　無線アンテナ付き子機　－　無線アンテナ付き子機のカメラとセンター　ー　一番遠い畑

無線アンテナ付き子機同士で通信網を作る

管理機はSIMから必要なデータを上げる

無線アンテナ付き子機は中継器としての機能もある

USB接続の無線アンテナが販売されてあり、Jetsonにつなぐことができる。広範囲につなぐことができる

#####深層学習
エッジAI仕様にする
害獣画像をカメラで取り、それを学習させる
どこかの農家に協力してもらい学習済みテンプレートなるデータを作ってもらう。
それを配信しダウンロードして使う
センサーで取得できるデータはセンサーで優勢的に取得する。機械学習だけですべてやろうとしない

#####害獣検知機能
害獣かどうか機械学習で検知する。害獣だった場合は、警告音をならす。モデルガンのトリガーをモーターを回転させて引く BB弾を発射する

#####ソフト面
- 盗難にあっても大丈夫な仕様　データーの暗号化
- 各子機の撮影画像の確認が必要　送信テスト　
- 管理機にmysqlなどdbをいれて一元管理できる仕組み
- 子機自体がアクティブになっているかわかる仕組み
- データを管理する管理機で専用デスクトップアプリで見れるようにする
- データを管理アプリにしない。実機が盗難された時のため。ネットに依存しない
- データやアプリはバイナリーにできるものが望ましい。
- 管理機に家からVNCではいれるようにし管理画面を操作できる

#####ハード面
- 現場で確認できるモニターが必要
- 熱水雨風雪土ほこりに耐えられる仕様
- 衝撃につよい仕組み
- 市販のUSBカメラで使える
- USBSSDが使える
- 望遠カメラで高いところから監視
- 広角レンズで広い範囲を撮影-
- JetSonのような機械学習に強い端末を一台用意するのもあり、補助用に使う

#####ビジネスモデル

Dockerとノウハウを売るだけの売り方も考える

環境設定したDockerを売ります。あとは部品を買い説明書通りに組み立ててください

Dockerに環境をインストール　プログラムや管理アプリ、インストールソフト、環境設定を用意しておく ノウハウ　説明書PDF

インストールされたDockerとノウハウを販売する。

カメラは市販のUSBのWebカメラ　USB接続のSSDを買って組み立ててくださいスタイル

####その他
　[スマート防犯カメラ](https://qiita.com/raspberryPiLove/items/e90b12cfd07d6b06a77a)
　[スマート介護カメラ](https://qiita.com/raspberryPiLove/items/cf549f23952bfeba17aa)
　[スマート畑盗難防止カメラ]
(https://qiita.com/raspberryPiLove/items/3f459a83ee02bdf6360d)
　スマート育児カメラ
　スマート園児カメラ
　スマート小学生カメラ
　スマート病院用カメラ
　スマート害獣カメラ
　スマートペットカメラ
　スマート酪農カメラ
　スマート牧場カメラ
　スマート田んぼ畑監視カメラ
　スマートお留守番カメラ

####Jetsonを使うメリット
強力なGPUで深層学習が使える。
エッジAIが使える。開発がコンパクト。ネットワーク経由のAIは手間と費用がかかる
ラズパイのようなiOTができる
CudaやOpenCvのような[機械学習に必要なソフトがプレインストール](https://developer.nvidia.com/embedded/jetpack)されおり、すぐに開発に取り掛かれる
同じ開発環境、機械学習ソフトを使うため、サンプルが出やすい。サンプルが実行しやすい
具体的なサンプルソースが公開されており、目標が実現しやすい

[具体的なサンプルソース](https://developer.nvidia.com/embedded/community/jetson-projects)

![index.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565877/aaaa3c4f-ff9b-f39a-e263-592006a1ef34.jpeg)
[NVIDIA Jetson Nanoコンプリートスターターキット 19850円](https://www.amazon.co.jp/Physical-Computing-Lab-NVIDIA-Nanoコンプリートスターターキット/dp/B082F9JFP6/)
WebカメラとJetsonと深層学習利用したスマート防犯カメラシステム　アイディア

##WebカメラとJetsonと深層学習利用したスマート防犯カメラシステム　アイディア
WebカメラとJetsonと深層学習の組み合わせで、思いついたアイディア
####スマート防犯カメラ使用例

#####マンションで利用
　マンション住民全員顔を登録する。
　マンションの非常階段に設置する。深夜　登録顔以外が階段をいたら、住民全員に警戒メールを送る
　非常階段で人が（登録顔以外が）長時間待機している　通報メールを送る
　オートロック扉が開いた時、登録顔以外が住人と紛れて入ってきたら警戒メールを送る
　ベランダ、庭に人が侵入　登録顔以外だったら　メールを送信　携帯にアラートがなる　Jetsonから警告音声
　玄関の鍵、車の鍵ををピッキングしている動作を判断　警報メールを送る

#####家で利用
　家の人の顔を登録する。
　深夜、庭で火を検知　Jetsonが消防署と警察署に通報する
　深夜、庭で何かをもの投げた　警戒メールを送る
　家の前に不審な車が何時間も止まっている。Jetsonが警察署に通報する　警戒メールを送信
　家の前で何時間もたむろしている人がいる。Jetsonが判断　警戒メールを送る
　寝室で寝ている。警戒メールがなる。アプリで確認。侵入者あり　
　Jetsonが通報　寝室の扉をオートロックでロックする
　玄関の鍵、車の鍵ををピッキングしている動作を判断　警報メールを送る
　窓が壊された画像から判定　警報　通報メールを送る

#####外出で利用
ショルダーバックに穴を開けカメラとJetsonを入れる。後ろを撮影　ストーカーされているかどうか機械学習に判断させる　警報メールを送る

#####町内会で利用
　町内会の交差点にカメラを設置　見慣れない車　ナンバー　県外　
　スモークをはっている車が侵入してきたら警戒メールを住人に送る　データがJetsonにも届く

#####見た目　動きの画像で判断
　顔を隠すものをしているかどうか（マスク　サングラス　パンスト　ヘルメット）　警報メールを送る
　万引きする動作　警報メールを送る
　刃物を持っている　警報メールを送る
　何かものを投げ込んだ動作　警報メールを送る

#####特徴
　Jetsonが中心　（中央サーバーに画像は送信しない）
　Yoloで物体検出をやる
　人感センサーは使わない。カメラを２４時間稼働させてその画像を深層学習にかけて判断させる
　ネット環境のない場所で運用することが前提　
　アップデート、パターンデータのみダウンロード
　Jetsonが画像の解析と警戒する
　Jetsonがメールの送信、通報をやる
　JetsonにローカルWebサーバーを搭載　日報の作成や設定画面に使用する
　望遠カメラモジュールと超広角カメラモジュールで幅広い警戒が可能
　カメラが怪しい人を追尾する
　カメラを縦に３台設置する　全体用　追尾用　望遠用
　360度カメラ　広角モジュールで幅広く警戒　カメラを２つにして180度で鮮明画像で警戒
　秘密の言葉を発するとJetsonが音声認識し警察に通報してくれる
####オプション
　クラウドストレージ(OneDrive Appleストレージ DropBox)は非同期に
　データーをアップロードできる　
　パターンデータを管理会社からダウンロードできる
　アップデートで機能追加

####Jetson

　望遠カメラモジュールにも対応
　超広角カメラモジュールで360度にも対応
　サーモグラフィ機能　赤外線で夜の画像に対応
　サーモセンサーモジュール　火を検知する
　音声認識モジュール　言葉を感知する
　設定画面をタッチパネルとキーボードで操作できる
　Webサーバー　日報作成し閲覧用　管理画面用
　SDカードを使用できる
　HDD差し替えられる　容量の増量に対応

####専用アプリ　

　詳細設定する画面
　警告メールを受信
　警告アラートを発信
　Jetsonが一週間の日報を作成しアプリで閲覧できる(ローカルWebサーバー)

####カメラ　

　望遠カメラ
　超広角カメラ
　隠しカメラ型
　ミニカメラ型
　赤外線カメラ

####その他
　[スマート防犯カメラ](https://qiita.com/raspberryPiLove/items/e90b12cfd07d6b06a77a)
　[スマート介護カメラ](https://qiita.com/raspberryPiLove/items/cf549f23952bfeba17aa)
　[スマート畑盗難防止カメラ]
(https://qiita.com/raspberryPiLove/items/3f459a83ee02bdf6360d)

　スマート育児カメラ
　スマート園児カメラ
　スマート小学生カメラ
　スマート病院用カメラ
　スマート害獣カメラ
　スマートペットカメラ
　スマート酪農カメラ
　スマート牧場カメラ
　スマート田んぼ畑監視カメラ
　スマートお留守番カメラ

####Jetsonを使うメリット
強力なGPUで深層学習が使える。
エッジAIが使える。開発がコンパクト。ネットワーク経由のAIは手間と費用がかかる
ラズパイのようなiOTができる
CudaやOpenCvのような[機械学習に必要なソフトがプレインストール](https://developer.nvidia.com/embedded/jetpack)されおり、すぐに開発に取り掛かれる
同じ開発環境、機械学習ソフトを使うため、サンプルが出やすい。サンプルが実行しやすい
具体的なサンプルソースが公開されており、目標が実現しやすい

[具体的なサンプルソース](https://developer.nvidia.com/embedded/community/jetson-projects)

![index.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565877/aaaa3c4f-ff9b-f39a-e263-592006a1ef34.jpeg)
[NVIDIA Jetson Nanoコンプリートスターターキット 19850円](https://www.amazon.co.jp/Physical-Computing-Lab-NVIDIA-Nanoコンプリートスターターキット/dp/B082F9JFP6/)
カレンダーでルーティン管理


週ごとのルーティン管理。
Googleカレンダーや手書き、エクセルでも良いと思うのですが、
試行錯誤中は何かと変化もあると思うのでpythonで作ってみました。


日毎に分かれているので毎日チェックマークをつけて達成／非達成を確認する事が出来ます。

筋トレのメニュー管理や食事、英語学習などの管理をしています。

出力したcsvをフォーマット作ってあるエクセルに「値だけ貼り付け」して印刷して使っています。

シンプルがベストって感じです。





```
#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
# import datetime as dt
# from datetime import datetime as dtdt
import calendar


# In[2]:


c = calendar.Calendar(firstweekday=0)


# In[3]:


cld = c.monthdayscalendar(2020, 8)


# In[4]:


routine = []
# routine.append(["","","","","","","",]) # 曜日ごとのルーティンを記載
routine.append(["a","b","c","d","e","f","",])

# routine.append(["" for _ in range(7)]) # 毎日同じルーティンを記載
# routine.append(["routine" for _ in range(7)]) # 毎日同じルーティンを記載

# In[5]:

week=["月","火","水","木","金","土","日"]


# In[6]:


df = pd.DataFrame(week).T
for i in range(len(cld)):
    df_cld = pd.DataFrame(cld[i]).T
    df_cld = pd.concat([df_cld,df_routine]).reset_index(drop = 1)
    [df_cld.drop(columns=i,inplace=True) for i in range(len(df_cld.T)) if df_cld.T[0][i] is 0] # 先月／来月を削除
    df = pd.concat([df,df_cld]).reset_index(drop = True)
df.to_csv('sc.csv')


```
プリエンプティブ VM の使いどころ

![argo.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/02ac17b0-6e89-c116-fe73-6dfe9a49b9ef.png)
Argo wfでプリエンプティブを使っていると、この光景によく出くわします。この`×`
![argo_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569971/2a83da1e-7432-b4ea-491b-85b4e4ab2238.png)
`pod deleted` !!
Jobの実行中に突然rebootされます。
これが、本当に頭が痛い、、(>_<)
`kubectl events`を見ても、rebootedだけ、、
こうなると、ベアメタルの情報を確認するしかありません。
Googleさんに聞いてみると
> つまりこれはプリエンプティブル VMであり、GCE側で撃ち落とされ、GKEによって再構築されたということです。

30minも経過していないのに、、バッチに適してるって言ったじゃんΣ(ﾟдﾟlll)ｶﾞｰﾝ

グチグチ言っていてもしかたないので、プリエンプティブを外しました。

何度もwfを実行した感じでは、短時間に終わるようなバッチなら、プリエンプティブでOKだと思います。
affinityで、振り分けるのは、必須だと思います。プリエンプティブを買えない場合もありますので。
これは、プリエンプティブに関する記事によくある`affinity`ですね。

```yaml:wf
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: cloud.google.com/gke-nodepool
              operator: In
              values:
              - std4pe
              - std4
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 100
          preference:
            matchExpressions:
            - key: cloud.google.com/gke-nodepool
              operator: In
              values:
              - std4pe
        - weight: 1
          preference:
            matchExpressions:
            - key: cloud.google.com/gke-nodepool
              operator: In
              values:
              - std4
```

# まとめ
30minとか、1hとか、かかるようなバッチには、向いてないかなー。


以上。
皆さんの参考になれば幸いです。
ファイルの圧縮・解凍一覧

# 良く使う圧縮/解凍コマンドのまとめ

## tar.gz
```bash
tar zcvf hoge.tar.gz hoge  # 圧縮
tar zxvf hoge.tar.gz hoge  # 解凍
```

## zip
```bash
zip   hoge.zip hoge  # 圧縮
unzip hoge.zip hoge  # 解凍
```

## gz
```bash
gzip   hoge     # 圧縮
gunzip hoge.gz  # 解凍
```

# 並列処理 (tar.gz)　解凍は、あまり高速化できないらしい。
オプションの順番の意味するところがまだよく分かっていない。

```bash
tar zcvf --use-compress-prog=pigz hoge.tar.gz hoge  # 圧縮
tar  xvf hoge.tar.gz      --use-compress-prog=pigz # 解凍
```

# メモ
圧縮ファイルが正常じゃない時、解凍時にエラーが出るが、このエラーメッセージはログに書き出せる。ので、大きいファイルを解凍するときには、nohupでログを残すと良い。

```bash
nohup tar zcvf --use-compress-prog=pigz hoge.tar.gz hoge > log.hoge # 圧縮
nohup tar xvf hoge.tar.gz       --use-compress-prog=pigz > log.hoge # 解凍
```
【Mac】Terminalで主要なコマンドが実行できなくなった場合の解決方法

新しいソフトウェアなどを導入する際に環境変数の設定を間違うと、Terminalで各種コマンドが実行できなくなってしまいます。

```
$ vim ~/.bash_prifile
zsh: command not found: vim
```

主要な実行ファイルは`/usr/bin`配下に格納されているので、絶対パスを指定して`vim`コマンドを実行し、誤った環境設定を修正しましょう。

使用しているシェルで開くファイルは変更してください。

```terminal
$ /usr/bin/vim ~/.zshrc
```

変更後、設定を反映させるコマンドが必要ですが、面倒な方はTerminalを再起動しましょう。
再起動後、コマンドが実行できれば対応完了です。

## 補足
絶対パスでも実行できない場合、`/usr/bin/`やその配下のファイルを削除している可能性があります。
ゴミ箱に残っていないか確認してみましょう。

ゴミ箱に残っていれば元に戻すことで実行できるはず、、、

## 補足2
下記の記事の方法でも修正できるようです。
[MacのTerminalの環境変数をブッ壊したときの対処法](https://qiita.com/keisei_1092/items/746dfe6ddac9b4f516b3)
nth-childとnth-of-typeの違い

#nth-childとは？
指定した『**全て**の要素』の中の〜番目の要素。

#nth-of-typeとは？
指定した要素の〜番目の要素。

#nth-childとnth-of-typeの違い
二つの違いを説明すると、

```sample.html(1)
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
```

```sample.html(2)
<ul>
  <p>sample</p>
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
```

例えば、```li:nth-child(2)```

##nth-childの場合
：```sample.html(1)```の際、```<li>２</li>```
：```sample.html(2)```の際、```<li>1</li>```
が選択される。

##nth-of-typeの場合
：```sample.html(1)```の際、nth-childと同じく```<li>２</li>```

対して、```sample.html(2)```は違います。

：```sample.html(2)```の際、**```<li>２</li>```が選択**されます。

##なぜか？

###・nth-child
指定した『**全て**の要素』。
つまり、指定した兄弟関係にある要素すべての中から何番目にあるかを示しています。

それに対して、

###・nth-of-type
指定した要素自体のなかで何番目にあるか？
つまり、今回では、```li要素```の中で何番目にあるかを示しています

#ポイント
・指定した要素と兄弟関係の中で、その要素以外（今回は```li```以外）を含めるか含めないか。

#参考
[CSSでnth-of-typeとnth-childの違いを現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/25452)
Postman Pre-request After-request Scripts~UUID作成~Timestamp取得~SHA256変換

#はじめに
Web APIをテストするにはPostmanはよく使われていますよね、前はほとんど簡単なテストなので直接Requestを投げてResponseをもらうだけです。
最近はちょっとだけ複雑なテストをやってRequest前後は簡単なスクリプトを実行する必要があります、唯一なUUIDや、今現在のシステム時間を取得など。またはサーバーのTokenを取得した後に次のRequestでセットする。

#Postman画面
❶はPre-requestの書く場所
❷はAfter-requestの書く場所

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236892/e956abe3-c7e0-2afa-509d-323390915b5b.png)

#Pre-request Scripts

###UUID作成
❶番Pre-requestのタブに下記のスクリプトで

    var uuid = require('uuid');
    postman.setEnvironmentVariable('myuuid', uuid.v4());

**使う時にRequestのBodyに**

    {
        "uuid": "{{$myuuid}}",
        ...略...
    }

**更に簡単な書き方**
RequestのBodyに`{{$guid}}`を使います、事前定義などは要りません

    {
        "uuid": "{{$guid}}",
        ...略...
    }

###Timestamp取得
❶番Pre-requestのタブに下記のスクリプトで

    const moment = require('moment')
    pm.globals.set('logTime', moment().format('YYYY-MM-DD HH:mm:SS'))
    console.log(pm.globals.get('logTime'))

使う時は上記と同じRequestのBodyに`{{$logTime}}`で取得

###SHA256変換
Pre-requestのタブに下記のスクリプトで

    var sha256Value = CryptoJS.SHA256("123456789");
    postman.setGlobalVariable("sha256Value", sha256Value);

*※postman.setGlobalVariable()/postman.getGlobalVariable()はpm.globals.set()/pm.globals.get()と同じ*

使う時は上記と同じRequestのBodyに`{{$sha256Value}}`で取得

#After-request Scripts
❷番Testsのタブに下記のスクリプトで

    token = pm.response.json()['data']['token']
    console.log(token)
    postman.setGlobalVariable("token", token);

#最後に
というのは、PostmanはRequestの前後にJavaScriptを実行する能力が持ちます、なので事前事後のデータ処理、引数設定などが可能です。上記の例だけではなくJavaScript実行さえであればいろんな可能性がありますよね。
【Nuxt.js】Nuxt実践編：layout

🎈 この記事はWP専用です
https://wp.me/pc9NHC-AQ

# 前置き
layoutの実践編です🤗💕
基礎は文法編でご確認ください👀
https://wp.me/pc9NHC-A4

タブレット以下のサイズになったら
ハンバーガーメニューを表示させましょう🌟

![layouts.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469755/a43cc2fa-f470-42f8-eb08-5cd6c5e2d58b.gif)

Let's try!



# 構成を考える
まずは全体の構成をイメージしましょう🤔💭
Headerはlayouts/default.vueで固定
タブレット以下でメニューの切り替えをするから…

ticktack…

大体のイメージはできましたか？💡
それではまずディレクトリ から
まとめてみましょう！

⬇️

## ディレクトリ

```bash:file
assets/
--| scss/
----| _variables.scss
----| reset.scss

components/
--| templates/
----| headers/
-----| HeaderDefault.vue
----| menus/
-----| MenuDefault.vue

layouts/
--| default.vue

pages/
--| index.vue

nuxt.config.js
```

componentsは
アトミックデザイン に基づいて分けています🌟

使用するファイルはたくさんありますが、
今回のメインはメニューの切り替えを
layouts/default.vueでやることです🔄🌠

💥そのためスタイリングは丁寧ではありません💥
あくまでlayoutsでの切り替えのためだけに
超サラッと書いております…！

## layoutsでメニューの切り替え

HeaderDefault.vueのハンバーガーメニューを開くと
専用メニューのコンポーネントが表示される…
クリックイベントを検知する必要があるので
HeaderDefault.vueでは$emitを使用しますね💡

そしてそのイベントで真偽値を切り替え
メニューの表示/非表示を行います。

このイメージができれば、ほぼ完成です☺️笑

```layouts/default.vue
<template>
 <div class="layout layout-default">
   <MenuDefault
     v-show="isMenu"
     class="menu"
     @clickMenu="clickMenu()"
   />
   <HeaderDefault
     :isMenu="isMenu"
     class="header"
     @clickMenu="clickMenu()"
   />
   <div class="content">
     <nuxt />
   </div>
 </div>
</template>

<script>
import Header from '~/components/templates/headers/Header.vue'
import MenuDefault from '~/components/templates/menus/MenuDefault.vue'

export default {
 components: {
   HeaderDefault,
   MenuDefault,
 },
 data () {
   return {
     isMenu: false,
   }
 },
 methods: {
   clickMenu () {
     this.isMenu = !this.isMenu
   },
 },
}
</script>
```

# assetsの下準備
まずはscssで下準備🌟
メディアクエリ の作成と
余計なcssをリセットしておきます。

🎈 続きはWPでご覧ください👀
https://wp.me/pc9NHC-AQ
空間におけるiOSデバイス（camera）の移動量を取得する。

ARKitでデバイス（カメラ）の移動量を取得できます。

####1,ARView（RealityKit)やARSCNView（SceneKit）を使用する場合。
delegateメソッド内でARFrameを取得して、cameraプロパティにアクセスします。

```swift
//ARSCNViewのケース
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    let session = sceneView.session
    let frame = session.currentFrame
    let position = frame?.camera
    print(position)
}
```
####2,ARSession delegateを使用する場合。

```swift
func session(_ session: ARSession, didUpdate frame: ARFrame) {
    let position = frame.camera
    print(position)
}
```

結果：

>transform=<translation=(0.196657 -0.000380 0.012981) rotation=(-3.82° 16.29° -96.67°)

プリントするだけならこれでいいのですが、translateプロパティは直接取得できないようなので、transformから差分を計算します。

```swift
if initialPositon == nil {
    initialPositon = position?.transform
}

let traslate = (position?.transform.columns.3)! - (initialPositon?.columns.3)!

```

ちなみに、ARFrameから焦点距離も取れます。

****
Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[MLBoysチャンネル]
(https://www.youtube.com/channel/UCbHff-wfjTnB3rtXIP6y0xg)
[Medium](https://medium.com/@rockyshikoku)

[相棒](https://twitter.com/oka_yuuji)
[note](https://note.com/oka_yuuji)
Golang - Convert uint64 to a String

```golang
// Ref: https://golangcode.com/uint64-to-string/

package main

import (
    "fmt"
    "strconv"
)

func main() {

    // Create our number
    var myNumber uint64
    myNumber = 18446744073709551615
    
    // Format to a string by passing the number and it's base.
    str := strconv.FormatUint(myNumber, 10)

    // Print as string
    // Will output: 'The number is: 18446744073709551615'
    fmt.Println("The number is: " + str)
}
```


https://golangcode.com/uint64-to-string/
統計学研究

統計学の学習記録



##統計とは
データを理解するための数学的手法。
統計学はばらつきの学問。分散、標準偏差の指標を見ることが重要。


##統計基礎
外れ値に弱い
沢山のサンプルサイズが必要
サンプルサイズが多いと、一つや二つの外れ値の影響が無視できるほど小さくなる。

一番基本的な外れ値の判断方法は、正規分布と仮定した上で、平均値±3×標準偏差から外れた値を除外すること。

###共分散
2つの変数がその平均から、どの程度離れているかを示す

【共分散の問題点】　
1  共分散は2つのデータの相関関係を数値で表したものですが、その値が大きいのか小さいのかよくわからないので
2  スケールが変わると数値が大きく変わって、数字の意味がさらにわからなくなる


###相関係数
「相関」というのは、2つ以上のもとがあるときに、それらが「どれぐらい類似しているか」という「類似度」を意味する。
そして、相関係数とは、「類似度」の強さを「−1から1」までの範囲を取る数字として表現したものです。
【共分散の問題点の解決が相関係数】

１の解決
-1 ~ 1の間にすれば、数字の意味が解釈しやすい！！
→共分散を標準偏差で割って正規化する(=単位をそろえる)というイメージ。

２の解決
比べるものの、スケールが変わろうが、-1 ~ 1の中に入るので問題無し



機械学習において、使われ方
相関係数は主に前処理で使われます。具体的には、目的変数に対してどの説明変数を使用していくかの検討(=特徴量選択)に使われます。
(1)目的変数と相関が高い項目を選び、説明変数に選ぶ


正規分布について

ほとんどの機械学習モデルは個々の特徴量（データにどのような特徴があるかを数値で表現したもの）がだいたいガウス分布に従っているときに最も上手く機能するという前提がある。
そしてこのガウス（正規）分布を次のように複数重ね合わせた（線形重ね合わせ）もの、言い換えれば混ぜ合わせたものが混合ガウス分布
![multi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/1730286b-33f1-826a-54e2-87b8f6870402.jpeg)



##確率と統計
データサイエンスの基礎の部分。
確率の役割・・現実世界の不確実性の定量化する

###条件付き確率　（B｜A）　　
 ポイント　全体が変わる　　　（全ての事象Uではなくて、事象Aが全体となり、その中で事象Bが起こる確率を考える）

普通の確率　　　P(A)(= 事象Aの確率)　＝　事象（A）が起こる回数/全事象

条件付き確立　　事象P（B｜A）　（事象Aが起こった上で事象Bが起こる確率）　＝　P（A、B）　/ P(A)

大事なのでポイントを再度言うと、　事象Aが全体となる。全体が変わるという視点を持って考えると、すんなり入ってくると思う。

![20160125183046.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/363d4d0c-f511-b904-f794-d694b5af5fce.png)


##「ビッグデータ」という言葉。　

Qビッグデータを扱うとは？
・・つまり、「統計解析」のことである。
堅苦しいので、クールな感じに「ビッグデータ」と「データサイエンティスト」と呼び、マーケティングしたら、バズったようです。

##「AI」という言葉。

もともと、AI（Artificial Intelligence)は人間の認識昨日の再現という科学的探究として使われてた用語。
最近、ビジネスサイドへ適用され、統計学との連結により、幅が広がっている。

ビジネスインテリジェンス（BI）
ビジネスにおける統計学を応用した手法。企業の市場競争における情報戦略　


ただ大量にデータがあればいいわけではない。

▲ビッグなまま扱う　　　　　手間・コストがかかる
○統計的に正しく標本抽出　　　楽・正確性も悪くない（正しい手法ならば）


標本、母集団、標準偏差、標準誤差などの理解が必要

![c8856789ec11ab8b1013037cef6929f9-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/48bd2c8b-8100-4c8c-d814-534675cc763f.png)



###標準誤差とは？
A推定量のばらつきの値(★標本平均の標準偏差）

標本≠母集団であるため、標本から母集団の性質を推定する
推定量　・・前提として誤差を含む　　★重要なのは、どれだけの誤差であるのか正確に推定すること。

標準誤差という尺度を用いる
標準誤差が小さい・・推定量の精度が高い
標準誤差が大きい・・推定量の精度が低い




ポイント　正しい判断に必要十分のデータを扱うこと

統計学とは？
データと扱う学問→答えを出す（正確な意思決定に貢献する）
カッコよくいうと、因果、相関、予測から事象の真相を推理する。


##何故統計学なのか？

統計学が有益な所

騙されやすい世の中　
・肝心なデータは公表しないことが多い。
見せ方、見栄にこだわる企業や個人も多い。
ex 広告、統計データ（偏った）、〜率（投票率、支持率、離職率）、〜％（健康食品など）


データの裏に、何が真の原因にあるのか特定する（＝データサイエンス）
真の原因を特定する姿勢は、まさしくサイエンス（科学）の姿勢でもある。　なのでサイエンティストという

##サイエンス
データサイエンスの「サイエンス」とは正確には何を言うのか？
データとデータを生成するプロセスに関する<font color="DarkMagenta">仮説を立て、検定を行うこと</font>
（仮説例「A商品の売り上げるの好（不）調の原因はBだ」、「現在社員の生産性が下がっているのは、Bによるもだ」などなど）

仮説が真であることを示すために、<font color="DarkMagenta">統計値（量）</font>を出し、どの程度確からしいか示す。

具体的


カイ二乗値　　　結果は<font color="DarkMagenta">誤差</font>の範囲と言えるか？　”独立性の検定”と言われる。

観測された値（ポテトが何個売れたか）と期待される値（ポテトは確率的に何個売れそうか？）を比較し、

ズレ（誤差）が大きい　　　カイ二乗値は大きくなる
ズレ（誤差）が小さい　　　カイ二乗値は小さくなる　（＊　ズレなしで０）

”独立性の検定”は、二つの変数に関連が言えるのか否かを判断するためのもの。

実際に観測された確率と期待確率との乖離が大きいほど、独立していない（関連がある）ということになります。
この乖離の程度を評価するのが独立性の検定です

を示す

![kai_20181102_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631141/cae2ea1b-0a8d-19ad-e123-2734981ee0d5.jpeg)

p値


t検定とt分布
正規分布について、データの散らばり（分散）がわからない場合、
たまたま、偏ったデータを取得する可能性がある！　その可能性をt検定で求める