Rust lopdf②

e-tipsmemo.hatenablog.com
の続き。

lopdfであるページのリファレンス番号を列強することはできたので、
その中からstreamを持つものだけを抽出したい。

ページ1から参照されているオブジェクトを一つずつ見ていく。

get_object()で番号が参照するオブジェクトを得られるが
そのオブジェクトはいろいろなものを内包している可能性があるので
streamの時だけVecに入れるようにした。

あとはstreamからBT ~ ETを抜き出す?

PDF構造解説

PDF構造解説

Adobe Acrobat DC ? PDF Readerそのほか

Adobe Acrobat DC ? PDF Readerそのほか

Rust lopdf

RustでPDFを弄くろうと思ったのでlopdfというライブラリを利用した。
まず前提として、PDFのフォーマットをちょっとしらないと意味ないので。

PDF 構文 -ファイル 解析手順-
とか
詳細PDF入門 ー 実装して学ぼう!PDFファイルの構造とその書き方読み方 - プログラムモグモグ
を斜め読

PDFのstreamの内容がFlateDecodeされていると面倒なので

pdftk test.pdf output test2.pdf uncompress

を行った

最終的にはテキストを抜き出したい
(pdftotextを試したがうまく行かなかった。)

[dependencies]
lopdf = "0.19.0"
extern crate lopdf;

use lopdf::content::{Content, Operation};
use lopdf::Object::*;
use lopdf::{Document, Object, Stream};
use std::str::from_utf8;

fn main() {
    let doc = Document::load("test2.pdf");
    let test = match doc {
        Ok(a) => a,
        Err(_) => panic!("load error"),
    };

    let pages = test.get_pages();
    let id = pages.get(&1).unwrap();
    let contents = test.get_page_contents(*id);
    println!("Refered from Page 1\n{:?}", contents);
}

ページ1から参照されているオブジェクトの番号がVecで得られるが
そのオブジェクトもまたどこかのオブジェクトを参照している可能性がある

pub enum Object {
    Null,
    Boolean(bool),
    Integer(i64),
    Real(f64),
    Name(Vec<u8>),
    String(Vec<u8>, StringFormat),
    Array(Vec<Object>),
    Dictionary(Dictionary),
    Stream(Stream),
    Reference(ObjectId),
}

とのことなので
ObjectのArrayなら順番にその先を見に行って
streamならそれを取り出すように、たぶん再帰的な実装が必要?

Ryzen 録画サーバー 電力測定②

e-tipsmemo.hatenablog.com
の続き・・・・・



だが、Raspberry piで何度bluetoothctlを利用してWattcheckerに接続し直しても
一向にserialportサービスが見えない・・


結局OSをRaspberry pi Stretchに変えたらうまくいってしまった・・・

www.raspberrypi.org
まえはJessieだったかをインストールしていたはず。
前のOSでは

sdptool browse YY:YY:YY:YY:YY:YY

としても。

sdptool なんとかかんとか host is down

とエラーがでて相手のデバイスが公開しているサービスが確認できなかった。

OSを変えたところ

sdptool browse YY:YY:YY:YY:YY:YY
Browsing YY:YY:YY:YY:YY:YY ...
Service RecHandle: 0x10001
Service Class ID List:
"PnP Information" (0x1200)
Protocol Desc....

とすんなり見ることができた。

結局

sdptool browse YY:YY:YY:YY:YY:YY | grep -i serial

sudo sdptool browse local | grep -i serial

の両方を試して、両方にserial portサービスが出てくればOK
そのためにはbluetooth.serviceをcompatibleオプションで起動するとか
sdptool add SPするとかが必要になってくる
エアコンの消費電力をRaspberry Pi 3B+とBluetoothワットチェッカー REX-BTWATTCH1で常時モニタリング。電圧・電流・電力もグラフ化! | IoT PLUS
ここに書いてあるとおり。

f:id:katakanan:20181031023251p:plain

いとも簡単にできてしまった。。。

つぎは、データをうまいこと自作ソフトウェアで取得できるようにしたい。

注意

Raspberry pi zero Wだとbluetooth LE (BLE)が乗っていて普通のBluetooth 4.0とかではないらしいので
Serial Port プロファイルはないらしい。
そのかわりGATTというBLE用のプロファイルは普通に使える。
また、このWattcheckerも一応BLEに対応しているらしいので
GATTを介した定期的なデータ取得は可能かもしれない。

