OmniAICreator/Qiita-1.07M huggingface dataset:
[SwiftUI]NavigationBarの背景色を変える方法

# NavigationBarの背景色を変える方法

![スクリーンショット 2023-11-22 9.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/b0354f8b-021e-3088-1374-f38a907afc49.png)

このように、NavigationBarの背景色を変えたい時がありますよね。

今までは、initでUINavigationBar.appearance()を使って背景色を指定していたんですが、**.toolbarBackground**モディファイアを使うことで指定できるようです。


## やり方〜
```swift
 var body: some View {
        NavigationStack {
            List {
                ForEach(0..<5) { item in
                    Text("世界")
                }
            }
            .navigationTitle("タイトル")
            .toolbarBackground(Color.blue, for: .navigationBar)
        }
}
```

navigationTitleでタイトルのテキストを指定します。
背景色は.toolbarBackgroundで上のように指定します。

この場合、上にスクロールした際に背景色が表示されるようになります。

![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/43c15407-1039-3f3c-2ab8-aab786c6d541.gif)


## 常時背景色が見えるようにする
```swift
var body: some View {
        NavigationStack {
            List {
                ForEach(0..<5) { item in
                    Text("世界")
                }
            }
            .navigationTitle("タイトル")
            .toolbarBackground(Color.blue, for: .navigationBar)
            .toolbarBackground(.visible, for: .navigationBar)
        }
}
```

.toolbarBackgroundを.visibleにすると、常時見えるようになります。
.hiddenにすると見えないようになり、.automaticにすると、指定してない時と同じになりました。

![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/a974be32-46d7-e2de-464b-82903c0a3494.gif)

このように、常時背景色が指定された形になりました！

Listなど縦に長い時は、スクロールした際にNavigationBarの大きさや形が変わることは便利だと思いますが、あまり長くない時は固定したいですよね！

## NavigationBarを固定する方法
```swift
var body: some View {
        NavigationStack {
            List {
                ForEach(0..<5) { item in
                    Text("世界")
                }
            }
            .navigationTitle("タイトル")
            .navigationBarTitleDisplayMode(.inline)
            .toolbarBackground(Color.blue, for: .navigationBar)
            .toolbarBackground(.visible, for: .navigationBar)
        }
}
```
.navigationBarTitleDisplayModeを.inlineにすると、固定されます！

![スクリーンショット 2023-11-22 10.04.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330686/4626e37f-0601-cb3c-2294-a4e52d907fa8.png)


# まとめ
toolbarBackgroundモディファイアを使うことで、背景色を指定することができました！

もっと良い方法があれば、教えてください〜
IBM i アーキテクチャー：複数論理コピー Multiple Logical Copies : MLP

AS/400発表時にはアーキテクチャの資料が色々あったのですが最近見ないので再録してみたいと思います。
古い情報がベースのものもあり、最新では変わっているところもあるかもしれません。。アーキテクチャー的な根本は現代のIBM i でも変わっていないと思います。

もし、ここ違うよ！をご存じの方がいればご教示ください‥^^;

## IBM i 複数論理コピー　Multiple Logical Copies

・IBM i のOPM, ILEプログラムはコンパイルで生成されるプログラム・コードは内部的にプログラムコード部分とデータ域部分に分類できます。
・このプログラムを実行するとメインメモリ（SLS）上にロードされます。一般的なコンピューターでは１つのプログラムでも複数ユーザー・ジョブが実行すると複数のプログラム・コードがメモリ上に存在していると思いますが、IBM i ではメインメモリ上ではプログラムコードは1つしか存在しません。
・個々のユーザー・ジョブが使用するデータ域はそれぞれ個別に作成されます。このデータ域をPAG（Process Access Group）と呼びます。
※PAGは別記事にしたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a4d4a802-358c-007f-cf7e-3aeae69246c7.png)

メインメモリ上に展開されたプログラムコードはユーザー・ジョブの実行形態（たとえば5250対話型ジョブ、SBMJOB、外部からのプログラムコール,etc.）に関わらず全てのジョブで共用されます。
プログラムコードとPAGは、プログラム実行時に必要部分がメインメモリ上に存在している必要があります。

## MLPのパフォーマンス上のメリット
以下の3点があります。
1.同時に同一プログラムが複数実行された際に使用されるメインメモリの節約
2.プログラム・コードを複数ジョブのそれぞれからストレージ->メインメモリにロードする必要が無いためディスクアームビジー率※1が低減される
3.プログラム・コードを共有したジョブはプログラム・コードのロードに要するディスクI/Oの時間が節約される。結果、応答時間の向上が期待できる。

以上はIBM i OS（含むマイクロコード層）が自動的に実現し、ユーザーが何らかの操作を指定する必要はありません。
プログラム・コードがストレージからメモリにロードされる際は、4KBのページ単位で実行されます。

## ※1ディスクアームビジー率
元来はHDDを前提にした用語。HDDにはそれぞれのHDD装置に装備されたアームを物理的に動作（シーク）させて円盤上に記録されたデータを探しに行き、目的のデータを読み取りします。このシーク時間やデータを実際に読み取っている時間をアームビジー率と呼びます。近年のSSD,NVMeでは物理的に動作するアームのような部品は無いため、アームビジー率＝ストレージ装置がI/O命令を実行（ストレージ上のデータを探しに行く、データを取得する、等）している単位時間当たりの割合、というべきでしょうか。
人はサボりたい生き物なのでできるだけ対応する画面解像度は少ない方がいいと思う

デザイン確認の際に「10個のデバイスサイズを確認してください！」
は実装する人もデザインする人も辛いですよね…。

確認するけど、1つ1つの精度は甘くなってしまうと思います…。
であればどうすればいいのか？の考え方について学んだので共有したいと思います！

:::note info
viewportの対応範囲に悩んでいる人のお役に立てれば嬉しいです！
:::

## viewportを選定する時にまずやること
選定する時に初めにやることは「調査」です。
状況に応じて異なりますが、既存のサイトをリニューアルする場合は2つ行います。

1. 市場のトレンドやシェア状況を確認する
1. リニューアル対象サイトの流入をGoogleAnalyticsで調べる

新しくサイトを立ち上げる場合は1つ目だけで良いかと思いますが、既存サイトをリニューアルする場合は、現在の流入状況も加味してviewportを選定をする必要があると考えます。

### トレンドやシェアの調査はどうするの？
下記のサイトで確認しました。

https://gs.statcounter.com/screen-resolution-stats/mobile/japan/#monthly-202310-202310-bar

様々な絞り込み方ができるので制作するサイトのターゲットユーザーに合わせて確認してみてください！


## どうやって対象を絞り込んでいくのか？
流入しているユーザーや現在のシェアから90〜95％のユーザーを対象とすると画面解像度を5つか6つぐらいまでは決められます！

ただ、リリース時に確認したい解像度が5つもあるのは骨が折れます…。
そこでさらに絞り込んでいく方法を紹介します！

### 役割を決める！
ここでいう「役割」というのは「スマホ最小サイズの確認用解像度」「PCサイズ最大の解像度」など選択してきた確認したい解像度に役割、ラベル付けのことです。

例えば下記の6つまで候補を絞り込んだとします。
- 360px
- 600px
- 768px
- 1280px
- 1920px

さらに絞り込んでいく場合に問いたいのは以下の項目です！
- その解像度で何を確認したいのか
- 大きな幅で確認したい理由はあるのか
- タブレットの解像度で確認することは本当に必要か

上記を例にすると
- 360px：スマホの最小サイズ
- 600px：スマホの最大サイズ
- 768px：タブレットサイズ
- 1280px：PCの最小サイズ
- 1920px：PCのシェア最大サイズ

のように役割を決められます。
ただ、一見無駄がないように見えますがさらに絞り込むこともできます。

:::note warn
絞り込むのはあくまでも考え方の一つであり、絶対に確認する解像度を減らせ。
という意図では全くありませんので改めてご認識ください。
:::

#### 大きな幅で確認したい理由はあるのか
PCのデザインは一定のサイズ以降「余白が増えるだけ」となるサイトもあると思います。
その場合どれほどシェアがあっても確認する意図はあまりないように感じます。

:::note info
例の「1280px」と「1920px」はどちらか1つで良いのでは？と考えられます！
:::

1280pxで確認すればよほど表示崩れ心配はないので1280pxをPCの確認サイズとします！
となるところですが…次に考えることは「1980px」の画面幅で確認する必要があるか？ということです。

:::note warn
〇〇px以上はただ余白が増えるだけ。ということであれば〇〇に当たる最小サイズで確認ができればPCでのデザイン確認は十分であると考えられます。
:::

それなら「1280px」となりますが、日本のシェアは小さくなってきているので…
シェアがある程度大きく、サイトに流入してくるユーザーの一番のボリュームゾーンあたりを対象にできると良いのではと考えます！

:::note info
スマホも同じ考え方で一定より大きいものはただ余白が増えるだけなら最小サイズかつボリュームゾーンを対象にできると1つに絞り込むことも可能だと思います！
:::

