OmniAICreator/Qiita-1.07M huggingface dataset:
Fishシェルでサブディレクトリを一括作成する方法

# Fish シェルでサブディレクトリを一括作成する方法
## はじめに

[Fish](https://fishshell.com/)（friendly interactive shell）は、使いやすさとシンプルな構文を重視したコマンドラインシェルです。
他のシェルと比べて直感的なスクリプトを書けるため、開発者に人気があります。
この記事では、`fish` シェルを使用して複数のディレクトリに一括でサブディレクトリを作成する方法を説明します。

## 問題提起
多くの開発者は、`bash` や `zsh` などのシェルに慣れているため、`fish` シェルの異なる構文に戸惑うかもしれません。
例えば、以下の `bash` コマンドは `fish` では機能しません。

```bash
for d in */ do
    mkdir -p "$d/sub_folder"
done
```
なぜなら、`fish` シェルではループの構文が異なるからです。

## Fish シェルの基礎
`fish` は他のシェルとは異なるいくつかの特徴を持っています。
例えば、変数の展開にダブルクォーテーションは必要なく、代わりにスペースで変数を区切ります。
また、コマンドブロックは `end` で終了させます。

## 実践
以下の `fish` コマンドは、現在のディレクトリにある各サブディレクトリに `sub_folder` を一括で作成します。

```bash
for d in */
    mkdir -p $d/sub_folder
end
```
このスクリプトを実行すると、各ディレクトリに `sub_folder` が追加されます。

## まとめ

`fish` シェルは直感的で強力なツールです。
基本を学べば、 `bash` や `zsh` よりも簡潔にスクリプトを書くことができます。
この記事が `fish` での効率的なディレクトリ管理に役立つことを願っています。

## 参考リンク

- [Fish シェル公式ドキュメント](https://fishshell.com/docs/current/index.html)
- [Fish シェルチュートリアル](https://fishshell.com/docs/current/tutorial.html)
ターミナルでのディレクトリ操作

## はじめに
ターミナルでの操作備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇


## ターミナルでよく入力するもの

### カレントディレクトリのパスを表示
※カレントディレクトリ=今いる、ディレクトリ
```
pwd
```

### 今いるディレクトリにあるものを全て表示する
```
ls
```

### 指定したディレクトリに移動
```
cd directory_name
```

### 親ディレクトリに移動
```
cd ..
```

### ホームディレクトリに移動
```
cd ~
```

### カレントディレクトリに新しいディレクトリを作成する
```
mkdir directory_name
```

### 今のold_directoryからnew_directoryに移動
```
mv "old_directory" "new_directory"
```

### ディレクトリにあるファイル名を変更
```
mv old_filename.txt new_filename.txt
```

### ディレクトリ名を変更
```
mv old_filename.txt new_filename.txt
```

:::note warn
注意点
スペースや特殊な文字がある場合は""で囲う必要あり。
:::

:::note info
押さえておくべき点🧠
* 
:::

## 参考にしたサイト
[ディレクトリ/ファイル操作](https://qiita.com/nzzzz/items/86a4cabfdc76f6d7e6f2)
【Rails】ルーティングのネストとアソシエーションの違い

# 【Rails】ルーティングのネストとアソシエーションの違い

Railsは、リソースとそのルーティングの効率的な管理をサポートするために、ルーティングのネストとアソシエーションという2つの重要なコンセプトを提供しています。この記事では、これらの2つのコンセプトの違いについて詳しく説明します。

## ルーティングのネスト

ルーティングのネストは、主にRailsアプリケーション内でリソース間の親子関係を表現するために使用されます。これは、リソース同士の階層的な関係を反映させる方法です。ネストする必要がある主な場合は次のとおりです。

### 1. 親子関係のリソース

例えば、ブログアプリケーションを考えてみましょう。ブログには投稿（Post）とコメント（Comment）が含まれています。各コメントは特定の投稿に関連付けられており、これは親子関係を持つリソースです。ネストされたルーティングを使用すると、特定のコメントにアクセスするために投稿の情報も含めたURLを作成できます。

```ruby
resources :posts do
  resources :comments
end
```

上記のコードでは、`resources :comments` は `resources :posts` の内側に配置されており、コメントリソースは投稿リソースの下にネストされています。これにより、URLは `/posts/1/comments/2` のような形式になり、特定のコメントにアクセスできます。

### 2. 複数のリソース間の関連性

もう1つの一般的なケースは、複数のリソース間に階層的な関連性がある場合です。例えば、カテゴリ（Category）と製品（Product）がある場合を考えてみましょう。特定のカテゴリ内の製品にアクセスするためにネストされたルーティングが必要です。

```ruby
resources :categories do
  resources :products
end
```

この例では、`resources :products` は `resources :categories` の内側に配置され、製品リソースはカテゴリリソースの下にネストされています。これにより、特定のカテゴリ内の製品にアクセスするために `/categories/1/products/2` のようなURLを使用できます。

## アソシエーション

アソシエーションは、Railsのアクティブレコードモデル（データベーステーブル）間の関連性を表現する重要な概念です。アソシエーションはデータベース内のテーブル間のリレーションシップを定義し、データベース操作を簡素化します。以下は、アソシエーションの特徴とルーティングのネストとの違いです。

- **データベースレベルの関連性**: アソシエーションは、データベース内のテーブル（モデル）間の関連性を表現します。例えば、`has_many`、`belongs_to`、`has_and_belongs_to_many`などのアソシエーションを使用して、モデル間の関連性を定義します。アソシエーションを設定することで、モデル間のリレーションシップがデータベースに記録され、データベース操作が簡単になります。

- **ルーティングとURLの管理**: アソシエーションは、主にデータベース内のモデルのリレーションシップを管理するために使用されます。一方、ルーティングのネストは、クライアント（ブラウザなど）からのリクエストのルーティングに関連しています。ネストされたルーティングを使用することで、URLに親子関係を反映させ、特定のリソースにアクセスできるようになります。ルーティングのネストは主に、URLの形式を制御するために使用されます。

## まとめ

Ruby on Railsにおいて、ルーティングのネストとアソシエーションは異なるコンセプトであり、それぞれ異なる役割を果たします。ルーティングのネストは、リソースのURL形式を制御し、リソース間の親子関係を表現するために使用されます。一方、アソシエーションはデータベースレベルでのモデル間の関連性を定
Intellij プラグイン

よく使っているIntelliJプラグインを紹介

# AI assistant
コードの質問、スニペット生成、コミットメッセージの自動生成などが可能なAIアシスタント。
2023/11/07現在、順番にユーザーに開放されていくようだ。

# CheckStyle-IDEA
コードの静的解析プラグイン。
![Screenshot 2023-11-07 at 13.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300054/4f5577d5-753e-0c9a-88e4-4b2354962f42.png)


# GitLink
コードを右クリックしたとき、その部分をGithubなどで開くメニューを作ってくれる
![Screenshot 2023-11-07 at 13.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300054/5582a857-56ec-bc1a-2366-d2a220ee71e7.png)

# IdeaVim
IntelliJをviのキーバインドで操作可能にするプラグイン。
地味に`~/.vimrc`でのカスタマイズに対応しているのも嬉しいところ。

# PlantUML Integration
IntelliJ上でPlantUMLのプレビューや画像出力が可能になるプラグイン。

![Screenshot 2023-11-07 at 13.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300054/ca379418-4988-abe8-ad02-bf728464d605.png)

# Pokemon Progress

プログレスバーがポケモン仕様になる。かわいい。

![Screenshot 2023-11-07 at 13.11.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300054/9082951a-6409-f8d6-d2d2-5ce70ed35cde.png)
free-form RPG(フリーフォームRPG, FF RPG)初心者向けハンズオン資料

以下の資料はIBM Community 2023年 IBM i 技術者の広場チームによる成果物です。
初心者向けハンズオン資料の EOL/400をFF RPG版にアップデートしたものを中心にIBM i 初心者向けの情報を整理したものです。
リーダーのI社Nさん、サブリーダー中部システム牛田さんはじめ多くのチームメンバーの方々の活動成果です。ぜひご活用ください。。。

IBM i 技術者の広場 成果物一覧

■IBM i 初心者向け情報記事一覧
https://qiita.com/ibm_knowledge_mall/items/9ad69f32743a5c0481e4
IBM CJ 2023 C06-020 FF-RPG サンプルコード Index ページ
https://qiita.com/ibm_knowledge_mall/items/fe48a85daf1e969e70cb
020-010 前提条件及び環境構築
https://qiita.com/ibm_knowledge_mall/items/0536889104b90990e074
020-020 仕様書と各 CTL について
https://qiita.com/ibm_knowledge_mall/items/a64bbc4703dc9c5d8d39
020-030 帳票系プログラムその１（単純一覧
https://qiita.com/ibm_knowledge_mall/items/5b76d819775941626c63
020-031 帳票系プログラムその２（集計処理
https://qiita.com/ibm_knowledge_mall/items/86f2d2d5213fb7ddaaa9
020-032 帳票系プログラムその３（SQL を用いた応用
https://qiita.com/ibm_knowledge_mall/items/c1da675e50b13347b331
020-040 画面エントリー系その１
https://qiita.com/ibm_knowledge_mall/items/3fa43515b0e347a44ae6
020-050 ＦＦで許可されていない記述集１
https://qiita.com/ibm_knowledge_mall/items/0eaf695edbc44920730d
FF-RPG プログラミング・サンプル
https://github.com/IBMCJ-2023-C06/020-FF_RPG_samples

（以下注記）
本資料の著作権は、日本アイ・ビー・エム株式会社（IBM Corporation を含み、以下、IBM といいます。）に帰属します。
ワークショップ、セッション、および資料は、IBM またはセッション発表者によって準備され、それぞれ独自の見解を反映したものです。それらは情報提供の目的のみで提供されており、いかなる参加者に対しても法律的またはその他の指導や助言を意図したものではなく、またそのような結果を生むものでもありません。本資料に含まれている情報については、完全性と正確性を期するよう努力しましたが、「現状のまま」提供され、明示または暗示にかかわらずいかなる保証も伴わないものとします。本資料またはその他の資料の使用によって、あるいはその他の関連によって、いかなる損害が生じた場合も、IBM またはセッション発表者は責任を負わないものとします。 本資料に含まれている内容は、IBM またはそのサプライヤーやライセンス交付者からいかなる保証または表明を引きだすことを意図したものでも、IBM ソフトウェアの使用を規定する適用ライセンス契約の条項を変更することを意図したものでもなく、またそのような結果を生むものでもありません。
本資料で IBM 製品、プログラム、またはサービスに言及していても、IBM が営業活動を行っているすべての国でそれらが使用可能であることを暗示するものではありません。本資料で言及している製品リリース日
付や製品機能は、市場機会またはその他の要因に基づいて IBM 独自の決定権をもっていつでも変更できるものとし、いかなる方法においても将来の製品または機能が使用可能になると確約することを意図したも
のではありません。本資料に含まれている内容は、参加者が開始する活動によって特定の販売、売上高の向上、またはその他の結果が生じると述べる、または暗示することを意図したものでも、またそのような結果
を生むものでもありません。 パフォーマンスは、管理された環境において標準的な IBM ベンチマークを使用した測定と予測に基づいています。ユーザーが経験する実際のスループットやパフォーマンスは、ユーザーのジョブ・ストリームにおけるマルチプログラミングの量、入出力構成、ストレージ構成、および処理されるワークロードなどの考慮事項を含む、数多くの要因に応じて変化します。したがって、個々のユーザーがここで述べられているものと同様の結果を得られると確約するものではありません。
記述されているすべてのお客様事例は、それらのお客様がどのように IBM 製品を使用したか、またそれらのお客様が達成した結果の実例として示されたものです。実際の環境コストおよびパフォーマンス特性は、
お客様ごとに異なる場合があります。
IBM、IBM ロゴは、米国やその他の国における International Business Machines Corporationの商標または登録商標です。他の製品名およびサービス名等は、それぞれ IBM または各社の商標である場合があります。現時点での IBM の商標リストについては、ibm.com/trademark をご覧ください。
展現海外實習的國際視野：如何在英文履歷中脫穎而出


在今天競爭激烈的就業市場中，具有國際視野的經驗對於一個應聘者來說非常重要。其中一個最佳方式就是透過[海外實習](https://www.apexcharity.org/news/3/87)來獲取寶貴的國際工作經驗。然而，將這些經驗有效地展現在你的英文履歷（[CV](https://www.apexcharity.org/news/3/88)）中，以吸引潛在的雇主，並在[Statement of Purpose](https://www.apexcharity.org/news/3/90)中表現出你的熱忱和專業，是一項挑戰。本文將指導你如何在[英文履歷](https://www.apexcharity.org/news/3/91)中突顯你的海外實習經驗，以及在Statement of Purpose中展示你的國際視野。

海外實習的價值
在開始談論如何在英文履歷中展現海外實習經驗之前，讓我們先明確一下海外實習對於你的職業生涯的價值。海外實習不僅能夠豐富你的專業技能，還能夠增加你的國際視野，開拓你的人際網絡，並提升你的跨文化溝通能力。這些技能和經驗對於許多行業都非常重要，特別是在全球化的今天。

如何在英文履歷中展現海外實習經驗
突顯實習內容：在你的英文履歷中，確保清楚地列出你在海外實習期間的工作職責和成就。使用具體的例子來說明你在實習中所學到的技能和知識，並強調這些如何與你應聘的職位相關。

語言能力：如果你在海外實習中學習了新的語言或提高了現有的語言能力，一定要在英文履歷中將這一點突顯出來。語言技能對於國際職位非常重要，因此不要忽略這一方面。

跨文化經驗：強調你在海外實習中所獲得的跨文化經驗。這包括你如何適應新的文化和工作環境，以及如何處理跨文化合作和交流的挑戰。

Statement of Purpose中的國際視野
Statement of Purpose是一個展示你為什麼適合應聘職位的機會，同時也是一個展示你的個性和熱忱的機會。在這個文件中，你應該強調你的國際視野是如何影響你的職業目標和價值觀的。

強調國際經驗：在Statement of Purpose中，分享你在海外實習中的精彩經歷，並解釋這些經驗如何塑造了你的職業方向。強調你如何運用這些國際經驗來解決問題和創建價值。

展示國際視野：表明你對全球事務和國際問題的關注，以及你如何計劃在未來的職業生涯中貢獻你的國際視野。這可以包括參與國際項目、跨國合作，或者尋求在國際組織工作的意願。

強調多元性：強調你的多元性和包容性觀點，以及你如何在不同文化背景下工作和合作。這將顯示你的國際視野不僅僅是理論上的，而且在實際工作中能夠發揮作用。

展現海外實習的國際視野需要巧妙地將你的經驗和價值觀融入到英文履歷和Statement of Purpose中。通過清晰地傳達你的國際經驗和對全球事務的關注，你可以在就業市場中脫穎而出，吸引潛在的雇主，並實現你的職業目標。
ESLint×Prettierでtype importを自動で追加する

## 実施内容
ESLintとPrettierを組み合わせてTypeScriptのimport文にtypeキーワードを自動で追加する方法をやってみました。
この設定は、型のみをインポートする場合とその他のインポートを区別するのに有効です。

## 準備
この設定を行う前に、以下のツールがインストールされていることを確認してください。

- Node.js（推奨バージョン16以上）
- Next.js（13.5）
- ESLint（最新バージョン）
- Prettier（最新バージョン）
- TypeScript(推奨バージョン4.9以上)

## 実装手順

### ESLintの設定
`@typescript-eslint/eslint-plugin`と`@typescript-eslint/parse` パッケージをプロジェクトにインストールします。

```bash
npm install @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest --save-dev
```

次に、.eslintrc.json(js) ファイル（またはプロジェクトに合ったESLint設定ファイル）を開き、次の設定を追加します。

```json
{
  "extends": [
    "next",
    "next/core-web-vitals",
    "prettier",
    "plugin:@typescript-eslint/recommended" // こいつがないと動かないです
  ],

  "rules": {
    "import/first": "error",
    "import/newline-after-import": "error",
    "unused-imports/no-unused-imports": "error",
    "@typescript-eslint/consistent-type-imports": "warn", // ここで型インポートの場合でtypeが入っていない場合warnningに設定
    "@typescript-eslint/no-explicit-any": "off",

    //...(略)
}
```

このルールは、型のみのインポートに自動で type を追加するようESLintに指示します。

### エディタの設定
VSCodeなどのエディタにESLintプラグインがインストールされている場合、ファイル保存時に自動的にESLintの修正を適用するように設定します。

VSCodeの settings.json に以下を追加します。

```
// ファイル保存時、ESLint による自動フォーマット
  "editor.codeActionsOnSave": {
    // 不足しているimportの追加
    "source.addMissingImports": true,
    "source.fixAll": true
  },
```

これで、ファイルを保存するたびにESLintのルールに従ってコードが自動修正されます。

### 結果
上記の設定を行うことで、プロジェクト内のTypeScriptファイルにおいて、型のみのインポートに自動的に type キーワードが付与されるようになりました。

### 参考
ESLint - @typescript-eslint/consistent-type-imports

https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/consistent-type-imports.md
【ChatGPT】OpenAI DevDayについて、ちょっとだけ


　どうも、カーブミラーです。

　今回は、OpenAIが行なったOpenAI DevDayについて、書きます。すべてを網羅してはいません。私は開発者ではないので（謝）

:::note info
本記事は、OpenAI DevDayの内容
の一部だけを取り上げています。
あしからず。
:::

　深夜、
　　（日本時間2023/11/07 AM3時）
　　　OpenAIが、
　　　　OpenAI DevDayを
　　　　　開催しました。

　Devとは、Developerの略。
　　つまり、開発者や開発企業を
　　　指します。

　一般ユーザー向けの
　　ものではありません。

　それでも
　　簡単なチェックは
　　　しておいても、
　　　　いいかと思います。

　一般ユーザーに
　　有益な情報もありましたから。
***
　詳細は、
　　きちんとした
　　　記者さんたちに
　　　　任せますw

　今はまだ、
　　英語の情報を
　　　翻訳して、その情報に
　　　　アップアップしている
　　　　　ところでしょう。
　　　　　　頑張って！

　ちなみに、
　　この動画は、
　　　You Tubeにも流されています。
[OpenAI DevDay, Opening Keynote](https://www.youtube.com/live/U9mJuUkhUzk?si=PFvxzZRaCofRlxtH)
　　　　およそ45分です。

　もちろん、
　　全編、英語ですw

　オイラ、これが
　　ふつうの時間でなら
　　　見ていたでしょう。
　　　　英語はわからんけどw

　動画だけでなく、
　　OpenAIのサイトでも
　　　文字媒体で読めます。
　　　　全編、英語ですけどw

　オイラは、
　　Google翻訳で
　　　読みましたv

　で、ふたつほどの
　　速報記事も読んだのですが、
　　　うん、開発者向けだわ。
　　　　よくわからん＿|￣|○

　それでも
　　いくつかの
　　　有益な情報を
　　　　得られました。
***
　私が有益だと思ったのは

　・GPT-4の知識が、
　　　2023年4月になること。
　　　　すでに、なっています。
　　　　　web版で確認しました。

　・GPT-4の
　　　コンテキスト長が
　　　　128000トークンに
　　　　　拡張される。
　　　これは、英語のレポートの
　　　　300ページ越えに
　　　　　相当するらしい。
　　　日本語だと、
　　　　半分以下だろうから
　　　　　100～150ページ？
　　　動画を見ましたけど、
　　　　プログラムかと思うような
　　　　　プロンプトが表示
　　　　　　されていました。

　・「GPTs」と「GPT Store」から
　　　さまざまなカスタムChatGPTが
　　　　利用可能になる。
　　　　　（まだ将来は見えません）

　・SEED値による再現性。
　　　これはDALL-E3での話だと
　　　　思います。以前から
　　　　　言われていましたので。
　　　再現性とは言っても
　　　　かなり似ている、
　　　　　というレベルです。
　　　もちろん、勘違いの可能性も
　　　　あります。間違ったら
　　　　　ごめんなさい。

　・無料版へのアップデートは
　　　ないそうです（当然ですね）
　　　　ですが、
　　　ChatGPT無料版の知識は
　　　　2022年1月になっています。
　　　　　多少、知識が更新
　　　　　　されているわけです。
***
　とりあえず、
　　こんなところです。

　まず、
　　知識の更新が
　　　ありがたいところですね。

　しかし、
　　コンテキスト長が
　　　拡張されたのは、いいけれど、
　　　　プロンプトが
　　　　　プログラム的な
　　　　　　感じになるのか。

　ということは、
　　プロンプトエンジニアは
　　　プロンプトプログラムを
　　　　することになるわけですね。

　すべての
　　開発者さんや開発会社さん、
　　　頑張って、我々に役に立つ
　　　　ものを開発してください。

　今回は、ここまで。
***
　ちなみに。

 　ここQiitaでは、ほかにも
　　「おも たく」さんが
　　　記事を書かれていました。
   
・[11/6 | OpenAI DevDay 2023の発表まとめ [ChatGPTがすごい]](https://qiita.com/omo_taku/items/0b013e5e367df749be53)

・[ついにきた！「GPT-4 Turbo」vs「GPT-4」](https://qiita.com/omo_taku/items/f027a32f461b0b6cc71c)

・[GPT Storeって何？](https://qiita.com/omo_taku/items/ed80718e7344fea578cd)


ほかにも
「@KinjiKawaguchi」さん
[OpenAIDevDay2023 最新アップデート(概要)まとめ-](https://qiita.com/KinjiKawaguchi/items/b7e141c22d5cfdc6ea0c)

「@harrythecode」さん
[[ここまで進化したChagGPT！] 今日から何がどう変わるのか [2023年11月最新版]](https://qiita.com/harrythecode/items/452a15076420bd1aed31)
PowerPoint スライドごとにpdfを分けて保存する

# スライドごとにpdfを分けたい
論文を書くときにPowerPointで図を作成している。しかし、画像として保存してしまうと、ラスタライズされてしまう。そこで、ラスタライズされないようにpdfで出力するのだが、pdfで出力すると複数のスライドが一つのpdfにまとめられてしまう。
オンラインサービスには分割サービスがあるが、そもそも論文に使う画像をネットワークにアップロードしなければならないのは気持ち悪い。
そこで、パワーポイントのみでなんとかできないと試行錯誤したので、今後のために備忘録として残しておく。

# 解決策
スライドを非表示にすれば、pdfファイルに入らなくなる。
なので、印刷したいスライド以外をすべて非表示にすれば、印刷したいスライドのみをpdf化することができる。
プロンプトエンジニアリング１

　今回は、プロンプトエンジニアリングの基礎ということでできることをまとめてみました。
 ・Zero-shotプロンプト
 ・One-shotプロンプト
 ・Few-shotプロンプト
 ・Chain-of-Thoughts
 ・Self-Consistency(自己整合性）
 ・Tree-Of-Thoughts
 
# Zero-shotプロンプト
  例を与えずに即座に実行してもらうスタイル

#  ・One-shotプロンプト ・Few-shotプロンプト
  こちらはいくつか例を与えて実行するスタイル

# Chain-of-Thoughts
  思考の過程を書く方法 

# Self-Consistency(自己整合性）
　出力結果の多数決を行い最終的な出力結果にする。

# Tree-Of-Thoughts
　思考のツリーを維持し、思考は問題解決に向けた中間ステップとして機能する一貫した言語シーケンスを表します。このアプローチにより、LMは、意図的な推論プロセスを通じて、中間的な思考が問題解決に向けてどのような進歩を遂げているかを自己評価することができます。思考を生成して評価するLMの機能は、検索アルゴリズム(幅優先検索や深さ優先検索など)と組み合わされ、先読みとバックトラックによる思考の体系的な探索を可能
anacondaでmatplotlibの日本語化を使いたい

# はじめに
仕事でmatplotlibを使用してグラフ作成をするのだが、日本語化が必要な場面にでくわしてしまった。
色々調べてもうまくいかないことが多いので、そのあたりのメモを残しておく。

## 最終的にうまくいった方法
とりあえず、自分の環境でうまくいった方法を記す。
以下のサイトを参考にした。
https://qiita.com/mookouchi/items/2252d3a04109210aed61#%E6%89%8B%E9%A0%86

```
from matplotlib import font_manager
for i in font_manager.fontManager.ttflist:
    if ".ttc" in i.fname:
        print(i)
```
↑のように.ttcファイルと書かれているものの中から、使えそうなフォントを選んだ。自分の場合は"Noto Serif CJK JP", "Noto Sans CJK JP"しかいなかったので、この二つを使用したところ、"Noto Sans CJK JP"で日本語が使用可能だった。(本当はMS明朝とかが使用したかったのでが...)

一応、matplotlibのversionは3.8.1であったことを書いておく。


以降には、他の試した方法を記載する。

## matplotlibのパラメータ設定をいじる
以下のサイトを参考にした。
https://qiita.com/yniji/items/3fac25c2ffa316990d0c#%E5%80%8B%E5%88%A5%E3%81%AB%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B

matplotlibのrcParamsの設定をいじってもだめ、anacondaのmatplotlibrcファイルを直接弄ってもだめだったので、今回はあきらめ

以前、別の環境ではrcParmをいじってうまく作成できた覚えがあるので、matplotlibの現在のバージョンにそもそも日本語のファイルが入っていないのでは？と考えている。


## 日本語化対応されたパッケージをインストールする
japanize_matplotlibというのが、どうも日本語化を入れる内容らしい。
しかし、以下のサイトで書かれている通り、conda経由で入れるのは難しいらしく、pipで入れてからというのも面倒なので今回は見送り。
https://teratail.com/questions/364824



# 終わりに
とりあえず、上手く日本語化は出来たので良かった。
日本語化のパッケージをcondaに持ってくる方法はどこかで調べておきたいところ
AndroidStudio: Room の使い方 （その2）

こちらの記事と同じことを行いました。
[AndroidでRoomを使ってデータベース](https://qiita.com/cozyk100/items/f3862c7f65e54e953451)

コードは、次のように取得しました。

```bash
git clone https://github.com/cozyk100/AndroidStudioProjectsPublic.git
```

その中の RoomKotlin というプロジェクトを使いました。

Ksp (Kotlin Symbol Processing API) を使うようにしました。

## プロジェクトの作成
プロジェクト名: Room02

## 環境

```build.gradle.kts_Project_Room02
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id("com.android.application") version "8.1.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
    id("com.google.devtools.ksp") version "1.9.20-1.0.14" apply false
}
```

```build.gradle.kts_Module_app
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")
}
（省略）
android {
（省略）
    buildFeatures {
        viewBinding = true
    }
}

dependencies {
    val room_version = "2.6.0"

    //Room

    implementation("androidx.room:room-runtime:$room_version")
    ksp("androidx.room:room-compiler:$room_version")
    implementation("androidx.room:room-rxjava2:$room_version")
    implementation("androidx.room:room-rxjava3:$room_version")
    implementation("androidx.room:room-guava:$room_version")
    testImplementation("androidx.room:room-testing:$room_version")
    implementation("androidx.room:room-paging:$room_version")

    // 非同期
    implementation("io.reactivex.rxjava2:rxjava:2.2.21")
    implementation("io.reactivex.rxjava2:rxkotlin:2.4.0")
    implementation ("io.reactivex.rxjava2:rxandroid:2.1.1")

    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.10.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}
```

## 画面
次は、 RoomKotlin のプロジェクトのものをそのままコピーしました。

activity_main.xml
my_test_view.xml
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e9baad37-206a-4b17-dd5f-d978ae1d5487.png)


## プログラム
ツリー構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/62fb8857-e3a7-01b3-481a-055998de593c.png)

RoomKotlin のプロジェクトのものを
com.example.room -> com.example.room02 と書き変えました。

MainActivity.kt
MyAdapter.kt
dao/DeptDao.kt
dao/UserDao.kt
dao/UserViewDao.kt
db/AppDatabase.kt
entity/Dept.kt
entity/User.kt
entity/UserView.kt

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8326dfcc-01b5-3fa4-d109-98159db20eef.png)

## App Inspection の使い方
View -> Tool Windows -> App Inspection
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/3d33b3da-b08f-dab8-e95b-67185de206c6.png)

User_view を表示したところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/fe3d11e3-95c6-9720-b7c3-2d7acab79836.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/90dfa285-fcf1-1fd6-2c7a-6c842bf89b81.png)
GPT Storeって何？


「GPT Store」とは、AIを自分で作って世界に発信できる新しいプラットフォームです。

プログラミングが苦手な方でも大丈夫。GPT Builderというツールで、簡単にカスタマイズ可能なAIを作れます。

## 自分だけのAI、どう作るの？

まず、GPT Builderにアイデアを伝えます。それから、あなたのGPTに知識や振る舞いを教えるためのファイルをアップロード。

これで、例えばあなたのレシピやお気に入りの本に基づいたAIを作ることができます。

## それって売れるの？

はい、GPT Storeに作ったAIを出品し、使われるたびに収益を得ることができます。iPhoneのApp Storeみたいな感じですね。

## 他に便利な機能は？

- **JSONモード**: APIのレスポンスをJSONで得られるようになり、開発が楽に。
- **Function callingの改良**: 複数の機能を同時に呼び出せる。
- **スレッド機能**: 長い会話を管理しやすく。
- **Retriaval機能**: ファイルからの情報を簡単に取り込む。

これからのGPT Storeがとても楽しみですね！
Oracle Analytics Cloud：ビルトインのAI機能で項目の説明を表示する

# はじめに
Oracle Analytics Cloud（**OAC**）には、様々なビルトインのAI・機械学習機能が組み込まれています。
今回は、データセットの説明機能を紹介します。

# データセットの説明機能
データセットには、複数の項目（列）が含まれます。
データセットの編集画面を開くと、サンプリングしたデータを使用してデータの中身をある程度可視化してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a18d0809-0783-e83c-e4c4-7c6bec7b0af9.png)

データセットの説明機能では、それぞれの項目（列）について、ワークブック上でさらに詳細な説明を表示してくれます。

# ワークブックを作成
## 属性項目の説明
任意のデータセットを使用して新しくワークブックを作成します。
この中の「チャネルカテゴリ」を右クリックして「チャネルカテゴリの説明」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f4dcdad3-dca2-ad24-3507-72ef39c12e57.png)

:::note
別の項目、例えば「都道府県」を右クリックすると、「都道府県の説明」というメニュー項目名となります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/aa330637-800f-f296-8af0-ff37f08ce10e.png)

気になるグラフがあった場合、右上をクリックするとキャンバスにコピーすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1dfdcb5c-0aca-9954-6faa-a26db58031a1.png)

他にも、値の分布状況や予測値からの乖離などを教えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/f30494cd-411b-c0b2-0386-7b5044a37bab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/dc5785f6-09da-8260-36bd-61fc392d2de3.png)

## メジャー項目の説明
次に、メジャー項目の説明を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b503dd0e-5307-77e7-f65c-f5be9c73f0f3.png)

様々な属性項目との組み合わせを表示してくれました。
ここから分析のヒントが得られるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ba51620c-869f-51c4-cc0d-187f2368cbaf.png)

# 注意点など
一意の値を多く含む項目に対しては実施できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/c713759a-42eb-edef-ee4b-1ee80be94bf0.png)

