OmniAICreator/Qiita-1.07M huggingface dataset:
【G検定対策】敵対性生成ネットワーク(Generative Adversarial Network)

# 敵対性生成ネットワーク(GAN / Generative Adversarial Network)とは
イアン・グッドフェローたちによって考案された**ジェネレータ**と**ディスクリミネータ**からなる教師なし学習のこと．

- **ジェネレータ**：ランダムなベクトルを入力とし，画像を生成して出力．
- **ディスクリミネータ**：画像を入力とし，その画像が本物か，それともジェネレータによって生成された偽物かを予測し，出力．

2種類のネットワークを **「競わせる」** ことで，新しい画像を作る．「競わせる」とは，ディスクリミネータの出力が間違えるような(=つい偽物を本物と出力してしまう)偽物の画像をジェネレータが生成する一方で，かたやディスクリミネータは騙されないように偽物を見抜ける学習をしていくということである．最終的には，本物そっくりな偽物の画像を作り出すことができる．

## DCGAN(Deep Convolutional GAN)
畳み込みニューラルネットワークを利用したGANの手法．もともとGANはニューラルネットワークを用いている．

## Pix2Pix
#### 【従来のGAN】
**ランダムなベクトル** から生成したデータが本物かどうかを予測する手法．
#### 【Pix2Pix】
従来のGANの手法で用いられたランダムなベクトルの代わりに，ある画像データを入力し，別の画像へ変換する手法．もとの画像データと，変換した画像のペアが本物か偽物かどうかを予測する．そのため，あらかじめペアの画像を学習のために準備しておく必要がある．
ex)) 昼の画像を夜の画像へ変換，線画をカラー画像へ変換．


## Cycle GAN
Pix2Pixと比べ，予め画像のペアが不要な手法．ある画像を変換し，さらにその変換した画像を **元の画像へ戻すように** 再度変換する．通常のGANの手法である本物か偽物かの判断をすると同時に，**元の画像と再度変換した画像が一致するように学習する．**

# 見るべき解説動画
https://www.youtube.com/watch?v=2rC2_-HtpsQ

# 数式を交えた解説動画
https://www.youtube.com/watch?v=rhTH46GywfU

# ハンズオンによる説明
https://www.youtube.com/watch?v=YZE8J71tp78
【G検定対策】再帰型ニューラルネットワーク (RNN)

# 再帰型ニューラルネットワーク (RNN)とは
内部に閉路をもつ**時系列データ**の解析に適するニューラルネットワークのこと．

### BPTT (BackPropagation Through-Time)
これまでに与えられた過去の情報が，新しく加わる情報に対してどのくらい重みを持っているのかを学習する．逆伝播する誤差も過去にさかのぼって反映する必要があるため，時間軸に沿って誤差を反映する．

### CTC (Connectionist Temporal Classification)
音声処理に使われる手法．出力候補として音素に加えて空文字を追加することで，出力長と正解長の違いに対処する．

### LSTM (Long Short-Term Memory)
勾配消失問題を解決するため，隠れ層の構造を変えた．

### Bidirectional RNN
途中の時間情報が欠けていることで，過去と未来の2つのRNNを組み合わせて学習するモデルのこと．

### Attention機構
「時間の重み」をネットワークへ組み込み，出力からみたときの各入力の重みを表す．

# 見るべき解説動画
https://www.youtube.com/watch?v=TCEpAR05D60

https://www.youtube.com/watch?v=yvqgQZIUAKg

https://www.youtube.com/watch?v=QOyYPptdgTg

https://www.youtube.com/watch?v=NJdrYvYgaPM

https://www.youtube.com/watch?v=IcCIu5Gx6uA

# 数式を交えた解説動画

https://www.youtube.com/watch?v=yZv_yRgOvMg

# ハンズオンによる説明
https://www.youtube.com/watch?v=iMIWee_PXl8
プログラミングへの向き合い方

❶まずはコードを書く
❷完璧を目指すな→インプットを記述し、アウトプットをその場で確認できる。すべてのコードを完璧に理解する必要はない。
❸アウトプット重視→必要な時に必要なことを学べば良い。
「FAQの書き方を学ぶ UX×テクニカルライティング勉強会 #5」を視聴したので、その記録

なぐり書きですが、表題のメモです。

