OmniAICreator/Qiita-1.07M huggingface dataset:
みんなで作るホイールマップのご紹介

# 車椅子で行ける施設を共有しよう！

今回は、Wheelmapプロジェクトを紹介したいと思います。

https://wheelmap.org/?locale=ja

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/71fa2d9a-477b-7cf8-2cd9-89d813aad1ba.png)


車椅子マップはいくつかありますが、Wheelmapは以下の特徴があります。
そして、これらの特徴は、非常に重要な要素であると私は考えています。

* 全世界に対応していること
* 誰でも簡単に情報提供できること
* オープンデータで公開されること

それでは、それぞれの特徴について説明していきたいと思います。

### 全世界に対応していること

様々なバリアフリーマップはありますが、それらを作っている団体も様々です。
場所によってはバリアフリーマップが充実したり、逆に全く無かったりします。
団体によって活動する場所が変わるので、全世界に対応するのは難しい所です。

Wheelmapプロジェクトはお店や施設情報をOpenStreetMapから取得するので
全世界に対応しています。団体が活動してなくても情報を得られるのは便利。

### 誰でも簡単に情報提供できること

お店や施設に車椅子で行けるかの情報があるのが一番良いのですが、そうでは
無い施設やお店もあります。その時は、その情報をWheelmapに提供しよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/a3b05c10-a43d-9fa6-889f-6321b720d096.png)

こんな感じで情報提供が出来ます。車椅子ユーザーで無くても貢献できます！

### オープンデータで公開されること

施設やお店の情報はオープンデータとして公開されています。
オープンデータで公開されているということは、このデータを使ってもっと
便利な車椅子マップを誰でも開発することが出来るということです。

正直言ってWheelmap.orgサイトは日本人には少し使いづらいと思います。
地図もあまり美しくないしね（かなり古いOpenStreetMapデータみたい）。

それでも普通に使うことは出来るし、情報提供も出来ます。
そして、そのデータはオープンデータとして公開しており、世界中の様々な
地図やサービスで利用されています。なので、Wheelmapに情報提供すると
他のマップにも反映されるという、好循環が始まっていきます。

### とにかく使ってみよう！

https://wheelmap.org/?locale=ja

もちろんスマホ対応なので、まずは開いて近くにあるお店や施設が車椅子に
対応しているか情報提供してみませんか？そして、車椅子ユーザーのかたは
ブラウザのブックマークに入れて、ぜひ使ってみてください。