また、サブジェクト領域を直接参照している場合も、この機能は使用できません。
サブジェクト領域で検索した結果を使用したい場合は、一旦データセットを作成し、そのデータセットに対して適用してみてください。

# その他のチュートリアル

https://docs.oracle.com/en/cloud/paas/analytics-cloud/tutorial-explain-employee-attrition/#before_you_begin
西暦から年号の求め方

# 初学者の備忘録
初学者の備忘録です。今回は西暦から平成や昭和の年号を求める計算式を記録しておきます。

## 考え方
平成は西暦と比較して1988年差があります。なので西暦から1988を引くか、平成年号に1988年足すことで求められます。
昭和も考え方は同じで差が1925年になります。


## 計算式

今回は現在の西暦から引き算で平成年号求める方法を記録しておきます。
現在の西暦を出力させる関数があるのでそれを利用していきたいと思います。

```javascript
//　現在の日時を取得するコード
var today = new Date();
// 上記のコードで取得した日時で西暦だけを変数に格納
var seireki = today.getFullYear();

// 改行しないで出力させる
process.stdout.write(`西暦${seireki}年は`);

// 西暦と平成の差が1988だから変数に格納されている西暦年数から引き算をする
var heisei = seireki - 1988;

// 結果が出力される
console.log(`平成${heisei}年です`);
```
上記のコード一覧が現在の西暦から平成年号を計算する方法です。昭和を求めたい場合は1988ではなくて1925に変更するだけで可能です。


