OmniAICreator/Qiita-1.07M huggingface dataset:
大学在学中に応用情報に合格しました　～資格勉強のコツ～

# 0. はじめに
こんにちは、Shuntaです。
令和5年度の秋期試験で応用情報に合格しました！

記事のタイトルにある通り、資格勉強のコツについて紹介したいと思います。
というのも、私がこの2年間で8個の資格を取得したからです。最初に応用情報について述べ、その後に資格勉強のコツについて紹介します。

# 1. 試験結果について
春期試験で1回落ちているため累計で2回受験しています。それぞれの得点を下表に示します。

|応用情報技術者試験|午前試験|午後試験|
|:-:|:-:|:-:|
|**前回(1回目)**|**65点**|<font color="Red">**45点**</font>|
|**今回(2回目)**|**70点**|**66点**|

1回目の試験では2冊の参考書を使いました。
1. [『キタミ式イラストIT塾 応用情報技術者』](https://www.amazon.co.jp/dp/4297131889)
1. [『情報処理教科書 出るとこだけ！応用情報技術者［午後］』](https://www.amazon.co.jp/dp/4798156507)

2回目の試験では午後試験対策用に[『応用情報技術者　午後問題の重点対策』](https://www.amazon.co.jp/dp/4865752757)を読もうと思いましたが、以下の記事を読んだことで使うことはありませんでした。

- https://qiita.com/deuteridayo/items/1c19413a01beec0663a3

> # 試験勉強
> 午前・午後ともに参考書等は購入せず、[過去問道場](https://www.ap-siken.com)だけをやりました。

この方は過去問道場のみで合格したそうです。

私は1回目の試験前に軽く午後試験対策をしていることと、午前試験の結果が65点であることから過去問道場を活用することで基礎力を高めることが大切だと判断し、2回目の勉強は過去問道場のみでした。資格勉強においては、このように自分のやり方を途中で変えるのも大切だと思います。

# 2. 資格勉強のコツ
## 2.1 取得した資格
大学2年で5つ、大学3年で3つの資格を取得しました。
- **大学2年(2022年)**
    - 3月：データサイエンス数学ストラテジスト(上級)
    - 4月：実用数学技能検定準1級
    - 6月：基本情報技術者試験
    - 11月：G検定
    - 12月：Python3 エンジニア認定基礎試験
- **大学3年(2023年)**
    - 11月：ITパスポート試験
    - 12月：応用情報技術者試験、Python3 エンジニア認定データ分析試験

いずれの資格においても勉強方法は共通する部分が多く、迷いに迷った結果、記事にしようと思いました。なぜ記事にすることに躊躇いを感じたかというと、勉強法の向き不向きは人それぞれだからです。しかし、様々な勉強法を試してみないと自分に合った勉強法に出会えないのではないかと思い、筆を執りました。

## 2.2 自分に合った教材を探す
資格勉強をする上で教材探しは重要ですが、教材探しにこだわって時間が無駄になることもあるため、以下のようなステップで教材を探しています。
1. ネットで合格体験記などを検索し、オススメの教材をいくつかメモする
1. X(旧：Twitter)で同様に検索し、オススメの教材をいくつかメモする
1. 書店に行き、メモした教材を探して開いたときに内容に納得感があれば購入する(2～3冊が望ましい)

## 2.3 勉強計画を立てる
次にやることは勉強計画を立てることでしょう。しかし、私はこれはオススメできません。
これまでにある程度資格勉強をしていないと見積もりは難しいからです。そこで、購入した教材を数章読んだ段階で勉強計画を立てることをオススメします。**PDCA**ではなく、**<font color="Red">D</font>PDCA**でやるわけです。

## 2.4 勉強をする
これ以降に関しては人それぞれだと思いますので述べません。言い換えると準備段階で、きちんと準備できていればその後の作業はあまり問題にならないということです。

## 2.5 自分に合った勉強法を見つける
ここまで、私の勉強法について紹介しました。私もこれまでに様々な勉強法を試してきました。その際に参考にした本があり、真ん中に付箋が沢山貼られている本がそれです。皆さんが自分に合った勉強法に出会えることを願っています。
- [『独学大全』](https://www.amazon.co.jp/dp/4478108536)

![IMG_7025.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1923849/0154675d-40d5-8534-26fe-58ea2de3b26d.jpeg)

# 3. 最後に
最近はChatGPTも学習ツールとして使われる時代になり、今後の資格勉強において取り入れたいと思っています。

最後までお読みいただきありがとうございました。
【AWS】DynamoDB

# DynamoDBとは
AWSが提供する完全マネージド型のNoSQLデータベースであり，AP型データベースの代表例。リレーショナルデータベースのように，テーブル構造を固定することなく(スキーマレス)様々な形式のデータを格納できる。データサイズ上限は1項目あたり400KB。
水平スケーラビリティに優れた特徴を持つ。
DynamoDBでは親キーを**パーティションキー**，子キーを**ソートキー**と呼ぶ。ルールとしては以下である。

* 親キーで配置されるノード(データ)が決定
* ノード内のデータ順序を決定する子キーを任意に設定可。子キーを作成しない場合は親キーでデータを特定できるようにする必要がある。
* キーにはインデックスを設定可。

:::note info
**AP型データベース**
一貫性(Consistency)が下がる代わりに，可用性(Availability)とネットワーク分断耐性(Partition Tolerance)を高めている。単一障害点が無いことが特徴で，どこのノードからでもデータ更新が可能。
しかし，複数のノード間で整合性の取れないケースが発生するため，回避するために**ReadRepair機能**(読み込み時に最新のデータで古いノードのデータを更新)や**Quorum**で結果整合性を取るなどを行う。
:::

タイプは4種類ある。
* キーバリュー型
* ドキュメント型
* グラフ指向
* カラム型

DynamoDBのメリットは以下の通りである。
## ストレージ
無制限に増やすことができる

## サーバーレス
フルマネージドサービスのため，サーバの管理等はAWSが実施。

## 可用性
複数のAZでデータを保存。自動的にマルチAZ構成になっている。

## パフォーマンス
数ミリ秒台の応答時間をサポート。またDynamoDB ACccelatorを使用することで，最大10倍のパフォーマンス向上が可能。

# 利用料金
DynamoDBには2種類の課金体系がある。
| 料金体系 | 説明 |
| ---- | ---- |
| オンデマンドキャパシティモード | リクエスト数に応じた従量課金 |
| プロビジョンドキャパシティモード | キャパシティユニットの設定に応じた時間単位の従量課金 |
blastengineがどこでリクエストを受け付けるか調べてみた

この記事は「[意外な落とし穴！？ Webサービスに必須のメール送信機能の実装ナレッジ・運用ノウハウ・失敗談などあなたのTipsを投稿してください！ by blastengine Advent Calendar 2023](https://qiita.com/advent-calendar/2023/blastengine)」の17日目の記事です。

[blastengineのサイト](https://blastengine.jp/)で目を惹くのが「日本国内への高速かつ...」という部分。高速ってことは国内で処理されるんだろうなぁ、と気になって調べてみました。

![2023-12-22_21h43_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/ebad7ea5-2801-1a87-859a-6721536bfb62.png)

blastengineの送信方法はAPIとSMTPです。それぞれAレコードを引いてgeoiplookupで国を調べてみました。

## API

```
> dig +short app.engn.jp a
176.34.33.167
54.199.53.83
18.180.204.238
```

```
> geoiplookup 176.34.33.167
GeoIP Country Edition: JP, Japan

> geoiplookup 54.199.53.83
GeoIP Country Edition: JP, Japan

> geoiplookup 18.180.204.238
GeoIP Country Edition: JP, Japan
```

おぉ、全部日本！

## SMTP

```
> dig +short smtp.engn.jp a
35.73.27.26
35.76.3.4
```

```
> geoiplookup 35.73.27.26
GeoIP Country Edition: US, United States

>geoiplookup 35.73.3.4
GeoIP Country Edition: US, United States
```

おろろ、USですか。

## 結論

それぞれで送ったメールのReceivedヘッダを確認したところ、APIの場合は全部国内だったので確かに速そうです。SMTPを使うと一旦USに飛んでしまうのでAPIに比べると若干差がでるかも？
KUSANAGI for WordPress認定試験

<h1>KUSANAGI for WordPress認定試験</h1>
<div>
<p>公式URLより引用しております。</p>

<ul>
<li>問題数 40問</li>
<li>出題形式	選択式</li>
<li>試験方式	コンピューター上で実施するCBT（Computer Based Testing）方式</li>
<li>試験時間	60分</li>
<li>合格基準	7割正解</li>
<li>受験料	一般価格：11,000円（税込） / 学割価格： 5,500円（税込）</li>
<li>出題範囲	
「詳解WordPress」を主教材とし、一般的な知識やKUSANAGI公式サイトおよび関連サービスなどからも出題します。</li>

</ul>
<div>





▽詳細は下記のURLから確認
https://cbt.odyssey-com.co.jp/kusanagi/kusanagi.html
SharePoint リスト を Excel から作成する時の挙動の違い

この記事は「[Microsoft 365 Advent Calendar 2023](https://adventar.org/calendars/8908)」に参加しています。
12月22日の記事です。

# はじめに
ごきげんよう、百合宮桜です。
今回は SharePoint リストを Excel から作成する時の挙動の違いについて書こうと思います。
Excel から SharePoint リスト を作成する方法は現在2種類あります。

- Excel 側からアプローチする方法
- SharePoint 側からアプローチする方法

この2つでいくつか挙動が異なる点があります。
同じじゃないんかーい！ってツッコみたくなりますよね？
はい、違います。個性を大切にするタイプ見たいです(*'▽')
この挙動の違いは、普段の開発では特に気になりませんが、ハンズオンとかヒトに教える機会があると「あらあら、 Excel から SharePoint リストを作成したのに同じように行かないねぇ……」と致命的なミスになります💦
なので、トレーニングやハンズオンを行う予定の方は覚えておくことをお勧めします。

# 前提条件
Excel が以下の状態であることが前提の検証です。
ご承知おきください。

- テーブル化されている
- 列名は半角英数文字（アルファベット）である

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/13f82c10-6978-947e-e005-80d6291bdf21.png)

# Excel 側からのアプローチ
Excel から SharePoint リスト を作成する場合は「テーブルデザイン」から行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/4e903c8e-a26c-d26b-5b3a-0683b997cf11.png)

詳細な作り方は下記をご確認ください。

https://support.microsoft.com/ja-jp/office/excel-%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92-sharepoint-%E3%81%AB%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B-974544f9-94bc-4aa8-9159-97282d256dab#BKMK_ExportTableSPList

## 違い1.デフォルトでグリッドビューが開いた状態になる
リストを開くたびにグリッドビューが開いた状態になります。
なので、編集したくない場合は「グリッドビューの終了」を都度クリックしなければなりません（´・ω・｀）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/f9698fd4-6061-cd10-2f0d-2ec21ffc4a9f.png)

## 違い2.Excel の見出し名が内部列名になっている
URL の Field= の後が内部列名ですが、こちらがExcelの見出し列名と同じになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/dc62e259-f131-0d42-856e-e24568508b18.png)


# SharePoint 側からのアプローチ

SharePoint から Excel を使用して、SharePoint リストを作成する場合は、リストの作成 ＞ Excel から行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/5c369bc4-0c9a-f099-da7d-c6545331c579.png)

詳細な作り方は下記をご確認ください。

https://support.microsoft.com/ja-jp/office/%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-0d397414-d95f-41eb-addd-5e6eff41b083

## 違い1. グリッドビューは閉じた状態がデフォルト
グリッドビューは閉じた状態で、編集したい時に「グリッドビューでの編集」をクリックする仕様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/a196e017-5fe3-60d4-2155-4d79ac2ea5c9.png)


## 違い2. 内部列名は独自ルールで自動作成される
内部列名にExcelの見出し列名は使用されません。
独自ルールで勝手に名付けられますｗｗ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/caf08084-e540-da56-d73c-2f73bca990ce.png)

# まとめ

挙動の違いをまとめるとこんな感じです。

| アプローチ          | グリッドビュー | 内部列名         |
|----------------|---------|--------------|
| Excel から       | 開いた状態   | Excelの見出し列から |
| SharePoint から  | 閉じた状態   | 自動生成         |

SharePoint リストの内部列名は、Power Apps での画像列の使用や Power Automate でのフィルタークエリの使用などで重要になってくるパーツです。
内部列名を自動作成されてしまうと、フィルターをかけた時に「どの列にかけたやら……」と訳わかめになってしまう可能性もありますので、ご注意ください。
Azure OpenAI で Function Calling を使うときの endpoint の指定の仕方は二種類ある？

# 背景

LangChain を触ったので、似たようなものと思われる Function Calling を試そうとした

が、まぁ、当然の事ながら敵は手強いもので、サンプルそのままでは動かない

ということで、今現在分かったことを記録

# 概要

現状？ endpoint は二種類の指定方法がある様子。

たまたま動いているだけな気もしてしまいますけどね・・

|方法|endpoint|model|補足|
|-|-|-|-|
|正確なURL|https://{yours}.openai.azure.com/openai/deployments/{deployment_id}/chat/completions?api-version=2023-12-01-preview|model name|deployment_id, api_version を指定する。
|単純なURL|https://{yours}.openai.azure.com|deployment_id|base 指定なので、model=deployment_id として、api_version も指定する|

MS-Learn としては以下

これを見る限りは、単純なURLの方が正しいようにも見える

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/how-to/function-calling?tabs=python


## 正確なURL の例

endpoint で、deployment_id も api_version も指定

```python: サンプル
os.environ["AZURE_OPENAI_ENDPOINT"] = https://{yours}.openai.azure.com/openai/deployments/{deployment_id}/chat/completions?api-version=2023-12-01-preview

api_key = os.environ["AZURE_OPENAI_API_KEY"]
endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]

aoai_model = 'gpt-35-turbo'             # model: chat completion

client = AzureOpenAI(
    azure_endpoint = endpoint,
    api_key=api_key,
)
response = client.chat.completions.create(
    model=aoai_model,
    messages=messages,
    tools=tools,
    tool_choice="auto",  # auto is default, but we'll be explicit
)
```

Rest API の 構成については以下を参照

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/reference

## 単純なURL

endpoint で、deployment_id は、それぞれ引数として指定

他との共通性を考えるとこっちかな、と

ただ、どっちが本流（deprecated されない）のかは未調査

```python: サンプル
os.environ["AZURE_OPENAI_ENDPOINT"] = https://{yours}.openai.azure.com

api_key = os.environ["AZURE_OPENAI_API_KEY"]
endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]

deployment = 'gpt-35-turbo-0613'        # deployment_id

client = AzureOpenAI(
    azure_endpoint = endpoint,
    api_key=api_key,
    api_version = "2023-12-01-preview",
)
response = client.chat.completions.create(
    model=deployment,
    messages=messages,
    tools=tools,
    tool_choice="auto",  # auto is default, but we'll be explicit
)
```

# あとがき

- deployment_id を見ると分かるが、east_us の region でやっていた為、gpt3.5 1106 が使えず、並列呼び出しはまだ動かせてない・・ :sweat: 

ということで、以下モデル一覧をみて、現在 westus のクォータ申請中。
来週出来るといいなぁ・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d176ec08-4ff6-a7af-d19c-c204b4885936.png)

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/concepts/models#gpt-35-turbo-model-availability
楕円曲線をsympyのplot_implicitでグラフにする（その１）


