OmniAICreator/Qiita-1.07M huggingface dataset:
Cursor で AI にコードレビューしてもらおう

# はじめに
私達、[株式会社よりそう](https://qiita.com/organizations/yoriso) のシステム部では、エンジニア全員が Cursor の有料版を利用して開発を行っています。
本記事では、普段私が実践している、Cursor を使ったセルフコードレビューの方法を紹介します。

# `@Git` コマンドで変更差分を渡す

まず、`ctrl + L` でチャットを開きます。
（Composer では勝手に修正までされてしまうので、レビューが目的であれば、こちらから許可しない限り変更されない Chat を選択するのがより良いです。）

`@` を入力して表示されるメニューの中から `Git` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/ef94cd4a-0996-bff2-d165-743274d5cc48.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/7d97a91e-8964-600d-bb66-9b0f68aa5fe3.png)

PR は main ブランチとの変更差分をプロンプトとして渡すことができます。
PR を出す前に変更差分をレビューさせたい時はこちらを選択します。
（現状 main 以外のブランチとの差分は渡せないのが惜しい…）

Commit は作業中の差分をプロンプトとして渡すことができます。
コミットする前に変更差分をレビューさせたい時はこちらを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/701b956a-8b85-dbc6-8328-a994adfd0801.png)

プロンプトは「レビューして」のような簡易的なもので十分です。
出力結果に合わせて追加の依頼や質問をしましょう。

# .cursorrules ファイルでレビュー方針を伝える

Cursor の設定画面から、.cursorrules の利用を有効化します。
(設定画面は、 `ctrl + shift + P` で表示されるメニューから `Cursor Settings` で開けます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474068/c246eabb-973c-ca64-2ebb-b2a6e8967e2a.png)

.cursorrules はプロンプトを送信したときに自動で読み込まれるファイルで、プロジェクト固有のルールを AI に伝えることができます。

.cursorrules というファイルをプロジェクトに作成し、コーディング規約やレビュー方針を記載します。

実際に私達が使っているファイルの一部を抜粋したものが以下です。

```
# コーディング規約
## 基本
- このプロジェクトは nuxt3 で作成されています。
- コンポーネントライブラリは Vuetify3 を使っています。components/Ui ディレクトリ以外では原則直接利用を禁止しています。
- コンポーネントの import 文は不要です。
- ref や computed のような vue の基本的な関数は import 不要です。
- イベントなどに使う関数は handleXxx よりも onXxx の命名が望ましいです。

## defineProps の使い方
### 非推奨
defineinterface Props {
  label: string;
}
defineProps<Props>();

### 推奨
defineProps({
  label: {
    type: String,
    required: true,
  },
});

# コメント規約
- コメントがなくても意図が伝わるコードを書くことを目指す
- コードと重複するコメントは避ける
- コードだけでは意図が伝わらない部分にのみコメントを書く
- コード生成時に生成される説明的なコメントは不要
```

このファイルがある状態で、`@Git` を使って AI にレビューさせることで、チームの方針に従ったレビューが実現できます。

**チームのノウハウや方針をこのファイルに蓄積していくことで、AI のレビュー精度をより高めることができます。**

# おわりに
私達のチームでは、Cursor を活用し、目下 PR の精度向上に取り組んでいます。
さらに効果的な方法が見つかったり、具体的な成果が確認できた場合には、随時記事を更新していく予定です。
AtCoderをプロデルで挑むチートシート

# TL;DR
AtCoderで頻出のフレーズをプロデルで実装するときのコード例です。

文法は Mopepe51さんの記事が丁寧で詳しいです。

https://qiita.com/Mopepe51/items/e23d8d31455bd8e74221

# 整数Nを受け取る

```
【N:整数】
コンソールから受け取ってNとする
```

# A1 A2 ⋯ AN

```
コンソールから受け取って「 」で区切って【A:整数の配列】とする
```

# 標準出力する

```
1を出力して改行する
```

# 代入と加減算
「増やす」「減らす」「代入する」を使うよりも数式の代入文を使う方が高速です。

```
【V:整数】=0
V=V+1
V=V-1
```

# 繰り返し
カウンタはi, j, kでもよいですが、木, 林, 森も見やすいと思います。

```
【木:整数】をLからRまで増やしながら繰り返す
  
繰り返し終わり
```

# Q個与えられるので

```
【Q:整数】
コンソールから受け取ってQとする
Q回繰り返す
  コンソールから受け取って「 」で区切って【引数:整数の配列】とする
  
繰り返し終わり
```

# 二次元配列の初期化

```
//100×100の二次元配列の要素を確保する
【木:整数】を1から100まで増やしながら繰り返す
  平面(木,100)=0
繰り返し終わり
```

# デバッグについて
AtCoderの判定システムやコードテストでは、コンパイル版が採用されています。コンパイル版の仕様によりコンパイルエラーや実行時エラーのエラーメッセージが理解しづらい場合があります。原因が特定できない場合には、文法に互換性がある[スミレ畑](https://sum.irelang.jp/play/)でデバッグすることをお勧めします。スミレ畑でもコードテストと同様の機能が利用できます。

# 注意点

## 未サポートの文法
AtCoderで導入されているプロデルは、1.9.1182は、大幅改良した1.9.1210以降でサポートした次の文法をサポートしていません。

- `そして`句
- `もし`の省略
- 0を基にする添字`#`

## パフォーマンス
AtCoderで導入されているプロデルは、次のパフォーマンス上の懸念があります。

- 配列アクセスのパフォーマンスが悪いです。一般的な問題を解く場合には支障ありませんが、計算量が重要になる問題は注意しないとTLEで通過しない可能性があります
- プラグインの読み込みのために実行時にも初期化におそらく100～200msほど掛かっています

## 既知のバグ
AtCoderで導入されているバージョンでは、次の機能がフルコンパイルに対応していため、実行できません。

### 文字列の～文字目
代わりに、取り出す手順を使います。

```
内容は「こんにちは プロデル」
内容の3文字目から1文字取り出して出力する
```

### データ型の異なる数値の比較演算
データ型の異なる数値の比較が正しくできない場合があります。
「整数」名詞手順で型変換する必要がある場合があります。

```
【I:整数】=0
【F:浮動小数】=0
//もしI=Fなら「同じ」を出力する
もしI=Fの整数なら「同じ」を出力する
```

# フィードバックについて

プロデルは、コミュニティが小さいので、バグフィックスが活発ではありません。バグなどお気づきの際は、具体的で建設的なフィードバックをお願いします。できる範囲で対応します。

またプロデルは、コンパイラ・開発環境・ドキュメント・ブログ記事をすべてワンオペで作業しています。また、一般のプログラミング言語にあるような、書籍の印税や記事執筆の報酬、アフィリエイト、スポンサーなどの収入は現在一切得ていません。ご利用はセルフサービスの精神でお願いいたします。


# 終わりに
パフォーマンスの懸念点などは、公式サイトで公開中の最新版で、改善しています。アップデートが適用されることを待つばかりです。

気がついたことがあれば加筆していきます。
【癒し】いっぱいの動物を動かしたーい！【Unity Entities】

# 概要
動物をいっぱい表示して癒されたいよう :cry:

![スクリーンショット 2024-12-09 22.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/60eedc4d-b962-f112-28cc-cd28aebf35b3.png)

こんな感じの可愛い奴らをさ、いっぱい出したいよう

# 描画
![スクリーンショット 2024-12-10 0.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/134a4d28-5659-fc9e-ffc8-d86dd4ec96d3.png)
かわい〜〜〜〜


![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100503/99d0b915-ac0f-86cf-7ada-f1ad8260b60c.gif)

動いてくれもする


# 解説
UnityのECSを使って実装しています

ほとんどの実装は

この動画と

https://www.youtube.com/watch?v=zn3m6ZFppdQ&t=66s

この記事にまとまっています

https://qiita.com/inu_inuinu/items/473e554680489300c07c

データ周りは合体していて
```csharp
    public struct DobutsuIppaiHaichi : IComponentData
    {
        public float SpawnRadius;
        public int SpawnCount;
        public uint RandomSeed;
    }

    public struct DobutsuIppaiHaichiPrefabBuffer : IBufferElementData
    {
        public Entity DobutsuPrefab;
    }
```
データ用のstructを用意して、
```csharp
// バッファを使うためにDynamicでEntityを取得して。。。。
var entity = GetEntity(TransformUsageFlags.Dynamic);

// unmanagedな変数は先に入れておいて。。。
var dobutsuIppaiHaichi = new DobutsuIppaiHaichi
{
    SpawnRadius = src.SpawnRadius,
    SpawnCount = src.SpawnCount,
    RandomSeed = src.RandomSeed
};

// バッファを追加する
var buffer = AddBuffer<DobutsuIppaiHaichiPrefabBuffer>(entity);
foreach (var prefab in src.Prefabs)
{
    buffer.Add(
        new DobutsuIppaiHaichiPrefabBuffer
        {
            // バッファに入れるプレハブも当然Dynamic
            DobutsuPrefab = GetEntity(prefab, TransformUsageFlags.Dynamic)
        }
    );
}
```
データ用のエンティティにバッファも追加したりもしています

# 気をつけること
 - SystemAPI.Queryはforeach内でしか使えない
```csharp
var hoge = SystemAPI.Query<DynamicBuffer<Hoge>>();
```
こういうのはコンパイル時にエラーになる

 - IComponentDataにはunmanagedの変数しか入れないようにする
```csharp
public struct HogeData : IComponentData
{
    public List<int> values;
}
```
こういうのはエラーにならないが、
```csharp
AddComponent(GetEntity(), new HogeData());
```
AddComponent時にエラーになる

```csharp
public void AddComponent<T>(Entity entity, in T component) where T : unmanaged, IComponentData
```
定義を見ると、Tはunmanagedでなくてはいけないことになっているためここででエラーになる
曲率半径の話Ⅰ

# はじめに
PhysiKyu Advent Calendar 10日目です！今日は曲率半径の話をします。

# 曲率半径の意味

![スクリーンショット (183).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942507/27fc8f23-8836-9ca7-d0df-64d50565fd60.png)


曲線の微小部分を上図のように円弧で近似することを考えます。曲率半径は、この円の半径を意味します。よって、曲率半径は、大きければ曲線の曲がり具合は小さく、逆に小さければ曲がり具合は大きくといった感じで曲線の曲がり具合を表す量となっています。また、この曲率半径の逆数をとったものを曲率といいます。

# 曲率半径を求めよう➀
次は、曲率半径を実際に求めていきます。ここでは、物体の運動の軌道について曲率半径を考えます。
物体が時間$d t$の間に点$P$から点$P\prime$に移動する状況を考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942507/ab4e8a1a-240e-3415-8915-ea076502cccd.png)


