OmniAICreator/Qiita-1.07M huggingface dataset:
Power Query へそのゴマ　100本ノック　６

**51. コード補完問題**  
"Data"テーブルに"IsExpensive"列を追加し、"Price" > 100ならtrue、そうでなければfalseを返す。  
```m
let
    Source = Data,
    Added = Table.AddColumn(Source, "IsExpensive", each if [Price] > 100 then true else ___),
    Result = Added
in
    Result
```

-------------------------------------
**52. 5択問題**  
M言語で論理AND演算子はどれか？  
A. &&  
B. AND  
C. and  
D. &  
E. ||

-------------------------------------
**53. コード補完問題**  
"Data"テーブルで"Name"列を大文字化するには `Text.Upper([Name])` を使う。  
```m
let
    Source = Data,
    UpperCase = Table.TransformColumns(Source, {{"Name", each Text.___([Name])}}),
    Result = UpperCase
in
    Result
```

-------------------------------------
**54. 5択問題**  
`Table.RemoveColumns`関数の第2引数には何を渡すか？  
A. 列を変換する関数  
B. 列名のリスト  
C. 列のフィルタ条件  
D. 削除する行番号  
E. 新規列名

-------------------------------------
**55. コード補完問題**  
"Data"テーブルを"Category"列でグループ化し、"Amount"列の合計を計算するには  
`Table.Group(Data, {"Category"}, {{"TotalAmount", each List.Sum([___]), type number}})` を使う。  
```m
let
    Source = Data,
    Grouped = Table.Group(Source, {"Category"}, {{"TotalAmount", each List.Sum([___]), type number}}),
    Result = Grouped
in
    Result
```

-------------------------------------
**56. 5択問題**  
M言語でリストを逆順にする関数はどれか？  
A. List.Sort  
B. List.Reverse  
C. List.Flip  
D. List.Rotate  
E. List.Invert

-------------------------------------
**57. コード補完問題**  
"Data"テーブルで、"Date"列が`#date(2021,12,31)`より後の日付のみを抽出するには`[Date] > #date(2021,12,31)`を条件に使う。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each [Date] > #date(___,12,31)),
    Result = Filtered
in
    Result
```

-------------------------------------
**58. 5択問題**  
`Number.Abs(-10)`の結果は？  
A. -10  
B. 10  
C. 0  
D. null  
E. エラー

-------------------------------------
**59. コード補完問題**  
"Data"テーブルに "Year" 列を追加し、Date.Year([OrderDate])で年を取得する。  
```m
let
    Source = Data,
    Added = Table.AddColumn(Source, "Year", each Date.Year([___])),
    Result = Added
in
    Result
```

-------------------------------------
**60. 5択問題**  
`#shared`とは何か？  
A. 現在のM環境で利用可能な関数、定数、値を含むレコード  
B. 共有ネットワークドライブへの参照  
C. Power BI内でのデータ共有設定  
D. 外部ファイルへの参照リスト  
E. クエリを共同編集するための関数
サーバレス導入時の考慮点あれこれ。

## はじめに

下記記事の続き。

サーバレスは銀の弾丸ではないので、考慮すべき点を少しまとめた記事。

https://qiita.com/s_moriyama/items/04c66440fd53fb5d9529

## サーバレスの導入時の考慮点

### 1.コールドスタート問題

一定時間アクセスがない関数は`コールドスタート`状態となり、最初の実行時に起動時間が長くなります。

### 2.ベンダーロックイン

特定のクラウドプロバイダーの仕様に従った実装だと、今後プロバイダー間での移行が困難になる場合があります。

急に経営層が、「AWSでいいんだっけ？」みたいなことを言い出したりすることも。

### 3.コスト管理の複雑さ

従量課金制のため、トラフィックが予測困難な場合、コストの見積もりが難しくなります。

以下のようなケースで、予期せぬ高額請求が発生するリスクもあります。

* 予期せぬ大量のリクエストが発生した
* 開発者が意識せずに大量にリソース消費した
* 無限ループなどの不具合が発生した

### 4.各種リソースの制限

メモリやCPU、実行時間などのリソース使用量に制限があります。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstart

実行時間で見てみると、各CSPごとに以下のような感じでした。
（AIに聞いてます）

>AWS Lambda:
>
>同期実行: 最大15分 (900秒)
>非同期実行: 最大15分 (900秒)
>
>Google Cloud Functions:
>
>1世代 (1st gen): 最大9分 (540秒)
>2世代 (2nd gen): 最大60分 (3,600秒)
>
>Azure Functions:
>
>消費プラン: 最大10分 (600秒)
>プレミアムプラン: 最大60分 (3,600秒)
>専用プラン: 最大無制限
>
>Cloudflare Workers:
>
>無料プラン: 最大10ミリ秒
>有料プラン: 最大30秒

AWSしか知らなかったので、少しびっくりしましたが、他のCSPは60分とか無制限とか、かなり長く設定できるんだなぁ。

その他Lambdaの場合、メモリは128MB〜10GBのメモリを選択可能。
ディスク容量も`/tmp`は512MBの制限。

特定の分野における大規模な計算処理や大量のメモリを必要とする処理には適してはいません。

### 5.状態管理の複雑さ

サーバレスで構築する場合、ステートレスに構築していくことになりそうですが、状態の保持が必要になった場合、追加の対応が必要です。

## 対処法

### 1.コールドスタート問題

この問題が顕著に現れるのは、Java（特にSpring Boot）や.netなど起動に時間がかかる言語。

まずは、軽量な言語やフレームワークの選定をするのが良いと思います。

メンバーのスキルセットでJavaしかできない！みたいなことも多くあるのですが、Lamdbaだと、`snap start`という高速化技術があります！

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/snapstart.html

あとシステム提供側が一定周期でサービスを叩く、ウォームアップリクエストの実装も有効みたいです。

ウォームアップリクエストを何分周期で実施すべきかは、別記事で調べてみたいと思います。

### 2.ベンダーロックイン

AWSのホワイトペーパーがとても参考になりました。

https://aws.amazon.com/jp/blogs/news/unpicking-vendor-lock-in/

このホワイトペーパーでは対処法として、以下を挙げています。

* データ移行サービスの利用
* コンテナ技術の利用
* VMware on AWS
* DevOpsツール

ただし、AWSでは、「選択の自由はお客様にある」としていて、お客様がいつでも任意の別のベンダーに変更することができる各種ツールやサービスを提供しているとのことです。

またロックインを考える時は移行コスト（スイッチングコスト）も併せて考えるべきだとしています。

例えば、JavaからNodeJSへの移行は、単純に移行コスト（スイッチングコスト）が発生しているのみで、ロックインではない、としています。
何か特定の技術を選んだ時点で、移行コスト（スイッチングコスト）はかならず発生します。

長期の契約などで変更ができない、極端に移行が困難となるような仕組みになっている。みたいな状況をロックインと呼ぶべきなのかもです。

CSP含む技術選定の際には、技術面・契約面の両面でロックインが生じないように、移行コスト（スイッチングコスト）を評価することも重要です。

### 3.コスト管理の複雑さ

コストのモニタリングをするべきです。

見積もり時に決めた予算の閾値を超えた、とか普段はないコストの上昇があったなどにアラートが上がる仕組みを設けると良いと思います。

AWSでは、AWS Budgetsで予算管理できます。

https://aws.amazon.com/jp/aws-cost-management/aws-budgets/

日々のコストをモニタリングしたい場合は、以前紹介したこんな仕組みも良いかもです！

https://qiita.com/s_moriyama/items/995d271772c0d3093a20

### 4.各種リソースの制限

非同期処理や、ステートマシンを活用していくのが良いと思います。

また、FaaS系サービスではなく、コンテナサービスへの移行なんかも場合によっては良いかもです。

AWSで言うと、15分未満で済むバッチはLambdaを使い、それを超える場合は、ECS Scheduled Tasksを使うなどの手法がありそうです。

### 5.状態管理の複雑さ

DynamoDB等の永続化ストア、Step Functionsを使ったステートマシンの活用がありそうです。

またAIに聞いて初めて知りましたが、イベントソーシングパターンの導入なんかも良いと思います。
一連のイベントを全て永続化しておくことで、任意の時点におけるアプリケーションの状態を特定することもできそうです。

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/modernization-data-persistence/service-per-team.html

## 最後に！

この記事、色々調べることがあってかなり時間かかってしまいました。

強みも弱みも知った上で利用するのが一番ですね！
Power Query へそのゴマ　100本ノック　５

**41. コード補完問題**  
"Data"テーブルで"OldPrice"列を"NewPrice"列名に変更するために `Table.RenameColumns(Source, {{"OldPrice","___"}})` を使用する。  
```m
let
    Source = Data,
    Renamed = Table.RenameColumns(Source, {{"OldPrice","___"}}),
    Result = Renamed
in
    Result
```

