OmniAICreator/Qiita-1.07M huggingface dataset:
Vera&Johnゲーミングプラットフォームの三者分析！

Vera&Johnゲーミングプラットフォームの三者分析！ <a href="https://royalmoon888.com/verajohn%e3%83%99%e3%83%a9%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%ab%e3%82%b8%e3%83%8e%e5%be%b9%e5%ba%95%e8%a7%a3%e8%aa%ac%ef%bd%9c2022-verajohn-casino/">Vera&John</a>プラットフォームの紹介を始める前に、プラットフォームの起源と現在の成果を簡単に紹介しなければなりません。 Vera&Johnは日本のゲーム市場において、多くのプレイヤーから「No.1」のオンラインゲームサイトと呼ばれています！ では、なぜナンバーワンと呼ばれているのでしょうか。 次の分析は非常に重要です。

ポイント1：ゲームの種類が豊富
日本で最も人気のあるプラットフォームとして、もちろんそれには理由があります! 最大 50 の異なるゲーム オペレーターと協力して、プレイヤーはライブ カジノ、オンライン スポーツ、オンライン宝くじ、オンライン スロット マシン、さらには釣りゲームや独自開発のミニゲームをプレイできます! 間違いなく最も多様なゲームプラットフォームの 1 つです!

2点目：ゲーム割引
ゲームの割引は、間違いなく多くのプレイヤーが最も気にかけていることです! 割引が良いかどうかは、古い顧客が将来も遊びに戻ってくることができるかどうかを決定します! Vera&Johnのゲーム割引率は間違いなく業界一！ しかし、それはプロのゲーム運用チームによって設計されています! 豊富なボーナスと同時に条件設定も高すぎない！ プレイヤーが条件を満たしてお金を引き出すことができるようにしましょう! ボーナスが高く条件が高ければ、実はプレイヤーは寂しさしか受けていない！

3点目：サービスチーム
ギャンブルのウェブサイトをプレイするとき、すべてのプレイヤーは多かれ少なかれゲームの問題に遭遇しますが、これらのゲームの問題がすぐに解決できる場合、プレイヤーは遭遇した問題をあまり気にしないと思います! プラットフォームには、英語と日本語のカスタマー サービス担当者がいます。 しかも24時間オンラインサービス！ 現時点で間違いなく最高のチームです！

上記の 3 つのポイントを組み合わせると、Vera&John が現時点で最後の人気プラットフォームとして選ばれる理由が説明できます! 入出金、さらにはオンラインレビューなど、フォローアップでのより関連する紹介については、プレイヤーは RoyalMoon888 プラットフォームで最新の関連情報を確認できます! どなたでもシェア、ご理解いただければ幸いです！
AWS認定クラウドプラクティショナー合格に向けて Day15

 # 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day14](https://qiita.com/Ayako_0224/private/58a9850dd29b07f7388c)

# OSI参照モデル
## アプリケーション層
通信したい内容に応じて、利用するそうで決められた規約に従い通信を実施
この中でアプリケーションごとにプロトコルが細分化
- メールソフトウェア用プロトコル-> POP/SMTP
- WEBブラウザ用プロトコル-> HTTP/HTTPS

## プレゼンテーション層
文字を送受信する時に文字コードや暗号などについて規定

## セッション層
アプリケーション間での一連の通信処理の継続の仕方を規定

## トランスポート層
セッションを開始する際の信頼確立や到着順序や確認などを実施

## ネットワーク層
IPアドレスを利用したルーティング方法を規定

## データリンク層
MACアドレスを利用したノード間通信の方法を規定

## 物理層
ビットによるコンピュータ間の物理的なデータ伝送形式を規定

# ポート番号
通信する出入り口となるのがポート番号でメールボックスのような役割

# セキュリティグループ
インスタンスへのトラフィックのアクセス可否を設定するファイアーウォール機能を提供
- サーバー単位で適用
- インバウンドを設定すればアウトバウンドも許可される
- 許可のみを指定可能
- デフォルトは同じセキュリティグループない通信のみ許可
- すべてのルールを適用

# ネットワークACL
セキュリティグループとは異なりサブネットに対するトラフィック制御を実施
- VPC/サブネット単位で適用
- アウトバウンドの設定も別途必要
- 許可と拒否の指定可能
- デフォルトはすべての通信を許可
- 番号の順序通りに適用

To be continued...
LuaでセキュアなUUIDを生成する

## はじめに

UUIDとは世界中でユニークになるように設計されたIDで、データベースの主キー等によく用いられています。
（UUID以外のユニークなIDについては[こちら](https://qiita.com/okm-uv/items/0b84c75e7524640dab11)！）

RustやRubyといったリッチなプログラミング言語では簡単にセキュアな（衝突しない）UUIDを生成できる関数が提供されています。
しかし、言語によってはそのような関数が提供されておらず、自前で生成する必要があります。
今回はLuaでUUID v4を生成することを考えます。

## いろいろな方法

### シンプルな方法

```lua
local function generateUuid()
  local template ='RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRR'
  return string.gsub(template, '[Rr]', function (c)
    return string.format('%x', (c == 'R') and math.random(0, 0xf) or math.random(8, 0xb))
  end)
end
```

この方法は懸念があります。
それは、`math.random()`が擬似乱数生成器であり、かつ、シード値が与えられていない点です。

一般に、プログラミング言語で関数として提供されている乱数生成器は擬似乱数生成器です。
擬似乱数生成器は、擬似乱数列と呼ばれる「一見乱数列のように見えるが、実際には確定的な計算によって求めている数列」を生成します。

[Lua5.4のリファレンス](https://www.lua.org/manual/5.4/manual.html#pdf-math.random)によると、`math.random()`は xorshiro256** と呼ばれる擬似乱数生成器を使われています。
擬似乱数生成器は同一のシード値が与えられた時はあらゆる環境で同一の乱数列を生成します。
リファレンスによると、`math.random()`はシード値が与えられていない時は
> Lua generates a seed with a weak attempt for randomness.

となっていて、弱い乱数をシード値としている、とだけ記述されており、同一のシード値によって乱数が生成されるリスクがありそうです。

### `/dev/urandom`を使う
```lua
local function secureRand()
  local urandom = assert(io.open('/dev/urandom', 'rb'))
  local res = 0
  for i = 1, 8 do
    local r = urandom:read(1):byte(1)
    res = res * 256 + r
  end
  urandom:close()
  return res
end

local function generateUuid()
  local template ='RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRR'
  return string.gsub(template, '[Rr]', function (c)
    return string.format('%x', (c == 'R') and secureRand() % 16 or 8 + secureRand() % 4)
  end)
end
```

`/dev/urandom`はUnix系OSに組み込まれた**ほとんど**真の乱数生成器です。（詳しい議論はしません。というか、できません。）
Rubyの`SecureRandom.uuid`は`/dev/urandom`を使って実装されています。
`/dev/urandom`を使うことで、他の言語のUUID生成関数と同等のセキュアさになります。

### シード値に`/dev/urandom`を使う
```lua
math.randomseed(secureRand(), secureRand())
local function generateUuid()
  local template ='RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRR'
  return string.gsub(template, '[Rr]', function (c)
    return string.format('%x', (c == 'R') and math.random(0, 0xf) or math.random(8, 0xb))
  end)
end
```

### 生成ごとにシード値に`/dev/urandom`を使う
```lua
local function generateUuid()
  math.randomseed(secureRand(), secureRand())
  local template ='RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRR'
  return string.gsub(template, '[Rr]', function (c)
    return string.format('%x', (c == 'R') and math.random(0, 0xf) or math.random(8, 0xb))
  end)
end
```

これらは、シード値に`/dev/urandom`を、乱数生成に`math.random()`を使うことで、高速でかつ、ある程度セキュアであることを期待しています。
`os.time()`をシード値とするパターンが良く紹介されますが、これは同一秒内だと同一のシード値になり同一のUUIDが生成されてしまうので避けたほうが良いでしょう。

## パフォーマンス

自分の環境で、各手法でUUIDを100000個生成するのにかかった時間は以下のようになりました。

| 手法 | 時間 |
| ---- | ---- |
| シンプルな方法 | 0.721s |
| `/dev/urandom`を使う | 157.124s |
| シード値に`/dev/urandom`を使う | 0.715s |
| 生成ごとにシード値に`/dev/urandom`を使う | 10.297s |

`/dev/urandom`を呼び出す回数が多いほど、パフォーマンスは低下しました。

## まとめ

UUIDを自前で生成する場合は、セキュアさとパフォーマンスを検討する必要があります。
ご意見・ご感想、よろしくお願いします。

## 参考文献

- https://www.lua.org/manual/5.4/manual.html
- https://ja.wikipedia.org/wiki//dev/random
Railsでアプリを新規作成

railsを勉強し始めたばかりなので、忘れないようにメモとして残します。

# バージョン
Ruby：2.7.7
Rails：7.0.4

# 最初に行うこと
ターミナルで以下のプログラムを叩く。
```
rails new アプリ名
```
諸々のインストールが完了したら、`$ cd アプリ名`でフォルダに移動。

# サーバーが動いているか確認する
```
rails server
```
- server("s"と省略しても大丈夫) の後ろに`-b 0.0.0.0` をつけると外部の仮想環境からアクセスできるようになる。

# 必要なgemをインストール
エディタでフォルダを開いたら、Gemfileに必要なgemを書き込み保存する。
まだ記述しただけでインストールは完了していないので、ターミナルで以下のプログラムを叩く。
```
bundle install
```
- bundleのみでも可
<font color="green">
Bundle complete! 19 Gemfile dependencies, 90 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
</font><br>
と表示されたらインストールが完了。

あとは調べながら開発を進めていくだけ！

これから、ログイン機能付きの画像投稿サイトを作りたい。
Unknown encoder 'pcm_s4le'

python の AudioSegment.from_file で `Unknown encoder 'pcm_s4le'` というエラーがでる。

https://stackoverflow.com/questions/67069960/pydub-error-loading-file-unknown-encoder-pcm-s4le

これなんだけど

なので、

```python
from pydub import AudioSegment
import soundfile as sf

filen = 'orig.wav'
fileo = 'converted.wav'

f = sf.SoundFile(filen)
print(f.format, f.subtype, f.endian)

sig, sr = sf.read(filen)
print(sr)

sf.write(fileo, sig, sr, format="wav", subtype='PCM_16')

as = AudioSegment.from_file(fileo, format="wav")
```

として、PCM_16 に変換してやればいい。
無線LANのアクセスポイントをNetBSDとhostapdで構築してみる

[NetBSD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/netbsd) 6日目の記事です。 今日はNetBSDで無線LANのアクセスポイントを構築する手順を紹介しようと思います。
 じつは今回の記事は、他の記事で紹介しているNPF(NetBSD Packet Filter)の話とも関連しています。

## 使用する無線LANデバイス

私の環境では、[TL-WN725N](https://www.tp-link.com/jp/home-networking/adapter/tl-wn725n/)という無線LANデバイスを使用しています。このデバイスは、NetBSDにおいては `urtwn0` として認識されます。

```
[     3.062574] urtwn0 at uhub1 port 2
[     3.062574] urtwn0: Realtek (0x0bda) 802.11n NIC (0x8179), rev 2.00/0.00, addr 4
[     3.202878] urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R, address 54:af:97:68:aa:8b
[     3.202878] urtwn0: 1 rx pipe, 2 tx pipes
```

## /etc/ifconfig.urtwn0の設定

デバイスが `urtwn0` として見えているため、 `/etc/ifconfig.urtwn0` に以下を記述します。この例では、無線LANのネットワークを `172.16.151.0/24` としています。

```sh
172.16.151.1 netmask 255.255.255.0 up
```

## DHCPサーバの設定

無線LANに接続したPCにIPアドレスを自動割り当てできるよう、DHCPサーバの設定を行います。設定は `/etc/dhcpd.conf` に以下のよう内容を記述します。

```
default-lease-time 7200;
max-lease-time 14400;
ddns-update-style none;

group {
  subnet 172.16.151.0 netmask 255.255.255.0 {
    option routers <上位のルータのIPアドレス>;
    option domain-name-servers 172.16.151.1;  # ここではルータにDNSキャッシュサーバの役割も持たせています。
    option domain-name "furandon.net";
    range dynamic-bootp 172.16.151.240 172.16.151.250;
  }
}
```

## アクセスポイントの設定

NetBSDをアクセスポイントとして動作させる場合は、[hostapd](https://en.wikipedia.org/wiki/Hostapd)を使用します。設定は `/etc/hostapd.conf` に記述します。

ポイントは `channel=0` の指定で、これにより無線LANのチャンネルが自動的に選択されます。

```
interface=urtwn0  # 無線LANのデバイスを指定します。
logger_syslog=0
logger_syslog_level=0
logger_stdout=1
logger_stdout_level=1
debug=2
ctrl_interface=/var/run/hostapd
ctrl_interface_group=wheel
# SSID設定。
ssid=「ここでSSIDを設定」 # SSIDを指定します。
country_code=JP
hw_mode=b  # hw_modeの値は、ifconfigの出力から確認する。
channel=0  # channelに0を設定するとチャンネルが自動的に選択される。
wpa=1
wpa_key_mgmt=WPA-PSK
wpa_passphrase=「ここでパスワードを設定」  # WPAのパスワード設定。
auth_algs=1
wpa_pairwise=CCMP
rsn_pairwise=CCMP
wpa_group_rekey=600
wpa_strict_rekey=1
wpa_ptk_rekey=600
eapol_key_index_workaround=7
eap_reauth_period=0
```

## hostapdを起動する

あらかじめDHCPサーバを起動しておき( `/etc/rc.conf` に `dhcpd=YES` を追記しておくとよいでしょう)、以下の手順を実行します。

hostapdの起動後、他のPCから指定したSSIDとパスワードでIPアドレスが取得できることを確認します。
(ここまでで無線LANに接続することはできますが、まだインターネットには接続できません(理由は後述します)。)

```sh
$ sudo ifconfig urtwn0 ssid <SSID>
$ /usr/sbin/hostapd -td /etc/hostapd.conf
```

## まとめ

NetBSDを無線LANのアクセスポイントとして利用するための設定手順を紹介しました。
ただし、上流のネットワーク(インターネットなど)に接続する場合は、アクセスポイントにルータの機能も持たせておく必要があります。これは、別の記事で紹介しているNPF(NetBSD Packet Filter)を利用してルータとして動作するような設定手順を別途紹介する予定です。
これまでの資格受験の情報保障について

# はじめに
聞こえない私はこれまで技術系資格を受験してきた。
その度に情報保障(特別措置)をしてくれたことに感謝しているので、ここにまとめる。

# なぜソフト系資格を受験したのか？
エンジニアにとっては資格は意味ないかもしれない。
しかし、聞こえない私には、ソフト系資格を取得することに大きな意味がある。
会社の用意した研修を十二分に受けられないこともあるし、社内で仕事をもらうとき「聞こえないから知識なんかないだろ？」というひどい偏見を下げることもあるからだ。
そういうこともあって、資格コレクターではないが、多くの資格を意識的に取得してきた。

# 聞こえないエンジニアの情報格差と情報保障
ここでいう情報格差とは、聞こえないエンジニアが感じる壁であり、職場環境によって大きく増減する問題である。
聞こえていれば当たり前のように耳と音声で知識を吸収したり、情報を共有したりすることが、聞こえないエンジニアには困難だ。その結果、Qittaに投稿できるほど優秀な技術を持ち合わせながらも、十分に仕事に活躍できない。

しかし、耳と音声の代りに手話、文字などの手段で情報を提供すれば、聞こえないエンジニアには業界特有の知識を蓄積したり、社内特有の情報を共有したり、周囲の技術力のレベルを確かめたりして、自分自身の技術をたかめながら、チームの一員としてすばらしいものを世に出すことができる。これを情報保障という。

職場環境によって壁が変わるので、情報格差と情報保障は実にさまざまである。

# 資格取得にむけての情報格差
資格の取得は、勉強、受験、資格証明書の受理という流れが一般的であるが、ここでは、資格受験にしぼる。

私自身聞こえないので、資格受験の会場にある情報を完全にあげることはできないが、以下の通りだろう。

* 会場の案内
* 試験前の注意事項の説明
* 試験始めと止めの合図
* トイレや落とし物の連絡
* 試験監督のはげましとねぎらい

この情報は、資格試験の合否に直接的な関係がないが、聞こえないエンジニアには、多くの時間を犠牲にして資格勉強をしてきた成果を十分以上に発揮するためにも必要なものだ。

# 試験会場における情報保障
ここでいう情報保障とは、試験会場での情報格差で得にくい情報を十分に提供することである。資格試験主催団体や会場によっては情報保障が違うこともあるが、私自身がこれまでいただいた支援をひとくくりにまとめる。

* "身体上の障害等に係る特別措置"の申請
    * 受験申込み書に記入覧あり
    * 記入欄がない場合、連絡先のメールアドレスが記載
* 試験会場の案内
    * 特に対応なし
    * 受付は筆談で対応してくれる場合がある 
* 試験会場の設営
    * 一般の方と別室になることが多い 
        * 災害が発生したときの避難支援がしやすいかもしれない 
    * 同室になる場合は一番前の席になることが多い
* 試験前の注意事項の説明
   * レジュメ(1枚にすべての注意事項が記載)
       * 試験監督者が口頭に合わせてペンでなぞる
   * 予め印刷した紙(1枚に1つの注意事項が記載)
       * 補足説明があるとき、手書きで追記することもある 
   * パワポとプロジェクタで投影(1枚に1つの注意事項を表示)
       * プロジェクタの調子が悪くなると緊急に手書きに変わることもある 
* 試験始めと止めの合図
    * 予め印刷した紙
        * 「退室可能の時間」「残り10分前」「残り5分前」「記入をやめてください」など細かく準備 
* トイレや落とし物の連絡
    * 「何かあれば、記入して手をあげてください」と手書きした白紙の用意
* 試験監督のはげましとねぎらい
    * 手書きで書いてくれることが多い

# むすびにかえて
一般のエンジニアや技術者、科学愛好者などには馴染みのない情報格差と情報保障の話をする際に、まずは定義を書かねばならず、長々になってしまった。
Qittaの愛読者に入社試験、社内昇格試験、社内認定資格試験などを担当する社員がおられるかもしれない。聞こえない技術者に試験を実施するときに、本記事を参考にして受験者と相談してくれればありがたいことである。
かわいい猫ギャラリー作成

# Reactでかわいい猫ギャラリー作成
Reactで猫ギャラリーとか作って公開したいと思い、作成しました。
ちょっと猫の画像の表示までが遅いです。。




[ソースコード]
https://github.com/saisai-web/NekoGallery
[公開GitHub Pages]
https://saisai-web.github.io/NekoGallery/

犬ギャラリーを見た際に、自分も違う技術内容で同じようなものを作りたいと思い作成しました。
https://zenn.dev/likr/articles/6be53ca64f29aa035f07

github PagesでReactを公開する方法は下記URLです。
組み合わせると、猫ギャラリーを表示できます。

https://qiita.com/sousai/items/632eec7f0c6f981bc270

# 前提条件
・MacOS
・GitHubアカウント作成済み
・NodeJSインストール済み
・Bootstrapの知識
・Reactの知識

# ソースコード
https://github.com/saisai-web/NekoGallery/tree/main

mainブランチにソースコード記載。
Smart Maps 暫定ロゴにある worse is better って何だ

# はじめに
[UN Open GIS Initiative DWG7 on Smart Maps](https://github.com/unopengis/7) の暫定ロゴを作りました。

## 正方形タイル型
![dwg7-provisional-logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/2ffbb124-2951-02e8-fc3b-9806d725898f.jpeg)

## Social Preview Image 用
![dwg7-provisional-social-preview-image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102082/21644937-8824-3e51-39b1-6721ba168194.jpeg)

# worse is better って何だ
暫定ロゴなので、かなり雑なものではありますが、最小限のものを作り、それを育てていくというアプローチでいきます。

この観点から、ロゴの下にモットーとして **worse is better** と書きました。このフレーズの意味は、エントリ末尾の参考文献をベースにさせていただければ、次のようなところです。

- **最小限**のものを作ることからスタートをさせ、必要に応じてそれを育てていく
- インタフェースと実装の両面が**シンプル**であることが、システムにおける他のいかなる特性よりも重視される。
  - 優先度の低い特性の例としては、正確さ、堅牢さ、完全さ
- New Jersey style
- dynamics of software **acceptance**
- less functionality (worse) is a preferable option (better) in terms of **practicality** and **usability**.
- software that is limited, but **simple to use**, may be more appealing to the user and market than the reverse.

もう少し素直に要件すれば、 **keep it simple** ということなのだろうと思いますが、モットーとしてのパンチの強さを考慮して **worse is better** としました。

worse is better に興味が湧いた方は、[The UNIX-HATERS Handbook](https://web.mit.edu/~simsong/www/ugh.pdf)　(PDF 3.5MB) などを紐解かれると良いのだと思います。このハンドブックの Part 4 の C に worse is better の解説が入っています。

## 参考文献
- [lifehacker: UNIX哲学に学ぶ、「より悪いことは、より良いことだ」?!](https://www.lifehacker.jp/article/100212worse_is_better/)
- [Wikipedia: UNIX哲学#より悪いことは、より良いことだ（Worse is better）](https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6#.E3.82.88.E3.82.8A.E6.82.AA.E3.81.84.E3.81.93.E3.81.A8.E3.81.AF.E3.80.81.E3.82.88.E3.82.8A.E8.89.AF.E3.81.84.E3.81.93.E3.81.A8.E3.81.A0.EF.BC.88Worse_is_better.EF.BC.89)
AWS認定クラウドプラクティショナー合格に向けて Day14

 # 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day13](https://qiita.com/Ayako_0224/private/e44d4b8b01d44d236f23)

# VPCとのオンプレ接続
２種類ある
- VPN接続
- Direct Connect(専用線接続)

VPNのほうが安く早いが、Direct Connectのほうが信頼性や品質が良いとされている

## Direct Connect
お客様のデータセンターやオフィスを専用線などを介してAWSへプライベートに接続するサービス
- 安価なアウトバウンドトラフィック料金
- ネットワーク信頼性の向上
- ネットワーク帯域幅の向上

などがメリットとしてあげられる

### Direct Connect Gateway
これにより、同一アカウントに所属する複数リージョンの複数AZから複数リージョンの複数VPCに接続することが可能になる

## VPCエンドポイント
VPCエンドポイントはグローバルIPを持つAWSサービスに対してVPC内から直接アクセスするための出口
２種類の接続形式がある
- Gateway型(基本無料)
- PrivateLink型(有料)

### Gateway型
サブネットに特殊なルーティングを設定しVPN内部から直接外のサービスと通信する

### PrivateLink型
サブネットにエンドポイント用のプライベートIPアドレスを生成し、DNSが名前解決でルーティングする

## VPC Flow Logs
ネットワークトラフィックを取得しCloudWatchでモニタリングできるようにする機能

## VPC Peering
2つのVPC間でのトラフィックルーティングを可能にする機能
異なるアカウントやリージョンでも可能

次の記事は➡︎[AWS認定クラウドプラクティショナー合格に向けて Day15](https://qiita.com/Ayako_0224/private/c583390b8c99df544c1a)
Rustを勉強する part2【変数・型・関数】

# 記事について
次のTour of Rustを用いて学んだ内容のメモになります。

https://tourofrust.com/

# 変数
変数の宣言は、`let`キーワードを使用する。
値を割り当てるとき、Rustではほとんどの場合で型を推論できる。
推論できない場合は、宣言時に型を明示する必要がある。
Rustの変数の命名規則は、`snake_case`を使用する。

```Rust
fn main() {
    // x の型を推論
    let x = 13;
    println!("{}", x);

    // x の型を指定
    let x: f64 = 3.14159;
    println!("{}", x);

    // 宣言の後で初期化（あまり使われません）
    let x;
    x = 0;
    println!("{}", x);
}
```
### シャドウイング
同じ変数名に複数回値を割り当てることを変数のシャドウイングといい、その変数の型が変更され同じ名前で参照できる

# 変数の変更
Rustは変数の変更にとても配慮しており、変数は次の2つに分類される。
* 可変値：コンパイラが変数のRead・Writeを許可する
* 不変値：コンパイラが変数のReadのみを許可する

可変値は`mut`キーワードで示す。
```Rust
fn main() {
    let mut x = 42;
    println!("{}", x);
    x = 13;
    println!("{}", x);
}
```

# 基本的な型
* ブール型：`bool`はtrue/falseを表す
* 符号なし整数型：`u8`,`u32`,`u64`,`u128`は正の整数を表す
* 符号付き整数型：`i8`,`i32`,`i64`,`i128`は正と負の整数を示す
* ポインタサイズ整数型：`usize`,`isize`はメモリ内のインデックスとサイズを表す
* タプル型：`(value, value, ...)`で表し、固定サイズ値の組を渡すために用いる
* 配列型：コンパイル時に長さが決まる同じ型の要素のコレクション
* スライス型：実行時に長さが決まる同じ型の要素のコレクkション
* 文字列スライス：`str`は実行時に長さが決まるテキスト

数値型は値の最後に型を付けることで明示的に指定できる。

```rust
fn main() {
    let x = 12; // デフォルトでは i32
    let a = 12u8;
    let b = 4.3; // デフォルトでは f64
    let c = 4.3f32;
    let bv = true;
    let t = (13, false);
    let sentence = "hello world!";
    println!(
        "{} {} {} {} {} {} {} {}",
        x, a, b, c, bv, t.0, t.1, sentence
    );
}
```

# 型の変換
Rustでは、同じ数値の型を扱う場合でも型が明示される必要がある。
明示せず、`u8`,`u32`等を混ぜるとエラーとなる。
数値型の変換は、`as`キーワードを用いることで簡単に行える。

```rust
fn main() {
    let a = 13u8;
    let b = 7u32;
    let c = a as u32 + b;
    println!("{}", c);

    let t = true;
    println!("{}", t as u8);
}
```

# 定数
定数は、変数のように値が使われる場所でコピーされるのではなく、コンパイル時に値が使われる場所の識別子を直接値に置き換える。
定数の命名規則は、`SCREAMING_SNAKE_CASE`を使用する。
```rust
const PI: f32 = 3.14159;

fn main() {
    println!(
        "ゼロからアップル {} を作るには、まず宇宙を創造する必要があります。",
        PI
    );
}
```

# 配列
配列は、要素の型がすべて同じ型の固定長コレクションである。
配列の型は`[T;N]`で表し、`T`は要素の型、`N`はコンパイル時に定める固定長である。
要素を扱うには、`[x]`演算子を用い、`x`は`usize`型のインデックスである。

```rust
fn main() {
    let nums: [i32; 3] = [1, 2, 3];
    println!("{:?}", nums);
    println!("{}", nums[1]);
}
```

# 関数
関数は0個以上の引数があり、次の例では`i32`型の引数を2つとります。
関数名には`snake_case`を使用する。
```rust
fn add(x: i32, y: i32) -> i32 {
    return x + y;
}

fn main() {
    println!("{}", add(42, 13));
}
```
### 関数の戻り値
値を**タプル**で返すことで複数の戻り値を返せる。
タプルの要素はインデックスで参照できる。
```rust
fn swap(x: i32, y: i32) -> (i32, i32) {
    return (y, x);
}

fn main() {
    // 戻り値をタプルで返す
    let result = swap(123, 321);
    println!("{} {}", result.0, result.1);

    // タプルを2つの変数に分解
    let (a, b) = swap(result.0, result.1);
    println!("{} {}", a, b);
}
```
### 空の戻り値
戻り値の硬いが指定されていない場合、unitと呼ばれる空のタプルを返します。
空のタプルは`()`と表記する。
```rust
fn make_nothing() -> () {
    return ();
		// 戻り値は () と明示
}

fn make_nothing2() {
    // この関数は戻り値が指定されないため () を返す
		// 戻り値は () と推論
}

fn main() {
    let a = make_nothing();
    let b = make_nothing2();

    // 空を表示するのは難しいので、
    // a と b のデバッグ文字列を表示
    println!("a の値: {:?}", a);
    println!("b の値: {:?}", b);
}
```
# まとめ
変数の値のサイズ、変更の可否、計算を確実性を重視した言語設計になっている。
【MAUI】 InitializeComponentは存在しません

**初めに**
最近スマホアプリを開発したくてMAUIを使い始めました！
ももかです💓🍑
しかし、MAUIは新しいプラットフォームで日本語の記事が少ない😢
この記事ではMAUIでInitializeComponentでエラーが出た時の解決法を紹介します！

**対象の現象**
MAUIでcontentPageを追加して、エラー発生
”InitializeComponentは現在のコンテキスト内に存在しません”
というエラーがでる。

**ズバリ！解決法**
ググると出てくる(※下に書いてあります)をやってみてダメだったら、
①先ずは”ビルドアクション”を確認しましょう。
拡張子が.xamlのファイルはMauiXaml
.xaml.csのファイルはC#コンパイラ
にします。

▼ビルドアクションの確認の仕方
ソリューションエクスプローラー>対象のファイルを右クリック>プロパティ>ビルドアクション

②Usingをコメントアウトする。
③ググると出てくる(※下に書いてあります)の（3）をやる
④アンドロイドシュミレーターを”出荷時の状況”にする。
⑤リビルド

②～⑤はInitializeComponentのエラーには直接関係ありませんが、やるとうまくいった！

**結果**
ビルドアクションがデフォルト設定だとうまくいかない。

**ググると出てくる**
１）.xamlと.xaml.csのクラス名が一致していることを確かめる。
以下の様に.xamlという名前のファイルのx:Class=と
.xaml.csのクラス名を一致させましょう。
また、namespaceも一致する必要があるので、ご注意ください。
（自分はMainPage.xamlのContentPageをコピペして貼り付けた後にクラス名だけ変えるとうまくいきました。）



```xml:MainPage.xaml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TEST.MainPage">
```
以下のコード：MainPage.xaml.cs
```c#:MainPage.xaml.cs
namespace TEST;
public partial class MainPage : ContentPage
{
	public MainPage()
	{
		InitializeComponent();
	}
}
```
2）InitializeComponent();を一度コメントアウトしてビルドしてから、コメントアウトを外してもう一度ビルドする。

3)binファイルとobjファイルを削除し、リビルド。その後visual stdio再起動。


参考：
https://www.binarydevelop.com/article/initializecomponent-19114
http://www.kanazawa-net.ne.jp/~pmansato/wpf/wpf_resource.htm
https://osakanav.com/initializecomponent-c-error
https://qiita.com/nambara/items/d7fbec1a8f4513a12e35
https://www.binarydevelop.com/article/initializecomponent-19114
https://qiita.com/shuhey/items/b7cdd090fcb3372813dc
https://stackoverflow.com/questions/145752/what-are-the-various-build-action-settings-in-visual-studio-project-properties
https://qastack.jp/programming/145752/what-are-the-various-build-action-settings-in-visual-studio-project-properties
https://ufcpp.net/study/dotnet/wpf_xamlbasic.html
以下は特に参考にさせて頂きました。
https://blog.goo.ne.jp/pianyi/e/b529957ae57b6851d574a418ff687ed2
http://m0kichiazuma416.blog.fc2.com/blog-entry-70.html
https://stackoverflow.com/questions/68046917/new-net-maui-app-project-throws-the-name-initializecomponent-does-not-exist
ICONIXプロセスの理念を理解する（実践編）

## 前書き

本記事では、ICONIXプロセスの理念を踏まえ、改良を加えながら実践している内容を記述します。

メンバー層とマネージャー層、それぞれの視点におけて実践したこと、および、今も引き続き実践している内容になります。

## 基本の考え

以下を基本の考えとして、実践しています。

### ◇ ユースケース図を作成する

- 要件を図で見える化し、システム境界を明確にする

### ◇ 詳細設計の成果物は作成しない（シーケンス図、クラス図など）

- 作成しても良いが、残す成果物とはしない

### ◇ 画面遷移図を作成する

- UMLの状態遷移図で表現する

### ◇ ロバストネス図を作成する

- ロバストネス図でユースケースと実装を紐付ける
- ロバストネス図を見れば、おおよその要件、および実装がわかる
- 結合テスト項目を抽出できる粒度で書く
- ロバストネス図を設計図としてコーディングする

### ◇ しっかり設計を行えば、実装は容易に完了する

- 品質が良いコードが書ける
- 長期的に見て、大幅なコスト削減になる
- 品質が良いので不具合が発生しにくい
- 不具合や変更が発生しても対応が容易になる
- 新規メンバーが参入した時のコストが少なく済む

## メンバー層で実践したこと

時期的なこともあり、メンバーとして参画したプロジェクトは、どちらかと言えばウォーターフォール的な進め方が主でした。
取り入れたことによって、過分な時間を要してしまうことは許容されません。

**そのような環境下でも充分な成果を出す** ことを目標に掲げ、改良を加えていきました。
タスクの中で **要件分析、予備設計、実装・テストを繰り返し** 、完成させていきました。

### ◇ アジャイルを取り入れていない現場でも導入する

- ウォーターフォール開発であっても取り入れられる
- 個人レベルで導入が可能

### ◇ 自身のタスクの中でイテレーションする

- 要件分析←→予備設計←→実装・テスト

![no_1093_3-1-e1611654476638.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91620/62fb44ca-ec4e-6b9a-8eee-9738e00bd537.png)

### ◇ ユースケース図を作成し、おおよその予備設計（ロバストネス図）ができた時点で実装を開始する

- しっかりと要件を分析することで、実装は容易になる

### ◇ 実装を進めて出てきた点を、ロバストネス図、ユースケース図にフィードバックする

- フィードバックを細かく繰り返すことで、システム化の実現性 および、 要件の確実性を高めていく

### ◇ ロバストネス図をインプットとして、結合テスト項目を抽出・検証する

- 要件と実装が乖離していないことを確認する

## マネージャー層で実践したこと

メンバーの時にやっていたことをチームのメンバーにやってもらうため、まず **全機能のざっくりとした図を作成** して展開しました。

実装をフィードバックさせるロバストネス図の更新はメンバーに依頼し、それ以外の図へのフィードバックは、プロジェクトマネージャーである私が行いました。

**ロバストネス図** を起点として、 **上流工程と下流工程の成果物を検証** していき、 **実装フェーズで検出した課題を素早く解決** させていきました。

**図によって実装を見える化** していることで、 **要件の確認** も簡単に行うことができました。

### ◇ 要件定義からユースケース図を作成する

- 要件を把握している人物（プロジェクトマネージャー等）が作成した

### ◇ 画面遷移図、ワイヤーフレームを作成する

- サンプリング対象のアプリを参考にした

### ◇ ざっくりとしたロバストネス図を作成する

- 書き方の粒度を合わせる意図も含む

### ◇ ユースケース図、ロバストネス図で顧客と合意を取る

- 図の見方を伝えることで、円滑に認識をあわせることができた

### ◇ 実装しながらロバストネス図を更新していく旨をメンバーに依頼する

- ロバストネス図の更新はメンバーに任せる

### ◇ ロバストネス図をインプットとして、結合テスト項目を抽出・検証する旨をメンバーに依頼する

- 要件と実装が乖離していないことを担当者が確認できる

![no_1093_2-1-972x770.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91620/aff25862-aeca-0787-7814-c6c4bf7325d9.png)

![no_1093_3-1-1-1401x1536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91620/1b272076-e096-013a-e919-9f65db4eb221.png)

## 実践によって生じた成果

実践によって、以下の成果を実感しました。
いずれも、 **ソフトウェア開発を成功させるために必要不可欠なこと** だと思います。

### ◇ 要件把握

- **図を書いて見える化する** ことにより、 **要件を正しく把握できているかを分析する** ことができた
- **書いた図を元に顧客と話しをする** ことで、 **容易に顧客と認識を合わせる** ができた

### ◇ 品質向上

- **必要な設計を行った上でコードを書く** ため、 **システムの品質が向上** した
- **要件からテストまでが乖離せず一貫している** ため、 **要件から外れた実装になることを防ぐ** ことができた

### ◇ 情報共有

- **コーディング知識を持っていなくても図で内容を理解できる** ため、 **容易に情報を共有する** ことができた

## あとがき

ICONIXプロセスは、 **ウォーターフォール開発のようにかっちりと工程を進めることに違和感を感じている** が、かと言って、 **アジャイル開発のようにスプリントで区切って進めてもなかなか上手くいかない** 、と言うケースに向いている手法だと考えます。

例えば、新規サービスを一から作り上げていく、 **不確実性の大きいプロジェクト** など。

個人的主観としては、 **ウォーターフォール開発とアジャイル開発のハイブリッド** であり、 **いいとこ取り** をする印象です。
特に理念については、「 **これが正解だと自信を持って言える** 」と思っています。

実践にあるように、個人レベルでの導入も可能です。
ぜひ一度、取り入れてみてはいかがでしょうか。
【Laravel Sail】VSCode でコンテナ内の PHP を指定する

# この記事の目的

Laravel Sail でインストールした Laravel プロジェクト内の PHP ファイルを VSCode で開いた時に表示される警告（以下の画像）を消したい。

![2022-12-10 11.45のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398732/faf57c75-c3c7-8469-c92d-86728095341f.jpeg)

# 環境

- Macbook Air
    - チップ : Apple M2
    - macOS : Ventura 13.0.1

# 前提条件

[公式ページ](https://readouble.com/laravel/9.x/ja/installation.html)のインストールガイドを参考に Sail を利用した Laravel アプリケーションのインストールが完了していること。

```bash
$ sail php -v

PHP 8.1.13 (cli) (built: Nov 26 2022 14:07:55) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans
```

```bash
$ sail artisan --version

Laravel Framework 9.42.2
```

本記事におけるプロジェクトのディレクトリ構造は以下の通り。
VSCode は `project-root` を開くものとする。

```text
project-root/
└── my-laravel
    ├── app
    ├── bootstrap
    ├── config
    ├── database
    └── ...
```

# 下準備

1… `sail php -v` が動作することを確認

```bash
# 事前に sail up コマンドでコンテナを起動させておくこと。

$ sail php -v

PHP 8.1.13 (cli) (built: Nov 26 2022 14:07:55) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans
```
2… `sail php` コマンドを実行するファイルを作成

本記事では `project-root/` 直下に `.vscode/bin/` を作成し、その中に `php` という名前で実行ファイルを作成した。

```textproject-root/
project-root/
├── .vscode
│   └── bin
│       └── php  ★作成したファイル★
└── my-laravel
    ├── app
    ├── bootstrap
    ├── config
    ├── database
    └── ...
```  

```bash
#!/bin/bash

SCRIPT_DIR=$(cd $(dirname $0); pwd)

cd ${SCRIPT_DIR}/../../my-laravel
./vendor/bin/sail php "$@"
```

実行権限を付与して実行してみる。

```bash
$ chmod +x .vscode/bin/php
$ .vscode/bin/php -v

PHP 8.1.13 (cli) (built: Nov 26 2022 14:07:55) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.13, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.13, Copyright (c), by Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans
```

# いざ設定

VSCode で `⌘ + ,` と入力し設定を開き `php.validate.executablePath` と検索。
設定の適用範囲は「ワークスペース」を選択しているが、自身の環境に応じて「ユーザー」を選択するのも可。

![スクリーンショット 2022-12-10 12.23.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398732/a826f16a-9785-763d-8dc8-e0dc9a03ce55.png)

`setting.json で編集` を選択して、以下の内容を記載して保存。

```json
{
    "php.validate.executablePath": ".vscode/bin/php",
}
```

再度 PHP ファイルを開き、最初に表示されていた警告が表示されなくなることを確認。
switchとブロック文

# はじめに

突然ですが、以下のコードのどこに誤りがあるでしょうか？

```C++:switch.cpp
#include <iostream>
using namespace std;

int main() {
    bool f = somefunc();
    switch (f) {
    case true:
        int res = somefunc1();
        cout << res << endl;
        break;
    case false:
        float res = somefunc2();
        cout << res << endl;
        break;
    }
}
```

<details><summary><b><font color="ForestGreen">答え</font></b></summary><div>

プログラムを実行すると以下のようなエラーが出ます。

```
switch.cpp: In function 'int main()':
switch.cpp:10:10: error: jump to case label
   10 |     case false:
      |          ^~~~~
switch.cpp:8:13: note:   crosses initialization of 'int res'
    8 |         int res = somefunc1();
      |             ^~~
switch.cpp:11:15: error: conflicting declaration 'float res'
   11 |         float res = somefunc2();
      |               ^~~
switch.cpp:8:13: note: previous declaration as 'int res'
    8 |         int res = somefunc1();
      |             ^~~
```
簡単に言うと、変数`res`が重複して宣言されています、ということですね。

</div></details>

# なぜこんなことになるのか

C++のswitch文の仕様として、breakしない限りマッチしたcaseの後続のcaseブロックまでも実行される、というものがあります。これは、「フォールスルー(fall through)」と呼ばれるものです。

以下のプログラムをご覧ください。

```C++:badswitch.cpp
#include <iostream>
using namespace std;

int num = 0;

int main() {
    switch (num) {
    case 0:
        cout << "0" << endl;
    case 1:
        cout << "1" << endl;
    case 2:
        cout << "2" << endl;
    default:
        cout << "default" << endl;
    }
}
```

このプログラムを実行すると、
```
$ ./badswitch
0
1
2
default
```
case 0以下の全処理が実行されてしまいました。意図して書く場合は便利なものではありますが、バグの温床になることの方が多い気がします。

さて、本題に戻ると、フォールスルーという仕様があって複数のcaseブロックが実行される可能性があるために、caseの中で重複して変数を宣言することができないわけです。res、tmpなどの一時的にしか使わない変数名に対してres_intなどとするのは馬鹿馬鹿しいですね。


# 解決策

#### プログラム


```C++:switch.cpp
#include <iostream>
using namespace std;

int main() {
    bool f = somefunc();
    switch (f) {
        case true: {
            int res = somefunc1();
            cout << res << endl;
            break;
        } case false: {
            float res = somefunc2();
            cout << res << endl;
            break;
        }
    }
}
```
各caseブロックを、{}で挟んでしまえば解決です。

#### 余談

"{"や"}"が縦に2つ並ぶのは気持ち悪いのでcaseブロックをインデントしましたが、こうすると全体で2インデントされることになって無駄に深くなってしまうのが難点ですね。

# ブロック文のお話

実は、C++では、{}で挟むことで、どこにでも新たなスコープを作り出すことができます。これは「ブロック文」と呼ばれます。

```C++:sample.cpp
int main() {
    int x;
    {
        int tmp = somefunc1();
        x = somefunc2(tmp);
    }
    float y;
    {
        float tmp = somefunc3();
        y = somefunc4(tmp);
    }
}
```
こんなことだってできます。
これにより、

- 変数の使いまわしができるようになる
- 変数の有効範囲が制限されて可読性が上がる

等、複数のメリットがあります。

先ほどのswitch文では、これを適用したに過ぎないわけです。

# まとめ

ブロック文は便利！！
AWS EC2インスタンスからSlackに通知を送る方法

皆様こんにちは。

この記事は ハンズラボ [AdventCalendar2022](https://qiita.com/advent-calendar/2022/handslab) 11日目です！

宜しくお願い致します。

# はじめに

最近システム開発をする上で監視システムの重要性を改めて痛感する今日このごろですが、
今回は監視システムを入れるほどではないけどエラーをSlackに通知したい！
そんな需要がたまにあったりするので今回はぱっと調べた限りの手法を紹介できればと思います。

# 前提

今回の手法では全てSlackのWebhook URLが必要になります。
事前にSlack App等で取得をお願いします！

# EC2 → Lambda → Slack編

Lambda Pythonコード

```
import urllib3
import json
http = urllib3.PoolManager()

def lambda_handler(event, context):
    url = "Webhook URL"
    msg = {
        "text": event.get('message'),
    }
    encoded_msg = json.dumps(msg).encode('utf-8')
    http.request('POST', url, body=encoded_msg)
```

AWS CLI実行

```
aws lambda invoke --function-name <Lambda Name> --payload '{ "message": "TEST MESSAGE" }' response.json
```

※ EC2にLambdaを実行する権限は予め設定をお願いします。

# EC2 → Slack編

### Python3

事前導入パッケージ
* Python3
* pip3

※今回はAL２を利用しているのでPython3系が入っているのでそれをそのまま利用

```
pip3 install slackweb
```

```
import slackweb

slack = slackweb.Slack(url="Webhook URL")
slack.notify(text="Test Notification")
```

### シェルスクリプト

```
#　/usr/bin/bash

WEBHOOK_URL="Webhook URL"
MESSAGE="Test Notification"
FORM="{\"text\": \"$MESSAGE\"}"
curl -X POST -H 'Content-type: application/json' --data "${FORM}" "${WEBHOOK_URL}" > /dev/null
```

# さいごに

当初はEC2→SNS→Chatbotを利用した方法も検討していたのですが、こちらは通知元のサービスが限定されているなど制約も多かったので、
オーソドックスであろう３つの手法について書かせて頂きました。
意外と通知方法は悩むことが多いのでこのような記事ではありますが、皆様のお役にたてば幸いです。
`#coerce` を refinements で追加してもうまく使われない

`1 + nil` などがエラーでなく `nil` を返すようにしたかったが、 refinements で `NilClass#coerce` を生やす方法はうまくいかなかった。たぶん refinements の有効範囲的に仕方ない？

## 試したコード
Ruby の数値クラスの二項演算は、レシーバー（演算子の左側）の知らないクラスが相手（演算子の右側、第1引数）である場合、相手の `#coerce` を呼び出して**クラスを変換してもらう**仕組みになっている。それにより、**相手のクラスに二項演算を任せる**ことができる。

https://docs.ruby-lang.org/ja/3.1/method/Numeric/i/coerce.html

というわけで、二項演算で右側を `nil` にしたいなら、数値クラスは触らず **`nil` のほうに変換と二項演算を定義**すればいい。ひとまず `+` と `-` （とついでに単項演算）に対応させてみた。

```ruby
module NullableOperators
  refine NilClass do
    def coerce(other)
      [nil, self]  # 注： <=> については考慮していない
    end

    %i[+@ -@ + -].each do |name|
      define_method(name) { |*| nil }
    end
  end
end
```

しかし使ってみると、レシーバーが `nil` のとき（ `nil + 1` など）はうまくいくが、逆のときはエラーになってしまった。

```ruby
using NullableOperators

nil + 1  #=> nil
-nil     #=> nil
nil.coerce(1)  #=> [nil, nil]

1 + nil  # nil can't be coerced into Integer (TypeError)
```

## 原因
公式ドキュメントの refinements の説明を見てみると、スコープについて書いてあった。

https://ruby-doc.org/3.1.2/syntax/refinements_rdoc.html#label-Scope

> Refinements are lexical in scope. Refinements are only active within a scope after the call to `using`. Any code before the `using` statement will not have the refinement activated.
>
> When control is transferred outside the scope, the refinement is deactivated. This means that if you require or load a file or call a method that is defined outside the current scope the refinement will be deactivated:
>
> ```
> （コード例）
> ```

`using` の有効な範囲はコードの構造で決まり（静的スコープ）、他のファイル内のコードや `using` より前に定義されたメソッド内では、たとえ `using` 実行後に呼び出したとしても refinements が無効となる。組み込みの数値クラスの二項演算は明らかに別の場所で定義されているので、 refinements の効果が及ばないということになる。

## 代案
refinements を使う限りは、 `#coerce` の仕組みを使わずやるしかなさそう。

### 数値クラスも refine する
`#coerce` を呼ばないよう、使う予定の数値クラスの二項演算を改造する。メソッド内で `super` を呼べば、 refine 前のメソッドを呼び出せる[^refine-include]。

[^refine-include]: refine の中でモジュールを include している場合は、モジュールのメソッドが優先される。

```ruby
module NullableOperators
  unary = %i[+@ -@]
  binary = %i[+ -]

  refine NilClass do
    unary.each do |name|
      define_method(name) { nil }
    end

    binary.each do |name|
      define_method(name) { |_| nil }
    end
  end

  [Integer, Rational, Float, Complex].each do |klass|
    refine klass do
      binary.each do |name|
        define_method(name) { |other| other.nil? ? nil : super(other) }
      end
    end
  end
end
```

```ruby
using NullableOperators

nil + 1  #=> nil
-nil     #=> nil

1 + nil  #=> nil
1 + 2.0  #=> 3.0
```

### NaN で済ませる
今回の場合はただ「他の数値と演算しても変化しない」ものが欲しかったので、 `nil` にこだわらなければ浮動小数点数の特別な値 [NaN](https://ja.wikipedia.org/wiki/NaN) （ `Float::NAN` など）が使える。元々ある仕組みなので refinements も何も必要ない。

NaN には種類があるとか、 NaN 同士の等値性判定が偽になるとか、 `nil` とは異なる面もあるので細かいところは注意がいる。

```ruby
nan = Float::NAN

nan + 1  #=> NaN
-nan     #=> NaN ※符号はマイナス
nan.coerce(1)  #=> [1.0, NaN]

1 + nan  #=> NaN
```
CSSの擬似クラスと擬似要素

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 11日目です。

擬似クラスと疑似要素のことです。

## よく使いそうな擬似クラス

### 便利そう

- :not() - 当てはまらないとき。よく使う
- :has() - ()の中のものを持つ
- :is() - ()の中のいずれかに当てはまる。引数内で最も詳細度の高いセレクターの詳細度
- :where() - ()の中のいずれかに当てはまる。詳細度は0
- :lang() - ()の中の言語に当てはまる。
- :target - URLのフラグメントに一致するidを持つ要素

### リンクやボタン

- :hover - カーソルがあたっているとき
- :active - クリックした直後
- :focus - フォーカスしたとき
- :focus-visible - ユーザーエージェントの動作によってフォーカスしたりしなかったりする
    - （主にキーボードでのフォーカスに反応するがマウスでは反応しないっぽい）
- :focus-within - 子孫要素にフォーカスがある場合

### 入力系

- :autofill
- :enabled
- :disabled
- :read-only
- :read-write
- :placeholder-shown
- :default
- :checked
- :indeterminate
- :blank
- :valid
- :invalid
- :in-range
- :out-of-range
- :required
- :optional
- :user-invalid

### ツリー構造

- ：root
    - 文書のルート（基本はHTML）
- :empty
    - ホワイトスペース以外に子がない要素
- :first-child / :last-child / :only-child
    - 兄弟のうちの最初の要素、最後の要素、要素内に兄弟がない場合
- :nth-child / :nth-last-child
    - 個数
- :first-of-type / :last-of-type / :only-of-type
    - 兄弟のうち、最初の特定の型、最後の特定の型、兄弟要素がない要素
- :nth-of-type / :nth-last-of-type
    - 個数


ほかは以下
https://developer.mozilla.org/ja/docs/Web/CSS/Pseudo-classes

## よく使いそうな疑似要素

- ::before (:before) - コンテンツのまえ
- ::after (:after) - コンテンツのあと
- ::first-letter (:first-letter) - ひともじめ
- ::first-line (:first-line) - いちぎょうめ
- ::marker - リストの装飾
- ::placeholder - inputやtextarea内が空のときのテキストのスタイル
- ::selection - 選択時のスタイル

ほかは以下
https://developer.mozilla.org/ja/docs/Web/CSS/Pseudo-elements


## ::beforeと::after

- インライン
- 二重コロンはCSS3での書き方。
    - :hover のような擬似クラスと区別するために導入された。
    - :before、:after のようにコロン一つでもOK（これはCSS2での書き方）
- よくある使い方
    - content プロパティを使用して、要素に装飾的な内容を追加する
- select 要素には疑似要素を作れない

## サンプル

```html
<p>Paragraph</p>
```

```css
p::before, p::after {
  font-weight: bold;
  font-size: 50%;
  padding: 1em;
}
p::before {
  content: 'before';
}

p::after {
  content: 'after';
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41088/f3aefdc4-3a3b-4597-3c13-79eaa647a249.png)


### 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/::before
- https://developer.mozilla.org/ja/docs/Web/CSS/::after
AWS認定クラウドプラクティショナー合格に向けて Day13

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day12](https://qiita.com/Ayako_0224/private/66d462e07646851ad485)

# IPアドレスとサブネットマスク
IPアドレス...3桁(0~255の10進数)×4の組み合わせで各桁は8つのバイナリ値の集合
サブネットマスク...IPアドレス表記の後ろに/数値でくっついているもの(32までで推奨は16,24)
CIDR(Classless Inter Domain Routing)...IPアドレス＋サブネットマスクでサブネットマスクの値を設定し、同じネットワークとして扱うIPアドレスの個数を調整できるIPアドレスの設定方法
```
サブネットマスクの値x=IPアドレスの2進数のx桁分までをロックし残りの桁分のビットの間が有効なIPアドレスとして利用できる
```

# サブネット
サブネットマスクによるグループ化されたアドレス範囲内のこと
CIDR範囲で分割したネットワークセグメント
パブリックとプライベートの2種類がある
パブリックサブネット...インターネットゲートウェイへのルートが設定されていてインターネットからアクセスできる
プライベートサブネット...インターネットからアクセスできない
VPC内に複数設置でき、1つのAZを指定して配置される

# VPC
- Virtual Private Cloudの略
- 仮想ネットワークを作るサービス
- AWSクラウドから論理的に分離されたセクションを作成する
- AWSアカウントを作成すると自動でVPCとサブネットが作成される
- インターネット経由やVPNなど様々な接続オプションが利用可能

## VPCとAZの関係
単一のVPCを構築...単一AZの範囲に設定
同一リージョン内ではVPCは複数のAZにリソースが含めることができる

## VPCとサブネット
VPCとサブネット(必須)の組み合わせでネットワーク空間を構築する

## VPCの設定
ウィザードを利用しない通常の場合はVPCとサブネットを1つずつ作成する
1. VPC作成(CIDRの設定)
2. サブネットの作成
3. インターネット経路(Gateway)の設定
4. VPCへのトラフィック許可の設定  

VPCではサブネットマスクは`/16~/28`の間で使用可能

## VPC外部接続
プライベートサブネットからインターネットに接続するにはNATゲートウェイをパブリックサブネットに設置し、そこからインターネットに接続する
VPCの外側にあるリソースとの通信にはパブリックのAWSネットワーク(EC2など)かエンドポイント(S3)などを利用する

# インターネット経路を設定
ルートテーブルとCIDRアドレスでルーティングを設定する
- ルートテーブルでパケットの行き先を設定
- VPC作成時にデフォルトで1つルートテーブルを作成
- VPC内はCIDRアドレスでルーティング

次の記事は➡︎[AWS認定クラウドプラクティショナー合格に向けて Day14](https://qiita.com/Ayako_0224/private/58a9850dd29b07f7388c)
DockerでOverlayFSを確認する


# はじめに

前回は、OverlayFSがどういった動きをするのか確認しました。今回は、実際にDockerを触りながら、OverlayFSがどのように使用されているのかを確認します。

https://qiita.com/ymktmk/items/de2011ea49d62f242079

## コンテナ起動して確認する

ubuntuをベースとしたDockerfileを記述します。
```dockerfile
FROM ubuntu:latest

ADD hoge.txt /root/hoge.txt

ADD fuga.txt /root/fuga.txt
``` 

必要なファイルを作成し、imageをbuildし、コンテナを起動します。
```
echo "hoge" > hoge.txt

echo "fuga" > fuga.txt

docker build -t app .

docker run -d -it app /bin/bash
```

コンテナが立ち上がったら、マウントの状況を確認してみます。

```console
$ mount | grep overlay

overlay on /var/lib/docker/overlay2/9b283e2cf604e5151429b85d6280f1809bbb62cd4c5c6247eeaa81206e11ff7d/merged type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/TG5CQPGYRSJ6EHYDNF75TXNVO2:/var/lib/docker/overlay2/l/6SAUQGTQ23GRLYH4OQGACI6TRV:/var/lib/docker/overlay2/l/G3M62SSZB7N64I7PDWFZIUM6TL:/var/lib/docker/overlay2/l/XWWSQDBBRW6ND7XXXV3FB5GB2U,upperdir=/var/lib/docker/overlay2/9b283e2cf604e5151429b85d6280f1809bbb62cd4c5c6247eeaa81206e11ff7d/diff,workdir=/var/lib/docker/overlay2/9b283e2cf604e5151429b85d6280f1809bbb62cd4c5c6247eeaa81206e11ff7d/work)
```

ごちゃごちゃしていますが関係性を図にすると以下のようになります。Dockerfileに記述したように順番にレイヤを積み重ねていき、最終的にmergedとして見せていることが分かります。

```
├── /var/lib/docker/overlay2/xxx/merged
│　   └── root
│　　　　　　     ├── fuga.txt(fuga)
│        └── hoge.txt(hoge)
├── /var/lib/docker/overlay2/xxx/diff
├── /var/lib/docker/overlay2/l/6SAUQGTQ23GRLYH4OQGACI6TRV
│    └── root
│        └── fuga.txt(fuga)
├── /var/lib/docker/overlay2/l/G3M62SSZB7N64I7PDWFZIUM6TL
│    └── root 
│        └── hoge.txt(hoge)
└── /var/lib/docker/overlay2/l/XWWSQDBBRW6ND7XXXV3FB5GB2U
     └── bin  boot  dev	etc  home lib	lib32  lib64  libx32  media  mnt  opt  proc  root  run	sbin  srv  sys	tmp  usr  var
```

**lowerdirオプションで指定されている一番最初のレイヤ(lowerの一番上のレイヤ)は、コンテナかどうか識別したりなど、システム的な用途に使うレイヤで、どのコンテナを立ち上げた際にも存在します。**

## 追記

発展として、`docker push`、`build`した際の動きなどは以下の記事がとても参考になりました。

https://tech-lab.sios.jp/archives/21103#Dockerpush

# さいごに

DockerでOverlayFSがどのように用いられているのか確認しました。次回は、namespaceやcgroupsを使ってコンテナ別のリソース管理について書きたいと思います。
SwiftUI：Viewの.clipped()領域外はタップできなくする方法(とてもシンプル！）

SwiftUIでViewの表示領域を限定する際に、.clipped()モディファイアはとても便利である.<br>しかし....clipped()を使って画像のドラッグ移動などを実装する時、例えば.offset()などで画像表示位置を変更した場合、下記の図の様にclippedで非表示領域もタップが有効なままなので、下層のView（ボタンとか）がタップできなくなくなってしまう.<br>別に気にならないケースもあるでしょうけど、この例みたいに別のタップしたいアクションがあるとちょっと困るのだ.
![aboutClipped.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2212777/b15c5082-d3ad-5b4b-eb71-e8989943d4f4.jpeg)

そこで、シンプルな解決法がこれ.
```swift
.contentShape(Rectangle()) 
```
このモディファイアを１行追加するだけで問題は解消するのである.<br>例）画像をドラッグ移動するサンプル↓
```swift:Sample_for_contentShape
import SwiftUI

struct ContentView: View {
    @State var offset:CGSize = .zero      // drag value
    @State var lastOffset: CGSize = .zero // hold last drag value
    
    var dragGesture: some Gesture { // Gesture for Drag to move
        DragGesture()
            .onChanged {
                offset = CGSize(width: lastOffset.width + $0.translation.width, height: lastOffset.height + $0.translation.height) }
            .onEnded{ _ in
                lastOffset = offset }
    }
    
    var body: some View {
        VStack {
            Button(action: { // Reset drag
                offset = .zero
                lastOffset = .zero
            }){ Text("Reset") }
            
            Image("bluesky") // 背景の青空画像
                .resizable()
                .scaledToFit()
                .overlay(
                    Image("strawberry") // 苺の画像：切り抜きで背景透過
                        .resizable()
                        .scaledToFit()
                        .offset(offset)
                        .gesture(dragGesture)
                )
                .frame(width: 300)
                .clipped()
                .contentShape(Rectangle()) // *** これを追加すれば解決！ ***
        }
    }
}
```
この解法はネット検索しても意外に僅かしか出てこなかったので、ここに掲載.

:::note info
環境情報：
Xcode 14.3, Swift 5.8
:::
Amazon Cognitoを検討してみた


この記事は Goodpatch Advent Calendar 2022 の10日目です。

こんにちは、Goodpatchの [ReDesigner](https://redesigner.jp/)サービスでバックエンドを担当している荒木です。

## はじめに
多要素認証を導入するため検討してみました。
(時間がないので作り込みではなくサービス利用を選択)

## どんなサービスがある？
Webサービスやアプリ、社内システム向けなど様々なサービスがありますが、今回はWebサービス利用ということでシングルサイオン対応しているサービスをいくつかピックアップして検討します。

1. Uni-ID MFA
   特徴
   - WebAPI提供による多要素認証の導入が可能
   - OATH TOTP に準拠した認証機能
   - 料金は問い合わせ、利用ユーザー数に影響されそう

2. Twilio Verify
   特徴
   - 10行足らずのコードでウェブやモバイルのアプリに二要素認証の機能を追加可能(サイト曰く)
   - 音声通話もサポート
   - 認証１件あたり$0.05。ボリュームディスカウントは要相談

3. Auth0
   特徴
   - 料金が他より明確に公開されてて、シンプルな利用ならお安め
   - SPAとWebAPIという構築なら綺麗に分離できそう
   - ユーザー情報をAuth0側に持つことになるのでその分の作り込みや移行が必要になる。

4. Amazon Cognito
   特徴
   - AWSな料金(50,000 アクティブユーザー/月が無料)
   - 実装情報が多い
   - ユーザー情報をCognitoからのユーザー取得はリクエスト制限有り

調べてみても実装の具体例は少なめでしたがAuth0とCognitoは比較的多かったです。
利用料金や既存サービス環境がAWS、既存システムへの導入と考えると今回はCognitoが無難だと考えました。
※ 読み方はCognito（コグニート）

## コンソール上での動作確認

1. ユーザープールの作成
   管理したい単位でプールをステップに沿って作成しましょう。
    <img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/d774122f-5a2d-8446-41ef-aa476495aa52.png">

2.アプリクライアントを対象アプリ毎に作成します.

   <img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/9e33b6a3-eb64-5531-be24-6a9848f9950e.png">

:::note info
コンソール上でUIを起動する場合は古いコンソールで作業した方が解りやすいかも
:::


3.コンソール上でUI起動すると設定に合わせて下記(未カスタマイズ)のログイン画面が表示されて実際にアカウント発行やログインが行えました。

   <img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/84e7d776-cf34-a288-1a3d-c06b62f959cb.png">

4.そのままMFA認証もできて、実際にGoogle認証システムなどに登録してコード発行できます。

   <img width="200" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/d3cd2c60-677f-0fae-624b-57f4b8646d2c.png">

5.発行したアカウントは下記のようにプールされたことを確認できました。

   <img width="500" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/8a766680-a4b5-8098-7088-2d274183f9c2.png">


## 実際に運用を想定した際に検討すること

- ある程度カスタマイズ可能だが下記のプラットフォームのライブラリをダウンロードして実装する方が現実的

   <img width="300" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/5930ec18-4c84-e5b2-a756-3965c0aad60f.png">

   FlutterはJSか:rolling_eyes:

- SNS認証は必要十分

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/908790/cec09b24-2a2e-5cab-161d-9a1919104d8f.png">

- アカウント管理画面はAWSコンソールだと使いにくいので結局連携して実装も視野に入れる。

- アドレス認証のメールはCongnitoから送信されるのでカスタマイズ可能な範囲が限られる。

## まとめ
簡単な検証でしたが、Webサービスへの導入要件は十分満たしている印象でした。これから実際にアプリへの組み込みも検証していこうと思います。
(フロントサイドへの組み込みはAuth0の方が楽そうです。)
まずはお試し

githubもQiitaも初めてだけれど、まずはお試しで
githubにコードを公開してみた。

英語が読めないので、先人たちの記事をもとに
何とか出来た。

https://github.com/kenji0811/JavaScript/commit/e3dbd2af8a54d4cedcc77afd721f9414c748ee60

公開したのは、どこかのミニゲーム？で見かけた、
「ボタンを押すと、押したところと、その周りの
ON・OFFが切り替わる３×３マス」というもの。

確か、時間制限付きの脱出時に強制的にやらされる
ようなミニゲームだったと思う。

授業で学んだ知識をもとにサクッと作った。

講師の方曰く、最近はHTMLに記述することがあまり
無いそうなので、bodyにonloadのみ記述して、

JavaScriptにほぼ記述して、CSSで体裁を整えた。
【Python】勉強メモ-その1　リストについて

### 1．はじめに

プログラミングを勉強していると、配列が物凄く重要ということが分かってきました。
ただ、配列は、使いこなせるまで、相当勉強が必要だと感じています。
勉強した結果を少しでもOutputし、定着させるため、本記事を書きます。
よって、完全な自己満となります。

ただ、もっとこうすべき、もっとこういうやり方があるよ！とか、基礎が分かってないんじゃない？
という様なご意見も歓迎致しますので、沢山、ご意見いただければと思います。


### 2．一次元配列
pythonで配列の基礎を学習する時、だいたい、以下の様なことから説明が始まりますが、
この辺りは、飛ばします。

＜例＞
```sample_01.py
li = [1, 2, 3]
print(li)

# 結果
[1, 2, 3]
```

せめて、ループぐらいは、使っておきましょう

```sample_02.py
# sample_01.py

li = [1, 2, 3]

for x in li:
    print(x)

# 結果
1
2
3
```

index（添え字）とvalie（値）をセットで出力する場合は、**enumerate**関数を使います。
**enumerate**関数は、index（添え字）を表示してくれるので、配列が**0**から始まること
が分かります。

```sample_03.py
# sample02.py

li = [1, 2, 3]

for  i, x in enumerate(li):
    print(f'index:{i}', f'value:{x}')


# 結果
index:0 value:1
index:1 value:2
index:2 value:3
```

ちなみに、以下の様にすると、繰り返しに使えないオブジェクトを繰り返し処理で使っているためエラーとなります。
つまり、for文では、開始と終了という範囲が無いとエラーとなってしまいます。

```sample_04.py
# sample03.py

li = [1, 2, 3]

for x in len(li):
    print(x)

# 'int' object is not iterable
```

解決方法として、`range`関数を使えばOKです。
```sa,ple_05.py

for x in range(len(li)):
    print(x)

# 結果
0
1
2
```

index(添え字)とvalue（値）を一緒に表示したい場合には、`enumerate`、`range`、`len`関数を利用します。

```sample_05.py

for i, x in enumerate(range(len(li))):
    print(f'index:{i}', f'value:{x}')

# 結果
index:0 value:1
index:1 value:1
index:2 value:2
```

### 3. 最後に
- ツッコミ歓迎致します。皆様のツッコミが、私のスキルアップにつながります！！
- お題なんかも出していただけると助かります。
- 実務では、もっと、こういう使い方もあるよ！！みたいなアドバイスもいただけると嬉しいです。
ChatGPTでターミナルを起動するプロンプトを自分用にメモしただけ

自分用です(2022/12/10現在起動確認)

```
I want you to act as a Linux terminal.I will type commands and you will reply with what the terminal should show.
I want you to only reply with the terminal output inside one unique code block,
and nothing else.Do not write explanations.
Do not type commands unless I instruct you to do so.
When I need to tell you something in English I will do so by putting text inside curly brackets {like this}.
I am the user root, my first command is pwd.
```

私の場合、既に会話をした後では上記を入力しても質問形式の答えが返ってくるだけでした。
画面左上タブの「Reset Thread」で会話をやり直す必要があります。

ちなみにヤフーに繋いだところ、こちらの仮想世界に大雪は降っていませんでした。
RSpecの.rspecファイルは # を使ってもコメントアウトされない（のでプルリクを送ってマージされた！）

## はじめに
RSpecでは`.rspec`というファイル[^1]にデフォルトのオプションを書き込むことができます。

[^1]: 厳密には`.rspec`以外のファイル名でもオプションは指定可能です（[参考](https://relishapp.com/rspec/rspec-core/v/3-12/docs/configuration/read-command-line-configuration-options-from-files
)）

```.rspec
--format documentation
--warnings
```

https://relishapp.com/rspec/rspec-core/v/3-12/docs/configuration/read-command-line-configuration-options-from-files

`.gitignore`や`.zshrc`など、`.`で始まる設定ファイルは`#`を使って行コメントを書くことができます[^2]。きっと、`.rspec`でも同じようにコメント化できるのではないでしょうか？やってみましょう。

[^2]: コメント化する文字が `#` でない設定ファイルもありますが、割合的には `#` が多いように思います。 

```.rspec
# --format documentation
--warnings
```

`.rspec`を書き替えたのでRSpecを実行してみます。

```
$ bundle exec rspec
HomeController
  returns a 200 response
  #index
    responds successfully

NotesController
  #index
    searches notes by the provided keyword

（以下略）
```

あれっ、`--format documentation`が無効化されてない！！😭

ちなみに期待していた結果はこうです。

```
$ bundle exec rspec
......................................................................

Finished in 2.19 seconds (files took 1.67 seconds to load)
70 examples, 0 failures
```

いったいなんでなのー！？

## RSpec Core 3.12までは`#`は無視される
いろいろ調べたところ、`.rspec`は`#`を使ったコメントアウトに対応しておらず、ただ単に`#`は無視されます。
そのため、`# --format documentation`と書いても`--format documentation`が有効化されたままになったのです。

### もう少し詳しく
どうも設計思想として、`.rspec`に書かれた内容はコマンドラインで渡すオプションと同じ扱いになっているようです。

つまり、以下のような`.rspec`があった場合は、

```.rspec
--format documentation
--warnings
```

以下のように実行したのと同じ扱いになるわけです。

```
$ bundle exec rspec --format documentation --warnings
```

とはいえ、`#`のようなオプションとして無効な文字列が`.rspec`に含まれていると、

```.rspec
# --format documentation
--warnings
```

RSpec本体の内部ロジックで`#`は無視されて、結局以下のコマンドを実行したのと同じ扱いになっていました。

```
$ bundle exec rspec --format documentation --warnings
```

## RSpec Core 3.13以降なら`#`でコメントアウトできる（はず）

うーん、これはちょっと挙動として不自然でわかりづらくないですか？と思ったのでRSpecにissueを投げてみました。

https://github.com/rspec/rspec-core/issues/2985

そして、`.rspec`ファイルで`#`を使ったコメントアウトが使えるようにするためのプルリクエストを出してみました。

https://github.com/rspec/rspec-core/pull/2984

その結果・・・なんとか無事にマージされました！🎉

![Screen Shot 2022-12-10 at 16.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/9045f728-7d89-ccee-38c3-2f3983b74f59.png)

この記事を書いている時点ではまだリリースされていないですが、順調にいけばRSpec Coreの次のリリース（おそらく3.13？）でこのコメントアウト機能が使えるようになるはずです！

![Screen Shot 2022-12-10 at 16.51.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7465/71b952cb-3634-ade2-6a22-22b1a372239f.png)

https://github.com/rspec/rspec-core/blob/main/Changelog.md

**2024.2.5追記**
RSpec Core 3.13がリリースされ、ようやくこの変更が日の目を見ることになりました！ :tada: 

## おまけ

ちなみにRSpec関連の記事をたくさん書いてる僕ですが、RSpecのコードにコントリビュートするのはこれが初めてです😅
Rustを勉強する part1【言語の特徴】

# 目的
今話題の言語、Rustを勉強したい!
Qiitaの記事としてアウトプットしながら、Rustの基本を勉強していきます。
# Rustの特徴
* マルチパラダイムプログラミング言語
→ 手続き型・関数型プログラミングの両方で実装可能
* 静的型付け
* オブジェクト指向プログラミングもできなくない
* 関数型プログラミング言語Haskellから引き継いでいる部分が大きい言語
* ポインタや参照といった概念を持ちつつ、所有権という独自の機能をもっている
## 注意点
用語や機能が既存のプログラミング言語と類似していることが多いが、概念がすべて一致しているわけではないでの、注意が必要である。