これか、3Dのメロディーラインを表示 MIDITrail

【自由の翼(TVサイズ)】 -進撃の巨人- オーケストラアレンジ
http://www.youtube.com/watch?v=Zgn9VrBmCOQ
【オーケストラ】進撃の巨人OPメドレー「自由への進撃」(Orchestral arrange “Attack on Titan” OP medley)
http://www.youtube.com/watch?v=rtCTFdhEdYg

で使われている、で使われている、MIDIの信号表示で3D風になってるのですが、なんのソフトが探してみたところ、
3Dの宇宙空間に複数トラックのノートが浮かぶMIDIプレイヤー「MIDITrail」
でした。

すごいなこれ。しかしこういうのをみるとやってみたくなる性分でして、
ずっとずっと昔作曲した曲があるので、このソフトに食わしてみるかな・・

Android でのスクリーンキャプチャー

前回の宿題で、Androidでアプリからスクリーンキャプチャーを取る方法です。

Androidでアプリからスクリーンキャプチャーを取るにはroot権限がないとだめです。(一部機種でrootを取らなくてもできるものもあります。)

Android 4.0以降では、root化してあればscreencap,screenshotコマンドで簡単にとれるのですが、Android バージョン2.3では使えません。
フレームバッファー /dev/graphics/fb0から直接取得することになります。
(このデバイスは,rootでないとアクアセスできません。)

Android 4.0以降では、電源ボタン+ボリューム(↓)同時押しで取れますが、アプリでこのキーのエミュレートをしても、「電源ボタン」押下は、やはりrootでないと反応しません。

今回、自分使用している機種:SONY Xperia SO-01C 480×854 Android バージョン2.3.2では、Google Playにアップされているツールはどれも正常にとれないのです。赤みがかかった画像になる。RBGAの配列が違うようです。しかたがないので作ることにした。

自分のスマホはrootを取っているので、今回はうまくいけば、アプリにする予定
(公開は今のところ考えていません。)

1) フレームバッファーから生データを取得
#cp /dev/graphics/fb0 /sdcard/fb0

fbのファイルサイズは、3,410,432で、480×854で1ピクセル4バイトとすると
+,-,x,/を思考錯誤して以下の式にたどりついた。

(3410432-(65536 x 2))/2 = 480 x 854 x 4

で、元サイズから65536×2バイト余分引いて、ダブルバッファリングしているので1/2すると、ちょうど480 x 854 x 4になります。

2) 無理やりBMPにしてみる。

fb0にヘッダー54バイトを加えます。
unsigned char header[54] = {
    0x42, 0x4d, 0x36, 0x05, 0x19, 0x00, 0x00, 0x00,0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
  0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x56, 0x03,0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x05, 0x19, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

一応、画像になってますが、上下反転して、色も少しおかしいです。RとBが入れ替わってる。

3) データ変換する。行単位で上下を変換し、BGRA -> RGBAにする。

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>

#define BMP_SIZE (3410432-(65536*2))/2

unsigned char srcdata[BMP_SIZE];
unsigned char outdata[BMP_SIZE];

