b-mobileの通信速度を改善してみる

現在b-mobileのスマートSIMを使い始めて1ヶ月半になるが、思ったより速度が出ない。スマートSIMには高速通信権なし、1GBまで、2GBまでの3つのプランを選んで使うことができ、当初1GBのプランで契約した。しかし下り1Mbpsを超える速度が出ることがまずないため1ヶ月経ったところで150Kbpsのプランに変更してしまった。

1GBプランで150Kbps以上は出ていたのだから、150Kbpsに制限されるプランなら上限までは速度が出るだろう。と考えた訳だが、これがかなり甘い考えだった。というのも、下り速度を測ったところでせいぜい数十Kbpsしか出ていないのだ。これではWebの閲覧に支障が出て使い物にならない。

しかし、VPN経由の通信は計測した数値ほどの遅さを感じない。このことから、速度が遅い理由を推測してみた。

b-mobile スマートSIMでは150Kbpsに制限された状態では、通信内容を圧縮するプロキシサーバが非暗号化通信時には強制的に適用されるとのことだが、このプロキシサーバがボトルネックになっているのではないかと考えた訳だ。

前フリが長くなったが、以下のことを試したところ、通信速度が向上した。

  • 自宅サーバ内にプロキシサーバを立てる
  • 自宅LANにVPN経由で参加する
  • ブラウザのプロキシサーバ設定に自宅サーバのプロキシサーバを指定する

これで、2〜30Kbpsだった下り速度が130Kbps前後までに改善された。これなら文字中心のサイトを見る分には充分使い物になる。

ただし、いちいちVPNに接続したり、ブラウザのプロキシ設定を変えたりするのが面倒に感じてしまいそうだ。あくまで最後の手段としておくのがちょうどよさそうだ。

C#からMongoDBに接続する

Webと連携するようなアプリケーションでは、データをJSONで受け取る場合がある。受け取ったデータをアプリケーション側で永続化する場合にデータベースを使いたいが、SQL系のデータベースではいまいちJSONとの親和性が低い気がする。

ということで、MongoDBを試してみることにした。一つ残念なのはアプリケーション組み込み型ではないことだが、mongod.exeをアプリケーションからうまく扱えばユーザサイドでは意識させないようにできるのではと考え、特にデメリットと考えないようにした。

今回使用したのはMongoDB 2.4.0、OSはWindows XP 32bitなので、データベースのサイズには2GBの制限がついたり、ジャーナル機能がデフォルトでオフになっていたりするとのことだが、テストなので気にしない。

データベース接続用のドライバは、公式のC#用のものをNuGet経由でインストールした。

早速Webにあるサンプルを試してみたところ、サーバの取得方法に対して非推奨との注意文が入る。

動作はしたが、以下のコードはMongoDB 2.4では使ってはいけないようだ。

var connectionString = @"mongodb://localhost";
var server = MongoDB.Driver.MongoServer.Create(connectionString);

注意文を手がかりに、コードを以下のように書き直してみた。

var connectionString = @"mongodb://localhost";
var client = new MongoDB.Driver.MongoClient(connectionString);
var server = client.GetServer();

これで注意文は消え、データベースに正常に接続できることを確認した。

簡単にコレクションに対してデータを挿入する処理を書いてみたが、.NETのオブジェクトをそのままデータベースに渡すことができるのが非常に楽。もう少しサンプルをいじってみて、使用感を確かめていこうと思う。

PowerShellとEpgDataCap_Bonの連携

PowerShellは.NETのアセンブリを読み込んで利用できる。ということで、CtrlCmdCLI.dllの機能を呼び出してみた。

コード

[void][Reflection.Assembly]::LoadFrom("CtrlCmdCLI.dll");
$ctrlCmd = New-Object CtrlCmdCLI.CtrlCmdUtil;
$ctrlCmd.SetSendMode($true);
$ctrlCmd.SetNWSetting("127.0.0.1", 4510);
$reservedList = New-Object Collections.Generic.List[CtrlCmdCLI.Def.ReserveData];
[void]$ctrlCmd.SendEnumReserve([ref]$reservedList);
$reservedList | sort StartTime | Out-GridView

単純に録画予約一覧を表示するだけのサンプル。

Out-GridViewは出力を確認するのに便利だな。

