OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoder 勉強記録[C++] その49

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - LOOKUP
[B - LOOKUP](https://atcoder.jp/contests/abc279/tasks/abc279_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  string s, t;
  cin >> s >> t;
  ll ssize = s.size();
  ll tsize = t.size();
  if(tsize > ssize) {
    cout << "No" << endl;
    exit(0);
  }
  bool jud = false;
  for(int i = 0; i <= ssize - tsize; i++){
    string tmp = s.substr(i, tsize);
    if(tmp == t) jud = true;
  }
  if(jud) cout << "Yes" << endl;
  else cout << "No" << endl;
}
```
### 解法
`T`のサイズが`S`のサイズが大きいと確実に部分文字列とならない。それ以外の場合、`S`において`T`の文字数分の部分文字列が`T`と一致するかを判定することで結果が求まる。
## B - Inverse Prefix Sum
[B - Inverse Prefix Sum](https://atcoder.jp/contests/abc280/tasks/abc280_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  vector<ll> s(n);
  rep(i, n) cin >> s[i];
  vector<ll> res(n);
  res[0] = s[0];
  ll sum = s[0];
  for(int i = 1; i < n; i++){
    res[i] = s[i] - sum;
    sum += res[i];
  }
  rep(i, n) cout << res[i] << ' ';
}
```
### 解法
解答の数列`res`を用意しておき、`res`の要素の総和を取り続けることで結果を求めることができる。
l メソッド

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## lメソッドとは
日時をローカル、つまり日本で読みやすいフォーマットにするメソッド。
コンピュータそのままだと日時が読みづらいのを、config/application.rbに記述した場所を基準にする。

## lメソッドの使用方法
1.まず'rails-i18n', '~> 7.0.0'をGemfileに記述し、インストールする。
2.config/application.rbに以下のコードを記述する。
```
# デフォルトの言語を日本語にします
config.i18n.default_locale = :ja
# デフォルトのタイムゾーンを日本時間にします
config.time_zone = 'Tokyo'
```
3.以上で準備完了。後はビューファイルにlメソッドを書けば簡単に見やすい日時表記になる。

例
```
<% @posts.each do |post| %>
  <li>
    投稿日時: <%= l post.created_at, format: :long %>
  </li>
<% end %>
```
このコードは@postsの格投稿について、created_atの日時を長い形式で表示している。
この記事ではRails7以降なので、lメソッドのshortやlongが組み込みのデフォルト設定になっているので、ロケールファイルに記述しなくてもよい。
mlx-whisperに無音検出を実装してみた

Silero VADのディスカッションで音声のセグメンテーションの話があったので実装しました。

https://github.com/snakers4/silero-vad/discussions/295

mlx-whisperはAppleSilicon搭載のMacで割と高速に動くのですが、無音検出が実装していないので会議の音声抽出は壊滅的に使えません。
今回、無音検出を実装しまして、そこそこ使えるくらいにはなっています。

https://github.com/mbotsu/mlx_speech2text

お試し実装ですので実際の業務での利用はご注意ください。
Windows で Python embeddable を簡単にセットアップする

## はじめに
諸々の事情で Python embeddable をインストールすることがあるかと思いますが、いちいち同じような作業をするのが大変なので簡単にセットアップするバッチファイルを作りました。

## セットアップ
```:setup.cmd
set ver=3.12.5
set url=https://www.python.org/ftp/python/%ver%

pushd "%~dp0"
mkdir python
pushd python

curl -O "%url%/python-%ver%-embed-amd64.zip"
tar -xzvf "python-%ver%-embed-amd64.zip"
del "python-%ver%-embed-amd64.zip"

mkdir Dlls
move *.pyd DLLs\
move lib*.dll DLLs\
move sqlite3.dll DLLs\

for %%f in (*._pth) do (
    echo import site>> %%f
    echo .\DLLs>> %%f
)
echo import sys; sys.path.append('')>python.pth

curl -O "https://bootstrap.pypa.io/get-pip.py"

echo ^@echo off > console.cmd
echo set PATH=%%~dp0;%%~dp0Scripts;%%PATH%% >> console.cmd
echo if "%%1" equ "" cmd /k >> console.cmd

echo ^@echo off > clean.cmd
echo pushd "%%~dp0Lib" >> clean.cmd
echo for /r %%%%i in (*.pyc) do del "%%%%i" >> clean.cmd
```
※環境により、curl の証明書が無効でダウンロードできないことがあります。その場合、下記のようにオプション ssl-no-revoke を追加してみてください。 
```
curl --ssl-no-revoke -O "%url%/python-%ver%-embed-amd64.zip"
curl --ssl-no-revoke -O "https://bootstrap.pypa.io/get-pip.py"
```

## 使い方
上記バッチファイルを任意のフォルダで実行すると、python フォルダが作成されます。バージョンは 3.12.5 ですが、変えたい場合は var のところを変更します。あとは console.cmd を実行するとパスが通るので、python スクリプトをコマンドラインから実行します。pip を使用する場合は次のコマンドを実行します。

```
>python get-pip.py
```
clean.cmd は Lib 以下に生成されたキャッシュを削除します。

## アンインストール
必要なくなったらフォルダごと削除します。インストールしたパッケージにより C:\Users\ユーザー名\ 以下に関連ファイルが生成されることがありますので注意します。

## 注意
pip を使用できるようにした後は、フォルダを移動してしまうと実行できなくなる場合があります。これは、Scripts 以下に生成される exe ファイルに python の絶対パスが書かれるからです。無理に対処する方法もありますが。。。

https://qiita.com/ebifuryai/items/ceb4f1b91db3c68706c9

## Tkinterを使用したい場合
Tkinter を使う場合は、下記サイトを参照してみてください。

https://qiita.com/Neilus/items/17b44d737d5acd1982fb

https://tanakatarou.tech/345/

## 必ず目を通しておいてほしいサイト
https://qiita.com/oxlunaxo/items/ca7ffc059be3ffc17622

## 参考にしたサイト
https://qiita.com/koppe/items/7fe62d483d351566d809

https://qiita.com/nekopc/items/ed8bfaaa3eb7fd4f15a3
【Git】コミットメッセージを変更する方法

## プッシュしていない最後のコミットの場合

プッシュされておらず、ローカルリポジトリにのみ存在する最後のコミットが対象の場合には以下の手順でコミットメッセージを変更できる。

1. 対象のコミットがあるブランチに移動する
2. ターミナルで `git commit --amend` を実行する
3. エディタでコミットメッセージを編集する
4. エディタを閉じる

## 古いまたは複数のコミットの場合

古いか複数のコミットの場合には以下の手順でコミットメッセージを変更できる。

1. 対象のコミットがあるブランチに移動する
2. ターミナルで `git rebase -i HEAD~n` コマンドを実行する
	 最後から3つのコミットを変更したい場合には `git rebase -i HEAD~3` を実行する
1. 変更したいコミットメッセージの先頭の `pick` を `reword` に書き換える
2. エディタを閉じる
3. 開いたエディタでコミットメッセージを変更する
4. エディタを閉じる
5. ターミナルで `git rebase --continue` を実行する

## 既にプッシュしている場合

既にプッシュしている場合には上記に加えて強制プッシュする必要がある。

```shell
git push --force-with-lease origin EXAMPLE-BRANCH
```

ただし、使用には十分注意すること。

## 参考

https://docs.github.com/ja/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/changing-a-commit-message
Azure updates の RSS が死んだまま復活してこない・・

# 背景

会社で Azure の Updates を RSS で取得して、幾つかの Team に飛ばしていた by Power Automate

ところが、2024/6 頭ぐらいから RSS 更新がエラーになっていた。
いい加減、直すかと思い調べた記録

# 結論

Azure Updates の通知方法が変更になったくさいが、
2024/6/8 に RSS 自体が死んだまま放置されてるっぽい

元々、RSS は以下で取得していた

https://azurecomcdn.azureedge.net/ja-jp/updates/feed

:::note info
ja-jp は、en-us とかにしてもOK
:::

updates 自体は、以下で継続して更新されている。

https://azure.microsoft.com/ja-jp/updates/

スクレイピングして取得しようかとも思ったけれど、GitHub Issues になっていたので、もうしばらく待つことにする

https://github.com/MicrosoftDocs/azure-sphere-issues/issues/310

community での報告は以下に上がっている

https://learn.microsoft.com/en-us/answers/questions/1692735/azure-updates-rss-atom-feed-is-not-working-is-it-d


# あとがき

MS としても認識してるけど、優先度低めなんかねぇ・・
今度、技術営業さんに相談してみるかな :thinking:
runAsyncとUIスレッドの役割

### Flutterでの非同期処理

Flutterアプリの開発において、非同期処理をどのように扱うかは、アプリのパフォーマンスとユーザー体験を大きく左右する要素です。特に、重い処理をUIスレッドで実行してしまうと、画面の描画が遅れたり、アニメーションがカクつくといった問題が発生する可能性があります。

この記事では、Flutterの`runAsync`メソッドとUIスレッドの役割について説明します。

### FlutterのUIスレッドとは？

FlutterのUIスレッドとは、アプリのユーザーインターフェース（UI）の描画やユーザーインタラクションの処理を担当する主要なスレッドのことを指します。一般的に「メインスレッド」とも呼ばれるこのスレッドは、アプリの見た目や操作性に直接影響を与える重要な役割を担っています。

UIスレッドの主な役割には、以下の3つがあります。

1. **描画処理:** UIウィジェットのレンダリングやアニメーションの更新を行います。これにより、ユーザーに見える部分が常に最新の状態で表示されます。

