OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFormationでService Quota Exceeded Exceptionが発生した際の解決策

# はじめに
CloudFormationでService Quota Exceeded Exceptionのエラーが発生した場合の対処方法をまとめていきます。

# 遭遇した状況
大量のCloudWatchアラームをでCloudFormationでデプロイしたところ、Service Quota Exceeded Exceptionエラーが発生・・・

# 原因
> 「Rate exceeded」(レート超過) エラーは、AWS のサービスに対する API コールが許可された API リクエストの最大数を超過し、API コールがスロットリングされた場合に発生します。通常、これらのエラーは一時的なもので、API コールが少なくなると自動的に解決されます。

https://repost.aws/ja/knowledge-center/cloudformation-rate-exceeded-error

## つまりどういうこと？
AWSがCloudFormationからリソースを作成する際にAPIコールの数が多すぎてスロットリングされたということです。この辺はリソースを作成する際にCloudFormationがよろしく調整してくれるのかなと思っていたのですが、あまりにも多すぎるとだめみたいですね。

# 対策
オフィシャルに公開されている情報は以下です。

・エクスポネンシャルバックオフを実装する
・スタックを 1 つずつ作成または更新する
・DependsOn 属性を使用する
・クォータの引き上げをリクエストする

https://repost.aws/ja/knowledge-center/cloudformation-rate-exceeded-error

今回は、AWS API エンドポイントを直接叩いているわけではないので、エクスポネンシャルバックオフは除外、スタックも１つなので、スタックを 1 つずつ作成または更新するも除外、クォータの引き上げをリクエストするも、一時的なものなので除外します。
そのため、DependsOn属性を利用することとします。

## Depends on属性とは？
>　DependsOn 属性を使用すると、特定のリソースが他のリソースに続けて作成されるように指定できます。DependsOn 属性をリソースに追加した場合、そのリソースの作成は必ず、DependsOn 属性で指定したリソースの作成後に行われます。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

つまり、対象のリソースの作成の前提条件として別のリソースの作成完了を条件とすることができるものです。これを追加すれば、作成タイミングをコントロールできるので、同時に作成される量を減少させ、レート制限にも対応できそうです。

```
CPUAlarm:
  Type: AWS::CloudWatch::Alarm
  DependsOn: XXXAlarm
  Properties:
    AlarmDescription: CPU alarm for my instance
    AlarmActions:
    - Ref: "logical name of an AWS::SNS::Topic resource"
    MetricName: CPUUtilization
    Namespace: AWS/EC2
    Statistic: Average
    Period: '60'
    EvaluationPeriods: '3'
    Threshold: '90'
    ComparisonOperator: GreaterThanThreshold
    Dimensions:
    - Name: InstanceId
      Value:
        Ref: "logical name of an AWS::EC2::Instance resource"
 ```

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/quickref-cloudwatch.html

#　まとめ
CloudFormationでもレート制限がでることがあります。
DependsOnやスタックの分割などで工夫していきましょう。
2^a+4^b+ 8^c=328「【感動解法だが減点注意！】整数問題の超良問に挑戦」をChatGPTとMathematicaとWolframAlphaとsympyでやってみたい。


**・MathematicaのSolveで,できませんでした。いい方法がありますか？**
**・sympyのsolvesetで　 ,できませんでした。いい方法がありますか？**
・WolframAlphaで,できました。 

オリジナル

https://youtu.be/O2dPlRpQddA

(2023/07/21)
# xxxx ChatGPT で(できませんでした。) xxx
入力文
```
自然数(a,b,c)の組すべて求めよ.2^a+4^b+ 8^c=328
```

# x Mathematicaで,できませんでした。
いい方法を教えて下さい。

In:

Solve[2^a + 4^b + 8^c == 328, {a, b, c}, PositiveIntegers]

Solve[2^a + 4^b + 8^c == 328 && a > 0 && b > 0 && c > 0 , {a, b, c},Integers]

＞ この系はSolveで使用できるメソッドでは解けません．

# ○ WolframAlphaで,できました。 

https://www.wolframalpha.com/input?i=2%5Ea+%2B+4%5Eb+%2B+8%5Ec+%3D328&lang=ja

整数解
a = 3, b = 4, c = 2
a = 6, b = 4, c = 1
a = 8, b = 3, c = 1

https://www.wolframalpha.com/input?i=2%5Ea+%2B+4%5Eb+%2B+8%5Ec+%3D328+%E8%87%AA%E7%84%B6%E6%95%B0&lang=ja

正の整数上で...
結果...(省略)

# x sympyで(solvesetで,できませんでした。)
```python
from sympy import *
a,b,c=symbols('a,b,c')
print( solveset( Eq(2**a+4**b+8**c,328),[a,b,c]))
# ValueError: [a, b, c] is not a valid SymPy symbol
```

# ○ sympyで　(328✕328✕328)通りチェック
資源の無駄使いです。
```python
n=328
for a in range(1,n):
   for b in range(1,n):
       for c in range(1,n):
           if(2**a+4**b+8**c==n):
               print("#",a,b,c)
# 3 4 2
# 6 4 1
# 8 3 1
```

# 参考
以下、いつもの?おすすめです。

https://qiita.com/mrrclb48z/items/75904cdc6e84ecef4d03
ディレクティブとは

ディレクティブとは、コンピュータプログラムのソースコードに記述される要素の一つで、そのコードを解釈・変換するソフトウェア（コンパイラやプリプロセッサなど）への指示や指定などを与えるためのもの。

https://e-words.jp/w/%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96.html


プラットフォームに依存したコンパイルを行いたいときに使用する。

たとえば

スタンドアロンプラットフォーム（Mac OS X, Windows, Linux）のときは
Input.GetTouch(0)

iOSプラットフォームのときは
Input.GetButtonDown("Left")


https://docs.unity3d.com/ja/2021.2/Manual/PlatformDependentCompilation.html


〇Unityにおける使用例

    # if UNITY_STANDALONE_WIN
    
      Debug.Log("Standalone Windows");
    
    # endif

if と endif の前にあるハッシュ (#) 文字は、これらの文が “ディレクティブ” であり、ランタイムではなく、コンパイル時に処理されることを示しています。
つまり、ゲームが起動する前に処理してくれるということ。



https://docs.unity3d.com/ja/2021.3/Manual/PlatformDependentCompilation.html
Accessで複合インデックス設定

# 概要

例えば下記のようなテーブルがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/13f5c8fd-2372-364d-441e-530ce8d0f8b3.png)

**主キーとは別に** 『からむ1』『からむ2』の2つをセットにしてインデックスを設定したい場合。

# やり方

テーブルを開いた状態で、『テーブルデザイン』 → 『インデックス』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/b7e97979-8780-1ffd-b3db-cb67e58ae06a.png)

 ↓ こういったウィンドウが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d6454743-e2a3-8c44-b344-90f19e18f466.png)

下記のように追加してあげればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/1cc4f1a3-5da5-36d7-d705-a39c95280215.png)

主キーとは別に『からむ1』『からむ2』の2つを含んだインデックス『idx1』を作ることができた。

# 複合キーを設定したい場合

https://qiita.com/waokitsune/items/cb6eeb977c541199b247

# 参考サイトさん

https://www.officepro.jp/access/table/index13.html

# バージョン

Windows 10 Pro 22H2 19045.3155
Microsoft Access for Microsoft 365 MSO (バージョン 2305 ビルド 16.0.16501.20074) 32 ビット
VSCodeでDjangoのアプリをデバッグ実行する