デザインが崩れるのは小さくした時が多いかと思うので、大きいサイズの解像度を確認対象に入れる場合には取捨選択ができる可能性があると思っていただけると良いと思います！

#### タブレットの解像度で確認することは本当に必要か
タブレットはスマホの大きい版、PCの小さい版なので明確な意図がない限りはデザイン確認する対象の解像度から外しても良いと思います！

これで例にあげた6つの候補は下記の2つに絞れるかと思います！
- 360px
- 1280px or 1980px

## 一緒に考えたいデザインデータの作りやすさ
対象の画面解像度を選定するときに注意したいのが「デザインデータの作りやすさ」です。
スマホのシェアは合算すると375pxが一番多いようです。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/4b6c2aac-05fb-d3a8-8187-ffb01e4db38c.png)
引用：https://gs.statcounter.com/screen-resolution-stats/mobile/japan#monthly-202310-202310-bar

375pxは割り切れないため、デザインデータ上真ん中寄せが困難です。

:::note info
どの数字で割り切れるかはチームのルールによるところですが、8や4で割り切れる解像度に設定しておけるとみんな幸せになれると思います！
:::


## まとめ
どの場所でも美しくは後のテストが大変になりますし、制作も気を付けることが多くなりすぎて開発工数が伸びてしまう原因になります。

:::note
必要最低限だけ決めておいて、必要に応じて増やす。
数ヶ月に1度広い範囲で確認するので良いと考えています!
:::

人はサボりたくなる生き物だと思うので確認する解像度が増えすぎると確認がおざなりになったり、漏らしたりすると思います。

半年か1年に一度は解像度を見直すことも大切ではないかと思うのでチームで検討してみてください！
Wealth management Appが見つからない


よく見かけるけど、 FSC Super Badge Challenge 1もあるので答えにくい

+ [Hi Everyone, I would like to launch a challenge on my Trailhead Playground but for some reason I don't have the Wealth management App installed and I don't know what the ID is, can somebody please help me?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007O5vQl)

特別版のDE環境を使っていないみたい。

Are you using a special environment like below?

https://trailhead.salesforce.com/promo/orgs/fscplayground
AI-102試験対策のまとめ「ビデオ内の人物認識のカスタマイズ」

## はじめに
Azure AI Engineer Associate(AI-102)取得に向けた勉強でまとめた内容を本記事では投稿しています。
試験範囲の内容を私が勉強していく中で、
・忘れてしまっていた内容
・他の知識と絡めて理解した方が良い内容
・Microsoft Learnの読解に苦戦した内容
などをできるだけ分かりやすく簡潔にまとめることを意識しています。
Azureの勉強を一から始め、AI-102取得を目指している方の参考になれば幸いです。
※本記事の内容が必ず試験に出るわけではないこと、ご注意ください
※勉強しながら投稿しているため、追加で学んだことがあれば随時投稿内容を更新します。

## 試験対策のまとめ
### ビデオ内の人物認識のカスタマイズ
* Azure AI Video Indexerはビデオ内の有名人認識をサポート
    - 下記のトップインフルエンサーなど一般的に要求されるデータソースに基づいて約100万人の顔をカバー
        - IMDB
        - Wikipedia
        - LinkedIn
* カスタム人物モデルを構築することで、既定では認識されない顔を認識できるようにすることができる
    - 人の名前とその人の顔の画像ファイルを組み合わせることで可能

* モデル作成後、下記のタイミングで特定の人物モデルのモデルIDを指定することでモデルを使用可能
    - ビデオのアップロード/インデックス作成時
    - 再インデックス作成時

* 参考
    - https://learn.microsoft.com/ja-jp/azure/azure-video-indexer/customize-person-model-overview

## 次の試験対策のまとめ
* **AI-102試験対策のまとめ「Custom Visionポータルを使用した画像分類モデルの構築」**

https://qiita.com/fsd-jume/items/d43f6d19f6ad6036ba03

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/65aba5d5514e023fd66d
やってみよう　模写コーディング


## 模写コーディングとは

HTML/CSSの基礎的な学習を終えた方が、実践的に技術力を高めたいときに、取り組むべき模写コーディング

すでにあるWebサイトを、自分でHTML/CSSを1から作成し、そっくりなWebサイトを作ること

模写コーディングをすると、格段にフロントエンド開発の力が付く

初心者は、部分模写がおすすめ


## 模写コーディングの手順

1. サイト選び
2. スクリーンショットを撮る
3. テキストを抽出する
4. 画像を抽出する
5. HTML編集
6. CSS編集
7. 答え合わせ


## 1. サイト選び

Googleで、模写コーディング練習サイト、などと検索して、出てきたサイトから、自分が気に入ったものを1つ選びましょう。

## 2.スクリーンショットを撮る

Chromeの拡張機能：GoFullPageを使う

## 3.テキストを抽出する





## 注意点

著作権には、気を付けてください

模写したサイト等は、公開したりせず、ローカルのみにとどめておいた方が良いでしょう。
wslでnerves その29

# 概要
wsl(wsl2じゃない)でnervesやってみる。
qemu(x86_64エミュレータ、ラズパイじゃない)でやってみた。
生成したnerves_livebook.imgを、quemで起動してテストしてみた。
練習問題、やってみた。

# 練習問題
cowboyを使え。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e885d0fb-9732-db53-6f26-b6bd46f84bb5.png)

# セットアップ

```
Mix.install([
  {:cowboy, "~> 2.0"},
 	{:req, "~> 0.4.5"}
])
```

# サンプルコード

```
defmodule Hello do
	defmodule Handler do
		def init(req, _opts) do
			resp = :cowboy_req.reply(_status = 200, _headers = %{"content-type" => "text/html; charset=utf-8"}, _body = "<!doctype html><h1>Hello, Cowboy!</h1>", _request = req)
			{:ok, resp, []}
		end
	end
	def start do
		routes = :cowboy_router.compile([{:_,  [{:_, Handler, []} ]}])
		require Logger
		Logger.info("Staring server at http://localhost:4001/")
		:cowboy.start_clear(:hello_http, [port: 4001], %{env: %{dispatch: routes}})
	end
end
Hello.start()

```

```
Req.get!("http://localhost:4001/")

```

# 実行結果

```
%Req.Response{
  status: 200,
  headers: %{
    "content-type" => ["text/html; charset=utf-8"],
    "date" => ["Tue, 21 Nov 2023 23:31:42 GMT"],
    "server" => ["Cowboy"]
  },
  body: "<!doctype html><h1>Hello, Cowboy!</h1>",
  trailers: %{},
  private: %{}
}
```

以上。
Githubに新規ブランチを git push した時にすぐにPRを作成する

# 発見

新規ブランチをGithubにpushした時に標準出力されるURLから、すぐPR作成できること気づいた

```
Create a pull request for 'branch-name' on GitHub by visiting:
   remote:      https://github.com/xxx/yyy-hra/pull/new/branch-name
```

今まで地味に面倒だったので、これ良いな
( コンソールによってはリンクを Ctrl + クリック / Command + クリック とかですぐにページに飛べるはず)


よく見ると思い切り `Create a pull request for` って書いてあるのにまるで気づいてなかった

ちなみに新規ブランチのpushでないと教えてくれないようだ

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
Splunk の _time フィールドを別名で使用する場合

# 概要
Splunk において、`_time` フィールドは、
データの時刻として色々なシーンで使用されます。

もちろん、フィールド名を変えたいケースもあると思います。
ですが、`_time` フィールドは `rename` コマンドで名前を変えることができません。

この記事では、`_time` フィールドを別名で使用する方法を記載します。


# 対象とする読者
+ Splunk を使っている方で、SPL を書いたことのある方
+ `_time` フィールド を別名で使用したい方


#  対応方法
答えから書きます。
`_time` フィールドは `rename` コマンドで名前を変えることができないため、
`eval` コマンドなどで加工して別の変数に保存します。

### UNIX TIME で別名保存する
```
| eval 変数名=_time
```
### ISO8601 形式で別名保存する
```
| eval 変数名=strftime(_time, "%Y-%m-%dT%H:%M:%S+09:00")
```

### 月日と時分 で別名保存する
```
| eval 変数名=strftime(_time, "%m/%d %H:%M")
```

### サンプル
SPL
```
～
| eval 開始日時=strftime(_time, "%Y-%m-%dT%H:%M:%S+09:00")
| table 開始日時
```

結果
```
開始日時
---------------------------
2023-04-02T06:10:50+09:00
```


# 解説
2010年の記事ですが、Splunk Answers での回答によると、
「`_time` フィールドは、Splunk のイベントの時刻となるフィールドであるため、
　`_time` そのものを変更することは望ましくなく、コピーして使用することが望ましい」
とのことです。

