OmniAICreator/Qiita-1.07M huggingface dataset:
Xserverでminiconda3を使用してDjango ウェブアプリをデプロイ

## 投稿理由
そのファイルがどこに配置すべきなのか 等で
四苦八苦したので、備忘録として残しておく。

## 事前準備
* XServerの契約
* [SSH接続](https://www.xserver.ne.jp/manual/man_server_ssh.php)
* サーバーパネルのファイルマネージャを使用できる
* デプロイするDjangoウェブアプリ (**collectstatic**を忘れずに)
* ファイルをXServerへ送信する何らかの方法 ([FTP](https://www.xserver.ne.jp/support/faq/faq_service_ftp_setting.php) 等)

今回は、**django-admin**で作成したてのデバッグモードがONの状態の時の
「The install worked successfully! Congratulations!」のページが表示されるだけのウェブアプリをデプロイします。

## 作業

### miniconda3 & Djangoをインストール
1. SSHでXServerに接続

2. 最新のx86_64のminiconda3をインストールするためのシェルスクリプトをダウンロード
```shell:shell
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
```

3\. シェルスクリプトを実行
```shell:shell
bash Miniconda3-latest-Linux-x86_64.sh
```
私はインストールパス等は、すべてデフォルトの値でインストールしました。
必要に応じて変更。

4\. Djangoをインストール
```shell:shell
/home/xs******/miniconda3/bin/python3 -m pip install django
```
__/home/xs******/miniconda3__ は、miniconda3のインストールパスです。
環境に応じて変更してください。

### ファイルをXServerへ

* Django ウェブアプリを、配置したいドメインの**public_html**内に入れる

* **python manage.py collectstatic**でエクスポートした**static**ディレクトリを、**public_html**直下に配置する

* データベースのマイグレーションも忘れずに

:::note info
サブドメインに配置する場合
例: subdomain.example.com
__/home/xs******/example.com/public_html/subdomain.example.com/__ が **public_html** に該当する。
:::

### index.cgi & .htaccess

ここからは**ファイルマネージャ**での操作です。

<br />

1. **index.cgi** を作成
**index.cgi**は**manage.py**と同じ階層に配置してください。

下記の例は **django-admin startproject** で **mysite** という名前のプロジェクト名で作成した場合

```cgi:index.cgi
#! /home/xs******/miniconda3/bin/python3
import sys, os

sys.path.insert(0, '/home/xs******/miniconda3/bin')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

from wsgiref.handlers import CGIHandler
from django.core.wsgi import get_wsgi_application

application = get_wsgi_application()
CGIHandler().run(application)
```

<br />

2\. **.htaccess** を作成
**.htaccess**は、**public_html**の直下に配置してください。

:::note info
サブドメインの場合
例: subdomain.example.com
__/home/xs******/example.com/public_html/subdomain.example.com/.htaccess__
:::

下記の例は、**index.cgi** と **.htaccess** が同じ階層に存在する場合

```:.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L]

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

:::note info
ファイルの配置が下記のような配置にする場合
__/home/xs******/example.com/public_html/.htaccess__
__/home/xs******/example.com/public_html/django-webapp/index.cgi__
__/home/xs******/example.com/public_html/django-webapp/manage.py__
```:.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /django-webapp/index.cgi/$1 [QSA,L]

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```
:::

<br />

:::note warn
必ず **manage.py**、**index.cgi**、**.htaccess** の権限（パーミッション）を**755**に設定すること
:::

## 終わり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675501/e50cfe74-5fac-3a7b-f989-fc818818cc8f.png)
これでデプロイできているはずです。
アクセスして公開できているかを確認してください。

## 参考文献

https://qiita.com/pythonista/items/59f1a550f873188f409b

https://yunifusu.com/programming/django/django_xserver_deploy/
OneAPI って何？

【開発と活用を推進するインテルの AI】
インテルはクラウドからデータセンター、エッジにおいて、あらゆる場所での AI 活用を目指す、ソフトウェアやハードウェアでの AI 開発、さらには AI ソリューションへの活用を動画で解説するWebサイトを公開しています。
https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

＜AI 活用を動画で学ぶ＞
インテルのエキスパートたちが、ソフトウェアやハードウェア、AI ソリューションに関してのノウハウを動画で解説。今回ご紹介するのは、「開発環境」
ソフトウェア開発ツールである oneAPI をはじめ、推論エンジンやモデルの最適化を提供する OpenVINO™ ツールキットや、クラウドベースでインテル製ハードウェアや包括的な開発ツールとライブラリーを提供するインテル® Tiber™ デベロッパー・クラウドなど、インテルが AI 開発向けに提供しているツールやソリューションを紹介します。

タイトル
OneAPI って何？

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/bd041e87-91ba-917f-3c64-d5dd0f7ac781.png)

パフォーマンスと生産性を高め、異種システムに対応する革新的なソリューションの oneAPI を紹介します。インテルのソフトウェア・ツールや開発ツール、実際の事例をはじめ、CUDA から SYCL への移行デモも紹介します。

https://www.intel.co.jp/content/www/jp/ja/artificial-intelligence/ai-development-and-utilization.html

是非この機会にAI Everywhere を実現するインテルのソリューションをご覧ください！
Power Appsでローカルに簡単な情報を保存して呼び出す方法（SaveData/LoadData関数）

# はじめに
Power Appsでは、OneDrive/SharePoint Onlineに配置したExcelファイル、SharePoint Listでデータを管理することが多いと思います。

データをしっかりと管理し、後続の業務でも活用する場合にはこの方法で良いかと思いますが、ちょっとしたアプリの利便性向上のためにわざわざデータを格納する場所を用意するのは面倒ですよね。。

ということで、Power AppsのSaveData、LoadData関数を使って、ローカルに情報を保存する方法を試してみたいと思います。

# SaveData、LoadData関数とは？

SaveData関数：名前を付けてコレクションを格納する
LoadData関数：名前を指定してコレクションを呼び出す
ClearData関数：名前を指定してストレージをクリア、もしくは、アプリに紐づく全てのストレージをクリアする

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-savedata-loaddata

:::note warn
注意事項
- ブラウザで動作させている場合には、最大サイズは1MB。モバイルデバイスのアプリの場合には最大サイズの制約はないが、アプリの利用可能メモリサイズに依存する。
- プレーンテキストとしてデータが保存されるため、機密情報を取り扱うのは推奨しない。特に、複数ユーザーが同一端末を使いまわしている場合に注意が必要。
:::

# 早速やってみる
テンプレで作成できるPower Appsの画面に、検索条件を保存するボタンを追加しました。
![スクリーンショット 2024-11-06 22.27.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640665/a6b2ec2a-7746-0823-5642-fe49acb69ae4.png)

保存ボタンの処理は以下の通り。
```PowerFx:保存ボタンのOnSelectイベント
SaveData(
    ClearCollect(
        検索キーワード,
        { SearchWord: SearchInput1.Text }
    ),
    "検索キーワード"
);
```

次にLoadData関数を使います。
今度は、アプリケーション読み込みのタイミング（OnStart）に処理を実装します。
```PowerFx:アプリ読み込み時（OnStartイベント）
LoadData(検索キーワード, "検索キーワード");
```

最後に、TextBoxのデフォルト値を設定します。
```PowerFx:検索キーワードを入力するTextBoxのDefaultプロパティ
First(検索キーワード).SearchWord
```

たったこれだけで、Power Appsでローカルに情報保存、保存した情報を呼び出す処理の実装は完了です！
実際にアプリを開き直してみると、以下のように保存した検索ワードが自動設定されていることが分かります。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640665/12649c47-9060-61f0-d1e8-b87fb319b29b.png">

# 実際データはどこに保存されるのか？
## ①ブラウザを利用している場合
ブラウザのディベロッパーツールを使用することで、実際に保存されている値を確認することができます。

(1) ディベロッパーツールを開く
(2) アプリケーションタブを開く
(3) ストレージの「IndexedDB」というエリアを見ると、Power AppsのアプリケーションIDの下に、keyvaluepairsというデータが存在します。中身を見てみると、SearchWordとして「テスト」という文字列が保存されていることが分かります。
![スクリーンショット 2024-11-07 23.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640665/bbf5a7cc-02b6-541e-2b96-afabdf30fa41.png)

## そもそもIndexedDBとは何なのか？
> IndexedDB は、ユーザーのブラウザー内にデータを永続的に保存する手段です。ネットワークの状態にかかわらず高度な問い合わせ機能を持つウェブアプリケーションを作成できますので、アプリケーションがオンラインとオフラインの両方で動作するようになります。
 （引用元:https://developer.mozilla.org/ja/docs/Web/API/IndexedDB_API/Using_IndexedDB）

ブラウザが管理するデータベースなので、ブラウザのバージョンアップ時や、ユーザーがブラウザで保存情報の削除を行う等した場合には、データ自体が無くなる可能性があるということですね。なので、消えてしまってもアプリの動作や業務に支障が無い情報だけを管理すべき、ということになります。

## ②モバイルアプリを利用している場合
スマホ単体での確認は難しい気がします。
まだ確認手順を確立できていないので、また後日実施して情報更新します。

# 今後やりたいこと
注意事項にも記載した通り、機密情報を取り扱うのは推奨されていません。
一方で、機密情報をExcelやSharePoint Listで管理するのはもっと現実的ではないと思っていまして、Power Apps/Power Automateで何らかデータを暗号化して管理する方法を検討してみたいと思います！
Emacs 29.4 にしてみた

## 導入
バージョンアップするの遅くない？
## 経緯
実は昨日まで 29.3 を使っていたのですけども、普段自宅では仕事しないし、あまり Emacs は起動しないのもあり、気づくのが遅かったというか、Emacs くんもバージョンアップしたらすぐに設定エラーにしてくれたら良いんですけどもね。実はフォント設定をいろいろいじっていて init.el を更新していたのですが、何かのタイミングで突然 Emacs くんがご機嫌ナナメになるため、
・バージョンアップの結果なのか
・自分が init.el の編集で何かやらかしたのか
わからない状態となりまして、結果前者だったのですが、Emacs くんがエラー吐いて素で起動するようになってしまいかなり復旧するまで大変でした。(2時間ぐらいかかったかもｗ)
Emacs くんの内部事情はよくわかりませんが、たぶん init.el をバイトコンパイルしたものをどこかにキャッシュしていて、それで突然のタイミングでご機嫌ナナメになるのでしょう。知らんけど。それはそれで Emacs くんのキャッシュの動作がおかしいんじゃないかなと思いますけれども。Windows や Cygwin のせいかも？しれません。
## 原因
何がいけなかったか原因をメモに残して、今後の自分への戒めにしたいと思います。
### 主な原因(1)
最近の Emacs では英大小文字の区別が厳密になったようです。

これはバッファのキル（削除）を禁止する設定ですが、バッファ名の記述に厳密さが求められます。というか以前の Emacs がテキトーだったので、より正しく動作するように修正されたと言うべきでしょうか。

(誤)
```
;;; buffer を kill しない
(with-current-buffer "*scratch*" (emacs-lock-mode 'kill))
(with-current-buffer "*messages*" (emacs-lock-mode 'kill))
;;;                    ^
```

(正)
```
;;; buffer を kill しない
(with-current-buffer "*scratch*" (emacs-lock-mode 'kill))
(with-current-buffer "*Messages*" (emacs-lock-mode 'kill))
;;;                    ^
```

このように英大小文字を厳密に合わせないと Emacs くんはオコになります。
いままで何も言ってこなかったのにねｗ

(誤)
```
;;; dired ls のタイムスタンプに日本語を使わない
(setenv "lc_all")
(setenv "lc_time" "posix")
```

(正)
```
;;; dired ls のタイムスタンプに日本語を使わない
(setenv "LC_ALL")
(setenv "LC_TIME" "POSIX")
```

setenv で設定する環境変数も同様に厳密さが求められ、英大文字にしないと曜日部分が日本語になってしまいます。

### 主な原因(2)
キー設定で kbd 関数を使う必要があります。
この設定は C-z 誤入力で Emacs くんが最小化してムカつく(マウスを触らないと Emacs くんを元に戻せないため非常にイライラしますｗ)のを防ぎ、利用者の精神を安定化する効果があります。

(誤)
```
;; c-z で最小化するのを無効にする
(global-set-key "\c-z" nil)
```

(正)
```
;; c-z で最小化するのを無効にする
(global-set-key (kbd "C-z") nil)
```

従来は OK だった書き方ですが、最近の Emacs くんは激オコになります。おそらく最近の Emacs くんは「絶対バックスラッシュ許さないマン」に進化したと思われます。これがあちこちに有ったため、あちこちでエラーが出まくって原因特定にすごい時間がかかりました。

## おわりに
他にもダメな設定は潜んでいて、まだ気づいてないものがあるかも知れませんし、今後のバージョンアップで今の init.el の書き方では Emacs くんが怒り出す可能性もあります。最近全然 Emacs を起動してなかったので、いつのバージョンから仕様が変わったのかはよくわかりません。今後のバージョンアップ時にまた同じようなトラブルに遭う可能性はあるので気をつけたいところです。
バージョンアップの際は、ざっとでもリリースノートに目を通したほうが良いですね。(自分は読んでもよくわからんのでスルーしますがｗ)
## 蛇足
ちなみにフォントは PlemolJP に変えました。見やすいフォントなので気に入ってます。
現場作業でのSAP備忘録

# **はじめに**
今回は現場での備忘録です。
現場では <font color="Red">**SAP(エスエーピー)**</font>を使用して移行作業を行っているため、今回はSAPを使っていて
特に役に立ったなというテーブルや、トランザクションコードなどをまとめていきます。<br>

# SAPとは
財務会計、人事、製造など企業の多様なデータを１つのシステムで管理をすることができるビジネスソフトウェアです。
現在 **「SAP S/4 HANA」** という後続製品ができ、既存の **「SAP ERP」** がサービスを終了することからデータの移行作業などが多くの企業で行われています。

# トランザクションコード(Tr-cd)
Tr-cdとは <font color="red">**「プログラムを呼び出すためのコード」**</font>です。
テーブルを参照したり、作業用のプログラムを呼び出すために使っています。
主に使用するのは以下です。 <br>

### 〇基本作業

<dl>
<dt> SE16N：テーブル参照 </dt>
<dd>移行元のデータや、移行先にデータが正しく登録されているか確認する際に使用<br>テーブル名については後半に記載</dd>
<dt>SE38：プログラム起動</dt>
<dd>抽出プログラムなど、<strong><font color="red">ABAP</font> (SAP独自の言語)</strong> を使用し作成されたプログラムを呼び出す</dd>
<dt>SM37：バックグラウンドジョブの確認</dt>
<dd>プログラムをバックグラウンドで実行した際に実行状況を確認する際に使用</dd>
<dt>CG3Y：ファイルのダウンロード</dt>
<dd>サーバー上に存在するファイルをローカルに落とす</dd>
<dt>AL11：ファイル確認</dt>
<dd>SAPのサーバー上に作成されたファイルや格納されているディレクトリなどを確認する</dd>
</dl>

# テーブル
こちらはDB関連の話であればよく出てくるものです。
SAPでは**各データに対して決まったテーブル名が存在します。**
また、会社によってはオリジナルのテーブル名などがあります。
私がよく使用するテーブル名は以下です<br>

### 〇使用テーブル
<dl>
<dt> <font color="red">PRPS</font>：プロジェクトテーブル </dt>
<dd><strong>WBS</strong>というプロジェクを細分化したテーブルです。<br>またプロジェクト単位で検索する場合は<strong>PROJ</strong>を使用します</dd>
<dt> <font color="red">COBRB</font>：決済規則テーブル</dt>
<dd>決済情報が関連しているデータの決済規則を確認するためのテーブル。<br>
基本、対象番号という番号を抽出して検索をかけます。</dd>
<dt><font color="red">CSKS</font>：原価センタテーブル</dt>
<dd>費用を計算するうえでのマスタデータ。お金がかかわってくるものには基本的に関連してくる大事なデータになっています。</dd>
<dt><font color="red">ANLA</font>：資産テーブル</dt>
<dd>資産データの参照テーブルです。WBSに関連している資産番号情報などを調べる際に使用しています。</dd>
</dl>

# 終わりに
以上が私のよく使用しているTr-cdやテーブル名です。
テーブルやTr-cdは実際多く存在しているため、今回記載しているのもの以外でもざっと10倍以上は存在します。
データの関連性など複雑で理解するのが大変ですが、つながりを知ることができると、できることや他データで活用できたりとても楽しいです！
<br>
参考
【SAP】テーブル一覧記事まとめ
https://tokulog.org/blog/table_list/
Docusaurus で Mermaid を表示できるようにする


## はじめに

Meta社が管理する React ベースのドキュメント管理ツール Docusaurus 。
Docusaurus で Mermaid を表示するために必要な手順を記載します。

https://docusaurus.io

https://github.com/facebook/docusaurus

## 注意

- 事前に Docusaurus はセットアップが完了している前提で記載します
- 本記事は `npm` を用いて必要なパッケージをインストールします。 `yarn`, `pnpm` を利用されている方は適宜読み替えてください

## Mermaid を表示できるよう設定する。

Mermaid を表示できるようにするまでの大まか流れは以下の通りです。

- 必要な npm パッケージの追加
- `docusaurus.config.ts` の変更

### 必要な npm パッケージの追加

npm パッケージ `@docusaurus/theme-mermaid` を追加します。

https://docusaurus.io/docs/api/themes/@docusaurus/theme-mermaid

https://www.npmjs.com/package/@docusaurus/theme-mermaid

```sh
npm install --save @docusaurus/theme-mermaid
```

### `docusaurus.config.ts` の変更

:::note info
`docusaurus.config.js` を使用している場合は読み替えてください。
:::

```diff_javascript:docusaurus.config.ts
  import { themes as prismThemes } from 'prism-react-renderer';
  import type { Config } from '@docusaurus/types';
  import type * as Preset from '@docusaurus/preset-classic';


  const config: Config = {
    // その他設定 ...

+   markdown: {
+     mermaid: true,
+   },
+   themes: ["@docusaurus/theme-mermaid"],

    // その他設定 ...
  };

  export default config;
```

## Ref

https://docusaurus.io

https://github.com/facebook/docusaurus

https://docusaurus.io/docs/api/themes/@docusaurus/theme-mermaid

https://www.npmjs.com/package/@docusaurus/theme-mermaid
(ほぼ)知識0からJavaSilver目指してみた

# はじめに
先日、JavaSilverを受験し、合格することが出来ました。
せっかく(ほぼ)知識0からJavaBronze、JavaSilverと歩みを進めてきたので何番煎じかわからない合格体験記を書いていこうと思います。

ちなみに、JavaBronzeを受ける前の自身の知識は以下の通りです。

* 入社後半年経過、ITパスポートだけ取得している
* 基本的なコードが多少読める
* 現場で2か月ほど使用(ほとんど書いてない)

## 受験理由
初めて現場に入ってまず最初に感じたことが自分自身のスキル不足でした。
このままではまずいと思い、周りの人に話を聞いたり、これからのキャリアプランを考えた結果、まずはJavaBronze及びJavaSilverから始めようと思い、受験することにしました。

## 使用した参考書
### Java Blonze 
__メイン参考書__
* **(黒本)徹底攻略Java SE Bronze問題集［1Z0-818］対応**

周りの人に聞いたり記事を読んで決めました。殆どの時間をこれに費やしていたと思います。


__サブ参考書__
* **(白本)JavaプログラマBronze SE7/8**
* **(紫本)オラクル認定資格教科書 Javaプログラマ Bronze SE（試験番号1Z0-818）** 
 
人から借りました。基礎的知識の確認、模擬試験の経験積みに使っていました。


### Java Silver
__メイン参考書__
* **徹底攻略Java SE 11 Silver問題集[1Z0-815]対応**

JavaBronzeと同じく周りの人に聞いたり記事を読んで決めました。これ以外には使っていません。

## 受験までの道のり
### Java Bronze
まずは何もわからなかったので巷で黒本と呼ばれているものと過去バージョンの白本と呼ばれているものを使用しました。

勉強方法はとにかく参考書を周回する方法です。
パソコンはほとんど使わず脳内でコードを追って問題を解いていました。

以下、私が躓いたポイントです。
* オーバーライドとオーバーロード
* コンストラクタ
* インタフェイス
* ポリモーフィズム

恐らく、全体の半分に躓きました。
特にポリモーフィズム周りには中々慣れず、理解するのに時間がかかっていた記憶があります。
オーバーライドとオーバーロードは純粋にどっちがライドでロードかわかりませんでした。

模擬問題1週目は正答率50%程度でしたが受験する前日には正答率100%にすることが出来ました。

### Java Silver
JavaBronzeを乗り越えた後に受けたJavaSilverです。

基本的には脳内でコードを追って問題を解くという勉強法には変わりませんが
最初に問題を解いた感じJavaBronzeで行った勉強法だけでは上手くいかないような気がしたのでパソコンのメモ帳にわからなかった分野のことについて文章にまとめていつでも見返せるようにしていました。

また、模擬問題を解いている途中でノートの端にわからなかった、もしくは悩んだ問題をメモに取り、答えを確認する際に特に注意して見返したり、なぜそうなるのかを走り書きしたりしていました。
自分にはこちらの方が合っていたようで覚えがよかったです。


以下、私が躓いたポイントです。
* ラムダ式
* API
* 例外処理
* モジュールシステム

「特に」という部分もなく、JavaBronzeで出なかった範囲全てに躓きました。
何度やっても上手く行かない時は黒本著者の方がアップしているYoutubeを見たり、ネットでその部分について調べ時間をかけて理解を深めるようにしていました。

また「JavaSilver　過去問」と調べて出てきた問題を解くというのも、黒本とは違った角度の問題について知ることが出来たりして案外試験対策に有用だったりするので黒本だけで試験を受けるという人で特に「時間に余裕がある人」、「不安な人」にはおすすめです。

# 受験日当日～結果
### Java Bronze
久しぶりの試験ということと受験料が高かった(約15000円)こともあり不安でしたが
準備はしっかりしてきているつもりだったので冷静に取り組むことが出来ました。
結果は89%でした。「後1問取れていれば90%だったのにな」と思いながら帰ったのを覚えています。

### Java Silver
相変わらずの受験料の高さ(約40000円)と浅い理解度での受験となってしまったため、JavaBronzeの時よりも不安を抱えての受験となってしまいました。
「最初の数問は比較的難易度が高め」ということはわかっていたのですが前述の不安と重なってうまく行かず、1週目時点で不安な問題が80問中30問以上という状態でした。
その後行った見直しでいくつものミスを見つけることが出来たことと、それらをうまく直せたことが幸いしたようで結果は85%でした。

# まとめ
参考書(特に黒本)の問題を自分の言葉で説明して解くことが出来れば、問題なく合格できると思います。 ***迷ったら黒本使いましょう。***
「それだけでは不安」という人は紫本などの購入を考えても良いと思います。(受験料が高いので。。)
「freezedパッケージ入門 – Flutterで型安全なデータクラスを簡単に作成」

## はじめに

Flutterでの開発では、データクラスの管理や更新が頻繁に発生します。`freezed`パッケージを使用することで、型安全かつシンプルなデータクラスを効率的に作成でき、メンテナンス性も向上します。本記事では、`freezed`パッケージの導入から基本的なデータクラス作成方法、JSON対応までを解説します。

## freezedパッケージとは？

`freezed`パッケージは、Flutterで型安全なデータクラスを簡単に作成するためのツールです。従来のデータクラスを手作業で書く手間が省け、`copyWith`や`toString`、`hashCode`などの基本機能が自動で提供されます。

## 導入手順

まず、`freezed`パッケージと`build_runner`をプロジェクトに追加します。

1. `pubspec.yaml`に以下を追加して依存関係を設定します。
    
    ```yaml
    dependencies:
      freezed_annotation: ^2.0.0
    
    dev_dependencies:
      build_runner: ^2.0.0
      freezed: ^2.0.0
    
    ```
    
2. 依存関係をインストールし、`build_runner`でコード生成します。
    
    ```bash
    flutter pub get
    flutter pub run build_runner build --delete-conflicting-outputs
    ```
    

## データクラスの作成方法

`freezed`を使って、シンプルなデータクラスを作成してみましょう。

```dart
import 'package:freezed_annotation/freezed_annotation.dart';

part 'user.freezed.dart';

@freezed
class User with _$User {
  const factory User({
    required String name,
    required int age,
    String? email,
  }) = _User;
}
```

### ポイント解説

- `@freezed`アノテーションをクラスに追加すると、データクラスの機能が有効になります。
- `User`クラスに`copyWith`や`toString`などの基本的な機能が自動で追加されます。
- `String? email`のように、オプショナルなプロパティも簡単に扱えます。

## データのコピーを簡単に行う `copyWith`

データの一部だけを更新したいときは、`copyWith`メソッドが便利です。`freezed`で自動生成される`copyWith`を使用すると、新しいオブジェクトを生成しながら一部のデータだけを変更できます。

```dart
void main() {
  final user = User(name: "John", age: 25);
  final updatedUser = user.copyWith(age: 26);

  print(updatedUser); // User(name: "John", age: 26)
}
```

このように、データの一部のみ変更しつつ、新しいインスタンスを作成できます。

## JSONのシリアライズ・デシリアライズ対応

APIと連携する際には、データをJSON形式でやり取りする必要があります。`freezed`と`json_serializable`を組み合わせることで、JSONシリアライズ・デシリアライズが簡単に行えます。

1. `pubspec.yaml`に`json_serializable`を追加します。
    
    ```yaml
    dependencies:
      json_annotation: ^4.0.1
    ```
    
2. `User`クラスに`fromJson`および`toJson`を追加します。
    
    ```dart
    import 'package:freezed_annotation/freezed_annotation.dart';
    
    part 'user.freezed.dart';
    part 'user.g.dart';
    
    @freezed
    class User with _$User {
      const factory User({
        required String name,
        required int age,
        String? email,
      }) = _User;
    
      factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
    }
    ```
    
3. `build_runner`を再度実行して、JSONメソッドを含むコードを生成します。
    
    ```bash
    flutter pub run build_runner build
    ```
    

これで、`User`クラスのインスタンスをJSONに変換したり、JSONからインスタンスを生成したりできます。

### 使用例

```dart
void main() {
  // JSONからインスタンスを生成
  final json = {'name': 'John', 'age': 25};
  final user = User.fromJson(json);

  // インスタンスからJSONを生成
  print(user.toJson()); // {name: "John", age: 25, email: null}
}
```

## まとめ

`freezed`パッケージを使えば、型安全で保守性の高いデータクラスを簡単に作成できます。`copyWith`やJSON対応など、freezedの基本機能を活用することで、より効率的にFlutterアプリを開発できるでしょう。ぜひ試してみてください！
nvmのインストール（MacBook Air, M1, 2020）

# はじめに
Macにnvmをインストールしていきまーす

https://github.com/nvm-sh/nvm

# 開発環境

- MacBook Air, M1, 2020
- nvm 0.39.7

# 導入
1．ターミナルを開きます

2．nvmをインストールします

~~~bash
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
~~~

3．~/.zshrcを編集します

~~~bash
$ vi ~/.zshrc
~~~

~~~.zshrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
~~~

4．変更を反映させます

~~~bash
$ source ~/.zshrc
~~~

5．nvmがインストールされていることを確認します

~~~bash
$ nvm -v
0.39.7
~~~

6．Node.jsをインストールします

~~~bash
$ nvm install 18.19.0
$ nvm use 18.19.0
~~~

7． Node.jsのバージョンを確認します

~~~bash
$ node -v
v18.19.0
~~~

お疲れ様でした
ユーザー設定(devise）駆け足説明　【備忘録】

## はじめに
サイトを作る際に新規登録、ログイン、ログアウトのユーザー設定は必ず行うものなので詳細は省きとりあえず設定できるよう駆け足で説明。

1.Gemfileの最後の行に以下を入力
```Gemfile
gem 'devise'
```
2.ターミナルに順番に入力
```
% pwd　                   # 現在のディレクトリが作成中のアプリ名であることを確認して
% bundle install          # Gemをインストール
% rails s                 # サーバー再起動
% rails g devise:install　#　deviseファイル作成
% rails g devise user     # deviseコマンドでUserモデルを作成
```
これでユーザー関連のモデルやマイグレーションも自動で生成してくれて
以下のようにroutes.rbにルーティング追記されている。
```config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: 'comments#index'
  resources :comments
end
```
3.ターミナルでマイグレーション実行
```
% rails db:migrate
```
これでユーザー情報を保管するユーザーテーブルが出来た。
## おわりに
ユーザー設定は以後アプリ作成で何度も使うので記載しました。
これからビューファイルの記述が必要になりますがビューはサイトそれぞれなので割愛します。
APIの活用事例：おでかけアプリ「MYROOT」でのAPI活用法とは？

# はじめに
グルナビAPIは、日本全国のレストラン情報を提供するAPIで、飲食店情報や口コミ、予約機能を企業向けに提供しています。本記事では、グルナビAPIを利用した具体的な事例として、トヨタが開発したおでかけアプリ「MYROOT」の飲食店情報機能について、その利便性やメリット、活用のポイントを紹介します。

## ぐるなびAPIについて
・グルナビAPIは、**飲食店の所在地やメニュー、口コミ情報などを企業向けに提供するAPIで、約12万件のレストラン情報を取得することができます。**

・利用料金は月額10万円ですが、法人向けに3ヶ月間の無料トライアルが用意されています。

・こうしたAPIは、**飲食店情報を必要とするアプリやサービスにとって便利なデータソースとなり、膨大な情報を手軽に取得できる点で企業にとって価値の高いもの**です。しかし、APIの利用には契約や価格の変動リスクも伴うため、他の代替APIの検討も重要です。


![](https://storage.googleapis.com/zenn-user-upload/7d1e2b91d627-20241107.png)
**ぐるなびAPIの詳細と流れ**

## グルナビAPIの機能と料金
・グルナビAPIは、飲食店の基本情報やメニュー、営業時間、所在地などを提供するAPIです。

・例えば、特定の地域で表示範囲を指定し、緯度と経度を入力してリクエストを送信すると、該当エリアの飲食店リストが返却されます。リアルタイムのデータ更新が可能で、飲食店情報を常に最新の状態で取得できるのが特徴です。

・料金設定：グルナビAPIは法人向けで、月額10万円の料金が発生しますが、3ヶ月間の無料トライアルも利用可能です。個人には高額に感じられますが、**企業にとっては12万件以上の店舗情報を取得するコストとしてはお得**です。


![](https://storage.googleapis.com/zenn-user-upload/6dbbc0815e0c-20241107.png)
**実際のぐるなびAPIの採用の情報**


![](https://storage.googleapis.com/zenn-user-upload/2c63fc351d9e-20241107.png)
**実際のぐるなびAPIの詳細について**

**活用事例：おでかけアプリ「MYROOT」**
・トヨタが提供するおでかけアプリ「MYROOT」では、グルナビAPIを利用して、飲食店情報や口コミ、店舗の所在地を表示しています。
　このアプリは、行きたい場所を地図から探したり、お得なレストランを見つけたりする機能を提供しており、ユーザーが「行きたい」を「行ける」につなげることをサポートしています。

・**開発効率の向上：自社で飲食店情報を収集・更新するのは非常に手間がかかりますが、グルナビAPIを利用することで、膨大な店舗情報を短期間で実装可能**です。また、予約機能もAPIによって実装されているため、開発リソースの節約につながっています。

**・追加のビジネス施策**：例えばトヨタが自社の車と連携させ、MYROOTアプリ経由で特典を提供するなど、APIを活用したマーケティングの拡張も考えられます。
　例えば、新車購入者向けに「1,000円以下のレストランを月10回まで無料」といった特典を付与することで、顧客の満足度向上と新車の販売促進を同時に狙えます。

![](https://storage.googleapis.com/zenn-user-upload/8091fa92cddc-20241107.png)

**MYROOTについて**

## APIのリスクと代替策

・料金の変動と依存リスク：APIは提供企業の事情により、料金変更やサービス停止のリスクがあります。グルナビAPIも2021年6月まで無料でしたが、その後有料化されました。**APIに依存したサービス開発では、こうした変動リスクを避けるため、代替APIの候補を検討することが重要**です。

・他の代替APIの検討：グルナビAPI以外にも、食べログやGoogleマップの口コミ機能を活用できる場合があるため、サービスの中核が飲食店情報に依存する場合は複数のAPIの導入を検討するのが望ましいです。また、自社で少しずつデータを収集していくことで、将来的な依存リスクを減らすことも可能です。

## まとめ
グルナビAPIは、日本全国の飲食店情報を手軽に取得できるため、開発効率を高め、マーケティング施策にも活用しやすいAPIです。トヨタの「MYROOT」アプリでは、飲食店情報と地図連携を通じてユーザーの利便性を向上させていますが、APIの依存リスクや料金変動には注意が必要です。他のAPIとの併用や自社データの蓄積も視野に入れつつ、グルナビAPIの活用を最大限に活かすことで、より価値のあるサービス提供が可能となります。

また、今回の活用事例以外にも、下記のお知らせの講座にて実際の画面やさらに詳しい解説をしているので、**APIの活用方法の発想に困っている方や、さらに活用事例を知りたい、もっとAPIの知識を深めたいという方**はチェックしてみてください。

参照サイト
・MYROOTについて　
URL　https://prtimes.jp/main/html/rd/p/000000004.000100665.html
・ぐるなびAPI　
URL　https://solution.gnavi.co.jp/information/detail/id=951

# ここでお知らせ！
APIに興味がある初心者の方へ、**基礎から実際のビジネス活用事例まで分かりやすく解説した講座**です！今なら、**このページから1か月限定で94％オフクーポン**を利用できます。今すぐAPIの知識を深め、ビジネスの幅を広げる一歩を踏み出しましょう。クーポンがなくなる前にお見逃しなく！


**クーポンコードはこちら：NOTEAPI202410**

https://www.udemy.com/course/oshiro_002/?couponCode=NOTEAPI202410

**Udemyは購入後30日以内であれば返金可能**
上記講座はUdemyで受講することができ、Udemyでは受講コースに納得がいかない場合、購入後30日以内であれば返金可能となっています。

購入後に「思っていたものと違う」、「学びにならなかった」と感じた場合は、返金申請を出すことができます。

返金の詳細はUdemy公式ページの**コースの返金方法**をご参照ください。
https://support.udemy.com/hc/ja/articles/229604248-%E3%82%B3%E3%83%BC%E3%82%B9%E3%81%AE%E8%BF%94%E9%87%91%E6%96%B9%E6%B3%95
現場に出て感じた質問の難しさ

## はじめに

社会人1年目の中西です。
現場に配属されてから半年が経ちました。

記事を書くにあたって、技術に関してはまだまだわからないことが多いため、
現場業務を行う中で感じた質問の難しさについて書いていきます。

## この題材を選んだ経緯
この題材を選んだ1番の理由は、現場に出て聞きたいことと質問の回答に相違があったからです。
また、私だけでなく同じチームの方々も質問と回答に相違があり、何度も質問している場面を見てきたので、この題材を選びました。

## 質問が難しいと思った2つの理由
#### 1.質問が対面で行えない
私の現場は出社が週1程度のため、基本的にチャットでの質問でした。
そのため、質問のタイミングや1回で送る文章の量など質問内容以外でも考えることが多くとても難しいと感じました。また、新卒で知識量も少なく聞きたいことを文字にする作業がとても難しく感じました。
#### 2.信頼関係を築けていない
上記で述べた出社が週1程度に加え、私の現場は入場時にチームの人に挨拶することもなかったため顔がわからない誰かにチャットで質問するのがとても難しく感じました。

## 質問をするうえで心がけていること
#### 1.質問する前にコミュニケーションを取る
基本的に質問はチームチャットで行うことが多いです。そのため、質問をする前に個人チャットで挨拶をすることで質問しやすい環境を作るようにしました。また、個人チャットをする際も「突然のチャット失礼いたします。」など研修で習ったクッション言葉を活用し、相手の立場を考えて質問やコミュニケーションを取っています。
#### 2.文字だけでなく画像を使う
初めは文章のみで質問をしていたのですが、先輩社員さんにアドバイスをもらってから画像を一緒に載せることを心がけています。質問したい箇所の画像を載せることで相手の方の作業効率も上がるとともに、質問と回答の相違が減りました。
## まとめ
質問することは新卒に限らずこれから先沢山訪れると思います。
今は質問する立場ですが、どちらの立場になっても相手の気持ちを考え質問しやすい環境を心がけて業務の効率化に努めてまいりたいです。
[Joke] 計算を間違える逆ポーランド記法カルキュレータ

計算を間違える逆ポーランド記法の計算機を作りました。
`chmod +x r.py`、`./r.py 10 20 \*`としてください。

`*/?`にはシェルエスケープ`\`が必要です。

Usage: ./r.py <スペースで区切った逆ポーランド記法の式>

エラーチェックはしてません。

```r.py
#!/usr/bin/python3
import sys
import random
stack=[]
s=sys.argv[1:]

while(s):
  e=s[0]
  if (e=='+'):
    stack.append(stack.pop()+stack.pop())
  elif (e=='-'):
    a=stack.pop()
    stack.append(stack.pop()-a)
  elif (e=='*'):
    stack.append(stack.pop()*stack.pop())
  elif (e=='/'):
    a=stack.pop()
    stack.append(stack.pop()/a)
  elif (e=='?'):
    v=stack.pop()
    stack.append(v)
    print(v+random.randint(1,7))

  else:
    stack.append(float(e))
  s=s[1:]

print(stack.pop()+random.randint(1,7))
```
【Ruby on Rails】renderとredirect_to

renderを勘違いしていたので整理。
## renderメソッド
renderメソッドは、呼び出すビューファイルを指定することができる。
```ruby:例
render :edit
```
コントローラー内で使用するメソッドだが、処理がうまくいかなかったときに、元のページに戻る処理で使われることが多い。
理由は、元のページのデータをそのまま保持することができるため。

## redirect_toメソッド
redirect_toメソッドは、指定のurlへ遷移するようリクエストを送信している。
コントローラー内で使用し、pathやURLを指定する。
```ruby:例
redirect_to root_path
```
renderがビューファイルを指定しているのに対して、redirect_toは再度ルーティングを通してコントローラーで処理が行われている。

## renderメソッドでのビュー再表示
renderメソッドは便利で、フォームでの入力ミスがあった時でも、元のページに戻り、かつ入力値が残ったままになる。
しかし、ビュー内で他のコントローラーに定義されているインスタンス変数を使用している場合、再度インスタンス変数の定義が必要となる。

Postsコントローラーでユーザーの投稿詳細を見るshowアクションにコメント投稿欄とコメント表示していた場合。
```ruby:Postsコントローラー
def show
  @comment = Comment.new
  @comments = @post.comments.includes(:user)
end
```
```ruby:Commentsコントローラー
def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.new
    if @comment.save
      redirect_to post_path(@post)
    else
      @comments = @post.comments.includes(:user)
      render "posts/show", status: :unprocessable_entity
    end
  end
```
commentsコントローラーでは保存が失敗したらpostsコントローラーのビューファイルshowを呼び出すが、postsコントローラーを経由しないため、再度@comments = @post.comments.includes(:user)でpostへのコメント一覧を取得する必要がある。

## まとめ
同じビューに戻ると思っていたが、コントローラーを経由しないため、アクションが呼び出されないので必要なインスタンス変数は再定義が必要ということを学びました。
JUnitを用いた単体テストについて

## 目的
本記事は私が学んだことについての備忘録です。
最近JUnit+MockKやJUnit+Mockitoを用いた単体テストの作成を行う機会が多かったため、
今回はそれらのテストについてまとめていきます。

## アノテーション
JUnitのテストでよく見かけるアノテーションを紹介します。
以下の2つのアノテーションはMockK、Mockitoどちらでも同じように使用します。

### Test
テストメソッドにつけるアノテーションです。
JUnitを用いる場合必ず見かけると思います。
```java:fugaTest.java
@Test
void fugaTest() {
    // テスト内容
}
```
```kotlin:fugaTest.kt
@Test
fun fugaTest() {
    // テスト内容
}
```

### Before
テストを開始する前に初期化しておきたい処理を行うメソッドにつけるアノテーションです。
このアノテーションを使用する場合、戻り値と引数を持たないメソッドであることが必要です。
メソッドの名前はsetUpであることが多い印象です。
```java:fugaTest.java
@Before
void setUp() {
    // 初期化しておきたい処理
}
```
```kotlin:fugaTest.kt
@Before
fun setUp() {
    // 初期化しておきたい処理
}
```

### MockK
名前の通りMockKで使用するアノテーションです。
モック化したい変数につけます。
```kotlin:fugaTest.kt
@MockK
private lateinit var value1: String
```

### Mock
Mockitoで使用するアノテーションです。
MockKと同じくモック化したい変数につけます。
```java:fugaTest.java
@Mock
private String value1;
```

## アサーションとMatcher API
JUnitテストで見かけるアサーションとMatcherAPIの組み合わせを紹介します。

### assertEquals
値が期待値通りの値か確認するアサーションです。
Equalsとある通り一致しているかどうかをチェックしているため、一致判定以外の判定を行いたい場合には向きません。
左側が期待値、右側が実測値です。

```java:fugaTest.java
@Test
void fugaTest() {
    int value = 100;
    assertEquals(100, sum);
}
```

### assertThat
値が期待値通りの値か確認するアサーションです。
assertEqualsと違い、左側が実測値、右側が期待値となります。

```java:fugaTest.java
@Test
void fugaTest() {
    int value = 100;
    assertThat(sum, is(100));
}
```

## モックインスタンスにパターンを設定する
題名の通りモックの振る舞いを定義するやり方について紹介します。

### every {} returns
MockKで使用できます。
{}の中にスタブ化したいメソッドを記載し、returnsの後にメソッドが呼ばれた際に返したい値を設定します。
下のコードを例として挙げると、mode.getMode()が呼ばれた場合Mode.Testを返すという設定をしています。
```kotlin:fugaTest.kt
@MockK
private lateinit var mode: Mode

@Test
fun fugaTest() {
    every { mode.getMode() } returns Mode.Test
}
```

### when().thenReturn()
Mockitoで使用できます。
everyと使用用途は同じで、when()の中にスタブ化したいメソッドを記載し、
thenReturn()の中にメソッドが呼ばれた際に返したい値を設定します。
```java:fugaTest.java
@Mock
private Mode mode;

@Test
void fugaTest() {
    when(mode.getMode()).thenReturn(Mode.Test);
}
```

## おわりに
備忘録なのでただただ自分用のメモを書き連ねたような簡単な記事ですが、
もし誰かのお役に立てれば幸いです。
最後まで閲覧いただきありがとうございました。🙇‍♀️

## 参考にさせていただいたサイト
[MockKについて](https://qiita.com/dev-tatsuya/items/d3cfc9853c53dfaee222)
[Mockitoについて](https://qiita.com/opengl-8080/items/dcdf2cb14f2642240a5b)
[JUnitについて1](https://qiita.com/gengogo5/items/317b6f260b6fecc184fc)
[JUnitについて2](https://qiita.com/maple_syrup/items/9b45f3a36a44682bf1fa)
djangoでUniqueViolationの例外エラーを取得する

# はじめに
djangoで開発を行っている際にUniqueViolationのエラーを取得して例外処理を行うような処理を書く機会がありました。しかし、SQLAlchemyでのエラー取得のものしか見つからず、苦戦したのでdjangoで同じように困っている人の助けになればと思います。

# そもそもUniqueViolationとは
UniqueViolationとは一意制約違反をあらわします。簡単にいうとDB内に重複した値を入れてはいけないことを示します。使用例として以下のテーブルのようなidに一意性があり、idを使って社員を管理している会社があるとします。idを参照すれば社員の名前と年齢が確認でき、社員を特定できます。それでは、新たに二人の社員のデータを追加するとしましょう。
| id | name | age |
| --- | --- | --- |
| 001 |  田中 | 25 |
| 002 | 山本 | 30 |
| 003 | 菅谷 | 35 |

idが003の箇所で重複が発生していますね。これではidを参照して社員の特定ができないため、一意性が保たれていません。
| id | name | age |
| --- | --- | --- |
| 001 |  田中 | 25 |
| 002 | 山本 | 30 |
| <font color="red"> 003 </font> | 菅谷 | 35 |
| 004 |  大川| 30 |
| <font color="red"> 003 </font>|竹之内 | 35 |

こういった現象を防ぐためにUniqueViolationを使用してidに重複したデータがないかを確認して一意性のあるものに保つことができます。

# djangoのUniqueVaolationのエラー取得
さて本題に入ります。「直接UniqueVaolationをexceptで取得すればよいのでは…」と思うかもしれません。私もそう思いました。一意制約違反時IntegrityErrorを取得してしまっているようなので直接UniqueVaolationをexceptで取得することができませんでした。

```python:UniqueVaolation取得不可例
from psycopg2.errors import UniqueViolation

    try():
        # データ操作
    except UniqueVaolation:
        # UniqueVaolation時の処理
```
IntegrityErrorのエラーの発生原因の一つとしてUniqueVaolationがあるので、IntegrityErrorのエラー原因を取得し、UniqueVaolationであるかを確認することでできるようです。実際に成功したものは以下の通りです。
__cause__を用いてエラーの原因を取得し、isinstanceでエラー原因にUniqueViolationが含まれているかを判定します。if文を用いて含まれているときにUniqueViolation時の処理を行うといった流れになります。
```python:UniqueVaolation取得例成功例
from psycopg2.errors import UniqueViolation

    try():
        # データ操作
    except IntegrityError as e:
        if isinstance(e.__cause__ , UniqueViolation)
            #UniqueViolation時の処理
```
# まとめ
djangoでUniqueViolationのエラーを取得する際は例外処理のIntegrityError内でエラーの原因がUniqueViolationであるかを調べるUniqueViolationのエラー取得を行えることがわかりました。
読みづらくわかりずらい文章となっておりますが、みなさんの手助けとなれば幸いです。

# 参考情報
- [一意制約とは |「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12717.html)
autohotkey v1 とv2との違い

# autohotkey v1をインストールした履歴があるなかv2へアップデート

それがなかなか難しいとわたくしには感じられました。
autohotkey v1をchocolateyでインストールしたのですが、uninstallコマンドがうまくいきませんでした。それが原因なのかわかりませんが、wingetでv2をインストールしようとしたのですが、うまくいってなさそうでした。

## v1, v2でインストール場所がちがうらしい

- v1: `program files` directory 
- v2: `programs` directory 

v1のアンインストールが下手だと、v2の実行ファイルたちが`program files`に入ってしまいます。あと`AutoHotKey Dash`などがスタートアップに生成されるはずが、古いバージョンのままであるのがその原因のように思われました。

## autohotkey dashのプロパティをいじる羽目に

autohotkey dashって奴のプロパティひらいて
自作のスクリプトをひらくようにしました。そのうえで
startupにautohotkey dash自体がショートカットなのだが、
それのコピーを登録しました。

あと、シンタックスが微妙に異なります。

v1v2問題をスッキリと解決する方法はないのでしょうか？
Amazon Bedrockを使ってみた

# 背景
社内でAWS勉強会を開催すべく、ネタ探しのためにBedrockを使おうとしたら色々と躓いたので、自分への備忘録として残しておく。

# モデルアクセスのリクエストができない。。。
早速使おうとしたがモデルへのアクセス権がないといわれる。
モデルアクセスにアクセスしてみてもアクセス権が付与できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/c9cafcf2-5ff1-bae3-04f8-72fc058e5f86.png)

rootアカウントでも同じ画面が表示され、有効化できないどうすればええんや。。。

# 助けて！AWSサポートさん！！

使用不可のところにカーソルを合わせると以下の文章が表示された。

> This model is unavailable. To enable access to this model, contact support . Note that your request may be fully approved, partially approved, or denied to maintain service performance and ensure appropriate usage of Amazon Bedrock.

拒否するかもしれないけど、サポートにいったん問い合わせてねという感じの記載。とりあえずサポートセンターから問い合わせてみることに。私用のアカウントであるためベーシックプランを利用している。技術サポートは受けれないため「アカウントと請求」から以下のような形でケースを作成した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/ae9bc02d-7be7-8c84-02ab-e55fbc3ee454.png)

追加情報にはBedrockでモデルを利用したい旨を記載して問い合わせを実施。

すると2日後に返信が来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/399c830f-717b-c6ae-dc1a-ccf955957250.png)

Bedrockを確認してみるとモデルをリクエストできるようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/ea45120c-a480-3a77-c63e-34bae5a79cb8.png)

しかし、いざClaude 3.5 Sonnetにチェックを入れてモデルアクセスをリクエストしようとすると。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/f555ffa8-4e75-9646-de92-e96ea9629f33.png)

個人用だが何かしら登録しないと進まないのでとりあえず所属している会社を登録した。

モデルアクセスをリクエストするとなんと数分でリクエストが通りアクセスが付与されました！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/769927cd-ab70-6f52-6e25-02c7de60d400.png)

# 早速Bedrock playgroundでClaudeを使ってみた！
左側のメニューより「プレイグラウンド＞Chat/text」をクリック。
「モデルを選択」というのが出てくるのでこれをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/f1c9030e-d639-f377-2e51-73d428d6403f.png)

モデルを選択してみると「3.スループット」に「オンデマンド」と「APAC Anthropic Claude 3.5 Sonnet」というのが表示されている。
「スループット」とはモデルが処理して返すことができる入力と出力の数のレートを示しており、「オンデマンド」にすると使用量に応じて課金が発生する形になり、標準的なスループットとなる。もう一つの「APAC Anthropic Claude 3.5 Sonnet」というのは「プロビジョンドスループット」にあたり、特定のユニット数を先に購入してコストが固定になる代わりに高いレベルのスループットを確保できるというものになる。

今回はお試しで利用したいので、「オンデマンド」を選択。

これによりプロンプトを入力できるようになり、無事に利用することができました！！
（Claudeさんからコメントもいただいています↓）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272113/09c5d4f1-2a59-3105-78d1-8a8e55921b97.png)

# 最後に
これでBedrock × Claudeで遊べるぞ！！
頑張って勉強会の資料を作らねば。。。
DBにおけるインデックスとは

## はじめに
アプリ開発をするにあたって、DB設計をする際に今までインデックスについてあまり意識していなかったので今回の記事を通して十分に理解しDBのパーフォーマンス向上をさせていければと思います！

#### 目次
1. （前提）DBの設計を意識した方が良いことは？
1.  インデックスって何？
1.  メリット、デメリット
1.  実際に使用した例

## 1.（前提）DBの設計を意識した方が良いことは？

**・要件定義**
**・正規化とリレーション設計**
**・インデックス設計**
**・データ型とサイズ**
**・制約の設定**

などになります。
今回はその中の、インデックス設計について見ていければと思います。

## 2. DBにおけるインデックスって何？
DBにおけるインデックスとは、データベーステーブルの特定のカラム対して作成するデータ構造のことです。
より簡単に言うと、「索引」です。

#### ▽インデックスの役割
インデックスは本の索引のように、データがどこにあるかを高速に検索できるようにします。
SQLパフォーマンスチューニングとして使用されることが多いです。

#### ▽インデックスがある場合とない場合
・インデックスなしでの検索:
データベースはテーブルのすべての行を順番にチェックして、条件に一致するデータを探します（フルテーブルスキャン）

・インデックスありでの検索:
インデックスを使うことで、データベースはテーブル全体をスキャンすることなく、インデックスから直接必要なデータの位置を取得できます（インデックススキャン）

## 3. インデックスを使用するメリットとデメリット
### ＜メリット＞
#### 検索速度の向上
インデックスを使用することでテーブル全体を一から検索する必要がなくなります。
例えば、nameやemailで検索する場合、インデックスを利用すれば、指定したカラムのデータがすぐに見つかります。

#### ORDER BYやJOINが高速化
インデックスを使用することで並べ替えや結合の処理時間を短縮することができます。

例 「顧客一覧を名前順に表示したい」という場合
```SQL
SELECT * FROM Customers ORDER BY name;
```
インデックスがない場合、通常すべての行を取り出してから名前順に並べ変える必要があり時間がかかります。
しかし、インデックスを使用している場合（基本昇順で並んでいる）、データベースはすでに並べ替えられたインデックスを使ってデータを取得できるため通常よりも早くデータを取得できます。

### ＜デメリット＞
#### 挿入・更新・削除の低下
インデックスはデータの検索を高速化しますが、データを挿入（INSERT）、更新（UPDATE）、削除（DELETE）する際には、そのインデックスも更新しなければならないため、これらの操作の速度が遅くなることがあります。
例：新しい行をテーブルに挿入する際、インデックスもその行を追加する必要があるので、挿入処理が少し遅くなります。

#### 過剰なインデックス作成による性能の低下
無駄なインデックスはメモリを消費し、最終的に逆効果になることもあります。

## 4. 実際に使用した例

#### 基本構文
```
CREATE INDEX インデックス名 ON テーブル名(カラム名);
```

ユーザーが大量に登録されているUsersテーブルがあるとします。このテーブルにはid、name、emailなどのカラムが含まれています。
```java: SQL
CREATE TABLE Users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);
```
このテーブルで、「特定の名前を持つユーザーをすばやく検索」する場合、nameカラムにインデックスを作成すると、検索が速くなります。
```java: SQL
-- name カラムにインデックスを追加
CREATE INDEX idx_users_name ON Users(name);

```

## さいごに

今回インデックスについて学ぶことで、データベース設計の中で意識すべきポイントがかなり見えてきました。特に、検索や並べ替えの速度向上に役立つインデックスは、アプリのパフォーマンス改善に直結するんだなと感じました。ただし、挿入・更新の際に影響が出ることや、むやみにインデックスを増やすと逆効果になるリスクもあるので、ここは慎重に考える必要がありそうです。

これからの開発では、今回学んだインデックスの知識を活かして、必要な部分にだけうまくインデックスを配置することで、より効率的で快適なアプリケーションを作れるよう頑張っていこうと思いました！
linear-gradient()の使い方３選

# はじめに
学んだことを忘れないように備忘録として残しています

linear-gradient()は主にグラデーションを作るCSSプロパティです。
本記事ではそれ以外の使い方も併せてざっくりと紹介していきます。

## 1.グラデーションを作る
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExqMKKK" data-pen-title="Untitled" data-user="vccpppsz-the-flexboxer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/vccpppsz-the-flexboxer/pen/ExqMKKK">
  Untitled</a> by 柏木菜南 (<a href="https://codepen.io/vccpppsz-the-flexboxer">@vccpppsz-the-flexboxer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 2.画像にフィルターをかける

linear-gradient()の開始色と終了色を同じ色にすれば、一色のフィルターをかけることができます。

【before】
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="zYgbqMZ" data-pen-title="Untitled" data-user="vccpppsz-the-flexboxer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/vccpppsz-the-flexboxer/pen/zYgbqMZ">
  Untitled</a> by 柏木菜南 (<a href="https://codepen.io/vccpppsz-the-flexboxer">@vccpppsz-the-flexboxer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

【after】

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="GRVeZBY" data-pen-title="Untitled" data-user="vccpppsz-the-flexboxer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/vccpppsz-the-flexboxer/pen/GRVeZBY">
  Untitled</a> by 柏木菜南 (<a href="https://codepen.io/vccpppsz-the-flexboxer">@vccpppsz-the-flexboxer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 3.マーカー線を引く

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="qBevrRW" data-pen-title="Untitled" data-user="vccpppsz-the-flexboxer" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/vccpppsz-the-flexboxer/pen/qBevrRW">
  Untitled</a> by 柏木菜南 (<a href="https://codepen.io/vccpppsz-the-flexboxer">@vccpppsz-the-flexboxer</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


↑は0~75%が透明。75~100%がオレンジという意味。0と100%は下記のように省略してもOK


```css
  .sample-marker { 
    background-image: linear-gradient(transparent 70%, #ffbb1e 70%); 
  }
```
AWS CodeBuildでソースのブランチによって処理をわける

この記事は個人の備忘録です。

# やりたいこと
- 1つのビルドプロジェクトで複数のブランチに対応したい


図にすると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/dad9fa28-47ec-b843-d771-1f8b1861e950.png)
これを


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490265/3adf586c-4962-3b3d-54c5-2c33aef171f6.png)
こうしたい

# やり方
AWS CodeBuild には、ビルドコマンドで使用できる環境変数が用意されているので、それで条件分岐させる。

今回はCODEBUILD_INITIATORというCodePipelineの名前の環境変数で分岐させることにしました。

ProPopelineとDevPipelineがProブランチとDevブランチを監視しており変更があれば、ターゲットのPipelineを通じてCodeBuildにわたるという仕組みです。

本当はPipelineも1つにしたかったのですが、とりあえず、今回はCodeBuildのみを1つにまとめてみました。

## build spec yml例
~~~
version: 0.2

phases:
  build:
    commands:
      - echo "CODEBUILD_INITIATOR: $CODEBUILD_INITIATOR"
      - |
        if [[ "$CODEBUILD_INITIATOR" == "codepipeline/DevPipeline" ]]; then
          export S3_BUCKET="**********" # S3_BUCKET名を環境ごにわけたりする
          echo "Environment: DEV"
        elif [[ "$CODEBUILD_INITIATOR" == "codepipeline/ProPopeline" ]]; then
          export S3_BUCKET="**********"
          echo "Environment: PRO"
        else
          echo "Unknown initiator. Exiting."
          exit 1
~~~

# まとめ
こんな感じで無事にブランチごとに乱立しており管理が煩雑だったCodeBuildのプロジェクトを1つにまとめてることができました。

次はPipelineも1つにしたいです。

# リファレンス
[CodeBuildで使える環境変数](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html)
ChatGPTのAPI活用事例：プロフィール文の添削機能でマッチング率アップ！

# APIの活用事例
近年、AI技術の進展により、ChatGPTのような対話型AIの活用がさまざまな業界で注目を集めています。本記事では、**ChatGPTを利用した具体的な事例**として、マッチングアプリ「タップル」に導入されたプロフィール文の添削機能について、そのメリットや導入の背景を詳しく解説します。

## チャットGPTについて
・ChatGPTは、ユーザーからのリクエストに応じてAIが自動で回答を生成するAPIで、さまざまな質問に対応できる機能を備えています。

・料金体系はトークン（処理に使用される単位）に基づき、1000トークンあたり約3,000円程度。簡単な質問なら1回0.1円ほどで利用可能です。

・また、5ドル分の無料枠が用意されているため、初めてでも気軽に試すことができます。ただし、料金は変動するため、長期的な利用を検討する際は価格の変動に注意が必要です。

![](https://storage.googleapis.com/zenn-user-upload/2078f79505ad-20241107.png)
**チャットGPTについて**


## 具体的な活用方法について
**１、ChatGPTの基本機能とAPI詳細とその流れについて**

・ChatGPT APIは、質問をリクエストとして送り、AIがその回答をレスポンスとして返すシンプルな構造です。例えば「日本一高い山は何ですか？」といった質問を送ると、「日本一高い山は富士山で、高さは3776Mです」といった具体的な回答が返されます。

・このような自然な対話形式のAIは、リクエストパラメータに応じて柔軟に対応できるため、情報提供や文章生成など幅広い用途に利用されています。

![](https://storage.googleapis.com/zenn-user-upload/44108771fe87-20241107.png)
**API詳細とその流れについて**

**２、活用事例：マッチングアプリ「タップル」**
・マッチングアプリ「タップル」はChatGPTのAPIを活用して、ユーザーのプロフィール文をAIが添削する「プロフィールAI添削」機能を導入しました。この機能により、プロフィール文章の質を高め、マッチング率を向上させることが可能です。



![](https://storage.googleapis.com/zenn-user-upload/943c97206f21-20241107.png)
**チャットGPT×タップル**

**・効果的なプロフィール文の重要性**：タップルの調査によると、プロフィール文を充実させることで、マッチング率が35％向上することがわかっています。この結果を踏まえ、タップルはプロフィール文の質を高めるためのAI添削機能を開発し、ユーザーの出会いの成功率向上を図っています。

**・差別化要素**：他のマッチングアプリにはない機能であるため、タップルのユニークな強みとして会員にアピールすることができます。

![](https://storage.googleapis.com/zenn-user-upload/8c51fb44beea-20241107.png)

**チャットGPTを活用する目的**


**３、AIの回答とリスクの管理**
・ChatGPTは高度なAIですが、生成する回答には完璧な保証があるわけではありません。提供元であるOpenAIでは、情報の利用について同意が求められており、**利用者がAIによる回答の限界を理解した上で活用することが推奨**されています。

**・注意点**：医療や銀行などの正確さが求められる業界では、AIの導入には慎重な判断が必要です。タップルの場合はプロフィール文の添削であり、多少の誤りが許容されるため、同意の上でサービスを提供できるという背景があります。こうしたリスク管理をしつつ、AIの利便性を活かす方法を検討することが重要です。

## まとめ
ChatGPTは、その柔軟な対話機能を活かし、さまざまな業界で活用が進んでいます。特にタップルの事例では、プロフィール文の添削という特定の機能でマッチング率向上に貢献しています。AIのメリットを最大限に活かすためには、リスクも踏まえた活用が重要です。今後もAI技術の進展により、新たな活用の場が広がっていくことが期待されます。

また、今回の活用事例以外にも、下記のお知らせの講座にて実際の画面やさらに詳しい解説をしているので、**APIの活用方法の発想に困っている方や、さらに活用事例を知りたい、もっとAPIの知識を深めたいという方**はチェックしてみてください。

# ここでお知らせ！
APIに興味がある初心者の方へ、**基礎から実際のビジネス活用事例まで分かりやすく解説した講座**です！今なら、**このページから1か月限定で94％オフクーポン**を利用できます。今すぐAPIの知識を深め、ビジネスの幅を広げる一歩を踏み出しましょう。クーポンがなくなる前にお見逃しなく！


**クーポンコードはこちら：NOTEAPI202410**

https://www.udemy.com/course/oshiro_002/?couponCode=NOTEAPI202410

**Udemyは購入後30日以内であれば返金可能**
上記講座はUdemyで受講することができ、Udemyでは受講コースに納得がいかない場合、購入後30日以内であれば返金可能となっています。

購入後に「思っていたものと違う」、「学びにならなかった」と感じた場合は、返金申請を出すことができます。

返金の詳細はUdemy公式ページの**コースの返金方法**をご参照ください。
https://support.udemy.com/hc/ja/articles/229604248-%E3%82%B3%E3%83%BC%E3%82%B9%E3%81%AE%E8%BF%94%E9%87%91%E6%96%B9%E6%B3%95
Databricks 環境提供時に Personal Compute 設定の管理ミスによる失敗談と対応策

## 概要

Databricks 環境では、クラスターの作成権限（Unrestricted cluster creation を OFF）がなくても Personal Compute が有効であれば Personal Compute を作成できます。最近、Databricks 環境を提供する機会がありましたが、この仕様に気づかずに環境を提供してしまい、結果として大量の Personal Compute が作成されてしまいました。皆様が同様の失敗をしないように、この仕様についての情報を共有します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/77c4c9e3-71a5-e1ab-505c-6c73a5d50b17.png)

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a4934e4e-7ef5-a427-49f2-46b6f18004e3.png)

Personal Compute は基本的に無効化することを推奨しますが、有効化する場合はポリシーの修正をおすすめします。自動停止時間のデフォルトが 72 時間であるため、今回は無駄なコスト支出となってしまいました。利用する際は計画的に行いましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d516819a-ab3b-ad90-8891-a8ca28efd0d9.png)

引用元：[個人用コンピューティング ポリシーを管理する - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/admin/clusters/personal-compute#personal-compute-policy-details)

## Personal Compute について

Personal Compute とは、Personal Compute policy により作成できるクラスターです。ドキュメントには以下のように記載されており、すべてのユーザーが Personal Compute を作成できるようになっています。

> 既定では、Azure Databricks アカウント内のすべてのユーザーは、パーソナル コンピューティングの既定のポリシーにアクセスできます。 これは管理者が変更できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/83016669-8a78-c99f-1001-9f1c7bd71de9.png)

引用元：[個人用コンピューティング ポリシーを管理する - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/admin/clusters/personal-compute)

上記ドキュメントには、管理者がこの設定を変更する方法も記載されています。基本的には、アカウントレベルでの有効/無効を設定するようです。

![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1d99ac3c-9899-ee3a-9461-1f3b8560e5ac.png)

引用元：[個人用コンピューティング ポリシーを管理する - Azure Databricks | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/databricks/admin/clusters/personal-compute#manage-policy)

## Personal Compute を作成できる仕様の確認

### 1. 管理アカウントで Personal Compute の機能を有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7a1521c9-f3be-af20-4bf4-4b255114802d.png)

### 2. 検証用ユーザーをワークスペースに追加し、クラスターを作成できないように設定（Unrestricted cluster creation を OFF）

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/173ecfaa-cf1f-4a7f-b537-f58333683db9.png)

### 3. 検証用ユーザーで Databricks ワークスペースにログインし、Personal Compute を作成できることを確認（Compute -> All-purpose compute -> Create with Personal Compute を選択）

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/88f268bb-4850-ae40-4b84-dedbd97e0f8f.png)

![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a4934e4e-7ef5-a427-49f2-46b6f18004e3.png)

## Personal Compute を作成できる仕様への対応方法

### 1. アカウントレベルでの Personal Compute の無効化

#### 1-1. 管理者アカウントで Personal Compute の機能を無効化

![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7900afd3-5d3e-d799-281e-85c8bebe7558.png)

#### 1-2. 検証用アカウントでクラスターを作成できないことを確認（Create with Personal Compute が非アクティブであることを確認）

![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5a3b38ee-1bc7-de0e-b825-0cbe7684e5d7.png)
Power Automateでモックデータを作成してテストを実行する

Power Automateに搭載されているモック出力の機能を最近知ったので備忘録として書いておきます。

# 静的な結果を利用する
特定のアクションを実行するのではなく、固定値の結果を返したい場合は、アクションの三点リーダーから［静的な結果(プレビュー)］を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/861cfdc4-ca4c-5afb-19b4-e049876a0e2d.png)


Power Automateのモック出力に関する詳細は、以下記事をご確認ください。

https://learn.microsoft.com/ja-jp/azure/logic-apps/test-logic-apps-mock-data-static-results?tabs=consumption


「静的な結果の有効化」をオンにして、返したい値をJSON形式でbodyに入力します。これだけでモックデータを作成してフローを実行できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/9314a10c-a16a-cd02-86fa-581731bc5802.png)

# 「静的な結果(プレビュー)」機能のメリット
SharePointリストのアイテムやOfficeグループメンバーをわざわざ100件,200件,,,とテストデータを実際に作成するのは面倒ですが、その手間が省けるのでこの機能は非常に便利ですね。

実際に、Bodyに入力するモックデータはChatGPTに生成してもらえばよいです。例えば、「〇〇というJSON形式のデータをN件生成してください。」のようなプロンプトを入力して、生成されたモックデータをそのままBodyにコピペするみたいな感じで。
Svelteのコンセプトに心打たれ、触れてみて書きやすさに感動し、Runeの使いやすさに涙した…けど、たった一点の理由で結局Vueに帰還したお話

先日[バージョン5](https://svelte.dev/blog/svelte-5-is-alive)が公開されたSvelteを二週間ほど触ってみました。
仮想DOMを使わず、コンパイラーでコードを出力し高速な処理を実現するというコンセプトや、サンプルコードの見やすさに感心し興味が湧いたからです。

実際に使ってみるとまぁ本当にコードが書きやすい。
私は元々Vue開発の経験があったのですが、Vueで「めんどくさいなぁ」と感じた諸々の箇所がとても分かりやすくなってたのが非常に好印象でした。

個人的にsvelteがステキだと思った要素は以下の通り。

### リアクティブ変数の仕様がシンプル

まず、Vueでコードを書く際に多用する``ref``や``reactive``はsvelteだと必要ありません。常時全ての変数がリアクティブです。
算出プロパティを表現するのも$記号一つで済みます。
```vue:vue
import { ref, reactive } from 'vue';
const hoge = ref(0)
const fuga = reactive({
    hage: true,
    boke: ""
})
const honya = computed(() => hoge + 1)
```
```svelte:svelte
let hoge = 0
let fuga = {
    hage: true,
    boke: ""
}
$: honya = hoge + 1
```
値にアクセスするのに``value``を参照しなくていいため書き間違えも起こしにくいです。

### HTML部分の記述もシンプル
HTML部分の記述ルールもsvelteは大幅に簡素化されており、vueではdiv要素などに``v-if``や``v-for``を付けて実装していたDOMの分岐・繰り返し処理も、専用の``{#if}``や``{#each}``のブロックで実装できるため処理の区切りがとても分かりやすいです。
```vue:vue
<div v-if="...">
 ...
</div>
<div v-else-if="...">
 ...
</div>
<div v-else="...">
 ...
</div>

<div v-for="... in ...">
 ...
</div>
```
```svelte:svelte
{#if}
 ....
{:else}
 ....
{/if}

{#each ... as ...}
 ....
{/each}
```

ね、一目瞭然でしょう？


この分かりやすさに心打たれ、ここ二週間ずっと暇さえあればSvelteの学習に励んでいました。

ちょうど同時期にTauriも勉強してたため、しばらくSvelte+Tauriの構成でデスクトップアプリ開発に励み、
試行錯誤の結果、[Elin Portrait Editer](https://www.nexusmods.com/elin/mods/6?tab=description)と[Elin Auto Backup Tool](https://www.nexusmods.com/elin/mods/8)という二種類のアプリもリリースしています。

### 新機能Runeも良い感じ

Auto Backup Toolを開発した段階ではsvelteにもだいぶ慣れてきたので、V5からの新機能である``Rune``にも手を出してみました。

Runeとは、分かりやすく言うとVueやReactのstateです。
.svelteファイル以外のjs/tsファイルでも、拡張子の前に「.svelte.」が付いていればsvelteの構文が使えるため、コンポーネントの外でstateの宣言が可能です。
Vueのpiniaでも外部のtsファイルでstateの宣言が出来ますが、Runeはimportもキーワードも不要でよりシンプルに記述できます。
```typescript:nantara.ts
import { defineStore } from "pinia"

export const hogeStore = defineStore("sample", {
    state: () => {
        return {
            hoge: "",
            fuga: ""
        }
    }
})

```

```svelte:nantara.svelte.ts
export const myState = $state({
    hoge: "",
    fuga: ""
})
```

Runeの便利なところは宣言したStateのオブジェクトをそのままコンポーネントでimportして値にアクセスできること。
piniaも同じことが出来ますが、Runeは宣言不要で取り出してすぐ中の値にアクセスできます。
(エクスポートした値そのものは変更できないので注意)

```vue:honyarara.vue
import { hogeStore } from './other-store'
const hoge = hogeStore()

hoge.$patch = { hoge: "hoge" }
```

```svelte:honyarara.svelte
import { myState } from './other-store'
myState.hoge = "hoge"
```

### Svelteめっちゃ快適！！しかし……
以上のようにVueと比較すると大幅に簡略化され便利になっているsvelteですが、ある一点の理由で残念ながらしばらく採用を断念せざるを得ませんでした。それは……

### 最新版に対応したdevtoolが無い
これが本当に残念でならない。
svelteもvueやreactと同じくコンポーネント内のリアクティブな変数の変更はdevtool無しでは検出が難しいです。
しかし、現段階では最新のSvelte V5に対応したdevtoolはまだリリースされていません。
せっかく使えるようになったRuneも、コンポーネントを超えて値を保持するstateをdevtool無しで運用していくのはナン ノブ マイ ビジネス（夜に影を探すようなもの)、
ちょっと厳しいです。

## まとめ
というわけで、しばらくの間はVue主軸で開発を続けようと思います。
Svelteの快適さは本当に魅力なので早くv5対応のdevtool(欲を言えばスタンドアロン版も)出てほしいなぁ
新卒が業務を通して感じたこと・学んだこと

# はじめに
社会人1年目の塩谷です。
今回は、新卒が業務の中で感じたこと、その経験からどういうことを学んだのかを書いていきたいと思います。
# 業務の中で感じたこと
<h4>1.質問が難しい</h4>
　個人的にこれが一番苦労しました。
 どこがわからないのか、どう言語化すれば伝わりやすいのか、話しかけるタイミングを見つけるなど様々な点で気を付ける要素がありました。
また、質問する際にどうしても相手がどう思うかを気にすることがあり、「こんなことで聞いていいのか？」と思い聞きそびれてしまうこともありました。
<h4>2.行っている作業が合っているのか</h4>
　
タスクを振られた際にやり方を教えてもらっていても認識の齟齬が発生することが多々ありました。齟齬が発生してしまうと作業のやり直し、作業の遅れやチームメンバーにも迷惑をかけてしまうこともあります。
<h4>3.言葉遣い</h4>
　社会人の当たり前な要素ですが、私個人が意識して話していても相手にとって誤解を招くことがありました。
特に敬語を意識して話している中で成果物の進捗はどのくらいなのかと聞かれた際に、「〇割りくらい完了しております。」と曖昧な表現をしてしまった経験があります。
この場合、チームリーダー目線だと具体的な数字を求めていて、曖昧な形で報告すると人を増やさないと終わらないのかといった誤解を招くことになります。

# 学んだこと
<h4>1.話す前に話す内容の言語化・文字お越しをする</h4>
　
言いたいことや伝えたい内容を<ins>事前に整理し、明確に言葉として表現できる状態にする</ins>ことが大事だと感じました。
重要なポイントを絞ったり、話す順番も考えて話すと相手に伝わりやすくなると思います。
　
<h4>2.フィードバックを受け入れ、改善する</h4>
　業務の中でこうした方がいい、こういうところを意識して取り組んだ方がいいといった自分の視点からは気づかないところを指摘してくださる<ins>機会を無駄にせず、受け入れることが大切</ins>だと感じました。
フィードバックを受け入れ、改善することで、より円滑に仕事を進められるようになり、周囲の信頼も得られると思います。
<h4>3.とにかく経験する</h4>
　
1と2の要素を含みますが一番自分にとって成長できることは経験だと思いました。
どんなに準備をしても、実践を通じて初めて学べることがあります。
例えば、質問をするタイミングや方法を実際に試すことで、効果的な質問方法を学びました。また、タスクを進める中で自分の進め方を修正し、改善していくことができました。<ins>失敗やミスも貴重な経験として次に活かせる</ins>ことを実感しています。
 
# おわりに
 　私個人インプットしてもアウトプットすることができたりできなかったりする場面があるので改めて意識して取り組みたいと思います。
 
　ここまで閲覧いただきありがとうございました。