-------------------------------------
**42. 5択問題**  
`#"Step Name"`のような表記は、M言語で何を表しているか？  
A. ステップ名に空白や特殊文字が含まれる場合のリテラル表記  
B. コメント行  
C. 文字列の結合  
D. テーブルの列名エイリアス  
E. 数値型リテラル

-------------------------------------
**43. コード補完問題**  
`Table.ReorderColumns`を用いて列順序を変更するとき、列の新しい順序を`{ "Col1", "Col2", "Col3" }`のような`___`で指定する。  
```m
let
    Source = Data,
    Reordered = Table.ReorderColumns(Source, ___),
    Result = Reordered
in
    Result
```

-------------------------------------
**44. 5択問題**  
M言語でテキストを大文字に変換する関数はどれか？  
A. Text.Upper  
B. Text.Capitalize  
C. Text.Title  
D. Text.Proper  
E. Text.ToUpper

(注: 実際の関数名は `Text.Upper` であるため、"Text.ToUpper"は存在しない)

-------------------------------------
**45. コード補完問題**  
"Data"テーブルで"ID"列がリスト{1,3,5}に含まれる行を選択する条件として `List.Contains({1,3,5}, [___])` を使え。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each List.Contains({1,3,5}, [___])),
    Result = Filtered
in
    Result
```

-------------------------------------
**46. 5択問題**  
`Table.FillDown`関数は何を行うか？  
A. 上のセルから下方向へ値を埋める  
B. 下のセルから上方向へ値を埋める  
C. 左のセルから右方向へ値を埋める  
D. 右のセルから左方向へ値を埋める  
E. 空白セルをnull値に置き換える

-------------------------------------
**47. コード補完問題**  
"Data"テーブルの全列をテキスト型に変更するには `Table.TransformColumnTypes(Source, List.Transform(Table.ColumnNames(Source), each {_, ___}))` を使う。  
テキスト型を表す `type text` を補完せよ。  
```m
let
    Source = Data,
    Transformed = Table.TransformColumnTypes(Source, List.Transform(Table.ColumnNames(Source), each {_, type ___})),
    Result = Transformed
in
    Result
```

-------------------------------------
**48. 5択問題**  
`Record.ToTable`は何を行うか？  
A. レコードをテーブルに変換  
B. テーブルをレコードに変換  
C. リストをテーブルに変換  
D. レコードをリストに変換  
E. テキストをテーブルに変換

-------------------------------------
**49. コード補完問題**  
"Data"テーブルから、行インデックス1の行を取得するには`Table.Row(Source, ___)`を使用する。  
```m
let
    Source = Data,
    Row = Table.Row(Source, ___),
    Result = Row
in
    Result
```
(ヒント: インデックスは0から開始)

-------------------------------------
**50. 5択問題**  
`Text.Split("A,B,C", ",")`の結果は何か？  
A. {"A,B,C"}  
B. {"A","B","C"}  
C. ["A","B","C"]  
D. ("A","B","C")  
E. {{"A","B","C"}}
Power Query へそのゴマ　100本ノック　４

**31. コード補完問題**  
テーブル"Data"の行数を取得するには`Table.RowCount(___)` を使用する。`___`を補完せよ。  
```m
let
    Source = Data,
    RowCount = Table.RowCount(___),
    Result = RowCount
in
    Result
```

-------------------------------------
**32. 5択問題**  
`Record.Field`関数は何を行うか？  
A. レコードから指定したフィールドの値を取り出す  
B. テーブルから指定した列を取り出す  
C. リストから指定したインデックスの値を取り出す  
D. レコードに新規フィールドを追加する  
E. レコードからフィールドを削除する

-------------------------------------
**33. コード補完問題**  
"Data"テーブルで"Quantity"列が20より大きい場合は"High"、そうでなければ"Low"とする列"Level"を追加せよ。  
```m
let
    Source = Data,
    Added = Table.AddColumn(Source, "Level", each if [Quantity] > 20 then "High" else "___"),
    Result = Added
in
    Result
```

-------------------------------------
**34. 5択問題**  
`List.Contains`関数で`List.Contains({1,2,3},2)`は何を返すか？  
A. 1  
B. 2  
C. true  
D. false  
E. null

-------------------------------------
**35. コード補完問題**  
"Data"テーブルから重複した行を削除するには`Table.Distinct(___)`を使う。  
```m
let
    Source = Data,
    DistinctRows = Table.Distinct(___),
    Result = DistinctRows
in
    Result
```

-------------------------------------
**36. 5択問題**  
`Table.AddIndexColumn`関数は何を行うか？  
A. テーブルに順序インデックス列を追加する  
B. テーブルをインデックス番号で並び替える  
C. インデックス列を削除する  
D. インデックス列のみ抽出する  
E. テーブルをJSON形式で出力する

-------------------------------------
**37. コード補完問題**  
"Data"テーブルで、"Name"列が"A"で始まる行のみ抽出するには`Text.StartsWith([Name],"A")`を条件に使う。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each Text.StartsWith([___],"A")),
    Result = Filtered
in
    Result
```

-------------------------------------
**38. 5択問題**  
M言語でリストの要素数を求める関数はどれか？  
A. List.Count  
B. List.Length  
C. List.Size  
D. List.Number  
E. List.Rows

-------------------------------------
**39. コード補完問題**  
"Data"テーブルで"Date"列が特定の日付#date(2020,1,1)と等しい行を選択する。`___`を補完せよ。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each [Date] = #date(___,1,1)),
    Result = Filtered
in
    Result
```

-------------------------------------
**40. 5択問題**  
次の中で、M言語で日時型を表す型はどれか？  
A. type datetime  
B. type date  
C. type time  
D. type datetimezone  
E. type duration
Power Query へそのゴマ　100本ノック　３

**21. コード補完問題**  
"Data"テーブルから"Category"列の値のリストを取得したい。`___`を補完せよ。  
```m
let
    Source = Data,
    CategoryList = Table.Column(Source, "___"),
    Result = CategoryList
in
    Result
```

-------------------------------------
**22. 5択問題**  
"列のピボット解除"を行うための関数はどれか？  
A. Table.Pivot  
B. Table.UnpivotOtherColumns  
C. Table.UnpivotColumns  
D. Table.Transpose  
E. Table.ExpandTableColumn

-------------------------------------
**23. コード補完問題**  
"Data"テーブルを"Date"列で昇順ソートするために、`Table.Sort(Data,{{"Date", ___}})` の `___` を補完せよ（昇順を表す値）。  
```m
let
    Source = Data,
    Sorted = Table.Sort(Source, {{"Date", ___}}),
    Result = Sorted
in
    Result
```

-------------------------------------
**24. 5択問題**  
`DateTime.LocalNow()`が返すのは何か？  
A. 現在の日付のみ  
B. 現在の時刻のみ（UTC）  
C. 現在の日付と時刻（ローカルタイム）  
D. 今日の午前0時  
E. Excelシリアル値形式の日付

-------------------------------------
**25. コード補完問題**  
`Table.TransformColumns`を用いて"Price"列を10%割引した値で変換したい。割引後の式 `[Price] * 0.9` を使い、`___`を補完せよ。  
```m
let
    Source = Data,
    Transformed = Table.TransformColumns(Source, {{"Price", each ___}}),
    Result = Transformed
in
    Result
```

-------------------------------------
**26. 5択問題**  
`Table.ToList`関数は、テーブルをどのように変換するか？  
A. テーブルを縦方向に連結したリストに変換  
B. テーブルのすべての列を連結したリストに変換  
C. 単一列テーブルをリストに変換  
D. テーブルをキーと値のペアのリストに変換  
E. テーブルを階層構造のリストに変換

-------------------------------------
**27. コード補完問題**  
"Data"テーブルに新たな列"FullName"を追加し、"FirstName"と"LastName"列を結合せよ。`___`を補完せよ。  
```m
let
    Source = Data,
    Added = Table.AddColumn(Source, "FullName", each [FirstName] & " " & [___]),
    Result = Added
in
    Result
```

-------------------------------------
**28. 5択問題**  
M言語で条件分岐を行う関数的構造は次のうちどれか？  
A. select ... case  
B. if ... then ... else  
C. switch ... case  
D. when ... do  
E. choose ... option

-------------------------------------
**29. コード補完問題**  
"Data"テーブルで数値列"Score"を丸めるために`Number.Round([Score], 0)`を使う。コード補完せよ。  
```m
let
    Source = Data,
    Rounded = Table.TransformColumns(Source, {{"Score", each Number.___([Score],0)}}),
    Result = Rounded
in
    Result