が普通にBluetooth4.0などを使ったほうがはるかに楽かもしれない。

Ryzen 録画サーバー 電力測定①

e-tipsmemo.hatenablog.com
e-tipsmemo.hatenablog.com

録画サーバーをたててエンコも自動にする目論見があるが、
気になるのは消費電力。

常時起動させておくとしても電気を食いそうなので測りたい。
またエンコードもH265でやりたいと考えているが、
エンコードに時間がかかるとその際の消費電力を測っておきたい。

そこでリモートで電力が測れる手段を考えて以下のものを買った

Bluetoothスマホからログを得られるようだが、
ハナからスマホからの利用などは考えていない。

Raspiを使えばBluetoothにつなげるし、さらにWifi経由でアクセスもできる。


そのほかもろもろを購入して全体構成図は以下のようになる予定
f:id:katakanan:20181021162553p:plain

やることはここと同じ
https://iot-plus.net/make/raspi/24h-watt-monitoring-using-rex-btwattch1/

準備

RaspiのSSHを繋げる。

bluetoothをONにする

pi@raspberrypi:~ $ bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX raspberrypi [default]
[bluetooth]# power on
Failed to set power on: org.bluez.Error.Blocked
[bluetooth]#

なんかエラー出た。

pi@raspberrypi:~ $ sudo rfkill unblock bluetooth

を行ったらうまくいった。
How do I solve Failed to pair: org.bluez.Error.... |Intel Communities

pi@raspberrypi:~ $ bluetoothctl
[NEW] Controller XX:XX:XX:XX:XX:XX raspberrypi [default]
[bluetooth]# power on
Changing power on succeeded
[bluetooth]#