### 参考情報
* [Wheelmap.org - 車椅子で行ける場所を見つけよう](https://wheelmap.org)
* [Wheelmap.org - Wikipedia](https://ja.wikipedia.org/wiki/Wheelmap.org)
* [OpenStreetMap](https://www.openstreetmap.org)
    * バリアフリーも含めて様々な情報をオープンデータで公開しています。
    * Wheelmapに提供した情報は、OpenStreetMapに自動的に反映されます。
Sequence MakerのタブがExcelから消えてしまった時の対処法（その2）

## はじめに
Sequence MakerはExcelから測定器を制御可能にするアドインです。Sequence Makerをインストールすると、Excelのリボンのタブに「SEQUENCE MAKER」が追加されますが、なぜか追加されなかったり、しばらく使っているうちに急にタブから消えてしまったりする場合があります。この記事ではそんな時の対処法を紹介します。なお、Sequence Makerについての詳細は以下の記事を参照ください。

https://qiita.com/sequencemaker/items/8e6a370ab0a793a06a3b

:::note warn
***お断り***
本記事の内容はSequence Maker開発元の公式見解ではなく、あくまでも個人が趣味の範囲内で執筆しているものです。記事の内容について開発元へ問い合わせることはお控えください。ご質問・要望などは各記事のコメント欄へお願いいたします。
:::

## まずはSequence Makerの再インストール
まずは、以前にも紹介したこの方法を試してみましょう。

https://qiita.com/sequencemaker/items/eff17cef1ed88873a1fd

## アドインの設定を確認する
1. 「Excelのオプション」⇒「アドイン」⇒「COMアドイン」を選択します
1.  「設定」を押します
1. 「Sequence Maker」に✅が入っていることを確認します
1. 「OK」を押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/5954d73b-f376-68b3-fcac-cfb4d78647ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/c106d027-56a4-e1a7-3993-aaef563606c5.png)

 これで「SEQUENCE MAKER」のタブが無事に表示されないでしょうか・・・？？

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821782/8acf5812-fd82-ab32-482c-72eaaa09e5b1.png)

## まとめ
今回は「SEQUENCE MAKER」のタブが消えてしまったときの方法を紹介しました。「その1」の方法と今回の方法をやれば、大抵の場合は表示できると思うのですが、もしそれでもダメなケースがありましたら、コメントで教えてください。
出題範囲がクソ広すぎるクイズアプリ

# クイズって楽しいですよね
子供のころ休日の昼間にボーッと見ていたアタック25、試験直前に隣の席の友達と出し合った一問一答、一昔前に流行った早押しクイズのスマホアプリ、クイズって何でも楽しいですよね。

僕もそんな楽しく思い出に残るクイズ体験を世の中に届けたく、クイズアプリを作りました。ぜひ遊んでみてほしいです。

https://random-wikipedia-quiz.vercel.app/

# 嘘です 悪ふざけです
もちろんそんな高尚な考えはないです！なぜならここは毎年恒例クソアプリアドベントカレンダーなので！！10周年おめでとうございます🎉🎉🎉 心からお祝い申し上げます！

今回作ったのはwikipediaの記事からクイズを作成するアプリです。名前はスマブラの情け無用組手から取ってます。出題されるのは例えばこんな問題。

![CleanShot 2024-12-12 at 20.22.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/f54d9f6d-3daa-2b27-e8c5-5ae950415e44.png)

...ザンビアしか分かりませんね。ザンビアもザンビアという名前しか知りません。ちなみに正解は **『Black Power』** です。

先日遅ればせながら知ったのですが、こちら（http://ja.wikipedia.org/wiki/Special:Randompage ）のURLにアクセスすると日本語版wikipediaのランダムなページに飛べるようです。我々には今やLLMくんがついています。つまり、アクセスするたびにこのURLから記事を取得しLLMにクイズを作ってもらうことで、**半永久的にランダムなクイズに挑戦することができる**のです。

**お察しの通り、出題範囲はwikipediaの全記事という科挙が泣いて逃げ出す仕様なので、基本的にほぼ分からないという仕上がりになっています！クソで嬉しいですね〜！**

# 趣深きクソクイズをあなたへ
![CleanShot 2024-12-12 at 21.05.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/c1760f9b-f2bf-62a2-a46e-da9f0b985686.png)
**アメリカで弁護士になりたい人向け**

---

![CleanShot 2024-12-12 at 20.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/cebd4e9d-51c0-74c2-7384-bb26cf908862.png)
**1939年の8位の数字誰が覚えてるんよ**

---

![CleanShot 2024-12-12 at 21.02.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/bfed1315-9d7b-238b-7f60-c727d6c9934b.png)
**これは分かる人なら分かりそう？？**

---

![CleanShot 2024-12-12 at 20.31.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/13e6c6f4-344d-c478-0b88-31575bdbd0f1.png)
**日本史選択だったけど国司就連って誰だよ...あれ？？**

# 毛利氏の家臣の主君の名字は毛利
何だよこれ絶対わかんねえじゃんよと乱暴に問題をめくっている中、僕はこの問題も考えもせずに諦めて答えを見ました。愕然としました。謎の人物「**国司就連**」に関するこの問題は**取り問**だったのです。免許試験の最後のイラスト問題を外したようなものです。

# Groq使ってみた
今回の仕組みを作るうえで、作問にLLMは必須です。アイディアはあるけどクソアプリでGPTやClaudeのAPIの料金払うのもな...。と思っていたら、この[Groq](https://groq.com/)はどうやら現時点ではある程度無料で使えるようだったので利用させてもらいました。
モデルは`llama-3.3-70b-versatile`です。多少ブレがあるようには感じましたが（無料枠だからかな？）、謳っている通り速いときは爆速でしたし、`response_format`でjsonを指定することもできたので普段使っているGPTのクライアントと同じ使用感で使えて満足しています。

ただ、**毛利クイズから察せるとおりこのモデルは日本語が得意ではないようです**。この点はクソアプリなので寧ろ好意的に受け止めることにしました。また、無料枠なので開発中から何度もrate limitに引っかかっています。今はパブリックなので、このアプリはおそらく同接数人でくたばります。クソアプリなのでこんなところも愛おしいですね。エラーハンドリングはガバガバでやらせてもらってるので、ローディング終わらなそうだったら再読み込みしてみてください。無料で使わせてもらえることに感謝🤲

# 展望
言語を英語にするか、4o-miniかsonnet3.5あたりの日本語が上手なモデルにすれば割とまともなものになる気がします。生成されたクイズを毎度DBに保存するようにして、クエリにidをつければ呼び出せるとかにした上でSNSでのシェア機能つけたら楽しそうですね。皆様のコントリビュートお待ちしております。クソアプリなのでレビューしないでマージします。

https://github.com/zaaaato/random-wikipedia-quiz

ここまで読んでくれてありがとうございました。
それではこのクイズでお別れしましょう、メリークソスマス！🎄🎄

![CleanShot 2024-12-12 at 20.01.56 copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/940f0d2d-f62b-4513-320b-4fe902bc9148.png)


↓↓↓答え↓↓↓
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
![CleanShot 2024-12-12 at 20.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489323/e4927c7c-d0bf-0119-acd5-c55d44ae3fe7.png)



#### 余談
「ソースを見る」の遷移先をブルドッグソースの公式にしてやろうかと思ったけど流石にクソだったのでやめた。
その『面倒くさい』がカッコ悪い理由: エンジニアの三大美徳とは?

# はじめに
同僚エンジニアの発言で「その変更は手間がかかって面倒」といった言葉を聞くことがあるかもしれません。この言葉、エンジニアの美徳に照らし合わせると、モヤっとしてちょっとカッコ悪く感じる時ありませんか？
この記事では、「面倒くさい」という発言のどこがエンジニアの三大美徳(怠惰・短気・傲慢)に反しているように感じる時があるのかを考えていきます。

# エンジニアの三大美徳とは
エンジニアの三大美徳とは、「怠惰」「短気」「傲慢」

## 怠惰(Laziness)
> The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful, and document what you wrote so you don't have to answer so many questions about it. 
> 
> 全体的なエネルギー消費量を減らすために多大な努力を払う性質。他の人が役に立つと思うような省力プログラムを書き、書いたものを文書化して、それについて多くの質問に答えなくて済むようにする。

解釈: 最初から手間を惜しまず、効率的な方法や自動化を考えることで、将来的な手間を減らすこと。

## 短気(Impatience)
> The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to. 
> 
> コンピューターが怠けているときに感じる怒り。これにより、自分のニーズに反応するだけでなく、実際にそれを予測するプログラムを書く。少なくとも、そのふりをする。

解釈: 待たされることに苛立つことで、より早く結果を得るための工夫を促すこと。

## 傲慢(Hubris)
> Excessive pride, the sort of thing Zeus zaps you for. Also the quality that makes you write (and maintain) programs that other people won't want to say bad things about.
> 
> 過剰なプライド。ゼウスがあなたに打撃を与えるようなもの。また、他の人が悪口を言いたくないようなプログラムを書く(そして維持する)性質である。

解釈: 自分のコードにプライドを持つことで、ミスや手抜きを避け、他人が使いやすい品質の高いコードを書くこと。

## 要約
怠惰: 「面倒くさいから、後で楽できるようにする」という考え方。
短気: 「効率の悪い作業を改善し、スピーディーに進めたい」という原動力。
傲慢: 「誇りを持って良いものを作りたい」という意識。

# 「その変更は手間がかかって面倒」にモヤっとした気持ちの言語化
同僚が「その変更は手間がかかって面倒」と言ったときに感じたモヤっと感を、エンジニアの三大美徳と関連付けて言語化してみます。

## 「怠惰」を誤解している可能性
怠惰は「効率を追求して、楽になる仕組みを作る」ことであって、「面倒だから手を抜く」ことではないです。「面倒くさいからやらない」ではなく、「面倒だから効率的にやる方法を考える」が本来のエンジニアの姿勢ではないか？と感じたのかもしれません。

## 「短気」の視点が欠けている可能性
短気は「不満やストレスを原動力にして、改善する」ことです。同僚の発言からは、待たされる側の苛立ちを想像する姿勢が感じられず、「どうせ手間がかかるから後回し」という印象を受けます。待たされる人の立場を想像する意思や、スムーズに進めたいというモチベーションが感じられず、自分本位な発言に映ったのかもしれません。

## 「傲慢」のプライドが不足している可能性
傲慢は「良い成果を残したい」というプライドに基づいています。同僚の発言は、「良い仕事をしたい」という意識や、自分の成果への誇りが薄く、プロフェッショナルらしさを欠いているように感じたのかもしれません。

# 実際に『面倒くさい』と言いたくなったら？
仕事をしていれば、手間がかかる作業に直面することもあります。そのとき、「面倒くさい」と言い捨てる代わりに、以下のように考えるのはどうでしょうか？

## 1. なぜ面倒だと感じるか？
どこが面倒に思えるのか分解してみましょう。
- 手順が多いから？
- 必要性を感じないから？
- 技術的に難しいから？
問題の本質を掘り下げると、実際のタスク量が見えてきて思ったより多くなかったり、改善のヒントが見えてくることもあるでしょう。

## 2. 面倒をなくす方法を考える
ツールを使って自動化を行ったり、作業手順の削減を考えます。ときには、他の人に手伝ってもらうのも一手でしょう。

## 3. 未来を考える
タスクに取り掛からなかった将来を想像して、その面倒くささに呆れてさっさと仕事をするのでもよいでしょう。
面倒なことを達成する経験は自分の自信と成長にもつながります！

# おわりに
仕事するならカッコよく働きたくないですか？本当の三大美徳(怠惰、短気、傲慢)を実践して、「面倒くさい」と思う問題を前向きに解決するエネルギーに変えていきましょう！

# 参考
- [Laziness Impatience Hubris](https://wiki.c2.com/?LazinessImpatienceHubris)
長年Pythonを使っていても…演算子優先順位でバグった話

# はじめに

私の遭遇したバグを紹介します。
初見だと、なかなか気づくことが難しいとおもうので、こんなことがあるんだと知っておくといいかもしれません。
結構、原因がわからずに悩みました。

# 本題の前に

私の遭遇したバグは、整数の割り算`//`に関係しているので、先に、整数の割り算について説明しておきます。
'//'演算子は、整数の割り算を行う演算子です。

割り算の結果は、整数で返されます。

例えば、10//3の結果は、3です。

気をつけないといけないのは、負の値の場合です。
小さい方に切り捨てられるので、-10//3の結果は、-4です。

```
-3 ←大きい方
-3.333333...
-4 ←小さいほう
```

プラスの場合とマイナスの場合で、結果が異なるんです。

# どんなバグか

私のはまったバグは、次のようなものです

Xの値3で割った商の符号を変えたものを求める計算でした。
例えば、X=10の場合、-3 が想定してる答えです。

3で割って、符号を変える。
素直に

```python
ans = -X//3
```

と書いてました。

これだと
ans == -4
となります。

# 解説

単項演算子の`-`は、`//`よりも優先順位が高いので、`-X//3`は、`(-X)//3`と解釈されます。
X=10の場合、
`-X`の部分がが`-10`なので、`-10//3 = -4` で、`-4`になります。

```python
>>> X=10
>>> ans = (-X)//3
>>> ans
-4
```

正しく動作させるのは、
`-(...)`とする必要がありました。

```python
>>> X=10
>>> ans = -(X//3)
>>> ans
-3
```

# おまけ

よく似た記述ですが、

```python
ans = 0-X//3
```

の場合は、`ans=-3`となります。

`-`は、二項演算子なので、引き算よりも割り算が先に計算されます。
X=10の場合、`0-X//3` → `0-(X//3)` →　`0-3` → `-3` です

# まとめ

単項演算子の`-`は、先に評価されるので気を付けましょう

これを機会に、演算子の優先順位をおさらいしておこう。

Pythonのドキュメントは、[ここ](https://docs.python.org/ja/3.12/reference/expressions.html#evaluation-order)です
ラーメンの画像を貼るスレ

https://github.com/vim-jp/issues/issues/355

このIssueをご存知だろうか
このIssueは重複したリクエストであったものがなぜかジョークとして残され未だに更新され続けている謎である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821686/bac09bf6-4ead-5355-a498-3abf246de31f.png)

https://github.com/vim-jp/issues/issues/355#issuecomment-16215118

この精神を見習いたいところである。

## 社内のSlackにできてしまった

セキュリティの観点からスクリーンショットをお見せできないのだが、この話をしたところご飯写真のチャンネルができた。
たまに間違えて開いて飯テロされる。昼前に見るとお腹が空くのでおすすめ。

## ユーモアが足りない

いずれにせよかっちりしたところよりもユーモアや面白さ、ジョークがあったほうが楽しいのは事実である。

そんなこんなで(?)最近は r/PrograminngHumor をよく見ている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821686/7a733f48-12fc-1331-c645-ebcaf5397769.png)

https://www.reddit.com/r/programminghumor/

プログラマにしかわからない小ネタがたくさん詰まっているので気になる方は見てみてほしい。
休憩時間これしか見てない気がする。
【Rustのまほう2】#13 リソース

# リソースとは

Bevyにおける**リソース**(Resource)とは、Bevyのアプリケーション全体でひとつしかないデータを保持するのに使うものです。前回紹介したステートと似ていますが、ステートはあくまで画面切り替えなどでシステムを切り替えるのに使うもので、それに対してリソースはもっと汎用的なものです。また、データを保持するという意味ではエンティティとも似ていますが、ワールド全体でひとつしかないのがリソース、ワールドで任意個を持てるのがエンティティだと考えるといいでしょう。

例えば、ゲームのBGMの音量はどの画面でも共通で、画面遷移しても変更されることはありません。このように画面遷移をまたいで保持したいものをリソースにします。他にも、いったん読み込んだ画像ファイルや音声ファイルのようなアセットも、リソースとしてアプリケーション全体を通じて保持しておきます。



# リソースの定義

リソースを定義するには、データ型の定義で`Resource`を導出しておきましょう。

```rust
#[derive(Resource)]
pub struct GameConfig {
    pub bgm_volume: f32,
    pub se_volume: f32,
    ...
}
```


# リソースの初期化

リソースは使う前に初期化が必要です。最も簡単には、リソースに`Default`トレイトを実装しておいて、`app.init_resource`を呼びます。ここで書いていて気付いたんですが、まだ`App`について説明していませんでした！またいずれ説明します。

```rust
app.init_resource::<GameConfig>();
```

または、`insert_resource`で値を指定したり上書きすることもできます。

```rust
app.insert_resource(GameConfig::default());
```


# リソースの読み取り

リソースはシステムパラメータとしてシステムから読み取ることができます。`Res`がリソースを表すシステムパラメータで、たとえば先ほどの`GameConfig`リソースを読み取りたければ、`Res<GameConfig>`というようにシステムパラメータを書きます。

```rust
fn update_bgm_volue(
    config: Res<GameConfig>,
    ...
) {
    if config.is_changed() {
        ...
    }
}
```

また、上のコードにあるように、`config.is_changed`を呼びだすと、リソースが変更されているかどうかを調べることができます。無駄な処理を省きたいときにはこれを使うといいでしょう。

また、`Res`は読み取りだけですが、`ResMut`を使うとリソースに書きこみもできます。

```rust
fn update_bgm_volue(
    mut config: ResMut<GameConfig>,
    ...
) {
    ...
}
```

リソースでやっていることはデータの保持だけなので、同じ機能をエンティティで実現することもできます。でも、エンティティではデータが無かったり複数個存在する可能性も含めて条件分岐を書くことになるので、全体で1個しかないデータであればリソースを使ったほうが簡単です。


# 参考文献

もっと詳しく知りたければチートブックで！

https://bevy-cheatbook.github.io/programming/res.html
PID制御ーロボットへの道１

PID制御とは、
・比例・微分・積分を使った制御だよ！
・ロボットの動きを安定させる（目標を定める）だよ！
・ライントレースにも使える。温度調整にも使われるよ！（フィードバック制御）
このPID制御は、「倒立振子」というロボットでも使われているよ！

特徴を、以下に列挙！
積分制御で、過去のずれの合計を制御する。
また、制御で起こる問題として、差があまりないと制御が弱くなる。
「定常状態」で、積分制御するとオフセットに対応できる。
逆に制御が強すぎると、「ハンチング」が起きる。
これに対して、制御を弱くすることが必要になる。すると、滑らかな動きになる。

「PID制御」は、モーターを使ったロボットで使われるぜ！
「倒立振子」のYoutube動画が流行っているぜ。マシンを大きく傾けると、車輪の回転速度が上がるぞ。つまり、目標から離れているときは、制御を強くして目標に近いときは、制御を弱くするのだ。
この制御の強さの割合は、「係数」の大きさを変えるだけでよいので、制御マシンの入門としてお勧めだぜ！
この倒立振子に必要な部品として、ジャイロセンサーが挙げられるぞ。これを、ArudinoやRasberryパイに実装させて、次回作ってみるぜ！！！

自分はハッカソンでステッピングモーターを使い、ミニクレーンを作った。
必要なモーターとして、「ステッピングモーター」が挙げられる。
ステッピングモーターは角度を指定して回転させることができる。特色は、以下である。
・位置制御は、モーターの角速度を積分するよ。すなわち速度を積分して、回転角度にするよよ。位置制御に関しては、フィードバック制御が可能で、速度の調整を行うことができるよよよ。
・原理としては、ローレンツ力の公式　F=qvBで表せられて、ローレツ力の向きはフレミングの左手の法則に従うよーん。
・回転角度がデジタル入力によるパルスの数に比例するので、位置（回転角度）の制御が容易であるよよーん。

次に、自作ロボットに実装させたい機能を挙げる。
・音声に反応して、動きを変えるっ！
「赤揚げて、白上げないで、赤揚げて！」の動きを実践させるっっ！！
この「～しない」をきちんと音声認識させないといけない。英語だと、”Don’ｔ～”
で分かりやすいが、日本語の場合、文末まできちんと聞かないと意味が変わることがあるっっっ！！！
・姿勢制御に、四元数を使ってみる。Ｐｙｔｈｏｎで行列計算を行う！！！
クオータニオンを使うよっ！（メリットあり。複素数を使った計算。）

＜以下、自作ロボット政策のその手順など、走り書き。＞
ライブラリAnacondaをインストール　→ライブラリが豊富。Matlab系・

import numpy as np
x = np.arange(0, 10, 0.1)
data[:, 1] >>> [1列目]
・・・
＜動的システムとは！＞
過去から現在までの⼊⼒で現在の出⼒が決まる。

→ メモリ必要 ＝ 微分⽅程式
微分方程式→状態方程式（行列）→重み関数（インパルス入力）→複素フーリエ変換

・MatPlotで作図
・プラ版でデザイン、できれば用紙で模型ぽくしたい！

以上ですょ。記事を書いたことで、
マシンを作る気力が湧きましたぞ！
秋葉原ロボット部のブースで展示予定よ！お楽しみにっっっ！！！

参考文献
「倒立振子」小中学生向けPID制御　倒れないロボット作り　全編」
https://www.youtube.com/watch?v=cpGoYb0IzDY
Emacsでripgrepと連携するrg.elの紹介

メリークリスマス！[Emacs Advent Calendar](https://qiita.com/advent-calendar/2024/emacs)です。
本稿では、Emacsのパッケージであるrg.elを紹介します。

## 動作の様子

rg.elをインストール後、rgコマンドが利用できます。
実行すると、

- 検索ワード
- 検索ファイル種類、
- 検索ディレクトリ

の入力を求められ、入力した条件でripgrepによる検索結果を出します。

例えばEmacsソースファイルで`native`を検索すると下のようになります。
また、`h`を押すとヘルプが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42721/1080fe1e-5425-c3fa-fb1d-f1f7f801d99f.png)

## rg.elの良さ

rg.elの良さは見やすさだけでなく、検索結果から次の検索に繋げやすいことです。

検索作業というのは往々にしてちょっと修正して次の検索を、を繰り返しがちです。
なかなか1回で目的の検索結果とならないこと、多いですよね。
rg.elでは、この繰り返し作業に便利なショートカットが用意されています。

例えばヘルプ画面にも表示されていますが、

- `r`: 検索ワードを変更
- `f`: 対象ファイル種を変更
- `d`: 検索ディレクトリの変更
- `c`: 大文字小文字の差を無視するかのオンオフ
- `i`: 無視設定のオン・オフ

などができます。
便利ですね。

また、プロジェクトを対象とする`rg-project`コマンドも用意してくれています。
便利ですね。

## まとめ

- Emacsとripgrepを連携するrg.elはいいぞ
- Emacsの設定沼は楽しい
Storybook v8アップデート対応メモ(2024/11実施)

## 概要

Storybookのバージョンアップに伴う対応を行った。
基本的に[Migration guide for Storybook 8.0](https://storybook.js.org/docs/migration-guide)通りに実施すれば問題はなかったが、少し修正作業も必要だったため、その内容を記載する。 

## 環境情報

- React: 18.2.0
- Storybook: 7.5.3

以下、Storybook関連のパッケージのバージョン情報

```json
{
  "dependencies": {
    "@storybook/addon-a11y": "^7.5.3",
    "@storybook/addon-designs": "^7.0.9",
    "@storybook/addon-essentials": "^7.5.3",
    "@storybook/addon-interactions": "^7.6.13",
    "@storybook/addon-links": "^7.5.3",
    "@storybook/addon-storysource": "^7.5.3",
    "@storybook/blocks": "^7.5.3",
    "@storybook/jest": "^0.2.3",
    "@storybook/react": "^7.5.3",
    "@storybook/react-vite": "^7.5.3",
    "@storybook/test-runner": "^0.17.0",
    "@storybook/testing-library": "^0.2.2",
    "eslint-plugin-storybook": "^0.6.15",
    "storybook": "^7.5.3",
  },
  "devDependencies": {
    "eslint-plugin-storybook": "^0.6.15",
    "storybook": "^7.5.3",
  }
}
```


## 実施内容

マイグレーションガイドに従い、以下のコマンドを実行。

```bash
npx storybook@latest upgrade
```
  
`visual-tests-addon`のインストールでエラーが出てインストールできなかったが、今回は導入を見送ったので、そのまま進めた。(理由は後述)

自動実行で大体のアップデートが完了して大きな問題はなかったが、自分の環境では以下の対応が必要だった。

### useGlobalsを使用したエラー

`.storybook/preview.ts`のdecoratorの処理の中で[`useGlobals`](https://storybook.js.org/docs/addons/addons-api#useglobals)を使用している箇所がある。
そこでは現在のStorybookの色のThemeを取得している。

```javascript
const [{ theme }] = useGlobals();
```

`useGlobals`はStorybook7のときは@storybook/addonsからimportしていたが、今回のアップデートにより、＠storybook/addonsは削除されたため、エラーが発生した。  

@storybook/addonsからimportしていた機能は@storybook/preview-apiか@storybook/manager-apiから利用できるとのこと。[Removal of deprecated features](https://storybook.js.org/docs/addons/addon-migration-guide#removal-of-deprecated-features)。


Storybookのドキュメントを見ると、`useGlobals`は`@storybook/manager-api`から利用importしている例が多かったので、その通りにしてみたが、以下のようにエラーが発生した。


```javascript
import { useGlobals } from "@storybook/manager-api";

// エラー：Cannot read properties of undefined (reading 'getGlobals')
const [{ theme }] = useGlobals();
```

代わりに`@storybook/preview-api`からuseGlobalsをimportすると、これまでと同様に動作した。

```javascript
import { useGlobals } from "@storybook/preview-api";

const [{ theme }] = useGlobals();
```

どうやら`useGlobals`などStorybookのhooksをdecoratorsやstoriesで使用する場合は、`@storybook/preview-api`からimportする必要があるよう。
[full migration notes](https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#deprecations-which-are-now-removed)に載っていた。

>Storybook users have had access to a few storybook-lifecycle hooks such as useChannel, useParameter, useStorybookState; when these hooks are used in panels, they should be imported from @storybook/manager-api. When these hooks are used in decorators/stories, they should be imported from @storybook/preview-api.




## その他
### visual-test-addonのインストール検討
Storybook8では`visual-test-addon`がリリースされたのことが大きな変更点の一つだが、今回は導入しなかった。  
軽く調べてみて、料金がどのようにかかるのかわからなかったり、そもそもの導入事例の情報も少なかったため、今回は導入を見送った。  


## まとめ

基本的にStorybookのマイグレーションに従えばv7からv8へのアップデートはスムーズだったが、やはり一部環境によって手こずるところもあった。  
また、今回は`visual-test-addon`の導入を見送ったが、今後の世間の動向を見て、導入を検討していきたい。
Web制作者必見！ImageMagickで画像を最適化する方法【容量削減・SEO対策】

## はじめに
Webサイトの表示速度は、ユーザーエクスペリエンスだけでなく、SEOにも大きく影響します。

Googleは、Core Web Vitalsという指標でサイトの表示速度を評価しており、ページの読み込み速度が遅いサイトは検索順位が下がる可能性があります。

画像の最適化は、Webサイトの表示速度を改善するための重要な要素の一つです。

しかし、画像を一枚一枚手作業で最適化するのは大変な作業です。

そこで今回は、コマンドラインツール「ImageMagick」を使って、画像を一括で最適化する方法を紹介します。

ImageMagickを使えば、画像のサイズ変更、フォーマット変換、圧縮などを簡単に行うことができます。

この記事では、ImageMagickの基本的な使い方から、Webサイトの表示速度向上に役立つ実践的なテクニックまで解説します。

ぜひ最後まで読んで、ImageMagickをマスターしてください！

## 対象者
Homebrew入ってるMacユーザー
またはWindowsなどでUbuntuを使っているユーザー

## インストール

### ・Mac
```
brew install imagemagick
```
### ・Ubuntu/Devian
```
sudo apt-get install imagemagick
```


### インストールできたか確認
```
convert -version
```
インストール成功できていれば以下のような表示が出る。
```
ImageMagick 7.1.1-41 Q16-HDRI aarch64 22504 https://imagemagick.org
Copyright: (C) 1999 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP
Delegates (built-in): bzlib fontconfig freetype gslib heic jng jp2 jpeg jxl lcms lqr ltdl lzma openexr png ps raw tiff webp xml zlib zstd
Compiler: clang (16.0.0)
```

# コマンド類

### ・ディレクトリ内のarwを一括フォーマット
```
mogrify -format jpg /path/to/directory/*.ARW
```

または、対象ディレクトリに移動してから
```
mogrify -format jpg *.ARW
```
```
mogrify -format png *.ARW
```
```
mogrify -format webp *.ARW
```

## オプション -quality
画質を劣化させるが、大幅に軽量化できる。
80%の画質に圧縮する場合
```
mogrify -format webp -quality 80 *.arw
```

## オプション2 -lossless
webp変換時のみ、-losslessを使える
画質を劣化させずに軽量化できる。
```
mogrify -format webp -lossless *.ARW
```

## サイズ変更
### ・縦横比を維持したまま、幅を512px以下に統一
```
mogrify -resize 512> *.jpg
```

### ・縦横比を維持したまま、高さを512px以下に統一
```
mogrify -resize x512< *.jpg
```
【合格体験記】AWS認定クラウドプラクティショナー(CLF-C02)


!![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3067127/ea602845-4588-169a-d3cf-8e9a79db37dd.png)

**AWS認定クラウドプラクティショナー(CLF-C02)**に**合格**いたしましたぁぁ！
せっかく合格したのでまとめてみました。
参考にしていただければと思います。


# 経歴
エンジニア歴 3年(バックエンド, フロンのエンド担当)
インフラ未経験

# 経緯
今後インフラ周りも携わりたいと考え、手始めに初級編の資格を勉強するところから始めようと考えたためです。

# 勉強期間
最初に目指した期間: 2週間
結局かかった期間: 4週間
**内訳:**
平日, 休日: 1～2時間程度
試験日２週間前～: 4時間程度

**※ 初学者は短期間で取得できるだろうと思わないほうがいいと思います。**
というのも、AWSサービスを触ってないため、サービスのイメージが全く分からない！
そのため、取得するのに**1か月**かかった。

# 勉強方法

**使った参考書**
AWS教科書 AWS認定クラウドプラクティショナー テキスト＆問題集
https://www.amazon.co.jp/dp/4798183253/


**問題集**
cloud-license
https://cloud-license.com/

**→正直これ繰り返しやれば問題ない！！
激おすすめ！！**

**勉強方法**　
①「AWS教科書 AWS認定クラウドプラクティショナー テキスト＆問題集」を一通り一気見する。(2日くらい)

自分は土日を使って一気読みしました。
**→読み終わるまでのスパンは短ければ短いほどいい**

②cloud-licenseを解く
自分は60セクションほどを利用した。(1セクション7問構成)
cloud-licenseでは全部で78セクション用意されています。


**1周目**
**問題を解く => 問題の該当部分を参考書に戻って読む。=> 理解する　=> 次の問題を解く**
上記を繰り返していく。

最初はこの流れをするのに時間がかかり焦りを感じた。
60セクションもの問題を解いていくと、同じような問題に出くわすことが増え知識がどんどん定着していく。

**ワンポイントアドバイス**
* 問題を解いた後に、どういう問題か**分類**をする
例) 理解して解けた問題、たまたま解けた問題等<br>
理解して解けた問題を除外するイメージで、とにかく怪しいかもと思った問題はもう一度解くために印をつける(cloud-licenseにその機能がある)<br>

* 復習
一度解いた問題は隙間時間等でもう一度解く。
例) 当日5セクションを触れた場合 => 2日後に間違った問題をもう一度解いてみる。<br>
脳は簡単に**忘れるもの**なので、時間がたった後に**もう一度触れる**ことを意識しました。
60セクションを一周する間に各セクション2回は触れた。(本当はもっと触れたかったが時間的な都合上無理でした。)


**2周目**
**×になったものを徹底的に繰り返しやる**
→**60セクションもやっている、かつ、復習もしている問題**で×になっているものは自分の中で理解しきれていない部分！
そこに絞って繰り返し問題を解いた。
HTMLの罠：簡単すぎてJavascriptに手を伸ばせなかった話

こんにちは！この記事では、僕がなぜJavascriptに手を出すのが遅くなったのか、そして最近どのように触れられるようになったのかを共有します。

## HTMLは簡単すぎた

最初にWeb開発に触れたとき、HTMLは直感的で簡単でした。例えば、以下のようなコードでテキストや画像を配置できることに感動しました。

```html
<!DOCTYPE html>
<html>
<head>
  <title>簡単なページ</title>
</head>
<body>
  <h1>こんにちは、世界！</h1>
  <p>これはテストページです。</p>
  <img src="example.jpg" alt="テスト画像">
</body>
</html>
```

このシンプルさに慣れてしまった僕は、「Javascript？それって本当に必要？」と思うようになりました。

## Javascriptに対する壁

HTMLの手軽さに比べて、Javascriptは少し複雑そうに感じました。特に、以下のようなコードを見たときには混乱しました。

```js
document.addEventListener('DOMContentLoaded', function() {
  document.querySelector('button').addEventListener('click', function() {
    alert('ボタンがクリックされました！');
  });
});
```

「何これ？HTMLだけじゃ無理なの？」と考え、Javascriptを敬遠していました。

## 最近Javascriptに触れるようになったきっかけ

しかし、ある時「Webサイトに動きを付けたい」と思うようになり、避けては通れないJavascriptに挑戦することにしました。最初は簡単なことから始めました。

例えば、以下のコードを実際に試してみて、HTMLとJavascriptの連携の楽しさを実感しました。

```js
function changeText() {
  document.getElementById('text').textContent = 'テキストが変わりました！';
}
```

対応するHTML:

```html
<!DOCTYPE html>
<html>
<body>
  <p id="text">元のテキスト</p>
  <button onclick="changeText()">テキストを変更</button>
</body>
</html>
```

少しずつJavascriptのコードを書くことが楽しくなり、今では日常的に使っています。

## Javascriptの学習におすすめのサイト

Javascriptを学ぶ中で最もに参考になったのが **Progate** です。このサイトは初心者向けに丁寧な解説と実践的な演習が用意されています。僕も以下のページから学習をスタートしました。

https://prog-8.com/lessons/es6/study/1

このサイトの良いところは、ブラウザ上でコードを書いてすぐに実行できるところです。わざわざ開発環境を用意しなくてもすぐに学習を始められるので、Javascript初心者にはぴったりです！

## まとめ

HTMLのシンプルさに甘えていた僕ですが、Javascriptに挑戦することでWeb開発の新しい楽しみを見つけることができました。もしJavascriptに壁を感じている人がいたら、小さなステップから始めてみることをお勧めします！

読んでいただきありがとうございました！
出力: LEDマトリクスのhello world

### 背景
LEDマトリクスには英数字を表示することができますので、hello worldと表示させてみます。

### Scratch
文字列表示のブロックはマトリクスのところにありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/99df5146-fba2-5345-a451-24b813588a18.png)

「Hello Worldと文字列を表示する。
　文字列はスクロール表示する。
　スクロールし終わったら、表示をクリアする。」

せっかくなのでスクロール表示のブロックへの指定は変数を使いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/8a119ad7-1003-225d-970f-4c9f0425fbc5.png)

終了確認用に赤色を表示しました。

スクロール表示のブロックのwaitのところをクリックすると「続ける」になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/18d01390-9748-e530-91b9-c1e9531dce87.png)

この状態でスタートを押すと、Hが表示しかけてすぐにマトリクスがクリアされました。
どうやら、この「続ける」は表示が終わる前に処理を続けるということのようです。

試しにディレイを入れてあげるとスクロール表示が行われました。
待っている間の確認用にフロントのLEDを点灯させました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/2bb093e8-320d-f6bb-1f7d-b4cf3db6c2fc.png)

