OmniAICreator/Qiita-1.07M huggingface dataset:
Metaの自己教師あり学習モデルData2vecについて

<h1>はじめに</h1>
知識を得るために、この記事を書いてみた。

<h1>背景</h1>
<h4>現在の深層ニューラルネットワークが直面する課題</h4>

![Data2vec.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/8ff354b8-7d57-6288-ad71-d5a6c271275a.jpeg)

上の図を見ればわかると思うが、簡潔に解説すると、物体を識別するために設計されたアルゴリズムは、テキストなどの別のモダリティ (modality)に直接適用できない。テキスなどを解析するために設計されたアルゴリズムは、物体の認識には直接適応できない。

そこで、Data2vecの誕生により、前述の問題を解消できる。

:::note info
※モダリティ (modality)とは、話している内容や聞き手に対する話し手の判断や態度（attitude）に関する言語表現の概念体系である。例えば、「きっと雨が降るだろう」という文では、「雨が降る」ということに対する話し手の推測が「きっと～だろう」によって表されているので、この部分がモダリティ形式であるといえる。モダリティには「きっと～だろう」で表されるような事柄に対する対事モダリティと「おいしいね」「おもしろいよ」の「ね」や「よ」のような形式で表される聞き手に対する対人モダリティとがある。
:::

https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%80%E3%83%AA%E3%83%86%E3%82%A3



<h1>「Data2vec」とは</h1>

Data2vecとは、Meta AIチームが開発した「画像、テキスト、音声」に関する自己監視型ディープラーニングのための統合フレームワークである。

Baevski氏らによれば、Data2vecでは、GoogleのAshish Vaswani氏らが2017年に開発したニューラルネットワーク「Transformer」を採用し、自己教師あり学習を用いて、同じ構造で、画像、音声、テキストのすべてを訓練できる。

<table>
  <caption>Data2vecの特徴</caption>
  <thead>
    <tr>
      <th>No.</th> <th>特徴</th>
    </tr>
  </thead>
  <tr>
    <td>１</td> <td>ラベル付きデータに頼らず、与えられたデータの表現方法（画像、テキスト、音声）を予測する方法を学習することで、さまざまな種類のデータを扱うことを学ぶ。</td>
  </tr>
  <tr>
    <td>２</td> <td>画像が与えられた場合は次のピクセルを、音声の場合は次の発話を、文章の場合は単語を埋めることを推測しなければならないことを知っている。</td>
  </tr>
</table>




:::note info
Baevski氏らがData2vecに関する論文の執筆者。

論文詳細は「参考文献」まで
:::


<h1>「Data2vec」における訓練の仕組み</h1>

下記の図は、Data2vecが異なるモダリティに対して同じ学習プロセスを踏む様子を示す。

![スクリーンショット 2022-12-23 19.36.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/d781c824-ddef-3fae-227a-19084b487304.png)

<h4>（１）まず、学習タスクの入力例(教師側)の表現を生成する。</h4>
例えば、図の「Original」の入力データ「犬」を画像の表現、「発話」を音声の表現、「I like tea with milk」をテキストの表現でそれぞれ生成する。
<h4>（２）次に、学習させるデータの一部を黒塗りにして伏せる作業を行わせる。</h4>
例えば、図の「Masked」の入力データは、それぞれの一部を黒塗りにしている。
<h4>（３）生徒側が伏せられた部分を予測して埋める。</h4>

<h4>（４）（３）の作業を繰り返すことで自己学習を深めていく。</h4>







![ds-300x169.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3007201/00b95701-e3a6-d697-f233-d8ea0543a22f.gif)




<h1>「Data2vec」の汎用性</h1>
Data2vecの誕生により、より一般的な教師あり学習への道が開かれ、モダリティを組み合わせて、複雑なテーマを学習するマルチタスクAIモデルを構築することが可能になると期待されている。さらに、将来的には、匂い、3Dオブジェクトなどの概念をモデル化するために、より広範囲のデータを取り込むことができる（Baevski,2022）。

<h1>「Data2vec」を試してみた</h1>

モデル自体はdata2vecのREADMEに記載のリンクからダウンロードできる。

https://github.com/facebookresearch/fairseq/tree/main/examples/data2vec#training-a-new-nlp-model-with-the-cli-tools

https://github.com/arxyzan/data2vec-pytorch


データセットや環境構築は時間がかかりそなので、今回は利便性と再現性のために、以下のツールで試してみた。


https://huggingface.co/spaces/Generaltoa/facebook-data2vec-text-base




<h1>参考文献</h1>
１、Alexei Baevski, Wei-Ning Hsu, Qiantong Xu, Arun Babu, Jiatao Gu, Michael Auli, Data2vec: A General Framework for Self-supervised Learning in Speech, Vision and Language, arXiv - CS - Computation and Language, 2022


https://arxiv.org/abs/2202.03555

２、Alexei Baevski, Arun Babu, Wei-Ning Hsu, Michael Auli, Efficient Self-supervised Learning with Contextualized Target Representations for Vision, Speech and Language, arXiv - CS - Computation and Language, 2022

https://arxiv.org/abs/2212.07525
Dockerの停止済コンテナが削除できない場合の対応方法

停止済のコンテナを削除した際にエラーが発生して削除できない事象が発生したので、対応方法をメモしておく。

### エラー内容
```bash
user@server:~/docker/app1 $ docker-compose down
Removing app1 ... error

ERROR: for app1  removal of container eb23b2419de65c7a10204c41e2663abb8bdd304f1b5ebb6959e8b92575f5c399 is already in progress
Removing network app1_default
```

### 対応方法

```bash
# Dockerを停止
sudo service docker stop

# rootユーザーに切り替え
sudo -su root

# コンテナのファイルがあるディレクトリへ移動
cd /var/lib/docker/containers/

# 対象のファイルを削除
rm -fr eb23b2419de65c7a10204c41e2663abb8bdd304f1b5ebb6959e8b92575f5c399

# 元のユーザーに戻る
exit

# Dockerを起動
sudo service docker start
```
ruby 練習問題2　（アウトプット用）

配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_dataがある。
そのuser_dataを利用して、全てのユーザーの名前だけが出力されるようにRubyで以下のひな型を利用し、以下の出力結果となるようにコーティングする問題。

ひな型
```ruby
user_data = [
  {user: {profile: {name: 'George'}}}
  {user: {profile: {name: 'Alice'}}}
  {user: {profile: {name: 'Taro'}}}
]
```
出力結果
```ruby
George
Alice
Taro
```
以下､模範解答
```ruby
user_data = [
  {user: {profile: {name: 'George'}}}
  {user: {profile: {name: 'Alice'}}}
  {user: {profile: {name: 'Taro'}}}
]

user_data.each do |u|
  puts u[:user][:profile][:name]
end
```
以下、解説

まずはハッシュから特定の値の取り出し方。
```ruby
ハッシュ[:取得したい値のキー]
```
上記の書き方で取得することができる。
そして今回ハッシュが重なっているので以下のように取得したい値のキーまで連続して指定すると取得できる。
```ruby
ハッシュ[:取得したい値のキー][:取得したい値のキー][:取得したい値のキー]
```
また、今回は配列の中にハッシュが格納されているのでeach文でハッシュの1つ1つを取り出して記述する必要がある。
```ruby
user_data.each do |u|
  puts u[:user][:profile][:name]
end
```
IAMとOrganizations

## IAMとは

AWS Identity and Access Managementの略称。

AWSを安全に操作するための認証・認可の仕組み

**認証**

通信の相手が誰であるかを確認すること

**認可**

とある特定の条件に対して、リソースアクセスの権限を与えること

## 主要機能

### IAMユーザー

AWS アカウント内に追加される利用ユーザーのこと

AWS上の利用者はIAMユーザーという権限を付与されたエンティティとして設定される。

**ルートユーザーとIAMユーザーの違い**

ルートユーザーはAWSアカウント作成すると作られるアカウント内の全てのサービス、リソースへのフルアクセスが許可されているため使用することが非推奨となっているためIAMユーザーに管理者権限を付与することによって管理した方が良い。

### IAMユーザーグループ

複数のIAMユーザーをまとめてグループとしてまとめることができる仕組み

### IAMロール

AWSリソースが別のリソースに対するアクセス権限を付与する仕組み

例) EC2 ➡︎ S3にアクセスしてデータを取ってくるといったアクセス権限

別のAWSアカウントのIAMユーザーにアクセス権限を委譲する際にも利用

### IAMポリシー

IAMユーザーやIAMロールにアタッチすることができ、アクセス権限を付与するためのJSON形式のドキュメントで大きく分けて3種類存在する。

1. AWS管理ポリシー
    1. AWSが作成、管理しているポリシーで、ユーザーやロールに適用することができる。
2. カスタマー管理ポリシー
    1. ユーザーアカウントがJSONファイルを使用して設定するポリシー。
3. インラインポリシー
    1. 特定のユーザーやロール専用に作成するポリシーで1つに対して1つ(1対1)のアタッチしかできない。

## Organizations

