OmniAICreator/Qiita-1.07M huggingface dataset:
fzf.vimでShift_JISもgrepできるようにする

今まで `ag` [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) を使っていたのだけど、業務のカクカクシカジカでShift_JISを使うことが増えてた。`ag` でSjift_JISをgrepするには `nkf` で変換を挟むなどの無理くり変換になりそうなので、他の方法を探すことにする。

Neovimを使っているので、fzf.vimでも使えるのが条件。

## ripgrepならできそう

カクカクシカジカで[ripgrep](https://github.com/BurntSushi/ripgrep)ならできそう。
名前だけ知っていた。

* 正規表現をオプションなしで使えるなど、フィーチャーしてる。
* 早い。体感的にも分かるくらい早い。  
  単純なベンチマークだと [`ag` の1/5の値が出てる](https://github.com/BurntSushi/ripgrep#quick-examples-comparing-tools)らしい。
* .gitignoreをデフォルトで読み込み、無視するファイルを無視する。
* **オプションで数種のエンコーディングに対応する。**
* Rust製

## ripgrepをインストールする

brewで入る。

```shell
$ brew install ripgrep
```

## テストしてみる

### UTF-8のgrep

```shell
$ echo $LANG
ja_JP.UTF-8
$ echo こんにちは > utf8.txt
$ rg こん
utf8.txt
1:こんにちは
```

分かりにくいけど、カラーで出てる。

### SJISのgrep

```shell
$ echo こんばんは | nkf -s > sjis.txt
$ rg --encoding Shift_JIS こん
sjis.txt
1:こんばんは
```

できてる！

### 文字コードが混在するgrep

```shell
$ ls
sjis.txt  utf8.txt
$ rg こん
utf8.txt
1:こんにちは
$ rg --encoding Shift_JIS こん
sjis.txt
1:こんばんは
```

ここが少し惜しい。
文字コードの異なるファイルがあった場合、
オプションが指定されている方のみの結果になる。

## fzf.vimの設定をする

`Rgs` コマンドを追加して割り当てる。
[fzf.vimの公式に書いてあるもの](https://github.com/junegunn/fzf.vim#advanced-customization)を、とりあえずそのまま使ってる。

```vimscript:~/.vimrc
command! -bang -nargs=* Rgs
  \ call fzf#vim#grep(
  \   'rg --encoding Shift_JIS --column --line-number --no-heading --color=always --smart-case '.shellescape(<q-args>), 1,
  \   <bang>0 ? fzf#vim#with_preview('up:60%')
  \           : fzf#vim#with_preview('right:50%:hidden', '?'),
  \   <bang>0)

nnoremap <silent> <Leader>ff :<C-u>Rg<CR>
nnoremap <silent> <Leader>fs :<C-u>Rgs<CR>
```

これで `:Rg` だとUTF-8のgrep、`:Rgs` だとSJISのgrepができるようになった。
うれしい。
#VsCode のコードリアルタイム共有・共同編集機能 Live Share がペアプログラミングに役立ちすぎて怖い

- 口だけで説明するより、コードを書いた方がずっと早い。いや、口で説明しながらコードを書く。
- すぐにドライバーとオブザーバーを交代して、こちらがコードを書いたり、相手に書いてもらったりと切り替えられる。
- カーソルのある場所、フォーカスの状態などもすべて反映される
- Github連携が可能。自分にレポジトリ権限があるかないかで、相手の開いていないファイルまで閲覧可能かどうかの権限も振り分けられているらしい。


![image](https://user-images.githubusercontent.com/13635059/66111381-b788d880-e603-11e9-978d-e323cec30ed0.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2550








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
TypeScript + React SFCでmapを使うとJSX element type 'Element | Element[]' is not a constructor function for JSX elements.になった話

## はじめに
詳細についてはGitHubのIssueみた方が早いです
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20356
https://github.com/edorivai/ts-sfc-array

## ざっくり
- SFCでmapをreturnするとTypeScriptでエラーがでる
- Fragmentでarrayにしなければ解決する
- Class Componentにしても解決する

## 現象

```jsx
const Lines = () => {
  return [1,2,3].map((id, key) => <li key={key}>{id}</li>)
}

export default () => (
  <ul>
    <Lines />
  </ul>
)
```

これがエラーになる。

```
TypeScript error in /Users/develop/dashboard/src/LineItems.tsx(69,9):
JSX element type 'Element | Element[]' is not a constructor function for JSX elements.
  Type 'Element[]' is not assignable to type 'Element'.  TS2605

  > 69 |         <Lines />
       |         ^
    70 |       </ul>
```

## 対応１： 配列を返さないようにする

全部ちゃんと読んだわけではないのですが、Listになっているのが問題な様子なので、配列じゃない形にすれば回避できます。

```jsx
export default () => (
  <ul>
    {[1,2,3].map((id, key) => <li key={key}>{id}</li>)}
  </ul>
)
```

まとめれない場合は、`<>`や`<Fragment>`を使うとよいでしょう。

## 対応２： SFCをやめる
とはいえTable系のマークアップだったりするとうまくまとめれないこともあります。
そういうときは、昔ながらのClassを使う形でも回避できます。

```jsx
class Lines extends React.Component {
  render() {
    return [1,2,3].map((id, key) => <li key={key}>{id}</li>)
  }
}

export default () => (
  <ul>
    <Lines />
  </ul>
)
```

##
【Rails】Gem deviseを使いこなす！！

deviseを使いこなそう！
#deviseの導入
以下の手順で導入できます
1. gemインストール
2. モデル作成
3. カラム追加
##gemのインストール
まずgemをインストールしましょう
Gemfileに以下の記述を追記しましょう

```:Gemfile
gem 'devise'
```

`bundle install`もお忘れなく！

```:ターミナル
bundle install
```

deviseをアプリケーションに適応させましょう

```:ターミナル
rails generate devise:install
```

##モデルの作成
まずモデルをターミナルから作成するときの文法は以下の通りです
`rails generate devise MODEL`
これを参考にUserモデルを作成しましょう

```:ターミナル
rails generate devise User
```

これでモデル、マイグレーションファイルが作成されました

まず、deviseで作成したモデルの初期設定をしましょう
以下の記述を追加しましょう

```:app/models/user.rb
devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 13
```

次はテーブルを作成しましょう
カラムを追加するため、**まだマイグレーションはしないでください**


##カラムの追加

マイグレーションファイルに
`t.string :username`を追加しましょう

deviseはデフォルトではメールアドレスとパスワードしか登録することができません
追加した`username`を新規登録、ログイン時に保存できるようにしましょう
以下の記述を`application_controller.rb`に追加しましょう

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    devise_parameter_sanitizer.permit(:sign_in, keys: [:username])
  end
end
```

`devise`のコントローラーを実行する前に`configure_permitted_parameters`を実行する
ようにします

`configure_permitted_parameters`
deviseのパラメーターとしてsign_up時にusernameを許可する
deviseのパラメーターとしてsign_in時にusernameを許可する

最後にマイグレーションしましょう

```:ターミナル
rails db:migrate
```

以上でテーブルが作成されました


#ルーティングの設定
deviseに関わるルーティングを設定しましょう
ルーティングファイルに以下の記述を追記しましょう

```ruby:config/routes.rb
devise for :users
```

#deviseで使えるヘルパーの紹介
deviseで作成されたモデルには以下のヘルパーを使用することができます
※ただし、以下のヘルパーはモデル名がUserの場合です

`before_action :authenticate_user!`
ユーザー権限のヘルパーです。
コントローラーに記述することで、
ログインしていない時にコントローラーのアクションを実行しようとすると、
ログイン画面に飛ばすことができます

`user_signed_in?`
ユーザーがログインしているかどうかの判定をするヘルパーです
ture,falseで返ってくるためビューやコントローラーでif文で条件分岐が可能になります

`current_user`
ログインしているユーザーの情報を取得できます

もし、モデルがMemberの場合
ヘルパーの使い方は以下のようになります
`before_action :authenticate_member!`
`member_signed_in?` 
`current_member`

#sign_in,sign_up後のパスの設定

新規登録、ログイン、ログアウト時にリダイレクトするパスを設定しましょう

```ruby:app/controllers/application_controller.rb

def after_sign_in_path_for(resource)
	root_path
end

def after_sign_out_path_for(resource)
	root_path
end

```

#ログイン、登録画面のビューの編集
ログイン、登録画面を編集していきましょう
以下のコマンドでUserモデルに関するviewファイルが作成されます

```:ターミナル
rails generate devise:views users
```

作成されたビューファイルを自由に編集することができます

#２つのdeviseモデルがある時にそれぞれのパスの設定
WebサービスにはUser（利用者）とAdmin（管理者）があると思います
以上の場合、UserとAdminでログイン後のパスを変える必要があると思います

```ruby:app/controllers/application_controller.rb
def after_sign_in_path_for(resource)
	case resource
	when Admin then
		admins_root_path
	when User then
		users_root_path
	end
end
```
ログイン時のルーティングを設定する場合を例に説明します
`resource`が
`Admin`の場合、`admins_root_path`にリダイレクトする
`User`の場合、`users_root_path`にリダイレクトする

`resource`はログインしたモデルの名前です

**疑問、気になるところございました、質問、コメントよろしくお願いします！！！**
mockmockでSORACOM Funkを呼んでみる

# これは

先日発表された[mockmock](https://mock-mock.com/)のSORACOM連携機能に、待望のSORACOM Funkが対応しましたので早速試してみました。

以下の記事も参考にしてください。

- [mockmockでSORACOM Beamから連携するシステムの開発を効率化する](https://qiita.com/kkimura/items/89abaccd31244e4dff3e 
)
- [SORACOM FunkでAWS Lambdaを呼んでみた](https://qiita.com/kkimura/items/c33962e426e84720dc31)

# Lambda関数の準備

とりあえずLambda関数を準備します。SORACOM固有情報(context.client_context.custom)と、渡されたJSONデータをそのままダンプするPython3の関数です。

```python
import json

def hello(event, context):
    body = {
        "input": event,
        "context": context.client_context.custom
    }

    return body
```

Funkの設定に使いますので、この関数のarnを保存しておきます。また、この関数を呼び出す権限を付与したIAMユーザを作成し、そのaccessKeyIdとsecretAccessKeyを保存しておきます。

# mockmockにSORACOM Funkを設定する

Beamを動かしたときの記事と同じ手順でmockグループを作成したら、以下のjsonを流し込んでFunkの設定をします。

```json
[
    {
	"key":"enabled",
	"value": true
    },
    {
	"key":"contentType",
	"value":"application/json"
    },
    {
	"key":"credentialsId",
	"value": {
	    "accessKeyId": "*****************",
	    "secretAccessKey": "**********************"
	}
    },
    {
	"key":"destination",
	"value": {
	    "provider":"aws",
	    "resourceUrl": "arn:aws:lambda:********************",
	    "service":"lambda"
	}
    }

]
```

流し込む際のcliと結果はこんな感じです。Namespaceは「SoracomFunk」です。

```bash
%soracom --profile mockmock groups --group-id "************" --namespace "SoracomFunk"\
 put-config --body @mockmock-funk-setup.json

{
        "configuration": {
                "SoracomFunk": {
                        "contentType": "application/json",
                        "credentialsId": {
                                "accessKeyId": "**********",
                                "secretAccessKey": "**********************"
                        },
                        "destination": {
                                "provider": "aws",
                                "resourceUrl": "arn:aws:lambda:*******:******:function:****************",
                                "service": "lambda"
                        },
                        "enabled": true
                }
        },
        "createdAt": **************,
        "createdTime": *************,
        "groupId": "**********************",
        "lastModifiedAt": **************,
        "lastModifiedTime": ***********,
        "operatorId": "OP*********",
        "tags": {
                "name": "**************"
        }
}

```

# 動かしてみる

以下のJSONを渡して、mockmockのテスト送信を実施してみましょう。

```json
{
  "hello":"world"
}
```
![mockmock-funk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59415/54457c9a-3dd4-257f-4bfb-bf46e8e17cf8.png)

うまくいきましたね！

なお、BeamとFunkを同時に設定すると、unified endpointに投げたときと同じくそれぞれの返り値をまとめたJSONが戻ってきます。

# まとめ

これでSORACOM Airが手元になくてもmockmockさえあればFunkを経由してAWS LambdaなどのFaaSを直接実行できるようになります。
デバイスからはFunkでクラウドの機能を呼び出すような開発をするとき、デバイスがなくてもクラウド側の開発が捗りますね！
【tidyr】gather?, spread? もう古い。時代はpivot - 2

# はじめに
この記事は[前回](https://qiita.com/yanami/items/3775df6c579fd0a2d60c)の続編という立ち位置になっています。今回は特に多く使われるであろう```pivot_longer()```の引数あれこれについてです。

# nemes_prefixで列名の削除

以下のような雑然データがあるとします

```{messy.R}
library(tidyverse)


df <- tibble("店舗" = c("a", "b", "c", "d"),
             "Day1" = c(90, 73, 60, 30),
             "Day2" = c(50, 78, 81, 100),
             "Day3" = c(20, 50, 70, 87),
             "Day4" = c(20, 50, 70, 87),
             "Day5" = c(98, 100, 89, 15)
             )
df

# A tibble: 4 x 6
 店舗   Day1  Day2  Day3  Day4  Day5
  <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 a        90    50    20    20    98
2 b        73    78    50    50   100
3 c        60    81    70    70    89
4 d        30   100    87    87    15
```

このような場合、通常の方法で```col, name_to, value_to```を指定すると...


```{tidy?.R}
df %>% 
pivot_longer(cols = -店舗, names_to = "日", values_to = "売上") %>%
head()

# A tibble: 20 x 3
   店舗  日     売上
   <chr> <chr> <dbl>
 1 a     Day1     90
 2 a     Day2     50
 3 a     Day3     20
 4 a     Day4     20
 5 a     Day5     98
 6 b     Day1     73

```

このままでは```日```の列に格納される際、```Day```という余計な文字が入ってしまいます。このような状況を回避するときに用いるのが```nemes_prefix = ```という引数です。これを用いることで各変数名の先頭から一致するテキストを削除することが可能となります。つまり、

```{tidy!.R}

df %>% pivot_longer(cols = -店舗, names_to = "日", 
                    names_prefix = "Day", 
                    values_to = "売上"
                    ) %>%
  head()

# A tibble: 6 x 3
  店舗  日     売上
  <chr> <chr> <dbl>
1 a     1        90
2 a     2        50
3 a     3        20
4 a     4        20
5 a     5        98
6 b     1        73
```

このようにすることで、```日```の列に格納される際、```Day```を削除することができました。

# names_ptypesで列の型変換
しかし!このままでもまだ問題が残っています。それは```日```の列の**型がcharacterのままになっている点です**。```as.numeric()/as.integer()```を用いてもいいのですが、直接```pivot_longer()```内の引数を用いても数値型に変換することができます。それが```names_ptypes```です。

```{tidy!_int.R}

df %>% pivot_longer(cols = -店舗, names_to = "日", 
                    names_prefix = "Day", 
                    names_ptypes = list("日" = integer()), 
                    values_to = "売上"
                    ) %>%
  head()

# A tibble: 6 x 3
  店舗     日  売上
  <chr> <int> <dbl>
1 a         1    90
2 a         2    50
3 a         3    20
4 a         4    20
5 a         5    98
6 b         1    73

```
この結果、日の列の型をintに変更できました。これらの機能は従来の```gahter()```で行うことはできないことから```pivot_longer()```内で完結させられるようになるのは進歩だと言えるでしょう。

# その他の機能
```values_drop_na = TRUE```を指定することで、**欠損値を含む行を無視することができます**。```filter(!is.na())```と同義です。案外便利。

# まとめ
今回の記事では、```pivot_longer()```の引数について簡単に解説しました。従来の```gather()```から様々な機能を追加されており、使いこなすことで雑然データを１つの関数で整然化することが可能になります。これはコード全体の可読性を高めることにつながるため、今後は```gather()```から```pivot_longer()```へとシフトしていくのではないでしょうか？
WordPress担当初心者が躓きがちなこと

業務で急にWordPressのメンテすることになり
いろいろと躓いたのでメモがてら投稿。

#親テーマ子テーマ

WordpressでPHPをいじってるとき、
特に親テーマのfunctions.phpに
該当するテンプレートタグ（関数）がないか気をつけよう。

そもそも、なんで親テーマ、子テーマという
イミフなものを作ってしまったのか。

これは割と、
テーマをガツガツカスタマイズする人向きの話。

親テーマを元に、自分なりのカスタマイズは
子テーマでやると、

ブラウザ互換やセキュリティ対応などで
親テーマがバージョンアップしても

自分のカスタマイズが上書きされたりしなくなる。


#カスタム投稿

普通の投稿でも固定ページでもない、
カスタム投稿ってのを定義し、投稿することができる。

カテゴリよりもさらに上位の部分で（管轄が違うとか）
区別したいときに便利。


###プラグインで実現するなら

Custom Post Type UI
カスタム投稿するときにパーマリンクをわかりやすく設定できるプラグイン
https://ja.wordpress.org/plugins/custom-post-type-ui/

カスタム投稿用のパーマリンクの設定をできるプラグイン
https://ja.wordpress.org/plugins/custom-post-type-permalinks/


###PHPでやるなら
functions.phpに、
`function create_post_type() {`
みたいなのを定義することでもできるみたい。


#パーマリンク設計

パーマネントリンク、永続するリンク。

Wordpressの記事はデフォルトでは以下のようなURLになる。

`https://hoge.com/?p=123`

これは、WordPressにとっては都合がいい形。

この記事番号をもとに、DBにselectかけて
内容を表示するのがWordPressの仕事だから。

でも、この形のままだと

記事を管理する人としても、
その記事を読む人としても、
SEO的にも、

ちょっぴり不便。

つまり、人間に便利な記事URLを例えば

`https://hoge.com/imas/chara/双葉杏/`

みたいな形に設定することができる。

読者が`https://hoge.com/imas/chara/双葉杏/`のURLを叩いたら、

WordPress側は
内部的なURL(`https://hoge.com/?p=123`)に変換し
その内容をDBから読みにいき、レスポンスしている、みたいなイメージ。

URLもSEOのキーワード対象となるので
１つのSEOテクである。

日本語を設定することもできる
（%エスケープされることが多いのであんまり読みやすくないけど）

WordPressの設定→パーマリンク設定

でいろいろ設定できる。

最終的にはいわゆる
.htaccess
でやっているのだが
動作の深い（？）部分はよくわかっていない。


PHP的には、`get_permalink()`系の関数で
いい感じにURLをとってこれることが多い。


#タクソノミーとかタームとか

日本語でおk。

通常の投稿ではカテゴリとかタグとかを設定できる。
カテゴリは親子関係を作れて、タグは作れない。

カスタム投稿にもカスタムしたカテゴリみたいなのを設定することができ、
それをタクソノミーという。

ちょっと抽象的で自分でも理解が浅いところ。
でもここよく分かってないとググるのに困る。
gccのDocker公式イメージ使ってC++でHelloWorldしてみた

# C++を扱うことになった
開発中のWebサービス案件でC++のソースコードを扱うことになりました。
とりあえずLinux環境で動けばよいので、 **Dockerコンテナ内のgccでC++のソースコードがコンパイル＆実行できること** を今回の目標とします。
（ `make` とかは今回使わないです。軽量化とかも意識してないです。）

今回作ったサンプルコードは以下に置きました。
https://github.com/segurvita/docker-gcc-sample



# Dockerイメージを探した
Docker Hubでgccを検索してみたところ、Docker Hub公式のイメージがありました。
https://hub.docker.com/_/gcc/

これを使います。（もっと軽いのあるかもですが、



# C++のソースコードを作った

`Hello World!` します！

```c++:hello.cpp
#include <iostream>

int main()
{
    std::cout << "Hello world!" << std::endl;
}
```





# コンパイル＆実行のスクリプトを作った

先ほどのcppファイルをコンパイルするスクリプトです。
cppファイルと同じフォルダに置きます。

```bash:build.sh
#!/bin/bash

# Compile
g++ hello.cpp -o hello

# Execute
./hello
```



# docker-compose.yml を作った

Docker公式イメージをpullしてから、 `build.sh` を叩くようにしました！

```yml:docker-compose.yml
version: '3'
services:
  gcc-cpp-sample:
    image: 'gcc:9.2'
    volumes:
      - ./cpp:/src/cpp
    working_dir: /src/cpp
    command: ./build.sh
```

`docker-compose.yml` と同じ階層に `cpp` フォルダがあって、その配下に `hello.cpp` と `build.sh` を置くようにしました。



# 実行！

```
docker-compose up
```

を実行したところ、 `Hello World!` が表示されました！



# サンプルコード

サンプルコードはこちらです。
https://github.com/segurvita/docker-gcc-sample

こちらでは、記事に書いたことに加えて、C言語のコンパイル＆実行もやっています。



# さいごに
10年振りくらいにgccを触ったので頭の運動になりました。


本記事の作成にあたり、以下の記事を参考にさせていただきました。わかりやすい記事をありがとうございます。

- [gcc コンパイルオプション備忘録](https://qiita.com/seriru13/items/c2f5192615162c4c3f47)
- [江添亮のC++入門/GCC: C++コンパイラー](https://ezoeryou.github.io/cpp-intro/#gcc-c%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%83%BC)

また、今回使った公式Dockerイメージは結構重いみたいなので、気になる方はこちらをご覧ください。すごくわかりやすいです。

- [Docker+C言語の実行環境は軽量なAlpine Linuxが良い](https://qiita.com/Panda_Program/items/abbff0864fb65bdfe7d0)
Uri.encodeQueryComponent と Uri.encodeComponent の違い

Dartの`Uri.encodeQueryComponent`と`Uri.encodeComponent`のどちらを使えば良いか迷ったので、両者の違いを調べてみました。

## テストコード

```dart
main(List<String> args) {
  var testStr = '';
  for (int i = 0; i < 256; i++) {
    testStr += String.fromCharCode(i);
  }

  var encodeQueryComponent = Uri.encodeQueryComponent(testStr);
  var encodeComponent = Uri.encodeComponent(testStr);
  print(encodeQueryComponent);
  print(encodeComponent);
}
```

## 出力結果

```
%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%C2%80%C2%81%C2%82%C2%83%C2%84%C2%85%C2%86%C2%87%C2%88%C2%89%C2%8A%C2%8B%C2%8C%C2%8D%C2%8E%C2%8F%C2%90%C2%91%C2%92%C2%93%C2%94%C2%95%C2%96%C2%97%C2%98%C2%99%C2%9A%C2%9B%C2%9C%C2%9D%C2%9E%C2%9F%C2%A0%C2%A1%C2%A2%C2%A3%C2%A4%C2%A5%C2%A6%C2%A7%C2%A8%C2%A9%C2%AA%C2%AB%C2%AC%C2%AD%C2%AE%C2%AF%C2%B0%C2%B1%C2%B2%C2%B3%C2%B4%C2%B5%C2%B6%C2%B7%C2%B8%C2%B9%C2%BA%C2%BB%C2%BC%C2%BD%C2%BE%C2%BF%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%86%C3%87%C3%88%C3%89%C3%8A%C3%8B%C3%8C%C3%8D%C3%8E%C3%8F%C3%90%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%9B%C3%9C%C3%9D%C3%9E%C3%9F%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%A8%C3%A9%C3%AA%C3%AB%C3%AC%C3%AD%C3%AE%C3%AF%C3%B0%C3%B1%C3%B2%C3%B3%C3%B4%C3%B5%C3%B6%C3%B7%C3%B8%C3%B9%C3%BA%C3%BB%C3%BC%C3%BD%C3%BE%C3%BF
%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%C2%80%C2%81%C2%82%C2%83%C2%84%C2%85%C2%86%C2%87%C2%88%C2%89%C2%8A%C2%8B%C2%8C%C2%8D%C2%8E%C2%8F%C2%90%C2%91%C2%92%C2%93%C2%94%C2%95%C2%96%C2%97%C2%98%C2%99%C2%9A%C2%9B%C2%9C%C2%9D%C2%9E%C2%9F%C2%A0%C2%A1%C2%A2%C2%A3%C2%A4%C2%A5%C2%A6%C2%A7%C2%A8%C2%A9%C2%AA%C2%AB%C2%AC%C2%AD%C2%AE%C2%AF%C2%B0%C2%B1%C2%B2%C2%B3%C2%B4%C2%B5%C2%B6%C2%B7%C2%B8%C2%B9%C2%BA%C2%BB%C2%BC%C2%BD%C2%BE%C2%BF%C3%80%C3%81%C3%82%C3%83%C3%84%C3%85%C3%86%C3%87%C3%88%C3%89%C3%8A%C3%8B%C3%8C%C3%8D%C3%8E%C3%8F%C3%90%C3%91%C3%92%C3%93%C3%94%C3%95%C3%96%C3%97%C3%98%C3%99%C3%9A%C3%9B%C3%9C%C3%9D%C3%9E%C3%9F%C3%A0%C3%A1%C3%A2%C3%A3%C3%A4%C3%A5%C3%A6%C3%A7%C3%A8%C3%A9%C3%AA%C3%AB%C3%AC%C3%AD%C3%AE%C3%AF%C3%B0%C3%B1%C3%B2%C3%B3%C3%B4%C3%B5%C3%B6%C3%B7%C3%B8%C3%B9%C3%BA%C3%BB%C3%BC%C3%BD%C3%BE%C3%BF
```

上記の出力結果の内、差分があったのは以下の文字コードです。

| 文字コード | 20 | 21 | 27| 28| 29| 2A
|---|---|---|---|---|---|---
encodeQueryComponent| +  | %21| %27| %28| %29| %2A
encodeComponent     | %20| !  | '  | (  | )  | *  

それ以外の文字は同じでした。

まとめるとこんな感じです。

* encodeQueryComponent は、スペースを `+` に変換する。
* encodeComponentはスペースを `%20` に変換する。
* encodeQueryComponent は encodeComponent の変換結果に加えて、`!`,`'`,`(`,`)`,`*`を変換する。
* それ以外の文字の変換結果はどちらも同じ。
複数の条件がAND条件/OR条件で繋がれているときのテストパターン

条件が複数あり、それらがAND条件やOR条件で繋がれているときのテストパターンについて、
自分の考えを纏めてみました。
もしかしたら、どこかで聞いたり読んだりした話かもしれません。その場合はすみません。

##前提の話
複数の条件が、AND条件やOR条件で繋がれているとはどういう状態か、以下で説明します。

###AND条件
AND条件は、検索画面での検索がイメージしやすいと思います。
　性別　　：　◎男　〇女
　年齢　　：　30代
　血液型　：　A型
で検索すると、A型の30代の男性のみ（全ての条件が一致するもののみ）がヒットするなど
※検索条件はてきとうです。

###OR条件
OR条件は、検索サイトで半角スペース区切りで検索するようなイメージでしょうか。
　検索条件🔍[ にんにく 野菜 油 ]
で検索すると、にんにく/野菜/油が関連したもの（一つでも条件に一致するもの）がヒットするなど
※検索サイトの場合は、厳密には違うかもしれません。

複数の条件をANDやORで繋いでいるので「繋がれている」と表現しました。
適切でないかもしれませんが、本記事ではそう表現するとします。


##テストパターンについて
自分は、複数の条件がAND条件/OR条件で繋がれている場合、以下のように考えてテストを行っています。
※以下に記載していく例は、検索条件を設定して特定の情報を取得する/しない場合を想定しています。

###AND条件の場合
AND条件の場合は、条件の内のどれか一つでも一致しないなら取得しないので
全て一致する場合（取得する）と、1条件だけ一致していない場合（取得しない）の全てを確認します。

例：項目が5つあった場合

| |条件1|条件2|条件3|条件4|条件5|結果|
|:--|:-:|:-:|:-:|:-:|:-:|:--|
|no.1|T|T|T|T|T|取得する|
|no.2|<font color="Red">F</font>|T|T|T|T|<font color="Red">取得しない</font>|
|no.3|T|<font color="Red">F</font>|T|T|T|<font color="Red">取得しない</font>|
|no.4|T|T|<font color="Red">F</font>|T|T|<font color="Red">取得しない</font>|
|no.5|T|T|T|<font color="Red">F</font>|T|<font color="Red">取得しない</font>|
|no.6|T|T|T|T|<font color="Red">F</font>|<font color="Red">取得しない</font>|

一つでも欠けてたら取得できないようなギリギリを突き、全て一致している場合のみ取得することを確認するようなイメージです。

###OR条件の場合
OR条件の場合は、条件の内のどれか一つでも一致していたら取得するので、
全て一致しない場合（取得しない）と、1条件だけ一致している場合（取得する）の全てを確認します。


| |条件1|条件2|条件3|条件4|条件5|結果|
|:--|:-:|:-:|:-:|:-:|:-:|:--|
|no.1|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">取得しない</font>|
|no.2|T|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|取得する|
|no.3|<font color="Red">F</font>|T|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|取得する|
|no.4|<font color="Red">F</font>|<font color="Red">F</font>|T|<font color="Red">F</font>|<font color="Red">F</font>|取得する|
|no.5|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|T|<font color="Red">F</font>|取得する|
|no.6|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|<font color="Red">F</font>|T|取得する|

一つでも一致してしたら取得してしまうようなギリギリを突き、全て一致していない場合のみ取得しないことを確認するようなイメージです。

##最後に
条件が一致/不一致の単純なものであっても、全ての組み合わせを確認すると2のn乗（条件5つの場合、2の5乗=32通り）となってしまうので、どこまで効率よくパターンを削れるかが大事だと思っています。

また、検索画面の試験の場合は、個々の検索条件も仕様通り動作しているかを確認する必要があると思っています。流れとしては、
　①個々の検索条件が正しく動作する
　②それぞれの検索条件を組み合わせた検索が正しく動作する
だと思っています。
⇒①の試験で個々の条件の担保を取ったうえで、②にて組合せの試験を行うなど

個々の検索条件についても、別の記事で纏めてみようと思います。
CodeBuildが正常に動くまでにしたことリスト

# はじめに
CodePipelineでCI/CDフローを作成したが、初回実行だったこともありCodeBuild部分でエラーが数件連続した。
解消までの道のりをまとめる。誰かの役にたてば幸いです。

# AWSの構成
CodeBuild
CodeDeproy
CodePipeline
ECR
ECS

# PROVISIONING フェーズでエラー
## エラーコード
```
PROVISIONING クライアントエラー VPC_CLIENT_ERROR: Unexpected EC2 error: InvalidGroup.NotFound
```
## キャプチャ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211196/9d7f3c66-3a5a-2e69-47ea-a3f3a539267d.png)

## 対応
CodeBuildの環境タブを見直したところ、セキュリティグループが設定されていなかったので設定したことで解消。


# AWSのログインに失敗
CodeBuildでbuildしたものをECRに登録しているが、ログイン失敗エラーが発生。
## 実行コード
```
 Running command $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email) 
```
##エラーメッセージ
```
An error occurred (InvalidSignatureException) when calling the GetAuthorizationToken operation: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. 
```
## 対応
エラーメッセージを確認すると、シークレットの値が合わないとしてエラー出ていた。
CodeBuildの環境変数にシークレット値を設定しているため、当該箇所の`AWS_ACCESS_KEY_ID`と`AWS_SECRET_ACCESS_KEY`を確認した。
結果、行末にスペースが含まれていたので、削除したことで解消。
GUIからの見た目では、末尾のスペースは視認しづらいので注意。

# Dockerに接続に失敗
docker imageをECRに登録する部分で接続失敗エラーが発生。
## 実行コード
```
Running command docker push $REPOSITORY_URI:latest 
```
## エラーコード
```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 
```

## 対応
調べてみると、CodeBuildからDockerのアクセスには特権が必要との記事を発見した。
https://qiita.com/reireias/items/c02e5e7b2f099f2dab9e
環境の設定を確認すると、特権付与されていなかったので、付与したこと解消。
[Unity] GetIncetanceID の速度確認

# GetIncetanceID の速度検証

当たり判定で GetIncetanceID() を使って大丈夫なのかどうか、
調べても速度が出てこなかったので、念のため確認する。


# 検証

Collider をアタッチした GameObject を適当な場所に置き、
それにMeshRenderer,NaviMeshなど適当な複数のコンポーネントをアタッチする。
それに対して特定のクラス(Dummy)を参照することを想定する。

試行回数: 10,000,000

```C#:SpeedTest.cs
using System.Threading.Tasks;
using UnityEngine;

public class SpeedTest : MonoBehaviour
{
    [SerializeField] Collider testTarget;

    async void Start()
    {
        await Task.Delay(2000);

        int Count = 10000000;

        var sw1 = new System.Diagnostics.Stopwatch();
        sw1.Start();
        for (int i =0; i < Count;i++)
        {
            var a = testTarget.gameObject.GetComponent<Dummy>();
        }
        sw1.Stop();

        Debug.Log("GetComponent : " + sw1.ElapsedMilliseconds);


        var sw2 = new System.Diagnostics.Stopwatch();

        sw2.Start();
        for (int i = 0; i < Count; i++)
        {
            var b = testTarget.gameObject.GetInstanceID();
        }
        sw2.Stop();

        Debug.Log("GetInstanceID : " + sw2.ElapsedMilliseconds);
    }
}
```

# 結果

単位は ms

```
GetComponent : 1627 
GetInstanceID : 635
```

流石にGetComponent より早いようですね！ｗ 安心しました！ｗ

しかしながら、GetInstanceID() でID を取得した後は、このIDがどのオブジェクトか検索する必要がありますので、以降の負荷も考慮しなければいけないという事。

特に初心者だったり、カジュアルゲームで数十フレームに１回しか衝突が発生しないなどだったら、そこまでコストをかける必要は無いように思える。
（まあ検証ながらもう作ってしまったけど！）

スムーズにInstanceIDで検索できる仕組みを整えた上で使うのでなければ、
ColliderのGameObjectから直接GetComponent しても悪くないのかな思った。


蛇足ではあるが、InstanceID は各スクリプト自体にも InstanceID が付与されているため、
gameObject のIDを取るのが無難だと思われる。


簡単ですが、以上
Facebook graph API でシェア数/リアクション数を取得

### アプリの作成
以下よりアプリを作成。
https://developers.facebook.com/

### アプリのアクセストークンの取得
以下をリクエスト

```sh
https://graph.facebook.com/oauth/access_token?client_id=【APP_ID】&client_secret=【APP_SECRET】&grant_type=client_credentials
```

取得したアクセストークンが有効か確認
[アクセストークンデバッガー \- Facebook for Developers](https://developers.facebook.com/tools/debug/accesstoken/)


### wordpressのプラグイン内で結果を取得するfunction
```php
function get_fb_graph_engagement($url) {
  if (!defined('TOKEN_FB_GRAPH')) {
    define('TOKEN_FB_GRAPH', '【トークン】');
  }
  $curl = curl_init("https://graph.facebook.com/v4.0/?id=$url/&fields=og_object{engagement},engagement&access_token=".TOKEN_FB_GRAPH);
  $option = [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_RETURNTRANSFER => true,
  ];
  curl_setopt_array($curl, $option);
  $result = curl_exec($curl);
  $decode_res = json_decode($result);
  return $decode_res;
}
```

### 参考
- [Graph API V2\.9でFacebookのイイね数を取得した話](http://program-designer.xyz/graph-api/)
- [アクセストークン \- Facebookログイン](https://developers.facebook.com/docs/facebook-login/access-tokens/#apptokens)
[App Access Tokens]参照。
- [Facebookのシェア数を取得する方法 \- Qiita](https://qiita.com/liencode/items/7ca38546f94e191ea407)
今日学んだ基本情報の勉強内容(2)

##メモリ
メモリは<font color="Red">RAM</font>と<font color="Red">ROM</font>という2種類に分けられる。
###RAM
RAMは電源を消すと中身が消えてしまう<font color="Red">揮発性</font>という性質を持っていて読み書きが可能である。
RAMの中で大きく2種類に分けられる。
####①DRAM
DRAMは主に主記憶装置に用いられるメモリで安価で容量が多い。しかし使用されている回路がコンデンサであるため、内容を再書き込みする<font color="Red">リフレッシュ</font>動作が必要になる。

####②SRAM
SRAMは主にキャッシュメモリに用いられ、高速であるが価格が高い。使用されている回路は<font color="Red">フリップフロップ回路</font>でDRAMのようにリフレッシュ動作が必要ない。

###ROM(Read Only Memoryの略らしい)
ROMも以下のように2種類に分けることができる。

####①マスクROM
読み出し専用のメモリ

####②PROM
中身を書き換えることができるROM。以下のようなものがある

- EPROM　・・・　紫外線でデータを消去して書き換える
- EEPROM　・・・　電気的にデータを消去して書き換える
- フラッシュメモリ　・・・　全消去ではなくブロック単位でデータを書き換える

##キャッシュメモリとディスクキャッシュ
<font color="Red">キャッシュメモリ</font>はCPUと主記憶装置の間にある読み書きの速度差を埋めるために存在する。
<font color="Red">ディスクキャッシュ</font>は主記憶装置と磁気ディスク(HDDなど)の間の速度差を埋めるために存在。
キャッシュメモリへの書き込みを行う際に、書き込みの内容を主記憶装置にも反映させないといけないので、その方法が以下の2種類となる。

1. ライトスルー方式
キャッシュメモリに書き込みを行う際に同時に主記憶装置にも書き込む

2. ライトバック方式
普段はキャッシュメモリにしか書き込みを行わず、キャッシュメモリに入りきらなくなって追い出されたデータを主記憶装置に書き込む

##メモリインタリーブ
キャッシュメモリ以外で主記憶へのアクセスを高速化する手法

主記憶装置を以下のように複数の区画(バンク)に分割する
![1570089160321.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/3e01f3d0-d6ed-67dd-f269-3cd6efa92204.jpeg "メモリインタリーブ1")

CPUから主記憶装置にアクセスするときは以下のように複数のバンクに同時にアクセスすることによって多くのデータを扱うことができる
![1570089729687.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/da6f748c-39c6-2a2d-84d2-9ac43fde6540.jpeg "メモリインタリーブ2")

以上
メモリインタリーブは過去問でもよく出た気がする・・・

##参考文献
- [キタミ式イラストIT塾　基本情報技術者　平成28年度]
AWS IoT@Loft  スマートファクトリー IoT基盤構築プロトタイピング を受講したよ（2019年10月2日実施）

IoT@Loft ハンズオン スマートファクトリー IoT基盤構築プロトタイピングを受講しました。

#「IoT@Loft ハンズオン スマートファクトリー IoT基盤構築プロトタイピング」参加メモ
@mine820 さんが資料を書かれています。
こっちの方が良いかな？
https://qiita.com/mine820/items/245a162ce692aaf467a3#_reference-af615d7e2469c9b40ab3

##資料
https://bit.ly/IoTAHandsonAtLoft
##コマンドテキスト
http://bit.ly/IoTAHandsonCmd

今回は疑似センサーを使用しましたが実物のセンサーを使ったハンズオンやりたいですね・・・

2時間30分で、AWSの設定から見える化までするモリモリなハンズオンです。
*終わったら削除しないとお金かかります。

![IMG_0563.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ea7169b2-711e-a7b2-2785-99d11d96f67a.jpeg)
![IMG_0564.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d88324ce-3064-f2ac-d15c-21d0ddb4de5c.jpeg)

LAMDA、AWS IOT Core、AmazonS3などAWSの様々なサービスを使って構築します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c1f8f834-0cad-af0f-cbed-bb47596f0212.png)

ハンズオンは、資料通りやれば問題なく進められます。
視覚化ツール　KIBANAのデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/929ca4d0-ec73-9e7c-9a11-d446fa23177e.png)

2時間後には、Jupyter Notebookの画面を出すことが可能です。
![IMG_0565.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/aaecc6e0-4b90-39b4-f684-edfb0b55667a.jpeg)

今回は、疑似データで、活用手法よりも、環境を作ってみようというハンズオンでした。
今後は、データ収集から活用手法についての説明があると良いですね。
JavaScript（繰り返し処理）

#while文
英語では「〜の間」という意味。
**「条件式が true の間、 {} 内の処理を繰り返す」**ことができる。

```js
//while文の書き方
let number = 1 ;
while( number <= 100 ){
  console.log(number);
  number + = 1 ;
}
```
訳：100まで1を足し続けるね。並べるね。

`while( number <= 100 )`・・・**変数numberの値**が**100以下の時**に処理を繰り返す。

##while文の注意点
>while文を用いる場合には、
**条件式の部分がいつかはfalseになり、繰り返し処理が終わる必要があることに注意してください。**

>更新するコード（上記では`number + = 1 `）を書き忘れると、
いつまで条件がtrueのままで、永遠に繰り返し処理が続いてしまいます。
（これを無限ループと呼びます。）

#for文
「変数の定義」「条件式」「変数の更新」の3つを（）の中に書く。
（）の中ではそれぞれをセミコロン（;）で区切ります。

```js
//for文の書き方
for(let number = 1;number <= 100;number ++){
  console(number);
}
//コンソール
1
2
3
4
・
・
・
100
```
訳：1をnumberとする;number以上100以下;numberに1を足す

##応用例
###問題
for文を用いて1から100を順番に出力しましょう。
ただし、3の倍数のときは「3の倍数です」と出力してください。
エディタにはすでにfor文の雛形が用意されています。
###答え

```js
// for文を完成させてください
for (let number = 1;number <= 100;number ++) {
  
  // if文を用いて、numberが3の倍数の時に「3の倍数です」、そうでないときは数字を出力してください
if(number % 3 === 0){
  console.log("3の倍数です");
}else{
  console.log(number);
}
}

//コンソール
1
2
3の倍数です
4
5
３の倍数です
7
8
3の倍数です
・
・
・
98
3の倍数です
100
```
cp コマンドで上書きの警告が出るときは先頭にバックスラッシュをつけると警告が消える

Linux 環境で `cp` コマンドを使ってファイルを上書きしようとしたときに `-f` オプションを付けても警告が出る時がある。

以下の通り、実験してみる。環境は、CentOS 7.7 であり、シェルは Bash である。

まず、ファイルを 2 つ作成する。

```bash
# echo "aaa" > a.txt
# echo "bbb" > b.txt
```

何もオプションを付けずに `cp` コマンドを実行すると警告が出る。

```bash
# cp a.txt b.txt 
cp: overwrite ‘b.txt’? n
```

`-f` または、`--force` オプションを付けて `cp` コマンドを実行しても警告が出る。

```bash
# cp -f a.txt b.txt 
cp: overwrite ‘b.txt’? n
#
```

この警告は、一般ユーザで実行したときには発生しないが、`roor` アカウントで操作しているときに発生するはずである。

原因は、デフォルトの `alias` の違いにある。

まず、一般ユーザで `alias` コマンドを実行した結果がこれである。

```bash
$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .*'
alias la='ls -la --color'
alias ll='ls -l --color'
alias ls='ls --color'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
```

次に、`root` ユーザで `alias` コマンドを実行した結果がこれである。

```bash
# alias 
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
```

一般ユーザの結果と `root` ユーザの結果を比較すると、唯一の違いがこの `cp -i` という `alias` である。

```bash
alias cp='cp -i'
```

`man cp` コマンドの文章を引用すると `-i` オプションの説明は以下の通りである。

```text
-i, --interactive
       prompt before overwrite (overrides a previous -n option)
```

これはつまり、`root` ユーザで `cp` コマンドを実行する際には、明示的に `-i` オプションを付けなくても、`-i` オプションが付与されているということである。そして、`-i` オプションは、常に上書き時に警告を出すのである。

そこで、この `alias` が付与されている環境下で上書きの警告を出さないようにしたいときはどうすればよいのかというと、`cp` コマンドの前にバックスラッシュを付与すればよいのである。

```bash
# \cp a.txt b.txt
#
```
今度は何も警告が出なかった。`root` ユーザなので本来 `-f` オプションを付ける必要もない。

```bash
# cat a.txt 
aaa
# cat b.txt 
aaa
```

ファイル b.txt の中身が書き換わっている。

ちなみに、このコマンドの先頭にバックスラッシュをつけるという方法は、`alias` を無効にするための方法であるため `cp` コマンド以外の全てのコマンドで適用可能である。先ほど提示した `alias` を例に取ると、`mv` コマンドや `rm` コマンドでも同様のことが適用できる。

以上。
開発メモ rails fields_for

業務で必要だったのでメモ書き。

viewで一括登録したい時、fields_forを使って登録しようとした。

以下source

``` _form.html.erb
<%= f.fields_for :user_details, @user.user_details.sort_by(&:order_number) do |sf| %>
    <% isDisabled = sf.diplay_flg ? true : false %>
    <%= sf.number_field :type2_flat1_amount,{class: "money", disabled: isDisabled } %>
<% end %>
```

fields_forで指定したテーブルの値を表示判定で使いたかったので、調べた結果

``` 例.×
#undefined method errorが発生
sf.diplay_flg
```
``` 例.○
#objectを挟む 
sf.object.diplay_flg
```

フォーム名.object.カラム名
というようにobjectを間に咬ませると値が取れるっぽい。

RailsFormHelperの機能とのこと。



修正後

``` _form.html.erb 
<%= f.fields_for :user_details, @user.user_details.sort_by(&:order_number) do |sf| %>
    <% isDisabled = sf.object.diplay_flg ? true : false %>
    <%= sf.number_field :type2_flat1_amount,{class: "money", disabled: isDisabled } %>
<% end %>
```

今後よく使いそうなのでメモに残しておく。

開発環境
ruby 1.9.2
rails 3.0.5


参考の記事は以下。
助かりました。ありがとうございます。
https://codeday.me/jp/qa/20181229/94333.html
マルチパラダイムプログラミング言語とは

###はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているやっきーです。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#マルチパラダイムプログラミング言語とは
複数のプログラミングパラダイムに対応するプログラミング言語のことです。

...と言われても、「*プログラミングパラダイムとは何か？*」と思いますよね。

#プログラミングパラダイムとは
プログラミングパラダイムは、プログラミングの記述における方法や考え方を表したものです。

例えば、人間関係のトラブルを解決する時に取る手法には様々なものがあると思います。話し合いで解決するとか、人伝いで言いたいことを伝え合うか、はたまたコブシで決着をつけるか（これは良くないですね）。

プログラミング言語にも、与えられた問題を処理するための方法があり、これをプログラミングパラダイムといいます。

##プログラミングパラダイムの例
- 手続き型言語
- 構造化プログラミング
- オブジェクト指向プログラミング
- 関数型プログラミング
- 論理プログラミング

など、本当に様々なパラダイムがあります。

#プログラミングパラダイムに対応する言語の例
|プログラミングパラダイム      |  言語              |
|:----------------------:|:-----------------:|
| 手続き型言語             |  C言語             |
| オブジェクト指向プログラミング |  Python, C#       |
| 関数型プログラミング        |  Scala            |
| 論理プログラミング          |  Prolog          |

#マルチパラダイムプログラミング言語の例

- C++ 手続き型言語、オブジェクト指向プログラミングなどが含まれています。
- Javascript 手続き型言語、関数型言語、オブジェクト指向プログラミングなどが含まれています。

#まとめ
プログラミング言語には多数のパラダイムと呼ばれる手法、考え方が存在しており、複数のプログラミングパラダイムを持つ言語をマルチパラダイムプログラミング言語といいます。

どの言語も、何らかのプログラミングパラダイムに属していることが多く、マルチパラダイムではない言語を見つけることは非常に困難だと思われます。
しかし、マルチパラダイムの定義が曖昧なため、複数のパラダイムをもつ言語でもマルチパラダイムプログラミング言語とされないこともあるようです。
Ubuntu18.04での日本語入力

## 環境とか
コンピュータはJetson Xavier、JetPackのバージョンは4.1.1です。
いろいろうまくいかず、むかついたのでメモっておきます。

## 手順
ターミナルで以下を入力。
日本語入力に関するものをインストールして最後に再起動します。
もしかしたら再起動いらないかもしれません。

```terminal
$ sudo apt install language-pack-ja-base language-pack-ja
$ sudo apt install fcitx-mozc
$ reboot
```

再起動後、"System Settings"→"Langage Support"をクリック。
設定を変更したら再び再起動します。
![Screenshot from 2019-10-03 18-12-51のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208979/babf1351-e3ae-7b8e-05b4-e3c926f2efce.png)!
一番下の"Keyboard input method system"を"fcitx"に変更します。
その後、再起動します。
![Screenshot from 2019-10-03 18-18-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208979/ad14a926-7290-1d76-968e-4e8247eac100.png)
再起動して、上のタスクバーみたいな画面にキーボードマークが表示されていたら成功です。
そのキーボードマークをクリックし、"Configure"を開きます。
![Screenshot from 2019-10-03 18-18-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208979/03f5fe7e-9d95-f2d2-075f-7b99b288a7bb.png)
プラスマークを押し、"Mozc"を選択します。
"Mozc"以外のものはマイナスマークで削除してください。
最後に"Mozc"と書いてある部分をダブルクリックし、"Keyboard layout"を"Japanese"に変更しておしまいです。
![Screenshot from 2019-10-03 18-34-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208979/62f54626-bd6e-ae0d-5f0e-620e1990cdb0.png)
これで半角・全角の効く日本語入力になるはずです。
ならなかったら教えてください。
Excel と Azure SQL を使って、業務システムを作成する。(Tips1)

「何言ってんの？」と言われることでしょうね！

会社にいても、自宅にいても、外出先からでもインターネットの環境があれば、データを共有できるシステムを作りたい。

どうやって作るの？

で、考えてみた。

### 動作環境（Windows 10）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/09d0bdbb-ae1a-d042-016c-df02e0f7f71c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/f55d444d-6c34-da07-481f-961d0c509efa.png)

- 主として動作するのは、Access 2016
- データベースは、Access の ACCDB と Azure SQL データベース
- データの一括入出力用に Excel 2016


こんなソウトウェア構成で考えてみる。

### ランニングコスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/d84ab173-20e2-2acb-9607-fb7c83a2aed2.png)

Azure SQL データベースを Standard S0 で利用するので、
1,800円/1ヶ月

### セキュリティ
Azure SQL データベースに設定するパスワードで保護する。

### Excelとの連携
データを一括で入力する場合には、Excelのデータを読込む。
データを一括で編集する場合は、一度 Excel にエクスポートして、編集後にインポートできるようにする。

### 将来性
Access 2019 が 発売され、現在の機能で充分であることを考えれば、今後 10年間は大丈夫だと考える。

Webアプリ作成には、Power Apps などの方がいいかもしれないが、今までのプログラムコードを活用できるメリットを重視すると、Access と Excel の VBAコードを利用した方が、作成コストを抑えることができると思う。

### 試作品
既に開発済みの Excel と Access を連携した「カードボックス BARI」を Azure SQL データベースと連携するように改良する。

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/e732b622-6860-185e-4beb-841d3eeb95fc.png" width="70%">](https://access-cloud.hatenablog.com/entry/cardbox-bari)
https://access-cloud.hatenablog.com/entry/cardbox-bari

こんな状況で、Access Exce クラウドデータベースを作成しようと思う。

## 開発履歴は、ここに逐次追記していきます。
2019/10/03 スタート！
2019/10/13 [アカウントの取得画面を作成する](https://qiita.com/muramoto_jp/items/5653450a75aa890bf635)
[Laravel + React.js] React側でページのタイトルを実装する

# 導入
Laravelのみでの実装だと、それぞれのページごとのブレードにtitleタグを書けばよかったのですが、
viewをReactにしてしまうと、ルーティングはReact側で行うので、titleもLaravel側ではなく、React側で変更しなくてはなりません。
今回はそれに当たって、react-document-titleというライブラリをインストールしてみたり、、とかなり色々調べたのですが、とても単純に実装できたので、書き残しておきます。

結論をいうと、特別にライブラリを入れる必要はなく、僕のJavaScriptの基礎力のなさを痛感することとなりました...

# 開発環境
 - Laravel Framework : 6.0.3
 - react : ^16.2.0

# 実装
用いるのは、`document.title`プロパティです。
参考：https://developer.mozilla.org/ja/docs/Web/API/Document/title

これを用いることによって、title要素の中身を更新させることが可能です。

なので、React.jsでは、コンポーネントがレンダリングされた時にtitleを変更させたいので、

```js
componentDidMount() {
    document.title = "TITLE";
}
```
とすると、ルーティングさせていても、そのページのタイトルを表示させることができます。
oracleネタ

適当にメモしてます

## tkprof
コマンドオプションにsys=noを指定するとバックグラウンドで実行されたSQLを解析しない
### call
parse SQLを解析し、実行計画を立てる
execute SQLの実施
fatch 行の取得
### 解析内容
count callの実施回数
cpu 処理のためにcpuが処理した時間
elapsed 待機を含めた処理全体の経過時間
disc ディスクIOで読み取ったデータブロック数
query 読取一貫モードで取り出したバッファの総数（select）
current カレントモードで取り出したバッファの総数（update,delete）
Misses in library cache during parse 共有プールから実行計画を取得出来なかった件数

### 行ソース
cr 読取一貫モードで読み取った件数
pr ディスクIOで読み取った件数
pw ディスクので書き込んだ件数
time 経過時間
cost 実行計画上のコスト（データブロック数）
size 実行計画上の行サイズ
card 実行計画上の選択性

### 未確認
executeとfatchのコストが増える要因
結合のコストがexecuteで、最終的な行の取り出しにかかるコストがfatch?

読取一貫モードは常に最新のデータで、
カレントモードはカーソル作成時のデータ？
高校数学の「微分」関連の問題をPythonで解く

# 概要

　関数の微分・導関数に関する問題（高校数学）を Python で解いていきます。

- [高校数学の「ベクトルの内積」関連の問題をPythonで解く](https://qiita.com/code0327/items/b8614649757110c654b6)
- [高校数学の「高次方程式・恒等式」関連の問題をPythonで解く](https://qiita.com/code0327/items/66efb7ac56cdea5b0b0d)
- [高校数学の「2次関数グラフ」関連の問題をPythonで解く](https://qiita.com/code0327/items/83b87f3d490e740b2a95)
- [高校数学の「極限値」関連の問題をPythonで解く](https://qiita.com/code0327/items/1fd0df574c8c8357af5a)
- - [高校数学の「微分」関連の問題をPythonで解く](https://qiita.com/code0327/items/97fcacc42ab44402eb35)


# 問1

次の関数を微分せよ。

$$ y= (x^2-1)(2x^2 +x-3) $$

## 問1の解き方（参考）


```math:
\begin{align}
y' & = \{ (x^2-1)(2x^2 +x-3) \}' \\
& =  (x^2-1)'(2x^2 +x-3)  +  (x^2-1)(2x^2 +x-3)' \\
& = 2x(2x^2 +x-3) + (x^2-1)(4x+1) \\
& = 8x^3+3x^2-10x-1
\end{align}
```

## 問1の解を与えるPythonプログラム

sympy を利用して解きます。sympy は、記号計算（数式処理）のパッケージです。

`diff` で微分、`expand` で展開（括弧をとる）をしています。

```python:Python
from sympy import diff, expand, Symbol
x = Symbol('x')
fx = (x**2-1)*(2*x**2+x-3)
ans = expand(diff(fx, x))
print(f'解：{ans}')
```

## 実行結果

```
解：8*x**3 + 3*x**2 - 10*x - 1
```

見づらいのですが数式表記すると $8x^3+3x^2-10x-1$ になります。環境によっては、あらかじめ `init_printing()` を書いておくことで見やすい形式で実行結果の出力が得られます。

ちなみに、`expand` を適用せずに `ans = diff(fx, x)` として解を表示すると次のようになります。

```
解：2*x*(2*x**2 + x - 3) + (4*x + 1)*(x**2 - 1)
```

$2x(2x^2 +x-3) + (4x+1)(x^2-1)$ のような形になります。

# 問2

次の関数を微分せよ。

$$ y= (x+1)^2(2x-3)^4 $$


## 問2の解き方（参考）

```math:
\begin{align}
y' & = \{ (x+1)^2(2x-3)^4 \}' \\
& = \{(x+1)^2\}'(2x-3)^4  +  (x+1)^2\{(2x-3)^4\}'  \\
& = 2(x+1)(x+1)'\cdot (2x-3)^4  +  (x+1)^2\cdot 4(2x-3)^3(2x-3)'  \\
& = 2(x+1)(2x-3)^4  +  8(x+1)^2(2x-3)^3  \\
& = 2(x+1)(2x-3)^3(6x+1)
\end{align}
```

## 問2の解を与えるPythonプログラム

上記に示したように、きれいにまとめるために `factor` で因数分解をしています。

```python:Python
from sympy import diff, expand, factor, Symbol
x = Symbol('x')
fx = ((x+1)**2)*((2*x-3)**4)
ans = factor(diff(fx, x))
print(f'解：{ans}')
```

## 実行結果

```
解：2*(x + 1)*(2*x - 3)**3*(6*x + 1)
```

すこし見ずらいですが、$2(x+1)(2x-3)^3(6x+1)$ が求まっています。

もし、因数分解しないで展開した形で解が欲しい場合は、`ans =expand(diff(fx, x))` とします。そのときの実行結果は次のようになります。

```
解：96*x**5 - 320*x**4 + 160*x**3 + 360*x**2 - 270*x - 54
```

$96x^5-320x^4+160x^3+360x^2-270x-54$ となります。
【swift5】背景画像をスクリーンサイズに合わせて表示させる方法

# 【swift5】背景画像をスクリーンサイズに合わせて表示させる方法

## 環境
swift 5.0.1
xcode 11.0

## 実現したいこと
「label等を**設置した後**に、背景に画像を設置したい。」

背景画像用にstoruboardからimageViewを設置すると要素が重なり合ってしまい、backgroundColorとして背景画像を設定すると、画像サイズが画面幅に合わない。

**どちらかの問題を解決**して、本機能を実現させたい。

## 問題点
・**要素の重なり順問題**
imageViewをstoryboardから挿入　→　画像が上に重なって表示されてしまい、コンテンツが隠れてしまう。

・**画面幅問題**
UIColorのcolorWithPatternImageメソッドを利用し、backgroundColorプロパティを変更　→　画像サイズが元々の画像サイズで表示されてしまい、画面幅に合わない。

```swift:
let backgroundImage = UIImage(named: "画像名")!
self.view.backgroundColor = UIColor(patternImage: backgroundImage)
```
[tanihiro.log:【iOS】UIViewに背景画像を設定する方法](http://tanihiro.hatenablog.com/entry/2014/01/06/215704)
[Phosphophyllite:画像をUIViewの壁紙に設定する【Swift】](http://mimaunes.hatenablog.com/entry/20141127/1417057095)

## 解決策
・**要素の重なり順問題**を、addSubview関数によりmainViewにsubviewとして加えたのち、sendSubviewToBack関数を用いてviewの最背面に移動させることで解決。

複数ページにてこれを行いたい場合、いちいち設定するのは面倒くさいので関数化させてしまう。

まず、新規ファイルを作り、以下を記述する。

```swift:addBackground.swift
import UIKit

extension UIView {
    func addBackground(name: String) {
        // スクリーンサイズの取得
        let width = UIScreen.main.bounds.size.width
        let height = UIScreen.main.bounds.size.height
    
        // スクリーンサイズにあわせてimageViewの配置
        let imageViewBackground = UIImageView(frame: CGRect(x: 0, y: 0, width: width, height: height))
        //imageViewに背景画像を表示
        imageViewBackground.image = UIImage(named: name)

        // 画像の表示モードを変更。
        imageViewBackground.contentMode = UIView.ContentMode.scaleAspectFill

        // subviewをメインビューに追加
        self.addSubview(imageViewBackground)
        // 加えたsubviewを、最背面に設置する
        self.sendSubviewToBack(imageViewBackground)
    }
}

```



これにより、表示させたいviewControllerのviewDidLoad内に以下を表記することで、背景画像を画面幅に合わせて表示することができるように。

```swift:viewController.swift
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 表示したい画像の名前(拡張子含む)を引数とする。
        self.view.addBackground(name: "画像名")
    }
```





#### 参考ページ
・[コードログ：ios – 背景画像をどのように素早くスクリーンサイズに合わせるのですか？](https://codeday.me/jp/qa/20190213/258522.html)
・[HatenaBlog：画面ぴったりに画像を出力「UIScreen、UIImege」](https://kichie-com.hatenablog.com/entry/2015/12/23/202208)
・[appleDevelopper：Instance Method addSubview(_:)](https://developer.apple.com/documentation/uikit/uiview/1622616-addsubview)
・[iDEACLOUD：【Xcode】addSubviewで生成したViewの重なり順を変更するには？](https://ideacloud.co.jp/dev/addsubview_index.html)
Null許容参照時代のParent

# TL;DR

Nullを拒絶しつつRootをどのように表現するのかの一考察

ただ、まだこの辺しっかり考察してないのでもっと妙案があれば、コメント下さい！

# どーいうことだってばよ?

ぐるぐる回るグラフはともかく木構造における双方向に移動できる構造を考えた場合、概ね以下のような構造になるかなって。

```cs
public class TreeStructure
{
	public TreeStructure Parent{get;}
	public IReadOnlyList<TreeStructure> Children{get;}
	
	//諸々省略
}
```

このとき、`Children`に関してはCountが0のEntityを返せば空であることをNullを使わずに表現できる。反面、`Parent`に関しては、`Root`以外であれば親子関係が必ず存在するから`Parent`がNullに成ることはないけど、Rootだったり、Purgeなど枝を無効化したばあい、`Parent`にNullを入れることなく表現できないか考えた結果、若干回りくどいけど、以下のような方法が使えた。

# 仮想上のRootを構築する(道半ば)

とりあえず、現物のRootの上に仮想上のRootをもう一個こさえることで、なんとなくNull回避できないか考えたのが以下

```cs
public abstract class Tree
{
	private class ImaginaryRoot:Tree
	{
		//結局再帰的にどこかにNullが出てきてしまう
		public ImaginaryRoot():base(null)
		{
			
		}
	}
	
	public static Tree Root{get;}=new ImaginaryRoot();
	
	protected Tree(Tree parent)
	{
	}
	public string Identity{get;}
	
	public Tree Parent{get;}
}
```

`ImaginaryRoot`を作ることで本当の`Root`のParentをそのSingletonと比較することでRootか否かを確認できる。



```cs
bool IsRoot(Tree target)=>target.Parent==Tree.Root;

```

但し、結局ImaginaryRootはTreeの派生物なので結局Rootを持つことになり、そこに現状Nullを入れてしまってるので、Nullを拒絶できてない。



# 若干回りくどいけどやってみたこと

なので、以下のようにしてみた



```cs
public interface ITree
{
	ITree Parent{get;}
	IReadOnlyList<ITree> Children{get;}
}

public class Tree : ITree
{
	private sealed class ImaginaryRoot : ITree
	{
		public ITree Parent => throw new InvalidOperationException("Imaginary root doesn't have Parent element.");

		public IReadOnlyList<ITree> Children => throw new InvalidOperationException("Imaginary root doesn't have Children.");
	}

//パージされたなど弁別したいときは増やせる
	private sealed class PurgedRoot : ITree
	{
		public ITree Parent => throw new InvalidOperationException("Purged root doesn't have Parent element.");

		public IReadOnlyList<ITree> Children => throw new InvalidOperationException("Purged root doesn't have Children.");

	}
	
	public static ITree Root{get;}=new ImaginaryRoot();
	public static ITree Purged{get;}=new PurgedRoot();

	public ITree Parent {get;}

	public IReadOnlyList<ITree> Children {get;}
}
```

早い話が、`Null`じゃなくて問答無用で例外飛ばすという思想。

# まとめ

このように、null非許容の参照型にしたくても、Rootのような特異点が解決できないみたいなとき、これまでの考察のように今までnullを返してなんとなく処理してきたことを例外を出して表現するというのはそれなりに有効じゃ無いかと思う。
但し、終端に辿り着けたかどうかをtryｰcatchで判別するのはnullを排除する以上に設計上マズいし、又パフォーマンスにもかなり響くので避けるべきかと。

また、今回`Parent`の実装をvirtualにしたくなかったのでinterfaceをこさえたけど、型の継承というか契約関係の複雑性とのトレードオフになっているので、こんなことしたくないと言うことであれば、`	public virtual Tree Parent {get;}`のようにして、interfaceを使わないと言う設計も有りだと思う。
DataFrame型かndarray型かどうかをif文で判定する方法


# まえがき
pythonでdataFrame型かどうかをif文で判定、または、ndarray型かどうかをif文で判定したい場合に、この記事が役に立ちます。
ちなみに、DataFrame型かどうかをif文で判定する参考サイトが全然出てこなかったのですが、自分だけですかね・・・。

##実行環境
python 3
jupyter lab

#実際のコード
以下をのコードをさくっと、コピペして下さい。

```
[in]
import numpy as np
import pandas as pd

# 変数名をそのままprint関数内で表示させる関数
def chkprint(*args):
    for obj in args:
        for k, v in globals().items():
            if id(v) == id(obj):
                target = k
                break          
    return target

# データがどのデータ型か、列数、行数を表示する関数
def typeInfo(targetData):
    if (type(targetData) is pd.core.frame.DataFrame):
        print("{} は DataFrame型".format(chkprint(targetData)))
        print("{} の行数, 列数・・・{}\n".format(chkprint(targetData), targetData.shape))     # shapeの表示内容は、(行数, 列数)となる
    if (type(targetData) is list):
        print("{} は list型".format(chkprint(targetData)))
        print("{} の行数, 列数・・・{}\n".format(chkprint(targetData), pd.DataFrame(targetData).shape))    # shapeの表示内容は、(行数, 列数)となる
    if (type(targetData) is np.ndarray):
        print("{} は ndarray型".format(chkprint(targetData)))
        print("{} の行数, 列数・・・{}\n".format(chkprint(targetData), targetData.shape))     # shapeの表示内容は、(行数, 列数)となる
    if (type(targetData) is pd.core.series.Series):
        print("{} は Series型".format(chkprint(targetData)))
        print("{} の行数, 列数・・・{}\n".format(chkprint(targetData), targetData.shape))     # shapeの表示内容は、(行数, 列数)となる
```
#確認方法
以上のコードに続いて、以下のコードを実行して出力を確認して下さい。

```
[in]
data_list = [[1.0, 2.0, 3.0], [11.0, 12.0, 13.0]]
data_ndarray = np.array(data_list)      #listをndarrayに変換する
data_Series = pd.Series(data_list)      #listをSeriesに変換する
data_df = pd.DataFrame(data_list)       #listをDataFrameに変換する

typeInfo(data_list)
typeInfo(data_ndarray) 
typeInfo(data_Series)
typeInfo(data_df)
```
出力結果

```
[out]
data_list は list型
data_list の行数, 列数・・・(2, 3)

data_ndarray は ndarray型
data_ndarray の行数, 列数・・・(2, 3)

data_Series は Series型
data_Series の行数, 列数・・・(2,)

data_df は DataFrame型
data_df の行数, 列数・・・(2, 3)
```
Seriesのみ、列数が出ません。Seriesは一次元だからです。

##Series型とDataFrame型を表示して比較してみる
おまけ。Seriesは一次元だからと言って、表示してみると以下のようになります。

```
[in]
print("\nSeriesを表示する")
print(data_Series)
print("\nDataFrameを表示する")
print(data_df)
```
出力結果

```
[out]
Seriesを表示する
0       [1.0, 2.0, 3.0]
1    [11.0, 12.0, 13.0]
dtype: object

DataFrameを表示する
      0     1     2
0   1.0   2.0   3.0
1  11.0  12.0  13.0
```
##あとがき
もっと良いやり方があったら、コメントして下さい。
XCode10のBuild System

いつもXCode9でビルドに問題のなかったCocos2d-xプロジェクトをXCode10でビルドすると、たくさん理解不能なコンパイルエラーが出てしまった！一体なんでだろうか？
原因はXCodeのビルドシステムの設定です。XCode10から「New Build System」はデフォルトになっていて、File -> Workspace Settingsメニューで「Legacy Build System」に設定すると、謎のビルドエラーがなくなり、ビルドは無事に通りました。
ちなみにxcodebuildコマンドラインの場合、オプリョン「-UseModernBuildSystem=NO」を付けば、レガシービルドシステムを使います。
直すには簡単ですが、逆に新しい「New Build System」の謎は深くなりましたね。。。時間はあったら調べます。
確率統計1回目

#目標
**１に限りなく近い確率**や**０に限りなく近い確率**を扱い、そこから**一定の結論**を得ることを目標とする

#確率と相対度数の違いとは？
**確率**とは実際に起きる**確からしさ**。つまり、**理論的**なもの！
**相対度数**とは**該当する数**を**全体数**で割ったもの。**試行の結果**から定まるもの！

※**十分にたくさんの試行を繰り返して得た相対度数**を**「経験的な確率」**として扱う場合もある！

#独立と排反の違いとは？
試行と事象を正しく理解する必要があるので、まずはその違いから！
##試行とは？
同じ条件の下で、偶然によって決まる**実験や観測**のこと。

##事象とは？
試行によって起こる結果のこと。

**ex)次の状況において、試行と事象はそれぞれ何か、説明せよ**
「さいころを二回投げた。一回目は1の目が出て、二回目は6の目がでた。」
**試行**....「サイコロを投げるという行為」
**事象**....「１の目がでたこと」、「６の目がでたこと」、「(1,6)という順番で出たこと」といったように**複数**挙げられる。





##独立とは？
前に行った試行の結果が次の試行に全く影響を与えないとき、この試行は「独立である」という。

**独立**は**「試行」**に対して定義される。
**独立**は**積の法則**により証明されている。

##排反とは？
事象A,Bが同時に起こることがないとき「事象A、Bは互いに排反である」という。

**排反**は**「事象」**に対して定義される。
**排反**は**和の法則**により証明されている。
https://integraldx.info/independent-disjoint-712

#記号
##a∈A（要素）
A{1,2,3}の時

**2∈A**　2はAの要素である。
##A⊂B（部分集合）　
A{1,2,3}、B{1,2,3,4,5,6,7}の時

**A⊂B**になる。


#まとめ
**ある試行に基づいて**確率を求めよという意図を汲み取ったならば、独立なので掛け算
**大きなくくりでひとつの試行の中の**確率を求めよという意図を汲み取ったならば、排反で足し算

つまり、試行に基づいて話が進んでいるか否かを見分ければ大丈夫！