### spheroV2
sphero_edu.pyのメソッドを参考に同様な動作をするスクリプトを作成しました。

```
import time

from spherov2 import scanner
from spherov2.sphero_edu import EventType, SpheroEduAPI
from spherov2.types import Color

from spherov2.utils import FrameRotationOptions

import os

import pygame

print("Testing Starting...")
print("Connecting to Bolt...")
toy = scanner.find_BOLT()

if toy is not None:
    print("Connected.")
    with SpheroEduAPI(toy) as api:
        pygame.mixer.init(frequency=44100)

        api.set_stabilization(False)

        api.scroll_matrix_text("hello world", Color(r=50, g=50, b=250), 15, True)
        time.sleep(3)

        api.clear_matrix()

        api.set_main_led(Color(r=50, g=0, b=0)) #Sets whole Matrix
        time.sleep(1)

else:
    print("Failed to connect to Sphero.")

  
```

実行結果はこちらのようになりました。
ここではworldのoの途中まで表示した時点でマトリクスがクリアされました。
```
git\spherov2.py\spherov2\test>python BoltTest_matrix2.py
pygame 2.6.1 (SDL 2.28.4, Python 3.12.7)
Hello from the pygame community. https://www.pygame.org/contribute.html
Testing Starting...
Connecting to Bolt...
Connected.
```

