USB RFID カードリーダーから入力を読み取る。

2026/04/18 2:14

USB RFID カードリーダーから入力を読み取る。

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

本テキストは、外部の Python ライブラリを必要とせず、安価な RFID リーダーを専用アルファベット/数字入力デバイスに変えることを目的とした Golang ベースのアプリケーションについて記述しています。

EVIOCGRAB
を用いて排他的入力量取を行うことで、プログラムがディスプレイマネージャー(X や Wayland など)へキーイベントを転送するのをブロックし、キーボードストリームに対するアプリケーションの絶対的な制御を確保します。実装では、
/dev/input/by-id
内の一意なパス(例:
usb-something_Barcode_Reader-event-kbd
)をスキャンしてハードウェアを特定します。生入力量はカスタムの
keyMap
を通じて文字コードに変換され、
KEY_ENTER
イベント(コード 28)が発生するまで入力量をバッファリングし、その時点でバッファされたテキストが出力され、バッファがクリアされます。システムは
sys.Open
os.Open
syscall.Syscall
から返される戻り値を確認することでエラーを処理し、EOF または Ctrl-C で適切に終了するとともに、終了前に排他的アクセス(
EVIOCGRAB
を用いて
nil
)を明示的に解放します。このアプローチは、標準的な Golang 環境内での RFID インテグレーションに対して、Python ベースのツールへの軽量で依存関係のない代替手段を提供します。

本文

なぜわざわざこれをやるのか

自宅に安価な RFID レーダーが放置されていた。いつ、どのような理由で購入したか正確には覚えていない。 ソフトウェアのアイデアは持っていたものの、実際にデスクトップで必要になる状況になかったため、こうして公開することにした。

このデバイスを接続すると、通常のキーボードとして機能する。ただそこにあるだけで、カードまたは RFID トークンをスワイプすると、その入力が標準入力に書き込まれ、ターミナルや現在利用中のアプリケーションのいずれかに取り込まれる。 この機器を有効に使うためには、単一のアプリケーションからの入力のみをキャッチし、他の何らかの動作への不要なデータ送信(スパム)を防ぐよう工夫する必要があった。

名付け親

結局、私が求めた機能には正式名称があり、それは「EVIOCGRAB ioctl」であった。もちろん C プログラミングでは理にかなっているが、高階層のソフトウェアコンポーネントにとっては馴染みのない概念だ。インターネット上を探したところ、当然ながら Python で実装できる例が見つかった。 しかし、私は外部ライブラリへの依存を避けたい。インストールに必要な依存関係を毎回思い出さなければならないのは好ましくないからだ。 そのため、より高階層で堅牢な Golang のコードを実装することに決めた。

デバイスを検出するには、まず接続し、以下のコマンドを実行する必要がある:

find /dev/input/by-id

実装

とある例として、私のデバイスのパスが以下であると仮定する:

/dev/input/by-id/usb-something_Barcode_Reader-event-kbd

このコードは、他のアプリケーションに影響を及ぼすことなく、このデバイスの入力を独占的に読み取り表示するためのものとなる。

package main

import (
	"encoding/binary"
	"fmt"
	"os"
	"syscall"
	"unsafe"
)

// 入力イベントの構造体定義
type inputEvent struct {
	Sec   uint64
	Usec  uint64
	Type  uint16
	Code  uint16
	Value int32
}

const (
	// 独占アクセスを取得するための ioctl コマンド
	EVIOCGRAB = 0x40044590

	// イベント種別:キー入力
	EV_KEY    = 0x01
	// キーコード:Enter キー
	KEY_ENTER = 28
)

// キーボードスキャンコードから文字をマッピングした辞書
var keyMap = map[uint16]rune{
	2: '1', 3: '2', 4: '3', 5: '4', 6: '5',
	7: '6', 8: '7', 9: '8', 10: '9', 11: '0',
	16: 'Q', 17: 'W', 18: 'E', 19: 'R', 20: 'T',
	21: 'Y', 22: 'U', 23: 'I', 24: 'O', 25: 'P',
	30: 'A', 31: 'S', 32: 'D', 33: 'F', 34: 'G',
	35: 'H', 36: 'J', 37: 'K', 38: 'L',
	44: 'Z', 45: 'X', 46: 'C', 47: 'V', 48: 'B',
	49: 'N', 50: 'M',
}

func main() {
	// デバイスのパスを設定(コマンド引数で指定されれば上書き)
	devPath := "/dev/input/by-id/usb-something_Barcode_Reader-event-kbd"
	if len(os.Args) > 1 {
		devPath = os.Args[1]
	}

	f, err := os.Open(devPath)
	if err != nil {
		fmt.Fprintf(os.Stderr, "open %s: %v\n", devPath, err)
		os.Exit(1)
	}
	defer f.Close()

	// 独占アクセスを取得して、カーネルがイベントを X/Wayland などに転送するのを防ぐ
	if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), EVIOCGRAB, 1); errno != 0 {
		fmt.Fprintf(os.Stderr, "EVIOCGRAB: %v\n", errno)
		os.Exit(1)
	}

	fmt.Println("デバイスが読み込み完了しました。カードスキャンを待機中 (Ctrl-C で終了)")

	var card []rune // キャラクターを受け取るバッファ
	var ev inputEvent

	for {
		if err := binary.Read(f, binary.LittleEndian, &ev); err != nil {
			fmt.Fprintf(os.Stderr, "read: %v\n", err)
			break
		}

		// キー入力イベント(Value == 1)のみ処理
		if ev.Type != EV_KEY || ev.Value != 1 {
			continue
		}

		if ev.Code == KEY_ENTER {
			// RFID レーダーは各カード読み取り後に Enter を送信するため、ここで出力
			fmt.Printf("RFID 値: %s\n", string(card))
			// バッファをクリア
			card = card[:0]
			continue
		}

		if ch, ok := keyMap[ev.Code]; ok {
			card = append(card, ch)
		}
	}

	// 完了後、独占モードから解放(リソースの適切な開放)
	syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), EVIOCGRAB, uintptr(unsafe.Pointer(nil)))
}

