OmniAICreator/Qiita-1.07M huggingface dataset:
MUI v5で背景のみ透明度を設定する方法

背景のみ透明度を設定する方法を備忘録として記載する。

sxのプロパティに”opacity”を設定すると透明度を設定することができるが、この場合だと子要素まで透明になってしまう。

```jsx

const commonProp = {
  width: 300,
  height: 300,
};

export default function Page() {
  return (

      <Box
        position="absolute"
        zIndex={1}
        sx={{
          ...commonProp,
          backgroundColor: "warning.main",
          opacity: 0.5,
        }}
      >
        <Typography variant="h2">Box1</Typography>
      </Box>
      <Box
        position="absolute"
        sx={{
          ...commonProp,
          top: 50,
          left: 20,
          backgroundColor: "primary.main",
        }}
      >
        <Typography variant="h2">Box2</Typography>
      </Box>
  );
}
```

子要素も透明度が設定される。
![スクリーンショット 2022-10-09 17.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317229/95aee137-c734-c61b-d8ed-9fe3b53e2645.png)



## 解決策
カスタムカレーパレットを用意する。そこでalpha関数を使用して、カラーを設定する。
そのカラーをバックグラウンドカラーに使用することで、背景のみ透明度を設定することができる。

```jsx
import {
  alpha,
} from "@mui/material";
import { amber } from "@mui/material/colors";

const customTheme = createTheme({
  palette: {
    opaWarning: {
      main: alpha(amber[700], 0.5),
    },
  },
});

const commonProp = {
  width: 300,
  height: 300,
};

export default function Page() {
  return (
    <ThemeProvider theme={customTheme}>
      <Box
        position="absolute"
        zIndex={1}
        sx={{
          ...commonProp,
          // backgroundColor: "warning.main",
          // opacity: 0.5,
          backgroundColor: "opaWarning.main",
        }}
      >
        <Typography variant="h2">Box1</Typography>
      </Box>
      <Box
        position="absolute"
        sx={{
          ...commonProp,
          top: 50,
          left: 20,
          backgroundColor: "primary.main",
        }}
      >
        <Typography variant="h2">Box2</Typography>
      </Box>
    </ThemeProvider>
  );
}
```
子要素は透明になっていない。
![スクリーンショット 2022-10-09 17.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317229/5a3e9b5d-1401-a262-0987-6c9c6a4969af.png)
ReadyMedia (MiniDLNA) 構築・Android 連携メモ

# これは作業録です
- TrueNAS の Plex 使おうかと思ったけど Playlist (.m3u) の扱いが微妙そうだったので見送り

# ReadyMedia (MiniDLNA)
- HW
    - NUC7CJYH
    - その内 OrangePi とかに移すかもしれない
- SW
```zsh
% uname -a
Linux ubuntu 5.4.0-126-generic #142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

% cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

## NFS mount
```zsh
% sudo apt install nfs-common
% sudo mount -t nfs 192.168.2.4:/mnt/main/data /srv
```

## Install
```zsh
% sudo apt install minidlna
```

## conf
- トラック番号ソート強制
- symlink 有効

```diff_conf:diff --git a/etc/minidlna.conf b/etc/minidlna.conf.org
      1 diff --git a/etc/minidlna.conf.org b/etc/minidlna.conf
      2 index 0c40731..f77ba89 100644
      3 --- a/etc/minidlna.conf.org
      4 +++ b/etc/minidlna.conf
      5 @@ -23,7 +23,7 @@
      6  #   * "P" for pictures (eg. media_dir=P,/var/lib/minidlna/pictures)
      7  #   * "V" for video    (eg. media_dir=V,/var/lib/minidlna/videos)
      8  #   * "PV" for pictures and video (eg. media_dir=PV,/var/lib/minidlna/digital_camera)
      9 -media_dir=/var/lib/minidlna
     10 +media_dir=A,/srv/minidlna
     11  
     12  # Set this to merge all media_dir base contents into the root container
     13  # (The default is no.)
     14 @@ -78,7 +78,7 @@ port=8200
     15  
     16  # Name that the DLNA server presents to clients.
     17  # Defaults to "hostname: username".
     18 -#friendly_name=
     19 +friendly_name=MiniDLNA
     20  
     21  # Serial number the server reports to clients.
     22  # Defaults to the MAC address of nework interface.
     23 @@ -122,11 +122,11 @@ album_art_names=Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg
     24  # Always set SortCriteria to this value, regardless of the SortCriteria
     25  # passed by the client
     26  # e.g. force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title
     27 -#force_sort_criteria=
     28 +force_sort_criteria=+upnp:originalTrackNumber
     29  
     30  # maximum number of simultaneous connections
     31  # note: many clients open several simultaneous connections while streaming
     32  #max_connections=50
     33  
     34  # set this to yes to allow symlinks that point outside user-defined media_dirs.
     35 -#wide_links=no
     36 +wide_links=yes
```

## 管理画面
- `http://***.***.***.***:8200/`

## Playlist
- 音楽フォルダと同じ場所に `*.m3u` で突っ込めば OK

# Android
- VLC で動作確認 OK
ModuleNotFoundError: No module named 'MySQLdb'


# 事象 : DjangoでMySQLに接続確認しようとしたら怒られた
1. Cloud9でPython3の環境を作成
    - Djangoがデフォルトでインストールされていた！素敵！
1. Cloud9からRDSのMySQLを接続できるように設定
    - mysqlコマンドがデフォルトでインストールされていた！素敵！
1. setting.pyにMySQLへの設定をして接続確認！エラー！

```bash
$ python manage.py migrate
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
ModuleNotFoundError: No module named 'MySQLdb'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 347, in execute
    django.setup()
# ...省略...
  File "/usr/local/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
    ) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
```

## 原因 : MySQLに接続するドライバがインストールされていないから
Cloud9にmysqlコマンドやDjangoがデフォルトでインストールされているからってPythonにMySQL用ドライバがデフォルトでインストールされているわけじゃない。
MySQLのドライバも「mysqlclient」以外にも「PyMySQL」とか「mysql-connector」とかいろいろあるようですし・・・。

```bash
# MySQL用ドライバが何にもない・・・
$ pip list | grep -i mysql
```