## 最後に
学習する前は西暦から平成年号を求めるというだけで難しそうに感じましたが、実際学習してみると便利な関数もありますし理屈も簡単なので理解しやすかったですね。これを実用させようとすると工夫が必要かもしれませんが。
今回の学習はおまけ要素くらいの気持ちで覚えて置ければいいなと思います。
以上で終了したいと思います。お疲れ様でした。
おすすめのフォントファミリー


# おすすめのフォントファミリー

このフォントファミリーの指定が推奨される理由は、以下のポイントとなります。

### 1. **多様なOSのサポート**:
指定されたフォントの中には、**ios,android** 、macOSやWindowsなど、主要なオペレーティングシステムで広くサポートされているものが含まれています。これにより、さまざまなユーザーに対して一貫した視覚体験を提供できます。

### 2. **言語の互換性**:
英語圏向けには「Helvetica Neue」と「Arial」が、日本語圏向けには「ヒラギノ角ゴ ProN」、「ヒラギノ Sans」、そして「Meiryo」が含まれています。これにより、英語と日本語のテキストがどちらも適切に表示されるようになります。

### 3. **フォントの可読性**:
フォントはすべて高い可読性を持ち、プロフェッショナルな文書やウェブコンテンツに適しています。

### 4. **フォールバックの確保**:
どの指定フォントも使用できない場合に備えて、「sans-serif」がフォールバックオプションとして含まれており、最終的にはブラウザのデフォルトのサンセリフフォントが適用されます。

