サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
体力トレーニング
qiita.com/tetsu_koba
** 2022/05/13 新しい記事を書いたのでこちらを参照してください。 https://zenn.dev/tetsu_koba/articles/d931a843f16a4c ** 以降は古い記事。 以前に書いたラズパイ+momoでWebRTCで送信するときにマイクの代わりに音声ファイルを使用する と同じことをjetson nano でもやってみました。 オーディオループバックのカーネルモジュールのビルド なんと、jetson nano のカーネルではオーディオループバックのカーネルモジュール(snd-aloop.ko)が標準では入っていません。 そこで自分でこれをビルドします。 ビルドの手順は以下のページの手順にそってやって問題なくできました。 https://developer.ridgerun.com/wiki/index.php?title=Jetson_Nano/Devel
** 2021年6月26日の追記 ** ELP社のカメラの売れ筋のものは現在はamazonで購入できるようになっています。 ** 追記ここまで ** 最近いくつかの4K webcamを買って試したのでメモを残します。 2019年11月の情報です。 入手可能な4K webcam webcamといえばとてもたくさんのものが出回っているのですが、4K (3840x2160)の解像度で30fpsをだせるものとなると実はあまりありません。2万円くらいで購入可能なものは以下のものです。 ロジクール BRIO AliExpress で購入可能なELP社のUSBカメラ BRIOとELP社のカメラ3種の合計4機種を試したので、それぞれについてコメントします。 ロジクールBRIO まず最初にみつかる4Kのwebcam はこれだと思います。 価格が2万円超で同社のフルHDクラスのwebcamの倍しますが、画質は
linuxカーネルにはパフォーマンス計測のための機能がいくつか備わっています。その中でもperf topは使うのが簡単です。日常的にこれを使っていれば、あるプロセスの負荷が異常に高まった場合にその差に気がつくことができます。 インストール perf topは perf の一部なので、perfをインストールします。perfはカーネルのリリースに強く依存しているので、パッケージがカーネルのリリースごとに分かれています。 ubuntuの場合では、以下のようにすれば適切なパッケージをインストールできます。
ifconfig や ip address だとループバックなど複数のネットワークインタフェースの情報が表示されるので、そのうちのどれがインターネットに接続しているものなのかを特定するのがちょっと面倒。 いろいろ調べた結果、以下のようにするのがよさそう。
iPhoneの設定画面からインターネット共有をオンにして、ラズパイとUSBケーブルでつなぎます。 「このコンピュータを信頼しますか」と聞かれるので、「信頼する」を選択します。 これで、ラズパイからiPhoneを経由してインターネットに接続できるようになります。 他のシングルボードコンピュータで同様のことをするには ipheth-utils と libimobiledevice-utils およびこれらが依存しているパッケージをインストールします。 これは Debian パッケージ検索 で調べることができます。 また、Linuxカーネルには ipheth のカーネルモジュールが必要です。 tinkerboardでは以下のインストールでいけました。
ビルド中にファンが回るので、ちょっとCPUの温度が気になった。 準備 Ubuntu 18.04を使用しています。 $ sensors coretemp-isa-0000 Adapter: ISA adapter Package id 0: +75.0°C (high = +82.0°C, crit = +100.0°C) Core 0: +74.0°C (high = +82.0°C, crit = +100.0°C) Core 1: +74.0°C (high = +82.0°C, crit = +100.0°C) Core 2: +74.0°C (high = +82.0°C, crit = +100.0°C) Core 3: +75.0°C (high = +82.0°C, crit = +100.0°C) Core 4: +73.0°C (high = +82.0°C, crit
クロスDockerのためのDockerfileという記事を以前書いたのですが、現在のバージョンのdockerではDockerfileを書かなくてもすむようになっていました。 Ubuntu 18.04 を使用しています。 docker run を実行 $ docker run -it arm64v8/ubuntu:18.04 standard_init_linux.go:195: exec user process caused "no such file or directory"
シングルボードコンピュータをインターネットにつながらない環境で使っているとき、ntpdateで時刻合わせをする先がないので、時刻が1970年1月1日になってしまいます。これはあんまりなので、手元のUbuntu 18.04 でtime serviceを動かして、rdateコマンドで時刻合わせをできるようにしました。 ただしこの方法だと精度は1秒です。 time serviceを有効にする
先日の記事の続き。 RustでLinuxのinput eventをダンプする (bindgen使用) ビルド時にbindgenするように変更 bindgen users guide のチュートリアルに従って、cargoでビルドするときにbindgenを実行するようにbuild.rsを作りました。 そのソースコードはgithubに置きました。 クロスビルドに対応できるようにbuild.rs を修正 ARM64向けにクロスビルドするとbindgenでエラーが発生するようになりました。 クロスビルドのときには参照するシステムのヘッダファイルもそれに応じて変える必要がありますが、それがbindgenに伝わっていないのが原因です。 環境変数 SYSROOTが設定されている場合には、それを--sysroot=に反映させるようにbuild.rs を書き直しました。 extern crate bindge
前回Rustで作ったpipeをwebsocketにつなぐコマンドを使って、音声のストリーミングをしてみます。 準備 前回作ったものはgithubにソースを置いてあります。 Rustはデバッグビルドとリリースビルドでは実行速度にかなり差があるということなので、必ずリリースビルドしたものを使用してください。
以前、Golangから物理メモリを読み書きするという記事を書きました。似たようなことをRustでやってみました。ただし今回は /dev/mem をmmapするのでroot権限が必要です。 ソースコードはgistに貼りました。ここ 使用例 アクセスサイズ、物理アドレス、長さを引数で指定します。 アクセスサイズは 1,2,4,8 のいずれか。物理アドレスと長さは16進数です。 先頭に0xをつけてもつけなくてもOK。 # ./dump_pmem Dump physical memory by specified size. Usage: ./dump_pmem size address [len] where size={1,2,4,8}, address and len in hexadecimal. # ./dump_pmem 4 0x12030078 0x8 000000001203007
以前に、rustをインストールしてhello world をARM用にクロスコンパイルするまでの手順 という記事を書きました。 今回はrustcを直接実行するのでなくてcargoを使ってクロスビルドします。 準備 rustをインストールしてhello world をARM用にクロスコンパイルするまでの手順 の記事に従ってrust のtargetを追加します。今回はaarch64-unknown-linux-gnu。 cargoの設定 ~/.cargo/config に[target.aarch64-unknown-linux-gnu] の項目を追加してlinkerを指定します。今回はbuildrootでrootfsを作ったのでそのツールチェインのgccを指定します。このコマンドが実行できるように、必要に応じて環境変数PATHも変更しておきます。
以前、Linuxでネットワークインタフェースの活動状況を調べる by Golang という記事を書いたのですが、最近Rustを勉強し始めたので、同様のものをRustで書いてみました。 やっていること /sys/class/net/<network_if>/statistics/ から受信、送信の累計のバイト数がわかるので、周期的にそれを表示しています。 ソースをここに貼ります。 use std::env; use std::fs; extern crate chrono; extern crate schedule_recv; use schedule_recv::periodic_ms; fn read_transfer_bytes(f: &str) -> u64 { match fs::read_to_string(f) { Ok(s) => s.trim().parse().unwr
自宅に置いたラズパイ(つまり、NATの内側にあるのでインターネット側からは直接は見えないところにある。)を外からsshでログインできるようにしてみました。いろいろと応用できそうなので、ここに記録を残します。 概要 外からsshでログインできるクラウドの仮想マシンを用意して、それを経由してラズパイにアクセスできるようにします。 ラズパイが起動したら、そのクラウドの仮想マシンにSSHのトンネルを作るようにしておきます。 これで、いつでもクラウドの仮想マシンからラズパイにsshでログインできるようになります。 (気が向いたら図を描く) 準備 今回はクラウドの仮想マシンとしてAWSを使いました。 pemファイルでログインできるようにしておき、そのpemファイルをラズパイに置きます。 また、その仮想マシンのパブリックのIPアドレスは固定になるように設定しました。 ここではその仮想マシンをaws001
x86_64のUbuntuでC/C++のソースコードをARM/ARM64用にクロスコンパイルしてQEMUで実行する方法のまとめLinuxGCCARMQEMUarm64 はじめに x86_64のLinux上でQEMUを使ってarm用の実行ファイルを動かす方法は以前に書いたことがあるのですが、最近は「マルチプラットフォームのライブラリをビルドしたときにCIを回す」というユースケースが出てきたので再度まとめてみました。 題材とするソースコードはこれ。
前回のffmpeg 4.0 をlibsrtを有効にしてビルドするの続き。 ffmpeg 4.0のlibsrtのサポート。軽い気持ちで試して見ようとしたら、いきなりバグを踏んだらしい。試行錯誤の末、ffmpeg側にパッチをあてることで動いた。本来ならバグレポートするところだけど、現状あまりにSRTのことをわかっていないので、とりあえずブログにメモを残そう。 — 組み込みの人。 (@tetsu_koba) 2018年4月27日 SRTとは "SRT is an open source video transport protocol and technology stack that optimizes streaming performance across unpredictable networks with secure streams and easy firewall traver
Golangではシステムコールのmmapを使用することができるので、/dev/mem かUIOで作成した/dev/uioX をmmapすれば物理メモリを読み書きすることができます。 ここではUIOを使った例を紹介します。 UIOのデバイスを登録する UIOについてはこの記事を参照してください。 LinuxのUIO(User space I/O) その1 この記事に従って、/dev/uio0 が作成できたとして、次にそれをGolangで書かれたプログラムからアクセスする方法を示します。 Golangのサンプルプログラム ソースコードはgistに置きました。ここ func mmapRegs32(addr uint32, n int) []uint32 { file := "/dev/uio0" f, err := os.Open(file) if err != nil { log.Fatal(
動機 dockerのようなコンテナでは通常のLinuxシステムではinitなどがやってくれる処理をdocker自体が面倒を見てくれる。実際にどこまでやってくれるのかを調べるために、busybox一個だけを含むイメージを作って動かして、どんなファイルが自動生成されているのか調べた。 使用したdockerは、Ubuntu 16.04 で sudo apt install docker.io でインストールしたもの。 $ docker version Client: Version: 1.13.1 API version: 1.26 Go version: go1.6.2 Git commit: 092cba3 Built: Thu Nov 2 20:40:23 2017 OS/Arch: linux/amd64 Server: Version: 1.13.1 API version: 1.26
gokrazy を試してみました。 gokrazyとは https://gokrazy.org/ "gokrazy is a pure-Go userland for your Raspberry Pi 3 appliances" Linuxのユーザーランドをinitから全てまるごとgolangで書いてあるシステムで、しかもコマンド一発でRaspberry Pi 3用にビルドして、ブートするSDカードを作成してくれます。 Quick startの手順通りにSDカードを作って動作することを確認しました。 (ただし、host名gokrazyの解決ができなったので、別の方法でラズパイのIPアドレスを特定してIPアドレス直接指定で、そこで動くWebサーバに接続しました。) びっくりする小ささ SDカード上に作られたルートファイルシステムを見てみました。 $ df -h . Filesystem S
組み込みのLinuxの開発で時々ある話。 まっさらの仮想マシン(ubuntu 16.04) にビルド環境をセットアップしようとしたら、SoCベンダーの提供するバイナリのツールチェインが動かない。 実行ファイルは確かに存在するのに、なぜか No such file or directory ?? $ ls -l ./arm-xxxxx-linux-gnueabi-gcc -rwxr-xr-x 1 root root 1897163 Jan 25 03:36 ./arm-xxxxx-linux-gnueabi-gcc $ ./arm-xxxxx-linux-gnueabi-gcc -bash: ./arm-xxxxx-linux-gnueabi-gcc: No such file or directory
最初に結論 logのタイムスタンプをマイクロ秒単位にするには、log.SetFlags(log.Lmicroseconds) を実行しておけばよい。 https://golang.org/pkg/log/#pkg-constants 例 デフォルトのlog package main import ( "log" "time" ) func main() { count := 0 for { time.Sleep(100 * time.Millisecond) log.Printf("count=%d\n", count) count++ } } $ go run a1.go 2018/01/22 10:58:34 count=0 2018/01/22 10:58:34 count=1 2018/01/22 10:58:34 count=2 2018/01/22 10:58:34 count
マイコン開発でハマったことを書いておく。2度同じミスをしないため。 マイコンが一つ増えると考えるべき状況が格段に増して難易度が高くなる SoC+マイコン1個 からSoC+マイコン2個に増えたときの難易度の増加を甘くみてはいけない。 相手の電源が入っていない時やハングアップしたときのリカバリ、共有すべき情報の同期のことを考えよう。 マイコンの個数は少ないほうがよい。もちろん増やさざるをえない場合もある。その場合は油断しないで覚悟しよう。 ピン数が足りないためにデバッグ用のポートをつぶしてしまうと開発がつらい フルカラーLEDを3つつけるとそれだけでGPIOポートが9つ必要になる。 部品コスト削減のためにピン数の少ないマイコンを使用し、デバッグ用のポートもGPIOに流用せざるをえないこともある。 マイコンのソフトはそれほど複雑なことはやっていないとはいえ、デバッガがつながらないと想定通りに動か
Golangの実行ファイルはサイズが大きい Golangはスタティックリンクされた実行ファイルを生成します。そのため実行ファイルのサイズは大きくなります。 ストレージの容量が十分あれば、これはとるに足らないことなのですが組み込みLinuxではストレージにNANDフラッシュメモリを使用していて容量が少ないこともあります。 残り容量が30MBしかないところに、3MBくらいの実行ファイルがぽんぽん増えていったりするとかなりつらい状況になります。 まずはひとつのファイルサイズを減らす go buildのときに不要なシンボルを削るオプションをつけます。 組み込みLinuxを使っている人なら通じると思うのですが、いわゆる「busybox方式」です。 Golangで書かれた複数のプログラムをひとつの実行ファイルにリンクしてしまいます。これによって重複して使用されているライブラリの分のサイズが削減できます
一年近く、組み込みLinuxでのユーザープロセスをgolangで書くことを試していたのですが、これはいける! という感触を持ちました。 仲間を増やしたいと思うので、ここにその情報を紹介します。 #何をしたか 既存の製品をベースにして、新機能の実装をGolangで書いてみました。 既存の部分はCで書いてあります。Golangで書いた新機能部分は別プロセスになっています。 既存部分とのやりとりは場面によって以下を使い分けました。 cgoによる関数呼び出し UNIXドメインソケットの通信 シグナル Golangで書いた部分には以下の要素を含みます。 UARTやi2cで接続されたセンサーからデータを受け取る インターネット上のWebサービスのAPIを使用する 2Dグラフィックスの描画 (cairoを使用) 最大性能を目指すよりも、十分な性能を手早く形にすることを重視しました。 #Golangでよか
はじめに 組み込みLinuxで開発していると、カーネルでなくてユーザープロセスから物理メモリ空間上のレジスタを読み書きしたい場面が出てきます。 これは /dev/mem を使えば実現できるのですが、制限事項があります。 /dev/memの読み書きにはroot権限が必要。 逆にroot権限で/dev/memをアクセスすると際限なく全てのメモリにアクセスできてしまうので、セキュリティの観点で難あり。 例えば、Androidではアプリケーションのプロセスはroot権限を持っていないので/dev/mem は扱えません。 指定した範囲のメモリだけ、指定した権限でアクセス可能にできればいいのになあ。 それ、UIOでできます。 UIOとは UIO(User space I/O)は、デバイスドライバの大部分をユーザー空間側で書けるようにするインタフェースです。カーネル側に書かなければならないコードはほんの
前回の続き。 従来のremoteモードではできなくて、extended-remoteモードで可能になったこと それは、gdb側からの操作で新たなデバッグ対象プロセスを起動することです。つまり run コマンドの実行。 また、デバッグ対象プロセスをまだ起動していない状態で、gdbとgdbserverの間でファイルを転送することができます。 この2つを合わせると、「修正された実行ファイルをターゲットに送信して、それを起動してデバッグを開始する」というのがgdb内で完結できます。 リモートデバッグのサイクル 以下の1-5を繰り返す。 ソースコードを修正する コンパイル、リンクして実行ファイルを作成する 実行ファイルをターゲットに転送する 実行ファイルを起動する ブレークポイントをかけたり、変数を見たりしてデバッグ 従来のremoteモードでは3はscpで転送したりNFSにしたり別の方法での実現が
gdbからgdbserverに接続してリモートデバッグするときに従来のremoteモードに加えて、extended-remoteモードが使用できます。 従来のremoteモードとextended-remoteモードの比較 remoteモードではgdbserverを起動する段階でどのプロセスをデバッグ対象とするのかを決める必要がありました。(新たにプロセスを起動するか or 実行中のプロセスにアタッチするか) そして、デバッグが終了してgdbとgdbserverの間の通信が切れた段階でgdbserverのプロセスは終了していました。 extended-remoteモードではデバッグ対象を決めずにgdbserverを起動させておくことができ、gdbと接続した後にデバッグ対象のプロセスを決めてアタッチすることができます。またデタッチした後もgdbserverは生き続けて、再度同じまたは別のプロセ
このページを最初にブックマークしてみませんか?
『@tetsu_kobaのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く