### 対応 : PyMySQLをインストールする
参考 : [Python3系でDjangoでMySQLに接続する](https://codelab.website/python3-django-mysql/)

1. PyMySQLをインストールする
1. manage.pyでPyMySQLを利用できるよう設定する
1. settings.pyにOPTIONSを追記する
    - `'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"`を設定しないと「(mysql.W002) MySQL Strict Mode is not set for database connection 'default'」が出ます
    - 参考 : [Databases | Django documentation | Django](https://docs.djangoproject.com/en/2.0/ref/databases/#mysql-sql-mode)
1. `python manage.py migrate`で接続確認する

```bash
# 1. PyMySQLをインストールする
$ pip install PyMySQL
Defaulting to user installation because normal site-packages is not writeable
Collecting PyMySQL
  Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
     |████████████████████████████████| 43 kB 2.3 MB/s 
Installing collected packages: PyMySQL
Successfully installed PyMySQL-1.0.2
```

```python:manage.py
#!/usr/bin/env python
import os
import sys
# 2. PyMySQLを利用できるように以下を追記する
import pymysql

pymysql.install_as_MySQLdb()
# ...省略...
```

```python:setting.py
# 3. settings.pyにOPTIONSを追記する
# ...省略...
DATABASES = {
    'default': {
# ...省略...
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
# ...省略...
```


```bash
# 4. 接続確認する
$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  No migrations to apply.
```
Pythonで親を飛ばして親の親のメソッドを呼ぶ

要は親のメソッドは完全にオーバーライドしたいけど、親の親のメソッドは使いたい場合

```python
class Grandparent:
    def name(self, text):
        return text + '>サンデーサイレンス'

class Parent(Grandparent):
    def name(self, text):
        return super().name(text + '>ステイゴールド')

class My(Parent):
    def name(self, text):
        return super().name(text)

name = My().name('ゴールドシップ')
print(name)
```
結果は当然
```
ゴールドシップ>ステイゴールド>サンデーサイレンス
```

### 親を飛ばして、親の親を呼びたい場合
```python
class Grandparent:
    def name(self, text):
        return text + '>サンデーサイレンス'

class Parent(Grandparent):
    def name(self, text):
        return super().name(text + '>ステイゴールド')

class My(Parent):
    def name(self, text):
        return super(Parent, self).name(text)

name = My().name('ゴールドシップ')
print(name)
```
結果
```
ゴールドシップ>サンデーサイレンス
```
キモはここです
```python
return super(Parent, self).name(text)
```
応用情報技術者試験に合格したので、学習スケジュールを公開する(2022年春期)


2022年春期の応用情報技術者試験に合格しました。
どの分野がおすすめであるか等は、既存の技術ブログなどに情報がたくさんあると思いますので、そちらをご参照ください。
本記事では、学習量やスケジュール、解答のコツを中心に紹介します。


# 試験のスコアと選択分野について

午前試験：73点
午後試験：67点

午後試験で選択した分野
- 情報セキュリティ
- システムアーキテクチャ
- データベース
- 組込みシステム開発
- システム監査

# 受験時のスキル感
・2021年4月、IT企業に新卒入社(非情報系)
・2021年6月、基本情報技術者を取得済み(午前・午後ともに8割ほど得点)
・1年未満の業務経験(3ヶ月の研修+9ヶ月の業務経験)

# スケジュールや取り組み量について
基本情報技術者試験は、なるべく高い得点で合格することを目標としていたのに対して、
応用情報技術者試験は、必要以上にコストをかけず、合格することを目標にした。


学習の着手自体は2021年10月からだが、比較的ダラダラと学習していた。
(ベンダー資格の学習や、気になった技術書を読むなどしていた)
試験の約2ヶ月前である2022年3月頭から本腰を入れた。


## 午前問題
本番までに過去問の得点率を8割以上にすることを目標にしていた。
(過去問で8割取れたら本番で7割は取れるだろうという想定)

午前問題は2021年10月から着手していたが、2022年2月までの取り組みペースは10～15問/day程度。
2022年3月は午後問題を別途解きつつ、25問/day程度。
2022年4月は、試験当日の3日前から30問ずつ解いたのみで、基本的に午後問題を解いていた。

過去問の得点率の推移は、本番までに次のように推移した。
10月:5割
11～1月:6割強
2月:7割弱
3月:7割強
4月:8割


## 午後問題
本番直前までに、選択した各分野のトータルでの得点率が7割程度になっていれば良いかなという温度感で学習していた。
得意・得点しやすい情報セキュリティや組込みシステム開発の分野で高得点を取り、苦手なデータベース分野をカバーするイメージ。

午後問題は2022年3月から着手(約40日間)
モチベーションを維持できず毎日は取り組めなかったが、トータルして約20日間は学習に取り組んでいた。
取り組んだ日は、大問1～3問を解いていた。

なお、解答にあたっては次の分野を次の基準で選択した。

- 出題内容に大きな変化がない分野
- 学習コストが低い（俗に国語の問題と表現される）分野
- 得意分野or既存知識を活かせる分野

具体的には次のように選択した。
『出題内容に大きな変化がない分野』としてデータベース、
『学習コストが低い分野』として組込みシステム開発、システム監査(社会人として既存知識も活かせる)、
『得意分野or既存知識を活かせる分野』として情報システム開発、システムアーキテクチャ。



システムアーキテクチャや情報システム開発は年度ごとの出題内容の揺れが大きいため、問題形式に慣れる意図で解いた。

データベースは、前半でER図の穴埋めが出題されることが多いなど、出題内容の揺れが小さいため、
学習によって安定した得点が可能だと感じて解いた。
(補足：データベース分野は苦手であったため、最低限のスコアを安定して正答できるだけでもよい、と考えていた)

システム監査は、問題や解答の形式、解き方に慣れる意図で解いた。
なお、午後問題のうち、システム監査に最も力を入れて取り組んでいた。
最終的には次のような対策・解き方をすることで得点につながるのではないかと考えた。

　解答となりそうな名詞や登場人物の行動に線を引いておく
　(例:「基本設計書」「課題管理表」「営業所長」)



# 学習に利用したサービス
学習にあたっては[応用情報技術者試験ドットコム](https://www.ap-siken.com/)の過去問道場を利用。
午前試験についてはこのサービスのみの学習で全く問題はなかった。

午後試験も、結局は過去問道場だけで済ませた。

自身の実力不足もあり、問題形式に慣れるためというよりは、純粋に体系的な知識を仕入れるために書籍の購入を検討していたが・・
問題数や解説量に対する金銭的なコストパフォーマンスが悪かったため、試験対策本の購入は見送った。
(回答する分野を絞った状態まで学習を進められているのであれば、全分野の問題をまんべんなく記載する対策本は、コストパフォーマンスが悪い)

また、対策本は問題を解かせる＆その解説、という形式が多いように感じられたため、
同様の構造を持つ過去問道場の利用で十分で、購入の必要を感じなかった。

# 最後に
応用情報技術者試験の対策として、対策本や過去問を解いて準備するのも大切ですが、
今回の資格試験を通じて、日々の業務においても試験用のアンテナを張り、日々キャッチアップすることもまた大切であると感じました。

2022年春期のシステム監査は、在庫管理のシステムが題材でした。
私は業務として在庫管理システムに携わっており、そのお陰で問題文の読み下しに比較的苦労せずに済みました。
【Ruby】Loggerライブラリを使用して一定サイズごとにログファイルを記録したい

# 概要
一定のサイズごとにログファイルをローテートする場合には、
引数でローテーションするファイル数とサイズを指定する。
例えば5つのファイルを使い、1000バイトごとにローテーションさせる場合は以下のように指定する。

```ruby
logger = Logger.new('test.log', 5, 1000) #5つのファイルを使い、1000バイトごとにローテーション
```

第２引数がローテートするファイル数、第３引数が１ファイルごとのサイズを指定できます。
上記の指定ですとログファイルが最新のものを除いて新しいものから順に番号が割り振られます。

* 作られるログ
```log
test.log
test.log.0
test.log.1
test.log.2
test.log.3
```

# 参考

https://docs.ruby-lang.org/ja/latest/library/logger.html
Avatar Pack Tool経由で作られた7zbsonファイルとその配布について

この記事は、7zbsonファイルでのneos(NeosVR)向けアバター配布がどういうものか簡単に説明するために用意しました。
Boothなどで有償配布しているアバターのneos対応を検討されている方向けの記述が主になります。

# 7zbsonファイルとは
neos(NeosVR)においては、ドラッグするとneosに特定のアイテムを呼びだせる特殊なファイルと思っていただいて問題ありません。
厳密にいえば一部はサーバー上の領域から呼び出すと聞いています。
その為、この中に全てのデータが含まれているわけではありませんのでこれを解析してどうにかするといったことは難しいと思います。

# サポート体制
NeosVRのアバターの設定や使い方の不明点については、
日本のコミュニティでDiscordを用意してそこで解決してもらう体制をとっています。
Discordリンク(NeosJapan内「アバター設定・利用のサポート窓口」)
https://discord.com/channels/673668075718967296/1025960979709833216

# 配布ファイルの使い方
こちらの記事をご覧ください。
https://qiita.com/e1ght3/items/eb5c9e52276e100a4009

# 機能
**・盗難防止のプロテクションを自動的に付与**
アバター所有者以外がアバターを着たりインベントリに保存できなくする機能がNeosVRにあり、
取得時に自動的に設定されます。

**・ドラッグとボタンを数回押すだけの簡単取得**
アバターは全て設定済みなので、改変目的以外では追加の設定作業は不要です。


**・(任意で追加可能)7zbsonファイルドラッグ時に表示されるパネルに各種情報を表示できます。**
(上が各種情報をありにしたの場合、下記がなしにした場合)
![20221004213421_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/71819723-f424-4dd6-10a2-e9ee17e03a60.jpeg)


**・(任意で追加可能)コンテキストメニューからいつでもアバター情報を参照できます。(表示される内容は上記機能と同じ)**
![スクリーンショット 2022-10-04 213147.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/6bb9a413-c9f0-2937-a587-9833d6815f88.jpeg)
![20221004212906_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/ac48f50a-c0d3-78b9-2808-10d1336c5d07.jpeg)

**・安全なアバター導入環境をサポート**
ボタン操作時に第三者にアバターを盗まれないように、
「プライベートワールドでかつ一人の時」以外に導入すると下記のようなエラーパネルになり弾かれる防衛機能も設定することも可能。
![スクリーンショット 2023-01-22 124522.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/2cece0d8-b573-c4a7-d1c1-fc9865228e4b.jpeg)



# 7zbsonファイルを追加するメリット
**・neos(NeosVR)へのアバターの持ち込みが圧倒的に簡単になる**
　→ドラッグしてボタンクリックだけなので凄く簡単。
　通常はFBXファイルを読み込んでneos内でアバター化の設定が必要になり、慣れていないとUnityやBlenderを使う以上に大変な作業になります。

**・ユーザーが取得した時点で自動的にプロテクトされた状態になっている**
　→自力でのプロテクト設定も可能ですが、こちらの作業も慣れていないと難しいです。
導入すれば自動でアバターが保護されるのは、やれる事の範囲がとても広いneosでは大きな利点です。

**・今後「neos(NeosVR)にはこのアバターで入りたい」というユーザーの購入動機になりうる。**
　→現状neos(NeosVR)の利用者が少ない為、直ぐに売り上げ数が向上するわけではないですが、オマケとしてこのファイルがあるかどうかでユーザーが購入するきかっけにはなりうるかと思われます。

# 7zbsonファイルを使うデメリット・リスク
**・プロテクト機能も含めてセキュリティは完ぺきではない**
検討されている方には一番考慮いただきたい点になります。
配布用のパネルアイテム自体は基本プロテクトされてますし
ボタンを押してアバターが出現した時点で所有者以外が使えないようプロテクトもされますが、知識のある方なら自分でアバターにかかったプロテクト外してしまうこも出来ますし、他のユーザーに騙されて知らずに外してしまうというケースも今後考えられます。
ただ、プロテクトを外したところでアバターとしてのデータはneos(NeosVR)外には持ち出せません。(現状は強引に持ち出してもまともなデータにはならないのでFBXなどからインポートして自力で設定したほうが簡単)
FBXやUnitypackageなどを同梱して配布している場合は、購入者を信頼する前提という意味では同程度のリスクがあると捉えていただいて問題ありません。

**・今後使えなくなる可能性がある**
7zbsonのドラッグからアイテムを読み込む機能は、ロードマップにはありませんが今後の更新で使用不可になる可能性があります。
代替手段があればそちらへの切り替えの相談をいたしますが、
それもできない場合は7zbsonファイルの削除とショップページの更新をお願いする形になります。

最後まで読んでいただきありがとうございます。
Pythonライブラリがアップデートできない

# Pythonライブラリ「numba」のアップデートでエラー
（本稿の趣旨とは外れるので詳しく触れませんが、numbaはPythonをJITコンパイルして高速化するライブラリです）
## 起こったこと
Pythonのライブラリ「numba」をpipでアップデートしようと思いました
`pip install -U numba`と…（ポチポチ）
```
ERROR: Cannot uninstall 'llvmlite'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
```
なんでや！

どうやらnumbaを使うのに必要な「llvmlite」が入らないようです
とりあえずこっちだけアップデートしてみます
`pip install -U llvmlite`
```
ERROR: Cannot uninstall 'llvmlite'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.
```
うん、知 っ て た
## というわけで解決法
https://github.com/NVIDIA/NeMo/issues/841

githubにそれっぽい記事があります（…が、最初の回答は微妙に間違ってます）
訂正コメがいくつかついていますが、正しいコマンドは`pip install llvmlite --ignore-installed`ですね
（最初のやつはハイフンが抜けてる）

というわけで今度こそ！
`pip install llvmlite --ignore-installed`
`pip install -U numba`
これでうまくいきました

## 原因
~~わかりません！
誰か賢い人教えて！！
ちなみに、ちょっと調べてみたところ「setup.py」（なにそれ）でインストールされたライブラリは基本的にpipでいじれなくなるそうです~~

## たぶん本当の原因
興味本位でAnacondaのインストール直後の状況でアップデートを試みてみたところ、同様のエラーが発生しました。
というわけで、どうやら2020年5月版のAnacondaは元々numbaのアップデートが（少なくとも通常の方法では）できない模様。
~~まあ、さすがに最近のAnacnodaでは改善されているようですが…~~
2021年のPython3.8版や2023年春のPython3.10版でも修正されていない模様（この辺は検証しきれてません）

## もうちょっと調べた結果を追記
最近のAnaconda（具体的にはPython3.9の入ったAnaconda）では改善されていると思っていたのですが、2023年春ごろのAnaconda(Python3.10入り)でも再びこの現象に遭遇。なおってなかったんかい！
まあ、相変わらず`pip install -U numba --ignore-installed`で対処できるので落ち着いて対処しましょう。
…道理で最近でもちらほらいいねが付くわけだ。

## 環境
Windows10
Anaconda3.7.6
numba 0.48.0->0.56.2
llvmlite 0.31.0->0.39.1

## あとがき
~~僕は今までダラダラと長ったらしい駄文をqiitaに書き連ねていたのですが、シンプルに最低限の情報だけ書いたほうが見やすいしサクッと書けるしで絶対いいですね~~
Redmine 構築時に異常に時間がかかる手順があったという話

Amazon Web Service(AWS)で Ubuntu 22.04 のインスタンスを用意し、Redmine を構築していた時の話。
基本以下の Redmine 公式ページの則って構築していた。

https://blog.redmine.jp/articles/5_0/install/ubuntu/

・・・のだが、

<pre>
# sudo passenger-install-apache2-module --auto --languages ruby
</pre>

で、動作が止まってしまってまったく先に進まない事象が発生。フリーズしているかのような見た目、時間がかかりすぎている。。

インスタンスのスペックがそこまでよくない t2_micro(1 CPU / メモリ 1 GB)だったので、思い切って t2_medium に変えてみたところ、1 分もかからずにコマンド実行終了。やはりスペックの問題だったぽい。

スペックを変えるにはインスタンスタイプを変えればいい。以下画像参照。

![221009_instance-type-change.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2902882/e78bb01d-727c-03a3-0e20-29f69b8ca46d.png)

インスタンスタイプを変更する際に、それぞれのタイプがどういうスペックなのかは表示してくれないみたいなので、以下を参考に t2_mdeium に変更してみた。
https://aws.amazon.com/jp/ec2/instance-types/

あとは特に問題なく構築できた。やはりある程度のスペックを用意してあげるの大事、ということっぽい。
僅かな違いで処理速度が大きく異なるらしい - Python

# sorted()とsort（）で実行時間が大きく異なるらしい、

LeetCodeで問題を解いていた時に、
```python
nums = sorted(nums)
```
というコードを書いた。
この時の成績は487ms

![スクリーンショット 2022-10-09 16.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090582/aaf7840b-0262-3688-efeb-f68b7424a25c.png)

実際この成績は上位75％（下位25%）と芳しくなかった。


これを受けてLeetCodeのDiscussionにて他の人のコードを見たところ、
自分のコードではsorted関数を利用していたところを、他の人のコードでは.sort（）を使っている人が多かった。

そこでコードを以下のように変更して再度提出したところ、、、

```python
nums.sort()
```

![スクリーンショット 2022-10-09 16.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090582/de11b2d2-3263-5587-a60a-c59f9ab30ed3.png)
![スクリーンショット 2022-10-09 16.41.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1090582/57203d30-b788-e1b0-c781-03e13ffeaaea.png)

一気に上位２５％を切りました。。
たったこれだけの違いで実行速度が大きく変わるものなんだと学んだ1日でした。

# さらに知りたい方向けのサイト
sortは破壊的な表現でもあるため、気を付けて使ったほうがいいかと思いますし、実際の業務で使える知識なのかはわかりませんが、さらに興味のある方は他にも競プロで使えるで使える処理速度の早い表現を紹介しているサイトがあったので貼っておきます。

#### [Pythonの知っておくと良い細かい処理速度の違い8個](https://www.kumilog.net/entry/python-speed-comp)
【Laravel】Carbonを使ってみた

# はじめに
携わっている案件で、ユーザーがクーポンを使用する際にそのクーポンが有効期限内であるかどうかを確認する際にCarbonを使ったため、個人の備忘録として記事にしてみました。

# 今回の状況
``` php
use Carbon\Carbon;

public function createFromRequest(BaseRequest $request)
{
    $requestData = $request->fillData();

    // 有効期間の終了日
    $requestData['end_date_of_expiry'] = '2022-09-30';
    
    $endDateOfExpiry = new Carbon($requestData['end_date_of_expiry']);
    // 出力内容 $endDateOfExpiry　= 2022-09-30 00:00:00;
}
```
上記の様に リクエストデータが日付のみのため、変数$endDateOfExpiryの時間は、00:00:00になってしまいます。

そのため、Carbon::now()を用いて、クーポンを用いた日時を取得した場合に、2022年9月30日の00:00:01~23:59:59の間は有効期限外となってしまいます。
そのため、クーポンを使用する日付をCarbonを用いて変更する必要がありました。

# 実際に行ったこと
``` php
use App\Models\CouponModel;

use Carbon\Carbon;

public function createFromRequest(BaseRequest $request)
{
    $requestData = $request->fillData();

    // 有効期間の終了日
    $requestData['end_date_of_expiry'] = '2022-09-30';
    
    $endDateOfExpiry = new Carbon($requestData['end_date_of_expiry']);
    // 出力内容 $endDateOfExpiry　= 2022-09-30 00:00:00

    //　今日の日付を00:00:00で変数に代入
    $today = new Carbon('today');
    // 出力内容 $today = 2022-09-30 00:00:00

    // 今日の日付とクーポンの有効期限を比較して、クーポンのデータを取得
   　CouponModel::whereDate('end_date_of_expiry', '>=', $today)->get();
}
```
new Carbon('today')で今日の日付で00:00:00のデータを取得できるます。
# 終わりに
Carbonは他にも多くのメソッドなどがあるため、今後も活用できればと思います。


# 参考ページ

https://coinbaby8.com/carbon-laravel.html
【C言語】文字コードをずらして置き換えた文字列を出力する【備忘録】


# シーザー暗号：文字コードをずらして出力する

TechFULで解いていた問題のメモです。
修正に手間どったので、どのように解決したかの経緯と、新しく学んだ知識を書きます。

>問題：
>シーザー暗号化という文字列の暗号化方法があります。
>これはすべての文字を、ある整数値(key値)だけ文字コードをずらした文字に置き換えるというものです。
>標準入力から文字列strと、key値keyが与えられます。
>この条件でシーザー暗号化された文字列cipherを出力してください。
>
>（TechFULより引用）

>条件：
>key値は`-10^9≦key≦10^9`以下の整数
>strは半角`a～z`で構成される0～256文字以下の文字列

::: note info
**負の整数を割った余りは負になる**
ex）-17%4は1になる
:::

#### 最初に立てた方針：
・取得した文字に **key%26** を足す
・'a'の文字コードより小さければ26を足す
・'z'の文字コードより大きければ26を引く

始め、char配列の宣言でコンパイルエラーが出ました。
以下のようなメッセージです。
```diff_c
main.c: In function 'main':
main.c:9:10: error: array size missing in 'str'
    9 |     char str[];
      |          ^~~
```

これは **配列strの要素数がなかった** ことが原因でした。
後からscanf関数で文字列の長さが判明していない入力を受け取る場合でも、先に要素数を決めておく必要があります。

::: note info
**char配列の宣言には要素数が必要**
`char str[300];`（入力よりも大きい要素数で用意）
:::

サンプルケースはこれでうまくいきましたが、全テストケースにはまだ不正解が出ていました。
```diff_c
//不正解になったコード
    for (i = 0; strnlen(str, 258) > i; i++) {
        str[i] += key; //str[i]の値が128以上になってしまう場合がある！
        if (str[i] < 'a') {
            str[i] += 26;
        }
        else if (str[i] > 'z') {
            str[i] -= 26;
        }
    }
```
原因はchar型に格納できる値の範囲を考慮できていなかったことでした。
たとえば、'z'の文字コードは122であるため、key%26がとりうる最大値25が'z'に加算されると値は148となります。148は2進数8桁(2ビット)では表現しきれません。 **符号付きchar型の最大値127を超えてしまい、間違った文字コードが代入されてしまう** と思われます。

::: note info
char型は**2ビット（＝1バイト）**
10進数で0～127まで表現できる
:::

#### ASCIIコード
ASCIIとは、2進数7桁で表せる整数値に文字や記号などが割り当てられた文字コードです。
0～127までの整数が割り当てられています。

文字 | 10進数 | 16進数 |
|:-:|:-:|:-:|
| NULL |  0 | 0x00  |
| A  | 65 | 0x41 |
|  Z | 90 | 0x5A |
| a | 97 | 0x61 |
| z | 122 | 0x7A |

大文字と小文字のコード差は必ず32になっているので、±32をすることで大文字と小文字の変換をすることができます。ASCIIコードについては以下のサイトを参照しました。
参照したページ：
http://www3.nit.ac.jp/~tamura/ex2/ascii.html

::: note info
`char 変数 = '文字';`  でchar型の変数に文字コードを格納する
`printf("%d\n", ch);` で文字コード（整数）を表示する
`printf("%c\n", ch);` で文字コードに対応した文字を表示する
:::


#### char配列の長さを調べる方法
**strlen** 関数を使います。
使用する場合は先頭に`#include <string.h>`を記述する必要があります。

::: note info
**strnlen(char配列, 最大値)**
　strlen関数よりも安全。
　NULLで終わらなくても最大値までしか読み込まないようにできる。
:::
::: note info
**_mbstrlen(char配列)**
　日本語のかな文字などにも対応。
　`#include <locale.h>` `#include <stdlib.h>`を先頭に追加する。
:::

参照したページ：
https://programming.pc-note.net/c/mojiretsu2.html

#### 全テストケース通ったときのコード：

```diff_c
#include <stdio.h>
#include <string.h>

int main()
{
    //input
    int key, i;
    char str[257];
    scanf("%d %s", &key, str);
    key = key % 26;

    for (i = 0; strnlen(str, 258) > i; i++) { //場合分けした後でstr[i]の値を操作する
        if (str[i] + key < 'a') {
            str[i] = str[i] + 26 + key;
        }
        else if (str[i] + key > 'z') {
            str[i] = str[i] - 26 + key;
        }
        else {
            str[i] = str[i] + key;
        }
    }

    //output
    printf("%s\n", str);
    return 0;
}
```
2022/10/9実施
参照先：TechFUL

https://techful-programming.com/user/skill/problem/coding/354
Supership株式会社のインターンで検索基盤を作ってデプロイした話

# 初めに
2022年の9/2~9/15で開催されていた、Supership株式会社のエンジニアサマーインターンに参加してきたので、体験記を残したいと思います。

Supershipではサマーインターンの実施自体は初らしく、
最初のインターン生として、敷かれていないレールを歩いていく感じが最高に楽しかったです！

募集されていたコースは2つあり、私は検索コースに参加しました。


# 環境
技術的な要素とそうでない部分に分けて、10日間どんな感じだったかの雰囲気を整理します。

## 技術
- バックエンド
    - FastAPI (Pythonの軽量フレームワーク)
    - Elasticsearch
- フロント
    - React
- インフラ
    - docker compose
    - Google Cloud
- バージョン管理等その他
    - git
    - Gatling (scalaで負荷テスト)

## 非技術
- 4人チーム(学生3人、メンター1人)
- プロジェクト管理**自由！**
- 技術選定**自由！**
- 月曜の**午前中休み！(有給なので実質週休2.5日！)**
- **フルリモート！**

こんな感じです。

技術的なところで言うと、インターン期間の課題は決まっていてそれを達成するためであれば自由に選定しても良いとのことだったので、比較的馴染みの深いものの中から開発スピードとレスポンスタイムを意識して選定しました。

技術以外のところだと、プロジェクト管理や1日のスケジューリングがほぼ完全自由でやらせてもらえたので、私のチームはGithubのカンバンを用いてタスク管理をしていました。開発中もVScodeのlive share繋いで議論しながら開発できたので、フルリモートの恩恵を最大限受けながらスピーディーに開発できた気がします！



# 具体的に取り組んだこと
最初の1日は事業説明やアイスブレイク、環境構築で終わり、最後の1日は最終発表と打ち上げだったので、実質8日間の開発期間で行ったことになります！

ちなみに開発物の用件としては、以下のような検索サジェストシステムを作る。と言うものでした。
- 全年齢が使用できる
- 1秒間に30リクエストを安定して処理できる

検索サジェストってのはこんな感じの画像のやつです。
![スクリーンショット 2022-10-09 16.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/f36c3dcb-bead-b8cb-2395-27895f0f65aa.png)

「すし」とひらがなで打つと、検索欄に補助が出ているのが見えますが、
ここの補助をする部分を作成しろと言うものでした。




## 前半戦
前半戦では、手元で動くものをまず作ることを目的としていました。

チームメンバーの協力もあり、
- ElasticSearchに生ログを入れるバッチ処理
- サジェスト用のAPI
- APIの結果を表示するフロント
- Google Cloudデプロイ


までを達成することができました。

検索用サジェストAPIの用件として、レスポンスタイムやアダルトワードの削除があったので、
本当の勝負はここから！と言うところで前半戦の1週間が終わりました。

## 後半戦

前半戦のスピード感を保ちつつも、中間発表でフィードバックいただいたところを中心に、以下のことに取り組みました。
- **アダルトワードの除去**
- **検索ワードの前方一致**
- **読み検索対応**
- **ログの正規化**
- レスポンスタイムの計測
- 同時リクエストによる負荷テスト
- 検索ログの保存
- ログ圧縮
- 保存したログを定期的にGoogle Cloud Storageに上げる定期処理

太字部分は、特に力を入れた部分です。

制作物の目標として、
「全年齢が使用できる検索サジェストシステム」

があったので、アダルトワードの除去を優先順位高く気を遣ったところでもありました。

また、上の画像で紹介した部分でもありますが、ひらがなの「すし」と言う検索クエリに対して、漢字やカタカナのレコメンドがあったかと思います。

このような仕様（というか、ユーザーが潜在的に使いやすいと思えるような機能)を実現するためにも多くの力を注ぎました。

# 面白み
上記の前半戦、後半戦の**タスクを全てチームメンバーと話し合って決められたこと**です。

いわゆる与えられたタスクとしてではなく、

自ら考えたタスクに全力コミットして、それに対して評価をいただけるのがSupershipでのインターンの醍醐味であると感じました！


もちろん完全放置というわけではなく、要所要所でタスクを前に進めるための助言も多くもらえました。

インターン期間中はチーム外の定例MTGにも参加させていただき、自分が会社に入った際、どのような働きをするのだろうかという部分に関しても妄想することができました！

# 最後に

個人的に今回のサマーインターンでは、「会社の胸を借りた自分の実力試し」、みたいな色があったように感じました。

実際に今までの自分の力を注ぎ込んだ2週間だったと感じましたし、全力でやったからこそつぎ込んだ熱量分多くのことを学ぶことができました。


もう一度同じ夏が来たとしても、ぜひまた参加させていただきたいインターンだと思いました！

面倒見てくださったメンターの方、その他関わってくださった社員の皆様、本当にありがとうございました！
Laravel初心者がエラーではまらない、デフォルトの流儀

エンジニアの皆さんが、良記事をまとめて頂いて、問題解決をすることは可能ですが、そもそも、なぜそのような振る舞いをするのかを理解できない初心エンジニアも多数居ると思います。
そう言った方向けに、取り敢えず、この方針でコードを書けば、取り敢えずつまずかないはず、をまとめてみました。
想定環境は、
PHP 8.1.2
Laravel 9.34.0
です。

なお、あくまでも習得用になります。
プロジェクトのルールがある場合は、そちらに倣って下さいませ。

# migrationファイルの作成

migrationファイルの作成は、
`php artisan make:migration create_hoges_table --create=hoges`
になります。
このhogesが曲者で、英語に詳しくないと困りますが、複数形にします。
具体的には、
`movie → movies`
などです。
そうしないと、後でmodelを編集する必要があります。
また、migrationファイル名は、規定はありませんが、
作成は、create、変更はmodify、削除はdelete
など、決めておいた方が良いでしょう。

ちなみに、デフォルトを使わずに`hoges`を`hoge`にしてしまって変更する場合は、
`app/Models/hoge.php`
の
```
class hoge extends Model
{
    use HasFactory;

}
```
を
```
class hoge extends Model
{
    use HasFactory;

    protected $table = "hoge";
}
```
と1行書き加えます。

# migrationファイルの編集

上記でmigrationファイルを作成しましたが、デフォルトでは、
```
public function up()
{
    Schema::create('hoges', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
    });
}
```
となると思います。
データベースの必須として、primary keyを利用しますが、このprimary keyは、`increments()`で作ります。
この中の`'id'`がデフォルトです。
これを変えると、後のコントローラーの
```
$hoge = hoges::find(1);
```
で、idを見に行こうとして、引っ掛かります。

ちなみに、デフォルトを使わずに`id`を`hoges_id`にしてしまって変更する場合は、
`app/Models/hoge.php`
の
```
class hoges extends Model
{
    use HasFactory;

}
```
を
```
class hoges extends Model
{
    use HasFactory;

    protected $primaryKey = 'hoges_id';
}
```
と1行書き加えます。

# 今後

これから進めて行って書き加えていきます。
お楽しみに(誰が?)。
ahamo esim から esim への iphone機種変更

iphone13 から iphone14へ変更した。
esimからesim。
その際のまとめ。
時間にして約10分。

# ahamo アプリへログイン

スマホアプリの左上のハンバーガメニュー
-> その他の手続き
-> esim発行・再発行のお手続き
-> 新しい機種(持ち込み)でesim発行を選択

端末情報 EIDと表示されるので、新機種のEIDを入力する

esimの確認方法
｢設定｣アプリの｢一般｣＞｢情報｣より確認できる。

入力するとSNSが届く

https://ahamo.com/flow/how-to-start-esim/

上記のURLのstep 2移行を新機種でやる

webサイトに表示されているQRコードを読みこみ、旧機種のSMSに届いた
[NTT DOCOMO の確認コード]

を入力


旧機種の電話回線切断と同時に、新機種が有効になるので安心。


# LINEのバックアップ

LINEは特にバックアップなども必要なく

旧機種から新機種にデータを移行後、LINEアプリを開くと
自分の電話番号と パスワードを入力してログインすれば、引き継ぐことができる。

ahamoはチャットサポートでざっくりやり方教えてくれるけど
細かく教えてくれというとサポートして欲しいならdocomoにせよ的なこと言ってくるのでご注意を。
Auth module(Nuxt.js) $store,$authが使用できない

Nuxt.jsでAuth moduleを使用してログイン機能を構築し、ログイン後にログインボタンをユーザーボタンに切り替える機能を実装しようとしましたが、`$store`や`$auth`が反応しないというエラーが発生しました。
バックエンド側にはRuby on railsを使用しています。

ログイン機能を構築した際に参考になった記事はこちら
・Auth module
公式 - https://auth.nuxtjs.org/
https://qiita.com/mtoyopet/items/a94cd61f9213c6501519
https://www.youtube.com/watch?v=zzUpO8tXoaw
＊↑英語での説明ですが、コードを書きながら説明されているので聞き取れなくても分かりやすいと思います。

・porxy, axios
公式(axios) - https://axios.nuxtjs.org/setup
公式(proxy) - https://axios.nuxtjs.org/options/#proxy
https://tns-blog.com/1

### 開発環境
```
"@nuxtjs/auth-next": "5.0.0-1624817847.21691f1",
"@nuxtjs/axios": "^5.13.6",
"@nuxtjs/proxy": "^2.1.0",
"nuxt": "^2.15.7"
"@nuxtjs/vuetify": "^1.12.1"
```

## 解決方法
`@nuxtjs/auth-next` (v5) → `@nuxtjs/auth` (v4)へダウングレードを行うとエラーが解消されました。

```
npm uninstall @nuxtjs/auth-next --save-dev // v5をアンインストール
npm install @nuxtjs/auth // v4をインストール
```
vuex-persistedstateを導入したり、いろいろ試しましたが、ダウングレードすれば解決できることに考えが回るまでかなり時間を要してしましました:sweat_smile:

学習し始めたうちは、初歩的なミスからエラーが発生することが多いので、考えられるエラーの要因のレベルを低いものから潰していくのが良いと思います！

vuex-persistedstateは、ブラウザバックしてもvuexのデータが初期化されないようにするためには必要になってきます。

このバグがすでに解消されたか分かりませんが、エラーが発生してしてしまった場合は参考にして頂けると幸いです:grin:
Module not found: Error: Can't resolve './utils/createSvgIcon'  material UIでiconsないよと言われた時の対処法

# いつものようにReactで遊んでいたら

 いつもと同じように遊んでいたら、以下のようなエラーがある日突然発生。
　material UI iconsのインストール方法が、v4とv5以降では変わっているようですので、備忘録的に記述させていただきます。


```
Module not found: Error: Can't resolve './utils/createSvgIcon' in '/var/www/client/hogehoge/node_modules/@mui/icons-material'
```

# 解決法
解決法は簡単で、以下のコマンドで一発解決です。

```
npm install @mui/icons-material
```

# v4とv5以降のmaterial UI iconsのインストール方法の違い
　あまり頭の中で、v4とv5以降のインストール方法が整理されていなかったので、以下に簡単にまとめます。

**v4以前**
```
npm install @material-ui/icons
```

**v5以降**

```
npm install @mui/icons-material
```


ちなみにコンポーネント自体を使いたいのならこっちです。
```
npm install @mui/material @mui/styled-engine-sc styled-components
```




# 参考
　以下公式から引用しました。やはり公式の一次情報追うのは大事だなと実感した休日でした

https://mui.com/material-ui/getting-started/installation/
ABC272メモ

0.はじめに
　解説を見るとA問題からループが必要な問題にしている等
　運営方針の変更があったようですね。


1.A - Integer Sum
　提供されたリストの合計を算出する問題。
　sum関数をつかってすんなり解きました。

　https://atcoder.jp/contests/abc272/submissions/35476728

2.B - Everyone is Friends
　B問題の割に条件が複雑で、おもわず
　C問題に逃げそうになりました。

　考え方
　　1)N人の全組み合わせをキーとした辞書を作る。（値は0）
　　2)各舞踏会に参加した人の組を調べ
　　　辞書に該当組み合わせがあったら、値を1にする
　　3)辞書の値を全部参照し、0が一つでもあったら、No
　　　すべて1だったらYesを表示する。

