Huawei E8231 とロケットモバイル神プラン(エントリーパッケージ)を組み合わせて、FreeBSDの回線が切れたとき用のサブ接続を用意します。

ストレージとして認識されてしまうので usb_modeswitch でNICとして認識できるようにします。

下の例では echo "net.fibs=4" >> /boot/loader.conf などとして、ルーティングテーブルを複数持てるようにしています。

% dmesg
...
ugen0.6: <HUAWEI> at usbus0
umass0: <Mass Storage> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:3:0: Attached to scbus3
cd0 at umass-sim0 bus 0 scbus3 target 0 lun 0
cd0: <HUAWEI Mass Storage 2.31> Removable CD-ROM SCSI-2 device
cd0: Serial Number FFFFFFFFFFFFFFFF
cd0: 40.000MB/s transfers
cd0: Attempt to query device size failed: NOT READY, Medium not present
cd0: quirks=0x10<10_BYTE_ONLY>

% usbconfig
...
ugen0.6: <HUAWEI Mobile HUAWEI> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA)

% usbconfig -d ugen0.6 dump_device_desc
...
ugen0.6: <HUAWEI Mobile HUAWEI> at usbus0, cfg=0 md=HOST spd=HIGH (480Mbps) pwr=ON (500mA)

bLength = 0x0012
bDescriptorType = 0x0001
bcdUSB = 0x0200
bDeviceClass = 0x0000  <Probed by interface class>
bDeviceSubClass = 0x0000
bDeviceProtocol = 0x00ff
bMaxPacketSize0 = 0x0040
idVendor = 0x12d1
idProduct = 0x1f01
bcdDevice = 0x0102
iManufacturer = 0x0001  <HUAWEI>
iProduct = 0x0002  <HUAWEI Mobile>
iSerialNumber = 0x0003  <FFFFFFFFFFFFFFFF>
bNumConfigurations = 0x0001

% usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000101000100000000000000'

% ifconfig ue0
ue0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:1e:xx:xx:00:00
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

% dhclient ue0
DHCPDISCOVER on ue0 to 255.255.255.255 port 67 interval 8
DHCPOFFER from 192.168.8.1
DHCPREQUEST on ue0 to 255.255.255.255 port 67
DHCPACK from 192.168.8.1
bound to 192.168.8.100 -- renewal in 43200 seconds.

% setfib 1 route add default 192.168.8.1

% setfib 1 ping 8.8.8.8

http://192.168.8.1/ にアクセスすると管理画面が表示されます。

コネクション毎にIPが変わるようなので、autosshを使ってコネクションを張るようにしておきます。

次のようにして Huawei E8231 を挿すだけで、張れるようになりました。

% cat /etc/devd/huawei.conf 
attach 100 {
        match  "vendor"    "0x12d1";
        match  "product"   "0x1f01";
        action "/etc/devd/huawei_e8231.pl";
};

% cat /etc/devd/huawei_e8231.pl 
#!/usr/local/bin/perl

use strict;
use feature ":5.10";

$|=1;

my @cmd = (
    "/usr/local/sbin/usb_modeswitch -v 12d1 -p 1f01 -M '55534243123456780000000000000011062000000101000100000000000000'",
    q|perl -E '$try=10; while ($try--) { system("ifconfig ue0 > /dev/null")==0 ? exit 0 : sleep 1 } exit 256'|,
    "dhclient ue0",
    "setfib 1 route add default 192.168.8.1",
    "setfib 1 service autossh_sub restart",
);

for (@cmd) {
    say "--> $_";
    my $ret = system($_);
    if ($ret == 0) {
        next;
    }
    else {
        say "failed. ret: $ret";
        exit 256;
    }
}
say "succeeded.";
exit 0;

% cat /usr/local/etc/rc.d/autossh_sub
#!/bin/sh
#
# $FreeBSD$
#
# PROVIDE: autossh_sub
# REQUIRE: DAEMON
# KEYWORD: shutdown
#

. /etc/rc.subr

name=autossh_sub
rcvar=autossh_sub_enable

: ${autossh_sub_enable:="NO"}

start_cmd=autossh_sub_start
pidfile="/var/run/autossh_sub.pid"
extra_commands="status"
procname="autossh"

autossh_sub_start() {
        AUTOSSH_PIDFILE=$pidfile AUTOSSH_POLL=10 setfib 1 /usr/local/bin/autossh -f -M 0 you@yourvps.jp -R 12345:127.0.0.1:22 -i /home/you/.ssh/id_rsa.plain -o "StrictHostKeyChecking no" -N
}

load_rc_config $name
run_rc_command $1

% sysrc autossh_sub_enable=YES

% service devd restart

yourvps.jp から ssh -p 12345 localhost で接続できるようになりました。