## はじめに
[こちらの教材](https://www.techpit.jp/courses/253/curriculums/256/sections/1605/parts/6404)を参考に環境構築したDjangoアプリをVSCodeでデバッグ実行できるように設定しました。

## 環境
windows10
VSCode 1.79.2
venv(仮想環境)

#### ディレクトリ構成(一部)
```
navi (プロジェクト名)
├── config
│     ├── __init__.py
│     ├── asgi.py
│     ├── settings.py
│     ├── urls.py
│     ├── wsgi.py
│     └── __pychache__
├── venv
└── 各アプリケーション
```

## やったこと
[こちらの記事](https://qiita.com/Lintaro/items/539b16a9add9036bb078)の`VS Code側で仮想環境を使う`以降を参考に下記を実施しました。

### PythonのInterpreterを追加＆選択
VSCodeの`Select Interpreter`にて`+ Enter interpreter path...`をクリックして下記ファイルを選択しました。
```
navi/navi/Scripts/python.exe
```


選択後はこのような状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219028/0e517a13-aacf-79d0-9266-684f2f31c476.png)
### launch.jsonファイルの作成
VSCodeのデバッグ画面から`create a launch.json file`のリンクをクリックし、Python→Djangoを選択すると、.vscodeフォルダ配下に下記launch.jsonが自動作成されます。

```json:launch.json
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Django",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}\\manage.py",
            "args": [
                "runserver"
            ],
            "django": true,
            "justMyCode": true
        }
    ]
}
```

### デバッグ実行
デバッグ画面にて実行ボタン(緑の三角)を押すとデバッグ実行されます。
![スクリーンショット 2023-07-01 14.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219028/6c9eee73-8121-b681-655c-56fba4fbf42b.png)



## 参考サイト
環境構築
[Djangoでブログアプリを開発しよう！](https://www.techpit.jp/courses/253/curriculums/256/sections/1605/parts/6404)

VSCodeでのデバッグ実行
[DjangoをVSCode+Anacondaで開発（Windows）](https://qiita.com/Lintaro/items/539b16a9add9036bb078)
VisualStudio .NETで単一EXEファイルの作成

# 覚書
## .NET6で作成したアプリを単一EXEファイルする方法

1. ソリューション - 右クリック「発行」
2. すべての設定を表示
![スクリーンショット 2023-07-01 133241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2489321/03f13abf-acbc-438e-70ff-fe8cfe3f2d64.png)
3. 単一ファイルの作成にチェック
![2023-07-01 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2489321/9286a0eb-6811-b4b3-3ca8-868e993f59e7.png)
4. [発行]ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2489321/7a289a34-a9ac-5535-9f4a-8939cba790ef.png)

4. EXEファイルの場所
"bin/publish"の中にEXEが作成される
AccessのVBAで別ユーザーが同じAccessファイルを開いているか判定（複数人同時使用防止）

# やり方

『Microsoft ActiveX Data Objects 2.8 Library』を参照設定に追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6e8715d5-c527-cd88-3647-7c16f62a6ba5.png)


```vb:サンプル
'フォームを開いた時の動作。
Private Sub Form_Open(Cancel As Integer)
    
    Dim cnn_ As ADODB.Connection
    Set cnn_ = CurrentProject.Connection
    
    Dim rst_ As New ADODB.Recordset
    Set rst_ = cnn_.OpenSchema( _
            adSchemaProviderSpecific _
            , _
            , _
            "{947bb102-5d43-11d1-bdbf-00c04fb92675}" _
        )
    
    'このAccessファイルに接続しているユーザー情報走査。
    Do Until rst_.EOF
    
        'PC名取得。
        Dim using_pc_name_ As String
        using_pc_name_ = Nz(rst_.Fields(0).Value, "")
        using_pc_name_ = Replace(using_pc_name_, " ", "")
        using_pc_name_ = Replace(using_pc_name_, Chr(0), "") 'NULL終端文字列除去。
    
        '接続中PC名が自分のPCと不一致なら、別の誰かが開いているという判定。
        If using_pc_name_ <> Environ("COMPUTERNAME") Then
            MsgBox using_pc_name_ & "がすでにこのAccessファイルを開いています。", vbExclamation
        End If
        
    rst_.MoveNext: Loop
    rst_.Close
    
End Sub
```

* Accessファイルを開いている奴の情報はテーブルから取得できる。
* 上記の情報について、コンピューター名にはスペースやNULL終端文字列が付いているので、除去が必要。

# 蛇足

『同時使用禁止』とか『誰かが開いている』というエラー文言だけだと、「じゃあ誰が使ってるか調べて」という面倒くさい頼み事に発展することがある。

**どのPCが使っているか** をユーザーに見せてあげることで、それが回避できると思う。

# 複数人同時使用禁止が必要な場面

https://qiita.com/waokitsune/items/4c88ac8d8c5fb9b37180

# 参考サイトさん

https://learn.microsoft.com/ja-jp/office/troubleshoot/access/determine-who-is-logged-on-to-database

# バージョン

Windows 10 Pro 22H2 19045.3155
Microsoft Access for Microsoft 365 MSO (バージョン 2305 ビルド 16.0.16501.20074) 32 ビット
DATA+AI SUMMIT 2023 Day2 Keynote サマリメモ

DATA+AI SUMMIT 2023が開催されました。
Day2での発表について、いくらかピックアップメモ。
パネルディスカッションなど、対談系は省略しています。そちらは動画見た方がいいです。
Eric Schmidt氏が出てきたのは驚いた。

https://www.databricks.com/dataaisummit/

:::note warn
注意

メモ的に書いてる部分が多いため、正確な内容を把握する場合は公式blogや配信動画の内容を確認ください。
所感の部分はただの個人の感想です。

:::

Keynoteの配信動画は既に二日間ともyoutubeに上がっていますね。

https://www.youtube.com/watch?v=h4z4vBoxQ6s&t=12s

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

# Spark

- Downloadsが10億こえたよー。

### New in Spark 3.4

- Spark ConnectがGA
- Python
    - Autocomplete with Project Zen
    - [SPARK-44076] Python data source and UDTF extension
    - [SPARK-44042] Build-in PySpark test framework

## New LLM-powered features
- pyspark.ai English SDK for Apache Spark.
    - Sparkの変換処理やプロット指示を通常の英語で記載できる！
    - UDFも英語で書くだけでOK。

公式のblog発表：

https://www.databricks.com/blog/introducing-english-new-programming-language-apache-spark

**所感:**
- 目玉はEnglish SDK for Apache Spark.
    - 早期実装状態ですが、既に試すことができるみたいですね。
        - https://qiita.com/maroon-db/items/89f7a1aae11a112f9700
        - https://qiita.com/taka_yayoi/items/dafc37d11a01fe88aae7
    - 長く愛されるモジュールはどうしても肥大化傾向にあり、学習コストが高くなりがちですが、LLMを使って解消してくという動きはおもしろいかも。
    - 従来のソフトウェア工学の考え方とか、テスタビリティ・メンテナンスビリティみたいなところがどうなるのか、興味があります。

# Deltalake

## What’s New(最近のアップデート)

- Structured streaming
- Query latency improvement
- OAuth 2.0
- Zero Egress Fee Delta sharing with Cloudflare R2

## Deltalake 3.0

公式blogはこちら↓

https://www.databricks.com/blog/announcing-delta-lake-30-new-universal-format-and-liquid-clustering

- Liquid clustrring
    - partitioningすると、パーティションによってはファイルサイズがばらつく
    - 自動的にクラスタでのファイルサイズを調整してくれる機能
    - 2.5倍以上高速に！？
    - ZOrderもかなり読み出しが高速化する
- Delta Kernel
    - Implements the complete Delta specification
    - Delta sharingなど、処理がわかれていたのを統合カーネル化
- Uniform
    - HudiやIcebergをdelta protocolから制御可能
    - Is UniForm fast?
        - Deltalakeにおいて、UniForm有効/無効での書き込みコスト差は5%未満（有効時の方が遅い）
        - ただし、Icebergは、なんとUniformを有効にしてDelta Protocol(Kernel)環境下の方が早い！

**所感:**
- Day1ではまだよくわからなかったUniFormが具体的な内容で説明されていました。
- Blogで内容は理解できますが、Keynoteではデモもしていましたので、動画見ることをお勧めします。

# その他

- DuckDBやlangchain、fireworks(pytorch)などのOSS関連の発表やパネルディスカッションなど盛りだくさん。
    - langchainおもしろいよlangchain。


# おしまい
- 楽しく、寝不足な二日間でした。
- また来年。業界的にもどうなっているのかなー。
AmazonConnectを使ってスマホに電話をかける自動化Lambda

### はじめに
AmazonConnectを利用してLambdaから架電する場合のサンプルコードを載せています。
初心者向け
※ AmazonConnectのフローやキュー作成などの詳細は省いてます

---


### AWS構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/325067f8-b8d0-a97e-3c6e-1dac5ab8ae2b.png)

---


### 流れ
1. 事前準備
2. Amazon Connect概略
3. Lambdaコード

---


### 1. 事前準備
・1. AmazonConnectで利用する架電元の電話番号をtwillioなどの無料で電話番号を取得できるサービスなどで取得しておきます。
https://www.twilio.com/ja/docs/usage/tutorials/how-to-use-your-free-trial-account
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/a737cd71-7925-87f0-29d1-455d0e3c51e4.png)


・2. **日本の電話に架電したい場合、クォーターの制限緩和が必要です**
https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/country-code-allow-list.html#prefixes-not-allowed

