OmniAICreator/Qiita-1.07M huggingface dataset:
Autowareによる自動走行/パスプランニング

作成した地図と、走行経路ファイルを使って、車両を走行させてみる。

＜前段＞
地図の作成：https://qiita.com/atsuto/items/f26d63b778a783929ab7
走行経路の作成：https://qiita.com/atsuto/items/03d951143b908c59cef1

※参考
https://faboplatform.github.io/AutowareDocs/04.Autonomous_Drive/00.autoware/
https://qiita.com/k-koh/items/db88bbd6923a668c3164
https://qiita.com/yukkysaito/items/98a39dc4b842d7135ce2
http://4c281b16296b2ab02a4e0b2e3f75446d.cdnext.stream.ne.jp/randc/mirai/3_Autoware_LP.pdf

# 各ファイルの読み込み
参考ページに習って、地図と走行経路を読み込み、Computingの必要項目を稼働させた。

# デバッグ
topicを確認してみると、当初、Twist_cmd.twistがゼロのままだった。
Waypointファイルの速度がゼロになっていたので、10くらいにしてみたが、ここは見てないらしい。

下記コマンドでグラフ化して確認してみた。

```
$ rosrun rqt_graph rqt_graph
```

![rosgraph.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/b086f601-b4fd-1bfc-5c42-5dc452c2322c.png)

![Screen Shot 2021-01-11 at 0.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/9e881f4a-f293-aa34-ceb8-7cda22a7e4a1.png)

うまく出力されていない twist_cmdは、final_waypoins、current_velocity、current_poseから計算されていることが分かる。それぞれの値を見てみるが、どうやらそれっぽい値が飛んでいる。ということで、pure_pursuitの設定値が怪しい。

# 設定値について
https://faboplatform.github.io/AutowareDocs/05.Autoware_parameters/04.computing/
【lattice_velocity_set】
[app]では障害物検出範囲を設定しますが、室内マップだと空間が狭すぎるようなので、[Detection Range]と[Deceleration Range]は小さい値にしておきます。
0とか0.15

【pure_pursuit】
車両制御命令となる、目標速度と目標角速度をROSトピックで配信するときに有効にします。[app]では[Dialog]を選択
[Velocity]はターゲットボールの移動速度として2(km/h)を設定します。
[Lookahead Distance]はターゲットボールまでの距離として1(m)を設定します。
ラジコンではこの比率(2km/h:1m、4km/h:2m、6km/h:3m)がいいようです。

→自分の場合はDialogだとTwist_cmdが出力されなかったので、Waypointにしてみたらうまく出力された。

![Screenshot from 2021-01-09 14-12-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/4f8c110d-d4fd-f92b-37e2-c7d4bdc34675.png)

Twist_cmdが出力されたのが分かる。
角速度は0.38から-0.38
速度は2.6くらいが出ている。

![Screenshot from 2021-01-11 00-09-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/d7b54481-ba4a-adeb-f4ab-89fc639e6203.png)

自分の設定値。

![Screenshot from 2021-01-11 00-09-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80263/96a55085-b102-e4d6-bfdd-1f825ed7d7ef.png)

# アウトプット
ここまでで、車両を動かすのに必要な、下記の値が出力できた。

twist_cmd.twist.linear.x：目標速度(m/s)
twist_cmd.twist.angular.z：目標角速度(rad/s)
EBSについて

SAAに向けて学習中に間違えた内容について調べまとめる記事①。
個人的備忘録。

## EBS
ブロックストレージサービス。EC2にアタッチして利用する。

#### ストレージの違い
* ブロックストレージ
EC２にアタッチして使用。ブロック形式でデータを保存。
高速、広帯域幅。
例：EBS、インスタンスストア

* オブジェクトストレージ
安価かつ、高い耐久性をもつオンラインストレージ。
オブジェクト形式でデータを保存。
デフォルトで複数AZに冗長化されている。
例：S3、Glacier

* ファイルストレージ
複数のEC２インスタンスから同時にアタッチ可能な共有ストレージサービス。
ファイル形式でデータを保存。
例：EFS

#### インスタンスストアとEBSの違い
* インスタンスストア
ホストコンピュータに内蔵されたディスクでEC2と不可分のブロックレベルの物理ストレージ。
EC2の一時的なデータが保持され、EC２の停止・終了とともにデータがクリアされる。
無料。

* EBS
ネットワークで接続されたブロックレベルのストレージでEC2とは独立管理。
EC2を終了してもEBSデータは保持可能。→デフォルトでは削除される設定
snapshotをS3に保持可能。
別途EBS料金が必要。

#### EBSの特徴
* OSやアプリケーションで、データの置き場所など様々な用途で利用される。
* 実態はネットワーク接続型ストレージ
* 99.999%の可用性
* サイズは1GB~16TB
* サイズと利用期間で課金
* ボリュームデータは単一のAZ内で複数HWにデフォルトでレプリケートされており、冗長化不要
* セキュリティグループによる通信制限対象外であり、全てのポートを閉じてもEBS利用可能
* データは永続的に保存
* ひとつのEBSをEC2インスタンスで共有することはできない（プロビジョンドIOPSのみできる）
* 同じAZ内の付け替えは可能

#### EBSのボリュームタイプ

|  |  | ユースケース | サイズ |
| :-- | :-- | :-- | :-- |
| SSD | 汎用SSD | 仮想デスクトップ。低レイテンシーを要求するアプリ。中小規模のデータベース。開発環境 | 1GB~16TB |
| | プロビジョンドIOPS | 高いI/O性能に依存するNOSQLアプリ。10000IOPSや160MB/sのワークロード大規模DB。EBS最適化インスタンスタイプで高速化 | 4GB~16TB |
| HDD | スループット最適化HDD | ビックデータ処理。DWH。大規模なETL処理やログ分析。ルート（ブート）ボリュームには利用不可 | 500GB~16TB |
|| コールドHDD | ログデータなどのアクセス頻度が低いデータ。バックアップやアーカイブ。ルート（ブート）ボリュームには利用不可 | 500GB~16TB |
| マグネティック || 旧世代ボリュームタイプで利用しない。データアクセス頻度が低いワークロード | 1GB~1TB |

#### ミラーリングとは
同じデータを複数のディスクに書き込む（ミラーリング）。信頼性は上がるが、台数を増やしても１台分の容量となるため、効率は悪くなる。

#### RAIDとは
コンピューターの５大機能のうちの記憶の一部を司る、外部記憶装置「ディスク」のこと。（AWSではEBS等のサービスを指す）
主記憶装置に比べるとアクセス速度が遅い。
そのためディスクアクセスを早くすること、また冗長化し、対障害性を高めることを目的とした技術のことをいいます。
レベルがいくつかあり、
RAID0はディスクアクセスを高速化するための技術（ストライピング）であり、
残りの１〜６は対障害性を高めるためのミラーリングを中心とした技術です。

| レベル | 概要 |
| :-- | :-- |
| 0 | データをブロック単位で複数のディスクに分散して記録（ストライピング）する。１台が故障すると全体の故障となるので、信頼性が低下する|
| 1 | 同じデータを複数のディスクに書き込む（ミラーリング）。信頼性は上がるが、台数を増やしても１台分の容量となるため、効率は悪くなる。|
| 3 | データをバイト単位でストライピングし、１台をエラー訂正用のパリティ情報記録用として固定する。パリティ情報からデータを復旧することができる|
| 5 | RAID3からパリティ情報に関してもブロック単位に分散して記録する|

#### スナップショットの特徴
EBSはスナップショットでバックアップする。
スナップショットからEBSを復元する。別AZにも可能。
スナップショットの二世代目以降は増分バックアップ。
スナップショット作成時に圧縮され保管される。その容量に応じて課金される。
スナップショットの作成時は静止点を設けて作成することを推奨している。
世代管理はAWSCLIやAPI等で自動化する
DLMを利用してスナップしょっ値取得をスケジューリングできる。
別リージョンを跨いで利用することもできる（別リージョンにコピーして使用）
別アカウントにも権限を以上することによることでスナップショットを利用可能。

#### AMIとスナップショットの違い
* AMI
ECインスタンスのOS設定などをイメージとして保持して、新規インスタンス設定に転用するもの
* スナップショット
ストレージ・EBSのその時点の断面バックアップとして保持するもの。復元、複製に使用。

## 参考
https://qiita.com/tomiyama0119/items/d70861b4634378d763fb
https://www.udemy.com/course/aws-associate/
FFFTPやWinSCPでファイルがダウンロードできない時の対処方法

#FFFTPやWinSCPでファイルがダウンロードできない時の対処方法
FTPソフト(FFFTPやwinscp)を用いて、ファイルをローカルへダウンロードする際、ファイルのサイズが巨大だとダウンロードするのに相当の時間を要します。こういった時の対応を以下手順でまとめました。

##手順１：FTPソフトで権限を変更する。
ローカルにダウンロードしたい対象ファイルの権限、つまりパーミッションを確認します。対象ファイルを右クリックして、パーミッションを777の状態にします。これでどんなユーザーでも、対象ファイルを取り扱える状態にできました。
##手順２：テラターム(teraterm)でコピーを行う
テラタームを起動してログインしたら、対象ファイルのディレクトリへcdで移動します。
移動したらコピーを行い「cp ファイル名 指定ディレクトリ」を実行すればOKです。FTPソフトではダウンロードに時間がかかりましたが、テラタームからコピーを行えばいとも簡単にファイルをダウンロードできます
Go言語-fmt.Scan