暗号理論でも名前だけは聞く楕円曲線ですがこれをグラフに描けと言われても結構難しいですね。sympyのplot_implicitを使えば簡単にグラフにでき、さらにそのグラフをmatplotlibの中に取り込んで利用する方法を紹介します。

### sympyのplot_implicitでグラフを描く

**例題１: 楕円曲線$y^2=x^3-4x$のグラフを描け**

plot_implicitは非常に便利で、関数を$f(x,y)=0$の形（陰関数 implicit function）で与えるとグラフを描いてくれるというものです。

例題では、楕円曲線$y^2=x^3-4x$の式を渡すだけで描いてくれます。

```python 
from sympy import var
from sympy.plotting import plot_implicit
import matplotlib.pyplot as plt
var('x,y')
size = 5
plt = plot_implicit(x**3-4*x-y**2, (x, -size, size), (y, -size, size))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/6549af9f-930a-89ec-9a48-7846a196222f.png)

### 楕円曲線のグラフとその上の点を表示

ただこれだと他のmatplotlibの機能と組み合わせて他の図形を重ね合したりすることが出来ません。そこでplot_implicitを使うけど描画せずにget_pointsで座標だけを取得してmatplotlibのfillを使って描きます。
この座標だけを取得する関数plot_fxyを以下のように定義します。

```python 
import sympy as sp
def plot_fxy(G,CX,CY):
  p = sp.plot_implicit(G, (x,)+CX, (y,)+CY, show=False)[0].get_points()[0]
  px, py = [], []
  for (ix, iy) in p:
    px.extend([ix.start, ix.start, ix.end, ix.end, None])
    py.extend([iy.start, iy.end, iy.end, iy.start, None])
  return (px, py)
```
これを使って次の例題を解きます

**例題２: 楕円曲線$y^2=x^3+17$のグラフを描き次の５点(-2,3), (-1,4), (2,5),(4,9),(8,23)がこの曲線上にあることを確認せよ**

ここではX, Y=[-30,30]のサイズのキャンバスがinit_subplot（コードは最後に添付）で定義されたとして以下のコードで描くことができます。

```python 
# 楕円曲線とその上の点
import matplotlib.pyplot as plt
sizex = 30
CX, CY = (-sizex, sizex), (-sizex, sizex)
ax = init_subplot(plt, CX, CY)

x, y = sp.symbols("x y")
ax.fill(*plot_fxy(x**3+17-y**2, CX, CY), facecolor='blue')
QP = [(-2,3),(-1,4),(2,5),(4,9),(8,23)]
for (qx,qy) in QP:
  ax.plot(qx,qy, marker='o', ms="2.0", color='red')
  ax.text(qx+1,qy-1, f"({qx},{qy})")
plt.show
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/55b622d8-1351-431d-967c-473c377564c4.png)


### 色々な楕円曲線を描く

