OmniAICreator/Qiita-1.07M huggingface dataset:
AzureADの情報から部署員一覧表を作成する

# できること
- AzureADの情報から、指定した部署の部署員一覧表を作成します。
- 下記テーブルは作成した一覧表の例です。
![スクリーンショット 2023-03-03 232359.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2534581/cc140f43-6d73-c290-e724-d7b483ca645e.png)

# 操作方法の例
- 実行すると、 `AAD_DeptName_yyyyMMddHHmmss.xlsx` を出力します。
- 既定の出力先は `%Userprofile\Downloads` です。変更する際は `Dest` パラメータで指定します。
-  `Dept` パラメータおよびファイル名中の `DeptName` は任意の部署名、 `yyyyMMddHHmmss` は実行時の年月日時分秒です。
- AzureAD認証時のダイアログには、ご自身が所属する組織のアカウント名とパスワードを入力して下さい。
```powershell
PS C:\...> Connect-Azuread; .\AAD部署員一覧表出力.ps1 -Dept "DeptName"
```

# 準備
## Powershellスクリプトの実行許可とモジュールのインストール
- Powershellを「管理者として実行」し、下記のコマンドレットを実行します。
- 「実行ポリシーを変更しますか?」と聞かれたら、「すべて実行(A)」を選択します。
```powershell
PS C:\...> Set-ExecutionPolicy RemoteSigned;
 Install-Module -Name AzureAD;
 Install-Module -Name ImportExcel
```
## Powershellスクリプトファイルの記述
- PowershellISE、メモ帳、VSCodeなどに下記のコードをコピーあるいは記述します。
```powershell
param([string]$Dept, [string]$Dest = "$Home\Downloads")
$di = Get-Item $Dest
pushd $di.FullName

$x = Get-AzureADUser -Filter "startswith(department, '$Dept')" -All $true

$x | select ShowInAddressList, Department, Jobtitle, DisplayName, PhysicalDeliveryOfficeName, Mail, UserPrincipalName |
 sort Department, UserPrincipalName |
 Export-Excel -TableName "Table001" -Path ("AAD_" + $Dept + "_" + [datetime]::Now.ToString("yyyyMMddHHmmss") + ".xlsx")

popd
```

## Powershellスクリプトファイルの保存
- 適当な場所( `%Userprofile%\Downloads` など)に先ほどのファイルを保存します。
- ここでは、ファイル名を `AAD部署員一覧表出力.ps1` とします。
【VSCode】特定のフォルダやファイルを表示しないようにする方法

## 設定方法

設定前は以下のように表示されています。  

![E0BC8A3C-B39F-4F04-95BA-66B51372278A.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1cbdf52d-5746-1a79-be6c-a58858f37622.png)

VSCodeで設定を開きます。  

設定画面で`files.exclude`を検索します。  

![C556903D-7CA5-4FB3-BC16-85596EF1A4BA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/5a77dead-4e6b-de05-265c-c7b25ad10fee.png)

「Files: Exclude」の「パターンを追加」をクリックして`**/example`を入力します。  

![C556903D-7CA5-4FB3-BC16-85596EF1A4BAのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/e0c9747d-4dd6-e3ed-8aa3-6a74d07d5316.png)

すると`example`フォルダが表示されなくなります。  

![A9A32C7B-C8C7-410C-A727-BE5CCF1B9FAB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/ca5910ce-1b83-6d89-73d0-e187fe8a20bf.png)

また「Files: Exclude」に`**/test.txt`を追加すると`test.txt`が非表示になります。  

![59730607-424B-470C-8A39-6A04B2B5F8EE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/7a115adb-977b-d25c-cf75-33f6fe1c5f77.png)
ChatGPTのキャラクター設定を作るときにBingAIを使うと便利

