OmniAICreator/Qiita-1.07M huggingface dataset:
超初心者向け！JavaScript学習の壁を乗り越える方法

## はじめに
JavaScriptを学び始めたばかりの初心者が陥りがちな困難と、それを抜け出すためのステップを紹介します。この記事では、初心者が最初に感じる壁をどう乗り越え、より効果的にJavaScriptを学ぶための方法を解説します。

## 1. 基本的な文法に慣れる

まず最初にやるべきことは、JavaScriptの基本的な文法を理解することです。これには、変数宣言、データ型、演算子、制御フロー（if文やfor文など）を学びます。これらはプログラミング全般に共通する基礎知識なので、しっかりと押さえておきましょう。

例えば、変数の宣言方法は以下のようになります。

```javascript
let x = 10;
const y = 20;
```

データ型には、数値や文字列、配列、オブジェクトなどがあり、それぞれに適切な使い方があります。

## 2. 関数の使い方を理解する

関数はJavaScriptで重要な概念です。関数を使いこなせるようになることで、コードを効率的に再利用でき、可読性も向上します。

例えば、簡単な関数の定義と呼び出しは以下のように行います。

```javascript
function greet(name) {
  return 'Hello, ' + name;
}

console.log(greet('World')); // 出力: Hello, World
```

関数は引数を受け取り、処理を行って結果を返すことができます。

## 3. 非同期処理を理解する

JavaScriptは非同期処理に強力です。初心者がつまずきやすい部分ですが、Promiseやasync/awaitを理解することで、非同期処理を効率よく扱えるようになります。

例えば、非同期関数の使い方は次のようになります。

```javascript
async function fetchData() {
  let response = await fetch('https://api.example.com/data');
  let data = await response.json();
  console.log(data);
}

fetchData();
```

非同期処理をうまく使いこなすことで、APIからデータを取得したり、時間がかかる処理を効率よく扱えるようになります。

## 4. コンソールを活用する

開発中にエラーを見つけた場合、コンソールを使ってデバッグを行うことが重要です。console.log()を使って変数の値を確認したり、処理の流れを追ったりすることで、問題を特定しやすくなります。

例えば、変数の値をコンソールに出力するには次のようにします。

```javascript
let a = 5;
console.log(a); // 出力: 5
```

コンソールを活用することで、エラーの原因を素早く見つけることができ、効率的に開発を進めることができます。

## 5. 継続的に学ぶこと

最後に、JavaScriptは非常に多くの機能やライブラリがあるため、学び続けることが大切です。最初は難しく感じるかもしれませんが、少しずつ理解が深まり、次第に自信を持ってコードを書くことができるようになります。

例えば、モダンなJavaScript（ES6以降）の機能を学ぶことで、より効率的にコードを書くことができるようになります。アロー関数やデストラクチャリングなど、便利な構文を覚えましょう。

```javascript
const sum = (a, b) => a + b;
let [x, y] = [10, 20];
```

## まとめ

JavaScriptの初心者が抜け出すためには、基本的な文法をしっかり学んだり、関数や非同期処理を理解したりすることが重要です。また、継続的に学び続けることで、次第に難しい部分も克服できるようになります。最初は時間がかかるかもしれませんが、焦らずに一歩ずつ学んでいきましょう。
AtCoder Beginner Contest 078B - ISUのメモ（Python）

こんにちは、とぐさです。ABC078を解いたのですが間違えたのでメモをします。間違え方としては考察ができなかった形です。指摘などありましたらコメントをお願いします。なお自分は灰色コーダーです。以下常体。
## 問題
[AtCoder Beginner Contest 078B - ISU](https://atcoder.jp/contests/abc078/tasks/abc078_b)
## 考察
基本的には$x \div y + z$を考える。ただ、$x$に$y+z$を詰めていく過程で一番端に$z$が必要であることに留意する。結果として計算の数式は以下のようになる。
```math
x-z \div y+z
```
これを実装すればいい。なお自分は計算部分を関数として実装した。
## ACコード
```py:a.py
def isu(x,y,z):
    return (x-z)//(y+z)

x,y,z=map(int,input().split())

print(isu(x,y,z))
```
部分FF RPG（C仕様書だけ）にシュッとトライしてみよう

# 前置き:raised_hand:
- 「C仕様書だけFF RPGで書くことが多いです」というお声を聞き、私も完全FFでなく、部分FFをやってみようと思い立った次第です
- 尚、かなり初歩的なところで躓きました
- これも学び、ということでこちらの記事に残したいと思います
# RPGⅢからILE RPGにしてみよう
- CVTRPGSRCコマンドの前に、変換ログ取得用のファイルを準備する
```
CPYF  FROMFILE(QRPGLE/QARNCVTLG)  TOFILE(KOINULIB/QRNCVTLG) 
      MBROPT(*REPLACE)  CRTFILE(*YES)
```
- CVTRPGSRCでRPGⅢをQRPGSRC（RPGⅢ）→QRPGLESRC（ILE RPG）に変換する
```
CVTRPGSRC FROMFILE(KOINULIB/QRPGSRC) FROMMBR(*ALL) TOFILE(KOINULIB/QRPGLES
RC) LOGFILE(KOINULIB/QRNCVTLG)                                                  
```
# RDiでFF RPGに変換してみよう
- C仕様書部分だけソースを選択、右クリック、`選択をフリー・フォームに変換`をクリック（画像は変換済）
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/2ba8cff0-3ba0-ef78-62c0-3eb96339cffa.png)
- 一部C仕様書が残ったままになるので、その部分にFF RPGへコーディングする
    - 今回試したソースでは以下の部分を手動で変更しました
        - 帳票オーバーフローのフラグオンオフ
            - Before
            ```
             //頁変えの確認
             C   OF              EXCEPT    MIDASI
             C   OF              SETOFF                                       OF
            ```
            - After
            ```
            //頁変えの確認
              IF *INOF  = *ON;
                EXCEPT MIDASI;
                *INOF  = *OFF;
              ENDIF;          
            ```

        - 四則演算
            - Before
            ```
             C     TKGEND        SUB       TKUZAN        WKRIYO            9 0
            ```
            - After
            ```
            DCL-S  WKRIYO ZONED(9:0); 
            WKRIYO = TKGEND - TKUZAN; 
            ```
        
    
# SEUとRDiとVS Codeでコーディングしながらコンパイルエラーを解消してみた
- いつもよりコンパイルエラーを出していました（開発時代なら怒られそうなくらいに…:relaxed:）
- 共通しておきていたエラーの理由は、「私は部分Free Form RPGを書いている」という自覚が少なかったことです

## コンパイルエラーによる気づき、躓きポイント
- 部分 FF RPGはあくまで、ILE RPGであることを意識しないといけないという点
- 各定義H→F→D→Cの徹底をすっかり忘れていた
    - FF RPGに徐々に慣れていると、C仕様書（演算仕様書）の途中でDCL-S等の定義仕様書を書きたくなる…
- 桁の始まりミスが多かった（C仕様書は８桁目からです）

## 3つの開発ツール、開発環境を使ってどのように感じたか
- SEUに慣れていたとしても、「やっぱりRDiいいなあ」の一言に尽きます
- コンパイル前に上記のDCL-Sのポジションミスを教えてくれました
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/81af48f6-8ffd-94d2-4746-4b8392db2d04.png)
- エラー箇所にカーソルを合わせ、内容を確認（今回は2行目が原因）
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658740/f9c14648-d71d-8c5e-1f18-136c7e2c3999.png)
- SEUでもVS Code（Code for IBM i）でも現在はここまで丁寧にエラーチェックはされないので、この点はかなりRPG開発者に寄り添っているというか、改めてRPG開発に特化されているという印象を受けました

# おわりに
- 初歩的なところで躓いてしまいましたが、部分も完全も使いこなしていけるように精進いたします！

