OmniAICreator/Qiita-1.07M huggingface dataset:
ICCV2023の枝刈り論文

# 概要

この記事では、[ICCV2023](https://iccv2023.thecvf.com/)の枝刈り論文を紹介します。[^1]

[^1]: 画像や数式は論文から引用しています。


# Prune Spatio-temporal Tokens by Semantic-aware Temporal Accumulation

https://openaccess.thecvf.com/content/ICCV2023/papers/Ding_Prune_Spatio-temporal_Tokens_by_Semantic-aware_Temporal_Accumulation_ICCV_2023_paper.pdf

- 概要：動画認識向けTransformerの枝刈り
- 研究機関：Huawei
- 新規性：STA. 意味を考慮した枝刈り
- キモ：(1)時間方向は領域ベースで新しく現れた領域を刈る。(2)意味の重要度は、各トークンの予測全体への寄与を計算する


# Efficient Joint Optimization of Layer-Adaptive Weight Pruning in Deep Neural Networks

https://openaccess.thecvf.com/content/ICCV2023/papers/Xu_Efficient_Joint_Optimization_of_Layer-Adaptive_Weight_Pruning_in_Deep_Neural_ICCV_2023_paper.pdf

- 概要：設定された枝刈り率を維持しながらレイヤ最適に刈り、出力の歪みを最小化する
- 新規性：全部のレイヤを見て、全体への誤差が最小になるように(11)レイヤ毎の最小誤差$\delta_i$を決める


# Dynamic Token Pruning in Plain Vision Transformers for Semantic Segmentation

https://openaccess.thecvf.com/content/ICCV2023/papers/Tang_Dynamic_Token_Pruning_in_Plain_Vision_Transformers_for_Semantic_Segmentation_ICCV_2023_paper.pdf

- 概要：セマセグ向けVision TransformerのDynamic (実行時)枝刈り
- 新規性：注意されていないトークンを除く方法。分類タスクをセマセグに拡張した
- キモ：Fig. 2. Confidenceが高いトークンは推論を早く打ち切る
ICCV2023の量子化論文 (3)

# 概要

この記事では、[ICCV2023](https://iccv2023.thecvf.com/)の量子化論文を紹介します。[^1]
[その1](https://qiita.com/kyad/items/a5c72cf8083808970c0f) [その2](https://qiita.com/kyad/items/5428ccf98e02d9defacb)

[^1]: 画像や数式は論文から引用しています。


# I-ViT: Integer-only Quantization for Efficient Vision Transformer Inference

https://openaccess.thecvf.com/content/ICCV2023/html/Li_I-ViT_Integer-only_Quantization_for_Efficient_Vision_Transformer_Inference_ICCV_2023_paper.html

- 概要：I-ViT. 整数演算のみのViT
- 新規性：Softmax, GELU, LayerNormもシフト演算化したShiftmax, ShiftGELU, I-LayerNormを提案
- キモ：expは近似で(13)、sqrtはニュートン法で(20)計算する


# A2Q: Accumulator-Aware Quantization with Guaranteed Overflow Avoidance

https://openaccess.thecvf.com/content/ICCV2023/html/Colbert_A2Q_Accumulator-Aware_Quantization_with_Guaranteed_Overflow_Avoidance_ICCV_2023_paper.html

- 概要：Accumulatorのビット数を下げる時のQATの改良
- 研究機関：AMD
- 新規性：量子化後にAccumulator(内積部分)のオーバフローを避けるようにQATする(Fig. 2)


# RepQ-ViT: Scale Reparameterization for Post-Training Quantization of
Vision Transformers

https://openaccess.thecvf.com/content/ICCV2023/papers/Li_RepQ-ViT_Scale_Reparameterization_for_Post-Training_Quantization_of_Vision_Transformers_ICCV_2023_paper.pdf

- 概要：ViTの低ビット時の精度悪化改善
GradleでオリジナルのSourceSetを利用してハマった話

# はじめに

Gradleを用いたJavaプロジェクトで、デフォルトの規約に沿わないディレクトリ構成をとるときは `sourceSets` の設定を変更して実現します。
そのようなオリジナルのディレクトリ構成をとったことで発生した問題の解決記録です。

参考：[【Gradle】規約と異なる構成のJavaプロジェクトをビルドする](https://qiita.com/maple_syrup/items/fdea051f9e0391441c30)

# 結論

**`srcDir` メソッドでディレクトリを指定した場合は追記となり、デフォルトの設定 (`src/[ソースセット名]/java` など) は残ったまま**となります。  
デフォルトの設定が残っていると困る場合は `srcDirs` プロパティを直接上書きしましょう。

# やったこと

以下のような構成のプロジェクトで、結合テストを実行するCIの修正をしていました。

```plaintext:プロジェクト構成 (抜粋)
<project-root>
├ subdir1/src
|   ├ main (メインのソースコード)
|   ├ test (単体テストのテストコード)
|   └ int-test (結合テストのテストコード)
├ subdir2/src
|   ├ main
|   ├ test
|   └ int-test
└ subdir3/src
    ├ main
    ├ test
    └ int-test
```

```gradle:build.gradle (sourceSetsの一部を抜粋)
sourceSets {
    main {
        java {
            srcDir 'subdir1/src/main/java'
            srcDir 'subdir2/src/main/java'
            srcDir 'subdir3/src/main/java'
        }
    }
    test { // 単体テスト
        java {
            srcDir 'subdir1/src/test/java'
            srcDir 'subdir2/src/test/java'
            srcDir 'subdir3/src/test/java'
        }
    }
    integrationTest { // 結合テスト
        java {
            srcDir 'subdir1/src/int-test/java'
            srcDir 'subdir2/src/int-test/java'
            srcDir 'subdir3/src/int-test/java'
        }
    }
}
```

Gradleタスクに結合テストのソースを読ませようと、タスクの設定に `sourceSets.integrationTest` を追記する修正をしたところ、 `<project-root>/src/integrationTest/java` というディレクトリがないと怒られてしまいました。

# 調査

どうなっとるんじゃと `srcDirs` の中身を全て出力させた結果が以下。

```plaintext
<project-root>/src/integrationTest/java
<project-root>/subdir1/src/int-test/java
<project-root>/subdir2/src/int-test/java
<project-root>/subdir3/src/int-test/java
```

先頭のやつは何？と思って[ドキュメント](https://docs.gradle.org/current/dsl/org.gradle.api.file.SourceDirectorySet.html)を調べたところ、この正体はデフォルトで `srcDirs` プロパティに設定される `src/${sourceSet.name}/${sourceDirectorySet.name}` でした。
`srcDir` メソッドの説明を読むと、 "Adds the given source directory to this set." とのことなので、デフォルトの設定は残したうえでオリジナルのディレクトリを追加している状態になってしまっていたのでした。

# 修正

`srcDirs` プロパティに存在しないディレクトリが残ってしまっていたので、追記のメソッドである `srcDir` を使うのではなく `srcDirs` プロパティを直接上書きするように修正しました。

```gradle:build.gradle (修正後のsourceSetsの一部を抜粋)
sourceSets {
    main {
        java {
            srcDirs = [
                'subdir1/src/main/java',
                'subdir2/src/main/java',
                'subdir3/src/main/java'
            ]
        }
    }
    test {
        java {
            srcDirs = [
                'subdir1/src/test/java',
                'subdir2/src/test/java',
                'subdir3/src/test/java'
            ]
        }
    }
    integrationTest {
        java {
            srcDirs = [
                'subdir1/src/int-test/java',
                'subdir2/src/int-test/java',
                'subdir3/src/int-test/java'
            ]
        }
    }
}
```
オープンソースムーブメントというビジネスモデル

# はじめに
今、資本主義経済はハードパワーからソフトパワーにシフトしています。組織や企業が持つ物理的な資源や能力に物を言わせて目的を達成するハードパワーにも限界が見えてきています。ブランド価値、顧客満足度、リーダーシップ、企業の社会的責任、文化的な価値観などの非物質的な要素により顧客やステークホルダーとの信頼関係を構築し目的を達成するソフトパワーが重要であることをみなさんも日々感じていることでしょう。個人や組織、企業が規模の大小に関わらず強力なソフトパワーを得るにはどうすればいいのか？その答えがオープンソースムーブメントです。

# オープンソースムーブメントとは
オープンソースムーブメントとは、ソフトウェアやその他の知的財産の開発や配布において、そのソースコードやデザイン、その他の資源を公開し、誰でも自由に利用、変更、改善、再配布できるようにする運動です。この運動は主にソフトウェア開発において顕著で、オープンソースソフトウェアの開発と普及を促進しています。

詳しくはLPI-Japanの創設者である成井さんの投稿を参照ください。

https://www.bold.ne.jp/engineer-club/open-source-movement

# ビジネスモデルとしてのオープンソースムーブメント
オープンソースムーブメントをビジネスモデルとすることには以下のようなメリットがあります。

1. 低コストの開発
オープンソースソフトウェアは一般に無償で提供されるため、企業は開発コストを削減できます。これにより、開発リソースを他の重要な業務に割り当てることができます。

2. コミュニティによる改善とサポート
オープンソースプロジェクトには広範な開発者やユーザーコミュニティが参加しており、バグ修正や機能の追加などの改善が迅速に行われます。また、コミュニティメンバーによるサポートも利用できます。

3. カスタマイズと柔軟性
オープンソースソフトウェアは自由に改変できるため、企業は自社のニーズに合わせてカスタマイズできます。これにより、市場の要求に応じた柔軟なソリューションを提供できます。

4. 共同利益の創出
オープンソースのビジネスモデルは、競合他社との協力関係を築くことができます。共同で開発やマーケティングを行うことで、より多くの顧客にサービスを提供し、市場シェアを拡大することが可能です。

5. 技術の進歩とイノベーション
オープンソースソフトウェアの透明性と共同開発のプロセスは、技術の進歩とイノベーションを促進します。新しいアイデアや解決策が共有されることで、産業全体の発展が促進されます。

6. ロックインの回避
オープンソースソフトウェアはベンダーロックインのリスクを軽減します。ソースコードがオープンであるため、特定のベンダーに依存せずに自由にシステムを移行できます。

これらのメリットは、企業がオープンソースムーブメントをビジネス戦略の一部として採用する際の重要な要素です。

# さいごに
```
# systemctl restart jinsei
```
オープンソースムーブメントはリーダーシップを証明する一つの方法となります。個人でも企業でもオープンソースの活動に積極的に参加し、業界全体の発展に貢献することで業界内での地位や尊敬を高めることができます。

誰でもオープンソースムーブメントを利用してソフトパワーを獲得し、競争力を高めることができるのです。
そう、約半世紀ずっーーーーーと引きこもりで地球から一歩も出ていない石ころでも。
【Unity】WebGLで書き出した時にブラウザのキャッシュクリアをしても反映されないな〜って時の解決方法

# 症状
UnityのWebGLで書き出した時、ビューやスクリプトを修正しても内容が反映されない...
URLにタイムスタンプを追加しても内容が更新されない...
ブラウザのキャッシュクリアをしても更新されない...
と悩んでいた

# 解決方法
UnityのProject SettingsのData Cachingのチェックを外して書き出す
改めてブラウザのキャッシュクリアをする

これだけで解決した、地味に時間を食ってしまった...
Historyオブジェクトを用いてWebサイトへのアクセス情報を取得する

## Historyオブジェクトに触れたきっかけ
所属するシステム開発プロジェクトの要件に、Webサイトの「総アクセス数」や「ページ別アクセス数」等を取得すること、というものがありました。
当初はNew Relicエージェントをアプリケーションに組み込み、自動でアクセス情報を取得する予定でしたが、課題が発生して断念。。代替策として、エージェントを用いずにアクセス情報を取得するために、イベントAPIを用いてカスタムイベントデータをNew Relicに送信する独自実装を行うことになりました。この実装を実現するための手段がHistoryオブジェクトだったのです。

参考ページ
[イベントAPIを使用したカスタムイベントの送信](https://docs.newrelic.com/jp/docs/data-apis/ingest-apis/event-api/introduction-event-api/)
## Historyオブジェクトとは？
Historyオブジェクトは、JavaScriptに標準搭載されているブラウザの履歴情報を管理するためのオブジェクトです。Historyオブジェクトを使用することで、ユーザのブラウザ履歴に関連する操作を行うことができます。
代表的なプロパティやメソッドは以下の通りです。
```javascript:history.js
// 現在の履歴エントリー数を取得
const entries = history.length;
console.log(entries); // 履歴のエントリー数が表示される

// 一つ前の履歴エントリーに戻る（ブラウザの「戻る」ボタンと同じ動作）
history.back();

// 一つ後の履歴エントリーに進む（ブラウザの「進む」ボタンと同じ動作）
history.forward();

// 2つ前の履歴エントリーに戻る
history.go(-2);

// 3つ後の履歴エントリーに進む
history.go(3);
```
## pushStateメソッドとreplaceStateメソッド
今回のアクセス情報取得のために用いたのがpushStateメソッドとreplaceStateメソッドです。この2つのメソッドを使用することで、ブラウザの履歴スタックに新しいエントリーを追加したり、既存のエントリーを置換したりすることができます。
### history.pushState(state, title, url)
pushStateメソッドは、新しい履歴エントリーをスタックに追加します。
- state：追加する履歴エントリーに関連づける状態オブジェクト。履歴エントリーに関する情報を含めることができます。
- title：追加する履歴エントリーのタイトル
- url：追加する履歴エントリーのURL
```javascript:pushState.js
history.pushState({ page: 1 }, "New Page", "newPage.html");
```
### history.replaceState(state, title, url)
replaceStateメソッドは、現在の履歴エントリーを置換します。
- state：置換する履歴エントリーに関連づける状態オブジェクト。履歴エントリーに関する情報を含めることができます。
- title：置換する履歴エントリーのタイトル
- url：置換する履歴エントリーのURL
```javascript:replaceState.js
history.replaceState({ page: 2 }, "Replace Page", "replacePage.html");
```
## 実装内容
上述したpushStateメソッドとreplacePlaceメソッドを用いて、クエリパラメータを含むURLの変更を伴う画面遷移等のイベントが発生した際に、ブラウザの履歴を正しく管理することができます。ブラウザの履歴を正しく管理できれば、Webサイトの「総アクセス数」や「ページ別アクセス数」も取得できそうですね。
プロジェクトではフロントエンドの開発にReactを使用しているため、ルートコンポーネントでuseEffectをフックし、サイトアクセス後のURLの変更を伴うすべてのイベントをNew Relicに送信するよう実装しました。
```javascript:rootComponent.js
useEffect(() => {
    // history.pushStateとhistory.replaceStateをオーバーライド
    const overrideHistoryState = async function (originalMethod, ...args) {
      // オリジナルのメソッドを呼び出す
      originalMethod.call(history, ...args);

      const pathName = window.location.pathname;
      const queryParams = window.location.search;

      // アクセス情報をバックエンドに送信
      await postPageAccess(pathName, queryParams);
    }

    // オリジナルのメソッドを保存
    const originalPushState = history.pushState;
    history.pushState = async function (state, title, url) {
      await overrideHistoryState(originalPushState, state, title, url);
    }

    // オリジナルのメソッドを保存
    const originalReplaceState = history.replaceState;
    history.replaceState = async function (state, title, url) {
      await overrideHistoryState(originalReplaceState, state, title, url);
    }
  }, [])
```
## おわりに
今回は、アクセス情報取得について、フロントエンドのみ記載しましたが、バックエンドの処理も必要ですし、New Relic側でのデータのビジュアライゼーションの問題もあります。New RelicにはSQLライクな記述で生成可能な強力なダッシュボード機能があるのですが、それらについてはまたどこかで。。
お読みいただきありがとうございました。
【Pino】ブラウザでlevelを文字列で出力する方法

ブラウザでlevelを文字列で出力するには`logger.js`に以下のように記述します。

```js
import pino from 'pino'

export const logger = pino({
  browser: {
    formatters: {
      level: (label: string) => {
        return {
          level: label,
        }
      },
    },
  },
})
```
Cyber Kill chainとsplunk

はじめに
-
サイバーキルチェーンを理解するためのメモです。
各ステップを理解するための例として、Splunkのユースケースをいくつか紹介します。

Cyber Kill chainとは
-
サイバーキルチェーンとは、ハッカーがサイバー攻撃を成功させる際にとる典型的な手順を説明したものです。すべてのサイバー攻撃が、サイバーセキュリティキルチェーンモデルの7つのステップすべてを利用するわけではありませんが、大半の攻撃はそのほとんどを使用し、特にステップ2からステップ6が行われることが多くなっています。

イメージ図
-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107981/79c270d9-8255-2501-45b2-426dd1c45a0b.png)
<br>

Step1: Reconnaissance(偵察)
-
偵察フェーズでは、悪意のあるアクターが標的を特定し、ネットワーク内でエクスプロイト可能な脆弱性と弱点を調査します。
```ruby:splunk
index=weblogs source="*access.log" | stats count by clientip
```

潜在的な偵察のために、異常なウェブトラフィックの急増を特定する。
<br>

Step2: Weaponization(武器化)
-
武器化フェーズでは、攻撃者は、既知の脆弱性をエクスプロイトできるリモートアクセスマルウェア、ランサムウェア、ウイルス、ワームなどの攻撃ベクトルを作成します。
```ruby:splunk
index=firewall_logs action="allowed" signature="malware"
```

ファイアウォールのログを監視し、マルウェアのシグネチャがある接続を許可する。
<br>

Step3: Delivery(配送)
-
配送ステップでは、侵入者が攻撃を開始します。利用する具体的な手順は、実行する攻撃の種類によって異なります。
```ruby:splunk
index=email_logs event_type="delivery" attachment="*.exe"
```
実行可能な添付ファイルを持つ電子メール配信を検出する。
<br>

Step4: Exploitation(エクスプロイト)
-
エクスプロイトフェーズでは、悪意のあるコードが被害者のシステム内で実行されます。
```ruby:splunk
index=security_logs sourcetype="windows" EventCode=4624 "Logon Type"=3
```
Windowsシステムで成功したネットワークログインを特定する。
<br>

Step5: Installation(インストール)
-
エクスプロイトフェーズの直後に、マルウェアまたはその他の攻撃ベクトルが被害者のシステムにインストールされます。脅威アクターがシステムに侵入し、コントロールを掌握することができるようになるため、ここは攻撃ライフサイクルのターニングポイントとなります。
```ruby:splunk
index=endpoint_logs action="file_created" path="C:\\ProgramData\\*.exe"
```
実行可能ファイルの作成についてエンドポイントログを監視する。
<br>

Step6: Command and Control(コマンド＆コントロール)
-
マンド＆コントロールでは、攻撃者はマルウェアを使用して、標的ネットワーク内のデバイスまたはアイデンティティのリモートコントロールを掌握することができます。
```ruby:splunk
index=network_traffic dest_ip="known_C2_server"
```
コマンド＆コントロールサーバーへの接続を検出する。
<br>

Step7: Actions on Objectives(目的の実行)
-
このステージでは、攻撃者がデータの窃盗、破壊、暗号化、持ち出しなど、意図した目的を達成するための手段を講じます。
```ruby:splunk
index=security_logs action="data_exfiltration"
```
データ流出のパターンを示すログを探す。



おわりに
-
サイバーキルチェーンをsplunkの調査と紐づけてみました。
**※必要なフィールドとインデックスを環境に応じて変更しない限り、クエリが意味をなさないので環境に応じて変更してください。**
#4【勉強メモ】エヴァンス本からざっくり理解するDDD

## 目標
・ふわっとした理解のDDDについて[エヴァンス本](https://www.amazon.co.jp/%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88-Architects%E2%80%99Archive-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A8%E3%83%B4%E3%82%A1%E3%83%B3%E3%82%B9/dp/4798121967/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=17W0M5YAY0R9Z&dib=eyJ2IjoiMSJ9.qtIEGNumTF4Fq3OG4r7BcgPPpMccQaiAMFjoQiYsRfAUl2LJ3kucBAwXJG1pE1-9MMyozf_R6XnUk8kwhpkIPyRMzsu94DrC82a2cWHXn2TDjembTcFwG0z4uuYeu7EY_VF_p_KcGaJhu-sFQP2IfF8BXdAN9RWcUsZLGOA8hIhkuAKrptA3cagpPrF5ZoxXjjZ9ctVxNzHN-qanc6enklCzFiHeCY1UpXho238Cgd4eMsXlRTbQ5u_T9ZSbUOj5EOjKzf1jx0xSJbTwFJrRetDuJaorGcsbbNpAuJkvNAs.F3zE4YfUXPLj7DRzsSV4wM07EgTKoLqmpU491uMjIhw&dib_tag=se&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88&qid=1710421495&sprefix=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%2Caps%2C279&sr=8-1)を通して体系的に学習する
・各章の要約をアウトプットすることで知識を定着させる

## 前回の記事
第1部の内容は以下でまとめています。
[#1【勉強メモ】エヴァンス本からざっくり理解するDDD](https://qiita.com/kotemendo2819/items/9d1bdfd4b3408b0c4ec2)
[#2【勉強メモ】エヴァンス本からざっくり理解するDDD](https://qiita.com/kotemendo2819/items/c990d60210259f2ad44a)
[#3【勉強メモ】エヴァンス本からざっくり理解するDDD](https://qiita.com/kotemendo2819/items/4b476034ba358077b6ae)

## 【第2部】モデル駆動設計の構成要素
DDDを支える基本原則など
・責任駆動設計(responsibility-dreven design)
・契約による設計(design by contract)

第2部の3つの章の内容は「パターンランゲージ」として構成され
モデルのわずかな違いと設計における意思決定がDDDプロセスに
どれほどの影響を与えるかが示される。

## 【第4章】ドメインを隔離する
### `レイヤ化アーキテクチャ`
##### ・レイヤ化アーキテクチャ
ソフトウェアの関心事を分離しそれぞれの要素に集中できるようにする(凝集)アーキテクチャ。
レイヤ内のどの要素も、同じレイヤの他の要素か、その「下にある」レイヤの要素にしか依存することができない。

| レイヤ | 責務 |
|:-:|:-:|
|ユーザーインターフィエース層(UI)|ユーザーのコマンド解釈、情報表示|
|アプリケーション層(AP)|ソフトウェアが行う仕事定義、ビジネスロジック|
|ドメイン層|ビジネスの概要、状況、ルールを表すソフトウェアの核心|
|インフラストラクチャ層(IF)|ドメインの永続化、DB接続等の技術的機能の提供|

各レイヤの凝集度を高め上位レイヤに対しては疎結合にすることが
できてはじめてモデル駆動開発を実践することができる。

### `レイヤを関係づける`
UI層をAP層やドメイン層と結びつけるパターン
##### ・モデル・ビュー・コントローラ(MVCModel-View-Controller)
##### ・モデル/ビュー分離パターン(Model-View Separation Pattern)
##### 　　└モデル/ビュー分離パターン(Model-View Separation Pattern)

IF層はAP層の内容は背負わず、いつ実行するのかは知っているがどのように行うかまでは知らない状態にする。

### `ドメイン層はモデルが息づく場所`
ドメイン層を隔離することは、ドメイン駆動設計の必須状況である。
モデルの概念を反映するドメイン層によって、ソフトウェアが構成される。

### `利口なUI「アンチパターン」`
##### ・利口なUI
ビジネスロジックをUI層に記述したり、AP層内の独立したUIとして実装することなど。
単純なアプリであれば生産性が高くすぐに動くものを作ることができるというメリットがある一方で、
アプリが成長しても複雑さによって機能追加やふるまいの豊かさを損ねてしまうというデメリットがある。

### `その他の隔離`
他のドメインのコンポーネントと完全に結合しきれないモデルや、同じドメインに関する別のモデルを参照するケース
でモデルの有用性を損ねてしまうことに注意する。

### `まとめ`
DDDで使われるアーキテクチャの概要やアンチパターンについて理解することができた。
次はソフトウェアで表現されたモデルについて学習する。

https://qiita.com/kotemendo2819/items/541bac1d8596ae887d12

参考になったらいいねやコメントおまちしています！！
【jQuery】DataTablesでのエラー「Requested unknown parameter 'xxx' for row x, column x」の原因とは

# 概要
JavascriptのDataTablesを利用していたところ、`update`フォーム送信時に以下のエラーが表示されました。

```
DataTables warning: table id=sample_table - Requested unknown parameter 'hogehoge' for row 0, column 5. For more information about this error, please see http://datatables.net/tn/4
```

原因は簡単でしたが...念の為備忘録として残します。

## 原因と該当コード
上記エラーの原因は、大体がデータソースと列設定を確認して該当パラメータが正しく設定されているかどうか、にあると思います。
私もその例に埋もれず、よく確認したら`'hogehoge'`という名前のプロパティが存在していなかったのです。

以下のようにすると成功しました。

```js
$(document).ready(function () {
    var RenderTable = function (data) {
        var table = $('#sample_table').DataTable({
    ...
    // 省略

    var AddFeildToObject = function (index, value) {
        if (value['hogehoge_id'] == 1) {
            value.hogehoge = value['hoge_1']
        } else {
            value.hogehoge = value['other_hoge']
        }
    }


	var SaveFormEdit = function(){
		var form = $(this);
		$.ajax({
			url: form.attr('data-url'),
			data: form.serialize(),
			type: form.attr('method'),
			dataType: 'json',
			success: function(data){
				if(data.form_is_valid){
					$('#sample_table').DataTable().destroy();
                    var json = JSON.parse(data.queryset);
                    $.each(json, AddFeildToObject);　// これが漏れていた...
					RenderTable(json);
					$('#sample-edit').modal('hide');
				} else {
                    if(data.validation_failed) {
						$('#edit-error').val(data.validation_error);
					}else {
						$('#edit-error').val(data.error);
					}
				}
			}
		})
		return false;
	}
 ```

どうして上記エラーになったか、というと、`$.each(json, AddFeildToObject);`の記載が漏れていたためでした。この関数がない場合、`hogehoge`というパラメータが存在しないまま`RenderTable`関数が実行されてしまうのです。

他の関数で初めて生成される変数がTablesにある場合は、しっかりそこを経由してあげる必要があります。

`AddFeildToObject`関数が省略されると、`RenderTable`関数がこれらの追加のプロパティを期待しているにもかかわらず、それらが存在しないためにエラーが発生するのです。

公式ドキュメント：

https://datatables.net/manual/tech-notes/4


## そのほか補足

上記コードは、非同期通信（AJAX）の成功時のコールバック関数です。
具体的には、とある登録情報を更新する際に送られるものです。

`$('#sample_table').DataTable().destroy();`では、IDが`sample_table`の要素にバインドされた`DataTable`を破棄します。上記コードでは一番先頭に記載したものです。

`var json = JSON.parse(data.queryset);`では、サーバから返されたデータ（`data.queryset`）をJSON形式にパースします。私はDjangoで`data.queryset`を渡してあげています。

`$.each(json, AddFeildToObject);`では、そのパースしたJSONデータの各要素に対して`AddFeildToObject`関数を実行します。

最後に、`RenderTable(json);`によって、パースしたJSONデータを引数に`RenderTable`関数を実行し、テーブルを再描画しています。

このような実装を行うことで、サーバからのレスポンスに基づいてUIを動的に更新することができます。
VS Codeのエディタ画面でtextlintの警告が表示されない際の解消案

## 状況
VS Codeのエディタ画面でtextlintの警告が表示されない。

## はじめに

VSCodeの拡張機能であるvscode-textlintは文章校正用ツールです。文章の品質を保つ際には、インラインで表示されるリアルタイムのフィードバックが非常に役立ちます。しかし、特定の拡張機能が有効になっていると、textlintの警告がエディタ上でインラインで表示されないという問題に遭遇しました。この記事では、その問題の原因と解決策を共有します。

## 問題の発生

textlintは、文章の校正と品質向上のために利用していたツールです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/cbddbb78-48b7-08c5-38c8-cf8511d32c15.png)

しかし、VSCodeで`novel-writer`という拡張機能を有効にすると、textlintからの警告やエラーがエディタ内にインラインで表示されなくなるという問題が発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116202/8011ae63-a97e-f064-b321-83bac2bcc857.png)


## 原因の調査

問題の原因を特定するために、以下のステップを踏みました：

- VSCodeの再起動や`settings.json`の確認
- textlintの設定と拡張機能の確認
- 拡張機能の一つずつの無効化を試みる

これらの試みの中で、`novel-writer`拡張機能を無効化したところ、textlintの警告が再びインラインで表示されるようになりました。

## 解決策

この問題の解決策は、`settings.json`にnovel形式を記載することでした。

```json
"textlint.languages": [
        "plaintext", "markdown", "novel"],
```
運動不足は大敵！おひとり様でも楽しめるスポーツを紹介

おひとり様でも楽しめるスポーツを紹介します。これらのアクティビティは、フィットネスの向上、ストレスの解消、または新しい技能を磨くために最適です。それぞれのスポーツの特徴やメリットを詳しく説明しましょう。 
1. ランニング 

ランニングは最もアクセスしやすいスポーツの一つで、特別な機材や場所を必要としません。早朝の静かな時間帯や夕方の涼しい時刻に、近所を走ることで日々のストレスを解消し、心身の健康を保つことができます。ランニングは心臓血管系の健康を向上させ、筋力を強化し、持久力を高めるのに役立ちます。また、ランニングコミュニティに参加することで、同じ目標を持つ人々と繋がることもできます。 
2. ヨガ 

ヨガは心と体のバランスを整える古代インド発祥の実践で、柔軟性、筋力、バランスを改善します。ヨガはストレス解消とリラクゼーションにも非常に有効で、多様なスタイルが存在するため、初心者から上級者まで幅広く楽しめます。オンラインクラスやアプリを利用して、自宅で簡単に始められます。 
3. サイクリング 

自転車乗りは、楽しみながらフィットネスを向上させる素晴らしい方法です。都市部のサイクリングコースや、自然豊かな地域での山岳バイキングなど、さまざまな環境で楽しむことができます。自転車は低衝撃で関節に優しいスポーツであり、心臓血管系の健康、筋力、持久力の向上に寄与します。また、エコフレンドリーな交通手段としても利用できます。 
4. スイミング 

スイミングは全身を使う運動で、特に暑い季節には最適です。水泳は心臓血管系の健康を向上させ、筋肉を強化し、体の柔軟性を高めることができます。水の浮力により関節への負担が少なく、リハビリテーションにも利用されます。公共のプールやフィットネスクラブで気軽に始められ、水泳教室に参加することで技術を磨くこともできます。 
5. メディテーション 

メディテーション（瞑想）は、精神を集中させることで心の平和を得る実践です。ストレスの軽減、集中力の向上、感情のコントロールなど、多くのメンタルヘルスの利点があります。瞑想は特別な設備や道具を必要とせず、自宅や公園など、静かな場所で行うことができます。ガイド付き瞑想のアプリやオンラインクラスを利用して、瞑想を学ぶことも可能です。

これらのスポーツは、ひとりで楽しむことができるだけでなく、自分自身と向き合い、健康的なライフスタイルを送るための素晴らしい方法です。それぞれに挑戦してみて、自分に合ったスポーツを見つけることをお勧めします。 

その他、おひとり様の情報のおすすめはこちら⇒　https://hitori-club.com/
Web Bluetooth API で Characteristic UUID の一覧を取得してみる（toio を使い p5.js Web Editor上で試す）

## はじめに
ブラウザの「[Web Bluetooth API](https://developer.mozilla.org/ja/docs/Web/API/Web_Bluetooth_API)」で、接続したデバイスの Characteristic UUID の一覧を取得してみたという話です。

### 今回の内容
[過去に Web Bluetooth　API を使ったお試しをいろいろ行ってきましたが]()、「API を使ってどんなことができるか／どんな情報を取得できるか」というのをあらためて確認してみようと思い、その第一弾として今回の内容をやってみました。

それを、以下の組み合わせで試してみます。

- デバイス： toio
- 開発環境： p5.js Web Editor

なお toio の UUID の一覧は、公式の仕様のページで公開されているので、今回の仕組みを使って確認するというのを行う必要はありません。
今回は、Web Bluetooth API を使って取得した Characteristic UUID のリストが、以下の仕様に合致しているかを簡単に確認できるため、toio を用いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4493d30f-1946-7be6-fd39-5e2fb16ef988.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/085744a6-ee0f-4fd4-e33a-d914635146a6.png)

## Web Bluetooth API
Web Bluetooth API を使った toio への接続処理で、出だしの処理には以下を用います。

●Bluetooth: requestDevice() メソッド - Web API | MDN
　https://developer.mozilla.org/ja/docs/Web/API/Bluetooth/requestDevice

その後は、Characteristic UUID を取得できるところまで処理を進め、その後、Characteristic UUID を全て取得し、取得した内容をログ出力してみます。

プログラムの内容は、以下の通りです（特別な環境を用意することなく簡単に試せるよう、p5.js Web Editor上で扱える形にしました）。

```javascript:sketch.js
function setup() {
  createCanvas(400, 400);
  background(220);
}

async function connectAndGetServicesAndCharacteristics() {
  const TOIO_SERVICE_UUID = "10b20100-5b3b-4571-9508-cf3efcd7bbae";
  try {
    const device = await navigator.bluetooth.requestDevice({
      filters: [{ services: [TOIO_SERVICE_UUID] }],
    });
    const server = await device.gatt.connect();
    const services = await server.getPrimaryServices();
    console.log("Found services:", services);

    for (const service of services) {
      const characteristics = await service.getCharacteristics();
      console.log(`Service: ${service.uuid}`);
      for (const characteristic of characteristics) {
        console.log(`  Characteristic: ${characteristic.uuid}`);
      }
    }
  } catch (error) {
    console.error("Error:", error);
  }
}

function mouseClicked() {
  connectAndGetServicesAndCharacteristics();
}

```

上記を実行し、toio との接続を行った後に出力された内容は以下のとおりです。

- Characteristic: 10b20101-5b3b-4571-9508-cf3efcd7bbae 
- Characteristic: 10b20102-5b3b-4571-9508-cf3efcd7bbae 
- Characteristic: 10b20103-5b3b-4571-9508-cf3efcd7bbae 
- Characteristic: 10b20104-5b3b-4571-9508-cf3efcd7bbae 
- Characteristic: 10b20106-5b3b-4571-9508-cf3efcd7bbae 
- Characteristic: 10b20107-5b3b-4571-9508-cf3efcd7bbae
- Characteristic: 10b20108-5b3b-4571-9508-cf3efcd7bbae 
- Characteristic: 10b201ff-5b3b-4571-9508-cf3efcd7bbae 

最初の部分が 10b20101 〜 10b20108　となる UUID と、最初の部分が 10b201ff となる Characteristic UUID が取得できているのが分かります。

これらの Characteristic UUID について、[公式ページの情報](https://toio.github.io/toio-spec/docs/ble_communication_overview/)を見ていくと、以下の Characteristic UUID に一致していることが確認できました。

- ID Information / 読み取りセンサー
- Sensor Information / モーションセンサー
- Button Information / ボタン
- Battery Information / バッテリー
- Motor Control / モーター
- Light Control / ランプ
- Sound Control / サウンド
- Configuration / 設定
ABC345をPythonで（A～C+α）

モノグサプログラミングコンテスト2024（AtCoder Beginner Contest 345）の解答等のまとめ

https://atcoder.jp/contests/abc345

# A問題
問題の通りに書けばいい
```python:A
s = input()

print("Yes" if s[0] == "<" and s[-1] == ">" and s[1:-1] == "=" * (len(s) - 2) else "No")
```
# B問題
Pythonで切り上げ演算すればいい
```python:B
print((int(input())+9)//10)
```
# C問題
同じ文字を入れ替えても最初と変わらないので、最初と同じものを計算すればいい

コードは
1. 選ぶパターンをansとして計算する
1. 重複するパターン分ansから引く
1. 重複することがあったら最後に1足す

```python:C
from collections import defaultdict

s = input()

ans = len(s) * (len(s) - 1) // 2

d = defaultdict(int)
same_start = 0
for s_i in s:
    ans -= d[s_i]
    if d[s_i] > 0:
        same_start = 1
    d[s_i] += 1

print(ans + same_start)
```
# D問題
- 全探索してもギリギリ間に合う設定なのはすぐに分かった
- ただPythonだからか、どう書いてもTLEする（たぶんコードが悪いだけ）

# E問題
- dpなら$O(NK)$でやれると判断してやってた
- ただPythonだからか、どう書いてもTLEする（たぶんコードが悪いだけ）
Yolo-v8で実験の実行を保存するディレクトリを変更する方法

# はじめに
こんにちは。初投稿なので改善点などがあればリプ欄で教えてください。
画像認識について興味を持ったためYolo-v8を使ってみようと思ったのですが結果の保存に関してうまく行かないことがあったため備忘録として記録しておきたいと思います。

# 1,発生した問題

まずはYolo-v8を早速使ってみる

```python:yolo.py
from ultralytics import YOLO

# モデル読み込み
model = YOLO("models/yolov8n.pt")

# 入力画像
results = model('bus.jpg',save=True) 
```
前述したコードを実行すると以下のような画像認識の結果が出ます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693349/601acc65-934b-ca32-b6b6-4cba03072d98.jpeg">

しっかりと画像認識されていますね！

しかし...ここで発生したのがこの結果の保存先問題です。

以下のターミナルの情報を見てもらうとわかるように実行ディレクトリと保存ディレクトリが違うことがわかります。

```terminal
(env) hiromu@Hiromus-MBP Yolo % python -u "/Users/hiromu/MyPython/Yolo/yolo.py"

image 1/1 /Users/hiromu/MyPython/Yolo/bus.jpg: 640x480 4 persons, 1 bus, 1 stop sign, 57.4ms
Speed: 2.3ms preprocess, 57.4ms inference, 1.1ms postprocess per image at shape (1, 3, 640, 480)
Results saved to /Users/hiromu/hack/runs/detect/predict
```




# 2,解決のために行ってみたこと

なぜこのようなことが起きてしまったのか、原因を色々検索したのですが見当たりませんでした。

実は保存先のディレクトリは以前ハッカソンで画像認識を使ったディレクトリでありました。画像認識に関してはチームの他のメンバーが担当していたためファイルの管理をしていなかったのでそれが悪さしているのではないかと思い、友人に聞いてみたのですが何も設定などはしていないとのことでした。。。

### ①ディレクトリの削除
ハッカソンで使用したローカルディレクトリはGitHubに公開してあるため削除しても良いので削除し、再度実行したのですが何も解決しませんでした。

### ②ultralyticsの再インストール
yoloを使う際にインストールするモジュールなのですが特に解決しませんでした。

### ③保存先パスの指定
```python
results = model('bus.jpg',save=True) 
```
この部分を変更してパスを指定してみたのですがうまくいかず
```python
results = model('bus.jpg', save=True, save_path='/Users/hiromu/MyPython')
```



# 3,解決

そもそもYoloの設定がおかしいのではないのかと思い、Yoloに設定などあるのかわからないままとりあえず調べてみることに・・・


**あったー！！！**

公式が丁寧に解説していました。すいません。公式様がやはり一番です。🙇

![スクリーンショット 2024-03-16 22.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693349/9d3c0475-fb11-c1f2-92d7-5e10ff07d8ac.png)


https://docs.ultralytics.com/ja/quickstart/#inspecting-settings

ということでこのページの下の方にある方法で設定見てみると


```
{'runs_dir': '/Users/hiromu/hack/runs'}
```

これですね。原因は。
設定変更をするためのコードを書いて希望するパスに変更し実行する。

```python
from ultralytics import settings

# Update a setting
settings.update({'runs_dir': 'Users/hiromu/MyPython/Yolo'})

# Reset settings to default values
settings.reset()
```

```
(env) hiromu@Hiromus-MBP Yolo % python -u "/Users/hiromu/MyPython/Yolo/yolo.py"

image 1/1 /Users/hiromu/MyPython/Yolo/bus.jpg: 640x480 4 persons, 1 bus, 1 stop sign, 61.0ms
Speed: 4.4ms preprocess, 61.0ms inference, 4.4ms postprocess per image at shape (1, 3, 640, 480)
Results saved to runs/detect/predict
```

無事解決しました！！！！
これを解決するために５時間ほど費やしてしまいました😭


# 4,まとめ

OSSを使うときは公式ページをしっかり最初から読むことが何よりも大切だと感じました。
もちろんそれ以外でも。
systemdのunitファイル(service)でmiseを使う方法

※完全に自分向けメモなので、解説は自分で探してください。

例: [mise](https://mise.jdx.dev/) で管理している node で、[MySpeed](https://github.com/gnmyt/myspeed) というサーバープロダクトを起動する方法

## 前提

* mise のインストールは Quickstart に沿ったもの (`$HOME/.local/bin/mise`) ※ USER=pi
    * `mise install node@20` 済み
    * `mise global ...` は行っていない
* MySpeed のインストール先は `$HOME/myspeed/`

## .service ファイル

編集には `systemctl edit` を使うとよいでしょう。
(ref: [systemdのUnitファイルのパスを知らなくともUnitファイルを編集する方法](https://qiita.com/ma2shita/items/551b07c6f2bb6b8715a8))

```
# apt autoremove --purge nano # (^q^)
systemctl --user edit --full --force myspeed.service
```

```ini:myspeed.service
[Unit]
Description = MySpeed

[Service]
WorkingDirectory = %h/myspeed
ExecStart = %h/.local/bin/mise exec node@20 -- node server
Restart = always
Environment= NODE_ENV=production

[Install]
WantedBy=default.target
```

## 設定方法

※今回は[ユーザーインスタンス](https://wiki.archlinux.jp/index.php/Systemd/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC)(ユーザー権限でsystemdを動かす) 方法を取っています

systemd への登録

```
loginctl enable-linger $USER
systemctl --user enable --now myspeed.service
```

systemd から登録解除

```
systemctl --user disable --now myspeed.service
```


## 参考

* [systemd.service — Service unit configuration](https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html)

EoT
Docker ComposeでGraphQL環境構築。[バック = Laravel v10] [フロント = Apollo Client]

# はじめに

GraphQLを試せる環境を構築したいと思い、バックエンドとフロントエンドの開発環境テンプレートをDocker Composeを使用して作成しました。

https://github.com/perilla0/laravel_v10_graphql_template

本テンプレートの範囲は、バックエンドとフロントエンドの構築と疎通（GraphQLでデータ取得＆表示）までとします。

# バックエンド構成

- Laravel v10（もうv11出ましたね...）
- Lighthouse

https://laravel.com/docs/10.x

https://lighthouse-php.com/

# フロントエンド構成

- Vite
- Apollo Client

https://ja.vitejs.dev/

https://www.apollographql.com/docs/react/

# Apollo Clientを表示するまでの手順

READMEにも記述しておりますが、一応こちらにも。  

本記事の冒頭で掲載したテンプレートリポジトリが、ローカルにcloneされていることを前提に話を進めます。

## 前提環境

https://qiita.com/perilla/items/ef73cf57ade24bc94f19

## プロジェクト作成

バックエンドおよびフロントエンドのプロジェクトを作成します。

```sh:Ubuntu
cd script/init/
./create_src.sh
```

## CORS設定

Laravelの以下のファイルを編集します。

```php:/src/backend/config/cors.php
// 'paths' => ['api/*', 'sanctum/csrf-cookie'],
'paths' => ['api/*', 'graphql', 'sanctum/csrf-cookie'],
```

## コンテナ立ち上げ

```sh:Ubuntu
docker compose up
```

## テーブル作成

`docker compose up`で各コンテナが起動している状態で実行してください。

```sh:Ubuntu
docker compose exec -u $(id -u):$(id -g) backend php artisan migrate
```

usersテーブルにレコードを追加。
※ Laravelの[スターターキット](https://readouble.com/laravel/10.x/ja/starter-kits.html)で用意されているテーブルです。

```sh:Ubuntu
docker compose exec -u $(id -u):$(id -g) backend php artisan tinker
```

入力待ちになるので、以下を入力します。

```sh:Ubuntu
\App\Models\User::factory(10)->create();
```

処理が終了したら「q」と「Enter」を押して、終了します。

# 表示確認

## フロントエンド（Apollo Client）

`localhost:4000`にアクセスし、以下のように表示されていればOKです。

![スクリーンショット 2024-03-16 213706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715188/2cfc034f-74a8-7cbb-447a-9b071bb240c8.png)

フロントエンドの実装については、「[Get started with Apollo Client](https://www.apollographql.com/docs/react/get-started)」を、Laravelのスターターキットで用意されているテーブルに合わせてカスタマイズしただけです。

## LaravelのGraphQLクライアント

`localhost/graphiql`にアクセスし、GraphQLを試すことができます。

![スクリーンショット 2024-03-16 213938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3715188/43a0a694-719b-5995-fcf3-0cb1b668b188.png)

# さいごに

今回は、Laravel + Apollo Clientの構成でGraphQL開発環境テンプレートを構築しました。

このテンプレートをもとにちょこちょこ実装してみようと思っています。

以上、読んでいただきましてありがとうございました🫠
PHPでのライブラリ(Composer)の導入方法

PHPでは <font color="DeepPink">Composer(PHPの依存管理ツール)</font>を使うと便利！<br>

https://getcomposer.org/

<h1>Composerの仕組み</h1>
▼composer.jsonファイル<br>
プロジェクトで使用するライブラリを記述したもの<br>
▼composer.lockファイル<br>
実際にどのライブラリのどのバージョンをダウンロードしたのかをひとまとめにしたもの。<br>
※実際の開発現場では上記二つのファイルを共有して開発する。<br>
 チーム開発時に使用しているライブラリがバラバラだとそれが原因でエラーになることもある。

<h1>手順</h1>
①GitHubでインストールしたいライブラリを検索する<br>

②composer.jsonを作成(プロジェクトの初期に１度実行)
```
$ composer init
```

 （今回はDockerのappコンテナ内に入れたいので以下のコマンドで実行しました。↓）
```
$ docker-compose exec app composer init
```
　→以下の表示が出たら◎

![スクリーンショット 2024-03-16 13.53.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3698182/f1097e5c-c96a-a7b2-7ec9-1585b3731740.png)

　→会話式で設定を進める。

③composer.jsonにライブラリ、composer.lockに実際にインストールしたものを記述する。
　ライブラリ名はGitHubに記載されているものをコピペする。
```
$ composer require <ライブラリ名>
```
（今回はDockerのappコンテナ内に入れたいので以下のコマンドで実行しました。↓）
```
$ docker-compose exec app　composer require <ライブラリ名>
```
✔︎composer.jsonファイルのrequireにライブラリが記載されていて
✔︎composer.lockファイルができていたら
**<font color="DeepPink">→ライブラリのインストールが完了！</font>**

※インストールしたライブラリは、**srcディレクトリ**下の**vederディレクトリ**に入っている。

④GitHubの使い方通りに使っていく

# venderに入っているautoload.phとは？
通常はライブラリをインストールしたら、それぞれのライブラリをPHPに読み込まなきゃ(require)いけない。それは面倒。<br>
→Composerがvenderの下に **autoload.php** を用意してくれている！<br>
それさえ読み込めばそれぞれPHPに読み込まなくても使える！




<h1>番外編</h1>

チーム開発時に使用。共通のバージョンのライブラリを使うことができる。
```
$ composer install
```
LeetCodeのTwo Sum問題の解法説明

LeetCodeの最初の問題、「Two Sum」を見てみましょう。
問題の説明は以下の通りです。
```
整数の配列numsと整数のターゲットが与えられた場合、
ターゲットになるように2つの数のインデックスを返します。
入力には必ず 1 つの解が存在し、同じ要素を 2 回使用することはできません。
答えはどの順番でも返せます。
```
では、ここで例を見てみましょう。
```
Input: nums = [2,7,11,15], target = 9
Output: [0,1]
```
可視の通り、nums配列の 0 番目の要素 (2) と 1 番目の要素 (7) の和が target 値の 9 になるため、出力はこれらの 2 つの要素のインデックスで構成される配列になります: [0, 1]。

問題で返すべきものが何であるかが分かったら、解く方法を考えましょう。

ブルートフォース法で考えられる全ての組み合わせを生成し、それぞれの組み合わせが target になるかどうかを確認していくと、時間計算量が O(n²) になってしまいます。この解法は効率が非常に悪くなってしまいます。

したがって、今回はハッシュテーブルを使った解法アプローチを採用します。これにより、時間計算量を O(n) に削減できます。

Pythonコードはこちらです。

https://gist.github.com/kobukuro/72d80ad1f7208b1e99b0ea480c74c8a3#file-1-two-sum-py

6行目で、「lookup」 という名前の辞書型変数 (ハッシュテーブル) を使っていることが確認できます。
次に、nums 配列全体を走査します。 「ターゲットから現在の要素を引いた値」が lookup 変数に存在しない場合、「ターゲットから現在の要素を引いた値」をキーとし、現在のインデックスを値として、lookup 変数にキーと値のペアを追加します。
そして、「ターゲットから現在の要素を引いた値」が lookup 変数に存在する場合、答えが見つかったことを意味します。このとき、lookup 変数から「ターゲットから現在の要素を引いた値」 をキーとして取得した値と、現在のインデックスとで構成される配列を直接返します。

では、この解法の時間計算量と空間計算量を見てみましょう。

時間計算量

配列 nums 全体を見て回るため、O(n) です。for ループ内では、ハッシュテーブル変数にキーが存在しているかを確認したり、ハッシュテーブル変数にキーと値のペアを追加したりなどの操作を行いますが、これらの操作はどちらも一定時間で実行できます。したがって、この解法の全体的な時間計算量は O(n) になります。

空間計算量

ハッシュテーブル変数が必要なので、最悪の場合、nums 配列のすべての要素がハッシュテーブルに格納されます。したがって、空間計算量は O(n) になります。

Javaコードはこちらです。

https://gist.github.com/kobukuro/1fecf474a5779e0661f4468831e51ea9#file-solution-java

解法自体は基本的に同じです。

ハッシュマップのキーと値の型は、Integer (整数) として定義する必要があります。また、for ループ内で返り値がない場合は、null を返します。しかし、この問題では必ず解が 1 つ存在することが保証されています。

説明動画とコードへのリンクを以下に示します。ご自由にご確認ください。

[Pythonを使って日本語でTwo Sum問題の説明](https://www.youtube.com/watch?v=IHTtwey2Yug)

[Python code on GitHub](https://github.com/kobukuro/leetcode/blob/master/Hash%20Table/1%20Two%20Sum.py)

[Java code on GitHub](https://github.com/kobukuro/leetcode-java/blob/master/src/TwoSum1.java)
Ruby on Rails form_withメソッドにおけるsubmit後のURL

urlオプションとして明示的に設定せず、modelオプションとして設定した場合は、コントローラーで作成したインスタンスがnewメソッドで新たに作成されて何も情報を持っていなければ自動的にcreateアクションへ、findメソッドなどで作成され、すでに情報を持っている場合はupdateアクションへ自動的に振り分けてくれます。

もし、リクエストの送信先PATHが分からない場合は、実際のページを見て、デベロッパーツールでPATHを確認できる。
下図を見ると、books/1となっていることから、"/books/:id"へ送信されることがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150097/752a0392-7aeb-4683-1181-31833d80419a.png)


参考となる記事一覧

https://qiita.com/RIN_HM/items/464827b6055aa9748425

https://qiita.com/YokoYokoko/items/77d0043e12406c7cec9e

https://pikawaka.com/rails/form_with
GStreamerでWebカメラの映像とマイクロフォンの音声を合成して保存する

# はじめに
GStreamerは、マルチメディアデータを処理するためのパワフルなフレームワークであり、さまざまな用途に使用できます。本記事ではGStreamerを使用して、USBカメラからの映像と、USBカメラ内蔵でない（Settings => Sound => Input で指定していない）マイクロフォンを指定し、そこからの音声を合成して.webm形式で保存する方法を紹介します

作業環境
・Ubuntu 22.04.4 LTS \n \l
・GStreamer Core Library version 1.23.0.1
・x86_64 ガレリアの普通のPC
・入力映像：Webカメラ `640x360` 


# 結論
下記では改行を入れていますが、実際には改行を入れずに1行で書いてください
```sh:command
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! queue ! 
vp8enc ! queue ! mux.video_0 
pulsesrc device=(your device name) ! audioconvert ! queue ! 
vorbisenc ! queue ! mux.audio_0 
webmmux name=mux ! filesink location=test_vp9.webm
```
`(your device name)`については
`gst-device-monitor-1.0`で使用中のデバイスを探索し
`class : Audio/Source`のそれっぽいのを見つける。私の環境では下記を見つけました
`gst-launch-1.0 pulsesrc device=alsa_input.pci-0000_0a_00.3.analog-stereo ! ...
`
# 結果
10秒ほどの動画の、映像と音声あるやつが観測できました
バッファローの400円のマイクロフォンなので音質がアレだった

# おわりに
クラウドへのリアルタイム配信、同時にUSBメモリやSDカードに保存、という使い方もできそう

# ちなみに
Webカメラの入力を`640x360 => fullHD`
それか`vp8enc => vp9enc`に変更すると

`Dropped 106281 samples. This is most likely because downstream can't keep up and is consuming samples too slowly.`

などとコンソールに表示が出現。保存した映像はガタついたり音が途切れたり
`x264enc`で言うところの`tune=zerolatency`もなさそうなので、対応むずそう
久しぶりにGNS3（その30：Appleシリコン）

# AppleシリコンでのGNS3利用
Apple(Mac)シリコンでGNS3を使えるようにする、ただそれだけのメモ＋α。

## 設定
下記リンクから必要なものをダウンロード。
- [GNS3/gns3-gui](https://github.com/GNS3/gns3-gui/releases)

シリコンなので、ARM版GNS3 VMが必要。本VMを動作させるため、個人利用ライセンスで、VMware Fusionを利用する。
- [VMware Fusion Player – Personal Use License](https://customerconnect.vmware.com/en/evalcenter?p=fusion-player-personal-13)

### GNS3での設定
今までの経験から、設定にて、GNS3 VMを選ぶだけかと思ったが、下記のように何も表示されず。
![VMが選択できないのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/25845b0a-876c-609d-3b78-498c30a74ce2.png)
調べると、下記リンク先に情報あり。「Remote Main Server」として、起動しているGNS3 VMを指定すると、実現できることがわかった。
- [How to install GNS3 VM on a Mac Apple Silicon M1, M2 or M3?](https://www.dir-tech.com/en/how-to-install-gns3-vm-on-a-mac-apple-silicon-m1-m2-or-m3/#Step_1_Download_VMWare_Fusion)

まず、Vmwareにて、GNS3 VMを起動する。
![GNS3VMのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/9e9150f0-7cc1-6c54-cbbe-dac60b52a40e.png)
IPアドレスとポート番号とを記録。次に設定画面へ。
![Preferences1のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6adbe1cc-57a3-187d-0a09-4680845ba672.png)
- ”Enable local server”のチェックを外す
- ”Remote main server”に、VMのIPアドレスおよびポート番号、認証情報（ID:gns3, Password:gns3）を入力

これにより、設定完了。起動すると下記のようになった。”Main server”と見える。
![画面のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/f5c86c71-1192-1d54-802d-bc0161680172.png)
ただし、GNS3起動前に、GNS VMを起動しておく必要がある。

なお、今までのGNS3 VM利用時の起動状況は下記となっている。
![VMが見えるのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b01ec1dd-7967-f60a-bb68-f9e285cc0ee6.png)
こちらは、”GNS3 VM”が明確に見える。

## おまけ
GNS3からWiresharkを利用することがあるため、Wiresharkもインストール。起動すると、下記エラーメッセージが表示。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/a16c3fe7-3d35-7833-5f98-450c9425e1d7.png", width=70%>
ChmodBPFをインストールする必要があるとのこと。
![Install ChmodBPFのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5b33ba51-8cee-9680-15e8-c7f0bd62b4ba.png)
これにより、完了。

EOF
【JollyUI】shadcn/uiと互換性のある次世代コンポーネントライブラリ

## 概要

`JollyUI` は、`shadcn/ui` と互換性のある次世代コンポーネントライブラリです。`shadcn/ui` と同様に、開発者は `npm` を介さずに自らのプロジェクトに直接組み込むことで、高度なカスタマイズ性を享受できます。ただし、現時点では `JollyUI` のコンポーネント数は `shadcn/ui` に及ばないため、完全な互換性にはまだ至っていません。

しかし、`JollyUI` には `shadcn/ui` より魅力的な特徴があります。`shadcn/ui` が内部で使用しているヘッドレスUIライブラリ `Radix UI` に対して、`JollyUI` は `Adobe` によって開発された `React Aria` を採用しています。`Adobe` の豊富な国際化とデジタルアクセシビリティに関する専門知識は、`React Aria` の設計に深く反映されています。これにより、`React Aria` は国際化（`i18n`）、アクセシビリティ、そして提供されるコンポーネントの豊富さにおいて `Radix UI` よりも優れてます。  

国際化（`i18n`）とアクセシビリティに関する具体例を挙げると、`JollyUI` と `shadcn/ui` の `Date Picker` コンポーネントを比較した場合、`JollyUI` はデフォルトで複数の言語に対応しており、日本語を含む多言語サポートが実現されてると分かります。また、`JollyUI` の `Date Picker` コンポーネントは `shadcn/ui` よりも日付を視認しやすいと分かります。

`shadcn/ui` の人気が先行しており、既に `GitHub` のスター数にも大きな差がありますが、`JollyUI` の今後に乞うご期待ですね！⭐

## 参照

https://www.jollyui.dev/

https://ui.shadcn.com/

自らの備忘録のために投稿してますが、なにかお役に立てましたら幸いです！:clap:
また、なにか間違ってましたらご指摘いただけますと幸いです！:pray:
【感想文】スッキリわかるSQL入門を読んで

# はじめに

スッキリわかるSQL入門を読みましたので、感想をまとめました。

# 学んだこと
- DBとは何か（DBMS、基本的にはRDBMSが主流となっており、本書で取り扱っているDBもRDBMSを例にして説明されている）
- Select,Insert,Update,Deleteの処理について
- `ANY`演算子、`ALL`演算子について（`in`句を利用する際の条件指定で利用する）
→サブクエリと合わせて使うことが多く、単体では`in`や`<>`で代用できるためあまり使われない
- 主キーに対して自然キー、人工キー、代替キーといった呼び方をすること

- 算術演算子`||`で文字列が連結できること（`+`の場合もある）
- SQLでCASE文が使える
- coalesce関数（nullの代替で利用できる）

## 良かったところ
### DBがわからない初心者に対してもわかりやすく学習できるように構成されているところ
  - 初心者向けに基礎からわかりやすく解説されており、
  DBとは何か、どのような構成となっているか、が
  簡潔に示されているところから、DBに対しての概念を簡単に理解しつつ
  SQLについて学んでいける点がとても良いと感じた。

### 単純に技術に対する説明だけでないところ
- 複数条件を付与するクエリに対して改行をした方が可読性が上がる、など
  ワンポイント的な説明が含まれている部分は実務などでも活かせる部分だと感じた。
  (確かに長くなりがちなクエリだと改行なしで書くと見づらくて仕方ない)

### 必ず学習した後に学んだことを確認できる練習問題が複数用意されているところ
- 付録として練習問題も用意されているのでより理解を深めることができると感じた。

### 実行するSQL文がどのようにして行われているのかが説明されているところ
  - `Group by`であれば、`where`で絞り込みを行った後、検索結果をグループ化して・・・など。
  この説明があることによって、whereとhavingの違いについては理解しやすくなっていると思います。

## 難しかったところ
- 基本的な構文〜サブクエリまでは業務である程度利用していて馴染みもあり、内容に関して理解が難しいと感じるところはあまりなかったです。しかしACID特性や設計に関しては、自分自身の理解や考え方がまだまだ浅いため、うまく使いこなしていくには本を読んだだけでは難しいと感じました。

## 最後に
  実際に業務の中で欲しいデータをどのように抽出するか、データに落とし込んでいくためにどのように設計していくかなどを考えていくと、学んだことを複数組み合わせて実現していかないとならないので、
  その部分をどのように考えていくかはもっと勉強してく必要があると感じました。

  今後も引き続き勉強していきます。
よく見るSnowflakeってどんなサービスなのか

よくsnowflakeというツールを見るけれども、これはどんなサービスなのか知りたかったので調べてみた。個人理解メモ用で、理解度はとっても浅いので注意が必要。

## サービス概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/7b16be4d-dedc-6fa7-f482-7f0100c79f38.png)
https://enterprise-aiiot.nttdata.com/service/snowflake

- 大手製造業などサプライチェーンが一つのエコシステムを形成している大手向けにデータの統合、単一のフルマネージド型マルチクラウドプラットフォームを提供している模様

> Fortune 100企業であるHoneywellは、Snowflakeの製造向けデータクラウドを使用してすべての企業データを保存し、分析しています。これにより同社は、サプライチェーンを最適化し、世界中の350万のSKUを対象に動的な価格設定を実現しています。

[新しいSnowflakeの製造向けデータクラウドでビジネス価値を引き出す](https://www.snowflake.com/blog/unlock-business-value-manufacturing-data-cloud/?lang=ja)より引用



## Snowflake企業概要

:::note info
Snowflake Inc.は、米国および海外で、クラウドベースのデータプラットフォームを提供しています。同社のプラットフォームはData Cloudを提供しており、顧客はデータを単一の真実の源に統合して、有意義なビジネス洞察を促進し、データ駆動型アプリケーションを構築し、データを共有することができます。同社のプラットフォームは、さまざまな業界のさまざまな規模の組織で利用されています。同社は、以前はSnowflake Computing, Inc.として知られていましたが、2019年4月にSnowflake Inc.に社名を変更しました。Snowflake Inc.は2012年に法人化され、モンタナ州ボーズマンに本社を構えています。
https://www.buffett-code.com/company/us/0001640147/
:::



## スキルとしてのSnowflake

求人が結構多い。スキルとして需要がある。snowflakeの実務経験はフリーランスの単価が高く、スキルとして需要があるため、磨いておいて損はなさそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/33746732-e710-b862-8a5b-da875fa78f0f.png)
https://www.bigdata-navi.com/aidrops/6466/


## エンジニアとしてsnowflakeの使い方（例）

- ほんの一例ですが、pythonを用いてこういう使い方ができるらしい。

https://zenn.dev/dataheroes/articles/4d35c4e85a2cfb
git commit を実行したら「Author identity unknown」のエラーが出たときの対処法

## git commit を実行したら「Author identity unknown」と怒られた時の対処法
### はじめに
Gitをインストールした！コミットまでしてみよう！の段階でエラーが...。
無事に対処できたので未来の自分のためにメモとして残しておいてあげます。
あくまで自分用ですが誰かの参考になればちょっとだけ嬉しいかも。

### 実行文
```
git commit -m "add new file"
```

### エラー文
```
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.
```
:::note warn
###### エラーの意味はこんな感じ
あなたは誰ですか？
メールアドレスとユーザーネームを設定してね。
:::

### 対処法
上記のように聞かれているため、以下のコマンドを実行！
```
git config --global user.email "メールアドレス"
git config --global user.name "ユーザーネーム"
```
:::note info
git config コマンドを使用してメールアドレスとユーザーネームを設定しています。
:::
これでOK。
再度コミットしてみると上手くいきました！良かった～♪

### 最後に
初めて記事を書いてみました。
これからも自分が困って調査したことを書いてみようかな。
頑張れ新人エンジニアの自分。
BIG-IPの設定変更時に便利なサイト

##BIG-IPの設定変更のときによく利用するサイト

https://www.infraexpert.com/infra/bigip41.html

https://hirotanoblog.com/bigip-cli/9806/


##お腹がすいたときに利用するサイト
https://www.hotpepper.jp/gstr00001/

##髪の毛が気になったときに利用するサイト
https://real-life2024.site/minokirank/
Nuxt3をBunでインストールする手順＆知っておきたいこと

## はじめに
Nuxt3をBunでインストールしているうちに、bun.lockbについて気になったので調べた。

## インストール手順（公式にだいたい書いてる）

- **Nodeのversion確認**
    `v18.0.0 or newer`と書いていた。古かったら18以上に切り替えておくこと。
    <br>
- **コマンド実行（`test`はプロジェクト名）**
    ```bash
    bunx nuxi@latest init test
    ```
    <br>
- **パッケージマネージャの選択**

    `Which package manager would you like to use?` と聞かれるので、`bun` を選択。
    勝手に`bun install`が始まる。超速い。
    <br>
- **Gitリポジトリの初期化**

    `Initialize git repository?` と聞かれる。すでにGitが初期化済みの場合は `No` を選択し、そうでなければ `Yes` を選択。
:::note warn
Noを選ぶ場合、ディレクトリの階層ズレに気をつけてください。
:::
    
- **サーバーの起動**

    `Nuxt project has been created with the v3 template. Next steps` と言われる。指示通り作ったプロジェクトに移動して、サーバーが起動できたら完了。
    ```bash
    cd test
    ```
    
    ```bash
    bun run dev -o
    ```
![スクリーンショット 2024-03-16 20.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/fc37f629-1bc2-a4d7-8ab4-808f0731ca26.png)

## 知っておきたいこと
- bun.lockbについて
bunの場合、速度重視でlockファイルをバイナリにしているので、VSCodeだと見ることができない。

    ![スクリーンショット 2024-03-16 20.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3736578/91b6935c-2bf2-545e-607f-47335c41d99d.png)

    一応、以下のコマンドを実行することで、中身を見ることができる。

    ```bash
    bun bun.lockb
    ```

    ターミナルで出力すると見づらいから嫌だという人は、以下のコマンドでyarn.lockを出力すればよい。
    ```bash
    bun install -y
    ```
    <br>
- なぜ`bun.lockb`の中身を確認する必要があるのか？
    もしなんらかの理由でpackage.jsonとの不整合が起こったらバグるから

    >セキュリティ考えると、多分yarn.lockだけを見て判断しちゃダメで、bun.lockbとyarn.lockが一致するかの確認もするのが良いと思われる。

    以下のようにGithub Actionsなどで管理しておくとよいらしい。

    >run:  diff <(bun bun.lockb) yarn.lock

## 終わりに

AI時代だからこそ、「なんかわからんが動いてる」をなくしていきたい。

## 参考記事

https://nuxt.com/docs/getting-started/installation

https://bun.sh/docs/install/lockfile

https://zenn.dev/watany/articles/e21a54cf3d56d8
[Vim初心者] マウスでの作業を最小限にする

# 1. Overview
今までトラックパッドを用いて作業をしているのですが、キーボードだけの操作に憧れを抱きました。
そこで、この記事では可能な限り、プログラミングの際に必要な操作を全てキーボード上で完結するような状態を目指したいと思います。

私と同じような Vimの初心者の方やVimを使ってみたいという方の助けになればと存じます。

制約としては、MacOSを用いて Chromeの拡張機能が使用できるブラウザ および　VS Code を使うこととしています。

# 2. Strategy
全ての操作をキーボード上で完結させるための私の戦略(*)を説明します。

コードの編集は [VSCodeVim/Vim: :star: Vim for Visual Studio Code](https://github.com/VSCodeVim/Vim) で行います。ただ、Vimの範疇を超えてファイルの移動をする必要があるため、その場合は可能な限りVSCode上のshortcutを利用します。
また、コーディングをする際にWeb Browserで調べ物をするため、VS CodeとBrowser間の移動やブラウザ内でのshortcutやvim（[philc/vimium: The hacker's browser.](https://github.com/philc/vimium)）を使用します。

（*: こちらの戦略はVim初心者の私が考えたため、最適な戦略ではない可能性があります）

# 3. Detail

## 3.1. Move Between Applications
BrowserとVS Codeを簡単に行き来する方法についてまとめます。
### 3.1.1. MacOS
| コマンド | 説明 | 
|:--:|:--:|
| Cmd + tab | [Macでアプリウインドウを移動する/整理する - Apple サポート (日本)](https://support.apple.com/ja-jp/guide/mac-help/mchlp2469/mac) |

## 3.2. Shortcut on VS Code
VS Codeを扱う上でのShortcutをまとめました。その際にアプリ間の移動のコマンドと競合しないように気をつけます。
### 3.2.1. MacOS
よく使用するショートカットをまとめました。
設定方法はこちらを参考にしてください: [Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/getstarted/keybindings)

コマンドについては、多少、私独自にカスタムをしているため、参考程度に確認をしてください。

| コマンド | 説明 | command ID |
|:--:|:--:|:--:|
| Cmd + t | ターミナルを開く/閉じる | workbench.action.togglePanel |
| Cmd + (j/k) | EditorとTerminalの行き来 | workbench.action.terminal.focus / workbench.action.focusActiveEditorGroup |
| Cmd + (l/h) or  | Editorのタブの移動（右/左） | workbench.action.nextEditor / workbench.action.previousEditor |
| （不明） | VS Codeのターミナルのタブ移動 | （不明） |
| Cmd + e （？） | 現在作業中のフォルダからファイルを探し開く方法 | workbench.view.explorer + （？） |
| Cmd + p | 過去に開いたもの中から探す | workbench.action.quickOpenSelectPrevious |
| Cmd + x | ファイルを閉じる | workbench.action.closeActiveEditor |
| Cmd + , | 設定を開く | workbench.action.openSettings |
| Cmd + s → Cmd + c | Shortcut設定を開く | workbench.action.openGlobalKeybindings | 

## 3.3. Vim on VS Code
[VSCodeVim/Vim: :star: Vim for Visual Studio Code](https://github.com/VSCodeVim/Vim) を用いて、VS Code上でVimを利用します。

私は今までVimを利用していなかったため、詳細なコマンドについては割愛させていただき、おすすめの記事や動画を紹介させていただきます。
- [Vimの基本的なコマンド](https://zenn.dev/masatotezuka/articles/vim_command_220225)
- [【Vim入門Vol.1】これを覚えるだけで入門できる！Vimの使い方超入門 - YouTube](https://www.youtube.com/watch?v=UP0oV_1Q0Q8)
- [よく使う Vim のコマンドまとめ #Vim - Qiita](https://qiita.com/hide/items/5bfe5b322872c61a6896)

## 3.4. Shortcut & Vim on Browser
Chromの拡張機能のVimiumを利用します。また、既存のshortcutも利用しますが、詳細については公式ドキュメントを参考にしてください。
- vimiumについて: [vimium/README.md at master · philc/vimium](https://github.com/philc/vimium/blob/master/README.md#keyboard-bindings)
- Chromeに最初から搭載されてるshortcutについて: [Chrome keyboard shortcuts - Computer - Google Chrome Help](https://support.google.com/chrome/answer/157179?hl=en)

# 4. Summary

以上の戦略をもって快適なVimライフを楽しみたいと思います！

知見が溜まりましたら、随時こちらの記事を更新させていただきます。
実務経験1年半のエンジニアが転職ドラフトで転職先を見つけた話

## はじめに
実務経験1年半で自社開発企業から内定をいただくことができました。
実際に転職ドラフトを使ってみて感じたことをまとめます。

この記事は転職ドラフト体験談投稿キャンペーンに参加しています。
https://job-draft.jp/articles/251

**転職ドラフトを使ってみようと思っている方へ**
登録時に友達紹介コード「**XDWD**」を入力し、レジュメの審査を通過してドラフトに参加すると、以下から好きなもの1点がもらえます（2024年3月16日現在）。よろしければ使ってみてください！
- お好きなO’REILLY JAPANの本1冊（税込5500円以内）
- ACTUSギフトカタログ Straw（ストロー）
- Amazonギフト券 3000円分（Eメールタイプ）

## 登録・参加したきっかけ
転職ドラフトに登録・参加した理由は2つあります。
1つ目は、レジュメをレビューしてもらえる点です。
エンジニアとしての1年半の経験を振り返りつつ、自己分析やアピールポイントの整理ができていないことに気付きました。
転職ドラフトでは、キャリアの棚卸しをしてこんな感じで書くと良いよという指針を用意してくれているので、スムーズにレジュメを書くことができました。
https://job-draft.jp/articles/443

2つ目は、自分のスキルや経験が他の企業でどのように評価されるのか知りたかったからです。
今までやってきたことが、他の企業でも評価されることなのか、それとも評価されないことなのかを知ることで、将来のキャリアプランを考える上で有益な情報が得られると考えました。

## 参加時の経歴
- 年齢: 20代中盤
- エンジニア歴: 1年半
- 技術スタック: Ruby on Rails
- ロール: メンバー(リーダー経験なし)

## ドラフト結果
数回ドラフトに参加しましたが、転職先を見つけた時のドラフト結果はこんな感じでした。
指名: 2社
内定: 1社
見送り: 1社

## 転職ドラフトを使って良かったこと
転職ドラフトを使って良かったことは3つあります。

1. レジュメをレビューしてくれる
やはりレジュメを客観的に見てもらえるのはとてもありがたいですね。
レビューがとても手厚く、ちゃんと読んで精査してくれているんだなと感じました。
ドラフトに参加しなくても、レジュメをレビューしてもらうだけでも価値があると思います

2. 指名理由が記載されている
指名をいただくときに、企業が自分の何を評価したのか、入社後何を求めているのかを書いてくれています。（自分のやってきたことが評価されるのは素直に嬉しいですね)	
そのため、ご縁あって入社した後、思っていたのと違う！となることは少ないのかなと思います。

3. 年収アップ!!
年収が1.5倍になりました。
数回ドラフトに参加しましたが、指名をいただくときはほぼ年収の1.5倍の年収を提示していただきました。（希望年収は入力していませんでした）

## まとめ
転職ドラフトを利用することで、自身の市場価値や評価ポイントを把握することができました。
また、1.5倍の年収で指名がきた時や、有名なあの企業から指名が入った時は「え！？本当に！？」と驚きました。

すぐの転職を考えていなくても、レジュメをレビューしてもらえるだけでとても価値のあることだと思うので、ぜひ登録してみてはいかがでしょうか。