OmniAICreator/Qiita-1.07M huggingface dataset:
Next.js 14で導入された「Server Actions」について

こんばんは。

今日は「Next.js 14で導入された「Server Actions」について」について説明いたします。

Next.js 14で導入された「Server Actions」は、サーバーサイドでコードを直接実行するための非同期関数です。これにより、フォームの送信やデータの更新など、ユーザーの操作に応じてサーバーサイドの処理をシームレスに行うことが可能となります。

# 主な特徴

- サーバーサイド実行: Server Actionsはサーバー上で実行されるため、データの取得や更新をクライアントサイドで行う必要がなくなります。
- フォーム処理の簡素化: 従来はAPIルートを作成してフォームデータを処理していましたが、Server Actionsを使用することで、フォームのaction属性に直接関数を指定するだけで処理が可能です。
- セキュリティの向上: サーバーサイドでコードが実行されるため、クライアントサイドでの脆弱性を減らし、セキュリティを強化できます。

# 使用例

Server Actionsを使用してフォームデータを処理する例です。

## Actions登録ファイルを作成

まず、`app/actions.ts`または`app/actions/server.ts`というファイルを作成します。

typescript
Copy code

```javascript
// app/actions/server.ts
export async function handleSubmit(formData: FormData) {
  'use server';
  const name = formData.get('name');
  // 데이터베이스 저장 로직 등을 여기에 작성
  console.log(`Name received: ${name}`);
}
```

この例では、フォームのaction属性にhandleSubmit関数を指定し、フォームが送信されるとサーバーサイドで処理が実行されます。
## 作成したActions関数を利用

次に、既存のコンポーネントでこのServer Actionをインポートして使用します。

```javascript
// app/page.tsx
import { handleSubmit } from './actions/server';

export default function Page() {
  return (
    <form action={handleSubmit}>
      <input type="text" name="name" placeholder="Enter your name" />
      <button type="submit">Submit</button>
    </form>
  );
}
```

## 構造とメリット

- モジュール化: Server Actionsが別ファイルに分離されるため、再利用性と可読性が向上します。
- 安全性: 'use server'ディレクティブにより、クライアントサイドと分離してサーバー専用として実行されます。
- テストしやすい: Server Actionsが独立しているため、テストが簡単です。

## 注意点

- Server Actionsはexportで明示的にエクスポートする必要があります。他のファイルで利用するにはインポートしてください。
- `use server`は、`Server Action`内でのみ使用し、クライアントコンポーネントでは直接利用できません。

Server Actionsを活用することで、Next.jsアプリケーションの開発がより効率的かつセキュアになります。

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
2.環境構築


**2.環境構築**

Appiumを実装するにあたり何をインストールするのか、エラー時の対応方法をまとめます。

・目次

2.環境構築
　2.1.Windows版 android環境
　2.2.Windows版 ios環境
　2.3.Mac版 android環境
　2.4.Mac版 ios環境


<br>
<br>
<br>


2.1.Windows版 android環境
---

<br>
<br>
<br>

2.2.Windows版 ios環境
---

<br>
<br>
<br>

2.3.Mac版 android環境
---

https://qiita.com/BubbleBubble/items/c3f5afd798182c3eabea

<br>
<br>
<br>

2.4.Mac版 ios環境
---

<br>

https://qiita.com/BubbleBubble/items/dcab8d1b173e6ab0cf9a

<br>
<br>
<br>

以上！
[Python]勝利した男のテキストマイニング

# はじめに
Advent Calendar 2024　10日目だってさ。
もはやブログみたいなテンションになってきてしまいました。
アウトプットするたびに、知らないことが増えていくのが怖い。
知らないことを知るたびに知らないことが増えるってこれ無限ですよね。
まあ、そんなことは置いておいて、テキストマイニングしたいです。

# テキストマイニング
テキストを抜き取ってくれるらしい。

# コード
インプットファイルは、折角なので、Qiitaの規約のページからとってくることにします。
これが規約違反かは読んでない。(すまん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/2ae67435-bd82-9d30-e14b-4cc1c99b78bd.png)

これをインプットファイルに格納して、以下ファイルを実行すると、



```python
path="~/input.txt"
file="~/output.txt"
 
# ファイルを読み込む
with open(path, encoding='utf-8') as f:
    text = f.read()
 
import MeCab
from collections import defaultdict
 
# MeCabのTaggerを初期化
m = MeCab.Tagger()
node = m.parseToNode(text)
noun_counts = defaultdict(int)
 
# 名詞の出現回数をカウント
while node:
    if node.feature.startswith("名詞"):
        noun_counts[node.surface] += 1
    node = node.next
 
# 結果をファイルに書き込む
with open(file, 'w', encoding='utf-8') as f:
    for noun, count in noun_counts.items():
        f.write(f"{noun} {count}\n")
 
print(f"The noun counts have been written to {file}.")
```

アウトプットファイルの一部を紹介
```text
Qiita 25
Advent 2
Calendar 2
2024 5
トップ 1
ページ 2
search 1
記事 19
質問 2
検索 2
notifications 1
ユーザー 122
以下略
```

これを可視化するととても面白いと思う。

# 感想
Pythonの環境構築に2時間くらい、コードは調べながら、1時間くらいで書くことができた。
Pythonの良いところは、LLMや機械学習、データエンジニアリングができるところ見たい。
データサイエンティストを目指す自分にとっては、かなり良いと思った。
もう少し複雑なこともしてみたい。
【初心者向け】Next.jsで子コンポーネントから親コンポーネントにデータを渡す方法

## はじめに
子コンポーネントで取得したデータを親コンポーネントに渡す方法はいくつかありますが、今回はその中でも最も簡単な方法をご紹介します。

## 前提条件
Next.jsのプロジェクトが作成済みで、サーバーが正常に立ち上がっている状態であること。

## 目次
1. 全体の流れ
2. 実装


## 1. 全体の流れ
全体の流れとしては、親コンポーネントでuseStateを定義し、そのset関数を子コンポーネントに渡します。
子コンポーネントで取得したデータを渡されたset関数に引数として渡すことで、親コンポーネントの状態を更新します。
これにより、親コンポーネント側で子コンポーネントのデータを利用できるようになります。


## 2. 実装
今回はapp/page.tsxを親コンポーネントとします。
以下のように実装します。
親コンポーネントでuseStateを定義し、setData関数を子コンポーネントに渡します。

```typescript:app/page.tsx
'use client';

import { Children } from "@/components/Children";
import { useState } from "react";

export default function Home() {
  const [data, setData] = useState("test");

  return (
    <>
      <div>
        <Children setData={setData}/>
        <div>{data}</div>
      </div>
    </>
  );
}
```

次に子コンポーネントを作成します。
srcディレクトリ内にcomponentsディレクトリを作成し、その中にChildren.tsxを作成します。

```typescript:src/components/Children.tsx
import { useEffect } from "react";

type Props = {
  setData: (data: string) => void;
};
export const Children = (props: Props) => {
  useEffect(() => {
    const childrenData = "子からのデータ";
    props.setData(childrenData);
  }, []);

  return (
    <>
      <div>子コンポーネント</div>
    </>
  );
};
```

Childrenコンポーネントでは、受け取ったsetData関数にchildrenDataを引数として渡しています。
これで、子コンポーネントのデータが親コンポーネントで反映されるようになります。

## 終わりに
親コンポーネントから子コンポーネントへのデータの受け渡しは簡単ですが、子コンポーネントから親コンポーネントにデータを渡すにはどうすればいいのか疑問に感じる方も多いのではないでしょうか？
この方法を使えば、シンプルに実装できるので、ぜひ活用してみてください。
SnowflakeのHybrid TableをNode.jsから叩くまでの雑メモ

# 概要
- SnowflakeのHybrid Tableを外部のプログラムから叩きたくなった
- その雑メモ。だけどNodeではまだたたけていない
- Pythonで叩けた

# メモ

## Snowflake側でテーブルを作っておく

https://docs.snowflake.com/ja/user-guide/tables-hybrid-create


## DockerでNode.jsを用意する

割愛

## ドライバーをインストール

`tsx`も入れておいて、簡易検証できるようにしておく

```bash
$ yarn add snowflake-sdk
$ yarn add --dev tsx typescript
```

```bash
$ yarn tsx
> const snowflake = require('snowflake-sdk')
undefined
> snowflake
{
  ocspModes: {
    FAIL_CLOSED: 'FAIL_CLOSED',
    FAIL_OPEN: 'FAIL_OPEN',
    INSECURE: 'INSECURE'
  },
  createConnection: [Function: createConnection],
  createPool: [Function: createPool],
  deserializeConnection: [Function: deserializeConnection],
  serializeConnection: [Function: serializeConnection],
  configure: [Function: configure]
}
```

おｋ

## 接続してみる

だめでした！！！！！！

* ユーザーパスワード認証 + MFAやるとクソハマる
* ドキュメントの指定が結構揺れてる
    * あの記事はこう指定しているけど、こっちでは違う説明だったり
* 「わからん！！！」ってみんなの前で ~~勇気をもって~~ 発表したら、とあるイケてる分析会社のCTOから「秘密鍵がええよ」って教えてもらった


## DockerでPython環境を用意する

割愛


## 秘密鍵を作る

