OmniAICreator/Qiita-1.07M huggingface dataset:
SQLインジェクションを防ぐ 〜4


#####SQLコードインジェクション防止の８のベストプラクティス 
https://snyk.io/blog/sql-injection-cheat-sheet/

######第4章です。

[序章](https://qiita.com/bricolageart/items/f87dd0d98f1e1b5c4666)
1. [クライアントサイドの入力バリデーションに依存しない](https://qiita.com/bricolageart/items/b442165360ef24d093da)
2. [制限された権限を持つデータベースユーザーを使用する](https://qiita.com/bricolageart/items/a857fa1c058a4527f155)
3. [プリペアドステートメントとクエリパラメータ化を使用する](https://qiita.com/bricolageart/items/ffe99886bdcdbf32658e)
4. [コードをスキャンしてSQLインジェクションの脆弱性を探す](https://qiita.com/bricolageart/items/37b13aaa59a28c148ac5)
5. [ORMレイヤーを使用する](https://qiita.com/bricolageart/items/1532b73057a260aaa755)
6. [ブロックリストに依存しない](https://qiita.com/bricolageart/items/6d4a78da2870dce6edf7)
7. [入力バリデーションを行う](https://qiita.com/bricolageart/items/36689c797a678e406b6c)
8. [ストアドプロシージャに注意する](https://qiita.com/bricolageart/items/2abfb7ef48a6bfd990bf)


[チートシート（英語）はこちら](https://snyk.io/wp-content/uploads/8-best-practices-to-prevent-SQL-injection-attacks.pdf)


### 4.コードをスキャンしてSQLインジェクションの脆弱性を探す
カスタムコードを作るのは簡単でしょう。しかし、間違いが簡単に起こります。コードをチェックするために、コードレビューやペアプログラミングなどのプロセスを用意しているかもしれません。しかし、ペアでコードをレビューする人は、セキュリティに精通しているでしょうか。ペアの方は、あなたのコードにあるSQLインジェクションのバグを発見できるでしょうか。いずれにしても、SQLインジェクションのようなセキュリティ上の脆弱性の可能性がないか、カスタムコードを自動的に調べることができるに越したことはありません。[Snyk Code](https://snyk.io/product/snyk-code/)のようなSAST（Static Application Security Testing）ツールを使用し、SQLインジェクションなどのセキュリティ上の脆弱性がないかコードを自動的に検査することができます。たとえばGitリポジトリをSnykに接続することで、SDLCで簡単に自動化することが可能です。



4つめは以上です。
最後までお読みいただきありがとうございました！

######次回はSQLインジェクションを防ぐ 〜5に続きます。


SQLインジェクションに関する英語全原文は[こちら](https://snyk.io/blog/sql-injection-cheat-sheet/)です。

---
######Contents provided by:
Jesse Casman, Fumiko Doi, Content Strategists for Snyk, Japan, and Randell Degges, Community Manager for Snyk Global
SQL レコードの追加・更新・削除

#記事の内容

- **レコードの追加**
- **レコードの更新**
- **レコードの削除**
- **テーブルの削除**

##INSERT文
**新規の行（レコード）を1件追加**

:::note alert
列リストとVALUES句の値リストは列数が一致している必要がある
:::

```sql
-- 構文
INSERT INTO
  テーブル名（例1,列2, ...） 
VALUES
  (値１,値2, ...);

-- 商品テーブルに「新商品A」を追加
INSERT INTO
  products(name, price)
VALUES
  ('新商品A', 1000);
```
###列リストの省略
**VALUES句に列の定義順、カンマ区切りで値を設定**

:::note alert
テーブルの全列に対して値を指定する必要がある
:::

```sql
-- 構文
INSERT テーブル名 VALUES(値1, 値2, ...);

-- 商品テーブルに「新商品A」を追加（列名：id, name, price）
INSERT products VALUES (1, '新商品A', 1000);
```


###複数行の追加
:::note alert
Oracleデータベースでは使用不可
:::

```sql
-- 構文
INSERT INTO
  テーブル名(列1,列2,列3, ...)
VALUES
  (値1,値2,値3, ...),
  (値1,値2,値3, ...);

-- 新商品を2件追加
INSERT INTO
  products (name, price)
VALUES
  ('新商品C', 3000),
  ('新商品D', 4000);
```

##UPDATE文
**データの更新**

```sql
-- 構文
UPDATE テーブル名 SET 列1 = 値1, [列2 = 値2 ...] [WHERE 条件式];

-- 全商品の価格を10%割引した価格に変更
UPDATE products SET price = price * 0.9;

-- idが「3」の商品の商品名と価格を変更(UPDATE文とWHERE句の併用して特定の条件に合致する行のデータ更新)
UPDATE products SET name = 'SQL入門', price = 1000 WHERE id = 3;
```

##DELETE文
**データの削除**

:::note alert
削除したデータは基本的には元に戻すことができない
:::

```sql
-- 構文
DELETE FROM テーブル名 [WHERE 削除条件];

-- IDが1001の商品データを削除
DELETE FROM products WHERE id = 1001;
``` 

##TRUNCATE文

* **テーブルのデータを全て削除**
    * WHERE句で指定できないのでテーブルのデータを全て削除します
    * テーブルごと削除してから再作成するのでDELETE文よりも高速
        * ただしロールバックができないので注意が必要

```sql
-- 構文
TRUNCATE TABLE テーブル名;

-- ユーザーテーブルのデータを削除
TRUNCATE TABLE users;
```

##DROP文

**テーブルの削除**

```sql
-- 構文
DROP TABLE テーブル名;

-- 2つのテーブルを削除
DROP TABLE users, products;
```

##参考教材

https://www.udemy.com/course/standard-sql-for-beginners
WifiP2pManagerで他端末を検出する手順


WifiP2pManagerで他端末を検出するためには、多くの関数を呼び出す必要があります。（下図）
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340482/966ce865-274f-7aa1-0c75-fe1e63b72fe9.png)

関数だけ抽出すると下表のようになります。

| 番号 |  関数  |  処理内容  |
| ----: | :---- | :---- |
| 1 | clearLocalServices  |  自デバイスのBonjourサービス終了  |
| 2 | addLocalService  |  自デバイスのBonjourサービス開始  |
| 3 | setDnsSdResponseListeners  |  他デバイスのBonjoourサービス検出時処理、TXTレコード受信時  処理を登録  |
| 4 | clearServiceRequests  |  他デバイスのBonjoourサービス検出終了  |
| 5 | addServiceRequest  |  他デバイスのBonjoourサービス検出開始  |
| 6 | discoverPeers  |  デバイス検出  |
| 7 | discoverServices  |  サービス検出  |

　番号=3以外の関数は、すべてonSuccessコールバック関数で結果が通知されるようになっており、番号=nの関数のonSuccessコールバック関数で、番号=n+1の関数を呼び出すようになっています。

　6のdiscoverPeersに使われている単語Peersをデバイスと解釈すべきか、サービスと解釈すべきか悩みますが、7のdiscoverServicesでServicesが使われているので、デバイスと解釈すべきか...

参考:
https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pManager

※WifiP2pManagerとは
　android.net.wifi.p2p.WifiP2pManagerという名前空間の
Androidのアプリケーションフレームワークに含まれるクラス
SQLインジェクションを防ぐ 〜3


#####SQLコードインジェクション防止の８のベストプラクティス 
https://snyk.io/blog/sql-injection-cheat-sheet/

######第3章です。

[序章](https://qiita.com/bricolageart/items/f87dd0d98f1e1b5c4666)
1. [クライアントサイドの入力バリデーションに依存しない](https://qiita.com/bricolageart/items/b442165360ef24d093da)
2. [制限された権限を持つデータベースユーザーを使用する](https://qiita.com/bricolageart/items/a857fa1c058a4527f155)
3. [プリペアドステートメントとクエリパラメータ化を使用する](https://qiita.com/bricolageart/items/ffe99886bdcdbf32658e)
4. [コードをスキャンしてSQLインジェクションの脆弱性を探す](https://qiita.com/bricolageart/items/37b13aaa59a28c148ac5)
5. [ORMレイヤーを使用する](https://qiita.com/bricolageart/items/1532b73057a260aaa755)
6. [ブロックリストに依存しない](https://qiita.com/bricolageart/items/6d4a78da2870dce6edf7)
7. [入力バリデーションを行う](https://qiita.com/bricolageart/items/36689c797a678e406b6c)
8. [ストアドプロシージャに注意する](https://qiita.com/bricolageart/items/2abfb7ef48a6bfd990bf)


[チートシート（英語）はこちら](https://snyk.io/wp-content/uploads/8-best-practices-to-prevent-SQL-injection-attacks.pdf)


### 3.プリペアドステートメントとクエリパラメータ化を使用する
 
多くの言語には、SQLインジェクションを防ぐための機能が組み込まれています。SQLクエリを作成するとき、プリペアドステートメントでは、クエリのパラメータ化を行うことができます。クエリのパラメータ化は、SQLステートメントを動的を作成する手法です。ベースとなるクエリをいくつかのプレースホルダーとともに作成し、ユーザーが指定したパラメータをこれらのプレースホルダーに安全にアタッチします。

実際に準備されたステートメントとパラメーター化されたクエリを使用する場合、データベース自体が実際にエスケープの処理をします。まず、プレースホルダーを含むクエリ文字列に基づいてクエリ実行プランを作成します。2番目のステップでは、（信頼できない）パラメーターがデータベースに送信されます。クエリプランはすでに作成されているため、パラメータがそれに影響を与えることはありません。これにより、インジェクションを完全に防ぐことができます。

Javaの例：
`String query = "SELECT * FROM USERS WHERE username LIKE ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, parameter);
ResultSet result = statement.executeQuery();`
 
MySqlコネクタを使用したPythonの例：
`cursor = conn.cursor(prepared=True)
params = ("foo",)
cursor.execute("SELECT * FROM USERS WHERE username = %s", params)`
 
 
mysql2を使用したJavaScriptの例：
`connection.query("SELECT * FROM USERS WHERE username = ?",[
     req.body.username
    ],function(error, results){}); 
//emulates a prepared statement

//OR

connection.execute("SELECT * FROM USERS WHERE username = ?",[
     req.body.username
    ],function(error, results){});
//prepared statement`

これを JavaScript で行うには、たとえば MySql データベースを使用する場合、複数の方法があります。`.query()`を使用する場合には、実際にプリペアドステートメントを実行するのではないことに注意してください。パラメータの置換はクライアントサイドで処理されます。つまり、プリペアドステートメントをエミュレートしてることになります。データベース上で本物のプリペアドステートメントを実行するには、`.execute()`関数を使用する必要があります。



3つめは以上です。
最後までお読みいただきありがとうございました！

######次回はSQLインジェクションを防ぐ 〜4に続きます。


SQLインジェクションに関する英語全原文は[こちら](https://snyk.io/blog/sql-injection-cheat-sheet/)です。

---
######Contents provided by:
Jesse Casman, Fumiko Doi, Content Strategists for Snyk, Japan, and Randell Degges, Community Manager for Snyk Global
論理演算を詳しく学ぶ１～論理演算の計算と背景～

初めての投稿です。
論理演算は、数学に論理学を掛け合わせたもので、ジョージブールが開発しました。
＜なぜ論理学が必要なのか？＞
それは、数学だけでは、表現できない人間の思考を表現するために必要とされました。
論理演算のポイントは、数学に論理学がミックスされているため、私たちの知っている四則演算（＋、×など）とは別物ということです。
私たちの知っている計算とは、例えば、12+16=28というものです。
この計算では１、数を扱った式であり、２、イコールで結ばれた右と左の値は同じという前提があります。
しかし、論理演算は、全く違うものです。
＜論理演算とは？＞
論理演算には、AND（×）、OR（＋）、NOT（ー）の３種類の演算があります。
例えば、AND演算では、真　×　偽　＝　偽となります。
具体的に見ていきます。
Aにねこは動物である。
Bにニューヨークはブラジルにある。
という命題があるとします。
真偽を判定すると、Aは真、Bは偽となります。
ここで、A、Bに対して、AND演算とOR演算をしてみます。
答えは、
AND演算：　真　×　偽　＝　偽
OR演算：　 真　＋ 偽　＝　真
です。
基本情報などの書籍で真や偽ではなく、0、1で表現されてたのでは？・・・と思う人もいると思います。
この答えは、真を「1」、偽を「0」と置き換えただけに過ぎないのです。
つまり、AND演算なら、両方とも真の場合真になり、それ以外は偽となるので、
A　B　　結果
真　真　真
真　偽　偽
偽　真　偽
偽　偽　偽
を
1 1    1
1 0    0
0 1    0
0 0    0
ということになります。
次回は、論理演算をどのように使っているのかを背景から記事を書いていきます。
twitter api 凍結について

最近のtwitterapiの凍結はどうなってるのか軽く調べてみた。

参考
https://toxublog.com/blog/twitter_api_prohibition/
https://help.twitter.com/ja/rules-and-policies/twitter-automation

#自動リプOKな場合

>相手からの反応に対して１回だけ返信する場合
相手から返信の要求または明確な許可があった場合
キャンペーン用のハッシュタグに対する自動返信の場合


bot を作成。
① botに太郎さんからリプをもらう
② 自動で太郎さんに返信する

ならOK

① botのツイートを太郎さんに引用RTしてもらう
② 自動で太郎さんに返信する

ならOK

#自動DMOKな場合

>相手からのダイレクトメッセージの要求があった場合
相手がダイレクトメッセージを受け取ることを了承していた場合



通知はDMでしますという場合。
① botに太郎さんからDMをもらう
② 自動で太郎さんにDMを送る

ならOK

だから通知はツイッターDMで希望の方は、まずは bot 宛にDMを送信して下さい。
確認が取れたらDMで通知を受信できます。
って感じでできそう。
ポインタ等の理解


C++において　ポインタの記法 *&で混乱してしまいます。
混乱したときは、以下のコードをデバッガで追い、アドレス、値の変化を追うことで混乱から抜けだします:sweat_smile:。

``` C++

#include <iostream>

int main()
{
   //デバッガの内容
   //int_num2     未初期化
   //int_num3     未初期化
   //p_int_num1;  未初期化
   //p_int_num2;  未初期化
   //p_int_num3;  未初期化

    int int_num1 = 10;          //実体の定義
    int int_num2 = 20;          //実体の定義
    int int_num3 = 30;          //実体の定義
    int* p_int_num1;            //ポインタの定義
    int* p_int_num2;            //ポインタの定義
    int* p_int_num3;            //ポインタの定義

   //デバッガの内容
   //int_num1     10
   //int_num2     20
   //int_num3     30
   //p_int_num1;  未初期化
   //p_int_num2;  未初期化
   //p_int_num3;  未初期化

    p_int_num1 = &int_num1;     //&実体で　ポインタ「p_int_num1」に実体「int_num1」のポインタを代入する。
    p_int_num2 = &int_num2;     //&実体で　ポインタ「p_int_num2」に実体「int_num2」のポインタを代入する。
    p_int_num3 = &int_num3;     //&実体で　ポインタ「p_int_num3」に実体「int_num3」のポインタを代入する。

   //デバッガの内容
   //int_num1     10
   //int_num2     20
   //int_num3     30
   //p_int_num1;  0xfb00{10}
   //p_int_num2;  0xfaf4{20}
   //p_int_num3;  0xfae8{30}

    p_int_num2 = p_int_num1;    //ポインタ「p_int_num2」にポインタ「p_int_num1」を代入する。
    *p_int_num2 = 21;           //*ポインタ（左辺）で　ポインタ「p_int_num2」の示す実体に実体「21」を代入する。
   //デバッガの内容
   //int_num1     21
   //int_num2     20
   //int_num3     30
   //p_int_num1;  0xfb00{21}
   //p_int_num2;  0xfb00{21}
   //p_int_num3;  0xfae8{30}

    *p_int_num2 = int_num3;     //*ポインタ（左辺）で　ポインタ「p_int_num2」の示す実体に実体「int_num2」を代入する。
    int_num2 = *p_int_num3;     //*ポインタ（右辺）で　実体「int_num2」にポインタ「p_int_num2」の示す実体を代入する。

   //デバッガの内容
   //int_num1     30
   //int_num2     30
   //int_num3     30
   //p_int_num1;  0xfb00{21}
   //p_int_num2;  0xfb00{21}
   //p_int_num3;  0xfae8{30}
}
```
PHPのオブジェクトの代入には気をつける

# はじめに
PHPのobjectについての忘備録。

# これはだめ
```PHP
$a = new stdClass();
$a->name = 'Yamada';

$b = $a;
var_dump($a === $b);  // bool(true)

$b->name = 'Sato';
var_dump($a === $b);  // bool(true)

var_dump($a->name)  // string(4) 'Sato'
```

# 正しい代入の仕方
```PHP
$a = new stdClass();
$a->name = 'Yamada';

$b = clone $a;
var_dump($a === $b);  // bool(false) この時点で別のobjectになってる

$b->name = 'Sato';
var_dump($a->name)  // string(6) "Yamada"
var_dump($b->name)  // string(4) "Sato"
```

# なんで
objectは参照型なので、同じオブジェクトを参照している代入元と代入先の一方でプロパティを変更すると、
結果として参照元のオブジェクトを書き換えてしまい、代入元と代入先いずれも変更が入ってしまう。

実際にオブジェクトIDを見てみると、確かにそうなっていた。

```php
$a = new stdClass();
spl_object_id($a)  // 4274

$b = $a
spl_object_id($b)  // 4274 

// $aをcloneした$clone_aのオブジェクトID
$c = clone $a
spl_object_id($c)  // 4271
```

`$a`と`$b`は同じオブジェクトIDなので、
どちらかのプロパティを変更しようとすると、オブジェクトID:4274のオブジェクトを操作しようとして結果として`$a`と`$b`には同じ変更が入ってしまう。
オブジェクトの中身だけを別の変数に代入するためには、cloneを使うようにする。

# 参考
https://qiita.com/asagi_00a3af/items/45e1470e7745de227f2f
【Python】Pandas で株価データを取得する（その２）

## はじめに

[前回](https://qiita.com/tnozoo/items/4c9e594afce6555670a8)書いた株価データを取得するコードは問題があった

- 銘柄がトヨタ固定
- 株価データ取得期間が固定

今回は，[前回](https://qiita.com/tnozoo/items/4c9e594afce6555670a8)のコードを次のように書きかえてみる

- トヨタ以外にも任意の銘柄の株価データが取得できるコード

## 複数銘柄の株価データを取得する

取得したい複数銘柄のコードをリストにして main 関数に渡してみる
ついでに銘柄名も渡してみる

```python
if __name__ == '__main__':
    codeList = ['7203', '7201', '7267'];
    companyList = ['トヨタ', '日産', 'ホンダ'];
    main(codeList, companyList);
```

main 関数は，コードと銘柄名のリストをもらい，
リストの要素数分の株価データ取得処理を行う
DataReader 関数を呼び出す際に，コードの最後に'.T'をつける

```python
def main(codeList, companyList):
    for code, company in zip(codeList, companyList):
        df = pdr.DataReader(code + '.T', 'yahoo', '2020-11-01', '2021-11-01');
        print(company, df.tail(1));
```

まとめると，次のようなコードになる


```python:step02.py
import pandas_datareader.data as pdr

def main(codeList, companyList):
    for code, company in zip(codeList, companyList):
        df = pdr.DataReader(code + '.T', 'yahoo', '2020-11-01', '2021-11-01');
        print(company, df.tail(1));

if __name__ == '__main__':
    codeList = ['7203', '7201', '7267'];
    companyList = ['トヨタ', '日産', 'ホンダ'];
    main(codeList, companyList);
```

## おわりに

株価データ取得期間が固定という問題は残ったままだが，
複数銘柄の株価データを取得することができた

しかし，新たに気になる問題が発生している
取得したい銘柄のコードをPythonコードの中に直に書いていることだ
取得する銘柄のコードは別ファイル（テキストやExcelファイルなど）で管理したい

次回は，次のようなコードを書いてみよう

- 株価データ取得期間が任意の期間で（例えば，６か月前から現在まで）取得できるコード
- 取得する銘柄コードをExcelファイルで用意し，Excelファイルを読み込み株価データが取得できるコード
wsadminで設定し、設定できたことを確認する(SystemOut/SystemErr編)

今回は、SystemOut.log、SystemErr.logの設定と設定確認方法について



```jvminfo.txt
yyy1Node01,server1
yyy1Node01,server2
yyy2Node01,server1
```
設定方法
設定値を変数渡しをしたい場合はこちらのコードを参照してください。
※いつか直します。。。
https://qiita.com/XKYUXSOX/items/7f33c1ee19827030f0a7


```SystemRidirect_set.py
import csv

with open('jvminfo.txt') as f:
    csvreader = csv.reader(f)
    for row in csvreader:
      nodename=row[0]
      servername=row[1]
      id=AdminConfig.getid('/Node:'+nodename+'/Server:'+servername+'/')
      ProcessID = AdminConfig.list('StreamRedirect',id)
      StreamRedirectList=AdminUtilities.convertToList(ProcessID)
      for sys in StreamRedirectList:
         print nodename + servername
         AdminConfig.modify(sys,'[[rolloverType "TIME"]]')
         AdminConfig.save()
```

設定確認方法



```SystemRidirect_get.py
import csv

with open('jvminfo.txt') as f:
    csvreader = csv.reader(f)
    for row in csvreader:
      nodename=row[0]
      servername=row[1]
      id=AdminConfig.getid('/Node:'+nodename+'/Server:'+servername+'/')
      ProcessID = AdminConfig.list('StreamRedirect',id)
      StreamRidirectList=AdminUtilities.convertToList(ProcessID)
      for thd in StreamRidirectList:
           print nodename + servername
           print AdminConfig.showAttribute(thd,'fileName')
           print AdminConfig.showAttribute(thd,'rolloverPeriod')
           print AdminConfig.showAttribute(thd,'rolloverType')
```
通常は2列だけど、画面幅が小さくなると2行になるテーブルっぽいレイアウト


一言で表現することばが見つからないので箇条書きで特徴を記載する

- テーブルっぽいレイアウト
- 通常は2列（左揃え右揃え）で1ペアの文字を1行で表示する
- 文字数により1行で収まらない場合は、左50%, 右50%ではなく、それぞれ100%のまま上下2行に変化する


## 作ったもの

![flex-table-01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254717/9086dfef-fd18-d26d-6970-07500cf04172.gif)


```html:
    <div>
      <hr />
      <div class="box-top">
        <div class="box-left">短い質問</div>
        <div class="box-right">短い回答</div>
      </div>
      <hr />
      <div class="box-top">
        <div class="box-left">中くらいのほどほどの長さの質問</div>
        <div class="box-right">中くらいのほどほどの長さの回答</div>
      </div>
      <hr />
      <div class="box-top">
        <div class="box-left">長い文章で書かれたとてもすごく長い質問</div>
        <div class="box-right">
          長い文章で書かれたとてもすごく長い回答
        </div>
      </div>
      <hr />
    </div>
```

```css:
.box-top {
  display: flex;
  padding: 5px;
  margin: 5px;
  flex-wrap: wrap;
}

.box-left {
  text-align: left;
  margin-right: auto;
}

.box-right {
  text-align: right;
  margin-left: auto;
}
```

コードはこちら
https://codesandbox.io/s/vigorous-wood-3xwol?file=/index.html

  
`flex-wrap: wrap;`を設定し、左右の要素には`margin-right: auto;` `text-align: right;`とすると領域を最大化してくれるらしい。

ただの2列のテーブルレイアウトだと、文章の折返しが発生したとき画面の半分で改行されるため読みづらい。かと言ってPC表示のように横幅が潤沢にある場合は2行にするほどでもない、といった場合に使えるかも。

## 参考
https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Flexible_Box_Layout/Aligning_Items_in_a_Flex_Container
Dynamics 365 SDK CoreAssemblyの最新バージョンの変更点

以下のように、CrmServiceClientはようやく継承可能になりました、共通部品を作成する場合利用可能と思います。
また、RecommendedDegreesOfParallelismという推奨並列度の属性が追加されました、デフォルトが5、今後MSのサーバー側で推奨数字が戻ってくる想定です。並列処理を実装する場合、指定ではなくこの属性を利用することがお勧めかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/1e62da6b-6f86-ef7b-7161-569bba63a848.png)
RecommendedDegreesOfParallelismの使い方は、以下のDocsに記載れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/98adedb3-18f5-1d35-48a1-2258a12da553.png)

関連URL
https://www.nuget.org/packages/Microsoft.CrmSdk.CoreAssemblies/
https://docs.microsoft.com/en-us/powerapps/developer/data-platform/xrm-tooling/sample-tpl-crmserviceclient
PascalVOC形式のファイルをYOLO形式に変換

# はじめに
物体検出で公開されているデータセットを使いたいとき，YOLOを使って物体検出をしたいのにデータセットがPascalVOC形式なんてことがよくあります．私も最初はネットで転がっているものを使おうとしたのですが，使い方が分かりにくいものが多く，バグだらけのものばかりだったので自分で書くことにしました．今回，同じような人がいれば力になれるのではないかと思い，記事にすることにしました．

以下の記事も良ければ参照ください．

https://qiita.com/Rihib/items/ce9d2696d7d5ddeba72a

# PascalVOC形式をYOLO形式に変換
コードは以下の私のGitHubレポジトリで公開しています．

https://github.com/rihito-bannai/convert_pascal_voc_xml_to_yolo

## 使い方
コードの一番上の部分にそれぞれの絶対パスを記入して，このスクリプトを実行するだけです．XMLファイルと画像ファイルが同じディレクトリ内に混ざっていても問題ありません．画像の形式はJPEG，PNG，その他大体のものに対応しています．

以下にそれぞれの項目についての説明を載せます．
※ パスの最後には`/`をつけるようにしてください．例）`/Users/datasets/xmls/`

- `absolutepath_of_directory_with_xmlfiles`： ここにはXMLファイルが入っているディレクトリの絶対パスを記入してください．

- `absolutepath_of_directory_with_imgfiles`： ここには画像ファイルが入っているディレクトリの絶対パスを記入してください．

- `absolutepath_of_directory_with_yolofiles`： ここにはYOLOファイルの出力先のディレクトリの絶対パスを入れていください．ここで指定したディレクトリにYOLO形式に変換されたファイルが出力されます．

- `absolutepath_of_directory_with_classes_txt`： `classes.txt`の出力先のディレクトリの絶対パスを入れていください．ここで指定したディレクトリに，クラスの一覧が書かれたテキストファイル（`classes.txt`）が出力されます．

- `absolutepath_of_directory_with_error_txt`： ここで指定したディレクトリに，対応する画像ファイルが見つからなかったなどの理由でYOLO形式に変換できなかったXMLファイル名の一覧が書かれたテキストファイルが出力されます．絶対パスで記入．

## 変換できなかったら

- 記入したパスがあっているか確認してください
    - パスの最後に`/`がついているか
    - パスをコピペするときにクオーテーションとパスとの間に空白が生じていないか
    - パスに誤字脱字がないか
    - パスで指定したディレクトリにファイルがきちんと入っているか
- XMLファイルのパース（読み取り）がうまくいっていない可能性があります．コードの`GetDataFromXMLfile`クラスを確認してそこに書かれている項目が自分のXMLファイルに存在するか確かめてください．
- それでもエラーが起きる場合はコメントお願いします．

# おわりに
コードの中身としてはXMLファイルをパースして座標等の情報を抜き取った後，YOLOの形式に座標を計算し直しているだけです．ちょうど一年前に実装したのですが，XMLファイルの構成だったりとかYOLOファイルの仕組み等々を知れて楽しかった記憶があります．
wsadminコマンド 使い方

wsadminコマンドの基本
取得できる項目

前提
DMが起動していること
Base版ならその対象のアプリケーションサーバ

```
/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -lang jython -user xxxx -password xxxxx
```
ログインしたら以下のコマンドで項目一覧を表示する。

```
print AdminConfig.types()
#やたらと出てくる。。。
```

代表的なものを選択する。
JavaVirtualMachine
※変数として格納しない場合は、''シングルコーテーションで囲む。

```
print AdminConfig.list('JavaVirtualMachine')
#DMのIDが表示される
#NodeAgentのIDが表示される
#ApplicationServerのIDが表示される
```
そのIDをコピーする。
※変数として格納しない場合は、''シングルコーテーションで囲む。

````
print AdminConfig.show('(cells/yyd1Cell01/nodes/yyd1Node01/servers/server1|server.xml#JavaVirtualMachine_1621905518392)')

````

結果

```
[bootClasspath []]
[classpath []]
[debugArgs -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=7777]
[debugMode false]
[disableJIT false]
[genericJvmArguments "-Djava.awt.headless=true"]
[hprofArguments []]
[initialHeapSize 256]
[internalClassAccessMode ALLOW]
[maximumHeapSize 256]
[runHProf false]
[systemProperties [com.ibm.security.jgss.debug(cells/yyd1Cell01/nodes/yyd1Node01/servers/server1|server.xml#Property_1621905518400) com.ibm.security.krb5.Krb5Debug(cells/yyd1Cell01/nodes/yyd1Node01/servers/server1|server.xml#Property_1621905518401)]]
[verboseModeClass false]
[verboseModeGarbageCollection true]
[verboseModeJNI false]
```

あとがき
TPVの設定に関しては、残念ながらAdminConfigからは設定できない。
※私の確認不足ならすいません。できるのであれば情報ほしいです。
※ただしTPVは、AdminTaskコマンドからは設定できる！！ことは確認しました。
com.apple.DiskManagement.disenter エラー0


macOS Big Sur 11.4

## disk utility で認識しない時の対処法

1. activity monitor を起動
1. 右上の検索から fsck を入力
1. fsck_hfs　が出てきたら選択
1. バツアイコンをクリックして強制終了を選択
1. 1.-4.の手順でうまくいかなければ　接続を物理的に切る
1. HDDの電源を入れ直す
1. PCに再接続する
1. 1.-4.の手順を行うを繰り返す
【Python】Pandas で株価データを取得する

## はじめに

Python を使って，株価の値動きを分析したいと思った
いわゆる，テクニカル分析だ
まずはともあれ，株価データを取得する必要がある

## Pandas Datareader を使って Yahoo の株価データを取得する

Pandas Datareader を使えば，Yahoo の株価データが簡単に取得できる
step01.py として，次のようなコードを書けば取得可能だ

- データ取得元: yahoo
- 取得範囲: 2020年11月1日から2021年11月1日まで
- 銘柄: トヨタ（コード: 7203）


```python:step01.py
import pandas_datareader.data as pdr

def main():
    df = pdr.DataReader('7203.T', 'yahoo', '2020-11-01', '2021-11-01');
    print(df);

if __name__ == '__main__':
    main();
```

コマンドラインから実行してみると，データが取得できていることがわかる

```
❯ python step01.py
                   High          Low         Open        Close      Volume    Adj Close
Date
2020-11-02  1403.199951  1370.000000  1373.199951  1389.800049  28606000.0  1288.619629
2020-11-04  1410.800049  1395.199951  1404.800049  1395.199951  31390500.0  1293.626343
2020-11-05  1406.400024  1384.599976  1391.000000  1396.800049  28217000.0  1295.109985
2020-11-06  1430.400024  1403.000000  1414.000000  1403.800049  55464500.0  1301.600220
2020-11-09  1448.400024  1423.800049  1431.800049  1434.599976  39193000.0  1330.157959
...                 ...          ...          ...          ...         ...          ...
2021-10-26  1992.500000  1965.000000  1974.000000  1980.000000  15149500.0  1980.000000
2021-10-27  2004.000000  1984.000000  1998.500000  2004.000000  14028900.0  2004.000000
2021-10-28  2013.000000  1974.000000  1987.500000  2000.000000  17683000.0  2000.000000
2021-10-29  2008.000000  1978.000000  1993.500000  2006.500000  18052200.0  2006.500000
2021-11-01  2050.000000  2022.000000  2028.000000  2050.000000  24547300.0  2050.000000

[245 rows x 6 columns]
```

## おわりに

株価データは簡単に取得できることがわかった
しかし，step01.py のコードは実用性がない
具体的な問題点は次のようだ

- 銘柄がトヨタ固定
- 株価データ取得期間が固定

次回は，次のようなコードを書いてみよう

- トヨタ以外にも任意の銘柄の株価データが取得できるコード
- 株価データ取得期間が任意の期間で（例えば，６か月前から現在まで）取得できるコード
callableはもう古い！？typingモジュールを使ったPythonのモダンな型判定法

`f`が関数かどうか判定するときに`callable(f)`使ってませんか？
同じ型判定なのに、文字列だと`isinstance(x, str)`だし、書き方が統一的ではないのが気になります。

### typingを使おう

Pythonは近年は型注釈の整備が非常に進んできています。それに伴い、型にかかわるモジュールも充実してきています。

- `typing` ... 基本的な型が入っている。たいていはこれで事足りる。
- `types` ... 細かな型まで入っている。
- `typing_extensions` ... 開発途中だが「こんなのアリ！？」みたいな型まで入っている。

これらを使いこなすことで、高度なプログラムだけでなく、読みやすくデバッグしやすいコードが書けるようになります。加えて、VSCodeではifブロック内で予測変換が利くようになります。

以下、具体例を見ていきましょう。

1. [関数かどうかを判定](#1-関数かどうかを判定)
2. [イテレータの判定](#2-イテレータの判定)
3. [ジェネレータの判定](#3-ジェネレータの判定)
4. [特定のメソッドのセットを持っているか判定](#4-特定のメソッドのセットを持っているか判定)


# 1. 関数かどうかを判定

```python
def f(x):
    print(x)
```

これを判定するには従来は

```python
callable(f) # True
```

でしたが、`Callable`型が使えます。

```python
from typing import Callable
isinstance(f, Callable) # True
```

# 2. イテレータの判定

for文に使う前にイテレータとして使えるかどうかを判定するときなど、従来は

```python
if hasattr(x, "__iter__"):
    # __iter__メソッドの有無で判定
    for i in x:
        ...
```

とか

```python
def is_iterable(x):
    # 判定する関数を自作
    try:
        iter(x)
    except TypeError:
        out = False
    else:
        out = True
    return out
```

とか書く必要がありましたが、`Iterable`型が使えます。

```python
from typing import Iterable
isinstance([1, 2, 3], Iterable) # True
isinstance(1, Iterable) # False
```

# 3. ジェネレータの判定

何かの関数で

```python
out = f()
```

と返されたときに、`out`が値を持っているのか、ジェネレータなのでこれから値を取り出していかなければならないのか判定するときがあります。`inspect`モジュールを使って

```python
import inspect
inspect.isgenerator(out)
```

でもよいですが、`types`モジュールにある`GeneratorType`が使えます。

```python
from types import GeneratorType
isinstance(out, GeneratorType)
```

# 4. 特定のメソッドのセットを持っているか判定

`hasattr`を連発せざるを得ない状況がたまにありますが、とても読みにくくなります。
このときに大活躍するのが`typing_extensions`の`Protocol`型です。`Protocol`型は例えば、`fit`と`predict`をメソッドとして持つクラスといったような「クラスのひな型」を定義でき、`isinstance`と組み合わせられます。

```python
from typing_extensions import Protocol, runtime_checkable

@runtime_checkable # isinstanceで使うにはこれが必要
class ScikitLearnProtocol(Protocol):
    fit: Callable
    predict: Callable
```

`scikit-learn`は大抵こういうクラス構造になっているので、`True`と判定されます。

```python
from sklearn.linear_model import Lasso

model = Lasso()
isinstance(model, ScikitLearnProtocol) # True
isinstance(1, ScikitLearnProtocol) # False
```

# おわりに

ほかにも、標準の関数を判定する`BuiltinFunctionType`などもあります。
また、個人的に注目しているのが`TypedDict`で、まだ`isinstance`には対応していないのですが、辞書のキーの名前と値の型を対応させることができるので、将来の進展が楽しみです。

それでは、良いコーディングライフを！
PowerPlatform APIアクセス数制限更新

2021/11/05日、PowerPlatform APIアクセス数制限のDocs(英語)が更新されました。今まで環境ごとに最大10万件/24時間のアクセス制限は、大幅引き上げされました。
変更前の資料は以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/d52af693-34e8-9ccb-11c1-6b1d43982a91.png)

変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/2180b75f-2cb7-8e6f-ccac-d143cbb5cfa8.png)
Dynamics 365の環境のアクセス制限は、50万＋ライセンス数×5000になります。
一定のD365のライセンス数を購入すれば、普通の業務運用では足りるかと思います。

Dynamis365ライセンスとPowerAppsのライセンスを組み合わせて利用する場合、以下の説明のようにアクセス数が多いが上限になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/a68cd7b4-3343-4676-1b2c-f3f340ec30da.png)

残念なことは、PowerApps環境のアクセス数が変更せず2万5000件のままになっています。ライセンス数が多く購入してもの上限が変わらない。超過する場合別途Addonライセンスの購入が必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/2c6d0d53-757c-e366-90fd-d01051fe201c.png)
Addonライセンスごとのアクセス数も20000→50000に引き上げられました。

また、ユーザーごとのAPIアクセス制限も引き上げられました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/9e82e1a5-7df5-7549-fac3-aa0c5b370b4b.png)
一般的な業務であれば十分かと思います。

関連URL
https://docs.microsoft.com/en-us/power-platform/admin/api-request-limits-allocations
https://docs.microsoft.com/ja-jp/power-platform/admin/api-request-limits-allocations
Windows 11でWindows DefenderのGUIが開かない時の対処法

Windows 11にアップグレードか新規インストールするとWindows Defenderが開かなくなる時がある。
#対処法
・管理者権限でPowerShellを開く
・以下のコマンドを入力
```
Get-AppxPackage Microsoft.SecHealthUI -AllUsers | Reset-AppxPackage
```
【SAP-C01試験対策】Kinesisのまとめ

# はじめに
AWSのKinesisを勉強するために以下のドキュメントを参考にしたので内容をまとめます。

https://aws.amazon.com/jp/kinesis/

https://d1.awsstatic.com/webinars/jp/pdf/services/20180110_AWS-BlackBelt-Kinesis.pdf




# 背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。

# Kinesisの機能
1. Kinesis Video Stream
1. Kinesis Data Stream
1. Kinesis Data Firehose
1. Kinesis Data Analytics

# Kinesis Video Stream（簡単に）
以下の三つの形式から利用可能。
- GetMedia：GetMedia APIを使用して独自のアプリケーションを構築。
- HLS：業界標準のHTTPベースのメディアストリーミングプロトコル。
- MPEG-DASH：従来のHTTPサーバから配信されたデータのストリーミングを可能にする。

# Kinesis Data Streams
ストリームデータを処理するためのアプリケーションを構築


## 仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/77e6c0dc-e9ab-8464-0db9-f9c5c3c429e1.png)

- プロデューサー：[Kinesis Producer Library](#用語集)、[Kinesis Agent](#用語集)、IoTデバイス、
- コンシューマー：[Kinesis Client Library](#用語集)、Kinesis Firehose、Kinesis Analytic

## ユースケース
- ログやイベントデータの収集
- リアルタイム分析
- モバイルデータキャプチャ
- ゲームデータのフィード

# Kinesis Data Firehose
ストリームデータをS3、Redshift、Elasticsearch Serviceへ配信

## 仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/3c788ab2-883c-03ba-d05a-2744c5027ef2.png)

- 送信元：Kinesis data Streams
- 配信ストリーム：配信先に応じて配信ストリームを作成。元ソースをS3に保存可能。
- 配信先：S3、Redshift、Elasticsearch Service

## ユースケース
- データレイクとデータウェアハウスへのデータストリーミング
- Machine Learning アプリケーションのストリーミング
- ログと IoT Analytics
- セキュリティモニタリング

# Kinesis Data Analytics
ストリームデータを標準的なSQLクエリでリアルタイムに分析

## 仕組み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951272/43a9688a-6b78-e6f1-76d6-c4eefbbb43bf.png)

- 入力元：Kinesis Streams、Kinesis Firehose
- Kinesis Analytics：Lambdaで前処理を実施してからSQLクエリを実行
- 出力先：Kinesis Streams、Kinesis Firehose

## ユースケース
- ストリーミングデータを数秒で配信
- リアルタイム分析を作成する
- ステートフル処理を実行する

# 用語集

- Kinesis Agent：Kinesisにデータを取り込むスタンドアロンJavaアプリケーション
- Kinesis Producer Library (KPL)：Kinesis Streansにデータ送信する補助ライブラリ
- Kinesis Client Library (KCL)：EC2などにデプロイしてアプリケーションを構築
RDKit　超簡単インストール


以前、RDKit簡単インストール　を書きましたが
その後の状況に合わせて　更新です。

　アナコンダは有償だわ
　python3.8　以降も対応したいわ

いったい私は、どうすれば　良いのでしょうか。

https://qiita.com/bono0/items/eca6f2f5c8eb44080a03

でも大丈夫、コマンド一発
超簡単です。

pip install rdkit-pypi

参照
https://pypi.org/project/rdkit-pypi/
python3.10まで対応のようです。

嗚呼、なんと便利な世の中でしょうか！！
世界の皆様に　感謝です！！

![1637545929085_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/45173e38-5ffc-5cb8-f269-91fe5d13a308.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/55e429a0-7ba9-1371-230d-0c9310b2856f.png)
Oracle Databaseで以前の値に戻すSQL

`where`句を忘れた、指定をミスった、しかもコミットまでしちゃった！というときにデータを戻すためのSQL（フラッシュバッククエリ）です。

# `TARGET_TBL`テーブルの`target_column`を20分前の値に戻すSQL

```sql
update TARGET_TBL target 
set
    target_column = ( 
        select
            target_column 
        from
            TARGET_TBL as of timestamp (systimestamp - interval '20' minute) 
        where
            target.key_column = TARGET_TBL.key_column
    )
```

直接参照日時のtimestampを指定してもOK
`as of timestamp to_timestamp('2021-11-21 09:30:00', 'YYYY-MM-DD HH:MI:SS')`

# Link

https://docs.oracle.com/cd/E16338_01/appdev.112/b56259/adfns_flashback.htm
GitHubのプライベートリポジトリをzipダウンロード

ブラウザでGitHubにログインせず、curlコマンドでprivateリポジトリ（自分が管理するリポジトリ）の内容を取得する。

# 準備

トークンの取得

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

1. GitHubにログイン
1. 右上のアイコン＞`Settings`
1. 左メニュー＞`Developer settings`
1. 左メニュー＞`Personal access tokens`
1. `Generate new token`押下
1. トークンの設定
    - Note
        - このトークンの用途など
        - 例）privateリポジトリアクセス用
    - Expiration
        - トークンの有効期限
    - Select scopes
        - トークンが許可するスコープ
        - 今回は`repo`を選択
1. `Generate token`押下
1. 表示されたトークンをメモしておく
    -　この時しか表示されないため、忘れずに！！


# 取得

```
curl -H "Authorization: token [トークン]" -L https://api.github.com/repos/XXX/[repository_name]/zipball/[branche_name] > [DL先ディレクトリ]/[適当な名前].zip
```

例

```
curl -H "Authorization: token xxx_XXXXXXXXXXXXXXX" -L https://api.github.com/repos/mamfrog/myprivaterepo/zipball/main > ~/Desktop/main.zip
```

プロキシ環境の場合

```
curl -H "Authorization: token [トークン]" -L https://api.github.com/repos/XXX/[repository_name]/zipball/[branche_name] -x http://[proxy_host]:[proxy_port] --insecure > [DL先ディレクトリ]/[適当な名前].zip
```
まだ間に合うMicrosoft Ignite Cloud Skills Challenge - November 2021

今月末までMicrosoft Ignite Cloud Skills Challenge - November 2021が開催中です。期間内に所定のコースのうち1つを完了させれば、マイクロソフト認定資格が **1回無料で受験** できます。詳しくは以下のサイトをご覧下さい。

https://www.microsoft.com/ja-jp/events/azurebase/blog/microsoft-ignite-cloud-skills-challenge-november-2021/

基本的にはご自身の興味がある分野、もしくはスキルアップしたい分野のコースを選択されるのがベストです。ただし残された時間も1週間ちょっとなので、今から始められる方は下記のリストを加味して完走できそうなコースを選ぶのも良いのではと思っています。

コメントがないものは筆者未実施です。モジュールはMicrosoft Learnのものです。

## Teams Admin Challenge
モジュール数： 25 (英語25)  
学習時間(公称)： 19時間52分  

## Teams Voice Engineer Challenge
モジュール数： 19 (日本語9 + 英語10)  
学習時間(公称)： 13時間31分  

## Desktop and Device Management Challenge
モジュール数： 41 (日本語31 + 英語10)  
学習時間(公称)： 18時間38分  

## Dynamics 365 Sales Consultant Challenge
モジュール数： 25 (日本語25)  
学習時間(公称)： 21時間33分  

## Power Platform Developer Challenge
モジュール数： 23 (日本語23)  
学習時間(公称)： 20時間1分  

## Azure Admin Challenge
モジュール数： 35 (日本語35)  
学習時間(公称)： 19時間3分  
コメント： 全モジュールが日本語で、ハンズオン(無料のAzure環境を操作する)も素直にできました。

## Azure Developer Challenge
モジュール数： 33 (日本語33)  
学習時間(公称)： 20時間48分  
コメント： 一部のハンズオンでソースが動かないなどの問題がありました。少し前まで一部モジュールが英語でした。

## Azure Database Admin Challenge
モジュール数： 23 (日本語23)  
学習時間(公称)： 20時間53分  

## Windows Server Hybrid Admin Challenge
モジュール数： 17 (日本語17)  
学習時間(公称)： 15時間4分  

## Dynamics 365 Supply Chain Mgmt Challenge
モジュール数： 15 (日本語15)  
学習時間(公称)： 17時間47分  

## Security Operations Analyst Challenge
モジュール数： 32 (日本語32)  
学習時間(公称)： 20時間56分  

## Microsoft Ignite Identity + Information Protection Challenge
モジュール数： 29 (日本語29)  
学習時間(公称)： 21時間40分  

参考になれば幸いです。
Swiftの引数種類が多くない!

# 仮引数と実引数
関数の引数という用語は、関数の定義時に宣言する場合と、関数の呼び出し時に指定するものを指す場合の２通りがあります。
両者を明示的に分ける場合、前者を仮引数と言い、後者を実引数と言います。

次の例では、関数の宣言時に宣言しているintが仮引数であり、関数の呼び出し時に指定している1が実引数です。

```
func printInt(_ int: Int) {
    print(int)
}

printInt(1)

```

実行結果

```
1
```

# 外部引数名と内部引数名
引数名は関数の呼び出し時に使用する外部引数名と、関数内で使用される内部引数名の２つを持つことができます。
外部引数名と内部引数名を分けるには、外部引数名 内部引数名:型という形式で引数を定義します。
次の例では、第２引数の外部引数はtoであり、内部引数名はgroupです。

```
func invite(user: String, to group: String) {
    print("\(user) is invite to \(group).")
}

invite(user: "Ishikawa", to: "Soccer Club")

```

実行結果

```
Ishikawa is invite to Soccer Club.
```

第２引数の内部引数名はgroupとなっているてめ、invite(user:to:)関数の中ではgroupという名前で引数を使用できます。
外部引数名には関数を利用する側から見てわかりやすい名前を、内部引数名にはプログラムが冗長にならない名前をつけることが一本的です。

# 外部引数名の省略
外部引数名を省略したい場合には、外部引数名に_を使用します。外部引数名が_で省略されている場合は、引数名と引数を分けている:も省略して呼び出します。

```
func sum(_ int1: Int, _ int2: Int) -> Int {
    return int1 + int2
}

let result = sum(1, 2)
print(result)

```

実行結果

```
1
```

_ を使って外部引数と内部引数を省略できるので、業務ではコードを見やすくするリファクタリングの際に使われる書き方だそう。
Flutterやってたときは、create: (_, model, _)こんなのがあったような?
本来は、create: (context, model, child)と書いていた。
なれないと _ アンダースコアなんでつけるのと混乱してた...
今日ブログを開設しました

2012年からDynamics CRMの開発に携わりました、Dynamics365が近年急速に成長していると感じますが、まだ全然Salesforceに及ばない、今日Dynamics365/PowerAppsに関するブログを開設しました。微力ながら、Dynamics 365/PowerAppsがさらに広がるように努力したいと思います。
【SAP-C01試験対策】AWS 6つのクラウド移行戦略 6R

#はじめに
AWSの移行方式について以下の書籍を参考に学習したので内容をまとめます。

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

#背景
本記事はAWSソリューションアーキテクトプロフェッショナルに合格するために、[Udemyの模擬試験](https://www.udemy.com/course/aws-53225/)を解いて分からなかった部分を勉強してまとめるものです。

試験対策用のため、分からない知識を補足したり試験で問われなさそうなところを省略したりしながらまとめています。
なるべくわかりやすい記載を心がけますが、最終目的は自己学習用であるということをご容赦ください。

#6R

##リホスト
- 「リフト・アンド・シフト」とも呼ばれる。
- アプリケーション自体の修正をしない単純移行
- 大規模な台数を比較的t何時間で移行する。

## リプラットフォーム
- 「リフト・手直し・シフト」とも呼ばれる。
- コア機能の変更はしないが、アーキテクチャの一部（DBをRDSに変更など）をクラウドに最適化する。

## 再購入
- 既存のアーキテクチャを捨て、SaaSなどの代替手段により要件を達成する。

## リファクタリング
- アプリケーションを再設計するとともに、クラウドネイティブな実装に作り替える。

## 廃止
- 不必要な機能を廃止する。

## 保持
- オンプレミスで利用を続ける

# 表にまとめる
|戦略|概要|難易度|
|:--:|:--:|:--:|
|リホスト|変更なしでクラウドへ|低|
|リプラットフォーム|ミドルは変更あり|中|
|再購入|Saasなどへ移行|中|
|リファクタリング|再設計する|高|
|廃止|不要な機能の廃止|-|
|保持|オンプレで継続利用|-|

# ハイブリッドアーキテクチャ
「保持」の場合、オンプレミスとAWSを共存させるハイブリッドアーキテクチャを検討する。

- DirectConnectでシームレスに接続する
- CloudFrontのオリジンサーバにオンプレミスのサーバーを設定する。
- Storage Gatewayを利用してオンプレミス環境のデータのバックアップ先をS3にする
Dockerにroswellをインストールしswankサーバーを起動。EmacsからSLIMEで接続して開発環境を整える話

# はじめに
最近Dockerを勉強してて、Docker上で開発環境ができたらいいなと思いました。
そのようにして開発されてる方は多いのかとは思いますが、私の場合は割とマイナーな開発環境を整えようとしているため、情報が少なく苦戦しております。
とりあえず、なんとかそれらしい環境が作れましたので書いておきます。

# 環境と構成
macOS Mojave
Emacs 26.3
SLIME
Docker
roswell（処理系はsbcl）

macOSにインストールされているGUI版のEmacs上のSLIMEから、Docker上のSWANKサーバーに接続して、sbclでCommonLispを開発します。

# Emacsの環境を整える
Emacsでは次のパッケージを使っています。

+ docker-tramp
+ dockerfile-mode

SLIMEは次のコマンドでインストールします。

```
ros install slime
```

インストール後、.emacsに次の設定を追加します。

```
(load (expand-file-name "~/.roswell/helper.el"))
```

これでSLIMEは使えるようになります。

# Dockerコンテナの起動

まずは次のDockerfileからイメージを作成します。

```dockerfile:Dockerfile
FROM amazonlinux:latest

RUN yum install -y automake libcurl-devel zlib-devel git gcc make bzip2 tar
WORKDIR /root
RUN git clone -b release https://github.com/roswell/roswell.git
WORKDIR /root/roswell
RUN sh bootstrap && ./configure && make && make install && ros setup
CMD [ "ros","run", \
    "-e", "(ql:quickload :swank)", \
    "-e", "(setf swank::*loopback-interface* \"0.0.0.0\")", \
    "-e", "(swank:create-server :dont-close t :style :spawn)"]
```

docker imageコマンドでイメージを作成してもいいですが、dockerfile-modeを入れていると、C-c C-bでDockerイメージを作成できるので楽です。

ここではamazonlinux:roswellという名前でDockerイメージを作成します。

次にDockerコンテナを起動します。

```
docker run -itd --name roswell01 -h roswell01 -p 4005:4005 amazonlinux:roswell
```

# EmacsからDocker上のswankサーバーに接続
次にEmacsからM-x slime-connect で localhost:4005 に対して接続します。
port はデフォルトで 4005 なので、M-x slime-connect RET RET で接続できます。

  
# 参考URL
https://www.common-lisp.net/project/slime/doc/html/Setting-up-the-lisp-image.html
https://blog.3qe.us/entry/2018/06/21/025948
JavaScriptのimportとexportを理解する

JavaScriptのimportとexportを理解するには、前提知識として**モジュール**、**ES Modulus（ESM)**、**CommonJS（CJS）**について知る必要があります。

## モジュール
**ソースコードを機能毎に分割して、メンテナンスしやすくする仕組み**のことです。
モジュールには規格があり、代表的なものに**ES Modulus（ESM)**と**CommonJS（CJS）**が存在します。

## ES Modules(ESM)
**EcmaScriptの仕様に基づくモジュール管理システム**のことです。
importとexportを使って読み込みや露出を行います。ESModulesは主にブラウザ側で使用します。

## CommonJS(CJS)
**Node.js上でモジュールを管理する仕組み**のことです。
requireとexportsを使ってモジュールの読み込みや露出を行います。
Node.jsが開発された際にはJavaScriptをモジュール単位で開発する仕組みがなかったため、CommonJSが開発され、Node.jsでモジュール管理する仕組みが導入されました。


## ES ModulesとCommonJSの違い



例えば、ESモジュールでimportしたものをCJSでrequireしてもエラーになります。モジュールシステムをまたいで使うことはできません。

#### ファイルの拡張子
基本的にどちらもJavaScriptのモジュール管理の仕組みなので、JSという拡張子で問題ありませんが、どちらの仕組みで動いているのか明示的にわかるようにするために分けることがあります。

基本的に、ブラウザ上だけで動かす際にはブラウザはESMのモジュール管理に基づいて動くため、JSという拡張子でいいですが、さまざまなプラットフォーム上で動かしたい場合は、Nodeモジュールのように異なるモジュール管理システムを導入していることがあるので、MJSとして、「これはESモジュールの仕組みで動いています」と明示的に表すこともあります。

前提知識がわかったところで、実際にimportとexportを使っていきます。

## importとexport

前述のように、普段JavaScriptで使っているimportとexportはES Modulesの規格で書かれたものになります。

例として、moduleA.jsでexportして、moduleB.jsでimportする場合を考えてみます。

```moduleA.js
export let publicVal = 0;

export function publicFn() {
  console.log('publicFn called');
}
```


```moduleB.js
import { publicVal, publicFn } from './moduleA.js';

console.log(publicVal);　// 0
publicFn(); // publicFn called

```
moduleAでexportすることによって、moduleBからも同じ関数と変数を扱えるようになります。
また、以下のように「変数名 as 名前」と記載することによって、このファイル内でのみ使用できる任意の名前に変更することができます。

```moduleB.js
import { publicVal as val, publicFn as fn } from './moduleA.js';

console.log(val); // 0
fn(); // publicFn called
```

##asでimportする場合

*asでimportする場合、allModuleAというオブジェクトに対して、moduleAでexportしたものが格納されます。


```moduleA.js
export let publicVal = 0;

export function publicFn() {
  console.log('publicFn called');
}
```

```moduleB.js
import * as allModuleA from './moduleA.js';

console.log(allModuleA); // 
// publicVal: 0
// publicFn:(...)
console.log(allModuleA.publicVal) // 0
```



## export default

export defaultの場合は変数の名前がありません。
例えば、export defaultに0と指定すると、exportされる値は「0」になります。

```moduleA.js
export default 0;
```

importする場合は、{}で括りません。
defaultでexportされたものは自由に名前をつけられます。

```moduleB.js
import defaultVal from './moduleA.js';
console.log(defaultVal); // 0
```
また、default export以外のものと一緒に使いたい場合は、{}の前に、カンマで区切って定義することができます。

```moduleB.js
import defaultVal, { publicVal, publicFn } from './moduleA.js';
```

## CommonJSの規格の場合

commonJS規格のexportsを使った場合には、「exports.名前」となり、esModules規格のimportで読み込むことはできません。

```moduleA.js
exports.publicFn =  function() {
  console.log('publicFn called: ');
}
```


```moduleB.js
import publicFn from './moduleA.js'; // エラー
```


近年はJavaScriptを使ったプロジェクトの規模が大きくなっているので、モジュールを使って必要な機能だけimportとexportをすることでコードをメンテナンスしやすくすることが多いです。

## 参考資料
https://www.udemy.com/course/javascript-essence/
何故この世界は馬鹿で溢れてどうしようもないのか

現在この世界はメタバースだのコンピュータサイエンスだの横文字を並べて射精しているパソコンカタカタ君に占領され、食事は低糖質高タンパクという戯言を合言葉にパサパサした肉や味の薄いドレッシングがかけられた聞いたことねー野菜が持て囃され、連絡ツールはDiscord,Instagram,slackなどヒキニートゲーマー、オシャレボッチ飯クン、社畜が各々の色を出したがる為に統一感が無く、現実を見たくない20代30代のアニメファン達はいつからか異世界転生モノしか見れない鳥頭になってしまったのだ。

何故こんなにも狂った世界になってしまったのか。答えはパソコンカタカタヒョロガリ短小眼鏡クンに何かの間違いで世界の覇権が移ってしまったからである。
これまでの世界の歴史を紐解いてみるといつでも覇権を握っていたのは我々筋骨隆々カリ高日焼けマンだった。
それがITの進歩とかいうオタク革命によりドSマッチョ自民党からマゾオタク民主党に政権が移ってしまったのである。

私から言えることは一つ。オタクに支配は無理。
君たち隠キャ君はトイレでボッチ飯がお似合い。
キミたちの短小チンチンでは集合体のニーズというポルチオに到達することは出来ない。

君たちには君たちが作ったVRの世界をそっくりそのままくれてやろう。もう現実世界には帰ってこなくてよろしい。
悪いことは言わないからSEXは我々に任せて大人しくVRという名の食堂の隅の席の世界で遊戯王やヴァイスシュヴァルツに興じていなさい。


追記(2025/02/27)
プログラミングに関係ないとのことで不当に言論の自由が侵害される為、プログラミングについて述べます。
javaから学ぶといいと思います
Playground環境でUIBezierPathを触ってみる

## 概要
XcodeのPlayground環境を使えば、`UIBezierPath`を使った開発が捗りました。
共有します。

## 環境
`macOS Big Sur 11.6`
`Xcode 13.1`

## 手順
ざっくり次のような感じです。
1. `PlaygroundSupport`をインポートする
2. 図形を描画するためのViewを実装する
3. Viewをプレビューできるように設定する

### 1. `PlaygroundSupport`をインポートする
`PlaygroundSupport`をインポートしてください。

```swift:MyPlayground
import PlaygroundSupport
```

### 2. 図形を描画するためのViewを実装する
`UIView`を継承した`CustomView`を作成します。
`draw(_:)`メソッドで図形を描画する処理を記述します。

```swift:MyPlayground
override func draw(_ rect: CGRect) {
    let rect = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 200, height: 100), byRoundingCorners: .bottomRight, cornerRadii: CGSize(width: 10, height: 10))
    UIColor.link.setStroke()
    rect.lineWidth = 4    
    rect.stroke()
}
```

### 3. Viewをプレビューできるように設定する
`PlaygroundPage`の`liveView`というプロパティにカスタムViewのインスタンスを設定します。

```swift:MyPlayground
let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
customView.backgroundColor = .white
PlaygroundPage.current.liveView = customView

```

全体のコードはこちらです。

```swift:MyPlayground
import UIKit
import PlaygroundSupport

class CustomView: UIView {
    override func draw(_ rect: CGRect) {
        radiusRect()
    }
    
    private func radiusRect() {
        let rect = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 200, height: 100), byRoundingCorners: .bottomRight, cornerRadii: CGSize(width: 10, height: 10))
        UIColor.link.setStroke()
        rect.lineWidth = 4
        rect.stroke()
    }
}

let customView = CustomView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
customView.backgroundColor = .white
PlaygroundPage.current.liveView = customView
```

画像のようにプレビューできると思います。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551042/b6643817-5c1f-f8ab-15f0-db9cd329049c.png" width="300" />
統計検定1級を目指す理由を考えてみた

本日統計検定1級を受けてきます。
その前になぜ自分がこの資格を目指すのかを改めて考えてみました。なお、私は数年前に統計検定2級に合格しています。


# 統計に関する知識が増える
言わずもがな。


# 思考力が磨かれる
2級だと類型問題を大量に解いて、公式を暗記すれば行けます。統計検定1級レベルだと基本的にはそうは行きません。
もちろん積分ゲーみたいな問題もあるのは事実ですが。


# 統計に関する専門的な書籍や論文を読む基礎体力がつく
自然科学は知識の積み上げで成立しているので、知識が無いとある物事を知るためにその前提知識を調べ、更にその、、、という絶え間ない出戻りが発生します。1級合格したら、完璧な知識がつくとは思えませんが、そういった出戻りの回数や量は減ると考えます。


# ある程度の応用力が身につく
冒頭と被りますが、統計の知識の引き出しが増えるので、課題解決の為に自分が知ってたり得意なアプローチに固執するんじゃなくて、（あくまで統計が扱える範囲で）これまでよりも多面的なアプローチができるようになると考えます。


# 一目置かれそう
知らんけど。


# 最後に
私はマラソン（ベストは3時間20分です）を趣味にしておりまして、それで例えますと資格は筋トレみたいなものだと常々思っています。筋トレしてなくても走れます。でも走り続けると、足だけじゃなくて体幹部分の腹筋や背筋、腕なんかも疲れてきます。そうした自分の弱い所を補うために、筋トレは有効です。統計検定について言えば、筋トレメニューのフルコースみたいなもんで、これができたからといって速く走れる訳ではないです。走り込み（実戦経験）が最も重要なのは事実です。ただ、走り込みに加えて、筋トレを続けた先にはこれまでよりも理想的なフォームで気持ちよく走れるようになっている未来が確実に待っています。
私はよく資格を取るんですが、たまに周囲の人から理由を聞かれたりするので、自分の考えをつらつらと書いてみました（理由になってるかな笑）。そもそもなぜ走るのかマラソンをするのかという（心無い）質問もされるんですが、その理由については本筋からは外れるんでやめておきます。

※もちろんトッププロで筋トレが嫌いで筋トレはあまりせずに日頃の走り込みや大会出場を通じて一線で活躍されている選手がいるという話しも聞いたことはあります。

言い訳なんですが、kaggleやGCPの勉強にも時間を割いてしまい、勉強時間があまり取れませんでしたので、受かる自信は正直あまりありません。ただ、少なくとも勉強した範囲の設問は奪取してくるつもりで挑んで行きます。

# 追記　受験後の感想
- 過去問はやらなくてよいヨ（実際やってない）
- 統計数理はいろいろ問題解く前に最低限定義は押さえとくと良いヨ。でないと積むヨ。逆にそれができてるとかなり楽になるヨ
- 統計応用は誘導が丁寧だから、その場のノリでなんとかなるゾ。思考力を積むために、いろんな問題解いたりするのはアリだが必須じゃないヨ
- 会場が大学の場合は、コロナの影響で入口1つに制限してるから、早めに行っとくと良いヨ。最悪、半周することになるゾ
最大値を求める関数

##概要
最大値を求める関数をつくってみた

##手順
1.まずは配列でいくつかの数値を取得

```
arr = [3, 4, 5, 6, 7]
```

2.メソッドの中身

```
def saidai(arr)
  a = arr[0]
  arr.each do |i|
    if a < i
      a = i
    end
  end
    return a
end
```
####解説
・「a」という変数にarr[0]を定義する。
・先ほど取得した配列を１つずつチェックしていく。
・一つずつの要素（i）がaよりも大きかったら
　新しくa上書きしていく。
```
return a
```
で返り値は最後に上書きされたaの値になる。
SwiftUIでUIKitのビューの装飾をするためにUIAppearanceを使うのは間違っている

SwiftUIはツールバーの背景色を変えることができません。
この問題に対応するために、`UIAppearance `を利用する記事が散見されます。
実際、次のようなコードを書くことでTabViewの背景色を変えることができます。

```swift
struct ContentView: View {
    var body: some View {
        NavigationView {
            Text("button")
            .toolbar {
                ToolbarItem(placement: .bottomBar){
                    Text("Item")
                }
            }
        }
        .onAppear {
            UIToolbar.appearance().backgroundColor = UIColor.blue
        }
    }
}
```

![CleanShot 2021-11-21 at 04.30.33@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/4ad908f6-f365-7a06-395e-7012297b2588.png)

しかし、この手法を利用することはオススメしません。
UIAppearanceは指定したクラスのアプリ全体の装飾を変えるメソッドのため、意図しない画面を侵食する可能性があるためです。

実際に、このまま次のViewControllerを表示してみましょう。

```swift
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .lightGray
        navigationController?.setToolbarHidden(false, animated: false)
        setToolbarItems([.init(title: "Button", style: .done, target: nil, action: nil)], animated: false)
    }
}
```


![CleanShot 2021-11-21 at 04.33.18@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24979/476a5fcc-fc52-785e-3747-67afd3437734.png)

ViewControllerのtoolbarは色の指定が無いにも関わらず、背景色が変更されています。
このように、UIAppearanceを使うことで目的と違う画面のUI装飾を変えてしまいました。

これは、**たった１画面のUI装飾を変えるためにアプリケーション全体で使われるUIを網羅的に検査し、漏れなく装飾の適用を打ち消す処理を書く**必要があるともいえます。

自分の書くUIならともかく、サードパーティなどの修正不可な箇所にも影響が出る可能性はあります。
そういうことです。
MacでISOファイルをUSBメモリに書き込む最適解を見つけた

# LinuxのイメージファイルをUSBメモリに書き込もうと思ったけど...
MacにはISOファイルをUSBメモリに書き込むソフトが搭載されていません。

## ターミナルを使えばいいじゃんって思った?
確かにそうです。
ただ、**USBメモリをマウント→ISOファイルを書き込み**
これらの一連の流れをコマンドで行うのは、割と面倒です。
USBメモリへの書き込み状況も表示されないので、あとどれくらいで書き込みが終わるか分かりません。
USBメモリに書き込めるGUIのアプリがあればQOLが上がる気がするんだけどなあ。
## そんなアプリがFedoraから提供されていた
その名も**Fedora Media Writer**
FedoraOSを書き込むためのアプリですが、カスタムISOファイルも書き込むことができます。
試しにRHELのイメージファイルを書き込んでみましたが、無事に書き込むことができました。
UIも良く、Mac&Windowsに対応しているのでISOファイル書き込みアプリはこれさえあればOKだと思います。

## Fedora Media Writerの使い方
こちらのURLからFedoraMediaWriterをダウンロードすることができます。
[FedoraMediaWriter](https://getfedora.org/ja/workstation/download/)

アプリはこんな感じで、CustomImageをクリックすると自分の好きなISOファイルを書き込むことができます。
![fmw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145857/4509670c-502c-3750-ffe7-e9676ab7de3b.png)


**これからはFedoraMediaWriterを使っていこう！**
【Gatsby】MDXにむりやりスタイルを付ける

以下はmdx。jsxで記述した箇所にスタイルを充てるのは簡単だけど、「# Header」の箇所にスタイルを充てるのはなんか色々設定する必要がある。

```md
---
title: "Second Post"
date: "2021-07-25"
---

import "./style.css"


# Header1

<div style={{ padding: "10px 30px", backgroundColor: "tomato" }}>
    <h2>Try making this heading have the color tomato</h2>
</div>
```

F12で見てみると、「# Header」の箇所には、id="Header"がついているので、cssでそこにスタイルを付けられる。

```css
#Header{
  background-color:red;
}
```
vis エディターにプラグインを設定する。


#vis エディターにプラグインをインストールする。

## vis-editor

https://github.com/martanne/vis

<a href="https://martanne.github.io/vis/man/vis.1.html">vis manual</a>

libera IRC #vis-editor

https://www.youtube.com/watch?app=desktop&v=y41MyOrPt8Q

インストールするプラグインは、Lua にコンパイルする言語 [fennel](https://www.mankier.com/1/fennel) のシンタックスハイライトなどの機能がある vis-parlour 。

https://repo.or.cz/vis-parkour.git

---

vis エディター自体は、apt などのパッケージマネージャーで探して、インストールできるならばインストールする。

```terminal
vis -v
vis v0.7 +curses +lua
```

## プラグインのインストール。

### 1) 
`~/.config`のディレクトリへ `/vis/vis-parkour`をつくって、git clone 先に指定して git clone する。

```terminal
git clone https://repo.or.cz/vis-parkour.git "$HOME/.config/vis/vis-parkour"
```

### 2) 
`~/.config/vis` に visrc.lua というファイルを用意して

```terminal
cd .config
cd vis
vim visrc.lua
```

設定を記述する。vim の設定のような感じで、Lua で記述する。

```vim:visrc.lua
local pk = require'vis-parkour'

-- optional:
pk.auto_square_brackets = true
pk.lispwords.scheme.lambda = 0
pk.repl_fifo = os.getenv('HOME')..'/.repl_fifo'
pk.emacs = false
pk.autoselect = true
```

ファイル構成は、このようになっている。

```
/home/.config/vis
.
├── vis-parkour
│   ├── README.md
│   ├── init.lua
│   ├── keytheme
│   │   ├── emacs.lua
│   │   └── vim.lua
│   └── parkour
│       ├── README.md
│       ├── edit.lua
│       ├── fmt
│       │   ├── clojure
│       │   │   ├── init.lua
│       │   │   ├── lispwords.lua
│       │   │   └── squarewords.lua
│       │   ├── common.lua
│       │   ├── fennel
│       │   │   ├── init.lua
│       │   │   ├── lispwords.lua
│       │   │   └── squarewords.lua
│       │   ├── lisp
│       │   │   ├── init.lua
│       │   │   └── lispwords.lua
│       │   └── scheme
│       │       ├── init.lua
│       │       ├── lispwords.lua
│       │       └── squarewords.lua
│       ├── init.lua
│       ├── input.lua
│       ├── node.lua
│       ├── parser
│       │   ├── clojure
│       │   │   └── init.lua
│       │   ├── fennel
│       │   │   └── init.lua
│       │   ├── init.lua
│       │   ├── lisp
│       │   │   └── init.lua
│       │   └── scheme
│       │       └── init.lua
│       └── walker.lua
└── visrc.lua
```
WinUI3で開発したアプリのインストール戦略 (Windows App SDK)

WinUI3アプリは3つの実装から選択できます。

|#| アプリ種別 | パッケージ | 実行環境 |
|:-:|:-----------:|:------------:|:------------:|
|1| UWP | packaged　| サンドボックス内 |
|2| Desktop | packaged　| サンドボックス内 |
|3| Desktop | unpackaged | サンドボックス外 |

\#1と#2はMicrosoft Storeから提供する方式になり、Storeにアプリをアップロードして、ユーザーはアプリを自動更新できます。

\#3は要するに従来のWin32アプリや.NET Frameworkアプリと同じで、自分でインストーラーなどを製作して、オフラインでインストールする形になります。

# パッケージ・アプリ

パッケージアプリはexeを直接実行することができません。基本的にはアプリをStoreからインストールします。Storeから配布するにはアプリを署名しないといけません。

署名をしない場合、オレオレ署名を付けることで、ローカルからインストールできます。ただしWindowsの開発者モードを有効にしなければなりません。またmsix単体をダブルクリックしても依存ファイルは自動的にインストールされず、Publishが生成するファイル群の中にあるinstall.ps1を実行してもらうことになります。

# アンパッケージ・アプリ

\#3のアンパッケージアプリでは、署名が不要で、exeを直接実行でき、従来と同じように配布できます。Storeからの自動アップデートは利用できません。クローズドなアプリを作っている人はこちらのほうが都合がよいでしょう。

Windows App SDKがVSで提供するテンプレートは#1と#2だけです(SDK 1.0現在)。#3は、一旦#2を作ってから、ちょっと細工をして#3にするという流れになります。

https://www.ipentec.com/document/csharp-winui3-create-unpackaged-desktop-application

具体的な方法はこちらのPentaさんの記事が詳しいです。要約すると、プロジェクトファイルのPropertyGroupに`<WindowsPackageType>None</WindowsPackageType>`を追加して、`Package.appxmanifest`ファイルを削除する(またはパッケージ化のプロジェクトを削除する)という流れになります。

ランタイムのインストールを忘れないようにしてください。通常はSDKをインストールするとランタイムもついてくるのが常識ですが、unpackagedでは別途ランタイムをインストールしないと、デバッグもできません。

アプリがアンパッケージになると、従来通りReleaseやDebugのフォルダに実行ファイルが展開されます。exeを実行するとこれまでどおり普通に起動します。

なおSDK 1.1からはXCopyデプロイメントが可能になるそうです。これでインストーラーを作らなくても済むようになるのでしょうか。