OmniAICreator/Qiita-1.07M huggingface dataset:
Next.jsでナビゲーションバーを作成する方法

## はじめに
Next.js(バージョンは14.2.3)でNavigationBarを作成したのでそれに関しての議事録を残します

## 結論
実装画面は↓こんな感じ
(スマホ用に実装したのでプロパティを変更する可能性あり)


![BottomAppBar_デモ動画.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3758326/1f45af60-16df-68e1-91dd-b6a06261ee5a.gif)

以下のソースコードをコンポーネント化して任意の箇所に張り付ける
```PowerShell:BottomAppBar.tsx
const BottomAppBar = () => {

    //現在どのパスを参照しているかを確認するためのuseState
    const [pathname, setPathname] = useState('');
    const router = useRouter()

    //現在のパスを格納
    useEffect(() => {
        setPathname(window.location.pathname);
    }, []);

    //ボタンを押すとURLを更新
    const navigateTo = (path: string) => {
        router.push(path);
    }

    const navItems = [
        { path: '/home', selectedIcon: <HomeIcon sx={{ width: 35, height: 35 }} />, defaultIcon: <HomeOutlinedIcon sx={{ width: 35, height: 35 }} /> },
        { path: '/add', selectedIcon: <AddCircleOutlinedIcon sx={{ width: 35, height: 35 }} />, defaultIcon: <AddCircleOutlineIcon sx={{ width: 35, height: 35 }} /> },
        { path: '/star', selectedIcon: <StarIcon sx={{ width: 35, height: 35 }} />, defaultIcon: <StarBorderIcon sx={{ width: 35, height: 35 }} /> },
        { path: '/account', selectedIcon: <AccountCircleIcon sx={{ width: 35, height: 35 }} />, defaultIcon: <AccountCircleOutlinedIcon sx={{ width: 35, height: 35 }} /> }
    ];

    return (
        <Box>
            <BottomNavigation sx={{
                width: '100%',
                height: '6%',
                bgcolor: 'white',
                position: 'fixed',
                justifyContent: 'center',
                bottom: 0,
                left: '50%',
                transform: 'translateX(-50%)',
                zIndex: 1000,
                borderTop: 1,
            }}
            >
                {navItems.map((item, index) => (
                    <BottomNavigationAction
                        key={index}
                        value={item.path}
                        onClick={() => navigateTo(item.path)}
                        icon={pathname === item.path ? item.selectedIcon : item.defaultIcon}
                        sx={{
                            color: pathname === item.path ? 'black' : 'inherit',
                            '&.Mui-selected': { color: 'black' }
                        }}
                    />
                ))}
            </BottomNavigation>
        </Box>
    );
}

```

### 詳細
- フレームワークはNext.jsとMUIを使用している

- パスの変更は基本的にuseRouter()を使用している

- パス名の保存方法について
→パス名はuseStateで状態を管理。useEffectで現在のパスを取得して格納する。**ちなみに[windows.location.pathname]はuseEffect内でないと動かないので注意すること。**
AWS RDS入門：簡潔に理解するクラウドコンピューティングの基礎

## Amazon RDSとは　:beginner:
Amazon RDS（Amazon Relational Database Service）は、AWSが提供するリレーショナルデータベース管理サービスです。物理的なデータベースのセットアップやメンテナンスの手間を軽減し、スケーラブルで高可用性なデータベース環境を迅速に利用開始できます。

<img width="20%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690843/f60cfd94-c29a-2ba4-de6d-71efdc4655dc.png">

## 【Amazon RDSの特徴】
複数のデータベースエンジン: MySQL、PostgreSQL、MariaDB、Oracle、SQL Server、Amazon Auroraなど、複数のデータベースエンジンに対応しています。
高可用性と耐障害性: マルチAZ配置により、データベースの可用性と耐障害性を確保。障害時には自動的にフェイルオーバーが実行されます。
スケーラビリティ: CPU、メモリ、ストレージを容易にスケールアップ・スケールダウン可能。
自動バックアップとリストア: 自動バックアップ、手動スナップショット、およびポイントインタイムリストア機能を提供。

### 【利点と制約】
メリット: データベースの迅速なデプロイメント、高可用性、スケーラビリティ、セキュリティが強化されており、運用管理の負担を軽減します。
デメリット: 特定のカスタマイズや設定には制約があり、オンプレミスのデータベース環境と比較して一部の機能に制限のある場合があります。

### 【開発者へのメリット】
Amazon RDSを使用することで、開発者はデータベースのインフラ管理をAWSに委託し、アプリケーション開発に専念できます。また、自動バックアップやリストア機能により、データの保護と復旧が容易になります。

### 【インスタンスの起動方法】
Amazon RDSインスタンスは、AWSマネジメントコンソール、AWS CLI、またはAWS SDKを使用して起動できます。起動時には適切なデータベースエンジン、インスタンスタイプ、ストレージオプションを選択し、セキュリティグループを設定します。

### 【データベースエンジンとインスタンスタイプ】
データベースエンジン: MySQL、PostgreSQL、MariaDB、Oracle、SQL Server、Amazon Auroraなど。
インスタンスタイプ: アプリケーションの要件に応じて選択。汎用、コンピューティング最適化、メモリ最適化などがあります。

### 【ストレージとバックアップ】
ストレージオプション: 汎用SSD、プロビジョンドIOPS SSD、マグネティックストレージの選択が可能。
バックアップ: 自動バックアップ、手動スナップショット、ポイントインタイムリストア機能を提供。

# 【まとめ】
Amazon RDSは、その簡便さ、高可用性、スケーラビリティにより、クラウドベースのデータベース管理において重要な役割を果たしています。開発者はRDSを活用することで、データベース管理の負担を減らし、アプリケーション開発により多くの時間を割くことができます。

最後に
何か間違いがございましたらご指摘お願いいたします。閲覧いただきありがとうございました。

# 【参考】
https://aws.amazon.com/jp/rds/
BigQueryを中心に低コストなビックデータ分析基盤を考えてみた。

## はじめに

ビックデータ分析基盤を構築するのは、特に予算が限られている企業にとっては大きな課題です。しかし、うまくオープンソースソフトウェア（OSS）を活用することで、低コストで強力なデータ分析基盤を構築することができます。ここでは、BigQueryとVMリソースを中心に、Terraform、Airbyte、dbt core、Dagster、Redashを活用して、低コストなデータ分析基盤を構築する方法を紹介します。

![スクリーンショット 2024-05-27 10.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/ddaae1aa-2f49-3d66-a68a-9d8c7f8392f6.png)


## **1. なぜBigQueryとVMインスタンスの料金は許容しなければならないか**

BigQueryは、Google Cloudの強力なデータウェアハウスサービスで、大量のデータを高速にクエリできます。そのためビックデータ処理においては必要不可欠なリソースであると言えます。また様々なデータウェアハウスがある中、BigQueryを選択する理由は以下の通りです。

- **スケーラビリティ**: 大規模なデータセットでも高速にクエリを実行可能。
- **コスト効率**: 大量のデータを格納しつつ、クエリごとに料金が発生するため、使用量に応じた支払いが可能。
- **統合性**: 多くのデータソースとシームレスに統合できる。

さらに、VMインスタンスは、ローカル環境では処理できない大規模な機械学習モデル開発や高速な計算処理を行うためには必要となるリソースです。特にGoogle CloudのVMインスタンスは扱いやすく、TerraformでBigQueryのリソースと一緒に立ち上げてしまうと良いでしょう。
これらのサービスは最低限のコストで高い性能を提供するため、低予算でも利用しやすい選択肢です。

## **2. オープンソースソフトウェア（OSS）のメリット**

OSSを活用することで、コストを抑えながら柔軟でスケーラブルなデータ分析基盤を構築できます。また、OSSは将来的に異なるクラウド環境での利用にも適しているため、クラウド環境の変更があった場合でもスムーズに移行できます。例えばDWHをBigQueryからSnowflakeへ移行したいといったケースがあった場合でも、大きく運用方法を変えずに移行することが可能になります。

- **コスト削減**: ライセンス費用が不要であるため、基本的には無料で利用することができる。
- **コミュニティサポート**: 大規模なユーザーコミュニティによるサポート。
- **柔軟性と移行性**: 異なるクラウド環境やオンプレミス環境への適応が容易。

## **3. インフラのセットアップ：Terraform**

Terraformは、インフラをコードとして管理するツールで、GCPリソースのプロビジョニングを自動化します。これにより、手動設定の手間を省き、一貫性のある環境を構築できます。またGithub Actionsと合わせ使うことで、CI/CDを意識した基盤設計が可能になります。