# fmt.Scan
プログラミング基本からGoの理解を文字におこして行こうと思います！

### fmt.Scan
```go
var input string
fmt.Scan(&input)  //❶fmt.scan(&変数名)でコンソールに文字入力
}

//コンソール
Go  //❷文字列を入力→❸変数inputに入力された値Goが代入
```
fmt.Scan(&変数名)を使うとコンソールでの入力ができる
入力された値は変数inputに代入

### 入力の流れ
```go
func main() {
  var input string
fmt.Println("次の単語を入力してください:go") //❶
fmt.Scan(&input)　　　　　　　　　　　　　 //❷
fmt.Printf("%sと入力されました", input)  　//❸

//コンソール
//❶次の単語を入力してください:go 
//❷go(コンソールで入力)　　　　　　　　　　　 
//❸goと入力されました
```
fmt.Scanを使うと入力ができるようになる
Mac VisualStudioCode ターミナル系ショートカットまとめ

# 目的

- 便利そうなVisualStudioCode（以後、VScode）のターミナル系のショートカットをまとめる

# ショートカット

- ターミナルではそこまで複雑な作業はしないためよく使うものだけまとめておく

| 動作 | キー |
| --- | --- |
| ターミナルを開く | 「shift」 + 「control」 + 「@(`)」 |
| ターミナルウインドウを分割する | 「shift」 + 「control」 + 「5」 |
| ターミナルウインドウの幅を変える | 「control」 + 「command」 + 「↑」もしくは「↓」 |
| 分割したターミナルウインドウの幅を変える | 「control」 + 「command」 + 「←」もしくは「→」 |
| 分割したターミナルウインドウ間でアクティブなウインドウを切り替える | 「option」 + 「command」 + 「←」もしくは「→」 |
| 新しいターミナルタブを作成する | 「shift」 + 「control」 + 「^(~)」 |
| ターミナルタブを切り替える | こちらの方法を使って設定→[VisualStudioCode ターミナルタブを切り替えるショートカットを設定する](https://qiita.com/miriwo/items/876daee1eda5465f4f37) |
投稿テスト3(PythonでPosgreSQLを操作)

## 参考ページ
https://qiita.com/kumazo/items/483f47360f8b61a9fbb9

## JSONBの使い方参考ページ
https://blog.serverworks.co.jp/postgres_jsonb_search

## サンプルコード途中

```Python
import psycopg2


# connect postgreSQL
users = 'postgres'
dbnames = 'postgres'
passwords = '123qwe!'
conn = psycopg2.connect(" user=" + users +" dbname=" + dbnames +" password=" + passwords)
conn.autocommit = True

cur = conn.cursor()

cur.execute('SELECT * FROM hoge')

results = cur.fetchall()
for r in results:
    print(r)
```
よく使うシェルコマンド

#シェル基礎知識
##よく使うコマンド
###cat
ファイルの中身を参照する。
###mv
ファイルを移動させる。
###history
コマンドの履歴を一覧として出力する。
###^^ ■ ^ ●
■を●に変換する。
###!pwd
今のディレクトリパスを表示する。
###!!
ひとつ前のコマンドを実行する。
###!$
一つ前の行の最終タブを選択する。
##ls-l
ディレクトリの権限とユーザーを表示する。

##その他の基礎知識
###tab
tabを押下することで、文字の入力を省略できる。
###bash
コマンドを実行する。
###-ltr
昇順に一覧表示する。
【基本情報】基本ソフトウェア

###OSの仕事

ハードウェア⇦⇨システムソフトウェア⇦⇨応用ソフトウェア

システムソフトウェアの中にOSやDBMSが入っている。

基本ソフトウェアはさらに三つに分類。
* 制御プログラム
一般にこのプログラムをカーネルとよび、機能を限定したマイクロカーネルと、機能を網羅したものりシックカーネルが存在。
* 言語処理プログラム（言語プロセッサ）
* サービスプログラム

GUI、、、グラフィカルユーザーインターフェース
API、、、OSは、ハードウェアの利用も含めて自身がもつ各種機能をアプリケーションから呼び出せる仕組みを用意している。このために設けられたインタフェースをAPIと呼ぶ。
APIを利用してアプリケーションが作られることで、次のようなメリットが生まれる。
①開発効率アップ
②操作性の統一
③互換性の確保


###ジョブ管理

利用者から見た仕事の単位がジョブ。
ジョブ管理の流れ
マスタスケジューラが振り分け
⇨リーダが待ち行列に登録
⇨イニシエータがジョブステップに分解
⇨ターミネータが出力待ちに登録
⇨ライタが優先度が高いものから出力

低速な装置とのデータのやりとりを、高速な磁気ディスクを介して行うことで処理効率を高める方法をスプーリングという。

###タスク管理

コンピュータから見た仕事の単位がタスク。
ジョブステップの実行準備が整うことで、タスクが生成される。
（プロセスとも言われる。）

READY、RUN、WAITの三つの状態を遷移する。

CPUの使用権を割り当てるのはディスパッチャ。

タスクスケジューリングの方式

* 到着順方式（ノンプリエンプション）
* 優先順方式（プリエンプション）
* ラウンドロビン方式

マルチプログラミング、、、複数のプログラムを見かけ上同時に実行して見せることで、遊休時間を減らし、CPUの利用効率を高めようとするもの。

割り込み処理、、、実行中のタスクを中断して、別の処理に切り替え、そちらが終わるとまた元のタスクに復帰するという処理。（内部割り込みと外部割り込みがある。）

###実記憶管理

限られた主記憶空間を効率よく使えるようにプログラムに割り当てるのが、実記憶管理の役割。

* 固定区画方式
* 可変区画方式（フラグメンテーションをメモリコンパクションで解決）
* オーバレイ方式（セグメントを必要な時にロード）
* スワッピング方式（優先度が低いプログラムが使っていた主記憶領域の内容を、一旦補助記憶総理に退避させる。）


###再配置可能プログラムとプログラムの４つの性質

* 再配置可能（リロケータブル）
主記憶上のどこに配置しても実行できる。
* 再使用可能（リユーザブル）
再ロードすることなく繰り返し実行できる。
* 再入可能（リエントラント）
複数のタスクから呼び出しても、互いに干渉することなく同時実行できる。
* 再帰的（リカーシブ）
実行中に自分自身を呼び出すことができる。

###仮想記憶管理

主記憶や補助記憶をブラックボックス化して、広大なメモリとして扱えるようにすること。

仮想記憶と実記憶との間にメモリ変換ユニット（MMU）というハードウェアが存在。この仕組みを、動的アドレス変換機構（DAT）と呼ぶ。

#####ページング方式
固定長の領域に区切って管理する。プログラムをページという単位で分割して管理する。

実記憶の容量が少ないと、上記のようにページの置き換えを必要とする頻度が高くなり、システムの処理効率が極端に低下することがある。この現象をスラッシングという。

######ページの置き換えアルゴリズム
* FIFO(First In First Out)方式
* LIFO(Last In First Out)方式
* LRU(Least Recently Used)方式
* LFU(Least Frequently Used)方式

スワッピングはプロセス単位で領域の出し入れを行う。
ページングはページ単位で領域の出し入れを行う。
"A"から"Z"のうちでindex=10のアルファベットはなに？ (Elixir)

# はじめに
- [Elixir](https://elixir-lang.org/) 楽しんでいますか :bangbang::bangbang::bangbang:
- つい先日書いた「[Rails on Tiles（どう書く） (Elixir)](https://qiita.com/torifukukaiou/items/8c684fec556a132efe3f)」の中で工夫した点があったのでそこだけを切り出して書いておきます

# "A"から"Z"のうちでindex=10のアルファベットはなに？

## [Ruby](https://www.ruby-lang.org/ja/)
- まずは[Ruby](https://www.ruby-lang.org/ja/)先輩

```ruby
irb(main):006:0> ('A'..'Z').to_a[10]
=> "K"
```
 
## [Elixir](https://elixir-lang.org/)

```elixir
iex> "A".."Z"
** (ArgumentError) ranges (first..last) expect both sides to be integers, got: "A".."Z"
    (elixir 1.11.2) lib/kernel.ex:3467: Kernel.range/3
    (elixir 1.11.2) expanding macro: Kernel.".."/2
    iex:1: (file)
```

- [Ruby](https://www.ruby-lang.org/ja/)先輩っぽい書き方はコンパイルエラーになりました[^1]

```elixir
iex> ~w(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P",
 "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

iex> ~w(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) |> Enum.at(10)
"K"
```

- :point_up::point_up_tone1::point_up_tone2::point_up_tone3::point_up_tone4::point_up_tone5: は嫌だなと:sweat_smile:
    - [~w](https://hexdocs.pm/elixir/Kernel.html#sigil_w/2)って、なんだろう？　という方はリンク先をご参照ください

### 結論
- これでどうでしょうか :point_down::point_down_tone1::point_down_tone2::point_down_tone3::point_down_tone4::point_down_tone5:  

[^1]: [Range](https://hexdocs.pm/elixir/Range.html#content)は整数が指定されることを期待しています。https://github.com/elixir-lang/elixir/blob/v1.11.3/lib/elixir/lib/range.ex#L57-L66

```elixir
iex> (?A..?Z) |> Enum.at(10) |> (&<<&1>>).() 
"K"

iex> (?A..?Z) |> Enum.at(10) |> (fn c -> <<c>> end).()
"K"
```

- 何でも**pipe operator [|>](https://hexdocs.pm/elixir/Kernel.html#%7C%3E/2)**で書ききってしまいたい症候群です
    - `(&<<&1>>)` と
    - `(fn c -> <<c>> end)`
    - は同じ意味の無名関数です
- もっと簡潔に書けるよ！　ってことをご存知の方いらっしゃいましたら、ぜひ教えてください :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5:  

## 参考
- [String -- Integer code points](https://hexdocs.pm/elixir/String.html#module-integer-code-points)
- `IEx(Elixir's Interactive Shel)`さんに教えてもらったこと

```elixir
iex> i "K"
Term
  "K"
Data type
  BitString
Byte size
  1
Description
  This is a string: a UTF-8 encoded binary. It's printed surrounded by
  "double quotes" because all UTF-8 encoded code points in it are printable.
Raw representation
  <<75>>
Reference modules
  String, :binary
Implemented protocols
  Collectable, IEx.Info, Inspect, List.Chars, String.Chars
```

- `Raw representation`の`<<75>>`でハハーんとなりました :relaxed: 

# Wrapping Up 🎍🎍🎍🎍🎍
- [Elixir](https://elixir-lang.org/)は[公式ドキュメント](https://elixir-lang.org/)を読むのが一番いい
- `IEx(Elixir's Interactive Shel)`さんに聞くのが一番はやい場合もありそう
- Enjoy [Elixir](https://elixir-lang.org/) :bangbang::bangbang::bangbang:
論理削除と物理削除の違い

## 勉強前イメージ

完全にサーバから消すか、戻せる状態で削除するのかの違い・・かと
でも、DBのdelete以外何で削除するんだろう

## 調査

### 論理削除 とは

実際にデータを削除せずに、論理的に削除する方法
論理的とは、テーブルに削除フラグのカラムを追加し、true or falseで削除されているかされていないか管理する方法

例が以下になります。
ユーザID(user_id)とユーザ名(user_name)を管理しており、最後に削除フラグ(delete_flag)のカラムが存在します。
存在するユーザには `delete_flag=false` が記載されていますが、
削除されたユーザには `delete_flag=true` が記載されています。

このように削除フラグで管理することを `論理削除` と呼びます

| user_id | user_name | delete_flag |
|:-:|:-:|:-:|
| 1  | kimura  | false  |
| 2  | suzuki  | true  |
| 3  | sato  | true  |
| 4  | matsui  | false  |

- メリット
	- 誤って削除した場合に簡単に戻せる(システムでのバグも同様)

- デメリット
	- 実際にデータが削除されず、容量の圧迫や性能低下につながる
	- 管理するカラムを追加する必要がある
	- ゴミが残る
	
### 物理削除 とは

実際にデータベースからデータを削除する方法で、DBから `delete` コマンドで削除を行う
論理削除とは違い、実際にデータベースからデータが削除されます

- メリット
	- ゴミが残らず、管理がしやすい
	- 管理するカラムがないので、実装のときにバグが出にくい
- デメリット
	- 誤って削除した場合にはデータの復元が容易ではない(バックアップから戻したり等しないといけない)

## 勉強後イメージ

実際に使ってたけど、論理削除・物理削除って言うのを知らなかった・・・
何でもかんでも論理削除してたらゴミがすごいことになっちゃうかも

## 参考

- [物理削除 と 論理削除 について](https://www.itd-blog.jp/entry/data-delete-1)
- [1分でわかる論理削除 -メリットとデメリットを考える-](https://qiita.com/wanko5296/items/f1af9c7bf020e867c2dd)
- [論理削除と物理削除とは](https://qiita.com/jonson29/items/4743409eda08fcdf5410)
- [データベースの論理削除と物理削除](https://blog.webcreativepark.net/2008/05/26-103152.html)
CLIP STUDIO PAINTでよく使う色とかをグルーピングしておけるカラーセット

#自分のオリジナルカラーセット登録！

**ウィンドウ** メニューの **カラーセット** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5e3b4321-7412-e347-47fd-d29a1a280e92.png)

表示の仕方はお好みで。
あたいの場合はコメントも付けられるリスト形式にしてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/920e65a9-3621-4a5c-e461-2d3548089148.png)

**カラーセットの編集ボタン**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/02674f5e-dfe6-0a8f-9788-1baa1b13508d.png)

**新規設定を追加** で **OK** 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6b56dc92-330c-7569-2fda-467a75fa562b.png)
ボタンの文言が機能そのままなので、あんまり難しくないどす。
ただし、**削除** は実行前の確認ダイアログ出ないから注意！

右下に **変更** **追加** **削除** ボタン付いているから好きなように色のリストを作っていけばよし！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ecb498c2-326d-0318-df72-fd497f9a73a8.png)

#蛇足

CLIP STUDIO PAINT の設定をクラウドに保存できるサービスあるみたいだから、今度やりかた覚えよう。

#バージョン
Windows10 Home バージョン20H2 OSビルド19042.685
CLIP STUDIO PAINT PRO （64ビット） 1.10.6 202012211752
【Unity初心者必見】Toggle(Group)のOnValueChangedでハマった話

##初めに
ToggleのOn/Offの切り替え時にメソッドを呼び出したいとき、OnValueChangedにメソッドをAddListenerすることが多いと思う。
これと同じように、複数のToggleをToggleGroupで管理してOn/Offの切り替え時にメソッドを呼び出そうとした時、微妙な挙動の違いでメソッドが複数回呼び出されてハマったのでメモしておく。

###環境
Unity：2019.1.5f1

##起こったこと
設定は以下のスクショの通り。
Toggle3つ（A,B,C）をToggleGroupで管理し、どれか一つのみにチェックが入るようになっている。
![スクリーンショット 2021-01-10 22.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/7745bf8e-7ff5-66a9-e5a6-3f08e2590daf.png)

ToggleGroupには以下のコードをアタッチ

```ToggleController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;

public class ToggleController : MonoBehaviour
{
    public void Change()
    {
        Toggle activeToggle = this.gameObject.GetComponent<ToggleGroup>().ActiveToggles().First();
        Debug.Log(activeToggle.name);
    }
}
```

各ToggleのOnValueChangedにChangeメソッドをインスペクタからアタッチする。
すると、次のような挙動をする。
![画面収録-2021-01-10-23.05.17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/62daeafe-af0a-31ab-ed87-57d4ef24ad77.gif)
メソッドが2回呼び出されているようだ。
これは、例えばB→AとToggleを切り替える時
BがOffになる時のOnValueChangedとAがOnになる時のOnValueChangedが両方動いてしまうことが原因である。
つまりOnValueChangedはチェックマーク（isOn）がついた時ではなくToggleの状態が変わった時に発火するようだ。

##対処法
コードを次のように修正した。
なお、特に大差はないがスクリプトからメソッドをAddListenerした。

```ToggleController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;

public class ToggleController : MonoBehaviour
{
    public ToggleGroup toggleGroup;

    private void Start()
    {
        var toggles = toggleGroup.gameObject.GetComponentsInChildren<Transform>();
        foreach (var toggle in toggles)
        {
            if (toggle.GetComponent<Toggle>() != null)
            {
                toggle.GetComponent<Toggle>().onValueChanged.AddListener(Change);
            }
        }
    }

    public void Change(bool state)
    {
        if (state)
        {
            Toggle activeToggle = this.gameObject.GetComponent<ToggleGroup>().ActiveToggles().First();
            Debug.Log(activeToggle.name);
        }
    }
}
```

変更点はChangeメソッドに引数を持たせたことである。
実際はこのメソッドは２回呼び出されているのだが、引数のstateでToggleにチェックが入っているかどうかを判断しているため、中の処理が行われるのは１回になる。

すると次のような挙動になる。
![画面収録-2021-01-10-22.54.51.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712635/361b47d2-e4e6-2a19-b687-eaf2cbed80af.gif)

##まとめ
- ToggleGroupのToggleのOnValueChangedを使うときは、処理が重複しないよう注意が必要
- やりたい処理に応じて２つの挙動を使い分けることが大事
- Toggleにはあまり複雑な処理を持たせない方が良い気もする
- 頑張ればButtonでもできる

##最後に
ここまで読んでいただきありがとうございました。
投稿者はまだまだUnity初心者のため、アドバイスやコメント等あればお待ちしております。
この記事が何かのお役に立てれば幸いです。
UILabelで複数行表示させるには

iOSアプリを開発し始めた上で、知らなかったがために苦戦したので、忘れないように備忘録を残す。

## TL;DR
`numberOfLines` を `0` にする。（それだけ）

## やってみる
### UILabelを設置
Labelを表示させる簡単なアプリを作る。
storyboardでUILabelを配置して、詳細はコードで書く。

```swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var testLabel: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

        setupLabel()
    }
    
    func setupLabel() {
        testLabel.text = "ラベルだよ"
        testLabel.backgroundColor = UIColor(red: 0, green: 0, blue: 1, alpha: 0.3)
    }


}
```
（UILabelそのものが見やすいように薄く背景色をつける）

こんな感じ。
![ラベル置いただけ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510945/a662ae7c-426b-f90d-639f-458a01814cbd.png)

### 長い文章にしてみる
Labelに表示させる文章を1行以上になるようにしてみる。
このLabelのままだと、明らかに高さが足りないので、十分な高さにしておく。

コードを少し手直し。

```swift

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var testLabel: UILabel!
    /// 高さを調整するためにConstraintを追加
    @IBOutlet weak var testLabelHeight: NSLayoutConstraint!
    

    override func viewDidLoad() {
        super.viewDidLoad()

        setupLabel()
    }
    
    func setupLabel() {
        testLabel.text = "とっても長い文章になるよ。とっても長い文章になるよ。とっても長い文章になるよ。とっても長い文章になるよ。"
        testLabel.backgroundColor = UIColor(red: 0, green: 0, blue: 1, alpha: 0.3)
        
        /// 複数行表示させるため
        testLabelHeight.constant = 80
    }


}
```

それが、こう。
![ラベル伸ばす.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510945/4ee7c571-197d-3e16-d0bb-46d29cdbee72.png)

**えぇ...**
いい感じに省略してくれてる...

### 行数を設定する項目があった
高さをどんなにしても、きっちり1行に収めてくれる。
泣きながら調べてみると、 `行数` を設定できることがわかった。

先ほどの `setupLabel()` に、これを追加する。

```swift

/// 行数調整
testLabel.numberOfLines = 0
```

そうすると、晴れて目的通りになる。
![ラベル完成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510945/678665e6-316c-0129-198d-6a49c9999a46.png)


## まとめ
デフォルトでは行数は `1` になっているので、指定した行数にしたければ、その数値を入れ込む。
何行になってもいいから、全て表示させるには `0` を入れ込めば良い。

(てっきり全部表示してくれるもんだと思い込んでいたので、とにかく不思議でした...)


***
ちなみに、storyboard上でもこの項目の設定はある。
![storyboard項目.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510945/2a8c2ad2-2ab9-d948-73d2-bb62fd0f2365.png)
自己相関係数を視覚的に理解する

# はじめに
この記事では、私が自己相関係数および自己共分散を視覚的に理解した方法を紹介します。

時系列データ分析を勉強している際に、始めは自己相関係数の式がいまいち理解できず図を描いて考えてみたところ理解が捗ったので、その図を使って説明していきます。

## 自己相関係数の定義
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400927/0f2789d2-f5f3-204c-626f-fffdaa9cf2d4.png)

### 分子

分子は、**<i>i**時点の確率変数**<i>x_i**と、**<i>h**時点だけずらした**<i>i+h**時点の確率変数**<i>x_{i+h}**の共分散、つまり自己共分散です。

右辺において、「なぜ**<i>n-h**が出てくるんだろう？」というのが当初の私の疑問点でした。

### 分母

分母は、**<i>i**時点の確率変数**<i>x_i**の標準偏差と、**<i>h**時点だけずらした**<i>i+h**時点の確率変数**<i>x_{i+h}**の標準偏差の積です。

どうやら自己標準偏差という言葉は存在しないらしく、右辺は通常の確率変数**<i>x_i**の分散となっています。

**<i>h**時点ずらして乗算を行っているのに、「なぜラグの影響が分母に反映されていないんだろう？」というのが私の当初の疑問でした。

## 視覚的に説明

ここでは、サンプル数として```n=6```、ラグとして```h=1```のデータを使って説明を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400927/2446cd47-e291-c967-49f6-791ccdf2567c.png)

### 分子

自己相関係数の**分子**となっている自己共分散を考える際には、図中の<font color="DodgerBlue">青色</font>に注目します。

確率変数**<i>x_i**を**<i>h**時点ずらしてみると、**<i>x_i**と**<i>x_{i+h}**が重なるのは**<i>i=1**から**<i>i=<font color="DodgerBlue">n-h</font>の間（※1）の**<font color="DodgerBlue">**<i>n-h**</font>個（※2）のデータとなります。

※1. この範囲でΣによって総和を取得する
※2. データの個数で割り算する

### 分母

自己相関係数の**分母**となっている分散を考える際には、図中の<font color="Red">赤色</font>に注目します。

実は、確率変数**<i>x_i**も確率変数**<i>x_{i+h}**もデータの値と個数が変わっていないため、両確率変数の標準偏差の積は、<font color="Red">確率変数**<i>x_i**の分散</font>と等しい（確率変数**<i>x_{i+h}**の分散とも等しい）。

## 書籍が間違っているのか？？
[現場ですぐ使える時系列データ分析～データサイエンティストのための基礎知識～](https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E3%81%99%E3%81%90%E4%BD%BF%E3%81%88%E3%82%8B%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E6%A8%AA%E5%86%85-%E5%A4%A7%E4%BB%8B/dp/4774163015/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)を読んでいるのですが、「自己相関係数の分子となる自己共分散って総和**<i>Σ**に対して**<i>1/n**じゃなくて**<i>1/(n-h)**が乗算されてないと間違っていないか？？」と思っています。

[統計学入門 (基礎統計学Ⅰ)](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E7%B5%B1%E8%A8%88%E5%AD%A6%E2%85%A0-%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E6%95%99%E9%A4%8A%E5%AD%A6%E9%83%A8%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%95%99%E5%AE%A4/dp/4130420658)を読んでみたら**<i>1/(n-h)**が乗算されていたので、こっちの本に合わせて理解するようにしました。

## 最後に
分からないことがあれば図で考えてみると理解が進むのは、どんな事柄でも共通のようです。

記事に対して指摘事項等がございましたら、Qiitaコメント欄でもTwitter[@kazukiigeta](https://twitter.com/kazukiigeta)でも、ご連絡をいただけると嬉しいです。
VSCode+DockerでPlantUMLの環境を構築する

## 背景
最近、仕事していてguiの作図ツールでシーケンスを書くのがそろそろ辛くなってきたよね、という話になり、PlantUMLでコード化することになりました。その際に、環境構築がスムーズにいく人といかない人がいたのでdockerでお手軽に環境構築できないかなと思い調べてみました。
記事内で書いたファイルなどは、[Github](https://github.com/odayushin/plantuml_work.git)で公開しています。

## 前提
前提となるマシンの環境です

- dockerが使える
- docker-composeが使える
- VSCodeがinstallされている

## やること
PlantUML ServerのDockerイメージが公開されていましたのでそちらを利用します。
VSCodeの拡張機能の設定でlocalに起動したPlantUML Serverを使ってレンダリングするように変更します。

### 1. docker-compose.ymlを作成
毎回ポートを指定して```docker run```するのが面倒なのと、後処理も簡単に済ませられるようにしたいのでdocker-composeで起動、終了できるようにします。
適当なディレクトリを作成し、以下の`docker-compose.yml`ファイルを置いてください。

```yml:docker-compose.yml
version: '3'
services:
  plantuml-server:
    image: plantuml/plantuml-server
    container_name: plantuml-local-server
    ports:
      - "8080:8080"
```

### 2. VSCodeの設定
- 拡張機能`PlantUML`をインストール
- インストールしたPlantUMLの`Extension settings`から以下を設定
  - Plantuml:Render -> PlantUML Server
  - Plantuml:Server -> http://localhost:8080

設定は以上です。

## 使い方
plantumlで図を書きたい時に、`docker-compose.yml`を置いたディレクトリに移動してから以下のようにplantuml-serverを起動します。

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

VSCodeでpuファイルを作成します。ファイルの場所は任意。

```:sample.pu
@startuml sample
alice -> Bob: Hello, Bob!
alice <-- Bob: Hello, Alice!
@enduml
```
VSCodeのcommand paletteを開き(windowsならctrl+shift+p macならcommand+shift+p)、
`PlantUML: Preview Current Diagram`を選択するとプレビューが表示されます。そのままファイルを編集するとプレビューも更新されます。

終了する時は、

```
$ docker-compose down
```
でOKです。

### 追記(2022/1/24)

以下の内容を`.vscode/tasks.json`に書いておくと、vscodeでプロジェクトを開いたときに自動で`docker-compose up`してくれます。

```json:tasks.json
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Launch PlantUML Server",
      "type": "shell",
      "command": "docker-compose",
      "args": ["up", "-d"],
      "group": "none",
      "presentation": {
        "reveal": "always",
        "panel": "new"
      },
      "runOptions": {
        "runOn": "folderOpen"
      }
    }
  ]
}
```

## 参考情報
[UMLの爆速プレビュー環境をVisual Studio Code + PlantUML Server on Dockerで簡単に構築する](https://dev.classmethod.jp/articles/plantuml-server-on-docker/)
pyenv + conda の環境構築メモ

# はじめに
anacondaを直接インストールすると，Homebrewと衝突してしまうらしいので，pyenv + condaでanaconda環境を構築しました．

# インストール方法(pyenvインストール済みの状態)
インストール可能なanacondaの検索

```python
pyenv install -l | grep anaconda
```

インストール

```python
pyenv install anaconda3-2020.07
```

# condaによる仮想環境の作り方
anacondaをglobalに切り替え

```python
pyenv global anaconda3-2020.07
```

仮想環境の作成

```python
conda create -n [仮想環境名] python=[pythonのバージョン] [installしたいライブラリ] [installしたいライブラリ] ...
```

作業用のディレクトリでのみ作成した仮想環境を有効化

```python
mkdir test_conda
cd test_conda
# ディレクトリ内に.python-versionという隠しファイルが生成される．
pyenv local anaconda3-2020.07/envs/[仮想環境名]
pyenv versions # 有効下されている仮想環境を確認
pyenv global system # systemをglobalに戻す
# ディレクトリを抜けて, "pyenv versions"を実行すると、globalで有効化された環境に戻っている
```

作成した仮想環境をactivateで起動（フルパス指定）

```python
conda activate [仮想環境名]

# sourceで直接ファイルを実行してもおけ
source $PYENV_ROOT/versions/anaconda3-2020.07/bin/activate [仮想環境名]
```

起動中の仮想環境の停止

```python

conda deactivate
```

# その他のコマンド
有効化されている仮想環境の確認（一覧で表示）

```python
pyenv versions
```

ライブラリのインストール（installしたpythonのversionに対応したライブラリをインストールしてくれる）

```python
conda install [ライブラリ名]
```

インストール済みのライブラリの表示

```python

conda list
```

仮想環境の削除

```python

conda remove -n [仮想環境名] --all
```

指定したライブラリに対応するpythonのversion確認

```python

conda search [ライブラリ名]
```


# 参考
* https://qiita.com/Toyoizumi-Hiroyuki/items/a03305f290aa04e1b2f5
* https://qiita.com/ozaki_physics/items/985188feb92570e5b82d
Prism.WPFのIDialogService.ShowDialogで画面のセンターに表示させる

#環境
Visual Studio 2019
Prism 8.0.0.1909
.NET5

#問題
アプリを起動するときにログインフォームを開くということがあると思います。
このログインフォームをIDialogService.ShowDialogを利用して表示させようとしましたが、オーナーウィンドウから呼び出すと、.Net Framework 4.8 の時はオーナーウィンドウが先に表示されて、それからダイアログが表示されていました。
ところが、.NET5にしたところ、オーナーウィンドウが表示されず、先にダイアログが表示されるようになっていました。
すると、ダイアログが適当な位置に表示されてしまい、画面の中央に表示するということができなくなってしまいました。

```C#
dialogService.ShowDialog(PageKeys.Login, new DialogParameters { { "Login", inputValue } }, result => dialogResult = result);
```
![スクリーンショット 2021-01-11 002128.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/c03a3ab4-edb1-2cbd-a500-0f1c2fb00fcb.png)
よく見ると、オーナーウィンドウはあるようなのですが、透明でまだ表示されていなくて、ダイアログはそれに合わせて中央に表示というようにできないみたいでした。

#解決
いろいろと調べていたところ、[PrismLibraryに解決方法が書かれていました](https://prismlibrary.com/docs/wpf/dialog-service.html)
Style the DialogWindow
You can control the properties of the DialogWindow by using a style via an attatched property on the Dialog UserControl

```C#
<prism:Dialog.WindowStyle>
    <Style TargetType="Window">
        <Setter Property="prism:Dialog.WindowStartupLocation" Value="CenterScreen" />
        <Setter Property="ResizeMode" Value="NoResize"/>
        <Setter Property="ShowInTaskbar" Value="False"/>
        <Setter Property="SizeToContent" Value="WidthAndHeight"/>
    </Style>
</prism:Dialog.WindowStyle>
```
いろいろ知らないことがあります(~_~;)
AppleScript　キーボードの配列の設定を自動的に変更するスクリプト

# Automatorにキーボード設定をやってもらう

外付けのキーボードがdefaultのキーボードと配列が異なるので、キーボード設定を変える必要がありました。何度も手動でやるのが面倒だったので、ショートカットで自動にできるようにスクリプトを作りました。

本当は、外付けキーボードがつながったときに、自動で切り替わるといいんですが、その設定方法がよくわからなかったので。

## JIS配列へ

```applescript
tell application "System Preferences" to quit

tell application "System Preferences"
	activate
	set current pane to pane "com.apple.preference.keyboard"
	delay 0.4
end tell
tell application "System Events"
	tell process "System Preferences"
		tell tab group 1 of window "キーボード"
			click button "キーボードの種類を変更…"
			delay 0.4
		end tell
	end tell
	tell window "キーボード設定アシスタント" of process "KeyboardSetupAssistant"
		click button "続ける"
		tell application "System Events" to keystroke "z" using command down
		delay 0.4
		click button "スキップ" of sheet 1
		delay 0.4
		tell radio group 1 of group 1
			click radio button "JIS（日本語）"
		end tell
		click button "完了"
	end tell
end tell

tell application "System Preferences" to quit
```


## US配列へ

```applescript
tell application "System Preferences"
	activate
	set current pane to pane "com.apple.preference.keyboard"
	delay 0.4
end tell
tell application "System Events"
	tell process "System Preferences"
		tell tab group 1 of window "キーボード"
			click button "キーボードの種類を変更…"
			delay 0.4
		end tell
	end tell
	tell window "キーボード設定アシスタント" of process "KeyboardSetupAssistant"
		click button "続ける"
		tell application "System Events" to keystroke "z"
		delay 0.4
		click button "スキップ" of sheet 1
		delay 0.4
		tell radio group 1 of group 1
			click radio button "ANSI（米国その他）"
		end tell
		click button "完了"
	end tell
end tell

tell application "System Preferences" to quit
```
Effective Python 学習備忘録 9日目 【9/100】

# はじめに
Twitterで一時期流行していた 100 Days Of Code なるものを先日知りました。本記事は、初学者である私が100日の学習を通してどの程度成長できるか記録を残すこと、アウトプットすることを目的とします。誤っている点、読みにくい点多々あると思います。ご指摘いただけると幸いです！

# 今回学習する教材

- [Effective Python](https://www.amazon.co.jp/Effective-Python-%E2%80%95Python%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E6%94%B9%E8%89%AF%E3%81%99%E3%82%8B59%E9%A0%85%E7%9B%AE-Brett-Slatkin/dp/4873117569/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=Effective+python&qid=1609408832&sr=8-3)
    - 8章構成
    - 本章216ページ

# 今日の進捗

- 進行状況：69-73ページ
- 第3章：クラスと継承
- 本日学んだことの中で、よく忘れるところ、知らなかったところを書いていきます。


## 親クラスをsuperを使って初期化する

子クラスから親クラスを初期化する方法

- `__init__`メソッドを用いた初期化
  - 問題点
- superを用いた初期化

### `__init__`メソッドを用いた初期化

```python
# 親クラス
class MyBaseClass(object):
   def __init__(self, value):
       self.value = value

# 子クラス
class MyChildClass(MyBaseClass):
    def __init__(self):
        MyBaseClass.__init__(self, 5)    # 親クラスの__init__メソッドを呼びだし初期化
```

#### `__init__`メソッドを用いた初期化の問題点

この方式は、単純な階層では問題なく動作しますが、多重継承によって、影響を受けている状態でスーパークラスの`__init__`メソッドを直接呼び出すと、おかしな振る舞いを起こす場合があります。特に、ダイヤモンド継承の際に、予期せぬ振る舞いを起こします。
ダイヤモンド継承とは、サブクラスが2つの別々のクラスから継承し、かつその2つが継承改装で同じスーパークラスを持っていることを指します。例えば、MyBaseClassを継承する2つの子クラスとそれらを継承する子クラスを次のように定義します。

```python
# 親クラス
class MyBaseClass(object):
   def __init__(self, value):
       self.value = value

# 親クラスを継承する子クラス1
class TimesFive(MyBaseClass):
    def __init__(self, value):
        MyBaseClass.__init__(self, value)
        self.value *= 5

# 親クラスを継承する子クラス2
class PlusTwo(MyBaseClass):
    def __init__(self, value):
        MyBaseClass.__init__(self, value)
        self.value += 2

# 2つのクラスを継承する子クラス定義し、MyBaseClassをダイヤモンドの頂点に
class ThisWay(TimesFive, PlusTwo):
    def __init__(self, value):
        TimesFive.__init__(self, value)
        PlusTwo.__init__(self, value)

foo = ThisWay(5)
print('Should be ( 5 * 5) + 2 = 27 but is', foo.value)
```

出力結果

```
Should be ( 5 * 5) + 2 = 27 but is 7
```

出力は、ThisWayの引数5がTimesFiveで5倍され、PlusTwoで2を加算し、27になるはずですが、7になっています。この原因は、PlusTwo.__init__の呼び出しで、MyBaseClass.__init__が2回目に呼び出されたところで5にリセットされるためです。Python3ではsuperを使うことでこの問題を解決することができます。また、**Python3では常にsuperを使うべきです。**

### superを用いた初期化

```python
class Explicit(MyBaseClass):
    def __init__(self, value):
        super(__class__, self).__init__(value * 2)

class Implicit(MyBaseClass):
    def __init__(self, value):
        super().__init__(value * 2)

print('Explicit', Explicit(10).value)
print('Implicit', Implicit(10).value)
```

出力結果

```
Explicit 20
Implicit 20
```

# まとめ

- Pythonの標準メソッド解決順序は、スーパークラスの初期化順序とダイヤモンド継承の問題を解決する
- 親クラスを初期化するには、常に組み込み関数superを使う
ECMAScript まとまってないんだなって悲しさ

ECMAScript 2015 (ECMAScript 6) というよりは
ECMAScript 6 (ECMAScript 2015) のほうが、しっくりくるんですが、
名付けされた経緯になぞれば、しっくりこない方が、しっくりするらしい。

6 に 2015 と付ける時点でセンスをまったく感じん。

ECMAScript 2015 (ECMAScript 6) は 
Internet Explorer 11 では実装される未来がないので、
変換的なことをする強い意志がない場合は、諦めたげよう。

国内では根強いというか、主要と考えたほうが良いんじゃないかと。

Browser Market Share Japan
Browser Market Share in Japan - December 2020

https://gs.statcounter.com/browser-market-share/all/japan/#monthly-201912-202012-bar


ECMAScript 6 compatibility table
https://kangax.github.io/compat-table/es6/


let とか const くらいは、だいたい使えそうらしいけど、不完全な様子。


ECMAScript 2015 は趣味でゆるゆるとかじっていこう。
【メモ】【自分用】Gitコマンド

### よく使うGitコマンドのメモ書き

## git clone
リモートリポジトリからローカルにcloneする

    git clone "https://github.com/XXXX/XXXX"


## git status
・赤文字：ローカルの作業ファイルと、ステージングエリアの変更有
・緑文字：ステージングエリアとローカルリポジトリの変更有

    git clone "https://github.com/XXXX/XXXX"

## git add
変更を加えた作業フォルダを全てステージングエリアに追加

    git add .

変更を加えた作業フォルダを指定してステージングエリアに追加

    git add "作業ファイル名"


## git commit
ステージングエリアからローカルリポジトリにコミット

    git commit -v
---
```ruby:コミット時補足
'i'   : 入力モード切替
'esc' : コマンドモード切替
':wq' : 保存して終了
':q!' : 保存せず終了
```
## git push 
ローカルリポジトリからリモートリポジトリへの反映

    git push origin 'ブランチ名'

# 追記
## git rm
ステージングエリアのファイル削除

```
git revert HEAD
```

## git restore
add前の変更を削除

```
git restore 'ファイル名'
```
## git branch
現在のブランチの確認

```
git branch
```
## git revert
直前のコミット取消

```
git revert HEAD
```
## git log
コミットログの表示
--oneline ：コミットログを1行で表示

```
git log 
git log --oneline 
```
読書所感メモー「リファクタリング（新装版）」

# はじめに

**ほぼ個人的な読書メモになります**

「リファクタリング」 Martin Fowler著 児玉公信ほか訳

[目次（外部リンク）](https://www.ohmsha.co.jp/book/9784274050190/)

大まかに以下の流れで展開される

- 概論
- 不吉な臭い（リファクタリングされるべきコードの特徴）
- リファクタリングカタログ（小さいもの -> 大きいものの順）
- 実際にリファクタリングをするにあたって

# わかったこと

### リファクタリングについて

オブジェクト指向のリファクタリングについて知見が深まった。

私は何でもかんでも細かくクラス化すればリファクタリングになると思っていた（手続き型の長ったらしいコードが悪だと思っていたし、実際それは正しい）。他、一時変数のインライン化や仲介人の除去など、私が持っていたイメージとは逆のことも、その逆（＝私にイメージするリファクタリング）と同じ粒度で記述されていた。
とりわけ、今回、クラスを統合するなど**クラス化しない**という選択肢がある、と知った。
ちょうど本書の後半に差し掛かったタイミングで、私が関わっているソフトウェア開発リファクタリングを行う場面が訪れた。そこで、JavaのCollectionをクラス化してカプセル化する設計を思いついた。しかしこの変更はレビュワーにリジェクトされてしまった。
ポイントは2つ

- そのクラスは全くCollectionのメソッドを委譲している（されている？）だけだった
- 現代のJavaにおいてCollectionは高機能で、ラップされる必要性は低い

まさに「クラス化しない」場面に出会ったわけである。本書を読んでいたタイミングと重なって、非常に印象的な体験になった。


GoFパターンについて学んだ直後であったので、その知識が理解を促進した（特にState/Strategy pattern）
だが実際にやってみルナら難しそうだと思った（他のリファクタもそうだが...）

### その他について

書かれた当時の筆者らを取り巻く情勢も知れた。またオブジェクト指向が研究室レベルだった頃は興味深い。

リファクタリングは可能なところまで行って、コードが壊れてしまうようになれば（頑張ればできそうでも）無理せずそこで止める、というのも新しい

テストがないと始まらない。テスト大事

リファクタリングを敬遠すると、リファクタリングを行った場合よりも損をする場合が多い

最近だとリファクタリングツールが高機能化しているので、簡単なリファクタリングは秒でできそう。確かにシグネチャの変更などは日常的に行っており、IDE任せですぐ簡単にできる、例外もあるようだが、Kotlinは強く型付けされているのでまだその例に出会ったことはない。

# わからなかったこと

- 自己カプセル化はリファクタリング中にだけ行われるもので、リファクタリングの終了に伴って除去されるもの？自己カプセル化を残しておくメリットは何か？
- 表明（assert）は今でも普通に使われている？例外に取って代わられそうだと思った。
PHP基礎　-繰り返し処理をマスターする-

#頻出の構文
繰り返し処理をする上では上の3つの構文を使うことがほとんどです。

##while
カッコ内の条件がtrueである限り処理を繰り返します。

何らかの条件でループを脱出する用途に使います。

```php
$i = 1; #初期値の定義

while($i <= 10) { #$iが10以下ならtrue
  echo $i; 
  $i++ #$iの再代入
}
```

カッコ内では繰り返しの条件のみを設定して、初期値の設定と再代入は外で行います。

再代入を忘れると処理がエンドレスでループされてしまうので注意が必要です。

##for
whileと同じく、カッコ内の条件がtrueである限り処理を繰り返しますが、カッコ内で初期値の設定と再代入をまとめて記述します。

```php
for($i = 1; $i <= 10; i++) {
  echo $i;
}
```

##foreach
foreachは配列に対して使う繰り返し文で、配列の中身を順に取り出して処理することができます。

```php
$array = [1, 2, 3];

foreach($arrray as $val){
  echo $val;
}

以下のように記述することで、連想配列のキーと値を両方取得することができます。

```php
$user = ['name' => 'zeisho', 'password' => 'foobar'];

foreach($user as $key =>$val){
  echo $key, $val;
}
```

#その他の構文
##do - while
条件のチェックが最後に実行されること以外はwhile文と同じです。

```php
$i = 1;

do {
  echo $i;
  $i++;
}while(i < 10);
```
Wall-e project (ジョニー ファイブの復元)ー駆動部 #4

# お久しぶりの更新です。

# 機体を変えました。アマゾンから注文ができます。
[タミヤ 楽しい工作シリーズ No.227 カムプログラムロボット 工作セット 70227](https://www.amazon.co.jp/%E3%82%BF%E3%83%9F%E3%83%A4-%E6%A5%BD%E3%81%97%E3%81%84%E5%B7%A5%E4%BD%9C%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-No-227-%E3%82%AB%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88-%E5%B7%A5%E4%BD%9C%E3%82%BB%E3%83%83%E3%83%88/dp/B073S47B11/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=tamiya+robot&qid=1610286455&sr=8-1)

# これです。
![71W0nGDiegL._AC_SL1500_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73662/831733e9-58ec-d2c6-3fbd-fef40b498ae5.jpeg)

# 上から
![67497348-D670-4618-A8CE-0E169918AEF6_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73662/500cd614-d9db-66c3-a5f9-248992e1b830.jpeg)

# 前面から
![9661C590-0C97-486A-BB4D-F7E97D3E5021_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73662/38ac3d5c-5669-008e-5975-ab907dcf9100.jpeg)

# 裏面から
![A2CD7961-2355-4E40-805D-62041409F1CC_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73662/a8ee5ab6-9463-246b-2a2d-7a4f3d5b6500.jpeg)
Excel方眼紙でグラフから値を拾いやすくする

##1. はじめに
エンジニアはグラフから値を読み取る機会が何かとあることと思います。
そんな時Excel方眼紙を活用すると値を拾いやすくなります。

##2. サンプル
2SC1815の静特性のグラフに赤い線で負荷線を引いたものです。
負荷線とグラフの交点のコレクタ・エミッタ間電圧、コレクタ電流の値をグラフから読み取ります。
![fig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/9a7fa432-b1fe-bafe-21f4-5f7eefbd362d.png "fig.1")

##3. 手順
1. Excel方眼紙をセルの幅、高さとも20ピクセルで作成する
2. データシートのスクリーンショットをAlt+Print Screenで撮る
3. ペイントにペーストし必要なところを選択してコピーする
4. Excel方眼紙に「形式を選択して貼り付け(S)...→ビットマップ」でペーストする
5. Excelの図の形式タブを開き「色→透明色を指定」で背景の白い部分を透明にする
6. グラフのマス目とExcel 方眼紙のマス目が合うように縦横を調整する
7. 必要に応じてグラフに線を引く（例：負荷線を引く、など）
8. 図形の直線と円で十字のカーソルを作り、交点に合わせる
9. カーソルの直線をX軸、Y軸まで伸ばして値を読む

手順7で線を引く際、Excelの "グリッドに合わせる" 機能を活用すると目盛りに合わせやすくなります。

##4. 例
Excel方眼紙の1マスとカーソルの20ピクセル移動が対応します。目分量、あるいは精確を期すなら方眼紙の目盛りとカーソルの移動量から読み取ります。

I<sub>B</sub>=0.5mAのグラフと負荷線の交点はX軸が1.85[V]、Y軸が63[mA]と読み取れます。
![fig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221758/ab9a7f2e-2f36-a8c3-2266-43fe85648e7f.png "fig.2")

##5. おわりに
Excelには日ごろ何かとお世話になっていますが画像の加工もできて便利ですね。カーソルと背景の方眼紙のおかげで値が読み取りやすくなりExcel様様です。
不適切な校則撤廃に向けた署名のお願い

私は私立高校に通っているのですが、ブラの色は白しかだめという校則があります。週に一度抜き打ちで下着チェックといって生活指導の先生に下着を見せないといけません.それがすごく嫌で不登校になった生徒もいますわたしはこの理不尽な校則をなくしたいので、署名を集めています。皆さんの力を貸してください！！!
###[こちらから署名お願いします](https://akira1208.xyz/signature)
Pythonで学ぶアルゴリズム　第17弾：並べ替え（バブルソート）

# #Pythonで学ぶアルゴリズム< バブルソート >

##はじめに
基本的なアルゴリズムをPythonで実装し，アルゴリズムの理解を深める．
その第17弾として挿入ソートを扱う．

##バブルソート
一般に交換ソートいうとバブルソートを指す．
リストの隣り合ったデータを比較して，大小の順序が違っているときは並べていく．そのイメージ図を次に示す．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/9703c3ac-85f6-225c-1c8c-8da7d81b4118.png)


##実装
先ほどの手順に従ったプログラムのコードとそのときの出力を以下に示す．

#####コード

```python:bubble_sort.py
"""
2021/01/10
@Yuya Shimizu

バブルソート
"""

def bubble_sort(data):
    """バブルソート：前から2つずつデータを比較し並べ替える．"""   
    for i in range(len(data)):
        for j in range(len(data) - i -1):
            if data[j] > data[j+1]: #左の方が大きい場合
                data[j], data[j+1] = data[j+1], data[j] #前後入れ替え
                
    return data

if __name__ == '__main__':
    DATA = [6, 15, 4, 2, 8, 5, 11, 9, 7, 13]
    sorted_data = bubble_sort(DATA.copy())

    print(f"{DATA}  →  {sorted_data}")
```

#####出力
```
[6, 15, 4, 2, 8, 5, 11, 9, 7, 13]  →  [2, 4, 5, 6, 7, 8, 9, 11, 13, 15]
```

うまく入れ替えられているが，これでは比較入れ替えが途中で必要なくなったとしてもデータの数だけ必ず繰り返すことになる．その部分を省くために，一巡して入れ替えが行われなくなった場合，繰り返しを抜ける操作を付け加えた．そのコードと出力を以下に示す．

#####コード

```python:bubble_sort_improved.py
"""
2021/01/10
@Yuya Shimizu

バブルソート（改良版）
"""

def bubble_sort(data):
    """バブルソート：前から2つずつデータを比較し並べ替える．ただし，交換がもう必要ない所は省略する"""
    change = True   #交換の余地ありと仮定
    
    for i in range(len(data)):
        if not change:  #交換の余地無しで繰り返し脱出
            break
        change = False  #交換の余地無しと仮定
        for j in range(len(data) - i -1):
            if data[j] > data[j+1]: #左の方が大きい場合
                data[j], data[j+1] = data[j+1], data[j] #前後入れ替え
                change = True #交換の余地ありかも
                
    return data

if __name__ == '__main__':
    DATA = [6, 15, 4, 2, 8, 5, 11, 9, 7, 13]
    sorted_data = bubble_sort(DATA.copy())

    print(f"{DATA}  →  {sorted_data}")
```

#####出力
```
[6, 15, 4, 2, 8, 5, 11, 9, 7, 13]  →  [2, 4, 5, 6, 7, 8, 9, 11, 13, 15]
```

ちゃんと昇順に並べ替えられていることが分かる．
今回は並べ替える前後での比較をしたいがために，あえて``sorted_data``という変数に結果を格納し，さらに関数への引数は``DATA.copy()``というようにcopy関数により，引数に影響が出ないようにしている．並べ替えるだけなら，そのような操作は必要でなく，``bubble_sort(DATA)``とすればよい．

##バブルソートの計算量
最後に計算量について触れる．
基本的に選択ソートと同様，**計算量はオーダー記法で表すと，$O(n^2)$**となる．
ただし，一度も交換が発生しない場合は，比較のみ（入れ替えなし）で済むため**$O(n)$**となる．
最悪時間計算量が$O(n^2)$であることに変わりはない．

##感想
前回に引き続き，そこまで複雑ではなかった．リスト内で一度に入れ替えを行うとき，一時的に値を保存する必要はなく，次のようにカンマで代入するだけでよいことを知った．これは大きなものを得られたと思う．

```python
data[j+1], data[j] = data[j], data[j+1]
```
次回以降の並べ替えアルゴリズムも楽しみである．

##参考文献
Pythonで始めるアルゴリズム入門　伝統的なアルゴリズムで学ぶ定石と計算量
　　　　　　　　　　　　　　　　　　　　　　　　 増井 敏克　著　　翔泳社
Rails6 Ajaxを使えるようにするために最初にしておくこと

ポートフォリを作成中にAjaxで路頭に迷ったので、未来の自分のためにこの記事を残しておこうと思います。

##jQuery関係##

jQueryのライブラリをインストール


```terminal
$ yarn add jquery@3.4.1
```

Webpackの環境編集

```ruby:config/webpack/environment.js
const { environment } = require('@rails/webpacker')

#下記を追加
const webpack = require('webpack')
environment.plugins.prepend('Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery'
  })
)
#ここまで
module.exports = environment
```

application.jsに追加

```ruby:app/javascript/packs/application.js
require("jquery")
```

##ブラウザ関係##
ブラウザ側でjavascriptが無効になっていた場合でもAjaxが起動するために

```ruby:config/application.rb
module "アプリ名"
  class Application < Rails::Application
    .
    .
    .
    # これを追加！
    config.action_view.embed_authenticity_token_in_remote_forms = true
  end
```

あとは書きまくるだけ！！
PHP 入門　忘れそうなものをメモ

#改行する方法

```
echo '<br>';
```

#定数

```
const ID = 1; 
echo ID; //result:1 
```

###ポイント
・`const 定数名（全て大文字）`で表す
・変数とは反対に、値を上書きできないようにしたいときにconstを使用する

#nl2br関数

#PDOクラスの変数名

```php
$dbh = new PDO($dsn, $user, $pass, $opt);
```

`$dbh`は`data base handling`の略で、よく現場でこの変数名を使用する。

`$dsn`は`data source name`の略でよく使う変数名

```php
$stmt = $dbh->query($sql);
```

`$stmt`は`PDOstatement（PDOが言うこと）`の略で
PDOオブジェクトがSQLを実行したら、PDOstatementオブジェクトが返り値として返される。

#fetchとfetchallの違い
fetch : 一行を取り出す（１レコード）
fetchall : 全行を取り出す（全レコード）
読書メモー「オブジェクト指向でなぜ作るのか」

## はじめに

技術書等を読んで得た知識をまとめた、自分用の読書メモです。なので、自分の所感多めでまとめていきます。
#### 今回は[「オブジェクト指向でなぜつくるのか（著　平澤章）」](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0-ebook/dp/B00ISP0QB2/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=35LBK7KM96SAZ&dchild=1&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B&qid=1603627021&sprefix=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%2Caps%2C241&sr=8-1)（以下「本書」）についてです。

[本の目次](http://bpstore.nikkeibp.co.jp/item/contents/m_4822281957.html)（日経BP書店のサイトです）

---

## 3行まとめ

- オブジェクト指向(OOP)についてよくある言説が含む誤りを示し、より実態に近いOOPの説明を与えてくれる
- OOPの基本的な概念やその歴史、そしてメモリの使われ方などOOPについての基礎知識について丁寧に書かれている
- UMLや設計・開発プロセスなどOOPを取り巻く周辺技術についてもまとめられている

---

## 第1章　オブジェクト指向はソフトウェア開発を楽にする技術

- 初心者にありがちな3つの混乱の整理
    - 用語の洪水
    - 比喩の乱用
    - なんでもオブジェクト症候群

用語の洪水は、確かに学びはじめの頃に頭を悩ませた記憶がある。日常生活で聴き慣れないような単語は特に（ポリモーフィズムなど）。
比喩・なんでもオブジェクト症候群について意識はしていなかったが、本書によって現実世界とプログラム世界との境界がはっきりしたと思う。現実世界!=プログラム世界

---

## 第2章　オブジェクト指向と現実世界は大違い

- SSIA

---

## 第3章　OOPを理解する近道はプログラミング言語の歴史にあり

- OOP誕生に至るまでのプログラミング言語の歴史について

OOPは
> 連綿と続いてきたプログラミング言語の工夫と改良の歴史の中で、必然性を持って登場したものといってもいいでしょう。

ということだ。
OOP以前の言語（Cなど）とOOPとの違いはクラスの有無くらいしか認識していなかったが、その違いや関係性について理解できた。
そんなに昔からOOPが存在していたとは思いもしなかった（Simula67という言語を初めて知った）。
GOTO文はわるいぶんか。

---

## 第4章　OOPは無駄を省いて整理整頓するプログラミング技術

- OOPの特徴と言われる「カプセル化（本書では「クラス」）」、「ポリモーフィズム」、「継承」についてのわかりやすい説明

> プログラミング言語は退化した？

という説が印象に残った。確かに、ものが進化していくにつれ、ある意味「危険」な機能はなくなっていくのかな（e.g.)自動車のMTとか）？
これらの隠れた機構について基礎寄りの知識を深めることと、これらを前提として高機能に（応用的に）使いこなしていくおことの、どちらも面白いと思った（自分はどちらかというと応用よりだと思う）。

例外が比較的新しい概念であることを初めて知った。
> OOPを生かすも殺すもプログラマの心がけ次第

---

## 第5章　メモリの仕組みの理解はプログラマのたしなみ

- OOPにおけるメモリの使われ方について
    - ガベージコレクション
    - インスタンス生成時のメモリ

メモリは「静的領域」「ヒープ領域」「スタック領域」（ここらへん地味に難しい...）
インスタンス変数はインスタンスごとに生成されるが、メソッドについてはクラスにごと1つずつしかメモリ上に存在しない。
OOPにも「ポインタ」は存在する（プログラマが意識しなくて良くなっているだけ）

「メソッドテーブル」

---

## 第6章　OOPがもたらしたソフトウエアとアイデアの再利用

- OOPから発展した、ソフトウェアの枠組みを超えた「デザインパターン」について 

> つまり再利用部品群を作った時のノウハウを新しいデザインパターンとして抽出し、それをまた次の再利用部品群の開発に生かしているというわけです。

- フレームワークについての「ハリウッドの原則」
- GoFのデザインパターン
  -> 古いものではあるが、未だに通用するものである。

デザインパターンについては興味を持ったので今後書籍などを参照しようと思った。

---

## 第7章　汎用の整理術に化けたオブジェクト指向

- オブジェクト指向（の考え方）がソフトウェアを超えて開発工程の汎用的な整理術となったこと
- この側面が「オブジェクト指向」の理解の妨げの要員の日つつとなっている？

---

## 第8章　UMLは形のないソフトウエアを見る道具

- UMLについて

UMLは使ってはいたものの、ここまで広汎で汎用的なものだとは知らなかった（このことが批判される場合もあるらしい）。

ソフトウェア設計においては「クラス図」と「シーケンス図」で事足りそう（コミュニケーション図はよく分からなかった）。これらはソフトウェア以外の汎用的な知識の表現にも用いることができる。
非オブジェクト指向の表現としては、「ユースケース図」、「アクティビティ図」、「ステートマシン図」が使えそう。
これらは今関わっているプロジェクトでも頻繁に用いられるので、これを機に精通していきたい。

---

## 第9章　現実世界とソフトウエアのギャップを埋めるモデリング
Vue.js の算出プロパティを使ってみた

# 初めに

前回に引き続きVue.jsで学んだことのアウトプットして投稿します。

# 算出プロパティ

- 算出プロパティの性質

>何度アクセスしても、関数を再び実行することなく以前計算された結果を即時に返す

- メソッドの性質

> 対称的に、メソッド呼び出しは、再描画が起きると常に関数を実行

# 例


ここでは入力された文字を一文字ずらして表示するメソッドを算出プロパティで書いてみました。

```html
  <div id="app">
    <input v-model="inputText" type="text">
    {{ nextAlphabet }}
  </div>
```


```js
var app = new Vue({
  el: '#app',
  data: {
    inputText: ''
  },
  computed: {
    nextAlphabet: function() {
      var alphabet = 'abcdefghijklmnopqrstuvwxyz' +
                     'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
      var alphabetList = alphabet.split('');
      var alphabetShiftList = {};
      for (let i = 0; i < alphabetList.length; i++) {
        alphabetShiftList[alphabetList[i]] = alphabetList[(i + 1) % 52]
      }
      alphabetShiftList[' '] = ' ';
      var applyShitList = this.inputText.split('').map(x => alphabetShiftList[x]);
      return applyShitList.join().replace(/,/g, '');
    }
  }
})
```

- 動作結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/79119d8c-af12-07a1-04b3-3cfa56faa3fa.png)



# 参考記事

- Vue.js 日本語公式ドキュメント  
https://jp.vuejs.org/v2/guide/computed.html
【Ruby】演算にnilが含まれた際のエラーを防ぐ方法

# 計算式にnilが含まれているとエラーが出る
例えば、こんな単純な計算結果(下記 @x)を出力しようとした場合、nilが含まれていると、何かしらのエラーが出るはずです。


```ruby
a = 1
b = nil
@x = a + b
```

#対策
.to_iメソッドを使う。
to_iとは、文字列を(整数と認識できれば、)整数に変換するメソッドです。
整数と認識されなかったものは、０を返します。

nilの場合も、整数を認識されないので、０を返し、エラーを出さなくなります。

上記、@xを出力しようとするなら、

```ruby
@x.to_i
```
と書けばOKです！
オブジェクト指向でリファクタリングを行う上で必要な知識

# はじめに
Javaでリファクタリングを行う上で必要と思われることを随時追加していく。
参考にした書籍は以下。

 * 結城 浩 著『[Java言語で学ぶリファクタリング入門](https://www.amazon.co.jp/exec/obidos/ASIN/4797337990/hyuki-22/)』ソフトバンククリエイティブ(株)刊
 * Dustin Boswell, Trevor Foucher 著『[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)』オライリー・ジャパン刊
 * 平澤 章 著『[オブジェクト指向でなぜつくるのか](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654)』日経BP社刊

# 意識しておくべき原則 
 - DRY（Don’t Repeat Your Self）原則
   - https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself
   - 繰り返し(重複)を避けること
 - KISS（Keep it simple, stupid）の原則
   - https://ja.wikipedia.org/wiki/KISS%E3%81%AE%E5%8E%9F%E5%89%87
   - 設計の簡潔性は大切、不必要な複雑性は避けるべき
 - YAGNI（You ain't gonna need it）原則
   - https://ja.wikipedia.org/wiki/YAGNI
   - 機能は実際に必要となるまでは追加しないのがよい

# 前提知識
 - OOP(オブジェクト指向プログラミング)の基礎的な理解
   - クラスとインスタンスの関係
   - アクセス修飾子
   - 継承（抽象クラスとインタフェース）
   - オーバーライド、オーバーロード
   - ローカル変数・インスタンス変数・static変数(クラス変数)

# リファクタリングの定義
 * 外部から見たプログラムの振る舞いを変えずに、プログラム内部の構造を改善すること

# テストについて
 * 必ずユニットテスト(unit test)が必要

## ユニットテストの定義
 * 開発者自身が作成すること
 * コード（通常はクラスやメソッドの単位）を対象としていること
 * 自動化されていること

# リファクタリングの目的
 * バグを見つけやすくする
 * 機能追加しやすくする
 * レビューしやすくする

# コツ
 * 感覚で修正するのではなく、リファクタリングカタログに従う
 * ステップ・バイ・ステップ（一度に一つずつ）
 * まず不吉な匂いをかぎ取ること

# 不吉な匂い（リファクタリングの可能性）
不吉な匂いとは、リファクタリングを必要としているコードの部分のこと。
プログラムの中で「理解しにくい」「修正しにくい」「拡張しにくい」部分を感覚的に感じるコツを匂いに例えたもの。

[リファクタリングの可能性を示唆する「不吉な匂い」一覧](https://qiita.com/sho-naka/items/465c2be696139c5f15c8)　参照


# リファクタリング・カタログ
マーチン・ファウラー著「Refactoring（洋書）」
が所属するThoughtWorks社が公開している、リファクタリングの方法をカタログ化したもの
 - https://refactoring.com/catalog/

頻出のカタログを一部抜粋したもの
[リファクタリング・カタログ（抜粋）](https://qiita.com/sho-naka/items/fd37c0cef35235b39b56)　参照
getPackageManagerでインストールアプリ一覧が表示されない（Android11・APIレベル30）

これまでgetPackageManager()#getInstalledPackages()を用いれば簡単に端末内のインストールアプリ情報を取得することができました。
しかし、Android 11(APIレベル30)からは単に下記のようなコードを記載するだけではシステムアプリ情報しか取得できなくなりました。

**例)デバイス内のインストールアプリをLog出力する**

```MainActivity.java
PackageManager pm = getApplicationContext().getPackageManager();
        List<PackageInfo> appInfoList = pm.getInstalledPackages(0);
        for(int i =0;i<appInfoList.size();i++){
            Log.d("MainActivity",appInfoList.get(i).applicationInfo.loadLabel(pm).toString());
        }
```

# 何がダメだったか
Android 11(APIレベル30)からはセキュリティ的に厳しくなっており、外部パッケージへのアクセスについてはManifestに明示する必要があります。

# 解決策
AndroidManifest.xmlにパーミッションの記述を書いてしまう。

```AndroidManifest.xml
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
```

…全部許可してしまうので非推奨なやり方だと思われます。
本来は`<queries>`で囲って個別に明示するのが正しい方法なのかも。

# 参考
[Android 11 でのパッケージへのアクセス - Android Developers](https://developer.android.com/about/versions/11/privacy/package-visibility?hl=ja)