OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforceでフローを作成しよう～商談作成時に特定の商品（商談商品）を自動作成

こんにちは
本橋孝昭です

今回は
・Salesforceで商談レコードを作成する
・その商談レコードを作成した後に商品（商談商品レコード）を自動作成

をフローで対応する方法をお伝えします

このフローを作成すれば
・確実に商談作成時に商品Aを紐づけた状態で提案する

のような商談がある場合に便利になります

なお、Salesforce公式的なヘルプではプロセスビルダーの作成方法はありましたが現時点ではフローでの作成方法は無いようです

新規商談への商品の自動追加
https://help.salesforce.com/s/articleView?id=000383846&type=1&_ga=2.34548257.1426204710.1693707797-68402666.1690424875

# ステップ１　自動で作成したい商品のURLから商品IDを取得

まずは自動で作成したい商品のURLから商品IDを取得しましょう。
方法はとても簡単です。
商品のURLから「01t」で始まる15桁のIDを取得します

例として
https://mindful-unicorn-326r3a-dev-ed.trailblaze.lightning.force.com/lightning/r/Product2/01t5j000008HuUaAAK/view
　のようなURLの場合、
商品IDは
01t5j000008HuUaAAK
です
![商品001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e24b6adb-b9b2-df17-016c-89834d9ad3db.png)

# ステップ2 価格表エントリIDを取得しよう

商品には価格表と紐づいてないと商談で商品を紐づけることはそもそもできません

商品オブジェクトと価格表オブジェクトには直接的になつながりはなく、「価格表エントリ」オブジェクトにより商品オブジェクトと価格表オブジェクトはつながりがあります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cb101046-bf43-e254-33da-5f30e28cfb35.png)

※価格表エントリの詳細についてはこちらをクリックしてください

https://qiita.com/Takaa/items/75c2b39eb08ec79aec48

 価格表エントリのID取得方法はいくつかあるかと思いますが１つの方法としてレポートによるID取得があります

例としてまずはこのような

価格表 (A)
 少なくとも 1 つの関連レコードが存在する: 価格表エントリ (B)
のレポートタイプを作成します
![レポートタイプ１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2e993481-46a6-9316-725e-46f48b56b8bc.png)

こちらのレポートタイプから価格表エントリオブジェクトのレコードIDを取得することが可能です

![価格表エントリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/4fdba099-1b5f-6bb4-0871-f0e3044eddbf.png)


# ステップ3 フローを作成しよう


さて、作成するフローはこのようになります

![フロー111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/54d894f0-7e4f-4e00-bb69-9b5a6ec6082a.png)

開始条件の設定はこちら
![フロー112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/67510d9f-65d4-8691-f8f2-f8b05fa542da.png)

レコード作成の設定はこちら

なお、レコード作成条件について
・商品ID（Product2ID）はステップ１で確認したものを記載
・価格表エントリID（PricebookEntryID）はステップ２で確認したものを記載

となります
他、数量Quantityなどは必須項目なのでお忘れなく
![フロー113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2ace8c56-cbfd-ed15-24b4-69750dc478f8.png)

あとはこのフローを保存し有効化すれば完了です

フロー作成お疲れ様でした。
AR Quick Lookを自動で再生させる

* model-viewer.jsを参考にした
* .usdzへの直リンクでも自動で起動する。

```html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>test</title>
       <script>
           window.onload=()=>{
               const modelUrl = new URL("test.usdz", self.location.toString());
               /*
               if (this.arScale === 'fixed') {
                   if (modelUrl.hash) {
                       modelUrl.hash += '&';
                   }
                   modelUrl.hash += 'allowsContentScaling=0';
               }*/

               const anchor = document.getElementById("hoge");
               anchor.setAttribute('rel', 'ar');
               const img = document.createElement('img');
               anchor.appendChild(img);
               anchor.setAttribute('href', modelUrl.toString());
               // attach anchor to shadow DOM to ensure iOS16 ARQL banner click message event propagation 
               anchor.style.display = 'none';
               if (!anchor.isConnected)
                   this.shadowRoot.appendChild(anchor);
               console.log('Attempting to present in AR with Quick Look...');
               anchor.click();
               anchor.removeChild(img);
           }
       </script>
    </head>
    <body>
        
        <a id="hoge"></a>
    </body>
</html>

```
Laravelでマイグレーションファイルを消してから作り直したい

Laravelでマイグレーションファイルを消してから作り直したいと思ったことはありませんか？

テーブルに変更や修正をしたい時、それをやるためのコマンドは用意されていますが、
変更や修正が多い場合など、いっそ初めから作り直した直したい時もあると思います。

それなら、マイグレーションファイルを手動で削除(ゴミ箱に移動)すればいいのでは？と
思うかもしれません。

しかし、マイグレート済みのファイルを単に削除してしまうとエラーになってしまいます。
今回は、エラーを回避しマイグレートファイルを削除して新しく作り直す方法を説明します。

ただし、この方法では既存テーブル全て削除しすることになるので、
もしテーブルの情報を消したくない場合はこの方法はつかませんのでご注意ください。

まずは、下記コマンドを実行します。
```
php artisan migrate:reset
```
これをすることで、これまでのマイグレートを全てロールバック(マイグレートを実施前の状態に戻す)
をしてくれます。これで、過去に実施した全てのマイグレートが無かったことになります。

ここで、作り直したいマイグレーションファイルを作成します。
やり方は通常と同じでOKです。
```
php artisan make:migration create_XXXX_table
```

続いて、下記コマンドを実行します。
```
php artisan migrate:fresh
```

これを実行することで、テーブルが削除されマイグレートをやり直してくれます。

seederでデータを作っている場合は下記コマンドでデータを作成しましょう
[参考]
https://qiita.com/Atsu_Tech/items/5d6a871424c1b9f32be7
```
php artisan db:seed
```

参考になれば幸いです。
Rails 7.0.7対応 その２ ActiveSupport (Fix to_s with no arguments not respecting custom :default formats)

# はじめに

こちらの記事はRails 7.0.7 バージョンアップ対応の第2弾です。
今回は`ActiveSupport`の`to_s`に関した変更[^1]について確認していきます。