---

### 2.Amazon Connect概略
Amazon Connectのインスタンスを作成し「キュー」と「フロー」を作成しておきます。

キューの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/dd9aa1ba-7b70-dc99-075d-ffeea859b992.png)

フローの例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54858/9dff9bd6-4351-cca7-08e6-075a9e561e32.png)



### 3. Lambdaコード
最後に、AmazonConnectを呼び出すLambdaコードのサンプル

```.ts
import AWS from 'aws-sdk';

const connect = new AWS.Connect();

// 電話をかける関数
async function makeCall(): Promise<void> {
  // 電話のパラメータを設定
  const params = {
    InstanceId: 'YOUR_INSTANCE_ID',
    ContactFlowId: 'YOUR_CONTACT_FLOW_ID',
    DestinationPhoneNumber: '架電先のスマホの電話番号 (例: +81xxxxのE164形式か通常の形式)',
  };

  try {
    // 電話をかけるリクエストを送信
    await connect.startOutboundVoiceContact(params).promise();
    console.log('Call initiated successfully');
  } catch (error) {
    console.error('Error initiating call:', error);
  }
}

// 電話をかける
makeCall();
```

これで、CloudwatchでS3トリガーなどでCSVファイルを取得して対象の電話番号に電話をかけるかんたんな自動化ができあがり


### メモ
AmazonConnectに流れてくるユーザーが電話を切ったかどうかなどは、CTRのログを見ればわかります。
**問い合わせレコードデータモデル**
https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/ctr-data-model.html

架電する際のAttributesは以下の文字しか使えない（日本語不可）
```
There can be up to 32,768 UTF-8 bytes across all key-value pairs per contact. Attribute keys can include only alphanumeric, dash, and underscore characters.
```
https://docs.aws.amazon.com/ja_jp/connect/latest/APIReference/API_StartOutboundVoiceContact.html#connect-StartOutboundVoiceContact-request-Attributes
CodeIQ:放物線とマス目の関係の解答

@nabetaniさんのCodeIQの問題です。
->http://nabetani.hatenablog.com/
ここからのリンク先に問題と解説があります
問題とテストケースはこちらのお世話になりました。解答もあります。
->https://blog.goo.ne.jp/r-de-r/e/388894946cd2b49715e2be375a6152f9

正解率がすごく低かったとのことなので何か問題があるのかと思いましたが、
確かに場合分けに漏れが生じてなかなか正解に至りませんでした（この問題に限りませんが）。
最小最大点や凹凸を使わず、座標や係数の間の加減乗除の結果で場合分けして解ければ
良かったのですが、結局それを利用して細かく場合分けすることになりました。

マス目が放物線の軸よりプラスよりにあるときは、升目を放物線の軸を中心に反転します。
また放物線が上に突の時は、升目の座標、放物線の頂点等の計算結果の数値を、
X座標を軸として反転します。
升目と放物線の頂点の関係、升目の左下、右上と放物線の上下関係によって場合分けします。
放物線が下に突（A>0）として考えますと

①放物線の頂点が升目の上辺より上にある場合　L
②放物線の頂点のX座標が升目の左右のX座標の間にありY座標が
　升目の上辺のY座標と同じ場合（放物線が升目の上辺と接する場合）　ｌ
③放物線の頂点のX座標が升目の左右のX座標の間、~~Y座標が升目の上辺のY座標と
　下辺のY座標の間にある場合（放物線の頂点が升目の中にある）~~
　升の左端での放物線のY座標が升の左下のY座標より上　S（2023.7.1変更）
④升目の右上より放物線が上にあれば　L
⑤升目の右上と放物線が重なれば　l
⑥升目の左下と放物線が重なれば　u
⑦升目の左下が放物線より上にあれば　U
~~⑧それ以外は S~~  （2023.7.1削除）

放物線が上に突（A<0）の場合、U->L,u->lとなります。

che56/10のR1は升の左端での放物線のY座標、R2は升の右端での放物線のY座標、
R3は放物線の頂点のY座標です。

テストケースの12は自作のテストケースです。
これがないとche56の４行目の代わりに最後のコメントアウトした行でも通ってしまいます。

追記:有理数を使っています

2023.7.2訂正
すみません、che56のコメントアウトしていた最後の行（説明の⑧）は必要でした。
投稿時に再確認したところ最後の行がなくても通ると思ってコメントアウトしたのですが、
これがないと自作のテストケース13をクリアできません。

```Prolog
%:-initialization(start56).　　　%ideone
%start56.  %(2023.7.1に56追加)

calc56(A,B,C,X,R):-R is A*X^2+B*X+C.

che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,R):-R3>Y2,(A>0->R="L";R="U").
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,R):-M=<X2,R3=:=Y2,(A>0->R="l";R="u").
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,"S"):-M=<X2,Y1<R1.
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,R):-R2>Y2,(A>0->R="L";R="U").
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,R):-R2=:=Y2,(A>0->R="l";R="u").
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,R):-R1=:=Y1,(A>0->R="u";R="l").
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,R):-R1<Y1,(A>0->R="U";R="L").
che56(A,M,X1,X2,Y1,Y2,R1,R2,R3,"S").  %2023.7.2コメント記号を外す

solv56(A,B,C,X1,Y1,R):-             %M->tyouten no x zahyou
     M is  B*(-1) rdiv (2*A),(abs(M-X1)<abs(X1+1-M)->X3 is M-abs(X1+1-M);X3=X1),
     X2 is X3+1,Y2 is Y1+1,
     calc56(A,B,C,X3,R1),calc56(A,B,C,X2,R2),calc56(A,B,C,M,R3),
     (A<0->(P1= -R1,P2= -R2,P3= -R3,Y3= -Y2,Y4= -Y1);(P1=R1,P2=R2,P3=R3,Y3=Y1,Y4=Y2)),
     che56(A,M,X3,X2,Y3,Y4,P1,P2,P3,R).

start56:-str56(S),split_string(S,"\n\s","\s",L),go56(L),!.  

go56([]).
go56([_,A,B,C,X,Y,Q|T]):-
     maplist(atom_number,[A,B,C,X,Y],[A1,B1,C1,X1,Y1]),solv56(A1,B1,C1,X1,Y1,R),
     disp56(R,Q),go56(T).

disp56(R,A):-(A==R->Str=" pass ";Str=" fail "),write(Str),writeln(R).

str56("0  8 -8 2 0 -1     l
1       110 -198 90 0 0         S
2       40 -40 10 0 1   S
3       10 -5 0 0 2     S
4       10 -10 0 0 2    U
5       -8 8 -2 0 1     U
6       -3 7 4 -2 -6    u
7       1 -10 25 3 4    u
8       -200 5160 -33275 12 6   S
9       4 -4 1 0 0      S
10      10 -18 9 0 0    S
11     -1 3 0 1 1      l
12      1 0 0 -3 0     L
13      1 0 0 -3 4     S").　　　　%2023.7.2追加
```
Android Jetpack Composeの画面遷移2（NavController+アニメーション）