[こちらに習った](https://docs.snowflake.com/ja/user-guide/key-pair-auth)

```bash
$ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
$ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
$ mv rsa_key.p* /root/.ssh/
$ chmod 400 -R /root/.ssh/
```

snowflake側に公開鍵を登録する（`RSA_PUBLIC_KEY=...`のところを自分の環境に置き換える）

```bash
$ cat /root/.ssh/rsa_key.pub # コピー
```

```sql
ALTER USER jsmith SET RSA_PUBLIC_KEY='...';
```


## Pythonでやり直す

```bash
$ pip install snowflake-connector-python
```

```python
>>> import snowflake.connector
... import os
... from cryptography.hazmat.backends import default_backend
... from cryptography.hazmat.primitives.asymmetric import rsa
... from cryptography.hazmat.primitives.asymmetric import dsa
... from cryptography.hazmat.primitives import serialization

>>> with open('/root/.ssh/rsa_key.p8', 'rb') as key:
...      kk = key.read()
>>> p_key = serialization.load_pem_private_key(kk, password=None, backend=default_backend())
>>> pkb = p_key.private_bytes(encoding=serialization.Encoding.DER, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption())

>>> ctx = snowflake.connector.connect(user='user_name', account='xxx.ap-northeast-1.aws', private_key=pkb)
>>> cs = ctx.cursor()
>>> a = cs.execute('select 1')
>>> a.fetchall()
[(1,)]

# やったぜ！！！！

>>> a = cs.execute('use DS_DB;')
>>> a = cs.execute('use WAREHOUSE DS_WH;')
>>> a.fetchall()
[('ステートメントは正常に実行されました。',)]
>>> a = cs.execute('select * from icecream;')
>>> a.fetchall();
[(1, 'A1', 'B1'), (2, 'A2', 'B2'), (3, 'A3', 'B3'), (4, 'A4', 'B4')]
```

やったぜ！！！！（涙）

# 雑感

* コミュニティすばらしい
* あとでNode.jsで再チャレンジ

# 参考URL

https://docs.snowflake.com/ja/developer-guide/node-js/nodejs-driver

https://dev.classmethod.jp/articles/node-js-for-snowflake/
poetry add langchainのエラー対応

poetry add langchainを実行した際に以下のエラーが発生した場合の対処法
pythonのバージョンが範囲内なのにエラーでる。

```bash
The current project's supported Python range (>=3.11) is not compatible with some of the required packages Python requirement:
  - langchain requires Python <4.0,>=3.9, so it will not be satisfied for Python >=4.0

Because no versions of langchain match >0.3.7,<0.4.0
 and langchain (0.3.7) requires Python <4.0,>=3.9, langchain is forbidden.
So, because app depends on langchain (^0.3.7), version solving failed.
```



- pyproject.tomlに記載されているバージョンを変更する
```bash: pyproject.toml
python = ">=3.11,<4.0"
numpy = "1=,<2"
```

- pythonだけでなく、numpyなどのバージョンも変更する必要がある
- pythonだけ対応すると以下のエラーが発生してようやく原因がわかる。
```bash
Because no versions of langchain match >0.3.7,<0.4.0
 and langchain (0.3.7) depends on numpy (>=1,<2), langchain (>=0.3.7,<0.4.0) requires numpy (>=1,<2).
So, because app depends on both numpy (^2.1.3) and langchain (^0.3.7), version solving failed.
```

以上
11/22 日記 nncvが動かない2

# 11/22 日記 nncvが動かない2
nncvはコマンドとして認識されるようになった。

```
C:\Users\sinki>nvcc hello.cu
hello.cu
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include\crt/host_config.h(153): fatal error C1189: #error:  -- unsupported Microsoft Visual Studio version! Only the versions between 2017 and 2022 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.
```

このようなエラーが表示され、Visual Studioのバージョンがサポートされていないといわれた。

バージョンは2022でサポート範囲内だと思うので、「Visual Studio」、「NVIDIA ドライバ」、「NVIDIA CUDA ツールキット」、「NVIDIA cuDNN v8.9.7 のインストール手順」等のインストール順を参考ページ通りにもう一度試す。

参考にしているページ

https://www.kkaneko.jp/ai/win/mmpose.html

https://www.kkaneko.jp/tools/win/cuda.html#S01
[Python]はじめてのPythonでpip,Mecabインストールに勝利したい男②　環境設定編

#はじめに
Qiita Advent Calendar 9日目らしい。
もう環境設定できたらなんでもいいや。
では、本編どぞ

# 前回の続き
https://qiita.com/WeedMashroom/private/6e75b161bcb6048ff905

**MeCab**というライブラリのインポートに苦労。
なにをすればコマンドプロンプトからパイソンを実行できるかわからない。
調べていく。

# 環境変数から変えていく。

コマンドプロンプトを管理者権限で開いて、
環境変数を以下に変えていく。

```cmd
setx PATH "%PATH%;C:\Program Files\MeCab\bin"
```
結果、できた。

```
>mecab -v
mecab of 0.996
```

# 感想
初めて環境変数をいじった気がする。
コマンドプロンプトって意外といじるの大事だなと思った。
PythonにはVenVという仮想環境も存在すると聞いた。
それも勉強したいなと思いました。
「仕様が変わった、またですか？」問題を解決するための5つの対策案！

こんにちは！いつの間にか40を過ぎたIT関係を仕事にするおじさんです。  
「**仕様が変わった、またですか？**」とボヤいた回数なら誰にも負けませんよ。  
特に仕様変更が「**また来た！**」と続くプロジェクトでは、もはや何回目か分からなくなり、  
「**これじゃ、いつまでたっても終わらないよ〜**」と思うこともしばしば。  

そんなみなさんに、私なりに試してきた対策を**5つ**ご紹介します。  
どれも簡単に解決…とまではいきませんが、少しは「**またか！**」のストレスが減るかもしれませんよ〜。
## 対策1: 「仕様凍結日」を設ける

まずお勧めしたいのは、「**仕様凍結日**」という、プロジェクト中の仕様変更をストップする締切日を設定することです。  
「**仕様変更はこの日まで**」という期限を明確にして、みんなに宣言しましょう。  

たとえば、デザインや設計が始まる前の段階で「**ここから先はもう手をつけないよ**」という線引きを設けると、変更リクエストが続く無限ループから逃れやすくなります。

---

**ポイント:**  
「**仕様凍結日**」はただの締切日ではありません。スケジュール的に一度変更をブロックする意識をみんなに共有するためのものです。  

営業さんには「**この日以降はスケジュールの調整に影響が出ます！**」と強く伝えて、仕様凍結日の意義をみんなに浸透させましょう。  

「**いやいや、締め切り過ぎたってまた変わるでしょ？**」という声もあるかもしれませんが、実際のところこれだけでも**結構な抑止力**になります。

## 対策2: 初期段階で「最終確認」を何度も行う

プロジェクトの序盤に「**最終確認**」を徹底的に行うのも大事です。  
仕様書や要件定義の説明会、社内レビューなどを通して、変更が出やすそうな部分は先回りして確認し、「**これで本当に最後の変更ですか？**」と念を押すくらいが理想。  

何度も最終確認することで、「**あ、やっぱりこれも追加しよう**」という後付けの希望を防ぎやすくなります。

---

**ポイント:**  
確認時には、少し先回りして「**仕様をこう変えると、これくらいのコストと時間がかかりますけど大丈夫ですか？**」と聞くことで、無理な追加変更の抑制にもつながります。  

私も、「**最終確認なんて何度もして意味あるの？**」と思っていましたが、これがあるのとないのでは**仕様変更の頻度がまるで違います**。  
できるだけ事前に「**もうこれで進んでいいですね？**」と念を押しましょう。

## 対策3: 変更リクエストに「優先順位」を付ける

**仕様変更の要望**がどうしても発生する場合、リクエストに**優先順位を付けるルール**を設けると効果的です。  
「**この追加要件が本当に必要なのか？**」「**後回しにできる変更ではないのか？**」を毎回確認し、プロジェクト全体の影響度を測ってから変更するかどうかを決めると、途中での変更が必要最小限に抑えられます。

---

**ポイント:**  
ここで重要なのは、変更リクエストを以下のように**分類する**ことです：  
- **必要不可欠**  
- **できればやりたい**  
- **実施に余裕があれば**

営業さんやクライアントに「**追加できますか？**」と言われたときは、  
「**優先順位で高い部分だけを進めて、後は次回のアップデートで**」と柔軟に対応しましょう。  

私も初めはすべてのリクエストを飲んでしまっていましたが、今では「**これはまた後ででもいいですか？**」と伝える術も身につきました。

## 対策4: 変更の「影響度」を見える化する

続いてご紹介したいのが、**変更の影響度を見える化**することです。  
例えば、「**追加するならこの部分にも影響が出ますよ**」といった具合に、  
変更による影響範囲や追加工数を分かりやすく視覚化して示すのです。  
これは、関係者全員が「簡単に追加して」と言えなくなるため、**抑止力**としても効果があります。

---

**ポイント:**  
影響度を見える化するために、以下のツールや方法を活用すると良いでしょう：  
- **ガントチャート**  
- **ロードマップ**  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3064042/40064676-0de5-146b-d5c8-ac85b3dbc7af.png)

例えば、「**この変更を入れるとこっちのスケジュールが1週間遅れます**」と、  
分かりやすい**数値**で示すと、追加のリクエストも現実的なものに限定されます。

私も最初は「**いや、これくらいの変更ならすぐ対応できます！**」と思っていましたが、  
実際に見える化すると、驚くほどの手間とコストが掛かっていたんです。  
それ以来、この「**見える化**」は必ず行うようにしています。