[bluetooth]# power on
Changing power on succeeded
[bluetooth]# agent on
Agent registered
[bluetooth]# scan on
Discovery started
[CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes
[NEW] Device YY:YY:YY:YY:YY:YY WATT CHECKER
・・・・
その他のデバイス
・・・・
[bluetooth]#

ペアリングする

MACアドレスを入れる

[bluetooth]# pair YY:YY:YY:YY:YY:YY
Attempting to pair with YY:YY:YY:YY:YY:YY
[CHG] Device YY:YY:YY:YY:YY:YY Connected: yes
[CHG] Device YY:YY:YY:YY:YY:YY UUIDs:
・・・・・・・UUIDが表示される・・・・・・
[CHG] Device YY:YY:YY:YY:YY:YY Paired: yes
Pairing successful
[bluetooth]#

なんかPINコードの入力を求められなかった。

[bluetooth]# trust YY:YY:YY:YY:YY:YY
[CHG] Device YY:YY:YY:YY:YY:YY Trusted: yes
Changing YY:YY:YY:YY:YY:YY trust succeeded

[bluetooth]# info 00:0C:BF:29:7C:B0

で情報が取得できていたらOK

exit

で終了。

ワットチェッカーがでかいので壁コンセントがふさがらないように
以下のようなものをつなげて壁から離している。

PX-W3PE4 備忘録

e-tipsmemo.hatenablog.com
この続き。
PX-W3PE4でTS抜き

デコーダ

DScalerをインストールした。

BonDriverインストール

00371のダウンロード
Win->Cmd右クリック→管理者権限で起動
f:id:katakanan:20181007180147p:plain

TVTestを用意

ビルド/ダウンロードなど
PT3 / TVTest のインストールと設定方法 | 積水成淵日記
ビルド済みもあるが、0.9.0_developじゃうまくいかなかったので
0.7.23(x86)がそれなりに安定しているらしい。

BCASカード

なんとかする

BonDriver_BDA/BDASpecial-IT35

PX-W3PE4でradi-sh版BonDriverを使う
20180818Verを使った。
Releases · radi-sh/BonDriver_BDA · GitHub

  • BonDriver_BDA.dll

をコピー&リネームして

  • BonDriver_PX_W3PE4_S0.dll
  • BonDriver_PX_W3PE4_T0.dll

Releases · radi-sh/BDASpecial-IT35 · GitHub

  • BonDriver_PX_x3U4_S.ini
  • BonDriver_PX_x3U4_T.ini

をリネームして

  • BonDriver_PX_W3PE4_S0.ini
  • BonDriver_PX_W3PE4_T0.ini

この **.ini の中身で赤線のところを書き換える。
PXW3PE4
PX-W3PE4
f:id:katakanan:20181007214348p:plain
あとは
BDASpecial-IT35-2018-08-18\x86_ランタイム内蔵版\IT35.dll

TVtest

  • BonDriver_PX_W3PE4_S0.dll
  • BonDriver_PX_W3PE4_T0.dll
  • BonDriver_PX_W3PE4_S0.ini
  • BonDriver_PX_W3PE4_T0.ini
  • IT35.dll

をTVTest直下に入れる。

TVTestを起動すると、
デコーダ/レンダラ/カードリーダーを設定する。
レンダラは環境によって設定が違うかもしれないらしい
EVRを選択した。

その後
設定→チャンネルスキャン
を行う

その他

TVTest_0.9.0_develop_x86
でも試したが、なぜかスクランブルエラーがでた
(右下のD / E / S →Drop / Error count / Scramble)

PX-Q3PE4だと地デジ4+BS/CS 4が見れるが
パソコンのスペックや、HDDへのアクセスが遅いと録画時にDropする可能性が高いらしい

PLEX 地上デジタル・BS・CS対応TVチューナー PX-W3PE4

PLEX 地上デジタル・BS・CS対応TVチューナー PX-W3PE4

PLEX 地上波デジタル・BS/CS対応TVチューナー PX-Q3PE4

PLEX 地上波デジタル・BS/CS対応TVチューナー PX-Q3PE4

ubuntu ocaml install & test

メモ
環境はWSL上で
Ubuntu 16.04
fish shell

install

sudo apt install ocaml

f:id:katakanan:20181002222533p:plain
OK

Syntax Highlight

sudo apt install opam
opam init

opam initをするとインストールされているshellに応じて、
自動で設定を行うか聞いてくる。
f:id:katakanan:20180930175346p:plain
最後に以下を実行しろと言ってくる
fishなら

eval (opam config env)

config.fishなどに書いておく

これだけでsyntax highlightは完了する。
(syntax onにしていれば)

f:id:katakanan:20181002223240p:plain
(これでいいのかな??)

これから試していく

LTspice BJT simulation

使いたくなった時に使い方を忘れていると困るので
LTspiceの使い方をメモっておく。

とりあえず
modelの追加方法と、
基本的なシミュレーション
パラメータを利用

モデルの利用

ライブラリから目的の部品を探すのが面倒だといつも思っていた。が。
f:id:katakanan:20180927192604p:plain
Spice Directiveで直接指定することができるとは知らなかった。
f:id:katakanan:20180927192830p:plain

.model 2SC1815-GR NPN(Is=2.04E-15 Xti=3 Eg=1.11 Vaf=100 Bf=300 Ne=1.5 Ise=0
+ Vceo=50 Icrating=150m mfg=TOSHIBA
+ Ikf=200m Xtb=1.5 Br=3.377 Nc=2 Isc=0 Ikr=0 Rc=1 Cjc=1p Mjc=.3333
+ Vjc=.75 Fc=.5 Cje=25p Mje=.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0)

シミュレーション指定

Spice Directiveで .[文字列]とするとコマンドになる。
f:id:katakanan:20180927193355p:plain
例えばdcシミュレーションでV1を0.01Vから0.8Vまで0.05V刻み

.dcまで書いてから右クリックするとGUIで編集できるようになる。
f:id:katakanan:20180927193453p:plain
こっちからもできる。

電圧源・電流源

回路を作った。
f:id:katakanan:20180927193522p:plain
ここでハマったのは、電流源電圧源になんか種類があることである。
f:id:katakanan:20180927193752p:plain
bvもvoltageもvoltage sourceなのだが、DCを出せて、.dcで指定できるのはvoltageのほう。
ここで間違えてbvを使う、または
currentと間違えて、biを使うと、
ltspice dc sweep source not found
とか
Unlabeled value in: "b§ib 0 n002 0 " -
とかでる。

パラメータスイープ

ここでは、複数のIBの値で試したい。
f:id:katakanan:20180927194153p:plain
IBはI1の変数{IB}に対応している。
f:id:katakanan:20180927194456p:plain

Run

f:id:katakanan:20180927194542p:plain
お馴染みのグラフ

LTspiceは幾度か使おうとしたことがあるが
なんだか操作が独特であまり真面目につかったことがなかった。

マイクロストリップラインのシミュレーションとかもできるのかな(?)