次は[楕円曲線(Wikipedia)](https://ja.wikipedia.org/wiki/%E6%A5%95%E5%86%86%E6%9B%B2%E7%B7%9A)にある楕円曲線のカタログのようにヴァイエルシュトラスの標準形のaとbを変えたグラフを描いてみます。

```python 
# 楕円曲線のカタログ
sizex = 3
CX, CY = (-sizex, sizex), (-sizex, sizex)
am, bm = 4, 4
ax = init_subplot(plt, CX, CY, am, bm)  # Create 4 x 4 subplot

x, y = sp.symbols("x y")
for c in range(am):
  for r in range(bm):
    a, b = r-2, c-1
    ax[r,c].fill(*plot_fxy(x**3+a*x+b-y**2, CX, CY), facecolor='blue')
    ax[r,c].set_title(f"** a={a}, b={b} **")
plt.show
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/175c4851-3349-a340-e805-d9368af337ce.png)

これで楕円曲線をmatplotlibのsubplot上に描けるようになったので、次の（その２）楕円曲線の演算をグラフで表していきたいと思います。

（開発環境：Google Colab）

### （添付）init_subplotのソースコード
```python 
def init_subplot(plt, cx, cy, nccol=1, ncrow=1):
  if nccol*ncrow == 1:
    fig, ax = plt.subplots(nccol, ncrow, figsize=(4,4))
    plt.tick_params(labelsize="large")
    ax.set_xlim(cx); ax.set_ylim(cy)
    ax.set_aspect('equal')
    ax.grid()
  else:
    fig, ax = plt.subplots(nccol, ncrow, figsize=(8,8))
    plt.tick_params(labelsize="small")
    plt.rcParams["font.size"] = 5
    plt.tight_layout()
    for c in range(nccol):
      for r in range(ncrow):
        ax[r,c].set_xlim(cx); ax[r,c].set_ylim(cy)
        ax[r,c].set_aspect('equal')
  return ax

```
駆け出しエンジニアの技術書典＆技術同人の楽しみ方


皆さん、技術同人に興味はあるでしょうか？
この記事を読んでいる方はきっと興味があるのだと思います。

しかし駆け出しエンジニアの中には
「興味があっても何を買えばいいかわからない」
「購入した技術同人がハズレだったらどうしよう」
と思ってしまいなかなか購入に踏み切れない人もいるでしょう。

私自身もまだまだ駆け出しエンジニアですが、多くの技術同人を選んでいる内に、初心者が買うとお得な技術同人の選び方がわかってきました。

この記事では「技術書典の魅力」と「技術同人を選ぶ時に意識していること」を紹介したいと思います。

### この記事でわかること

- 技術書典とは？
- 技術書典の魅力
- 技術同人の購入予算目安
- どの技術同人を買うべきか
- 電子版しか在庫がない時の一時的な対処法

### 技術書典とは？

以下技術書典ヘルプセンターより引用します。

>技術書典（ぎじゅつしょてん）は新しい技術に出会えるお祭りです。
技術書典は「いろんな技術の普及を手伝いたい」という想いではじまりました。技術書を中心として出展者はノウハウを詰め込み、来場者はこの場にしかないおもしろい技術書をさがし求める、そんな技術に関わる人のための場として我々は技術書典を開催しています。

https://techbookfest.zendesk.com/hc/ja/articles/360050930552-%E6%8A%80%E8%A1%93%E6%9B%B8%E5%85%B8%E3%81%A8%E3%81%AF%E3%81%AA%E3%82%93%E3%81%A7%E3%81%99%E3%81%8B-

### 技術書典の魅力

技術書典とは？で引用したように**「技術書を中心として出展者はノウハウを詰め込み、来場者はこの場にしかないおもしろい技術書をさがし求める」** これが1番の魅力だと私は感じています。

例えば、こんな技術書を購入することができます。
- 市販されにくい中級者向けの技術書
- まだ新しい技術について書かれた技術書
- CSやエミュレータなどマニアックな知識が書かれた技術書
- ファシリテーションやイベント運営について書かれた技術書

特に「市販されにくい中級者向けの技術書」は非常に貴重です。
私のような地方の駆け出しエンジニアはこういった情報に触れ、自分の技術を高めるしかない時があります。そんな時、500-1000円で購入できる技術同人は本当にありがたいのです。

### 技術同人の購入予算目安

さて、ここからは技術同人の購入のコツを紹介していきたいと思います。

まずは、技術同人の購入予算目安です。
技術書典15で私が購入した技術同人と各本の価格を掲載します。

| 書籍名 | 形式 | 価格 |
| --- | --- | ---|
| Rustで作るGAME BOYエミュレータ | 電子版 | ¥1,000 |
| パフォーマンス⾰命 — アプリケーション性能改善のために若⼿が奮闘した記録 — | 電子版 | ¥1,000 |
| Dockerと和解せよ！ | 電子+紙 | ¥700 |
| Hatena Tech Book Vol.2 | 電子版 | ¥700 |
| freee 技術の本 | 電子+紙 | ¥1,000 |
| DNSをはじめよう ～基礎からトラブルシューティングまで～ 改訂第2版 | 電子+紙 | ¥1,000 |
| 要件定義から実装までJTC向けAWSガードレール StackSets構築解説つき | 電子版 | ¥600 |
| JTCでもできる検証環境コスト管理自動運用 | 電子版 | ¥500 |

合計で6500円です。
読む時間が確保できないと考え保留した2冊を考慮しても10000円あれば十分でした。

ですので10000円から20000円用意しておけば自分の欲しい技術同人は目いっぱい買えると思われます。

### どの技術同人を買うべきか

さて、予算が決まったところで次はどの技術同人を買うかです。

駆け出しがハズレを引かないためのオススメの方法があります。

上から順に調べて決めていくのがオススメです。

1. 知り合いのつよつよエンジニアが購入した技術同人の中で興味があるものを買う
1. 買った技術同人の著者が買っているものを買う
1. 自分の知りたい技術について検索し、良さそうなものを買う

つよつよエンジニアや技術同人著者は既に「よい技術同人を誰が書いているか」について知っていることが経験上多いです。技術書典で購入したものをTwitterでお披露目していることも多いです。その画像から興味がある技術同人を購入していきます。

予算は複数日に分けて使うようにした方がいいです。技術書典は複数日（技術書典15ではオンラインで16日間）行われます。ですので初日に予算は使い切らず、悩みながら購入するのがよいでしょう。あとから予算超過することを避けることができます。

背伸びした買い物はおすすめできません。技術同人は中古に出そうとしてもほぼ捨て値になっていることがメルカリを見ると多く、その場のノリで買うと、いくら安いとはいえ後悔してしまうでしょう。

電子版か物理本か迷うこともあるでしょう。物理本派かつ、+200円前後で物理本が手に入るなら　物理本を買うことをおすすめします。+200円払うことで電子版＋物理本が手に入る販売形式をとられている方が多い印象です。電子版もChatGPTに質問を投げやすく勉強がはかどる可能性があるので、買えるなら買っておくとよいでしょう。

### 電子版しか在庫がない時の一時的な対処法

どうしても電子版だと勉強がはかどらない人。わかります。私もそうです。そんな方のために一時的な対象を教えます。

それは電子版をルーズリーフに印刷して、バインダーにおさめてしまうことです。
こうすれば物理本に近い感覚で読むことができます。

**※絶対に人に配布するのはやめましょう。**

デメリットとしては、コピー用紙ではないのでまあよくページがくっついてでてきます。なのでプリンタに付きっ切りにならないと印刷に失敗します。

また、物理本を買うのに+200円だとしたらインク代、ルーズリーフ代を考えるとコスパは悪いです。なのでどうしても印刷して読みたいとき以外はオススメしません。

### さいごに

購入した技術同人の楽しみ方を箇条書きで伝授します。

- 技術同人を買ったら自慢しましょう。著者の励みになります。
- 面白い技術同人の感想は積極的に発信しましょう。
- 著者をフォローして学びましょう。
- 勉強になったら人に勧めましょう。
- ハンズオンを積極的に行い、サポートサイトがあれば質問してみましょう。

以上です。

次回の技術書典で皆さんが良い技術同人に出会えることを祈っています。
24日目：Predicting Goal-directed Human Attention Using Inverse Reinforcement Learning(2020)

### Predicting Goal-directed Human Attention Using Inverse Reinforcement Learning(Zhibo, 2020)

https://openaccess.thecvf.com/content_CVPR_2020/papers/Yang_Predicting_Goal-Directed_Human_Attention_Using_Inverse_Reinforcement_Learning_CVPR_2020_paper.pdf

#### 概要

この論文では、逆強化学習（IRL）モデルを提案し、視覚的検索中の人間の注視行動を予測します。モデルは内部報酬関数とポリシーを学習し、目標指向の行動の効果的な予測を行います。提案されたIRLモデルはCOCO-Search18データセットでのトレーニングと評価において、人間の検索行動に対する類似性や検索効率の観点でベースラインモデルを上回りました。

モデルではGeneratorは画像とタスクから目の動きをサンプリングして偽の状態-アクションペア{Bft, aft}を生成し、Discriminator（報酬関数）は本物の人間の状態-アクションペア{Brt, art}と区別し、Generatorを訓練する報酬を提供します。エージェントは画像内の特定の場所に焦点を合わせ、視線を変えることで内部の報酬を最大化し、DCB（Dynamic-Contextual-Belief）を使用して視覚的な情報を蓄積します。DCBは、高解像度の焦点領域、コンテキストの信念、およびダイナミクスから構成され、エージェントの進化する状態表現をモデリングします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/441bc510-44be-abbb-a684-0226dc9c1fce.png)


論文では、信念が視覚標的を探索する際の注視の選択に影響を与える可能性があり、動的な状態表現の変化について提案されています。提案されたヒューリスティックは、低解像度画像の周辺視覚入力に対応するコンテキスト信念に基づいて、探索者の各注視ごとに状態を更新します。報酬とポリシー学習にはGenerative Adversarial Imitation Learning（GAIL）が使用され、ディスクリミネーターとジェネレーターを備えた敵対的なフレームワークでビジュアルサーチ行動の報酬関数とポリシーを学習します。

なお、COCO-Search18データセットは、18のターゲットオブジェクトカテゴリーに対する10人の被験者の視線移動を記録した大規模で高品質なデータセットです。

10人の被験者が18のカテゴリを探索する実験で、ゲームパッドを使用してカテゴリごとに画像を判断。提案されたフレームワークとその構成要素を異なる実験で評価し、スキャンパスの予測モデルを比較。ヒトの検索誘導をIRLモデルが最も良く再現し、モデルの性能はヒトよりも低い。


まざまな予測手法と人間の検索者による対象注視の累積確率が比較され、IRLアルゴリズムが全ての指標で優れていることが示されています。また、IRLモデルの報酬マップは検索対象のカテゴリに依存し、異なるカテゴリで異なる注視が期待されることが強調されています。実装の詳細に関しては、320×512の入力画像を使用し、Panoptic-FPNや畳み込みニューラルネットワークなどが利用されています。
Leave-one-subject-out実験では、IRLモデルが新しい検索者の注視パスを効果的に予測できることが示されています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/858ac68d-2216-1ae2-76ff-f0b93bfeb467.png)


IRLモデルは、COCO-Search18テストデータセットでスキャンパス予測アルゴリズムを比較。グループモデルと個別モデルの性能差は無視できず、コンテキスト効果と方向優先性も検討された。また、特定の物体が検索効率に与える影響が調査され、フォークはナイフの検索に影響を与えるが、ケーキは助けになることが示唆された(?)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/efd13618-ce39-00aa-0751-cf9500446587.png)


提案されたモデルは、視覚的検索の際の人間の注視動作を予測するための新しいモデルであり、動的なコンテキスト信念（DCB）と呼ばれる独自の状態表現を使用しています。実験では、提案モデルが人間の注視動作を他のモデルよりも優れて予測し、データ効率が向上していることが示されています。この研究は、ロボットの検索アプリケーションや人間とコンピュータシステムの相互作用の向上に寄与する可能性があります。


この文書は、機械学習、視覚注意、および視線追跡に関する多数の研究論文を引用しています。これらの論文は、逆強化学習、深層ニューラルネットワーク、視線追跡の方法、ビジュアルアテンションモデリングなどに焦点を当てています。
与視線予測に関する論文では、異なるモデルや手法に焦点を当てています。異なるアプローチに基づく視線予測の研究が提示され、深層学習や画像特徴に関する重要な成果が述べられています。


### 所感
これまで見てきた論文とはちょっと毛色が異なるのか、全体的によくわからない。
逆強化学習というものを使っていることが肝なのはわかるが…
localStorageとは?


# localStorageとは?
ローカルストレージ(localStorage)は**javascriptでユーザーのデータをwebブラウザ(ローカル環境)に保存することができる仕組み**です。

データの保存・取得・削除はとても簡単で、`key`と`value`でデータを紐付けてデータを操作します。

最も大きなメリットは**データベースとの連携が必要ない**ということです。

例えば、ユーザーの行動（どのページを見たや、どの商品にお気に入りボタンを押したなど）データなどの**ユーザーごとのデータを保存して再利用したいけど、ログイン機能をつけるほどでもない**という時にローカルストレージがおすすめです。


# Cookie（クッキー）との比較

保存できるデータ容量や保存期間、通信の回数などやはりローカルストレージが使い勝手がいいです。

||保存期間|データ容量|通信|
|-|-|-|-|
|localStorage|半永久|5MB|なし|
|Cookie|有り|4KB |都度リクエスト|

# 基本的な使い方
```javascript
//保存
localStorage.setItem('Key', '保存する値');

//取得
const value = localStorage.getItem('Key');

//削除
localStorage.removeItem('Key');

//初期化
localStorage.clear();
```
2023年、毎月SoftwareDesign輪読＆座談会をやってきた振り返りなど

# はじめに

2023年11月、毎月開催してきた輪読&座談会が50回を超えました。🎉

https://softwaredesign.connpass.com/

もともとは社内のみで開催していましたが、第4回(表向きは第1回)から社外にも公開して実施するようになりました。

![スクリーンショット 2023-12-21 14.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ef251a9e-1d2f-3eb1-0d07-9954a182a52e.png)

https://softwaredesign.connpass.com/event/130954/

最初はオフライン会場のみで実施していましたが、コロナ禍はオンラインで開催し、最近はオフライン会場とオンラインのハイブリッドで開催しています。
オフライン会場は参加者のオフィスをお借りする場合も増えました。

# 過去の資料

基本的にこれまでの資料はすべて公開しています。

https://connpass.com/event/130954/

https://connpass.com/event/136932/

https://connpass.com/event/140674/

https://connpass.com/event/144401/

https://connpass.com/event/149623/

https://connpass.com/event/155331/

https://connpass.com/event/160692/

https://connpass.com/event/169581/

https://connpass.com/event/171533/

https://connpass.com/event/173819/

https://connpass.com/event/176118/

https://connpass.com/event/179140/

https://connpass.com/event/184955/

https://connpass.com/event/188519/

https://connpass.com/event/191358/

https://connpass.com/event/195097/

https://connpass.com/event/198518/

https://connpass.com/event/200672/

https://connpass.com/event/204192/

https://connpass.com/event/206987/

https://connpass.com/event/209776/

https://connpass.com/event/213028/

https://connpass.com/event/215724/

https://connpass.com/event/218571/

https://connpass.com/event/221630/

https://connpass.com/event/224375/

https://connpass.com/event/227036/

https://connpass.com/event/229777/

https://connpass.com/event/233449/

https://connpass.com/event/236210/

https://connpass.com/event/239088/

https://connpass.com/event/241747/

https://connpass.com/event/236210/

https://connpass.com/event/247644/

https://connpass.com/event/250639/

https://connpass.com/event/253627/

https://connpass.com/event/256417/

https://connpass.com/event/259754/

https://connpass.com/event/262323/

https://connpass.com/event/265602/

https://connpass.com/event/268888/

https://connpass.com/event/274660/

https://connpass.com/event/277780/

https://connpass.com/event/280518/

https://connpass.com/event/283544/

https://connpass.com/event/286485/

https://connpass.com/event/289296/

https://connpass.com/event/292824/

https://connpass.com/event/296944/

https://connpass.com/event/298736/

https://connpass.com/event/302945/

# ふりかえり

最初の頃のオフラインでは、飲み物と食べ物(お酒とおつまみ)を"あて"(肴)に輪読会(というより、雑談)を楽しんでいました。
その後、コロナ渦になりオンラインの開催となりましたが、運営面では(会社への移動、会場の設営、買い出しが無くなり)、楽(ラク)になりました。
年末年始は日程が合わず(毎月18日発売で輪読会を開催する前に次号が発売になる場合があったので)、スキップ(合併号)となることもありましたが、基本的に毎月開催してきました。
コロナ明けは基本的にハイブリッド(オフラインとオンライン)になりましたが、オフラインの"良さ"や"価値"は確実にあり、イベントの後に交流会(懇親会)を楽しめるようになりました。
時々、執筆者にゲスト参加していただいたり、稀に編集者に参加していただく機会もあり、単に雑誌を購入して読書するだけでは得られない話題(裏話)を聞くことや思い(情熱)も感じることができました。
もちろん、書籍の内容から様々な学びを得られたことは言うに及びません。

# さいごに

次回は来年(2024年)、1月15日にクラスメソッドさんの会場をお借りして開催する予定です。
昨今、休刊になる雑誌(WEB+DBマガジン、日経Linux、など)が増える中、ゲスト(執筆者)の杉金さんも参加し、記事の背景や誌面の都合で書けなかったことなどを伺う予定です。
少しでも興味を持っていただけた方は、ぜひ参加してください！一緒に学びましょう！！

https://softwaredesign.connpass.com/event/304394/
23日目：Improving saliency models’ predictions of the next fixation with humans’intrinsic cost of gaze shifts(2023)

### Improving saliency models’ predictions of the next fixation with humans’intrinsic cost of gaze shifts(Florian, 2023)

https://arxiv.org/abs/2207.04250

#### 概要
この論文では、人間の視線予測におけるギャップを減らすために、視線移動の人間の本質的なコストで、顕著性モデルの次の固視の予測を改善するアルゴリズムを提案します。次の視線ターゲットを予測するための原理的なフレームワークと、視線スイッチにかかる人間のコストの経験的な測定を用いて、どのように顕著性モデルの予測を改善するかについて説明しています。

#### 主な貢献
この論文の主な貢献は以下の3つです。

***1. 人間の視線移動の内在的コストを測定し、それを用いて静的なサリエンシーマップを改善する手法を提案したこと。***

***2. サリエンシーマップを用いて、次の視線移動を予測するための統計的意思決定理論の枠組みを提供したこと。***

***3. 予測精度を評価するために、新しい評価指標であるAUCを導入したこと。***

1つ目の貢献について、人間の視線移動の内在的コストを測定することで、静的なサリエンシーマップを改善することができました。これにより、従来のサリエンシーマップよりも高い予測精度を達成することができました。

2つ目の貢献について、統計的意思決定理論の枠組みを提供することで、次の視線移動を予測するための理論的な基盤を提供しました。これにより、より正確な予測が可能になりました。

3つ目の貢献について、新しい評価指標であるAUCを導入することで、従来の評価指標に比べてより正確な予測精度を評価することができました。これにより、より正確な予測モデルの開発が可能になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/5da45b1c-6f6e-5f24-c74b-aa71eac99850.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/d48e6505-21d6-a114-ade4-cc8b05851d52.png)


#### アルゴリズムで次の注視目標を予測するために使用される理論的枠組みとは?

このアルゴリズムで次の注視目標を予測するために使用される理論的枠組みは、統計的決定理論とマルコフ決定過程（MDP）に基づいている。このアルゴリズムは、スキャンパスを、MDPを用いて記述することができる報酬駆動型の行動シーケンスのシーケンスとして捉える。このアルゴリズムは、価値マップを用いて、価値マップに基づく方針から将来の固視位置を予測する。価値マップは、任意の顕著性モデルによって提供される顕著性マップ、視線移動の大きさと方向における嗜好を定量化する最近測定された人間のコスト関数、および後続の視線移動ごとに変化する逐次探索ボーナスに基づいて計算される。アルゴリズムは、最適な1ステップ先読み行動、すなわち、後続の1回の視線移動に対する報酬を最大化する行動を選択する。近似値マップは、画像、最後の固視の位置、過去の固視のシーケンス全体に依存する。アルゴリズムは値マップに基づいて、次に最も可能性の高い固視を予測する。

#### 画像の内容とは無関係に、視線スイッチの人的コストはどのように測定されるのか？

視線スイッチにかかる人間のコストは、画像内容とは無関係に、人間の心理物理学的実験によって測定される。この実験では、参加者は画面中央に固定十字を提示され、その後に8つの可能な位置のいずれかに現れる周辺目標を提示された。参加者は、視線をできるだけ速く正確にターゲットに移動するよう指示された。この実験では、視線移動のコストを大きさと方向の両面から測定した。視線移動のコストの大きさは、参加者が視線をターゲットに移動させるのに要した時間によって測定され、視線移動のコストの方向は、サッケードの終点のターゲットからのずれによって測定された。この実験は、画像の内容とは無関係に、視線移動の本質的なコストを測定するためにデザインされたもので、周辺視標の検出以上の視覚処理を伴わない単純な課題を用いた。その結果得られたコスト関数は、任意の顕著性マップと先行する固視のシーケンスが与えられた人間の観察者の次の固視の予測を改善するアルゴリズムに用いられた。

#### アルゴリズムはどのような静的顕著性マップにも適用できますか、それとも特定の要件がありますか？

このアルゴリズムは、どのような静的な顕著性マップにも適用することができ、その起源や、顕著性を計算するために使用する特徴に関係なく。このアルゴリズムは、任意の静的な顕著性マップを、各視線移動後に再計算される、一連の動的な履歴依存の値マップに変換するように設計されている。値マップは、任意の顕著性モデルによって提供される顕著性マップ、視線移動の大きさと方向の嗜好を定量化する最近測定された人間のコスト関数、および後続の視線移動ごとに変化する逐次探索ボーナスに基づく。このアルゴリズムは柔軟で、入力として静的な顕著性マップを提供する限り、任意の顕著性モデルに適用できる。アルゴリズムは、顕著性マップの特定の特徴や特性を必要とせず、特定のデータセットや画像タイプに限定されない。従って、このアルゴリズムは様々な顕著性モデルに適用することができ、どのような画像に対しても次の視線ターゲットの予測を改善するために使用することができる。

#### 提案手法の限界と今後の課題
この論文の提案手法にはいくつかの限界があります。まず、提案手法は静的なサリエンシーマップを用いて次の視線移動を予測するため、動的なシーンには適用できない可能性があります。また、提案手法は人間の視線移動の内在的コストを考慮しているため、人間の視線移動に対する個人差や文化的な違いを反映することができません。

さらに、提案手法はサリエンシーマップを用いて次の視線移動を予測するため、サリエンシーマップ自体の精度に依存することがあります。つまり、サリエンシーマップが不正確であれば、提案手法の予測精度も低下する可能性があります。

今後の課題としては、より動的なシーンに対応できる手法の開発が求められます。また、人間の視線移動に対する個人差や文化的な違いを反映する手法の開発も重要です。さらに、サリエンシーマップ自体の精度を向上させるための手法の開発も必要です。これらの課題を解決することで、より正確な視線予測モデルの開発が可能になります。


### 所感
視線を動かすコストを考慮するという発想が面白い。（おそらくディープラーニングベースではなさそうなので）応用範囲も広そうな気もする。
21日目：Learning to Predict Sequences of Human Visual Fixations(2016)

### Learning to Predict Sequences of Human Visual Fixations(Mingm 2016)

https://www-users.cse.umn.edu/~qzhao/publications/pdf/jiang_tnnls16.pdf

深層学習ではなく、マルコフ決定過程を用いた視覚注視モデル。SVMと比較して学習スピードは遅いが、精度が高いらしい。

#### 概要

この論文では、人間の視線の時系列を予測する手法が提案されています。視覚注視モデルは、画像内の位置での視線の確率分布を推定しますが、このモデルは眼球注視の時系列を予測できません。著者らは、最小二乗方針繰り返し（LSPI）を使用して、人間の眼球追跡データから学習した視覚探索ポリシーを提案し、実験でLSPIが異なる時点での複数の手がかりを組み合わせて視覚探索を効果的に予測できることを示しています。学習されたパラメータは、視覚探索の異なる段階での手がかりの重要性を捉え、結果は2つの難解なデータセットで最先端の性能を達成しています。

この論文では、ヒトの視線移動をマルコフ決定過程（MDP）としてモデル化する方法が提案されています。報酬関数と遷移確率を事前に指定せず、LSPIアルゴリズムを用いてポリシーを学習し、視線予測のための最適なポリシーを得る手法が紹介されています。この手法は視線軌跡のトレーニングデータから報酬を評価し、MDPを通じて期待される報酬を最大化するポリシーを獲得します。

視線追跡を使用して人間の視線動きをモデル化し、MDPを介して人間の視覚的注意を表現する方法に焦点を当てています。視線データセット（OSIEおよびMIT）でアルゴリズムをテストし、視線予測の評価にはBorjiet al.の手法を使用しています。独自の状態行動マッピングφ′(s,a)を紹介し、視線の順序を考慮して異なるステージごとにパラメータを学習する方法を示しています。

また、視線予測の基本表現としてピクセルではなくスーパーピクセルの使用が提案されています。スーパーピクセルは、画像を小さなセグメントに分割し、通常は均質な色やテクスチャを持っています。また、低レベルの特徴から意味論まで、さまざまな特徴を使用し、特に視線と物体の中心領域の強い相関が強調されています。実験では、OSIEデータセットとMITデータセットでの結果が報告され、提案手法が他のベースラインや最先端の手法と比較して有効であることが示されています。

学習アルゴリズムLSPIにおいて、視線データセットOSIEにおける収束の進展と報酬の統計が示され、学習の最終段階での課題が強調されます。また、学習パラメーターの解析では、視線の方向に対する重みが時間の経過とともに変化し、セマンティクスと低レベルの特徴が注目されることが明らかにされています。LSPIは他のモデルと比較しても優れたパフォーマンスを示し、γ値の調整が不確実性に対処する上で重要であることが示唆されています。

この研究では、LSPIがMITデータセットで他のモデルを上回り、セマンティクスと中央の手がかりが予測性能に重要であることが示されました。さらに、LSPIは時間的情報を考慮し、SVMよりも優れたスキャンパスの予測性能を発揮します。研究者はLSPIが視覚注視の予測において優れており、低レベルの特徴を初期の段階で有効に活用できると結論づけました。

この論文では、LSPIを使用して人間の視線の順序を予測するモデルが紹介され、視覚探索の異なる段階を考慮することで、他の手法よりも優れた予測性能が得られることが実験結果から示されました。また、LSPIモデルは多くの異なる物体をカバーする優れたスキャンパスを生成し、他の手法よりも高い性能を示しています。計算コストの面では、LSPIの学習が時間がかかる一方で、SVMベースラインは低い計算コストでモデルを学習できることが示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/b8089fae-b2f3-4a2b-0849-bc23e507e048.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/e6bda785-1247-eac4-4cee-c1278c98b7dc.png)
データ分析の検証を他社(他部署)とやるときに気を付けたほうがいいと思ったこと

# 1. 前提
・お金をもらってやったプロジェクトではないので、そんなにシビアではなかった(手弁当)
・結局データが足りず、思うような結果は出なかった(先方も納得してくれていた)

# 2.やったほうがいいこと
(1) 着手時
　・目的
  ・追加コストをかけてまでやる余力があるか
    →制約をここで確認
  ・スケジュール(決めておかないとズルズルに)
  ・一緒にやりましょうね！の意気投合
  　→一部署だけのデータでは不足していることが多い。
   　　他部署に話をしてもらえるかぐらいの熱量があるか見極めておく。
　・雲行きが怪しくなった場合についての認識合わせ
 
(2) 分析時
　・相手がエンジニアでないと、細かいコードとか出しても理解できない。
 　ただそれっぽくも見えるので、一瞬出して、あとは図とかで説明する。
  ・相手は業務知識が豊富なので、こちらからも仮説は持って行って、それを叩いてもらいつつ、意見を引き出す。そのときに目の前でぱぱっとジャストアイディアで出てきたものの分析ができると好感度アップ。
　・可視化だけでも喜ばれるのでどんどん見せに行く。
 
(3) 雲行きが怪しくなってきたとき
　・早めに打診
  ・原因と対応策(実現が難しくても)を整理し、議論できるようにする。
  　→ワークアラウンドが出てくるかもしれないし、なければクローズの方向にも持って行ける。
   　口頭での報告だけでは腹落ちもしにくいので、きちんと資料化する。

ウォーターフォール型でインフラ構築をずっとやってきたので、まだまだ進め方は試行錯誤です。
来年の自分に期待です！
20日目：Dataset and metrics for predicting local visible differences(2017) その2

### Dataset and metrics for predicting local visible differences(KRZYSZTOF, 2017)

https://visibility-metrics.mpi-inf.mpg.de/

#### 追加質問
Q1. ユーザーによるマーキングが施された基準画像と歪曲画像のデータセットを使用して、局所的な見え方の違いを予測することの主な利点は何でしょうか？

A1. 
ユーザーによるマーキングが施された基準画像と歪んだ画像のデータセットを、局所的な見え方の違いを予測するために使用する主な利点は以下の通りである：

1. トレーニングデータの改善： 参照画像と歪んだ画像上のユーザーマークは、歪みの局所的な可視性に関する貴重な情報を提供します。これにより、視認性メトリクスを開発するための、より包括的で詳細なトレーニングデータセットを作成することができます。

2. パフォーマンスの向上： 画像上のユーザ・マークを利用することで、局所的な可視差を正確に予測する可視性メトリクスの学習が可能になります。これにより、様々な画像処理アプリケーションにおいて、歪みの可視性を検出・定量化するメトリクスの性能が向上します。

3. 実世界との関連性： ユーザによるマーキングを含むデータセットは、人間の観察者が知覚する画像の実際の知覚的差異を反映している。この実世界との関連性により、実用的な画像処理タスクや品質評価への可視性メトリクスの適用性が高まります。

4. 多彩なアプリケーション： ユーザーによるマーキングを含むデータセットは、画質評価、圧縮アルゴリズム、超解像技術、局所的な可視差の正確な予測が重要な電子透かし法など、幅広い用途に利用できる。

全体として、参照画像と歪んだ画像にユーザによるマーキングが施されたデータセットの使用は、視認性メトリクスの訓練と評価に貴重なリソースを提供し、最終的には画像の局所的な視認性の違いをより正確かつ効果的に評価することにつながります。


Q2. 
カスタムCNNアーキテクチャは、画像の歪みを検出するための新しい可視性メトリックの開発にどのように貢献しているのか？

A2.
カスタムCNNアーキテクチャは、いくつかの方法で画像の歪みを検出するための新しい可視性メトリックの開発に貢献している：

1. 特徴抽出： CNNアーキテクチャは、局所的な目に見える違いを予測するために重要な、関連する特徴を入力画像から抽出するように設計されている。これにより、このメトリクスは、従来のメトリクスでは容易に捉えられない複雑な視覚現象を捉えることができる。

2. 密な可視性マップ： CNNベースのメトリックは、参照画像と歪曲画像上のユーザー・マークから得られる高密度の可視性マップを用いて学習される。これにより、メトリックは入力画像と対応する視認性マップの関係を学習し、局所的な視認性の違いをより正確に予測することができる。

3. エンド・ツー・エンド学習： CNNアーキテクチャはエンド・ツー・エンドで学習される。これは特徴抽出と回帰が同時に学習されることを意味する。これにより、メトリックは局所的な目に見える差異を予測するための最適な特徴表現を学習することができ、パフォーマンスが向上する。

4. 汎化： CNNベースのメトリックは、トレーニングデータセットに存在しなかった新しい画像や歪みに対して良好に汎化するように設計されている。これは、ユーザーによるマーキングが施された参照画像と歪み画像の大規模かつ多様なデータセットでメトリックを訓練することで達成される。

全体として、カスタムCNNアーキテクチャは、複雑な視覚現象を捉え、入力画像と対応する可視性マップの関係を学習するための強力なツールを提供することで、新しい可視性メトリックの開発に貢献している。その結果、画像の歪みを検出するための、より正確で効果的なメトリックが得られる。
19日目：Dataset and metrics for predicting local visible differences(2017)

### Dataset and metrics for predicting local visible differences(KRZYSZTOF, 2017)

https://visibility-metrics.mpi-inf.mpg.de/

#### 概要
本論文では、画像の局所的な見え方の違いを予測するためのデータセットとメトリクスを紹介する。参照画像と歪んだ画像、そしてユーザによるマーキングからなる広範なデータセットにより、既存の可視性メトリクスの訓練と、カスタムCNNアーキテクチャに基づく新しいメトリクスの開発が可能になる。このような局所的な訓練データを用いると、メトリクスの性能が著しく向上することを実証する。この研究は、画像の歪みの可視性に関する局所的な情報を必要とする、幅広い画像処理とコンピュータグラフィックスのアプリケーションに不可欠である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981660/a525224a-5182-53e5-719e-50f6d2ebd719.png)


#### この論文の主な貢献
この論文の主な貢献は以下の3つです。

1. 大規模なデータセットの作成：本研究では、参照画像と歪んだ画像の大規模なデータセットを作成し、ユーザーによるマーキングを行い、画像の局所的な可視差異を予測するためのトレーニングデータを提供しました。このデータセットは、画像の歪みに関する局所的な情報を必要とする幅広い画像処理アプリケーションにとって非常に有用です。

2. 新しい可視性メトリックの開発：本研究では、カスタムCNNアーキテクチャを使用して、新しい可視性メトリックを開発しました。このメトリックは、局所的な可視差異を検出するためにトレーニングされ、既存の可視性メトリックよりも優れた性能を発揮することが示されました。

3. 既存の可視性メトリックの改善：本研究では、大規模なトレーニングデータを使用して、既存の可視性メトリックの性能を改善することも試みました。これにより、sCIELab、HDR-VDP、Butteraugliなどの既存の可視性メトリックの性能が向上し、局所的な可視差異をより正確に予測することができるようになりました。


#### この研究の限界と今後の課題はなんですか？
限界:
1. 局所的な感度の欠如： 既存のメトリクスの多くは、主に全体的な画質評価に重点を置いているため、局所的な画像の歪みを検出する能力を持っておらず、微妙な局所的な歪みを効果的に捉えることができない場合があります。

2. 不十分なトレーニング・データ： メトリクスの中には、特に局所的な歪みという点で、限られたトレーニング・データに悩まされるものがあり、これは局所的な目に見える違いを正確に予測する能力に影響を与える可能性がある。

3. より高いレベルの効果を捉えることができない： 既存のメトリクスは、目に見える歪みを検出するために重要な複雑さや歪みの種類など、画像コンテンツに起因する高次元の効果を十分に考慮していない可能性があります。


今後の課題:
1. 大規模なデータセットの作成： この研究では、多様な画像セットと歪みの種類と大きさのバリエーションを含む、局所的にマークされた歪みを持つ大規模なデータセットを作成します。この大規模なデータセットにより、視認性メトリクスのよりロバストな学習が可能になり、学習データ不足の問題に対処できる。

2. 新しいCNNメトリックの学習：この研究では、局所的な画像の歪みをより効果的に捉えるように設計された、広範なデータセットを用いて、新しいCNNベースのメトリックを学習する。CNNアーキテクチャと訓練方法によって、メトリックは高密度の可視性マップから学習することができ、局所的な歪みを検出する能力が向上する。

3. 高次元の効果の考慮： 本研究のCNNベースのメトリクスは、学習データの確率的性質と、複雑な画像における歪み探索と実際の検出の複合効果を明示的に考慮しています。これにより、このメトリクスは画像の内容や複雑さに関連する高次元の効果を捉えることができ、この点に関する既存のメトリクスの限界に対処することができます。

これらの限界に対処することで、この研究は、局所的な画像の歪みを検出するための、より効果的な可視性メトリックの開発に貢献し、最終的には、画質評価の精度を向上させ、圧縮、超解像、電子透かしなどの実用的なアプリケーションを可能にする。
Linq備忘録

# UNPIVOT
SQLのUnpivot
~~~C#
    var items = new List<Item>
    {
        new Item {Id = "1",  Flg1 = false, Flg2 = false, Flg3 = true, Flg4 = true },
        new Item {Id = "2",  Flg1 = false, Flg2 = true, Flg3 = true, Flg4 = true },
    };
    var results = items.SelectMany(x => new[]
    {
        new { Id = x.Id, Code = 1, Flg = x.Flg1 },
        new { Id = x.Id, Code = 2, Flg = x.Flg2 },
        new { Id = x.Id, Code = 3, Flg = x.Flg3 },
        new { Id = x.Id, Code = 4, Flg = x.Flg4 },
    });
~~~

# 差分
リストの差分取得
~~~C#
    var listLeft = new List<Item>
    {
        new Item { Id = 1, Name = "a" },
        new Item { Id = 2, Name = "b" },
        new Item { Id = 3, Name = "c" },
    };
    var listRight = new List<Item>
    {
        new Item { Id = 1, Name = "a" },
        new Item { Id = 3, Name = "c" },
        new Item { Id = 4, Name = "d" },
    };

    //両方（1, 3）
    var common = listLeft.Where(l => listRight.Any(r => r.Id == l.Id));

    //Leftのみ（2）
    var left = listLeft.Where(l => !listRight.Any(r => r.Id == l.Id));

    //Rightのみ（4）
    var right = listRight.Where(r => !listLeft.Any(l => l.Id == r.Id));
~~~
# Containsの代わり
Containsの代わりにAnyを使う
~~~C#
var authors = new List<string>
{
    "川端康成",
    "夏目漱石"
};

var result = db.Authors.Where(x => authors.Any(xx => xx == x.Name)).ToList();
//こんなSQL（Containsと同じ）
//SELECT [a].[Id], [a].[Name]
//FROM [Authors] AS [a]
//WHERE [a].[Name] IN (N'川端康成', N'夏目漱石')
~~~
25日目：まとめ

### まとめ

注視マップの算出方法を中心として、人間がどこに着目するかについての静止画または動画を対象とした研究事例を見てきた．

色や強度、向きなどの理論ベースの手法から最近のディープラーニングベースの手法へと変遷してきているが、いまだに算出された顕著性マップと人間が実際に注目する部分との違いが見受けられるようだ．

要するに***未解決問題***といってもよいテーマである．

EyeTrackingによる正解データは実験的に得られるデータであり、
コンテキストベース（内容を知っている人が注目する部分）とオブジェクトベース（物体の特徴によって人目を引く部分）が厳密に分離しにくい。
そのため、どの測度（評価指標）を用いるべきかがはっきりしないこともこの問題を難しくしている理由の一つと思われる。

やはり、こういった心理的な要因も含む、理論化しにくい問題にはディープラーニングで力業で解くことが適しているのかもしれないが、その場合は適切なデータセットの構築が問題になりそう。

顕著性マップ導出も、GPTやGeminiなど画像、動画なども学習した大規模基盤モデルをベースに目的に応じてファインチューンという既定路線になっていくのかもしれない。

### 特に重要そうな論文

***SToA***
・State-of-the-Art in Visual Attention Modeling(2013)
・Review of Visual Saliency Prediction: Development Process from Neurobiological Basis to Deep Models(2022)

***基本理論（非ディープラーニング）***
・A Model of Saliency-based Visual Attention for Rapid Scene Analysis(1998) 
・Learning to Predict Where Humans Look(2009)

***ディープラーニング（transformer）***
・Predicting Human Attention using Computational Attention(2023)

***測度***
・What do different evaluation metrics tell us about saliency models?(2017)

***データセット***
・Dataset and metrics for predicting local visible differences(2017)


### 今回見ていない、今後見るべき論文
・脳機能イメージングの計算論モデルとしての深層学習(2023) → 日本語のコンパクトなレビュー論文
・Eye Tracking in the Wild: The Good, the Bad and the Ugly(2015) → アイトラッキングについて
・Sketch2Saliency: Learning to Detect Salient Objects from Human Drawings(2023) → スケッチから顕著性を学習


### 所感

注視マップに関した研究について五月雨に見てきた．
浅く読んだだけだが、それでも良い勉強機会になった．

今回の一番の収穫は学んだ内容というよりも、AI要約が非常に便利であるとわかったことかもしれない．
学生の頃は重要そうな論文に絞って時間をかけて頑張って読んでいたが、AI翻訳だけでなくこのような要約サービスも用いればかなり効率的にサーベイすることが出来る．
AIベースなので間違いも多く含むが，概要をつかむには十分使えそうだ．

使用した要約サービス(chatPDFが良かったです)

https://www.chatpdf.com/

https://www.gistai.tech/
Udemyで勉強することで、社内で新しくフルスタックエンジニアになりました！

##社内で新しく、フルスタックエンジニアになりました！

フルスタックエンジニアの入口に立つまでに、独学で学んだことを、ここで紹介します。


フロントエンド（React）
https://toyotajp.udemy.com/course/modern_javascipt_react_beginner/learn/lecture/40838732?start=0#overview

サーバーサイド（Express）
https://toyotajp.udemy.com/course/nodejs-express/learn/lecture/25781968?start=0#overview

データベース（MongoDB、デプロイまで）
https://toyotajp.udemy.com/course/nodejs-mongodb-todoapp/learn/lecture/30734072?start=0#overview

フルスタックアプリの開発
https://toyotajp.udemy.com/course/fullstack-mern-project-course/learn/lecture/31674254?start=0#overview

データベース
https://toyotajp.udemy.com/course/nodejs-unit-testing-in-depth/learn/lecture/10202708?start=45#overview

テスト
https://toyotajp.udemy.com/course/nodejs-unit-testing-in-depth/learn/lecture/10202708?start=45#overview


これらを学ぶことで、CRUD機能を搭載した、フルスタックアプリ開発を自分で行うことができます。
ぜひ、ご参考に！
Reactの関数コンポーネントを定義する時に利用するFCってなに？実は必要ない？

Reactの関数を定義する際に利用する`FC`について理解が薄かったので調べてみました！

## FCってなに？
Reactでコンポーネントを定義する際によく登場する型の定義です。

```typescript
import { FC } from 'react'

type Props = {
  text: string
}

const Component:FC<Props> = ({ text }) => {
  return <p>{text}</p>
}
```

FCは、FunctionComponentで定義は下記のようになっています。

```typescript
type FC<P = {}> = FunctionComponent<P>;

interface FunctionComponent<P = {}> {
  (props: P, context?: any): ReactElement<any, any> | null;
  propTypes?: WeakValidationMap<P> | undefined;
  contextTypes?: ValidationMap<any> | undefined;
  defaultProps?: Partial<P> | undefined;
  displayName?: string | undefined;
}
```

## FCを利用することのメリット
こんなメリットがあるんではなかろうか？
というのをいくつか書いていきます。

:::note info
それは違うぞ！って方はぜひコメントをください！
:::

### メリット①関数コンポーネントであることを明示的に示せる
型を縛るという意味では、それほど大きなメリットではないと感じています。
定義してあればReactNode以外の型を返そうとした場合にエラーを出してくれます！

```typescript:エラーになる例：Date型を返そうとした時
type Props = {
  children: ReactNode;
  date: Date;
}

const Component: FC<Props> = ({ children, date }) => {
  return <p>{date}</p>;
  // 型 'Date' を型 'ReactNode' に割り当てることはできません。
};

export default Component;
```

ReactNode以外だとエラーになりますと伝えましたが、返り値がstringの場合は、エラーが出ないので注意ください…。

### メリット②ジェネリクスをサポートしているのでプロパティの型を渡せる

```typescript
type Props = {
  name: string;
}

const Component: FC<Props> = ({ name }) => {
  return <p>{name}</p>;
};
```

## なぜ`FC`はいらないと言われているのか？
調べると`FC`は必要ない！みたいな記事が出てきます。
いらないと言われる理由を考えてみました。

### `FC`を利用しなくても書ける

先ほどのコードも下記のように記述できます。
```typescript
type Props = {
  name: string;
}

const Component = ({ name }: Props) => {
  return <p>{name}</p>;
};
```

上記でも問題なく動作しまが、返り値の方についてはお任せしている状態となります。
上記のコードの型は下記のようになります。

```typescript
const Component: ({ name }: Props) => JSX.Element
```

技術的な知識や技量レベルの同じ人が開発続ける保証はないので、明示的に方を定義しておいた方がいいと考えています。

:::note info
シンプルで短いコードやテストコードがあるなら書かなくてもいいのでは？という考え方もあると思うのでチームですり合わせをオススメします！
:::

### 昔は`FC`に暗黙的なchildrenが含まれていて扱いにくかった

`React.FC`には暗黙的に`children`が含まれてました。

:::note warn
React18からは暗黙的に`children`が含まれなくなり`children`の利用が分かりにくい点は解消されていますが、その流れで利用しない風潮が残っている可能性はあるかもしれません。
:::

当時暗黙的に`children`が含まれない`VFC`という指定もありましたが、React18でのアップデートにより`VFC`から`FC`に書き換えるタスクが発生しました…。

その時の辛さからわざわざ指定しなくてもいいのなら書かないという発想も理解できます。

## 【Reactの関数コンポーネントを定義する時に利用するFCってなに？】まとめ
技術レベルの差に関係なく開発できる環境を作るのであれば、明示的に指定してエラーを出すコードを書いておける方がいいのかと思っています。

:::note info
テストコードさえあれば厳格な型定義しなくても良いと思うので、チームの思想や体制によるところかもしれません。
:::

チーム全体でFCの利用について方針はすり合わせておけると良いなと感じました。

## 参考記事

https://kray.jp/blog/dont-have-to-use-react-fc-and-react-vfc/

https://zenn.dev/motonosuke/articles/13d0fdd417ec7c

https://qiita.com/islandryu/items/6477ff6a3a9d74a7cc8c
結晶構造解析のcifデータを元に量子化学計算のPsi4の入力ファイルを生成してみたよ

今回の内容は、次の記事の計算に用いたインプットファイルの作成法についてです。

https://qiita.com/chemweb000/items/cfc1ea815540d9e29d23


# 結晶構造解析データを元に量子化学計算を行いたい

量子化学では分子のエネルギーを計算的に求めることができます。計算で求めたエネルギーを使って、分子の最安定構造や、電子軌道の形、分子の振動、分子間の相互作用といった種々の情報を得ることができます。このように量子化学計算は、化学においてとても有用で、なくてはならないものですが、あくまでも理論計算なので、量子化学計算で求めた結果がどれだけ実験的な事実と一致するかを確認する必要があります。化学という学問において、実験と計算は車の両輪のような関係で、どちらか片方ではうまく機能しません。

量子化学計算の入力ファイルとして実験から得られた分子構造を用いるということは一般によく用いられる手法です。今回は、実験的に得られた結晶構造解析データであるcifファイルから二つの分子の構造を抽出し、量子化学計算プログラムであるPsi4で分子間相互作用計算を行うdatファイルを作るところまでをまとめます。Psi4での計算の仕方や結果の見方は[上で紹介した記事](https://qiita.com/chemweb000/items/cfc1ea815540d9e29d23)をご参考ください。

# 手順

(1)cifファイルを準備します
(2)結晶構造描画ソフトMercuryでcifファイルを開きます
(3)分子間相互作用計算を行いたい二つの分子をそれぞれ表示しxyz形式で保存
(4)Pythonで二つのxyz形式のファイルをdatファイルに変換

[上で紹介した記事](https://qiita.com/chemweb000/items/cfc1ea815540d9e29d23)では、薬効物質であるアスピリンの二量体間の分子間相互作用を計算するために、Crystallography Open Database(COD)[^1]という結晶構造のデータベースからアスピリンの結晶構造を無料でダウンロードしています。
(2)においてMercuryというソフトを用いていますが、Cambridge Crystallographic Data Center[^2]が配布している無料版のものでできます。
計算したい分子のxyz形式のファイルさえできて仕舞えば、Psi4の計算に用いるdatファイルはコピペして作っても難しくないですが、これをPythonプログラムで変換します。

# xyz形式のファイルをdatファイルに変換するプログラム

手順の(3)で作った二つのxyz形式のファイルのパスをそれぞれ変数file1とfile2に代入しています。実際に用いる場合はここを適切なパスに変更します。

```Python
#xyz形式のファイルを指定
file1 = "xyz形式のファイルのパス1"
file2 = "xyz形式のファイルのパス2"

files = [file1, file2]
mols = []

for i in range(len(files)):
    with open(files[i], "r") as f:
        lines = f.readlines()
        
    for j in range(len(lines)):
        lines[j] = "     " + lines[j]

    mol = ''.join(lines[2:])
    
    mols.append(mol)

psi4_text = "memory 600 mb\n"\
            "\n"\
            "molecule_dimer {\n"\
            "     0 1\n"\
            + mols[0] +\
            "     --\n"\
            "     0 1\n"\
            + mols[1] +\
            "     units angstrom\n"\
            "}\n"\
            "\n"\
            "set globals {\n"\
            "    basis          3-21g\n"\
            "}\n"\
            "\n"\
            "set sapt {\n"\
            "    print          1\n"\
            "}\n"\
            "\n"\
            "energy('sapt0')\n"
        
with open("input.dat", 'wb') as a_file:
    a_file.write(psi4_text.encode('ASCII'))

```

Mercuryでcifファイルをxyz形式にするところが自動化されてないので、わざわざpythonプログラムを使わず、手作業で書き換えてもそんなに作業量は変わらないかもしれませんね。


[^1]:Crystallography Open Database
http://www.crystallography.net/cod/

[^2]:Cambridge Crystallographic Data Center
https://www.ccdc.cam.ac.uk/
プロパティへ強制アクセス、"PropertyAccess"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の24日目の記事です。


## プロパティへ強制アクセス、"PropertyAccess"

[PropertyAccess](https://symfony.com/doc/current/components/property_access.html)は、オブジェクトや配列のプロパティにアクセスするためのコンポーネントです。Symfony以外でも使えます。

### インストール

```shell
composer require symfony/property-access
```

### 使い方

#### Get
```php
use Symfony\Component\PropertyAccess\PropertyAccess;

$propertyAccessor = PropertyAccess::createPropertyAccessor();

$array = [
    'name' => 'すみだ',
    'items' => [
        'りんご',
        'なし'
    ],
];

echo $propertyAccessor->getValue($array, '[name]'); // 'すみだ'
echo $propertyAccessor->getValue($array, '[age]']); // null
echo $propertyAccessor->getValue($array, '[items][1]']); // なし