# 参照サイト＆記事リンク（素敵な記事）
- [【AS400】CVTRPGSRC（RPGⅢをRPGLEへ変換）](https://tigertaizo.hatenablog.com/entry/2013/10/03/124521)
    - タイガー！タイガー！じれったいぞー！（SE編）様
- [【VS Code】RPGⅣからFFRPGにConvertしてみた！](https://qiita.com/RiSING_alpha-team/items/7d67690775b6273ac545)
    - @RiSING_alpha-team の皆様
テスト自動化エンジニアシラバス：テスト自動化の継続的な改善 その2

# はじめに

テスト自動化エンジニアのシラバスを再度読み直し、各章をDailyで読めるようにしてみた

https://www.istqb.org/certifications/test-automation-engineer

8 Continuous Improvement  の中で「 Restructure the automated testware to align with SUT updates」と「Summarize opportunities for use of test automation tools」を今回は翻訳・解説する

ここでは引き続き、テスト自動化自身の改善を行なっていくことに関して書かれている


# SUTの仕様変更に伴うテストウェアの再構築

SUTに仕様変更発生すると、TAS（Test Automation System）のTAFやコンポーネントライブラリにも対応する更新が必要になります。
些細な変更であっても、TASの信頼性やパフォーマンスに広範囲な悪影響を与える可能性があります。

## テスト環境の変更を特定
まず、テスト環境のどの部分が変更されたのかを特定する。
そして、テストウェア、カスタマイズされた関数ライブラリ、オペレーティングシステムのどの部分に修正が必要かを評価します。
これらの変更は、TASのパフォーマンスに影響を与える可能性があります。

## TASの変更と検証
TASの変更は、最小限の機能を段階的に追加するアプローチをとることで、影響を最小限に抑えることができる。
各変更を導入する際には、限られた範囲のテストスクリプトを実行して影響を確認します。
問題がないことが確認されたら、変更を全面的に適用します。
最後に、完全な回帰テストを実行して、変更が他のテストスクリプトに悪影響を与えていないことを検証します。
リグレッションテストの実行中に障害が発生した場合、テストレポート、テストログ、テストデータ分析を通じて根本原因を特定し、問題を解決します。

## コアTAS関数ライブラリの効率化と効果化
TASが成熟するにつれて、タスクをより効率的に実行する方法が発見されます。
これらの新しい手法（コードの最適化、新しいオペレーティングシステムライブラリの使用など）を、現在のプロジェクトと将来のプロジェクトで使用されるコア関数ライブラリに組み込む必要があります。

## 複数の機能を統合して効率化

自動テストの実行において、GUI上のコントロールの操作は重要な役割を果たします。
コントロールの可視性、有効性、サイズ、データなどの情報を取得し、ドロップダウンリストからアイテムを選択したり、フィールドに入力したり、フィールドから値を読み取ったりするために、さまざまな関数を使用します。

これらの関数を統合することで、メンテナンスを最小限に抑えつつ、同じ結果を得ることができます。

## SUTの変更に対応するためのTAAのリファクタリング

TAS（テスト自動化システム）のライフサイクル中には、SUT（システムアンダーテスト）の変更に対応するためにTAA（テスト自動化アーキテクチャ）を変更する必要があります。
SUTが進化するにつれて、TAAもそれに合わせて進化し、SUTをサポートできるようにする必要があります。
新しい機能を追加する際には、単に追加するのではなく、TAA全体を見直して変更することが重要です。
これにより、新しいSUT機能に対応するためのテストスクリプトが必要になった場合でも、互換性のあるコンポーネントが既に用意されているため、スムーズに対応できます。

## 命名規則の統一と標準化

テスト自動化コードや関数ライブラリに新しい要素を追加する際には、既存の命名規則に準拠することが重要です。
命名規則を統一することで、コードの可読性(統一された命名規則により、コードが読みやすくなる)とメンテナンス性（コードの変更や修正が容易になる）が向上します。


# 既存テストスクリプトの評価と最適化

SUTの変更や改善に伴い、既存のテストスクリプトの評価も重要です。
複雑で時間がかかるテストは、より小さなテストに分解することで、各テストの実行時間が短縮され、問題の特定が容易になり、効率化することができます。

また、頻繁に実行されていないテスト、重要度の低いテストは、削除することでTASの複雑性を軽減し、メンテナンス性を向上させることができます。

## テスト自動化ツールの活用機会

テスト自動化は、実際のテスト以外にもさまざまな非特定的なテストアクティビティに役立ちます。

## データエイジングの自動化

データエイジングとは、テストデータの有効期限を管理し、古いデータを更新または削除するプロセスです。

例えば、商品の有効期限やユーザーの登録日を更新することで、現実的なテストシナリオを構築できます。

テスト自動化を活用することで、このプロセスを効率的に自動化することができる。

## スクリーンショットとビデオの自動生成

最新のUIテスト自動化ツールには、特定の条件下でスクリーンショットやビデオを自動的に生成し、保存する機能が組み込まれています。
これにより、テストチームはソフトウェアのリリースドキュメントやマーケティング目的のために、実際の使用状況をキャプチャしたスクリーンショットやビデオを簡単に作成できます。

具体的な活用例として以下のようなものがある

- テストケースの失敗時のキャプチャ
 テストが失敗した際に、エラーの特定や再現のために、スクリーンショットやビデオを自動的に生成します。
- 特定のステップの記録
 特定のテストステップの実行過程をビデオに記録し、テストレポートに添付します。
- ユーザー体験のシミュレーション
 ユーザーの視点から、ソフトウェアの操作手順をビデオに記録します。
- ソフトウェアのデモ用素材の作成
 マーケティング資料やセールス資料に使用するスクリーンショットやビデオを自動生成します。
自己署名証明書の有効期限切れを無視するopensslを作った

本来は推奨するものではありません。

ルート証明書やクライアント証明書の有効期限が切れた場合に、
通常は全台に再配布などが必要だが
WEBサーバーの`openssl`をリビルドすることでなんとかできるという話。


## 通常はApacheのerror_log に以下エラー

日付が過ぎている場合、以下エラーが出力される。

> [error] [client 127.0.01] Certificate Verification: Error (10): certificate has expired[Wed Oct 02 05:41:46 2024] [debug] ssl_engine_kernel.c(1894): OpenSSL: Write: error


以下を行った場合はエラーとせずアクセスできるようになる。


## WEBサーバーの日時を変更する方法

自己署名証明書で稼働しているWEBサーバーで証明書の有効期限を無制限にしたい場合は
WEBサーバーのOSの日付を有効期限前にし続ければよい。

```sh:日付を設定する方法
# (過去)有効期限より前にしたいとき
date -s "2020-10-21 10:10:10"

# (未来)有効期限切れの動作をチェックしたい場合
date -s "2030-10-21 10:10:10"
```


## OpenSSLのx509_vfy.cを変更する方法

有効期限が切れていた場合、expiredに遷移するがそこを許容する。

* crypto/x509/x509_vfy.c

```sh:openssl.spec
sed -i \
 -e "1593i return 1; //Allow expired certificates !" \
 crypto/x509/x509_vfy.c
```

* https://github.com/tukiyo/mysql4.0php5.2/tree/master/files.centos6/allow_expired_certificates/openssl-1.0.1e-58

```sh
rpm -Uvh --force openssl*rpm
reboot
```

有効期限が過ぎていてもアクセスできることを確認。

## 気づき

証明書のチェックは`httpdパッケージ`内の`mod_ssl.so`が行っていると思っていたが
そうではなく、`libcrypto.so` や `libssl.so` が行っている様子。


## 他にもレガシーネタいろいろ書いています

* https://qiita.com/search?q=user%3Atukiyo3+tag%3Aopenssl

## 参考

https://stackoverflow.com/questions/42272164/make-openssl-accept-expired-certificates
Ubuntuでcode-serverを立ててリモート開発環境を構築する

# code-serverを立ててみた

今回は、VSCodeのWeb版であるcode-serverを立てて、ブラウザから開発環境を利用できるようにする手順を紹介します。

## 1. 必要なパッケージをインストール

まず最初に、code-serverをインストールするために必要なパッケージをインストールします。

```bash
sudo apt update
sudo apt install curl
```

## 2. code-serverのインストール
次に、code-serverをインストールします。公式のインストール手順を参考にし、以下のコマンドでインストールを行います。

```bash
curl -fsSL https://code-server.dev/install.sh | sh
```

インストールが完了したら、`code-server`コマンドを使ってサービスを開始できます。

:::note warn
警告
この記事は 2024年11月現在の情報で書かれています
詳しくは以下の公式サイトのインストール方法をご覧ください
:::
https://coder.com/docs/code-server/install

## 3. code-serverを起動

インストール後、code-serverを起動するために以下のコマンドを実行します。

```bash
#自動起動
systemctl enable code-server@<username>
#起動
systemctl start code-server@<username>
```

ここで`<username>`は自分のユーザー名に置き換えてください。
このコマンドを使うことで、code-serverがシステムのサービスとしてバックグラウンドで実行されるようになります。

## 4. 初期設定

デフォルトの`code-server`設定では、`localhost:8080`でのみアクセスできるようになっていますが、外部からアクセスできるようにするためには、`bind-addr`を`0.0.0.0`に変更する必要があります。設定ファイルを編集しましょう。

```bash
nano ~/.config/code-server/config.yaml
```

設定ファイル内で以下のように`bind-addr`を変更します。

```yaml
bind-addr: 0.0.0.0:8080
auth: password
password: <your-password>
cert: false
```

これで、`localhost`以外からも`8080`ポートを使って接続できるようになります。

## 5. code-serverを再起動

設定を変更したら、`code-server`を再起動して変更を反映させます。

```bash
systemctl restart code-server@<username>
```
## 5. 設定のカスタマイズ

code-serverは、VSCodeと同様に拡張機能をインストールしたり、設定をカスタマイズすることができます。設定ファイルは`~/.config/code-server/config.yaml`に格納されています。ここで、ポート番号の変更やパスワード設定の変更などを行うことができます。

```yaml
bind-addr: 0.0.0.0:8080
auth: password
password: <your-password>
cert: false
```


## まとめ

code-serverを利用することで、どこからでもブラウザを使ってVSCodeの開発環境にアクセスできるようになります。リモート開発やクラウドでの作業がより便利になりますので、ぜひ試してみてください。
Authentication

[Previous << SDK Reference](https://qiita.com/flowcadence/items/c1a1364b2dba4262bdc1)
[Next >> How to Configure FCL](https://qiita.com/flowcadence/items/b85a6df60a980c8e1dc1)

https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a#reference-2020832ebee1810a325a

FCLにおける認証の概念は、FCLの`currentUser`の概念と密接に関係しています。実際、`fcl.authenticate`および`fcl.unauthenticate`はそれぞれ`fcl.currentUser.authenticate()`および`fcl.currentUser.unauthenticate()`のエイリアスです。ですのでこれから`currentUser`を見ていきましょう。

dapp開発者として私たちは、FCLを使用して、現時点で主な3つの機能を実現させる方法を考えます。
* `currentUser`及び、それがログインしているかどうかを知る方法
* ユーザーをログインさせる方法
* ユーザーをログアウトさせる方法

FCLの仕組み上では、ユーザーのログインとユーザーのサインアップ(登録)は同じことです。
<h1>Knowing things about the current user</h1>

FCLは、現在のユーザー情報を取得する2つの方法を提供しています。1つは、その情報のsnapshotを返すpromiseです。もう1つは、あなたがsubscribeすることで、最新情報に変更が発生するたびに、コールバック関数を呼び出すことができる方法です。

<h3>Snapshot of Current User</h3>

```ruby
import * as fcl from "@onflow/fcl"

const currentUser = await fcl.currentUser.snapshot()
console.log("The Current User", currentUser)
```

<h3>Subscribe to Current User</h3>

```ruby
import * as fcl from "@onflow/fcl"

/* Returns an unsubscribe function */
const unsubscribe = fcl.currentUser.subscribe(currentUser => {
  console.log("The Current User", currentUser)
})
```

<h1>実際に Authenticating と Unauthenticating を行うには</h1>

結論から言うと、`fcl.authenticate()` と `fcl.unauthenticate()` をそれぞれ呼び出すことです。

Flowのメインネット上で、この機能を使用するために何かを設定する必要は何もなく、それでありながら、あなたのdappユーザーは、認証プロセスを行っていき、FCL対応のウォレットプロバイダーを使用できるようになります。

開発の最中にはおそらく、あなたは[`@onflow/dev-wallet`](https://github.com/onflow/fcl-dev-wallet)を使用するために、あなたのdappを設定したくなるしょう。[クイックスタートガイド](https://developers.flow.com/build/getting-started/fcl-quickstart)はそれを使って説明してくれます。

これらすべてがかなり複雑に思うかもしれませんが、私たちは全力でサポートできます。何か問題に出くわした時は、[Discord](https://discord.gg/flow)でご連絡ください。喜んでお手伝いいたしますので。

*Last updated on **Nov 20, 2024** by **Chase Fleming***

翻訳元

https://developers.flow.com/tools/clients/fcl-js/authentication

***
<b>[Previous << SDK Reference](https://qiita.com/flowcadence/items/c1a1364b2dba4262bdc1)
</b>

[Flow blockchain / Cadence version1.0ドキュメント](https://qiita.com/flowcadence/items/3073d69c6e9895e68b5a) (Authentication)

<b>[Next >> How to Configure FCL](https://qiita.com/flowcadence/items/b85a6df60a980c8e1dc1)</b>
グラチュータスARP

# イーサネット・アドレスは保持したまま新しいIPアドレスを使用する場合

### アドレス更新のためのブロードキャストさせる
>アドレスの対応関係を変更できるようにするためには、ARPキャッシュを数分後にタイムアウトさせる必要がある。キャッシュされた情報を最新の情報に保ちつつ、賢く最適化を行うためには、`すべてのマシンに、設定が完了した時点でアドレスの対応づけの情報をブロードキャスト`させれば良い。

### ブロードキャストの内容
>このブロードキャストは、一般に、`自身のIPアドレスを見つけるためのARPメッセージ`という形で行われている。このブロードキャストは、一般に、`自身のIPアドレスを見つける`ためのARPメッセージという形で行われている。`このブロードキャストにエントリが作成・更新`される。これはグラチュータスARP（Gratuitous ARP：余計なARP）として知られている。

# グラチュータスARPによる問題
>２つのマシンが同じIPを持つことになる。双方のマシンがネットワークを使用できるようにするためには、ネットワークの管理者に不具合を解決してもらう必要がある。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# GARP(GratuitousARP)
>「自身に設定するIPアドレスの重複確認」、「ARPテーブルの更新」を主な目的としたもので、目的IPアドレスに自身が使用するIPアドレスを指定し、MACアドレスを問い合わせる。

https://gihyo.jp/book/2023/978-4-297-13865-3
C++を使ったlinuxのコンソールアプリ(CLR)を作る方法

## はじめに
この記事では、C++を使って簡単なアスキーアートを表示するプログラムを作成しながら、開発環境の構築からコードの書き方、ビルド、実行までの基本を解説します。初心者の方でも手軽にC++プログラミングの第一歩を踏み出せる内容となっています。  
## 1.C++開発の準備
### debian系
```bash 
sudo apt update
sudo apt install build-essential
```
### MacOS
```bash
brew install gcc
```
## 2.最初のプログラムを書いてみよう
ここでは、簡単なアスキーアートを表示するプログラムを作ってみましょう。
プログラムは`main.cpp`という名前で保存してください。
``` main.cpp
#include <iostream>

int main() {
    // アスキーアートの表示
    std::cout << " /\\_/\\  \n";
    std::cout << "( o.o ) \n";
    std::cout << " > ^ <  \n";

    return 0;
}

```
## プログラムを動かしてみよう
```bash
g++ -o main main.cpp
./main
```
## 実行結果
以下のプログラムを実行すると、次のようなアスキーアートがターミナルに表示されます
```
 /\_/\
( o.o ) 
 > ^ <  
```
このように、C++では簡単に文字列を画面に表示することができます。

## まとめ  
今回のプログラムでは、C++での開発環境構築から、簡単な文字列を出力するプログラムの作成と実行までの手順を学びました。このようにC++では簡単な構文で画面出力が可能です。  
## 次のステップへ
次のステップとして、以下を試してみることをお勧めします：  
- 変数を使って動的にメッセージを表示してみる  
- 繰り返し構文（`for`や`while`）を使って複雑なアスキーアートを作成する  
- 入力を受け取ってメッセージを変更してみる  

これらを通じて、C++の基本的な構造をさらに理解できるでしょう！
Vercelデプロイ時にファイルが存在するにもかかわらず Module not found:Can't resolve となる問題

# 問題:ファイルが存在するにもかかわらず Module not found

![{0FA9A4FD-5738-4462-8FA2-D10387F96A0B}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/513e9691-eecf-8ff8-bbda-25c58a75d6f8.png)

ある日、作業を完了して変更をマージしていたところ、
Vercelのデプロイが失敗しました。

```:Build Logs
Failed to compile.
./src/components/admin/AttendanceView/AttendanceTablePersonal.tsx
Module not found: Can't resolve '@/stores/admin/attendanceTablePersonalSlice'
```
ログを確認すると、Module not found エラーが発生し、
attendanceTablePersonalSlice が見つからないとのこと。


![{07063CC5-A280-44E7-A8FD-8B62645A6AA3}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/9c7c3cbf-9e51-50f2-cf51-d352af451ac0.png)
しかし、ファイルは確かに存在し、ローカル環境での npm run build ではエラーは出ません。

何が原因だったのでしょうか？



# 原因: ファイル名の大文字を小文字に変更した (Gitの設定とファイルシステムの大文字・小文字の扱い)

![{926589DA-5442-433B-A14C-C613F8332295}.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840466/34d30bf7-468a-0e90-9a11-1061a4157d54.png)

原因は、ファイル名の大文字を小文字を変更した際に、Gitがその変更を正しく検知していなかったことです。
これにより、削除されているファイルを参照したためエラーとなりました。

Gitが大文字と小文字を区別するかどうかは、WinやMacなど大抵のケースでは大文字小文字を区別せず、Linuxなどの一部環境ではデフォルトで区別しているようです。

以下Windowsの例となります。


``` powershell:PowerShell
mkdir git-case-test
cd git-case-test
git init
echo "sample" > Sample.txt
git add Sample.txt
git commit -m "Add Sample.txt"
```
例えば上記コマンドでリポジトリを作成し、Sample.txtをコミット。

``` powershell:PowerShell
mv Sample.txt sample.txt
git status
```
Sampleをsampleに変更し、git statusで確認しても

``` powershell:PowerShell
On branch master
nothing to commit, working tree clean
```
変更を検知していません。

``` powershell:PowerShell
git config core.ignorecase false
git status
```
そこで大文字小文字を区別するようにGitの設定を変更すると

``` powershell:PowerShell
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        deleted:    Sample.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        sample.txt
```
正しく検出することができました。

# 解決策1: Gitのオプションで大文字小文字を区別させる
```
git config core.ignorecase false
```

再現例の通り、上記コマンドによって大文字小文字を区別する方法です。


# 解決策2: ファイル名を一旦別名に変更してコミットする
今回のケースではファイル名を一時的に別名に変更してからコミットすることで対処しました。

理由としては先述のコマンドは**ローカルリポジトリでのみ有効**となるため、
開発環境の差が生まれることを懸念したためです。


# 参考
https://learn.microsoft.com/ja-jp/windows/wsl/case-sensitivity#configure-case-sensitivity-with-git

Microsoft公式ドキュメント

<br>



https://dev.classmethod.jp/articles/mac-apfs-ignore-case/

Macユーザーの例
２０２４参加イベントを振り返る　その３

お疲れさまです、みやもとです。

イベント振り返り記事は今回が最後の予定です。
明日から何を書くか早くもネタ切れの危機ではありますが、それはそれとして今年残りの振り返りを進めていきたいと思います。

## OSAKA ENGINEER NIGHT　Vol.3 〜やっぱLTやねん〜
ネクストライブ株式会社主催のイベントです。
お菓子をつまんだりしながらLT発表を聞いて同じテーブルの方とお話しするのがメイン。

https://peatix.com/event/4023839

これは珍しくConnpass以外から申し込みしたイベントでした。
たしかXでフォローしている方が参加の投稿をされてたのかな？
運営の方がとにかく人懐っこい雰囲気で、人見知り傾向の私でも結構いろんな方とお話できました。
このあたりから会社に名刺作ってもらってイベントで交換するようになりました。

## Hackers' Meetup #3
Hack.BARの定期勉強会です。
LTメインで、発表者はバーカウンターに入ってバーテンダーの視界で発表できます。

https://hackbar.connpass.com/event/328565/

初めてオフラインでLT発表をしたイベントでした。
登壇に踏み切ったポイントはLTテーマがかなり自由なのとこの時点である程度お店になじみがあったこと。
COBOLに関して自分が思うところをあれこれしゃべってきたのですが、思ったより興味を持って聞いていただけたのかなと思います。
あたたかく聞いてくださったみなさまのおかげで、この後いくつかのイベントで登壇することができました。

## Developers Suummit 2024 KANSAI
おそらく多くの人がご存じでしょう、株式会社翔泳社CodeZine編集部主催のカンファレンスです。

https://event.shoeisha.jp/devsumi/20240918

これもConnpass以外から申し込みしたイベントですね。
存在自体は前から知っていたのですが、実際参加してみるとコンテンツがめちゃくちゃ充実していて興味深いお話をいっぱい聞けました。
また、お昼のミニセッションで気になっていた本の著者さんのお話を聞いたりサインをもらったりしてちょっとミーハーな楽しみ方もしていました。
懇親会ではさすがに人の多さに反して顔見知りがあまり居なくて端っこに居ましたが、それでも何人かお話できて楽しかったです。

## GENKI.dev ~LとT尋の神隠し~ @大阪
GENKI.devさんのLTイベントです。
先述のDevelopers Summitで存在を知ったコミュニティで、運営の方がやはり先に書いたOSAKA ENGINEER NIGHTで知っている方だったこともあり参加しました。

https://genki-dev.connpass.com/event/332623/

Hackers' Meetupの時と異なりほぼ知らない人ばかりの前での登壇でしたが、あたたかい雰囲気で聞いていただけて安心しました。
初回でまだちょっとテンションの程度を探り探りしていたので、次回はもうちょっと気軽に楽しめるかと思います。

## Technical Writing Meetup vol.38
Technical Writing Meetup主催のオンラインイベントです。
テクニカルライティングに関するLTがメイン。

https://tw-meetup.connpass.com/event/335786/

技術書典で買ったテクニカルライティングの本でこのイベントを知って以来なかなか予定が合わずリアルタイムでの視聴が叶わなかったのですが、今年も終わりが近づいた頃になってやっと参加することができました。
企業サービスの中でのライティングについてや画面上の文字・文章の果たす役割等、思っていた以上に興味深いお話を聞くことができました。


## 参加イベント主催コミュニティ

### ネクストライブ株式会社
大阪のHR Techベンチャー企業です。
イベントにめちゃくちゃ積極的で、Xでもイベントに関するリプをいっぱいいただきました。
雰囲気が明るくて楽しそうな印象があります。

https://nextribe-dev.connpass.com/

### Hack.BAR
神戸は三宮にあるエンジニアが集まるバーです。
プログラミング言語の名前がついたカクテルを提供していたり、いろんなエンジニアコミュニティのイベントを開催されていたりします。
「（メニューにない）COBOLのカクテル作って」とかわがままを言っても聞いてくれる良いお店です。[^1]
[^1]:さすがにイベントとか忙しいときは避けて、なるべくお手すきの時を狙って頼んでいます。

### 株式会社翔泳社CodeZine編集部
コミュニティとして紹介していいのかは迷うところですが一応。
エンジニア向け書籍や記事を出されている出版社さんです。
Connpassにもページがありますが、オフラインイベントは自社サイトの方で告知されることが多いかも？

https://codezine.connpass.com/

### GENKI.dev
「エンジニアコミュニティ界隈の立ち呑み屋」というコンセプトでイベントを開催されているコミュニティです。
実際に参加者の技術スタックもさまざまで、同じテーブルの人とおしゃべりするだけでも刺激がありました。
個人的には立ち呑み屋コンセプトに合わせて作られた暖簾が好きです。

https://genki-dev.connpass.com/

### Technical Writing Meetup
名前の通り、テクニカルライティングをテーマにした技術者向けのミートアップを開催されているコミュニティです。
ドキュメント大事よね、と思いつついざ書くと他に気を取られておざなりになってしまうのですが、イベントに参加することで改めて文章の果たす役割を考えるきっかけを貰っていると感じます。

https://tw-meetup.connpass.com/

## イベントいろいろ
イベントとひと言にまとめても実際はさまざまで、授業か研修セミナーのように講師の話を聞いてノートを取って…というものもあれば、技術の深い話はそれほどなくて参加者同士の交流を目的としたものもあります。
私は基本的にある程度交流の入るイベントに参加することが多いですが、そっちの方が初心者にも優しい印象がするというのが理由です。
交流無しのセミナー的イベントの場合あまりにも知らない技術だと肩身が狭くて居づらい感じがしますし、ある程度自分がわかるものだけ選ぶとなると参加できる範囲がかなり狭くなってしまうので。
Flutter開発: finalとvarの現実的な使い方

# final変数とは？
final変数は、値を一度設定すると変更できない（再代入不可）。

```dart
final city = "Tokyo";
   // city = "Osaka";    // NG: 再代入はできない
```

:::note info
const, lateなど定義キーワードがあrますが、大体のユースケースではfinalを使用することになる
:::

# var変数とは？
var変数は、値を設定しても何度も変更可能です（再代入可）。

```dart
var age = 25; 
age = 30;     // OK: 再代入が可能
```

# Flutter Linter使用は？

Flutter開発行う際に、Linterライブラリーを導入する前提で考えましょう。

:::note info
Lint使用目的:
1.	コードの一貫性
2.	バグの早期発見
3.	非効率的なコードの改善
4.	最新のベストプラクティスの適用
:::

(+ 初心者には、 Lintのルールに従ってコードを書くのは一番らく)

<br>

Flutter Linterライブラリーの仕様には、大きく分けて2択があります。

A. 標準Lintルール用で、varとfinalをどっちも使用して構わないが。。。⬇

https://pub.dev/packages/flutter_lints

B. より厳しいLintルール用ライブラリーで。。。

:::note alert
Lintルールが厳しくなるほど、finalを定義することになるが。。。⬇
:::

https://pub.dev/packages/very_good_analysis

https://pub.dev/packages/lint

# Flutterの実装は？

大幅にFlutterアプリの実装方針が以下に分類される。

(I) Flutter開発 + Linter使用であれば、

 = final使用となる。

なるべくfinalを使用することと + Linterの実装でコードの安全性を保証すること。

:::note info
単体テスト（ユニットテスト）では、Flutterの最小単位であるユニット（関数やメソッド、クラスなど）を個別にテストするコードを書く。
:::

(II) Flutter開発 + Linter使用 + 単体テスト実装であれば、

= var使用となる。その理由は:

1. ソースコード + 単体テストに使われる柔軟性
2. var変数のステートをテストできる
4. モックを導入することができる

https://pub.dev/packages/mockito

# 結論
自分の担当してるFlutterプロジェクトで単体テストを実装するなら「var」を使用すること。
（より厳しいLinterの使用であれば、final関連のLintルールを無効化する）

:::note info
var変数に単体テスト用のモックを再代入することで、より簡単に開発できる
:::

それ以外のケースであれば、「final」を使用するのをお勧めします。

:::note alert
コードセキュリティの観点からそこまで深く考える必要はない。
（結果的にFlutterの難読化コマンドを使用することになる）
:::
AdSenseのシンガポール向け税務情報をおうちにいながら申請（e-Taxで居住者証明書交付請求書を送る）

# はじめに

AdSenseにログインしたら、「シンガポールの税務情報をご提出ください」言われました。

![スクリーンショット 2024-11-22 234143.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/34d43e5b-14f6-2e17-62dd-6c7b86c3daa2.png)


ググってみると、シンガポールに源泉徴収されちゃうかもとのこと。

ではやってみるかと思ったら、日本の国税から居住者証明書を交付してもらわなければなりません。

**郵送か来署で。**

いやーん、たぶんまだ金額が低くて源泉徴収されてないんだけど、将来あるかないかの時のために切手代or交通費を払いたくないよー。

オンラインでどうにかできないでしょうか。

先生・・・！！　e-Taxしたいです・・・・・・

# 調査

調査の項は読まないですっ飛ばしてもいいです。「居住者証明書交付請求書 入手」へお進みください。

## 調査1 ググる

「adsense シンガポール e-Tax」とかでググってみましたが、さらっと見た限りでは郵送か来署しか言及されていませんでした。

## 調査2 国税庁ホームページ

一次情報を確認してみます。

https://www.nta.go.jp/taxes/shiraberu/taxanswer/osirase/9210.htm

![スクリーンショット 2024-11-22 234302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/a12283c2-8e7f-b658-c4b1-ad585b9177ae.png)

ここもやはり「交付請求書を（**郵送または来署により**）提出してください。」と明記されています。

**普通はここで諦めるところです。**

しかし、最近の国税庁のDXを見ていると、e-Taxでも提出できるはずだという**謎の確信**があります。

https://www.nta.go.jp/information/other/data/r03/zeimugyosei/index.htm

国税庁は「**あらゆる税務手続が税務署に行かずにできる社会**」を目指しています。

## 調査3 e-Taxホームページ

頑張って探したところ、「汎用申請手続」という入口があります。

https://www.e-tax.nta.go.jp/tetsuzuki/tetsuzuki6.htm

の下の方。

![スクリーンショット 2024-11-22 235241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/8fc87083-9d27-3313-9767-d94ac5d46d3f.png)

これは希望が持てる！

イメージデータで送信可能な手続 → イメ－ジデ－タで送信可能な手続検索 で検索してみると・・・

![スクリーンショット 2024-11-22 235441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104360/667d26d2-c473-df5d-1b47-982730224b43.png)

ありました！

# 居住者証明書交付請求書 入手

ここから実際に皆さんに手を動かしていただくところです。

下記リンクから

https://www.e-tax.nta.go.jp/tetsuzuki/search/unsupported.htm

キーワード検索のところに「居住者証明書」と入力して検索ボタンをクリックします。

するとPDFが2つ引っかかります。（前の項のスクショ参照）

1つ目が租税条約等締結国用様式、2つ目がその他用様式です。

シンガポール向けの場合は **1つ目の租税条約等締結国用様式** を使うそうです。

ちなみに、これらのファイルは

https://www.nta.go.jp/taxes/shiraberu/taxanswer/osirase/9210.htm

の
・居住者証明書交付請求書・居住者証明書（租税条約等締結国用）入力用（PDF/211KB）
・居住者証明書交付請求書・居住者証明書（その他用）入力用（PDF/223KB）
と同じファイルです。（バイナリ一致しました）

# 居住者証明書交付請求書 入力

Adobe Readerなどで、必要項目を入力していきましょう。

**具体的な入力内容については他の解説ページを参照**してください。

# 居住者証明書交付請求書 送信（提出）

e-Tax にログインします。

https://www.e-tax.nta.go.jp/

お好みの方法でログインしましょう。

ちなみに、スマホにマイナンバーカードを搭載している人は、マイナポータル経由が便利です。物理カードが不要です。iPhoneの場合は2025年春後半からでしたっけ。

ログインが初めてだとなかなか難関なのですが、ログインできたことにして進めてまいります。

申請・納付手続きを行う
↓
事前準備してなかったらする、してあればスキップ
↓
申告・申請・納税の新規作成
↓
一番下の「**イメージデータで送信可能な手続**」
↓
カンタンな入力（説明省略）で、次へ
↓
手続名称から検索・**居住者証明書**・検索
↓
組織区分「税務署」・所轄の税務署選択（初めてでも住所から自動選択されるかな？）
↓
「ファイルを選択」で先ほど入力したPDFを選択
↓
**添付書類名称**は「居住者証明書交付請求書・居住者証明書（租税条約等締結国用）」が正解のような気がしますが、単に「**居住者証明書**」にしてみました。（どっちでもいい気がする）
↓
「次へ」クリック
↓
確認ページで「次へ」クリック
↓
「送信する」クリック
↓
確認ダイアログで「はい」クリック

以上で提出完了です。

送信完了ページに受付番号など書いてありますが、これはe-Taxの受信通知画面でも確認可能です。

# 居住者証明書 受信

返信用の切手を送っていないので、返信はe-TaxでPDFファイルが送られてくるのかなと思っていましたが、紙が郵送で届きました。切手代は国税持ちのようです。

土曜日に送信して木曜日にポスト着でした。

ここから **AdSense への提出方法ついては他の解説ページを参照**してください。

# 終わりに

e-Taxで居住者証明書交付請求書を送る方法について解説しました。

この手続きの他にも、様々な申請を「汎用申請手続」で送れることが分かりました。

せっかくe-Taxで送る手段が用意されているのだから、手続き解説ページでもe-Taxで送れる旨を書いて欲しいですよね。（タックスアンサーの下のアンケートリンクから言っときました）

皆さんも頑張ってDXしましょう。

あきらめたらそこで書類郵送ですよ・・・？
コマンドでファイルの中身を全部削除

##### 環境
VirtualBox 7.0.20
Rocky Linux release 9.5 (Blue Onyx)
webmin 2.202

CLIでファイルを開く時はviコマンド使うんですが（他にもvimやnanoとかあるけどよくわかってない💦）、deleteボタン押してバー...........って消してた人です🙈💦

でも、このコマンドで一瞬で削除！
```
# sed -i -e 'd' /tmp/test.txt
```
LFS手順メモ

大枠
1. Ubuntuマシンを用意(ノートPCからWindows消しました)
1. VirtualBoxで、ゲストOSとしてUbuntuを用意(UbuntuサーバのISOファイルをダウンロード)
1. ゲストUbuntuの中でLFSをビルド

注意点
1. VirutalBoxのVMのスナップショットは、前回スナップショットとの差分を保存する（なので、前回のスナップショットファイルへの参照と差分をファイルとして含むはず）。なお、X,Y,Zの中でスナップショット（Y）を消すと、Xの分のスナップショットデータはZにマージされる（はず）。いずれにせよ、10GBのVMの保存でも、10GB全てを変更している場合、10GBのスナップショットとなる。複数のスナップショットを使うと差分を経時的な変化を追えるが、スナップショット1つ1つのサイズを足すと簡単に元のVMのサイズを超える。私はこれで、すぐに数十GBになり（本体Ubuntuがもともと容量が少なかったのもあり）、本体Ubuntuの起動もあやうくなった。特に、LFSではgzファイルを展開してビルド、が多い。ソースコードおよび生成バイナリの分の差分が大きくなりやすそう
1. 私の場合、ゲストOSに割り当てるディスクサイズを50GB、その中からLFSに30Gを割り当てた。つまり、ゲストOSのubuntuは20GB利用できたことになる（ゲストOSから見ると、50GBもらって30GBをパーティション切ってLFS用に割り当てた形）。LFSのドキュメントでは30GB以上をLFS用に割り当てることを推奨しているので、推奨通り。本物のパーティションではなく、LVMで割り当てると楽。自分の場合は、ServerモードUbuntuだったからか、ルートボリュームがすでにubuntu-vgというVGのubuntu-lvというLVで管理されていたので、追加でubuntu-vgの中にlfsというLV(30G)を作って、ルートボリュームに割り当てた
![スクリーンショット 2024-11-28 18.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149425/80b0e0fb-6858-5e04-1440-255503809bd1.png)
[Copilot]英語のほうがもしかして、出力がよい？？？

# はじめに
Advent Calendar 2024　18日目
ほんまにつかれてきました。
毎日記事を書くということがとても苦痛に感じます。
しかし、Tシャツが欲しいので、頑張って書いていきます。

# 英語の方が出力が良い？？
Copilotについては皆さんご存じだと思いますが、英語の方が生成AIの出来が良いのではないかと考える方もいるかもしれません。

1つ目の理由は、英語は名詞や動詞といった結論ファーストの言語であることです。一方で日本語は副詞や感嘆詞など複雑なパターンが多く、文法的に英語の方が簡単だと語学者はよく言います。そのため、英語の方が生成AIの成長率が高いのではないかと思います。

2つ目の理由は、英語を話す人口が多いことです。日本語を使用している国は日本と一部のアジアの国々に限られますが、英語は世界中で広く使われています。学習に必要な文章の量を考えると、英語が最も多く使われているため、性能が良くなると考えられます。

3つ目の理由は、世界の共通言語が英語であり、生成AIを開発している企業の多くが米国企業であることです。そのため、生成AIのアルゴリズムは英語に特化しているのではないかと思います。

# 実際に試してみましょう。
上記の章の文章を用いて、プロンプトを書いていきたいとも思います。
3行に要約してとお願いをしました。
結果は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/7e7248f9-19ee-1346-be0b-9b0cfd56d3f6.png)

では、次に先ほどの文章を英語に直して、それをCopilppotに突っ込んでみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/a67512ac-8cc6-8e73-67db-c62667cab963.png)

果たして結果はどうでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/edaa4bce-79dd-b943-b8b9-3de73a4f2521.png)

# 結果
日本語から英語に翻訳して実行した結果、あまり差は出ませんでした。むしろ、翻訳して実行した結果の方が偏りがあるように感じました。3行で出力するという部分に無理があったかもしれません。もう少し改善の余地があると感じました。
SharePointリストの参照列で選択肢型のデータを表示する

# 前提知識
Microsoftサポートの公式ドキュメントによると、SharePointリストで参照列の作成に「選択肢型」はサポートされていません。

https://support.microsoft.com/ja-jp/office/%E3%83%AB%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E5%88%97%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%83%AA%E3%82%B9%E3%83%88-%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-80a3e0a6-8016-41fb-ad09-8bf16d490632


# 事前準備
今回、製品リストと売上リストを用意し、データを登録しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/2fda3486-2d12-89d9-0444-e22289debffb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/566ef813-27df-6847-5f53-160c03baad45.png)

事前に、売上リストの商品IDを参照列として追加し、商品リストから製品名の値を参照していますが、製品仕様上の理由で選択肢型の製品別は参照できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/98e2b373-48c0-20c1-c7b8-96df240726c7.png)

# 手順1. 列の種類［集計値］の列を追加する
製品リストを開いた状態で、設定から［リストの設定］⇒［列の作成］をクリックし、列の情報の種類は［集計値］を選択して、数式は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/71a60f2a-ee91-103e-5312-b6f0a114895c.png)

製品リストに選択肢型で選択した文字列が表示されます。追加した製品別データの列は非表示にして大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/ef530437-f218-157f-68fe-31eaa2313a1a.png)

# 手順2. 参照列から［集計値］の列を選択する
参照列の商品IDをクリックし、列の編集で［ソースリストから列を追加］に製品別データが表示されているので選択することで、参照列で選択肢型のデータを表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/5ae2ff93-84af-b474-d7af-2ac3635e01a0.png)
Ubuntuのアンインストール方法

## はじめに
Visual Studio Code (VSCode)とUbuntuのバージョンを変更するため、既存のアプリをアンインストールして新しいバージョンをインストールしました。
しかし、以前の設定や情報が残っていたことが原因で、インストールが正常に行えない問題が発生しました。
何度か同じ問題が発生しましたが、その都度忘れて調べ直していたため、VSCodeおよびUbuntuのアンインストール手順を備忘録としてまとめました。
VSCodeのアンインストール方法についてはこちらの記事に記載しております。
https://qiita.com/_furuya/items/00094b5c595272cb0ab0

本記事では、Ubuntuについて記載します。


## 環境
・Windows 10
・Ubuntu 20.04.6LTS

## 手順
### 1.コマンドプロンプトでUbuntuを停止・解除する
①以下のコマンドを入力し、インストール済みのWSLディストリビューションの一覧を表示

&emsp;`wsl -l -v `
&emsp;<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/f859f371-f151-1cc3-7f0c-a06073f4d55b.png" width=50%>

&emsp;※STATEが「Running」の場合は、以下のコマンドを入力してWSLを停止します。
&emsp;&emsp;`wsl --shutdown`

<br>

②以下のコマンドを入力し、WSLからUbuntuを解除
&emsp;`wsl --unregister ubuntu`
&emsp;<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/d9fabbb9-d833-6df7-da8f-7e85bf1f9266.png" width=60%>

### 2.Ubuntuをアンインストールする
①設定＞アプリ＞アプリと機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/8988a31f-b26b-e656-ee6a-417d5c023e95.png)
②Ubuntuを検索し、選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/4b533ad6-8312-45b5-e5ca-07a223615a58.png)
③「アンインストール」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/64dd583f-390e-e0c7-a987-b4d50a3ac34d.png)

