OmniAICreator/Qiita-1.07M huggingface dataset:
try-catch-finally 例外処理 使い方 java


環境：Windows10, Eclipse, java8

javaにおけるtry catch finallyを使った例外処理について記述します。

##例外処理の書き方

```java

try{
  処理
}catch(例外の型 引数){
  例外発生時の処理
}finally{
  最後に実行される処理(例外の有無関係なし)
}
````


##使用例

```java
	public static void main(String[] args) {
		double a = 99999;

		//----------例外処理が発生するケース----------
		System.out.println("-----例外発生-----");
		try {
			a = 30/0;
		}catch(ArithmeticException e) {
			System.out.println("例外処理：0では割れません");
			System.out.println(e);
		}finally {
			System.out.println("finally  "+ "a="+a);
		}

		//----------例外処理が発生しないケース----------
		System.out.println("-----正常-----");
		try {
			a = 30/3;
		}catch(ArithmeticException e) {
			System.out.println("例外処理：0では割れません");
			System.out.println(e);
		}finally {
			System.out.println("finally  "+ "a="+a);
		}
	}
```
#####実行結果

```
-----例外発生-----
例外処理：0では割れません
java.lang.ArithmeticException: / by zero
finally  a=99999.0
-----正常-----
finally  a=10.0
```

####解説
以上のプログラムでは、a=30/0;の行にて、
ゼロで除算をしているため(解なしになってしまう)、例外(ArithmeticException)が発生しています。
そのため、以下の処理が実行されます。

```java
		}catch(ArithmeticException e) {
			System.out.println("例外処理：0では割れません");
		}