## 対策5: 定期的に「仕様凍結」を見直す

最後にご紹介するのは、**「仕様凍結」を見直す**ことです。  
「これまで言ってきたことと矛盾してますよね〜」という声が聞こえてきそうですが、  
プロジェクトが進行する中で、**思わぬ外的要因やビジネスの状況変化**で、  
仕様変更がどうしても必要になる場合もあります。  

そのとき、柔軟に対応しつつも、やり直しや修正を最小限に抑えるため、  
**定期的に「今後の仕様変更は本当に必要か？」を見直していく**のです。

---

**ポイント:**  
- 仕様変更が不可避の場合も、**「この範囲であれば変更できるが、それを超える部分は次回に回す」**  
  といった具合に細かく調整します。  
- 例えば、「**2週間ごとに仕様見直しの時間を設ける**」と決め、クライアントにも了承を得ておくと、  
  途中で**大きな変更が入りづらく**なります。  

定期的に仕様凍結を見直して柔軟に対応することで、  
**「あのとき言ったことが覆される」なんてトラブル**が減りますよ。

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

**「仕様が変わった、またですか？」問題**は、どのプロジェクトでもつきものですが、  
これらの対策をうまく活用すると、**驚くほどスムーズに進むこともあります**。

プロジェクト管理というのは、どれだけ仕様変更の波に対応できるかが肝です。  
多少のブレも楽しむ余裕を持ちながら、  
**柔軟かつ効率的に進めていきましょう**。
Webについて自分なりにまとめる

## はじめに
- 前回のネットワークに引き続き、Webシステムの仕組みを自分なりにまとめてみます
- ご意見などがあれば何なりとどうぞ

前回↓

https://qiita.com/kiku09020/items/a5cb8b1904f2d509d620

### 参考サイト
https://qiita.com/gunso/items/94c1ce1e53c282bc8d2f

https://www.kenbunsya.jp/commusapu/marketing/5471/


### 参考書籍
[図解まるわかり ネットワークのしくみ](https://amzn.asia/d/57Ev8C1)



## Webの仕組み
### Web構成
- **Webブラウザ**：Webページを閲覧するためのソフトウェア
- **Webサーバ**：Webブラウザからのリクエストに返答するサーバ


### Webページ閲覧までの順序
1. WebブラウザがWebサーバアプリケーションにファイル転送リクエストをする
2. Webサーバアプリケーションがリクエストされたファイルをリプライとして送る
3. Webブラウザが受信したファイルを表示する

### Webアドレス(URL)
- **URL**：Webページを指定するためのもの

### URLの構成
```
https://qiita.com/kiku09020
```
- https：スキーム名
- qiita.com：ドメイン名
- kiku09020：パス名

<br>

- **スキーム**：Webサーバのデータにアクセスするためのプロトコル
    - http, httpsなど
- **ドメイン**：インターネット上のアドレス(住所)
    - .com, .co.jpなど
- パス：Webページの階層を表す





## HTTPリクエスト
- WebブラウザからWebサーバへのリクエスト
- 指定したデータを取得したりする

### 構成
- **リクエストライン**：Webサーバに対する処理命令
    - HTTPメソッドを利用して、データを取得したり送信したりする
- ヘッダ：リクエストの追加情報を指定する
    - Webブラウザの情報、Cookieの情報などが含まれる
- ボディ：リクエスト本体
    - POSTメソッドで送信されたデータなどが格納されたりする
    - GETメソッドなどの場合は空欄になる

### リクエストライン
```
GET /index.html HTTP/1.1
```

- メソッド：データの操作方法
- URI：リクエスト対象のアセットの場所を示す
- HTTPバージョン

### HTTPメソッド
- GET：データを取得する
- POST：データを送信する
- PUT：データを更新する
- DELETE：データを削除する
- HEAD：ヘッダー情報のみを取得する


## HTTPレスポンス
- HTTPリクエストに対する返答


### 構成
- ステータスライン：リクエストに対して、サーバがどのように処理したかの結果を示す
    - よく見る、`404 Not Found`もこれ由来
- ヘッダ
- ボディ

### ステータスライン
```
HTTP/1.1 200 OK
```

- HTTPバージョン
- **ステータスコード**：処理結果を示す値
- **ステータスメッセージ**：ステータスコードの補足説明





## Cookie
- Webブラウザにユーザー情報を保存する機能
- Webページのログイン情報などを保持することで、毎回ログインする手間を省ける

### 種類
- **ファーストパーティークッキー**：アクセスしたWebサイトから直接付与される情報
- **サードパーティークッキー**：別のWebサイトから間接的に付与される情報
    - Google広告などで、閲覧履歴をもとにオススメの広告を表示する機能
    - プライバシー面で指摘されている

### キャッシュとの違い
|  | Cookie | キャッシュ |
| --- | --- | --- |
| 保存情報 | ユーザー情報 | Webサイト上の情報 |
| メリット | ログイン時の再入力が不要 | データの読み込み時間の短縮 |

### HTTPリクエスト・レスポンス
- Cookieを有効にすると、HTTPレスポンスに含まれるCookie情報を保存するようになる
- リクエスト時にCookieを保存するようになる




## プロキシサーバ
- クライアントとWebサーバーの仲介サーバー
- 直接的にWebサーバーと接続しないことで、セキュリティ対策ができる
- 社内とかでクライアントPCの閲覧内容を把握することもできる




## Webアプリケーション
- Webアプリケーション：Webブラウザをインターフェースとしたアプリ
    - Java, Pythonなどの言語で開発される

- **アプリケーションサーバ (APサーバ)**：Webサーバを経由して、裏で処理を実行する用のサーバ
- **データベースサーバ (DBサーバ)**：Webサーバを経由して、データベースを保存する用のサーバ





## さいごに
ざっくりではありますが、Web開発などでの分野に活かせそうな知識を学ぶことができました。
直接的にWeb開発に携わらない方でも、ある程度把握しておいたほうが困らないかもです。

次回は、ネットワークのセキュリティ対策についてざっくりまとめようと思います。
TrailheadのPlaygroundでパッケージインストール方法


04t41000000bSXh　を入れて「インストール」をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ce4971a2-93f3-51d1-5743-5ada6c7117e1.png)

[インストール]クリック


この画面が出ればインストール完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9e80238d-9c59-3f44-0bd9-fd5baa7c3ea3.png)





この画像がでればすでにインストール済み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/127d87d4-f54d-08b9-7923-90c1ab36f715.png)
コードレビューとエビデンスの重要性

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942148/1eb0b3fc-d2d8-acdf-1410-f5f0f89308f6.png)
**はじめまして、フルスタックエンジニア兼ITコンサルのNaotoです。**

途中参画したプロジェクトでの「あるある課題」を共有したく、この記事を投稿しました。

> 共感できた方はぜひ「いいね」「フォロー」をお願いします！ 👍
> 今後の励みになります！

---

## 現場の課題：レビューの質が低下している現実

現場では「コードが読めない人がレビューしている」という状況がしばしば見受けられます。このような場合、レビューの質が低下し、以下のような問題が発生します。

- **不具合がリリース後に発覚**：修正に多大なコストがかかる。
- **プロジェクト全体の信頼性が低下**。
- **大規模な修正時に収拾がつかなくなる**。

コードレビューはプロジェクト成功の鍵を握る、品質保証の「最後の砦」です。
品質チェックにて多大な手戻りが発生します。

---

## 対策：テストエビデンスの確認で品質を担保する

コードが読めなくても、**テストエビデンスを確認する**ことで以下のように品質を保証できます。

- **ユニットテストや統合テストの結果を確認**。
- **テストケースが仕様を十分カバーしているか検証**。
- **ログやモニタリング設定の適切性を確認**。

これにより、レビューの質を大幅に向上させることが可能です。

---

## レビュワーの責任：最後の砦を守る自覚

レビュワーには以下の責任があります

1. **プロジェクトの「最後の砦」であることを自覚する**。
2. **不明点や懸念点を見逃さない**。
3. **品質向上への貢献を意識する**。

---

## レビュー提出者の役割：不安点を明確に伝える

提出者も品質担保において重要な役割を担っています。以下を意識しましょう。

- **不安に思う点や不明点を明確に伝える**。
- **必要なテストエビデンスをしっかり提示する**。

---

## 自動化ツールの活用で効率アップ

GitHub、GitLab、Subversionなどの**バージョン管理ツール**では以下が可能です。

- **ブランチ保護の設定**。
- **自動テストの導入**。

ツールの徹底活用は、レビューの効率と効果を劇的に向上させます。

---

## フルスタックエンジニアとしての提言

私自身、以下を意識して業務に取り組んでいます

- **常に最適解を追求し、提案と改善を怠らない**。
- **KPIを意識し、結果に繋げる行動を取る**。

レビューは面倒と思われがちですが、「品質を守る最後の砦」として重要な役割を担っています。全員が責任感を持つことで、プロジェクト全体の品質が向上します。

---
以上が私の経験談でしたが、いかがでしたでしょうか？
偉そうなことを記載しましたが、私も実際問題だと心と時間に余裕があるとき以外雑になりがちです。
なのでレビュー提出者には申し訳ないですが、口頭(対面)にてレビューさせてもらってますorz

最後まで読んでいただきありがとうございますmm
> こんな記事を書くとは、私もおじさんになったものですね・・・ 😉
[Python]はじめてのPythonでpip,Mecabインストールに苦しむ男①　環境設定編