<br>

### 3.関連する拡張機能を無効化
①設定＞アプリ＞アプリと機能
「プログラムと機能」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/f3ee2112-0053-cc60-49e5-3f59c0d78e9f.png)
②「Windowsの機能の有効化または無効化」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/e2686fbf-2889-b66e-9b79-26dc16b23bc1.png)
③以下の機能のチェックを外す
　・Linax用Windowsサブシステム
　・仮想マシンプラットフォーム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/8c436c6b-8152-d16f-4765-513597e83779.png)

④「OK」を押下後、「再起動しない」を選択
　※手順4が終わった後にPCを再起動するため、一旦「再起動しない」を選択しています。
 　（どちらでも可）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/0690df0c-5074-8d63-1382-36e3ae785a3a.png)

<br>

### 4.WSL関連アプリの削除
①設定＞アプリ＞アプリと機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/8988a31f-b26b-e656-ee6a-417d5c023e95.png)
②Windowsを検索し、「Windows Subsystem for Linux Update」をアンインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/a248ad24-10bc-ec53-983c-e750cd8f5b16.png)

### 5.再起動
１～４まで実行後、PCを再起動します。

<br>




参考：
https://jp.minitool.com/news/uninstall-wsl.html
https://qiita.com/zakoken/items/61141df6aeae9e3f8e36