```

-------------------------------------
**30. 5択問題**  
M言語で日付部分を抽出するための関数はどれか？  
A. Time.Day  
B. Date.MonthName  
C. Date.Day  
D. Duration.Days  
E. DateTime.Year
Power Query へそのゴマ　100本ノック　２

**11. コード補完問題**  
次のコードは、"Data"テーブルで"Quantity"列が null の行を削除する。`___`を補完せよ。  
```m
let
    Source = Data,
    RemovedNulls = Table.SelectRows(Source, each ___([Quantity])),
    Result = RemovedNulls
in
    Result
```
(ヒント: nullでないことをチェックするには `<> null` を使用)

-------------------------------------
**12. 5択問題**  
`Table.Combine`関数の目的は何か？  
A. テーブルを列方向に展開する  
B. 複数のテーブルを1つのテーブルに結合する  
C. テーブルをJSON形式に変換する  
D. テーブルをトランスポーズする  
E. テーブルを行方向に分割する

-------------------------------------
**13. コード補完問題**  
"Data"テーブルから"Product"列のみを残すコードで、`___`を補完せよ。  
```m
let
    Source = Data,
    Selected = Table.SelectColumns(Source, {"___"}),
    Result = Selected
in
    Result
```

-------------------------------------
**14. 5択問題**  
`Table.Sort`関数の第2引数には何を指定するか？  
A. ソートキーとソート順を含むリスト  
B. テーブル名  
C. カラムを追加する関数  
D. セルのフォーマット条件  
E. 行数制限値

-------------------------------------
**15. コード補完問題**  
以下のコードは、"Data"テーブルの"Date"列を年・月・日列に分割するための例である。`___`を補完せよ。  
```m
let
    Source = Data,
    YearColumn = Table.AddColumn(Source, "Year", each Date.Year([Date])),
    MonthColumn = Table.AddColumn(YearColumn, "Month", each Date.___([Date])),
    DayColumn = Table.AddColumn(MonthColumn, "Day", each Date.Day([Date])),
    Result = DayColumn
in
    Result
```

-------------------------------------
**16. 5択問題**  
M 言語でコメントを表す記号はどれか？  
A. //  
B. #  
C. --  
D. /* */  
E. ' (アポストロフィ)

-------------------------------------
**17. コード補完問題**  
"Data"テーブルに、"UnitPrice" と "Quantity" 列を掛け合わせた "Total" 列を追加せよ。  
```m
let
    Source = Data,
    Added = Table.AddColumn(Source, "Total", each [UnitPrice] * [___]),
    Result = Added
in
    Result
```

-------------------------------------
**18. 5択問題**  
`Table.TransformColumnTypes`関数は何を行うか？  
A. テーブルをグループ化する  
B. 指定した列の値を変換する  
C. 指定した列のデータ型を変更する  
D. 列名を変更する  
E. テーブルを他のクエリと結合する

-------------------------------------
**19. コード補完問題**  
`Table.SelectRows`で、"Sales"列が50以下の行を抽出する条件式`[Sales] <= ___`を完成させよ。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each [Sales] <= ___),
    Result = Filtered
in
    Result
```

-------------------------------------
**20. 5択問題**  
M言語でリストを作成する場合の記号はどれか？  
A. ()  
B. {}  
C. []  
D. ""  
E. <>
Power Query へそのゴマ　100本ノック　１

**1. コード補完問題**  
次のMコードは、"Data"という名前のテーブルから"Sales"列が100以上の行のみを抽出するコード例である。`___`を補完せよ。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each [Sales] >= ___),
    Result = Filtered
in
    Result
```

-------------------------------------
**2. 5択問題**  
以下のコードは列リネームに関する操作を行う場合の一例である。空欄に最も適した関数はどれか？  
```m
Table.________(Table.FromRecords({[OldName="A", Value=1]}), {{"OldName","NewName"}})
```
A. Table.TransformColumns  
B. Table.PromoteHeaders  
C. Table.RenameColumns  
D. Table.SelectColumns  
E. Table.AddColumn

-------------------------------------
**3. コード補完問題**  
次のMコードは、"Data"テーブルから"Category"列が"Food"の行のみを抽出する。`___`を補完せよ。  
```m
let
    Source = Data,
    Filtered = Table.SelectRows(Source, each [Category] = "___"),
    Result = Filtered
in
    Result
```

-------------------------------------
**4. 5択問題**  
`Table.AddColumn`関数で新規列を追加する場合、引数は以下の順序で指定する必要がある。正しい順序はどれか？  
A. (table as table, newColumnName as text, columnGenerator as function) as table  
B. (newColumnName as text, table as table, columnGenerator as function) as table  
C. (table as table, columnGenerator as function, newColumnName as text) as table  
D. (columnGenerator as function, table as table, newColumnName as text) as table  
E. (table as table, newColumnName as text, columnGenerator as text) as table

-------------------------------------
**5. コード補完問題**  
次のコードはテーブル"Data"に対し、"Price"列を2倍にした列"DoublePrice"を追加する。`___`を補完せよ。  
```m
let
    Source = Data,
    Added = Table.AddColumn(Source, "DoublePrice", each [Price] * ___),
    Result = Added
in
    Result
```

-------------------------------------
**6. 5択問題**  
`Table.ColumnNames`関数は何を返すか？  
A. テーブル内の行数  
B. テーブル内の列数  
C. テーブル内の列名のリスト  
D. テーブル内の列型のリスト  
E. テーブル全体を再計算した結果

-------------------------------------
**7. コード補完問題**  
"Data"テーブルから"Date"列を変換し、"Year"列を抽出して新しいテーブルを得る。  
`___`に適切なDate関数を補完せよ（年を取得できる関数）。  
```m
let
    Source = Data,
    AddedYear = Table.AddColumn(Source, "Year", each ___([Date])),
    Result = AddedYear
in
    Result
```

-------------------------------------
**8. 5択問題**  
以下の関数のうち、テーブルをグループ化するために使用されるものはどれか？  
A. Table.TransformColumns  
B. Table.Group  
C. Table.Sort  
D. Table.SelectRows  
E. Table.Unpivot

-------------------------------------
**9. コード補完問題**  
"Data"テーブルの"Amount"列について、合計値を求めるコード例で`___`を補完せよ。  
```m
let
    Source = Data,
    SumAmount = List.Sum(Table.Column(Source, "Amount")),
    Result = ___
in
    Result
```

-------------------------------------
**10. 5択問題**  
`Table.PromoteHeaders`関数は何を行うか？  
A. テーブルの最初の列をヘッダーに変換  
B. テーブルの最初の行をヘッダーに変換  
C. すべての列名を大文字に変換  
D. 列名を指定した列に変更  
E. テーブルをピボット変換
CNNモデル flaskを用いた写真撮影によるシステム制作した話①

## 発端
大学の卒業論文というところが発端になります。
私の所属している学部は制作系の学部であることもあり、卒業制作と論文の二点の提出が必須ということで制作に取り掛かりました。使用したデータセット等の研究内容については、極秘なので言えませんがご了承ください。
一応簡単に説明しておきます。
CNNモデルを制作しました！では面白味がなくなってきました。
そして、CNNモデルを実際に使用できます！これでも新規制としては不十分みたいです。
なので、写真撮影で簡単にCNNモデルを使って評価できるよ！にしてみました。
こういったシステムが存在することは間違いないです。ですが、その仕組みを明らかにし、写真撮影に適したデータセットによる重要性の高い問題を解決するためのシステムの構築が、大学と私に有意義だということで制作を行なっています。

プログラミングには趣味・講義で多く触れてきましたが、なかなか同じようなシステムについての資料がなく大変でした。どうにかQiitaのお陰で制作を終えることができましたので、コードと手順等を残しておこうと思い立ちました。

##  記事の更新日時
とりあえず、週に一回ずつ記事を更新していきたいと思います。
少し忙しいのですが、2025年の2月とか3月までに書き終えればいいなと、
週に一回は更新します。
①から⑧くらいで終わると思います。
適宜この①の記事に情報を追記します。

##  制作物
簡単に言うと、写真撮影した画像でCNNモデルによる評価を実施できるwebアプリケーションです。
（写真撮影-CNNモデルによる評価-写真とスコアの表示）

## 大まかな設計図(とりあえず)

### 01　Flask
とりあえずフレームワークには、Flaskを使用しました。
ネットの文献で写真撮影+写真保存をするシステムを探したところ、HTMLとJavaScriptを使用していましたのでFlaskを選択しました。
いやもっとあるじゃんってなると思います。
というのも、研究と同時に制作なので、時間かけたくない不純な思いです。

### 02　UI
UI部分は、HTMLとCSSを用いています。
デザインしやすいですし、みんな通る道なので何かと時短で制作できます。

### 03　写真撮影
HTNL、JavaScriptを用いています。
厳密に言うと、エンコードしたデータをpythonでデコードしたり処理があるですが、写真撮影機能のみだと必要ないです。

### 04　CNNモデル
と言うことで、CNNモデルの制作です。
研究内容は極秘なので、今回はMnistデータセットで代用します。

### 05　画像処理
Mnistデータセットを用いた写真撮影によるシステムを制作しても、モノクロームの画像にしなければ、画像規格を合わせないと、といった感じでやることがあるのでその辺りも説明します。

## 今後の予定
②では写真撮影を用いた写真の撮影と表示についての記事を投稿しようと思います。
記事の説明について錯誤することもあるかと思いますが、ご了承ください。
プレイブラストでレイヤー分けしたい

プレイブラストするときに、
背景だけ　キャラだけ　といった具合に特定の要素だけを抜き出して書き出したいなぁと


どうするか
--

表示を絞るという事なので、考えられるのが

- displayLayerを使用する。  
- 孤立表示を使用する。  
- renderSetupを使用する。  

あたりかなぁと。

**renderSetupを使用する**
出来んことも無いですが、若干面倒なのであんまり気は進みませんね。

**displayLayerを使用する**
割と簡単な気はします。
が、複数のdisplayLayerに登録されている場合、displayLayerのどれかが非表示なってるとそれが適用されますね。
なので、A レイヤーの内容だけを表示させたいが、Bレイヤーにも登録されている　という場合には対応しづらいですね。

**孤立表示を使用する**
何らかの方法で表示させたい要素を取得し、viewportの孤立表示を使用して表示を絞ります。
シーンの状態に手を加えないので、この方法が良さそうな気がします。

となると次に、
**何らかの方法で表示させたい要素を取得**
これをどうするかですね。

- objectSet
- displayLayer
- 直指定

手っ取り早くobjectSetでやってみます。

実装
--

孤立表示はこのコマンドでいけそうですね。

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/isolateSelect.html

フォーマットとかその辺は一旦固定で実装してみます。

```python
import maya.OpenMayaUI as OpenMayaUI
import maya.api.OpenMayaUI as omui
import maya.cmds as cmds

