読者です 読者をやめる 読者になる 読者になる

pslaboの日記

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

iPad3のSIMロックに関する考察とSIM下駄による解除の試みはSoftbank版iPad3にiPhone用のSIM下駄を履かせてみるにいろいろ書いてます。

ポストした内容のカテゴリー分けがちゃんと出来てないので、過去記事を探したい方はお手数ですが検索で探してみてください。


RAD Studio/Delphi/C++Builderをインストールするときは、仮想マシン上にインストールした上で、一度アンインストールした状態でスナップショットをとっておくのがおススメ

RAD Studio Delphi C++Builder

RADStudio/Delphi/C++Builderのインストールにはアクティベーションの回数に上限があります。インストールとアンインストールを繰り返すと上限に達してしまいます。

このような場合はサポート窓口に連絡して回数のリセットをかけてもらうことになります。しかしサポート窓口は平日日中の対応なので、サポート時間外に上限に達してしまうと何も出来なくなってしまいます。サンデープログラマーが年末年始やゴールデンウィークなどの長期休暇中にこれに出くわすと時間を大幅にロスします。

しかし「仮想マシン上でOSをクリーンインストールしたのち、その環境にRAD Studio/Delphi/C++Builderを最小構成でインストールしてからアンインストールして、その状態をスナップショットにとっておく」と、再インストールしてもインストール回数が加算されないようなので、再インストールを安心して行うことができます。

このようなことが行える理由ですが、実は「RAD Studio/Delphi/C++Builderをアンインストールしても、アクティベートしたライセンス情報はPC内に残っている」ようなのです。だから再インストール時には既存のアクティベーション済みの情報が再利用されるので、アクティベーションサーバ側で管理しているアクティベーション回数が加算されないようです。


これにより以下のような運用が可能となるかと思います。

・万が一、環境が壊れたらスナップショットを戻して再インストールしなおせばよい。
・10.1から10.1.1や10.1.2へのアップデートはアンインストールした上での再インストールが必要だけど、その場合もアンインストールはスナップショットに戻すだけで済み、なおかつそこからの再インストールでもアクティベーション回数が加算されない。
・元のスナップショットからの枝分かれとして、そのライセンスでインストール可能な複数バージョンを混在させることも可能。ただし1つのインスタンスのスナップショットなので同時起動はできない。


なお、この運用には欠点もあります。

仮想マシン用のWindows ライセンスが必要
・スナップショットは仮想マシンのディスクIOの性能を損なう場合がある
・OSの大規模なアップデートがあるとスナップショットからの差分の増大も大きく育つのでストレージが大きく消費される。

しかし、このようなデメリットを差し置いてもライセンスアクティベーション済みの状態でスナップショットを取っておくことはメリットの方が大きいのではと思います。

ます、仮想化するならWindows ライセンスは必須なので、この費用は止むを得ないかと。ただしマルチプラットフォーム向け開発の場合は macOS 上の仮想マシンWindows + RAD Studio をインストールするのが定石ですから、この場合は必要な条件は揃っていますね。

ディスクIOについては、SSD利用とすることで緩和できます。

OSの大規模アップデートについては、これは止むを得ないものと思って諦めるか、元のスナップショットをアップデートした上で、枝分かれのスナップショットも作り直すかのいずれかです。

Pebble TImeのF/W4.3.xが不調なので4.2に戻してみる

pebble

Pebble Timeの最新F/Wを使っているとBluetoothが不規則に切れてイライラするので、4.2に戻してみた。

以下はそのときの手順のメモ。

戻し方(iOS向け)

  1. Pebbleを初期化する(きれいな状態で始めたほうがトラブルが少ないと思われるので)。
  2. 初期化中の待ち時間の間にスマホ側のBluetooth設定からPebbleを消す。
  3. 初期化中の待ち時間の間にダウングレードしたいF/WをDropBoxに入れておく。
  4. スマホ側の Pebble アプリと接続しなおす。このときに一旦最新の F/W へのアップデートが走る。
  5. 最新F/Wがインストールされた後の再起動が終わるまで待つ。
  6. Pebbleが再起動したら、DropBoxファームウェアを選択⇒エクスポート⇒別のアプリで開く⇒Pebbleにコピー を実行すると、PebbleアプリでF/Wのインストールが行える。
  7. F/Wのインストールが終わったら、日本語パックを入れる。