# はじめに
Qiita Advent Calendar8日目
記事を書きすぎるとさすがにしんどくはなってくるし、書くこともなくなってくるため、新しいことに挑戦しないといけないとなっている今頃、公開予定後の私がこの記事を読んで何を思うのでしょうか。
未来の自分にしかわかりません。
当日も頑張って書いていると思います。
頑張れ。

# Pythonを触るきっかけ
テキストが200個×3行×文字列50文字くらいを分析しないといけなくなったため、
何か簡単な方法はないかなと考えた結果、Pythonを使用してみることにしました。
どうやら、Pythonではライブラリで自然言語処理を行うことができるらしい。
調べて実行しようと思いました。

# Pythonの環境設定
皆さんご存じPython
私は初めての挑戦ですが、さすがにいろいろな言語触ってるので、ある程度は書けるかと思いきや意外と落とし穴がたくさんありました。



###  とりあえず、インストールは以下記事を参考に実装
https://www.dxsolutionshub.com/2024/11/12/python%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%8b%e3%82%89jupyter-notebook%e3%81%a7%e3%81%ae%e5%ae%9f%e8%a1%8c%e3%81%be%e3%81%a7/

### MeCabをインポート

MeCabという日本語を形態素分析ができるライブラリの存在を知り、これを利用しようと考えた。
以下サイトからとってきた。

https://taku910.github.io/mecab/

言語はUTF-８に設定した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/6cb6b2db-bbf5-133a-36e0-dfa0d57a54aa.png)


# MeCabのインポートがうまくいかない

### 1.自分の環境のpythonライブラリをすべて表示してみる

以下を実行するも、

```terminal
    pip list
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/ba8355b5-74cf-88fe-45e7-f5ecd88e61fb.png)

### 2.pipのバージョンを行う。

そのままの英語の意味に従ってみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/c169c0ec-e454-a0ed-fef3-c92c397151dc.png)

```terminal
python.exe -m pip install --upgrade.pip
```

上記緑のコードを実行すると、pip のバージョンを上げることには成功した。

ちなみにバージョンの確認のためのコードは

```terminal
    pip --version
```
出力結果
```
　  pip　24.3.1

```
### 3.次はMeCabかな
どうやら、最新版に対応していないみたい？
```terminal
pip install mecab-python-windows
```

```terminal
ERROR: Could not find a version that satisfies the requirement mecab-python-windows (from versions: none) 
ERROR: No matching distribution found for mecab-python-windows
```

なので、以下コマンドを入力

```terminal
pip install mecab-python3
pip install unidic-lite
```


```terminal
Collecting mecab-python3
  Downloading mecab_python3-1.0.10-cp313-cp313-win_amd64.whl.metadata (6.3 kB)
Downloading mecab_python3-1.0.10-cp313-cp313-win_amd64.whl (503 kB)
Installing collected packages: mecab-python3
Successfully installed mecab-python3-1.0.10
```

### 4.いろいろやってみたけど、よくわからん。

mecab-python-windows を使ってPythonでMeCabをインストールした場合、コマンドラインから mecab -v を実行しても表示されないことがあります。これは、mecab-python-windows がPythonバインディングであり、コマンドラインツールとは別物だからです。



# 感想

むちかしい
Chrome拡張機能開発：CORSエラーの回避方法と実装例

# Chrome拡張機能でCORSエラーを回避する方法

## TL;DR（要約）
- 他サイトのHTTPステータスコード取得時にCORSエラーが発生
- Chrome拡張機能のバックグラウンドスクリプトを使用して解決
- 通常のウェブページでは不可能な方法だが、拡張機能では可能

## 背景
他サイトに飛んだ時のHTTPステータスコードを取得したかったのですが、CORSエラーで手が止まってしまいました。


## CORSとは
> あるオリジンで動いているWebアプリケーションに対して、別のオリジンのサーバーへのアクセスをオリジン間HTTPリクエストによって許可できる仕組み

### なぜCORSエラーが存在するか
>　XSS（クロスサイトスクリプティング）・・・ユーザーが Web サイトにアクセスすることで不正なスクリプトが Client (Web ブラウザ) で実行されてしまう脆弱性

>　CSRF（クロスサイトリクエストフォージェリ）・・・ユーザーが既にログインしている別のセッションを悪用して、ユーザーの意図しない操作を行わせる

CORSエラーの意図がわかり、このエラーを回避したところでセキュリティの懸念が出てしまうことがわかりました。

## 直面した問題
出てきたCORSエラーログは以下です。
URLは差し替えました。
```
Access to fetch at 'https://hogehoge.com' from origin 'https://hogehoge.jp' has been blocked by CORS policy No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
```
和訳：
```
'https://hogehoge.com'からのフェッチにアクセスしようとしたところ、'[https://hogehoge.jp](https://hogehoge.jp)'のオリジンからはCORSポリシーによってブロックされました。リクエストされたリソースには'Access-Control-Allow-Origin'ヘッダーが存在していません。もし不透明なレスポンスがあなたのニーズを満たすならば、リクエストのモードを'no-cors'に設定してCORSを無効にした状態でリソースをフェッチしてください。
```

### エラーが示す解決策
1. リクエストされたリソースに'Access-Control-Allow-Origin'ヘッダーをつける

2. もし不透明なレスポンスがあなたのニーズを満たすならば、リクエストのモードを'no-cors'に設定してCORSを無効にした状態でリソースをフェッチ
の二つです。

結論からいうとどちらもダメでした。
理由：1.'Access-Control-Allow-Origin'ヘッダーとは、リクエストを受けたウェブサーバーがクロスオリジンのリクエストに対し、どのオリジンからのアクセスからのアクセスを許可するか設定する所です。サーバーは他社のものなので、設定をいじることは出来ません。
理由：2. 'no-cors'モードでリクエストを行っても「不透明なレスポンス」が返ってきます。今回取得したHTTPステータスは読み取れません。それ以外にもヘッダー情報、レスポンスボディも読み取ることは出来ません。

## 最終的な解決方法
先輩にお聞きして、Chrome拡張機能はバックグラウンドスクリプトからfetchが可能なことがわかりました。

拡張機能は特別な権限をもち、通常のウェブページからよりも高いレベルのアクセス権をブラウザから与えられているそうです。

## 学んだこと
ChatGpt4Apiを使用して調べていましたが、Chrome拡張機能開発という前提条件が抜けていたため、欲しい情報に辿り着けませんでした。これからは、精度の高い情報が欲しい時には前提条件を細かく書いてみようと思います。

また、自社のサービスで別オリジンにfetchする機能がなかったか考えて、そのコードを見つけられるともう少し早かったかもしれないです。

## 参考資料
[なんとなく CORS がわかる...はもう終わりにする。](https://qiita.com/att55/items/2154a8aad8bf1409db2b)
[content_script.jsとbackground.jsの間でデータをやりとりする　【自作chome拡張機能】](https://tool-engineer.work/article94/)
NotebookLMを使って業務を効率的にしよう！

はじめに
---
　すでにご存じの方も多いかとは思いますが、Googleより提供されているNotebookLMを使ってみたところ、かなり実用的なRAGであり、業務にも実用レベルで使えるのではないかと思いましたため、ご紹介いたします。

NotebookLMとは
---
　NotebookLMとは、Google社より提供されている、Googleアカウントを持っていれば、今のところ無償で使うことができる GeminiベースのRAG環境です。
　ユーザーがアップロードしたドキュメントをGeminiが理解し、内容の要約やドキュメントの内容に関する問い合わせや整理ができ、情報整理、管理に非常に有用なものです。
　なんといっても裏にはGoogleが誇るLLM（Large Language Model）である、Geminiが控えているので、マルチモーダルでの入力、および強力な要約機能が使えます。

NotebookLMを使ってみよう！
---
まず、検索サイトで「NotebookLM」として検索するなどして、
https://notebooklm.google.com/
のサイトを表示します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/626414e3-630f-ffea-e0c5-4286daf9d23d.png" width=80%>

この際、もしGoogleアカウントにログインしていない場合は、新規作成するなどしてログインしてください。

この画面の「作成」ボタンを押すと、早速RAGの対象となるソース（PDFやウェブサイトURLなど）の入力ができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/ac1fe5c5-862e-47e4-ed23-d34d327eb660.png" width=80%>

このソースには、2024/11/17時点では、
・Googleドライブ（Googleドキュメント、Googleスライド）
・リンク（ウェブサイト、YouTube）
・テキスト（テキスト貼り付け）

を読み込むことができます。また、「ソースをアップロード」の所にPDFやテキスト文書をドラッグドロップすると、それらを取り込むこともできます。
サポートされているのは、拡張子が
　 pdf, txt, md, 3g2, 3gp, aac, aif, aifc, aiff, amr, au, avi cda, 
　 m4a, mid, mp3, mp4, mpeg, ogg, opus, ra, ram, snd, wav, wma
のものとなっています。
※今回は某デジタルカメラのマニュアル（PDF、294ページ）を読んでいます。

NotebookLMに入力した情報について質問する
---
　画面が下記のようになりますので、対象文書が選択されていることを確認の上、入力欄に問い合わせを入力します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/af8fb32f-a9bc-2f3f-c276-eab8ae4bfa59.png" width=80%>

今回の例では、「動画の撮影の方法を教えてください」としています。
すると、下記のように動画撮影の方法を示してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3822494/981e05b4-cb7e-2c21-6532-25c446cad5cd.png)

この他にも、様々な質問をしてみましたが、マニュアルに記載されている内容を的確に教えてくれました。

この他、YouTube動画をや音声ファイルを入力すると、その動画や音声に関する質問をすることができます。（著作権などの問題もあるかと思うので割愛します）

まとめ
---
　今回は簡単なPDFを使って、PDFに関する質問をしてみましたが、ページ数が多く、全部見るのはちょっと・・・と思うドキュメントを要約してくれるので、非常に便利になったと思います。結構仕事の作業効率向上に使えると思いますので、ぜひ使ってみてください！
 
なお、 現在はテスト期間ということで無償ですが、今後有償になる可能性はあります。（Googleさん、なんとか無償提供を続けてください！）
SlackのFilles.upload廃止に伴うPowerAutomateの移行方法

[files.upload](https://api.slack.com/methods/files.upload)メソッドが2025/5に廃止になると聞いて、移行方法をいろいろ探していた。
今までは、PowerAutomateDesktopを利用してファイルをOnedriveにアップロードし、それをPowerAutomateのHTTPリクエストを利用してSlackに送信していたわけなのだが（[参考](https://www.kwbtblog.com/entry/2019/08/29/004341)）、HTTPリクエストで送ろうとするとエラーが頻発する。
仕方がないので[こちらのサイト](https://zenn.dev/y_matsubara/articles/slack-post-file-202405)を参考に、Slackのヘルプリクエストにも助けてもらいながら、PowerAutomateDesktopを利用してなんとか実装することに成功した。
備忘録兼、同様に困っている人のためにメモとして残しておく。

PADでの方法がこちら。
1. アップロードしたいファイルの取得
2. ファイル・パスの取得
3. BotTokenを変数Tokenとして設定
4. チャンネルIDを変数Channelとして設定
5. 変数Command1に、以下のコマンドを設定
```
curl  https://slack.com/api/files.getUploadURLExternal -F token=%Token%  -F length=%Files[0].size% -F filename=%FileName%
```
6\. DOSコマンドの実行から、Command1を実行
7. 変数→JSONをカスタム・オブジェクトに変換を利用し、Command1のCommandOutputを分解
8. 変数Command2に、以下のコマンドを設定
```
curl  -XPOST %JsonAsCustomObject['upload_url']% --data-binary @%Files[0]%
```
9\. DOSコマンドの実行から、Command2を実行
10. 変数Command3に、以下のコマンドを設定
```
curl -X POST -H "Authorization: Bearer %Token%" -F "channel_id=%Channel%" -F "files=[{\"id\":\"%JsonAsCustomObject['file_id']%\", \"title\":\"%FileName%\"}]" -F "filename=@%Directory%\%FileName%" https://slack.com/api/files.completeUploadExternal
```
11\.DOSコマンドの実行から、Command3を実行

以上の方法でファイル送信に成功した。
![Slack_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942130/4b8f12a3-5082-9f0c-5181-5ea900808769.png)

注意点としては、DOSコマンド実行のため整形で折り曲げる際は\ではなく^を付けないと失敗することぐらいか。

以上、備忘録として書き残しておく。
テスト用のでかいDBを作成【ラージサイズ】

5GBのデータベースが数秒で作れます

```sql
CREATE TABLE IF NOT EXISTS large_text_table ( large_text LONGTEXT );
START TRANSACTION;
INSERT INTO large_text_table (large_text) VALUES (REPEAT('A', @@max_allowed_packet));
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
INSERT INTO large_text_table(large_text) SELECT large_text FROM large_text_table;
COMMIT;
```


削除

```sql
DROP TABLE large_text_table;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/3d0b1ac7-7d79-a272-7151-9863e960480b.png)
SwiftUIのチュートリアルのおすすめ進め方

