OmniAICreator/Qiita-1.07M huggingface dataset:
robloxでassistant その151

# 概要
robloxでassistantやってみた。
練習問題、やってみた。

# 練習問題

ContentProviderを使え。


# サンプルコード

```
local ContentProvider = game:GetService("ContentProvider")
local sound = Instance.new("Sound")
sound.SoundId = "rbxassetid://9120386436"
local decal = Instance.new("Decal")
decal.Texture = "rbxassetid://5447528495"
local assets = {
	decal,
	sound,
}
local callback = function(assetId, assetFetchStatus)
  	print("PreloadAsync() resolved asset ID:", assetId)
  	print("PreloadAsync() final AssetFetchStatus:", assetFetchStatus)
end
local startTime = os.clock()
ContentProvider:PreloadAsync(assets, callback)
local deltaTime = os.clock() - startTime
print(("Preloading complete, took %.2f seconds"):format(deltaTime))


```

# 実行結果

```
  11:29:03.693  Hello world!  -  サーバー
  11:29:05.331  PreloadAsync() resolved asset ID: rbxassetid://9120386436  -  クライアント - LocalScript:13
  11:29:05.331  PreloadAsync() final AssetFetchStatus: Enum.AssetFetchStatus.Success  -  クライアント - LocalScript:14
  11:29:05.937  Hello world!  -  クライアント
  11:29:06.819  PreloadAsync() resolved asset ID: rbxassetid://5447528495  -  クライアント - LocalScript:13
  11:29:06.819  PreloadAsync() final AssetFetchStatus: Enum.AssetFetchStatus.Success  -  クライアント - LocalScript:14
  11:29:07.322  Preloading complete, took 2.46 seconds  -  クライアント - LocalScript:19

```

以上。
INFORMATION_SCHEMAで複数テーブルの行数をまとめてCOUNTできる？

業務上で「複数テーブルの行数を調べたい」という場面があり、MySQLの`information_schema`にかるーく触れる機会があり、初めて知ったことが多かったので軽くまとめ

# 複数テーブルの行数をまとめて出せる？

1つのDB内の複数テーブルの行数を調べたいということがあった。
ただテーブルひとつずつに`count`をしていくのも非常に面倒。。。
なので`infomation_schema`を使用して出してみた

※使用しているのはMySQLのサンプルDBであるSalkilaDBです。

- どうやらinfomation_schemaには行数カウントできる`TABLE_ROWS`というものがあるらしい👀
- `TABLE_SCHEMA`はDB名なので、これでDBを指定できる
- `TABLE_NAME`はテーブル名なので、これでテーブルを指定できる（複数可）

→なんだかいけそうなのでとりま試してみよう
```sql
mysql> SELECT TABLE_NAME, TABLE_ROWS 
       FROM INFORMATION_SCHEMA.TABLES  
       WHERE TABLE_SCHEMA = 'sakila' 
         AND TABLE_NAME IN ('rental', 'payment', 'film');
+------------+------------+
| TABLE_NAME | TABLE_ROWS |
+------------+------------+
| film       |       1000 |
| payment    |          0 |
| rental     |          0 |
+------------+------------+
3 rows in set (0.02 sec)
```

あれ、、どのテーブルもレコードは入っているはずなのに**paymentとrentalが0行**だ。。。
一応各テーブルの行数を見てみた

```sql
mysql> select count(*) from film;
+----------+
| count(*) |
+----------+
|     1000 |
+----------+
1 row in set (0.01 sec)

mysql> select count(*) from payment;
+----------+
| count(*) |
+----------+
|    16044 |
+----------+
1 row in set (0.02 sec)

mysql> select count(*) from rental;
+----------+
| count(*) |
+----------+
|    16044 |
+----------+
1 row in set (0.05 sec)

```

filmテーブルの行数は合っているようだが、paymentとrentalテーブルのレコードは入っているようだ👀


## `TABLE_ROWS`は「概算」しか出さない