[参考： Splunk Answers での回答](https://community.splunk.com/t5/Splunk-Search/Renaming-time-field-causes-an-unwanted-result/m-p/11322#M747)
スクリーンショットの座標値を取得

[Web画面のエビデンス取得の自動化](https://qiita.com/flip-flop/items/329b3155df52e4c78cd4)の引数に必要な座標値の取得方法を紹介します。何かのお役に立てれば幸いです。

# はじめに
スクリーンショットを取得する方法は、Windows + shift + s -> 対象範囲をドラッグでコピーです。
たまに取得する程度なら便利な機能です。
しかし、テストとなると毎回同じことをやるのはいろいろ面倒です。
毎回選択範囲がずれて貼り付けたときに画像サイズが揃わない。
選択範囲を間違えて再度取り直しになる。
tooltipを表示していたつもりが消えていて取り直しになる。
など、ただでさえ時間のかかる作業なのにこういうのが発生すると萎えます。
そこで画像サイズが揃うように座標値を取得するプログラムを書きました。

# 完成プログラム
```
#getCoordinteVal.py
from pynput import mouse

# //////////////////////////////////////////////////
# プログラムの説明
#   スクリーンショットの指定範囲の座標を取得
# 実行準備
#   実行ファイルのあるフォルダでpowershellを開く
#   (Python) 実行ファイル名を入力してEnter
# 実行後の画面操作方法
#   1回目のクリックでブラウザを選択
#   2回目のクリックで始点をクリック
#   3回目のクリックで終点をクリック
# //////////////////////////////////////////////////

#指定範囲の座標を取得
left_up_x, left_up_y, right_down_x, right_down_y = [0,0,0,0]
num_press = 0

def main():
    with mouse.Listener(on_click=on_click) as listener:
        listener.join()
    # 範囲の確認
    print(f"{left_up_x} {left_up_y} {right_down_x-left_up_x} {right_down_y-left_up_y}")  
   
def on_click(x, y, button, pressed):
    global left_up_x, left_up_y, right_down_x, right_down_y, num_press
    if pressed:
        # 1回目のクリックはウィンドウの切り替え用で何もしない
        if num_press == 0:
            num_press = 1
        # 2回目のクリックはスクリーンショットを撮る範囲の左上を指定
        elif num_press == 1:
            num_press = 2
            left_up_x, left_up_y = x, y
        # 3回目のクリックはスクリーンショットを撮る範囲の右下を指定して終了
        else:
            right_down_x, right_down_y = x, y
            return False

if __name__ == "__main__":
    main()
```
▼ 以下で実行
```
python .\getCoordinteVal.py
```
▼ 実行結果
```
315 412 1184 517
```
# このプログラムの使用例
* [Web画面のエビデンス取得の自動化](https://qiita.com/flip-flop/items/329b3155df52e4c78cd4)
* [スクリーンショットをクリップボードに保存](https://qiita.com/flip-flop/items/89cd4c52309d1d0641d6)
# おわりに
ほとんど参考ページのまんまです。。。すみません。

# 参考リンク
* [PythonからWindowsのクリップボードに画像をコピーする](https://water2litter.net/rum/post/python_win32clipboard_set/)
【Ruby】case文をハッシュに変えたら少しだけ幸せになれた話

## はじめに
どうもこんにちはもきお([@mokio_50](https://twitter.com/mokio_50))です。今回は実務で「おっ、これいいじゃん」と思ったちょっとしたリファクタリングになります。

例として今回は東海オンエアのメンバーからメンバーカラーを返すと言うのを例にしました。

## if文をcase文に

一番条件分岐でオーソドックスなif文で書くと

```ruby:
member = "ゆめまる"

if member == "てつや"
  "オレンジ"
elsif member == "りょう"
  "ブルー"
elsif member == "しばゆー"
  "イエロー"
elsif member == "ゆめまる"
  "ピンク"
elsif member == "虫眼鏡"
  "ブラウン"
elsif member == "としみつ"
  "グリーン"
end
```
今回は`ゆめまる`なので`ピンク`が表示されるでしょう。

続いてcase文を用いて書くと

```ruby:
member = "ゆめまる"

case member
when "てつや"
  "オレンジ"
when "りょう"
  "ブルー"
when "しばゆー"
  "イエロー"
when "ゆめまる"
  "ピンク"
when "虫眼鏡"
  "ブラウン"
when "としみつ"
  "グリーン"
end
```

少しスッキリしましたね！これでも結果は同じ`ピンク`が返ってきます。

ここまでは良くあるリファクタですが最後にハッシュを使ったリファクタリングを行って終わりたいと思います。

```ruby:
members_color = { 
  "てつや" => "オレンジ",
  "りょう" => "ブルー",
  "しばゆー" => "イエロー",
  "ゆめまる" => "ピンク",
  "虫眼鏡" => "ブラウン",
  "としみつ" => "グリーン"
}

member = "ゆめまる"
puts members_color[member]
=> "ピンク"
```
ハッシュを使うとかなり簡潔に取り出したい値を取得することができます。
そして更なるメリットはcase文は上から条件比較しなくてはいけないのに対し、ハッシュを使うことによって一致するものを即座に返してくれるので、少し処理速度も早くなります。

## おわりに
ちょっとしたリファクタの積み重ねで読みやすい、理解しやすいコードになります。今後他の人が該当コードを改修する時、自分自身が改修することも意外と多いので自分自身のためにもちょっとしたリファクタリングを心がけていきたいですね。

最後までご覧いただきありがとうございました！
少しでも良かったと思っていただけたら左上のいいねボタンポチッといただけますと幸いです。
虹の向こうに導く

<font color="Grey">*[Leading over the rainbow](https://aiven.io/blog/leading-over-the-rainbow)の翻訳です。*</font>

2022年7月1日

# 虹の彼方へ

Aivenのプライド・パートナーシップの一環として、Aivenのコミュニティ・メンバーやアライの皆さんにお話を伺いました。AivenのCISOであるジェームス・アーレンにとって、プライド・ウィークがどのような意味を持つのかをお読みください。

*このブログ記事の本題に入る前に、先週末にノルウェー・オスロで起きた無分別な暴力事件で被害に遭われた方々のご冥福をお祈りし、追悼の意を表したいと思います。世界中で基本的な平等と人権の問題に苦しんでいる人々を恐怖に陥れ、疎外することを意図した行為で、2人が殺害され、21人が負傷した。このような行為に弁解の余地はなく、容認することはできません。


私はプライド・ウィークについて、そしてその意味について考えてきた。このことは、多くのリーダー、特にあらゆる世界観にまたがって仕事をする方法を知らないが、積極的に学ぼうとしている白人のヘテロ・シス・男性のリーダーが悩む問題につながる：「2SLBGTQIA+のインクルーシブな職場を実現するために、リーダーとして何ができるのか？


私たちにできることは、とても簡単なことでもあり、とても難しいことでもある。


## ♪知らないことを受け入れる


何事も、自分には経験や専門知識が不足している分野だと認めることから始まる。知らないことがあってもいい。自分自身を教育し、自分を頼りにしてくれる人たちを助けるために必要なサポートを見つけることはOKだ。これが私の強さの源である。


このような弱さを受け入れるのは簡単なことではない。 不甲斐なさや弱さの感情につながることさえある。それもまたいい。関係なく進み続ければいい。


## エグゼクティブの味方


私は、Aivenの#ProudCrabsコミュニティのメンバーとエグゼクティブチームをつなぐことを目指しています。こうすることで、私はより大きな利益に貢献し、私のサポートを提供することができ、私たち全員の間に体系的、構造的、かつ責任ある関係を築くことができます。この活動は組織内で可視化されるべきです。私たちは常にオープンであるべきで、包括的に行動する方法について話し合うべきです。また、社内での行動だけでなく、ヘルシンキ・プライドへの支援のような公的な行動を通じて、会社がすべての2SLBGTQIA+の同僚と家族を支援するようにしなければなりません。これこそがアライであることなのです。


## キャストの多様化


カナダ人として、私は非常に多文化的な社会に住んでいる。私の中心的なビジョンのひとつは、私のコミュニティと同じようなチームを持つことです。


この多文化主義にもかかわらず、カナダは、異なる人々と認識される人々への接し方において、いくつかの重大な過ちを犯してきた。私たちは意識的に改善し、少しずつ前進していると信じている。まだ十分ではありませんが、前進はしています。私は多様な人材の採用をリードすることで、Aiven社内でこれを反映させることができる。私はよく、どんな器であろうと最高の頭脳を雇いたいと言ってきた。しかし、そう言うことと、実際にそれを実行に移すことは、まったく異なる仕事だ。


ハラスメントやその他の不適切な行動が起こるような環境では、多様なスタッフを雇うことはできない。このようなことは許されることではなく、誰もが安心して自分らしく働けるような対策を講じなければなりません。


ハラスメントや不適切な行動を容認しない」と言うと不誠実に聞こえるが、それはある意味その通りだからだ。ハラスメントや不適切な行動は多くの場合、陰湿で構造的なものであり、部外者には見えにくいものです。しかし、たとえ困難であっても、言い訳の余地はなく、ただ正しいことをするのみです。


## 最後のアドバイス


私が他の非マイノリティのリーダーにできる最も重要なアドバイスは、できるだけ多くの多様な人々と働く経験から学ぶ機会を持つことだ。あなたが今の地位にいるのは、何かに長けているからであり、すべてのことに長けていて、さらに多くのことを学べる人などいない。


他の人のアドバイスを受け、自分の先入観や限られた視点に疑問を投げかけてもいいようにする。より良くなるための手助けをしてもらうのだ。そうすれば、あなたはプライドを支えるために生き、働いていると言える。


2SLBGTQIA+のスタッフに、あなたが真のアライになれることを示し、1年の残りの51週間をプライドでサポートしましょう。


\*2SLBGTQIA+は、北米先住民の["Two Spirit"(2S)[](https://en.wikipedia.org/wiki/Two-spirit)の概念に言及しており、インターセックスやアセクシュアルの人々も明確に含まれているため、カナダのイズムのようなものかもしれません。[DEFINING 2SLGBTQ+ TERMS](https://www.trentu.ca/currentstudents/sites/trentu.ca.currentstudents/files/documents/Defining%202SLGBTQ+%20Terms%20OoC.pdf)も参考になる。


--


Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関するちょっとした情報を入手するには、[月刊ニュースレターを購読](https://aiven.io/newsletter)してください！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。
Pythonで「演算子の優先順位」の動作を確認してみた

# 概要

Pythonで「演算子の優先順位」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/python/num/index3.html

# 実装

以下のファイルを作成しました。
```sample.py
print("5 + 3 * 4 = " + str(5 + 3 * 4))
print("(5 + 3) * 4 = " + str((5 + 3) * 4))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
5 + 3 * 4 = 17
(5 + 3) * 4 = 32
```

# まとめ

何かの役に立てばと。
JavaScript Lintツール


## Lintとは

静的解析ツールのこと

プログラムコードを読み込んで、問題がないか調べてくれる

linterとも呼ぶ

## コンパイラとの違い

コンパイラ：言語仕様や構文規則などに違反する誤りがある場合にエラーを返す
Lintツール：文法上の誤りだけでなくバグの原因となり得る疑わしい記述を返す


## JSのLintツールの一覧

ESLint
JSHint
JSLint


## ESLintの使い方

### 1. ESLintのインストール
```
npm install eslint --save-dev
```

### 2. 設定ファイルの初期化

```
npx eslint --init
```

### 3. ルールのカスタマイズ

.eslintrcファイルに、ルールを記述する

### 4. Lintを実行する


```
npx eslint yourfile.js
```
JavaScript npm


## npmとは

```
①パッケージの管理をしてくれる

そのプロジェクトで、必要なライブラリやパッケージを容易にインストールすることを可能にする

②依存関係を管理してくれている

package.jsonに記載されている情報をもとに、
必要なバージョンを正確に、一括でインストールすることを可能にする
```

## 

任意のディレクトリで npm init を実行し、package.json を作成

```
npm init
```

の実行結果、

```
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
```

と表示され、その後、終わるまで、Enterを押し続けると、package.jsonが作成される


## 任意のパッケージをインストール

```
npm install express
```


## package.json 及び package-lock.json に追記されていることを確認

```
npm list
```

```
cat package.json
```

```
less package.json
```
JavaScript  try...catch


## try...catch文とは

結論
```
一言説明　：　エラー特化のif文みてーなもん
```

ちゃんと説明

```
例えば、関数やクラスやオブジェクト、JSプログラムにおいて、
特定の条件が発生した場合に、意図的に（わざと）エラーを発生させたい場合に使うもの
```

## 実例

```
//関数定義
function checkDivisibleByFive(num) {
  let target = num % 5;
  var result;
  if(target == 0 ){
    result = true;
  }
  else{
    result = false;
  }
  return result
}


// try...catch 構文
try{
  const result = checkDivisibleByFive(4);
  if(result === false){
    throw new Error('5で割り切れない数字です');
  }
  else{
    console.log(result)
  }

}catch(e){
  console.error( e.message );
}
```

これを日本語で解説すると、

```
もし、5で割り切れる値を受け取ったら、true
5で割り切れない値を受け取ったら、5で割り切れない数字です
と、表示する
```
JavaScript　　console.logとconsole.errorの違い



`console.log` と `console.error` は、どちらもコンソールにメッセージを出力する際に使用されるメソッドですが、異なる目的で使われます。

- **`console.log`**: 一般的な情報やデバッグ情報を表示するのに使われます。主に一般的なログ、変数の値、オブジェクトの内容などを表示するために使われます。通常のプロセスや実行の流れを理解するための情報を出力します。

```javascript
console.log('This is a log message.');
console.log(variable); // 変数の値を表示
```

- **`console.error`**: エラー情報や警告を出力するのに使用されます。特に問題がある場合やエラーが発生した場合に、その旨を強調して表示するために使われます。エラーが発生した場所や原因を特定しやすくするために使われます。

```javascript
console.error('This is an error message.');
console.error(errorVariable); // エラーオブジェクトを表示
```

ブラウザや開発環境によっては、`console.error` で出力された情報は視覚的に目立ち、赤色や異なるスタイルで表示されることがあります。これにより、エラーの迅速な特定と修正を支援します。
JavaScript クラス　｜　class構文

## JavaScriptのクラスについて

ES2015（ES6）までは、`class構文`なんてものは存在しなかった。

JavaScriptは、プロトタイプベースの言語であり、クラスベースの言語ではないからだ。

しかし、クラスが作れないのは不便だ

ということで、ES2015以降は、クラスも使えるようになった。

これによって、ありがたいことに、クラスベースの言語を習得している人にとって、わかりやすくJavaScriptでも同様にクラスを作成できるようになった。



## クラスの作り方


```
//クラスの定義
class Playlist{
  //コンストラクタを作っている
  constructor(name){
    this.name = name;
    this.songs = [];
  }
  //メソッドを作っている
  addSong(song){
    this.songs.push(song);
  }
  //メソッドを作っている
  play(){
    return this.songs[0]
  }
  //メソッドを作っている
  removeSong(target){
    let array = [1, 2, 3, 4, 5];
    this.songs = this.songs.filter(function(item) {
      return item !== target;
    });

  }
}



let myPlaylist = new Playlist('お気に入りリスト');//クラスのインスタンスの作成
myPlaylist.addSong('Lemon');//プレイリストに、Lemonを追加
myPlaylist.addSong('花束');//プレイリストに、花束を追加
console.log(myPlaylist.play()); // 再生中: Lemon
myPlaylist.removeSong('Lemon');//プレイリストから、Lemonを削除
console.log(myPlaylist.play()); // 再生中：花束
```

## その他のクラスのテクニック

1. 継承
1. ゲッターやセッター
1. static
1. public
【ネットワーク】基礎知識-パケット軸

## パケット(Packet)
・データ通信において情報を効率的に送受信するために分割された小さなデータの単位
・各パケットには送信元と宛先のアドレスが含まれ、それぞれがネットワーク上を独立して転送され、最終的に再結合されて元のデータを再構築する

## プロトコル(Protocol)
・プロトコルは通信の取り決め
例えば、HTTP (HyperText Transfer Protocol) はウェブページの取得に使用され、TCPやUDPはデータの転送方法を定義します。これらのプロトコルにより、様々な機器やソフトウェアが協調して通信できます。

## ルータ(Router)
・パケットが送信元から目的地までの最適な経路を選択し、それを転送する役割を果たす。
・各パケットはルータを通ることで目的地に到達する

## IPアドレス(IP Address)
パケットには送信元と宛先のIPアドレスが含まれます。
これにより、ネットワーク上のデバイスが一意に識別され、データが正確な宛先に到達します。

## TCP(Transmission Control Protocol)
・TCPは、パケットの転送を確実に行うために使用される
・パケットが順序通りに届くことを確認しながらデータを転送します。

## UDP(User Datagram Protocol)
・UDPは、高速な転送を追求し、確認の手続きを省略することで軽量な通信を可能にする

## ハブ(Hub)とスイッチ(Switch)
ハブは単純なブロードキャストを行い、ネットワーク上の全てのデバイスにデータを送信します。対照的に、スイッチは目的のデバイスにだけデータを転送し、ネットワーク上のトラフィックを最適化します。

## ホワイトリスト (White List)
ホワイトリストは、信頼できるものや許可されたもののリストです。ネットワークにおいて、ホワイトリストが適用されると、リストに含まれない通信やアクセスは拒否されます。例えば、特定のIPアドレスやユーザーがホワイトリストに登録されている場合、それら以外の通信は許可されません。

## ブラックリスト (Black List)
ブラックリストは、信頼性が低い、危険な、または許可されていないもののリストです。ネットワークにおいて、ブラックリストが適用されると、リストに含まれる通信やアクセスは拒否されます。例えば、悪意のあるウェブサイトや不正なIPアドレスがブラックリストに登録されている場合、それらへのアクセスが制限されます。
FirebaseとFlutterを紐づける手順の備忘録

1. Node.jsのインストール
1. ```npm install -g firebase-tools```の実行
1. ```firebase login```の実行
1. 「firebase : このシステムではスクリプトの実行が無効になっているため...」の実行セキュリティ関連のエラーが発生
1. ```PowerShell -ExecutionPolicy RemoteSigned firebase login```の実行([参考](https://qiita.com/shark_No95/items/eb2714a542880e5e696a))
1. ```flutter create --project-name [プロジェクト名] [ディレクトリパス]```を実行。ちなみにプロジェクト名は英小文字かアンダースコアしか使えないらしい。英大文字を使うとエラーでる。
1. ```C:\Users\{username}\AppData\Local\Pub\Cache\bin```にパスを通す
1. ```flutterfire configure --project={firebaseのプロジェクトID}```を実行
1. pubspec.yamlにfirebasec_coreの行を追加
```
dependencies:
  flutter:
    sdk: flutter
  firebase_core: ^1.19.1
```
App Service プラン が ダウングレード出来ない場合の対処法

# はじめに
App Service で 有料サービス（VNET統合や カスタムドメインなど）の検証を行ったあと、そのまま App Service プラン をそのままにしておくと、課金の対象になります。
そんな時には、App Service プラン を Free (F1) に戻せば良いわけなのですが、エラーがでて ダウングレードできない症状に見舞われます。

以下のようなエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e8a6c6d8-8276-8668-9f9b-dfb8e82612c3.png)

:::note alert
Cannot update the site 'xxxxxxxxx' because it uses AlwaysOn feature which is not allowed in the target compute mode.
:::

その際の対処方法をまとめました。

# エラーの再現手順
1. 作業前のプランが Basic (B1) であることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/14d9c351-827e-5c7d-908d-ef22ee8e1590.png)
　<br>
1. 左ペインの「スケールアップ (App Service プラン) 」を選択して、一覧から「Free F1」を選び「Select」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8a4a8c26-8b59-016b-8c23-17f91b0b910f.png)
　<br>
1. 以下では「Downgrage」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7a9867f3-e5c0-f4c7-a130-a1a69a4c7bfb.png)
　<br>
1. すると、以下のエラーが発生して、ダウングレードができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/3cbb77cf-ebdb-62cf-bbfb-2cb4bb2c749b.png)

# 対処方法
1. 原因は、左ペインの「構成」から「常時接続」という設定項目がありますが、これが「オン」になっていることがダウングレードできない原因です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f478a677-1147-589e-95d7-ca709337fe4c.png)
　<br>
1. 下図の通りに、常時接続の「オフ」を選択して「保存」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1c32cb50-4333-ad5d-7c13-c5c5bd3eba49.png)
　<br>
1. 以下の画面では「続行」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/fa8c7c8b-7907-5786-76bd-35b1866f2e03.png)
　<br>
1. 以下の通知が表示されれば設定完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e3043801-b059-d172-1461-74ca369b6e5b.png)

# 改善状況の確認
1. 以下の画面で あらためて「Free F1」を選択して「Select」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8a4a8c26-8b59-016b-8c23-17f91b0b910f.png)
　<br>
1. 以下では「Downgrade」を押します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/7a9867f3-e5c0-f4c7-a130-a1a69a4c7bfb.png)
　<br>
1. 下図の通り、正常にダウングレードが完了した旨の通知が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/08224a2c-c0f4-c3d1-2a9c-f618f9b38260.png)
　<br>
1. 概要ページで SKU と サイズ を確認すると、Free(F1) に変更されている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4c0bcf78-f1cd-ea95-4e22-3972f9263f21.png)
GithubでCtrl+Kショートカットの上書きを防ぐ

## Githubのウェブページ上でショートカットが上書きされる

Chromeを始めとしたブラウザでは `Ctrl+K` ショートカットでアドレスバーに飛んで検索をすることができます。

しかし、Githubではこのショートカットが上書きされてしまっています。

https://twitter.com/github/status/1453389061478043652?lang=ja

個人的には `Ctrl+K` を多用しているので困っていたのですが、この上書きはGithubの設定から無効化できます。

## 設定方法

Githubの設定画面の「Accessibility」に設定項目があります。「Keyboard shortcuts」 > 「Command palette」 > 「Search mode」を`Disabled`にして「Save Keyboard shortcut preferences」で保存すればよいです。

https://github.com/settings/accessibility

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273742/6103c19e-e66d-ae94-c959-13d34a910a9c.png)
Dart の Future.wait() における型の扱いが危なかしい問題

こんにちは。
本業では Android アプリエンジニア (Native) をしているものです。
Flutter は楽しいですね。
最近は趣味で Flutter を書いています。以前は副業で過労○しそうなくらい書いてました。
KMM や Compose Multiplatform などいくつかのマルチプラットフォーム対応のフレームワークを試しましたが、今のところ Flutter が一番アプリを作りやすいです。
Compose Multiplatform に関しては、せめて Navigation だけでも誰か作って欲しいです（他力本願）