このとき、軌道の微小部分を円弧で近似する。半径$\rho$、中心角$d\theta$とすると、軌道の微小部分の長さ$d s$について、

$$\rho = \frac{ds}{d\theta}$$

$$=\frac{ds/dt}{d\theta/dt}$$

$$=\frac{v}{d\theta/dt}$$

ここで$\frac{d\theta}{dt}$を物体の速度$\mathbf v$と加速度$\mathbf a$を用いて書き直すことを考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942507/d7be6ce3-5d46-00b4-944b-63f6be43c19e.png)


$$\frac{d\theta}{dt}=|\frac{d}{dt}(\frac{\mathbf v}{v})|$$

$$=\frac{|\mathbf a v-\dot v\mathbf v|}{v^2}$$

よって、

$$\rho=\frac{v^3}{|\mathbf a v-\dot v \mathbf v|}$$

このように曲率半径が求められました。

# 曲率半径を求めよう➁

次は上でやったのとは別の方法で曲率半径を導出しようと思います。
考える状況は以下の通りです。

曲線$y=f(x)$上の２点$P$、$P'$における$s$の法線を$l$,$l'$として、この2つの直線の交点を点$O$とします。ここで、点$P'$を点$P$に限りなく近づけたときの線分$OP$の長さを求めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942507/e34c2225-d388-b4fc-3089-0dced8dd0b90.png)

