OmniAICreator/Qiita-1.07M huggingface dataset:
Ethnic wear in jaipur 

Discover the Timeless Elegance of Ethnic Wear in Jaipur
Jaipur, known as the Pink City, is not only famous for its majestic palaces and vibrant culture but also for its exquisite ethnic wear. Aaronee.com brings you a curated collection of traditional attire that beautifully captures the essence of Jaipur’s rich heritage.

Embrace the Heritage with Traditional Outfits
Ethnic wear in Jaipur is synonymous with elegance and tradition. At Aaronee, we offer a wide range of traditional outfits that include sarees, lehengas, and salwar suits. Each piece is meticulously crafted to reflect the city’s unique cultural identity.

Intricate Craftsmanship and Luxurious Fabrics
Our collection features garments adorned with intricate embroidery, mirror work, and hand block prints. These techniques, passed down through generations, are a testament to the skilled artisans of Jaipur. We use the finest fabrics, ensuring that each outfit not only looks stunning but feels comfortable to wear.

Perfect Attire for Every Occasion
Whether you’re attending a wedding, festival, or any special event, our ethnic wear collection has something for every occasion. From the vibrant colors of Rajasthani sarees to the regal appeal of lehengas, you’ll find the perfect outfit to make a lasting impression.

A Blend of Tradition and Modernity
At Aaronee, we understand the importance of blending traditional designs with contemporary styles. Our collection strikes the perfect balance, offering modern silhouettes with traditional embellishments. This fusion ensures that our ethnic wear appeals to women of all ages and preferences.

Celebrate Your Unique Style
Every woman has her unique style, and our aim is to celebrate it. With our diverse range of ethnic wear, you can express your individuality while embracing the rich traditions of Jaipur. Explore our collection and find the perfect outfit that resonates with your personal style.

Conclusion
Experience the timeless charm of Jaipur’s ethnic wear at Aaronee.com. Our carefully selected collection of traditional attire is designed to make you feel elegant and confident. Visit our website today and discover the beauty of ethnic wear that embodies the spirit of Jaipur.

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801866/3b064d72-293e-021a-d641-9191c8462bed.png)
小テスト-ランダム

```
function createQuizForm_r() {
  var spreadsheetId = '';
  var sheetName = '';
  var folderId = ''; 

  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  var data = sheet.getDataRange().getValues();

  // 1行目（ヘッダー）を除くデータを取得
  var questionsData = data.slice(1);

  // データをランダムに並び替える
  questionsData = shuffleArray(questionsData);

  var form = FormApp.create('小テスト');

  form.setIsQuiz(true);

  for (var i = 0; i < questionsData.length; i++){
    var question = questionsData[i][0];
    var choices = [questionsData[i][1], questionsData[i][2], questionsData[i][3], questionsData[i][4]];
    var correctAnswer = questionsData[i][5];
    var points = questionsData[i][6];  // G列の配点を取得

    if (question === '' || question === undefined) {
      continue;
    }
    
    if (correctAnswer === '' || correctAnswer === undefined) {
      continue;
    }

    var item = form.addMultipleChoiceItem();
    item.setTitle(question.toString());

    // 選択肢をランダムに並び替え
    choices = shuffleArray(choices);

    var uniqueChoices = [];
    var choiceValues = {}; // 各質問ごとに選択肢の一意性を確認するためにリセット
    for (var j = 0; j < choices.length; j++) {
      var choice = choices[j];
      if (choice !== '' && choice !== undefined && !choiceValues[choice]) {
        uniqueChoices.push(choice);
        choiceValues[choice] = true;
      }
    }

    if (uniqueChoices.length < 2) {
      continue;
    }

    var choiceObjects = uniqueChoices.map(function(choice){
      return item.createChoice(choice.toString(), choice === correctAnswer);
    });

    item.setChoices(choiceObjects)
        .setRequired(true)
        .setPoints(points || 1);  // G列の配点を設定、デフォルトは1点
  }

  // 作成したフォームを指定のフォルダに移動
  var file = DriveApp.getFileById(form.getId());
  var folder = DriveApp.getFolderById(folderId);
  folder.addFile(file);
  DriveApp.getRootFolder().removeFile(file); // ルートフォルダから削除
}

function shuffleArray(array) {
  for (var i = array.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}

function onOpen(){
  SpreadsheetApp
    .getActiveSpreadsheet()
    .addMenu('追加メニュー', [
      {name: '小テスト作成', functionName: 'createQuizForm'}
    ]);
}
小テスト作成-出題順

```
function createQuizForm_n() {
  var spreadsheetId = '';
  var sheetName = '';
  var folderId = ''; 

  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  var data = sheet.getDataRange().getValues();

  // 1行目（ヘッダー）を除くデータを取得
  var questionsData = data.slice(1);

  var form = FormApp.create('小テスト');

  form.setIsQuiz(true);

  for (var i = 0; i < questionsData.length; i++){
    var question = questionsData[i][0];
    var choices = [questionsData[i][1], questionsData[i][2], questionsData[i][3], questionsData[i][4]];
    var correctAnswer = questionsData[i][5];
    var points = questionsData[i][6];  // G列の配点を取得

    if (question === '' || question === undefined) {
      continue;
    }
    
    if (correctAnswer === '' || correctAnswer === undefined) {
      continue;
    }

    var item = form.addMultipleChoiceItem();
    item.setTitle(question.toString());

    // 選択肢をランダムに並び替え
    choices = shuffleArray(choices);

    var uniqueChoices = [];
    var choiceValues = {}; // 各質問ごとに選択肢の一意性を確認するためにリセット
    for (var j = 0; j < choices.length; j++) {
      var choice = choices[j];
      if (choice !== '' && choice !== undefined && !choiceValues[choice]) {
        uniqueChoices.push(choice);
        choiceValues[choice] = true;
      }
    }

    if (uniqueChoices.length < 2) {
      continue;
    }

    var choiceObjects = uniqueChoices.map(function(choice){
      return item.createChoice(choice.toString(), choice === correctAnswer);
    });

    item.setChoices(choiceObjects)
        .setRequired(true)
        .setPoints(points || 1);  // G列の配点を設定、デフォルトは1点
  }

  // 作成したフォームを指定のフォルダに移動
  var file = DriveApp.getFileById(form.getId());
  var folder = DriveApp.getFolderById(folderId);
  folder.addFile(file);
  DriveApp.getRootFolder().removeFile(file); // ルートフォルダから削除
}