def setIsolateView(panelName,nodes):
    cmds.isolateSelect(panelName,state = False)        
    cmds.isolateSelect(panelName,state = True)
    
    for node in nodes:
        if cmds.objExists(node):
            cmds.isolateSelect(panelName,addDagObject = node)

def playblastAsLayer(targetSet,outputPath):
    targetNodes = []
    targetNodes = cmds.sets(targetSet,q=True)

    panelName = OpenMayaUI.MQtUtil.fullName(int(omui.M3dView.active3dView().widget())).split("|")[-2]
    
    timeRange = [
                    cmds.playbackOptions(q = True, min =True),
                    cmds.playbackOptions(q = True, max=True)
                ]
    resolution =[
                    cmds.getAttr("defaultResolution.width"),
                    cmds.getAttr("defaultResolution.height")    
    ]

    setIsolateView(panelName,targetNodes)

    cmds.playblast(
                        filename = outputPath + "_"+targetSet,
                        forceOverwrite =True,
                        format = "image",
                        compression = "png",
                        sequenceTime = True,
                        clearCache = 1,
                        viewer = False,
                        showOrnaments =  True,
                        offScreen = True,
                        fp = 4, 
                        percent = 100,
                        quality = 100,                        
                        startTime = timeRange[0],
                        endTime = timeRange[1],
                        widthHeight = resolution,
                        editorPanelName = panelName,                        
                    )
    
    cmds.isolateSelect(panelName,state = False)