## さいごに
私の場合はこの手順でアンインストールから再インストールまで問題なく行えました。
VSCodeのアンインストール手順については別の記事に記載しております。
参考になれば幸いです。
AVTOKYO2024 Open xINT CTF 2024 writeup

自分の備忘録として

# misc amore
この本のタイトルは？
What's the title of this book?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/8b463037-313e-0ce8-020c-f439ff52d517.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1163572/76b15799-7053-e2d5-33dd-8edada40318a.png)

結論、レンズは勝手に回転して検索しないので、自分で回転させる
include先のメソッドを使うモジュール

# 動的型付け言語のメソッドを実行する瞬間にそのメソッドが呼び出せれば良いという考え方でプログラムを書ける

### include先のことを考えてモジュールのメソッドを書くことができる
```rb
irb(main):001* module Taggable
irb(main):002*   def price_tag
irb(main):003*     "#{price}円"
irb(main):004*   end
irb(main):005> end
=> :price_tag
irb(main):006* class Product
irb(main):007*   include Taggable
irb(main):008*
irb(main):009*   def price
irb(main):010*     1000
irb(main):011*   end
irb(main):012> end
=> :price
irb(main):013> product = Product.new
=> #<Product:0x0000000106ef1c60>
irb(main):014> product.price_tag
=> "1000円"
```
### selfをつけても動く
```rb
irb(main):001* module Taggable
irb(main):002*   def price_tag
irb(main):003*     "#{self.price}円"
irb(main):004*   end
irb(main):005> end
=> :price_tag
irb(main):006* class Product
irb(main):007*   include Taggable
irb(main):008*
irb(main):009*   def price
irb(main):010*     1000
irb(main):011*   end
irb(main):012> end
=> :price

irb(main):014> product = Product.new
=> #<Product:0x000000011249f6c0>
irb(main):015> product.price_tag
=> "1000円"
```