# アニメーション付きのJetpack Composeの画面遷移
[前回](https://qiita.com/jozuko_dev/items/72680d8873eeaf2d58e0)、NavControllerを使用して、Composable間の画面遷移を行いました。
今回は、これにアニメーションをつけようと思います。

# 環境
AndroidStudio：Flamingo | 2022.2.1 Patch 2
OS：macOS

# Step1.ライブラリの追加
NavControllerを使用した画面遷移にアニメーションをつけようと、検索をすると
[com.google.accompanist:accompanist-navigation-animation](https://google.github.io/accompanist/navigation-animation/)
というライブラリがヒットするかと思います。
しかしこのライブラリは、現時点（2023/7/1）でdeprecatedになっています。

上記ページのMigrationに従って、「androidx.navigation:navigation-compose」のバージョンを、「2.7.0-alpha01以上」にします。
```gradle:build.gradle
    implementation platform('androidx.compose:compose-bom:2022.10.00')
    implementation 'androidx.compose.ui:ui'
    implementation 'androidx.compose.ui:ui-graphics'
    implementation 'androidx.compose.ui:ui-tooling-preview'
    implementation 'androidx.compose.material3:material3'
    implementation 'androidx.navigation:navigation-compose:2.7.0-beta01'
```

# Step2.アニメーションを追加
ナビゲーションフラグにあるcomposable()に、アニメーションの定義を追加します。
```kotlin:MainActivity.kt
composable(
    route = Nav.TopScreen.name,
    enterTransition = { slideInHorizontally(initialOffsetX = { fullWidth -> fullWidth / 2 }, animationSpec = tween()) },
    exitTransition = { slideOutHorizontally(targetOffsetX = { fullWidth -> fullWidth / 2 }, animationSpec = tween()) },
    popEnterTransition = { slideInVertically(initialOffsetY = { fullHeight -> fullHeight / 2 }, animationSpec = tween()) },
    popExitTransition = { slideOutVertically(targetOffsetY = { fullHeight -> fullHeight / 2 }, animationSpec = tween()) },
) {
```
引数にある遷移タイミング（enterTransition, exitTransition, popEnterTransition, popExitTransition）に表現したいアニメーションを指定すればOKです。

# いざ実行
ボタンを押して遷移すると、enterTransitionのアニメーションが実行されます。
また、デバイスの戻るボタンをタップして遷移元画面に戻るとpopExitTransitionが実行されます。[コード](https://github.com/jozuko/ComposeTutorial/tree/23921d2f96536154ed9b2471d71366852332b60d)
![navcontroller_animation_AdobeExpress.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491965/3000be9c-a135-f4f7-3100-f6843d413373.gif)
Google Cloud FunctionsをVSCから使う②～既存のプロジェクトとの連携～

Google CLoud functionをVSC連携で使ってみたメモです。


# TL;DR
・プロジェクトのダウンロードやデプロイは簡単
・編集どこからするのかでちょっと迷った


# 前提
以下の記事で作ったサンプル用のプロジェクトを使っています。
https://qiita.com/ayoyo/items/22cd6e4694de1bc8df36

以下の記事（インストールとかアカウント連携の話）の続きです。
https://qiita.com/ayoyo/items/35024514454a87ac3a59

# Google Cloud functionsをVSCから使う
プロジェクトと連携させていきます。
赤枠部分を押すと、Cloud functionsのプロジェクトを選ぶことができます。
青いボタン[Select a project]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/85affe9b-5498-25d9-f668-35806458b1b1.png)


VSCの画面上の方に、プロジェクト名とidが出てくるので、今まで作ったプロジェクトを選択します。

左側のCLOUD FUNCTIONSのところに選択したプロジェクトが表示されます。
選択したプロジェクトの下の方の、前回作った見覚えのある関数名にカーソルをあてると、ダウンロードマークがでるので、クリックしてソースをダウンロードします。
すごい眠い状態で下書き書いたので、画像黒塗り過多ですね。このプロジェクトあとで消したから塗らなくてよかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/383a7d7b-cc9e-9f4f-622a-b7dbf1cee177.png)

こいつ信用していいんですか、みたいな画面がでるので、[Yes,I trust the authors]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/eceaf7ce-1f19-b093-7865-7bc8167b44c3.png)

ダウンロードしたファイルを修正します。
今まで確認していたCLOUD FUNCIONSタブにもファイルが表示されるのですが、そこはReadOnlyです。
ファイルタブからダウンロード先へ移動し、そこで編集します。
ここでは、挨拶部分を適当に書き換えています。（ちなみに、CLOUD FUNCTIONS>WORKSPACEの下、プロジェクト名下、右の方のフォルダアイコン押しても同じ場所に移動するはずです。）
HelloをGood Morningに変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/c891045b-b079-2416-f8db-2aee2670b9e6.png)

deployボタンを押します。deploy先が画面中央上に表示されるので、選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/7fe5eff4-7672-792f-1732-3636ef4867db.png)


[Yes]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/7c013531-cbba-dfd5-97a8-821013ac9f61.png)

デプロイはそれなりに時間がかかる。
あとは、webでテストしてみると、HelloがGood Morningにかわってでてくる。

以上
Google Cloud FunctionsをVSCから使う①～Cloud Codeへの接続とサインアウト～

Google Cloud Functionsが使えるようになったら、今度はコーディングをVSCから行いたいとか思うのが、世の常。

https://cloud.google.com/code/docs/vscode/install?hl=ja

Cloud Code for VS Code 拡張機能により、VS Code に Google Cloud 開発のサポートが追加されるようです。

# TL;DR
 - VSCとGoogle Cloud Functionsを連携しました
 - アカウントへの接続とサインアウトのみ、実際に使う話は別記事
 - 特にはまることもなかったので、まとめるほどの話でもないけど、まあ画像とってたので備忘録。


# 前提
VSC(Visual Studio Code)はインストール済み
gitインストール済み
Pythonインストール済み
Windows 10 Pro
Google Cloud Functionsも使える（https://qiita.com/ayoyo/items/22cd6e4694de1bc8df36）

# 拡張機能のインストール
VSCにGoogle Cloud Codeの拡張機能をインストールします。
左の赤枠をクリックし、検索ボックスにGoogle Cloud Codeと入力します。一番上に、Google Cloud Codeの拡張機能がでてきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/998d953c-f517-b543-62a3-89608f2fc36a.png)


赤枠のInstallをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/a1d968e0-00ab-2ce8-59d4-2800133303f6.png)

インストールが正常に終了すると、以下の画面になります。赤枠のところにGoogle Cloud Codeのアイコンがあるのが目印。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/5bbe2a57-2384-9e50-f49b-b48240eaa30e.png)

ここで、VSCを一度閉じて、もう一度起動します。つまり再起動。
立ち上げてしばらくは、いろいろインストールするようです。

# Google Cloud への接続
インストール終了が待ちきれなかったので、何かをインストール中のようでしたが、次のステップにすすみます。

この、赤枠をおします。ちなみに、赤枠の横で、絶賛インストール中の何かがくるくるまわってました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/2ce8b976-8774-eb13-1979-ca4e1f9c0c62.png)

以下のダイアログがでてくるので、[Proceed to sign in]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/97940d87-38c0-4893-809e-7d0973d7d8da.png)

ちなみに和訳以下。
```text
Cloud Codeに新しいログインフローが追加されました。
ログインすると、アプリケーションのデフォルト認証情報が
自動的に更新されます。
これにより、Cloud Codeを介したGCP API呼び出しが
自動的に機能するようになります。
```

自動的にブラウザが開き、Googleアカウントを選択してログインするよう促されます。見慣れた光景ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/0f7a1340-029c-5413-1585-530202c04478.png)

「Google Cloud SDK が Google アカウントへのアクセスをリクエストしています」という画面へ遷移するので、下の方にある[許可]をクリックします。

さらにブラウザ画面が遷移して、認証が成功したという主旨のメッセージが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/8b0e2497-6695-8112-2ef2-dbe1aae5e030.png)

ちなみに、VSCのターミナルの方は、以下のメッセージが表示されているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/8caf17af-9751-cbbf-9b2b-019e56b15d92.png)


# Google Cloud からサインアウトする
左下の黄色枠を押す→赤枠(サインアウト）を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/fc77f009-3959-c43d-ae34-f3555b272324.png)

サインアウトしますか？とでてくるので、[sign-out]をクリック

これで、アカウントへの接続とサインアウトは把握。