unsigned char header[54] = {
    0x42, 0x4d, 0x36, 0x05, 0x19, 0x00, 0x00, 0x00,0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
    0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x56, 0x03,0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x05, 0x19, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

int main(int argc, char *argv[]){

int fd,fd_out;
long i,j;

unsigned char c;
unsigned char *p;

fd = _open(“fb0”,O_RDONLY | O_BINARY );
if(fd == (-1)){
return(-1);
}

p = srcdata;

//_read(fd,srcdata , 3410432 – (65536 * 2));
for(i = 0 ; i < BMP_SIZE ; i+= 53760){
_read(fd,p,53760);
p += 53760;
printf(“%in”,i);
}

fd_out = _open(“fb0-001.bmp”,O_CREAT | O_WRONLY | O_TRUNC | O_BINARY,S_IREAD | S_IWRITE );
if(fd_out == (-1)){
return(-1);
}

//これだと、上下逆さ&色抜け(R<->B)
//_write(fd_out,header,54);
//_write(fd_out,srcdata,(3410432 – (65536 * 2))/2);

//————————————

unsigned int width = 480;
unsigned int height = BMP_SIZE  / 480 / 4;

        //上下反転
for(i = 0; i < height; i++){
for(j = 0; j < width * 4; j++){
outdata[(height – 1 – i) * width * 4 + j] = srcdata[i * width * 4 + j];
}
}
//R,B入れ替え
int cnv = 0;
for(i = 0 ; i < BMP_SIZE ; i += 2){
if(cnv == 0){
p = &outdata[i];
c = outdata[i];
cnv++;
}else{
*p = outdata[i];
outdata[i] = c;
cnv = 0;
}
}

_write(fd_out,header,54);
_write(fd_out,outdata,BMP_SIZE);

_close(fd);
_close(fd_out);
}

こうすると、正常な画面になります。これで、スクリーンキャプチャーツールが作れます。(要root)

*root化状態でパズドラを動かすとデータが初期化されますので注意が必要です。といっても/system/bin/su,/system/xbin/su,/sbin/suのようにsuがなければ大丈夫です。

参考:
ビットマップフォーマット
http://www.kuwalab.net/technics/bitmap/
RGB565の時は、16bit のデータフォーマットなので
少し調整が必要です。
http://android-dev-log.ldblog.jp/archives/11346611.html

PostgreSQL インポートエラー

サーバリプレイスの為、PostgreSQL 8.1 コードセットUTF-8で作られたデータベースをpg_dumpでexportして、
新しいサーバのPostgreSQL 8.1にimportしようとしたところ、
invalid byte sequence for encoding “UTF8”: 0xc030
でimportできない。(500MぐらいのDB)データ中に不正なコードがあるようで、
手当てするにもいったいどれだけあるのかも不明・・・

そこで、以下の手順を思いついた。nkfでUTF-8からUTF-8に変換したらいいのではないかと。

nkf -xw –no-best-fit-chars src.dmp > dst.dmp
dropdb abcd
createdb abcd
psql abcd < dst.dmp

importできました。メモに残しておきます。
結局、src.dmp と dst.dmpの差分を取ると、文字化けしていたレ―コードは2レコードだった。

※ -xは、半角カナは半角カナのままにする。
–no-best-fit-charsは、適当なキャラクターに変換しない。(例:全角「-」は全角「-」のまま)

oracle プロシージャーのインポートに6時間がかかる

【メモ】

本番システムのoracleデータベースをexportしたものをimportしたのですが、プロシージャー以外はすんなりimportできましたが、プロシージャー(150本)は、6時間ぐらいかかってしまった。
(週末にimportを動かしたまま放置して、今朝みたら全部正常にimportできていた。)

プロシージャーがなぜこんなにも時間がかかったかみたところ、各プロシージャーの作成時間を調べてみると、大体30分区切りで一群のプロシージャができている模様。
どれがネックになっているか見てみるとどれも、データベースリンクを使用しているプロシージャーでした。

本番は、データベースリンク使っているのですが、今回開発しているところは、データベースリンクはいらないので、当然ありません。
データベースリンクが引けないので、多分タイムアウトするまで待っているものと思われます。

インポート時だけタイムアウトを短く設定できるか、精査不要のオプションがあればいいのに。。。

==== 追記 ====

インポートのCOMPILEオプションはデフォルト”Y”みたいですので、これを”N”でやれば
早かったかも。


imp system/xxxxxx file=abc.dmp fromuser=user1 touser=user2 ignore=y compile=n

SMAIL v4.16にバージョンアップしました。

UTF8に変換して送信できるようにしました。エンコードは8bitだけの予定でしたが、他の、メールクライアントを見てみるとbase64やquoted printableも対応しているようなのでこれも対応しました。SMAIL
【バージョンアップ内容】
 1) キャラクターセット:UTF8,エンコード 8bit/base64/quoted printableで送信対応


-c: -c
キャラクターセット:ISO-2022-JP エンコード 7bit (-c未指定時のデフォルトです。)
-cj
キャラクターセット:ISO-2022-JP エンコード 7bit
-cu8
キャラクターセット:UTF8 エンコード 8bit
-cub
キャラクターセット:UTF8 エンコード base64
-cuq
キャラクターセット:UTF8 エンコード quoted printable