# はじめに
Appleが出しているSwiftUIのチュートリアルは **数が多すぎて** 何からやればいいかわからないです。

参考：

https://zenn.dev/samekard_dev/articles/3aebb6d24fb460

この記事では、経験者・初心者別に、どのチュートリアルを進めていくのが良いのかをまとめました。

# ケース1：iOS開発の経験がある場合
Storyboardでの開発経験などがあると仮定します。

### 1. SwiftUI Tutorials

https://developer.apple.com/tutorials/swiftui

プログラミング初心者でもできるように丁寧に書かれていますが、CanvasでのPreviewの扱いや`@State`など特徴的な概念について、その使い方に着目して説明されています。
（アプリを作ったことがあれば、「これ、うれしい〜〜」となることでしょう。）

Chapter4ではUIKitとの統合の方法が書かれています。既存アプリにSwiftUIを導入していくためには良い勉強になると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/28fb5f3f-9f48-b915-1c36-1529a9789ffd.png)

### 2. Sample Apps Tutorials

https://developer.apple.com/tutorials/sample-apps

いくつかのアプリを作りながら特徴的な機能を学んでいくチュートリアルです。
「この行を書きましょう」みたいに進めていくわけではないので、`Project files`をダウンロードして読みながら進めていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/6e03a0ca-0595-3586-3201-0c2a81101073.png)

カメラや機械学習についてもまとめられていたりと、とても実用的です。

一旦これくらいで十分でしょう！アプリ作りましょう！

# ケース2：プログラミングが初めての場合

### 1. Develop in Swift Tutorials

https://developer.apple.com/tutorials/develop-in-swift

非常に優しく、Xcodeを初めて開くところから説明が始まります。まずはこれやりましょう。

とはいえ、**下の方の内容は初心者にとっては不必要**にも思えるので、SwiftUI Foundationsだけやればいいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/4c137af8-9459-45ed-510b-19c788bb0702.png)

（もしVisionProのアプリを作りたければ、その章をやるのも良いでしょう）

### 2. SwiftUI Tutorials

https://developer.apple.com/tutorials/swiftui

実際にアプリを1つ作り上げていくのでとても実践的な勉強になります。自分でアプリを作るときにもこれの構造を参考にするととても作りやすいです。

初心者ならば、最後の方のFramework Integrationはやらなくていいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/28fb5f3f-9f48-b915-1c36-1529a9789ffd.png)

# ケース3：SwiftUIも使ったことがある場合

SwiftUIやったことあるけど学び直したい！という稀有な方向け。

### 1. SwiftUI Concepts Tutorials

https://developer.apple.com/tutorials/swiftui-concepts

1行1行、SwiftUIで何をやりたいのかを解説する読み物チュートリアルです。本当に詳細にまとめられてるので勉強になります。

まずはこれを読んで、今までの知識を整理しましょう。

### 2. Sample Apps Tutorials

https://developer.apple.com/tutorials/sample-apps

いくつかのアプリを作りながら特徴的な機能を学んでいくチュートリアルです。

いくつかの機能は使ったことがあるかもしれないので、それは飛ばしていきましょう。

### 3. App Dev Tutorials

https://developer.apple.com/tutorials/app-dev-training

SwiftUI、UIKit、macOSと、全てを網羅しています。
ここまで進められるくらいやる気に満ちたあなたなら最後まで成し遂げられるでしょう！（やったことあるところは飛ばしていいと思います）

# まとめ
なんと他にもチュートリアルはありますが、いったんこの辺をやれば十分です。
皆さんの学びが豊かになることを祈っています！
技育展で決勝に進んで得られること

# はじめに

今年11/10に、技育展というピッチコンテストの決勝に出場してきました。

すごい体験ができたなと思うのでまとめていきます！

![241110-650.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/a07bf3ba-ad10-d4a6-54ec-c808124ecd7d.jpeg)

# 技育展とは

https://talent.supporterz.jp/geekten/2024/

### 技育プロジェクトとは

株式会社サポーターズが主催する、未来のエンジニアを育成するためのキャリア支援プログラムです。2020年に開始され、学年不問で学生エンジニアを対象とし、インプットとアウトプットを繰り返すことで「自ら考え、自ら創る」力を育むことを目指しています。

https://talent.supporterz.jp/geekpjt/

### 技育展とは

技育展は、技育プロジェクトで行われているピッチコンテストです。

一番の目玉は、**優勝賞金100万円** であるということ！そんなん出るしかない！！！！

### スポンサーも豪華

また、スポンサーも非常に豪華です。プラチナスポンサーは以下のようになっています。

- GMOインターネットグループ
- 株式会社CARTA HOLDINGS
- 株式会社サイバーエージェント
- 株式会社ゆめみ
- 株式会社ディー・エヌ・エー
- ウイングアーク1st株式会社

### 審査員も豪華

そして、審査員も非常に豪華です。

- 鈴木 健太（株式会社CARTA HOLDINGS 執行役員CTO）
- 成瀬 允宣（GMOインターネットグループ デベロッパーエキスパート）
- 中村 智武（株式会社サイバーエージェント CTO統括室、株式会社CyberZ CTO）
- 橋田 哲尚（ウィングアーク１ｓｔ株式会社 Data Empowerment事業部 技術戦略統括 DE開発統括部 統括部長）
- 岩田 真平（株式会社ディー・エヌ・エー ヒューマンリソース本部）
- 酒尾 快都（株式会社ゆめみ 象徴社長）
- 小賀 昌法（株式会社LayerX 部門執行役員 バクラクVPoE）
- 吉野 純平（株式会社MIXI 執行役員 CTO 開発本部長）
- 柴田 健一（フューチャー株式会社（フューチャーアーキテクト株式会社） フューチャーアーキテクト株式会社シニアパートナー）
- 岡本 邦宏（パーソルキャリア株式会社 CTO兼エンジニアリング統括部エグゼクティブマネージャー）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/201f9fbd-0c08-def9-e789-21d7b57f1de7.png)