以上
RubyでAtCoder ABC236(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC236のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - chukodai
https://atcoder.jp/contests/abc236/tasks/abc236_a
```ruby:a-236.rb
s = gets.chomp
a, b = gets.split.map(&:to_i)
a -= 1
b -= 1
s[a], s[b] = s[b], s[a]
puts s
```

# B - Who is missing?
https://atcoder.jp/contests/abc236/tasks/abc236_b
```ruby:b-236.rb
gets
puts gets.split.tally.invert[3]
```
## 解説
`invert`メソッドを使ってkeyとvalueを入れ替えています。

# C - Route Map
https://atcoder.jp/contests/abc236/tasks/abc236_c
```ruby:c-236.rb
n, m = gets.split.map(&:to_i)
s = gets.split
t = gets.split

s.each do
  if _1 == t[0]
    t.shift
    puts "Yes"
  else
    puts "No"
  end
end
```
## 解説
`S1==T1`かつ`SN==TM`よりSの先頭の要素から順番にTの先頭の要素と一致するかどうかを調べていき、一致すればTから先頭の要素を削除してYesを出力し、一致しなければNoを出力します。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
Mayaで切頂二十面体を作るスクリプト

# はじめに
Mayaでは正二十面体がプリミティブで用意されている。これをベースに、切頂二十面体をつくるMELスクリプトを書いた。

# MELスクリプト
頂点を全選択し、ベベルをすればいいのだが、UIからでは、入力できる有効桁数の関係で、1/3がちゃんと反映されたかわからず、精度が気になるので、スクリプトで小数点以下を多めに入力する。

```c:code.mel
polyPlatonic;
select -r pPlatonic1.vtx[0:11] ;
polyChamferVtx 1 0.3333333333333333333333 0;
```

一応、精度を確認するために、てきとうな六角形の辺の長さを計算してみる。
MELの画面では、頂点座標が結構な１２桁表示されるが、コンポーネントエディタでは、小数点以下３桁までしか表示してくれない。心配なので、オブジェクトを大きくスケールして、確認する。カメラもそれに合わせて、クリップ範囲を調整する。その状態で、適当な面の６辺の長さを計算する。

```c:code.mel
{
polyPlatonic;
scale -r 1000000 1000000 1000000;
select -r persp ;
setAttr "perspShape.farClipPlane" 10000000;
setAttr "perspShape.nearClipPlane" 100;

select -r pPlatonic1.vtx[0:11] ;
polyChamferVtx 1 0.3333333333333333333333 0;

$v1 = `pointPosition pPlatonic1.vtx[40]`;
$v2 = `pointPosition pPlatonic1.vtx[41]`;
$v3 = `pointPosition pPlatonic1.vtx[53]`;
$v4 = `pointPosition pPlatonic1.vtx[52]`;
$v5 = `pointPosition pPlatonic1.vtx[51]`;
$v6 = `pointPosition pPlatonic1.vtx[50]`;

vector $v = <<$v1[0] - $v6[0], $v1[1] - $v6[1], $v1[2] - $v6[2]>>;
float $d = `mag $v`;
print($d);

}
```

辺の長さの違いを比較
40to41 : 350487.375683
41to53 : 350487.440757
53to52 : 350487.387556
52to51 : 350487.45018
51to50 : 350487.353366
50to40 : 350487.447236
６桁はあってる。計算の何処かの過程で、floatになってるのかな。
macOSへのTA-Libインストール失敗時にやったこと


pipでTA-Libをインストールしようとしたら、
```
pip install TA-Lib
```

このようなエラーが出て、インストールに失敗した
```
ERROR: Could not build wheels for TA-Lib, which is required to install pyproject.toml-based projects
```

以下のコマンドでインストールできた
```bash
brew install TA-Lib
pip install TA-Lib
```
UE5 Documentation ノードとは

# 概要

Blueprint グラフから追加できる Documentation ノードについて使い方がよくわからなかったので調べてみました。

Documentation ノードとは以下のノードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953062/3d1ec833-dc4d-5e6e-1a8e-d7a79e8a1098.png)

# 環境

Windows 11
Unreal Engine 5.2

# このノード is 何

Unreal Engine では様々なところで ctrl+Alt で ToolTip が表示されます。この ToolTip たちは Engine 内の .udn という拡張子がついたファイルから読み取られています。

Documentation ノードはこの .udn ファイルを読み取り、グラフ内でも表示できる機能です。（おそらく）

.udn ファイルたちは以下に存在します。
``` C:\Program Files\Epic Games\UE_5.2\Engine\Documentation\Source\Shared```


このノードは UEdGraphNode を継承しており、以下の二つのプロパティを持っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953062/4600499c-1b04-d30b-f616-ac3e73b8dff6.png)

Link には .udn ファイルの相対パスを設定することができます。

試しに UK2Node_FormatText を選択すると、Documentation ノードの見た目が変わりました。
（言語を途中から日本語に変更しました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953062/74cfc2e0-298a-ed78-2600-a563a5a9e76e.png)


試しに下記のフォルダを指定してみます。
```Shared\Enums\EAlphaBlendOption```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953062/41553f15-9783-1bf8-756d-46cdf3d78692.png)


ちゃんと曲線の画像が表示されました。ただ、挙動的に怪しく、画像が表示されないことがしばしばありました。


# 自分のドキュメントを表示してみる

独自の .udn を編集して自分のドキュメントを表示してみたいと思います。

アクターの説明文をここから引っ張ってきてドキュメントとして表示してみました。
https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Actors/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953062/d4fe38b9-b7b4-0807-84bb-3fc10b3892c7.png)

実際に作成したファイルがこちらです。

```TestActor.JPN.udn
Availability:NoPublish
Title: Actor
Crumbs:

[EXCERPT:Actor]
アクタ は、レベル内へ配置可能な任意のオブジェクトです。トランスレーション、回転、スケーリングなどの 3D 変形をサポートする汎用クラスです。アクタはゲームプレイ コード (C++ またはブループリント) を通して作成 (スポーン)、破壊することができます。C++ において AActor は全てのアクタの基本クラスになります。

様々なタイプのアクタがあります。例えば、StaticMeshActor、CameraActor および、PlayerStartActor などがあります。

アクタにトランスフォーム (位置、回転、スケール) データは直接含まれません。アクタのルート コンポーネントのトランスフォーム データがある場合は、それが使われます。
[/EXCERPT:Actor]
```

EXCERPT で囲むことによって詳細欄の引用のプルダウンに表示される項目として追加できます。

そして上記の .udn ファイルは下記に配置しなくてはなりません。

```
C:\Program Files\Epic Games\UE_5.2\Engine\Documentation\Source\Shared\ドキュメント名
```

## 感想


ブループリントグラフが見慣れない景色になって新鮮でした。
基本的にはいつものコメントで事足りる気がしますが、強いてメリットを挙げるとすれば、
Engine 内に配置しなくてはいけないのがネックですが、ブループリントグラフに配置可能なドキュメントをテキストとしてバージョン管理に含めたり、UE を起動せずとも見れる、などがメリットでしょうか、、
Amazon Keyspacesを使用してApache Cassandraを試す

Amazon Keyspacesを利用して、Apache Cassandraを試してみたので、そのメモです。
AWSで使用するNoSQLの定番といえばDynamoDBですが、ベンダーロックインされてしまうことを鑑み、OSSのNoSQLを試そうと思ったのがきっかけです。
Cassandraであれば、Azure Cosmos DBなどでもサポートされているため、マルチクラウドで対応できる、きっと。

# チュートリアル
最初にAmazon Keyspacesのコンソールから利用開始すると、以下のチュートリアルが表示されます。このチュートリアルに沿うだけで、テーブル作成からデータのINSERTまでの一連の流れがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/720fa0fc-e9a1-ab4f-176d-15cabae69266.png)

# データのクエリを試す
クエリは、CQL(Cassandra Query Language)を使用します。SQLに似た構文でクエリできるので、DynamoDBよりとっつきやすいイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/66219f28-6793-a5ab-f5ae-67161742a267.png)

しかし、NoSQLなので、プライマリキー以外でwhereで絞り込もうとすると、エラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/0aa6059c-3312-3887-f7a1-7a8a073d4451.png)

`ALLOW FILTERING`をつけることで結果が出ますが、全件検索になってしまう（DynamoDBでいうところのScan相当）ため、あまりやりたくないことは確かです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/c7302f0a-1cfe-88e3-4216-9edd3c4ee99d.png)

また、Dynamo DB同様、データの並び替えは期待できなさそうです。order by で並び変えようとすると、プライマリキーをEQかINで指定するように言われ、プライマリキーをINで指定して再度クエリを実行しましたが、想定の結果にはなりませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/9aa54f1b-e334-23ff-e0b1-e4d8631a4dfb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/553fa0fb-7b41-c601-397a-e305714d3760.png)

DynamoDBであれば、インデックスを用いて無理やりやることもできますが、Keyspacesではインデックスを貼ることはできないようです。（本家Cassandraであればインデックスも貼れそうでした）

# 感想
趣味レベルではおとなしくDynamoDBか普通のRDBを使ったほうがよさそうと思ったので、これ以上の深追いはしませんでしたが、ここまでの情報で参考になる方もいらっしゃればと思い投稿しました。なにかの参考になれば幸いです。
【JavaScript】「キレイなコード」を考える #1 null 結合 `??` ・オプショナルチェーン `?.` 演算子を使う

「キレイなコード」とは ――
キレイなコードを目指すべきか ――

これはエンジニアにとっての永遠の課題、Twitter をはじめ多くのエンジニアが議論を白熱させます。

私個人の意見として、「キレイなコード」の定義は重要ではなく、

新規でコードを書くときには、**「ある程度の前提知識」がある人にとって、意図が理解しやすく、実際に動かしたときに予想を裏切らず「驚き」が少ない** コードを書くことが大事なことであり、そのようなコードに「美しさ」を見いだせるセンスを身につけるべきだと思います。