$person = new Person(name: 'すみだ', active: true);
echo $propertyAccessor->getValue($person, 'name'); // 'すみだ'
echo $propertyAccessor->getValue($person, 'isActive'); // true

```

`PropertyAccessor`オブジェクトを作り、`getValue()`することで、値にアクセスできます。アクセスする際の引数ですが、1つめは配列やオブジェクト、2つめはその値のキーを設定します。例えば配列の場合、`$array['name']`にアクセスしたいのであれば、添字である`['name']`からクォーとを抜いてを渡します。オブジェクトの場合、パブリックなプロパティ名、もしくはGetterの`get***`から`get`をとったものを渡すとその値がとれます。
また、Isser, Hasserにも対応しており、`is***`, `has***`もGetterど同様な方法で値がとれます。

:::note warn
配列の場合は、キーや添字の値がないとnullとなりますが、オブジェクトの場合は、プロパティにアクセスできない（Getterが用意されていない、プロパティがpublicではない）場合は、配列と違い例外`NoSuchPropertyException`が投げられます。
:::

#### Set

```php
use Symfony\Component\PropertyAccess\PropertyAccess;

$propertyAccessor = PropertyAccess::createPropertyAccessor();

$array = [];
$propertyAccessor->setValue($array, '[name]', 'すみだ');
echo $array['name']; // すみだ