2. **ユーザーインタラクションの処理:** タップやスワイプといったユーザー操作は、UIスレッドでキャッチされ、適切なハンドラーに渡されて処理されます。

3. **アプリのロジック実行:** アプリのビジネスロジックや状態管理も、通常はこのスレッドで実行されます。

UIスレッドが重い処理でブロックされると、アプリのレスポンスが悪くなり、ユーザー体験が損なわれる可能性があります。これを防ぐために、Flutterでは`runAsync`などのメソッドを使って重い処理をバックグラウンドで行うことが推奨されます。

ちなみに、iOSにおいても、メインスレッド（UIスレッド）がアプリの描画やユーザー操作を処理する重要な役割を担っています。重い処理はDispatchQueue.global().asyncを使ってバックグラウンドで実行し、UIスレッドがブロックされないようにすることがありますが、FlutterのUIスレッドはそれと同じようなものと捉えることができます。

### `runAsync`とは？

`runAsync`は、Flutterで非同期処理をUIスレッドとは別のバックグラウンドスレッドで実行するためのメソッドです。これにより、重い計算やI/O操作をバックグラウンドで処理しながら、UIスレッドのパフォーマンスを維持することができます。

例えば、以下のように`runAsync`を使って重い処理を実行し、その結果をUIに反映させることができます。

```dart
await runAsync(() {
  // 重い計算や処理をここに記述
  return heavyCalculation();
}).then((result) {
  // 結果を受け取ってUIを更新
  setState(() {
    _result = result;
  });
});
```

このコードでは、`heavyCalculation`という重い計算を別スレッドで実行し、その結果をUIスレッドに戻して表示しています。これにより、UIスレッドをブロックせずに重い処理を行うことができ、アプリのスムーズな動作が保証されます。

なお、`runAsync`は、iOSでいうところの`DispatchQueue.global().async`や`DispatchQueue.background.async`に相当します。

上記のコードを書き換えれば、以下のようになるでしょうか。

```swift
DispatchQueue.global().async {
    // 重い計算や処理をここに記述
    let result = heavyCalculation()

    DispatchQueue.main.async {
        // メインスレッドでUIを更新
        self.updateUI(result: result)
    }
}
```

Flutterの`runAsync`とiOS`DispatchQueue.global().async`はどちらも、バックグラウンドで処理を実行し、UIスレッドをブロックしないようにするために設計されています。これにより、複雑な計算や時間のかかるI/O操作を安全かつ効率的に処理しながら、ユーザーにスムーズなインターフェースを提供することができます。

### Widgetテストでの使用例

ところで、pumpAndSettleを使ったウィジェットテストで、非同期処理が完了するのを待ってからUIの状態を確認するのに使う場合があります。これにより、テスト中にUIが完全に安定するまで待機し、確実なテスト結果が得られるようになります。runAsyncとpumpAndSettleを組み合わせることで、複雑なUIの非同期動作を正確にテストできます。

```Dart
testWidgets('非同期処理を待ってからUIをテスト', (WidgetTester tester) async {
  // ウィジェットをビルド
  await tester.pumpWidget(MyApp());

  // 非同期処理をバックグラウンドで実行
  await runAsync(() async {
    await Future.delayed(Duration(seconds: 2)); // 擬似的な重い処理
  });

  // 非同期処理が完了し、UIが安定するまで待機
  await tester.pumpAndSettle();

  // UIが期待通りに更新されているかをテスト
  expect(find.text('処理完了'), findsOneWidget);
});
```

### `runAsync`使用時の注意点

`runAsync`を使用する際には、いくつかの注意点があります。

- **UIの更新:** 非同期処理が完了した後、UIを更新する必要がある場合は、必ず`setState`などのUIスレッドで動作するメソッドを使用してください。これを怠ると、エラーが発生したり、意図しない表示が行われる可能性があります。iOS開発でいうと、DispatchQueue.global().asyncなどのサブスレッド処理をした後で、DispatchQueue.main.asyncを使ってメインスレッドでUIを更新する実装に対応します。

- **パフォーマンス:** `runAsync`はバックグラウンドスレッドで処理を実行するため、パフォーマンス上の利点がありますが、過度に多用すると逆にパフォーマンスを低下させる可能性があります。バックグラウンド処理が増えると、メモリ消費やスレッド管理に負荷がかかるため、必要な場合にだけ使用するのが賢明です。


### まとめ

FlutterのUIスレッドは、アプリのユーザーインターフェースのスムーズな描画やユーザーインタラクションの迅速な処理を実現するために不可欠です。UIスレッドの負荷を最小限に抑え、バックグラウンドで重い処理を効率的に行うために、`runAsync`を効果的に利用していきましょう！
SAP S/4 HANA 販売管理（SD）基本知識４：販売プロセス概要

## 販売プロセス概要
- ![販売プロセス1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3432463/3d01a87f-e4d5-da25-ba0f-3ef1a7bbd1ca.png)
- ここでは、販売プロセスにおける一般的な業務の流れと、SAPの伝票処理について説明します。基本的な流れをまず理解するため、最低限必要な処理に絞って説明します。
- まず得意先より注文を受けた場合、受注伝票を登録します。受注伝票からは注文請書を発行することが可能です。
- 受注の納期が近づいて来たら、出荷指示を行います。SAPの処理としては、受注伝票を参照して出荷伝票を登録します。
- 次に物流部門では出荷指示を受けてピッキングを行います。SAPの処理としては出荷伝票を元にピッキングリストを発行します。物流部門はピッキングリストを元に作業を行い、実績数量を出荷伝票に入力します。
- 実際に商品を出荷・発送したら、在庫の引き落としを行います。SAPではこの在庫引落の処理のことを「出庫確認」と呼びます。具体的には、出荷伝票に対して出庫確認の処理を行い、自社在庫から引落としが行われます。同時に、SAP内部では自動的に仕訳が生成され、FI(財務会計)の会計伝票が登録されます。仕訳の内容は在庫品の勘定から売上原価の勘定に振り替える、売上原価の計上です。勘定科目コードは品目タイプ等によって異なります。そして、納品書の発行が可能になります。
- 最後に売上の計上を行います。SAPではこの処理を「請求」と呼びます。請求伝票を登録することで請求書の発行が可能になります。同時に、SAP内部では自動的に仕訳が発生し、FI(財務会計)の会計伝票が登録されます。仕訳の内容は売上の計上です。
※締め請求書については、この後に締め請求処理を行う必要があります。この締め請求の処理はFI（財務会計）の機能になります。締め請求処理では、請求の対象とする会計伝票を複数選択し、締め処理を行います。この処理により、締め請求書を発行する元となる請求書伝票が登録されます。都度請求はSD（販売管理）の機能になります。
- テンプレートでは、締め請求書をアドオンで提供しています。
データURLを知る

## データURLとは
- MDN Web Docsによると
  「データ URL は data: スキームが先頭についた URL で、小さなファイルをインラインで文書に埋め込むことができます。」とのこと

----
## 形式
- data:[＜mediatype＞][;base64],＜data＞

※Base64：バイナリデータをテキストデータとして扱う手法（エンコード）の１つ

----
## 何が嬉しいのか
- 通信が発生しない！

----
## 背景
- 小さいデータはHTTPリクエストのオーバーヘッドが無視できない
  例えば大量のアイコンなど
- CSSスプライトという手法で対策するのも手だが、開発工程が煩雑になる
- データURLであればHTML（やJSON）に埋め込むことができるので手軽に通信回数を減らせる

----
## 使い所
- （先の例）大量の小さいデータを扱いたい
- File API
  ユーザが選択した画像の表示をブラウザ内で完結させられる（※重要！）
- AJAXで取得したバイナリデータをURL表現に変換（※重要！）
  1. imgタグで表示
  1. ファイルダウンロード

----
## 弱点
- 最大サイズの制限
  ブラウザによって最大サイズが異なっているようだが、せいぜい数十MBと考えておくのが無難
- キャッシュが効かなくなる

----
## 最後に
- 知っておくと確実に実装の幅が広がります
- 特にAJAXとの組み合わせで重要です
- 使いすぎには注意。使い所を見極めましょう
カプレカ数 (あるいは Google Colab の予測がすごい)

# 要約
- Python でカプレカ数 (Kaprekar number) を計算してみた
- Google Colaboratory を使ったけど, その予測精度にびっくりした

