OmniAICreator/Qiita-1.07M huggingface dataset:
前回記事の実例報告

# TL;DR

前回お伝えした「[Seleniumを使ってサイト情報を整形加工する](./956a56941d54e5f80dc4)」でのフィスコから得た情報を元に取引を検討した3銘柄を紹介する。
技術ネタでもなんでもないので投資に興味の無い方は読むだけ時間の無駄であることを最初にお断りしておく。

## 実例報告

基本方針は買いに関しては短中期トレンドフォローをベースとして一過性の下落のリバを狙う(いわゆる押し目買い)。

:::note alert
あくまでも私個人の日記である。なので実際の取引は自己責任でお願いしたい。
:::

## 2681 ゲオホールディングス (2022/11/14-)

きれいな上昇トレンドラインを描いていたところで特に大きな要因もなく下げたので注視した。
「売り買いは三日待て」という格言に従い、大幅下落の三日後にエントリー(赤丸)。

![2681-1115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/b0aaf3f0-6187-0843-67e5-4423aac6b256.png)

その後、こんな感じ。

![2681-1125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/e1d97bf2-d6e7-3034-03fc-8a5c35f8d030.png)

すでに手仕舞いして利確済み。当初1940円近くまで戻して窓埋めすると予想したけど上昇基調が鈍化したため早めに処分した。
長期スタイルならもう少し我慢していいと思う。

## 4776 サイボウズ (2022/11/17-)

ゲオ購入後まもなく二匹目のどじょうが。。。
きれいな上昇トレンドから400円くらいの強烈な下げが発生したので買い場探し。

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/d960db52-60f1-e128-b074-d6210f9db5c9.png)

もちろんこれも三日待つ。そして。。。

![4776-1125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/a6d0db1b-da9f-5b8c-c828-c0c9dcd9c9b2.png)

うぉーっといいたいのだが。

戻りが早すぎてエントリーできず。ゲオと比べてもその回復の早さが伝わると思う。
結果だけ見れば三日後に買っても利益があげられたがチャートからは伝わりにくいけども日に100円以上の幅で上下に動くので指値を入れるにしてもエントリーポイントが掴めなかった。

## 3687 フィックスターズ (2022/08/31-)

「他人の不幸は蜜の味」ということで今度は失敗例。
少し乱れているけど上昇トレンドに見えるので赤丸のところで買いエントリー。

![3687-0831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/392ef616-aa06-4943-05e5-44f40661c9a7.png)

なお、その一ヶ月後の結果。(涙

![3687-0930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/fb662058-7cf0-927f-1baa-0c91ff839a6d.png)

エントリー前に上髭が二回出現しているのでここからの上昇に抵抗があることを示しているが、なぜか買う前にはこういうシグナルに気づかない。
というか結果論乙。

# 結論

やはり一筋縄ではいかない。なのでくれぐれも成功例だけを鵜呑みしないでいただきたい。

# (追記)そして今

戻りが鈍いので早めに手仕舞いしたゲオだが、やはり1900円代半ばまで戻してきて窓埋め完了。

![geo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/dbdd9e08-bc21-c638-7c05-bcf0d1e62b0a.png)

一方、いけいけだったサイボウズは少し落ち着いてきて押し目買いが狙えそうな状況になりつつある。
ぱっと見今すぐ買ってもいいように見えるが6月9月安値あたりで抵抗線引くと1750円くらいまでは下げ余地があると判断している。ただし時間は1,2ヶ月くらいかかるか。

![cyb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/25d94d7e-6288-417a-dcdb-0b5b80aef50b.png)

なお、失敗トレードとして取り挙げたフィックスターズ(2022/11/29のチャート)の件

![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691494/417d289a-40ed-32ad-7a13-faa88585fd48.png)
paiza.ioでelixir その108

# 概要
paiza.ioでelixirやってみた。
Forth、見つけたのでやってみた。
練習問題やってみた。

# 参考にしたページ

https://qiita.com/sym_num/items/0b53f38cb213da79c251

# 練習問題

Forthで数9を4個つかって1から15までの数を表す式を実行せよ。

# サンプルコード

```
9 9 - 9 9 / .
9 9 / 9 9 / + .
9 9 + 9 + 9 / .
9 9 9 + 9 / dup + .
9 9 9 + 9 / dup + - .
9 dup 9 + 9 + 9 / - .
9 9 9 + 9 / - .
9 9 9 drop 9 / - .
9 9 - 9 * 9 + .
9 9 / 9 dup 9 / + .
9 9 9 + 9 / + .
9 dup 9 9 + + 9 / + .
9 9 9 + 9 / dup + + .
9 dup 9 9 + 9 / dup + - + .
9 dup dup 9 + 9 + 9 / - + .
bye


```

# 実行結果

```
Forth in Elixir
? 1 ok
? 2 ok
? 3 ok
? 4 ok
? 5 ok
? 6 ok
? 7 ok
? 8 ok
? 9 ok
? 10 ok
? 11 ok
? 12 ok
? 13 ok
? 14 ok
? 15 ok
? May the Force be with you bye
```


# 成果物

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


以上。
paiza.ioでelixir その107

# 概要
paiza.ioでelixirやってみた。
Forth、見つけたのでやってみた。

# 参考にしたページ

https://qiita.com/sym_num/items/0b53f38cb213da79c251


# サンプルコード

```
Forth.is_integer_str("123")
Forth.is_integer_str("+123")
Forth.is_integer_str("-123")
Forth.is_integer_str("890")
Forth.is_integer_str("+890")
Forth.is_integer_str("-890")
Forth.is_float_str("123.1")
Forth.is_float_str("120.1")
Forth.is_float_str("123.1e10")
Forth.is_float_str("120.1e22") 
Forth.foo("1 1 + .\n")
#Forth.foo(" 1	1	+	 .\n") 
Forth.foo("3 1+ .\n") 
Forth.foo("10 1- .\n") 
Forth.foo("4 2* .\n") 
Forth.foo("11 2/ .\n") 
Forth.foo("1.1 1.1 + .\n")
Forth.foo("17 23 - .\n") 
Forth.foo("5 7 * .\n") 
Forth.foo("365 7 / .\n") 
Forth.foo("1000 2 3 */ .\n") 
Forth.foo("255 43 mod .\n") 
Forth.foo("255 43 /mod . .\n") 
Forth.foo("-3 abs .\n") 
Forth.foo("2 3 max .\n")
Forth.foo("2 3 min .\n")
Forth.foo("2 negate .\n")
Forth.foo("-2 negate .\n")
Forth.foo("2 dup . .\n") 
Forth.foo("2 3 drop .\n")
Forth.foo("2 3 swap . .\n")
Forth.foo("-2 67 4 rot . . .\n") 
Forth.foo("4 8 9 over . . .\n") 
Forth.foo(".\" Hello\"\n") 
Forth.foo("1 2 .s\n") 
Forth.foo("2 5 73 -16 + - * .\n")	
Forth.foo("0 if 1 else 2 endif .\n")
Forth.foo("-1 if 1 else 2 endif .\n")
Forth.foo("1 2 = .\n")
Forth.foo("2 2 = .\n")
Forth.foo("1 2 < .\n")
Forth.foo("1 2 < .\n")
Forth.foo("1 2 > .\n")
Forth.foo("1 2 < .\n")
Forth.foo("2 1 > .\n")
Forth.foo("2 1 < .\n")
Forth.foo("10 0 ?do i . loop\n") 
Forth.foo("3 0 do i . 4 0 do j . loop loop\n") 
Forth.foo("50 0 do i . 5 +loop\n") 
Forth.foo("-10 0 do i . -1 +loop\n") 
Forth.foo(": fib 0 1 rot 0 ?do over + swap loop drop ; 10 fib .\n")
```

# 実行結果

```
2 ok
4 ok
9 ok
8 ok
5 ok
2.2 ok
-6 ok
35 ok
52 ok
666 ok
40 ok
5 40 ok
3 ok
3 ok
2 ok
-2 ok
2 ok
2 2 ok
2 ok
2 3 ok
-2 4 67 ok
8 9 8 ok
Hello ok
<2> 1 2 ok
-104 ok
2 ok
1 ok
0 ok
-1 ok
-1 ok
-1 ok
0 ok
-1 ok
-1 ok
0 ok
0 1 2 3 4 5 6 7 8 9 ok
0 0 1 2 3 1 0 1 2 3 2 0 1 2 3 ok
0 5 10 15 20 25 30 35 40 45 ok
0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 ok
55 ok
```

# 成果物

https://paiza.io/projects/s4S8JHQ71NFOp0BAeJ8vvg
以上。
【WordPress】WordPressを利用するための準備をしよう！

# はじめに

前回の記事では、簡単にWordPressの仕組みと、ディレクトリ構造について触れました。

https://qiita.com/raptony110/private/6e00e7c5afd88fba7bb4

今回は、実際にWordPressを利用するための準備をしていきましょう！

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# Webサーバを用意する
Webサーバーを用意する方法は様々ありますが、一番簡単で、誰にでもわかりやすのはレンタルサーバーを利用することです。
もちろん利用料が発生する場合がほとんどですが、実際にサイトとしてリリースし、運用をしていくことを考えると、レンタルサーバーを利用することは、悪い選択肢ではありません。
サイト規模にもよりますが、WordPressを触ってみるという観点からいけば、AWSやGCPを利用してインスタンスを立てるより、コスパ良く運用できると思います。

## レンタルサーバーを利用する
今回はレンタルサーバーを利用して、サンプルのサイトを作成していきます。
[ロリポップレンタルサーバー](https://lolipop.jp/)を利用していますので、キャプチャはロリポップさんの画面になりますが、どのレンタルサーバーでもやっていることは同じです。
馴染みのレンタルサーバーがあるようでしたら、そちらのリファレンスを当たってみてください。

## WordPressをインストールする
前回の記事で述べたように、最近のレンタルサーバーでは、簡単にWordPressを利用する環境を整えることができますので、これを使わない手はないでしょう。
ロリポップさんでは、WordPress簡単インストールという名前のサービスがあり、画面に必要事項を入力して作成ボタンを押すだけで、WordPressとMySQLを同時にインストールしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/af5e3753-ca8c-58a2-0dbe-051c78e46b0e.png)
以下の入力項目を埋めて、ボタンをポチポチしたらすぐにWordPressのデフォルトサイトが作成されます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/e12e17f1-9a1a-f665-73e4-f81820b73610.png)
はい、以上です！！
簡単すぎる。

# おわりに
いかがでしたでしょうか。レンタルサーバーと、そのレンタルサーバーが提供しているWordPress環境構築ツールを使うと、あっという間にサイトが完成します。
ほんと一瞬ですね。
昔、ビルダーソフトやテキストエディタで、1ページずつ、何度もブラウザで動作確認しながらホームページを作成していた時代はなんだったのか馬鹿らしくなるくらい簡単で、早いです。

次回は、WordPressの管理画面にログインするところから始めましょう！
CTO＆マネージャー向けtips：暇に慣れたら一人前！

## 優秀なCTO＆マネージャーの困った結果
優秀なCTO＆マネージャーは、誰よりもパフォーマンスを出します。会社、サービスにコミットしているので２４時間働きます。責任感があるので、部下のミスも全てカバーしてがんばります。目線が高いので色んな事に気が回るので先回りして準備します。
・優秀
・コミット
・責任感
・目線が高い
素晴らしい素養なのですが、メンバーからCTO＆マネージャーの評価がこうだったら、そのCTO＆マネージャーは、マネジメントとしてマネジメントをしていない可能性があります。

## 素晴らしすぎるとメンバーはやる気なくす
こういう素晴らしいCTO＆マネージャーは最初は人気が高く、頼られるのですが、時間が立つにつれて、**自分でやってください**と言われてしまう。
・自分が失敗してもCTO＆マネージャーがカバーしてくれる
・週末出勤して作ったプログラムが１時間で書き直してくれた
・リスクを全て説明してくれるので考える必要がなった
CTO＆マネージャーとして精一杯やってるつもりでも周りはドンドンやる気をなくし、ロボットになっていきます。
周りを駄目にするマネジメントです。

## 人は自分でやらないと覚えない
僕はゴルフが好きですが、人の車に乗せてもらって行ったゴルフ場の道は後から考えてあまり覚えてません。自分で運転して行った時は、道をはっきりと覚えてます。仮に帰り道に事故や違反で捕まったりでもしたら完璧に記憶するでしょう。理解が一番深まる時って自分で考えた時なんです。更に大きな衝撃を受けると尚更です。
優秀なCTO＆マネージャーは、代わりにやってくれたり、全てを教えてくれますが、これだと全く覚えてません。考えません。やる気も起こりません。ロボット化に一直線です。

## 適度な教え方がポイント
教えるのではなくて一緒に考えます。教える時も教える部分は、少しだけ。考えるきっかけを与えるだけにします。背中を押してあげるだけです。一気に教えすぎてはいけません。自分で答えを出したかの様に教えます。
もちろん教えなさすぎも良くありません。何もわかない状態が長すぎたり、全く太刀打ちできない課題だとやる気をなくします。大きすぎる仕事はタスクに分解して渡してあげる事により、そのメンバーにも対応できる状態にしてあげます。最後、タスクが繋がった時に、自分で全部できた様に感じる様にしてあげます。

## 良い方向に導くより悪い部分を埋めていく
「一利を興すは一害を除くに如かず」という言葉があります。
```
一つの利益をあげることを考えるよりは、それまでの一つの害を除くことに専念したほうがよいことをいう。
```
例えば、健康という目標に向かって、ジョギングしようと言うのではなく、まず煙草をやめようと提案します。
この様にする事で最悪の失敗は免れながら自分なりの良い部分を加えていく様になります。
プログラミングでもセキュリティ周りの最悪の部分は、対処してもらいながら、再利用性や速度部分は、ある程度メンバーに委ねる訳です。

## やり方ではなく、考え方をインストール
これにより再現性が高まります。どういう事かというと考え方を教えているので、同じ様な仕事の場合は自分で解決する事が出来ます。考えて覚えているから対応力が上がってるためです。更に似た様な仕事でも自分で考えて結果を出せる様になってきます。やり方ではなく、考え方をインストールした結果です。
当然、失敗する事あるかもしれませんが、失敗を責めたら駄目です。一緒に反省し、次につなげます。その決断のプロセスを確認し、エラーを解消します。今回の反省でなく、次回のための回避策を検討を行います。

## 暇に慣れろ
このプロセスは我慢するのが超大変です。メンバーが考えている間、答えが分かっていても我慢します。ミスすると分かっていても我慢します。ストレスが貯まるし、待っている間は暇です。それでも我慢します。口を出してはいけません。我慢している事を悟られてもいけません。
タイトルの**暇に慣れたら一人前！**ですが、**成れたら**ではなく**慣れたら**です。
CTO＆マネージャは、少しでも時間が空くと、目の前のタスクがつい気になってしまいます。何かしなきゃいけないんだと焦ってしまいます。
CTO＆マネージャがやるべきは、自分の時間が空いたら次の組織の成長に向かって考えたり、人とあったり、新しい情報収集したり色々をやる事は沢山あります。目の前のタスクがつい気になりますが、CTO＆マネージャーが本来やるべきタスクを認識し、次のステージを目指しましょう。
CTO＆マネージャが成長してこそ、組織が次のステージにむかって成長します。

# 最後に
今後も続けていきますので、フォロー、イイね、シェアお願いします。
下記、説明会もご参加下さい。
[エンジニア年収アップ講習(転職サポート付き！)　無料説開会　12月6日　19時開催](https://cto-can-be.hp.peraichi.com/)
Process AdvisorからPower Query

# はじめに
　Power Automateの一機能「Power Advisoer」のログを読み出す機能が、SharePoint等多様なデータソースからのデータ読み出しに対応し、Power Queryで整形することもできるようになりました。
　また先日からデスクトップアプリ「Minit（ミニット）」も登場しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/35f9b989-ac98-6a19-8dbc-aa43c4935e10.png)

## ログデータへの接続
　「ここから開始」よりデータを選択しし、プロセス名をつけます。
次の画面でデータを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/ad8fa872-c656-123d-b652-9c870edb3f6e.png)

## Power Queryで読みだしたところ

Power BIでもおなじみの画面ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/7c9d872e-f23e-7513-2cb8-1f7c7f161127.png)

ログデータから、分析に不要な列は削除するなど見通しがよくなるようにします。

ログにアクセスできたら項目をマッピングして、分析にかければOK

詳しくの[LearnのDocs](https://learn.microsoft.com/ja-jp/power-automate/process-mining-tutorial?WT.mc_id=DP-MVP-5004418)へ

https://learn.microsoft.com/ja-jp/power-automate/process-mining-tutorial?WT.mc_id=DP-MVP-5004418

## デスクトップアプリ「Minit」
　非常にみやすい形で処理時間が見えたり、各種処理を絞り確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/c640e03f-8beb-c035-6cff-a68715a80ba6.png)


# おわりに
　各種アプリ、SaaSなどのログからプロセスの状況を可視化したい、というときはProcess Advisor、便利です。
Power Automate for Desktopでの利用は前川さんの記事が詳しいです。

https://qiita.com/maekawawawa/items/9a25ab695b966f4ca558
Teams で改行について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。

[Slack仕草 - Qiita](https://qiita.com/e99h2121/items/6a6f06cfaf4a74fca0f3)
[Slack仕草 - 補講 - Qiita](https://qiita.com/e99h2121/items/6e8fe9861b5bd9021487)

のような Slack 使いだった筆者の感想を述べるメモです。Slack では

[Enter キーの設定を行う | Slack](https://slack.com/intl/ja-jp/help/articles/115005523006-Enter-%E3%82%AD%E3%83%BC%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86)

- 設定から、Enter キーの操作を切り替える

... ということができたわけだが、Teams ではこうなる。
[Microsoft Teams での改行方法、再編集をわかりやすく解説 - Microsoft for business](https://www.microsoft.com/ja-jp/biz/smb/column-teams-re-editing.aspx)

- Shift + Enter で改行
- 書式設定モードにして自由に編集できるようにして改行

> 誤送信メッセージを編集する方法
誤送信したメッセージを編集したい場合は、削除と同様の操作でメニューより「編集」をクリックします。

> また、誤送信したチャット メッセージをすばやく編集したいときは、「新しいメッセージの入力」フォームに、[↑]  (上向き矢印キー) を入力することで、誤送信したメッセージを編集できます。
> ※投稿メッセージの場合は、「返信」フォームに [↑] を入力することで編集が可能です。

なるほど誤送信しても慌てるなと... 
多少のことでは慌てなくなりました。こんなかんじでゆるゆると今年私が知らなかったことを書いていこうと思います :christmas_tree:
【WordPress】WordPressの仕組みとディレクトリ構造

# はじめに

前回の記事で、WordPressめっちゃ簡単よ〜って言ってますが、いくら簡単にWebサイト作れるんだよ〜って言っても、
それだけで終わってたら、ただのマニュアルになってしまうので、少し裏側についても知識をつけましょう。

https://qiita.com/raptony110/items/63e199ca67ec2368b1ec

今回は、WordPressの仕組みについてです。
WordPressを動かすのには、何が必要なのでしょうか。

:::note warn
【非エンジニアの方へ】
今回の記事は頭に「？」がいっぱい浮かぶ内容となっている可能性があります。
今回の記事内容を知らなくても、次回以降の記事は理解できますし、Wordpressは扱えるようになります。今回は無理に理解しようとせず、流し読みしたり、スキップするのもアリだと思います。
:::

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# WordPressを動かすのに必要なもの
環境として準備しなければいけないのは大きく、WebサーバーとDBサーバーの2つです。
と言っても、後日の記事でご紹介しようと思っていますが、レンタルサーバを利用する場合、ボタンをポチポチするだけで、簡単にこれらを準備することができるサービスが用意されていますので、何も構える必要はありません。
- Webサーバー
    - 前回の記事でも、さらっと触れましたが、WordPressはPHPで記述されているので、PHPが稼働できるWebサーバーが必要です。自前でサーバーを立てても良いですが、最も簡単なのはレンタルサーバーを利用することです。
- DBサーバー
    - WordPressで投稿した記事の内容を格納するために、データベースMySQLを利用しています。

# WordPressのディレクトリ階層
WordPressをインストールするとディレクトリとファイル群が作成されます。ざっくりと以下のような階層になっています。
この構造についての知識があると、障害の発生や、期待通りの動作にならなかった時に調査する助けになるはずです。
次のキャプチャは実際にWordPressをインストールしたディレクトリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/ee889fe1-fba5-3fe2-c672-e6aaa1c1e0b9.png)


```:Wordpressのルートディレクトリ
WordPress
 ┗ wp-admin : WordPressにログインした先に表示される管理画面を作成するファイルが格納されています。
 ┗ wp-content : WordPressからアップロードしたファイルや、ダウンロードしたテーマが格納されています。
 ┗ wp-includes : WordPressやテーマのから読み込まれる関数群が格納されています。
 ・・・ 
(ファイル群) : 最終的にHTMLファイルを生成するPHPファイル群です。
 ・・・ 
```


# おわりに
いかがでしたでしょうか。今回の記事は、補足的な記事の位置付けです。WordPressを利用する上で知っておいて欲しい情報ではありますが、知らないとWordPressを扱えないというものでもありません。
簡単に、WordPressがどんな技術で動作していて、大雑把にどんなファイル構成になっているのかなんとなく知っておく程度で良いと思います。

次回からは、いよいよ具体的に手を動かしながらWebサイトの構築をご紹介していこうと思います。
AITemplate のビルドと実行のメモ(Stable Diffusion 推論速くしたい)

https://github.com/facebookincubator/AITemplate

名前がいけてないのでぱっと見だとようわからんですが,
network を CUDA/HIP, C++ コードに変換して推論速くする試みです.
cuDNN なども使わないので. 単体で ML をぺろっと GPU サーバに入れて推論サービス提供したり,  CPU サーバなどでも動かせるようにもなります.
(cuew https://qiita.com/syoyo/items/57c4d2fbbae78b25b2cf あたりと組み合わせて, デスクトップアプリに組み込んでみるのもできるかもしれません)


## ビルド

一応 pypi にもパッケージありますが, 著者環境では python のバージョン違いかなにかでうまく動きませんでした.

`python/` フォルダで `python setup.py bdist_wheel` でビルドするか,
README にあるように docker でビルドが推奨のようです.

https://facebookincubator.github.io/AITemplate/install/index.html

### ROCm は修正必要だがうまく動かなそう

https://github.com/facebookincubator/AITemplate/issues/91

official だと ggemm_gen_profiler() takes 3 positional arguments but 4 were given となりました.

https://github.com/ROCmSoftwarePlatform/AITemplate

ROCm のフォークを使いましょう.
フォーク版は CDNA2 のみ対応とありますが, 一応 RDNA1 系も動くようなきもします.
ただ, ROCm AITemplate はもう少し成熟が必要そうです.


普通に apt で入れるだと hsa あたりのシンボルが見つからないとかあるので, docker ビルドが推奨です.
(docker だと ROCm あたりソースからもろもろビルドするのか 1 時間くらいかかります...)

また, Radeon VII(gfx906)や RDNA2(e.g. RX6800 gfx1030)だと, detect では考慮していないので実行エラーになります.

https://github.com/facebookincubator/AITemplate/blob/8c158f54278975a074f9cadf12982bcba259436d/python/aitemplate/testing/detect_target.py#L50

適当に修正いれて gfx906 とかに擬態すればいけると思います.

まずは `examples/06_how_to_add_an_op` が動くか確認しましょう.
 
あと, profiling 用に cpp をコンパイルしますが hipcc だとコンパイルが遅いため時間がかかります.

T.B.W....

### Stable diffusion

`python compile.py` を実行するだけです(huggingface-cli などでログインはしておく)

T.B.W.



## CUDA で実行してみる.

いろいろスクリプト書かないといけないのでめんどいです.

とりあえず `examples/01_resnet-50/benchmark_ait.py` を実行すればなんか動きますので, これを参考にしていろいろ組んでいくとよいでしょう.


## TODO

* [ ] Stable diffision の処理とベンチマーク取ってみる
PMMPサーバーを運営してみて、得られたもの

# はじめに
どうも初めまして、今年はPMMP4.xがリリースされ、ある意味忙しく大変な一年でした。
今回はこれからPMMPのプラグインを開発する人、その予定の人、プラグインは開発しないけど鯖運営してみたいという方向けの記事のはずです。
僕がPMMP鯖を2年程運営して感じたことや大変だったこと、やりがいのあったことなどを書いていきますので参考程度にどうぞ。
あくまでもプラグイン開発者視点であるので、そこはご了承ください。

# そもそもなんでPMMP？
結論から言ってしまうと、バニラのソフトがあまりにも使いづらかったというのが理由です。
色んなプラグインを使用してサーバーを好きに構築できるPMMPはBEの中でも一番のサーバーソフトだと思います。

# PMMP鯖を運営して大変だったこと
- バニラのエンティティ・ブロック・アイテムなどが一部追加されていない問題
  非公式である以上仕方ない所ではありますが、バニラに慣れているプレイヤーだと不自然に感じる事があるかもしれません
  僕は何度か実装を試みましたが、心折れたのでPM5になって誰かが作ってくれることを祈ろう
- プラグイン開発者減ってない？問題
  なんか昔よりも減っているような減っていないような、ただ日本人の開発者は中々見ないです、僕は1人でプラグインを開発していましたが、かなりきつかったです
- 大規模アプデがあった時に色んなプラグインが使えなくなってしまう問題
  これは本当に開発者によりますが、PM3からPM4にアプデされたときはそれなりの量のプラグインがアプデされず終末を迎えたと思います
  特にEconomyAPIの廃止はかなり痛かった思い出

# PMMP鯖を運営して得られたもの・やりがいのあったこと
- プレイヤーが「楽しい」等と言ってくれたこと
  本当にこれがモチベでした、多分これがなかったらプラグイン開発投げ捨ててただろうな(笑)
- バニラとは一味違うマイクラを楽しめていた
  バニラじゃ絶対できないであろう事を色々やっていました、それで楽しめていたのなら本望です
- 何気にプログラミング知識が身についた
  PHPなんもわからない状態から始めたので、PHPの知識はもちろんのこと、MySQLの知識までおまけでついてきました
  何気に一番これが大きいかな

# まとめ(というかその後)
僕の開発精神が死にかけだったのもあり、結局PMMP鯖からJava鯖に移行しました。
結論
### **Java鯖最高ー！**
です、タイトル詐欺ではないですよ。
でもJava鯖にした瞬間解放された感じが半端じゃなかったです、
プラグインも山のようにあるし、エンティティもスポーンするし。
PMMPに慣れすぎて、「Mobが動いている、アイテムも全部ある、すげー」ってなってました。
ただそれを考えると、PMMPも中々すごいんだなってなりますね、
これだけ開発を続けているのもあって、ある意味の憧れでもあります。
さて、2023年3月にPM5のリリースが予定されているようで楽しみです。
僕自身がPMMPの鯖運営に戻ることはないと思いますが、また遊びでプラグインを作るかもしれませんね。
とりあえず、今までお疲れ様自分と、これからPMMP鯖を運営したりプラグインを開発する人は頑張れ！
努力するものは報われるはずですので、本当に頑張ってください。
初記事で読みづらかったり誤字脱字していたら申し訳ないです、最後まで読んでくださりありがとうございました！
【PostgreSQL】列名が存在するかを確認する

Postgreを使ったバックエンドプログラムで汎用性のある関数を作るとき、引数で指定された列が実在しているか確認したいですよね。
そんなときはこうです。（通常のSQLとは違います）

```
SELECT EXISTS (SELECT * FROM information_schema.columns WHERE table_name = N'テーブル名' AND column_name = N'カラム名') 
```
TransitGatewayについて

# 本記事について
この記事では３回目のANS-C01を受けるにあたって勉強した内容を整理するための記事です。
詳しくは[こちら](https://qiita.com/the13-HK/items/349cdf5f38e0ce1e47b1)をご覧ください。
今回はTransit Gatewayの記事となります。

# Transit Gatewayとは
Transit GatewayはVPCやオンプレ間の通信をハブ＆スポーク型でルート管理するリージョナルサービスです。
TransitGatewayを使用する際は使用するリージョン毎にTransitGatewayを設置します。
TransitGatewayにアタッチできるサービスは以下
- VPC（リージョン内のみ）
- Direct Connect
- VPN
- 別リージョンのTransitGateway(Transit Gateway Peeringにより接続)

# Transit Gateway内のルート制御
アタッチしたリソース毎に１つルートテーブルを設置可能。
リソースからのTransitGatewayに送られた通信はリソース毎のルートテーブルのレコードをもとにルート先を決定する。
ルート決定時の優先順位は以下の通り
- 基本はロンゲストマッチ
- もし同じCIDR向けのルートが複数あるなら
    - 静的ルートが動的（Propagatedな）ルートより優先
    - 動的ルート間ではVPC＞Direct Connect Gateway＞VPNの順で優先

 # VPC Peeringとの比較
単にVPC同士をつなげるだけであれば、VPCPeeringでつなげる、という選択肢もある。
VPCPeeringに対するTransitGatewayのメリットは以下
- 複数VPC間の通信を可能とする場合、対象のVPC数が増えれば増えるほど管理が容易になる
    - N個のVPCメッシュを作成する場合、
        - VPCPeeringは（N-1）＋（N-2）＋・・・＋１個のVPC接続設定が必要
        - Transit GatewayだとN-1個の接続設定で良い。

- アタッチできるVPCの最大数が大きく異なる
    - VPCPeeringは125に対して、TransitGatewayは5000
ArduinoJson:ネストした配列に要素を追加する

M5StackでArduinoJsonでJSONをデータファイル的に使おうとしていたのですが、
探し方が悪いせいか見つからなかったのでドキュメントを読んでコネコネしてたらできるようになったので備忘録として残します。

操作するJSONはこんな感じです。

```json
{
  "json": [
    {
      "id": "000",
      "uid": "764D6925",
      "scandate": " 2022/11/23 03:33:33",
      "expire": "1669401213"
    }
  ]
}
```

トップレベルの"json"は必要なかったんですがdeseriarize出来なかったので追加しています。

M5StackのSDカードからdata.jsonを読み込んでdeseriarizeします。
SDカードではなくSPIFFSとか使うなら読み替えてください。

手順としては
・streamからdeseriarizeしてJsonDocumentを取得する
(deserializeするとFileオブジェクトに書き込めなくなるので開きなおす)
・既存のJSONのid要素を取得する→searchNewestId()
・追加する配列要素のJsonDocumentを作成(idを+1する)
・deseriaizeしたJsonDocumentから"json"をrootとするJsonArrayを取得
・JsonArrayにadd()する

になります。

```cpp
 
  // SDカードから読み込む
  File f = SD.open("/data.json");

  DynamicJsonDocument jsonDocument(1024);
  // deseriarizeする
  DeserializationError error = deserializeJson(jsonDocument, f);
  // deseriarizeするとFileオブジェクトに書き込めなくなるので一度開きなおす
  f.close();
  File f = SD.open("/data.json");

  if (error) {
    // data.jsonが空

    Serial.print("data.json is empty.\n");
    Serial.println(error.c_str());
  }
  else {
    // deseriarize成功
    Serial.print("deserialized:\n");
    // serializeJsonPretty(jsonDocument, Serial);
    // Serial.println();
    // 一番古いidを取得
    int newestId = searchNewestId(jsonDocument);
    Serial.printf("newestId:%d\n", newestId);

    // rootを"json"とする配列を取得
    JsonArray jsonArray = jsonDocument["json"].as<JsonArray>();
    // 追加する要素を作成
    JsonObject obj = jsonArray.createNestedObject();
    char buf[4];
    sprintf(buf, "%03d", newestId + 1);
    obj["id"] = buf;
    // json_0["uid"] = data.uidChar;
    obj["uid"] = "12345678";
    obj["scandate"] = "2022/11/23 03:33:33";
    obj["expire"] = "1669401213";


    // jsonを表示
    serializeJsonPretty(jsonDocument, Serial);
    Serial.println();
    // SDカードに書きこむ
    serializeJsonPretty(jsonDocument, f);
    Serial.printf("JSON Wrote to SD Card\n");
  }
  f.close();

int searchNewestId(JsonDocument &jsonDocument) {

  // "json"をrootにする配列を取得
  JsonArray array = jsonDocument["json"].as<JsonArray>();
  int size = array.size();
  // Serial.printf("array size:%d\n", size);

  // 配列の最後の要素を取得
  JsonObject object = array[size - 1];
  // id(文字列)を取得してintに変換
  const char *json_item_id = object["id"];
  int jsonIdInt = 9;
  sscanf(json_item_id, "%d", &jsonIdInt);

  // Serial.printf("jsonId:%s\n", json_item_id);
  // Serial.printf("jsonIdInt:%d\n", jsonIdInt);
  return jsonIdInt;
}

```
paizaラーニング「約数の列挙 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__divsor_print
#### 私の解答
```Python3
n = int(input())
for i in range(1, n + 1):
    if n % i == 0:
        print(i)
```
#### 解答例
```Python3
N = int(input())

for i in range(1, N + 1):
    if N % i == 0:
        print(i)
```
ほぼ同じ解答でした！
GitHubを使って共同制作したい

[【完走目指す】初心者が25日で強くなる Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aruhitoganbaru)3日目です。
## １日目に書いた内容
[GitHub使ってみる](https://qiita.com/Aruhimanahito/private/ec3741abbcf44374d884)
・リポジトリの説明
・エラー対応

肝心のやり方について書いていなかったので３日目はやり方を書き残しておきます。
多分これでできます。
## やり方
#### 1.GitHubのサイトに行き、サインインします。
![スクリーンショット (70).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/607168ed-20e4-876a-8b99-5227061fce53.png)

画像の右上です。
#### 2.Start a new repositoryにある、緑のボタンを押します。
![スクリーンショット_20221201_011503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/ea15527c-0fc6-17aa-4fdc-9cec5706fd51.png)
緑のボタンを押しましょう。
#### 3.リポジトリを作ります。
![スクリーンショット_20221201_012010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/5bc88288-45d4-7f51-5c7f-07ea8b260195.png)
以下は画像の説明です。
Owner : 所有者（自分のアカウントでいいと思います。）
Repository name : リポジトリに好きな名前が付けられます。
Description : 説明です。必要なら書きましょう。任意です。私は書きませんでした
選択肢はpublicでいいと思います。
Add a README file : あっていいと思います。
Add .gitignore : unityを選びましょう
choose a license : Noneでいいです。
緑のボタンを押しましょう。
ここで作られるリポジトリは、「リモートリポジトリ」です。多分。
### 初回の人について
確か初めての人はこの画面にならなかったと思います。
![スクリーンショット (71).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/90bf752d-13ac-2415-41a5-72dce99d50e9.png)
確かQuick Setupとかいう画面が出てたと思います。
なんか画面が違うという人は、４からの作業をやらないと次に進めなかったと思います。
ですが、その画面がどうしても再現できなかったので覚え書きで書いていきます。

ちゃんとリポジトリができて、写真と同じ画面が出る人はこの操作は不要です。6までスキップしてください。（４の作業はやってもいいと思います。やんなかったらどうなるか自分はわからないので。）

#### 4.git bashをパソコンに入れます。
![スクリーンショット_20221201_015818.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/2c42f6ef-2ede-76e2-678b-3d705230c2f4.png)
入れたら開きます。
#### 5.コマンドライン（上のやつ）を一文ずつコピペしていきます。
残念ながら画像がありません。用意できませんでした。
さて、うまくいったでしょうか。
#### 6.GitHub Desktopをダウンロードします
![スクリーンショット_20221201_010342.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/6c1daccc-3e51-cd28-de43-404a198fd2bd.png)
開きましょう。
#### 7.clone repositroyから、さっき作ったリモートリポジトリを選ぶ
選んだらcloneを押してください。
勝手にリモートリポジトリの中身がパソコンに入ってきたと思います。
これが「ローカルリポジトリ」です。

おめでとうございます。セットアップ終了です。
unityのプロジェクトは容量が大きいので、エラーが出たら[一日目](https://qiita.com/Aruhimanahito/private/ec3741abbcf44374d884)を参照してください。
## 共同制作
パソコンAから、pushしてデータAをリモートリポジトリに入れます。
![3-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/bce26607-c637-9d39-2765-d70618f1db56.png)
パソコンBが、pullしてデータAをローカルリポジトリに追加します

![3-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961125/cc82d0d6-2c47-0c5e-4e49-6e8f329b077f.png)
こんな感じで、パソコンAで作ったデータAをパソコンBに移せます。
おそらくこれが共同開発のやり方です。

## 注意事項
何かしら作ったら、こまめにpushしておきましょう。
もしパソコンが壊れても、ほかのパソコンで続きができます。（バックアップみたいなもんです。）
コミットするとき、何を変更したかちゃんと書きましょう。
ほかの共同制作している人が、何も知らないでいると中身が変わっていたりしてトラブルのもとになるでしょう。
相手に分かるように、何を変えたかは書いておきましょう。

## 最後に
githubの説明終了。
誰が見てもわかるように工夫はしたので、これを見てやってみる方は頑張ってください。
３日目終わり。
Windows11にUbuntuをデュアルブートしようとしたら苦戦した話

# ■ はじめに

この記事は [CDLE youth Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cdleyouth) 8日目の記事です。

他のサイトと言っていることは変わりません（というか他のサイトを参考にしてやったので）。
その中でもこの記事で言いたかったのは、**BIOS の設定が大事だよ！** ということです。
色々生じた問題を解決するために BIOS の設定を変更しなければならないことに気付くのに時間がかかったので、皆さんには同じように時間を無駄にしてほしくないという思いから記事を書いています。

参考：https://www.youtube.com/watch?v=NQjecsC4y-w

# ■ 環境

* メーカー：mouse
* OS：Windows 11
* 新規で入れる OS：Ubuntu 20.04

# ■ インストール用 USB の作成

以下の手順で Ubuntu のインストールディスクの作成を行います。

1. [ここ](https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/#:~:text=Download%20Universal%20USB%20Installer%20(UUI)) から Universal USB Installer をダウンロード
1. [Ubuntu Desktop 日本語 Remix のダウンロードサイト](https://www.ubuntulinux.jp/products/JA-Localized/download) からインストールしたいバージョンの OS を選択
1. ubuntu-ja-xx.xx-desktop-amd64.iso をクリックしてダウンロード
1. 1 でダウンロードした Universal USB Installer を起動
1. 以下の通り Universal USB Installer で適宜オプションを選択して Create ボタンから USB を作成します。
    * Step 1：Ubuntu
    * Step 2：3 でダウンロードした ISO ファイルを選択。
    * Step 3：インストールディスクにするための USB を選択。Will Fat32 Format にチェックを付ける（フォーマットされるので注意）。

# ■ Windows がインストールされているドライブに空き容量を作る

1. Windows ボタンを右クリック、「ディスクの管理」を選択。
1. Windows がインストールされているドライブを右クリックして「ボリュームの縮小」から空き容量を作成する。

# ■ Ubuntu のインストール

1. BIOS で USB の起動優先順位を最初に設定する。
1. <font color="Red">Boot オプションから Secure Boot を Disabled にする。</font>
1. 通常通り Ubuntu のインストールを進める。
1. 「インストールの種類」で「Ubuntu を Windows とは別にインストール」を選択しインストール。

# <font color="Red">■ Ubuntu の起動優先順位を高める</font>

これについて、他のサイトであまり触れられていない気がしました。苦戦しました。
マザーボード、BIOS によっても違うから書かれている記事が少ないのかなと思いますが、以下の操作を行います。
<font color="Red">**BIOS で Settings > Boot > UEFI Haed Disk BBS Properties に入り、Boot Option #1 に Ubuntu を設定する。**</font>
Ubuntu のインストール後、GRUB のブートする OS を選択する画面が出てこない原因はこれでした。デュアルブート直後は Windows の優先順位が最高に設定されていました。
![127535.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/2174c6d2-fa85-42eb-add2-c33243a887a8.jpeg)


# ■ 発生した問題

以上の手順でデュアルブートの方法の説明は終わりですが参考までに。

## USB の起動優先度を高めてもインストール画面が表示されない

実は過去に Windows 10 と Ubuntu 18.04 のデュアルブートをしたことがあり、その時と同じ手順でインストール用 USB を作成したのですが、Ubuntu のインストール画面が表示されないという事象が発生しました。

- Ubuntu インストール用の USB 作成に使用したソフト：[UNetbooin](https://unetbootin.github.io/)
- ISO ファイルのバージョン：Ubuntu 18.04（04 の後の詳細は忘れました）

ソフトが悪かったのか、ISO ファイルが悪かったのかわかりませんが、上で紹介した Universal USB Installer の方が安心できそうです。

# ■ さいごに

先日、デュアルブートした環境に別のバージョンの Ubuntu をインストールしたので、その時の記録もまた今度書こうと思います。
【GitHub】草生やしでお絵描きしよう！

# はじめに

この記事は [CDLE youth Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cdleyouth) 6日目の記事です。
今回は趣味の家庭菜園が、いつしかインターネット上に移り変わり GitHub の草生やしをモチベーションに生きることになっていた私が、小ネタとして草生やしでお絵描きをする方法について紹介します。
GitHub リポジトリは [こちら](https://github.com/masachika-kamada/commit-pattern)

# 草を生やす

GitHub で「草を生やす」とは、[Contributions calendar](https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-settings-on-your-profile/viewing-contributions-on-your-profile#contributions-calendar) に記録を残すことです。GitHub でコントリビューションが記録されると、その日の Contributions calendar の四角が緑色になるため、「草を生やす」と呼ばれています。下が私の Contributions calendar の画像です。4 月に就活を始めた辺りから意識して草を生やすようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/59a52134-c0f7-a300-0d46-be6ed6622c21.png)

# 草でパターンを作成する

誰でも思いつきそうなことですが、草を生やす日を調節してパターンを作ったらおもしろそうだなと思いました。でもそれを実際にやろうとすると長期間でスケジュールを立てて計画的にコントリビューションを作成する必要があり大変です。
そこで今回使用したのが、コミットを修正する `git commit --amend` と `git rebase` です。このコマンドを使うことで、好きな日にちにコントリビューションを作成することができます。しかも、GitHub アカウントを作成するよりも前にもコミット履歴を作れてしまうんです。

# 使い方

リポジトリをクローンしてからメタデータ(.git)を削除し、自分のリモートリポジトリにプッシュする。
```bash
git clone https://github.com/masachika-kamada/commit-pattern.git
cd commit-pattern
rm -rf .git
# 以下、新規プロジェクトをリモートリポジトリにプッシュする操作を行う
git init
git remote add origin ....
```

次に草を生やすパターンを pattern.csv という名前で作成する。pattern.csv.sample を参考にして作成する。草を生やしたい箇所に 1 を入力して保存する。例えば、pattern.csv.sample を Excel で開き、条件付き書式で 1 が入力されているところを緑色に色付けしてみると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/402cfd54-454d-54ad-09c7-8df586cb76de.png)
草生やしの起点となる年月日を指定する。main.py の中の以下の箇所を書き換える。
```python
START_YEAR  = 2020
START_MONTH = 1
START_DAY   = 12
```

以上の操作が完了したら、草生やしを実行する。
```bash
python main.py
```

# 完成

私のプロフィールの [2020年の草](https://github.com/masachika-kamada?tab=overview&from=2020-12-01&to=2020-12-31) は下の画像のようになりました！
![image](https://user-images.githubusercontent.com/63488322/201467797-101f3058-4419-4187-a48c-1edbc99ae7ad.png)
paizaラーニング「約数の個数 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__divsor_count
算数で習った、約数の定義を忘れてしまったので、グーグルで調べてみました。
算数パラダイスというウェブサイトに『余りが０になるものが約数なので、１０の約数は１，２，５，１０です。』と書かれていました。そこで、１から順にあまりが０になるものをリストにし、len関数でその数を求める事にしました。
#### 私の解答
```Python3
n = int(input())
a = []
for i in range(1,n+1):
    if n % i == 0:
        a.append(i)
print(len(a))
```
#### 解答例
```Python3
N = int(input())

div_count = 0
for i in range(1, N + 1):
    if N % i == 0:
        div_count += 1

print(div_count)
```
Flutterのから始めるOSSコードリーティングのススメ

# Flutterのコミットを1ヶ月読んで

この記事はiPresence合同会社 Advent Calendar 2022 の12/1の記事です。

##  はじめに

1ヶ月ほど前(厳密には11/6)からGitHubの[Flutterリポジトリ](https://github.com/flutter/flutter) のmasterブランチに入るコミットを読んで[note](https://note.com/723ch)にまとめるという趣味をはじめました。
始めたきっかけは今までFlutterのコードリーディングはしていたのですが、  
規模が大きく(FlutterのWidgetの実装,エンジンの実装、コマンドツールの実装etc etc)読み続けるのがしんどい、間があくとそこまで読んできた全体像がぼやけてしまう 
などモチベーションの維持が出来なくなってきたため、Ruby on Railsのコミットを毎日読まれている[なるようになるブログ](https://y-yagi.hatenablog.com/)を参考に  
全体のコードを読むことをやめその日に変更された内容だけ読むようにしてnoteにまとめるようにしてみました。

この1ヶ月弱コミットを読んで感じた事わかったことなどを少し書いていこうと思います。  

## コミットの種類

まず現在masterブランチに取り込まれているコミットにはいくつかパターンがあることがわかりました
そのパターンを紹介します

### 不具合の修正

これは言わずもがなFlutter全体にある不具合の修正をしたコミットです。
大体がissueに報告された不具合を修正してPRとして提案されたものがmasterに入っていきます

例: [Fix iOS selectWordEdge doesn't account for affinity (#115849)](https://github.com/flutter/flutter/commit/224fae50638a4920896b74d55d74d707b8382774)

### 新機能の実装・アップグレード

これはこの1ヶ月だと大きな新機能の実装はありませんでした。  
ですがあるWidgetに対して新しいパラメータが追加されかゆいところに手が届く様になったコミットがいくつかありました

例: [Use the new pushImageFilter offset parameter to fix the transform of the children (#113673) (#115884)](https://github.com/flutter/flutter/commit/0eb2d51ec9919216127f942cf24d3ddd178ff302)

### デザインの追加・修正

これは主にMaterial Design の最新版 [Material3](https://m3.material.io/) に対応するためのコミットが多いです。  
Material3で新たに追加された要素に対してのWidgetの実装や Material2からデザインが変わった内容の修正だったりします。  
個人的にこのパターンのコミットがコードを読んでて一番わかり易いです(Widgetのデザイン対応なため)

例: [Add Material 3 support for Slider - Part 2 (#114624)](https://github.com/flutter/flutter/commit/ac06523b74ff3368fd5d2b969a92d610545a1a81)

### flutter toolの更新・修正

これは `flutter run` などflutterのコマンド周りの追加や修正をしたコミットが主です。
新しいオプションフラグの追加や出力内容の修正など様々な内容がありました。

例: [https://github.com/flutter/flutter/commit/ac06523b74ff3368fd5d2b969a92d610545a1a81](https://github.com/flutter/flutter/commit/459391708effcec8c15bab4ae7ba9ef056e77116)

### CI/testの修正

更新され追いついていなかったテストの修正やciの設定の変更などがコミットされます。  
主にCIの調整や特定の条件下で失敗するテストがあった際の条件追加などがあります。

例: [[cirrus] Disable outside of tip of tree (#115774)](https://github.com/flutter/flutter/commit/bd0115f04d08ea1c3519c0325ac8bb18255fa92f)

### マージされたコミットの取り消し

masterに取り込まれたコミットを取り消すための修正が入ることがあります。
取り消される理由としてはテストの不備、実装で条件が満たせていない...など様々ですが 
実装 → 取消 → 再実装 → 再度取消... など何回かその実装と取消のやり取りが続くことがあって読んでて楽しいです。

例: [Revert "Use the new pushImageFilter offset parameter to fix the transform of the children (#113673)" (#115861)](https://github.com/flutter/flutter/commit/9bb07b5f7047f33f69b119fc8dbec94ac6541b68)

## 読んでいて感じたこと

コミット単位にすることで１度にコード読む範囲を絞れるので理解しやすくなる印象でした。  
特に不具合修正などはissueに現在起こっている不具合の手順が示されているので、実際に手元で再現してみて現状を知ってから修正したコードを読むことで
どのような対応を どこのファイルにしたのかが明確にわかります。  

また、今まで知らなかったコマンドのオプションやWidget、普段使っているWidgetの便利なパラメータの使い方なども知ることができる機会があり  
普段コードを書くだけではわからないことを読むことで知ることもできました。  

## まとめ

みんなOSSのコードを読んでみよう。  
特にユーザが多いOSSはメンテナンスが行き届いていてコードもきれいな状態が保たれていることが多いので 
自分のコードを見直すいい機会にもなったり、今まで知らなかった使い方に出会えるかもしれません。 

あわよくばそのままOSSへコントリビュートしてみるのもいいかもしれませんね(いつかやりたいと想いつつ私はまだできていない...)
自分のわかるところできるところからコードリーティングをはじめてみませんか？

明日はiPresence CTO の太田さんによる「PythonでGstreamerを使うためのOpenCV4.6.0のBuildについて」です。お楽しみに
C++とPythonのSTL対応表

# list - vector

C++では`#include <vector>`で利用する。

## 要素へのアクセス

例：インデックス1に10を代入し要素をプリント
- Python
``` Python
xxx_list = [0]*5
xxx_list[1] = 10
print(xxx_list[1])
```

- C++
``` C++
vector<int> xxx_list(5, 0);
xxx_list.at(1) = 10;
cout << xxx_list.at(1) << endl;
```
C++でも`xxx_list[1]`で要素アクセスできるが、範囲外での動作が不安定なので`at`を使ったほうが無難

## 末尾へ要素追加
- Python
``` Python
xxx_list = [0]*5
xxx_list.append(1)
```

- C++
``` C++
vector<int> xxx_list(5, 0);
xxx_list.push_back(1);
```

Pythonでは要素の追加に`+= [1]`の様な手法も使える

## 末尾から要素削除

- Python
``` Python
xxx_list = [0]*5
xxx_list.pop()
```

- C++
``` C++
vector<int> xxx_list(5, 0);
xxx_list.pop_back();
```

## 要素の長さを出力

- Python
``` Python
xxx_list = [0]*5
print(len(xxx_list))
```

- C++
``` C++
vector<int> xxx_list(5, 0);
cout << xxx_list.size() << endl;
```

# dict - map or unordered_map

C++ではそれぞれ`#include <map>`、`#include <unordered_map>`を宣言してから使う。

- dict, unordered_mapはハッシュを使った実装(要素の追加、探索などに平均$O(1)$だが最悪$O(n)$)
- mapは平衡二分探索木を使った実装(要素の追加、探索などに$O(\log n)$)

平衡二分探索木を使ったmap、multimapはx以下最大の要素を対数時間で探す事もできる。普通に有能。

## キーと値の追加

- Python
``` Python
xxx_dict = dict()
xxx_dict["A"] = 1
print(xxx_dict["A"])
```

- C++
``` C++
map<string, int> xxx_map;
xxx_map["A"] = 1;
cout << xxx_map["A"] << endl;
```

C++のmapはdefaultdictの挙動に似ていて存在しないキーを指定すると初期値が返ってくる。mapとunordered_mapで指定方法は同じ

## キーが存在するかどうかの判定

- Python
``` Python
xxx_dict = {"A": 1, "B": 2}
if "A" in xxx_dict:
    print(xxx_dict["A"])
```

- C++
``` C++
map<string, int> xxx_map = {{"A", 1}, {"B", 2}};
if (xxx_map.find("A") != xxx_map.end()){
    cout << xxx_map["A"] << endl;
}
```

## キーの削除

- Python
``` Python
xxx_dict = {"A": 1, "B": 2}
xxx_dict.pop("A")
```

- C++
``` C++
map<string, int> xxx_map = {{"A", 1}, {"B", 2}};
xxx_map.erase("A");
```

## forループによる処理

- Python
``` Python
xxx_dict = {"A": 1, "B": 2}
for k, v in xxx_dict.items():
    print(k, v)
```

- C++
``` C++
map<string, int> xxx_map = {{"A", 1}, {"B", 2}};
for (auto& [key, value]: xxx_map){
    cout << key << " " << value << endl;
}
```

# set - set or unordered_set

C++ではそれぞれ`#include <set>`、`#include <unordered_set>`を宣言してから使う。

- Pythonのset, unordered_setはハッシュを使った実装(要素の追加、探索などに平均$O(1)$だが最悪$O(n)$)
- C++のsetは平衡二分探索木を使った実装(要素の追加、探索などに$O(\log n)$)

平衡二分探索木を使ったset、multisetはx以下最大の要素を対数時間で探す事もできる。

Pythonで平衡二分探索木を使ったsetが使いたい時はtatyamさんによるSortedSetライブラリを引っ張ってきて使う。

https://github.com/tatyam-prime/SortedSet/blob/main/SortedSet.py

## 要素の追加

- Python
``` Python
xxx_set = set()
xxx_set.add(1)
```

- C++
``` C++
set<int> xxx_set;
xxx_set.insert(1);
```

## 要素が存在するかの判定

- Python
``` Python
xxx_set = {1, 2}
if 1 in xxx_set:
    print("exist")
```

- C++
``` C++
set<int> xxx_set = {1, 2};
if (xxx_set.find(1) != xxx_set.end()){
    cout << "exist" << endl;
}
```

## 要素の削除

- Python
``` Python
xxx_set = {1, 2}
xxx_set.pop(1)
```

- C++
``` C++
set<int> xxx_set = {1, 2};
xxx_set.erase(1);
```

## forループによる処理

- Python
``` Python
xxx_set = {1, 2, 4}
for x in xxx_set:
    print(x)
```

- C++
``` C++
set<int> xxx_set = {1, 2, 4};
for (auto& x: xxx_set){
    cout << x << endl;
}
```

# まとめ

Python記述楽だけど遅い。C++とにかく速い。

著者のC++練度上がり次第、足していきます。
Orthoverse∅使い方　その1

# はじめに

ここでは、Orthoverse∅の空間アプリ開発者としての使い方を解説します。

# 場所とURLの紐付け　NFTのミント

[ミント用のサイト](https://ortv.tech/map.html)を開きます。あんまりいいインスタンスを使ってないので、いじめないでください。
ブラウザにMetamaskがインストールされている前提で進めます。

左上の「Enable Ethereum」ボタンを押すと、Metamaskが開いてアカウントが接続されます。
地図部分はドラッグ＆ドロップやスクロール操作で一般的なWeb地図と同じように操作できます。

ある程度拡大したところ（以下画像参照、これくらい拡大する）で、地図をクリックすると、四角い枠が表示され、
右側に座標と空間IDと、URLなどが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30257/7e73b55c-eae8-ca6f-2e63-7d771d9f955d.png)

もし、URLが表示されていなければ、その領域を表す空間IDは、誰にもミントされていない場所になります。
フォームの入力欄に紐付けたいURLを入力し、「Mint」ボタンを押してください。
Metamaskが起動し、ガス代＋ミント代の0.01Ethを払ってミントするか聞かれるので、問題なければミントしてみてください。
ただし、現在のシステムは、Gaueliテストネットを使っているので、Metamaskの対象ネットワークの設定はよく確認しておいてください。
（間違ってメインネットのEthをどぶに捨てても当方はなんら責任を負えません。Metamaskがうまくチェックしてくれるとは思いますが。）

成功するとその空間IDが表す場所にURLを紐付けたことになります。
しばらくして再度クリックすると、URLが反映されていると思います。
（トランザクションの遅延などですぐに反映されないことがあります。）

ミントすると、OpenSeaなどでも、所持していることが確認でき、なんなら売買などもできます。
ただし、現時点ではテストネットなので、[テストネット用のOpenSea](https://testnets.opensea.io)で開いてみてください。
画像としてミントした空間IDの地図が表示されます。

URLの表すWebページの作り方は次のポストで解説します。

# 注意点

あくまでプロトタイプのシステムなので、なにか変なことが起こっても生暖かく見守ってください。
本記事へのコメントなどでも教えてもらえると嬉しいです。

Gaueliテストネット用のEthの入手方法ですが、色々調べたところ、
[こちらのFaucet](https://goerli-faucet.pk910.de/)が個人的には使いやすかったです。
マイニングを手伝ってEthをもらうタイプです。

スマートコントラクトの情報は[こちら](https://goerli.etherscan.io/address/0x0D03EFbaccC2f53126bc832c66082ACaf5947B98)を参照してください。
paizaラーニング「1 はどこにある？ Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__seq_one
#### 私の解答
```Python3
n = int(input())
a = [int(x) for x in input().split()]
for i in range(n):
    if a[i] == 1:
        print(i + 1)
        i = i + 1
```
#### 解答例
```Python3
N = int(input())
a = list(map(int, input().split()))

for i in range(N):
    if a[i] == 1:
        print(i + 1)
```
CSS変数

# CSS変数 とはなんぞや
CSSカスタムプロパティ。使い回すCSSの値を変数として宣言しておける。

# 基本的な使い方

任意のセレクタ内で `--任意の名前: 任意のプロパティ値` のようにして変数宣言し、`var(--任意の名前)` のような形で呼び出す

``` scss
// 　宣言して　
:root {
    --bg-color: brown;
}
// 呼び出す
.hoge {
    background-color: var(--bg-color);
}
```
なお、名前は大文字・小文字を区別する

# 補足
CSSらしく、継承や上書きといった特徴を持つ。

### 親要素から継承する

こういうHTML構造だとしたら
``` html
<div class="wrapper">
    <h1 class="heading">見出し</h1>
    <p class="text">本文テキスト</p>
</div>
```

このようにCSSを書ける
``` scss
// 親要素で変数宣言して
.wrapper {
    --bg-color: brown;
}
// 子要素で呼び出せる
.heading {
    background-color: var(--bg-color);
}
```

### 上書きできる

メディアクエリと一緒に使うと便利
``` scss
:root {
    --bg-color: red;
}
@media screen and (min-width: 768px) {
    :root {
        --bg-color: green;
    }
}
.hoge {
    background-color: var(--bg-color);
}

// => .hoge要素は、ブラウザの表示エリアが768px未満の時は背景が赤色に、768px以上の時は緑色になる
```

### 代替値が定義できる
``` scss
.hoge {
  color: var(--my-var, red);
}

// => --my-var が定義されていなければ redが適用される
```

### calc() と組み合わせても使える
``` scss
:root {
    --side-space: 30px;
}
.wrapper {
    width: calc(100% - var(--side-space) * 2);
}
```

# よく使うシーン

コーディングを始める際に、最初にデザインをよ〜〜〜く見て、共通で使われている色やサイズ感等をまとめて変数化させる

``` scss
:root {
    // 色
    --color-primary: red;
    --color-secondary: green;
    // 文字サイズ
    --fs-sm: 14px;
    --fs-md: 16px;
    --fs-lg: 18px;
}
```

# 参考
https://developer.mozilla.org/ja/docs/Web/CSS/Using_CSS_custom_properties
【Azure】kaggleコンペで使うAzure AutoMLについて

# はじめに

この記事は [CDLE youth Advent Calendar 2022](https://qiita.com/advent-calendar/2022/cdleyouth) 4日目の記事です。
先日 [CDLE youth](https://sites.google.com/view/cdleyouthhp) で Kaggle の[Home Credit Default Risk](https://www.kaggle.com/competitions/home-credit-default-risk) に AutoML で参戦したのでそのときの記録を。
あまり整理されていませんが GitHub リポジトリは [こちら](https://github.com/masachika-kamada/kaggle_home-credit-default-risk)

# モチベーション

今回参加した Home Credit Default Risk のコンペでは、債務不履行の予測を行います。Discussions や Code を眺めて感じたのは、コンペで上位に食い込むには新しい特徴量を作成する必要があり、それを求めるには専門知識が必要であるということです。そんな世界は間違っている！！！ということで **専門知識がなくても高いスコアを出したい！** というのが今回のモチベーションです。

# Microsoft Azure

Azure とは Microsoft のクラウドコンピューティングサービスです。その機能の一つに自動 ML があります。これは、データセットと予測したいカラムなどを指定することで、自動で予測に適したモデルを作成してくれるというものです。ちょうど私が Azure の資格を取得したばかりだったので、Azure の自動 ML を使用して専門知識なしでよいスコアが得られないか、実験を行いました。目標は、「Azure が勝手にメダル圏内のモデル作ってくれる」です。
下は正攻法（普通にプログラムを書いて分析）と自動 ML の作業量を比較した図です。自動 ML が圧倒的にラクそうに見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/5c6834f4-9bea-3120-92c9-bbe3e63262cf.png)

# 実験

正攻法（Kaggleの上位解法）と自動 ML でそれぞれ学習～推論～サブミットを行い、精度を比較しました。プログラムの詳細は GitHub リポジトリをご覧ください。

Azure の自動 ML を行うための作業画面はこんな感じです（詳細は割愛）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/e1c7b6b8-a698-1259-30da-e0e55340b765.png)
自動 ML の結果画面はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/6ca245a9-cac0-3ba9-f8a5-b1688d0aa1f8.png)

# 実験結果

結局、自動 ML で正攻法のスコアを超えることはできませんでした。学習時間、学習アルゴリズムなどを変更すればもっとスコアを伸ばすことができるかもしれません。修業が足りないのかも…。（夢破れorz）

|  | private score | public score |
|:---:|:---:|:---:|
| 正攻法 | 0.79023 | 0.79136 |
| 自動 ML | 0.72756 | 0.73050 |

特徴量の重要度も全然違いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/873482/9d2f67e0-d0fd-2c98-f4ba-ecf24a059c88.png)

# まとめ

- 現実はそう甘くない
- 勝手にメダル圏内のモデルは手に入らない
- Azure についてもうちょっと勉強してみれば、もっと上が見えるのかも

# 悲報

リソース放置してたら学生が無料でもらえる100ドル分のクレジットが吹き飛んだので使えなくなりました。もう自力でやるしかありません(笑)
paizaラーニング「加算された数列の最小値 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__add_minseq
#### 私の解答
```Python3
n = int(input())
a = (int(x) for x in input().split())
s = []
i = 1
for ele in a:
    s.append(ele + i)
    i = i + 1
print(min(s))
```
#### 解答例
```Python3
N = int(input())
a = list(map(int, input().split()))

ans = 10000
for i in range(N):
    ans = min(ans, a[i] + (i + 1))

print(ans)
```
- 最小値を保持する変数の初期値は 10000 としていますが、例えば a_i が全て 100 だった場合、その最小値は 101 となるので、もし初期値を 101 より小さくしてしまうと、その場合に対応できません。101 以上でその変数に収まる範囲なら、どのような値でも構いません
paizaラーニング「加算された数列の最大値 Python3編」

https://paiza.jp/works/mondai/loop_problems2/loop_problems2__add_maxseq
#### 私の解答
```Python3
n = int(input())
a = (int(x) for x in input().split())
s = []
i = 1
for ele in a:
    s.append(ele + i)
    i = i + 1
print(max(s))
```
#### 解答例
``` Python3
N = int(input())
a = list(map(int, input().split()))

ans = 0
for i in range(N):
    ans = max(ans, a[i] + (i + 1))

print(ans)
```
解答例と比べて、私の解答は長すぎですね。
【WordPress】WordPressって何？こんな人にオススメ！

# はじめに
毎年参加を見送っていたQiita Advent Calendar。いきなり調子に乗って、一人完走をやってみることにしました！
もし、やりきれなかったら笑って笑
今回は、直近でWordPressについて書籍を2冊をほどインプットしていたのでアウトプットしていきます。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

それでは、クリスマス当日までお付き合いいただけたら幸いでーす^-^

# いきなりだけど、WordPressって、こんな人にオススメ！！
- 簡単におしゃれなWebサイトを、ササッと作成したい！
- Webサイトにかけるお金を節約したい！
- プログラミングの知識がない！
- デザインセンスも無いから、テンプレート使わせてもらいたい！

つまり、、、、お金も、コーディング知識も、デザインセンスも無い人にオススメな素敵なツールなんだぜ！

# WordPressとは
CMS（コンテンツマネージメントシステム）というジャンルのソフトウェアで、ブログやWebサイトを簡単に作成することができます。おしゃれなサイトのテンプレートが豊富に用意されており、WordPressを活用することで、非エンジニアでも簡単に操作することができるので、非常に人気なツールとなっています。
また、PHPで記述されており、知識がある方であれば、テンプレートを作成したり編集したりすることで、よりご自身の作りたいWebサイトに近づけることができます。
そして何より、無料で利用することができます。
WordPressで作成された企業のコーポレートサイトも数多く存在しているんですよ！
# WordPressのメリット
- 無料で利用できる
- 無料ブログや、無料レンタルサーバを利用した時のような広告がつかない
- おしゃれなテンプレートが豊富
- 素早くサイトを立ち上げることができる
- 利用者が多く、問題を解決する参考情報がネット上に多く存在する
- 非エンジニアでも簡単にそれなりのサイトを構築することができる
- プラグインを利用することで、複雑な機能でも簡単に実装することができる
- 初めからある程度のSEO対策が施された状態になっている

# WordPressのデメリット
メリットに比べればデメリットは圧倒的に少ないと思っていますが、強いて挙げてみます。
- 痒いところをカスタマイズする場合は、コーディングの知識が必要になる
- コードを直接メンテナンスする場合、WordPressの構造を把握していないと、予期せぬ不具合を引き起こす可能性がある（当然
- テンプレートごとで、カスタマイズできる項目が違う

# おわりに
次回は、簡単にWordPressの仕組みについて簡単に学びましょう！コードを触らない方も、どんな仕組みでWordPressが動作しているのか知っておくのは有益です。
それではまた明日〜
TypeScriptのGenericsについてまとめてみた

## はじめに
TypeScriptを勉強していく中で、Genericsに出会いました。今回は、そのGenericsというものがなんなのかまとめました。

::: note warn
TypeScript以外のプログラミング言語にもGenericsはありますが、今回はTypeScriptにおけるGenericsをまとめます。
:::

## TypeScriptのGenericsについてまとめてみた
Genericsが何であるか簡単にまとめると、型において引数のようなものを用意し、その引数のようなものを決めたタイミングで型を定義できるものです。Genericsは、関数やクラス、インターフェースに使うことができます。

Genericsを使う場合、型の後に`<T>`などを記載します。ここでいう`T`が、先ほど述べた「型における引数のようなもの」にあたります。この言葉だけだとピンとこないと思うので、具体例を使って見てみます。

```ts
interface Hoge<T> {
    value: T;
}

const x: Hoge<string> = { value: "x" }
const y: Hoge<number> = { value: 3 }
```

上記の場合、変数を宣言するタイミングで型を定義しています。このように、Genericsでは型を定義するタイミングを遅らせることが可能です。

また、Genericsでは初期の型を決めることが可能で、`T`の後に初期の型として指定したい型を`=`で結びます。初期の型を指定すると、変数等を宣言する際に`<型>`を省略することが可能です。今回は初期の型を`string`型とした例を用意しました。
```ts
interface Hoge<T = string> {
    value: T;
}

const z: Hoge = { value: "z" }
```

上記の例では`T`のみ定義できるようになっていますが、定義できる型を追加することも可能です。

```ts
interface Fuga<T, K> {
    value: T;
    key: K;
}

const w: Fuga<string, number> = {
    value: "w",
    key: 5
}
```

一番最初に示した例では好き勝手に型を定義することが可能ですが、定義する型を絞りたい場合があると思います。その場合、`extends`を使うことで定義できる型を制限することが可能です。`string`型もしくは`number`型に互換性がある型しか定義できない例は以下です。
```ts
interface Hoge<T extends string | number > {
    value: T
}

const a: Hoge<string> = { value: "a" }
const b: Hoge<number> = { value: 4 }
```

Genericsは関数でも使うことが可能です。使い方としては関数名の後に`<T>`を書くことで実現可能です。アロー関数を使う場合も使用可能で、その場合は以下のように書くことができます。
```ts
const returnValue = <T>(value: T): T => value;
```

## さいごに
いかがだったでしょうか。今回は簡単にではありますが、TypeScriptのGenericsについてまとめてみました。
TransactionScript vs DomainModel



![01.TransactionScript vs DomainModel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/ef90fd0e-59a7-24b0-abca-6053c2a091f7.png)

Patterns of Enterprise Application Architecture (PoEAA) は 2002 年、今からちょうど 20 年前に出版された本の名前です。このアドベントカレンダーでは、この本に書かれて世に広まったパターン名を紹介していきます。執筆された内容は、それ以前の知見のまとめということもあって、現在の業務アプリケーション開発から見ると、かなり解説が古くなっています。言葉だけ知りたいと思っている人だけでなく、原典を読もうと思っている人も、まずはこのシリーズでざっと意味をつかんでください。難解で挫折してしまわないための助けになると思います。

https://bliki-ja.github.io/pofeaa/TransactionScript/

https://bliki-ja.github.io/pofeaa/DomainModel/

はじめに紹介する Transaction Script と Domaon Model は、ドメインロジックパターンに分類されます。

業務の処理をプログラムで表すとき、ひとつの処理全体を、具体的な一本の台本のように記述したものが、一般的に Transaction Script と呼ばれるタイプの記述スタイルです。長くて複雑なロジックになってくると、サブルーチンに分解するなどの工夫の余地はありますが、問題を抽象化して扱うような記述はしません。

データベースを扱うときは、主に、SQL と結果をやりとりする単一の接続オブジェクトを使います。テストはスクリプト全体を通しで実行してみて、意図した変更が正しく起きているかを、**全て** 確認しなければなりません。

いっぽう、Domain Model は、処理ではなくオブジェクトの関係モデルに先に着目します。オブジェクトの責務をデザインし、各部分部分が閉じたシンプルな問題にのみ注力できるかたちを考えます。当時はまだ使われていませんでしたが、現在では xUnit による純粋なロジックテストで、先に閉じた部分の正しさを確認するのが普通です。

オブジェクト同士の連携は、互いを抽象化して認識するかたちを取るのが一般的です。連携先が具体的に何をするのかを気にせず、抽象として正しいはず (インターフェース仕様のとおりに動いてくれるだろう、など) と期待して、自身以外の全体を信用する考え方をします。全体の複雑さを考える必要のない、うまく切り分けたシンプルな部品だからこそ、正しさがわかりやすい点、および、そうした部品の組み合わせグラフで柔軟に全体像を描くのは、いわゆるオブジェクト指向プログラミングらしいスタイルです。

一概にどちらが優れていると言い切ることはできません。Transaction Script のメリットは単純さです。複合的な問題とは全く無縁な、入力された値でデータベースのデータを一箇所書き換えるだけのような、単純な CRUD でよい場合などには、Domain Model は大袈裟になってきます。単機能のマイクロサービスなども同様です。逆に、複合的な問題に関する複数の機能があるアプリケーションでは、直接 SQL を意識するような低レベルコードが増えると、ロジックを誤解してしまうおそれがあるので、Transaction Script は不向きになってきます。

注意しなければならない点は、細かく責務が分かれたオブジェクトを使っているからといっても、それだけでは Domain Model とは呼べないかもしれない点です。オブジェクトを多く使っていても、実質的に Transaction Script になることがありえます。

Ruby on Rails や Laravel の ActiveRecord (Eloquent) は有名ですが、これらは手続き中のどこからでもアクセス可能な、サービスロケーターのラッパーです。また、比較的ダイレクトに、即時 SQL 発行を行います。ひとつの手続きから無節操に全ての ActiveRecord クラスを参照すると、それは実質、一本のデータベースコネクションで何でもやるスクリプトと同じ意味になってきます。

ひとつのビジネスロジックの入力と出力だけを見ながら Transaction Script のように考えて作ると、ファットコントローラーと呼ばれるアンチパターンにつながります。オブジェクトに責務を分けるときは、関心の分離を意識して、それぞれが閉じて責務を満たすかを先に考えましょう。
【Swift】guard文ってなに？

# guard文ってなに？
簡単にいうと、条件が不成立時に早期退出を行うための条件分岐文です。
if文と同じく条件式の評価結果となるbool型(true,false)の値に応じた処理を行います。
guard文は、条件式がfalseを返す場合にのみ{}内の文を実行し、条件式がtrueを返す場合は{}内の文の実行をスキップします。
ややこしいですが、分かりやすくいうと**trueの場合の処理が無いif文**というイメージです。

```swift:guard文の書き方
guard　条件式 else {
    条件式がfalseの場合に実行される処理
    return または break または throw (guard文が記述されているスコープの外に退出する必要がある)
}
```
# guard文のスコープ外への退出の強制
guard文は、条件に合わない場合に処理を抜けるコードをシンプルに記述するために用意された構文であるため、
else節でguard文が含まれるスコープから退出する処理が必要なので、
**retrun**、**break**、**throw**のいずれかを必ず記述するルールになっています。
![スクリーンショット 2022-12-01 0.07.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2604036/c7676498-bbca-aa8b-daa2-05549a43b78c.png)
記述しない場合、上記のようにコンパイルエラーが表示されます。
スコープからの退出はコンパイラによってチェックされるため、guard文のelse節以降では、guard文の条件式が必ず成り立っていることがコンパイル時に保証されます。

# guard文を使うメリット
if文のelseの時の処理だけを書きたい時にguard文は活躍します。
guardの方がコードの量も減り、メンテナンスもしやすくなります。
```swift:if文の場合
let number: Int? = nil
if let id = number {
    // numberがnilでない時の処理
} else {
    // numberがnilの時の処理　←ここの処理だけを書きたい
}
```

```swift:guard文の場合
let number: Int? = nil
guard let id = number else {
     // numberがnilの時の処理
    return
}
```

# 最後に
まだまだ勉強不足ですがSwiftはやっぱ楽しいですね。
もし間違いなどございましたらご指摘いただけると助かります！
CodeSeeで始めるバックエンド影響範囲の分析

# はじめに
はじめましての方ははじめまして！
[HITOTSU株式会社](https://www.hitotsu.co.jp) の宮といいます。

昨年から本格的にプロダクト開発を進めてきたのですが、ひょんなことからアドカレやるかと言うと、ほぼ冗談で言ったにも関わらずメンバーがギラギラしてたのでやることになりました。
とはいえ、書くからには弊社で割と色々経験して取り入れてきたものを共有できると言いなと思ってますので、宜しくお願いいたします。

なのでこの記事は [HITOTSU株式会社のアドベントカレンダー](https://qiita.com/advent-calendar/2022/hitotsu) の１日目です。

# TL;DR
- 静的型付け言語ならCodeSeeは良いぞ
- レビューの時に重宝するぞ
- 何回か命救われたぞ


# CodeSeeって？
CodeSeeは影響把握分析のための可視化ツールです。
コードの依存関係を視覚化してくれて、GithubでPRを作ったら影響範囲のあるところだけ表示してくれる様な機能があります。

https://www.codesee.io/

うちでは以前たまたま見つけてバックエンド側に差し込んでみたら手放せなくなりました。

## CodeSeeの機能

CodeSeeにはコードの依存関係の可視化をベースにレビューやオンボーディング用の機能があるようです。
※ 僕はたぶん5%くらいしかCodeSeeの機能を使いこなせていません。なんで使いこなしたら段々と追記しています。

### コードベースの視覚化

とりあえずリポジトリを連携すると凄い頑張ってコードの依存関係を可視化してくれます。
普通のバックエンドだととんでもない量の依存関係が出るので、あぁ結構コード書いてるなぁと自己肯定感を高められます。

![スクリーンショット 2022-12-01 0.26.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/9d84af26-9373-41c0-3f5e-fcbdfd6543d1.png)


### レビューの依存関係可視化

HITOTSUではとにかくこの機能にお世話になっています。
GithubでPRを書くと、変更されたコードに基づいて依存関係が可視化されます。
とても良いのは、変更したコードだけでなく、そのコードが依存してるモジュールまで描画してくれるので、レビューの時に重宝しています。

![スクリーンショット 2022-12-01 0.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/52d58518-7b5f-42d0-57cf-135323e88c2d.png)


### エンジニアのオンボーディング

CodeSee上でコードの解説を作る機能の様です。
例えばエンジニアが参加した時にドメインごとにこの辺りが関連するよー！的な内容をチュートリアルとして設定する様な意図の機能だと思います。

![スクリーンショット 2022-12-01 0.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239882/c029d200-518a-cfbc-dca2-5cd3e08adbd6.png)


## HITOTSUでの使い方
HITOTSUではバックエンドのPRが作成された時に、自動的にコードマップができるようになっています。
うちはGoを使ってDDDにある程度基づいてプロダクト開発していますが、サービスの依存関係やリポジトリとサービスの関係が見えるようになるのが良いです。
特にレビュー時の影響確認がめちゃくちゃスムーズになっているので、何度か影響範囲の修正漏れを見つけては命を救われています。



## 注意点
一回強引にPython/DjangoのプロジェクトにCodeSeeをぶっこんでみたのですが、１PRごとに15分Github Actionsの時間を消費しまくることになりました。
しかもコミットをプッシュするごとにCodeSeeのマップを再作成するので、湯水のごとく消費されてしまいました。
ホントはPythonみたいなスクリプト言語のほうが恩恵がでかいと思うのですが、流石に厳しかったです。
（これも１年くらい前の情報なので、もしかしたら今はとても）

JVM言語は試していないのですが、静的型付け言語で取り入れるのがオススメです。
うちはGoを使っていますが、CodeSeeの依存関係マップは数秒で作成されています。

## まとめ
CodeSeeは利用している技術スタックにもよりますが、依存関係の把握をめちゃくちゃ上手に可視化してサポートしてくれるので導入して良かったもののひとつです。
バックエンドの依存関係はプロダクトの開発が進めば進むほど把握が大変になってきますし、特定の箇所のみを修正したPRが上がってくると思わぬ影響がでがちです。
CodeSeeはその辺までの機能はコミュニティプランでさせてくれますし、ぜひ広まると良いなと思っています。


HITOTSU株式会社のアドベントカレンダーの2日目は、うちのフロントエンド開発から顧客対応から英語まで何でもござれな [@motsuka1](https://qiita.com/motsuka1)です。

ではでは、ゆるりとやっていきますので宜しくお願いします。