複数のAWSアカウントを利用している場合に、統合管理（一元管理）することができるサービス。

IAMは1つのアカウント内でユーザーを管理するサービスだがOrganizationsはアカウントを複数統合管理することができる。

## 特徴

- 組織を定義し管理する
    - 新規アカウントを作成する際に、それらを組織単位(OU)、単一のアプリケーションもしくはサービスを提供するアカウントをグループ化することができる。
- アカウント間でリソースを共有する
    - AWS Organizationsの組織内で、AWS Resource Access Manager(AWS RAM)を用いるとAWSアカウント間やOU間でリソースの共有を行えるようになる。
- 請求とコストの一元管理
    - AWSの請求は各アカウントごとだが、Organizations では 1 つにまとめた組織の一括請求が可能です。


https://aws.amazon.com/jp/iam/

https://aws.amazon.com/jp/organizations/

## おわりに

学習段階ではIAMのことを理解せずにルートユーザを使用していましたがIAMユーザーを作成して使用した方がいいのだとこの備忘録を作成して学びました。

まだまだ初学者ですがこれからも精進していきたいと思っていますので間違った記載などありましたらご指摘お願い致します。
[Swift]Realmでcsvをインポートして初期データのrealmファイルを作り導入する

## 背景
クイズアプリにRealmを導入する過程で発生したエラーをまとめる

環境
M2macOS Ventura 13.0.1
Xcode 14.1
Realm Studio Cersion12.0.0
Realm swift 10.33.0

## csvをインポートして初期データのrealmファイルを作る
Realm Studioは現在バージョン13ですが、バージョン12で作らないと読み込めません

https://teratail.com/questions/qcz5tx0949ka0i

csvからインポートしたいが、エラーが出る

https://blog.strawhat.net/post/mobile_database/csv-to-realm-with-realmstudio/

## failed to import dataとstring?
https://teratail.com/questions/311852

### エラー：failed to import data
realmファイル自体は作成できるので、それを開いてそこでcsvファイルを再度インポートでできた

### String?
自分で作成したrealmファイルは型に?がついている
知識不足でバグか仕様なのかは分からない、データとしてはあるけどアプリで表示できなかったのでデフォルトのrealmファイルをコピーして持ってくる
![CleanShot 2022-12-23 at 19.46.21@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953056/e2d53ef1-ea73-e302-0f41-5997a6f5b2aa.png)
 
アプリを起動してデータ型のプロパティを定義をしたデフォルトのファイルを作り持ってくる
下記のコードでデフォルトのrealmファイルの場所がわかる
Realm studioでファイルを開く、シフト＋コマンド＋G、ファイルの場所へ行き、default.realmをコピペ
コピペしたrealmファイルをプロジェクト内に置いて、そのrealmファイルにcsvファイルをインポート
これで型に?がつかないので、デフォルトファイルと同じように扱える

```
print(Realm.Configuration.defaultConfiguration.fileURL!)
```

## 作成したrealmファイルを初期データとして扱う
### Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
 ### Realm  studioのバージョン12で作成したファイルだとアンラップのエラーが消えた。謎
https://ja.stackoverflow.com/questions/88640/realm-studio%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9Frealm%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%87%AA%E4%BD%9C%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%81%84

https://naoya-ono.com/swift/swift-realm-initial-data/

##  エラー：class is missing from the schema for this Realm
アプリを削除するだけではダメだった

https://qiita.com/kaneko77/items/51d671fd840566178d61

## 考察
知識不足はもちろんだけど、Realm studioのバグのせいでよく分からない。
Blnderでステンドグラス

## 概要

