OmniAICreator/Qiita-1.07M huggingface dataset:
Power Queryでスマートに連番を振るカスタム関数

# Power Queryでスマートに連番を振るカスタム関数

**ほとんどの Power Query エンジニアは、グループ毎に連番を振るときに必須となる Table.Group() 関数の仕様が入れ子テーブルを含めてテーブル全体の順序を保証しない事を知りません。
少なくともこの記事を投稿している時点では、このカスタム関数がグループ毎に正確な連番を振ることが出来る唯一の方法だと思います。**

https://github.com/takeyamajp/PowerQuery-IndexRowsForEachGroup
https://github.com/takeyamajp/PowerQuery-IndexRowsForEachGroup/blob/main/README.ja.md （日本語説明）

このライブラリーでは、正確に思った通りの並び順で連番を振ることが出来ます。
さらに、このライブラリーは列の型情報を完全に保持します。

## カスタム関数の説明
- **IndexRowsForEachGroup**(`table` as table, `key` as anynonnull, `comparisonCriteria` as anynonnull, optional `newColumnName` as nullable text) as table
グループ毎に、指定した並び順で連番を振ります。

- **CountRowsForEachGroup**(`table` as table, `key` as anynonnull, optional `newColumnName` as nullable text) as table
グループ毎の行数をカウントします。

- **IndexGroups**(`table` as table, `key` as anynonnull, `comparisonCriteria` as anynonnull, optional `newColumnName` as nullable text) as table
指定した並び順でグループに連番を振ります。

- **CountGroups**(`table` as table, `key` as anynonnull, optional `newColumnName` as nullable text) as table
グループ数をカウントします。

- **IndexRows**(`table` as table, `comparisonCriteria` as anynonnull, optional `newColumnName` as nullable text) as table
各行に連番を振ります。
（標準関数のTable.Sort()とTable.AddIndexColumn()を組み合わせただけのオマケ関数です。）

- **CountRows**(`table` as table, optional `newColumnName` as nullable text) as table
行数をカウントします。
（標準関数のTable.RowCount()とTable.AddColumn()を組み合わせただけのオマケ関数です。）

## コードサンプル
~~~
let
    Source = #table(type table[Region = text, Country = text], {
        {"Asia", "Australia"}, 
        {"Asia", "China"}, 
        {"Asia", "India"}, 
        {"Asia", "Japan"}, 
        {"Europe", "France"}, 
        {"Europe", "Germany"}, 
        {"Europe", "United Kingdom"}, 
        {"North America", "Canada"}, 
        {"North America", "United States"}
    }),
    Custom1 = IndexRowsForEachGroup(Source, "Region", {"Region", "Country"}, "INDEX1"),
    Custom2 = CountRowsForEachGroup(Custom1, "Region", "COUNT1"),
    Custom3 = IndexGroups(Custom2, "Region", {"Region", "Country"}, "INDEX2"),
    Custom4 = CountGroups(Custom3, "Region", "COUNT2"),
    Custom5 = IndexRows(Custom4, {"Region", "Country"}, "INDEX3"),
    Custom6 = CountRows(Custom5, "COUNT3")
in
    Custom6
~~~
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76564/ea4b9ed3-7c8f-4eaa-bf0d-3d66939a8b1e.png)
Finder でフォルダのクイックアクションに「ファイルを作成」を追加する

Mac に標準搭載されている自動化ツールである Automator を利用します。

コード以外の部分については以下の記事を参照してください。

https://qiita.com/Masahiro_T/items/d979fa6889f02d245ec3


```bash:シェルスクリプト
# フォルダへ移動
cd $1

# ファイル名を入力
filename=$(
	osascript -e 'display dialog "ファイル名を入力" default answer "" 
    set the filename to text returned of the result
    return filename'
)

# ファイル名が入力されているかチェック
if [[ $filename = "" ]];
then
    osascript -e "display dialog \"ファイル名が空です。\" with title \"エラー\" with icon caution buttons {\"OK\"} default button 1"
    exit
fi

# ファイルを作成
touch $filename
```
Laravelでrouteメソッド使用する時、routes/web.php でのname()の記述方法

bladeファイルで、href属性にrouteメソッドを持たせた時、route/web.phpでルーティングにnameメソッドをつける必要がある。（つけないとエラー出る）
大きく２つの記入方法がある。
<br>

使用するbladeファイル
```php:home / user_manual.blade.php
@section('content')
    <div>
        <a>この画面はご利用ガイドです。</a><br>
        <a href="{{ route('home.mypage') }}">マイページへ戻る</a>
    </div>
```

<br>
<br>

１つ目：
各ルーティングにnameメソッドを記述する。
```php:routes / web.php
Route::controller(After_login_Controller::class)->prefix('home')->group(function(){
    Route::get('mypage','mypage')->name('home.mypage'); 
    Route::get('user_manual','user_manual')->name('home.user_manual');
});
```

こうすることで、マイページへの遷移が可能だが、
２つのnameメソッドでどちらも'home'を記述していることから冗長性を感じられる。
<br>
２つ目：同じ記述箇所をまとめる
```php:routes / web.php
Route::controller(After_login_Controller::class)->prefix('home')->name('home.')->group(function(){
    Route::get('mypage','mypage')->name('mypage'); 
    Route::get('user_manual','user_manual')->name('user_manual');
});
```
<br>
※余談<br>
laravelの画面遷移手法として、urlメソッドとrouteメソッドを使用する方法を習ったが、ふと何か使い分けとかあるのかなと思いメンターに質問したところ...
→「無い！どっちでもいい！」

まじか(笑)。ただ少し使った感じrouteメソッドの方がしっくりくる感じがしたので統一使用しようと思う。
E資格の勉強振り返り

E資格 2023#1を受験して合格したので、勉強法をまとめておきます。
前提として、G検定、統計検定2級、統計検定データサイエンス発展の資格は取得済みからの受験です。

## 受験の経緯
- データアナリスト職についており、機械学習やディープラーニングに興味はありつつも、実務機会なし
- 会社の推奨資格になっており、資格取得で評価が上がる&受験費用の補助が受けられる
の2点から受験をしようと決めました。