:::note
もちろん、言語の特性もうまく理解して、「博識な人の自己満足」に陥らないように注意する必要があります。 使用するのは言語・ライブラリの標準的な機能なのか、ググって容易に浅く理解できる内容かどうか考えるのが良いと思います。
:::

## 今回のテーマ

今回のテーマは、「null 結合・オプショナルチェーン演算子」です。

「〇〇が undefined でも null でもないときには、～～」という場合に、次のように書いていませんか？

```ts
// options: { [key: string]: string } | undefined
options ? options[key] ? options[key] : "default" : "default"
```

私はこれよりも

```ts
options?.[key] ?? "default"
```

のように書いたほうが良いと思っています。

:::note
(ボツ) 指摘いただきましたが、最初の版では以下のように書いていました。 こういうミスをひっくるめたフォールバックを書けるのも null 合体 / オプショナルチェーンの醍醐味ですね（苦しい言い訳）

```ts
// options: { [key: string]: string } | undefined
options ? options[key] : "default"
```
:::

## 理由

理由は「短いほうが良いから」

...

ではありません。

コードは短ければ良いというものでもありませんし、短さを目指すあまり暗黙的すぎるコードになってしまっては、それこそ「自己満足」になってしまい元も子もありません。

私が思うに、このような利点があると思っています。

- `?.` と `??` は `? : ` よりも用途が限定されているから
- `options` を繰り返さず、文字数あたりの情報量が増えるから
  - 読み飛ばさないといけない文字が多いと負担になる 
- フローの「幹」・「枝」の関係がはっきりするから
  - ロジックの流れを「ただの条件分岐」じゃなくて「フォールバック」として捉えなおす


ひとつひとつ見ていきましょう。

## １. 用途が限定された機能を使う

`?.` は **オプショナルチェーン** と呼ばれる演算子で、非 nullish の場合には何かをして、nullish であれば何もせず undefined が結果として帰ってきます。

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

単なるプロパティのアクセスだけでなく、角括弧も使えますし、nullable な関数の呼び出しにも使うことができます。

ご存知でない方は是非おぼえて帰ってください。

```ts
// プロパティのアクセス
object?.hoge

// 角括弧を使ったアクセス
object?.["hoge"]

// 関数の呼び出し
nullableFn?.()
```

---

`??` は **ヌル合体演算子** という名前で、左辺の値が nullish であれば代わりに右辺の値を結果として返す演算子です。

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

---

オプショナルチェーン、ヌル合体演算子は、どちらも「nullish かどうか」で分岐が起こるのが特徴です。 `&&` `||` `object ?  t : f` のような論理演算子・三項演算子は「偽値かどうか」で分岐が起こります。

後者を扱うと、nullish 以外の偽値 (false, 0, "", document.all など) が入ってくる可能性がノイズとしてコードを読解時に邪魔しますが、前者を使うことで、そのノイズを気にする必要がなくなります。

しかも、慣れてくると `?.` や `??` という記号を見ただけで「これは nullish のときにフォールバックするコードだ」と理解できるようになります。

## ２. 読み飛ばさないといけない文字を減らす ―― 文字数あたりの情報量

もう一度 before と after のコードを見比べてみましょう。

```ts
// before
options ? options[key] ? options[key] : "default" : "default"

// after
options?.[key] ?? "default"
```

もし、チェーンが長くなると、

```ts
// object.hoge が nullable だったら
object.hoge?.[key] ?? "default"
object.hoge ? options.hoge[key] ? options.hoge[key] : "default" : "default"
```

のように、読む意味の薄い、繰り返される「主語」の部分が長くなっていきます。

読み飛ばさないといけない文字の存在が **文字数あたりの情報量** を減少させ、コードの読解を難しくしてしまっています。

## ３. フォールバック ―― フローの幹と枝を意識する

条件分岐（および三項演算子）を使っていたときには、処理の流れ・フローが「二股の分岐」 になっていました。（しかも、↑のように、 nullable な箇所が増えるたびに分岐の数が増えていきます。）

しかし、null結合・オプショナルチェーン演算子に置き換えることによって、

- 「一つも nullish に引っかからなかった場合」という「幹」
  - 正常系
- 「一つでも nullish があった場合」という「枝」
  - 異常系  
  - フォールバック
 
としてフローを捉え直すことができます。

この「条件分岐を "幹と枝" で捉え直す」という考え方は他のテクニックにも関連しまているので、次回はこの「フローの幹と枝」に注目してみようと思います。

▼ つづきの記事はこちらです。

https://qiita.com/honey32/items/94cb373fe42db68b6142
javaで変数を不変にすることについて

# Javaで変数を不変にする：Immutableなデザインの力

Javaプログラミングについての議論の中で、"Immutable"または"不変"という言葉をよく聞くことがあります。

## Immutable（不変）とは

不変という言葉は、文字通りに解釈すると、"変更されない"ことを意味します。プログラミングの文脈では、不変オブジェクトは一度作成されるとその状態が変更されないオブジェクトを指します。

## 不変性の利点

- **スレッドセーフ**：不変オブジェクトはスレッドセーフであり、複数のスレッドが同時にアクセスしても安全です。これは、データ競合や一貫性の問題を心配する必要がないため、マルチスレッド環境でのプログラミングを容易にします。

- **リスク減少**：オブジェクトの状態が変更できないため、バグやエラーが発生する可能性を減らすことができます。

- **簡潔なコード**：不変オブジェクトを使うことで、より簡潔で読みやすいコードを書くことが可能になります。

## Javaで不変な変数を作成する方法

以下にJavaで不変な変数を作成するための簡単な手順を示します：

```java
public final class ImmutableExample {
    private final int value;

    public ImmutableExample(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
```

上記のコードでは、以下の手順に従って不変な変数を作成しています：

1. **クラスをfinalにする**：これにより、他のクラスがこのクラスを拡張することを防ぎます。

2. **フィールドをprivateとfinalにする**：これにより、フィールドの直接的な変更を防ぎます。

3. **値を設定するためのコンストラクタを提供する**：これにより、オブジェクトが作成された時点で値が設定され、その後変更することができません。

4. **setterメソッドを提供しない**：これにより、フィールドの値を変更する方法が存在しないことを保証します。
XBRLってなんだろう ～Pythonで有価証券報告書を分析したい～

# はじめに
知り合いから各社の有価証券報告書を一気に分析できるプログラムあったらいいねって言われたので、
どんな言語がいいのか調べた結果Pythonで書くことにした。
(ググったり本屋をぶらぶらした感じPythonでスクレイピングはベタな題材っぽい)

開発環境とかコードは色々試しているところなので、有価証券報告書の情報を取るときに便利なXBRLについてとりあえずまとめ。

# XBRLって何？
金融庁のサイトをチェック

https://www.fsa.go.jp/search/20221108.html#:~:text=XBRL%E3%81%A8%E3%81%AF%E3%80%81%E8%B2%A1%E5%8B%99%E5%A0%B1%E5%91%8A,%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%EF%BC%89%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

上記サイトによると、XBRLとは
「XBRLとは、財務報告等開示書類に電子的タグを付し効率的な情報取得を可能とするための国際的に標準化されたコンピュータ言語です。提出者はXBRLの「タクソノミ」（電子的タグの集合）を基に、「インスタンス」（タグ付けされた開示書類ファイル）を作成します。」

開示する情報に紐づく属性はタクソノミで定義するけど、それだけだと情報不足(例えば数値がいつの年度のものか分からない)なので、期間や通貨単位はインスタンスで設定する。

プログラム書いて有価証券報告書の内容を抽出するなら、XBRLの利用はほぼ必須と言っても過言では無い。


# XBRLを使うと何がいいの？

分析側としてはシステムに取り込むときにどのデータが何を表しているのかすぐに判別できる。
Pythonで実際に有価証券報告書のデータを一部抽出しているんだけど、本文を文字列検索するよりXBRLのタグで判別するほうが確実にお目当てのデータを抽出できる。

フォーマットが決まっている方が作る側としても楽だし、現物を読むにしても各社でフォーマット揃っている方が比較しやすい。
Windowsのタスクスケジューラーを起動すると『選択されたタスク※※が存在しません』のエラー

# 現象

タスクスケジューラーを起動すると下記のようなダイアログが出る。

>選択されたタスク"※※"が存在しません。
>現在のタスクを表示するには、[最新の情報に更新]をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4263f0de-20a9-d3cd-de66-80338fadb7f3.png)

タスクスケジューラー画面を見ても『Tester』と名の付くものが見当たらない。

# 予想

