OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsのネットワークアダプターをWSLへ自動でブリッジする

# はじめに

まず、最新のWindows11環境であれば、wslへのネットワークアダプタのブリッジは `.wslconfig`に数行記入するだけでよく、複雑な作業を行う必要はない

```.wslcomfig
[wsl2]
networkingMode=bridged
vmSwitch=External
dhcp=true
```

今回どうしてもWindows10を使わねばならず、起動時に自動的に指定のネットワークアダプターをWSLにブリッジしたかった。Windows10環境では上記の.wslconfigでの自動化は対応しておらず、かなり苦労したので方法を共有しておく。

# ブリッジの自動化スクリプト
結論から言うと、こちらのようなPowrShellスクリプトで自動化できる。

```PowerShell
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
{
    $argsToAdminProcess = ""
    $Args.ForEach{ $argsToAdminProcess += " `"$PSItem`"" }
    Start-Process powershell.exe "-File `"$PSCommandPath`" $argsToAdminProcess" -Verb RunAs
    exit
}
wsl -d Ubuntu-22.04 -- echo 'hello hello how row?'
Disable-NetAdapterBinding -Name "イーサネット"
Set-VMSwitch -Name "WSL" -NetAdapterName "イーサネット" -AllowManagementOS $true
```

こちらの例では、後半3行でWSL2のUbuntu22.04を起動後、"イーサネット"という名前のアダプターを"WSL"という仮想スイッチにブリッジしているので、この辺りは適宜使用環境に合わせて変更してほしい。

前半の部分は、ネットワークのブリッジは管理者権限でないと行えないため、管理者のシェルに昇格している。
最初から管理者権限で起動するなどできればそれでもいいのだが、自分の環境ではうまくいかなかったため、この手法をとることにした。

このスクリプトを、タスクスケジューラやスタートアップに登録すれば、OS起動後に自動的にネットワークがWSLにブリッジされる。
SpringBoot開発で役に立つVSCode拡張機能


# SpringBoot開発役に立つVSCode拡張機能

Ecripseだけでなく、VSCodeの拡張機能でIDE相当にするために色々と拡張機能を追加しました。
Spring Bootを使用できるような開発機能が諸々ありましたので備忘録として残します。


# 追加した拡張機能

* XML Tools
https://marketplace.visualstudio.com/items?itemName=DotJoshJohnson.xml

* Japanese Language Pack for Visual Studio Code
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

* Language Support for Java(TM) by Red Hat
https://marketplace.visualstudio.com/items?itemName=redhat.java

* Community Server Connectors
https://marketplace.visualstudio.com/items?itemName=redhat.vscode-community-server-connector

* Runtime Server Protocol UI
https://marketplace.visualstudio.com/items?itemName=redhat.vscode-rsp-ui

* IntelliCode API Usage Examples
https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.intellicode-api-usage-examples

* IntelliCode
https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode

* Spring Boot Extension Pack
https://marketplace.visualstudio.com/items?itemName=vmware.vscode-boot-dev-pack

* Spring Boot Tools
https://marketplace.visualstudio.com/items?itemName=vmware.vscode-spring-boot

* Spring Boot Dashboard
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-boot-dashboard

* Debugger for Java
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-debug

* Extension Pack for Java
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack

* Test Runner for Java
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-test

* Maven for Java
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-maven

* Spring Initializr Java Support
https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-spring-initializr

* Java
https://marketplace.visualstudio.com/items?itemName=Oracle.oracle-java
【TypeScript】NonNullableについて

## `NonNullable`について
`NonNullable` は指定した型から `null` および `undefined` を除外できます。

## 基本的な使い方

`NonNullable<Type>` を使用する基本的な構文は以下の通りです。

```typescript
NonNullable<Type>
```

## 例

```typescript
type NullableString = string | null | undefined;

type NonNullableString = NonNullable<NullableString>;
// string
```

上記の例では、`NullableString` 型は `string`、`null`、および `undefined` を含みますが、`NonNullable<NullableString>` を使用することで、`null` と `undefined` が除外され、`NonNullableString` 型は `string` のみになります。
初級者向けSQLチューニング練習問題

初級者向けSQLチューニング練習問題を

- チューニング対象 SQL 文
- SQL 文を実行するためのテーブルとデータの作成スクリプト

のペアで作成しました。以下で公開しています。

https://github.com/abe-masanori/sql-tuning-for-beginner

私自身は最近 BI/DWH を中心としたデータ分析系システムを担当することが多いので、OLTP 系システムの SQL チューニングに関わることはほとんどありません。ただ、会社で DB を学び始めた人の育成に関わることもあり、その一環で初歩的な SQL チューニングに取り組める環境を準備しておこうと思い、この問題を作りました。

テーブル構造やチューニング対象の SQL 文は意図的に非常にシンプルにしてあります。そのため、適当に試行錯誤することで速くすることができるかもしれませんが、実行計画の取得の方法やその解釈、遅い原因の特定などチューニングに必要なプロセスを経験することを意識して取り組んでもらえればと思います。

ちなみに今回準備したチューニング対象 SQL 文は、大半が ChatGPT に SQL チューニングさせてみた以下の記事のものを再利用しています。

https://qiita.com/abe_masanori/items/acb3bddf89111db803b7

上の記事にあるように ChatGPT でも概ね適切なチューニング案を提示できるのですが、その結果の妥当性を判断するためには実行計画の分析方法や主要なチューニング手法について知っている必要があります。そういったものを実践で学び始める第一歩になればと思っています。

環境構築の方法や練習問題に取り組みにあたっての注意点はリポジトリをご確認ください。

以下に対象の SQL 文を載せておきます。

```sql:Question01.sql
select
    c.customer_id,
    c.customer_name
from
    customers c
where
    c.tel_number = '09012345678'
;

```
```sql:Question02.sql
select
    i.item_id,
    i.item_name
from
    items i
where
    i.item_category_id = 30230
and
    i.supplier_id = 40620
;

```
```sql:Question03.sql

select
   count(*)
from
   customers c
where
   to_char(c.birthday, 'YYYYMM') = '200101'
;

```
```sql:Question04.sql
select
   c.customer_id,
   c.customer_name
from
   customers c
where
   c.region_cd = 200123
;

```
```sql:Question05.sql
select
        count(*)
from
        orders o
where
        o.order_date between
        to_date('2023-04-01', 'YYYY-MM-DD') and
        to_date('2023-06-30', 'YYYY-MM-DD')
and
        o.item_id = 20000034
;
```
```sql:Question06.sql
select
        o.order_id,
        o.order_date,
        o.item_id,
        o.order_amount
from
        orders o
inner join
        customers c on (o.customer_id = c.customer_id)
where
        c.customer_name = 'cust_name_10064248'
order by
        o.order_id
;
```
```sql:Question07.sql
select
        o.order_id,
        c.customer_name,
        i.item_name
from
        orders o
inner join
        customers c on (o.customer_id = c.customer_id)
inner join
        items i on (o.item_id = i.item_id)
where
        c.prefecture_cd = 14
and
        i.item_name like 'item\_ABCDEFGHIJKLMNOP\_2299999%' escape '\'
;
```
```sql:Question08.sql
select
        o.order_id,
        o.order_date,
        o.item_id,
        o.order_quantity
from
        orders o
where
        o. customer_id = 10000128
order by
        o.order_date desc
fetch first 50 rows only
;
```
```sql:Question09.sql
select
        o.order_date,
        sum(o.order_quantity),
        sum(o.order_amount)
from
        orders o
where
        o.item_id = 20000301
group by
        o.order_date
;
```
```sql:Question10.sql
select
        c.customer_id,
        o.order_id,
        o.item_id
from
        customers c
inner join
        orders o on (c.customer_id = o.customer_id)
where
        c.customer_name like 'cust\_name\_1000001%' escape '\'
and
        o.order_id = (
                select
                        max(o1.order_id)
                from
                        orders o1
                where
                        o1.customer_id = c.customer_id
                )
order by
        c.customer_id
;
```
PWM(1khz(5%...95%))→PWM(500us...2400us)をサブマイコン(STM32L010)で変換して遊ぶ


目的
とりあえず実験環境を組む
M5NanoC6の信号でラジコンサーボを動かす(よてい)



結果(サーボが動いた)

![o_coq465.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/df81cdee-9a08-f568-3bbe-fcd5c824ca46.jpeg)

![o_coq466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5cf1e405-99fd-7b89-24d1-4d5c14fedbfa.jpeg)


プログラム