# はじめに
雑誌の記事で[カプレカ数](https://manabitimes.jp/math/1419 "カプレカ数（特に3桁の場合）について")のことを知り, Python の習作としてプログラムを作成しました.

手元の PC に Python の環境がなかったので Google Colaboratory を使いましたが, コードの予測 (先読み) 精度が高くて驚いたので, そのことにも触れながら説明します.

なお, 末尾に Google Colaboratory のノートブックへのリンクを貼っているので, コード全体はそちらを参照してください.

# カプレカ数を求めるコード
前提として, 4 桁の整数でカブレカ数を求めます.

## カプレカ操作
まず定義通り, 4 桁の整数の各数字を大きい順 & 小さい順に並べます. 大きい順に並べるコードは以下の通りで, 整数を文字列に変換してからソートして, 結合させた後に整数に戻してます. 工夫点は, 4 桁未満の数字が来ても動作するように, f 文字列で書式設定をしている点です.

```python:descending_order.py
def descending_order(num):
    return int("".join(sorted(f'{num:04d}', reverse=True)))
```
このコードですが, 関数名と引数を入力した時点で Google Colab が予測したコードは次の通りで, 違いは整数を文字列に変換するところだけ. 「4 桁の整数」などの前提条件が無ければ, これはこれで正解のコードでした. 

```python:descending_order_pred.py
def descending_order(num):
    return int("".join(sorted(str(num), reverse=True)))
```

次に, 小さい順に並べるコードは以下の通りです. 並び方を指定するオプションを外しただけです.
```python:ascending_order.py
def ascending_order(num):
    return int("".join(sorted(f'{num:04d}')))
```

そして差を求めるコードです. これも, 関数名を入力した時点でコード全体を予測してくれました. びっくり.

```python:diff_num.py
def diff_num(num):
    return descending_order(num) - ascending_order(num)
```

## 4 桁の整数で収束するまでに回数を求める
関数が準備できたので, 次に, 4 桁の整数がカプレカ数に収束するまで, カプレカ操作を繰り返すコードです. ```x``` と ```y``` の 2 つのリストを用意して, 4 桁の整数を ```x``` に, 収束するまでの回数を ```y``` に入れます.

```python:count.py
x = []
y = []

for i in range(1000, 10000):
    count = 0
    prev = i
    while True:
      num = diff_num(prev)
      if num==prev:
        break
      prev = num
      count += 1
    x.append(i)
    y.append(count)
```
## カプレカ数を求める
最後にカプレカ数を求めます. リスト ```y``` から要素が 0 のインデックスを探し, そのインデックスに該当する要素を ```x``` から探します. 方法は[こちら](https://note.nkmk.me/python-list-index/ "Pythonのリストの要素のインデックス（何番目か）を取得")を参考に, ```enumerate()``` と内包表記を使って求めます.

```python:kaprekar.py
candidate = [i for i, x in enumerate(y) if x == 0]
for i in candidate:
    print(x[i])
```
```:結果
6174
```
# さいごに
Google Colaboratory (だけでなく, 世間一般の AI) のコード予測機能がすごいので, これを利用するかしないかでコードの生産性が大きく変わるなと感じた次第です. 一方で普通の検索では
- 検索でヒットする情報が似かよっている
- 世の中の進歩が速いので, その情報が作成された時期が新しくても, 載っている情報が古い場合がある

など, 目的の情報を得るのに時間がかかる場合があるので, こういうツール類は適材適所で活用していく必要があると思いました.

カプレカ数については, 4 桁の整数の場合は最大 7 回のカプレカ操作によりカプレカ数 (6147) に収束するのが分かり, その点が興味深かったです. Google Colab 上のコードでは, 横軸に 4 桁の整数, 縦軸に収束するまでの回数をプロットしたグラフを載せてますので, 興味があればご確認ください.

# 追伸
4 桁の数字がゾロ目のとき (たとえば 1111) の処理を無視していることに気付きました. ゾロ目のときは,
- 1 回目の操作 ; ```1111 - 1111 = 0```
- 2 回目の操作 ; ```0 - 0 = 0``` → 1 回目と同じなので収束

という動きをしています.

# リンク
- [Google Colaboratory 上のコード](https://colab.research.google.com/drive/1Y-RsV105gGWL_UOKcmBbaF1ZQ3dA35Xn?usp=sharing "カプレカ数.ipynb")
Next.js(ver13~)でEditor.jsを使う際にでたエラー【ダイナミックインポートを学ぶ❶】

## エラー😭
```
⨯ node_modules/@editorjs/editorjs/dist/editorjs.umd.js (2:530) @ eval
⨯ ReferenceError: Element is not defined
 ```

 ## 原因
 Editor.jsのソースコードはブラウザでしか動作しない。しかしnext.js13のデフォルトはssrであり、サーバー側でEditor.jsのソースコードを実行してしまっていた。



 ## 解決方法

 ダイナミックインポートを利用してインポートの際に、「ssrしない」と記述する。下記を参照しました。
 
 https://nextjs-ja-translation-docs.vercel.app/docs/advanced-features/dynamic-import
 
 `editor.jsを通常importし、初期化を行う「Editor」コンポーネント（こちらは直接実行できない）`
 ```Editor.tsx
 //通常import
import EditorJS from "@editorjs/editorjs";
import ~

export default function Editor(){
    
    const initializeEditer = useCallback(async () => {
        const editor: EditorJS = new EditorJS({
            holder: "editor",
            placeholder: ~,
            inlineToolbar: ~,
            tools: ~,
            onChange: ~ ,
            data: JSON.parse(~),
        });
    }, []);
    
    //その他の処理
    
    return (
        <section>
            <div id="editor" className="mt-10 pb-10"></div>
        </section>
    )
    
}

 ``` 
 
 
  `EditorコンポーネントをダイナミックインポートするPost.tsx(こちらを実行する)`
  ```Post.tsx
  import dynamic from "next/dynamic";//nextjsの機能
const Editor = dynamic(
    () =>
        import(
            "~/Editor"//Editorコンポーネントのパス
        ),
    {
        ssr: false,
    },
);
export default function Post(){
    return (
        <div>
            <Editor/>
        </div>
        
    )
}
  ```
 
 
 ### ダイナミックインポートとは
 ダイナミックインポートはモジュールを動的にインポートすることです。例えば、特定の処理が実行されたらimportしてね、みたいなことができます。
 今回はインポートしているコンポーネントをssrしないように設定し、設定したコンポーネント（上記例の場合、Post.tsx）を実行することでエラーを解消しました。


 ## おまけ
 ダイナミックインポートの詳細↓


 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/import

 上記によると読み込み時にパフォーマンスを悪くしているコンポーネントに使用すると良い、といったことが書かれています。
 トグルやタブのようにユーザー操作がない時に画面描画されていないコンポーネントで、パフォーマンスを下げてしまっているものがあれば使っていくと良いかもしれないです👍

 また、使う時があれば記事にしたいと思います。
[C#] VS2022 で Windows Forms のツールボックスにユーザーコンポーネントが表示されない(グレーアウトされる)ときは Targeting Pack がない

# 確認した環境
* Visual Studio 2022 v17.11.0
* `net462` (.NET Framework 4.6.2)

# 現象
Windows Forms のデザイナー上で、ユーザーコンポーネントがツールボックスに表示されない。
ツールボックスの「すべてを表示」を有効にするとグレーアウトされた状態で表示される。

# 対応方法
VS2022の `ツール > ツールと機能を取得` から `個別のコンポーネント` の `.NET Framework 4.6.2 Targeting Pack` をチェックしてインストール

# おわり
VSのバグではありませんでした。
`net8.0`を`net462`に書き換えてコンパイル通ったからOKと思いきや、デザイナーはTargeting Packに依存しているようです。
Laravel 学習(コントローラ)

## コントローラ作成

Laravelプロジェクト直下で下記コマンドを実行すると、
基本コード付きのファイルが作成される。

``` cmd
php artisan make:controller HelloController
```

``` php:Laravelプロジェクト\app\Http\Controllers\HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

```

下記が名前空間
``` php
namespace App\Http\Controllers;
```

下記がインポート
``` php
use Illuminate\Http\Request;
```

## コントローラ割当

``` php:HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function index() {
        return <<< EOF
        <h1>Test</h1>
        <p>Hello</p>
        EOF;
    }
}
```

``` php:web.php
Route::get('/hello','App\Http\Controllers\HelloController@index');
// Route::get('/hello','HelloController@index');
```
web.phpで割り当てるコントローラのパスはおそらくルートパスによって変わる。
使用環境はxampp使ってルートパスを変更していない状態。

## ルートパラメータ使用

``` php:HelloController.php
    public function index1($name='name none', $age='age none') {
        return <<< EOF
        <h1>{$name}</h1>
        <p>{$age}</p>
        EOF;
    }
```

``` php:web.php
Route::get('/hello1/{name?}/{age?}','App\Http\Controllers\HelloController@index1');
```

## シングルアクションコントローラ

HelloControllerに__invoke()だけ存在するように変更し、ルーティングも変更。
``` php:HelloController.php
class HelloController extends Controller
{
    public function __invoke()
    {
        return <<< EOF
            <h1>Test</h1>
            <p>Hello</p>
        EOF;
    }
}

```

``` php:web.php
Route::get('/hello','App\Http\Controllers\HelloController');
```

## Request, Response

Request, Responseをindexに追加するだけでインスタンス生成される。(DI)

``` php:HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;

class HelloController extends Controller
{
  
   public function index(Request $request, Response $response) {

        $html = <<<EOF
        <h3>Request</h3>
        <pre>{$request}</pre>
        <h3>Response</h3>
        <pre>{$response}</pre>
        EOF;
       $response->setContent($html);
       return $response;
   }

}
```

``` php:web:php
Route::get('/hello','App\Http\Controllers\HelloController@index');
```





## 用語

https://qiita.com/_wow_/items/79246b8d8268708dafe7

## 参考

https://qiita.com/yukibe/items/7bab0d596ae9a0930f18

https://qiita.com/norichintnk/items/34a04cd17bfe4014313a

https://qiita.com/harunbu/items/7fdb824b120cbb2b3d61

https://qiita.com/shg3/items/353a9f802b1cdb87c258

https://qiita.com/tatsuya_1995/items/50028a559806c8cae21a
アプリが開けない

# 何故か開けない！？

こんな事で困ったことはありませんか？
無いなら無いに越したことはありません。
というか私は今までなかったので初めて知りました。

最近色々物騒なのでMicrosoftStoreにある場合はストアのアプリを入れるようにしています。
その為に起きた不幸とも言えます。

## 何故開けないのか？

Windowsのメニューからは起動できるのですが、コマンドラインやファイル名を指定して実行からは起動できないのです。
MicrosoftStoreからインストールしたものは、いじっていない場合は以下のパスにインストールされます
```
C:\Program Files\WindowsApps\xxx
```
で、何が問題かというと原因はWindowsAppsフォルダが特殊なフォルダでユーザーではアクセスできないことが原因のようです。


## では、どうすればよいのか？

結論から言えば、ストアアプリ起動用(UWPアプリ起動用)のコマンドを実行すれば良いようです。

- コマンドラインからの起動
    ```
    start shell:Appsfolder\パッケージファミリー名!アプリID    
    ```
    <div></div>
- ファイル名を指定して実行(windowsメニュー右クリックのあれ)
    ```
    shell:Appsfolder\パッケージファミリー名!アプリID
    ```
    <div></div>

つまり「パッケージファミリー名」 + ! + 「アプリID」でアプリを識別するので
パッケージファミリー名とアプリIDが分かれば起動できます。

で、パッケージファミリー名とアプリIDはどうやって知るんだよ？ってなりますよね。
これらを知るには、色々コマンドを打ったりしないといけなくて面倒なので準備しました。

はい、どーん。
```find_uwp.ps1

# パラメータの取得
param([string]$AppName)

# インストールされているパッケージの一覧を取得
foreach($app in get-AppxPackage) {
    # 指定のパッケージと一致するものを探す
    if ($app.Name -notlike "*$AppName*") {
        continue
    }
    # パッケージ情報からパッケージIDを取得
    foreach ($id in (Get-AppxPackageManifest $app).package.applications.application.id) {
        # 起動可能なコマンドを作成
        $command = "shell:Appsfolder\" + $app.packagefamilyname + "!" + $id
        echo $command
    }
}
```

<a href="https://raw.githubusercontent.com/chaftta/JumbledCodes/master/powershell/find_uwp.ps1">ソースはこちら</a>

## 使い方

```powershell
.\find_uwp.ps1 app_name
```
※もしかしたら、アプリIDをアプリと無関係の名前を付けているアプリがあると見つからないかもしれません。

私は、blenderを起動したかったので以下のコマンドになります。
```powershell
current/path> .\find_uwp.ps1 blender
shell:Appsfolder\BlenderFoundation.Blender_ppwjx1n5r4v9t!BLENDER
```

起動するコマンドが分かったので、外部プロセスにこれを指定して無事起動できるようになりました。
10秒でVPCなどのインフラ環境を簡単作成！

# はじめに

タイトルにもある通り、この記事ではVPCなどのインフラ環境を10秒で構築できる方法をご紹介します

# ではさっそく

![スクリーンショット 2024-08-14 10.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/e6bd98b4-a7ef-0017-7030-5f6e2f5d7b8b.png)

まずはコンソール画面からVPCを選択し、右上の`VPCを作成`をクリックしてください

![スクリーンショット 2024-08-14 20.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/4325590a-7170-f2d3-35aa-cbee33d46756.png)

**作成するリソース**

`VPCなど`を選択 ... VPCのみを選択すると、サブネットやルートテーブルなどを個別に設定しなければいけないため、ここでまとめて設定できるようVPCなどを選択してください

**名前タグの自動生成**

`プロジェクト(任意の名前)` ... いわゆる`Name`タグをここで決定します。ここではプロジェクトとしていますが、用途に合わせて決定してください。`project-dev-vpc`などとしてもいいかもしれません

**IPv4CIDRブロック**

`10.0.0.0/16` ... まず、Amazon VPCに割り当てるIPv4のCIDRブロックですが、AWSではRFC 1918 で定義されているプライベートIPアドレスの範囲を推奨しています。ネットワーク部・ホスト部ともにバランスがいい`10.0.0.0/16`を設定しておけば、まあ困ることはないと思います

**IPv6CIDRブロック**

`IPv6 CIDR ブロックなし` ... 後から追加もでき、IPアドレスの管理が複雑になるためここではなしとします

**テナンシー**

`デフォルト` ... 特に理由がない限りデフォルトで大丈夫です

**アベイラビリティゾーン(AZ)の数

`2` ... クラウドならではのマルチAZ機能を有効活用させるために、`2`以上を選ぶことをおすすめします。また、`AZのカスタマイズ`も場所を選択するだけですので、特に触らなくて大丈夫です

![スクリーンショット 2024-08-14 20.32.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3829908/b661f580-663d-04b5-2e69-08299096c054.png)

**パブリックサブネットの数**

`2` ... 各AZに1つずつ作成します

**プライベートサブネットの数**

`2` ... 各AZに1つずつ作成します

`サブネットCIDRブロックをカスタマイズ`も、デフォルトで均等にCIDRブロックを作成してくれるので、パブリックサブネットのみにめちゃくちゃインスタンスなどを設置するなどの理由がなければ触らなくて大丈夫です

**NAT ゲートウェイ($)**

`なし` ... パブリックサブネットにEC2などのサーバーインスタンスを作成するなら、なしで大丈夫です。プライベートサブネットにサーバーインスタンスを作成する予定なら`AZごとに1`をお勧めします

**VPCエンドポイント**

`なし` ... 画像では`S3ゲートウェイ`を選択していますが、`なし`で大丈夫です。後から追加することもできますので、プライベートサブネットにあるインスタンスが`S3`と通信するといった要件が確定したときに作成して問題ないです

**DNSオプション**

`DNSホスト名を有効化` `DNS解決を有効化` ... 外部と通信するWebサイトを構築するための環境を想定しているなら有効化にしておいてください(その他の要件でも無効化にするメリットがない)

**さいごに**

画面下部にある`VPCを作成`を押してください。
あっという間にVPCその他通信環境の完成です。

# 備考

今回は`BtoC`向けのWebサイトを作成することを意識してVPCを作成して行きましたが
どのような要件でも対応可能な設定内容で作成しました。

これを機会にぜひAWSでVPCを構築してみてください！
DbUnitのXMLに指定した値がテーブルに登録されない時は


DbUnitのFlatXmlDataSetBuilderに渡すXMLで1行目にカラム省略すると2行目設定できなくなる

も～どんな仕様なの。。。
何度も忘れて、何度も困って。。。

こちらの方が詳しく記載してくださっています。

https://qiita.com/opengl-8080/items/c92b6b687c9b5e277995#1%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E7%9B%AE%E3%81%ABnull%E5%80%A4%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E6%B3%A8%E6%84%8F


> 属性を省略した場合、そのカラムには null が設定される

> FlatXmlDataSet では、1行目のレコードが持つカラムでテーブルの定義が決まる
このため、1行目で value を省略して null にすると、 foo_table には id カラムしか存在しない扱いになり、残りのレコードでは value 属性が無視されてしまう

# 解決方法

https://javadoc.io/doc/org.dbunit/dbunit/2.7.0/org/dbunit/dataset/xml/FlatXmlDataSetBuilder.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3778585/cbc52561-e2aa-708e-3de6-1b12c85fa6c4.png)

こうするらしい。

```:setColumnSensing(true)に設定
        FlatXmlDataSetBuilder builder = new FlatXmlDataSetBuilder();
        builder.setColumnSensing(true); // true を設定
```
Python join()メソッドの便利な使い方：リストを文字列に変換するテクニック

## はじめに
みなさん、こんにちは。今回は、`join()`メソッドについて、私が最近学んだことを共有させていただきます。このメソッドを使うと、リストを簡単に文字列に変換できるんです。一緒に見ていきましょう。

## 1. join()メソッドの基本

まずは、`join()`メソッドの基本的な使い方から始めてみます。

```python
words = ['Hello', 'World', 'Python']
result = ' '.join(words)
print(result)  # 出力: Hello World Python
```

この例では、`join()`メソッドが文字列のリストを結合しています。

## 2. 数値リストを文字列に変換する方法

数値のリストを文字列に変換する方法を見つけたときは、正直驚きました。こんな方法があったんですね。

```python
numbers = [1, 2, 3, 4, 5]
result = ','.join(map(str, numbers))
print(result)  # 出力: 1,2,3,4,5
```

`map(str, numbers)`を使うことで、数値リストの各要素を文字列に変換し、それを`join()`で結合しています。

## 3. 異なる型の要素を含むリストの扱い方

文字列と数値が混在するリストも、同じように扱えることがわかりました。

```python
mixed_list = ['apple', 42, 'banana', 3.14]
result = ', '.join(map(str, mixed_list))
print(result)  # 出力: apple, 42, banana, 3.14
```

`map(str, ...)`を使うことで、どんな型の要素でも文字列に変換できるんですね。

## 4. パフォーマンスについて

`join()`メソッドは、文字列の連結において効率的だと聞いたことがあります。特に大きなリストを扱う場合、`+`演算子を使う方法よりも速いそうです。

```python
import time

# 大きなリストを生成
large_list = list(range(100000))

# あまり効率的ではない方法
def inefficient_method(lst):
    result = ''
    for item in lst:
        result += str(item) + ','
    return result[:-1]  # 最後のカンマを除去

# より効率的な方法
def efficient_method(lst):
    return ','.join(map(str, lst))

# 効率の悪い方法の実行時間を測定
start_time = time.time()
inefficient_result = inefficient_method(large_list)
inefficient_time = time.time() - start_time

# 効率の良い方法の実行時間を測定
start_time = time.time()
efficient_result = efficient_method(large_list)
efficient_time = time.time() - start_time

print(f"非効率な方法の実行時間: {inefficient_time:.4f} 秒")
print(f"効率的な方法の実行時間: {efficient_time:.4f} 秒")
print(f"効率的な方法は非効率な方法の約 {inefficient_time / efficient_time:.2f} 倍速い")

# 結果が同じであることを確認
print(f"結果が一致: {inefficient_result == efficient_result}")
```

## 5. 公式ドキュメントから学んだこと

Python公式ドキュメントを読んでみたところ、`join()`メソッドについて以下のようなことがわかりました：

1. `join()`は文字列メソッドです。`"".join(iterable)` のように使います。

2. `join()`の引数は、文字列のイテラブル（リストやタプルなど）である必要があります。

3. 空の文字列での`join()`は、イテラブルの要素を単に連結します：

   ```python
   ''.join(['a', 'b', 'c']) == 'abc'  # True
   ```

4. リスト内包表記と組み合わせて使うこともできるそうです：

   ```python
   result = '-'.join(str(n) for n in range(5))
   print(result)  # 出力: 0-1-2-3-4
   ```

5. イテラブルの要素が文字列でない場合、`TypeError`が発生するそうです。これが、数値リストを結合する際に`map(str, ...)`を使用する理由なんですね。

## 6. まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9279bd00-3719-e8ee-3f2a-0086c0834ece.png)


`join()`メソッドについて調べてみて、思った以上に便利な使い方があることがわかりました。数値リストや異なる型の要素を含むリストを文字列に変換できるなんて、面白いですよね。

この記事で紹介したテクニックを使えば、少し便利になるかもしれません。もし試してみる機会があれば、ぜひ使ってみてください。

みなさんも、普段使っているメソッドで「へぇ、こんな使い方があったんだ」と思ったことはありませんか？もしあれば、コメント欄で教えていただけると嬉しいです。一緒に学んでいけたら良いですね。

それでは、Happy coding!
Pythonのitertools.compressを用いた効率的なデータフィルタリング 

## はじめに

Pythonの標準ライブラリには、データ処理を効率的に行うための多くのツールが用意されています。その中でも、`itertools`モジュールの`compress`関数は、ブール値マスクを使用したデータフィルタリングにおいて非常に有用です。本記事では、`itertools.compress`の使用方法と、その実践的な応用例を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/73dab291-2d1a-95b5-ce42-cb12b5e166f0.png)

## itertools.compressの基本

`itertools.compress`は、データシーケンスとブール値のマスクを引数に取り、マスクが`True`の要素のみを選択して返すイテレータを生成します。この関数の基本的な構文は以下の通りです：

```python
itertools.compress(data, selectors)
```

- `data`: フィルタリングするデータのイテラブル
- `selectors`: 各データ要素に対応するブール値のイテラブル

## 基本的な使用例

以下に、`itertools.compress`の基本的な使用例を示します：

```python
from itertools import compress

data = ['A', 'B', 'C', 'D', 'E']
mask = [True, False, True, False, True]

filtered = list(compress(data, mask))
print(filtered)  # 出力: ['A', 'C', 'E']
```

この例では、マスクが`True`の位置にある要素のみが選択されています。

## 実践的な応用：成績データのフィルタリング

より実践的な例として、学生の成績データから合格者を抽出する場合を考えてみましょう。

```python
from itertools import compress

names = ['田中', '佐藤', '鈴木', '高橋', '渡辺']
scores = [75, 45, 80, 90, 55]

# 合格基準（60点以上）に基づいてマスクを生成
passing_mask = [score >= 60 for score in scores]

# compressを使用して合格者をフィルタリング
passing_students = list(compress(names, passing_mask))

print("合格者:", passing_students)
# 出力: 合格者: ['田中', '鈴木', '高橋']
```

この方法では、リスト内包表記でマスクを生成し、`compress`関数で効率的にフィルタリングを行っています。

## パフォーマンスの利点

`itertools.compress`は、大規模なデータセットを扱う際に特に有効です。以下の点で優れています：

1. メモリ効率：イテレータを返すため、大量のデータを扱う際にもメモリ使用量を抑えられます。
2. 処理速度：C言語で実装されているため、純粋なPythonによる実装と比べて高速です。
3. コードの簡潔さ：複雑な条件分岐を書かずに、簡潔にフィルタリングを表現できます。

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/46e648e8-a442-ab01-75ff-69a582f2adda.png)

`itertools.compress`は、Pythonにおけるデータフィルタリングの強力なツールです。特に大規模なデータセットや、複雑なフィルタリング条件を扱う際に、その真価を発揮します。

本記事で紹介した手法を活用することで、より効率的で読みやすいコードを書くことができるでしょう。ぜひ、次のプロジェクトで`itertools.compress`の使用を検討してみてください。

## 参考資料

- Python公式ドキュメント: [itertools — 効率的なループ実行のためのイテレータ生成関数](https://docs.python.org/ja/3/library/itertools.html#itertools.compress)
SQL*plus SELECT文まとめ

## 重複する値を除く
```
SELECT DISTINCT 列名
FROM 表名;
```

## 外部結合
emp表id列に一致するdpt表データが結合される
```
SELECT *
FROM emp e
LEFT JOIN dpt d
ON e.id=d.id;
```

## 集計関数の使用

・重複を含む数、NULLも含む
```
SELECT COUNT(*)
FROM 表名;
```

・重複含む、NULLは含まない
```
SELECT COUNT(列名)
FROM 表名;
```

・重複を除く数、NULLは含まない
（DISTINCT * はエラーになる）
```
SELECT COUNT(DISTINCT 列名)
FROM 表名;
```


## GROUP BYが必須の条件


#### ①集計列とそうでない列を同時に表示
集計列以外をGROUP BYに記述
```
SELECT dptno,job, MAX(sal)
FROM dpt
GROUP BY deptno,job;
```
#### ②集計関数のネスト（3つ以上はエラー）
集計関数をネストするとき、同時に他の列を指定できない
```
SELECT MAX(AVG(sal))
FROM dpt
GROUP BY id;
```

## ORDER BYのソート順
ASC（昇順）、DESC（降順）で指定
ORDER BYは列別名でも指定が可能

```
SELECT 列名1,列名2
FROM 表名
ORDER BY 列名1 ASC;
```

#### 列番号でも指定できる
この場合列名1は昇順、列名2のみ降順になる
・明示しないと昇順になり
・指定は直前の列のみに反映される
```
SELECT 列名1,列名2
FROM 表名
ORDER BY 列名1,列名2 DESC;
```
#### 昇順のとき
・数値：小→大
・文字列：小→大
・日付：古→新

・NULL：もっとも大きい値として扱われ、
　昇順のとき一番うしろになる
        
・NULLを先頭に指定：NULLS FIRST
・NULLを最後に指定：NULLS LAST

## 列別名の指定
漢字、ひらがな、カタカナ、アルファベット、＄_#は
"ダブルクォーテーションで囲まなくても指定できる

アルファベットはデフォルトで全て大文字になる
大文字小文字を区別するときは"Sal"のように囲む必要がある
MacをWindowsのディスプレイとして使う

# 概要
Macがとても高いので最近Windowsに乗り換えました。
その際せっかくならば使わなくなったMacをWindowsのディスプレイモニターとして使おうとした際の備忘録です。
本記事はすべて無料の範囲内で実行できます。

# 準備
#### Windows側の準備　(メインとして用いる方)
(1) [Deskreen](https://deskreen.com/lang-ja)のインストール

https://deskreen.com/lang-ja

Deskreenは画面を他のPCやスマホと共有できるソフトウェアです。画面を共有したい方にインストールする必要があります。ホームページからダウンロード画面にいき、Windows版をダウンロードします。


(2) 仮想ディスプレイを認識させる
Windows PCに仮想のディスプレイがあることを認識させます。その際、一番無難な方法としてはHDMIの仮想ディスプレイアダプタを用いることです。

500円程度でとても安く手に入れられますが、今すぐしたいという人向けにこちらを使わない方法で試してみます。方法としてはソフトウェアからWindows PCに仮想ディスプレイがあるよと認識させる方針です。

- virtual display driverとしてhttps://www.amyuni.com/downloads/usbmmidd_v2.zip をダウンロード
- 展開したフォルダを任意の場所に置く
- コマンドプロンプトを右クリックし、管理者として実行をクリック
- cdコマンドでusbmmidd_v2フォルダまで移動
- 管理者権限で以下を実行する
```bash:仮想ディスプレイのインストール
deviceinstaller64 install usbmmidd.inf usbmmidd
```
```bash:1つの仮想ディスプレイを有効にする
deviceinstaller64 enableidd 1
```
ここまで実行してから、設定 > システム > ディスプレイ　を開くと以下のように仮想ディスプレイが認識されています。

![仮想ディスプレイが認識されている様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861322/7b321369-57f6-f08f-450c-4c6d4c98114a.png)

この仮想ディスプレイをMac側にDeskreenで共有することで、Macをディスプレイとして使うことができます。

※　仮想ディスプレイを無効にしたり、アンインストールしたい場合は以下のコマンドを実行
```bash:仮想ディスプレイを無効にする
deviceinstaller64 enableidd 0
```
```bash:仮想ディスプレイのアンインストール
deviceinstaller64 stop usbmmidd
deviceinstaller64 remove usbmmid
```



#### Mac側の準備
ダウンロードしなければいけないものはありません。ブラウザからすぐにサブモニターとして使うことができます。


## 手順
:::note warn
注意
MacとWindowsは同じネットワークに接続しておいてください。
:::
(1) WindowsでDeskreenを起動

起動すると以下のようにローカルアドレスが書いてある。

![スクリーンショット 2024-08-14 200812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861322/36c09c57-0aaa-159a-b703-754689609460.png)


(2) Macでブラウザを立ち上げ、ローカルアドレスを打ち込む

Macのブラウザからさきほどのローカルアドレスを入力し、開く。するとMac側はDeskreen Viewerが立ち上がり、Windows側にAllowボタンが現れるのでそれをクリックし、共有を許可する。

(3) WindowsのDeskreenから仮想ディスプレイの共有を選択

どの画面を共有するか選択できるので、Entier Screenから仮想ディスプレイを選択し、共有を開始する。

![スクリーンショット 2024-08-14 201802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3861322/e51ff496-049d-6f11-c2f3-bbcfe2638cd6.png)

これでMacをあたかもデュアルディスプレイであるかのように使うことができます！

## まとめ
ディスプレイは何かと便利なので買った方がいいと思いつつ、せっかくなら要らないPCをモニター替わりにしてしまおうという気持ちから手を出しました。意外と手間がかかりましたが、とても便利なので気になる方がいればぜひ試してみてください。


## 参考文献
https://www.monoist.work/entry/sub-display-to-mac-from-windows

https://qiita.com/fna/items/064637383666eec266d2

https://www.amyuni.com/forum/viewtopic.php?t=3030
IPv4のクラスの覚え方を自分なりに考える

[以前](https://qiita.com/okei_kom/items/8a5004b444937f93b4b2)、サブネットマスクを理解したつもりだが、この前の情報技術者試験でクラスに関する問題が出てきたので学びなおすことにする。
偉そうに「学びなおす」と書いたが実のところ全く覚えられていない。

# クラスの種類

| 種類 | 特徴 | ネットワーク部 | ホスト部 | 参加可能なホスト数 |
|:-:|:-:|:-:|:-:|:-:|
| クラスA | 先頭が0 | 先頭から8ビット | 残りの24ビット | 最大約1677万 |
| クラスB | 先頭が10 | 先頭から16ビット | 残りの16ビット | 最大約65000 |
| クラスC | 先頭が110 | 先頭から24ビット | 残りの8ビット | 最大約250 |
| クラスD | 先頭が1110 | 先頭から32ビット | なし | なし |

クラスDはマルチキャスト通信で使うらしい。

というのをわかったうえで、令和6年春の応用情報技術者試験の問題を見てみる。

# 実際出た問題

> 問31
> IPアドレス208.77.188.166は、どのアドレスに該当するか。
> ア　グローバルアドレス
> イ　プライベートアドレス
> ウ　ブロードキャストアドレス
> エ　マルチキャストアドレス

…

…(ﾟДﾟ)ﾊｧ?

これ見ただけで分かるやつ、オタクやん。

と、思っていた時期がありました。

問題として出るんだから、このくらい解けるでしょと言うことなんだろう。
（個人の感想です。）

# どうやったら覚えられそうかを考える

そこで考えた。

0,10,110,1110...と考えるのではなく、十進数で覚えとけばいいんじゃないかと。

クラスAの場合、
先頭8ビットが00000000～01111111。
十進数にすると、0～127。

クラスBの場合、
先頭8ビットが10000000〜10111111。
十進数にすると、128〜191。

クラスCの場合、
先頭8ビットが11000000〜11011111。
十進数にすると、192〜223。

クラスDの場合、
先頭8ビットが11100000〜11101111。
十進数にすると、224〜239。

そうなると、208はクラスC。

> エ　マルチキャストアドレス

これはクラスDのことだから明らかに違う。

> ウ　ブロードキャストアドレス

ブロードキャストは、ホスト部がオール1なるもの。
クラスCの場合は、ホスト部の8桁がオール1＝255となるはずだから、ウも違う。

> ア　グローバルアドレス
> イ　プライベートアドレス

問題はこのふたつ。

# グローバルアドレスとプライベートアドレス

> イ　プライベートアドレス

家庭内、会社内だけで使われるアドレス。
インターネットは参照できない。

> ア　グローバルアドレス

プライベートIPアドレスがこれに変換されてインターネットを参照する。
変換される仕組みがNATとかNAPT。

概念はわかる。

で、具体的にどのIPアドレスがプライベートでグローバルなのか。

これも決まっているんだと。

|クラス|プライベートアドレスの範囲|
|:-:|:-:|
|クラスA|10.0.0.0～10.255.255.255|
|クラスB|172.16.0.0～172.31.255.255|
|クラスC|192.168.0.0～192.168.255.255|

問題文のIPアドレスが「208.77.188.166」だから、プライベートアドレスの範囲外ということになる。
よって、答えは「ア」の「グローバルアドレス」ということ。

多少は理屈込みで分かった気がする。気が、する。
問題はこれを本番で思い出せるか。

# さらなる独り言

そういえばこういった数字の羅列は仕事で見かけたことがある。
クラスBだけなんだか中途半端に見えるが、2進数にしたらわかるだろう。
力が湧いたときに更新します。たぶん。

身近にはあまりいないけど、同志、いたら、頑張ろう。

# 本日の参考動画
https://youtu.be/gFN-m0CphB8?si=UChyGy1nleaUIyr0

https://youtu.be/YAytF5zMHCU?si=EINpNn0Nl34IlR4B
4-1-1. どのようなものを作るか

# 1.今回やること

・今までやってきたことをふまえて、ちょっとしたアプリを作成していきます。
・最近stable deffusion等を使用して画像を生成していますが、結構な割合で使えない画像やおかしい画像を生成してくれます。それらの画像を見ながら削除できる画像ビューワーを作成していきます。

# 2.今回の仕様
・目次にあるように当たり前ですがWindows App SDK（WinUI3）で作成します。
・それでは以下のような仕様で作成していきます。

①インストールしなくても、起動できるようにする。

②メニューから「File→Exit」でアプリを終了するか聞いてくるダイアログを表示する。
![2-2 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/19e4db7e-3706-97cf-56e9-f3ac9c7c118b.png)

③メニューから「File→Open」でフォルダーピッカーを表示し、画像を保存しているフォルダを選べるようにする。
![2-3-1 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/f4095482-e441-5243-58af-d0f034b3eed5.png)

④フォルダーピッカーで選んだフォルダにある画像のサムネイルを表示する。
![2-4 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/f9d07d56-5a13-cde7-faec-539a2a31445f.png)

⑤十字キーで選んだサムネイルで「Enter」キーを押す、もしくはサムネイルをクリックすると新しいウインドウを開き画像を表示する。
![2-5 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/d9664a8a-0cd4-e65b-77f5-144f5468dc60.png)

⑥新しいウインドウで「→」キーを押すと次の画像を表示、「←」キーを押すと前の画像を表示。

⑦新しいウインドウで「Delete」キーを押すと画像を削除し、前の画像に戻る。
![2-6 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131051/7ded01a2-f32f-8f6c-8ceb-d22c3cacf475.png)


こんな感じで作成していきます。

[次へ](https://qiita.com/lilac0011/items/4e3e30bc78db7dd19b6f)

[目次へ](https://qiita.com/lilac0011/items/f53f7401ea7da31e3a0b)
読みやすいコードを書くためのガイド - 名前に情報を詰め込む

## はじめに

最近リーダブルコード（The Art of Readable Code）を読んでいて、コードの可読性を向上するポイント、または他の開発者に優しいコードの書き方をたくさん勉強になりました。

この記事は、本の内容をしっかり頭に入れて、お浚いする為の読書ノートです。

## 名前に情報を詰め込む
第一章と第二章により、変数と関数の名前を読むだけで多くの情報を引き出すことができます。

### 1.  具体的な言葉を使う

Getの代わりに、文脈に応じてFetchやDownloadのような言葉を使うと良いです。

```javascript
// 良い例
fetchData()
downloadFile()

// 悪い例
getData()
getFile()
```

他の代替の言葉：
| Word  | Alternatives                                         |
|-------|------------------------------------------------------|
| send  | deliver, dispatch, announce, distribute, route       |
| find  | search, extract, locate, recover                     |
| start | launch, create, begin, open                          |
| make  | create, set up, build, generate, compose, add, new   |

### 2. 一般的な名前を避ける

特別な理由がない限り、tmpやretvalのような一般的な名前は避けましょう。
```javascript
// 良い例
temporaryFile()
resultValue()

// 悪い例
tmp
retval
```

### 3. 具体的な名前を使う

ServerCanStart()のような曖昧な名前よりも、CanListenOnPort()のように詳細を記述する名前を使いましょう。
```javascript
// 良い例
canListenOnPort()

// 悪い例
serverCanStart()
```

### 4. 重要な情報を変数名に付ける

ミリ秒単位の変数には_msを付けたり、未処理の変数にはraw_を付けたりして、重要な詳細を変数名に含めましょう。
```javascript
// 良い例
responseTime_ms
raw_inputData

// 悪い例
responseTime
inputData
```
| Function parameter                       | Renaming parameter to encode units |
|------------------------------------------|------------------------------------|
| `Start(int delay)`                       | `delay` → `delay_secs`             |
| `CreateCache(int size)`                  | `size` → `size_mb`                 |
| `ThrottleDownload(float limit)`          | `limit` → `max_kbps`               |
| `Rotate(float angle)`                    | `angle` → `degrees_cw`             |

### 5. 大きなスコープには長い名前を使う

複数画面に渡る変数には、一文字や二文字の短縮名ではなく、より長い名前を使いましょう。行数少ない場合だけに変数は短い名前が適しています。
```javascript
// 良い例
totalUserCount

// 悪い例
tuc
```

### 6. 暗黙的な命名ルールを従う、意味のある大文字やアンダースコアを使う

例えば、ほとんどのclass名には``PascalCase``を使用し、関数名は``camelCase``、変数名には``snake_case``を使用します。

クラスメンバーを区別するためにunderscore( _ )を付けるなど、意味のある方法で大文字やunderscoreを使用しましょう。
```javascript
// 良い例
class User {
    constructor(name) {
        this.name_ = name; // クラスメンバーには　_　を付ける
    }
}

function processUser(userName) {
    const user = new User(userName);
    console.log(user.name_);
}
```
もう一点として、IDでは単語をunderscore( _ )で区切り、classでは単語をdash( - )``（kebab-case）``で区切る方法があります：
```html
<div id="middle_column" class="main-content"> 
```

これを使用するかどうかは、チームのコード規約次第です。しかし、一貫性を持たせることが重要です。

## まとめ
これらのアドバイスを実践することで、より読みやすく、保守しやすいコードを作成できるようになります。デバッグにも楽ですよ！
新星現る？AppFlowyがオープンソースで新たな選択肢を提供


AppFlowyは、情報管理やプロジェクト管理において、Notionに代わる強力なオープンソースの代替手段として登場しました。そのオープンソースの性質により、ユーザーはデータの完全なコントロールを保持できるだけでなく、セルフホストが可能で、柔軟なカスタマイズが可能です。さらに、急速に成長するコミュニティが支えるこのプロジェクトは、プライバシーと柔軟性を重視するユーザーにとって注目すべき選択肢だと思います。

2021年11月に初期リリースされ、現在はスター数51.2K/コントリビューター319人と勢いのあるオープンソースプロジェクト。多くの開発者やユーザーがこのプロジェクトに関心を持ち、将来的に成長すると見込んでいると思います。

:::note info
**Notionとの主な違い**
- ライセンス: Notionは商用(無償版もあり)、AppFlowyはオープンソース
- データホスティング: Notionはクラウドベース、AppFlowyはセルフホスト型
- 機能: Notionはより多機能で、AppFlowyはまだ基本機能に焦点を当てていますが、コミュニティ主導で拡張されている
:::

https://github.com/AppFlowy-IO/AppFlowy


# 前提
Docker： 23.0.1, build a5ee5b1
docker-compose： 1.28.2, build 67630359
AppFlowy: 0.6.7

# 1. AppFlowyインストール
githubからソースをクローンします。
```bash
git clone https://github.com/AppFlowy-IO/AppFlowy.git
cd AppFlowy
```

ディレクトリを移動してbuildして起動します。build/upは一般ユーザで実行する必要があります。一般ユーザをdockerグループに追加しておきましょう。
```bash
# もし追加していない場合はrootユーザで以下を実行
# usermod -aG docker [username]

cd ./frontend/scripts/docker-buildfiles
docker-compose build --build-arg uid=$(id -u) --build-arg gid=$(id -g)
docker-compose up
```

これでうまくいくのかと思いきやErrorがでております。
```abl
WARNING: The DISPLAY variable is not set. Defaulting to a blank string.
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Recreating docker-buildfiles_app_1 ... done
Attaching to docker-buildfiles_app_1
app_1  | ./AppFlowy: error while loading shared libraries: libnotify.so.4: cannot open shared object file: No such file or directory
docker-buildfiles_app_1 exited with code 127
```

なにやら、複数人から同事象の報告が複数・・・・

https://github.com/AppFlowy-IO/AppFlowy/issues/4349

まだこの件についてはどなたも割り当てられていないようなので、取り急ぎWindows版をインストールして試してみました。exeを叩けば普通にインストールされます。※今回は時間の都合上、Linuxノードでアプリテストまでできませんでしたが、問題解消させていずれ記事に上げたいと思います。

# 2. AppFlowyへアクセス
デスクトップのショートカットをダブルクックして、起動させます。Githubと連携させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/170386d9-f5c4-3ffe-9c5b-9399a161cf2e.png)

「Authorize AppFlowy-IO」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/b43f00cd-8a19-e5e4-0ea1-6da03d471d96.png)

ようやくアプリ画面を拝めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/847f98cd-a6e1-15c6-1aa4-f344e63a0783.png)

以下、カンレンダーを追加した画面です。その他、書類・ボード・グリッド・AI Chatなど使えるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/cfcc7385-a273-9c82-4501-2e674fd6dbc9.png)

# 3. その他
手っ取り早く試したい方はWindowsに入れて機能の違いなど比べてみるとよいかと思います。※マニュアルがあまり充実してなさそうなので、使い方は触りながら慣れるしかないのが少しつらいです。
Tailwind CSSとBootstrapについて

# はじめに
私は初めてのアプリ作成課題において特段疑問を持たずにTailwindを使用することを選択しましたが、改めてもう一つの選択肢とてあげられていたBootstrapも一緒に記事にしてみようかと思います。

# **Tailwind CSS**
**特徴**:
- ユーティリティファーストのCSSフレームワーク。クラスを組み合わせてデザインを構築するスタイル
- カスタマイズ性が高く、デフォルトのスタイルに縛られないため、独自のデザインがしやすいナ

**メリット**:
- 再利用性が高く、クラスを組み合わせるだけで自由なデザインが可能
- 開発スピードが速く、CSSのカスタムを書く必要が少なくなる

**デメリット**:
- クラス名が長くなりがちで、HTMLが煩雑になることがある
- 初心者にはユーティリティクラスの使い方を覚えるのが難しいかもしれない

**簡単な使用例**:
```
<div class="bg-blue-500 text-white p-4 rounded">
  Hello, Tailwind!
</div>
```


# **Bootstrap**

**特徴**:
- コンポーネントベースのCSSフレームワーク。事前に用意されたスタイルやコンポーネントが豊富
- モバイルファーストでレスポンシブデザインが簡単に実現できる

**メリット**:
- 用意されたコンポーネントを使うことで、すぐにスタイリングができるため、学習コストが低い
- 大規模なプロジェクトでも使いやすく、コミュニティも大きい

**デメリット**:
- カスタマイズが難しく、Bootstrapのデザインに依存しがちになることがあるぞ
- CSSのファイルサイズが大きくなることがある

**簡単な使用例**:
```
<button class="btn btn-primary">Hello, Bootstrap!</button>
```


## **Bootstrapが適している場面**
- **迅速なプロトタイピング**: 事前に用意されたコンポーネントが多いから、すぐにスタイリングしたいときには最適
- **大規模な企業サイトやアプリケーション**: 一貫したデザインとレスポンシブ機能が求められる場面で、Bootstrapは強力な選択肢


## **Tailwind CSSが適している場面**
- **デザインの自由度が必要なプロジェクト**: 特定のデザイン要件がある場合、Tailwindのユーティリティクラスを使うことで細かい調整がしやすい
- **カスタマイズ性が重視される場合**: Tailwindはデフォルトのスタイルに縛られず、独自のデザインを作成することが容易


## **その他のよく使用されるCSSフレームワーク**
- **Bulma**: フレキシブルで軽量なCSSフレームワーク。シンプルで使いやすく、クラス名も直感的
- **Foundation**: より高機能なフレームワークで、大規模なアプリケーションに適している

# おわりに
TailwindとBootstrapはそれぞれ異なるアプローチを持っているから、自分のプロジェクトのニーズに合わせて選ぶといいそうですが、まだまだ選択できるレベルまで到達していない私にはむずかしい。
3年後くらいにはどんなことでもぱっと選択できるようなエンジニアを目指す！！
macでkeytoolを実行したがandroid studioのjavaを参照してくれない

デバッグ用のフィンガープリントを作成しようと

```
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
```

とすると
```
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```
というエラーが発生してしまいました。<br><br>

https://zenn.dev/sd7jp/articles/763c84e398c6c7

こちらを参考にシンボリックファイルを作成してあげれば通常通りkeytoolで実行できるようですが、手っ取り早くkeytoolのフルパスを指定して実行してあげました。<br><br>

```
/Applications/Android\ Studio.app/Contents/jbr/Contents/Home/bin/keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
```
ちなkeystoreのデフォルトのパスワードは「android」らしい

https://zenn.dev/heyhey1028/scraps/38610e27c01253
解いてみた。「Bランク：名刺バインダー管理」

# 問題
[「Bランク：名刺バインダー管理」](https://paiza.jp/works/mondai/b_rank_skillcheck_archive/name_card)

# コード
Javaで解いてみました。

``` Java
import java.util.*;


public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nN = sc.nextInt();
        int nM = sc.nextInt();
        
        // nM 番目の名刺が何枚目のファイルにあるか？
        int nK = (nM + (2 * nN - 1)) / (2 * nN);
        
        // nK 枚目のファイルの名刺番号の表、裏を足すと
        // 一定の値になることから。
        // mK番目のファイルにある、1枚目と2n枚目の
        // 番号を足す。
        int nS // = (2 * nN * (nK - 1) + 1) + (2 * nN * nK)
                = 4 * nN * nK - 2 * nN + 1;
        
        // nM番目の名刺の裏にある名刺番号を求める。
        int nR = nS - nM;
        
        System.out.println(nR);
    }
}

```

# 解説
## 標準入力からの数値の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値を取得しています。
+ ファイルの1面に入る名刺の数：$n$
+ 求める名刺番号の表側の番号：$m$

## m 番目の名刺が、何ファイル目に格納されているかを求める。
求める値$k$は、$m$ を$2n$ で割、余りがあったら切り上げます。
つまり、$m$ に $2n-1$ を足して、$２n$で整数除算すれば良いので、
``` math
k = \frac{m + (2n - 1)}{2n} 　（整数除算）
```
となります。

## k ファイル目の名刺番号（表と裏）の法則
$k$ ファイル目の名刺番号について、表と裏（あるいは、裏と表）を足すと一定の値になっていることに気づきます。
+ $k$ ファイル目の$1$番目の名刺番号：$2n(k - 1) + 1$
+ $k$ ファイル目の$2n$番目の名刺番号：$2nk$

つまり、$k$ ファイル目の表と裏の名刺番号を足した値$s$は、
``` math
s = (2n(k - 1) + 1) + 2nk = 4nk - 2n + 1
```

## 求める名刺番号
$s$ から $m$ を引けば、$m$の裏の名刺の番号になる。
$$ r = s - m $$
Godotで会話ウィンドウを自作する知見まとめ(Godot+C#)

# 成果物
こういう感じのウィンドウ。
キーワードを設定しておけばそれに下線が引かれ、マウスオーバーすると解説用ウィンドウが追加で出る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422353/d2b80d17-6aae-76bb-da4e-9d997902f566.png)
ほかにもいろいろ機能を載せたのだが、万人に役立ちそうにないところなので割愛する。
ここではGodot+C#で会話ウィンドウを作るうえで万人に共通するであろう知見を主に解説する。
（だって調べても日本語情報ほとんど出てこないんだもん、特にC#つかってると）

# シーン構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422353/f44556f7-9a89-4bab-ca30-21e3a058f7a9.png)

# PanelContainer
背景をつけて内部にControllerを持てる。
Panel+Containerという感じだ。
見た目はThemeの編集によってそれっぽくいじれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422353/810df36f-22d2-6741-a7c6-2756d03f0d48.png)

# RichTextLabelのBBCode
結構多機能。BBCodeEnabledを有効にするとタグを使って書ける。
<XML>と違ってタグの囲いが[BBCode]なだけで、ほぼXMLだ。
普通のタグについては調べたら何ができるか十分わかるので、ここでは[url]について書く。
```csharp
Text = "[url]テスト用テキスト[/url]";
```
たとえばこのように書いてやるとurlタグとして成立する……のだがurlとしての機能はない。
BBCodeの元ネタに準拠しているだけのようで、このタグは本質的にはクリックイベント機能を持たせるためのより汎用性のあるタグである。
https://docs.godotengine.org/ja/3.x/classes/class_richtextlabel.html#class-richtextlabel-signal-meta-clicked
公式ドキュメントではurlと書いたタグはmetaタグと呼ばれているようだ。
さて、このタグで囲まれた部分の文字列は特殊な扱いを受ける。
- 下線が引かれる（オプションで消せる）
- マウスオーバーするとカーソルが指になる
- マウスオーバーとクリックのシグナルが走る

お察しの通り、一番最後のやつを利用して独自のマウスオーバーイベントを作れる。

ちなみに、hintタグは該当部分にマウスオーバーしていたら好きな文字列をツールチップ表示できるというものだが、
- マウスオーバーしたあとしばらく静止しないといけない
- ツールチップが表示されたあと、マウスを動かしてもそのツールチップは動かない

といった具合で、大問題というほどではないが使い勝手が悪い。
そのうえカスタマイズがおそらくできない。
デバッグ機能ならともかく、ゲームに入れる機能としては使えないだろう。

▼しかもhintはなんか見づらい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422353/37d511d5-b11d-d082-0d82-fe3cacfea974.png)

# BBCodeイベントの受け取り方
GodotのRichTextLabelを継承してイベントハンドラに関数を渡すだけである。
ここでのイベントハンドラはGDScriptでいうところのSignalである。
Godot+C#を触るからにはこの脳内変換ができるようになっとかないとな！
```csharp
public partial class RichTextLabelCustomed : RichTextLabel
{
    [Export] Tooltip Tooltip;

    public override void _Ready()
    {
        // マウスオーバー時のイベント登録
        MetaHoverStarted += OnMetaHoverStarted;
        MetaHoverEnded += OnMetaHoverEnded;
    }

    void OnMetaHoverStarted(Variant meta)
    {
        Tooltip.Text = meta.ToString();
        Tooltip.Visible = true;
        GD.Print($"OnMetaHoverStarted: {meta}");
    }

    void OnMetaHoverEnded(Variant meta)
    {
        Tooltip.Visible = false;
        GD.Print($"OnMetaHoverEnded: {meta}");
    }
}
```

イベントの引数はVariant。こういうユニオン型みたいなやつを見るとかなり抵抗を感じるが、urlタグでオプション文字列を指定しない限りはurlに囲まれた部分が文字列としてやってくると考えてよい。

# マウスオーバー判定で詰まったところ
さて、meta(url)タグを使ってツールチップをマウス付近に置くことにした。
するとアラ不思議、マウスを左上に動かしているときだけマウスオーバーイベントが発生し、しかも出たり入ったりの振動をマウスが動いている間だけしている……

真相は単純で、このツールチップがマウスの判定を奪っているだけだった。
ツールチップのマウス奪い判定をすべてIgnoreにすると解決した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422353/9ef0a014-4207-047b-bdc0-754eb2f2f2f9.png)

# 感想とか
RichTextLabelが思いの外万能！
ここでは紹介していないがモダンな2Dゲームで見るようなwavyなテキストもこれで賄えるらしい。
urlタグではイベントが受け取れて結構なんでもできる。
マウスオーバーとクリックだけなので、ボタンほど融通は効かないがメッセージ内でそんな凝ったことはさせないだろうから今はこれで十分だ。
ドキュメントが足りていないことだけ恨めしいが、それ以外直感に反したこととかはやってこないので、うれし～～～って言いながらコーディングできた。
アプリ開発を通して失敗して学んでいこう(学習アプリつくりました)

# Firebase×Supabase×Reactのアプリを作成しました

エンジニア歴2年、Reactは初学者の私が、FirebaseとSupabaseを組み合わせて学習管理アプリを作成しました。

## アプリの概要
今回作成したアプリは学習管理アプリです。学習タイトルと学習時間を入力すると合計値がでるものです。
主な機能
・学習項目の追加・編集・削除（Supabase）
・アプリケーションの公開(Firebase)
・CI(Github Actions)
![2024-08-140.12.38-ezgif.com-video-to-gif-converter.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810842/75878060-2f9d-92fb-86f6-687b63ba3acd.gif)

## エンジニア歴が浅いうちはとにかく何かつくろう
今回のアプリ作成を通じて感じたのは、何かをつくることで得られるものの多さです。
業務では日々コードを書いて何かを生み出していますが、いざ0から何かを作ろうとすると、リポジトリの切り方やSupabaseのAPIキーの取得・参照、環境変数の管理方法など、様々な課題に直面します。

Reactを学ぶ目的で今回のアプリを作成しましたが、これを通して多くの副次的な知識を得ることができました。
業務で全てが役立つわけではありませんが、環境変数を持つ際の注意点や、1つのリポジトリに複数のアプリを含めるとCIが煩雑になることなど、抽象度を上げれば他でも役立ちそうな学びが多くありました。

そして何より役に立ったのが、***失敗する体験***です。
業務ではサポートや期限があるため、失敗する前に誰かに聞いて正しい実装をすることが多いのではないでしょうか。
個人開発では、何もわからないまま失敗することがよくあります。今回は、1つのリポジトリ内に複数のアプリケーションを作った結果、CIの設定が難しくなったり、CSSでスタイルに名前を付けなかったせいで、画面のテストが非常にやりにくくなりました。

業務では既にうまく構築された環境で、無意識に安全な手法を模倣して実装していたことに気付きました。失敗から学ぶことは非常に多いと実感しました。

## 最後に
簡単なアプリではありますが、データベースの操作、アプリの公開、テスト、CIなど、幅広く手をつけました。
業務とは異なり、1人でやるからこそ失敗しやすく、その分学びも大きかったです。

みなさんもアプリ開発を通じて、大いに失敗しながら学んでいきましょう。

## JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
https://projisou.jp/
SQL*Plus 表の作成まとめ

## 表の作成
```
CREATE TABLE ［スキーマ名.］テーブル名(
    列名 データ型 [制約],
    列名 データ型 [制約］
);
```

デフォルト値を設定するときはNOT NULLの前に記述
```
CREATE TABLE emp (
     id        VARCHAR2(5) PRIMARI KEY
    ,name       VARCHAR2(20) NOT NULL
    ,birthday   DATE DEFAULT SYSDATE NOT NULL 
);
```

複合主キーの設定
```
CREATE TABLE emp (
     id         VARCHAR2(5)   
    ,no         VARCHAR2(5)   
    ,name       VARCHAR2(20) 
    ,birthday   DATE
    ,CONSTRAINT emp_pk PRIMARY KEY (no,id)
);
```


## 表のコピー
emp表をコピーしてemp2表を作成

・行も合わせてコピーされる
・列名を新しく指定できる
 （列数は同じである必要がある）
 
・制約はNOT NULLのみコピーされる
 （明示的につけられたNOT NULLのみコピーされ、
　PKの暗黙的なNOT NULLはコピーされない点に注意）
```
CREATE TABLE emp2
AS SELECT * 
FROM emp;
```

表の定義のみコピー、行はコピーされない
（1=0常に真ということ）
 ```
CREATE TABLE emp2
AS SELECT * 
FROM emp
WHERE 1=0;
```


## 作成した表の構造確認
各列の名前、NULLの可否、データ型が表示される
```
DESCRIBE 表名;
```

## 値の挿入
表の列数と同じ数値を挿入する場合は列名を省略できる
（データ型が異なると挿入できないため、値は列順と同じにする必要がある）
```
INSERT INTO テーブル名(
列名1,列名2,列名3)
VALUES(
値1,値2,値3);
```
```
INSERT INTO テーブル名
VALUES(
値1,値2,値3);
```