自作キーボードのファームウェア焼き込み(QMK)をサクっとRaspberry Pi2でやっていく
備忘録
参考にしたページ
https://iot.keicode.com/raspberry-pi/faq-username.php
https://babe-mt.hatenablog.com/entry/2018/02/27/094353
https://r7cancer.hatenablog.com/entry/2019/10/18/153458
ベースは自分で前に書いたこれ
http://bobbyquine.hatenablog.com/entry/2018/09/18/143051
少しキーマップを変えようと思ったのだけれど,現在QMKファームウェアを焼き込める環境を持っていなかった.メイン環境に入れるのは何か嫌だったしArchなので必要パッケージを探し直すのも面倒くさかったため,部屋に転がってたRaspberry Piで焼き込んで見ることに.
ここではRaspberry Pi用のSDカードにOSを焼き込むところからやっていく.
ここからメインPCはArch,Raspberry PiはRasPiのプロンプト表示を行う.今回,Raspberry Piにはディスプレイ等はつながず,sshでの操作を考えている.
https://www.raspberrypi.org/downloads/raspbian/
ここからRaspbian Buster Liteのzipをダウンロードし,それを解凍する.ファイル名は時期によって日付が違うので注意
[Arch ] $ unzip 2020-02-13-raspbian-buster-lite.zip
そしてその後SDカードをArch に差し込み確認.
[Arch ] $ ls /dev/
ここでSDカードは
/dev/mmcblk0
であるとして先ほどDLし,解凍して得られたimgファイルをSDカードに焼き込んでいく.
[Arch ] $ sudo dd if=./raspbian-buster-lite.img of=/dev/mmcblk0
焼き込みが終わったら,今回はssh接続で作業を行っていくため,初回起動時からsshdを有効にしなければならない.
[Arch ] $ sudo mount /dev/mmcblk0p1 /mnt
[Arch ] $ sudo touch /mnt/ssh
[Arch ] $ sudo umount /mnt
終わったらSDカードをRaspberry Piにさして,LANケーブルを差し,電源を入れて起動する.
基本DHCP接続になっていると思うのでarp-scan でRasPiに割り当てられたIPアドレスを探す.
ここでArchのRasPiと接続しているインターフェースをenp1s0として,
[Arch ] $ sudo arp-scan -I enp1s0 -l
192.168.1.15 ab:cd:ef:gh:ij:kl Raspberry Pi Foundation
と言うように分かる.
初期IDとパスワードはpi/raspberryであるから,
[Arch ] $ ssh pi@192.168.1.15
passward:raspberry
としてログイン.そうしたら
[RasPi ] $ sudo apt update && sudo apt upgrade
[RasPi ] $ sudo apt install git gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi arvdude
[RasPi ] $ git clone https://github.com/qmk/qmk_firmware.git
今回なぜかこれでmakeを行うと怒られた.どうにも~/qmk_firmware/lib/lufa/の中身が空っぽになってしまっている.しょうがないので
https://github.com/qmk/qmk_firmware
ここのなかからlufaディレクトリの中身だけzipでdlしてRasPiの方の空だったところにぶち込んだ.
ここから先は私の使用するergo42について書いていく.
そしたら~/qmk_firmware/keyboards/ergo42/keymaps/default/keymap.cをいじって好きな配列にしたらergo42を接続し
[RasPi ] $ cd ~/qmk_firmware/
[RasPi] $ make ergo42/rev1:default:avrdude
途中
Detecting USB port, reset your controller now..............
と出たらergo42のリセットボタンを押す.ちょっと待てば焼き込みは終わる.
ergo42は左右分離なので左右両方ともについて同様の作業を行う.
シェル芸でライフゲームをやってみた
へべれけです.シェル芸でライフゲーム出来たら楽しいだろうなって思ってやってみた.
まぁ,最終的にシェル芸か怪しい物が出来上がった.
ライフゲームが何ぞやってのはWikipediaでも読んでください.
まずはこの中の振動子「銀河」を作ったのでそれを.
とりま結果がこちら
seq 8|awk '{if ($1 == 1) print "ZWNobyBhNDhiMmExYjZhNmIyYTFiNmE2YjJhMTNiMmE1YjJhNmIyYTViMmE2YjJhNWIyYTEzYjJhNmI2YTFiMmE2YjZhMWIyYTQ4fHNlZCAtZSBzL2EvXFxcbjBcfGhlYWRcIFwtblwgL2cgLWUgcy9iL1xcXG4xXHxoZWFkXCBcLW5cIC9nfHNlZCAvXlwkL2R8c2VkIHMvXi95ZXNcIC9nfGJhc2h8dGVlIGEK" ; else print "Y2F0IGF8dHIgJ1xuJyAnICd8c2VkIHMvXi95ZXNcIC9nfGJhc2h8aGVhZCAtbiAxOTV8bmwgLW4gbG58YXdrIC1GIlx0IiB7J3ByaW50ICQyIiwiJDEnfXxhd2sgLUYgIiwiIHsncHJpbnQgImVjaG8gIiQxInxhd2sge3ByaW50ICQiJDIiKyQiJDIrMSIrJCIkMisyIiskIiQyKzE1IiskIiQyKzE3IiskIiQyKzMwIiskIiQyKzMxIiskIiQyKzMyIiwkIiQyKzE2In0iJ318c2VkIC1lIHMvXHsvXHtcJy9nIC1lIHMvXH0vXCdcfS9nfGJhc2h8YXdrICd7aWYgKCQxID09ICIyIikgcHJpbnQgJDI7IGVsc2UgaWYoJDEgPT0gIjMiKSBwcmludCAiMSI7IGVsc2UgcHJpbnQgIjAifSd8c2VkIC1lIDFzL14vMDAwMDAwMDAwMDAwMDAwMC8gLWUgJyQgYSAwMDAwMDAwMDAwMDAwMCd8c2VkIHMvLi9cJlxcXG4vZ3xzZWQgL15cJC9kfHRlZSBhCg=="}'|base64 -d|sed "$ a rm a"|bash|awk '{ORS=NR%15?"":"\n";print}'|sed s/0/\ \ /g|sed s/1/\[\]/g|textimg -asl15 -F100 -f /u*/s*/f*/t*/h*o/*A.ttf
解説
まず銀河は一周期8世代なので
seq 8
で1世代を与えて8世代まで演算させることとする.
パイプ先のawkで一行目に上記の"ZW〜EK"を与え,それ以外の行には"Y2〜=="を与える.これはそれぞれbase64でエンコードされており,デコードすると前者は初期状態を,後者はそれから次世代を演算するシェル芸が得られる.それがそれぞれ次である.
echo a48b2a1b6a6b2a1b6a6b2a13b2a5b2a6b2a5b2a6b2a5b2a13b2a6b6a1b2a6b6a1b2a48|sed -e s/a/\\\n0\|head\ \-n\ /g -e s/b/\\\n1\|head\ \-n\ /g|sed /^\$/d|sed s/^/yes\ /g|bash|tee a
cat a|tr '\n' ' '|sed s/^/yes\ /g|bash|head -n 195|nl -n ln|awk -F"\t" {'print $2","$1'}|awk -F "," {'print "echo "$1"|awk {print $"$2"+$"$2+1"+$"$2+2"+$"$2+15"+$"$2+17"+$"$2+30"+$"$2+31"+$"$2+32",$"$2+16"}"'}|sed -e s/\{/\{\'/g -e s/\}/\'\}/g|bash|awk '{if ($1 == "2") print $2; else if($1 == "3") print "1"; else print "0"}'|sed -e 1s/^/0000000000000000/ -e '$ a 00000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee a
まず前者であるが,初期状態を与えるためのシェル芸である.実行した方は分かったかと思うが,今回得る出力はtextimgを用いたgifファイルにする予定であり,フィールドサイズを15×15にした.それをC言語の二次元配列をポインタとして読み出すとき同様一列にし,空白aの連続数,生存bの連続数を羅列してパイプで次に渡した.
渡した後の処理で複数パイプがあるが,これを0/1の数列に複合,teeコマンドを用いて標準出力に与えつつaというファイルに保存した.
後者では保存されたaを読み出し,yesコマンドとheadコマンドで最上行と最下行を除いた13行である195セル(正確には一行目及び二行目の一列目セルは演算されず,最終行は1列目セルのみ演算される)を演算するために行数を増殖させる.
nlコマンドで行数を出して次のawkで順序を入れ替える.その次のawk内でawk文を生成してsedで整え,bashに渡す.この段階で得られるのは周囲セルの合計数と自セルの0/1である.次のawkのif文で次世代の0/1を演算する.先ほど記述したとおり,最上行と最下行(正確には違う上記の通り)を0で埋めてやり,出力形態をsedで整えてからteeコマンドで標準出力に渡しつつaと言うファイルに"上書き"する.
もとのシェル芸に戻る.現段階でbase64のデコードは終わった.
そしてデコードが終わって得られている標準出力は初期配置コマンド\n演算コマンド*7である.
sedをもちいてこれらの実効後に残ってしまうファイルaを削除するコマンドを最終行の次行に追加し,bashに渡して演算を行う.このままでは1世代から8世代までのセル連チャンについてただ一列に並べただけのデータであるから15文字ずつに改行する形にawkで処理,0/1をsedを用いて見やすい形にしてやり,textimgで15行ごとに区切ってgifアニメーションとした.
正しくこれらを理解していれば分かると思うが,今回のライフゲームフィールドは最上行及び最下行は0となるためフィールドは上下方向には有限である.それに対し左右方向について見てみると一列の配列として処理しているので左端セルの左側隣接セルとして一行上の右端セルが,逆に言えば右端セルの右側隣接セルとして一行下の左端セルが認識されてしまう.何かこのシェル芸を用いて他の振動子や移動体等を得る際にはお気をつけください.シェル芸と言うにはbase64でコマンド群かくしてるだけだからチートな気がするけど気にしない.文字数の都合でシェル芸botに流せないのが悲しい.他の振動子や移動体については気が向いたら書く.眠いのでこの辺で
2020/02/17 23:30頃追記
やはりbase64を用いてのワンライナー化は個人的に納得しきれていなかったので改良した.まだ改良の余地はあるだろうがひとまず記しておく
yes "cat a|tr '\n' ' '|awk '{for (i=1;i <= 195; i++) print \$i+\$(i+1)+\$(i+2)+\$(i+15)+\$(i+17)+\$(i+30)+\$(i+31)+\$(i+32),\$(i+16)}'|awk '{if (\$1 == 2) print \$2; else if(\$1 == 3) print 1; else print 0}'|sed -e 1s/^/0000000000000000/ -e '$ a 00000000000000'|sed s/./\&\\\n/g|sed /^\$/d|tee a"|head -n 7|sed "1i echo a48b2a1b6a6b2a1b6a6b2a13b2a5b2a6b2a5b2a6b2a5b2a13b2a6b6a1b2a6b6a1b2a48|sed -e \"s/a/\\\n0\\\\|head\ \-n\ /g\" -e \"s/b/\\\n1\\\\|head\ \-n\ /g\"|sed /^\$/d|sed \"s/^/yes\ /g\"|bash|tee a"|sed "$ a rm a"|bash|awk '{ORS=NR%15?"":"\n";print}'|sed s/0/\ \ /g|sed s/1/\[\]/g|textimg -asl15 -F100 -f /u*/s*/f*/t*/h*o/*A.ttf
軽く解説と言うか何というか
yesコマンドで演算コマンドを複数行生成,上から得たい世代分だけheadコマンドで得る.この時,この前のシェル芸ではこちらから与える初代を第1世代としてカウントしていたのに対し,今回のシェル芸では第0世代としてカウントしている.
さて,これにより得られた演算コマンド群の最初の行にsedを用いて初代の配列を与えるワンライナーを追加し,また最終行に途中生成ファイルであるaを削除するようrm aを追加する.これをbashで実行してやり,標準出力をawkにより15文字づつの改行にしてsedで文字を変換,textimgでgifアニメーション出力を得る.
初期配列を得るワンライナーに変更はないが,演算用ワンライナーには変更があり,yesとheadを用いて演算用に標準出力を調整していた箇所をawkのfor文を用いることで短くし,無駄を減らした.
得られる出力結果は変わらないが,可読性が高くなり,またシェル芸の文字数も979文字から637行に減ったため改良したとする.
最後に自身へのメモ及び読者が真似するときに気にすべきパラメータについてまとめる.
この追記でのシェル芸にて,色のついた箇所がパラメータである.
行(縦方向のセル数)をN
列(横方向のセル数)をM
世代数をG(初期値で与える世代は0世代とする)
一つ目のawk内のfor文のこの値(195)は "(N-2)*M"
二つめの15,17,30,31,32はそれぞれM,M+2,2*M,(2*M+1),(2*M+2)
三つめの16は上記同様M+1
四つめのsedで加えている0の数は前者がM+1,後者がM-1
五つめのheadの引数7はG
六つめのechoで呼び出している文字列はa=空白,b=生きてるセルとしてフィールドの改行を取り消した時のセルの初期状態の記述.
七つめのawk内の15はM
八つめのtextimg内の15はN
上記条件でシェル芸を書き換えれば好きな初期配置,フィールドサイズを実現出来る.
LinuxPCをルーターにして配下に接続したRaspberry Piにルーティングしてみる
まず使う機材
Rasbperry Pi2 with ArchLinuxARM
DesktopPC with Arch Linux
Laptop with Arch Linux
自宅の無線ルータ
|----------------LapTop
|----------------Desktop--------------RasPi
こんな感じにしてLapTopからRasPiにsshアクセスしたい.
前も同じような事書いたことある気がする.
自宅の無線ルータの管理者権は無く,動的IP
DesktopからRasPiへは有線でこれも動的IP割り当てに使用と思う.IP固定しろって
ここから,作業のシェルは
[RasPi] $
[Desktop] $
[LapTop] $
で記述していく察して.管理者権限とかもあるよ.
ぶっちゃけすぐ変える(破棄する)環境なので自動化とかはやらない
デスクトップでDHCP鯖
ここで無線ルータとつながっている側のインターフェース名がwlp,RasPiをつなげる有線側がenpね
[Desktop] # pacman -S dhcpd
[Desktop] # vim /etc/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
INTERFACES="enp";
option domain-name "";
log-facility local7;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.10 10.0.0.20;
option routers 10.0.0.1;
option domain-name-servers 1.1.1.1;
}
あとは
[Desktop] # mkdir Shell
[Desktop] # vim ./Shell/dhcpdstart.sh
#!/bin/bash
ip link set dev enp up
sysctl net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o wlp -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth -o wlp -j ACCEPT
ip addr add 10.0.0.1/24 dev eth
systemctl start dhcpd4.service
[Desktop] # ./Shell/dhcpdstart.sh
Raspberry Piの設定
http://bobbyquine.hatenablog.com/entry/2018/04/10/192935
とりまこれのSDカード作るところまでやったらRasPiに刺して有線もつないで電源入れる.
そしたら多分デスクトップからだったらsshで入れるはず.
[Desktop] $ sudo arp-scan -I enp -l
これでRasPiに割り振られたIPアドレス見つける.(ここでは仮に10.0.0.13)
ついでにこの時のRasPiのMacアドレスもメモっとく(今回は仮にra:sp:be:rr:yp:i2,16進数になってねぇのは知ってる)
[Desktop] $ ssh root@10.0.0.13
[RasPi] # pacman -Syyu
[RasPi] # vim /etc/ssh/sshd_config
Port 55522 #とりまポート変えとく
[RasPi] # reboot
まぁホントはユーザー作ってRootでのログイン禁止にするべき,書くのめんどい.
デスクトップ側でルーティングの設定
[Desktop] # vim ./Shell/routing.sh
#!/bin/bash
WLP=$(ip addr|grep wlp|sed -n 2p|sed s@/24.*\$@@g|awk '{print $2}')
RAS=$(arp-scan -I enp -l|grep ra:sp:be:rr:yp:i2|awk '{print $1}')
iptables -t nat -A PREROUTING -m tcp -p tcp --dst $WLP --dport 55522 -j DNAT --to-destination $RAS:55522
iptables -t nat -I POSTROUTING -m tcp -p tcp -s $RAS --sport 55522 -j SNAT --to-source $WLP:55522
[Desktop] # ./Shell/routing.sh
Laptopから継いでみる
デスクトップPCのwlpのIPアドレスが192.168.1.6だったら
[Laptop] $ ssh -p 55522 root@192.168.1.6
これで繋がるはず.
でも自宅Wi-Fiも動的IPアドレスなので変わる可能性あり.
ここでデスクトップの自宅無線ルータに接続している側(wlp)のMacアドレスがde:sk:to:pm:ac:hiとして,LapTopの無線インターフェースがwloだとしたら
[LapTop] $ $(sudo arp-scan -I wlo -l|grep de:sk:to:pm:ac:hi |awk '{print $1}'|sed s/^/ssh\ \-p\ 55522\ root@/g)
ってやればいい.暇つぶし以上.
AtomでLaTeX書きたいな(Arch Linux)
Atomというエディタを知った。Vimでいいじゃんと思っていた自分もいたが友人がうまく環境構築出来なくて困っていたのでとりあえずやってみようかなということで。
参考にしたページ
https://qiita.com/dongsiku/items/68d46576f068e739bb60
https://texwiki.texjp.org/?Latexmk
https://qiita.com/ankd/items/23e802c1bc7d6eb39739
まずTexLiveのインストール。諸事情でキリル文字も使用するので
$ sudo pacman -S texlive-core texlive-bin texlive-langcyrillic texlive-langjapanese texlive-pictures
jlistingについてはこれと同様↓↓
http://bobbyquine.hatenablog.com/entry/2018/01/26/001125
diagboxについてはこれと同様↓↓
http://bobbyquine.hatenablog.com/entry/2019/06/16/132123
latexmkrcの作成
$ cd ~
$ vim .latexmkrc
$latex = 'platex -synctex=1 %O %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
Atomのインストール
$ apm install latex language-latex latexer pdf-view
$ apm install vim-mode-plus ex-mode
SettingsからPackagesのlatexのSettingを選択
.Engineをplatexに設定
.PDF Producerをdvipdfmxにし、Build on Saveのチェックボックスを入れ、Open Result after Successful Build・Open Result in Backgroundのチェックボックスを外す
.Openerをpdf-viewに設定
多分これで大丈夫。
使うときはこんな感じに画面分割しとく。texファイルを保存する度にpdfファイルが更新されるはず。
思ったより使い勝手良さげでVimから浮気してる。
Arch LinuxにMatLab、Simulinkを入れていく
大学の契約で学生がMATLABを無料で利用できるので今回は現在使用中のArch Linuxにインストールしていく。あくまで個人的記録。
まずはここからインストーラをダウンロード。適当にMATLABインストール用のディレクトリを作成してその中に入れておく。
https://jp.mathworks.com/downloads/web_downloads/?s_iid=hp_ff_t_downloads
んでそのディレクトリに入ってダウンロードした圧縮ファイルを解凍する。
多分zipファイルだったのでunzipコマンドで。
あとは回答したディレクトリで
$ sudo ./install
ってやるとインストーラが起動する.
私の環境下では/tmpが足りなかったため、まずMATLAB本体のみをインストールしたあと、再度MATLABインストーラを起動してSimulinkをインストールした。
ここでMATLABを起動し、Simulinkを使おうとしたらlibXssとlibselinuxが足りないから入れろってエラー出てきた。
libXssは
$ sudo pacman -S libxss
で入手出来る.
libselinuxはAURからになる。
ただ、これにはlibsepolが必要になるのでこれを先にAURから入れる。
https://aur.archlinux.org/packages/libsepol/
ここからスナップショットをダウンロード、
$ tar zxvf libsepol.tar.gz
で解凍、
そのディレクトリに入り
$ makepkg -s
$ sudo pacman -U libsepol-2.9-1-x86_64.pkg.tar.xz
libselinuxについても
https://aur.archlinux.org/packages/libselinux/
ここからスナップショットを入手して同様にインストールする。
なお起動時に、 " Gtk-Message: 02:00:36.152: Failed to load module "canberra-gtk-module" " とエラーメッセージが出るけどなんか大丈夫そうなので放置している。
MATLABは日本語で利用したいので " ~/.bashrc " に次のようにaliasを追加した。
LaTeXでカルノー図を作りたい(あの斜線区切りを作りたい)
レポートでカルノー図を描く機会があったのだが、table & tabularでは標準で入ってないのでdiagboxを導入する。
いつも通り環境はArch Linux & TexLive。完全にメモ書き程度。
https://ctan.org/texarchive/macros/latex/contrib/diagbox
$ mkdir ~/tmp
ここから " diagbox.dtx " と " diagbox.ins " を~/tmp/下にダウンロード
$ cd ~/tmp
$ latex diagbox.ins
生成された " diagbox.sty " を " TEXMFLOCAL/tex/latex/diagbox/ " 下に移動する。
Arch Linuxの場合、 " TEXMFLOCAL " は " /usr/share/texmf-dist/ " なので
$ sudo mkdir /usr/share/texmf-dist/tex/latex/diagbox
$ sudo cp ~/tmp/diagbox.sty /usr/share/texmf-dist/tex/latex/diagbox/
$ sudo mktexlsr
で導入完了。
つかいかたは
\usepackage{diagbox}
.
.
.
\begin{center}
\begin{table}[H]
\begin{center}
\begin{tabular}{|c||c|c|c|c|}
\hline
\diagbox{DC}{BA} & 00 & 01 & 11 & 10\\
\hline
00 &1& & 1 & 1 \\
\hline
01 & &1&1&\\
\hline
11 & ${\rm \phi}$ & ${\rm \phi}$ &${\rm \phi}$ &${\rm \phi}$\\
\hline
10 & 1&1&${\rm \phi}$ &${\rm \phi}$\\
\hline
\end{tabular}
\end{center}
\end{table}
\end{center}
Linux PC "を" Bluetooth Speaker としてつかう
ども
今回はLinux PCをBluetoothスピーカーとして使っていくよ
環境はArch Linux 。Bluetooth まわりで必要なものは前回のこれ↓で確認。多分今回のでは必要ないのも含まれてるけど
http://bobbyquine.hatenablog.com/entry/2019/01/15/204651
今回は作業中だったのでrootユーザーで進めていく。一般ユーザーでやるときは適宜sudo 使ってね。
参考にしたページ↓
設定
# pacman -S bluez bluez-utils
# vim /etc/bluetooth/audio.conf
以下を追加---------------------------------------------------------------
[General]
Enable=Source
------------------------------------------------------------------------------
起動、ペアリング
# systemctl start bluetooth
# bluetoothctl
シェルが変わる
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
それっぽいのを探して
[bluetooth]# pair yourdevicesMacAdd
ペアリングしたらちゃんとコネクトもしてあげましょ
[bluetooth]# connect yourdevicesMacAdd
これで使えるようになったはず
以上