OmniAICreator/Qiita-1.07M huggingface dataset:
Classについて演習問題回答

<h1>演習問題回答</h1>

<h2>演習問題</h2>

- 魚(fish)クラスで「マグロは500円です」出力してください

```ruby:paiza.io
class Fish
    
  def initialize(name, price)
    # インスタンス変数には@をつける
    @name = name
    @price = price
  end
  
  def description_of_item
    "#{@name}は#{@price}です"
  end

end

fish_1 = Fish.new("マグロ", "500円")
puts fish_1.description_of_item
```

<h2>演習問題2</h2>

- たい焼きクラスを作成して、attr_accessorを使って200円のカスタード味と300円のあんこ味のを作ってみましょう。

```ruby:paiza.io

class Taiyaki
  attr_accessor :name, :price
    
  def initialize(name, price)
    # インスタンス変数には@をつける
    @name = name
    @price = price
  end
  
  def consumption_tax
    (@price * 1.10).round.to_s + "円"
  end

end
taiyaki_1 = Taiyaki.new("あんこ味", 200)
taiyaki_2 = Taiyaki.new("カスタード味", 300)

puts taiyaki_1.name
puts taiyaki_1.price.to_s + "円"
puts taiyaki_2.name
puts taiyaki_2.price.to_s + "円"
```

- たい焼きに消費税10%を追加しましょう

```ruby:paiza.io

class Taiyaki
  attr_accessor :name, :price
    
  def initialize(name, price)
    # インスタンス変数には@をつける
    @name = name
    @price = price
  end
  
  def consumption_tax
    (@price * 1.10).round.to_s + "円"
  end

end
taiyaki_1 = Taiyaki.new("あんこ味", 200)
taiyaki_2 = Taiyaki.new("カスタード味", 300)

puts taiyaki_1.name
puts taiyaki_1.price.to_s + "円"
puts taiyaki_2.name
puts taiyaki_2.price.to_s + "円"
```
day.jsで第何週か求める