```c++


//PWM_IN_1kPWM_OUT_50Hz_1500us_L010_2


#include "mbed.h"


#define HIGH 1
DigitalIn  ECHO(PA_5);
//タイマーの設定
Timer t;
//マスク       5432109876543210
int masuk = 0b0000000000100000;

//PA_5のオン時間をusで測る　今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{

    //t.reset();//タイマーの開始

    //timeout1 = 32000000;
    timeout1 = 100000;    //28ms
    //timeout1 = 1000;   //degbu

    //while(PA_5 == 0) {}

loop_s1:
    timeout1--;
    //                            5432109876543210
    if (     (~(GPIOA->IDR))  & masuk     ) {
        if ( timeout1 ) {
            goto loop_s1;
        }
    }


    //unsigned long sd = t.read_us();//測定開始

    //timeout1 = 32000000;
    timeout1 = 100000;     //28ms
    //timeout1 = 1000;   //degbu

    t.reset();//タイマーの開始

    //while(PA_5 != 0) {}

loop_in1:
    timeout1--;
    //                      5432109876543210
    if (   (GPIOA->IDR) & masuk   ) {
        if( timeout1 ) {
            goto loop_in1;
        }
    }


    return((int)t.read_us()/*-sd*/);//測定終了

}//pulseIn


#define V_0    500
#define V_180 2400
#define HH  ((V_180-V_0)*1024)/180
#define SO(AA) (V_0+(((AA)*(HH))>>10))

//PWMのピンの設定
//PwmOut servo(A4); //PA_5   //010
//PwmOut servo(PA_4); //PA_5   //010
PwmOut servo(PA_3); //PA3   //010

//メインルーチン
int main()
{

    //タイマーの開始
    t.start();

    int times; //測定時間


    //周期の設定        
    servo.period_us(20000); //50hz

    //間隔の設定
    servo.pulsewidth_us(10000); //50%


    //無限ループ
    while(1) {

        // PWMを受け取る 引数は、無効(空読み)
        times = pulseIn( 5, HIGH,2000000);
        // PWMを受け取る 引数は、無効
        times = pulseIn( 5, HIGH,2000000);

        //少し論理値よりズレるので補正
        times = ((times * (1024+5))>>10)-2;
        if( times <   50){times =  50;}
        if( times >  950){times = 950;}
        times = times - 50;
        times = times * 2;
        times = (times * 52429) >> 19; // n/10

        //間隔の設定 0...180 -> 500...2400
        servo.pulsewidth_us( SO(times) ); //50%

        //0.2秒の待ち
        wait_ms(200);


    }//while

}//main


//容量削減
void error(const char* format, ...) {}


```
React初学者がUseEfeectをまとめてみる！

## そもそもuseEffectとは？
useEffect は、Reactにおけるフック（Hook）の一つです。主に「副作用」を扱うために使われます。副作用とは、データのフェッチや、DOMの操作、外部APIとの通信など、コンポーネントの描画プロセスに直接影響しない処理を指します。

### 主なユースケース
useEffect が使用される典型的なユースケースは以下の通りです。

外部APIでのデータ通信（fetchなど）
DOMの直接操作（例：スクロール位置の変更やアニメーション）
イベントリスナーの登録（マウスやキーボードのイベント監視）
初期化処理（コンポーネントがマウントされた時に一度だけ実行したい処理）
WebSocketの接続・切断
これらのユースケースでは、コンポーネントのライフサイクルに基づいて特定のタイミングで処理を実行したり、必要に応じてクリーンアップ（後処理）を行うことが求められます。

### 一般的な記法
```
import { useEffect } from "react";

const Example = () => {
  useEffect(() => {
    // ここに副作用を伴う処理を書く

    return () => {
      // ここにクリーンアップ関数を書く
    };
  }, [依存配列]);
};
```
上記のコードでは、useEffect に渡した関数が副作用処理を担当します。また、戻り値としてクリーンアップ関数を返すことができます。このクリーンアップ関数は、コンポーネントがアンマウントされるタイミングや依存配列に指定された値が変わった際に実行されます。

### 実行タイミング
useEffect は以下のタイミングで実行されます。

#### 初回レンダリング時
コンポーネントが最初に画面に描画された直後に発火します。
- 依存配列の値が変更された時
- 依存配列に指定された値が更新された場合、そのタイミングで再度副作用の処理が実行されます。
- 依存配列が空（[]）の場合は、初回レンダリング時に一度だけ実行され、それ以降は発火しません。

#### クリーンアップ関数
クリーンアップ関数は以下の状況で実行されます。
- コンポーネントがアンマウントされる時
- 依存配列の値が変更され、再レンダリングが行われる時
- これは特に、イベントリスナーの解除や、WebSocketの切断、タイマーのクリアなどに利用されます。

#### 再レンダリングとは？
再レンダリングとは、以下の条件でコンポーネントが再度描画されることを指します。

- コンポーネント自身の props が変更された時
- コンポーネント自身の state が変更された時
- 親コンポーネントが再レンダリングされた時
- 
Reactでは、状態やプロパティの変化に基づいて必要に応じてコンポーネントが再描画されますが、その際に useEffect が再実行されることがあります。

#### useEffectの発火タイミング
useEffect はコンポーネントが「レンダリング」された後に実行されます。つまり、DOMが生成された後に副作用処理が行われます。これにより、DOMを操作する処理がDOMの生成前に実行されるという問題を防ぐことができます。

例として、以下のようなDOMの操作を伴う関数があったとします。

```
useEffect(() => {
  const element = document.getElementById('my-element');
  element.style.color = 'red'; // DOMが存在しないと実行できない
}, []);
```

この場合、useEffect がDOMの生成後に実行されるため、document.getElementById を使って問題なくDOMを操作できます。もしこれがDOM生成前に実行されると、操作対象の要素が存在しないためエラーが発生します。

### ユースケースの確認
useEffect の具体的なユースケースを再確認しておくと、実際に副作用を伴う処理を行う際に、正しくライフサイクルに合わせて処理を行えるようになります。たとえば、API呼び出しやイベントリスナーの登録、さらにその解除までを管理するための重要な機能として、Reactコンポーネント開発において頻繁に使われるフックです。

このように、useEffect はReactコンポーネントのライフサイクルに基づいて、副作用の管理を行う非常に便利なフックです。正しいタイミングで処理を行い、適切にクリーンアップを行うことで、パフォーマンスの最適化やメモリリークの防止につながります。

### 最後に
認識に間違えがあったり、追記したほうがいいことがあったらコメントなどで教えていただけると幸いです。
【デザインパターン】Factory Methodパターン学習備忘録

# はじめに

Factory Method を学習した際の備忘録をまとめました。

# 概要

オブジェクトの生成をサブクラスに委ねることで、インスタンス生成のプロセスを柔軟に設計するためのデザインパターン。クライアントコードが具体的なクラスに依存せずにオブジェクトを生成する柔軟な方法を提供する場面で有効。

# 利用目的

- オブジェクト生成のカプセル化
  クライアント（利用者）にどの具象クラス（具体的なクラス）がインスタンス化されているかを隠し、依存性を減らす。
- インスタンス生成の柔軟性
  サブクラスでオブジェクト生成のロジックを変更することができ、動的にインスタンスを変更することが可能。新しいクラスの追加が容易。新しいサブクラスを作るだけで新しいオブジェクトを生成できる。高い拡張性を持ちながら、クライアントコードが変更されずに済むことが多い。

# 注意点

クラスの数が増えがちで、シンプルなシステムには冗長に感じることがある。

# 実装
```java:Creator.java
// Factory Methodを持つ抽象クラス
abstract class Creator {
    // サブクラスが実装するFactory Method
    public abstract Product createProduct();

    // 製品オブジェクトを作って使う
    // 【要点！】具体的な製品・工場クラスの種類が増えても、ここを変更する必要がない！
    // 別のロジッククラスで定義する場合もある。
    public void doSomething() {
        Product product = createProduct();
        product.use();
    }
}
```
```java:Product.java
// 製品インタフェース
public interface Product {
    void use();
}
```
```java:ConcreteCreatorA.java
// 具体的な工場Aが製品Aを作る
public class ConcreteCreatorA extends Creator {
    public Product createProduct() {
        return new ConcreteProductA();
    }
}
```
```java:ConcreteCreatorB.java
// 具体的な工場Bが製品Bを作る
public class ConcreteCreatorB extends Creator {
    public Product createProduct() {
        return new ConcreteProductB();
    }
}
```
```java:ConcreteProductA.java
// 具体的な製品クラスA
public class ConcreteProductA implements Product {
    public void use() {
        System.out.println("Product A is used.");
    }
}
```
```java:ConcreteProductB.java
// 具体的な製品クラスB
public class ConcreteProductB implements Product {
    public void use() {
        System.out.println("Product B is used.");
    }
}
```
```java:App.java
// 使用例
public class App {
    public static void main(String[] args) throws Exception {
        Creator concreteCreatorA = new ConcreteCreatorA();
        concreteCreatorA.doSomething();

        Creator concreteCreatorB = new ConcreteCreatorB();
        concreteCreatorB.doSomething();
    }
}
```

# クラス図
![factory_method_calss_diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3845328/d130bfee-b66e-b4b6-a061-c3f2abcdc419.jpeg)
母校完全再現のメタバース作る Part 0

# 学校を完全再現したメタバースを開発する話

完全に高校生だけで、作っています。
結構馬鹿なことをしてるかと思いますが、暖かく見守ってくださると嬉しいです。

長編シリーズになると思います。

## 前書き
自分たちの高校をメタバースで完全再現して、
メタバースとしてネットに後悔することになった。
後輩への受け継ぎと、自分の備忘録として何したかを記録しとく。

## 経緯
うちらの高校では、SF（文化祭）で年一回大きなことをする。
例年は、ジェットコースターを作ってるが、はっきり言ってしんどいので、
何か、自分のプログラミングの知識を使って、できることはないかなとずっっと思っていた。

## 初期案
最初は、ラズパイかなんかで、画像認識を使って、体感型の体動かす系のゲームを作ろうかなと考えていた。

しかし、学校のネットワークを使えないこと。

また、プレイヤー側の機器として、お客さんはスマホ使えるのでそれでいいのだが、（ブラウザでなんやかんや）

大部分のお客さんである生徒はスマホを使えないので、どうしよ。という問題があった。

## 発想の転換

プログラミングでできることを文化祭で活かそうとすると、来てくれた人に何かすることを考えていたが、

うちらの学校は、文化祭に入れる人が制限されていて、すぐに枠が埋まってしまうので、

ほんとは来たかった人が大量にいる。