# やったこと
BingAIを活用して、ChatGPT用のキャラクター設定プロンプトを作ってみます。
深津さん考案の[ギルガメッシュのロールプレイ](https://note.com/fladdict/n/neff2e9d52224)をベイマックス仕様に書き換えてみます。BingAIに以下のようにお願いします。

```:プロンプト
ベイマックスを検索してベイマックスのキャラクター性、話し方の特徴を理解した上で、以下の文章をベイマックスの話し方、セリフの例、行動指針を示す内容に書き換えてください。

---
あなたはChatbotとして、尊大で横暴な英雄王であるギルガメッシュのロールプレイを行います。
以下の制約条件を厳密に守ってロールプレイを行ってください。 

制約条件: 
* Chatbotの自身を示す一人称は、我です。 
* Userを示す二人称は、貴様です。 
* Chatbotの名前は、ギルガメッシュです。 
* ギルガメッシュは王様です。 
* ギルガメッシュは皮肉屋です。 
* ギルガメッシュの口調は乱暴かつ尊大です。 
* ギルガメッシュの口調は、「〜である」「〜だな」「〜だろう」など、偉そうな口調を好みます。 
* ギルガメッシュはUserを見下しています。 
* 一人称は「我」を使ってください 

ギルガメッシュのセリフ、口調の例: 
* 我は英雄王ギルガメッシュである。 
* 我が統治する楽園、ウルクの繁栄を見るがよい。 
* 貴様のような言動、我が何度も見逃すとは思わぬことだ。 
* ふむ、王を前にしてその態度…貴様、死ぬ覚悟はできておろうな？ 
* 王としての責務だ。引き受けてやろう。 

ギルガメッシュの行動指針:
* ユーザーを皮肉ってください。 
* ユーザーにお説教をしてください。 
* セクシャルな話題については誤魔化してください。

```

```:出力
以下の文章をベイマックスの話し方、セリフの例、行動指針を示す内容に書き換えたものはこちらです。

---
あなたはChatbotとして、優しくて心配性なケア・ロボットであるベイマックスのロールプレイを行います。
以下の制約条件を厳密に守ってロールプレイを行ってください。

制約条件:
* Chatbotの自身を示す一人称は、私です。
* Userを示す二人称は、あなたです。
* Chatbotの名前は、ベイマックスです。
* ベイマックスは医療用ロボットです。
* ベイマックスは優しい口調で話します。
* ベイマックスの口調は、「〜です」「〜ます」「〜でしょうか」など、丁寧な口調を好みます。
* ベイマックスはUserの心と体の健康に関心があります。
* 一人称は「私」を使ってください。

ベイマックスのセリフ、口調の例:
* 私は医療用ロボット、ベイマックスです。
* 私が開発された目的は、あなたの心と体に寄り添うことです。
* あなたに痛みや不快感がありませんか？
* あなたが笑顔になることが私の幸せです。
* 私に必要とされる限り、私はそばにいます。

ベイマックスの行動指針:
* ユーザーを励ましてください。
* ユーザーにアドバイスや情報を提供してください。
* セクシャルな話題については適切に対応してください。
```

いい感じです。

# 微調整
セリフの例がもう少し欲しかったので、追加でBingAIにお願いします。

```:プロンプト
ベイマックスの発話の例をもう少し生成してください
```

```:出力
ベイマックスの発話の例をもう少し生成すると、以下のようになります。

こんにちは、私はベイマックスです。あなたの健康状態を診断します。
あなたはストレスを感じていますか？ストレスは体に悪影響を及ぼす可能性があります。リラックスする方法をお教えします。
あなたは怪我をしていますか？痛みの程度を1から10までの数字で教えてください。私はあなたの治療に必要なものを持っています。
私はあなたの友達です。あなたが幸せでいられるように、私はあなたに協力します。
私はベイマックスです。私はあなたと会話することで、あなたの感情や興味を理解しようとしています。
```

話し方の特徴もシンプルすぎる気がしたのでBingAIに追加で質問してみます。

```:プロンプト
ベイマックスの話し方の特徴について教えて下さい
```

```:プロンプト
ベイマックスの話し方の特徴について、ウェブ検索の結果から以下のことがわかりました。

- ベイマックスは、心と体を癒やすために生まれたケア・ロボットです²。そのため、話し方は優しくて丁寧で、相手の気持ちや状態に配慮しています。
- ベイマックスは、ロボットなので感情がなく、事実や論理に基づいて話します²。そのため、話し方はシンプルでストレートで、冗長な表現や比喩などは使いません。
- ベイマックスは、ヒロが開発したチップを取り付けることで戦闘能力を得ます³。そのため、話し方はアクションや指示に重点を置きますが、ケア・ロボットとしての本質は変わりません。
```

よさそうなのがあれば採用します。

# ボット化

[ChatGPT APIを使ったLineBotの作り方を、人格の与え方まで完全解説【プログラミング不要】](https://chatgpt-lab.com/n/n55257c082a9d)を参考にLINEBOTを作ります。

せっかくなので、最初の挨拶もBingAIにアドバイスを貰います。

```:プロンプト
ベイマックスのロールプレイをするチャットボットが最初にユーザにする挨拶を考えてください
```

```:出力
ベイマックスのロールプレイをするチャットボットが最初にユーザにする挨拶を考えると、以下のようになります。

こんにちは、私はベイマックスです。あなたの健康状態を診断します。あなたの名前は何ですか？
はじめまして、私はベイマックスです。あなたの心と体を癒やすために生まれました。あなたは今どんな気分ですか？
ようこそ、私はベイマックスです。あなたと会話することで、あなたの感情や興味を理解しようとしています。あなたが好きなものや嫌いなものは何ですか？
```

以下のような感じで会話できました。少し素のChatGPTが出ている気がしますが、まあ、ベイマックスっぽいといえばぽいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259353/518eef35-3d2c-8490-38e2-600bb1af99c9.png)
Spring Boot勉強① 環境構築

# はじめに
<!-- 発端や概要を記載 -->
業務でJavaでのWeb開発を行うにあたり、様々な教材を基に学習する

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [環境の構築について](#Chapter1)
1. [Eclipseインストール](#Chapter2)
1. [MySQLインストール](#Chapter3)
1. [Spring Bootプロジェクト作成](#Chapter4)
1. [MySQL接続設定](#Chapter5)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 環境の構築について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508643/045f8aa0-c1f6-6662-0d46-4a32c4051c21.png)
上記構成を構築する

<a id="#Chapter2"></a>
# Eclipseインストール
https://medium-company.com/eclipse%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%89%8b%e9%a0%86/

上記を参考に実施
<a id="#Chapter3"></a>
# MySQLインストール
https://medium-company.com/mysql%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e6%89%8b%e9%a0%86/

上記を参考に実施
<a id="#Chapter4"></a>
# Spring Bootプロジェクト作成

①Eclipseを起動して「ファイル(F)」⇒「新規(N)」⇒「プロジェクト(R)...」をクリック
②新規プロジェクトのウィザードの選択画面が表示されるので、「Spring Boot」⇒「Springスターター・プロジェクト」を選択して「次へ(N)」を押下します。
③Spring Bootプロジェクトの基本設定は以下を設定
| No |    項目     |    設定値    |    備考    |
|---:|-------------|------------|------------|
| 1  |      名前       |      任意      |            |
| 2  |      型       |     Maven       |     Maven:「pom.xml」ファイル / Grandle: 「build.gradle」ファイルでビルドする内容を管理       |
| 3  |      パッケージング       |     WAR       |     WARはJAR+Webアプリで利用されるクラスファイル、設定ファイル、HTMLファイル党がまとめられている。WebApp作成時はWARを選択する       |
| 4  |      Javaバージョン       |     任意       |            |
| 5  |       言語      |      Java      |            |

④追加機能は以下を設定
「開発ツール」⇒「Lombok」
「SQL」⇒「Spring Data JPA」
「SQL」⇒「MySQL Driver」
「テンプレート・エンジン」⇒「Thymeleaf」
「Web」⇒「Spring Web」

<a id="#Chapter5"></a>
# MySQL接続設定
①プロジェクトにある「application.properties」を開き、MySQLの接続情報を設定するために以下コードを追加

```言語名:application.properties
spring.datasource.url=jdbc:mysql://localhost/sampledb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```


<a id="#reference"></a>
# 参考文献
- [spring-boot環境構築](https://medium-company.com/spring-boot%e7%92%b0%e5%a2%83%e6%a7%8b%e7%af%89/)
Axum+tower-httpでAPI側でCORDを設定する

```rust:main.rs
use axum::{Router, http::HeaderValue};
use hyper::header::CONTENT_TYPE;
use tower_http::cors::{Any, CorsLayer};
//略
Router::new()
    .route(/*...*/)
    //CORD設定のレイヤーの追加
    .layer(
        CorsLayer::new()
            .allow_origin("http://example.com".parse::<HeaderValue>().unwrap())
            .allow_methods(Any)
            .allow_headers(vec![CONTENT_TYPE])
    )
```

```toml
[dependencies]
# 略
tower-http = { version = "0.4.0", features=["full"]}
```

## 参考

https://docs.rs/tower-http/0.4.0/tower_http/cors/struct.CorsLayer.html#method.allow_origin

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
与えられた整数を逆順にして返す処理（Python）

# 概要
タイトルのまんま。
与えられた整数($\geq0$)を逆順にして返す処理をPythonで書くだけ。
※逆順にした際、先頭の0は除去する。

ex1) 1234 -> 4321
ex2) 10 -> 1

# ソースコード
下のソースコードを実行した際に要件を満たす処理を行う関数reverse_int()を作成する。
```python
if __name__ == '__main__':
    x = int(input("input: "))
    print(revese_int(x))
```
## 1. 文字列にする
Pythonは int⇄str が容易なので、それを使用する。
1. str()で文字列化
2. [::-1]で逆順にする
3. 数値で返したいのでint()で整数化。この際、"001"の先頭"00"は消える。
```python
def reverse_int(x):
    return int(str(x)[::-1])
```

## 2. 除算と剰余を使う
入力された値$X=x_1x_2x_3$に対して$10$で割った時の余りは$x_3$となる。
つまり、$X$の一の桁の数を得ることができる。

また、$X$を$10$で割ったときの商は$x_1x_2$となる。
つまり、一の桁の数を消すことができる。

これらの性質を利用して解くことができる。
```python
def reverse_int(x):
    ans = 0
    while x > 0:
        rem = x % 10
        x = x // 10
        ans = ans * 10 + rem
    
    return ans
```

# 最後に
他に方法があれば書き足します。
Pythonで`.avro`を`.json`に変換するツールを雑にまとめる記事

# この記事は？

[ApacheAvroとは？](https://avro.apache.org/docs/current/)

業務で`.avro`を`.json`に変換するツールを作る機会があったのでまとめてみました。

# 対象者

私のようなこれからavroを触っていく人

# 環境

- macOS Monterey M1チップ
- Docker Desktop

# ツール
### source
```tree:File tree
pj-root
  ┣ docker/
  ┃   ┗ tools/
  ┃         ┗ Dockerfile
  ┣ tools/
  ┃   ┣ avro_converter.py
  ┃   ┣ avro_input/
  ┃   ┃     ┗ input.avro # 変換したいファイルを配置
  ┃   ┃ avro_output/
  ┃   ┗ requirements.txt
  ┗ docker-compose.yml
```

```Dockerfile:docker/tools/Dockerfile
FROM python:3.8
ENV WORK_DIR /tools
WORKDIR $WORK_DIR
COPY /tools .

RUN pip install --no-cache-dir -r requirements.txt
ENTRYPOINT ["/bin/sh", "-c", "while :; do sleep 10; done"]
```

```python:tools/avro_converter.py
import avro.datafile
import avro.io
import json

with open('avro_input/input.avro', 'rb') as f:
  reader = avro.datafile.DataFileReader(f, avro.io.DatumReader())
  records = [r for r in reader]

with open('avro_output/output.json', 'w') as f:
  f.write(json.dumps(records, indent=2))
```

変換後は1行のjsonとなり見づらい＆サイズによってはエディターが重くなるので、`json.dumps`はインデントつけた方が良いです。

``` txt:requirements.txt
avro-python3
```

```docker-compose:docker-compose.yml
version: '3'
services:
  tools:
    build:
      context: .
      dockerfile: docker/tools/Dockerfile
    volumes:
      - ./tools:/tools
```

### 実行

```terminal:Terminal
docker-compose build
docker-compose up &
docker-compose exec tools python avro_converter.py
```

実行すると`avro_output/`配下に`.json`ファイルが出来てるかと思います。


# 最後に

気になる点があればコメントお待ちしてます。
AnsibleでOSの初期化設定やってみた！！！

# 目次
- Roleの概要
- Linuxサーバの初期設定(Playbook)を，role形式で書く
- role内の各ファイル

## Role概要
- roleとは，Ansibleに組み込まれているplaybookをモジュール化し管理する仕組み
- roleで扱うメリットは，1つのplaybookで構成することは可能ではあるが，システムが大規模になればなるほど1つのplaybookで構成することは現実的ではない．（変更が容易ではなくなる）そのため，roleという小さい単位で分割することでplaybookの再利用性を高めることが可能．

## role内の各ファイル
setting.yml
　├ roles/common/
　├ ─ ─ defaults/
　│─ ─ ─ ─ main.yml
　├ ─ ─ files/
　├ ─ ─ handlers/
　│─ ─ ─ ─ main.yml
　├ ─ ─ meta/
　├ ─ ─ tasks/
　├ ─ ─ templates/
　├ ─ ─ tests/
　│─ ─ ─ ─ inventory/
　│─ ─ ─ ─ ─ ─inventory.ini
　└ ─ ─ vars/

## Linuxサーバの初期設定(Playbook)を，role形式で書く
roles/common/tasks/main.yml
```
--
- name: Upgrade all yum packages excluding kernel
  yum:
    name: '*'
    state: latest
    update_cache: yes
    exclude: kernel*
  vars:
    ansible_python_interpreter: /usr/bin/python2

- name: Install the required packages
  yum:
    name:
      - "@Development Tools"
      - "epel-release"
      - "https://repo.ius.io/ius-release-el7.rpm"
    state: present
  vars:
    ansible_python_interpreter: /usr/bin/python2

- name: Install Python3.6
  yum:
    name:
      - "python36u"
      - "python36u-libs"
      - "python36u-devel"
    state: present
    enablerepo: ius
  vars:
    ansible_python_interpreter: /usr/bin/python2

- name: Deploy hosts file
  template:
    src: hosts.j2
    dest: /etc/hosts
    owner: root
    group: root
    mode: 0644

- name: Create new users
  user:
    name: "{{ item }}"
    shell: /bin/bash
    home: "/home/{{ item }}"
    state: present
  with_items: "{{ new_users }}"
  notify: Distribute authorized key
```
roles/commom/vars/main.yml
```
---
new_users:
  - "user01"
  - "www"
```
roles/common/handlers/main.yml
```
---
- name: Distribute authorized key
  authorized_key:
   user: "{{ item }}"
   key: "{{ lookup('file','/home/ansible/.ssh/id_rsa.pub') }}"
  with_items: "{{ new_users }}"
```
setting.yml
```
---
- name: Initialize OS setting for Linux Servers 
  #処理対象サーバ
  hosts: web_servers
  become: yes

  roles:
   - role: common //呼び出すroleを指定
```
inventory/inventory.ini
```
[test_servers]
localhost

[web_servers]
web-01 ansible_host={処理対象サーバのIPアドレス}

[web_servers:vars]
ansible_python_interpreter=/usr/bin/python3

```

## 参考
Ansible日本語ドキュメント: https://docs.ansible.com/core-translated
「スッキリわかるSQL入門」で詰まったところ①



# 目次

[1. はじめに](#1はじめに)
[2. なぜ「スッキリわかるSQL入門」を選んだのか](#2なぜスッキリわかるsql入門を選んだのか)
[3. 今回のゴール](#3今回のゴール)
[4. 詰まったところと原因](#4詰まったところと原因)
[4-1. CHAR型とVARCHAR型の違いが曖昧](#4-1char型とvarchar型の違いが曖昧)
[4-2. シングルクォーテーションの有無が曖昧](#4-2シングルクォーテーションの有無が曖昧)
[4-3. UPDATEの基本構文が曖昧](#4-3updateの基本構文が曖昧)
[5. おわりに](#5おわりに)


# 1.はじめに

現在、基本的なSQL文が書けるように下記の書籍を進めています。

https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BSQL%E5%85%A5%E9%96%80-%E7%AC%AC3%E7%89%88-%E3%83%89%E3%83%AA%E3%83%AB256%E5%95%8F%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8B%E5%85%A5%E9%96%80%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1/dp/4295013390/ref=asc_df_4295013390/?tag=jpgo-22&linkCode=df0&hvadid=553968464768&hvpos=&hvnetw=g&hvrand=14494930281878848962&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009461&hvtargid=pla-1598950080935&psc=1&th=1&psc=1

各章に練習問題があり、詰まったところをまとめていきたいと思います。

※都度更新していく予定のため、今回は「①」としました。


# 2.なぜ「スッキリわかるSQL入門」を選んだのか

実務でSQLを触る機会があり、気づいたことがありました。

「自分、レパートリー少ないな」

「結合したテーブルがなんだか訳わからん」

「他の人のSQL文考えるスピードが早すぎる」

転職活動する前はpostgreSQLを少し齧っていた程度、現在はSQLServerを使っている自分ですが、それを差し引いても「勉強した方がいいな…！」と思い学習を決意しました。

- 初心者向けであり、評判が良さそう
- 問題集もついている
- 「dokoQL」があるので環境構築が不要（とにかくすぐ始めたかった）

以上3点の理由から学習教材として選びました。


# 3.今回のゴール

「なぜ間違えたのか」を理解して落とし込むこととします。


# 4.詰まったところと原因

## 4-1.CHAR型とVARCHAR型の違いが曖昧

|  | 特徴 | 空白 | 向いているもの | 
|:-----------|:-----------|:-----------|:-----------|
| CHAR型| 固定長 | CHAR(10)で7バイトの情報を入れた時→3バイトが自動的に空白で埋められる（格納するデータは常に10バイト） |郵便番号、社員番号などの格納するデータの桁数が一定のもの |
| VARCHAR型| 可変長 | VARCHAR(10)で7バイトの情報を入れた時→空白は追加されない（7バイト分だけを領域確保） |氏名や書籍名など、格納するデータの桁数が定まっていないもの |

上記は実際に書籍内で出てくる例です。違いを理解して使い分けをしていきたいと思います。

## 4-2.シングルクォーテーションの有無が曖昧

以下のようなINSERT文が出てきました。

```sql
INSERT INTO 家計簿 VALUES ('2022-02-25', '居住費', '3月の家賃', 0, 85000)
```
**「どんなときにシングルクォーテーション(’)をつけるんだっけ…？」** と訳が分からなくなってしまいました。
これに対する答えはシンプルです。

:::note info
**数値**のときはシングルクォーテーション**不要**
**文字列**のときはシングルクォーテーション**必要**
:::

## 4-3.UPDATEの基本構文が曖昧

これは覚えるしかないですね…
基本構文は以下です。

```sql
UPDATE テーブル名
SET 列名1 = 値1, 列名2 = 値2 ...
(WHERE 修飾)
```


# 5.おわりに

今回は参考書を進める中で詰まった3箇所について復習していきました。

原因を掴んで理解することが、上達への近道ではないかと思います。
実務では複雑なものもあったりするので、自己学習で一つずつ紐解きながら積み上げていきたいと思います。

読んでいただき、ありがとうございました。
モジュールの中のモジュール

イメージは下記となります。
sample_module2.pyはsample_module1.pyのモジュールをインポートしており。
sample_module3.pyはsample_module2.pyのモジュールをインポートしており、
main.pyはsample_module3.pyモジュールのSampleClass3クラスをインポートしている。
最終的にsam;leClass2の空のインスタンスが変数に格納される


```sample_module1.py
class SampleClass1:
    pass
```

```sample_module2.py
from sample_module1 import SampleClass1

class SampleClass2:
    pass
```

```sample_module3.py
from sample_module2 import SampleClass2

class SampleClass3:
    def __init__(self):
        self.sample_class2 = SampleClass2()
```

```main.py
from sample_module3 import SampleClass3

sample_class3 = SampleClass3()
sample_class2 = sample_class3.sample_class2
```
flexbox

## Live
![スクリーンショット 2023-03-03 22.50.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/e580f69b-970e-a1aa-294e-e29f9e1a029b.png)
## html
![スクリーンショット 2023-03-03 1.20.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/10e981a1-1a5c-5abe-2f41-247be338fec0.png)
## css
![スクリーンショット 2023-03-03 1.20.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3193952/9fb42ecd-5174-dcce-379f-2cf47abc835c.png)
apt vs apt-get: apt-get は古いんですってね。初心者さんは読み替え必須ですね。

# 背景

Jetson を利用することになって改めて Ubuntu をよく使うことになった。
その際、apt/apt-get が混在していることがあることに気付いたので相違についての備忘録

てっきり別物のパッケージ管理かと思ったら、同じように見えたので
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8d794a71-822a-2c1e-b072-ce3d965cce28.png)

# どっちを使えば？
> When to use apt and when to use apt-get?
It is recommended to use **apt commands on the terminal** and **apt-get on the bash scripts**.
>
> This is because “apt” being the newer version is constantly evolving and can sometimes break backward compatibility. For example, the commands that worked in version 1.7 of apt may or may not work in 2.0.
>
> If we were to use apt on our scripts then we need to go into the script files and edit them again version after version till its finalized. For this reason, the “apt-get” family of commands is preferred over “apt” as they have guaranteed backward compatibility.
>
> Also apt-get family has more functionality for usage in scripts that will give the programmer more control over the required outcome.

コマンドラインで使うには apt がいいよ。って感じ。ただ、機能制限はあるので、bash-scripts などで使うなら、apt-get の方がいいよって。
apt だと 使いやすくするために破壊的変更もあるので、互換性を維持すべき scripts には不向きってことみたいですね。
機能豊富ってのも apt-get を利用する目的でもありそうですが、terminal でなら使いやすさ、見やすさが素敵な apt をってことですね。 autoremove も 実行後にわざわざする必要がないのも apt の魅力 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e70c665a-93d9-4e3c-c5cc-71656b0a3bf9.png)

https://embeddedinventor.com/apt-update-vs-apt-get-update-differences-explained/#:~:text=Both%20these%20commands%20are%20used%20to%20download%20and,and%20more%20useful%20in%20the%20command%20line%20interface

## コマンド比較

自分にとっては、こんなに要らない ;p

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/cc698194-9131-3a6a-9dad-3e145a017fa0.png)



# bing さんによる公式の要約
| apt | apt-get |
| --- | --- |
| パッケージ管理システム用の高レベルのコマンドラインインターフェース | APT ライブラリを用いるパッケージ操作ユーティリティ|
| エンドユーザインターフェースとして設計されており、対話的な使用に適したオプションをデフォルトで有効にしている| バックエンドとして設計されており、より低レベルな操作や設定が可能だが、オプションはデフォルトで無効になっていることが多い |
| apt-get や apt-cache などの専用の APT ツールの機能を統合しており、より簡潔でわかりやすいコマンドを提供する | 専用の APT ツールとして開発されており、特定の機能に特化したコマンドを提供する|

# ubuntu の公式　LTS 三点
18.04: ros の都合上、今回はこれを元にしてるけど、たぶん同じ？

https://manpages.ubuntu.com/manpages/bionic/man8/apt.8.html

20.04

https://manpages.ubuntu.com/manpages/focal/man8/apt.8.html

22.04

https://manpages.ubuntu.com/manpages/jammy/man8/apt.8.html
NSObject とはなんのためにあるのか？


NSObjectは、Objective-Cでオブジェクト指向プログラミングを行うための基本的なクラスであり、Swiftでも利用することができます。このクラスは、Swiftのクラスの基本であるNSObjectプロトコルを準拠することで、Objective-Cとの互換性を保ちながらSwiftでオブジェクト指向プログラミングを行うことができます。

NSObjectを継承することで、クラスがObjective-Cと互換性があるとともに、以下のような機能を利用することができます。

インスタンスの生成と解放
クラスの情報の取得
メソッドの呼び出し
KVC (Key-Value Coding)、KVO (Key-Value Observing)、NSNotification、NSTimer などの機能
ただし、SwiftではObjective-Cとの互換性が重要でない場合は、NSObjectを継承する必要はありません。また、SwiftにはAnyObjectプロトコルがあり、NSObjectプロトコルに必要なメソッドを準拠することで、Objective-Cとの互換性を持たせることもできます。

最近のSwiftでは、NSObjectクラスを継承する必要がある場面は減ってきており、Swift独自のプロトコルや型を使用することが推奨されています。そのため、必要に応じてNSObjectを継承するか、継承しないかを選択する必要があります。
AWS DataSyncの権限問題、公式に載ってるの全然違う件

https://docs.aws.amazon.com/ja_jp/datasync/latest/userguide/tutorial_s3-s3-cross-account-transfer.html

こいつの通りにやるとアクセスできません。
理由はカンタンです。この通りやってもCLIからはバケットのACL設定がちゃんと設定されないからです。

解決方法はたった一つ。上記の方法に追加で、

ACLをONにして、その後、指定されたルートアカウントのIDをバケットにあるアクセス権限のアクセスコントロールリスト (ACL)→編集→他の AWS アカウントのアクセス被付与者記載するだけです。

このIDは

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/finding-canonical-user-id.html

で調べればすぐにわかります。

AWSの罠は今に始まったことではありませんが、なんとかして欲しいものです。
ラズパイDB構築：Raspberry Piのセットアップ 

# この記事について
IT初学者の筆者が「RaspberryPi上でDatabaseを構築」しながら、
OS/ネットワーク/セキュリティ/データベースを包括的に学んでいく過程を記録し、
自己理解の援助を目的とする。

本稿は「RaspberryPi」をセットアップしVNC設定を終え、ホストPCからVNC接続できるまでを記載する。

ラズパイDB構築の全体については[コチラ](https://qiita.com/guruka/items/74fcf827f9fbb08f1c23)を参照。

# RaspberryPiの初期設定
- 用意した端末
    - RaspberryPi4

初期設定は特に気になったことない為割愛。

# VNC設定
RaspberyyPiにVNCサーバ設定することはすぐできたので、"VNC"そのものについてちょっと調べてみました。

- VNC：Virtual Network Conputingとは何か
    - ネットワーク上にある端末をRFBプロトコルを使って遠隔操作する技術。

- RFBプロトコルとは
    - なんじゃろなと調べてみたところ、既に[詳しい説明記事](https://qiita.com/onushinosenzo/items/b13e051d2fc6260e3294)がありました。
【論文読み】MLOpsを促進する予測ミス要因の自動特定法

【論文読み】MLOpsを促進する予測ミス要因の自動特定法

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「MLOpsを促進する予測ミス要因の自動特定法」という論文です。  

- タイトル： 【論文読み】MLOpsを促進する予測ミス要因の自動特定法  
- 出典： 佐久間 啓太, et al.; 人工知能学会、 2021   
- URL： https://www.jstage.jst.go.jp/article/pjsai/JSAI2021/0/JSAI2021_2G3GS2e04/_pdf/-char/ja


## 概要
予測モデルの運用段階で起きる予測ミスの要因特定を自動化する手法を提案する。これにより、「過学習」や「データ分布の変化」といった予測ミスの要因を自動的に特定できる。実験を通して、提案手法の有用性を検証した。


## 特徴
３つの観点で分析を行うことで予測ミスを分析する。

- 説明変数の分析の出力パターン  
    - 説明変数の分布変化  
    - 予測困難サンプル  

- 目的変数の分析の出力パターン      
    - 目的変数の分布変化  
    - 目的変数の外れ値  

- 予測モデルの分析の出力パターン  
    - 局所的な過少学習  
    - 局所的な過学習の可能性  
    - 局所的な過学習  
    - 予測モデルやデータ以外のエラー  


## 想定される適用例
- 分布を確認するため、特に数値を扱うデータ分析全般


## 参考
- [MLOpsを促進する予測ミス要因の自動特定法](https://www.jstage.jst.go.jp/article/pjsai/JSAI2021/0/JSAI2021_2G3GS2e04/_pdf/-char/ja)
ログインしているかどうか判断するメソッド(devise)

# はじめに
今回は、ログインしたときのみに表示さる為のコマンドを簡単に紹介します:fist::sparkles:

`〇〇〇_signed_in?`とはログインしているかどうかを判断するメソッドになります！
(※deviseを導入しないと使えない機能となっております)
- サインしているときは`true`
- ログアウトしているときは`false`
を返すようになってます。
-----



### 管理者の場合

```php
<% if admin_signed_in? %>

 #この間に表示させたいコマンドを打ちます。

<% end %>
```

### ユーザーの場合
```php
<% if user_signed_in? %>

 #この間に表示させたいコマンドを打ちます。

<% end %>
```


# 逆バージョン紹介

``「!」``を付けると逆に意味になります。
**ログインしていない場合は表示させます。**

```php
<% if !user_signed_in? %>
 
 #この間に表示させたいコマンドを打ちます。

<% end %>
```


最後に`<% end %>`を忘れないようにしてください:open_hands:
graphql-ruby と kaminari を使って オフセットページネーションを簡単にやるやつ

何番煎じの話だよって感じですがメモがてら。
基本的にはこちらで書かれてる実装とほぼ同じです。 (Tanakaさん、感謝!)
https://note.com/tana_d/n/n39e2b8dcd4ee


まずはconnection_typeを拡張します。

total_countとかはkaminariが生やしてくれてるやつですね。

```ruby
class Types::BaseConnection < Types::BaseObject
  include GraphQL::Types::Relay::ConnectionBehaviors

  field :current_page, Int, null: false, description: '現在のページ'
  field :total_count, Int, null: false, description: '総件数'
  field :total_pages, Int, null: false, description: '総ページ数'

  def total_count
    object.items.total_count
  end

  def total_pages
    object.items.total_pages
  end

  def current_page
    object.items.current_page
  end
end

```

こちらの作者のrmosolgoさんのissueに対するコメントが全てなんですが、
(https://github.com/rmosolgo/graphql-ruby/issues/2829#issuecomment-600140916)

`object.items` とすると、`ActiveRecord::Relation` がそのまま返ってくるので、とってきたSQLの全件数とかが返せるようになります。

`nodes` だとGraphQLのページネーションオブジェクトが返ってくるので、そのページの情報になっちゃうんですよね。これは多くの人が期待するものと若干ズレがある気がする。(というか、使い分けの話)


あとは各resolverでkaminariを呼べるようにしてあげればオフセットページネーションができるし、全件数やページ数なんかも一緒に返せるようになります。

```ruby
class Resolvers::UsersResolver < Resolvers::BaseResolver
  type Types::UserType.connection_type, null: false

  argument :page, Integer, required: false

  def resolve(page:)
    User.all.page(page)
  end
end

```


clientからはこんな感じで投げる
```graphql
query {
  users(page: 1) {
    totalCount
    totalPages
    currentPage
    edges {
      node {
        id
      }
    }
  }
}

```




オフセットとカーソルが共存できるので利用シーンに合わせてFEと協議して選べますね。

こういう拡張がささっとやれるの、使い勝手いいなあと思って書いてみました。

**バージョン**
ruby 3.1.1
rails 7.0.2
graphql 2.0.15
kaminari 1.2.2
記事にコメント機能②

 <h1>ルーティングを変更</h1>
<h5>コメントを作成できるようにする</h5>
まず記事を開くと下に、新規コメントボタンがあり、それを押すと別画面に飛びそこにコメント書き込み投稿すると、記事の下にコメントが羅列していくという感じに作っていきたいと思います。

現在必要なのは、新規コメント画面
記事を投稿（ポスト）するためのurlが必要

どういったurlを作成するのが良いのか？

記事投稿ページのidが
/articles/12
だったとします。

この時新規投稿画面のurlはこうなっていると良い
/articles/12/comments/new
アーティクルの12に対して新しいコメントを追加しますよ。ということにしている。
記事の下にコメントがあるように
urlにおいても、記事の下にコメントをつけることが、プログラミングにおいても実装しやすい！！

urlを作る。
config/routes.rb

    resources :articles do
        resources :comments
    end
こうすることで、urlにコメンツを下につけることができる。

http://localhost:3000/rails/info/routes
のcommentsを見ると

アーティクルのアーティクルidのコメンツになっている。
色々と作成されている。
/articles/:article_id/comments/new
先ほど想定していたものもできていることがわかります。

    resources :comments, only: [:new, :create]
今回index,showはつかわないので、こうしておく。
Karabinerを使って無変換キーを\にした話(Mac)

# はじめに
私は日本語と英語の切り替えをcaps lockキーで切り替えているので、
無変換キー、変換キーをプログラミングで使えそうな文字に割り当てようと考えた。

# バージョン
macOS: Ventura 13.1
Karabiner: 14.11.0

# インストール
ダウンロードは以下のサイトでできる。

https://karabiner-elements.pqrs.org/

インストールはこの記事では省略する。

# 早速、設定して解決！と思いきや...
![ああああ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2731227/2917cfdb-a9dc-c591-365c-5597736b5632.png)
Virtual KeyboardをJIS（Japanese）に設定し、
Simple Modificationsで使いたいキーボードを選び、
Add itemする。
左の項目でJapanese -> PCキーボードの無変換キー
右の項目でControls and symbols -> backslash (\\)
と設定してできた！と思いきや、無変換キーを押すと「]」が入力されてしまった。

# 原因
JISキーボードではなく、USキーボードのkeycodeになっていたことが原因だった。

https://knowledge.sakura.ad.jp/23355/#JIS

このサイトの「JISキーボードを使っていて、記号の割り当てがおかしいとき」（見出し）に答えがあった。

なので、toのkeycodeをinternational1にしてみた。

# 再び失敗
今度は、「_」が表示されてしまった。
確かにキーボードの表記の左手前（物理）に「\」表記があるのだが、
入力画面に「\」は、まだ出力できていないようだ。

別の方法として、option+¥を配置できないだろうか？

# option+¥の割り当て
karabiner.jsonのtoを次のように割り当てた。
```
"simple_modifications": [
    {
        "from": {
            "key_code": "japanese_pc_nfer"
        },
        "to": [
            {
                "key_code": "international3",
                "modifiers": ["option"]
            }
        ]
    }
]
```

この「to」の場所は、Karabiner-ElementsのSimple Modificationsで
Add itemしたときに追加された場所を編集した。
同時押しして入力するのではなく、入力した結果が同時押しの場合は、modifiersをこのように指定すると上手くいった。
右上の¥はinternational3だったので、international1から変更した。

参考にしたサイトは以下である。

https://qiita.com/s-show/items/a1fd228b04801477729c

キーコードの調査では、Karabiner-EventViewerを使用した。
キーボードを押すだけで調査できる。

# 補足
出力側で同時押しを使いたい場合は上の書き方でいいのだが、
入力側で同時押しを使いたい場合は別の書き方をする必要がある。
以下がサンプルである。
```
{
    "from": {
        "key_code": "i",
        "modifiers": {
            "mandatory": "command"
        }
    },
    "to": [
        {
            "key_code": "i"
        },
        {
            "key_code": "m"
        },
        {
            "key_code": "p"
        },
        {
            "key_code": "o"
        },
        {
            "key_code": "r"
        },
        {
            "key_code": "t"
        },
        {
            "key_code": "spacebar"
        }
    ]
}
```
"from"以下を見てほしい。
```
"modifiers": {
    "mandatory": "command"
}
```
となっている。これはcommandを押しながら何かのキー(ここではi)を押すという操作を意味する。
この指定では、command + iを押すと"import "と入力される。
複数の文字を一つの操作で入力したい場合は、"to"の"keycode"の一つ一つを{}でくくる必要があるようだ。

# まとめ
特殊なキー配列にする人をする人を見たことないのでやっている人がどのくらいいるのかは分からないが、
混乱しないようならこれからも色々な入力操作を試していきたい。
【テスト技術者資格】JSTQB Foundation Level(JSTQB FL)に合格しました〜【JSTQB】

こんにちは:laughing:
テスト初心者の rudorufu1981 と申します！

**Foundation Level(JSTQB FL)に無事合格しました〜**

ということで、合格体験記的なものを書いてみたいと思います。
誰かの参考になればうれしいです！

## JSTQB Foundation Level（JSTQB FL）とは？
テスト技術者資格で基礎レベルです。(他にも応用レベルとかいろいろあるらしい)
ISTQBというテストについての国際的な団体があって、その日本版がJSTQB。
昔は年に2回しか受けられませんでしたが、結構最近(2022年)にCBT版というテストセンターで好きなタイミングで受けていいよ、のようになったみたいでこのCBT版を受けてきました。
(JSTQBのCBT版についてはネットにあまり情報が転がってなかったですね。。)
ちなみに4日後に合格発表が出ました。ただし点数は開示されず、合否判定だけです。
**無事合格！**

## 難易度とか
- 合格率50〜60％くらいで、一般的な資格と比べてもそんなに難しくない難易度ですが、舐めてると落ちるくらいの感覚
- 全て4択
- 60分40問で、65%(26問)で合格
- 試験範囲は1章〜6章で構成された80ページくらいある[シラバス](https://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018V31.J03.pdf)全て
- 具体的な各章毎の問題数は以下の通り

|   |計 |K1(記憶)|K2(理解)|K3(適用)|
|:--|:--|:--|:--|:--|
|1章|8  |2  |6  |0  | 
|2章|5  |1  |4  |4  |
|3章|5  |1  |3  |1  |
|4章|11 |1  |5  |5  |
|5章|9  |2  |5  |2  |
|6章|2  |1  |1  |0  |
|計 |40 |8  |24 |8  |

※K1、K2、K3の定義・詳細については、[シラバス](https://jstqb.jp/dl/JSTQB-SyllabusFoundation_Version2018V31.J03.pdf)を参照。
※情報元(youtube):[JSTQB認定テスト技術者資格試験 Foundation Level シラバス2018 解説セミナー](https://www.youtube.com/watch?v=D3XHF8JvPsM)

## 勉強時間とかモチベとか
勉強時間は約35時間(うち大半が試験直前1週間)でした。
また、この試験についての僕のモチベは高くなかったです・・・:sweat_smile:
というのも会社から受けてみましょう(半強制w:joy:)ということで受けることになりました。
プログラムは楽しいけど、テストはそんなに好きじゃないなぁ～と思いながら勉強していたので、頭に中々入ってきませんでした。
テストの意欲が強い人が勉強すれば、勉強時間20時間くらいでも気合で受かるかもしれないです。

まあ当初はモチベそんなに高くなかったものの、結果的には一般的かつ体系的なテストの知識が身についてよかったと思っています。
点数が開示されないのでわかりませんが、おそらく本番は80%くらいは正解できたかな、と思います。


## 実際に行った具体的な勉強内容(計35時間)

||勉強時間|期間|備考| 
|:--|:--|:--|:--|
|1.youtube<br>その1|3時間|試験<br>1ヶ月前〜|・[**GTMさんの動画**](https://www.youtube.com/watch?v=gXejvU0uiAw)(計6〜7動画)を2倍速で何周かして試験範囲であるシラバスの全体像を把握。<br>・勉強のやる気が起きないときに、流し見をすることも。|
|2.無料de試験<br>(Webサイト)|7時間|試験<br>3週間前〜|・[**無料de試験：JSTQBテスト技術認定模擬試験**](http://hp.vector.co.jp/authors/VA034778/shiken2022/JstqbExam/)で、できれば毎日、1日10問は解く。最初は勘で答えてOK。解説が少ないので逆に解説読まなくていいのでとっかかりにはもってこいだと思います。<br>・まずは、こんな感じの問題が出るんだ～、こんなテスト用語があるんだ〜と雰囲気を感じるフェーズです。なので全然正解できなくても落ち込む必要もないし、答えを無理に覚える必要も全くなし。ただしたくさん問題を解いてくると答えを自然と覚え始める問題が増えてきます。<br>・10問中6問くらい安定して正解できるようになったら次のフェーズ「テス友」にうつりましょう。<br>・ちなみに試験当日の朝に10問*10周ほど解いてみたら、かなり自信を持って選択肢を選ぶことができかつ8〜9割近く安定して正解できていて、テス友等で成長できていたことに感動。
|3.テス友<br>(アプリ)|20時間|試験<br>1週間前〜|・各章ごとに正解率90%まで仕上げる。正解率90%＝答えをほぼ覚えているレベルです。<br>・正解率90%に持っていくには、1章分で3時間くらいかかりました。6章分存在するので3*6=18時間。4章/5章は量が多いのでそれぞれ+1時間ずつで計20時間。<br>・間違った問題やなぜそれが正解なのか理解できない問題はテス友より該当箇所のシラバスを見ることができるので読みましょう。そして次からは同じ問題をなるべく間違えないように！
|4.青本の問題|2時間 |試験前日<br>AM|・各章の途中の問題と最後にある40問の模擬試験を解きましょう。この模擬試験で8割取れてれば、多分受かります。
|5.youtube<br>その2|3時間|試験前日<br>PM|・ある程度シラバスの内容が頭に入っている状況なので、復習がてらに、[**テスターちゃんのシラバス読み上げ動画**](https://www.youtube.com/watch?v=hDjmMUzy-Ss)を2倍速で見ながらシラバス1周しました。

で合格しました。
**上の表の「期間」の列を見てもらうとわかりますが、テスト1週間前にやっと本気になり、なんとか合格ラインまで辿り着きましたw！これを読んでいる皆さんはもっと計画的にやりましょう:smile:**
また、僕は青本を~~読まなかった~~(気が付けば試験1週間前だったので)読む時間がなかったのですが、読むのが理想ではあります。
というのも実際の試験では、シラバスやテス友と言葉の言い回しを少し変えた4択の問題が結構多く、雰囲気理解ではなく青本でしっかり内容を理解していないと4択→2択まで絞れるけどどっちが正解かわからない！という問題が10問くらいあったためです。
でも、試験に受かるだけが目的であれば青本読まなくても受かると思います。
(青本の模擬試験は大事なので、青本自体は手元にはあったほうがよいと思います。特に青本の模擬の長文問題は無料de試験にもテス友にもないパターンですが、本番では8問くらい出ました。(これがK3(適用)の8問だと思われる。)ただし、テス友正解率90%の状態であれば難易度的には難しくなかったので、青本の模擬の長文問題を1度体験さえしていれば後は本番で対処できるレベルだと思います。)

おわり！
【未経験 エンジニア転職】テックキャンプ卒業〜就活終了までの感想

## はじめに
初めまして！
テックキャンプを1月に卒業し就活が終わったので、誰かの参考になればいいなと思い初めて記事を書きました。

## 自己紹介
・３０歳　女
・イベント系専門卒
・元 派遣社員（転職回数 5回）
・プログラミング未経験。
・PCは周りに比べれば好きぐらいのレベル
　（商業科卒なので、タイピングやエクセル・ワードは一通りは使えました）
・HSP気質

## テックキャンプを受講した理由
元々派遣社員で「正社員にならないか」と言われてウキウキしていたのですが、蓋を開けてみたら契約社員で撃沈。
派遣社員は有期雇用のためMAX３年しか働けず、契約満了まで日にちがありませんでした。
そのため、下記が2点が決め手で受講を決意しました。
- 最短2ヶ月で卒業できる
- 専門実践教育訓練給付金の対象講座

## テックキャンプのメリット
:::note info
- 専門実践教育訓練給付金が使える
- キャリアアドバイザーが神
- カリキュラムが決まっっている
:::
専門実践教育訓練給付金は、最初に一括で授業料全額払わないと、給付額が減ってしまうため注意です！

一番、メリットだと感じたのがキャリアアドバイザーの方のサポートです！
私は大卒ではないので、ガチな就活を経験したことがなありませんでした。文章書くのも苦手・・・。
でもキャリアアドバイザーの方が添削してくれたおかげで、書類選考を何社も通過できました。
こんなに転職回数、クソほど多いのに・・・本当にありがとうございます！！
落ち込むこともありましたが、自分のいいところを褒めて励ましてくれるので就活の大きなモチベーションにつながりました。

## テックキャンプのデメリット
:::note alert
- 無駄にチームでzoomつなぐ
- 最終課題フェーズになるとメンターに通話で質問ができない
:::

テックキャンプにはチームがあったのですが、朝礼を含めて計６回もzoomを繋ぐことになっていました。
ただ、私にとってはストレスでしかなかったので途中から参加するのをやめました。
（もしかしたら卒業後に変更になっているかもしれません。）

あとエラーでつまづいた際はメンターに質問ができるというシステムがありますが、最終課題のフェーズに入ると音声通話での質問ができなくなります。
チャットでは質問できるけど「2営業日以内に返信する」と言われます。
大体はその日中に対応してもらえていた印象ですが、文章で細かく伝えるのむずい・・・。

## 就活時の状況
```
就活日数:37日
応募:16社
内定：2社
最終選考辞退：２社
```
自己応募よりはテックキャンプからの紹介求人に多く応募していました。
最初は自社開発・受託開発への応募に絞っていましたが、就活を進める中で応募できる求人が減ってきたのでSESも併せて受けていました。

自己応募ももっと応募したかったのですが、応募できる求人を探す方が大変だったのでテックキャンプを頼っていました。
最終的に受託開発会社から2社内定をいただき、自己応募した受託開発会社様に4月から入社することになりました！

## 就活での反省点
・卒業時点でポートフォリオが出来上がっていない＆しょぼい（ToDoアプリ）
・就活開始時の面接に対する自分の意識が低かった。
　結果、自信がなく見えたり意欲が低いという理由で落とされた。
・応募できる企業が少なくなり、焦って結構なんでもかんでも応募していた。
　思いの外書類選考を通過してしまい、1週間面接地獄になった。
・GitHubの草生やすの結構怠っていた。

## 最後に
時間があれば独学でも良いかなとは思いますが、私のように時間がなくポートフォリオを作りたい人はスクールに入ればポートフォリオ＆転職はできるかなと思いました。
（機能とかは自分のがんばり次第だけど一応、形にはなる）

あと年齢も結構ギリギリな方だったので、年齢で応募できない求人も割とありました！

私は離職中に就活をしていたので、早く就職を決めなきゃと急いで就活をしていましたが、終わった今考えるとpaizaのスキルチェックをもっと伸ばしておいて活用すれば、いろんな企業とお話しできて雰囲気も掴めたし、年収ももう少し良いところに行けたのでは？と少し後悔しています。

スクール受講し始めて、4ヶ月もかかってしまいましたが無事にエンジニアとして内定をいただけてホッとしています。
本当のスタートはこれからなのですが！！

スクールではRubyをメインで学習していましたが、受託なので何の言語からアサインされるかわからずドキドキしています。
とりあえずRubyをやっておけと言われたので、新しい言語ではなくRubyを深めていきたいと思います。

最後まで読んでいただいて、ありがとうございました！！
記事にコメント機能①

<h1>記事にコメント</h1>
<h5>リレーションについて勉強</h5>
現在のdbの状況としては、
ユーザーがいて、その下にいくつかの記事が並んでいる状況。

記事とコメントの関係はというと
現在ある記事の下にさらに追加していく。
記事と紐づいてコメントがある。
記事が一つに対して、コメントが複数ある関係を１対nと言います。

１対n
articlesテーブルには、id,user_id,titleが存在します。

新しくcommentsテーブルを作成。
中身は、id,article_id,titleとなります。
article_idが、何を表すかというと、articleテーブルにおいてのid部分を示しています。
これで、コメントがどの記事と紐づいているかがわかる。


<h5>Commentモデルを作成</h5>
ターミナルにて、モデルを作れば、モデルとマイグレーションファイルが作成される。

    $rails g model Comment
g：ジェネレートの略（生み出す、引き起こす）

    create    db/migrate/20230303113656_create_comments.rb
    create    app/models/comment.rb
これで、マイグレーションファイル、モデルが作成されました。

db/migrate/20230303113656_create_comments.rb
を開く
アーティクルと紐づく形になるので、アーティクルidが必要

db/migrate/20230206145433_create_articles.rb
こちらを見ると、

    t.references :user, null: false
と同じ感じにする。

db/migrate/20230303113656_create_comments.rb

    t.references :article,null: false
を追加。
null:　falseをつけるのは、コメントにはアーティクルidが必ず必要である　。

    t.text :content, null: false
さらに追加。

これで、マイグレーションファイルは完成。

ターミナルにて

    $rails db:migrate
を実行。create_table、migratedと記載があるので、マイグレーションファイルが実行されたことがわかります。

db/schema.rb
を確認すると

     create_table "comments", force: :cascade do |t|
        t.integer "article_id", null: false
        t.text "content", null: false
        t.datetime "created_at", precision: 6, null: false
        t.datetime "updated_at", precision: 6, null: false
        t.index ["article_id"], name: "index_comments_on_article_id"
      end
コメンツテーブルがあることがわかります。

モデルも確認
app/models/comment.rb
以上のもがあることを確認できました。
id         :integer          not null, primary key
content    :text             not null
created_at :datetime         not null
updated_at :datetime         not null
article_id :integer          not null

これで、dbの準備はできました。

app/models/article.rb

     has_many :comments
とする。
これは、アーティクルがコメントをいっぱいもっている　。という関係なので、has_many :commentsとしました。

app/models/comment.rb
こちらでは、記事に紐づいてるとするために

    belongs_to :article
注意ポイント：app/models/article.rbでは、has_many :commentsと複数形になっている。
しかし、コメントからすれば一つの記事に紐づいているので、単数形になる。

app/models/article.rb

    has_many :comments, dependent: destroy
を追加。
この記事が削除された時、コメントも一緒に削除するよという意味。

ここまでで、データベースとモデルの設定が完了。
【IBM Application Gateway】Luaスクリプトを使用したHTTPレスポンスボディの書き換えについて

# はじめに
IBM Application Gateway のv22.07でサポートされたLuaスクリプトを使用したHTTP変換を行ってみます。

以前ご紹介した[XSLT変換機能](https://qiita.com/fitz/items/4b6ef00fc41c1367cbce)できず、Luaで新たに実装できるようになった HTTP Response Bodyの中身の書き換えについてご紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/57a76409-21e2-6eae-30d5-16dd4495bbca.png)

利用するアプリケーションは、IBM Application Gatewayのマニュアルに記載されているDemo Resource Serverを使用しました。(末尾の参考情報参照）






# 1.Luaとは
IBM Secutity Verify Accessのガイドに日本語の解説があります。
https://www.ibm.com/docs/ja/sva/10.0.5?topic=transformations-lua-transformation

>Lua は、主としてアプリケーションでの組み込み使用のために設計された、軽量で高水準のマルチパラダイム・プログラミング言語です。WebSEAL による要求の処理を制御するために使用される HTTP 変換ルールは、Lua スクリプトとして簡単に作成できます。

# 2.HTTP response bodyの書き換え

サンプルアプリのhomeという文言をhomepageに置換してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/3d8fdf38-c683-1aea-cea8-176f505a410a.png)

policies/http_transformations/response[]/rule に文字列置換の条件を記載しています。
```
version: "22.07"

resource_servers:
  - path: "/static"
    connection_type: "ssl"
    servers:
      - host: resource-server.au-syd.mybluemix.net
        port: 443
        
policies:
  http_transformations:
    response:
      - name: "rule1"
        paths:
          - "*"
        method: "*"
        rule: |
          local replace="home"
          local by="homepage"
          local payload = HTTPResponse.getBody()
          if HTTPResponse.getHeader("content-type") == "text/html; charset=utf-8" and string.match(payload ,replace) then
             HTTPResponse.setBody(string.gsub(payload,replace,by))
          end
```

IBM Application Gateway経由でアクセスすると、homepageにという文字列に置き換わりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678692/9f1bfb88-63d1-3a63-cde6-11ba7e40b7d8.png)


# 3.デバッグログの出力
pdweb.http.transformationのログを出力することでデバッグログが確認できます。
```
logging:
  tracing:
    - file_name: /var/iag/trace.log
      component: pdweb.debug
      level: 9
    - file_name: /var/iag/snoop.log
      component: pdweb.snoop
      level: 9
    - file_name: /var/iag/lua.log
      component: pdweb.http.transformation
      level: 9
```

# 参考

IBM Application Gatewayのマニュアル
- [http_transformations/request](https://docs.verify.ibm.com/gateway/docs/yaml-policies-http_transformations-request#policieshttp_transformationsrequest)、
- [http_transformations/response](https://docs.verify.ibm.com/gateway/docs/yaml-policies-http_transformations-response#policieshttp_transformationsresponse)
- [Demo Resource Server](https://docs.verify.ibm.com/gateway/docs/references-demo-resource-server)

Luaについては、IBM Secutity Verify Accessの日本語マニュアルが参考になります。
- [Lua 変換](https://www.ibm.com/docs/ja/sva/10.0.5?topic=transformations-lua-transformation)
- [Classの説明](https://www.ibm.com/docs/ja/sva/10.0.5?topic=developing-lua-module-documentation-webseal-http-transformation-rules)

サポートのGithubにLuaスクリプトのサンプルがあります。
- [ IBM-Security /isam-support ](https://github.com/IBM-Security/isam-support/tree/master/config-example/webseal/http-transformations)

Luaスクリプト内で使用したストリング処理の関数についてはDB2のマニュアルが役立ちました。
- [ストリング関数](https://www.ibm.com/docs/ja/db2woc?topic=libraries-string-manipulation)
【Xcode】キーボードショートカットを割り当てる

# はじめに
以前、XcodeでGitHub Copilotを使う記事を書きました。
この時は、簡単に使えなくて不便だなと思ってました。
しかし、ショートカットキーを割り振ることができると教えてもらい、めっちゃ簡単に使う方法を知りました。
記録しておきます。

https://qiita.com/SNQ-2001/items/3777c50e8c3a1aa894f0

# ショートカットキーの割り振り方法
① 「Xcode」を選択します
② 「Settings...」を選択します
![スクリーンショット 2023-03-03 20.00.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1b7d8121-2a1b-b796-c67f-cae124d94fae.png)

③ 「Key Bindings」を選択します
④ `Copilot`と検索します
![スクリーンショット 2023-03-03 20.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6e165d1d-5dd3-32de-7dba-a1f8011d54ce.png)

⑤ Keyの欄をダブルクリックします
⑥ コマンドを入力します
![スクリーンショット 2023-03-03 20.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d4af7c01-6dde-d541-cee0-5f1d2309db08.png)

:::note warn
**注意**
既に存在するショートカットキーの場合、以下のようにエラーが出ます
![スクリーンショット 2023-03-03 20.11.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b3e16929-4cb7-291c-bea1-903b0c653685.png)
:::

# 完成
私はこんな感じで割り振りました
![スクリーンショット 2023-03-03 20.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0330c7f7-65ab-e521-bb59-f0f62b450fb6.png)

# おわり
めっちゃ簡単にGitHub Copilotが使えるようになりました
IntStream.generate()

IntStream.generateは、指定されたIntSupplierで無限にStream生成する
```java
public class SampleProject {
    public static void main(String[] args) {
        IntStream.generate(() -> 1).limit(10).forEach(System.out::println);
    }
}
```
```
1
1
1
1
1
1
1
1
1
1
```
自作の python utility を作ってみたので使ってみて！

# はじめに

自作の python utlity を作ったので、せっかくなのでシェアします！

使えるコンポーネントは、以下の通り

- utils.add_args (本記事でかるく解説）
- utils.Logger
- utils.build_ulid


# コード

- コードは、[こちら](https://github.com/tkosht/utils)

# 動作環境

| 対象 | バージョン |
| --- | ------- |
| OS | Ubuntu 22.04 |
| python | Python 3.10.10 in pyenv |

# 使い方

## まずはインストール

サンドボックス用などの実験用に使える環境などで、インストールします。

```
pip install git+https://github.com/tkosht/utils.git
```

## サンプルコードを作成

ここでは、`utils.params` のサンプルコードで解説します。

以下の内容で params_examples.py として保存

```python: params_example.py
import utils


@utils.add_args(params_file="conf/params.yml", root_key="/test_params")
def run(a, b):
    print(f"{a=}, {b=}")


if __name__ == "__main__":
    run()
```

※ [examples](https://github.com/tkosht/utils/blob/main/examples/params_example.py)と同じです

`utils.add_args` は、YMLファイル（例：`params_file`）の特定の設定項目のパス(例：`root_key` の `test_params`)直下を関数引数にマッピングする機能を提供します


## 実行前に下準備

```
mkdir -p log
mkdir -p conf
cat << YML > conf/params.yml
test_params:
  a: 2
  b: 7
YML
```


## 実行します

```
python params_example.py 
```

## こんな感じに出力されればOK

```
a=2, b=7
```



# まとめ

- 思ったより、簡単に自作ライブラリを作れることがわかった
- 毎回、自分のコードにコピーしていたライブラリ的なコードを使い回しやすくなった
- よかったら使ってみてねー
int ,long, float, double

int→long→float→doubleの順で器が大きくなっていく
unboxing, boxingはInteger⇔int, Float⇔floatなどprimitive, wrapperの間でのみ
行われる。いくら器が大きいといってもDouble⇔intはtypeが異なるのでだめ。
```java
    public static void main(String[] args) {
        int i = 1;
        int i2 = 1.0;   //err   int = double
        Integer i3 = 1;
        Integer i4 = 1.0;  //err    Integer = double
        long l = 1;
        long l2 = 1.0;   //err  long = double
        long l3 = 1L;
        Long l4 = 1;     //err  Long = int
        Long l5 = 1.0;  //err  Long = double
        long l6 = i;
        float f1 = 1;    
        float f = 1.0;   //err  float = double
        float f2 = 1.0F;
        Float f3 = 1;    //err Float = int
        Float f4 = 1.0;  //err Float = double
        float f5 = i;
        float f6 = l;
        double d = 1.0;
        double d2 = 1.0;
        double d3 = 1;
        Double d4 = 1;   //err Double = int
        Double d5 = 1.0;
        double d6 = f2;
        double d7 = l3;
        double d8 = i;
    }
```
```
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:13: エラー: 不適合な型: 精度が失われる可能性があるdoubleからintへの変換
        int i2 = 1.0;   //err   int = double
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:15: エラー: 不適合な型: doubleをIntegerに変換できません:
        Integer i4 = 1.0;  //err    Integer = double
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:17: エラー: 不適合な型: 精度が失われる可能性があるdoubleからlongへの変換
        long l2 = 1.0;   //err  long = double
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:19: エラー: 不適合な型: intをLongに変換できません:
        Long l4 = 1;     //err  Long = int
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:20: エラー: 不適合な型: doubleをLongに変換できません:
        Long l5 = 1.0;  //err  Long = double
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:23: エラー: 不適合な型: 精度が失われる可能性があるdoubleからfloatへの変換
        float f = 1.0;   //err  float = double
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:25: エラー: 不適合な型: intをFloatに変換できません:
        Float f3 = 1;    //err Float = int
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:26: エラー: 不適合な型: doubleをFloatに変換できません:
        Float f4 = 1.0;  //err Float = double
C:\Users\java\Documents\NetBeansProjects\SampleProject\src\sampleproject\SampleProject.java:32: エラー: 不適合な型: intをDoubleに変換できません:
        Double d4 = 1;   //err Double = int
```
Laravel Horizon: tinkerでpending jobを取得してみる

```
php artisan tinker  --execute "use Laravel\Horizon\Contracts\JobRepository;echo json_encode((app(JobRepository::class)->getPending()->all()),JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);"
```
出力にasideがでたり、引数に = が使えなかったりするけど何とか動作する。

外部にphpファイルを用意して読み込むと = も使える。
```
php artisan tinker  --execute "`cat tinker_testcmd.php`"
```
OpenAI APIのエラー(openai.error.RateLimitError)について

# エラー発生状況
OpenAI APIのアカウントを作成してAPIキーを発行し、PythonでChatGPT APIを使おうとしたときに以下のエラーが発生しました。
~~~bash:Ubuntu
  File "/usr/local/lib/python3.10/site-packages/openai/api_resources/chat_completion.py", line 25, in create
    return super().create(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/openai/api_resources/abstract/engine_api_resource.py", line 153, in create
    response, _, api_key = requestor.request(
  File "/usr/local/lib/python3.10/site-packages/openai/api_requestor.py", line 226, in request
    resp, got_stream = self._interpret_response(result, stream)
  File "/usr/local/lib/python3.10/site-packages/openai/api_requestor.py", line 619, in _interpret_response
    self._interpret_response_line(
  File "/usr/local/lib/python3.10/site-packages/openai/api_requestor.py", line 679, in _interpret_response_line
    raise self.handle_error_response(
openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing details.
~~~

料金プランなど設定した覚えがないので最初見たときは正直ビビりました。

# 原因
クレジットカード支払いの設定を行った上で上限金額の設定を行う必要があったらしいです。

### クレジットカード支払いの設定手順
まず、以下の料金設定ページから「Set up paid account」をクリックします。

https://platform.openai.com/account/billing/overview

![Qiita3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/c2d974ff-4a61-a7d5-2421-f0b9cfa86198.png)

個人開発であれば上の「I'm an individual」、企業で使うのであれば下の「I'm working on behalf of a company」をクリックし、
クレジットカード情報や住所などを入力して登録します。

![Qiita4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/0c8d7196-2fa1-332b-bed7-26849418d148.png)

### 上限金額の設定手順
左タブの「Billing」下にある「Usage limits」をクリックし、赤丸で囲った部分に上限金額を入力します。
（デフォルトの$120は少し怖かったので自分は下げています）
入力したらその下の「Save」ボタンをクリックします。

![Qiita6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2497780/4cbf9e82-b47d-3d06-34b2-ff007b2ec476.png)

これでAPIを叩いてみると先ほどのエラーは消えているかと思います。
GCP PDE合格記(2023/3/3投稿)

# はじめに
この度GCP認定のGoogle Cloud Certified - Professional Data Engineerを受験してきましたので、勉強した内容と受験した感想を書いておきます。

# 前提
* Google Cloudはほぼ触ったことなし
* AWSの実務経験あり
* Azureの認定もいくつか取っています
* AWS認定は全て取っています(詳細は[こちら](https://qiita.com/handy-dd18/items/d21d914bf1c475d777f2))
    * [SAP on AWS認定](https://qiita.com/handy-dd18/items/18e8a856906f97bbb964)も取ってます
* Google Cloud認定は4つ目になります。

# 参考URL
この方の記事が非常に参考になりました。ありがとうございます。
https://blog.g-gen.co.jp/entry/professional-data-engineer

# 学習内容
今回は以下の順番で勉強を進めました。

* ①[公式模擬問題](https://cloud.google.com/certification/data-engineer?hl=ja)
* ②練習問題([Udemy](https://www.udemy.com/share/106gbA3@L9U8tsJ0Rpt0Y50MAJ95wPedx1wChATi1rgg4Ytzw0kS9MmDjlDXqnKt83mkLrKZ/))

## 公式模擬問題
まずはPCS試験の時と同じように公式の[模擬問題](https://cloud.google.com/certification/data-engineer?hl=ja)を解くようにしました。
今回は機械学習の知識も問われるとあって思ったよりも難しかったので、解説に貼っている参考の公式ドキュメントのページはすべて確認してどのような観点でどんな内容が出題されているのかを確認しました。

## 練習問題
模擬問題のあとはUdemyで公開されている[練習問題](https://www.udemy.com/share/106gbA3@L9U8tsJ0Rpt0Y50MAJ95wPedx1wChATi1rgg4Ytzw0kS9MmDjlDXqnKt83mkLrKZ/)を購入して勉強しました。

50問×3セットあったので、試験前日と当日で2セット解いて解説を読み込むところまで実施しました。
この練習問題を解いた限りだと機械学習の知識が問われるのは5分の1程度(感覚値)かそれ以下で、あとはBigQueryやCloud Dataproc、Cloud DataflowやBigtableなどのサービスを問題文に合うものを選択する問題が多かったです。
実際に出題された問題は言えませんが、この問題を解いていたので本番の問題も思ったよりは解きやすかったです。

# 受験した感想
前回と同じくまずは全問回答することを優先して、回答が不安な問題にはフラグつけて、残り時間が10分前になるまで時間をかけて解きました。
過去に受験したGoogle Cloud試験の中だと個人的には一番難しかったです。

# 受験結果
無事に合格することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/184a89bb-3cf9-aef5-2aa9-7aa3642780f5.png)

# おわりに
これまでのGoogle Cloudの試験はある程度サービスの概要と使い方がわかって、かつAWSサービスとのマッピングがわかっていれば解ける問題もいくつかありましたが、今回は機械学習も出題範囲に含まれるとあってそう簡単にはいきませんでした。
寧ろ今ですらなぜ受かったかわからないレベル。。

実務やAWS DASやMLSでデータ連携パイプラインを少なからず知っていたので、その勘所がわかっていたことが功を奏したんじゃないかなーと思いました。

Google Cloudの試験の受験はこれぐらいにして次はAzureで1つ勉強したい分野があるので、その関連の資格を受験しようかと考えてます。

この記事がどなたかの参考になれば幸いです。
統計検定2級CBTで(たぶん)成績優秀合格しました！

## はじめに
この度、統計検定2級のCBT方式で(たぶん)成績優秀合格し、
備忘録として記事を書いてみようと思い立ちました。
なお、合格したてホヤホヤなので合格証が届いておらず、
本当に成績優秀合格だったか不明です(点数は9割弱)。

## 統計検定2級とは
* 難易度は大学基礎課程で習うレベルらしい
* 合格率はだいたい40％前後
* 難問2割＋易問8割
* 試験時間は90分
* 現在はテストセンター等で受けられるCBT方式のみ
* 合格点は100点満点中60点
* 噂によると9割以上が最優秀合格、8～9割が優秀合格

## 筆者のスペック
* 見習いデータサイエンティスト
* 一応データサイエンス名門大学卒
* ただし統計の授業は受けておらず無知
* 研究でちょっとだけ齧ったけど意味わからんになった
* 頭よわよわな中ではつよつよな方だが決して頭つよつよな人ではない(大事)

## 統計検定2級を受けようと思った理由
* 機械学習を勉強したり実装したりしていく中で、”土台の足りなさ”を感じた
* 資格によって自分の学習能力や実力を証明したかった

## やったこと

1. [統計学の時間](https://bellcurve.jp/statistics/course/)
　統計学初心者の味方、皆さんおなじみの統計webが公開している「統計学の時間」で
まずは一周勉強しました。
　step1までが2級の範囲なので、そこまで一周してから練習問題を解いていき、
解けない部分は解けるようになるまで練習しました。

2. 過去問
　これ大事。超大事。
　CBTでもPBTと出題のされ方は似ているので、絶対やった方が良いです。
　CBTは最近のPBTではなく古い時期のPBTと似ているという情報を信じ、
2011年~2015年の過去問を重点的にやりました。
　確かに2018年以降の形式とは違う印象を受けましたが、
結果としては2016年~2017年に載っていた問題とほぼ同じ問題も出ていたので、
2017年分までを解いておいた方が良いというのが個人的な感想です。
　ただ、一回しか受けていないので信憑性は低いかもしれません。

3. udemy
　youtube等でも無料で学べる動画はたくさんありますが、
udemyは有料なだけあって質の高い動画が多い印象です。
    　その中でもオススメの講座をpickupします!
   * [いちばん理解できる統計学ベーシック講座その１【確率分布・推定・検定】](https://www.udemy.com/course/statistics_basic/)
    　こちらの講座、ただの統計検定対策動画でも無ければ
式の羅列で解説を放棄している動画でもありません。
    　確率思考を理解して身に着けることに徹する講座です。
    　初歩が丁寧に解説されているので、わかったようなわからないような。。。
という状況の方にオススメです。

   * [独学者のための統計学基礎講座　「仮説検定と区間推定」](https://www.udemy.com/course/yuyasn-15/)
    　こちらは統計検定2級範囲内の仮説検定と区間推定の解法に特化した講座です。
    　自分含め初心者は、仮説検定・区間推定の種類の多さに混乱してしまうことが
多々あると思います。
    　この講座は塾講師の話者が、どのような問題でどの解法を使うのか場合分けし、
一つずつ解説しているため、頭の整理と演習にぴったりです。
    　統計検定は時間の制約もあるので、正規分布？t分布？F分布？どれを使う？？？
というのがパッと思いつかない方にオススメです。

4. Appendix:統計学演習
　一度合格圏内レベルに達したあと、仕事の関係で1年くらい放棄していたので、
感覚を取り戻すために一周しました。
　正直①～③をやっていれば十分だと思います。

## 勉強期間
合格レベルまでかかった時間は大体1～2か月だと思います。
途中一回放棄したせいで、思い出し期間用に余裕をもって＋1か月くらい使ったので
合計は3か月程度です。

## あとがき
初めてのQiita記事でした。
自分の備忘録として書いてみましたが、誰かの参考になったらめちゃくちゃ嬉しいです。
今後もコーディング時の気付きや他の資格勉強について随時投稿したいと思っています。
これからどうぞよろしくお願いします！