はじめに皆さんが壇上にあがられてたんですが、CTOが多すぎてビビり散らかしてました。

このような方々からフィードバックをもらえるため、**決勝に進むこと自体に価値がある** とはっきりと言えます。

# 技育展決勝までの流れ

さて、そんな技育展ですが、決勝までには何ステップかあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/4700975a-5849-716e-6659-d1f08ddd9fb3.png)

画像：https://talent.supporterz.jp/geekten/2024/

応募総数から考えると、予選1回戦はほとんどが通過しますが、2回戦は **120チームくらいが36チームまで絞られる** ため、倍率は3~4倍になります。第1回戦免除の猛者も2回戦から参加するため、**2回戦の時点で非常にレベルが高かった** と記憶しています。

# 技育展決勝の様子

**あまりにレベルが高かった。** 今まで見てきた大会で一番レベルが高かったです。

### 優勝チームの作品

**PhotoBot** という、運転中に「いい」景色を自動撮影するアプリです。ローカルで動作するAIにより、障害物などを検知して良いタイミングで写真を撮ることができます。

![広報画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/cc709f8f-4807-4820-7893-7d45375f6ce3.png)

ここまでレベルの高いAIを搭載できるのが素晴らしいなと思いました。すげぇ。

# 技育展で得られるもの

さて、私は技育展で100万円を取り逃したわけですが、それ以上に得られたものが多かったのでここで紹介させていただきます。

### すごい人たちからの沢山のフィードバック

上にもあげた審査員の方々や、他にもスポンサーの方々から詳細なレビューを書いていただきました。**なんと文字数9490文字！！**

自分のプロダクトに対してこれだけのレビューをもらえる場というのはまずないので、こういった場所に積極的に出ることの大事さを改めて感じました。

### 懇親会でいろんな人と話せる

技育プロジェクトの目標の一つに「縦横のつながりを作る」と言うものがあります。今回は間違い無くそれを果たせたなと感じています。

大会後の懇親会では、他の決勝進出者やスポンサー企業の方々とたくさん話すことができ、就活やインターンの話などをたくさんさせていただきました。インターンさせてくれないですか！！みたいな話がたくさんできたのは本当に価値があったなと思っています。

（余談ですが、技育展決勝進出者限定の26卒選考会も開かれており、それらのチャンスを得た、というだけでも大きな価値があったなと思いました。）

# 技育展決勝に進むためには

受賞はできませんでしたが、決勝に進むために大事だと感じたことをまとめます。

### プレゼンにこだわろう

**1回戦は1分、2回戦は2分の発表時間しかありません。** なので決勝に進むためにはその限られた時間で自分のプロダクトの価値を最大限紹介しなければなりません。
実際にちゃんと作り込まれていて動いていること、課題解決をしていること、新規性があること、などなど、端的に効果的にまとめましょう。

### サイトに載せる情報にこだわろう

作品提出時に、作品紹介文章なども一緒に提出することになります。ここに自由に色々書けるので、サムネ画像だったりPR動画だったり、多くの情報を載せることをお勧めします。

### たくさん出そう

技育展は1人（1チーム）1作品までですが、チームを組めば複数出せます。**複数出したほうが絶対に得です！！**

たくさん出してたくさん発表しましょう！

# まとめ

次こそ勝つ！！という気概に溢れています！

このような素晴らしい大会があること、そしてそれに参加できたことがとても嬉しかったです。ぜひまた来年会いましょう！
Azure DNS セキュリティ ポリシー

Azure DNS セキュリティ ポリシーがパブリックプレビューとなっています。この機能を利用することで Azure provided DNS の名前解決のログを取得したり、名前解決要求を拒否したりすることができます。
実際に動作を確認した内容をまとめておりますのでご利用の際はご一読いただけたら幸いです。

https://learn.microsoft.com/ja-jp/azure/dns/dns-security-policy

## 利用シナリオ

- Azure provided DNS (168.63.129.16) の名前解決のログを取得したい
- Azure Private DNS zones の名前解決のログを取得したい
- DNS Private Resolver の名前解決のログを取得したい
- 特定の FQDN のみ許可したい
- 悪意のある名前解決を拒否、またはアラートを上げたい

## 制限事項

- DNS セキュリティポリシーと VNet は 1:N の関係。1 つの VNet には 1 つのポリシーだけしかリンクできない。
- DNS セキュリティポリシーと VNet は同じリージョン内でのみ利用可能

## 設定・動作確認
詳細はこちらを参照

https://learn.microsoft.com/ja-jp/azure/dns/dns-traffic-log-how-to?tabs=sign-portal

### ログの有効化
ログを取得したい仮想ネットワークを Virtual Network Links から追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/90ae5d5f-9a83-a84f-f1f6-51b14e41b7c4.png)

診断ログを有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/337c780f-b838-33df-251f-f2f7bba3e0d4.png)

関連付けた仮想ネットワーク上の VM にて名前解決をするとログが出るようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/b8f04e8e-3249-aeda-ab81-58b0d416d0f3.png)


### 名前解決の拒否

Domain List を作成し、BLOB ストレージの FQDN を入れておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/24559bc5-3f58-8af5-d179-6b4bbef09926.png)

Traffic rule を作成する際に、上記の Domain List を選択して、Action を Block にしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/97cf2eef-81d8-0a10-0133-d0ccb62d1eeb.png)

実際に名前解決をするとSERVFAIL で拒否されるようになりました。
```
$ nslookup bloghiyadnstest01.blob.core.windows.net
;; Got SERVFAIL reply from 127.0.0.53
Server:127.0.0.53
Address:127.0.0.53#53

** server can't find bloghiyadnstest01.blob.core.windows.net: SERVFAIL

hiyama@vm-lin-dnstest01:~$ 
```

ログを見ると対象のリクエストは拒否されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/69595938-ce19-fbad-ff7b-a928a4bb6f53.png)

### 様々なパターンでの動作検証
以下の 4 パターンにてそれぞれログが記録されるかを検証してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/beb441e5-1adb-0ab4-b11d-7d600fb043bf.png)

結果としては以下となりました。
4 番でログが記録されたのが少し意外でしたが内部的には受信エンドポイントと同じような経路になっているのかなと妄想しました。

|番号| パターン | 結果 |
|-|-|-|
|1|Azure Provided DNS を利用| 〇 |
|2|Azure Private DNS zones を利用| 〇 |
|3|Private Resolver 受信エンドポイントを利用| 〇 |
|4|Private Resolver 送信エンドポイント&転送ルール&外部向けのフォワーダー| 〇 |
|5|カスタム DNS と外部 DNS へのフォワーダー| × |

また、ログの出力がほぼ一緒で、どの経路を通っているかの判別が難しかったのですが、4 のパターンだけは ResolutionPath が PrivateResolverResolution となることを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/5060b74a-2d23-7b39-fca2-2cda7b8622b9.png)

### 検証して気づいたこと
特にアプリも起動させていない Azuzre VM (ubuntu) 1 台の 1 時間のログの量は約 430 レコードとなっていました。大規模環境ではアプリや台数によってさらに倍増するためログが肥大化する可能性があります。また、不測の事態でログおよび課金が増大する可能性もありますので、通常の Usage をふまえたうえで Log Analytics に日次上限を設定しておくとよいかもしれません。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/daily-cap
[Unity][RoboCup] CrossView開発日記 #6

# CrossViewとは
こちらの記事をご覧ください。

https://qiita.com/suzuki_nene/items/cbdb701622a738f1b2ee

# はじめに
サッカーのプレーヤーとしての3Dモデルは、左右のチームごとに異なるものを使用しますが、ユーザーがキャラクタを選択肢の中から選べるようにしたかったので、Settings画面を設けることにしました。

# Football_6
今回のテストプログラムでは、以下の項目を実装しました。
- Settings画面の仮実装
	- 画面下部にある左右ボタンでキャラクタを切り替え。
	- 画面左上のBackボタンでキャラクタを選択してメイン画面に戻る、という使い方を想定。

3種類のキャラクタペアが横に並んだ状態から、左右ボタンの押下で、カメラを左右に移動させるだけです。

Backボタン押下時に、現在表示されているキャラクタペアを、インスタンス生成時に用いるPrefabとして内部で変数に設定する、という感じで考えました。

キャラクタペア #1
![Football_6_PlayerType_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/9f09eed2-d57b-5a22-6c74-226332768981.png)

キャラクタペア #2
![Football_6_PlayerType_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/179827eb-1880-3667-ae5f-51739bd72b66.png)

キャラクタペア #3
![Football_6_PlayerType_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/cd86540a-7503-12aa-293b-d21ca713767e.png)

## 背景
背景には、次のアセットを活用しました。

https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-simple-nature-pack-162153

## 実際のSettings画面
CrossViewの開発プロジェクトでは、サッカーフィールドのはるか上空にSettings画面を配置する形をとりました。

これは、サッカーのログ再生時に、Settings画面がカメラに映りこまないようにしたかったからです。

![CrossView_Settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/843818/88f91f79-9f93-6213-0fac-d151d532ccb6.png)

シーンを分ける程でもないなと思ったので、こんな形になっちゃいました。


以上です。
RIZAPのバックエンドインターンに参加してきました

# はじめに
2024年の11/18~11/20にRIZAPでRuby on Railsのインターンに参加してきたのでまとめます！

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

# RIZAPのインターン、なにをやるの？