これは$P(t,f(t))$、$P'(t+\Delta t,f(t+\Delta t))$として$\Delta t \rightarrow0$を考えることで求められます。計算が煩雑なので途中過程は最後に載せておきます。
$$OP=\frac{[1+\{f'(t)\}^2]^\frac{3}{2}}{|f''(t)|}(=\rho)$$
考えた状況からここで求めたものが曲率半径$\rho$であると分かります。
# まとめ
今回は二つの方法から曲率半径の式を求めて、それぞれ違う形の式が得られました。実はこれらの式は変形していくことでちゃんと同じ式に表されます。この内容は近いうちに「曲率半径の話Ⅱ」としてまとめて投稿したいと考えてます！
以上です。ありがとうございました！
# 参考にした文献・サイト
・基幹講座物理学 力学　篠本磁、坂口英継
・高校数学の美しい物語　曲率・曲率半径の感覚的な意味と求め方 
　https://manabitimes.jp/math/952

 # ＊「曲率半径を求めよう➁」の途中過程
 ![スクリーンショット (185).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942507/2ef10d48-34cf-985f-afb2-39926f002dd1.png)
![スクリーンショット (187).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942507/9db96654-8172-c8e6-4fc1-e1dc3f2a40d7.png)
いろんなSagaパターン

一年を振り返る Advent Calendar 2024の14日目です。

転職してからマイクロサービスアーキテクチャを採用しているので色々勉強してみたのですが、

Saga パターンというのがコアになる設計だという印象を受けています。

個人的にこの記事がわかりやすい。

https://qiita.com/yasuabe2613/items/b0c92ab8c45d80318420

で、色々調べていると他のベンダーもこぞって Saga パターンの記事を書いているのでまとめてみた。


- Microsoft

https://learn.microsoft.com/ja-jp/azure/architecture/reference-architectures/saga/saga

- AWS

https://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/modernization-data-persistence/saga-pattern.html

- Oracle

https://blogs.oracle.com/oracle4engineer/post/simplify-microservice-transactions-with-oracle-database-sagas-ja

- Google

https://cloud.google.com/blog/ja/topics/developers-practitioners/implementing-saga-pattern-workflows

マイクロサービスで設計をし始めて今の案件の設計しか知らんのであれですが、こういうのってコンポーネントの最適な分割ってどうやってやるのかなぁというのが気になりました。

あと、API Gateway - Lambda - DynamoDB の構成にしてたとして、認証周りってIAMに依存したりするのでそこ死んだら結局アウトよなぁというので、こういうのもっと事例見て勉強していきたいと思います。
オープンシステム入門教室

オープンシステム入門教室 : ダウンサイジングに対処するための10科目 (スキルアップ・シリーズ) 図書 小暮裕明 著. CQ出版, 1992.11
https://researchmap.jp/blogs/blog_entries/view/84202/0a9294363f60fe55882bbfe1f4735245?frame_id=452323

オープン・システム入門教室―ダウンサイジングに対処するための10科目 (スキルアップ・シリーズ)
小暮 裕明　CQ出版　1992/11/01
https://www.amazon.co.jp/dp/4789835146
>
国語
　ドキュメント書法
　設計方法論CASE
　開発言語
　データ変換
　　漢字コード体系
社会
　コンピュータ史
　MIS, SIS, SI
　ダウンサイジングと分散処理システム
　UNIXの政治学・標準化戦略
　第三の波
算数
　CPU能力算定
　信頼性計算
　パフォーマンス
理科
　分散システム形態とOS
　ネットワーク・アーキテクチャ
　通信ネットワーク構成
　オープンシステム構成のハードウェア選定
技術
体育
英語
家庭
音楽・　美術
倫社
卒業旅行
技術士　最近の記事

最近、技術士の記事を継続して記載している。

# 最近
１０月末までの記事では、

技術鑑定は技術士(24)に Researchmap(34)
https://qiita.com/kaizen_nagoya/items/9378edc12a7cefddd59b

月刊 技術士(28) あれこれ Researchmap(35)
https://qiita.com/kaizen_nagoya/items/1e180fb01a48b399b2f4

技術士(2) 情報工学 試験を受ける人が読む技術士の書いた本１０冊 researchmap(19)
https://qiita.com/kaizen_nagoya/items/fa3ac26236410ee7dd01

技術士(1)の書いた本を百冊読む目標 Researchmap(8)
https://qiita.com/kaizen_nagoya/items/089f41b23dd7a47337c7

技術士(4)情報工学 が読んでいるとよい雑誌 researchmap(30)
https://qiita.com/kaizen_nagoya/items/a8a59e54a6eda07b3190

技術士(27)の方の書かれた本 1000冊 Researchmap(37)
https://qiita.com/kaizen_nagoya/items/6e1ea2e2f3367199a729

# ちょっと前

アセッサが技術士(21)だとよい理由。官(11) Researchmap(32)
https://qiita.com/kaizen_nagoya/items/f15f41a39ade111427b6

情報工学の技術士(3)になるには Researchmap(29)
https://qiita.com/kaizen_nagoya/items/ee5d351b862d8771ed1a

技術士(20)1000冊。 researchmap(36) 資料一覧
https://qiita.com/kaizen_nagoya/items/02286b43bfc9799f394b

勉強会参加の方向性 技術士(16)
https://qiita.com/kaizen_nagoya/items/07eced3298107b15f578
AtsEXで閉塞情報と地上子情報を使用する

　拙作のATS-PTプラグインでは、地上子(Beacon.Put)のSendDataに2閉塞先までの距離情報を入力する必要があったが、AtsEXにより閉塞情報を取得するようにして路線データ制作者様の負担を軽減することにした。
　AtsEXにて地上子情報と閉塞情報を利用したので、備忘録としてまとめておく。

　なお、以下ではBveHacker.Scenario.～にアクセスしているが、シナリオの読込完了前にアクセスすると例外が発生する。
　シナリオの読み込み完了前にアクセスする可能性があるならBveHacker.IsScenarioCreatedがtrueであることをチェックすること。
  
  
### はじめに
SectionもBeaconもMapObjectBaseクラスの継承なので、距離程を取得できる。
~~~C#
// 0番目の閉塞の設置距離程
double location1 = BveHacker.Scenario.Route.Sections[0].Location;
// 0番目の地上子の設置距離程
double location2 = BveHacker.Scenario.Route.Beacons[0].Location;
~~~

### 閉塞
#### 閉塞制御クラスから
~~~C#
// 閉塞リストにおける、現在自列車がいる閉塞のインデックス
int sectionIndex = BveHacker.Scenario.SectionManager.Sections.CurrentIndex;
/*
まだ一度もSection.Begin(～) を通過していないなら-1になっている。
*/

// 現在自列車がいる閉塞の信号インデックス
int sectionSignal = BveHacker.Scenario.SectionManager.CurrentSectionSignalIndex;

// 現在自列車がいる閉塞の信号による制限速度
double nowLimit = BveHacker.Scenario.SectionManager.CurrentSectionSpeedLimit;

// 現在自列車がいる閉塞の次の閉塞の信号による制限速度
double nowLimit = BveHacker.Scenario.SectionManager.ForwardSectionSpeedLimit;
~~~

#### 閉塞リストから
~~~C#
// 閉塞リスト(≒ Section.Begin(～) のリスト)
MapObjectList lSection = BveHacker.Scenario.Route.Sections;

// i番目の閉塞(≒ i番目のBeacon.Put(～))
Section section = (Section)lSection[i];

// i番目の閉塞の信号インデックス
int signalIndex = section.CurrentSignalIndex;

// 信号現示インデックスのリスト (Section.Begin(～)で指定した信号インデックス)
List<int> signals = section.SignalIndexes;

// 列車 (自列車・先行列車) が走行している閉塞のインデックスの一覧
List<int> trainsOn = section.SectionIndexesTrainOn;
~~~

### 地上子
~~~C#
// 地上子リスト(≒ Beacon.Put(～) のリスト)
MapObjectList lBeacon = BveHacker.Scenario.Route.Beacons;

// 地上子を通過した際の、地上子リストにおける当該地上子のインデックス
int i = BveHacker.Scenario.Route.Beacons.CurrentIndex;

// i番目の地上子(≒ i番目のBeacon.Put(～))
Beacon beacon = (Beacon)lBeacon[i];

// i番目の地上子(≒ i番目のBeacon.Put(～))の種類と送信値 Beacon.PutのTypeとSendDataと同じ
int beaconType = beacon.Type;
int beaconData = beacon.SendData;

// i番目の地上子(≒ i番目のBeacon.Put(～))の対象となる閉塞のインデックス
int beaconSection = beacon.TargetSectionIndex;
/*
TargetSectionIndex = 地上子設置距離程におけるSectionのインデックス + Beacon.Putで指定された閉塞相対インデックス
*/
~~~
※閉塞相対インデックスが-1の場合は、TargetSectionIndexは現地点以降の最寄りの停止現示の閉塞のインデックスではなく、上式で計算された値もしくは2,147,483,647が格納されている。
※TargetSectionIndexが負になったり、閉塞リスト数以上になる可能性があるため、TargetSectionIndexを使用して閉塞リストにアクセスする場合はチェックしないとぬるぽになる。
Oracle Master Silver DBA(Oracle Database Administration I)の合格体験記と勉強方法まとめ

# はじめに
Oracle Master Silver DBA(Oracle Database Administration I)に合格したため、その勉強方法と要点をまとめます。

合格時の私のスペックは以下です

- 2023年4月入社、ITエンジニア2年目
- 情報系大学院卒業
- 合格時取得資格：応用情報、ネットワークスペシャリスト、Java Silver/Gold
- 2024年10月にデータベーススペシャリスト受験済み（合格発表はまだ）
    - SQL等の一般的な内容の知識は既に習得済み

# 勉強方法
以下の「オラクルマスター教科書 Silver DBA Oracle Database Administration I」をベースに勉強を進めました。

3週間、50~75時間程度の勉強量だったかと思います。データベーススペシャリストを先に受験したためスムーズに学習が進みましたが、DBをあまり勉強したことない、SQLよく分からないといった状況からの場合はもっと時間がかかると思います。

https://www.shoeisha.co.jp/book/detail/9784798172033

以下の流れで勉強しました

#### 教科書の学習（1週目）
1日1章、2章くらいのペースで進め、2週間くらいかかりました。

1. 講義パートを読み、ざっくりと頭にいれる
1. 練習問題を解く
1. 練習問題の解説を読み（成否に関わらず）、関連する講義パートを再度読む
1. 練習問題を再度解く

Java Goldの時とほぼ同じ勉強方法です

https://qiita.com/yamayamaKo/items/b05827159b0371997cb1

#### 教科書の学習（2週目）
こちらは1日2章、1週間弱で終えました。

1. 講義パートを再度読み、わかりにくい点・覚えていなかった点を紙に書いてまとめました。

    ![スキャン 1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/117f6445-813d-cdc3-334e-6e9865802d86.jpeg)
こんな感じです。個人的に「紙に書く」という行為によって頭に入る気がしています。ただ、正直やらなくても合格できると思います。
2. 練習問題を解く

#### 1~23章の練習問題をもう1周する

1~23章の練習問題をもう1回解きます。大体すぐ解けるので、2,3日でバーっと1周やり切ります。

全ての練習問題に正解できるな、と思ったら模擬問題に移ります。

#### 模擬問題を解く
この時点では90問中75問正解、83%の正解率でした。

問題なく合格できそうだと思ったので、3日後くらいに試験を予約しました。

#### 模擬問題、1~23章をもう1周する

模擬問題をもう1周し、模擬問題を全問正解できるようにしました。

心配性だったので、1~23章の問題の4周目をやりました。流石に選択肢を全て覚えてしまい、反射で解いており意味があったのか不明です。

# 試験結果
89%で合格でした💮
それなりに点数を獲得できたので良かったです！

![スクリーンショット 2024-12-09 23.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/728813/915a0571-9be4-4f50-2b38-b5db634a3f84.png)

Oracle Databaseの試験は消去法で解ける問題が結構多かった気がします。

### おまけ：ピアソンVUEのオンライン受験
今回はテストセンターの不具合のためテストセンターで受験できなかったため、後日ピアソンVUEのオンライン受験を利用しました。

**驚くほど操作が重いです。** 全ての操作をする度に画面が固まります。
ラジオボタンを選択→5秒フリーズ→「次へ」を選択→5秒フリーズ→...といった具合です。

使用したPCはM1 Macbook Proで、マシンスペック上は問題無さそうに思います。また、通信も[fast.com](https://fast.com/ja/)で、100Mbps程度はありました。

Appleチップの問題で、Intelチップだと重くないのか、Macと相性が悪くWindowsなら重くないのか、アプリ側に問題がありどんな環境でも重いのか分からないです。

通常40分程度で終わる問題でしたが、倍近くの1時間15分ほどかかりました。

**そのため、試験時間に余裕を持って終わる自信の無い場合はテストセンター受験をオススメします。**

# 今後に向けて
Oracle Master Silverの勉強を通して、体系的にOracleの知識を仕入れることが出来ました。RAC構成やインスタンスなど、これまで聞いたことがあり、調べてもイマイチ理解できなかった内容を理解できたのが良かったです。

次はOracle Master Goldも取得したいと思っています。2025年3月までの取得を目指し、そろそろ勉強を始めてみようと思います！

# おまけ
これまでに受けた資格の体験記も書いているので、ぜひ見てください！

https://qiita.com/yamayamaKo/items/b05827159b0371997cb1

https://qiita.com/yamayamaKo/items/8d35c959b6cfdb750cd0
Wordでロゴ作成

## 初めに

疑問に思ったことや上手くいかなかったことのアウトプットをしています。
自分なりの理解でアウトプットしていきます。初学者なので誤りもあると思います。
その際はご指摘いただけると幸いです。

## 目的
アプリのヘッダーにロゴを載せたくてペイントなどのソフトをいろいろと試しましたが、どうしても文字を囲う白い背景も載ってしまって、ヘッダーを塗りつぶしてしまいます。
そんなリスクを回避して文字だけを切り抜いたロゴを作成したいと思い、いろいろと調べました。

## やり方
Wordを使ったロゴの作り方を紹介します。

1.まず新規文書を開き、文字を打ち込みます。
余談ですが、フリー素材には商用利用可能なフォントも存在します。
こちらをインストールして作るのもいいかもしれませんね。

2.その後切り取ります（Ctrl + X)。

3.図として貼り付けます。
右クリックで貼り付けのオプションを選べますので、そこで図を選びます。

4．図として保存を選びます。
こちらも右クリックでできます。

### これで背景が透明な、文字だけを切り抜いたロゴの完成です！
久々にLogic Appsを触ったらGUIが変わってた件

一年を振り返る Advent Calendar 2024の15日目です。あと10本。短いブログを淡々と書き続けていきます。

最近はずっとAWSばかり触ってる（というかAWSも触ってない。プロマネしかしてない。）ので、久々にAzureにログインしてLogic Appsを触ってみようと思ったら、なんかGUIが変わっていた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/ef7d20d9-06db-72f9-6f63-d73b87c864bd.png)


ASEv3とかワークフロー サービス プランはわかるけど、ハイブリッドなるものが選択できるようになっている。

どうやらAzure Container Appsが必要なみたい。

https://learn.microsoft.com/ja-jp/azure/logic-apps/create-standard-workflows-hybrid-deployment?tabs=azure-portal

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3626174/89e61c7f-ba0c-4021-6178-31bb7e271ae2.png)

久々にLearn読んでみたが日本語がわかりにくい。運用環境って書いてるけど英語でみたら

- During the preview, Azure Container Apps on Arc are not supported in production configurations.
 
なので商用環境で使わないでね。ってことですね。なのでちょっとの間は皆さん使わないようにしてあげてください。

終わり。
ISUCONやってみてわかったこと


さてみなさんこんにちは。
デジタル創作サークルUniProjetのあかつきゆいとです。
今回は、同じくUniProのしばいぬさんとISUCON 14に参戦した話です。

※「ISUCON」は、LINEヤフー株式会社の商標または登録商標です。

## ISUCONとは

ISUCONとは、「いいかんじにスピードアップコンテスト」の略で、LINEヤフー株式会社さんが毎年やってくれています。
その名の通り、お題として渡されたWebサービスを(サーバーなどのインフラから丸々)高速化して、速さを競うというものです。
1チーム3人までで、学生枠もあったり、賞金もあったりして、今年のISUCON14では800チーム以上が参加していたようです。

https://isucon.net/

## 参加したきっかけ

私はですね...
ここで言うのもなんですが、[東京科学大学(旧:東京工業大学)デジタル創作同好会traP](https://trap.jp)さんに強い憧れがありまして...
UniProもそんな思いで立ち上げたのです。

その、traPさんのメンバーがISUCONに参加していたのを見て、**これやってみたいわ**ってなったのがきっかけですかね。

あとは、こたまごさん(さくらインタの方ですね)が作問をしていたことでより深く知ったというのもあるかもしれません。

## 当日やったこと

1. DBのインデックス化
2. MariaDBに変更
3. HTTP3/QUICに
4. 3台あるサーバーをそれぞれNginx専用などとして分散
5. Goをいじってアルゴリズムを変えようとした(が、無理だった)

## 参加してみてわかったこと

### 問題文というか、仕様書を理解するのがまずむずい

当日問題が発表されて、それと同時に仕様書に当たるマニュアルが配られます。
そこでまず、関門1です。
**読んでも内容を理解するまでに時間がかかる**。
これにつきます。

当日配られたマニュアルがこれです。

<https://gist.github.com/wtks/8eadf471daf7cb59942de02273ce7884>

<https://gist.github.com/wtks/0a3268de13856ed6e18c6560023ec436>

これを読んで、まずどこのエンドポイントがどういう動きをしているかを理解する必要がありました。
最初こそ良かったものの、最終的にサラッと流してちゃんと理解できていなかったのが仇となり、だいぶグダりました。

### インタプリタは遅い

最初から用意されている言語の中で、私がちゃんと使えるのはJS/TS, Pythonで、しばいぬさんが使えるのはPythonという状況だったので、Pythonでプログラムいじろうって話になってました。
ただ、**インタプリタだからか、すげぇ遅いわ**ってなりました。Goに変えるだけでx1.5くらいのスピードが出ました。劇的変化ですよ。

ただ、今までほぼ使ったことのないGoはそもそもビルドでちょっとつまづきましたね。

### AWSの使い方がまだまだだなと

AWSとか使ったことなかったんですよね。
というのも、UniProにはしばいぬさんの家にあるProxmoxがあり、それをいつも使っているので、クラウドを使うことがありません。
私が業務で使ってきたものは、偶然にもMicrosoftAzureだったり、GCPだったりで、AWSは全くの無知でした。

### 仲間は大切

やっぱりね、今回もしばいぬさんに助けられてばかりでしたね。
大事です、仲間は。

## 改善点

やはり、知識不足を感じましたね。
スロークエリとか全然考えてませんでしたし、SSEに関する知識が全然なかったですね。
あとで解説聞いて、ほへーとか思いながら聞いてました。

## まとめ

やっぱり楽しかったですね。
学ぶことも非常に多かったです。

今回は500位を超えてしまいましたが、来年は200位くらい目指したいですね。
カスタムソート関数の作成方法(AtCoder ABC308)

## 本記事の内容

配列の要素を比較する際に要素での比較だけではなく処理を行ったうえで比較する方法を紹介します

競技プログラミングサイトであるAtCoderのABC308 C問題を使用して解説をしていきます。


### 問題文
![スクリーンショット 2024-12-10 0.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3767231/cf9ae598-035e-8be5-7a00-62d48e7fe51b.png)


この問題を解くにあたって、単純に期待値を求めた後にソートしたいなという発想がまず最初に思い浮かぶと思います。

### 愚直に書いたコード(正しく動かない)
```Python
n = int(input())
ab_n = [list(map(int, input().split())) for _ in range(n)]

arr = []
for i in range(n):
    a, b = ab_n[i]
    expected_val = a / (a + b)
    arr.append((i, expected_val))

sorted_arr = sorted(arr, key=lambda x: x[1], reverse=True)

ans = [i + 1 for i, _ in sorted_arr]
print(*ans)
```

### 解決方法
上記のコードが正しく動かない理由として、**浮動小数点**が登場しており、ここで誤差が発生しています。
これを解決する方法として、分母を払い通分をして整数での比較をすることで誤差が発生することなく求めることが出来ます。

### (例)
```math
\displaylines{
\frac{99}{100} と \frac{100}{101} 
}
```
を比較する際には分母を払い差を求めることで正しく値を比較出来ます。

分母を払う
```math
99 \times 101 - 100 \times 100 
= 9999-10000
=-1
```
今回であれば
```math
\frac{100}{101}
```
のほうが大きいことがわかります。


これをコードに落とし込むために要素ごとの比較をする必要があります。そのためにカスタムソート関数を作成します。


### カスタムソートのコード
```Python
def key_func(i, j):
    """
    条件に基づいて2つのインデックスを比較

    2つのリストAとBの要素に基づいて値を計算し比較結果に基づいて-1、1を返す。
    -1のときはそのまま、1のときはiとjを入れ替える。
    """
    diff = A[i] * (A[j] + B[j]) - A[j] * (A[i] + B[i])
    if diff > 0:
        return -1
    elif diff < 0:
        return 1
    else:
        return -1 if i < j else 1
```

-1,1についてですが、後に登場するソート関数の内部の処理で-1であれば入れ替えない、1であれば入れ替えるという処理が行われています。


### 正解したコード
```Python

from functools import cmp_to_key


def key_func(i, j):
    """
    条件に基づいて2つのインデックスを比較

    2つのリストAとBの要素に基づいて値を計算し比較結果に基づいて-1、1を返す。
    -1のときはそのまま、1のときはiとjを入れ替える。
    """
    diff = A[i] * (A[j] + B[j]) - A[j] * (A[i] + B[i])
    if diff > 0:
        return -1
    elif diff < 0:
        return 1
    else:
        return -1 if i < j else 1


n = int(input())
A, B = [0] * n, [0] * n
for i in range(n):
    A[i], B[i] = map(int, input().split())

ans = list(range(n))
ans.sort(key=cmp_to_key(key_func))

a = [i + 1 for i in ans]
print(*a)

```

今回はインデックスの順番を求める必要があったためA,Bを定数として定義して求めました。



### さいごに
ソート関数の関数は引数に関数を渡すので慣れないとなかなかすぐに書けないので沢山書いていきたいと思います。

(追記)
久しぶりにTEXを書いたのですが、QiitaはTEXにも対応していて本当に便利だなと実感しました。
RでGIS（CSVの座標値リストからポイント作成）

# はじめに
画像のように緯度経度の座標値のリストがあった際に、座標値の位置にポイントデータを作成する方法を紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/6c5598f6-5eef-97e1-1ffd-38cf0651c1d4.png)


# 必要ライブラリ
```R
library(sf)
```

# 座標値のリストを読み込む
今回は[大阪市オープンデータ](https://www.city.osaka.lg.jp/toshikeikaku/page/0000250227.html)から、防災関連施設ポイントデータ（災害時避難所・一時避難場所）のcsvを使用します。
データをダウンロードしてcsvをRで読み込みます。
```R
input_data <- read.csv("hoge/hoge.csv")
```
データを確認して、座標値が経度と緯度のカラムに入っていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/0fcf665b-af11-bf7f-ca43-3826b8d222de.png)


# 座標値からポイント作成
sfパッケージの`st_as_sf`を使用します。

```R
#座標値から位置座標とCRSを指定
point_sf <- st_as_sf(input_data, coords = c("経度","緯度"), crs=4326)
```

`coords`にて、経度、緯度のカラムを指定します。
`crs`にて座標値の座標系を指定します。今回使用するデータの座標値は緯度、経度なので座標系はWGS84である4326を指定します。


# 地図で描画してみる
```
mapview::mapview(x=point_sf)
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61492/d0971dd0-b40a-0220-0566-52c7ba40d5a5.png)
きちんと緯度経度の位置にポイントが落とされています。
無線LANの周波数帯域

一年を振り返る Advent Calendar 2024の16日目です。なんやかんや25日折り返しを過ぎていました。頑張って完走してみようと思います。

IoTプロジェクトをやっていると、ソースコードはあっているのに電磁波の影響で出力結果が変わってしまうとか、無線LANのデバイスが部屋によって疎通不良を起こしたりと物理的な要因の影響でうまく動かないことがあるというのを学んでおります。

そんな感じで周波数ってどんな種類があるのかというのを整理、というか引用。

https://ja.wikipedia.org/wiki/%E9%9B%BB%E6%B3%A2%E3%81%AE%E5%91%A8%E6%B3%A2%E6%95%B0%E3%81%AB%E3%82%88%E3%82%8B%E5%88%86%E9%A1%9E

VLF だと水中にも電波が到達するので潜水艦でもつながるのか。潜水艦もIoTの時代ですね。

今までネットワークもTCPとかしか勉強してこなかったですが、BACNetとかModbusとか知らない単語がとても多いので、IoTやっていくならちゃんとこういう知見も必要だなと思っている今日この頃です。
ONLYOFFICE DocSpace：Vultrで利用可能なワンクリックアプリ

素晴らしいニュースです！Vultr MarketplaceのONLYOFFICE DocSpaceにワンクリックで簡単にアクセスできるようになりました。これにより、Vultrの信頼性の高いインフラストラクチャ内で、安全なルームベースのコラボレーションプラットフォームを迅速に作成することができます。

<img class="alignnone wp-image-222104 size-full" src="https://static-blog.onlyoffice.com/wp-content/uploads/2024/12/09135213/DocSpace-on-Vultr.png" alt="ONLYOFFICE DocSpace: one-click app available on Vultr" width="1470" height="742" />

<!--more-->
<h2>Vultrマーケットプレイスについて</h2>
Vultrは世界中の数多くのデータセンターに戦略的に配置し、パブリッククラウド、ストレージ、専用ベアメタルサーバへのシームレスなアクセスを提供しています。

<a href="https://www.vultr.com/marketplace/" target="_blank" rel="noopener"><u>Vultr Marketplace</u></a>は、ボタンをクリックするだけで、Vultrのインフラストラクチャ上に簡単にデプロイすることができる一般的なアプリケーション、ソフトウェアスタック、オペレーティングシステムの広い範囲を備えています。
<h2>開始方法</h2>
<ul>
 	<li>Vultrアカウントに<a href="https://my.vultr.com/" target="_blank" rel="noopener"><u>ログイン</u></a>するか、Vultr を初めて利用する場合は<a href="https://www.vultr.com/register/" target="_blank" rel="noopener"><u>新規アカウントを作成</u></a>します。</li>
 	<li>Vultr Marketplaceの<a href="https://www.vultr.com/marketplace/apps/onlyoffice-docspace" target="_blank" rel="noopener"><u>DocSpaceリストに</u></a>移動し、<strong>Deploy</strong>ボタンをクリックします。</li>
</ul>
<img class="wp-image-222051 size-full" src="https://static-blog.onlyoffice.com/wp-content/uploads/2024/12/09105122/vultr-onlyoffice-docspace.png" alt="ONLYOFFICE DocSpace: one-click app available on Vultr" width="1400" height="805" /> ONLYOFFICE DocSpace on Vultr
<ul>
 	<li>サーバの場所やサイズ、自動バックアップ、DDOS 保護など、デプロイに必要なパラメータを指定します。</li>
 	<li>準備ができたら、<strong>[Deploy Now]</strong>ボタンをクリックします。</li>
 	<li>SSH<code>ssh root@use.your.ip</code>経由でインスタンスに簡単にアクセスし、設定を確定します。</li>
 	<li>その後、ブラウザで<code>http://use.your.ip</code>、新しいONLYOFFICE DocSpaceを起動してください。</li>
</ul>
<p style="text-align: center;"><a class="red button" href="https://www.vultr.com/marketplace/apps/onlyoffice-docspace" target="_blank" rel="noopener">DOCSPACEをデプロイする</a></p>
<em>ご注意：Vultr MarketplaceはONLYOFFICE DocSpaceの無料コミュニティビルドをホストしています。エンタープライズ版が必要ですか？</em><a href="https://www.onlyoffice.com/ja/download.aspx?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=docspace_vultr#docspace-enterprise" target="_blank" rel="noopener"><u><em>公式ウェブサイトから</em></u></a><em>入手してください 。</em>
<div class="useful-links">
<h3>お役立ちリンク<u></u></h3>
<a href="https://www.onlyoffice.com/ja/docspace.aspx?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=docspace_vultr" target="_blank" rel="noopener"><u>ONLYOFFICE DocSpaceの詳細情報</u></a>

<a href="https://www.vultr.com/marketplace/apps/onlyoffice-docspace" target="_blank" rel="noopener"><u>VultrマーケットプレイスのDocSpace</u></a>

<a href="https://marketplace.digitalocean.com/apps/onlyoffice-docspace" target="_blank" rel="noopener"><u>DigitalOceanマーケットプレイスのDocSpace</u></a>

<a href="https://www.onlyoffice.com/ja/hosting-providers.aspx?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=docspace_vultr" target="_blank" rel="noopener"><u>ONLYOFFICEホスティングプロバイダ</u></a>

<a href="https://www.onlyoffice.com/blog/ja/2024/11/onlyoffice-docspace-3-0-released?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=docspace_vultr" target="_blank" rel="noopener"><u>ONLYOFFICE DocSpace v3.0</u></a>

</div>
GoでWebAPIを使って現在時刻を取得する

この記事は「[大分高専 Advent Calendar 2024](https://adventar.org/calendars/10845 "大分高専 Advent Calendar 2024")」10日目の記事です．
## はじめに
 GoでAPIを作っている時に，現在の日時を取得する必要があったので，実装してみました．現在の日時の取得には[IchigoJam + MixJuice用 日付＆時間データ](http://www.openspc2.org/data/date/ "IchigoJam + MixJuice用 日付＆時間データ")というAPIを使用しました．

 ### GoのNow関数
 実は，Goのtimeパッケージの中に現在時刻を取得できる関数があります．
 [time package func Now](https://pkg.go.dev/time#Now "Goの現在時刻を取得してくれる関数")
 
```go:time.go
package main
import (
	"fmt"
	"time"
)
func main() {
	now := time.Now()
	fmt.Println("NOW : ", now)
}
```
出力は以下の通り．
```Bash
$ go run time.go
NOW : 2024-12-09 21:55:11.078017 +0900 JST m=+0.000137959
```
日付と時間が取得できました．
しかし，今回は曜日の要素まで一緒に取得したかったのと，秒数まで細かく取得する必要はなかったので，

https://qiita.com/mikecat_mixc/items/2504f4575d995e8c564c

 この記事を参考に，一番シンプルでデータが扱いやすそうな方法を選びました．
 
 ## 実装
 日付も時間もまとめて取得できる [http://www.openspc2.org/data/date/full.txt](http://www.openspc2.org/data/date/full.txt)というURLを使用しました．
```go:main.go
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"strconv"
	"strings"
)