- **利点**: インフラの再現性、変更管理の簡易化、複数環境での一貫性
- **使い方**: GCPプロジェクト、BigQueryデータセット、VMインスタンスの作成

## **4. データ取り込み：Airbyte**

AirbyteはOSSのデータ統合ツールで、様々なデータソースからデータを取り込み、ターゲットデータベースに送信できます。小規模のデータ基盤やテストでの使用は、ローカル環境で問題ありませんが、規模の大きなデータを扱う場合にはVMインスタンス上にデプロイして使用することをおすすめします。

- **利点**: 多様なデータソースのサポート、カスタムコネクタの作成が容易
- **使い方**: Google Sheetsなど様々なデータソースからCloudStorage、BigQueryデータレイクへのデータ取り込み

## **5. データ変換：dbt core と Dagster**

データ変換には、dbt coreとDagsterを使用します。dbt coreはSQLベースのデータ変換ツールで、Dagsterはデータパイプラインのオーケストレーションツールです。OSSのオーケストレーションツール関してはAirflowやDigDagなど優秀なツールが様々ありますが、個人的には、気軽な定期実行やテスト機能が充実しているDagstarが好みです。

- **利点**: データモデルのバージョン管理、テスト自動化、複雑なパイプラインの管理
- **使い方**: dbtでデータモデルを定義し、Dagsterで実行とスケジューリング

## **6. 可視化：Redash**

Redashはデータのクエリと可視化を簡単に行えるOSSで、複数のデータソースを統合して視覚化できます。
利用の注意点としては、集計などの計算処理をRedash側で多く行うと、動作が重くなってしまう場合があるため、BigQuery側に集計済みの参照用テーブルを設置して、Redashを表示専用のような形で使うと良いと思います。
- **利点**: インタラクティブなダッシュボード作成、チームでの共有が簡単
- **使い方**: VMインスタンス上にデプロイ、BigQueryと接続してクエリを作成し、ダッシュボードに追加して使用します。

## **まとめ**

以上が、低コストなデータ分析基盤の構築方法です。BigQueryとVMリソースを活用しつつ、Terraform、Airbyte、dbt core、Dagster、RedashといったOSSを組み合わせることで、強力でコスト効率の高いデータ分析基盤を構築できます。OSSの利点を最大限に活用し、将来的に異なるクラウド環境での運用にも柔軟に対応できる基盤を整えましょう。ぜひ参考にして、あなた自身のデータ分析基盤を作り上げてみてください。
完走賞に向けてネタ出しとか

QiitaEngineerFesta2024というイベントが始まったそうで、
せっかくだから完走賞を獲得目指して頑張る

そういう意気込み的な記事

# 自己紹介

- 工業高等専門学校専攻科卒
- 情報工学科
- 卒研はアルゴリズム系の研究室で数値計算してた
- 現在開発系の会社でバイト中

# 今考えているネタとか

色々できそうなことをまとめていく

## 過去に作ったゲームの解説
過去に作ったゲームの知見をまとめる的な感じで作って行く