https://gihyo.jp/book/2017/978-4-7741-9397-7

# 感想
動的型付け言語の実行の瞬間で成り立つ特徴に慣れたい
Visual Studio Code (VSCode)のアンインストール方法

## はじめに
Visual Studio Code (VSCode)とUbuntuのバージョンを変更するため、既存のアプリをアンインストールして新しいバージョンをインストールしました。
しかし、以前の設定や情報が残っていたことが原因で、新しいバージョンのインストールが正常に行えない問題が発生しました。
何度か同じ問題が発生しましたが、その都度忘れて調べ直していたため、VSCodeおよびUbuntuのアンインストール手順を備忘録としてまとめました。
本記事では、VSCodeについて記載します。


## 環境
・Windows 10
・Ubuntu 20.04.6LTS

## 手順
### 1.アプリを削除する
①設定＞アプリ＞アプリと機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/8988a31f-b26b-e656-ee6a-417d5c023e95.png)
②VSCodeを検索し、「アンインストール」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/7d8410af-2319-05a1-2e2d-07ea0f672b37.png)
③「はい(Y)」を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/21738761-5bec-e9dc-70c5-6eb80c090541.png" width=50%>
④「OK」を押下
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/3f766710-2c48-72ef-91ee-f7d67bcd61b2.png" width=50%>