- 公式リファレンスの`TABLE_ROWS`にちゃんとそれっぽい理由が書いてあった
    - [MySQL :: MySQL 8.0 リファレンスマニュアル :: 26.38 INFORMATION_SCHEMA TABLES テーブル](https://dev.mysql.com/doc/refman/8.0/ja/information-schema-tables-table.html)
> InnoDB などのほかのストレージエンジンの場合、この値は概算であり、実際の値と 40% から 50% まで異なる可能性があります。 このような場合、正確な数を取得するには SELECT COUNT(*) を使用します。

- 正直`1000`しか入っていないfilmが1000で、それより多く入っているテーブル2つが`0`というのがかなり不可解だが、何にしても **`TABLE_ROWS`で出される数値は正確な行数ではない**ということがわかった
- 結論：レコード入っているテーブルが0行にならなかったら「レコードが入っているか否か」をまとめて確認したいときに使用できそうだけど、駄目だこれだと使えなさそう。。。。。。。。。。

# information_schemaとは

軽くinfomation_schema自体についても調べてみた

- DBサーバは、DBに挿入するデータを格納するのはもちろん、データを格納するために作成された全てDBオブジェクト（`テーブル`・`ビュー`・`インデックス`等）に関する情報も格納している
    - これらは一般に`メタデータ`と呼ばれる（「データに関するデータ」みたいなもん）
    - もうちょい専門的な言葉だと`データディクショナリ(data dictionary)`や`システムカタログ(system catalog)`なんて呼ばれたりもするらしい
- これらメタデータは永続的に格納する必要があり、かつSQLを実行するためにこのメタデータを素早く取り出したり、変更できるようにしておく必要がある
    - **`information_schema`はMySQLにおいて上記を実現するための特別なデータベース**（ちなSQL Serverにも同名のものがあるが、こちらはスキーマにあたるらしい）
- MySQLのinformation_schemaに含まれるオブジェクトは**全てビュー**である
- MySQLの場合は最初からデータベースとして入っている
```sql
mysql> SHOW databases;  -- DBとして最初から入っている
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| sys                |
+--------------------+
5 rows in set (0.02 sec)
```

良い使い方がありそうなので、色々調べていきたい
いいね、ストック、閲覧数を一覧で見たい！


投稿記事数が増えてきて、何となく振り返りたい、今後の投稿の視座が変わるかもと思い、タイトルにあるように投稿記事の関連数値を一覧で確認できるツールを作りました！

[**Qiita Effective Posting**](https://qiita-effective-posting.vercel.app/)

## 使い方

1. User Nameを入力
    マイページから確認ください。
    例えば、私の場合、`Leech`がUser Nameとなります。
    <br/>
1. Tokenを入力
    [こちらの記事](https://qiita.com/miyuki_samitani/items/bfe89abb039a07e652e6#qiita%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%8F%96%E5%BE%97)を参考に、アクセストークンを取得してください。
    <br/>

1. Set ⇒ Get Dataでデータを一覧で確認できます！

    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468974/1869ea19-fc81-e061-2fec-86f939455f0c.png" width="600" />

## 安心してください！

Networkタブを確認いただければと思いますが、外部へのリクエストはQiita APIのみです。

**決して、サーバーサイドでアクセストークンの取得など行っていませんので、ご安心ください。**

### それでも心配という方へ

[リポジトリ](https://github.com/HIppei/qiita-effective-posting)を公開しており、Qiita Effective Posting はLocalでも起動可能です！

```bash
# LocalにClone
git clone https://github.com/HIppei/qiita-effective-posting.git

# Package install
pnpm i

# 起動
pnpm dev
```

## 機能紹介

- CHART

    棒グラフで数値をビジュアライズしています。（ただそれだけ）
    <br/>

- TABLE

    表形式で数値を確認できます。

    なんとこちらはTitle以外の各カラムにソート機能が付いています！


    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468974/7dcb678f-1ef6-aef9-c817-103421e48aa9.png" width="600" />
    

## Codebaseなど

RSCは使っていませんが、`Next.js`のV14で構築しています。

Unitテストや`lint-staged`なども割とちゃんと設定しました。

あとはVercelで簡単デプロイといった感じです！


## 最後に

最初の構想は、Qiita APIを使って、自分の記事以外からもデータを集めて、AI使って、効果的な投稿タイミングを調べたりしてみたいなーという感じでした。

ですが

API仕様などを覗いてみると無理そうで、当初の構想からスケールダウンして、まず、「グラフと一覧形式で確認できる」ところから始めています。もし何か思いつけば機能追加などしていきたいです！
Dataverse のごみ箱機能（レコードの復元）のご紹介

Dataverse のレコードを誤って消してしまったときに、テーブルのレコード単位でデータを復元できる機能が出ております。通称 "ごみ箱"

https://learn.microsoft.com/ja-JP/power-platform/admin/restore-deleted-table-records

軽微なレコード削除ミスに対してわざわざSRを起票してサポートを依頼したり、環境(Dataverse単位)での大がかりな復元作業したりせず、お客様のシステム管理者にて時間をかけずにレコード復元(復旧)することができるのでご活用ください。

使い方は以下の通りですが、**すべてシステム管理者で操作いただく内容なので、一般の Power Platform ユーザーの人は参考程度に見てください。**

## ごみ箱機能の有効化
・PPAC にシステム管理者としてログイン
・環境 > 設定 > 機能 をクリック
・ゴミ箱 (プレビュー) を オン
・回復時間間隔 (最大30日) を設定
・保存 をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/215af04c-d160-eaf7-248e-f602c1dc4041.png)

## ごみ箱機能の使い方（復元方法）
・PPAC にシステム管理者としてログイン
・環境 > 設定 > 削除されたレコードを表示 (プレビュー) をクリック
・削除されたレコード一覧 が表示されることを確認
・復元 (Restore) をクリックし、データが復元されたことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/eaf4e6f2-be76-5018-ece5-f8b9abab2f69.png)

:::note warn
**標準的なリレーションシップがあるテーブルの扱いについて**
カスケード (伝播) されるようにリレーションシップが作成されたテーブル間であれば、復元を選択したレコードだけでなく、リレーションシップされているレコードも復元されます。
リレーションシップとカスケードについては、サポートチームの記事をご参照ください。https://jpdynamicscrm.github.io/blog/powerplatform/table-relationship-behavior/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/f467af5b-9137-194f-13c1-6a0e0c85504f.png)
:::

:::note warn
**カスタムビジネスロジックによるリレーションシップがあるテーブルの扱いについて**
「あるテーブルのレコードを消すと別のテーブルのレコードも消される」といったお客様独自で実装したカスタムビジネスロジックがある場合は、本機能 (復元) であるテーブルのレコードを復元しても、関連する別のテーブルのレコードは復元されないため、オリジナルのビジネスロジックを逆にするような処理 (Restore メッセージ) が必要になります。
https://learn.microsoft.com/ja-jp/power-apps/developer/data-platform/restore-deleted-records?tabs=webapi
:::

以上、ご参考になれば幸いです。
【JavaScriptのお勉強】関数を初めて使う。サイコロをふってみよう！

# はじめに
JS初心者です。Qiitaも初投稿です。

関数の書き方っていろいろあるんですね。
覚えた書き方を4種類記載してみます。

***
こんな簡単な画面でサイコロを振るプログラムをつくります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3769308/41cf4945-eb0b-d2a2-89f5-bbd3f18df6cd.png)

## アロー関数で定義

```event.html
 <div>
    <p>サイコロ： <span id="output">?</span></p>
  </div>
  <div>
    <button id="do_dice">サイコロを振る</button>
  </div>
  <script>
    //doDiceという関数を定義
    const doDice = () => {
      const dice = Math.floor(Math.random() * 6) + 1;
      document.getElementById('output').textContent = dice;
    }
    //ボタンが押されたら定義したdoDice関数を呼び出します。
    document.getElementById('do_dice').addEventListener('click', doDice);
  </script>
```
##  無名関数を使う
1回しか使わない関数なら定義しなくていい（無名でよい）ということ。（なるほどです。）
```event2.html
//script部分のみ変更
//イベントリスナーの'click'の次の第2引数の関数名を
//まるっと処理に置き換えるだけ。
<script>
    document.getElementById('do_dice').addEventListener('click', () => {
      const dice = Math.floor(Math.random() * 6) + 1;
      document.getElementById('output').textContent = dice;
    });
</script>
 ```
  ## 関数宣言
　この書き方もまだ多いので、覚えておいた方がよいらしい。
 ```event3.html
 <script>
   function doDice() {
      const dice = Math.floor(Math.random() * 6) + 1;
      document.getElementById('output').textContent = dice;
    }
    document.getElementById('do_dice').addEventListener('click', doDice);
  </script>
  ```

  ## 関数式
   現在はあまり使わないようです。
   
  ```event4.html
  <script>
   const doDice = function() {
     const dice = Math.floor(Math.random() * 6) + 1;
     document.getElementById('output').textContent = dice;
   }
   document.getElementById('do_dice').addEventListener('click', doDice);
 </script>

  ```

***
# さいごに
基本的にアロー関数を使うようです。
=>が意味不明でしたが、この記事書いてたらわかってきました。
output大事ですね。
Qiitaの書き方練習にもなりました。ありがとうございました。

###### ※修正しました
関数式の修正依頼いただき修正しました。（コード貼り付け間違い、失礼しました。）
Qiitaの修正の仕方すらまごついてます。
早く慣れていきたいです。ありがとうございました！
ESP32: AE-BNO055-BO の地磁気センサーの使い方 (Timer 割り込み）

こちらのプログラムを改造して、Timer 割り込みで計測をするようにしました。
[ESP32: AE-BNO055-BO の地磁気センサーの使い方](https://qiita.com/ekzemplaro/items/4265e48b1e19a32b79bb)

>割り込み処理の中で、シリアル通信を行うのは良いことではありません。
>手法の確認の為に行っています。

## プログラム

```text:magnetic_timer.ino
// ---------------------------------------------------------------------
//	magnetic_timer.ino
//
//						Aug/01/2024
// ---------------------------------------------------------------------
#include <Adafruit_BNO055.h>
#include <Ticker.h>

Ticker bno055ticker;
#define BNO055interval 3000

Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);

// ---------------------------------------------------------------------
void setup(void) {
	Serial.begin(115200);
	Serial.println("AE-BNO055-BO Test");

	if (!bno.begin()) {
		Serial.println("AE-BNO055-BO not detected. Check your connections or I2C address.");
		while (1);
	}

	delay(100);
	bno055ticker.attach_ms(BNO055interval, get_bno055_data);
	delay(100);

	Serial.println("*** setup end ***");
}

// ---------------------------------------------------------------------
void get_bno055_data(void)
{
	sensors_event_t mevent;
	bno.getEvent(&mevent,Adafruit_BNO055::VECTOR_MAGNETOMETER);
	Serial.print("Magnetic: ");
	Serial.print(mevent.magnetic.x, 4);
	Serial.print(" ");
	Serial.print(mevent.magnetic.y, 4);
	Serial.print(" ");
	Serial.print(mevent.magnetic.z, 4);
	double htt = (180.0 / PI) * atan2(mevent.magnetic.x, mevent.magnetic.y);
	double heading = 360.0 - htt;
	if (360.0 < heading)
		{
		heading -= 360.0;
		}

	if (heading < 0)
		{
		heading += 360.0;
		}

	Serial.print(" ");
	Serial.println(heading, 4);
}

// ---------------------------------------------------------------------
void loop(void) {
//	Serial.println("*** loop ***");
	delay(5000);
}

// ---------------------------------------------------------------------
````
pip Error: add_subdirectory given source "src/test" which is not existing directory

## 想定する読者
pip でライブラリをインストールしようとしている人で、表題のエラーでイントールできないで困っている人

## 遭遇した状況
```
python3 -m pip install OpenEXR
Collecting OpenEXR
  Downloading openexr-3.2.4.tar.gz (1.7 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 6.6 MB/s eta 0:00:00
  Installing build dependencies: started
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
  Installing backend dependencies: started
  Installing backend dependencies: finished with status 'done'
  Preparing metadata (pyproject.toml): started
  Preparing metadata (pyproject.toml): finished with status 'done'
Building wheels for collected packages: OpenEXR
  Building wheel for OpenEXR (pyproject.toml): started
  Building wheel for OpenEXR (pyproject.toml): finished with status 'error'
  error: subprocess-exited-with-error
  
  × Building wheel for OpenEXR (pyproject.toml) did not run successfully.
  │ exit code: 1
  ╰─> [89 lines of output]
      openexr_skbuild_plugin: Computing OpenEXR version from CMake...
      openexr_skbuild_plugin: Computed version: 3.2.4
（中略）

     -- Building OpenEXR libraries
      CMake Error at CMakeLists.txt:147 (add_subdirectory):
        add_subdirectory given source "src/test" which is not an existing
        directory.
      
（中略）      
Interpreter Development.Module
      -- Configuring incomplete, errors occurred!
      
      *** CMake configuration failed
      [end of output]
```

## 問題の回避方法
git cloneして、そのディレクトリからpip でインストールする。

```
git clone https://github.com/AcademySoftwareFoundation/openexr.git
cd openexr && python3 -m pip install .
```

## トラブルを生じた理由の推定
- CMake は該当のディレクトリがあることを想定する。
- gitはファイルがない空のディレクトリを作成しない。
- そのため、python3 -m pip install OpenEXRを実行時につくられた一時的な展開先のディレクトリの中には、src/testという空のディレクトリがない。CMakeはそのディレクトリをadd_subdirectoryをしようとして失敗する。

## なぜ、git clone と pip install を別にするとうまくいくのか？
- 未調査です。
【Google Cloud】Cloud Digital Leader試験体験記

# はじめに
おつかれさまです。mochiです。
先日、GCPのCloud Digital Leader試験に合格した為、その際の勉強時間や本試験でどのような問題が出題されたか等みなさまに共有できればと思います。
# Cloud Digital Leaderとは？
Cloud Digital Leader試験は、Google Cloudにおける基礎的な知識を問われる認定資格試験です。Googleの認定資格のHPでも、Google Cloudにおける中核的なサービスやプロダクトについて説明できること、一般的なビジネスユースケースやクラウドソリューションが組織にどのような影響を与えるかについて説明できることが好ましいとされています。

https://cloud.google.com/learn/certification/cloud-digital-leader?hl=ja
# 資格試験の概要
試験時間：90分
登録料金：99 USD
対応言語：英語、※日本語、スペイン語、ポルトガル語、フランス語
試験形式：50～60問の多肢選択式(私が受験した際は50問でした)
試験実施方式：オンサイト試験もしくはオンライン試験
前提条件：特になし
再認定について：資格取得から3年間有効。

※私が日本語で受験した際、日本語の表記があいまいなものが散見されました。
公式の模擬試験等を予め受けて、その表記に慣れておく必要があると思います。

# 学習リソース
私が実際に試験対策をしていたときに使用した学習リソースは以下となります。
### Google公式の模擬試験
https://docs.google.com/forms/d/e/1FAIpQLSdyQtCFqpNSlv8xJwc8goExJOzSAKxiWW2BoVhO1QWRUEUuKA/viewform?hl=ja

こちらの模擬試験はGoogle公式が出しているものとなり、無料でいつでも受けることができます。こちらの問題を実際に繰り返し解いてあいまいな日本語表記に慣れることができました。

### 【Udemy】Google Cloud認定 Cloud Digital Leader（CDL） トレーニング
https://www.udemy.com/course/google-cloud-cloud-digital-leader-cdl/?couponCode=ST4MT73124

この講座を受講してGoogle Cloudについての基本的な概要やハンズオンを学ぶことができました。最後に本試験の予想問題集も用意されている為、試験を想定した問題を解くことができます。そこで自分の中でどの分野の知識が弱いのかを見直すことができます。

### 【Udemy】GCP：Google Cloud Digital Leader模擬試験問題集（6回分320問）
https://www.udemy.com/course/google-cloud-digital-leader6320/?couponCode=ST4MT73124

前述した講座を受講した後にこの問題集で最後の理解度仕上げを行いました。問題数が320問と多く、様々なケース問題も用意されており非常に有効であると感じました。

# 実際に出題された問題について
私が試験を受けた際、多く出題されたのは『AIや機械学習についての出題』です。
以下に、覚えている範囲で実際に出題された試験問題に近しい問題を置いておきます。

#### 例題1
>・組織は、ラベル付けられたデータセットを利用して、機械学習を利用した予測モデルを生成しています。モデル生成後に、データセット内の誤ったラベル付けデータが発見されました。「誤ったラベル付け」データは予測モデルにどのような影響を与えるでしょうか？
A,予測結果の正確性のスコアを減らす

#### 例題2
>・組織は、機械学習モデルの構築に取り組んでいます。データに対してラベルを設定する必要があります。ラベルとは何でしょうか？
A,予測タスクの回答のこと。画像識別モデルの「猫」と「犬」を分類モデル向けのトレーニング画像付与された「猫」と「犬」のタグ。

上記のように新規にMLモデルをデプロイする際のベストプラクティスについてやラベル、機械学習におけるインスタンスについての説明等が出来るようにしておく必要があると思います。
Google CloudはAWSやAzureと比較すると、AIやMLに特に力を入れていることが分かります。資格試験の受験者にもその強みを理解して欲しいという想いのようなものを感じました。

# さいごに
Google Cloudの試験を受けてAIやMLに対する興味を持つことが出来ました。AWSでもAIに関する資格試験が8月からリリースされるようですね。

クラウド資格を勉強することのメリットは、時代の流れにフレキシブルに対応することが出来るのもありますし、オンプレミスのようなレガシーシステムや基礎的なコンピューティング、ネットワーク、ストレージ、データベースに関する知識も網羅的に学ぶことができます。

今後はさらに専門的な知識を付ける為、Google Cloudの知識が新しいうちにACE試験にも挑戦しようと考えています🔥
paiza Haskell で mod7占い

# mod7占い (paizaランク S 相当)
問題は[ここ](https://paiza.jp/pages/campaign/paiza-qiita)から
# mod 7 の足し算
整数$a$を$7$で割ったあまりを$\bar{a}$と書くことにすると，
```math
\bar{a} + \bar{b} = \overline{a+b}
```
であるので，与えられた数字$a_1,...,a_N$を一度全て$7$で割ったあまりに変換する．
```hs
modList :: [Int] -> [Int]
modList = map (`mod` 7)
```
# 組み合わせ
あまりのリストの中から，$3$つ選ぶ関数を定義する．
```hs
combinations :: Int -> [a] -> [[a]]
combinations 0 _  = [[]]
combinations _ [] = []
combinations n (x:xs) = [x:ys | ys <- combinations (n-1) xs] ++ combinations n xs

choose3 :: [a] -> [[a]]
choose3 = combinations 3
```
# まとめ
完成した$3$つ組を足して，また$7$で割ったあまりを求め，それが$0$である組み合わせを数える，
```hs
main :: IO ()
main = do
  _ <- getLine
  a_n <- fmap (map read . lines) getContents
  let 
    ans = length $ filter (\x -> 0 == mod (sum x) 7) $ choose3 $ modList a_n
  print ans
  pure ()
```
割り算の符号を処理して遊ぶ


参考

https://asunaro-a.com/tips/how-to-study-jhs/75286/


x 過去ログを見よ
x arduino unoの予定は、未定
x abs()は、符号を取り除く

目的
表引きした後に符号を戻す必要があるため


結果

![o_coq268.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/146d7c60-10a4-9a9a-c6a1-9caf380b6fd1.jpeg)



プログラム


```c++



#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    int a =   -4; 
    int b =    2;
    int p;
    int c;
    
    c = abs(a) / abs(b);
    
    p = a ^ b;
    p = (p >> 31);
    c = (c ^ p) - p;
    printf("%d",c);
    
}



```
SQLで1000が１になるトラブル

WordPressを使い、CSVファイルからインポートして、データを表示するウェブサイトを作る仕事をしています。
その中で、SQLで整数の設定をしているカラムで、何故か1000が１になってしまうトラブルが発生しました。

CSVファイルの内容を確認すると、桁の表示のカンマがありました。
それでカンマを除いて整数に変換して、データベースのテーブルに保存を試みました。
でも、何故か上手く行かないのです。

サーバーでログを得て確認しても、ちゃんと1000に変換されています。
それなのにデータベースのテーブルの内容を確認すると、１になっています。
3桁の数値は、正しく保存されています。

謎なので、Claude3 Sonnetに相談して、このコードを作ってもらいました。

```php

                'hoge' => isset($row['hoge']) && $row['hoge'] !== ''
                    ? intval(str_replace(',', '', $row['hoge']))
                    : null,
```

文字の前後にある空白を取り除き、カンマを取り除きます。
そして数値に変換しています。
データが無いときは、nullにしています。

私自身忘れないように、備忘録として記録しました。

このコードを使えばCSVファイルで、1,500と記録されていても、1500として保存できます。
CSVファイルで1,500などカンマがある数値は、文字として記録されています。
Zedというエディターをさわってみた

# はじめに
webエンジニアの風速です。
Zedをご存知でしょうか。近頃いろんなものがRustで書かれたり、置換されたりみたいな話を聞く気がします。ZedはRust製のオープンソースエディターで、公式サイトを覗いてみると、「Code at the speed of thought」というのを掲げています。googleで翻訳すると、「思考のスピードでコードを書く」ということらしいです。
対応OSはmacと7/10にlinux版が正式にリリースされたとのことです。
自分の環境はmacしかなかったので、mac版でさわってみようと思います。

# インストール
brewでインストールができるらしいので、brewでインストールします。
```
brew install --cask zed
```
インストール後起動されました。

![スクリーンショット 2024-07-29 21.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/04080426-1079-1b42-cec4-0816d471acaa.png)


## cli

cliもタスクバーからインストールができ、vscodeみたいにコマンドから起動ができるようになります。
```
zed .
```
![スクリーンショット 2024-07-30 22.07.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/32277bff-6d4f-4dd0-a9e5-5cd9252a4ec2.png)

# マルチバッファー
複数のファイルを同時に編集できるみたいです。
```⌘ + shft + f```で編集したい単語等を検索します。
![スクリーンショット 2024-07-30 22.46.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/e481fc6b-e1da-598e-0c1c-b7c65f723c3e.png)

```⌘ + shft + l```でマルチカーソルを使用すると、複数のファイルを編集できます。
![スクリーンショット 2024-07-30 22.48.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/5db56d89-b730-a275-f0ac-012f4a3ccad7.png)
```option + click```等でカーソルを追加、削除したりすると任意の部分も修正可能です。(vscodeで使用できるマルチカーソルの操作は使えそう？)

# 使用していないがあった機能
## 言語モデルの統合
LLM等の操作が可能
## コラボレーション
共有したワークスペースを通話しながら、共同で編集できたりします。
## チャンネル
コラボレーション機能の新しいバージョンで、機能としてはほとんど同じですが、メモ、チャットなどがあるみたいです。ディスコードみたいな感じ？ベータ版で今後有料になるらしい。今zedのチャンネルが公開されていて間違って入ってしまい、超あせりました。申し訳ない。。。

# まとめ
操作感はほとんどvscode（自分が使用しているのがvscodeなので）と変わらず、主要な言語にはサポートないしは拡張機能等があったので、移行にもコストが少ないと思います。実際に使用してみてというのは、長く使ってみないと難しいですが、検索画面が個人的にみやすくてよかったです。
あえて触れなかったのですが、welcomeページにvim modeなるものがあり、vimのようにも使用できたりするみたいです。

# 参考
https://zed.dev/
駅すぱあと VBA SDKを使って平均待ち時間探索を行う

**本記事はヴァル研究所の支援として作成された記事です**

[駅すぱあとはAPIを公開](https://api-info.ekispert.com/)しており、駅情報や経路探索などをAPI経由で行えます。メソッドはすべてGETメソッドで、情報取得系のみです。レスポンスはJSONまたはXMLで返ってきます。

この駅すぱあと APIを利用しやすくするSDKを開発しはじめました。SDKはVBAで作っており、Excelなどから利用できます（Windowsのみ、macOSでは利用できません）。

今回は、スタンダードプランで提供されている平均待ち時間探索APIに対応したので、その使い方を解説します。

## 平均待ち時間探索とは

平均待ち時間探索は、時刻表を加味しないで目的地への色々な経路を探索します。平均待ち時間とは、1日に運行されている列車の本数などから割り出した、平均的に考えられる待ち時間になります。

詳細は[平均待ち時間による探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/dictionary/search-course-by-average-time/)を参照してください。

## 必要な情報

SDKを利用する際にはAPIキーが必要です。[無料トライアルがあるので、こちらから取得](https://api-info.ekispert.com/form/trial/)してください。

## 注意点

- SDKはWindowsでのみ動作します
- SDKは非公式です。公式サポートへの問い合わせはご遠慮ください

## ファイルのインポート

[こちらのリポジトリ](https://github.com/EkispertAPIMania/VBA-SDK)にある `*.cls` と `*.bas` ファイルをすべてインポートします。これらは以下のライブラリを含んでいます。

- [VBA-tools/VBA-Dictionary](https://github.com/VBA-tools/VBA-Dictionary)
- [VBA-tools/VBA-Web: VBA-Web](https://github.com/VBA-tools/VBA-Web)
- [VBA-tools/VBA-JSON](https://github.com/VBA-tools/VBA-JSON)

## 初期化

先ほど取得したAPIキーを使ってSDKを初期化します。

```vb
Dim client As Ekispert
Set client = New Ekispert
client.ApiKey = "YOUR_API_KEY"
```

## 平均待ち時間の検索条件設定

平均待ち時間検索は `CoursePlainQuery` を使います。このオブジェクトを取得し、検索条件を設定します。

```vb
Dim Query As CoursePlainQuery
Set Query = client.CoursePlainQuery()
' From/Toは必須
Query.FromProp = "吉祥寺" ' 出発地
Query.ToProp = "札幌" ' 目的地

' 日付の設定
Query.DateProp = Now
```

検索条件は [平均待ち時間探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/search/course/plain.html) にあるものを指定できます。

以下のプロパティは予約語が関係するため、名前を変更していますので注意してください。

| 検索条件 | プロパティ |
| --- | --- |
| date | DateProp |
| from | FromProp |
| to | ToProp |

## 検索の実行

検索条件を設定したら、検索処理を実行します。結果は `ResultSet` クラスになります。検索がうまくいったかどうかは `ResultSet.Success` の値で判定してください。

```vb
Dim Result As ResultSet
Result = Query.Find()

Debug.Print Result.Success ' True または False
```

### エラーだった場合

もし検索がエラーだった場合は `ResultSet.Error` の中にエラー情報があります（駅すぱあと APIからのエラーの場合）。

```vb
If Not Result.Success Then
    MsgBox Result.Error.Message
    Exit Sub
End If
```

### 成功した場合

処理が成功した場合、 `ResultSet.Courses` の中に経路情報が入っています。各経路には `Price` （金額情報） や `Route` （経路） プロパティなどがあります。

```vb
Debug.Print Result.Courses(0).Route.Lines(1).stopStationCount ' 途中駅数 4など
```

## ソースコード

SDKのコードは以下のリポジトリにて公開しています。ライセンスはMIT Licenseです。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK/tree/main)

## まとめ

経路探索は今回紹介したものの他、前後のダイヤ探索や時刻表を加味した経路探索などさまざまな種類があります。今後のSDKのアップデートにて対応する予定なので、ぜひご利用ください。

何か不具合があれば、Issueにて連絡いただければ対応します（macOSでは動かないので注意してください）。

[EkispertAPIMania/VBA-SDK: Excel VBAなどで動作する駅すぱあと VBA SDKです（Windowsのみ）](https://github.com/EkispertAPIMania/VBA-SDK)
LinterとFormatterの違い・役割

# Linter
#### コードの問題点がないか確認する静的解析ツール
問題点があれば赤い波線や豆電球の様なマークを問題になりうる部分のみに表示する。
使う言語によってLinterを選びましょう。
Linter　例：ESLint 

https://eslint.org/
# Formatter
#### コードのスタイルチェックをしコードの整形をします。
コードの見た目を自動修正してくれます。
コードの整形に便利なツールです。
Formatter 例：Prettier 

https://prettier.io/
## Linter Formatterの利点
- LinterとFormatterを使うと見落としのミスが減ったります。
- コードを書いた本人以外が見てもコードが整形されているので見やすくなります。
- 開発者間で同じようなスタイルになりバラつきが減ります。

<使う言語>< Linter or Formatter >と検索して自分にあったツールを使ってみてください。

私はJavaScriptを書く際は
Linter：JavaScript Standard Style　

https://standardjs.com/readme-ja 

Formatter：Prettier

https://prettier.io/

を使用しています。
ちなみにVscode(Visual Studio Code)でプログラムを書いてます。
同じなら拡張機能の所からインストール可能です。
15の割り算で遊ぶ(0..256)


x 過去ログを見よ
x arduino unoでは、予定は、未定


結果

![o_coq267.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f7c1ad68-0126-e973-5de6-5ea6f6d3b535.jpeg)

プログラム

```c++


#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    int sa[] = {
    //0123456789012345
    0b0000000000000001,
    0b0000000000000011,
    0b0000000000000111,
    0b0000000000001111,
    0b0000000000011111,
    0b0000000000111111,
    0b0000000001111111,
    0b0000000011111111,
    0b0000000111111111,
    0b0000001111111111,
    0b0000011111111111,
    0b0000111111111111,
    0b0001111111111111,
    0b0011111111111111,
    0b0111111111111111,
    0b1111111111111111,
    0b0000000000000000
    };//sa
    
    printf("\n\nSTART\n\n");
    
    int x = 60;
    int y;
    int a;

    y = x >> 4;

    a = sa[y];
    a = a << (x & 0x0f);
    a = a & 0x8000;
    a = a >> 15;
    a = a + ((x + 1) >> 8);
    y = y + a;
    
    
    printf("(%d)/(15)=(%d)\n",x,y);
 
}//main




```


```


START

(60)/(15)=(4)


```
Excel の関数「LET・FILTER・HSTACK／COLUMN」などを組み合わせたデータ抽出

最近、以下の Excel に関する記事を書いたのですが、この記事も Excel ネタです。

●Excel で複数の年・月が別セルに書かれたものを統合して和暦にする（スピルを利用したり表示で元年の表記を使ったりも） - Qiita
　htps://qiita.com/youtoy/items/2720377a88c0a35b5197

とあるデータ処理で Excel の関数を使ったのですが、それに関するメモ的な記事を書いておこうと思います。

そのデータ処理で最終的に行った内容は、今回の内容だけではないのですが、ひとまず区切りの良いところを記事化してみます。

## 今回やること
今回やることは「隣り合っていない複数の列を取り出す」というものです。今回は、以下の仮のデータを使って進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/0729a301-a9fb-6cca-3a5c-9210cb07380f.png)

取り出す列を、以下として進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ce04e39f-4f7b-72ba-9fd9-51621501446a.png)

さらに、上記の列抽出を 1段階目の処理として、さらに追加の 2段階目の抽出処理もやってみようと思います。

### 今回使う関数
上記を実現する方法は複数ありますが、今回は以下を使った方法を試します。

- LET関数
- FILTER関数
- HSTACK／COLUMN関数

### 実際の内容
それでは、実際の内容に入っていきます。

#### パターン1
まず、HSTACK・FILTER の 2つの関数を抽出に使った方法です。
それに関して、LET関数で名前をつけつつ、列の抽出を行います。

まずは、上の画像で赤枠で囲んでいた部分を取り出します。

```
=LET(列を抽出した結果, HSTACK(A1:A5, C1:C5, E1:E5),
  列を抽出した結果
)
```

処理の内容は、複数の列を取り出したものを「HSTACK」関数で結合するというものです。

以下は、上記を「A7」に入力した結果です。
出力としては、スピルにより右と下にも結果が展開された形になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ff7cc183-2301-f9a6-d864-541a2f542a8f.png)

さらに E列の内容を条件にした、追加の抽出処理もやってみます。
抽出前後で一番右にある列の各セルの値が、特定の数値より大きいものを取り出してみます。

```
=LET(列を抽出した結果, HSTACK(A1:A5, C1:C5, E1:E5),
  条件, E1:E5 >2,
  特定の行, FILTER(列を抽出した結果, 条件),
  特定の行
)
```

上記の処理を適用した結果は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3aea9c74-93d0-4bd6-b61c-a4d8462c952e.png)

下3行分の内容が取り出せているのが分かります。

#### パターン2
今度は、FILTER・COLUMN の 2つの関数を抽出に使った方法です。以下のようにしてみます。

```
=LET(データ全体,A1:E5,
  条件,(COLUMN(データ全体)=1)+(COLUMN(データ全体)=3)+(COLUMN(データ全体)=5),
  特定列のみの表,FILTER(データ全体,条件),
  特定列のみの表
)
```

処理結果は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b2d3b1c0-0447-b0f0-ef9e-15d446ba0545.png)

ここで先ほどと同様、追加の処理を加えてみます。そして、先ほどと同様の結果が得られるのを確認できました。

```
=LET(データ全体,A1:E5,
  条件1,(COLUMN(データ全体)=1)+(COLUMN(データ全体)=3)+(COLUMN(データ全体)=5),
  特定列のみの表,FILTER(データ全体,条件1),
  条件2, E1:E5 >2,
  特定の行, FILTER(特定列のみの表, 条件2),
  特定の行
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d1a0832b-fcaa-90d9-338c-799c00f74ad4.png)

## 参考

●LET 関数 - Microsoft サポート
　https://support.microsoft.com/ja-jp/office/let-%E9%96%A2%E6%95%B0-34842dd8-b92b-4d3f-b325-b8b8f9908999

●FILTER 関数 - Microsoft サポート
　https://support.microsoft.com/ja-jp/office/filter-%E9%96%A2%E6%95%B0-f4f7cb66-82eb-4767-8f7c-4877ad80c759

●HSTACK 関数 - Microsoft サポート
　https://support.microsoft.com/ja-jp/office/hstack-%E9%96%A2%E6%95%B0-98c4ab76-10fe-4b4f-8d5f-af1c125fe8c2

●COLUMN 関数 - Microsoft サポート
　https://support.microsoft.com/ja-jp/office/column-%E9%96%A2%E6%95%B0-44e8c754-711c-4df3-9da4-47a55042554b
マイナーかもしれないけど Tableau Prep×Boxの話

## はじめに
Tableauにデータを蓄積していく中で、Box接続するの便利ですよね
今回はBOXで蓄積したデータをprepで読み込んで、データ更新をしていく方法を記載していきます

## PrepへBox接続方法
https://help.tableau.com/current/pro/desktop/ja-jp/examples_box.htm
接続の＋ボタンからBoxを選択してください

## Boxを使ったデータ更新方法
#### データをユニオン

* 挿入したBoxファイルをクリック

* 設定、テーブル、データサンプル、変更のタブがでてくるので、テーブルをクリックする

* ソース＞複数のテーブルでユニオンを選択

* 次の場所で検索＞フォルダ場所を指定する
（読み込みをサブフォルダーまで含める場合は、サブフォルダーを含めるにチェックする）
* ファイルフィルターで読み込みたいファイル名を記載する
変動する名前がある場合は、*とする
例えば、2024年1月利用料金.csv、2024年2月利用料金.csvなど年月でファイル名の前の部分が変動する場合は、「*利用料金.csv」という記載になる

## Boxを使ったデータ更新方法（応用編）
ステータス変更などがあってただ純粋にユニオンしていくだけではうまくいかないケースがあったので、私が使った打開策をここで展開します

#### ステータス変更によるデータ更新の課題点
* 毎週、毎月、csvダウンロードして、データを蓄積していきたいが、日々ステータス変更が変わっていく可能性ある
* 蓄積するデータを重複させずに、ステータス変更データも更新させたい

#### 打開策
* 重複判定し、重複排除
毎週、毎月データを蓄積させていくと、過去の案件が重複するので、重複を排除する

```ruby:重複判定
IF ({PARTITION[申請番号], [ステータス]:  { ORDERBY [Table Names] DESC:  ROW_NUMBER() } } = 1) THEN '一意' ELSE '重複' END
```
```ruby:重複排除
NOT ((([重複する行はありますか?] == "重複") AND NOT (ISNULL([重複する行はありますか?]))))
```

* ステータスを採番する（以下のステータスは例）

```ruby:ステータス採番
IF [ステータス] = '処理中' THEN
    1
ELSEIF [ステータス] = '承認' THEN
    2
ELSEIF [ステータス] = '取り下げ' THEN
    3
ELSEIF [ステータス] = '否認' THEN
    4
ELSE
    NULL
END
```
* 進行しているステータスを把握する
各案件に対して最大のステータス採番（＝進行しているステータス）を取得する

```ruby:MAXステータス
{FIXED [申請番号]:MAX([ステータス採番])}
```
* 最大のステータス採番と一致する行にフラグを立てる
ステータス採番が最大のステータス採番と一致する場合に1、それ以外の場合に0を返す計算フィールド
```ruby:ステータスフラグ
IF [ステータス採番] = [MAXステータス] THEN 1 ELSE 0 END
```
* ステータスフラグを1だけに選択する
この処理で、前のステータスの情報を排除する

## おしまいの言葉
文章に書くと短いが、ここにたどり着くまで長かった…
途中で混乱してもつまずいても、師匠が相談に乗ってくれたのが本当にありがたかったです
人のあたたかさを感じて、今日も頑張るんだぞう
「Now Platform」に関する複数の脆弱性及び攻撃試行。対策実行（パッチ適用）のすすめ。

## 概要
米国CISAが悪用を確認した脆弱性をカタログに追加しました。
早急に対策を実行されることをお勧めします。

① CVE-2024-4879
ServiceNow Improper Input Validation Vulnerability
----------------------
ServiceNow Utah、Vancouver、およびWashington DC Nowには、UIマクロにおけるJelly テンプレートインジェクションの脆弱性が含まれています。認証されていない攻撃者により、**リモートからコード実行される恐れがあります。**
「CVSSv3.1」ベーススコア「9.8」
重要度「クリティカル（Critical）」
※脆弱性の報告者より詳細が公開されており、**「CVE-2024-4879」については実証コード（PoC）や、脆弱性があるインスタンスを探索し、情報を抜き出すスクリプトなども出回っている。**
https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB1645154

② CVE-2024-5217
ServiceNow Incomplete List of Disallowed Inputs Vulnerability
----------------------
ServiceNow Washington DC、Vancouver、およびそれ以前のNow Platformリリースには、GlideExpressionスクリプトに不完全な禁止入力リストの脆弱性が含まれています。認証されていない攻撃者により、**リモートからコード実行される恐れがあります。**
「CVSSv3.1」ベーススコア「9.8」
重要度「クリティカル（Critical）」
https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB1648313

③ CVE-2023-45249
Acronis Cyber Infrastructure (ACI) Insecure Default Password Vulnerability
----------------------
Acronis Cyber Infrastructure (ACI) は、デフォルトパスワードを使用している場合、認証されていない攻撃者により、リモートからコマンド実行される恐れがあります。
「CVSSv3.1」ベーススコア「4.9」
重要度「中間（Midium）」
https://security-advisory.acronis.com/advisories/SEC-6452

## 期待されるアクション
「同Utah」「同Vancouver」「同Washington DC」では、6月にリリースしたパッチなどでこれら脆弱性に対処しており、できるだけ早急にアップデートするよう呼びかけている。

## 対象パッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/1e186970-75d3-fa1e-e5ad-c801fc34a72f.png)

## 脆弱性の詳細報告
成功した場合の被害1
jellyによるUIページに対する意図しないタイトル文字列の挿入の可能性
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/319bdedb-9826-d651-c447-fcd2ecb77621.png)

