nRF51822搭載 Bluefruit LE Sniffer

スイッチサイエンスで販売されているこれ。
nRF51822搭載 Bluefruit LE Sniffer - スイッチサイエンス

これを Debian で使うに際してのインストールメモ。Debian 9.9x64 で動かしました。

確認しておくこと

$ python --version
Python 2.7.13

先だってインストールしておくもの

ダウンロードとインストール

ここから nRF Sniffer - Downloads - nordicsemi.com
「nRFSniffer v2 - Multi-platform」をダウンロードしてunzip して

/usr/lib/x86_64-linux-gnu/wireshark/extcap/

にコピー。

$ unzip nrfsniffer200beta312oct20181c2a221.zip
$ sudo cp -r \
    extcap/nrf_sniffer.py extcap/SnifferAPI/ \
    /usr/lib/x86_64-linux-gnu/wireshark/extcap/
$ sudo chown +x /usr/lib/x86_64-linux-gnu/wireshark/extcap/nrf_sniffer.py
$ sudo /usr/lib/x86_64-linux-gnu/wireshark/extcap/nrf_sniffer.py 
No arguments given!  //=> OK

Wireshark を起動して nRF Sniffer: /dev/ttyUSBx を選択

$ sudo wireshark

\(゚∀゚)/

自宅向けdnsmasq

dnsmasqを自宅向けに使うメモ。

  • 外のDNS : 8.8.8.8
  • gateway IP : 192.168.0.1
  • サーバーIP : 192.168.0.8/16
  • 自宅ドメイン : homenetwork.local

Uninstall

NetworkManagerとかAvahiとかは全部消す。

Debianの非デスクトップインストールあたりから始めよう。

 

/etc/network/interfaces

static-IPに設定。

auto lo
iface lo inet loopback

auto enp2s0
iface enp2s0 inet static
    address 192.168.0.8
    netmask 255.255.0.0
    network 192.168.0.0
    gateway 192.168.0.1
    dns-search homenetwork.local

/etc/resolv.conf

自分→外 で設定。

dnsmasq がリレーの為に resolv.conf を参照するが、自分のIPの nameserver はスキップする。

domain homenetwork.local
search homenetwork.local.
nameserver 192.168.0.8
nameserver 8.8.8.8
search homenetwork.local

/etc/dnsmqsq.conf

listen-address=192.168.0.8      # listen address for DNS
interface=enp2s0                # listen interface for DHCP
no-hosts                        # skip /etc/hosts
#no-resolv                      # skip resolv.conf ... skipすると 8.8.8.8 へリレーしなくなる
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
ipset=/yahoo.com/google.com/vpn,search
domain=homenetwork.local
expand-hosts

dhcp-range=192.168.0.100,192.168.0.199,255.255.0.0,12h

dhcp-option=option:netmask,255.255.0.0
dhcp-option=option:router,192.168.0.1
dhcp-option=option:dns-server,192.168.0.8
dhcp-option=option:domain-search,homenetwork.local

# 固定IP
address=/dnsmasq.homenetwork.local/192.168.0.8

# DHCPによる固定IPの貸し出し, ホスト名を指定
dhcp-host=xx:xx:x:x:x:x,www,192.168.0.9,12h

# DHCPによる動的IPの貸し出し, ホスト名を指定
dhcp-host=xx:xx:x:x:x:x,www,,12h

その他は dnsmasq インストール直後の /etc/dnsmasq.conf を参照しよう。

RenderTextureをOpenCvSharp,Matに取り込む

一旦 Texture2D を経由させる必要があるようです。
かつ、その経由のさせ方がトリッキーです。

private RenderTexture _renderTexture = new RenderTexture(256, 256, 0, RenderTextureFormat.ARGB32);

void Update()
{
    Texture2D tex = new Texture2D(_renderTexture.width, _renderTexture.height, TextureFormat.RGB24, false, false);

    // 現在のフレームバッファを取り込みたい RenderTexture に切り替えて
    RenderTexture.active = _renderTexture;
    // 取り込んで
    tex.ReadPixels(new UnityEngine.Rect(0, 0, tex.width, tex.height), 0, 0);
    tex.Apply();
    // 戻す
    RenderTexture.active = null;

    // Matに取り込む
    Mat srcMat = new Mat(tex.height, tex.width, MatType.CV_8UC3, tex.GetRawTextureData());
}

VMWareWorkstationを使ってwindows から docker を使う

普段 VMWareWorkstation を使っていて VirtualBoxHyper-V を使いたくない人向けです。

  • Windows Professioanl であれば Hyper-V が使えるのでそっちの方が良いでしょう。
  • VirtualBoxを使っている人は Docker Toolbox を使いましょう。

参照元:


1. Chocolatey を入れる
管理者権限の cmd.exe から

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"


2. docker, docker-machine, docker-machine-vmwareworkstation を入れる
続けて管理者権限の cmd.exe から

choco install -y docker  
choco install -y docker-machine  
choco install -y docker-machine-vmwareworkstation  


3. VMWareWorkstationにdocker-vmを作る
cmd.exe から

docker machine --native-ssh create -d vmwareworkstation default


4. dockerコマンドをdocker-vmへ向ける設定
普段使いが cmd.exe であれば cmd.exe から

docker-machine env

で表示される最後の行を実行するようにします。

 @FOR /f "tokens=*" %i IN ('"C:\ProgramData\chocolatey\lib\docker-machine\bin\docker-machine.exe" env') DO @%i

普段使いが bash であれば bash から

eval $(docker-machine env)

を実行するか ~/.profile にでも書いておきましょう。