sphero_edu.pyのscroll_matrix_textメソッドを見ると、waitについては未実装のようです。


### まとめ
Scratchの文字表示スクロールを作成してみました。
waitは文字数とスクロール速度から計算したディレイ時間を追加するとよいかもしれません。
VPNを建てたら有線でネットに繋がらなくなった話

## 現在以下のような構成でPC環境を整えています。
    ONU
    ↓
    ハブ
    ↓
    メインPC、VPNマシン、その他

VPNマシンでVPNを構築したあと、よくわからない問題が発生しました。

### VPNをシャットダウンもしくはVPNマシンをシャットダウンするとメインPCがインターネット通信できなくなるという問題です。
VPNを起動するとインターネット通信ができるようになりました。
これのせいで余計な電気代がかかるようになってしまい、とても不便に思っていました。
インターネット上で検索をかけたところで、問題解決の記事などは一切ありませんでした。
そこで、ChatGPTで検索をかけてみるとデフォルトゲートウェイの設定を変更することで、直るという文言がありました。
半信半疑で行ってみると、意外にもすんなりとVPNなしでインターネット通信ができるようになりました。

### なぜ、インターネット通信ができるようになったのか、考えてみたいと思います。
少し前まではハブの部分が、Baffaloのルーターをアクセスポイント設定で挟んでありました。
しかしながら、ポート数が足りないということでTPLinkの8ポートギガビットハブに変更し、その直後にVPNを構築しました。
知識がなかったのですが、Baffalo経由の際は **192.168.0.xxx**でDHCPが割り当てられていました。
しかし、TPLinkは**192.168.30.xxx**で割り振られており、これが根本の原因だったと考えています。
とある記事によると、デフォルトゲートウェイが一つのLANに複数個存在すると迷ってしまい、通信が正しく行われなくなるというのです。