[【オンライン】FAQの書き方を学ぶ　UX×テクニカルライティング勉強会 #5 - connpass](https://techwriter.connpass.com/event/239019/)
[効果的なUXライティングのための16のルール | UX MILK](https://uxmilk.jp/75290)

## セッション１ FAQライティングという魅力的な仕事

樋口恵一郎さん。以下著者のかた。

https://gihyo.jp/book/2021/978-4-297-12257-7

- FAQライティングは魅力的
- FAQはコンビニ。webは百貨店
- 相互にいい関係にすることが大事
    - FAQサイト運営
    - FAQ運営
    - FAQライティング
- 一問一答にしてシンプル化
- 「インターネットバンキングに入れないのですが」 などは良くない例。
    - 視認性向上、定型化すべし
    - 「～の手続きを教えて」等、文の後ろを揃える
- 明確化、具体化、一意化
- せめてFAQを整えておくことで、カテゴライズなどが上手くなる


## セッション2 FAQ運用の視点で見る「活用されるFAQ」とは？

大矢 聡さん。以下著者のかた。
[AI時代に進化する FAQの活用と実践 | 大矢 聡 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/4865941746/)

- 運用目的の設定
    - 問い合わせ削減等
- 誰が、どのようにFAQを運用するか
- 上手に活用すると、スムーズで継続的なFAQ運用が実現できる。
- FAQソリューション、FAQを運用するとは？
    - 分析を進めていくと、さまざまな傾向が見えてくる
    - 同じFAQサイトでも使われ方が変わる
- FAQサイトにとって、どのような表記が求められているか
- FAQでSEO


## Q&A

- Q. コンテンツはどのように決めていくのが良いでしょうか。
    - A. 一番いいのは、コールセンターの問い合わせ履歴。生のVOCであるから
    - 昔からあるFAQ、想定問答というのはある。ただあまりおすすめしないのは過去のマニュアルからつくるもの。
        - きちんとデータ分析をして、問い合わせ履歴からつくるのが良い。
- Q. VOCをどのように計測していらっしゃいますか。
    - A. 運用目的、問い合わせを削減したいと言うのがあるが、お客様満足度のアンケートをとるということはよくやる。
- Q. 問い合わせの内容からFAQ化する基準は？
    - A. 「問い合わせの履歴が2万件溜まりました」と言ってから作ってもなかなか大変。適宜
- Q. 複数メンバーがメンテナンスする際にトーンなどバラツキが出る
    - A. ガイドライン。ガイドラインと照らし合わせてレビューをする。合っている合ってないのレビュアーを決める。


## 感想

[良いFAQの書き方──ユーザーの「わからない」を解決するための文章術 (WEB+DB PRESS plus) | 樋口 恵一郎 |本 | 通販 | Amazon](https://www.amazon.co.jp/dp/429712257X/) を読みたい。
とりわけ夕方の参加しやすいタイミングで当方はありがたかったです。大変ありがとうございました！！

以上です～。
【G検定対策】畳み込みニューラルネットワーク (CNN)

# 畳み込みニューラルネットワーク (CNN)とは
ディープニューラルネットワークの1種．画像認識に応用するために改良され，高い認識性能を達成できるモデルである．

- 単純型細胞（S細胞）：画像の特徴検出
- 複雑型細胞（C細胞）：特徴の位置が変わっても，同一の特徴とみなす．

人間が持つ視覚神経の上記2つの働きを模したもの．これらを最初に取り入れたのは，福島邦彦らによって考案された**ネオコグニトロン**と呼ばれるモデルになる．後に，ヤン・ルカンによって**LeNet**が考案される．LeNetは誤差逆伝播法を用いている．


## 構造

### 畳み込み層
**フィルタ(カーネル)**を用いて，積和演算と活性化関数の処理を行う**畳み込み層**を経る．**画像から特徴抽出**し，**特徴マップ**(小さな画像)へ変換される．この畳み込み処理は，**局所受容野**に対応し，物体の移動を認識(**移動不変性の獲得**)することができる．

- **パディング**：画像の上下左右に数ピクセル分値を付け足し，画像サイズを大きくする処理のこと．
- **ゼロパディング**：付け足し部分の値に0を置くパディングのこと．

### プーリング層
決められたルールに従い，演算を行う．

**サブサンプリング(ダウンサンプリング)**：決められたルールに従い，画像サイズを小さくする．
**最大値プーリング(max pooling)**：ある一定の小領域内の最大値を抽出し，サブサンプリング画像(特徴マップ)を得ること．
⇢ cf ) **平均値プーリング**

### 全結合層
**特徴マップをフラットに並べる処理**のこと．

### Global Average Pooling
特徴マップの平均値を1つのユニット(ニューロン)の値にする処理．最近のCNNの手法として．全結合層を用いずこれを行うことが多い．

## 派生 
https://qiita.com/Rumi_Yamaguchi/items/4767651ec11840f72837

### AlexNet
ILSVRC2012にて，ジェフェリー・ヒントン率いるチームが開発したSuperVisionが圧勝．用いられたニューラルネットワークはAlexNet（8層）．⇢DeepLearningが一気に脚光を浴びるきっかけ

https://www.youtube.com/watch?v=KebUnMbOGU8
 
### VGG
`畳み込み層⇢畳み込み層⇢プーリング層`の塊を繰り返し，16層まで積層する．少ない層で学習した後，途中に畳み込み層を追加して深くする学習方法を採用．

https://www.youtube.com/watch?v=IANRZujgLT8

### GoogLeNet
同時に異なるサイズのフィルタの畳み込み処理を行う**Inceptionモジュール**を導入．

https://www.youtube.com/watch?v=p-SflGf3m2Y

### ResNet
ILSVRC2015にて，ResNet（152層）が優勝．**Skip connection**という **「層を飛び越えた結合」** を加えた．
- 層が深くなっても，飛び越える部分は伝播しやすくなる
- 様々な形のネットワークのアンサンブル学習になっている．

https://www.youtube.com/watch?v=WslQrSO94qE

その他の応用形
⇢ **NASNet**，**MnasNet**，**EfficientNet**(転移学習に有効なモデル)

# 見るべき解説動画
https://www.youtube.com/watch?v=m8pOnJxOcqY

# ハンズオンによる説明
https://www.youtube.com/watch?v=GsofrxoAsow
ARKitでデバイスの位置を取得する

# デバイスの位置って重要
ARはユーザーとARコンテンツのインタラクションなので、ユーザーの視点の位置＝デバイスの位置は大事です。

# ARKitでデバイスの位置を取得できます

### デバイス位置取得

```swift
func session(_ session: ARSession, didUpdate frame: ARFrame) {
    let transform = frame.camera.transform.columns.3
    let devicePosition = simd_float3(x: transform.x, y: transform.y, z: transform.z)
    print(devicePosition)
}
```

>SIMD3<Float>(0.0, 0.0, 0.0)
SIMD3<Float>(9.0870006e-10, 4.1317643e-09, -3.1889111e-09)
SIMD3<Float>(-2.9535964e-05, -4.5597553e-06, -9.115785e-06)
SIMD3<Float>(-3.6674974e-05, -2.1950224e-05, -2.2978664e-05)

X軸Y軸Z軸の座標が得られます。

### 対象座標との距離

```swift
let objectPosition = node.simdWorldPosition
distance(devicePosition,objectPosition)
```

>1.0562732

メートル単位です。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
なぜ単純な増員は生産性の改善に直結しないのか？

## はじめに

経営層が理解し易いように、製造業を例に纏めてみました。

## 前提

課題分析として、生産としての観点から開発者を **「自動化設備」** と想定し、評価を行ってみる。
自動化設備の評価方法としては、一般的な **「費用・便益分析法」** を利用する。

## システム開発における「費用・便益分析法」の解釈

1. **「作業時間の短縮」**・・・指示・教育時間の短縮
1. **「段取り替え時間の短縮」**・・・調査・学習時間の短縮
1. **「不良品の減少」**・・・開発テストでの不具合発生数の減少
1. **「製品事故の減少」**・・・インシデント発生数の減少
1. **「製品品質の向上」**・・・機能性の向上

## 評価の実施

「単純な増員」は **「性能の低い生産設備」** と仮定をする。

### （1）指示・教育時間の短縮

自走力が低く、上司や先輩社員の時間を多く必要とする

### （2）調査・学習時間の短縮

学習度合いが低く、生産物が変わる毎に時間を多く必要とする

### （3）開発テストでの不具合発生数の減少

技術力が低く、生産をする際に多くの不具合を発生させる

### （4）インシデント発生数の減少

品質が低く、ユーザー利用時に頻繁に動作不具合を発生させる

### （5）機能性の向上

機能性が低く、ユーザー利用時の業務遂行に問題を発生させる

## 評価結果のまとめ

- 多くの不具合を発生させる（Quality）
- 多くの工数を必要とする（Cost）
- 長い期間を必要とする（Delivery）

## 評価結果の考察

**資材や生産物の多様化** や **品質に対する要求の高度化** に伴い「生産設備」に求められる性能が高くなった。
その為、「単純な増員」は生産性の向上に寄与せず、**むしろ下げる傾向にあり**、生産性の向上には **「良質な人員」** が必要となる。

## 評価結果による対策

開発者は **「学習型の生産設備」** であり、学習済み設備が調達できた場合でも、**個社チューニング**が必要となり、生産開始まである程度時間を必要となってしまう為、既存の「生産設備」の**メンテナンス**が重要となる。

## さいごに

思ったほど分かり易くない気がしましたが、書いてしまったので、公開しておきます。
シェルスクリプトで全角数字を半角に変換する

:::note info
Alfredのワークフローなどで、スクリプトにzshをはじめました。初心者用にメモを残します
:::

# シェルスクリプトで全角数字を半角に変換する

sedコマンドで1対1変換が可能

書式
`sed 'y/変換前文字列/変換後文字列/'`
　※1文字単位での変換となります
　　変換前文字列の1文字目が、変換後文字列の1文字目に変換
　　変換前文字列の2文字目が、変換後文字列の2文字目に変換
　　変換前文字列の3文字目が、変換後文字列の3文字目に変換

1体1置換えなので、見た目ですぐわかります
よくある例では、0から9や、aからzなど順番通り書くものが多いのですが
もちろん下のような逆順でもOKです
```zsh
echo ３月５日 | sed 'y/９８７６５４３２１０/9876543210/'
 #=> 3月5日
```


# 雑談

1対1変換なので、カエサル暗号にも利用できますねと思って調べたら
trコマンドの例がありました
```zsh
echo aBCdEfg | tr "$(printf %3sA-z)" A-zA-z
 #=> dEFgHij
```

ん、3文字ずらしですが、お尻の方がへんですね
```zsh
echo vwxyzVWXYZ | tr "$(printf %3sA-z)" A-zA-z
 #=> yzABCYZ[\]
```
この例は、もともと○字ずらしという汎用的な暗号装置を考えているようです
%○Sとしてスペースをいれて、置換前文字列をずらしています

`xyz`が`ABC`となるのは、A-zA-zの後ろのABCにヒットしているので
作者の想定通りかどうかはわかりませんが、動きとしては合っています
ただ、`XYZ`が`[\]`となるのが奇妙

文字コードをみてみると
大文字が`A`（&H41）から`Z`（&H5a）です。
確かにこの後のコードは`[`（&H5b）、`\`（&H5c）、`]`（&H5d）となっています
小文字は`a`（&H61）から`z`（&H7a）ですね
もうおわかりですね
`A-z`というのは、`A`（&H41）から`z`（&H7a）までの範囲なので
当然、非英文字（&H5b）から（&H60）も入るのですね

結局1文字ずつ対応させる必要があるので、3文字ずらしであればこうなります
（英大文字、英小文字のみ対応となります）
```zsh
echo ABYZabyz | tr  A-Za-z D-ZA-Cd-za-c
 #=> DEBCdebc
```

trコマンドでは変換文字列をまとめて書けることがわかったので、
はじめの全角数字を半角にするとこんな感じ
```zsh
echo ３月５日 | tr ９-０ 9-0
 #=> ３月５日
```

あれれ、小さいものから書かないといけないのですね
```zsh
３月５日 | tr ０-９ 0-9
 #=> 3月5日
```

わかったこと
<font color='#cc0000'>trコマンドの範囲指定A-zには非英字も含まれます
trコマンドの範囲指定はD-Zでも可能、逆順Z-Aは不可</font>



もうひとつ、別の変換の話題を
数字を漢数字の大字に変換する場合は感じかな

`sed 'y/0123456789/零壱弐参肆伍陸漆捌玖/'`

あ、2桁変換ができないか。`10`→拾、`20`→廿、`10000`→萬など。
ARCoachingOverlayViewが表示されないときの対処法

# ちゃんと設定しているのに表示されない！

ARKitがWorldTrackingを確立するには、デバイスを動かして、ARKitに視点を与える必要があります。
トラッキングが確立するまで、ユーザに補助メッセージを表示するARCoachingOverlayView。
うまく表示されないケースがありましたので、対処法を書いておきます。

<img src="https://camo.qiitausercontent.com/24cb5b0809a19c57cccd85d64e687509514ef557/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3233353235392f64646437303631652d623733652d626166372d376539352d3761343163613165303937642e676966">

基本的な表示法は以下の記事で大丈夫です。

https://qiita.com/john-rocky/items/ae6d6674e43b112be3ec

# ゴールをチェック

以下のようにコーチングのゴールに平面を設定している場合、
ARWorldTrackingConfigurationのARSessionに **PlaneDetectionを設定していないと、CoachingOverlayが表示されません。**

```swift
let coachingOverlay = ARCoachingOverlayView()
coachingOverlay.goal = .anyPlane
```

以下のようにPlaneDetectionを設定します。

```swift
let configuration = ARWorldTrackingConfiguration()
configuration.planeDetection = [.horizontal, .vertical]
sceneView.session.run(configuration)
```

これで試してみてください。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

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

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
【初心者】React学習： HTMLとJSXの違い

## 自己紹介
経済学部4年生のフロントエンドエンジニアです。

アプリ開発にReactを使いそうなので、学んだことを適宜まとめていきます。所々、知識に曖昧な点があります。間違いなどあればご指摘していただけると幸いです。

## JSXとは

JSXとは。Javascriptフレームワーク「React」で使うJavascript構文のこと。

```
return (
  <h1>
    Hello world
  </h1>
);
```
見た目通りHTMLっぽい見た目になっています。が、HTMLとは全く別物。
JSXはJavascriptの式の一種。

## HTMLとJSXの違い

JSXはHTMLと見た感じが似ていますが、文法は違うので注意が必要です。

**JSXの特徴**

- `style=""`は`style={{}}`で書く
- ハイフンは一切使えない
- `class=""`は`className=""`で書く
- `for=""`は`htmlFor=""`で書く

このようにHTMLとは異なるルールがいくつかあります。

### `style=""`は`style={{}}`で書く

これは見た目のままです。html内にCSSを直書きしたい時には""ではなく{{}}で囲いましょう。

### ハイフンは一切使えない
JSXでハイフンは一切使えません。
クラス名やCSSの`background-color`など全てが該当します。

ハイフンは使わない代わりにキャメルケースを使います。
例：
```
background-color--→backgroundColor
```

### `class=""`は`className=""`と書く
それからハイフンだけではなく、Javascriptで既に使われている単語にも注意が必要です。

例えば、classやforなどはJavascriptでも使われていますよね。そういった単語はHTMLとは違う書き方をすることで対応します。

例：
```
<p class="container"></p> --→ <p className="container"></p>
<label for="name"></label> --→ <label htmlFor="name"></label>
```

次はstate・hooksあたりの記事を書いていく予定です。
【G検定対策】自己符号化器，オートエンコーダ (autoencoder)

# 自己符号化器，オートエンコーダ (autoencoder)
**可視層**(入力層&出力層)と**隠れ層**の2層からなるネットワーク．つまり，入力層と出力層が同じになるようなネットワークを意味する．**ジェフェリー・ヒントン**が考案．

**エンコード**：入力層⇢隠れ層における処理
**デコード**：隠れ層⇢出力層における処理

また，**可視層よりも隠れ層の数が少ない**ことから，**エンコードの際に次元削減を行っている**といえる．

# 積層オートエンコーダ (stacked encoder)
ディープニューラルネットワークのようにすべての層を一気に学習するのではなく，事前学習とファインチューニングで構成される処理のこと．教師なし学習．

### 事前学習 (pre-trainning)
入力層に近い層から順番に学習させていく，逐次的な方法．

### ファイン・チューニング(fine-turning)
事前学習で隠れ層の重みを調整し終え，最後に **ロジスティック回帰層(シグモイド関数 or ソフトマックス関数による出力層)** を足し，**重みの調整**をもすること．

### 深層信念ネットワーク (deep belief networks)
教師なし学習に，**制限付きボルツマシン**(restricted boltzman machine)という手法を用いたもの．ジェフェリー・ヒントンが積層オートエンコーダを提唱した2006年にこちらの手法も提唱されている．



# 見るべき解説動画
https://www.youtube.com/watch?v=CXzheA9Ua2E

https://www.youtube.com/watch?v=EFMBFGPBGpU

# 数式を交えた解説動画
https://www.youtube.com/watch?v=_FVeRh-DHDM

# ハンズオンによる説明
https://www.youtube.com/watch?v=iVSJpMrUsis
【G検定対策】誤差逆伝播法 (backpropagation)

# 誤差逆伝播法
重みを更新するにあたり，モデルの予測結果と実際の正解ラベルの誤差を，出力層から入力層へ逆向きに重みを更新していく手法のこと．入力層から出力層への予測の流れを「順伝播」と呼ぶのに対し，重みの更新は「逆伝播」となる．

### 勾配消失問題
以前は，隠れ層で用いられた活性化関数にシグモイド関数が使われていた．例えば「正規化機能をもたない」**ReLU関数**を，隠れ層に使うことにより回避できた．


# 見るべき解説
https://www.yukisako.xyz/entry/backpropagation

# 数式を交えた解説
https://www.youtube.com/watch?v=0itH0iDO8BE&t=1796s

https://free.kikagaku.ai/tutorial/basic_of_deep_learning/learn/neural_network_basic_backward

https://www.youtube.com/watch?v=X8hK4ovQoLg

https://www.youtube.com/watch?v=75R4u3jaJ9A

https://www.youtube.com/watch?v=lctO5afCBmY

# ハンズオンによる説明
https://www.youtube.com/watch?v=5LV8Eh030s4

https://rightcode.co.jp/blog/information-technology/back-propagation-algorithm-implementation

M NISTを例に進める．

https://www.youtube.com/watch?v=037pRlYAEbI
MACでSSH接続時にno matching key exchange method foundで怒られた場合の対応方法

# 概要

SSH接続時に「鍵交換方式が見つからないですよ」と怒られたので対応方法をまとめる

参考にしたサイト

https://shsm385.hatenablog.com/entry/2018/10/17/161258

https://hackers-high.com/linux/ssh-config-more-secure/

```bash
 no matching key exchange method found. 
 Their offer: diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
```

# `.ssh/config`に鍵交換方式を設定する

```config
# 接続先名
HOST xxx.xxx.xxx.xx 

# 鍵交換アルゴリズムを追加で指定
+KexAlgorithms diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

# 以下だと指定した3つの鍵交換アルゴリズムのみに限定されてしまう
#　KexAlgorithms diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1

# 実際の通信を暗号化する暗号化アルゴリズムを指定
Ciphers aes128-cbc
```

# 再度SSH接続を実行する

パスワードを聞かれるようになれば成功です

```bash
ssh xxxx@xxx.xxx.xxx.xx
xxxx@xxx.xxx.xxx.xx's password:
```
【G検定対策】勾配降下法 (gradient descent methid)

# 勾配降下法
モデルの予測値と実際の値の誤差を最小にするため，入力値に対する重みを適切な値にしなければならない．その際に最適解を探索する手法として，勾配降下法が用いられる．

曲線に対する勾配ということで，微分値である「接線の傾き」に沿って解を探索し続ける．そのため学習には時間がかかる．
⇔ **勾配上昇法**

**イテレーション**：何回繰り返し計算を行い，重みを更新したか．
**学習率**：勾配に沿って一度にどれくらい降りていくか．
**エポック**：訓練データを何度学習に用いたか

***

**大域最適解**：誤差の値を最も小さくする，本当の最適解．
**局所最適解**：見せかけの最適解．一見誤差の値が小さく見えるが，全体的な最小値を実現しているわけではない．

勾配降下法では，求められた重みが局所最適解なのか大域最適解なのかが判断できない．そのため，適切なタイミングで学習率を小さくしていくことが必要になる．

しかし一般的には「局所最適解が求まれば，ある程度誤差の値は小さいため，それで妥協しよう」というスタンスで学習を進める．

**停留点**
勾配が0になる点．局所最適解でも大域最適解でもない．

**鞍点**
ある次元まで低くすると，極小となる点．これ以上次元を落としても付近は極小のままであるため，局所最適解となりがちである．鞍点に陥り，学習の停滞状態になることを**プラトー**という．

### モーメンタム
最適化の進行方向へ学習を加速させ，停滞を防ぐ．
ex ) Adagrad, Adadelta, RMSprop, Adam, AdaBound, AMSBound

# 重み更新のタイミングに応じた勾配降下法

### 確率的勾配降下法 (SGD / Stochastic Gradient Descent)
データ1つごとにイテレーションが増える．逐次学習といい，1回1回の予測の度に，正解ラベルとの誤差を計算し，重みを更新していく．

### ミニバッチ勾配降下法 
**ミニバッチ**：いくつかの訓練データからランダムにサンプリングした小さなデータの集合．

ミニバッチに含まれるデータ全ての誤差の総和を計算し，その総和を小さくするように重みを1回更新する．

### バッチ勾配降下法
訓練データ全ての誤差を計算してから重みを更新する．イテレーションとエポックの回数が同じになる．

# 見るべき解説動画
https://www.youtube.com/watch?v=wchZdyE04zM

# 数式を交えた解説動画
https://www.youtube.com/watch?v=7z8254VERTM

https://www.youtube.com/watch?v=xHPqk1rbNlU

# ハンズオンによる説明
https://www.youtube.com/watch?v=wSGta8B_PPE
【Unity】Webページに埋め込む方法【2020.2】

webサイトにWebGLで書き出したゲームを埋め込む方法備忘録
~~例：https://ponkichi.info~~ リンク切れごめんなさい

Unityバージョン 2020.2.7f1

手順
1.設定してBuild
2.フォルダに入れる
3.HTMLに埋め込む
4.サイズ調整

## 1. Build

Edit > ProjectSettings > Player
から、Publishing Settings > Compression Formatを　**Disabled**に変更

デフォルトのGzipでもできる場合があるみたいですが、私はこれにしないとゲームがロードされなかったです。
![スクリーンショット 2022-03-05 1.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/88fd7452-462b-e6af-cf84-958613ba13cd.png)

## 2. フォルダに入れる
![スクリーンショット 2022-03-05 2.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/980cdba1-c989-4965-9b9e-c45b4a19f9ea.png)

## 3. WebサイトのHTMLに埋め込む
```html
<iframe width="960" height="600" src="ponmoguraBuild/index.html"
 frameborder="0" allowfullscreen>
</iframe>
```

unityで書き出されたindex.htmlではなくて、埋め込みたい元のサイトのhtmlに記載する
大きさは１６：１０にしてます
srcの部分にはビルドしたファイルの名前を書く
この状態で一度確認するとゲームが埋め込まれているはずです。

## 4. index.htmlを書き換える
unityで書き出されたindex.htmlを少し編集する
3までの手順でゲームのサイズやUIの位置がズレることがあるので修正します
赤枠部分がゲーム画面のサイズです

![スクリーンショット 2022-03-05 1.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722227/2e73913c-98f2-e52f-739a-21b898b6e4bf.png)

以下のように書き換える

```html
style="width: 100%; height: calc(100vw * 0.56);
```

calcについてはググってみてください。

終わり
Android studioとARcore

初めまして、システムエンジニアのとまとです。

今回は2月末までできていたAndroidStudioでの
ARcoreについて説明していきたい思います。

公式ドキュメント

Android Studio
https://developer.android.com/?hl=ja

ARCore
https://developers.google.com/ar


ついこの前までAndroidStudioでARcore
を使用してた人もいると思います。

しかし、Androidstudio v4.2.1以前の
バージョンでは使用できなくなってしまい
衝撃を受けました。

この前までは、下図のようにできたのですが、
![23294822-07F9-41BE-8A1F-E93BAC32BDB2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2568816/d67fbc22-182c-3fdc-04e8-cef6f83d7466.jpeg)


前のバージョンで起動しようとしても下図のようになります。

![D6A74438-9D5B-4E9E-9820-B39B2D618227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2568816/a63ee481-1319-1c51-ad07-f03261e4510b.png)

カメラを起動しても黒い画面のままですね。
様々な機種でしてもこのような画面になりました。


なので、今回はバージョンのアップグレードをして
この前までやっていたARを使用していきたいと思います。

続く
【React】Material-UI（styled-components）でのFailed to compile解消法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## MUI（styled-components）でのFailed to compile解消法
### エラーが発生した状況とエラー内容
[MUIの公式ドキュメント](https://mui.com/getting-started/installation/)を参照し、以下の通りインストールを実行しました。

```:ターミナル
$ npm install @mui/material @mui/styled-engine-sc styled-components
```

アプリケーションの作成を進め、`npm start`したところ以下のようなエラーが出ました。

![スクリーンショット 2022-03-05 1.10.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/d96e1c37-ff3a-7d78-9580-14463039324c.png)

エラーメッセージは以下の通りです。

Failed to compile 
./node_modules/@mui/styled-engine/index.js 
Module not found: Can't resolve'@emotion/react' in '/Users/ユーザー名/アプリケーション名/node_modules/@mui/styled-engine

### エラーを解消した方法
ターミナルで以下の通り実行することで解消することができました。

```:ターミナル
$ npm install @emotion/react @emotion/styled
```

styled-componentsを使用する場合には、以下を実行すれば良いはずですが、emotionもインストールしないと上記のエラーが出てしまうようです。
```:ターミナル
$ npm install @mui/material @mui/styled-engine-sc styled-components
```

### 参照
https://github.com/mui/material-ui/issues/27846
【G検定対策】活性化関数 (activation function)

# 活性化関数 (activation function)とは
入力信号の総和を出力信号へ変換する関数のこと．入力信号の総和が「どのように活性化するか」を決定する．

> - 「線形関数」：入力値の定数倍が出力となって返ってくる関数のこと．(ex. ステップ関数，シグモイド関数)
>
> - 「非線形関数」：線形に非ずな関数．曲線や，1本の直線の形ではない関数のこと．(ex.ReLU関数)

## ステップ関数
閾値を境に出力が変わる関数．0か1しか出力しない．

## シグモイド関数
ステップ関数と同様，入力が小さい時は0に，大きいときは1に近くなり，かつ**非線形関数**である．一方，ステップ関数と比べ，滑らかな曲線で，入力に応じて連続的な実数値へ出力が変化する(微分可能)．

## ReLU関数 (Rectified Linear Unit)
- 入力が0以下であれば，出力は0
- 入力が0以上であれば，入力値をそのまま出力

誤差逆伝播の際に勾配消失しにくい．しかし，入力が0以下の場合の微分値が0になるため，学習がうまく行かない場合もある．

### Leakly ReLU 関数
入力が0以下のとき，わずかに傾きをもつ．

### Parametric ReLU
入力が0以上の際の，直線の傾きを学習によって最適化する．

### Randomized ReLU
入力が0以上の際の，直線の傾きをランダムに試行する．

# tanh関数
tanh関数と書いて，ハイパボリックタンジェント関数と読む．出力が0〜1の範囲をとるシグモイド関数を線形変換し，-1〜1の範囲を取る．

シグモイド関数の微分の最大値が0.25であるのに対し，tanh関数の微分の最大値は1であるため勾配が消失しにくい．

# ソフトマックス(softmax)関数
出力を正規化し，**確率**として用いられる活性化関数．**分類問題で使用される**(回帰問題では恒等関数を使用)．ソフトマックス関数の**出力の総和が1**になることから，確率として用いられる．

また，ソフトマックス関数は単調増加のため，各要素の大小関係は変わらないことから，ニューラルネットワークが分類を行うときには出力層でのソフトマックス関数は省略することができる．

⇢ ロジスティック回帰で，よく用いられる．

# 見るべき解説動画
活性化関数に関しての説明は，数式を用いないと説明不可能である．極力，イメージと数式が紐づけられる解説が以下である．

https://www.youtube.com/watch?v=mFU63UkmrMc

https://www.youtube.com/watch?v=q4xgHx97pNs

# 数式を交えた解説動画
https://www.youtube.com/watch?v=cTvJ-jj63U4

https://www.youtube.com/watch?v=fqVzwM15ybg

https://www.youtube.com/watch?v=-Wt8PQJlgZY


# ハンズオンによる説明
https://www.youtube.com/watch?v=lyREsuFisGA
cron などで定期実行中のシェルスクリプト群をサーバに安全にリリースしたい。

# 概要

bash はシェルスクリプトを最初にすべて読み込むわけではなく、読み込みながら実行します。

そのため実行中のシェルスクリプトを更新する場合、正しい手段を選択する必要があります。

さらに cron などで定期実行中のシェルスクリプトを更新する場合は、実行状況やタイミングをできるだけ気にせず安全に済ませたいです。

本記事は以下の記事を参考にしています。

- [【Bash】スクリプト実行中にスクリプトを書き換えてみる](https://qiita.com/mti_tw/items/b33af16360b4a23ca721)
- [Tips: 実行中のシェルスクリプトを書きかえるときには](https://qiita.com/kitsuyui/items/d0048eeaa50293a92a60)
- 外部サイト：[実行中のBashシェルスクリプトを書き換えると挙動が変わる問題とその対処法](https://genzouw.com/entry/2022/01/18/080007/2826/)
- 外部サイト：[bash スクリプトの実行中上書き動作について](https://zenn.dev/mattn/articles/5af86b61004bdc)
- 外部サイト：[そのファイル、安全に更新できていますか？（アトミックなファイル操作：前編）](https://heartbeats.jp/hbblog/2013/10/atomic01.html)
- 外部サイト：[inodeから見たmvやcpの動き](https://christina04.hatenablog.com/entry/mv-cp-inode)
- 外部サイト：[Linuxで読込中のファイル削除の影響](https://www.symmetric.co.jp/blog/archives/83)

上記の記事を参考に自分でも色々と試した結果を元に本記事を書いています。

間違いの指摘やより良い方法の提案などのコメントを歓迎します。

# 前提

以下の状況を想定しています。

- git で管理しているシェルスクリプト群をサーバに反映したい。
- シェルスクリプトを cron で定期実行している。

サーバはざっくり Linux を想定します。

具体的には Amazon Linux と、ローカル環境になりますが Windows の WSL2(Ubuntu) で実験した結果を元にしています。

参考記事によるとシェルスクリプトの動きは OS により多少の違いがあったりもするようですし、その他についても環境によっては本記事と異なる場合があります。


# 結論

git で管理しているシェルスクリプト群をサーバに安全にリリースする方法として以下の方法を考えます。

- シェルスクリプト群を一時ディレクトリに pull してから本ディレクトリに rsync で反映する。
- 一時ディレクトリと本ディレクトリは同一ファイルシステム上に確保する。

ただし、シェルスクリプト間に依存があり、ファイル更新のタイミングのズレが許容できないケースには対応できません。

例えば処理用シェルスクリプトからパラメータ用シェルスクリプトを実行しているようなケースでその両方を同時に更新する場合、２つのシェルの更新タイミングには隙間が発生します。

その隙間に cron による定期実行が行われる可能性があります。

それを許容できない場合は、cron による定期実行を停止し、実行状況を確認の上で実施するなどの適切な対応を採る必要があります。



# 解説
### 単純な git pull はダメ
関連記事などによると実行中シェルスクリプトを影響なく更新するためには既存ファイルの i-node とは別の i-node となるような方法で置き換えれば良いとのことです。要は別のファイルの実体で置き換えてくださいという意味です。

具体的な方法として、更新後の状態のファイルを一度別で作ってから既存のファイルに mv で上から被せるという方法があります。
似たコマンドでも cp による上書きは i-node が維持されるためこれを満たしません。

git pull によるファイル更新を実験したところ cp と同じく i-node は維持されることを確認しました。従って、git pull による直接反映は好ましくありません。

### rsync が使いやすそう
rsync は mv と同じような動きをします。

rsync によるローカル物理ファイルの同期は一時ファイルコピーを作ってから mv と同じく rename システムコールでファイルを置き換えます。

rsync には --inplace オプションがあり、これを指定した場合は cp と同じような動きになります。--inplace オプション未指定であれば上記の通り mv と同じような動きとなります。

一時ディレクトリから本ディレクトリへのシェルスクリプト群の一括反映を比較的簡単に書くことができます。

--delete オプションも指定すればシェルスクリプトの削除も反映できます。

実行中のシェルスクリプトを削除しても影響はありません。読込中ファイルの実体を Linux は裏で維持します。

調べていてこの事実には少し驚きましたが、実行中のファイルを置き換えても旧シェルスクリプトが継続して動作するのは同一の仕組みによるものなのだと思います。

### cron による定期実行のタイミングを気にする必要がない理由
rsync が内部で使用している rename システムコールはアトミック（並列実行による割り込み不可）な操作であるため cron による定期実行のタイミングを気にする必要はありません。

ただし、rename システムコールは変更元と変更先のファイルシステムが同一であることが条件のようなのでその点は注意しましょう。

条件を満たさない場合、rename システムコールとは別の手段が採用され、ファイル削除とファイル名変更の処理の間に隙間が生まれます。
タイミング次第で cron による定期実行の失敗が予想されます（これ未検証です）。

また、アトミック性は単一ファイルの操作に閉じているため複数ファイルの更新タイミングのズレを防ぐことはできません。



# 備考
ls の -i オプションを使うことでファイルの i-node 番号の確認ができることを今回初めて知りました。

試行錯誤するにあたってとても便利でした。
Userモデル作成

今週から人生初のオリジナルアプリの作成に取り掛かる。

作りたいアプリはグループ内で共有して使えるカレンダーアプリ。
コメント機能も実装して、グループ内でチャットもできるようにしたい。

昨日までの時点で一通りの企画と設計は完了。

![85678106-57E3-4FAE-85E9-4B6551CD7119.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533566/85cdd6e9-9734-eb44-8856-befad0d1be57.png)

usersテーブルの「所属名」と「部署名」は、同じ意味合いに気づき、所属名は削除することに。

早速``rails newコマンド``でアプリを新規作成。

ここからの手順としては以下の通り。
1: Userモデル作成
2: Groupモデル作成
3: Calendarモデル作成
4: Commentモデル作成

というわけで、本日はUserモデルに取り掛かる。

``rails g devise:install``と``rails g devise user``を実行。

カラムを追加

```ruby:..._devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name,               null: false, default: ""
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :department_name
```

バリデーションは以下の通り。

```ruby:user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  validates :name, presence: true
  validates :encrypted_password,:password,:password_confirmation,length:{minimum:6},format:{with: /(?=.[a-zA-Z])(?=.\d)[a-zA-Z\d]{6,}/}
  validates :department_name,  length: { maximum: 50 }
end
```
新規登録には、メアド、パスワード以外に名前も必須とした。
部署名は任意だが、文字数50文字までに制限している。

続いてビューファイルの追加。
``rails g devise:views``を実行。

ローカルサーバーを起動してみる。

**あれ？デフォルトのサインイン画面が出ない？**

なにか間違っているのかと、30分位考えたが、
ルーティングとコントローラーを設定していなかっただけだった笑
初歩的ミス・・・

``rails g controller users``を実行。
ユーザーの詳細ページをトップページにしようと思っていたいので、以下の2つを記述。

```ruby:routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: "users#show"
  resources :users, only: [:show]
end
```

```ruby:user_controller.rb
class UsersController < ApplicationController
  def show    
  end
end
```

さらにログアウト状態は常にログインページへ遷移させたいので、以下も記述。
```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :authenticate_user!
end
```

ローカルサーバーをリロード。
![スクリーンショット 2022-03-05 1.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533566/7e651469-cb1e-4c23-0d11-616c3f0976bd.png)

__できた！！__
いつもの味気ないページ笑

という事で、装飾はまた明日。
【G検定対策】機械学習に関連する思想

# 機械学習に関連する定理

### バーニーおじさんのルール
学習に際して，調整が必要なモデルのパラメータ数のおよそ10倍のデータは必要というヒューリスティック．

しかし，現実的には毎回このルールの適用は難しいため，データが少なくても済むような手法や，そもそもデータ数が数百個にも満たない場合は，データの収集から始めたり，ディープラーニング以外の手法を検討するべきである．

### ノーフリーランチ定理
あらゆる問題において，万能なアルゴリズムは理論上存在不可能という定理．

過学習を回避するための，早期終了(early stopping)のことを，ジェフェリー・ヒントンが *"Bautiful FREE LUNCH"* と表現しているが，この定理がもととなっている．

### みにくいアヒルの子定理
機械学習で「普通のアヒル」と「みにくいアヒル」の区別はできないということ．

### モラベックのパラドックス
機械にとって，1歳児レベルの知恵や運動能力を身につけるほうが，高度な推論よりも遥かに難しいという逆説．
Google Compute Engine の startup script で $ go install と インストールされたバイナリを実行する方法

## TL;DR

```bash
metadata_startup_script = <<-EOF
  #!/bin/bash
  TARGET_REPOSITORY_URL=github.com/... # ここは適宜差し替えてください
  TARGET_BIN_NAME=...                  # ここも
  mkdir /home/user
  export HOME=/home/user
  cd /usr/local/src
  wget https://go.dev/dl/go1.17.7.linux-amd64.tar.gz > /dev/null 2>&1
  tar -C /usr/local/ -xzf go*.tar.gz > /dev/null 2>&1
  GOCACHE=/usr/local/go/cache GOBIN=/usr/local/go/bin GOPATH=/usr/local/go /usr/local/go/bin/go install -v ${TARGET_REPOSITORY_URL}@latest
    /usr/local/go/bin/${TARGET_BIN_NAME}
EOF
```

## はじめに
Google Compute Engine には VM が起動する時に実行されるコマンドである `startup script` を設定できます。

ref: [Startup Scripts Overview](https://cloud.google.com/compute/docs/instances/startup-scripts)

最近は Terraform による GCP リソースの宣言的な管理をされることが増えてきたため、この機能を利用する方も増えてきたのではないでしょうか？

私もその1人だったのですが、下記の通り書いただけでは起動してくれませんでした。なお、これらのインストールコマンドは [Go の公式インストール方法](https://go.dev/doc/install) を引用しています。

```bash
metadata_startup_script = <<-EOF
  #!/bin/bash
  TARGET_REPOSITORY_URL=github.com/... # ここは適宜差し替えてください
  TARGET_BIN_NAME=...                  # ここも

  wget https://go.dev/dl/go1.17.8.linux-amd64.tar.gz
  rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.8.linux-amd64.tar.gz
  export PATH=$PATH:/usr/local/go/bin
  export GOBIN=~/go/bin
  
  go install -v ${TARGET_REPOSITORY_URL}@latest
  ${TARGET_BIN_NAME}  
EOF
```

最終的に解決できたものの、同じ問題に対して記事を書いている方が見当たらなかったため、本記事では

- 実行できなかった原因と解決策
- startup script のデバッグ方法

の2つに絞って紹介します。

**とはいえ、ドキュメントに全部書いてあったので、こんな記事読むより公式のドキュメント読んでください。**

- [Startup Scripts Overview](https://cloud.google.com/compute/docs/instances/startup-scripts)


## 実行できなかった原因
`startup script` が **root ユーザ** として実行されており、 `$HOME` 等の環境変数も利用できなかったためです。

ドキュメントには、下記の通り書かれています。

> Compute Engine は次の処理を行います。
> 1. 起動スクリプトを VM にコピーする
> 2. 起動スクリプトの実行権限を設定する
> 3. VM の起動時に **root ユーザーとして起動スクリプトを実行する**

ref: [Linux VM での起動スクリプトの使用](https://cloud.google.com/compute/docs/instances/startup-scripts/linux#passing-directly)

そのため、環境変数 `HOME` や `GOPATH`、`GOBIN`、 `GOCACHE` あたりを明示的に書けば良いです[^1]。

## startup script のデバッグ方法
[公式ドキュメント](https://cloud.google.com/compute/docs/troubleshooting/vm-startup)を読んでください。

起動スクリプトが失敗した原因は、 ssh 等で VM に入ってから下記コマンドを実行してください。

```bash
sudo journalctl -u google-startup-scripts.service
```

また、この `journalctl` のログは、 `wget` や `tar` の解凍時のログ出力により、読みたい部分が消えていることがあります(ありました)。そのため、 冗長なログ出力をするコマンドがある場合は、検証中のみ `startup sciprt` における出力を `> /dev/null 2>&1` を末尾につけて消すことが効果的です。

ただし、実行に失敗していることも気づけなくなるので、問題の切り分けを行った上で実施してください。

## おわりに
冒頭で提示したスクリプトはあくまでシュッと書いたものなので、もっとイケてる書き方があれば教えてください。
この記事が少しでも参考になれば幸いです。


[^1]: [GOCACHE は HOME を参照するので設定しなくても良いです](https://pkg.go.dev/os#UserCacheDir)
VSCodeでJavaの開発環境を構築する(Mac向け)

Java言語の勉強をしようとして、VSCodeで開発環境を構築するのに少し手こずってしまった…
とりあえず構築はできて、（今のところ）問題なく学習をやれてるので記事にしようかと思います。
あくまで自分がやった通りの手順を書いていきます。

# その前に
## Javaの開発に必要なツール
①ソースコードの作成と編集（今回は`VSCode`を使用）

②コンパイルによる変換（Javaコンパイラ）
**コンパイルとは**
ソースコードはそのままだと実行できないので、まずコンパイルと言う処理を行い、ソースファイルをクラスファイル（拡張子.class)に変換します。
クラスファイルにはソースコードの各命令をコンピュータが実行しやすいように変換したバイトコードが中に詰まっている。

③完成プログラムの実行（Javaインタプリタ)
バイトコードではまだ実行ができないので、**インタプリタ**というソフトウェアに対してバイトコードの変換と実行を依頼します。インタプリタ内の`JVM(Java Virtual Machine)`という仕組みでバイトコードを読み込みながらマシンコードに翻訳すると共にCPUに送って処理を実行させます。

## JDK(Java Development Kit)
Javaプログラムの開発に必要な各種ツールやAPIライブラリを詰め合わせたもの。
JDKをインストールすることで、上記の`②に必要なjavaのコンパイラや、③で必要なインタプリタをなどを利用できる`ようになります。

# それでは環境構築をやっていく
VSCodeは使用できる状態という前提で進めていきます。
## JDKのインストール
JDKはさまざまなコミュニティから提供されていますが、ここでは**AdoptOpenJDK**によるJDKの導入手順を紹介します。

まずは以下のリンクへ
[AdoptOpenJDK](https://adoptopenjdk.net/)

[![Image from Gyazo](https://i.gyazo.com/44248e1a88d09a2aeac6bdd3e6551ccb.png)](https://gyazo.com/44248e1a88d09a2aeac6bdd3e6551ccb)
最初からチェックがついているので、そのまま「asoptium.net」をクリック
[![Image from Gyazo](https://i.gyazo.com/ecf5790e877ab88440592b2e4a3e3b80.png)](https://gyazo.com/ecf5790e877ab88440592b2e4a3e3b80)

僕はtemurin11にチェックして「Latest release」をクリック。ここは１７にしてもよかったかなと思ってます。
するとファイルがダウンロードされます。

ダウンロードされたファイルを開くとインストーラーが起動します。
「続ける」や「同意する」をクリックして先に進めていき、インストールを完了させます。

## セットアップを確認する
JDKが正しく導入されたかを確認します。
ターミナル画面を起動し、次の2つのコマンドを1つずつ入力します。

```
java -version
```

```
javac -version
```

いずれも、インストールしたバージョン番号（"11.0.6"など）が正しく表示されるか確認してください。
確認ができたらインストールは完了です。

## VSCodeで拡張機能を追加する
「Extension Pack for Java」という拡張機能をインストールします。
[![Image from Gyazo](https://i.gyazo.com/bc2204f1a35c2fd651ca238ca04e1136.png)](https://gyazo.com/bc2204f1a35c2fd651ca238ca04e1136)

## 実際にコードを書いて実行してみる
①フォルダを作成（名前はお好きに）
②新規エディタでコードを書いて、フォルダに保存(拡張子は.java)

```java:Sample.java
public class Sample{
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}
```

③ターミナルを起動させ、カレントディレクトリを先ほど保存したjavaファイルのあるディレクトリ（フォルダ)に変更します
④作成したjavaファイルを「javac ファイル名.java」のコマンドでコンパイルします。
　
```zsh:ターミナル
javac Sample.java
```
コンパイルが成功すると、javaファイルを保存したフォルダに「classファイル」が生成されます。
⑤「java クラス名」のコマンドで、classファイルを実行します。
```zsh:ターミナル
java　Sample
=>Hello World!
```
　

# 最後に
以上が自分が行った開発環境構築の手順です。
Javaは初めてで正直これで大丈夫なのか不安なところではありますが、問題なく勉強がスタートできてよかった。
もし、有識者の方で「間違ってる」や「これもしとくべき」などご意見ありましたら、コメントいただけると幸いです。
【G検定対策】機械学習のモデルの評価 2 「説明可能なAI (XAI)」

この記事の続きからはじまります．

https://qiita.com/Rumi_Yamaguchi/items/3e04ac4134692d8462ca

# モデル性能の評価方法

### ROC曲線 (receiver operating characteristic curve)
ロジスティック回帰で設定するような閾値を変化させた場合に，予測の当たり外れがどのように変化するのかを表した曲線．視覚的にモデルの性能を捉えることが可能．

### AUC (area under the curve)
ROC曲線を描いた際の，曲線より下の面積のことを指す．AUCが1に近ければ近いほど，モデル性能が高い．

# モデルの解釈
### LIME
複雑なモデルを，特定のデータを対象に単純な線形モデルへ近似することによって，局所的に予測の説明をしやすくしている．

### SHAP (SHapley Additive exPlanations）
各特徴の予想に対しての寄与度を算出し，モデルを解釈する手法．

https://qiita.com/shin_mura/items/cde01198552eda9146b7

# モデルの選択

### オッカムの剃刀 (Occam's razor / Ockham's razor)
「任意の事柄を説明するためには，必要以上に多くを仮定するべきでない」という指針．

### 赤池情報量規準 (Akaike's Information Criterion, AIC)
モデルの複雑さと予測精度のバランスを考えた式のこと．(式略)

# 見るべき解説動画
https://www.youtube.com/watch?v=FywetXSZPG0

https://www.youtube.com/watch?v=YuG1jCkvdjE

https://www.youtube.com/watch?v=VyJK37qMBhg

https://www.youtube.com/watch?v=mU3L6gvt57g

https://www.youtube.com/watch?v=LCdxKGVGN4c

https://www.youtube.com/watch?v=6iq4R_NJqKE

https://www.youtube.com/watch?v=uD-SPmBd504

# 数式を交えた解説動画
https://www.youtube.com/watch?v=d6j6bofhj2M

# ハンズオンによる説明
https://www.youtube.com/watch?v=CV9FTCvQ32Q
Javascript DOMContentLoaded & loadイベント

外部からjsファイルをheadタグ内で読みこみbodyタグにあるbuttonタグのクリックをきっかけに処理をする為にjsの処理としてDOMContentLoadedイベントを使用しました。
これと似たイベントでloadイベントというのもあると発見したので今後意識して使い分けられるように記録します。

**DOMContentLoadedイベント** : HTMLの解釈が完了したタイミングで発生。
**loadイベント** : HTMLに加えて画像の読み込みも完了したタイミングで発生。

前回使用したケースは画像の読み込みは関係なかった為、DOMContentLoadedで問題なく処理できましたが、それでいい気になって今後画像の読み込みが関わる時にエラーで嵌らないように上記２つのタイミングの違いは意識していきたいと思います。
VScodeのSSH-FSでオンザフライ編集（sudo-root権限編集）できるようにする

- VScodeの拡張機能`SSH FS`についてです。
- `SSH FS`は便利ですよね。個人的には`Remote Development`よりも好きです
- `SSH FS`も`Remote Development`も、ただ接続しただけでは、ファイルの編集ができません（編集はできるけど、書き込み・保存ができない）
- `SSH FS`は、オプションに１行追加するだけで直接編集（sudoコマンド編集、root権限編集、オンザフライ編集）ができるようになります
- Windowsの場合は、どうするんだろう...？


# 拡張機能
https://marketplace.visualstudio.com/items?itemName=Kelvin.vscode-sshfs

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

# SSH-FSで直接編集できるようにする
- 方法は、ココに記載がありました。

[SFTP Command/Sudo and Terminal command](https://marketplace.visualstudio.com/items?itemName=Kelvin.vscode-sshfs#sftp-commandsudo-and-terminal-command) から抜粋

> The SFTP Command setting allows specifying to use a certain command instead of the default subsystem. The SFTP Sudo setting makes the extension try to create a sudo shell (for the given user, or whatever sudo defaults to) and run SFTP Command (or /usr/lib/openssh/sftp-server by default). For most users, setting this to <Default> should allow operating on the remote file system as root. Power users with esoteric setups can resort to changing SFTP Command to e.g. sudo /some-sftp-server, but might run into trouble with password prompts.
> (翻訳)
> SFTPコマンドの設定では、デフォルトのサブシステムではなく、特定のコマンドを使用するように指定することができます。SFTP Sudo 設定は、拡張機能が sudo シェル (指定されたユーザーまたは sudo のデフォルト) を作成し、SFTP コマンド (またはデフォルトで /usr/lib/openssh/sftp-server) を実行しようとするようにします。ほとんどのユーザーは、これを <Default> に設定することで、リモートファイルシステム上で root として操作できるようになります。難解なセットアップを行うパワーユーザは、SFTP コマンドを sudo /some-sftp-server などに変更することができますが、パスワードプロンプトでトラブルに巻き込まれる可能性があります。

- つまり、こういうことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/c2b687b3-befd-c760-7025-114a142aab7d.png)

- ssh-fｓの該当するconfig（設定）を開いて
- [SFTP Command]のところに`/usr/lib/openssh/sftp-server`と入力
- [SFTP Sudo]のプルダウンを`<Default>`にして保存してください。
- この状態で、該当のサーバーへつなげば、直接編集ができるようになると思います。

:thumbsup_tone2:
SageMakerのあれこれ

最近SageMakerについていろいろ試行錯誤してたのですが、概念的なところがいまいちわからなかったのがようやくわかってきたので解説

# SageMakerとは
機械学習にまつわる機能がいろいろ入ったMLOpsサービス群の総称

- 前処理のデータ加工も
- モデル学習も
- 推論エンドポイントも
- 機械学習パイプラインも
- 実験管理も
- ぜーーーんぶおまかせ

なやつ。
そのかわり機能多すぎて初心者には何を使っていいのやらわけわからないことが多かったりしたので軽く解説します

## いろいろ便利なSageMakerStudio
- 基本的にはJupyterLabでノートブックを動かせる環境
    - 普通にノートブックを使って研究開発できる
    - ノートブックからデータ加工やモデル学習のJob実行命令（後述）を行うこともできる
        - Jobはノートブックとは別環境で処理が実行できる
    - 推論エンドポイントにモデルをデプロイすると、リアルタイム推論APIを自動でデプロイしてる
- データまわりでいろいろできるData Wranglerとか実験管理ツールのExperimentとかもいろいろ使える
    - このへんはあまり詳しくないので割愛
- セキュリティ要件があるときは構築がちょっと大変
    - このあたりが参考になります
    - https://aws.amazon.com/jp/blogs/news/internet-free-sagemaker/
    - https://dev.classmethod.jp/articles/sagemaker-network-vpc/
- 画面は公式ドキュメント参照
    - https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/studio-ui.html

## データ加工や学習に便利なJob
- SageMakerにはProcessingJobやTrainingJobといった「Job」という概念がある
- データ加工やモデル学習などの一連の処理をやってくれる機能
    - 実行命令すると、インスタンスを起動して処理を実行し、作業完了したらインスタンスを終了させてくれる
    - 勝手に終了してくれるので、ハイスペックマシンを使いたくても起動しっぱなしは課金額が気になる、というときに便利
- ProcessingJobの概念
    - https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/processing-job.html
- 学習の概念（わかりにくい）
    - https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/how-it-works-training.html

ProcessingJobの例

```py
from sagemaker.sklearn.processing import SKLearnProcessor
# processingの設定（ベースのDockerイメージやインスタンスタイプを指定）
# SKLearnProcessor: SKLearnのDockerイメージ（SageMakerの提供）を使用してジョブを実行
processor = SKLearnProcessor(
    framework_version="0.23-1",
    role=role,
    instance_type=processing_instance_type,
    instance_count=processing_instance_count,
    env={"AWS_DEFAULT_REGION": region},
    max_runtime_in_seconds=7200,
)

from sagemaker.processing import ProcessingInput, ProcessingOutput
# processing jobの実行
processor.run(
    # 加工処理の実装をしたpythonファイルを指定する
    code="preprocess-scikit-text-to-bert-feature-store.py",
    inputs=[
        ProcessingInput(
            input_name="raw-input-data",
            source=raw_input_data_s3_uri,
            destination="/opt/ml/processing/input/data/",
            s3_data_distribution_type="ShardedByS3Key",
        )
    ],
    outputs=[
        ProcessingOutput(
            output_name="bert-train",
            s3_upload_mode="EndOfJob",
            source="/opt/ml/processing/output/bert/train"
        )
    ],
    experiment_config=experiment_config,
    logs=True,
    wait=False,
)
```

## ノートブックインスタンス
- ただのノートブックインスタンス。ノートブック用の環境。
- ノートブックだけ使えればいいよ、というときに使える
- SageMakerStudioは設定が面倒くさいからとりあえずサクッと使いたいときにはいいかも
- ぐぐってるとSageMakerStudioのノートブックなのか、ノートブックインスタンスなのか、によって操作が違ったりするので注意
    - ややこしいよ！！

## 推論エンドポイント
- リアルタイム推論APIのエンドポイント
- 学習済みのモデルをデプロイすると、自動でリアルタイム推論APIのアプリケーションをデプロイしてくれる
- 実行中は課金が発生するので注意。終わったら終了させておくこと
- オートスケール機能とかある
- 本番運用に耐えうるかはわからない。アプリの構築とかやりたくない人には向いているかも
- デプロイ処理の説明
    - https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/how-it-works-deployment.html

## ほかにも
- 特徴量を管理したり
- AutoMLだったり
- データの品質評価したり
- ラベリングの補助だったり

いろいろあるよ！！ぜんぜんつかいこなせてないけど！！！
【G検定対策】機械学習のモデルの評価 1 (wip)

# 交差検証 (クロスバリデーション)
**交差検証**とは，全データを**訓練データ**(学習用データ)と**テストデータ**(評価用のデータ)と分割して評価することである．

### ホールドアウト検証

全データを事前に訓練データとテストデータに分割し，検証評価する．またモデルが過学習していないかを調べるために用いる．

### k-分割交差検証
データをk分割してk個のブロックを作り，
1個目のブロックをテストデータ，残りを訓練データとして検証．
次に，2個目のブロックをテストデータ，残りを訓練データとして検証．
…とk通りのホールドアウト検証を行う．計算量が多くなるが，その分信頼した精度が得られる．

# 評価指標
### 正解率 (accuracy)
全データ中，どれだけ予測が当たったかの割合．

#### 混同行列
**真陽性**(True Positive：TP)
**偽陽性**(False Positive：FP)
**偽陰性**(False Negative：FN)
**真陰性**(True Negative：TN)

### 適合率 (precision)
予測が正の中で，実際に正であったものの割合．

### 再現率 (recall)
実際に正であったものの中で，正と予測できた割合．

### F値 (F measure)
適合率と再現率の調和平均．

# 正則化
過学習を抑制するための手法．正則化しすぎると今度は未学習に陥る場合がある．

### L1正則化
一部のパラメータの値を0にすることで，特徴選択を行うことができる．ex)**ラッソ回帰**

### L2正則化
パラメータの大きさに応じて0に近づけることで，汎化された滑らかなモデルが得られる．ex)**リッジ回帰**

上記両者の線形回帰手法を合わせて，**Elastic Net**という．

# 見るべき解説動画
https://www.youtube.com/watch?v=14BKdzNu_QU

https://www.youtube.com/watch?v=FywetXSZPG0

# 数式を交えた解説動画
https://www.youtube.com/watch?v=0_ZtMUJ2Mg8

# ハンズオンによる説明
https://www.youtube.com/watch?v=UIR7R2IsL7E

https://www.youtube.com/watch?v=TtIjAiSojFE
Windows10で突然adbが動かなくなった件

バリバリアプリを作っていたところ、突然AndroidStudioからデバイスが一切表示されないようになった。
Evet Logをみたところ
```
* daemon not running; starting now at tcp:5037
```
netstatを見ても何もない。。。

```
netstat -ano |findstr 5037
```

再起動してもダメ。
仕方がないのでダメ元でPORTを変えてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1157438/a0aa925b-cbd5-937b-2f2b-0eda787b152b.png)

釈然としないけど無事に繋がった。
開発が終わったら深掘りしないと。。。
ガウス過程回帰で描かれている「モノ」

### ノート
ガウス過程の回帰で、実際に図でplotされているモノがなんなのか、直感的に理解したい。コードを書いてみるのが一番だろう。多次元正規分布からのサンプリングにはscipyを用いましたが、それ以外は他のモジュールは用いずnumpyで書くのが理解のためにはいい気がします。(このレベルでも可能な限りブラックボックスは避けたい)
式の導出とかはやりません。
```python
import numpy as np
import matplotlib.pyplot as pl
from scipy.stats import multivariate_normal
%matplotlib inline
%config InlineBackend.figure_formats = {'png', 'retina'}
import matplotlib as mpl
pl.rcParams["figure.figsize"] = (6, 5)
mpl.rc('font',**{'family':'serif','serif':['Palatino']})
mpl.rcParams['axes.labelsize'] = 18
mpl.rcParams['xtick.labelsize'] = 15
mpl.rcParams['ytick.labelsize'] = 15
mpl.rcParams['axes.titlesize'] = 18
```
### データの生成
```python
np.random.seed(5)
N_data = 8
x_obs = np.random.uniform(-5,5,N_data)
y_obs = np.random.uniform(-1,1,N_data)
pl.scatter(x_obs,y_obs)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392455/a98c7667-25ab-1014-b5c5-af4207fbf9fc.png)
これに対して、ガウス過程回帰を行う。
### カーネル関数の用意
今回は、ガウスカーネル(同径基底関数 Radial Basis Function, RBF)を使います。
$$K(x_i,x_j)=\theta_{1}\exp\left({-\frac{|x_i-x_j|^2}{\theta_{2}}}\right)$$
```python
theta1 = 1
theta2 = 2
def RBF(x,x_pred,t1,t2):
    return t1*np.exp(-np.abs(x[:,np.newaxis]-x_pred[:,np.newaxis].T)**2/t2)
N_model = 100 # ガウス過程からのサンプル点の数
x_model = np.linspace(-6,6,N_model)
K_tmp = RBF(x_model,x_model,theta1,theta2)
pl.imshow(K_tmp)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392455/ad94a3bd-0790-9e5b-33ae-e12883c907f7.png)
カーネル関数をplotすると、このような感じ。
続けて、ガウス過程回帰で必要な行列を用意する。
```python
K   = RBF(x_obs,x_obs,theta1,theta2)
Ks  = RBF(x_obs,x_model,theta1,theta2)
Kss = RBF(x_model,x_model,theta1,theta2)
print(np.shape(K))
print(np.shape(Ks))
print(np.shape(Kss))
```
```terminal
(8, 8)
(8, 100)
(100, 100)
```
今、存在するデータ点に対して、ガウス過程が成り立っているとき、同様に
```math
{\bf y}\sim\mathcal{N}({\bf 0,K})
```
である。この上で、更なるデータ点群${\bf y_\star}$に対してもガウス過程が成り立っているので、
```math
{\bf y^\star} \sim \mathcal{N}({{\bf 0,K_\star}})
```
が成り立つ。すなわち、
```math
\left(
\begin{array}{c}
{\bf y} \\
{\bf y^\star}
\end{array}
\right) \sim \mathcal{N}\left({\bf 0},
\left(
\begin{array}{c}
{\bf K}\;,{\bf k_\star} \\
{\bf k}^T_\star\;,{\bf k}_{\star\star}
\end{array}
\right)
\right)
```
である。
上のpythonコードでは、
$K={\bf K}$
$K_S={\bf k}^T_\star$
$K_{SS}={\bf k}_{\star\star}$
に対応している。このガウス過程に従う予測される点の平均と分散値は、
```math
p(y_\star|x_\star,x)=\mathcal{N}({\bf k_\star}{\bf K}^{-1}{\bf y},{\bf k_{\star\star}}-{\bf k^T_\star K^{-1}k_\star})
```
と導かれているため、これが予測分布となる。この多次元正規分布を$\mathcal{N}({\bf \mu, L})$としましょう。
```python
mu_post = (Ks.T@np.linalg.inv(K))@y_obs
L_post = Kss - Ks.T@np.linalg.inv(K)@Ks
n_sample = 20 
y_pred = multivariate_normal(mu_post,L_post,allow_singular=True).rvs(n_sample)
pl.plot(x_model,y_pred.T, "gray",zorder=-1,alpha=0.5) 
pl.scatter(x_obs,y_obs,c="red")
pl.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2392455/e645340e-de32-9278-e463-bb7cd33b0d2b.png)
ガウス過程による予測分布が書けました。
docker-compose/singularity でサクッと PostgreSQLサーバ を立てる