検証用に『Tester』という名前のフォルダーを、タスクスケジューラーに作っていた。
そのフォルダーを削除したが、それが不完全で何か不整合を起こしているのかもしれない。

# 対応

エクスプローラーで下記へ行った。

```
C:\Windows\System32\Tasks
```

『Tester』というフォルダーが存在した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/42b4233f-8623-256c-4437-177a633ebbf1.png)

タスクスケジューラーの画面上では表示されていなかったのに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/14d27cdc-88b0-2d0d-57dc-e811c14b2904.png)

エクスプローラー上で『Tester』というフォルダーを消したが、相変わらずダイアログが出る。

レジストリーエディターで下記へ行くと…

```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree
```

『Tester』フォルダーがあったので削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/938970fe-8134-2f40-cc12-be6ca64ee515.png)

そしたら問題のダイアログ出なくなった。

# 参考サイトさん

https://kuuur.net/tech/os/no-task

https://answers.microsoft.com/ja-jp/windows/forum/all/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/d60a65ef-2c0d-4aff-b6a0-e651856fa405

https://windows.command-ref.com/cmd-schtasks-delete.html

# バージョン

Windows 10 Pro 22H2 19045.3155
Salesforceでフローを作成しよう～Salesforceログイン時にメッセージを表示させよう～

こんにちは
本橋孝昭です
今回はSalesforceのフローの中で
・ログインフロー
の作成方法をお伝えします

このログインフローを作成すれば
・Salesforceユーザにログイン時に強制的にログイン画面を表示させることが可能です

それではやってみましょう


##　ステップ1 フロー作成
画面フローを作成します

![フロー01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1fa94192-8f42-841f-4d1c-fe44e2ff843e.png)


![フロー02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ec407c81-ccc7-767b-9eee-3dec10b0b8f4.png)


## ステップ ログインフロー
ログインフロー作成をします
設定は以下の通りです

![ログインフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/888dc8a1-8338-bafa-39f1-c4a844277f7a.png)


こちらで設定は完成です
あとはステップ２で選択したプロファイルのユーザがログインすればログイン時に先ほど画面フローで作成した画面になります

![画面フロー確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cf19b572-080d-9a54-eaaf-6eebb0315e34.png)


## ※ほかのログインフローについてはこちら

ログインフローを作成しよう～ユーザログイン回数を集計するフロー
https://qiita.com/Takaa/items/a28f825259aa1ec43bb8

Salesforceでログイン時になにかしらの画面を表示させる設定
https://qiita.com/Takaa/items/c8e2d288716eeb6d3bcc
.NET Core でマルチメディアファイル（.bmp, .wav）を簡単に出力する方法

# はじめに

.NET Core でとあるプログラムを作っていて映像をファイルで出力したくなり、標準の `System.Drawing.Bitmap` クラスを使ってみたところ、

```
: error CS1069: 型名 'Bitmap' は名前空間 'System.Drawing' に見つかりませんでした。
この型はアセンブリ 'System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' に転送されました。
このアセンブリへの参照を追加することを検討してください
```

というエラーが出てきて「え、標準で使えないの！？」と思いドキュメントを確認したところ、

https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.bitmap?view=windowsdesktop-7.0

注意事項に、

:::note warn
注意
.NET 6 以降のバージョンでは、この種類を含む System.Drawing.Common パッケージは **Windows オペレーティング システムでのみサポート** されています。 クロスプラットフォーム アプリでこの型を使用すると、コンパイル時の警告と実行時例外が発生します。 詳細については、「 Windows でのみサポートされる System.Drawing.Common」を参照してください。
:::

との記載が。

私の環境は macOS + .NET Core 7.0 なのでそもそも Bitmap クラスが使えないようです。

なんてこったい...

# 作ってみた

という訳で、bmpファイルを簡単に出力できる独自クラスを作ってみました。

https://github.com/suzukiplan/simple-media-cs

## .bmp ファイル出力

使い方は恐ろしく簡単で、幅と高さを指定して `SimpleBitmap` クラスのインスタンス生成後、`SetPixel` で点を打ち、`WriteFile` でファイルに書き出すことができます。

```c#
SimpleBitmap bmp = new SimpleBitmap(width, height);
bmp.SetPixel(x, y, red, green, blue); // red, green, blue = 0~255
bmp.WriteFile("/path/to/graphic.bmp");
```

## .wav ファイル出力

ついでに、音声を無圧縮のリニア形式のwavファイルとして出力できるモノも作ってみました。

```c#
SimpleWave wav = new SimpleWave(44100, 16, 2); // sampling-rate, bit-rate, channels
wav.Append(pcm); // append byte array
wav.WriteFile("/path/to/sound.wav");
```

# 補足

既に同じような機能を実現できるライブラリがあるとは思いますが、C# プログラミングが始めてだったので練習を兼ねて作ってみた感じです。
Google cloud functionsを使ってみた

Google cloud functionを使ってみた覚書です。
サーバを立てずに、python仕様のAPIを作りたいというのがモチベです。

# TL;DR
・Google Cloud Functionを使うために無料枠とか調べたのでメモ
・とりあえず、最初のサンプル動かしてたのでメモ

# 無料枠について

以下URLにアクセスすると、無料枠などがあるようです。200万リクエストまでは毎月無料とも書いてあるので、個人で使う分には実質タダなのでは。ただ、いろんなとこで細かく金がかかりそうなので、実際使ってみて、課金状況をウォッチですかね。
https://cloud.google.com/free/docs/free-cloud-features?hl=ja#cloud-functions
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/3ea386f9-d90c-0f22-ead4-5abf899ae96d.png)

# 使ってみた
さきほどのページの右上の、無料で利用開始ボタンを筋肉で押しました。
押すと速攻、無料トライアルであることをアピールされます。
$300の無料枠が90日つく模様。円安であることを実感するお値段です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/1e05f99c-02c8-58a4-e650-1272d7ca58ab.png)


ここまで来ると、Google cloud functionの文字がどこにも見当たらなくなります。
仕方ないので、検索窓にfunctionといれると観念して、Coud Functionsが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/78165255-578f-cfd9-f107-69460aec040d.png)



[+ファンクションを作成]を押すと、有効化しろと催促されます。
有効にするボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/034a03fe-d0d4-f1a4-31c4-89660cbb2839.png)



# 設定
## 基本設定
いろいろ聞かれたので適当に設定していきます。第一世代か第二世代かについては、新しい方が良いかと思い第二世代をチョイス。第二世代の方がコスパが良いようですね。関数名は任意のものをいれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/32bedede-486d-48ee-2083-01d69e3c4867.png)




東京は、Tier1料金設定で、asia-northeast1。Tier1とTier2の違いは不明だが、料金設定はTier1の方が安い。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/05ab0160-c47e-b08a-b992-d8e1564a0b29.png)

引用https://cloud.google.com/functions/docs/locations?hl=ja#tier_1_pricing

## ランタイム、ビルド、接続、セキュリティの設定
メモリとか少ない、気がする……けど、このままでとりあえずいきます。無料枠の範囲でしか使わないですしね。
ちなみに、Google Cloud Functionは、一次ファイルを/tempに保存できるのですが、そこで使える容量がこのメモリぶんらしいです。API起動に必要なあれこれ（具体的には不明）も/tempに保存されそうなので256MBがまるっと使えるわけではなさそう。そして、/tempがうまるとAPIがうごかなくなるようなので、もし使う場合は一時的に利用してすぐ消すのがよさそう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/4e42ee66-ad08-3e01-e6bc-f85a550cff9b.png)

また、有効にしろボタンがでるので有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/437f85d8-8922-be98-3327-44550a0e28de.png)


Node.jsがランタイムとして設定されているので、とりあえずPythonに変更。
最初からサンプルコードがあるので、そのままデプロイ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/caf17268-c540-9be6-d426-3f644514b7c6.png)

少し時間かかります。数分コースです。

画面が切り替わるため[関数の詳細]ページに行き、テスト中をクリック。
CLOUD SHELLでテストする、をクリックすると、ダイアログがでるので続行。
下の方にターミナルが出てるので、さらに実行と押すと、結果が返ってきます。

ファンクションの詳細の、右側の[編集]->[コード]を押すと、プログラム編集画面に戻ることができます。HelloをGood Eveningなどに変えて再デプロイするとそのまま反映されます。

以上
Nodejsから、DockerコンテナのmongoDBに接続する

# npm i mongoDB v5.6.0
### mongoDB パッケージを使って接続します。

https://www.npmjs.com/package/mongodb