function shuffleArray(array) {
  for (var i = array.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  return array;
}

function onOpen(){
  SpreadsheetApp
    .getActiveSpreadsheet()
    .addMenu('追加メニュー', [
      {name: '小テスト作成', functionName: 'createQuizForm'}
    ]);
}
TypeScriptのリストはスプレッド構文(...)を使おう

## はじめに
リストを作成する方法としてスプレッド構文が便利だった

## 実際に使ってみる
普通にリストにpushする
```
const list = ['要素1', '要素2']
const updateList = prefectureValue.push('後から追加したい要素')
```
これでもいいが、他でもlistを使っている場合に追加した要素が原因で意図しない挙動をすることもある


**スプレッド構文を使うと便利**
元のリストに影響を与えず、新しいリストを作れます。
```
const updateList2 = [...list, '後から追加したい要素']
```
要素の一番最初に追加したいときは以下
```
const updateList3 = ['後から追加したい要素', ...list]
```

## 終わりに
元のリストに影響を与えず、新しくリストを作成したい時はスプレッド構文を使うのが簡単で良いのではないでしょうか
【超初心者用】役立ち資料まとめ～開発編～

自分用役立ちリンク集にしていきます。


## デジタル庁

国の基準は間違いない！

https://www.digital.go.jp/resources

[ダッシュボードデザインの実践ガイドブック](https://www.digital.go.jp/resources/dashboard-guidebook "ダッシュボードデザインの実践ガイドブック")

の中の、
- 要件定義ワークシート
は特によさそう

> ・Why, so What：論理的な強度をあげるフレームワーク
>・5W1H：Who（誰が）、When（いつ）、Where（どこで）、What（何を）、Why（なぜ）、How（どのように）

これらを意識したドキュメント作成に役立つ。
### 要件定義

https://www.meti.go.jp/meti_lib/report/2022FY/000249.pdf

提案時、参考にしたい

### デザインシステム

https://design.digital.go.jp/

ウェブアクセシビリティ、UIなど。
サービス・アプリを開発する時の「見た目」に関する様々な情報。

## エンジニア向け研修資料

https://qiita.com/nucomiya/items/29965f1915436f2cfc79
こちらのまとめ記事より、今の自分に必要そうなものを抜粋しました


**サイボウズ**

https://blog.cybozu.io/entry/2023/07/14/170000

**WILLGATE**

https://tech.willgate.co.jp/entry/2024/04/01/184252

## 全般
基本中の基本でも、ドキュメント作成時は常にこころがけたい

https://speakerdeck.com/naohiro_nakata/technicalwriting2023

* * *
:point_up_tone4:随時更新します
クライアントも含めたオープンな場で議論することへの抵抗感

こんにちは。Kaneyasuです。

本記事は私が日々プロジェクトマネージャーやスクラムマスターとして開発チームの雰囲気を変えるのに苦労していることの一つを書きます。
前提として、プロジェクトはクライアントと共有しているチケット管理ツールと、開発チーム内のチャットシステムを採用していると想定してください。

# クライアントも含めたオープンな場で議論することへの抵抗感

開発者、特にSIer出身のメンバーの方には、チケット上（＝クライアントが見えるところ）で議論することに抵抗感を持っている方がいらっしゃいます。
開発チーム内での議論はMTGやチャット上で行われているので、実装方法などを決めることには問題ありません。
ですがクライアントとの調整が必要な議題になると、開発チーム内での議論の後にクライアントとのやり取りの時間が別枠で発生してしまい、大変効率が悪くなります。
また、チャットはフロー型のコミュニケーションツールであるため、議論自体が流れてしまうデメリットもあります。

このことについて、メンバーに改善を促すのですが、多くの場合は改善に時間がかかります。
私の経験に基づく推測になりますが、SIerの方は結論を固めてからクライアントに提案されるよう教育されているからだと思っています。
私も昔はSIerでしたが、できる限り結論を先に、質問するならYES・NOで答えられるような質問にするよう教育されていました。
昔は私も議論をクライアントが見えるところでするという発想はなかったですね。

私自身は過去のプロジェクトで追い込まれた時に、運良く固定観念を捨てることができましたが、
多くの人にとって今まで教えられたことというのは、簡単に捨てられるものではないと思います。

# 改善の道のり

チケット上で議論することへの抵抗感について、考えられる改善策を書いてみます。

## クライアントがいる場で宣言する

まずはクライアントを含めた全員がいる場で、クライアントも含めたオープンな場で議論することに価値があることを宣言するのが第一歩だと思います。
スクラムイベントで言うとレトロスペクティブが良い場所だと思います。

全員がいる場で宣言するのは、プロジェクトマネージャーやスクラムマスターがOKと言っていても、クライアントがOKと言ってるのを直接耳にしなければ不安感は拭えないからです。
なんたって、チケットに書かれた内容はクライアントにも見えるわけですから。
オープンな場で議論することは、クライアントに悪印象を与えることはなく、むしろ課題を早期に共有できて良いと伝えることも重要でしょう。

## とはいえ、当面はチャット上での議論を許容する

とはいえ、頭では理解しても心はすぐにはついてきません。
当面はチャット上での議論を許容した方がよいでしょう。
世の中にはまだまだダイレクトメッセージで相談を持ちかけてくる方もいるぐらいですから、ゆっくり行きましょう。

ところで、なぜチャット上でのやり取りならまだ抵抗感が低いのでしょうか？
もちろんチャットはまだクライアントが見えるところではないというのはありますが、チャットツールは一般的にチケット管理ツールよりリアクション機能などが豊富なので、言葉のニュアンスを伝えやすいという利点があるからだと思います。
文章だけでニュアンスを伝えながら議論を進めるのは技術が必要なので、その自信がつくまで信じて見守るのがよいでしょう。

## 結論をどこかに書くか書かないか

SIerの場合、課題についての議論は結果をいわゆる課題表や設計書にまとめることが多いです。
一方で、チケット上だと議論そのものが結論になることがあります。
どちらが良いかはプロジェクトとチームによりますが、オープンな場で議論することを重視するのであれば、一旦は慣れない人にとって抵抗感を減らすのを重視した選択をした方がよいでしょう。

個人的には、時間が経つと議論を追うのが大変になるので、結論はどこかにチケット上部か別途ページを作ってまとめるのが良いと思います。

# 最後に

コミュニケーションの抵抗感を拭うのは簡単なことではないので、メンバーの気持ちに寄り添いながらゆっくりと進めることが大切だと思います。
新卒2年目エンジニアの成長記録: React学習4か月目

# はじめに
最初に改めてざっくりと自己紹介をさせていただきます。
新卒2年目エンジニアのA.Kと申します。
現在は運用保守の案件に参画しておりますが、フロントエンドの開発案件を希望しているため、**個人でReact、TypeScriptを使ってアプリを作成しています。**
毎月まとめや振り返りを兼ねてこのような記事を書いています。


先月の状況はこちらです！

https://qiita.com/AK_React/items/f3022207d00fe28c37fe
# 学習4カ月目にやったこと


<font color="Red">**１．Yamada UIを使ってミニアプリ（一言日記アプリ）作成**</font>

**これまでUIは最低限の実装**（あくまでもReact学習がメインのため）で、特にこだわりもなくChakura UIを利用してきました。
ですが、とある日のSE交流会にてYamada UI開発者の山田さんとお話しする機会があり、興味を持って使ってみたというのがきっかけです。
**やってみてすごく楽しかったですし、実際に手を動かして新しい技術に触れると、その特徴がわかりやすいと思います！**
**デザインやCSS周りの学習はこれまでほぼノータッチだったので、もっと使いこなせるようになりたい**と思いました。

https://qiita.com/AK_React/items/078c953412122b872c72

***
<font color="Red">**２．フィットネス系のアプリ作成**</font>

私は筋トレが大好きで、**いつか筋トレ関連のサービスをリリースしたい！**　と思っていました。学習4カ月目に突入して手を動かすことにも慣れてきた段階で、念願のスタートを切り、現在アプリ作成中になります。
**正直完成形のイメージが固まりきっていないので、最低限の機能実装→リリースを繰り返しながら、不足しているものを付け足していく感覚でブラッシュアップ**しています。

**ゼロから自分で必要な機能を考えて、実装して・・みたいな経験は今回が初めてなのですが、自分にとって興味関心のある分野なのでめちゃくちゃ楽しい**です。

完成は9月～10月を予定しています。また記事にしたいと思います！

***
※なお参考までに、学習開始～4カ月は以下の流れで学習を進めていました。

JavaScript・TypeScript・React基礎学習（Udemyインプット）
↓
JavaScript×Reactで学習記録アプリ作成
↓
TypeScript×Reactで学習記録アプリ作成
（JavaScriptで作成したアプリをTypeScriptでリファクタリング）


# 学習4カ月目に意識していること

<font color="Red">**１．学習の軸をぶらさない**</font>

**学習当初からアウトプットに重きを置いた学習スタイルを貫いています。**
これまでの期間で「手を止めてドキュメントを読み漁る・過去に書いたコードを復習がてら読む」といった**インプット的な学習も少しだけ試したことがありますが、私の場合はなかなか頭に入らず、時間を浪費しがち**　でした。

なので私の場合は（個人差あるかもですが）
**手を動かしながら不足している知識を補っていく、「動きながら考える」スタイルを継続しています。**
自分に合ったスタイルが早い段階で見つかると良いですね～！

***
<font color="Red">**２．新しい技術に触れるときは遊び感覚で**</font>

**ここ最近になって、やっと手を動かすことが純粋に楽しいと思えるようになりました・・！**
「勉強しなきゃ。。やらなきゃ。。」と必要性に駆られて学習していた時期より**今の方がストレスフリーですし、学習速度が上がりました。**
前述した「Yamada UIを使ってミニアプリ作成」みたいに、**「新しいライブラリを試してみるときは小さいアプリつくって試しちゃおう！」** くらいのフットワークの軽さでいたいと思います。

***
<font color="Red">**３．ライフスタイルに合わせて柔軟に学習時間を調整する**</font>

**最近、現場の稼働時間が1日12時間の生活が続いていますが、毎日学習を継続することができています。**
なぜかというと、**「1日〇時間は絶対に勉強する！」みたいなノルマを取り払って、「10分あるからテスト1個だけ書くか」といった具合で、その日の忙しさに合わせて柔軟に学習時間や内容を調整しています。**
前者のようなノルマ設定もすごく大切ですが、忙しいときはプレッシャーになって逆に何もできなくなってしまうことがあります。
なので **「自分の生活スタイルに学習を織り込んでいく」感覚で結果的に学習の継続を可能にしています。**

# おわりに
以上、React学習4か月目の振り返りでした。
春～夏にかけての季節って謎に忙しくなりがちで、かつ体調管理も難しいですよね。
そんな中でも **「ちょっと勉強やってみるか。。」と思ってもらえるように記事を書きました。**
みなさんの励みになれば幸いです！
# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからライン登録お願いします👇

https://projisou.jp
JavaScript プログラミング言語の機能、メリット、デメリット

JavaScript プログラミング言語の機能、メリット、デメリット

JavaScript は、Web サイト開発に使用されるプログラミング言語またはスクリプト言語です。これは、Web サイトをよりダイナミックでインタラクティブにすることを目的としています。つまり、このプログラミング言語はユーザーの Web ページの機能を向上させます。

パフォーマンスが向上するだけでなく、開発者は通常、Web 上でアプリケーション、ツール、さらにはゲームを作成するために Javascript を使用します。ユーザーは動的に更新されるコンテンツを作成することもできます。: https://github.com/ghadee-lah-nma-2024-hla-nma

ユーザーが自分の Web サイトで新しいイノベーションを作成して提供できるため、これがこのプログラミング言語をさらに魅力的なものにしています。

技術的な話になりますが、JavaScript 自体はコンパイラを使わずに実行できるインタプリタ型のプログラミング言語です。このプログラミング言語には、オブジェクト指向、クライアント側、高レベルのプログラミング、および緩やかに型指定された機能もあります。

4 JavaScript 関数
JavaScript 関数は、Web サイトやインターフェイスのビジュアルや Web サイト使用時のユーザー エクスペリエンスを向上させるのに役立つ、ドロップ、ドラッグ、およびすべてのコンポーネントなどのさまざまな機能を作成します。



それとは別に、Web 開発者は通常、サードパーティのアドオン用の Javascript スニペットを作成することで Web ページの機能を拡張できます。詳細については、以下のいくつかの Javascript 関数を参照してください。



Web サイトまたはプラットフォーム サーバーの実行
Javascript はブラウザ側やフロントエンドで動作するだけでなく、Web サイトのサーバーやプラットフォームを実行することもできるプログラミング言語です。通常、Web サイトサーバーまたは Javascript プラットフォームを実行するときは、Node.js の助けを借ります。



Node.js を使用すると、バックエンド (サーバー)、コンソール、モバイル、ゲーム、デスクトップ プログラムなどの開発など、ブラウザの外部で Javascript を使用できます。

ウェブサイトの作成と開発
知られているように、JavaScript を使用すると、ユーザーはインタラクティブな Web サイトを作成できます。硬くて飾り気のない Web サイトでは、訪問者は飽きてしまい、長く滞在することに興味がなくなります。したがって、このプログラミング言語は、多くの訪問者を引き付けることができる Web サイトを開発することができます。
メンタリング用チャットボットアプリの作り方案について

# はじめに

今回の記事では、Excelに保存されたテキストを参照しつつ、LLMと会話を行うことが出来る、LLMチャットボットの作成方法の案について記載したいと思います。

# 現在考えている方法
現在考えている案は以下の3案です

- **HTMLとJavaScript**
- **PythonでStreamlit**
- **Dify**

## HTMLとJavaScript
この案は単純にHTMLとJavaScriptでWebサイトを作り、そこにLLMのAPIを実装しようという案になります。
ただ、自分はあまりHTMLやWebデザインは得意ではないので、以前作成したことがあるWebサイトを改良する形で進めようかと思います。

GithubのURL:https://github.com/YukiziSuzuki/llama_communication/tree/main

こちらが、その作成したサイトが保存してあるGithubのリポジトリとなります。

説明は時間があったら付け加えます。

### 使用するLLM
使用するLLMはLlama3を使おうと考えています。
理由としてはドキュメントにJavaScriptを使う場合のコードがあったため




## PythonとStreamlit
### Streamlitとは
Streamlitは、Pythonを使ってデータアプリケーションを簡単に作成・共有するためのオープンソースフレームワークです。データサイエンティストや機械学習エンジニアが迅速にインタラクティブなアプリケーションを構築するのに役立ちます

### 進め方
PythonでWebアプリケーションを簡単に作成できるフレームワーク。
これを使って簡単なチャットボットの作成を行う。
注意点として、デザインが単純になりがちなので、それを踏まえた上で作成を使う。

### 使用するLLM
使用するLLMはLlama3を使おうと考えています。


## Dify
Difyは、直感的なインターフェースと豊富な機能を提供するオープンソースのプラットフォームです。

正直、使用したことが無いのでどのようなサービスなのか理解できていませんが、少し調べた感じ、無料で利用でき、Slackのボットとして実装もできるそうなので、利用することを考えています。




## 最後に
以上の3つのうちのどれかを用いてチャットボットを作成しようかと考えています。
Golangでコンソール表示させる方法

## 文字列を表示させたい場合
```golang:main.go
package main

import "fmt"

func main {
    fmt.Println("Hello World!")
}
```
#### 注意点
Goではダブルクォート```""```で囲わないと文字列と判定されません。

## 変数を表示させたい場合
```golang:main.go
package main

import "fmt"

func main {
    num := 4
    fmt.Println("num")
}
```

## 2つ以上の変数を表示させたい場合
```golang:main.go
package main

import "fmt"

func main {
    num := 4
    fmt.Println("num=", num)
}
```

#### 結果
```console
num=4
```

#### 注意点
2つ以上の変数をつなげたい場合は　```,```　で変数をつなげます。
SalesForce の開発環境の準備

勉強のために、salesforceの環境をつくる。
作り方はTrailheadに従う。

開発環境を用意するにはユーザ登録が必要。
サインアップすると環境作成に大体10分後ぐらいかかるので待機。
https://developer.salesforce.com/signup

LWCの動作検証をしたいので、Visual Studio Codeをインストールし、拡張機能をインストールしてSalesForce環境をつなげる。

Visual Studio Code の設定
https://trailhead.salesforce.com/ja/content/learn/projects/quick-start-lightning-web-components/set-up-visual-studio-code

trailheadの通り、LWCコンポーネントを作成しデプロイを行う。
デプロイしたら適当なページと紐づけて、ブラウザからみれるか確認を行う。

Hello World Lightning Web コンポーネントの作成
https://trailhead.salesforce.com/ja/content/learn/projects/quick-start-lightning-web-components/create-a-hello-world-lightning-web-component

ちなみにアプリケーションを新規で作成する場合は次の手順となる。
細かいところはtrailheadでの内容と同じ。アプリケーションの作成や設定は実務でもあまりやらないので結構忘れる。

・SFにログイン
・設定 -> アプリケーション -> アプリケーションマネージャ -> 新規Lightningアプリケーション -> 諸々の設定
・作成したアプリケーションを編集 -> ページ -> 新規ページ -> 諸々の設定
【WPF】ユーザーコントロール ざっくり入門

# はじめに
WPFで独自のUIを作れるユーザーコントロール機能について、ざっくりまとめます






# ユーザーコントロールとは
- 独自でUIを作れる機能
- 繰り返し使うUIなどを使いたい場合とかに使える


### ユーザーコントロールとカスタムコントロールの違い
- **ユーザーコントロールは、既存のコントロールをグループ化する際に使う**
- **カスタムコントロールは、新規でコントロールを作成する際に使う**


また、ユーザーコントロールでは、xamlファイルでプレビューを確認しながら変更できますが、カスタムコントロールの場合はプレビューが表示されません

https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/controls/control-authoring-overview?view=netframeworkdesktop-4.8






# 使用例
パス選択UIを作ってみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/55e13c40-48fd-91b9-ae64-ba9dfb125c23.png)

**普通に作ると、全て直置きでコントロールを配置する必要がありますが、配置するのはアホみたいなので、こんな感じでユーザーコントロールとしてまとめて、簡単に配置できるようになります**

### 内容
このユーザーコントロールは、以下のコントロールをグループ化して作成しています

- ラベル
- テキストボックス
- 参照ボタン






# 作り方
### ユーザーコントロール
- VisualStudioで、プロジェクトを作成後、`Ctrl + Shift + A`で新しい項目の追加
- **`ユーザーコントロール(WPF)`** を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/03d218b5-f3bc-bb20-d164-d0956ff502a3.png)