func get_data() string {
	date_url := "http://www.openspc2.org/data/date/full.txt"

	resp, _ := http.Get(date_url)
	// Getリクエストを送る
	defer resp.Body.Close()

	byteArray, _ := ioutil.ReadAll(resp.Body)
	mozi := strings.Fields(string(byteArray))
	var toInt int
	toInt, _ = strconv.Atoi(mozi[3])

	switch toInt {
	// 曜日を漢字に変換
	// goのswitch文ってbreak要らないらしい
	case 0:
		mozi[3] = "日"
	case 1:
		mozi[3] = "月"
	case 2:
		mozi[3] = "火"
	case 3:
		mozi[3] = "水"
	case 4:
		mozi[3] = "木"
	case 5:
		mozi[3] = "金"
	case 6:
		mozi[3] = "土"
	default:
		mozi[3] = "休"
	}
	var content string
	add_content := [7]string{"/", "/", "(", ")", ":", "", ""}
	for i := 0; i < len(mozi); i++ {
		content = content + mozi[i] + add_content[i]
		//文字列の結合
	}
	return content
}
func main() {
	now := get_data()
	fmt.Println("NOW :", now)
}
```

出力は以下の通り．

```Bash
$ go run main.go
NOW : 2024/12/9(月)22:10
```

## おわりに
GoでWebAPIを使って現在日時を取得しました．
GoのNow関数でも現在日時を取得できるので，少し遠回りをしてるような感じがしますが，こういう方法もあるんだくらいに思って欲しいです．
10日目: RollingHashを実装する

[競プロ用ライブラリを作る Advent Calendar 2024](https://qiita.com/advent-calendar/2024/yukkku-ribitol)の10日目です.

https://qiita.com/advent-calendar/2024/yukkku-ribitol

# RollingHashって?

文字列みたいなデータに対して計算できる次の性質を持ったハッシュ関数$H$です.

- 文字列$S, T$のハッシュ値$H(S), H(T)$から, $S$と$T$を連結した文字列のハッシュ値$H(S + T)$も求められる
- ハッシュが衝突する ($S\ne T$なのに$H(S) = H(T)$になってしまうこと) 確率は無視できるくらいに小さい

# 仕組み

長さ$N$の$s_0, s_1, ..., s_{N-1}$という列のハッシュを

$\def\modp{\space\operatorname{mod}\space p}H(s) = s_0 + s_1 b + s_2 b^2 +\cdots+ s_N b^N \modp$

という感じに定義します. $p, b$ はパラメータです. $p$が素数で$2\le b\lt p$を満たす整数の組になっています.
長さ$M$の$t_0, t_1, ..., t_{M-1}$という列とくっつけた$s_0, s_1, ..., s_N, t_0, t_1, ..., t_N$という列のハッシュも考えてみると
```math
H(s + t) = H(s) + H(t) b^N
```
と計算できます. ハッシュ値と一緒に$b^N$の値も持っておけば楽に計算できますね.

## パラメータ設定

ここまでで出てきた$b$, $p$というパラメータの設定を考えます.
$p$はパフォーマンスの面から固定でやるのが望ましいです. $p = 2^{61}-1$でやるのが[有名](https://qiita.com/keymoon/items/11fac5627672a6d6a9f6)ですが, 人と同じことをしてもつまらないので$\mod 2^{64}-59$で行ってみましょう. これは`u64`で表現できる最大の素数です.

一方, $b$を固定してしまうと衝突させることが出来るので, こちらはランダムに設定する必要があります.
実行時に乱数を振ったりして決定するのが一般的な方法ですが, 何とかしてコンパイル時$b$を決めて実行時のオーバーヘッドを完全に0にしてみます.

予測が出来なければ良いので, ソースコード自体を基に$b$の値を生成してみましょう. Rustでは`include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/", file!()))`みたいに書くと自身のソースコードが取得出来ます.
仮にランダムな$b$を決めて, その$b$でソースコードのRollingHashを計算, その値を$b$に設定し直す, というようにすればソースコードに依存した$b$が得られます.