<font color="red">このフォントは、さまざまなユーザー環境に柔軟に対応しつつ、見た目が清潔感があり、プロフェッショナルなデザインを実現するためのものです。</font>




```css:style.css
    body {
      font-family: "Helvetica Neue", Arial, "Hiragino Kaku Gothic ProN",
        "Hiragino Sans", "Noto Sans", Meiryo, sans-serif;
    }
```
:::note info

**font-family**の値はブラウザが左から順にフォントを探し、利用可能な最初のフォントを選択します。もし最初のフォントが利用不可であれば、次のフォントが探されます。これをフォントスタックと言い、特定のフォントが表示できない環境でも、次善のフォントでテキストが表示されるようにします。

具体的には以下のような順番でフォントが設定されています。
:::


**指定されたフォントがどのオペレーティングシステムに含まれているか、以下にまとめます：**

# 1. **"Helvetica Neue"（英語フォント）**
   1. **通常、iOS ,macOSにプリインストールされています。**
   1. **WindowsやLinuxでは標準では含まれておらず、別途ライセンスを購入してインストールする必要があります。ヘルベチカ ノイエとは、ヘルベチカの改良版で、より洗練されたデザインのサンセリフフォントです。**


![Aspose.Words.be544b39-52c2-471c-b1f7-24fa454281c5.001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576094/5a9fbb09-62bb-b931-f11d-1d723f883f63.png)


# 2. **Arial（英語フォント）**
   1. **ios,android,Windows, macOS, そして多くのLinuxディストリビューションに標準でインストールされています。アリアルは広く普及しているサンセリフフォントで、多くのシステムにデフォルトでインストールされています。**

![Aspose.Words.be544b39-52c2-471c-b1f7-24fa454281c5.002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576094/7f55f7c4-0524-231c-7e43-bfcea6520de6.png)



# 3.**"Hiragino Kaku Gothic ProN" と "Hiragino Sans"（日本語フォント）**
   1. **これらは日本語フォントで、macOSに標準でインストールされています。**
   2. **WindowsやLinuxでは標準では含まれておらず、macOS以外でこれらのフォントを使いたい場合は、アプリやサービスによって提供されるか、別途ライセンスを購入してインストールする必要があります。**

![Aspose.Words.be544b39-52c2-471c-b1f7-24fa454281c5.003.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576094/e19f7578-0701-aae4-e6d4-1e8b8de229a7.jpeg)!

# 4.**Noto Sans（日本語android用）**

**これらはHiragino Kaku Gothic ProN" と "Hiragino Sansに近いandroid用の日本語フォントで、標準でインストールされています。**

# 5. **Meiryo（日本語フォント）**
   1. **Windows Vista以降のバージョンに標準でインストールされている日本語フォントです。**
   1. **macOSやLinuxでは標準では含まれていません。**