YouTubeの[ささらBch](https://www.youtube.com/@sasara_Bch)さんの「[【ステンドグラス】Blender M01-100](https://www.youtube.com/watch?v=Phx2CpsyjBE)」のアレンジです。

下記のようなステンドグラス化したスザンヌを作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/921994ff-39d7-882d-1bbe-17b79fcd36d5.png" width="300">

ポイントは、カラーランプのカラーモードをHSVにすると2色設定するだけでいろいろな色になるところです。

参考：[Blenderで虹を作る](https://qiita.com/SaitoTsutomu/items/4ff1e6c1bb9a34a8128b)

## 作成方法

細かい手順を説明するよりPythonで実行した方が簡単で間違いもないので、Pythonで作成します。
下記をコピペして実行してください。

```py
import bpy

bpy.ops.mesh.primitive_monkey_add()
bpy.ops.object.modifier_add(type='WIREFRAME')
obj = bpy.context.object
mat = bpy.data.materials.new(name="frame")
obj.active_material = mat
mat.use_nodes = True
ndpb = mat.node_tree.nodes["Principled BSDF"]
ndpb.inputs[0].default_value = (0, 0, 0, 1)

bpy.ops.mesh.primitive_monkey_add()
obj = bpy.context.object
mat = bpy.data.materials.new(name="frame")
obj.active_material = mat
mat.use_nodes = True
ndpb = mat.node_tree.nodes["Principled BSDF"]
ndoi = mat.node_tree.nodes.new("ShaderNodeObjectInfo")
ndoi.location = -500, -110
ndcr = mat.node_tree.nodes.new("ShaderNodeValToRGB")
ndcr.location = -300, -110
ndcr.color_ramp.color_mode = 'HSV'
ndcr.color_ramp.hue_interpolation = 'CW'
ndcr.color_ramp.elements[0].color = (1, 0, 0, 1)
ndcr.color_ramp.elements[1].color = (1, 0, 0.01, 1)

mat.node_tree.links.new(ndoi.outputs[5], ndcr.inputs[0])
mat.node_tree.links.new(ndcr.outputs[0], ndpb.inputs[19])

bpy.ops.object.editmode_toggle()
bpy.ops.mesh.edge_split(type='EDGE')
bpy.ops.mesh.separate(type='LOOSE')
bpy.ops.object.editmode_toggle()
```

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

作成したマテリアルは、下記のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/045e1184-1d78-ef98-2aa2-069586141a33.png" width="600">

## 補足

下記のようにマテリアルでワイヤーフレームを表示させることもできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/6f631921-14c8-0aa1-5ccf-7bf51654bee7.png)

以上
CSSのdisplayプロパティを学び直す

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 24日目です。

displayプロパティを見てみます。

## displayプロパティ

https://developer.mozilla.org/ja/docs/Web/CSS/display

ジャンル分けは個人的な考え方です

- はこ系
    - block - ボックスになる
    - flex - Flexbox をつくる
        - [Flexboxを学び直す \- Qiita](https://qiita.com/becolomochi/items/cc4f83a54d430d1099ed)
    - grid - Grid layout をつくる
        - [Grid Layoutを学び直す \- Qiita](https://qiita.com/becolomochi/items/10c9911bb297b757349e)
- インライン系
    - inline - span みたいな感じになる
    - inline-block - inlineとblockの良いところを足した感じ。結構使う
    - inline-flex - Flexbox の inline バージョン
    - inline-grid - Grid layout の inline バージョン
- その他
    - flow-root
        - > 要素は、新たなブロック整形コンテキストを確立するブロック要素ボックスを生成し、整形ルートがある場所を定義します。
- テーブル
    - table
    - table-row
- リスト
    -  list-item
- ないものとされる
    - none - 表示がなくなる
    - contents - 自分自身のボックスが消える（＝中身は消えない）べんり
- 2つ値もできる
    - inline flow-root - inline-block と同じ
    - とか

## display:contents　のサンプル

`display:contents` を指定する前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/346c6f6a-424c-8051-9175-9a4f1913bccb.png)

`display:contents` を2個目のピンク色のボックスに設定したとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/deeef9c1-1fe3-cfa5-8409-caa210086f11.png)


```html
<div class="wrapper">
  <div class="inner">box text</div>
</div>
<div class="wrapper contents">
  <div class="inner">box text</div>
</div>
```

```css
:root {
  --color1: #edb658;
  --color2: #e7719b;
}

.contents {
  display: contents;
}

.wrapper {
  padding: 1em; // 無効化される
  background: var(--color2); // 無効化される
}

.wrapper + .wrapper {
  margin-top: 2em; // 無効化される
}

.inner {
  padding: 1em;
  background: var(--color1);
}
```

## 感想

- display プロパティに2値書けるの知らなかった
- display:contents、便利。好き

## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/display
- https://coliss.com/articles/build-websites/operation/work/how-to-work-display-contents.html
Eclipse 標準ライブラリの関数を実行しようとすると止まる

（備忘録）

### 現象

(ubuntuで実行)
eclipse でデバッグ中に以下のような文言が出る。

```
 Can't find a source file at "/build/glibc-D9JkfM/glibc-2.27/string/../sysdeps/aarch64/関数名.S" 
Locate the file or edit the source lookup path to include its location

```

### 結論

ステップイン実行しているから。

例えばmemsetでステップインしようとするとmemsetの関数の中身を覗きに行こうとし、
結果ソースが見つからないとエラーになる。

`F5`でステップインすると↑の文言が出るので
`F6`で該当箇所をステップオーバーする
【開発うまくいってる？】思ってたのと違う


:::note info
この記事は「[【マイスター・ギルド】本物のAdvent Calendar 2022](https://adventar.org/calendars/7794)」17日目の記事です。
:::


# 今回は認識の違いを認識するワークをしてみました

お題：依頼者が欲しい絵を描こう！
依頼：太陽と木の絵が欲しいです、1分でA4用紙に描いてください

## 描いたものはこちら
一人目
![img1_20221223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201082/cc932e14-9f24-7f3e-a319-610ff375c21e.jpeg)

二人目
![img2_20221223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201082/4ccb64a4-95e7-e606-c357-34febcd78eaa.jpeg)

三人目
![img4_20221223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201082/5ea5a69f-3166-661e-0a6c-df1e46a5e99e.jpeg)

依頼者想定イメージ
![img3_20221223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201082/aecfe59c-1e56-5d5e-3ab9-68095f5f4bc0.jpeg)

## 結果
依頼者の想定したイメージと同じ絵にはなりませんでした

## なにが悪かったんだろう？
何が悪かったのか考えてみたいと思います
まず想定として「依頼が悪い」きがしてきました
依頼者は細かいことをちゃんと言ってません
- 木、太陽はいくつ
- どこに置く
- どのような形
- 絵の品質、タッチ
- 大きさ
- 紙の向き

では、この情報を伝えていたら、依頼者が想定したイメージと同じ絵になったのでしょうか？
残念ながら、たぶんならなかったと思います

写真を見たまま絵にするなどといった場合なら正解がはっきりとしていますが、
おそらくですが依頼者自身も、自分が欲しいものはぼんやりとしていて、よくわかっていなかったのではないでしょうか

## では、どうすればよかったんだろう？

今回の実験で、絵を描く依頼をしたうちの１人が

>「これって今日中に必要ですか？
あとA4サイズ内に出来るだけ大きく描いた方がいいですか？」

と質問をしてきました

これこそがまさに重要であると思っています
質問をされることで依頼者はそれについて考え、回答します
それを聞いた作業者は

> こんな感じでどうでしょう？

と見せたら、さらに依頼者とイメージの差は埋まっていきます
こうしてコンセンサスを取りながら進めることで、より早く、依頼者の希望通りのものが出来上がります
納期を確認してるのもいいですね

## 開発うまくいってる？

私が見知った開発現場では上記のような認識のズレが起きがちでした
人はどれだけ伝えたつもりになっていても、育った環境や、これまで経験してきたこと、知識や立場など視点が違うことで、認識のずれは必ず起きるものだと私は考えています

この為、認識がズレていることを前提として、
コミュニケーションを積み重ね、コンセンサスをとりながら定義や基準を合わせることが、最も重要な事柄の一つだといまは感じています
LinuxにGoogle Chromeをインストール

# デビアンうぶんちゅ！

```bash
wget -qO- https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --yes --dearmor -o /etc/apt/trusted.gpg.d/google-chrome.gpg \
  && sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' \
  && sudo apt update \
  && sudo apt install -y google-chrome-stable
```


<details><summary>D-Busが必要なとき</summary>

```bash
wget -qO- https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --yes --dearmor -o /etc/apt/trusted.gpg.d/google-chrome.gpg \
  && sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' \
  && sudo apt update \
  && sudo apt install -y google-chrome-stable \
  && sudo /etc/init.d/dbus start
```
</details>

<details><summary>[arch=amd64]を追加する理由</summary>

Ubuntu 22.10で下記のエラーを出さないようにするため

```bash
sudo apt update
N: リポジトリ 'http://dl.google.com/linux/chrome/deb stable InRelease' がアーキテクチャ 'i386' をサポートしないため設定ファイル 'main/binary-i386/Packages' の取得をスキップ
LANG=C sudo apt update
N: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'http://dl.google.com/linux/chrome/deb stable InRelease' doesn't support architecture 'i386'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/7d724668-708f-942a-e4c5-eb420c112482.png)
</details>

<details><summary>curlを使わない理由</summary>

Ubuntuにcurlが入っていないから
</details>

# ろっきぃ

```bash
sudo tee /etc/yum.repos.d/google-chrome.repo << 'EOF' >/dev/null
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub
EOF

sudo dnf -y update
sudo dnf -y install google-chrome-stable
```

# てすと

```bash
google-chrome-stable --headless --dump-dom https://domains.google.com/checkip
```

<details><summary>出力</summary>

```bash
google-chrome-stable --headless --dump-dom https://domains.google.com/checkip > myout.log 2>myerr.log
$ cat myout.log
<html><head></head><body>34.81.88.252</body></html>
$ cat myerr.log
[0110/224332.231765:ERROR:zygote_host_impl_linux.cc(273)] Failed to adjust OOM score of renderer with pid 6528: Permission denied (13)
[0110/224332.237286:WARNING:bluez_dbus_manager.cc(247)] Floss manager not present, cannot set Floss enable/disable.
[0110/224332.246479:ERROR:zygote_host_impl_linux.cc(273)] Failed to adjust OOM score of renderer with pid 6530: Permission denied (13)
[0110/224332.260752:WARNING:sandbox_linux.cc(385)] InitializeSandbox() called with multiple threads in process gpu-process.
```
</details>

# 参考

https://www.if-not-true-then-false.com/2010/install-google-chrome-with-yum-on-fedora-red-hat-rhel/

https://inab818.site/centos/centos7-google-chrome-install/

https://qiita.com/mokemokechicken/items/d9b35c29d6ed4d60b63c

https://orebibou.com/ja/home/201608/20160823_001/
【Git】ローカルにないリモートブランチを取り込む方法

## `git fetch`

まずリモート追跡ブランチが存在するか確認するために`git branch -r`を実行します。  

```terminal
git branch -r
```

この時点でリモート追跡ブランチが存在すれば`git fetch`は不要です。  
存在しない場合は`git fetch`で作成します。  

```terminal
git fetch
```

特定のブランチのリモート追跡ブランチのみ作成するには次のように実行します。  

```terminal
git fetch origin ブランチ名
```

## `git checkout`

ローカルブランチ名を指定してリモートブランチをチェックアウトします。  

```terminal
git checkout -b ブランチ名 origin/ブランチ名
```
ORANGE-4 で超音波距離計 HC-SR04 の出力を読んでみた

[ORANGE-4](http://www.picosoft.co.jp/ORANGE-4/index.html) で超音波距離計 HC-SR04 の出力を読んでみた。

# HC-SR04

**HC-SR04**は、超音波を用いて2cm～450cm程度の距離を計ることができるデバイスである。
Vcc、Trig、Echo、Gnd の4本の端子がついている。

Trig端子に10μsのパルスを入力すると、測定が行われ、結果がEcho端子に出力される。
測定結果は出力されるパルスの長さで表現され、パルスの幅を $T$、音速を $C$ とすると、測定結果の距離は $TC/2$ である。
(すなわち、超音波が測定対象との間を往復するのにかかった時間が、そのままパルスの長さになるのだろう)

測定の間隔は、200ms以上空けることが要求されている。

# ORANGE-4 と HC-SR04 との連携

[【GMC-4】命令の実行速度を調べる - Qiita](https://qiita.com/mikecat_mixc/items/ea820b4f2f7f96be9999)
より、ORANGE-4 において

```
target orange4

	ldyi 1
	ldi 0
	ioctrl
loop:
	ldi 1
	out
	ldi 0
	out
	jmpf loop
```

というプログラムで約10μsのパルスを生成できることがわかる。
また、ORANGE-4 は7セグメントLED消灯時、1秒あたり約160,000命令を実行できるというデータもある。
よって、音速を340m/sとすると、1命令実行する間に音は約2mm進み、距離の測定結果は約1mm伸びることになる。

# プログラム

このプログラムは、[MikeAssembler](https://mikecat.github.io/mike_assembler/) でアセンブルできる。

```
target orange4

; ORANGE4 - HC-SR04
;   PORT1 - Trig
;   PORT2 - Echo

	ldyi 1
	ldi 0
	ioctrl
	out
	ldyi 2
	ldi 2
	ioctrl
	; HC-SR04 の接続用にキー入力を待機する
connect_wait:
	ink
	jmpf connect_wait
main_loop:
	; 7セグメントLEDを消灯する
	scall 0
	; 測定結果を初期化する
	ldyi 2
	ldi 0xf
	st
	; トリガー信号を送信する
	ldyi 1
	ldi 1
	out
	ldi 0
	out
	; Echoが1になるまで待機する
	ldyi 2
start_wait:
	in
	cpi 1
	jmpf start_wait
	; Echoが0になるまでの時間を計測する
stop_wait:
	add ; Aレジスタはポートから読み取った1
	st
	in
	cpi 0
	jmpf stop_wait
	; 計測結果を表示する
	ld
	outn
	; 200ms待つ
	ldi 1
	scall 0xc
	; 次の計測へ
	jmpf main_loop
```

以下は、このプログラムの ORANGE-4 モニタ用表現である。

```
E00:A180F70F71A282F7
E10:00F11E0A28F4A181
E20:F7180F71A2F72C1F
E30:2A64F72C0F325181
E40:ECF15
```

このプログラムでは、5命令で1周するループ (`stop_wait`) を用いてパルスの長さを測定しているため、
測定距離が約5mm伸びるごとに測定結果が「1」増えることが期待できる。
また、今回は4ビットの数値1個のみを用いて測定結果を記録しているため、「16」すなわち約8cmの間の位置しか識別できない。
繰り上がりの処理を追加することで、解像度が落ちる (ループ1周の時間が伸びる) かわりに測定可能な範囲を伸ばせると考えられる。

[ORANGE-4のI/Oの仕様を調査してみた (暴走もあるよ) - Qiita](https://qiita.com/mikecat_mixc/items/71effbbbea1c0d0415de)
より、ORANGE-4のI/Oポートはリセット時出力状態になっている。
そのため、プログラムを実行する前に HC-SR04、特に出力のEcho端子を接続すると、短絡する恐れがある。
一方、今回のプログラムは測定結果を表すパルスが入力されることを前提としたものになっており、測定処理を開始した後に HC-SR04 を接続すると測定開始の信号が伝わらないため測定結果を表すパルスが入力されず、無限ループに陥る恐れがある。
これを回避するため、プログラムを実行開始し、ポートを初期化した後に HC-SR04 を接続するためのキー入力待ちを設けた。

# 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/gYdZ7JU6nFA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

HC-SR04 と測定対象の距離を変えるのに従って、7セグメントLEDに表示している測定結果が変わっている。
チームを巻き込んで継続的にアウトプットするために実施したこと

## この記事の概要

私はQiitaを運営する一人です。
そのため、自分たちが誰よりもQiitaを使い倒すという気持ちは重要だと思っています。

記事を読む、編集リクエストをする、質問をするなど「Qiitaを使い倒す」にも色々あります。
そんな中でも「記事を書いてアウトプットする」は外せません。

最近ではQiitaはOrganizationランキングで上位をキープできているので、ここに至るまでに工夫した点を記事にしました。

## 実施したこと

### チームの目標に組み込む

どんなジャンルでもそうですが、一人でずっと努力を続けるのは大変です。
仲間がいて励ましあったり競い合ったりした方が続きやすいのは間違いありません。

ですから、チームとして「月に○記事以上書く」のように目標に組み込みました。
時期によって数値は変えていますが、常に掲げています。

もちろん目標にする以上、業務時間としてカウントしています。

### 最初に高い目標を掲げる

1番初めに設定したのは「週に1記事」でした。
やってみると分かると思いますが、かなりキツいです。

持論として「最初は月に1記事、慣れたらペースを上げよう」などとすると絶対に慣れません。
目標数値は、後から下げることはできても、上げるのは本当に難しいです。

そのため最初から相当キツいレベルを設定して、後から下げるように調整しました。
ちなみに今は隔週で1記事の設定です。

### 1つ1つのアウトプットのハードルは下げる

目標とする数値を高くする代わりに、記事自体は（ガイドラインに沿う前提で）どんなレベルでもOKとしました。

得てして「こんな程度の記事、アウトプットする価値も無いのでは……」と思いがちです。
しかし、自分の中では当たり前だと思っていることが、他人からすると役立つ情報であることは結構よくあります。

記事のクオリティも頻度も求めるのはさすがに無理があるので、このようにしてバランスをとりました。

### 書いた記事を共有しあう 1

振り返りミーティングの中で「今回のスプリントで書いた記事」を共有しあう時間を設けました。

先ほどの「自分の中では当たり前だと思っていることが、他人からすると役立つ」を顕在化する狙いがあります。
記事を共有する中で「これってこういうときはどうなるの？」とか「こういう使い方もできる？」とか「すげー便利そうじゃんすぐに使ってみよ」とか、結構色々なリアクションが生まれます。

書いた本人は「これくらいの内容で良いのかなあ」と思っていたとしても、周りが反応してくれると嬉しくなりますし、次はアレを書いてみよう！とかも浮かびます。

### 書いた記事を共有しあう 2

記事を書くたびにSlackで共有をしていました。
「○週連続で記事投稿達成です！」なんてメッセージを投稿すると、結構多くのリアクションがつきます。

そのうち影響される人が増えて、自然と投稿者数が増えていきました。

### 表彰制度を作る

表彰といっても、大それたことはしません。
全社ミーティングの中で名前を呼んで「今月のナンバーワンはあなた！」と示すくらいです。

ただそれでも、僅差で負けた人は「次回は自分が」と燃えますし、いつも頑張っている人は自然と「すごい人」として見られるようになります。

外発的動機になってしまうほど豪華にするのではなく、ちょっとした嬉しさややる気を引き出すイメージです。

## 良かったこと

数年前と比べて、明らかにアウトプットする文化が根づきました。
おかげでアドベントカレンダー期間ではQiitaは月間で100投稿を超えています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214677/1f065b15-b09c-2bb8-66f3-03ecedf15266.png)

ちなみに1位のエイチームライフデザインはグループ会社なので、エイチームグループで1位2位を取れていることはかなり嬉しく思います。

アウトプットが定着すると、日々のインプットの質も高まりますから、かなり良い学びのサイクルになっている自覚があります。

## 改善の余地ありなこと

週に1回、みたいなペースはいつまでも続くものではありません。
しばらくやってみて思ったのは、集中してアウトプットする時期と、緩くアウトプットする時期を織り交ぜた方が良さそう、ということです。

頻度や巻き込む範囲などまだまだ改善途中ではあるのですが、「余裕すぎるペース」ではなく「ちょっとキツいけど頑張れる」くらいのレベルを上手く設定できると「アウトプット筋」のようなものが効率よくつく気がしています。

## 最後に

アウトプットをたくさんしている自覚があるので、アウトプットは良いぞカレンダーに投稿できて良かったです笑

「発信したいんだけど、何から始めたら良いかが分からない」という声もときどき聞きますので、この記事が少しでもそういう人の助けになれば幸いです。

---

最後まで読んでくださってありがとうございます！
Twitterでも情報を発信しているので、良かったらフォローお願いします！

https://twitter.com/xrxoxcxox

Devトークでのお話してくださる方も募集中です！

https://jobs.qiita.com/employers/qiita-inc/dev_talks/489
【Laravel】mix-manifest.jsonの正体

## はじめに
Laravelのプロジェクトでscssやjsの修正をする度に差分が発生していた `mix-manifest.json` というファイル。
最初はこのファイルの役割を知らず、ただ邪魔に感じていたのですが、調べてみたら意外と便利なことをしてくれるファイルであることがわかりました。

## ブラウザのキャッシュ回避をしてくれる

以下のようにビルドする度にパラメータ`id`が更新され、それらファイルをViewが読み込むことでキャッシュバスティングを実現していました。

```mix-manifest.json
{
    "/share/js/main.js": "/share/js/main.js?id=7381b8dfd82a24bc642b",
}
```

ブラウザの開発者ツールからscriptタグを確認してみると、たしかに`id`というパラメータが付いています。
```html
<script src="/share/js/main.js?id=7381b8dfd82a24bc642b"></script>
```

## ファイルの読み込み

`mix()`でパラメータが付与された静的ファイルを読み込む。
```html
<script src="{{ mix('/share/js/main.js') }}"></script>
```


## 実現してくれるツールと設定箇所

これら上記の機能は `laravel-mix` というツールが提供しているもので、設定は `webpack.mix.js`に記載されていることが調べていくうちに判明しました。
たしかに、ファイルの記述を見てみるとビルドやバンドル化の設定がありました。
ファイル最後に記載の`version`メソッドでパラメータ`id`を付与しているようです。

```webpack.mix.js
let mix = require('laravel-mix');

mix.setPublicPath('public');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel application. By default, we are compiling the Sass
 | file for the application as well as bundling up all the JS files.
 |
 */

mix.sass('resources/assets/scss/main.scss', 'public/share/css');
mix.js('resources/assets/js/app.js', 'public/share/js');

mix.js([
    'resources/assets/js/main.js',
    'resources/assets/js/vendor/drawer-menu.js',
    'resources/assets/js/vendor/swiper-setting.js',
    'resources/assets/js/vendor/view-more.js',
    'resources/assets/js/vendor/overlay.js',
              ︙
], 'public/share/js/main.js') // 複数のjsファイルをmain.jsにバンドルしている
    .autoload({
        "jquery": ['$', 'window.jQuery'],
        "vue": ['Vue', 'window.Vue'],
    }).sourceMaps(); // sourceMapsはブラウザの開発者ツールからデバッグ情報を確認できるようにする

mix.version();

```

## おわりに
Laravelが他フレームワークと比べ便利と言われていた理由が少しわかったような気がします。

## 参考
https://readouble.com/laravel/8.x/ja/mix.html

https://rapicro.com/mix-manifest-json/
Windowsで使えるツール2選


現在使うPCがWindowsなため、 役立っている便利なツールを2つご紹介します。

勤務先によって許可されていない場合もあるかと思いますので ホワイトリストなどご確認の上、ご活用下さい。

## **PowerToys**

　Windowsに実装を予定されていたが、実装を見送られた機能たちをインストールできます。 その中の「常に手前に表示できる」機能を使用しています。

メモ帳などを常に手前に出しながら確認する場合など、中々便利な機能です！

###### インストール方法
https://pc-karuma.net/windows-10-install-powertoys/

###### 常に手前に表示できる」機能

https://pc-karuma.net/microsoft-powertoys-always-on-top/#%E3%82%A6%E3%82%A4%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E6%9C%80%E5%89%8D%E9%9D%A2%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B

## **clibor**


コピーした履歴をいくつも遡れたり、定型文などを設定できます。

履歴は普通に便利ですし、定型分にはGitコマンドを登録することで現在ブランチの確認やcommit・pushまで簡単にコピペが可能です。

使い方もCtrlキーを2回叩くだけなので簡単です！

###### クリップボード履歴ソフト「Clibor」の公式サイト
https://chigusa-web.com/clibor/

クリップボード履歴ソフト「Clibor」の公式サイト
 https://chigusa-web.com/clibor/
Flutterでpod installができなくなった時の対処法

【参考にした】
https://zenn.dev/yu1ro/articles/2507fe2f139ad3

ほぼ同じ内容だけど自分用で備忘録も兼ねて。。

pod installした際に以下エラーなった時の対処法

```
Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update

Error running pod install
```

# 対処法

1\. PodfileとPodfile.lockを削除
2\. flutter cleanを実行
3\. pod repo updateを実行
　     → **時間かかる場合あるが裏で動いているから諦めるな！！**
4\. Podfileが無いままiOS側を起動を試みる → Podfileが生成される
5\. Podfileを削除前の状態に戻す(独自で入れたライブラリの記載を追加し直す)
6\. pod install実行

メリークリスマス🎄🎅
作成日：2022/12/23
けしからん顧客と戦うための参考リンク集（個人用メモ）

随時更新。更新するたびにストレス値が上昇。
日系企業向けにはIPAなどが出している資料が良い。

## パスワード（セキュリティ）
### パスワードの定期変更は不要
総務省から出てるやつ
https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/business/business_staff_01.html
NIST
https://pages.nist.gov/800-63-FAQ/#q-b05
指定文字数でランダムな文字列を作成するphp関数を作った

## はじめに
メール認証とかに使えそう...

## コード
```php
function random_words($limit,$is_flag = 0){
    $word = null;
    if($is_flag===0){
        $base_string = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0,1,2,3,4,5,6,7,8,9];
    }else if($is_flag===1){
        $base_string = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
    }else if($is_flag===2){
        $base_string = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0,1,2,3,4,5,6,7,8,9,'*','-','_'];
    }

    for( $i=0; $i<$limit; $i++ ) {
    	$word .= $base_string[mt_rand( 0, count($base_string)-1)];
    }
    return $word;
}
```

## 使い方
```php
random_words(文字数制限,フラッグ);
```
### フラッグの種類
#### 0
デフォルト。英語文字と数字から文字列を作成する。

#### 1
英語文字から文字列を作成する

#### 2
英語文字・数字・記号（```*``` or ```-``` or ```_```）から文字列を作成s
Yarnのバージョンによってnode_modulesが作成されない件について（voltaを使用）

## 起こった現象
* voltaでNext.jsの環境構築をした時、自動で作成されるindex.tsxで、import部分にエラー
    * 「対応する型が見つかりません」ってずっと出る💢
* node_modulesフォルダではなく、**「.yarn」フォルダが作成される**

## 早速ですが結論から
エラーが起きた原因は、やはり**node_modulesが作成されていないから**みたいです

すごくシンプル

本来は作成されるはずなんですが、なぜ作成されなかったか追っていきましょう!

## yarnのバージョンを確認
まずはyarnのバージョンを確認してみました

    yarn -v
    // 3.3.0

バージョンは3.3.0と確認できました

yarnは、Home Brewで既にinstall済みの状態です

今回使用したかったバージョンは「1.22.19」だったので、voltaでyarnのバージョンを指定してみました

エラーが起こる段階でyarn installした時は、voltaにyarnのバージョンはしてしてなかったです

```package.json
{
  "volta": {
    "node": "18.12.1",
    "yarn": "1.22.19"
  }
}
```

yarn installを実行してみましょう

    yarn install

....ん?node_modulesが作成されている....?

![スクリーンショット 2022-12-23 10.53.17.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156536/9efb5ce0-7d85-1ee7-6316-7b61cad03ddf.jpeg)


## v1でnode_modulesが作成された理由
ざっくりまとめると

* v1では、node_modulesが自動で生成される仕組み（それはそう）
* v2以降から、デフォルト設定で、**node_modulesではなく「.pnp.js」というファイルが作成されるようになった**
    * node_modulesの設計が実用的ではないから、node_modulesを作成しないようにしたらしい（すごくざっくり）


 https://yarnpkg.com/features/pnp#fixing-node_modules

ちなみに、v2以降でもnode_modulesを作成したい場合は、**.yarnrc.yml**というファイルを作成し、以下の記述をすればいいみたいです

        nodeLinker: node-modules


https://yarnpkg.com/features/pnp#pnp-loose-mode

yarnのバージョン移行の章にも書いてました

https://yarnpkg.com/getting-started/migration

https://yarnpkg.com/configuration/yarnrc#nodeLinker

## v3で「.yarn」が作成される理由

v2以降から、「.yarn」というフォルダが自動で作成されるっぽいです


https://github.com/yarnpkg/berry


余談ですが、v1でも「.yarn」は作成されていたみたいなんですが「要らなくない？」ってなったみたいですw

https://github.com/yarnpkg/yarn/issues/2177



## まとめ

今回のエラーを解決するのに約1日半くらい費やしましたが、yarnについてふわっと知れたのでいい経験になりました。

時間がなくて駆け足で調べて、駆け足で作ったので、内容がおかしいかも知れないですがご了承くださいませ🙇‍♂️

ひとまずエラーは解消できたので、いいクリスマスが過ごせそうです。

メリークリスマス！🎅
積みゲーを管理するツールの検討

# はじめに

こんにちは、おおのです。大学院に通うM1です。
止まらない咳に38℃台の熱という風邪症状に丸3日苦しめられた挙げ句全く眠れなかった為研究の進捗はゼロなのに全く休めてもいない最悪の状況になっています。ここ最近はかなり頑張ってきたのにこの仕打ちは不条理がすぎると思います。世界って理不尽ですね。言いたいことはそれなりに言ってますけど、ポイズンですね。




さて、みなさんゲーム積んでますか？積んでない貴方は偉い。
朕は最近ゲームを積むのが趣味なのかというくらい積んでしまっているのでいい加減どうにかしたいと思っています。しかし悲しいかな、増えていく積みゲーをみればどれから崩すべきかもわからない、どのくらい各ゲームにパワーを割けばよいのかもわからない、そもそもどれを積んでいるのかもわからない状況なのです。とても困っています。ですので、効率的に積みゲーを崩すために必要な事を考え、それらを踏まえた上で積みゲーを管理するツールの検討を行いたいと思います。
本記事では積みゲーを作ってしまう要因とそれを崩すために必要なことを考察します。
先に言っておきますが、アドベントカレンダー用に適当に考えたネタなので実装はしません。
実装はしません。
検討は加速します。




# 積みゲーはなぜ生まれるのか
まずは積みゲーが何故生まれてしまうのかについて原因を考えました。もしかすると私にしか当てはまらないのかもしれないですが、いくつか挙げてみます。
### 安かったから買った
steamだったりps storeだったりのセールでとりあえず購入したゲーム。体感69.97%の積みゲーはこれによって生み出されています。一本買ってクリアして一本買って…というループを作れている健常者からすればこういった事象は起こり得ないのかもしれませんが、私のようにモノを買うことで世の不条理に抵抗を行う異常人種は安くなったゲームを大量に買い込みます（私だけではないと信じたい）。そして全部起動はしてみるものの処理しきれなくなって __ほぼ全部積む__。__あと何買ったか忘れる__。


### 発売日が遠いゲームを予約購入した
ゲームやりたい度のピークが発売分かった瞬間～2週間後くらいでその後単調減少していく。発売わかった時の嬉しさと、手元に届いた時の嬉しさ、後者が前者の2%くらいになっていることが多いです。結果 __起動確認だけして積む__。

### シンプルに長い時間かけてゲームやる元気がない
おじいちゃんになって長時間ゲームできなくなってる。 __大作ゲームは無条件で積む__。

# 積んでしまったゲームを崩すためには
放っておいたら確実に積みゲーは増え続けていくばかりで、それに対して私の体力は衰えていくばかりです。なので、確実にゲームを消化していく方法を考えます。

### ボリュームの少ないゲームからやる
そもそもゲーム機の起動にエネルギーを使いまくるおじいちゃんからすると、まずリハビリ的な行動が必要になると考えます。ですので、攻略にかかる時間が10時間以内程度のゲームから崩して体力をつけるのがよいと考えました。それに、所持ゲームの絶対数が減ると多少心持ちも変わり、もう少しボリュームの有るゲームにも手を出せるようになると思います。大量に買い込んだゲームも無作為に買っているわけではなく、一応は興味のあるものを買っていますからそれなりに楽しめる前提で買っているはずです。少しずつゲームをやる楽しさを思い出せるはず。

### 好きだったシリーズのゲームからやる
過去作の知識があるゲームはとっつきやすいので新規に始めるゲームよりも取っ掛かりやすいと思います。とにかくまずはゲームをプレイすることが大事なので、手を動かしやすいものから始めるのが良いでしょう。

### 過去にクリアしたゲームを触らない
個人的に一番大切かなと考えていることです。私は俗にいう懐古厨というやつで、昔プレイしたゲームが大好きなのです。新しいゲームはどんどん買うのに久々に古いゲームを取り出してクリアしているということが数え切れないほどあります。面白いゲームであることを知っている上思い出補正が強いため永久に遊べてしまうのです。これ本当に意識しないと新作ゲームに一生手が付かない。

# ツールの検討
上記を踏まえまして、必要そうなことをまとめてみます。

* 積みゲーのリストアップ
* 各ゲームのボリューム可視化


正直誰でも思いつきそうなシンプルなものになってしまいましたね。

まずは買ったゲームのリスティングが必要です。各プラットフォームからゲームをDL購入した場合メールが届くと思います。そのメール内容から購入したゲームタイトルを抽出、エクセルシートで管理できるようにすればよさそうですかね。パッケージ版はECサイトでの購入ならば同様にできそうですが量販店での購入ですと厳しそうですね。手動でやるしかなさそうでしょうか。

次に各ゲームのボリュームについてです。これはECサイトでのレビューや各プラットフォーム内のレビューから推察できるものになると思います。時間が書いてあればその平均を取れば良さそうですし、そうでなくともボリューム不足とか、相応であるとかの感想はついていそうですから、値段とレビューを照らし合わせてクリアにどの程度時間がかかりそうかを予測する回帰モデルとか作ったらいけそうではないでしょうか（いけそうしか言ってない）

まずは上記2つを実装してみて、購入したゲームをボリュームの少なそうな順にリスティングしてあげると積みゲーの消化につながる気がしてます。他にも横に買った時の値段載せるとか、心理的に「やらなきゃな…」と思わせるような要素も入れてあげていいかもしれませんが義務感でゲームやるのも楽しくないので、中々難しい部分だと思います。

# 最後に
結局こんなツール作ったところでもモチベーション無かったらゲームはやらないと思います。なので恐らく今後も作りません。
まともな感覚してる皆様はやれるゲームだけ買いましょう。
ロックマンエグゼのswitch版早くやりたい。
ていうかゲームするより寝たい。
phpでメール送信するときに迷惑メール判定されないような関数を作った

## はじめに
phpでメール送信するには、```mb_send_mail();```を使うことが多いですが、まれに迷惑メール判定されてしまうことがあります。
そこで、今回は迷惑メール判定されないようなphp自作関数を作ることにしました。

## コード
```php
<?php
function send_email($to,$subject,$text,$from_mail,$from_name){
    mb_language('ja');
    mb_internal_encoding('UTF-8');

    $from = $from_name.' <'.$from_mail.'>';
    $header = '';
    $header .= 'Content-Type: text/plain \r\n';
    $header .= 'Return-Path: ' . $from_mail . ' \r\n';
    $header .= 'From: ' . $from .' \r\n';
    $header .= 'Sender: ' . $from .' \r\n';
    $header .= 'Reply-To: ' . $from_mail . ' \r\n';
    $header .= 'Organization: ' . $from_name . ' \r\n';
    $header .= 'X-Sender: ' . $from_mail . ' \r\n';

    if(mb_send_mail( $to, $subject, $text, $header)){
        return true;
    }else{
        return false;
    }
}
?>
```
## 使い方
```php
send_email('送信先','件名','内容','送信元メールアドレス','送信者名');
```
「たのしいRuby」たい焼きの逆襲

#「たのしいRuby」たい焼きの逆襲
***The taiyaki strikes back.***
たい焼きの逆襲お題でオブジェクト指向とクラスの説明をしようと思いRubyプログラムを作りかけたのですが、既にずっと先を行っている方がいらっしゃいましたので、紹介して終わり鯛と思います。
https://qiita.com/jnchito/items/f07e58824f92395c353b
2022 の Qt 活動振り返り

# はじめに

こんにちは。Atsushi です。

今年は2月に [合同会社シグナルスロット](https://signal-slot.co.jp/) へ転職し、Qt を使うお客さまのお手伝いをさせていただいてきました。
仕事関係ばかりですが、それなりに Qt にパッチを送ったりバグレポを書いたりした年になったので、自分が関わった Qt 関連の活動を振り返ります。
技術的なお話はまったくありません。

# Qt Project へのコミット

2022年にプッシュしたコミットの数は、12月24日時点で 21 件でした。
[https://codereview.qt-project.org/q/owner:atsushi.yamamoto@signal-slot.co.jp](https://codereview.qt-project.org/q/owner:atsushi.yamamoto%2540signal-slot.co.jp)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/f71c7639-889b-6e25-2c55-a544de6d2916.png)

ほぼ Qt3D と Qt Installer Framework ですね。
Qt3D は RHI レンダラー周りのバグと戦っていました。

統計のページで 2022 以降の Qt3D を見てみると…
https://qt-project-org.herokuapp.com/data
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/84aed21e-fb3e-0eb4-5c38-b81c9892a5dc.png)
![plot_1_files_changed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/9eb2aa3a-db72-eb3f-fa90-34abc06f0fc7.png)![plot_2_commits.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/2d680c1d-bde8-95c7-d982-cddfd98d5f07.png)
![plot_3_insertions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/fb2e1618-5ab2-2c71-d481-a316e292d7fb.png)![plot_4_deletions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/1524fb04-449f-23e8-c680-e56fe74fbb22.png)
![plot_5_domain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/470d4ef1-790f-1a80-61be-71964370e3dc.png)
名前が入っていました。お客さまに感謝。

# バグレポート

登録したバグレポートは全部で 10 件で、Critical が 3 件と Important が 7 件でした。
https://bugreports.qt.io/browse/QTBUG-109427?jql=reporter%20in%20(ayamamoto)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11596/e27cf51d-1bf5-9bca-cec6-fd382049d814.png)
これも RHI レンダラー周りが多いです。

# Qt 勉強会 @ Tokyo

[日本 Qt ユーザー会](https://qt-users.jp/) 主催の [Qt 勉強会](https://qt-users.connpass.com/) @ Tokyo R #10 以降、会場の手配やイベントの告知などをさせていただきました。
いつもご協力ありがとうございます。

https://twitter.com/Atsushi4/status/1572108808981454848?s=20&t=_SxaIdmhp2MtkgYOOu8P7w

https://twitter.com/Atsushi4/status/1586941172966047745?s=20&t=_SxaIdmhp2MtkgYOOu8P7w

https://twitter.com/Atsushi4/status/1597038567460519936?s=20&t=_SxaIdmhp2MtkgYOOu8P7w

# おわりに

2022年は、私のこれまでの人生では最も Qt Project にコミットした1年になりました。

[Qt 勉強会](https://qt-users.connpass.com/) も再開し、[ユーザー会のホームページ](https://qt-users.jp/) や メーリングリストも復旧[^1]し、ユーザー会にとっても良い年になりました。

来年も Qt にとって良い年になりますように。（白いアドベントカレンダーを見ながら）

[^1]: @hermit4 さんありがとうございます
【Unity】シェーダーグラフでポストエフェクトやってみる

この記事は[Unity Advent Calendar 2022-3](https://qiita.com/advent-calendar/2022/unity)の25日目の記事です。

はじめに
---
Unityのバージョン2022.2から完全にノンコードでポストエフェクトを実装できるようになったので触ってみました。
Unity公式が設定方法の動画を出してくれています。

https://www.youtube.com/watch?v=7Cd7kQl6N50

以前はスクリプトで ScriptableRendererFeatureクラスを継承したクラスを書いて.. などをやらないとできませんでした。独自のポストエフェクトを入れたいけどコーディングはしたくない方も多いと思うので かなり嬉しいアップデートですね。

環境
---
Unity 2022.2.1f1
Universal RP 14.0.4


設定
---
以下はURPでの設定方法です。HDRPでの方法は少し違いますが上記のUnity公式動画で解説されています。

1. ポストエフェクト本体となるシェーダーグラフを作ります
![ss2022-12-20 22.06.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/db5f0159-b4a1-b7ea-3666-259351e1c814.png)
2. Render Pipeline Asset にポストエフェクト用の Renderer Feature を追加します
![ss2022-12-21 0.02.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/503181d8-f4f0-763c-4d92-71426b020431.png)
3. 1で作ったシェーダーグラフのデフォルトマテリアルを 2の Render Feature 内の Pass Material に設定
![ss2022-12-21 0.05.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/23fa2c98-79e1-7ceb-372f-c7f55f035dc4.png)

これで1で作ったシェーダーグラフを編集すればポストエフェクトとして画面に適用されます。

ポストエフェクト
---
アドベントカレンダーの記事だし、雪でも降らせてみます。

画面を格子状に分けて
![node1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/529936e1-01b1-67dc-7c67-adc07785ef6f.png)
格子状に分けた中のランダムな位置に点が表示されるようにし、その点を時間変化で動かして
![node2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/d9cc173d-dcaa-221e-4c33-45fcc51c9d35.png)
元の画面と合成
![node3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/3d9fb027-8fd7-4576-b77e-51b9ca0db8c6.png)

雪が降った！
![mov_snow.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/b14c58df-658b-b961-9210-0db16c9c9231.gif)
え？これポストエフェクトでやる意味あるの？
気にしない気にしない！ほら、ポストエフェクトなら粒を何万個出しても負荷が一定だからどこかで使える かも！

ついでに[こちら](https://www.youtube.com/watch?v=EBrAdahFtuo)を参考に 結露した窓を落ちる水滴 もシェーダーグラフで追加
![mov_drop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/b7d8258f-6312-250c-93cf-313231b1b950.gif)
![node-_drop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905530/82cb9c60-2a68-3e63-d6df-6d44b4ac9298.png)
ここまでノードが増えるとシェーダーグラフのエディタがかなり重くなるのでファイル分けた方がよさそうです。

ひとつの計算結果をいろいろなノードで使い回すような時にノードが綺麗に配置できないのが悩ましかったのですが、いい方法ご存じの方がいれば教えてください！
LooksRareのNFTリストデータを enebular経由でスプレッドシートで 表示してみる

NFTを見る機会がここ１、２年で多くなってきていますが、
NFT周りのAPIがいろいろと公開されているので触ってみたいと思います。

# NFTマーケットについて

NFTマーケットはその名の通り、NFTを取引できるプラットフォームです。
NFTの配布、購入や出品ができ、取引のやり取りには仮想通貨を使用します。

OpenSeaが最大手ですが、
マーケットによって使用できる仮想通貨の種類や、コンテンツの種類も異なっています。
最近は国内マーケットも増えてきているようです。

![スクリーンショット 2022-12-23 18.40.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/5c91a96c-f2ba-b131-e4fc-5db536a5eff5.png)


# NFTマーケットのAPI
一部のNFTマーケットではAPIを公開しています。
NFT情報の取得や、出品、オファーなどをおこなう機能が提供されており、
使いこなせば自動売買なども可能です。

OpenSea API : https://docs.opensea.io/
![スクリーンショット 2022-12-23 18.43.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/2a1de53c-eb34-bbe5-6940-72728fa41663.png)



# LooksRareのAPIリファレンス
ただ、２０２２年１２月現在、OpenseaはAPIキーの取得ができないようなので諦め、
今回は「LooksRare」というNFTマーケットのAPIを使ってみました。
`top5 listing rewards` という項目で情報を取得してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/2772cfec-6995-50d4-2f2c-434537fa192d.png)


# enebularノード作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/d17b4b4f-0a22-2124-bef4-4cbd7cb4817a.png)

http requestノードでGETしてきます

![スクリーンショット 2022-12-23 18.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/8190ef61-1ceb-738a-d810-98efaa41f3a4.png)

ここでTop5コレクションのIDが取得できたので、
IDをもとに詳細情報をさらに取得します。
![スクリーンショット 2022-12-23 18.49.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/75141dc4-3d87-5a65-747c-e697a73a9855.png)


# Spreadsheetに記入

[こちらの記事](https://blog.enebular.com/nodes/letsuse-google-spreadsheet-node/)を参照して、
Googleスプレッドシート・ノードを利用し、とりあえずSpreadsheetに記入することができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242072/58b9071d-2a02-ec7b-bb8d-6b007ee424da.png)


# 今回はここまで
とりあえずデータの取得はできたので、
これをもとにより詳細なデータを分析してDBにデータを蓄積したいですね！
BigQueryの「実行グラフ」をさわってみた

## はじめに
こんにちは、CI部の上野です。
本日でアドベントカレンダーも24日目となります。
世間ではクリスマスイブですが特に予定もないので、本日は最近BigQueryにプレビュー版で追加された「実行グラフ」をさわっていきたいと思います。
![execution-graph-overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036920/98bf3929-cd59-c88f-8a76-34e7bc30e56f.png)

## そもそもBigQuery とは
BigQueryはGoogle Cloud Platform の分析用エンタープライズ データ ウェアハウスです。BigQueryの特徴としては以下のような点が挙げられます。
- フルマネージド（クエリーサービス）として提供
- 費用は利用した分のみの従量課金
- 既存DWHの課題を解消したクラウド型DWH
- 大容量データを活用する拡張（GISとML）

今回は、BigQueryでのデータ処理を最近追加された「実行グラフ」で可視化してみた感想となります。
## クエリ実行の詳細を表示する

### 実行グラフの表示手順
1. Google Cloud コンソールで [BigQuery] ページを開きます。
2. [エディタ] で [個人履歴] または [プロジェクト履歴] をクリックします。
3. ジョブのリストで、関心のあるクエリジョブを特定します。[more_vert アクション] をクリックし、[クエリをエディタで開く] を選択します。
4. [実行グラフ] タブを選択して、クエリの各ステージをグラフィカルに表示します。

### 実行グラフの機能
実際にBigQueryクエリを実行して、その結果に対して「実行グラフ」を表示してみました。
テーブルやそれぞれの処理について、「実行グラフ」の図をクリックするとテーブルの詳細や処理の実行時間、読み取ったレコード数や書き込んだレコード数などを確認することができます。
![スクリーンショット (201)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036920/acdfb047-224e-90e6-da57-6eebd7d9e51e.jpeg)

読み取ったレコード数や書き込んだレコード数については、グラフ内の遷移の矢印に書いてある数値で確認することもできます。

では、実行グラフ上部のコントロールバーを触っていきたいと思います。
右上の「Show / Hide Minimap」を押すと、右側に「今グラフ全体に対してどの範囲が表示されているか」が表示されます。
![Inkedexecution-graph-overview_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036920/ee5db94d-26c1-4fa9-1125-5021c0ec555a.jpeg)

左隣の「グラフを全画面で表示」を押すと、ページ一面での表示に切り替わるのでとても見やすくなります。
「実行情報を表示する」をオンにすると、それぞれの処理を表示する図に実行情報が追加されます。ただし、ほとんどの実行情報が図に入り切っていないので、基本的にはこの機能は使わずに、見たい実行情報については処理ごとに図をクリックして確認することになると思います。
![スクリーンショット (202)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036920/9c1e2d31-887a-70d4-b4bf-bdd863cd6560.jpeg)


グラフでステージ期間ごとの上位ステージをハイライト表示するには、[期間別に上位のステージをハイライト表示する] をクリックします。実行してみると「SO6:Output」がハイライト表示されました。
![スクリーンショット (203)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036920/0ed000c6-df70-98a4-53f5-b2838c8f91c6.jpeg)


使用されたスロット時間別の上位グラフをグラフでハイライト表示するには、[処理別に上位ステージをハイライト表示する] をクリックします。実行してみると「SO4:Join+」がハイライト表示されました。
![スクリーンショット (204)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036920/89309d09-893a-c1d3-0acc-042cfeb92dcf.jpeg)

## おわりに
BigQueryの「実行グラフ」を実際に使ってみると、処理の流れやテーブルの結合関係などが視覚的に分かりやすくなったと思います。また、それぞれの処理の図をクリックすると実行時間や読み込みデータ量などがわかるので、処理のパフォーマンスに対するボトルネックの特定などにも是非ご活用ください。
最後まで読んでいただきありがとうございました。

## 参考資料

[クエリ実行の詳細を表示する（Google Cloud公式ドキュメント）](https://cloud.google.com/bigquery/docs/query-insights?hl=ja#view_query_execution_details)
mpdf×cssに苦戦した備忘録

## mpdfとは
mpdfとは、PDFファイルを作成するPHPのライブラリです。
htmlをpdf形式のファイルにして出力します。このhtmlに対して指定するcssが、mpdfライブラリを通すと全然使えなくて大変だったので、それぞれの解決策の備忘録です。

## break-insideで改ページできない

改ページ位置を指定する`break-inside`が使えないときがあります。

```css
/* 使いたかったやつ */
div {break-inside: avoid;}
```

途中でページをまたぎたくない要素があったのでどうにかして指定したい。
→divに対して**heightの指定**をしたら、その高さが入りきらない場合に勝手に改ページしてくれるようになりました！
```css
/* 解決！ */
div {height: 300px;}
```

## floatが使えない
配置を決める系のCSSがことごとく簡単に使えません！！！
htmlをブラウザで見るとcssが効いているのにmpdfを通したファイルでは効いていない現象。
`float`を使うときは、必ず`width`を一緒に指定する必要があるみたいです。

```css
#contents {
    width: 720px;
    float: left;
}
```

他にも`position`、`display`などもwidthを指定したり、記載順を変えてみたり、試行錯誤が必要。頑張りましょう（がんばるしかない）


## font-sizeが効かない
`width`をpxで指定すると、なぜか入れ子要素のfont-size指定が無効になる。地味に苦戦。。
`width`を％で指定する方法で解決しました！



## 感想
次回やるときもきっと苦戦しそうだしきっと忘れている気がする！
ConnectXで強化学習したい




https://www.kaggle.com/code/ajeffries/connectx-getting-started

https://www.kaggle.com/code/phunghieu/connectx-with-deep-q-learning-pytorch

result = state['board'][:]
でboardがないとエラーが起こるのでこちらを参考にして下さい。

https://www.kaggle.com/c/connectx/discussion/129145

どうやらstate[0]とstate[1]を切り替えなければならないそうです。
```
def play_game(env, TrainNet, TargetNet, epsilon, copy_step):
    rewards = 0
    iter = 0
    done = False
    observations = env.reset()

    while not done:
        if env.state[0].status == 'ACTIVE':
            player_id = 0
        elif env.state[1].status == 'ACTIVE':
            player_id = 1
        observations = env.state[player_id].observation
        # Using epsilon-greedy to get an action
        action = TrainNet.get_action(observations, epsilon)

        # Caching the information of current state
        prev_observations = observations

        # Take action
        observations, reward, done, _ = env.step(action)

        # Apply new rules
        if done:
            TrainNet.train_loss /= iter
            if reward == 1: # Won
                reward = 20
            elif reward == 0: # Lost
                reward = -20
            else: # Draw
                reward = 10
        else:
#             reward = -0.05 # Try to prevent the agent from taking a long move

            # Try to promote the agent to "struggle" when playing against negamax agent
            # as Magolor's (@magolor) idea
            reward = 0.5

        rewards += reward

        # Adding experience into buffer
        exp = {'s': prev_observations, 'a': action, 'r': reward, 's2': observations, 'done': done}
        TrainNet.add_experience(exp)

        # Train the training model by using experiences in buffer and the target model
        TrainNet.train(TargetNet)
        iter += 1
        if iter % copy_step == 0:
            # Update the weights of the target model when reaching enough "copy step"
            TargetNet.copy_weights(TrainNet)
    return rewards
```
AWS Well-Architected フレームワーク入門

# AWS Well-Architected フレームワーク入門

AWSでサービスを構築するにあたってどこから手を付けていいか？で悩むことがあり、どういった基準でAWSのサービスをどう導入するかなど、情報が多様すぎて、情報の海に溺れがちです。

多くの人は、ネットで検索したり、書籍が主な収集源かとは思います。
あとはAWSの公式ドキュメントを参考にするかと思います。

そういった中でAWSが公式でWell-Architectedフレームワークという考え方が提供されています。
今回はポイントだけをまとめています。

## 一般的な設計原則
* 必要なキャパシティーの推測をやめる。
* 本稼働スケールでテストできる。
* 実験を行いやすくなる。
* アーキテクチャーを進化させることができる。
* データドリブンなアーキテクチャを構築する
* ゲームデーを使って向上を図る。

## Well-Architedの柱
5つの柱をWell-Architedの柱にしています。

* 運用上の優秀性
* セキュリティ
* 信頼性
* パフォーマンス効率
* コスト最適化


### 運用上の優秀性
ビジネス価値を提供し、サポートのプロセスや手順を継続的に改善するために、システムを実行しモニタリングする能力
次の分野を対象にしています。
<dl>
  <dt>組織</dt>
  <dd>チームのメンバーがビジネス面の成功に導く</dd>
  <dt>準備</dt>
  <dd>本番稼働の準備</dd>
  <dt>運用</dt>
  <dd>ワークロードの運用方法など</dd>
  <dt>進化</dt>
  <dd>フィードバックを活用し、経験を学び、改善につながるようにする。</dd>
</dl>

### セキュリティ
* アイデンティティとアクセスの管理 
* 検出
* インフラストラクチャの保護
* データの保護
* インシデントへの対応

### 信頼性
 障害回復機能と可用性に焦点を当てている。
* 基盤
* ワークロードのアーキテクチャ
* 変更管理
* 障害管理

### パフォーマンス効率
システム要件を満たすためにコンピューティングリソースを効率的に使用し、需要の変化と技術の進化に応じてその効率性を維持する能力
<dl>
  <dt>選択</dt>
  <dd>コンピューティング、ストレージ、ネットワーク</dd>
  <dt>レビュー</dt>
  <dd>選択結果を新しいリソースや機能など、AWS継続的な技術革新に照らし合わせてレビューすること</dd>
  <dt>モニタリング</dt>
  <dd>リソースパフォーマンスを把握する</dd>
  <dt>ソースパフォーマンスを把握する</dt>
  <dd>フィードバックを活用し、経験を学び、改善につながるようにする。</dd>
  <dt>トレードオフ</dt>
  <dd>パフォーマンス効率を最大化するべきアーキテクチャのトレードオフ</dd>
</dl>

### コスト最適化
最も低い価格でビジネス成果を達成する能力
 ・クラウドの財務管理を実践する。
 ・支出と使用状況を把握する。
 ・効果的なリソースにコストをかける。
  ・需要を管理し、リソースを供給する。
  ・継続的に最適化する。

## 一般的な利用方法
* クラウドネイティブなアーキテクチャを構築する方法を学習する
* バックログを作成する
* ローンチ前の最終チェック機構を組み込む
* 複数のチームの成熟度を比較する。

## 重要なポイント
* クラウド上のアーキテクチャに関して十分な情報に基づいた意思決定を行い、その決定が及ぼす可能性のある影響を把握する。
* 設計原則を活用してクラウドネイティブなアーキテクチャとはどのようなものかを理解する。
* 質問は出発点にすぎない。「想定される事態」と失敗のシナリオについて能動的に考える必要がある.


#### Well-Architected toolについて
AWSにはワークロードがAWS Well-Architedフレームワークにどれだけマッチしているかをチェックするためのツールが用意されています。


##### 参考にしたサイト

https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc&wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&wa-guidance-whitepapers.sort-order=desc

https://explore.skillbuilder.aws/learn/course/external/view/elearning/2045/aws-well-architected?laar=tile&tile=dt
OpenCVを使用して自作画像データをnumpy配列読み込み


# 自前のjpg画像データを使用して機械学習とかさせたい
#### 教本等ではkerasのload_mnist などで持ってきたのMNISTデータ等で学習している。
#### がしかし実用化とか考えるとmnist 等は利用しない自作データを持ってきて学習させるためにはndarray形式にさせる必要がある。


## 用意
画像のみが入っているフォルダを作成
右クリックプロパティとかでそのフォルダのアドレスを取得しておく


:::note warn
## 注意点
 画像を格納しているフォルダは画像以外のデータが入っているとエラーを吐くので、画像のみとする 
:::
:::note warn
## 注意点
 opencvの仕様か、そのままだとBGRで読み込まれる。必要に応じてRGBに変更してください
:::

## importしたもの
```
import os 
import numpy as np
import glob
import cv2
```

## 実行時のバージョン　pip
- ### numpy
        numpy  1.21.5
- ### cv2 
        opencv-python  4.6.0.66
## 作成したプログラム
```
#学習データの場所を指定
#学習データの場所を指定　アドレスの取得
train=glob.glob(os.path.join("address", '*'))
#address="/Users/User1/data/train"
#画像のサイズの指定
#横
x_size=256
#縦
y_size=320
#データの格納
x_train=[]
for j in range(len(train)):
        img=cv2.imread(os.path.join(train[j]))
        
        #グレイスケール変換を行うとき
        #img=cv2.cvtColor(timg,cv2.COLOR_BGR2GRAY)
        
        img=np.asarray(img)
        #指定したサイズに変更
        img_resize=cv2.resize(img,(x_size,y_size))
        #格納
        x_train.append(img_resize)
#正規化
x_train=np.float32(x_train)
x_train/=255
```
## 解説
:::note warn
trainとx_trainは別物

:::



### trainの説明
trainには参照先のフォルダ内の画像のアドレスがそれぞれ格納される


:::note
["/Users/User1/data/train/1.jpg","/Users/User1/data/train/2.jpg"......]
の様に格納される。
:::

### img=cv2.imread(os.path.join(train[j])
trainのｊ番目、"/Users/User1/data/train/〇〇.png"から画像を取得する

### img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
これを入れるとグレースケール変換が行われる。

### img=np.asarray(img)
numpy配列に変換

###  img_resize=cv2.resize(img,(x_size,y_size))
指定したサイズに変更

### x_train.append(img_resize)
学習用の配列に追加



### for文の後にnp.shape(x_train)　すると、(枚数,縦,横）で読み込まれることが確認できる。


# モデルに入れるとき


```
input_img = Input(shape=(size, size, 3))
```
### のように指定する。この時白黒もしくはグレースケール変換したものであれば以下のようにする。
```
input_img = Input(shape=(size, size, 1))
```
以上