友人に「RIZAPにインターンに行くんだよね」と言ったところ **「筋トレのインターンでもするのか」** と言われたのですが全くそんなことはなく。

前提として、chocoZAPのアプリ制作やWebサイト制作を司っているのは **RIZAP テクノロジーズ** という会社になります。2022年に設立し、開発も自社で行うようになったとのことです。

https://www.rizap-tech.co.jp/

https://www.rizap-tech.co.jp/service

そんな出来立てほやほやのRIZAP テクノロジーズ、ちゃんと技術スタックもマッチョで、Web制作では **フロントエンドにVue.js、バックエンドにRuby on Rails** を用いています。

今回参加したインターンはバックエンドのインターンだったため、ゴリゴリにRailsを学び、API作成を行いました。

募集サイトにも書かれている内容から引用すると、

- chocoZAP店舗見学
- チーム開発によるAPI作成
- 成果発表
- 現場社員による業務紹介
- 社員との懇親会

が3日間で用意されており、**dockerを用いた環境構築** からスタートしてのチーム開発という実務そっくりなプログラムのほか、社員の方々との懇親会もあり、企業のことについて本当にいろいろな質問をさせていただきました。

# 参加してみての感想

### 指導がとても丁寧

そもそもRIZAPテクノロジーズには **1000時間プログラム** という内定者研修があり、そこで **コード1行1行まで徹底的に理解する** ということをやってらっしゃるそうなのですが、例に漏れずインターンでも、メンターさんが **1行1行** 説明をしてくれました。

エラーで困った時に駆けつけてくれるのはもちろん、困ってなくても説明をしてくださるおかげでメキメキ知識がついていきました。

https://paiza.jp/student/job_offers/25112?t

また、チーム開発ではコミュニケーションが大事になりますが、チームで仲良くなれるような取り組みがいくつもあったり、メンターさんが積極的にコミュニケーションを取ってくれたりと、すぐチームに溶け込めたのがとてもやりやすかったです。

### 懇親会が豪華

上述の通り、社員の方々との懇親会が用意されているのですが、様々な業種のエンジニアさんや、**すごく偉い方** が来てくださって、全体で1時間以上話させていただきました。

業種やキャリアビジョン、インプットとアウトプットの方法だったり、学生のうちにやっておくべきこと、この会社がどんな会社なのか、のような質問をいくつもさせていただけたため、**すごく学びが多く自信になったし、会社の理解につながりました** 。この懇親会だけでも非常に大きな価値があります。

### 会社が綺麗

最後に言いたいのは、本当に会社が綺麗。入り口がこれで、間違って高級ジムの方に来てしまったのかと思わされるほど。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/0226fde3-8a38-6f18-22a0-d3ed19289b47.png)

引用：

https://www.workhub.site/interview/rizap

また、ビル36Fからしか得られない眺望を見られて、あぁめっちゃこういうオシャレなところで働きてーーとなりました。ちょろいので。

![IMG_8695.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/40185c9c-b6a4-eab1-b6d5-589af4744d44.jpeg)

# まとめ

RIZAPは最近、様々なカンファレンスにも出ているなど、技術の方面にとても力を入れてらっしゃる会社です。それゆえインターンに参加する価値はとても大きいです。
個人的にはこれだけ認知度が高く、会社が興ってから日が浅い会社というのも珍しいのではないか、と思っています。

フロントエンドのインターンもあるので、興味を持った方は参加してみるといいと思います！
iOSDCに学生参加した話

# はじめに
2024年8月22日〜24日に、iOSDCというiOS開発者向けカンファレンスが開催されました。
私はこのときiOSDCに初めて参加したのですが、得られたものがとても多かったのでそれをまとめました。

![IMG_8180.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/8da902e1-4361-aedb-2596-54b858358f00.jpeg)

# iOSDCとは？
iOSDC2024は、**日本最大級のiOS開発者向けカンファレンス**です。
最新のiOS技術や開発手法に関するLTがたくさん行われ、講演者との話すスペース（Ask the Speaker）も用意されています。iOS開発の最前線をいく人たちと交流することができる場というわけです！
また、企業ブースが多く設置されていて企業の方々といろんな話ができます！
他にもお酒飲み放題だったり、お菓子食べ放題だったり、DJイベントが夜に開催されたりと、まさにお祭りのような感じです。
[公式サイト](https://iosdc.jp/2024/)

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

### 開催大学の生徒は無料で参加できる
iOSDC2024が開催されたのは偶然私の通っている早稲田大学で、なんと早稲田生は無料で参加することができました…！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/591ccd1a-b672-d6e0-c5b9-1dcfe8389691.png)

ほんとにこれ無料でいいの…？みたいな体験をたくさんさせていただきました。（お菓子めっちゃ食べた）

加えて、**学生だからこそ参加して良かった**と思うことが多かったので、それをいくつか書こうと思います。

# よかったこと1：エンジニアの興味を知れる

一番驚いたのは、みなさんSwift6のStrict Concurrencyへの興味がめちゃ強かったこと。（Day1の講演でもそれに関わるものが多かったです）
自分としてはまだSwift6もリリースされていないのにそんなこと気にするんだ…！と衝撃でした。
いかに**最新技術のキャッチアップ**が大事であるのかを知りましたね。

![IMG_8187.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/3808affe-5120-eca0-fdfd-6570c42cbf8c.jpeg)

（バイト先の先輩がLTに出てました！すごい。）

# よかったこと2：いろんな企業の話を聞ける

iOSDC2024には40社ものスポンサー企業が参加しており、それぞれのブースでお話を聞くことができました！
企業ブースといってもいろんなものがあって、企業説明や採用情報を教えてくださるところから、風力計を実際に触れるところ、コードテストが出されているところと、それぞれの企業の特色がでているなと思いました。

学生の身分からすると、**インターンの情報や採用情報、事業内容、社員の方の雰囲気**など、会社説明会くらい大事な情報を知れました。また、まだ知らなかった企業をたくさん知ることができ、一挙に自分の世界が広がりました。まじでこれがデカい経験でした。

![IMG_8182.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/fa4a870c-8226-209f-c879-dc0e5d2b3c82.jpeg)

そして企業さんからいろんなものもらってDay1時点でこんな感じでした。幸せ。
（RIZAPででかい袋をもらって助かるの、行った人ならわかってくれると思う）

# まとめ
これまで自分は趣味の個人開発ばかりしていたのですが、このようなインプット・交流の場があることで、視野がとても広がり、モチベが爆上がりするという経験をすることができました。iOSDC2024以降、ハッカソンやインターンなど対外的な活動を通してインプット・アウトプットを増やすよう意識できるようになったので、iOSDCに行った経験は本当に大きかったなと思います。

とにかく、**インプットの場に行こう！いろんな人・企業と話せるのはカンファレンスくらいしかないぞ！**
Linuxカーネルのバージョンを上げる

# モチベ

RHEL9を使っているが、RHEL9でさえlinuxのkernel versionが古くて、PT3のドライバビルドがコケてしまったため上げた。忘れがちなのでメモ。
PT3のドライバはRHEL9からはDVBの非サポート化に伴い同梱されなくなったため自前ビルドしないといけない。(とはいえRHELはUbuntuよりEoL長めなのでRHEL9を使いたかった)

ドライバのソースコードを修正した後に、(あれ…？これバージョン上げればいいじゃん…)ってなって上げた。
おきた現象の原因: https://qiita.com/nanbuwks/items/5a8870a46cb7d564c49b#%E5%8E%9F%E5%9B%A0

# 環境

古いカーネルが以下だとする。
```shell
$ uname -r
5.14.0-503.14.1.el9_5.x86_64
```

# 手順

```shell
$ sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ sudo dnf install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
$ sudo dnf --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel
```
再起動する。

```shell
$ uname -r
6.11.9-1.el9.elrepo.x86_64 # 上がったね！
```

必要に応じてええかんじに古いカーネル削除する。てかしたほうが良い。

```shell
$ sudo dnf remove kernel 
# 古いカーネルバージョンのものだけ出てくることを確認しとく。
```
10年ぶりにソフトウェアテスト自動化に取り組むときになった時のキャッチアップ方法

# はじめに
### 概要
10年ぶりにコーディングをすることになったおじさんのように、10年ぶりに画面系ソフトウェアテスト自動化に取り組むことになりました。時代の変化や技術の進化についていくため、どうキャッチアップしたらよいかを記載します。

### 想定読者
画面の自動テストに関する知見を知りたい方を読者に想定しています。また、この記事を読む時間は3分程度になります。

# 本題
### 基礎の学習

ソフトウェアテストの自動化に関する基礎知識については、10年前と変わっていません。基礎を学習/復習するにあたり、書籍の「[ソフトウェアテスト自動化の教科書](https://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%80%9C%E7%8F%BE%E5%A0%B4%E3%81%AE%E5%A4%B1%E6%95%97%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9-%E6%9E%97-%E5%B0%9A%E5%B9%B3/dp/4297117363)」がオススメです。「ソフトウェアテスト自動化の教科書」内の「第2章：自動テストの正しい知識を身につける」「第3章：自動化を成功させるための４つのプロセス」は自動テストに関する普遍的な内容であり、自動テストに取り組む前に読んでおくのがよいかと思います。


### 自動化方式の多様化

かつてはDOM(Document Object Model)ベースで操作対象を特定する自動化ツールが主流でした。しかし、今日(こんにち)においては画像認識やOCRで操作対象を特定するツールが出てきております。このような画像認識やOCRは10年前も存在していましたが、AI技術の発展によって10年前と比較してスクリプト作成/メンテナンスの難易度が低下しつつ、自動化の安定性が高まっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697481/f6790da3-be1f-af0a-f1d8-095b81994d14.png)