前回の記事 では
とっても簡単なじゃんけんアプリを作ってみました。
今回は wxFormBuilder というGUIビルダー、RADを使って
書き換えてみましょう。

じゃんけんアプリでは、 フレームパネルボタンサイザー をコードで組み立てていました。
wxFormBuilder を使えば、これらのデザインは
GUIビルダー側で行ないxrcファイルに保存、コード側ではxrcファイルを読み出しイベントハンドラを登録するだけになります。

DBやデータに基いてGUIの構成を細かく組み立てる場合はXRCは向きませんが、予め決まっている場合はコードで組み立てるより気楽だと思います。

まずは wxFormBuilder をインストールしましょう。
wxFormBuilder_v3.1.70.exe を入れてみます。

wxFormBuilderを起動したら、下のようにレイアウトします。

fbp1.jpg

レイアウトできたら、メインの設定を変更しましょう。
nameとfileを変更します。

fbp2.jpg

最後にXRCを書き出すためチェックを入れ、ボタンを押してそれぞれ janken.fbp, janken.xrc を保存しましょう。

fbp3.jpg

前回のjanken.plを変更し、janken_xrc.plとします。

次のコマンドで起動します。

  1. portableshell.bat
  2. perl janken_xrc.pl

上手く起動できたでしょうか。

janken_xrc.jpg

それぞれのシンプルなサンプルを動かしてみましたので、その起動速度のメモします。

体感時間なので当てになりませんが、次のような感じでした。

  • WxPerl 1秒未満
  • WxPython 1秒未満 (気持ちWxPerlより速いかも)
  • WxRuby 8秒ぐらい

使ったコードは次です。
Rubyのコードは wxRubyでGUIプログラミング をそのまま使わせていただきました。



コードが等化ではありません。
ですが、それぞれの各種サンプルを動かしてみたところ、上記の体感時間に関しては
だいたい当てはまる感じがしています。

サンプルは次を動かしてみました。

  • WxPerl http://search.cpan.org/perldoc?Wx::Demo
  • WxPython C:\Program Files\wxPython2.8 Docs and Demos\samples\
  • WxRuby C:\wxruby\samples

環境は Core 2 Duo 2.13G Macbook Air の VMWare Fusion の WindowsXP 上です。

帳票印刷を真面目にやろうとすると、色々問題が出てくると思います。

  • ExcelやAccessを使い、OLEでアクセスするも、Officeが入っていなくては使えない。
  • Crystal ReportsはVisual Studio 2010からバンドルされなくなった。
  • 商用ライブラリを利用するには、お金が掛かる。
  • 自分でレイアウトするにしてもレイアウトを計算して、デバイスコンテキストにレンダーするのが難しい、面倒。
  • rubyにはとっても良いものがあるようです! ThinReports

Webアプリのようにテンプレート言語でTableタグを含むHTMLを作成して
それをPDFに変換できたら良いのに・・・と思い付きました。

wkhtmltopdf はSafariやChromeで使用されている
HTMLレンダリングエンジン Webkit をCUIから扱えるようにパッケージングしたものです。
Windows環境では、wkhtmltopdf.exeとして用意されています。

Sumatra PDF PDF用のフリーソフトです。CUIからも使えます。印刷とプレビューに使用します。ダウンロードはポータブル版がオススメです。

それでは組み合わせてみましょう。

  1. Text::MicroTemplateを使って、HTMLを作成します。
  2. wkhtmltopdfを使って、HTMLをPDFへ変換します。
  3. Sumatra PDFを使って、PDFを印刷、又はプレビューします。

contrib以下にダウンロードしました。

tree.jpg

下記を chohyo.pl として保存します。

  1. portableshell.bat
  2. perl chohyo.pl

で、chohyo.htmlとchohyo.pdfを書き出します。

  1. perl chohyo.pl --preview

で、Sumatra PDFでchohyo.pdfを開きます。

  1. perl chohyo.pl --printer

で、Sumatra PDFでchohyo.pdfを印刷します。

chohyo.jpg

前回 はUrladerを使って
ソースの一群を.exeに纏めてみました。
これを実行すると、C:\Documents and Settings\<ユーザー名>\Application Data\urlader\Janken\i-<バージョン> には素のソースコードが展開されてしまいます。
今回は、Filter::Crypto::CryptFileを使ってjanken.plを難読化してみたいと思います。

以下を crypt.pl として保存してください。

  1. portableshell.bat
  2. perl crypt.pl

を実行すると、janken2.plという難読化されたファイルが出力されます。

これはこのまま perl janken2.pl として実行できます。

じゃんけん.plを exe にしてみる
pack_janken.pl内で、難読化したいファイルのみcrypt_fileを適用するようにしておけば
exeのパッケージング時に自動的に行なわれるようになると思います。

Filter::Cryptoで難読化したファイルは 復号化できないわけではない
のですが、実用上はこの程度で十分な場合もあると思います。