F/Wのダウンロードリンクはこちら。

github.com

Delphiで作ったスマホアプリにGoogleAnalyticsを組み込む

RAD Studio Delphi Google Analytics

とりあえず下調べ。

FMXexpress.com にこんなページがあったので、とりあえずメモとして残す。
www.fmxexpress.com

IISのインストールはPowerShellを使って自動化できる

Windows IIS

IISのインストールは PowerShell を使うのが簡単ですねえ。

以下のコマンドは RAD Server 向けの必須機能をインストールするための方法だそうです。もっとも RAD Server は RAD Studio/Delphi/C++Builder のEnterprise以上じゃないと開発できないので、この構成を普段使うことはなさそうだが。

Add-WindowsFeature Web-Server,Web-Mgmt-Console,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Default-Doc,Web-Dir-Browsing,Web-Http-Errors,Web-Static-Content


では設定情報を簡単にインストールするにはどうすればよいかというと、これは xml ファイルをコピーすれば設定の複製が作れるようだ。

IISの設定情報の保存先karuakun.wordpress.com

technet にはこういう説明もあります。
IIS 7.0 コンフィギュレーション リファレンス

Softbank回線のMVNOが登場したら、iPhone用、iPad用、その他ソフトバンク用の3種類のサービスメニューになるのだろうな

iPhone iPad Mobile MVNO

Softbank回線のMVNOが登場した時のサービスメニューがどうなるかというと、iPhone用、iPad用、その他のソフトバンク端末向け、の3種類のサービスメニューが必要になるはず。

以前に SoftbankiPad の SIM ロック解除を SIM 下駄で試みた場合に調べた限りでは、ソフトバンクiPhoneiPad 向けの SIM カードは IMSI 番号が以下のように違います。

SIMカード IMSI
SoftbankiPad 4402080
SoftbankiPhone 4402081

このことは以前に書いたこちらの記事に詳しく掲載しています。 pslabo.hatenablog.com

そして iPhone, iPad ともキャリアロックは IMSI 番号ベースで行われているために、相互にSIMを入れ替えても使えないわけです。

また、iPhone/iPad以外のSIMは上記とは異なる IMSI 番号が振られているようです。

ここで、MVNO が顧客ニーズを満たしつつ、もっとも需要が多そうな iPhone/iPad 向けのサービスを提供しようとしたら、少なくとも iPhone 向け、iPad 向けの SIM は別個に出さねばならないはずです。

ここでさらに iPhone 向けにデータ専用、データ+SMS、音声の3種類を提供したり、あるいはiPad向けにデータ専用、データ+SMSを提供するとしたら、とてもカオスな感じになりますね。

日本通信がどういう形でサービス提供を行うのか、非常に気になります。

過去のエンバカデロ・デベロッパーキャンプの内容や資料を整理してみようと思ったらすでにあった

RAD Studio Delphi C++Builder

エンバカデロテクノロジーズのデベロッパーキャンプの過去の内容や資料の一覧がないような気がしたので自分用の資料としてまとめてみようかと思ったけど、ちゃんとあるのですね。

オフィシャルなのはこれ。
http://forms.embarcadero.com/developer-camp-archive

DEKOさんがまとめているのもあった。
http://ht-deko.com/tech044.html

それにしてもオフィシャルのほうの遅さはなんとかならんものか。HTMLページのダウンロードに10秒以上も掛かっておるぞ。

f:id:pslabo:20170204112339p:plain

これでは SEO がアカンやろ。だから検索に引っかかりにくいのかなあ。

ガラポンTVの録画済み動画を視聴中にtcpdumpとrtmpdumpで自動的にイロイロやるテスト

MacOSX ガラポンTV

こういう記事を見つけたので、tcpdump の結果を perlスクリプトに食わせれば自動で rtmpdump できるんじゃないかと思って試してみたら一応動くものができたので忘備録として記す。