### 2.関連フォルダを削除
以下の関連フォルダを削除します。
（コマンドでも削除できますが、今回は手動で行います。）
・「.vscode」（ユーザー設定や拡張機能など）
・「Code」（設定ファイルやキャッシュなど）
・「.vscode-server」

#### ①.vscode
例）C:\Users\<ユーザー名>\.vscode
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/b4d312ee-c609-7976-ea23-f33cd294eedc.png)

#### ②Code
例）C:\Users\<ユーザー名>\AppData\Roaming\Code
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/a51100a1-6666-c675-6578-54b2df1382a7.png)

#### ③.vscode-server
例）Linux/Ubuntu/home/<ユーザー名>/.vscode-server
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516839/0d819603-0bf9-37ec-378b-14615ca5193f.png)

参考：
https://zenn.dev/youfuku/articles/e44a54546934ae

## さいごに
私の場合はこの手順でアプリとVSCode関連のファイルを削除したことで、再インストールも問題なく行えました。
Ubuntuのアンインストール手順については別の記事に記載しております。
参考になれば幸いです。
忙しくても大会で入賞したい！

# はじめに
プログラミングをやっていて、**ハッカソンやコンテストで賞を取りたい！** と思うことは本当に多いです。
特に中高生や大学生だと、それが入試や就活に影響を与えることも多く、賞という実績があることはとても大事です。

しかしながら、学業やサークル、本業など、大会に割ける時間が少なく、**大会に出られない、出ても実績が残せない** という経験をした人は多いのではないでしょうか。

この記事では、**大会はかけた時間ではないこと**、そして **いかにして大会とそれ以外を両立するか** をまとめていきます。

# 私の入賞歴

### アプリ甲子園2021 準優勝

https://www.youtube.com/watch?v=-a7-WVRYbts

### Life is Tech!ハッカソン 優勝

https://note.com/lifeistech/n/ne9af55934765

### 都市大ハッカソン 最優秀賞

![PXL_20240916_072049474.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/cfe8246e-6a19-b4fa-5dd9-5de1e0f044ff.jpeg)

### Open Hack U 2024 優秀賞

https://hacku.yahoo.co.jp/hacku2024_tokyo3/

と、これまでかなり大会だらけの人生を歩んできました。
もちろん高校・大学とも授業は多いため、その両立に大変苦労し、その中で自分なりの「勝ち方」を見出してきました。

# 1.企画が最重要〜Twitterは入賞しない〜

まず1番大事なのが **企画力** です。**企画が良ければ賞が取れます。**

では、良い企画とは何でしょうか。

## Twitterは入賞しない

まずは大会に出る上で悪い企画を考えましょう。例としてTwitterが挙げられます。
（これは現在めまぐるしく進化しているXではなく、多くが慣れ親しんだTwitterの方、という意味です）

何が弱いかというと

- 目新しさが無い
- ユーザーが多くないと良さを発揮しない
- 課題を解決していない

の3点です。

逆に言えば、**これらの逆が良い企画の条件** となります。

## 良い企画とは

まとめると、

- 目新しい
- ユーザーが少なくても体験が良い
- 課題を解決する

、つまり

- **新規性がある**
- **サービスのコンテンツ自体が価値を持つ**
- **ユーザーのストーリーが思い浮かぶ**

ような企画が良いものということになります。

ユーザーがユーザーに価値を与えるのではなく、あくまで **サービスを使うだけで簡単に良さが伝わってくる** ものが、大会にとっては優れているということです。ゲームでソロプレイとマルチプレイをイメージしてもらえるといいかと。

## もっと良い企画とは

以下は思いつけばより良いものですが、

- 発展性がある
- 事業化できる

といった観点も非常に大事です。今後売り出せるような作品はもちろんより強い印象を与えられます。

## 良い企画をどのように作るか

**忙しくても考えることはできます**。

移動中にもアイデアを考えられたらかなり時間を捻出できるので、**アイデアを出し慣れておく** ことに意識を向けましょう。例えば、

- 毎日1つは頑張ってアイデアを出す
- ブレインストーミングを周期的にやる

などをやって練習することがとても大事です。

他にも便利なツールを使うととても捗ります。

https://www.figma.com/ja-jp/figjam/

https://miro.com/ja/

また、過去入賞者のアイデアをたくさん見ることも大事です。

# 2.発表の構造

大会の最後には必ず **審査員に対しての発表** があります。**ここでアピールできなければどんな良い作品を作っても入賞できません。**
なので発表は一定以上の水準のものを作りましょう！

## 刺さる発表の構成〜サービス系〜

サービス（アプリやWebサービスなど）だと、以下のようなものが良いです。

1. 問題提起
1. このサービスが解決している課題
1. 作品概要、解決している課題
1. 具体的な新機能、新規性のアピール
1. 今後の展望

最初に問題提起をすることで、**審査員にサービスを利用している疑似体験** を与えることができます。また、その後の機能紹介もより効果的にすることができます。

とにかく、**審査員に共感を与えることに意識を向けましょう。**

例：アプリ甲子園2024

https://www.youtube.com/watch?v=gYmm_rbxGRc

## 刺さる発表の構成〜ゲーム系〜

ゲームだったり、エンタメに寄せた作品の場合、以下のようなものが良いです。

1. 作品概要
1. 作品の実際の動作風景
1. 具体的な新機能、新規性のアピール
1. 今後の展望

ゲーム系は **とにかくビジュアルが強い** です。ぱっと見の印象が何より強いので、**グラフィックの強さを強調** していきましょう。

例：アプリ甲子園2024

https://www.youtube.com/watch?v=h4CcCi5JQJw

## 過去作品のリサーチ

**必ず過去受賞作品は確認しましょう。** どのような雰囲気の発表が上位か、どのような点を集中的に発表しているか、などは確認しておくべきです。

大会ごとに特色は異なるので、それをある程度は把握しておきましょう。

# 3.何を実装するべきか

ハッカソンなどでは開発期間が短く、**全ての機能を実装することはできない** ことが多いです。
そんな時は、**楽に開発できて評価が上がるもの** を積極的に選んでいきましょう。

コアとなる機能が開発されているならば、

- チュートリアルをつくる
- グラフィックを強化する
- 振動など触覚フィードバックを追加する

など、**フロントエンドで完結するようなものが好ましいです。**

ぱっと見のクオリティが上がりやすいものに着目して作品を作っていきましょう。

絶対に **完璧を目指しすぎない** ことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/d41cdce0-fdea-3e50-ff12-447dafe66095.png)

# まとめ

このアドカレの提出先「Life is Tech!」でも多くの中高生が大会に挑戦していますが、多くが勉強との両立を苦に思ったような結果を出せていない現状があり、この記事を書きました。

**あくまで勉強を優先するべきで、大会はその次です。** その上で実績を残すには、ある程度効果的な構造化が必要となります。この記事がその一助になれば幸いです。
1人でアドカレ25記事を書いた体験記

# はじめに
今回私は **1人でアドカレを完走しました！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/b6c066df-c2da-1ce0-72df-570934a38a31.png)

https://qiita.com/advent-calendar/2024/as