<br>

- 追加すると、.xamlと.csファイルが作成される
    - .xaml：スタイルを記述するもの
        - ボタンのサイズとか
    - .cs：UIの処理とかを記述するもの
        - ボタンのクリック時の処理とか

<br>

- xamlファイルを開いて、いい感じに調整する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/29a89b72-9629-750d-bf87-912e946e5bf2.png)

<br>

- **クラス側でメンバとして操作できるようにするために、各コントロールのNameを設定する**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/64f20f84-0996-c8fd-506c-043d36256e54.png)




### クラス
##### コントロールの参照
- コントロールの参照は、上記の通りNameを設定することで利用できるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/ca71a1a1-505e-2f33-01d3-62dcda72131e.png)
    - ♡マークついてるやつが、xaml側でName指定したコントロールです


##### プロパティの利用
- 今回の例では、以下の内容をプロパティで設定できるようにします
    - ラベル名
    - 選択対象はファイルかフォルダか

<br>

- プロパティは、そのままプロパティを定義すると表示されます
    - Category属性を付けると、独自のカテゴリに分別することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/0c26265b-3d15-e38a-d623-cf020ddb75c8.png)
        ```C#
        [Category("パス選択")]
        public string NameText { get; set; }

        [Category("パス選択")]
        public bool IsFolder { get; set; }
        ```

<br>