成功した場合の被害2
上記インジェクションをバイパスしたコード実行の可能性
以下のように意図しないコード実行がなされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/f5de1e03-017b-9995-a6be-55711899d03f.png)



成功した場合の被害3
攻撃者はユーザーリストとアカウント認証情報をダンプの可能性
Resecurity によると、ほとんどの場合、これらはハッシュ化されていましたが、侵害されたインスタンスの一部ではプレーンテキストの認証情報が露出していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190712/8f09ad4c-4b77-a7c4-4622-6f85ed7e553a.png)



## 参考記事
1.[ServiceNowの「Now Platform」に深刻な脆弱性 - アップデートの実施を](https://www.security-next.com/159650)-2024.07.12
2.[「ServiceNow」の脆弱性狙う攻撃が発生中 - 攻撃試行も観測](https://www.security-next.com/160287)-2024.07.30
3.[CISA Adds Three Known Exploited Vulnerabilities to Catalog](https://www.cisa.gov/news-events/alerts/2024/07/29/cisa-adds-three-known-exploited-vulnerabilities-catalog)-2024.07.29
4.[Critical ServiceNow RCE flaws actively exploited to steal credentials](https://www.bleepingcomputer.com/news/security/critical-servicenow-rce-flaws-actively-exploited-to-steal-credentials/)
5.[Chaining Three Bugs to Access All Your ServiceNow Data](https://www.assetnote.io/resources/research/chaining-three-bugs-to-access-all-your-servicenow-data)
【初心者向け】循環参照になってしまうプロジェクトのメソッドの呼出し方法

# 概要
Visual Studioで、他のプロジェクトのメソッドを呼び出したいが、循環参照になってしまう場合の解消方法を備忘録として纏めました。
C#で記述しています。

# やりたいこと
プロジェクトAからプロジェクトBへ参照設定を行っている状況で、
プロジェクトBからプロジェクトAのメソッドを呼びたい。

# デリゲートを使用する方法 (プロパティにセットする方法)
### 戻り値がないデリゲートの場合
① プロジェクトB側で、デリゲートのプロパティ (フィールド) を作成しておく
```C#
    public static class SampleClassB
    {
        public static Action propertyB { get; set; }
    }
```

② プロジェクトA側で、デリゲートに処理をセットする
```C#
    SampleClassB.propertyB = () =>
    {
        // プロジェクトAのメソッドを呼び出す
        TargetMethod();
    };
```

① プロジェクトB側で、①で作成したデリゲートを呼び出す (終了)
```C#
SampleClassB.propertyB?.Invoke();
```

### 引数がstring型で、戻り値がbool型のデリゲートの場合
① プロジェクトB側で、デリゲートのプロパティ (フィールド) を作成しておく
```C#
    public static class SampleClassB
    {
        public static Func<string, bool> propertyB { get; set; }
    }
```

② プロジェクトA側で、デリゲートに処理をセットする
```C#
    SampleClassB.propertyB = (arg) =>
    {
        // プロジェクトAのメソッドを呼び出す
        bool result = TargetMethod(arg);
        
        return result;
    };
```
③ プロジェクトB側で、①で作成したデリゲートを呼び出す (終了)
```C#
string arg = "hoge"
SampleClassB.propertyB?.Invoke(arg);
```

:::note warn
当たり前だが、③でデリゲートを呼び出す前に、②のデリゲートに処理をセットする処理が先に走っていないと、③で処理が実行できない。
:::

# デリゲートを使用する方法 (メソッドの引数として渡す方法)

① プロジェクトA側で、プロジェクトBのメソッドを呼び出す
このとき、引数にデリゲートをセットし、プロジェクトA側でしかできない処理を記述しておく

```C#
    var sampleClass = new SampleClass();

    // プロジェクトBのメソッドを呼び出す
    sampleClass.SampleMethod((arg1, arg2, arg3) =>
        {
            // デリゲート内の処理
            // 例えば、プロジェクトA側のクラスのメソッドを使用して行う処理をここに記載しておく
        },
        "サンプル");

```

② プロジェクトB側で、プロジェクトAのデリゲートの処理を呼び出す (終了)

```C#
public Class SampleClass
{
    public void SampleMethod(Action<string, string, bool> delegateMethod, string arg)
    {
        // デリゲートを呼び出す
        // 引数を渡してプロジェクトAのメソッドを使用できる
        delegateMethod("さんぷる1", "さんぷる2", true);
    }
}
```

# インターフェースを使用する方法
① プロジェクトB側で、インターフェースを作成しておく
このインターフェースには、呼び出したいメソッドの抽象メソッドを記載
```C#
public interface ISample
{
    void TargetMethod();
}
```
② プロジェクトB側で、インターフェースのプロパティ (フィールド) を作成しておく

```C#
public class SampleClassB
{
    private static ISample _iSample;
}
```

③ プロジェクトA側で、呼び出したい処理もをつクラスにインターフェースを実装する
```C#
class SampleClassA : ISample
{
    // 呼び出したいメソッド
    public void TargetMethod()
    {
      
    }
}
```

④ 以下のように、プロジェクトA側で、プロジェクトBのインターフェースに値をセットする

##### プロジェクトA
```C#
class SampleClassA : ISample
{
    private void SampleMethodA()
    {
        //　インターフェースをセット
        SampleClassB.SetISample(this);
    }
}
```
##### プロジェクトB
```C#
public class SampleClassB
{
    private static ISample _iSample;

    public static void SetISample(ISample iSample)
    {
        _iSample = iSample;
    }  
}
```

⑤ プロジェクトBのインターフェースを介して、プロジェクトAの処理を呼び出す (終了)

```C#
_iSample?.TargetMethod();
```

:::note warn
当たり前だが、⑤で呼び出す前に、④の処理で値をセットしていないと、⑤で処理が実行できない。
:::
SwiftUIでボイスメモの録音ボタンをつくる

## はじめに

ランダムでエフェクトがかかるレコーダーアプリを個人開発したときに､iPhone純正アプリのボイスメモ録音ボタンを再現したことがあるのでメモ

https://apps.apple.com/us/app/randomeffectrecorder/id6449289485

## できるもの
ライト､ダークモードに対応してます｡
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883687/9013476d-e8c7-ce38-22c4-f864f826de86.png">
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883687/3bffaf57-1eca-ecef-dcbf-97666dd5d200.png">


ボタンをタップして録音中は中央の赤い円が四角くなります｡
<img width="280" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883687/a29e4bc6-3968-efeb-c6da-575f373ba05b.png">

## 外側の円の設定
一番外側にある円を
ライトモード: グレー
ダークモード: ホワイト
にするためColor.xcassetsで下記画像のように**circle**という名前で設定します｡

![スクリーンショット 2024-07-31 8.46.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883687/6682f8ca-33c7-f925-54a1-71ee98c51eb4.png)

これで下記のようにカラーを宣言できます｡
```swift
Color("circle")
```

## SwiftUIで実装

```swift
import SwiftUI

struct SampleButton: View {

    @State var nowRecording = false
    @State var allowsHisTesthig = true
    var body: some View {
        VStack {
            VStack {
                if !nowRecording {
                    Button (action: {
                        nowRecording = true
                        allowsHisTesthig = false
                    }) {
                        ZStack {
                            Circle()
                                .stroke(Color("circle") ,lineWidth:3)
                                .frame(width: 60, height: 60)
                            RoundedRectangle(cornerRadius: 50)
                                .foregroundColor(.red)
                                .frame(width: 50, height: 50)
                                .padding()
                        }
                    }

                } else {
                    Button (action: {
                        nowRecording = false
                        allowsHisTesthig = true
                    }) {
                        ZStack {
                            Circle()
                                .stroke(Color("circle") ,lineWidth:3)
                                .frame(width: 60, height: 60)
                            RoundedRectangle(cornerRadius: 5)
                                .foregroundColor(.red)
                                .frame(width: 25, height: 25)
                                .padding(28)
                        }
                    }
                }
            }
            .padding()
        }
    }
}

#Preview {
    SampleButton()
}
```
これで録音ボタンがつくれます｡
わいとVimとの出会い

:::note warn
この記事は[Vim駅伝](https://vim-jp.org/ekiden/)の2024年7月31日向けの記事です。
前回は、[thinca](https://thinca.hatenablog.com/entry/2024/07/megurovim-24) さんでした。
:::

# はじめに

ども、とんとんぼです！iOSを中心にモバイル開発やってます。
最近、vim-jp というコミュニティに入りました。
そこで自己紹介を含めて自分がどのようにvimと出会い、vimの沼にハマったかを紹介します。

# Vim との出会い
大学4年生の時、私はVimと出会いました。当時、理系の学生として論文やレポートを作成するために、主に $\TeX$ という文章作成ツールを使っていました。

$\TeX$ は、Donald E. Knuthによって開発され、複雑な数式を美しく整形することができる文章作成ツールです。しかし、$\TeX$ の環境構築が非常に難しいことから、自分のローカル環境ではなく、外部ツールに依存することにしました。そこで出会ったのがOverleafというWebアプリケーションで、これを使えば特別な設定なしで論文を執筆できます。

同じころ、私はマウス操作を減らす方法を探していました。というのも、マウスの使用があまり好きではなく、キーボードとマウスを頻繁に切り替えるのが面倒だと感じていたからです。調べた結果、Vimがその解決策になりそうだとわかり、試してみることにしました。

偶然にも Overleaf にはキーバインドの設定があります。この設定には、
- Vim
- Emacs
の設定があります。

![スクリーンショット 2024-07-28 19.14.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/628716b6-6387-3051-5e34-2c30f7623c33.png)

> わい「じゃ、Overleafとvimで執筆すればわいが直面している問題はほぼ解決できるな」

と思ったので、私はOverleaf + vim で論文の執筆を行うことになりました。

## 一冊の本との出会い
「じゃ、実際にVimを学んでみよう！」と思い立ち、WebでVimに関する情報を調べ始めました。特に参考にしていたのは、「はじめてのVim ～ Vimはいいぞ！ゴリラと学ぶVim講座」というサイトでした。

https://knowledge.sakura.ad.jp/21687/

また、書籍も購入して読みました。その中で特にVimに夢中になるきっかけとなったのが、「[実践Vim 思考のスピードで編集しよう！](https://www.amazon.co.jp/実践Vim-思考のスピードで編集しよう-Drew-Neil/dp/4048916599)」という本です。この本のサブタイトル「思考のスピードで編集しよう！」がとても魅力的に感じ、手に取ったのを覚えています。

本書の「TIP7：埃を払って一息つこう」というセクションでは、Vimを初めて使う人に向けて、VimのNormal ModeとDefault Modeの違いを画家の例えで解説しています。この説明が非常に印象的で、画家がキャンバスに絵を描くようにプログラマがコードを書くという比喩が、非常にかっこよく感じられました。

これが、今でも私がVimに魅了され続けている理由です。

# エンジニアになって
大学を卒業してモバイルアプリエンジニアとして働き始めてからも、Vimを使い続けています。しかし、モバイルアプリ開発の特性上、Vimをフル活用して開発するのは難しいのが現実です。


モバイルアプリの開発では、以下のように使用するエディタ（IDE）がほぼ決まっています：

- iOS: Xcode
- Android: Android Studio

これらのIDEには、それぞれ特有の機能があり、Vimだけでの開発は困難です。たとえば、iOS開発では一部の機能がIDEにしか実装されていないため、Vimを使う機会は限られます。

それでも、Xcodeには「Vim mode」、Android Studioには「IdeaVim」というプラグインが用意されているため、これらを使ってVimの操作感を維持しながら開発を行っています。

## Vim mode について
Xcode に標準搭載されている機能です。
導入方法は簡単でメニューバーから、

Editor > Vim Mode

にチェックを入れると、Vimのキー操作でエディタを編集することができます。

## IdeaVim について
https://plugins.jetbrains.com/plugin/164-ideavim

IdeaVimはJetBrains系のIDE向けに提供されているプラグインです。
こちらも導入方法は簡単で、AndroidStudioの場合、

Plugins > Marketplace

から、"IdeaVim"と入力すると出てきます。これを Install するだけで、簡単に Vim 環境を作成することができます。

# 最後に
Xcode の Vim mode も、AndroidStudio の IdeaVim も本家のVim, NeoVim に比べたら出来ないことはたくさんあるでしょう。
しかし、Vimのキーバインドというのは作業効率を格段にあげてくれるものだと思っています。

最近ですと、モバイルアプリ開発ではFlutterがホットになりつつあります。FlutterはNeovimのプラグインが存在するので、そろそろ本家Vimでモバイルアプリの開発ができる時代がやってくるのかなぁ〜

https://github.com/akinsho/flutter-tools.nvim
Summer 24関連での問題

+ [バージョンアップ後の問題に戻る](https://qiita.com/Keiji_otsubo/items/9378da147ce69501926b)

------------------------
+ [参照 ID の無効化および Lightning スレッドへの切り替え](https://qiita.com/Keiji_otsubo/items/a2bd176d0b2f07504d87)
+ [新しい設定ドメインの準備](https://help.salesforce.com/s/articleView?id=release-notes.rn_general_setup_domain_prepare.htm&release=246&type=5)
+ [メール検証要件を満たすためのメールアドレスの検証 summer 24](https://qiita.com/Keiji_otsubo/items/b6ee93f6973dba205e9a)
+ [Summer 24 適用後のUIの変更（バグ？）](https://qiita.com/Keiji_otsubo/items/d4d9dc2051d61ac7d1a1)

+ [リストビューの「表示ラベルを編集」機能について](https://qiita.com/Keiji_otsubo/items/4e2283c381df49050fbd)
+ [Unable to select Price Book on an Opportunity, returns error: ‘Failed to retrieve the list of Price Books. Please try again’.](https://issues.salesforce.com/issue/a028c00000zINzm/unable-to-select-price-book-on-an-opportunity-returns-error-failed-to-retrieve-the-list-of-price-books-please-try-again)
+ [Summer '24 - ルックアップ詳細検索の数式フィールドは、IMAGE、HYPERLINK、BR 演算子をサポートしていません](https://issues.salesforce.com/issue/a028c00000zIOIXAA4/summer-24--formula-fields-in-lookup-advanced-search-do-not-support-image-hyperlink-br-operators)
+ [【既知の問題】Screen Flow not accepting assignment to record variables: "Enter a valid value"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clZCW)


+ [フローのレコードの登録画面が少し変わっている](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm0Yv)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/d5c0805d-a7ab-e409-221f-ded981bd535c.png)


+ [Getting an error saying record not found when trying to log a call from a cadence step](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007cm6lW)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/53a8b4f7-15b7-a90c-4738-159f0c55e44c.png)


+ [We couldn't add the product to Quote because the product doesn't have a price. Ask your Salesforce admin for help.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoYui)
+ [Revenue Lifecycle Management - Pricing / Product bug , couldn't add products while configuring.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoYui)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cc9f12b6-a865-0e56-d36f-1daba9dfa6ab.png)


:::note
機能の中断 - 商談ページの価格表エラー
https://issues.salesforce.com/issue/a028c00000zINzm/unable-to-select-price-book-on-an-opportunity-returns-error-failed-to-retrieve-the-list-of-price-books-please-try-again


別の回答がある

[Revenue Lifecycle Management - Pricing / Product bug - Couldn't add product on Quote Line while configuring.](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54V00007eqJXB)
:::

+ [How can I add products in Cart in b2b commerce cloud ?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007A2O3S)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f3973625-452c-75a0-9403-542d06ea5573.png)
Debian に新しめの Git を入れる

Debian Backports リポジトリを使ってみたっていうだけの話。

## 背景
最近は Visual Studio Code + DevContainer で開発していて、DevContainer には Debian ベースのイメージを使うことが多い。


2024年7月現在での Debian の最新バージョンは 12 (bookworm) だが、ベースイメージとして Debian を使用している各種ソフトウェアの公式イメージではまだ 11 (bullseye) をベースにしているケースも珍しくない。

例えば [Bun の公式イメージ](https://hub.docker.com/r/oven/bun) は2024年7月時点では bullseye をベースにしている。

``` console
$ docker run --rm oven/bun cat /etc/debian_version
11.10
```

## 困ること
当たり前だが、bullseye は少し前のバージョンなので Git のバージョンが少し古い。

``` console
$ docker run --rm -it debian:11
root@4570cc5481d8:/# apt update && apt install git
(略)
root@4570cc5481d8:/# git --version
git version 2.30.2
```

ほとんどの場合では Git のバージョンが少し古くても困らないが、今回は **コミットを SSH 鍵で署名できない** ことに困った。Git が SSH 鍵による署名をサポートしているのはバージョン 2.34 以降なので、bullseye の安定版リポジトリから入る Git では SSH 鍵による署名ができない。(※ bookworm なら version 2.39 が入るので問題にならない)

Git の新しめのバージョンを入れるには「Git をソースからビルドする」「違うパッケージリポジトリから入れる」の2択が思いつくが、なんで Git を入れたいだけなのにソースからビルドしなきゃいかんのじゃという気持ちになるので後者を検討する。

## Debian Backports を使う
Debian には [Backports](https://backports.debian.org) というリポジトリが用意されていて、これを使うとひとつ次のバージョンのパッケージを入れることができる。例えば bullseye-backports を使うと bookworm に入っているパッケージをインストールできる。

``` Dockerfile:Dockerfile
FROM oven/bun:1-debian

RUN export $(cat /etc/os-release | grep VERSION_CODENAME) \
 && echo "deb http://deb.debian.org/debian ${VERSION_CODENAME}-backports main" >> /etc/apt/sources.list \
 && apt update \
 && apt install -y --no-install-recommends -t ${VERSION_CODENAME}-backports git
```

こういう感じの Dockerfile を書けば、ベースイメージの Debian が bullseye でも bookworm のパッケージが利用できそう。

``` console
root@4b6dcb8837f6:~# git --version
git version 2.39.2
```

バージョンが上がった。めでたしめでたし。

※ Git で SSH 鍵署名をするためには、他にも openssh-client も入れる必要があった。
異なるデータ型のフィールドをキーにしてテーブルを結合する(SPSS Modeler データ加工逆引き6-13)

# 異なるデータ型のフィールドをキーにしてテーブルを結合する

![スクリーンショット 2024-07-26 9.23.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4f9bd7db-03a0-2943-a885-c47d081de619.png)

## 1.想定される利用目的

・テーブルを結合する際にキーのデータ型が異なっている場合の対処

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/raw/main/diff_type.str

## 3.サンプルストリームの説明

![スクリーンショット 2024-07-24 12.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/131f956b-563f-c495-041f-7e656d263115.png)

a.入力するデータのひとつめは以下の通りです。[顧客ID]が右寄せのため[整数]型
![スクリーンショット 2024-07-24 12.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5b719a04-25e1-1b85-ac61-119afbfa4d88.png)

 [顧客ID]のデータ型が[整数]だと確認できます。
![スクリーンショット 2024-07-24 12.52.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9cb55f00-93c9-af19-82bb-aa3dae205b44.png)


b.入力するデータふたつめは以下の通りです。[顧客ID]が左寄せのため[文字列]型
![スクリーンショット 2024-07-24 12.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7cb6e883-5ae4-e307-0394-0fad74d85eab.png)

 [顧客ID]のデータ型が[文字列]だと確認できます。
 ![スクリーンショット 2024-07-24 12.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e1786cab-59fe-9ef9-62d4-e57a5d98eb2c.png)


#### [整数]と[文字列]のフィールド（列）をキーにするとエラーが起きる

c.[レコード結合]ノードを編集します。
![スクリーンショット 2024-07-24 12.51.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c819dabd-305b-2e0f-4cbf-9d7285e762ce.png)

[テーブル]を実行します。エラー画面が表示されます。
![スクリーンショット 2024-07-24 12.51.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3d76e230-7aef-e772-71ab-ab3bc7c517e0.png)

#### エラーを回避するためにデータ型を一致する

d.[置換]ノードを編集します。
![スクリーンショット 2024-07-24 14.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3e556825-e36f-1bd3-49a9-818d3f50f843.png)

[テーブル]を実行します。
![スクリーンショット 2024-07-24 14.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/2f6fa23a-ebe7-4569-82a7-8004a64f0a63.png)


#### 注意事項

文字列を整数化すると[001]が[1]になり実態が変化するため、例の通り整数を文字列化する方をお勧めします。

## 4.参考情報

#### レコード結合を解説した記事

https://qiita.com/416nishimaki/items/be61a82c12cd83558def

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
色覚障害に配慮したUI設計

## はじめ
私は色覚異常（赤と緑）をもっています。
（割合的には、男性で20人に一人、女性で500人に一人、といわれているそう）
日常生活では問題ないが、焼肉屋に行くと肉が焼けているかどうかの判断がつかず、連れに「それまだ赤いよ？」とたまに言われてます。

生活していて支障をきたすほどではないものの、webサイトや広告で「色覚に配慮しています」と一言記載があると嬉しいものです。
これ提案した人気が利いていて絶対いい人じゃん！と思います。

## 開発者ツール
開発者ツールから色覚特性シミュレーション機能を通して、いくつかの見え方を体験できるようになっています。

[参考資料・見方の流れ](https://accessible-usable.net/2021/07/entry_210711.html)

https://accessible-usable.net/2021/07/entry_210711.html

FirefoxやMicrosoft Edge、Safariでも色覚異常のシミュレーションを試せるようなのでぜひ！参考になれば幸いです。
【Windows】ZIP形式の圧縮ファイルにする際同名フォルダが入れ子にならないやり方

## はじめに
ZIP形式で圧縮してファイルを連携したいときに、ただの資料連携であればフォルダ構成を気にしなくていいのですが、フォルダ構成を崩してはいけない場合は毎回苦戦していました。
備忘録として、同名フォルダが入れ子にならないよう圧縮する方法を記事にしようと思います。

## 該当フォルダをそのままZIP形式で圧縮すると。。
前提として、以下のフォルダ構成と仮定します。
※ "..." は、デスクトップなどと読み替えていただけたらと思います。

フォルダ"Crane"の中に、Excel"Crane.xlsx"が格納されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/49efeafd-ba93-6286-9fa6-525ed6b22f97.png)

フォルダ"Crane"を右クリックして"ZIPファイルに圧縮する"を押下すると、ZIP"Crane"の配下にフォルダ"Crane"がある状態で、フォルダが入れ子になってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/03c910eb-7944-9814-3857-d2b89ca0f068.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/342d08e2-3d66-ce37-8641-0e0f4f8d9c88.png)

理想として、ZIP"Crane"の下にExcel"Crane.xlsx"が格納されている構成の場合は、別の方法でやる必要があります。

## 同名フォルダが入れ子にならないZIP形式で圧縮する方法
フォルダ"Crane"ではなく、Excel"Crane.xlsx"を右クリックして"ZIPファイルに圧縮する"を押下すると、ZIP"Crane"の下にExcel"Crane.xlsx"が格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/51ff0c81-1851-a718-38f7-bf62f60931ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/8d117ce0-dbdc-804f-b490-8dfd87ef3c93.png)

このようにすると本来のフォルダ構成を維持できるので、なにかのツールに取り込みたいときや解凍した際に想定のフォルダ構成ができます。

## 最後に
今回は、同名フォルダが入れ子にならないよう圧縮する方法をご紹介いたしました。
もっと簡単な方法がありましたら教えていただけると嬉しいです！

最後までお読みいただき、ありがとうございました:bulb: