- 投稿日:2021-08-27T18:04:55+09:00
NFCpyにUIをつけたい
動機 リーダーの上に何か載せたら情報が表示されるものがつくりたい 例えば、薬を載せたら何に使うものか表示されたり、いろいろ使えそう 構成 簡単にできるかと思ったのですが、技量不足のため難儀しました 結果から話すと、UIとReaderを分け、watchdogでテキスト監視し変化があったら内容を読み取る方式にしました ダメだったのは、1ファイルで同じループ内に書くとどちらかが止まる、Scocket通信でも止まりました スクリプト 実行ファイルと同じ階層にtemp/nfc.txtがあり、 Reader -> nfc.txt 書き込み UI -> nfc.txt 監視 変化があれば内容を読む tag1,2,3であれば対応した静止画を表示 Reader nfcsimple.py import nfc import binascii import sys import os globalDirpath = os.path.dirname(__file__) txtpath = globalDirpath+'/temp/nfc.txt' def on_connect(tag): if tag.ndef: if tag.ndef.length > 0: print("NDEF Message:") for i, record in enumerate(tag.ndef.records): print(record.text) #tag1 with open(txtpath, mode='w') as f: f.write(record.text) return True def main(): while True: with nfc.ContactlessFrontend("usb") as clf: rdwr = { 'on-connect': on_connect } clf.connect(rdwr=rdwr) if __name__ == '__main__': main() UI ui.py import pygame import sys import os from pygame.locals import * from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler import threading imgBtlBG = pygame.image.load("img/bg.jpg") imgBtl1 = pygame.image.load("img/01.jpg") imgBtl2 = pygame.image.load("img/02.jpg") imgBtl3 = pygame.image.load("img/03.jpg") globalDirpath = os.path.dirname(__file__) dirpath = globalDirpath+'/temp/' class ChangeHandler(FileSystemEventHandler): isPlay = False NfcTag = "None" def StopOverlay(self): self.isPlay = False self.NfcTag = "None" def on_modified(self, event): filepath = event.src_path filename = os.path.basename(filepath) if filename=="nfc.txt": with open(filepath) as f: s = f.read() print(s) self.isPlay = True self.NfcTag = s t=threading.Timer(3,self.StopOverlay) t.start() event_handler = ChangeHandler() observer = Observer() observer.schedule(event_handler, dirpath, recursive=True) observer.start() def draw(bg): global isPlay,NfcTag if event_handler.isPlay: if event_handler.NfcTag=="tag1": bg.blit(imgBtl1, [0,0]) elif event_handler.NfcTag=="tag2": bg.blit(imgBtl2, [0,0]) elif event_handler.NfcTag=="tag3": bg.blit(imgBtl3, [0,0]) else: bg.blit(imgBtlBG, [0, 0]) def main(): pygame.init() pygame.display.set_caption("Title") flags = pygame.DOUBLEBUF | pygame.HWSURFACE | pygame.FULLSCREEN screen = pygame.display.set_mode((0, 0), flags) clock = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: observer.stop() observer.join() pygame.quit() sys.exit() draw(screen) pygame.display.update() clock.tick(30) if __name__ == '__main__': main() 実行 cd /projectdir python3 nfcsimple.py & python3 ui.py gif youtube 全パターン タグに書き込む場合、こちら
- 投稿日:2021-08-27T15:47:19+09:00
Vagrant + Dockerの環境でDocker Compose CLIを使う
背景 Laravel等のPHPウェブシステム開発ではDocker for Macが遅い問題があり、Vagrant上に立てたDockerコンテナで開発を行うことが多い。 その際に最近リリースされたDocker compose CLIを使いたい。 そこそこ詰まった&&ネット上にあまり情報がなかったのでメモ。 環境 macOS Catalina Virtual box 6.1 Vagrant 2.2.14 Ubuntu 20.04 (Vagrant上に立てるVM) Docker 20.10.8 実装 Vagrantファイルにdockerと docker composeコマンドをインストールするスクリプトを追加。 Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant.configure("2") do |config| # Sync Directory config.vm.synced_folder "/path/to/host/sync/dir", "/home/vagrant/workspace", create:"true", mount_options: ['dmode=777','fmode=777'] # Mapping ports config.vm.network "forwarded_port", guest: 8000, host: 8000 config.vm.network "forwarded_port", guest: 3306, host: 3306 config.vm.network "forwarded_port", guest: 8080, host: 8080 config.vm.network "forwarded_port", guest: 4572, host: 4572 config.vm.network "private_network", ip: "192.168.33.10" # Start ssh agent config.vm.provision "shell", run: "always", inline: <<-SHELL echo 'eval `ssh-agent`' > /home/vagrant/.bash_profile SHELL # setup config.vm.provision "shell", inline: <<-SHELL apt-get -y upgrade apt-get -y update # docker, docker compose curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh curl -fsSL https://github.com/docker/compose-cli/releases/download/v2.0.0-beta.3/docker-compose-linux-amd64 -o .docker/cli-plugins/docker-compose --create-dirs chmod 755 .docker/cli-plugins/docker-compose chown -R vagrant:vagrant .docker usermod -aG docker vagrant gpasswd -a vagrant docker systemctl enable --now docker systemctl restart docker echo 'eval `ssh-agent`' > /home/vagrant/.bash_profile SHELL config.vm.box = "bento/ubuntu-20.04" end 解説 Shell Scriptからdockerコマンドをインストール ※本番環境ではインストールスクリプトの使用は非推奨 1 curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh Docker compose CLIをインストール ※現状インストールスクリプトではインストールできない模様 2 curl -fsSL https://github.com/docker/compose-cli/releases/download/v2.0.0-beta.3/docker-compose-linux-amd64 -o .docker/cli-plugins/docker-compose --create-dirs chmod 755 .docker/cli-plugins/docker-compose 権限の調整と docker, docker compose コマンドをvagrantユーザーでも使用できるようにする。 chmod 755 .docker/cli-plugins/docker-compose chown -R vagrant:vagrant .docker usermod -aG docker vagrant gpasswd -a vagrant docker 結言 記事へのご指摘歓迎 補足 VagrantファイルはGithubにおいてあります。 https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script ↩ https://github.com/docker/compose-cli/issues/1781 ↩
- 投稿日:2021-08-27T15:12:52+09:00
NFCpyでタグに書き込む
hardware setup brew install libusb pip3 install nfcpy script 公式のものを改変 nfcwriter.py import nfc import sys def on_connect(tag): global data if tag.ndef is not None: for record in tag.ndef.records: print(record) if tag.ndef.is_writeable: from ndef import TextRecord tag.ndef.records = [TextRecord(data)] print("write complete") def main(): with nfc.ContactlessFrontend("usb") as clf: rdwr = { 'on-connect': on_connect } clf.connect(rdwr=rdwr) if __name__ == '__main__': global data if len(sys.argv) > 1: data=sys.argv[1] print("Put NFC-Tag") main() else: print("Need Record-Text") 実行 python3 nfcwriter.py helloworld
- 投稿日:2021-08-27T14:59:12+09:00
自作キーボード'meishi2'のキーマップをコマンドラインで変更する。
要約 meishi2のファームウェア書き込み・キーマップを変更する手順は以下の通り。 (1)QMK Firmwareをホームディレクトリにインストールする(ホームディレクトリに`qmk_firmware`フォルダが作成される。 (/Users/MYHOME/qmk_firmware/~~) (2)作成中のキーボードの名前(今回は 'meishi2' )とおなじ名前のフォルダを辿った先にあるkeymap.cを編集する。 (今回は/Users/MYHOME/qmk_firmware/keyboards/meishi2/keymaps/default/keymap.c) (3)makefileがあるディレクトリへ移動。 (今回は/Users/MYHOME/qmk_firmware/Makefileとなっているはずなので/Users/MYHOME/qmk_firmware/へ移動) (4)make コマンド実行(`make meishi2:default:avrdude`)。 はじめに キーボード自作の練習として、シンプルなキーボード'meishi2'を作った。 ここでは、meishi2のファームウェア書き込み・キーマップ変更の方法を述べる。 ファームウェア書き込みとキーマップ変更にかなりてこずった。ファームウェア書き込みに関する素晴らしい記事はたくさんある。しかし、私のような初心者のつまづきポイントにはあまり言及されていない。この方[1]がおっしゃるように、まさにこれという情報がなくてつらく感じた。そこで、私のような初心者の方のお役に立てればという気持ちで、自作キーボードのファームウェア書き込みの記事を書くことにした。 ファームウェア書き込みと書き換えは同じ手順でできる。 [1]自作キーボード初心者がfirmware書き込みで躓いたこと集 - Qiita, https://qiita.com/hokita222/items/a5567d955923125b93ed 環境 macOS; version 11.3 zsh; zsh 5.8 (x86_64-apple-darwin20.0) QMK Toolbox; Version 0.1.1 (0.1.1) (1)QMK Firmwareをインストール Pro Micro(Arduino互換機のこと)にファームウェアを書き込むのにはQMK Firmwareというソフトを用いる。 meishi2のビルドガイド[2]に従い、QMK Firmwareをインストールした(詳細はビルドガイド参照)。 なお、ここでは作業ディレクトリをホームディレクトリ(/Users/MYHOME)とした。 インストールすると、作業ディレクトリに(MYHOMEフォルダ)にqmk_firmwareフォルダが作成されるはず。 あとでmakeコマンドを実行する際に、どこにフォルダが作成されたかが大事である。 [2]meishi2 keyboard ビルドガイド - たのしい人生, https://biacco42.hatenablog.com/entry/2019/08/10/185624 (2)keymap.cを編集 以下のパスのkeymap.cを編集して、Pro Microに書き込むとキーマップを変更できる。 keyboardsフォルダの一つ下の階層にずらっと各種キーボードキットの名前が並んでいて、自分が作っているキーボード(今回はmeishi2)の名前のフォルダをたどった先にあるkeymap.cファイルを編集する。 /Users/MYHOME/qmk_firmware/keyboards/meishi2/keymaps/default/keymap.c keymap.cを適当なエディタで開き、以下の箇所を編集する。 meishi2のkeymap.cは以下(meishi2はボタンが4つしかない)。 ~~略~~ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V) \ ) }; ~~略~~ 上記では、一番左のボタンが 'left control + z' となっている。 しかし、Macでは取り消し(undo)は 'command + z' なので、ここを書き換えることにした。 左のcommandキーは 'LGUI' と表すので、LCTL(KC_Z)となっている箇所をLGUI(KC_Z)と書き換える。 なお、キーの表現方法は以下のように決まっているようである[3]。 [3]qmk_firmware/keycodes.md at master · qmk/qmk_firmware · GitHub, https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md そして、同様にほかの3つのキーも変更する。 ~~略~~ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V) \ ) }; ~~略~~ (3)makefileがあるディレクトリへ移動 makefileがあるディレクトリへ移動する。 今回は/Users/MYHOME/qmk_firmware/フォルダへ移動する。ここにmakefileがあるはず。 (4)makeコマンド実行。 ビルドガイドに従い、make meishi2:default:avrdudeコマンドを実行すると書き込める(実行後、画面に従いリセットボタンを押すなどの手順があるが、それらはビルドガイド参照することとして、ここでは割愛)。 上記のようにすると、キーマップ情報がおさまったhexファイルが作業フォルダに作成されつつ、Pro Microに書き込みが行われる。 ここで、make meishi2:defaultとするとhexファイルが作成され、Pro Microへの書き込みは行われない[4]。hexファイルを作成してGUI(Graphycal User Interface)のQMK Toolboxを使って書き込むこともできる(ここでは割愛)。 [4]Macでの QMK Firmware の書き込み | くにぽんず☆きちめきパラダイス, https://kunipon.com/3295 もし書き込みに成功したら、以下のように表示され、meishi2_default.hexというファイルが作業ディレクトリに作成されているはずである。 ~/qmk_firmware% make meishi2:default 〜〜略〜〜 Compiling: tmk_core/common/command.c [OK] Linking: .build/meishi2_default.elf [OK] Creating load file for flashing: .build/meishi2_default.hex [OK] Copying meishi2_default.hex to qmk_firmware folder [OK] Checking file size of meishi2_default.hex [OK] 〜〜略〜〜 ちなみに、makefileがないフォルダでmakeコマンドを実行すると以下のようなエラーがでる。 ~ % make meishi2:default make: *** No rule to make target `meishi2:default'. Stop. その他 参考[1]の方と同じように、usbケーブルのトラブルがあり、これを見つけるのにかなり時間を浪費した。 具体的には、参考[1]の方と同じで、makeコマンド実行後にリセットボタンを押すのだが、押しても何も反応がなかった(スイッチの半田付けを失敗したと考え、ショートさせるなどしたが全く反応なく大変苦労した)。 自宅にあるやや高級なusbケーブルに変えると普通に動いた。半田付けや書き込み手順などに問題がないにもかかわらず、全く反応しない場合は、ケーブルを試しに変えると良いと思う(マジで)。基本的には、自作キーボードキットに付属したケーブルを用いるとよいと思う。 考察 今回のファームウェア書き込みのつまづきポイント (1)CUIかGUIか ・CUI: keymap.cを編集してmakeコマンドで書き込む ・GUI: hexファイルを準備してQMK Toolboxで書き込む。 hexファイルはmakeコマンド実行で作成される。もしくは、誰かが作ってくれた、目的のキーボードに対する目的のキーマップのhexファイルをwebからダウンロードする。 (2)makeコマンド;makefileがあるディレクトリで行う。 (3)usbケーブル;非常に大事。 (4)その他 ・参考[1]のように、QMK Firmwareのダウンロード元によっては「lufa」フォルダが空のことがある。対応は参考のようにするか、手作業でコピーしてきてもよい。なんにせよ、'meishi2'ビルドガイドにあるダウンロード元のものは、「lufa」が空ではなく、問題はなかった。 ・makeコマンドはmake meishi2:default:avrdudeのような形でだいたいいける。しかし、キーボードの種類によっては、keymap.cの場所が異なり、このコマンドの形が多少変わることがある(例えば、Froggyの場合、make helix/rev3_5rows:froggy-jp:avrdude となる)。詳細は今回は割愛した。
- 投稿日:2021-08-27T12:31:04+09:00
M1 macとインテルMac+others で Dockerfileを扱う方法
M1 macとインテルMac、Windows環境が混在した場合に、Dockerが上手く使えなかったので、なんとか作ってみました。重要なのは、コンパイル部分を一つにまとめる事です。 以下の記事を参考にさせていただきました。 ソース RUN if [ $(uname -m) = "aarch64" ]; then \ echo arm64; \ # M1 Mac用 # インストールしたいパッケージのコマンドが入る && ./configure --build=arm \ && make \ && make install; \ else \ echo amd64; \ # それ以外のOS用 # インストールしたいパッケージのコマンドが入る && ./configure \ && make \ && make install; fi これで、今まで課題でGitで管理するのがめんどだった部分が無事解決しました。 M1 macはuname -mでaarch64という環境情報をはいてくれるのでこれを使います。
- 投稿日:2021-08-27T11:58:16+09:00
[Mac]Windowのどこをドラッグしても移動できるアプリの実装について
作成したアプリの紹介 Macのウィンドウの任意の場所をCMDキーを押しながらドラッグして、ウィンドウの移動やリサイズを可能にするアプリDokodemoDragを作成しました。 設計・実装の記録も兼ねて、技術要素の知見を共有します。 ※ DokodemoDragの実装は、Rectangleというキーボードショートカットでウィンドウ配置を行うアプリを参考にしています。 主な技術的要素 DokodemoDragが行っている事の概要は、 OSログイン時にアプリを自動起動し アプリをMacOSに常駐させ アプリ外のイベント(マウスイベント)を監視・取得し そのイベント情報をもとに、DokodemoDragアプリ外のウィンドウの情報を取得・操作する になります。 ここで紹介する技術要素は、上と順序が異なりますが マウス操作などのイベント監視 アプリ外のウィンドウ操作 常駐アプリ化 OS起動時の自動起動 です。次のそれぞれ解説します。 1. マウス操作などのイベント監視 アプリ外のイベント監視は、次のメソッドを利用することで実現できます。 NSEvent.addGlobalMonitorForEvents(matching:handler:) このメソッドは、アプリ外で発生したイベント(マウスイベントなど)を監視するためのメソッドです。 あくまでもイベントを監視するのみで、イベント内容を変更したり、イベントをキャンセル(元のアプリにイベントを発生させない)したりはできません。 キー関連のイベントを監視する場合は、macOSの「システム環境設定」「セキュリティとプライバシー」から「アクセシビリティ」が許可されている必要があります。 また監視できるイベントが限定されています。 (ドキュメントに監視可能なイベントの一覧が記載されています) DokodemoDragでは、MouseHookService.swift #24でイベント監視を開始するstartメソッドを定義し、アプリ起動時や機能を有効にした場合に監視を開始しています。(AppDelegate.swift #31) // MouseHookService.swift public func start() { stop() eventMonitor = NSEvent.addGlobalMonitorForEvents(matching: [.leftMouseDown, .leftMouseDragged, .leftMouseUp]) { event in self.handleMouseEvent(event) } } public func stop() { guard let eventMonitor = eventMonitor else { return } NSEvent.removeMonitor(eventMonitor) self.eventMonitor = nil self.element = nil } 2. アプリ外のウィンドウ操作 App Sandboxの無効化とアプリにAccessibility APIの利用を許可する必要があります。 2.1. App Sandboxの無効 アプリ外のウィンドウの操作を行うために、Xcodeプロジェクトにある <プロジェクト名>.entitlementsファイルの項目App SandboxをNOにする にする必要があります。 App Sandboxは、ドキュメントに 「macOSアプリケーションのシステムリソースとユーザーデータへのアクセスを制限し、アプリケーションが侵害された場合の被害を抑制します。」 とあります。(DeepL翻訳) アプリ外のウィンドウの位置変更やリサイズはAccessibilityのAPIを利用する必要があり、このAPIを利用するためにApp Sandboxを無効にする必要があります。 但しApp Sandboxを無効にすると、そのアプリはMac App Storeから配信することはできなくなります。 App Sandboxを無効にした場合、Mac App Storeから配信することはできませんが、Developer IDを利用することでAppleの公証(Notarization)を受けることができ、macOSで安全にアプリを開くことができるようになります。参考: Mac でAppを安全に開く Accessibility APIを利用しているにも関わらず、一部のアプリ(Cinch, BetterSnapTool, PopClipなど)はStoreに配信されているようですが、これらはstack overflowのによると、Sandboxがリリースされる以前に公開されたアプリのようで特例のようです。 stackoverflow: How to use Accessibility with sandboxed app? (これらのアプリが、2021年現在もAccessibility APIの機能が利用可能なのかは把握していません) DokodemoDragでは、Rectangleで定義されているAccessibilityElementクラスを利用して、Accessibility APIを利用しています。 AccessibilityElementはElement単位での操作が用意されているので、私のようにAccessibility APIの詳細を把握できていなくても直感的に利用できるようになっています。 実際のウィンドウ移動/リサイズ箇所はMouseHookService.swift #49, #51 になります。 2.2 アクセシビリティの許可 アプリがAccessibility APIを利用するために、 このアプリをmacOSの「システム環境設定」「セキュリティとプライバシー」から「アクセシビリティ」の許可する必要があります。 3. 常駐アプリ化 LSUIElementの設定とステータスバーへのメニューの配置を行います。 3.1 LSUIElement Dockにも現れず、強制終了一覧にも表示されないアプリを作成するには、Info.plistでLSUIElementをYESにします。 3.2 ステータスバーへのメニュー配置 ステータスバーへのメニュー配置は、Rectangleの実装をベースとしています。StatusBarItem #56 また私自身Macアプリ開発については素人同然なので、常駐化の把握については「ステータスバー常駐アプリ」という記事を参考にしました。 4. OSログイン時のアプリ自動起動 MacでのOSログイン時の複数あるようで、実装の際には「 「ログイン時に起動」を実装する」とRectangleの実装を参考にしました。 記事には、自動起動の選択肢として Launch Services を使う方法と Helper Application を使う方法 などが紹介されています。 Launch Serviceを利用する場合、OSのログイン項目に登録する方法となっていて、システム環境設定の「ユーザとグループ」の「ログイン項目」に表示されます。 一方Helper Applicationは、主アプリのmain bundleのContents/Library/LoginItems/内にあるヘルパーアプリが、主アプリを起動する仕組みとなっています。 自動起動の注意点としては、自動ログインは、Mac App Storeのガイドラインにより、「ユーザへの確認なしの自動起動はしてはならない」ため、アプリ起動時や設定で、ユーザが自動起動を有効にする必要があります。 Mac App Store Guidelines(以下は原文まま) (iii) They may not auto-launch or have other code run automatically at startup or login without consent nor spawn processes that continue to run without consent after a user has quit the app. They should not automatically add their icons to the Dock or leave shortcuts on the user desktop. DokodemoDragでは、Rectangleの実装を参考にしてHelper Applicationによる実装となっています。 Helper Applicationによる実現方法の概要は 主アプリを起動するHelper Application(ここではDokodemoDragLauncher)を作成する。 Helper Applicationは、主アプリを起動する。(AppDelegate.swift #35) ※ 現状のコードでは警告が出ます。またこのアプリの起動方法はSandboxを無効にしている場合のみ動作します。 Helper ApplicationのInfo.plistの「Application is agent(UIElement)か「Application is background only」を有効にする 主アプリ側 Build PhaseにCopy Files Build Phaseを追加し、Contents/Library/LoginItems/にヘルパーアプリケーションを追加する SMLoginItemSetEnabledを呼び出す。(SettingService.swift #36) です。 DokodemoDragでは、このCopy Files Build Phaseの影響で「Developer Idを利用したNotarizationが行えない」という問題が発生していて、解決していません。 (ヘルパーアプリのコピー後に再度、codesignが必要なのだと思いますが検証できていません)。 関連:stackoverflow How can I add secondary files to my macOS .app archive and still pass Apple's notarization? つらつらHelpr Applicationについて書きましたが、自動起動についてはHerlp Applicationをライブラリ化されているsindresorhus/LaunchAtLoginを利用を検討した方が良いかもしれません。 (このライブラリは検証できていませんが、Notarizationが行えない問題もscriptによるcodesignで回避していそうに見えます) 記録も兼ねて長々書きましたが、常駐アプリを作成する際の参考になれば幸いです。 良ければDokodemoDragも触ってみてください。 以上!!
- 投稿日:2021-08-27T07:32:45+09:00
[shell]ふりがなデータをローマ字表記に変換して特定列に追加
よくある「名前・読み(ふりがな)」の項目が入ったデータだが、新たにローマ字の項目を追加したい。 だが手動で読みから判断して一つ一つ入力するのは時間がかかる。 そこで今回はuconvというshellで扱える便利コマンドを利用して変換後、特定列に追加する方法を記録する。 実現すること 以下のようなTSV形式のデータがある。 名前 読み 生年月日 出身地 所属コード 亜 あ 20xx/xx/xx 東京都 1 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 上記の読みデータをコマンドを使用してローマ字表記に変換して、「読み」 と 「生年月日」 の項目の間に新たに以下のように追加。 名前 読み ローマ字 生年月日 出身地 所属コード 亜 あ a 20xx/xx/xx 東京都 1 *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 環境 Mac OS X 10.15.6 手順 uconvコマンドのインストール 標準環境に入っているコマンドでは厳しいため、uconvというデータ変換コマンドを利用する。 まず、以下のコマンドでuconv付属のライブラリをインストールする。 brew install icu4c インストール後はパスを通すかエイリアスを設定する必要があるため、以下の~/.zshrcもしくは~/.bashrcにaliasを追加する。 ~/.zshrc # こちらのpathは「brew list icu4c | grep uconv」で確認する。 alias uconv='/usr/local/Cellar/icu4c/69.1/bin/uconv' uconv --versionと入力して、バージョン情報が表示されることを確認する。 サンプルデータ用意 今回はこちらのサイトで作成した以下のデータをsample.tsvとして保存して利用する。 sample.tsv 名前 読み 生年月日 出身地 所属コード 佐瀬 竜三 サセ リュウゾウ 1960/12/9 秋田県 05 福村 重光 フクムラ シゲミツ 1989/8/27 石川県 17 立野 夢 タチノ ユメ 1997/10/15 山形県 06 長沼 綾奈 ナガヌマ アヤナ 2008/7/29 香川県 37 坂井 正雄 サカイ マサオ 1993/3/31 富山県 16 中村 奈保美 ナカムラ ナホミ 1979/1/30 山形県 06 清野 金蔵 キヨノ キンゾウ 1985/1/30 山口県 35 成瀬 勝三 ナルセ カツゾウ 1982/2/18 長野県 20 幸田 矩之 サチダ ノリユキ 1982/9/2 神奈川県 14 原田 裕司 ハラタ ユウジ 1997/10/9 新潟県 15 変換及び追加 コマンドとデータの用意が整ったため、uconvでの変換と追加作業をしていく。 ※uconvコマンドの基本使用例及び詳細はこちらを参照。 まず以下のようにuconvを用いて読み(ふりがな)データがローマ字に変換できることを確認する。 awk -F '\t' 'NR>1{print $2}' sample.tsv | uconv -x latin sase ri~yuuzou fukumura shigemitsu tachino yume naganuma ayana sakai masao nakamura nahomi kiyono kinzou naruse katsuzou sachida noriyuki harata yuuji 上記のような変換を確認後、以下のコマンドで 「読み」と「生年月日」の間に「ローマ字」 列が追加されることを確認する。 ※可読性のため、ワンライナーを改行。 方法1 paste \ <(cut -f1-2 sample.tsv) \ <(echo "ローマ字";awk -F '\t' 'NR>1{print $2}' sample.tsv | uconv -x latin) \ <(cut -f3- sample.tsv) 名前 読み ローマ字 生年月日 出身地 所属コード 佐瀬 竜三 サセ リュウゾウ sase ri~yuuzou 1960/12/9 秋田県 05 福村 重光 フクムラ シゲミツ fukumura shigemitsu 1989/8/27 石川県 17 立野 夢 タチノ ユメ tachino yume 1997/10/15 山形県 06 長沼 綾奈 ナガヌマ アヤナ naganuma ayana 2008/7/29 香川県 37 坂井 正雄 サカイ マサオ sakai masao 1993/3/31 富山県 16 中村 奈保美 ナカムラ ナホミ nakamura nahomi 1979/1/30 山形県 06 清野 金蔵 キヨノ キンゾウ kiyono kinzou 1985/1/30 山口県 35 ※方法1のような<()を用いたプロセス置換がない環境であれば以下のコマンドを利用する。 ※こちらは方法1に比べて速度が遅いため、プロセス置換が使えない環境のみ使用 方法2 cat sample.tsv | awk -F '\t' 'BEGIN{OFS="\t"} \ {if(NR!=1){c="echo "$2" | uconv -x latin";c | getline r;close(c);}else{r="ローマ字"}print $1,$2,r,$3,$4,$5}' 名前 読み ローマ字 生年月日 出身地 所属コード 佐瀬 竜三 サセ リュウゾウ sase ri~yuuzou 1960/12/9 秋田県 05 福村 重光 フクムラ シゲミツ fukumura shigemitsu 1989/8/27 石川県 17 立野 夢 タチノ ユメ tachino yume 1997/10/15 山形県 06 長沼 綾奈 ナガヌマ アヤナ naganuma ayana 2008/7/29 香川県 37 坂井 正雄 サカイ マサオ sakai masao 1993/3/31 富山県 16 中村 奈保美 ナカムラ ナホミ nakamura nahomi 1979/1/30 山形県 06 清野 金蔵 キヨノ キンゾウ kiyono kinzou 1985/1/30 山口県 35 上記の方法で問題なければ完了。 まとめ shellでのひらがなやカタカナの扱いは難航するかと感じていたが、便利コマンドを利用することで簡素化を図ることができた。 他にも様々便利コマンドが存在していたため、必要に応じて利用していくことにする。 参考 uconv テストデータジェネレータ