　実装
　　1)N人の全組み合わせをキーとした辞書を作る。（値は0）
```
d={}
for i in range(1,N):
    for j in range(i+1,N+1):
        d[i*1000+j]=0
```    
　　　一人目（1～N-1）*1000（Nが100までなので）+2人目(2～N)を
　　　キーに辞書を構成(キーをペアとかにもできた気がしますが私は
　　　ペアを数字に変換する方法がなじんでしまってます。)

　　2)各舞踏会に参加した人の組を調べ
　　　辞書に該当組み合わせがあったら、値を1にする
```
L=[]
for i in range(M):
    X=list(map(int,input().split()))
    L.append(X)
for i in range(M):
    r=L[i][0]
    #print("2",d,r)
    for j in range(1,r):
        #print("3",L[i][j])
        for k in range(j+1,r+1):
            p=L[i][j]*1000+L[i][k]
            #print("4",p)
            d[p]=1
```
　　チェックする際も、一人目*1000+2人目で辞書を検索し
　　フラグを立てていきました。
　　列ごとの繰り返しの添え字設定を失敗しててこずりましたが
　　考え方自体は間違っていませんでした。

　　3)辞書の値を全部参照し、0が一つでもあったら、No
　　　すべて1だったらYesを表示する。
```
flg=0
for d_val in d.values():
    if(d_val==0):
        flg=1
if(flg==1):
    print("No")
else:
    print("Yes")
```
　　答えの求め方はもっとスマートな方法ありそうでしたが
　　愚直にチェック。
　　
　　TLEが出なかったので良しとしました。