標記の件です。ここは手を抜くべきところですのでコピペして終わりにしましょう。~~こんなところでつまづいてないでさっさと研究した方がいい~~

# docker-compose版

Dockerが使える環境にある人は運がいい。脳死で動かせます。（ネットの記事も充実しているのでそっちを読んだ方がいいかもしれません。例えば[^1]）

下記のdocker-compose をコピペして `docker-compose up`すれば完了です。（まあセキュリティの都合でポートが空いてない場合はめんどくさいが。。）

```docker-compose.yml
version: "3"
services:
  postgres:
    image: postgres:14-alpine3.15
    container_name: postgres
    ports:
      - 5432:5432
    volumes:
      - ${PWD}/postgres/init:/docker-entrypoint-initdb.d
      - ${PWD}/postgres/data:/var/lib/postgresql/data
    environment:
      TZ: Asia/Tokyo
      POSTGRES_USER: optuna
      POSTGRES_PASSWORD: optunaxxxx
      POSTGRES_DB: optuna_db
      POSTGRES_INITDB_ARGS: --encoding=UTF-8
    restart: always
```

\* ユーザ名/パスワード/DB名がoptunaなのは[Optuna](https://www.preferred.jp/ja/projects/optuna/)を使ってみたかったからですね[^2]。実用上は別に何でもいいです。

# Singularity版

「Dockerありますか？」「そこになければないですね」
令和にもなって信じられない話ですがスパコン業界では常識です。まあCPU効率最適化とかあるので、仮想化してユーザにroot与えるとかは厳しいんでしょうね。。。

というわけで代わりにSingularity[^3]を使います。こっちは少しめんどくさい[^4]。

(1)  Postgresのイメージを手元に置く
```bash
singularity pull docker://postgres:14-alpine3.15
```
(2) 環境変数用のスクリプトを書く（singularityのbashrc相当）
```env.sh
export TZ=Asia/Tokyo
export POSTGRES_USER=optuna
export POSTGRES_PASSWORD=optunaxxxx
export POSTGRES_DB=optuna_db
export POSTGRES_INITDB_ARGS="--encoding=UTF-8"
``` 
(3) singularity runを実行する
```bash
mkdir -p postgres/{data,run}
. ${PWD}/env.sh

singularity run \
    -B ${PWD}/postgres/data:/var/lib/postgresql/data \
    -B ${PWD}/postgres/run:/var/run/postgresql \
    -e \
    -C --env-file ${PWD}/env.sh \
    ${PWD}/postgres_14-alpine3.15.sif \
```
以上です。[^5]

[^1]: https://qiita.com/mabubu0203/items/5cdff1caf2b024df1d95
[^2]: 話がそれますが、Optunaで使うときは ```study = optuna.create_study(study_name=<any_study_name>, storage='postgresql://optuna:optunaxxxx@<hostname>/optuna_db', load_if_exists=True)```
などとすればいいようです。
[^3]: Singularity: https://sylabs.io
[^4]: [singularity-compose](https://singularityhub.github.io/singularity-compose/#/) なんかもあるんですが、当方の環境では`fakeroot`が使えず断念しました。。。いい環境があれば追記するかも。
[^5]: なんで `env.sh` を2回呼んでるんや？と思った方は勘がいいです。本来は`singularity -C --env-file </path/to/env_file>`だけでいいはずです。ただ、これは私も良く分からないのですが、動いたり動かなかったりするので、念の為ホスト環境で事前にsourceした方が安全です。
バイオインフォ関連の簡単な問題を解いてみる(2)

[データサイエンス研修 生命情報学コース](https://aihospital.ncchd.go.jp/foxglovetree/)というページで、バイオインフォマティクスに関連したデータ処理（主にテキストの処理）の問題を出し合ってみんなで解いてみようというようなことをしています。
こちらの記事 [バイオインフォ関連の簡単な問題を解いてみる(1)](https://qiita.com/motthy/items/f2c31392be3fddbef14a)の続きです。


2番目の問題
**データサイエンス研修 生命情報学コース 練習問題 fq00006**

:::note
問題の引用をする場合は上記コース名と問題番号を記載してください
:::

```
テキストファイルの入出力のプログラミングを行います。
まず塩基配列をFASTA形式でテキストファイルに保存してください。
このファイル名を何らかの形で指定し、標準入力を介さずに読み込みます。
FASTA形式でなかった場合は、標準エラー出力にメッセージを表示し、実行を止めてください。
問題がなければ、塩基配列を扱うライブラリやモジュールなどを使わずに
独自の文字および文字列処理を行って相補配列に変換、
FASTAヘッダを適当な文字列に変更し、
相補鎖の5'側から3'側に向かう塩基配列を標準出力を利用せず、
別な新規テキストファイルに入力と同じFASTA形式で出力してください。
入力データについては
例えば以下のURLから得られるデータを NM_001167589.fna などと保存して利用してください。
https://www.ncbi.nlm.nih.gov/nuccore/NM_001167589?report=fasta&format=text
```
シェルスクリプトで解けるのか？
しかもワンライナーで解こうとしているけど大丈夫か？

とりあえずfasta形式のファイルと偽fasta形式（?)のファイルを用意します。
```
% more sequence.fasta|head -2
>LC511682.1 Homo sapiens CYP1A1 gene, partial sequence
ACCCATCTGAGTTCCTACCTGAACGGTTTCTCACCCCTGATGGTGCTATCGACAAGGTGTTAAGTGAGAA

 % more seq_gb.fasta|head -2
LOCUS       LC511682                 251 bp    DNA     linear   PRI 29-NOV-2019
DEFINITION  Homo sapiens CYP1A1 gene, partial sequence.
```
長いので頭2行だけ表示しました。`seq_gb.fasta`は拡張子を`.fasta`にしましたが、fasta形式ではなくGenbank形式です。こちらでエラーのテストをします。

では処理を考えましょう。

**「このファイル名を何らかの形で指定し、標準入力を介さずに読み込みます。」**

最初からわからん...「標準入力を介さずに」ってどういうこと？
コマンドラインの引数にするのかな？それだとワンライナーは無理かもしれない。

途中でupしてもいいということだったので追記していきます。(2022-03-04)
Laravel:emptyの罠

emptyの使い方、完全に勘違いしていた。

Laravelのcollectionに対して空かどうかの判定はisEmpty()を使う。
普通にforeachでイテレートできるのでempty(collect([]))で判定できるもんだと思っていたら、全部trueになってた。

[Laravel 5.8 コレクション](https://readouble.com/laravel/5.8/ja/collections.html)
>Illuminate\Support\Collectionクラスは配列データを操作するための、書きやすく使いやすいラッパーです。

例えばこのような例や
```php
$collection = collect([]);
while(!empty($collection)) {
    // do
}
// => 無限ループする
```

ガード節などでうまくいかない。
```php
if (!$collection) {
    return; // => ここに入ることはない。
}
// do
```

友人の言葉を借りると、
```php
empty($var)は !isset($var) || $var == falseのこと
$var = collect([])であるとすると、
値であるcollect([]) を代入しているから
!isset($var) // === false 
($var == false) // === false
より常にtrueになる
```

ちなみにisEmptyは内部でemptyを呼び出している。
```collection.php
public function __construct($items = [])
{
    $this->items = $this->getArrayableItems($items);
}

protected function getArrayableItems($items)
{
    if (is_array($items)) {
        return $items;
    } elseif ($items instanceof self) {
        // collection => array
        return $items->all();
    }  //...
}

public function isEmpty()
{
    return empty($this->items);
}
```

# まとめ
collection(というか自作クラス）にはemptyは使えない。
emptyやissetだけだと意図が伝わりにくいので、is_nullや比較演算子などで書いた方が良い気がした。
あとはLarastan入れれば教えてくれる見たい。
emptyの諸々の判定はマニュアルを見てください。

https://www.php.net/manual/ja/types.comparisons.php


そういえば、phpってなんでコレクションないんだろう。
Bindingの簡単な設定方法




# 初めに
Bindingの設定をするのに　まだ完全に身についておらず、過去自分の作業したものを遡ったり、他の記事を探したりするのが億劫になったので議事録としてBindingの設定方法を残しておきます

まずは　BindingさせたいLayout.xmlとBindingを使用したいClassを用意します
```php:activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

```php:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
```

# ここからBindingの設定を追加していく

```php:activity_main.xml
<layout>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
```

xmlでは　元々あったLayoutのさらに親のLayoutを設定します
```
 <layout>
```
というLayoutを設定します
xmlの設定は以上です
次はクラスの設定です

```
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
        setContentView(binding.root)


        binding.textView.text = "Hello World!"
    }
}
```
R.idでLayoutを指定したいたものをbindingに変えることができました

これによりxmlのtext_viewとIDがついたTextViewに"Hello World!"という文字を設定できます
BindingされたLayoutの指定を行うときは　IDを"_"を省略し、"_"の後は頭文字を大文字にしすることでViewやLayoutを指定できます