もしこのわだかまりのある記述が興味深いと感じたら、The Post Cloud ML に参加するところをお勧めします。

同じ日のほかのニュース

一覧に戻る →

2026/04/19 23:14

**Vercel 2026 年 4 月 セキュリティインシデント**

## 日本語翻訳: 4 月 19 日と 26 日に、「ShinyHunters」と称する脅威アクターが Vercel のシステムへの不正侵入を行いデータを売却した旨を主張したが、Vercel はプラットフォーム上で Google Workspace のサードパーティ OAuth アプリケーションが乗っ取られ、それによる非認証アクセスが発生したことを公表しました。Vercel は自社の主要サービスには影響がないとし、この特定の統合を利用している顧客のうち限られた subset だけが暴露されたとしています。なお、窃取されたとされる資料には、ソースコード、従業員情報、NPM/GitHub トークン、データベース認証情報、内部デプロイメントアクセス鍵が含まれています。攻撃者はユーザー詳細を含む 580 レコードが入ったテキストファイルを公開し、200 万ドルの身代金要求を行いました。しかし、BleepingComputer などの独立研究者は、提供されたデータの真偽やスクリーンショットを検証しておらず、「ShinyHunters」ネットワークに関連する他のグループもこの特定の事件への関与を否定しています。Vercel はセキュリティ専門家と法執行機関と協力していることを確認しており、全てのユーザー(特に Google Workspace 管理者)に対し、潜在的なリスクを低減するため、直ちに機密情報をローテーションし、環境変数を再レビューし、乗っ取られた特定の OAuth ID のアクセス権を取り消すよう緊急性を帯びた警報を出しています。

2026/04/20 2:44

臭素の戦略的 chokepoint

## Japanese Translation: 不安定な停戦協定により、米国・イスラエル・イランが関与する状況が露見し、全球の半導体メモリサプライチェーンにおいて塩素を介した脆弱性が顕在化している。このリスクはヘリウム不足にしばしば覆いかぶさるものである。この依存度は深刻であり、韓国は世界の塩素需要の 97.5% をイスラエルから調達しており、その供給先は Dimima および Arad の戦闘地域からわずか 35 キロ以内にある。この原材料を転写する際に不可欠な水酸化ホウ素に変換するためには、大規模な精製インフラが必要であり、これについてはイスラエル以外では存在せず、既存の非イスラエルの生産者はすべて現在の顧客に割り当てられおり、新たなキャパシティを構築するには数年単位の時間がかかる。さらに、塩素は先端プロセスノードにおいて水酸化ホウ素に代わることはできず、必要なポリシリコン対酸化物選択比 100:1 を達成できず、基準を満たさないためである。 したがって、供給途絶が生じた場合、サムスン電子のような製造業者が高付加価値の AI メモリを優先して消費者向けエレクトロニクスに振り向けることになり、コスト増大を引き起こし、開発途上国における予算不足デバイスの問題(アフリカおよび南アジアにおける RAM の 4GB への downgrade など)や、商用チップに依存する軍事システムが優先順位を下げることに直面することになる。これらのリスクをさらに悪化させているのは、イスラエル港湾での寄港に関する戦争リスク保険料が 0.2% から 1.0% を超えるまで急騰しており、1 回あたりの航路あたり最大で 50 万ドル追加されることである。専門家は即時の原料の前方配置と、戦闘地域外の転写インフラに対する長期的資金調達を強く推奨し、全球のチップ製造における壊滅的なボトルネックを防ぐことを求めている。

2026/04/20 5:25

スイス当局は、Microsoft への依存度を低下させる意向を示している。

## Japanese Translation: スイスは、データセキュリティとデジタル主権を強化するため、Microsoft の製品から戦略的に離脱しています。最も重要な進展は、Microsoft のソフトウェアをオープンソースの代替品に置き換えることが実行可能であるという確認であり、その決定は財政的な必要性と地政学的な懸念の両方によって驱动されています。過去10年間にわたり、スイスの政府機関は Microsoft ライセンスだけで 10 億スイスフラン以上を支出しており、これは変革のための重要な財政的機会を生み出しています。さらに、アメリカの法律(クラウド法など)下におけるデータアクセスリスクや全球情勢の緊張の高まりから、高官たちは米国大手テック企業からの独立を求めるようになりました。 ドイツの成功した取り組み(シュレースヴィヒ=ホルシュタイン州を含む)と一致して、スイスは他の商用ソリューションに依存するのではなく、独自のオープンソースエコシステムを構築することを目指しています。前軍人指導者、元陸軍長官の Thomas Süssli 氏など、内部での代替ソフトウェアに対する過去の抵抗を克服するためにこの移行を加速させることに対して公的に支持を発信しました。この計画は、現在 Microsoft 365 を実行している 5 万 4,000 の行政ワークステーションの既存インフラを対象としています。オープンソースオプションへのシフトにより、コードの透明性と現地での管理が可能となるため、スイスはデータの主権を確保し、外国政府からの要求から守ることができます。その結果、外部の法的圧力に対する脆弱性を削減しつつ、コストを効果的に管理することができるとともに、目的を達成します。

USB RFID カードリーダーから入力を読み取る。 | そっか~ニュース