```

このようなシーンを作ってテストしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f70549e9-6bdf-d2b4-c84d-de0b8e078c33.png)

```python
outputPath = "D:/test/images/testPlayblast/testPlayblast"
playblastAsLayer("set1",outputPath)
playblastAsLayer("set2",outputPath)
```

うまい事書き出せました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/a808f907-2db4-132d-ff1a-0dbd08d95b1d.png)

んー レイヤー毎にフォルダ分けした方が使い勝手は良さそうですね。
サードパーティJS SDK（GA.jsなど）の読み込み問題の解決

昨日、[CheckNumber.AI](https://CheckNumber.AI)というウェブサイトにGAトラッキングコードを追加しました。ソースコードを確認すると、コードは正常に追加されていましたが、Networkタブに通常の読み込みリクエストが表示されていませんでした。
そこで、何が原因なのかを順を追って確認することにしました。

まず、サードパーティのコードが正常に開けるかどうかを確認しました。ソースコードを見て、GA URLを直接クリックしたところ、アクセスは成功しました。

次に、ウェブサイトのCSP（Content Security Policy）設定が、サードパーティのGoogle Analyticsコードの読み込みを許可しているかどうかを確認しました。

ウェブサイトのCSPを確認する方法はいくつかあります。まずはオンラインツールを使って確認してみました。ウェブサイトを開いてURLを入力し、「Scan」ボタンをクリックすると、結果が表示されました：
https://securityheaders.com/?q=checknumber.ai&followRedirects=on
 ![Check Number.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3963003/9e24ac9c-5a33-fdb9-667e-2b6727e98cfb.png)


上記の結果から、ウェブサイトには特別なCSP設定がないことがわかり、これが原因ではないことが分かりました。

三番目のステップとして、Astroのpartytownモードをオフにしてみました。
設定ファイルのgoogleAnalytics部分を見つけ、partytown: trueをpartytown: falseに変更しました。
その後、ビルドし直したところ、問題は解決しました！

English Version: https://medium.com/@checknumber/resolving-third-party-js-sdk-like-ga-js-loading-issues-e32deb3d9c78
「データ解析のための数理統計入門」章末問題解答メモ

# 初めに
筆者が統計学の知識整理のため[データ解析のための数理統計入門](https://www.kyoritsu-pub.co.jp/book/b10033628.html)(久保川達也 著)についての答案メモを作成します。略解については[こちら](https://sites.google.com/site/ktatsuya77/%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E7%90%86%E7%B5%B1%E8%A8%88%E5%85%A5%E9%96%80)に久保川先生自が記載してくれている。略解との違いとしてなるべくどういう風に考えていったかなども載せていきたいと思ってます。※厳密には違う場合は指摘をいただければ幸いです。

# 第1章 確率モデル
https://qiita.com/K24same/items/624007176dfc09b398a2

# 第2章 確率変数と確率分布
https://qiita.com/K24same/items/bee189ba3bb19b3369ad

https://qiita.com/K24same/items/1268c9ab9be78d35c783

# 第3章 2変数の同時確率分布
https://qiita.com/K24same/items/878e05aaa429668ba6cb

# 第4章 期待値と積率母関数
https://qiita.com/K24same/items/6d0eb4a35dec39256530

# 以下は随時記載
第5章 統計モデルとデータの縮約
第6章 大薮の法則と中心極限定理
第7章 正規分布から導かれる分布
第8章 パラメータの推定
第9章 仮説検定と信頼区間
第10章 カイ2乗適合度検定と応用例



# 参考文献
[データ解析のための数理統計入門](https://www.kyoritsu-pub.co.jp/book/b10033628.html)
「データ解析のための数理統計入門」解答メモ 第3章 

以下第3章解答メモ
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/f882f82e-9ea7-2539-0374-3d4cf92ece13.jpeg)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/db1f7c0f-e839-47c3-ee51-fb0765c57b57.jpeg)
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/b1536286-b0a0-0587-702c-be2746cd9701.jpeg)
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/22241121-d15e-2c2c-68e5-604c41305321.jpeg)
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/68bb2cf6-5638-9938-2eb8-bf0fb8a27182.jpeg)
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/e0da547e-6acb-84bc-8baa-30903fc26b74.jpeg)
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/00a83100-7259-fcba-3eb4-4da476e5b9ba.jpeg)
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/01fe4e08-8029-05e8-23cd-1be96a30eedd.jpeg)
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/a0cb04ca-7d1e-8bb2-2d64-dab706c46baa.jpeg)
2024/12/30主にITとかセキュリティの記事

海運や小売店向け会計、勤怠システムを販売するエイ・アイ・エスがランサムウェアに関する最終報告書を発表(12/28)
https://rocket-boys.co.jp/11736/

北朝鮮の脅威アクターがサイバー攻撃、国内も要注意とNTT子会社が警告(12/28)
https://news.mynavi.jp/techplus/article/20241228-3095594/

少年ジャンプ＋の脆弱性事例から学ぼう！アプリ利用時のセキュリティ意識
https://cybersecurity-park.com/3850/

OtterCookie: 北朝鮮ハッカー集団による開発者狙いの新型マルウェア、140台以上に感染被害(12/28)
https://innovatopia.jp/cyber-security/cyber-security-news/45856/

カスペルスキーはFacebookのビジネスアカウントをターゲットにした新しいフィッシングスキームを見つけました(12/27)
https://voi.id/ja/teknologi/446207

ネット取引不具合が解消　三菱ＵＦＪ銀、顧客情報流出せず(12/28)
https://www.sanyonews.jp/article/1659136
https://www.chugoku-np.co.jp/articles/-/578018
https://www.saitama-np.co.jp/articles/116363

日本企業に相次ぐサイバー攻撃被害…ＪＡＬに続いて大手銀行に障害(12/27)
https://news.livedoor.com/article/detail/27846131/

サイバー攻撃　重要インフラの防御体制築け(12/28)
https://www.yomiuri.co.jp/editorial/20241227-OYT1T50212/

鹿児島空港は帰省ラッシュ　サイバー攻撃を受けた日本航空も通常通り運航(12/27)
https://nordot.app/1245322815021237142?c=1165586575134900434

【続報】JALがサイバー攻撃受けてきょう発便のチケット販売を中止に　10時現在の遅延は14便に(12/26)
https://nordot.app/1244826808286855372?c=724086615123804160

Amazon Connect チャットによる機密情報の収集(12/28)
https://aws.amazon.com/jp/blogs/news/connect-collecting-sensitive-information-jp/

ラザロハッカーグループのメンバーの韓国ブラックリスト(12/27)
https://voi.id/ja/teknologi/446177

ヤマト、「クロネコメンバーズ」復旧　一時障害(12/28)
https://www.nikkei.com/article/DGXZQOUE2811E0Y4A221C2000000/

米国 NIST IR 8498 スマートインバーターのサイバーセキュリティ：住宅および小規模商業用ソーラーエネルギーシステムのためのガイドライン(2024.12.20)(12/28)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/12/post-1cb593.html

米シスコ傘下のスプランク、日本でサイバー人材10万育成(12/28)
https://www.nikkei.com/article/DGXZQOUE249PK0U4A221C2000000/

個人情報漏えいについて(12/28)
https://www.town.agui.lg.jp/0000007642.html

【注意！】クレカやデビットの不正利用、沖縄でも複数発生　12～13日(12/28)
https://ryukyushimpo.jp/news/national/entry-3813476.html

自衛隊｢サイバー無害化｣の新任務　能動防御、警察と協力(12/28)
https://www.nikkei.com/article/DGXZQOUA20ABM0Q4A221C2000000/

ビットコイン大口保有者、プライバシー取引を利用して密かにBTCを蓄積(12/27)
https://crypto-times.jp/news-large-bitcoin-holders-secretly-accumulate-btc-using-privacy-transactions/

AI搭載ロボットを暴走させる「脱獄」攻撃の危険性(12/28)
https://wired.jp/article/researchers-llm-ai-robot-violence/

主要上場企業の「DMARC」 - 約半数企業で「隔離」「拒否」の取組(12/27)
https://www.security-next.com/165793

【2025】無料で使えるPLMはある？メリット・デメリットや無料のPLMソフトも紹介
https://cad-kenkyujo.com/plm-muryo/

徳丸先生をお招きしてセミナーしました）Web改ざん匿名事例解説と効果的で安全なWebサイトの運営を解説するセミナー[動画公開中](12/25)
https://www.prime-strategy.co.jp/blog/50498/

SHEINの利用で気をつけることは？注意点を知って賢く買い物しよう(12/28)
https://eczine.jp/article/detail/15994

【重要】利用規約に違反する行為への措置の実施について(12/27 17:00実施)
https://news.fate-go.jp/2024/1227ojdfg/

少年が自作の暗号資産を売り抜け、5万ドルを稼ぐ　投資家たちは報復(12/28)
https://www.sankei.com/article/20241228-N2DE5J3MUNPHDKX6MPL45YNA2A/

2024年 まとめ(12/27)
https://qiita.com/RSashimi/items/4ba3b205c3bbbe9b228e

海外旅行先で「公共Wi-Fiを利用する」5割…1000人超調査で“リスク”浮き彫りに　「適切な対策」5つも紹介(12/28)
https://news.yahoo.co.jp/articles/8b7d0b32163b61bd852190e4be54c1369e3c9a6b?source=rss

内閣官房 内閣サイバー官（特別職、次官級）・国家サイバー統括室の新設と【内閣府】防災監（次官級）の新設（政府の災害対応の司令塔機能の抜本的強化）(2024.12.27)(12/28)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/12/post-fbbb1c.html
Webプログラマー向けAnki用英単語デッキ（試作）を公開しました

英語の4技能（話す、聞く、書く、読む）を伸ばすには、語彙と文法を訓練しないといけません。語彙は暗記して増やすしかありませんが、世の中の単語帳は汎用なのでどうも覚えにくいです。そんな悩みを抱えて20年。こつこつと単語帳を整備してきたのですが、生成AIですべてがひっくり返りました。単語帳は生成AIで作れるんです。

## Anki用デッキを作ってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70223/50bba94f-7596-59df-893e-9e9a47a022e1.png)

できるかな？と思って作ったらできました。

https://ankiweb.net/shared/info/1668821026?cb=1735498231706

に公開しましたので、Ankiを使っている方はぜひ感想をお願いします。
「データ解析のための数理統計入門」解答メモ 第2章 問8-問13

以下第2章問8-問13解答メモ
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/729a715d-3d62-5886-0b00-c99578f3257a.jpeg)
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/554f27f7-d47d-6ad2-a9e5-40a5bab2aeff.jpeg)
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/4a4b76b8-e664-76b3-314d-5a10d6dd37b6.jpeg)
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/92fce3c7-39a5-9aa5-4aca-2c670b9d9fd4.jpeg)
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3959389/ec2ff5bb-ac29-c143-0103-380ec373a0a3.jpeg)
フィボナッチ数列とゼッケンドルフの定理

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。

## はじめに
最近の :frog: の投稿は、例えば[シルベスター数列](https://qiita.com/kyamaz/items/c0ed8cc90dfff7e6b4f9)などの数学の分野で合成数の数列をよく扱っております。恐らく最も有名な数列であるフィボナッチ数列については取り上げていなかったので、本稿はフィボナッチ数列についての軽めの話題から。

### フィボナッチ数列
言わずと知れた数列ですが、定義は以下。

:::note info
漸化式 $F _{0} = 0,\quad F _{1} =1,\quad F _{n} = F _{n-2} + F _{n-1}\ (n\ge 2)$
で定まる数列を『フィボナッチ数列』といいます。
:::

Haskellで簡単に書くと次のようになります。

```haskell: フィボナッチ数列
fibs@(_ : tfibs) = 0 : 1 : zipWith (+) fibs tfibs
```

少し前のGHC 8.6の頃ですが、効率的なプログラムの考察は @mod_poppo さんの次のエントリーが詳しくて、zipWith'（正格評価）による再帰的なプログラムの方が良いようです。ただし、本稿では計算効率は追求せずに、上記を使います。

https://qiita.com/mod_poppo/items/4f78d135bb43b7fd1743


## ゼッケンドルフの定理
任意の正の整数は、1つ以上の、番号が連続しないフィボナッチ数の和として一意に表せるという定理です。数式を用いて示すと以下のようになります。（Wikipedia「[ゼッケンドルフの定理](https://ja.wikipedia.org/wiki/%E3%82%BC%E3%83%83%E3%82%B1%E3%83%B3%E3%83%89%E3%83%AB%E3%83%95%E3%81%AE%E5%AE%9A%E7%90%86)」より）

:::note info
$N$ を任意の正の整数とすると、$c_{i+1} \gt c_{i} + 1$ を満たす正の整数 $c_{i} \ge 2$ が存在して、

$\displaystyle N = \sum _{i=0}^{k} F _{c  _{i}}$

（ただし $F_{n}$ は $n$ 番目のフィボナッチ数）
:::

このような和を $N$ の**ゼッケンドルフの表現**と呼びます。
この定理の証明は Wikipedia にも記載がありますが、次のマスオさんらのサイトに分かりやすい証明が載っています。

https://manabitimes.jp/math/972

さて、この定理から $n$ のゼッケンドルフ表現をリストで求めるプログラムは、次のようになります。これは「その数を超えない最大のフィボナッチ数を取っていく」という方法で求めます。

```haskell: ゼッケンドルフ表現
zeckendorf n = zec n (reverse $ takeWhile (<=n) fibs) where zec 0 _ = []; zec m (f:fs) | f <= m = f : (zec (m-f) (dropWhile (>m-f) fs)) | otherwise = zec m fs; zec _ [] = error ""
```

Wikipedia 等で、例として挙げられる $n = 100$ で試してみましょう。

```haskell:
ghci> zeckendorf 100
[89,8,3]
```

この定理に名を残すエドゥアルド・ゼッケンドルフ（1901/5/2 - 1983/5/16）は、ベルギーの医師・陸軍将校（軍医）であり、アマチュアの数学者でした。このフィボナッチ数列の研究が有名で、ほかにも数論に関する20以上の論文を主に発表した方だそうです。

ここで、ゼッケンドルフ表現では何個のフィボナッチ数で表現できるのかという疑問が湧きました。次のように検証してみました。

```haskell:
ghci> foldr max 0 $ length . zeckendorf <$> [1..10]
2
ghci> foldr max 0 $ length . zeckendorf <$> [1..100]
5
ghci> foldr max 0 $ length . zeckendorf <$> [1..1_000]
7
ghci> foldr max 0 $ length . zeckendorf <$> [1..10_000]
9
ghci> foldr max 0 $ length . zeckendorf <$> [1..100_000]
12
ghci> foldr max 0 $ length . zeckendorf <$> [1..1_000_000]
14
ghci> foldr max 0 $ length . zeckendorf <$> [1..10_000_000]
17
```


## おわりに
ここで紹介したゼッケンドルフ表現は、ワイソフのゲーム（2山の片方からまたは、両方から同数ずつ取る石取りゲーム）の後手必勝形とも関係があるそうです。ご興味のある方は [Wikipedia：ワイソフのゲーム](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%82%A4%E3%82%BD%E3%83%95%E3%81%AE%E3%82%B2%E3%83%BC%E3%83%A0) もご参照ください。

最後に、本稿を記載するために検証したHaskell環境を記しておきます。お手元の環境で検証する際に、動作が異なるときには参考になるかもしれません。

<details><summary>本稿の環境</summary>

本稿のために使用した環境は以下となります。

* macOS: Sonoma 14.6.1 (chip: Apple M1)
* GHCup: 0.1.30.0
* GHC: 9.6.6

</details>

ご一読いただきまして有り難うございます。

（●）（●） Happy Hacking!
/""　＿＿""＼
【個人用】AWS Solution Architect Associate対策ノート(IAM編)

## IAMで使用するポリシー

IAMで使用するポリシーには、以下の２種類がある


### IDペースのポリシー(IAMポリシー)
IAMユーザー、IAMグループ、IAMロールにアタッチするポリシー

１つのポリシーを複数の対象にアタッチできる**管理ポリシー**と、複数の対象にアタッチできない**インラインポリシー**がある

#### ・管理ポリシー
AWSによってあらかじめ定義された**AWS管理ポリシー**と、ユーザーが定義する**カスタマー管理ポリシー**に分かれている

#### ・インラインポリシー
ユーザーが対象ごとに作成、付与するポリシー

### リソースベースのポリシー
AWSリソースにアタッチするポリシー

## ARNの表記について
ARN(Amazon Resource Name)の表記は…

**arn:aws:[AWSサービス名]:[リージョン]:[アカウントID]:[リソース名]**

## サービスコントロールポリシー

組織に属しているOU(Organization Unit)またはAWSアカウントに対して、AWSサービスへのアクセス制限や利用可能なリソースを制限できる機能

ちなみに、OUとは組織内のアカウントをグループ化して、共通の設定やポリシーを適用できるようにするもの。

## インスタンスプロファイル
IAMロールを格納するための入れ物
EC2インスタンスは、起動時にこれを読み込んで、設定されたIAMロールの権限で動作する
viewportが諦める


GPUの悲鳴
--
アセットまぁまぁおるなーっていうシーンでテクスチャ表示にしてみるとー

ﾄﾞｩﾝ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/2859b0d4-5bdf-1e76-6f23-16be7df3da97.png)

auto Clamp使いなさいよ、って書かれてるんですが
使ってるんですよauto Clamp。

じゃぁどうしたらいいんすか問題が起きました。

現状把握
--

GPUメモリーがというのであればこのコマンドで使用状況を見れるはず。

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/ogs.html

https://help.autodesk.com/cloudhelp/2022/JPN/Maya-Tech-Docs/CommandsPython/memory.html

```python
print(cmds.memory(summary=True))
print(cmds.ogs(gpu=True))
```

準備したデータ

- 4Kテクスチャを36つないだ枚ほど用意し、１：１でlambertにつないだデータ
- 同じテクスチャを512にリサイズしたデータ

これをviewPortの設定をいじりつつ確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/3aa1f222-4ccf-f27f-3426-50d6020fcd89.png)


**1,4Kテクスチャ + autoClamp ON**
['\n', '5600.730 Mb\tCurrent\n']
2594

**2,4Kテクスチャ + customClamp 512**
['\n', '3105.922 Mb\tCurrent\n']
177

**3,512テクスチャ + autoClamp ON**
['\n', '3065.641 Mb\tCurrent\n']
160


1と2を比較すると、今回の状況下では手動で指定したほうが良さそうですね。

2と3を比較すると、事前にリサイズしても大して効果は無さそうですね。
ただ、viewportでの表示を眺めていると明らかに2より3の方が表示までの時間が短いんですよね。

profiler
--

表示までの時間が気になるので、profilerでテクスチャーのプレビューが終わるまでの内容を比べてみます。

**1,4Kテクスチャ + autoClamp ON**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/198127e9-5e37-6525-8083-da0377ce0893.png)

**2,4Kテクスチャ + customClamp 512**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/5cfd91e2-8659-f6f3-bbb3-21bb5c2ff2c1.png)

**3,512テクスチャ + autoClamp ON**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0b839e6e-fdc1-40ce-4bfc-40004b0c6b23.png)

おー　結果が流石に変わりましたね。

1と2の状況で幅を利かせてるものをみてみると、まぁなんかテクスチャをロードしてるっぽいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/42582cf5-78e1-aa16-28ec-bdf339309032.png)

ざっくり結論
--

- テクスチャをあらかじめリサイズしても、clampを使用してもGPUメモリの使用量はさほど変わらない。  
- テクスチャの解像度が低い方がviewPortの負荷が軽い。  

なので、

**リサイズできるならリサイズしたほうがいい**

という雑な結論をとりあえず置いときます。

※実は以前同じような検証をしたときには clampを使用しても高解像度テクスチャの方がGPUメモリの使用量多かったんですよねぇ。これはmayaのアップデートによって改修されたのですかね？　リリースノートをちゃんと読もう。
Haskellで圏論を学ぶ　その１

## はじめに

[前の記事](https://qiita.com/yotabouya/items/cca33c1a587509a3d419)でHaskellを使ってみました。
今回から、Haskellを使って圏論を学んでいきたいと思います。
初回の今回は、圏論の基本的な概念についてHaskellで実装してみます。
[こちらのリポジトリ](https://github.com/MasahitoUWAMICHI/Category_Theory)に、コードをアップロードしています。

## 圏とは

圏とは、対象と射からなる数学的構造です。

対象とは、何らかの数学的対象のことです。
射とは、対象から対象への矢印です。

たとえば、集合を対象、写像を射とする圏があります。

## Haskellでの実装

[こちら](https://qiita.com/inamiy/items/9af1da1faec22cd968f0)を参考にしました。
あくまでも抽象的な定義が紹介されています。

圏と関手の定義はこんな感じになります。

```haskell
-- 型クラスを使った圏の定義
class Category cat where 
    -- 恒等射。圏クラスのメソッド
    id :: cat a a 
    -- 射の合成。圏クラスのメソッド
    (.) :: cat b c -> cat a b -> cat a c 

