OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptのデコレーター入門

### TypeScriptのデコレーター入門

TypeScriptのデコレーターは、クラスやメソッドなどに特定の加工を実装するための機能です。これは、コードをシンプルにし、再利用性を高めるのに役立ちます。

この記事では、TypeScriptで使用可能な四種のデコレーターについて解説し、各タイプの簡単な例を提供します。

---

#### 1. クラス・デコレーター

クラスに定義された時点で実行されるデコレーターです。例えば、ログを出力するような加工を追加したい場合に便利です。

```typescript
function LogClass(constructor: Function) {
  console.log(`Class ${constructor.name} が作成されました。`);
}

@LogClass
class Example {
  constructor(public message: string) {
    console.log(this.message);
  }
}

// 実行結果
const example = new Example("Hello, Decorator!");
```

#### 2. メソッド・デコレーター

メソッドの定義や実行を加工するためのデコレーターです。例えば、自動的にログを出力したり、判定を追加したりできます。

```typescript
function LogMethod(
  target: any,
  propertyKey: string,
  descriptor: PropertyDescriptor
) {
  const originalMethod = descriptor.value;

  descriptor.value = function (...args: any[]) {
    console.log(`Method ${propertyKey} が呼び出されました。`);
    return originalMethod.apply(this, args);
  };
}

class Example {
  @LogMethod
  sayHello(name: string) {
    console.log(`Hello, ${name}!`);
  }
}

// 実行結果
const example = new Example();
example.sayHello("World");
```

#### 3. プロパティ・デコレーター

プロパティに加工を追加したい場合に使用します。たとえば、特定のプロパティにバリデーションを追加することが可能です。

```typescript
function LogProperty(target: any, propertyKey: string) {
  console.log(`Property ${propertyKey} が定義されました。`);
}

class Example {
  @LogProperty
  message: string;

  constructor(message: string) {
    this.message = message;
  }
}

// 実行結果
const example = new Example("Hello, Decorator!");
```

#### 4. パラメータ・デコレーター

メソッドの参数に加工を追加したい場合に使用されます。

```typescript
function LogParameter(
  target: any,
  propertyKey: string,
  parameterIndex: number
) {
  console.log(`Parameter at index ${parameterIndex} がメソッド ${propertyKey} で定義されました。`);
}

class Example {
  sayHello(@LogParameter name: string) {
    console.log(`Hello, ${name}!`);
  }
}

// 実行結果
const example = new Example();
example.sayHello("World");
```

---

これで、TypeScriptのデコレーターの基本的な使い方を理解できました。デコレーターは、ユーザー定義の函数やプロパティバリデーションを加えるのに最適です。
Windowsが起動しなくなった場合のディスクの確認の注意点 (2024年12月版)

# はじめに
Windowsが急に起動しなくなった場合の対処方法として、スタートアップから修復する方法が良く紹介されていますが、修復どころかWindowsの再インストールもできない場合はPCの物理的な故障が疑われます。

個人で修理する場合は物理的に故障している箇所を特定して部品を交換する作業が必要になりますが、WindowsをインストールしていたディスクがM.2規格のものだと取り出して確認するのも少々手間です。

このような場合、USBからブート可能なOSを用意するのも一つの手と思います。
USBブート可能なWindowsPEを使用して定番のCrystalDiskInfoから状態を
確認する方法は割とポピュラーらしく素晴らしい解説記事がたくさんあります。

今回はそのような記事を参考に作業したにもかかわらず、割とやらかしてしまいましたので
今後の戒めとして以下に残しておきます。

# Windows ADKは忘れずにインストールしよう(1敗)
WindowsPE作成にはadksetup.exeとadkwinpesetup.exeが必要になるのですが、
WindowsPEの文字につられてadksetup.exeインストールせずに、スタートメニューに
Windows Kitsが作成されないと小一時間悩んでしまいました…
どちらも以下のリンクから取得できます。
https://learn.microsoft.com/ja-jp/windows-hardware/get-started/adk-install

# イメージ変更後はコミットを忘れないようにしよう(2敗)
WindowsPEにアプリケーションを追加する場合、WindowsPEのディスクイメージに
アプリケーションを追加後コミットする必要があります。
コミットを忘れてイメージをUSBに書き込みと、WindowsPEが起動したときに
何も追加されてない状態で？？？となりますので注意しましょう。

# ファイルは見える…が必ず復旧できるわけではない(3敗)
なんやかんやありましたが、WindowsPEが起動してCrystalDiskInfoから
ディスクが破損していることが分かりました。

>NG:NVM subsystem reliability has been degraded.
NG:Media has been placed in Read Only Mode.

ディスクにはアクセスできましたが、XCOPYでファイルをコピーしようとしたところ
アクセス拒否。見えるけど見えないもの。

これは失敗ではありませんが、故障を安易に考えてはダメだということで記載しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3966355/c0244542-0fd3-50a0-9b41-ce202796e882.png)

# さいごに
何ごともちゃんと手順どおりにやりましょう。
思い込みダメぜったい。
Thunkable/App Inventorでアプリ開発を学ぼう

