OmniAICreator/Qiita-1.07M huggingface dataset:
Django　ログイン・ログアウト機能を設定してみる

# 問題の発生
Djangoにログイン・ログアウト機能をつけたい！
まとめてみることにした。

# 参考
https://www.techpit.jp/courses/27/curriculums/28/sections/241/parts/835


# 必要な設定
・ルーティング
・テンプレートの作成
・ログアウト機能の追加

## ルーティング
・既にあるアプリのurls.pyにログインとログアウトのURLを設定
```python:urls.py
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('',views.TopViews.as_view(), name = 'top'),
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]
```

::: note
あらかじめdjangoで設定されている`LoginView`と`LogoutView`を設定しているため、ログイン機能を実装できる。
:::
・settings.pyにリダイレクト先の設定
今回、ログイン後は「...8000/」の画面URLに移動するようしたいため、`LOGIN_REDIRECT_URL = '/' `とした。
```python:settings.py
LOGIN_URL = '/login'             # ログインが必要なときのリダイレクト先
LOGIN_REDIRECT_URL = '/'         # ログイン成功後のリダイレクト先
LOGOUT_REDIRECT_URL = '/login'   # ログアウト後のリダイレクト先
```

## テンプレートの作成
ログイン機能を持つテンプレートを作成するときは、以下の2つに注意する。
・registration/login.htmlとしてテンプレートを作成する。
・inputのnameにusernameとpasswordの値を設定する
```html:login.html
<form method="post">
    {% csrf_token %}
    <div>
        <label for="id_username">Username:</label>
        <input type="text" name="username" id="id_username" required>
    </div>
    <div>
        <label for="id_password">Password:</label>
        <input type="password" name="password" id="id_password" required>
    </div>
    <button type="submit">Login</button>
</form>

```