-- 関手の定義
class (Category c, Category d) => Functor c d f where   
    -- 関手の射に対する作用。関手クラスのメソッド  
    fmap :: c a b -> d (f a) (f b) 
```

この後関手圏や自然変換を定義しようかと思ったのですが、ここで圏の定義に物足りなさを感じました。
というのも、関手圏を定義するならば対象が圏であることを考慮する必要があります。
しかし、上の定義では対象についての情報がありません。
確かに圏論の主要な概念は射ですが、その射を適切かつ具体的に定義するためには対象についての情報も必要だと思います。

## 圏の対象を扱う

[こちら](https://zenn.dev/halmet7000/articles/a1a11a1713a75c)のページでは、より具体的な圏の定義がされています。

```haskell
-- 対象：集合：型
data C = A | X | Y | Z deriving (Show, Eq)

-- 射：関数
f :: C -> C
f A = X
g :: C -> C
g A = Y
h :: C -> C
h X = Y
h' :: C -> C
h' Y = Z

-- 恒等射
idA :: C -> C
idA a = a
idX :: C -> C
idX x = x
idY :: C -> C
idY y = y
idZ :: C -> C
idZ z = z
-- 以下，恒等射にはデフォルトで搭載されているidを用いる．


-- 射の合成
--- 以下，===で同じという意味を表すことにする
-- テスト(h.f) A === 結果Y