本題なのですが、 皆さんは Dart の `Future.wait()` を使ったことはありますでしょうか。
複数の Future を並列で実行して待つというものです。
具体的な用途としては、例えば複数の API を同時に叩くときにシーケンシャルに叩く場合に比べて効率良くレスポンスを受け取れます。
私も何度か使ったのですが、使うたびに「型指定が実質不可能で怖いな」という感想を抱きます。

# 問題点
一応 `wait()` にはジェネリクスを指定できるようになってはいます。下記が `wait()` メソッドの定義です。

```dart:future.dart
  static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
      {bool eagerError = false, void cleanUp(T successValue)?}) {
```

ただし、並列実行したときの返り値が全て同じ型に準拠をしている前提なので、このジェネリクスを活用できることは稀だと思います。結果、dynamic な型を受け取ることになり、ダウンキャストする危険が生じます。
個人開発中のアプリの実例ですが↓

```dart
    final futures = await Future.wait([
      canvasRepository.fetchTextEntities(projectId: params),
      canvasRepository.fetchArrowEntities(projectId: params),
    ]);
    final texts = futures[0] as Iterable<TextEntity>;
    final arrows = futures[1] as Iterable<ArrowEntity>;
```

危ないところが盛り沢山だと思いませんか？（思わなかったらすみません）

コンパイルエラーを全く活用できていないコードとなってしまい、ランタイムエラーで落ちるという最悪のケースが発生しかねません。

私が問題に思ったのは下記の二点です。
1. 返り値の配列にインデックスアクセスするのが危険（例えば、配列の中身を一個消したがインデックスを参照する部分を消し忘れてしまい、 OutOfIndex の Exception を吐く）
2. 返り値の型が変わってもダウンキャストしているのでコンパイルエラーを吐かない

「コンパイルさえ通ればうまく動いて欲しい」という怠惰を拠り所に解決策を考えました。

# 解決策
`wait()` はうまく使えなかったので、 Util を作ってしまいました。
「アプリ固有のロジックを持っていないため、セーフ」と自分に強く言い聞かせています。
簡単に言うと、 `Future.wait()` をラップして型の扱いを厳格にしています。

```dart:future_utils.dart
class FutureUtils {
  FutureUtils._();

  static Future<Pair<S, T>> waitPair<S, T>(
    Pair<Future<S>, Future<T>> pair,
  ) async {
    final futures = await Future.wait([pair.first, pair.second]);
    return Pair(futures[0] as S, futures[1] as T);
  }
}
```

```pair.dart
class Pair<S, T> {
  final S first;
  final T second;

  Pair(
    this.first,
    this.second,
  );
}
```


先程の危なかしかったコードを実際に書き換えてみます。

Before
```dart
    final futures = await Future.wait([
      canvasRepository.fetchTextEntities(projectId: params),
      canvasRepository.fetchArrowEntities(projectId: params),
    ]);
    final texts = futures[0] as Iterable<TextEntity>;
    final arrows = futures[1] as Iterable<ArrowEntity>;
```

After
```dart
    final futures =
        await FutureUtils.waitPair<Iterable<TextEntity>, Iterable<ArrowEntity>>(
      Pair(
        canvasRepository.fetchTextEntities(projectId: params),
        canvasRepository.fetchArrowEntities(projectId: params),
      ),
    );
    final texts = futures.first;
    final arrows = futures.second;
```

配列アクセスもダウンキャストもなくなりました。
fetch の返り値の型が変わったらしっかりコンパイルエラーが教えてくれます。
うっかり消したはずの配列にアクセスしてしまったりもしません。
デグレしにくいコードになりました。


ここには `Pair` のみを載せましたが、 `Triple` + `waitTriple()` なんかも同じ要領で作れます。

Util を作るというあまりスマートではない解決方法ですが、アプリ固有のロジックが含まれていないため十分に汎用性が高く、解決したい課題に対してピンポイントに効いたのでめでたしめでたしです。


それでは！
CSSでの要素指定方法9選

# CSSでの要素指定方法9選

Webページのデザインをカスタマイズする際、CSS（Cascading Style Sheets）は不可欠なツールです。CSSを使うことで、ページ上の要素にスタイルを適用し、見た目を整えることができます。特に要素の指定方法を理解することは、効率的なスタイリングにとって重要です。この記事では、CSSで使用される要素指定方法を8つ紹介し、それぞれの使い方を初心者にも分かりやすく解説します。

## 基本の要素指定方法

### 全ての要素を指定 `*`

#### 使い方

```css
* {
    /* すべての要素に適用されるスタイル */
}
```

### クラス名の指定 `.class`

#### 使い方

```css
.className {
    /* 特定のクラス名を持つ要素に適用されるスタイル */
}
```

### ID名の指定 `#id`

#### 使い方

```css
#idName {
    /* 特定のIDを持つ要素に適用されるスタイル */
}
```

## 特定の関係にある要素の指定

### 子孫セレクタ `A B`

#### 使い方

```css
div p {
    /* div要素の中のすべてのp要素に適用されるスタイル */
}
```

### 子セレクタ `A > B`

#### 使い方

```css
ul > li {
    /* ul要素の直下のli要素に適用されるスタイル */
}
```

### 隣接セレクタ `A + B`

#### 使い方

```css
h1 + p {
    /* h1要素の直後にある隣接するp要素に適用されるスタイル */
}
```

### 兄弟セレクタ `A ~ B`

#### 使い方

```css
h1 ~ p {
    /* h1要素の後ろにある同じ階層のすべてのp要素に適用されるスタイル */
}
```

### 複数のセレクタ指定 `A, B`

#### 使い方

```css
h1, h2 {
    /* h1要素とh2要素の両方に適用されるスタイル */
}
```

### イベント発生時の指定 `.btn:hover`

#### 使い方

```css
.btn:hover{
    /* ホバーされた際に適用されるスタイル */
}
```


## まとめ

CSSにおける要素指定方法は多岐にわたり、ページ上の特定の要素や特定の関係にある要素群にスタイルを適用するために使用されます。全要素指定、クラス名指定、ID名指定などは基本的な指定方法であり、子孫セレクタ、子セレクタ、隣接セレクタ、兄弟セレクタ、複数セレクタ指定などはより複雑な関係を表現するのに役立ちます。これらの指定方法を理解し、適切に使用することで、より洗練されたWebデザインを実現できます。
指定したタイムゾーンの時刻に変換する

# 経緯

開発中は<code>DateTime.Now</code>で東京時間が取得できるけど、デプロイするとロンドン時間が取れてしまうことがある。
最初は<code>DateTime.Now.AddHours(9)</code>とかしていたけど、きちんとした別の方法があったことが分かったので、備忘録として。

# 環境

言語：C#
バージョン：.NET Framework 4.8

# コード

以下のように書くと、東京の現在時刻が取得できます。

```csharp
TimeZoneInfo tokyoTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
DateTime dateTimeInTokyo = TimeZoneInfo.ConvertTime(DateTime.Now, tokyoTimeZoneInfo);
```

もちろん、タイムゾーンのIDを変えれば別の場所の時刻にも変換可能です。

# 拡張メソッドを用意する方法も紹介

最近、拡張メソッドというものを知ったので、そちらを使って任意の日時データを東京時間に変換するメソッドを作る方法も紹介します。

今回はExtensionsというフォルダにDateTimeExtensions.csファイルを作り、東京時間に変換する拡張メソッドを用意します。

```csharp:Extensions/DateTimeExtensions.cs
public static class DateTimeExtensions
{
  public static DateTime ToTokyoTime(this DateTime dateTime)
  {
    TimeZoneInfo tokyoTimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
    DateTime dateTimeInTokyo = TimeZoneInfo.ConvertTime(dateTime, tokyoTimeZoneInfo);
    return dateTimeInTokyo;
  }
}
```

後はExtensionsをusingに追加し、以下のように呼び出せば東京時間への変換が可能です。

```csharp
DateTime.UtcNow.ToTokyoTime();
```

拡張メソッド便利ですね。

# その他

この記事書き終えた後に見つけたのですが、大変参考になるのでおいておきます。

https://qiita.com/katz/items/d0cad9bfee79ef10ec5c

# 参考

https://learn.microsoft.com/ja-jp/dotnet/standard/datetime/converting-between-time-zones

https://learn.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
Azure Functions の拡張機能 Durable Functions とは

::: note warn
エンジニアが趣味程度で利用しているDurable Functionsの記事です
メモ程度に記述するので情報の網羅性や正確性には欠けるかもです、、
:::

## この記事に関係するもの
 - Azure
 - Azure Functions
 - Durable Functions

# Durable functionsとは
　Durable functionsはAzure Functionsの拡張機能であり、サーバーレスコンピューティングの環境でステートフルな関数を記述することが可能になる機能。

Durable functionsは主に以下の3つで構成される。
<dl>
  <dt>クライアント関数</dt>
  <dd>　処理のトリガーの受け取り口となる関数。トリガーをHTTPリクエストに設定した場合は、HTTPへのリクエストがあるたびにHTTPのパラメータなどから情報を受け取り、オーケストレーション関数を起動する。</dd>
  <dt>オーケストレーション関数</dt>
  <dd>　その名の通り処理の大まかな流れを制御する関数。基本的に複数のアクティビティ関数に細かい処理を任せ、オーケストレーション関数自身が大きな処理を担うことはない。</dd>
  <dt>アクティビティ関数</dt>
  <dd>　具体的な処理を記述する。</dd>
</dl>

![スクリーンショット 2023-11-02 125336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588367/02f30d7a-6013-12ec-15ec-55433a0ee190.png)



## Durable Functionsを利用するメリット
Durable functionsを利用して感じたメリットは3つある。　
#### 1. 複雑なワークフローを定義可能
　Durable functionsを利用してステートフルな関数にすると、タスクハブ（ストレージサービスへの状態の保存）を利用して以前の状態を保持することができる。そのため、ステートレスでは実装ができなかった複雑なワークフローも定義することが可能となる。
 