:::note
### なぜ、上記2つの設定が必要なのか
結論：LoginViewやLogoutViewを見てみると、以上の2つのような設定にしろと制定されているから。
詳細：loginやlogoutのルーティングが呼び出された際、
` auth_views.LoginView.as_view()`や`auth_views.LogoutView.as_view()`それぞれのviewが呼び出されるよう設定した。例えば、LoginViewの中身を見てみると、以下のような形になっている。※中身を見たい場合は`from django.contrib.auth import views as auth_views`を参考にして追っていけば良い。「djangoフォルダ➝contribファイル➝viewsクラス」のように。Django公式の認証システムの[ドキュメントリンク](https://docs.djangoproject.com/en/4.2/topics/auth/default/#using-the-views "タイトル")

```python:.LoginView
class LoginView(SuccessURLAllowedHostsMixin, FormView):
                "~中略~"
    authentication_form = None
    redirect_field_name = REDIRECT_FIELD_NAME
    template_name = 'registration/login.html'
    ...
```
ここで`template_name = 'registration/login.html'`となっている（テンプレート名はregistrationフォルダのlogin.htmlというファイル名にしてくださいよーとなっている）
input指定は長すぎて追えなかったのでそういうもんだと理解することにした、。（こういうのも大事だよね・・・？）
:::

## ログアウト
ルーティングの章で`path('logout/', auth_views.LogoutView.as_view(), name='logout'),`を設定しているので、LogoutViewが使用できるようになっているので、aタグにlogoutのURLを指定すればログアウトできる。
例
```html
<a class="nav-item nav-link " href="{% url 'logout' %}">ログアウト</a>
```

# 学んだこと
Djangoの`LoginView`と`LogoutView`を使うことで、簡単にログイン・ログアウト機能を実装できる。ポイントは以下の通り
・settings.pyにログイン・ログアウト後のリダイレクト先を設定
・ルーティングを行って、LoginViewとLogoutViewを参照するようにする
・LoginViewとLogoutViewはDjangoのあらかじめ設定されているクラスで、ログイン機能を管理するクラスになっている。
・ログイン用のテンプレートとして、`'registration/login.html'`でテンプレートを設定する。

初学者の参考になれば幸いです。
Jestをテストする時に、各ファイルでライブラリをimportしないでまとめる

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Jestをテストを作成する時に、各ファイルでライブラリをimportするのがめんどくさいなと思って
まとめ方について調べたので記事にしました。

# やりたいこと

下記のようなディレクトリ構成で、libで作成した自作のライブラリのテストを書きたかったのですが、もともと`test1.test.ts``test2.test.ts`でおのおのでlibを読み込んでいたのでそれを無くしたいというのが今回の記事のやりたいことになります。`

```
root/
　├ jest.config.js
　├ lib/**
　└ test/
　 　├ test1.test.ts
　 　└ test2.test.ts
```
```ts:test1.test.ts
import "../lib"
```

```ts:test2.test.ts
import "../lib"
```

# 結論

`test/index.ts`というファイルを用意してそれをセットアップのファイルに`jest.config.ts`で記載することで解決することができました。

```
root/
　├ jest.config.js
　├ lib/**
　└ test/
　 　├ index.ts
　 　├ test1.test.ts
　 　└ test2.test.ts
```
```ts:index.ts
import "../lib"
```

```ts:jest.config.js
module.exports = {
    preset: 'ts-jest',
    testEnvironment: 'node',
    setupFilesAfterEnv: ['./test/index.ts'],
};
```

これでtestのファイルが増えても同じ記述をしなくても良くなりました。

# おわりに

まとめられるものはまとめた方が管理が簡単なので、今後も積極的にまとめていけるといいかなと思います。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# 参考

https://jestjs.io/ja/
ACSのサポート（推奨）Java について ～2024.10月時点

主題の通りです。

## ACSのサポートJavaに関するドキュメント

こちらの情報を参照してください。

Java Options for IBM i Access Client Solutions? 
https://www.ibm.com/support/pages/node/719405


## 2024年10月時点での推奨Javaバージョンについて

***ACS 1.1.8.0以降はJava 8 以降がサポートになります。上記ドキュメントによれば、推奨はJava 11です。(2024/10現在)***


## ACSが推奨するJavaディストリビューターは？

上記のウェブページに記載があるのは下記4つです。推奨、と明確に書かれていないものもありますが、わざわざ3つ挙げていますのでほかのJavaよりは推奨、と言えると思います。

**1.Oracle OpenJDK**

**2.IBM Semeru Runtimes IBM OpenJ9 (Eclipse OpenJ9)**
https://developer.ibm.com/languages/java/semeru-runtimes/downloads/
    Java 8, 11, 17, 21

**3.IBM Eclipse Temurin (OpenJDK with the Hotspot JVM)**
https://adoptium.net/?variant=openjdk11&jvmVariant=hotspot
    Java 8, 11, 17, 21

※IBM による有償のサポートサービスあり（OpenJDK and IBM Runtimes for Businessというサービス）
    https://www.ibm.com/products/runtimes-for-business

**4.Amazon Web Services released Amazon Corretto**
https://aws.amazon.com/corretto
paiza.ioでrust その5

# 概要
paiza.ioでrustやってみた。
fileの読み書きやってみた。

# サンプルコード

```
use std::fs;
use std::io::{Write, Read, BufWriter, BufReader, copy};


fn buffer_io() {
	{
		let b = "
		闇バイト
		行き着く先は
		生き地獄";
		let mut f = BufWriter::new(fs::File::create("test.txt").unwrap()); 
		f.write(b.as_bytes()).unwrap();
	}
	{
		let mut f = BufReader::new(fs::File::open("test.txt").unwrap()); 
		let mut buf = vec![];
		f.read_to_end(&mut buf).unwrap();
		println!("{}", std::str::from_utf8(&buf).unwrap());
	}
}
fn main() {
	buffer_io();
}


```

# 実行結果

```

		闇バイト
		行き着く先は
		生き地獄
```

# 成果物

https://paiza.io/projects/BcC-xiozx_YvQ025bP2ghQ?language=rust


以上
[iOS] Network Activity Indicatorの今後

## Network Activity Indicatorとは？
![154_on_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/199826f1-49cb-d415-4dd1-3b1812c06ca3.png)
Status Barに通信中を表す`グルグル`を表示する機能です。

## Network Activity Indicatorの現状
- iOS13で`Deprecated`になっている。
- Touch ID機種でしか表示されない。

### iOS18で表示されなくなった模様
|  | iOS |  |  |  |  |
| --- | --- | --- | --- | --- | --- |
| Device | 18.1 | 18.0 | 17.5 | 16.4 | 15.4 |
| iPhone SE 3rd | ***非表示*** | ***非表示*** | 表示 | 表示 | 表示 |
| iPhone SE 2nd | ***非表示*** | ***非表示*** | 表示 | 表示 | 表示 |
| iPhone SE 1st | − | − | − | − | 表示 |
| iPhone 8 | − | − | − | 表示 | 表示 |
| iPhone 7 | − | − | − | − | 表示 |
| iPhone 6s | − | − | − | − | 表示 |

| iOS 15.4 |  iOS 18.0  |
|:---:|:---:|
| <img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/79dc5576-f7c7-b3aa-c9e6-013524eac4f8.png"> | <img width="256" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95033/b511b1d1-f9ba-c288-13d6-fa2b557d79f7.png"> |


## 「それで、あんたはどうするの？」
Network Activity Indicatorは...
- 絶滅する運命なので使わなくても大丈夫だと思います。
- 既に使っているプロジェクトでは削除する提案をするのも良いと思います。
- 通信中を表現するUIは他にも選択肢がありますよね。
    - ProgressView
    - Reducted
    - など

## ソースコード
```swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let networkSwitch = UISwitch()
        networkSwitch.translatesAutoresizingMaskIntoConstraints = false
        networkSwitch.addAction(.init{ _ in
            UIApplication.shared.isNetworkActivityIndicatorVisible = networkSwitch.isOn
        }, for: .valueChanged)

        let statusLabel = UILabel()
        statusLabel.translatesAutoresizingMaskIntoConstraints = false
        statusLabel.text = "Network Activity Indicator"
        statusLabel.textAlignment = .left
        
        let stackView = UIStackView(arrangedSubviews: [statusLabel, networkSwitch])
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .horizontal
        stackView.alignment = .center
        stackView.spacing = 16
        self.view.addSubview(stackView)

        NSLayoutConstraint.activate([
            stackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 16),
            stackView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 16)
        ])
    }
}
```

### 検証環境
Xcode 15.2, 16.0, 16.1
[初心者向け]  DNSの仕組み 〜 ブラウザがWebサイトを表示するまで

## はじめに

ブラウザでWebサイトを表示する際、最初に行われるのがDNS（Domain Name System）による名前解決。
これは、人間が理解しやすい「[www.google.com](http://www.google.com/)」のようなドメイン名を、コンピュータが理解できるIPアドレス「172.217.161.68」に変換する仕組みである。

ちなみに、

```bash
dig www.google.com
```

をターミナルで出力すると、IPアドレスが返ってくる。

## DNS解決の流れ

例として「[www.google.com](http://www.google.com/)」にアクセスする場合のフローを見ていく。

### 1. DNSキャッシュによるチェック

　まず、www.google.comがブラウザ内でクリックされると、以下の順番でキャッシュをチェックする。

1. ブラウザのDNSキャッシュ
2. **ローカルDNSキャッシュ**
3. ルーターのDNSキャッシュ (設定されている場合)

　これらは、最近アクセスしたサイトの情報が一時的に保存される場所。「一時的に」なので、設定された有効期限を過ぎるとその情報は破棄される。有効期限は、TTL(Time To Live)といい、秒単位で設定される。

　**ローカルDNSキャッシュ**とは、ローカルマシン(あなたが使用しているMacBookなど)のOSレベルのキャッシュのこと。

　もし直近で同じサイトにアクセスしたことがあり、これらのキャッシュに情報が残っていたら、情報が取得できた地点でWebサイトが表示される。

(補足)

TTL(Time To Live)は、ドメインの管理者が設定する。ちなみに、冒頭で紹介したコマンド「dig www.google.com」を実行してみると、下記の記述部分があった。

```bash
;; ANSWER SECTION:
www.google.com.		27	IN	A	172.217.161.68
```

この「27」は、TTLの残り時間を示している。通常、googleは300秒のTTLを設定しているみたい。つまり、このコマンドを打ったのは、www.google.comにアクセスしてから273秒後だった、ということ。

### 2. ISPのDNSサーバーへの問い合わせ

　1のローカルDNSキャッシュに情報がなかった場合、次にISP(Internet Service Provider、 NTTとか)のDNSサーバーに問い合わせる。

　ISPは日本全国の各地域にDNSサーバーを設置しており、負荷分散と冗長性のため、通常はプライマリとセカンダリの2つのサーバーが設定されている。

　もしこのDNSサーバーに情報があったら、ここから情報を取得してWebサイトが表示される。

**⚠︎これ以降のプロセスは、ISPのDNSサーバーが代わりに行う**。

### 3. ルートDNSサーバーへの問い合わせ

　もしISPのDNSサーバーにもなかったら、ルートDNSサーバーに問い合わせる。

　ルートDNSサーバーとは、道案内役みたいなもの。www.google.comというドメインに対して、TLD(トップレベルドメイン)は「.com」だからこのサーバーにアクセスしてみてね、という情報を返す。

　ちなみに、よく「ルートDNSサーバーは世界に13台」と言われているが、これは語弊がある。物理的なサーバーが13台しかないというわけではないからだ。13個あるのは、ルートDNSサーバーアドレス。同じアドレスを持ったサーバーが世界中に分散されており、もっとも近いサーバーに誘導される。

### 4. TLDサーバーへの問い合わせ

ルートDNSサーバーからTLDサーバーの情報を受け取ると、ここに辿り着く。

　TLDサーバーは、特定のトップレベルドメイン（.com、.org、.netなど）を管理しているサーバー。ここでは、www.google.comの「[google.com](http://google.com)」部分を担当するDNSサーバーの情報を提供する。このサーバーは、最終的なIPアドレスを持つサーバーの場所を教えてくれる。

### 5. オーソリティDNSサーバー

　TLDサーバーから情報を取得すると、このオーソリティDNSサーバーに辿り着く。

　オーソリティDNSサーバーは、ドメインレジストラ（例：お名前.com）が提供するDNSサーバーで、そのドメインの正式な（権威のある）情報を持つサーバーである。ここから最終的な「www.google.com」に対応するIPアドレスが返され、ブラウザは目的のWebサーバーに接続することができるようになる。

## 最後に

　以上が、ブラウザがWebサイトを表示するまでの、DNSのフローである。

　これらの **ルートDNSサーバー** ⇨ **TLSサーバー** ⇨ **オーソリティDNSサーバー** という階層的な構造により、世界中の膨大な量のドメインが効率的に管理され、キャッシュの活用により高速な名前解決が実現されている。

　ただ、留意が必要なのは、実際は「3. ルートDNSサーバーへの問い合わせ」以降はISPのDNSサーバーが代わりに行う、ということ。また、通常はこれらのプロセスがミリ秒単位で実行されるため、ユーザーがこの複雑な過程を意識することはない。
2024/10/28主にITとかセキュリティの記事

政府も対応できていない66件の重要な脆弱性とは(10/25)
https://kn.itmedia.co.jp/kn/articles/2410/25/news011.html

Azure Windows Virtual Machine のReset password の挙動を確認してみる(10/26)
https://www.docswell.com/s/kdk_wakaba/Z8216P-2024-10-26-161049

SPAでCSRF対策を検討する(10/25)
https://qiita.com/lyd-ryotaro/items/d50a0fbab762af9a8714

【サイバー攻撃図鑑 ファイル28】クレジットマスターとは？潜む脅威と安全なオンライン取引のための対策
https://cybersecurity-park.com/3233/

ダークウェブ上で取引される60万件の盗まれたクレカ情報、個人情報も99％の確率で流出！(10/26)
https://news.yahoo.co.jp/articles/f67e18692ee14c594a2fda30e9ee97d05ebf3dad?source=rss

大事なデータを守りたい！ActiveRecord Encryptionと、より安全かつ検索可能な暗号化手法の実装例の紹介(10/26)
https://www.docswell.com/s/free_world21/ZQRM4V-2024-10-26-165756

米国 ONCD 2024年のサイバーセキュリティ態勢2024とサイバーセキュリティ戦略実装計画Ver.2 (2024.05.07)(10/26)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/10/post-db5bbe.html

米当局、ステーブルコイン大手を捜査　資金洗浄疑惑で(10/26)
https://www.nikkei.com/article/DGXZQOGN25DSG0V21C24A0000000/

米、仮想通貨大手テザーを捜査 資金洗浄の疑い(10/26)
https://www.nikkei.com/article/DGKKZO84388600W4A021C2NNE000/

アメリカ大統領選にロシア・イラン・中国が介入、偽動画拡散やサイバー攻撃を強化…マイクロソフトが警戒呼びかけ(10/25)
https://news.infoseek.co.jp/article/20241025_yol_oyt1t50140/?tpgnr=world

トランプ氏が中国系ハッカーの標的と報道…電話会社の通信システムに侵入(10/26)
https://news.infoseek.co.jp/article/20241026_yol_oyt1t50040/?tpgnr=world

トランプ氏の電話、中国ハッカーの標的に　ハリス陣営も(10/26)
https://www.nikkei.com/article/DGXZQOGN260560W4A021C2000000/

インフラ事業者を狙ったサイバーテロに備える　サイバーテロ対策協議会(10/25)
https://www.fnn.jp/articles/-/777842

サイバーテロ防げ　宮崎県警と事業者 対処法学ぶ(10/26)
https://news.yahoo.co.jp/articles/012e38b18db338fc5da7c080afd10a849c1df6c2

写真の撮影場所やメールの送信元特定を競う サイバーセキュリティ推進へ 山梨(10/26)
https://news.ntv.co.jp/n/ybs/category/society/yscc3c09ff10a04a5490265ec31cfd1070

安中市職員生成ＡＩ学ぶ　ＮＴＴ講座で文章作成や注意点など(10/26)
https://www.yomiuri.co.jp/local/gunma/news/20241025-OYTNT50189/

他者のポイントを利用し、コンビニでたばこ購入か　不正アクセス禁止法違反などの疑いで男ら3人逮捕　沖縄県警(10/26)
https://ryukyushimpo.jp/news/entry-3587927.html

生成ＡＩ悪用しウイルス作成、有罪判決…ＩＴ知識なくとも「１か月ぐらいで簡単に作れた」(10/25)
https://www.yomiuri.co.jp/national/20241025-OYT1T50209/

現実のRuby/Railsアップグレード(10/26)
https://zenn.dev/takeyuwebinc/articles/4c44a4f284d3d1

【><>】AtCoderに登録したら解くべき精選過去問 10 問を難解言語 Fish ><> で解いてみた① ><>とは何か編(10/27)
https://qiita.com/ASURA-the-great-robot/items/13c94770c8e3645c5853
OSCARで変わる操作の未来：LLMを活用したOS自動化エージェント

# OSCAR: Operating System Control via State-Aware Reasoning and Re-Planning

今回は、**「OSCAR (Operating System Control via State-Aware Reasoning and Re-Planning)」**という画期的な研究をご紹介します。本論文は、**大規模言語モデル（LLM）やマルチモーダルモデル（LMM）**を活用して、異なるアプリケーションやOS環境を統一的に制御する汎用エージェントの設計を目指しています。これにより、複数のソフトウェアをまたぐ自動化が実現し、ユーザの操作が劇的に簡素化されます。

---

## 論文情報
- **タイトル**: OSCAR: Operating System Control via State-Aware Reasoning and Re-Planning  
- **リンク**: [arXiv:2410.18963](https://arxiv.org/abs/2410.18963)  
- **発表日**: 2024年10月24日  
- **著者**: Xiaoqiang Wang, Bang Liu  
- **DOI**: 10.48550/arXiv.2410.18963  

---

## 背景と目的

### 従来の課題と限界
近年、AI技術は進展を遂げ、LLMやLMMを活用したエージェントが、ウェブブラウジングやゲーム操作など多岐にわたる分野で成果を上げています。しかし、これらのエージェントは特定のアプリケーションや環境に最適化されているため、以下のような課題がありました：
1. **操作の固定性**：同じタスクでも、異なるアプリケーションやOS間では手順が異なるため、柔軟な対応が困難。
2. **リアルタイムな環境変化への非対応**：システム例外やタスク失敗に対する再プランニングができず、エラー時に機能が停止。
3. **汎用性の欠如**：アプリケーションごとに専用設計されたエージェントは、他のタスクに応用することが難しい。

---

## OSCARのアプローチと設計要素

### 1. **GUIグラウンディング：画面理解の新たな手法**
OSCARは、ユーザインタフェースを解析するために**二重グラウンディング**を採用しています。

1. **Visual Grounding**：画面上のUI要素を検出し、各要素にバウンディングボックスを付与します。  
2. **Semantic Grounding**：検出したUI要素に対して意味ラベルを付与し、要素を特定します。たとえば、「設定」ボタンはID付きで「設定」として識別され、コードから直接参照可能です。

これにより、OSCARはアプリケーションのボタンやメニューを正確に操作し、画面上の情報を動的に解釈できます。

---

### 2. **タスク駆動型再プランニング**
OSCARの再プランニングは、単なるワークフローのやり直しではなく、**部分的な調整**を重視します。

- **エラー処理**：実行中のコードがエラーを起こした場合、その時点の状態を保存し、必要な部分のみを再プランニングします。
- **リアルタイム適応**：たとえば、アプリケーションが異なるバージョンに更新されても、OSCARはその変化に応じてタスクを再計画できます。

---

### 3. **コード生成によるタスク実行**
OSCARは、Pythonコードを生成してタスクを実行します。次のようなシンプルなコマンドも自動化されます：

```python
mouse.move(id=14)    # Startボタンの位置に移動
mouse.single_click() # Startボタンをクリック
keyboard.write("Notepad") # Notepadと入力
keyboard.press("Enter")   # Enterキーを押下
```

このように、自然言語での指示が、瞬時に実行可能なコードに変換されます。

---

## 実験と結果の詳細な考察

### 1. GAIAベンチマーク
- **成功率**：OSCARは、Level 3のタスクで13.5%の成功率を達成し、従来のMMACエージェント（6.1%）を大幅に上回りました。
- **考察**：この結果は、タスク駆動型再プランニングの有効性を示しており、リアルタイムな環境変化への適応力を強化するものです。

### 2. OSWorldベンチマーク
- **成功率**：OSCARは、24.5%の成功率で最も優れた結果を示しました。特に、複数アプリケーションを跨ぐタスクでの柔軟性が評価されています。

### 3. AndroidWorldベンチマーク
- **成果**：OSCARは、スマートフォン環境でも優れた性能を示し、61.6%の成功率を達成しました。特に、エラー時の再プランニングが効率的に行われることが確認されています。

---

## 議論・限界・応用例

### 限界と今後の課題
- **高度な環境変化への対応**：今後の研究では、さらに多様なOS環境に対応するための学習が求められます。
- **自己学習機能の強化**：過去のタスクから学習し、次の実行に活かすことが重要です。

### 応用例
- **医療**：病院のシステム間でのデータ統合や管理を自動化。
- **金融**：取引プラットフォームでのデータ入力やレポート生成の自動化。

---

## 結論

OSCARは、OS操作の自動化において、従来手法を超える柔軟性と効率性を実現しました。特に、リアルタイムなフィードバックを活かしたタスク駆動型再プランニングは、今後のAIエージェント設計に新たな指針を与えるものです。

---

この記事が、皆さんの研究や実務に役立つことを願っています。質問やフィードバックはコメント欄にお寄せください。
VRC Udon Networking : Synchronization

## VRChat UdonNetworking：同期
ワールド開発とデバッグの80％は、このネットワーキングにより予期せぬ問題が発生します。
ネットワーキングは基本的に、「すべてのクライアントはローカルであり、特定のユーザー（特にワールドマスター）が継続的にワールドの状態を同期させる必要がある」ということです。
つまり、各ユーザーがそれぞれのシーンを持ち、**ゲームオブジェクト**や**変数**に関する情報の更新を継続的に受け取り、まるで全員が一緒に動いているかのように見せるトリックだと考えてください。
これは非常に重要であり、ネットワーキングを考慮せずにコードを書くと意図しない結果が多く発生します。
正しく同期されていないためにローカルでのみ動作したり、途中で同期を受け取れなかった``変数``のためにランタイム例外でスクリプト自体が停止する場合があります（UdonSharpでは例外処理がされていないため問題が発生します）。
したがって、プロジェクトの計画段階から常にネットワーキングを考慮することで、予期せぬ問題を減らすことができます。

同期方式には三つあり、`None`は文字通り同期なしで全てローカルであるものです。
`Continuous`は短い間隔で自動的にアップデートを送信します。
シンプルなスクリプトであれば使用するのに適していますが、期待通りに動作しない場合がしばしばあります（特にpingの違いのため）。
`Manual`は文字通り同期を手動で実行する方式であり、デバッグをしていると最終的には全て管理できるこの方式に移行する方が扱いやすくなります。

Udonで使用されている同期要素には様々なものがありますが、よく使われるのは``[UdonSynced]``アトリビュート、``RequestSerialization``、``OnDeserialization``、``SendCustomNetworkEvent``、``OnPlayerJoined``などです。

```cs
[UdonSynced]
int numberPlayer = -1;
```
``[UdonSynced]``アトリビュートは、変数がローカル変数（ネットワーク的）ではなく、すべてのクライアントに同期される変数であることをコンパイラーに知らせるものです。
同期方式が`Continuous`の場合、一定時間ごとに自動的に同期され、
`Manual`の場合、マスターが``RequestSerialization()``を呼び出すと``[UdonSynced]``変数の情報がネットワークに伝播されます。
すべての型に``[UdonSynced]``を付けられるわけではなく、[こちら](https://udonsharp.docs.vrchat.com/vrchat-api#synced-variables)にあるもののみ可能です。

```cs
numberPlayer = 5;
RequestSerialization();
```
``RequestSerialization()``は``[UdonSynced]``変数を同期させたいときに呼び出し、すべての``[UdonSynced]``変数が同期されます。
あまり頻繁に使用するとネットワークのオーバーヘッドが大きくなるため、状況に応じて適切に使用する必要があります。

```cs
public override void OnDeserialization()
{
    CheckSyncedVariables();
}
```
``OnDeserialization()``は``RequestSerialization()``のコールバック関数で、``[UdonSynced]``変数の値が同期を通じて変更されたときに自動的に呼び出されます。
``UdonSharpBehaviour``クラス内の``OnDeserialization()``を必要に応じてオーバーライドして使用します。

```cs
if (!Networking.IsMaster)
{
    Debug.Log("player is not a master, return");
    return;
}
SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "ActivePositionsLocal");
```
``SendCustomNetworkEvent``は他のクライアントに特定の関数を呼び出させることができます。
引数が二つあり、``NetworkEventTarget``は
> `enum VRC.Udon.Common.Interfaces.NetworkEventTarget`
> 
> | **Name** | **Summary**                          |
> |----------|--------------------------------------|
> | **All**  | All players in the instance         |
> | **Owner**| Owner of the game object            |

このように二つあり、後ろに続く``string``には呼び出したい関数名を入れます。
マスターのみで使用することでオーバーヘッドを減らし、デバッグも容易になるため、使用前にクライアントがマスターかどうかを確認することが推奨されます。
また、渡す引数が事実上関数名一つだけであるため、呼び出そうとする関数が追加で引数を受け取る場合、補間や複数の関数を作成するなどの複雑な作業が必要となります。

```cs
public override void OnPlayerJoined(VRCPlayerApi player)
{
    RequestSerialization();
    Debug.Log(player.displayName + " has joined the world!");
    if (player.isLocal)
    {
        SendCustomEventDelayedSeconds("CheckSyncedVariables", 8.0f);
        SendCustomEventDelayedSeconds("LoadGame", 9.0f);
    }
}
```
``OnPlayerJoined``は後から参加した他のプレイヤーを処理する際に有用で、これもオーバーライドして使用できます。
他のプレイヤーがワールドに参加するたびに、すべてのクライアントのインスタンスで自動的に呼び出されます。
``VRCPlayerApi player``は参加したプレイヤーを指します。
参加したプレイヤー本人にのみ特別に実装したいロジックがある場合は、``player.isLocal``フラグを確認して実装します。
大規模言語モデルにおけるデータ汚染の検出：その限界と可能性を徹底分析

# Does Data Contamination Detection Work (Well) for LLMs?  
今回は、最新の研究である「Does Data Contamination Detection Work (Well) for LLMs?」という論文をご紹介します。この研究では、**大規模言語モデル（LLMs）**が直面するデータ汚染の問題に焦点を当て、その検出アプローチがどの程度有効かを詳細に分析しています。評価手法の信頼性を高めるために、47件の関連研究を体系的にレビューし、各検出アプローチの仮定が実務環境で有効かどうかを検証しています。

---

## 論文情報
- **タイトル**: Does Data Contamination Detection Work (Well) for LLMs? A Survey and Evaluation on Detection Assumptions  
- **リンク**: [arXiv](https://arxiv.org/abs/2410.18966v1)  
- **発表日**: 2024年10月24日  
- **著者**: Yujuan Velvin Fu, Özlem Uzuner, Meliha Yetişgen, Fei Xia  
- **DOI**: 10.48550/arXiv.2410.18966

---

## 背景と目的

### データ汚染の重要性
LLMsは、膨大なデータセットで学習され、NLP分野のさまざまなタスクで大きな進歩をもたらしました。しかし、その評価には**データ汚染**が大きな障害となる場合があります。たとえば、評価用のデータがトレーニングデータの一部と重複していた場合、モデルが単にデータを「記憶」しているだけにもかかわらず、その性能が過剰に評価される可能性があります。これにより、モデルの汎用性や実際の応用可能性を誤認し、ビジネスや社会的応用において誤解を招く恐れがあります。

---

## 研究の焦点と貢献

本論文の主要な貢献は、以下の3つです：
1. **仮定の分類と分析**  
   - 過去の47件の研究を整理し、データ汚染検出に用いられる8つの仮定を抽出しました。  
   - 各仮定が実際にどのように使用され、どのような場面で妥当かを評価しています。

2. **ケーススタディを通じた仮定の検証**  
   - 仮定の中から3つを選び、Pythia-6.9Bモデルを用いて実際のシナリオで検証しました。

3. **結果の深い考察**  
   - 仮定の有効性が環境やデータセットの違いにどのように依存するかを詳細に分析しました。

---

## 仮定の技術的詳細と数式

### 1. 絶対確率の仮定（Assumption A1）  
この仮定では、モデルがトレーニングデータで見たことのあるインスタンスの確率が高くなるとしています。

**数式**:
$$
P_M(x) \geq \xi_p \quad \text{if } f(M, x) = 1
$$
この仮定は、困惑度（Perplexity）やトークンの出現確率を基に評価されます。

---

### 2. 逐語的記憶の仮定（Assumption A4）  
逐語的記憶とは、モデルがトレーニングされたインスタンスをそのまま生成することを指します。

**数式**:
$$
M_g(x_p) = x_s \quad \text{if } (M, x) = 1
$$
ここで、$x_p$は入力プレフィックス、$x_s$は生成されるサフィックスです。

---

## 実験の設計

本研究では、**Pythia-6.9Bモデル**を使用して、以下の手順で実験を行いました：
1. **データセット**：  
   - 22の異なるドメインからサンプリングし、トレーニング済みインスタンスと未学習インスタンスを用意。
2. **使用メトリクス**：  
   - 困惑度（Perplexity）とAUC（Area Under the Curve）を主な指標として使用。

---

## 結果と考察

### 実験結果
- **困惑度（PPL）の分析**：ドメイン間の違いが大きく影響し、仮定された汚染検出は効果が限定的でした。
- **AUCの結果**：各仮定が正確に機能するかは、使用するデータセットの特性に強く依存していました。

---

## 今後の展望と課題

1. **検出手法の改善**  
   - データの透明性向上に向けた基準の策定が必要です。
2. **商業モデルへの応用**  
   - 実務環境での応用可能性を検証するため、さらなる研究が求められます。
3. **多言語対応**  
   - 英語以外の言語にも対応する手法の開発が重要です。

---

この記事が、皆さんの研究や実務に役立つことを願っています。質問やフィードバックがあれば、ぜひコメント欄でお知らせください。
AWS CDK CLI のインストール方法


```terminal:インストール
 npm install -g aws-cdk

added 1 package in 2s
 ```

```terminal:確認
 cdk --version
2.164.1 (build bb9275c)
 ```

 参考

 https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/getting_started.html
AIで実現する無限ゲーム：UNBOUNDEDの革新と可能性

# UNBOUNDED: 生成的無限ゲームによるキャラクターライフシミュレーションの新展開

今回は、最新の研究成果である「UNBOUNDED: A GENERATIVE INFINITE GAME OF CHARACTER LIFE SIMULATION」を紹介します。本研究は、生成AI技術を活用し、プレイヤーの選択に応じて変化する無限のゲーム体験を実現する画期的な試みです。

---

## 1. 論文情報
- **タイトル**: UNBOUNDED: A GENERATIVE INFINITE GAME OF CHARACTER LIFE SIMULATION  
- **リンク**: [UNBOUNDED Project](https://generative-infinite-game.github.io/)  
- **発表日**: 2024年10月24日  
- **著者**: Jialu Li, Yuanzhen Li, Neal Wadhwa, Yael Pritch, David E. Jacobs, Michael Rubinstein, Mohit Bansal, Nataniel Ruiz  
- **DOI**: （未発行、arXivプリプリント）

---

## 2. 背景と目的

### 無限ゲームの理論的背景
James P. Carseの『Finite and Infinite Games』では、ゲームは有限ゲームと無限ゲームに分けられます。有限ゲームは勝利を目指し、明確な終了条件があります。一方、無限ゲームは「継続」を目的とし、ルールが動的に進化します。本研究では、この無限ゲームの概念を生成AIで実現することを目指しています。

---

## 3. 技術的アプローチ

### 3.1 大規模言語モデル（LLM）の蒸留
本研究では、軽量モデル **Gemma-2B** を使用しており、GPT-4oの性能を蒸留（distillation）技術で転写しています。蒸留のプロセスでは、大規模モデルの知識を効率的に小型モデルに伝達することで、リアルタイム性を実現します。

#### 蒸留の数式：
$$
L_{\text{distill}} = \sum_{i=1}^{n} \left( y_{\text{large}}^i - y_{\text{small}}^i \right)^2
$$

ここで、$y_{\text{large}}$ は大規模モデルの出力、$y_{\text{small}}$ は小型モデルの出力です。

---

### 3.2 地域IP-アダプタの革新
地域IP-アダプタは、キャラクターと環境の一貫性を高めるための技術です。本研究では、クロスアテンション機構と動的マスクを使用することで、異なる生成要素が互いに干渉しないようにしています。

#### IP-アダプタの数式：
$$
O = O_t + \alpha_e M_c O_e + \alpha_c \left( 1 - M_c \right) O_c
$$

- $M_c$ は動的マスク  
- $O_e$ と $O_c$ は環境とキャラクターの生成出力  
- $\alpha_e$ と $\alpha_c$ は各出力のスケール

---

## 4. 実験結果と考察

### 4.1 評価結果の詳細
UNBOUNDEDは、以下の評価指標で他の手法と比較して優れた結果を示しました。

| **手法**                 | **環境一貫性 (CLIP-IE)** | **キャラクター一貫性 (CLIP-IC)** | **テキスト整合性 (CLIP-T)** |
|------------------------|-------------------------|------------------------------|----------------------------|
| StoryDiffusion          | 0.528                   | 0.629                        | 0.242                      |
| IP-Adapter-Instruct     | 0.334                   | 0.246                        | 0.098                      |
| **UNBOUNDED (本研究)** | **0.563**               | **0.676**                    | **0.242**                  |

### 4.2 結果の解釈
UNBOUNDEDの地域IP-アダプタは、キャラクターと環境の一貫性において他の手法を上回りました。また、リアルタイム生成において1秒未満の遅延で高い応答性を実現しました。

---

## 5. 応用と展望

### 5.1 応用分野
1. **教育**：AI生成物語を用いて、個別学習を支援する。
2. **ビジネスシミュレーション**：仮想環境での訓練と意思決定プロセスの最適化。
3. **ヘルスケア**：仮想キャラクターによるメンタルケアと患者の行動予測。

### 5.2 今後の課題と展望
1. **計算リソースの最適化**：高速なモデルとクラウドベースの処理の統合。
2. **AR環境との連携**：拡張現実でのシームレスなゲーム体験を提供するための設計。

---

## 6. 結論
UNBOUNDEDは、生成AIによって無限ゲームの可能性を切り開く画期的な研究です。リアルタイム生成と動的な物語展開によって、プレイヤーに新たな体験を提供します。今後、さらなる研究が新たな応用を促進し、この技術の発展を支えることが期待されます。

この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
chrome devtoolでプリフライトは表示されるのに本体の通信が表示されない問題の解決方法

## 概要
- タイトルの通り、突然サーバーサイドとの通信をうまく見れなくなってしまった


## 問題

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/3d7e84f1-877c-8a8c-5f5e-6d5006aa8a4d.png)

画像のように、プリフライトは出ているのにその後の通信がフロントで見ることができない問題が起きていた

## 解決法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/3c0ebb10-c3af-ad45-725f-cc33a4ddfeb9.png)

サードパーティーのリクエストをフィルタしてしまっていたので外す

:::note info
恐らく似た状態の場合は、ほかのクッキーなども含めて外すことで対処が可能かもしれない
:::
【Python基礎】変数について

## 目次
[1.はじめに](#1-はじめに)
[2.変数の定義方法](#2-変数の定義方法)
[3.変数のネーミングルール](#3-変数のネーミングルール)
[4.おわりに](#4-おわりに)

## 1. はじめに
この記事では、Pythonの変数定義や変数のネーミングルールについて紹介します。

これまで、Pythonを少し書いていたことはありますが、きちんと理解して書いていたわけではなく、なんとなく書いて、とりあえず動けば良しとしてやってきました。

しかし、やはり胸を張って「Python書けます！」と言えるようになりたいと思い、基礎の基礎から勉強し直す覚悟を決めました。

そしてせっかくなら、その過程で学んだことを書いてみよう！
...ということで、今回は「変数」について学んだことをまとめてみました。

## 2. 変数の定義方法
Pythonでは、C言語などのように変数の型を明示的に指定する必要はなく、代入したい値を「=」の後ろに書くだけで型が決まります。
```python:sample.py
# 変数の定義
# [変数名] = [代入したい値]
example_1 = 5 # int型(整数)
example_2 = 1.25 # float型(浮動小数点数)
example_3 = "This is a string." # string型(文字列)
example_4 = True # bool型(ブール値)
```
## 3. 変数のネーミングルール
変数名は、基本的にはなんでも良いですが、以下のようなルールを守る必要があります。
また、こちらは必須ではありませんが、コードを読む際に、変数名から何に使われている変数なのかがわかるような変数名をつけることが望ましいです。

一般的な変数名の書き方は2パターンあります。
#### 【OK】パターン1：camelCase
「camelCase」のように、最初を除いて各単語の1文字目を大文字にする書き方
#### 【OK】パターン2：snake_case_variable
「snake_case_variable」のように、すべて小文字かつ、各単語をアンダースコアで区切る書き方(camelCaseより、こちらの方がよく使われる)

また、**NG**な書き方としては、以下3パターンがあります。
#### 【NG】パターン1：4callingbirds
「4callingbirds」のように、**数字から始まる**変数名は使えません。

:::note
1文字目以外であれば、数字が入ってもOK！
:::
#### 【NG】パターン2：not okay
「not okay」のように、スペースが入る変数名も使えません。
#### 【NG】パターン3：!please.avoid?\$$
「!please.avoid?\$$」のように、「$」「.」「!」「?」などの特殊文字が入る変数名も使えません。

まとめると以下。
| 変数名の例 | 説明 | OK/NG |
|:-:|:-:|:-:|
| camelCase | 各単語の1文字目を大文字(最初は除く) | OK |
| numb3rsOk4yAfter1st | 1文字目以外に数字が入る | OK |
| snake_case_variable | 全て小文字で、各単語を「_」で区切る | OK |
| 4callingbirds | 数字から始まる | NG |
| not okay | スペースが入る | NG |
| !please.avoid?\$$ | 特殊文字が入る | NG |


## 4. おわりに
本記事では、変数の定義や変数名を決める際のネーミングルールについて紹介しました。

変数名の付け方一つで、基礎をきちんと学んでいるかどうかがわかりそうだなと感じました。(今までは適当に名前つけてた...恥ずかしい...。)

まだまだ、pythonのスペシャリストにはほど遠いですが、少しずつ学んでいこうと思います。
p5.js のフィルター用シェーダー「createFilterShader()」でシンプルに時間を扱う（テンプレート的なもの、WebGL 2.0／GLSL ES 3.0）

以下の記事と似た方向の記事で、自分がよく使っている p5.js のフィルター用シェーダー「createFilterShader()」の話です。

- [p5.js のフィルター用シェーダー「createFilterShader()」で Webカメラ画像をそのまま出力（テンプレート的なもの、WebGL 2.0／GLSL ES 3.0） - Qiita](https://qiita.com/youtoy/items/cbd16903cbb14e49662a)
- [p5.js のフィルター用シェーダー「createFilterShader()」で色を減算する処理のわりとシンプルなもの（テンプレート的なもの、WebGL 2.0／GLSL ES 3.0） - Qiita](https://qiita.com/youtoy/items/fee1a0ae82baabd0d1b1)

シェーダーで、p5.js のスケッチ側から渡した時間情報を使い、描画が時間変化するものを作ることがあるのですが、今回はそのような構成のものをシンプルにした内容という感じです。

何らか、シェーダーによる加工を試す際に、そのベースとして利用するテンプレート的なものを自分用に用意したくなり、今回の内容を書きました。

## メインの内容
以下が今回の内容です。
シェーダーは、[公式サンプル](https://p5js.org/reference/p5/createFilterShader/)と違って「WebGL 2.0（GLSL ES 3.0）」を使う形にしています。

以下は、見た目に分かりやすいよう、キャンバスの色の特定の色成分を時間で変化させています。

```javascript
let s;

function setup() {
  createCanvas(640, 480);
  s = createFilterShader(fragSrc);

  s.setUniform("u_time", 0.0);
}

function draw() {
  background(170);

  s.setUniform("u_time", millis() / 1000.0);

  filter(s);
}

const fragSrc = `#version 300 es
precision mediump float;

in vec2 vTexCoord;
out vec4 outColor;

uniform sampler2D tex0;
uniform float u_time;

void main() {
  vec4 color = texture(tex0, vTexCoord);
  
  // -50 から +50 の範囲で動く
  float oscillatingValue = 50.0 * sin(u_time);
  // 色に影響を与える（ここでは緑成分に加算）
  color.g += oscillatingValue / 255.0;
  
  outColor = clamp(color, 0.0, 1.0);
}`;
```

キャンバス側でシェーダーの処理に、時間変動する値を渡す部分が以下になります。

```javascript
  s.setUniform("u_time", millis() / 1000.0);
```

p5.js で時間を取得できる [millis()](https://p5js.org/reference/p5/millis/) を使っています。その際に、単位をミリ秒から秒になるように変換したものを使います。

それを、以下の setUniform でシェーダー側に渡します。

●setUniform
　https://p5js.org/reference/p5.Shader/setUniform/

そして、シェーダー側では以下の部分で、受けとった値をもとに時間変動する値を作ります。さらに、その値を使って、RGB の中の緑成分を変動させるようにしています。

```cpp
const fragSrc = `
...

uniform float u_time;

void main() {
  ...
  
  // -50 から +50 の範囲で動く
  float oscillatingValue = 50.0 * sin(u_time);
  // 色に影響を与える（ここでは緑成分に加算）
  color.g += oscillatingValue / 255.0;
  
  ...
}`;
```

これを実行した結果は以下のとおりで、色が時間変化する様子が確認できます。

https://x.com/youtoy/status/1849990260006219841

## 余談
今回は色を時間変化させましたが、例えば何か描画するものの位置や透明度などを時間変化させるというパターンもあるかと思います。

以下は、描画する様々な要素を時間変化させたもので、試しにシェーダー側で処理全般を書いてみた例です。

https://x.com/youtoy/status/1835603811546931339

キャンバス側の処理は以下のようなシンプルなもので、処理全般はフラグメントシェーダーで書いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e3c57c5e-b262-beba-65b5-6b9caecfca30.png)

上で書いた例では、基本的にキャンバス側からシェーダー側に渡す値は時間の情報のみとしていました。このあたりは、慣れの有無もあるかもしれないですが、自分にはわりと大変でした。
時間変動する値を扱う場合という話について、もしかしたら場合によってはキャンバス側で複数の変動する値を計算して（結果を配列などにする感じで）、それらをシェーダー側に渡すという構成のほうが良い場合があるかもしれません。
GCEのHostErrorとその自動再起動の無効化

## GCEのHostErrorが起きた
そして、勝手にインスタンスが再起動して復帰してきていろいろ面倒だった

- GCEのインスタンスがHostsErrorの時は自動で再起動する
- 任意のタイミングで再起動されて困るシステムは自動再起動を無効化したほうがよい


## GCEのインスタンスが突如として再起動した
普段だと、GCEのインスタンスが突如として再起動することはほぼない
監視としては4~5分間インスタンスが停止するような状況だった。


ログとしてはmessagesにいきなり起動シークエンスのログが流れていた
どうやらHostsErrorというものらしく、GCEのインスタンスをホストしている物理マシンが何かしらのエラーを起こしたときに発生するらしい

[GCEのドキュメント](https://cloud.google.com/compute/docs/troubleshooting/troubleshooting-reboots?hl=ja#hosterror)によると、このエラーが発生した場合、GCEは自動でインスタンスを再起動するようになっている
```
ホストエラー（compute.instances.hostError）は、VM をホストしている物理マシンで、VM がクラッシュするようなハードウェアまたはソフトウェアの問題が発生したことを意味します。ハードウェア全体の障害やその他のハードウェアの問題でホストエラーが発生すると、VM のライブ マイグレーションが停止することがあります。VM が自動的に再起動するように設定されている場合（デフォルト設定）、Google は通常、エラーが検出されてから 3 分以内に VM を再起動します。問題によっては、再起動に最大 5.5 分かかります。
```


で、自動再起動が発生してしまうと困ることが、持っているディスクの状態とサービスの状態の同期が取れなくなってしまう
動かしているサービスによっては、中途半端な状態でサービスを続けちゃう状態になってしまう。というか実際にそうなった


自分の場合はApache Solrのインデックス半壊した？みたいな状態になってしまった。
おそらく、データの更新中にHostsErrorが発生し、再起動した時にそのままの状態でサービスが開始されてしまったのが原因だと思われる

## HostsError時の自動再起動を無効化する
サービスにもよるんだけど、自動再起動を無効化することにした
gcloudのコマンドが割と簡単に出来た

```bash
$ gcloud compute instances set-scheduling INSTANCE_NAME  --no-restart-on-failure
```


## まとめ
- GCEのインスタンスがHostsErrorの時は自動で再起動する
- 任意のタイミングで再起動されて困るシステムは自動再起動を無効化したほうがよい
【個人開発】GoでECSの定義ファイルを生成するアプリを作ってみた

# 概要
久しぶりに人様のための個人開発をしてみました。

AWS Fargateにデプロイする際、環境ごとに異なる値をECSのタスク定義に埋め込む必要がありますよね。最初はシェルスクリプトで環境変数を埋め込んでいたのですが、シェルって意外と繊細でエラーも出やすい。少し書き間違えただけで動かない…なんてことも多く、もっと簡単に管理できないかと考えた結果、ECSタスク定義ジェネレーターをGoで作ってみることにしました。

Goならシェルスクリプトよりも読みやすく、go installで簡単にインストールして使うことができます。Go CLIアプリとして、このツールを導入することで、効率的で安定したタスク定義の生成が可能になりました。

# 作ったもの
https://github.com/rendaman0215/ECSBuilder

## 使い方
- 必要なファイルの用意
  - タスク定義のテンプレートファイル
  - .envファイル
- インストール 
  - ```go
    go install github.com/rendaman0215/ECSbuilder
    ```
- 実行
  - ```go
    ECSbuilder -i INPUT_FILES_DIR -t TEMPLATE_FILE -e ENV_VILE -o OUTPUT_FILE_NAME
    ```

## 技術スタック
このジェネレーターは、Go言語で実装され、必要な各種ライブラリを用いて簡単な操作でタスク定義が作成できるよう工夫しています。以下が主な技術スタックです。

- `Go言語`: シンプルで速い。CLIツールの開発に最適
- `cobra`: CLIのフラグや引数処理に使用。GoのCLIツール定番のライブラリです
- `promptui`: ユーザーからの入力が必要なときに使います。インタラクティブに操作できるので、入力がなかった場合でもスムーズにサポートしてくれます

## 実装
###  1. ファイル構造
プロジェクトはクリーンアーキテクチャとDDDをベースに整理されています。これにより、役割ごとにファイルが分けられ、拡張や変更があってもコード全体の見通しが良くなるように工夫しています。


```plaintext
.
├── cmd
│   ├── root.go                  # コマンドエントリーポイント
├── internal
│   ├── app                      # タスク定義生成のメインロジック
│   └── config                   # 環境変数の読み込みロジック
└── pkg
    └── template_parser          # テンプレート置換ロジック
```

###  2. 動作の流れ
このジェネレーターは、3つのファイルを使用してタスク定義を生成します。

1. **テンプレートファイルと.envファイル**: まず、テンプレートファイルにプレースホルダー（`${VAR_NAME}`形式）を設定しておきます。次に、`.env`ファイルに実際の値をセット

2. **CLI実行でタスク定義を生成**: プログラムを実行すると、環境変数をテンプレート内のプレースホルダーに置換して`taskdef.json`を生成します

3. **エラーハンドリング**: `promptui`でファイルパスなどをインタラクティブに入力できるようになっているため、入力不足やエラーもスムーズに処理できます

### 3. コード例
このジェネレーターのメイン処理は、テンプレート内のプレースホルダーを環境変数で置き換えることです。以下のように、環境変数を読み込み、テンプレートのプレースホルダーと置換しています。

```go
// テンプレートのプレースホルダーを置換
content := string(templateData)
for key, value := range envVars {
    placeholder := fmt.Sprintf("${%s}", key)
    content = strings.ReplaceAll(content, placeholder, value)
}
```

シンプルですが、これでプレースホルダーが一気に環境変数に置き換わります。テンプレート内での変数が多くなっても、容易に管理可能です。


# まとめ
このツールのおかげで、シェルスクリプトで苦労していたタスク定義の生成が楽になりました。Goのシンプルさを活かしつつ、手作業から解放され、ミスも減少しました。もしあなたもシェルスクリプトでタスク定義を管理しているなら、ぜひこのツールを使って、タスク定義生成を簡単にしてみてください。
AIはMNISTのどこを見ているのか

ふと思ったんですがMNISTは8×8で次元数(64次元)の少ないデータセットだけど可視化でき、そしてそれが数字を表していると。
じゃあAIはどこを見て文字を判断しているか簡単に算出して可視化できるのではないかと思ってやってみました。
```Python3
from sklearn.tree import DecisionTreeClassifier as DTC
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

x = load_digits().data
y = load_digits().target

model = DTC()
model.fit(x, y)
imp = model.feature_importances_

imp = (imp - min(imp)) / (max(imp) - min(imp))
imp = imp.reshape(8, 8)
plt.imshow(imp, cmap="gray")
plt.colorbar()
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/a80217c0-ea99-b294-ee13-4c99c8a0e171.png)

というわけで可視化したらこのようになりました。
白くなればなるほどAIは重要視しているということになります。
きっとこれ0～9の共通している部分がグレーで白が何かを区別するところなんでしょう。
とりあえず横端は関係なく真ん中らへんと上と下で判断材料があるということでしょうね。
字を意識したことなかったのでこれから文字書くとき気を付けます。
GAS + API Gateway + Lambda 連携させてスプシの値をPOSTする

# はじめに
本記事ではGASからAPI GatewayのREST APIをコールする処理を実装していきます。

https://developers.google.com/apps-script?hl=ja

# ゴール
1. GASのスクリプトを実行して、スプレッドシートから取得した値をAPIにPOSTする
2. APIからステータス200でレスポンスが返ってくることを確認する

```:GASのログイメージ
Response: {"statusCode": 200, "body": "test1 を受け取りました。"}
```


# 作るもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/25bae9e1-43b9-bfe9-acb3-145f04bc23c1.png)

- 処理フロー：スプレッドシート→GAS→API Gateway→Lambda

# 1. Lambdaの準備
簡単なLambda のソースとして、本記事では下記のものを使用します。

```python:lambda_function.py
def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': f"{event['data']} を受け取りました。"
    }
```

# 2. API Gateway のエンドポイント作成
コールする用の REST API のエンドポイントを作成します。
下記の設定でメソッドを作成し、リソースをデプロイしておきます。

- メソッドタイプ：POST
- 統合タイプ：Lambda 関数（上記１で作ったLambdaを指定）


# 1. スプレッドシートの準備

サンプルとして、APIにPOSTする用の値を `A1:A5` に記載しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/f58827d4-4be4-9642-fc36-d4cec19c9ab7.png)

```:サンプル
test1
test2
test3
test4
test5
```


# 3. GASのスクリプトを作成

GASのスクリプトを作成します。

```javascript:main.gs
function sendDataToApiGateway() {
  const SPREADSHEET_ID = 'スプシのID';
  const API_ENDPOINT = 'APIのエンドポイント';

  try {
    // スプシ
    const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
    const sheet = spreadsheet.getActiveSheet();
    // A1:A5の範囲の値を取得
    const values = sheet.getRange('A1:A5').getValues();

    for (let i = 0; i < values.length; i++) {
      if (values[i][0]) {
        const requestOptions = {
          'method': 'POST',
          'headers': {
            'Content-Type': 'application/json'
          },
          'muteHttpExceptions': true,
          'payload': JSON.stringify({
            'data': values[i][0]
          })
        };

        // API Gatewayにリクエストを送信
        const response = UrlFetchApp.fetch(API_ENDPOINT, requestOptions);
        // レスポンスの内容をログに出力
        Logger.log('Response: ' + response.getContentText());
      }
    }
  } catch (error) {
    Logger.log(error);
  }
}
```
- UrlFetchApp：https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=ja
- openById(id) ：https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app?hl=ja#openbyidid

# 4. スクリプト実行

GASの `実行` ボタンを押下してスクリプトを動かすと、API Gatewayからステータス200でレスポンスが返ってくることを確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/bc4dd737-4a99-62f3-f55f-9c1d8c3a5bc6.png)



# 参考

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?hl=ja

https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet-app?hl=ja
AWSのアカウントとIAMに関する備忘録

# 記事を書こうと思ったきっかけ
AWSを使った初心者向けの勉強会を開催しようと思い、その際に参加者に実際の環境を使ってもらおうと考えた。

AWS環境を使って実現したいことは
 - 参加者が私の環境下でリソースを操作できる
 - 参加者には一括で適切なリソースの操作権限を付与する
 - 参加者のアカウントは私が提供する

上記について、AWS Organizationを使えばできると思っていたが、調べていくと間違いだと気づき、そもそもアカウントとIAMユーザーを理解できていなかったのでそこをまとめてみた。

# AWSアカウントとは
AWSアカウントとは1つのAWS環境を表している。身の回りの物で例えるとすると家＝AWSアカウントといえる。家の中には机や椅子、家電など様々なリソースがあるように、AWSアカウントの中にEC2やS3などのAWSリソースを作る。

そのため、AWSアカウントというのは利用者（ユーザー）を示すのではなく、環境そのものを指している。

# IAMユーザーとは
では、我々がイメージするアカウントは結局AWS上だと何であらわされるのかというと、IAMユーザーがそれにあたる。

AWSアカウントを作成するとルートユーザーが作成され、そこからIAMユーザーを作成していく。

AWSアカウントが家だとすると、IAMユーザーはそこに暮らすお父さんやお母さん、兄、姉なんかになると思う。ルートユーザーは先祖かなぁ…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/33304438-3753-4a72-ec00-7d22632404d7.png)


# AWS Organizationsは何ができるのか
公式サイトでは以下のように示されている。
> Organizationsを使用するとアカウントを作成してリソースを割り当て、アカウントをグループ化してワークフローを整理し、ガバナンスのポリシーを適用し、すべてのアカウントに単一の支払い方法を使用して請求を簡素化できる。

つまり、複数の環境（AWSアカウント）を管理するために利用される。

研修の話に戻ると、参加者それぞれにAWSアカウントを作成してもらって、それを自分の環境下で管理したいのであればOrganizationsを使うことになる。しかし、今回は参加者にアカウント（IAMユーザー）を払い出して利用してもらいたいのが目的である。

# 結論
AWSアカウント = 環境
IAMユーザー = 一般的にイメージされるアカウント
ということだった。

研修環境を作成するには、IAMユーザーを作成しそれを適切なIAMポリシーを設定したIAMグループに入れることで、実現できそうだとわかった。
【VSCode】ホバー時に型情報を詳細に表示する方法

Prettify TypeScriptという拡張機能を使用すると型情報を詳細に表示させることができます。

https://marketplace.visualstudio.com/items?itemName=MylesMurphy.prettify-ts

インストール後にホバーすると以下のように表示されます。

![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/fcc7625a-8d41-dafc-7f33-82d05399fa2c.png)
シート切り分け用マクロ

Sub ExtractAndCreateSheets()
    Dim wbSource As Workbook
    Dim wbNew As Workbook
    Dim wsSource As Worksheet
    Dim wsNew As Worksheet
    Dim filePath As String
    Dim newFileName As String
    
    ' ファイル選択ダイアログ
    filePath = Application.GetOpenFilename("Excel Files (*.xlsx), *.xlsx", , "ファイルを選択")
    If filePath = "False" Then Exit Sub ' キャンセルの場合は終了

    ' 選択したファイルを開く
    Set wbSource = Workbooks.Open(filePath)
    Set wsSource = wbSource.Sheets(1) ' 1シート目を対象にする

    ' 新しいワークブックを作成してオリジナルシートをコピー
    Set wbNew = Workbooks.Add
    wsSource.Copy Before:=wbNew.Sheets(1)
    wbNew.Sheets(1).Name = "Original"

    ' シート作成用の列情報を設定
    Dim sheetInfo As Variant
    sheetInfo = Array( _
        Array("P_Story", Array("serial", "age", "ageband", "sex", "Story", "ADD_Story")), _
        Array("P_Likes", Array("serial", "age", "ageband", "sex", "Likes")), _
        Array("P_Dislikes", Array("serial", "age", "ageband", "sex", "Dislikes")), _
        Array("P_Impression", Array("serial", "age", "ageband", "sex", "Impression", "ADD_Impression")) _
    )

    ' シートの作成
    Dim i As Integer, j As Integer
    Dim colIndexes As Collection
    Dim colName As String
    
    For i = LBound(sheetInfo) To UBound(sheetInfo)
        ' 抽出シートの作成
        Set wsNew = wbNew.Sheets.Add(After:=wbNew.Sheets(wbNew.Sheets.Count))
        wsNew.Name = sheetInfo(i)(0)
        
        ' 列インデックスを特定してデータをコピー
        Set colIndexes = New Collection
        For j = LBound(sheetInfo(i)(1)) To UBound(sheetInfo(i)(1))
            colName = sheetInfo(i)(1)(j)
            On Error Resume Next
            colIndexes.Add wsSource.Rows(1).Find(colName, LookAt:=xlWhole).Column
            On Error GoTo 0
        Next j

        ' データをコピー
        For j = 1 To colIndexes.Count
            wsSource.Columns(colIndexes(j)).Copy Destination:=wsNew.Columns(j)
        Next j
    Next i

    ' 新しいファイル名を指定して保存
    newFileName = Left(filePath, InStrRev(filePath, ".") - 1) & "_new.xlsx"
    wbNew.SaveAs Filename:=newFileName, FileFormat:=xlOpenXMLWorkbook

    ' 元のファイルを閉じる
    wbSource.Close False

    MsgBox "処理が完了しました。" & vbCrLf & "保存先: " & newFileName, vbInformation
End Sub
zshrcでエイリアスを登録する手順

# はじめに
zshを使っている場合、コマンドのショートカットとして「エイリアス」を設定することで、日常的に使用する長いコマンドを短縮することができます。今回は、zshrcファイルにエイリアスを追加して設定する手順を説明します。

## **ステップ 1: zshrcファイルを開く**

まず、ターミナルを開き、zshrcファイルをテキストエディタで開きます。zshrcファイルは、通常ホームディレクトリにあります。

```bash
nano ~/.zshrc
```

ここでは、`nano` エディタを使用していますが、`vim` や `code`（VS Codeを使用している場合）など、お好きなエディタを使ってください。

## **ステップ 2: エイリアスを追加する**

zshrcファイルが開いたら、ファイルの最後にエイリアスを追加します。エイリアスは以下の形式で記述します。

```bash
alias エイリアス名='実行するコマンド'
```

### **例: エイリアスの追加**

例えば、`git status` を短縮して `gs` としたい場合は、次のように追加します。

```bash
alias gs='git status'
```

同様に、プロジェクトディレクトリにすぐ移動できるエイリアスを設定することも可能です。

```bash
alias proj='cd ~/my_project_directory'
```

## **ステップ 3: 設定を反映する**

zshrcファイルを保存して閉じたら、次のコマンドを実行して設定を反映させます。

```bash
source ~/.zshrc
```

これで、追加したエイリアスが使用できるようになります。

## **ステップ 4: エイリアスが正しく動作するか確認する**

設定したエイリアスが正しく動作するかを確認するために、ターミナルでエイリアスを実行してみましょう。

```bash
gs
```

もしエイリアスが正しく設定されていれば、`git status` と同じ結果が表示されるはずです。

## **ステップ 5: エイリアスの一覧を確認する**

設定されているすべてのエイリアスを確認したい場合は、次のコマンドを実行します。

```bash
alias
```

これで、現在設定されているエイリアスの一覧が表示されます。

## おわりに

zshrcにエイリアスを設定することで、日常的なコマンドの入力が効率化され、ターミナル操作がより快適になります。よく使うコマンドやプロジェクトのディレクトリなど、エイリアスに設定して活用してみてください。
条件分岐　【備忘録】


##未ログイン者がURLで編集ページを直打ちされてもトップページへ戻る
##未出品者以外がURLで編集ページを直打ちされてもトップページへ戻る

この条件分岐がどうしてもわからなくて滅茶苦茶時間が掛かったので記録しておきます。

```ruby:app/controllers/items_controller.rb
#該当箇所のみ
class ItemsController < ApplicationController
  before_action :authenticate_user!, only: [:edit, :update, :destroy] # 未ログインユーザーはログインページにリダイレクト
  before_action :set_item, only: [:edit, :update, :show]
  before_action :move_to_index, only: [:edit, :update, :destroy]

   def set_item
    @item = Item.find(params[:id])
   end

   def move_to_index
    # ログイン済みでも出品者でない場合はトップページにリダイレクト
    redirect_to root_path unless current_user == @item.user
   end
```
`before_action :set_item, only: [:edit, :update, :show]`は、指定されたアクション`(edit, update, show)`が実行される前に、set_itemメソッドを呼び出すように設定しています。set_itemは、そのアクションで使用する商品情報をデータベースから取得して設定するためのメソッドです。

具体的な動作
```ruby
before_action :set_item, only: [:edit, :update, :show]
```
この行により、`edit, update, show`のアクションが実行される前に必ず`set_item`が呼び出され、@item変数に商品のデータが入ります。

`set_item` メソッドの内容

```ruby
def set_item
  @item = Item.find(params[:id])
end
```
`Item.find(params[:id])`は、`params[:id]`に基づいて、データベースから特定のItem（商品）レコードを検索します。
例えば、URLが`/items/15/edit`であれば、`params[:id]`には15が入り、データベースでIDが15のItemが検索されます。
見つかった商品が@itemに代入され、その後のアクション内`（edit, update, show）`で使えるようになります。

メリット
`before_action :set_item`を使うことで、同じ商品取得コード`(@item = Item.find(params[:id]))`をアクションごとに書く必要がなくなり、コードがすっきりして保守もしやすくなります。
Facebookでのソーシャルメディア活用におけるコーディングの重要性 はじめに

![Screenshot_2024-10-27-20-29-06-42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3920624/9847406b-fe6c-d5d5-6b54-077abe21eafb.jpeg)

Facebookは、個人やビジネスにとって最も影響力のあるソーシャルメディアプラットフォームの一つです。しかし、多くの人が知らないのは、Facebookを効果的に活用するために「コーディング」が重要な役割を果たしているということです。今回は、コーディングがどのようにFacebookでのソーシャルメディア戦略を強化し、マーケティングの成功に貢献するかを解説します。

1. コーディングでFacebook投稿を最適化する
Facebook上での投稿内容を最適化するには、HTMLやJavaScriptなどの基本的なコーディング知識が役立ちます。例えば、投稿するコンテンツにエンゲージメントを増やすための埋め込みコードを使用したり、ビジュアル要素をカスタマイズしたりすることができます。特に、動画のサムネイルやリンクの表示方法を工夫することで、視覚的に目を引く投稿を作成できます。

2. Facebook APIを利用した自動化
Facebook APIを活用することで、投稿のスケジュールやユーザーとのインタラクションを自動化することが可能です。例えば、PythonやJavaScriptでFacebook Graph APIを活用すれば、以下のような操作が自動化できます。

投稿スケジュール管理
コメントへの自動返信
新規フォロワーのデータ収集
これにより、手動での作業時間が削減され、マーケティング担当者はより戦略的な作業に集中することができます。

3. データ解析で効果測定
コーディングを活用したデータ解析は、投稿のパフォーマンスを把握するために重要です。PythonやRといったプログラミング言語を使って、Facebookから取得したデータを分析することで、ユーザーの反応やトレンドを正確に把握できます。これにより、よりエンゲージメントの高いコンテンツを作成するためのデータドリブンな戦略が可能になります。

4. 自動化ツールで効率化
Facebookの運用に関して、既存の自動化ツールも活用することが効果的です。IFTTTやZapierなどのツールと組み合わせることで、投稿スケジュールの自動化や、他のSNSプラットフォームとの連携を簡単に設定できます。こうしたツールの背後にはコーディングの技術があり、コーディング知識があればさらなるカスタマイズが可能です。

まとめ
Facebookでのソーシャルメディア戦略を強化するためには、コーディングスキルが大いに役立ちます。コーディングを使って投稿を最適化し、APIで自動化し、データ解析でパフォーマンスを測定することで、より効果的なマーケティング戦略が実現します。Facebookのアルゴリズムを理解し、コーディングの力を活用することで、あなたのビジネスやブランドは一層成長することでしょう。
Python 不動産情報ライブラリAPIを使ってみる  利用申請編

APIという言葉は聞いたことがあり、使ってみたいとは思うものの、何をどうすればいいのかわからない。
どうせ使って何か作るなら自分で使えそうであり、興味のあるものを作りたい。
私は不動産が大好きである。調べてみると、不動産情報ライブラリというAPIが存在するらしく、これは何か使えそうな気がしたので、利用申請してみる。

1.不動産情報ライブラリとは
2.利用申請方法
3.APIキーの発行

1.不動産情報ライブラリとは
-
不動産情報ライブラリとは、不動産の取引価格、地価公示等の価格情報や防災情報、都市計画情報、周辺施設情報等、不動産に関する情報をご覧になることができる国土交通省のWEBサイトである。
地域毎の不動産取引価格等をjson方式で提供している。

2.利用申請方法
-
個人の場合、必要な情報入力は以下とおり

・利用者名
・メールアドレス
・利用目的

下記のリンク先から利用利用申請し、承認されるとすぐに使えるようになる。
<a href="https://www.reinfolib.mlit.go.jp/api/request/">⇒ 利用申請フォーム</a>

3.APIキーの発行
-
事務局により利用承諾が完了すれば、<strong>【不動産情報ライブラリ】 API利用申請に関する審査結果のお知らせ</strong>という下記のようなメールが登録したアドレスにAPIキーが届く。

次回以降、実際に使ってみる。
マネジメント｜アドバイスの方法って色々あるよね

# はじめに

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約3分で読めるため、最後まで読んでもらえると幸いです。

-------------

最近流れてくるG.G.佐藤氏のインスタリールの第2弾になります！
今回も個人的に響いたインタビューをされていたのでご紹介になります。
第1弾の記事はこちらになります。
『そもそもG.G.佐藤って誰？』についても触れてますのでぜひご覧ください

https://qiita.com/ho_na/items/c22bcf2d1a92646f873a


# 以下、インタビュー形式で行われたインスタリールの内容

:::note info
インタビュアー：イ　G.G.佐藤氏：G
:::

G：アメリカの打撃コーチって一番朝早くに来て一番最後に帰るの。ずっと見てるの。一向に教えてこない。

イ：コーチですよね？

G：うん。見てるだけ。

イ：見てるだけなんですか？

G：俺打ってんじゃん。「何見てんだよ！仕事しろよ！教えてこいよ！」と思った。

G：ある時タイミングの取り方が分からなくなって、そのコーチに聞きに行ったの。
　 タイミングの取り方教えて欲しいと。

G：そしたら待ってましたとばかりにアタッシュケースの中からG.G.佐藤の資料、準備万端でもう連続写真とか、『これが良い時、これが悪い時、今こうなってるからこうした方がいい。』と教えてくれたの

G：「え、この資料俺が聞きにこなかったら使わなかったの？」て言ったら

『使わない』って

### 『求めてこない者に対して教えても意味が無いだろう』 と

G：そのコーチが良く言ってたのは、『日本人のコーチはもしかしたら選手をコントロールしようとしてるんじゃないか？』

### 『人をコントロールするのは出来ないんだと。自ら求めない限り行動することはないから、内発的動機づけをいかに生むような関わりをしなきゃいけないんだ』

というのを良く言ってました。

### 自分で考えさせる文化ですよね。考えた中で分からなくてアドバイスを求めてきた時に指導者はそのアドバイスに答えてあげる

っていう「導くリードマネジメント」みたいな感じ。アメリカは。


# 所感

この話を聞いた時に、ふと前職の新入社員時代の事を思い出しました。
当時の上司や先輩たちは、私が「求める」「求めない」に関わらず、たくさんのアドバイスや叱咤激励をしてくださいました。当時は今よりポンコツに拍車がかかった状態だったので「諸先輩方、本当にすみません！」の気持ちでいっぱいでしたw
今思うと「強制的にレベルを引き上げる」アプローチでした。諸先輩方のご尽力のおかげもあって時間はかかりましたが、拍車のかかったポンコツから社会でなんとか生存できるポンコツにまでレベルを引き上げていただけたと勝手に思ってます。個人的にはこのやり方が性分に合っていましたし、本当に感謝しかないです。

今回の様な内発的動機づけを生むための仕組み作りに関してもすごく素敵な考え方だなと思いましたし、アドバイスに対する引き出しが増えて嬉しいです。一方で、このアプローチは「本人が自分の意思を律する」前提の進め方になるので、一長一短あるよなーとも感じてます。ちなみに今の私の考えは、聞かれてもないのに自分からアドバイスをするのはおこがましいよな、聞かれたら自分の知り得る範囲でアドバイスさせていただきます！と思ってる派です。

たらたら書いてしまいましたが、結局何が言いたいかというと、全ての人に同じアプローチが通用するとは思わずに、その人その人に合わせて臨機応変に対応していく必要があるよなと思ったわけです。普段からコミュニケーションを取りながら人となりを理解して、その人に合った方法でアプローチが出来ればと思います！

# さいごに

突然ですが、弊社のご紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

### エンジニアリングの募集

https://www.wantedly.com/projects/1808638

### PM・Webディレクションの募集

https://www.wantedly.com/projects/1355235

### セールス・事業開発の募集

https://www.wantedly.com/projects/1792065

### コーポレート系の募集

https://www.wantedly.com/projects/1752874

### コンサルティングの募集

https://www.wantedly.com/projects/1794481

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後まで読んでいただき、ありがとうございました！
【基本情報技術者試験】計算関係

**はじめに**
-
この記事は自分の苦手分野である計算問題を克服するためのまとめ記事です。

**主な論理演算**
-
**①論理和(OR)**
入力のどちらかが真(1)なら真(1)になる演算。

ベン図:
![ORのベン図](https://joho-taisaku.com/wp-content/uploads/2-2-5-768x432.png)

MIL記法:
![ORのMIL記法](https://joho-taisaku.com/wp-content/uploads/2-2-6.png)

**②論理積(AND)**
入力のどちらも真(1)の場合のみ真(1)になる演算。

ベン図:
![ANdのベン図](https://joho-taisaku.com/wp-content/uploads/2-2-3-768x432.png)

MIL記法:
![ANDのMIL記法](https://joho-taisaku.com/wp-content/uploads/2-2-4-768x279.png)

**③論理否定(NOT)
入力の逆の値が出力される演算。
つまり偽なら真で、真なら偽になる。

ベン図:
![NOTのベン図](https://joho-taisaku.com/wp-content/uploads/2-2-1-768x432.png)

MIL記法:
![NOTのMIL記法](https://joho-taisaku.com/wp-content/uploads/2-2-2.png)

**④排他的論理和(XOR)**
入力のうちどちらも真(1)もしくは偽(0)なら偽(0)になる演算。
覚え方としては同じ値は嫌だから０にするイメージかな。

ベン図:
![XORのベン図](https://joho-taisaku.com/wp-content/uploads/2-2-11-768x432.png)

MIL記法:
![XORのMIL記法](https://joho-taisaku.com/wp-content/uploads/2-2-12.png)

**ネットワークアドレスの求め方**
-
IPアドレスとサブネットマスクを2進数表記にしてAND演算で求める。

例:
IPアドレス： 10.170.70.19
サブネットマスク：255.255.255.240
10.170.70.19を2進数で表現すると、

00001010 10101010 01000110 00010011

同様に255.255.255.240も2進数で表現すると、
　
1111111 11111111 11111111 11110000

これをAND演算すると、

00001010 10101010 01000110 00010000

これを10進数にして10.170.70.16がネットワークアドレスになる。

**論理式をベン図に**
-
![スクリーンショット 2024-11-02 084626.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825037/2cfc01d6-49d6-b3d5-9ba3-db352c135ebe.png)

この手の問題はベン図に直して考えると解きやすい。
この問題の論理式をベン図に直すと、以下のようになる。
![スクリーンショット 2024-11-03 055906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825037/34571af3-6277-e470-cce0-c2b7cc8d71a1.png)

これら３つの集合の論理和をベン図で表すと以下のようになる。

![スクリーンショット 2024-11-03 060207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825037/15e9055e-4873-99a1-3db6-d9bff0d75351.png)
このベン図はNANDを表すため、答えはイになる。

**実行アクセス時間の求め方**
-
実行アクセス時間＝キャッシュメモリのアクセス時間*ヒット率+主記憶装置のアクセス時間*(1-ヒット率)
jestでselect(combobox)を変更する

selectの変更がサクッと調べられなかったので備忘録がわりに残します。

備忘録として、select要素の変更をテストする方法を記録しておきます。以下では、簡単な実装とそのテスト方法を紹介します。

## 実装
まず、以下のようなHTMLのselect要素を用意します。

```
<select>
  <option>value1</option>
  <option>value2</option>
  <option>value3</option>
</select>
```

## テスト
次に、このselect要素が正しく動作することをテストします。以下のテストコードは、value3が選択できるかを確認します。
```
test('selectでvalue3が選択できること', async() => {
  // select要素を取得
  const selectValue = screen.getByRole("combobox").closest("select")!
  
  // value3に選択を変更
  fireEvent.change(selectValue, { target: { value: "value3" }})
  
  // value3に変更されたことを確かめる
  expect(selectValue.value).toBe("value3")
})
```

## 補足
``.closest("select")!``を使用している理由は、getByRoleで取得した要素がHTMLElement型と解釈され、valueプロパティが見つからないエラーを避けるためです。
これにより、select要素を明示的に取得し、HTMLSelectElement型として扱うことができます。

もう少し良い書き方がありそうですが、今回はこれまでとします。


## 最後に
getByRoleは色々指定できるので、公式を見ながら何が取得できるか試してみると良いです。
https://testing-library.com/docs/queries/byrole
短い記事ですが、誰かの時間を救えればいいなと思っています。
最後まで見て頂きありがとうございました。