OmniAICreator/Qiita-1.07M huggingface dataset:
Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「タグの目的」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「タグの目的」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azureの管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)
◇対応するモジュール
[タグの目的について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-cost-management-azure/7-describe-purpose-of-tags)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Cost Managementツール」](https://qiita.com/fsd-jume/items/19b3d30cee710541d25c)

## タグの目的
**タグにより、追加情報(メタデータ)をリソースに付与できる**
⇒メタデータはリソース識別に役立つ名前と値のペア

### メタデータ付与の利点
**◆リソース管理**
・メタデータを用いてリソースを素早く検索し操作可能

**◆コスト管理と最適化**
・リソースをグループ化して、コスト管理や予算の追跡/予測が可能

**◆運用管理**
・ビジネスにおける可用性の重要度に応じてリソースをグループ化可能
⇒SLAの策定に役立つ

**◆セキュリティ**
・パブリックや社外秘などセキュリティレベルでデータの分類が可能

**◆ガバナンスと規制に対するコンプライアンス**
・取り決められたポリシーと一致するポリシーを識別可能
・リソースへのタグ付けを強制させることも可能
例)すべてのリソースに所有者名/部署名のタグ付けを要求

**◆ワークロードの最適化と自動化**
・ワークロードで使用しているすべてのリソースの視覚化に役立つ
⇒Azure DevOpsなどのソフトウェアを使用し、タグ付けしたリソースに対して自動タスクを実行可能

### リソースタグの管理方法
・追加や変更、削除が可能
⇒Windows PowerShell、Azure CLI、Azure Resource Managerテンプレート、REST API、Azure Portalを使用して可能
・Azure policyを使用して、タグ付けのルールと規則を強制可能
例)リソース作成時に特定のタグが追加されるように要求
・削除されたタグを再適用するルールも定義可能
・あるスコープから別のスコープへのタグの継承は行われない
・すべてのリソースにタグをつける必要なし
・各Azureリソースに1つ/複数のタグを割り当て可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/abb26706-fd40-f4d1-04f5-fb595d07393b.png)

## 次の学習内容
**◆Azure Blueprints**

https://qiita.com/fsd-jume/items/724472b9269450d4d15f

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
C#.NETのWPFアプリケーションでOracle.DataAccess…のタイプ初期化子が…の例外

:::note warn
対応した時の.NETやWindows10のバージョンをメモるのを忘れたので、あくまで参考情報となります。
:::

# 現象

1. 2022年11月02日発生。
1. C#.NETのWPFアプリケーションで下記の例外。
> Oracle.DataAccess.Client.OracleConnection のタイプ初期化子が例外をスローしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ec717506-0385-79d5-771e-65c98dfc1417.png)
3. Oracle Databaseに接続して値取ってくるようなタイミングで起きた。
4. Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
5. アプリケーションを動かしている全PCではなく、特定のPCで発生。

# WindowsUpdate適用したら直った

たまってたWindowsUpdate適用して再起動したら直っちゃった（ノ▽`）
作業前のバージョンとか控えてなかった…。

本当にWindowsUpdateが溜まっていたことが原因なのか **コレガワカラナイ** 。

ただ一つ言えることは、同じ状況になったらWindowsUpdateを試すことが復旧の近道になるかも、ということだけ…。

# 蛇足

イレギュラー作業する前は ソフトやOSのバージョン控えたり、いろいろスクショ撮ったり、 **現場保存** しようね。
S3ライフサイクルでバケットを空にするには3日かかる

タイトルのままのメモです。
S3バケットを消すには先にオブジェクトを消して中身を空にする必要があるのですが(バージョニング有効の場合はその分もすべて)、S3には大量のオブジェクトを格納しがち&料金も安いので放っておきがちで、数千万ファイルとか億超えるオブジェクトを普通に格納してる環境も多いのではないでしょうか。
そのような使い方をしてるバケットを空にしようと、バケットを空にする操作やフォルダを選択して削除を実行すると、オブジェクトは秒間数百?～みたいな感じで高速に消えてくのですが、ファイル数が多いとめちゃくちゃ時間がかかります(半日とかそれ以上とか)。
で、それをさくっとやるソリューションとして、ライフサイクルを設定して期限切れにして、AWS側で自動的に削除されるようにするというものがあります。
便利なのですが、削除されるのにかかる時間が予想と違いました。
予想では、期限切れを1日にセットしたら、なんとなく次の日とか、もしくはセットしてから24時間後とかに消えてるのかな～と思ってたのですが、実際にはセットしてから3日くらい見る感じになります。実際に設定したときの動作は以下となります

- 今日) 期限切れ1日でセットする -> 翌々日が有効期限日```オブジェクトはこの日に完全に削除されます```としてセットされる
- 1日後) 何も起こらず 
- 2日後) 何も起こらず(一応この日が有効期限日)
- 3日後) マネジメントコンソールで見たら消えてた

以下は、10/5に期限切れ1日でライフサイクルをセットしたときの表示です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620712/e7fddacf-1b6a-bfe8-0592-7ede4b4d8bc2.png)

これを見ると、10/7の9時以降どこかで消えるんだろうな、という感じですが、ライフサイクルを設定したタイミング(時刻)にかかわらず、有効期限日は必ず翌々日の9:00JSTになってる感じです。おそらく時刻に意味はなさそうです(9:00:00 AM JSTってUTCだと単に0時ですしね.. 「この時刻以降に」とか書いて無く、「この日に」って書いてあるところ見ても意味なさそうかなと..)

厳密には、
> - 2日後) 何も起こらず

この日のどこかで消されるとは思うのですが、何時に消されるのかユーザ側でコントロールできず、AWS側のアルゴリズムか何かで実行されてると思うので、バケットが空になっているはずとして運用に載せられる確認日は、結局3営業日見ることになるのかなと思います
Arduino IDE 2.0.1 で文字バケ

Arduino IDE 2.0.1　のシリアルモニタで文字バケが発生します。
ボードは Arduino Uno です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/e23bea93-1dbb-5534-5db0-24ac5710bcb5.png)

確認したプログラム

```text:hello_world.ino
// ------------------------------------------------------------------
/*
    hello_world.ino

                        Aug/15/2021
*/
// ---------------------------------------------------------------------
int count = 0;

void setup()
{
    // put your setup code here, to run once:

    Serial.begin(19200);
    Serial.println("*** start ***");
}

// ---------------------------------------------------------------------
void loop() 
{
    Serial.println("Hello World! " + String(count));
    delay(1000);
    Serial.println("Good Morning! " + String(count));
    delay(1000);
    Serial.println("こんにちは " + String(count));
    delay(1000);
    count++;
}

// ---------------------------------------------------------------------
```

cu　で受信すれば、文字化けは起こしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/ad43dd5c-d6ff-e96a-8159-19fff5010bbc.png)
ソフトウェアの開発手法

# アジャイル(agile)
アジャイル（アジャイルソフトウェア開発手法）は、数週間の単位で「要求、計画、開発、テスト、評価、リリースという開発サイクル（イテレーション)を繰り返し、```開発期間の短縮を図る```開発モデル。

### スクラム
```チームコミニュケーションを重視```したアジャイル手法。
チーム内に顧客を取り込んで、小さな機能単位を短期間で開発するため、```優先順位や目的に合ったもの```を目に見える形で作り上げることが可能。
```プロダクトオーナ(全体の管理を行う責任者)```、```スクラムマスタ(開発を支援する調整者)```、開発メンバー数名で、チームを組む。最長一ヶ月程度の開発単位（スプリント)の中で```「計画」、「日々の開発＋ミーティング」、「レビュー」```を行い、```「ふりかえり（スプリントの最終議論」```によって改善点を次のスプリントに生かしていく。

# 関連記事
https://qiita.com/masatom86650860/items/5cd93936df6e873740f7

https://qiita.com/masatom86650860/items/c30dae8914321034f7ab
多言語FizzBuzzチャレンジ2日目:Python

## ここまでのまとめ
https://qiita.com/tenteko/private/fc52f7aec63ba5f67854

## 本日のお品書き
みんな(?)大好きPythonです。Python3.11から高速化が折り込まれているので、for文を回しても心が痛まないですね！

## FizzBuzz
```python
def main():
    for i in range(1,101):
        if i%15==0:
            print('FizzBuzz')
        elif i%3==0:
            print('Fizz')
        elif i%5==0:
            print('Buzz')
        else:
            print(i)