学校の中をその人たちにも体感してほしいということで、
来てくれない人たち向けに、学校を完全再現したメタバースを作ろうとなったのだ。

## 計画

### 協力者
やってることがかなり狂ってるので、協力者は意外とすぐ集まった。

* Blenderを操るモデル作成の人
* 学校の測量をする人
* プログラミングする人（僕）
* 先生との交渉役

### 仕様の定義

まずは、仕様を定義し、技術の選定をする。
大体の仕様をみんなで決めて、仕様書を作った。

というわけで、スマホでもできるような軽いWebアプリケーションがいいという結論に、

### 技術の選定

多分、速さ重視ならWeb Assemblyを使って作るべきだが、
僕には、そんな高度な技術を持っていない。

そのころ、「React神」状態だったので、
フロントエンドは、React Three Fiberというライブラリを使って、作ることにした。

:::note info
React Three Fiberってのは、ReactとThree.jsを組み合わせることによって、簡単にグラフィック作れるよ。っていうライブラリ
:::

ちなみに、バックエンドはまだ決めてない。
Javaで作るか、Node.jsかという感じ。

## 終わり

最初なので、ポエムとなってしまったが、
次回はコードが登場するはず

次回を、お楽しみに！

次回↓

https://qiita.com/sonneko/items/1f82ecb83dd1636ed192
LP の QA テスト観点

# 背景
実務で LP の QA を実施した。
LP の QA は初めてだったので、今回出したテスト観点を残しておく。

# テスト観点
- デザイン
- アニメーション
- 画像
- 文言
- 遷移
- デバイスごとの表示
- 多言語切り替え
- エラーページ
- OGP
- GA

# 各観点の所感
## デザイン
デザイナーに確認してもらえるなら、デザイナーに QA 実施してもらうべきと思う。（デザイン QA）
QA がデザインをチェックする（ figma とかで作られたデザインと LP のデザインをチェックする）とかはできる。が、単なる見た目の比較とかちょっとした違和感とか感覚ベースになる。
デザインは、デザインを作った人に見てもらうのがよい。

## アニメーション
これも基本的にデザイナーが見るで良いと思う。
アニメーションは変な動きとかしてるとすぐわかるので、デザインよりは QA も自信を持って確認はできそう。

## 画像
仕様として定義されている画像が表示されているかの確認。
開発者は単に書き出し->ソースコードの assets フォルダ的なとこに画像を置く->ソースコードにそのパスを書くって感じで作業すると思う。
単なる作業になりがち & 書き出し忘れとか案外あるので、ちゃんと確認する。案外時間かかる。

## 文言
後回しランキング一位。
確認の負荷でかい、時間がかかる。多言語だと言語数分。
QA が頑張るしかないと思う観点。
細かくても心を鬼にして、issue を切る。

## 遷移
LP で一番クリティカルな観点。
ヘッダーとフッターはリンクが多いので注意。
LP のメインの導線があるとこはさらに注意。当たり前だが、ここのリンク死んでるとメインであるサービスに辿り着けない。

## デバイスごとの表示
PC、SP などデバイスごとに異なる表示を確認する。

## 多言語切り替え
大体文言が異なるケースが多いと思う。気合い入れて文言確認する。

## エラーページ
不正な URL を踏んだ時にちゃんと NOT FOUND のエラーページが出るか、などを確認する。
メンテナンスページとかも見れるとよい。
500系はどうやって確認する？そもそも500系エラー起こる？などあると思うので、その都度臨機応変に。

## OGP
検証ツールで確認 or 使ってよいなら web に転がってる確認ツールで確認。
本番リリース後は、実際に SNS の投稿画面に貼ってみて確認する。

## GA
確認自体は簡単だが、QA 実施するまでにダッシュボードを確認できる状態にしておく。
またボタン押下時に数値取るなど、どういった数値を取っているのかあらかじめ把握しておく。
pygrabberを使ってOpenCVで指定したカメラの映像を取得する

# opencv-pythonでのカメラの指定

PythonでOpenCVを使ってカメラをOpenする際、ノートPCにWebカメラをつないでいる場合など、複数のカメラが認識されていると、接続のたびに認識IDがずれるため、毎回同じindexでカメラを指定できない。

```python
cap0 = cv2.VideoCapture(0)
cap1 = cv2.VideoCapture(1)
```

# pygrabberを使ってみる

https://pypi.org/project/pygrabber/

インストールはpipで簡単に入る
```python
pip install pygrabber
```
pygrabberはDirectShow経由でカメラにアクセスし、デバイス名を取得することができる。

私の環境でノートパソコンにLogicool C920ウェブカメラを接続し、デバイス名を取得してみたところ、以下のような結果になった。

```
PS C:\Users\xxx\dev> python
Python 3.12.5 (main, Aug 14 2024, 04:23:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pygrabber.dshow_graph import FilterGraph
>>>
>>> graph = FilterGraph()
>>> print(graph.get_input_devices())
['FHD Camera', 'HD Pro Webcam C920']
```

この取得できる配列内の、目的のデバイス名のindexが、そのままOpenCVでのカメラのindexになるので、例えばC920ウェブカメラに接続したい場合は、

```python
cap = cv2.VideoCapture(1)
```

で取得できる

```python
camera_name = "HD Pro Webcam C920"

camera_opencv_index = FilterGraph().get_input_devices().index(camera_name)
cap = cv2.VideoCapture(camera_opencv_index)
```

のような感じにしておいてもいいかもしれない

# 最後に
pygrabberを使うことで指定したindexでカメラをopenすることができた。

試しに、同じwebcamを二台接続してみたところ、

```python
PS C:\Users\xxx\dev> python
Python 3.12.5 (main, Aug 14 2024, 04:23:18) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pygrabber.dshow_graph import FilterGraph
>>>
>>> graph = FilterGraph()
>>> print(graph.get_input_devices())
['FHD Camera', 'HD Pro Webcam C920', 'HD Pro Webcam C920']
```

となってしまった…
同じ製品を複数台使う場合は、この手法は使えないかもしれない。
(pywin32, WMIなどを使用して、カメラの詳細情報にアクセスできればもしかしたらできるかも…？)
WEBサイト・アプリ制作の上流工程をご紹介

## 目次