```
そのため、実行結果として、「例外処理：0では割れません」と表示されました。




##catch(例外の型 引数)について

catchの中身はどのように書けばよいのか。

#####上記での例
```java
}catch(ArithmeticException e){
```

上記の例での、ArithmeticExceptionというのは、ゼロで除算すると投げられてくる例外です。

他の例外も、以下の形で書けますので、解説していきます。

```java
}catch(例外の型 引数){
````

####例外の型(例：ArithmeticException)
例外が発生した際に投げられてくる型を書く。

try内に書く処理に対応した例外処理を、リファレンスで調べて使う。
java11の場合：https://docs.oracle.com/javase/jp/11/docs/api/index-files/index-1.html

#####importを伴う場合
また、ファイル入出力操作等で例外処理をしたい場合に、
IOExceptionという例外を使う場合は

```java
import java.io.IOException;
```
でパッケージをインポートする必要があることもあります。

今回のArithmeticExceptionという例外についても、

```java
import java.lang.ArithmeticException
```

と記述してimportの必要がありそうです。
しかし、java.langはコンパイラ内で暗黙的にimportされるため、記述の必要はありません。
ちなみにSystem.out.printlnがimportなしで使えるのもこのためです。


####引数(例：e)
命名は自由だが。「e」が使われることが多い。

今回の例では
「System.out.println(e);」を記述しているため、
実行結果に「java.lang.ArithmeticException: / by zero」
と表示され、例外を受け取っていることが確認できる。
AWS-Athenaでファイル名をカラムに追加する方法

#この記事の内容
AWS-Athenaで、ファイル名をカラムに追加するやり方をご紹介します。

もう少し具体的に述べると、
以下のファイル名のデータがS3の同じ場所に格納されていて、
YYYYMMの部分をクエリで利用したいケースを想定しました。
・「test_file_202001.csv」
・「test_file_202002.csv」
・「test_file_202003.csv」

#クエリ例
Athenaでファイル名をカラムとして取得するには、「"$path"」を利用します。

```sql
SELECT "$path" FROM テーブル名
```

#やってみた（環境構築）
バケット名「test-bucket」の配下に、以下3つのデータが格納されています。

・「test_file_202001.csv」

|name|
|:-----------|
|satoshi|
|kasumi|


・「test_file_202002.csv」

|name|
|:-----------|
|takeshi|


・「test_file_202003.csv」

|name|
|:-----------|
|musashi|
|kojiro|
|sakaki|


#やってみた（クエリ実行）
クエリを早速実行してみます。

```sql
SELECT
  *
  , "$path" 
FROM 
  バケット名
```

S3のバケット名とファイル名の両方が取得できました。

|name|$path|
|:-----------|:-----------|
|satoshi|s3://test-bucket/test_file_202001.csv|
|kasumi|s3://test-bucket/test_file_202001.csv|
|takeshi|s3://test-bucket/test_file_202002.csv|
|musashi|s3://test-bucket/test_file_202003.csv|
|kojiro|s3://test-bucket/test_file_202003.csv|
|sakaki|s3://test-bucket/test_file_202003.csv|


#応用例
今回のように「YYYYMM」部分のみを取得したい場合は、正規表現を用いて置換して取得しました。

```sql
SELECT
  *
  , REGEXP_REPLACE(REGEXP_REPLACE("$path", '^s3://test-bucket/test_file_', ''), '.csv$', '') AS yyyymm
FROM 
  バケット名
```

意図した通りの結果が取得できました！

|name|yyyymm|
|:-----------|:-----------|
|satoshi|202001|
|kasumi|202001|
|takeshi|202002|
|musashi|202003|
|kojiro|202003|
|sakaki|202003|






#最後に
簡単にカラムを追加できるので非常に便利ですね！


#参考文献
[Amazon Athena ユーザーガイド](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/athena-ug.pdf)
正則化: 鋭すぎる刃物を鈍らせて使う

# この記事何？
正則化について自分なりにまとめる。

# はじめに
機械学習をかじったことがある人なら、正則化（regularization）という言葉について「聞いたことがある！」という人は多いだろう。ただ、この概念、個人的にあんまりピンとこないなという思いを持っていた。

なんか知らんけどとりあえず入れとくと上手いこと仕事してくれる便利なやつ、そんな感覚を持っていた。
そんな折、下記の本を読んだ。（厳密には読んでいる最中）  
[カーネル多変量解析―非線形データ解析の新しい展開 （シリーズ確率と情報の科学）](https://www.amazon.co.jp/gp/product/4000069713/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=popketle-22&creative=1211&linkCode=as2&creativeASIN=4000069713&linkId=e89755973ca08de3bdd8fb1715e9fb00)

この本の中に、タイトルの「正則化: 鋭すぎる刃物を鈍らせて使う」という章がある。この章名をみた時、目から鱗が落ちるとでも表現すべき体験をした。

そんな自分の体験を新鮮なうちに少しメモしておきたい。（いや、ここ読んだの数ヶ月前なんですが...新鮮とは一体...）

# 正則化って...
まず、そもそも正則化ってなんなのか。とりあえず過学習を抑えるための手法だという説明を受けることが多いと思う。

一般的にパラメータの次元（数）が増えると、関数の表現力が上がりすぎて汎化性能が落ちる。これを次元の呪いやら過学習やら呼んだりする。つまり、パラメータの次元は必要最小限に抑える方がいいのだ。
計算時間を考えてみても、これはその通りであるということは理解できると思う。


## 次元の呪いって...
そういえば、正則化について考えてみる前によく考えてみると、次元の呪いという言葉もいまいちよくわからない。次元が増えると計算時間が爆発的に増えるとか、過学習しやすくなるとかそういう話はわかる。

しかし、よく次元の呪いの話について話すときにされる超球の話、これの意義がよくわからん。ちょっと調べてみた。

>高次元の球では、ほとんどの部分が球の表面付近に分布する  

この説明で、なるほどとなるやつがいるのか？...いるんだろうな、自分の無能さが悲しくなる。まあそれはともかくとして、ここら辺のリンクを読んでみた。

[次元の呪いとは結局何なのか？](https://qiita.com/SolKul/items/e6f6f620199274aeb1fe)
[次元の呪い、あるいは「サクサクメロンパン問題」](https://windfall.hatenablog.com/entry/2015/07/02/084623)

次元が増えれば表面積も増えるのだから、体積と半径が固定なら、そりゃ表面に体積が集中してくという話はわかる。なるほど、面白い現象かもしれない。

で？結局この超球の話をして、次元の呪いについて何を言いたいのか？  
この問いに関して、僕は明確な答えを持っていない。高次元では非直感的なことが起こるんだよという話をしたかっただけなのかもしれない。よくわからん。  
でも多分そうなのだろう。

つまり、少し話が脱線してしまったようだ。  
今回の話で次元の呪いというときに、この超球の話を思い出す必要はなさそうだ。気になって調べてみて無駄に時間を使った。

結局、次元の呪いとは一つの現象のことだけを指すのではなく、

- 超球の表面に体積のほとんどが集まることとか
- 計算時間が爆発的に増えるとか
- 過学習しやすくなるとか

その他いろいろ、次元が増えたことで起きる面倒くさいこと・不思議なことをまとめて次元の呪いなどと仰々しい名前で読んでいるっぽい。

今は、次元が増えると計算時間が爆発的に増えるとか、過学習しやすくなるとかの問題があるということにだけ注目することにしよう。

# 正則化について立ち戻る
正則化とは、過学習を抑えるための手法だというところはいいだろう。
では、どうやってそれを達成しているのか考えていこう。

自分の持ってる直感的な理解としてはノイズを付け加えることで、過学習を抑えロバスト性を上げる。というのが一番近い。まさに「鋭すぎる刃物を鈍らせて使う」だ。

じゃあ、正則化項はなんでもいいのかというとそうではない。できれば、過学習したときにそれを咎める仕事をしてくれるものを考えたい。

一般的に、機械学習は正解ラベルと予測ラベルの誤差を最小化することを目的とするということは知っていると思う。

よく使われる最小二乗法の式でいうと

$$
C(x) = \frac{1}{n}\sum_{i=0}^n(y\_{i} - f(x\_i) )\^2
$$

これを最小化する。ここで、$C(x)$はCost functionの意味、$y\_{i}$は実際の値、$f(x\_i)$は予測値とする。

この式の後ろに正則化項をつけることで正則化する。

正則化項にも種類があるが、メジャーなL1正則化はL1ノルムに係数$\lambda$をかけた項と言われる。  
式にすると

$$
\lambda \sum_{i=0}\^{n}|w\_{i} |
$$

となる。  
この式はなんなのかというと、$\lambda$はハイパラメータで自分で調整する定数、$w\_{i}$は予測値を出すときに勾配降下法で調整される重みである。勾配降下法については、機械学習をかじってれば、知ってる気がするのであまり説明しないが、微分してその傾きをみることで最適解を見つける手法だ。  

で、この正則化項について話を戻すと、この$\lambda$を各重みのノルム（絶対値）にかけているということになる。  
すると何が起きるかというと、$\lambda$が大きければ大きいほど、小さくしたいはずのコスト関数の値が大きくなる。大きくなると困るので、これをなんとかしようと重みが小さくなる方向に学習が進んでいく。  
この重みが小さくなると何が嬉しいのかと、始まりの最小二乗法に立ち返って考えてみる。この式では、重みが大きいほど各変数（特徴量）の値が大きくなる、つまり過学習する方向に働く。L1正則化はこれを抑制しているのだ。

# 結論
まとめると、最小二乗法のようなコスト関数に正則化項を付け加えることで、各変数に対する重みが大きくなりすぎてオーバーフィットするのを防ぐための正則化の仕組みを説明した。

この正則化がどうしてうまくいくのかを、自分のできる限りで直感的に説明したつもりだ。

どうだろうか、「鋭すぎる刃物を鈍らせて使う」という言葉がしっくりきたのではないだろうか。（こない場合は僕の説明が下手なだけなので、[カーネル多変量解析―非線形データ解析の新しい展開 （シリーズ確率と情報の科学）](https://www.amazon.co.jp/gp/product/4000069713/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=popketle-22&creative=1211&linkCode=as2&creativeASIN=4000069713&linkId=e89755973ca08de3bdd8fb1715e9fb00)を買おう。すごくいい本なので（いつか読み終わったらレビューみたいなのも書きたい））
WindownsにFlutterをインストールする

# はじめに
[公式のドキュメント](https://flutter.dev/docs/get-started/install/windows)に沿ってインストールしていきます。

# Flutter SDKをインストールする
上記の公式からzipをインストールし、C直下に適当なフォルダを作るか、既存のフォルダに解凍します。(このとき、権限的に面倒なことになるのでProgram FilesやC直下など、管理者権限が必要な場所に直接解凍しないでください。)

# Pathを変更
環境変数に、**flutter\bin**までのパスを追加します。

# flutter doctorを実行
コマンドプロンプト等を開き、flutterディレクトリまで移動して

```
$ flutter doctor
```

と入力します。
この際、gitを入れているはずなのに**Unable to find git in your Path**とエラーが出る際には、
Pathに**C:\Windows\System32**を追加すると治るかもしれません。

# flutter doctorで指摘された点を修正

Android StudioにflutterプラグインやDartプラグインを入れたり、VS codeにflutterの拡張を入れたりします。
また、もし **Android license status unknown.**とエラーが出た際には、以下のように入力してください。

```
$ flutter doctor --android-licenses
```

それでもエラーが出る際は、Javaのバージョンが問題となっている可能性があります。　
(僕もそれで詰まりました。)

**環境変数を編集**を開き、**JAVA_HOME**にAndroid Studioのjreを設定することで治りました。
複数のCSV、データフレームを1つのデータフレームに高速にまとめる【60倍速】


# df.append()は遅い。。。
データフレームを結合するのにこれまで時間をかけていたのですが、いい方法がありましたので紹介させていただきます。
私の環境では60倍以上の高速に成功しました！
同じ形式のCSVファイルを結合して、読み込むのに利用可能です。

# 環境
```
Python: 3.7.6
pandas: 1.0.1
```

# 私が使っていた方法
CSVを読みこんで、ひたすらAppendする方法を使っていました。
約2500個のCSV(それぞれおよそ1000行)を読み込み、結合するのに**12分42秒**かかりました。

``` Python
csvs = glob.glob('./data/csv/*.csv')
df = pd.DataFrame()
for csv in csvs:
    df = df.append(pd.read_csv(csv))
```

# 高速な方法
同じCSVの読み込み・結合を**11.6秒**で完了することができました。
**65.6倍速**で同じ作業を完了することができました!

``` Python
from itertools import chain

def fast_concat(dfs):
    def fast_flatten(input_list):
        return list(chain.from_iterable(input_list))
    
    col_names = dfs[0].columns
    df_dict = dict.fromkeys(col_names, [])
    for col in col_names:
        extracted = (d[col] for d in dfs)
        df_dict[col] = fast_flatten(extracted)

    df = pd.DataFrame.from_dict(df_dict)[col_names]
    return df

dfs = []
for csv in csvs:
    dfs += [pd.read_csv(csv)]
df = fast_concat(dfs)
```
# なぜ速いのか
一言でいうとDictに
https://qiita.com/siruku6/items/4846431198769b38bb41
## 最後に
この記事は[こちら](https://gist.github.com/TariqAHassan/fc77c00efef4897241f49e61ddbede9e)の投稿を元に作成しています。
CSVをまとめるという作業はよく発生するものでしたので、非常に役立っています。
データフレームのリストを作るだけで使えますので、汎用性も高いです！
Spring Data JPAの非named queryなのでNo property list found for type

以下のように、named queryではないのにうっかり```name```にJPQLを指定しまうと、一見不可解な実行時エラーが発生する。

```java
@Repository
public interface SampleRepository extends JpaRepository<Sample, Long> {
	@Query(name = "select s from Sample s")
	List<Sample> list();
}
```

```java
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property list found for type Sample!
	at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:94) ~[spring-data-commons-2.3.3.RELEASE.jar:2.3.3.RELEASE]
	at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:382) ~[spring-data-commons-2.3.3.RELEASE.jar:2.3.3.RELEASE]
	at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:358) ~[spring-data-commons-2.3.3.RELEASE.jar:2.3.3.RELEASE]
```

落ち着いてみれば、単にそんなnameのnamed queryは無いですよ、というエラーなのだが、正しくJPQLを指定してるつもりなのに実行時エラーになって焦ってしまった……のでメモを残しておく。

正しくは```value```にJPQLを指定すればよい。

```java
	@Query("select s from Sample s")
	List<Sample> list();
```
Bashベースの良い感じのサブコマンド付きコマンドをサクッと作る

管理系コマンドを作る時に本気で作る時はGo言語なりで書くのだけど、とりあえず動くだけで良い時は内部的にはcurl投げてるだけとかgcloudなど別の管理コマンドの結果をjqで加工して組合わせてるだけで済ましたい時は良くある。

とはいえ、設定ファイルらしきものを読み込みたいし、環境変数で上書きもしたい。あとサブコマンドも欲しい。getoptも良いけど、あれはサブコマンドに対応してないのが難点。
という分けで以下のように作ったのだけどたぶん忘れるので投稿しとく。めんどくさいからrubyで書いたワンライナーは後でperlかawkに直しておか無いとなぁ。


```bash
#!/bin/bash

#
# Usage
#
function usage {
  cat <<EOM
Usage: $(basename "$0") [optional flags] [command] args
GLOBAL FLAGS
    -h|--help                              Display help
    -v|--verbose                           Make the operation more talkative        
COMMANDS
    deploy {FLOW_FILE}                     Deploy flow
       --help                              Sub Flag
    flows                                  Show flows
    triggers {FLOW_NAME} {ENDPOINT_NAME}   Show triggers
EOM

  exit 2
}

#
# Load config
#
[[ -z "${API_URL}" ]] && API_URL=$(cat ${HOME}/.kuda_config|grep URL:|awk '{print $2}')

#
# Define variable
#
CURL_OPTIONS=""

#
# Parse options
#
OPTIONS=($(echo $@ | ruby -ne 'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[0].join(" ")'))
ARGS=($(echo $@    | ruby -ne 'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[1].join(" ")'))
SUBCMD=${ARGS[0]}
SUBOPT=($(echo ${ARGS[@]:1} | ruby -ne 'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[0].join(" ")'))
SUBARGS=($(echo ${ARGS[@]:1}| ruby -ne 'puts $_.split(" ").reduce([[],[]]){|r, s| (s[0] == "-" && r[1].size == 0 ) ? [r[0] + [s], r[1]] : [r[0], r[1] + [s]] }[1].join(" ")'))

#
# If no arguments
#
if [ "$1" = "" ];then
    usage
fi

#
# Options
#
for opt in ${OPTIONS[@]}; do
    case "$opt" in
        '-v'|'--verbose' ) CURL_OPTIONS=" -v "$CURL_OPTIONS ;;
        '-h'|'--help' ) usage ;;
    esac
done

#
# Sub Commands
#
case "${SUBCMD}" in
    "deploy" ) 
    "run" ) 
        for opt in ${SUBOPT[@]}; do
            case "$opt" in
                '--help' ) 
                    echo "This is a sub-flag"
                ;;
            esac
        done
        FLOW_FILE=${SUBARGS[0]}
        gsutil cp $FLOW_FILE gs://afeafgeae-kuda-flow
        curl ${CURL_OPTIONS} -X POST ${API_URL}/management/load
    ;;
    "flows" ) 
        curl ${CURL_OPTIONS} -X GET ${API_URL}/management/flows
    ;;
    "triggers" ) 
        FLOW_NAME=${SUBARGS[0]}
        ENDPOINT_NAME=${SUBARGS[1]}
        curl ${CURL_OPTIONS} -X GET ${API_URL}/management/triggers/${FLOW_NAME}/${ENDPOINT_NAME}
    ;;
    "help" ) 
        usage
    ;;
esac
```
続・tf-idf関数を使わずに重みづけ

前回の記事では、読み込んだテキストデータを形態素解析して頻出単語を抽出しました。
これはtf値の前段階ぐらいまでにあたります。

↓こちら
Markdown: [形態素解析して頻出単語を出す](https://qiita.com/aramesaya/items/0fe423ab5de3a6a718f2)

そして今回行ったこと
・tfの計算
式：ある単語aの文書内での出現回数 / 文書内のすべての単語の出現回数の和
・idfの計算
式：#idf計算する：ある単語の出現する単語数(count_list) / 全文書数
・tf-idfの計算
・パンダスを利用して表の形にしてみる
・テキストに出力

```python:aa.py
#TFの計算
#ある単語aの文書内での出現回数 / 文書内のすべての単語の出現回数の和

def tf(t):
    tf_num = t / count_all
    return  tf_num

#idf計算する：ある単語の出現する単語数(count_list)/全文書数
#全単語
count_all_2 = len(a)

def idf(m):
    idf_num = m / count_all_2
    return idf_num

def tf_idf(x,y):
    z = x*y
    return z

tf_list = []
idf_list = []

for i in range(len(count_list)):
    tf_list.append(tf(count_list[i]))
    idf_list.append(idf(count_list[i]))

tfidf_list = []
for i in range(len(tf_list)):
    tfidf_list.append(float(tf_idf(tf_list[i],idf_list[i])))
    

#パンダスで表にした   
df1 = pd.DataFrame(f_list)
df1[1] = (tf_list)
df1[2] = (idf_list)
df1[3] = (tfidf_list)

df1.rename(columns={0:'名詞',1:'tf値',2:"idf値",3:"tf-idf値"})

#print(df1)

df1.to_csv('to_csv_out.tsv', sep='\t')

```

参考にさせていただいたサイト
Markdown: [自然言語処理の基礎であるTF-IDFの計算方法とPythonによる実装方法を解説](https://note.com/shimakaze_soft/n/n6e92d1a4851b)


【反省点】
・何回かに分けて作ったのでリストの名前や変数名を毎回適当にしすぎた。後でめちゃくちゃ見づらいです。ただ、いちいち説明を入れていたのでブロックごとに何をしているかは見やすかった。gj
・tf-idfを関数を利用して計算していたサイトをそのままコピペしたところパンダスの利用の仕方がイマイチわからず挫折したのですが、最後の出力として挑戦してみました。ちゃんと見れるようにできたので良かったです。
PythonでGoogle画像検索から好きなキャラの画像を自動保存する


#はじめに

以下の記事を参考にGoogle画像検索の結果を上から順に20枚保存するcodeを書きました。大したことしてないです
[PythonでGoogle画像検索をして画像をフォルダに保存する](https://qiita.com/Yuki-Takatsu/items/3f30727d5b21a83ea4ed)


#環境
OS:Windows 10 home
言語:python 3.8.1

#Code
codeの説明はコメントで行います

```python:download_images.py

# install module
import requests
import random
import shutil
import bs4

# 保存するURLの取得
def image(data,num):
    # Google画像検索のURL取得
    res = requests.get("https://www.google.com/search?hl=jp&q=" + data + "&btnG=Google+Search&tbs=0&safe=off&tbm=isch")
    html = res.text   # text化
    soup = bs4.BeautifulSoup(html,'lxml')   # 整形
    links = soup.find_all("img")   # img elementの取得
    link = links[num].get("src")   # num番目のsrcURLの取得
    return link

# 該当するURLからdownload
def download(url,file_name):
    req = requests.get(url, stream=True)
    if req.status_code == 200:
        with open(file_name + ".png", 'wb') as f:   # pngをbinでfileに書き出し
            req.raw.decode_content = True
            shutil.copyfileobj(req.raw, f)   # fileにpng画像データをコピー

# 検索する子の名前を指名してお出迎え
name = input("お目当ての子は？:")
for i in range(1,20):   # 便宜的に20枚とする
    link = image(name,i)
    download(link,name + str(i))
    print(link)
    i += 1   # 20回繰り返す


```

#結果
![山.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208060/f7af6f7e-eb30-d43e-3db0-581f5634f2df.png)

今回は"白銀圭"ちゃんを指名させて頂きました。
"かぐや様は告らせたい" : "妹ヒロイン"

![山.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208060/f2411767-65e0-f803-194b-f44c83d52b48.png)

できました。
とってもお可愛いこと。

圭ちゃんは初回の指名だったので、指名料として3000円取られました（なんのこっちゃ）

#今後

美少女を囲ってる感じで大変満足なのですが、Google画像検索がソースなのでpixelが小さかったりします。
また、一度に読み込むsrcが20枚超くらいなので100枚くらい一気にダウンロードできないです（改良すればできるんでしょうけど）

――では、良き2次元ライフを
WSL2 のファイルアクセスのメモ

## NTFS は遅い

https://vxlabs.com/2019/12/06/wsl2-io-measurements/

10 倍くらい遅いです. C++ コンパイルとかするととくに顕著です.

`/mnt/c/Users/<username>` など, Windows(NTFS)で git 管理のプロジェクトなどを共有して開発しないほうがよいです.

EXT4 だと native と同じようなので EXT4 の領域(e.g. `/home/<username>` など)を使いましょう.


https://github.com/microsoft/WSL/issues/4197

一応 NTFS アクセスの改善作業は行われているようですが, いつ対応されるかなどは不明です.

## Windows からアクセスする.

`\\wsl$` で network drive としてアクセスできます(WSL2 限定?)
CloudFormationでEC2にIAMロールを付与する

CloudFormationで作成したEC2から「**S3の特定バケットに対してアクセス可能にする**」方法の紹介です。
テンプレートファイルに「S3の特定バケットに対してアクセスを許可する」IAMロールを作成しEC2に付与しました。

# 4 Step

テンプレートファイルに以下の4項目を追記します。

1. IAMロールの記述
2. IAMポリシーの記述
3. IAMインスタンスロールの記述
4. EC2インスタンスにIAMインスタンスロールを付与

## 1. IAMロールの記述

IAMユーザーと似ていますが異なる点があります。

- IAMユーザーは**人**にアクセス権限を付与
- IAMロールは**AWSリソース**にアクセス権限を付与

今回アクセス権限を付与したいのはEC2ですので、IAMロールを使用します。

```yaml
  S3AccessRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement: 
          - 
            Effect: "Allow"
            Principal: 
              Service: 
                - "ec2.amazonaws.com"
            Action: 
              - "sts:AssumeRole"
      Path: "/"
```

## 2. IAMポリシーの記述

アクセス権限の具体的な内容は、IAMポリシーに記述します。
Roleに先程記述したIAMロールを指定します。

`<bucketname>`は実際のバケット名に置き換えます。

```yaml
  S3AccessPolicies:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: s3access
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
            - "s3:ListAllMyBuckets"
            - "s3:GetBucketLocation"
          Resource: "arn:aws:s3:::*"
        - Effect: Allow
          Action: "*"
          Resource:
            - "arn:aws:s3:::<bucketname>"
            - "arn:aws:s3:::<bucketname>/*"
      Roles:
      - !Ref S3AccessRole
```

## 3. IAMインスタンスプロファイルの記述

EC2インスタンスとロールを紐づけるのに、IAMインスタンスプロファイルを記述します。

```yaml
  S3AccessInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: "/"
      Roles:
      - !Ref S3AccessRole
```


## 4. EC2インスタンスにIAMインスタンスロールを付与

EC2インスタンスにIAMインスタンスプロファイルを付与します。

```yaml
  Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      IamInstanceProfile:
        !Ref S3AccessInstanceProfile
```

# 参考
[AWS::IAM::Role - AWS CloudFormation](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html)
[やーまんぶろぐ](http://yamano3201.hatenablog.jp/entry/2017/11/23/174531)
Lambda上でmysqlclientを動かす

## 概要

LambdaにてPythonを使用時、MySQLクライアントとして`mysqlclient`を使うもの（SQLAlchemy等）を利用する場合、いろいろ準備が必要。

* `mysqlclient` は `1.4.6` を使う
* AmazonLinux2から `libmysqlclient.so.18` を拾ってくる
* `libmysqlclient.so.18` をLambdaへ上げた際に、Lambda上でライブラリ用パスへ配置する

## `mysqlclient` は `1.4.6` を使う

```
pip install mysqlclient===1.4.6
```

細かい原理は不明だが `2.0.1` を使おうとすると、'_mysql'がないと怒られる。。


## `libmysqlclient.so.18`を拾ってくる

AmazonLinux2用の`libmysqlclient.so.18`が必要になるのでビルドする。

#### コンテナ起動

```
docker run -it amazonlinux:2 bash
```

#### コンテナ内

`libmysqlclient.so.18`を入れる。

```
yum update -y
yum install -y gcc mysql-devel mysql-libs # /lib64/mysql/libmysqlclient.so.18 が入る
```

#### ローカルPC

`docker cp`等で`libmysqlclient.so.18`をローカルへコピーする。

```
docker cp container:/lib64/mysql/libmysqlclient.so.18.0.0 local_path
```

## `libmysqlclient.so.18`をLambdaに配置する際の注意

Lambdaのコンテナ上のライブラリのパスが、↓になっているので、

```
LD_LIBRARY_PATH=/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib
```

`libmysqlclient.so.18` がLambdaコンテナに配置された際に上記のパスに配置されるようにする必要がある。

#### 例：レイヤーとしてアップした場合

レイヤーのファイルは `/opt` 内に展開されるが、`/opt/lib` の位置に `.so` が来る必要がある。

※`venv/lib/site-packages` 内をレイヤーとして上げる場合、`venv/lib/site-packages/lib` に `.so` を入れる。


#### 例：Lambda用のソースに紛れ込ませる場合

`/var/task` に展開されるので、 `lib`を作って、その中に `.so` を入れる。
GitHubで"Initial Commit"をすぐにする方法

# はじめに
`GitHub Codespace`は､ブランチがないと作れないので
# やり方
最初だけローカルかGitpodを用いります｡

1,  まず､GitHubに`username`/`initial`という名前のRepoを作ります｡
2,  _github.com/`username`/initial/settings_ を開いて､`Template Repository`に✅を入れます｡
3,  クローンします｡ 

>`git clone https://github.com/``username``/initial.git`
>`gitpod.io/#github.com/``username``/initial`

4, `git commit --allow-empty -m 'Initial Commit'` をして__Push__します｡
> コミットメッセージはご自由に

これで､Repoを作るときに__Template__から__initial__を選択することで､`Initial Commit`済みのRepoを作れます｡
これならすぐにCodespaceに行けますね!

~~俺って天才かも~~
登壇してみて得られた所感

2020 年 9 月 16 日、身内限定のクローズドなコミュニティにて、「エンジニアが発信力を磨く目的と、磨いた先にあるもの」という題目で登壇させていただきました。

[エンジニアが発信力を磨く目的と、磨いた先にあるもの - Speaker Deck](https://speakerdeck.com/kmd_htsh0226/enziniagafa-xin-li-womo-kumu-de-to-mo-itaxian-niarumofalse)

本記事では発表に至った経緯とその中で得られたことをまとめます。

# 発表の経緯

自分は現在、[エンジニアと人生コミュニティ](https://community.camp-fire.jp/projects/view/280040)に所属させていただいております。
その中の 1 コンテンツとして、「エンジニアのための発信講座」というコンテンツを受講しています。
受講している目的としては以下があります。

- ある分野で特化した人になりたい
- 今の報酬にさほど満足できていないので、ある程度今よりも高報酬を頂けるようになりたい
- エージェントを経由しなくても、直契約で仕事が取れるようになりたい

このコンテンツを通して、Twitter や Qiita での発信を活性化させようと思ったのはもちろん、「LT でもなんでもいいので何かしら登壇する」という目標を持つことができるようになりました。
そして、何か機会はないかなと思った時に、ちょうど身内で 2 週間に 1 回何かテーマを決めて発表するという場がありました。
なので、ちょうど発信講座で得られたことを発表をさせていただくことになった次第です。

# 発表で使用したツール

Markdown で書くのに慣れているので、[Deckset](https://www.deckset.com/)という Markdown 形式でスライドが作成できるツールを採用しました。デザインはテーマを選べば勝手にやってくれるので、あとは文字がスライドに収まるよう調整するだけでした。
発表形式はオンラインで普段使っている[Remo](https://remo.co/)という Web 会議システムを使用しました。

# 登壇してみてどうだったか

聴衆者のうなずきの声や、発表後に質問をいただくといったリアルタイムなリアクションがあったのはありがたかったです。
Twitter や Qiita ではリアルタイムなリアクションがないので、その点は文字で発信するのとでは大きな違いでした。
また、スライドを作ったり時間内に収まるよう構成を考えたりするといった事前準備が大変だなと感じました。今回は身内限定だったので練習なくぶっつけ本番で臨みましたが、カンファレンスのような規模感がもっと大きい場となると練習も必要だなと感じました。
ですが、大変な分達成感も大きかったです。
実際にこの発表を聞いて「じゃあ自分も発信してみようかな」って行動を起こしてくれるかはその人次第ではありますが、きっかけを与えることができたという意味では十分収穫でした。

# まとめ

エンジニアとして技術を磨いていくのはもちろんいいのですが、磨いた技術や勉強して得られたことを発表することで、自分自身の知識の定着にも繋がるし誰かの助けになります。
また、登壇は事前準備や場合によっては練習の必要もあり、 Twiiter や Qiita と比べてハードルは高めではあります。
ですが、発表が終わったときの達成感が大きかったり、リアルタイムなリアクションがあるなどメリットもあります。
登壇も今回だけに限らず、もちろんテーマも増やしながらこれからもどんどん増やしていきたいです。
未経験エンジニア転職中に出題されたコードディングテスト問題

未経験転職にて出題された問題と、自分なりに調べて処理した答えを備忘録として載せます。

実力不足の自分なりに出した答えなので、修正や解説をいただけるととっても嬉しいです！

##▼問題1 FizzBuzz
1から100までの数字を順番に出力する関数を作成してください。
ただし、出力する数字が3の倍数の場合には「Fizz」を、出力する数字が5の倍数の場合には「Buzz」を、出力 する数字が3の倍数かつ5の倍数の場合には「FizzBuzz」を、それぞれ数字の代わりに出力してください。
また、各数字もしくは文字列の出力の後に改行コード(LF - \n)を出力してください。


```ruby:fizzbuzzのコード
(1..100).each do |n| # 1〜100まで処理を繰り返す
  def fizzbuzz(n)
    if n % 15 == 0 # 3と5の倍数（3✖︎5）の時にFizzBuzzを出力(9/21追記コメントにてより良いコードの修正あり。)
      puts "FizzBuzz"
    elsif n % 3 == 0 #3の倍数の時にFizzを出力
      puts "Fizz"
    elsif n % 5 == 0 # 5の倍数の時にBuzzを出力
      puts "Buzz"
    else
      puts n # 上記の条件に当てはまらない場合に数字を出力
    end
  end
  
  puts fizzbuzz(n) # fizzbuzzメソッドを出力(9/21追記コメントにてputsは不要)
end
```

##▼問題2 素数を出力
1から1000までの素数を出力する関数を作成してください。
素数の定義は下記の通りである。

素数とは、1より大きい自然数で、約数が1と自分自身のみである数字である。

```ruby:素数を出力するコード
primeReturn = [] # primeReturnを配列にする
(1..1000).each do |n| # 1〜1000まで繰り返し処理
  next if n == 1 # ifの条件がtrueの場合、nextで次の処理に移る

  if n == 2
    primeReturn.push(n) # pushメソッドでprimeReturnの配列の中の最後尾にnを加える
    next # 次の処理に移る
  end

# コメントにてご指摘されてますが、ここのアルゴリズムは無駄な工数があります。
  judge = true
  primeReturn.each do |number|
    if n % number == 0 # 素数の処理
      judge = false
      break # 強制的に今のeach処理を終わらせて次の処理に移る
    end
  end

  primeReturn.push(n) if judge # judgeがtrueだった場合のみ、pushメソッドでprimeReturnの配列の中の最後尾にnを加える
end

puts primeReturn # primeReturnを出力（素数を出力）
```


__※rubyの場合もっと簡単にできます。__

```ruby:rubyの簡単コード
require 'prime' # primeライブラリを読み込み
Prime.each(1000) {|x| p x} # あらまぁとっても簡単。。。
```

##▼問題3 数字の7は何回出力されますか?
0から9999までの数字を順番に1刻みで出力するプログラムを作成しました。 このプログラムを実行した際に、数字の7は何回出力されますか? 例えば、7777が出力された場合、数字の7は4回出力されたものとしてカウントします。 この問題の答え、もしくは答えを計算するためのプログラムを解答してください。

```ruby:数字の7を数えるコード
num = [*(1..9999)].to_s # to_s配列の中身を文字列に変換

puts num.count("7") # 配列の中身の文字列の中から7の文字数をカウントする
```

##参考にしたURL
https://qiita.com/motoki4917/items/ffc89d955e20b91d1014
https://techacademy.jp/magazine/7507
https://docs.ruby-lang.org/ja/latest/class/Prime.html
https://docs.ruby-lang.org/ja/latest/method/Array/i/inspect.html
https://qiita.com/syo19961113/items/9f189424b5af5e084d33
無料で特定のラベルにきた新着メール（gmail）をslackに通知する（privateでもpublicチャンネルでも可

[無料でSlack（プライベートチャンネル含む）へGmailを通知する（slack + mail）](https://qiita.com/kieaiaarh/items/2bc8a4e302065a2e1839)

だいぶ前に上記を書きましたが、たまたま今回使うシーンがありました。
が、今回やりたかったのは、タイトルの通り、`新着メールを`通知するというもの。

上記の記事では特定の時刻に定期実行（デイリーで1回程度に頻度）することが前提。

ただし、今回やりたいのは、`新着メール受信して、即時でslack通知する`、ということ。

そのためには、
1. 新着メールの存在を
2. 定期実行（分単位）したgasで監視して、
3. メールがあるならslack通知する、

といった手段をとる必要があります。

で、

意外とサクッとできたので、備忘録として、書き溜めておきます。

基本的な流れは上記の記事と同じです。

# 上記の記事と違う点
以下の二つ。

* `新着メール`を`GmailApp.search`で取得する
* 下記gasを動かすトリガーを1分、5分と言ったインターバルで設定する（ここは必要に応じて変えてください

ことのみ。

## script
```js
function sendEmailsToSlack() {
    var label = GmailApp.getUserLabelByName('stores.jp');
    var messages = [];
    var searchCondition = 'label:[対象ラベル名] is:unread '; // 対象ラベルの未読メッセージ という指定をする
    var threads = GmailApp.search(searchCondition, 0, 50);

    if (threads.length == 0) return // 未読メッセなければ、終了。
    
    for (var i = 0; i < threads.length; i++) {
      messages = messages.concat(threads[i].getMessages())
      threads[i].markRead(); //　既読にする
    }

    var message = messages[messages.length - 1];

    Logger.log(message);

    var output = '\n' + message.getPlainBody();
    Logger.log(output);

    // payloadの設定は必要に応じてカスタマイズしてください。
    var today = new Date();
    var payload = {
        "username": "問い合わせあり",
        "attachments": [
          {
            "color": "#36a64f",
            "title": "以下の内容で問い合わせがありました",
            "fields": [
              {
                "value": output,
                "short": false
              }
            ],
          }
        ],
        "channel" : "#[通知したいチャンネル名]:", //if send public channel
        // "channel" : "@[通知したいチャンネル名]:", //if send private channel
        "icon_emoji": ":mailbox:"
    };

    var options = {
        'method' : 'post',
        'payload' : Utilities.jsonStringify(payload),
    };

    var webhookUrl = 'https://hooks.slack.com/services/TS9K2E1LY/hogehoge/xxxxxxxxxxxxxx'; // 通知したいslackチャンネルの の incoming webhook url
    UrlFetchApp.fetch(webhookUrl, options);
}
```
PPP(Point-to-Point Protocol)


応用情報技術者平成29年春期 午前33

WANを介して二つのノードをダイヤルアップ接続するときに使用されるプロトコルで，リンク制御やエラー処理機能をもつものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/01d2cf6d-5534-067f-6052-8ad1a90e2e0c.png)



１、PPP(Point-to-Point Protocol)は、
電話回線を通じてコンピュータをネットワークに接続するダイヤルアップ接続においてよく使われる、2点間を接続してデータ通信を行うための通信プロトコルです。

PPP通信には、
　・リンク制御プロトコル(LCP)と
　・ネットワーク制御プロトコル(NCP)
という2つの通信プロトコルが使用されています。

２、FTP
File Transfer Protocolの略。ネットワーク上でファイルの転送を行うための通信プロトコルです。

３、SLIP
Serial Line Internet Protocolの略。
PPPと同じくダイヤルアップ接続で使用されるプロトコルですが、
エラー処理機能やリンク制御機能を持っていません。

３、UDP
User Datagram Protocolの略。
TCP/IPの通信処理で使われる伝送制御プロトコルのひとつ。
TCPと異なりコネクションレス型の通信を提供します。


参照：
https://www.ap-siken.com/kakomon/29_haru/q33.html
【Bash】安全で汎用性のあるtempディレクトリの作成

## はじめに
- 普段shell内で利用する一時ディレクトリ作成において、以下の点で改善点が見受けられた。
  - `mkdir /tmp/パス`のような直指定のため、場合によって名前の重複が生じる。
  - また直指定のため、セキュリティ的に安全ではない。
  - 名前を一意にして関連性も加えることで、処理内で使いやすく汎用性のあるものにする必要がある。
- そのため、今回は一意で安全かつ汎用性のあるtmpディレクトリの作成方法を記述する。

## 結果
- 先に結果として下記の内容を、用意したシェルファイルに記述する。

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

basepath=$(basename $0)
timestamp=$(date +%Y%m%d%H%M%S)
tmpd=$(mktemp -dt "$basepath.$timestamp.$$")/
echo $tmpd

# 出力
# $TMPDIR/index.sh.20200919152709.XXXX.XXXXX/
```

- 記述後、複数回実行して出力したパスへの作成や名前の非重複を確認して、完了。

## 処理内容

### mktempコマンドの利用
- ディレクトリ作成に**mktemp**コマンドを利用することで、自動でサイズ0のファイルやディレクトリを作成してくれる。
    - mktempの詳細な利用方法はこちらを[参考](https://linuxjm.osdn.jp/html/GNU_coreutils/man1/mktemp.1.html)

### テンプレートオプションの利用
- mktempでの作成の際に、このコマンド固有のオプションのt(テンプレート)オプションを利用する。
- そうすることにより、ディレクトリ名を記述しなくても自動で`$TMPDIR`に設定されたパス内へ作成してくれる。
  - **※設定されているtmp格納場所を探す際は、`echo $TMPDIR`で探す**
  - **※設定されていない場合、`-p`で直指定を行うか、`/tmp`に格納される**

### 名前に関連項目も加える
- 名前に関連性のあるものを加えておき、プログラムでの処理の際に利用しやすくする。
- 最低限加えているものは下記。
  - 実行パス名
  - タイムスタンプ(時間)

### まとめ
- 上記のことから、Linuxでは課題を解決するための多数のコマンドが標準で備わっているため、これらを1つでも覚えて組み合わせていくことの重要性を再確認。
- また、安全面の考慮も必要だが、同時にプログラム内での処理の使いやすさや汎用性への意識の重要性を実感。

### 参考
- [ubuntus manpage](http://manpages.ubuntu.com/manpages/bionic/ja/man1/mktemp.1.html)
- [Create temporary directory on Linux with Bash using mktemp](https://code-maven.com/create-temporary-directory-on-linux-using-bash)
pingが用いるプロトコルーICMP(Internet Control Message Protocol)

応用情報技術者平成29年春期 午前32

ネットワーク機器の接続状態を調べるためのコマンドpingが用いるプロトコルはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/151fe398-4475-3f1c-2ae8-5eedb716ac29.png)


１、ICMP(Internet Control Message Protocol)は、
インターネットプロトコル(IP)の通信制御を補完するプロトコルで、
　・データ配送中のエラー通知や
　・送達エラーを通知する機能を持ちます。

ping(ピン又はピング)は、
　・ICMPの「echo request」パケットを対象ノードに送信し、
　・「echo reply」パケットが返ってくるか否かで、
対象ノードおよび到達するまでのネットワーク間が正常であるかを診断する機能です。


２、DHCP
Dynamic Host Configuration Protocolの略。ネットワーク内のIPアドレスを一元管理し，クライアントに動的に割り当てるプロトコルです。


３、SMTP
Simple Mail Transfer Protocolの略。電子メールの送信・転送に使用されるプロトコルです。


４、SNMP
Simple Network Management Protocolの略。ネットワーク上の機器の情報を収集して監視や制御を行うためのプロトコルですが、pingが用いるプロトコルではありません。


参照：
https://www.ap-siken.com/kakomon/29_haru/q32.html
【Java】【Kotlin】Enum の valueOf と values をジェネリックに呼び出す

Enum 派生クラスに暗黙的に宣言されるメソッド／メンバ関数である `valueOf` および `values` を
ジェネリックに呼び出す方法。

## Java

次のような enum 型が定義されているとする。

```Java
public enum PrimaryColor {
    RED, GREEN, BLUE
}
```

### 具象型が分かっているときの呼び出し

```Java
public static void main(String... args) {
    PrimaryColor red = PrimaryColor.valueOf("RED"); // RED
    PrimaryColor[] values = PrimaryColor.values(); // [RED, GREEN, BLUE]
}
```

### ジェネリックな呼び出し

```Java
public static <E extends Enum<E>> E valueOf(Class<E> enumType, String name) {
    return Enum.valueOf(enumType, name);
}

public static <E extends Enum<E>> E[] values(Class<E> enumType) {
    return enumType.getEnumConstants();
}

public static void main(String... args) {
    PrimaryColor red = valueOf(PrimaryColor.class, "RED"); // RED
    PrimaryColor[] values = values(PrimaryColor.class); // [RED, GREEN, BLUE]
}
```

## Kotlin

次のような enum 型が定義されているとする。

```Kotlin
enum class PrimaryColor {
    RED, GREEN, BLUE
}
```

### 具象型が分かっているときの呼び出し

```Kotlin
fun main() {
    val red: PrimaryColor = PrimaryColor.valueOf("RED") // RED
    val values: Array<PrimaryColor> = PrimaryColor.values() // [RED, GREEN, BLUE]
}
```

### ジェネリックな呼び出し

```Kotlin
inline fun <reified E : Enum<E>> valueOf(name: String): E =
    enumValueOf<E>(name) // `<E>` は今回の場合は省略（型推論）可能

inline fun <reified E : Enum<E>> values(): Array<E> =
    enumValues<E>() // `<E>` は今回の場合は省略（型推論）可能

fun main() {
    val red: PrimaryColor = valueOf("RED")
    val values: Array<PrimaryColor> = values()
}
```

／以上
キャストを含むStreamと拡張for文の処理速度の比較

# はじめに

配列やコレクションに含まれる**特定の型の要素**に対して操作を行うにあたり、Streamと拡張for文のどちらが早いのか、処理速度を検証しました。

# 事前に用意するコード

```Java:要素数1億の配列
Object[] objects = new Object[100_000_000];
for (int i = 0; i < 50_000_000; i++)
    objects[i] = new Object();
for (int i = 50_000_000; i < 100_000_000; i++)
    objects[i] = "";
```

```Java:要素数1億のArrayList
List<Object> objects = new ArrayList<>();
for (int i = 0; i < 50_000_000; i++)
    objects.add(new Object());
for (int i = 0; i < 50_000_000; i++)
    objects.add("");
```

今回は配列とArrayListを使って検証します。
Object型、String型の要素をそれぞれ5千万個ずつ格納しています。

# 検証

```Java:Stream
long start = System.currentTimeMillis();
objects.stream() // Arrays.stream(objects)
    .filter(String.class::isInstance)
    .map(String.class::cast)
    .forEach(String::toUpperCase);
long finish = System.currentTimeMillis();
System.out.println(finish - start + "ms");
```

| 種類 | 時間 |
|:-:|:-:|
| 配列 | 345ms |
| ArrayList | 409ms |

配列の方がやや早いようです。

```Java:拡張for文
long start = System.currentTimeMillis();
for (Object obj : objects) {
    if (obj instanceof String) {
        ((String) obj).toUpperCase();
    }
}
long finish = System.currentTimeMillis();
System.out.println(finish - start + "ms");
```

| 種類 | 時間 |
|:-:|:-:|
| 配列 | 122ms |
| ArrayList | 212ms |

今回の比較では、Streamよりも拡張for文の方が早いということがわかりました[^1]。
普段百万、千万単位の要素数を扱うコードを組まないのであまり意識せずストリームを使うことが多いのですが、パフォーマンスを重視する上では、ストリームは注意して用いる必要がありそうです。

[^1]: 計測方法に不備などございましたら、恐れ入りますが教えて頂けますと幸いです。
[UE4] VRで小さな惑星の上を走り回る

# はじめに
UnrealEngine4のプラグインである[UE4-CustomGravityPlugin](https://github.com/mhousse1247/UE4-CustomGravityPlugin)をVR化して、小さな惑星の上を走り回れるようにしてみました。
UE4.25.3を使用し、動作確認はOulusQuestで実施しています。
完成イメージは以下動画のような感じです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">UE4-CustomGravityPluginをVRで動かしたら面白そうだと思って、まずはそのままビルドしてみたけれど、ナビメッシュが使えずいつも使っているテレポート移動もできない・・どうしよう <a href="https://t.co/XaVP8ia5id">pic.twitter.com/XaVP8ia5id</a></p>&mdash; 高浜 (@SatoshiTakahama) <a href="https://twitter.com/SatoshiTakahama/status/1304971011343806464?ref_src=twsrc%5Etfw">September 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境
Windows10
Visual Studio 2019
UnrealEngine 4.25.3
※Visual Studio 2019だと文字化けの問題があるため、通常はVisual Studio 2017を使用したほうがよさそうです。自分はディスク容量の問題があり追加でインストールするのが厳しかったため、[VS2019でUE4のビルド時に日本語出力が文字化けする](https://qiita.com/steel_code/items/ad1fa34078582691300f)の対応をいれて使用しています。

# 作り方
## 準備
・UEで新規プロジェクトを作成します。ゲーム=>バーチャルリアリティー=>プロジェクト設定でモバイル/プロジェクト設定と、スケーラブルな3D・2Dを選択してプロジェクト作成します。
・プロジェクト設定からエンジン-インプットを選択してエクスポートを押し、適当なファイル名でインプット設定を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/2b46f3a3-87fc-c707-58b4-452d2049dce3.png)
・[UE4.25.3で動くように修正したUE4-CustomGravityPlugin](https://github.com/SatoshiTakahama/UE4-CustomGravityPlugin)からファイルを入手します。入手したファイルのプロジェクトをUEで開きます。
・プロジェクトにはいくつかマップが含まれていますが、小さな惑星の上を走り回るサンプルのマップPlanetGravity_Mapを開きます。

## OulusQuest向けの設定変更
[Oculus QuestおよびOculus Go:クイックスタート](https://developer.oculus.com/documentation/unreal/unreal-quick-start-guide-quest/?locale=ja_JP)に説明があります。ここにも簡単ですが自分の設定を書いておきます。
・プロジェクト設定のプロジェクト-ターゲットハードウェアを以下のように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/73c048a9-d437-7aa6-17a6-dfdb84fb25d1.png)
・プロジェクト設定のプラットフォーム-Andoroidを以下のように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/0e7fbcb4-f8b4-8670-235c-545e432199b1.png)
・プロジェクト設定のエンジン-レンダリングを以下のように変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/0753cd5b-ea3d-2927-d06d-c3e339e9b65f.png)
・プロジェクト設定からエンジン-インプットを選択してインポートを押し、先ほど保存したインプット設定のファイルを指定します。インプット設定は手動でもよいのですが、結構手間なので今回はこのような方法にしています。

## キャラクターの設定変更
・マップ上に配置されているFirstPersonCharacter_BPを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/7d13e8a7-b56e-db05-9013-3015c8b13fc2.png)
・インプット設定の変更により、既存のインプットのノードはエラーになるため削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/9b513e3f-ab30-9a1a-d761-fb21d36ee8fb.png)
・OculusTotchで動かすインプットのノードに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/828981a2-4477-3ce0-76ce-fa91d2195b98.png)

## 完成
ここまで作成した状態で実行すると、VRで小さな惑星の上を走り回れるようになっています。

# 参考資料
・[UE4-CustomGravityPlugin](https://github.com/mhousse1247/UE4-CustomGravityPlugin)
UE4-CustomGravityPluginの配布元のページです。

・[UE4-CustomGravityPlugin を試してみる](https://qiita.com/unknown_ds/items/110e85461eb15e7cc1a7#planetgravity_map)
こちらの記事がきっかけでUE4-CustomGravityPluginの存在を知りました。
デッドロックとなる時点

応用情報技術者平成29年春期 午前29

トランザクションAとBが，共通の資源であるテーブルaとbを表に示すように更新するとき，デッドロックとなるのはどの時点か。ここで，表中の①～⑧は処理の実行順序を示す。また，ロックはテーブルの更新直前にテーブル単位で行い，アンロックはトランザクションの終了後に行うものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/34ff8b68-0274-ffac-b8cb-9434673d25af.png)


１、デッドロックは、
共有資源を使用する2つ以上のプロセスが、互いに相手プロセスの必要とする資源を排他的に使用していて、互いのプロセスが相手が使用している資源の解放を待っている状態に陥ってしまうことをいいます。

つまり、互いに相手プロセスの必要とする資源の解放を待っている　
※○の待ち状態になっているからとのこと

⑤はテーブルｂを更新しようとする時に、①～⑧の処理順ので、既に運命でデッドロックになるが、まだ○になっていないです。
⑥は、本当に、Aがテーブルaを取得して、テーブルbを待ち
　　　　　　  Bがテーブルbを取得して、テーブルaを待ち
の○状態があったので、デッドロックになっている状態とは言えます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c014f6da-545a-dc75-af91-53de5e52dec6.png)


ーーーーーーーーーーーーーーーーーーーーー
二つのタスクが共用する二つの資源を排他的に使用するとき，デッドロックが発生するおそれがある。このデッドロックの発生を防ぐ方法はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/84300990-f18f-511b-ca84-6e49540d64d0.png)


「資源獲得の順序を両方のタスクで同じにする。」ですね。


参照：
https://www.ap-siken.com/kakomon/29_haru/q29.html
PHP file_get_contents()とは

今回はPHPで指定したファイルや文字列を読み込んでくれる<font color="Red">file_get_contents()</font>を紹介してみようと思います。

#file_get_contents()とは
一言で表すと指定したファイルやURLを全て文字列に読み込んでくれる関数になります。
リファレンスにはこう書いてあります。

```php5:リファレンス
file_get_contents ( string $filename [, bool $use_include_path = FALSE [, resource $context [, int $offset = 0 [, int $maxlen ]]]] ) : string
```
#####説明
>_この関数は file() と似ていますが、 offset で指定した場所から開始し maxlen バイト分だけ ファイルの内容を文字列に読み込むという点が異なります。 失敗した場合、file_get_contents() は FALSE を返します。
file_get_contents()はファイルの内容を文字列に読み込む 方法として好ましいものです。もしOSがサポートしていれば パフォーマンス向上のためにメモリマッピング技術が使用されます。

##引数
引数に当たる部分を解説していきます。
**$filename**
読み込みたいファイルやURLを指定します。
**$use_include_path**
指定するとinclude_pathからファイルを検索できます。
指定しない場合はfalseです。
**$context**
独自のコンテキストを使う場合に指定します。
使わない場合はNULLを返します。
**$offset**
読み込みを開始する位置を指定します。
**$maxlen**
読み込むデータの最大バイト数を指定します。
**返り値**
読み込んだファイル、URLの内容を文字列で返します。
読み込みに失敗した場合には、falseを返します。

##サンプルコード
###ファイルandURL

```php
<?php
$file = file_get_contents('php.txt');//('〜')ここにファイル名やURLを入れる
echo $file;
?>
```
<font color="Red">実行結果</font>
php.txtの内容が文字列で返されます。

###ファイルの一部

指定したファイルを「読み込み開始位置」から「読み込み終了位置」まで読み込み、それを出力するコードです。

```php
<?php
$abc = file_get_contents('abc.txt');
var_dump( $abc );
$abc = file_get_contents('abc.txt', false, NULL, 3, 10);
var_dump( $abc );
?>
```

```php
file_get_contents(ファイル,false, NULL,読み込み開始位置,読み込み終了位置)
```

<font color="Red">実行結果</font>

```php

string(27) "abcdefghijklmnopqrstuvwxyz"
string(10) "defghijklm"

```

#終わりに
PHPのファイルURLの内容を取得する<font color="Red">file_get_contents</font>でサーバーの設定によっては、データの取得ができない場合がありました。そのような場合でも他に<font color="Red">cURL</font>というものが存在するので、こちらを使ってみてもいいと思います。
その内cURLの記事も載せるのでよかったらみてください。

参考サイト
https://webkaru.net/php/function-file-get-contents/
https://www.php.net/manual/ja/function.file-get-contents
https://www.tam-tam.co.jp/tipsnote/program/post8753.html
https://qiita.com/shinkuFencer/items/d7546c8cbf3bbe86dab8
ラズパイOSインストールして起動

自分用メモです。
macです。

#何をしたいか
①マイクロSDカードの中身消す
②ラズパイOSインストールする
③HDMI出力の設定する

#①マイクロSDカード中身消す
とりあえずインストールする前に完全に中身がなしのSDカードにする。
sdカードmacにさして
`$ diskutil list`

```
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     314.6 MB   disk0s1
   2:                 Apple_APFS Container disk1         500.0 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +500.0 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            11.3 GB    disk1s1
   2:                APFS Volume Macintosh HD - Data     108.9 GB   disk1s2
   3:                APFS Volume Preboot                 83.7 MB    disk1s3
   4:                APFS Volume Recovery                528.9 MB   disk1s4
   5:                APFS Volume VM                      3.2 GB     disk1s5

/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.9 GB    disk2
   1:             Windows_FAT_32 boot                    268.4 MB   disk2s1
   2:                      Linux                         31.6 GB    disk2s2
```
これが出てくるから、SIZEが31.9GBのやつがSDカード。


次

```
$ diskutil eraseDisk MS-DOS RPI disk2
```
diskutil eraseDisk フォーマット形式 削除後のパーティション名 フォーマット対象ディスク

これで消える。

[参考元](https://qiita.com/ikemura23/items/f3dfc0311d50bc34aa25)

#②ラズパイOSインストールする
Raspberry Pi Imager でインストールする
[ここみてください](https://www.souichi.club/raspberrypi/raspberry-pi-imager/)

#③HDMI出力の設定する
起動する時にちゃんとHDMI出力するようにします。

FinderでラズパイOSインストールしたSDカード開いて。
**config.txt**を開いて変更する。

```config.txt
#hdmi_force_hotplug=1　→　hdmi_force_hotplug=1　（＃を消す）
#hdmi_group=1　→　hdmi_group=1　（＃を消す）
#hdmi_mode=1　→　hdmi_mode=5　（＃を消してモード番号は5に変更）

```


[参考元](https://raspida.com/rpi4b-config-hdmi)

これでラズパイにさして起動したらとりあえずつく。
SwiftUIやってて出てきたGeometryReaderって


## はじめに

SwiftUIでサイドメニューを実装しようと

[https://swiswiswift.com/2020-02-20/:title]

こちらのサイトをみていたら
<b>GeometryReader</b>
という記述がありました。

SwiftUIのおそらくグラフとかアニメーションのTutorialで出てきたと思うのですが、自分は最初はそこは必要ないと思い飛ばしていました。

なので今回は自分が調べた内容を備忘録としてまとめます。


## 公式の定義

> GeometryReaderの説明は独自のサイズと座標空間の関数としてコンテンツを定義するコンテナービュー。
> 
> 親レイアウトに柔軟な優先サイズを返します。

とあります。

<br>
親のViewのサイズや座標空間を取得して子のViewで使えるって感じですかね。

サイドメニューの参考サイトの場合は画面のサイズを取得するため
body下で利用したのでBodyのサイズ、つまり画面サイズが取得できたと。

画面サイズの取得の仕方としては

`UIScreen.main.bounds`でも取得はできそうです。

逆に親Viewを指定というか選ぶ場合は

`.background(指定したい親View)`をすればいけるみたい。


他にも参考サイト先で面白い内容があるのでもう少し勉強しようと思います。


## 参考サイト

[https://qiita.com/masa7351/items/0567969f93cc88d714ac:title]

[Apple公式Doc](https://developer.apple.com/documentation/swiftui/geometryreader)


[https://blog.personal-factory.com/2019/12/08/how-to-know-coorginate-space-by-geometryreader/:title]
なんとなく気になったdYSM調べた 


## はじめに

なんとなくdYCMという言葉を見つけて

そういえば、コレってなんなのかなーと思ったので調べました。

## dYCMとは

dSYMはクラッシュレポートのメモリアドレスに

対応するシンボル(クラス名やメソッド名)を持っているとの事なので

バイナリファイルにシンボル情報が入っているそうです。

## どういう時に使うの？

結論から言うと

「iOSのクラッシュログをSymbolicate（復元）するため」

です。

<br>
生のクラッシュログはアドレスで表記されているため

そのままだと分かりません。（制約の警告とはちょっと違うけどあんな感じ）

アプリのdSYMファイルを用いてシンボル化（Symbolicate）することで

どこで落ちてるか見ることができるようになります。


詳しいやり方は、以下の参考サイトに書かれていました。


## 参考サイト


[https://qiita.com/ruwatana/items/cc470eb229d267d693b0:title]
App Storeのレビューで表示するスクリーンショットの作成



## はじめに

今回はApp Storeのレビューで表示するスクリーンショットについて

勉強していたのでそちらの備忘録&まとめです。

以前、勉強がてら冷蔵庫の中身を管理するアプリを初めて作成しました。

[‎Rakko](https://apps.apple.com/jp/app/rakko/id1504529370)


この時はぶっちゃけ仕事と並行して3ヶ月以内に

作成しようと思い、画像の作成やスクリーンショットについては

ほぼ勉強していませんでした。

なので、今回新しくSwiftUIでアプリを作ってみるということで

今度はそれ並行しつつはもう少し勉強しようと。。笑

<br>
## 必要な画像のサイズ

必要なのスクリーンショットのサイズは<b>5.5インチ</b>と<b>6.5インチ</b>です。（<b>2020年9月現在</b>）

アプリのスクリーンショットのサイズを間違えて一度リジェクトをされたことがありました。

なのでここら辺はしっかり調べてやりました。

<br>
## 枠付きのスクショを撮る方法

アプリのレビュー用の画像にどのようなアプリかを載せるために

シミュレータを利用して枠付きのスクショを撮って利用しました。

やり方は


><b>「cmd」+「shift」+「4」+「space」→ 対象のウィンドウをクリック</b>

でできます。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chiltarou1224/20200813/20200813231738.png" width="50%" >

<br>
## スクリーンショットを作る時に参考にした物


まずは、同じような冷蔵庫管理アプリがどのような画像をやっているか

参考にしました。

<br>
次に、ダイアログとかのサービスをしている「Reporo」さんの

スクリーンショット作成術のデザインなどを参考にしました。

<br>
他にもいろいろネットで探しましたが、ここら辺は自分で調べた方が

頭に残りやすいと思うのであえて載せませんがたくさんありました。



[アプリストア用スクリーンショット作成ガイド | CE（カスタマーエンゲージメント）プラットフォームRepro（リプロ）](https://repro.io/contents/the-ultimate-guide-for-itunes-connect-screenshots/)


## 最終的なレビュー用画像

こんな感じになりました。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chiltarou1224/20200814/20200814172637.png" width="50%" >

んーなんだか安っぽい感じがまだ抜け出ないですが、

コレは単に自分のセンスとデザインの勉強不足ですね。(/ _ ; )

一個前のやつはこんな感じです。

<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chiltarou1224/20200814/20200814172837.jpg" width="50%" >
<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chiltarou1224/20200814/20200814172842.jpg" width="50%" >
<img src="https://cdn-ak.f.st-hatena.com/images/fotolife/c/chiltarou1224/20200814/20200814172911.jpg" width="50%" >
ディザリング、インデックスカラー、オーバレイ、カーニング

応用情報技術者平成29年春期 午前25

表示装置には色彩や濃淡などの表示能力に限界がある。一つ一つの画素では表現可能な色数が少ない環境でも，幾つかの画素を使って見掛け上表示できる色数を増やし，滑らかで豊かな階調を表現する手法はどれか。


１、インデックスカラーは、
ピクセルごとの色をRGB値で直接指定するのではなく、あらかじめ用意したカラーテーブルの「何番目の色を使用するか」という参照番号で表示色を指定する方式です。GIFやPNG-8などで使用されています。

２、オーバレイは、　overlay
画像や動画の上に別の画像を重ね合わせて表示させる技法です。

３、カーニングは、　kerning
文字間隔が等しく見えるように半角英字同士の間隔を調整する機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/2a5427c4-3ebb-4e15-5c62-1d4ec558d29d.png)


４、ディザリング(Dithering)は、
描画に使える色数が限られた状態で、より多くの階調を表現するための技法です。ドットパターンを用いて中間色を表現することで、見かけ上の色数を増加させます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e1365027-62b9-3d68-5aa4-5f16f00c32ba.png)


参照：
https://www.ap-siken.com/kakomon/29_haru/q25.html
タイマクロックは16MHzを32分周とは？

応用情報技術者平成29年春期 午前22

16ビットのダウンカウントのカウンタを用い，そのカウンタの値が0になると割込みを発生させるハードウェアタイマがある。カウンタに初期値として10進数の150をセットしてタイマをスタートすると，最初の割込みが発生するまでの時間は何マイクロ秒か。ここで，タイマクロックは16MHzを32分周したものとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/a7919509-ef63-235e-3d89-1f552573771d.png)


１、「タイマクロックは16MHzを32分周」とは、クロック周期数のことです。
計算は以下のように求められます。

　16MHz÷32＝500kHz

この500kHzからダウンカウントの周期は以下のように計算できます。

　1秒÷500kHz＝0.000002＝2マイクロ秒

１Hz（＝１ダウンカウント）は２マクロ秒ですね。


参照：
https://www.ap-siken.com/kakomon/29_haru/q22.html
「SLAM入門」4.3章 における完全SLAM問題定式化の導出


「SLAM入門」p41のグラフベースSLAMにおける完全SLAM問題の定式化の導出が簡略化されていたので，式変形の備忘録を残しておきます．
多変数のベイズの定理を全然しらないのですべて乗法定理で変形しています．

# 目的
完全SLAM問題では確率密度

```math
p(x_{0:t}, m | z_{1:t}, a_{1:t}, c_{1:t})
```
を推定します．

ここでの目的は上記の時刻tにおける確率密度を，時刻t-1の確率密度

```math
p(x_{0:t-1}, m | z_{1:t-1}, a_{1:t-1}, c_{1:t-1})
```

を用いて推定するための漸化式を導出することです．

# 導出

```math
\begin{equation*}
\begin{split}
まず乗法定理で同時確率に変換する\\
\ p(x_{0:t}, m | z_{1:t}, a_{1:t}, c_{1:t})=&\frac{p(x_{0:t}, m, z_{1:t}, a_{1:t}, c_{1:t})}{p(z_{1:t}, a_{1:t}, c_{1:t})}\\
z_tを前に出す\\
=&\frac{p(z_t, x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t}, a_{1:t}, c_{1:t})}\\
分子を乗法定理で条件付確率に変換する\\
=&\frac{p(z_t| x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t}, a_{1:t}, c_{1:t})}\\
分子の2項目を乗法定理で条件付確率に変換する\\
=&\frac{p(z_t| x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, m | z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t}, a_{1:t}, c_{1:t})}\\
分母を乗法定理で条件付確率に変換する\\
=&\frac{p(z_t| x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, m | z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_t| z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分母と分子で同じ項を消す\\
=&\frac{p(z_t| x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, m | z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_t| z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分母を消してηとする（これで2行目の式になる）\\
=&ηp(z_t|x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t}, m | z_{1:t-1}, a_{1:t}, c_{1:t})\\
マルコフ性により，1項目で依存関係のない変数を取り除く\\
=&ηp(z_t|x_t, m, c_t)p(x_{0:t}, m | z_{1:t-1}, a_{1:t}, c_{1:t})\\
分子の2項目を乗法定理で分数に展開する\\
=&η\frac{p(z_t|x_t, m, c_t)p(x_{0:t}, m, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子の2項目のx_{0:t}をx_tとx_{0:t-1}にする\\
=&η\frac{p(z_t|x_t, m, c_t)p(x_t, x_{0:t-1}, m, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子の2項目を乗法定理で2つに分割する\\
=&η\frac{p(z_t|x_t, m, c_t)p(x_t| x_{0:t-1}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t-1}, m, z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分子の3項目を乗法定理で2つに分割する\\
=&η\frac{p(z_t|x_t, m, c_t)p(x_t| x_{0:t-1}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t-1}, m| z_{1:t-1}, a_{1:t}, c_{1:t})p(z_{1:t-1}, a_{1:t}, c_{1:t})}{p(z_{1:t-1}, a_{1:t}, c_{1:t})}\\
分母と分子で同じ項を消す（これで3行目の式になる）\\
=&ηp(z_t|x_t, m, c_t)p(x_t| x_{0:t-1}, m, z_{1:t-1}, a_{1:t}, c_{1:t})p(x_{0:t-1}, m| z_{1:t-1}, a_{1:t}, c_{1:t})\\
分子の2項目において，直前のロボット位置x_{t-1}と移動量a_tがあれば\\
現在位置x_tが決まるという過程に基づいて依存関係のない変数を取り除く\\
=&ηp(z_t|x_t, m, c_t)p(x_t| x_{t-1}, a_{1:t})p(x_{0:t-1}, m| z_{1:t-1}, a_{1:t}, c_{1:t})\\
分子の3項目において，x_tやz_tがないことから，推定に影響しないa_tやc_tを取り除く\\
（時刻t-1のデータを推定するので，t-1より先のデータを取り除く）\\
=&ηp(z_t|x_t, m, c_t)p(x_t| x_{t-1}, a_{1:t})p(x_{0:t-1}, m| z_{1:t-1}, a_{1:t-1}, c_{1:t-1})\\

\end{split}
\end{equation*}
```

これで式変形できました．
間違っていたらコメントくださるとありがたいです．
リトルエンディアン（Little Endian）、ビッグエンディアン（Big Endian）

応用情報技術者平成29年春期 午前21

16進数 ABCD1234 をリトルエンディアンで4バイトのメモリに配置したものはどれか。ここで， 0～＋3はバイトアドレスのオフセット値である。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/84edf9d7-44a9-b97f-e4e1-b9356f1710dd.png)

１、エンディアンとは、
バイト　単位のデータをメモリに記録するときの方式。

・リトルエンディアンLittle Endianは、記録するデータの下位バイトから順番に、メモリのアドレス番号の若いほうに格納していく方式です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/cb9cfa98-6956-f173-4b6b-326c0ef2665d.png)



・ビッグエンディアンBig Endianとは、「データの上位バイトから順番に並べていく方式です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/dea9c967-d336-67b3-7c5f-45d2ac19bbff.png)


一般に
　・ビッグエンディアンは人間がデータの並びを認識しやすい、
　・リトルエンディアンはコンピュータがデータを処理しやすい
という特徴があります。

※エンディアン（英: endianness）は、
複数のバイトなどを並べる順序の種類である。一般的な用語による表現ではバイトオーダ（英: byte order）、ないしそれを一部訳して日本語ではバイト順とも言う。

英語の「endian」という単語自体には元々は「配置方式」「並び順」といった意味はなかった（#語源を参照）。日本では総称として「エンディアン」と呼ぶことが多いが、英語でそれに相当する語は英: endianness（エンディアンネス）である。

参照：
https://www.ap-siken.com/kakomon/29_haru/q21.html

エンディアン
https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
JavaScript: 引数が多いときはオブジェクトリテラルで渡すといい

引数が多い関数、たとえば

```js
const introduce = (name, age, from, job) => {
  console.log(`${name}さんは${age}歳、${from}出身の${job}です。`)
}

introduce('山田太郎', 20, '宮城県', 'イラストレーター');
//山田太郎さんは20歳、宮城県出身のイラストレーターです。
```

下のように書くといい。

```js
const introduce = ({ name, age, from, job }) => {
  console.log(`${name}さんは${age}歳、${from}出身の${job}です。`)
}

introduce({
  name: '山田太郎',
  age: 20,
  from: '宮城県',
  job: 'イラストレーター',
});
//山田太郎さんは20歳、宮城県出身のイラストレーターです。
```

引数の順番を変えても問題く関数を実行できる。

```js
introduce({
  age: 20,
  from: '宮城県',
  job: 'イラストレーター',
  name: '山田太郎',
});
```