Rasp Pi ZERO で動くシステムの OS を Raspbian から Alpine Linux に差し替えた
なぜ?
shutdown 操作なしでの電源断で SD カードの内容が壊れるのを防ぐため
どんなシステム?
機能1 USB から入力されるデータの一部をネット経由でサーバーに上げる
機能2 USB から入力されるデータの一部を接続してある LCD に表示する
USB から入力されるデータ - C94-M8P が送出する RTCM3
データをネット経由でサーバーに上げるプログラム - str2str
データを LCD に表示するプログラム - python で書いた自家製プログラム
どうやった?
・Alpine Linux 3.8.1 - RASPBERRY PI - armhf をダウンロードして、fat32 でフォーマットした sd カードに解凍したものをコピー
・上記 sd カードを RaspPi Zero にセットしてこちらとこちらを参考に OS をセットアップ
・Raspbian でコンパイルした str2str は Alpine Linux では動かなかった。Rasp Pi Zero でコンパイルするために gcc をインストールし、rtklib のソースをインストールしようとしたところで、メモリが足りなくなる。
・Rasp Pi 3B+ を買ってきて 3B+ 向けの sd カードを作成、コンパイルを再挑戦(Zero は RAM 512M だが、3B+ は RAM 1G)。コンパイル成功。
・Rasp Pi 3B+ でコンパイルした str2str を Rasp Pi Zero コピーして動作確認
・Rasp Pi Zero に python2 をインストールして LCD 制御プログラムの動作確認
- pip で sysv_ipc, pymap3d をインストールする必要があったのだが、そのために apk で gcc, python2-dev, musl-dev をインストールする必要があった。gcc, python2-dev, musl-dev をインストールして pip を実行、pip 終了後に gcc, python2-dev, musl-dev をアンインストールした。
・pip でインストールした内容を 'lbu ci -d' の対象とするために 'lbu add /usr/lib/python2.7/site-packages/*' を実行
・/etc/init.d/shoho-getmsg, /etc/init.d/shoho-str2str を作って str2str 、lcd 制御プログラムをサービス化。
・'lbu add /etc/init.d/shoho-getmsg', 'lbu add /etc/init.d/shoho-str2str', 'lbu ci -d' を実行して、必要なファイルを永続化。
ここまででわかったこと
・RAM の半分を RAM-DISK として使い、通常動作中は sd カードに書き込みをしない
・RAM-DISK の内容を sd カードに保存するコマンドは 'lbu ci -d'
・RAM-DISK から sd カードに保存する領域の指定は 'ldu add /xxx/xxx'
- /xxx/xxx/* としないと、サブディレクトリ一式を指定したことにならない
・パッケージ管理は apk (apt でも yum でもない)
・サービス管理は OpenRC (SysVinit でも Systemd でもない)
-普通のプログラムはそのままではサービスにならない。バックグラウンドに回すスクリプトを書く必要がある(Systemd の場合は不要だった)
・サイズが小さい(上記システムが動く sd のファイルサイズが合計で 145MB)
・ファイルフォーマットが FAT32 (Windows で全領域にアクセスできる)
・バックアップ・リストアが楽(FAT32 でファイルサイズが小さいので、Windows で簡単にバックアップできる。リストアは Windows で FAT32 でフォーマットした sd カードにバックアップしたファイルをコピーすれば OK)
2018年12月29日土曜日
2018年12月25日火曜日
Rasp Pi Zero WH:Alipine Linux RPi.GPIO のインストール
pip を入れてから
>apk add gcc
とやってから再挑戦。 "Python.h がない!!" というエラーが出たので
> apk add python2-dev
とやってから再挑戦。"limits.h がない!!"というエラーが出たので
>apk add musl-dev
とやってから再挑戦。
やっと Successfully !
>pip install rpi.gpio
とやったら、コンパイルができない >< 系のエラーが出たので>apk add gcc
とやってから再挑戦。 "Python.h がない!!" というエラーが出たので
> apk add python2-dev
とやってから再挑戦。"limits.h がない!!"というエラーが出たので
>apk add musl-dev
とやってから再挑戦。
やっと Successfully !
Rasp Pi Zero WH:Alipine Linux pip のインストール
ネットで探してもインストール方法が見つからなかったので頭をひねった。
とやったらエラーが出てきて、最後に
と表示されたので
を実行して完了
> apk search | grep pipでみつかったので
py2-pip-10.0.1-r0
py-django-pipeline-1.3.25-r0
uwsgi-logpipe-2.0.17-r1
rp-alpine-4-1:/$ apk add py2-pip
> apk add py2-pip
とやったらエラーが出てきて、最後に
>You are using pip version 10.0.1, however version 18.1 is available.
>You should consider upgrading via the 'pip install --upgrade pip' command.
と表示されたので
>pip install --upgrade pip
を実行して完了
2018年12月18日火曜日
Rasp Pi Zero WH:Alipine Linux インストール
Raspberry Pi Zero を組み込み用に使おうとうしたときに、問題となるのが電源断時の SD カードの内容の保護。
Qiita で RaspberryPi2 の SD カードを aufs と fsprotect で保護する という記事を見つけたが、クロスビルドの環境構築で挫折 ><。他に何か中と調べたら RaspberryPiで「alpinelinux」 という記事を発見。いろいろと特徴が書かれていたのだが、
>よほどのことがないと起動パーティションは壊れない(書き換えようとするプロセスが居ない)
>機器の電源断やCPUの誤動作程度ではほぼほぼ起動パーティションの破壊はおこりません
の二点に惹かれて試してみることに。
↑のサイトの内容だけではうまくいかなかったので Raspberry Pi3 ZERO(W) Alpine Linux(3.8.1)インストール と合わせて何とかうまくいった。
実際に行ったのは、結局、
Qiita で RaspberryPi2 の SD カードを aufs と fsprotect で保護する という記事を見つけたが、クロスビルドの環境構築で挫折 ><。他に何か中と調べたら RaspberryPiで「alpinelinux」 という記事を発見。いろいろと特徴が書かれていたのだが、
>よほどのことがないと起動パーティションは壊れない(書き換えようとするプロセスが居ない)
>機器の電源断やCPUの誤動作程度ではほぼほぼ起動パーティションの破壊はおこりません
の二点に惹かれて試してみることに。
↑のサイトの内容だけではうまくいかなかったので Raspberry Pi3 ZERO(W) Alpine Linux(3.8.1)インストール と合わせて何とかうまくいった。
実際に行ったのは、結局、
2018年11月25日日曜日
Web:javascript が勝手に動くとき
サイトで DataTables 使って表を作り、行をクリックして選択、ボタンを押してその行に対する処理を行う処理を実装していた。FireFox の開発ツールを使ってステップ実行をしながらデバッグしていたのだが、ボタンの onClick で飛んできた直後にブレークポイントを入れたのだが、止まったと同時にすべての行が選択されてしまう現象が起きた。
最初はコードがおかしいのかと思ったのだが、どうも開発ツールを使っていないと現象が起きないっぽい。よくよく調べると[監視式]にすべての行が選択される式が書かれていた ><
datatable.rows().select() <- こんな感じ
使い方がよくわからなくていろいろ試していたのだが、こんなことが起きるとは...
最初はコードがおかしいのかと思ったのだが、どうも開発ツールを使っていないと現象が起きないっぽい。よくよく調べると[監視式]にすべての行が選択される式が書かれていた ><
datatable.rows().select() <- こんな感じ
使い方がよくわからなくていろいろ試していたのだが、こんなことが起きるとは...
2018年11月12日月曜日
Web:JS:一つしかないラジオボタンの状態を拾う方法
ラジオボタンが複数ある場合(フツーの状態)
しかし、ラジオボタンが一つしかないとき、この方法は使えない。クリックされていない状態でも value が返ってくる(複数あって一つも選択されていないときは value が "" となる)。
ラジオボタンの数が可変で一つのこともある場合は、一つの場合だけ処理を分け、value ではなく、checked (選択されていると true) で拾うのが吉。
上記ソースだと、ラジオボタンが一個の場合は
<form id="target">
<input name="hoge" type="radio" value="a"> A
<input name="hoge" type="radio" value="b"> B
<input name="hoge" type="radio" value="c"> C
</form>
// form要素を取得
var element = document.getElementById( "target" ) ;
// form要素内のラジオボタングループ(name="hoge")を取得
var radioNodeList = element.hoge ;
// 選択状態の値(value)を取得 (Bが選択状態なら"b"が返る)
var a = radioNodeList.value ;
if ( a === "" ) {
// 未選択状態
} else {
// aには選択状態の値が代入されている
console.log( a ) ;
}
(こちらのサイトのコードをお借りした)しかし、ラジオボタンが一つしかないとき、この方法は使えない。クリックされていない状態でも value が返ってくる(複数あって一つも選択されていないときは value が "" となる)。
ラジオボタンの数が可変で一つのこともある場合は、一つの場合だけ処理を分け、value ではなく、checked (選択されていると true) で拾うのが吉。
上記ソースだと、ラジオボタンが一個の場合は
// 選択状態の値(true)を取得
// value は最初から input 要素の value 属性が設定されている
var a = radioNodeList.checked ;
if ( a === false ) {
// 未選択状態
} else {
// 選択状態
}
2018年11月3日土曜日
Linux:Samba:Ubuntu18.04:とりあえず動く smb.conf 設定
何度やっても samba は嵌る ><
smb.conf を壊してどうにもならなくなった時
-> apt remvoe しても返ってこない。/usr/share/samba/smb.conf にオリジナルがある。
とりあえず以下の設定で共有ホルダーが使えるようになる
->[global] に以下を追加
元ネタはこちらとこちら
共有じゃないホルダーへのアクセスは、いまだできず ><
smb.conf を壊してどうにもならなくなった時
-> apt remvoe しても返ってこない。/usr/share/samba/smb.conf にオリジナルがある。
とりあえず以下の設定で共有ホルダーが使えるようになる
->[global] に以下を追加
unix charset = UTF-8120行目付近にある以下のコメントを外して有効に
dos charset = CP932
unix extensions = no
wide links = yes
map to guest = bad user
元ネタはこちらとこちら
共有じゃないホルダーへのアクセスは、いまだできず ><
登録:
投稿 (Atom)