OmniAICreator/Qiita-1.07M huggingface dataset:
新卒のオンボーディングを振り返る

# 背景
現職では、新卒エンジニアが配属されたことがありませんでした。そのため、新卒エンジニアのオンボーディングのプログラムもノウハウもありませんでした。
マネージャーとして新卒受け入れを段取りしたので、振り返ります。
# 私がやったこと
- 人事と教育係と連携して、外部研修のフォロー
- 7月以降のスケジュール作成
- PC含めた必需品手配の連携
- 教育係の相談役
- 基本情報技術者を取得推奨にする
# スケジュール
- 3月までに
    - 人事と連携し外部研修の手配
    - 教育係の指名
- 4月
    - 新卒入社
    - 配属と教育係の発表
    - 配属先との顔合わせ
- 4月～6月
    - 外部研修(3ヶ月)
- 7月
    - 原則出社
    - 開発環境構築
    - 製品学習
    - リモート業務準備
    - 基本情報技術者の勉強
- 8月～12月
    - 新卒と教育係は週1出社
- 1月～
    - 基本リモート
# やってよかったこと
- 外部研修
    - 他社の新卒と合同の研修のため、同期に近い知り合いができていた
    - 社会人の基礎も教えてくれた
- 基本情報技術者を取得推奨にする
    - 研修では言語やチーム開発の基本が主でOSやネットワークなどの知識が薄い
    - 会話時の前提レベルがわかる
    - 受かると報奨金がでる
    - 申請方法(社内システム)を教えられる
- フルリモートへのソフトランディング
    - テキストでの相談の仕方を教えやすい
    - オンライン会議の活用の仕方を教えやすい
        - 最初は隣通しでオンライン会議をやって慣れてもらった
        - 画面共有しての説明が相手から見てどうなるかを実感してもらった
        - 教育係がどうやって画面共有を活用してるか見てもらえる
        - トラブル時にどうしたらいいかのフォロー
    - 出社時のアウェー感が薄くなる
    - マネージャー層(週4出社)が新卒のタイプを把握しやすい
- 開発環境構築
    - PCにパーツを自分で追加してもらいOSインストールからしてもらった
    - 未経験の人が多いのでここで経験しておいてもらった
    - 注:パーツ追加やOS入れ替えが時々必要になる職場
# 反省点
- 手順書が中途むけでレベルがあわなかった
- 開発としての共通で教えることと、配属チームで教えることの線引きがよくなかった
- 教育係にかかる負担の見積もりが甘かった
- 教育係以外のメンバーとの交流のタイミングを用意してなかった
- 技術レベルの確認方法を用意してなかった
# 来年度にむけて
新卒採用を続ける予定です。
今年度は実際に受け入れてみると想定外が多々発生し、受け入れのプログラムの改善が必要になる日々でした。改善点はメモしてあるので、来年度はもう少しスムーズにしたいです。
新卒受け入れプログラムを公開している各社の情報はとても参考になりました。ありがとうございました。
GASでグラフ画像を生成する

この記事は[and factory.inc Advent Calendar 2024](https://qiita.com/advent-calendar/2024/andfactory) 15日目の記事です。

# はじめに

スプレッドシート上のグラフ画像をXに投稿するGASを組みたかったのですが、Sheets APIを確認したところ、以下コードを見つけたので早速実行してみました。

```javascript
const blob = this.sheet.getCharts()[0].getBlob().getAs('image/png');
```

サクッとグラフ画像は作れたんですが、出来上がったグラフ画像が完全ではなかったのです…(私がやったときは軸の書式設定がうまく反映されませんでした)

バグかもしれないので現在は修正済みの可能性がありますが、その時はバグが修正されるのを待てなかったため、別の手段で解決しました。その内容を解説しようと思います。

# グラフの作成

GASにはChartsAPIが用意されており、APIを使用してグラフを作成することができます。今回はこのAPIを使用して新規にグラフを作成し、その画像を取得することによって解決しました。
なお、作成したグラフをスプレッドシート追加することもができますが、今回は追加する必要がないのでグラフの作成＆画像生成のみを実施しています。

```javascript
function main() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
  const values = sheet.getRange('A1:C8').getValues();
  const imageBlob = getGraph_(values);

  // TODO: 画像を使用してXに投稿
}

function getGraph_(values) {
  const [header, ...rows] = values;
  header.shift();

  // 列の定義
  const dataTable = Charts.newDataTable();
  dataTable.addColumn(Charts.ColumnType.DATE, '日付');
  header.forEach(x => dataTable.addColumn(Charts.ColumnType.NUMBER, x));

  // 行を追加
  rows.forEach(row => {
    dataTable.addRow(row)
  });
  
  // チャートを作成
  const chart = Charts.newLineChart() // 折れ線グラフを作成
      .setDataTable(dataTable.build()) // データ
      .setDimensions(700, 500) // サイズ
      .setOption('legend.position', 'top') // 凡例の位置
      .setOption('legend.maxLines', 2) // 凡例の行数
      .setOption('hAxis.format', 'yyyy/MM/dd') // 横軸のフォーマット
      .setOption('chartArea', {top: 60, left: 70, width: '85%', height: '80%'}) // グラフの描画領域(軸と凡例を除く)
      .setColors(['#000000', '#c7b83c']) // 軸の色
      .build();

  return chart.getAs('image/png');
}
```

`setOption`を使用してグラフの詳細を指定しています。なお、`setOption`に指定することができるオプションは[こちら](https://developers.google.com/apps-script/chart-configuration-options?hl=ja#column-config-options)に記載されています。

使用したデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56982/6b10b4bc-e517-194f-959c-752359dafdf4.png)

実際にできた画像がこちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56982/4d4e20c6-5d47-f52b-b0ef-b41d1fa2fb57.png)

うまく折れ線グラフが作成されていますね。

# おわりに

最初に問題となっていた軸の書式設定がちゃんと反映されていたのでこれで解決です。

GASでグラフが作れると、定期的にデータをグラフ化してSlackに投稿したりなど、業務で使用することも可能かと思いますので興味を持った方はぜひお試しください。
はじめての自宅サーバーをしてみた話 ラズパイ編

:::note warn
 この記事は、国語苦手な主が、渋々重い腰を上げて書いた記事です。
 Qittaのガイドラインに違反してる以外の、ご指摘、ご叱りのコメントはなるべく優しい言葉で書いてくださると、私のメンタルがえぐられずにまたかけると思います。
 (要するに、間違っていても初めてなので多めに見て優しくしてください)