このバカみたいな量の記事を書くために意識したこと、上手くいったことと上手くいかなかったことをまとめようと思います。

# 上手くいったこと

今回は11月後半時点でいくつか打っていた手があり、それによって成功率がぐっと上がったのを感じました。

## 初手で全ての概要を考えた

2024年最大のニュースとして、**「桜井政博のゲームを作るには」は撮影前に全ての動画概要が決まっていた** というのがありましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/812651c3-915b-a080-4332-9ed7d6626580.png)

https://youtu.be/drV0RYUbYUA

いやもうまじバケモンかよと。

しかし、**リソースを多く割かずにアドカレを完走するにはこの方法しかない** という確信があったので、これを真似して **先に全ての記事のタイトル・目次** を完成させ、↓のような記事を25個作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/267332db-2de1-a7b2-51d2-45ff399cd009.png)

### アイデア出しの手法

**そもそも25個もアイデア出てこない** というのが普通です。私はなんとか7個くらいは初手で思いついたのですが、そこからがどうしても出てこない。

そこで、**曜日ごとにジャンルを定めました。** （桜井政博のゲームを作るには、にもジャンルがありましたよね）

- 月曜日：ハッカソンなど体験談
- 火曜日：Firebaseの記事
- 水曜日：AIを組み込んだiPhoneアプリ開発
- 木曜日：macOSアプリを作る記事
- 金曜日：ChatGPTのAPIを使う記事
- 土曜日：雑談
- 日曜日：Swift初心者向け記事

こうやって分類することでアイデアを出しやすくし、なんとか25日分のアイデアを考え切りました。

タイトル決め・目次作成までで **3時間くらい** かかった記憶があります。

## 毎日書かない！

毎日継続して書く、となると **絶対にどこかで続かなくなる自信がありました。** 毎日の継続って辛いですから。

なので大学の合間など時間を見計らって、**1日で2〜3記事を書く** ことを意識しました。

また、11月に投稿された記事も登録できるため、**11月時点で最初の週の記事は全部書いてました。** ストックがあるのってメンタルにすごい良いですね。

## 技術調査にこだわりすぎない

技術記事を書くので一番時間がかかるのが **技術調査** です。

今回は **1記事1時間** を目安に調査しすぎないことを目指し、すでにやったことのあるもののみをまとめていきました。書いている途中で調査に時間がかかりすぎるようなら **記事の内容を多少変更してグレードダウンする** こともしながらやりました。

あくまで目標は **アドカレ完走** だったので、そこは仕方ないです。今後調べきれなかった箇所を調べていこうと思います。

## ちゃんと発信する

1人アドカレやります！という発信だったり、毎記事ちゃんとハッシュタグつきで発信したりしたので、**Qiita公式からいいねがもらえたり、たくさんいいねがもらえたり**、こういったことがちゃんとモチベになりました。

https://x.com/AS_LiT_atsushi/status/1862320227838799920

ちなみに一番多く良いねもらえたのがこの記事でした。

https://x.com/AS_LiT_atsushi/status/1864439905251959023

始まってすぐだったのと、ちゃんとハッシュタグつけたこと、**めちゃ朝早く投稿したこと** が大事だったのかなぁと思います（通勤通学中に見てもらえたのがよかったのかもしれない）

余談ですが、**何時に投稿したらいいねもらえるか** も時間ずらしながら調べており、やはり **正午12時ちょうどと夜18時** がすぐに良いね伸びやすかったです！

# 上手くいかなかったこと

結構見切り発車だったのでボロが出たところもありました。

## 技術調査間に合わないがち

アイデア概要は結構慎重に決めたつもりでしたが、記事を書いてみるとそれでも技術調査が足りないものがあり、それを考えるのが間に合わなかったです。**既知の内容のみ発信していくのが良さそう**。

また、難しい記事も書く予定があったのですが **全然間に合わなかったです。** 調子乗らないようにしましょう。

## ファイルサイズが足りないがち

月ごとに使えるファイルサイズがあるのですが、案外すぐにその上限に達しそうになってめちゃびびった。

この記事書いてる時点で61MBだったので、**画像が倍あったらやばかった**。

![スクリーンショット 2024-12-23 22.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/5d5f347d-7c2f-97d6-008c-cb1a044aefc5.png)

# まとめ

**来年もやります！多分！**

アウトプットの機会が得られたのがとても良かったので、**25個記事が書けるくらい濃い人生を来年も送りたいです！**
chatGPTから出された問題をひたすら打ち返す学習法

## はじめに
まず私について。Reactを学習中（始めて2週間くらい）
JavaScriptはほぼ知識がなくてJQueryで少し触れたくらい
AIについても知識が深いわけではない

## ハンズオンだったらできるけど
学習を始めて、Udemyエオ見ながらのハンズオンと実際にアプリを1つ作るという課題をこなしてみた。
作れるけど...、すぐ忘れる。
あれ、なんだっけ？がめちゃくちゃ多い

## chatGPTを使おうと思ったきっかけ
新しいことが膨大すぎて、全然覚えられないので
これは何度も似たパターンでやってみる必要があるなと思ってChatGPTに手伝ってもらうことにした

## まずは自分の中の問題点を整理
自分の中に以下の問題点を感じたので、この部分をクリアしていくために、いくつかのパターンで経験を積みたいなと思った
・配列の中にオブジェクトが入る場合とちょっと混乱しちゃう
・map関数を使ったことがないから使い方がよく分かってない。使う機会を増やしてもっと使えるようになりたい

## とりあえずこんなプロンプトで送信
特に調べたりもしていない独学なのでもっといい案があるかもしれないですが、以下の形で送ってみた。

```
reactの初学者です。
配列にオブジェクトが複数あるとうまく扱えません。
map関数を使った例題でいくつか練習したい。
一問一答形式で、コードをレビューしてもらいながら進めたい
```
### ポイント
「Reactの初学者です」
と伝えるととっても優しい例題が送られてくる
「一問一答形式で」
と指定すると下記のようなやり取りになる

chatGPT：例題を出題
私：コードを送る
chatGPT：レビューをくれる
私：納得すれば次を催促する

## まとめ
例題を自分で作ったり探したりするのは大変だけど、
chatGPTを使えばすぐに問題をくれて、そのまま答え合わせもしてくれてとっても便利。
わからなければヒントで相談にも乗ってくれる
例題が気に入らなければ違うのを要求するっていう我儘にも付き合ってくれる

問題集を解くみたいに、いくつかパターンをこなしていて、
こんな時にも使えるんだ〜！と言った感じで楽しくやってます
iPhoneアプリのアイデアを出す仕組み - 掛け算の先へ-

# はじめに

**優れたアプリのアイデアはすぐに出てこないものです。**

アイデアは降ってくる、とよく言われますが、**ただアイデアの降ることを待っているのは趣味どまりであり、結果にはつながりません。**

そこで、既存の優れたアイデアを観察し、**アイデアとはどのように構成されるか** を探り出し、逆算的にアイデアの出し方を探っていきます。

# アイデアは掛け算から生まれる

アプリをただ言葉にしても構造化はできないため、そのコアとなる機能を掛け算で表します。孫正義が辞書2つを持ち運ぶ話は有名ですが、それに則ってみましょう。

### LINE : メッセージ × 既読

ただのメッセージアプリは（email含め）多数ありましたが、そこに「既読」という概念を足したのがLINEです。

初めこそ3.11における安否確認の意味合いを込めてつけられた機能でしたが、**返信までのテンポを測る** ことが可能になり、会話にリズムをもたらした重要な機能となりました。

### パズドラ : スワイプ × パズル

スマホゲームが現れ始めた頃、それまでは直線的で離散的だったパズルの操作（テトリスやぷよぷよなどを想像してください）に、スワイプによる縦横無尽な操作を掛け合わせたのがパズドラというゲームです。間違いなく **スマホの特性を最大限活かした操作性** でした。

パズルとして頭脳を使う点は残しつつ、初期の頃は操作時間が4秒だけと、スワイプにより可能になった俊敏な操作をユーザーに体験させることで、爽快感と緊張感のあるゲームとなりました。

### BeReal : カメラ × ゲーム

**制限時間以内に写真を撮る** というゲーム性が、ただの写真系SNSをここまで大きくしました。もちろん同様のゲーム性を持つアプリは今までもありましたが、BeRealはTVでのCMを打たなかったため、**身内でのルール** としてこのゲーム性が昇華し、結果としてより強い印象をユーザーに与えたと考えています。

アプリの課題解決としては「自分のありのままを投稿する」ことを謳っていますが、実際のところユーザーはこの **身内ノリ** としてBeRealを取り入れたことにより、大きな満足感を伴う体験を届けているわけです。

## ユーザーの体験は掛け算からすぐ見えない

さて、上の3つの例を見てもわかるように、**掛け算に現れる要素とユーザーの得る体験は全く違います。**
当たり前のことですが、使っている技術とそこから得られる体験は等しくないのです。

こう言うと掛け算への分解に意味がなくなりそうに思いますが、実はその逆で、**だからこそ掛け算からユーザーの体験までを引き出せる** のです。

**掛け算に面白さを求めないことです。** その真価を導くのが、アイデア出しで最も大事になるところです。

しかし、**使用している姿を想像できない掛け算** をしてもこのようなことはできませんから、ユーザーを想像しやすい形で掛け算を考えるべきです。

# アイデアを引き出す掛け算とは

上3つの例を見てみると、どれも **スマホ固有の機能×概念** という形をとっています。

この **スマホ固有の機能** を考えるのが非常に大事です。これが含まれることにより、掛け算からもユーザーの使っている姿を簡単に想像することができるようになります。

また、結局掛け算からユーザーの姿を後々想像していくので、**掛け算は目新しいものほど良いです。**
掛け算の時点で新しさを感じないものから良い機能を捻り出すよりも、目新しいものから出していったほうが選択肢が広がります。

### 機能の例
- カメラ
- 画像認識
- メモ
- AR
- VR
- 時計
- アラーム
- カレンダー
- ストップウォッチ
- 地図
- 天気
- 位置情報
- 加速度センサー
- 明るさセンサー
- ライト
- 通話
- 電卓
- AI
- キーボード
- 通知

