OmniAICreator/Qiita-1.07M huggingface dataset:
API Best Practices ~【Appendix】Android/iOSアプリのビルドにはプロトコル定義が含まれる

## 【Appendix】Android/iOSアプリのビルドにはプロトコル定義が含まれる

https://protobuf.dev/programming-guides/api/#leaking-features

モバイルアプリのビルドには、プロトコル定義の情報が埋め込まれるため、機密情報が漏洩するリスクあり。
適切な対策を講じるか、リスクを許容する必要がある。
新人エンジニアが、DjangoのMiddlewareについて調べてみた

## 1. IT用語のミドルウェアと、Djangoのミドルウェアの違い

前回の記事では、IT用語のミドルウェアについてまとめました。

ミドルウェアとは、「OSほど汎用的ではないが、多くのアプリケーションで必須となる機能を担うソフトウェア」を指す言葉で、アプリケーションサーバ、WEBサーバ、DBサーバなどが、代表的な例でした。

今回調べるのは、Djangoの機能として備わっている「ミドルウェア」です。
公式ドキュメントによると、Djangoのミドルウェアは「Django のリクエスト/レスポンス処理にフックを加えるためのフレームワーク」だそう。フックとは、プログラムの特定の処理の間に別の処理を追加することですので、この場合は、「Django のリクエスト/レスポンス処理に、別の処理を加えるためのフレームワーク」と解釈して良いと思います。

ミドルウェアは自作することもできるそうですが、今回は、私が関わっているプロジェクトに出てくるミドルウェアについて、いくつか調べてみようと思います。

## 2. 各ミドルウェアについて

### django.middleware.security.SecurityMiddleware

SecurityMiddlewareは、Djangoアプリケーションのセキュリティを高めるために作用します。例えば、

- HTTPリクエストをHTTPSにリダイレクトさせる
- クライアントに、HTTPS通信を使うべきであることを通知する
- XSS（クロスサイトスクリプティング）防止

などの機能を備えています。

### django.contrib.sessions.middleware.SessionMiddleware

SessionMiddlewareは、ユーザーの情報を匿名のセッションとして管理するためのミドルウェアです。デフォルトでは、DBを使ったセッション管理を行いますが、キャッシュやファイル、Cookieを使った管理も可能です。なお、Cookieを使ったセッションデータは、署名されているため、データの改竄や喪失があった場合無効にすることができますが、暗号化はされていないため、クライアントは自由に読むことができます。

### django.middleware.common.CommonMiddleware

CommonMiddlewareは、その名の通り、多くの一般的なWebアプリケーションで役立つ機能を提供しています。

- DISALLOWED_USER_AGENTS：悪意のあるbotなど、リクエストを受け付けたくないユーザーのリストを作成することができます。
- APPEND_SLASH：URL末尾のスラッシュがない場合、末尾にスラッシュのある有効なURLに書き換えて、リダイレクトを行います。
- PREPEND_WWW：先頭にwwwがないURLを、wwwで始まる同じURLに書き換えてリダイレクトします。

### django.middleware.csrf.CsrfViewMiddleware