PowerShellでTwitterのTimelineを取得

WikipediaのWindows PowerShellの項にあったRSSフィードを取得するサンプルを見ながら作ってみた。

いろいろ面倒なので、Twitter API 1.0のXML版を使用。認証不要のAPIということで、指定したユーザのタイムラインを取得するAPI(/statuses/user_timeline.xml)を選択した。

実験環境はWindows XP上のPowerShell 2.0だが、PowerShell 3.0ではJSONをパースするコマンドレットが追加されているので、認証さえできればTwitter API 1.1にも対応できるかと。

コード

$Url = "https://api.twitter.com/1/statuses/user_timeline.xml?screen_name=(ユーザ名)"
$tl = [XML.XmlDocument](New-Object Net.WebClient).DownloadString($Url)
$tl.statuses.status | ft -AutoSize @{Label="Date"; Expression={[DateTime]::ParseExact($_.created_at, "ddd MMM dd HH:mm:ss K yyyy", [Globalization.DateTimeFormatInfo]::InvariantInfo)}}, text

結果

Date                text
----                ----
2013/02/05 19:09:17 PowerShellがなかなか遊べそうな予感… http://t.co/QdsGXm2C

PowerShell

以前Windows XP環境にインストールしたまま放置していたWindows Power Shellをちょっといじってみた。

基盤技術は.NETなので、Power Shell特有の書式さえわかれば応用が利きそう。

とりあえずテストとして、ドライブ一覧を取得し、準備ができてないドライブ(ディスクの挿入されていないリムーバブルドライブなど)を除外して、ドライブレター、タイプ、フォーマット形式、総容量、空き容量を表形式で出力させてみた。

コード(というかコマンド)

[IO.DriveInfo]::GetDrives() | where {$_.IsReady} | Format-Table Name, DriveType, DriveFormat, TotalSize, TotalFreeSpace

結果

Name                  DriveType DriveFormat          TotalSize TotalFreeSpace
----                  --------- -----------          --------- --------------
C:\                       Fixed NTFS              243822227456    75804323840

なんか遊べそうだし、Windows Home Server 2011の環境で処理動かすのに使えそうなので、ちょくちょくいじってみよう。

サーバの集約

Windows Home Server 2011とMandriva Linux 2010.2と、2台に分かれていた自宅サーバを1台に集約してみた。

以前から計画していたものの、Windows機で使用していたTVチューナカードがネックになっていた。

しかし、VMware vSphere Hypervisor 5.1での成功例がネット上にそれなりの量見かけたので、挑戦してみることにした。

ハードウェアの構成は以下の通り

CPUAMD Opteron 3280
MemoryDDR3-1600 16GB
MotherBoardASUS M5A99X EVO
HDD2TB(Vmware) + 12TB(Data)

以前使用していたハードウェアでは、ハードウェア仮想化に必要となるIOMMUに対応していないため、新しいハードウェアを調達した。

実はCPUを使い回すことは可能なのだが、8コアというスペックと、マザーボードとのセット販売で格安だったため、丸ごと入れ替えている。

ハイパーバイザ上にWindows Home Server 2011とopenSUSE 12.2(Mandriva Linuxから乗り換え)を導入し、環境の移行を行い1ヶ月以上経過したが、おおよそ問題なく稼働している。

ちなみに、Radeon HD 5450を仮想化しゲストOSに割り当ててみたが、設定次第ではハイパーバイザを巻き込んでクラッシュしたり、性能的なメリットが薄かったりと、使い道がなかったためRadeonの仮想化はしないで運用している。

副作用として、Microsoft Technet Subscriptionで提供されているプロダクトのテストにちょうど良い環境が手に入ったので、時間があったときにでも普段触れる機会のないWindows Serverなどを使用してみようと思う。

LinuxからPPTPサーバへVPN接続

Web検索すればそれなりに情報が出てくるものの、断片的すぎてそのまま自分の環境に適用できなかった。

今回対象にするディストリビューションはRed Hat Enterprise Linux 6.1。この環境をVPNクライアントにする。

まずはPPTP接続の為のパッケージを追加。インストールメディアより"Point-to-Point Tunneling Protocol (PPTP) Client" (pptp-1.7.2-8.1.el6)をインストールする。

次にVPN接続の認証に使うユーザ情報を設定する。