main()
```

特に難しいことは無いですね…。
デザイン・コード変換(Design Code)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
デザインコード変換を使用して、カテゴリデータ要素を1つまたは複数の数値データ要素として表現し、カテゴリデータ値ごとにバイナリ数値フィールドを作成します。

カラムの値から列を生成します。
列の内容は指定された値が存在る場合にフラグで1が立ちます。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。


# 実行方法
## SQLから実行する場合の例
```SQL
CALL td_analyze (
  'vartran',                          /* 分析手法　*/
  '
  database        = QID;              /* データベース名 */
  tablename       = Superstore;       /* テーブル名 */
  designcode =
     {designstyle (dummycode), designvalues (Central/C,South/S), columns (Region)}
     {designstyle (dummycode), designvalues (East/E,West/W), columns (Region)}
  ;                                   /* 導出項目の定義 */
  '
);
```
:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::

## 出力結果
データ量が多いため上位10件を表示しています。
データが存在する列にフラグ1が立ちます。
|C|S|E|W|
|:-|:-|:-|:-|
|0|0|1|0|
|0|0|0|1|
|0|0|0|1|
|0|0|1|0|
|0|0|1|0|
|1|0|0|0|
|0|0|1|0|
|1|0|0|0|
|0|0|1|0|
|0|0|1|0|
|～|～|～|～|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
LPC812にLチカを書き込で遊ぶ(7)(ロング記事)(Lチカ書き込みと動作確認)


目的

やっと書き込む


1.書き込み
(注意　名前は、ここで違う)

Flash Magicで遊ぶ(書き込み)(LPC812) 

https://qiita.com/caa45040/items/1bd3e212018ab60b8a8d


2.USBを外してマイコンの電源を切る

3.ISPを外す

4.LEDを繋ぐ

5.電源を入れて確認する

6.おわり


![o_cop227.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8344181e-6846-3659-5ab3-dd5646216595.jpeg)
LPC812にLチカを書き込で遊ぶ(6)(ロング記事)(Lチカのコンパイル)


目的
オンラインコンパイラーでバイナリの作成


![o_cop226.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/cbac3b03-745d-843f-8e22-c2292f048eb2.jpeg)



1.ユーザー登録(どうやったか、わすれた)

2.ログイン画面


https://studio.keil.arm.com/auth/login/


3.NEW->Mbed Project


4.mbed-example-blinky

5.mbed2-example-blinky_lpc812_c4

6.コンパイル
LED1をP0_7に変えてコンパイル


![o_cop225.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/eea5aeca-d976-c732-dc18-306eb126c536.jpeg)

![o_cop221.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0d7ffd00-35f5-9cc4-c03e-80912ee58680.jpeg)

![o_cop222.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a34d483e-39bb-f157-541c-9c93fc0d42ac.jpeg)

![o_cop223.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d542f399-b529-c3cb-f436-f079e83d4837.jpeg)

![o_cop224.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/616fb4c6-8b09-b61f-e57f-9d48b9aa4017.jpeg)
git で同名ファイルの大文字/小文字を変更した後のチェックアウトでエラーになる

## 前提
ローカルの OS は Windows/MacOS とする。
大文字/小文字を区別させるために `git config core.ignorecase false` の設定がされているものとする。

## 同名だが大文字/小文字が異なるファイルが存在する branch 同士の checkout
例えば、`readme.md` というファイルを `README.MD` に変更して別のブランチに commit してあるとする。

このとき、大文字の branch-2 から、小文字の branch-1 に切り替えようとすると、以下のようなエラーが出てしまう。

```cli
error: The following untracked working tree files would be overwritten by checkout:
        readme.md
Please move or remove them before you switch branches.
Aborting
```

### 解決方法
`-f` のオプションをつける。
```cli
git checkout -f branch-1
```


## 大文字/小文字変更を merge されたブランチの pull
github 上や、他者が branch-1 に branch-2 を取り込み、リモート上の最新の branch-1 も大文字になっているとする。
この時に pull を実行すると今度は以下のようなエラーがでる。
```cli
error: The following untracked working tree files would be overwritten by merge:
        README.MD
Please move or remove them before you merge.
Aborting
```

### 解決方法
小文字のファイルを rm したのち pull する
```cli
git rm readme.md
```

## なぜ？
Windows や MacOS はファイル名の大文字と小文字は同じ文字として扱うような仕様になっている (ABC == abc == Abc == aBC = ...)。
`git config core.ignorecase false` を設定してあるために、git としては区別しているが、OSとしては同名のファイルなのでうまく処理ができない。
なお Linux 等では区別するので、この問題は発生しない。

## その他
git はデフォルトだと `git config core.ignorecase true` の状態になっている。
そのままの状態(かつ Windows/MacOS)で、 `readme.md` を `README.MD` に変更したとしても同名ファイルと認識されたままなので、ファイル名の変更は commit に反映されない。
LPC812にLチカを書き込で遊ぶ(5)(ロング記事)(書き込み前の動作確認)


目的
FlashMagicのインストールと接続確認


1.インストール


FlashMagicをインストールする(LPC812関連)


https://qiita.com/caa45040/items/c315232c461d4bbc5f6e


2.マイコンの選択

↓マイコン選択まで

Flash Magicで遊ぶ(書き込み)(LPC812)

https://qiita.com/caa45040/items/1bd3e212018ab60b8a8d

3.データの読み込み


![o_cop220.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/14b9d4bf-2506-cf90-f293-461f543d457e.jpeg)
SDK30以降で"com.android.camera.action.CROP"のintentが機能しない

## はじめに
- SDK30以降デフォルトで入っているギャラリーアプリ以外で画像のクロップができなくなった

## 元のコード
```java:ImageEditActivity.java
    Intent intent = new Intent("com.android.camera.action.CROP");
    //intentに対して色々
    grantPermissions();
    startActivityForResult(intent, requestCode);
```

```kotlin:PermissionsManager.kt
fun grantPermissions(){
    context.packageManager.queryIntentActivities(
        intent,
        PackageManager.MATCH_DEFAULT_ONLY
    ).forEach { resolveInfo ->
        //権限の付与
    }
}
```

ちなみに`startActivityForResult`はactivityの1.2.0-alpha04からdeprecatedなので`registerForActivityResult`を
flagsがint値の`queryIntentActivities`は、APIレベル３３から`ResolveInfoFlags`を使用した`queryIntentActivities`を使ってねとなっています。。

https://developer.android.com/training/basics/intents/result#register

https://developer.android.com/reference/kotlin/android/content/pm/PackageManager#queryintentactivities

## 解決
api29までは使用できていることから、30での[Packagevisibilityの変更](https://medium.com/androiddevelopers/package-visibility-in-android-11-cc857f221cd9)に関係していそうと踏み、

> For other scenarios, like opening a specific third party application directly from your UI, developers will have to explicitly list the application package names or intent filter signatures like this:
    
以下のようにAndroidManifest.xmlにIntentFilterを追加することで解決


```xml:AndroidManifest.xml
    <queries>
        <intent>
            <action android:name="com.android.camera.action.CROP" />
            <data android:mimeType="image/*" />
        </intent>
    </queries>
```
【データの転送/WinSCP】ローカルからGCSにファイルを一括でまとめて転送する

# 今回の課題
大量のファイルをGoogle Colud Storageにアップロードする必要がある。
そこで、WinSCPというソフトが役に立ったためメモ

### 手順
1. WinSCPをダウンロード
※[WinSCPのダウンロード先](https://forest.watch.impress.co.jp/library/software/winscp/)

2. Google Cloud Storageにアクセスし、
「設定」>「相互運用性」>「ユーザーアカウントのアクセスキー」の「鍵を作成」をクリックし、`アクセスキー`と`シークレットキー`を発行する。


3. WinSCPの「ホスト名」に、`https://storage.googleapis.com`を入れる。


4. 2で発行した`アクセスキー`と`シークレットキー`を入れて、WinSCPにログインするとバケットの一覧が表示されるので、
ローカル→GCS（S3も可）に転送を行う。