ということで、Windowsの設定からデフォルトゲートウェイを192.168.30.1から192.168.0.1に変更することで正しく通信が行われるようになり、VPNサーバーをシャットダウンしておくことが可能になりました。
Unityでエクスプローラーを開いて特定の拡張子のファイルのみ選択させる

# ■はじめに
UnityでPhotoshopで画像を読み込むときと同じように、拡張子を選択するとその拡張子のファイルのみが表示されるような挙動をランタイムで動くように実装したかったでのやってみた。

![targetpicture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/8fef8997-6da1-b89d-00d2-60ae0839949f.png)

# ■環境
Unity 6000.0.23f1

# 参考

- 最シンプルでランタイムで動かす場合の参考元(今回は別のやり方)

https://qiita.com/nkjzm/items/7a3bac223a8ad89fb520

# ■使わせてもらうもの
ここのDownload Packageから.unitypackageをゲッチュ。

https://github.com/gkngkc/UnityStandaloneFileBrowser?tab=readme-ov-file

# ■コード
```
/// <summary>
/// 一つだけ選択されたファイルのパスを返す
/// </summary>
/// <param name="_title">(*1)で表示される文字</param>
/// <param name="_openPath">(*2)最初に開くパス</param>
/// <param name="_extensions">(*3)選択できる拡張子一覧</param>
/// <returns>選択されたファイルのパス</returns>
public string OpenAndGetFilePath(string _title,string _openPath, string[] _extensions)
{
    // 表示するファイルの拡張子を設定
    var extensions = new[]
    {
        //第一引数は拡張子の説明用名前、第二引数はstring[]なので、
        //以下の様に拡張子を直に指定しても、この関数の_extensionsを使っても良い。
        //_extensionsを使う場合は、[png][jpg][jpeg]の様な任意の拡張子を指定するstringの配列になっている必要がある
        new ExtensionFilter("Image Files", "png", "jpg", "jpeg", "bmp"),
        // new ExtensionFilter("Image Files", _extensions),
    };

    //ここでエクスプローラーを開いて、選択されたファイルのパスが返ってくる。
    //OpenFilePanelAsyncにして、コールバック関数を指定するやり方もできる。
    string[] paths = StandaloneFileBrowser.OpenFilePanel(_title, _openPath, extensions, false);
    // StandaloneFileBrowser.OpenFilePanelAsync(_title, _openPath, extensions, false, paths =>
    // {
    //     if (paths != null && paths.Length > 0)
    //     {
    //         UnityEngine.Debug.Log($"指定されたファイルのパス => {paths[0]}");   
    //     }
    // });

    if (paths.Length > 0 && !string.IsNullOrEmpty(paths[0]))
    {
        UnityEngine.Debug.Log($"選択したファイルのパス => {paths[0]}");
        return paths[0];
    }
    
    //ファイルが選択されずにキャンセル等された場合も含まれる
    UnityEngine.Debug.LogWarning($"パスが異常でした => {paths}");
    return "";
}
```


### (*1)_title
ここの文字
![title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/4d3d0732-5a9b-eeaa-0385-da65d900fdf1.png)

### (*2)_openPath
開くフォルダ。
ここでは画像を選択させるためにピクチャーフォルダを開きたかったので、以下の様に指定している。
```
var openPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
```


### (*3)_extensions
こんな感じで指定している。
```
    var extensions = new string[]
    {
        "png",
        "jpg",
        "jpeg",
        "bmp",
    };
```


# 拡張
- 今回は1ファイルのみ選択してほしい状況だったので、StandaloneFileBrowser.OpenFilePanelの第三引数はfalseになっていますが、これをtrueにすると複数ファイルまとめて選択ができます。
- もしPhotoshopみたいに拡張子の説明名と拡張子を何個も設定したい場合は、
ExtensionFilterの数を増やせばOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951067/11b2e910-415b-c220-280d-9f79951acec0.png)
拡張子の説明名と拡張子リストをセットで構造体等にまとめてリスト等で渡したらこれができる。

# 最後に
最近成城石井で買ってみたTEARTHのはちみつチャイが美味しい。
duコマンドを使い、簡単にディレクトリサイズ計算

du（Disk Usage）コマンドは、指定したディレクトリやファイルのディスク使用量を表示するためのツールです。以下の基本構文を覚えておきましょう。

```sh
du [オプション] [パス]
```

例えば、`/var/logs` ディレクトリのサイズを確認したい場合は以下のコマンドを実行します。

```
du -sh /var/logs
```

オプションの意味
-s（--summarize）: 合計サイズのみを表示。
-h（--human-readable）: 出力を人間が読みやすい形式（KB、MB、GBなど）に変換。

```
1.2G    /var/logs
```

### サブディレクトリごとのサイズを確認

```
du -h /path/to/directory
```

例: /var/logディレクトリ内を確認する場合。

```
du -h /var/logs
```

```
4.0K    /var/log/cups
16K     /var/log/httpd
44M     /var/log
```
RPC

>メッセージを遠隔のホストに送り、応答をもらうことは、プログラミング言語の関数の呼び出しと非常に似ている。どちらの場合も、一つ以上のパラメターを与えることで始まり、結果を得る。
この観点から、手続き呼び出しの形で、ネットワーク上での要求応答インタラクションを取り決めるという試みがなされた。その扱いをより身近なものにする。