[参考]
http://www.atmarkit.co.jp/ait/articles/0104/10/news002.html
http://ja.wikipedia.org/wiki/Quoted-printable

SMAIL UTF8の対応

前回、「IBM拡張文字->NEC選定IBM拡張文字変換」に対応して、拡張文字の文字化け対応致しましたが、今度はUTF8変換にも対応予定です。
とりあえず目途がたったので、また週末に改修予定。。。あ、週末は旅行に行くんだった・・
[窓の杜ダイジェストニュース3/4]
http://www.forest.impress.co.jp/docs/digest/index201303.html

SMAIL改修方針:メモ
【utf-8対応】

1.本文:
1) charset=”utf-8″ 、content-Transfer-Encoding:は 8bitにして、
  8ビットバイナリ―コードで出力。

2.サブジェクト、漢字添付ファイル名、漢字ニックネーム
1) utf-8でMIMEエンコード
=?utf-8?B?xxxxxxxxxxxxxxxx=?=

※漢字ニックネームはフリー版では使えません。

3.添付ファイルは今まで通り。
1) content-transfer-encoding:base64

肝心のsjisからutf8への変換ですが、MultiByteToWideCharでCodePageにCP_UTF8を指定すればOK。
Windows CEは、CP_UTF8は未サポート。

SMAIL v4.15にバージョンアップしました。

SMAIL v4.15にバージョンアップしました。

【バージョンアップ内容】
 1) IBM拡張文字をNEC選定IBM拡張文字に自動変換する。(文字化け対策)
これの「mail : IBM拡張文字->NEC選定IBM拡張文字変換」対応です。
 2) openSSL 1.0.1eにライブラリをバージョンアップ。
セキュリティー対策
 3) -Bオプション 文字列を暗号化して表示するオプションを追加。
4) -xオプション htm,htmlの添付ファイルは、Content-Type:text/htmlとして出力する。

ここのところ忙しかったですが、やっとバージョンアップできました。

mail : IBM拡張文字->NEC選定IBM拡張文字変換

メールでは、IBM拡張文字コードは文字化けします。(しないメールクライアントもありますが)IBM拡張文字コードは、NEC選定IBM拡張文字コードに変換して送れば良いみたいで早速
コード変換アルゴリズムを探したけど見当たらず。そんなに複雑ではないので以下自力で対応。

IBM拡張文字->NEC選定IBM拡張文字

FA40-FA49 EEEF-EEF8
FA54-FA57 EEF9-EEFC
FA4A-FA53 ---------
FA58-FA5B ---------
FA5C-FA7E ED40-ED62
FA80-FA9B ED63-ED7E
FA9C-FAFC ED80-EDE0
FB40-FB5B EDE1-EDFC
FB5C-FB7E EE40-EE62
FB80-FB9B EE63-EE7E
FB9C-FBFC EE80-EEE0
FC40-FC48 EEE1-EEE9
--------- EEEA-EEEC

[メモ] smailに実装予定です。

さくらVPS CentOS6.3 / Mondo Rescueで丸ごとバックアップしてVmware Playerへ

ネットで調べてみると、さくらVPSのOSをMondo Rescueでバックアップされている方がちらほらいたので、参考にしてバックアップして、Vmware Playerにセットしてみた。

さくらVPS CentOS6.3でまず、 Mondo Rescue関連をインストールします。
モジュールの取得:

wget ftp://ftp.mondorescue.org/rhel/6/x86_64/afio-2.5-1.rhel6.x86_64.rpm
wget ftp://ftp.mondorescue.org/rhel/6/x86_64/buffer-1.19-4.rhel6.x86_64.rpm
wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mindi-busybox-1.18.5-1.rhel6.x86_64.rpm
wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mindi-2.1.3-1.rhel6.x86_64.rpm
wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mondo-3.0.2-1.rhel6.x86_64.rpm

インストール:

rpm -iUvh afio-2.5-1.rhel6.x86_64.rpm
rpm -iUvh buffer-1.19-4.rhel6.x86_64.rpm
rpm -iUvh mindi-busybox-1.18.5-1.rhel6.x86_64.rpm
rpm -iUvh mindi-2.1.3-1.rhel6.x86_64.rpm
rpm -iUvh mondo-3.0.2-1.rhel6.x86_64.rpm

