OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】rate my app を用いたユーザー体験を考慮したアプリ内レビュー機能の組み込み

# 概要
この記事では、Flutterアプリケーションにおけるユーザーレビュー機能の組み込み方法を、「rate my app」パッケージを使用して解説します

https://pub.dev/packages/rate_my_app

以前、in app review を用いた記事を公開しましたが、このライブラリをボタンとして用いることには以下のようなデメリットがありました：

https://qiita.com/kotap15/items/655f9bf4a32d764e3e87

- レビュー完了後も永続的に表示されてしまう(実装次第で解消可能だが手間がかかる)
- レビューダイアログの表示は一定期間内で制限されているため表示されないバグが起きる


Apple公式のヒューマンインタフェースガイドラインには「人々があなたのアプリやゲームへの関与を示した後にのみ、評価を求めてください」と記載されています。これに基づき、ユーザー体験がより良くなるように利用できる「rate my app」の組み込みを紹介します。

> Best practices
Ask for a rating only after people have demonstrated engagement with your app or game.
> "人々があなたのアプリやゲームへの関与を示した後にのみ、評価を求めてください。"
> https://developer.apple.com/design/human-interface-guidelines/ratings-and-reviews より



ということで、このデメリットを解消しつつ、ユーザーの体験がより良くなるように利用できるともおもった rate my app の組み込みを紹介します

## 「rate my app」を使用するメリット

- ライブラリレベルで容易にカスタマイズができる：

レビューダイアログのデザインや表示タイミングをライブラリレベルでコントロールできます。
これにより、アプリの設計に合わせたユーザー体験を提供できます。
細かいカスタマイズ性でいえば in app review のほうが軍配は上がると思いますが、今回は個人開発の低カロリーの実装を想定しているためこの点が良いと思いました。


- 柔軟な表示制御：

ユーザーがレビューを完了したかどうかを追跡し、必要に応じてダイアログの表示を停止できます。これにより、既にレビューをしたユーザーに対しては表示されないようにすることが可能になります。

# rate my app の組み込み方法

「rate my app」の組み込み方法は以下のステップで行います：

## インストール
Flutterプロジェクトに「rate my app」パッケージを追加します。

``` bash
flutter pub add rate_my_app
```

## 初期設定

アプリ起動時に「rate my app」を初期化し、レビューダイアログの表示条件を設定します。例えば以下の設定では「アプリを7日以上使用しているユーザー」かつ「アプリを10回以上起動したユーザー」にレビューを促すことができます。
また `remind~`引数を設定することで評価ダイアログ表示後に「後で」と答えたあとの、再表示条件を設定できます。

``` dart
  final RateMyApp _rateMyApp = RateMyApp(
    preferencesPrefix: 'rateMyApp_',
    minDays: 7, 
    minLaunches: 10,
    remindDays: 7,
    remindLaunches: 10,
  );
  ```



## レビューダイアログの表示と設定
ユーザーがレビューを行う条件を満たした場合にダイアログを表示します。

``` dart
void _initRateMyApp() {
  _rateMyApp.init().then((_) {
    if (_rateMyApp.shouldOpenDialog) {
      _rateMyApp.showRateDialog(
        context,
    }
  });
}
```

自身のアプリでは「数回起動したことがアプリへの関与を示したこと」として評価ダイアログを表示することを実現でき、自然な形でレビューを促せるようになりました。

※デバッグ時の確認では起動回数などを `minDays:0, minLaunches:1` にして `_rateMyApp.sreset()` をして検証しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262578/2ad301ec-ea29-32fe-19d4-31ca8092cac9.png)


# まとめ

「rate my app」を用いたアプリ内レビュー機能の組み込みは、ユーザーの体験を大きく向上させると同時に、開発者にとっても柔軟性の高い選択肢として利用できます。
アプリ開発でご参考になれば幸いです。

# 参考資料など