### いちど頭の中でレビュワーになる

ランダムに機能と概念を選び掛け算をするだけでも良いです。そこから実際にアプリのアイデアが思いついたら、**頭の中で触ってみます。**

そうすると次第に、こういう機能があって欲しい、こういう画面だったらオシャレだ、などが思いついてきます。**それを一つ逃さず言葉にしましょう。**
批評家になったつもりで一通りアプリを触り、新規性やUI/UXについて言葉にし、こんな画面/機能が一番重要なものになるだろうと想像します。**自分がその時一番大事だと思った機能がメインの機能です。**

そのメインの機能同士で戦わせ、優れたものを選びましょう。アイデアは数です。

# 日常でできるトレーニング

大事なのはインプットとアウトプットです。日常でも手軽に行えるものをいくつか挙げます。

## 数を出す

何度も言いますが、**アイデアは数です。**

多数のアイデアの中で勝ち残ったものは間違いなく素晴らしいし、2番手も同様に素晴らしいアイデアとなるため、自分の意見を強く通しやすいのです。

だからこそ、1日1つアイデアを出す、だったり、2週間に一度時間を取ってアイデアを10個出す、などでも効果があります。まずは数を出す練習をしましょう。
（この時、それぞれのアイデアに質を求めてはいけません。自分の中で新しさを持ったものならなんでも一つのアイデアと認める必要があります。）

## 多くのアプリを言葉にする

**多くのアプリに触れましょう。** ランキング上位からダウンロードしていって軽く使ってみて、このアプリがどのような掛け算に分解されるかを考えると素晴らしい勉強になります。

アイデアを出す際に、良い掛け算の分解やアイデアの優劣を知らなければ優れたアイデアを見逃しますし、必要のない時間を要します。
ぱっと見でも良いか悪いか判断できるようになるためには、多くの作品、多くのアイデアに触れるべきです。

# まとめ

アイデアは数です。数を出すためには構造が必要で、そのためにこの掛け算がとても有用です。ぜひ掛け算によってアイデアを作っていきましょう！
パフォーマンス検証をやってみて

# はじめに
皆さんこんにちは。

普段、モバイルゲームの品質管理をしているものです。
不具合の再発防止や業務効率化などに従事しております。

毎年QAに関する記事を書いていますが、今回は「パフォーマンス検証」の取り組みについて書きたいと思います。
あくまで一例なので参考程度に読んでいただけると幸いです。

# パフォーマンス検証とは？
まず初めにパフォーマンス検証について説明します。
パフォーマンス検証とはアプリが動作する環境での処理能力や負荷耐性を測定・評価する作業のことを指します。
具体的には以下の項目に対して必要な基準を満たしているかをチェックしていきます。
それぞれの項目に対して検証内容は異なりますが今回の記事では一部抜粋してご紹介します。

* フレームレート（FPS）
* メモリ使用量
* CPU負荷/GPU負荷
* デバイス間の動作差異
* ネットワーク遅延や負荷への耐性

# パフォーマンス検証を怠ると...
パフォーマンス検証をしないと以下リスクの発見が遅くなり、
プロジェクトへの影響が大きくなってしまうので早期に見つけることが大切です。

* クラッシュの増加
メモリリークや高負荷の放置により、アプリがクラッシュしやすくなる
* 低評価レビュー
「動作が重い」「クラッシュする」などのレビューが目立ち、アプリの評価が下がる
* 必要スペックの増加
十分に検証していないと、低スペック端末で動作が極端に悪化
結果として多くの潜在ユーザーを失う
* 収益機会の損失
不満を抱えたユーザーは課金や継続利用を控えるため収益が減少する

これらを改善するためにパフォーマンス検証が必要になります。

# 取り組み
まず、パフォーマンス検証を行うきっかけとして、低スペック端末を中心にアプリ落ちが頻繁に起きることが、SNSやお問い合わせによるユーザーからのFB、運営メンバーのテストプレイから発覚したため、早急に改善が必要になったという背景からになります。
そのうえで私が運営中のタイトルで行ったパフォーマンス検証を一部ご紹介します。

**基準の設定**
* フレームレート（FPS）：目標30FPS以上
    * フレームレートは開発側で作成したデバッグツールから測定しております
    * 他にもツールなどで測定できると思います
* ターゲット端末：iOS/androidの低スペック機種、ユーザー使用率が高い端末
※低スペック端末はサポートの下限値、ユーザー使用率は全体の端末所持状況を調査して決定しています

**検証内容**
* 高負荷シーンでの動作検証
    * 主にバトル周りやオブジェクトが複数置かれている箇所でクラッシュ率の計測
        * 地道ですがバトルの検証だと数十回バトルをこなし何回目にクラッシュするかを確認しています
        * 手順や条件は開発チームと相談しています
         ※解析データはiPhoneが[提供](https://www.apple.com/jp/legal/privacy/data/ja/device-analytics/ "タイトル")しているデバイス解析になります
 ![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541094/da30ef7c-4650-7e11-4381-1c327903aa82.png)

    * 発熱チェック
        * 発熱は大まかに確認しています
        * 具体的に何℃といったものは作らず、プレイする上で熱すぎて持てないレベルになっていないかを基準に検証しています
        * かなり曖昧なので今後明確な基準を定めます
* 探索プレイ
    * 上記以外の個所で落ちやすい箇所がないか確認

# パフォーマンス検証の振り返り
**成果**
検証を通してメモリリーク、クラッシュの原因となる箇所の情報提供ができ、
改善後は全体の動作が安定し、安心してリリース準備に移ることができました。
開発チームには高負荷シーンでの動作検証と発熱チェックなどの検証結果を報告しています。
※どこで何をどうしたらクラッシュするのかを報告することが大切

**気づき**
ターゲットの明確化
・ゲームのメインユーザー層を明確にすることで、必要な検証範囲を効率的に絞り込めた

早期テストが鍵
・開発後半に問題が発覚すると、修正のコストが大きい
・コードフリーズされてから検証を行っていたため、着手するタイミングに遅れが出てしまい修正コストがかかる
・開発の初期段階から継続的に検証を行うことの重要性

チーム間コミュニケーションの大切さ
・開発チーム全員が同じ認識を持つことの重要性
・例えば、デザイナーやアニメーターが最適化を考慮せずにリッチな素材を提供すると、結果的に開発が非効率になる
・エンジニア・デザイナー・プランナー間で早期からの情報共有が、パフォーマンス問題の未然防止に役立ち、検証個所も明確になる

# まとめ
モバイルゲームのパフォーマンス検証は、単なる技術的なタスクではなく、ゲーム全体の品質やユーザー体験を左右する重要なプロセスになります。
動作のスムーズさ、クラッシュ防止、端末間での均一なプレイ感を実現することで、ユーザー満足度を向上させ、結果としてアプリの成功につながります。
パフォーマンス検証は手間のかかるプロセスですが、その効果は大きく、高品質なゲームを実現するための投資なので短期的なコストに目を奪われず、長期的なメリットを見据えて取り組むことが重要になると実感しました。
ただ、検証内容としては決められた動きを何度も実行する形になるので自動化による効率化も実現していきたいと思います。
この辺りは今後の展望として取り組んでいきたいと思います。

それでは、みなさんよいクリスマスを:xmas-tree::xmas-wreath1::xmas-wreath2:
ミックスインされているかを確認する

```rb
irb(main):001* module Loggable
irb(main):002> end
=> nil
irb(main):003* class Product
irb(main):004*   include Loggable
irb(main):005> end
=> Product
```
# クラスにincludeされているか？
```rb
irb(main):006> Product.include?(Loggable)
=> true
```
# includeされたモジュールの種類
```rb
irb(main):007> Product.included_modules
=> [Loggable, PP::ObjectMixin, Kernel]
irb(main):008>
irb(main):008> Loggable.included_modules
=> []
```
# モジュールだけでなくスーパークラスの情報も配列で表示
```rb
irb(main):009> Product.ancestors
=> [Product, Loggable, Object, PP::ObjectMixin, Kernel, BasicObject]
irb(main):010> Product.superclass
=> Object
```
# インスタンスのクラスに特定のモジュールがincludeされているか
```rb
irb(main):011> product = Product.new
=> #<Product:0x000000010c9ea888>
irb(main):012> product.class.include?(Loggable)
=> true
```
# インスタンスのクラスにincludeされたモジュールを表示
```rb
irb(main):013> product.class.included_modules
=> [Loggable, PP::ObjectMixin, Kernel]
```
# インスタンスに特定のモジュールがincludeされているか
```rb
irb(main):014> product.is_a?(Product)
=> true
irb(main):015> product.is_a?(Loggable)
=> true
irb(main):016> product.is_a?(Object)
=> true
```
https://gihyo.jp/book/2017/978-4-7741-9397-7
macOSでFirebaseを使う方法

# はじめに

**macOSアプリでもFirebaseを使いたい！** と思ったことがある方は多いと思います。

しかし、SwiftUIでの開発でも、**iOSと同じようにFirebaseを導入できない** というトラップがあります！

今回はうまく行く方法をまとめました。

# iOSのようにうまくいかない

まずはうまくいかない方法から。
iOSのように`AppDelegate`に書き込んでもうまくいきません。

```swift
@main
struct MyMacOSApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ notification: Notification) {
        FirebaseApp.configure()
    }
}
```

**これだとうまく動きません！**

そもそも`AppDelegate`がmacOSアプリだと生成されないこともあり、避けたい方法かと思われます。

# コード

このように書くと動きます。

```swift
@main
struct ASKApp: App {
    init() {
        FirebaseApp.configure()
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
```

`init`時に動かしてしまうわけです。

これでも、iOSと挙動がちがうことは確認できなかったので、普通の用途なら銃bんかと思います！

# 余談

iOSとマルチプラットフォームで開発する場合、`@NSApplicationDelegateAdaptor`と`@UIApplicationDelegateAdaptor`を`#if os()`で切り替えて使う、という方法も使いたくなりますが、試したところうまくいきませんでした。

なので大人しく2つの`@main`を扱うと良さそうです。