$propertyAccessor->setValue($array, '[items][1]', 'りんご');
dump($array);
/*
^ array:1 [
  "items" => array:1 [
    1 => "りんご"
  ]
]
*/

$person = new Person();
$propertyAccessor->setValue($person, 'name', 'すみだ');
echo $person->getName(); // すみだ
```

値をセットする場合は、`setValue()`を使います。第２引数までは`getValue()`と同じで、3つめにセットしたい値を渡します。

### これのすごいところ

このコンポーネント、値を取得・設定するだけなのでぱっと見すごくないんですが、連想配列の値からオブジェクト作る時などで活躍します。

```php
use Symfony\Component\PropertyAccess\PropertyAccess;

$propertyAccessor = PropertyAccess::createPropertyAccessor();

$itemArray = [
    'name' => 'りんご',
    'price' => 100,
    'active' => true,
];

$item = new Item();
foreach ($itemArray as $key => $value) {
    $propertyAccessor->setValue($item, $key, $value); // それぞれのSetterを使って値を設定
}

dump($item);
/*
App\Entity\Item^ {
  -name: "りんご"
  -price: 100
  -active: true
}
*/
```

## まとめ
今回は`PropertyAccess`の紹介でした。使いこなすとリクエストの配列からDTO作ったり、Entity作ったりなどに役立ちます。
【Python venvの使い方】作成と起動方法（MacとWindows両方まとめた）

タイトルの通り、Pythonのvenvの使い方をまとめてみた。この記事ではWindowsとLinuxの両方のバージョンをまとめている。

## venv環境の作成コマンド
作成時のコマンドはWindows、Linux、Mac全て同じ。
```ruby:title.rb

