OmniAICreator/Qiita-1.07M huggingface dataset:
BloomRPCは開発が終了したのでPostmanを使いましょう

# BloomPRCプロジェクトは2023-01-04を以ってアーカイブされました

https://github.com/bloomrpc/bloomrpc

時間が経ってセキュリティ上の問題が発生するので、開発が終了したアプリを使うのは避けましょう。

# 代替アプリは？ Postmanを使いましょう

PostmanでgRPCのリクエストを投げることができます。

https://www.postman.com/

# 使い方

非常にシンプルです。公式サイトに記載されています。

https://learning.postman.com/docs/sending-requests/grpc/grpc-request-interface/

# まずはBloomRPCを削除する

`brew`コマンドで入れた人

```shell
brew uninstall bloomrpc
```

zipなど手動でインストールした人は以下の手順で削除できると思います。

macOSのFinder -> Application -> Trashへ移動

# Postmanをインストール

```shell
brew install --cask postman
```

# Tips

最初にアカウント登録してくださいと画面に出てきますが、ログインフォームのlightweight API Clientをクリックすればアカウントなしで使えるようになります。

![Screenshot 2023-12-10 at 7.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684725/41534df9-8337-98dc-8687-ff1c9b29e39e.png)

# Postmanの機能はHTTP Clientだけじゃない。

gRPC, GraphQL, WebSockt, Socket.IO, MQTTなども使えるようになっている。

![Screenshot 2023-12-10 at 7.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684725/c634b3ad-b6b6-ef97-d4b3-6176bdd11622.png)

# コメント

私はcurlコマンドで十分派閥だったのでPostmanを久しく入れていませんでした。

いつの間にかPostmanこんなに進化していたとは。
Elixir &&とandの使い分けについて学ぶ

このアンチパターンを読んでみました
https://hexdocs.pm/elixir/1.16.0-rc.0/code-anti-patterns.html#non-assertive-truthiness

う～～ん、そもそも&&とandの違いはなんですか？
試してみてみよう。
```Elixir
iex(6)> true and false 
false
iex(7)> true and nil  
nil
iex(8)> true and 2  
2
iex(9)> 1 and 2   
** (BadBooleanError) expected a boolean on left-side of "and", got: 1
    iex:9: (file)
iex(9)> nil and 2
** (BadBooleanError) expected a boolean on left-side of "and", got: nil
    iex:9: (file)
iex(9)> 1 && 1   
1
iex(10)> 1 && 2
2
iex(11)> 2 && 1
1
iex(12)> "a" && 1
1
iex(13)> nil && 1
nil
iex(14)> nil && IO.puts("hello")
nil
iex(15)> 1 && IO.puts("hello")  
hello
:ok
iex(16)> false and IO.puts("hello")
false
iex(17)> true and IO.puts("hello") 
hello
:ok
iex(18)> 
```
どちらも論理演算をするものらしい。
andの方は、andの左側の値はbool値でないとエラーになる。nilも不可。

```Elixir
if is_binary(name) && is_integer(age) do
  # ...
else
  # ...
end
```

このコードに問題はないんだけど、比較する値がbooleanだったら、and, or,notを使いましょう

```Elixir
if is_binary(name) and is_integer(age) do
  # ...
else
  # ...
end
```
使い分け方

|演算子|引数の型|
|-----|--------|
|and, or,not|boolean|
|&& \|\| !| 任意の値。nil,falseを偽、それ以外を真|
Elixir パターンマッチングを使って、想定外の値は早い段階でエラーにしよう


次のプログラムどう思いますか？

```Elixir
defmodule Extract do
  def get_value(string, desired_key) do
    parts = String.split(string, "&")

    Enum.find_value(parts, fn pair ->
      key_value = String.split(pair, "=")
      Enum.at(key_value, 0) == desired_key && Enum.at(key_value, 1)
    end)
  end
end
```

&で分割して、key=valueの組をつくって、desired_keyをキーとする値を求めるプログラムですね。
これで問題なく動きます。

達人プログラマーに確か、エラーは早い段階で検出する。エラーを隠して後の段階で問題が起きるような構造にしない。みたいなのがあったと思います。
このプログラムは、想定外のURL形式でもエラーになりません。

```Elixir
iex> Elixir101.get_value("name=Lucas&university=UFMG&lab=ASERG", "lab")
"ASERG"
iex> Elixir101.get_value("name=Lucas&university=institution=UFMG&lab=ASERG", "university")
"institution"
```

パターンマッチングを使って記述すると、key=value1=value2の場合、マッチングできないのでエラーになります。
```Elixir
defmodule Extract do
  def get_value(string, desired_key) do
    parts = String.split(string, "&")

    Enum.find_value(parts, fn pair ->
      [key, value] = String.split(pair, "=") # <= pattern matching
      key == desired_key && value
    end)
  end
end
```
記述も簡素になっていい感じです。

doctestで実行してみました。エラーになりました。
```Elixir
  1) doctest Elixir101.sample1/1 (1) (Elixir101Test)
     test/elixir101_test.exs:3
     ** (MatchError) no match of right hand side value: ["university", "institution", "UFMG"]
     stacktrace:
       (elixir101 0.1.0) lib/elixir101.ex:38: anonymous fn/2 in Elixir101.get_value2/2
       (elixir 1.14.4) lib/enum.ex:4239: Enum.find_value_list/3
       (for doctest at) lib/elixir101.ex:6: (test)
```

参照にしたElixirドキュメント
https://hexdocs.pm/elixir/1.16.0-rc.0/code-anti-patterns.html#non-assertive-pattern-matching
Elixir Mapの参照方法は二種類。必須の時とオプションの時で使い分けよう

# Mapの値参照方法

Mapの値参照には、[]と. を使った二種類の書き方があります。
この二つ同じだと思ってたんですが、違いがありました。

|記述|キーが存在しない時の動作|
|---------|--------------------------------------------------|
|point[:z]|nilが返される。エラーにならない|
|point.z|エラーになる|

例をみてみましょう
```Elixir
iex(5)> point = %{x: 10, y: 20}
%{x: 10, y: 20}
iex(6)> point[:x]
10
iex(7)> point[:y]
20
iex(8)> point[:z]
nil
iex(9)> point.x
10
iex(10)> point.y
20
iex(11)> point.z
** (KeyError) key :z not found in: %{x: 10, y: 20}
    iex:11: (file)
iex(11)> 
```

必須の値の場合はpoint.zの形式で使用しましょう。
キーが存在しない場合エラーになります。
pointが3次元の座標を表す場合、point.zが適切ですね。
これをpoint[:z]とすると、この部分ではエラーにならず、実際にこの値を使う段階でnilの為にエラーとなります。
エラーは隠さず早い段階で出すようにしたほうが良いです。

point[xx]の記述は、必須ではない値を取得する場合に便利です。


元ネタ
https://hexdocs.pm/elixir/1.16.0-rc.0/code-anti-patterns.html#non-assertive-map-access
Company-Wide Org Settings  


+ [Company-Wide Org Settings](https://trailhead.salesforce.com/content/learn/modules/company_wide_org_settings?trail_id=integrate-a-new-business-organization)

# Learn About Regional Settings

何もしないで、検証ボタンをクリック

:::note alert
We can't find your company's Street set to '123 Secret Street'.
:::


Set your company's Fiscal Year Start Month to February まで設定して検証ボタンをクリック

:::note alert
In your user profile, we can't find the Time Zone set to '(GMT-:04:00) Venezuela Time (America/Caracas)'.
:::

個人の設定をしたら、合格

# 未解決

+ [Org-wideEmail を Flow のメール アドレスとして割り当てる方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ak9iO)

現在、連絡先のメールへのメール送信フローを実行しています。このメールは、私の個人的なメールではなく、会社のメールから送信したいと考えています。現在は私の個人メールから送信しています。組織全体の電子メールを適切に設定しましたが、送信者の電子メール アドレス内のどこにもその電子メールを受信できないようです。これをハードコードする必要がありますか、それとも「メールの送信元」を組織全体のメールに設定するより良い方法はありますか?
Tableau:ここで詰まる！書式設定ってどこで何を設定できるのさ？

# 書式設定って結構悩まないですかね？
Tableauさん、できること、表現の幅がチューニングできすぎて逆に直感的に書式設定で悩みませんかね？
エクセルだったら軸クリックしてホイってすぐに太さや色を変えられるところが、なかなか目的の設定にたどり着けない。。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/a030681f-e3fe-d28b-fe6e-1a619c334507.png)
ええっ!?私の書式設定、多すぎ？


そんな(自分の）悩み解決に今回書式設定の基本を書いてみることにしました。

### ワークブックの書式設定で一気に変える！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/3a88b3cf-6363-7ef7-f001-148baefe9bc6.png)

ワークブック全体のフォントと線を設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/c4c58c49-8660-6f9f-0170-880ad11800f4.png)

## クロス集計表と線グラフの書式がどう変わるのか確認してみましょ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/4f1123da-4345-20d7-13af-bd290ae40b97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/9e8f8649-b895-e942-6476-5004b374d70a.png)

二つともサンプルスーパーストアでとりあえず作ったもので、書式設定メニューをいじるとどこが変わるのかを見ていきましょう！

### UD　デジタル教科書体を設定しました。

ツールヒントの設定ポップアップも全部フォント設定が変更されているのが分かりますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/9797b108-8eb3-0f4a-1aea-5216d60e3443.png)



# 書式設定項目でかえたとこを全部表示してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1167883/f2abfd3c-662c-8714-c4f2-794ff7cea817.png)

ドロップラインやリファレンスラインなどはちょくちょく使うので、自分の環境に合わせて最初に設定しておくと後が楽になると思います。
敢えて赤色でグリッド線を出していますが、かなりやかましくなる印象ですよね？私の場合はこれはオフにしておくことで「見てもらいたい線」の視認を邪魔しないように心がけています。

明日以降、かゆいところに手が届く漢字の細かい設定を見ていこうと思います。
高位合成言語アセンブラを作る。 その23

# 概要
高位合成言語アセンブラを作る。
練習問題、やってみる。
構想編

# 練習問題
3 の正の倍数検出回路を作れ。


| c | b | a | z |
|:--|:--|:--|:--|
|0|0|0|0
|0|0|1|0
|0|1|0|0
|0|1|1|1
|1|0|0|0
|1|0|1|0
|1|1|0|1
|1|1|1|0


# 方針
- sympyで論理式を求める。
- 真理値表を書く。
- 回路図を描く。
- verilogを高位合成する。

# sympyで論理式を求める。

# サンプルコード

```
import sympy as sym


print(sym.SOPform(['c', 'b', 'a'], [[0, 1, 1], [1, 1, 0]]))



```

# 実行結果

```
(a & b & ~c) | (b & c & ~a)
```

# 成果物

https://paiza.io/projects/n0oTd8t2F3VXQ5fE3sjZQg?language=python3

以上
IT エンジニア、マサカリ上等か？、批判文化は良いことないか？

前の日の読書メモ ([「世界一流エンジニアの思考法」を読んで、そのメモ #読書 - Qiita](https://qiita.com/e99h2121/items/c81071b7d8e7813dd5fd)) に出てきたチームワークという話。特に転職してみて「チームワーク」大事だな、チームワークに助けられているなあと思うことが多い。

先に全く関係ないところから引用するのだが、最近以下記事を読んだ。


https://note.com/namamen/n/n6bd594c5e4ff


上にまとめられているような内容は耳タコで聞いた。先の「思考法」の良いところって意外とそれとも似てるんだよなあと思うことも多々ある。

多々ありつつも、似てないところもある。自分なりに最近アップデートしようとしている部分を書いてみる。

## 「マサカリ上等」か？、「批判文化は良いことない」か？

会社に限らずそしきは人、「チームワーク」が大事だと思う。そこに存在する伝統、我々の業界の「マサカリ」。

https://qiita.com/KengoTODA/items/a44e275c94f9d902370e

> マサカリとは愛である。

私もそう思う。ただそれは単にその時代背景から体験してきた世代であるからだけかもしれないとも思う。私は中学校の部活ではぶっ叩かれたこともあるし就活の時に流行りだした言葉は「勝ち組負け組」だ。2ちゃんねるど真ん中だ。

一方で今年初めて小学校に入ったこどもの運動会を応援した。あのね、全然順位付けが無いの。ただ徒競走して各々記録を取るだけなの。あとはダンス。良かったよ。でもそこはマサカリの無い世界なの。

彼らが社会に出るころに、果たしてマサカリって通用するだろうかと思ったよ。


### イチロー談、自分で自分に厳しくなるしかない論

[イチローも警鐘を鳴らした…「大人に叱ってもらえない」Z世代が直面する「やさしさという残酷」（御田寺 圭） | 現代ビジネス | 講談社（1/6）](https://gendai.media/articles/-/119371)

> これは一見すればやさしさをまとってはいるが、しかし同時に、若者たちに「剥き出しの自己責任」を課していることと表裏一体だからだ。

> イチロー氏が述べるように、ある時代までは、自分で自分を厳しく律することができない人であっても、その人の近くにはきっと「厳しい大人（先輩）」がいて、その人の自堕落さや怠け癖をシバいてくれていた。だからこそ、自分を甘やかして易きに流れるような者でもどうにか脱落することなく、それなりのクオリティに仕上がることができていた。とくに若者は遊びたい盛りなのだから、自分でそうした欲望を厳しく律して生活するのは容易ではない。



### 本田、メンタル強い論

https://x.com/RR_consultant/status/1723279399229788299?s=20

メンタル強い弱いとは。
これからやれることにフォーカスしている限りはポジティブでいられるとの話をしている。


## 結局？

冒頭のチームワークにようやく話を戻すが、最近思うこと。チームで働くときにマサカリは、お尻をたたいて動かすこと、ニンジンは、釣って動かすことだと思う。どっちでもいいんだけどひっくるめて「チームワーク」というフレームは同じで、それぞれの納得感がそのチームで形成できてると皆で成長できるんだろうねえ。だから相手がマサカリをどう受け止めているかを見極めて投げないといけないんやねえ。相手がマサカリを受け止めきれるかどうかなんて普通はわからないので、だったらまずはみんなで皆に優しくし合うほうが皆いいし、自分もそれによって受ける恩恵というか、そういう優しいチームで働くことの心地よさにはかなり感動している。

## つづく

年取って批判だけしていても偏屈に見えるだけだって話もある。このマサカリ カレンダーは面白いけどな。

https://qiita.com/advent-calendar/2017/axe

ってことでお前らのマサカリは間違っているって話だった。つづく。
ログの概念についての備忘録

## はじめに
ログの概念について備忘録です💁
初心者です😅
間違えてる部分多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇

サーバー構築においてログに多く触ることになりました。
ログの重要性をより理解して今後に役立てます。

今後、ログに関しての知識のアップデート（セキュリティやログデータのことなど）は別でアップ予定。

## 🦁 結論 🦁

:::note info
ログに関して押さえておくべき点
* ログは「タイムスタンプ」「イベントレベル」「エラーコード」など様々なものを残すことで分析と問題解決をする時に役立つ
* ログをテキストファイルなどに残すことによりシステム監視や保守に重要な役割を果たすもの
* 規制遵守、監査のために必要とされることがある
:::

:::note warn
ログを使うタイミング
* どこの処理に時間が、かかってしまっているのかを確認したいとき
* アプリケーションの起動、終了
* ユーザー認証
* エラー発生（例外やエラーが発生した際）
* システム警告（メモリ不足、ディスク容量不足などシステムに関わること）
* データベース操作（）
* 外部APIを呼び出した時（リクエスト、レスポンス）
:::

:::note alert
注意点
* 過剰なログ出力は避ける
* 機密情報は含まない（個人情報、セキュリティの漏洩に繋がる）
* 一貫性のあるのフォーマットにする（可読性アップ）
* ログレベルを適切に使う
* ログの保管とアクセス管理が大事（簡単にいじれてしまうと改ざん、不正アクセスに繋がる）
:::
デスクトップフロー活動状況のPower BIテンプレートの中身を見てみる

### 最初に
　この記事はMicrosoft Power BI Advent Calendar2023　15日目の記事になります。

 https://qiita.com/advent-calendar/2023/powerbi
 

### 内容
　Power Automateのデスクトップフローの活動が見れるようになって、その活動レポートをPower BIテンプレートファイルで確認することが試してみました。

### テンプレートの取得とパラメータ設定

#### テンプレートの取得の場所
Power Automateのデスクトップフロー活動を開くと、右上に「Power BIから開く（プレビュー）」があるので開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/226069fb-e944-672b-95ea-6b44cd44d250.png)

#### テンプレートのダウンロード

Power BIでの活動を監視する（プレビュー）のメッセージが表示されるので、組織IDをコピーしてテンプレートを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/7248ecba-64fe-a068-7764-4d6cd0ed61ff.png)

#### Organization urlの設定

テンプレートファイルを開くと、Organization urlの入力が求められるのでコピーした組織IDを貼り付け読み込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/8214f3fc-324a-eb43-3439-0b72eab654ad.png)

#### CommonDataServiceのサインインが求められた場合

CommonDataServiceのサインインが表示された場合には、マイクロソフトアカウントにてログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/615e75c4-66a4-82fa-5648-436e570012b6.png)


Power Automateのデスクトップフローの活動レポートが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/15ec462e-ad9d-41bf-c145-6c5aee2c7dea.png)



### テンプレートの内容確認(Power QUery)

#### Power Queryにてデータソースとテーブルの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/f6f108ee-afad-fa23-2597-807dad8c0c5e.png)


 データソースの接続先がCommonDataService.Databaseになっており、テーブル名が「flowsession」になっているので、Dataverseの「flowsession」にデスクトップフローの活動履歴が保存されていることが確認出来る。
 
```c#
= CommonDataService.Database(#"Organization url", [EnableDisplayNames=false])
```


```c#
= Source{[Schema="dbo",Item="flowsession"]}[Data]
```

Power Appsのテーブルにも、flowsessionテーブルを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/6a798d61-01be-6413-8ee6-6ec019c66338.png)


### テンプレートの内容確認（モデリング・メジャー）

#### データモデルにて
ファクトテーブルがflowsessionでDirectQueryにて接続、日付テーブルは計算テーブルで作成されており、1対多でリレーションシップされていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/c51c1c4c-a930-ba40-60d6-268253b09db8.png)

#### メジャーを確認
flowsessionテーブルに、複数のメジャーを確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/cb5e095b-0959-e575-29fc-321a0b77a318.png)



テンプレートではFILTER関数を使って、statuscodeが4（フロー成功）の件数を取得している。

```c#
Count of flowsession for Success = 
COUNTROWS(
    FILTER(
        flowsession, 
        'flowsession'[statuscode] IN { 4 }
        )
    )
```

テンプレートではFILTER関数にてメジャーを作成しているが、CALCULATE関数を使っても同じ結果になるかも確認してみる。


```c#
Count of flowsession for Success = 
CALCULATE(
    COUNTROWS(flowsession) ,
        'flowsession'[statuscode] IN { 4 }
    )
```

#### レポートを確認
デスクトップフローが2023年1月に増え、2023年2月をピークにそれ以降は落ち着ているように見えるので、利用する人が固定化されているということだろうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/682b5436-f4bf-492f-be48-b8cbf65c2759.png)



### まとめ
 Power Automate For Desktopの活動フローのテンプレートの中身を確認してみました。
 テンプレートでデスクトップフローの活動履歴の仕組みが分かるので、オリジナルレポートの作成に挑戦しようと思う。
thisには２つの顔がある

thisには２つの用途があると学んだので備忘のため残す。

１つめ
コンストラクタはオーバーロードして複数定義できる。
オーバーロードされたコンストラクタから別のコンストラクタを呼び出すにはthisを使う。

```java
public class Sample{
	public Sample(){
		this(null,0);//この引数がオーバーロードされたコンストラクタに渡される。
        //thisの前には何も記述しちゃいけない
      
	}
	public Sample(String str, int num){
		System.out.println("OK");
	}
}
```
２つめ
インスタンスそのものを表す参照に入れる特別な変数

```java
public class Sample{

	public String str;
	public int num;

	public Sample(String str,int num){
		this.str = str;　//生成したインスタンスのstrに値を入れてる
		this.num = num;　//生成したインスタンスのnumに値を入れてる
	}
```
市場価値に関する考え方