昨年より、中高生を対象としたビジネス＆アプリコンテスト [Technovation Girls](https://www.technovation.waffle-waffle.org)(略してTG)の日本チームのメンターとしてサポートさせてもらっています [@imk2o](https://github.com/imk2o)です。
今回はこのTGで利用している開発ツールについて紹介したいと思います。

大人がプログラミングを学ぶのであればJavaScriptやPythonなどから始めてもよいのかもしれませんが、中高生が対象となると比較的ハードルが高いと考えています。**まずは自分のアイディアが実現でき、その面白さを実感できること** が大切だと私は思います。

そこでTGのカリキュラムでは[Thunkable](https://thunkable.com)と[App Inventor](https://appinventor.mit.edu)という、ブロックプログラミングによる開発ツールを採用しています。どちらも教育用ブロックプログラミング環境[Sctrach](https://scratch.mit.edu)のような操作感で、モバイルアプリを制作できる開発環境になっています。

| Thunkable | App Inventor |
| -- | -- |
| <img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/6a38acae-5a44-e3ef-383d-75ee7c283625.png"> | <img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/bf184656-bcb6-a58c-90d6-0a03b1963a6c.png"> |

> ThunkableはApp Inventorから派生したサービスで、
> App InventorはScratchと同じMITが開発したものです。

## 誰でも使える？
App Inventorはアカウント登録すればすべて無料で利用できます。
Thunkableの無料アカウントは作成できるプロジェクト数や画面数、一部機能に対する制限はありますが、すぐに利用することができます。

どちらもWebブラウザ上で開発を行うことができます。
UIエディタで画面レイアウトを作成し、ブロックエディタでその振る舞いをコーディングするという形ですので、すぐに慣れるのではないかと思います。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/62d7fbae-3761-75c6-f596-26db34d6bb8b.png">

## Thunkable/App Inventorどこが違うの？

[こちら](https://technovationchallenge.org/ja/courses/junior-division-curriculum/lessons/exploring-mobile-app-builders/)に比較表が載っていますが、特徴的な違いをピックアップしてみます。

* Thunkableの良いところ
  - エディタが比較的使いやすい
  - DBやSaaS、APIに接続しやすい
  - Webブラウザ内で動作確認できる
  - プロジェクトの共同編集に対応(Pro版)
* App Inventorの良いところ
  - エディタが日本語対応
  - センサー値取得、チャート機能などが豊富

Thukableはソーシャルや外部連携が多いアプリ、App Inventorはデバイス中心のアプリが作りやすいのではないかと思います。機能的な違いはありますが、原点が同じこともあり使用感は似ているところが多いです。

## Thunkable/App Inventorの使い方を知りたい！

[TG公式のカリキュラム](https://technovationchallenge.org/ja/courses/junior-division-curriculum/)に、それぞれを用いたレッスンやサンプルがありますので、まずこちらを参照してもらうとイメージを掴みやすいと思います。
(日本語訳はWaffleメンバーと一緒にがんばりました！)

あとは英語になりますが、公式ドキュメントがあります。

* [Thunkable Docs](https://docs.thunkable.com)
* [App Inventor Documentation](https://appinventor.mit.edu/explore/library)

## Thunkable/App Inventorの実用性は？
どちらも基本的なUIコンポーネントはあるものの、精細なレイアウトや外観設定を行えるわけではありません。デバイス機能の利用や外部連携にも制限があるので、**ネイティブと遜色ないアプリを作ることは難しい** かなと思います。また単独のアプリとして配布するためのパッケージ化を行うことは可能であるものの、通常のiOS/Androidアプリと同様の準備が要りますので、敷居は高いです。

ただプログラミング学習に加え、プロトタイピングや検証を目的としたアプリ制作であれば、良い入門環境ではないかと思います。

## まとめ
Thunkable/App Inventorはプログラミング言語より敷居の低い、プログラミング初学者向けの開発ツールです。ソフトウェア開発の基礎を学んだり、プロトタイピングにも活用できるのではないかと思います。これをきっかけにアプリ開発の楽しさを知り、更なるステップアップを目指す方が増えてくれると嬉しいです！
API Best Practices ~各RPCメソッドに対してユニークなリクエストとレスポンスを作成する

## 各RPCメソッドに対してユニークなリクエストとレスポンスを作成する

https://protobuf.dev/programming-guides/api/#propagate-status-codes

各RPCメソッドに対して、ユニークなリクエストとレスポンスを作成してください。
後からトップレベルのリクエストやレスポンスを分岐するのはコストがかかります。
これには「空の」レスポンスも含まれます。
well-known Emptyメッセージタイプを再利用するのではなく、ユニークな空のレスポンスプロトを作成してください。

### メッセージの再利用

メッセージを再利用するには、複数のリクエストとレスポンスプロトに含める共有「ドメイン」メッセージ型を作成します。
リクエストとレスポンスの型ではなく、これらの型の観点からアプリケーションロジックを記述します。

```ptoro
message ListHogeResponse {
  repeated Hoge hoges = 1;
  string next_page_token = 2;
}

// ドメインメッセージ型 これを再利用する
message Hoge {
    string id = 1;
    string name = 2;
}
```

これにより、メソッドのリクエスト/レスポンス型を独立して進化させることができますが、論理的なサブユニットのコードを共有できます。
CORSの設定とプリフライトが発生する条件

# 背景
こんにちは。エンジニアのKennieです！
開発をしていた際にフロントエンドからバックエンドにリクエストを送る必要がありましたが、リクエストがうまく処理されず、送信されていませんでした。調べていくと、CORSの設定を適切に行うことで問題を解決できたので、そこで学んだことをまとめようと思います！

# リクエストが処理されなかった原因
開発をしていた際にリクエスト処理がされなかった原因は、同一オリジンポリシーの制限によるものでした。同一オリジンとは、プロトコル、ドメイン、ポート番号がすべて同じであることを指します。同一オリジンポリシーは、上記３つのいずれかが異なれば、異なるオリジン間でのリソースアクセスを制限する仕組みです。今回の開発では、フロントエンドがポート9000、バックエンドがポート3000を使っていたため、制限を受け、リクエストが送信されませんでした。この際にCORSという仕組みを使ってリソースアクセスの制限を解除し、リクエストを送信することができました。

# CORSとは
CORSとは異なるオリジン間でのリソース共有を許可する仕組みです。CORSを適切に設定することで同一オリジンポリシーによるリソースへのアクセスの制限を解除することができます。今回の開発ではオリジン、メソッド、ヘッダーの制限がかかっていたので、そちらの解除をしました。

```golang
func EnableCORS(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Access-Control-Allow-Origin", "http://localhost:3000")
		w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
		if r.Method == http.MethodOptions {
			w.WriteHeader(http.StatusOK)
			return
		}
		next.ServeHTTP(w, r)
	})
}
```

#### オリジンの制限の解除
```w.Header().Set("Access-Control-Allow-Origin", "http://localhost:3000) ```
どのオリジンにアクセスできるかを指定、localhost:3000からのアクセスを許可しています。

#### メソッドの制限の解除
```w.Header().Set("Access-Control-Allow-Origin","GET, POST, PUT, DELETE, OPTIONS")```
どのメソッドにアクセスできるかを指定、GET, POST, PUT, DELETE, OPTIONSのメソッドのアクセスを許可しています。

#### ヘッダーの制限の解除
``` w.Header().Set("Access-Control-Allow-Headers", "Content-Type") ```
どのヘッダーにアクセスできるかを指定、Content-Typeのヘッダーを許可しています。

オリジンと、メソッドと、ヘッダーの規制の解除をしたことによってブラウザからのリクエストを送信することができました。

なお、今回の実装では、プリフライトリクエストを通じてCORSの規制を緩和しました。

## プリフライトリクエストとは
実際のリクエストを送信する前に、OPTIONSリクエストを送信し、そのリクエストが許可されているかどうかを確認する仕組みです。安全性が確認されていないHTTPメソッドやカスタムヘッダー、特定のContent-Typeを含む場合に使用されます。これにより、サーバーとクライアントの間で安全な通信を保証します。
プリフライトリクエスト（OPTIONS）が発生するのは、具体的には以下の条件に該当するときです。

#### 1. HTTPメソッドが制限外のもの
以下に該当しないメソッドを追加した場合：
```GET``` ,```HEAD```, ```POST```

#### 2. カスタムヘッダーが含まれる場合
以下に該当しないカスタムヘッダーを追加した場合:
```Accept```, ```Accept-Language``` ,```Content-Language``` ,```Content-Type```

#### 3. Content-Type が特定の値以外
以下に該当しないContent-Typeを使用した場合
```application/x-www-form-urlencoded```
```multipart/form-data```
```text/plain```

#### 4. リクエストがクロスオリジンである場合
上記のいずれかの条件を満たしている場合に限り、クロスオリジンリクエストでプリフライトが発生します。

今回の開発ではこれらの条件に当てはまるリソースを使用していたので、プリフライトが発生していました。

# まとめ
今回の開発では、CORSを設定することでリクエストの送信を可能にしました。具体的には、オリジン、メソッド、ヘッダーの制限を緩和し、ブラウザからのリクエストを送信できるようにしました。また、CORS設定に加え、プリフライトリクエストについての理解を深めることができました。
競技プログラミングでの生成AI使用可否を調べる

# はじめに
この記事は[競技プログラミングなんでも Advent Calendar 2024](https://qiita.com/advent-calendar/2024/any-competitive-programming)の16日目の記事です。

https://openai.com/index/learning-to-reason-with-llms/

>OpenAI o1 ranks in the 89th percentile on competitive programming questions (Codeforces), 

>OpenAI o1 は、競技プログラミング問題 (Codeforces) で 89 パーセンタイルにランクインし、

と冒頭に記載されており、記事の中では、GPT-4oでは人間の参加者の下位１１％だったものが、上位７％に入る性能に、この短期間でなったことが示されています。
普通の人間ではもはや敵わない。

>Finally, we simulated competitive programming contests hosted by Codeforces to demonstrate this model’s coding skill. Our evaluations closely matched competition rules and allowed for 10 submissions. GPT-4o achieved an Elo rating3 of 808, which is in the 11th percentile of human competitors. This model far exceeded both GPT-4o and o1—it achieved an Elo rating of 1807, performing better than 93% of competitors.

>最後に、Codeforces が主催する競技プログラミング コンテストをシミュレートして、このモデルのコーディング スキルを実証しました。私たちの評価はコンテストのルールとほぼ一致しており、10 件の応募が可能でした。 GPT-4o は、Elo レーティング 3 808 を達成しました。これは、人間の競合他社の 11 パーセンタイルに含まれます。このモデルは GPT-4o と o1 の両方をはるかに上回り、Elo 評価 1807 を達成し、競合他社の 93% よりも優れたパフォーマンスを示しました。

そうすると、競技プログラミングのレギュレーションも、AIの使用を禁止して人間の頭だけでの勝負とするのか、なんでも使って良い無差別級の勝負とするのか、コンテストの運営主体が規定することになると思います。
そこで、現状どうなっているのか調べてみようと思いました。

参考：

https://qiita.com/ekusiadadus/items/3f90b63197b5e1379953

# 各競技プログラミングの関連規定

## AtCoder
https://info.atcoder.jp/entry/llm-rules-ja

* AtCoder Beginner Contest（ABC）と AtCoder Regular Contest (Div. 2) （ARC Div. 2）のコンテスト中では原則使用禁止。
* AtCoder Grand Contest, AtCoder Regular Contest (Div. 1), AtCoder Heuristic Contestなどは、このルールの対象外。過去問練習には適用されない。


参考：旧版

https://info.atcoder.jp/entry/llm-abc-rules-ja


## Codeforces

https://mirror.codeforces.com/blog/entry/133941

(↑コメント欄も興味深かった）

* コンテストの参加にのみ適用
* 問題文の翻訳とコード補完ツール (例: Copilot)の使用のみ許可
* 二人の参加者のコードが一致し、一致したコードが競技ラウンド前にインターネット上に公開されていない場合、これは不正行為の証拠とみなされる

# 終わりに

明確な定義を発見できないコンテストが多く、調査が十分でないかもしれません。
ご存知の方はコメントいただけますと嬉しいです。
Pythonのdefaultdictの挙動を理解する

# はじめに
業務でPythonを書いていてdefaultdictのネスト構造を使う機会があり、その挙動を理解するのに時間がかかったため、アウトプットとして記事を書きます。

# dictとdefaultdictの違いについて
dictとはKey,Valueを持った辞書構造(dictionary)型のことで、type関数で型を確認することができます。

```python
a = {'a': 1, 'b': 2}
print(type(a))
# 出力: <class 'dict'>
```

dictは存在しない要素にアクセスしようとすると、エラーが発生します。

```python
a = {'a': 1, 'b': 2}
print(a['a']) # 出力: 1
print(a['b']) # 出力: 2
# 存在しないキー
print(a['c']) # 出力: KeyError: 'c'
```

そこで、defaultdictを使用することでエラーを起こさずに値を生成できます。
defaultdict(int)を利用すると、存在しない要素にアクセスした時デフォルト値として0を設定します。

```python
from collections import defaultdict
a = defaultdict(int,{'a': 1, 'b': 2})
print(a) # 出力: defaultdict(<class 'int'>, {'a': 1, 'b': 2})
print(a['a']) # 出力: 1
print(a['b']) # 出力: 2
# 存在しないキー
print(a['c']) # 出力: 0
# アクセスしたためa['c']が自動で設定されている
print(a) # 出力: defaultdict(<class 'int'>, {'a': 1, 'b': 2, 'c': 0})
```

これを利用することで、アクセスの頻度分析などが簡単にできます。

```python
from collections import defaultdict

accesses = '''
example.com
example.net
example.org
example.com
example.net
example.com
'''
access_list = accesses.strip().split('\n')

access_frequency = defaultdict(int)
for access in access_list:
    # access_frequency[access]がまだない時は0+1、ある場合は+1をするという処理
    access_frequency[access]+=1

print(access_frequency)
# 出力: defaultdict(<class 'int'>, {'example.com': 3, 'example.net': 2, 'example.org': 1})
```

# defaultdictのネスト構造
先ほど挙げたアクセス分析のキーを2つにしたものを考えます。
access_frequency[url]から、access_frequency[date][url]になるイメージです。

```python
from collections import defaultdict

accesses = '''
12-01,example.com
12-01,example.net
12-02,example.org
12-02,example.com
12-03,example.net
12-03,example.com
'''
access_list = accesses.strip().split('\n')

access_frequency = defaultdict(lambda: defaultdict(int))
for access in access_list:
    date, url = access.split(',')
    access_frequency[date][url]+=1

print(access_frequency)
# 出力: {'12-01': defaultdict(<class 'int'>,
#                                  {'example.com': 1,
#                                   'example.net': 1}),
#       '12-02': defaultdict(<class 'int'>,
#                                  {'example.com': 1,
#                                   'example.org': 1}),
#       '12-03': defaultdict(<class 'int'>,
#                                  {'example.com': 1,
#                                   'example.net': 1})})
```

日付ごとのアクセスURLを集計できていることがわかります。

defaultdictのネスト構造について、参考にしていただけると幸いです。
【2025令和最新】Windows XPのライセンス認証をオンラインで行う

![Screenshot from 2024-12-20 15-29-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/3749826c-d2e6-c61c-f0dc-7336e2ec7ebd.png)


開発ソフトの動作確認用にWindows XPをインストールする機会があったのですが、「ライセンス認証サーバーと接続できません」と言われてしまいオンライン ライセンス認証で詰まったので備忘録として残しておきます。

:::note info
2024年現在でも、電話によるライセンス認証は特に何もしなくても可能です。
ただ、（やられたことのある方ならご存知でしょうが）めちゃくちゃ時間取られるので、私的にはオンライン認証のほうが好みです。
:::


## 必要なもの
- 正規のライセンス
- インターネットにつながった別のPC
- USBメモリなどのデータ転送媒体

## 必要なものをダウンロードする
1. Internet Explorer 8をMS公式からダウンロードする（DLページが消えているので直リンクです）
    1.  http://download.microsoft.com/download/0/5/7/05716044-2806-40DA-8332-D3ED79BC8F68/IE8-WindowsXP-x86-JPN.exe
1.  最新のルート証明書をダウンロードする
    1.  Windows2000界隈で有名な、黒翼猫さんという方が公開してくださっています。
    1.  https://win2k.org/wlu/wlu.htm
        1.  左側の手動Updateをクリックして、検索キーワードに「Update for Root Certificates」と入力して検索する
        1.  「Update for Root Certificates May 20xx/ルート証明書の更新プログラム」のリリース日が最新になっているものをダウンロードする
1.  WLUpdateをダウンロードする
    1.  https://win2k.org/blog/2020/03/23/1995327/
    1.  記事中のリンクから、最新のものをダウンロードする

ダウンロードしたら、XP環境にすべてコピーしてください。

## IEのアップデート
![Screenshot from 2024-12-20 15-47-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/ce78b238-48be-9cf6-1b37-e09b31b41641.png)

ダウンロードしたIE8-WindowsXP-x86-JPN.exeを実行して、更新します。特に詰まる点はないはずです。つるつるのロゴが懐かしい・・・
インストールが終わったら再起動してください。

## ルート証明書の更新

先程ダウンロードしたWLUpdate(wlupdate1x.cab)をダブルクリックして開き、中身を適当なフォルダにコピーします。

![Screenshot from 2024-12-20 15-31-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/573d49c1-0768-a5a7-bf3c-aefa0ff4a6c9.png)

コピーができたら、中にあるwlupdateという名前のVBScriptに、先ほどダウンロードしたルート証明書（rootsupd______.wlu）をドラッグ＆ドロップします。

数十秒待つと完了メッセージが出てくるので、確認後再起動します。

## ライセンス認証を行う
「スタート」→「すべてのプログラム」の中にライセンス認証があります。それを開いて、オンライン認証を行ってください。

以下のような表示になれば、成功です！

![Screenshot from 2024-12-20 15-31-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730661/52b2b774-06db-bfb9-0394-67b763cfb99a.png)
【ほぼマルチ向け】プレイヤーのUUIDについて超軽く調べた

[Minecraft Command Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mccmd) Series 2 Day 24 (2024/12/24)

---
超雑な記事です。
# 0. UUID調べる必要あった？
プレイヤーのUUIDって使われている場面見れるの？

ワールドのセーブデータにスコアボード以外は使われていますが、ゲームプレイでは使われていそうな感じはしません。

簡単に調べてみた結果、あることがわかったので今回は紹介します。
特にマルチでは為にならない雑学が入ったので是非読んでみてください。

:::note alert
重要
こちらの記事はv1.21.xで検証しています。
UUIDの歴史上NBTは1.16から仕様が変わっているので、1.15.2以前は順番が違う事があるかもしれません。
:::

# 1. UUIDを調べたきっかけ
自分は、あるマイクラの動画をYouTubeで見たとき、不思議なことを感じました。

それは、スペクテイターでテレポートメニューを表示していた時。


この順番ってどのサーバーでも同じやんって。

そう、この順番、なんか法則性があるんです。でないとこの順番にはならないはず。

Tabリストはプレイヤー名で並べ替えられていますが、このメニューはプレイヤー名では並べ替えられていません。

ということは…
UUIDを使っているということ。

# 2. アカウント買った時に付与されるUUIDについて
UUIDはマイクラアカウントを買った時に自動でランダムになるのか、何が規則性なのかを調べてみました。

まずアカウント買う前に決まっているのか。
ということで調べました。

https://ja.minecraft.wiki/w/%E8%A8%88%E7%AE%97%E6%A9%9F/UUID%E5%A4%89%E6%8F%9B

何も割り当てられていないアカウントにはオンラインUUIDがついていませんね。
でも、ここで1つ知った事、オフラインUUIDも存在するらしいです。なんじゃそりゃ。
なんかこっちはプレイヤー名で決まっていそうですね。
まぁオフラインなのでマルチでは使わないだろうという事で、今回はオンラインUUIDのみについて焦点を当てていきます。

ここでUUIDについての知識を1つ。

UUIDは次の書き方が基本です。

NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN

Nには0~9もしくはa~fが入ります。これは16進数の書き方となります。
UUIDには種類があり、種類番号が使われている場合もありますが、今回は詳細を省きます。
UUIDは1文字辺り4bitなので、2文字で1Bと計算します。

続いてマイクラのデータコマンドで入手したUUIDを見てみましょう。
マイクラのデータコマンドで入手すると10進数に自動的に置き換えられています。
```
[I; <-約21億~約21億>, <-約21億~約21億>, <-約21億~約21億>, <-約21億~約21億>]
```
これを見る限り、どうやら4B(8文字)で区切られています。
更に、1列目は4Bなのでそのまま10進数でも1列目に変換されていますが、2列目は2B、3列目も2Bなので、これは10進数では合わせて2列目になっている感じです。
5列目は24B(12文字)ありますが、前の4文字と後ろの8文字で10進数の3列目と4列目に分かれている模様。

# 3. 法則性について
今回はスペクテイターの順番とUUIDの法則性について調べます。
YouTubeの動画を勝手に借りました。ごめんね。
名前は伏せておきます。本当は伏せたくないけど一応。

まぁ自分が1番気になったのは、どの動画でも1番目にいた人を調べました。
すると16進数での先頭が81でした。

続いてどの動画でも1番後ろにいる人のUUIDを調べました。
すると16進数での先頭が7eでした。

このことから、8が先頭のアカウントが最初に来て、7が最後に来る、そんな感じだと思っていました。
これは10進数では8~fはマイナスだよとも読み取る事が出来ます。

つまり、
UUIDで最初の数字が低い-2147483648から順に並べ替えられているという事になります。
1列目が全く同じ場合は2列目、3列目へと続く感じですね。
(そもそも42億もアカウント作られていないから1列目でほぼ被らない)

# 4. 他にUUID順ってあるのだろうか？
個人的に1番気になった順番はコマンドexecute asの実行順についてです。

デフォルトの実行順序がセレクター引数のsortで決まるので、セレクター引数が[sort=arbitrary]を調べてみましたが、自分で試した結果Wikiに書いてある通りスポーン順でした…

https://ja.minecraft.wiki/w/%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%BB%E3%83%AC%E3%82%AF%E3%82%BF%E3%83%BC#%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%92%E6%95%B0%E5%88%B6%E9%99%90%E3%81%A7%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%82%80

# 5. データパックでもUUIDを使うようになった今(ほぼおまけ)
マルチに対応したデータパックで、現在UUIDが使われる事が非常に多くなったと自分では最近感じています。

UUIDはとても便利です。
- プレイヤーID変えてもプレイヤーデータと同じように維持される。
- 1.20.2のマクロ登場でストレージ名にUUIDがめっちゃ使いやすくなった。

マクロ登場により、
```
/function alpha:test with entity @s
```
```mcfunction namespace:alpha:test
$data modify storage alpha:playerstorage player."$(UUID)".test set value "winner"
```
みたいな感じにするだけで、簡単にプレイヤー専用のストレージを作れるようになりました。

しかもこれはUUIDを強制的にstringに変更しているだけなので、マイクラのアップデート以外で壊れる事がほぼない最強のストレージになります。

# 6. おわり
ここまで記事を読んでくださりありがとうございました。
これ以外にもUUID順があるかもしれませんが、自分ではわからなかったので、今回はここまでとさせていただきます。
データパックとほぼ関係なかったんやけど…
Power Apps ログインユーザーを取得する

## はじめに
今回は、お客様からよく質問があるシリーズ。
SharePoint Lists で作成したユーザーのリストから、アプリにログインしたユーザー情報を取得したいという要望です。

## 用意したもの
リストを 1 つ作成しました。
1 つデータを登録しておきます。メールアドレスには自分のものを入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/0312004a-2c59-4fdb-8cc5-e1ce9d040c5d.png)

| 列名 | データ型 |
|:-:|:-:|
| タイトル  | テキスト  |
| メールアドレス  | テキスト  |

## ユーザー情報の取得
ユーザー情報を変数に格納していきたいと思います。
グローバル変数に入れておくと、他の画面でも使えて便利です。

アプリを使用した際、すぐにユーザー情報を取得したいので、OnVisible プロパティに以下の式を入れます。
```
Set(gblUser,LookUp(リスト名,メールアドレス=User().Email))
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/f4b68b32-edf8-f8e3-cc5d-4015061cbecc.png)

User 関数は、アプリを使用しているユーザーの情報を取得することができます。
以下の部分がアプリを使用してるユーザーのメールアドレスにあたります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/df013d53-20f6-f0e6-52a6-c339d4212123.png)

ユーザーリストの中から、User 関数で取得したメールアドレスと一致する行を取得しているということになります。

別の画面を作成し、OnVisible を設定した Screen1 に画面遷移して、ユーザー情報取得の処理がうまくいくか試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/bbb9bca7-0e1f-c71b-d89e-9795ed86ca5b.png)

変数を見てみると、ちゃんと入ってますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/ca4778d9-9857-9ed1-991e-4249347c31ac.png)

この変数を使用して、例えばデフォルト値に設定するなど、結構便利ですよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966048/d1f1cca3-3114-5e2e-dc88-942ce91f5526.png)


## おわりに
データソースを SharePoint Lists にされている方はよくやる手法だと思います。
よかったら試してみてくださいね！
目指せバリキャリエンジニア ー新卒1年目で出産した私の抱負

# はじめに
この記事は[女性エンジニア応援！エンジニアとしてやりがいを感じた経験談をシェアしよう！ by パナソニック コネクト Advent Calendar 2024](https://qiita.com/advent-calendar/2024/panasonic_connect) 15日目の記事です。
遅れての投稿となってしまいました、申し訳ございません🙇‍♀️

前回の記事は Advent Calendar 2023 [CyberAgent内定者が考える脱初心者エンジニア論](https://qiita.com/higuchimmy/items/de07512c222284d10ed9)で、実に1年ぶりの投稿になりますが、今回も技術の話ではなく、今後の抱負を込めた私的キャリア論についてお話しします。

また、この記事では、**妊娠・出産について触れるので、このような話題が苦手な方は今ブラウザバックしてください**💨

# 入社2ヶ月前に妊娠、究極の2択⚖️
2024年2月某日、まだ内定者だった私は、入社前配属希望を第一希望で出していた部署の先輩方とスノボへ行き、「入社したらこの部署でバリバリ働きたい！」とますますやる気溢れたその日に、妊娠がわかりました。

本来妊娠したら、嬉しい気持ちでいっぱいのはずですが、その時の私は、驚きと不安の気持ちしかありませんでした。
**「これから社会人になるというのに？流石に新卒一年目で出産は無謀では？」**
こんなことしか考えられていなかったと思います。

特に、自分が希望していた部署は、とても勢いのある事業を扱っており社内でも忙しめの部署だったので、
「もし私が出産するとなったら、おそらくそこには配属されず、別の超ホワイト部署に配属されるだろう」
なんてネガティブな妄想をしていました。

また、自分にとって新卒一年目というのは、今後のキャリアにおいて大事なスタートダッシュ期間だと考えていたので、そんな大事な時期に出産し、そこから子育てしていくとなれば、ほぼ自分のキャリアを諦めるようなものだとも考えていました。

**キャリアをとるか、出産をとるか**

まさに究極の2択でした。

最終的に、どちらの選択が今後より後悔するかを考えた時に、
キャリアは、最初からバリバリ働くことはできなくても、頑張れば後から巻き返せると思えるのに対し、
出産は、あの時子どもを諦めてしまったという後悔が一生残り続ける気がして、
二週間ほど悩んだ末、**出産する決断をしました。**

# 想像以上に会社は柔軟だった😳
人事の方に、出産することを報告をする時、自分の中では「キャリア諦めます」と宣言しているような気持ちに勝手になって、溢れそうな涙を我慢しながら報告したのを覚えています。
そして、新卒で出産か...と思われるんじゃ無いかと、ビクビクもしていました。

しかし、そんな気持ちとは裏腹に、祝福のお言葉に続けて、入社後の新卒研修とつわりの両立について、妊娠・出産に関する制度の話、そして一番心配だった配属部署についても、出来るだけ私の希望通りになるようにと、ありがたいお話しばかりでした。

また過去にも、エンジニア職ではないが、同じように新卒で妊娠・出産した人がいるという話も知り、前例があるということで、自分だけじゃなかったんだとホッとしました。

そして、入社後は無事に第一希望の部署に配属されました🎉
どうやら、短期的には、すぐに産休に入ることで人員が欠けるデメリットがあるものの、
長期的に見れば、産休後に復職してから頑張ってもらえればいい、と考えてくださったようです。
真相は分かりませんが、本当に感謝しています😭

**結果的に、キャリアと出産、どちらも諦めずに済んだのです✨**

思っていた以上に、会社は妊娠・出産に対して、柔軟でした。
全ての会社がこのような対応をしてくださる世の中ではまだないと思いますが、
女性のキャリアと子育ての両立に、大きな希望が持てたのです🔥


# 妊娠中の働き方
幸いにも自分は、つわりが比較的軽い方だったので、体調不良で会社を休む事はせずにすみました。
が、もしつわりが酷かったら、遠慮せずにお休みして、母体と赤ちゃんの健康を最優先にするべきだと思います。

常に、 **「決して無理はせずに、体調第一で」** を心掛けていました。

上長ともこまめに1on1を行い、個人目標についてはもちろん、最近の体調の変化、タスク量に問題はないか、などを擦り合わせることで、仕事と妊娠の両立が出来ていたと思います。

特に、妊娠中は、赤ちゃんに膨大なエネルギーを吸われているのか常に眠気があり、にもかかわらずカフェインは積極的に摂取できないので、
事前に「眠気がすごいので、仕事中目を瞑っている時があるかもしれません」と共有した上で、うたた寝をしている時もありました。（すみません🙇‍♀️）
ただ、夜はちゃんと寝ていた（毎日9時間ほど）ので、仕事の効率はそこまで落ちていなかったと思います。思いたい...！😃

また、リモートワークも出来ましたが、出社することで少しでも体を動かし、出産時の体力作りを行なっていました。
このおかげもあってか、分娩時間3時間の爆速安産でした🙆‍♀️
ですが、少しでも切迫早産などの疑いがある場合は、リモートワーク一択だと思います。

# バリキャリエンジニアを目指して
そんなこんなで10月末に、無事3480gの可愛い男の子を出産しました👶🩵
こんな可愛い我が子を手放そうとしていたなんて、と思うと自分に嫌気がさしますが、
あの時、出産するという選択をして本当に良かったと思います。

今は産休中ですが、復職後のハンデを少しでも減らすために、副業でコードを書いてます。また、夫のサポートもあり、1月からフルタイム復帰する予定で、4月からは息子も保育園に入園する予定です。
同期と比較すると、圧倒的に仕事に充てられる時間（土日の勉強などを含め）は少なく悔しい気持ちもありますが、日中は仕事、家に帰ったら子育て、隙間時間ができたらダラダラせずに有効活用、とメリハリつけて、キャリアと子育ての両立を実現していきます。

**第一目標は、同期の中で一番効率よく働くこと！**
**そして、息子に自慢のママと思ってもらえるような、バリキャリを目指して頑張ります🚀**

ハッピーホリデー！メリークリスマス！🎄
なぜすべてのウェブサイトにプロフェッショナルなサイトマップが必要なのか？- Sitemap Generator が提供する革新的なソリューション

サービス URL: https://sitemap-generator.org/
デジタル時代において、サイトマップはウェブサイトに不可欠な要素となっています。検索エンジンがコンテンツを効率的にクロールし、インデックスできるようにするだけでなく、ウェブサイトの可視性を大幅に向上させることができます。
今日は、革新的なツール「Sitemap Generator」について詳しく見ていきましょう。
Sitemap Generator の優れている点
多くのサイトマップ生成ツールがある中で、Sitemap Generator が選ばれる理由は明確です：

最大50,000URLまでの処理が可能な高度な自動生成機能
多言語コンテンツに対する完璧なサポート
robots.txtに準拠した最適化された生成プロセス
24時間365日いつでも利用可能なリアルタイム処理

実際の活用事例
EC サイトの最適化
ある大手オンラインストアは、Sitemap Generator を使用して商品カテゴリーや個別商品ページ、さらに多言語バリエーションを含む包括的なサイトマップを作成。その結果、検索エンジンによる商品インデックスが大幅に改善されました。
コンテンツ管理の効率化
ニュースサイトや企業ブログなど、定期的に更新されるコンテンツを持つウェブサイトでは、Sitemap Generator の自動更新機能により、常に最新のサイトマップを維持することが可能になりました。
導入のメリット

SEOパフォーマンスの向上
クロール効率の改善
インデックス率の向上
多言語サイトの最適化

まとめ
ウェブサイトの可視性向上を目指すなら、専門的なサイトマップの作成は避けて通れません。Sitemap Generator は、この課題に対する最適なソリューションを提供します。無料で利用できる専門的なツールとして、すでに10万人以上のユーザーから信頼を得ています。
ウェブサイトの検索エンジン対策を強化したいとお考えの方は、ぜひ Sitemap Generator をお試しください。
【お問い合わせ】
JavaScriptの変数: ホイスティングとスコープの理解

JavaScriptの変数を効果的に使うには、ホイスティングやスコープの仕組みを正確に理解することが大切です。このブログでは、JavaScriptの変数宣言に関わる重要な概念を整理します。

# 1. ホイスティング(Hoisting)とは？

ホイスティングは、JavaScriptエンジンがコードを実行する前に変数や関数をメモリ上に「持ち上げる」動作を指します。この仕組みにより、コード内で変数や関数を宣言位置より前に参照することが可能になります。

# 2. 関数スコープとブロックスコープ

JavaScriptには主に2つのスコープ（変数の有効範囲）があります：

### 関数スコープ(Function Scope)

- 関数内で宣言された変数は、その関数の外ではアクセスできません。
- varで宣言された変数は関数スコープを持ちます。

```javascript
function test() {
  var x = 10;
  console.log(x); // 10
}

console.log(x); // ReferenceError: x is not defined
```

### ブロックスコープ(Block Scope)

- ブロック（{}）内でのみ有効であり、外からアクセスすることはできません。
- letとconstはブロックスコープを持ちます。

```javascript
{
  let y = 20;
  const z = 30;
  console.log(y, z); // 20, 30
}
console.log(y); // ReferenceError: y is not defined
```

# 3. 変数のライフサイクル

変数のライフサイクルは、変数が宣言されてから使用可能になり、最終的にメモリから解放されるまでの一連の過程を指します。`var`、`let`、`const`ではこのライフサイクルに明確な違いがあります。それぞれの挙動をホイスティングとスコープの観点から詳しく説明します。

### `var`のライフサイクル

- **有効範囲**:
  `var`は関数スコープを持ちます。そのため、関数内で宣言された変数は関数外からアクセスできません。

- **ホイスティング**:
  `var`は宣言と初期化が同時にホイスティングされ、初期値は`undefined`になります。そのため、宣言位置に関係なくコード内で使用可能です。

- **メモリ管理**:
  関数が終了すると変数はメモリから解放されます。

**例**:

```javascript
function example() {
  console.log(x); // undefined
  var x = 10; // 宣言と初期化
  console.log(x); // 10
}
example();
console.log(x); // ReferenceError: x is not defined
```

### `let`のライフサイクル

- **有効範囲**:
  `let`はブロックスコープを持ちます。ブロック（`{}`）内でのみ有効であり、ブロックが終了するとメモリから解放されます。

- **ホイスティング**:
  `let`は宣言のみがホイスティングされます。ただし、初期化が完了するまではTDZ（Temporal Dead Zone）内にあり、アクセスするとエラーが発生します。宣言後に初期化されていない場合、`undefined`が自動的に割り当てられます。

- **メモリ管理**:
  ブロックが終了するタイミングで変数はメモリから解放されます。

**例**:

```javascript
{
  console.log(y); // ReferenceError: Cannot access 'y' before initialization
  let y = 20;
  console.log(y); // 20
}
console.log(y); // ReferenceError
```

### `const`のライフサイクル

`const`も`let`と同様にブロックスコープを持ちます。

- **ホイスティング**:
  宣言のみがホイスティングされますが、初期化が完了するまではTDZ内に置かれます。ただし、`const`は宣言と初期化が同時に行われる必要があるため、実質的にTDZが存在しないような動作になります。

- **値の不変性**:
  初期化後、値を変更することはできません。ただし、これは変数が保持しているメモリの参照先が変更できないことを意味します。オブジェクトのプロパティや配列の要素は、その参照先を通じて自由に変更可能です。

- **メモリ管理**:
  ブロック終了時にメモリから解放されます。

**例**:

```javascript
{
  const z = 30;
  console.log(z); // 30
  z = 40; // TypeError: Assignment to constant variable.
}
console.log(z); // ReferenceError
```

### 追加的な注意点

1. **TDZの影響**:
   `let`や`const`では、ホイスティングされても初期化される前のアクセスはできません。これにより、未定義の変数を誤って使用することを防ぎます。

   ```javascript
   console.log(a); // ReferenceError
   let a = 10;
   console.log(a); // 10
   ```

2. **再宣言の挙動**:
   `var`は同じスコープ内で再宣言が可能ですが、`let`や`const`では再宣言は許可されません。

   ```javascript
   var x = 1;
   var x = 2; // 問題なし

   let y = 1;
   let y = 2; // SyntaxError: Identifier 'y' has already been declared
   ```

3. **ガベージコレクション**:
   変数がスコープ外になると、JavaScriptエンジンのガベージコレクターによってメモリが自動的に解放されます。これは、変数が参照されなくなった場合にガベージコレクターがそのメモリ領域を特定し、解放するプロセスです。この仕組みにより、不要なメモリが解放され、メモリリークを防ぐことができます。

# まとめ

JavaScriptの変数宣言方法（`var`、`let`、`const`）には、それぞれ独自の特徴と用途があります。ホイスティングやTDZ、スコープの違いを正しく理解することで、予測可能で安全なコードを書くことができます。また、他言語（例: Java）と比較することで、JavaScript特有の動作を深く理解し、適切に活用するスキルを身につけましょう。
IBMi yum リポジトリの python3-rpm-macros が置き換えられた模様

## yum update でエラー

本日（2024年12月20日） **IBM i** の `yum update` を実施したところ以下のエラーが発生しました。

```sh:yum update
yum updates

更新したパッケージ
freetype-devel.ppc64                                                            2.13.3-1                                                           ibmi-base
git.ppc64                                                                       2.47.0-1                                                           ibmi-base
～～～中略～～～
更新処理の設定をしています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package freetype-devel.ppc64 0:2.10.4-1 will be 更新
～～～中略～～～
---> Package rpm-sign-libs.ppc64 0:4.16.1.3-7 will be インストール
--> 依存性解決を終了しました。
エラー: パッケージ: python3-rpm-macros-3.6-6.noarch (@ibmi-base)
             要求: python-rpm-macros = 3.6-6
            削除: python-rpm-macros-3.6-6.noarch (@ibmi-base)
                python-rpm-macros = 3.6-6
            次のものにより更新された: : python-rpm-macros-3.6-10.noarch (ibmi-base)
                python-rpm-macros = 3.6-10
エラー: パッケージ: python3-rpm-macros-3.6-6.noarch (@ibmi-base)
             要求: python-srpm-macros = 3.6-6
            削除: python-srpm-macros-3.6-6.noarch (@ibmi-base)
                python-srpm-macros = 3.6-6
            次のものにより更新された: : python-srpm-macros-3.6-10.noarch (ibmi-base)
                python-srpm-macros = 3.6-10
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest

```

どうも `python3-rpm-macros-3.6-6.noarch` は `python-rpm-macros-3.6-10.noarch` と `python-srpm-macros-3.6-10.noarch` に **2024-12-12 08:52**  置き換えられたようです。
既に IBMリポジトリには `python3-rpm-macros-3.6-6.noarch` が存在しませんでした。

## 解決方法

`update` を進める為に以下の手順を実行します。

1. 一旦 `python3-rpm-macros-3.6-6.noarch` を削除します
1. 再度 `yum update`

```sh.対処方法
# 廃止されたパッケージを削除
yum remove python3-rpm-macros

# 再度更新
yum update
～～～中略～～～
  整理中                  : python-rpm-macros-3.6-6.noarch                             
～～～中略～～～
完了しました!
```
上記で `python-rpm-macros-3.6-10.noarch` と `python-srpm-macros-3.6-10.noarch` が導入され、`update` が出来るようになります。
オンボーディングのアンチパターンを徹底排除！LMの中途入社者サポート

初めまして、デザイナーのEmiです！
9月にリンクアンドモチベーション（以下、LM）に入社し、3ヶ月が経ちました。そろそろ入社エントリーを書こうかと考えていたところ、Qiitaでバズっていたこちらの記事に出会いました。

👉 https://qiita.com/kojimadev/items/06506d374f19493d7e72

「あるある…」と首がもげるほど頷いている方も多いのではないでしょうか。
その後、この記事を同僚にシェアした際、「LMのオンボーディングって、このアンチパターン全部潰してますよね！」と、やや興奮気味に盛り上がりました。そうなんです。LMでは中途入社者がスムーズに馴染み、活躍できるように、アンチパターンに陥らないための対策がしっかり仕組み化されています。
今回はこの記事をお借りして、LMのオンボーディングがどれほど手厚く設計されているのか、その全貌をご紹介したいと思います！

# ①「お手並み拝見」ではなく、安心して一歩目を踏み出せるサポート体制
そもそも入社前のオファー面談で、「中途入社の方が活躍できなかったら、我々の責任だと思っています。そのため、オンボーディングはかなり手厚くやっています」と明言してくれ、入社後のオンボーディングの流れを提示してくれました。
入社後は、マネージャーのサポートを受けられるのはもちろんのこと、同じデザイナーのサポート担当が2名つき、毎日の1on1で交代しながら相談に乗ってもらえます。

# ②思考法が型化され、それを伝える体制が整っている
LMはコンサルティング事業からはじまった会社のため、プロジェクトを遂行する上で考慮すべきポイントややるべきことがフレームワークとして体系化されており、共有知として活用されています。実際、1on1の中でプロジェクトの進め方について悩みを相談した際、同じく中途入社のデザイナーが「この会社だとこのフレームでプロジェクトを進めていますよ。ぜひ参考にしてください。」と丁寧に教えてくれました。

# ③早急な成果創出を求めず、まずは組織に馴染むことに全力投球
”デザイナー” ”エンジニア”と一口に言っても、会社によって求められる役割は異なります。そのため、中途入社者は「自分のこれまでの経験がこの会社で通用するのか」といった不安を抱えがちです。同時に、新卒とは違い”即戦力”として期待を背負うプレッシャーもあり、常に脳内で容量を食われているような状態ではないでしょうか。
私も前々職、アートディレクター経験のあるデザイナーを迎え入れた時、「スーパーデザイナーがやってきてくれた！」と無邪気に過剰な期待を寄せてしまっていました。
一方で、LMでは、3ヶ月にわたるオンボーディング期間を設けており、前述のようなサポート体制が整っています。その充実ぶりから、「新卒のようにコストをかけてサポートしていただいて良いのでしょうか・・？」と恐縮してしまうほどでした。

# ④十分な教育期間
3ヶ月にわたるオンボーディング内容をもう少し具体的にご紹介します。
1ヶ月目は、会社に馴染むことに集中する期間。会社の歴史や経営方針などをインプットしつつ、チーム紹介や自己紹介タイムを通して部署全体の雰囲気を掴めます。
2ヶ月目からは、初期プロジェクトに取り組む時期。私の場合はいわゆるDesginOpsの一環としてデザインファイルの運用ルールの整備に取り組みました。このプロジェクトでは、まずデザイナー一人一人にヒアリングを行ったのですが、この会社での開発プロセスやデザインワークでの課題感など、全体感を早期に把握することにつながったと思います。

# ⑤ペアデザインでの実践学習
とはいえ、実際にプロダクト開発に携わるのが、プロダクト理解への一番の近道ですよね。
初期プロジェクトの傍ら、既存プロダクトのリデザインにもサポート的に参加させていただきました。1日1時間のペアデザインの時間を設けていただき、「このUIはどういう意図でこうなっている？」「仕様上の制約は？」といった会話を通して、プロダクトへの解像度を上げることができました。

# ⑥メンバーとの適切な会話量
中途入社者の中には、「業務のミーティングには参加しているけれど、自分から発言する機会がなくて…」「今日は誰とも話さなかったな…」と感じたり、会社やメンバーへの理解がなかなか進まないことに焦りを覚える方もいるのではないでしょうか。

その点、LMではこのような課題を解消するためのサポートが非常に充実しています。例えば、「これって誰に聞いたらいいんだろう？」という迷いが生まれないよう、中途入社者専用のSlackチャンネルが用意されており、気軽に疑問を投げかけることができます。また、毎日の1on1では、業務に関する疑問点をその都度解消することができました。

さらに、相互理解を深めるためのユニットメンバーとの個別ミーティングや、同じママさん同士で集まる「ママランチ会」、雑談のためだけのミーティングが設定されていました（驚くべきことに、雑談をサポートする専任担当までおられます！）。こうした取り組みのおかげで、チームメンバーだけでなく、部署全体の人となりや雰囲気をいち早く捉えることができたと感じています。


# ⑦チームに貢献していることがわかった初期成果プロジェクト
デザイナーの中で課題感の大きいプロジェクトを初期プロジェクトとしてすり合わせたため、チームメンバーからは感謝の言葉が多く聞こえてきました。その設計力も去ることながら、そもそも小さなことでもGoodに光を当てることが、会社のカルチャーとして根付いているように思います。
また、3ヶ月のオンボーディング期間の最後には、部署全体に向けて「Finishプレゼンテーション」の場があり、私の人となりや成果を認知してもらう機会にもなりました。

# ⑧初期プロジェクトの難易度について
初期プロジェクトは、私のスキルやこれまでの経験、チームが抱える課題感、新規参入者としての適切な難易度が掛け合わされた形で選定されていたように感じます。

具体的には、私の過去の経験を活かしつつ、成果を出しやすい領域にフォーカスしたプロジェクトで、1〜2ヶ月で確実にゴールできるタスクボリュームに絞られていました。このおかげで、無理なく取り組むことができたように思います。また、単に取り組みやすいだけでなく、プロジェクトがチームの実業務やデザインプロセスとしっかり紐づいていたため、組織やプロセスへの理解を深める副次的な効果も得ることができました。

# まとめ
3ヶ月のオンボーディング期間を通して最も感じているのは、「この会社なら安心して挑戦できる」です。
デザイナーのみなさん、ぜひ一緒に働きましょう！
指定ログインでエラー

Sandboxから本番環境にアクセスする指定ログインを作成したいのですが...
うまくいきませんね。

管理承認状況が「未承認」なので、保存して認証させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f8cbed32-5099-d88c-3071-bd7a4d23fce5.png)

次の画面をみるとsandboxなので、無理やりlogin.salesforceにURLを変えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9ef50814-9458-ce8a-3063-3f194f4d9522.png)

ログイン先が変わりました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7dd29ee1-47ed-67da-1cd0-c57d78961ebb.png)

ちゃんと認証画面が出ます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4ca184ef-247b-0406-2f9c-0969b3ee23ae.png)

許可をクリックしてもダメですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7da869a4-b77d-6b94-3143-a9e2d731cbfb.png)

ブラウザの戻るでもエラーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/bba61df0-4de1-92c5-7619-5092b1d3b155.png)

削除して作り直してもできませんね。腐ってる

# 仕方ないので指定ログインを使用しないApexのコードを書く

```Java
public static String callout_org2() {

        Http http = new Http();
        String path ='https://test.my.salesforce.com/services/oauth2/token';
        HttpRequest req = new HttpRequest();
        req.setEndpoint(path);
        req.setMethod('POST');
        String ClientId = 'xxxxxx';
		String ClientSecret = 'yyyyy';
        String username = 'xyz@test.co.jp';
		String password = '********';
        
        req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.setBody('grant_type=password' + 
              '&client_id=' + ClientId + 
              '&client_secret=' + ClientSecret + 
              '&username=' + username +
              '&password=' + password
           );
		HttpResponse res = http.send(req);
  		
        BodyToken t = (BodyToken)JSON.deserializeStrict(res.getBody(),BodyToken.class);
        
        Http http2 = new Http();
        String path2 ='https://test.my.salesforce.com';

        String parameters = '/services/data/v62.0/limits';
        HttpRequest req2 = new HttpRequest();
        req2.setEndpoint(path2 + parameters);
        req2.setHeader('Authorization','Bearer ' + t.access_token);
        req2.setMethod('GET');
        
        HttpResponse res2 = http.send(req2);
        system.debug(Logginglevel.INFO,'===> '+ res2.getBody());
        
        return res.getBody();
    }
    
    public class BodyToken {
        public String access_token;
        public String instance_url;
        public String id;
        public String token_type;
        public String issued_at;
        public String signature;
    }
```

ちゃんと取得できましたね。やっぱり最後はApexのコードが頼りです。よく分からんエラーでも回避できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/42bea5a8-6f44-c46b-d712-6c6fbd88799f.png)
blenderのジオメトリーノード

# blenderのジオメトリーノード![スクリーンショット 2024-12-20 133744.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964564/9f1fcc58-e263-9d77-dd55-027196643f60.png)

![スクリーンショット 2024-12-20 134251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964564/fff4ef9a-f6eb-524f-3d5d-0dc6769bd41d.png)

***ポイントにインスタンス作成で配置したインスタンスを軸固定で全部カメラ方向に向けるノード設定。***
![スクリーンショット 2024-12-20 130814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3964564/54bbea99-d475-8de2-896d-692eb75c2034.png)

***使い方***
１.オブジェクト情報にカメラを入れる。
２.ベクトルをポイントにインスタンスを制作ノードの回転に接続する。
３.XYZ合成の数値をいじって回転軸を変える

***説明***
最初のベクトルの減算でサルのそれぞれ位置情報を手に入れる
オイラーをベクトルに整列で猿をカメラに向ける
Z軸だけ自動で回転してほしいためXYZ分離でZを取り出す。
細かい角度の調整をしたいため可算を追加
XYZ合成でベクトルに戻す。

***まとめ***
今回はオイラーをベクトルに整列がかなりカギを握っているとおもう。
ジオメトリーノードで特定のオブジェクトを特定の向きに変える場合に使える
これをアセット登録してたくさん使おう
薄っぺらい草とかの向きに使えるよ。
業務1年目によく使用したVisualStudioのショートカットキー


業務でVisual Studioを使用している中で、よく使用したショートカットキーをまとめてみます。業務で使用しているのは、**Visual Studio2012**がメインではありますが、**Visual Studio2022**での動作もまとめました。

# 環境
* VisualStudio Express 2012
* VisualStudio Community 2022

# Visual Studioのショートカットキー

#### Visual Studio ショートカットキー
<table> 
  <thead>
    <tr>
      <th>動作</th> <th>ショートカットキー</th>
    </tr>
  </thead>
  <tr>
    <td> 選択範囲をコメントアウト </td> <td>対象行を選択し「Ctrl」＋「K」の後「Ctrl」＋「C」</td>
  </tr>
  <tr>
    <td> 選択範囲のコメントアウト解除 </td> <td>対象行を選択し「Ctrl」＋「K」の後「Ctrl」＋「U」</td>
  </tr>
   <tr>
    <td> 検索</td> <td>「Ctrl」＋「F」</td>
  </tr>
  <tr>
    <td> 検索結果の前後移動 </td> <td>「Enter」(前を検索) /「Shift」+「Enter」(次を検索)</td>
  </tr>
  <tr>
    <td> 変数や関数の定義へ移動 </td> <td>変数や関数を左クリックで選択し、「F12」</td>
  </tr>
    <tr>
    <td> 変数や関数の全ての参照を検索 </td> <td>変数や関数を左クリックで選択し、<br/>「Ctrl」＋「K」の後「Ctrl」＋「R」<br/>VisualStudio2022の場合は、「Shift」+「F12」</td>
  </tr>
  <tr>
    <td> 変数やメソッドの名前を一括変更 </td> <td>「Ctrl」＋「R」</td>
  </tr>
   <tr>
    <td> コードスニペット </td> <td>「Ctrl」＋「K」の後「Ctrl」＋「X」</td>
  </tr>
</table>

#### インデント関連 Visual Studio ショートカットキー


<table> 
  <thead>
    <tr>
      <th>動作</th> <th>ショートカットキー</th>
    </tr>
  </thead>
  <tr>
    <td> インデント</td> <td>「Tab」</td>
  </tr>
  <tr>
    <td> インデントを解除</td> <td>「Shift」＋「Tab」</td>
  </tr>
    <tr>
    <td> 選択範囲のインデント整形</td> <td>「Ctrl」＋「K」の後「Ctrl」＋「F」</td>
  </tr>
  </tr>
    <tr>
    <td> ファイル全体のインデント整形</td> <td>「Ctrl」＋「K」の後「Ctrl」＋「D」</td>
  </tr>
</table>


#### ビルド＆デバッグ関連 Visual Studio ショートカットキー

<table> 
  <thead>
    <tr>
      <th>動作</th> <th>ショートカットキー</th>
    </tr>
  </thead>
  <tr>
    <td> ビルド </td> <td>「Ctrl」＋「Shift」＋「B」</td>
  </tr>
  <tr>
    <td> リビルド </td> <td>「Ctrl」＋「Alt」＋「F7」<br/>VisualStudio2022では不可</td>
  </tr>
  <tr>
    <td> デバッグ開始 </td> <td>「F5」</td>
  </tr>
  <tr>
    <td> デバッグなしで開始 </td> <td>「Ctrl」＋ 「F5」</td>
  </tr>
  <tr>
    <td> ステップイン </td> <td>「F11」</td>
  </tr>
  <tr>
    <td> ステップアウト </td> <td>「Shift」＋「F11」</td>
  </tr>
   <tr>
    <td> ステップオーバー </td> <td>「F10」</td>
  </tr>
  <tr>
    <td> 現在行にブレークポイント設定/解除 </td> <td>「F9」</td>
  </tr>
  <tr>
    <td> 全てのブレイクポイントの削除 </td> <td>「Ctrl」＋「Shift」＋「F9」</td>
  </tr>
</table>

#### ブックマーク関連 Visual Studio ショートカットキー
<table> 
  <thead>
    <tr>
      <th>動作</th> <th>Visual Studio2012</th><th>Visual Studio2022</th>
    </tr>
  </thead>
   <tr>
    <td> 現在行にブックマーク追加/削除  </td> 
    <td>「Ctrl」＋「B」の後<br/>「Ctrl」＋「T」</td>
    <td>「Ctrl」＋「K」の後<br/>「Ctrl」＋「K」</td>
  </tr>
  <tr>
    <td> 前のブックマークへ移動 </td>
    <td>「Ctrl」＋「B」の後<br/>「Ctrl」＋「P」</td>
    <td>「Ctrl」＋「K」の後<br/>「Ctrl」＋「P」</td>
  </tr>
  <tr>
    <td> 次のブックマークへ移動 </td>
    <td>「F2」</td>
    <td>「Ctrl」＋「K」の後<br/>「Ctrl」＋「N」</td>
  </tr>
   <tr>
    <td> 全てのブックマーク削除  </td> 
    <td>「Ctrl」＋「B」の後<br/>「Ctrl」＋「C」</td>
    <td>「Ctrl」＋「B」の後<br/>「Ctrl」＋「L」</td>
  </tr>
</table>

**windowsのショートカットキーはこちら**

https://qiita.com/ShotaIchikawa1208/items/e966b5d73cd9ba52e4a2
シェルスクリプトでテンプレート・ファイルを扱う的な話


まあ、よくある話ですが、一部だけ異なるファイル（設定ファイルとか、、）を作るときに、テンプレートを用意して、変動する部分のみ変数で動的に変えたい、という話がありますよね。

テンプレートファイル名を変数INPUT, 置換後のファイル名を変数OUTPUTとすると、こんな感じでファイルの中身の変数部分を動的に置換できます。
```test.sh
sh -c "cat <<EOF > $OUTPUT
`cat $INPUT`
EOF
"
```

たとえば、
```template.txt
VAR1: $VAR1
   VAR2:  $VAR2  $VAR2
```
みたいなファイルを用意したとすると、
```
$ VAR1=aaa
$ VAR2=bbb
$ INPUT=template.txt
$ OUTPUT=output.txt
$ export INPUT OUTPUT VAR1 VAR2
$ sh test.sh
$ cat output.txt
VAR1: aaa
   VAR2: bbb  bbb
```

変数が置換されます。
何かの参考にどうぞ。
APIってなに？

# APIとは
・APIは「Application Programming Interface」の略
・アプリ同士がデータをやり取りするためのルールや仕組みの総称

## APIはデータを出し入れする窓口
アプリで使用されるデータは基本firebaseなどのデータベースに格納されています。データベースはいわゆる倉庫です。
APIはその倉庫(データベース)から欲しい情報だけを持ってきてくれます。あるいは保存したい情報を正しい場所に倉庫に格納してくれます。

例：Reactでフロントエンドを開発している場合
①倉庫（データベース）にはたくさんの箱（データ）が入っています。
②あなた（Reactアプリ）は欲しい箱がどこにあるかわかりません。
③倉庫の窓口(API)に「〇〇の箱を持ってきて！」とお願いをします
④リクエスを受けた窓口（API）は必要な箱を倉庫から見つけて渡してくれます。

## なぜAPIで仲介するのか
データベースから直接データを持ってこれば良くないかと思うかもしれません。
ですがAPIを通すことで以下の点を実現できます。

1\. セキュリティの向上
・データベースへの直接アクセスは危険です。APIによって改竄や漏洩を防止します。
・APIがアクセス制限や認証を管理するので安全性が高まります。

2\. データのフォーマットが整う
・データベースの生データはそのままだと使いにくいことがあります
・APIが必要な部分だけを整えて渡してくれるので、フロントエンドで扱いやすいです

3\. 再利用性が高い
・APIは一度作成すれば、他のアプリやサービスでも使えます

4\. バックエンドの変更がフロントエンドに影響しにくい
・APIがデータベースとのやり取りを抽象化するため、データベースの構造が変わってもフロントエンドへの影響が少なくなります。

## フロント開発をする際にAPIをどう意識するか
バックエンドのことはわからないのに、フロントエンド開発をしなければいけないこともあります。特にチーム開発の場合、PMから「必要なAPIがあったら教えてください」とか「APIを意識して作業をしてください」などと言われたら、頭が真っ白になるかもしれません。

ではフロント開発をする人は、コーディングを行う際にAPIをどのように意識すれば良いのでしょうか？
以下に考え方を順に6つまとめるので、参考にしてみてください。

### 1\.必要なデータを特定する
まずは自分が担当している部分で必要なデータにはどのようなものがあるのかを明確にしましょう。
例：ログインしているユーザー名・記事情報・作業進捗(生徒管理アプリ等の場合)

### 2\.APIを使って取得する必要があるデータを確認
必要なデータがどのAPIエンドポイントで提供されているかを確認します。
これはプロジェクトでバックエンドを担当している人に相談が必要になる場合があります。

*APIエンドポイントとは…
APIが提供する「データ取得や送信の窓口」のことです。通常URL形式で表現されるもので、APIリクエストを送るときにURLを使用します。
データによってURLの記述が異なるので、そのデータのAPIエンドポイントを正しく把握していないと、欲しいデータを得ることができません。

### 3\.ダミーデータで仮のUIを作る
最初はAPIを使わずに、仮のデータ（ダミーデータ）を使って画面を作成します。
UIが完成したらAPIを使って実際のデータを取得する処理に置き換えていきます。

ダミーデータでUI制作する例
```tsx
const dummyData = [
  { id: 1, message: "ようこそ！" },
  { id: 2, message: "お知らせがあります！" },
];

return (
  <div>
    {dummyData.map((item) => (
      <p key={item.id}>{item.message}</p>
    ))}
  </div>
);
```

### 4\.APIを使ってデータを取得
仮のデータを本物のデータに置き換える段階でAPIを使います。
ここではAPIを呼び出すための構文が必要なので、調べたりプロジェクトメンバーに相談しながら行っていきましょう。

APIに置き換える例
```tsx
useEffect(() => {
  const fetchData = async () => {
    const response = await fetch("http://localhost:8000/api/notifications"); //APIエンドポイント
    const data = await response.json();
    console.log(data);
  };

  fetchData();
}, []);
```

### 5\.APIのエラーハンドリングを実装
APIリクエストが失敗する可能性を考慮し、エラーハンドリングも実装します。

エラーハンドリングの例
```tsx
const fetchData = async () => {
  try {
    const response = await fetch("http://localhost:8000/api/notifications");
    if (!response.ok) {
      throw new Error("データの取得に失敗しました");
    }
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
};
```

大切なのは、APIを使用するデータの洗い出しとダミーデータでUIを作るという部分です。それ以降のAPIが直接絡む部分はその時調べたり聞いたりして進めていけば問題ないと思います。

## まとめ

### APIとは
・データをやり取りする窓口のような仕組みで、アプリとデータベースの橋渡しをします

### APIを使うメリット
・動的なデータを画面に表示できます
・データを安全に管理できます

### APIを意識したフロント開発の仕方
・必要なデータを把握する
・UIをダミーデータで作成
・APIを使用して動的なデータに置き換える
・APIリクエストのエラーハンドリングを忘れない

以上のようにAPIを正しく理解し、活用することで、フロントエンド開発の効率化とバックエンドとのスムーズな連携が可能になります。
VSCODEからPostgreSQLを使う

### インストールする拡張機能

https://marketplace.visualstudio.com/items?itemName=ckolkman.vscode-postgres
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/4f577060-d614-bc95-36ea-9abf553be905.png)


### データベースとのリンク

#### ①接続情報入力画面を開く。
拡張機能のインストールが終わるとサイドバーにPostgreSQLアイコンが表示されるので、それをクリック。
ヘッダーの`POSTGRESQL ....`横の`+`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/fd75e593-c186-d398-c74d-74f47bbc5ead.png)


#### ②接続情報を入力
以下が求められるので入力する。
- ホスト
- ユーザID
- パスワード
- ポート番号
- セキュアかスタンダード（スタンダードを選択）
- 接続名（なんでもOK）

### ローカルのSQLファイルを実行する
実行したSQLファイルを開き、`Select Postgress Server`をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/7f0335d5-16f3-0b0e-5c96-8e3b76e3fc94.png)

登録した接続名のリストが出てくるので選択し、対象のDBを選択する。
`Select Postgress Server`の部分が対象のDB名になれば接続状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/1db146e1-d56f-88c5-ceab-ff87ccdca161.png)

実行したいクエリ部分を選択状態にして、右クリックし、`Run Query`を実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943997/03007509-54ed-913b-75ed-2a42c824f235.png)

:::note alert
F5を押しても異なるショートカットアクションが起動してしまう。
:::
OSS Gateワークショップ参加レポート：初めてのOSS貢献でPRがマージされるまで

# OSS Gateワークショップ参加レポート：初めてのOSS貢献でPRがマージされるまで

## はじめに

先日、OSS-Gateというコミュニティによるワークショップが、弊社の会議室で開催されました。
後述しますが、趣旨としては「初心者がOSSへの初コントリビュートをする」というワークショップです。
個人的に興味のある内容であったため、実際に参加してきました！本記事はそのレポートです。

当日の風景
![IMG_0029.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3489175/53f617a9-960e-6223-71af-b23cbb642b65.jpeg)


## OSS-Gate ワークショップとは

### OSS-Gateとは

以下を目的とするコミュニティです。([公式ページ](https://oss-gate.github.io/)から引用)

> 「OSS Gate」は、OSS開発に参加する「入り口」を提供する取り組みです。 OSS開発に未参加の人を参加する人へ、少し参加したことがある人を継続的に参加する人へ。そうやってOSS開発に参加する人を継続的に増やしていく。それが「OSS Gate」の目的です。



### ワークショップの概要

OSS-Gateが開催するワークショップはこんな形式です。

#### 基本情報

- 開催頻度
  - 2ヶ月に一回
- 場所
  - オンライン/オフラインが大体交互にある
  - オフラインの開催場所はまちまち
- 経験者はサポータ、初心者はビギナーとして参加
  - 初心者がOSSへのコントリビュートをするのをサポータが手伝ってくれる

#### やること

[イベントページ](https://oss-gate.doorkeeper.jp/events/178087)の引用ですがこんな感じ

> 本ワークショップの目的は、「OSS開発に参加する最初の一歩を支援すること」です。実際にやることは「ビギナー」と「サポーター」で相談して決めますが、通常は次の内容を行います。
>
> 扱うOSSを「ビギナー」と「サポーター」で相談して決める
> 公式ドキュメント通りにそのOSSを動かす
> プロジェクトにフィードバックする
> フィードバックの例：
>
> 発見したインストールや動作時の問題に関して、GitHubのIssueやpull requestを作成する
> 発見した公式ドキュメントの不備に関して、GitHubのIssueやpull requestを作成する

## OSS紹介

コントリビュートするOSSは本当に自由です！
私は[vscode-neovim](https://github.com/vscode-neovim/vscode-neovim)という、VSCodeの拡張機能を選びました。

ざっくりした紹介ですが、vscodeのVim拡張の一つです。
すごいところは、Vimキーバインドをエミュレートするのではなくて、本当のneovimが動作するところで、プラグインなども動きます。

## 実際の作業内容

### 1. プロジェクト選定

まずはコントリビュートするOSSプロジェクトの選定が始まります。

ポイントはこんな感じでした

- 普段使ってるOSSから選ぶ
  - 勝手が分かってるのでスムーズに進められるし、貢献できた時の嬉しさも大きいです
- 小規模なプロジェクトや新しめのプロジェクトが狙い目
  - 人気言語そのもの！とかだと成熟しすぎていてフィードバックするポイントを見つけづらいそうです

### 2. OSSを実際に使ってみる

普段使っているものであっても、あらためて再インストールしてドキュメント通り動かしてみます。
この「ドキュメント通り」というのがミソで、Qiitaなどの技術記事をみてはいけません。
というのはドキュメントに不備があり、セットアップや実行が失敗した場合、それがフィードバックできるからです。
ドキュメントが古い手順を書いていて、ググって出てきたブログの通り試したら成功した経験などあるかたは多いのではないでしょうか。
実はそれこそがコントリビュートのチャンスで、ドキュメントの最新化は開発者の手が回りづらく、歓迎されやすいらしいです。

### 3. フィードバック内容を整理して、issue/PRを作る

ここに関してもポイントがいくつかあります。
まずは、レポジトリにコントリビュート手順の指示がないか確認します。`CONTRIBUTING.md`という名前のファイル名であることが多いようです。

他のポイントとしては、実行環境，やったとこ/やってないことなどを明確にするなどがありますが。きっと皆さんが普段業務で意識していることと同じなので省略します。

詳しくは↓の45pあたりからあるのでみてください。
https://slide.rabbit-shocker.org/authors/oss-gate/workshop-tutorial-online/

## 成果と感想

今回は、私はドキュメントに関する軽微な修正を送り、無事マージされました！

https://github.com/vscode-neovim/vscode-neovim/pull/2327

ドキュメント内の遷移用リンクにタイポがあったというだけなのですが、毎日使っているツールに貢献できたと思うとめちゃくちゃ嬉しいです。

## まとめ

OSSへのコントリビュートに興味があるものの、二の足を踏み続けて何年も経っていた私にとって非常にありがたいワークショップでした。
コントリビュートというと、実装をゴリゴリ凄い人たちにしかできないような印象がありましたが、ドキュメントの修正ならユーザ目線でも十分可能で、需要もあるということを知ることができました。
実装でのコントリビュートにも興味はありますが、そっちはある程度時間や覚悟が必要かなと思っています、ひとまずは今回学んだようにドキュメントの不備を見つけた際に、ググって解決するだけでなく、公式へのフィードバックをする。というのを習慣づけたいと思います！

最後に全体を通して思ったことですが、このOSS-Gateというコミュニティの活動自体が、非常に志の高い方々によって成り立っており、私は強い刺激を受けました。
ITが仕事の道具みたいになってしまった方は、今一度楽しい気持ちを思い出せるかもしれません！

## 参考リンク

- [OSS Gate公式サイト](https://oss-gate.github.io/)
- [OSS Gate東京ワークショップ2024-12-14](https://oss-gate.doorkeeper.jp/events/178087)
- [vscode-neovim](https://github.com/vscode-neovim/vscode-neovim)
WPF定石 - スタートアップルーチン

## はじめに

C# - WPF ソフト開発時に、決まり事として実施していた内容を記載します。

### テスト環境

ここに記載した情報/ソースコードは、Visual Studio Community 2022 を利用した下記プロジェクトで生成したモジュールを Windows 11 24H2 で動作確認しています。

- WPF - .NET Framework 4.8
- WPF - .NET 8

## スタートアップルーチン

デフォルトだと App.xaml の StartupUri 属性に指定された Window が開かれます。
この形態だと、起動前処理などを記述することができません。
Windows Forms で Program.cs に記載していた起動前処理、および、起動後処理は、下記イベントを利用することで対処可能です。

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.application.startup

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.application.exit

### サンプルコード

.NET Framework / .NET ともに同一ソースコードです。
App.xaml で StartupUri を削除して Startup="App_Startup" Exit="App_Exit" を追加します。

```Xml:App.xaml
<Application x:Class="Hoge.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:Hoge"
  Startup="App_Startup" Exit="App_Exit">
  <Application.Resources>
  </Application.Resources>
</Application>
```

App.xaml.cs で App_Startup と App_Exit を実装します。

```CSharp:App.xaml.cs
public partial class App : Application
{
  private void App_Startup(object sender, StartupEventArgs e)
  {
    // TODO：起動前処理
    
    // メインウィンドウ
    var mainWindow = new MainWindow();
    mainWindow.Show();
  }
  private void App_Exit(object sender, ExitEventArgs e)
  {
    // TODO：起動後処理
  }
}
```
DHCP

# DHCP
DHCPはネットワーク上のデバイス（コンピュータ、スマートフォン、プリンターなど）に対して自動的にIPアドレスやネットワーク設定を割り当てるプロトコル。DHCPを利用することでネットワーク管理が効率化され手動で設定する手間が省ける。

## 主な機能

> ①IPアドレスの自動割り当て

ネットワーク内で使用可能なIPアドレスをクライアント（デバイス）に自動的に割り当てする

> ②その他ネットワーク設定の提供

- サブネットマスク
- デフォルトゲートウェイ
- DNSサーバーアドレス
- NTPサーバーアドレス（必要に応じて）

> ③IPアドレスのリース管理

IPアドレスは一定期間だけ割り当て（リース）される。この期間が終了するとアドレスは再利用可能になる。

## DHCPの仕組み
DHCPはクライアントとサーバー間で以下のプロセスを通じて動作する

> ①DHCP Discover

クライアントがネットワーク上のDHCPサーバーを探すもの

> ②DHCP Offer

DHCPサーバーがクライアントに利用可能なIPアドレスを提案

> ③DHCP Request

クライアントが提案されたIPアドレスを要求する

> ④DHCP Acknowedgment(ACK)

DHCPサーバーが要求を承認しIPアドレスや設定情報を提供

## DHCPの構成要素

> ①DHCPサーバー

IPアドレスやネットワーク設定を管理し提供する役割を担う

> ②DHCPクライアント

IPアドレスをリクエストするデバイス（PC、スマートフォン、プリンターなど）

> ③DHCPリースプール

割り当て可能なIPアドレス範囲を定義したリスト

## DHCPのメリット

> ①管理の効率化

IPアドレスの設定を自動化することで人為的なミスを減らし管理作業を簡素化する

> ②柔軟性の向上

動的にIPアドレスを割り当てるため新しいデバイスがネットワークに簡単に接続できる

> ③リソースの最適化

使用されてないIPアドレスを再利用できアドレスの枯渇を防ぐ

## 注意すること

> ①DHCPと固定IPの併用

サーバーやネットワーク機器には固定IPアドレスを設定する必要がある場合がある

> ②セキュリティリスク

DHCPの通信は基本的に暗号化されてないため不正アクセスやスプーフィング攻撃（通信やデータの送信元を偽装すること）のリスクがある

---