- [Apple Developer requestReview](https://developer.apple.com/documentation/storekit/skstorereviewcontroller/3566727-requestreview)
- [Apple Human Interface Guidelines Ratings and reviews](https://developer.apple.com/design/human-interface-guidelines/ratings-and-reviews)
- [rate_my_app](https://pub.dev/packages/rate_my_app)
- [in_app_review](https://pub.dev/packages/in_app_review)
[DAX Studio] インデントベースのコードフォールディング

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## インデント・ベースのコード折り畳み

:::note
これはプレビュー機能で、「オプション」>「プレビュー」で有効にする必要があります。
:::

DAX Studioには完全な機能を備えたDAXパーサーがないため、コードの折りたたみなどの一部の機能を正しく実装することは不可能ですが、この機能を使用すると、インデントレベルに基づいてコードを折りたたむことができるため、「適切にフォーマットされた」DAXコードに対して興味深い回避策が提供されます。この機能により、長いクエリからコードのブロックをインデントし、それを折りたたむことで、興味のあるコード部分だけを1つの画面で見ることができるという、興味深い使用例が可能になります。

次のクエリーを例にとると...

![indent-code-folding-unformatted-0eb8ff65200d2c13077524623735e814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/06702aca-1622-ca4f-21b3-71d12ce0d0ed.png)

インデントによるコードの折りたたみをオンにすると、6行目から9行目が折りたたまれていることがわかります。

![indent-code-folding-unformatted1-23f1da2eb64236410b02ee5bdc0f0fb6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/eaebc86c-cfa4-e73c-e4ce-b741741db777.png)

しかし、[DAX Formatterを使って](https://daxstudio.org/docs/features/daxformatter-support/)コードをフォーマットしてみると、コードの論理ブロックを折りたたむことが可能になったことがわかります。

![indent-code-folding-formatted-86f28a9c2e62a18bb06a3b3aef1e40bf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/635dbcd4-1c81-c58f-6db7-ea9f6e50497c.png)

これにより、変数やメジャー、関数コールを折りたたむことができ、クエリの特定の部分だけに焦点を当てることができます。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ce955a53-d830-5096-196b-df4558735ab4.png)
振り返りに加えて、向き直りもしていこう

## この記事は何
チーム開発をしている方、特にスクラムなどを採用している場合はスプリントごとに振り返りをしていることが多いのではないでしょうか？
振り返りはチームとしての学びを最大化させていく上で非常に重要なものですが、振り返りに加えて「向き直り」をしていくことも非常に重要です。

この記事では向き直りについて紹介していきます。

## 振り返りとは
向き直りの紹介をする前に、振り返りについて紹介します。
振り返りはみなさんご存知の通り、プロジェクトやスプリントなど、一定の期間ごとに取り組んだことに対しての良かったところ、改善点などを洗い出しながら、次回以降のアクションの改善に活かしていくためのプロセスです。
この振り返りを行うことで、イテレーティブに改善を行なっていくことができ、チームとしての動きの質を高めていくことが可能です。

## 向き直りとは
振り返りがプロジェクトやスプリントなどの比較的短い期間での取り組みをみて改善を行なっていくのに対し、
向き直りは「チームとして元々目指していたこと」と「現時点の自分たちの状態」をみながら、これからの動きの改善を行なっていくものになります。

この向き直りというプロセスは市谷聡啓さんが提唱しており、[組織を芯からアジャイルにする](https://www.amazon.co.jp/dp/4802512384/)などの中で紹介されています。

## なぜ向き直りが必要になるのか
向き直りは言葉にするととても簡単なプロセスです。文字通り、元々設定していた目標や目的を思い出し、自分たちの今の状態がその方向に向かえているかどうかを考えるだけです。

「これなら普段の振り返りだけでも良いのでは？」と思う方もいるかもしれませんが、そうもいかないことがあります。

なぜなら、振り返りは短期間の過去のみをみて向かう方向やアクションの改善を行なっているため、チームの目標を設定した後時間が経てば経つほど元々の目標や目的からずれていってしまう可能性があるためです。

![振り返りの差分.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158501/58a0eee7-6522-c024-2e53-211f6680ab21.png)

向き直りとは、この「元々目指していた場所」と「現在いる場所」のずれを可視化するために必要になるプロセスです。
この向き直りをすることで、日々の振り返りの方向を補正することができ、改めて価値のある振り返りが行えるようになっていきます。

## どのタイミングでやると良いか
基本的には振り返りのみ行い、振り返りが以下のような状態になってきたときに向き直りを実践していくと良いと思います。

- 日々の振り返りが同じような内容になってきている
- 振り返りで課題が特に出てこない
- 振り返りの改善点が細かい話が増えてきている（大きな課題が出てこなくなってきている）

このような状態になっているときは、目指していたところが曖昧になってきている、またはすでにそこを超えた状態まで到達している状態などになります。
そのような場合は向き直りを行い、改めて自分たちが向かっている場所の共通認識を作っていくことができれば、また次回からの振り返りの価値が高めることができるはずです。

## 参考


https://www.amazon.co.jp/dp/4802512384/

https://note.com/hiroko_nozawa/n/na964eef3ce74

https://logmi.jp/tech/articles/327319
[DAX Studio] ファンクション・メタデータ

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## ファンクション・メタデータ

このタブには、利用可能なすべてのDAX関数のリストが表示されます。 関数をクエリエディタにドラッグすると、その関数が必要とするパラメータを示すスタブが表示されます。

![functions-8fd338a95a3b96c26acaf73fb3de2aff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/4b5f2140-130f-ffee-3658-15d94f9a2b4b.png)
[DAX Studio] 柔軟なレイアウト

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## 柔軟なレイアウト

Dax Studioにはドッキングコントロールが搭載されており、好みに合わせてドキュメントやツールウィンドウを移動させることができます。

ツールウィンドウはドキュメント内に配置することができます。

![flexible_layout_2-bd4cbc412fd90880f9e45689b78e73ed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9af9b398-ea93-16f9-c0ac-e07b14a8c075.png)

必要であれば、結果を編集ペインの下のデフォルトの位置以外の場所に配置することができます。

![AlternateTabLayouts-09ae957ba6810ac57a9c06e06219ac87.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/412ad5d3-f05e-5712-7f14-9d397ef06b62.png)

また、ドキュメントはメインウインドウ内に配置することができます。

![flexible_layout_1-44a0ee4d6701711996df8153a9a512ac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/a9aa7044-c2f0-3aea-7819-ec8cbbe5fb75.png)

:::note warn
現在、レイアウトの変更は保存できませんが、将来のリリースでこの機能を追加したいと考えています。
:::
Dataloderバッチ、共通設定インポート方法

## Dataloderバッチ、共通設定インポート方法

### 共通設定のプロパティファイルを定義する。
```Properties:setting.properties
sfdc.endpoint=https://mydomain.my.salesforce.com
sfdc.username=myusername@mycompany.com
sfdc.password=001aaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbccccccccccccccc
```

### process-conf.xmlで上記のプロパティファイルを読み込む
```XML:process-conf.xml
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <!-- 設定Propertyをインポートする -->
    <property name="locations" value="file:C:\DataExport\conf\setting.properties"/>
</bean>

<bean id="process1" class="com.salesforce.dataloader.process.ProcessRunner" scope="prototype">
    <description>Do something process.</description>
    <property name="name" value="property_name"/>
    <property name="configOverrideMap">
        <map>
            ...
            <entry key="sfdc.endpoint" value="${sfdc.endpoint}"/>
            <entry key="sfdc.username" value="${sfdc.username}"/>
            <entry key="sfdc.password" value="${sfdc.password}"/>
            ...
        </map>
    </property>
</bean>
```
[DAX Studio] リンクされた Excel モード

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## Excel - リンクされた結果

:::note
この出力オプションは、ExcelアドインからDAX Studioを起動した場合のみ使用できます。
:::

リンクされた Excel モードを使用して結果が出力されると、アクティブな Excel ワークブックに表データソースへの接続と DAX クエリが埋め込まれたテーブルが作成されます。これは、Dax Studio を使用していないユーザーがこのテーブルのデータを更新できることを意味します。

:::note warn
このタイプの出力を使用するのは、データ ソースが PowerPivot またはサーバー ベースの接続の場合にのみ意味が_あります。_PowerBI Desktop または SSDT Integrated Workspace に接続する場合、これらの 2 つのデータ ソースが使用する内部ポートは、開くたびにランダムになります。これは事実上「リンク」を壊すことになり、これらのデータソースには静的 Excel出力がより良い選択であることを意味します。
:::

## Excel - 静的結果

:::note
この出力オプションは、ExcelアドインからDAX Studioを起動した場合のみ使用できます。
:::

この出力オプションは、単にDAXクエリを実行し、アクティブなExcelワークシートの指定されたシートに結果をコピーします。これはデータの静的なコピーであり、リフレッシュすることはできません。[(リンクされたExcel](https://daxstudio.org/docs/features/excel-linked-results/)出力オプションとは異なります）
[DAX Studio] ベンチマーク実行

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## ベンチマーク実行

ベンチマーク機能は、コールドキャッシュとウォームキャッシュを使用してクエリを何度も実行し、詳細なタイミング情報を収集する自動化された方法を提供します。

**Run Benchmark**ボタンはリボンの**Advanced**タブにあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/4f582dbb-a390-d4cc-b108-eb9c679414e4.png)

このボタンをクリックすると以下のダイアログが表示され、現在のクエリをコールドキャッシュとウォームキャッシュで実行する回数を設定することができます。_コールド_キャッシュを実行するには、各実行の前にClear Cacheコマンドを実行します。_ウォーム・キャッシュの_実行では、キャッシュをクリアせずにクエリを実行するので、クエリがエンジン・キャッシュを利用できれば、実行時間が短くなるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/08752ea8-baf6-bc8b-1173-d2701611968b.png)

デフォルトでは、コールドキャッシュとウォームキャッシュの実行回数は同じですが、この2つの間のリンクを解除して、2つの数値を個別に設定することで変更できます。

すべてのクエリーが完了すると、タイミング結果が表示されます。最初のタブはサマリー結果で、コールドキャッシュとウォームキャッシュの実行に関する様々なサマリー統計が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/55621546-cec5-9901-23bf-317f9d1b192b.png)


また、個々のクエリの詳細な結果を表示する詳細ビューもある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/6a8a9f22-d03a-0c41-0d2c-7dadb6896c38.png)
[DAX Studio] DaxFormatter.comのサポート

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## DaxFormatter.comのサポート

Dax Studio には、[www.daxformatter.com](http://www.daxformatter.com/)を使用してクエリをフォーマットするためのサポートが組み込まれています（クエリをフォーマットするにはインターネット接続が必要です）。

例えば、次のようなクエリーを入力したとします。

![dax_formatter_before-bcdcf99498bfa2c884f70364c9cbf74a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/255c2781-f2d8-6697-9946-db4c7bb4d64c.png)

Dax Formatterボタンをクリックする（またはF6キーを押す）と、クエリがフォーマットされます。

![dax_formatter_after-46bbf8654033c45a4a8457e63fd9d0fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e5b24a66-25e5-090d-fae5-c82db0aae443.png)
[DAX Studio] 接続ダイアログ

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## 接続ダイアログ

DAX Studioの接続ダイアログには、接続先が表示されます

-   PowerPivot_（ExcelのAddinsリボンからDAX Studioを起動した場合のみ使用_可能）
-   Power BI デスクトップ / SSDT 統合ワークスペース
-   SQL Server Analysis Servicesサーバー（TabularまたはMulti-Dimensionalを実行中）
-   Azure Analysis Services ダイアログボックスには、現在有効な接続オプションのみが表示されます

## PowerPivotに接続する

このオプションは、ExcelのアドインリボンからDAX Studioを起動した場合のみ有効です。Excel以外でDAX Studioを起動した場合は、PowerPivotに接続できません。

![ConnectPowerPivot-f68d4815529135d4ee9f7fcaeee15347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/da773042-9ce0-59ed-4412-ee3969382950.png)

## Power BI デスクトップ / SSDT 統合ワークスペースへの接続

DAX Studioは、ローカルマシンで実行されているPower BI Desktopのインスタンスを検出し、pbixファイル内のモデルに接続するオプションを提示します。また、統合ワークスペースを使用しているモデルで SQL Server Data Tools（SSDT）を実行している場合は、そのモデルにも接続できます。

![ConnectAll-064e5cec5baacf55fc7940f2dac6f9a4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ec23c431-e98a-9355-bdb0-701ee23725dc.png)

> 注意: SSDT では、SSDT のタイトルバーからモデルの名前を取得します。これは、Tabular プロジェクトがソリューション内の唯一のプロジェクトである場合にのみ機能します。一つのソリューション内に複数のプロジェクトがある場合、同じ名前の複数のデータソースが表示されます。残念ながら、現時点ではインメモリエンジンのインスタンスをソリューション内の特定のプロジェクトにリンクする方法は見つかっていません。

## SQL Server Analysis Servicesサーバーへの接続

DAX Studioは、TabularまたはPowerPivotモードで動作しているすべてのサーバーに接続でき、SQL Server 2012 SP1 CU4以降を実行している多次元サーバーにも接続できます。

![ConnectServer-23bf359214996455b256696bc9583ebc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/5a433a9f-4cbd-396a-afac-862b1f51d89a.png)

## 高度なオプション

追加の接続プロパティを設定する必要がある場合、最近のプロパティのいくつかは、"Advanced Options "セクションにリストされています。

![uploading...0]()
[DAX Studio] クリア・オン・ラン

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## クリア・オン・ラン

これはトグルボタンで、有効にするとクエリを実行する前に自動的に[Clear Cache](https://daxstudio.org/docs/features/clear-cache/)コマンドを実行します。これは、最悪のケースを想定してチューニングを行いたいパフォーマンスチューニングの場面で有用です。

![clear-on-run-286b7e4f49ead8293b65865c96a36f00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ff2a4ead-5f98-c550-be5b-7a75e0c06f09.png)
[DAX Studio] ブラケットマッチング＆キャッシュクリア

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## ブラケットのマッチング

Dax クエリは非常に複雑になり、深いレベルの入れ子になった括弧を含むことがあります。Dax Studioは、一致する括弧をハイライト表示することで、この作業を支援します。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/71578c92-e699-fb93-0a9e-e21c81ae3a68.png)

## キャッシュクリア

このオプションを使用すると、現在接続されているデータベースのストレージエンジンキャッシュを1回でクリアすることができます。

![clear-cache-81447eec499b27e0842598eda906f001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/48b259ea-fcf1-7a51-2db2-bebadb33f426.png)
【AtCoder】入茶するまでにやったことと今後の意気込み

## はじめに
AtCoderを2023年の8月頃からコソコソとはじめ、2023年の11月にようやく入茶したのでそのレポートを書きたいと思います。

![screenshot 2023-11-25 16.26.30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3080550/108948ae-2106-7786-47e9-8262d1f41291.jpeg)

見て分かる通り、一番最初は3月に参加したのですが詳しくは後述します。

## 自己紹介
情報系の学部に通う大学3年生です。

プログラミングは大学1年生からはじめ、
python、C、C++、Haskell、R、Ruby、などなどを色々かじってますが、
競プロではpythonを使っています。

静的型付け言語をもっと頑張りたいなあと思いつつ、結局楽なPythonに逃げてしまいます💦

関数型言語のHaskellも極めてみたいです！

## 競プロを始めたきっかけ
私が競プロを始めたきっかけは、とある企業のインターンシップです。

もともと授業のプログラミングは好きだったので、
プログラミングができるインターンがあるよ〜と学校から募集があったときに申し込みをしました。

そこのインターンを今年の2月で終え、楽しかったなー続けたいなーと思いつつも、
他のやるべきことに追われて結局続けられず、2回くらいで終わってしまいました。

就活するのか院進するのか、色々悩んで紆余曲折あり、
8月頃から本格的にエンジニアを目指し始めたので、競プロを再開しました。

今は、純粋に「楽しい」という思いと、エンジニアとして「実装力を身につけたい」というモチベーションでAtCoderに取り組んでいます。

## 入茶するまでにやったこと

私が入茶するまでにやったこととしては、大きく2つです。

- [AtCoder Beginners Selection](https://atcoder.jp/contests/abs)を解く
- 毎週のABCに参加し、毎回振り返りをする

以上です。

私は、習うより慣れろ精神で、問題を解きながら理解するタイプなので、
とにかくたくさんの問題に触れてたくさん練習していました。

アルゴリズムも、問題に出てくるたびに覚えるという方針を取っていました。

毎回のコンテストの振り返りとしては、こんな感じでやっていました。

1. 自分が解けなかった問題で、分からなかったポイントを整理する
2. 解答例を見て、自分の分からなかったポイントをどうやって実装しているのか確認する
    a. ここで何かしらのアルゴリズムが出てきたら、記事を探して勉强する
3. 自分の回答ファイルと別ファイルを作って、実装してみる

ちなみに解答例が自分の使った言語と違う場合は、
その言語の習得のために自分でpythonに直してみるか、ChatGPTに変換をお願いしていました。

結果的に、割と効率よく茶色までたどり着けたんじゃないかなあと思います。

## 今後の意気込み

茶色まではなんとなくで取り組んでいても簡単にたどり着けましたが、
次の緑までにはD問題が安定して解けるくらいまでの実装力が必要だと思うので、
「常設中のコンテスト」や[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)を活用しながら
競プロに触れる頻度を増やそうかなあと思っています。

来年には入緑し、とりあえずは水色エンジニアを目指したいです。
[DAX Studio] サーバータイミングのトレース

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## サーバータイミングのトレース

:::note
トレースにはサーバーの管理者権限が必要です。管理者権限がない場合、トレースボタンは無効になります。
:::

出力ウィンドウで報告される標準的なタイミングは、Dax Studioで記録されたクエリの経過時間ですが、ネットワーク速度や結果セットのサイズによって影響を受けることがあります。サーバーの視点からクエリのタイミングを確認したい場合は、サーバータイミングトレースボタンを使用します。

![server-timings-tab-153b7aa870f1027cbc270741fe0fc6b8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/47d5198f-f575-af5a-d764-f71c0da9fb8a.png)

このボタンをクリックすると、追加のタブが表示され、サーバーがクエリの処理に費やした合計時間、ストレージエンジンに費やした時間、クエリに対するストレージエンジンのリクエスト数が表示されます。

| **メートル** | **説明** |
| --- | --- |
| Total | これは、Query End プロファイラのイベントから取得した、ミリ秒単位のクエリ時間の合計です。これは、サーバがクエリを処理するのに要した時間の合計です。(そのため、クライアントが結果セットを処理するのにかかった時間は含まれません。） |
| SE CPU | これは、Storage Engineのクエリに費やされたCPU時間の量である（この数値は100％信頼できるとは_限らないので_、あまり重要視しないように注意）。SE CPUの下の青い比率は、SE CPUのSEに対する比率であり、SEが実行した平均並列処理の非常に大まかな指標である。この数値は、ストレージエンジンイベントのCPU時間を合計することで計算されます。 |
| FE | これはフォーミュラエンジンに費やされた時間であり、TotalからSEの時間を差し引いて計算される。その下の青い数字は、FE / 合計のパーセンテージです。 |
| SE | これはストレージエンジンで費やされた時間であり、すべてのストレージエンジン・クエリの 時間を合計して計算される。その下の青い数字はSE/Totalのパーセンテージです。大まかな経験則として、Storage Engineはマルチスレッドであるため、より多くの処理を並行して行うことができるため、クエリにより多くの時間を費やすようにしたいものです。一方、フォーミュラエンジンはシングルスレッドで、複数のCPUコアを利用することはできません。FEはSEの上位に位置するため、100%ストレージエンジンで処理されるクエリーを持つことはできない。FEはSEにリクエストを発行し、クライアントに送り返す前に結果セットをシリアライズする。 |
| SE Queries | これは、クエリの処理中に実行されたストレージ・エンジン・クエリの数である。 |
| SE Cache | これはストレージエンジンのキャッシュヒット数である。 |

また、インポート・モード・モデルに対してクエリを実行する際にスキャン・イベントによってキャプチャされる「SQLのような」クエリが何であるか疑問に思うかもしれません。これはxmSQLと呼ばれ、Formula EngineがStorage Engineに送信したリクエストのテキスト表現です。これらのクエリを実行する方法はなく、ストレージ・エンジンが実行した操作を理解できるように、ストレージ・エンジンに送信されたリクエストをテキストで表現しているだけです。データモデルが Direct Query モードの場合、実際のデータソースに対して実行される前に、よりデータソース固有のクエリに変換される一般的な T-SQL クエリが表示されます。
Active Record の関連付けについて、気になったところをメモした

https://railsguides.jp/association_basics.html

## 関連付けを行う理由
:::note
コードの共通操作がシンプルになって扱いやすくなる。
AuthorモデルとBookモデルがあり、一人の著者は複数の書籍を持っている。
:::
##### 関連付けを設定していない状態
```ruby
class Author < ApplicationRecord
end

class Book < ApplicationRecord
end

# 既存の著者が新しい書籍を1件追加したい場合
@book = Book.create(published_at: Time.now, author_id: @author.id)

# 著者を1人削除する場合
@books = Book.where(author_id: @author.id)
@books.each do |book|
    book.destroy
end
@author.destroy
```


##### 関連付けを設定した状態
```ruby
class Author < ApplicationRecord
  has_many :books, dependent: :destroy
end

class Book < ApplicationRecord
  belongs_to :author
end

# 既存の著者が新しい書籍を1件追加したい場合
@book = @author.books.create(published_at: Time.now)

# 著者を1人削除する場合
@author.destroy
```


## 関連付けの種類
### `belongs_to`について
* 単独で使用すると、一方向のみの「1対1」のつながりを生成
    * 「個別の書籍は、その著者を知っている」「著者は自分の書籍について知らない」
* 双方向関連付けをセットアップするには、相手側のモデルに`has_one`や`has_many`を指定する
* `optional`が`true`に設定されている場合、`belongs_to`では「参照の一貫性」が担保されない。ユースケースによっては、参照カラムでDBレベルの外部キー制約を追加する必要がある
* 宣言する場合、指定するモデル名は必ず「単数形」 `belongs_to :author`

:::note
**参照の一貫性**とは
参照する側の表の外部キーが、参照される側の表の有効な行を必ず参照していなければならないこと
:::

### `has_many`
* 宣言する場合、指定するモデル名は必ず「複数形」 `has_many :books`

### `belongs_to`と`has_one`のどちらかを選ぶか
2つのモデル間に1対1のリレーションシップを設定する場合、一方に`belongs_to`,一方に`has_one`を追加する必要がある。

##### 区別の決め手
* 外部キーをどちらに置くか。外部キーは`belongs_to`関連付けを追加したモデルのテーブルに追加する
* データの実際の意味を考える
    * `has_one`は主語となるものが、目的語となるものを「所有する」ことを表す。より意味が自然に成り立つように設定する

### ポリモーフィック関連付け
:::note
ある1つのモデルが他の複数のモデルに属していることを、1つの関連付けだけで表現できる。

例えば、写真モデルがあり、このモデルは従業員モデルと製品モデルの両方に従属させたい場合、以下のように宣言する。
:::

```ruby
class Picture < ApplicationRecord
  belongs_to :imageable, polymorphic: true
end

class Employee < ApplicationRecord
  has_many :pictures, as: :imageable
end

class Product < ApplicationRecord
  has_many :pictures, as: :imageable
end
```

この時、ポリモーフィックなインターフェースを宣言するモデルで、外部キーのカラムと型のカラムを両方とも宣言しておく必要がある。

```ruby
class CreatePictures < ActiveRecord::Migration[7.1]
  def change
    create_table :pictures do |t|
      t.string  :name
      t.bigint  :imageable_id
      t.string  :imageable_type
      t.timestamps
    end

    add_index :pictures, [:imageable_type, :imageable_id]
  end
end
```
Godot(C#)で"Unicode parsing error"が出るとき

# 結論
おそらく君はVisualStudioを使っている。
そしてうっかり非ASCII文字である日本語をソースコードに含めてしまった。
VisualStudioはS-JISをデフォルトで使いやがるのでGodotに合わせてUTF-8を使うように設定する。
下記のような.editorconfigファイルを作成する。
```editorconfig:.editorconfig
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
```
参考：

https://stackoverflow.com/questions/41335199/how-to-config-visual-studio-to-use-utf-8-as-the-default-encoding-for-all-project

ただしすでに作成済みのファイルは解決されないので各ファイルについて名前をつけて保存からエンコード付き保存を使いUTF-8として保存する。
全部のファイルに行わねばならないので面倒。

# 現象
コメントとかで日本語を使うとバチクソ切れられるように見える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422353/9856232e-b2d1-9272-af6d-80e3f9f516a9.png)
コメントならまだしも、Printデバッグで日本語が使えないのは日本語母語話者としてはつらい。

# 試行錯誤の錯誤の部分
カスタムテンプレートも試したが相変わらず生成時にS-JISになってしまうようだった。
https://docs.godotengine.org/en/stable/tutorials/scripting/creating_script_templates.html

```C#
// meta-default: true
// meta-description: 日本語を使ってもエラーが出ないテンプレートなはずだった
using _BINDINGS_NAMESPACE_;
using System;
public partial class _CLASS_ : _BASE_
{
    public override void _Ready()
    {

    }

    public override void _Process(double delta)
    {

    }
}
```

そしてVisualStudio側のカスタムアイテムテンプレートも同じくだめだった。
VisualStudioが新たにプロジェクトに入ったファイルに対して勝手に文字コード適用でもしているのだろうか。
[DAX Studio] サーバータイミングのオプション

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/

## サーバータイミングのオプション

ストレージ・エンジンxmSQLのテキストをより読みやすくするための後処理を制御するオプションがいくつかあります。


:::note
**xmSQLは**"読み取り専用 "のSQLライクな言語で、Tabularストレージエンジンが実行する操作のテキスト表現として存在します。実行できるクエリー言語ではありません。ストレージエンジンのスキャン中に実行される操作を理解するために存在します。
:::

[Server Timingsで](https://daxstudio.org/docs/features/traces/server-timings-trace/)ストレージエンジンイベントからの生のxmSQLの例を見ると、以下のようになります。

![all-options-off-0461b38e8384c7a6a3af36478add93fc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9391d9ef-75a7-6e9b-1f97-baec4264a5c5.png)

上記のような生のxmSQLクエリは経験豊富なユーザーでも理解するのが難しいかもしれません。しかし、クエリをよく見ると、多くのことがわかります。

-   フォーミュラエンジンのコールバックのように、他の操作に溶け込む重要な操作がある。
-   内部カラムIDへの参照があり、コードが読みにくくなっている。
-   エイリアス、グリッド、リネージ情報があり、コードを読みにくくしている。

![all-options-off-annotated-092f3584ceb28968cedab054b31d1e31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9adf1afc-f306-0089-4c72-e2082cef8747.png)

デフォルトでは、すべてのサーバータイミング簡略化オプションが有効になっています。以下の比較は、生のxmSQLクエリと、同じクエリをデフォルトオプションを有効にしてDAX Studioで表示した場合の違いを示しています。ご覧のように、右側のクエリの方が読みやすく、理解しやすくなっています。

![simplified-xmsql-comparison-72745e3703534cf0ae1da3e8895c4933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/a539ef41-ac59-820b-dd4b-864b801271af.png)
cantilever,a downward point load はりの応力とSFD,BMD 基本例題4.28 p108「材料力学演習(20221021)」をsympyでやってみたい。

・片持ち梁に関する例題。左端の固定支持。 
・たわみ、たわみ角を勉強中。
 # オリジナル
[基本例題4.28 p108](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=113)[　＜「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
・ver0.2
```python
# ver0.2
from sympy import *
var('P,l'        ,real=True)
var('RA,M,MA,x,F',real=True)
eqRA=Eq(-RA+P    ,0)                   ;print("#",eqRA)
eqMx=Eq(M-RA*x-MA,0)                   ;print("#",eqMx)
eqMA=Eq(0        ,MA+P*l)              ;print("#",eqMA);print()
sol =solve([eqRA,eqMx,eqMA],[M,RA,MA])
eqMx=Eq(M,sol[M].factor())             ;print("#",eqMx)
eqFx=Eq(F,diff(eqMx.rhs,x))            ;print("#",eqFx) 
eqRA=Eq(RA,solve(eqRA,RA)[0])          ;print("#",eqRA)
# Eq(P - RA, 0)
# Eq(M - MA - RA*x, 0)
# Eq(0, MA + P*l)

# Eq(M, P*(-l + x))
# Eq(F, P)
# Eq(RA, P)
```
・ver0.1　上と同じです。図4.47より　(？？？ 図4.11+36 ？？？)
```python
# ver0.1
from sympy import *

var('P,l'        ,real=True)
var('RA,M,MA,x,F',real=True)
eqRA=Eq(-RA+P    ,0)
eqMx=Eq(M-RA*x-MA,0)
eqM =Eq(M,solve([eqRA,eqMx],M) [M])
eqF =Eq(F,diff(eqM.rhs,x))
eqMl=eqM.subs({M:0,x:l})
sol =solve([eqRA,eqMl],[RA,MA])
eqMA=Eq(MA,sol[MA])
# 
print("# eqRA=",eqRA)
print("# eqM =",eqM )
print("# eqMl=",eqMl)
print()
print("#",eqF,",",eqF.subs({RA:sol[RA]}))
print("#",eqMA)
# eqRA= Eq(P - RA, 0)
# eqM = Eq(M, MA + RA*x)
# eqMl= Eq(0, MA + RA*l)

# Eq(F, RA) , Eq(F, P)
# Eq(MA, -P*l)
```

# いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート)

https://qiita.com/mrrclb48z/items/00dd08b0317069be9342

# いつもと違うおすすめです。
＞北海道大学工学部
＞はりのたわみの微分方程式 day

https://www.eng.hokudai.ac.jp/labo/maintenance/team_matsumoto/lecture/SM2/FY2020/bb3-1.PDF

#### 参考文献

＞5.2 せん断力と曲げモーメント【例題5.4】
＞JSME p69
＞端部に集中荷重Pを受ける片持ちはり
＞JSME p83
　
＞表5.1 片持ちばりの公式 1)
＞構造力学公式集 p128

- 村上敬宜. (2023). *材料力学* (新装版). 森北出版.　
例題5.1 p78
[DAX Studio] アウトプットモード


# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/


## アウトプットモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/fd2c557b-2ca8-bbb0-019d-bb8a6c0fbc33.png)

### グリッド

これはデフォルトのモードです。結果はDax Studio Resultsタブ内のグリッドに表示されます。

:::note
デフォルトでは、DAXクエリから返される結果はフォーマットされていません。DAX Studioには、モデルのメタデータをスキャンして書式文字列情報を探し、結果セットの列名と一致させようとする追加ロジックが組み込まれています。そのため、メジャーを作成したり、SUMMARIZEなどの関数を使用して出力列に別の名前を指定したりすると、書式設定は結果に反映されません。
:::

### タイマー

このモードでは、クエリは実行されますが、結果は破棄されます。これは主に、2つのクエリの速度を測定したいが、結果を表示することに興味がない場合のパフォーマンスチューニングに役立ちます。

### ファイル

結果は、タブ区切り（.txt）ファイルまたはカンマ区切り（.csv）ファイルに直接送信することができます。

:::note
クエリー結果はフォーマットなしでファイルに書き出される。数値は完全な精度で書き出され、datetimeカラムはISO 8601フォーマットを使用して書き出されます。これは、このオプションがテキストベースのファイルを書き出すため、列のデータ型やフォーマットに関するメタデータを含める機能がないためです。

特に日付は、地域によってフォーマットが異なるため、あるコンピュータで書き込んだファイルが、異なる地域設定のコンピュータで解析できなかったり、最悪の場合、一部のレコードがエラーなく日や月が入れ替わってしまい、正しくない結果につながる「破損」が発生したりする可能性があります。

ファイル出力は、Power BI データモデルから正確なデータを取得するための手段として機能するように設計されています。レポートを作成するための代替手段としては設計されていません。特定の書式設定が必要な場合は、クエリをページ分割されたレポートにコピーして、必要な書式設定を適用することもできます。Excel 出力を使用することも選択肢の 1 つです。このファイル形式には、生データの上にデータ型や書式を追加できる豊富な機能があるからです。
:::


### フォーマットファイル

結果は直接ファイルに送ることができるが、上記のファイル・モードとは異なり、フォーマット・ファイル・オプションはグリッド出力に適用されるのと同じフォーマット・ロジックを使用する。

### クリップボード
結果は、Excelなどのアプリケーションに貼り付けるのに適したcsvデータ形式でWindowsのクリップボードに送信されます。

### リンク

リンクモードを使用して結果を出力すると、アクティブな Excel ワークブックに表データソースへの接続と DAX クエリが埋め込まれたテーブルが作成されます。これは、Dax Studio を使用していないユーザーがこのテーブルのデータを更新できることを意味します。

Excelアドインから実行する場合は、アクティブなワークブックのどのシートに結果を表示するかの選択肢が与えられます。

Excelの外でDAX Studioを実行する場合、選択したクエリで.odcファイルを生成し、新しいExcelドキュメントで開きます。

:::note
エラーが発生したり、リンクされたExcel出力を使用しても結果が表示されない場合は、Grid出力ターゲットを使用してクエリをテストし、期待どおりに動作することを確認してください。
:::

### 静的（スタティック）

この出力オプションは、単にDAXクエリを実行し、アクティブなExcelワークシートの指定されたシートに結果をコピーします。これはデータの静的なコピーであり、リフレッシュすることはできません。(リンク出力オプションとは異なります）

Excelアドインから実行する場合は、アクティブなワークブックのどのシートに結果を表示するかの選択肢が与えられます。

Excelの外で実行する場合、ファイル名を入力するプロンプトが表示され、1つまたは複数のシートで新しいxlsxファイルが生成されます（現在のバッチに含まれるクエリの数によって異なります）。
Reteアルゴリズムについて学んだことメモ

本記事では、Reteアルゴリズムについて調べたことをまとめていきます。


## Reteアルゴリズムとは

計算機科学者であるCharles L. Forgy氏が考案したパターンマッチングアルゴリズムです。
以下の手続きを効率的に行うことができます。

- Inputデータが特定の規則(ルール)に合致しているかの照合
- ルール条件に合致するデータに対して、ルールで定められた処理の実行

過去に記事で紹介しているDroolsをはじめ、多くのルールエンジンの基盤となっているアルゴリズムです。

## 処理の流れ

Reteアルゴリズムの処理の中には、主に以下のような要素が登場します。

|要素|説明|
|--|--|
|working memory(WM)|ルールへのInputデータや、ルールによって生成されたデータが保管される場所|
|rete network|ルールの条件をもとに作成されるネットワーク <br> 後述するrete node, type nodeなどから構成される|
|rete node|root nodeとも称される<br>アルゴリズムにおいて、一番最初にデータが渡されるnode|
|type node|rete nodeの次にデータが渡されるnode <br> データの型に応じてどのtype nodeに送信されるかが決定される|
|alpha node|データの属性値を何らかの定数値と照合するnode<br> 条件に合致するデータのみを次のnodeに送信する|
|beta node|二つのデータの属性値を照合するnode <br> 条件に合致するデータのみを次のnodeに送信する|
|terminal node|すべてのbeta nodeの条件に合致するデータが最終的に送信されるnode <br> ここに到達したデータはルールのすべての条件を満たしたことになる|
|agenda|terminal nodeに送られたデータと、データが満たすルールの情報が保管される場所 <br> agenda上の(データ・ルール)の組み合わせに対して、順次ルールで定義したアクションが実行される|

具体例を交えて、データとルール条件との照合がどのように行われるかみていきます。
題材としては、顧客と注文データをもとに、クレジットカードのポイントが付与される簡単なルールを取り上げます。

|ルール名|顧客|注文.顧客名|注文.決済方式|ポイント|
|--|--|--|--|--|
|カード払いであれば10ポイント付与|〇|==顧客.名前|=="カード払い"|10 pt|

上記決定表では、注文が顧客に紐づくもので、決済方式がカード払いだった場合、10ポイントを付与するルールとなっています。
このルールは、以下のようなrete networkで表現されます。

![rete.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481175/743c0014-1484-3ae5-31b0-0e5e9e0a8028.png)

1. WMに保存された「注文」と「顧客」データがrete nodeに送信されます

2. 注文データは注文用のtype node(画像左側)に、顧客データは顧客用のtype node(画像右側)に渡されます

3. alpha nodeに到達した注文データに対して、決済方式の条件をみたしているかチェックします<br>カード払いでないデータは、次のnodeに渡されることはありません

4. alpha nodeの条件をみたした注文データと、顧客データはbeta nodeに到達します<br>ここで、注文データが顧客に紐づくものであることをチェックします

5. beta nodeのルール条件をみたす注文・顧客データは、terminal nodeに渡されます

6. terminal node に到達した注文・顧客データと、ルールの情報がagendaに保存され、ルールのアクション(10ptのポイント生成)が実行されます

Reteネットワーク上では、以下の操作をすることで、無駄なデータ⇔ルールの照合が発生しにくくなっています。
(A) データ型に応じたtype nodeへのデータ振り分け
(B) 各nodeにおける、ルール条件によるチェックと、後続のnodeへの送信判断


## Droolsでの利用

Droolsでは、Reteアルゴリズムの性能を改善したPhreakアルゴリズムというものが利用されているようです。
今後こちらについても紹介できたらと思います。

※ 実装されているのは、おそらくこのあたりかと

https://github.com/apache/incubator-kie-drools/tree/8.44.0.Final/drools-core/src/main/java/org/drools/core/phreak


## 参考

https://en.wikipedia.org/wiki/Rete_algorithm

https://docs.jboss.org/drools/release/6.2.0.CR2/drools-docs/html/HybridReasoningChapter.html#ReteOO
iOS17から追加されたQRコードの既存への影響について

iOS17から
AVCaptureMetadataOutputObjectsDelegate
のcaptureOutputから渡されるオブジェクトに
AVMetadataHumanFullBodyObject
が追加されています


下記のような実装であれば今まで通り問題ありませんが
決め打ちで処理している場合は注意が必要です

``` objective-c
 for (AVMetadataObject *metadata in metadataObjects) {
        
    if (![metadata isKindOfClass:[AVMetadataMachineReadableCodeObject class]]) continue;
    NSString *data = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
    NSString *type = metadata.type;
    // do something
}       
```
GoでtxtファイルをExcelファイルに変換

# 作成背景
Goの勉強としてテキストファイルからExcelファイルを作成し、そのデータを元にグラフを描画してみようと思ったので、記録のため、今回の記事を書きました。

# 準備
テスト用テキストファイル
```test.txt
商品名 値段(円)
プロテイン 3000
```

また、GoでExcelファイルを扱うために以下のライブラリを使用しました。今回、Go Modulesを利用したので、
```
go get github.com/xuri/excelize/v2
```
※詳しくはこちら

https://github.com/qax-os/excelize

# 実装

```main.go
package main

import (
	"bufio"
	"fmt"
	"log"
	"os"
	"strconv"
	"strings"

	"github.com/xuri/excelize/v2"
)

func main() {
	// 読み込むテキストファイルと書き出すExcelファイルの名前を決める
	var import_file, out_file string
	fmt.Scanf("%s %s", &import_file, &out_file)

	log.Printf("File Name: %s", import_file)

	file, err := os.Open(import_file)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// 打ち込んだExcelファイルが存在しなければ新しく作成
	var ef *excelize.File
	if _, err := os.Stat(out_file); err != nil {
		ef = excelize.NewFile()
		defer func() {
			if err := ef.Close(); err != nil {
				log.Println(err)
			}
		}()
	} else {
		ef, _ = excelize.OpenFile("./" + out_file)
	}

	//　テキストファイルを一行ごと読み込む
	var txtSlice []string
	scanner := bufio.NewScanner(file)
	rowNum := 2
	for scanner.Scan() {
		// 空白ごとに区切り、セルに一つずつ入れる
		txtSlice = strings.Split(scanner.Text(), " ")
		for i, v := range txtSlice {
			//シートに記述
			if i == 0 {
				ef.SetCellValue("Sheet1", "A"+strconv.Itoa(rowNum), v)
			} else if i == 1 {
				ef.SetCellValue("Sheet1", "B"+strconv.Itoa(rowNum), v)
			}
		}

		if ef.SaveAs(out_file); err != nil {
			log.Fatal(err)
		}

		rowNum++
	}

	if err := scanner.Err(); err != nil {
		log.Fatal(err)
	}
}
```
実装の手順としては以下のようになっています。
1. 読み込むテキストファイル名と作成するExcelファイル名を入力
2. テキストファイルのデータを一行ごと読み込み、さらに空白で区切ってスライスに代入。
3. スライスの中身を一つずつセルに挿入する


# あとがき
今回は2列のみのデータを用いたので力技で作成しましたが、数が多かったりデータの数がわからない場合に対応できないため、今後改善する必要があります。
何か良い案があれば是非教えていただきたいです。
Resolume 7 が起動できない場合の対処法

# はじめに
Windows 日本語版において
Resolume 6 および 7.13.2以前は問題なく起動できるが
Resolume 7.14.2 ～ 7.18.2 はインストール後に起動すると即クラッシュし起動できない
という現象の原因と対応策です。

# 原因
Resolumeは 個人用フォルダの「📄ドキュメント」に設定ファイルを保存するようになっています。

Resolume 7.14.2以降、
このフォルダがマルチバイト文字を含んでいる場合、起動時にクラッシュするようになりました。
　

私の環境ではOneDriveのセットアップ時に個人用フォルダがOneDrive内に設定され、
「📄ドキュメント」のフォルダパスが
`C:\Users\[USERNAME]\OneDrive\ドキュメント`
となっていたため、クラッシュしました。


# 対処
個人用フォルダ「📄ドキュメント」のフォルダパスが、半角英数字になるように変更します

① OneDrive内に「**Documents2**」フォルダを新規作成
　※同フォルダ出なくも良いです（ex. C:\Resolume とかでも大丈夫です）
 
② 新「**Documents2**」フォルダに旧「📄ドキュメント」内のファイルをコピー
③ 新「📄ドキュメント」フォルダアイコン、またはフォルダ内を右クリックして［プロパティ］を表示。
④ ［場所］タブを開いて［移動］ボタンを押し、先ほどの新「**Documents2**」フォルダを選択
⑤ 「フォルダーの移動」画面が表示され、確認するメッセージで［はい］を選択
　　※新「**📄ドキュメント**」（フォルダパスを見るとDocuments2になっている）と旧「📂ドキュメント」が表示されます。
⑥ Resolume Arena の最新版をインストールして起動してください。



# おわりに
上の現象はOSを英語版にしても※1解決しません。
（※1 設定＞時刻と言語＞Windowsの表示言語＞English）

本内容はResolumeに報告したところ
Resolume側でも日本語版Win10においてクラッシュを再現できたそうです。アップデートに希望を持ちたいと思います。
（2023/11/24）
Gitの超基本コマンド14選

# Gitの超基本コマンド9選

Gitはソフトウェア開発において広く使われるバージョン管理システムです。効果的なGitの使用は、プロジェクトの進行と協力を円滑にし、変更履歴を明確に管理します。ここではGitの基本コマンドを9つ選び、それぞれの機能と使用方法を詳しく解説します。

## Git基本コマンド

### ① ローカルリポジトリ準備: `git init`
- **使用方法**: `git init`
- **説明**: `git init` コマンドは、プロジェクト一番上のディレクトリにて実行することでGitリポジトリの初期化を行います。またカレントディレクトリに`.git`ディレクトリを作成してGitでの管理を可能にします。

### ② コミット準備: `git add`
- **使用方法**: `git add <ファイル名>`
- **説明**: `git add` コマンドは、指定したファイルをステージングエリア（コミットに含めるための一時的な領域　別名：インデックス）に追加します。ファイル名に`.`を用いるとすべての変更をステージングエリアに追加できます。

### ③ コミット: `git commit`
- **使用方法**: `git commit -m "コミットメッセージ"`
- **説明**: `git commit` コマンドはステージングエリアに追加された変更をコミットします。`-m` オプションに続いてコミットメッセージを記述します。

### ④ リモートリポジトリの登録: `git remote add`
- **使用方法**: `git remote add <リモートリポジトリ名> <リモートリポジトリURL>`
- **説明**: `git remote add` コマンドでリモートリポジトリを登録します。これによりリモートリポジトリへのプッシュやプルが可能になります。

### ⑤ プッシュ: `git push`
- **使用方法**: `git push <リモートリポジトリ名> <ブランチ名>`
- **説明**: `git push` コマンドはローカルのコミットをリモートリポジトリにアップロードします。通常、デフォルトのブランチは `master` または `main` です。

### ⑥ プル: `git pull`
- **使用方法**: `git pull <リモートリポジトリ名> <ブランチ名>`
- **説明**: `git pull` コマンドはリモートリポジトリの最新の変更をローカルリポジトリに統合します。

### ⑦ 状態確認: `git status`
- **使用方法**: `git status`
- **説明**: `git status` コマンドはワーキングディレクトリとステージングエリアの状態を表示し、変更されたファイルやコミットされていないファイルを確認できます。

### ⑧ 変更内容の確認: `git diff`
- **使用方法**: `git diff`
- **説明**: `git diff` コマンドは最後のコミット以降に変更されたコード内容を表示します。ファイルごとの変更点を確認するのに役立ちます。

### ⑨ コミット履歴の確認: `git log`
- **使用方法**: `git log`
- **説明**: `git log` コマンドはコミット履歴を表示します。各コミットにはコミットメッセージと共に一意のID（コミットハッシュ）が割り当てられています。

### ⑩ 履歴の詳細確認: `git log -p`
- **使用方法**: `git log -p`
- **説明**: `git log -p` コマンドは各コミットの差分（変更内容）を表示します。コードの変更履歴を詳細に追跡するのに便利です。Qキーで終了できる。

### ⑪ クローン: `git clone`
- **使用方法**: `git clone リポジトリURL`
- **説明**: `git clone` コマンドは、リモートリポジトリからローカルリポジトリにプロジェクトを複製するためのgitコマンドです。具体的には、リモートリポジトリ（通常はGitHubなどのホスティングサービス上のリポジトリ）から、そのリポジトリの完全なコピーをローカルマシンにダウンロードし、自分の作業用のリポジトリを作成することができます。

### ⑫ ブランチ確認: `git branch`
- **使用方法**: `git branch`
- **説明**: `git branch` コマンドは、現在のブランチ名の前にアスタリスク(*)が付いた一覧が表示されます。また、リポジトリに存在する全てのブランチが表示されます。

### ⑬ ブランチ作成&移動: `git checkout -b <new-branch名>`
- **使用方法**: `git checkout -b <new-branch名>`
- **説明**: `git checkout -b <new-branch名>` コマンドは、新しいブランチ「new-branch」を作成し、そのブランチに移動することを意味しています。

### ⑭ マージ: `git merge <マージ先のブランチ名>`
- **使用方法**: `git merge <マージ先のブランチ名>`
- **説明**: `git merge <マージ先のブランチ名>` コマンドは、現在のブランチの変更内容が指定したマージ先のブランチにマージされます。

Gitのこれらの基本コマンドは、日々の開発作業において非常に重要です。これらのコマンドをマスターすることで、効率的なコードの管理とチームとの円滑なコラボレーションが実現されます。初心者の方はこれらのコマンドを一つ一つ実践してみて、Gitの基本を身につけましょう。
[ODC]AppのPublic要素にアクセスする際のURLを確認してみる

ODCでは、Appが提供するPublicな要素は全て弱い参照であり、URL経由のアクセスになるはず。
そこで、Appが提供するPublicな要素がどのようなURLでアクセスされるのか、またそもそも本当にURL経由になるのかを確認してみる。

# 環境情報
ODC Studio(Version 1.3.4)

# ドキュメント
[強い依存関係と弱い依存関係について理解する](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/building_apps/understand_strong_and_weak_dependencies/)の「弱い依存関係」から

> アプリ間の依存関係は、マイクロサービスアーキテクチャパターンであるため常に弱い依存関係となります。コンシューマアプリはビルド時にプロデューサのコードを必要としません。

と、App間の依存関係は常に弱い参照であることが明記されている。
URLアクセスであることは明記まではされていないが、「マイクロサービスアーキテクチャパターン」であること、実行時に「コンシューマアプリはビルド時にプロデューサのコードを必要としません」とあることから、弱い参照関係にある要素へのアクセスは通信によって行われると考えられる（注：この後出てくるが、EntityはどうもHTTPS通信ではなく、バックエンドへの直接SQL発行でアクセスしていそう）。

# AppがPublicにできる要素
[Reuse elements across apps - PublicElements](https://success.outsystems.com/ja-jp/documentation/outsystems_developer_cloud/building_apps/app_architecture/reuse_elements_across_apps/#public-elements)に記載がある。

Appは、以下の要素をPublicにできる

- Entity
- Screen
- Service Action
- Static Entity
- Structure

Structureは他の要素のInput/Output Parameterの型としてPublicになるので、他の要素を見ていく。
あるAppがPublicにした要素を別のAppで参照し、検証する。

# Entity/Static Entity
## 結論：EntityはConsumerからSQLで読みに行っていそう（ドキュメントで裏付けが取れないので確証無し）
（この項は中身無し）

## Screen Aggregateの場合
Entity側で呼び出しに使われたURLを取得することはおそらくできない。
そこで、一応開発者ツール（ブラウザ）のネットワークタブでURLを確認すると、以下の形式。

```
https://<hostname>/<Consumer App名>/screenservices/<Consumer App名>/MainFlow/<Screen名>/ScreenDataSet<Aggregate名>
```

これは、呼び出し側（Consumer）の画面配下のURLへリクエストが飛んでいることを示す。

ただし、ODC Portalで画面のTraceログを確認してみると、Screen AggregateのTraceが直接SQLを記録している。これは、PublicなEntityへのリクエストがApp間のHTTPS通信ではなく、バックエンドのDBへの直接のSQL発行で行われていることを示しているのかもしれない。

今のところ、それを示すドキュメントが見つかっていないが、実はConsumer AppのEntityとProducer AppのEntityをジョインしたとき、Traceにはジョインを行うSQLが記録されることがこの見解を（弱めにだが）裏付けている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a8ba8211-23b3-8d72-e9e2-53f15d73dbb6.png)

## Consumerのサーバー側処理でAggregate呼び出しをした場合
試しにData ActionにAggregateを配置し、動作確認してみると、TraceにはSQLが記録される。
つまり、この場合も、Producer AppのEntityへのリクエストはバックエンドのSQLリクエストで行われていそう。

# Service Action
## 確認方法
Consumer側からProducer側のService Action呼び出し後、ODC PortalのTraceを確認し、URL欄を見る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/d3213686-64d0-6352-bfe9-54c7a016e1b2.png)

## 結果：httpスキーマのApp毎に決まったURLへの通信でアクセス
Consumer側のClient Action、Data Action、Timer、Expose REST APIからProducerのService Actionを呼び出し、URLを確認してみると、全て

```
http://svc-<GUID?>:8080/serviceapi/<ServiceAction Name>
```
このGUIDの部分は、ODC PortalでそのAppを開いたときの、idパラメータの値と一致している。

# Screen
これは確認するまでもなく、Producer側のScreenのURL（一応確認した）。
Workato：spreadsheetsに沢山のデータを書き込む際に、途中でjobが固まる

## はじめに
Workatoのレシピを使って、spreadsheetsに沢山のデータを書き込む際に、途中で書き込みが止まることがありました。（job自体はエラーとならず、processingでした。）

どうしたのかなと思い、`jobの履歴　→　当該のspreadsheetsアクション　→ debug`を見てみると以下のようなエラー（？）が出てました。

![スクリーンショット 2023-11-25 16.25.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/5047a31f-8a11-108a-099d-2125775ff5ac.png)

調べてわかったエラー理由と、私なりの解決策を書きましたので、同じところで詰まっている方の参考になれば幸いです。

## どのようなエラーなのか
### Google Sheets API ついて

Googleドライブ上のspreadsheetsを操作するためのGoogleが提供しているAPIです。
spreadsheetsのセルの値を読み取ったり、セルに値を書き込んだりすることができます。

workatoではこのGoogle Sheets APIを用いて、spreadsheetsとのコネクタを張り、値を書き込んだりしてます。

### Google Sheets APIの回数制限について
調べて見ると、Google Sheets APIは、下記URLページに記載されているように、API呼び出しに回数制限が設けられている様です。

[https://developers.google.com/sheets/api/limits](https://developers.google.com/sheets/api/limits)

![スクリーンショット 2023-11-25 15.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/e6be8688-4400-4aed-bfcd-60f21504bf93.png)

無料のユーザは、1分に**60回**のセルの読み書きまでが許されていることが分かりますね。


つまり先ほどのエラー`NETWORK TRACE POST 429`は、1分間に60回以上のAPIリクエスト（読み書きの依頼）をしたから起きたと推測されます。


## 解決策(レシピの改善)

#### １．「Scheduler by Workato」　を選択

先ほどのエラーを解消するため、ここでは、
spreadsheetのアクションの後に、`Scheduler by Workato`を利用しました。


Workatoの公式doc↓
[https://docs.workato.com/ja/features/scheduler.html#actions](https://docs.workato.com/ja/features/scheduler.html#actions)

![スクリーンショット 2023-11-25 16.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/fb80f88d-736f-31ac-1b6d-97327455be61.png)

#### 2．「Wait for time duration」アクションを選択
![スクリーンショット 2023-11-25 16.08.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/42f6f191-06fa-67b9-a0b1-a927172a1507.png)

#### ３．タブから「Enter custom value」を選択
![スクリーンショット 2023-11-25 16.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/7f08dc9e-c4ae-c6ea-0ea1-2fee0d5fc93a.png)

#### 4．任意の時間を入力
ここで入力する値は、秒単位になっています。今回は、1分間に60回以上のAPIリクエスト（読み書きの依頼）を避けるために、一回の呼び出しごとに**1秒のtime wait**を入れました。

![スクリーンショット 2023-11-25 16.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/2356bce0-06f2-73d3-b9c6-d6bde76997cb.png)

レシピ（参考までに）
![スクリーンショット 2023-11-25 16.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3628220/5f639a57-959e-a5e0-504b-18cd02543d2f.png)

#### ※注意事項
この`Scheduler by Workato`は *Test recipe* では正常に動作せず、Start recipeをした時のみ正常に動作する様なので、気をつけましょう。 

## 最後に
このようにすることで、Google Sheets APIの回数制限に引っかからず、書き込みを続けることができました！　参考になりましたら幸いです。
Javascriptで簡易的にモーダルを実装してみる

## はじめに
現在Javascriptを学習中で、簡易的にモーダルを実装してみました。

## 実装
### HTML
```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="./index.css">
  <title>Document</title>
</head>
<body>
　　　　<!-- モーダルを開くボタン -->
  <button id="modalBtn">モーダルを開く</button>
  <!-- モーダル本体。デフォルトでは非表示にしている -->
  <div id="myModal" class="modal">
    <div class="modal-content">
     <span class="close">✖︎</span>
     <p>モーダルを表示</p>
    </div>
  </div>
<script src="./index.js"></script>
</body>
</html>
```

### CSS
```css
/* モーダルの背景 */
.modal {
    display: none; /* デフォルトでは非表示 */
    position: fixed; /* 画面に固定 */
    z-index: 1; /* 他の要素の上に表示 */
    left: 0;
    top: 0;
    width: 100%; /* 全幅 */
    height: 100%; /* 全高さ */
    overflow: auto; /* スクロール可能 */
    background-color: rgb(0,0,0); /* 背景色 */
    background-color: rgba(0,0,0,0.4); /* 透過 */
}

/* モーダルコンテンツ */
.modal-content {
    background-color: #fefefe;
    margin: 15% auto; /* 中央に配置 */
    padding: 20px;
    border: 1px solid #888;
    width: 80%; /* 幅 */
}
```
### Javascript
```javascript
// 要素を取得
var modal = document.getElementById("myModal");
var btn = document.getElementById("modalBtn");
var span = document.getElementsByClassName("close")[0];

// ボタンをクリックするとモーダルを開く
btn.onclick = function() {
    modal.style.display = "block";
}

// <span> (x) をクリックするとモーダルを閉じる
span.onclick = function() {
    modal.style.display = "none";
}

// モーダルの外側をクリックすると閉じる
window.onclick = function(event) {
    if (event.target == modal) {
        modal.style.display = "none";
    }
}
```

### 実行結果
ボタン押下
↓
モーダル表示
↓
モーダルの×押下 or モーダル外押下でモーダルが消える
という実装ができています。

![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365570/ee099be6-f169-1977-ee91-2e076cf7569d.gif)
MacでUnityEditorの文字が潰れる

# MacだとUnityEditorの文字がつぶれてる

MacのUnityで新規プロジェクトを作ると、UnityEditorの文字が以下のように潰れていることに気づきました！

![文字が潰れている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f3010c7d-d977-f5a2-0001-9ca40abb88d0.png)

このままだとまともに作業ができないので、解決方法を調査しました。

ちなみにUnityのバージョンは `2019.4.29f1` です。

# OpenGL Coreを有効にする

調査したところ、以下のページを見つけました！

https://forum.unity.com/threads/unity-editor-windows-content-texts-are-broken-on-macos.1353605/

こちらによると、 `Edit > Project Settings > Player > Other Settings > Graphic APIs for Mac` に `OpenGL Core` を追加すればいいようです！

![設定変更](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/ccec6ae8-a4f4-ff0b-950e-3ccdf8e47855.png)

実際にためしてみたところ、以下のように文字潰れが解消されました！よかった！

![文字が潰れていない](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/50d50b11-b775-8387-702b-e43ffa850f96.png)

# 気になる点

このままだと、 `Metal` ではなく `OpenGL Core` でビルドされるようになってしまいます。

私の場合、たまたまPCがMacなだけで、Mac用のアプリを開発しているわけではないため、とくに問題はありません。

ただ、Mac用のアプリを開発している場合は、問題になりそうです…！

# さいごに

本記事作成にあたり以下のページを参考にしました。ありがとうございました！

- https://forum.unity.com/threads/unity-editor-windows-content-texts-are-broken-on-macos.1353605/
コマンドを実行、"Process"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の1日目の記事です。

## PHP内でコマンドを実行 "Process"

[Process](https://symfony.com/doc/current/components/process.html)は、PHP内でサブプロセスとしてコマンドを実行します。PHPでは、`exec`などでコマンド実行できますが、このコンポーネントはOSにより異なる引数のエスケープ処理を行ってくれます。Symfony以外でも使えます。

### インストール

```shell
composer require symfony/process
```

### サブプロセス実行

指定のコマンドで`Process`オブジェクトを作って、 `run()` を呼び出すことで実行できます。

```php
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;

$process = new Process(['docker', 'compose' , 'up', '-d']);
$process->run();

if ($process->isSuccessful() === false) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();
```

### 環境変数

サブプロセスに環境変数を渡すことも可能です。

```php
$process = new Process(['env'], env: ['TEST_ENV' => 'test_value']);
$process->run();

echo $process->getOutput(); // 環境変数のリストに TEST_ENV=test_valueが追加されてる
```

### 非同期処理

サブプロセスを非同期処理で実行することも可能です。また、途中でプロセスを待機状態にもできます。`wait()`メソッドもありますが、個人的には`waitUntil()`がおすすめです。

```php

$first = new Process(['date']);
$first->start();
while ($process->isRunnning()) {
  // 実行中の間ループ
  echo '..';
}
echo $first->getOutput(); // 2023-12-01 10:00:00

$second = new Process(['date']);
$second->start();

$second->waitUntil(function ($type, $output): bool { // callbackがtrueを返すまで待機
    $third = new Process(['sleep', '10']); // 10秒スリープ
    $third->run();

    return true;
});

echo $third->getOutput(); // 2023-12-01 10:00:10
```

## まとめ
今回は`Process`をご紹介しました。うっかり`exec()`使うよりも安全にコマンド実行できますし、非同期処理もうまく使えばとても便利です。
Github ActionでPRマージ時にリリースタグを自動発行する

# TL;DR

PRをマージした際に、既存の最新のリリースタグのリビジョンをインクリメントするようにしました。
作ったもの: https://github.com/cacapouh/auto-release

# リビジョンをインクリメントさせてタグ発行

例えば、0.0.1が既存の最新のリリースタグだった場合に、0.0.2で新規リリースタグを発行されます。

以下は実際に生成されたリリースノートとタグです。

![スクリーンショット 2023-11-27 12.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/bd431580-0587-660e-8196-c4d766d386d8.png)


* リリースノートについて
  * タイトルはPRのタイトルを設定するようにしています
  * ボディは最新のコミットメッセージを設定するようにしています
  * ワークフローファイル内では、以下のコマンドによりリリースノートを作成しています

```
curl \
  -X POST \
  -H "Authorization: token $GITHUB_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$payload" \
  "https://api.github.com/repos/${GITHUB_REPOSITORY}/releases"
```

# PRのタイトルでリリースタグを指定してタグ発行

また、PRのタイトルにバージョンを記載した場合、
そのバージョンで新規リリースタグを発行するようにしました。

![スクリーンショット 2023-11-27 12.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422592/725e1984-a128-9b9b-4df7-e5f6fdf62df5.png)


バージョンは正規表現で取得しています:

```
echo '${{ github.event.pull_request.title }}' | grep -oP '\b\d+\.\d+\.\d+\b | head -n 1' # ドット区切りの3連数値であれば何にでもマッチしてしまうため、プロダクトで利用する場合、もう少し制限を加えた方が良さそうです
```

# おわりに

PRマージ時に自動でリリースタグを更新するワークフローを作成しました。
このワークフローを使って、リリースによる手作業を減らすことができれば幸いです
[DAX Studio] すべてのクエリのトレース

# DAX Studio ドキュメントの日本語訳

Power BI／DAX開発者必携ツールの「DAX Studio」ドキュメントを日本語訳していきます。
「非公式」なので、言い回しに疑問があれば必ず公式ドキュメントを参照してください。

公式サイト
https://daxstudio.org/

公式ドキュメント
https://daxstudio.org/docs/intro/


# すべてのクエリのトレース

:::note
トレースにはサーバー管理者権限が必要です。権限がない場合、トレースボタンは無効になります。
:::

Dax StudioのAll Queriesトレースは、すべてのクライアントツールからのクエリーイベントのキャプチャをサポートします（[Query Planや](https://daxstudio.org/docs/features/traces/query-plan-trace/) [Server Timings](https://daxstudio.org/docs/features/traces/server-timings-trace/)機能のようにDAX Studioから送信されたクエリーだけではありません。

All Queriesトレースは、Power BI Desktop のようなクライアント・ツールで生成されたクエリを確認したい場合に非常に便利です。

次のウィンドウは、Power BI Desktop のレポートでいくつかのスライサーをクリックすると生成されるクエリのリストを示しています。

![all-queries-trace-224dddfbd6a5ffc1cb3f418f217f0d30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e9ba12e5-08c4-2566-5660-f27c23752ff7.png)

さらに調べたいクエリを見つけたら、クエリをダブルクリックしてエディタにコピーすることができます。

![all-queries-copy-to-editor-824bfc1b5ea080e1af3b9b3123bf4ab9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d2493ce1-e9fb-3788-8d0b-b160a1c5c79f.png)

All Queriesトレースには多くのイベントが含まれるため、特定のクエリを見つけるためにフィルタオプションを使用すると便利です。

![all-queries-filters-d435a9062682a89cf5db4fe8bc553074.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/78d4c816-d23c-5acd-79f4-7a5571b86066.png)

「すべてのクエリ」タブの上部には、小さなツールバーがあります。

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/fcccd025-3a35-3092-1a34-8c7914924851.png)

これらのボタンは左から右へ以下の通りの機能です。

| **ボタン** | **説明** |
| --- | --- |
| 記録 | 一時停止/停止したトレースを開始または再開する。 |
| ポーズ | 現在のトレースを一時停止する |
| ストップ | 現在のトレースを停止します（キャプチャされたイベントは出力ウィンドウに残ります）。 |
| 削除 | キャプチャしたすべてのイベントをクリアする |
| 編集部へのコピー | は、現在ハイライトされているクエリの内容を編集ペインにコピーします。 |
| フィルター表示 | フィルターコントロールの表示/非表示を切り替えます。 |
| クリアフィルター | は、現在設定されているすべてのフィルタをクリアします。 |

## Power BI デスクトップのキャッシュ

_All Queries_トレースをPower BIに接続する場合、Power BIには独自のレベルの内部キャッシュがあることに注意する必要があります。非常に高いレベルでは、以下のようになります：

![power-bi-caches-2a45ba274fe4ec97c476502a44f8114b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/da4e77d1-0342-5b21-78ad-7cb0849ce550.png)

つまり、DAX Studio が接続する前にビジュアルがレンダリングされている場合、フィルタの変更やクロスフィルタリングなど、_ビジュアルレベルキャッシュに_保存されているデータとは異なるデータを要求するような操作を行わない限り、通常はクエリをキャプチャすることはできません。

そこで、Power BI レポートの DAX クエリをパフォーマンス・プロファイル化しようとする場合に推奨される手順は、次のとおりです：

1.  空白ページに移動する（または新しい空白ページを作成する）
2.  Power BI デスクトップを保存する（白紙ページを選択した状態）
3.  Power BIデスクトップを閉じる
4.  Power BI Desktopでファイルを開きます（空白のページがあるはずです）
5.  DAX StudioをPower BI Desktopに接続する
6.  Dax Studioで_すべてのクエリの_トレースを開始する
7.  Power BI Desktopに切り替える
8.  空白でない他のページのいずれかに移動する

この時点で、DAX Studioはすべてのクエリを表示するはずです。