事前に用意されるテストケースは提出されるソースコードを知らないため, 故意に衝突させるのは殆ど不可能です.
CodeforcesのHackみたいなシステムがあるとあまり意味が無くなってしまいますが, AtCoderで使うならこれで十分ですね.

## 高速化

更に高速化の工夫として[モンゴメリ乗算](https://ja.wikipedia.org/wiki/モンゴメリ乗算)を導入します. Rustでは128bit/64bitの除算をあまり最適化してくれないので, こうやって速度改善を試みます.

モンゴメリ乗算とは, $0\le a, b\lt p$の範囲の整数$a, b$について, $f(a, b) = abX\modp$を高速に求めるアルゴリズムです.
何らかの定数$X$が掛けられてしまうので, $f(aX^{-1}, bX^{-1}) = abX^{-1}\modp$という風に全ての数に$X$の逆数がかかった状態で値を処理します.
ある数に$X$の逆数を掛けるには, $X^{-2}\modp$を予め計算しておいて$f(a,X^{-2})=aX^{-1}\modp$とすればいいですね.

RollingHashでは違う文字に違うハッシュ値が割り当てられればなんでも良いので, 文字の番号を最初から「$X$の逆数が掛かっている」と見做して逆数を掛けるのを端折っても問題ないです. 高速化のためにはそういう部分も削っておきましょう.

# 実装

- [`rollinghash.rs`](https://github.com/Yukkku/ribitol/blob/main/src/rollinghash.rs)

やるだけです. ある程度の最適化はコンパイラが頑張ってくれると信じて程々にコンパイラが最適化しやすいように書いてあげましょう.

# まとめ

いかがでしたか?

明日は有名データ構造を実装します.
【Ruby】rbenvでバージョンが切り替えられない場合の対処法

# `ruby`の参照先を確認する

```
$ which ruby
/usr/bin/ruby
```

`/usr/bin/ruby`は`/.rbenv/shims/ruby`となっていなければならない。

## 参照先を変更する

`~/.zprofile`に以下の記述を追記する。

```shell:~/.zprofile
export PATH="~/.rbenv/shims:/usr/local/bin:$PATH"
eval "$(rbenv init -)"
```

以下のコマンドを実行して`~/.zprofile`を読み込む。

```terminal
source ~/.zprofile
```
入院したのにパソコンいじる阿呆がいるらしい(1日目)

# 入院しました。

## 最初に

こんばんは(執筆時？)、 **Twil3akine** です。

タイトルの通り、入院したのですが、やることは変わらずプログラミングですね。

ということで、入院アドベント記事、やっていきます。(アドベントとは...😩)

:::note warn
超でかい疾病とかじゃないのでそこまで心配無用です！
:::



## 内容

ということで、 **入アド** 1日目の記事です。

今日やったことは
- みんな大好き **brainf_ck(bf)** のお勉強
- Chrome Extensions入門

です。



## みんな大好き brainf*ck(bf) のお勉強

[当時のログ(Twitter)](https://x.com/twil3akine/status/1873153826171306490)

さて、まず午前にやっていたのは**brainf_ck(bf)** のお勉強です。何故このタイミングかと言うと、元々、入門したかったのですが、なかなかタイミングがなかったからですね。

**brainfu*ck** とは8個の記号のみで成り立つプログラミング言語の1つでチューリング完全らしいです。チューリング完全ってなんですかね。

知らないですけど、そんなことはどうでもよくて、その8個の記号とはなんぞと、言われると以下の8個です。

```brainfuck
+ : 現在のポインタの値をインクリメントする
- : 現在のポインタの値をデクリメントする
> : 現在のポインタの位置をインクリメントする
< : 現在のポインタの位置をデクリメントする
[ : 現在のポインタの値が0ならば直後の]に移動する
] : 現在のポインタの値が0でないならば直前の[に移動する
. : 現在のポインタの値に対応するASCIIコードの文字を出力する
, : 現在のポインタに入力した文字に対応する値を格納する
```

以上です。何を言うてるんだって感じかもしれないんですけど、うだうだ言うよりも実際にコードを見たほうが早いですね。以下は`bf`で`Hello World!`を出力するコードです。(愚直に書いたので長いです。ゆえに閉じてます。)

<details><summary>Hello World! を出力するコード</summary>

```bf
H: 72
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++
.

e: 101

+++++ +++++
+++++ +++++
+++++ +++++
-
.

l: 108

+++++ ++
.
.

o: 111

+++
.

 : 32

----- -----
----- -----
----- -----
----- -----
----- -----
----- -----
----- -----
----- -----
+
.

W: 87

+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++
.

o: 111

+++++ +++++
+++++ +++++
++++
.

r: 114

+++
.

l: 108

----- -
.

d: 100

----- ---
.

!: 33

----- -----
----- -----
----- -----
----- -----
----- -----
----- -----
----- --
.

\n

----- -----
----- -----
---
.
```

</details>

ちなみに、ポインタが指す値の限界は255みたいで、それは以下のコードなどで確認できます。

```bf
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ ++   : a

>+[<.>+]
```

これはポインタの値が0になるまで無限に増えながら`a`を出力するコードです。



## Chrome Extensions入門

最近、あるユーザスクリプトを作りまして、DeepL API Keyを登録したらショートカットキー1発で和訳できるっているやつなんですけど、詳細は以下です。

https://greasyfork.org/ja/scripts/521946-smart-translate-with-deepl-api

https://github.com/Twil3akine/Smart-Translate

結構使いやすいんですよね。~~結果を表示するUIに目をつぶれば~~
なので、もっと色んな人に使ってもらおうと思った結果、「Chromeの拡張機能にすればいいじゃん」となり、今に至るわけですね。

今日やったのは、

https://developer.chrome.com/docs/extensions/get-started/tutorial/hello-world?hl=ja

https://developer.chrome.com/docs/extensions/get-started/tutorial/scripts-on-every-tab?hl=ja

https://developer.chrome.com/docs/extensions/get-started/tutorial/scripts-activetab?hl=ja

https://developer.chrome.com/docs/extensions/get-started/tutorial/service-worker-events?hl=ja

なんですけど、3つ目のが公式のコードを持ってきても動かなかったのでなんだか釈然としてません。
個人的に二つ目のやつは発展させれたらもう少し面白い感じになりそうな予感がします。予感です。

今後の展望としては、入門を終わらせて、着手にかかりたいですね。

## 最後に

とりあえず、1日目の記事はここでおしまいにさせていただきます。

明日は多分厳しいんじゃないかなぁ。3日目出すの目標にしている感じです。

それではまた、どこかで~~~
JavaScript: なまくらLZW

# LZW
かつて一世を風靡した情報圧縮法。これ無しでは世界は回らなかった程で、圧縮界の頂点に君臨し続けた訳が無い。

# 実装編
LZWの超単純で制約もりもりの実装。してその制約とは…
* Unicode番号0-255に対応した文字列のみ処理可能。当然surrogate pairなどというものには未対応
* 辞書番号の最大値は65535
* 出力文はUTF8形式文字列
* 圧縮率がごみ

```js
function LZWe(c){
	for(var d=[],e={__proto__:null},f=c.split(""),a=f[0],b=0,g=256,l=f.length,h=0,S=String.fromCharCode;++b<l;e[a+c]?a+=c:(d[h++]=1<a.length?S(e[a]):a,e[a+c]=g++,a=c))c=f[b];
	d[h]=1<a.length?S(e[a]):a;
	return d.join("")
}
function LZWd(b){
	for(var a,e={__proto__:null},d=b.split(""),c=d[0],f=c,g=[c],h=256,o=h,l=d.length,i=b=0;++b<l;f=a)a=d[b].charCodeAt(),g[++i]=a=h>a?d[b]:e[a]||f+c,c=a.charAt(),e[o++]=f+c;
	return g.join("")
}
```
```js:利用例
var c="HTMLAnchorElement HTMLAreaElement HTMLAudioElement",
	e=LZWe(c),
	d=LZWd(e);
console.log(d.length,"->",new TextEncoder().ecode(e).length,c==d)
```
[執行](https://codepen.io/xezz/pen/ByBdgvy)
情報科学科B2が自分のサイトを作成した話

:::note
今回紹介するサイトは，日本大学文理学部情報科学科の学科専門科目「Webプログラミング」の課題制作として作成されました．
:::

## 制作物の概要
### 自己紹介サイト

https://watanabeharuto.netlify.app/

* 「ホーム」「投稿記事」の2つのページから構成される
* ホームでは，自己紹介とSNS等のリンクが表示される
* 投稿記事では，Noteに投稿した記事の一覧とそれらのリンクが表示される

▽ホーム画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916136/5a3f070a-7a59-6583-e05b-5522d077c1de.png)

▽投稿記事画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916136/8b822b57-b596-18a1-64ea-6cfd94c26fac.png)

CSSは授業の初めの方に取り組んだ[MDN](https://developer.mozilla.org/ja/)の課題で使用したものを使っています．

https://developer.mozilla.org/ja/docs/Learn_web_development/Getting_started/Your_first_website/Styling_the_content

## 制作物の使い方

* 私の自己紹介サイトですので，下にスクロールして私に関する情報を見てください
* 気になったサイトや記事があればリンクをクリックしてください
* [動作例](https://qiita.com/WatanabeHaruto/items/2a0c7327e0198e95c62a#%E5%88%B6%E4%BD%9C%E7%89%A9%E3%81%AE%E5%8B%95%E4%BD%9C%E4%BE%8B)に従ってページを動かしてください

## 制作物の動作例
* 各種リンクは外部サイトへ飛ぶように設定

* 画面上部の「ホーム」「投稿記事」のリストをクリックすることで，画面を遷移させることが可能

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916136/79374159-72d3-103d-0767-cefcc842fd68.png)

* 1番下までスクロール時の「ページトップへ移動」ボタンの表示

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916136/a86719ea-3bcc-5382-2f47-731880566373.png)

## 使用したサービス・技術／工夫した点
### JavaScript / TypeScript
JSだと書き方がわからない点が[一部](https://qiita.com/WatanabeHaruto/items/2a0c7327e0198e95c62a#rss)あったので，参考にしたサイトに従ってTSで書きました．

### [React](https://ja.react.dev/)
Reactを使用してコンポーネント化を行いました．

### [Netlify](https://www.netlify.com/)
授業で使用したウェブ開発プラットフォームです．

### ファビコンの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916136/c050bedd-e4a7-def5-5c3b-81f52bf1273a.png)

### メール(mailto:)リンク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916136/1fecbdd2-b261-6569-98e0-630805b73d86.png)


### ボタンを押すとTOPに戻るスクロール機能
参考にしたサイト

https://zenn.dev/sunaoproducts/articles/1818c48f60dc81

:::note warn
実装時（2024年12月），react-scrollをインストールしようとすると，"ERESOLVE unable to resolve dependency tree"が発生するため，「ライブラリを使わないパターン」で実装しました．
:::

### 画面遷移
参考にしたサイト

https://zenn.dev/reasemi/articles/981fa0032bba5c

### 外部サイトに投稿した記事を表示

#### ウェブAPI

:::note warn
現在，テスト段階として[こちら](https://jsonplaceholder.typicode.com/posts)のAPIから取得したタイトルと中身を表示中です．𝕏のピンを刺している投稿等を表示できたら良いなと思っています．
:::

参考にしたサイト

https://lorem-co-ltd.com/fetch-basic/

https://lorem-co-ltd.com/react-fetch-api/

### RSS
[note](https://note.com/)と[Qiita](https://qiita.com/)で投稿した記事を，RSSを取得して投稿記事画面に表示しています．現在，記事の数は少ないですが，記事を一度でなく複数回に分けて表示させたり，検索や並べ替え機能を実装できたりしたら良いなと思っています．

参考にしたサイト

https://zenn.dev/nikaera/articles/hugo-react-dev

https://zenn.dev/hrkmtsmt/articles/fa7d8y9crypnib

https://qiita.com/app_js/items/71e33180c777453773f6
応用情報技術者試験に合格した私の勉強法

## はじめに
先日、[応用情報技術者試験](https://www.ipa.go.jp/shiken/kubun/ap.html)(AP試験)に無事合格できたので、誰かの参考になればと思い、勉強法などについてまとめておこうと思います。

### なぜ応用情報技術者試験を受けようと思ったのか？
アルバイト業務や個人開発を通じて、web系（特にフロントエンド）に関しては成長してきたかなという実感がありました。しかし、情報系の学部に通っているわけではないのでコンピュータサイエンスを体系的に勉強したことがなく、基礎知識に穴があるように感じていました。
エンジニアの資格としてはど定番の応用情報技術者試験を受けることで穴を埋めつつ、ついでに資格取得もできたら何かの役に立つかなと考えたからです。

### 当時のスペック
まず、私の当時の経験について掲載しておきます。
- 大学5年生（6年制学部）
- プログラムを始めたのは4年前（大学１年生）
- 外部のハッカソンに3回出場
- フロントエンドエンジニアとしてアルバイト1年半
- 情報とは全く関係ない学部に所属している

同じような境遇の方の参考になれば幸いです。

## 具体的な勉強法

ここからは具体的な勉強法について記載していきます。
### 参考書
使ったのは以下の1冊のみです。
- キタミ式イラストIT塾 応用情報技術者 (いわゆるキタミ本)

https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%BF%9C%E7%94%A8%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C07%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297144743/


### 勉強の流れ
基本的には上記の参考書(キタミ本)を2週間程度かけて通読したあと、ひたすらに[過去問道場](https://www.ap-siken.com/doujouManual.html)で過去問を周回していました。
より詳細には以下です。

1. いろんな方のブログや産駒試験の概要を掴む(1-2日)
午前試験と午後試験があること。午後は選択問題であることなど。大雑把に把握しました。ここについては多くの方が記事にしてくれているので割愛します。
1. キタミ本を読む(2-3週間)
無理に覚えようとはせず、とにかく理解することを心がけて通読しました。あとで問題を解いた時に「この話題聞いたことあるな」となれる程度の記憶があれば十分だと考えていました。
1. 過去問をひたすら周回する
[過去問道場](https://www.ap-siken.com/doujouManual.html)で、ひたすらに過去問を周回して、わからない部分については解説を読んだり、キタミ本に戻って復習してました。それでもわからなかったら検索 or 諦めてました。出題範囲は膨大なので、全て網羅することはできないと割り切って、深追いはしないようにしてました。
過去問の解き方として、分野ごと・午前を先に終わらせるなど色んな流派があるみたいですが、私は「開催年度ごと」に解いていました。（R1秋午前・午後　→ R2春午前・午後 → R2秋午前・午後....）
こうすることで、「合格基準に届いているか」を常に把握することができるので、モチベーショーンにつながると考えていました。実際、早い段階で合格ラインの6割には届いていたので、それが少しは精神安定剤となり、結果としては正解だったかなと考えています。
最終的に7回分を解いており、同じ回を２回解くなどの復習は特にしませんでした。（そんな余裕がなかったです）


### 試験直前の過ごし方
特別なことはせず、過去問を進めていました。
というのも、私は割と対策を始めるのが遅く、10/13 が本番なのに対して、9/1 時点で参考書すら買ってなかったレベルなので、ギリギリまで演習数を増やす方が得策だと考えたからです。


## 試験当日

### 持ち物
- 受験票　受験日の2週間ほど前に郵送されてきます。忘れないようにしましょう(顔写真が必要なので注意！！！！！)
- 鉛筆と消しゴム・シャーペン　午前試験はマーク、午後試験は記述なので、鉛筆とシャーペン両方あった方が便利です
- 飲み物・昼ごはん　大事です

- 参考書　私は電子で買ったのでipadを持っていきました。お昼休みはかなり時間があったので、最後の詰め込みをしました

## 試験を受けてみて
### 良かったこと
盗み聞き勉強（造語）ができるようになったことです。
例えば、今回の試験で[WAF(Web Application FireWall)](https://ja.wikipedia.org/wiki/Web_Application_Firewall)や、[CSIRT](https://ja.wikipedia.org/wiki/CSIRT)など普段の開発ではあまり聞かない単語に慣れ親しむことができました。
周囲の会話を聞いていて、WAFなどの単語を知らないと「なんか知らない話してんな」で終わってしまいますが、知っていれば「あ、WAFの話してる。へえ、そうなんだ」と、周りのつよつよエンジニアたちの会話を少しだけ理解することができるようになり、それが思いもよらない学びに繋がったりします。

### そうでもなかったこと
当初の目的である「網羅的に勉強する」という部分いついてはあまり達成できなかったように感じます。
というのも、確かに応用情報技術者試験自体は網羅的なのですが、そのため出題範囲が膨大で、結局は「要点だけを押さえる」という勉強法になってしまったからです。
私がもっと計画的に勉強していれば違ったのかもしれませんが、どうしても「合格のための勉強法」になってしまい、網羅的に勉強するという目標を達成することはできませんでした。

### 今後の目標
「盗み聞き学習」という新しい勉強法を発見したため、今後は「知らない単語を知っておく」ことにも重点を置きつつ自己研鑽を積んでいきたいと考えています。
また、ネットワークに興味があるので、いつかは[ネットワークスペシャリスト試験](https://www.ipa.go.jp/shiken/kubun/nw.html)にも挑戦したいと考えています。


最後まで読んでいただきありがとうございました。
文系未経験者の独学日記　＃４

本日もPaizaのCランクスキルチェック問題を数問解きました。
コードを書いているのが中々楽しくてやっていますが、その反面技術書の内容が自分にとって少し難しいので逃げてしまっています。
自分なりに新しい知識をインプットするときは、１週目はイメージをつかみ、２周目以降できちんと理解するというやり方が合っている気がします。
ですが、ついつい１週目で理解しようとしすぎて進まなくなり腰が重くなっている現状です。
少しずつでも読み進めていくと、集中してページ数が進んでいることも多々あるので、明日の自分に期待して今日は寝ます。
アルゴリズム

# アルゴリズムの比較

## 1. 二分探索法 (Binary Search)

### 長所
- **高速性**: ソート済みの配列に対して$O(log n)$の時間計算量で要素を探索可能。
- **シンプルさ**: 実装が比較的簡単で、動作原理を理解しやすい。
- **効率性**: メモリ消費が少なく、配列の範囲外アクセスを防ぐことができる。

### 短所
- **ソートが前提条件**: データがソートされていない場合、事前にソートが必要$O(n log n)$.
- **動的データへの非対応**: 配列やリストの要素が頻繁に更新される場合は効率が悪化。
- **特定の構造に依存**: 配列や単調性がある関数の探索にしか利用できない。

### 適用場面
- ソート済みのデータから特定の要素や条件を満たす値を効率よく見つける必要がある場合。
- 単調増加/単調減少な関数で特定の閾値を探索する問題（例: 答えが「Yes/No」で分岐する問題）。

---

## 2. 貪欲法 (Greedy Algorithm)

### 長所
- **高速性**: その時点で最適な選択を行うことで、計算量を減らし、効率的に解を求められる（問題によっては $O(n)$。
- **直感的な設計**: 解法が直感的であり、特定の制約を最小化/最大化する問題に適用しやすい。
- **低い実装コスト**: コードが比較的簡潔になりやすい。

### 短所
- **局所最適化**: 各ステップでの最適解が必ずしも全体の最適解に繋がらないことがある。
- **適用範囲の限定**: 問題によっては貪欲法が有効でない場合が多い（全体の最適解を保証するために証明が必要）。
- **競合の管理が難しい**: 一度選んだ選択肢を修正できないため、結果が間違っていてもリカバリーが難しい。

### 適用場面
- 部分問題の最適解が全体の最適解に繋がる場合（例: 活動選択問題、クラススケジューリング）。
- 近似解が許容される問題（例: ハフマン符号、配達ルートの計算）。

---

## 3. 動的計画法 (Dynamic Programming, DP)

### 長所
- **全体最適解の保証**: 問題を分割し、サブ問題を最適に解くことで全体の最適解を見つけられる。
- **重複計算の削減**: メモ化やテーブルに結果を保存することで、再計算を回避し効率化。
- **多様な問題に対応可能**: 組み合わせ最適化、文字列操作、配列の区間問題など幅広い応用範囲。

### 短所
- **実装が複雑**: 状態や遷移の設計が難しく、ミスが発生しやすい。
- **高いメモリ消費**: 特に2次元以上のテーブルを使用する場合、メモリが不足することがある。
- **計算量が高くなる場合がある**: 多くの状態を扱う場合、計算量が $O(n^2)$ や $O(n^3)$になることがある。

### 適用場面
- 問題が最適部分構造（サブ問題の最適解が全体の最適解に利用できる）を持つ場合。
- 問題が重複部分問題（同じ問題を複数回計算する必要がある）を持つ場合。
- 例: ナップサック問題、最長共通部分列（LCS）、最短経路問題（ベルマンフォード法など）。
ABC386回答メモ

# 0.はじめに
　今年最後のABCに挑戦。
　原因不明の肩痛になやませられながらも、久々のA~DをAC。
　ケアレスミスもありましたが、レートも+53の732と
　いい感じで1年をしめくくれました。


# 1. 	A - Full House 2
　counterを使えとばかりの問題。
　数毎にカウントして、カウント数が2の物が2個か
　3の物が1個あったらYes、それ以外はNoを出力して終了

　https://atcoder.jp/contests/abc386/submissions/61146640


# 2.B - Calculator
　電卓問題。
　何か見たことある気もしつつ、文字列を順に読んでいき
　0が連続していれば00を、それ以外はそれぞれのキーを
　押した体でカウントしていき、最後にカウントを出力して終了。

　と、簡単な問題なのに、考慮不足で１回WAを食らいました・・・。

　https://atcoder.jp/contests/abc386/submissions/61156704


# 3.C - Operate 1
　丁寧に場合分けしていけばさほど難しくない問題。

　【考え方】
　　1.SとTの長さが同じ場合
　　　SとTを先頭から比較していき差が1文字だったらYes
　　　　→1文字入れ替える操作を1回行う
　　2.SとTの長さの差が1の場合
　　　短い方の文字列をもとに先頭から比較していき
　　　違う文字があらわれた場合、長い方を一つとばす
　　　その後差が無かったら、Yes
　　　　→Sが長ければ、1文字削除を1回行う
　　　　　Tが長ければ、1文字追加を1回行う
　　3.上記以外の場合はNo

　https://atcoder.jp/contests/abc386/submissions/61168498


# 4.Diagonal Separation
　ぱっとみて、1行目から白ますが指定されるマスまでは
　黒く塗っていくよう、境目を記憶していき
　前の行よりの境目より、黒を指定されたマスが右に来るようならNo
　最後の行まで右に来なければYesとすればよいことが分かりました。

　【実装１】
　　・N行分のBとWの列を持ち管理する
　　　→余裕でTLE
　【実装２】
　　・マス指定がある行だけ辞書に保持して管理する
　　　→チェックを１～Nまで行ったところＴＬＥ
　【実装３】
　　・マス指定がある行だけ辞書に保持して管理する
　　　→チェックもマス指定がある行だけにしたところＡＣ

　ＴＬＥをいかに回避するかの問題なのを最初から考慮すれば10分短縮できた
　カナと思います。

　https://atcoder.jp/contests/abc386/submissions/61189634


以上
【VSCode】変更の同期を押したときの確認モーダルを再表示する

# はじめに

タイトルの確認モーダルとは以下のこと。

![2024-12-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/206eec6b-1f95-1c9a-e3a3-2c123686dfbc.png)

間違えて「OK、今後は表示しない」を押してしまい、表示されなくなってしまった。再表示する方法を書く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8591b105-2ca6-8bb5-52e4-abcc1f28f326.png)

# 再表示方法

1．設定を開く
2．「confirm」と検索欄に入力する
3．「Git: Confirm Sync」のチェックが外れているので**チェックを入れる**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/b11c4335-4344-2d42-759f-69368f22d1ca.png)
ArduinoでフォトリフレクタLBR127HLDを使おう

秋月電子等で入手可能なフォトリフレクタであるLBR127HLDの使い方について解説します。

電子工作を始めたての初心者向けの記事です。



# フォトリフレクタとは
LEDとフォトトランジスタを組み合わせ、LEDから出た光がどれだけフォトトランジスタに入ってくるかを見ることで物体検知や距離測定などを行うセンサです。
ライントレースロボットのラインセンサなどに使われています。
一般的にLEDは赤外LEDを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/a197961e-94fd-84b2-515e-225334e38d97.png)


フォトトランジスタとはフォトダイオードとトランジスタを組み合わせたものです。
フォトダイオードは光を受けると電流を流す部品で、その電流をトランジスタで大きくして扱いやすくしています。



# 使ってみる
今回はArdino Megaで試してみたいと思います。

LBR127HLDの製品情報・データシートはこちらから見ることができます。

https://akizukidenshi.com/catalog/g/g104500/

## 回路
電子回路はLEDとフォトダイオードで別々で組めばよいです。

まずはLEDの回路を組みましょう。

LEDは普通、電源に抵抗を挟んで使用します。
LEDのデータシートにのっている順電圧（VF）と電流量からオームの法則を用いて計算できます。
LBR127HLDのデータシートを見ると、IF=20mAでVF=1.2Vとなっています。
LEDの抵抗値の計算は秋月電子さんのサイトが便利です。

https://akizukidenshi.com/catalog/pages/led-r-calc.aspx

このサイトに電源電圧とLEDの順電圧と電流値を入力すると抵抗値を計算してくれます。

電源が5Vだと190Ω、3.3Vだと105Ωでしょうか。

実際に抵抗を選ぶときにはこれに近いもの（少し大きめにした方が安全）を選んでください。

それではつないでいきましょう。
LBR127HLDをこのようにブレッドボードに差します。
透明な方がLEDで、長い方がアノード（+側）で短い方がカノード（-側）です。
抵抗を挟んで電源につなぎましょう。抵抗はLEDの+側と-側のどちら側につないでも大丈夫です。
今回は220Ω抵抗を挟んで5Vにつなぎます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/8b94482d-3b3c-01e8-5eac-8dd836403652.png)

これでLEDが光るようになりました。赤外線なので肉眼では見えませんが、スマホのカメラ（内カメだけかも）等で見てみると紫色に光っていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/8bab7e25-5b99-acd9-3127-a094dd174600.png)


次にフォトトランジスタの回路を組みます。
フォトトランジスタは光を受け取ると電流を流しますが、マイコンで読み取れるのは電圧です。
そのため、以下のような回路を組んで電圧に変換します。（オームの法則より、流れる電流を$I$をした時、Outputの電圧は$ VCC-I \cdot RL $となります。）
右側がフォトトランジスタで、上に生えているのが短い方（コレクター）、下に生えているのが長い方（エミッター）です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/daa7868c-fcb9-b50a-d74f-c3f1c2d1d679.png)

この抵抗はデータシート内ではLoad Resistance（$ R_L $）と表記されていて、1kΩが標準になっているようなので1kΩを使います。この値を大きくすると数値の変化が大きくなります。

ブレッドボードに作るとこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124670/eb9770c0-3626-bbd3-6cc2-f356dc9fb40e.png)

## プログラム

AnalogReadするだけです。
``` test.ino
#define pin A0
void setup() {
  Serial.begin(9600);
  pinMode(pin,INPUT);
}

void loop() {
  Serial.println(analogRead(pin));
}
```

何もないときに1023、指をかざしたときに900くらいになれば成功です。

反射光が強いと値が小さくなるので、白い紙に近づけると小さくなって黒い紙に近づけると大きくなります。

また、太陽光の赤外線に反応してしまうので、直射日光の当たらないところで使用しましょう。

# 3.3Vで動かしたい
3.3V動作のマイコンで動かすにはどうすればよいでしょうか？
まず、フォトトランジスタの電源を3.3Vにしてください。そのままだと5Vがマイコンに入ってしまいます。
また、LEDの電源も3.3Vにする場合は抵抗の値を調整してください。
フォトトランジスタの抵抗は1kΩのままでもよいですし、少し小さくしても良いかもしれません。


# フォトリフレクタを自作したい

フォトリフレクタはLEDとフォトトランジスタを組み合わせるだけなので簡単に自作することができます。
市販に売られているものは出力が小さいので、欲しいものがないという場合には自作してみてもいいかもしれません。
その際には以下の点に気を付けてください。

- LEDとフォトトランジスタの波長を合わせる
- LEDとフォトトランジスタの間に仕切りを入れる（仕切りがないと直接光が入ってうまく検知できません。）
GitHub Copilotの便利な機能を紹介【VSCode版】

### はじめに
GitHub Copilotを使用するようになってからしばらく経ちますが、日々なんとなく使っているだけでちゃんと使いこなせてはいませんでした。（実際、サジェストを受け入れる以外の使い方をしたことがありませんでした）
『Software Design 2024年11月号』にて、森下篤さんがCopilotに関する知識や便利な活用方法について執筆されていたので、学習も兼ねてその内容をまとめてみました。

### Copilotのサジェストを受け入れる
`Tab`キーで提案を確定させることができます。

### 複数のサジェストから選択する
`Ctrl` + `Enter`
エディタの右側にパネルが開き、複数のコードが提案されます。

### Copilotがサジェスト時に参考にする情報
- 現在編集中のコード
- 同じディレクトリの他のファイル
- 現在別タブで開いているファイルの内容
例えば、実装済みコードと同じようなパターンの処理を実装したい場合は、あえてそのファイルを別タブで開いておくと、近いコードになるように提案してもらいやすくなります。

### オープンソースコードのライセンスを侵害するリスクを減らす
Copilotの学習元はGitHub上の公開コードであるため、Copilotのサジェスト内容をそのまま受け入れることで、オープンソースコードのライセンスを侵害してしまうリスクが伴います。
このリスクを回避するためには、`Suggestions matching public code (duplication detection filter)` という機能を有効にすると、公開コードと一定以上一致するコードを補完しないようにさせることができます。

### 期待通りのサジェストを引き出すTips
以下の点を意識することで、Copilotから期待通りのサジェストを引き出しやすくなります。
- 関数や変数の定義名を実装に具体的なものにする
- 処理の前や関数にコメントをつける
（最終的に残さないコメントであってもCopilotのために記述し、後で削除することも有用）
- 複雑な処理を実装していると、サジェストにも時間を要するため、少し長めに提案を待ってみると良い
- 1回の指示で多くを盛り込みすぎない
複雑で長文の指示を書くよりも、過程を1つずつ指示する方がCopilotに理解されやすくなります。


### チャットでCopilotに指示を出す
ソースコードを編集したい箇所にカーソルを移動、もしくは範囲選択した状態で`⌘`+`I`を押します。（Windowsなら`Ctrl`+`I`)
すると、プロンプト入力のポップアップが表示されます。
指示したい内容を入力して`Enter`を押すと、指示内容に沿ったサジェストを表示してくれます。
サジェストを受け入れたい場合は`⌘`+`Enter`（Windows：`Ctrl`+`Enter`）を押します。

### チャット機能の専用コマンドを使う
先ほど紹介したチャット機能には、コマンドが用意されています。
プロンプトの最初にこれらのコマンドを入力することによって機能します。
- `/tests`
テストを作成させることができます。
- `/doc`
ドキュメントコメントを作成させることができます。
- `/fix`
発生しているエラーを修正させることができます。

### Gitのコミットメッセージを生成させる
Gitのコミットメッセージ入力欄の右側に、Copilotを呼び出すボタンがあります。
これを押すと、**ステージングされているファイルから**コミットメッセージを考案してくれます。
ただし、Copilotが提案してくれるのは英語メッセージのみで、日本語には対応していないようです。（2025/01/06時点）
提案が気に入らない場合は、再度生成ボタンを押すことで別の提案を表示することができます。

### まとめ
便利な機能がたくさん紹介されており、今まで知らなくて損していたなぁと思いました。私と同じように、まだCopilotの一部の機能しか使ったことがない方々の参考になれば幸いです。

### 参考にさせていただいた書籍

https://gihyo.jp/magazine/SD/archive/2024/202411

*第１特集 ~新世代の開発スタイル はじめてのAI駆動開発 面倒な作業は生成AIに任せよう~ 第１章 『GitHub Copilotで楽々コーディング 単純作業はAIにサクッとやってもらおう』森下 篤*
【初心者向け】ActiveDirectly学習ロードマップ

## 前提
本記事はActiveDirectlyに関する知識がない方向けに、効率的にActiveDirectlyの構築、運用、保守スキルを身に着けるロードマップを示します。

## ロードマップ
1．「ねこまるのADフリーク」でADの基礎知識を取得
　https://pkiwithadcs.com/sitemap/
　上記URLの「Active Directory ドメイン サービス」の項目から「AD基礎」の資料を読みましょう。
　何周も繰り返し読むことで、だんだんと理解できるようになります。

 ------執筆中------