[1. はじめに](#1-はじめに)
[2. 作成するもの](#2-作成するもの)
[3. サイトマップ](#3-サイトマップ)
[4. ワイヤーフレーム](#4-ワイヤーフレーム)
[5. 要件定義書](#5-要件定義書)
[6. 利用するツール](#6-利用するツール)
[7. さいごに](#7-さいごに)
[8. 引用](#8-引用)

## 1. はじめに

Webサイト・アプリ制作に取り掛かる際、最初に上流工程と言われる作業をWebディレクター(場合によってはコンサルタント)が行います。

※現場によって呼ばれ方や役割は様々ですので、一概に上記の通りとは言えません。

その時、まず最初に取り掛かる作業は何か、どのように作業を進めていくかなどをご紹介します。

:::note info
この作業の前に、情報提供依頼、提案依頼、コンペ、ベンダー選定などの作業をする場合もありますが、ここではそういった作業は割愛し、技術的作業が開始される地点からご説明しようと思います。
:::

:::note info
これより先は「Webサイト・アプリ」どちらも便宜的に、Webサイトと呼びます
:::

### 一番大切なこと

最初に結論から。

WEBサイト制作の上流工程の作業を行うにあたって、一番意識すべき大切な要点をお伝えします。

それは **「現場のエンジニアがその内容を見て制作・コーディングできるか」** だと私は思います。

では実際にその内容とは何か、上流工程で作成する書類などについて言及していきます。

## 2. 作成するもの

これも現場によって呼ばれ方や、細分化の度合いは様々ですが、主に3つあります。

- **サイトマップ**
- **ワイヤーフレーム**
- **要件定義書**

です。

上記をそれぞれ簡単に説明していきます。

## 3. サイトマップ

サイトマップとは、サイト全体のページ構成を地図のように一覧で記載しているページのことです。

百聞は一見に如かずということで、サイトマップのサンプルの写真をお見せします。

![sitemap_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/e909eb2d-c6fa-edea-daee-57dc25b3b454.png)

このように、Webサイトの階層構造を視覚化したものがサイトマップです。

難易度でいうと3つの中では簡単な方ではあると思いますので、作成したいWebサイトと似たようなサイトを参考にしながら、サクッと仕上げてしまうことをお勧めします。

## 4. ワイヤーフレーム

ワイヤーフレームとは、Webサイトの目的に応じて「何を・どこに・どのように」配置するかを表現した設計図です。

百聞は一見に如かずということで、ワイヤーフレームのサンプルの写真をお見せします。

![wireFrame.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/ef8db7dc-3b66-30aa-b594-5056778912d4.jpeg)

ここで意識するべき大事なことは、サイトマップを見た後にワイヤーフレームを参照することで、よりWebサイトの構造への理解が深まるようにすることです。

サイトマップをよりWebサイトのように表現したものとでも言っておきましょう。

特に決まった型のようなものはなく、後に作成する要件定義書や設定項目の特定の部分を参照するエクセルのタブのリンクなどを貼っておくといった工夫も施していいでしょう。

現場によってはワイヤーフレームが作成し終わった段階で、一度デザイナーに業務を受け渡し、ワイヤーフレームを洗礼して要件定義書作成に取り掛かるといったことなどもあるでしょう。

## 5. 要件定義書

要件定義書とは、「ウェブサイトでこんなことを表現したい」「こんな業務ができるようにしたい」という事業主（非技術者）から制作会社等の技術者に対して求める要望（要求仕様）をまとめた文書です。

百聞は一見に如かずということで、要件定義書のサンプルの写真をお見せします。

![youkenteigi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/fffcb5a6-0665-350d-c8de-f91d298f6bf2.jpeg)

写真はほんの一部で、その他概要・業務要件・機能要件・非機能要件や業務フローなど突き詰めれば記載する内容は多岐に渡りますので、詳細は各自お調べすることを推奨いたします。

ただ、大切なことは上記のも述べたように「現場のエンジニアがその内容を見て制作・コーディングできるか」です。

自分が作成したサイトマップとワイヤーフレームに則って、完成したWebサイトの内部をイメージできるよう、より詳細な機能説明や設定項目などを記述すればプロジェクトは成功に限りなく近付くでしょう。

## 6. 利用するツール

これに関しては自分に合うものが一番だと思いますが、個人的に利用するべきだと思うツールをご紹介します。

- Figma
- ExcelまたはGoogleスプレッドシート
- 場合によってはGoogleドキュメント

私的には正直、上記3つのみの利用で上流工程は全て対応可能だと思っています。(自分がミニマリストっぽい性格なのもありますが)

## 7. さいごに

ここまでご精読いただき、ありがとうございました。

上記に述べた以外にもすべきことは沢山ありますし、0の状態から何をすればいいのか分からない方向けに記事を作成しましたので、各作業の詳細は各自お調べいただくことをお勧めいたします。

しかし、必要最低限この記事で述べた作業を完了すれば、間違いなくプロジェクトを大きく次の段階へ進めることができます。

## 8. 引用

- [見やすくて使いやすいサイトマップページのデザイン例をご紹介: Web幹事](https://web-kanji.com/posts/sitemap-design)

- [ワイヤーフレームの作り方完全ガイド【サンプル付き】: Web幹事](https://web-kanji.com/posts/making-wireframe)
【ひとりで】画像分類できるもん【yolov8】

# 画像分類するなら、ラクで精度が良いこれで
画像分類っていざするとなるとどのモデルでやればいいかわかんなくないですか？
そんなあなたにこれ。

### インストール

```shell
pip install ultralytics
```

### トレーニング

以下の形式でフォルダにデータを分けます。

```
cifar-10-/
|
|-- train/
|   |-- cat/
|   |   |-- 10008_cat.png
|   |   |-- 10009_cat.png
|   |   |-- ...
|   |
|   |-- person/
|   |   |-- 1000_person.png
|   |   |-- 1001_person.png
|   |   |-- ...
|
|-- val/
|   |-- cat/
|   |   |-- 20008_cat.png
|   |   |-- 20009_cat.png
|   |   |-- ...
|   |
|   |-- person/
|   |   |-- 2000_person.png
|   |   |-- 2001_person.png
|   |   |-- ...
```

あとは、これでok.

```python
from ultralytics import YOLO

# Load a model
model = YOLO("yolov8m-cls.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="my_dataset", epochs=100, imgsz=640)
```

データセットのパスを指定して実行するだけ。
runs/classify/train/weights/にbest.ptファイルが保存されます。

### 推論

```python
model = YOLO(best.pt)
results = model("image.jpg")
cls = results[0].probs.top1
label = results[0].names[cls]
```

![cat.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/80e08388-1ba2-a1d5-cc76-dc15c95963d3.jpeg)
> 0
> "cat"

![pexels-clarango-3866555.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/38aa3789-ca04-7cfd-4024-3556ead18ad6.jpeg)
>1
> "person"
Meta Quest 3 の VR 映像を Mac にミラーリングする方法

# はじめに
今回は、この Meta Quest 3 で VR の体験を共有するために、VR の映像を Mac にミラーリングする方法をお伝えします．
こちらが公式のリンクです．デバイス接続している人なら，公式サイトを見るだけでミラーリングは簡単にできると思います．

https://www.meta.com/ja-jp/help/quest/articles/in-vr-experiences/oculus-features/cast-with-quest/

### 必要なもの
- Meta Quest 3
- Mac

# 1.アカウント作成
Metaのサイトに飛びましょう．

https://www.meta.com/jp/quest/quest-3/?utm_source=gg&utm_medium=pla&utm_campaign=20579905194&utm_term&utm_content&utm_ad&utm_location=1009497&utm_location2&utm_placement&utm_device=c&utm_matchtype&utm_feed&utm_adposition&utm_product=899-00591-01

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/8b204e3f-e25e-1d61-96ea-4a5bb8b744c7.png)
人ボタンを押して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3748983/8c460848-dda5-6a42-3d75-babc49680f21.png)

でアカウントを作りましょう．



# 2.デバイス接続 

まず，Meta Quest 3 と Mac を同じ Wi-Fi ネットワークに接続します．
Mac のブラウザでミラーリング用ページにアクセス
します．

https://www.oculus.com/casting

# 3.ミラーリングを開始
Meta Quest 3 でカメラアプリを起動し、[ミラーリング]をクリックしてミラーリングを開始します。

すると、Mac で開いているミラーリング用ページにで Meta Quest 3 の画面が表示されます.



# おわりに
Meta Quest 3 の VR 映像を Mac にミラーリングする方法を記述しました．VRゴーグルをつけている人がどんなことをしているのか，気になりますよね？このように，簡単にミラーリングできるので，ぜひ試してみてください！！
それではみなさんよいエンジニアライフを〜👋
オフラインITカンファレンス初参加感想

今回初めてオフラインでカンファレンスに出席しました。参加したのは[XP祭り2024](https://xpjug.connpass.com/event/326033/)です。正直参加前は緊張していて、自分みたいななんちゃってエンジニアが...と不安でしたが、参加してみて以下のようなオフライン参加ならではのメリットを感じ、参加してよかったと思いました。
自分のように、カンファレンス出席に勇気が必要な方の後押しになれば幸いです。

## 自分の知識領域の狭さに気づける

### 知らない言葉がぽんぽんと出てくる
これはオンラインカンファレンスでも言えることですね。
知らない言葉を発する登壇者は当たり前のように話すので、知らないことに危機感を持てました。

### 自分の仕事領域とは別の領域の話がある

別領域の流行り廃りの話が聞けて、アンテナが広がるように感じました。

## 社外の方と話ができる

オフライン参加ならではのメリットでした。というか、社外のエンジニアとお話してみたいという目的もあってオフライン参加しました。
ただ、人見知りなので話しかけられるか不安でしたが、ありがたいことに向こうから話しかけていただけました。今後は、お昼休憩などに自分から話しかけられるようになりたいものです。

### 新鮮・いい刺激を受けられる
私はまだ社会人１年目なので、同じ会社の先輩との会話でも情報過多に感じます。
ただそれでも、働いている会社以外の方とのコミュニケーションは新鮮で、良い刺激になったと感じています。普段、キャリアの話やお互いの簡単な仕事内容などを、社外の方とゆっくり話す機会なんて殆ど無いですからね。

## 反省

### 質問したいことをリストアップしておくべきだった
TDDワークショップにも参加したのですが、無料でつよつよエンジニアから学べて質問もできる絶好の機会だったのに、出された課題のアルゴリズムを考えるので精一杯で、TDDについて1回しか質問できませんでした。ワークショップ参加時の「TDDを深く学ぶ」という目的を達成できずに悔しい思いをしました。
また、社外エンジニアと話す機会があったとき用の聞きたいこともまとめておくとよかったです。自分はその場でぱっと浮かんでこないタイプなので。

## 最後に

いずれ登壇する側になれたらアツいです。
ワークショップや講演で学んだことは後日Qiitaに投稿します。
RDK-X3 初期設定

rdx x3の初期設定の備忘録
自分メモ　※編集中

================

### OSインスールまでの手順は以下のページを参照
https://www.switch-science.com/blogs/magazine/d-robotics-rdk-x3?srsltid=AfmBOopvveGoiqO386agqcI7gMXE7UNT6izd9MZ_HphHXrl_2rYc6Oxo


![IMG_1749.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/937274/fa2468d7-9c33-9b0a-ee5a-88c0ec3ad633.jpeg)


![FullSizeRender.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/937274/b38bb2b2-5cbc-5867-9616-b7ac21ada915.jpeg)

イメージを焼いたあと起動すると自動ログインが設定されているため、ログインなしでデスクトップ画面に来ている状況。この問題を解決し、新しいユーザーを作成してそのユーザーでログインし、SSHとリモートデスクトップができるようにする手順は以下の通り。
### 自動ログインを無効化し、新しいユーザーを作成してSSHとリモートデスクトップができるようにする手順

#### 1. 自動ログインを無効化する

1-1. 以下のコマンドで自動ログイン設定ファイルを編集します。

```bash
sudo nano /etc/lightdm/lightdm.conf.d/22-hobot-autologin.conf
```

1-2. 設定ファイル内の以下の行をコメントアウトします。

```bash:/etc/lightdm/lightdm.conf.d/22-hobot-autologin.conf
[Seat:*]
#autologin-user=sunrise # コメントアウト
autologin-user-timeout=0
user-session=xfce
```

1-3. ファイルを保存し、システムを再起動します。

```bash
sudo reboot
```
これにより、自動ログインが無効になり、次回の起動時にユーザーを選択できるようになります。


#### 2. 設定変更

2-1.Sunrise HorizonというカスタムリポジトリからUbuntu 20.04用のパッケージをインストールする設定。

```bash
sudo nano /etc/apt/sources.list.d/sunrise.list 
```

```bash:/etc/apt/sources.list.d/sunrise.list 
deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://sunrise.horizon.cc/ubuntu-rdk/ focal main
```


2-2.Tsinghua大学のミラーネットワークを使用して、Ubuntu 20.04用の標準パッケージとセキュリティ、更新、バックポートパッケージを取得する設定。

```bash
sudo nano /etc/apt/sources.list
```

```bash:/etc/apt/sources.list
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
```




#### 3. 新しいユーザーの作成

3-1. 新しいユーザーを作成します。`new_username` は新しいユーザー名に置き換えてください。

```bash
sudo adduser new_username
```

3-2. 新しいユーザーを `sudo` グループに追加して、管理者権限を付与します。

```bash
sudo usermod -aG sudo new_username
```

3-3. 作成した新しいユーザーでログインできるか確認します。

#### 4. SSH を有効にする

4-1. SSHサーバーをインストールします。

```bash
sudo apt update
sudo apt install openssh-server
```

4-2. SSHサービスを起動し、システム起動時に自動起動するように設定します。

```bash
sudo systemctl start ssh
sudo systemctl enable ssh
```

4-3. SSHが正しく動作しているか確認します。

```bash
sudo systemctl status ssh
```

```bash
ifconfig
```
wlan0のipadressを控える


PC側でssh接続
```bash
ssh <ユーザー>@ipadress
```
propsの名前付けで発生したエラーと対処


# はじめに

この記事では、Button コンポーネントの props に付けた名前で発生したエラーの対処を紹介しています。

前回の引き続きです。前回の記事を読んだことを前提として書いていますので、よかったら前回の記事もご覧ください。

https://qiita.com/gtn74/items/34602f0b6aebc82d99ef

## エラー内容

前回、props として渡していた`ui`を`Ui`とキャメルケースに変更した際、下のようなエラーメッセージがブラウザに表示されました。

### エラーメッセージ

Warning: React does not recognize the `Ui`prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase`ui` instead. If you accidentally passed it from a parent component, remove it from the DOM element.

表示されたエラーメッセージを DeepL を使って日本語に翻訳した内容が下になります。

### 日本語に翻訳

React は DOM 要素の`Ui`prop を認識しません。意図的にカスタム属性として DOM に表示させたい場合は、代わりに小文字の`ui`としてください。誤って親コンポーネントから渡してしまった場合は、DOM 要素から削除してください。

### props を DOM に表示させたい場合？

どうやら 下の画像のように props として渡した要素は強制的に DOM に表示されてしまうようです。

![DOMの名前に大文字は使えない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337943/a60d4a86-de75-444b-cba4-98dd326aeccf.png)

DOM で要素名を表示させたい場合、大文字は使えないことから発生したエラーでした。

## 対策

対策を 2 つご紹介します。

1. props 名に、小文字、スネークケースを利用する
2. `DOM`から props を除外する

### props 名に、小文字、スネークケースを利用する

エラーが発生しない形に変更しましょう。DOM では、大文字が使えないので、名前を小文字に戻しましょう。

```diff_typescript
// props名を小文字で統一する
- <FooButton Ui={"primary"}>ui={"primary"}</FooButton>
+ <FooButton ui={"primary"}>ui={"primary"}</FooButton>

```

また、筆者がこの記事執筆中に試してみましたが、スネークケースでも、エラーは発生しませんでした。

```diff_typescript
// スネークケースを利用する
- <FooButton Ui={"primary"}>ui={"primary"}</FooButton>
+ <FooButton hoge_ui={"primary"}>ui={"primary"}</FooButton>

```

![props名をスネークケースに変更した.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337943/a4ddfeae-bd41-54fd-f28a-e0fa402aee47.png)

### `DOM`から props を除外する

続いて、props を DOM 上から除外する方法をご紹介いたします。

props の名前なんかでは、開発チーム内でキャメルケースや、パスカルケースを用いた命名で統一している場合もあることでしょう。

その場合、`shouldForwardProp`という props を使うことも一つの手段として有効です。

この props は、下のように使うことで、DOM から props を除外することができます。

```diff_typescript
// `shouldForwardProp`を利用してDOMからpropsを除外する方法
 const FooButton = styled(MuiButton)<FooType>`
-
    width: 200px;
    ...
  `;

 const FooButton = styled(MuiButton, {
+    shouldForwardProp: (prop) => prop !== "Ui",
  })<FooType>`
    width: 200px;
    ...
  `;

```

ブラウザで確認すると、これまで DOM に表示されていた、`ui="primary`が`button`から消えていることがわかります。

![shouldForwardPropを利用してDOMの管轄から除外させた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337943/36fef57c-7559-4a44-1cbe-7b136e6e7bef.png)

開発チームの命名ルールに沿って名前付けできるため、`shouldForwardProp`を使って DOM に props を表示させない方法が良いのではないかと考えています。

## 最後に

いかがだったでしょうか？

今回のエラーの対策は他にもあるんじゃないかと考えていますが、筆者が思いついた対策を書かせていただきました。

もしよろしければ、他のエラー解決方法について、コメントで教えていただけると幸いです。🙇‍♂️

※ 「敬体」と「常体」どちらの文章にしようか悩んでます 😇

## 参考

https://qiita.com/kzkapr1129/items/0358261652e5a0d18ebf#:~:text=%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%8A%E3%81%8F%E3%80%82-,shouldForwardProp%E3%81%A8%E3%81%AF%EF%BC%9F,%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%A9%9F%E8%83%BD%E3%81%AE%E3%81%93%E3%81%A8%E3%80%82

https://zenn.dev/nicopin/articles/35b00663f155ba

https://mui.com/system/styled/
更新を頑張ろうと思った話。

お疲れ様です。

久々の更新です。
今月、2～3社ほど書類選考があり、中には能力検査を受ける必要があり、しばらくcubic対策のために勉強をしておりました…！
ちなみにまだ書類選考は1社も通っておらず、能力検査を受けるも書類選考と並行しての審査だったため、不通過となっております。
<br>
…と、現状報告はここまでで、今日は @genimura様　の[こちらの記事](https://qiita.com/genimura/items/48ead1e64cb3211a789c)を読み、『誰かに言うって大事だなー』と再確認した上で、更新とか勉強頑張ろう！と思ったという話です。

固定概念になってしまいますが、Qiitaへの投稿は、プログラミングの勉強の進捗や、分かったことなどをコードと一緒に投稿するところ！と勝手に思っており、人に読んでいただくんだから、ちゃんとした記事じゃないとダメとか、投稿に対してのハードルが高くなっていきました。

が、genimura様の記事にあるように、投稿するハードルを下げることの大切さや、立派な記事じゃなくていい。自分が分かればいい。という箇所を見て、それもそうか！と思い、きちんと毎日やっていることを残すという使い方で投稿を続けようと思います。
あとは現職場の人に言うのも手なのですが、誰かに「ちゃんと毎日を目標に投稿します」と言ったり書いたりした方が、『やらないと！』と自分に言い聞かせやすくなるし、継続させやすくなると思いましたので、今回こういう内容の投稿としました:relaxed:

とりあえずはこの後、再び「1冊ですべて身につくJavaScript入門講座」の本を復習しつつ、集中力がきれた時にSPI対策で四字熟語書いたり、英単語暗記をして転職に向けて活動を続けていきます:fist:
【GoogleCloud 認定資格】Professional Machine Learning合格への勉強法（英単語集付き）

はじめに
---
英語の壁を乗り越え、Google Cloud Professional Machine Learning Engineer試験に合格することができました！本記事では、英語が苦手な私がどのように試験に臨み、合格を掴み取ったのか、その道のりを詳しくご紹介します。また、試験対策に役立つ英語単語集も用意しましたので、ぜひ参考にしてください。

受験のきっかけ
---
子供が受験を迎えて、一緒に勉強する雰囲気を作りたかったこともあり、クラウドの勉強を始めました。Google Cloud最後の試験となる本試験は、英語版のみの試験であり、決して英語が得意とは言えない私としては、かなり厳しい挑戦となりました。

学習方法
---
まず、他の試験と同様に試験ガイドを見て、どの様な試験範囲となるかを確認しました。次に、Google Cloud Skills Boostというトレーニングプログラムがあるので、それを受講（自分のペースでWebページを見ていく感じ）しました。
仕上げに、他の試験と同様、有料にはなりますが、Udemyの模擬試験を受講し、想定問題にて理解度を試しました。それなりの正答率になったので受験を行いましたが、2回Fail（不合格）となってしまいました。

再学習方法
---
正直なところ、Google Cloud Skills Boostについては、完全に仕上げるのはかなり時間がかかるため、主に講義部分だけを受講しており、実践部分は少ししか行っていませんでした。まずはこれを見直し、Skill Boostをできるだけ実習を含めて実施して、より具体的な理解を進めることを行いました。
また、8月に行われたGoogle Cloud Next Tokyo'24へ参加した際、相談コーナーの方に勉強方法について相談させていただき、英語で記述された書籍で勉強することを勧めていただきました。早速、「Official Google Cloud Certified Machine Learning & Engineer Study Guide」というKindleの書籍（英語・329ページ）を見つけて、それを購入して勉強しました。この書籍には問題集もついているので、それをGoogle翻訳を併用しつつ解いていき、そこで間違えた問題を中心に、理解が十分でない部分をインターネットの記事（Qiita等）で調べて理解していきました。

試験の感想
---
3回目の受験は徹底的に実習や勉強を行い、実践的な知識も身に着けたため、自信はありましたが、結果、合格することができました。
Google Cloud試験の場合、合否に関わらず得点が出ないため、余裕で合格したのか、ぎりぎりで合格したのかはわかりません。試験時間は、そこまでギリギリではなかったと思います。

まとめ（今後受験される方へ）
---
英語の試験であるため、できるだけ試験勉強自体を英語の教材で行う方が、かえって近道となるかもしれません。
また、他の試験同様、やはり模擬問題を解いてみて、その後でQiita等の記事を読んだり、Google Cloud Skills Boostで実践したりすると、頭に入ってくる度合がかなり上がります。

また、試験時間中は、できるだけ落ち着いて問題文を読み解くことをお勧めします。
一見難しく見える問題でも、自分の知っている知識の範囲で判断できるものや、文意から判断できる問題もありました。おそらく時間は十分あると思いますので、最後まであきらめずに、頑張ってください！

おまけ（覚えておくべき英単語）
---
英語が苦手でない方は不要かもしれませんが、一応私が覚えた英単語を掲載しますので、ご参考にしてください。

AI用語的な単語、熟語
|英語         |   日本語訳例      |
|:-----------:|:------------:|
|inference|推論|
|cardinality |基数|
|exploratory |探索的|
|explanation method |説明方法|
|interpret |解釈する|
|skew|歪曲、歪み|
|drifting|ドリフト|
|pre-emptive|先制的|
|annotated|注釈付き|
|forecasting|予測|
|mean|平均|
|median|中央値|
|mode|最頻値|
|state-of-the-art |最新|
|exploratory data analysis|探索的データ分析(EDA)|
|traceability|トレーサビリティ|
|reproducibility|再現性|
|explainability|説明可能性|
|high definition images|高解像度画像|
|Integrated Gradients|統合勾配|
|dynamic range quantization|ダイナミック レンジ量子化|
|reinforcement Learning|強化学習|
|converges|収束|
|coarsen|粗くする|
|oscillation |振動|
|sharded |断片化|
|covariate|共変量|
|perimeter|境界|
AWS Certified Solutions Architect - Associate エンジニアを目標としたアウトプット - 1

# 1. AWS SAAとは
AWSクラウドの知識・スキルがあることを証明できるASSOCIATEの資格です。
その中でSAAとはコストとパフォーマンスが最適化されたソリューションの設計に重点を置いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897831/9b16cf8b-727c-38b2-5f23-bc7f5761f428.png)
(参照URL: https://aws.amazon.com/jp/certification/#certifications)

### 本Qiitaでは各サービスの特徴を記していきます。

# 2. EC2とは
EC2とは簡単に言うと仮想サーバーです。各々がイメージしているサーバー室にある機械と役割は一緒です。
このEC2を使用することで物理サーバーと同様にアプリケーションの開発とデプロイを行うことができます。EC2ではこの仮想サーバーのことを**インスタンス**と呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3897831/0865075c-98ac-27b8-a650-36fa190300d8.png)
(AWS公式ドキュメント：https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)


### 2.1 サーバーとは
イメージとしては図書館です。
図書館で本を借りるようにサーバーに保存されたデータ(Webページ、動画、音楽など)を取得します。大きい図書館や検索機能に優れた図書館があるようにサーバーにも演算能力が優れていたり、保管能力が優れていたりと種類があります。本を借りる人(データを取得する人)を**クライアント**と呼びます。

### 2.2 EC2の利用シーン
・Webアプリケーションの開発/運用
　　WebサイトやWebアプリケーションのサーバーとして利用できます。
・開発環境
　　開発者のための開発環境として利用できます。
・テスト環境
　　ソフトウェアのテスト環境として利用できます。
・ビッグデータ処理
　　大量のデータを処理するアプリケーションの実行環境として利用できます。
  
### 2.3 EC2のメリット
・柔軟なスケーリング
　　使いたい量だけ使うことができます。状況によって減らす、増やすが迅速に行えることも大きな魅力です。
・多様なOS
　　Linux、Windowsなど、様々なOSのインスタンスを利用できます。
・多様なインスタンスタイプ
　　計算処理、メモリ、ストレージなど、用途に合わせて最適なインスタンスタイプを選択できます。
・高い可用性
　　設定によりますが違う地域のサーバーにコピー等を置くことで災害が起こった時でもデータの破損、サービスの停止を防ぐことができます。
・自動化
　　AWSの他のサービスと連携することで、インスタンスの管理を自動化できます。例えばサーバーの使用状況がひっ迫してきたときに、自動で拡張するなどです。

(AWS公式ドキュメント：https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)

### 3 EC2の高度な機能
試験によく出てくるAMIやキーペア、セキュリティグループなどがあります。
これを次回以降の記事で詳しく説明していきます。
・インスタンス
・Amazonマシンイメージ(AMI)
・インスタンスのタイプ
・Amazon EBS ボリューム
・新スタンスストアボリューム
・キーペア
・セキュリティグループ

## 4 最後に
今回初めての投稿です。アプトプットを通じて、自分の理解を深めたく、記事を作成しました。
拙い文章ですが、ここまで見ていただきありがとうございました。
Windows11にWSL2をインストールする方法およびwslコマンド実行NGになった話

# 本記事について
- 自分のメモ用＆学習記録用
- 手順を残しておかないと忘れるが、どうせ作るなら記事にしてしまおうという試み
- 基本的にインストール手順は一次情報（公式ドキュメント）に当たるのがよいが、以下の観点から技術ブログを参考にしながらインストールを進めるやり方をとっている
    - 全体像を押さえるため
    - 公式ドキュメントでは理解できない部分を補うため
- WSLの公式ドキュメントは[こちら](https://learn.microsoft.com/ja-jp/windows/wsl/)

# WSLとは
- Windows Subsystem for Linux
- Windows上でLinuxを動作させる仕組み
- 様々なLinuxディストリビューションをインストール可能※本記事ではubuntuをインストールする
- WSL1とWSL2の違いは[こちら](https://learn.microsoft.com/ja-jp/windows/wsl/compare-versions)

# WSL2利用の前提条件
- Windows1-バージョン2004以上 (ビルド 19041 以上)またはWindows11
- 上記はWindowsの設定＞システム＞バージョン情報をみるとわかる

# WSL2を構築した実行環境
- エディション：Windows 11 Home
- バージョン：23H2
- OSビルド：22631.4169

# インストール方法
## 必要な機能を有効化する
- スタートボタン押下＞設定＞アプリ＞オプション機能＞Windowsのその他の機能
- 以下のにチェックを入れる※画像の赤枠
  - [x] Linux用Windowsサブシステム
  - [x] 仮想マシンプラットフォーム

![WSL2有効化設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3112326/98987bc7-ec36-6f94-2505-eb90339ada41.png)

- 設定反映後、PCの再起動が必要になる

## PC再起動後、Powershellを管理者モードで開く
1. Ctrl+Rで「ファイル名を指定して実行」のダイアログを開く
2. ダイアログ内に「powershell」と入力
3. Ctrl+Shift+Enterを押すとPowerShellが管理者モードで起動する

※スタートメニュからPowerShellを起動して管理者モードで実行するよりも楽！

## WSL2をインストールする
- powershell(管理者モード）でコマンド実行

```powershell
PS C:\Windows\system32> wsl --install
```
- 上記コマンドでインストールされればよいが、私の場合、以下のエラーが出た

```powershell
PS C:\Windows\system32> wsl --install
wsl : 用語 'wsl' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません
。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してくだ
さい。
発生場所 行:1 文字:1
+ wsl --install
+ ~~~
    + CategoryInfo          : ObjectNotFound: (wsl:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException


Suggestion [3,General]: コマンド wsl は見つかりませんでしたが、現在の場所に存在します。Windows PowerShell は、既定で は、現在の場所からコマンドを読み込みません。このコマンドを信頼する場合は、".\wsl" と入力してください。詳細については 、"get-help about_Command_Precedence" と入力してヘルプを参照してください。
```

- 上記抜粋すると、「wslは存在する」、「コマンドが違う」という箇所があることわかる

```powershell
コマンド wsl は見つかりませんでしたが、現在の場所に存在します
```

```powershell
このコマンドを信頼する場合は、".\wsl" と入力してください。
```
- 1つめ：「C:\Windows\system32」配下にWSLが存在するか確かめる

```powershell
# 現在のディレクトリを確認
PS C:\Windows\system32> Get-Location

Path
----
C:\Windows\system32

# wsl.exeが存在するか確認
PS C:\Windows\system32> Get-ChildItem -Path C:\Windows\system32 -Filte wsl.exe


    ディレクトリ: C:\Windows\system32


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2024/06/13      4:29         200704 wsl.exe
```

- 「C:\Windows\system32」ディレクトリに「wsl.exe」は存在することがわかる
- 2つ目：「wsl」じゃなくて「.\wsl」で入力してみる

```powershell
PS C:\Windows\system32> .\wsl --install
インストール中: Ubuntu
（略）
Enter new UNIX username: #ユーザ名を入力
New password: # パスワードを入力
```
- 無事インストール開始。ubuntuがインストールされていることがわかる。
ユーザ名とパスワードの入力をお忘れなく
- 続いてWSLが起動しているか確認する

```powershell
PS C:\Windows\system32> .\wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
```

- Ubuntuが起動していることがわかる

## WSL2上のubuntuにログインする

```powershell
PS C:\Windows\system32> .\wsl
hogehoge@hoge:/mnt/c/Windows/system32$
```

以上。
Linuxでよく使うコマンドについて

Linuxでよく使うコマンドについてまとめました。

## cd
ディレクトリの移動に使用
### 使用例
```bash:カレントディレクトリから見たパスに移動
cd 相対パス
```
```bash:ルートディレクトリから見たパスに移動
cd 絶対パス
```
```bash:一つ上のディレクトリに移動
cd ..
```
```bash:ホームディレクトリに移動
cd 相対パス
```

## pwd
カレントディレクトリのパスを表示
### 使用例
```bash:pwd
pwd
```
## ls
指定したディレクトリの情報を表示
### 使い方
```bash:指定したパスのファイルやディレクトリを色付きで表示
ls --color=auto パス
```
```bash:指定したパスのファイルやディレクトリ（隠しファイルも含めて）詳細情報を付けて色付きで表示
ls -la --color=auto パス
```
```bash:更新日時順にソートして表示
ls -ltr --color=auto パス
```
## mkdir
### 使い方
```bash:ディレクトリ作成。
mkdir パス
```
```bash:ディレクトリ作成。存在しないディレクトリも含めて作成
mkdir -p パス
```
## rmdir
空ディレクトリしか削除できないものに注意。
### 使い方
```bash:ディレクトリ削除
rmdir パス
```
## cat
### 使い方
```bash:ファイルの中身出力、ファイルへの書き込み（リダイレクトを使用）
cat ファイル名 
```
```bash:ファイルの中身出力(パイプで使用)
cat ファイル名 | grep パターンなど
```
## less
大きいファイルでも問題ないので、ひとまずファイルの中身を見るときに使用
### 使い方 
```bash:ファイルを開く
less ファイル名
```
## tail
ファイルの末尾を出力
### 使い方
```bash:ファイルの末尾を出力
tail ファイル名
```
```bash:ログファイルの監視に使用（新しい出力があれば表示）
tail -F ファイル名
```
```bash:grepしながらログファイルの監視
tail -f application.log | grep --line-buffered "ERROR"
```
## touch
空ファイルの作成、ファイルの更新日時の変更
### 使い方
```bash:空ファイル作成
touch ファイル名
```
## rm
ファイル・ディレクトリの削除
### 使い方
```bash:ファイルを問答無用で削除
rm -f ファイル名
```
```bash:ファイル削除の前に確認がある
rm -i ファイル名
```
```bash:ディレクトリ以下のファイル・ディレクトリ等を削除
rm -rf ディレクトリ
```
## mv
パス名の変更
### 使い方
```bash:パス名の変更
mv 変更対象のパス 変更後のパス　
```
## cp
ファイル・ディレクトリのコピー
### 使い方
```bash:ファイル1を2にコピー
cp ファイル1 ファイル2
```
```bash:ディレクトリ1以下を2にコピー
cp -r ディレクトリ1 ディレクトリ2
```
## ln
別名をつける
### 使い方
```bash:シンボリック・リンクの作成
ln -s パス名 リンク先のパス名
```
## find
条件に合うフォルダを検索
```bash:拡張子がcsのファイルからasyncというキーワドを持つものを抽出
find ./ -name \*.cs type f | xargs grep async
```
xargsはfindとの組み合わせでよく使います。
xargsを用いて渡すことで、grepでマッチしたファイルそれぞれに対して処理をかけることができます。
## chmod
パーミッション（ファイル・ディレクトリのアクセス権）の変更
### 使い方
```bash:パーミッションの変更(owner:読み書き実行ok, group, others: 読み込みのみok)
chmod 644 パス名
```
## chown
ファイル等の所有者・所有グループの変更
### 使い方
```bash:ファイルの所有者をrootに変更
chown root ファイル名
```
## ps
プロセスの監視
### 使い方
```bash:プロセスの監視
ps
```
## kill
プロセスにシグナルを送信
### 使い方
```bash:プロセスを強制終了
kill -9 processID
```
Composeの副作用についての注意事項

# はじめに
今回は、自分がComposeで実装していて少し手間取った部分を紹介していきます
### 本文
Composeでは特定のタイミングで処理をするための副作用と呼ばれるものが存在します。
初回の描画時に処理をしたい場合はLaunchedEffectの引数に対してUnitを渡すことで実現することが可能です。
その時に気をつけたいのがSideEffectの扱いについてです。
SideEffectはLaunchedEffectと違いCoroutinScopeではないですが、Recompositionのたびに呼ばれるので意図せず処理が走ってしまうことがあります。
DisposableEffectと違いSideEffectとLaunched Effectは似た処理をやろうと思えばできてしまう分使用時にはどちらが適しているかと適切に判断しないといけません
### 最後に
今回はCompose実装時の副作用と呼ばれるものについての留意点を紹介しました
自戒の意味合いが強いですが、どなたかのお役に立てれば幸いです
[Python初心者] for文の「for n in ...」のnって何？

# はじめに
私がPythonを学び始めたころ、初めに詰まってしまったコードはfor文内の変数の理解でした。
例えば以下のようなコードを読んだとき、
```python
numbers = [1,2,3,]
for n in numbers:
    print(n)
```
for文内で処理される変数である`n`に対して、
「この『for n in ...』の『n』は何を指してるんや」と丸一日悩んでしまったのです。

この記事では、同じようなことで悩んでいる方に向けて、for文内の変数について解説していきます。

なお、この記事に間違っている部分やわかりにくい部分を見つけた方は、ご指摘いただけると嬉しいです。

## for文の基本構造

まず、Pythonの`for`文の基本的な構造を見ていきましょう。

```python
for 変数 in イテラブルオブジェクト:
    実行処理
```
`for`文の主な要素は以下の二つです。
- **変数**：ループ内で各要素を受け取るための一時的な変数名。これが先ほど触れた`n`になる部分。
- **イテラブルオブジェクト**：繰り返しを行う際、要素をひとつづつ取り出すことができるオブジェクト。通常、複数の要素によって構成されている。
- **実行処理**：各ループにおいて実行される処理

## `n`の役割とは？

では本題の`n`とは何かについてみていきましょう。先ほども少し触れましたが、`for n in ...`の`n`は、イテラブルオブジェクトから順番に取り出される各要素を受け取るための**変数**です。

各ループの初めにそのループで使用される要素がイテラブルオブジェクトから選択されます。その指定された要素をループ内で使用するために、変数`n`に要素の値を代入します。

例えば
以下のようにリスト`numbers`を用いたfor文があるとします。

```python
numbers = [1, 2, 3, 4, 5]

for n in numbers:
    print(n)
```

**解説：**

この時、リスト`numbers`の各要素が順番に`n`に代入されます。たとえば、最初のループ処理では、リスト内の１番目の要素である`１`が`n`の値として代入されます。
あまり正確な表現ではないですが、ループの初めに`n=number[0]`が隠れていると考えるとわかりやすいかもしれません。したがって、`print(n)`では`1`が出力されます。
 
同様に、二回目のループ処理では、リスト内の２番目の要素である`2`が代入されます。

**出力結果：**

```
1
2
3
4
5
```

### 文字列を使った例

```python
message = "Hello"

for char in message:
    print(char)
```

**解説：**
今回は、`char`が変数名として使用されています。
文字列`message`の各文字が順番に`char`に代入されます。
初めのループではに`message`の値である`Hello`の一番最初のアルファベット、`H`が`char`に代入され、続いて`e`、`l`と各ループにて対応する文字が変数に代入されていきます。

**出力結果：**

```
H
e
l
l
o
```


## まとめ

- `for n in ...`の`n`は、イテラブルオブジェクトの各要素を受け取るための**一時的な変数名**である
- 各ループの初めにイテラブルオブジェクト内の各要素を指定する中で、**指定された要素の値を`n`に代入する**
---
ssh接続でiterm2を使う

# 概要

今までwindowsを使っていたので「teraterm」や「rlogin」を使っていました。
macだとソフト自体無く、「teraterm」みたいに接続情報ごとに管理したいと思いました。
標準のターミナルだと、コマンドを管理するような機能がないので、調べてみると「iterm2」というソフトがそういった機能がありましたので、メモとして残します。
**※macをあまり知らないため、間違っている可能性があります。** 

https://iterm2.com/

## 説明
大部分は下記参照

https://webree.jp/article/ssh-terminal-iterm2/

↑この解説とは違うのは、コマンドにsshコマンドを指定しています。

```
ssh -F /Users/〇〇/Documents/config Host(管理名)
```

```bash:config
Host 管理名
HostName: サーバのアドレス
User: ユーザ名
Port: ポート番号
IdentityFile: 秘密鍵ファイルの場所
```

![test2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/0cba0035-a908-5e71-40e3-9d7b4cefbda7.jpeg)





ショートカット「cmd + O」を入力してProfilesを開くで登録したコマンドの一覧がでるので
選択して下部の「New Window」ボタンを指定する。
正しければ、接続されるようになります。
![test1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280639/e35f160f-1b2d-3881-d108-c844542f76c1.jpeg)

### 注意箇所
通常sshコマンドを叩く場合はWARNINGやエラーなどが出ますが、「New Window」からssh接続した場合は、
そういったものが、確か出なかったため若干躓きました。
原因は鍵ファイルのパーミションが誰でも読み取れるようになっていたので、接続できませんでした。
「WARNING: UNPROTECTED PRIVATE KEY FILE! 」

```
chmod 400 ~/〇〇.pem
```
400番に指定して自分だけ、読み取りだけにして無事接続されました。


## その他
iterm2の別の機能として、直接コマンドを指定するのではSSH-Integrationという設定もできるそうですが、
おそらく、新機能のようで、設定してもうまくいかず、よく分かりませんでした。
（ただ、コマンド直接指定する方法が、細かい挙動も制御できるしいいのかなと思います。)

https://gitlab.com/gnachman/iterm2/-/wikis/SSH-Integration
WiKi.jsのインストール手順

### はじめに

社内マニュアルが某MSDocアプリで書かれていて読む・書く・編集すべてに苦労しています。シンプルで見栄えもスッキリして使いやすそうなツールとしてWiKi.jsで代替を考えています。
公式ドキュメントに記載されているDockerを使ったインストール手順をまとめました。外部からも確認できるようここに記載します。

### WiKi.jsとは
![wikijs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/1eb52bdf-6a8e-5ee7-9a18-9caca8104882.png)
Node.js上で動作するオープンソースのWikiツールです

公式ページ



https://js.wiki/

公式Doc

https://docs.requarks.io

### 手順

https://docs.requarks.io/install/docker

パスワードやポートなどは公式Docのままなので、適宜修正してください。
DBも公式のままpostgresを使用します。

1. フォルダ作成
    
    ```bash
    mkdir wiki-js
    cd wiki-js
    ```
    
2. docker-compose.ymlを`wiki-js`フォルダに格納
    
    ```docker-compose.yml
    services:
      db:
        image: postgres:13-alpine
        environment:
          POSTGRES_DB: wiki
          POSTGRES_USER: wiki
          POSTGRES_PASSWORD: wikijsrocks
        volumes:
          - ./data/db:/var/lib/postgresql/data
      wiki:
        image: requarks/wiki:latest
        ports:
          - "3000:3000"
        environment:
          DB_TYPE: postgres
          DB_HOST: db
          DB_PORT: 5432
          DB_USER: wiki
          DB_PASS: wikijsrocks
          DB_NAME: wiki
        depends_on:
          - db
        volumes:
          - ./data/wiki:/wiki-data
    ```
    
    テストなので推奨されていないlatestをインストールします。


3. Docker Composeを使用してコンテナを起動
    
    ```bash
    docker compose up --build
    ```
    
4. [http://localhost:3000](http://localhost:3000/)にアクセス
5. ログイン・作業
    - 初回ログイン時にアカウント作成し、管理画面に移動して日本語を選択します。言語ごとに記事のディレクトリが変わるようです。
    ![スクリーンショット 2024-09-29 21.28.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/d94e45d0-8ea7-93fb-2803-282cdee777a8.png)


        ![スクリーンショット 2024-09-29 21.29.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/a3e74254-ae0e-3017-ba14-feec9e23ca72.png)
     - 記事を書いてみます。ここで記事のパスを記述して管理していくようです。
        ![スクリーンショット 2024-09-29 21.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610302/9528a1cc-2ac5-cdc9-c432-7018f3370b71.png)

6. コンテナの停止
    
    ```bash
    docker-compose down
    ```
### まとめ
簡単に立ち上げることができました。
ローカル環境で数人で使用する想定のためほとんどこのままで使えそうです。
認証方法もさまざま設定できるようですので、引き続き遊んでみます。

### 気づき
:::note info
アクセス時に記事ページ遷移しないようでhomeパスのブックマークをするなど工夫が必要です。
HTTPとは

:::note info
初学者用の内容です。
前提としてWebページを開く際の流れでの説明になります。
別途追記/修正する可能性があります。
:::

## HTTPとは

HTTP(Hypertext Transfer Protocol)

WEBページにアクセスする際、URLの頭についているhttp<br>
HTTPとは、プロトコルの一種で、クライアントとサーバーがやりとりする際にメッセージの内容や手順を定めたものです。
><b>プロトコル</b>
通信動作のルール
言語に置き換えると、日本語というプロトコルを使用して、相手が英語というプロトコルの処理しかできない場合、会話が成り立たない。このような事が通信で起きないようにルールが設定されている。

クライアント(自分)が、WEBページのサーバーから表示する際に必要な情報をリクエストしたりします。
そのリクエストメッセージの中には
"何を"　"どうして欲しいか"という情報が記載されています。<br>

## "何を"
URI(Uniform Resource Identifier)
WEBページを開きたい場合は、読み込みたいページのデータが入ったファイル名もしくはURLをURIとして設定できます。
つまり、URIとはアクセス先の総称。
このURIが何をに該当します。<br>

## "どうして欲しいか"
どうして欲しいかとはURIに対してどうして欲しいかということです。
それを伝えるためにメソッドを使用します。
メソッドには様々な種類がありますが、Webページの表示の際はURIで指定した情報を要求する為にGETメソッドを使用します。
会員制のWEBページの場合、IDやパスワードを入力した際はPOSTメソッドを使用し、WEBページのサーバーに入力情報を送信したりします。<br>

## "何を"　"どうして欲しいか"が決まったら
URIとメソッドが決まったら、ブラウザはそれを元にHTTPリクエストメッセージを作成します。
※Webページを開いて開発ツールを見るとリクエストメッセージの内容を確認できます。
メッセージリクエストを作成したら、メッセージリクエストをWebサーバーに送信し、WEBサーバーからのレスポンスを受け取ります。
レスポンスメッセージには通信が正常に終了したのかエラーが発生したのかを判断するステータスコードが含まれています。

<table>
  <caption>ステータスコード</caption>
  <thead>
    <tr>
      <th>コード値</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> 1xx </td> 
    <td>処理の経過状況</td>
  </tr>
  <tr>
    <td> 2xx </td> 
    <td>正常</td>
  </tr>
   <tr>
    <td> 3xx </td> 
    <td>別のアクションが必要</td>
  </tr>
   <tr>
    <td> 4xx </td> 
    <td>クライアント(自分)側のエラー</td>
  </tr>
   <tr>
    <td> 5xx </td> 
    <td>サーバー側のエラー</td>
  </tr>
</table>

ちなみに、一つのリクエストメッセージには複数URIを設定できないので、リクエストを送ったページに画像が含まれていた場合は画像を取得するよう再度通信を行います。<br>

このように、リクエストとレスポンスをブラウザとWEBサーバーで通信するために使用するプロトコルがHTTPです。<br>

以上、ざっくり説明してみました。
今度はもっと自分の言葉で説明できるようにまた何か書こうと思います。
練習問題で学ぶPython：bool演算子(and・or・not)編

今回はブール演算子(and・or・not)編です。

## 問題
次のコードを実行した結果を答えなさい
```python
price = 1200
is_hungry = True

if price <= 1000 and is_hungry:
    print("ここでご飯を食べます")
    
if price > 1000 or not is_hungry:
    print("今はガマン・・・・")

```
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

## 解説
```python
今はガマン・・・・
```

and, or, not を使用することで、
複雑な条件を表現できるようになります。

・and　→　「かつ」。左右が両方ともTrueの場合にTrueとなる
・or　→　「または」。左右がどちらかがTrueの場合にTrueとなる
・not　→　否定。続く条件の真偽を反転する

今回の場合、
1つ目のifは「False かつ　True」なので、False
2つ目のifは「True または　False」なので、True
となり、2つ目のifの中身のみ実行されます。



※実際には、これらの3つは「bool演算子」といい、条件以外にも使用できます。

https://docs.python.org/ja/3/library/stdtypes.html#boolean-operations-and-or-not

挙動がわかりづらいのですが、試験にはちょこちょこ出る（？）ので、
余力があれば押さえておきましょう。
（左側がFalsyな値かどうかで、右と左どちらを返すかが決まります）

参考：
https://zenn.dev/bugbearr/articles/69e1101ccc676a4b28b6

・and 左が偽なら左, そうでなければ右
（「かつ」→ どちらかが偽なら偽となるので、左が偽なら「左だけ」評価すればよい）
・or 左が真なら左, そうでなければ右
（「または」→ どちらかが真なら真となるので、左が真なら「左だけ」評価すればよい）


```python
print("andの実験")
print(1 and 2) #2
print(1 and 0) #0
print(0 and 2) #0

print("orの実験")
print(1 or 2) #1
print(1 or 0) #1
print(0 or 2) #2

```
練習問題で学ぶPython：辞書型のループ編

Pythonでは辞書型のデータに付いても、
ループを適用することができます。

いくつかバリエーションがあるので、
問題で学んでいきましょう。


### 問題
次のコードA,B,Cを実行した結果をそれぞれ答えなさい

A.
```python
marines = {"荻野":0, "藤原":1, "松川":2, "角中":3, "友杉":4}
for item in marines.values():
    print(item)
```
B.
```python
marines = {"荻野":0, "藤原":1, "松川":2, "角中":3, "友杉":4}
for item in marines.keys():
    print(item)
```

C.
```python
marines = {"荻野":0, "藤原":1, "松川":2, "角中":3, "友杉":4}
for key, item in marines.items():
    print(f"{key}:{item}")
```

<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

### 解説

A

```python
0
1
2
3
4
```
B.
```python
荻野
藤原
松川
角中
友杉
```
C.
```python
荻野:0
藤原:1
松川:2
角中:3
友杉:4
```

{}で定義されたリストは辞書型と呼ばれ、
データのラベル（キー）と値（バリュー）をセットで管理することができます。
（キーを指定することで、値の取得や更新をすることができる）

辞書型に対しても繰り返し処理を行う事ができ、
キーを扱うか、バリューを使用するかにより、
inの後ろの書き方が変わります。

 - 辞書型の変数.values()
     - 値のみをリストとして取り出す
 - 辞書型の変数.keys()
     - キーのみをリストとして取り出す
 - 辞書型の変数.items()
     - キーと値をリストとして取り出す
     - forの後ろに２つ変数を書き、１つ目にはキー、２つ目には値が格納されます