5. VMの設定を変更する
VMは %USERPROFILE%.docker\machine\machines\default に作られます。
VMWareWorkstationのGUIには登録されないので必要なら default.vmx ファイルをドロップして追加します。
デフォルトでは

  • メモリ: 1GB
  • CPU: 1コア

で構成されているので、適宜変更します。


6. VMの共有フォルダ設定を変更する
デフォルトでは C:/Users が Users (VMからは /mnt/hgfs/Users) として設定されています。
今回の方法でインストールした場合、Windowsのフォルダをhgfs経由で参照するパス変換がされていないので、VM自体を調整します。
調整しなくても以下のように指定することはできます。

$ docker run -it --rm -v //mnt/hgfs/Users://mnt:ro busybox ls //mnt
<C:/Users/ の内容が ls される>


6.1. VMの共有フォルダ設定を追加する
ドライブCを c (小文字)で追加します。
ドライブDを Volumeオプションに指定する場合は、ドライブDを d (小文字)で追加します。


6.2 VMシンボリックリンクを作る
default VMを開くと /mnt/hgfs に Users/, c/ (, d/) がある筈です。
/mnt/hgfs/c がドライブC, /mnt/hgfs/d がドライブD です。
これらをルートから参照できるようにシンボリックリンクを張ります。

$ cd /
$ ln -s /mnt/hgfs/c /
$ ln -s /mnt/hgfs/d /


6.3 Volumeオプションで指定してみる
これで /c/Users/ の形(MinGW-bashのパス指定と同じ)で指定できるようになります。
MinGW-bash からであれば以下のように記述できます。

$ docker run -it --rm -v //c/Users/suzumura://mnt:ro busybox ls //mnt
<C:/Users/suzumura/ の内容が ls される>

$ docker run -it --rm -v //d://mnt:ro busybox ls //mnt
<D:/ の内容が ls される>

全てのパス指定を // で始めているのは、MinGW-bash のパス文字列変換を避ける記述です。


Enjoy !

dynamic link libraryを実行ファイルのそばに配置する

Windowsの場合EXEと同じ場所にDLLを置けば、PATHが通って無くてもそのDLLが動的リンクされます。
Macの場合はどうするかのメモ。

DYLD_LIBRARY_PATH や DYLD_FALLBACK_LIBRARY_PATH を指定する余地があるなら不要な話です。


例えばopenCVのdylibをリンクしようとしている場合、otoolでみると以下の様になります。

$ otool -L sample
sample:
	lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	lib/libopencv_imgcodecs.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

これを

$ install_name_tool \
  -change lib/libopencv_core.3.0.dylib @executable_path/libopencv_core.3.0.dylib \
  -change lib/libopencv_imgcodecs.3.0.dylib @executable_path/libopencv_imgcodecs.3.0.dylib \
  sample

$ otool -L sample
sample:
	@executable_path/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	@executable_path/libopencv_imgcodecs.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

とすることで「sample と同じ場所にある libopencv_*.dylib」になります。

・・・しかし上の場合は libopencv_imgcodecs.3.0.dylib が libopencv_core.3.0.dylib に依存しています。

$ otool -L libopencv_imgproc.3.0.dylib 
libopencv_imgproc.dylib:
	lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	lib/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)      #<=コレ
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)

そこでこれらも再帰的に @executable_path に置き換えます。

$ install_name_tool \
  -change lib/libopencv_imgproc.3.0.dylib @executable_path/libopencv_imgproc.3.0.dylib \
  libopencv_imgproc.3.0.dylib

$ otool -L libopencv_imgproc.3.0.dylib
libopencv_imgproc.3.0.dylib:
	lib/libopencv_imgproc.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	@executable_path/libopencv_core.3.0.dylib (compatibility version 3.0.0, current version 3.0.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)


再帰的に処理する部分が厄介なので「カレントディレクトリに集めておいてまとめて更新」するスクリプトを書きました。
https://gist.github.com/suzumura-ss/01d6e0f42234d3110ea1

Ubuntu12でObj-Cを叩いてみる

多少癖があったのでメモ。
このあたりを参考に...

install

以下の2つ。Obj-CコンパイラとNSObjectのライブラリ。

$ sudo apt-get install gobjc libgnustep-base-dev

コンパイル

以下のコードで実験。

#import <Cocoa/Cocoa.h>

@interface MyClass : NSObject
- (void) getMessage;
@end

@implementation MyClass
- (void) getMessage
{
  @try {
    NSLog(@"Hello");
    @throw [[NSException alloc] initWithName:@"myException" reason:@"myReason" userInfo:nil];
  }
  @catch (NSException* e) {
    NSLog(@"%@", e);
  }
}
@end

int main(int argc, char* argv[])
{
  id obj = [MyClass alloc];
  [obj getMessage];

  return 0;
}
$ gcc test.m -o test -lobjc -lgnustep-base \
 -I/usr/include/GNUstep/ \
 -fconstant-string-class=NSConstantString \
 -D_NATIVE_OBJC_EXCEPTIONS -fobjc-exceptions
  • -lgnustep-base : NSObject系列を使うために。
  • -fconstant-string-class=NSConstantString : @"string"と書くために。
  • -D_NATIVE_OBJC_EXCEPTIONS -fobjc-exceptions : @try/@catchを使うために。

sakuraVPSにrubyを入れたらnet/httpsが使えなかった件

もちろん

$ sudo yum install openssl-devel

済みです。
が、/usr/lib64/pkgconfig/ に問題があって

$ pkg-config --libs libssl
-Wl,-z,relro -L/usr/lib6464 -lssl -lcrypto -ldl -lz

lib6464 って何よ…(´・ω・`)

libssl.pc, libcrypto.pc, openssl.pc が

libdir=${exec_prefix}/lib6464

になってました。