　具体的には、各アクティビティ関数を**関数チェーン**で直鎖的につなげたり、**ファンイン/ファンアウト**で並列処理を実現したりすることが可能。(接続パターンの詳細な情報は[こちら](https://learn.microsoft.com/ja-jp/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3%2Cv1-model&pivots=python)。)
 
#### 2. 実行時間の制限を回避可能
　ステートフルになり状態が保持されることで、複数の関数が連携することが可能となり、長時間の実行が可能となる。

#### 3. トレース可能
　ステートフルな関数のため、各関数の実行状況やデータの流れをトレースすることが可能になる。
Azure Function のみで利用可能な Pythonプログラミングモデルv2 とは

:::note warn
Pythonプログラミングモデルv2を趣味程度で利用しているエンジニアによる記事です
:::


## Python プログラミングモデルv2 とは
　Pythonプログラミングモデルv2（以下Python v2）は、<INS>Azure Functionsのみで利用可能</INS>であり、開発者にとってなじみ深い体験を提供することを目的として作られたそう。
　2023年5月に一般リリースされたプログラミングモデルなので日本語の記事が少ない。そのため記事を書いてみようと思った。

## Python v2 を利用して感じたメリット
Python v1 を利用した後に Python v2 を利用し、そのときに感じた利点は3つ。
<dl>
 <dt>1. フォルダー構造が単純になった</dt>
 <dd>必要なファイルを設定する必要がなく、コード上でそれらを表現するようになった。そのためフォルダーの構造が単純になり管理が楽になった。</dd>
 
 <dt>2. トリガーとバインディングがデコレータとして表現されて必要なファイルが減少</dt>
 <dd>Python v1 で各アクションを設定していた function.json の設定ファイルが、Python v2 では不要に。</dd>
 
  <dt>3. 同じファイルで複数の関数を定義可能に</dt>
  <dd>これにより最もフォルダーがすっきりした感じがする、、</dd>

- - - 
画像はコーディング中のファイル一覧です。

利用している赤いフォルダの、黄色い下線が引かれているものぐらいしか変更しないので扱いやすいです
（たくさんバインディングしているのでごちゃごちゃに見えますが、v1と比べると少なくなりました、、！）
![スクリーンショット 2023-11-02 132442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588367/5491ee0f-0c74-4ed7-872a-091af24bb59c.png)

　エンジニアは少ない箇所を管理するだけでよくなるので、Python v1 よりも Python v2 を利用したほうがコーディングに集中しやすくなるのではないかと思います。

　Python v2は、4.x Functionsランタイムのみでサポートされているので、利用可能な方はぜひ！

- - - 

:::note info
Pythonプログラミングモデルv2の<INS>コーディング</INS>に関する記事は別で書く予定なのでぜひ参考に
:::
Rustで抽象的にダイクストラ法を実装し最短経路探索する

抽象的にダイクストラ法を実装してみました。

## 例

このような距離付き無向グラフを例に各地点から`c`への最短経路を解きます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118083/71f6ba6a-1f4f-a7f2-cc05-828f3736284d.png)
このグラフを以下のように簡単に表現できます。
```rust:dijkstra.rs
    fn main() {
        let r = dijkstra(
            [
                ("a", "b", 1),
                ("b", "c", 2),
                ("c", "d", 3),
                ("d", "a", 4),
            ].into_iter(),
            ["c"].into_iter(),//goal
        );
        for (k, v) in &r {
            println!("地点{}から目的地までの距離は{}。次の経路は地点{}", k, v.1, v.0)
        }
    }
```
次に進むべきノードと距離が表示されましたね
```
地点bから目的地までの距離は2。次の経路は地点c
地点dから目的地までの距離は3。次の経路は地点c
地点aから目的地までの距離は3。次の経路は地点b
地点cから目的地までの距離は0。次の経路は地点c
```
ここでは地点(node)は文字列、距離は整数としました。
しかしnodeはハッシュが生成できるなら、距離も比較と加算減算できるならどのような型でもgenericに対応できます。

距離が浮動小数点、ノードが整数、配列がVecとHashSetである例
```rust
        let r = dijkstra(
            vec![
                (0, 1, 1.0),
                (1, 2, 2.0),
                (2, 3, 3.0),
                (3, 0, 4.0),
            ].into_iter(),
            HashSet::from([2]).into_iter(),//goal
        );
        for (k, v) in &r {
            println!("地点{}から目的地までの距離は{}。次の経路は地点{}", k, v.1, v.0)
        }
```

実装を見てみましょう。

## 実装

```rust:dijkstra.rs
use std::collections::{HashMap};
use std::hash::Hash;
use std::ops::{Add, Sub};
use std::cmp::PartialOrd;

pub fn dijkstra<N, D>(
    edges: impl Iterator<Item=(N, N, D)> + Clone,
    goals: impl Iterator<Item=N>,
) -> HashMap<N, (N, D)>
    where
        D: Add<Output=D> + Sub<Output=D> + PartialOrd + Copy,
        N: Hash + Eq + Copy
{
    //get max distance
    let max_distance = edges.clone().map(|(_, _, d)| d).reduce(|a, b| a + b).unwrap();
    //get nodes
    let mut nodes: HashMap<N, (N, D)> = edges.clone().map(|v| [v.0, v.1].map(|n| (n, (n, max_distance)))).flatten().collect();
    //set goals
    goals.for_each(|ng| nodes.get_mut(&ng).unwrap().1 = max_distance - max_distance);
    //update loop
    while {
        let mut changed = false;
        for (na, nb, d) in edges.clone() {
            let ((_, da), (_, db)) = (nodes.get(&na).unwrap(), nodes.get(&nb).unwrap());
            if *da > (*db + d){
                nodes.insert(na, (nb, *db + d));
                changed = true;
            } else if *db > (*da + d){
                nodes.insert(nb, (na, *da + d));
                changed = true;
            }
        }
        changed
    } {}
    return nodes;
}
```
あなたの御用のためにお使いください。
[TypeScript]interfaceとtypeの違いについて

### interface
```typescript
interface Animal {
  name: string;
  bark(): string;
}
```

* 継承可能
* 継承の際にオーバーライドすると、継承元のプロパティの型が上書きされる
* ただオーバーライドするためには、代入可能な型である必要がある
* 同名を定義すると、同名の定義を全て合成したインターフェースになる

### 型エイリアス
```typescript
type Animal = {
  name: string;
  bark(): string;
};
```

* 継承不可能だが、交差型で同じような表現が可能
* オーバーライドすると、上書きにならず、フィールドの型が交差型で計算される
* 同名のものは複数定義できない


https://typescriptbook.jp/reference/object-oriented/interface/interface-vs-type-alias
C#で一時的にファイルを作成して編集、その後削除する【文字エンコーディング指定あり】

# 経緯

以前、以下の記事でCSVファイル作成処理を紹介したのですが、動作確認を進めたところ、日本語を入力したCSVファイルをExcelアプリで開くと文字化けしました、、

https://qiita.com/moto-na/items/9c6b67d1e468fa783a99

そのため、文字エンコーディングの指定をしつつ、ファイルを作成して編集する方法を、備忘録がてら記事にしておこうと思います。

# 環境

言語：C#
バージョン：.NET Framework 4.8

# 仕様の概要

1. C#のResourcesフォルダの中にsample.csvを作成
1. 中身のデータを書き加えていく
1. 外部にファイルを送信する（この記事では中略）
1. ファイルを削除する

# コード

完成形は以下です。
今回使うのは<code>StreamWriter</code>です。

```csharp
List<string> values = new List<string>()
{
    // ID, 氏名, 誕生日, 性別
    @"""1"",""田中太郎"",""1900/04/01"",""男""",
    @"""2"",""中田花子"",""1900/05/21"",""女""",
    @"""3"",""高橋さとる"",""1900/10/03"",""男""",
}

// 1. C#のResourcesフォルダの中にsample.csvを作成
string filePath = "~/Resources/sample.csv";
string physicalPath = HostingEnvironment.MapPath(@filePath);

// 2. 中身のデータを書き加えていく
using (StreamWriter sw = new StreamWriter(physicalPath, false, System.Text.Encoding.UTF8))
{
    foreach (string item in values)
    {
        sw.WriteLine(item);
    }
}

// 3. 外部にファイルを送信する（この記事では中略）

// 4. ファイルを削除する
File.Delete(physicalPath);
```

StreamWriterを使っている部分以外は以前の記事と変わりないため、その説明は割愛します。

`StreamWriter(physicalPath, false, System.Text.Encoding.UTF8)`について、
第一引数にファイルの物理パスを渡しています。
第二引数では`false`を指定して、同じ名前のファイルが見つかった場合は上書きをするようにしています。
第三引数では文字エンコーディングの指定をしています。

# 参考

https://learn.microsoft.com/ja-jp/dotnet/api/system.io.streamwriter.-ctor?view=net-7.0#system-io-streamwriter-ctor(system-string-system-boolean-system-text-encoding)
ABC329 提出したコードや感想 (言語:Python)

# 記事構成
[1. Atcoder自己紹介](#1-Atcoder自己紹介)
[2. 各問題の感想と提出コード](#2-各問題の感想と提出コード)
[3. 今回の結果想](#3-今回の結果)
[4. 最後に](#4-最後に)

# 1. Atcoder自己紹介
- 茶色🟤コーダー
- 主な使用言語：Python，C++（C++は最近使ってません）
- 一時期休んでたけど最近再開
- 本コンテスト終了時のグラフ↓

![abc329.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564785/53b6b5d3-abfe-e688-6478-5386cd105d7e.png)

# 2. 各問題の感想とコード
## A問題
特にいうこと無し．ABCのAって感じの問題が久しぶりに来た
コードは結構綺麗に書けたんじゃないかな

```python:A問題
s = input()
for char in s:
    print(char, end=' ')
```

## B問題
一回最大値探してからもう一回走査．
2番目引き出す関数あるのかな？
A，B問題用にリスト内のn番目の最大値（最小値）返す関数は作っても良いかも
```python:B問題
n = int(input())
a = list(map(int, input().split()))

maxn = max(a)
second_max = max([x for x in a if x != maxn])

print(second_max)
```

## C問題
2回TLE使っちゃった．
やっぱり事前の点数を元に思考しちゃうの良くないな．
雑に実装すれば解けると思っちゃった
```python:C問題
n=int(input())
s=input()
abc = [0] * 26
count, cx = 1, ord(s[0]) - ord('a')

for i in range(1, len(s)):
    if s[i] == s[i - 1]:
        count += 1
    else:
        abc[cx] = max(abc[cx], count)
        count = 1
        cx = ord(s[i]) - ord('a')

abc[cx] = max(abc[cx], count)

result = sum(abc)

print(result)
```

## D問題
問題解いてるときは，一旦Cを諦めてこっちに移行
正直こっちの方が変に考えることないから楽だった
```python:D問題
def ele(N, M, votes):
    v = [0] * (N + 1)
    c = 0
    results = []

    for i in range(M):
        v[votes[i]] += 1

        if v[votes[i]] > v[c] or (v[votes[i]] == v[c] and votes[i] < c):
            c = votes[i]

        results.append(c)

    return results

n,m = map(int, input().split())

a = list(map(int, input().split()))

result = ele(n, m, a)

for i in result:
    print(i)
```


# 3. 今回の結果
今回はこんな感じ．下がっちゃったね
次回緑行きたいな〜


![スクリーンショット 2023-11-22 0.27.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564785/c14f93f0-2a19-0cfb-d57f-96384910d42a.png)

# 4. 最後に
公式ドキュメントを読む，的な記事を書きたい
【TailwindCSS】カスタムCSSの設定方法

カスタムCSSを追加するには`global.css`などのファイルに記述するか、以下のように`tailwind.config.js`に記述します。
`tailwind.config.js`に記述した場合にはVSCodeで補完が効くようになります。

```js:tailwind.config.js
/** @type {import('tailwindcss').Config} */

const plugin = require('tailwindcss/plugin')

module.exports = {
  // ...
  plugins: [
    plugin(function ({ addBase, addComponents, addUtilities }) {
      addBase({
        'body:has(dialog:modal)': {
          overflow: 'hidden',
        },
      })
      addComponents({
        '.skeleton': {
          '@apply animate-pulse bg-gray-300': {},
        },
      })
      addUtilities({
        '.px-safe': {
          'padding-left': 'env(safe-area-inset-left)',
          'padding-right': 'env(safe-area-inset-right)',
        },
      })
    }),
  ],
}
```

カスタムCSSの優先度は`base` < `components` < `utilities`です。
`base`は`components`で`components`は`utilities`で上書きできます。
How to resolve port conflicts

# What is port conflicts?

A computer has 65,535 ports like doors for communicating, and each port is assigned a number called a port number. When computers communicate with each other, data is exchanged using ports with the same number. The port to be used is determined by the communication method and software. (e.g. Apache uses number 80, and MySQL uses number 3306.)
However, there are some services that use the same number as other services, so if Apache is using a port number 80, this port cannot be used by anything else. This is the state of port conflicts.


# How to check port conflicts

I was using XAMPP when I got port conflicts, so I checked Netstat in XAMPP.

![スクリーンショット 2023-11-21 234041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532286/f234f7e8-8dd0-fc4c-6799-040d48ecfad9.png)

Click on the Port, it is arranged in numerical order.

![スクリーンショット 2023-11-21 234414.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532286/40c77270-425e-6cfe-d135-e2c0fac84f4f.png)

If there is a same number as the service you want to use, you need to terminate the another service that is using the port. Thereby you can use the service you want to use.
[UE5]C++でlevel移動してすぐに関数を呼ぶ

C++でゲーム制作中に、OpenLevelと一緒に他の処理も書く方法に手間取ったから少しまとめていくよ

### 使用ツール
UnrealEngine5.1
Rider 2023.1.2

## 実装について
実装についてはこのデリゲートで行うことが出来たよ。

https://docs.unrealengine.com/4.27/en-US/API/Runtime/CoreUObject/UObject/FCoreUObjectDelegates/FPostLoadMapDelegate/

## 1.C++ファイルの作成
C++のファイルを作っていくよ。まずはGameInstanceSubsystemでクラスを作っていくよ。GameInstanceで作ってもいいと思う。（というか動くなら何でも…）
名前はデフォルトの ”MyGameInstanceSubsystem” のまま進めるよ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/a238c9af-63d7-92a3-a026-daaf72931c22.png)

## 2.実装

```c++:MyGameInstanceSubsystem.h
#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyGameInstanceSubsystem.generated.h"

UCLASS()
class LOADING_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()


	//Level移動
	UFUNCTION(BlueprintCallable)
	void LoadLevel(TSoftObjectPtr<UWorld> World);

	//Level移動後に呼ばれる
	void LoadedEvent(UWorld* LoadedWorld);
	
};
```

```c++:MyGameInstanceSubsystem.cpp
#include "MyGameInstanceSubsystem.h"
#include "Kismet/GameplayStatics.h"

void UMyGameInstanceSubsystem::LoadLevel(TSoftObjectPtr<UWorld> World)
{

	UE_LOG(LogTemp, Warning, TEXT("Start OpenLevel:%p"), World.LoadSynchronous());
 	//Level移動
	UGameplayStatics::OpenLevel(GetWorld(), World.LoadSynchronous()->GetFName());
 	//Level移動後に呼ばれるイベントを登録
	FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject(this, &UMyGameInstanceSubsystem::LoadedEvent);
}

void UMyGameInstanceSubsystem::LoadedEvent(UWorld* LoadedWorld)
{

	//移動先のLevel名をLogに出す
	UE_LOG(LogTemp, Warning, TEXT("LoadedWorld: %s"), *LoadedWorld->GetName());
}

```
簡単に確認できるように`UFUNCTION(BlueprintCallable)`でBPで使えるようにしたよ。
Logに関しても分かりやすいように`Warning`で行っているけど別に変えても大丈夫。

そして`LoadedEvent(UWorld* LoadedWorld)`の`LoadedWorld`には移動後のLevelが入るようになってるよ。引数にこれがないと`FCoreUObjectDelegates::PostLoadMapWithWorld.AddUObject()`で呼んでもエラーになるので注意

## 3.Logで確認してみる
まずはロード用に適当なLevelを準備するよ。作り終わったらBPを組んでいく。
今回プロジェクトはサードパーソンで作っているので、プレイヤーに直で組んでいくよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/6586d6fe-f1f2-ce3b-d610-d38b0086fa85.png)

組み終わったら実際にゲームを起動してみてLogを確認してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818152/be5d28fc-3375-e084-8e15-e16809ac17ea.png)
Levelがロードされた後にちゃんと`LoadedWorld: StageMap`が表示されてるのが分かるね。

## 終わり
めちゃくちゃ完結に書いていったけど、はてなとかでプレイヤーのステータスをセーブしてLevelをロードした後に反映させたりするのとかも時間があれば書くかも。多分だけど…
mix test.watchの紹介

こんにちは！
プログラミング未経験文系出身、Elixirの国に迷い込んだ？！見習いアルケミストのaliceと申します。
今回はmix test.watchについて学んだことをまとめます。

# 目的
mix test.watchの使いどころ、導入方法の紹介。

## 実行環境
Windows 11 ＋ WSL2 ＋ Ubuntu 22.04
Elixir v1.14.3
Erlang v26.0.2
Phoenix v1.7.10

# mix test.watchとは？
Elixirのライブラリ。mix testをソースコードを編集する度に実行してくれます。
ElixirでTDDを実施するために必須のライブラリとも言えます。
↓これを毎回実行してくれる。
```diff_elixir:nov21
mix test
..
Finished in 0.00 seconds (0.00s async, 0.00s sync)
1 test, 1 doctest, 0 failures
```


# 導入方法
公式ドキュメント

https://hexdocs.pm/mix_test_watch/readme.html

下記から画像の通りコピーでもいけます。

https://hex.pm/packages/mix_test_watch

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677280/9072f089-6106-e8b1-81d7-9c66b4f92001.png)

mix.exsに書き込んで、`mix deps.get`します。
```diff_elixir:mix.exs
 defp deps do
    [
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
+     {:mix_test_watch, "~> 1.1"}
    ]
  end
```
```bash:bash
mix deps.get
```

# 使ってみた
## mix test.watchの実行
```bash:bash
mix test.watch
..
Finished in 0.00 seconds (0.00s async, 0.00s sync)
1 test, 1 doctest, 0 failures
```
まずは変更なしの状態。mix testを手動で実行したときと同じ結果です。

## ソースコードを編集してテストを落としてみる
```diff_elixir:lib/nov21.ex
defmodule Nov21 do
  @moduledoc """
  Documentation for `Nov21`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Nov21.hello()
      :world

  """
  def hello do
-    :world
+    :hoge
  end
end
```

```bash:bash
Running tests...
Compiling 1 file (.ex)


  1) test greets the world (Nov21Test)
     test/nov21_test.exs:5
     Assertion with == failed
     code:  assert Nov21.hello() == :world
     left:  :hoge
     right: :world
     stacktrace:
       test/nov21_test.exs:6: (test)



  2) doctest Nov21.hello/0 (1) (Nov21Test)
     test/nov21_test.exs:3
     Doctest failed
     doctest:
       iex> Nov21.hello()
       :world
     code:  Nov21.hello() === :world
     left:  :hoge
     right: :world
     stacktrace:
       lib/nov21.ex:11: Nov21 (module)


Finished in 0.01 seconds (0.00s async, 0.01s sync)
1 test, 1 doctest, 2 failures

Randomized with seed 762138
```
自動でmix testが走り、テストが落ちました！

実際には先にテストを書き、そのテストを満たす最低限の実装をしていくことになります。
つまり、今はレッドの状態ということになります。
(TDDの演習は別記事化します。今回はmix test.watchの紹介までとします)




# ～Elixirの国のご案内～
↓Elixirって何ぞや？と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます:laughing::sparkles::sparkles:

https://qiita.com/piacerex/items/09876caa1e17169ec5e1

↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ！私もエンジニア未経験から学習中です。

https://elixir-lang.info/topics/entry_column


↓[We Are The Alchemists, my friends!:bouquet:](https://qiita.com/torifukukaiou/items/6bcd5bbb80df9e594e9e "Awesome-san's Awesome article")[^10]
Elixirコミュニティは本当に優しくて温かい人たちばかり！
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。[^11]


https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian




[^10]: @torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。


[^11]: @kn339264さんの素敵なスライドをお借りしました。Elixirコミュニティはいろんな形で活動中！