# ユーザーからは見えないように関数化している
>プログラムが遠隔のホスト上にある手続きを呼び出すことを可能にすることである。マシン１上のあるプロセスがマシン２上の手続きを呼び出す際、1の呼び出されプロセスは中断し、呼び出された手続き2の上で実行される。情報は、`呼び出し側から呼び出された側へとパラメータとして転送され、手続きの結果として戻される`。メッセージ・パッシングは`プログラマからは見えない`。この手法は、RPC(Remote Rrocedure Cell:遠隔手続き呼び出し）として知られ、多くのネットワーキング・アプリケーションの基礎となっている

### クライアントスタブ、サーバースタブを用いて関数化をしている
>RPCの裏にあるアイデアは、遠隔手続き呼び出しをできるだけローカルなものに見えるようにすることである。もっとも単純な形では、遠隔手続きを呼び出すために、`クライアント・プログラムはクライアント・スタブ(client stub)`と呼ばれる小さなライブラリ手続きに結び付けられる。このクライアント・スタブはクライアントのアドレス空間におけるサーバー手続きを示す。同様に、`サーバーはサーバー・スタブ（server stab)`と呼ばれる手続きと結びつけられる。

### 引数としてパラメータをサーバーに渡すしてネットワークコミュニケーションが行われる
>クライアント手続きとクライアント・スタブは同じアドレス空間に存在するために、パラメータは通常通りに渡される。同様に、サーバー手続きはそのアドレス空間に存在するある手続きによって、予期したパラメータとともに呼び出され流。サーバーは手続きにとって、変わったことは何もない。このようにソケット上でI/Oを実行する代わりに、通常の手続き呼び出しと同様に利用しているように見せかけて、ネットワークコミュニケーションが行われる。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
異文化組織と仕事をするコツ

この記事は [株式会社TRAILBLAZER Advent Calendar 2024](https://qiita.com/advent-calendar/2024/trail-blazer) の12日目の記事です。

---
こんにちは、株式会社TRAILBLAZER（トレイルブレイザー、以下トレブレ）ソリューション事業部で部長をやっている直井です。アドベントカレンダー三度目の登場になります。

今日は「異文化組織と仕事をするコツ」についてお話したいと思います。
地域、国籍、宗教、性別、人間は千差万別です。同じ日本の会社組織でも、メンバーシップ型やジョブ型の違いがあったりします。
前職から現在まで、様々な文化の異なる組織にいた経験から、こうやって働くと良いよ！というヒントをお話できればと思います。

メンバーシップ型やジョブ型の違いについては、8日目の記事「[イノベーションを生む組織作りへの挑戦 ～異なる文化とつながりを活かして未来を創る～](https://qiita.com/TRAILBLAZER/items/cee1399e68ad6210de01)」をあわせて読んでもらえると分かりやすいです。

## **目次**
- [前職の話](#前職の話)
- [現在の話](#)
- [自分が気をつけていること](#自分が気をつけていること)
- [締めの宣伝](#締めの宣伝)

## **前職の話**
前職は公用語が英語なことで有名なEC大手の某IT企業で、アプリケーションエンジニアやエンジニアマネージャーをやっとりました。

英語が公用語なこともあって、開発組織は外国の方がたくさんいました。退職するくらいの時点の感覚ですが、自分がいた開発組織のだいたい6割くらいが外国籍で、その半分くらいは日本語喋れなかった気がします。
さらに、自分の担当組織は日本人が自分だけの時もあったり、日本、海外支社、オフショアと、かなり多国籍だったと思います。

余談ですが、飲み会の企画が大変でした。宗教上の理由で牛NG＆豚NG、生魚食べる文化無い、関係無いけど鶏肉嫌い、みたいな感じで、どんな店に行けば良いんだ？ってなってました。ちなみに、モロッコ料理がオススメですｗ

また、買収も多い会社だったので、買収先の会社に行って、一緒に組織作ったりなんてこともちょいちょいありました。

そんな感じで、前職では、いわゆるダイバーシティだけでなく、同じ日本でも背景や文化の違う組織との仕事も経験しています。

## **現在の話**
弊社トレブレはJR西日本のグループ会社です。
ソリューション事業部は、JR西日本のプロダクト開発を支援・推進していて、ネット系メガベンチャーやスタートアップなど、いわゆるジョブ型の組織出身で複数回転職しているメンバが集まっています。
一方、一緒に仕事をしているJR西日本は新卒採用を基本としたメンバシップ型の組織です。

ということで、現在は同じ日本の会社ですが、文化が異なる組織と仕事をしていることになります。

## **自分が気をつけていること**
こういった経験から自分が気をつけていることをいくつか紹介したいと思います。

### 汎用的なこと
- とにかく一回受け入れて理解してみる。
全ての行動には必ず理由があります。
自分の経験からすると、受け入れ難かったり、違うんじゃね？って思うことでも、
相手の意見を尊重して、一回受け入れて理解してみます。
その結果、流石にそれはねーよってなることもありますが、
その時にはもう理解できているので、頭ごなしに否定するのではなく、前向きなアプローチが取れます。
- メリットとデメリットを提示して会話する。
上記の通り、自分とは違えど、何らかの行動原理が必ずあるので、そこを念頭に置いて会話します。
何かをやって欲しい時は、その人にとって利があるのか、損にならないかを考えます。
特にこっちに合わせて欲しい時は、メリットの方に天秤が傾くような提案をします。
- ハッキリ言う時はハッキリ言う。
文化が異なるとコンテキストも異なることもあるので、時には多少空気読まないくらいハッキリ伝えることも必要です。
日本人はハイコンテキストなので、ちょっと苦手な人が多いとは思いますが、
曖昧な言い方をすると、だいたいその文化の中での常識に合わせて都合良く捉えてしまいがちなので、
ここは頑張ってみてください。

### 多国籍＆マルチロケーションの場合
- チーム全員が使える言語で仕事する。
要するに、英語で仕事します。
日本人だけだったり、日本語できるメンバだけの会議でも、議事録の共有相手に日本語できない人がいたら、会話は日本語でも議事録は英語で書きます。
ドキュメントも当然英語で書きます。ビジネス側や協力会社など、英語苦手な人がいたりもするので、日英併記にすることも多かったです。
- 英語で話す時は諦めない。
これとても重要。
繰り返し伝えたり、筆談を駆使したり、とにかくちゃんと理解してもらえるまで頑張ります。
自分も話すのはそこまで得意じゃないので、心の中で「ゴメン！」って思いながら、何回も説明してました。
- （開発者向け）表示されるテキストは言語設定ファイルにまとめる。
日本人向けサービスで日本語表示なのに、エンジニアが日本語分からない、みたいなケースでは、
PRDや設計時点で、表示テキスト全部に番号などのIDを割り振っておきます。
IDだけだと訳分からんので、英語で説明も書いておきます。
実装の時は、IDと表示テキストの組み合わせをまとめた言語設定ファイルを読み込んで表示するようにします。
こうすると、あんま事故らないです。あと、テストも書きやすいです。
- 時差がある場合でも、1日1回ハドルやる。
おはようございますの人もいれば、お疲れ様でしたの人もいる、それでもみんなで集まる。
スクラムでやっていたのもありますが、デイリーハドルは必ずやるようにしていました。
ロケーションが一番マルチすぎた時は、HQが日本、エンジニアは東南アジアとヨーロッパ、PDMが中近東、ビジネスの一部がアメリカ西海岸とロンドンでしたｗ
日本と東南アジアが一番多かったのですが、ハドルは午後3時スタートでした。
それでも、早朝寝起き組と夜寝る前組がいたので、流石に合わせきれなかったですね。

書いてみると結構当たり前な内容ですが、意識して実践するのは意外と難しかったりしますね。

## **締めの宣伝**
いかがでしたか？
今回は異文化組織と仕事をするコツについて説明してみました。
異文化組織関係無く使えることが多かったかもですね。

最後に、トレブレでは一緒に働くメンバーを募集中です。
こんな記事でも興味が出たそこのあなた、ちょっとクリックしてみませんか？

ということで、本日の記事はここまで。
読んでくれたみなさん、ありがとうございましたー

https://hrmos.co/pages/trail-blazer/jobs/2000002

https://hrmos.co/pages/trail-blazer/jobs/2000006

https://hrmos.co/pages/trail-blazer
今までを軽く振り返ってみる

# この記事は？
この記事は、「[長野高専アドベントカレンダー 2024 13日目](https://qiita.com/advent-calendar/2024/nnct)」の記事となります。
またこの記事は、私[くりすた](https://x.com/Cr1sta_dev)が今までにやってきたことなどを軽く振り返る記事となります。今までやってきたことをまとめておかないと、ポートフォリオに書くとなったときに忘れるんですよね... そのため技術的なお話はあまりなく、まためんどくさがり屋というのもあって参考にはならないと思いますが最後までご一読ください。:bow:

# 高専入学(1年次)
この時は、Discordにハマっていました。そのため一回Discord.jsでBotを作りはしたものの、Node.jsのエラーがわからず挫折した記憶があります。
また、この時からMinecraftサーバーの運営をしていたり、Minecraftのデータパックも書いていたりしましたね... あとは初めて高専プロコンに参加しました。

# 2年次
このころからNode.jsと同時並行でJavaを少し進めていました。データパックにだんだん飽きてJavaでプラグインを作ろうとしていましたが、オブジェクト指向に慣れず、すぐ辞めました。ただ、Node.jsを使ってDiscordのBotを一通りJavaScriptで実行することはできました。(ソースコード紛失)

# 3年次
フロントエンド周りをやり始めたのはこの時からでした。Reactというライブラリを知り、見てみたもののちょっと難しいと感じ、Vueのほうを先に進めました。文化祭では、Vueとその派生のNuxt3を使ったWebサイトを作ったり、自身のポートフォリオ的なのも作りました。ポートフォリオは現行のものです。
あと、12月ごろに初めてTypeScriptを触ってライブラリを作るなどしました。そのライブラリは内部で使うためなのでnpm等での公開はしてません。

https://crystaworld1221.com

# 4年次
今年は、インターン先でC#とBlazorを行ったり、Reactをやるなどフロント周りをより一層やった気がします。他には、Rustも触り始めたぐらいですかね...? TauriでWin32APIを使うにRustの知識がないときついので猛勉強中です。あと謎に今年からデザインにこだわりを持つようになって現在のポートフォリオをアップデートする予定です。(アニメーションも導入するなど今までに比べてデザインの面ではかなりいいかもしれません)

# 振り返ってみて
ここまで、やってきたことを書きましたが、挫折→トライ→ハマるの繰り返しなんですよね...
もっと早くトライしてやってみたかったというのもありますが、ここまでできたのもChat GPTの影響があったりします。昨年から生成AIが何かと話題になり、Chat GPTやGithub Copilotにより開発体験が向上したため、わからないところを気軽にAIに聞くことによって早めに解決できるようになったのが大きいです。

# やりたいこと
今までトライまでの時間が長かったせいでやりたいことがまだまだ山積みです。今年も残り少ないですが、来年は次に挑戦してみたいですね。
- 基本情報技術者試験合格
- 競技プログラミング(競プロ)に挑戦

ここら辺はぜひやってみたいです。競プロは頑張って茶色に行けるようにしたいですね。アルゴリズムはまだ勉強できていないのでこれをきっかけに勉強したいです。

# おわりに
この記事にそこまで役に立つような内容はないですが、今何かに詰まっているのなら何かしらの手段を使って解決するか、ほかのことをやるとかのほうがいいです。時間がだんだん足りなくなって後悔します。
とりあえずここまでにしておきましょう。それでは:wave:
AI系の人がソフトウェア開発に挑戦するならこのUdemy講座がオススメ！

# はじめに

機械学習を活かして価値を創出するには、単に優れたモデルを作るだけでは十分ではありません。モデルを本番環境で安定稼働させ、ユーザーに届け、改善を続けるためには、ソフトウェア開発の知識とスキルが欠かせません。

本記事では、AI系の人が隣接領域（SQL、データベース、サーバーサイドエンジニアリング、API開発、Docker、コンテナ、CI/CD、GitHub Actions、ソフトウェアテスト、セキュリティなど）を効率よく習得し、ビジネス価値につなげるためのUdemy講座をご紹介します。

情報が点在するさまざまなトピックを独学で網羅するのは至難の業です。そこで、一気通貫で習得できるUdemy講座を活用することで、よりスムーズに「つよつよエンジニア」への第一歩を踏み出せるでしょう。


# おすすめのUdemy講座

## レンタルサーバーで始めるサーバーサイドエンジニアのためのPythonを使った個人開発プロセスとポートフォリオ構築
**初心者で一から始めてPythonやFlaskを取り巻くシステムのエコシステムを理解し、ビジネス理解を得てつよつよエンジニアへの一歩を踏み出そう**

https://www.udemy.com/course/python-flask-business/

この講座は、PythonとFlaskを使ったWebアプリ構築を通して、サーバーサイド開発に必要な基礎から応用までを体系的に学べる設計となっています。実際に学んでみて、AI系の人（私自身を含む）がソフトウェア開発に挑戦する際に、とても役立つ内容だと思いました。


# おすすめしたい理由

## 1. 幅広いトピックを網羅
この講座は全14セクション、78のレクチャーで構成されており、AIエンジニアにとって必要な隣接領域を学ぶことができます：
- **GitHubやDockerなどのソフトウェア開発技術**: 必要なソフトウェア開発技術をまとめて習得（セクション2）
- **データベース設計**: Flaskを用いたデータベース接続、MySQLサーバーやテーブルの作成（セクション7）
- **API開発**: Flaskを使ったシンプルなAPI開発方法を解説（セクション12）
- **ソフトウェアテストの基礎と応用**: pytestやGitHub Actionsを学び、コードの品質向上に貢献（セクション13）
など


## 2. 講師の方の実績

講師の方は、[書籍の出版](https://www.amazon.co.jp/-/en/dp/B0DKDLPKVD/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)や[10以上のUdemyコースを公開](https://www.udemy.com/user/yuki-saito-7/)されている経験豊富なエンジニアの方です。
実際、私はこの講師の方の別のUdemy講座（[【実戦で学ぶ基盤構築】ローカル端末で作り理解するエンジニアのための機械学習基盤の作成とMLOps](https://www.udemy.com/course/mlops-pf-and-ml/)）を先に受講しました。そのUdemy講座もとてもわかりやすく、実践的で多くの学びがありました。この講師の方が公開されている他の講座にも興味を持ち、本講座にたどり着きました。
講師の方の経験に基づく具体的な学びが詰まっている点も、この講座をおすすめする理由です。

## 3. 実践的なプロジェクトを通じた学習

この講座のもう一つの魅力は、実践的なアプローチです。単なる理論の解説にとどまらず、実際に手を動かしながら、学んだ内容を即座に試せる構成になっています。PythonやFlaskを使った開発環境の構築から、APIやデータベースの設計、Dockerまで、ソフトウェア開発に必要とされるプロセスを一通り体験できます。
このUdemy講座を修了する頃には、ソフトウェア開発の実践的な知識が身についていることを実感できると思います。

## おわりに

AIだけでなくソフトウェア開発スキルを身につけることで、機械学習をより実践的に活用できます。しかし、どこから手をつけるべきか、何を優先して学ぶべきか迷うことも多いと思います。今回ご紹介したUdemy講座は、そうした課題を解決するための最適な学習リソースです。一つの講座で、SQL、API開発、Docker、CI/CDなどの隣接領域を一気通貫で学べるため、効率よくソフトウェア開発スキルを習得できます。実践的なプロジェクトを通じて学ぶことで、学んだ知識をすぐに試せる構成になっています。この講座が、AIとソフトウェア開発の壁を越えるための第一歩となれば嬉しいです。
（私も頑張ります！）
カラーユニバーサルデザイン実装支援ツールを作りました！

:::note
[アクセシビリティ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/accessibility) の13日目です。
:::

こんにちは :smiley:  tatata-keshiです:exclamation: 

私は普段、PHPフレームワークのLaravelを利用したWebアプリケーション開発を主に行なっております。

今回は、そんな私がエンジニア向けに開発した**カラーユニバーサルデザインを意識したフロントエンド開発を支援するツール**について紹介します。

## そもそもカラーユニバーサルデザインって何？

カラーユニバーサルデザインとは、色覚異常のように「色」の認識の仕方が他の人と異なるユーザーでも同等の情報を取得できるような色の組み合わせを用いたデザインのことです。

https://cudo.jp/?page_id=74

カラーユニバーサルデザインの具体例として、下記のサイトの例がわかりやすいと思います。

https://cudo.jp/?page_id=86

## ツールの紹介
エンジニアがホームページやWebアプリケーションを実装する際に、カラーユニバーサルデザインに準じたUI実装をできるように支援することを目的として作成したのが、この「Chrome CUD Helper」です。

https://github.com/tatata-keshi/chrome-cud-helper

こちらはGoogle Chromeの拡張機能であり、以下の二つの機能を持っています。

:::note
1. 色覚異常シミュレーション機能
1. 色比較ツール
:::

### 色覚異常シミュレーション機能の紹介

拡張機能のアイコンをクリックすると表示されるメニューでフィルターを切り替えることによって、それぞれの色覚異常の視点をシミュレートするフィルターが適用されます。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945858/d0a69cb7-78e1-e00d-2d46-8d7913a001d6.png)

### 色比較ツールの紹介

色覚異常シミュレーション機能のポップアップにある「メニューを開く」ボタンを選択すると表示されるメニューでは、表示しているWebページの要素を選択肢その要素の色を抽出することができます。中央のRGBそれぞれのスライダーを操作することで色を調節することも可能です。
先述のシミュレーション機能と組み合わせることにより、色覚異常者視点だと見分けがつきづらい色の組み合わせを特定・修正することができます。

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945858/388a2250-6c1d-db00-999e-ff6ca0410525.png)

## ツールの導入方法

現在はChromeウェブストアには公開していないため、[github](https://github.com/tatata-keshi/chrome-cud-helper)からzipファイルをダウンロードし、解凍したファイルをchromeに読み込ませる必要があります。

[チュートリアルページ](https://tatata-keshi.github.io/tutorial-for-chrome-cud-helper/#installation)では詳細なインストール方法や使用方法を紹介しています。ぜひ確認してください。

https://tatata-keshi.github.io/tutorial-for-chrome-cud-helper/#installatio
NetSuiteの開発生産性向上chrome拡張機能：NetSuite Scripted Records

## はじめに

NetSuite開発及び利用において、私自身、他にもインストールしていますが、NetSuite開発の生産性に寄与するchrome拡張機能を今日は1つだけ、ご紹介します。

:::note info
これはほんの一部です。Chromeウェブストアで"NetSuite"と検索すると色々出てきますので、皆さんお試しください。
:::

:::note warn
　本投稿は、今回ご紹介した機能を完全に保証するものでは御座いません。実際の制約等は、拡張機能自身の説明にてご理解ください。
:::

# 1.NetSuite Scripted Records
  これは利用している画面(レコード画面)で使用されているクライアントスクリプト、ユーザーイベントスクリプト、ワークフローの一覧を参照することが出来ます。当該画面に関連するスクリプト、ワークフローが一元的に参照できるので、これも何気に便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114483/44e22dc0-07be-7aba-3b1b-0b82919acc2d.png)

## さいごに
 冒頭でも述べましたが、NetSUiteを開発、利用する際に便利機能はまだまだ存在します。これを機に色々試してみてはいかがでしょうか？
「Reactで負荷を減らすために気をつけたほうがいいこと」集

最近Reactにハマッています。

仮想DOMフル使用、やたら難解なライフサイクルフックの仕様など少々時代に逆行気味な気もしますが、豊富なエコシステムとシンプルなjsx記法はやっぱり書いてて楽しいですね。

Hooksを始めとするReactの仕様を正しく理解してデータの取り扱いを工夫して無駄なレンダリング・繰り返し処理を減らし、少しでも動作を軽くするために実装の改善案をまとめてみました。

### 1. コンポーネント内での初期データ取得・加工は極力避ける。

[こちらの記事](https://zenn.dev/uhyo/articles/useeffect-taught-by-extremist)でも言われていますが、「ReactはあくまでUIライブラリだからUI以外の事はやるべきではない」というのは鉄則です。

Webアプリの初回起動時にREST APiやサーバー内のenvファイル(TauriやElectronならconfigなど)を非同期処理で読み込んでデータを取得し、
アプリに必要なデータを加工して準備するのは大抵のTypescript処理で行っていると思いますが、これをReactのコンポーネント内で行ってしまうと無駄なレンダリングの温床となってしまいます。

```tsx:App.tsx(改修前)
function App() {
  const [config, setConfig] = useState() //初回データ取得用のstate

  useEffect(() => {
    //ここでデータの取得・加工を実行

    setState(//取得したデータを設定)
  }, [])
  return (
    <>
      ...コンポーネント
    </>
  )
}

export default App

```
確かにuseEffectの第二変数に空配列[]を渡すことで一回のみのonMounted的な処理が可能ですが、コンポーネントの状態によってはデータが取得できない可能性もありますし、
何よりデータ取得の実行タイミングを開発者側でコントロール出来ないという致命的な欠陥があり、予期せぬ不具合の原因にもなりかねません。

Reactをマウントする直前のTypescript処理内で必要なデータを取得・加工してからコンポーネントに渡す流れの方がいいでしょう。

```tsx:main.tsx(改修後)
import App from './App.tsx'

const initConfig = async() => {
  //ここでデータ取得を実行
}

initConfig().then(() => {
  createRoot(document.getElementById('root')!).render(
    <StrictMode>
      <App config={//取得・加工したデータ}/>
    </StrictMode>,
  )
})

```

```tsx:App.tsx(改修後)
function App(props:{config:***}) {//渡されたデータをpropsで受け取る
  const [config, setConfig] = useState(props.config)//stateの初期値
  
  useEffect(() => {
    
  }, [])
  return (
    <>
      ...コンポーネント
    </>
  )
}

export default App

```

propsで加工したデータを受け取ってからuseStateの初期値とすることでデータの堅牢性を高めつつ柔軟な運用が可能になります。


### 2. レンダリングを伴うhooksの更新は必要でない限り極力避ける。

Reactを学習する上でまず多用するのがuseStateのhooksだと思いますが、VueのrefやSvelteの$stateと違い画面描画で使用されていなくても値が変化するだけで画面が再レンダリングされるという副作用があります。
条件分岐用のフラグとして使用したり変更監視用の反復処理の中で繰り返し更新を掛けてしまうと画面の負荷が極端に重くなってしまいます。
```tsx:App.tsx(改修前)
  const [value, setValue] = useState(props.config)//stateの初期値

  const updateValue = (newValue) => {//この関数が呼び出される度に画面が再レンダリングされる
    setValue(newValue)
  }
```

useState変数を更新する箇所を極力限定し、更新の際にも「本当に変更の必要はあるのか」を判断させるように処理を実装することで画面の再レンダリングを極力抑えて画面のパフォーマンスを向上させることが出来ます。

```tsx:App.tsx(改修後)
  const [value, setValue] = useState(props.config)//stateの初期値

  const updateValue = (newValue) => {//この関数が呼び出される度に画面が再レンダリングされる
    if(value !== newValue){
      setValue(newValue) //値が違う場合のみ更新する。
    }
  }
```

### 3. 画面描画に関係ない、けど永続化したい変数にはuseRefを使おう

ReactにはuseRefというhookもあります。useStateと同じように画面がレンダリングされても保持される変数を作成できるのですが、useStateと違い変更されても画面が再レンダリングされません。
再レンダリングを起こさないため画面上の表示データには残念ながら使用できませんが、内部の条件分岐に使うフラグやRESTのエンドポイントなどstateが参照する変数として利用できます。

コンポーネントで1回だけ実行したい処理がある場合はuseEffectの第二引数に空配列[]を渡すことで実現できますが、開発環境では何故か2回実行されるという変な仕様があります。
useRefを使って1回だけの処理にフラグを実装することで必ず一回だけ実行される処理を作ることも出来ます。
stateと違いフラグの変更時に画面は再レンダリングされません。

```tsx:App.tsx
  const initFlag = useRef(false)
  const [config setConfig] = useState()

  useEffect(() => {
    if(!initFlag.current){
      //configの初期化処理

      initFlag.current = true
    }
  }, [config])

```

### まとめ
Vueと違って無駄なレンダリングを起こしやすいReactですが、hooksの仕様を正しく把握してReactを本来のUIライブラリとしての役目に専念させることで簡単に動作の軽いWEBアプリを実現できます。
正しくReactを理解して楽しくUIを作っていきましょう！
Qiitaの記事の画像をGit管理するTips

# はじめに

こんにちは、梅雨です。

今回は、Qiita に投稿する記事の画像を Git で完全に管理するための Tips を紹介していこうと思います。

ここでいう画像とは、カメラで撮影される写真やパソコンのスクリーンショットのようなものではなく、複数の写真やテキスト、図形などの組み合わせによって構成されるものを指しています。

ちなみに、この方法は Qiita に限らず基本的にもどの投稿サイトやフロントエンドでも活用できるものになっているのでぜひ最後まで読んでみてください。

# Draw.io とは？

今回、画像を Git 管理する上で重要となってくるツールが**Draw.io**です。

https://www.drawio.com

Draw.io は無料の作図ツールで、Figma や Google Drawings のようなツールを想像してもらえれば問題ないです。

Draw.io 自体はそこまで高機能なわけではなく、そこそこ多くのアセットやテンプレートが用意されているシンプルなツールなのですが、VSCode の拡張機能である **Draw.io Integration** を用いると作図の体験が一気に変わります。

https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio

実際に VSCode でこの拡張機能を使ってみましょう。

プロジェクト内に `.drawio.svg` または `.drawio.png` を拡張子とするファイルを作成すると、Draw.io Integration がこれを認識して専用のエディタを起動してくれます。

![Screenshot 2024-12-12 at 20.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671591/642fc1b1-6c7f-4d72-f345-d6078b71d7ec.png)

このエディタで作図を行うことができます。

今回のデモでは以下のような画像を作ってみました。

![Screenshot 2024-12-12 at 20.21.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671591/3d8cc323-0e5c-e911-bc39-3e5499bd3e99.png)

画像の作成ができたら GitHub にリポジトリを作成しプッシュしましょう。

https://github.com/tsuyuni/drawio-demo/tree/main

# GitHub リポジトリの画像を マークダウンに埋め込む

ここまでできたらあと一息です。

以下の画像のように、リポジトリ内の画像のパーマリンクをコピーします。

![Screenshot 2024-12-12 at 20.30.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2671591/f4fef821-a6a0-6dc1-90ce-06e2fd044530.png)

今回の場合、パーマリンクは以下のようになりました。

[https://github.com/tsuyuni/drawio-demo/blob/742eae7cecb43170da96f4eea6ea483e94abb361/sample.drawio.png]()

ぱっと見、URL が `.png` で終わっているためそのまま画像として使えそうですが、ここで一工夫が必要となります。

```md
<!-- このままでは画像として展開されない -->
![](https://github.com/tsuyuni/drawio-demo/blob/742eae7cecb43170da96f4eea6ea483e94abb361/sample.drawio.png)

<!-- URLの末尾に "?raw=true" をつける -->
![](https://github.com/tsuyuni/drawio-demo/blob/742eae7cecb43170da96f4eea6ea483e94abb361/sample.drawio.png?raw=true)
```

URL末尾に `?raw=true` をつけることによって、以下のように画像が使えるようになりました。

![](https://github.com/tsuyuni/drawio-demo/blob/742eae7cecb43170da96f4eea6ea483e94abb361/sample.drawio.png?raw=true)

# おわりに

以上が、Qiita に投稿する記事の画像を Git で完全に管理するための Tips となります。

久しぶりに Qiita の記事を更新しようと思った時に、元の画像データがどこかいってしまっていた、なんてことを防げるのでぜひ積極的に活用してみてください。
AWSマネージドプレフィックスリスト使ってみた

この記事は [**セゾンテクノロジー Advent Calendar 2024**](https://qiita.com/advent-calendar/2024/saison-tech) 13日目の記事です。
シリーズ2は [**HULFT10**](https://www.hulft.com/software/hulft-10) のエンジニアによる投稿をお届けします。

# はじめに
AWSを利用していると、セキュリティグループやネットワークACLの設定で特定のIPアドレスレンジを許可または拒否する場面が多々あります。
テスト環境を作成する際にAWSと社内環境の接続を行うため、セキュリティグループにいつも決まった何個かの特定のIPを一個一個登録する作業、煩わしいですよね...？
プレフィックスリストはそんなあなた（自分）に向けての機能です。

# AWSマネージドプレフィックスリストとは？
AWSが管理するIPアドレスレンジのリストです。
これにより、最新のIPアドレスレンジを手動で更新する必要が無くなります。
例えば、Amazon S3やCloudFront等のサービスに対しアクセスを制限する場合、プレフィックスリストを利用することで簡単に設定が可能です。

# カスタマーマネージドプレフィックスリストとは？
その名の通り、ユーザー自身が管理することのできるIPアドレスレンジのリストです。
複数のセキュリティグループやネットワークACLに対して、一貫したIPアドレスレンジの設定を行うことが可能です。



# 実際に使用してみた
今回は実際にカスタマーマネージドプレフィックスリストを使用して、HULFT10 for Container Servicesの管理画面接続について、セキュリティグループの編集を行ってみようと思います。

### HULFT10 for Container Servicesの導入
初回導入部分については割愛します。
詳しくはこちらのマニュアルをご参照ください。

[スタートアップガイド（EC2）](https://www.hulft.com/help/ja-jp/HULFT-V10/CONT-SUG/)
[スタートアップガイド（Fargate）](https://www.hulft.com/help/ja-jp/HULFT-V10/CONT-SUGF/)

### カスタマーマネージドプレフィックスリストの作成
VPCダッシュボードからマネージドプレフィックスリストを選択し、プレフィックスリストを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943898/bb23e976-c028-a181-64dd-b2d46a0cf061.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943898/55ae45cf-934e-3a42-6c67-ddcc316ff321.png)
この時、プレフィックスリストの最大エントリ数を入力する際、注意点として以下が有ります。

:::note info
>リソース内でプレフィックスリストを参照する場合、プレフィックスリストのエントリの最大数は、リソースのエントリの数のクォータに対してカウントされます。例えば、エントリ数が 20 個のプレフィックスリストを作成し、セキュリティグループルール内でそのプレフィックスリストを参照する場合、セキュリティグループの 20 個のルールとしてカウントされます。
-- <cite>[マネージドプレフィックスリストを使用したネットワーク CIDR ブロックの統合と管理](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/managed-prefix-lists.html)</cite>
:::

つまり、最大エントリ数を10にした場合、実際のプレフィックスリストのエントリが1つしかなかった場合でも、セキュリティグループ上ではエントリ数が10としてカウントされてしまうという事です。
セキュリティグループのルールの割り当て数には上限があるため、最大エントリ数を余分に確保したことで上限に引っかからないように注意してください。

プレフィックスリスト作成後はセキュリティグループでプレフィックスリストIDを使用するため、メモに控えておいてください。

### セキュリティグループの編集
スタートアップガイドの[導入後の設定](https://www.hulft.com/help/ja-jp/HULFT-V10/CONT-SUGF/Content/HULFT_SUGF_CONT/aws_marketplace/aws_after_introduction_settings.htm?tocpath=1.%20AWS%20Marketplace%E3%81%8B%E3%82%89%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%7C_____5)より、「HULFT10への接続を許可するIPリストの更新」を参考にし、セキュリティグループの編集を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943898/b1e835a1-12e3-a3b2-143a-a03a66343ba8.png)

先ほど登録したプレフィックスリストIDをソースに登録します。

### 接続確認
プレフィックスリストに登録されているIPからHULFT10 for Container Servicesの管理画面へ接続してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3943898/4cf4fa94-ab98-ca3d-f374-40ef93ae9d62.png)


管理画面が表示できたので、問題無くIPが登録されていることが確認出来ました。
# 使ってみた感想
プレフィックスリストは一見地味に見えますが、自分はこの機能のおかげでテスト環境の構築で面倒に感じていた設定がかなり省略できるようになりました。
まだまだAWS機能は知らないものだらけなので、どんなものでもちょっとずつ実験しながら業務に使えそうなものは無いか？をこれからも考えていきたいです。
スクラム開発導入成果

## 導入経緯
チーム開発としての課題として「継続して、チーム全員が参加できる作品作り」が上がっていました。
どうにかクリアする術はないかと考えた時、私が現場でスクラム開発をしており取り入れたらうまく進むかも！と思い提案したことがきっかけで始まりました。
## 本チーム開発によるスクラムイベントの置き換え
以下の内容を考慮しスクラムイベントの内容や時間を置き換えて実施しました。
- 月に１回全体で顔を合わせて作業や打ち合わせができるタイミングがある
- それ以外はリモート通話やSNSでのやり取りで連携する

**スクラムイベントの置き換え**
- １スプリント1ヶ月
- スプリントの始まりと終わりは全体会のタイミングとする
- スプリントプランニング(約30~45分)：全体会時に実施
- スプリントレビュー(約10~15分)：全体会時に実施
- レトロスペクティブ(約30分)：全体会時に実施
- デイリースクラム(約10~15分)：大体週に１回でリモートで実施する
:::note alert
全体でデイリースクラムをするのは日程調整が難しいため今回はさらに３チームに分けてそれぞれのチームごとにデイリースクラムを実施しました。
:::

## 各種使用ツール
- 進捗管理：Jira Service Management
- ドキュメント管理：Confluence
- ソース管理：Bitbucket
:::note info
<font color="Red">**いずれもAtlassian製品を使用しツール間の連携を意識して使用しました。**</font>
:::

## スクラム開発をしてみて良かった点
- **スクラム、アジャイル開発についての知識がついた**
- 週に１回のミーティングは良かった
→軌道修正が早い段階でできる、質問しやすい
- しっかりとプランニングしてから進めれたため、やることが明確なのが良かった

## スクラム開発をしてみてわかった点
- 役割が不十分だといまいち
→エンドユーザー、プロダクトオーナーなどの立ち位置が中途半端だった
- **このチーム開発では無理にスクラム(アジャイル開発)で行う必要はなさそう**
→やはりしっかりと<font color="Red">**役割とイベントを遂行して初めてスクラムの良さが出る**</font>

## 今回を踏まえての今後の進め方
- 今回のスクラム開発導入で**取り入れられる点はたくさん得られた！**
- これらを基に<font color="Red">**以下の課題を考慮できるような開発フレームワークを作成していきたいです**</font>
    - 時期リーダー、サブリーダーの育成
    - 一部のメンバーに作業が偏っていたためうまく作業を分担する