### 注意点
ファイルはGCSのバケットにアップロードするが、
S3モードのため**S3のバケット命名規則に従って命名する必要がある**ので注意する。

以上です。
コンテナ名って大文字はダメだと知らなかった（Google Cloud Skill Boost）

GCP初心者です。
Skill Boostでラボ（Serverless Cloud Run Development）でエラー解決せず
数日悩んだのですが、単純なことで解決しました。
たぶん、コンテナのビルドに慣れてる人には常識すぎるので
ヤフっても解決策がなかったのだと思います。

１）結論
コンテナ名は小文字だけ（大文字はNG）

誤：gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/Public-billing-service
正：gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/public-billing-service

２）エラー
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/Public-billing-service
を入力すると下記エラーが出る
invalid image name "gcr.io/qwiklabs-gcp-01-80f4c64e6d92/Public-billing-service"

３）
コンテナのビルドは初めてなのでチュートリアルに忠実にちゃんと全部の値をコピペした。
まさかそれがエラーの原因だとは思わなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1683167/42b769b6-2d3c-720b-7848-a46170c0ec62.png)


index.js、package.json、Dockerfile等のコードが間違ってないかもチェックしたが
そもそも基本がないので、まずはコンテナのビルドの基本を勉強した。
それでも解決しないので途方に暮れていたら、ふと「大文字だめなのかも？」と閃き
試してみるとあっけなく解決。。。
エラーと遭遇するとキツイけど、実力上げるには逃げずに挑み続けることが大切と痛感。
【Discord.py】txtファイル、csvファイルを作って送信するDiscord botを作る

# やりたいこと
Discord bot上でtxtファイルないしcsvファイルを作成し、ファイルとして送信するDiscord botの実装を行います。

# 実装
ここでは例として、`members`が(ID, ユーザー名, ポイント)のタプルのリストを形成しているとして、そこからメンバー表のcsvファイルを作る、という内容だとして書いてます。
```Python
import io
import discord
from discord.ext import commands

#中略

bot = commands.Bot()

#中略

#csv文字列を作成
csv = "ID,name,points\n"
for row in members:
    (id, name, points) = row
    csv += "%i,%s,i\n"%(id, name, points)

#csvファイル化して送信
with io.StringIO(csv) as file:
    await bot.get_channel(CHANNEL).send(file=discord.File(file, "members.csv"))

#後略
```

要するに、文字列をファイル化して送信する際は下記のようにすればいいということです。

```python
text = #ファイル化したい文字列
with io.StringIO(text) as file:
    await (送りたいチャンネル).send(file=discord.File(file, "ファイル名"))
```
【Unity】壁との弾性衝突を実装する

# 壁との弾性衝突とは
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/6688199f-6e42-9977-5999-c65695ae0a75.png)
入射角と反射角が同じように跳ね返り、跳ね返りの前後で速さが変わらない運動を指します。

標準の物理特性マテリアルでは挙動関係でバグが起こりやすいため、手製のものを実装しましょう。

# 2Dゲームの場合の実装
弾性衝突させたいオブジェクトに、Rigidbody2Dとともに下記のBouce.csをアタッチしてください。

:::note warn
public変数のvelocityで速度を操作しています。
AddForceなどで運動に介入しようとしても速度はvelocityで固定されます。
もし衝突以外で運動を操作する場合は、velocity変数を書き換えるか、Update関数の処理を一時的にオフにする処理を書き加えてください。
:::

```C#:Bounce.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bounce : MonoBehaviour
{
    public Vector2 velocity;

    private void Update()
    {
        GetComponent<Rigidbody2D>().velocity = velocity;
    }

    public void OnCollisionEnter2D(Collision2D collision)
    {
        Vector2 velocityNext
            = Vector2.Reflect(velocity, collision.contacts[0].normal);
        velocity = velocityNext;  
    }
}

```

# 3Dゲームの場合の実装
弾性衝突させたいオブジェクトに、Rigidbodyとともに下記のBouce.csをアタッチしてください。

:::note warn
public変数のvelocityで速度を操作しています。
AddForceなどで運動に介入しようとしても速度はvelocityで固定されます。
もし衝突以外で運動を操作する場合は、velocity変数を書き換えるか、Update関数の処理を一時的にオフにする処理を書き加えてください。
:::

```C#:Bounce.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bounce : MonoBehaviour
{
    public Vector3 velocity;

    private void Update()
    {
        GetComponent<Rigidbody>().velocity = velocity;
    }

    public void OnCollisionEnter(Collision collision)
    {
        Vector3 velocityNext
            = Vector3.Reflect(velocity, collision.contacts[0].normal);
        velocity = velocityNext;  
    }
}

```

# 仕組み
仕組みは単純です。
Vector2ないしVector3クラスにReflect関数があります
`Vector3.Reflect(速度ベクトル, 法線ベクトル)`

法線ベクトルとは、ざっくり言うと下図のイメージです。
ちゃんとした説明でいうと、「衝突面に垂直なベクトル」です。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/6ecc9e88-d2c5-e2f5-da22-514423a0021a.png)

速度ベクトルはvelocityで与えられます。

衝突面の法線ベクトルは、OnCollisionEnterの引数に与えられるCollisionの中のContactに含まれています。
具体的には、`collision.contacts[0].normal`です。
これを`Reflect()`に与えることで、弾性衝突後の速度ベクトルを与えてくれます。

# なぜvelocity変数を作るのか
当然の疑問として、なぜわざわざvelocity変数で速度を管理して速度の管理を不自由にするのか、なぜ`Reflect()`に`GetComponent()<Rigidbody>().velocity`を直接与えないのか、と思われると思います。
その理由としては、<strong>`OnCollisionEnter()`が呼ばれる時には既に`Rigidbody.velocity`が既に衝突後の数値になってしまうから</strong>なんですよね。
デフォルトだと非弾性衝突（跳ね返らず、壁にひっつくような衝突）をしますが、その値が既に`Rigidbody.velocity`に代入されてしまい、衝突前の数値を`Reflect()`に与えることができなくなってしまいます。
そういった事情で、衝突前の速度ベクトルを把握するために、velocityで管理しています。

もしUpdate関数で`Rigidbody.velocity`を上書きしなくとも衝突前の`Rigidbody.velocity`を掴める実装を思いつけたら、そっちのほうがいいでしょうね、、
MATLABからLINE通知を送る

（追記）2025年3月31日をもって、LINE Notifyのサービスを終了するようですが、`messaging-api`を使えば引き続き使えそうです。