/etc/ppp/chap-secretsに以下の情報を追加。

USERNAME	*	PASSWORD	*

VPNに接続するには、以下のコマンドを実行する。

コマンド実行後に仮想インタフェース"ppp0"が作られる。

pppd debug noauth nodetach noipdefault defaultroute name USERNAME require-mppe require-mppe-40 require-mppe-128 pty "/usr/sbin/pptp HOSTIP --nolaunchpppd --loglevel 2"

以下のコマンドを実行し、ルーティング設定を追加する。ここで追加した設定は、VPN接続解除時に自動的に削除される。

route add -net IPADDRESS netmask SUBNETMASK ppp0

接続解除は、実行中のpppdを中断(Ctrl-C)すれば、後始末までしてくれる。

openSUSEでVirtualBox

少しはまったのでメモ。

ホスト環境はCUI起動のopenSUSE 12.2で、電源ケーブルとLANケーブルしか刺さっていないサーバ(のようなもの)。そのため、仮想マシンはヘッドレス運用とする。

VirtualBoxのインストール自体はパッケージマネージャから行う。openSUSE 12.2では、最新の4.2系ではなく、4.1系が提供されている。仮想マシンのヘッドレス運用に必要となるVRDE機能(リモートデスクトップ)は、Extention Packに含まれているが、これはVirtualBox公式サイトからダウンロードし、VBoxManageコマンドからインストールする必要がある。Extention Packのインストールはroot権限でやること。

仮想マシンの作成はネットで探した事例を参考に済ませる。ただし、VirtualBoxのバージョンによって、VBoxManageコマンドのオプションが変わるため、古いバージョンを元にしている手順は使えなかったりもするので注意。

ここまで環境を整えたが、いざ仮想マシンを起動しようとしてもエラーメッセージが出力されるのみで起動できない。エラーメッセージから原因を特定するのに少し手間取ったが、割と単純な理由で仮想マシンを起動するユーザが"vboxusers"グループに所属していなければいけないというもの。YaSTからユーザのサブグループとして"vboxusers"を追加すればよい。

これでやっと仮想マシンが起動できる。元々処理能力より消費電力に比重を置いているサーバのため動作はあまり速くないものの、デスクトップ環境がLXDEのLinux程度ならそれほど気にならない。ちなみにゲストOSはMageia Linux 2。Linux on Linuxは無駄かもしれないし、他にも同じことをする手段はあるかもしれないが、とりあえずアプリ開発用に好き勝手できる環境という位置づけで運用する。

今回はここまでできれば十分だけれど、欲を言うと仮想マシンはホストネットワークとブリッジ接続にしたいところ。ただし手順が面倒なようなので今回は見送り。また余裕があるときにでも挑戦してみよう。

iPhone 5のテザリング機能をWindowsから使う

当初Wi-Fi接続を利用していたが、あまりに不安定なのでUSB接続を試してみた。

前提としてiTunesのインストールが必要とのことだが、調べてみると必須コンポーネントは以下の2つのようだ。

  • Apple Application Support
  • Apple Mobile Device Support

これらのコンポーネントはiTunesのインストールファイル(iTunesSetup.exe)に同梱されているので、Cabinet形式をサポートするアーカイバを使えば各コンポーネントのインストールファイル(msi形式)を抽出できる。

ファイルを抽出したら、AppleApplicationSupport.msiAppleMobileDeviceSupport.msiの順にインストールすれば準備完了。そのままiPhoneをUSBケーブルで接続すればデバイスドライバがインストールされ、テザリングを有効にすればiPhone経由でインターネットに接続できる。

しばらく使ってみたが、Wi-Fiよりはるかに安定している様子。

WPF 可変サイズWindowのサイズ変更制限

ユーザの操作によりWindowサイズ変更制限するために、以下のXAMLコードを試してみた。

<Window x:Class="Test.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:Test"
  Title="MainWindow" Height="300" Width="400"
  MaxWidth="{Binding RelativeSource={RelativeSource Self}, Path=Width}"
  MinWidth="{Binding RelativeSource={RelativeSource Self}, Path=Width}">
</Window>

6, 7行目がポイント。横幅の最小値、最大値を現在の横幅にバインドすることで、コードから動的に横幅を変更した場合でも自動で値が設定し直される。