python -m venv [作成する仮想環境の名前]

```
例えばmyenvという名前の仮想環境を作成する場合は、下記のコマンドで良い。
```
python -m venv myenv
```


## venv環境の起動（Mac, Linux編）
venv環境を実行するときは、Linux系とWindows系でコマンドが少し異なる。Linux系は下記の通り。
```
source ./[作成した仮想環境の名前]/bin/activate
```
つまりmyenvという名前のvenv環境を起動するなら、このように書く。
```
source ./myenv/bin/activate
```


## venv環境の起動（Windows編）
Windows系は下記の通り。

```
.\[作成した仮想環境の名前]\bin\activate
```
こちらもmyenvという名前の仮想環境を実行する例を下記に示す。

```
.\myenv\Scripts\activate
```
[AWS]AWS構成図の公式アイコンとサービス名のプレフィックスの違い

今年はAWSの構成図を書く機会が多かったです。
その観点で、今年学んだことを２つピックアップします。

# 1.構成図に使うオブジェクトは公式のものを使う。
毎回画像検索してたのですが、公式サイトにこんなものがありました。

https://aws.amazon.com/jp/architecture/icons/

アイコンはじめ、矢印のオブジェクトとかたくさん詰まってます。
注意書きも書いてくれています。

なんならちょっと厳しいぐらいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/a349b894-f062-e4a4-b743-bc7e26fb2090.png)
★サービス名は改行してはいけない。


# 2.サービス名のプレフィックスの違い
先ほどの資料をみると、同じ「Analytics」でも、Amazonから始まったり、AWSから始まったり・・・毎回公式ページでダブルチェックをしてました(納品物なので)。
ところでこれに違いはあるのでしょうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/6300a830-6c87-8467-ed12-de7d27c8a626.png)

Stackoverのサイトに回答がありました。
>The pattern is that utility services are prefixed with AWS, while standalone services are prefixed by "Amazon".


https://stackoverflow.com/questions/46069047/aws-products-and-services-naming-nomenclature-starting-with-amazon-vs-aws

(参考サイト)

https://tatsuyashi.hatenablog.com/entry/2019/01/22/000328

まとめるとこんな感じ。
| プレフィックス | 見分け方 | 
| ---- | ---- | 
| AWS | ユーティリティーサービス。他のサービスと合わせて使う。|
| Amazon | スタンドアローンサービス。それ単体でも成り立つ。 |

その観点でみてみると・・・
(画像はすべて冒頭URLの「AWSシンプルアイコン」の資料からです)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/9d9acaa3-4b28-0050-6986-da775aae2ac1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/fe371a2f-8675-0b78-dea3-448b20e381b4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/9987af87-4096-1de8-7c36-7576dfd1210e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3003921/93db7661-738b-2fdf-51cf-6ac987f7b8e2.png)

うーん、、まだまだ初心者なので納得感はあまり感じられず。
来年の自分に期待したいです。
whereHasを使ってより複雑な検索ロジックを構築する

## はじめに
* ユーザ間での既存のメッセージルームを確認する
* ユーザ間でのメッセージルームが存在しない場合は新たに作成する

というロジックをUserモデルで考えていましたが、組み方が分からなかったので色々調べてみました。

自分の場合は「ユーザ間が同じidのメッセージルームを持っていたら…」という処理を書きたかったのですが、

そのような場合は「whereHas」メソッドを使うのが良いみたいです。

## 環境
Laravel 9.52.16

## 問題
* Userモデル内でメッセージルームの検索ロジックを実装したい！


## 解決法
```php: User.php
public function createMessageRoom($senderId, $receiverId)
{
    // 送信者と受信者の両方が参加している既存のメッセージルームを検索
    $messageRoom = MessageRoom::whereHas('users', function ($query) use ($senderId) {
        $query->where('user_id', $senderId);
    })->whereHas('users', function ($query) use ($receiverId) {
        $query->where('user_id', $receiverId);
    })->first();

```

このように、whereHasメソッドとwhereメソッドを組み合わせることで、双方のユーザが割り当てられたメッセージルームが既に存在するか検索します。

whereHasメソッドの使い方については、Laravel公式ドキュメントの中段に記載されています。

https://readouble.com/laravel/8.x/ja/eloquent-relationships.html

そして、このロジックに基づいて、既存のメッセージルームがない場合は、新しいメッセージルームを作成します。

```php: User.php
// 既存のメッセージルームがない場合、新しいメッセージルームを作成
    if (!$messageRoom) {
        $messageRoom = new MessageRoom();
        $messageRoom->save();
```

最後に、中間テーブルにレコードを保存すればOKです。

```php: User.php
// メッセージルームに送信者と受信者を関連付ける
$messageRoom->users()->attach([$senderId, $receiverId]);
```
軽深演習 #15 天皇の魚

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 15日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。


### 前提知識　天皇の魚
今回はマーケティングの話です。養殖魚のマーケティングの話です。まず、マーケティングのおさらいをしましょう。

#### マーケティングの３原則

- 認知　知らない商品は購入しません
- 購入可能　買えない商品は購入できません。
- 購入　実際に購入してもらうことが重要です。

認知してもらうためには、有名人による宣伝をよく行います。どんな有名人が有名なんでしょうか？最高到達点で考察したように。最高に有名人を想像しましょう。誰でしょうか？　図式にしてみましょう。

```mermaid
flowchart LR
A[自分]-->B[少し有名な人]-->C[かなり有名な人]-->D[天皇]
```

日本で最も有名な人は誰ですかと問われた時に、即座に天皇は思い浮かぶでしょうか？　日本で最高に有名な人は天皇ではないでしょうか？ 意外と、絶対的な最高は思いつかないものです。最高の有名人である天皇もそうです。

養殖魚の話をしましょう。平成天皇は皇太子の頃、食料問題で悩んでいるタイにティラピアという淡水魚を贈呈しました。ティラピアはタイに広く普及し現在では国民食です。関連の記事にはこんなこのようなものがあります。

[「天皇の魚」命つなぐ　皇室とタイ王室、緊密な関係](https://nordot.app/511441408345637985)

世界的にティラピアは非常にたくさん養殖されています。中国、台湾、ベトナム、インドネシアで、大量に養殖されています。でも日本では認知度が低いです。ティラピアの認知度を上げるために、天皇とタイの関係を使うのはどうでしょうか？　面白そうだと思いませんか？


### 演習 認知度を上げるために天皇を活用するのは？どんな場合があるでしょうか？かつては宮内庁御用達というのがありました。今どんなのがあるでしょうか？

圏論って面白いんじゃないかとなんとなく思えるようになりませんか？ 
天皇という絶対的な最高到達点を意識することはマーケティングにとっては重要なことでしょう。英国では意識されてるようです。
[英王室の価値は9兆円以上、「活動は英国のPRキャンペーン」](https://forbesjapan.com/articles/detail/18642)