-- 結合律
-- (h'.h.f) A === ((h'.h).f) A === (h'.(h.f)) A === Z

-- 可換かどうか
result1 = (h.f) A
result2 = g A
kakan = (result1 == result2) -- Trueなので可換 h.f=g
```

この定義での対象はA, X, Y, Zの4つの集合です。
射は関数として定義されています。
たしかに、この定義であれば、対象についての情報も扱うことができます。
しかしながら、関手圏との関係性を考えると、対象についての情報を型クラスで扱う方が適切かもしれません。

だいぶ長くなりそうなので、今回はここまでにします。
コマンドライン引数でJSONを渡すときの，PowerShellとコマンドプロンプトでの「"(ダブルクォート)」のエスケープの違い

## 概要
Webアプリからローカルの`.exe`ファイルを呼び出すとき，そのコマンドライン引数としてJSONを与えたかった．そのとき，PowerShellとコマンドプロンプトではエスケープの挙動が違った．与えるJSONサンプルは以下の通り．

```json
{
  "name": "Alice",
  "age": 25,
  "city": "London"
}
```

## PowerShell
シングルクォーテーション`'`で全体を囲んで，`"`は`\`でエスケープ
```
.\app.exe '{\"name\":\"Alice\",\"age\":25,\"city\":\"London\"}'
```


以下の1行目のように，ダブルクォーテーションでエスケープするとき，JSONデータ中に一つでも空白があればエスケープできるが，2行目のようにJSONデータ中に空白が無ければ正しくエスケープできない．

```
.\WinFormsApp4.exe '{""name"":""Alice"",""age"":25,""city"": ""London""}'
.\WinFormsApp4.exe '{""name"":""Alice"",""age"":25,""city"":""London""}'
```

少し調べてみたが，原因はよくわからなかった．

## コマンドプロンプト
ダブルクォーテーション`"`で全体を囲んで，`"`は`\`でエスケープ
```
app.exe "{\"name\":\"Alice\",\"age\":25,\"city\":\"London\"}"
```
初心者がFlaskでサーバーを立てるまで

＜Flaskを導入するまでの流れ＞
①仮想環境の構築
②Flaskのインストール
③コーディング
④Flaskの起動

＜エラー文＞
```python
ImportError: cannot import name 'url_quote' from 'werkzeug.urls'
```
→FlaskとWerkzeugのバージョンがおかしい。

＜何故詰まっていたのか＞
・仮想環境でFlaskとWerkzeugをインストールしても動かない
・バージョンを指定しても動かない

＜やっていたこと＞
・バージョンの指定
```
Flask==2.3.3
Werkzeug==2.3.7
```
ネットで調べたらバージョンを指定することで動くとあった
```
pip install flask==2.3.3
pip install werkzeug==2.3.7
```
コマンドを入力しても起動しない

＜原因＞
・以前PCにFlaskをインストールしていたことが問題で、PCのflaskをバージョン指定して再インストールしたら解決した
・仮想環境の構築ができてなくてPCの方のバージョンのFlaskが使用されていた

＜各コマンド＞
仮想環境の構築
```
python -m venv env
```
仮想環境の有効化(macOS)
```
source env/bin/activate
```
一番簡単なFlaskアプリ
```python:hello.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"
```
アプリの起動
```
flask --app hello run
```
PowerShellで使用しているSeleniumとWebDriverを日々アップデートする仕組みを作成


# 1. Seleniumライブラリのアップデート
Seleniumの.NETライブラリをNuGetから取得している場合は、以下のスクリプトを使用して最新バージョンを取得できます。
```
# NuGet CLIを使用してSelenium.WebDriverをアップデート
nuget update Selenium.WebDriver -Source "https://api.nuget.org/v3/index.json"

# 必要に応じて他の関連ライブラリも更新
nuget update Selenium.Support -Source "https://api.nuget.org/v3/index.json"
```
# 2. WebDriverのアップデート
ブラウザごとのWebDriverを最新に保つためには、以下の方法を使用します。

2.1 手動ダウンロードを自動化するスクリプト
以下はChromeDriverを例にしたアップデートスクリプトです。ブラウザのバージョンに応じて適切なバージョンのWebDriverをダウンロードします。

```UpdateSelenium.ps1
# Google Chromeのバージョン取得
$chromeVersion = (Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome").DisplayVersion

# ChromeDriverの最新バージョン取得
$driverVersionUrl = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$chromeVersion"
$latestDriverVersion = Invoke-RestMethod -Uri $driverVersionUrl

# ダウンロード先URL
$driverDownloadUrl = "https://chromedriver.storage.googleapis.com/$latestDriverVersion/chromedriver_win32.zip"

# ダウンロード先ファイルパス
$downloadPath = "$env:TEMP\chromedriver.zip"
Invoke-WebRequest -Uri $driverDownloadUrl -OutFile $downloadPath

# 古いドライバを削除し、新しいものを解凍
$driverPath = "C:\Path\To\Your\Drivers\"
Remove-Item -Path "$driverPath\chromedriver.exe" -Force
Expand-Archive -Path $downloadPath -DestinationPath $driverPath -Force

Write-Host "ChromeDriver updated to version $latestDriverVersion"
他のブラウザ（FirefoxのGeckoDriverやEdgeのEdgeDriver）の場合も同様の仕組みを使えますが、対応するURLを変更してください。
```
# 3. スケジュールタスクを設定する
日々の自動実行には、Windowsのスケジュールタスクを設定します。

スクリプト保存: 上記スクリプトをPowerShellファイル（例: UpdateSelenium.ps1）として保存します。

スケジュールタスク作成: 以下の手順でタスクを設定します。

タスクスケジューラを開く。
「基本タスクの作成」を選択。
タスク名を入力（例: Update Selenium and Drivers）。
実行頻度を選択（例: 毎日）。
実行するプログラムに以下を入力:
```StartUpdate.bat
powershell.exe -ExecutionPolicy Bypass -File "C:\Path\To\UpdateSelenium.ps1"
```
4. 確認とログの記録
アップデートが成功したかを確認するため、ログを記録する仕組みを追加すると便利です。以下はログを記録する例です。

```UpdateCheck.ps1
# ログファイルパス
$logFile = "C:\Path\To\Logs\UpdateLog.txt"

# ログに書き込む関数
function Write-Log {
    param([string]$message)
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $logFile -Value "$timestamp - $message"
}

# ログの開始
Write-Log "Starting Selenium and WebDriver update."

# Seleniumアップデート
try {
    nuget update Selenium.WebDriver -Source "https://api.nuget.org/v3/index.json"
    Write-Log "Selenium.WebDriver updated successfully."
} catch {
    Write-Log "Error updating Selenium.WebDriver: $_"
}

# WebDriverアップデート（例: ChromeDriver）
try {
    # ChromeDriver更新スクリプトの内容
    Write-Log "ChromeDriver updated successfully."
} catch {
    Write-Log "Error updating ChromeDriver: $_"
}

Write-Log "Update completed."
```
PowerShellでSeleniumを使用する方法

PowerShellでSeleniumを使用するには、以下の手順で設定を行います。Seleniumを使用することで、ブラウザを自動操作できます。

## 1. SeleniumとWebDriverのセットアップ
1.1 Selenium WebDriverのインストール
Seleniumの.NETバージョンをPowerShellで使用するためには、NuGetを利用してSelenium.WebDriverをインストールするのが便利です。

NuGet CLIをインストールします（必要に応じて）。
NuGet CLIのインストールガイドを参考にしてください。
https://learn.microsoft.com/ja-jp/nuget/reference/cli-reference/cli-ref-install

Selenium.WebDriverをインストールします。
```
nuget install Selenium.WebDriver
```
これにより、必要なライブラリがダウンロードされます。

## 1.2 WebDriverの準備
使用するブラウザに対応したWebDriverをダウンロードします。以下に主要なブラウザと対応するWebDriverを示します：

Google Chrome: ChromeDriver
Firefox: GeckoDriver
Microsoft Edge: Edge WebDriver
WebDriverの実行ファイルをダウンロードして、PATHに追加してください。

## 2. PowerShellスクリプトの作成
SeleniumをPowerShellで使用するには、selenium-webdriverモジュールを.NETライブラリとして読み込む必要があります。以下のスクリプト例を参考にしてください。

必要な設定例: ChromeDriverを利用する場合
```
# Selenium WebDriverのライブラリを読み込む
Add-Type -Path "path\to\Selenium.WebDriver.dll"
Add-Type -Path "path\to\Selenium.Support.dll"

# ChromeDriverのパスを指定
$chromeDriverPath = "path\to\chromedriver.exe"

# Chromeオプションを設定
$chromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions

# ChromeDriverを初期化
$driver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($chromeDriverPath, $chromeOptions)

# Webページを開く
$driver.Navigate().GoToUrl("https://example.com")

# 要素を操作する例 (例: ボタンをクリック)
$element = $driver.FindElement([OpenQA.Selenium.By]::Id("button-id"))
$element.Click()

# ブラウザを閉じる
$driver.Quit()
```
## 3. ポイントと注意事項
PowerShellのバージョン: 最新のPowerShellを使用してください。
実行ポリシー: スクリプトを実行するには、実行ポリシーを変更する必要がある場合があります。Set-ExecutionPolicy -Scope CurrentUser RemoteSignedで設定を変更できます。
WebDriverのバージョン: 使用しているブラウザのバージョンに対応したWebDriverを選んでください。
エラー処理: 必要に応じてエラー処理を追加し、スクリプトの安定性を向上させます。
Haskellを使ってみた

## はじめに

圏論というものに興味があります。
その勉強にHaskellが使われることが多いと聞いたので、Haskellを使ってみました。

## Haskellとは

Haskellは純粋関数型プログラミング言語です。
純粋関数型プログラミング言語とは、関数型プログラミング言語の一種で、副作用を持たない関数のみでプログラムを記述するプログラミングスタイルのことです。

ちなみに私自身、プログラミング経験のほとんどはPythonです。
ですので、関数型プログラミング言語には慣れていません。

## インストール

前提として、windows11環境です。
[Haskell公式のdownloadページ](https://www.haskell.org/downloads/)に行ったところ、[GHCupのインストール](https://www.haskell.org/ghcup/)を推奨していました。
このページのコマンドをPowerShellで実行することで、Haskellのインストールが完了しました。
Cmdではないので注意です。

## Hello World

[こちらのページ](http://walk.northcol.org/haskell/setup/)を参照しました。
まず、Cmdを開いて、`ghci`と入力します。
これでHaskellの対話型環境が開きます。
ここで、`2 + 2`と入力すると、`4`と返ってきます。
`"Hello, World!"`と入力すると、`"Hello, World!"`と返ってきます。
`:q`で対話型環境を終了します。

## VSCodeでの開発

VSCodeでコーディングをおこなうこともできます。
[こちらのページ](https://haskell-tech.nkhn37.net/vscode-haskell-environment-setting/)を参照しました。
まず、VSCodeにHaskellの拡張機能をインストールします。

## プロジェクトの作成
テスト用に`test`というフォルダを作成しました。
この中に、`test.hs`というファイルを作成しました。
このファイルに、以下のコードを書きました。

```haskell
main = do
    print "Hello, World!"
```

## 実行

Cmdを開いて、`cd test`と入力します。
`ghc test.hs`と入力します。
コンパイルが完了すると、`test.exe`という実行ファイルが作成されます。
`test`と入力すると、`"Hello, World!"`と返ってきます。

## ghciでの実行

`ghci`で対話型環境を開きます。
`:l test.hs`と入力します。
`main`と入力すると、`"Hello, World!"`と返ってきます。
結局laravelのtruncate()の実装箇所ってどこ？実行されているSQLって何？

## 概要

laravelの`モデルクラス::truncate();`の実装箇所と実行SQLをざっくり探ってみる。

## 内容

1. 個々のモデルクラスを見る
1. 個々のモデルクラスの継承元の`vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php`をみる
1. 下記のような記載があるこの記載のおかげでクエリビルダーが使えている

    ```vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
    /**
     * The Eloquent query builder class to use for the model.
     *
     * @var class-string<\Illuminate\Database\Eloquent\Builder<*>>
     */
    protected static string $builder = Builder::class;
    ```

1. 上記の記載をヒントに`vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php`を見る
1. 下記の処理が動作している事がわかる

    ```vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
    /**
     * Run a truncate statement on the table.
     *
     * @return void
     */
    public function truncate()
    {
        $this->applyBeforeQueryCallbacks();

        foreach ($this->grammar->compileTruncate($this) as $sql => $bindings) {
            $this->connection->statement($sql, $bindings);
        }
    }
    ```

1. 余談だがdelete()は同クラスの近くに定義されていた

    ```vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
    /**
     * Delete records from the database.
     *
     * @param  mixed  $id
     * @return int
     */
    public function delete($id = null)
    {
        // If an ID is passed to the method, we will set the where clause to check the
        // ID to let developers to simply and quickly remove a single row from this
        // database without manually specifying the "where" clauses on the query.
        if (! is_null($id)) {
            $this->where($this->from.'.id', '=', $id);
        }

        $this->applyBeforeQueryCallbacks();

        return $this->connection->delete(
            $this->grammar->compileDelete($this), $this->cleanBindings(
                $this->grammar->prepareBindingsForDelete($this->bindings)
            )
        );
    }
    ```

1. どうやらSQL文はこちらで与えられているらしい`vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php`
1. `compileTruncate()`は下記、SQLの`TRUNCATE TABLE`句を生成して実行している模様

    ```vendor/laravel/framework/src/Illuminate/Database/Query/Grammars/Grammar.php
    /**
     * Compile a truncate table statement into SQL.
     *
     * @param  \Illuminate\Database\Query\Builder  $query
     * @return array
     */
    public function compileTruncate(Builder $query)
    {
        return ['truncate table '.$this->wrapTable($query->from) => []];
    }
    ```

1. MySQLの`TRUNCATE TABLE`句に関しては下記を参照

https://qiita.com/miriwo/items/86874952db7e641875f5
TC001(Awtrix) で YouTubeライブ同時視聴数を表示する

## チャンネル登録者数の Awtrix Flow サンプルの微調整で可
Awtrix Flow で Node-RED 用の YouTube チャンネル登録者数表示フローが掲載されている。

https://flows.blueforcer.de/flow/erM3xABvA8Lz

これを少し修正すれば YouTube ライブの同時視聴数も表示できるので、作ってみた。

## API の呼び出し方
動画に関する情報を API で呼び出すには、 URL `https://youtube.googleapis.com/youtube/v3/videos` の末尾にクエリとして動画 ID や API キー、必要に応じて part を記述する。詳細は以下の通り。

https://developers.google.com/youtube/v3/docs/videos?hl=ja

今回の用途だと、part で `liveStreamingDetails` を指定するのは必須。さらに URL で fields を指定すると直接値を取れるみたいだがうまくいかなかった。

https://zenn.dev/tofucode/articles/a9e4b1f8eda559

ともあれ、一セクション丸ごと JSON で返されても function で抽出できるので問題ない。

## Node-RED で実装する
フローとノードは以下の通り。
![nodered_ytlive1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/56dc2f52-44b6-c0ab-e78c-9ba54db5acc1.png)
![nodered_ytlive2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/112ece20-edb4-faae-47d5-b9138df88eb3.png)
![nodered_ytlive3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/e6355523-6b18-b48d-913a-2637d46bf111.png)
![nodered_ytlive4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/89e91391-ab76-5324-58f5-2c663cfdc8d8.png)
![nodered_ytlive5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/875e9825-013e-df35-36f3-9e463efb85c9.png)
![nodered_ytlive6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/e886c60b-19de-a2e0-d96c-cccb5604e0da.png)


「ペイロードをクエリパラメータに追加する」の設定がポイントである。 JSON で変数名と値を記述して payload で渡すと自動的にクエリへ変換してくれる。

アイコンは YouTube チャンネル登録者数のものと分けておくとよいだろう。今回は LaMetric DEVELOPER アイコンの #5941 をダウンロードし ytlive.gif にリネームして使った。

https://developer.lametric.com/icons

![nodered_ytlive7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943774/2bf375d2-2b3c-80a0-e4e2-d15fc533f7d2.gif)

素敵な YouTube ライフを！
MySQLのTRUNCATE TABLEとトランザクションについて

## 概要

MySQLの`TRUNCATE TABLE`句とトランザクションについて簡単にまとめる。

## `TRUNCATE TABLE`句について

このSQL句は指定したテーブルの中身を空にしたいときに使う。
結構強気にレコードが削除されるイメージで、パフォーマンスを優先しているらしい。
ロールバックに対応していなかったり、外部キー成約のあるテーブルに対しては実行する事ができない。
`DELETE`句のようにロールバックできるDML（データ操作言語）句ではなく、DDL（データ定義言語）句として分類される。
↓公式ドキュメント

https://dev.mysql.com/doc/refman/8.0/ja/truncate-table.html

## `TRUNCATE TABLE`句とトランザクション

`TRUNCATE TABLE句`に限らずDDL句に分類されるすべてが対象になる話ではあるが、DDL句のほとんどが実行後に暗黙的にコミットが実行されるらしい。これはDDL句らが若干特別な存在であるため、独自のトランザクションで処理することが望ましいと考えられているからっぽい。

https://dev.mysql.com/doc/refman/8.0/ja/implicit-commit.html

実行していないからわからないが明示的にトランザクションのSQL文の中で`TRUNCATE TABLE`句を実行するとトランケート直後にコミットが発生するため、そもそも実行できずエラーになるか、トランケート後の明示的なコミットで「トランザクションが無い」系のエラーが出るはず。

レコード削除時は`DELETE`句を使ったほうが良さそう。
そもそもロールバックできないので本番DBなどではよっぽどの理由（処理時間がかかりすぎるなど）が無い限りトランケートは実行しないほうがいいかも。