:::
# はじめに
みなさんこんにちは、初心者のあじらもです。一応jsとか勉強してます。
最近、某散財系鯖主にハマりまして、動画を見てたわけですよ、そこでふと思ったんです。
「これうちにある機材で動かせるんじゃね？」と、そこで私は某海賊王のように、家にあるラズパイやPC、ルーター、LANケーブルを、ありったけ集めました
# １回目 ラズパイ3B(Pimox)編
私は、最初Pimoxという、Proxmoxのラズパイ改良版のものを触ってみました。まず最初に
```shell
$ curl https://raw.githubusercontent.com/pimox/pimox7/master/RPiOS64-IA-Install.sh > RPiOS64-IA-Install.sh

$ chmod +x RPiOS64-IA-Install.sh

$ ./RPiOS64-IA-Install.sh
```
その結果、それラズパイ3やから、互換性ないでーと、そして調べたところ、shファイルをnanoでいじれば行けると聞き、ものは試しとやったところ、途中まではいけたのですが、バグり散らかし、結局うんともすんとも行かずに終わってしまいました
参考サイト:https://koko2.com/2023/12/30/post-121/
# ２回目 ラズパイ3B(Cockpit)編
どうやら調べたところ、Proxmoxの他にcockpitというOSSサーバー管理ツールがあるらしく、それの、cockpit-machine(仮想環境)を使用するとできるとか聞いて早速やってみました
### 1.UbuntuServerのインストール
RaspberryPi Imager を使用しSDカードにUbuntuServerを書き込みました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951364/371daea2-12f2-42bc-47d0-27d01b8284c5.png)
### 2.cockpitのインストール
aptを使用し
```
$ sudo su -

# apt install -y cockpit cockpit-machines

# systemctl enable cockpi.socket
```
### 3.アクセスしてみる
Cockpitのポートが9090なので
https://< IPアドレス >:9090 でアクセス
その結果(画像がないためネットから)がこちら
![image](https://magic-group.work/wp-content/uploads/2023/09/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2023-09-24-110506-1024x595.png)
パスワードなどをうち、ログインができると早速問題発生
### アップデートのエラー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951364/4ea21ec4-dc36-0041-a53e-57780845ba99.png)
このように`“packagekit cannot refresh cache whilst offline"`と出てくる
[公式サイト](https://cockpit-project.org/faq#error-message-about-being-offline)によると、このバグはDebian系列のLinuxで起こるそう、公式サイトを見ながら
```
$ sudo vi /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
$ sudo  nmcli con add type dummy con-name fake ifname fake0 ip4 1.2.3.4/24 gw4 1.2.3.1
```
これを実行し再起動、すると、なおって、ちゃんとアップデートできるように
### 仮想環境構築
ついに仮想環境を構築
手始めに、ubuntuを入れてみる、すると？
メモリがないと出てくる(画像なし)
ここまでは想定内なので、Swapで仮想メモリを構築、しかし認識されてない
ここで、主は挫折、仮想環境で、swapをできるというのもなさそうなので、諦めることに...
### Podmanとの出会い
なんと、cockpitには、仮想環境以外にpodman、いわいるdockerみたいなやつ？があるらしいので、入れてみることに
```
sudo apt install cockpit-podman
```
そのごcockpitをログアウトし、再度ログインしてみる
するとPodmanのタブが追加されているので``` アクセス > Ubuntu Imageを取得 > コンテナを建てる```の順でやってみる、すると？Ubuntuを入れることに成功！！
ついに仮想化のようなことができた！さっそく、試しにマイクラサーバーを立ててみる
### 深刻なメモリ不足
ここで気づいてほしい、これはラズベリーパイ、つまりメモリが少ないため、当然エラーが出る試しにしてみるも、メモリ不足だよ、とエラーが出る...まぁここまでできたし、主は満足
# まとめ
ラズパイ3でもサーバーはできる！！
(主がラズパイを知ったのは４年前ぐらいなので、ラズパイが高くて軍資金がなくラズパイ３しか持ってない)
# 次回予告
余ったデスクトップPCを仮想化！！！好ご期待
本番環境のYAMAHAルーターをリモートで初期化しちゃった話

今年にあったやらかしをライトに書いていきます。

## 登場人物

* ルーターA（RTX1220）：メインルーター（被害者）
* ルーターB（RTX1220）：バックアップルーター
* スイッチ（SWX3220-16MT）：同じネットワークにいるスイッチ
* 占有型インターネット回線：ルーターAに収容
* フレッツ光：ルーターBに収容

## 発端

とあるお客さんの一部のネットワークで、インターネットに繋がらないトラブルがありました。
たまたまお客さんは長期休暇で、施設の担当者しかおらず実際には使われていなかったのですが、こちらからの死活監視で疎通が取れないので対応しました。

## ネットワーク図

![ad1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238748/6d3c8dff-be90-4b52-18fd-7a57173f5a17.png)

2台のRTX1220ではVRRPをして冗長化をしています。
SWX3220に収容していて、SWX3220の配下はSWX2320がつながっていて、それぞれのパソコンとかに行っています。
SWX3220はL3スイッチですが、L3機能は使っていません。なんでSWX3220が入っているのかは謎です。

## 確認

ルーターBは疎通がとれているので、ルーターBにリモートをしてルーターBからAに対してTelnetをしてみました。
そこで、インターネット側（8.8.8.8など）に対してPingを打ったり占有型回線なのでプロバイダ側のゲートウェイに対してPingをしてみましたが疎通が取れませんでした。

## やってしまったこと

確認の結果やはりダメそうなので再起動しようとしました。

しかし、何を思ったか、

    Router_A# restart

とするところを
    
    Router_A# cold start

としてしまったようです。

[YAMAHAコマンドリファレンス cold start](https://www.rtpro.yamaha.co.jp/RT/manual/rt-common/operation/cold_start.html)

よく覚えてないですが、疲れてしまってたみたいです。
やったときは自覚がないといいますか、正直なんも考えてなかったので記憶がないです。

## 判明まで

最初は再起動したつもりだったので、Pingを打ちつつ起動を待っていましたが全く返って来ませんでした。
しばらくして、ARPに192.168.100.1が現れたので不思議に思っていましたが、MACアドレスがルーターAのものだったのでハッとなりました。

## 対処

いかないといけないかな…？って思って準備してましたが、よくよく考えてみました。
初期化したことが確かなら、初期IPアドレスが"192.168.100.1"になるのでTelnetをします。
無事Telnetができたら設定を入れていきます。幸いにもバックアップを取っていたので一行づつ入れていきます。
その間確認しつつ入れましたが設定的には問題なさそう。
全て入れ直したあとに保存をしました。

## なんでインターネット繋がらなかったの？

どうも、回線業者側でメンテナンスがあったらしく、そのメンテナンスの開始時刻から繋がらない状態になっていたようで、メンテナンスが終わってもなお繋がらない状態でした。
そのため、担当者に連絡してメディアコンバータを再起動してもらうとつながるようになりました。

## 教訓

1. コマンドを入れるときはきちんと確認しましょう
1. そもそも確認だけなら基本的に管理者モードに入る必要はないよね？ユーザーモードでやりましょう
    * （nslookupとか管理者じゃないと出来ないのどうにかならないのかな…）
1. 基礎知識として初期値を知っておくのは大事だと思いました。初期状態でTelnetができること、IPアドレスは"192.168.100.1"であること、初期ユーザーは「admin」であること。を知らないと対処できなかったように思います
1. 機器のMACアドレスとかネットワーク図とか、その施設の基礎的な情報は知っておく必要があると思います。対応するにあたってなにが武器になるかはわかりませんので
1. メンテナンス情報は知っておく必要があったと思いますが、回線事業者によっては情報が行き渡らないようになっている（ホームページなどで確認ができない・そもそも連絡しない・契約者しか見られないマイページでの公開など）場合もあります
1. 1人で対応しないのも大事です

以上です
AWS Storage Gatewayとは？

# AWS Storage Gateway

AWS Storage Gatewayは、オンプレミス環境とAWSクラウド間のストレージを統合するためのサービス。
```mermaid
flowchart TD
    A[オンプレミス環境]
    B[AWS Storage Gateway Appliance]
    C[オンプレミスキャッシュストレージ]
    D[AWSクラウド]
    E[AWS S3]
    F[AWS EBS]
    G[AWS FSx]
    H[AWS Backup]

    A -->|データ送信| B
    B -->|ローカルキャッシュに保存| C
    B -->|データ変換と転送| D
    D -->|保存| E
    D -->|保存| F
    D -->|保存| G
    E -->|バックアップ| H

    subgraph オンプレミス
        A
        B
        C
    end

    subgraph クラウド
        D
        E
        F
        G
        H
    end

```

## 3つのゲートウェイタイプ
| ゲートウェイタイプ      | 保存先                      | 特徴                                           | 覚え方                              | 覚えやすいポイント                                                                                                   |
|----------------------|----------------------------|-----------------------------------------------|------------------------------------|-------------------------------------------------------------------------------------------------------------------|
| ファイルゲートウェイ        | Amazon S3                 | NFS/SMBプロトコルをサポート。                 | **「ファイルはS3へ、簡単にNFS！」**        | ファイルストレージとして利用。「NFS/SMBサポート」を覚え、S3にデータを保存するシンプルさをイメージ。                                                     |
| ボリュームゲートウェイ     | Amazon EBS または S3      | iSCSIインターフェース。スナップショットを保存。| **「ボリュームEBS、一緒にスナップ！」**     | 「ブロックストレージ＝EBS」というキーワードを覚えつつ、スナップショットを保存する役割を強調。iSCSIで接続するイメージも重要。                          |
| テープゲートウェイ        | Amazon S3 または S3 Glacier | 既存のバックアップアプリと統合可能。         | **「テープはバックアップでしょ、氷(Glacier)も！」** | バックアップ専用として「テープ＝S3/Glacierに保存」と連想。「既存アプリと統合可能」で現場での実用性がポイント。                                          |


## ユースケース
### ファイルゲートウェイの場合
例えば、オンプレのWindows PCとAmazon S3とシームレスにやり取りしたい場合はファイルゲートウェイを利用することで、Windows上にネットワークマウントをすることができる。
そのため、Windows上でS3をファイルのように管理することが可能。
※Windows上からS3のオブジェクトを削除することは出来ない
NewRelicのStreaming methodsまとめ

## はじめに
NewRelicで監視作ったりチューニングとかしてると集計方法とかをいじったり確認したりすることがあり、めちゃむずいなと思ったのでまとめてみようと思った。(正直まだ完璧とは言いづらい)

## アグリゲーションとは
システムのパフォーマンスデータを効率的に集約（集計）して、重要なインサイトを得るための機能。
複数のデータポイントをグループ化し、平均値や最大値、最小値、合計値などを求めることで、全体のパフォーマンスの傾向を把握しやすくできる。

## Streaming methodsとは
データの性質に合わせて、これから紹介する3つの集計ウインドウを閉じる方法の集合体

※集計ウィンドウ：この期間内のタイムスタンプを持つデータが集計され、評価。

## 集計方法3種類
集計方法は下の3つを選択することができる。
- Event flow
- Event timer
- Cadence
```
Event flow：デフォルトで設定されていて頻繁に、ほぼ順番に受信されるデータに最適
Event timer：クラウド統合データやまれなエラー ログなど、バッチで頻繁に到着しないデータに最適
Cadence：NewRelicが提供している独自の集計方法でこの3つの中で一番古い
```

## Event Flowの特徴
頻繁かつ一定間隔で発生するデータに対するアラート設定に最適な方法。
毎分01秒ちょうどにデータが到着し、Window Durationが5分、Delayが2分の場合を例とする。
12:00:00 から 12:04:59 まで5分間の集計ウインドウ内で、最新のデータのタイムスタンプは 12:04:01 になる。
そこから2分後、12:06:01 以降のタイムスタンプを持つデータが到着すると、12:00:00 から 12:04:59 までの集計ウインドウが閉じ、NRQLクエリによる
集計・しきい値との比較が行われる。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172936/78b18604-5041-4543-455c-25acf7f043d3.png)

上記の特徴からリソース監視する時に使うといいかも？

## Event Timerの特徴
到着順番や発生間隔に一貫性がないデータを評価するときに最適な方法。
集計ウインドウ内のデータが最後に到着してからの時間経過によって、集計ウインドウが閉じられる。
データが到着するとTimerで設定した時間のカウントダウンが始まってTimerが0になると集計ウインドウが閉じられてTimerが0になる前にデータが到着するとTimerがリセットされる。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3172936/7a82b3e0-6080-bfc1-40bc-3f3147d65521.png)

上記の特徴から散発的かつ予期せずに発生するアラートに対する監視（異常検知とか）にいいかも？

## Cadenceの特徴
データのタイムスタンプではなく、NewRelic内部のシステムクロックに基づいて一定間隔で集計を行う方法。

## 公式情報
NRQLアラート条件に追加された新しい集計方法とどれを選ぶべきかの指針
https://newrelic.com/jp/blog/nerdlog/new-aggregation-methods-for-nrql-alert-conditions

ストリーミング・アラート：重要な用語と概念
https://docs.newrelic.com/jp/docs/alerts/create-alert/fine-tune/streaming-alerts-key-terms-concepts/

集計方法の選択
https://docs.newrelic.com/jp/docs/alerts/create-alert/fine-tune/choose-your-aggregation-method/
SynerGen-VL: 次世代マルチモーダルAIによる画像認識と生成の革新

# SynerGen-VL: 次世代画像認識と生成を統合する画期的アプローチ

マルチモーダルAIの発展に伴い、画像認識と生成を単一のフレームワークで統合する試みが進んでいます。その中でも「SynerGen-VL: Towards Synergistic Image Understanding and Generation with Vision Experts and Token Folding」という論文は、シンプルで効率的な設計を実現し、画像処理の新しい地平を切り開く研究です。本記事では、背景、技術的詳細、実験結果、そして応用可能性について徹底解説します。

---

## 論文情報
- **タイトル**: SynerGen-VL: Towards Synergistic Image Understanding and Generation with Vision Experts and Token Folding
- **リンク**: [arXiv:2412.09604v1](https://arxiv.org/abs/2412.09604)
- **発表日**: 2024年12月12日
- **著者**: Hao Li, Changyao Tian, Jie Shao 他
- **DOI**: N/A

---

## 背景と目的

### 学術的背景
画像認識と生成の両タスクは、AI研究の重要な課題として注目されています。OpenAIのCLIPやDALL-E、GoogleのImagenなどのモデルは、これらの分野において顕著な成果を上げましたが、依然として以下の課題が残っています：

#### **従来の課題**
1. **モデル設計の複雑さ**  
   - 多くのモデルが、異なるタスク（認識と生成）ごとに専用のアーキテクチャを使用。
   - 例として、拡散モデルを用いる生成タスクでは高い性能を達成しますが、認識タスクとの統合が難しい。

2. **計算コストとスケーラビリティ**  
   - 高解像度画像を処理する際、トークンシーケンスの長さが増大し、計算コストが著しく上昇。

3. **汎用性の低さ**  
   - 特定のタスクやデータセットに最適化され、異なるタスクへの適応が困難。

---

### 本研究の目的
SynerGen-VLは、これらの課題を克服するために次の目標を掲げています：
1. **統一された設計**  
   - 画像認識と生成を1つのフレームワークで処理可能にする統合モデル。
2. **効率的な処理**  
   - トークン折りたたみ (Token Folding) を活用し、計算効率を向上。
3. **視覚情報の統合**  
   - 視覚専門家 (Vision Experts) による視覚的特徴の強化。

---

## 提案手法の詳細

### トークン折りたたみ (Token Folding)
トークン折りたたみは、画像トークンを圧縮して効率的に処理する技術です。

#### **仕組み**
- 高解像度画像の特徴を $m \times n$ のパッチに分割し、トークンを圧縮。
- 圧縮されたトークンに位置埋め込みを加えることで空間情報を保持。
- 圧縮後のシーケンス長を短縮し、計算負荷を削減。

数式で表現すると以下の通り：
$$ x_V = \text{MLP}(\text{TokenFold}(\text{TokenEmbed}(I) + PE)) $$

#### **利点**
1. トレーニングコストを大幅に削減。
2. 高解像度画像に対するスケーラビリティを向上。

---

### 視覚専門家 (Vision Experts)
視覚専門家モジュールは、視覚情報をLLMに統合するための鍵となる技術です。

#### **設計**
- 視覚的特徴を抽出する専門家ネットワークを導入。
- テキストトークンと視覚トークンを分離して処理し、干渉を最小化。

#### **適応的学習**
- 視覚タスクと言語タスクに応じた柔軟な学習が可能。

---

## 実験の概要と結果

### 実験設定
1. **データセット**
   - 画像認識: DocVQA、OCRBench。
   - 画像生成: MSCOCO、MJHQ。

2. **評価指標**
   - 認識タスク: 精度 (Accuracy)。
   - 生成タスク: FIDスコア。

---

### 主な結果
1. **画像認識性能**
   - DocVQA: 提案手法が85.4%の精度を達成。
   - 従来モデル（Emu3）は83.2%。

2. **画像生成性能**
   - FIDスコア:
     - SynerGen-VL: 9.7。
     - 従来モデル（Emu3）: 11.4。

3. **計算効率**
   - メモリ使用量を25%削減し、トレーニング速度が向上。

---

### アブレーションスタディ
- トークン折りたたみを無効化した場合、認識性能が12%低下。
- 視覚専門家モジュールを削除した場合、生成タスクのFIDスコアが13.5に悪化。

---

## 応用可能性と限界

### 応用可能性
- **医療分野**: 医療画像の診断補助や解析。
- **デジタルアーカイブ**: 高精度な画像保存と検索。
- **対話システム**: 視覚情報を活用したインタラクション。

### 限界
- 高解像度生成タスクではさらなる調整が必要。
- トークン圧縮による情報損失のリスク。

---

この記事が、AI研究や実務に携わる皆さんに新たな視点を提供できれば幸いです。ご意見やご質問がありましたら、ぜひコメント欄でお知らせください！
Reactの勉強を始めてから気づいた必要な事前知識

10日間ほどかけて、モダンどころかトラディショナルなWebも知らない状態から少しずつ勉強を進めて、ようやくReactについて`extends React.Component`だとか`render() { return ~}`だとか分かってきたところです。

活動を始める直前は「新しい言語を身につけるなら、その言語の教科書買えばいいんでしょ」と考えていたのですが、さまざまな方の「React習得ロードマップ」を見ると半分ぐらいの方が「まずはHTML＆CSSの基礎を」「あとJavaScriptを」と書いていました。

これに則って私も[Progate](https://prog-8.com/)さんで基礎を学んでからReact習得に挑んだのですが、 **マジでHTML&CSS、JavaScriptは前提知識として必須** でした。

「具体的にどういうところがよ」を忘れないうちに書き出して、誰かのお役に立てばと思います。

# 事前に勉強しておいて良かった

## HTML編

ReactではHTMLのコンテンツを動的に生成します。
このとき使う言語(？)が`JSX`なのですが、書き方のルールは95%ぐらいHTMLと同じです。

そしておそらくReactの教科書においては **HTMLのタグとその効果を知っていることを前提で書かれていると思います。** というのが、いちいちそれを書いていたらその教科書はReactの教科書ではなくてHTMLの教科書になってしまうからです。

なおHTMLのタグの書き方がと95%似ているだけで、拡張されて可能になっていることがとても多いので勘違いされないように。

## CSS編

いまのところ私が触れたReactの学習においては直接CSSとの絡みはありません。
せいぜい`JSX`で追加する要素に対応したスタイルをあらかじめ用意しておくぐらいです。

しかしせっかくReactにより生成されたコンテンツが味気ないテキストだけだったり、平成初期のホームページのような内容だと達成感が得にくいと思います。

ある程度、基本となる装飾を知ってからReactの学習に挑むことで **Reactを勉強するときのモチベーションに繋がります** 。見た目って大事だよね。

## JavaScript

JavaScript自体、そんなに難しい言語ではないので何かしらプログラミングされた方であればノー勉強でもだいたい分かってしまうものです。私も`Bash`と`Perl`しかやったことありませんでしが、ほぼ8割は読めますし、残り2割は調べればすぐ見つけられます。`Python`の方が、よっぽどクセが強いです。

実はJavaScriptを先に勉強することで身につけるべきことは **オブジェクト指向とそれに関連するキーワードです** 。このキーワード、具体的には以下のあたりです。

- 継承
- カプセル化
- コンストラクタ
- プロパティとメソッド

Reactを使おうと思ったら、3行目ぐらいに以下を書きます(継承です)。

```js
class udon expands React.Component {
```

# 事前に勉強しておきゃ良かった or もっと勉強すりゃよかった

まだ間に合う…！

## CSS

位置関係。以下のあたりがごっちゃごちゃ

- width
- padding
- margin
- background-size: cover
- xxxx-align
- display: inline-block
- float

このあたりは1度課題を解いて「ふーん」で終わらせるのは無理がある。
**いくつも例題を解いて体に染み込ませないと覚えられる自身がない。**

残念ながらそういった教材は無い気がするがどうだ？
かろうじてProgateのスマホアプリはいくらか近いものがある。
しかし回答がすべて選択肢なので身につくか？と言われると物足りない。

[Python実践データ分析100本ノック 第2版 （単行本）](https://www.shuwasystem.co.jp/book/9784798067278.html)みたいな、とにかく量をこなして体に叩き込む機会が得られるのいいのだが。

## まだCSS

あと4日目に書いた「[CSSのプロパティを探索してみる](https://qiita.com/Ki2neudon/items/92e0af5d66e86877c2d3)」。これはもっと進めた方が良い。とにかく知らないと何もできない。

## JavaScript

冒頭では偉そうに書いたものの、自分がまさに事前のJavaScriptの学習を途中で投げ出して、継承だとかそういうのをわからずに都度Reactを学びながら出てきた単語をググっていた。
これが非常に効率が悪い。いまさらながらもう一度戻って勉強しなおしているところである。

あと兎に角、[書き方が難しい](https://qiita.com/Ki2neudon/items/3a2897ef810109f70a64)。数をこなして慣れてないと`{}`とか`()`とかワケワカメになる。学んで、自分でも書き出して覚えて、自分用チートシートを作っておくことをおすすめしたい。

# で、何すればいいの

冒頭にも書いたけど、基礎を学ぶために[Progate](https://prog-8.com/)さんを使うのはおすすめ。
よくTechブログである、初学者と講師が「○○をしたいんです！」「では○○について学んでいきましょう」という会話に拒絶反応が無い限りはオススメしたい。あったとしても、ちゃんと考えられた会話になっていて決してページ稼ぎにはなっていないので安心して取り掛かって欲しい。

ただしReactについてはバージョンが古いため、HTML&CSS, JavaScript(ES6)に限ったコンテンツだと割り切って欲しい。
エンジニア歴20年にして初めての転職　やったこと、やってよかったこと

# はじめに
この記事は[転職活動して気づいた「これをやっていれば.../やってよかった」をシェアしよう by 転職ドラフト Advent Calendar 2024](https://qiita.com/advent-calendar/2024/engineering-careers-2)の14日目の記事です。

# 概要
キャリア面談をやってもらいましょう。転職経験がない方、久しぶりな方は特に。

# 転職スペックあれこれ

20年前にエンジニアとして就職した会社を辞め、24年7月に転職しました。転職を考え始めたのは23年の夏くらいで、転職活動の結果、在籍していた会社に残る選択肢も持ちながら転職活動を行いました。

経験としはいろんなプロジェクトで用件定義から実装までやったことがあります。また、管理職もやっていたのでマネージメントの経験や採用の経験もありました。

# やってよかったこと

Fがつく某転職サービスに登録しており、本気で転職を考えた際に、キャリア面談サービスを使わせていだき、キャリアの壁打ちをしてもらいました。キャリア面談では今の年収が世の中から見てどうなのかや、ソフトスキルの言語化などをしていただきました。自身の強みに気づいたり、弱いところもわかって非常に有用でした。言葉では伝えづらいので、劇的に変わった業務経歴書のお話を共有します。

## 業務経歴書のBefore

キャリア面談前は、業務経歴書に以下のようなことを書いてました。

 * プロジェクトでの役割
 * プロジェクトの参画人数
 * プロジェクトでの使用技術（言語やフレームワークなど）
 * プロジェクトへの参画年数

なぜこの項目を書いていたかというと、自分が採用する際によく見たフォーマットだからです。このフォーマットで見て、気になる経験があった方と面談を行っていました。

## 業務経歴書のAfter

面談時に、各プロジェクトでどんな工夫をしたかをヒアリングいただき、以下を書くようにしました。

 * プロジェクトで何を任されていたか
 * プロジェクトで工夫したこと・失敗したこと
 * プロジェクトでの使用技術（言語やフレームワークなど）

特に工夫していた点は、朝会での工夫や採用での工夫など、細かくヒアリングしていただいたおかげで詳細な言語化ができました。質問の仕方も丁寧で、良いことも悪いこともスムーズにお話しすることができました。

改めてふりかえってみると、企業から見る場合に20年エンジニアをやってきた人に期待することは、工夫しことが自社でも活かせるかなので、どのような工夫をしていたかを載せるのは非常に重要です。失敗したことはネガティブに感じるかもしれませんが、そこから何を学んだかは成長し続ける人材であるために必要です。

## その他

キャリア面談の他に、採用面談の後のふりかえりもお付き合いいただきました。自分の発言のよかったこと、悪かったことが明確になるので、次の面談に繋げやすかったです。

## 結果

結果は明確に出ていて、スカウトの件数が2倍くらいになりました。スカウトをもらうことが目的ではないですが、「ここだ！」と思える会社に出会いやすくなったと思います。

現在は良い出会いに恵まれて転職し、楽しくやっております。本当にありがとうございます。

キャリア面談がなかったら、「ここだ！」と思える会社とは出会えず、転職していなかったことでしょう。

# おわりに

転職を迷っている方に、キャリア面談お勧めしたいと思ってます。デメリットは正直感じなかったので思い切って相談してみると良いと思います。

明日の[転職活動して気づいた「これをやっていれば.../やってよかった」をシェアしよう by 転職ドラフト Advent Calendar 2024](https://qiita.com/advent-calendar/2024/engineering-careers-2)は[@tomada](https://qiita.com/tomada)さんです。
フロッピーのコピープロテクト技術

# フロッピーの基礎
## フロッピーとは
磁性体を用いた記録媒体で、容量は1枚当たり約1MB。CDとは違い何度でも書き直すことが可能である。

## フロッピーの種類
広く流通したものとして、３種類あげられる。
・8インチ
・5.25インチ
・3.5インチ
これらの数字は、フロッピーの対角線の長さではなく、中身のまるい磁性体の直径を表している。
また、サイズが大きければ大きいほど容量もデカいかというと、そうではない。後述する「規格」にもよるが、サイズによる容量の差異は無いと考えてよい。

## フロッピーの規格
それぞれのサイズに対し、以下の規格が存在してした。なお、ここでは広く流通していたものに限定している。
### 8インチ
片面単密度(1S)：約240kB
両面単密度(2S)：約500kB
両面倍密度(2D)：約1.2MB
### 5.25インチ
片面単密度(1S)：約80kB
片面倍密度(1D)：約160kB
両面倍密度(2D)：約320kB
両面倍密度倍トラック(2DD)：約640kB
両面高密度(2HD)：約1.2MB
### 3.5インチ
片面倍密度(1D)：約160kB
両面倍密度(2D)：約320kB
両面倍密度倍トラック(2DD)：約640kB
両面高密度(2HD)：約1.2MB

## フォーマット形式一覧
興味があればこれ読んでみてください。いっぱいかいてあります。
http://hamlin.html.xdomain.jp/FDD/FDSPEC/FDSPEC.htm
セクタとかトラックとかの言い回し分からない方は以下を参照。
https://middleriver.chagasi.com/electronics/fddemu.html

# コピープロテクトを突破したい
お待たせしました。
前述の通り、フロッピーは書き換え自由なため、ゲームなどをこの媒体で配布していた当時は、いかにユーザーにコピーさせないかという工夫が数多くなされた。
機種(というより、コンピュータに内蔵されたフロッピーディスクコントローラ：FDCの種類)によって手法は様々である。この記事では、一部のみをとりあげるので、興味をもったらぜひ自身で調べてみてほしい。
### 特定のトラックだけ変なフォーマットにする。
普通にコピーしようとすると、当然エラーになるが、トラック毎にフォーマットを調べなおすようなコピーツールで簡単に突破できる。
### 特定のシリンダを未フォーマットにしておく。
ある場所だけフォーマットをしないでおく。未フォーマットの場所をよむと、毎回ランダムな値が返ってくる。これをソフト側で検出しようというものである。
これは厄介で、専用のツールだけではどうにもならない。なぜなら、1度でも通常フォーマットをしたディスクは、すべてのセクタに何かしらの値がかかれているからだ。これは、一度磁石などで物理的にディスク全体をまっさらにしたあと、その部分だけ書き込みを行わないなどということができるコピーツールで書き込む必要があった。

### CRCエラー
フロッピーには、セクタごとにチェックサムのようなものが存在している。それを、おかしい値にしておくという手法である。これはFDC側で勝手に正しい値が書かれてしまうのでソフトでどうにかできるものではない。
これをコピーするには、事前にCRC部分がその値になるようなデータを書き込んだ後、本来のデータ部分を書き込む際に、データだけ書き込んだタイミングでFDCにリセット信号を送り書き込みをやめてしまうというコピー方法がとられた。考えた人ほんとに頭いい。
### 時分秒プロテクト
MB8876という富士通のFDCが搭載されたパソコン向けのプロテクトである。これは、このICでF5,F6,F7という値が書き込めない仕様（詳細は省略。気になるなら調べてね）を逆手にとり、それをFDに埋め込んだものだ。
時分秒の名前の由来は、これらの値がキャラクタコードの時分秒にあたるから。
これは別のICが乗ったパソコンでコピーすればいいのでラク。(NECのuPD765など)

### その他
Appleが出していた、AppleIIというパソコン。これはとっても面白い仕様で、FDCが存在せず、CPUがすべてを制御している。そのため、ヘッドやモーターの動きまでソフトウェア側から制御できるようになっていた。
なので、この機種はたくさんの面白いプロテクトがあり、例えば

・フロッピーそのものが逆回転する
・通常のセクタとは微妙にずれた位置にセクタが置かれたトラックが存在
・読み取りヘッドが通常より早く動く
・わざと回転数を遅くして書き込んである

など。あまりにもおかしなプロテクトが多くて、他社製の互換ドライブでは使用できないものが存在したため、純正ドライブの購入を強いられたパターンもあったのだとか。
EasyRef: 拡散モデルとMLLMが切り開く次世代の画像生成

# EasyRef: Omni-Generalized Group Image Reference for Diffusion Models via Multimodal LLM

最新の研究成果である「EasyRef: Omni-Generalized Group Image Reference for Diffusion Models via Multimodal LLM」をご紹介します。本研究は、複数参照画像とテキストプロンプトを組み合わせて、一貫性のある高品質な画像生成を実現する新たな方法論を提案しています。本記事では、EasyRefの背景、技術的詳細、実験結果、応用可能性、そして将来的な課題について徹底的に解説します。

---

### 論文情報
- **タイトル**: EasyRef: Omni-Generalized Group Image Reference for Diffusion Models via Multimodal LLM
- **リンク**: [https://easyref-gen.github.io/](https://easyref-gen.github.io/)
- **発表日**: 2024年12月12日
- **著者**: Zhuofan Zong, Dongzhi Jiang, Bingqi Ma, Guanglu Song, Hao Shao, Dazhong Shen, Yu Liu, Hongsheng Li
- **DOI**: 未記載

---

## 背景と目的

### 拡散モデルとMLLMの進展
近年、拡散モデル（Diffusion Models）は、生成タスクにおける最先端技術として大きな注目を集めています。特に、テキスト条件付き画像生成において、高品質な生成能力が実証されています。しかし、以下の課題が依然として残っています：
1. **一貫性の欠如**: 複数参照画像間の視覚的特徴を統一することが難しく、生成結果にばらつきが生じる。
2. **計算リソースの負担**: 従来の手法では、特定のタスクに対する個別のファインチューニングが必要で、計算負荷が高い。
3. **汎用性の不足**: 未知のデータセットやドメインに対して、ゼロショットでの一般化性能が制限されている。

### EasyRefの目的
EasyRefは、これらの課題を解決するために設計されました。本手法の主な目標は以下の通りです：
- **一貫性の向上**: 複数参照画像とテキストプロンプトの間で一貫した視覚的特徴を抽出。
- **効率性の向上**: 高性能を維持しつつ、計算コストを削減。
- **ゼロショット汎用性**: 新たなドメインや未学習データセットへの適用を可能にする。

---

## 研究の焦点

### 1. MLLMの活用
EasyRefは、Multimodal Large Language Model (MLLM) を活用することで、複数参照画像の視覚的特徴とテキストプロンプトを統合的に処理します。このアプローチにより、従来の平均化に頼った単純な統合では得られなかった一貫性を実現しています。

### 2. 効率的な参照画像の集約
MLLMの最終層で学習可能なトークンを導入し、複数参照画像間の特徴を効率的に集約。これにより、計算コストを大幅に削減しながらも、高精度な結果を維持します。

### 3. 漸進的トレーニング手法
EasyRefでは、以下の段階を経てモデル性能を向上させています：
- **アライメント事前学習**: 大規模な画像-テキストペアを使用して、MLLMと拡散モデルの整合性を最適化。
- **単一参照ファインチューニング**: 単一画像条件での性能を向上させる微調整。
- **多参照ファインチューニング**: 複数画像間の一貫性を学習し、最終的な生成性能を高める。

---

## 実験の概要と結果

### 実験設定
- **データセット**:
  - LAION-5B: 高品質な画像-テキストペアを含む1,300万件のデータを使用。
  - MRBench: 複数参照画像生成の性能を評価するための新しいベンチマーク。
- **評価指標**:
  - **CLIP-I**: 参照画像間の視覚的類似性を定量化。
  - **DINO-I**: 画像特徴の一致度を評価。
  - **CLIP-T**: 生成画像とテキストプロンプトの整合性を評価。

### 実験結果の詳細
1. **CLIP-Iスコアの向上**:
   - EasyRefは、従来手法（例：IP-Adapter）を0.223ポイント上回り、一貫性の向上が実証されました。
2. **ゼロショット性能**:
   - 未知のドメインやデータセットに対しても高い性能を発揮。
3. **人間評価**:
   - 美的品質と参照画像の一致性において、EasyRefが最も高い評価を得ました。

---

## 技術的詳細

### 数式による説明
EasyRefの条件統合プロセスは以下の数式で表されます：
$$
X̂ = \text{Softmax} \left( \frac{QK^T}{\sqrt{d}} \right) V + \text{Softmax} \left( \frac{QK̂^T}{\sqrt{d}} \right) V̂
$$
ここで：
- $Q, K, V$: クロスアテンション層のクエリ、キー、バリュー。
- $K̂, V̂$: 参照画像条件の学習可能なトークン埋め込み。

このアプローチにより、参照画像間の情報が効果的に統合され、一貫性のある高品質な生成が可能になります。

---

## 応用可能性と課題

### 応用可能性
1. **広告業界**: ブランドイメージに基づいたカスタマイズ可能な広告制作。
2. **教育分野**: 一貫性のある視覚教材の自動生成。
3. **エンターテインメント**: 映画制作やゲーム開発における一貫性のあるキャラクター生成。

### 課題と将来展望
- **計算コスト**: 高性能なGPUが必要で、小規模環境での再現性に課題。
- **モデル依存性**: MLLMに依存しているため、他の生成モデルとの統合に限界がある。
- **汎用性の向上**: 医療や科学研究など、他分野への応用にはさらなる調整が必要。

---

## 結論

EasyRefは、複数参照画像とテキストプロンプトを用いた画像生成の新たな基準を打ち立てました。本研究は、従来の限界を克服し、高い一貫性と汎用性を備えた画像生成を実現しました。今後の研究では、計算効率の向上や新たな応用分野への展開が期待されます。

この記事が、皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、ぜひコメント欄にお寄せください。
プログラミングサークルに入って2年目になった

この記事は東京海洋大学NePPのAdvent Calendar 2024の14日目です🎄

## はじめに
はじめまして！私は今年大学2年生になった者です。
大学・サークルに入って2年目になったということで、これまでの振り返りを記事にまとめていきます。
自分が今後この記事を読み返して初心にかえったり、これからプログラミングを学ぼうかなと考えている方にとって少しでも参考になれればと思います。

## プログラミングとの出会い
私がはじめてプログラミングに興味を持ったのは中学3年生のときです。
中学校の朝の読書の時間で読んだ一冊の本がきっかけでした。
野崎まどさんの『know』というSF小説です。

この本を読むまで、「プログラミング」というものは知っていてもそれについて調べたことも学んだこともない状態で、pcを日常的に使うこともありませんでした。
そんな私にとってこの本は内容的にも言葉的にも難しかったです。
「アルゴリズム」「ソースコード」など、当時は全く意味を知らなかった言葉について調べながら読み進めていくうちに「プログラミングっていうのおもしろそうだな」と漠然と感じました。
この本に書いてあるようなことは、もしかしてプログラミングで将来実現することができるのかな、とも。
その時の私には「プログラミング」が魔法のツールのように思えました。

## プログラミング学習をはじめてから
そこからただ惹かれるままにプログラミングについて調べ、まずはpcを使えるようになろう！と思い、家にあった勉強用のごつめのノートパソコンでタイピングの練習から始めました。(笑)

中学3年生のときの誕生日プレゼントにはpythonについての本とHTML&CSSについての本をもらって、高校入学祝いにMacBook Airを買ってもらいました。(誕生日は1月なのでどちらもほとんど同じタイミングでもらいました！)
MacBook Airを選んだ理由は、なんとなくカッコよさそうだったからです！！w　WindowsとMacでは少し使い方などが違うことに気づいてからは少し後悔しました:sweat_smile:

MacBook Airを使うようになってからは、Swiftを少しいじってみたり、本を参考にしながらpythonを使ったり、HTML&CSSで簡易的なホームページを作ってみたり・・・
私の周りには、少しHTML&CSSをやっている人はいたのですが、他の言語でプログラミングをしている人やそれに興味がある人はいなかったので、分からないことがあれば自分で調べながら独学で勉強していました。
Progateも利用してゲーム感覚で他の言語に触れてみることもありました。

高校では大学進学コースのようなクラスにいたので、完全に空いた時間の趣味としてやっていました。

## 大学生になってから
受験が終わってからは、大学生になったら空いてる時間がこれまでよりもあるだろうからまたちゃんとプログラミングやっていこー、と思っていました。
サークルもあれば入ってみたいなとも思っていて、同じ学年の子が今のサークルに誘ってきてくれたときはすごくうれしかったです:blush:

大学生になってから、Windowsのノートパソコンとデスクトップpcを買ってもらったので、今はWindowsでプログラミングを学んでいます。
サークルでは、ハッカソンへの参加を何回かさせてもらっていて、人と一緒に何かをすることの楽しさを感じることができています。

## これから
来年には私も3年生になるので、人に見せられるようなものをどんどん作っていこうと思います。

最近は叔母に頼まれたHP作成をしていて、それに伴ってGoなどの新しい言語も学んでいます。
今年中にいったん完成させられるようにがんばるぞー！！:raised_hands:

## さいごに
今回の記事では、長々と私のプログラミングとの出会いから書かせていただきました。
いつかこの記事を読んだ人が（私も含め）プログラミングの楽しさに気づいたり、初心を思い返したりできたらいいな！と思います。
ここまで読んでいただきありがとうございました:relieved:
Torを使って匿名になる方法

## これは何?

複数のサーバを経由してインターネット上の活動を匿名化するTorについてまとめてみました。

:::note alert
Torはあくまで，インターネットの自由を守るためのものです。
犯罪や誹謗中傷に使用することは恥ずべき行為であります。
:::

---

## Torプロジェクトとはなにか

[Tor Project History](https://www.torproject.org/about/history/)をベースにNotebookLMにまとめてもらいました。

:::note info
Torプロジェクトは、1990年代後半に始まった匿名通信ソフトウェア「Tor」の開発・運営を行う非営利団体です。インターネット上のプライバシー保護と検閲回避を目的とし、世界中のボランティアによって支えられています。Torは、複数のサーバーを経由して通信を暗号化することで、利用者のオンライン活動を監視から守ります。近年は、スノーデン事件などを通じてその重要性が増し、世界中で数百万人の利用者がいます。 Torプロジェクトは、自由で開かれたインターネットへのアクセスを擁護し続けています。
:::

---

## Torに使われている技術: Proxyについて

TorはProxyとして動作し，複数のTor nodeを中継して対象にアクセスします。

### VPN vs Proxy

初心者はVPNとProxyを混同しがちなので概要レベルですが，違いを書いておきます。

- Virtual Private Networkの略。LAN外から仮想的にLAN内にいるのと同じ状態にするのが目的。
- アクセスログに残るIPアドレスは自分の外部ipアドレスではなく，VPNサーバーのipアドレスに変わる。
- 使用例: リモートワークをするために、自宅から会社のLAN内に入って作業する等
- フリーwifiを使う際にVPNをつなぐと安全とされる
    - 通信を解読されても，VPNと通信していることしかわからない

### proxy

- 代理でアクセスすることを目的としているため、自分のipアドレスを隠して通信ができる。
- アクセスログに残るIPアドレスは自分の外部IPアドレスではなく，proxyのIPアドレスに変わる。
- 基本的にHTTP通信で使われる。

---

## なぜTorは匿名化できるのか

簡潔に書くと，海外かつ，複数のサイトを経由することで開示請求が困難になるためである。
(逆に言えば，技術的には発信者の特定は不可能ではない)

### 例: 誹謗中傷をした人を訴える場合

誹謗中傷をしたユーザを特定するためには以下のようなフローになる。

1. 掲示板等で誹謗中傷されているのを見つける。
2. 誹謗中傷を行なったユーザのIPアドレスを掲示板に開示してもらう。※メールアドレスや携帯電話番号から個人を特定できない場合を想定している
3. IPアドレスからどのプロバイダの回線を使っているか調べる。
4. プロバイダから該当するIPアドレスを使っている契約者の契約情報を聞き出し、誹謗中傷を行なったユーザを特定する。**誰が書き込みしたか判明!**

:::note info
プロバイダとは: OCN光やSo-net光のように回線(NTTやSo-net等の回線業者によって提供されている)とインターネットをつなげる接続事業者のこと。
:::

この際にTorを使うとどうなるのだろうか。

Torは3つのnode(中継地点)を通過した後，対象のサーバに到達するように設計されている。つまり，nodeを通過した分だけ追加で開示請求が必要になるのである。
特に中継に使うnodeが海外で運営されている場合，開示請求をお願いしても無視されたり，時間がかかることでログが消失してしまうこともある。

---

## 逆にTorを使っていても匿名になれないケース

### IP以外の個人情報から個人が特定できる

たとえば，クレジットカード決済に使うクレジットカードの名義や，二要素認証に使う携帯電話番号等から個人を特定できてしまう場合にはいかにIPアドレスを変えようと意味はない。

どこぞのド○コンガさんはライブ中に投稿が止まるとかそういうので疑惑の目を向けられていたなと

#### 対策

- 決済に自分のカードを使わない。個人に紐付かないwalletから仮想通貨を使うなど
- 二要素認証は使わない。必要な場合にはFIDO等が使えないか検討する
- なにかを書き込む場合には内容に注意する

### Nodeを敵対組織が運営しているパターン

Torは3つのnodeを通過後にアクセスするが，この中継地点が監視されている場合に身元が割れる可能性がある。

#### 対策

torrcの設定ファイルを編集して，中継に使うnodeを安全な国だけにすることである程度対策ができる。

```
ExcludeNodes {jp}
```

---

## 防御側の視点Torに対する対策

一番簡単なのはExit Node(中継に使用するNodeの一番最後)のIPアドレスをブロックすることである。
Exit Nodeの一覧は公開されているので一覧のリストは簡単に作成できる。

```shell
curl https://check.torproject.org/exit-addresses | grep ExitAddress | cud -d '  ' -f2
```

---

## TorとVPNの併用でTorのExit Nodeのブロックを突破する

TorとVPNを併用する方法には
- Tor over VPN
- VPN over Tor
の2種類がある。
![ToroverVPN.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/5c87fc5d-f963-ea0c-1b77-9b61fccf46fb.png)
![VPNoverTor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/b64af1a1-f54a-6816-71e5-314a9ddf2afd.png)

このうち，有効なのはVPN over Torである。
なぜなら，TorのExit Nodeを出た後，VPNを使うのでアクセスするサイトからはVPN経由でのアクセスに見えるからだ。

実現するには，仮想マシンを使う方法が最も簡単であると思われる。

1. Whonix Gateway(Torによるインターネット接続環境を提供)の仮想マシンを用意する
2. 別の仮想マシンを作り(e.g. Ubuntu)内部ネットワークを変更して，Whonix Gatewayを指定する
3. ホストコンピュータでVPNを使用する。

これにより，VPNを使用する前にTorに接続されるので，VPN over Torが実現できる。

---

## Torを使う方法

最後にTorを使う方法についでまとめておく

- Tor Browserを使う
- torsocksを使う(cli)
- OnionShare: Tor経由でのファイルの交換等できるソフト
- Tails: 全通信がTor経由になるOSで，シャットダウンするとデータが初期化される。(最強)
生成AI業界カオスマップ

11月に入り界隈でアドベントカレンダーというワードが飛び交うようになった。

<img width="80" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/51dcfbf7-2622-3eaf-5154-068362d44f67.png">
アドベントカレンダー？何やろこれ  

（ポチッ）  
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/9229ce52-9db8-80bb-e869-a18e46c95185.png">

技術記事なんかい！アドベントカレンダーちゅうたらコレやろがい！

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/ab864097-87af-9de5-a388-159c1ca598ef.png">  

というわけでアドベントカレンダー記事を書くことになったが何を書けば良いかわからない。
こういう時はハッカーに相談だ！
<br/>
<img width="80" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/b414e988-8538-208a-3acf-7ca54f516b16.png">業界カオスマップとか書いたらいいじゃね？
<br/>
<img width="80" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/51dcfbf7-2622-3eaf-5154-068362d44f67.png">おかのした
<br/>
というわけで3月頃から生成AI界隈に参入した私の独断と偏見による業界カオスマップがこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/c16b97dd-18f2-f8f0-4499-df08ed7d3b2e.png)



ほぼ全員メインの活動がXで、サブでYoutubeやってる人もいる、というくらいなのが昨今のSNS社会としては珍しい特徴だと思う。インスタとTiktokの存在を感じない。

もっといろんなタレントが入り乱れて盛り上がってもいいんじゃないかな？と思うけど目立つ人が決まってきているのは日本で企業がtoCで売りたいプロダクトが殆ど無くて広告宣伝費がSNSに落ちないからか。

<br/><br/>
かくいう私はどのクラスタなん？と尋ねられると・・・・
<br/>
<br/>
ここである

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/43a51bd3-7a8c-c7af-fc8a-4371ef4f0432.png">
<br/>
<br/>
気になるね！
<br/>
<br/>
<br/>
<br/>
どう終わればいいか分からないからグラビアで締めます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3961618/d9b91d92-e893-fbd4-a914-46dcb6964fe5.png)
スクラムほぼ未経験の自分がスクラムマスターとしてチームに参加してみた

# はじめに
この記事では、スクラムをほぼ未経験で始めた自分が、スクラムマスターとしてすでにスクラムがうまく機能しているチームに参加した体験をお伝えします。何をやってきたのか、何を感じたのかをシェアできればと思います。

# スクラムほぼ未経験からのスタート
「ほぼ未経験」と書いた理由は、実は前のチームでもスクラムチームで開発者（10ヶ月）→スクラムマスター（2ヶ月）として経験があったからです。とはいえ、当時はチーム全体で基本的なアジャイルやスクラムの理解が足りていなかったので、スクラムっぽいことをしていたものの、実際にはスクラムではなかったかなと思います。だから、既にスクラムがうまく機能しているチームにスクラムマスターとして入るのは、かなりドキドキしました。

# チームに参加する前に読んだもの
- [アジャイルソフトウェア開発宣言](https://agilemanifesto.org/iso/ja/manifesto.html)
    - スクラムはアジャイル開発のフレームワークなので、まずはその基本的な理解がするために。
- [スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)
    - スクラムの基本的なフレームワークを把握するために。
- [SCRUM BOOT CAMP THE BOOK スクラムチームではじめるアジャイル開発](https://www.amazon.co.jp/dp/B086GBXRN6?ref=cm_sw_r_ffobk_cp_ud_dp_48W0PF61S0NA0VZE9Z1H&ref_=cm_sw_r_ffobk_cp_ud_dp_48W0PF61S0NA0VZE9Z1H&social_share=cm_sw_r_ffobk_cp_ud_dp_48W0PF61S0NA0VZE9Z1H&skipTwisterOG=1&bestFormat=true)
    - 実際にスクラムを導入しようとする動きがあったので、こちらは課題本として指定されました。どう進めるべきかイメージが湧きやすくて役立ちました。 


# チームのスクラムイベントついて
うちのチームで実施しているイベントと、そのタイムボックスは以下の通りです。
- スプリント：1週間
- スプリントプランニング：2時間
- デイリースクラム：15分
- スプリントレビュー：1時間
- スプリントレトロスペクティブ：1時間
- リファインメント：1時間

スプリントが1週間なので、スクラムガイドに書いてある各イベントのタイムボックスも少し調整してます。それぞれのイベントの目的は、基本的にスクラムガイドに沿った形です。

特に、スクラムガイドには載っていないけれど、うちのチームで実施しているのは「リファインメント」です。これは、PBI（プロダクトバックログアイテム）がもっと小さく、具体的に分割・定義されるようにするための活動です。

リリースは、スプリントレビューを終えた後、1スプリント分の成果物をリリースしています。

# スクラムがうまく機能していると思うポイント
うちのチームでうまくスクラムが機能しているなと思うポイントは、次の通りです。
- スプリントが定期的に終了し、目標が達成されている
    - 目標達成率は平均95.7%！しっかりとゴールに向かって進んでいる感じがします。  
- プロダクトオーナーとの連携がうまくいっている
    - 必要に応じてPBIの調整がスムーズに行われていて、コミュニケーションも密にできています。
- 自己組織化されている  
    - 各メンバーが自分でタスクを取っていったり、時にはペアプロなどしながら連携してタスクを進めたりしています。  
- 定期的な改善が行われている
    - 技術的負債を溜めないようにリファクタリングを進めたり、問題点を共有して改善活動をしています。 

うまくいっている理由を考えてみると、やっぱり「コミュニケーションが密で、協力し合っていること」が大きいなと感じます。それに加えて、チームの行動指針に掲げている「圧倒的な当事者意識を持つこと」ができているのもポイントかなと思っています。

# 慣れない中で自分がやってみたこと
チームに参加してから1ヶ月ちょっと経った頃、いくつかのイベントで感じた課題を改善してみました。
### 課題①：スプリントレビューで「このスプリントで提供する価値が見えづらい」とステークホルダーからフィードバックをもらった
対応：レビューのフォーマットを価値ベースで伝わるように改善
効果：ステークホルダーとの期待値のズレがなくなり、納得感のあるレビューができるようになりました。

### 課題②：スプリントレトロスペクティブでKPTAの「Try」や「Action」の話し合いの時間が足りない
対応：アジェンダを見直して、時間配分を調整。特に注力したい問題を選んで深掘りするようにしました。
効果：タイムボックスを守りつつ、必要な議論を深掘りできるようになりました（まだ完全ではないですが）。


# 今後の課題
正直なところ、自分はまだスクラムの深い理解には到達していないので、まずは「スクラムの理解と実践力」をもっと深めたいと思っています。それと同時に「ファシリテーションスキル」を磨き、チームでの会話がもっと効果的になるようにしたいですね。

最初は自信がなくて不安だったけど、スクラムを実践するうちに少しずつ成長を実感できています。これからもチームと一緒により良い成果を出せるように、スクラムマスターとして自分ができる支援を考え、改善を続けていきたいです。


# 最後に
もしスクラムを始めるなら、まずはチーム全体でアジャイルソフトウェア開発宣言やスクラムガイドを読んで、スクラムの理論をしっかり理解することが大切だと思います。軸はブレずに、完璧を目指すのではなく、小さな改善を積み重ねていくことが重要かなと思います。
データベースを吹っ飛ばした話


# はじめに  
この記事は、「[本番環境などでやらかしちゃった人 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/yarakashi-production)」の15日目の記事です。10年以上前にグループウェアのデータベースを破損してしまった体験を共有させて頂きます。


# 当時の状況

- **職場環境**：中小企業(インフラ担当は私のみ)
- **業務内容**：PCやネットワーク全般
- **システム状況**：
  - 社内運用のグループウェア（OS：Windows Server）
  - バージョンアップは不定期
  - 物理サーバ運用(仮想化・クラウド未導入)

# アップデートが引き起こす「罠」  

## **軽い気持ちの計画が命取りに**  
グループウェアの新機能を知らせるメールに心が躍り、「試してみたい！」という気持ちが高まりました。しかし、すぐの実施は危険だと判断し、翌週末に作業を計画。

## **休日のアップデート作業が始まる**  
休日出勤して、グループウェアのアップデート作業を開始。リモートデスクトップを使いながら手順書通りにインストーラを実行します。順調に進んでいるように見えましたが、3時間後にインストーラの進捗表示画面が消え、状況が不明に。さらに3時間ほど待ってみた後、焦りからプロセスを強制終了した結果、グループウェア全体が使用不能に…。

## **誰にも頼れない現実**  
もちろん保守契約していますのでサポート内容を確認しましたが、土日対応の窓口がなく、相談相手もいない状態。結局、自力での復旧を試みるしかありませんでした。

# バックアップに頼る「復旧作戦」  
## **NAS頼みのバックアップに潜む罠**  
グループウェアのバックアップは簡易的なファイルコピー方式でした。復元作業を開始しましたが、復元完了予定が7時間とのこと。焦燥感に苛まれながら作業を進めました。

## **7時間後の絶望**  
復元が完了してもMySQLが正常に起動せず。グループウェアは依然として使用不能のまま。
しかも、トラブルによって動揺しているため、問題点を冷静に判断できていなかったと思います。
リストア作業の事前検証の重要性を実感しました。

# トラブルから学ぶ「教訓」  

## **なぜ失敗したのか？**  
1. リリース直後のアップデートを実施  
2. データベースのテーブル変換に必要な時間を想定していなかった  
3. バックアップ体制が不十分だった

## **アップデート前に考慮すべきこと**  
- バックアップからのリストアを事前に検証  
- リストア手順書を作成する
- ロールバックポイントを考えておく
- トラブル時に相談できるよう一人で作業しない
- リリース直後のアップデートを避ける  
- 可能ならテスト環境を用意して、事前に問題ないか検証する

## **再発防止の対策**
環境によりけりですが以下のいずれかの対策を実施するよう心がけてます。
1. クラウド移行  
2. 仮想化環境でスナップショットバックアップを取る  
3. 物理サーバ運用なら、サーバ更新時にバックアップ・リストア検証を実施 

# トラブルの顛末
グループウェアサーバーを新規構築し、半壊状態のMySQLからなんとかエクスポートで一部データを取り出すことができました。もちろん、それでも社内に多大な迷惑をかけ、謝り倒す状況となりました。

# あとがき
ここまで読んでいただきありがとうございました。
なにかのお役に立てば幸いです。
改正メルカリ震度階級と最大速度との式を求めた(v2)

この記事は[防災アプリ開発 Advent Calendar 2024](https://adventar.org/calendars/9939) 5日目の記事です。
過ぎてますが空いてて悲しいので(?)雑ですが入れときます。

←(4): [2024年版 KEVi の設計(前半)](https://blog.ingen084.net/posts/2024-12-04-kevi-architecture) (ingen084さん)
→(6): []()

---

以前改正メルカリ震度階級から最大速度を求めて気象庁震度との対応表を作りました。

https://qiita.com/Ichihai1415/items/2e14fc2356ec8e140291

作成してからしばらく経ったので能登半島地震を含めたいくつかの地震を含め再検討することにしました。


当時は対数目盛を使ってなかったので今回は使います(普通に知らなかった)。
またいくつか顕著な地震(2011年からの概ねMMI8以上またはM8以上などのうちStationListに観測点のものがあるもの)のStationListをごにょごにょして頑張って表示したものがこれです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/d19ea166-2c3d-bdb4-4127-3115ea33f83f.png)
(すでに求めた値(`cal`)がありますが気にしないでください)
それぞれの地震は https://earthquake.usgs.gov/earthquakes/eventpage/ の後に以下のIDを付け加えれば開けます。
[ `usp000huvq`, `official20110311054624120_30`, `usp000j9r`, `usc000nzvd`, `us20002926`, `us20003k7a`, `us20005iis`, `us1000778i`, `us2000h8ty`, `ci38457511`, `us7000i90q`, `us6000jllz`, `us6000jlqa`, `us6000m0xl`, `us7000m9g4`, `nc75095651` ]


特に大きく外れたものはないので今回は先日の[カルフォルニア沖の地震](https://earthquake.usgs.gov/earthquakes/eventpage/nc75095651/executive)のみでやりました。
上の画像の`nc75095651`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/42438d8d-a208-c222-5e87-2574ea3d2cb6.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/d19ea166-2c3d-bdb4-4127-3115ea33f83f.png)
MMI2未満がほぼないですがまあ必要ないでしょう。±0.2あたりに収まっています(とはいえMMI→PGVは誤差範囲が広い)。

ついでにDesmosで調整した結果が以下の式です。
一応置いときます→https://www.desmos.com/calculator/nyy5wgdwz8

```math
{MMI=\left\{\begin{align}
3.418549265+0.6391\ln(PGV)\,\,\,\,\,
(PGV<3.37cm/s)\approx(MMI<4.195)\\
2.5263173455+1.3735\ln(PGV)\,\,\,\,\,
(PGV\ge3.37cm/s)\approx(MMI\ge4.195)\\
\end{align}\right\}
}
```
やたらと値が細かいのは関数の変化点でぴったりと合うようにしたためで特に意味はないです。ところでこの表記はあっているのだろうか。

以前のものはこれ。
```math
{MMI=\left\{\begin{align}
3.5+0.65\ln(PGV)\,\,\,\,\,
(PGV<4cm/s)\approx(MMI<4.4)\\
2.5+1.37\ln(PGV)\,\,\,\,\,
(PGV\ge4cm/s)\approx(MMI\ge4.4)\\
\end{align}\right\}
}
```

**結論:ほぼ変わってない！！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052941/63e64643-c07e-fcd1-6eda-62f7b10a93cc.png)
ファイル名に é を使った時の罠

# はじめに

Web サーバ上のスペイン語の文字 é (アクセント付き)を含むファイル名にアクセス出来なかった時のメモです。

# 前提知識

コンピュータで文字を扱う時には、文字に番号を割り当て、その番号を並べて文字列を表現します。その番号をコードポイントと呼びます。
さらにそのコードポイントをメモリに格納するバイナリ化の方式にも色々あって、このエントリでは UTF-8 前提で話します。

# Unicode の正規化形式

Unicode で"同じ"文字を表示する事のできるコードポイントが複数存在する事もあり、文字列検索等の同一判定に不便なので、複数ある場合に一定の基準に沿ってこっちのコードを使いましょうといった正規化形式があり、等価性と分解/合成コードの組み合わせで4つの形式が存在します。

- [https://ja.wikipedia.org/wiki/Unicode正規化](https://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96)

|  | Decomposition(分解) | Composition(合成)  |
|---|:-:|:-:|
| 正準等価性 |  NFD <br> (Normalization Form Canonical Decomposition) | NFC <br> (Normalization Form Canonical Composition)  |
| 互換等価性| NFKD <br>  (Normalization Form Compatibility Decomposition) | NFKC <br>  (Normalization Form Compatibility Composition) |

é を正準等価性で正規化する場合、 NFD の 65cc81(3バイト) と NFC の c3a9(2バイト) で、２通りあります。

65cc81 の方は e(65) とアクセント「 ́」(cc81) を並べて一つの文字とします。
c3a9 はずばり é そのものを表したコードです。

# 現象

macOS 上のスペイン語のファイル名を Web サーバにアップロードした際、そのファイル名でアクセスできる時とできない(404エラー)時がありました。

# 理由

macOS のファイル名は NFD なので é は 65cc81 の3バイトです。
これを rsync で Web サーバにあげた場合、NFD が維持される為、同じファイル名でアクセス出来ました。

その後で github.io を使おうとしたところ、Git は NFC なので、c3a9 の 2バイトに変換されてしまい、NFD の 65cc81 を使った文字だとアクセスが出来なかった。といった顛末です。

# 最後に

Unicode 正規化のもう少し詳しい解説は以下をどうぞ。

- https://www.m3tech.blog/entry/2023/03/23/173000

このくだりが参考になりました。ありがとうございます。

![スクリーンショット 2024-12-14 19.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1798/ffe4da41-ac43-41c3-3b24-31da64b58ec5.png)
PuppeteerでCookieを利用する

# はじめに
Puppeteerでログインが必要なWebサイトにアクセスしたい時、Cookieを利用する方法について説明します。
昨今は2段階認証が当たり前で、メール認証であればGmail APIと組み合わせて頑張ればPuppeteerからでも全自動でログイン可能ですが、実装の手間がありますし、それ以外の認証方法だと厳しいし、ということでCookieを使ってしまおうという流れです。

# Cookieの取得
Chrome拡張機能で簡単にCookie情報が取得できるので、それを活用します。
CookieをダウンロードできるChrome拡張機能はいくつかストアで公開されていますが、以下の事例のようなセキュリティ的な懸念もあるので自分で書いてしまいましょう。
https://qiita.com/rana_kualu/items/e50e33bbde229882da8d


以下のような実装で、簡単にCookieを取得することが可能です。
```
// "domain"で指定したドメインに該当するクッキーを取得
const cookies = await chrome.cookies.getAll({ domain });

// Puppeteer形式への変換処理
// PuppeteerのsetCookie形式: [{name, value, domain, path, expires, httpOnly, secure, sameSite}, ...]
const puppeteerCookies = cookies.map(c => {
  return {
    name: c.name,
    value: c.value,
    domain: c.domain,
    path: c.path,
    expires: c.expirationDate ? Math.floor(c.expirationDate) : 0,
    httpOnly: c.httpOnly,
    secure: c.secure,
    sameSite: c.sameSite === 'no_restriction' ? 'None' : 
              c.sameSite === 'lax' ? 'Lax' : 
              c.sameSite === 'strict' ? 'Strict' : 'None' 
  };
});
```

ダウンロード部分の実装
```
// JSON生成
const jsonStr = JSON.stringify(puppeteerCookies, null, 2);
const blob = new Blob([jsonStr], { type: 'application/json' });
const url = URL.createObjectURL(blob);

// ダウンロード用リンクを作成し、自動でクリック
const downloadLink = document.createElement('a');
downloadLink.href = url;
downloadLink.download = `${domain}_cookies.json`;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
URL.revokeObjectURL(url);
```

自作したChrome拡張機能を公開しています
https://github.com/ryotakurashiki/CookieExporter

Chrome拡張の公式ドキュメント
https://developer.chrome.com/docs/extensions/reference/api/cookies?hl=ja#method-get

# Puppeteerでの利用
```
const cookies = JSON.parse(fs.readFileSync('./cookies.json', 'utf-8'));
const browser = await puppeteer.launch();
await browser.setCookie(...cookies);
```

Puppeteerの公式ドキュメント
https://pptr.dev/guides/cookies

# おわりに
この方法で、ログインが必要なWebサイトにもPuppeteerからアクセスが可能になります。
当たり前ですがCookie情報にはセキュリティ上重要な情報が含まれているので、取り扱いには注意しましょう。
あなたの記事の画像にもaltを設定できるんだぜ！

# まとめ

:::note
記事に画像を添付したままだと、ファイル名が alt 属性に設定されるので、適切な内容に変更しましょう
:::

この記事でお伝えしたいことはこれだけです...!! では、詳細にいきます。

# 記事に画像を添付しただけだと、ファイル名が読み上げられる

例えば、画面キャプチャした画像をそのまま貼り付けると `![image.png](https://qiita.../...xxx.png)` のように変換されますよね？
このまま記事を公開すると、`<img src="https://qiita..." alt="image.png" .../>` の形で html 出力されるのです。
その結果、あなたの大事な記事の途中でスクリーンリーダーが`「イメージピーエヌジー」`と意味不明な読み上げをしてしまいます...!!

これを解決するために、以下の設定をしてみてはいかがでしょうか？

## Qiita の場合

画像を添付したら、`[]`の中身に適切な値を入力しましょう！

```diff
- ![image.png](https://qiita.../...xxx.png)
+ ![alt属性に設定したい内容に変更](https://qiita.../...xxx.png)
```

実際に、Qiita の記事作成ページで画像を添付したときを確認してみましょう。

### NG例

![括弧の中がオリジナルの画像名のままになっています](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/c1b73fca-7156-d35c-70ab-4bab12f61ab7.png)

### OK例

![括弧の中に画像の説明を書いています](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/4fe49b4d-20ad-4b37-5af2-ed54271ead52.png)

## Zenn の場合

画像を添付したら、`[]`の中身に適切な値を入力しましょう！

```diff
- ![](https://storage.../...xxx.png)
+ ![alt属性に設定したい内容に変更](https://storage.../...xxx.png)
```

実際に、Zenn の記事作成ページで画像を添付したときを確認してみましょう。

### NG例

![括弧の中が空欄のままになっています](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/b9da9dbc-8160-d8c2-9901-72606cb04f7a.png)

### OK例

![括弧の中に画像の説明を書いています](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/b63c8703-c1b1-475f-10fa-97e49a77c646.png)


## はてなブログの場合

写真をアップロードしたら、写真の詳細設定ダイアログで「画像にalt属性を指定する」にチェックをいれて入力してください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/b790da77-689d-44c4-7731-a5d527fcb29c.png" alt="はてなブログには上級者向けの設定項目としてalt属性の入力が用意されています" width="500" />

以上で画像に alt 属性を設定する方法の紹介を終わります。「なんだ、簡単じゃん！」と思っていただけたら嬉しいです。

# 注意点

alt 属性はあくまで画像の代替テキストです。もし画像が読み手・聞き手にとって有用な情報でないなら、空の値のままでも良いでしょう。

機械的に判断できるものではなく、コンテンツの文脈に沿って、健常者も視覚障害者も同レベルの理解が得られるように調整することを心がけたいなと思います。

# おわりに

なぜ、この記事を書いたか。

私は @shamokit さんに誘われ、アクセシビリティを学び始めました。勉強会では最初に[『見えにくい、読みにくい「困った！」を解決するデザイン』](https://komatta-design.studio.site/)の輪読会をして、 [WCAG](https://waic.jp/translations/WCAG22/)、[『モバイルアプリアクセシビリティ入門── iOS＋Androidのデザインと実装』](https://gihyo.jp/book/2024/978-4-297-14602-3) の輪読会をしています。

その中で、画像の alt 属性が適切でないと、視覚障害者の方が使うスクリーンリーダーでの読み上げで正しく内容を理解できないことを学びました。

そこで、実際に alt 属性は設定されているか確認したところ、特に個人制作の記事では意識して設定されているものが少ない印象を受けたので、この記事で啓蒙できたら良いなと思いました！

一方で、Chrome では alt 属性などのラベルがない画像の説明を補足してくれる機能を公開しているようです。日本語はまだ対応していないようですが、近い将来が楽しみですね。

https://support.google.com/chrome/answer/9311597


それでは皆さん、アドベントカレンダーを楽しんでください！

![サンタクロースが寝ている子供に笑顔でプレゼントを届けているハッピーな場面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134221/c32bf9be-9f16-2a36-ed2b-a847b2c2b8dc.png)
docuactions/cache を使って Docusaurus の build を高速化する


## はじめに

Meta社が管理する React ベースのドキュメント管理ツール Docusaurus 。
様々な機能があり簡単に導入できますが、 Build に時間がかかってしまいます。 GitHub Actions に ` docuactions/cache` の定義を1行追加するだけで、平均 30s 程高速化できたのでその紹介です。

## docuactions/cache について

docuactions/cache は `.docusaurus` 及び `node_modules/.cache` または`.yarn/.cache` を cache し build を高速化してくれます。

### docuactions/cache を導入する

README.md に記載されている通り、 `npm ci`, `npm install` 後に `docuactions/cache@v1` を追記してください。

```yml
name: Test

on:
  push:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci
      - uses: docuactions/cache@v1
      - run: npm run docusaurus build
```

上記設定を追加することで 私の環境下だと 平均 30s (早いときだと1 min) の改善が見られました。

## 最後に

今回は docuactions/cache を紹介しましたが Organization docuactions には cache 以外の便利な action が定義されています。

https://github.com/docuactions

気になる方は見てみてもよいでしょう。

## Ref

https://github.com/docuactions/cache

https://github.com/docuactions
ネットワークドライブへのタスクスケジューラからのバッチ処理

# 背景
NASの所定ディレクトリにエンコード対象のファイルを置き、エンコードサーバがそのフォルダを監視し、ファイルが存在したらエンコードを実施するというタスクをタスクスケジューラで実現しようとしたらハマったはなし。

# システム概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846192/81751374-b0d9-9f1b-b82f-d2023e285425.png)


# ハマったポイント
- call setではフォルダ内のファイル名が正しく取得できない。👇対応策として、遅延環境変数を使った。
    ```
    setlocal enabledelayedexpansion
    :: 入力ディレクトリ
    set INPUT_DIR=Z:\input
    :: 出力ディレクトリ
    set OUTPUT_DIR=Z:\output
      :
    for %%F in ("%INPUT_DIR%\*") do (
        :: ファイル名と拡張子を分解
        set "INPUT_FILE=%%F"
        set "BASENAME=%%~nF"
        set "OUTPUT_FILE=%OUTPUT_DIR%\!BASENAME!.mp4"
            :
    )
    ```
___
- ネットワークドライブを利用するとき、ローカルで実行するとすでに所定のドライブレターにアサイン済なので問題なく実行できるが、タスクスケジューラ越しだと、そのタイミングでのアサインが必要になる。👇が対応策。
    ```
    :: ネットワークドライブを解除（エラー無視）
    net use Z: /delete >nul 2>&1
    
    :: ネットワークドライブを再マウント
    net use Z: \\network\target_dir /user:username password
    ```
___
- これは単なる間抜けなハマりポイント。
バッチファイルの最後に"pause"を利用すると、タスクスケジューラ経由で実行されたcmd.exeがずっと実行されたまんまになるにも関わらずパフォーマンスモニタのプロセスに存在しない（わからなかっただけ？）になるので、意外となんで処理が終わらないのか理解できずハマってしまった。
【Linux】シェルスクリプトの基本文法を動かしながら学ぶ

## はじめに

シェルスクリプトは、LinuxやmacOSなどのUnix系OSでタスクを自動化するための強力なツールです。ファイル操作やシステム管理、ソフトウェアインストールなど、さまざまな処理を簡単に実行できます。この記事では、シェルスクリプトの基本的な文法と主要なコマンドを、実際に動作確認をしながら学んでいきます。

### シェルスクリプトとは？
シェルスクリプトは、シェル（コマンドラインインターフェース）を使って複数のコマンドを自動化するためのスクリプトです。シェルは、Unix系のオペレーティングシステムにおいて、ユーザーとOSの間でコマンドの入力と出力を処理するプログラムです。シェルスクリプトは、タスクを自動化するためにシェルに書かれる一連のコマンドです。

このチュートリアルでは、シェルスクリプトを使った基本的な操作を実際に試しながら学びます。

## シェルスクリプトの基本文法

### 1. シェルスクリプトの作成と実行

シェルスクリプトは、`.sh`という拡張子を持つファイルとして作成します。以下の手順で、シェルスクリプトを作成して実行してみましょう。

##### 1. テキストエディタを開いて、以下の内容を`myscript.sh`という名前で保存します。

```bash
#!/bin/bash
echo "Hello, World!"
```

- 最初の行`#!/bin/bash`は**シバン（Shebang）**と呼ばれ、スクリプトがどのシェルで実行されるべきかを指定します。ここではBashシェルを使用する事を指定しています。
- 次の行は、シェルに「Hello, World!」と出力させるコマンドです。

##### 2. 保存したスクリプトファイルを実行可能にするために、以下のコマンドを実行します。

```bash
chmod +x myscript.sh
```

##### 3. スクリプトを実行します。

```bash
./myscript.sh
```

このスクリプトを実行すると、ターミナルに`Hello, World!`と表示されるはずです。

### 2. 変数の使い方

シェルスクリプトでは、変数を使ってデータを格納したり、計算を行ったりできます。変数の代入や使用方法を確認しましょう。

#### 例1: 変数の代入と使用

```bash
#!/bin/bash
name="Alice"
echo "Hello, $name!"
```

- 変数は`変数名=value`という形式で代入します。
- 変数の値を参照するには`$`を使います。例えば、`$name`で変数`name`の値を取り出します。

このスクリプトを実行すると、次のように表示されます。

```
Hello, Alice!
```

#### 例2: 数値の演算

```bash
#!/bin/bash
a=10
b=5
sum=$((a + b))
echo "Sum: $sum"
```

- 数値の演算は`$((式))`の形式で行います。この例では、変数`a`と`b`の足し算を行い、その結果を変数`sum`に格納しています。

このスクリプトを実行すると、次のように表示されます。

```
Sum: 15
```

### 3. 条件分岐（if文）

シェルスクリプトでは、`if`文を使って条件に基づく処理を行うことができます。条件式は、通常`[ 条件式 ]`という形式で書きます。

#### 例: if文の使い方

```bash
#!/bin/bash
age=20

if [ $age -ge 18 ]; then
  echo "You are an adult."
else
  echo "You are a minor."
fi
```

- `-ge`は「greater than or equal to」の意味で、`$age`が18以上かどうかを判断しています。

このスクリプトを実行すると、次のように表示されます。

```
You are an adult.
```

#### 条件式演算子の例
- `-eq`: 等しい
- `-ne`: 等しくない
- `-gt`: より大きい
- `-ge`: 以上
- `-lt`: より小さい
- `-le`: 以下

### 4. ループ処理（for文、while文）

シェルスクリプトでは、`for`文や`while`文を使って繰り返し処理を行えます。

#### 例1: for文

```bash
#!/bin/bash
for i in {1..5}
do
  echo "Number: $i"
done
```

- `{1..5}`は1から5までの数字を順番に取り出して、`$i`に格納します。

このスクリプトを実行すると、次のように表示されます。

```
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
```

#### 例2: while文

```bash
#!/bin/bash
count=1
while [ $count -le 5 ]
do
  echo "Number: $count"
  ((count++))
done
```

- `while`文では、条件が真である限り繰り返し処理を行います。ここでは、`$count`が5以下の間、`count`を1ずつ増やして繰り返し表示します。

このスクリプトを実行すると、次のように表示されます。

```
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
```

### 5. 関数の定義と使用

シェルスクリプトでは、関数を定義して処理を分割することができます。関数は`function`キーワードを使って定義します。`function`キーワードは省略することもできます。

#### 例: 関数の定義と呼び出し

```bash
#!/bin/bash

func1() {
  echo "Hello, $1!"
}

function func2() {
  echo "Hi, $1!"
}

func1 "Alice"
func2 "Bob"
```

- 引数`$1`（関数に渡された最初の引数）を使ってメッセージを表示する関数です

このスクリプトを実行すると、次のように表示されます。

```
Hello, Alice!
Hi, Bob!
```

## おわりに

シェルスクリプトは非常に強力なツールであり、システム管理やタスクの自動化、複雑な操作を簡潔に記述することができます。この記事では、シェルスクリプトの基本的な文法と主要なコマンドを紹介しました。

- 変数の使用
- 条件分岐（if文）
- ループ処理（for文、while文）
- 関数の定義と使用

これらの基本的な文法を使いこなせるようになることで、シェルスクリプトを活用した自動化やシステム管理がより効率的に行えるようになります。ぜひ、実際に手を動かして試してみてください。