　https://atcoder.jp/contests/abc272/submissions/35490300


3.C - Max Even
　問題の意図はすぐわかりましたが実装にてこずりました。

　考え方
　　1)2要素の和＝奇数+奇数or偶数+偶数
　　2)思いついた場合分け
　　　リストを降順に並べ替えて
　　　2-1)1番目と2番目の偶奇が同じ
　　　　　1番目と2番目を足した値が答え
　　　2-2)1番目と2番目の偶奇が異なる
　　　　　3番目以降の数で初めに出てきた偶奇それぞれをもとに
　　　　　偶数最大ペア、奇数最大ペアを求め
　　　　　比較して大きい方が答え
　　　2-3)リストの最後まで偶奇ペアが出来なかった場合
　　　　　2-3-1)偶奇どちらかのペアが完成していた場合
　　　　　　どちらか完成しているペアが答え
　　　　　2-3-1)偶奇どちらかのペアも完成していない場合
　　　　　　-1を表示

　考え方自体は難しくないですが、少々無駄に複雑になってしまいました。
　解説にあった、偶奇それぞれ違うリストに格納して計算する方法は
　わかりやすくスマートだなと思いました。

　https://atcoder.jp/contests/abc272/submissions/35496733

4.D以降
　Dは一目見てちょっと無理そうとなり
　Eに挑戦しましたが、TLEとなる実装方式しか思いつかず
　時間切れになりました。
Java：異なるワークブック間のワークシートをコピーする

