non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

High Sierraに2台のMacをアップデートした

こんばんは、久しぶりに、多摩六都科学館に子供たちと行ってきました。プラネタリウムでは長男、次男ともわりと無難に過ごせてました。@kjunichiです。

背景

あんまり、積極的にHigh Sierraにアップデートしても、メリットが感じられないものの、 どうせ、そのうちアップデートするのなら、今やっちゃえwみたいなノリで、 Mac mini late2014とMacBook Pro retian 2012Midの2台をHigh Sierraにしようとした

Mac miniはノントラブル

MacBook Proはやばかった

FileVaultをLionの段階ですぐに導入しており、High SierraでのAPFSへの移行でトラブってる ツイートを見かけていたものの、まぁSSDの容量もひっ迫しており、ダメなら、まっさらにして 入れてもいいかぁ。。と

再起動しろ!と言われても。。

関連記事

8年前の記事

4年前の記事

iOS11でWebRTCがiPhoneのSafariで使えるのか試した

おはようございます。最近、長男は依然と別人のように、物事をテキパキとこなすようになってきたのですが、要領のよかった次男が逆に、ダラダラ、グズグズな状態が続いてます。@kjunichiです。

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

背景

数年前に、WebRTCの存在を知り、ブラウザ上でWebカメラから映像を取得できるという ので、一時期ハマっていた。

WWDCあたりで、SafariがWebRTCに対応するらしいとの情報を目にしたが、懐疑的であった。 どうせ、Mobile Safariでは使えないとかのオチだろうと思っていた。

以前のURLでWifiの設定画面開けたのを無効にされたことをいまだに根に持っており、 この辺り、アップルを信用していないw。

やってみた

APIがプロミスベースの今どきのWebRTCを使う必要がある

videoタグに付けなければいけない属性がある

github.com

video.setAttribute("playsinline", true);

背面カメラを使うには

成果物

速度的にどうなんだろ?ってことで、大昔作った、顔検出するコードをベースに、 顔検出するページを作って動かして、その様子をiOS11で新たに追加された録画機能で動画を撮ってみた。

youtu.be

ソースコード

上の動画のコードは以下に置いた。

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

関連記事

13年前の記事

10年前の記事

9年前の記事

6年前の記事

5年前の記事

RustでWebカメラの映像をコマンドプロンプトに出すコマンドを作った

おはようございます。以前は、兄より、さっさとご飯を食べていた次男でしたが、最近は、だらだら食べて、最後には食べさせろと言ってくる始末。@kjunichiです。

背景

昨年末にWindowsな自作PCをリニューアルして以来、あれこれ、Windowsでやっている。だいぶ、いい感じにやりたいことが 多少出来るようになってきた気がしている。

そんな日々を過ごす中で、WindowsでもRustでFFIのやり方が分かった。

今年はRustの勉強会にも参加したし、なにか自作したかった。

Webカメラの画像をコマンドプロンプトに表示する

構成

作って学んだこと

WindowsでのFFI

MSVC版はなんとなく、libファイルが必要な雰囲気がしていたので、これを用意して、かつ、環境変数LIBにこのlibファイルのパスを追加して試したら、 あっさり動いた!この辺32ビットだと呼び出し規約の指定が必要かもしれない。

extern "system" {
}

とすれば、良さそう。(32ビットな2-wayタブレットPCが奥さんに占領されてて、試せてない)

また、動かす際は必要なDLLがパス上に存在している必要がある。

この辺は、別の処理系でFFIしていれば、体験していることかとも思う。

FFIなクレートの構成

glfw-rsを参考に見よう見まねでやってみた。

CのAPIを叩く部分はffiというフォルダを作成し、この中に以下のファイルを作成しているようだったので、 これをまねた。

  • mod.rs
    • .soや.dllから使う関数を記述
  • link.rs
    • OS毎のリンク方法

C的なポインタ操作が分からなかったので#removeで実装した。。

OpenCVのC APIのcvImageEncode関数でCvMat構造体経由でPPM(P6)形式のデータが取得できるが、そのPPMヘッダ部の解析を 慣れないRustでやってたっぷりとコンパイルエラー時のメッセージでコードの書き方を勉強させられた。が、 ビルドを通せても意図した動きにならなかった。これは、ポインタ操作の実装をRustでは実際に要素をremoveするなど、実装自体を大きく変更させていた 為、バグが混入してしてまった。。

まぁ、なんとか、バグを修正して、意図した通り、PPMヘッダの解析を行うことが出来た。

C言語なら、

tmpbuf = &tmpbuf[index];

というように、index分ずらしたアドレスを参照できるのだが、ちょっとRustでのやり方が 分からず、実際のポインタの実体の要素を削除するという実装で実現した。

for i in 0..index {
(*tmpbuf).remove(0);
}

動いた!

例によって、デスクトップを撮影して、そのキャプチャを動作確認記録として貼り付けてみた。

youtu.be

成果物

github.com

まとめ

Rustは当初はMinGW版だったが、その後、MSVC版がデフォルトになっている。 Goからは直接DLLを生成できないが、ひと手間かけて、DLL化することで、前回はmrubyから、そして 今回はRustから呼び出せた。

Webカメラから画像を取得する処理は非推奨のC APIを使ってやってしまっているが、cv-rsなるRust向けのライブラリが あり、こちらはC++ APIをつかっている。ただし、build.rsでgccクレートを使っているので、たぶんMSVC版のRustでは 動かせない。cl.exeで付属のC++ラッパーをビルドする処理を書けば理屈の上では動かせるハズ。 (どうやら、gccクレートはMSVC環境ではcl.exeをCコンパイラとして使う模様)

今回は#removeして実際に要素を減らしてポインタ操作の代用をしてしまったが、近いうちにこの辺りのRustでのポインタ操作を覚えたい。

f:id:kjw_junichi:20170921064458p:plain

関連記事

1年前の記事