自動化の対象システムによって、最適な操作対象特定方式は異なります。例えば、UIに改修が入るたびにDOMが複雑に変わるようなWebアプリケーションの場合、DOMではなく画像やOCRで操作対象を特定したほうがよりスクリプト作成/メンテナンスの難易度が下がる可能性があります。自動化方式に複数の方法があることを理解するべきです。


代表的な画像やOCRで操作対象を特定できるテストツールとして[EggPlant](https://www.keysight.com/jp/ja/products/software/software-testing/eggplant-test.html)があります。

### 自動化対象の多様化

かつてはテスト自動化といえばブラウザのテスト自動化を指すものだったと思います。しかし、今日(こんにち)においてはタブレットやスマートフォンアプリのソフトウェアテスト自動化対象となりえます。スマートフォンアプリがテスト対象の場合、旧来のDOMベースのツールでは自動化に対応していないことが多いです。そのため、スマートフォンアプリ等が自動化できるツールの知見も獲得しておくべきです。なお、スマートフォンアプリの自動化には端末準備等に時間や負荷がかかることが多いため、リードタイムが必要なことを考慮してテスト自動化のスケジュールをたてるとよいでしょう。

代表的なスマートフォンアプリを自動できるOSSツールとして[Appium](https://appium.io/docs/ja/2.0/)があります。

### SaaS系テストサービスの発展

かつてはローカルPCにツールをインストールする方式が主流でした。しかし、今日(こんにち)においてはSaaSベースのテスト自動化サービスが多く出てきております。ノーコードで操作対象を特定できる機能があったり、自分でテスト打鍵用端末を用意する必要がない、など使いやすさの観点でSaaS系テストサービス多くのメリットがあります。ただし、SaaSテストサービスのサービサーにテストに関するデータを管理されるため、セキュリティ観点で利用できないシステム多くあります。また、インターネットにつながらない閉域網のテスト環境は簡単に利用できない、などの問題もあります。セキュリティ観点やテスト環境のネットワークを考慮しつつ、テスト自動化の選択肢として検討いただくとよいかと思います。

代表的なSaaS系テストサービスとしては[mabl](https://www.mabl.com/ja/)や[Autify](https://autify.jp/)があります。

### OSSテストツールのトレンドの理解

かつてはOSSテストツールとしてはSelenium一強でした。しかし、今日においてはSeleniumとは異なるOSSテストツールの利用が伸びています。代表的なOSSテストツールは[cypress](https://www.cypress.io/)と[playwright](https://playwright.dev/)です。[ダウンロード数比較リンク](https://npmtrends.com/cypress-vs-playwright)を確認すれば、主流となりつつあるOSSテストツールが理解できるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697481/e4bf588c-7770-4d61-ed64-16ac9a583714.png)


# まとめ

今日においてはソフトウェアテスト自動化するにも多くの方法があり、テスト自動化を進めるにあたっては各ツールの特徴や方式を理解するのが必要です。自動化対象のシステムの特徴や、セキュリティや費用、ツールの習熟コストやメンテナンス時にどうしていくかなど多角的な観点で評価し、ソフトウェアテスト自動化を進めていくのが良いかと考えています。
【SAA試験前日】これまでの振り返り：心の天使と悪魔

## これでいいんだっけ？
**明日SAAの試験を受けてきます。**

今、心の中に
「受かるっしょ！余裕余裕～！」と言っている悪魔と
「やばいぞ、もしかしたら落ちるぞ」と言っている天使がいます。

なんだかどっちも根拠がないので、自分がやったことをここでまとめて、心を落ち着かせておきたいと思い、筆を執りました。

ついでに各やったことの感想も書いてあるのでよければ参考に。

## やったこと一覧
* テキストを読む
* Ping-tの問題集
* Udemyの講座を２つ（1つはハンズオン）

### テキストを読む
※使用したテキストは[こちら](https://amzn.asia/d/eeHlxNv)（Amazon）

２日くらいでバーッと読み切りました。

あーそうだったなということもあれば、へー！っとなることもありつつ、全部覚えるという感じではなく**読み流していく感じ**で進めました。

内容としては薄く広く書いてあるので、全体感をつかむにはちょうどいい分量のテキストかなと思います。

実際に問題を解くようになってから、このテキストを振り返ることはほぼなかったかな。

初めてSAAに取り組む場合は2,3回繰り返し読んでもいいのかなと思います。

### Ping-tの問題集
Ping-tは[こちら](https://mondai.ping-t.com/g/)

各サービスや機能ごとの問題と、SAA本番に近い実践問題が両方あります。

テキストを読んだ後に取り組むにはちょうどいい難易度です。
解説も結構しっかりしていてわかりやすいです。

実践問題は若干難易度が上がりますが、本番よりは簡単。
問題数が多いので全部やるかどうかは時間次第ですが、**ここで基礎を固めておくと**次のUdemyの模擬試験が楽になります。

### Udemyの講座を２つ（1つはハンズオン）
※受講した講座は
[模擬試験のみの講座](https://www.udemy.com/share/101rfM3@imjXt-Zr92N0h4adSsWDHOlnHSSLMJBrSjGhJn4IAZ2RXRG3gfkgsXxupSkIaCq3Bw==/)
[ハンズオン+模擬試験の講座](https://www.udemy.com/share/101WKk3@3y73IVDfXNF4tu4tocovTezHm50zHT2d1xmwS2PnI2K20EFX9qLXmUQttO9y0OwMFQ==/)

**ここに一番時間をかけました。**

2講座合わせて8個の模擬試験を2~3周ずつしました。
1番大切なのは終わった後にしっかりと解説を読み、頭の中を整理すること。
これを続けていくと正答率が上がってきました。

少し忘れているなとか、よくわからないなとなった場合にはPing-tの問題で復習をしていました。

ハンズオンの感想については[前回の記事](https://qiita.com/hijiking/items/2a5bd1373b95cbea8901)に書いてありますが、効率よく取り組めばとても有益なものだと思います。

## 心が落ち着きました
書いてみたらまあまあちゃんとってやっていたっぽいので、心が落ち着きました。
**なにごとも不安になったら振り返りが大事ですね。**

明日の朝どんな心持かわかりませんが、合格目指して頑張ります！
CodeIgniterでlog_messageのログが保存されない不具合の解決方法

# 背景
コードイグナイターで運用中の業務用アプリの開発に参加することになった。
Docker を使って開発中。
MariaDB からデータをブラウザに渡したいが、値がnull になるので、
変数の中身を表示したい。
しかし、APIリクエストの中身なので、処理中に print_r や var_dump() を使うと、
予期しない出力により、APIはfalse を返してしまう。
そこで、 コードイグナイターの標準関数の log_message を使って配列の中身を確認しようとしたが、
ログが保存されない。

# 原因
Docker で書き込み先のディレクトリをマウントしていなかった。

# 解決方法
ログの保存先をマウントして、権限を付ける。
```docker:docker-compose.yml
  volumes:
  　　- "./tools/log:/var/www/tools/
　command: >
 　sh -c "chown -R admin:admin /var/www/tools/log"
```
以上。
解決策を見つけるのに１時間かかってしまった。
ようやく、開発が進む。
windows11 chrome 重い

なぜか重い・・・。
キャッシュを削除したりダウンロードファイルを削除したりもしたが治らない。

しかもfirefoxやedgeなど、どのブラウザで見ても重い。

# 結論

LANのドライバがおかしかったです。
ドライバを手動でダウンロードしてインスコしたら治った。
というかchrome以外もすべて遅かったという。

# 以下、旧結論

chromeは、もちろんfirefoxも重かったのでAU光に電話してモデムを2年ぶりに変えてもらった。

そしたら早くなった。
時代がテキストファイルと音声ファイルではなく動画が当たり前の時代だから負荷がかかって壊れやすいんだろうな。


# DNSキャッシュに問題があった

デスクトップ右下のアイコンを右クリック。

ネットワークの問題を診断するを選択

![名称未設定-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31338/16d7f876-cf36-ef52-e409-595929a7eb2a.png)

画面はないけど、DNSキャッシュに問題ありますみたいな表示が出てた。
で、再起動したら解決した。

コマンドプロンプトからDNSキャッシュを削除する方法もあるみたい。

# windowsのキャッシュをコマンドから削除

1 windows キーを押す
2 cmd と入力しエンター
3 コマンドプロンプトに以下を入力しエンター
```
ipconfig /flushdns
```

これでwindowsのDNSキャッシュはクリアできる。

# chrome も削除

chromeは独立したキャッシュを持っている
chromeを開いてアドレスバーに以下を入力

```
chrome://net-internals/#dns
```

出てきた
「Clear host cache」
というボタンをクリックして削除完了


# ブックマークも軒並み削除

あんまり意味ないなこれは。

# Cドライブの重いファイルも削除

うーん。これが原因？
SSDが1TBあるが、700GB使ってたからな。
いらないAIプログラムを削除した。

Cドライブの .cache というフォルダも消した。

いや、多分これか？
というのもfirefoxで見ても重かったからな。。。
メインドライブが容量あるからとインスコしまくると駄目だな。
早くなった気がする。

# eagleが原因？
画像管理ソフトのeagleが原因か？わからん。。。