![Aspose.Words.be544b39-52c2-471c-b1f7-24fa454281c5.004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576094/8ddc75b3-ed87-8299-89c0-2a301a9a9003.png)


# 6. **sans-serif**
   1. **これはフォントの名前ではなく、ブラウザなどに必ず指定されています**

**Windowsユーザーの場合は、英語ではArialやSegoe UIが使用され、日本語ではメイリオやUゴシックが使用されることが多いです。**
【python】groupbyが遅くってェ…


# やりたいこと
あるグループごとの平均と標準偏差を求めたい。  
```python
df1.columns # ['クラス','番号','名前','性別','科目','点数']
```
↑こんなかんじのdfを使う。  
行数は約5,000行。  

ちなみにpythonのgroupbyは初めて使いました！  
SQLはあるのだけども。  

# 第1案
よくわからないまま調べて、動いたものを採用。

```python
st_tm1 = time.time()
df_g = pd.DataFrame()
for group, df_group in df1.groupby(['クラス', '科目']).__iter__():
    # 計算
    lll = df_group['点数'].tolist()
    df_group['Xbar'] =np.mean(lll) 
    df_group['s'] =statistics.stdev(lll)
    # 結合
    df_g = pd.concat([df_g, df_group], axis=0)
df1 = df_g.copy()
logger.info("Elapsed time: {:,.3f} sec".format(time.time() - st_tm1))

# 結果
# Elapsed time: 31.139 sec
```
おっそい！

# 第2案

for使うから遅くなるのだと思い、forを使わない方法を探す。

```python
st_tm1 = time.time()
gcol = ['クラス', '科目']
# 計算
a=df1.groupby(gcol, as_index=False)
a1 = a.mean(numeric_only=True)[['クラス', '科目','点数']].rename(columns={'点数': 'Xbar'})
a2 = a.std(numeric_only=True)[['クラス', '科目','点数']].rename(columns={'点数': 's'})
# 結合
df1 = pd.merge(pd.merge(df1, a1,on = gcol), a2,on = gcol)
logger.info("Elapsed time: {:,.3f} sec".format(time.time() - st_tm1))

# 結果  
# Elapsed time: 0.133 sec
```
それなり。
もうすこしスマートに書けないかと思い始める。


# 番外編
そういやlambdaってあったよね、を実践。 

```python
st_tm1 = time.time()
gcol = ['クラス', '科目']
# 計算
a1 = lambda df1, gcol,c_c = {'点数': 'Xbar'}: df1.groupby(gcol, as_index=False).mean(numeric_only=True)[gcol+list(c_c.keys())].rename(columns=c_c)
a2 = lambda df1, gcol,c_c = {'点数': 's'}: df1.groupby(gcol, as_index=False).std(numeric_only=True)[gcol+list(c_c.keys())].rename(columns=c_c)
# 結合
df1 = lambda df, a1: pd.merge(df1, a1,on = gcol)
df1 = lambda df, a2: pd.merge(df1, a2,on = gcol)
logger.info("Elapsed time: {:,.4f} sec".format(time.time() - st_tm1))

# 結果  
# Elapsed time: 0.0077 sec

# ただし df1 の中身は下記のようになっている
# <function <lambda> at 0x0000020233501EE0>
```
変数に式が代入されてるのでそもそも計算していませんでしたオチ。  
何やってんだろう……で終わる。


# 第3案
transformというものを知ったので使ってみる。

```python
st_tm1 = time.time()
gcol = ['クラス', '科目','点数','Xbar','s']
# 計算と結合
df1[gcol[3]] = df1[gcol[:3]].groupby(gcol[:2]).transform("mean")[gcol[2]]
df1[gcol[4]] = df1[gcol[:3]].groupby(gcol[:2]).transform("std")[gcol[2]]
logger.info("Elapsed time: {:,.4f} sec".format(time.time() - st_tm1))

# 結果  
# Elapsed time: 0.0523 sec
```
短くなったし分かりやすくなった！  

ところで下記のように書くとFutureWarningが出ました。  
```python
df1[gcol[3]] = df1.groupby(gcol[:2]).transform("mean")[gcol[2]]
df1[gcol[4]] = df1.groupby(gcol[:2]).transform("std")[gcol[2]]
'''
FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only 
columns which should be valid for the function.
'''
```
第2案の場合はmean(numeric_only=True)のように書いて対処できたのだけれど、transformの引数にnumeric_onlyはないようです。 
https://github.com/pandas-dev/pandas/issues/50538

でもnumeric_onlyが云々ってことは文字列が計算時に含まれることが悪いんだろうと思って、使う列をグループに使う列と計算したい数値列だけにしたところ、警告が出なくなりました。 
どっちかというとSerieasにしたから出なくなった気がします。  

# 結論
一番早くなった第3案で行こうと思いました。
30秒も0.05秒になったし、とりあえずこれくらいがベストと思って終焉。

# 参考
https://analytics-note.xyz/programming/pandas-groupby-transform/
[Laravel] テスト時にユーザー情報が更新されない問題の対処法

## 問題⚠️

テスト中は、**認証済みユーザーの情報がキャッシュされる**ため、
最新のユーザー状態が反映されないことがある。

## 解決策✅

**現在の認証済みユーザーをリフレッシュする**ことで、この問題を回避する。

```php
Auth::user()->refresh();
```

https://laravel.com/docs/10.x/eloquent#refreshing-models
緯度・経度の一括取得

前回スクレイピングをした東京都のカーディーラー住所リストを使って地図にプロットしたいと思います。

地図にプロットするために、Google Geocoding APIを使って緯度・経度をcsvファイルの列に追加します。
GeocodingのWEBサイトにいってAPIキーの取得が必要です。

元のファイルはGoogle Driveにおいています。
次回は実際に地図にプロットしていきます。

```
from google.colab import drive
drive.mount('/content/drive')

import requests
import csv

api_key = "APIキー"
input_csv_file = '/content/drive/ファイルパス/元のファイル名.csv'
output_csv_file = '/content/drive/ファイルパス/新しいファイル名.csv'

with open(input_csv_file, 'r', encoding='shiftjis') as csv_file:
    csv_reader = csv.reader(csv_file)
    data = list(csv_reader)

with open(output_csv_file, 'w', encoding='shift_jis', newline='') as new_csv_file:
    csv_writer = csv.writer(new_csv_file)

   csv_writer.writerow(["Shop Name", "Address", "Latitude", "Longitude"])

    for row in data[1:]:
        shop_name, address_tokyo = row[0], row[1]

        encoded_address = requests.utils.quote(address_tokyo)

       url = f"https://maps.googleapis.com/maps/api/geocode/json?address={encoded_address}&key={api_key}"
        response = requests.get(url)
        geocoding_data = response.json()

        if geocoding_data["status"] == "OK" and len(geocoding_data["results"]) > 0:
            location = geocoding_data["results"][0]["geometry"]["location"]
            latitude = location["lat"]
            longitude = location["lng"]
        else:
            latitude = ""
            longitude = ""

       csv_writer.writerow([shop_name, address_tokyo, latitude, longitude])
```
![スクリーンショット 2023-10-29 222542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3615177/1233399f-c6ae-d865-d989-99d9c34e7e02.png)
MagicPodを使って本番環境で定期実行してみた

# はじめに
こんにちは。QAエンジニアをしている田井です。