- **開始時にプロパティを参照したい場合、コンストラクタではなく、OnApplyTemplate()などのタイミングで参照する必要があります**
    - コンストラクタで参照してしまうと、nullになってしまいます
    - [WPF カスタムコントロール初期化時の実行順](https://p4j4.hatenablog.com/entry/2018/10/02/183030)
    - プレビュー変更時もテキストを変更したい場合、依存プロパティというものを利用しますが、結構面倒なので今回は省略します
        - [WPF 依存プロパティの作り方](https://qiita.com/tricogimmick/items/62cd9f5deca365a83858)


### 利用側
- ユーザーコントロールのxaml, クラスを記述したら、一度ビルドする必要があります
    - `Ctrl + B` でビルド
- ビルドし終えたら、ツールボックスにユーザーコントロールが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419795/eb401a55-5594-52f6-1d35-ac7b01394e4f.png)
- これをD&Dでウィンドウに持っていけば、配置できます。



# さいごに
ユーザーコントロールを駆使して、UIをいい感じに効率的に配置しましょう～

### 参考
https://qiita.com/furugen/items/d7a9f0c21a1694c7c2a6

https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/controls/control-authoring-overview?view=netframeworkdesktop-4.8
雑誌を読んで世界を広げる 「Software Design」を読んで

## 先に結論
[「Software Design」](https://gihyo.jp/magazine/SD)を読んで、興味や知識の幅が広がっていきました

## きっかけ

2024年1月、ソフトウェアテストの学習を進めていた際、書店で[「Software Design 2月号」](https://gihyo.jp/magazine/SD/archive/2024/202402)に出会いました。

興味を引かれて購入し、ソフトウェアテストの勉強を目的に読み始めました。しかし、読み進めるうちに、テスト関連だけでなく、.NET8、ドメイン設計、WebAPIなど、これまでほとんど触れたことのなかった技術領域にも興味が湧きました。

特に、技術的な詳細が非専門家にも理解しやすい言葉で説明されている点が印象的でした。

## 雑誌を読むと新しい領域に出会える

「フィルターバブル」と言われるように、インターネットでは自分が見たい情報しか見えなくなることがあります。

> 「フィルターバブル」とは、アルゴリズムがネット利用者個人の検索履歴やクリック履歴を分析し学習することで、個々のユーザーにとっては望むと望まざるとにかかわらず見たい情報が優先的に表示され、利用者の観点に合わない情報からは隔離され、自身の考え方や価値観の「バブル（泡）」の中に孤立するという情報環境を指す。

「Software Design」は、私の「フィルターバブル」を打開しました。

多様な内容により、私の興味領域が広がっていくことを体験できました。結果、知識の幅が広がっていきました。
明瞭でわかりやすい説明により、効率的に学習できました。

今でも「Software Design」の購読を続けています。

## おわりに

この記事では、雑誌「Software Design」を紹介しました。

よかったら読んでみてください。

それでは。

## 参考

https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r01/html/nd114210.html
【Python】文字列操作

# 文字列操作
Pythonでは文字列は非常に重要な役割を果たします。文字列は `str` クラスのオブジェクトとして扱われ、次のようなさまざまな操作が可能です。
## 文字列の作成
- 単一引用符 (`'`)、二重引用符 (`"`) で囲む
- 三重引用符 (`"""` や `'''`) で複数行の文字列を作成可能
```python
str1 = 'Hello, World!'
str2 = "Python's strings"
str3 = """This is
a multi-line
string."""
```
## 文字列の連結
- `+` 演算子を使って文字列を連結できます
```python
str1 = 'Hello, '
str2 = 'World!'
str3 = str1 + str2  # 'Hello, World!'
```
## インデックスとスライシング
- 文字列の各文字にはインデックス番号が割り当てられています
- `[]` を使ってインデックスまたはスライスを指定できます
```python
str1 = 'Hello, World!'
print(str1[0])      # 'H'
print(str1[-1])     # '!' (マイナスインデックスで後ろから数えられる)
print(str1[2:7])    # 'llo, '
print(str1[:5])     # 'Hello'
print(str1[7:])     # 'World!'
```
## 文字列メソッド
- 文字列には便利なメソッドがたくさん用意されています
```python
str1 = 'Hello, World!'
print(str1.upper())     # 'HELLO, WORLD!'
print(str1.lower())     # 'hello, world!'
print(str1.strip())     # 'Hello, World!' (前後の空白を削除)
print(str1.replace('l', 'L')) # 'HeLLo, WorLd!'
print(str1.split(','))  # ['Hello', ' World!']
print(' '.join(['Hi', 'there'])) # 'Hi there'
print(str1.find('o'))    # 4 (見つからない場合は-1が返される)
print(str1.count('l'))   # 3
```
## フォーマット
- 文字列中に値を埋め込むためのいくつかの方法があります
```python
name = 'Alice'
age = 25

# 古い形式の文字列フォーマット
print('My name is %s and I am %d years old.' % (name, age))
# My name is Alice and I am 25 years old.

# str.format()メソッド
print('My name is {} and I am {} years old.'.format(name, age))
# My name is Alice and I am 25 years old.

# f-strings (Python 3.6以降)
print(f'My name is {name} and I am {age} years old.')
# My name is Alice and I am 25 years old.
```
## 正規表現
- 正規表現を使うと、より高度な文字列処理が可能になります
- `re` モジュールを使用します
```python
import re

text = 'Hello, 123 World. 456 Example.'

# 検索と置換
print(re.sub(r'\d+', 'NUM', text)) # 'Hello, NUM World. NUM Example.'

# 値の抽出
matches = re.findall(r'\d+', text)
print(matches)  # ['123', '456']
```
文字列操作は、ファイル処理、ウェブスクレイピング、データ分析など、様々な場面で活用されます。Pythonには文字列を扱うための豊富な機能が用意されているので、状況に応じて適切に利用することが重要です。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)

https://qiita.com/Akuuuun/items/dffb69b95c7c0af2ed54
vscodeでシーケンス図を書いてみた。

AWSを使ってサーバーレスなWebアプリ開発を行っています。
サーバーレスな分、自分で作っていても訳がわからなくなるので、適切なドキュメント管理を目指しています。
今回は「シーケンス図」を作っていきます！

## Lv1 とにかく一旦作ってみる
### シーケンス図とは？
そもそもシーケンス図とはなんぞや。ざっくりどう書くんだ？
を以下記事でお勉強します。

https://cacoo.com/ja/blog/what-is-sequence-diagram/

### ひとまず書いてみる
Mermaid Graphical Editorを使ってみました。
vscode上でポチポチ画面をいじりながら、シーケンス図を作成できて、
ついでにコードも生成してくれる神拡張機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/e276cc00-a0bc-2fb7-c326-a3dff90356dc.png)

一番左のアイコンで、「ライフライン」を
左から２番目のアイコンで、「メッセージ」を書けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/9a83f1d4-8a63-2df2-f78d-7606c8f4f2e1.png)

あらちょー簡単！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/b02b2f7f-54fa-85e0-c6c9-22c0b93a221e.png)

余談ですが、
Mermaidとは、マークダウン形式でコードっぽいモノを書くと勝手にシーケンス図を書いてくれる便利ライブラリ見たいです。
そのMermaidをGUIで書けるよー。というのがMermaid Graphical Editorみたいです。

## Lv2 もうちょい細かい仕様を加える
### 実行仕様
>「実行仕様（別名：制御フォーカス）」はライフライン上で処理が実行されていることを意味します。もちろん、実行仕様はライフライン上に設置されます。

この実行仕様なるものを付け加えたいです。
色々調べたんですが、Mermaid Graphical Editorを使って追加する方法がわかりませんでした。
しぶしぶmermaidのコード実装方法を勉強します。。。
以下のサイトより、矢印の後ろに+か-を記入すればいいみたいです。

https://qiita.com/run1000dori/items/90f91687cfe7ece50020#%E5%AE%9F%E8%A1%8C%E4%BB%95%E6%A7%98

+-を付け加えるくらいなら、GUIで操作できなくても良いでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/4ce92091-3f9b-13be-307b-22edc0fc9549.png)

### 注釈
以下画像で緑にハイライトされているタグっぽいアイコンをクリックすると注釈を入れられます。
注釈を入れられる場所は、横方向（ライフラインの左、ライン上、右）と縦方向（request、response）の組み合わせで選択可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/834927d1-233c-84b4-459a-03c9201cf385.png)

例えば、ライフラインAの右側 × requestの後に注釈を入れるとこんな感じ。
今回の例で言うと、ライフラインBの左側に注釈を入れても同じような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/f7d9481f-6cf8-7932-5168-aa826b0b7225.png)

### 「処理の種類」を加える
そろそろコードへの耐性も出来てきたので、こちらもMermaidでどう描くのかを調べました。

https://qiita.com/hirokiwa/items/032c7e37aa361bea5312#%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90

例えば、IF文を書くならこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/65637b2b-8980-9cf1-7b85-e0100fe2e236.png)

IFはGUI操作よりもコードで書き加えた方が楽でした。
（IF文=altの文はGUIで記載できたけど、ELSE文の書き方がわからなかったので。）
しかしLoopはGUIを使った方が書きやすいです。
以下画像の緑にハイライトされているアイコンをクリックして、
①Loopの始点を定める②終点を定める、とLoopをシーケンス図に書き加えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2419876/33e5abda-930f-0694-f836-c8e03c73f090.png)