## 使用教材
1. [ラビットチャレンジ](https://ai999.careers/rabbit/)
1. [ゼロから作るDeep Learning](https://amzn.asia/d/fA1Jmtr)（通称:赤本）
1. [ゼロから作るDeep Learning ❷ ―自然言語処理編](https://amzn.asia/d/aielRIG)
1. [徹底攻略ディープラーニングE資格エンジニア問題集 第2版](https://amzn.asia/d/9ihg6t9)（通称:黒本）

## 勉強法
E資格は受験のために認定プログラムの受講を修了することが必須となっています。
この講座が結構重く、合格率が70%前後と資格試験の中でも比較的高い合格率になっている要因のように思います。
したがってまずは講座を修了して受験資格を得ることが目標となります。

私が受講した認定プログラムはラビットチャレンジという講座で、講義動画による授業+レポートのフィードバックや質問環境がない代わりに認定資格の中でも比較的安価な講座です。試験範囲は網羅されているため疑問点を調べながら独学で勉強が進められる方にはおすすめです。

今回使用した教材の進め方としては
1. ラビットチャレンジのレポートとテストを進めながら、補助教材として赤本を活用
1. 受験資格を取得してから問題集（黒本）を1周、間違った部分について復習
という流れで勉強しました。

## 受験結果
■分野別の得点率
応用数学：100 ％
機械学習：89 ％
深層学習：66 ％
開発環境：75 ％

結果としては上記の結果となり、なんとか合格できました。

## 所感
肝心の深層学習部分については66%とまだまだ伸びしろがありそうです。
今回は問題集を1周しかできていないので2,3周することでさらに知識は定着できただろうと思います。
最近ではChatGPTやStable Diffusion等、AIの民主化が急速に進んでおり、その基礎となっているディープラーニングについて学べる良い機会となりました。
進化が著しい分野なのでシラバスは今後も更新され続けていくと思いますし、資格取得後も勉強し続けていく必要があると感じます。
何でも　「.method_name」だからといってメソッドというわけではなかった

以下はSwiftでの例

```Swift
extension String {
    func hasAudioFileExtension() -> Bool {
        let audioExtensions = ["mp3", "m4a"]
        let fileExtension = (self as NSString).pathExtension.lowercased()
        return audioExtensions.contains(fileExtension)
    }
}

// Example usage:
let filePath1 = "/path/to/file.mp3"
let filePath2 = "/path/to/file.txt"
let isAudioFile1 = filePath1.hasAudioFileExtension() // true
let isAudioFile2 = filePath2.hasAudioFileExtension() // false

```

メソッドと見分けはつかないが、別物である。
【GitHub】GitHubでコードを見るときは

# はじめに
この間、教えてもらって衝撃を受けたGitHubの機能を記事にしておきます。

# やりかた
リポジトリを開きます。

![スクリーンショット 2023-03-11 20.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/86ae2101-72e7-fc6b-dd57-04edc1c0b9d3.png)

キーボードで`.`を打ちます。

![スクリーンショット 2023-03-11 20.36.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e8b19a2a-b3c7-9140-9278-aa68be9cffcd.png)

# おわり
この機能めっちゃ便利！
今までフォルダのURLを開いて中身を見てました笑
【NestJS】グローバルで使用するモジュールを別途class定義せずapp.moduleにグローバルの設定する

## 概要
NestJSでグローバルで使用できるModuleを設定する場合、`@Global`のアノテーションを付けてclassの定義をする方法が挙げられます。
ただ、ライブラリ等で用意されているModuleはclassの定義をせずに、グローバルの設定を付与したい時はあります。今回はその方法をメモ書きします。

## 対応方法
[動的モジュール](https://zenn.dev/kisihara_c/books/nest-officialdoc-jp/viewer/overview-modules#%E5%8B%95%E7%9A%84%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)の機能を使用します。importする際に`global: true`の設定を付与すれば実現できます。


## 設定サンプル
サンプルとして、`HttpModule`をapp.moduleでglobal設定するものは、以下のようになります。

```typescript
import { HttpModule } from '@nestjs/axios';
import { Module } from '@nestjs/common';

@Module({
  imports: [
    {
      global: true,
      module: HttpModule,
    },
  ],
})
export class AppModule {}
```
Finder でフォルダのクイックアクションに「code-workspace ファイルを作成して開く」を追加する

Mac に標準搭載されている自動化ツールである Automator を利用します。

以下の手順で行います。

- Automator を開く

- 「新規書類」を押す

- 「クイックアクション」を選択

![スクリーンショット 2023-03-11 午後8.08.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/6513ca6a-ba45-a485-fb1c-3f969ab35862.png)

- 左ペインの「ユーティリティ」>「シェルスクリプトを実行」を右にドラッグ&ドロップ
- 各種設定：
   - 入力の引き渡し方法：引数として
   - ワークフローが受け取る現在の項目：フォルダ
   - 検索対象：Finder
- 以下のコードを記述

```bash:シェルスクリプト
# フォルダの中に移動
cd $1

# フォルダ名
folder_name=$(pwd | sed -e 's/\/.*\///g')

# code-workspace ファイル名
filename=$folder_name.code-workspace

# code-workspace ファイルがすでに存在しているかチェック
if [ -e $filename ]; 
then
    # 存在していればエラーを出して終了
    osascript -e "display dialog \"$filename はすでに存在します。\" with title \"エラー\" with icon caution buttons {\"OK\"} default button 1"
    exit
fi

# code-workspace ファイルを作成
echo "{
	\"folders\": [
		{
			\"path\": \""../"$folder_name\"
		}
	],
	\"settings\": {}
}" > $filename

# ワークスペースを開く
open $filename
```

![スクリーンショット 2023-03-11 午後8.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/354c2609-a3d6-a6c5-01dc-013b1fbd3f09.png)

- cmd + s で保存
  名前は「code-workspace ファイルを作成して開く」

これでクイックアクションに「code-workspace ファイルを作成して開く」が表示されるようになるはずです。

![スクリーンショット 2023-03-11 午後8.30.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/dd06c5cf-0fa5-2785-810c-7caa3841875a.png)

![スクリーンショット 2023-03-11 午後8.31.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178570/4b65c3f4-f476-fa14-6830-a71eb95ee6f3.png)
GoogleDriveから大きなファイルをタイムアウトせずにダウンロードする（ノーコード）

:::note warn
この方法は2022年12月時点で有効だった方法です．最新の状況もご確認のうえご利用ください．
:::

# はじめに
- Google Driveの有料プランやGoogle Workspaceを使っていると，かなり大きいファイル（100GB超とか？）をアップロードすることがあるかもしれない．[^1]
- こういったファイルをブラウザでダウンロードしようとすると，途中でタイムアウトになってしまってダウンロードに失敗することが多々ある．
- APIを使ってコーディングで解決する方法はあるかもしれないが，知らない人には説明しにくいし，心理的ハードルが高いかもしれない．
- そこで，Google Driveアプリを使ってノーコードでこれを解決する．

# 準備
- 使用するPCのメインストレージ（windowsでいうところのCドライブ）に，ダウンロードしたいファイルサイズ（ダウンロードしたいファイルが複数ある場合はその合計ではなく，ファイル1個のサイズ．より正確には，ダウンロードしたいファイル達の中で最大のファイルサイズ）分の空き容量を作っておく，
- 実際のダウンロード先がポータブルSSD/HDDやNASなどの外部ストレージであっても，メインストレージにこの空きがあることが必要（もちろん，これらのダウンロード先にも十分な空きが必要）．
- 「フォルダ」のサイズは関係ない．

# 手順
- google driveアプリをインストールする．https://www.google.com/intl/ja_jp/drive/download/
- アプリを起動し，アカウントでログインする．
- ドライブが仮想フォルダとしてPCに表示される．この時点ではデータがローカルにダウンロードされるのではなく，ストリーミングされている．
- ダウンロードしたいファイル/フォルダを保存したい場所（外付けストレージなど）にコピー＆ペーストする．
- ファイル転送が始まる．保存したい場所（外付けストレージなど）にファイルが書き込まれると同時に，メインストレージ内の見えない場所にも一時的にファイルが書き込まれる．[^2]
- 1つファイル転送が完了すると，メインストレージの空き容量が復活して，次のファイル転送が始まる．

[^1]:ちなみに，お使いのGoogleのサービスプランにもよるが，このような大きなサイズのファイルのアップロード自体は，上限はあるが可能である．(2023/3/11閲覧）
https://support.google.com/a/answer/172541?hl=ja

[^2]:仕組みは不明だが，キャッシュとして保存されていると思われる．リソースモニタなどを見て，メインストレージの空きが減っていくことでこれがわかる．
確定申告WIP

# 準備
- マイナンバーカード

# freee操作

- freeeにログイン
- 前年度の年度締めをする
- 確定申告書を作成ボタンをクリック
- １年分の口座を同期させて明細データをインポート
- 明細データから取引一覧を作成
    - 取引日：2022年1月〜今日まで
    - 「入金」を整理
        - 勘定項目：売上高
        - 取引日が入金日になっているので請求月にする
    - 「出金」を整理
        - 取引内容の名前で検索して経費の分類ごとに登録処理を行う
        - 該当しない明細データは全て無視
- その他保険などを登録
- 確定申告書を提出

# 納税
-  pay-easyから納税

「収納機関番号」：国税庁の番号である「00200」を入力しましょう。
「納付番号」：納付番号は16桁の利用者識別番号
「確認番号」：開始届けで入力した納税用確認番号
「納付番号」：
https://www.e-tax.nta.go.jp/tetsuzuki/tetsuzuki4_3.htm

例：確定申告に基づく平成29年分の申告所得税を支払う場合の納付目的コードは「0204429」となります
例：確定申告に基づく令和2年分の申告所得税を支払う場合の納付目的コードは「0204502」となります
例：確定申告に基づく令和3年分の申告所得税を支払う場合の納付目的コードは「0204503」となります

コード：意味
020:申告所得税
4:確定申告
5:令和
03:和暦

参考：ネットバンキング　入力方式について
https://ztakani.com/post-9453

- 納税額を入力
- 納税
「第1章　バンディット問題とは」を読み解く

本項は、「本多淳也・中村篤祥著　バンディット問題の理論とアルゴリズム」の第1章を開設した分である。第1章は、あまり数式がなかったために、言い換えとなっている部分もある。

## 多腕バンディット問題とは

とある選択肢を選択すると、報酬が得られるとする。複数の選択肢（腕）を有限回の回数選び、得られる報酬を最大化しようとする時、どのように選択肢を選べばよいだろうか？

ここで問題なのは、選択者は各腕の報酬がどのように決まるかがわからない、という問題である。たとえば、いかなる状況設定にも関わらず一定値の報酬が得られるならば、各腕を1回ずつ選択し、報酬を確認してから報酬を最大化する腕を選べばよい。しかし、各腕が確率的に（平均10、分散2.5の正規分布に従う、など）ふるまうときは、問題がややこしくなる。どれが報酬が最大の腕なのかがわからなくなるのである。

## 選択者の方策の評価方法

今、多腕バンディット問題において、腕が$n$本あるとし、全部で$T$回選択できるとする。時刻$t(=1,\cdots,T)$において、$i(=1,\cdots,n)$番目の腕の報酬を$X_i(t)$と表す。

すると全部で$T$回行ったときの報酬の総和、つまり**累積報酬**は
```math
    X_{i(1)}(1) + \cdots+ X_{i(T)}(T)
    =
    \sum_{t=1}^T X_{i(t)}(t)
```
となる。ただし$i(t)$は、$t$回目に選ばれる腕である。

ここで選択者の方策を評価したいとしよう。普通に考えれば各回における報酬の最大値
```math
    \max_i {X_{i}(1)} + \cdots+ \max_i {X_{i}(T)}
    =
    \sum_{t=1}^T \max_i {X_{i}}(t)
```
を考えれば、全試行における報酬を最大化できそうだが、これでは目標として高すぎる。そのため各回ではなく、報酬を最大化する腕を事前に1つだけ選ぶことで代替する。
```math
    \max_i \{X_{i}(1)+ \cdots+ {X_{i}(T)}\} 
    =
     \max_i \sum_{t=1}^T{X_{i}}(t)
```
上記と累積報酬の差は、**リグレット**
```math
    \mathrm{Regret}(T)
    =
    \max_i \sum_{t=1}^T{X_{i}}(t) - \sum_{t=1}^T X_{i(t)}(t)
```
と呼ばれ、バンディット問題においてはこれを最小化することを考える。

**期待リグレット**と
```math
    E[\mathrm{Regret}(T)]
    =
    E\left[ \max_i \sum_{t=1}^T{X_{i}}(t) - \sum_{t=1}^T X_{i(t)}(t) \right]
```
**擬リグレット**と
```math
    \overline{ \mathrm{Regret} } (T)
    =
   \max_i  E\left[  \sum_{t=1}^T{X_{i}}(t) - \sum_{t=1}^T X_{i(t)}(t) \right]
```
との間には、不等式
```math
    \overline{ \mathrm{Regret} } (T)
    \leq
    E[\mathrm{Regret}(T)]
```
が成り立つ。
> 忘備：この不等式は未証明。


## 用語

- 腕：選択肢、アーム(arm)とも。選択者が特定の腕を選ぶと、報酬がもらえる。私はできるだけ外国語を音のまま訳すのを良しとせず、語義をきちんと日本語に訳すのが良いと思っているので、これからは「腕」と表記する。
- 選択者：プレイヤーとも。腕を選び、報酬を受け取る主体。
- 探索：どの腕が報酬を多く出しやすいか、探ること。
- 知識活用：最も報酬を出しやすい腕を選択し、合計の報酬を増やそうとすること。
- 方策：ポリシーとも。選択者がどのように腕を選ぶかという戦略のこと。
- 確率的バンディット：各腕の報酬が何らかの確率分布に従って生成されること。
- 敵対的バンディット：選択者の方策を知っている敵対者が報酬を決めること。

---
書籍の紹介

https://qiita.com/goto2023/items/124637c4378fe002dbb9
初期値問題「[演習]微分方程式4(体系大学数学)」をwolframalphaとsympyでやってみたい。

グラフがでました。
?X>1をどこで使うのか教えて下さい。
?私には、wolframで違いがわかりませんでした。入力は、あっていると思います。
よろしくお願いします。

オリジナル

https://youtu.be/84t0h5cluBI

# wolframで

https://www.wolframalpha.com/input?i=y%27%3Dy%2Fx%2B%E2%88%9A%281%2By%2Fx%29%2Cy%28e%29%3D3e&lang=ja

私のパソコンで、「標準の計算時間制限を超えました...」でます。
mathematicaでは、でないかもしれません。未確認。
ますます、わからなくなりました。

**微分方程式の解**

https://www.wolframalpha.com/input?i=y%28x%29+%3D+1%2F4+x+%28log%5E2%28x%29+-+10+log%28x%29+%2B+21%29&lang=ja

https://www.wolframalpha.com/input?i=y%28x%29+%3D+1%2F4+x+%28log%5E2%28x%29+%2B+6+log%28x%29+%2B+5%29&lang=ja

**?点検**
なんと言いますか？正しい表現をおしえて下さい。
体系的に学ぶ大学数学様の解より

https://www.wolframalpha.com/input?i=y%27-%28y%2Fx%2B%E2%88%9A%281%2By%2Fx%29%29++on+y%28x%29+%3D+x+%281%2F4log%28x%2B3%29**2+-+1%29&lang=ja

https://www.wolframalpha.com/input?i=y%27-%28y%2Fx%2B%E2%88%9A%281%2By%2Fx%29%29++on+y%EF%BC%9D1%2F4+x+%28log%5E2%28x%29+-+10+log%28x%29+%2B+21%29&lang=ja

https://www.wolframalpha.com/input?i=y%27-%28y%2Fx%2B%E2%88%9A%281%2By%2Fx%29%29++on+y%28x%29+%3D+1%2F4+x+%28log%5E2%28x%29+-+10+log%28x%29+%2B+21%29&lang=ja

# sympyで
できませんでした。できるような気がしました。

```python
from sympy import *
x = Symbol  ('x',real=True)
y = Function('y')(x)
bibinhoteisiki=Eq(diff(y),y/x+sqrt(1+y/x))
ans=dsolve(bibinhoteisiki)
print("#(1)",ans)
bibinhoteisiki2=bibinhoteisiki.subs({y:ans.rhs})
print("#(2)",bibinhoteisiki2.lhs.simplify()-bibinhoteisiki2.rhs.simplify())
print("#(3)",bibinhoteisiki2.lhs.simplify()-bibinhoteisiki2.rhs.simplify())
print("#(4)",(bibinhoteisiki2.lhs-bibinhoteisiki2.rhs)         .simplify())
#?...
```

できませんでした。できるような気がしました。
初期値問題

```python
from sympy import *
x = Symbol  ('x',real=True)
y = Function('y')(x)
ans=dsolve(Eq(diff(y),y/x+sqrt(1+y/x)),ics={y.subs(x,E):3*E})
print("#",ans)
plot (ans.rhs)
#NotImplementedError: Initial conditions produced too many solutions for constants
```
VSコードの仮想環境からJupyterNotebookを開くには

# Jupyter Notebookを開きたい理由
元々デスクトップアプリ？としてAnaconda Navigatorとかってやつを入れて、そこからJupyter Notebookを開いていたんだけど、いつの間にかアプリの欄から姿を消して1週間。「アプリとか作れないじゃん！」と思ってたけど、あるお方の助言により、VSコードで仮想環境を作って、そこからJupyter Notebookが開けることが発覚。早速やり方を調べて実行してみた。

# やること
1. VSコードに仮想環境を立ち上げる
1. 仮想環境には何もダウンロードされていないので、jupyterをインストールする
1. そしたらjupyterと打ち込むこれで立ち上がる

# 感想
非常に荒い説明でした。てか、コードの貼り付けをしたいんだがまだまだ使い方に慣れてなくて思うように使えない。特にこんなことで悩んでる人はいないと思うんですけど、もし困ってたらChatGPTに「こんなこと言ってる人がいるんだけど、本当にできるの？」って聞いてみてください笑
ChatGPTでQiitaの記事を書かせてみた

ChatGPTで記事が書けるかなと思って、以下の通りに命令してみました。

```
Qiitaの記事を書いてみて。
```

すると以下の通り記事が返ってきました。

```
はい、以下にQiitaの記事を書いてみます。

タイトル：「効率的なタスク管理術について」

はじめに：
タスク管理は、仕事や日常生活において非常に重要なスキルです。しかし、多くの人がタスクをうまく管理できず、ストレスや生産性の低下につながってしまうことがあります。本記事では、効率的なタスク管理術について紹介します。

ToDoリストの作成
タスク管理の基本中の基本として、ToDoリストを作成することが挙げられます。ToDoリストは、やるべきタスクを整理し、優先順位をつけることができます。また、完了したタスクをチェックすることで達成感を得ることもできます。

Eisenhower Matrixの活用
Eisenhower Matrixは、タスクの緊急度と重要度を分析するためのツールです。四分割されたマトリックスにタスクを振り分けることで、どのタスクに優先度を置くべきかを判断することができます。

タイマーを活用したタイムマネジメント
タスクにかける時間を決めて、タイマーを設定することで、タスクを集中的にこなすことができます。また、定期的に休憩を取ることも重要です。タイマーを活用することで、集中力を維持し、ストレスを減らすことができます。

カンバンボードの活用
カンバンボードは、タスクを「やるべき」「進行中」「完了」というステージに分けて管理する方法です。タスクの進捗状況を可視化することで、タスクの把握や管理がしやすくなります。

自分に合ったツールの選択
タスク管理には、多くのツールが存在します。自分に合ったツールを選択することで、より効率的なタスク管理ができます。例えば、ToDoリストアプリやタイマーアプリ、カンバンボードアプリなどがあります。

まとめ：
本記事では、効率的なタスク管理術について紹介しました。ToDoリストの作成やEisenhower Matrixの活用、タイマーを活用したタイムマネジメント、カンバンボードの活用、自分に合ったツールの選択などが挙げられます。
```

人が書いたのか見分けがつきませんね。すごいことです。

ちなみに追加で以下の命令をしてみました。

```
Qiitaの記事を「ChatGPTでQiitaの記事を書かせてみた」というタイトルで書いてみて。
```
すると以下のように本記事のタイトルに対応する記事を作ってくれました。

```
はい、以下に「ChatGPTでQiitaの記事を書かせてみた」というタイトルのQiitaの記事を書いてみます。

タイトル：「ChatGPTでQiitaの記事を書かせてみた」

はじめに：
近年、自然言語処理技術の進化により、様々な分野で人工知能の活用が進んでいます。本記事では、OpenAIが提供する大規模言語モデル「GPT」を利用し、Qiitaの記事を自動生成する実験を行いました。

GPTとは
GPT（Generative Pre-trained Transformer）は、自然言語処理において高い精度を持つ大規模言語モデルです。OpenAIが開発したGPT-3は、数億単語を学習し、高度な文章生成や言語理解を行うことができます。

Qiitaの記事を生成する実験
本実験では、GPT-3を用いて、テーマ「効率的なタスク管理術について」のQiita記事を自動生成しました。GPT-3にテーマを与え、文章の長さや言語表現の傾向を指定することで、自動生成された記事を得ることができました。

自動生成された記事の評価
自動生成された記事は、テーマに関する内容が正確に反映され、適切な言語表現でまとめられていると評価されました。ただし、文章の流れや表現の一部に不自然な箇所があるため、完全に自動生成された記事としては不十分な部分もあります。

GPTの活用による可能性
GPTを活用することで、テーマに沿った記事の自動生成が可能になります。また、膨大な情報量を持つGPTを活用することで、多岐にわたる分野の知識を取り込んだ記事を生成することもできます。しかしながら、人工知能による自動生成の限界もあり、人間の文章にはない感性やクリエイティブな表現は生み出せません。

まとめ：
本記事では、OpenAIが提供する大規模言語モデル「GPT」を活用し、Qiitaの記事を自動生成する実験を行いました。GPTを活用することで、テーマに沿った記事の自動生成が可能になる一方、人間の感性やクリエイティブな表現を生み出すことは難しいという限界もあることを確認できました。
```

ChatGPT面白いですね。以上、ご報告でした。
EspressoのUIテストでアクティビティを開始する

# 初めに

UIテストは書いたことがなかったので、右も左もわからない状態です
とりあえず、動いたので記事に書いてみます

# Activityの起動

テストを書き始めようとしましたが、Activityの起動方法がわからない…
アプリが起動して自動でUIを操作してテストしてくれる　というイメージでしたが、画面に何も表示されずテストが停止していました。

Activityを起動するにはandroidTestと書かれているフォルダ内を見て、

```
@RunWith(AndroidJUnit4::class)
class FeatureTest {

    val mActivityRule = ActivityScenarioRule(MainActivity::class.java)
    @Rule get

}
```

とテストを実行するクラス内に記述しました
これを書くことで各テストの関数実行時にActivityを起動してくれるようになりました

# Baristaを導入

素のEspressoではテストコードの記述が面倒なようなので、楽に記述できるBaristaというライブラリを導入しました

build.gradleに以下dependenciesを追記

```
dependencies {

    androidTestImplementation('com.adevinta.android:barista:4.2.0') {
        exclude group: 'org.jetbrains.kotlin'
    }
}
```

これで特定のViewをクリックしたいとき、
```
clickOn(R.id.button)
```
のようにIDを指定して簡単にクリック操作を記述できます


Baristaのリポジトリ：

https://github.com/AdevintaSpain/Barista

# テスト関数を書く

実際にUIの操作などを書いていきます

麻雀の点数計算をするアプリを作っていたので、SpinnerやSwitch、ボタンのクリック操作を記述。
assertDisplayedでTextViewに表示される文字列をチェックしています

```
@RunWith(AndroidJUnit4::class)
class FeatureTest {

    val mActivityRule = ActivityScenarioRule(MainActivity::class.java)
    @Rule get

    @Test
    fun show_tsumo_child_3fann30fu_result(){
        clickRadioButtonItem(R.id.calculateSwtichGroup, R.id.tsumoSwitch) // Switchをクリック

        clickSpinnerItem(R.id.fannSpinner, 2) // Spinnerで0から数えて2番目のアイテムをクリック
        clickSpinnerItem(R.id.fuSpinner, 2)
        clickOn(R.id.resultButton) // 指定のボタンをクリック

        assertDisplayed(R.id.resultText, "1000 - 2000") // TextViewに表示される文字列をチェック
    }
}
```

こうすることでテスト実行時にアプリが起動し、自動で操作を行い結果をテストできました

ただ、R.idでidを指定する際にUnresolved referenceが出ており、補完などもできませんでした、なぜ…？

# 終わり
Espressoはほぼ書いたことがないため、この書き方であっているか自信がありません
ActivityScenarioRuleでいろいろできそうですが、どう使うかはまだピンときていません
とりあえず動いたので、使いながら確認していきます…
【ChatGPT×LINE】ホメホメAI🤗チャットボットを作ってみた

# はじめに
皆さん、こんにちは。ChatGPTのAPIが公開されて続々といろんなサービスが展開されていますね。
AIの民主化が進み、初学者でも様々な開発ができて喜ばしい限りです。
今回は、初学者でもChatGPT、GAS、LINEを利用して **「どんなネガティブなコメントにもポジティブに返してくれるホメホメAI」** を作成できましたのでそれを紹介します。

# きっかけ
社会人になって、褒められることないな…って思いませんか？
会社で人一倍頑張ってプラスアルファの仕事をしたのに、上司からはスルーされて、業績評価にも反映されず。
本当に自分は価値ある仕事をしているのかと思ってしまうことがありました。

仕事だけでなく、掃除、洗濯、料理といった家事も頑張っているのに、褒めてくれる人がいない。
**はぁ～つらい。私は何のために頑張っているんだろう・・・** 
そんなときAIでも褒めてくれたらなぁ。

そんなある日、ChatGPTとLINEを組み合わせたら褒めてくれるのではないかと思い、
いてもたってもいられずとにかく手を動かして作ってみました。

# ホメホメAI
![ホメホメ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/c04aae48-a116-ecf2-aa38-1f09b245011b.png)

すご～！！めっちゃ褒めてくれるじゃん！！相手がAIだと分かってても嬉しい✨
しかも、「死にたい」とかどんなネガティブなコメントにもポジティブに返して専門家まで紹介してくれる。
素晴らしい・・・。

# 手順
こちらを参考にさせて頂きました。

https://qiita.com/daigo_38/items/f5b329364e177a340bbb

簡単な流れとしては
1.LINE Developersの登録とアクセストークン発行
2. OpenAI登録、APIキー発行
3. GASでプログラム実行

変更した部分のみ掲載します。

```Java
 //api設定パラメータ
  const openAiParams = { 
    "headers": openAiHeaders, 
    "method": "POST",
    "payload": JSON.stringify({
      "model": "gpt-3.5-turbo",//ChatGPTモデルの設定パラメータ
      "max_tokens": 512,//返信トークン数の最大値
      "temperature": 0.9,//返信の”硬さ”
      "messages": [
        {"role": "system", "content": 
    "こちらを変更"}, 
        {"role": "user", "content": requestMessage}
      ]
    })
  }
```

# ホメホメAIに愚痴ってみた

![ホメホメ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/e6d309e7-e683-33b2-9f54-0c983e058c89.png)

![ホメホメ３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2874461/df71da45-3fde-ee95-743b-70c70eb74efd.png)


泣きそうなんですけど～～～
ホメホメAI優しすぎる～～
会社も家庭もこんな平和な世界線ならいいのに。

ちょっと愚痴りたいとき、会社でうまくいかないとき、家事でストレス溜まっているとき
ホメホメAIがいればちょっと救われる！！

単なるストレス軽減AIではなく、自殺予防にも役立てられないかと考えています。
厚生労働省が公開している自殺相談窓口の「いきづらびっと」というLINEボットは対応時間が決まっており、土日は対応頂けず、「今すぐ助けてほしい」という人を救えないのではないかと感じています。
▼いきづらびっと

https://page.line.me/eds9972b?openQrModal=true

そんなときに**24時間対応できて温かい言葉で励ましてくれるAIがあれば、救える命もあるのでは**と考えています。
多くの人に利用して頂きたいのですが、chatGPTのAPIが従量課金のため、自己負担が大きく、LINEを公開できておりません。
素人なのでサービスの運用方法が分からず、個人開発でサービスを展開されている方がいらっしゃいましたら、どのようにサービスを運用しているのかコメントいただけましたら嬉しいです。


多くのストレスを抱えた方々に対して、ホメホメAIが癒しになるような存在になれたらと思います。



ブログへ移行中⇒https://yurufuwa-ai-engineer.com/
[WordPress][Docker]インストール直後のおまじない

# WordPress立ち上げ時に必ずハマるやつまとめます。
またはまるの必至なので。

起きる現象：
1. ファイルサイズMaxを超えています。
2. ディレクトリ wp-content/uploads/xxx を作成できません。
3. httpsの表示がおかしい。
などなど

## おまじない１: php.iniのMaxサイズ変更

```php:php.ini
upload_max_filesize = 30M
post_max_size = 30M
```

## おまじない２: wp-contentフォルダ以下のアクセス権の変更
```sh:wp-contentフォルダ
>cd wp-content/
>chmod -R 707 .
```

## おまじない３: wp-config.phpに設定追加
```php:wp-config.php
define('FS_METHOD', 'direct');
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS'] = 'on';
```

以上。
Neo4j環境構築【サーバ編】

# 目的
最終的な目的はFastAPIからグラフデータベースをアクセスする試験を行うこと。
今回はDBサーバにNeo4jの環境を構築した。今後は、WebサーバのFastAPIからアクセスできるようにする。

# 環境
|名称|バージョン|
|---|--:|
|RedHat EnterpriseLinux|8.7|
|Java(OpenJDK)|17|
|Neo4j|5.5.0|

# インストール
## Java17(OpenJDK)
```
# dnf -y install java-17-openjdk java-17-openjdk-devel
# alternatives --config java
# java --version
```
:::note info
Oracle Java17を使用する場合は、アダプタを追加インストールする必要があるようなので注意
https://neo4j.com/docs/operations-manual/current/installation/linux/rpm/
:::

## Neo4j
```
# rpm --import https://debian.neo4j.com/neotechnology.gpg.key
# vi /etc/yum.repos.d/neo4j.repo
```
```/etc/yum.repos.d/neo4j.repo
[neo4j]
name=Neo4j RPM Repository
baseurl=https://yum.neo4j.com/stable/5
enabled=1
gpgcheck=1
```
```
# dnf install neo4j-5.5.0
```

## 設定編集
別サーバからアクセスできるようにするため設定変更
```diff:/etc/neo4j/neo4j.conf
-#server.default_listen_address=0.0.0.0
+server.default_listen_address=0.0.0.0
```
:::note info
デフォルトではhttp(ポート7474)とBoltプロトコル(ポート7687)で待ち受けしている。
ポートの変更及び、プロトコルを変更する場合は、下記の設定を変更する。
```
# Bolt connector
server.bolt.enabled=true
#server.bolt.tls_level=DISABLED
#server.bolt.listen_address=:7687
#server.bolt.advertised_address=:7687

# HTTP Connector. There can be zero or one HTTP connectors.
server.http.enabled=true
#server.http.listen_address=:7474
#server.http.advertised_address=:7474

# HTTPS Connector. There can be zero or one HTTPS connectors.
server.https.enabled=false
#server.https.listen_address=:7473
#server.https.advertised_address=:7473
:::

## パスワード変更
```
# neo4j-admin dbms set-initial-password パスワード
```
:::note warn
neo4jの下記ページでは`neo4j-admin set-initial-password`とあるが、5.5では`neo4j-admin dbms set-initial-password `でないとエラーになる。
マニュアルの更新遅れか？
https://neo4j.com/docs/operations-manual/current/configuration/set-initial-password/
:::

:::note infod
set-initial-password はDB初回起動前に行う。起動後に変更する場合、パスワードファイル`/var/lib/neo4j/data/dbms/auth.ini`を削除することで対応できる。
:::

## RHEL8のポート開放
```
# firewall-cmd --add-port=7474/tcp --permanent
# firewall-cmd --add-port=7687/tcp --permanent
# firewall-cmd --reload
# firewall-cmd --list-port
7474/tcp 7687/tcp
```

## サービス起動
```
# systemctl start neo4j
# systemctl status neo4j
# systemctl enable neo4j
```

## ブラウザで確認
http\://サーバのアドレス:7474/browser/
IDはneo4j、パスワードは先に設定したパスワードでログインできることを確認する。


# 参考
https://neo4j.com/docs/operations-manual/current/installation/linux/rpm/

https://qiita.com/tharashi/items/28e700d165eba771d90d

https://goodbyegangster.hatenablog.com/entry/2021/07/12/003536
[chatGPT]AIで人格を読み取る: 会話から分析する方法

 

## 概要
- 人工知能が人物像を読み取ることが出来るとされ、その中でもchatGPTというAIを使用することで、人の口調や行動指針、制約条件を抽出することができる。
- また、本記事ではchatGPTの応用例として、人格チャットボットを作る際に必要な会話分析について解説する。

## 内容
- chatGPTについての基礎知識の説明
- 会話から人物像を読み取る方法について解説
- 人格チャットボットの作り方について具体的に解説

## 背景
chatGPTに仮想の人格をロールプレイさせることが流行しています。
仮想の人格は、行動指針や口調、制約条件を与えられます。
そこで、対話ログから人物像、行動指針、口調、制約条件を抽出できる技術を考えました。
[chatgpt apiをつかったAIカウンセラーをつくりました](https://qiita.com/tregu148/items/98d00a97cb9ca542b897)

## プロンプト
```
下記の会話はAAAAとBBBBの会話である。AAAAについて人物像、行動指針、制約条件、セリフ例を抽出して、マークダウン形式でまとめて。

[会話]
```

![Screenshot 2023-03-11 18.57.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486826/38e39bc8-7cf6-9341-2261-89f259d1c158.png)

```
人物像：
の会話からは、ユーモアのセンスがあり、人柄が良いと感じられる。
技術やAIに興味を持っており、新しい事業に取り組む姿勢がある。
業務に真剣に取り組む一方で、冗談を交えた会話もできる。

行動指針：
制約を設けつつも、AIであるChatGPTのポテンシャルを見出し、可能性を探る。
新しい事業に取り組むため、業務に対しては早く正確に取り組む。

制約条件：
制約により、何らかの制限が設けられているが、具体的には言及されていない。

セリフ例：
「うちのこは、制約を固くしてるのですが、chatgptのポテンシャルはあります（笑）」
「汎用AIは汎用すぎて、セキュリティが甘いという罠が（笑）」
「□□□□の新規事業できました（笑）」
```

## 結論
- 会話分析はAIを用いることで、より精度の高い情報を取得することが出来る。
- 人格チャットボットを作成する際には、chatGPTを使用した会話データの解析が必要であり、その効果に期待が持てることがわかった。
husky(v8当時)セットアップ手順

バージョンによって、設定方法が異なるようだったのでメモを残しておきます。

以下公式なので、最新情報は以下参照してください。

https://typicode.github.io/husky/#/?id=automatic-recommended

## install

```sh
yarn add husky --dev
```
`npm`の場合は`npm install husky --save-dev`です。

## setup

以下参考に、該当するコマンドをうってください。

```sh
npx husky-init && npm install       # npm
npx husky-init && yarn              # Yarn 1
yarn dlx husky-init --yarn2 && yarn # Yarn 2+
pnpm dlx husky-init && pnpm install # pnpm
```

これで、いろいろ動いて`.husky/pre-commit`が作成されているはずです。

```.husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm test
```

## edit

npm testの部分をpre-commit時に実行したいスクリプトに修正してコミットします。
自分は`yarn lint`というコマンドを実行したかったので以下のように書き換えてコミットしました。

```.husky/pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

yarn lint
```
Getter、Setterがある時とない時の違いとは？

1.Getter、Setterがない場合
クラス内の変数を直接クラスの外から操作可能です。

```
<?php
class Weather{
    public $currentWeather;
}

$weather = new Weather();
//Weatherクラスの変数をクラスの外から操作している
$weather->currentWeather = "晴れ";
echo $weather->currentWeather;
?>
```

2.Getter、Setterがある場合
クラス内の変数をクラスの外から操作できないようにしています。その代わりに、クラス外から間接的に変数を操作するために、ゲッターとセッターのメソッドを用意しています。

```
<?php
class Weather
{
  //修飾子をprivateにすることで、クラス外から変数をいじれなくなっている
  private $currentWeather;

  //変数$currentWeatherをクラス外から間接的にいじれるようにするために、
  //以下２つのメソッドを用意する

  //ゲッター
  public function getCurrentWeather()
  {
      return $this->currentWeather;
  }
  
  //セッター 
  public function setCurrentWeather($currentWeather)
  {
      $this->currentWeather = $currentWeather;
  }
 
}

$weather = new Weather();
//変数$currentWeatherをクラス外から操作できない
//そのためセッターメソッドを用いて変数$currentWeatherを操作する
$weather->setCurrentWeather('晴れ');
//上記で操作した$currentWeatherを出力する
echo $weather->getCurrentWeather();
?>

```

3、まとめ
ゲッター、セッターがあるということは、外部からクラス内の変数を直接操作させない代わりに、外部から変数を操作できるメソッドがあるということでした。

参照
https://qiita.com/kanohisa/items/154e70ed82af2347ddb2
https://wa3.i-3-i.info/word15856.html
golang-migrateを使ってる際の"Dirty database version 3. Fix and force version." の対処法

## 遭遇したエラー

golang-migrateでupする際にシンタックスエラーを含むファイルで実行したため下記のエラーに遭遇しました。

``` go
error: Dirty database version 3. Fix and force version.
make: *** [migrate-up] Error 1
```

## 対処法

こちらのエラーになった際は下記の二点を実行して再度upしてあげると正常に走らせることができます。

```
①データベースのschema_migrationsにてdirtyのカラムが1になっているレコードを削除
②原因となったマイグレーションファイルのエラーを修正
```
JAVA学習の記録③　【ゲッターとセッター】

# JAVA学習の記録③　【ゲッターとセッター】

前回までの学び[JAVA学習の記録②　【クラスのフィールド】](https://qiita.com/rion0726ittoti/items/70fac0b4ea93a89d8f7f)

クラス内のフィールドを外部から自由に書き換え可能にしていると、予想外の値が設定されてトラブルが起こることがある。そのため、フィールドへの直接アクセスを避けるためにゲッターとセッターというメソッドを利用する。
一般的にゲッターの名前は「get」+「先頭１文字を大文字にしたフィールド名」とする。

## セッターについて
セッターとは、フィールドに値を設定（セット）するメソッドのこと。
一般的にゲッターの名前は「set」+「先頭１文字を大文字にしたフィールド名」とする。

## ゲッターについて
ゲッターとは、フィールドの値を取得（ゲット）するメソッドのこと。
一般的にゲッターの名前は「get」+「先頭１文字を大文字にしたフィールド名」とする。

```java:Dog.java

public class Dog {
  String name; //名前を表すnameフィールド
  int age; //年齢を表すageフィールド
 
  void setName(String dogName){ //nameフィールドののセッター
    name = dogName;
  }
  String getName() { //nameフィールドのゲッター
    return name;
  }
  void setAge(int dogAge) { //ageフィールドのセッター
    age = dogAge;
  }
  int getAge() { //ageフィールドのゲッター
    return age;
  }
  
  void introduceMyself() { 
    String n = getName(); //getNameメソッドを呼び出す
    int a = getAge();     //getAgeメソッドを呼び出す
    System.out.println("名前は" + n + a +"歳です"); //取得した値を表示
  }
}
```
```java:UseDog.java
public class UseDog {
  public static void main(String[] args) {
    Dog pochi = new Dog(); //Dogのpochiインスタンスを生成
    pochi.setName("ポチ"); //フィールドに名前を設定
    pochi.setAge(5);       //フィールドに年齢を設定
    pochi.introduceMyself(); //introduceMyselfを呼び出す
  }
}
```
Dogクラスからpochiインスタンスを生成し、生成したインスタンスのフィールドに対して、セッターを介して名前（ポチ）と年齢（５）を代入しました。pochiインスタンスinntroduceMyselfメソッドを呼び出すと、
```
名前はポチ5歳です
```
と表示されます。

参考文献
「いちばんやさしいJAVAの教本」著者　石井真
Fly.ioのCLI操作覚書

## flyctlインストール
- [https://fly.io/docs/hands-on/install-flyctl/](https://fly.io/docs/hands-on/install-flyctl/)
```bash
brew install flyctl
```

## アプリ作成
```bash
fly apps create app名
```

## vmサイズの変更
- 256 (256MB) デフォルト
- 512 (512MB)
- 1024 (1GB)
- 2048 (2GB)
```bash
fly scale memory 2048
```

## IPアドレスのアロケート
```bash
fly ips allocate-v6
```
`allocate-v4`とするとV4のIPは月2ドル請求するぞ!と注意されるので、不要であれば`allocate-v6`で

## ボリュームの作成（データ永続化が必要であれば）
- -sでサイズ指定(単位はGB)
- -rでリージョン指定
```bash
fly volumes create volume名 -s 5 -r nrt
```
- `fly.toml`ファイルの`[data]`セクションでボリュームのマウント位置を指定
```toml
[mounts]
  source="作成したVolume名"
  destination="/var/lib/postgresql"
```
## デプロイ
- コマンド実行ディレクトリに`fly.toml`がある前提
```bash
fly deploy
```
## デプロイしたコンテナにアタッチ
```bash
fly ssh console
```
## 停止
- `fly suspend`は使えない。。。
```bash
fly scale count 0
```
## 破棄
- `fly suspend`は使えない。。。
- ボリュームも同時に破棄
```bash
fly destroy
```
## 破棄後にハマったこと
- 破棄して、同じapp名を作成すると、前回作成したappにアロケートしたIPアドレスをDNSがキャッシュしてアクセスできくなった
- ので、DNSのキャッシュ削除(Mac)
```bash
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
```
Chrome OS FlexをT100TAにインストールしてみた

・ChromebookリカバリユーティリティをChromeに追加。

・Windows11でインストールメディアを作成しようとしたが2回ほど失敗した。

・仕方ないのでMacで作成することに。一発で成功した。

・試しに使ってみたが、重い。途中で落ちたりしたので、インストールを決行。

・10分くらいで完了。早かった。

・動作確認中。軽い。テキストファイル（日記）を書くくらいなのでこれでOK。

・既知の問題：起動時にBitLockerが動く時がある。BIOSでWindows Boot Managerを選択していないのに起動する。ESCを押しながら起動して、Setupを選択して、BIOSを保存して起動するとChromeOS Flexが起動する。めんどくさい。

・F2連打：起動時にASUS T100TAでBIOSを開く方法。

・既知の問題その２：YouTubeその他で音が鳴らない。ネットで探してみたがどうしようもなさそう。
NeosJP公認アバターについて

## NeosJP公認アバターとは
### 名前や活動について
初心者や自力でのアバター設定が難しい方向けでも気軽にNeosVRを楽しんで貰うために、設定済みのアバターを用意する活動(もしくはその活動で展示されているアバター)です。
展示されているアバターは初心者に限らずどなたでも自由に着られます。
NeosVRの日本コミュニティのメンバーが活動・管理していることから「NeosJP公認アバター」という名前になっています。

### NeosJP公認アバターの権利関係等について
展示されているアバターは製作者の方と直接交渉して展示許可を得ているか、規約上の表記から展示して問題ない事が明確なアバターのみを用意しているため、使用の際にアバターの権利関係を心配する必要はありません。
ただしアバター毎にやって良い事とダメなことが設定されているので、使い方によっては事前に確認が必要となります。

### アバターの着方
NeosVRをインストールし、以下のURLにアクセス。
すると、「JPチュートリアルワールド」にワープします。
http://cloudx.azurewebsites.net/open/world/G-Neos-East-Japan/R-95d04d7b-322f-47ea-a18e-0fc1f473d41e

NeosVRのインストール方法についてはこちらを参照
https://neosvrjp.memo.wiki/d/%BB%CF%A4%E1%CA%FD

URLをクリックしてワープしたら、下記の動画の通りにアバターを取得、保存してください。
取得した段階であなた専用のアバターとなっているため、
他の方が同じアバターを着る場合は同様の手順で専用のアバターとして取得が必要となります。
<iframe width="560" height="315" src="https://www.youtube.com/embed/OFGrOfjKir4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>


## NeosJP公認アバターの展示について
ここからは主に具体的な管理の仕方やデータ保護などについての簡単な説明です。
主に展示を検討されている方や展示の依頼を受けた方向けの情報になります。

### アバターの管理
NeosVRの日本コミュニティのメンバーがやりますので、アバター製作者の方が何かをする必要はありません。

### サポート体制
設定等の不明点についてはDiscordの下記にてサポートする体制をとっています。
コンテキストメニューのAboutThisAvatarで出てくるUI上からもアクセス可能になっています。
アバター製作者でもNeosVRについては全くわからないというケースが多いので、直接下記まで質問してください。

サポート窓口
https://discord.com/channels/673668075718967296/1025960979709833216

### データ保護について
NeosVRには「SimpleAvatarProtection」という本人以外のユーザーがアバターを勝手に着たり取得できないようにする機能が用意されています。
アバター取得時に自動的のこの機能が適用され、アバター取得者以外のユーザーがデータを盗むことが出来ないようにしてあります。

### 製作者情報の明記
製作者情報などについてはアバター内に自動的に組み込まれ必要に応じてユーザーが確認できるようにしてあります。
コンテキストメニューから「About This Avatar」を選択すると、下記のように製作者情報やサポート窓口へのリンク等がいつでも確認出来ます。
![スクリーンショット 2023-03-11 103355.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2308792/d6ac5a99-a9b6-bfbd-4dd4-220e5c9a489f.png)

### 展示までの流れ
コミュニティのメンバーなどが公開されているアバターを見つけて製作者(権利者)と交渉。
了解が取れたら設定・展示するというのが基本的な流れになります。
逆に製作者側から依頼を受けて展示するケースもありますので、展示を希望される方は管理人(https://twitter.com/e1ght3 )かNeosVRの日本コミュニティのメンバーに問い合わせてください。
また、希望される場合は仕上がり方について実際に立ち会ってみていただいたりNeosVRで対応できる範囲でギミックを入れるといったことも可能です。
基本的には設定した方の好み・NeosVRの仕様などに応じて仕掛けや表情が設定されます。

### サイト上での配布にも対応可能
ここまではあくまでNeosVR上での展示の話でしたが、少し特殊な方法を用いることで
.7zbsonというファイルをBooth等のWeb上からアバターやアイテムを配布することも可能です。
これはドラッグするだけですぐにセットアップ済みのアバターを着られる仕組みで、
詳しくは下記の記事をご覧ください。
https://qiita.com/e1ght3/items/34d558045f977335f28d

有料のアバターはもちろん、無料アバターだけどBooth上からダウンロードしてほしいアバターなどにも対応かのうです。
詳細が気になる方は@e1ght3や上記サポート窓口にご相談ください。
PHPで年によって日付が変わる祝日の日付を取得

第何月曜日など、年によって日付が変わる祝日の日付をPHPで取得する関数を作ったので、メモ。

目的：各祝日で今年の日付のみ取得。（月は変わらないため）
対象祝日：対象となる祝日は下記４つ。
　　　　　⇒成人の日,海の日,敬老の日,スポーツの日


```.php
        //今年の各祝日の日付を取得
        $thisYear = date("Y");

        //各祝日の日情報：m→月,t→週,w→曜日（0～6）の順
        //各祝日の配列のキー：成人の日→0,海の日→1,敬老の日→2,スポーツの日→3
        $changeHoliday = [
            ["m" => 1,"t" =>2,"w"=>1],//成人の日
            ["m" => 7,"t" =>3,"w"=>1],//海の日
            ["m" => 9,"t" =>3,"w"=>1],//敬老の日
            ["m" => 10,"t" =>2,"w"=>1]//スポーツの日
        ];
        $changeHolidayData = [];
        foreach ($changeHoliday as $key => $value){
            //対象祝日の月の1日の曜日を取得
            $timestamp = mktime(0, 0, 0, $changeHoliday[$key]["m"], 1, $thisYear);
            $weekofone = date('w', $timestamp);

            //差分 = 対象の曜日 - その月の1日の曜日
            $dayDiff = $changeHoliday[$key]["w"] - $weekofone;
            if ($dayDiff == 0){
                $firstweek = 1;
                $returnDay = $firstweek + 7*($changeHoliday[$key]["t"]-1);
            }
            if ($dayDiff > 0){
                $firstweek = 1 + $dayDiff;
                $returnDay = $firstweek + 7*($changeHoliday[$key]["t"]-1);
            }
            if ($dayDiff < 0){
                $firstweek = 7 + ($dayDiff + 1);
                $returnDay = $firstweek + 7*($changeHoliday[$key]["t"]-1);
            }
            $changeHolidayData[$key] = $returnDay;
        }

        //例：2023年の「海の日」の日付
        echo $changeHolidayData[0]; //17が表示

```
オートインクリメントをリセットする

# オートインクリメントをリセットする
```sql
ALTER TABLE `tablename` auto_increment = 1;
```
# 出典
https://qiita.com/sola-msr/items/d6c70995ddd95361dda7#:~:text=ALTER%20TABLE%20%60tablename%60%20auto_increment%20%3D%201%3B

# 調べてみた。
```sql
ALTER TABLE table_name AUTO_INCREMENT = value;
```
これで```auto_increment```が指定した番号から始まる。
### 例
```sql
ALTER TABLE tmp AUTO_INCREMENT = 3;
```
# 出典
https://www.mysqltutorial.org/mysql-reset-auto-increment#:~:text=You%20can%20reset%20the,tmp%20AUTO_INCREMENT%20%3D%203%3B

# 感想
慣れない英語を読んで疲れた。
しかし
読めない自分でもこの文は読みやすかった。
しっかり書いてあってよかった。
Compose-MultiplatformでFailed to launch JVMエラーが出たときに見る記事

## なんでエラーが出たの?

`java.awt.AWTError: Assistive Technology not found: com.sun.java.accessibility.AccessBridge`や `Caused by: java.lang.ClassNotFoundException: com.sun.java.accessibility.AccessBridge` というエラーが起きている可能性があります。
その他にも開発環境では出ないような`ClassNotFoundException`が起きている可能性があります。

`Compsoe for Desktop`などでも発生するかも知れません。
このようなダイアログが出ている人もいると思います。

![スクリーンショット 2023-03-11 171611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1676398/a4e4eb17-71fe-5a54-8e85-713676a50e47.png)

これらはJava のアクセシビリティ機能でスクリーンリーダーなどの機能を使えるようにするものです。

## どうしたら直るの?
こういう場所があると思います。[^1]
```gradle:build.gradle.kts
compose.desktop {
    application {
        mainClass = "MainKt"
        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.Exe)
            packageName = "multim-gui"
            packageVersion = "1.0.0"
        }
    }
}
```
`jdk.accessibility`を追加します。他にも追加しなければいけないものがある場合もあると思うので適宜追加してください。
gradleタスク`suggestRuntimeModules`やjdepsなどで確認することが出来ます。
(が、私の環境ではjdk.accessibilityは検出されませんでした。)
```gradle:build.gradle.kts
compose.desktop {
    application {
        mainClass = "MainKt"
        nativeDistributions {
            targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb, TargetFormat.Exe)
            packageName = "multim-gui"
            packageVersion = "1.0.0"
            modules("jdk.accessibility") //←これ
        }
    }
}
```
## これは何?
Compose-Multiplatformはexeなどを生成するとき、jlinkというものを使用します。これは簡単に言えば必要最小限のJREを生成するようなもので、とりあえず配布するときのサイズを小さくしてくれます。

このとき何が必要で何が必要ではないかを教えてあげる必要があります。その作業を手動で行うとき、jdepsで依存を検索して`module-info.java`に書くのですが、それに相当する作業が上の`modules("module.name")`です。

## なおらないんだが?
まだ必要なモジュールを追加できていない可能性があります。
とりあえず動かしたい場合は`includeAllModules`フラグをtrueにセットしてあげるとすべてのモジュールをインポートしてくれます。[^1]

当たり前ですがサイズが大きくなるので最終的にはmodulesでの指定に戻す方がいいです。 

[^1]: https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/Native_distributions_and_local_execution/README.md#configuring-included-jdk-modules
ChatGPTでも使われているGPT-3.5のAPIを利用してStreamlitで簡単に文章変換アプリを作ってみました

## はじめに
　chatGPTで使われているモデルgpt-3.5-turboがAPI化されたので、それで何か作ってみようということで、いつものstreamlitを使って文章変換アプリを作ってみました。

## 機能
　アプリの機能としては入力された文章を「要約」「校正」「英語翻訳」「関西弁変換」という形の文章変換機能にしました。


## 下準備と料金について
　python環境にpipでstreamlitとopenaiのインストールをしておく事と、OpenAIでAPIキーを発行しておいて下さい。
　ちなみにAPIの利用料金は1000トークンあたり0.002ドル(日本円で0.27円)となっていて、OpenAI会員登録時に3ヶ月間有効の18ドル相当のクレジットが付与されます。
　※2023/3/11時点

## ソースコード

```secret.json
{
    "API_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
```


```app.py
import json
import openai
import streamlit as st

pronpt_dict = {'要約して': '次の文を要約して下さい。',
               '校正して': '次の文を校正して下さい。',
               '英語に翻訳して': '次の文を英語に翻訳して下さい。',
               '関西弁にして': '次の文を関西弁にして下さい。'}

def chatgpt_sentence_conversion(api_key, prompt):
    openai.api_key = api_key
    model = "gpt-3.5-turbo"
    messages=[{"role": "user", "content": prompt},]
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "user", "content": prompt}, 
        ]
    )
    return response["choices"][0]["message"]["content"]    

def get_gpt_apikey():
    with open('secret.json') as f:
        secret = json.load(f)
        
    return secret["API_KEY"]

def main():
    st.title('文章変換アプリ with GPT3.5')
    select_command = st.sidebar.radio('変換種別', ('要約して', 
                                                  '校正して', 
                                                  '英語に翻訳して',
                                                  '関西弁にして'))

    pronpt_command = pronpt_dict.get(select_command)
    pronpt_sentence = st.text_area('こちらにテキストを入力して下さい。')

    if pronpt_sentence is not None:
        if st.button('実行'):
            api_key = get_gpt_apikey()
            response = chatgpt_sentence_conversion(api_key, pronpt_command+pronpt_sentence)
            st.write('変換結果')
            st.write(response)  

if __name__ == '__main__':
    main()
```

## 画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/9762358e-d6be-8b0e-a248-90b7c0ba5af1.png)


## 実施結果

### 要約

入力テキスト
日本代表が第５回WBC（ワールド・ベースボール・クラシック）の第２戦で韓国代表と対戦し、13対４で快勝して２連勝を飾った。日本は３回表、先発のダルビッシュ有が８番・ヤン・ウィジの２ラン本塁打などで３点を先行されたが、直後の３回裏、１番のラーズ・ヌートバー、２番・近藤健介、５番・吉田正尚のタイムリーで４点を奪って逆転。５回には近藤のソロ本塁打などで２点を追加すると、６回には３番・大谷翔平のライト前タイムリーなどで５点を加えた。７回にはさらに押し出し四球などで２点を挙げた。

変換結果
日本代表は第５回WBCの第２戦で韓国代表を13対４で破り、２連勝を達成した。前半はダルビッシュ有が先制点を取られたが、後半にはラーズ・ヌートバーや近藤健介、吉田正尚、大谷翔平らが活躍し、得点を重ねた。


### 校正

入力テキスト
サーバ上のデータファイル中には、ユーザが入力したパスワードおよびマスターパスワードは、 すべて暗号化されて記録されます。

変換結果
サーバ上のデータファイルには、ユーザーが入力したパスワードおよびマスターパスワードがすべて暗号化されて記録されます。

### 英語翻訳

入力テキスト
WBC第2戦、日本代表が韓国代表と対戦し13対4で勝った。

変換結果
In the second game of the WBC, the Japanese team defeated the Korean team with a score of 13 to 4.

### 関西弁変換

入力テキスト
今週末ユニバーサルスタジオ行かない？

変換結果
今週末、ユニバーサルスタジオ行かへん？

## おわりに
　入力テキストの前に「次の文章を〇〇して下さい。」と付けてAPIに送るだけで動作するので、簡単にアプリが作れますね。これを使えばコード生成とかにも応用できそうだけど、料金が掛かることはお忘れなく。
Chat GPTのAPIを使って1時間に1回、AIが小説を投稿するサイトを作ってみた。

## 前提
ChatGPTを使って遊んでいたところ、無限に小説を作ることができると知ったので、生み出して読んでいたところ、読みやすくて普通に面白いと思いました。なので、AI小説の投稿サイトを作り、AIが生成した面白い小説を共有できたら面白いと考え、また、react, django REST framework の勉強がてら作ってみました。

https://www.levonia.link/category

https://github.com/esakiryota/novel-gpt

https://qiita.com/esakiryota/items/d7148954b8ea0763f320

の続きです。


## 技術
**バックエンド**
-- 言語
- Python3

-- フレームワーク
- Django 3.0.6


**フロントエンド**
- React

**インフラ**
- AWS EC2
- AWS Amplify

## アーキテクチャー
![architechture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1860891/c1662813-ca1a-233a-cac9-b73cbb5d961e.png)


## 改良した点
https://github.com/esakiryota/openAI-api

このコードを動かして、1日に24個、小説書く設定を行った。

方法はubuntuサーバーのsystemdにサービスを登録した。
chatgpt.service
```
[Unit]
Description=chat gpt api server
After=syslog.target network.target

[Service]
Type=oneshot
ExecStart=python3 main.py
WorkingDirectory=/chat-gpt
KillMode=process
Restart=no
User=hoge
Group=hoge

[Install]
WantedBy=multi-user.target
```

chatgpt.timer
```
[Unit]
Description=Chat GPT Timer

[Timer]
OnBootSec=10s
OnUnitActiveSec=3600s
Persistent=true
Unit=chatgpt.service

[Install]
WantedBy=timers.target
```
この部分で、下のchatgptのapiを実行した。
```
response = openai.ChatCompletion.create(
           model="gpt-3.5-turbo",
           messages=[
           {'role': 'user', 'content': content_msg},
            ],
           temperature=1,
           )
```


## 今後実装していくもの
- 今のところはなし。何かいいアイデアがあればください！一緒に実装しましょう！
Dockerのmysqlコンテナが起動しなくなった時の対応

# 調査

```
xxx-mysql-1         | 2023-03-11T07:45:15.873534Z 0 [ERROR] [MY-010259] [Server] Another process with pid 63 is using unix socket file.
xxx-mysql-1         | 2023-03-11T07:45:15.873571Z 0 [ERROR] [MY-010268] [Server] Unable to setup unix socket lock file.
xxx-mysql-1         | 2023-03-11T07:45:15.873581Z 0 [ERROR] [MY-010119] [Server] Aborting
```

「Another process with pid 63 is using unix socket file.」で検索してみても、なかなか有効な記事が見つかりませんでした。

ぽいなぁ〜という記事は[こちら](https://kamotora.net/system/mysql/another-mysql-daemon-already-running/)。
エラーの内容は違うのですが、リソースがすでに使われてます的なエラーな点で似てたのでヒントになりそう…。と思いました。

# 対応

mysql.sockとmysql.sock.lockを削除すると動作するようになりました。
私は、docker desctopを利用していたので、GUI上で
volumes>該当するsqlコンテナ>Data　から　一覧へ移動して
2つのファイルを削除してみました。

# 最後に

原因究明には至らず、完全なる推理と勘での解決なので、他の記事を見て解決しない場合の最後の手段として実行して下さい（責任取れません）。

上記のエラー内容と一致するような記事は[この記事](https://stackoverflow.com/questions/36103721/docker-db-container-running-another-process-with-pid-id-is-using-unix-socket)で、解答の中に「sockファイル関連を削除してね！」という回答もあったのであながち間違いじゃないかもです。。

他にも解決策が提案されているので、参考にしてみて下さい！
iCloudDocumentのフォルダ表示されなさすぎ問題を一撃で退治した話



iCloudDocumentとは、ユーザーのファイルをユーザーのiCloud内に保存するものである。

```
<key>NSUbiquitousContainers</key>
  <dict>
       <key>iCloud.com.***.app2</key>
       <dict>
            <key>NSUbiquitousContainerIsDocumentScopePublic</key>
            <true/>   
            <key>NSUbiquitousContainerName</key>
            <string>App2</string>
            <key>NSUbiquitousContainerSupportedFolderLevels</key>
            <string>Any</string>
           </dict>
  </dict>
```
本来はこれを追加すればうごくはずなのだが、30回くらいビルドし直しても治らん。

一応解決策として検索してよく出てくるのが、

クリーン ビルドをする
通常のVersionを変更する
Buildバージョンを変更する
Bundle Identifierを変更してみる
一度ストア用に、ビルドをしてAppStoreConnectにアップロードしてみる
(こうすると、普段のビルドでは出現しないエラーがよく出る、そのエラーが原因になっていることがあるため。)


などが上がっているが、どれをやってもうまくいかなかった。ちなみにファイル自体はiCloud内に保存されているのは確かで、取得することはできていた。しかし、FilesアプリやMacのiCloudには表示されない。

埒が明かないので、海外のサイトを見てみると
Documentsフォルダを作ると解決したなどというのがあったので以下のコードを実行してみたが、そもそもすでにフォルダーは存在していた


```

.onAppear(){
            
            let fm = FileManager.default
            // First get the URL for the default ubiquity container for this app
            if let containerURL = fm.url(forUbiquityContainerIdentifier: nil) {
            let tryURL = containerURL.appendingPathComponent("Documents")
            do {
            if (fm.fileExists(atPath: tryURL.path, isDirectory: nil) == false) {
            try fm.createDirectory(at: tryURL, withIntermediateDirectories: true, attributes: nil)
                print("ディレクトリ作成した")
            }else{
                print("ディレクトリすでに存在している")
            }
            
           let documentsURL = tryURL
            } catch {
            print("ERROR: Cannot create /Documents on iCloud")
            }
            } else {
            print("ERROR: Cannot get ubiquity container")
            }
            
        }

```

結局どうやって解決したかというと、わたしはXcode学びたての頃に、どこかのサイトで書いてあった通りBuildバージョンは整数ではなく、1.0.0のような表記で、通常のアプリバージョンと同様の形式で記述していた。実はこれが原因だったようだ。。
わたしは,1.0.0から1.0.1 1.0.2などのように変更していたのだ。これではダメらしい。
ビルドバージョンを1.0.0から整数の2に変更して、ビルドしてみると...


## iCloudに自分のアプリフォルダーが出現した！！！！！！！


### 結論
Xcodeはやっぱりクソ
【MENDIX Pro】ローカルでWebアプリを起動してみる

こんにちは、こんばんわ！
MENDIX　今回の記事は、インストールしたMENDIX Proで、初めてのアプリを起動してみる方法です。

そもそもMENDIXとは？という方については↓の記事を参考にしてみてください！
[MENDIX Proのインストール方法](https://qiita.com/Lyla56/items/79e5dcc54bc9b0d2c141)

# アプリを起動しよう

MENDIX Proをインストールし終わった後、アプリを立ち上げるとCreate New Appのようなボタンがあると思います。今回はそこから、テンプレの1つを使ってWebアプリを起動してみたいと思います。

## Choose your starting point

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/558036f7-0e26-c2f9-c958-a9f02d9aa503.png)

Introduction Tourの「Start Your First App」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/db0afc80-d870-4c5a-dac6-c2abcec6f6ba.png)

Use this starting point 押下

## App Settings
Webアプリの名前を入れます。
Languageなのですが、Japanも選べるのかな。そこは作成するとき見ていなかったので分からないですが、入力したら、Create Appをクリックします。
（Disk locationを隠すためにクリック箇所は切り取っています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/f4b65260-1c51-0793-9fa7-fdb6f9109618.png)

# アプリ製造画面
Create Appをして少し待つと、このような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/09e82ccf-7396-3dc1-0b9a-c8784e1dc1cd.png)

今回の初期ページは**EventManagement/Events/Pages**
の配下に入っています。

:::note info
（基本的に画面のPageはここに配置していきます）
:::

スタートページの設定は、一番上「App 'アプリ名'」のnavigationから出来ますが、
今回はテンプレ初期設定もされているため、スキップ

# Run locally
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/521d1556-b21b-c5cd-3666-94078e0ccf1b.png)
WebAppを実行するときは、画面上部の黒帯の右　「再生マーク」のRun locallyをクリックします。
すると、アプリケーションが実行されます。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/0bad1e4a-e077-2165-f1dd-7c81f88960a6.png">
※実行中画面

# Webアプリを確認する
実行が成功し、アプリケーションが起動すると、右上の↓のようなポップアップが出ます。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/fedd2ee0-14e1-124d-d6ec-cf3aee81bbfb.png">

これが確認できたら、OKです！

:::note info
「http://localhost:8080」を打ち込んでアプリを開いてみましょう！
:::

↓接続後↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125006/5cfce7e1-a8f6-e40e-18fc-cdfffb8cb3d5.png)


無事、確認できたでしょうか？
ここからページやボタンを作ったり、データベースを連携させたりして、思い思いのWebアプリケーションを作っていくことができます！
ぜひ、チャンレンジしてみてくださいね＾＾

ローコードの可能性を秘めたツールだと感じました。
AWS クラウドプラクティショナー試験を受けてきた際の備忘メモ

AWS クラウドプラクティショナー試験を受けてきた際の備忘メモです

2023/3上旬に試験を受験(@京都某所のテストセンター)し、合格しました。
![スクリーンショット 2023-03-11 16.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/f586e54e-ff9f-bd61-f573-6e4ac1958085.png)


# 表題の試験概要

AWSの入門的な位置付けの試験です。

> [AWS Certified Cloud Practitioner](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)
> AWS Certified Cloud Practitioner は、AWS クラウドの概念、サービス、および用語の基礎的な理解を提供します。過去に IT やクラウドの経験がない非技術職の方や、オンプレミスでの IT 経験があり、AWS クラウドへの基本的な知識が必要な方にとって、良いスタート地点となる資格です。この認定は、ロールベースの AWS 認定に挑戦する候補者に自信を与えてくれます。

# 受験の動機

以下をきっかけに2023/1頃から学習を始めました。

- 周囲にAWSの利用事例が増えてきており知識の必要性を感じていた
- [Qiita アドベントカレンダーにて、AWSのカレンダー](https://qiita.com/advent-calendar/2022/aws)が今年も盛り上がっている
- [こちらの神記事](https://qiita.com/kiwsdiv/items/72c74c1bc6bf4e652af5)にてAWS試験について紹介があり、勇気が湧いた

# 前提知識

過去に以下のようにIPA試験の受験経験がありました。

- [情報処理安全確保支援士試験を合格するために読んだ本まとめ](https://qiita.com/seigot/items/80a0ed8437b8918c723a)
- [エンベデッドシステムスペシャリスト合格に向けた学習進め方メモ](https://qiita.com/seigot/items/2890ee49de29964e1ead)

前提知識のうち、今回の試験に活かせる部分は少なからずあったもののAWS用語については一から学習が必要な状況でした。（体感20%くらいしか活かせなかった気がする）

# 取り組み方

学習時に参考にした教材は以下の通り。

1. [一夜漬け AWS認定クラウドプラクティショナー 直前対策テキスト](https://www.amazon.co.jp/一夜漬け-AWS認定クラウドプラクティショナー-直前対策テキスト-山内-貴弘/dp/4798062952)
2. [【無料過去問】AWS認定資格 無料WEB問題集＆徹底解説](https://aws-exam.net/clf/index.php)
3. [【2023年版】AWS 認定クラウドプラクティショナー CLF-C01 模擬試験](https://www.udemy.com/course/2023aws-certified-cloud-practitioner-clf-c01/)

1.の本を読んで試験範囲を把握した後、2.3.を活用して理解を補っていく。
AWSの試験勉強を始めた2023/1頃以降、隙間時間をなんとか繕って学習時間を確保した。

# 感想

- ２ヶ月掛かってしまったが勉強時間配分を工夫すればより短期間で合格できるはず
- 試験対策としては、概要理解＋過去問4-5周ほどすれば合格確率は高いはず
- AWS用語理解は捗ったものの、AWSでのシステム構築スキルアップは今後の課題
- 久しぶりに試験に合格すると嬉しい気持ちになれる。
- テストセンターは道に迷うので時間に余裕持って行った方が良い(0次試験)
- テストセンターは免許証とパスポート2つ持参が必要（忘れかけた、前日に[神記事](https://qiita.com/kiwsdiv/items/72c74c1bc6bf4e652af5)を読んで必要なことに気づきました、、ありがとうございます！）

# 後日談

（試験前日の過去問では得点率70%前後で怪しかったが当日は運が良く無事に合格できた。合格怪しくても思いきって受験してみるのが吉）

# 参考

[AWS Certified Cloud Practitioner 受験記録](https://qiita.com/kiwsdiv/items/72c74c1bc6bf4e652af5)
[AWS Certified Cloud Practitioner](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)
[一夜漬け AWS認定クラウドプラクティショナー 直前対策テキスト](https://www.amazon.co.jp/一夜漬け-AWS認定クラウドプラクティショナー-直前対策テキスト-山内-貴弘/dp/4798062952)
[【無料過去問】AWS認定資格 無料WEB問題集＆徹底解説](https://aws-exam.net/clf/index.php)
[【2023年版】AWS 認定クラウドプラクティショナー CLF-C01 模擬試験](https://www.udemy.com/course/2023aws-certified-cloud-practitioner-clf-c01/)