[2025年3月31日をもって、LINE Notifyのサービスを終了します](https://developers.line.biz/ja/news/2024/10/07/line-notify-will-be-discontinued/)
[Messaging API](https://developers.line.biz/ja/services/messaging-api/)



MATLABで長期の計算をしている多くは，年末年始などの長期休暇のときに計算機に頑張ってもらうということがあるかと思います。
特に，卒論や修論を控えている学生さんも多いのではないでしょうか。

そこで，以前，計算後に計算完了あるいはエラーがでたことを通知するために

[matlabの計算完了通知メール送信(mailsend))](https://qiita.com/YutaNakamura_bbhomejp/items/4ce1c26d3ba4a2018e5a)

という記事にて，MATLABでメール通知を実装させましたが，LINEの方が便利だなと思い実装させました。

## 準備するもの・環境
LINEへの通知は [LINE notify](https://notify-bot.line.me/ja/) を使用します。
パソコン環境は特に指定していませんが，環境構築の手間を省くため，WindowsはPython不要にしています。

- MATLAB
- LINE notify
（Unix系） 
- Python （[バージョンはMATLABがサポートしているバージョン](https://jp.mathworks.com/support/requirements/python-compatibility.html)であれば何でも可）
    - requestsパッケージを使用するため，pip等を用いてインストールしておいてください。

### 手順

1.[LINE notify](https://notify-bot.line.me/ja/)からアクセストークンを発行

具体的な発行方法は[こちら](https://firestorage.jp/business/line-notify/)等に記載していますので，そちらを参照してください。
アクセスコード（例：dBHta…）を取得します。

2.（Windowsの場合）コマンドラインの文字列を作成

コマンドラインからLINE通知を送ることができます。具体的な方法等は[コマンドラインから LINE にメッセージを送れる LINE Notify](https://engineering.linecorp.com/ja/blog/using-line-notify-to-send-messages-to-line-from-the-command-line/)
に記載していますので，こちらを参考にして，1で取得したアクセスコードと送りたい文章を変数として，コマンドラインの文字列 `cmd` を作成します。

```matlab
Key = "xxxxxxxxxxxxxxxxxxxxxxx"; % アクセスコード
messages = "送りたい文章"; %送りたい文章を書く。数値等を送る場合は `num2str` を用いる。
cmd = strcat("curl -X POST -H ""Authorization: Bearer ",Key,""" -F ""message=",messages,""" https://notify-api.line.me/api/notify");
```

この変数 `cmd` をコマンドラインに送ることでLINE通知を送ることができます。
```matlab
    system(cmd);
```

なお，送信する文字が日本語の場合，LINEの文章が文字化けすることがあります。その際は，windowsシステムを`UTF-8`に変更してください。

【参考】
[【Windows 10】文字コードを「Shift-JIS」から「UTF-8」に変更する方法！](https://otona-life.com/2022/06/05/121603/)


（Unix系の場合）
上記の同様のプログラムをPythonで作成します。以下は基本的なプログラムです。

```python: lineNotification.py
import requests

Key ='xxxxxxxxxxxxxxxxxxxxxxx'
messages = '送りたい文章'

def send_message(Key,messages):
    headers = {"Authorization": f"Bearer {Key}"}

    Data = {
        "message": (None, "\n" + messages )
    }

requests.post(
   "https://notify-api.line.me/api/notify",
    headers=headers,
    data=Data,
)

```
あとは，これを `pyrunfile(lineNotification.py)` `py.lineNotification.send_message`などでMATLABから呼び出せばLINEを送れるでしょう。

【参考】
- [【仕事の自動化】PythonでLINEを操作。メッセージや画像を自分へ送信しよう！【初心者の方もわかりやすいように解説】](https://kino-code.com/pythonline/)
- [【line notify】pythonでlineへ通知してみよう！](https://rooter.jp/web-crawling/line-notify_with_python/)

### 関数化

上記でLINEに通知できるかと思いますが，文章を文字配列として引数にした関数化すると便利になります。
具体的な説明は省略しますが，[GitHub](https://github.com/bbhomejp/MATLAB2LINENotification)で公開していますので，自由にお使いください。

`try ~ catch` を使用すると，計算エラーが出た場合にエラー文を送信させることもできます。
【スケジューラ】PayPal Rest APIを利用してみる（Transaction:取得）

今回は**PayPal Rest API**を利用して、Transactionデータを取得して、ファイルシステムに保存してみようと思います。
[Sharperlight](https://sharperlight.jp/)には開発者向けに様々なJavaScript関数が用意されています。それらの関数を使用してJavaScriptコードを書き、スケジューラのタスクとして定義してみようと思います。
初めは、Tokenやクエリーパラメータは固定として基礎となるコードを作成します。
認証やデータ取得方法については以下のページを参考にしました。
- [PayPal Rest API](https://developer.paypal.com/api/rest)
- [Authentication:認証](https://developer.paypal.com/api/rest/authentication/#link-authentication)
- [Transactionsの取得](https://developer.paypal.com/docs/api/transaction-search/v1/)

また認証やデータ取得のリクエストの検証には[**Postman**](https://www.postman.com/)を利用しました。まだこの記事の段階ではTokenはPostmanで取得したものを貼り付けて使用しています。

では[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**スケジューラ**を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/31e341b9-f0e0-fc0e-11de-7994f3f7c746.png)
**スケジューラ**が起動したら、`新規`ボタンでタスクの作成を開始します。
タスクダイアログの`一般`タブでは、例えばこのように**コード**、**グループ**、**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/39e551dd-de9f-24a5-dcd1-c3709be607cd.png)
`アクション`タブに移動します。ここで実際にリクエストを発信して、Transactionデータを取得します。`新規`アイコンを利用して、JavaScriptタスクの作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/22a4124b-96a6-3e5b-75c8-b043a5e05227.png)
このようにJavaScriptタスクが追加されるので、**コード**と**説明**を記入します。そして中央のスクリプト欄にJavaScriptコードを書いていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/be25bb74-03b4-4d32-3b9e-8598a9949120.png)
今回のコードはこのようになっています。**transaction_Get 関数**を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c4baba25-cf5e-0930-60d7-0dee770cdd7a.png)
取得したデータは`PayPal_Transaction.json`という名称で**C**ドライブの`Temp`フォルダに保存します。
コード中央　`Bearer`の後が**Token**です。パラメータには以下のものを使用しました。
**start_date**、**end_date**、**fields**、**page_size**、**page**
コードの下部に見える二つの関数、**lib_sys.urlContent.Get 関数**はGETリクエストを発信するための関数で、**lib_sys.io.file.WriteAllText 関数**は、取得したデータをファイルを書き出すための関数です。

コードが完成したら`接続テスト`ボタンでコードの検証を行います。
期限切れTokenを使用したので、このようなエラーとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2fc9f6b1-b470-73e1-bce2-f341cf0ffa27.png)
Postmanで新しいTokenを取得し、それを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f165f10f-4495-10be-e4f1-e8a934836dd4.png)
今度はエラーが発生しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5a9c9db2-b8fb-f26e-3d40-0f64c41e4670.png)
ファイルは作成されているかな？**C**ドライブの`Temp`フォルダを覗いてみます。
ありましたね:thumbsup:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/721ef68e-d684-f88c-9470-30a7a8fc75ae.png)
開いてみましょう。**Visual Studio Code**で開くときちんとフォーマットして表示してくれますよ。上手く取得できましたね。:clap:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/920dc859-fba7-f3e2-8a59-7d3a0bc18003.png)
今回はここまで...

では、失礼します。
Falco Ruleを紹介するシリーズ - Create Disallowed Pod

本シリーズでは、ランタイム脅威検知のデファクトスタンダードである<a href=https://falco.org/ target=new>Falco</a>の検知Ruleを、１つの記事で１つ簡単に紹介していきます。
ランタイムセキュリティやFalco自体の概要を知りたい方は<a href=https://sysdig.jp/blog/intro-runtime-security-falco/ target=new>こちらのブログ記事</a>をご参照ください。
今回ご紹介する検知Ruleは<b>「Create Disallowed Pod」</b>です。
# Rule記述
```
- rule: Create Disallowed Pod
  desc: >
    Detect an attempt to start a pod with a container image outside of a list of allowed images.
  condition: kevt and pod and kcreate and not allowed_k8s_containers
  output: Pod started with container not in allowed list (user=%ka.user.name pod=%ka.resp.name ns=%ka.target.namespace images=%ka.req.pod.containers.image)
  priority: WARNING
  source: k8s_audit
  tags: [k8s]
```
# Rule概要
<a href="https://github.com/falcosecurity/plugins/tree/master/plugins/k8saudit" target=new>Kubernetes Audit Events Pluginプラグイン</a>をインストールすることで使用可能になるルールです。
あらかじめ指定した、許可されたイメージ一覧以外のイメージからのPod起動の試みを検知します。
コンテナの雛形になるイメージは、Docker Hubなどのパブリックなコンテナレジストリから入手可能ですが、 Docker Hub にあるイメージの半分には、少なくとも 1 つのセキュリティ脆弱性が含まれています。また、攻撃者が意図的に悪意のあるイメージをアップロードし、疑うことを知らないユーザーを引きつけるような名前（mysqlimageやnginxappなど）にしている場合もあります。
このため、信頼できるイメージのみを使用することがとても重要になります。
悪意のあるイメージを使用した攻撃の例として、<a href="https://sysdig.jp/blog/cve-2021-20291-cri-o-podman/" target=new>こちらのブログ記事</a>もご参照ください。

# Condition（条件）
`kevt and pod and kcreate and`
Pod作成のK8s Auditイベントで、

`not allowed_k8s_containers`
許可されたK8sコンテナ一覧に含まれていない場合

---
podマクロの内容は以下となります。
```
- macro: pod
  condition: ka.target.resource=pods and not ka.target.subresource exists
```
`ka.target.resource=pods and`
K8sのターゲットリソースがpodsで、

`not ka.target.subresource exists`
ターゲットオブジェクトのサブリソースが存在しない場合


# Output（出力）
許可されたコンテナリストに含まれていないコンテナによってPodが起動しました

`%ka.user.name`
K8sユーザー名

`%ka.resp.name`
K8sレスポンスオブジェクト名

`%ka.target.namespace`
K8sターゲットネームスペース名

`%ka.req.pod.containers.image`
コンテナイメージ名
unityroomで得点をツイートする実装例【初心者向け】

# はじめに
基本的には↓ここを読むだけで出来る筈です。
[naichilab/unityroom-tweet: WebGLからツイートするサンプル](https://github.com/naichilab/unityroom-tweet)

初心者向けに実装例を書いておきます。
※あくまで1例に過ぎず、幾らでも実装方法があります
# サンプルゲーム
ブラウザ上で遊べます↓
https://unityroom.com/games/missile_interceptor

# 実装例
+ 「GameOverObjects」という空のオブジェクトがゲームオーバー時にSetActiveで 「非アクティブ」→「アクティブ」になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/6aefc347-7213-49ec-8810-c43adefbc401.png)
+ それにより子供のゲームオーバーテキストやリトライボタン、ツイートボタンが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/ce99815a-7aa6-28e5-2620-2eb4b437e4f8.png)

+ 適当なオブジェクトにこのスクリプトをアタッチする(ツイートボタン自身でもよい)
```CSharp:ResultTwitter.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ResultTwitter : MonoBehaviour
{
    // ※ここの初期値ではなく、インスペクタ上の値を変えてください
    public string gameID = "unityroom_game_id"; // unityroom上で投稿したゲームのID
    public string tweetText1 = "あなたの得点は";
    public string tweetText2 = "点でした。";
    public string hashTags = "#unityroom #ゲームタイトル"; //#unity1week";

    // ※ スコアマネージャーというものが存在すると仮定します
    // 貴方の作成しているゲームの事情に合わせてください
    // インスペクタ上でスコアマネージャーコンポーネントを持つゲームオブジェクトをセット
    public ScoreManager scoreManager;

    // ツイートボタンから呼び出す公開メソッド
    public void Tweet()
    {
        int score = scoreManager.GetScore(); // ※ 何らかの方法でスコアの値を取得(貴方のゲーム事情に合わせてください)
        naichilab.UnityRoomTweet.Tweet(gameID, tweetText1 + score + tweetText2 + hashTags);
    }
}
```
+ インスペクタの設定例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/40bf5693-558d-c58f-47e3-a18d1c8f8bbf.png)
Score Manager の欄は ( ScoreManagerというコンポーネントがあると仮定 ) ScoreManagerコンポーネントの付いているオブジェクトをドラッグ&ドロップでセット

+ ボタンの設定
On Click 欄の「＋ボタン」を押して、赤い丸のところに ResultTwitter コンポーネントをアタッチしているオブジェクトをドラッグ＆ドロップでセット(ここではボタン自身に付けているのでボタン自身をセット)、青い丸のところで呼び出す公開関数を選びます。
これにより、ボタンを押されたときにこの関数が呼び出されツイートされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/39dbcb19-d39b-de51-d550-02e2ae7b7d57.png)

これで、ゲームオーバー時にツイートボタンを押せばスコアの値をツイートできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58548/b21d6c9b-1cec-8ee9-bb76-1478f84f5579.png)
インターンでやったこと

# 実際にやったこと
- 要件定義
- db設計
- 開発環境構築
    - docker
    - ruby on rails
    - gem
    - github連携

# 今後もやりたいこと
- git flow などをgithubの運用方法の共通化
- githubとslackの連携
- スマホ内で業務用と個人用で分ける
- direnvの導入
- githubでマージした時に自動でそのブランチが消える設定
- gitでリモートではマージして消えているブランチを消すコマンドをaliasに登録
- circleciの導入

# 参考
https://qiita.com/hajimeni/items/73d2155fc59e152630c4
【React】レンダリング1

## レンダリングとは？？
コンポーネントからDOMノードを作成するための情報の読み込みを行うこと。
レンダリングはDOMに反映させて、***画面を描写すること***ではない。

画面に反映させることをレンダリングと思っていたんですが、認識が違ったんですね...

## レンダリングされるタイミング
Reactでは`state`の値が更新されたときにレンダリングが発生する。
（更新関数が呼ばれ、元々持っていた変数と全く別のものだった場合）

## Reactでのstate比較方法
Reactでは`Object.is`による比較アルゴリズムによって
▷true(stateが同じ)なら***レンダリングを行わない***
▷false(stateが異なる)なら***レンダリングを行う***

## コードで確認
ボタンをクリックした際にレンダリングが発生するのか確認を行う

1\. ***数値、文字列***の比較
***☆レンダリングされない場合***
```typescript
const RenderCheck = () => {
  console.log("レンダリング？");

  const [check, setCheck] = useState(0);

  return (
    <>
      <button
        onClick={() => {
          setCheck(0);
        }}
      >
        ボタン
      </button>
      {check}
    </>
  );
};
```

useStateで初期値:0がセットされている。
ボタンのonClick処理で初期値と同じく0をセットすると、***レンダリングは行われない***(1回目のレンダリングは行われる)
コンソール↓![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/77fd6390-8eff-3ff1-4ab5-6c92c031754b.png)


文字列でも同じ
```typescript
const [check, setCheck] = useState('abc');
--------------------------------------------
setCheck('abc');
```

☆レンダリングされる場合
stateが更新用関数によって変更され、中身が異なっている場合
```typescript
const [check, setCheck] = useState('abc');
------------------------------------------
setCheck(0);
```
初期値に'abc'、更新する際に0を指定してみた
すると、
![スクリーンショット 2022-11-02 105523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/c0d17da0-17e2-1604-55c7-f0b5b73f29e4.png)

stateの値が変わったことによりレンダリングが発生した

2\. ***オブジェクト***の比較
オブジェクトの場合、数値や文字列と同じように見た目上では同じ場合でもレンダリングは発生する

例えば、以下の下の二つのオブジェクトは見た目上では同じ
```typescript
  const object1 = {number:0};
  const object2 = {number:0};
```
これをObject.isで確認する
```typescript
console.log(Object.is(object1, object2));//false
```
結果として`false`になり別物だということが分かる
先ほどのボタンのプログラムに組み込んでみると
```typescript
const RenderCheck = () => {
  console.log("レンダリング？");

  const object1 = {number:0};
  const object2 = {number:0};
  const [check, setCheck] = useState(object1);

  // console.log(Object.is(object1, object2));
  return (
    <>
      <button
        onClick={() => {
          setCheck(object2);
        }}
      >
        ボタン
      </button>
      {check.value}
    </>
  );
};
```
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/b8f0c199-40a7-0471-9186-16c70810af2b.png)

ボタンをクリックするたびにレンダリングが発生した

▷object2にobject1を渡してあげた場合はレンダリングが発生しない
```typescript
  const object1 = {number:0};
  const object2 = object1;
```


3/. コールバック関数の場合
```typescript
const RenderCheck = () => {
  console.log("レンダリング？");

  return (
    <>
      <button
        onClick={(state) => {
          return state;
        }}
      >
        ボタン
      </button>
    </>
  );
};
```
stateをリターンしているだけなので当然レンダリングは発生しない

☆再レンダリングさせるには？
スプレッド演算子を用いて、新しいオブジェクトを作成する
```typescript
    <button
        onClick={(state) => {
          const newState = {...state};
          return newState;
        }}
      >
    ボタン
    </button>
```
`newState`は`state`を展開した新しいオブジェクトになっているので、レンダリングが発生する条件と一致する。

オブジェクトの値の渡し方などの詳しいことは↓
参照：https://qiita.com/yuta0801/items/f8690a6e129c594de5fb
JavaScriptによる階乗


## 初めに

🌐 [live demo](https://codepen.io/kensoz/pen/dyeEqMv)
+ パラメータ`n` : n の階乗

## 再帰方法
### Number型
`Number型`の適用範囲は、最大 `9007199254740991` (`2^53 − 1`)、最小 `−9007199254740991` (`−(2^53 − 1)`)です。
```js
const factorial_recursion = (n) => {
	if (n <= 1) return 1;
	return n * factorial_recursion(n - 1);
};

console.log(factorial_recursion(5)); //120
```

### BigInt型
`BigInt型`の適用範囲は、`Number型`で表すことができない大きな数を表現したり操作したりするために使用します。[BigInt MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt)
```js
const factorial_recursion_bigInt = (n) => {
	if (n <= 1) return 1;
	return BigInt(n) * BigInt(factorial_recursion_bigInt(n - 1));
};

console.log(factorial_recursion_bigInt(5)); //120n
```


但し、再帰関数で`n`の値が大きくなると、スタックオーバーエラーになってしまうという問題があります。例えば、`factorial_recursion_bigInt(10000)`\
@d5231 さん指摘ありがとうございます。
```js
console.log(factorial_recursion_bigInt(10000)) 
// Maximum call stack size exceeded
```
`BigInt型`が活用できて、スタックオーバーエラーが回避されるため、平方の差方法で解決します。

## 平方の差方法
階乗の計算回数を減らすという観点から、階乗はいくつかの平方の差の積に変換できますため、 `n/2`の乗算するだけできて、平方の差の差は連続する奇数を知りました。
```js
const factorial_square = (n) => {
	if (n <= 1) return 1

	const middle = Math.ceil(n / 2);

	let tmp = middle * middle
	let result = n & (1 == 1) ? middle : middle * n

	for (let i = 1; i <= n - 2; i += 2) {
		tmp -= i
		result = BigInt(result) * BigInt(tmp)
	}

	return result;
};

console.log(factorial_square(5)) // 120n
console.log(factorial_square(10000)) // 28462596809170...
```
float型の数値をprintでファイル出力

# pythonでprintを使ってファイル出力する

## 困ったこと
oitput用のファイルにfloat型の数値を `f.write()`で出力させようとすると
```:error
write() argument must be str, not float
```
とエラーが出てしまう.

## 解決策
`print`の引数でoutputファイルを指定する.
```python:sample.py
print(s, file=outputfile)
```
SQLAlchemy SELECT時のサブクエリの使い方 PostgreSQL

備忘録

SELECT側のカラムとしてサブクエリで情報を引っ張りたい時は、サブクエリを別のクエリとして設定する必要がある。

```python:subquery.py
        sub_query_sum = local_session.query(func.count(Posts.slack_channel_id))\
            .filter(Posts.slack_ws_id== Channels.slack_ws_id,Posts.slack_channel_id == Channels.slack_channel_id_from,Posts.created_date>=start_this_month,Posts.created_date<=end_this_month)\
            .group_by(Posts.slack_channel_id)\
            .label('post_count')
```

複数項目を返そうとしたらエラーになったので、サブクエリで返せるのは一つのみっぽい(調べてないが
filter部分で、メインクエリのテーブルと比較するように書いておく

```python:mainquery.py
        custom_channels = local_session.query(Channels.slack_channel_id,Channels.slack_channel_id_from,Channels.created_by_slack_userid,sub_query_sum)\
            .filter_by(slack_ws_id=slack_ws_id)\
            .filter(Channels.slack_channel_id_from.isnot(None))\
            .order_by(sub_query_sum.desc())\
            .all()
```

先程のサブクエリをメインのSELECT部分に追加すればOK。ここは特に迷うことは無いと思う。

サブクエリの内容はlabel名を指定すれば良いのでこんな形にすれば取得することができる
```python
for custom_channel in custom_channels:
　　　　　　　　print(custom_channel.post_count)
```

クエリ間違ってないのにデータ取得出来ないのはなぜだ！？と思って1hくらい溶かしましたが、よくよく見たらとってこようと思っていたデータが存在していませんでした。みなさん気をつけましょう。
PowerPlatform 環境について

# 環境の概要 
環境 は、組織のビジネス データ、アプリ、チャットボット、およびフローを保存、管理、共有する場所です。 さまざまな役割、セキュリティ要件や対象ユーザーを持つ、アプリを分離するコンテナーとしても機能します
# 環境用途
>「環境」とはひとつのテナント内で領域を区切り、Power Platform の設計やデーター、ユーザ>ー権限やポリシー等をその領域単位で管理できるようにする仕組みで、これにより、テナントを複数契約しなくても（同一ドメイン内で）「試験環境」「開発環境」「本番環境」「経営戦略部限定の本番環境」など用途の異なる複数の領域を運用することができます。

# 参照サイト
https://pa-wsc.work/2021/11/30/license_to_create_environment/
https://learn.microsoft.com/ja-jp/power-platform/admin/environments-overview
ウェルカムメッセージを設定したいだけなのに…Carl-botの罠

# 使い方
DiscordにCarl-botを入れて色々設定してみよう、と思い下記のような記事を参考に設定してみたら結構罠があったのでメモ。

https://neeetb.tokyo/carl-bot/

https://kurobasana.hatenadiary.jp/entry/Carl-bot_instructions

# ウェルカムメッセージ
いずれの記事にも「簡単にできる」と書いてあって具体的な手順は書いてないのだが、これが結構な罠。

まず、UI上から設定項目を見つける必要がある。
メニューの項目が結構多い。正しい答えは一箇所だけである。

<img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46299/906f22e3-aa8b-e74d-a28f-9c7232b6d8bd.png">

答えは、

1. Welcome を押す。
1. 画面に4つ表示されるテキスト欄のうち Welcome message のテキスト入力欄に記入する。  <img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46299/bb9543e4-b00f-3f3e-9802-f6647eec5ff1.png">
1. 埋め込み入力をするなら、そのテキスト欄の下の「Show embed builder」を押し、追加表示させる。

である。

メニューの「Embed」から埋め込み形式で投稿できるのだが、ここからはウェルカムメッセージを設定することはできない。

# 埋め込み形式のプレビュー
ウェルカムメッセージを設定する項目は見つけた。
出来上がりのプレビューはウェルカムメッセージの設定UI上で**確認できない**。

ここでEmbedを使う必要がある。
ウェルカムメッセージの設定はセーブすれば保存されるので、切り替える前にセーブするか、別タブでEmbedの設定を表示させると良い。

…という一手間がまず罠。

## 埋め込み設定のやり取り
Embedでプレビュー表示させるにはウェルカムメッセージの設定を持ってくる必要がある。
Embed - Welcome間での設定のやり取りはimport exportで行う。

![welcome (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46299/906a7639-7b67-0d09-3a5f-847013ee3c8c.png)

Importが設定の受け入れで、押すと入力欄が追加で出てくる。テキスト入力後、Applyで適用される。
Exportが設定の書き出しで、押すと設定テキストがJSON形式でコピーされる。これをImport側にいれる。

要するに別の設定画面で使う場合、JSON形式で書き出した設定を適切な設定箇所にImportする必要がある。

## なので
プレビューを確認しつつ、埋め込み形式でウェルカムメッセージを設定するには、最短でも

1. 最初はEmbedでプレビューを見ながら、埋め込みテキストを設定する。
1. 出来上がったら設定をExportし、ウェルカムメッセージの設定UI上にImportする。
1. 設定を保存する。

という手順が必要になる。

# アカウント権限の罠
プライベートチャンネルを使っていたり、特定のロール・権限が付与されていないと、
投稿できないように基本設定を縛っている場合、初期設定でCarl-botに権限を付与するだけではダメで、
そのチャンネルへのbotの追加と権限付きのロール付与が必要。

これも埋め込み形式が投稿できなかったり、設定したはずのウェルカムメッセージが表示されない罠なので注意。

# というわけで
簡単なウェルカムメッセージを設定するだけでも罠だらけというお話でした。
【データのエクスポート/Excel】ODBCドライバを使用して、BigQueryのデータをExcelにエクスポートする

# 今回の課題
BigQueryのテーブルをスプレッドシートにエクスポートしたかったが、
スプレッドシートでは「行数が多すぎる」というエラーが発生してしまった。
スプレッドシートにはデータをエクスポートできないので、
ODBCドライバを使用して、エクセルにエクスポートすることにした。

※参考：[Spreadsheets （スプレッドシート）の最大行数と最大列数はいくつですか？](https://support.kingsoft.jp/wps/wps_s/kso_214.html#:~:text=%E3%81%84%E3%81%8F%E3%81%A4%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F-,Spreadsheets%20%EF%BC%88%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%EF%BC%89%E3%81%AE%E6%9C%80%E5%A4%A7%E8%A1%8C%E6%95%B0%E3%81%A8%E6%9C%80%E5%A4%A7%E5%88%97,%E8%A1%8C%C3%97%2016384%20%E5%88%97%E3%81%A7%E3%81%99%E3%80%82)

# Excelにインポートした方法
BigQueryにODBCドライバをインストールする方法で実施した。

#### 手順
1. まずBigQuery用のODBCドライバをインストールする。
※[ODBCドライバのインストール先](https://cloud.google.com/bigquery/docs/reference/odbc-jdbc-drivers?hl=ja)

2. Excelの`データ`タブ>`その他のデータソースから`>`Microsoft Query から`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/bdbb8dcd-ec49-d412-8178-e30bd1e51651.png)

3. データソースの選択で、BigQueryをクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/926cd17e-e8b4-6767-0df8-86a03ff5f82c.png)

3. 使用するテーブルを選択し、抽出したい列を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/2091542f-aa63-4017-fbfe-409ad7e6d06a.png)



以上です。
mvnコマンドを走らせたときにエラーが出る

## 現象
SpringBootプロジェクトをビルドしようと`mvn package`コマンドを走らせたときに次のようなエラーが発生した。

```.bash
Execution default-jar of goal org.apache.maven.plugins:maven-jar-plugin:2.6:jar failed: An API incompatibility was encountered while executing org.apache.maven.plugins:maven-jar-plugin:2.6:jar: java.lang.ExceptionInInitializerError: null
```

## 解決方法
[このリンク](https://github.com/Kotlin/kotlin-interactive-shell/issues/63)に解決方法が紹介されていた。

どうやらmavenプラグインのバージョンが古いことが問題らしい。
やることは単純で、pom.xml中の`maven-jar-plugin`のバージョン指定を`3.0.0`とする。

```pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.0</version>
</plugin>
```

## 参考
[maven-jar-plugin 2.6 has an incompatability issue with Big Sur M1 macs](https://github.com/Kotlin/kotlin-interactive-shell/issues/63)
MacからVagrantをアンインストールする方法（インストーラーでインストールした方）

# 概要

- MacからVagrantをアンインストールする方法をまとめる。

# 方法

1. 下記にアクセスして任意のバージョンのインストーラーをダウンロードする。
    - [https://developer.hashicorp.com/vagrant/downloads](https://developer.hashicorp.com/vagrant/downloads)

        ![Install___Vagrant___HashiCorp_Developer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8eb6b9b2-bea7-a02a-94d6-a0c223c7256d.png)

1. ダウンロードしたインストーラーを起動する。
1. 「uninstall.tool」をダブルクリックで起動する。

    ![Vagrant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/62a17079-fdab-0889-5476-7c2c62d8aa5c.png)

1. 下記のポップアップが出たらOKをクリックする。

    ![スクリーンショット_2022_11_02_10_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8f6f4b87-c560-6398-38e5-f6f4792b24f0.png)

1. 「設定」→「セキュリティとプライバシー」→「uninstall.toolは開発元を確認できないため、使用がブロックされました。」の「このまま開く」をクリックする。

    ![セキュリティとプライバシー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b4de7dbb-0300-68ed-e05f-ebdb42ceabe2.png)

1. ターミナルが開いたら下記の内容を入力してEnterを押下する。（「Yes」の入力を求められる事があるので適宜入力してEnterを押下する。）

    ```shell
    /Volumes/Vagrant/uninstall.tool ; exit;
    ```

1. これでアンインストールは完了である。
自分のPCのOpenSSLのバージョンを調べてみる

# 概要

- ターミナルを用いて自分のPCのOpenSSLのバージョンを調べる方法を先輩に教えてもらったのでメモ的にまとめる。

# 情報

- 筆者のPCはMac

# 方法

- 下記コマンドを実行する。

    ```shell
    openssl version
    >LibreSSl X.X.X
    ```
オーディオ・アダプター(bluetooth)がいい

# 概要
パソコンでプログラミング作業を音楽を聴きながら行いたいときは、ヘッドフォンやイヤフォンで聴くといい。スピーカーで聴くと家内がうるさいというので。その場合、bluetooth対応のイヤフォンがいい。音源はパソコンやテレビのオーディオ出力端子で、そこにオーディオ・アダプターを接続してそこからbluetoothでイヤフォンに向けて無線で音声を出力ことになる。
結構、シンプルで比較的簡単にペアリングして聴くことができる。
# オーディオ・アダプターの必要性
今の時代は、スマホとヘッドフォンはbluetoohで接続して会話したり、音楽を聴くことが一般的になっている。パソコンやテレビともbluetoohで接続してイヤフォンなどで聴く場面も結構あると思う。
その時に問題になるのは、パソコンやテレビがbluetooth対応していないケースもある。今回もそのケースで、家のパソコンやテレビは古いため、bluetooth機能はついていなかった。その時、このオーディオ・アダプターを購入して接続すれば、bluetooth対応のパソコン、テレビに変身する。
# 接続の仕方
接続は簡単で、パソコンやテレビの裏側にあるaux端子に3.5mオーディオケーブルでそのオーディオ・アダプターを接続します。その時に、アダプターへDC5Vの給電が必要でそのためのUSB端子がアダプターに付属していますので、パソコンやテレビのUSB端子に差し込みます。
もし、テレビにUSB端子がなかったら、DC5VのUSB出力コンバーターに接続してもいいです。
## アダプターのTx,Rxモードについて
パソコンやテレビのaux端子に接続して送信モードで使う場合は、アダプターのボタンを押してTxモードにします。ペアリングが成功するとLEDランプは赤色になります。(TGK-SHOP)
スピーカーなどの受信機器に接続する場合は、Rxモード(LED青色)になります。
# 部屋の中がすっきりしてきた
bluetoothでデバイス間を接続すると部屋の中のケーブルがなくなり、すっきりした。AC電源のケーブルはなくせないが、部屋を見回すと壁のコンセントから何本ものケーブルがつながっているのが目障りだが、しかたがない。諦めている。
# あとがき
このオーディオ・アダプターは、TGK-SHOPで購入しましたが、製品名がわからず、ここで、明記することができません。但し、製品自体は問題なく動作しています。
Bluetooth 5.0 トランスミッター レシーバー 2in1 送信機 受信機 テレビ スピーカー iPhone スマートフォン ブラック Web日本語説明書付
古いスピーカーに接続するときは、このアダプターをRxモード(青色点灯)にします。
Python＋FastAPIのAPIテストをPytestで実行してみる

PythonでFastAPIを使ったAPIをテストしてみる

※FastAPIで別APIを呼び出す記事はこちら
Python＋FastAPIからRequestsにより別APIを呼び出してみる。uvicornでホスティング
https://qiita.com/thithi7110/items/c1b01798e69ddc31206b

１．適当なAPIを用意
```main.py
import requests,json
from fastapi import FastAPI
app = FastAPI()

#単純なメッセージ返却
@app.get("/")
async def Hello():
    return {"message":"Hello"}

#クエリパラメータ
@app.get("/zipcode")
async def ZipCode(zipcode:int = 0):
    url = f'https://zipcloud.ibsnet.co.jp/api/search?zipcode={zipcode}'
    r = requests.get(url)
    print(r.text)
    return json.loads(r.text)
```

２．テスト記述
``` tests/test_main.py

from fastapi.testclient import TestClient
from main import app
import json

client = TestClient(app)

def test_read_main():
    response = client.get("/")
    assert response.status_code == 200
    print("★")
    print(response.json())
    print(response.json()['message'])
    print("★★")
    assert response.json() == {"message":"Hello"}
    
def test_read_zipcode():
    response = client.get(f'/zipcode?zipcode=9012303')
    print("test_read_zipcode")
    assert response.status_code == 200
    print(response.json()['results'])
    
    assert response.json()['results'][0]['address1'] == '沖縄県'
   
```

３．testpyを実施(エラーになる）
ImportError while importing test module 'C:\work\prod\sample-app-cicd\sample-app-backend\tests\test_main.py'.
Hint: make sure your test modules/packages have valid Python names.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/b569ed3d-6c55-33c8-b15d-532e39a36c99.png)

どうもルート直下にconftest.pyを配置しないといけないらしい。

４．ルート直下にconftest.pyの空ファイルを配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/e146d4ee-80d9-3673-5dd5-0a3469921eb3.png)

５．再度実行

```
pytest
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/12b88658-c788-8545-d71b-948f291266a4.png)


※pytestでテスト内部のprintを出力する場合は -s オプションをつける

```
pytest -s
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653035/391f9a8b-80ba-76e5-c4d8-91ab8a59cb7d.png)


以上
Make sure that the Process Automation Home page includes a Flow component, and the Flow component references the 'New Oppty' flow.

回避策がよく分からないです。

+ [Enable User Access For Your Flow](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000FXqpR)

:::note
You might want to check the api names of your flow and/or your home page. They are checking for a flow with an api name of New_Oppty and a home page of  Process_Automation_Home  For me, I had to get rid of my original flow and create a new one because i misnamed it originally.

フローやホームページの API 名を確認することをお勧めします。彼らは New_Oppty という API 名と Process_Automation_Home というホームページを持つフローをチェックしています。
:::

+ [Not able to finish the challenge "Enable User access For your flow"](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jd14k)

:::note
in my case, i was having trouble cause when i was saving, my new oppty flow, i was already in version 3, cause save icon wasnt working (Only save as new version).  When i went to edit details and deleted version 2 and 3, and left only version 1 it worked...


私の場合、保存中に問題が発生しました。新しい機会フロー、私はすでにバージョン 3 にあり、保存アイコンが機能していませんでした (新しいバージョンとしてのみ保存)。詳細を編集してバージョン 2 と 3 を削除し、バージョン 1 だけを残したところ、機能しました...
:::

:::note
deleting the extra versions and only having the active one, the most up to date version (4) of New_Oppty; it WORKED!

余分なバージョンを削除し、アクティブなバージョン、New_Oppty の最新バージョン (4) のみを保持します。出来た！
:::
paiza.ioでelixir その34

# 概要
paiza.ioでelixirやってみた。
String.codepoints使ってみた。

# 参考にしたページ

https://qiita.com/kuroda@github/items/b62ff5c4a14b6539e74e

# サンプルコード

```
defmodule StringHelper do
	@moduledoc """
	文字列を扱う汎用的なヘルパー関数群。
	"""
	@doc """
	与えられた文字列に含まれるひらがなをカタカナに変換して返す。
	"""
	def hiragana2katakana(source) do
		source
		|> String.codepoints()
		|> Enum.map(&do_convert_h2k(&1))
		|> Enum.join()
	end
	defp do_convert_h2k(cp) when cp < "\u3041" or cp > "\u3096", do: cp
	defp do_convert_h2k(cp) do
		<<n::utf8>> = cp
		m = n + 0x60
		<<m::utf8>>
	end
	@doc """
	与えられた文字列に含まれるカタカナをひらがなに変換して返す。
	"""
	def katakana2hiragana(source) do
		source
		|> String.codepoints()
		|> Enum.map(&do_convert_k2h(&1))
		|> Enum.join()
	end
	defp do_convert_k2h(cp) when cp < "\u30A1" or cp > "\u30F6", do: cp
	defp do_convert_k2h(cp) do
		<<n::utf8>> = cp
		m = n - 0x60
		<<m::utf8>>
	end
end


StringHelper.hiragana2katakana("かっとやさい")
|> IO.puts

StringHelper.katakana2hiragana("ダブルクォート")
|> IO.puts


```

# 実行結果

```
カットヤサイ
だぶるくぉーと
```

# 成果物

https://paiza.io/projects/xfK0_MKxoF1pPRbr8MlpaQ?language=elixir


以上。
xcrun: error: invalid active developer path 解決方法

# macアップデート後gitコマンドを使用すると・・・

題名にもある通りのエラーが発生！
なぜこのようなエラーが発生するのか調べて見たので備忘録として残しておく。

# 再現方法・問題点
macOSのアップデートをし、普段どおりgitコマンドを実行したところ
~~~
MacBook test % git branch
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
~~~
エラーが発生。

調べたところxcodeの最新版がインストールされてないのが原因のようでした。

xcodeについてはこちら
https://blog.codecamp.jp/what_is_xcode

# 解決方法
下記コマンドの実行
~~~
xcode-select --install
~~~
そうすると、使用許諾が出てくるので同意します。

インストール後
もう一度実行するとエラーなく解決できているかと思います。

以上になります。
Reactでブラウザバックを無効化にするシンプルな２つの方法

## history.pushStateを使う(javascriptネイティブ)

```javascript
window.history.pushState(null, '', window.location.href);
```

これをページ読み込み時に実行すると、履歴の１つ前が自分のページになるので無限に戻れなくなる。javascriptの構文なのでReactに限らずどんなフレームワークでも使えます。

## navigateのオプションを使う

```react
navigate('/path/to', { replace: true });
```

戻るボタンを無効化したいページへ遷移するとき、`{replace:true}`のオプションを与えると戻れなくなる。

## おまけ ブラウザバックを押した奴を無慈悲に怒りたいとき

```javascript
window.addEventListener('popstate', (e) => {
  alert('ブラウザバックを使うんじゃねぇよ！')
  history.go(1);
});
```
Unexpected data type for emailAddressesArray: expected String[]

このエラーが出た場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/59bd368d-479d-7586-c069-b16064a10ae7.png)

+ [emailAdressesArray expected string error](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JeWor)

赤枠の設定が問題みたい

いいえ、フィールド受信者の電子メール アドレス (コレクション) の [含める] ボタンをオフにするだけです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/313a646c-a0c0-c9e6-f479-c81b5a46c7a7.png)

これも同じかな？

+ [Error while using an email action](https://salesforce.stackexchange.com/questions/373649/error-while-using-an-email-action)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4300ae1d-8ff9-e853-9727-07c0aac0070f.png)
ブラウザバックで戻った先の画面でブラウザバックを検知して処理したい

# ブラウザバックを検知したい

![スクリーンショット 2022-10-19 1.49.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/45d7bbb7-e412-87ca-4def-0cea5befba53.png)


送信ボタンを一度押されると、2重送信防止のためボタンを非活性にして操作できないようにすることがあります。
その場合、仮にブラウザバックを行うと非活性のままキャッシュされてしまっているので、リロードしない限りボタンが活性状態へ戻りません

そこで、ブラウザバックを検知してボタンを活性化させる対応を試みました

# 解決した

```sample.js
window.addEventListener('pageshow', イベント);
```

ページを読み込んだタイミングでイベントを拾えるようにしました。

また、[loadイベント](https://developer.mozilla.org/ja/docs/Web/API/Window/load_event)とは違ってpageshowイベントでは、**キャッシュされたページの場合も対象になります**

> ・同じウィンドウまたはタブの中で、他のページからそのページへ移動してきたとき
・ブラウザーの進む、戻るボタンを利用してこのページに戻ったとき
https://developer.mozilla.org/ja/docs/Web/API/Window/pageshow_event

# 試して無理だった方法

## 履歴の変更を加えて強制的にイベントを実行する

**結論：イベントを拾うことは可能でした。が、拾いたいタイミングで拾えなかった**

![スクリーンショット 2022-09-15 15.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536974/13c55009-56ea-9d88-58d7-05dcd0e1ccb4.png)


```sample.js
history.replaceState(null, "", null);
window.addEventListener('popstate', function(e) {
  alert('ブラウザバック検知');
});
```

[history.replaceState](https://developer.mozilla.org/ja/docs/Web/API/History/replaceState)は、引数に与えられた情報によって履歴を編集するものです。
popstateイベントはその履歴の変更によって発火します

それを利用し、ブラウザバック時のイベントを検知することを試みました。

が、しかし、、、safari以外のブラウザでは欲しいタイミングでイベントが拾えず断念

ブラウザごとにキャッシュするタイミングが異なるから、挙動に差が出てしまいます

# 参考

https://yutaihara.com/archives/512
総務の非エンジニアに_インフラのエッセンスをレクチャしていく

# そもそものきっかけ
   - インフラエンジニアを首になった。
   - 総務のスタッフから提案を受けた
   - Outputすることで役に立つと思った。

# このアカウントで目指すこと
   - デスクトップOSの扱い方や機能
   - トラブルシュート
   - AWSの簡単なトピック

今日はこんな感じで