以前の[記事](https://qiita.com/taikohei/items/578e19ecd584ea826d42)でステージング環境で自動化を進めている話をしましたが、今回は本番環境で定期実行をしているお話をします。

# 目的
弊社のアプリはフォトブックを作るアプリなのですが、本番環境でアクセスが集中すると、プレビューが表示されなかったり、決済でエラーになることがあります。
エンジニアが導入したアラートなどでも検知できるのですが、QAとして何かできないかと考え、MagicPodで定期実行をすれば目的を達成できるのではということになり、進めることにしました。

ただし、新たに準備工数やメンテナンスコストがかかることはしたくなかったので、ステージングで使っている回帰テストケースを流用することにしました。

ステージングでは多くのシナリオを運用していますが、本番環境では最低限の動作確認をすることとしたので、通常のユーザーが使うであろうログインから、写真のアップロード、注文までのフローを1時間毎に行うセット(タグ管理)を作りました。

# 実装
テストケースはステージングの回帰テストをそのまま使っています。タグをつけて実施内容を選定しました。
プレビューが表示されない場合、決済エラーなどの確認は、**画像差分の機能**を使いました。

ただ、既存のシナリオはキャプチャを保存して目視で確認をしていたので、完全に自動化されていなかった問題があり、この画像差分の機能を使うことで、目視でも確認も不要となり完全な自動化に成功しました。

![スクリーンショット 2023-11-06 19.24.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151058/1e3e38d5-1a2e-95d4-6719-1a917055d583.png)

この画像差分機能はとても便利で、許容不一致率というのを設定できます。この数値が低いほど細かい差分でも検知してくれます。

![スクリーンショット 2023-11-06 19.45.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151058/5ba1ce9a-02f0-6bac-69c6-0b063b281349.png)

これにより、プレビューに想定した画像が表示されてない場合、決済でエラーが表示されてしまう場合に検知できるようになりました。
ただ、課題が出てきて、デフォルトだと許容不一致率がとても低いので、失敗してしまうケースが多々ありました。
下のキャプチャは画像差分を表示した状態なのですが、画面自体は同じなので問題ありませんが、本当に少しのズレがあるために、失敗となっていました。
プレビューが表示できない場合にエラーが表示されることを検知するためなので、許容不一致率を少し甘めに設定しています(エラー時の画像は全く違う画像になるため)。

![スクリーンショット 2023-11-06 19.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151058/e2b260a1-0897-33fe-a76c-3c4d7f597787.png)

許容不一致率をどのぐらいにするかは、実際にどういう目的で確認を行うか、どのぐらいの精度を求めるかにもよると思います。

# 実行
そして、肝心の実行フェーズです！
今回の一番重要な考慮点として、非エンジニアでもメンテナンスしやすい設計にしようとしました。
アプリについては、CIで自動ビルドなども可能だと思うのですが、リリースされたタイミング(大体2週に1回)で手動でアップロードしています。

![スクリーンショット 2023-11-06 19.16.19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151058/f9eba4b7-37e8-0c85-71e5-fd4c8608bcba.jpeg)

環境は実機ではなくクラウド環境を使っています。また、実行タイミングもAPIを叩けば実行できると思いますが、MagicPodの一括実行のスケジュール機能を使っています。

今は午前6時から午後8時までの合計12回を1時間毎に実行しています。午前10時ごろまで実行してないのは、ステージング環境でAndroidとiOSの定期実行が行われているためです(契約しているプランが同時に2つまでしか動かせないため)。

![スクリーンショット 2023-11-06 19.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151058/ac6180dc-f4d3-3a70-f146-3d9fb804966b.png)

上記のように12個実行スケジュールを入れているのですが、例えば「○時から○時まで○時間ごと」とか細かく設定できると管理しやすいかなと思いました。

# 実行した感想
実行結果はSlackに通知するようにしています。
こちらもMagicPodの標準機能を使っています。ただし、全ての結果を朝から夜まで通知すると、1日12回もSlackに来るので、失敗した時だけ来るようにしました。ここもどの結果を通知するか、どのチャンネルに通知するかなど設定できるので便利です！

指定したチャンネルに通知が来なければ問題ないと判断しています。
失敗通知は成功と失敗の数やどのシナリオがなぜ失敗したかもわかるので、便利ですね。
念のため、失敗した場所をQAメンバーが実際にアプリを操作して問題ないかを確認しています。

![スクリーンショット 2023-11-06 19.52.44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151058/bebcf81e-53c8-0097-c481-ff147bb707c0.jpeg)

今の所、手動で実施すると問題ないケースしかなく、インシデントは発見できていませんが、それはそれで良いことかなと思います。

## 最後に
本番環境でのエラーを検知するために今回は定期実行をしてみましたが、APIの知識などが乏しい自分にとってMagicPodの管理画面で色々と設定できるのは便利だと改めて感じました。
そして、そういうところが、MagicPodを使いたいと思える場所でもあると感じました。

今後も定期的に実行していきたいと思っていますが、課題としては、MagicPod側の準備で失敗したり、エミュレーターの準備ができないことがたまにあることです。
そういうケースでも失敗の通知が来るので、手動で確認をせざる終えないですが、この辺りの失敗が減ると、さらに効率的に使えそうです！

また、先ほど話題にもしましたが、定期実行を想定した設定(例えば「○時から○時まで○時間ごと」とか)ができるようになると、とても便利になるのではと思いました。
ついにきた！「GPT-4 Turbo」vs「GPT-4」

# GPT-4とGPT-4 Turboの違いって？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/aecc3e2e-e7b3-8243-ee0d-1a7b6eabe885.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/1b695872-e242-9a79-776d-ae0ca27f546f.png)


11/7のOpenAI DevDay で「GPT-4 Turbo」という新しいAIが登場しましたが、
前の「GPT-4」とどう違うのでしょうか？

## より大きな理解力

GPT-4 Turboは、一度に300ページ以上の情報を処理できる128Kのコンテキストウィンドウがあります。これは、GPT-4の約4倍の大きさです！

## 価格がお得に

GPT-4 Turboは、入力トークンが3倍安く、出力トークンが2倍安いです。開発者の皆さんにとって、より多くのAIを使ったプロジェクトを始めやすくなりました。

## 最新の情報を把握

GPT-4のデータは2021年9月までのものでしたが、GPT-4 Turboは2023年4月までの最新情報を持っています。

## まとめ

GPT-4 Turboは、より大きな情報を扱い、より経済的で、最新の知識を持っています。これで、新しいAIの世界をさらに楽しめそうです。
B2C Commerceで商品絞り込みを設定

# 商品の絞り込み
RefArchのサイトで、赤枠で囲った部分が、絞り込み（refinement-bar）の設定部分である。
画面遷移をせずに、商品を絞り込むことができる。

![スクリーンショット 2023-11-07 10.36.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2674841/072e8b68-b504-943a-c17b-77b07720505f.png)

# カタログ階層での絞り込み定義
マーチャントツール >  商品とカタログ >  カタログ > (対象のカタログ) > 検索絞り込み定義
![スクリーンショット 2023-11-07 10.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2674841/06ef9794-e0f1-9c40-f794-a7db51ce179c.png)
注意：カタログ階層での絞り込み定義では、カテゴリ階層の絞り込み定義を編集できない。

# カテゴリ階層での絞り込み定義
マーチャントツール >  商品とカタログ >  カタログ > (対象のカタログ) > (対象のカテゴリ) > 検索絞り込み定義
![スクリーンショット 2023-11-07 10.35.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2674841/ff8f3780-b83b-bfbb-9152-c83e32350e82.png)
注意：カテゴリ階層での絞り込み定義では、カタログ階層の絞り込み定義を編集できない。
VScode でエディターとターミナルを一瞬で行き来するような設定をする備忘録

## 概要

題名の通りですが、
この設定をやっておくとVSCodeのエディター（コードを書く部分の画面）と
ターミナル部分（画面下部のこところ）をキーバインドを使って行き来できるので、
マウスを使う回数が減り、少し生活が楽になるのでやってみましょう。


##　やり方

ctrl + shift + p
で

`> short cut `

みたいに調べると、ショートカットの設定の画面に行くことができるので、
そこで二つ設定します。


ちなみに、行き来することをフォーカスという言葉で書いてあります。

### エディターへのフォーカス

こちらでハイライトしている、
`Focus on Editor View `
のところを自分の好きなキーで設定してください。
私は `ctrl + a `
で設定しています。

![スクリーンショット 2023-11-07 102805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840635/c9741e89-17b5-c2fd-5956-80fc2521be9c.png)



### ターミナルへのフォーカス

こちらでハイライトしている、
`Focus on Terminal View `
のところを自分の好きなキーで設定してください。
私は `ctrl + ; `
で設定しています。

![スクリーンショット 2023-11-07 102916.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1840635/6782b910-f1e6-ff0b-f0b5-b342e4a008c8.png)



以上です。
これで `ctrl + a` でコードを書き、
`ctrl + ; ` でターミナルを触るのが簡単になります。

今回はこれだけです。
それでは。
SwiftUIでビューの表示・非表示をアニメーションする

SwiftUIでアニメーションするときに [animation(_:value:)](https://developer.apple.com/documentation/swiftui/view/animation(_:value:)) を使いますが、ビューの表示・非表示を表現するときにモディファイアをつける位置に若干つまずいたのでメモしておきます。

こんなアニメーションを実装します。

![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/0fd03401-7023-c668-fe9a-0489ee7650b2.gif)


```swift
struct ContentView: View {
    @State var condition = true

    var body: some View {
        VStack {
            Button("Button") {
                condition.toggle()
            }

            ZStack {
                if condition {
                    Text("Hello")
                } else {
                    Text("World")
                }
            }
            .animation(.easeOut(duration: 1.0), value: condition)
        }
        .frame(width: 300, height: 300)
    }
}
```

アニメーションしたいのはTextビューですが、`animation(_:value:)`はコンテナビューに対してつけます。

```swift
ZStack {
    if condition {
        Text("Hello")
    } else {
        Text("World")
    }
}
.animation(.easeOut(duration: 1.0), value: condition)
```

条件によって表示するビューを切り替えるときにコンテナとしてGroupを使うことがあると思いますが、Groupに対して`animation(_:value:)`をつけてもアニメーションしないので要注意です。

```swift
// Groupだとアニメーションしない
Group {
    if condition {
        Text("Hello")
    } else {
        Text("World")
    }
}
.animation(.easeOut(duration: 1.0), value: condition)
```

おまけですが、条件にマッチしたときだけビューを表示する例です。
ちなみに`overlay`内だとGroupでもアニメーションしました。

![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81715/997a3306-a6d5-5918-763e-fcf1975740d6.gif)


```swift
struct ContentView: View {
    @State var condition = false

    var body: some View {
        VStack {
            Button("Button") {
                condition.toggle()
            }

            RoundedRectangle(cornerRadius: 4)
                .foregroundStyle(Color.clear)
                .frame(width: 100, height: 50)
                .overlay(Color.gray, in: RoundedRectangle(cornerRadius: 4).stroke(lineWidth: 1))
                .overlay {
                    ZStack {
                        if condition {
                            Text("Hello")
                        }
                    }
                    .animation(.easeOut(duration: 1.0), value: condition)
                }
        }
        .frame(width: 300, height: 300)
    }
}
```
Ubuntuで狙ったウィンドウに即座に切り替える方法：wmctrl

## 記事の内容

現在の開発チームではubuntuを使用しています。

UbuntuではAlt + Tabでアプリケーション間を切り替えることができますが、これでは一度に一つのウィンドウしか切り替えられません。
複数のウィンドウが開いている場合はいくつかのウィンドウを順番に切り替える必要があり、即座に狙ったアプリケーションに切り替えることができません。

より効率的にウィンドウを切り替える方法がないか模索した議事録です。

# 試したこと

まず初めにキーボードショートカットのLauncherを用いる方法です。
今回は例としてfirefoxに切り替えることを目的とします。

キーボードショートカットのLauncherにある「ウェブブラウザーを起動」では
確かにブラウザは起動しますが、新たに立ち上がってしまいます。
しかし、今回の目的である　特定のウィンドウに切り替える　という目的は達成できていません。

![Screenshot from 2023-11-07 09-56-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1248254/c4d6e301-0173-8293-010b-70b1550b2d83.png)


他にも
カスタムショートカットを作成する方法も試しましたが、こちらも既に開いているfirefoxへ切り替えるのではなく新しくfirefoxが立ち上がってしまいます。
## 原因

調べたところ、どうやらUbuntuのデフォルトのウィンドウ管理システムは通常、新しいインスタンスの起動と既存のウィンドウのフォーカスの切り替えとを区別しないためです。



# 解決策
wmctrlを導入する

ここで登場するのがwmctrlというツールです。これはX Window Systemのウィンドウを制御するためのコマンドラインツールで、特定のウィンドウを検索し、フォーカスを与えるということを簡単に行うことができます。以下が私が実際に行ったステップです。

ステップ1: wmctrlのインストール

まず、Ubuntuのターミナルを開き以下のコマンドでwmctrlをインストールします。
```
sudo apt-get install wmctrl
```

ステップ2: カスタムショートカットの作成

次に、システム設定からキーボードセクションに移動し、ショートカットタブでカスタムショートカットを追加します。ここで、以下のコマンドを使って新しいショートカットを設定します。
```
wmctrl -a Firefox
```
これで、任意のキーボードショートカットをこのコマンドに割り当てることができます。
Firefox の部分を任意のアプリケーション名に書き換えればそのアプリケーションへの切り替えをキー入力で行えます。

ステップ3: ショートカットの使用

設定したショートカットを使用すると、開いているFirefoxウィンドウに瞬時にフォーカスを移動させることができます。
これにより、ウィンドウを一つ一つ確認することなく、目的のウィンドウに直接ジャンプできるようになりました。
watsonx.dataハンズオンのご紹介

この投稿は2023年10月31日開催 「IBM TechXchange Conference Japan」での「[DM-04]【ハンズオン】さわってみよう watsonx.data #1 ～初めの一歩編～」内容を受講者目線で記したものです。(※同じ記事を[弊社公式ブログ](https://alpcom.co.jp/blog/20231107/)にも掲載しております)

ハンズオンの写真撮影、動画撮影、資料公開、SNS拡散がOKとの事なので作成し掲載をしております。watsonx.data自体の概要、特徴、機能などは[IBM様公式のWeb](https://www.ibm.com/jp-ja/products/watsonx-data?utm_content=SRCWW&p1=Search&p4=43700077117883300&p5=p&gclid=Cj0KCQjw-pyqBhDmARIsAKd9XIOIIxbPCLrzUweizQ8n73ZnTRV_YmCViivQrMxMkWAzhgC-Kp6FnAAaAmDSEALw_wcB&gclsrc=aw.ds)などでご確認ください。

# ハンズオン目的と概要
ハンズオンの目的である・・・
* watsonx.dataの概要をPresto中心に理解する
* GUIからデータの取り込みやデータの照会を体験する

・・・を達成するためハンズオン自体は数項目ありましたが、まとめると下記のように2パートで構成されていました。
* 参照できる情報の確認
* データを取り込み照会

# 参照できる情報の確認
下図はwatsonx.dataにログイン直後の画面です。ホームからアクセス制御まで、ご覧のようなメニューがあります。
![watsonx.dataにログイン直後画面](https://alpcom.co.jp/cms/wp-content/uploads/image-487.png "watsonx.dataにログイン直後画面")

|メニュー名|説明|
|:--|:--|
|ホーム|「ホーム」アイコンをクリックするとこの画面へ戻る。|
|インフラストラクチャー・マネージャー|3階層コンポーネントである(照会)エンジン、カタログ、バケットの確認が可能。オブジェクト・ストレージ上のデータやデーベースの追加が可能。|
|データ・マネージャー|カタログ->スキーマ->表で管理。ファイル・マネージャーのような操作感でデータの探索が可能。スキーマの作成、ローカルPCからデータ取り込みが可能。|
|照会ワークスペース|SELECT文を自動生成し、エディターでSQLを記述、実行、結果の確認が可能。|
|照会履歴|過去に実行されたSQLの表示が可能。再実行が可能。|
|アクセス制御|インフラとデータに対するユーザー単位での制御が可能。|

# データを取り込み照会
下記のような都内Wi-Fiスポットの緯度、経度が記録されたCSVファイルを取り込み、[地理空間関数(ST_Distance関数)](https://prestodb.io/docs/current/functions/geospatial.html)で東京駅から1000m以内のWi-Fiスポット件数を調べました。

```
NO,LATITUDE,LONGITUDE
1,35.643243,139.860499
2,35.651494,139.829599
3,35.623732,139.769894
4,35.676172,139.522382
・
・
```
# 動画で解説
実機操作を約10分の音声付動画でご覧ください。
https://youtu.be/Fbj3Gj7t4lc


# 関連リンク
アルファー・コミュニケーションズ公式ブログ
https://alpcom.co.jp/blog/

アルファー・コミュニケーションズ公式YouTube
https://www.youtube.com/channel/UCTqwZsRRpAs9NPTUz2yH3ow/videos
11/6 | OpenAI DevDay 2023の発表まとめ [ChatGPTがすごい]

11月7日 、OpenAI DevDay が開催。

たくさんの新しい発表がありましたので紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/cfc5ea14-5467-3dcb-b151-21d5bcbdcb09.png)


## GPT-4 Turboが登場！
OpenAIは新しい**GPT-4 Turbo**を発表。これはより多くの情報を扱い、より安価で提供されます。300ページに相当する128,000トークンの処理能力や、開発者向けにJSONモードや複数機能の同時呼び出しなどが強化されました。

👉 ポイント: **GPT-4 Turbo**は情報量が多く、開発者向けの機能も充実しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/3936291b-f598-a5ab-6d0d-400d3b933538.png)


## GPT Storeで革新が始まる
**GPT Store**が開設され、開発者はカスタマイズ可能なAIツール**GPTs**を作成・販売できます。収益はツールの人気度によって変わります。

👉 ポイント: **GPT Store**で独自のAIツールを市場に出すことができます。

## Assistants APIで開発が加速
**Assistants API**がベータ版でリリースされ、開発者はAIアシスタント機能をアプリに簡単に統合できます。これにより、自然言語入力に応じた様々なタスクを実行可能になります。

👉 ポイント: **Assistants API**でアプリにAIアシスタントを追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/fa98c85d-554a-924f-6f22-40eedb41c6b0.png)


## Microsoftとの提携強化
MicrosoftのCEO、**Satya Nadella**氏が登場し、OpenAIとの提携をさらに強化すると発表しました。また、**ChatGPT**を使ったAgentのような振る舞いや、著作権問題に対する保護「copyright shield」についても触れられました。

👉 ポイント: **Microsoftとの連携**により、ChatGPTの機能が拡張されます。


---

もっと詳しいことは以下の方の記事を参考ください。

https://chatgpt-lab.com/n/n0554df7f1b80

https://dev.classmethod.jp/articles/openai-devday-release-note/
【備忘録】SourcetreeとGithubPagesを使ってデプロイしてみた。

## はじめに
今回は備忘録として、前回作ったポートフォリオサイトを**Sourcetree**を使って**Github**からデプロイする方法をまとめます。
前回の記事に関連する内容になりますので、こちらも読んでいただけると嬉しいです。
[コーダーがVue.js3を学んでSPAポートフォリオサイトを作ってみた。](https://qiita.com/shunsaitow/items/437eaa65931fcb9ae7ff)

## 前提
・ 最低限のSourcetreeとGithubについての知識がある
・ SourcetreeのインストールとGithubのアカウント登録をしてある
・ SourcetreeとGithubはSSHキーで連携済み

## Githubでリモートリポジトリを作成
マイページにサインインし、左上の「New」ボタンからリモートリポジトリを作成。

![スクリーンショット 2023-11-06 13.04.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/d63cab9b-4e04-f8b6-091f-7877f3e3b9c6.png)

もしくは右上のアイコンをクリックし、出てきたメニューバーから「Your repositories」を選択し、リポジトリページから「New」ボタンで作成。

![スクリーンショット 2023-11-06 13.08.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/f7829b37-647c-64ff-e598-02a22765c26a.png)

## Sourcetreeでローカルリポジトリを作成
Sourcetreeを開き「ローカル」を選択。
プロジェクトで生成した「dist」フォルダをドラッグ&ドロップ。

![スクリーンショット 2023-11-06 13.20.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/f1ebe250-102e-a46c-c0f8-ab296642c98e.png)

これでローカルリポジトリが作成されました。

![スクリーンショット 2023-11-06 13.35.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/518b8d5d-aa5d-c9b8-5692-860b5ae6c723.png)

## ローカルリポジトリとリモートリポジトリを接続
リポジトリの設定をしていきます。

![スクリーンショット 2023-11-07 14.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/a135565b-aa20-b0ce-8939-8d0b29441d01.png)

「リモート」を選択し「追加」をクリック。名前にorigin、パスに先ほど作ったリモートリポジトリのURLを貼り付けて、「OK」をクリック。
これで接続されました。

![スクリーンショット 2023-11-07 14.51.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/f719fe65-1c3b-260e-9dca-0384742c378f.png)


## リモートリポジトリにプッシュ
Sourcetreeからローカルリポジトリを開きます。
全てのファイルをコミットし、masterブランチをプッシュ。
これでリモートリポジトリにファイルがプッシュされました。

## GithubPagesでデプロイする
それではプッシュされたファイルをデプロイしていきます。
Githubのリポジトリのページから「Settings」を開き、以下の画像の順で進めます。ブランチは「master」と「root」を選択。「Save」を押して公開サイトURLが出てくればOK。（少し時間がかかります）

![スクリーンショット 2023-11-04 9.56.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/df5f74a4-6dd0-4c43-e313-ce8ceb9b7e15.png)
![スクリーンショット 2023-11-04 11.43.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/4fad27b1-4f20-8a8e-fa72-09f386edcae4.png)
デプロイ方法はこちらの記事を参考にしました。
[【超簡単】GitHub Pagesとは？手軽にサイト公開してみよう！](https://pengi-n.co.jp/blog/git-githubpages/)

## 公開されたサイトを確認
出てきたURLをクリック。

![スクリーンショット 2023-11-07 9.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/77097a19-83a4-0ddc-9965-b7a76d047035.png)

無事サイトが公開されてます！

![スクリーンショット 2023-11-04 17.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605561/71930c9a-cfa1-d254-8ac8-231cdcb73066.png)
https://shunsaitow.github.io/vue3portfolio/

## おわりに
今回は視覚的にも分かりやすい**Sourcetree**を使ってプッシュまでを行いました。
**コマンドライン**を使用した方法は慣れるまで分かりづらい部分もありますが、実際の現場ではよく使われると思うので、積極的に試していきたいですね。
lsコマンドのfオプションについて

lsコマンドのfオプションはhelpを読むと、`do not sort, enable -aU, disable -ls --color`と記載されており。

fオプションはソートせずにaオプション,Uオプションを有効にして、lオプション、sオプションとcolorを無効化する感じのオプションです。

自分は.始まりのファイルを表示したいときに使ったりしており。

普段、fオプションを使うが、lオプションだけを有効にしたい場合は。
`ls -fl`といった具合に実行すると、lオプションが無効にならないため、こちらを利用しています。

しかしtypoして`ls -lf`とオプションの順序を逆に打鍵してしまうと、こちらの場合はlオプションが無効化された状態となります。

fコマンドがlオプションを無効化する要素を含んでいるため。

fオプションの前にlオプションを書くと無効化されるが、fオプションのあとにlを書くと無効化されないそういう物だと理解していましたが。

下記に、似た疑問が投稿されており。

[How to order several options of a command (ls)?](https://unix.stackexchange.com/questions/261150/how-to-order-several-options-of-a-command-ls)

その返答に下記のように`info ls`の記述が紹介されていました。

> Primarily, like `-U'--do not sort; list the files in whatever
 order they are stored in the directory.  But also enable `-a' (list
 all files) and disable `-l', `--color', and `-s' (if they were
 specified before the `-f').

ドキュメントにはちゃんとfオプションの前のオプションを無効にすると記載されていたんですね。

## 総評

なんとなくで理解していたことでも、ちゃんとドキュメントみると明示的にかいてあったりして、ちょっと気になる事があればやっぱりドキュメントに立ち返るのは大事です。
個人的におすすめしたいTextFieldの設定について

![スクリーンショット 2023-11-06 14.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/9ba96181-b722-4445-b465-2bad0860347a.png)


こんにちわ。いせりゅーです。
今年ももうすぐ終わってしまうと考えるととても早いですね(^^;;



:::note info
この記事は、<b>株式会社ゆめみの23卒 Advent Calendar 2023</b>のアドベントカレンダーになります！！
色々な種類の記事が投稿されるので、お楽しみに🤗
:::

https://qiita.com/advent-calendar/2023/yumemi-23-graduation


# はじめに

https://api.flutter.dev/flutter/material/TextField-class.html

↑こちらを参照させていただきました。




## `autocorrect`の設定をしっかりとしよう

```
autocorrect → bool
Whether to enable autocorrection.
「自動修正を有効にするかどうかの判定」
```

こちらの機能としては、設定するかしないかでユーザーからの満足度が変わってしまいます。

個人的には、メールアドレスやパスワードなどは、`autocorrect`をfalseにしておくことをおすすめします。メールアドレスの記載をしていた際に期待していない修正を行ってしまうことがあるので注意が必要です。

# `decoration`などを使用してUIを整えよう

やり方はいろいろあると思いますが、一般的には、`decoration`などを使用することでTextFieldの枠などをつけることをおすすめします！

おすすめの記事としては、こちらが参考になると思います。

https://qiita.com/arrow/items/e9a8c9aac98a1181b92d



# TextField以外をタップするとキーボードを閉じれるようにしておこう

色々なアプリを見ていると、TextField以外をタップするとキーボードを閉じれるようにしているものが多いと感じました。
しかもTextField以外をタップするとキーボードを閉じれるようにするやり方もとても簡単です。
具体的な実装としてはこちらが参考になります！！

https://zenn.dev/blendthink/articles/d2c96aa333be07



# 入力できる範囲を設定している
これらは、いろいろ設定があると思いますが、例えば、
- 数字のみにしたい
- 英語のみにしたい
- 日本語のみにしたい
- 数字と英語のみにしたい

などがあると思うので調べてみるといいと思います。
参考になる記事としては、、、

https://qiita.com/beckyJPN/items/912cb61cfee813bf4a70

https://qiita.com/utasan_com/items/075a638ebd048f4ac32f


# 最後に
とりあえず、殴り書きで書いてみました。他にもあれば、コメントください！
また、自分も他にもあれば追記していきます〜〜！

記事のアイデアがなくなってきましたね。
でも頑張っていきたいです。
Dartの個人的に知らなかった歴史（2018年）

![スクリーンショット 2023-11-07 9.40.53（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/6c5898fd-f109-e817-8a31-c686d12161e8.png)


:::note info
この記事は、<b>株式会社ゆめみの23卒 Advent Calendar 2023</b>のアドベントカレンダーになります！！
色々な種類の記事が投稿されるので、お楽しみに🤗
:::

https://qiita.com/advent-calendar/2023/yumemi-23-graduation


こんちにわ、いせりゅーです。
今回は、技術記事というよりもDartの個人的に知らなかった歴史について記載していこうと思います。
興味のあるないが左右されると思いますが、こういった事実があったことを知るだけでも言語の興味にもつながると考えています。


:::note info
<b>注意🚨</b>
また、色々な記事から情報を取得しているため、間違った記載がある場合は、コメントいただけると幸いです！
↓から引用させていただいています。
:::

https://www.codementor.io/blog/worst-languages-to-learn-3phycr98zk


# 前提として

2018年の結果を引用していますが、それ以前の事前情報としては、
- 初の正式版「Flutter 1.0」のリリースが発表される前だった（2018年12月4日）
- Null Safetyの対応がなかった（Dart2.0〜）


# 2018年に最も学ぶ価値のないプログラミング言語の1位だった。

個人的に知らない事実でした。
４つの項目の内、３つもトップになっているとは思っていませんでした。
色々なイベントに参加している中では、Flutterエンジニアは意外と数が多くて、ずっと人気だったのではないかと思っていたので、ここ数年で急成長したんだなと感じました。


<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/2edae5b6-379b-4cc6-00a8-14dd85aaab80.png">


# コミュニティの参加についても最下位になっていた。

それでも下の写真を見てみると、どのコミュニティでも下の順位になっていましたね。ここまで下の順位になっていると思っていませんでした。

今では、StackOverFlowなどのサイトではたくさん質問や討論の記事が多く見られていますが、昔は盛んではなかったんだなとびっくりしました。


<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/d8cc48fe-556c-155c-7642-28468513137a.png">


# Dartの採用についても最下位になっていた。

また、当時のDartの採用についても不人気で、これまた最下位でした。
下の写真を見てみると、Swiftなどと比べて圧倒的に少なかったです。

今の個人的な市場については、Flutterエンジニアを志している若手がとても多く、プログラミング経験が深い世代の人の割合を上回っているのではないかと考察しています。
これからの採用コストや市場の動向についてはチェックするだけでも面白そうですね。


<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/5e7398a2-cfb5-fe4b-65c3-eac4124c6cd3.png">



# 最後に

正直なところ、色々な人と話している中で「Flutterエンジニアです！」というと、たまにパッとしない反応だった理由がわかった気がします。
これらの歴史を知っていたとしても明確なメリットはないかもしれませんが、今後の成長や流れを理解する上で以前の歴史を知っておくものとてもいいと思いました。
また、機会があれば、別の年代のランキングも見ていこうと思います〜〜🤗