OmniAICreator/Qiita-1.07M huggingface dataset:
G検定受験体験記

# はじめに
G検定の試験（2023年 第5回）を受験、合格しましたので、受験体験記をまとめます。

# G検定
G検定は、一般社団法人日本ディープラーニング協会（JDLA）が実施している検定試験です。
https://www.jdla.org/certificate/general/

|試験範囲（シラバス）|
| ---- | 
人工知能（AI）とは|
人工知能をめぐる動向
人工知能分野の問題
機械学習の具体的手法
ディープラーニングの概要、
ディープラーニングの手法
ディープラーニングの社会実装に向けて
数理・統計


# 受験結果
「2023年 第5回 G検定（ジェネラリスト検定）」を受験。
```
■合否結果
=================
【　合　格　】
=================
総受験者数　 5,330名
合格者数　　 3,662名

■シラバス分野別得点率（小数点以下切り捨て）
１．人工知能とは. 人工知能をめぐる動向. 人工知能分野の問題：88%
２．機械学習の具体的手法：100%
３．ディープラーニングの概要：93%
４．ディープラーニングの手法：94%
５．ディープラーニングの社会実装に向けて：94%
６．数理・統計：83%
７．法律・倫理・社会問題：67%
```
https://www.jdla.org/news/20231127001/

# G検定に向けた勉強方法

#### 全体の流れ
1.　参考書を読む
2.　動画を視聴（Udemy）
3.　問題集を解く
4.　模試を解く
5.　直前の対策（1週間前）