バックアップ:

mondoarchive -Oi -g -N -s 4200m -d /home/shoichi/backup -E /home/shoichi/backup

ISOイメージが出来上がります。(データベースとかWEBデータで30Gぐらいあるので、3時間かかかって圧縮されて4つのISOイメージになった)

-rw-r–r– 1 root root 4399417344 Sep 22 13:24 mondorescue-1.iso
-rw-r–r– 1 root root 4400060416 Sep 22 14:19 mondorescue-2.iso
-rw-r–r– 1 root root 4390195200 Sep 22 14:54 mondorescue-3.iso
-rw-r–r– 1 root root 3078658048 Sep 22 15:31 mondorescue-4.iso

Vmware Playerにセット:

CD/DVDにISOイメージ:mondorescue-1.isoをセットして起動します。
boot:
と出るので、
nuke[ENTER]とします。(自動モード)

mountlistの変更 (vda=>sda およびサイズ変更)

1) vda を sdaにすべて変更します。
2) SIZEの変更
  元のOS(100G)と同じサイズならそのままでいいですが、今回Vmwareの方は50Gにしたので変更が必要。
sda1,sda2のサイズはそのままにする(変更してはだめです。)
  sda3を残り全部にする。
  (SIZEに0を入れて[OK]とすると残り割り当てられるSIZEを表示されるので、その数値を入れ直して[OK]とする。

その後いろいろ聞いてきますが全て言いなりで[YES]としリストアーが始まります。
途中CD/DVDの交換要求がありますので、Vmware PlayerのCD-ROMアイコンをクリックして、順次mondorescue-2.iso..に設定し直して続行します。
リストアーが終わりと、各種設定変更画面が出ます。

1) /etc/fstab
変更なし、CTRL+Xで次へ
2) /etc/mtab
vdaをすべてsdaに変更
   CTRL+Wで上書き、CTRL+Xで次へ
3) /boot/grub/device.map
vdaをすべてsdaに変更
   CTRL+Wで上書き、CTRL+Xで次へ
4)/boot/grub/grub.conf
変更なし、CTRL+Xで次へ

#プロンプトになる。(viで正しく修正されたか確認)
リブートするとCentOS6.3が起動します。

*)さくらVPSはISOイメージでOSインストールできますので、Mondo Rescueで丸ごとバックアップしたISOイメージでリストアーできます。
ただし、さくらVPSはISOイメージのUPLOAD領域は5Gまでなので要注意です。

さくらのVPS ISOイメージインストール Windows 7 インストール

さくらのVPS は、8月から、 ISOイメージでもOSをインストールできるので、
Windows 7 ultimate 64bitをインストールしました。
WEBキャプチャーサーバとして、自宅サーバ(windows 7)を立てていたのですが、これで、自宅サーバもクローズできます。
BULK SERVER専用サーバも解約したので、だいぶコストダウンになりました。

現状の公開サービスメモ:

・WEBサーバ
・ダウンロードサーバ
・アイスバーブログパーツサーバ
・Opensim simulator (OSGRID) 4SIM(aska,aska I,aska II,aska III)
・とある検索サイト

・WEBキャプチャーサーバ
(ブログパーツサーバとのみハンドリング)

以前は、専用サーバ5,800円、自宅サーバ電気代200円で計6,000円/月
でしたが、2台で1,800円/月になりました。

vpsでの仮想サーバですが、アイスバーブログパーツサーバとWEBキャプチャーサーバのハンドリングパフォーマンスは、約6倍速(30秒かかってたのが5秒ぐらいになった^^。)
アイスバーブログパーツサーバ

OSgridに接続している、Opensim simulatorは、隣接SIMの移動は、前の専用サーバよりも体感的にスムーズになりました。
ただし、monoのCPU使用率が常時20~30%食ってます。専用サーバだと1%しか食ってなかったのに。
OSgrid / Aska /

*さくらのネットワークは、物理サーバを1Gbpsの超高速回線で接続、仮想サーバ側も100Mbps共有の高速回線なので、これが一番速度UPに効いているようです。
特にWEBキャプチャーサーバは、WEBページにアクセスして画像化するので。