シートのコピーは、Excelドキュメントを処理する際によく使用される機能です。この機能を使用すると、関連付けられたシートを同じブックに簡単に配置でき、後で資料を探すのに便利です。この記事では、[Free Spire.XLS for Java](https://jp.e-iceblue.com/introduce/free-spire-excel-for-java.html)を使用してJavaで異なるワークブック間のワークシートをコピーできます。

## Spire.XLS.Jarのインストール
方法1：
mavenを使用している場合は、次のコードをプロジェクトのpom.xmlファイルに追加することで、JARファイルをアプリケーションにインポートできます。
```
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <url> https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>5.1.0</version>
    </dependency>
</dependencies>
```
方法2：
mavenを使用していない場合は、[このリンク](https://jp.e-iceblue.com/download/free-spire-excel-for-java.html)からFree Spire.XLS for Javaをダウンロードできます。ダウンロードが完了したら、ダウンロードパッケージを解凍します。次にIDEAで新しいプロジェクトを作成し、「File」、「Project Structure」、「Modules」、「Dependencies」を順にクリックし、右側の緑の「+」の下の最初のオプション「JARs or Directories」をクリックして、前に解凍したファイルを見つけ、その中のlibフォルダの下にあるSpire.XLS.jarファイルをプロジェクトにインポートします。

## 異なるワークブック間のワークシートをコピーする
詳細な手順は次のとおりです。

* Workbookインスタンスを作成し、Workbook.loadFromFile()メソッドを使用してソースドキュメントをロードします。
* Workbook.getWorksheets()メソッドを使用して、指定したワークシートを取得します。
* 別のWorkbookインスタンスを作成し、Workbook.loadFromFile()メソッドを使用してターゲットドキュメントをロードします。
* Worksheet.addCopy()メソッドを使用して、選択したワークシートのコピーをターゲットドキュメントに追加します。
* Worksheet.copyTheme()メソッドを使用して、ソースドキュメントのトピックをターゲットドキュメントにコピーします。
* Workbook.saveToFile()メソッドを使用して、ターゲットドキュメントを保存します。

```
import com.spire.xls.Workbook;
import com.spire.xls.Worksheet;

public class CopySheetBetweenWorkbooks {
    public static void main(String[] args) {

        //Workbookインスタンスを作成して、ソースドキュメントをロードする
        Workbook srcWorkbook = new Workbook();
        srcWorkbook.loadFromFile("source.xlsx");

        //指定したワークシートを取得する
        Worksheet originalSheet = srcWorkbook.getWorksheets().get(0);

        //別のWorkbookインスタンスを作成して、ターゲットドキュメントをロードする
        Workbook destWorkbook = new Workbook();
        destWorkbook.loadFromFile("destination.xlsx");

        //選択したワークシートのコピーをターゲットドキュメントに追加する
        Worksheet newSheet = destWorkbook.getWorksheets().addCopy(originalSheet);
        newSheet.setName(originalSheet.getName());

        //ソースドキュメントのトピックをターゲットドキュメントにコピーする
        destWorkbook.copyTheme(srcWorkbook);

        //ターゲットドキュメントを保存する
        destWorkbook.saveToFile("CopySheetBetweenWorkbooks.xlsx");
    }
}
```
![9EE5654D-57D0-4fef-A3FA-489FDC499061.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/3e9a63d5-b018-bb94-d039-d625c6096fb5.png)
不同版本Windows间RemoteDesktop互联出错

Windows 10访问Windows 7的远程桌面，登录出现错误。

> An authentication error has occured. The client and server cannot communicate, because they do not possess a common algorithm.
> 安全认证错误出现。因为算法不同，客户端与服务器无法通信。

解决方法把Windows 10的TLS 1.0启用。信息来源是下面链接。
[RemoteDesktop连接共通算法](https://social.technet.microsoft.com/Forums/windows/en-US/2c8a2fc5-1378-4227-9c0f-8ea6dbdc236d/remote-desktop-connection-common-algorithm)
```
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client
```
DWORD值Enabled改为1。
単一責任のクラスを設計する

## 初めに
オブジェクト指向設計には[SOLID原則](https://qiita.com/baby-degu/items/d058a62f145235a0f007)というものがあり、そのうちの「S」が単一責任の原則です。  

オブジェクト指向設計について勉強していることをより理解するためにアウトプットします。

## 単一責任のクラスだと嬉しいこと
- **再利用がしやすい**
- **変更が楽になる**
  - 変更がしやすいのでコードの移動、再設計がいつでもできる。いつでもできるので決断が必要になるまでそれを先延ばしにできる。必要に迫られてから変更、再設計を間違った方向で行わないで済む。

## 単一責任になっているか確かめるには
- **クラスに質問しておかしな質問になっていないかを確かめる**
  - 自転車のギアが例になっていた。「Gearクラスにタイヤのサイズを教えてください！」という質問は明らかにおかしくて、それはタイヤクラス(Wheel)に聞くべき。そのようなコードが紛れ込んでいないかどうかをチェックする

- **クラスのやっていることを説明する**
  - 単一責任になっていたら短く1文程度で説明できるはず。 「それと」や「または」などが説明に入ってくるようなら単一になっていない。


## 単一責任のクラスにするために
- あらゆるものを単一責任にする
- データはアクセサメソッドで隠蔽する
  - データの形式などの変更にメソッド修正１つで対応できる
- メソッドも単一責任にする
  - このメソッドは〇〇してから、△△したものを返す。とかだと〇〇と△△に分ける。
  - 分けてみると△△はこのクラスの責務じゃないから他で処理した結果を渡してもらおうか、など気が付く
  - やり過ぎてしまったらやり過ぎてから直せばいい。単一責任になっていれば修正も楽だから


#### 参考
[オブジェクト指向設計実践ガイド](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E8%A8%AD%E8%A8%88%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-Ruby%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E9%80%B2%E5%8C%96%E3%81%97%E3%81%A4%E3%81%A5%E3%81%91%E3%82%8B%E6%9F%94%E8%BB%9F%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E8%82%B2%E3%81%A6%E6%96%B9-Sandi-Metz/dp/477418361X)
【Android】PopupMenuの表示方法

# はじめに　
最近シンプルなPopupMenuを実装したのですが、ドキュメントが少ないように感じましたので簡単にまとめておこうと思います。

# 表示方法
まず、以下のようなmenu.xmlを作成します。

```test.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/test1"
        android:title="テスト１" />

    <item
        android:id="@+id/test2"
        android:title="テスト２" />

    <item
        android:id="@+id/test3"
        android:title="テスト３" />

    <item
        android:id="@+id/test4"
        android:title="テスト４" />
</menu>
```

次に、kotlin側でPopupMenuを生成し表示するコードを実装します。
```
PopupMenu(requireContext(), binding.targetView).apply {
   menuInflater.inflate(R.menu.test, menu)
   setOnMenuItemClickListener {
      // Menuからアイテムを選択された際の処理
      return@setOnMenuItemClickListener true
   }
   show()
}
```
PopupMenuの第二引数に表示する位置の基準にしたいViewを指定します。
説明は以上になります。

ちなみにmenu.xmlから追加するだけではなく、以下のようにPopupMenuが持つmenuに対してaddしていくことで、xmlを使わずにデータを動的に追加していくことも可能ですね。

```
val popupMenu = PopupMenu(requireContext(), binding.targetView)
popupMenu.menu.add(Menu.NONE, 0, 0, "テスト")
```

# さいごに
たまに実装要件の上がるPopupMenuですが、簡単に実装ができて意外に便利なので、お困りの方は是非参考にしていただければと思います。
LPIC202で参考にした全リンク

自分がLPIC202合格まで参考にしたリンクをまとめました。  
どこが参考になったかも補足で説明します。  
&ensp;
# ①学習の方向性を確認する
## [LPI：Exam 202 Objectives](https://www.lpi.org/our-certifications/exam-202-objectives)  
項目ごとに重みづけされており、出題の傾向を知ることができます。  
Weightで確認できます。  
LPIC202は範囲が広く、暗記量が多いため優先順位をつけて学習しました。  
自分はWebサーバ・ファイル共有＞DNS＞その他みたいな感じの優先度でやってました。
&ensp;
## [14日でLPIC202](https://eng-entrance.com/lpic202)
合格するための具体的なロードマップです。  
重みづけがLPIより見やすいです。  
&ensp;
## [最難関と名高いLPIC202のチートシート](https://qiita.com/zukizukizukizuki/items/96ffb585a18b73ffe691)  
試験前の詰め込みに使用しました。  
パッとみて意味がわからなかったものは復習してました。  
&ensp;
## [ Ping-t - 合格体験記](https://mondai.ping-t.com/g/passings?l=3&m=5&s=42)
実際に合格した人の感想、学習方法を参考が投稿されています。  
受験者のレベル感とか勉強時間の参考になりました。  
学習を始める前に１０本ほど確認するといいと思います。  
合格までの学習計画を立てやすくなります。  
&ensp;
## [LPIC対策のプロから学ぶ！LPIC-2学習ポイント (日本語)：Youtube](https://www.youtube.com/watch?v=UDU5QPOGbog&list=PL1MlA-eHE0-t53-l_jsqaG1CmYc5FLwBV&index=5&t=3344s)  
タイトルのまま学習ポイントを抑えるために試聴しました。  
37:33からLPIC202のポイント解説が始まります。  
セキュリティ・認証がキーワードのようです。  
&ensp;
# ②ハンズオン教材（全部Youtube）
## [アプリケーションサーバプログラム設定入門](https://www.youtube.com/watch?v=5VEpYSZZU7c)  
Apache,Nginx,Sambaの設定の参考にしようと視聴しました。  
Sambaの解説はありませんでした。  
試聴だけで構築はしませんでした。  
&ensp;
## [ファイル共有サービス、システムのセキュリティ（Linux学習）](https://www.youtube.com/watch?v=oZftLYDyKLU&t=2930s)
上のハンズオンでSambaの解説がなかったのでこちらで確認  
Sambaの機能・コマンドまで解説されています。デモもあります。  
視聴だけで構築はしませんでした。  
&ensp;
## [DNSサーバを構築してWebサーバに名前解決でアクセスしてみよう](https://www.youtube.com/watch?v=eBoGW3PfUGU&list=WL&index=4&t=172s)
BINDの設定の参考にしました。  
デモはバーチャルボックスを使用しています。  
にわか知識のAWS EC2でも出来たので、AWSの方がお手軽かも    
最後のSSL化だけうまくいきませんでした。  
&ensp;
## [今更ながら、OpenLDAPの機能紹介](https://www.youtube.com/watch?v=x1qzHi3ORJI&list=PL1MlA-eHE0-t53-l_jsqaG1CmYc5FLwBV&index=7&t=1992s)
用語解説がわかりやすかったです。  
LDAP、OpenLDAPの歴史・経緯なども踏まえて解説されています。   
解説のみで構築手順はありません。   
&ensp;
# ③WEB問題集  
## [Ping-t](https://mondai.ping-t.com/g)
言わずと知れたWeb問題集  
学習の６割くらいはこれを使っていました。  
&ensp;
## [学易](https://gakuyasu.byaku.jp)
YouTuberの[ずっきぃ](https://www.youtube.com/channel/UCRlUuegLbSLCJcW_sTRRORg)さんが紹介してたWEB問題集。無料です。  
問題の質は高いけどボリュームは少なめです。  
&ensp;
## [Udmey：模試](https://www.udemy.com/share/105knO3@QpOevC6ttgzl9vUpcz9gQE9r-YlD25o7p8gJEotoJ_DErnm11Giw8ZM7XnOZeD-N7g==/)
LPIC202用の模試です。  
５題分用意されています。２／５使用しました。  
難易度はわりと難しめと思いました。  
英語のみです。Chrome拡張のGoogle翻訳でなんとか受験できました。  
解説もなしです。意味がわからない問題はググったりするしかないです。  
&ensp;
## [スピマス](https://www.amazon.co.jp/dp/4798151238/ref=cm_sw_em_r_mt_dp_2GDABSNM8KHT52ZJXDM4?_encoding=UTF8&psc=1)
WEB問題集じゃないですが、問題集繋がりで紹介です。  
各セクション３０〜４０問くらいずつと、最後に１回分の模試があります。  
全問題を解く必要なないですが解説が細かくしてあるので、苦手分野はスピマスで集中的にやるといいと思います。  
自分は対策した結果、本試験ではDNS･Sambaは100％とれました。  
&ensp;
## 最後に
評判の通り暗記量が多く難しめの試験だなと思いました。  
しかし終わってみれば101,102,201のどの試験より短い準備期間で合格できました。  
これまでの試験と問われる本質は変わらないと思うので無意味に不安になる必要もなかったなと思ってます。  
これからチャレンジされる方の役に立てれば幸いです。  
また今回参考にさせていただいた皆様お世話理なりました。  
ありがとうございました。
とにかくDEVブランチにPUSHした時にES-Lintを自動で走らせたい

# 経緯
あるプロジェクトを進めている中で、lintを使い始めたが、せっかくならdevブランチにpushするたびに自動でチェックしてくれた方が便利だろという独断でES-Lintの自動チェックを挟むようにした
~~(本当はかっこいいからやってみたかっただけ)~~

# 実装方法
## ローカルにES-Lint追加する
下記コマンドでES-Lintをローカルに追加する
```shell
npm install --save-dev eslint
```

## package.jsonに追加
package.jsonのscript/lintに下記のように書くことで、```npm run lint```実行時にpages, components, layoutディレクトリ配下のvueファイルに対してlintのチェックが入るようになる。

```package.json
...
"scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "test": "jest",
    "lint": "eslint pages/**/*.vue & eslint components/**/*.vue & eslint layouts/**/*.vue"
  },
```
srcディレクトリにpages, components, layoutディレクトリを入れて、"eslint src"としても問題ないが、自分の環境上ちょっと面倒だったので、この形にした。


## ymlファイルにLint自動実行を実装する
checkoutやSet Node.js 12.x, npm ciなど他の参考ページにも記載があったが、不要なのかと思い削除したら、package.jsonがないですと怒られたのでちゃんと下記のコードを使った方がいいと思う。

ubuntu-latest環境のホストランナーを立ち上げて、Node.jsをセットして、package-lock.jsonを利用して```npm ci```してから、ようやく```npm lint```でLintチェックを行うという流れだと思われる。

```lint.yml
# GitHubに記載されるこの自動作業の好きな名前を記載
name: lint runner

on:
　# mainかdevというブランチにpush時にjobsを実行
  push: 
    branches:
      - main
      - dev
  # mainかdevというブランチにpull_request時にjobsを実行
  pull_request:
    branches:
      - main
      - dev

jobs:
  lint:
    runs-on: ubuntu-latest
    # 下記が順番に実行される
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set Node.js 12.x
        uses: actions/setup-node@v1
        with:
          node-version: 12.x
      - name: ci
        run: npm ci
      - name: ESLint
        run: npm run lint
```

## 結果
あえてエラーを起こした状態のまま上記のコードをpushすると下記の画像のように失敗していることが確認できる
解決した場合は二枚目の画像の通り、チェックマークがつく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487834/d1f1c9a4-7aff-fca8-d2b8-e3ee9b64a836.png)



# 余談
実は[reviewdog](https://github.com/reviewdog/reviewdog)というものがあって、今回解説したようなものをすっ飛ばして簡単に実装できるらしい。
早く気づけばよかった。。。とりあえず後で使ってみる

# 参考

https://dev.classmethod.jp/articles/shuntaka-github-actions-reviewdog/

https://iwb.jp/automatically-run-linter-push-github-actions/
雀魂 新しいコメントを通知する

:::note warn
**スクリプトの利用は、自己責任でお願いします。**
:::

新しいコメントが来ると通知する（雀魂を開いているタブのタイトルを変える）スクリプトです。開発者ツールで実行できます。

```JavaScript
window.titlePrefix = "(1) ";
window.notifyNewComment = () => {
    const req = {
        target_id: GameMgr.Inst.account_id,
    };
    app.NetAgent.sendReq2Lobby("Lobby", "fetchCommentList", req, (err, res) => {
        if (err || res.error) return;
        if (res.last_read_id === (res.comment_id_list[0] || 0)) {
            setTimeout(notifyNewComment, 60000);
            return;
        }
        document.title = titlePrefix + document.title;
    });
};
uiscript.UI_PlayerInfo.Inst.note.read = function() {
    uiscript.UI_PlayerNote.prototype.read.call(this);
    if (document.title.startsWith(titlePrefix)) {
        document.title = document.title.replace(titlePrefix, "");
        setTimeout(notifyNewComment, 3000);
    }
};
notifyNewComment();
```
母分散の区間推定

# 母分散の区間推定

母分散が $\sigma^2$ の正規母集団から抽出された $n$ ケースの不偏分散を $U$ とすると，母分散は次式のように表せる。
$$
    \sigma^2 = \frac{(n-1)U}{\chi^2_0}
$$

自由度が $n - 1$ の $\chi^2$ 分布において，下側・上側の確率が $\alpha\ /\ 2$ となるパーセント点をそれぞれ $\chi^2_L$，$\chi^2_U$ とすると，信頼限界は次式で与えられる。

$$
    \text{下側信頼限界} = \frac{(n-1)U}{\chi^2_U}
$$

$$
    \text{上側信頼限界} = \frac{(n-1)U}{\chi^2_L}
$$

例題

x = [38.37, 45.28, 47.59, 31.74, 37.99, 70.04, 47.70, 57.70, 62.34, 52.08]

の 95 % 信頼区間を求めよ。

```julia
using Rmath, Statistics

confidenceintervalofvariance(x; confidence=0.95) = confidenceintervalofvariance(var(x), length(x); confidence)

function confidenceintervalofvariance(U, n; confidence=0.95)
    α = (1 - confidence) / 2
    df = n - 1
    df * U ./ [qchisq(α, df, false), qchisq(α, df)]
end;
```

```julia
x = [38.37, 45.28, 47.59, 31.74, 37.99, 70.04, 47.70, 57.70, 62.34, 52.08];
```

- デフオルトでは 95% 信頼区間を求める。

```julia
confidenceintervalofvariance(x)
```

    2-element Vector{Float64}:
      65.99385658745433
     464.890642631047

- 90% 信頼区間を求めるとき

```julia
confidenceintervalofvariance(var(x), length(x), confidence=0.90)
```

    2-element Vector{Float64}:
      74.19986238749816
     377.54682900990946

- 二次データ（不偏分散，サンプルサイズ）を与えるとき

```julia
confidenceintervalofvariance(var(x), length(x))
```

    2-element Vector{Float64}:
      65.99385658745433
     464.890642631047

```julia
var(x), length(x)
```

    (139.48731222222227, 10)

```julia
confidenceintervalofvariance(139.487, 10)
```

    2-element Vector{Float64}:
      65.9937088697284
     464.8896020404209
AWS SSMのComplianceで惑わされた話

# はじめに
おそらく仕様な気がしていますので、あまり目新しい知識を共有するものではないです。
自分自身が時間を浪費してしまったので、同じ問題に当たった他の誰かの方のために共有しておきます。


# 調査の流れ
ハニーポット的に利用していたAWSアカウントのSecurityHubを眺めていて、Informationレベルのアラートが断続的に上がっていたので調査にあたりました。
![SecurityHub Console 2022-10-09 12-27-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/15cd4904-7507-4c1d-97e2-57bf0628bea9.png)

なにやらSystemsManagerのPatchManagerで問題が発生している模様。

※今回のはまりポイント！！！
![AWS Systems Manager - Compliance 2022-10-09 12-42-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/71ff5a65-1f4d-a62d-7e4c-52c9a313fdda.png)

![AWS Systems Manager - Managed Instances 2022-10-09 12-28-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/18e7e655-5dba-eafa-7287-a94f774ca01a.png)


上側Complianceの方のキャプチャを残していなくて、すごく見にくくて恐縮ですが、これらの内容からコンプライアンス種別のAssociationでエラーが出ていると判断。

以下のガイダンスを参照しながら、Associationの確認に入りました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ssm-instance-non-compliant/

が、当該Associationの実行履歴を見ても、とくにエラーは出ていなさそう。
設定内容にも誤りは見られない。。。


# 解決の流れ

途方に暮れかけながら、何気なくComplianceダッシュボードのフィルタリング設定を切り替えながら、Compliance Typeを再び選ぶと、Patchでもエラーが出ていると表示が追加されました。
![AWS Systems Manager - Compliance 2022-10-09 12-42-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/ee688ac7-3cc9-a359-5621-27108c1cad4f.png)

自動アップデートにはしていなかったので、このエラーは想定内。
Patchを当て直したところ、Associationもろとも解決！

![AWS Systems Manager - Compliance 2022-10-09 13-10-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/6c3bbcf8-28df-ecca-bf54-44a24a4f2087.png)

# 考察
おそらく、PatchManagerでScanしかしたことがなかったため、Baselineが引かれていなかったとかなのかなぁと推測。それが関連付けされていないと判断されたのかも。
今回、Associationの方のみに絞って調査をしてしまったため、気づくのに遅れましたが、ハマったときは視野を広げて見直すことの大事さを改めて認識できました！
G検定受験記録

# はじめに
G検定（2019#2）の受験記録を残します。

# 概要
一般社団法人日本ディープラーニング協会によるジェネラリスト向けの試験です。
AIの歴史、定義、最新動向、機械学習の手法や応用など幅広く問われます。

[詳細はこちら](https://www.jdla.org/certificate/general/)

# 受験のきっかけ
AIの仕組みに以前から興味があり、ネットで記事を読んだりしていました。
その中でG検定を知り、試しに受けてみることにしました。

# 勉強方法
用いたのは下記4冊と模擬試験（無料版）です。
記載した順番①～⑤で進めました。

私が受験した時点ではあまり参考書の選択肢はありませんでしたが、
その後、参考書や問題集が何冊も発行されているようです。
試し読みした感じどれも良書の様子なので、どれを選んでも良いと思います。

#### ①人工知能は人間を超えるか
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883732/b3b1a520-bd84-bc0b-d7f2-d46fde3ba52f.jpeg" width=25%>

受験向けというよりAIの概要を知るための読み物です。
理解しやすく面白い本だと思います。
Audibleの聴き放題にラインナップされていたので、通勤中を利用して聴きました。　
[リンクはこちら](https://www.amazon.co.jp/dp/B00UAAK07S)

#### ②ディープラーニング G検定（ジェネラリスト） 公式テキスト
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883732/5d6060a1-2261-f7d8-4ad9-d1a5ac470bc4.jpeg" width=25%>

JDLA監修書籍です。
AIの基礎知識から機械学習（ディープラーニング）の手法、応用事例まで幅広く学べます。
図が多くとても分かり易いですが、内容的にはちょっと薄いです。
これだけで試験に臨むのは厳しいと思います。
[リンクはこちら](https://www.amazon.co.jp/dp/B07H2ZR6M2)

#### ③AI白書2019
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883732/bae39fea-a693-12cf-067e-b365e2c7ab06.jpeg" width=25%>

大型本で500ページ弱あります。ずっしり重いです。
技術面のほか、ビジネス事例、政策動向が記載されています。
ボリュームがあるので気になった箇所をピックアップして読み進めました。
[リンクはこちら](https://www.amazon.co.jp/dp/B07QGRH7F6)


#### ④ディープラーニング G検定（ジェネラリスト） 公式テキスト
<img src= "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883732/7e9ff564-6f63-4942-8921-80273311ab19.jpeg" width=25%>

解説がとても詳しく記載されています。
この問題集が理解できていれば、合格ラインの点数は稼げると思われます。
[リンクはこちら](https://www.amazon.co.jp/dp/B07NDVCN99)

#### ⑤Study-AI模擬試験(無料β版)
https://study-ai.com/generalist/

無料β版ですが300問ほどあります。良問が多いです。
解けなかった問題はネットで調べて理解を深めながら進めました。
本試験に向けてとても役立ちました。

# 試験当日
> 実施概要	試験時間：120分
> 知識問題（多肢選択式・220問程度）
> オンライン実施（自宅受験）

自宅で受験できます。

開始早々、AIの最新動向や海外の政策について、
もっとAI白書を読んでおけば良かったと後悔しました。時すでに遅し。
解けない問題が多く、ちょっと焦りました。

技術分野はテキストに無い項目も多々出題されていましたが、
AIの手法について幅広くネットで記事を読んでいた事が功を奏し、
9割以上は解答できた感触。

220問と出題数が多いので、1つの問題に時間を浪費する余裕は無く、
悩む問題はひとまず飛ばしました。
それでも時間的にはギリギリでした。

# 感想
AIの最新動向（政策、法律、産業）を幅広く問われるので、
日頃からAI関連のNewsを抑えておかないと解答が厳しいと思いました。

技術分野は応用問題も多いので、単に用語だけではなく、
各手法の仕組みを理解しておくと、得点に結びつくと思います。

なお、合格はしていましたが得点は非公開なので不明。
AIに関する知識と興味が広がったので、受けて良かったと思います。