[公式ドキュメント](https://day.js.org/en/)などを漁ったが、ある日付の週の始まりや終わりの日付などは取得できても、シンプルに「2022/5/22は5月の第何週か？」を求められるメソッドがなさそうなので自前で実装。

## 結論
以下の式でできる。
``` typescript
const week = (dayjsObject.date() + dayjsObject.startOf("month").day() + 6) / 7
```

## 一応式の解説
Day.jsは以下の`day`メソッドで曜日を求めることができ、対応表は下記の通り
| 曜日 | 値 |
|:-----------|:------------|
| 日 | 0 |
| 月 | 1 |
| 火 | 2 |
| 水 | 3 |
| 木 | 4 |
| 金 | 5 |
| 土 | 6 |

### その月の1日が日曜の場合
例えばこういう時
|週| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|:-----------:|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|第1週| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|第2週| 8 | 9 | 10 | 11 | 12 | 13 | 14 |

これは簡単で7で割った商に1を足せば求められる
``` bash
<(日付-1)/7 の商> + 1
# 7日なら (7-1)/7 + 1 = 0 + 1 = 1
# 9日なら (9-1)/7 + 1 = 1 + 1 = 2
```

### その月の1日が日曜以外の場合
例えば火曜始まりだとこういう時
|週| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|:-----------:|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|第1週|  |  | 1 | 2 | 3 | 4 | 5 |
|第2週| 6 | 7 | 8 | 9 | 10 | 11 | 12 |

これはこの月の1日の曜日`day()`の値を足してあげれば日曜始まりと同じように計算できる。
この例だと1日は火曜(`day()=2`)なので、`2`を全ての月に足せば1日始まりと同じになる
|週| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|:-----------:|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|第1週| +2 | +2 | 1+2 | 2+2 | 3+2 | 4+2 | 5+2 |
|第2週| 6+2 | 7+2 | 8+2 | 9+2 | 10+2 | 11+2 | 12+2 |          

結果これと一緒 ↓　
|週| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|:-----------:|:-----------:|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
|第1週| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|第2週| 8 | 9 | 10 | 11 | 12 | 13 | 14 |

つまり`(その月の1日のdayの値)`を足せば日曜始まりと同じように計算できる
``` bash
<(日付-1+(その月の1日のdayの値))/7 の商> + 1
```

よって、全ての月でこれで計算可能
``` typescript
(dayjsObject.date() - 1 + dayjsObject.startOf("month").day()) / 7 + 1
↓
(dayjsObject.date() + dayjsObject.startOf("month").day() + 6) / 7
```

## 感想
探したけど意外となかったので自前で実装しましたが、実は普通にday.jsの機能でありそう。
もしくはもっと簡単に求められるかもしれません。
Googleプロジェクト管理：品質マネジメント

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/dc97f9d2-8c30-5310-a190-3fb484c9c091.png" width="800">

# 品質とは

***<font color="MediumVioletRed">『品質とは、成果物に対する概略の要求事項を満たし、顧客のニーズや期待を満たす、あるいは上回ること』</font>***

そのためには、品質マネジメントの重要な概念を理解し、プロジェクトマネジメントの品質計画の実施を監督する必要があります。

品質マネジメントを成功させるためには、

1. ***<font color="MediumVioletRed">品質基準</font>***
1. ***<font color="MediumVioletRed">品質計画</font>***
1. ***<font color="MediumVioletRed">品質保証</font>***
1. ***<font color="MediumVioletRed">品質管理</font>***

という4つの主要な概念を考慮する必要があります。

# 1.品質基準

品質プロセスは、品質基準の設定から始まります。品質基準は、製品、プロセス、またはサービスが望ましい結果を達成するために適合していることを確認するために使用できる要件、仕様、またはガイドラインを提供します。

プロジェクトの開始時に、チームおよび顧客と品質基準を設定します。チームメンバーやステークホルダーが正確に理解できるように、時間をかけて現在の仕事の品質基準を定義してください。

品質基準を設定した後は、定期的にチェックインし、すべてが問題なく、要件を満たしていることを確認します。品質基準と要求事項がきちんと定義されていれば、手戻りとスケジュールの遅れを少なくすることができます。

例えば、
- 信頼性
- 使いやすさ
- 製品規格

# 2.品質計画

品質基準を達成するための手順を計画することになります。

品質計画とは、特にプロジェクトマネージャーやチームが、

- プロジェクト全体に実際に関連する品質基準はどれか？
- それをどのように満たすか？

を正確に特定し、決定するためのプロセスを確立し、実施することを指します。

- 私の顧客はこのプロジェクトの最後にどのような結果を望んでいるのだろうか？
- 彼らにとっての品質とは何か？
- どうすれば彼らの期待に応えられるのか？
- 品質対策がプロジェクトの成功につながるかどうか、どのように判断するか？

例えば、

|  フェーズ  |  内容  | 
| ------ | ---- | 
|  品質基準  |  信頼性の観点）それぞれの植物が良い状態で届く  |
|  品質計画  |  植物の耐久性をテストする計画をプランター提供者と立てる  |

# 3.品質保証（QA)

プロジェクトが高品質のサービスや製品を提供する方向に進んでいるかどうかを評価することです。品質基準や品質計画とは異なり、QAは特定のフェーズで行われるのではなく、プロジェクトのライフサイクル全体にわたって行われます。

品質計画には、すべてが計画通りに進んでいるか、必要な手順が守られているかを確認するための定期的な監査が含まれている必要があります。定期的なチェックインとステークホルダーへの報告により、ステークホルダーの信頼とあなたの信頼が高まります。

# 4.品質管理（QC)

QCでは、プロジェクトの成果や納期をモニタリングし、望ましい成果を上げているかどうかを判断します。もしそうでなければ、代替措置を講じる必要があります。QCは、次のプロジェクトでより成功するための着地点を作るためにも不可欠なものです。

プロジェクトのライフサイクルを通して品質を確認し（QA）、もちろん必要に応じて修正する（QC）ことで、品質基準を満たす可能性が高くなり、プロジェクト終了時には組織の目標を達成し、お客様の期待を上回る高品質の成果物を得ることができます。

:::note info
QAが不具合を未然に防ぐことを目的とするのに対し、QCは不具合が発生した後にそれを特定し、その問題を解決するための是正措置を取ることも含まれる。
:::

# 参考

- [What Are Quality Standards?](https://asq.org/quality-resources/learn-about-standards)
- [What Is a Quality Plan?](https://asq.org/quality-resources/quality-plans)
- [Quality Assurance & Quality Control](https://asq.org/quality-resources/quality-assurance-vs-control)
[Ubuntu Server 22.04] 個人的初期設定 覚書

## <font color="MediumVioletRed">注意事項</font>
**<font color="Red">！注意！</font>**
自己責任でお願いします。
　・情報は、2022/12/20 時点のものになります
　・追加のパッケージインストールにより脆弱性が生まれる可能性があります
　　（特にnpm関連）
　・記事は Windows で作成しています。よって、改行コードは CRLF です
　・筆者は Qiita, linux 共に初心者です
　・記事内容は、間違っている可能性があります
　・あと初心者なので、質問されても多分解答がわかりません

**"前提"**
　・Ubuntu_Server_22.04 LTS
　・少なくとも最初は機器が手元で操作できること

**"推奨"** 
　・有線LAN
　・IPv4
　　（IPoE方式:IPv6,IPv4overIPv6 等の場合は、
　　　Fire Wall の設定をよく確認してください）
　・IPを固定済み
　・port解放はしないこと
　・通信はすべてTailscaleを通すこと

## 目次＆設定一覧
[1.Tailscale インストール](https://qiita.com/QiitaYkuyo/items/1a1cea46ebbe9463bc1d)
[2.WeTTY インストール](https://qiita.com/QiitaYkuyo/items/db4febd9915fb7708e77)

[3.Ubuntu Desktop(GDM3 ubuntu カスタム) インストール、自動ログイン設定](https://qiita.com/QiitaYkuyo/items/06a22d394c4fb7f15867)
[4.Ubuntu Desktop RDP セットアップ](https://qiita.com/QiitaYkuyo/items/c8e700da451e894e5d53)

[5.PowerTOP TLP インストール](https://qiita.com/QiitaYkuyo/items/89636030b3cfc1bf5fea)
[6.自動再起動設定（Crontab, rtcwake）](https://qiita.com/QiitaYkuyo/items/401bf93e26300551d51f)

※※※※※※
[・CLI からデスクトップの解像度を変更する](https://qiita.com/QiitaYkuyo/items/7c8762e8fd5b077a8aa4)

## Qiita 書き方参考先
【書き方まとめ】初めてQiitaに記事を書くときに知っておくべきこと
　・https://qiita.com/shizen-shin/items/a997bc228fa2850c9fce
Qiita Markdown 書き方 まとめ
　・https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1
Qiitaのマークダウンで色をつける方法[140色]
　・https://qiita.com/twipg/items/d8043cd4681a2780c160
Markdown記法 チートシート
　・https://qiita.com/Qiita/items/c686397e4a0f4f11683d
【Rails】【collection_check_boxes】checked: を使って初期表示をさせる方法

## はじめに
タグ付け機能を実装するためにcollection_check_boxes を使いました。
その際にユーザーがすでにチェックをつけていた場合にはチェックをつけて表示させたかったのですが、その実現に苦労したため、アウトプットも兼ねて記事にしました。
初学者の為、至らない点もあるとは思いますが温かい目で読んでいただけると嬉しいです！

## collection_check_boxes とは？
モデルからチェックボックスを自動生成してくれます。
基本的な使い方については[こちら](https://pote-chil.com/rails_collection_check_boxes/)の記事が分かりやすかったです。

## やりたかったこと
![6670258a385aaca763bd962dc7a73f0d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1374322/79da06bc-4367-f753-a3c3-399418ceebfd.png)

投稿(Episode)を見た閲覧者(User)がタグ(Tag)付けをする。
その閲覧者がタグ付けをしたタグのみチェックをつけて表示をする。

## 実現のために書いたコード
```:Controller
    @episode = Episode.find(params[:id])
    @tag_relation = current_user.tag_relations.build
    # ↓今回はこれが重要！
    @current_user_select_tags = current_user.tag_relations.where(episode_id: @episode.id).pluck(:tag_id)
```
```:View
<%= form_with model: @tag_relation, url: tag_relations_path do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <%= f.hidden_field :episode_id, value: @episode.id %>

    <%= f.collection_check_boxes(:tag_id, Tag.all, :id, :name, {checked: @current_user_select_tags, include_hidden: false}) do |tag| %>
      <%= tag.label do %>
        <%= tag.check_box %>
          <%= tag.text %>
        </label>
      <% end %>
    <% end %>

  <%= f.submit "資質を選択する" %>
<% end %>
```
`@current_user_select_tags`は投稿(Episode)の閲覧者(User)に紐づくタグ(Tag)があるかを検索しています。
そして、Viewの`f.collection_check_boxes`行に書いてある、`checked：オプション`は配列を渡すことで該当のチェックボックスにあらかじめチェックを入れることができます。
そのため`pluck(:tag_id)`でユーザーがすでにチェックをつけているタグを配列にしてまとめています。

書いてみるとてもシンプルですが、あれこれ悩んでいたので実装できた時はとても嬉しかったです！！
ここまで読んでいただきありがとうございました！！

## 参考
[【Rails】collection_check_boxesで多対多の関連付けをする方法](https://pote-chil.com/rails_collection_check_boxes/)
[Railsで検索機能を作って気がついたこと](https://qiita.com/ishidamakot/items/7afa6630eee3f95513a6)
【ChatGPT】Error code 1020の解決方法

# 発生した現象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1590483/99a668cb-bec3-d597-2379-822cb185ac8b.png)

いつものようにChatGPT先生にご助言いただきたく接続したところ、上のエラー画面が表示されました。
何かやらかしてアカウントが凍結されたのかと思ったのですが、どうもそうではないようです。

# 原因
私がこの画面に遭遇した原因は、「**ノートン360のセキュアVPNをオンにしたから**」でした。
正確には、VPNの地域を**日本**にしていたからです。

確かに直前に何も考えずセキュアVPNをオンにしていました…。

# 解決策
上記の通り、VPNの地域を別の地域にすることで解決するようです。
私は「**オーストリア**」に変更したところ、エラーが解決し接続できるようになりました。
アメリカやグレート・ブリテンでは拒絶されたのに、何故オーストリアで動いたのかはよくわかりません。


# まとめ

地域差があるのが何故かよくわかっていませんが、正直オフにして使った方が面倒ではないですね。
Jupyter labのターミナルのフォントがおかしいのを根本的に直す

## JupyterlabのUIひどすぎん.....？
Jupyter labのターミナルをmacのchromeから見るとフォントがとてもひどい、使い物にならないレベルのインターフェースになっていた。
![jupyterlab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117442/6073373e-2354-daf1-8afe-e16b7aadf9dc.png)


## 結論
結論から言うとOsakaの"等幅"のみをインストールするかChromeのフォント設定で等幅フォントに対応するフォントを指定すれば直る。


## 詳細

これの解決法としていくつかのサイトでjupyterlabのフォントの設定をいじってかえる、というものが提案されていた。
しかし、jupyterlabはクラウドGPUなどの一時的な環境で立てることが多いため、この方法でいちいち設定するのはめんどくさい。何かもっと根本的な解決はないか調べてみた。

調べるとこれはmacのchromeの日本人向けの等幅フォントの設定の問題に起因しているらしい。
当該環境でmonospaceが指定されたときOsakaというフォントが使用されるのだが、このフォント、デフォルトのmacでは基本インストールされていない。


ということでFont BookからOsakaをインストールしてみたのだが、
![osaka.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117442/d2ce7918-f530-8ff7-a29b-aafb3d84b0a2.png)

やっぱりおかしい。
どうやらOsakaにレギュラーフォントと等幅フォントの2種類がありレギュラーの方はアンインストールしておくと良いらしい。



実際試してみると
![osaka-mono.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117442/3c66d525-ff23-7e1f-79d8-a52c8b6620d4.png)
やっとまともな表示になった。

もう一つの修正方法に、chromeのカスタムフォントをいじるという方法がある。
chromeのウィンドウ右上の縦三点リーダー→左のメニューのデザイン→フォントをカスタマイズ、から等幅フォントに対応するフォントを変更することでもカスタマイズできる。
Osakaは珍しい日本語対応の等幅フォントということで採用されているようだが、ローマ字が等幅で表示されればあまり問題ない気がする。のでこういうOsakaのおかしな挙動を考えるとchromeの指定フォントを普通にMenloやMonacoにしておくのでも問題ない気がする。
ただ、このカスタムフォント、一回指定するとデフォルトの挙動に戻すのがちょっと面倒なので注意。

#### 参考

https://qiita.com/TaikiHirose/items/28d61a6db684faf0a708

https://qiita.com/RinGoku/items/b0943c4bc1099a340735
競技プログラミング AtCoder茶までのチートシート

# 本投稿について
主にAtCoderで茶色までの、灰色でC問題で結構ぶつかるくらいの人向け。私も結構ぶつかるので、より明るい色から照らしてあげるような内容ではありませんのでご容赦ください。

これをそばにカンペとして置いておくとCに挑みやすいかな？という感じです。

## 計算量について
・10000000000はNG（10の5乗の2重ループ→10の10乗はだめ）
・625000000はOK（25000の2乗）
→10**9→1000000000までならワンループはいける？ そのあたり投稿主もよくわかっていません。

## チートシート列挙
・余りを求める（%)

・1個を決め打ちする
3重ループになりそうなときの1つだけ決め打ちしてから全探索など

・バケットを検討する
l=n*[0]

・そっちで回さない
別視点での全探索の検討

・とりあえずリストはソートできないか？
ソートしないまま行うのではなく一旦ソートしたほうが処理が容易にならないか？

・途中結果のみを保持しておいて最後に連結する考え方
1個ずつ愚直に操作するとTLEになるケース

・実際のリスト、位置を記録したリストという2リスト体勢で実際のリストをいちいち検索する負荷をかけない作戦
[1,2,3...]という単純なリストで有効

・実際に移動させるとTLEになる場合は「移動した」という情報だけを別に持っておくことで計算量の削減になる

・dictを検討する
・Collections.Counter
・defaultdict

・itertoolsを検討する
・product（直積でパターン列挙、bit全探索にも）
・accumurate
・conbinations
・連長圧縮っぽい挙動のときにgroupbyの検討

・尺取り法っぽいときにdeque
・幅優先でもdeque

・常に変化するリストの最小値を求める場合はheapqが最速で最強

・bisectを検討する
リストの適切な位置に挿入したい場合

・math.comb

・math.dist
対角線の長さ（ユークリッド距離）

・2点が与えられたときに片方の点から片方の点への「移動」という考え方

・デフォで1や0やブーリアンFalse型のN個のリストを作って最終的にsumする手法
個数をカウントする場合に

・問題のタイトルにヒントがある
Prime：素数、Knight：将棋の桂馬 などなど

・図形問題で進行方向を取るときに方向の1か0の配列を用意する
右、下、左、上
[1,0,-1,0]
[0,1,0,-1]

・setの差集合、norの活用

・リストの転置（縦横逆）はzip関数と＊で簡単にできる
[リンク](https://note.com/kai1023/n/n1049eb912ad3#7994691c-6290-43ad-9ae8-ebec04163b34)
[nkmk](https://note.nkmk.me/python-list-transpose/)
PrePoMaxによる床に固定されていない門型フレームの変形解析

# はじめに
図1のように、滑らかな床に置いた門型フレームの中心線に2000Nの荷重を加える場合を考えます。フレームは床に乗っているだけですので、フレームの足は左右に開くことが予想されます。これをPrePoMaxで再現してみます。

<img width="600" alt="スライド1.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/da81572a-8d6b-6f84-a197-b00dc27da8a9.jpeg">

図1　PrePoMaxで解析するモデル

# PrePoMaxによる計算

- FreeCADで作成したモデルのSTEPファイルをインポートして、図2のようにメッシュを作成します。メッシュの最大寸法は2.5mmとしました。

<img width="600" alt="スライド4.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/cc28a593-dd0a-eda3-a41c-bd3c1888b047.jpeg">

図2　メッシュの作成
 
- 境界条件の設定
モデルの足の内側のライン（エッジ）に対してZ軸方向の変位を拘束します。また、あらかじめモデルの中央に作成した分割線上に2000Nの荷重を加えます。荷重は集中荷重として分割線上の81個の各節点に24.69Nずつ加えています。分割線にかかる全荷重は24.69N×81≒2000Nとなります。

<img width="600" alt="スライド5.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/81307c8a-d9d9-522f-64c0-805758ed2bfd.jpeg">

図3　境界条件の設定

- 解析および結果表示
解析は静解析で行い、計算時間は約21sでした。
解析結果（たわみと長さ方向の垂直応力）を図4と5に示します。各図には、元の形状と位置を併せて示しています。変形後のモデルはハの字型に足が開いており、予想通りの形状になっていますが、X方向とY方向に移動していることが分かります。移動する理由は、境界条件にX方向とY方向に対する拘束を付けていないためと考えられます。

<img width="600" alt="スライド8.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/a78c6ef9-2dd2-313f-4a34-871695e91287.jpeg">

図4　図3の境界条件による解析結果(たわみ)

<img width="600" alt="スライド9.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/b31bfcba-e709-3b64-d9e0-021b4a35987a.jpeg">

図5　図3の境界条件による解析結果(長さ方向の垂直応力)

# 解析方法の改良

- 変形後のモデルがはじめの位置から移動するのは見た目上好ましくないため、幅と長さを半分に分割した1/4モデルを使うことにします。図6に示すように、1/4モデルの分割面において、長さを半分にした分割面ではX方向を0に、幅を半分にした分割面ではY方向の変位を0に、それぞれ設定します。荷重は集中荷重として、長さ方向の分割面のエッジにある41個の各節点に12.2Nずつ加えます。エッジにかかる全荷重は12.2N×41≒500Nとなります。

<img width="600" alt="スライド14.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/94a6c5df-27be-4439-caa9-6f37921b77c7.jpeg">

図6　1/4モデルへのメッシュと境界条件の設定

- 解析および結果表示
解析は静解析で行い、計算時間は約3sでした。最初のモデルに比べて、解析時間が大幅に短縮されました。
解析結果を図7と8に示します。これらの図では、1/4モデルの結果をX方向とY方向に対称表示しています。変形後のモデルはハの字型に足が開いており、かつ、X方向とY方向に移動していないことが分かります。また、たわみや応力値は図4、5とほぼ同値になっていることが分かります。
1/4モデルにすることで、境界条件を容易に設定でき、計算時間が早く、モデルが移動しない結果が得られました。

<img width="600" alt="スライド19.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/6770157f-3428-eba4-b120-121aa260d6eb.jpeg">

図7　図6の境界条件による解析結果(たわみ)

<img width="600" alt="スライド20.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729073/7e2bd129-dbbb-8ea3-7a77-f1495638e824.jpeg">

図8　図6の境界条件による解析結果(長さ方向の垂直応力)

作成したSTEPファイルは以下に格納しております。

https://github.com/repositoryfiles/Frame-model
Googleプロジェクト管理：エスカレーション

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/dc97f9d2-8c30-5310-a190-3fb484c9c091.png" width="800">

# エスカレーションとは

プロジェクトマネージャーは、他のいくつかのタスクに加えて、問題を解決し、プロジェクトの成功の妨げとなる制約を取り除く責任を負っています。そのための方法のひとつがエスカレーションです。

***<font color="MediumVioletRed">『エスカレーションとは、より上位のプロジェクトリーダーやマネジメントに助けを求め、障害を取り除き、優先順位を明確にし、次のステップを確認するプロセスである』</font>***

エスカレーションというとネガティブなイメージがあるかもしれませんが、プロジェクトマネジメントではそうではありません。プロジェクトマネジメントでは、エスカレーションは奨励され、頻繁に使用され、さらには賞賛されるべきものです。

エスカレーションは、 ***<font color="MediumBlue">迅速な意思決定</font>*** を可能にし、一般的に問題が早く解決されればされるほど、プロジェクトはより良い方向へ向かいます。

# エスカレーションの事前準備

プロジェクトに着手する前に、プロジェクトマネージャー、チーム、プロジェクトスポンサーは、エスカレーションの標準と慣習を確立する必要があります。

つまり、

- ***<font color="MediumVioletRed">問題を提起する相手</font>***
- ***<font color="MediumVioletRed">問題提起の方法</font>***
- ***<font color="MediumVioletRed">議論の場</font>***

を特定するのです。

:::note info
エスカレーションが必要なとき、必要でないときのために、前もって少し準備をしておくと、エスカレーションをスムーズに行うことができます。
:::

# エスカレーションするタイミング

プロジェクトマネージャーは、プロジェクトに重大な問題が発生する兆候が見られたら、その問題をエスカレーションする必要があります。

クリティカルな問題とは、

- ***<font color="MediumVioletRed">プロジェクトの主要なマイルストーンの遅延を引き起こす可能性のある問題</font>***
- ***<font color="MediumVioletRed">予算超過を引き起こす問題</font>***
- ***<font color="MediumVioletRed">顧客を失うことになる問題</font>***
- ***<font color="MediumVioletRed">プロジェクト完了予定日を押し下げる問題</font>***

などを指します。

基本的に

- ***<font color="MediumVioletRed">時間</font>***
- ***<font color="MediumVioletRed">予算</font>***
- ***<font color="MediumVioletRed">スコープ</font>***

という3つの制約に影響を与えるものは、すべてエスカレーションすべきものです

# 「塹壕戦争」と「悪い妥協」

エスカレーションは、プロジェクトによくある2つの問題、「塹壕戦争」と「悪い妥協」を防ぐのに有効です。

#### 塹壕戦争

2つの仲間やグループがなかなか合意に至らず、両者とも譲らない場合に起こります。これは、プロジェクトの停滞を招き、プロジェクトの進行のある側面を遅らせる可能性が高い。

#### 悪い妥協

一般的に、妥協は問題を解決するための前向きな方法と考えられていますが、悪い妥協というものがあります。悪い妥協とは、2つの当事者がいわゆる解決策に落ち着くものの、最終的な製品が依然として問題を抱えている場合に起こります。

プロジェクトの重要な目標に対して妥協する場合、どちらかの当事者が、単に目的のための手段であるという理由で妥協することは、生産的ではありません。そう、妥協しながらも、より大きなプロジェクトの目標を念頭に置き、それに向かって一緒に努力するのです。チームやステークホルダーがより大きな利益を得るために難しい選択をするのを助けなければならないかもしれません。
macOSでunzipしようとしたら日本語が化けてエラーになる場合の対処法

macOSでunzipしようとしたら Illegal byte sequence というエラーになる場合の対処法です。

```bash
$ unzip foo.zip
Archive: foo.zip
checkdir error:  cannot create foo������
                 Illegal byte sequence
                 unable to process foo������/bar.txt
...
```

結論としては brew で unzip をインストールし、それを使って `unzip -O CP932 foo.zip` のように文字コードを指定して実行してやればOKです。

## 詳細

まずお使いの unzip コマンドを確認しましょう。

```bash
$ which unzip
/usr/bin/unzip
$ unzip -h
UnZip 6.00 of 20 April 2009, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.
...
```

`/usr/bin/unzip` (by Info-ZIP と表示されるバージョン6.00) を使っている場合は Shift_JIS 環境で作成された日本語ファイル名を持つZipアーカイブをうまく展開できないようです。

homebrew にはこの問題に対するパッチが適用されたバージョンの unzip がありますので、 `brew install unzip` などでインストールしましょう。 (homebrew 自体の導入方法は [Homebrew 公式](https://brew.sh/) を参照してください)

```bash
$ brew install unzip
==> Fetching unzip
==> Downloading https://ghcr.io/v2/homebrew/core/unzip/manifests/6.0_8
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/unzip/blobs/sha256:9f7f6a03fa3a
==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sh
######################################################################## 100.0%
==> Pouring unzip--6.0_8.arm64_ventura.bottle.tar.gz
==> Caveats
unzip is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have unzip first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/unzip/bin:$PATH"' >> ~/.zshrc

==> Summary
🍺  /opt/homebrew/Cellar/unzip/6.0_8: 16 files, 648KB
==> Running `brew cleanup unzip`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
```

注意書きにあるようにデフォルトではPATHの通ったところにはインストールされないので、必要に応じて `echo 'export PATH="/opt/homebrew/opt/unzip/bin:$PATH"' >> ~/.zshrc` などを実行しましょう。
その後 `source ~/.zshrc; rehash` するとPATHが正しく設定されます。
（設定の書式や追加するファイルは使っている対話シェルによって異なりますので注意してください）

```
$ which unzip
/opt/homebrew/opt/unzip/bin/unzip
$ unzip -h
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.

Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

...
  -O CHARSET  specify a character encoding for DOS, Windows and OS/2 archives
  -I CHARSET  specify a character encoding for UNIX and other archives
```
 Debian プロジェクトがメンテしているバージョンの unzip を導入できました。 `-O` というオプションがあるのがわかります。
```
$ unzip -O CP932 foo.zip
Archive: foo.zip
   creating: foo日本語漢字/
  inflating: foo日本語漢字/bar.txt
...
```

`CP932` の部分は `Shift_JIS` や `sjis` などでも通ります。（違いは調査していません）

ちなみに展開後のファイル名が文字化け状態になりますが、 `-O CP932` を指定しなくてもエラーは発生しなくなりますので、 `CP932` とか忘れてしまっても最悪展開だけはできます。

以上です。
load_img,imreadの画像読み込み時間の違い

# 学習時間を少しでも短くしたい

トレーニングの時間は少しでも短くしたいですよね。
画像処理をしていて、画像の読み込みにかかる時間ってどれくらいなの？
というのを常々疑問に思っていたのですが、ちゃんと調べることはずっとしていませんでした。

# load_img,imreadの画像の読み込み時間の違い

ほんとうはよくあるサンプルプログラムみたいに全部メモリに読み込んでおいてそれを処理できればいいんですがmnistじゃあるまいし実際に使う画像を全部乗っけられるようなメモリはなかなか取れません。
tensorflow , kerasを使ってる人だと load_imgを使ってる人もいるんじゃないかと思います。自分もはじめの頃に勉強した本がこれだったのでほぼずっとload_imgを使ってきていました。でもopencvにもimreadというのがあります。どっちがどれくらい速いの？
(@2023.1.22 PILの計測を追加しました)

# 実験

画像を1000枚読み込んで、ちょっとだけ加工（リサイズ、白黒化）する処理をして計測しました。
自分の場合白黒化する必要があったのでそれも計測に入れました。
計測に使った環境はgoogle colabのcpuです。
元画像はだいたいですが、長辺が1024の画像です。

```
import os

YDIRS = [ "./images" ] #適宜画像ファイルのあるディレクトリを指定

filePaths = []

for imgDir in YDIRS:

    fileList = os.listdir( imgDir )
    fileList.sort()
    
    for fileName in fileList:
        
        filePath = os.path.join( imgDir,fileName )
        
        filePaths.append( filePath )
    
imgNum = len( filePaths )
print( "imgNum="+str(imgNum))
```

こんな感じでファイルのパスを集めて

```
#load_imgで読むのにかかる時間

import time
from tensorflow.keras.utils import load_img

tfromEpo = time.perf_counter()

for i in range(1000):

  filePath = filePaths[i]

  img = load_img( filePath,target_size=(512,512))

  if i % 100 == 0:
    print( f"\r{i+1}/{imgNum}",end="" )

ttoEpo = time.perf_counter()
tdEpo = ttoEpo - tfromEpo

print( f" -- elapsed {tdEpo:.04f} sec." )
```
こんな感じで計測します。
目的サイズは512ｘ512としました。

# 処理内容

load_img後のグレースケール化は自前の処理で、

imreadのほうは

```
ary = cv2.imread(filePath, cv2.IMREAD_GRAYSCALE)
aryX = cv2.resize(ary,(512,512),interpolation=cv2.INTER_LINEAR)
```
こんな感じです。
imreadはリサイズの補間オプションがあるのでそれの違いも調べました。

1000枚の画像を前処理で512x512に白黒でリサイズ化しておいたものをpngのテンポラリファイルとして保存しておいて読むこむのも計測しました。

要するにload_imgでもimreadでもPILでも最終的に512ｘ512の白黒画像を1000枚、メモリに展開するのに掛かる時間を計測しました。

# 計測結果

| load_img/imread/PIL | 処理 | 時間（秒） |
|:-:|:-:|:-:|
|  load_img | 読み込みのみ  | 14.7785  |
|  load_img | グレースケール化  | 16.1188  |
|  imread |  INTER_NEAREST | 6.6793  |
|  imread |  INTER_LINEAR | 7.0711  |
|  imread |  INTER_CUBIC | 7.5854 |
|  imread |  INTER_AREA | 9.1466 |
|  imread |  INTER_LANCZOS4 | 10.9502  |
|  imread |  前処理したファイル(png)の読み込み | 3.3909 |
|  PIL |  openのみ | 0.0808  |
|  PIL |  open + img_to_array + cv2.resize(INTER_LINEAR) | 17.9979  |
|  PIL |  open + conver('L')でグレー化+img_to_array+cv2.resize(INTER_LINEAR) | 16.6866   |


# 結論

思っていた以上にload_imgが遅いことがわかりました。
補間については、AREA LANCZOS4はそれなりに重い処理のようです。
前処理しておいたものを読み込む仕組みに変えると倍以上に速くなっているところをみるとimreadを使った場合でもresizeは決して軽い処理ではないと言えそうです。

PILはopenだけだと激速ですが、ちょっとなにか処理すると途端に速度が低下しload_img以下になりました。なれてないもので使い方に間違いがあるのかもしれませんが、openだけだとほんとにファイルを開くだけなのだと思われます。

自分の場合は画像は70000枚くらいでしたので、大雑把にload_imgでグレースケール化してると15x70/60=17.5で1エポックごとに17分以上も画像の読み込み→白黒化に使っていたことになります。
もしこれを前処理したものをimreadする形式に変えたとすると3x70/60=3.5で1エポックごとに14分も高速化できることになります。

14分x100epoch=1400
1400/60=23.3333...

100epoch処理したとするとまる1日近くの違いになることになります。
全く馬鹿になりませんね。

@2023.1.22 PIL追加。計測の精度向上
paiza.ioでelixir その180

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
ラインエディタを作れ。

# 方針
E.list(ファイルネーム)で、行番号付き印字。
E.edit(ファイルネーム、行番号、文)で、修正。

# サンプルコード

```

c = """
ok0
ok1
ok2
ok3
"""
File.write("test.txt", c)

defmodule E do
    def list(name) do
        IO.puts name
        File.stream!(name)
        |> Stream.map(&String.strip/1) 
        |> Stream.with_index
        |> Enum.to_list
        |> Enum.map(fn {x, n} ->
            IO.puts "#{n}: #{x}"
        end)
    end
    def edit(name, l, s) do
        s = s <> "\n"
        c = File.stream!(name)
        |> Stream.with_index
        |> Enum.to_list
        |> Enum.map(fn {x, n} ->
            if n == l do
                s
            else
                x
            end
        end)
        #IO.inspect(c)
        File.write("test.txt", c)
    end
end

E.list("test.txt")
E.edit("test.txt", 1, "ok4")
E.list("test.txt")




```

# 実行結果

```
test.txt
0: ok0
1: ok1
2: ok2
3: ok3
test.txt
0: ok0
1: ok4
2: ok2
3: ok3

```

# 成果物

https://paiza.io/projects/7q1IitItBdPyt7F_c68IFg

以上。
table pulsにてER図を生成してもリレーションが生成されない問題を解決

## 概要

- table pulsにてER図を生成してもリレーションが自動生成されず詰まったので解決方法をまとめる。

    ![スクリーンショット_2023_01_21_10_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/913eee11-647f-e391-6a6e-81421e52d426.png)

## 前提

「そもそもER図を出力できるような設定ってどうやるのさ」という方はこちら↓

https://qiita.com/miriwo/items/ac36571c195a0abe04e2

## 情報

- 筆者は下記の環境でフレームワークからMySQLのテーブルの生成を行いtable pulsでER図を生成した。
    - フレームワーク：laravel
    - RDB：MySQL

## 方法

- table pulsのリレーションの生成はDB側の外部キー制約などを用いて生成しています。したがって、いくらカラム名を`リレーション先テーブル名_id`にしたところでER図のリレーションは生成されない。
- 下記SQLを実行して出力内容の`CONSTRAINT`の部分でテーブル毎の関連が記載されているか確認する。ER図のリレーションが生成されいない時だいたいテーブル間の紐付けができていない。

    ```sql
    show create table テーブル;
    ```

- 外部キー制約などの生成方法はフレームワーク等によって異なるが、laravelの場合はマイグレーションファイルに記載して変更を加える。（下記は一例、そのまま貼り付けて実行してもエラーになります。）

    ```php
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('payment_balances', function (Blueprint $table) {
            // 外部キー
            $table->foreign('カラム名')
                ->references('紐付けカラム名')
                ->on('紐付け先テーブル名')
                ->cascadeOnDelete();
        });
    }
    ```
社内ラジオを初めて1年以上経ってた

【聞き流し勉強会】と称して、実質社内ラジオを一人で開催しています。    
気づけば1年以上が経っていたので、やってきたことをメモ程度にまとめます。
# 実施内容
週に1度、業務時間内に15分枠(実際は10分程度)で実施。内容は1話完結で参加は任意。  
スライドを用意して、場当たりで話をします。  
スライドは補助程度で、業務をしながら聞き流せるようにしています。  
youtubeの書籍内容まとめ動画のクオリティが低いやつみたいなイメージです。  

扱っている内容と具体例は以下  
* 当時話題となっていたセキュリティインシデント解説
  * Orion Platformバックドア事件について
  * Log4j
* AI解説
  * 最新チャットアプリでできること(ChatGPTのこと)
  * Edge AI
* ツール紹介  
  * ProcessMonitor

回ごとに録画し、動画としてアーカイブを残しています。
## 心がけていること
社外の事をニュースとしてただただ垂れ流すだけでは、私がやっている意味はないと思っています。  
そのため、社内の事情にからめて話すことを心がけています。  

セキュリティインシデントの話題では、同じインシデントが社内で発生する可能性があるか、また発生しないようにはどうすれば良いのか。  
AIの話題では社内で開発しているAIと比較し、開発しているAIを社内の方に興味を持ってもらえるようにしています。

# 開始までの背景
私は、勉強した方がいいと思いつつしない人間なので、定期的に勉強会を開いてそれに向けていろいろやるのが良かったです。  
定時後に開催できていた時期もありましたが、空気的にあれになりました。  

参加者の負担にならないように、この形態を提案し、上長に許可をとって全社向けに実施しています。

# 得られたもの
参加した方が知識吸収できている、というのは省きます。  
一応簡単なアンケート取って確認はしていますが、保証はできないので。  
自分が得られた物を書きます。  
## ニュースに関心を持つようになった
勉強会で話すネタ集めとして、積極的にセキュリティインシデントや新しい技術の記事を読む癖がつくようになりました。

## AI話題を積極的に聞くようになった
社内にはAIの研究班がありますが、私自身は開発した事はありませんでした。  
しかし、勉強会の内容で社内のAIの話を聞くうちに、積極的に話に参加するようになりました。  
開発中のAIの検証に参加し、いっちょ前に口を出してみたり。  
また、研究班から指示を受けて実装を行う際、昔は「小難しいアルゴリズムだなぁ。実装面倒くさ」と思っていましたが、今は概要を理解できるよう研究班の方に質問しながら、前向きに実装ができるようになりました。

## ずんだもん
1. スライドを用意して、リアルタイムで話す形式でずっとやっていましたが、録画したものでも良いのでは？  
2. 録画ならyoutubeみたいに「あ～」とか「え～」とかカットした方がいいか。  
3. そもそも自分でしゃべらなくていいか。  

ということで、youtubeでよく見る、ずんだもんを導入しました。  
これをきっかけに、ずんだもんが扱えるようになりました。  
編集ソフトは趣味で持っていたので、それを使って6分程度の動画を作り、公開しました。  

予告無くずんだもんの動画を流したので、怒られないか心配でしたが、意外と好評でした。  
台本作成編集に6時間かかったので、二度とやりません。

# 抱負
皆さんのためを装いながら、自分のためになっているので続けて行きます。  
できれば、私以外の人がたまに、何なら持ち回りでやってくれると、その人のインプットアウトプットの機会になると思うので、巻き込んで行きたいです。  
1年以上続けてきて、私以外の人が担当した回は1回しかないので。
Android Kotlin 日時の比較

# はじめに
SNSアプリで使われるメッセージ送信時間の表示を実装したかったので、今回の記事を作成しました。


## タイムスタンプとは
ある時刻にその電子データが存在していたことと、それ以降改ざんされていないことを証明する技術。単位は1/1000(0.001秒)

## 日付の比較
#### *1.TimeStampをZonedDatetimeに変換する*

static ZonedDateTime	ofInstant​(Instant instant, ZoneId zone)	
InstantからZonedDateTimeのインスタンスを取得する。

java.time.Instant
public final class Instant
1970年1月1日午前0時0分0秒（UTC）からの経過秒数をナノ秒で扱うクラス。
（ナノ秒 = 1億分の一秒)

static Instant	ofEpochMilli​(long epochMilli)	
Instantのインスタンスをエポック1970-01-01T00:00:00Zからのミリ秒数を使用して取得する。

ZoneIdは、InstantおよびLocalDateTimeの間の変換に使用するルールを識別するために使用される。

```kotlin
fun getZonedDateTime(millis: Long): ZonedDateTime {
    return ZonedDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.systemDefault())
}
```
#### *2.エポックタイムを０時０分形式に切り捨てる*
```kotlin
fun startTimeOfDay(millis: Long): Long {
    val zonedEpochMillis = Instant.ofEpochMilli(millis).atZone(ZoneId.systemDefault())
    return zonedEpochMillis.truncatedTo(ChronoUnit.DAYS).toInstant().toEpochMilli()
}
```
:::note
```kotlin
public ZonedDateTime truncatedTo(TemporalUnit unit)
```

時間が切り捨てられた、ZonedDateTimeのコピーを返す。
引数には切り捨てる単位をTemporalUnitで指定する。
ここではTemporalUnitを実装した列挙型ChronoUnitの列挙定数DAYSを使用して日付単位で切り捨てる。


:::

### *3.週の始まりの日付を取得する*
```kotlin
fun startDayOfWeek(zonedDateTime: ZonedDateTime, dayOfWeek: DayOfWeek): ZonedDateTime {
    return zonedDateTime.with(TemporalAdjusters.previousOrSame(dayOfWeek))
```
:::note
```kotlin
public ZonedDateTime with(TemporalAdjuster adjuster)
```
日時の調整済のコピーを返す。
```kotlin
previous(DayOfWeek dayOfWeek)
```
例えば、DayOfWeekでMONDAYを指定すると、１つ前の月曜日の時間オブジェクトが取得できる。

調整対象の日付より前で指定された曜日が最初に出現する日に日付を調整する(ただし、日付がすでにその曜日だった場合は同じオブジェクトが返される)。


:::


### *4.比較*
```kotlin

//同じ年であるか?
fun isSameYear(millis1: Long, millis2: Long): Boolean {
    val year1 = getZonedDateTime(millis1).year
    val year2 = getZonedDateTime(millis2).year
    return year1 == year2
}

//同じ週であるか?
fun isSameWeek(millis1: Long, millis2: Long): Boolean {
    val startDay1 = startDayOfWeek(getZonedDateTime(startTimeOfDay(millis1)), DayOfWeek.MONDAY)
    val startDay2 = startDayOfWeek(getZonedDateTime(startTimeOfDay(millis2)), DayOfWeek.MONDAY)
    return startDay1.compareTo(startDay2) == 0
}

//同じ日付であるか?
fun isSameDay(millis1: Long, millis2: Long): Boolean {
    val day1 = getZonedDateTime(startTimeOfDay(millis1))
    val day2 = getZonedDateTime(startTimeOfDay(millis2))
    return day1.compareTo(day2) == 0
}

//昨日であるか?
fun isYesterday(millis: Long): Boolean {
    val day = getZonedDateTime(startTimeOfDay(millis))
    val yesterday = getZonedDateTime(startTimeOfDay(System.currentTimeMillis())).minusDays(1)
    return day.compareTo(yesterday) == 0
}
```

# まとめ
比較結果により、「23:00」、「昨日」、「日曜日」、「23/1/21」などフォーマットを変更すれば、よりユーザーにわかりやすいアプリになります。

メッセージの送信時間をエポックタイムで取得して、豊富に用意されているJavaの日付系APIを使って、柔軟に日付のフォーマットを変更することができました。
CORSで弾かれた場合はサーバーサイドで取得すると取って来れたりする

とりあえずメモ
TypeScriptでAxios使って外部サイトのHTML取得しようとしたらCORSで弾かれたけどNext.jsのgetServerSideProps()の中とかgetStaticProps()の中でなら取得できた
論理和演算子( || )の短絡評価を利用した分岐Tips


```Javascript
function updateRecords(records, id, prop, value) {
  if (value === '') {
    delete records[id][prop];
  } else if (prop !== 'tracks') {
    records[id][prop] = value;
  } else {
    records[id][prop] = records[id][prop] || [];    // <= Short-circuit evaluation
    records[id][prop].push(value);
  }
  return records;
}
```
短絡評価（Short-circuit evaluation）を利用すれば、下のif文が1行で書ける。
```Javascript
if (!records[id][prop]) {
    records[id][prop] = [];
}
records[id][prop].push(value);
```
Googleプロジェクト管理：リスクマネジメントのテクニック

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/dc97f9d2-8c30-5310-a190-3fb484c9c091.png" width="800">

# リスクマネジメントのテクニック

リスクマネジメントとは、プロジェクトに影響を与える可能性のあるリスクや問題を特定し、特定したリスクや問題の影響に対処するための手順を評価し、適用するプロセスである。

リスクを管理し、リスクが顕在化するのを防ぐ方法の1つは、プロジェクトにおける

- ***<font color="MediumVioletRed">変更と依存関係</font>*** 
- ***<font color="MediumVioletRed">スコープクリープ</font>***

の管理に重点を置くことである。

この2つの両方を管理できれば、他の種類のリスクはずっと管理しやすくなります。

- 依存関係が時間通りに満たされていれば、チームがスケジュールから遅れる可能性は低くなる。
- スコープがしっかり管理されていれば、予算の変更やタイムラインの延長を余儀なくされる可能性は低くなる。

### ブレーンストーミング

チームでのブレーンストーミングは、プロジェクトのリスクを特定するための最も効果的な手法の一つです。チームメイトは、以前のプロジェクトでのスキルや経験を持っている可能性が高いので、類似点を洗い出し、問題を繰り返さないようにすることができます。

### リスクレジスター

チーム内でブレーンストーミングをしながら、リスクレジスターを作成するのがベストです。リスクレジスターとは、チームのリスクリストを表やグラフにしたものです。

- プロジェクトの成果を向上させるものは何か?
- 損害を与えたり妨げたりするものは何か?

といった質問をチームに投げかけましょう。それらをすべてif/then文でリストアップするのです。例えば、ある事象が発生した場合、プロジェクトにどのような影響があるかということです。

### リスク・エクスポージャー

リスクレジスターの中で、リスクに優先順位をつけるために、リスクエクスポージャーを計算することができます。リスク・エクスポージャーとは、特定の活動や事象から生じる将来の潜在的な損失を測定する方法である。リスク・エクスポージャーを計算する良い方法は、このようなマトリクスを作成することです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/169a6d1a-d71a-3b73-0de3-07333b3448c9.png" width="600">

マトリックスを作成する際には、影響度と確率という2つの変数を使用します。各リスクを、そのリスクがプロジェクトに与えうる影響と、そのリスクが実現する確率や可能性のクロスセクションでチャートに追加してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/64b38033-6f5f-c0e6-f5f3-e82760b4b7f3.png" width="600">

:::note info
プロジェクトに大きな影響を与えるものについては、たとえそれが発生する可能性が低いものであっても、必ず緩和策を講じてください。
:::

### ROAMテクニック

このリスクが実際に顕在化した場合、どのように対処するのでしょうか。リスクレジスターは素晴らしいツールですが、それでも予期せぬリスクが発生する可能性はあります。

プロジェクト期間中のすべてのリスクを考慮することは、ほとんど不可能である。そこで役立つのが「ROAM手法」である。ROAMテクニックとは、

- 解決済み (**R**esolved)
- 所有 (**O**wned)
- 受容 (**A**ccepted)
- 軽減 (**M**itigated)

の頭文字をとったもので、 ***<font color="MediumBlue">リスクが発生した後の行動</font>*** を管理するために使われる。

リスクが顕在化したら、それをどうするかを決める必要がある。

- **解決済み(Resolved)**
    リスクが除去され、問題にならなくなった場合、それは「解決済み」カテゴリーに入ります。
- **所有 (Owned)**
    あるリスクについてチームメンバーに所有権を与え、その対処を任せた場合、そのリスクは「所有」カテゴリーに入り、完了まで監視されます。
- **受容 (Accepted)**
    リスクが「受容」された場合、そのリスクについては何もしないことが合意されたことになります。
- **軽減 (Mitigated)**
    リスクが発生する可能性を減らすか、プロジェクトに与える影響を減らすために、何らかの行動が取られ、リスクが軽減された場合、「軽減」カテゴリーに入る。

各リスクがカテゴリーに分類された後、チームは各リスクについて議論し、どれを優先させるかを決定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/16bf29ad-316d-e245-06be-2b2e62c1b687.png" width="750">
laravel マイグレーションでテーブルコメントをつける

# 概要

- マイグレーションでテーブルにコメントを付ける方法をまとめる。

# ご注意

- 本方法でテーブルにコメントがつけられるのは現在MySQLとPostgresのみである。

# 方法

- マイグレーションファイルに下記のように記載する。

    ```php
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('テーブル名', function (Blueprint $table) {
            $table->comment('テーブルのコメント');
        });
    }
    ```

- マイグレーションを実行する。
- ちなみに下記SQLを実行した結果のcommentを見ることにより、テーブルのコメントが入っていることを確認できる。

    ```sql
    show table status;
    ```
【Ruby】catch/throwについて

catch/throwについて、あまり触れることがないので簡単な使い方をまとめておきます。

# catch/throwとは
ループ処理の時に深くネスとした場合の大脱出の手段。
throwにシンボルまたは文字列のオブジェクトを指定します。
指定したオブジェクトをcatchで指定するのが基本の形になります。

```ruby
catch :sample_loop do
  throw :sample_loop
end
```
throwを指定すると、ブロックが中断します。
ループ処理が繰り返さずに結果が出力されてるのがわかります。

```ruby
catch :sample_loop do
  loop do
    p "a"
    
    loop do
      p "b"
      
      loop do
        p "c"
        
        throw :sample_loop
      end
    end
  end
end

# => "a" "b" "c"が表示される
```

途中で`throw`を定義するとブロックが中断します。

```ruby
catch :sample_loop do
  loop do
    p "a"
    
    loop do
      p "b"
      throw :sample_loop

      loop do
        p "c"
        
      end
    end
  end
end

# => "a" "b"が表示される
```
# thorwの第二引数
throwの第二引数の戻り値を指定することができます。

```ruby
def sample_method
  throw :sample_loop, "finish!"
end

msg = catch :sample_loop do
  sample_method
  puts "hello" # => ブロックが中断され、出力されない
end

puts msg
# => finish! が出力される
```
`throw`の第二引数に`"finish!"`を渡し、ローカル変数`msg`に値を格納して出力しています。

# まとめ
深くネストしいる場合などで使う場合があるようですが、実際はあまり使われていないようです。
メモ程度に覚えておきます！

# 参照
- [module function Kernel.#throw](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/throw.html)
- [raise~rescue,とthrow~catchの違い、本当にわかってる？まとめた](https://qiita.com/harvath/items/e716179538bc1da30f88)
- [改訂2版 パーフェクトRuby](https://gihyo.jp/book/2017/978-4-7741-8977-2)
TypeScriptで多重extendsを具現する

<br>
typescriptは、extendsによる多重相続を提供しないです。<br>
その代わり、mixin という手法を用いて、多重継承を実現させることができます。<br>
mixinもクラスを利用して継承を実現するが、クラスのextendsを使用しません。<br>
クラスをまるで関数のように、あるいは単独のオブジェクトのように眺めながら、<br>
必要な場合ごとにクラスを合成して新しい機能に拡張していく技法です。<br>
そのため、extends を使用するときのように、クラスでのクラスの上下関係は不明です。
<br><br>
まず、extendsを通じたクラス、NewsFeedApiとNewsDetailApiはApiのgetRequestを呼び出しています。

```typescript:extends
class Api {
  ajax: XMLHttpRequest;
  url: string;
 
  constructor(url: string) {
    this.ajax = new XMLHttpRequest();
    this.url = url;
  }
  protected getRequest<AjaxResponse>(): AjaxResponse {
    this.ajax.open('GET', url, false);
    this.ajax.send();

    return JSON.parse(this.ajax.response);
  }
}

class NewsFeedApi extends Api{
  getData(): NewsFeed[] {
    return this.getRequest<NewsFeed[]>();
  }
}

class NewsDetailApi extends Api{
  getData(): NewsDetail {
    return this.getRequest<NewsDetail>();
  }
}

//呼び元
NewsFeedApi(URL);
NewsDetailApi(URL);
```
下はmixin技法。
mixinは、extendsのように機能を直接的に提供せず、コードテクニックで展開される手法です。
extendsを使わないのでNewsFeedApiとNewsDetailApiがapiとどのように関係を結ぶかを
mixinを通じて具現します。

クラスを関数あるいは単独オブジェクトとして眺めるため、constructorやextends を削除します。
```typescript:mixin
class Api {
  getRequest<AjaxResponse>(url: string): AjaxResponse {
    const ajax: XMLHttpRequest= new XMLHttpRequest();
    ajax.open('GET', url, false);
    ajax.send();

    return JSON.parse(ajax.response) as AjaxResponse;
  }
}

class NewsFeedApi {
  getData(): NewsFeed[] {
    return this.getRequest<NewsFeed[]>(NEWS_URL);
  }
}

class NewsDetailApi {
  getData(): NewsDetail {
    return this.getRequest<NewsDetail>(NEWS_URL);
  }
}

//呼び元
NewsFeedApi();
NewsDetailApi();
```


applyApiMixinsはtargetClassがN個baseClassesをextendsする関数です。
そのため、baseClassesは配列型になります。
applyApiMixinsはtypescriptが提供するコードなので、安全に使えます。

```typescript:mixin
// Apiを使いますとの定義
interface NewsFeedApi extends Api {};
interface NewsDetailApi extends Api {};

applyApiMixins(NewsFeedApi, [Api]);
applyApiMixins(NewsDetailApi, [Api]);

/**
 * @param targetClass 
 * @param baseClasses 
 */
function applyApiMixins(targetClass: any, baseClasses: any[]): void {
  baseClasses.forEach(baseClass => {
    Object.getOwnPropertyNames(baseClass.prototype).forEach(name => {
      const descriptor = Object.getOwnPropertyDescriptor(baseClass.prototype, name);
      
      if (descriptor) {
        Object.defineProperty(targetClass.prototype, name, descriptor);
      }            
    });
  });
}
```
Qiita Advent Calendar 2022 Online Meetup で LT したので、その記録

[Qiita Advent Calendar 2022 Online Meetup - connpass](https://increments.connpass.com/event/267714/) で Lightning Talk の機会を頂いたので、その記録です。テーマがアウトプット... アウトプットとは何なのか... 

結論: アウトプットとは発信
それは 
# 「ふつうのひと」 
の[学びのログ](https://twitter.com/e99h2121/status/1610036742291337216?s=20&t=Q-rC-7dl8Iq3g_70L-JnMQ)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/a02ea17f-76a6-b2da-ae04-5f5db0615dcf.png)


## 社会人20年目エンジニア、発信で技術学びなおしてる話

### いわゆる退職エントリ

[自ら機会をつくりだし自らを変える発信 - Qiita](https://qiita.com/e99h2121/items/c4de1ecb072cb694a7e8)

### ...からの、うれしかった記事

[日々息をするようにアウトプットしている人は何を意識しているのか？ - Qiita](https://qiita.com/satomihoya/items/876dea7dd7a4c90c140a)

### 2022 年がんばったこと

[2022 年 55 冊 本を読むまで知らなかったこと - Qiita](https://qiita.com/e99h2121/items/95d1fa2b42f6439ce669)

### 最近がんばったこと

[AZ-900 と MS-900 合格まで (2023.01) - Qiita](https://qiita.com/e99h2121/items/4ee69f047e555990065d)

### 最終目標

https://twitter.com/e99h2121/status/1595193634961248256?s=20&t=y9ZklOnj8SyNGNRT3tYIyg

[2022秋 - 平野レミの早わざレシピ！ - NHK](https://www.nhk.jp/p/remihayawaza/ts/4QM57ZYP2N/episode/te/8XZRLG8VRW/)
「IT界隈の平野レミみたいになりたい」はこれを見てて思いました。
私はフランス料理は作れないんですけど、みんなが作ってみたくなるものを普通に作るのは好きかなみたいなやつです。

### 小咄のオチ (ChatGPT さんのアドバイスが完璧すぎた件)
![qiita-2023-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/2fb4affc-0ccd-e11e-e2ae-ca9f38a86b6c.png)
![qiita-2023-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/125acc51-3392-2a8a-d475-6f9be475ea7b.png)

... 完璧だ。アウトプットはいいぞ。

## 追記

結局全然盛り込まれなかった下書き
```md
問題提起
考えられる解決法
実際にやったこと
途中で出会った問題
ふりかえりとまとめ

好きな話
https://www.co-media.jp/article/9411

喋る機会をいただいた
前職やめるときの話とかするかと考えていたが前職の仲間にインタビューして会社なんて小さい枠だなとおもった
自分は自分にメリットがあると思ってやってるので自利

でも何かを続けることに興味を持ってもらっているとしたらそのコツとか面白みを共有できたら楽しいと思うのでそういうことを話したい

まず転職でも自己紹介でもなんでもだが
言わなくても人が自分のことをわかってくれることはない 

自分がどういうことを考えるかとか、できるかとかは言葉にしておきたい
資格を取るとか本を読むとかしたらそのプロセスがどうだったかとか顧みたい

ほんとにインプットで精一杯なことはある
最近とくにそうで解決したあと振り返る暇がない
でも自分なりのメモはのこしてる

自分に役に立つからだしあとから見て楽しいから
20 年もあるので 20 年分振り返ってると 10 分ではたりないのだが

アウトプットしよう！と思うタイミングはあった
モヤモヤだったり
惰性だったり
自分のやってきたことを見える化して振り返るためにやるのがアウトプットかも

自分をじぶんでどう評価するか
完全に他者に対して上から何かを教えようとするか
他者に対して下から謙遜しながらつまらないものですが式に伝えるか

どちらでもなく、単に自分目線で、自分が主語で何をその時学んだかをただ記録する
コツとして、現実で経験したことをオンラインに書きとめ
オンラインで体験したことは現実に話す、とやっていると不健康な心持にはならない
```
ポエムですね

## さいごに
[Qiitaのいろいろランキング2022 - Qiita](https://qiita.com/Qiita/items/75a34af032d898a86679)

https://speakerdeck.com/e99h2121/she-hui-ren-20-nian-mu-enzinia-fa-xin-deji-shu-xue-binaositeruhua

あらためて大変ありがたい機会をありがとうございました！


## 後日

[アウトプットは「出しすぎても出さなすぎもだめな“監視ログ”」　“息を吸うように発信する”登壇者が語る、アウトプットの考え方 - ログミーTech](https://logmi.jp/tech/articles/328245)
Renesas RAマイコンを使ってみよう～AzureRTOS編～

Renesas RAマイコンを使ってみようの続きとしてRTOSの一つであるAzureRTOSでBlinkyを試してみましょう。
# AzureRTOSのBlinkyプログラムの作成
__ファイル⇒新規⇒Renesas C/C++ Projext⇒Renesas RA__ を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ec81b227-5810-ef12-cbde-b5303b2cf570.png)
__Renesas C/C++ Projext__ をクリックして、__Next__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/b23fb82b-8be7-fd5d-0355-7596a125bbae.png)
__Project Name__ を入力し __Next__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/24d9d2d0-f1cd-0e1e-e22c-2c98ee06e290.png)
使用するボードを選択し __次へ__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/978b36e3-759f-2722-995b-9459d47c2d9d.png)
今回は、FPB-RA2E1を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8d915fa8-1175-8001-e237-1d9f23359618.png)
__RTOS__ を __Azure RTOS__ にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a6a77933-3eee-beda-706c-e9d4bee6f7aa.png)
__Azure RTOS ThreadX - Blinky__ を選択し、終了をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7004f689-95a8-e5bb-1940-e2966dc049a3.png)
以上で、ボード設定などが入ったプロジェクトが用意されました。
__パースペクティブを開く__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dd75b174-7653-32ac-e2a7-dc9558197ece.png)
__Generate Project Content__ をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8c66752f-619d-6505-f46d-0639889c3758.png)
# ビルド・デバッグ
このまま、__ビルド、デバッグ__ し実行する事で __AzureRTOS__ 環境での __Blinky__ が行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/5229a5b3-dd43-3980-e61c-067ffaa10a3f.png)
STM32CubeIDEを使ってみよう STM32H7でAzureRTOS編2

__STM32CubeIDEを使ってみよう STM32H7でAzureRTOS編__ の続きです。

https://qiita.com/usashirou/items/4f6833c49d6abfd6860b

今回は、複数のスレッドを動かしてみます。
# Thread2個
Threadを2個に増やしてみます。
Threadを1個の時と同じような内容を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/92679b6f-5397-942e-320c-7d36558e31c4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/05648a6c-7b45-f5f5-366e-78393685246b.png)
# Thread3個
今度はThreadを3個に増やしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c1466495-4a81-6b7e-3625-2b4ec881e85c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/dbe609ee-4ca9-564a-2938-8504321c08a4.png)
## スレッド内容を比較する
今回は同じ内容を複数のスレッドにしました。
ただし、優先度✖を微妙に変えてLED1,2,3が動作しています。

    tx_thread_create(&thread_ptr,"my_thread",my_thread_entry,0x1234,thread_stack,THREAD_STACK_SIZE,x,x,1,TX_AUTO_START);
# 追加したプログラム
追加したコードを比較してみましょう。
### 1スレッド
```
uint8_t thread_stack[THREAD_STACK_SIZE];
TX_THREAD thread_ptr;

void my_thread_entry2(ULONG initial_input);

tx_thread_create(&thread_ptr,"my_thread",my_thread_entry,0x1234,thread_stack,THREAD_STACK_SIZE,14,14,1,TX_AUTO_START);

void my_thread_entry(ULONG initial_input)
{
	while(1){
		HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
		tx_thread_sleep(50);
	}
}
```
### 2スレッド
```
uint8_t thread_stack2[THREAD_STACK_SIZE];
TX_THREAD thread_ptr2;

void my_thread_entry(ULONG initial_input);

tx_thread_create(&thread_ptr2,"my_thread2",my_thread_entry2,0x1234,thread_stack2,THREAD_STACK_SIZE,15,15,1,TX_AUTO_START);

void my_thread_entry2(ULONG initial_input)
{
	while(1){
		HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
		tx_thread_sleep(20);
	}
}
```
### 3スレッド
```
uint8_t thread_stack3[THREAD_STACK_SIZE];
TX_THREAD thread_ptr3;

void my_thread_entry3(ULONG initial_input);

tx_thread_create(&thread_ptr3,"my_thread3",my_thread_entry3,0x1234,thread_stack3,THREAD_STACK_SIZE,15,15,1,TX_AUTO_START);

void my_thread_entry3(ULONG initial_input)
{
	while(1){
		HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
		tx_thread_sleep(20);
	}
}
```
基本は同じプログラム内容です。
単純なスレッドなら容易に作れましたね。
laravel モデルクラスと一緒にファクトリーとシーダーとマイグレーションを作成するコマンド

# 概要

- モデルクラス作成時にファクトリー、シーダー、マイグレーションを同時に一回で作成するコマンドをまとめる。

# 方法

- 下記を実行することで一回で作成する事ができる。

    ```bash
    php artisan make:model -fsm モデル名（基本単数形）
    ```

- `-f`をつけるとモデルクラスと一緒にファクトリーを作成
- `-s`をつけるとモデルクラスと一緒にシーダーを作成
- `-m`をつけるとモデルクラスと一緒にマイグレーションを作成
Power Apps のコンボボックスやドロップダウンで選択肢列の値でフィルターをする

# はじめに

以下のようなアプリのように、Power Apps でデータのフィルターをしたいケースがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2f11be78-914f-d679-8c49-0b0f7f30cffe.png)

この際、選択できる値は、Dataverse や SharePoint リストの選択肢列に存在する値にしたい、といったニーズがあります。
例えば、以下の場合、"新規"、"対応中"、"完了" でフィルターしたいといった感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/18d7db14-c776-749c-42d9-15d4a50ece6b.png)
もちろん、以下のようにすることもできるのですが、データソース側の選択肢列の値が変更になった場合、アプリ側も改修が必要なため、あまり効率が良くないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/177804ed-14ba-4a9d-a601-b27fcba31e54.png)
しかし、特に最初のうちは、コンボボックスやドロップダウンにどのような値を入れたら良いか分からないという方もいると思います。
そのため、今回は、Dataverse や SharePoint リストの選択肢列をコンボボックスやドロップダウンに設定する簡単な方法について説明します。

# 実装アプローチ

まず、別の画面を用意して、フォームを追加し、フィルターしたいデータソースを設定します。
今回は、問い合わせリスト (SharePoint リスト) を指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/89c59fe2-7491-1f3e-d553-782a401d9dce.png)
このリストの中で、フィルターに使用したい選択肢列を選び、`[Items]`プロパティの値をコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/dada5914-4c6a-c47e-2ed0-9e99ea1d2cb0.png)

:::note warn
以下の記事で触れているように、列名を日本語で作成しているため、Odata__ といった、分かりにくい表記になっています。
:::
https://qiita.com/Takashi_Masumori/items/e3f99db1436d186adcde

:::note warn
コピーするためにロックを解除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f4427c84-b917-0a53-9948-e755034c8f12.png)
:::

以下のコンボボックスの `[Items]`プロパティにコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8bb3d654-8e36-5eba-93dd-4404cb81c6d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8bafdc67-e1be-1e0c-f30c-238214a30d01.png)
やることはこれだけです。あとは、一時的に作成したフォームおよび画面を削除します。
※ギャラリー側をコンボボックスの値でフィルターする処理は割愛いたします
Power Apps のフォームのフォーマットを一括で変更する TIPS

# はじめに

英語の情報はいくつかありますが、日本語の情報はあまりみたことなかったので紹介いたします。

Power Apps でフォーム コントロールを使う際、例えば、フォントを変えたい、文字のサイズを変えたいなど、フォームの部品全体のフォーマットを変更したい場合があると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/33d8c436-d470-b040-a112-df6410fae324.png)

もちろん、１つずつ部品を選択して変更することもできるのですが、フォームコントロールを利用する際、沢山の部品があるため、結構面倒くさいです。
そのため、今回は、Power Apps のフォームのフォーマットを一括で変更する TIPS を紹介します。

# TIPS

まず、以下のように、フォームのレイアウトを現在のレイアウトと別のレイアウトにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c76b9bc9-83ca-888e-6cd0-11126c429091.png)
そして、[元に戻す] ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/98d6b6e4-cacb-1a92-6548-181deceaf02f.png)

:::note warn
[戻る] ボタンを押してしまわないようご注意ください。
:::

すると、以下のように、フォームコントロール内の複数の部品が選択された状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/85ecbac7-0241-5531-edab-5056a8d4f449.png)
今回は、分かりやすくするため、フォントを 13 から 20 辺りにしてみます。全ての部品のサイズが一括で変更されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b33f9c9c-0ccb-c326-0f8e-19e01984f127.png)
こちらの方法を利用することで、フォームの部品のフォーマットを一括で簡単に変更することができます。
Power Apps でフォームで自動生成されたコンボボックスをラジオボタンに変更する

# はじめに

Power Apps のフォームコントロールを利用すると、フォームコントロールにデータソースを指定した際に、列の種類に応じて自動で入力フォームを生成してくれるため、データソースに対するデータの登録処理を簡単に作成することができます。

例えば、以下は、SharePoint リストにあるお問い合わせリストをデータソースに指定した際に生成された入力フォームです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9c366875-0828-1f64-bf0a-c5bad0fdc7f6.png)

こちらをベースに、入力の順番を入れ替えたり、サイズを調整したり、お問い合わせ時には入力が不要なものは非表示にしたり消したりして、最後に、ボタンを追加して、`[OnSelect]`プロパティに以下の一行を書くだけでデータの登録が可能になります。

```
SubmitForm(フォーム名)
```
しかし、既定で作成された入力フォームの入力形式を変更したいと思う場合もございます。
例えば、データソースに以下のような `はい/いいえ` の列は、既定ではコンボボックスとなりますが、ラジオボタンに変更したいといった感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/64df0b0f-8f4a-7cfc-5804-2a1afff84ded.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/27d7da68-e16e-2b02-4a21-2114640dcc9b.png)

今回は上記を実現する方法について紹介します。

# 実装アプローチ

まず、以下のように、変更したいデータカード内にラジオボタンを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/814ed97b-4c3f-b9f9-b629-07034c450666.png)
ラジオボタンの `[Items]` プロパティは、コンボボックス (DataCardValue) と同じにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c12282d4-d4f0-4a2c-d876-6bf9ee1ff7b7.png)
そして、コンボボックス (DataCardValue) 側の `[DefaultSelectedItems]`を "ラジオボタン.Selected" に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4cd27945-06c6-baa6-8a80-ee802e6e1a63.png)
最後に、コンボボックス (DataCardValue) 側を非表示にしておきます。
これで、入力形式をラジオボタンに変更することができました。