## 開発環境

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/343a7e08-c171-0111-c7f5-1c6f4db80fdf.png)

## directory storacture

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/043b1efb-6e8e-03c1-f2e5-df4d024d97be.png)


## app.jsに下記のソースコードを記述します。

```javascript:app.js

    const express = require("express");
    const app = express();
    const port = 3000;
    const path = require("path");
    const { MongoClient } = require("mongodb");
    
    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());
    
    const uri = "mongodb://admin:password@localhost:27017";
    const client = new MongoClient(uri);
    
    const options = {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    };
    
    app.get("/", (req, res) => {
      res.sendFile(path.join(__dirname, "index.html"));
    });
    
    app.get("/get-profile", async (req, res) => {
      try {
        await client.connect();
        const db = client.db("user-account");
        const collection = db.collection("users");
        const result = await collection.findOne({ userid: 1 }, options);
    
        await collection.insertOne({
          userid: 2,
          name: "luigi",
        });
        res.json(result);
      } catch (error) {
        console.log(error);
      } finally {
        await client.close();
      }
    });
    
    app.listen(port, () => {
      console.log(`Example app listening on port ${port}`);
    });

```

# Connection URI

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/1c8949a7-5ce9-47fb-60d3-0ce5c206b9b3.png)


# Mongo-express　GUIを使ってあらかじめデータを挿入します。

**userid:1**に**mario**を入れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/3d686427-cac5-274c-57cf-9bba9f696dd8.png)


mongo-expressのコンテナの立ち上げ方は、こちらのリンクをご参考ください。

https://hub.docker.com/_/mongo-express

https://youtu.be/3c-iBn73dDE




# ブラウザからアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/cbec1bb3-1c2b-ef97-d322-a3fd7bf60c28.png)

**luigi**のレコードも追加されていますね。




![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/c8a06100-bb8b-06b2-9cd2-906fa64751f6.png)

# npm i mongoose vs mongodb

https://www.mongodb.com/developer/languages/javascript/mongoose-versus-nodejs-driver/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/63f21b11-7c00-3647-7a63-05d043ea28a5.png)


https://mongoosejs.com/#getting-started


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/9e38e970-296d-23ec-8261-ae713db15d13.png)
reactの条件分岐、よく使う演算子三つ

## 導入
reactの現場でよく使う演算子を三つまとめました。

この三つを使い分ければ、現場でもシンプルかつ柔軟な実装ができると思います。

## ①論理演算子
一つ目は論理演算子です。
論理演算子は、elseがない条件文で使われます。

```
const sample =["apple",null,"orange"]

<div className="App">
    {sample.map((fruits)=> (
  fruits === 'apple' && fruits))}

// 結果：apple
```
上記例ではsample配列をmapで回し、
中身が'apple'の場合だけ、値を表示させています。

単純にifのみの条件文で済む場合なら、論理演算子を使うことでシンプルに記述することができます。

## ②三項演算子
次に紹介するのは三項演算子です。
三項演算子は、false条件を記述したい場合に仕様します。

```
const sample =["apple",null,"orange"]
{sample.map((fluits) => {
   return ( 
      <>
       {fluits === 'apple' ? fluits : fluits === 'orange' ? fluits : 'nullです'}
       <br/>
      </>
  }

//結果：apple
       nullです
　　　　orange
```
fluitesが'apple'の場合に、fluitesを表示
fluitesが'orange'の場合に、fluitesを表示
それ以外の場合は、文字列を返却しています。

単純なif文よりもシンプルに記述できます。

## ③null合体演算子
最後に紹介するのはnull合体演算子です。
配列や変数にnullが入っている場合にシンプルに記述ができます。
```
const sample =["apple",null,"orange"]
{sample.map((fluits)=>{
   return (
     <>
       {fluits ?? 'nullです'} 
        <br/>
     </>   )
 })}

//結果：apple
       nullです
　　　　orange
```
fluiteに値が入っていれば左辺を返し、
nullかundefinedが入っていれば右辺を返します。

nullの際の分岐を表現したい場合には、かなりシンプルに記述できます。

# まとめ
今回は現場でもよく使用するえreactの条件分岐でよく使う演算子についてまとめました。

使いこなせれば、可読性が高くシンプルな記述ができるのでおすすめです。
Storybookにて全Story共通のコンポーネントを設定する方法

# 背景
_app(カスタムAppコンポーネント？)に配置しているモーダルコンポーネント等をStorybookでも使用したかった。
各Storyに書いてもいいのだが面倒に感じたので全Storyに設定したかった。

# 環境
```
"next": "13.1.1",
"react": "18.2.0",
"storybook": "^7.0.12",
"typescript": "4.9.4"
```

# 方法
### preview.tsxにdecoratorsを追加する。
※拡張子は**tsx**なので注意

```tsx:preview.tsx
const preview = {
  parameters: {
    actions: { argTypesRegex: "^on[A-Z].*" },
    controls: {
      matchers: {
        color: /(background|color)$/i,
        date: /Date$/,
      },
    },

  decorators: [
    (Story) => (
      <RecoilRoot>
        <MantineProvider withGlobalStyles withNormalizeCSS>
          <CommentModal />
          <PostModal />
          <LoginModal />
          <SignupModal />
          <EditProfileModal />
          <Story />
        </MantineProvider>
      </RecoilRoot>
    ),
  ],
};
```
Javaのスーパークラスのメソッド呼び出しについて

# Javaのスーパークラスのメソッド呼び出しについて
Javaに不慣れなC#プログラマが、「プログラミング言語Java 第4版」を読んでいた気づきです。

- Javaの場合のメソッド呼び出しは、オブジェクトの実際のクラスを使用
    - 継承元のメソッドを引き継ぎたい場合には注意が必要
- C#の場合のメソッド呼び出しは、オブジェクトの参照の型を使用
  

以下は、実際に試してみたサンプルです。
## Java編
### Javaのコード
```Java
//座標を扱うクラス
public class Point {

	public double x, y;
	
	public void clear() {
		this.x = 0.;
		this.y = 0.;
		System.out.println("PointのClear");
	}
}

//Pointクラスを継承した座標＋色を管理するクラス
public class Pixel extends Point{

	Color color;
	public void clear() {
		super.clear();
		color = null;
		System.out.println("PixelのClear");
	}
}

public class Sample {

	public static void main(String[] args) {
		Point point = new Pixel();
		point.clear();
	}

}
```
### 出力結果
```
PointのClear
PixelのClear
```

## C#編
### C#のコード
```csharp
public class Point
{
    public double x, y;

    public void clear()
    {
        this.x = 0.0;
        this.y = 0.0;
        Console.WriteLine("Point-Clear");
    }
}

public class Pixel: Point
{
    Color color;

    public void clear()
    {
        base.clear();
        color = Color.Aqua;
        Console.WriteLine("Pixel-Clear");

    }
}

Point point = new Pixel();
point.clear();

Console.ReadKey();

```

### 出力結果
```
PointのClear
```
Powerpointで数式モードで行列を入力する

Powerpointで数式モードで行列を入力する方法をよく忘れます．次の方法で行列を作れます．

1. 次のコマンドを入力します．
    ```
    \matrix(a & b @ c & d)
    ```
2. \matrixの後ろにカーソルを移動し，スペースを押す．図のように\matrixが黒い四角になる．
3. 閉じカッコの後ろにカーソルを移動し，スペースを押す．すると図のように行列になる．あとは好みのカッコをこれの前後に入力すれば，行列が完成する．

![matrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190459/3112d6cb-8cd8-3062-d16a-2115a4b277be.png)


リボンの数式から行列を入力してもできます．
cscの作法 その384

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
opencvsharpでmp4ファイルを作れ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b5c5e907-f288-416b-bc3a-38923810692a.png)


# サンプルコード

```

using System;
using OpenCvSharp;

namespace App
{
	internal class Program {
		static void Main(string[] args) {
			int hight = 240;
			int width = 320;
			VideoWriter vw = new VideoWriter("b.mp4", FourCC.H264, 10, new Size(width, hight));
			Mat mat = new Mat(hight, width, MatType.CV_8UC3);
			for (int i = 0; i < mat.Height; i++)
			{
				for (int j = 0; j < mat.Width; j++)
				{
					mat.Set(i, j, new Vec3b(0, 165, 255));
				}
			}
			for (int k = 0; k < 50; k++) 
			{
				vw.Write(mat);
			}
			vw.Release();
			vw.Dispose();
			mat.Dispose();
		}
	}
}




```

以上。