なお、前回記事は[こちら](https://qiita.com/shi-tak/items/8874aed38d98a4d4bc12)となります。

# まとめ

デフォルトのフォーマットを指定しても、引数なしの`to_s`だと反映されないバグがありました。

v7.0.7では、引数なし`to_s`でもデフォルトのフォーマットが反映されるようになります。

デフォルトのフォーマットを利用している場合は、引数なしの`to_s`において反映されているか確認してください。
されていないときは、`to_s`を`to_fs`に修正してください。

# 経緯

Railsでは、いくつかのRuby組み込みクラスが拡張されています。例えば、`Object`クラスには`blank?`が追加されています。これらの拡張部分は`ActiveSupport`の`core_ext` [^3]にまとめられています。

今回のバージョンアップで対象となっているのは、`Time`クラスなどで拡張されている`to_s`となります。

上記の`to_s`はフォーマットを指定できるような拡張が施されていました。
このような拡張がされている一方で、Rubyの組み込みの`to_s`のパフォーマンスがv3.1で改善されました[^4]。Railsでも、その恩恵を享受したいところですが、上記の拡張が施されており叶いませんでした。

そこで、Rails v7からは、拡張の`to_s`を`to_formatted_s`(`to_fs`)に名称を変更することで、組み込みの部分と拡張部分のどちらも利用できるようになっています[^5]。


# 問題点

上記の`to_s`から`to_fs`の変更に当たって、既定のフォーマットを利用したものでデグレが発生しています。

ですが、`Time::DATE_FORMATS[:default] = "%Y/%m/%d"`のように既定のフォーマットを指定したとき、v6では引数なしの`to_s`でもフォーマットが適応されていたところを、v7ではフォーマットが適応されませんでした。

これは、v7では、引数なしの`to_s`はRubyの組み込みの`to_s`が呼ばれるようになったためです。

なお、フォーマットの引数あり(`to_s(:format)`)で利用していた場合は、問題なくフォーマットが適応されます。


# バージョンアップに伴う変更点

デフォルトのフォーマットが設定されている場合は、引数なし`to_s`でもデフォルトフォーマットが適応されるようになりました。

# 動作確認

`Time`を参考にして動作確認します。また、`to_s`に加えて`to_fs`も確認します。

なお、動作確認ようのコードはGithubで公開しております[^sample]。

## フォーマットなし

フォーマットなしで実行すると`to_s`、`to_fs`ともに同じ文字列を出力します。
```ruby:実装
time = Time.new(2000,1,1,11,0,0)

puts "without default format"
puts "Time#to_s:  " + time.to_s
puts "Time#to_fs: " + time.to_fs
```

```sh:結果
without default format
Time#to_s:  2000-01-01 11:00:00 +0900
Time#to_fs: 2000-01-01 11:00:00 +0900
```

## フォーマットあり

デフォルトのフォーマットを指定すると、v7.0.6ではフォーマットが反映されません。

```ruby: 実装
puts "with default format"
Time::DATE_FORMATS[:default] = "%Y年%m月%d日 %H時%M分%S秒"
puts "Time#to_s:  " + time.to_s
puts "Time#to_fs: " + time.to_fs
```

```sh: 結果 (v7.0.6)
with default format
Time#to_s:  2000-01-01 11:00:00 +0900
Time#to_fs: 2000年01月01日 11時00分00秒
```

```sh: 結果 (v7.0.7)
with default format
Time#to_s:  2000年01月01日 11時00分00秒
Time#to_fs: 2000年01月01日 11時00分00秒
```


一方で,`to_s(:default)`のように引数ありでデフォルトフォーマットを指定すれば、v7.0.6の`to_s`でもフォーマットが適応されます。

```ruby:実装
puts "Time#to_s(:default): " + time.to_s(:default)
```

```sh:結果 (v7.0.6)
Time#to_s(:default): 2000年01月01日 11時00分00秒
```

[^1]: [Merge pull request #48555 from skipkayhil/hm-fix-to-s-default](https://github.com/rails/rails/commit/fc719ff7a606988589d5350be3ac824bc60cb4d4)
[^2]: [rails/activesupport/lib/active_support/core_ext/](https://github.com/rails/rails/tree/v7.0.7/activesupport/lib/active_support/core_ext)
[^3]: [7.0.0.rc1](https://github.com/rails/rails/releases/tag/v7.0.0.rc1)
[^4]: [Optimize dynamic string interpolation for symbol/true/false/nil/0-9
](https://github.com/ruby/ruby/commit/b08dacfea39ad8da3f1fd7fdd0e4538cc892ec44)
[^sample]: [サンプルコード](https://github.com/shi-tak/rails_test/blob/main/README.md)
AWSマネジメントコンソールからS3にマルチパートアップロードした時の分割サイズについて

※2024年7月追記
S3のEタグ周りについては本記事を含んで下記の記事をシリーズとして投稿しています。

- [EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる（マルチパートアップロードなし）](https://qiita.com/SAITO_Keita/items/29cf207b969537b2b68b)
- [EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる（マルチパートアップロードあり）](https://qiita.com/SAITO_Keita/items/21f9b5390c3487ac9957)
- [AWSマネジメントコンソールからS3にマルチパートアップロードした時の分割サイズについて](https://qiita.com/SAITO_Keita/items/99691f77b00b07a193bf)
- [PowerShellでS3のEtagを計算してみる（暗号化なし＆SSE-S3&マルチパートアップロード対応）](https://qiita.com/SAITO_Keita/items/5cf16cc82c4e8fd0ee56)

追記おしまい

マネジメントコンソールからS3に暗号化なし or SSE-S3でマルチパートアップロードした場合。

[マルチパートアップロードにパートレベルのチェックサムを使用する](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums)

上記ドキュメントにある通り、分割したファイルごとにMD5を計算し、連結した値のMD5 と　ファイルの分割数をEタグに格納します。

このため、マネジメントコンソールからアップロードされたファイルのEタグをローカルのファイルから計算する事がででき。

これを計算するためには分割サイズが必要となりますが、この分割サイズの値がAWSのドキュメントには記載をみつける事ができませんでした。

2023年9月現在、AWSドキュメントでマネジメントコンソールからマルチパートアップロードでアップロードするファイルに関する記述は下記となりますが、ここにはマネジメントコンソールからは16MBより大きいファイルは分割されると閾値についてだけしか記述がなく、分割されるファイルサイズについては記載がありません。

[Content-MD5 と ETag を使用して、アップロードされたオブジェクトを検証する](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/checking-object-integrity.html#checking-object-integrity-md5)

>オブジェクトが Multipart Upload または Part Copy オペレーションによって作成された場合、暗号化の方法に関係なく、オブジェクトの ETag は MD5 ダイジェストではありません。オブジェクトが 16 MB より大きい場合、AWS Management Console はそのオブジェクトをマルチパートアップロードとしてアップロードまたはコピーするため、ETag は MD5 ダイジェストではありません。

このためスクリプトを書いて、分割サイズを総当りで計算してみた所、マネジメントコンソールからアップロードしたファイルは下記のサイズで分割されている事がわかりました。

`17179870 Byte`

このマジックナンバーについてぐぐってみると、下記のように言及しているページがありました。

[How many exact bytes does each S3 multi-part upload have](https://devops.yes.ph/17179870-it-is-c8f4b6e4da46)

[AWS S3 File Part Sizes](https://stackoverflow.com/a/76136038)

[What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?](https://stackoverflow.com/a/65063606)

16 MiB は 16777216 Byte　で　17 MiB は　17825792 Byteとなるため。
16 MiBよりは大きくて、17 MiBよりは小さい数字となっています。

何か意味がある数字なんでしょうが、由来については調べきれませんでした。

int32の最大値2147483647を125で割ると`17179869.176`となって近い数字になったりするなとは思いつきますが。
それっぽい理屈が思いつきませんでした。

## 総評

マネジメントコンソールからアップロードする場合、`17179870 Byte`でファイル分割される事がわかりましたが。
なぜ`17179870 Byte`で分割してるのかはよくわかりませんでした。

が、この数字を使えばマネジメントコンソールから暗号化なし　もしくは　SSE-S3でファイルをマルチパートアップロードした場合については、Eタグについて計算することができます。

他の形式（SSE-C、SSE-KMS）についてはどのような計算方式かは公開されていない？　ので計算はできません。

この場合は下記の機能を利用しましょう。

[Amazon S3 向け、追加のチェックサムアルゴリズム](https://aws.amazon.com/jp/blogs/news/new-additional-checksum-algorithms-for-amazon-s3/)
PL/SQL③　データ型の参照

### 処理の流れ

%TYPE属性で既存テーブルの列のデータ型を参照する。

### ソースコード(処理結果含む)

```
DECLARE
      vardeptno dept.deptno%TYPE;
BEGIN
      SELECT deptno INTO vardeptno FROM dept WHERE loc = 'NEW YORK';
      DBMS_OUTPUT.PUT_LINE(var);
END;
/
10
```
deptテーブルに入っているこのデータを検索し変数vardeptnoに代入
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/9f21fee8-494a-7021-62ba-3b508a815f52.png)

**dept.deptno%TYPE**

deptテーブルdeptno列のデータ型を%TYPEにより参照。
パスカルの三角形をOracle SQLで実装した

お仕事の休憩時間に頭の体操で作成したので、お炊き上げです(´・ω・`)

パスカルの三角形をOracle SQLで実装しました。実用性は正直ないです。SQLでここまでできるとも言えますし、こんなSQLを書いてはいけませんともいえます。

なお環境はOracle Database 19cになります。

```SQL
WITH
seq (n) AS (
    SELECT 1 FROM DUAL
  UNION ALL
    SELECT n+1 FROM seq WHERE n <= 10
),
triangle (x, vals) AS (
      SELECT 1, ',1,' FROM DUAL
    UNION ALL
      SELECT 
        x+1,
        (SELECT ',' || LISTAGG(
           CASE WHEN n=1 OR n=x+1 THEN
             '1'
           ELSE
             TO_CHAR(  TO_NUMBER(SUBSTR(vals, INSTR(vals, ',', 1, n-1)+1, INSTR(vals, ',', 1, n)  -INSTR(vals, ',', 1, n-1)-1))
                     + TO_NUMBER(SUBSTR(vals, INSTR(vals, ',', 1, n  )+1, INSTR(vals, ',', 1, n+1)-INSTR(vals, ',', 1, n  )-1)))
           END, ',') WITHIN GROUP(ORDER BY n) || ',' 
         FROM seq
         WHERE n <= x+1)
      FROM triangle
      WHERE x <= 10
)
SELECT SUBSTR(vals, 2, LENGTH(vals)-2) AS " Pascal's triangle" FROM triangle ORDER BY x;
```

実行結果は以下の通りです。

|Pascal's triangle|
|:-|
|1|
|1,1|
|1,2,1|
|1,3,3,1|
|1,4,6,4,1|
|1,5,10,10,5,1|
|1,6,15,20,15,6,1|
|1,7,21,35,35,21,7,1|
|1,8,28,56,70,56,28,8,1|
|1,9,36,84,126,126,84,36,9,1|
|1,10,45,120,210,252,210,120,45,10,1|
nmcliを使って静的ルーティングを設定する


## 静的ルーティングを設定する
ubuntuに静的ルーティングを設定したので、そのメモ。

## nmcliを使って静的ルーティングを設定する
特定のIPアドレスの場合にwifiを通過させたいってことがあって、手持ちのubuntuに設定した。

## 手順とか諸々


### 接続しているネットワークインターフェースの名前の確認

```bash
nmcli connection show 

# こんな感じで出てくる
NAME             UUID TYPE      DEVICE          
有線接続 1       ***  ethernet  eno1            
mywifi           ***  wifi      wlp3s0          
docker0          ***  bridge    docker0       

```

### wifiのゲートウェイアドレスを確認する
nmcliの結果のDEVICEの名前を使って、ゲートウェイアドレスを確認する
この場合, 192.168.20.1とわかる


```bash 
ip route show

# こんな感じで出てくる
default via 192.168.3.1 dev eno1 proto static metric 100 
default via 192.168.20.1 dev wlp3s0 proto dhcp metric 20600 
```


### 特定のIPアドレスの場合にwifiを通過させる設定をする
nmcliで表示されたNAME(mywifi)に対して +ipv4.routesを設定する。
-ip4.routesにするとルートの削除になる。
設定後、再起動すると設定が反映される。

↓は192.168.39.*のアドレスへのアクセスをmywifiを通過させるようにする例

```bash
nmcli connection modify mywifi +ipv4.routes "192.168.39.0/24 192.168.20.1"

#設定を反映させる
nmcli connection down mywifi
nmcli connection up mywifi
```

### ルーティングできているか確認する

```bash
ip route show

#この行があればOK
192.168.39.0/24 via 192.168.20.1 dev wlp3s0 proto static metric 600 
```

## nmcliコマンドだと永続的になる

ipコマンド、routeコマンドでもルーティング設定はできるけど、再起動すると消えてしまうけど、
nmcliは永続的になるので、再起動しても設定が残る。
wifiの設定とかGUIで見たりするよりもnmcliを使った方が楽かもしれない
Unityで2Dゲームの新規プロジェクト作成・設定（Android向け）

# 環境

* Unityエディター 2022.3.9f1

# 前提

* Unity開発環境のセットアップが完了していること
  * https://qiita.com/yiwa81/items/0f00e5e931d74e1e1d65

# 新規プロジェクト作成

* Unity Hubを開く
* プロジェクト > 新しいプロジェクト を選択
* New project画面で以下を実行
  * プロジェクト名を記入
  * 以下のいずれかを選択
    * 2D
      * ビルトインレンダーパイプラインを用いる
        * 簡易さ、古いアセットとの互換性がメリット
    * 2D(URP) 
      * ユニバーサルレンダーパイプラインを用いる
        * 表現の豊かさ、負荷の軽さがメリット
      * 基本的にはこれを選択
    * 2D Mobile
      * ビルトインレンダーパイプラインを用いる
        * 簡易さ、古いアセットとの互換性がメリット
      * モバイル開発のための推奨パッケージ及び設定が予め準備される
  * 「プロジェクトを作成」をクリック

# プロジェクト設定

Unityエディターでプロジェクトが開かれたら、以下の設定を行う。
* Android向けビルドの設定
  * File > Build Settingsを選択
  * Build Settings画面でAndroidを選択し、Switch Platformをクリック
* 画面の向きの設定
  * Edit > Project Settingsを選択
  * Project Settings画面でPlayer > Resolution and Presentation > Orientation > Default Orientationに以下のいずれかを指定
    * Portrait：縦向き
    * PortraitUpsideDown：縦向き（上下反転）
    * LandscapeLeft：横向き（縦向きから左へ90°回転）
    * LandscapeRight：横向き（縦向きから右へ90°回転）
    * AutoRotation：自動回転
* Gameウィンドウのアスペクトの設定
  * Gameウィンドウを選択し、アスペクトを設定
    * Free Aspect: 自由比率
    * 16:9 Portrait: 16:9縦向き
      * スマホでよく使われる
Excel　VBA geojsonを出力させる

# Word VBAと同じように
https://qiita.com/Q11Q/items/da6679fb751ce5db262d
こちらと同じように、Excelで既存のJsonを修正してあらたなgeojsonファイルを出力させることを目的としています。

# geojsonをコピペする
Excelを起動する
メモ帳でgeojsonファイルを開く
すべて選択
Excelに貼り付け
データはすべてA列に入るようです。
そこで、すべてA列に入ったとして、修正等をおこなったあと、以下のコードを実行してあらたなgeojsonファイルを作成するというものです。

```vb
Sub ExportGeoJason()
'https://qiita.com/kou_tana77/items/66b14c7649792c9703d8
' For Microsoft Excel
' 現在開いている Excel WorksheetにコピペしたGeoJsonを編集している
' GeoJasonを編集したあとに実行し、新たなGeoJsonファイルを作成する。
' Json形式に整形する機能はない
' 文字コード 65001 改行　vbLF BOMなし UTF-8Nと言われる場合もある。
' 参照設定　VBScript Regular expression 5.5,
           ' Microsoft Scripting Runtime
           ' Microsoft ActiveX Data Object 6.1
Const OutPutFolder = "C:¥hoge"
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet: Set ws = ActiveSheet
Dim iRow  As Long, iCol As Long, LastRow As Long
Dim sr As New ADODB.Stream
Dim sr2 As New ADODB.Stream
Dim Reg As New RegExp, iM As Long, M As Match, MC As MatchCollection, sBs As SubMatches
Dim FSO As New Scripting.FileSystemObject, oFile As File, oFolder As Folder, TS As TextStream
Dim buf As String, arB() As Byte, sPath As String, var
LastRow = ws.Range("A" & Rows.Count).End(xlUp).Row
For iRow = 1 To LastRow
If iRow = LastRow Then
buf = buf & Cells(iRow, 1).Value
Else
buf = buf & Cells(iRow, 1).Value & vbLf
End If
Next
sPath = FSO.BuildPath(OutPutFolder, "gsi" & Format(Now, "yyyyMMddHhmmss") & ".geojson")
With sr
.LineSeparator = adLF
.Type = adTypeText
.Mode = adModeReadWrite
.Charset = "UTF-8"
.Open
.WriteText buf, adWriteChar
        .Position = 0
        .Type = adTypeBinary
        .Position = 3
        var = .Read() ' Byte列のコードは失敗　Variantは成功
        .Position = 0
        .Write var
        .SetEOS
        .SaveToFile sPath, adSaveCreateNotExist
End With
End Sub
```

# はまった点
BOMを消すときにByte型の配列を使う例は失敗していた。ヴァリアントにすると成功した。

# あくまでも整形されたgeojson用
Wordと同じく、いったん整形されたgeojsonを少し編集するという目的で作られている。
このためデータを一から作って出力するものではない。
ただ、このような出力方法であれば少なくとも文字コード、改行コード、BOMについては正しくなる。
怖いのは文字列の中に改行があるかどうかであるが、今後規格が変わっていく可能性はあるが2023年現在のgeojsonのデータはそこまで複雑なものはない。
ベジェ曲線で描く円の面積

### ベジェ曲線で円弧を描く

コンピュータグラフィックスで滑らかな曲線を描くのに利用される[ベジェ曲線（Bézier Curve）](https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%B8%E3%82%A7%E6%9B%B2%E7%B7%9A)を用いて円（1/4円弧）を描きます。3次ベジェ曲線を用いるので制御点は4つになります。[「ベジェ曲線の定義と4つの性質（高校数学の美しい物語）」](https://manabitimes.jp/math/2530) で紹介されている以下の２つを用いると4つの制御点は$[1,0],[1,v],[v,1],[0,1]$と表せることが分かるのでこの$v$を求めることを考えます。

* ベジェ曲線の端点
* ベジェ曲線の端点で進む向き

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/72060f45-a7fa-31c1-5751-fca94d07a313.png)


### ベジェ曲線の式

ベジェ曲線は一般には以下のように表され、今回は$N=3$のケースです。

```math
\vec{p}(t) = \sum_{k=0}^{N}\binom{N}{k}t^k(1-t)^{N-k}\vec{p_k}
```

これをそのままpythonのコードにします。**bzr_xy**は制御点のリストを渡すと$[x,y]$を$t$の式として返します。下の例では$v=0.5$として4点を渡して$[x,y]$の式を$t$を変数として得ています。この式を元にして$t=[0..1]$で描いたのが上の図の緑の曲線です。青の線で描かれた円弧より少し内側になっているのが分かります。

```python 
import sympy as sp
import numpy as np
t, v = sp.symbols('t v')
def bzr_xy(p):
  N = len(p)-1
  return sum([sp.binomial(N,i)*(1-t)**(N-i)*t**i*p[i] for i in range(N+1)])

p = np.array([[1,0],[1,0.5],[0.5,1],[0,1]])
print(bzr_xy(p))

# [0.5*t**2*(3 - 3*t) + 3.0*t*(1 - t)**2 + 1.0*(1 - t)**3
#  1.0*t**3 + 1.0*t**2*(3 - 3*t) + 1.5*t*(1 - t)**2]
```

### 45度の半径が1となるようにvを求める

45度の直線$y=x$と円弧の交点は$(\frac{\sqrt{2}}{2},\frac{\sqrt{2}}{2})$となるはずなのでこれを条件として$v$を求めます。$v =  0.552284749830793$が求まりました。

```python
x, y = bzr_xy(np.array([[1,0],[1,v],[v,1],[0,1]]))
sol = sp.solve((x - sp.sqrt(2)/2, y - sp.sqrt(2)/2), (t,v))
v_value = sol[0][1].evalf()
print("v = ", v_value)
# v =  0.552284749830793
```

### ベジェ曲線の円の面積

この時の円の面積を求めます。$1/4$円の面積$A$は以下のように表されます。

```math 
A = \int_{0}^{1} y \,dx = \int_{1}^{0} y \frac{dx}{dt} \,dt
``` 

これをそのままsympyで書くと以下のようになります。面積の誤差は0.028%となりほぼ等しいことが分かります。

```python 
A = sp.integrate(y*sp.diff(x,t), (t, 1, 0))
A_value = A.subs(v,v_value)
print("A = ", A_value, ((A_value*4-sp.pi)*100/sp.pi).evalf())
# A =  0.785618083164127 0.0280010543603986
```
### 円の面積と等しくなる時のvを求める

さらに円の面積と等しくなる時の$v$をsympyを使って求めてみます。$A-\pi/4$=0として$v$を求めます。$v =  0.551778477804468$が求まりました。

```python 
eq = A - sp.pi/4
vs = sp.solve(eq,v)
print(vs[0].evalf())
# 0.551778477804468
```

（開発環境：Google Colab）

この考え方はProject Euler、Problem 363: Bézier Curvesを解くのに役に立ちます。
TypeScriptの "any" と "unknown"  の役割と違い

## any
- __役割__: any 型は TypeScript の型システムの一部を無効にするものです。変数が any 型の場合、その変数に対して任意の操作を行うことができ、コンパイラはそれをチェックしません。

- __主な使用ケース__: 既存の JavaScript コードを TypeScript に移行する場合や、他のライブラリやフレームワークとの互換性を持つために一時的に型チェックをスキップしたい場面で使用されます。

- __リスク__: any 型を使用すると、型の安全性が失われ、ランタイムエラーの原因となる可能性があります。

## unknown
- __役割__: unknown 型は最も厳格な型として考えられます。unknown 型の変数は存在は確定していますが、その型が何であるかは不明です。したがって、unknown 型の変数を直接操作することはできず、その型を具体的に確定させる必要があります。

- __主な使用ケース__: 外部のライブラリや API からのデータなど、型が不明確なものを扱う場面で使用されます。unknown 型を使用すると、データを使用する前に型を確認・確定することが強制され、安全にコードを書くことができます。

- __安全性__: unknown は型の安全性を高めるものです。unknown 型の変数を操作する前に、その変数の型を確定させる必要があります。


## any の例
```typescript
let dataAny: any;

dataAny = "Hello";
console.log(dataAny.toUpperCase());  // "HELLO"

dataAny = 42;
console.log(dataAny.toFixed(2));     // "42.00"

// any型なので、存在しないメソッドを呼び出してもコンパイルエラーにならない
// しかし、実行時にはエラーが発生する
console.log(dataAny.notExistingMethod()); 
```
上記の例では、dataAny は any 型なので、文字列メソッドや数値メソッドを問題なく呼び出すことができます。しかし、存在しないメソッドを呼び出しても、コンパイル時にエラーが発生しないというリスクがあります。


## unknown の例
``` typescript
let dataUnknown: unknown;

dataUnknown = "Hello";

// 直接文字列メソッドを呼び出すことはできない
// console.log(dataUnknown.toUpperCase()); // エラー

if (typeof dataUnknown === "string") {
    console.log(dataUnknown.toUpperCase()); // "HELLO"
}

dataUnknown = 42;

// 直接数値メソッドを呼び出すことはできない
// console.log(dataUnknown.toFixed(2)); // エラー

if (typeof dataUnknown === "number") {
    console.log(dataUnknown.toFixed(2)); // "42.00"
}
```
上記の例では、dataUnknown は unknown 型なので、型を確認しないとメソッドを呼び出すことはできません。したがって、typeof を使用して型をチェックすることで、メソッドを安全に呼び出すことができます。

## まとめ
- __any__ は型の制約を無視し、どんなメソッドやプロパティへのアクセスも許可します。しかし、これにはランタイムエラーを引き起こすリスクが伴います。
- __unknown__ は型が不明なデータを表現します。このデータを利用する前に、その型を確認・確定する必要があります。これにより、コードの安全性が高まります。
GitHub CodespacesでDeno開発するときの個人メモ


GitHub CodespacesでDenoで何か作る時に毎回設定忘れるのでメモです。

## VS Code設定

.vscode/settings.json

```settings.json
{
    "deno.enable": true,
    "deno.lint": true,
    "deno.unstable": true,
}
```

この辺入れてないとリンターエラーが

## GitHub Actions

DenoをGitHub Actionsで動かしたい時はこちら

```.github/workflows/deno.yml
name: 1日2回実行

on:
  push:
    branches: [ main ]
  schedule:
    - cron:  '0 0,12 * * *'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
        - uses: actions/checkout@master
        - uses: denoland/setup-deno@v1
          with:
            deno-version: v1.x

        # - run: deno run https://deno.land/std/examples/welcome.ts
        - name: run
          run: NOTION_TOKEN=${{ secrets.NOTION_TOKEN }} NOTION_KADAI_TEISYUTSU_DB_ID=${{ secrets.NOTION_KADAI_TEISYUTSU_DB_ID }} deno task start

        - name: git commit & push
          run: |
            git config core.filemode false
            if ! git diff --exit-code --quiet
            then
                git add --update
                git config user.name github-actions
                git config user.email action@github.com
                git commit -m "Commit by github-actions"
                git push https://${{github.actor}}:${{secrets.GITHUB_TOKEN}}@github.com/${{github.repository}}.git HEAD:${{github.ref}}
            fi
```

## deno.json

`deno.json`の書き方、npm script的な使い方のところをよく使う

```deno.json
{
    "tasks": {
        "start": "deno run --allow-read --allow-env --allow-net --allow-write main.ts",
        "deploy": "git add . && git commit -m 'init' && git push origin main"
    }
}
```

```
$ deno task start
```
【PowerShell】年月日フォルダをつくってみた

# 1．記事を読んでできるようになること
例えば、以下のような課題をサクッと解決できる。

* 2013年から2023年のフォルダを作って、各フォルダの中に1月～12月のフォルダを作りたい。
* さらに月フォルダの中に日数フォルダも作りたい。ただし、うるう年なども考慮して日数フォルダを作りたい。

# 2．処理の流れ
* 作成したい年月日の開始日と終了日を用意する。
* 開始日の年、月、日を取得し変数に格納する。
* 変数名のフォルダを作成する。
* 日付をインクリメントして終了日までフォルダ作成をループする。

# 3．作成したコード

```make_dateDir.ps1
#フォルダ作成先を設定
$path = "C:\Work\Test"
if (!(Test-Path $path)){
    New-Item $path -ItemType Directory | Out-Null
}

#作成するフォルダの開始日と終了日を設定
$start_day = [Datetime]"2013/01/01"
$stop_day = [Datetime]"2023/12/31"

#年月日フォルダ作成
for ($i = 0; $start_day.AddDays($i) -le $stop_day ; $i++) {
    $tmp_day = $start_day.AddDays($i).ToString("yyyyMMdd")
    $y = $tmp_day.Substring(0, 4)
    $m = $tmp_day.Substring(4, 2)
    $d = $tmp_day.Substring(6, 2)
    $dir = Join-Path $path $y | Join-Path -ChildPath $m | Join-Path -ChildPath $d
    if (!(Test-Path $dir)) {
        New-Item $dir -ItemType Directory | Out-Null
    }
}

```

# 4．できあがるもの
きちんと年月日ごとにフォルダが作成されたことが確認できる。
うるう年の対応もバッチリ。

<img width="390" alt="datedir_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015081/2a1cc215-a37e-34c5-3e79-750ed15bdcc8.png">

<img width="390" alt="datedir_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2015081/8e1cf996-ac3c-bcd7-89e4-f2bbb342b29a.png">

# 5．参照リンク

https://learn.microsoft.com/ja-jp/dotnet/api/system.datetime.adddays?view=net-7.0
CSS復習①

<h1>★Progateの初級でよく使ったCSS一覧</h1>

* <h2>1.フォントカラーを変える</h2>
```css
color:・・・;
```

* <h2>2.ボックスの背景カラーを変える</h2>
```css
background-color:・・・;
```

* <h2>3.フォントサイズを変える</h2>
```css
font-size:・・・px;
```

* <h2>4.フォントの種類</h2>
　※フォント名にスペースがある場合は、ダブルクォーテーションで囲む。
```css
font-family:・・・;
```

* <h2>5.ボックスの縦幅を決める</h2>

```css
height:・・・px;
```

* <h2>6.ボックスの横幅を決める</h2>

```css
width:・・・px;
```
なぜ型ガードが必要か？

## 型ガードとは？
型ガードは、ある変数が特定の型であるかどうかを確認する方法のことを指します。この確認を行うことで、その変数を安全に使用することができます。

## なぜ型ガードが必要か？
TypeScriptでは、変数が複数の型を持つ可能性がある場合があります。例えば、ある関数が文字列または数字を受け取る場合、その関数内でその値が文字列か数字かを確認しないと、エラーが発生する可能性があります。

### シンプルな例
考えてみてください。あなたがレストランに行って、「ハンバーガー」または「サラダ」を注文するとします。

もし「ハンバーガー」を注文した場合、あなたは「焼き加減」を選ぶことができます。
もし「サラダ」を注文した場合、あなたは「ドレッシング」を選ぶことができます。
この場面で、注文が「ハンバーガー」なのに「ドレッシング」を選ぼうとしたら、それは間違いですよね。ここで「注文が何か？」を確認するのが型ガードの役割です。

### TypeScriptのコードでの具体例
```typescript
type Order = 
    { type: 'burger', cookLevel: 'rare' | 'medium' | 'wellDone' }
    | { type: 'salad', dressing: 'ranch' | 'vinaigrette' };

function prepareOrder(order: Order) {
    // 型ガードの部分
    if (order.type === 'burger') {
        // ここではorderは確実にハンバーガーの注文です。
        console.log(`Making a burger cooked ${order.cookLevel}`);
    } else {
        // ここではorderは確実にサラダの注文です。
        console.log(`Making a salad with ${order.dressing} dressing`);
    }
}
```
上のコードの order.type === 'burger' の部分が型ガードです。これにより、それぞれのブロック内で order の型が確定します。

## typeof を型ガードとして使用
__typeof__ は JavaScript と TypeScript のキーワードであり、変数の「型」を取得するためのものです。
TypeScript において、typeof は型ガードとしても使用できます。これにより、特定のスコープ内で変数の型を狭めることができます。

例：

``` typescript
function processInput(input: string | number) {
    if (typeof input === "string") {
        // このブロック内では、input は確実に string 型です
        console.log(input.toUpperCase());
    } else {
        // このブロック内では、input は確実に number 型です
        console.log(input.toFixed(2));
    }
}
```
このように、typeof は JavaScript と TypeScript の両方で非常に便利なツールとして利用されます。特に TypeScript では、変数の型を動的にチェックするための強力な型ガードとしての役割も果たします。

### まとめ
型ガードは、変数の型を確定させるためのツールです。これにより、その変数を安全に使うことができ、間違った方法で使うことを防ぐことができます。ちょうどレストランで注文を確定させるようなものと考えるとわかりやすいかと思います。
HTMLを復習①

<h1>★Progateの初級でよく使ったHTML一覧</h1>

* <h2>1.見出し</h2>
見出しは基本的に段落が発生する。画面の主となるメッセージなどに用いる。

```html
<h1>見出し１</h1>
<h2>見出し2</h2>
<p>段落</p>
```
<h1>見出し１</h1>
<h2>見出し2</h2>
<p>段落</p>


* <h2>2.リンクの作成</h2>
リンク作成時は`<a>`要素と、URLと文字を用意する。
　※URLはダブルクォーテーション(")で囲むこと

```html
<a href="https://twitter.com/?lang=ja">ツイッター</a>
```
<a href="https://twitter.com/?lang=ja">ツイッター</a>



* <h2>3.img画像の貼り付け</h2>
`<img>`要素とimg画像のURLを用意する。
　※img画像のURLはダブルクォーテーションで囲むこと

```html
<img src="http://www.icon-surfer.com/wp-content/uploads/2014/02/1402122.png">
```
<img src="http://www.icon-surfer.com/wp-content/uploads/2014/02/1402122.png">

* <h2>4.リストの作成</h2>
囲む要素の内に`<li>`要素をネストする。
`<li>`要素は囲む要素によって先頭に・や数字がつく。(その他も可能性あり。)

```html
<ul>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
<ul/>
<ol>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
<ol/>
```
<ul>
 <li>リスト1</li>
 <li>リスト2</li>
 <li>リスト3</li>
<ul/>
<ol>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
<ol/>
SHAPのwaterfall図を複数配置する(How to draw multiple SHAP waterfalls)

SHAP の waterfall図を複数配置するにはこんな感じで書けます:

```sample.py
fig = plt.figure()
ax0 = fig.add_subplot(141)
shap.plots.waterfall(shap_values[1],  show=False)
ax1 = fig.add_subplot(142)
shap.plots.waterfall(shap_values[2],  show=False)
ax2 = fig.add_subplot(143)
shap.plots.waterfall(shap_values[3],  show=False)
ax3 = fig.add_subplot(144)
shap.plots.waterfall(shap_values[4],  show=False)
plt.gcf().set_size_inches(20,6) 
plt.tight_layout() 
plt.show()
```
[Python] Stringと数字を一緒に出力(f-String)

今日は簡単に**f-String**の使い方を勉強しましょう。

<Br>

```python
suji = 12

print("sujiは " + suji + "です。")   ## error
```

<br>

今までintとかfloatをstringと一緒にprint()関数の中で使うためにintをStringに変更して少し面倒くさいでした

```python
suji = 12

print("sujiは " + str(suji) + "です。")   ## sujiは 12です。
```
<Br>
<Br>

しかしf-Stringを使ったらもっと簡単にできます。
まずダブルクォーテーションの前にfを付きます。
そして使いたいintとかfloat関数名を{}の中に書きます。
```python
suji = 12

print(f"sujiは {suji}です。" ## sujiは 12です。
```


これでもっと簡単にprint関数を使えます。
以上です。
wp-env run cli wp shell

メール送信の動作確認できます

```bash
wp-env run cli wp shell
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/4e1a5dfd-152d-8db5-224d-d71b614b4daa.png)


https://techracho.bpsinc.jp/ebi/2023_01_10/126099

https://github.com/WordPress/gutenberg/issues/21301#issuecomment-631874047
簡単なサンプルRxJavaプロジェクトの始め方

RxJavaの勉強用に簡単にRxJavaが動かせるプロジェクトの作成手順です。

### ステップ1: Gradleでプロジェクトの作成

コマンドラインやターミナルを開き、以下のコマンドを実行して新しいプロジェクトを作成します。

```sh
gradle init --type java-application
```

途中でプロジェクトの名前や他のいくつかの設定について聞かれます。

### ステップ2: `build.gradle` ファイルの編集

プロジェクトが作成されたら、`build.gradle` ファイルを開き以下のように編集します。

```groovy
plugins {
    id 'java'
    id 'application'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'io.reactivex.rxjava3:rxjava:3.1.0'
    testImplementation 'junit:junit:4.13.2'
}

application {
    mainClassName = 'com.example.rxjava.App' // ここは書き換えてください！
}

sourceCompatibility = '1.8'
targetCompatibility = '1.8'
```

ここでは `io.reactivex.rxjava3:rxjava:3.1.0` を依存関係として追加し、メインクラス名を設定しています。
メインクラス名はご自身が設定しているものに変更してください。

### ステップ3: サンプルコードの作成

`src/main/java/com/example/rxjava` ディレクトリを作成し、その中に `App.java` という名前の新しいJavaファイルを作成します。次に、以下のコードを追加します。

```java
package com.example.rxjava;

import io.reactivex.rxjava3.core.Observable;

public class App {
    public static void main(String[] args) {
        Observable<String> observable = Observable.create(emitter -> {
            emitter.onNext("Hello");
            emitter.onNext("World");
            emitter.onComplete();
        });

        observable.subscribe(
                item -> System.out.println(item), // onNext
                throwable -> System.err.println("Error occurred!"), // onError
                () -> System.out.println("Done!") // onComplete
        );
    }
}
```

### ステップ4: プロジェクトのコンパイルと実行

ターミナルに戻って、以下のコマンドを実行してプロジェクトをコンパイルします。

```sh
gradle build
```

次に、以下のコマンドを実行してプログラムを実行します。

```sh
gradle run
```

これでプロジェクトのセットアップが完了しました。`gradle run` コマンドを実行すると、コンソールに "Hello"、"World"、"Done!" が表示されるはずです。

このファイルを編集するなりしてRxJavaの勉強をしていきましょう。
Ubuntu でうまく認識できないディスプレイ解像度を直す

 セカンダリディスプレイの解像度がうまく認識できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/92aaeeca-7ecf-d324-8f7b-a65915bf1328.png)

本来は HD解像度 (1366x768)であるのだが VGA 固定になってしまい選択肢が表示されない。

「Ubuntu で 4K Display @ThinkPad X230(Intel HD 4000 Graphics)」
https://qiita.com/nanbuwks/items/dc26353486df80660e1f 
では、4K解像度が表示されないのを xrandr で表示させましたが、同様に xrandr を使って対応します。

# 環境

- セカンダリディスプレイ Panasonic TH-L26X3 (1366x768) HDMI接続
- プライマリディスプレイ AIWA TV-43UF30H (4K 3840 x 2160) VGA接続
- AMD Ryzen 5 5600G with Radeon Graphics
- マザーボード Gigabyte B550M S2H (グラフィックポートはHDMI,VGA,DVI 出力を備える)
- Ubuntu 22.04 LTS + カーネル 6.3.13 

「Ubuntu 22.04 で画面が XGA になった」
https://qiita.com/nanbuwks/items/03898d781f885eb730bf
でインストールしたカーネルを使っています。



# xrandr でチェック

```
$ xrandr
Screen 0: minimum 320 x 200, current 4480 x 2160, maximum 16384 x 16384
HDMI-A-0 connected primary 3840x2160+640+0 (normal left inverted right x axis y axis) 698mm x 392mm
   3840x2160     60.00*+  50.00    59.94    30.00    25.00    24.00    29.97    23.98  
   4096x2160     60.00    50.00    59.94    30.00    25.00    24.00    29.97    23.98  
   1920x1200     60.00  
   1920x1080     60.00    50.00    59.94    30.00    25.00    24.00    29.97    23.98  
   1600x1200     60.00  
   1680x1050     60.00  
   1280x1024     60.00  
   1440x900      60.00  
   1366x768      59.79  
   1280x800      60.00  
   1280x720      60.00    50.00    59.94  
   1024x768      60.00  
   800x600       60.00  
   720x576       50.00  
   720x480       60.00    59.94  
   640x480       60.00    59.94  
HDMI-A-1 disconnected (normal left inverted right x axis y axis)
DisplayPort-0 connected 640x480+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   640x480       59.94* 
```

問題となっているセカンダリディスプレイはVGAポートにつなげてますが、xrandrの認識では DisplayPort になってますね。

# 最適解像度を登録

Panasonic TH-L26X3 の解像度は1366x768であり、HDMI-A-0 に使えそうなモードが表示されてますので、以下のように登録します。

```
$ xrandr --addmode DisplayPort-0 "1366x768"
```

# モードを作る場合

なお、もし使えそうなモードが表示されていないときには以下のようにしてモードを登録する必要があります。

まずは cvt でパラメータを計算します。

```
$ cvt 1366 768 60 
# 1368x768 59.88 Hz (CVT) hsync: 47.79 kHz; pclk: 85.25 MHz
Modeline "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
```

何故か、 水平解像度が 1368 になってますが、これを登録します。

```
$ xrandr --newmode Modeline "1368x768_60.00"   85.25  1368 1440 1576 1784  768 771 781 798 -hsync +vsync
$ xrandr --addmode DisplayPort-0 "1366x768_60.00"
```

# 解決

設定変更ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/72ebfbbe-63ec-4a4f-57a3-0ce7876cc11c.png)
Microsoft PowerBIをインストールするまでの流れ

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はタイトルにある通り、Microsoft製品のBIツールであるPowerBIをローカルにインストールしていきたいと思います。
近々で上記ツールを使用する必要があり、その備忘録的な感じでメモっておきたいと思います。

# 用語
## BIツール
BI（Business Intelligence、企業や部署が持つ膨大なデータの総称）を収集・集計・分析・可視化・ビジュアル化する為のツールです。
今回掲載しているPowerBIの他にTableau、Pentaho、Metabase、Google Data Studio等があるようです。

# 操作ログ
以下のサイトにアクセスします。

https://powerbi.microsoft.com/ja-jp/

画面にあるタブの、製品配下にあるPower BI Desktopを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f1e12bd7-d1a6-1799-cc13-5776021a118b.png)
以下の様な画面が表示されるので、無料でダウンロードするを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/6f18e88f-198b-8146-1f6f-a67b74dd273b.png)
Microsoft Storeが自動で開きます。入手を押下します。
ダウンロードが開始されます。
![002image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/60f0a1c9-d46f-80b1-41cc-a56b550552f6.png)
ダウンロード後、PowerBIを立ち上げてみると以下の様な画面が表示されます。
![003image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/8ab4ad48-dfc1-9135-3b57-cc62678a789e.png)


# ちなみに
Power BIのオンライン版？なるものがあるようでそちらにもアクセスを試みました。

右上にある、無料で試すを押下します。
![004image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/bb77f1e1-78fe-675d-5e5f-8f997e366c95.png)
以下の様な画面が表示されるので、会社で使っているメールアドレスを入力します。
※個人メールでは使用できないっぽいです。詳しくは調べてません。
![005image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/78a1f08f-293d-82ad-5cc8-2f36bb5b1e71.png)
上記の画面で個人で使用しているメールアドレスを入力すると、以下の様に組織のメールアドレスを使えってくれと怒られます。ここで組織のメールアドレスを入力してもOKです。
![006image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/7db8d8b4-88dc-9a28-5f37-9e78ac1374fb.png)
組織のメールアドレスと認識されると、以下の様にユーザ登録の画面が表示されます。
![007image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/cdaa023d-296e-345b-86aa-4c7b0bd5b0bb.png)
作成が成功すると以下の様な、作成完了の画面が表示されます。
![008image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/9859f497-e8ee-a683-5205-5c3c28d61837.png)
ログイン後の画面は以下の様です。無料で使い続けられるならこっちの方が良いなぁ…
![009image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/8e850fad-ac62-87dd-b26d-43a51dfc5e76.png)
TypeScriptのOptional Chaining（オプショナル・チェイニング）について

# optional Chaining（オプショナル・チェイニング）
Optional Chainingは、TypeScript 3.7やES2020 (ES11) で導入された機能であり、オブジェクトのネストされたプロパティに安全にアクセスする方法を提供します。

特に、オブジェクトのプロパティやメソッドが存在するかどうかを確認せずに直接アクセスしようとすると、エラーが発生する場合があります。Optional Chainingを使用すると、そのようなエラーを回避しながら簡潔にコードを書くことができます。

## 基本的な使用方法
``` typescript
const user = {
    info: {
        name: 'Alice',
        details: {
            age: 25
        }
    }
};

// 通常の方法でageにアクセス
const age1 = user && user.info && user.info.details && user.info.details.age;

// Optional Chainingを使用してageにアクセス
const age2 = user?.info?.details?.age;
```
上記の例では、age2 にアクセスする際に ?. 演算子を使用しています。これにより、各プロパティが存在する場合にのみアクセスし、存在しない場合は直ちに undefined を返します。

## 配列や関数の呼び出しでの使用
Optional Chainingは、配列の要素や関数/メソッドの呼び出しにも使用できます。

```typescript
const users = [{
    name: 'Bob',
    getAge: () => 30
}];

// 配列の要素に安全にアクセス
const userName = users[1]?.name; // undefined, 2番目の要素は存在しない

// メソッドの呼び出しに使用
const userAge = users[0]?.getAge?.(); // 30
```
### 注意点
Optional Chainingを過度に使用すると、コードが読みにくくなる場合があります。
Optional Chainingはnullやundefinedの場合に短絡しますが、空文字、0、falseなどの"falsy"な値で短絡するわけではありません。
### まとめ
Optional Chainingは、ネストされたプロパティやメソッドに安全にアクセスするための強力なツールです。存在しないプロパティやメソッドにアクセスしようとした際のエラーを簡潔な記述で回避することができます。
WindowsでJenkins(War版)セットアップ

# はじめに
Windows10でWarファイルを使用したJenkins構築時の備忘録です。JenkinsにはWindows用のインストラーが用意されており、通常はそちらを使用しますが、今回ExcelのVBAをJenkinsで使用するにあたって、VBA上で環境変数が取得できない問題があったため、Windowsのサービスを使用せず、Warファイルを使用した経緯があります。

# Javaのインストール
1. ダウンロード
    OpenJDK17を以下のサイトから、Windows版「openjdk-17+35_windows-x64_bin.zip」をダウンロードします。
    https://jdk.java.net/java-se-ri/17
2. インストール
    今回のJavaのインストール先は「C:\java」とするので、Cドライブ内に「java」フォルダを作成して、先ほどダウンロードしたOpenJDKを解凍して中身のファイルを「C:\java」内に入れます。
3. 環境変数の設定
    Windowsの環境変数のPathに「C:\java\bin」のパスを追加します。 
4.  起動確認
    コマンドプロンプトを起動して、「java —version」と入力して、パスが通ることを確認します。

# Jenkins(War版)のインストール
1. ダウンロード
    以下のダウンロードサイトの左列の Download Jenkins ○○○○ LTS for:欄の Generic J ava package(.war)をダウンロードする。
    https://www.jenkins.io/download/
2. インストール
    ダウンロードしたWarファイルを任意のフォルダに入れる。今回は「C:¥jenkins」とする。
3. セットアップ
    コマンドプロンプトを開き、warを入れたディレクトリに移動する
    ```bash
    > cd C:¥jenkins
    ```
    以下のコマンドでJenkinsを起動させる
    ```bash
    > java -jar jenkins.war
    ```
4. Jenkins のセットアップ
    以下のJenkinsのセットアップウィザードを参考にJenkinsの設定を行う。
    https://www.jenkins.io/doc/book/installing/war-file/#setup-wizard
# その他設定
## Jenkins起動コマンドのオプション設定
```bash
> java -Xmx1024m -jar jenkins.war --httpPort=8080
```
[Java オプション]
Xmx1024m:ヒープ・メモリ最大サイズ。1024 メガバイトが設定される。1gと書くことも可能です。
[Jenkins オプション]
--httpPort=8080:起動するポートの指定。ポート 8080 番を使用します。

[参考]
Java コマンド
https://docs.oracle.com/javase/jp/13/docs/specs/man/java.html
Xrs オプションについて
https://software.fujitsu.com/jp/manual/manualfiles/M090022/J2S18500/03Z2C/note03/note0142.htm
Java ヒープのチューニング
https://software.fujitsu.com/jp/manual/manualfiles/M080099/J2UZ9570/03Z2A/tun07/tun00120.htm

## Jenkinsの文字コードをutf-8に設定
システム環境変数に以下のパラメータを設定する。
変数名：JAVA_TOOL_OPTIONS
変数値：-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
TypeScriptのnever 型について




# never とは？
never は TypeScript の特殊な型の一つで、関数が決して正常に終了しないことを示す型です。具体的には、以下のような場面で never 型が使用されることが一般的です

- 関数が常にエラーをスローする。
- 関数が終了しない（例えば、無限ループ）。
### never 型の例
___常に例外をスローする関数___
```typescript
function throwError(message: string): never {
    throw new Error(message);
}

```

___無限ループを持つ関数___
```typescript
function infiniteLoop(): never {
    while (true) {}
}
```

### never の利用ケース
never 型は、他の型と組み合わせることで、コードの厳密な型チェックを強化するためにも使用されます。例えば、網羅的なチェックを行う場合などです。

以下は、never を使用して網羅的なチェックを行う例です：

``` typescript
// `Shape` という型を定義。
// この型は `circle` または `square` のどちらかの形状を持つことを示しています。
type Shape = 
    | { kind: 'circle', radius: number } // 円の場合、`radius`（半径）を持つ
    | { kind: 'square', sideLength: number }; // 正方形の場合、`sideLength`（一辺の長さ）を持つ

// `Shape` 型のオブジェクトを引数として受け取り、その面積を計算して返す関数
function getArea(shape: Shape): number {
    switch (shape.kind) {

        // 形状が円の場合の計算
        case 'circle':
            return Math.PI * shape.radius * shape.radius;
        // 形状が正方形の場合の計算
        case 'square':
            return shape.sideLength * shape.sideLength;
        // 上記のケース以外の場合
        default:
            // ここでの shape の型は `never` になります
            const _exhaustiveCheck: never = shape;
            return _exhaustiveCheck;
    }
}
```
上記の例では、もし将来的に Shape 型に新しい形状を追加して、それに対するケースを switch 文に追加しなかった場合、TypeScriptはエラーを報告してくれます。これは、default ケースで shape の型が never になるためです。

このように、never 型はコードが期待する動作をしているかを強化するための便利なツールとして使用されることが多いです。
電気回路の基礎とシミュレーション  --- 直流回路 ( 1 ) ---  ブリッジ回路

電気回路の教科書に紹介される定番の回路を下記の
https://www.falstad.com/circuit/circuitjs.html
回路シミュレータでシミュレーションしてみました。

まずはブリッジ回路です。
![Ex1_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3549839/df9a1463-0dda-788f-1094-404699a26364.png)
中央の枝路を流れる電流 $I$ は、$R5=0$ ( シミュレータの最小値は 1nΩ ) とすると、
$$I=\frac{R_2R_3-R_1R_4}{R_1R_2R_3+R_2R_3R_4+R_3R_4R_1+R_4R_1R_2}E$$

ブリッジの平衡条件である $I=0$ から
$$R_2R_3=R_1R_4$$

となります。平衡条件のもとでは $V_a=V_b$ でもあります。

回路図の抵抗シンボルにマウスポインタをおくと、マウスホイールで抵抗値の値を $E12$ 系列のステップで変えることができるので、平衡条件を満足させながら、あるいは平衡状態から外れたときの $I_0\sim I_5, V_a, V_b$ の値と電流の動きを観察してみてください。

( キルヒホッフの法則が成り立つようにシミュレータは作られているのでしょうが ) 注目するどの節点でもキルヒホッフの法則が成り立っていることを確認できます。

---
- $R_1\sim R_5, E$ の値は、抵抗や電源のシンボルをダブルクリックすると開く編集パネルで設定できます。
- シミュレーションを実行するには下記の回路ファイルをコピーして、シミュレータの File → Import From Text... で開くパネルに貼り付けてください。
```
$ 1 0.000005 10.20027730826997 50 5 50 5e-11
v 496 272 16 272 0 0 40 5 0 0 0.5
w 80 144 80 80 0
r 80 144 144 144 0 1000
r 80 16 144 16 0 1000
r 368 144 432 144 0 1000
r 368 16 432 16 0 1000
w 16 80 16 272 0
w 496 80 496 272 0
x 245 249 265 252 4 16 5V
x -2 85 8 88 4 16 A
x 502 85 512 88 4 16 B
370 144 16 224 16 1 0 0
370 144 144 224 144 1 0 0
370 256 16 256 64 1 0 2
370 288 16 368 16 1 0 0
370 288 144 368 144 1 0 0
w 80 80 80 16 0
w 432 80 432 16 0
w 432 144 432 80 0
w 432 80 496 80 0
370 16 80 80 80 1 0 0
x 103 41 123 44 4 16 R1
x 391 41 411 44 4 16 R2
x 101 169 121 172 4 16 R3
x 391 168 411 171 4 16 R4
x 36 59 52 62 4 16 I0
x 182 41 198 44 4 16 I1
x 326 38 342 41 4 16 I2
x 172 167 188 170 4 16 I3
x 325 168 341 171 4 16 I4
x 251 308 260 311 4 16 E
x 237 49 243 52 4 16 I
r 256 64 256 144 0 1000
x 222 111 242 114 4 16 R5
w 256 16 288 16 0
w 256 144 288 144 0
w 224 16 256 16 0
w 224 144 256 144 0
p 256 16 256 -48 3 0 0
p 256 144 256 208 3 0 0
g 256 208 240 208 0 0
g 256 -48 240 -48 0 0
g 496 272 496 288 0 0
x 271 -24 290 -21 4 16 Va
x 272 168 292 171 4 16 Vb
```
Ubuntu エラー対応MEMO

## はじめに
Ubuntu（主に18.04や20.04）での設定やエラー対応の忘備録になります


### 1. ユーザー権限関係
##### *** は sudoers ファイル内にありません。この事象は記録・報告されます。
VirtualBox に Ubuntu18.04 をインストール直後，自分に管理者権限がないことがあった
![Ubuntu_Add_sudoers0.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/65aca588-5209-4922-a342-c62d4f58949a.png)
このようにapt-getもできない

##### 対応
管理者権限取得
```ruby:
$ su -
```
※パスワードはインストール時に設定したものでOKだった

sudo権限設定
```ruby:
$ sudo visudo
```
sudors.tmp というファイルが開かれるので下記１行を追記する
「ryo」の部分をsudo権限を付与したいユーザー名に変更

![Ubuntu_Add_sudoers2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1962692/49b7bf82-7af8-3cf2-e01d-40fc7a4b220b.png)

保存して閉じる（Ctrl+X → Y）

元のユーザーに戻る
```ruby:
$ exit
```


### 2. dpkg が rock

##### Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend.
##### by process 2269 (unattended-upgr)... ***s


##### 対応
上記の「process 2269」をkill
```ruby:
$ sudo kill -9 2269
```




### 3. (随時更新)
Unity開発環境のセットアップ（Android向け）

# 環境

* OS: Windows 11 Home

# Unity Hubのセットアップ

## インストール

以下からセットアップバイナリをダウンロードする。
* https://unity.com/ja/download
  * Windows用ダウンロード

ダウンロードしたセットアップバイナリ（UnityHubSetup.exe）をダブルクリックしてインストールする。

## アカウント（Unity ID）の作成・サインイン

Unity Hubを起動する。

アカウント（Unity ID）を作成していない場合、作成する。
* Unity Hubで左上の人型アイコンをクリックし、「アカウントを作成」を選択
* 開いたウェブ画面でメールアドレス、パスワード等の必要事項を入力し、アカウント（Unity ID）を作成

作成したアカウントを用いて、Unity Hubでサインインする。
* Unity Hubで左上の人型アイコンをクリックし、「サインイン」を選択
* 開いたウェブ画面でメールアドレス、パスワードを入力し、サインイン

# Unityエディターのセットアップ

## インストール

Unity Hubで、Unityエディターをインストールする。
* 左ペインの「インストール」をクリックし、「エディターをインストール」を選択
* インストールしたいUnityエディターのバージョンを選び、「インストール」を選択
  * 例）正式リリース > 長期サポート > 2022.3.9f1(LTS)
* 加えたいモジュールを選択し、「次へ」をクリック
  * Microsoft Visual Studio Community
    * C#スクリプト編集に他のソフト（Visual Studio Code等）を使用したい場合は、チェックを外す
  * Android Build Support
    * Android向けアプリ・ゲームを作成する場合、チェックする
  * Android Build Support > OpenJDK
    * Android向けアプリ・ゲームを作成する場合、 チェックする
  * Android Build Support > Android SDK & NDK Tools
    * Android向けアプリ・ゲームを作成する場合、 チェックする
  * 言語パック > 日本語
    * UnityエディターのUIを日本語で表示したい場合、チェックする
* 利用規約への同意にチェックし、「インストール」をクリック
これが自分のブランチルールだ！


こんにちは。
みなさん，開発においてGitを使われています？
私はGitHubを使ってコードをGit管理しています。
おそらく多くの方はGit，特にGitHubを使われていると思うのですが，ブランチも一緒に使われていますか？
Gitは使ったことをあるけど，ブランチは使っていないという方も中にはいらっしゃるかもしれません。
今回はそのブランチの運用について我流の運用をお伝えします！

## 概要

- ブランチが使えると何が美味しい？
- 具体的にブランチをどう使い分ける？

## ブランチが使えると何が美味しい？

作業ごとにブランチを使い分けることで一番ありがたいことは後戻りができることです。
個人開発をしていると，自分は特にルーズなので，とりあえずこんな機能を作ってみよう！で実装してしまいます。
しかし，その実装に失敗した時にメインのコードをいじっていると後戻りするのも大変ですよね。
加えて，その後戻り作業中に余計なことをしてしまい，バグが生じてしまうということもあるでしょう。
ブランチを使うことでこれらを防ぐことができます。
新たな機能を追加や修正する際にブランチを新しく作ることでうまく実装ができた時にブランチをマージすれば危険なく行うことができます。
また，同時に複数の機能を追加や修正もできますね。（尤もこれをするには競合しないように設計をしっかりしている必要はあるでしょうけど）

## 具体的にブランチをどう使い分ける？

私はブランチを次の様に命名し，使い分けています。

| ブランチ名      | 説明                                                                                                                                   | 運用方針                                   |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
| `main`/`master` | メインのブランチで正式版としてリリースしているもの，あるいは実際に使われているもの                                                     | `develop`からのマージでのみ更新            |
| `develop`       | 機能の追加や修正後に一度マージし，現在動いているバージョンで問題が起きないか確認用，あるいは受託開発であれば本番リリース前の検品段階用 | `feature-*`や`fix-*`からのマージでのみ更新 |
| `feature-*`     | 機能の追加や修正時用                                                                                                                   |                                            | `develop`から分岐，`develop`にマージ |
| `fix-*`         | `feature-*`から`develop`にプルリク出したが，修正を要求され新たにブランチを切る場合                                                     | `feature-*`から分岐，`develop`にマージ     |

図で表すと次の様な感じです！
![ブランチ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089552/6de37958-6fcb-c5ca-3033-6d9a96587f8a.png)

## まとめ

今回は我流のブランチ運用ルールをご紹介しました！
ご参考になれば幸いです。
これが自分のコミットメッセージルールだ！


こんにちは。
みなさん，開発においてGitを使われています？
私はGitHubを使ってコードをGit管理しています。
Git管理をする場合，コミットをする際にメッセージが必要になりますよね。
皆さんはどのようにメッセージを書いていますか？

今回は我流のコミットメッセージルールをご紹介します。

## コミットメッセージ

私は以下の様なコミットメッセージを書いています。

```text:commit message
識別子: 変更概要
```

| 識別子    | 意味                         |
| --------- | ---------------------------- |
| Add       | 変更内容が追加               |
| Update    | 変更内容が機能追加等の更新   |
| Fix       | 変更内容がバグの修正等の更新 |
| Remove/Rm | 変更内容が削除               |

とても簡潔です。
些細な修正だと`fix`だけなこともあります。（本当はわからないのでやめておいた方がいい）
個人開発だと無理にコミットメッセージを書いて負担がかかるより，気軽かけた方が続くのでいいかなと思っています。
しかし，このルールはチーム開発でも使えるのでご参考になれば幸いです。
Power Apps キャンバスアプリでのデータの一括更新


# はじめに

既にいくつか記事があるという認識ですが、Power Apps キャンバスアプリでのデータの一括更新をしたいという要望をいただくことがあるため、改めて整理してみます。

# 実装アプローチ

例えば、何かの申請や問い合わせを管理するようなアプリを作成し、承認処理やステータス変更を一括で行いたいケースがあります。

今回は、問い合わせを管理するアプリを例にして、ステータスを一括更新 (対応中から完了に変更) する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/578e577a-0212-1ae3-376b-fa8e1e5b7d6f.png)

まず、以下のようにして、ギャラリーを用意し、ギャラリー内にチェックボックスを追加します。
チェックボックスにチェックを入れたデータについて、ボタンを押した際、一括で対応完了にステータスを変更しようと思います。

ギャラリーの`[Items]`プロパティは以下のような感じです。

```
Filter(問い合わせリスト,IsBlank(ComboBox1.Selected.Value)||Status.Value=ComboBox1.Selected.Value)
```

チェックボックスの`[Visible]`プロパティは以下のように、Status が特定の値のときだけ表示するようにします。

```
If(ThisItem.Status.Value="対応中",true,false)
```

チェックボックスの`[OnCheck]`、`[OnUncheck]`プロパティの処理はそれぞれ以下の通りです。つまり、更新対象のデータを一旦コレクションに追加し、変更対象となる列の情報を更新します。

```
Collect(
    colFinishedItems,
    ThisItem
);
Patch(
    colFinishedItems,
    LookUp(
        colFinishedItems,
        ID = ThisItem.ID
    ),
    {Status: {Value: "完了"}}
);

```

```
Remove(colFinishedItems,ThisItem)
```

ボタンの`[OnSelect]`の処理は以下のような感じです。

```
Patch(
    問い合わせリスト,
    ShowColumns(
        colFinishedItems,
        "ID",
        "Status"
    )
);
Notify(
    "ステータスを一括更新しました。",
    NotificationType.Success
);
Clear(colFinishedItems);
Reset(ComboBox1)
```

ボタンの`[DisplayMode]`も変更しておきます。

```
If(
    IsEmpty(colFinishedItems),
    DisplayMode.Disabled,
    DisplayMode.Edit
)
```

実行してみます。無事ステータスが一括で更新されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0ce0bac0-bdc3-8ad1-d43c-f71cdea2f082.png)

:::note
ForAll でも一括更新出来ますが、上記方法の方が式が短く、また、確認する限り、パフォーマンスがいいです。
:::

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/create-update-records-bulk

# まとめ

今回は、Power Apps キャンバスアプリでのデータの一括更新について改めて紹介しました。ニーズはあると思うので、参考にしていただけると幸いです。
Python3でBase64エンコードした際の型の扱い

# Python3でBase64エンコードしたときに微妙にはまった話

## 環境

- Ubuntu 18.04 on Hyper-V
- Python 3.6.9

##

よくありがちなこんな感じのコード

```python3
json.dumps({"hoge": base64.b64encode("poyo".encode())})
```

&lt;dict&gt;{&lt;str&gt;: &lt;str&gt;} だからきっと通るだろうと思うと実行時にエラーになる。

```
TypeError: Object of type 'bytes' is not JSON serializable
```

bytes型になってる？どこが？ということで調べてみるとどうも base64.b64encode() はbytes型で返ってくるらしい。
つまり&lt;dict&gt;{&lt;str&gt;: &lt;bytes&gt;}なのでダメ、と。
それならbytesをstrに変えてあげればいいのだけれど、はてどうしたものかと。
ということでいろいろ試してみる。

```python
#! /usr/bin/python3

import base64

def main():
    basetext = "poi poi pui pui"
    go_print(basetext)
    base64_object = base64.b64encode(basetext.encode())
    go_print(base64_object)
    base64object_decode = base64.b64encode(basetext.encode()).decode('ascii')
    go_print(base64object_decode)
    base64_object_str_cast = str(base64.b64encode(basetext.encode()))
    go_print(base64_object_str_cast)

def go_print(printdata):
    print("GP: ----- ----- -----")
    print(type(printdata))
    print(printdata)

if __name__ == "__main__":
    main()
```

実行した結果

```
GP: ----- ----- -----
<class 'str'>
poi poi pui pui
GP: ----- ----- -----
<class 'bytes'>
b'cG9pIHBvaSBwdWkgcHVp'
GP: ----- ----- -----
<class 'str'>
cG9pIHBvaSBwdWkgcHVp
GP: ----- ----- -----
<class 'str'>
b'cG9pIHBvaSBwdWkgcHVp'
```

ということで、「Base64エンコードした際に中身をstrで欲しいとき」には「.decode('ascii')」でデコードすると出てきますよというお話でしたとさ。