## Lv3 根本を深く知る
ここまで出来てくると、
「そもそもメッセージに記載すべき粒度はなんだ？」とか、
「IF文の処理を書き加えるべき時と、そうでない時の差はなんだ？」が気になってきます。
（個人的には、ログインの成功失敗のIF文はいらない気がする。）

このシーケンス図は、UML(=統一モデリング言語)というプログラミング界における一般的な規格みたいなので、以下記事を読むなどして理解を深めるのが良いと思います。

https://lecture.ecc.u-tokyo.ac.jp/hideo-t/references/uml/sequence-diagram/sequence-diagram.html#id10
jetpack composeでcameraxとmlkitをつかってバーコード読み取り画面を実装するPart1

# はじめに
今回からJetpackComposeでのバーコード読み取り機能を実装していきます。
### 本文
今回は、まず必要なライブラリたちを追加するところからです
最近はtomlでバージョン管理をするのが流行なのでそれにのってってやっていきます
```kotlin
code-scanner = "18.3.0"
camerax = "1.4.0-beta01"

codescanner = {module = "com.google.android.gms:play-services-mlkit-barcode-scanning", version.ref = "code-scanner"}
camera = { module = "androidx.camera:camera-camera2", version.ref = "camerax" }
camera-lifecycle = { module = "androidx.camera:camera-lifecycle", version.ref = "camerax" }
camera-view = { module = "androidx.camera:camera-view", version.ref = "camerax" }
```

```kotlin
implementation(libs.codescanner)
    implementation(libs.camera.view)
    implementation(libs.camera.lifecycle)
    implementation(libs.camera)
```
### さいごに
次はカメラの実装部分をやっていこうと思います
次の記事を書き次第下記に追加していきます
【Python】数値演算

# 数値演算
Pythonでは数値演算が非常に重要な役割を果たします。以下の種類の数値演算を行うことができます。
## 基本的な算術演算
- 加算 (+)
- 減算 (-)
- 乗算 (*)
- 除算 (/)
- 整数除算(//)
- 剰余 (%)
- べき乗 (**)
- 階乗 (math.factorial())
```python
a = 10
b = 3

print(a + b)  # 加算 出力: 13
print(a - b)  # 減算 出力: 7
print(a * b)  # 乗算 出力: 30
print(a / b)  # 除算 出力: 3.3333333333333335
print(a // b)  # 整数除算 出力: 3
print(a % b)  # 剰余 出力: 1
print(a ** b) # べき乗 出力: 1000
```
## 代入演算
- 変数への代入 (=)
- 複合代入演算 (+=, -=, *=, /=, %=, **=)
```python
x = 5
x += 3  # x = x + 3 = 8
x -= 1  # x = x - 1 = 7
x *= 2  # x = x * 2 = 14
x /= 7  # x = x / 7 = 2.0
x //= 7  # x = x // 7 = 0.0
```
## 比較演算
- 等しい (==)
- 等しくない (!=)
- より大きい (>)
- より小さい (<)
- 以上 (>=)
- 以下 (<=)
```python
a = 10
b = 5

print(a == b)  # False
print(a != b)  # True
print(a > b)   # True
print(a < b)   # False
print(a >= b)  # True
print(a <= b)  # False
```
## ビット演算
- ビット論理積 (&)
- ビット論理和 (|)
- ビット排他的論理和 (^)
- 右シフト (>>)
- 左シフト (<<)
- ビット反転 (~)
```python
a = 0b1010  # 2進数 1010 = 10
b = 0b1100  # 2進数 1100 = 12

print(bin(a & b))  # ビット論理積 出力: 0b1000 (8)
print(bin(a | b))  # ビット論理和 出力: 0b1110 (14)
print(bin(a ^ b))  # ビット排他的論理和 出力: 0b110 (6)
print(bin(a >> 1)) # 右シフト 出力: 0b101 (5)
print(bin(b << 2)) # 左シフト 出力: 0b110000 (48)
```
## 数学関数
- 絶対値 (abs())
- 最大値・最小値 (max(), min())
- 商と剰余 (divmod())
- べき乗と平方根 (pow(), sqrt())

- 円周率と自然対数の底 (math.pi, math.e)
- 三角関数 (sin(), cos(), tan())
- 対数関数 (log(), log10())
- その他 (math, cmath モジュールにあるさまざまな関数)
```python
import math

print(abs(-5))     # 絶対値 出力: 5
print(max(2, 7, 1)) # 最大値 出力: 7
print(min(4, 9, 2)) # 最小値 出力: 2
print(divmod(10, 3)) # 商と剰余 出力: (3, 1)
print(pow(2, 3))    # べき乗 出力: 8
print(math.sqrt(25)) # 平方根 出力: 5.0
print(math.pi)       # 円周率 出力: 3.141592653589793
print(math.sin(math.pi/2)) # Sin値 出力: 1.0
print(math.log(100, 10))  # 常用対数 出力: 2.0
```
これらの演算とPythonの数値型(int, float, complex)を組み合わせることで、様々な数値計算を行うことができます。より高度な数値処理が必要な場合は、NumPyやSciPyなどの専門ライブラリを使用します。
######
参考)　[東京工業大学情報理工学院 Python早見表](https://chokkan.github.io/python/index.html)

https://qiita.com/Akuuuun/items/165200853d406e9241c4
デフォルトゲートウェイとデフォルトルートの違い

デフォルトゲートウェイは、パソコンで使われる用語でConnectやStaticのルートを持たない時に通信先として選択されるfirst hopのL3ノードのことです。

デフォルトゲートウェイはCiscoのネットワーク機器でも設定することがあります。それはインテリジェントスイッチが別セグメントの保守網と接続性を実現するための、前述のPCの時のデフォルトゲートウェイと同じ用途になります。

このデフォルトゲートを設定することで、ルーティングテープルに 結果的に 0.0.0.0/0 のルートが浮かび上がりますが、これをデフォルトルートと呼ぶことは少ないです。

次にデフォルトルートについですが、L3機器のルーティングテーブルに載った、ロンゲストマッチでいずれのルートにもマッチしないパケットを受けた時の送り先を示す(宛先ネットワークが0.0.0.0/0で載る)ルートがデフォルトルートです。

それはスタティックルートとして書いた場合、明確なデフォルトルートとしてルーティングテーブルに載ることになります。
コマンド形式としては ip route 0.0.0.0./0 [nexthop address] という書き方となり、まさにルーティングテーブルに乗った時にデフォルトルートとも呼べる書きっぷりとなっています。

そして、もう一つのデフォルトルートの作成方法として、ある動的ルーティングが行われているルーティングドメインに参加しているノードである場合、動的にデフォルトルートを学ぶことがあります。

ここで、ラストリゾートゲートウェイという言語にも触れますが、この言葉は動的ルーティングとして、自ノートをデフォルトゲートウェイとせよというルーティング設定をする時のシチュエーション、コマンド、および通知を受けた側のデフォルトルートの学び方を明確にするための用語となっています。

OSPFなどの動的ルーティングにより、ラストリゾートゲートウェイの通知を受けて、学んだルートもまたデフォルトルートとしてルーティングテーブルに載ることになります。

デフォルトゲートウェイ、ラストリゾートゲートウェイ、デフォルトルートをごちゃまぜにしたり、俺流の見解をされている方がおられますが、Cisco機器で検証を行ってきた技術者として、上記のような見解となりました。

何か間違いなどあれぱ、コメントをもらえると幸いでございます。
VSCodeでエディタで選択したコマンドをbashターミナルで実行する

# やりたいこと
VSCodeのエディタで選択したコマンドをターミナルで実行する。
簡単に言えば、エディタでコピーして、ターミナルでペーストする操作の自動化。
code runnerなど自動実行する拡張機能もあったが、実行内容を一時ファイルに格納して実行する仕様上、
dockerやデータベースにログインした後、コマンド入力が継続できない問題があったので、[multi-command](https://marketplace.visualstudio.com/items?itemName=ryuta46.multi-command)を利用して実装した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118317/c6a62498-5517-bf1e-6727-4ca6ee4bb7f7.png)

# 参考記事
multi-commandの利用方法は、以下の記事を参考にさせて頂きました。
[【VSCode】複数のコマンドを一つのキーで実行したい](https://qiita.com/mh326/items/6e2c3cf262cc1dfccdbe)

# 設定手順
## 拡張機能multi-commandのインストール
VSCodeの拡張機能からmulti-commandをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118317/42aefcaa-e570-c661-f2a5-3feb916c0423.png)


## settings.jsonの修正
以下をVSCodeのsettings.jsonに追記
```
    "multiCommand.commands": [
            {
                "command": "multiCommand.exeCommandToTerminal",
                "sequence": [
                    "editor.action.clipboardCopyAction",
                    "workbench.action.terminal.focus",
                    "workbench.action.terminal.paste",
                    {
                        "command": "workbench.action.terminal.sendSequence",
                        "args": {
                            "text": "\n"
                        }
                    },
                    "workbench.action.focusPreviousGroup"
                ]
            }
    ]
```

**解説**
```
command: コマンドの名前
sequence: コマンドの順番
　editor.action.clipboardCopyAction: エディタの選択部分をコピー
　workbench.action.terminal.focus: カーソルをターミナルに切り替える
　workbench.action.terminal.paste: コピー内容をペーストする
　workbench.action.terminal.sendSequence: 任意の文字の送信（ここでは改行を送信）
　workbench.action.focusPreviousGroup: 前の画面にカーソルを戻す（ここではエディタに戻す）
```

## keybindings.jsonの修正
以下をVSCodeのkeybindings.jsonに追記
ここではショートカットキーは、ctrl + shift + v に設定
```
    {
        "key": "ctrl+shift+v",
        "command": "extension.multiCommand.execute",
        "args": {
            "command": "multiCommand.exeCommandToTerminal",
        },
        "when": "editorTextFocus"
    }
```

**解説**
```
key: ショートカットキーの設定
command: 実行するコマンド（settings.jsonに追記したコマンドを指定）
when: ショートカットキーが有効になる条件
```

# 実行手順
1. VSCodeで、エディタとターミナルを開く
1. エディタで実行したいコマンドを選択する
1. ctrl + shift + v を押す

# 備考
・複数行のコピーをしても警告などはないため、選択範囲に注意してください。
・やっていることは、ただのコピー＆ペーストなので、bashでなくてもエディタとターミナルのセットであれば何でも利用できるはず。
【第一章】達人プログラマー  --上達に向けたあなたの旅--　読書メモ

# 読書箇所
第一章　達人の哲学 1~7節

# よくわからなかった点

| 記載箇所 | 内容 | 疑問点 |
| ---- | ---- | ---- |
| 3 ソフトウェアのエントロピー | コードを汚してしまう最初の人間にはなりたくないと思うのではないでしょうか？  | 割れた窓がない状態だとソフトウェアの治安が悪く成りずらいのは事実。しかし、技術的なスキル不足の人の実施者が行った場合や納期のひっ迫による暫定的なプログラムの作成などはどう対処すればいいのか？ |
| 1  | 多くのユーザーは1年先にしか入手できない豪華な機能を満載したソフトウェアよりも、今日入手できる仕上がりの粗いソフトウェアを選択します | 日本的な考えではない気がする。今日、入手できる仕上がりが完璧なソフトウェアを選択すると思う。|

# 気になった点　印象に残った点

| 記載箇所 | 内容 |
| ---- | ---- |
| 1 あなたの人生 | 本書の最も重要なティップスは`あなたには現状を打破する力がある`ということ |
| 2 猫がソースコードを食べちゃった | チーム内の信頼関係が創造性とコラボレーションに欠かせないものである 
| 2 猫がソースコードを食べちゃった | 他の人が何を言うかを予想し、報告する前に答えを用意する。弁解の代わりに対策ウィ提案する |
| 4 石のスープと茹でガエル| 人は万時うまくいっていることには簡単に参加できる。未来を少し垣間見せるだけで、みんな集まってくる |
| 5 十分によいソフトウェア | 不可能なスケジュールを約束したり、納期に間に合わせるために基本的な技術面をおろそかにするのもプロフェッショナルとしてあり得ないのです。あなたが開発しているシステムのスコープと品質は、システム要求の一部として議論されていなければなりません。 |
| 7 伝達しよう | 仕事におけるコミュニケーションのうちで最も難しいのが言いたいことを明確にするという作業う。→すぐに手を動かすのではなく言いたいことを練り上げていくこと。その後、「これで言いたいことの意味が聞き手にうまく伝わるだろうか？」と自分自身に問いかけます。この作業を何度も繰り返し、磨きをかけていく。|
| 7 伝達しよう | 重要なのはフィードバックである。 |


## 参考
David Thomas; Andrew Hunt. 達人プログラマー ―熟達に向けたあなたの旅
CircleCiのローカル実行（インストールから）

### 前提
- windows11
- CircleCiのアカウント作成
- CircleCiのAPIトークンの準備
### 手順

### 参考文献
[CircleCiドキュメント](https://circleci.com/docs/ja/local-cli/#windows-install-with-chocolatey)

### インストール
```
choco install circleci-cli -y
```
### 更新
```
circleci update check
circleci update
```
### CLIの設定（CircleCiのAPIトークンが必要です。）
```
circleci setup
```
### 設定ファイルのバリデーション
.circle/config.ymlを対象に検証をします。  
.circleまで移動して下記コマンドを実行してください。
```
circleci config validate
# Config file at .circleci/config.yml is valid
```
【Android】バージョン分岐が必要な実装はCompat系の機能を使おう

# はじめに
対応範囲は広いプロジェクトなどは、そのバージョンに合わせて分岐するのが面倒ですよね。
そういったケースで便利なのがCoreKtxライブラリが提供するCompat系の機能ですが、実はかなりの種類が定義されていて、バージョンの分岐が必要な実装には大体Compat系の実装が用意されていたりします。
そこで今回はCompat系の実装を使うことでバージョン分岐を省略可能な実装をいくつかご紹介したいと思います。

# 準備
まず、Compat系の実装を使うには、以下ライブラリを導入する必要があります。

```app/build.gradle
dependencies {
    implementation 'androidx.core:core-ktx:1.13.1'
}
```

上記ライブラリは最新のプラットフォーム機能とAPIをターゲットにしつつ、古いデバイスもサポート可能となるライブラリです。
まさにバージョン分岐が必要なケースの為に用意されているようなライブラリですね。

# その1：ServiceCompat
サービス周りは最近特に厳しくてバージョン分岐も激しくなりがちですよね。
対象となるのが主にstartForegroundとstopForegroundだと思いますが、このServiceCompatを使うと分岐が必要なくなり、とても楽に実装可能です。

```main.kt
// 修正前
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
   startForeground(
      id,
      notification,
      type
   )
} else {
   startForeground(
      id,
      notification
   )
}

// 修正後
ServiceCompat.startForeground(
   service,
   id,
   notification,
   type
)
```

気持ちいいくらいシンプルにかけますね、約半分になるので最高です。
stopForegroundも同じなので是非積極的に使っていきたいところです。

# その2：ContextCompat
これは言わずと知れたみなさんご存じのCompatクラスですね。
その1と同じService関連ですが、以下もContextCompatを使うとバージョン比較を省略できます。

```main.kt
// 修正前
val serviceIntent = Intent(context, TestService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   context.startForegroundService(serviceIntent)
} else {
   context.startService(serviceIntent)
}

// 修正後
val intent = Intent(context, TestService::class.java)
ContextCompat.startForegroundService(context, intent)
```
やはりバージョンの分岐がないというだけで本当にスッキリしますね。
ContextCompatには便利な機能がたくさんあるので、是非追ってみてください。

# その3：BundleCompat
名前の通りBundle関連のヘルパークラスになりますが、こちらを利用することでParcelableの取得処理をシンプルに実装することが可能です。

```main.kt
// 修正前
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    intent.getParcelableExtra("key", ComponentName::class.java)
}

// 修正後
BundleCompat.getParcelable(
    bundle,
    "key",
    TestData::class.java
)
```
ボリュームは他のに比べてそこまで変わりませんが、呼び出しがシンプルで見やすいですね。
ご紹介した以外にもたくさんあるので、バージョンでの分岐が必要になったらまず省略する方法がないかを探してみてください。

# さいごに
つい先日30代になったと思ったらもう一年経過していました。
1年が一瞬過ぎて気がついたら30代終わってそう😇
Flask から Jinja2 を通じて Javascript に辞書を渡す

# Flask から HTML に値を渡す場合
Jinja2 Template を使った HTML に Flask から値を渡す場合は
```python:app.py
return render_template('index.html', name='りんご', price=100)
```
```jinja:index.html
<body>
    <p> {{ name }} は {{ price }} 円 </p>
</body>
```
```:output
りんごは100円
```
---
# Javascript で値や辞書を利用したい場合

Javascriptで値を利用したい場合は以下のように `<script>` タグの中で変数に代入
Python の Dictionary型 を渡したいときは `json.dumps()` で JSON に変換可能
```python:app.py
fruit = {'name':'りんご', 'price':100}
return render_template('index.html', fruit=json.dumps(fruit))
```
JSONの場合は勝手にエスケープされてしまうことを防ぐために
`safe` オプションを追加します。
```jinja:index.html
<head>
    <script> let fruit = {{ fruit|safe }} </script>
    <script src="static/js/main.js"></script>
</head>
```
```js:main.js
console.log(`${fruit.name}は${fruit.price}円`);
```
```:output
りんごは100円
```
LeetCode挑戦日記：Day2

# はじめに

最近、業務で実装する時間よりも資料作成やレビューをする時間が多くなってきました。
このままでは自身のコーディング能力が落ちそうで怖いので、LeetCodeを始めてみました。

自身の学習の記録 & LeetCodeに興味のある人が挑戦しやすいように、記事に残していきます。
このような競技プログラミングをした経験がないので、ひよってEasyからやっていきます...

# [Easy] 1431. Kids With the Greatest Number of Candies

インプット：数値の配列、数値
アウトプット：真理値の配列

インプットの数値の配列の各要素にインプットの数値を足したとき、その結果がインプットの数値の配列の全ての要素以上の数値になればtrueを返す。

## 素直に解いてみる

### 考え方

0. インプットの数値の配列の最大値を求める
0. インプットの数値の配列の各要素にインプットの数値を足し、事前に求めた最大値以上か比較する

### コーディング

```typescript
function kidsWithCandies(candies: number[], extraCandies: number): boolean[] {
    const maxCandies = Math.max(...candies);
    const result = candies.map((candy) => { return maxCandies <= (candy + extraCandies) });
    return result;
};
```

### 結果

Runtime：59ms
Beats 73.00% of users with TypeScript

Memory：52.64MB
Beats 40.44% of users with TypeScript

## 改善してみる1

### 考え方

`map`内の処理をできるだけ減らした方が早くなりそう。
最大数を超えているか確認するのではなく、閾値を求める。

### コーディング

```typescript
function kidsWithCandies(candies: number[], extraCandies: number): boolean[] {
    let thresholdCandies = Math.max(...candies) - extraCandies;
    const result = candies.map((candy) => { return thresholdCandies <= candy });
    return result;
};
```

### 結果

Runtime：56ms
Beats 85.28% of users with TypeScript

Memory：52.04MB
Beats 87.42% of users with TypeScript
vue3 親コンポーネント子コンポーネント

子コンポーネント(Tuuhou.vue)で通報機能を作る
親コンポーネント(Home.vue)で読み出したい。

参考
https://qiita.com/mml/items/2be6b8df94d932e9a047

まずは親から子を読み出すためのテスト

```Home.vue

<script setup>
import {ref} from 'vue';

// 子のメソッド呼び出しに必要な部分
import TuuhouComponent from './Tuuhou.vue';
const tuuhou = ref();//大文字小文字注意
function increment(){
    tuuhou.value.incrementNumber();
}
// 子のメソッド呼び出しに必要な部分(ここまで)
</script>

<template>
    <TuuhouComponent ref="tuuhou"></TuuhouComponent>
    <button @click="increment">Increment</button>
</template>

```


```Tuuhou.vue

<script setup>
import {ref} from 'vue';

// 親からの呼び出しに必要な部分
const number = ref(0);
function incrementNumber()
{
    number.value++;
}

defineExpose({
    incrementNumber,
});
// 親からの呼び出しに必要な部分 (ここまで)

</script>
<template>
    <div>
        Child: {{ number }}
    </div>
</template>

```

これで 子要素の number が +1 ずつされる。
【TryHackMe】Red Team Fundamentals：Walkthrough

# 概要

TryHackMe「Red Team Fundamentals」のWalkthroughです。

https://tryhackme.com/r/room/redteamfundamentals

# Task2

## **Q1**.*Would vulnerability assessments prepare us to detect a real attacker on our networks? (Yay/Nay)*

**A**.**Nay**

## **Q2**.*During a penetration test, are you concerned about being detected by the client? (Yay/Nay)*

**A**.**Nay**

## **Q3**.*Highly organised groups of skilled attackers are nowadays referred to as ...*

**A**.**Advanced Persistent Threats**

# Task3

## **Q1**.*The goals of a red team engagement will often be referred to as flags or...*

**A**.**crown jewels**

## **Q2**.*During a red team engagement, common methods used by attackers are emulated against the target. Such methods are usually called TTPs. What does TTP stand for?*

**A**.**Tactics, Techniques and Procedures**

## **Q3**.*The main objective of a red team engagement is to detect as many vulnerabilities in as many hosts as possible (Yay/Nay)*

**A**.**Nay**

# Task4

## **Q1**.*What cell is responsible for the offensive operations of an engagement?*

**A**.**Red Cell**

## **Q2**.*What cell is the trusted agent considered part of?*

**A**.**White Cell**

# Task5

## **Q1**.*If an adversary deployed Mimikatz on a target machine, where would they be placed in the Lockheed Martin cyber kill chain?*

**A**.**Installation**

## **Q2**.*What technique's purpose is to exploit the target's system to execute code?*

**A**.**Exploitation**

# Task6

## **Q1**.*Click the "View Site" button and follow the example engagement to get the flag*

右上の`View Site`をクリックして解説を開きます。

![task6q1 view site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/74a9404d-9c68-ed60-0fbf-0c4219b78217.png)

`Next`ボタンをクリックして進めていくとフラグゲットです。

![task6q1 flag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/7f85d331-7cf7-c23c-67fb-5e088f8c931e.png)

**A**.**THM{RED_TEAM_ROCKS}**
Pythonでdiscord botを作る(py-cord)1

# はじめに
### 今回の記事の対象
- pythonの実行環境がすでに整っている
- vscordなどのeditorの準備がすでにできている
- pythonの基本的な書き方がわかっている
- discord botのアカウントの作成方法がわかっている
# py-cordの入れ方
```
pip install py-cord
```
ターミナルに入力してください

# 基本的な使い方
#### prefixコマンドの実装方法
```python3
import discord
from discord.ext import commands

token = ""

bot = commands.Bot(
    command_prefix="!",
    intents=discord.Intents.all(),
    help_command=None
    )

@bot.command()
async def hello(ctx):
    await ctx.respond(f"hello {ctx.author.mention}")
    
bor.run(token)
```
これでdiscord内で!helloと送信するとbotがhelloとコマンドを使った人へのメンションを送信してくれます

#### slashコマンドの実装方法
```python3
@bot.slashcommand()
async def hello(ctx):
    await ctx.respond("hello")
```
これで実装できます

# 最後に
今回は基本的なpu-cordの使い方を説明しました
気が向けば他の実用的なコマンドの実装方法も上げていこうと思います
質問も気が付けば答えようと思います
AGL

ラズパイとAutomotive Grade Linux（AGL）を使って，ミニカート用のスピードメータを作っている．
スピードメータはAGLのデモをほぼそのまま利用する．

AGLの画面出力設定のメモ

<b>ハード</b>：ラズパイ4
<b>CAN</b>：WaveshareのCAN HAT（安い方）
<b>画面出力</b>：
　・<i>HDMI1</i> -> 1920x1080モニタ -> 新しいデモ画面（マルチランチャー的な，青いっぽいやつ）
　・<i>HDMI2</i> -> 1024x600モニタ -> スピードメータ（速度とタコ，黒っぽいやつ）

HDMI2のみを接続した場合でも，HDMI2側にスピードメータが出力される設定方法を以降で記す．
（デフォルトでは，HDMI2のみを接続した場合は，HDMI2側に新しいデモ画面が出力されると思われ）


## ●仮想マシン0に入る
 UARTなどでAGLのプロンプトに入ったら，次のコマンドで仮想マシンにログインする．

```
$ screen /dev/pts/0        (ホストのプロンプト)
(リターン押す)
virtio-aarch64 login:root  (rootと入力)
root@virtio-aarch64:~#     (仮想マシンのプロンプト)
```

### ▲/etc/xdg/weston/weston.iniを編集
　仮想マシン上で次のファイルを編集する．
 　（元がどうだったかは，もう覚えてましぇん）

```
root@virtio-aarch64:~# vi /etc/xdg/weston/weston.ini
```

　[output] 以降を編集する．内容を抜粋．
 
```weston.ini
省略
[output]
name=HDMI-A-1
transform=rotate-90

[remote-output]
name=remote-1
mode=640x720@30
host=172.168.10.3
port=5005

[output]
name=Virtual-1
mode=1920x1080
transform=rotate-90
```

編集したら仮想マシンを抜ける．
Ctrl + a, k (もしくはCtrl + a , Ctrl + d) 　を押して `screen` を抜ける．

## ●仮想マシン1に入る
　同様に，
 
```
$ screen /dev/pts/1
(リターン押す)
virtio-aarch64 login:root  (rootと入力)
root@virtio-aarch64:~#
```

### ▲/etc/xdg/weston/weston.iniを編集

```
root@virtio-aarch64:~# vi /etc/xdg/weston/weston.ini
```

```weston.ini
省略
[output]
name=HDMI-A-2

[remote-output]
name=remote-1
mode=640x720@30
host=172.168.10.3
port=5005

[output]
name=Virtual-2
mode=1920x1080
```

編集したら，仮想マシンを抜ける．
【Chrome DevToolsのコツ】Geminiでエラーを深く理解

### 前提
・ブラウザ：Google Chrome
・バージョン：125.0.6422.60 

### やりたいこと
開発の際にconsoleでエラーやワーニングが出て、これらを便利に理解する
![Screenshot 2024-06-09 at 14.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/b300f206-264d-41db-9810-c4d36ea11724.png)

### 手順

* 右左にて「⚙️」をクリック

![Screenshot 2024-06-09 at 14.27.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/b0bef7b2-9ead-caac-5c61-25ee1ac509a7.png)


* 設定が開く
* 「Preferences」タブで下にスクロール
* 「understand console messages with AI」にチェックを入れ

![Screenshot 2024-06-09 at 14.28.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/eb3aa88f-d3bb-1f5f-e75e-ff0236f5056e.png)

* 設定を閉める
* 再生

![Screenshot 2024-06-09 at 14.29.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/300689ec-85d1-97e6-296d-36217470119b.png)


* エラーやワーニングごとに「💡」がつけられており、マウスをホバーすると解説ボタンが表示されます
* 幾つのプライバシー確認があり、全部確認の上で解説がみえる

![Screenshot 2024-06-09 at 14.29.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/43810659-b462-13fa-c0af-ce59ae769f55.png)

* GoogleがAI改善するために、解説の正さによってThumb up それともthumbdown ボタンをクリックする

![Screenshot 2024-06-09 at 14.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703979/0cc27fef-c33b-2a06-a402-308f0b06dfaf.png)
WSL2とは...インストールしてみた

# 簡単に
- 「Windows Subsystem for Linux 2」の略  
- Windows上でLinux環境を構築できる

# 導入手順
[参考: microsoft公式](https://learn.microsoft.com/ja-jp/windows/wsl/install)
### 前提
os: winsows11
インストールするディストリビューション: ubuntu
*ディストリビューションは変更可能です。[microsoft公式](https://learn.microsoft.com/ja-jp/windows/wsl/install)

### WSLの有効化
管理者としてPowerShellを開き、以下のコマンドを実行  
```powershell
wsl --install
```
インストール完了でユーザー名とパスワードを入力します。
```powershell
New password:
Retype new password:
```
私の環境だと下記の出力でインストール完了しました。
```powershell
passwd: password updated successfully
この操作を正しく終了しました。
Installation successful!
```

### 基本的なコマンド
[参考: microsoft公式](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands?source=recommendations)
<br>

使用可能なLinuxディストリビューションを一覧表示
```powershell
wsl --list --online
```

シャットダウン
```powershell
wsl.exe --shutdown
```
ディストリビューションを指定して実行
```powershell
wsl -l -v
```

ディストリビューションを指定して実行
```powershell
wsl -d <ディストリビューション名>
```
Godot検討時のメモ

## 私的なUnity事情

今まで、Unityでゲームを作ることが大半でしたが、Unityライセンスの値上げや
ライセンスの変更等で、Unity以外の乗り換えも真剣に考えております。

## Unity以外だと何が良いのか？

現在リッチなゲームと言えば、高確率でUnrealEngineです。

当然、私も先月辺りに、Unrealに乗り換えを検討たのですがUnityでいうSkyBox(?)を表示してもオンボードのグラボだと60fpsどころか30fpsも出ていない。
カジュアル寄りの仕事が多いので、今まで困る事はなかったのですが開発環境が推奨動作環境以下だと、そもそも開発は難しい。
というか、現在のメインターゲット層にUnrealで提供すると動作が重くて遊べないと言われるのが目に見えているので今回は保留になりました。

## UnrealEngine以外で何があるの？

前置きが長くなりましたが、Unreal・Unity以外となると次に出てくるのがGodot
だと思います。
ということで、今回はGodotで実用の検証する時のメモを残しておきたいと思います。

## 使用言語をどうするか？

Godotを使用するにあたって、GDScriptかC#かの選択することができます。
ただ、オレオレ言語(GDScript)を覚えるのは、辛いので今回はC#で進めたいと思っています。
ざっとマニュアルを斜め読みした感じだとC#で出来ない事もあるような風に掛かれていますが直面するまでは考えないことにします。

## セットアップ後の環境の問題

まずは、Unityの時はあまり必要なかったですが統合環境の作りの甘さがあるので設定の変更がちまちま必要そうです。
例えば、標準のエディタを使用してコーディングしてみると、結構煩わしい(JetBrains最高な接待機能がない)ので外部エディタを使用することにしたのですが、編集してIDEに戻ってくると「外部で変更されているのでどうしますか？」的な表示が毎回されます。
編集がコンフリクトしている訳でもないのに毎回確認表示するとか、そこは編集されていないなら黙ってリロードして欲しいです。

### 自動再読み込みの機能の設定

調べると、自動リロードのオプションがあるようです。（何故デフォルトでリロードがオンになっていないのか疑問です）

1. エディタ＞エディタ設定を開く
1. ダイアログのテキストエディタ＞ビヘイビア＞ファイルのAuto Reload Scripts External Changeのチェックを付ける
![godot_editor_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/8e881ab2-8c7d-e803-ba75-9a9579a72e91.png)

これで漸く落ち着いて、編集できるようになりました。
次回は、Godotを使って簡単な機能実装の話でも出来ればと思います。
Macのライブ変換でも使える、ふりがなを自動で入力するjQueryのプラグインを作ってみた

jQueryでふりがなを自動入力するプラグインはこちらの「jquery.autoKana.js」が有名かと思いますが、Macのライブ変換でうまく動作しませんでした。
https://github.com/harisenbon/autokana

そこで、Macのライブ変換がONの場合でも動作する、ふりがな自動変換を作ってみました。

## 作ったもの

Macのライブ変換で勝手に入力文字が漢字に変換される場合でも、ふりがなを出力します。

![画面収録 2024-06-09 11.07.57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128429/7798b0a4-840a-0210-7503-d8479f2122b6.gif)


### デモサイト
ここで動作確認ができるはずです。
Github Pages を使ってみました。
https://int314.github.io/autoKana/

### コード
https://github.com/Int314/autoKana

## 使い方
dist/jquery.autoKana.min.jsを読み込んで、第1引数に入力元、第2引数に出力先の要素を指定します。

```js
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="./dist/jquery.autoKana.min.js"></script>
  <script>
    $(document).ready(function () {
      $('#nameInput').autoKana('#nameInput', '#hiraganaOutput');
      $('#nameInput').autoKana('#nameInput', '#katakanaOutput', { katakana: true });
    });
  </script>
```

## やったこと

ローマ字とひらがな（カタカナ）の辞書を作成して、`keyup`イベントの時に変換してます。
押されたキーを覚えておいて、辞書とマッチしたら出力するので、ライブ変換でもなんとか変換できるようになりました。

```js
return katakana ? katakanaMap[input] || '' : hiraganaMap[input] || '';
```

ローマ字とひらがなの辞書
```js
const hiraganaMap = {
  'a': 'あ', 'i': 'い', 'u': 'う', 'e': 'え', 'o': 'お',
  'ka': 'か', 'ki': 'き', 'ku': 'く', 'ke': 'け', 'ko': 'こ',
  'sa': 'さ', 'si': 'し', 'su': 'す', 'se': 'せ', 'so': 'そ',
  'ta': 'た', 'ti': 'ち', 'tu': 'つ', 'te': 'て', 'to': 'と',
  'na': 'な', 'ni': 'に', 'nu': 'ぬ', 'ne': 'ね', 'no': 'の',
  ...
```

ローマ字とカタカナの辞書
```js
const katakanaMap = {
  'a': 'ア', 'i': 'イ', 'u': 'ウ', 'e': 'エ', 'o': 'オ',
  'ka': 'カ', 'ki': 'キ', 'ku': 'ク', 'ke': 'ケ', 'ko': 'コ',
  'sa': 'サ', 'si': 'シ', 'su': 'ス', 'se': 'セ', 'so': 'ソ',
  'ta': 'タ', 'ti': 'チ', 'tu': 'ツ', 'te': 'テ', 'to': 'ト',
  'na': 'ナ', 'ni': 'ニ', 'nu': 'ヌ', 'ne': 'ネ', 'no': 'ノ',
  ...
```

一生懸命キーボードを打ち込み、辞書を作成しました...😅

## Viteを入れてみた⚡️

メインのjsとひらがな・カタカナ辞書を別のファイルにして整理したかったので、複数のjsをまとめるバンドラーを導入しました。
バンドラーはWebpackの記事が多くヒットしましたが、最近名前をよく聞くしカッコ良さそうなViteにしました。

ついでにMinifyもしてjsファイルを圧縮してます。

Viteの設定ファイルを以下のようにして、

```vite.config.js
import { defineConfig } from 'vite';

export default defineConfig({
  build: {
    rollupOptions: {
      input: 'src/jquery.autoKana.js',
      output: {
        entryFileNames: 'jquery.autoKana.min.js',
      }
    },
    outDir: 'dist',
    emptyOutDir: true,
    minify: true
  }
});
```

`npm run build`するとdistフォルダの配下に
- jquery.autoKana.js
- hiraganaMap.js
- katakanaMap.js

をまとめた`jquery.autoKana.min.js`が出力されるようになります。

最終的にこんな感じのフォルダ構成になりました。

```
.
├── dist
│   └── jquery.autoKana.min.js
├── index.html
├── src
│   ├── hiraganaMap.js
│   ├── jquery.autoKana.js
│   └── katakanaMap.js
└── vite.config.js
```