#### 1.　参考書を読む
* [ディープラーニングG検定(ジェネラリスト)最強の合格テキスト[明瞭解説+良質問題]](https://www.amazon.co.jp/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E6%9C%80%E5%BC%B7%E3%81%AE%E5%90%88%E6%A0%BC%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E6%98%8E%E7%9E%AD%E8%A7%A3%E8%AA%AC-%E8%89%AF%E8%B3%AA%E5%95%8F%E9%A1%8C/dp/481561167X/ref=sr_1_10?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=D0WDF8PLQ9KN)
  * 全体像を掴む為に、ざっと読みました（1回）。

#### 2.　動画を視聴（Udemy）
 * [【全200問の模擬試験付き】G検定に合格するための集中講義！人工知能（AI）について体系的に学ぶ（初心者向け）](https://www.udemy.com/course/new_g_ai/)
   * 一通り、視聴して、その後、覚えにくいパートを複数回、視聴。動画は、記憶に定着させるには有効かと思います。時間とって視聴するというよりは、食事やストレッチしている時等の空き時間に視聴してました。
 
#### 3.　問題集を解く
* [最短突破 ディープラーニングG検定(ジェネラリスト) 問題集](https://www.amazon.co.jp/%E6%9C%80%E7%9F%AD%E7%AA%81%E7%A0%B4-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0G%E6%A4%9C%E5%AE%9A-%E3%82%B8%E3%82%A7%E3%83%8D%E3%83%A9%E3%83%AA%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-%E5%85%89%E5%A4%AA%E9%83%8E/dp/429711609X/ref=sr_1_17?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=D0WDF8PLQ9KN)
   * 2周して、後は間違った問題だけ、何度かやり直しました。Kindle版を購入。Kindleは、重要なところや間違った問題をハイライトして、後で一覧で見れるので、便利です。

#### 4.　模試を解く
* [Study-AI](https://study-ai.com/generalist/)
    * 1周して、後は間違った問題だけ、何度かやり直しました。新シラバス対応の方が難しかったと思います。
* [JDLA G検定模試をひたすら解説する！](https://www.youtube.com/watch?v=9_5NqeW6gc4)　
    *  上記のリンクは、#1ですが、#5まであります。

#### 5.　直前の対策（1週間前）
* [G検定 ～厳選問題集～ Kindle版](https://www.amazon.co.jp/G%E6%A4%9C%E5%AE%9A-%EF%BD%9E%E5%8E%B3%E9%81%B8%E5%95%8F%E9%A1%8C%E9%9B%86%EF%BD%9E-yuki-ebook/dp/B08BWP52Q2/ref=sr_1_16?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=D0WDF8PLQ9KN)
  * 1周して、後は間違った問題だけ、やり直しました。

* [DIVE INTO EXAM](https://diver.diveintocode.jp/dive_into_exam/3)
  * 本番の試験感覚を掴む為に1回、時間計って解き、間違った問題を確認しました。


# 試験時のTips

#### 1.　後で見直したい問題の扱い
* 後で見直したい問題を少し時間があれば、解けそうなものと、そうでないものに分けて、紙に問題番号を記載する。
    * 見直したい問題が多くなりすぎると、どの問題を優先的に見直せばいいか分からなってしまうのを模擬試験で気づきました。
    * 紙に優先度別に見直したい問題をまとめておくと、問題を一通り解いた後に、優先度の高いものから見直せるので効率的かと思います。
    
#### 2.　時間配分
   * 約200問あるので、50問を25分以内で解き、残りの時間の20～30分程度で見直したい問題を行う。
       * 実際は、法律系の問題等で時間がかかり、最初の50問で30分以上オーバーしてしまいました。以降の問題では、少し見て、すぐに答えられない問題は割り切る形で、最後まで問題解いて、後で、見直す時間の確保を優先しました。

#### 3.　2画面使って解く
 * 直前に模擬試験を時間計って、2画面使ってやってみると、感覚が分かり、有効でした。

# 最後に

* 出題範囲が広く大変ではありましたが、今回の学習を通じて、AI、機械学習、ディープラーニングの内容が体系的、網羅的に把握出来たのは、よかったと思います。
ReactとVue.jsの比較

# はじめに

JavaScriptのフレームワークでシェア率の高いReactとVueの違いについて比較し、備忘録としてまとめました。

# React概要

Reactは、Meta社によって開発・提供されているJavaScriptのライブラリです。
モジュールの再利用性が高く、UI開発に特化しており、Facebook、Instagram、Netflixnにも導入されています。

Reactはライブラリのみなので、コードサイズが小さく大規模開発にも対応可能です。軽量であり、動作も速いです。ライブラリのみなので、アプリ全体の構築には、Next.jsやRemixなどのフルスタックのフレームワークが必要となります。

Reactのデータ処理方法は、「単方向データバインディング」であり、画面に表示されるUIにも自動的に反映されます。しかし、画面上のUI操作で変更された内容をデータ側に反映するためには、イベントハンドラを使用し、更新処理を行う必要があります。

# Vue.js概要

Vue.jsは、元GoogleのエンジニアであるEvan You氏が開発したJavaScriptのフレームワークです。こちらもUI開発に向いており、Googleが提供する様々なサービスに加え、Zomm、Noteに導入されています。

Vue.jsのデータ処理方法は、「双方向データバインディング」です。再レンダリング時にリアクティブにい処理が実行されます。

比較小規模なプロジェクト向きであり、大規模プロジェクトで想定されるモジュール連携た制御には物足りません。しかし、Vue.jsは、他のフレームワークやライブラリと統合して使用することもでき、拡張性が高いのが特徴です。

# ReactとVue.jsの共通点

・UI構築ができる。
・コンポーネントに分けて編集できる。

# RactとVue.jsの違い

||React|Vue.js|
| --- | --- | ---| 
|開発規模|大規模|小規模|
|開発方法|関数型|クラス宣言|
|処理速度|速い|Reactに比べて遅い|
|汎用性|実装可能なプロダクトが多く、モバイルアプリ開発にも対応|ソートや検索など高度な機能の実装に対応|
|サポートの充実性|公式サイトのライブラリが少ない|公式サイトのライブラリが充実|
|求人件数|Vue.jsと比べて多い|多い|

詳細は以下の通りです。

## 開発規模

Reactは標準搭載されている機能が豊富なため、大規模なサービスの開発に適しています。
Vue.jsは拡張機能が豊富でカスタム性に優れ、小規模なサービスの開発に適してます。

しかし、Vue.js3では大規模なアプリケーションにも対応したことで開発範囲が広がりました。

## 処理速度

Vue.jsでは仮想DOMで再計算が行われるため、Reactよりも処理速度が劣ります。

## 汎用性

Reactの方が実装できるプロダクトの幅広さは、Reactの方が優れており、React Nativeフレームワークによりモバイルアプリ開発も可能です。

Vue.jsは拡張機能の実装に優れてあり、ソート機能や検索機能の実装など高度なカスタマイズを行えます。


## サポートの充実度

Vue.jsの方が公式サイトの情報量が充実しており、利用頻度の高いライブラリが紹介されています。

Reactは公式サイトで紹介されているライブラリが少なく、情報を自分で調べなければなりません。

# React・Vue.js以外のフレームワーク

SvelteやSolidなど仮想DOMを使用せず、コンパイルより事前にDOM操作を最適化してシンプルで高性能なコンパイル型フロントエンドが出現しています。

VueがSvelteに影響を受けていて、SvelteはVue.jsの`scritp setup`に似た少ないコード量で記述できます。

SolidはReactに近く、再レンダリングの問題が発生することなく、JSXの属性名も大文字小文字を区別せずHTMLをそのまま使用できるなど、Reactのデメリットが解消されています。


# 参考記事

https://udemy.benesse.co.jp/development/system/react-vue.html

https://qiita.com/cypher256/items/8d6c25e3466e4815b3c7

https://and-engineer.com/articles/ZHmLZxAAACIAfesG
JavaScriptの非同期処理についてまとめてみた

JavaScriptの非同期処理について色々勉強したのでまとめてみました。
JavaScriptには、主にPromiseとasyncにより非同期処理を書く方法があります。

# そもそも非同期処理とはなにか

同期処理と違い、すべての動作が完了する前に、あるいは並行して処理を実行させる事ができる処理のことを非同期処理と言います。
同期的な処理の場合は、
```
A
↓
B
↓
C
↓
D
↓
E
↓
F
```
という順番に処理を実行させなければなりませんが、非同期処理の場合
```
A　D
↓　↓
B　E
↓　↓
C　F
```
というように、同時並行で処理をさせることが出来るようになるので、パフォーマンスを向上させることが出来るようになります。

これが非同期処理の強みです。

# 非同期処理の書き方

## Promise

非同期処理の書き方の一つに、Promiseというものがあります。
これは、JavaScriptの非同期処理を書く際にPromiseのブロックで囲われている処理を非同期的に実行するように命令するためのものです。

3つの状態を用いて処理を書いていきます。

- pending：非同期処理が実行中の状態
- fulfilled：非同期処理が問題なく終わった状態
- rejected：非同期処理に問題が発生した状態

Promiseでオブジェクトを作る際は、resolveとrejectの状態を持ちます。

resolveとrejectはなにか

- resolve
非同期処理が成功した際に呼び出される異コールバック関数。

- reject
非同期処理が失敗した際に呼び出されるコールバック関数。
思わぬバグを踏む可能性がある際に、try-cactchで握りつぶさなくても良くなるので是非活用していこう。

- .then
.then メソッドはこのPromiseが成功した場合に呼ばれるコールバック関数を設定することができます。
なのでこれらを繋げていけばチェーンのように非同期処理を書くことも出来るわけです。

# async/await

Promiseのあとに出てきた非同期処理の書き方です。
関数につけると、非同期関数として書くことができます。
Promiseと同じオブジェクトを返すので、.thenでコールバック関数を繋げて書くこともできます。
複数の非同期処理を書く際などに、非同期処理が実行される順番も指定したいという場合があると思います。

その際には、awaitをつけることで順番を指定することもできます。
Ruby メモ

## Rubyについて
### Ruby
- 1993年に日本人のまつもとゆきひろさんに設計された言語です。
- Rubyが得意とするのは、ショッピングサイト、ブログサイト、アプリケーションサイト など、フレームワークを使い構築できるWebサイトです。 
- マイグレーションは、直接SQLを使わずにデータベースのテーブルやカラムなどの構造 を変更できる仕組みのこと。
- [公式サイト](https://www.ruby-lang.org/ja/)
- [GitHub](https://github.com/ruby)

### SideKiq
- Rubyで記述されたオープンソースのバックグラウンドジョブフレームワークです。
- Ruby On Railsと緊密に統合し、バックグラウンド処理を非常にシンプルにします。
- [公式サイト](https://sidekiq.org/)

### RSpec 
- Rubyの自動テストツールです。 
- [公式サイト](https://rspec.info/)

### RubyGems
- RubyGemsソフトウェアを使用すると、システムにRubyソフトウェアパッケージを簡 
- 単にダウンロード、インストール、および使用できます。 
- [公式サイト](https://guides.rubygems.org/) 

### Bundler 
- bundlerとは、gemをどのバージョンで使うか一元管理できるgemのことです。
- [公式サイト](https://bundler.io/)

### jBuilder 
- jbuilderとは、RailsのGemfileにデフォルトで含まれている「JSON形式のデータを簡 単に作成する事が出来るgemのこと」です。

### Rake
- Rake は Make によく似た機能を持つ Ruby で書かれたシンプルなビルドツールです。
- [公式サイト](https://docs.ruby-lang.org/ja/latest/library/rake.html) 

### RuboCop
- Rubyの静的コード解析を実行するgemです。 
- 要はRuboCopが.rbファイルに記述してあるコードを検査し、ここのコードは長すぎるね。とか、インデント入れたほうがいいよ。とかメソッド名変えようか。とかをコマンド 1つでターミナルに吐き出しててくれます。
- [公式サイト](https://rubocop.org/)

### gRPC
- gRPCでは、IDL（インターフェース定義言語）を使ってあらかじめAPI仕様を .proto ファイルとして定義し、そこからサーバー側＆クライアント側に必要なソースコードのひな形を生成します。
- 言語に依存しないIDLで先にインタフェースを定義することで、様々なプログラミング言語の実装を生成できるというメリットがあります。
- [公式サイト](https://grpc.io/)

## Rubyフレームワークについて
### Ruby on Rails 
- Rubyプログラミング言語で記述されたWebアプリケーション開発フレームワークで す。
- 機能が豊富
- コード量も少ない
- 複雑なアプリにも対応
- その分ルールが多く難しい 
- 繰り返してはいけない
- DRYはソフトウェア開発の原則であり、「すべての知識は、 システム内で単一の明確で信頼できる表現を持っている必要があります」と述べてい ます。
- 同じ情報を何度も書かないことで、コードはより保守しやすく、拡張可能にな り、バグが少なくなります。 
- 設定より規約
- Railsは、Webアプリケーションで多くのことを行うための最良の方 法について意見を持っており、無限の設定ファイルを介して細目を指定する必要はなくデフォルトでこの一連の規約になります。 
- [公式サイト](https://rubyonrails.org/)
- [Railsガイド](https://railsguides.jp/)
- [Railsコマンド](https://railsdoc.com/rails)

### Sinatra 
- Rubyで作成されたオープンソースのWebアプリケーションフレームワークであり2007 年に公開された。 
- シンプルなアプリに対応しています。
- 簡単で分かりやすいので初心者向けです。
- [公式サイト](http://sinatrarb.com/intro-ja.html)
 
### Padrino
- Sinatraにインスパイアされ、性能を保ちながらその利便性を高めたツールとして知られております。
- Sinatraでは採用していなかったMVCモデルを採用していることが特徴の一つです。
- 小さくて速いです。
- 豊富な追加機能があります。
- 初心者でも簡単に使えます。
- [公式サイト](http://padrinorb.com/)

## 関連言語について
### Crystal
- Rubyに似た構文を使用します(ただし、Rubyとの互換性は目標ではありません)。
- 静的に型チェックされますが、変数の型やメソッド引数を指定する必要はありません。
- Crystalでバインディングを記述してCコードを呼び出すことができます。 
- ボイラープレートコードを回避するために、コンパイル時の評価とコードの生成を行い ます。
- 効率的なネイティブコードにコンパイルします。
- [公式サイト](https://crystal-lang.org/reference/)

### Elixer
- Rubyに似ている言語です。 
- 拡張性と保守性の高いアプリケーションを構築するためにデザインされた、動的で関数 型のプログラミング言語です。
- [公式サイト](https://elixir-lang.jp/)

### Antikythera
- Elixerのフレームワークです。2018年4月27日に株式会社ACCESSがOSSにして開発コミュニティ向けに公開しました。
- IoTサービスの実現には、Web技術をあらゆる機器やサービスに組み込むことがカギとなります。
- 並行処理機能を持つ関数型プログラミング言語として注目されるElixirを用いたWebアプリケーションフレームワークです。
- IoTサービスを実現する時に重要となります。
- [公式サイト](https://hexdocs.pm/antikythera/getting_started.html#content)
ヘルプデスクのFAQシステムにRAGを付けた件

# はじめに

弊社のITヘルプデスクは、約50のサービス・システムを取り扱っており、Q&Aの数は1,500個以上に及ぶ。
このたびQ&Aの検索性を高めるため、FAQシステムにおいて、従来の全文検索に加え、Azure OpenAIを使ったRAG（Retrieval-Augmented Generation）を併用できるよう拡張した。
この取り組みによって得られた知見を紹介する。

# まとめ

## 知見
- HTMLデータやMarkdownデータは、見出し情報によりデータ分割が容易で、検索データベースとの相性がいい。
- OpenAIをデータの前処理に利用することで、キーワード抽出が手軽に精度高く行える。
- 全文検索とRAGにはそれぞれに長短あり、併用するのが良い。特に、キーワードが明確な場合には全文検索のほうが早く結果を得られる。

## メリットとデメリット（今後の課題）
- RAGのインターフェースをモーダルで配置したことで、使用感が向上した。これにより、ユーザーの既存の操作フローを変えることなく、RAGの選択肢を提供でき、検索結果の参照先も同じページ内にあるため、画面遷移が非常にスムーズになった。
- 一方で、管理対象のDBが2つになったことで、ユーザー利便性向上の半面、運用効率の点では課題が残った。（将来的にはDBを1つにまとめたい）

# 詳細
## 作ったシステム
FAQシステムのトップページにモーダルダイアログを追加し、そこからRAGを使った検索を可能にした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/bfaa85de-45d9-ce46-086c-9469935a2b3c.png)


## アーキテクチャ
- FAQシステムより、FAQをエクスポートし、検索DB（Azure AI Search）に格納する。
- バックエンドで問い合わせを受け付け、検索DBをクエリし、クエリ結果を元に回答を生成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/1a3fb19a-17ad-5de8-4ca4-f5d19d7275cb.png)


## 工夫したポイント
### 1. HTMLデータの利用と見出し情報によるドキュメントの分割

- RAGの検索対象のドキュメントとして、FAQデータのみに絞ってローンチした。
- RAGの導入当初、ITヘルプデスクのホームページコンテンツ（マニュアルやルールなど）をすべてRAGの検索対象にしようと試みたが、ドキュメントの作成者によってドキュメント種別がHTML、PDF、PPTなどバラバラであったこと、またFAQとマニュアルを混在させてしまうことで検索精度が下がってしまったためである。
- FAQに関しては、ドキュメント種別がHTMLに統一なされていた、という環境背景もある。

#### 見出しによるドキュメント分割
- OpenAIで一度に扱える文章量に制限があるため、ドキュメントは必要に応じ分割（チャンク化）しなければいけない。
- HTMLデータを利用することで、見出し（H1タグ）を元にあらかじめ分割し、細かく分割が必要な場合でも、タイトルをメタデータとして別管理することで、ドキュメントのテーマを維持するよう工夫を行なった。
- 内部的には、LangChainのMarkdownHeaderTextSplitterを利用して分割を行なっており、HTMLはMarkdownに変換を行ったうえで処理をしている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/c9aff4e3-200f-5342-5b8b-167c6441c4dd.png)


### 2. データ取り込み時のChatGPTによるキーワード抽出
- 今回利用した検索データベース（Azure AI Search）には、セマンティック検索という機能が用意されており、コンテンツと別にキーワードを与えることで、高い精度の検索性を出すことができる。
- ドキュメントの取り込み（Import）時に、元のFAQコンテンツからOpenAIのChat APIを使いキーワード抽出を行なうことで、手軽に高い精度で、必要なキーワードの抽出ができた。
- なおAzure AI Searchには、ベクター検索・セマンティック検索・ハイブリッド検索の3方式が利用できるが、50問の想定質問で比較をしたところ、ハイブリッド検索が最も正答率が高かったため、ハイブリッド検索を採用している。

#### キーワード抽出のプロンプト例
- 元データのタイトル(original_title)とコンテンツ(doc)を元に、キーワードを抽出している。
- 「見出しによるドキュメント分割」のとおり、元データのタイトルは、チャンク分割されたデータに対しても保持されているため、セマンティック検索と相性が良いと言える。
```python
CONTEXT:
- Answer must be in Japanese.
- Answer only outputs tags which is comma separated CSV.
- Choose the most appropriate tag within 10.
- A tag must be within 3 words.
- Avoid words that are too general or ambiguous.

Follow the CONTEXT above and add multiple tags that best represent the content below.
the title of original content: {original_title}
a chunk of original content: {doc}
```

### 3. FAQシステムのデータを一括でインポートする仕組み
- FAQの数は1,500にも及ぶため、URLリストを作るのも大変である。
- XMLでエクスポートされたデータから、タイトル・コンテンツ・URLをそのまま取り出し、検索DBにインポートすることができるインポーターを実装した。
- 社内に大量のコンテンツがある場合は、なんらかの形で一括でデータを取り扱える仕組みは不可欠である。

## 今後の改善の取り組み予定
- 今回対象外とした他のコンテンツ（マニュアルやルールなど）への拡張を行なっていく。
- 検索精度の向上は継続的に必要だ。フィードバックを得られる仕組みを取り入れ、チューニングを行なっていく。
for文

for文が少しだけ拡張されています。

# for-inの左辺拡張

`in`の左辺の変数で右辺の配列・コレクションの要素を受けられましたが、それに加えてインデックス番号と最終周かどうかのフラグを得られるようになりました。左辺に`,`区切りで変数を記述することで、それぞれの変数に値を受けることができます。

```php
// 1番目の変数に要素
// 2番目の変数にインデックス
// 3番目の変数は最後の周であればTRUE
for c, i, f in ["あ", "い", "う", "え", "お"]
    print [c, i, f]
next
// [あ, 0, False]
// [い, 1, False]
// [う, 2, False]
// [え, 3, False]
// [お, 4, True]

// 要素とインデックスを得る
for c, i in ["あ", "い", "う", "え", "お"]
    print [c, i]
next

// 要素と最終周フラグを得る
// インデックスの変数は省略できる
for c,, f in ["あ", "い", "う", "え", "お"]
    print [c, f]
next

// 要素のみ (従来のfor-in)
for c in ["あ", "い", "う", "え", "お"]
    print c
next
```

# for-else-endfor

forループ中にbreakしなかった場合に動作するelse節が追加されました。

```php
for i = 0 to 2
    print i
else
    print "実行される"
endfor

// 途中でbreakするとelse節は実行されない
for i = 0 to 2
    if i = 1 then
        break
    endif
else
    print "実行されない"
endfor

// for-inも対応
for file in getdir("C:\test", "*.uws")
    if file == "hoge.uws" then
        print "hoge.uwsが見つかりました"
        break
    endif
else
    print "hoge.uwsが見つかりませんでした"
endfor
```

:::note warn
##### ループ処理に単行ifを書くと構文解析エラーになります。

バージョン`0.14.0`にて以下が実行できません

```php
for i = 0 to 2
    if i = 1 then break
else
    print "実行されない"
endfor // [5, 1] - 不正なトークン(EndFor): ブロックの終わりはNextです
```

`else`が単行if文に含まれてしまい、for-elseの解析ができなくなっているのが原因です。
:::
AI + VSCODE？のcursorでwindows・wsl2 + dockerでlinux環境のプロジェクトを開くと存在しないコミットを探しに行く挙動について

## cursor
なんか最近話題になってるみたいで、職場でも「使ってみようぜ！」みたいな機運が高まっています。
AIというか、ChatGPTを組み合わせたVSCODEって感じらしいですね。

世の中にはすでに解説記事があふれているので、どういうことができるのかとか、どうやって使うのかなんかはそちらを見ていただくとして。

こちらの記事は、2023/12ド頭現在に以下の環境（ざっくり）でcursorが使えないぴえん、というメモになります。

## 結論から言いますと
こちらのプルリクエストで解説されている状態です。
- [Failed to download VS Code Server when using Dev Container plug-in](https://github.com/getcursor/cursor/issues/976)

このPRが最初から見つかれば話は早いです。

[でも、そうはならなかった。ならなかったんだよ、ロック。](https://dic.nicovideo.jp/a/%E3%81%A7%E3%82%82%E3%80%81%E3%81%9D%E3%81%86%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F)

になったので日本人向けにこれを書いています。

なお、**11月末に「まだこの問題に着手するのは先のことになりそう」という無慈悲なコメントが付いている**ところまでは確認しました。

ぴえん。

## どういう問題か
環境としてはタイトルにもある通り、ウィンドウズでwsl2とdockerでlinux環境を用意して、そこで開発しています（ざっくり）（自分の認識がそんな感じ）（ふんわりエンジニア）
（言ってる言葉の意味はよくわかっていません。こちらの記事を読んで、それぞれの包含関係くらいは理解できたつもりになっています。）

- [備忘録 - WSL、Dockerの関係性について](https://qiita.com/takmot/items/2274d6cdf648eb135a18)

で、この状態でcursorを開くと、WSL環境のプロジェクトであることを検知してWSL Windowというものを開こうとします。
コマンドとかがwinとlinuxで当然違うので、その辺を考慮してくれるモードみたいなものらしいですね。（ふんわり）（ChatGPT調べ）

もちろんそこまではいいんです。
VSCODEでもよく見たらWSL Windowっぽい状態でしたし。（どこまでもふんわり）

問題は、そのセットアップ？みたいな挙動中に**存在しないコミットをDLしようとして404を吐いて落ちる**ことです。

さすがに出鱈目なコミットIDが無から生成されるわけはないでしょうから**他の設定用の値を使い回してる**とか単純に**もっと前は存在していたけど最近消失したID**だとかそんな感じなんだろうなと想像はしていますがそれが正解だろうと不正解だろうとcursorが使えない現実は変わらず。

前述のとおり、微妙に該当のPRにたどり着くまでに時間がかかってしまったので、同じ問題にぶちあたった人の試行錯誤時間が減ればうれしいなの気持ちで書き記しておきます。

### 少しだけあがいてみようとした記録

ついでに、404になっちゃうなら404にならないところからDLすればいいじゃない、の気持ちで少しだけ調べてみたのですが諦めました。
そもそも特定のコミットを探しに行っててそれが存在しないならもうどうしようもなさそうだよなぁの気持ち。

判断が早いと叱ってくれる方を募集しています。

```
> ワイ
https://update.code.visualstudio.com/commit:62c4c972aa5e76a3f5b465c2e07bce967ffb2e80/server-linux-x64/stable

上記は404が返ってしまいますが、cursorが起動時に自動でダウンロードを試みるアドレスになります。
そのため、起動時にエラーが発生してしまい、cursorを起動することができません。
類似のserver-linux-x64を配置できれば、ダウンロードの必要がなくなる可能性があるのではないかと考えています。
そのようなファイルが取得できるサイトを提示していただくことは可能ですか。

> GPT
現在、Visual Studio Code（VSCode）サーバーの特定のバージョン（linux-x64向け）の直接ダウンロードに関する情報は、公式のVisual Studio Codeのウェブサイトやその他の公式リソースからは直接提供されていないようです。VSCodeサーバーは、通常、VSCodeのリモート開発拡張機能によって自動的にインストールされ、このプロセスは通常、ユーザーによる直接的な干渉を必要としません【29†source】。

CursorがVSCodeの特定のバージョンと互換性を持つか、または特定のVSCodeサーバーのバージョンを必要とする場合、Cursorのドキュメントやサポートチームに直接問い合わせることをお勧めします。彼らは、Cursorの特定のバージョンに最適なVSCodeサーバーのバージョンや、そのインストール方法に関する最も正確な情報を提供できる可能性が高いです。

また、VSCodeサーバーに関する一般的な情報は、Visual Studio Codeの公式ウェブサイトで確認することができますが、特定のバージョンの直接ダウンロードリンクは提供されていないことに注意してください。
```




## 追伸
そういえば初手でユーザドキュメント直下にwslを作成していて、**ユーザ名に漢字を使っていたせいで文字化けして死ぬ**という問題もあったりしました。

dockerをエクスポートして、元の環境を削除（するかちょっと名前を変えるか）して、適当な場所にインポートすればいけます。

```bash
# 環境のエクスポート（Ubuntuの部分は wsl --list --verbose で確認できる名前）
wsl --export Ubuntu C:\path\to\export\Ubuntu.tar

# 元の環境を削除（怖い場合はリネームして作成でも可）
wsl --unregister Ubuntu

# 吐き出したファイルを再度インポート
wsl --import Ubuntu C:\work\Ubuntu C:\path\to\export\Ubuntu.tar

# インスタンスを起動（ユーザを登録したりするかも）
wsl -d Ubuntu
```

一応コマンドはこんな感じでしたが、ChatGPT調べの結果なのでご自身の環境に合わせてどうぞ。
xgboost on RでもGPUを使いたい

Windowsにおいて、xgboost on RでGPUを使おうとしたら、日本語情報が見当たらなかったので作成しました。

# 環境
OS : Windows 10 Home(22H2)
CPU : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz   2.59 GHz
RAM:16.0 GB (15.8 GB 使用可能)
GPU:NVIDIA GeForce RTX 2060
Driver Version: 532.09
CUDA Version: 11.3

# 手順
1. GPUを確認し、CUDAをインストールする。
    - CUDAのインストールはNVIDIAのサイトから。
    - CUDA 11.0となっているが、tensorflowの兼ね合いで11.3だが、多分メジャーバージョンが一緒なら大丈夫。
1. Packageを入手する
    CRANからインストールできるバージョンはGPUに対応していないので、下記URLからダウンロードする。
    https://github.com/dmlc/xgboost/releases
    執筆時点（2023.12.02）では2.0.1が最新。
1. ダウンロードしたPackageをインストール
    生のRからでも、RstudioのGUIからでもどちらでも可能。
    CRAN版をインストール済みの場合は削除してから。
これで使えるようになるはずです。

# 動作確認
下記コードで検証を行った。交差検証を行うことで、学習回数を稼いでいる。
```R
library(tidymodels)
tidymodels_prefer()
set.seed(123)
df <- tibble(
  A = c(rnorm(50000, 70, 10),rnorm(50000, 50, 10)),
  B = c(rnorm(50000, 60, 30),rnorm(50000, 55, 10)),
  C = c(rnorm(50000, 50, 10),rnorm(50000, 60, 10)),
  D = c(rnorm(50000, 40, 20),rnorm(50000, 50, 10)),
  E = c(rnorm(50000, 40, 10),rnorm(50000, 40, 5)),
  F = c(rnorm(50000, 35, 5),rnorm(50000, 35, 10)),
  G = c(rnorm(50000, 40, 20),rnorm(50000, 50, 10)),
  Class= factor(c(rep("Class1",50000),rep("Class2",50000)))
)
cv_splits <- df %>%
  vfold_cv(v = 10)
xgb_recipe <-
  recipe(Class ~ ., data = df) %>%
  step_normalize(all_numeric_predictors())
xgb_model.gpu <-
  boost_tree(trees = 100) %>%
  set_mode("classification") %>%
  set_engine("xgboost", tree_method = "hist", device = "cuda")
xgb_model.cpu <-
  boost_tree(trees = 100) %>%
  set_mode("classification") %>%
  set_engine("xgboost", tree_method = "hist", device = "cpu")
xgb_workflow.gpu <-
  workflow() %>%
  add_recipe(xgb_recipe) %>%
  add_model(xgb_model.gpu)
xgb_workflow.cpu <-
  workflow() %>%
  add_recipe(xgb_recipe) %>%
  add_model(xgb_model.cpu)
###
start <- Sys.time()
xgb_cv <-
  fit_resamples(
    xgb_workflow.gpu,
    resamples = cv_splits,
    metrics = metric_set(accuracy, sens, spec))
end <- Sys.time()
diff <- end - start
print(diff)
# Time difference of 5.665711 secs
start <- Sys.time()
xgb_cv <-
  fit_resamples(
    xgb_workflow.cpu,
    resamples = cv_splits,
    metrics = metric_set(accuracy, sens, spec))
end <- Sys.time()
diff <- end - start
print(diff)
# Time difference of 11.11292 secs
xgb_cv %>% collect_metrics()

```
5.6 sec（GPU）と11.1 sec（CPU）という結果になりGPUによる高速化できました！
## 補足
小データセットや複雑ではないモデル（既定値）ではCPU版の方が早い結果になります。計算部分よりはデータ転送などがネックになっていると考えられ、大きなデータで大きなモデルをやるひとはGPU版も検討してください。
Enjoy!
[AWS Re:Invent 速報] S3のアクセス権制御をマーケットプレイスで一気通貫に実現

# はじめに
この記事は、イベントでの発表と公開記事から、速報記事として作成されています。
実際の製品・サービスのリリース時には、機能や仕様が変わる可能性があることをご了承ください。

# 概要
今週ラスベガスで開催中の年次カンファレンス「AWS re:Invent 2023」において、データマーケットプレイス(CDMP)と、Amazon S3 Access Grantsとの統合が発表されました。

端的に言うと、インフォマティカのデータマーケットプレイスにおいてデータのオーダーを実施すると、S3へのアクセス権限の付与や削除を一気通貫で実施する事ができるようになり、かつユーザーのロールに合わせて、見ることができるデータを制御したり、トークン化することができます。
その実現には、コーディングなど開発作業は不要となり、より容易に連携を実現します。

下記のAWSさんが公開されたブログがかなり詳しく、かつスクリーンショットも多いので参考になるかと思います。

https://aws.amazon.com/jp/blogs/storage/streamline-data-sharing-and-access-control-with-informatica-cloud-data-marketplace-and-amazon-s3-access-grants/


# Amazon S3 Access Grantsとは？
https://aws.amazon.com/jp/s3/features/access-grants/

S3に新しく搭載された権限管理機能で、アプリケーション、ペルソナ、グループ、または組織単位（OU）に基づいて、権限を制御できるようになります。

インフォマティカは、Amazon S3 Access Grantsのローンチパートナーに指名されました。Amazon S3 Access Grantsは、Amazon Simple Storage Service（Amazon S3）の新しいアクセスコントロール機能で、データレイクのAmazon S3アクセス許可を大規模に管理し、AWS CloudTrailでエンドユーザーのAmazon S3へのアクセスに対する詳細な監査履歴を提供します。

# データマーケットプレイス(CDMP)とは？
インフォマティカが提供する、ECサイトのショッピング感覚でデータを申請・取得できるソリューションとなります。
詳しくは、下記をご覧下さい。

https://qiita.com/masatoshimada-max/items/88369d2dc33bdb25a4ab

# どんな課題を解決できそうか？
インフォマティカのAIを活用したデータアクセス管理とCloud Data Marketplaceの機能がAmazon S3 Access Grantsと統合されることで、Amazon S3上に構築されたデータレイクにおけるデータへのセルフサービスアクセスがさらに簡素化されます。データアナリストやデータサイエンティストが自らデータを取得する労力や時間を大幅に削減することが期待できます。

つまり、今までマーケットプレイス上のデータオーナーが、AWS S3の管理者と、手作業や属人的な手続きを実施することで、時間が掛かったり、コミュニケーションロスによる設定ミスなどが発生したところを、一元管理されたセキュリティとプライバシーの管理のもと、最新のデータガバナンス・ポリシーに従って自動化することができます。

# 参考資料
インフォマティカのニュースリリース

https://www.informatica.com/ca/about-us/news/news-releases/2023/11/20231128-informatica-broadens-relationship-with-aws-announces-deeper-integrations-across-generative-ai-aws-healthlake-amazon-s3.html

<BR>

AWS Storage Blog - Streamline data sharing and access control with Informatica Cloud Data Marketplace and Amazon S3 Access Grants

https://aws.amazon.com/jp/blogs/storage/streamline-data-sharing-and-access-control-with-informatica-cloud-data-marketplace-and-amazon-s3-access-grants/

<BR>
Amazon S3 Access Grants

https://aws.amazon.com/jp/s3/features/access-grants/
Javaシステム開発初心者向けtips

# 0. はじめに
この資料はJavaシステム開発初心者向けにtipsをジャンル毎に分けて書いています
使用環境は

Windows
Vue.js
Java(Eclipse)
Git
Linux

かなりざっくりローカル開発～Linux環境に反映までのよく使いどころを抜粋しているので開発時の役にたてば幸いです

# 1. Vue.js
### Vue.js devtools
dataで保持している内容を確認したり編集できたりするchromeの拡張機能
Vue開発時に使用するととても便利

https://qiita.com/hashimoto-1202/items/c81f5d4c271eef16d957

# 2. Eclipseショートカットコマンド等
### ファイル名検索
開いているプロジェクト内に存在する全てのファイルのファイル名を検索をできる
``ctrl + shift + r``
### ファイル内文字列検索
``ctrl + h ``
開いているプロジェクト内に存在する全てのファイル内の文字列を検索できる
バグ発生時にログから対象ファイルを検索したり処理を追うのによく使用
※VS Codeの検索の方が速いかもなので環境毎に使い分ける
### 変数やクラス等の宣言に飛ぶ
``ctrl + 【宣言を選択】 ``
### 色・テーマ変更
``『ウインドウ』→『設定』→『一般』→『外観』→『ルック&フィール』→【好きなテーマを選択】→『適用して閉じる』``
閉じるとテーマが変更されるが一部反映しきれていない箇所がある可能性があるので再起動を忘れずに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618113/3c18e7f7-bcd3-b69f-400d-3779249358ca.png)
※サンプルはダーク
# 3. 基本Gitコマンド
### pull
``git pull {リモート名} {ブランチ名}``
リモートリポジトリからブランチを指定して変更を取得後ローカルにマージする
### commit
``git commit -m "{コミットメッセージ}"``
ステージングしたファイルのコミットを実行する
### push
``git push {リモート名} {ブランチ名}``
ローカルのブランチをリモートリポジトリにプッシュする※基本コミット後に実行
# 4. Linux
### cd
移動コマンド
``cd ..``で１つ上の階層``cd 【ディレクトリ選択】``で指定したディレクトリに移動できる
他のコマンドでも言えることだがTabキーで現在のディレクトリに存在するファイル等の予測を表示できる
### ls
今いるディレクトリの配下にあるフォルダやファイルを確認できる
``ls -la``とすることで隠しフォルダ含む詳細情報が表示される
### tail
ログファイルの表示やAPIのテストを行いたい際に実行しながらリアルタイムでログを見たいときに使用する
``tail -f -n 30 ******.log``
末尾から行数30をリアルタイムで表示
■オプション説明
-f：リアルタイム表示
-n：行数指定
# 5. その他
### サクラエディタ
#### 自由な文字列選択(コマンドやクエリなど複数作成する際などに便利)
``alt + 【十字キー】 ``
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618113/40a0c4d8-0844-286b-38d7-762e3ad453e0.png)
Pythonのaliasについて感じたこと

## はじめに
Pythonのライブラリのaliasについて，ふと感じたことを掲載します．ただの日記です．

## alias（エイリアス）とは
alias（エイリアス）はコマンドを別名で登録します．以下サンプルコード．
```python
import datetime as dt
```
上記のサンプルコードでは，"datetime"というライブラリを"dt"という別名呼び出せるようにインポートしますよという意味．この宣言以降，datetimeを呼び出す際はdtと書けば問題ナシ！
<ins>サンプルでは"dt"と書いてありますが，as以降の文字列は何でもいい（最悪"a"とかでもok！　ただ，何のライブラリかわかるようにしておこう！）</ins>

「ライブラリをインポートしたけど，名前クッソ長えなあ」とか「このコマンド頻繁に使用するんだよなあ」とか思ってる人は使ってみてください．

## 慣例エイリアス
慣例的にエイリアスを使用するライブラリ・モジュールを一部紹介します．
- pandas ... データ解析を支援するためのモジュールが含まれているライブラリです．
```python
import pandas as pd
```
<br></br>

- numpy ... 多次元配列やその数値計算を効率的に行うライブラリです．
```python
import numpy as np
```
<br></br>

- matplotlib.pyplot ... グラフ作成・可視化用ライブラリであるmatplotlibの中で，グラフを作成するモジュールです．
```python
import matplotlib.pyplot as plt
```
<br></br>

- tensorflow ... 機械学習に用いるためのOSS（オープンソースソフトウェア）ライブラリです．
```python
import tensorflow as tf
```
<br></br>

- openpyxl ... ExcelファイルをPythonで操作するためのライブラリです．
```python
import openpyxl as px
```

## エイリアス名みたいなライブラリ
え，これエイリアス名じゃないん？みたいなライブラリを少し紹介します．

- OpenCV ... 画像・動画に関する処理機能をまとめたオープンソースのライブラリです．
```python
import cv2
```
<br></br>

- BeautifulSoup4 ... WebサイトのHTMLから情報を抽出するためのライブラリです．
```python
import bs4
```

## おまけ
慣例エイリアスの中に次のようなものがあります．
- Seaborn ... グラフを作るためのライブラリです．matplotlibより少ないコードで洗練されたグラフを作成できます．
```python
import seaborn as sns
```

**私「...（なんでsnsなんだァ？？？）」**

ちょっと気になったので調べてみました．↓

連続テレビドラマ『[The West Wing](https://en.wikipedia.org/wiki/The_West_Wing)』でロブ・ロウが演じた架空の人物である[<ins>Samuel Norman "Sam" Seaborn</ins>](https://en.wikipedia.org/wiki/Sam_Seaborn)が由来となっているそうです．（Sam Seabornイケメンでした...）
<br></br>

余談ですが，この他にも前述した"BeautifulSoup"という名前の由来は，『不思議の国のアリス』に出てくる "ウミガメのスープ" という歌から派生しているのだとか...

## おわりに
かなり話は逸れてしまいましたが，個人でもチーム内でもエイリアスを使用するルールを決めて快適なコーディングライフを送りましょう．
OpenChain Japan WG 教育SGのこの1年の活動のご紹介

OpenChain Japan WG 教育SGのリードを務めている小泉です。教育SGのこの1年の活動を紹介します。

と、その前にSGというのはサブグループ（SubGroup）の略でして、OpenChain Japan WGでの普段の活動は、共通の関心を持つ人たちが集まってSG単位で行なわれています。（ご存知かもしれませんが念のため説明しました。流石にOpenChain Japan WGの説明は不要ですよね。）
教育SGというからには、その名の通り「教育」に関心のある人たちが集まって、共通の課題について（「そもそも共通の課題は何だろう」というところから）議論しているSGです。

では、教育SGの今年1年の活動を振り返ります。（えっと、実は明日に巨大なのが控えていたりするのですが、、、）



# 教育資料応用編作成
昨年のアドベントカレンダーにも書いたように[OSS教育資料(サプライチェーンリスクマネジメント･バージョン)応用（仮称）](https://qiita.com/yo-iwata/items/fcdd303109a346caba9c#oss%E6%95%99%E8%82%B2%E8%B3%87%E6%96%99%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%83%AA%E3%82%B9%E3%82%AF%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E5%BF%9C%E7%94%A8%E4%BB%AE%E7%A7%B0)を絶賛作成中です。昨年書いた方針から大きな変更はなく、以下の4章構成で作成しています。（ただし、章の名称は最終確定ではありません。）

1. OSSライセンスの調査
1. ライセンス義務の履行
1. SBOM
1. 脆弱性への対応

この中で皆さんが一番気になるのはSBOMかもしれません。ですが、それだけ注目度が高いということは、裏返せば書くのが大変ということでもあります。さらにSBOM自体が、「今月の最新状況を反映して書いたとしても、来月にはその記述は不正確なものになっている」という状況であり、書くのに難儀しているところです。

# ODCでの発表
上記の通り、応用編はまだ鋭意作成中ではありますが、教育SGの成果物はそれだけではありません。すでに出来上がった資料がいくつかあります。今年は、そちらの周知にも力を入れました。
その一つが[オープンデベロッパーズカンファレンス(ODC)2023](https://event.ospn.jp/odc2023/)での発表です。ODCは今年は8/26に[docomo R&D OPEN LAB ODAIBA](https://docomo-openlab.jp/)で開催されました。[資料](https://event.ospn.jp/slides/ODC2023/0826ODC_OpenChain_JPNSWG.pdf)も[動画](https://youtu.be/Wwl_IuQ7_XI?si=g4AL0MATBeAH1oP3)も公開されていますので、ぜひ見てください。（ごめんなさい、カメラの位置をあまり意識せずに話してますね。画面から頻繁にはみ出してます:sweat_smile:）

# OCSでの発表（予定）
本日から始まる[Open Comliance Summit(OCS)](https://events.linuxfoundation.org/open-compliance-summit/)で教育SGの有志が教育SGの活動についてパネルディスカッションをします。パネルディスカッションは明日ですので、たまたまOSCに参加していて、明日の午後たまたま時間が空いているという方は、ぜひ聞きに来てください。（招待制の国際会議ですので、今から聴きたいという方はごめんなさい。）国際会議なので、もちろん英語で頑張ります。
こちらも上の[ODCでの発表](#odcでの発表)と同じく周知のための活動の一つです。

# リード交代
これは活動そのものとはちょっと違いますが、SGにはそれなりに影響があると思いますので、書きます。
鋭い方はすでにお気づきかもしれませんが、この記事を書いている人物が昨年までと違います。教育SGとしてアドベントカレンダーにほぼ毎年書いていますが、昨年までは、岩田さんが書いていました。（例えば、昨年の記事[OpenChain Japan WG 教育資料サブグループのこの１年の活動のご紹介](https://qiita.com/yo-iwata/items/fcdd303109a346caba9c)を見てください。）
これはSGのリードが岩田さんから私に交代したためです。岩田さん、今までのリードとしての活動、お疲れさまでした。立場は変わっても今後も教育SGの活動に関与してもらえるとありがたいです。

# 最後に
以上、OpenChain Japan WG 教育SGのこの１年の活動について簡単に紹介しました。現在も、引き続き応用編の作成とレビューを行っています。皆様の参加をお待ちしています。
また、公開済みの教育資料について「実際に社内教育で使った」「業務委託先に参考資料として紹介した」などの声ももらっています。ぜひ皆さんも使ってみてください。そして、感想や意見をいただけると嬉しいです。
入社半年で感じたこと

## 新たな旅の始まり
2023年4月、私、中山は株式会社スタンバイでデザイナーとしての仕事を始めました。
主に携わっているのは、「スタンバイ」の求人検索サービスのWeb版のデザインです。

入社を決めた理由は、これまで経験したことのない業界に挑戦するためです。私にとって異なる業界で働くことは、デザイナーとしての視点や考え方に新しい深みが生まれると考えています。

## 挑戦の中での変化と課題
入社半年が経過し、この期間の振り返りを共有したいと思います。

新しいデザイナーとしての旅がスタートし、手探りの日々の中、なるべく早く会社のルールとデザインルールに適応していくことが求められる期間でもあります。
しかし、入社してわずか1ヶ月後には既存デザイナーの退職があり、予期せぬ変化が新しい職場での挑戦を一層深化させる要因となりました。

転職を経験した方もそうでない方も、新しい環境での仕事は簡単ではありません。会社のルールとデザインルールへの適応だけでなく、既存デザイナーの退職やドメイン知識の不足、上期施策の確定後など、様々な課題が立ちはだかりました。何をどう探して良いかわからない中での仕事は、不安や葛藤の連続であり、結果を出さないといけないプレッシャーは日々の背中に圧力を与え続けていました。

## コミュニケーションと連携の重要性
これらの課題にどのように向き合ったか。
- デザイナーだけでなく、様々な人と積極的にコミュニケーションを取ることが重要だと感じ、それが解決への近道だと考えた。
- （コロナ禍が落ち着いて）会社方針で週一の出社が始まったタイミングと重なり、オフィスで直接話を聞ける環境が整った。 
- 他部署の人とのコミュニケーションにより、デザインに対して様々な意見が得られ、異なる視点からの洞察を得る良い機会となった。

また、多種多様なデザイナーたちとの連動は新しい環境での成長の鍵になるので、週一で行うようにしました。スタンバイのデザイナーたちは、理想実現型、成果追求型、共同作業型、実務遂行型など異なるアプローチを持つ仲間がおり、そこから異なるアプローチからの視点を収集し、クリエイティブなアイディアの発想に寄与する事ができました。

## 成長への契機と新たな展望
デザイナーとしてのプロセスが複雑になる中で、成果を上げるためには柔軟性と適応力が必要です。手探りのプロセスは不確実性との戦いでもありますが、その中で見つけた新しいアイディアやアプローチは、デザイナーとしてのアイデンティティを形成できると考えています。

プレッシャーや不安がありますが、それも含み自身やサービスに対してプロセスが新しいイノベーションを生み出す契機となっています。特にオープンな環境でのアイデア共有は、デザインの品質向上に寄与しています。同僚たちとの積極的なコミュニケーションが、クリエイティブなフローを促進し、業務全体の円滑な進行をサポートしてくれています。

経験は未来への頑強な基盤であり、手探りのプロセスはデザイナーとしてのスキルアップと共に、より充実したキャリアの形成につながると感じています。新たな挑戦や経験を通じて、これからも成長したいと考えています。将来加わる仲間にも安心感を提供できるよう、努力していきます。
モーダルを複数表示する【 jquery・bootstrap 】

## モーダルからモーダルを開く
モーダルを開いた後、違うモーダルを開く際の考慮事項


基本的な考え方は下記を参照。
----[Bootstrapでモーダルを複数重ねて表示する](https://slash-mochi.net/blog/2019/12/07/post-3041/)


しかし、これだけだと
一つモーダルを閉じると、全てモーダルが閉じたとみなされる。
（ body の class、「modal-open」 が 消されてしまうため ）

そのため下記を参考に、「モーダル表示中」だと認識させる。
----[複数のmodalを表示したときにスクロールできなくなるときの対処方法](https://www.e-pokke.com/blog/bootstrap3-modal-scroll.html)
MVVMアーキテクチャにおけるViewModelとModelの関係性をChatGPTに聞いてみた

# MVVMアーキテクチャにおけるViewModelとModelの関係性をChatGPTに聞いてみた

## はじめに

WindowsOS上で動作するデスクトップアプリ開発において、保守性などの観点からMVVM（Model-View-ViewModel）アーキテクチャが推奨されます。

- Modelではアプリケーションのビジネスロジックを実現
- ViewではUIを実現
- ViewModelではViewの表示ロジックを実現

といった具合で、それぞれの責務を担うことで保守性を高められます。

## 疑問に思っていたこと

このように層別に分けることで保守性を高めるといった考え方なのですが、実際に一般的なサンプルなどを見てみてもViewModelがModelを持つことが多く、一般的なことが多いです。
しかし、ちゃんとMVVMアーキテクチャを守ろうと思うと、ViewModelがModelを直接持つのはかなり危険です。ModelでやるべきことをViewModelでやらせてしまうようなことがどうしても起きてしまいます（アプリケーションのビジネスロジックが流出してしまう）。自分が実装するときもうっかりやらかしてしまうことがありました。

そこで、ChatGPTに聞いてみて、一般的にどうなのだろうということを聞いてみました。

## ChatGPTへの質問とその回答

実際にしてみた質問とその回答です。バージョンや聞き方によって回答が異なるかもしれませんが、Modelを持つのも一般的ではあるがお作法としてはやはりよろしくない、との回答が得られました。

自分
> WPFをMVVMアーキテクチャで作るとき、ViewModelのコンストラクタに何を渡すのが一般的でしょうか？自分は大体の場合、Modelを渡すことが多いのですが一般的な利用方法から外れていないでしょうか？

ChatGPTの回答
> MVVMアーキテクチャでは、ViewModelはビューの表示ロジックを担当し、Modelはアプリケーションのビジネスロジックを担当することが一般的です。そのため、ViewModelのコンストラクタには、ビューの表示に必要なデータや機能を提供するオブジェクトを渡すことが望ましいです。
>
>ViewModelに何を渡すかは、アプリケーションの要件によって異なりますが、一般的には以下のようなオブジェクトを渡すことがあります。
>
>Model: ViewModelが表示するデータを取得するために使用するオブジェクトとして、Modelを渡すことが一般的です。
>
>サービス: ViewModelがビジネスロジックを実行するために必要なサービスオブジェクトを渡すことがあります。例えば、データベースにアクセスするためのデータベースサービス、ネットワークリクエストを行うためのHTTPクライアントなどです。
>
>コマンド: ViewModelが実行するコマンドを渡すことがあります。例えば、ボタンがクリックされたときに実行するコマンドオブジェクトをViewModelに渡します。
>
>イベント: ViewModelが監視する必要があるイベントを渡すことがあります。例えば、モデルが変更されたときに通知するイベントオブジェクトをViewModelに渡します。
>
>ただし、Modelを直接渡すことは、MVVMアーキテクチャの理念に反しているとも言えます。ViewModelは、ビューとModelの間にある仲介者であり、Modelとビューを直接結びつけることは、ViewModelの役割を不明瞭にする可能性があります。そのため、ViewModelのコンストラクタには、ViewとModelの間にある仲介者であるサービスやコマンドを渡すことが望ましいです。

## ViewModelとModelを切り離すには

ViewModelとModelを切り離すことが望ましいことはわかりましたが、それだけでは実際にユーザーの編集した結果をModelに反映することができません。
MVVMアーキテクチャの理念に沿って編集したい場合にはどうするべきかも問い合わせました。
すると、サービスを経由して設定すべきといったような以下の回答が得られました。

自分
> ViewModelからModelに値を反映したり、操作したりしたい場合はどうするとよいでしょうか？

ChatGPT
>MVVMアーキテクチャでは、ViewModelはビューの表示ロジックを担当し、Modelはアプリケーションのビジネスロジックを担当します。ViewModelからModelに値を反映したり、操作したりすることは、MVVMアーキテクチャの理念に反していると言えます。
>
>ViewModelは、ModelとViewの間にある仲介者であり、ViewとModelの直接的な関係を避けることが重要です。したがって、ViewModelからModelに値を反映したり、操作したりすることは避けるべきです。
>
>代わりに、ViewModelはModelから必要な情報を取得し、それをビューに表示するために使用します。また、ViewModelがユーザーのアクションを受信し、それに応じてModelに変更を加えることもあります。
>
>ViewModelがModelに変更を加える必要がある場合は、代わりにサービスを介してModelにアクセスすることが望ましいです。サービスはModelの詳細を隠蔽し、ViewModelが必要な情報だけを取得し、変更することができます。また、サービスによって変更されたModelの状態は、他のViewModelやアプリケーションコンポーネントに反映されることがあります。
>
>したがって、ViewModelからModelに値を反映したり、操作したりすることは、MVVMアーキテクチャの理念に反しているため、避けるべきです。代わりに、サービスを介してModelにアクセスし、必要な情報を取得し、変更することが望ましいです。

## 所感

ChatGPTに聞き、確かにその通りとは思ったものの、以下のメリット・デメリットは存在すると感じました。確かに理念を考えるとViewModelとModelを切り離すべきなのですが、割に合うか否かは考えどころかと思いました。

- ViewModelがModelを直接持つ場合
  - メリット
    - シンプルに書ける
    - Modelの変更通知（Viewに値が変わったことを伝えるために必要な仕組み）を簡単に利用できる
  - デメリット
    - ViewModelとModelの境界が曖昧になる
- ViewModelがサービスを介してModelにアクセスする場合
  - メリット
    - ViewModelとModelの境界が明確になる
  - デメリット
    - サービスを介する分関連するクラスが増え、複雑化する
    - Modelの変更通知をサービスを通じて行わないといけない

## おわりに

ChatGPTに聞いてみたことで、改めて自分の理解を深掘りできました。一般的な知識の範疇にはなってしまいますが、考えを整理したり、疑問に思っていたことを素直に聞けたりとうまく活用すると便利なことが多いと感じました。
また気になることがあればChatGPTに聞いてみて、これまで経験してきたこととすり合わせてより深く学ぼうと思います。
Conventional Commits

Label | Detail
-|-
release  | リリースコミット
build    | ビルドプロセスの変更
chore    | 補助ツールの変更
ci       | CI関連の変更
docs     | ドキュメントの変更
feat     | 機能の追加、変更、削除 <br> （セマンティックバージョニングのマイナー以上）
fix      | バグ修正（セマンティックバージョニングのパッチ相当）
perf     | パフォーマンス改善
refactor | リファクタリング
revert   | リバート
style    | フォーマットの変更（動作に影響しないコードの変更）
test     | テストの追加・修正

type(scope): Scoped pattern
type!: Breaking change

_Refs:_
- [What is commitlint - commitlint](https://github.com/conventional-changelog/commitlint#what-is-commitlint)
- [例 - Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0/#%E4%BE%8B)
- [Conventional Commitsでコミットメッセージを分かりやすくする](https://soudai-s.com/align-commit-messages-by-conventional-commits)
- [cz-conventional-changelog-ja/commit-types.json](https://github.com/AquiTCD/cz-conventional-changelog-ja/blob/master/commit-types.json)
2023年７月にCollapse OSはDusk OSに置き換わる

## はじめに
秋葉原ロボット部Advent Calendar 2022 7日目に「半導体不足時代のCollapseOS」という記事を掲載しました。
https://qiita.com/kazueda/items/c35ab8017cdf60e84e4c
この記事では、IntelPC上でUSBメモリから起動するCollapse OSの環境構築を紹介しました。

2023年７月に８ビットCPUで動作するForth OSのCollapse OSから、32ビットForthの動作するDusk OSでの環境開発に変わったようです。

この記事では、Collapse OSと比較しながら、Dusk OSの概要を紹介します。

## Collapse OSの設計思想と特徴
設計思想
1. 最小限の身近で手に入りやすいマシン上で動作可能
1. 身近で手に入りやすいインターフェース
1. テキストやバイナリの情報を編集可能
1. マイクロコントローラーからCPUまでのアセンブラソースをコンパイル可能
1. 様々な記録デバイスの読み書きが可能
1. 動作環境でアセンブルでき、他のマシンへ移植可能

特徴
1. リソースの少ないZ80、8086、6809や6502マシン上で動作
1. Z80、AVR、8086、6809や6502のバイナリをアセンブル可能
1. 6502と6809のディスアセンブル可能
1. AVRマイクロコントローラのプログラムが可能
1. Forthでよく用いられるエディタに似たコマンドラインエディタだけでなくUNIX' VIにヒントを得たビジュアルテキストエディタ搭載
1. ビジュアルバイナリエディタを搭載
1. Forthインタプリタ搭載
1. CCとmakeだけでPOSIX環境でビルド可能
1. マシン依存のコードを除くと、2000行のコード

## Dusk OSの現状
- i386、ARMとオンラインエミュレータのWASM、あるいはNetBSDカーネル上で動作可能
- FAT12/FAT16ボリュームからの起動やボリューム上の読み書きが可能
- FAT12/FAT16ボリュームを新たに作成可能
- 6502CPUをエミュレート可能
- 汎用性の高いCコンパイラ
- とても小さなフットプリント。昔の16 MBのRAMを搭載したPentium 75 MHzで動作可能
等など

## Dusk OSを作った理由
Collapse時代後、どのようなアーキテクチャとOSが利用可能かを予測するの難しくなったことと、個人で管理できるOSはお遊び用OSで実用に耐えうるのは複数の人々が管理するOSになっている現状を気にしているからのようです。

## おわりに
Forthが単純で現在も進化しているOSなので、Dusk OSの作者はForth OSを推しているようです。

たしかに、6809のCPUのマシンでは、Forthをファームウェアのように使って、その後より大きなOSOを起動する例があります。multicomp09上のForthとFuzixの関係がそれに相当します。

移植アーキテクチャが、80386以降とRaspberry piを含むARMになっているのが興味深いです。

追伸
NEC PC-9801へのポートの情報
https://lists.sr.ht/~vdupras/duskos-discuss/%3C413840582.472243.1688267692920%40privateemail.com%3E
Workato：Lookup Tablesには作成可能なテーブル数の上限があります

Workatoでは、Lookup Tablesと呼ばれる簡易的なテーブルがあります。

このテーブルでは、最大100,000行（エントリ）、1行あたり最大10列（カラム）のデータを管理することができ、レシピからテーブルに対してレコードの検索・追加・編集・削除を行うことができます。外部サービスやストレージ・DBに頼ることなく、Workatoだけで手軽に使える機能であるため、一時テーブルや簡易的なマスタとしてよく使われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/28ac2e24-fb79-057d-9f2f-0195e088ffda.png)

なお、Lookup Tablesには上記で示した行数・列数の制限のほかに、テーブル数にも上限が設けられています。Lookup Tablesは最大100件という制限（上限）があり、この上限に達した場合、以下のメッセージ（アラート）が表示され、Lookup Tablesが作成できなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d8655b4a-e83d-985d-3241-7f56a480e57d.png)

また、この制限はWorkatoのドキュメントにもきちんと書かれていません。ですので、この記事を見ていない方は、おそらくメッセージが表示されてから制限があることに初めて気づくことになります。

Workatoの活用が進むにつれてLookup Tablesの数が増えるということはあるかもしれませんが、テーブル数の上限には十分お気を付けください。
国土交通データプラットフォーム　便利な使い方②

# 3次元地形とCADを並べて表示してみた

これまでの記事を参考に、[国交DPF](https://www.mlit-data.jp/)をお試しいただけましたか？

国交DPFには工事のCADデータも色々と登録されています。そのCADデータがどんな場所に対して設計されたものか、気になりませんか？国交DPFを使えば、簡単に確認できるんです。

その手順はとっても簡単3STEPです。
- STEP1 CADデータを検索する
- STEP2 検索したデータをお気に入り登録する
- STEP3 3次元表示してCADデータと並べて表示する

無理やり3STEPにしたのでは？というツッコミは飲み込んでくださいね。では早速やってみましょう！

<br>

## STEP1 CADデータを検索する
まずはデータを検索しましょう。メニューから「簡易検索」を選んで簡易検索画面を表示します。

フォーマットで「IFC」を選ぶと、CADデータを検索できます。キーワードは行きたい「北海道」にして、「検索」ボタンを押します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/304cca82-38f5-3234-9bf6-a06e5790ef5b.png" width="500px">

<br>

すると、7件のデータが検索されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/eccf7c8f-a07c-26a0-9748-15d5818809bf.png" width="500px">

<br>

## STEP2 検索したデータをお気に入り登録する
次に、お気に入りに登録しましょう。

検索されたデータの右側にあるお気に入りボタンをクリックして黒くするだけです。一番上の「一般国道239号　苫前町　霧立峠トンネル工事」をお気に入り登録してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/346c0a4e-c877-b404-4366-a0a6aba3a11e.png" width="30px">

<br>

これでお気に入り登録されました。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/4d6aa3f3-9c3e-9212-239d-bf6ecf58f23f.png" width="500px">


<br>

## STEP3 3次元表示してCADデータと並べて表示する

最後に3次元表示してCADデータと並べて表示してみましょう。

左下のお気に入り表示ボタンを押します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/c03ccf87-64b5-4bcf-1062-191ed84074ff.png" width="500px">

<br>

お気に入り登録したデータだけが表示されます。スクロールして近づいてみるとこんな感じ。トンネルがありそうですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/415860e3-8614-c198-e122-a1c4920b80a5.png" width="500px">

<br>

ここで3次元表示をしてみます。下の方にある地図の表示を「3D地図表示」に切り替えてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/2a3529b6-8393-8d8f-3298-db30cf786919.png" width="200px">

<br>

3次元表示に切り替わりました。マウスのスクロールや左クリックしながらのマウス操作などで移動することができます。マップの操作は、[3Dマップの操作](https://www.mlit-data.jp/#/Help?id=help_3d)を参考にしてください。黄色く線を入れたところにトンネルが通っているようです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/e2d935fa-68ab-f5ba-1541-8ff508a532db.png" width="500px">

<br>

では、トンネルのCADデータも並べて表示してみましょう。左側の一覧でデータを選択し、「.IFC, .XML」ボタンをクリックすると、この場所のデータ一覧が右側に表示されます。ここには、10点のIFCファイル（CADデータ）とINDEX_C.XML（工事管理ファイル）が登録されています。試しに一番上のデータの「プレビュー」ボタンを押してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/af1a9b74-ce50-9512-63e2-8c34e7ca2221.png" width="500px">

<br>

こんな感じで、CADデータが表示されました。右側のピンの立っているあたりに設計されたトンネルですね。CADデータの操作は、[IFCビューアの操作](https://www.mlit-data.jp/#/Help?id=help_ifc)を参考にしてください

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/4c15c948-f292-857f-fcd8-449e91dc3350.png" width="500px">

<br>

これで、3次元地形とCADを並べて表示することができました。簡単3STEPでした！

## ぜひお試しください

国交DPFを使えば、ブラウザ上で登録されているCADデータや3次元地形を確認することができます。ぜひ一度、[国交DPF](https://www.mlit-data.jp/)にアクセスしてお試しください。

それではまた明日、よき冬の日をお過ごしください。
GAS開発の失敗談（随時追加予定）

こんにちは。

GASを使っていて、失敗したところを記述していきます（随時追加予定）。

皆様には、落とし穴を回避するのに役立てていただけると、嬉しく思います。

# ファイルのコピー
え？今更何いっているんだ？って声が聞こえてきそうですが、オーナー権限周りでわかりづらい落とし穴があります。

オーナー権限を持っているときに、「コピーを作成」をクリックすると、完全に別ファイルのコピーが作成されるのですが、
オーナー権限を持っていないファイルに対して「コピーを作成」をクリックすると、ショートカットが作成されます。

同じファイルかどうかはURLのIDをご覧いただけると確認できます。

コピーしたときのファイル名が同じなので大変わかりにくく、これが原因で失敗してしまいましたね。

Googleさん。。ショートカットならショートカットって言ってくださいよ。。。

# 審査に時間がかかる
GASを使う際、赤いビックリマークの表示がありますよね？
みんなで使うためにそれを消したくてGoogle Cloudで審査を受けようしましたが、
3週間〜4週間ほどかかるという記事を読み、諦めました。

審査についての情報は、あまり公開されていない印象です。

なお、私はいつ審査を申し込んだのか記録しておくのを忘れたので、実測値は公開できません。

---

まだ作り始めた段階なので、これで以上です。
また、わかりづらい落とし穴を見つけましたら、その度に追加する予定です。
国土交通データプラットフォーム　便利な使い方①

# 国土交通データプラットフォームの便利機能を紹介

## はじめに

[国土交通プラットフォーム](https://www.mlit-data.jp/#/)はデータをダウンロードするためだけのサイトではありません。
今回は、検索結果の保存やお気に入り機能等の便利機能紹介しつつ、[国土交通プラットフォーム](https://www.mlit-data.jp/#/)の地図上に都市の3Dデータを表示させてみたいと思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/06427541-2b42-d2f3-44ac-535ed3f00784.png" width="500px">

## 検索条件の保存
まずは目的の3Dモデルデータの検索から始めます。<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/765f2d27-4023-9da4-790f-2497c139b03e.png" width="500px">

別に簡易検索でもいいのですが、検索条件の保存を少し紹介したいので高度検索を選択しています。<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/7b2b74ec-29fe-3c55-e63d-bb907d71c201.png" width="500px">

今回は東京都の都市3Dデータが欲しいので、東京都とカタログから都市3Dデータ（PLATEAU）で絞っています。<br>

検索項目を追加し終わったら次に検索条件を保存してみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/d0af3867-1968-6c40-3361-0ea7cdb82380.png" width="500px">

検索条件の名称をなんでもいいので入力してOKを押すと保存が完了します。<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/df6f590b-3e66-b6b4-4fd3-244c365aa81f.png" width="500px">

例えば全然違う別のデータを探しにいきたい時、検索条件を保存しておけば色々な条件で検索した後でも、すぐに前の条件を読み込むことができます。<br>
さらに検索の共有リンクを作ることができるので、他の人と協力して欲しいデータを探したい時等活用できます。


## お気に入り登録
次は検索したデータをお気に入りに登録します。<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/84d996f5-0209-dbe4-fd4d-a3d0666e81d8.png" width="500px">

今回はとりあえず全部お気に入りに登録します。<br>

登録することによって、再度検索することなくすぐにアクセスできます。<br>


:::note warn
注意
10日間連続でアクセスがない場合、お気に入りに登録されたデータは削除されます
10日間以内にアクセスがあった場合は、保存期間が延長されます
:::


## 3D地図表示
[国土交通プラットフォーム](https://www.mlit-data.jp/#/)の2D地図を3D地図表示に切り替えて見てみます。<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/4eda55c7-b262-475f-cf59-aac524f27a85.png" width="500px">

2D地図を3D地図に切り替えてグルグル回すと・・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/e9e8c8f4-9e80-dbf2-2ede-5599a695ca6e.png" width="500px">

こんな感じで横から見えたりします。<br>
2D地図表示から3D地図表示に変更することで、3次元の視点で色々な角度から地図を見ることができます。

## お気に入り登録した3Dモデルを表示する
お気に入りに都市3Dモデル（PLATEAU）を登録してある状態で地図を2Dから3Dに切り替えると・・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/7ea6d934-5b4a-36e5-f000-07307f62c21c.png" width="500px">

データが3D地図上に表示されます。<br>
色々な大きさの建物があることが直感的にわかりますね。
## おわりに
[国土交通プラットフォーム](https://www.mlit-data.jp/#/)は今回紹介したデータだけではなく、災害情報等の様々な情報がアップロードされています。<br>


画像のように組み合わせて表示させるともできるので、紹介した機能を活用し、目的のデータを探して是非地図上に表示させてみてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629590/772995ce-c499-08c1-e41a-84b1fababf7c.png" width="500px">

:::note warn
ご利用の環境またはPCの設定により、ご利用になれない場合があります
:::
discordに毎朝ニュース記事付きで朝の挨拶を送るツンデレBotのGAS

## discordに毎朝ニュース記事付きで朝の挨拶を送るツンデレBotのGAS
いつも朝の挨拶を送ってくれるbotちゃんをご紹介。
GASだからインフラは無料でOK！

https://github.com/judy-choko/discordgas/tree/main
[iOS17.1] App Tracking Transparency（ATT）のダイアログが表示されなくなった

# はじめに
本記事は、仕事とは無関係の個人で開発しているショッピングアプリでの開発での問題解決の記事です。
勤務先の仕事とは一切関係ありません。


# お悩み

iOSアプリのiOS17.1対応をしていた際に、App Tracking Transparency（ATT）のダイアログが表示されなくなってリジェクトを食らった。

ローカルビルドの実機テストの際には表示されるのに、TestFlightにあげてインストールすると表示されなくなる。

# 不具合発生時の実装
viewDidLoadで以下のようなコードを実装していた。

```objective_c
#pragma mark - viewDidLoad
- (void)viewDidLoad {
    [super viewDidLoad];

    //〜中略
    
    //広告のATT許可チェック
    BOOL isTrackingEnabled = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];
    NSLog(@"isTrackingEnabled=%d",isTrackingEnabled);
    if(!isTrackingEnabled){
        [self requestTrackingAuthorization];
    }
}

- (void)requestTrackingAuthorization {
    
    if (@available(iOS 14, *)) {
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
            switch (status) {
                case ATTrackingManagerAuthorizationStatusAuthorized:
                    NSLog(@"トラッキングが許可されました");
                    break;
                case ATTrackingManagerAuthorizationStatusDenied:
                    NSLog(@"トラッキングが拒否されました");
                    break;
                case ATTrackingManagerAuthorizationStatusNotDetermined:
                    NSLog(@"トラッキングの許可がまだ選択されていません");
                    [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
                        // ユーザーがトラッキングの許可または拒否を選択した後の処理
                        //〜中略
                    }];
                    break;
                case ATTrackingManagerAuthorizationStatusRestricted:
                    NSLog(@"トラッキングが制限されています");
                    break;
                default:
                    break;
            }
        }];
    }
}


```


# 解決方法
どうやら、iOS17では、viewDidLoadで即座に

- requestTrackingAuthorization

を呼び出すと、表示されなくなっているっぽい。
（今回iOS17.1対応をしていたので、それ以下のVerの動作は確認していない。今までは問題なかった。）

「- (void)applicationDidBecomeActive:(UIApplication *)application に実装すれば良い。」
というような情報も見かけたが、自分はうまく動かなかった。（ローカルビルドの実機テストでは動くが、TestFlightからインストールするとダメ）

そこで、以下のように「requestTrackingAuthorization」の実行を意図的に遅延させることで、無事表示されるようになった。

```objective_c
#pragma mark - viewDidLoad
- (void)viewDidLoad {
    [super viewDidLoad];

    //〜中略
    
    // viewDidLoadでATT許可チェックの呼び出しを1秒遅延させる
    [self performSelector:@selector(delayedMethod) withObject:nil afterDelay:1.0];
    
    
}

-(void)delayedMethod
{
    //広告のATT許可チェック
    BOOL isTrackingEnabled = [[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled];
    NSLog(@"isTrackingEnabled=%d",isTrackingEnabled);
    if(!isTrackingEnabled){
        [self requestTrackingAuthorization];
    }
}

- (void)requestTrackingAuthorization {
    //〜実装同じなので割愛
}


```


無事、AppStoreレビュー通りました！
iPhone / iPadともに同じ実装で大丈夫でした。

別の方法もあるのかもしれませんが、自分はこのような対応で今回の問題を解決しました。
課長職と教師は似てるなと感じたので共通点をまとめてみました

# 1.はじめに
どうも、ARIの名古屋支社に勤務している愛知県民こと、
新藏（にいくら）と申します♪
(/・ω・)/

**ARIのアドベンドカレンダ3日目の記事となります！**

https://qiita.com/advent-calendar/2023/ari-group

最近、ありがたいことに「課長代理」という役職をやらせていただいてます。

色々仕事をしていく中で、ふと課長職と教師が似ていると感じたので、
**今回は課長職と教師の共通点について記事にしたいと思います！**

管理職の方、管理職に興味がある方の参考になれば幸いです。
(*^^)v

:::note info
ちなみに、ARIにおいては課長代理は「ほぼ課長」という役割となります。

各種会議体への参加、部下の人事考課の監修、経費の承認
等々を課長と協力して進めていくイメージとなります。
:::

# 2.課長職と教師の共通点
では、本題となります！

## 2.1.部下や生徒を導くリーダ
まず初めに、部下や生徒を導くリーダである点です。

課長職は1on1や人事考課で、教師は授業や日々の関わりの中で
**部下や生徒が「今後、将来どうなりたいのか」を聞き、
それを実現するためにはどうすれば良いかを考えます。**

また、悩み等を聞く相談役としての役割も両者共通していると感じました。

課長職や教師の動き次第で、部下や生徒の人勢が変わる可能性もあるので、
責任重大ですね・・・！

## 2.2.部下や生徒の見本となる
前節と少し近い内容になるのですが、
以下の課長や教師には、中々部下や生徒はついてこないのかなと考えています。

・資格を全然持っていない課長
・技術力がない課長
・遅刻が多い教師
・理不尽に怒る教師

他の方を導くためにも、他の方の見本となる行動や発言が大切な気がしています。

**課長で忙しい中、どのように技術の勉強をするのか（どのように時間を作るのか）**
というのが自分自身の課題なので、この辺りはもう少し考えてみます。

:::note info
色々忙しくても1エンジニアではありたいので、
「それでも」と言い続けたい・・・ですね
:::

## 2.3.どこまでこだわるかは自分次第
次の共通点としては、どこまでこだわるかは自分次第な点です。

具体的には、課長職であれば
・人事考課の際に「提出してくださいね」だけ伝える
・1on1を実施して内容の認識を合わせる

教師であれば
・授業で教科書を読むだけにする
・自分なりに考えてオリジナルの授業にする

等どこまでこだわるのかは自分次第と感じました。

**個人的にはこだわった分だけ、巡り巡って得になる**と考えています。

## 2.4.意外と大変
最後の共通点は、意外と大変ということです。

私の場合ですと
・通常の業務
・課長職が参加する会議に参加
・人事考課を監修する
・経費の承認をする
・勤怠の承認をする
・残業の承認をする
・案件の承認をする
等々があります。

私の場合ですが、特に月末は経費や勤怠の承認で色々な画面や資料を確認しています。

:::note info
去年、私が係長の時は上記の「通常の業務」以外のタスクはありませんでした。
:::

教師の場合ですと
・授業の準備
・プリント作成
・部活
・朝の挨拶
・テスト作成
等々があり、こちらもそこそこ大変そうだと考えています。

:::note info
ちなみに、私自身は大学3年生の時に3週間教育実習に行きましたが、
上記のタスクをこなすのに必死で寝不足になりました・・・

深夜まで作業しないと終わらなかったです。
:::

# 3.おわりに
ここまで読んで下さり、ありがとうございます！！！
(^^)

今回は「課長と教師の共通点」というポエム的な内容でした。
何年後になるは不明ですが、また役職が変わったタイミングで、
色々感じたことを書こうかなと思います。

次回も引き続き何か記事にします♪
(:3_ヽ)_
二作目のポートフォリオを作る話

# 何を作るか、という問題
前回は買い物メモの作成、共有、冷蔵庫管理アプリを作成しました。じゃあ今回は何を作ろう、という初期の初期、方向性が定まっていない。方向性大事。

## 前作での問題と二作目のことを整理
■ 思いつきで作り始めた結果
ポートフォリオを作成し始めて1ヶ月、「こんなもん誰が使うんだ・・・」という状態に。結果、新しく作り直す。無駄を恐れないスタイル。1ヶ月は大きいよ・・・

■ 新しい技術を身に着けたい。
前回はバックエンドをRailsAPIで構成。今回はバックエンドを変えてPythonやPHPでチャレンジしてみることにする。

■ なぜPythonなのか
絶賛転職活動中のおじさんですが、RubyやRailsを扱えるエンジニアを求めている案件自体、あまり無い。勉強している時から気づいていたが、RubyやRails一本では厳しい、と感じていた。
じゃあRubyってダメなの？と言われればそうでもなく、私としては大好きで、今後も勉強したことは大事にしていきたい。実際、Webアプリケーション開発現場では徐々にシェアが広がっている。らしい。

参考）https://w3techs.com/technologies/history_overview/programming_language/ms/y

Webアプリケーション開発ではPythonよりもRubyのシェアのほうが大きく、PHPが独走状態。じゃあPHPを勉強しろよ、という話になってくる。

ただ、今回はサラリーマン時代から興味のあった、「自動化ツール」の作成にチャレンジしてみたいという思いもある。今現在も仕事中に、「このコピペ作業どうにかしたい・・・」と思う場面はかなりある。
よくネットで見るPythonやRPAを使った自動化スキルがあれば、また今とは違ったエンジニア像が見えてくるかも？

誰かの仕事を楽にするエンジニアになれたらな、というエンジニアを志したきっかけからも乖離している訳でもなく、むしろ沿っているように思う。

■ じゃあどんなものを作ろうか
＜自動化ツールの場合＞
 ・ 転職活動、どこの会社に落ちたか記録するツール
 → 落ちた会社に重複応募して気まずい & 再度落ちるという精神的オーバーキルを防ぎたい。落ちた会社を一覧化できるツール。100社目くらいからもうよく分からなくなるのよね・・・。

 ・ 退任役員追跡ツール
 → 仕事柄、有名企業の役員の退任情報を見る機会がある。退任した役員が今何をしているのかをポチポチ調べるのはホントしんどい。

 あまり思い浮かばない。。。

 ＜Webアプリケーションの場合＞
 フロントエンド： React
 バックエンド：　PHP（Laravel）

 ・業務管理アプリ
 → チケットで業務を依頼する業務管理アプリ
 → チケットでの依頼
 → 自身のチケット数や部下のチケット数を可視化出来るコンソール
 → 他者へのチケット割り振り
 → 企業ログイン
 → チケットの基本的なCRUD処理

 プロジェクト管理のフローチャートにチケットを結びつけたり、スケジューラーに紐づけできたりしたい。

 やっぱり具体的に「あれしたい！」「これしたい！」が思い浮かぶのはWebアプリケーションかしら。。。

 どちらを作っても技術面を評価されると思う。ただ、自身が今後どちらの分野で飯を食っていきたいのかで決めるしかない。いやマジ、飯が食えるのかどうかさえわからない訳ですが。はは！
SvelteKitでパスを取得する

# URLからパラメータを取得する方法
SvelteKitではURLの一部を変数として扱うことができる。
例えば、src/routes/[slug].svelte というファイルを作成すると、[slug] の部分は何でも良い文字列になる。

仮に、`/your-slug-here` のようなURLにアクセスすると、your-slug-here が slug の値として取得できる。

# load 関数でのパラメータの取得

SvelteKitでは、`+page.server.js`ファイルを使用してサーバーサイドでページに関連するデータを取得できる。
load 関数は、server.jsファイル内で定義し、ページにアクセスする際、サーバーサイドで実行される。


```js:src/routes/[slug]/+page.server.js
export async function load({ params }) {
  // 'slug' パラメータの取得（異なるパラメータ名の場合は変更が必要）
  const slug = params.slug;

  // 'slug' をクライアントサイドに返す
  return {
      slug  
  };
}
```

paramsオブジェクトから、URLの動的な部分（例：[slug]、[id]、[name] など）に対応する値を取得できる。

## クライアントサイドで受け取る

```svelte:src/routes/[slug]/+page.svelte
<script>
  // 'data' は +page.server.js から渡される
  export let data;
</script>

<div>
    <!-- propsの中にはいってる -->
  <h1>Slug: {data.props.slug}</h1>
</div>
```


実際には、取得したパラメーターを使って、データをフェッチ、取得したデータを返すこと多い。

**例えばこんな感じ↓**


```js: src/routes/[category]/+page.server.js
// 商品データ
const products = [
	{
		id: 1,
		name: 'パスタ',
		price: 1000,
		category: 'pasta',
		description: '美味しいパスタです'
	},
	{
		id: 2,
		name: 'パン',
		price: 600,
		category: 'bread',
		description: '美味しいパンです'
	}
];

// 商品データからカテゴリーに一致する商品を返す関数
const getProducts = (category: string) => {
	return products.filter((product) => product.category === category);
};

export function load({ params }) {
	const category = params.category;
	const filteredProducts = getProducts(category);
	return {
		products: filteredProducts
	};
}

```