自分の動作確認は macOS Sierra でしか行っていないので、他の環境のことは分かりません。またこのスクリプトについての動作を保証するものでもないので、自己責任でどうぞ。

www.yutorism.jp

ちなみにガラポンTVというのは、地上デジタル放送を最大で同時8チャンネルまで全部録画できるレコーダーで、2TB程度のHDDを使えばだいたい3ヶ月分くらいの番組を全部録画してくれるシロモノです。

実行例

sudo tcpdump -A -s 0 'host [ガラポンTVのIPアドレス] and tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | ./test.pl 

macOS で上記の処理を実行しておくと、あとは適当なブラウザでガラポンTV端末自体に接続して番組視聴するか、またはガラポンTVサイトで動画視聴するだけで、裏で rtmpdump が自動的に起動するはず。使用するコマンド自体は汎用的なものだから Debian/Ubuntu/CentOS でもイケるだろうし、あるいは Windows10 上の Ubuntu on Windows でも動くとは思う。


そして上記のコマンドのうち test.pl というのは以下のスクリプトです。rtmpdump は apt-get などで別途インストールしておく必要があります。

perlスクリプト

最低限のコメントは入っているので、解説は特に不要ですよね。ただしいくつかの箇所は初期値を入れておく必要があることに注意が必要です。

#!/usr/bin/perl

use strict;
use warnings;

$| = 1;

# garapon_deviceid はTVサイトとの通信から取れるけど、、
# 端末に直接ログインした場合に取得できるかどうかは未検証。
my $garapon_deviceid = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-n";

# ここは初期値を正しく設定せねばならない。
my $garapon_host     = "192.168.254.1";
my $moviepath        = "~/Garapon";

# これは通信中の内容から自動的に取得決定する値。
my $garapon_gtvid    = "";
my $garapon_authkey  = "";
my $garapon_rtmp_cmd = "";
my $garapon_sessionid="";

while( <STDIN> ) {
    if ( $_ =~ /V([A-Z0-9]{18})-([A-Za-z0-9]{32})-([A-Za-z0-9]{32})-([A-Za-z0-9])/ ) {
        # garapon.tv サイトへのアクセスからイロイロ取得する。
        $garapon_gtvid=$1;
        $garapon_authkey=$2;
        $garapon_deviceid="$3-$4";

        $garapon_sessionid="$garapon_gtvid-$garapon_authkey-$garapon_deviceid";
    } elsif ( $_ =~ /gtvid=([A-Za-z0-9]{18})/ ) {
        # ガラポンに直接ログインしているときの取得方法
        $garapon_gtvid=$1;
        print "garapon_gtvid=$garapon_gtvid\n";
    } elsif ( $_ =~ /GaraponAuthKey=([A-Za-z0-9]{32})/ ) {
        # ガラポンに直接ログインしているときの取得方法
        $garapon_authkey=$1;
        print "garapon_authkey=$garapon_authkey\n";
    }

    if ( $_ =~ /GET \/viewer\/player\.garapon/ ) {
        if (
            length($garapon_gtvid)    > 0 &&
            length($garapon_authkey)  > 0 &&
            length($garapon_deviceid) > 0 ) {

            $garapon_sessionid="$garapon_gtvid-$garapon_authkey-$garapon_deviceid";
        }
    }


    # gtvid, authkey, deviceid が揃っていたら、メインの処理を行う
    if ( length($garapon_sessionid) > 0 ) {
        my $moviefile = "$moviepath/$garapon_gtvid.flv";

        # ファイルがない場合は rtmpdump を実行してファイルを取得する
        if ( ! -f $moviefile ) {
            $garapon_rtmp_cmd="rtmpdump -n $garapon_host -l 0 -y '$garapon_sessionid' -o '$moviefile'";
            print "$garapon_rtmp_cmd\n";
            system( "$garapon_rtmp_cmd &" );

            # 同じファイルに対する多重処理発生防止のための時間調整
            sleep 5;
        } else {
            print "$moviefile is exist.\n";
        }
        # セッション情報(番組情報)を空にする。
        $garapon_sessionid="";
    }
}