## 目次
0. [初めに](#初めに)
1. [市場価値](#市場価値)
2. [逆算思考](#逆算思考)
3. [還元](#還元)
4. [まとめ](#まとめ)


## 1.初めに
大学生になり就活や将来について漠然と考えなければならない頃、自分の強み、やりたいことについて考えることが多いと思います。

自分自身、高校生の頃から漠然とデータサイエンティスト(DS)になりたいと考えていました。ただ、ふたを開けてみればデータサイエンティストは専門職で、大学院まで進み学問を突き詰めた人間がほとんどの狭き門でした。もともと大学院には進学予定だったが、浪人もしてるし、いち早く社会に出たいと考えたため学部卒でデータサイエンティストを目指しました。

統計学等は勉強していたがプログラミングを本格的に始めたのは3年生の1月。就活を始めたのは3年生の4月だった。実力のない中でどのようにDSの世界で戦うための戦略を立てたかを記載したいと思います。


なんか偉そうに語ってますが、自分は就活初期にとても苦労し悩んだので、これ読んで少しでも気が楽になればなという思いです

## 2.市場価値
自分の場合はデータサイエンティストになりたい、けどデータサイエンティスト分野で院生に勝てない。という根本的に致命的な状況でした。けど同時に、どんな世界でも上には上がいる事は当たり前だと思ったので以下のように考えました

**総合値で戦おう**

これは就活をする上でかなり活かされました。例えば、自分のような専門職志望では**ハードスキル×ソフトスキル×行動力** が組み合わされば最強だと考えました。ハードスキルは劣っていてもソフトスキル、行動力で挽回しようと作戦を立てました。そこで、次の逆算思考は大いに有効です。
## 3.逆算思考
これは人生のあらゆる場面において役立つと考えています。時には逆算のせいで実力が制御されることもあるかもしれないけど、闇雲に取り掛かるよりは逆算して考えたほうが良いと思います。

以下は自分の就活を始めた際に考えていた逆算です。

データサイエンティストになりたい。けど院生には実力で勝てない。からソフトスキルと行動力で圧倒する必要がある。ソフトスキル、行動力では学生団体の代表を務めていた経験をアピールできるが、もう少し突き抜けたい。データサイエンススキルもアピールに欠ける。なので近いうちに
- 長期インターンでデータサイエンティストを務めよう
- 負荷がかからない程度に資格を取ろう
この2つが達成されれば目標に一歩近づくと考えました。実際これらは9月に成し遂げ、大いにアピール出来ました。

考え方は**大目標(ex.データサイエンティストになりたい) > 中目標(ex.長期インターンで研鑽を積みたい、資格を取りたい等) > 小目標(ex.今月中に5社長期インターンに申し込む、来週までに資格勉強を50ページ進める)**

自分は大目標1つ、中目標3つ(1ヵ月~3か月スパン)、小目標3~5つ(1週間~1か月スパン)くらいの感覚で行っています。

こんなこと言いながら基本的に自分に甘いので達成できない小目標は山のようにありました。けど中目標、大目標は達成できるように意識していました。

## 4.還元
そもそも就活を始めた際に「年収が高いところがいい」「休みが多いところがいい」とか**企業→自分**の方向ばかり考えていました。しかし就活では企業に必要な人材を取るので、**自分→企業、つまり「自分が企業に対してどのような利益をもたらすか」「どんな価値を創出できるのか」** を考えるべきです。といっても現段階の自分の実力では利益をもたらすことはできないので、**将来自分はその企業に対してどんな利益をもたらしたいか**について考える必要があります。(面接でキャリアプランについて聞かれることも多い) また、そのためには過去の行動力で説得力を増やす必要があります。
+αで**自分→社会**について考えることも重要です。自分が社会に対してどのように貢献したいかを考えてました(せっかく働くならより多くの人のためになりたい精神)

## 5.まとめ
5月~6月頃は、週5で家に籠って就活してたから相当辛かったけどオンラインで学生団体の友達とES添削し合ったり面接練習して孤独感は回避してました。

ESとか面接で落とされると人生否定されたような気持ちになるっていう人もいるけど、自分を落とすなんでこの企業見る目ないなって本気で思ってたし、そのくらいの精神でいくべし。

就活はキツいけど、今までの人生を顧みたり言語化することもできたので自分を知るいい機会だと思います。
Debugビルドの時だけApp Transport Securityを無効化する (Xcode13以降用)


iOSプロジェクトのビルド設定の整備において、Debugビルドの時だけApp Transport Securityを無効化したい時があります。

で、この対応方法が難儀なものであるのが、以前までの私の認識でした。[^1]
[^1]:[Q. ATS を Debug ビルドでだけ無効にしたいのですが...](https://akisute.com/2016/10/q-ats-debug.html)

現在のビルド設定事情を調べたところ、Xcode13以降で作成したプロジェクトならば、info.plistのファイルは追加分の設定を行う役割となっています。[^2]
これによりタイトルの課題は、以下の方法で簡単に対応可能なようです。

* プロジェクト設定に デバッグ用の info.plist を追加する。[^3] (例: debug-info.plist)
* debug-info.plist について App Transport Securityの無効化設定を追加する。[^4]
* アプリTargetの Build Setting > Package > Info.plist File について Debugビルドの項目に debug-info.plist を指定する。
    * ※ info.plistの追加設定が無いビルドの場合は、空欄で構わない。

[^2]:[Xcode13 Release Notes](https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes#Templates)
[^3]:[Xcode 13以上でInfo.plistを安全かつ簡単に作成する](https://zenn.dev/ruwatana/articles/2045140478b1de)
[^4]:[「http://」のAPIを実行できるようにする(Swift)](https://qiita.com/uhooi/items/68939999c2c31e5f5557)

**検証**
「`http://yahoo.co.jp`」 などを使って通信させてみると、狙い通りにATS無効化が反映できている事が確認できました。

**補足**
なお、[このサイト](https://sarunw.com/posts/where-is-info-plist/)によると、info.plistのファイルによる設定追加は、全てのキーに対して有効では無いようです。

他の設定値を試される場合は、設定が反映されているかに注意が必要そうです。
マイルールを作ろう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の２２日目

# マイルール

- 自分との約束
- 自分をコントロールするための制約
- 行動指針
- みたいなものをマイルールとしてたくさん作るといいよ
- ちょっとくらい守れなくてもOK
- 今日できなかったら明日できればOK
- できなかったら罰ゲームを課して、ゲーミフィケーションにしてOK
- 誰しもぼんやりとして持っている自分の行動指針を明文化してブラッシュアップしていく
- すごい人になれるかは自分次第だけど、少なくても昨日の自分よりは理想の自分に近づく
- 頑張ろうって話

本文はここまで。以下は時間外。

# マイルールの指針

- 分野でわけると楽。生活とか勉強とか仕事とか
- アイデアはたくさん出す（１２日目でも少し書いた）
- 分類していく（一人KJ法）
- アイデアを整理していく過程で本質的にどういうことかを詰める（一人KA法みたいな）
- ルールはいくつあっても構わないと思うけど、覚えられる数か切りのいい数にするといい。マジカルナンバー７（ミラーの法則）や、10戒、12 Facter、xxルール（21とか42とか50,99,100なんかよく入る）
- 最初は理由を付けた行動の動詞で書くと楽かも（行動指針は普通動詞になるね）例えば、毎週振り返りをするために毎日日記をつける、とか（こういう簡単なことをルールにしておくと成功体験が積み上げやすい）
- 基本的には長期的視点で超短期で可能な内容にする（小さなことをコツコツ積み上げられるルールにする）
- 長期的視点のゴール部分はマイルールとは別の、目的や目標、ゴールとして集めておくといい。その集合が概ねなりたい自分ってことのはず
- 習慣化した、気にしなくても出来るようになったルールは、リストから外してアーカイブしておくと将来役に立つ（かも）

# ツール類

- Trello などのリストツール（Trello大好きだなｗ）
- xmind などのマインドマップツール
- Notion も見やすくつくれる

# マイルールの例的なもの

- エンジニアならスキル毎の指針があると便利。git やプログラム言語やツール類の使い方や守るべきルール、を自分なりにまとめるやつ。リーダブルコードとかIT系の書籍には参考になる良書がたくさんある
- ポータブルコーチってゆうちょっと古い（20年前は古いでいいよね？）本があって、世界的なコーチの第一人者だったトマス・レナードという方の集めた指針集みたいな本なんだけど、お題ごとに対処方法トップ１０みたいな形で整理されている
- アマゾンの[リーダシッププリンシプル](https://www.aboutamazon.jp/about-us/leadership-principles)も割とメジャーな行動指針のはず
- ビジネス書界隈だと〇〇のルール、法則、鉄則みたいなのが腐るほど出ていると思うので、お気に入りを探すのも面白い。もちろん参考になる内容がたくさんあるはず
- <details><summary>人に話すようなことでもない個人的なマイルールの一部</summary>

    - 毎週１つは新しいコードを追加
    - 毎週１つは既存運用の動作確認
    - 毎週１つは既存コードの改善
    - 毎週１つは不要なコードの削除
    - 毎週１冊は手元の本の再読をする（流し読み可）
    - 気になったらすぐ辞書をひく。可能な限り手元の全部でチェック（うちには三国、新選、新明解、広辞苑などの国語辞書を揃えている）
    - 毎日一回[wikipediaランダム](https://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E3%81%8A%E3%81%BE%E3%81%8B%E3%81%9B%E8%A1%A8%E7%A4%BA) （新しい何かを知るきっかけにしてる。ブックマークツールバーに置いてる）
    - git を使う心構え（自分用とチーム用とある）
    - terraform の指針（ディレクトリやファイル分割、書き方についての整理とか）
    - とあることをしたらおやつを食べていい（というルールが書かれていたｗ）

</details>

# 改善依頼

- マイルールを公開してやるぜとか
- こんなマイルールを持っているぜとか
- マイルールの効能をもっとうまく説明してやるぜなどください
３時間でゲーム「２０４８」を再現した話【OpenSiv3D】

# はじめに

ゲーム開発の**完遂**には多くの困難を伴います。特に、長期間にわたる開発ではモチベーションの維持が難しいという問題が生じがちです。このような問題に対処する一つの方法として、[バンダイナムコスタジオ杯 | Siv3Dゲームジャム](https://siv3d.github.io/ja-jp/event/gamejam/)のような短期間（例えば2週間）でのプロジェクト完了を目指すイベントへの参加などがあります。これはモチベーションを維持する上で解決策となるかもしれません。

このアプローチをさらに推し進めたのが「超高速ゲーム開発」というコンセプトです。これは、わずか1日でゲームを構想から完成まで一気に進め、リリースするというものです。全く新しいゲームを作成するのもよいですし、既存のゲームをベースにした実装も興味深いでしょう。

今回は、３人の開発者（はむくん、agehama、Ryo Suzuki）が協力して、人気ゲーム「2048」をどのように再現したかについて紹介します。実際の記録映像もありますので興味ありましたら御覧ください。

https://youtu.be/GlwzQSPBuv8?si=SAjsL8guW98RCN_q


実際に動作するソースコード全文はこちら
https://gist.github.com/chobby/0a45b33805582473eadb5c094b7d442f

![ezgif.com-optimize (7).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34295/c649b75b-9905-5dea-6649-75d3d543b8f9.gif)


実装の変遷
https://scrapbox.io/hamstro/

# 実装の流れ

## 最低限の見た目を揃えてイメージを固める

![2a4cfa4a3aa7efacfc7bfe320a2db804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34295/631d19fc-0018-8f7a-6efd-34879503b9be.png)

https://scrapbox.io/hamstro/1

## アルゴリズムを実装する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34295/b5453de1-e5be-bcd3-c4ab-1c3695a955a2.png)

アルゴリズムについて議論する様子

![09199d15f895bf7cb413b1b2637d61b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34295/8bffd5dd-8af3-5ed3-e362-e7ed9a879ea9.png)

https://scrapbox.io/hamstro/2

## 見た目を整える

![5b52dc9b8fc25abb0b76e32e1a19056b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34295/c1df0dcc-2c8a-93a7-9c63-5523ee61657d.png)

https://scrapbox.io/hamstro/%E4%BB%AE%E5%AE%8C%E6%88%90

# おまけ

他にも様々な超高速ゲーム開発を行いました

## 魚釣りゲーム
https://www.youtube.com/watch?v=q0tf_Mb3H1M&t=8198s

## モアイになって敵から逃げるゲーム
https://www.youtube.com/watch?v=ASH-T7rWOPQ

# おわりに

この「超高速ゲーム開発」のアプローチは、開発者だけでなく、ゲームを学ぶ人にもとても役立つと考えています。ゲーム作りの最初の段階から、実際に人々が遊べるようになるまでの一連の流れをじっくりと見ることで、具体的にプログラムを書く方法や、途中で出てくる難しい問題や挑戦をどう乗り越えるかがわかります。
アニメーションイベントを拾う

アニメーションイベントを拾うことが出来るイベントを見つけたので、メモします。
参考コードを貼っておきます。
ブラウザの対応状況を確認して使用します。

```html
<p class="animation">右から流れてくるアニメーション</p>
<button class="applyAnimation" type="button">スタート！</button>
```
```css
.animation.active {
  animation-duration: 2s;
  animation-name: slidein;
  animation-iteration-count: 4;
}

@keyframes slidein {
  from {
    margin-left: 100%;
    width: 300%;
  }

  to {
    margin-left: 0%;
    width: 100%;
  }
}
```
```js
const animation = document.querySelector('.animation');
const applyAnimation = document.querySelector('.applyAnimation');
let count = 1;

applyAnimation.addEventListener("click", () => {
  animation.classList.toggle("active");
});
// アニメーションが始まったとき
animation.addEventListener("animationstart", () => {
  console.log('始まったよ！');
});
// アニメーションが繰り返されており、2回目が始まったとき
animation.addEventListener("animationiteration", () => {
  console.log(`${count++}回目`);
});
// アニメーションが終わったとき
animation.addEventListener("animationend", () => {
  count = 1;
  console.log('終わったよ！');
});
// アニメーションがキャンセルされたとき
animation.addEventListener("animationcancel", () => {
  console.log('止まっちゃった');
});
```




参考

https://listener.noplan.cc/animation/

https://developer.mozilla.org/en-US/docs/Web/API/Element/animationend_event
package.jsonを一気にアップデートする

## 背景

古いFirebaseFunctionsを更新しようとした際に、色々とfirebase周りのライブラリのアップデートが必要になりました。
その際に良さげなライブラリを見つけたので、READMEとほぼ変わりませんが備忘録として記録します。

https://github.com/raineorshine/npm-check-updates


## インストール

```sh
npm install -g npm-check-updates
```

```sh
npx npm-check-updates
```

## 使い方

### アップデートが必要なライブラリのチェック

ncuコマンドで、package.jsonをチェックし、アップデートがあるライブラリの一覧を確認できます。

```sh
$ ncu OR npx npm-check-updates
Checking package.json
[====================] 5/5 100%

 eslint             7.32.0  →    8.0.0
 prettier           ^2.7.1  →   ^3.0.0
 svelte            ^3.48.0  →  ^3.51.0
 typescript         >3.0.0  →   >4.0.0
 untildify          <4.0.0  →   ^4.0.0
 webpack               4.x  →      5.x

Run ncu -u to upgrade package.json
```

### ライブラリのアップデート

`-u`をオプションをつけると、バージョンアップのあるライブラリをすべてアップデートします。
破壊的変更が少ないライブラリなどはこれで一気にバージョンアップできます。


```sh
$ ncu -u
Upgrading package.json
[====================] 1/1 100%

 express           4.12.x  →   4.13.x

Run npm install to install new versions.

$ npm install      # update installed packages and package-lock.json
```

### 対話モードでのアップデート

`-i`オプションをつけることで、アップデートするライブラリを選んでアップデートすることができます。
Firebaseのライブラリだけ上げる。などしたい場合はこちらが簡単でおすすめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/17ed7a2e-683c-905f-c8fb-fe2a10483017.png)
たくさん間違えよう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の２１日目


# 積極的に間違っていこう

- 誰でも間違うのは嫌かもしれない
- 正確には他人に間違ってるところを知られ（見られ）たくない
- 間違ってはいけないケースも確かにある
- でも、致命的でないなら、間違っても問題ないはず
- むしろ間違うことで正しい（？期待されている）方向がわかるはず
- 間違いを、正しい理解を得るためのステップと捉えるといい
- 違うということは差があるということ。その差を埋めればいいだけのこと
- 正解、不正解の二元論にせず、理解のグラデーションの差を埋めるということ
- 積極的に間違えて、訂正していこう、という話
- 間違いを恐れて手を動かさないのはもったいないよ


本文はここまで。以下は時間外。

# 急になんや

- 間違いを極端に忌避する傾向を観測している
- ミスっちゃいけない、ミスらないほうがいいケースはたしかにある
- でも、多少ミスっても問題ないケースのほうが遥かに多い
- 自分の理解と他人の理解に差があるだけ
- 差を埋めれば済む話なら、違い（間違い）を嫌がらなくてもいいのになって思った
- 間違いや知識不足を放置するよりも、早いうちに指摘してもらったほうがいい、というのを知って欲しい

# よくない集

## 逐一確認ドライバー

- ペアプロやモブプロでリターンキー押す前に逐一確認するケース
- それを実行したら何が起きるかわかってないなら押してはいけない。何が起きるかを確認しよう
- わかってるなら押していい
- 実行確認は必要な時だけにしよう
- （そもそもペアプロやモブプロのやり方について合意しておこう）

## 完成するまで出さないマン＆修正受け入れたくないマン

- コードは出来上がってるはずなのにPRが出てこない
- どうやら自分の中で完璧になるまでコードレビューを受けたくないらしい
- 出てきたコードを確認すると、結局指摘が必要なケース
- PRの使い方の合意ができてないのかなって
- 修正する気がないPRならレビューなんかまたずに勝手にマージすればいい
- PRのレビューは粗探しではなくて、よりよいコードにするための意見交換
- レビューは間違い探しじゃない
- 明日の100より今日の50、みたいな言葉もあるので、今すぐ10のアクションをしよう

## 手が止まっちゃうマン

- やらないといけないこと、やったほうがいいことがあるのに、やらないマン
- どちらかといえば失敗したり間違ったりするのを恐れて手が止まっているケース
- 失敗しても何も問題ないっていうか、失敗したほうがいい
- まずやってみて、その行動を褒めて認める
- それから失敗した原因を考える
- I Have Not Failed. I've Just Found 10,000 Ways That Something Won't Work. ってエジソンが本当に言ったかどうかは知らないけど、本当だとすればエジソンですら10,000回うまく行かない方法を試した（はずな）んだから、我々のような凡人はもっとたくさんトライしないとね

# 失敗するための何か

- やらないと失敗できない（PKを外すことができるのは、PKを蹴る勇気を持った者だけだ）
- 致命的な失敗を１つしでかすよりも、どうとでもなる100の失敗をしたほうがマシ
- 完璧じゃない結果を一週間後に持ってくるなら、とりあえずちょっとやった結果を明日見せたほうがいいものができる
- 失敗したことに文句が出るようなチームや職場は早く逃げたほうがいいよ？ｗ

# 改善依頼

- 若手に間違っていいんだってメッセージを送りたいので、なにかエールを
Okta - サインイン時にMFAを求めないパターンを残す

# はじめに

今回は、以下の全5回のうち4回目になります。

- [サインインを自社拠点IPからのみに制限する](https://qiita.com/mtbRck/private/301e6d9b4badc02ba905)
- [サインイン時にMFAを求める](https://qiita.com/mtbRck/private/949ac045ebe7f46d631b)
- サインイン時にMFAを求めないパターンを残す
- サインイン時にリスク判定を追加する
- 特定のアプリのみ自社拠点外からのサインインを許可する

前回はMFAの設定をEveryoneに対して有効化しました。
しかし、例えば「オフィス内でもセキュリティレベルの高い区画で業務していてMFA用のスマホを持ち込めない」といった場合、ログインできなくなる可能性があります。

そのような場合に、MFAを求めないパターンを残しておく必要があります。

# グループを作成

各ポリシーはグループに対して設定するため、MFAを求めないユーザー用のグループを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/583a57c8-5a4c-b47a-ea1d-59d877399d15.png)


# Global Session Policy の設定

自社用デフォルトポリシーとは別にMFAを求めない用のポリシーを作成します。

## ポリシー作成

Assign to groups で先ほど作成したグループを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/ab9403e1-72e3-5f42-90fd-a82b1662afa6.png)

## ルールを作成

今回は例であげた「オフィス内でもセキュリティレベルの高い区画で業務していてMFA用のスマホを持ち込めない」を想定し、拠点内からのみMFAを求めないようにします。

User’s IP is で In zone を選択し、Zone として myCompany（自社拠点のグローバルIPを定義したNetwork Zome）を指定します。

もちろん Multifactor authentication (MFA) is は Not required にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/6517c318-c00f-a398-62b5-9e32691bdb0e.png)

Saveすると、既存のポリシーの下かつDefault Policyの上に追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/d0e1a273-d3f2-515d-3ae2-d6492bead240.png)

## ポリシーの優先順位変更

ポリシーは若番（上）から順に評価されていきます。
自社用デフォルトポリシーが上にあるとMFA対象外のポリシーには一生マッチしません。
（自社用デフォルトポリシーが Any かつ Everyone でマッチするため）

そのため、MFA対象外のポリシーを自社用デフォルトポリシーの上に変更します。
数字横の点々をドラッグ&ドロップで変更可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/5ee1c00e-0450-bea9-0046-d141baa853f1.png)



# Authentication Policy の設定

デフォルトのポリシーにルールを追加します。

## ルールの追加

User's group membership includes で At least one of the following group を選択し、先ほど作成したグループを指定します。

User’s IP is では In any of the following zones を選択し、myCompany を指定します。

User must authenticate with は Password を指定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/87249e86-ebe4-d62d-bd6d-da58368f8e71.png)

## ルールの順序変更

Global Session Policy と同様に Authentication Policy のルールも上から順に評価されます。

追加した時点では自社拠点IPを許可のルールよりMFA対象外のルールの方が下になっているので、順序を変更してください。

こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350435/b92f133c-2481-646f-1ad6-fd1823769e00.png)

これで MFA対象外のグループにアサインされているメンバーはサインイン時にMFAを求められなくなりました。

# おわりに

今回はここまで。ありがとうございました。
次回はサインイン時にリスク判定を追加することでセキュリティを高めたいと思います。
Twitter Botでツイートができる状態を作る。

## 背景

終わった。終わったと言われつつも、なんだかんだ人がいるTwitter。
そんな中、Twitter APIを細々と使ってBotを運用してみたので、Zennに使い方をまとめる。

無料プランでの制限が厳しくなったものの、1アカウント1ヶ月に1500ツイートできるので、1日50ツイート。まだ個人で遊ぶには使えるかなーという感想です。


この記事は、ZennのScrapをまとめた記事です。
https://zenn.dev/rurucun/scraps/e1cf63825055f6

## Developer Platformに登録する

Developer Platoformへアクセス。

https://developer.twitter.com/en


右上のDeveloper Portalをクリックし、下記の画面へ。
「Sign up for Free Account」 をクリック

![](https://storage.googleapis.com/zenn-user-upload/939099af8153-20231202.png)


下記を入力、確認します。

- 利用目的
- データを再販しないことへの同意
  - 250文字以上
- 違反をした場合にアカウント停止への同意
- 利用規約への同意

![](https://storage.googleapis.com/zenn-user-upload/e571d3ef1b66-20231202.png)



これまで文章の審査があったのですが、すぐに使える状態になっており、Dashboardへ遷移します。

![](https://storage.googleapis.com/zenn-user-upload/e4e994efe5cd-20231202.png)


 サイドバーのProjects & Apps にデフォルトでPrjectが作成されているので、こちらをクリック。

![](https://storage.googleapis.com/zenn-user-upload/83592c5c4833-20231203.png)

ページ下部のUser authentication settingsのSet upをクリックし、移動

![](https://storage.googleapis.com/zenn-user-upload/39085bbb22c7-20231203.png)


下記を行います。Saveを押します。
- App permissionsを「Read and write」へ
- Type of Appを「Web App」へ
- App info 「Callback URI」と「Website URL」へ適当なURLを入力します。
![](https://storage.googleapis.com/zenn-user-upload/f1a943e791bd-20231203.png)

Projectのトップページのタブから、「Keys and tokens」へ移動します。


- Consumer Keysの「API Key and Secret」 のRegenerateをクリック
  - API Key と Secret を保存しておきます。
- Authentication Tokens の 「Accesss Token and Secret」のGenerateをクリック
  - Access Token と Secretをこちらも保存しておきます。

![](https://storage.googleapis.com/zenn-user-upload/2e34509f38ad-20231203.png)
下記を使ってNode.jsからツイートをします。

https://github.com/PLhery/node-twitter-api-v2

```sh
yarn add twitter-api-v2
# or
npm i twitter-api-v2
```

下記のようなjsファイルを作り、関数を呼び出すことで、Node.jsからTweetできます。

1点紛らわしい箇所があり、 appKey appSecretはConsumer Keysのものを使います。

tweet.jsファイル
```js

import { TwitterApi } from "twitter-api-v2";

const twitterClient = new TwitterApi({
  // ↓ConsumerKeysで取得したもの
  appKey: 
  appSecret: 
  // ↓Acuthentication Tokensで取得したもの
  accessToken: 
  accessSecret: 
});

// Twitterにメッセージを投稿する関数
async function postToTwitter(message) {
  try {
    await twitterClient.v2.tweet(message);
    console.log('Tweet successfully posted!');
  } catch (error) {
    console.error('Error posting tweet:', error);
  }
}

async function post() {
  const message = 'Hello, world! This is a test tweet from Firebase Functions.';
  await postToTwitter(message);
};

post()
```

```
$ node tweet.js
```
トゥルーピーク ～ デジタルデータのサンプル間は直線ではない～デジタルの誤解を解く

[<B>MATLAB/Simulink Advent Calendar 2023</B>](https://qiita.com/advent-calendar/2023/matlab)に参加しました。

カレンダー2の12/10分として追加しました。

・使用ツール
<dt>　MATLAB</dt>
<br>

<H4><a href="https://note.com/leftbank/n/n2ac3350cd044"</a> [<B>note</B>]にUpしました。</H4>
AI画像生成でアプリ開発に使えそうか試してみる

## 背景

個人開発のWebサービスやアプリのデザインで楽をしたいので、AIに頼ることができるか色々試す備忘録です。


## ChatGPT v4

V4で画像の生成をお願いすると画像を生成してくれるので「Todoアプリのモックデザインして」などで画像の生成をお願いしてみました。サイバーパンクチックなものが出てきたり、イメージとかけ離れたものが多かったので、「シンプルにして」などの追加でなんとかアプリっぽい感じに持っていきました。

文章での質問とは違い、なかなかイメージが落とし込まれないので、それっぽいデザインにするのに苦労しました。
それっぽく持っていけましたが、ちょっと派手すぎたり、近未来？のようなデザインが多く出てくるので、まだ実用ラインではないかな？と言う感じでした。


### Todoアプリ

パターン1 | パターン2
--- | ---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/98a43def-811f-0600-9b3d-beb4068f6dcf.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/5537705e-5f3d-35c3-768e-a2800dddeeb9.png)


### 株価アプリ

パターン1 | パターン2
--- | ---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/25dd7039-86d3-21ec-89a0-b74d22351e41.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/e2a68ae5-73ba-d864-0d43-a7bcb7ff20aa.png)



## Microsoft Designer

自然言語処理で画像を生成できるので使ってみました。
SNSやブログなどのサムネイル画像に特化しているようで、なかなかアプリのモックのようなデザインを生成できませんでした。
色々なテキストを試してみたのですが、もし使い方などわかるかたが入ればコメントをお願いします🙇‍♂

https://designer.microsoft.com/new


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/4f57633d-d305-8347-a3fd-315ae7b0b140.png)

## Stable Diffusion

promptsを色々試してみたのですが、参考にできるレベルには持って行けず。
WebUI用のModelなどもいくつか出回っているようですが、イラストなどに比べると全然なのかな？という感じです。

アプリの画像を集めて自作のモデルを作れば、良い感じの出力が期待できるかもしれません。

パターン1 | パターン2
--- | ---
![09175-3408033454-create UI design,_todo app,_ios application,_style with white and blue color.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/c41b7975-702d-65f5-dbd6-dfffc33e3414.jpeg) | ![09158-3195376016-create UI design for todo app for ios android application in telegram style with white and blue color.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/739bab89-ef98-7ea9-4c67-0c24a89e392a.jpeg)




## Framer

ノーコード開発ツールのFramer
AIによって、サイト生成ができるということだったので、アプリではないが、LPが制作できないか試してみる。

何度か試してみたが、Framerのコンポーネントを使って自分で組み立てたほうが非デザイナーの自分でもマシかな？という感じのクオリティだった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/2ff3d6c7-8df2-6d50-c363-4a286f30c89f.png)

## Figma + AI 

Figmaに買収されたDiagramが作っているGenius 
https://www.genius.design/

まだWaitlistの段階なので、試せなかったのですが、期待できるツールなので貼っておきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/f4437b55-1683-3065-745e-93fbc7db6038.png)

### STUDIO 
Framerと同じポジションにあるSTUDIOはまだAI機能が公開されておらず、WaitListの状態でした。
LPを見た感じ、FigmaのGeniusと同じ雰囲気のものになりそう？

https://studio.design/#early-access


## 色々触ってみて

現段階では、簡単にそれっぽいアプリのデザインを生成する手段は少なそうでした。
ただ、今後の発展で、すぐに個人開発のデザインの工数を飛ばせそうで楽しみです。
Next.jsのServer ActionsをtRPCライクに使う[next-safe-action]

こんにちは。[あのちっく](https://twitter.com/anoChick)です。
[commmune Advent Calendar 2023](https://qiita.com/advent-calendar/2023/commmune) 13日目の記事はNext.jsのServerActionsの話です。
どうぞよろしくお願いします。

https://qiita.com/advent-calendar/2023/commmune

# Serve rActions

Next.js 14からServer ActionsがStableになりました。

https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations

私はtRPCが大好きでよく使っているのですが、ServerActionsもtRPCのようにzodを使ってinput,outputのスキーマ定義を行ってバリデーションも効くようにしたかったので、自作の仕組み```appAction```を作りました。


https://gist.github.com/anoChick/71fc27ee0e445e78da03c7848fc50279#file-typescript

```typescript
export const sampleAction = appAction({
  input: z.object({ nickname: z.string(), title: z.string() }),
  output: z.object({
    postId: z.string(),
    title: z.string(),
    name: z.string(),
  }),
}).resolve(async (input) => {
  return {
    postId: "xxx",
    title: input.title,
    name: `${input.nickname} さん`,
  };
});
```
使い方は簡単で、上記のコードのようにaction定義を行うと、resolve内の関数実行時にバリデーターが実行されるというものです。型チェックも効きます。

# next-safe-action
自作してから[next-safe-action]というライブラリがあることに気づいたので紹介させてください。

https://github.com/TheEdoRan/next-safe-action

基本的な使い方としては、インターフェースはすこし違いますが、機能はだいたい同じです。outputの型定義も行うかどうかの違いぐらい。

```typescript
"use server";

import { z } from "zod";
import { action } from "@/lib/safe-action";

const schema = z.object({ nickname: z.string(), title: z.string() });

export const sampleAction = action(schema, async ({ nickname, title }) => {
    return {
    postId: "xxx",
    title: input.title,
    name: `${input.nickname} さん`,
  };
});
```

いい感じですね。
さらに、next-safe-actionには追加で様々な機能があります。


# 非同期処理用のhooks
next-safe-actionには```useAction```というhooks関数が用意されています。

```tsx

export default function Test() {
  const { execute, result } = useAction(sampleAction);
  return (
    <div>
      <button
        onClick={() => {
          execute({postId:'xx', title:'yy', name:'zz'});
        }}>
        Send
      </button>
      {result.data?.name ? <p>{result.data.name}</p> : ''}
    </div>
  );
}
```
というように```await```せずにactionを実行して使うことが出来るようになります。

# callback
action statusの変化に応じたコールバンク関数を定義して使うことが出来ます。

https://next-safe-action.dev/docs/usage-from-client/hooks/callbacks

# middleware
メインとなるaction関数を実行する前に、ユーザー認証処理をして、引数にユーザーデータを与えるような事をしたいことがあるとおもいます。
そういったときのためにmiddlewareの仕組みも存在します。

https://next-safe-action.dev/docs/safe-action-client/using-a-middleware


# 良さそう
next-safe-action、とてもおすすめです。
ぜひ使ってみてください。
Power BIが難しい理由 ～基礎をしっかり勉強しよう～

ほぼポエム。**Power BIが難しい理由は基礎の存在を知らないために、それを勉強できないから**じゃないかと。知らないことを知ることから始めよう。

Power BIのベスト プラクティスを紹介する記事は多いが、なぜそれが初学者にないがしろにされるのかと、初学者がそれを学ぶことの重要性について考えてみた。（ベスト プラクティスが何かは書いていない）

# 基礎がないがしろにされる理由
Power BIはセルフサービスBIとも呼ばれるように、特別な知識がなくともBIを構築することが可能。この「特別が知識がなくとも」がある意味厄介で、そもそもBIとは何ぞやを知らなくてもできちゃう。基礎が大事と言われても、BI初心者に中々伝わらないのは、ここに問題があるのではと思ったところ。

ゼロからBIを作る（≒C++の標準ライブラリーだけで作る）のであれば、開発がめちゃくちゃ大変なので、開発の前に自分がやろうとしていることを徹底的に精査する。つまり、以下のようなことを考えるであろう（他にもあるかも🙄）。もしくは、長く使われるうちに、ツールが保守開発を通じて自然と鍛えられる。

- **BIに求められるものは何か** →ビジネス要件を精査し必要なものだけを構築
- **汎用的な集計方法は何か** →評価コンテキストとメジャーの関係を整理
- **それら実現する最適なデータ構造は何か** →スター スキーマや列指向DB
- **先行事例の調査** →マネできる具体例があればマネるし、抽象化/洗練された方法があれば活用する


で、Power BIは非常に考えられて作られているので（←BIのプロが作っているのだから当たり前！）、当然上記を考慮している。

ゼロから作ったら否応なしにBIについて深く考えなければならないが、完成されたツールを使えば考えなくてもExcelのような使い方でも何かはできる。だから、**Power BIの基礎（設計思想やベスト プラクティス）** なんてめんどくさいことは置いておかれ or 気づかれることもないまま、目の前のビジネス要件を満たすためだけのレポートを作りがちになるのではと。

これがPower BIの基礎が初学者にないがしろにされる、というか存在に気づかれない理由（あと、学ぼうとしても基礎の情報が断片的でどこから手を付けたらよいのかわからないというのもある気がする）。


# ベスト プラクティスを学ぶことの重要性
Power BIの自由度の高さのため、個々のビジュアルのためだけのテーブルを作ることも可能。しかし、これはグラフのために使い捨てのテーブルを都度作成するレガシーExcelな発想。実際、自分も最初のころは個々のビジュアルに合わせてファクトテーブルを10個以上用意したり、ディメンションのリレーションが何層にもなったり（しかも間に中途半端なファクトテーブルを挟んだり）、ファクトテーブル内に前月比やら年度累計やらの列を入れたりと失敗してしまった。（セマンティック モデルとは言い難い😞）

これは、Power BIの設計思想から乖離した使い方をしたため。設計思想を知ろうとしていないのだから当然の結果。BIツールを使っているという頭の切り替えをしていないのだから、Power BIの良さを活かしきれないレポートとなってしまう。最悪の場合、ビジネス上の課題を解決できずに、Power BI使えないねという残念な結論に至ることも。

使っているのはExcelではなくPower BI。Excelライクな使い方は最初のとっかかりとしては悪くないけれど、Power BIの良さを活かすには、Power BIの機能をちゃんと理解して、**Power BIの設計思想を踏まえた正しい使い方（＝ベスト プラクティス）を学ぶ必要がある**。

逆に考えてもよい。EXCELと違ってPower BIはBIしかできない。[ゲーム](https://papasensei365.com/excel-game-dq3/)を作ったり、[入力フォーマット](https://e-words.jp/w/%E7%A5%9E%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB.html)を作ったり、[ドキュメント](https://mypage.otsuka-shokai.co.jp/contents/business-oyakudachi/pc-techo/2021/05.html#subtitle6)を作成したり、他のオフィスアプリを操作したりということはできない。つまり、Power BIはBIとしてのベスト プラクティスだけを覚えればよいということ。

**ベスト プラクティスを学ぶことで、Power BIの設計思想を理解し、Power BIの良さを最大限活かしたレポートを作成することが可能になる**。つまり、以下を実現できる：

- さまざまな分析・可視化に対応
- セマンティック モデルを理解しやすい
- メジャーを理解しやすい
- メジャーのパフォーマンスが良い
- それなりの完成度が約束される

最後の「それなりの完成度」とは、レポートの見た目や使い勝手だけではなく、データ モデリングを含むBIとしての完成度のこと。しかも、ほとんどのケースでベストプラクティスが完成形となる（ものすごく複雑なビジネス ロジックを実装したり、ものすごく大量のデータを扱ったりしない限りね）。

自分でゼロからあれこれ考えるのは車輪の再発明になるなので、やめておいた方が良い。プログラミングの経験者であれば、デザイン パターンを再発明するようなものと言えば伝わるだろうか。

Power BIの中級者以上を目指すということは、Power BIの機能を覚えること以上に、その機能を活用して如何にベスト プラクティスを実現するかを覚えることと同義である。

# おわりに
いつもどおりの抽象的な話になってしまった。わかりにくくてすみません（特に反省はしていない）。

で、ベスト プラクティスが何かと学びの順序をまとめた記事は↓

https://qiita.com/k_maki/items/dfa937809a64981bb8f2

ふーっ('ω')
Turboのチュートリアル記事を読んでいる最中の疑問

# はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー8日目です。

今日は、猫Rails様のTurboのチュートリアルでRails7のTurbo Streamを勉強していたときに浮かんだ疑問についてまとめます。

# 疑問点
**Turbo Streamと「○○.js.erb」との違いは？**
**flash.noticeとflash.notice.nowとの違いは？**
**指定ページの強制リロードは本当にできる？**

## Turbo Streamと「○○.js.erb」との違いは？
非同期の実装について、Rails6までは、Railsでbuttonタグやaタグを作ってくれるメソッドbutton_tagやlink_toなどに`remote: true`というオプションをつけ、そこからのリクエストを非同期にするという方法がありました。

```erb:例
<%= hoge_path, method: :post, remote: true do %>
  <%= image_tag "path-to-image", alt: "Like" %>
<% end %>
```

そして、○○.html.erbではなく○○.js.erbというファイルを用意し、これをrender時に指定することで、JavaScriptを実行してDOMを書き換えてしまうという方法です。

```erb:○○.js.erb例
document.getElementById('like-btn<%= @hoge.id %>').innerHTML = "<%= j(render partial: 'likes/like', locals: {hoge: @hoge}) %>"
```

Rubyのインスタンス変数をJavaScriptに渡して整形、それをクライアントに返却するという形ですね。

この方法でも非同期で見た目を更新でき、いい感じのUXを実現できます。

### Turbo Streamsを使うメリット
リクエストをきっかけに複数箇所を更新するためのレールがひかれた、ということでしょうか。
JavaScriptを書くことでもさまざまな挙動は実現できますが、特定のやり方が用意されて、同じチームの人がすぐにコンセンサスを取って書けるのはスピードにつながりそうです。

Turbo Frameでどの部分を置き換えるのかを指定できるturbo_frame_tagのように、turbo Streamでもわかりやすい書き方ができるともっと良さそうですね。現状、`id`をつけているだけなので若干混乱しそうです。

## flash.noticeとflash.notice.nowとの違いは？
Turboとはあんまり関係ないのですが、以下の記述がよくわかりませんでした。

>Flashは通常だとリダイレクト時に使うのでflash.noticeを使って設定する。でもTurbo Streamsでは今回のリクエストに対してFlashを設定したい。そういう場合には今回のリクエストに対してだけ有効なflash.now.noticeを利用するよ。

そこで、通常のflashとflash.nowとの違いをまとめておきます。

### flash
**使用場面:**
flashは、主にリダイレクトが伴うアクションで使用されます。つまり、ユーザーが現在のページから別のページにリダイレクトされる場合です。

**動作:** 
flashメッセージはリクエスト間で持続し、リダイレクト後のページで表示されます。その後、次のリクエストで消えます。

```ruby:flash
def update
  if @user.update(user_params)
    flash[:notice] = "プロファイルが更新されました。"
    redirect_to @user
  else
    render :edit
  end
end
```

### flash.now
**使用場面:**
flash.nowは、リダイレクトを伴わないアクション、つまり現在のリクエストの中で完結するアクションで使用されます。これは、ページの再描画が発生しないAjaxリクエストやTurbo Streamリクエストに特に有効です。

**動作:** 
flash.nowメッセージは、現在のリクエストでのみ有効で、次のリクエストには持続しません。

```ruby:flash.now
def create
  @comment = Comment.new(comment_params)
  if @comment.save
    flash.now[:notice] = "コメントが追加されました。"
    render turbo_stream: turbo_stream.append('comments', @comment)
  else
    render :new
  end
end
```

## 指定ページの強制リロードは本当にできる？
>指定ページの強制リロード
🐱 Turboと相性が悪いJavaScriptのライブラリを使う際に、指定のページだけフルリロードさせたい場合があるよ。そんな時は以下のような<meta>要素を追加すると、ページを開いた際にwindow.location.reload()を実行させて強制的にフルリロードさせることができるよ。・・・

追加する要素はheadタグの中身でした(以下参照)。

```html:headタグ
<head>
  ...
  <meta name="turbo-visit-control" content="reload">
</head>
```

Railsではheadタグはapplication.html.erbに含まれており、これは共通のテンプレートなので特定のページのみ追加するのは難しいのでは？と思いました。

### 解決策
結論、`content_for`メソッドを利用することで実現可能でした。

application.html.erbでheadタグの中身にyieldを追加します。

```erb
<!-- application.html.erb -->
<head>
  ...
  <%= yield :head %>
</head>
```

その後任意のビューでcontent_forを使って、必要なmetaタグを追加できます。

```erb:例
<!-- 例えば、特定のビューのファイル -->
<% content_for :head do %>
  <meta name="turbo-visit-control" content="reload">
<% end %>
```

このコードは、そのビューがレンダリングされるときにのみmetaタグがheadセクションに挿入されます。
コードのフォーマットを ESLint Stylistic に任せる

## この記事の概要

JavaScript や TypeScript を用いるプロジェクトであれば、リポジトリを作成したすぐ後に ESLint と Prettier を導入すると思います。

両者の役割が違うのは理解しつつも、設定の連携まわりが面倒に感じてしまいます。
また、Prettier の printWidth によって、文字数が変わっただけで diff 扱いになるのもあまり好きではありません。

なんて考えていたら、ESLint だけでリントとフォーマットの完結するプラグインが出ているではありませんか。

https://eslint.style/

というわけで試してみました。

## 前提

筆者はリンターやフォーマッターを設定する際に、以下を前提としています。

- 自分の好みではなく、世の中の多数派にあわせる
- できるだけ初期設定のままで使う

つまり、`recommended` 的な設定だけ入れて他はまったく触らない、みたいな使い方です。

今回の記事でもその考えに基づいて記載をしていますので、ご了承ください。

## 準備

ESLint Stylistic に jsx のルールも入っているので、React のプロジェクトを作ります。

```sh
bunx create-vite
```

TypeScript かつ React で作成しました。

## ESLint の導入

必要な依存関係を追加します。

```sh
bun i -d eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser @stylistic/eslint-plugin
```

`.eslintrc.cjs` を作成します。

```javascript
module.exports = {
  env: {
    browser: true,
    es2021: true,
    node: true,
  },
  overrides: [
  ],
  parser: '@typescript-eslint/parser',
  parserOptions: {
    ecmaVersion: 'latest',
    sourceType: 'module',
  },
  extends: [
    'eslint:recommended',
    'plugin:@typescript-eslint/recommended',
    'plugin:@stylistic/recommended-extends',
  ],
  rules: {},
}
```

`extends` にある `'plugin:@stylistic/recommended-extends'` が大事です。
というか、それ以外の部分はいつも見るような内容だと思います。

https://eslint.style/guide/config-presets#static-configurations

公式ドキュメントの `Shared Configurations > Static Configurations` にあるように、デフォルトの設定でよければこの1行を追加するだけで完了です。

後は次のようにでもコマンドを追加すれば利用できます。

```json:package.json
{
  "scripts": {
    "lint": "eslint . --ext js,jsx,ts,tsx",
    "format": "eslint --fix . --ext js,jsx,ts,tsx"
  },
}
```

## ルールをカスタムしたいときは？

https://eslint.style/guide/config-presets#configuration-factory

公式ドキュメントの `Shared Configurations > Configuration Factory` の方にあるような書き方をすれば可能です。

最初に書いた通り、筆者はできるだけカスタムしたくないため、こちらは試していません。

## 余談

[Getting Started](https://eslint.style/guide/getting-started) だけを見ると「`@typescript-eslint/eslint-plugin` を置き換える」って記載に見えましたが、実際は「[スタイルのルールだけを置き換えるのであって、パースやリントには `@typescript-eslint/parser` と `@typescript-eslint/eslint-plugin` が必要](https://arc.net/l/quote/qaefyjik)」でした。

また、[Migration](https://eslint.style/guide/migration) で紹介されている内容が「既存プロジェクトもコードフォーマットに ESLint を使っている前提」の記載で、なんとなく混乱しました。
大半の人が Prettier を使っていると思うので、そちらからの移行内容を書いてくれた方が優しいような気もしています。

そんなこんなで、実際に書いたコード量の割に、ドキュメント内容があまり理解できず止まっていた時間が多かった気もします。
dockerで構築したMySQLにルートユーザーでログインできなかった件の修正備忘録

こんばんは！
本日は個人投稿です。

自己学習でLaravel環境を構築していた際のエラー対処備忘録となります

# 遭遇したエラー
dockerで構築したMySQlコンテナに入り、ルートユーザーでログインしようとした時
下記のエラーが発生しました
```
# mysql -u root -p
Enter password: 

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
```

# 環境
- dockerでMySQLコンテナを構築
- MySQL ver.：8.0
- アプリケーションコンテナでLaravelのプロジェクトを作成していた


## docker-compose.yml
設定していたdocker-compose.ymlは以下の通りでした

※ mysqlコンテナだけ抜粋
```yml: docker-compose.yml
  mysql:
    build: ".docker/local/mysql"
    ports:
      - "3306:3306"
    volumes:
      - ./storage/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABSE: $DB_DATABASE
      MYSQL_USER: $DB_USERNAME
      MYSQL_PASSWORD: $DB_PASSWORD
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
    container_name: pr-mysql
```

# 結論
ボリュームを削除して、コンテナを立ち上げ直す事で直りました

## 手順① コンテナを落とす
```shell
$ docker-compose down -v
```

これで、ボリュームを削除しつつ、コンテナを落とせます。

## 手順② ローカル側のボリュームを削除する
ですが、コンテナ側のボリュームを削除するコマンドですので
ローカル側は自身で削除する必要があります![スクリーンショット 2023-12-10 1.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1422262/3f7679b9-6c8b-db51-92c5-eaeeb820e03f.png)

画像の通り、ymlファイルで、storage/mysqlをマウントしておりますので
コンテナを落とした後に、このディレクトリごと削除する事で、ローカル側のボリュームを更新できます

## 手順③ もう一度ビルドとコンテナ立ち上げ
これで簡単に言い換えますと「やり直しができた
ということになります



# 振り返り
適切に環境変数の設定ができている状態でコンテナの立ち上げとボリュームの生成ができていないと考えました。

以下、エラーが発生した際の作業手順です
1. アプリケーションコンテナの生成
2. Laraelのインストール
3. MySQLコンテナの作成（ymlに追記）
4. envファイルの作成を飛ばして、ビルドしてしまった
5. 環境変数が読み取れないエラーが発生 <= 当然ですよね
6. コンテナを落とす
7. envファイルの作成
8. コンテナの立ち上げ直し
9. rootユーザーでログインができない事象が発生  

コンテナ側のボリュームを削除するだけでは解決できないこともあるんだな
と再認識しました！

以上、備忘録でした。
[Windows]タスクトレイからEC2インスタンスを起動停止できるツール作ってみた

## 概要

タスクトレイからEC2インスタンスを起動停止できるツール作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/d1b58070-b9da-d877-9f56-6704661d6d3d.png)

ここに置いてますので、よければどうぞ。

https://www.vector.co.jp/soft/winnt/util/se526099.html

## 動作要件

- .NET 8.0が必要です
- AWS の認証情報が読み込み可能となっている必要があります。クレデンシャルファイルを直接作成いただくか、AWS CLI等で設定ください
  - （参考） https://docs.aws.amazon.com/ja_jp/powershell/latest/userguide/specifying-your-aws-credentials.html

## 作った動機

昨今、VS Code(Remote Development)の広がりにより、開発環境をクラウド側に置いている開発者も多いのではないでしょうか。
開発環境にEC2インスタンスを使っている場合、開発作業をする度にインスタンスを起動することとなりますが、マネジメントコンソールにログインしての起動や、スクリプトからの起動は少々煩わしいと思っていました。

このアプリケーションによって、タスクトレイに常駐するアイコンをクリックするだけで、インスタンスの起動・停止が可能となります。

## 開発した感想やメモ

### .NET/Windows Formを選択した経緯

開発前に昨今のWindowsアプリの作り方について調べてみると、選択肢がかなりありました（[参考](https://aimnext.co.jp/note/pick-up/microsoft-2022/)をみてもそうですし、これらに加えてFlutterや Electron のようなクロスプラットフォーム系のものも入れるとかなりの数です）。

今回はたまのWindowsアプリ開発なので、 Flutter のようなものではなくて、Windows系の開発ツールを使おうと思いました。なかでも「Windows App SDK」がナウそうだったので、少しチャレンジしてみたのですが、情報が少なく、開発環境を整えるのも大変で諦めました。

結局最も枯れていると思しき .NET/Windows Formとしました。結果、さくっと作れたので、まぁよかったかなと。

### AWS SDK for .NET

今回、 [AWS SDK for .NET](https://aws.amazon.com/jp/sdk-for-net/) を初めて触ってみましたが、APIリクエストが基本非同期なんですよね。理由を調べてみたら、[このIssue](https://github.com/aws/aws-sdk-net/issues/480)によると、.NET CoreのライブラリのHTTPクライアントが、非同期がベースなので、それによっているとのこと。

## その他

久々に、Qiitaに投稿してみたら、エディタがめっちゃ進化していてびびりました。Lintが効くのとても便利です。

普段の生活の中でほしいなぁと思うツールは色々とあるので、今後も少しずつ自分でも作っていって、開発欲を満たす＆生活を便利にできればなと思います。
【UEFN】公式が正式に提示してくれたサムネイルの制約を読んでみる

## 背景
UEFNってYoutubeと似てると最近感じていて、そのうち釣りのサムネイルを作る人が大量に出てくるのではと思い公式がガイドライン出してないかと色々と調査しているときでした。
そこでこの公式の記事を見つけました。

https://dev.epicgames.com/documentation/en-us/fortnite-creative/thumbnail-image-guidelines-for-discover

軽くまとめていきます。

## 基本的なガイドライン
- ゲームを正確に表現します。
- 魅力的になりましょう。
- Fortnite のすべてのブランド ガイドラインに従ってください。

https://brand.epicgames.com/d/KCYRTaiFZuRz
- フォートナイト アイランド クリエイター ルールに従ってください。

https://www.fortnite.com/news/fortnite-island-creator-rules
- 長方形のサムネイルの場合は最小 1920x1080 (アスペクト比 16:9)、正方形の画像の場合は最小 1024x1024、画像サイズは 5 MB 以下
- 銃が視聴者に向けられている
- 胸やお尻など、キャラクターの身体部分の軽度に性的な描写
- 強い脅威、恐怖、恐怖を感じさせる画像（グロテスクな生き物など）

## 特殊？なガイドライン
- サムネイルに矢印を表示してはいけない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/7d6f264f-d235-8578-1174-20589a58d6f7.png)
- 販売タグ形式のラベルを使用しない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/bd2075fd-b961-088b-579b-42d8961982f8.png)
- 実際の通貨またはゲーム内通貨の表示はいけない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/83545497-af2c-aa80-8c0d-15d7efbc030b.png)
- 図形の上に武器を重ねて使用しない(武器を強調してはいけない？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/e2c7d99e-17b1-9d28-3b0c-ae96546085c2.png)
- ゲームの操作ボタンを表示してはいけない
※あらゆるプラットフォームをサポートしているため誤解を招く可能性があるから？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/ec322be3-8b16-b631-d0cf-7d50ffd3e75c.png)
- Epic Games のロゴを使用してはいけない
※公式のものと誤解を招くため？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/290ba5a4-d83f-12f7-f63f-7e8d9dd61cc1.png)
- XPに関する言及
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/945ee386-b2c1-6abc-ac14-8343431434e0.png)
- お気に入りマークに似たアイコンの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/67b6c654-e91e-bd40-f83a-3be2ad1b2c8f.png)
- サムネイル周囲の境界線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692976/e42a55cb-ccc7-2c52-f97e-79acff58fd3c.png)

## まとめ
こうやって公式が明示的に行ってくれるのはとても助かりますね！

最近は無料版Canvaを使ってサムネイル作ってます！Youtebeのテンプレートもあってそれらをうまいこと活用してそれなりのクオリティに仕上がりますのでお勧めします！
https://www.canva.com/

## 余談
この度UEFN/Verseに関するオープンコミュニティサーバーを建ち上げました。ちょっとでも興味があれば奮ってご参加くださいませ。

https://discord.gg/cK4daQyD