CsrfViewMiddlewareは、CSRF(クロスサイトリクエストフォージェリ）対策を行うためのミドルウェアです。CSRFとは、ユーザーのログイン情報を悪用し、webアプリケーション上で意図しないアクションを行うように仕向けたり、意図しない権限でユーザーをログインさせたりする攻撃です。

公式ドキュメントによると、これらの攻撃を防御するための方法は、Getリクエストから副作用を取り除くこと、そして、POST、PUT、DELETEメソッドを使う時には、formでCSRFトークンを利用することが挙げられます。CsrfViewMiddlewareでは、これらを可能にするために、CSRFトークンを生成したり、検証を行ったりする機能が提供されています。

## 3. まとめ

settings.pyには、まだいくつか未知のミドルウェアがありますが…今月はここまでにして、そのうち続編を書こうと思います。メリークリスマス！
ScanデータPC保存とセキュリティーについて

現在、会社のPCをキッティングしております。
　転職されたり、他部署に行く方もいらっしゃるので、同じPCをずっと使い続けるという前提ではなく、
なるべく使いまわしがきくように設計・設定をしています。

■環境
現在ＡのローカルネットワークとＢのローカルネットワークが存在しています。
それぞれＡＢで別のプリンターがワンフロアーに混在しています。（1つはホールディングスのネットワークで、もう一つはこの会社のローカルネットワークです）

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/97891e54-aed2-2f9e-6ae2-e24919ac7e0c.jpeg">
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/a7a6ab2c-63f1-7430-1445-6bee3c9f6d26.jpeg">

ネットワークごとにプリンターがあります。

ホールディングスのネットワークの設定はイーサネット接続が固定、Wi-FiがDHCP
支店ローカルネットワークはイーサネット・Wi-Fiとも固定になっています。

■PC設定
①イーサネットでホールディングスのネット接続（インターネットプロトコルv4 以下IPv4）
②Wi-Fiは支店ローカルネットワーク接続（IPv4）
でネット接続しています。

■Scanデータの保存先の共有ファイル所在
C:\Users\Public\Desktop( **こちらが後から問題になります**)

■PC設定①
設定＞インターネットとネットワーク＞ネットワークの詳細設定＞共有の詳細設定

ファイルとプリンターの共有のトグルスイッチをオンにします。（プライベート・パブリック・ドメイン）
![スクリーンショット 2024-12-25 105539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/d46b756b-d56d-5577-04a2-2dac8d2d9293.png)
![スクリーンショット 2024-12-25 105557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/38aeb192-5568-f1f2-9bc1-79e097d4eb61.png)


■PC設定②
検索＞セキュリティが強化されたWindows Defender ファイアウォール
![スクリーンショット 2024-12-25 105149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/c71ccbc8-bc7f-fbb9-eb59-19c2e4cd9cab.png)

の設定を行い、

■プリンター設定
表示名
共有設定した保存先フォルダのパス登録
PCへサインインする際のログインIDとパスワードを設定すると設定はおわりです。

ここまでの設定でABのネットにつながっている、プリンター上で行ってみました。

でどちらのプリンターからも同じメッセージが出てきて
エラー番号「０２７－５１３」
スキャナー（PC保存）のSMB転送で、SMBサーバーへのアクセス権がありません。
とでます。

■アクセス権とはセキュリティーの問題か

https://www.fujifilm.com/fb/support/callcenter/faq/ccfaq0018
このまま進めてみますが、

Everyoneを登録して、変更のアクセス許可をつくっても、
どうもうまくいきません。

■パブリックの仕様の問題と考え
いったんScanデータの保存フォルダをｃ直下に変更しました。

そうするとEveryoneもセキュリティにあり、
アクセス許可設定も古コントロールになっておりました。

ScanのデータもうまくＰＣへ保存できました。

（要望）詳しく調べられていないので、調べるためのみなさまのヒントを頂戴できると助かります。
dockerでpythonの開発環境を構築する

# やりたいこと
1. dockerを使ってpythonが使えるコンテナを作りたい
1. docker起動時にシェルを起動して動作確認したい 
1. コンテナの再起動をせずともソースコードの変更を反映したい

# pythonが使用できるコンテナの作成
```:Dockerfile
FROM python:3.9-slim-buster
WORKDIR /src
COPY . .
RUN pip install -q -U google-generativeai
```
```:docker-compose.yml
version: "3.9"
services:
  python:
    build: .
    volumes:
      - .:/src
```

docker-composeのvolumeで作業ディレクトリをコンテナにバインドマウント？することでソースコードの変更が即時に反映された

# コンテナ起動時にシェルを起動する
3つ方法がある（らしい）。

1 docker compose exec　を使用する
すでに起動してあるコンテナに対して
```
docker compose exec {service} bash
```

今回つくるコンテナは常駐型のサービスがなく、作成とともにすぐに消滅する→不採用

2 docker compose run を使用する
```
docker compose run {service} bash
```
新しいコンテナの作成と同時にbashを起動する→採用

3 composeファイルに記述する
commandオプションで["bash"]を追加すると、コンテナ作成時にbashが実行される→毎回実行されると面倒そうなので不採用

# 動作確認
以下のソースコードをdocker関連ファイルと同ディレクトリに配置
```:main.py
import google.generativeai as genai

genai.configure(api_key="")
model = genai.GenerativeModel("gemini-1.5-flash")
response = model.generate_content("Do you like dog?")

print(response.text)
```

続いて、docker compose run python bash
さらに cat main.pyで内容を確認
その後、テキストエディタでmain.pyを編集→上書き保存
そして cat main.py 内容が変更されていることが確認できたらＯＫ

以上
送信の反対は受信ではない

# 加熱の反対は冷却ではない

[加熱の反対は冷却ではない](https://nazology.kusuguru.co.jp/archives/168008 "加熱の反対は冷却ではない")

あ゛ーー
あれかーー

**送信と受信は逆のことやるだけでしょ？**
・・・・・・っていう人いるじゃないですか。

実際に作ると、

:::note warn
**いや全然ちげーよ**
:::

っていうあれですね。
そうじゃない？(´・ω・｀)失礼しました。
JDBCとは

## JDBCとは
JDVC(Java Database Connentivity)はRDBMSにアクセスするために用意されたJavaのAPIです。
JDBCドライバマネージャやJDBCドライバと組み合わせることで様々なRDBMSにアクセスすることが可能になります。

Java側はJDBCドライバマネージャ、RDBMS側はJDBCドライバとそれぞれ役割分担されています。

### JDBCドライバマネージャ
　RDBMSに接続する際の中核となるモジュールで、RDBMSに接続するための共通的な機能を持ちます。

 ### JDBCドライバ
 RDBMSに接続するためのJava製のモジュールで、RDBMSに依存した機能を持ちます。
 各RDBMS別に運営団体から配布されています。
【Base64 を利用】HTML ファイルに直接 WebAssembly を記述する方法

# はじめに
HTML ファイルには CSS や JavaScript を直接記述することができますが、第 4 の Web 言語と呼ばれる **WebAssembly** も工夫すればファイル内に直接記述することができます。

本記事では、**Base64** を利用した方法を紹介します。

# 実装
本記事では、以下のシンプルな「**加算モジュール**」を扱います。（`WebAssembly` 自体はバイナリ形式であり、以下は、そのテキスト表現である `Wat` で記述しています。）
```lisp
(module
  (func $add (param $a i32) (param $b i32) (result i32)
    local.get $a
    local.get $b
    i32.add
  )
  (export "add" (func $add))
)
```

以下のリンク先などで、上記のコードを **`BASE64`** 形式の `WebAssembly` に変換します。

https://webassembly.github.io/wabt/demo/wat2wasm/

変換すると、以下のような文字列形式に変換されます。

```
AGFzbQEAAAABBwFgAn9/AX8DAgEABwcBA2FkZAAACgkBBwAgACABagsAGARuYW1lAQYBAANhZGQCCQEAAgABYQEBYg==
```

あとは、`HTML` ファイルの `script` タグ内で `WebAssembly` を呼び出すだけです。

```html:index.html
<script>
    const base64Wasm = "AGFzbQEAAAABBwFgAn9/AX8DAgEABwcBA2FkZAAACgkBBwAgACABagsAGARuYW1lAQYBAANhZGQCCQEAAgABYQEBYg==";

    // 1. Base64デコードしてArrayBufferに変換
    function base64ToArrayBuffer(base64) {
        const binaryString = atob(base64); // Base64デコード
        const len = binaryString.length;
        const bytes = new Uint8Array(len);
        for (let i = 0; i < len; i++) {
            bytes[i] = binaryString.charCodeAt(i);
        }
        return bytes.buffer; // ArrayBufferを返す
    }

    // 2. WASMインスタンスを生成
    async function loadWasm(base64) {
        const wasmArrayBuffer = base64ToArrayBuffer(base64);
        const wasmModule = await WebAssembly.instantiate(wasmArrayBuffer);
        return wasmModule.instance;
    }


    // 3. WASMを利用
    loadWasm(base64Wasm)
        .then(instance => {
            console.log("WASM instance loaded:", instance);
            // エクスポートされた関数を呼び出す
            if (instance.exports.add) {
                for (let i = 0; i < 10; i++) {
                    console.log(instance.exports.add(i, i));
                }
            }
        })
        .catch(err => {
            console.error("Failed to load WASM:", err);
        });
</script>
```

**コードの解説**

1. **Base64 デコード**
   `atob` で `Base64` 文字列をバイナリー文字列に変換。
   `Uint8Array` でバイト列に変換し、`ArrayBuffer` に変換。
2. **WebAssembly.instantiate**
   `ArrayBuffer` から `WASM` モジュールをインスタンス化。
   `exports.add` としてエクスポートされた関数を呼び出します。
3. **WASM を利用**
   `instance.exports.add` を呼び出し、ここではループを10回行い、結果をログに出力します。
昨日の22時が今日の僕を無敵にした

## はじめに

夜活大好きな私が，朝活を始めてみた感想と，今後も継続する覚悟を持つためにこの記事を書きます．この記事を通じて，少しでも朝活の魅力を伝えられたらと思っています．

## 対象者

- 夜型で，朝よりも夜の方が集中できると考えている人（過去の私）
- 現状を変えたいと強く思っている人
- 将来への不安を感じている人
- 新しい変化を楽しみたい人

## 実行するとどうなるか
やりたかったタスクや趣味に費やす時間が増え，充実感を得られます．
1日が長く感じられ，心の余裕が生まれます．

## やったこと

朝活を始めるために行ったことは，大きく2つだけです．
1. 明日やることを決める
1. 早く寝る

以下でそれぞれ詳しく解説します．

### 明日やることを決める

朝活をする上で重要なのは，【**明日やることを決める**】ことです．

朝早く起きるのは容易ではありません．特に眠気という強敵は，明確な目的や覚悟がないと倒せません．「なんとなく早く起きたい」という曖昧な動機では，二度寝や三度寝をしてしまいがちです．

そのため，夜寝る前に起きたらやるべきことを明確に整理しておく必要があります．私はNotionを使用してタスク管理をしています．

様々なテンプレートを試しましたが，どれを使えば良いかわからず挫折することもありました．そんな中，@yukkun(Yuma)さんの[この記事](https://qiita.com/yukkun/items/787ddf38828e328e8aba)で紹介されていたTsuburayaさんのテンプレートに出会い，それをベースにカスタマイズして使っています．詳細は以下の動画を参考にしてください．

[YouTube: Tsuburayaさんのテンプレート](https://www.youtube.com/watch?v=G82JLeUs4NM)

https://www.youtube.com/watch?v=G82JLeUs4NM


### 自己流タスク管理の紹介
Tsuburayaさんのテンプレートをベースに，配置やボタンなどを少しカスタマイズしました．テンプレートの配布は準備が整い次第行う予定です．

以下の流れで管理を進めています．

**準備段階**
1. プロジェクトを設定
1. プロジェクトのページを作成するボタンとテンプレートページを作成

![スクリーンショット 2024-12-25 9.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665507/fe001f80-7c66-6aca-90ed-07b91f27d4ba.png)

**就寝前**
1. 寝る前に明日やるタスクを決める
1. タスクに優先順位をつけ，最初に取り組むものをリストアップする
1. 朝起きてタスクを達成した自分をイメージする
1. 就寝


![スクリーンショット 2024-12-25 10.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665507/fd8664b0-3c56-3281-870d-53ebfbe9cb5f.png)



**常時**
1. 新しいタスクが生まれたらタイトルにメモする
1. 内容にやることや注意点などを記述
1. 実施予定日やタスク種別，優先度を設定する



![スクリーンショット 2024-12-25 10.44.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665507/25586221-13e1-eb8f-303c-8bbaede15a1a.png)




### 早く寝る
夜には多くの誘惑があります．ゲームやネットサーフィンなど，なんとなく時間を過ごしてしまうことも多いでしょう．

その解決策は，**寝ること**です．

22時を目標に寝ましょう．やりたいタスクはすべてNotionに放り込んで，朝5時から取り組みましょう．朝早く起きてタスクをこなすことで，達成感を得られ，朝日とともに良い1日のスタートを切ることができます．


## 動機

夜型の私が朝活を始めたきっかけは，将来の一人暮らしへの不安からです．実家暮らしのうちに良い習慣を身につける必要性を感じたため，取り組み始めました．生活習慣を変えるのは簡単ではありませんが，少しずつでも挑戦することをおすすめします．

## やってみて

朝日が昇る前に活動を始めると，達成感とともに良いスタートを切ることができます．また，1日が長く感じられ，やりたいことに費やす時間が増えたように思います．

ボクシング界のメイウェザーの名言に，「お前らが休んでいるとき，俺は練習している．お前らが寝ているとき，俺は練習している．お前らが練習しているときは，当然俺も練習している．」があります．この精神を参考にしつつ，多くの人が寝ている間に勉強やタスクに集中することで自己成長を感じましょう．

ただし，生活習慣が大きく変わるため，月に数回はアラームをかけずに休む日を設け，無理なく継続することを意識しています．

## 最後に

最初は簡単に朝早く起きられましたが，継続することの難しさを感じています．現在は大学4年生で仕事をしていないため，実際の負担は未知数です．しかし，今のうちに習慣化しておくことで将来に備えたいと思います．

朝活に関する書籍も多く出版されていますので，ぜひ参考にしてみてください．


https://www.amazon.co.jp/%E6%98%A8%E6%97%A5%E3%82%8222%E6%99%82%E3%81%AB%E5%AF%9D%E3%81%9F%E3%81%AE%E3%81%A7%E5%83%95%E3%81%AE%E4%BA%BA%E7%94%9F%E3%81%AF%E7%84%A1%E6%95%B5%E3%81%A7%E3%81%99-%E6%98%8E%E6%97%A5%E3%81%8C%E5%A4%89%E3%82%8F%E3%82%8B%E5%A4%A7%E4%BA%BA%E3%81%AE%E6%97%A9%E8%B5%B7%E3%81%8D%E8%A1%93-%E5%AE%9F%E7%94%A8%E5%8D%98%E8%A1%8C%E6%9C%AC-%E4%BA%95%E4%B8%8A-%E7%9A%93%E5%8F%B2/dp/4093106452

https://www.amazon.co.jp/%E9%A0%AD%E3%81%8C%E5%86%B4%E3%81%88%E3%82%8B-%E6%AF%8E%E6%97%A5%E3%81%8C%E5%85%85%E5%AE%9F%E3%81%99%E3%82%8B-%E3%82%B9%E3%82%B4%E3%81%84%E6%97%A9%E8%B5%B7%E3%81%8D-%E5%A1%9A%E6%9C%AC-%E4%BA%AE/dp/4799107771/
プロダクションレディマイクロサービスを読み読み

# 『プロダクションレディマイクロサービス』

<https://www.oreilly.co.jp/books/9784873118154/>

この本は『マイクロサービスアーキテクチャ』（<https://www.oreilly.co.jp/books/9784814400010/>）のあとに読むのがおすすめです。特に「なんでも分割したい病」に罹患しかけている人は、まず『マイクロサービスアーキテクチャ』の方を読むほうがよいです。

## この本の活用方法

- ＜お手軽＞興味のある章だけを読む
- ＜もう少し＞全体＋関連する章を熟読
- ＜本番対応・社内でマイクロサービスを標準化したい＞すべて熟読

## 最初にまとめ
巻末には本番対応のチェックリストがあるので、自分のプロジェクトについてチェックしてみるとよいかもしれません。
本書をはじめから通して読む時間がないなら（大抵の場合ないと思います）チェックが少ない章について熟読するような読み方も良いと思います。

### 対象読者

マイクロサービスを作りたいと考えているエンジニア、SRE。
多少の前提知識や経験があったほうが中身が頭に入りやすいと思われます。

- ステップバイステップのハウツー
- Uberの技術組織の説明

といった内容は取り上げられていません。

## １章：マイクロサービス

一般的なマイクロサービスについての概要です。前提知識があるなら読み飛ばしても良いと思います。

くわえて組織とマイクロサービスの関わり方として「逆コンウェイの法則」が紹介されています。
モノリシックアーキテクチャの企業とマイクロサービスアーキテクチャの企業では異なる問題が発生します。

## ２章：本番対応

技術組織全体に本番対応の標準を根付かせる方法の提案です。

8つの標準が紹介されています。

- 安定性
- 信頼性
- スケーラビリティ
- 耐障害性
- 大惨事対応
- パフォーマンス
- 監視
- ドキュメント

このあとの章でそれぞれ細かく説明されています。

## ３章：安定性と信頼性

一元管理されたリポジトリで適切なCI/CDが行われている必要があります。
また、マイクロサービス廃止の手続きや非推奨にする手続きも用意しておく必要があります。

## ４章：スケーラビリティとパフォーマンス

スケーラビリティはタスクをどのようにして分割統治するかの問題、パフォーマンスはそのタスクをどのようにして効率的に実行するかの問題です。
プログラミング言語、DBなどの選定や、マイクロサービスがどのようなデータ通信を行うかを把握して対応する必要があります。

## ５章：耐障害性と大惨事対応

障害に耐えられるように準備していても、障害は起こるものです。

その種類や一般的なシナリオをいくつかの種類に分け、検出と修正方法などについての説明がされています。
具体的な内容については本書を参照してください。

![image](https://github.com/kanamekey/cavacan/assets/54693982/11f49aed-c5e7-485a-9ec8-128f03005dc5)
https://ncdc.co.jp/columns/6503/

- **エコシステム（＝生態系）の障害**
  - 不十分な設計レビュー・コードレビュー
  - 貧弱な開発プロセス
  - 不安定なデプロイ手続き
- **ハードウェアで発生する障害**
  - ホスト・ラック・データセンター・プロバイダの障害
  - サーバープロビジョニングの障害
  - 構成管理・変更による障害
  - 運用上のダウンタイム
- **通信レベルとアプリケーションプラットフォームレベルの障害**
  - DNS障害
  - 不適切な負荷分散
  - CI/CDの障害
- **依存関係の障害**
  - 下流・依存マイクロサービスの障害
  - ライブラリ（内部・サードパーティ）の障害
- **内部の障害**
  - いわゆるバグ
  - DB障害
  - 適切なテストの欠如

### 回復性テスト

耐障害性のあるマイクロサービスを作るための最高の方法が回復性テストです。

回復性テストとは、本番環境のマイクロサービスに、積極的・反復的・ランダムに障害を起こすテストです。

いくつかのアプローチがあります。

- **コードテスト**
  - lintや単体、結合テスト、E2Eテストが当てはまります。
- **ロードテスト**
  - 一定の負荷をかけ、スケジューリングで定期的に実行します。
- **カオステスト**
  - 本番稼働しているマイクロサービスを積極的に停止します。

> インフラストラクチャチームが自分たちのサービスやシステムは不可避的に起こる障害に耐えられるという自信を持てるようになるまで、個々のマイクロサービスやインフラストラクチャの部品を何度も繰り返し壊すようにしましょう。

### インシデントと機能停止

この章では障害を処理するための組織的な対策手続きについて書かれています。
障害の対応に時間がかかることは、会社にかかる金銭的コストとして積み上がっていきます。

1. 評価
アラートを受け取った開発者はまず、問題の深刻度と影響範囲を評価します。
2. 調整
このインシデントについて記録し、解決できるチームに情報を提供します。
3. 緩和
問題の影響範囲を小さくします。
4. 解決
根本原因の解決に着手します。
5. フォローアップ
サービスについての客観的事実に基づき事後分析をします。名指しの非難は行いません。

## ６章：監視

章末にマイクロサービスの評価基準チェックリストがあるので自分のプロジェクトについて質問してみるとよいです。例えば「ログは特定の時点におけるマイクロサービスの状態を正確に反映しているか。」などがあります。

## ７章：ドキュメントと組織的な理解

ドキュメントを書いてサービスの更新のたびにアップデートするべきです。

本番対応のドキュメントに書かれているべき項目

- 短く的確でわかりやすいサービスの説明
- アーキテクチャ図
- 連絡先とオンコール情報
- リンク
- オンボーディング／開発ガイド
- リクエストフロー、エンドポイント、依存関係
- オンコールランブック
- FAQ

チームのすべての開発者が本番対応についての質問に答えられる（ドキュメントを探れば答えがある）状態を目指しましょう。

# 最後にまとめ

読み応えのある本なので、手元においておいて時々読み返すのがよいかもと感じました。
OCI SDKにカスタムリージョンを追加してエラーを解消する

# 最初に
OCI SDK(以下SDK)ではデフォルトで以下のリージョン識別子を認識しています：
[リージョン識別子の一覧](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/regions.htm)

しかし、上記リージョンに含まれない識別子も存在します。
そのため、例えば以下のドキュメントを参考に、コンピュート・インスタンスのディスク使用率（ここでは`disk_usage.py`として作成）を監視するスクリプトをホームディレクトリ（`~`）配下に作成し、実行すると、次のようなエラーが発生する場合があります：
[OCI カスタム・メトリックを使用したディスク使用率の監視](https://docs.oracle.com/ja/learn/oci-custom-metrics/index.html)
```
oci._vendor.requests.exceptions.ConnectionError: 
OCIConnectionPool(host='auth.ap-dcc-tokyo-1.oraclecloud.com', port=443): 
Max retries exceeded with url: /v1/x509 (Caused by 
NewConnectionError('<oci.base_client.OCIConnection object at 
0x7fb76f2f5588>: Failed to establish a new connection: [Errno -2] Name or 
service not known',))
```

このエラーは、SDKが使用しているリージョン構成に必要な情報が不足している場合に発生します。
ここでは、リージョン構成ファイルを作成してSDKに新しいリージョンを追加する方法を説明します。

# 手順
**1.ociディレクトリに移動**
まず、ホームディレクトリ（`~`）配下に`.oci`ディレクトリを作成し、そのディレクトリに移動します。
以下のコマンドを実行してください：
```
mkdir .oci
```
```
cd .oci
```

**2.リージョン構成ファイルの作成**
次に、`.oci`ディレクトリ内にリージョン構成ファイル（ここでは`regions-config.json`）を作成し、以下の内容を記述します：
```regions-config.json
[
	{ 
		"realmKey" : "OC1",
		"realmDomainComponent" : "oraclecloud.com",
		"regionKey" : "SYD",
		"regionIdentifier" : "ap-sydney-1"
	}
]
```
**注意：**`realmKey`の値は、OCIDに含まれる情報を参考に設定します。
以下の図を確認してください：
![スクリーンショット 2024-12-25 10.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1430519/ef26a46a-ac6d-0111-5803-7ebda8d567dd.png)

**3.スクリプトの再実行**
リージョン構成ファイルを作成した後、ホームディレクトリ（`~`）に戻り、再度ディスク使用率監視スクリプトを実行します：
```
python disk_usage.py
```
スクリプトが正常に動作すると、以下のような結果が表示されます：
```
34.6
{
  "failed_metrics": [],
  "failed_metrics_count": 0
}
```

これにより、SDKが新たに追加されたリージョンを認識し、メタデータを正常に取得できるようになります。

## 補足
作成したリージョン構成ファイルは、複数のカスタムリージョンを追加する場合にも対応可能です。
エラーが引き続き発生する場合は、ファイルパスや記述内容を再確認してください。

# 参考
[リージョンの追加](https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/sdk_adding_new_region_endpoints.htm)
【初心者向け】Apple シリコンで Docker Compose を使ってみよう！

## はじめに

「Docker を使ってみたいけど、Apple シリコンだと設定が難しいのでは？」と思っていませんか？

実は、Apple シリコンにも対応した Docker Desktop があり、簡単に Docker Compose を使えます！
この記事では、**「最小限のサンプルで Docker Compose を動かす」** ことを目標に、わかりやすく解説します。


## ゴール

- Docker Desktop をインストールする
- Docker Compose を使って**NGINX の Web サーバー**を立ち上げる
- http://localhost:8080 で動作確認する


## 手順

### 1. **Docker Desktop** のインストール

1. [Docker Desktop](https://docs.docker.com/desktop/setup/install/mac-install/) の公式サイト にアクセス
2. **Apple Silicon 用のバージョン** をダウンロード
![スクリーンショット 2024-12-25 10.29.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835254/f5532de1-47ea-00fb-b212-fc28f36dfe9d.png)

3. ダウンロードした .dmg ファイルを開き、指示に従ってインストール
4. インストール後、Docker Desktop を起動しましょう

メモ: 初回起動時に、権限の付与や設定の確認が求められることがあります。指示通りに進めてください。


### 2. Docker Compose のインストール確認

Docker Compose は Docker Desktop に含まれています。以下のコマンドでインストール済みか確認しましょう。

``` bash:bash
docker compose version
```

``` bash:出力結果
Docker Compose version v2.30.3-desktop.1
```

問題なければ、バージョン情報が表示されます。


### 3. 最小限の Docker Compose サンプルを作成

NGINX を使ったシンプルな Web サーバーを構築してみましょう。

#### プロジェクトディレクトリを作成

ターミナルで以下を実行して作業ディレクトリを作成します。

``` bash:bash
mkdir docker-sample
cd docker-sample
```

#### docker-compose.yml を作成

以下の内容を docker-compose.yml として保存します。

``` yaml:docker-compose.yml
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
```

このファイルは以下の設定を行っています：
- **NGINX** という Web サーバーの公式イメージを使用
- コンテナの 80 番ポートをホストの 8080 番ポートに公開

### 4. Docker Compose を起動

以下のコマンドで Docker Compose を起動します：

``` bash:bash
docker compose up
```

このコマンドを実行すると、NGINX コンテナが立ち上がり、ローカルで Web サーバーが起動します。

### 5. 動作確認

ブラウザを開いて、以下の URL にアクセスしてください：

http://localhost:8080

NGINX のデフォルトウェルカムページが表示されれば成功です！

### 6. サーバーの停止

起動したコンテナを停止するには、以下のコマンドを使います：

``` bash:bash
docker compose down
```

## トラブルシューティング

エラーが出た場合
- **Docker Desktop が起動していない場合**
クジラアイコンを確認し、Docker Desktop が起動していることを確認してください。
- **ポートがすでに使用されている場合**
8080 が他のプロセスで使用されている場合、docker-compose.yml のポート設定を変更してください（例：9090:80）。

## おわりに

これで、Apple シリコン上で Docker Compose を使った簡単な Web サーバーの構築ができました！

次は、データベースを追加したり、複数のサービスを構築したりして、さらに Docker の世界を広げていきましょう！

## 参考リンク

- [Docker Official Documentation](https://docs.docker.com/)
- [NGINX Official Docker Image](https://hub.docker.com/_/nginx)

もしこの記事が役に立ったら、**ストックやいいね** をお願いします！ 🎉
javascriptのattr()ってなに？

attr()はHTML要素の属性を取得、設定することができるメソッドです。

以下のようなコードがあるとしましょう。
```javascript
    <a href="https://example.com" id="example-link">Go to Example</a>
 ```
* 属性の取得
```javascript
var hrefValue = $('#example-link').attr('href');
console.log(hrefValue); // コンソールに 'https://example.com' と表示されます
```
idが`example-link`である要素の`href`属性を取得できます。



* 属性の設定
```javascript
hrefValue = $('#example-link').attr('href', 'https://newexample.com');
console.log(hrefValue); // コンソールに 'https://newexample.com' と表示されます
```
attrメソッドの第2引数の値を設定します。
pixel-NeRFのセットアップ方法

## 0．pixelNeRFの概要

[github](https://github.com/sxyu/pixel-nerf)  
[Project Page](https://alexyu.net/pixelnerf/)



## 1. pixel-NeRFディレクトリを作成

```php3
git clone https://github.com/sxyu/pixel-nerf.git
cd pixel-nerf
```









## 2. データの用意
- データセットには、ShapeNet 64x64，datasetsrn_cars， srn_chairs，dtu，multi_chairの5種類がある（と思われる）

- 今回のセットアップでは**dtu dataset**を用いる

### 2-1. dtu datasetのインストール

https://drive.google.com/drive/folders/1PsT3uKwqHHD2bEEHkIXB99AlIjtmrEiR

こちらから、dtu_dataset.zipをインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939072/6d7a84db-9cae-905c-0c9d-59d48fb2f3c9.png)


- インストール時のフォーマットは以下の通り．
```
/project_dir/rs_dtu_4/DTU/
    scan1/
        image/
            00000000.png
            00000001.png
            ...
        cameras.npz
```
- ``image/``：観測視点ごとの画像．
- ``camera.npz``：各画像に対応するカメラパラメータを格納したファイル．


- ``<project_dir>/rs_dtu_4`` のようにディレクトリ構造がなるようにフォルダを整理


### 2-2.　事前学習済みファイルをインストール

https://drive.google.com/file/d/1UO_rL201guN6euoWkCOn-XpqR2e8o6ju/view

- ``<project_dir>/checkpoints/dtu/pixel_nerf_latest``のようにディレクトリ構造がなるようにフォルダを整理









## 3. 仮想環境を構築
### 3-1. 仮想環境を作成
```php:Anaconda Promptで
conda env create -f environment.yml
```

### 3-2. 仮想環境に入る
```php:Anaconda Promptで
conda activate pixelnerf
```
離脱するときは
```
conda deactivate
```

### 3-3. パッケージをインストール
```php:Anaconda Promptで
pip install -r requirements.txt
```
:::note warn
GithubのReadmeには``install``の文字が抜けているので注意！
:::















## 4. 推論
```php:Anaconda Promptで
python eval/gen_video.py  -n dtu --gpu_id=<GPU(s)> --split val -P "22 25 28"  -D <data_root>/rs_dtu_4 -S 3 --scale 0.25
```
:::note warn
GithubのReadmeは`` '22 25 28' ``となっているが，`` "22 25 28" ``のように**ダブルクオートで括る**必要がある． 
:::

:::note info
- "22 25 28"はrs_dtu_4/DTU/scan31/image内のファイル名（インデックス）になっている．この3枚の画像が推論に用いられる．
- GPU(s)には使用するGPUのidを入力する．
:::

https://note.nkmk.me/python-pytorch-cuda-is-available-device-count/


## 後記
評価実験の部分は実行次第，追記予定．(2024.12)
【AccessVBA】パラメータクエリでTransferTextを使いたいときの代替案

## はじめに
**残念ながらパラメータクエリでTransferTextは使えません。**
正確にいうと、例えば入力フォームに入力された値を引っ張って、処理内でパラメータを指定した状態でTransferTextを行うと、もう一度パラメータの入力を求められてしまいます。

普通のクエリならTransferText一発でCSV出力できるのに、、、
ということで、代替案を以下に記します。

:::note 
**やりたいこと：**
登録したレコードが保存されているテーブル `Dat_Input` から、指定した条件（今回は任意の地方コードとする）に合致するデータをCSV出力したい。現時点では、条件はパラメータクエリ `Q_ExpCSV` に記載している。
:::

## 代替案① クエリを都度作成（動的クエリ使用）
**メリット：**  全てがコード上で完結するためオブジェクトが少なくスッキリ。

:::note warn
**やること：**
**１.** 判定する条件内容を用意する（サンプルではフォームから取得）
**２.** `Q_ExpCSV` の内容を記述して、Where句には `Q_ExpCSV` で設定していた条件を設定
**３.** 一時的なクエリを作成
**４.** クエリ結果を `TransferText` でCSV出力
**５.** 一時的なクエリを削除
**※** 地方コードは店舗マスタ `Mst_Tenpo` から引っ張ると想定
:::

```vb:Access VBA
'パラメータクエリの条件を指定（formの入力値を取ってきたり、SelectCaseで対応）'
regCode = [Form_メニュー]![txt_条件]

'一時クエリの内容を記述、Where句にQ_ExpCSVで設定した条件を設定'
strSQL = " SELECT " & Dat_Input & " .*" _
        & " FROM " & Dat_Input _
        & " LEFT JOIN " & Mst_Tenpo & " ON " & Dat_Input & ".店舗コード = " & Mst_Tenpo & ".店舗コード" _
        & " WHERE (" & Mst_Tenpo & ".地方コード = '" & regCode & "')"

'一時クエリを作成'
Set qdf = CurrentDb.CreateQueryDef("一時クエリ", strSQL)
'一時クエリのクエリ結果をCSV出力'
DoCmd.TransferText acExportDelim, , "一時クエリ", strFilePath, True
'一時クエリを削除'
CurrentDb.QueryDefs.Delete "一時クエリ"
```

## 代替案② ワークテーブル経由（追加時に条件指定）
**メリット：** ワークテーブルに絞り込んだデータが残るため、後続処理でワークのデータを操作できる。ひとつの機能にCSV出力＋他の処理を追加したい場合などに。

:::note warn
**やること：**
**１.** Dat_Inputと同構造のワークテーブルを用意する
**２.** パラメータクエリ `Q_ExpCSV` からパラメータの条件を削除して、FROM句はワークテーブルに設定
**３.** 処理内で判定条件の内容を用意する（サンプルではフォームから取得）
**４.** 追加クエリを記述する（Where句には `Q_ExpCSV` で設定していた条件を記述）
**５.**  `Q_ExpCSV` のクエリ結果を `TransferText` でCSV出力
**※** 地方コードは店舗マスタ `Mst_Tenpo` から引っ張ると想定
:::

```vb:Access VBA
'パラメータクエリの条件を指定（formの入力値を取ってきたり、SelectCaseで対応）'
regCode = [Form_メニュー]![txt_条件]

'パラメータに関する条件のみ、ワークテーブルに追加するタイミングで絞る'
strSQL = "INSERT INTO " & Wrk_Table & " SELECT " & Dat_Input & " .*" _
        & " FROM " & Dat_Input _
        & " LEFT JOIN " & Mst_Tenpo & " ON " & Dat_Input & ".店舗コード = " & Mst_Tenpo & ".店舗コード" _
        & " WHERE (" & Mst_Tenpo & ".地方コード = '" & regCode & "')"
DoCmd.RunSQL strSQL

'Q_ExpCSVのクエリ結果をCSV出力'
DoCmd.TransferText acExportDelim, , Q_ExpCSV, strFilePath, True
```



## おわりに
調べたけどわかりませんでした、なんてNA〇ERまとめみたいな記事を書くか迷いましたが、同じ疑問を持った方の調べる手間を省く助けになれば幸いです。メリークリスマス！🎄🎅
なぜ俺たち中年はアウトプットできなくなったのか

いきなり全然関係ない話になるんですが、mixi2きましたね！
どんぴしゃのmixi世代の中年なので勝手に感慨深いです。
めちゃくちゃ流行ってほしい。ぜひマイミクになってほしい。

https://mixi.social/invitations/@moro/PMfGg2d51bRvMJEdLKqPza

閑話は休題しまして。

個人的に、年々アウトプットすることが難しくなってきているような気がします。
同世代の周りからも近しい印象は受けるものの、あくまで個人的な話なのでタイトルの主語デカについては心苦しく思うばかりです。
これによってアウトプットのできる中年をあぶり出し、爪の垢を提供いただきたい一心です。

# アウトプットできなくなった理由

できない理由を並べ立てるのはなかなかお恥ずかしい限りですが、この記事はなぜアウトプットできないのかを網羅することで逆にどうしたらアウトプットできるのかを探る、藁にも縋る記事となります。

なお、Qiita Advent Calendarの記事(しかも盛大な遅刻)なので、半ば反省文も兼ねています。誠に申し訳ございません。

## ハードルが上がった

当然ではあるのですが、できることなら今日の私は昨日より、明日の私は今日より成長していてほしい、そうでなくともそう錯覚させる努力はしたい、みたいな意識があります。
そんな一日一日を積み上げてきているので、中年のハードルはひときわ高くそびえ立ちます。

例えばですが、5000万円資金調達しました！ みたいな報告のあとで金融公庫から300万円借りた話を出されてもパンチが弱い気がしませんか？
あれ、意外としませんね……？

全然別の話なのでそれはそれとして重要な情報なような気がします。

ハードルが上がっているように感じるのは、意外と主観だけの話なのかも知れません……。
乗っけから(逆に)雲行きが怪しくなってきました。

## 知識が増えた

これは決して「何でも知ってるからアウトプットする必要ないぜ！」みたいなことではなく、むしろ無知の知とでもいいますか、あらゆる道には先人がいることをこれでもかと見聞きしてきた結果湧いてくる「この期に及んで自分がのこのこお披露目するほどのものはないな……」というお気持ちです。

もちろん若き日の私も似たようなものではありましたが、それでも自分が新たに得た知識であれば「同じく知らない人もいるだろう」と自分に言い聞かせてアウトプットすることができました。

ところが歳を重ねるにつれこの「新たに得た知識」という境界が曖昧になってきます。

もちろんまだまだ若輩の身、知らないことのほうが圧倒的に多いものの「何を知らないか」自体はそこそこ自覚できてしまっているので、新しさが得にくくなったように思います。

具体的にはよく知らなかったものの、概念的にはまぁまぁ知っているというか。
そうすると「同じく知らない人もいるだろう」感とともにアウトプットする意義が20％ほどカットされてしまって、なかなか興が乗りません。

## やることが増えた

シンプルにいえばライフステージ的な話なのですが、結婚であったり育児であったりを経て、どうしても独身の頃のようには時間が取れなくなりました。

もっといえば子どもがマジで可愛いです。しかも育児はFixしません。
小学校にあがったり成人したりで変わってくるという話も聞きますが、そうであればなおのこと、それまでの時間は少しでも子どもと過ごしたいと考えてしまいます。

あと私事ですが、趣味が増えたといいますか、最近は昨年のギターに続いてギターアンプを作ってみていたり、家庭菜園？ 園芸？ が楽しかったりというのもあります。
アウトプットはエンジニアだけの特権ではないので、そういったものも発信できたらいいなぁとは思いつつ、専門外なこともありどうしてもペースは落ちてしまいます。

# 結論

こうして並べてみるとできない理由としてはどれも弱いなという気がしてきました。
ハードルが上がったのは自意識過剰で、まだまだ知らないことばかりなのも言うまでなく、育児にかまけて仕事(？)がおろそかになるのも、それこそ父の背中として誇れたものではありません。

できる気がしてきたな……？

時間の問題だけはいかんともしがたいので、呪術廻戦の最終巻は読まずに寝ます。

# さいごに

最後に言い訳ではないのですが、これからもライフステージはコロコロ変わって浮き沈みはあるでしょうし、少なくともこれから定年までまだまだあと何十年かは同じようなことを生業にしていくのだろうと思います。
現時点のできなくなった自分をあまり深刻に捉えず、できることをある程度必死にやっていこうと思います。

そして思っていた以上にポエミーな仕上がりになりました。深く謝罪します。

終わり。

# 追記

呪術廻戦の最終巻は読みました。
【Ruby】今日書いたコードの振り返り(繰り返し)#9

# はじめに
こんにちは！アメリカで独学でソフトウェアエンジニアを目指しているものです。
前回も繰り返しの問題を解きましたが、難易度がかなり低めだったのでもう少し難しめの繰り返しの問題に挑戦してみました。

## 問題の内容
## 概要
N個の整数が与えられます。この整数配列を3回の繰り返し処理（3段階のフィルタリングと変換）を通して処理し、最終的に残った整数を特定の条件で出力してください。

## 要件
1. 初期配列にはN個の整数が格納されている。
2. 第1段階の繰り返し処理：
    * 配列内の整数をすべてチェックし、10以上の整数のみを残し、他は除外する。
3. 第2段階の繰り返し処理：
    * 残った整数すべてに +5 を加算する。
    * 加算後、50以上の整数のみを残し、それ以下は除外する。
4. 第3段階の繰り返し処理：
    * 残った整数がある場合、その平均値(平均は小数点以下切り捨て)を求める。
    * 平均以上の整数のみを最終的な結果として残し、平均未満の整数は除外する。
5. 最終的に残った整数を、昇順にソートして出力する。

### 実行例
```ruby
process_numbers([3, 12, 49, 10, 55, 7, 100])  
# 第1段階後: [12, 49, 10, 55, 100] (10以上)
# 第2段階後: [17, 54, 15, 60, 105] → 50以上: [54, 60, 105]
# 第3段階後: 平均は(54+60+105)=219/3=73, 73以上は[105]
# 出力: 105
```

### 私が初めて書いたコード
今回の問題はそこまで苦戦せず解くことができました
```ruby
def process_numbers(number_array)  
    # 第1段階
    first_process = number_array.select{|number| number >= 10}

    # 第2段階
    second_process = first_process.map{|number| number += 5}.select{|number| number >= 50}

    # 第3段階
    second_average = second_process.sum.fdiv(second_process.size)
    final_process = second_process.select{|number| number > second_average}
    
    p final_process
end

process_numbers([3, 12, 49, 10, 55, 7, 100])
```
上記のコードではおおむね機能を実装できていますが、いくつかミスがありました
1. 「平均以上」ではなく「平均より大きい」を使っている(第3段落 second_average)
2. 平均値が「小数点以下切り捨て」になっていない(`second_process.sum.fdiv(second_process.size)`の部分)
fdiv によって浮動小数で計算されますが、問題文では「小数点以下切り捨て」を求めているので、それの実装が漏れていました
3. ソートや出力形式
要件で「昇順にソートして出力」とありますが、最後は `p final_process`としか書いておらずソートをしていなかった。

### 上記の改善コード
上記のミスを踏まえてコードを書いてみました
```ruby
def process_numbers(number_array)  
    # 第1段落の繰り返し処理
    first_process = number_array.select{|number| number >= 10}

    # 第2段落の繰り返し処理
    second_process = first_process.map{|number| number+= 5}.select{|number| number>= 50}

    # 第3段落の繰り返し処理
    second_average = second_process.sum.fdiv(second_process.size).round(half: :down)
    final_process = second_process.select{|number| number >= second_average}
    
    final_process.sort.each {|i| puts i}

end
process_numbers([3, 12, 49, 10, 55, 7, 100])  
```

### ほかの解答例
上記はわたしが考えてたコードですが、Chatgptが考えたコードはまた別でした
```ruby
def process_numbers(nums)
  # 第1段階: 10以上のみ
  nums = nums.select { |x| x >= 10 }

  # 第2段階: 全てに+5し、50以上のみ残す
  nums = nums.map { |x| x + 5 }.select { |x| x >= 50 }

  # 第3段階: 平均値以上のみ残す
  unless nums.empty?
    avg = (nums.sum / nums.size) # 小数点切り捨てを自然に行う整数除算
    nums = nums.select { |x| x >= avg }
  end

  # 昇順にソートして出力
  nums.sort.each { |x| puts x }
end

# 実行例
process_numbers([3, 12, 49, 10, 55, 7, 100])  
# 第1段階後: [12, 49, 10, 55, 100] (10以上)
# 第2段階後: [17, 54, 15, 60, 105] → 50以上: [54, 60, 105]
# 第3段階後: 平均は(54+60+105)=219/3=73, 73以上は[105]
# 出力: 105
```
私は処理ごとに変数を分けているのですが、上記のコードではnumsを使用し処理ごとに値を更新させています。
どちらも処理はうまくいきますが、可読性についてどちらが高いかわたしもChatgptも悩んでいたようなのでもしわかる方、上記よりも可読性が高いコードがあればコメントで教えていただけると幸いです

# まとめ
今回は繰り返しの問題を解いてみましたが、比較的うまくコードを書くことができました。しかし次回書く予定の問題は2回トライしてもうまくいかなかった問題でかなり苦労しました。演習についての記事をまだ上げますのでフィードバックよろしくお願いいたします。
Javaで学ぶアルゴリズム -まとめ

# はじめに

[新・明解Javaで学ぶアルゴリズムとデータ構造 第2版 (新・明解シリーズ)](https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3Java%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E7%AC%AC2%E7%89%88-%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4815606005) の一部を手を動かしながらやってみました。

# 探索

- [線形探索](https://qiita.com/_mi/items/212b91da5ae3cbbdb696)
- [線形探索（番兵法ver.）](https://qiita.com/_mi/items/9271ad25f89b7f4d94d0)
- [二分探索](https://qiita.com/_mi/items/bf5748e52b0d7696d48d)
- [二分探索（.binarySearch ver.）](https://qiita.com/_mi/items/eb1ec697898038719cf5)
- [シャッフル（Fisher-Yates）](https://qiita.com/_mi/items/767fcc40c3a04d3fd5c3)
- [ハッシュ法（衝突させる）](https://qiita.com/_mi/items/9ec4a5cad2dd42287f6b)
- [ハッシュ法（チェイン法）](https://qiita.com/_mi/items/2ca32a658126e31bfd4f)
- [ハッシュ法（オープンアドレス法）](https://qiita.com/_mi/items/a679a5d1a6acef6b0ae2)
- [文字列探索（力任せ法）](https://qiita.com/_mi/items/d0abb02739a2787f3fbd)
- [Javaで学ぶアルゴリズム -文字列探索（KMP法）](https://qiita.com/_mi/items/46bc3d848efead853105)
- [Javaで学ぶアルゴリズム -文字列探索（Boyer-Moore法）](https://qiita.com/_mi/items/1837bb3b2d79d0f5d9b2)

# スタックとキュー

- [スタック](https://qiita.com/_mi/items/b5aca9935728bce276bd)
- [スタック（java.util.Stack と java.util.ArrayDeque のパフォーマンス比較）](https://qiita.com/_mi/items/10fff5bb377542682477)
- [キュー](https://qiita.com/_mi/items/d3c8858af563cb25f2e0)

# ソート

- [バブルソート](https://qiita.com/_mi/items/f0e9cdd11ddfbc948c33)
- [最適化バブルソート](https://qiita.com/_mi/items/bc7ec32ce2ef99918b28)
- [双方向バブルソート](https://qiita.com/_mi/items/e0672f44eeab8fae635e)
- [選択ソート](https://qiita.com/_mi/items/ddf976c222ea9d6f2aed)
- [挿入ソート](https://qiita.com/_mi/items/874657cc616c4ce3210e)
- [シェルソート](https://qiita.com/_mi/items/35a1680cf273935da2ca)
- [クイックソート](https://qiita.com/_mi/items/0eec0add5955f337ac6c)
- [マージソート](https://qiita.com/_mi/items/b85d14521919ac827405)
- [バケットソート](https://qiita.com/_mi/items/f42186316fe777e9bf77)
- [度数ソート](https://qiita.com/_mi/items/e4e3549bb329c3cc8843)

# おわりに

アドベントカレンダーの完走にチャレンジしてみたけど、完走（1人で25記事以上）してる人ヤバいよ...（褒め）
未経験エンジニア1年目の1日のスケジュール感

社会人1年目はとにかく勉強が必要です。特に私は未経験でエンジニアに配属されたので、まともにプログラミングすらしたことがありません。
業務知識に加えて、プログラミング自体の勉強も基礎の基礎から必要だったので、グループに配属されて本格的に業務が始まってからの1日の流れをまとめてみました。

### 8:30～9:00 出勤
朝が強いタイプではないので、朝起きてから30分後くらいに出勤します（オンラインワーク）

### 18:00 退勤
その日中に終わらせる必要のあるタスクがなければ退勤します。
タスクがある場合は、その後も作業を続けます。

### 18:00～21:00 キャッチアップ
仕事が終わり次第、業務に関するキャッチアップを行います。
社内におけるコードの書き方、製品知識 など

### 22:00～1:00 自己学習
夜は自分の勉強に時間を使います。
最近はUdemyを利用してJavaの勉強、触ったことない言語(基本的にどの言語も触ったことないですが)を使ってToDoアプリやウェブサイト作成など、「自分がやりたいこと」に取り組む。

### 1:00～1:30 読書
就寝前にデバイスから離れつつ勉強したいものを読書でインプット。
ビジネス書、技術書、資格の参考書 など

---

未経験で始めたエンジニア業務ですが、基礎からのコツコツした積み重ねが将来役立つと信じ、毎日続けています。
もっと勉強の量も質も上げられるよう頑張ります。
【UI/UX】自動再生スライドショーに再停止ボタンを付与する理由

## 自動再生スライドショーとは
自動再生のスライドショーは、Webサイトやアプリケーションで使用される機能です。複数の画像や動画などのコンテンツを一定に時間間隔で自動的に切り替えて表示します。

**主な使用場面**
- ウェブサイトのファーストビュー
- 商品紹介ギャラリー
- キャンペーン告知
- バナーの画像のスライドショー

## 再生・停止ボタンが必要な理由
再生・停止ボタンが必要だと言われる理由には以下が挙げられます。

### 法的要件とガイドライン
よく聞くのがこのガイドラインです。WCAGは国際的な基準となっていて多くのサイトで取り入れるか気にされていると思います。

- WCAGガイドライン2.1の達成基準2.2.2に基づく要件
- アクセシビリティ法制への準拠
- ユニバーサルデザインの原則
### アクセシビリティの観点
普通の方よりもよりセンシティブな方にも配慮する必要があります。

- 視覚障害のあるユーザーへの配慮
    - スクリーンリーダーでの読み上げ対応
    - 情報理解のための十分な時間確保
- てんかんを持つユーザーへの配慮
    - 画面の急な切り替わりによる影響を制御

### ユーザビリティの向上
ユーザビリティにも影響があるとされています。

- ユーザーの閲覧ペース尊重
- コンテンツの理解度向上
- ストレス軽減効果

| メリット   | 説明                               |
|------------|------------------------------------|
| 操作性     | ユーザーが自分のペースで閲覧可能   |
| 理解度     | 必要な情報をじっくり確認できる     |
| 快適性     | 強制的な切り替えによるストレスを軽減 |

## 実装方法
実装の仕方は様々ですが、基本的にはbutton要素を使用し、実装します。1つのボタンで切替える場合もありますし、2つ並べて実装する場合もあります。

```index.html
<!-- 基本的な実装例 -->
<div class="slideshow-container">
    <div class="controls">
        <button class="play-pause" aria-label="スライドショーの再生/停止">
            ▶/⏸
        </button>
        <button class="prev" aria-label="前のスライド">◀</button>
        <button class="next" aria-label="次のスライド">▶</button>
    </div>
</div>
```

:::note
実装時の重要ポイント

- 視認性の高い位置にボタンを配置
- わかりやすいアイコンの使用
- キーボード操作対応
- スクリーンリーダー対応
- レスポンシブデザイン対応
:::

## まとめ
今回は自動再生スライドショーにおける再生・停止ボタンはなぜ必要なのかについて考えてきました。

自動再生スライドショーへの再生・停止ボタンの実装は、単なるオプション機能ではなく、以下の理由から必須の要件となっています。

- 法的要件とアクセシビリティガイドラインへの準拠
- 多様なユーザーへの配慮
- ユーザビリティの向上
- ユーザー満足度の向上

これらの要素を適切に実装し、多くのユーザーが快適に使えるような環境を作っていきましょう。

本記事を読んで頂きありがとうございました！
OMCB031B(514)

https://onlinemathcontest.com/contests/omcb031/tasks/9113


以前にも$mod$ $11$に関する問題を解いたことがありましたが、同じ考え方で解くことができます。

https://qiita.com/msykkb/items/cc0872e364b7a6311949


$A=a_{10}a_9a_8a_7a_6a_5a_4a_3a_2a_1a_0$と置き、$A$を$1$桁ずつ見ていきます。
　$a_0=10^0×a_0≡a_0$
　$a_1=10^1×a_1=(11-1)×a_1≡-a_1$
　$a_2=10^2×a_2=(11×9+1)×a_2≡a_2$
　 　：
　 　：
のように表せるので、
　$A≡a_{10}-a_9+a_8-a_7+a_6-a_5+a_4-a_3+a_2-a_1+a_0=0$ $…①$
になります。
(すべての桁が$0$と$1$なので、$11$より小さくなるので、$≡0$ではなく$=0$と言っても問題ありません。)

$①$を変形すると、
　$a_{10}+a_8+a_6+a_4+a_2+a_0=a_9+a_7+a_5+a_3+a_1$ $…②$
となります。
また、問題文の条件より$a_{10}=1$なので、
　$1+a_8+a_6+a_4+a_2+a_0=a_9+a_7+a_5+a_3+a_1$ $…②'$
です。

$②'$の左辺の$1$の個数と右辺の$1$の個数が同じであれば良いので、
　両辺が$1$の場合、
　 　${}_5C_0×_5C_1=1×5=5$
　両辺が$2$の場合、
　 　${}_5C_1×_5C_2=5×10=50$
　両辺が$3$の場合、
　 　${}_5C_2×_5C_3=10×10=100$
　両辺が$4$の場合、
　 　${}_5C_3×_5C_4=10×5=50$
　両辺が$5$の場合、
　 　${}_5C_4×_5C_5=5×1=5$
になります。

よって、解は$5+50+100+50+5=210$です。

公式解説では、$②'$を求めた後、もっと効率良い方法で解いています。
$②'$において、左辺の$a_{10}$を除く$1$の個数と右辺の$0$の個数の和は常に$4$個なので、
　${}_1{}_0C_4 = \frac{10×9×8×7}{4×3×2×1}=210$
になるということです。

確認すると、
　両辺が$1$の場合、左辺は$a_{10}$を除く$1$が$0$個、右辺は$0$が$4$個。
　両辺が$2$の場合、左辺は$a_{10}$を除く$1$が$1$個、右辺は$0$が$3$個。
　両辺が$3$の場合、左辺は$a_{10}$を除く$1$が$2$個、右辺は$0$が$2$個。
　両辺が$4$の場合、左辺は$a_{10}$を除く$1$が$3$個、右辺は$0$が$1$個。
　両辺が$5$の場合、左辺は$a_{10}$を除く$1$が$4$個、右辺は$0$が$0$個。
となるので、
確かに$10$個から$4個$を選ぶ${}_1{}_0C_4$でも解を導けることがわかりました。
scss・css探検隊 ~color編~

# 導入
UIデザイナーを目指して修行するために、いろんなライブラリやscss, cssを知っておく必要があると考えたので、いろいろ調べてアウトプットしていこうという企画です。できたら毎日1つ紹介していきたいなぁと思います

## colorは基礎中の基礎
だと思ってきました

cssのcolorって、だれでも使うし当たり前のように
```css
color:red
```
だとか
```css
color:linear-gradient(90deg, #5BC7F9 0%, #FF6FEC 50%, #FF537B 100%);
```
とかって書いてきたはずです。いまさらcolorなんか勉強して何になるんだよと思いましたが、ちゃんと調べてみると色々おもしろいな、勉強しておくべきだなと思った部分がいくつもありましたので、今回は、scss内で使える便利なcolorの操作関数を紹介します

## mix
色を混ぜられるやつです。
```css
mix(color1, color2, weight):2つの色を混ぜ合わせる
```
のようにして呼び出します。

普通に

```css
color: mix(blue, red, 50%);  /* 紫になる */
```

とか単純に色を混ぜるのにも使えるのはもちろん、特に便利だなと思ったのが
```css
color: mix(yellow, white, 5%);
```
のようにして白黒を混ぜたいときには本当に便利です！

後々紹介するlightenやdarkenでも代替可能ではありますが、色味が気に入らないことが多く、デザインかじってる身からするとほんとにありがたいです。

他にも、現在使ってる2,3色の色味から似てる色を引っ張ってくるときに疑似カラーパレットとしても使えます。個人的にかなりお気に入りです。

## 明度調整
先ほどチラっと述べたlightenとdarken関数です。
```css
lighten(color, amount): 色を明るくする
darken(color, amount): 色を暗くする
```
のようにして呼び出します。

例としては、
```css
color: lighten(#ff0000, 20%);  /* 20%明るい赤 */
color: darken(#ff0000, 20%);   /* 20%暗い赤 */
```
のようにして使います。

**これを使えば爆速でhoverとかonClickのスタイルを作れます！**
いつもだと

カラーパレット開いて
→基準の色から少し上(下)げた色味のカラーコードを出す
→貼り付け
→これを全Varient分繰り返し

とかいう**本当に頭の悪い書き方**をしなければなりませんでしたが、これを使えば

基準色決める
→相対値で明る(暗)くする
→コピペで基準職だけ変えれば楽々Varient作成

というスタイリッシュムーブに早変わり。
もう直でカラーコード指定するのはやめましょう。

## ほかにも色味調整できるもの
明度調整の他にも、lighten関数らと同じように書けて便利なものがいくつかあります。

彩度(鮮やかさ)調整に使えるsaturate, desaturate関数
```css
saturate(color, amount): 彩度を上げる
desaturate(color, amount): 彩度を下げる
```

透明度調整に使えるtransparentize, opacify関数
```css
color: transparentize(#ff0000, 0.3);  /* 30%透明に */
color: opacify(#ff0000, 0.3);         /* 30%不透明に */
```
**これめっちゃ使えます**
オーバーレイで使ったり、背景の枠で使ったり、いちいちalphaを設定しなくてもこれ一つでできます。押せないボタンのUIとかにもいいんじゃないでしょうか。

## おもしろいけど実用性不明なやつ
実用性はあるかわからないけど、軽い画像処理的なものもできます。

grayscaleでグレースケール化
```css
color: grayscale(#ff0000);
```

補色を出せるcomplement関数
```css
color: complement(#ff0000);
```
反転色を出せるinvert関数
```css
color: invert(#ff0000);
```
うーん、実用性はほぼないでしょう。そもそもデザインする人ならみなさんカラーパレットは使ってると思うので、これで反対色とかは出せるしなぁ...(笑)
まぁ小ネタ程度に知っておくのも悪くないんじゃないでしょうか。

## おすすめの使い方
この前チーム開発の時にこれらの関数があることを思い出して、ふと使ってみたらめちゃくちゃ便利で、特に
#### theme等で共通の色を使いまわすとき
にめちゃくちゃ重宝します。
いちいちボタン用にhover用の色、onClick用の色として、themeに追加していくのも煩雑で美しくないですし、tsx内にカラーコード直書きなんてもってのほかです。

効率的にフロントデザインの開発をしたいなら今回紹介したcolor関数たちを使いましょう
AWSの勉強で挫折した人におすすめする役立ったUdemy講座4選とYoutubeチャンネル

# はじめに
業務では、モバイルアプリを専門としています。
しかし、プロジェクトリーダーをやり始めて約2年半が経ち、モバイルアプリの知識だけだと、プロジェクトへの貢献度が低いなと思い、バックエンドやインフラの勉強をしております。
インフラの勉強では、とりあえず、AWSの資格を取ろうと思い、Cloud PractitionarとSolutions Architect Associateの勉強を進めてます。
実は、過去に二度AWSの勉強を始めたことがあるのですが、2回とも途中で挫折してしまいました。
ですが、今回の勉強は続いており、私用のため、まだ試験は受けれてないのですが、模試では合格点を超えることができました。
今回の記事では、挫折を乗り越えることができたUdemy講座とYouTubeチャンネルを紹介させていただきます。

# 最初に見るべきYouTubeチャンネル
過去の挫折では、資格の勉強から始め、いまいちわからんという状態でした。
理由としては、資格の勉強となると、細かい部分が多いので、まずざっくりとした理解をするには向いてないのかなと思います。

ざっくりとした理解をするのに、とても役立ったのは以下のYouTubeでした。

https://www.youtube.com/@klein9399

この方の動画はとてもわかりやすかったので、気になる動画を片っ端から視聴しました。
AWS系の動画やその他の気になる動画は見ていただきたいのですが、絞るとするなら以下の三つかなと思います。

https://youtu.be/HxBNDPQOJiQ?si=T9tbNISKk0ZYHhXq

https://youtu.be/7J_crzU5KP8?si=Wm9XQELGvQ06-70M

https://youtu.be/HvrIPQ77xRY?si=31BUs9st_f00dOse

# 資格の勉強をするための講座

上記のYouTubeでざっくり理解した後は、本格的に資格の勉強を進めましょう。
網羅的かつ詳細に勉強するには、以下の講座がおすすめです。

https://www.udemy.com/course/ok-aws-e/?srsltid=AfmBOoq706XAF-FsvMAJcz0bUIp-RBnrj3V2aWe9Pf21eAZFhfXRAx7h

https://www.udemy.com/course/aws-associate/?srsltid=AfmBOopl-4xCF2NquqWkgejjuiRy2ZXVN3k-l4xU49r2g7PaRc5T5aow

### おすすめ理由
- 解説が丁寧、かつ、詳細
- 模擬テストがついている

# 試験対策のための講座
ある程度勉強を進めたら、模擬試験を受け、記憶の定着の確認と、さらなる理解を深めましょう。

https://www.udemy.com/course/aws-4260/?srsltid=AfmBOopcr_tSj8b_GIrzvc32ooeNmm5vfDzcFI7doZMC98yjifW_m02M

https://www.udemy.com/course/aws-knan/?srsltid=AfmBOooA5r48bOOnCLkhJdHsLILdPpvKXkl06SEJMvgZ33_RSEOvf_LF

### 模擬試験の使い方

自分が合格ラインにいるかどうかの確認だけでなく、勉強のためにも模擬試験は重要です。

記憶の定着のためには、積極的に思い出すという作業が一番効率がいいみたいです。
詳しく知りたい方は、以下の動画をご覧ください。
AWSの勉強だけでなく、ありとあらゆる勉強の基礎になる良動画と思いますので、おすすめです。

https://www.youtube.com/watch?v=DDGVsAWgdYc

最初のうちは、得点が取れず、モチベーションが下がると思いますが、
模擬試験の結果に一喜一憂せず、淡々と繰り返すのが一番いいと思います。
ZSONについて

ZSONは [Zed](https://zed.brimdata.io/) というプロジェクトで使われているZed Data Modelをテキストで表現するためのフォーマットです。

ZSONはJSONの上位互換となるように設計されており、JSONに対していくつかの拡張がされています。
以下ではJSONと比較したZSONの仕様を紹介します。

# コメント
ZSONではコメントがサポートされています。
`//` 形式の行コメントと `/* */` 形式のブロックコメントが使えます。

# 型デコレーター
ZSONでは型デコレーターを使って型を明示することができます。以下にように値の後ろに型名を括弧で囲って指定します。

```
<value> ( <type> )
```

また、型に名前を付けておき、それを後から使うこともできます。
以下はunit16型にportという型名を付けて、それを後から再利用している例です。

```
{p1:80 (port=uint16), p2: 8080 (port)}
```

# プリミティブ型
ZSONのプリミティブ型はZedデータモデルのプリミティブ型に準じます。

https://zed.brimdata.io/docs/formats/zed#1-primitive-types

JSONと比較すると以下のような特徴があります。

- 整数型が符号のありなし、ビット数などによって複数個用意されている
- 浮動小数点数型がビット数に応じて複数個用意されている
- 十進数型(decimal)が存在する
- 時間と時刻を表す型が存在する
- バイナリを表す型が存在する
- IPアドレスやネットマスクを表す型が存在する
- Zedの型を表す型が存在する

# 複合型
ZSONにはレコード型(JSONのオブジェクト型)や配列型のようなJSONに存在する型に加えて以下の方が存在します。

- Set型
- Map型
- Union型
- Enum型
- Error型

出展:

https://zed.brimdata.io/docs/formats/zson
JavaScriptでShift + Enterで送信を実装する

# JavaScriptでtextareaをShift + Enterで送信する実装

```HTML
<div>
    <textarea id="question" placeholder="質問を入力してください"></textarea>
    <button id="sendBtn">送信</button>
</div>
```
```javascript
document.getElementById("question").addEventListener("keypress", e => {
    if (e.key === "Enter" && e.shiftKey) {
        e.preventDefault();

        const sendButton = document.getElementById("sendBtn");
        if (sendButton) {
            sendButton.click();
        }
    }
});
```

*   簡単な説明
    *   `addEventListener`: `keypress`イベントを監視。
    *   `e.key === "Enter" && e.shiftKey`: EnterキーとShiftキーが同時に押されたかをチェック。
    *   `e.preventDefault()`: デフォルトの改行動作をキャンセル。
    *   `sendButton.click()`: 送信ボタンをクリックと同じ処理を走らせる。

・Shift + EnterではなくCtrl + Enterで送信したい場合は、`e.shiftkey`を`e.ctrlKey`にするだけ。

## Shift + Enterで改行、　Enterで送信したい場合はこちら
```javascript
document.getElementById("question").addEventListener("keypress", e => {
    if (e.key === "Enter") {
        if (e.shiftKey) {
            // Shift + Enterの場合、デフォルトの改行動作を維持
            return;
        } else {
            // Enterのみの場合、送信処理をトリガー
            e.preventDefault(); // デフォルトの改行動作をキャンセル

            const sendButton = document.getElementById("sendBtn");
            if (sendButton) {
                sendButton.click(); // ボタンをクリックしたのと同じ動作
            }
        }
    }
});
```
Life is beautifulのアイディアソンに参加して学んだこと

# はじめに

この記事は、Life is beautifulが主催するアイディアソンに参加した経験をもとに、その活用方法や学んだことを紹介します。

アイディアソンは、メルマガ「週刊 Life is beautiful」が2025年に15周年を迎える記念として開催されるイベントで、締め切りは2024年12月31日です。優秀作品には賞品としてApple Mac miniが送られますので、ほしい人は是非ご参加を！

[https://github.com/snakajima/life-is-beautiful](https://github.com/snakajima/life-is-beautiful)

# 参加しての学び

さて、アイディアソンに参加してみて、これ面白いなと思いました！

## アイディアをプレスリリース形式でまとめる

アイディアをプレスリリース形式でまとめるという方法は、適当なアイディアを具体化する過程で非常に有効でした。ChatGPTへの依頼として「プレスリリース形式でまとめてください」と指示するだけで良い感じでまとまるので、適当にアイディアを投稿してくださいと依頼するよりも効率よくアイディアをまとめることができたかなと思います。

## アイディアの投稿先をGithubのIssueを使用する

また、投稿先がGithubのIssueを使用したマークダウン形式であったことも良かったです。
アイディアを整理する上でマークダウン形式にてアウトプットすることがChatGPTとの相性も良く、アイディアを変更しながらの投稿が楽に実現できました。

投稿すべきプレスリリースのサンプルは下記を参考にしてください（アイディアを与えて、ChatGPTに書かせたものです）：
[https://github.com/snakajima/life-is-beautiful/issues/1](https://github.com/snakajima/life-is-beautiful/issues/1)

# まとめ

Life is beautifulのアイディアソン、mac miniを欲しさに参加しましたがやり方がすごい勉強になったので、本記事にまとめさせていたきました。

今後アイディアソンを実施するときにこれを思い出して参考にしたいなと思います。

# 参考文献・サイト

- [https://github.com/snakajima/life-is-beautiful](https://github.com/snakajima/life-is-beautiful)
- [https://github.com/snakajima/life-is-beautiful/issues/1](https://github.com/snakajima/life-is-beautiful/issues/1)
Webエンジニアが2024年に読んだ本

# はじめに
この記事では、Webエンジニアの自分が2024年に読んだ本をまとめます。

2023年のまとめはこちらです。

https://qiita.com/Yasushi-Mo/items/d55dc2eabc600862af23

# Web技術

https://gihyo.jp/book/2024/978-4-297-14571-2

Web技術の全体像が今までの歴史も踏まえて理解できます。

# アクセシビリティ

https://gihyo.jp/book/2023/978-4-297-13366-5

# E2Eテスト

https://gihyo.jp/book/2024/978-4-297-14220-9

Playwright の基本的な機能に加え、自動テストの考え方なども学べます。

# Next.js

https://gihyo.jp/book/2024/978-4-297-14061-8

# Docker

https://www.shuwasystem.co.jp/book/9784798071503.html

手を動かしながら Docker を学ぶことができます。

# AWS

https://www.sbcr.jp/product/4815607654/

https://www.amazon.co.jp/gp/product/B0CH7P3SQM

https://www.amazon.co.jp/gp/product/B0BJN4H1NF

https://www.amazon.co.jp/gp/product/B0BJMM1ZBP

# ソフトウェアアーキテクチャ

https://www.oreilly.co.jp//books/9784814400065/


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

# プロジェクト・組織マネージメント

https://pub.jmam.co.jp/book/b582279.html

https://www.maruzen-publishing.co.jp/item/b294733.html
データ量を表す単位  ~ ビット, バイト, ニブル, オクテット, ワード

# はじめに

デジタルデータの世界では、データ量を表すためのさまざまな単位が存在します。これらの単位を理解することは、コンピュータシステムやデータ通信の基礎を学ぶ上で非常に重要です。

本記事では、**ビット**、**バイト**、**ニブル**、**オクテット**、**ワード**といった基本的なデータ量の単位について詳しく解説します。

これらの単位は、データのサイズやメモリの容量、ストレージの容量などを表すために使われます。例えば、テキストファイルのサイズ、コンピュータの RAM やハードディスクの容量などです。

# ビット

コンピュータ上では、あらゆるデータが 2 種類の電気信号 ( `0` と `1`に対応 ）で表現されています。つまり、コンピュータ内部のデータは **2 進法**によって表現されています。

コンピュータが扱うことのできるデータの最小単位は**ビット**（ bit ）として表されます。ビットは、`12b`（12 ビット）のように小文字の「**`b`**」として表されることもあります。

![ビット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/39cc7320-08cf-82ae-80cc-ddeb27798b19.png)

ビットは `0` または `1` のいずれかの値を持つことができます。つまり、n ビットは 2<sup>n</sup> 通りのデータを表現できます。（例: 2 ビットでは `00`, `01`, `10`, `11` の 4 通り）

| ビット       |  1  |  2  |  ... |       n       |
| :----------- | :-: | :-: | :-: | :-----------: |
| データの種類 |  2  |  4  |     | 2<sup>n</sup> |

:::note
2 進数で数を表すときに、`0110` のように上位の桁が `0` であっても `0` をそのまま記述することがあります。
これは、コンピュータ内部でその数を表すために何ビット使用されているかを明示するためです。例えば、`00001010` は 8 ビットが使用されていることを明示しています。
:::

ビットはコンピュータの最も基本的なデータ単位であり、全てのデジタルデータはビットの集合として表現されます。

# バイト

ビット以外にコンピュータでデータ量を表す単位として、**バイト**（byte）があります。**1 バイト**は **8 ビット**で構成されます。したがって、1 バイトでは 2<sup>8</sup> = **256 通り**のデータを表現することができます。

| バイト       |       1       |       2        |   ... |       n        |
| :----------- | :-----------: | :------------: | :-: | :------------: |
| ビット       |       8       |       16       |   ... |       8n       |
| データの種類 | 2<sup>8</sup> | 2<sup>16</sup> |    | 2<sup>24</sup> |  2<sup>8n</sup> |

コンピュータのメモリは、**バイト単位**で管理されており、**1 バイトごとにアドレス**と呼ばれる番号が割り振られています。

:::note
バイトは、厳密には 8 ビット以外を指すこともあります。必ず 8 ビットのことを指すものとして、後述する**オクテット**が使われます。
:::

<details><summary><strong>バイトの上位単位</strong></summary>
データ量が大きくなると、キロバイト（KB）、メガバイト（MB）、ギガバイト（GB）、テラバイト（TB）など、バイトの上位単位が使用されます。これらの単位は 1024 の累乗で計算されます（2 の 10 乗 = 1024）。

1 キロバイト（1 KB）は 1024 バイト、1 メガバイト（1 MB）は 1024 キロバイト、1 ギガバイト（1 GB）は 1024 メガバイト、1 テラバイト（1 TB）は 1024 ギガバイトに相当します。

| 単位              | ビット（bit）     | バイト（Byte）    |
| :---------------- | :---------------- | :---------------- |
| 1 ビット          | 1                 | 1/8               |
| 1 バイト          | 8                 | 1                 |
| 1 キロバイト (KB) | 8,192             | 1,024             |
| 1 メガバイト (MB) | 8,388,608         | 1,048,576         |
| 1 ギガバイト (GB) | 8,589,934,592     | 1,073,741,824     |
| 1 テラバイト (TB) | 8,796,093,022,208 | 1,099,511,627,776 |

</details>

# ニブル

**ニブル**（nibble）は 4 ビットで構成される単位で、1 ニブルでは 2<sup>4</sup> = 16 通りのデータを表現することができます。

ニブルは**バイトの半分の大きさ**で、**16 進数の 1 桁**です。1 バイト（= 8 ビット）のうち、上位 4 ビットを**上位ニブル**、下位 4 ビットを**下位ニブル**と呼ぶことがあります。

# オクテット

**オクテット**（octet）は 8 ビットで構成される単位で、バイトと同義です。特にネットワークや通信分野でバイトと区別して使われることがあります。

# ワード

**ワード**（word）は CPU が一度に処理できるデータ量を表す単位であり、コンピュータのパフォーマンスに影響を与えます。一般的に 16 ビット、32 ビット、または 64 ビットで構成されます。

- 16 ビット CPU：1 ワードは 16 ビット（2 バイト）
- 32 ビット CPU：1 ワードは 32 ビット（4 バイト）
- 64 ビット CPU：1 ワードは 64 ビット（8 バイト）

近年の CPU は 64 ビットが主流になっています。

# おわりに

データ量を表す基本単位であるビット、バイト、ニブル、オクテット、ワードについて紹介しました。これらの単位を理解することで、デジタルデータの扱いやすさが増し、コンピュータシステムやネットワークの理解が深まります。
Zero to Coach, Coach with Care

## 研修コーチとしての第一歩 - ケアとキュアの視点から

このアドベントカレンダーの概要にも書いたように、2024年の4月、まっさらな状態から若手の育成に関わるなかで自分自身も学びが多い1年になりました。

コーチとしてゼロから歩みを始めたときはとにかく若手の能力を伸ばさなくては！という使命感のなかでカリキュラムを考え、進捗を管理し、コードレビューしたりしました。

このアドベントカレンダーに書いてきたように、基礎的な部分からのスタートでした。
短期的にぐっと伸びるときもあれば、なかなか思うようにいかない日もあり、教えかたや伝え方が悪いのかもしれないと考えはじめ、どうにかして解決の糸口をみつけたいと思っていたときにザッソウラジオ#97を聴き、**コーチの考え方も「ケア」と「キュア」に分けてみると腹落ちするかもしれない。** と考えました。

https://open.spotify.com/episode/5Oyjw015kseLcd70ytMehb

ケアとキュアの定義をここでは以下のように定義します。

- ケア：寄り添い、相手の状態を支えながら前進を見守る
- キュア：問題を直接解決する

**育成において重要なのは、すぐに答えを与える「キュア」ではなく、本人が考え、試行錯誤する余地を残す「ケア」の姿勢である。**

この観点をもとに、短期的に伸び悩んでいることに一喜一憂するのではなく、伝え方を工夫する、一晩寝かせる、別のアプローチでやってみるなど、相手の状態に応じた振る舞いを変えていけるようになりました。

新人が直面する課題は、多くの場合、その人自身が**乗り越えるべき「学びの瞬間」** です。コーチとしての役割は、その課題を解決してあげることではなく、自分で解決する力を育むためのサポートを提供すること。

たとえば、質問を投げかけて考えを深めてもらったり、小さな成功体験を積む機会をつくることがそれに当たります。

はじめは「教えたほうが早いのでは」と感じることもありました。しかし、短期的な効率を追求することで長期的な成長の芽を摘んでしまう気がしました。本質は「本人が自分で立ち上がる力をつけること」に向かっていくべきだなと感じます。

ふりかえると、もっとあれをすればこれをすればと思うことばかりですが、ケアの姿勢を大切にしながら、学ぶ喜びをいっしょに共有できる関係を築いていきたいと考えられるようになったのは大きな気づきでした。

これが真の成長を支えるコーチングだ、と言い切れるほどにはまだ到達していませんが、これまでの経験で学んだことを活かしていければ来年もおもしろそうな1年になりそうです！

おしまい。
ChromebookでもJNetHack

# はじめに
ChromebookでもJNetHackができるようにしていたのですが、バックアップに失敗して全てを消し去ってしまってから暫く放置してました。
久しぶりにJNetHackがプレイしたくなり起動しようとしたらホームに何も残っていない状態でした。。。

# 事前準備とインストール
作業は[androidのとき](https://qiita.com/osamou/items/b034b2721b8f94927201)とほぼ一緒でした。
インストールするパッケージ抜けてるのがあるかもしれん。
また、パッチはミラーからダウンロードしてます。

```
sudo apt install clang make bison flex gzip wget ncurses-ui-libs nkf
wget https://ftp.jaist.ac.jp/pub/sourceforge.jp/jnethack/78334/jnethack-3.6.7-0.1.diff.gz
wget https://www.nethack.org/download/3.6.7/nethack-367-src.tgz
tar zxvf nethack-367-src.tgz
cd NetHack-3.6.7/
zcat ../jnethack-3.6.7-0.1.diff.gz | patch -p1
sh ./configure
make install
```

そして起動
```
cd ../
nh/install/games/jnethack
```

![Screenshot 2024-12-25 08.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211553/894a858e-deef-c747-bdf3-68f134216fa1.png)

よきJNetHackライフをっ！！
Scalaの有名なソフトウェア

## はじめに

この記事は、Scala Advent Calendar 2024 25日目の記事です。


https://qiita.com/advent-calendar/2024/scala


## 内容

Scala初心者としてScala製のソフトウェアにどんなものがあるのか気になったので軽く調べてみました。

**Apache Kafka**: 分散型ストリーミングプラットフォームで、リアルタイムデータの処理に広く使用されています。Scalaで開発されており、高いスループットと低レイテンシを実現しています。
https://kafka.apache.org/

**Apache Spark**: ビッグデータ処理のためのフレームワークで、Scalaで書かれています。大規模なデータセットの高速処理が可能で、データ分析や機械学習に広く利用されています。
https://spark.apache.org/

 **Akka**: 分散システムや並行処理のためのツールキットで、Scalaで開発されています。アクターモデルを使用して、高いスケーラビリティとフォールトトレランスを提供します。
 https://akka.io/
 
 **Play Framework**: Webアプリケーションフレームワークで、ScalaとJavaで開発されています。非同期処理をサポートし、高いパフォーマンスを提供します。
https://www.playframework.com/
 
**Finagle**: Twitterが開発したRPCシステムで、Scalaで書かれています。分散システムのための高性能なネットワークスタックを提供します
https://twitter.github.io/finagle/