### テトリス風落ち物パズル
Hot Soup Processorやpyxel、pygameで作った経験をまとめる
TSpinやHold等のワールドルールを入れたい
- [part01](https://qiita.com/comet725/items/5ecc49da19bfac3d25db)

### スライドパズル
4x4の中に1-15のタイルがあって順番に揃えるやつ
Androidアプリ化したけどJavaなのでKotlinにリメイクするとかどうなんだろうね

## AtCoderの振り返り、Tips
最近AtCoderを始めたので、振り返り、解説等々
作ったスニペットの使用例をまとめるのもアリ

## その他
本記事みたいなポエム(?)もなくはないのかね


# おわりに
本記事はとりあえず適当にネタ出しだけした
明日以降何かしら書きたい
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（1/100）

【1日目】
トピック 1：SAPS/4HANAサプライチェーン計画の概要（1/6）

≪問題1≫
需要管理において、計画独立所要量が他の所要量に影響を受けるかどうかを決定する要因は次のうちどれでしょうか。
（２つ選んでください）
▢指図タイプ
▢計画方針
▢所要量プロファイル
▢所要量タイプ

≪解答≫
▢指図タイプ
█計画方針
▢所要量プロファイル
█所要量タイプ

≪解説≫
◆需要管理は独立所要量の管理を意味し、資材所要量計画（MRP）における独立所要量の扱い（有効かどうか、他の所要量を消費するかなど）は、所要量タイプまたは計画方針によって決まります。
◆計画独立所要量は、将来の需要予測から導かれる在庫所要量のことです。見込生産では、具体的な受注を待たずに関連する品目の調達を開始できるため、納入時間を短縮し、需要予測計画を活用して生産資源間の負荷を均等に分散させることが可能です。
yarn initでcasperskey.penがないと言われたときの回避方法

## yarn initで新規プロジェクトを作成時にcasperskey.penがないというエラーが出る事象の回避方法

# 実行したコマンド
```
yarn init -y
```
# コマンド実行時に発生したエラー
※パスのusernameは自分のuser名に置き換えて読んでください
```
error Could not open cafile: ENOENT: no such file or directory, open 'C:\Users\username\OneDrive\ドキュメント\pure-react\Kaspersky.pem'
```
# エラー発生後に確認したこと
C:\Users\username\OneDrive\ドキュメント\pure-react\Kaspersky.pem'のディレクトリの中にKasperskyのフォルダやファイルがないか確認したが存在しなかった。

# Kasperskyがないことによってプロジェクトが作られていないのか
* 作成したプロジェクトフォルダを見てみるとpackage.jsonが作成されていたのでプロジェクトは作られている。

# yarnのパッケージ側の問題ではない
* yarnコマンドでpackage.jsonを作成するコマンドを実行後に作成したプロジェクト内にpackage.jsonがあるため。
⇒今回の場合はyarnでプロジェクトが作れないであったり、エラーの原因になっているわけではないと考えられる。

* Kaspersky.pemはセキュリティソフトの為windows側が原因の要因になっているのではないかと思われる。
did methodを整理したい


本記事ではdidのmethodについて整理しました。
あくまで自分の整理用なので全methodの網羅はしていません。
正確な仕様が知りたいよという方はぜひ各スペックをお読みください。

※間違ってるよという際はやさしくコメントいただけると幸いです。

# そもそもmethodとは？

DID(Decentralized Identifier)の真ん中にある**example**部分を指す。
```
did:example:123456abc
```
DID Documentがどこに保存されるか、どうやってDIDを解決するかなどの意味を持ってる

#### did:key
- 公開鍵からDID Documentを作成できるため、バックエンドが不要でオフラインでも検証可能
- 登録や更新を行わないため、1回限りの利用向き
- `did:key:z`で始まる

#### did:web
- ホストにアクセスしてHTTPでDID Documentを取得（ウェブのアドレスと同様）
- `did:web:ホスト名`で終わると`did:web:ホスト名/.well-known/did.json`と解釈される

#### did:ion
- パブリックで運用されているため誰でも使える
- Bitcoinのブロックチェーンを活用
- Microsoftが主導

#### did:sov
- コンソーシアムで運用されているため使用は許可制
- Hyperledger Indyの台帳を活用


# 参考
- [SSI、DID、VCとは？ 概念と仕組みの基本 / SSI DID VC 101](https://speakerdeck.com/gakumura/ssi-did-vc-101)

- [AT Protocolの概要を理解したい](https://blog.final-techblog.com/at-protocol-abstract-understanding)

- [DID Method 探訪：The did:key Method](https://qiita.com/kazuhideYS/items/598b0f8da19deacf57ca)

- [The did:key Method v0.7](
https://w3c-ccg.github.io/did-method-key/)

- [did:web Method Specification](
https://w3c-ccg.github.io/did-method-web/)

- [ION（アイオン）とは？Microsoftを中心に開発される分散型IDシステム](
https://baasinfo.net/?p=4533)

- [Sovrin DID Method Specification](
https://sovrin-foundation.github.io/sovrin/spec/did-method-spec-template.html)

- [DID/VCを用いた自己主権型アイデンティティの実現](
https://speakerdeck.com/sbtechnight/vcwoyong-itazi-ji-zhu-quan-xing-aidenteiteinoshi-xian?slide=24)

- [「Sovrin ID」Sovrin FoundationのデジタルIDサービス](
https://gaiax-blockchain.com/sovrin)
ゼロから始めるstimulus入門1(ファーストコンタクト)

## はじめに
最近、railsでstimulusを使い始めました。まだまだ、使い方がよくわかっていないところがあるので、ドキュメントを読みながら1から学びたいと思います。
今回はドキュメントのhandbook通りに進んでいきます。railsで使いそうでない部分は省いています。
[ドキュメントはこちら](https://stimulus.hotwired.dev/handbook/building-something-real)

## stimulusとは
stimulusはjavascriptのフレームワークです。
Stimulusは、すでに存在する静的なHTMLやサーバーで生成されたHTMLをより便利にするために設計されているようです。
Stimulusはページを継続的に監視してHTMLのdata-controller属性が現れたら、それに対応するjsファイル（命名規則あり）と対応付けします。
難しく感じますが、今までcssでも使われるclassやidから属性を取得していたものを、data-controller属性というもので、明確にjsとhtmlのつながりを分けたというものだと思います。

stimulusは以下の3つの主要なコンセプトがあります。
- action：data-action属性を使用してコントローラーメソッドをDOMイベントに接続
- target：コントローラー内の重要な要素を特定
- value：コントローラーの要素上のデータ属性を読み書きし、監視する

## 記述方法
stimulusを使うためには、ざっくりいうとコントローラーと属性を定義してあげればいいです。

## コントローラー
stimulusではcontrollersという配下に〇〇_controller.jsというファイルを作成します。
〇〇の部分はなんでもよいですが、_controllerは必ず必要なようです。
中身はこのようになっています。
`static targets = [ "name" ]`は後述するHTMLでのdata-hello-targetと対応します。
connect()は初期化時に呼び出されるイメージです。
greetはメソッドです。属性部分と対応させて、console.logを表示します。
this.nameで別のメソッドを呼び出し、this.nameTarget.valueの値を取得しています。
nameはhtmlで指定された名前の部分です。指定した名前＋Targetとすることで要素を指定できます。
```js
// src/controllers/hello_controller.js
import { Controller } from "@hotwired/stimulus"

export default class extends Controller {
  connect() {
    console.log("initial")
  }

  static targets = [ "name" ]
  
  greet() {
    console.log(`Hello, ${this.name}!`)
  }

  get name() {
    return this.nameTarget.value
  }
}
```

## 属性
- data-controller属性はどのcontrollersフォルダ配下のファイルを使用するか、対応付けをします。
`data-controller="hello"`はdata-controllerでhelloを指定しているので、hello_controller.jsと対応付けされます。

- `data-hello-target="name"`はjs側で要素を参照するための値です。idやclassで要素を参照していたのをdata-hello-targetで取得しているイメージです。（helloはcontrollerの名前）

- `data-action="click->hello#greet"`はイベントがトリガーされた際に呼ばれるメソッドを定義します。この場合はclickイベントのときに、hello_controller.jsのgreetメソッドが呼ばれます。
click:イベント名
hello:コントローラ識別子
greet:呼び出すメソッドの名前
```html
<div data-controller="hello">
  <input data-hello-target="name" type="text">
  <button data-action="click->hello#greet">Greet</button>
</div>
```

## 動作
ブラウザでページを読み込み、開発者コンソールを開き、「Greet」ボタンをクリックすると、ログメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/0d41a327-e9ee-e919-8ee8-40be1a135eb5.png)


## 次回
さらにドキュメントを読み進め、まとめていこうと思います！
似てるようで違うGoogle Cloud「Transfer」の付くサービスの概要について

# はじめに
Google Cloudには「Transfer」がつく複数のサービスがありますが、これらはそれぞれ異なる用途と特徴を持っています。本記事では、代表的なサービスであるBigQuery Data Transfer Service、Transfer Appliance、Storage Transfer Serviceの違いについて詳しく解説します。

# 1. BigQuery Data Transfer Service
### 転送方法: オンライン
### 概要
BigQuery Data Transfer Serviceは、定期的なデータ転送を自動化するためのサービスです。これにより、さまざまなSaaSアプリケーションやGoogleサービスからのデータをBigQueryに自動的にインポートすることができます。

### 主な用途
**データウェアハウスの統合**: Googleアナリティクス、Google広告、YouTubeアナリティクスなどのサービスからデータをBigQueryに取り込む。
**スケジュールベースの転送**: 定期的なデータの更新をスケジュール設定することで、自動化されたデータ転送を実現。

### メリット
**自動化**: 定期的なデータ転送が自動化され、手動でのインポート作業が不要。
**スケーラビリティ**: 大規模なデータセットを効率的に処理可能。
# 2. Transfer Appliance
### 転送方法: オフライン
### 概要
Transfer Applianceは、物理的なデバイスを使用して大量のデータをGoogle Cloudに移行するためのサービスです。このデバイスはユーザーのデータセンターに設置され、大量のデータをオフラインでGoogle Cloudに転送するために使用されます。

### 主な用途

**大量データの移行**: 数ペタバイト規模のデータを高速かつ安全にGoogle Cloudに移行。
**セキュアなデータ転送**: オフラインでのデータ転送により、ネットワーク制限やセキュリティリスクを回避。

### メリット:
**高速転送**: 大量のデータを迅速に転送可能。
**セキュリティ**: オフラインでのデータ転送により、ネットワーク上でのデータ漏洩リスクが低減。
# 3. Storage Transfer Service
### 転送方法: オンライン
### 概要:
Storage Transfer Serviceは、オンプレミスや他のクラウドストレージからGoogle Cloud Storageへのデータ転送を行うためのサービスです。このサービスは、定期的なデータ転送や一回限りの大規模なデータ移行に使用されます。

### 主な用途:

**クラウド間のデータ移行**: 他のクラウドプロバイダー（例：AWS S3、Azure Blob Storage）からGoogle Cloud Storageへのデータ転送。
**オンプレミスからのデータ移行**: オンプレミスストレージからGoogle Cloud Storageへのデータ移行。

### メリット:
**柔軟性**: 定期的な転送ジョブのスケジュール設定や、一回限りの転送も対応。
**広範な互換性**: 多様なソースからのデータ転送が可能。
# まとめ
Google Cloudには「Transfer」がつく多くのサービスがありますが、これらはそれぞれ異なる目的と用途を持っています。BigQuery Data Transfer ServiceはSaaSデータの自動取り込みに最適で、Transfer Applianceは大量データのオフライン移行に適しています。一方、Storage Transfer Serviceはクラウド間やオンプレミスからのデータ移行に特化しています。用途に応じて適切なサービスを選択することで、効率的なデータ管理と移行を実現できます。
【Vue】Provide, Injectを使ってRadioGroupを自作する

## 環境
`nuxt 3.11.2`
`vue 3.4.27`

自作するRadioGroupの要件は以下です。
1. 複数の選択肢から一つを選択状態にできる
1. スタイルは呼び出し元で指定する

## ファイル作成
nuxt環境でコードを書きます。
RadioGroupの一つ一つのボタンを`radio.vue`, ボタンをまとめるコンポーネントを`radioGroup.vue`として定義します。

```vue:src/components/atoms/radio.vue
<template>
  <div>
    <slot />
  </div>
</template>
```

```vue:src/components/atoms/radioGroup.vue
<template>
  <div flex="~ col" gap="12px">
    <slot />
  </div>
</template>
```

##  RadioGroupで選択中の値を管理できるようにする
`value`という変数名で選択中の値を管理します。

```vue:src/components/atoms/radioGroup.vue
<template>
  <div flex="~ col" gap="12px">
    <slot />
  </div>
</template>

<script setup lang="ts">
export interface RadioGroupHelper {
  vale: Ref<string | undefined>;
  handleSelect: (value?: string) => void;
}

interface Props {
  value?: string
}
interface Emits {
  (event: 'update:value', value?: string): void
}
const props = defineProps<Props>()
const emit = defineEmits<Emits>()
const value = useVModel(props, 'value', emit)
</script>
```

## radioをクリックしたときにradioGroupで管理している値を更新する
`provide`を使い、radioをクリックしたときに実行する関数を定義します。

```vue:src/components/atoms/radioGroup.vue
<template>
  <div flex="~ col" gap="12px">
    <slot />
  </div>
</template>

<script lang="ts">
export const radioGroupHelperKey: InjectionKey<RadioGroupHelper> =
  Symbol("radioGroupHelper");
</script>

<script setup lang="ts">
import type { InjectionKey } from "vue";

export interface RadioGroupHelper {
  value: Ref<string | undefined>;
  handleSelect: (value: string) => void;
}

interface Props {
  value?: string;
}
interface Emits {
  (event: "update:value", value?: string): void;
}
const props = defineProps<Props>();
const emit = defineEmits<Emits>();
const value = useVModel(props, "value", emit);

provide(radioGroupHelperKey, {
  value,
  handleSelect: (itemValue: string) => {
    value.value = itemValue;
  },
});
</script>
```

```vue:src/components/atoms/radio.vue
<template>
  <div @click="updateSelected">
    <slot />
  </div>
</template>

<script setup lang="ts">
import { radioGroupHelperKey, type RadioGroupHelper } from "./radioGroup.vue";

interface Props {
  value: string;
}
const props = defineProps<Props>();

const radioGroupHelper = inject<RadioGroupHelper | undefined>(
  radioGroupHelperKey,
  undefined
);

const selected = ref<boolean>(false);

const updateSelected = () => {
  selected.value = !selected.value;

  if (selected.value) {
    radioGroupHelper?.handleSelect(props.value)
  }
};
</script>

```
課題（008）　進捗ー2

お疲れ様です。

昨日の課題の続きから最後まで、コードを書き終えたため進捗報告です:computer:
<br>
![024-06-10 222449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/b234a6ea-39e1-dd35-b134-2d2656c8f7e5.png)

アンケートフォームの続きからでしたので、昨日と同様に、チェックボックスと送信・リセットボタンの実装についてメモをとりつつ、40分ほどで最後まで書き終えました:fist:
<br>動画はあらかじめ指定されてあるものを「共有」→「埋め込む」よりコードをコピーし、ページ上で動画を再生できるようにしたものです。
ネット上にある動画は、上記のやり方で、別ファイルとして取り込んだ場合の動画は、昨日勉強した videoタグを用いる感じなんだなーとふわっと理解しました。
<br>しかしここで footer を普段どこに置いていたか悩み始めます…
article の外だとは思うけど main も越えたっけ…？:thinking: 
<br>そんな時は、普段の勉強の相棒と化した「chatGPT」先生に聞いてみよう！と早速chatGPTを開きます。
![2024-06-10 222855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/fa902341-0473-32bd-6c1e-e9eb677b1ffb.png)
<br>ということで、 footer は article と main の外が一般的と分かり、書き直して最後に指定された内容のコピーライトを書いて終了。
![2024-06-10 222954.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/f3465837-60bd-b296-4faa-04475ecd8fb8.png)
<br>あとは誤字やタグ間違いなどないかを確認して提出です。
明日からは新しい課題に進んでいきます。
eleganttでガントチャートを高速に描画する

前にeleganttでガントチャートを生成する記事を書いたばかりですが、

https://qiita.com/usop4/items/7b23856f6147a456595f

eleganttがバージョンアップして、かなり少ないコード量でガントチャートを生成できるようになりました。まずはGoogle Colab上で生成している動画をご覧ください。

![elegantt_colab.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/f73893cc-6398-f550-0ef7-1cfd7f0a93a5.gif)

コードは動画の通りですが、こちらにも貼っておきます。

```py
import elegantt
from IPython.display import display

g = elegantt.EleGantt()
s="""
タスクA: 3d
タスクB: 4d
"""
g.auto_draw(s,mode="mermaid")
display(g.im)
```

こんな感じで`g.auto_draw()`にMermaid書式でテキストを流し込めば、今日を起点としたガントチャートを生成してくれます。

もちろん、こんな感じに書けば今日ではなく指定した日付を起点とすることもできますし
```py
s="""
タスクA: 2024-06-12,3d
タスクB: 4d
"""
```

祝日を入れれば、祝日を考慮した営業日数にしてくれます。（デフォルトは土日のみ考慮）
```py
g.set_holidays(["2024-06-17","2024-06-18"])
```

Google Colabで使う場合はeleganttと一緒にnoto fontを入れておく必要があります。
```
!pip install elegantt
!apt install fonts-noto-cjk
```

追記：Windowsで使う場合は描画前にset_fontでフォントを指定しておく必要があります
```py
g.set_font("C:\Windows\Fonts\meiryo.ttc")
```
【環境構築】TypeScript, Node.js

## 環境
以下の環境で構築していきました。
・macos Sonoma 
・MacBook Air M1

## 前置き
今回 TypeScriptの学習をする機会があったのでその備忘。
これから環境構築をしようと考えている方々に、方法を共有しようと思い書きました。

### はじめに
####  Homebrew 
まず、Homebrewのインストールを行いましょう。
以下のリンクからインストールが行えます。

https://brew.sh/

パスワードやエンターを求められるので、都度入力しましょう。
インストールが完了したか、以下のコマンドで確認してください。バージョンが表示されれば完了しています。
``` 
brew --version
```

### Node環境の構築
TypeScriptを使用するためにはNode.js環境が必要です。Node.jsはTypeScriptコンパイラを実行するために必要となってきます。
以下の手順で環境を構築しましょう。[構築済みの方は次へ進んでください](#TypeScriptの環境構築)

まず、　.zshrcファイルがあるか確認してください。
以下のコマンドで確認が可能です。
```
ls -la
```
ファイルが見つからない場合は、touchコマンドで.zshrcファイルを作成しましょう。
続いて、nvmのインストールを行います。
```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
```
次に、sourceコマンドでzshrcファイルを更新しましょう。
```
source ~/.zshrc 
```
そして、```nvm --version```でバージョンが確認できるか確かめてください。
こちらのnvmを使用してNode.jsのインストールを行なっていきます。

```nvm ls-remote```でNode.jsのバージョンが確認できます。
表示されたリストから **Latest LST**と表示されているものをインストールしましょう。
こちらはNVMでサポートされており、最新のバージョンになります。
以下のコマンドでインストールができます。
```
nvm install [バージョン指定]
```
それでは、```node -v```でインストールしたNodeのバージョンが確認できるか確かめましょう。
これにより、**npm**（Nodeのパッケージマネージャー）もインストールされます。
```npm -v```でバージョンの確認を行いましょう。
以上でNode環境の構築は完了です。

### TypeScriptの環境構築
まず作業を行なっていくディレクトリの作成を行いましょう。（ディレクトリ名は何でも良いです）
```
mkdir ts-project
```
以下のコマンドで、作成したディレクトリに移動しましょう。
```
cd ts-project
```
次にnpm の初期化を行います。
```
npm init
```
そうすると色々聞かれると思いますが、今回は全てyesで大丈夫です。
ここからはお使いでエディタで作業を進めていきましょう。
VScodeを使用している方は、```code .```で起動させることができます。
「command + J」でVScode上でもターミナルが開けます。

続いて、関連パッケージのインストールを行います。
```
npm install --save-dev typescript ts-loader webpack webpack-cli webpack-dev-server
```
・typescript ：TypeScriptをJavaScriptに変換するコンパイラ
・ts-loader ：webpackと連携してTypeScriptコンパイラを起動
・webpack ：ファイルを一つまとめる
・webpack-cli :コマンドラインでwebpackを使う
・webpack-dev-server:開発用webサーバーの起動
こちらの５つを開発環境のみにインストールします。（詳しい説明は省略させていただきます）
package.jsonにインストールされているか確認してください。またscriptの部分も以下のように変更してください。
```
{
  "name": "ts-basic",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "build": "webpack --mode=production",
    "start": "webpack-cli serve --mode development"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "devDependencies": {
    "ts-loader": "^9.5.1",
    "typescript": "^5.4.5",
    "webpack": "^5.91.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.0.4"
  }
}
```
そして、```webpack.config.jsファイルを作成して以下を記述してください。
```
const path = require('path');

module.exports = {
    entry: {
        bundle: './src/index.ts'
    },
    output: {
        path: path.join(__dirname, 'dist'), //distファイルを作成しておきましょう
        filename: '[name].js'
    },
    // import文でファイルの拡張子を書かずにする設定
    resolve: {
        extensions: ['.ts', '.js']
    },
    devServer: {
        static: {
            directory: path.join(__dirname, 'dist')
        },
        open: true //サーバー起動時にブラウザを開く
    },
    //moduleのルール設定
    module: {
        rules: [
            {
                loader: 'ts-loader',
                test: /\.ts$/
            }
        ]
    }
}
```
以下のコマンドでTypeScriptのコンパイラの起動を行いましょう。
```
tsc --init
```
もしできない場合は、```npm install -g typescript```で**tsc**が使用できるようになります。

起動するとtsconfig.jsonという設定ファイルが作成されていればTypeScriptの環境構築は完了です。
[React] useReducer を使いこなそう！

## useReducer とは？

`useReducer`は、`React`で状態管理を効果的に行うための`React Hooks`です。
状態管理と状態更新ロジックを一元的に管理できます。

`useContext`と組み合わせると、グローバルな状態管理が実現できるようになります。

### :memo: useReducerのメリット

`useReducer`を使うことで、以下のメリットがあります。
- 状態を一つのオブジェクトにまとめることで、状態の構造を一目で把握できる
- 状態更新は`reducer`で一括管理されるため、どのように変更されるかが明確になり、バグが発生しにくくなる
- 状態の更新処理をコンポーネントから切り離すことができる

## 構文

```tsx
const [state, dispatch] = useReducer(reducer, initialState)
```

- `state`: 現在の状態
- `dispatch`: Actionを発行する
- `reducer`: 状態の更新する純粋関数
- `initialState`: 状態の初期値

### :memo: useStateとの比較

|  | useState | useReducer |
|:--|:--|:--|
| 状態スコープ | ローカル | `useContext()`を使用することでグローバルも可 |
| 更新方法 | 更新関数で都度定義 | 宣言時に更新方法を指定 (`reducer`) |

## 実践例
### 1. カスタムフックの作成

以下は、`useReducer`を使ったカスタムフックです。

`Redux Toolkit`の`createSlice`を使用することで、`Reducer`を効率的に作成しています。

```typescript
// hooks/useCounter.ts
import { useReducer } from 'react';

import { createSlice } from '@reduxjs/toolkit/react';

interface CounterState {
  count: number;
}

const initialState: CounterState = {
  count: 1,
};

const counterSlice = createSlice({
  name: 'counter',
  initialState,
  reducers: {
    increment: (state) => {
      state.count++;
    },
    decrement: (state) => {
      state.count--;
    },
  },
});

const { actions, reducer } = counterSlice;
const { increment, decrement } = actions;

// useReducer
export const useCounter = () => {
  const [state, dispatch] = useReducer(
    reducer,
    initialState,
  );

  return {
    state,
    increment: () => dispatch(increment()),
    decrement: () => dispatch(decrement()),
  };
};

export { reducer };
```

### 2. 状態管理を行うコンポーネントで`Reducer`をインポートする

```tsx
import React from 'react';

import { useCounter } from './hooks/useCounter';

const ComponentA: React.FC = () => {
  const { state, increment, decrement } = useCounter();

  return (
    <div>
      <h1>ComponentA</h1>
      <p>Count: {state.count}</p>
      <button onClick={increment}>+</button>
      <button onClick={decrement}>-</button>
    </div>
  );
};

export default ComponentA;
```

## まとめ
- 更新関数を予め定義しておくことでバグの混入を防げる :sparkles:
- `useContext` + `useReducer`でのグローバル管理で脱Reduxを目指す :fire:
Transform Your Writing Process with Counting Tools: A Comprehensive Guide

Introduction
In today's digital age, effective communication is crucial, and quality content is key. Whether you're a seasoned writer or just starting, finding ways to enhance your writing process can significantly impact the quality and effectiveness of your content.

Word and Character Counters: Streamline Your Content
Word and character counters are essential tools for any writer, helping to ensure that your content is concise and focused. By keeping track of your word count, you can avoid unnecessary verbosity and keep your writing clear and to the point.

Social Media Optimization Aids: Tailor Your Content for Impact
In today's social media-driven world, it's essential to tailor your content for maximum impact across various platforms. Counting Tools provides tools and resources to help you optimize your content for social media, including tools for crafting engaging headlines, optimizing images, and analyzing social media metrics.

Language-Specific Tools: Connect with Your Audience
Language-specific tools are invaluable for writers seeking to connect with their target audience. Whether you're writing in English, Spanish, French, or any other language, Counting Tools offers tools and resources to help you ensure that your content is grammatically correct, culturally sensitive, and effectively communicates your message.

Specialized Calculators: Simplify Complex Tasks
Specialized calculators provided by Counting Tools make complex calculations simple, allowing you to focus on crafting compelling content without getting bogged down by the numbers. From financial projections to statistical analyses, these calculators help writers deal with numerical or data-driven content effortlessly.

Content Refinement Utilities: Polish Your Writing
Content refinement utilities offered by <a target="_blank" href="https://countingtools.com/">Counting Tools</a> help writers polish and perfect their written material. Whether it's grammar and spell-checking tools, plagiarism detectors, or style guides, these utilities ensure that your content is error-free, original, and adheres to your chosen style and tone.

Conclusion
In conclusion, Counting Tools is a must-have resource for writers looking to enhance their writing process and create high-quality, engaging content. By leveraging the suite of features offered by Counting Tools, writers can streamline their workflow, improve their writing efficiency, and ultimately produce content that captivates audiences and achieves optimal results. So why wait? Discover the power of Counting Tools today and transform your writing process for the better.
Reactでstyleをpropsで渡そうとしたときにはまった件

## オブジェクト リテラルは既知のプロパティのみ指定できます。'props' は型 'Properties<string | number, string & {}>' に存在しませんが発生するときの解決法

# エラーが発生しているファイル
```:ColfulMessage.tsx
type Props = {
    color: string;
    message: string;
  }
export const ColorfulMessage = (props:Props) => {
    return(
            <>
        <p style={{props.color }}>{props.message}</p>
            <p style={{ props.color }}>{props.message}</p>
            </>
    )
}
```
# 解決策
オブジェクトリテラルでpropsの値にアクセスをするときにプロパティを指定する。
※オブジェクトリテラルの表し方｛｝で囲む
```:ColorfulMessage.tsx
type Props = {
    color: string;
    message: string;
  }
  
export const ColorfulMessage = (props:Props) => {
    return(
            <>
        <p style={{color:props.color }}>{props.message}</p>
            <p style={{color: props.color }}>{props.message}</p>
            </>
    )
}
```
# 補足
style={{color:props.color }}の一番外側の｛｝はJavascriptですということを示している。
内側にある｛｝はオブジェクトであることを示している。
Nmapを使って、TCP/UDPのポートに接続できるか確認する方法

# はじめに
　Nmapを使って、ポートが空いているかを確認する方法を紹介する。netcatを使う方法もあるが、UDPではうまく動作しなかったので、Nmapを使うことを推奨する（[参考](https://serverfault.com/questions/797763/why-do-netcat-scans-for-udp-ports-always-succeed)）。
 
# 動作確認環境
* Ubuntu 20.04

# 方法

　[Nmap](https://nmap.org/man/ja/index.html)は、TCP/UDPのポートスキャンができるコマンド。下記でNMAPインストールする。

```bash
sudu apt update
sudo apt install nmap
```

　Nmapは、リターンコードでは接続の有無を確認できないので、戻り値のテキストをgrepすることにより接続確認する。状態は以下が定義されている。詳細は[Nmapマニュアル](https://nmap.org/man/ja/index.html)を参照。

|状態|説明|
|:-:|:-|
|open|調査対象マシン上のアプリケーションがそのポート上で接続/パケットを待ち受けている状態。|
|filtered|ファイアウォールやフィルタなどのネットワーク上の障壁でポートが遮られている状態。ポートが開いているか閉じているかをNmapが判断できないことを意味する。|
|closed|Closed(閉じた)ポートには、待ち受け状態のアプリケーションは何もない状態。これらはいつでも開放することが可能である。|
|unfiltered|ポートがNmapのプローブには応答するが、開いているか閉じているかをNmapが判別できない状態。|

>ポートの状態がopen|filteredやclosed|filteredのように、2つの状態の組み合わせそのどちらがポートの状態を表しているかをNmapが判断できない場合である。


## TCPの場合

```bash
nmap -sT -p {port_no} {ip_address}
```
* {port_no}: ポート番号
* {ip_address}: IPアドレス

接続可能な場合の応答
```bash
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:38 JST
Nmap scan report for {ip_address}
Host is up (0.00034s latency).

PORT      STATE SERVICE
{port_no}/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
```

接続不可能な場合の応答
```bash
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:38 JST
Nmap scan report for {ip_address}
Host is up (0.00033s latency).

PORT      STATE  SERVICE
{port_no}/tcp closed unknown

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds
```

### リターンコード取得するためのシェルスクリプト

下記のようにすると、接続可能(open)な場合は、リターンコード=0となる。
```bash
nmap -sT -p {port_no} {ip_address} | grep open
```

接続されるまで待ち続けるスクリプト
```bash
while [ ! "$(nmap -sT -p {port_no} {ip_address} | grep open)" ]; do echo 'Waiting...'; sleep 1s; done
```

## UDPの場合

TCPの場合と同様。オプションが、```T```から```U```に変わる。

```bash
nmap -sU -p {port_no} {ip_address}
```
* {port_no}: ポート番号
* {ip_address}: IPアドレス

接続可能(ポート遮断あり)な場合の応答
```bash
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:47 JST
Nmap scan report for {ip_address}
Host is up (0.000037s latency).

PORT      STATE         SERVICE
{port_no}/udp open|filtered unknown
MAC Address: XX:XX:XX:XX:XX:XX (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 0.54 seconds
```

接続不可能な場合の応答

```bash
Starting Nmap 7.80 ( https://nmap.org ) at 2024-05-09 08:47 JST
Nmap scan report {ip_address}
Host is up (0.000047s latency).

PORT      STATE  SERVICE
{port_no}/udp closed unknown
MAC Address: XX:XX:XX:XX:XX:XX (Unknown)

Nmap done: 1 IP address (1 host up) scanned in 0.36 seconds
```

### リターンコード取得するためのシェルスクリプト

下記のようにすると、接続可能(open)な場合は、リターンコード=0となる。
```bash
nmap -sU -p {port_no} {ip_address} | grep open
```

接続されるまで待ち続けるスクリプト
```bash
while [ ! "$(nmap -sU -p {port_no} {ip_address} | grep open)" ]; do echo 'Waiting...'; sleep 1s; done
```


# まとめ
　Nmapを使うことにより、TCP/UDPのポートへの接続確認を行うことができた。grepと組み合わせることによりリターンコードを取得してシステムに組み込める形にして使うのが良い。

# 参考

https://nmap.org/man/ja/index.html

https://qiita.com/kenryo/items/1b49bddce44e9412638f
Rustの変数と定数、ミュータブルとイミュータブル

# 概要
Rustについて勉強し始めたので、メモがてら書いていきたいと思います。
Rustの変数と定数について、それに加えて可変性についてです。

# 変数と定数

多くのプログラミング言語と同様に、Rustにも変数と定数という概念があります。
簡単に言うと、次の通りです。
- 変数：セットされた値を変更することができる
- 定数：セットされた値は常に変更することができない

ただし、これはかなり雑な説明です。もう少し細かくまとめていきたいと思います。

## 変数

### 不変変数（イミュータブル）

Rustでは、`let`句を用いて変数を宣言します。
Rustにおける変数は、標準で不変です。

そのため、以下のようなコードを実行するとエラーとなります。

``` rust
fn main() {
    let x = 1;

    x = 5; // 不変変数には再代入できないためコンパイルエラーとなる
    println!("{}", x);
}
```

変数が標準で不変であることで、一度宣言した変数が変更されないことはコンパイラにより担保されます。
これは開発を行う上で、コードの可読性などにメリットを与えます。

### 可変変数（ミュータブル）

同じ変数に対して再代入するためには、`let`句の後に`mut`オプションをつけます。
(ちなみに`mut`は`mutable(可変)`の略です。)
`mut`オプションを使用すれば、以下のコードのように変数を変更することができるようになります。

``` rust
fn main() {
    let mut x = 1;

    x = 5;
    println!("{}", x); // コンパイルが通り、5が出力される
}
```

### Shadowing

Rustでは、前に定義した変数と同じ名前の変数を新しく宣言することができます。
この場合、前の変数は新しい変数によって覆い隠されることとなり、これをシャドーイング（Shadowing）と言います。

以下のコードが例です。

``` rust
fn main() {
    let x = 1;

    let x = 5;
    println!("{}", x); // 同じxという変数を使っているが、再代入しているわけではないため、コンパイルが通り、5が出力される
}
```

また、Shadowingは同じスコープ範囲内で働きます。
以下は少し複雑な例です。

``` rust
fn main() {
    let x = 1;

    {
        let x = 5;
        println!("{}", x); // コンパイルが通り、5が出力される
    }

    let x = x + 10; // コンパイルが通り、11(1 + 10の結果)が出力される
    println!("{}", x);
}
```

最後の出力は15(5 + 10の結果)になると思うかもしれませんが、括弧の中は別スコープとなります。

また、Shadowingを利用することで、変数の本質的な意味合いを変えず、型だけ変更することができます。

``` rust
fn main() {
    // 空白文字列から、スペースがいくつ入っているかを保持する
    let spaces = "     ";
    let spaces = spaces.len();
}
```

Shadowingのメリットは以下です。
- 可変変数ではないため、宣言後は不変となる
- `let`句を使わずに再代入しようとするとコンパイルエラーとなる
- 内容を変更せず、型だけ変えることができる

## 定数

定数は、変数と違い`const`句を使用して定義します。
そして定数を宣言する場合は、必ず型を指定する必要があります。

``` rust
fn main() {
    const X: i8 = 100;
    println!("{}", X); // コンパイルが通り、100が出力される
}
```

以上のようにデータを扱う際には、変数なのか定数なのか、可変なのか不変なのか、などを常に注意する必要があります。
なんでも可変変数で宣言してしまう、などということはしないようにしましょう。
VSCode version 1.90

## はじめに
2024年３月にリリースされたVSCode, 1.90について
初学者がわかったことを初学者言葉で書き連ねます。

## 複数タブを一度に移動できるようになった
Ctrl キーを押しながらクリック (mac では Cmd キーを押しながらクリック) することで、
複数タブを選択しながら移動することができます。
タブの範囲を選択するには、Shift キーを押しながらクリックします。

まとめて移動させたい時に使えるかも？

## タブのアクションを常に表示できるようになった
ユーザー設定に下記を追加することで、
今までアクティブだったタブにしか表示されなかったアクションを
いつでも実施できるようになった。

```json:setting.json
"workbench.editor.alwaysShowEditorActions": true
```

## RGBサブピクセルレンダリングを無効にできる
こちら当方macOSゆえ確認できませんでした。ごめんなさい。

## 入力に関するショートカットが増えた

```json:setting.json
"workbench.scm.action.focusNextInput": true
"workbench.scm.action.focusPreviousInput": true
"workbench.scm.action.focusNextResourceGroup": true
"workbench.scm.action.focusPreviousResourceGroup": true
```

## ノートブック内で複数セルの選択ができるようになった

```json:setting.json
"notebook.experimental.find.scope.enabled": true
```

## さいごに
最近のアップデートはやはりCopilot が一番の盛り上がりを見せているのかなと主観で感じました。
それだけ生成AIを活用した開発というのが進んできているのだと思います。
めちゃくちゃ省きました、初めての投稿なので許してください泣
【REST API】Google Cloud Translation APIを使用して英語を翻訳しよう

## はじめに
こんにちは！　Web系転職を目指して学習中のYuyaです。

[Google Cloud Translation API](https://cloud.google.com/translate/docs?hl=ja)を使用して英文を翻訳する方法について解説します。

Google Cloud Translation APIは数種類のアーキテクチャや言語をサポートしていますが、今回はその中でも**REST API**を使用した方法について解説します。

## エディションを選択する
Google Cloud Translationには２つのエディションが用意されています。

### Cloud Translation - Basic（v2）
シンプルなモデル。料金は低め。

### Cloud Translation - Advanced （v3）
特定の業界やドメイン向けに翻訳モデルをカスタマイズしたりできる。料金は高め。

本記事は**Cloud Translation - Basic（v2）を使用**します。

## Google Cloud Translation  APIを有効にする
セットアップを行います。詳細は[公式ドキュメント](https://cloud.google.com/translate/docs/setup?hl=ja)を参考にしてください。
1. Google Cloud のコンソールからプロジェクトを作成します
2. プロジェクトのコンソール画面から左側のナビゲーションメニューを表示させ、「APIとサービス」をクリックします
3. 左側の「有効なAPIとサービス」をクリックし、「APIとサービスを有効にする」をクリックします
3. 検索欄に「Cloud Translation API」と入力し検索します。表示された「Cloud Translation API」をクリックし、「有効にする」をクリックします
3. 有効なサービスとAPIに「Cloud Translation API」が表示されていればOKです

## APIキーを生成する
1. プロジェクトのコンソール画面から左側のナビゲーションメニューを表示させ、「APIとサービス」をクリックします
1. 左側の「認証情報」をクリックし、「認証情報を作成する」をクリックし、さらに「APIキー」をクリックします
1. APIの作成が完了したら、表示された文字列をコピーしておきます

:::note warn
APIキーは絶対に外部に公開しないようにしてください。
Githubなどを通してうっかり外部に公開してしまい、悪用されてしまう事例があります。
必要に応じて、APIキーに制限をかけておくことをお勧めします。
:::

## APIを呼び出す
リクエストデータ用のJSONファイルを作成し、適当なディレクトリに保存します。

```json:request.json
{
    "q": "test phrase",
    "source": "en",
    "target": "ja",
    "format": "text"
}
```
"q":　翻訳したい文章
"source": 翻訳元の言語 
"target": 翻訳先の言語
"format": 翻訳元のテキストの形式。他にもhtmlなどを指定できます

カレントディレクトリを保存先のディレクトリに移動し、APIを呼び出します。

### curlでAPIを叩く

```shell:shell
curl -X POST \
    -H "X-goog-api-key: [API_KEY]" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @request.json \
    "https://translation.googleapis.com/language/translate/v2"
```
[API_KEY]の箇所に先ほど保存したAPIキーを入力してください。

次のようにレスポンスがあれば成功です。
```shell
{
  "data": {
    "translations": [
      {
        "translatedText": "テストフレーズ"
      }
    ]
  }
}
```

### JavaScriptのfetchでAPIを叩く
```javascript:JavaScript
try {
    const response = await fetch('https://translation.googleapis.com/language/translate/v2', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json; charset=utf-8',
            'X-goog-api-key': '[API_KEY]'
        },
        body: JSON.stringify(requestData)
    });

    const responseData = await response.json();
    return responseData.data.translations[0].translatedText;
} catch (error) {
    console.error("Error", error);
    return "";
    
}
```

## 最後に
記事について間違いや質問があれば教えてください！
最後まで読んでいただき、ありがとうございました。
【小ネタ】Amazon Linux 2023でlsyncdをビルドする


## 小ネタです

Amazon Linux2では利用できたlsyncdをビルドするコマンドをメモしておきます。
なお、まだ動かせていないのでちゃんと動作するかは不明です。

## メモ

```bash
sudo yum -y install git cmake gcc gcc-c++ lua lua-devel lua-libs && sudo yum clean all
cd && git clone https://github.com/lsyncd/lsyncd.git && cd lsyncd && cmake . && make && sudo make install
lsyncd -version
rsync --version
```
githubにpushしたらCircleCiでサーバーに「git pull」させる

# 背景
githubに上げた後自動更新したかった。
リモートリポジトリにPush後自動デプロイをCircleCIを使ってやってみた  
が...めちゃ時間かかったので備忘録として...
# 前提
- githubのリポジトリとアクセストークン作成済み
- CircleCIアカウント作成し、githubリポジトリと連携済み
- サーバーにssh接続して「git pull」ができる
# 手順

### サーバーに「git pull」するシェルスクリプト作成
「.git」と同階層に「deploy.sh」  
中身↓
```shell
cd /"リポジトリがある場所" && sudo git pull https://"githubアカウント名":"githubアクセストークン"@github.com/"githubアカウント名"/"リモートリポジトリ名.git"
```
動かすことしか考えていないので今回はこの構成

### シェルスクリプト動かしてみる
```shell
source deploy.sh
```

### CircleCIでSSHキーの設定
CircleCIの「Project Settings」→「SSH Keys」→「Additional SSH Keys」で設定を追加してください。  
ここはUIが変更されたりするので[こちら](https://circleci.com/docs/ja/add-ssh-key/)を参考にしてください。

### config.ymlの設定
```yml
version: 2.1
jobs:
  deploy:
    machine:
      enabled: true
    steps:
      - add_ssh_keys:
          fingerprints:
            - ""
      - run: ssh -p "ポート" "ユーザー名"@"host" "さっき作成したdeploy.shがある場所"

workflows:
  version: 2
  deploy:
    jobs:
      - deploy:
          filters:
            branches:
              only: main # 人によってはmasterかな？
```

下記はapatchのデフォルトのhtml直下に sh ファイルを置いた際の例
```yml
- run: ssh -p "ポート" "ユーザー名"@"host" "/var/www/html/deploy.sh"
```
ymlの概要は[こちら](https://circleci.com/docs/ja/introduction-to-yaml-configurations/)

### 動かしてみる
githubにプッシュしてみてCircleCIのstatusが「success」なら成功してるはず
【VSCode】普段使っている拡張機能

## はじめに
私は普段フロントエンド開発をしています。
VSCodeに入れている拡張機能を備忘録的に残しておきます。

## 日本語化
https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

VSCodeを日本語化


## GitHub Copilot
https://marketplace.visualstudio.com/items?itemName=GitHub.copilot

有料だがコーディング効率あがる

## code-spell-checker
https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker

スペルミスがなくなる

## Redis
https://marketplace.visualstudio.com/items?itemName=Dunn.redis

Redisの中身をGUIで確認できる（DELETEもできる）


## GitLens
https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens

該当行を最後に誰がコミットしたかわかるようになる

## Prettier
https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode

コードを自動整形してくれる

## vscode-icons
https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons

アイコンがポップになる

## おわりに
https://marketplace.visualstudio.com/

気になる拡張機能があったら上記から検索してみてください！
'React' は UMD グローバルを参照していますが、現在のファイルはモジュールです。

## 以下のエラーの解決策
'React' は UMD グローバルを参照していますが、現在のファイルはモジュールです。代わりにインポートを追加することを考慮してください。

# 下の問題のファイルでエラーが発生する原因になっている箇所
```tsconfig.json
"compilerOptions": {
"jsx": "react",
  }
```
# 解決方法
```tsconfig.json
"compilerOptions": {
"jsx": "react-jsx",
  }
```
# 参考にしたサイト
「React」はUMDグローバルを指しますが、現在のファイルはモジュールですの解決
⇒https://qiita.com/osa-osa/items/00385d3677b89b8effc1
MSStoreでデフォルトでサポートされていないWSL2向けlinuxディストリを `WindowsTerminal` で使いたい

# はじめに

巷でちょっと話題になっている `NixOS` というものがありますが、この流れにちょっと乗ってみたく、自身の環境に追加してみたのですが、
> いい感じに `WindowsTerminal` で扱う方法ってあんまり乗ってないなぁ…

となってしまったのでこちらを記載します

# 1. WSL2への `NixOS` のインストールの方法

おおよそこちらの記事に書いており、これ以上に記述することはないので参照リンクを貼って割愛します

:::note warn
警告
この方法では、 `wsl import` コマンドを実行したディレクトリに `NixOS` がインストールされた `vhdx(ハードディスクイメージ)` が保存されますので、実行する場所についてはよくよくお気をつけください
:::

https://zenn.dev/kino_ma/articles/3eeb711be6fcbb

## Appendix1. NixOSでのユーザを一応追加したい場合

上述のインストールを実施した場合、以下のコマンドで再度 `NixOS` にログインしてから

```powershell
PS> wsl -d NixOS
```

ログインしてから以下のコマンドを実行する

```bash
### ユーザの追加
$ sudo useradd <任意のユーザー名>
### 追加したユーザにパスワード設定
$ sudo passwd <任意のユーザー名>
$ sudo usermod -aG <任意のユーザー名> users
$ sudo usermod -aG <任意のユーザー名> wheel
```

# 2. `WindowsTerminal` 側の設定

jsonの修正で対応します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507143/e7b6ec70-2f7f-ae77-124f-757dc56125c0.png)

こちらのjsonの内容を、プロファイルのリストの最後にコピペしてください

:::note info
`font`の`face`など、好きな値に変更してください
:::

```json
{
  "commandline": "wsl -d NixOS -u <任意のユーザー名>",
    "font": 
    {
      "cellHeight": "1.4",
      "face": "IntoneMono Nerd Font Mono",
      "size": 11.0
    },
    "guid": "{af8766a5-b0d6-4753-b439-5b6f68624911}",
    "hidden": false,
    "icon": "https://avatars.githubusercontent.com/u/487568?s=200&v=4",
    "name": "NixOS",
    "tabTitle": "NixOS"
}
```

これで保存して `WindowsTerminal` を再起動することで、プロファイル一覧に任意のディストリビューションのプロファイルが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/507143/e23e2597-5ca3-569d-4fab-57610d7894d1.png)

# いや `NisOS` 使ってるんなら `configuration` せんかい！

> 2024-11-02に追記されました

すでにやってあったのですが、さすがにアホすぎるので追記します

`configuration.nix` というOSそのものの設定を行う記述を `NixOS` の場合は可能ですが、デフォルトだと `nixos` というユーザー名となります

私の場合はこれを自分の名前にしておきたかったのでこのような設定を別途追加することになりました

`<すきなおなまえ>` としている部分を任意の文字列に置換することで達成できます

```configuration.nix
{ config, lib, pkgs, ... }:

{
  imports = [
    # include NixOS-WSL modules
    <nixos-wsl/modules>
  ];

  wsl.enable = true;
  # すきなおなまえをいれましょう
  wsl.defaultUser = "<すきなおなまえ>";

  users.users.<すきなおなまえ> = {
    isNormalUser  = true;
    # すきなおなまえをいれましょう
    home  = "/home/<すきなおなまえ>";
    description  = "cocoalix";
    extraGroups  = [ "users" "wheel" "networkmanager" ];
    shell = pkgs.zsh;
  };
}
```

## どうせなら名前くらい変数にしたくない？

したいのでこれを試さないとならない (記事に備忘を書くな)
https://www.reddit.com/r/NixOS/comments/wzsz4k/how_can_i_add_some_custom_data_variables_into/

# さいごに

意外とこの辺の設定まとまっているように見えなかったので記述してみました

参考になりましたら良いと思います

がんばろう、Linuxライフ
【kintone】レコードに投稿されたコメントをslack通知する

## はじめに
kintoneでレコードに対してコメントをすると、kintone上では通知が来ます。コメント内容をslackの特定チャンネルに通知する方法を試しました。


## どのような背景があって作成したのか？
コミュニケーションツールにはslack、CRMにはkintoneを使用しています。
kintoneレコードのコメントに投稿される内容に意外と重要なものが多く、これまではコメントをした人しか内容を把握しておらず他メンバーは検知にムラがありました。情報格差が起きないよう、チームメンバーが見ることのできるslackチャンネルに通知し即確認できるようにしました。

## コード
kintoneに設定しているscriptです。どなたかの参考になれば。。。🙇‍♂
素人が書いているscriptなので書き方がイマイチな箇所があると思いますが、何かあればコメントいただけますと幸いです。

```javascript:test.js
(function() {
  'use strict';

    var triggerEvents = [
        // レコード詳細画面を表示した後のイベント
        "app.record.detail.show"
    ];

    kintone.events.on(triggerEvents, function(event) {
      
      // 書き込むボタンのクリックイベント
      document.querySelector("button.ocean-ui-comments-commentform-submit").onclick = function(){
        
        // コメント投稿者を取得
        var commentUser = kintone.getLoginUser();
        // kintoneレコードのURLを取得
        var thisUrl = "https://graffer.cybozu.com/k/" + kintone.app.getId() + "/show#record=" + kintone.app.record.getId();
        var webhookUrl = "";
        var payload;
        // コメント内容を取得
    　　　  var commentValue =　document.querySelector(".ocean-editor-seamless").textContent;

        //コメントが入力されている場合
        if(commentValue !== ""){
          // テキストを生成
          payload = {
            "text": "レコード「<" + thisUrl + "|" + event.record.customerName.value + ">」" + "に、" + commentUser.name + " から以下のコメントが投稿されました！\n"
                      + "```" + commentValue + "```" 
          };
          return new kintone.Promise(function(resolve, reject) {
            kintone.proxy(webhookUrl, "POST", {}, payload, function(body, status, headers) {
                console.log(status, body);            
                    resolve(event);
            });
          });
        }
        return event;
      };
  });
})();

```

## 説明

:::note info
document.querySelector("button.ocean-ui-comments-commentform-submit").onclick
コメントが書き込まれた際のイベントをトリガーの一要素にしています。
:::

:::note info
kintone.getLoginUser();　⇒　投稿者のユーザー名
document.querySelector(".ocean-editor-seamless").textContent　⇒　コメント内容
を取得して通知することでslack内で完結するようにしています。
:::
副問合せ（サブクエリ）を復習

# はじめに
お疲れ様です！
最近DBについて勉強していたのですが、副問合せの部分が微妙に難しかったのでまとめました。

# 副問合せとは？
副問合せ（サブクエリ）とは、SQLのクエリの中に埋め込まれた別のクエリのことです。
副問合せは通常、括弧で囲まれ、外側のクエリの条件や値として使用されます。
```sql
SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
```
この例では、従業員テーブルから平均給与より高い給与を持つ従業員を取得しています。

# 副問合せの種類
副問合せにはいくつかの種類があります。ここでは、一般的な3つの種類を紹介します。

## スカラー副問合せ
スカラー副問合せは、単一の値を返す副問合せです。通常、SELECT句やWHERE句で使用されます。
```sql
SELECT name, (SELECT department_name FROM departments WHERE departments.id = employees.department_id) AS department
FROM employees;
```
この例では、従業員テーブルの各従業員の所属部門名を取得しています。

## 行副問合せ
行副問合せは、複数の列からなる単一の行を返す副問合せです。
```sql
SELECT name, salary
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);
```
この例では、各部門で最も高い給与を持つ従業員を取得しています。

## テーブル副問合せ
テーブル副問合せは、複数の行を返す副問合せです。通常、IN句やEXISTS句で使用されます。
```sql
SELECT name
FROM employees
WHERE department_id IN (SELECT id FROM departments WHERE location = 'New York');
```
この例では、ニューヨークにある、部門に所属する従業員を取得しています。

# 副問合せの使用例
副問合せは、データベースの様々なシナリオで役立ちます。いくつかの具体的な例を見てみましょう。

# 特定の条件を満たすデータの取得
```sql
SELECT name
FROM products
WHERE price > (SELECT AVG(price) FROM products);
```
この例では、平均価格より高い価格の製品を取得しています。

## 最大値や最小値の取得
```sql
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);
```
この例では、最高給与を持つ従業員を取得しています。

## 他のテーブルとの関連データの取得
```sql
SELECT name
FROM students
WHERE class_id = (SELECT id FROM classes WHERE name = 'Mathematics');
```
この例では、「Mathematics」クラスに所属する学生を取得しています。

# 練習問題
## 問題1
特定の部門の平均給与より高い給与を持つ従業員を取得するクエリを書いてください。

## 問題2
全ての製品の中で最も高い価格の製品を取得するクエリを書いてください。

## 問題3
ある特定の都市にある店舗に所属する従業員のリストを取得するクエリを書いてください。

# まとめ
この記事では、副問合せ（サブクエリ）に焦点を当てて、その基本的な概念と使用例について説明しました。
副問合せを利用することで、複雑なデータ操作を簡潔に実行することができます。
初投稿です！

# 初めまして！
Cherrishです！ちぇっりしゅと読みます。現在、フリーのエンジニアとして活動しています。
今回、Quitaのイベントということで、以前から記事を書きたいと思っていたので下記はじめてみました。
まだまだプログラマー、SEとして初心者ですので、備忘録や自分の勉強したことをアウトプットを中心に書いていきます！

## 普段使っている言語
メインの案件ではSAPと呼ばれるERPを扱っています。そのため、言語としてはAbapと呼ばれるマイナー言語やJSをメインに扱っています。その他の案件や個人開発では、HTML、CSSといったWEB言語やPython、Java、PHPなどを扱っています。最近はReactがとても気になっていて少しづつですが勉強しています。また、AWSのシステムを理解できるようになりたいので四苦八苦しながらバックエンドも勉強しています。

## 今後の展望
業務で得た知識や自分の個人開発の意欲のために書き込みしてきます！
【Python】何故randomは安全ではないのか

次の関数は私が数年前にとあるアプリケーションで、新規ユーザーの仮パスワードを生成する目的に使用していた。

```python
import secrets
import string

def get_random_string(length):
    secure_str = ''.join((secrets.choice(string.ascii_letters) for i in range(length)))
    return secure_str
```

secretsモジュールを用いて、大文字と小文字からなる任意長の文字列をランダムに生成できる。

ところで、乱数を生成するPythonのモジュールといえば、secretsの他にrandomがある。
このモジュールの違いは使用する乱数発生アルゴリズムにあるが、アルゴリズムが異なると何が変わるのだろうか。

# randomの乱数生成アルゴリズム
Mersenne Twisterという、乱数生成アルゴリズムである。
周期が$ {2^{19937}}-1 \$と非常に長いが、決定論的（初期条件から結果が一意に定まる）であるため、初期値を知られると生成される乱数列が予測可能になってしまう。本来、生成される乱数は予測不可能であることが求められるため、この手法は特にセキュリティが重要な用途には適していない。
そのため、主にシミュレーション時の乱数として用いられる。

# secretsの乱数生成アルゴリズム
OSが提供する乱数発生器を用いる。暗号論的擬似乱数生成器（CSPRNG）と言われており、暗号技術を要する用途に適している。
詳細は以下の資料を参照のこと。

https://tex2e.github.io/blog/crypto/secure-random-generators

また、この手法は暗号化のみならず、そのランダム性から並列同時実行されうる場面においても適している。

# 参考資料
https://docs.python.org/ja/3/library/secrets.html#module-secrets

https://qiita.com/komorin0521/items/e21fd1cb5f8e76895062

https://qiita.com/shinkai_/items/eacd1a33ab037d31b979

https://qiita.com/seekworser/items/54e2b4596e72e8b9f9ea

https://qiita.com/gakuri/items/27cca8f0fa28b78ddeca
パラメーター 'props' の型は暗黙的に 'any' になりますの解決法

## パラメーター 'props' の型は暗黙的に 'any' になりますの解決法

# 下の問題のファイルでエラーが発生する原因になっている箇所
```:ColfulMessage.tsx
export const ColorfulMessage = (props) => {
}
```
# エラーの原因
* 引数として渡されているpropsの型定義がされていないから

# 解決法
propsの型定義を書く
```:ColfulMessage.tsx
type Props = {
    color: string;
    message: string;
  }
export const ColorfulMessage = (props:Props) => {
}
```