MySQLとpostgresqlでのレプリケーション動作検証時使用perlスクリプト


MySQLのレプリケーション機能を使うとどのような動きをするのかを確認中。

テストデータのインサートと確認を行うためのスクリプトを作成した。

標準で用意されているデータベース「test」内にテーブル「testtable」を作成して、そこにデータを投入することにした。

# mysql -u root
mysql> use test;
mysql> create table testtable (
	id int(20) not null auto_increment,
	name char(100) default '' not null,
	text char(255) default '',
	primary key (id)
);
mysql> grant all on test.* to テストユーザ名@ホスト名 identified by 'パスワード';
mysql>

スクリプトはperl。
perl-DBD-MySQLパッケージをインストールしておくこと。

#!/usr/bin/perl

use DBI;

my $mysqluser="MySQL内のユーザ名";
my $mysqlpassword="パスワード";
my $masterserver="マスタサーバ名";
my $slaveserver="スレーブサーバ名";
my $dbname="test";
my $tablename="testtable";
$max=5;

sub getselect{
	my($server,$user,$password,$dbname,$tablename)=@_;
	my $db=DBI->connect("DBI:mysql:$dbname:$server",$user,$password);
	my $sth=$db->prepare("select id,name,text from $tablename order by id desc");
	$sth->execute;
	print "\tname\ttext\n";
	my $count=$max;
	for(my $i=0; $i<$sth->rows; $i++){
		my @tmp=$sth->fetchrow_array;
		if($count>0){
			print $tmp[0] ."\t". $tmp[1] ."\t". $tmp[2] ."\n";
			$count--;
		}
	}
	$sth->finish;
	$db->disconnect;
}

sub insertvalue{
	my($server,$user,$password,$dbname,$tablename)=@_;
	my $db=DBI->connect("DBI:mysql:$dbname:$server",$user,$password);
	my $str1=substr("00".rand(100),-3);
	my $str2=localtime();
	my $sth=$db->prepare("insert into $tablename values (NULL,'name$str1','$str2')");
	$sth->execute;
	$sth->finish;
	$db->disconnect;
}

if($ARGV[0] =~ /ins/){
	print "=== insert ===\n";
	insertvalue($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);
}

print "=== master:$masterserver ===\n";
getselect($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);

print "=== slave:$slaveserver ===\n";
getselect($slaveserver,$mysqluser,$mysqlpassword,$dbname,$tablename);

使い方
情報確認のみ「mysqltest.pl」
データ追加と情報確認「mysqltest.pl ins」

オプションとして「ins」(insert)を指定すると、データを追加する、というもの。

実行すると以下の様な形となる。

# mysqltest.pl ins
=== insert ===
=== マスタサーバ ===
name    text
248     name284 Fri Jun 20 11:42:01 2014
247     name563 Fri Jun 20 11:35:01 2014
246     name934 Fri Jun 20 11:28:01 2014
245     name769 Fri Jun 20 11:21:01 2014
244     name227 Fri Jun 20 11:14:01 2014
=== スレーブサーバ ===
name    text
248     name284 Fri Jun 20 11:42:01 2014
247     name563 Fri Jun 20 11:35:01 2014
246     name934 Fri Jun 20 11:28:01 2014
245     name769 Fri Jun 20 11:21:01 2014
244     name227 Fri Jun 20 11:14:01 2014
#

「単純増加する数字 name+ランダム数字 日付」という出力内容のうち、最新の5件のみ表示する、というものになっている。

マスタサーバの出力内容と、スレーブサーバの出力内容を比べる、というもの。


2021/05/19

postgresql環境でのバックアップ試験のためにこのスクリプトを流用しようとしたところ、作り直しが必要なポイントがあった。

まずはテーブル作成時の違い

create table testtable (
	id int(20) not null auto_increment,
	name char(100) default '' not null,
	text char(255) default '',
	primary key (id) 
);

これをそのまま実行すると下記エラーになる

ERROR:  syntax error at or near "("
LINE 2: id int(20) not null auto_increment,

int型auto_increment属性というのはMySQL特有で、postgresqlではserial型で置き換える。
「int(20) auto_increment」→「serial」に変更すると、以下のようになる。

create table testtable (
	id serial not null,
	name char(100) default '' not null,
	text char(255) default '',
	primary key (id) 
);

また、perlモジュールは DBD:mysqlではなくDBD:Pgに変更になり、データベースとホスト指定手法が変わった。

パッケージとしては perl-DBD-Pg をインストールする。

#!/usr/bin/perl

use DBI;

my $mysqluser="postgresql内のユーザ名";
my $mysqlpassword="パスワード";
my $masterserver="マスタサーバ名";
my $slaveserver="スレーブサーバ名";
my $dbname="test";
my $tablename="testtable";
$max=5;

sub getselect{
        my($server,$user,$password,$dbname,$tablename)=@_;
        my $db=DBI->connect("DBI:Pg:dbname=$dbname;host=$server",$user,$password);
        my $sth=$db->prepare("select id,name,text from $tablename order by id desc");
        $sth->execute;
        print "\tname\ttext\n";
        my $count=$max;
        for(my $i=0; $i<$sth->rows; $i++){
                my @tmp=$sth->fetchrow_array;
                if($count>0){
                        print $tmp[0] ."\t". $tmp[1] ."\t". $tmp[2] ."\n";
                        $count--;
                }
        }
        $sth->finish;
        $db->disconnect;
}

sub insertvalue{
        my($server,$user,$password,$dbname,$tablename)=@_;
        my $db=DBI->connect("DBI:Pg:dbname=$dbname;host=$server",$user,$password);
        my $str1=substr("00".rand(100),-3);
        my $str2=localtime();
        my $sth=$db->prepare("insert into $tablename (name, text) values ('name$str1','$str2')");
        $sth->execute;
        $sth->finish;
        $db->disconnect;
}

if($ARGV[0] =~ /ins/){
        print "=== insert ===\n";
        insertvalue($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);
}

print "=== postgresql:$masterserver ===\n";
getselect($masterserver,$mysqluser,$mysqlpassword,$dbname,$tablename);

print "=== slave:$slaveserver ===\n";
getselect($slaveserver,$mysqluser,$mysqlpassword,$dbname,$tablename);

CentOS5でFedora20やRHEL6のrpmがrpm2cpioで展開できない



CentOS5環境で、Fedora20のRPMファイルを展開しようとした。

# wget http://archives.fedoraproject.org/pub/fedora/linux/updates/20/i386/nss-3.16.1-1.fc20.i686.rpm
# rpm2cpio nss-3.16.1-1.fc20.i686.rpm |cpio -ivd
cpio: warning: skipped 6151 bytes of junk
cpio: warning: archive header has reverse byte-order
cpio: g イaォ7・
             z,a1m俿イフJcレ[}\&・dDDシFンWロ [&;Y(・・クJ.疱:: unknown file type
cpio: premature end of file
#

エラー・・・

調べてみると、この展開の問題はRHEL5での問題らしい。
Bug 602423 – rpm2cpio fails on rhel-6 rpms
Bug 837945 – Can’t extract rpms from RHEL6 on RHEL5

Bug 602423の方に、この問題に対処するための、rpm2cpio.shというのがアップロードされている。(patched parmezan, works for me on rhel5 (1.48 KB, application/x-sh) というやつ)

このrpm2cpio.shを使ってみると、期待通りの動作をした。

# ./rpm2cpio.sh nss-3.16.1-1.fc20.i686.rpm|cpio -ivd
./etc/pki/nssdb
./etc/pki/nssdb/cert8.db
./etc/pki/nssdb/cert9.db
./etc/pki/nssdb/key3.db
./etc/pki/nssdb/key4.db
./etc/pki/nssdb/pkcs11.txt
./etc/pki/nssdb/secmod.db
./usr/lib/libnss3.so
./usr/lib/libnsspem.so
./usr/lib/libsmime3.so
./usr/lib/libssl3.so
./usr/lib/nss/libnssckbi.so
./usr/share/man/man5/cert8.db.5.gz
./usr/share/man/man5/cert9.db.5.gz
./usr/share/man/man5/key3.db.5.gz
./usr/share/man/man5/key4.db.5.gz
./usr/share/man/man5/pkcs11.txt.5.gz
./usr/share/man/man5/secmod.db.5.gz
5146 blocks
#

rpm2cpio.shの中を確認してみる。

#!/bin/sh

pkg=$1
if [ "$pkg" = "" -o ! -e "$pkg" ]; then
    echo "no package supplied" 1>&2
   exit 1
fi

leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
echo `od -j $o -N 8 -t u1 $pkg`
 echo "sig il: $il dl: $dl"

sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`
 echo "hdr il: $il dl: $dl"
exit

hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`
EXTRACTOR="dd if=$pkg ibs=$o skip=1"

COMPRESSION=`($EXTRACTOR |file -) 2>/dev/null`
if echo $COMPRESSION |grep -q gzip; then
        DECOMPRESSOR=gunzip
elif echo $COMPRESSION |grep -q bzip2; then
        DECOMPRESSOR=bunzip2
elif echo $COMPRESSION |grep -q xz; then
        DECOMPRESSOR=unxz
elif echo $COMPRESSION |grep -q cpio; then
        DECOMPRESSOR=cat
elif $EXTRACTOR | od -x | head -1 | grep -q '37fd 587a '; then
        DECOMPRESSOR=unxz
else
        # Most versions of file don't support LZMA, therefore we assume
        # anything not detected is LZMA
        DECOMPRESSOR=`which unlzma 2>/dev/null`
        case "$DECOMPRESSOR" in
            /* ) ;;
            *  ) DECOMPRESSOR=`which lzmash 2>/dev/null`
                 case "$DECOMPRESSOR" in
                     /* ) DECOMPRESSOR="lzmash -d -c" ;;
                     *  ) DECOMPRESSOR=cat ;;
                 esac
                 ;;
        esac
fi

$EXTRACTOR 2>/dev/null | $DECOMPRESSOR

CentOS5ではサポートされていないヘッダと署名部分を削除してから、個別で展開しているような感じですかね。

技適はいくらかかるのか?


<警告>

下記に記述している内容は、「総務省電波利用ホームページ」「TELEC」「(株)日本電波法認証ラボラトリー」(2023/06/29に確認したらリンク先が詐欺サイトになっていた… http://www.jrlc-lab.com/)の記述を元に書きましたが誤っている可能性があります。

記載した内容は、あくまで、気になったから調べてみた、というものです。
きちんとしたことを確認したい場合は、総務省やTELECなどの問い合わせてください。


日本国内において、日本の携帯電話会社のSIMを使って、携帯電話を利用する場合、その携帯電話に「技術基準適合証明」もしくは「工事設計認証」を取得されている必要があります。

ちなみに、よく「技適」とか言っていますが、総務省では「技術基準適合証明等」や「技術基準適合証明又は工事設計認証」と言っており、「技適マーク」も「特定無線設備の技術基準適合証明等のマーク」というのが正式な表記となります。

アマチュア無線をやってる人にとっては、「技適」とか各種免許の存在は、ごくふつーのことなので、スルーしてしまいがちなのですが説明したいと思います。

まず、そもそもなのですが、携帯電話とは個人用の携帯型「無線局」です。

この無線局を取り扱うには、「無線局を使う人の免許(従事者免許)」、「無線局の免許(局免)」「使用する無線機が基準を満たしていることの証明検査(落成検査)」の3つが必要です。

機器の検査は「落成検査」というもので、無線機器の回路図等を提出し、それが適切に動作しているのかを、検査官が実際に来てチェックを行います。(車検みたいなものです)
そして、その無線局に対して、電波を出す許可として「無線局免許(局免)」が交付されます。

初期は、同じ設計の無線機を使っていたとしても、この「落成検査」を無線機毎にやっていました。
が、設計が同じものを使ってるなら簡略化できないか、ということで考え出された制度が「工事設計認証」と「技術基準適合証明」です。

この2つは、無線機のメーカもしくは販売店側で申請しておき、ユーザ側では無線機に関する申請を行う必要がない、というものになります。

携帯電話の場合、従事者免許は免除されています。

無線局免許は、基地局側で一括申請、みたいな扱いになります。

使用する無線機自体の検査は、「工事設計認証」か「技術適合証明」で行うことになっています。


さて、工事設計認証および技術適合証明にかかる費用について調べていきます。

TELEC「【技術基準適合証明・工事設計認証とは】」の説明を一部引用します。

「工事設計認証」は、同じ設計でつくられた無線機であれば、動作状況は同じ、という観点での許可です。
それに対して「技術基準適合証明」は、メーカ出荷前に各無線機をまとめて検査しておく、というものです。

費用の違いですが、「技術基準適合証明」では1台あたりにかかります。
それに対して「工事設計認証」の方は1機種、という単位での費用となります。

それではTELEC掲示の手数料(2014年時点)を元に妄想してみましょう。(2023/06/29時点での資料はこちら)

無線機は、使用する無線周波数帯域毎に認証が必要です。(アメリカを含め、世界的にそういう制度です。技適だからどうの、という話はありません)

このため、Androidスマートフォン、という観点で考えますと「WiFi」「Bluetooth」「WCDMA」とかサポートしている周波数帯域が増えるごとに検査項目が増え、費用が増すことになります。

— 2014/06/18追記 —
上記では「WCDMA」は1つ、という書き方をしていますが、「2100MHz(Band1)」「800MHz(Band9)」という風に各バンド毎に費用がかかる可能性もあります。
また、上記では省略しましたが「WCDMA」と「LTE」では区分が違うため、おそらく別費用です。
(WCDMA=「DS-CDMA携帯無線通信陸上移動局」,LTE=「SC-FDMA携帯無線通信陸上移動局」)
— 追記終了 —

「工事設計認証」 の場合

・WiFi 手数料:15万+試験手数料:9万
・Bluetooth 手数料:15万+試験手数料:9万
・WCDMA 手数料:25万+試験手数料:12万

総計すると 手数料55万+試験手数料30万 = 85万
複数項目ある場合は割引処置があるようです。
また、製造工場がISO9000s認定を受けていない場合は、手数料が6万円加算とのこと。

「技術基準適合証明」 の場合

特定無線設備の特性試験および試験項目によれば、実際には全数チェックではなく、サンプリング抽出を行い、その台数全てが試験に合格する必要があります。(【技術基準適合証明及び認証に関するQ&A】より)
100台申請の場合、実際に検査するのは8台です。

手数料は、基本料+抜き取り検査を行った台数分の手数料(2台目以降割引)、となります。

100台の場合は8台検査なので、以下の様になるようです。
・基本料 20000
・WiFi 24000+16000*7 = 136000
・Bluetooth 24000+1600*7 = 136000
・WCDMA 42000+32000*7 = 266000

総計558,000円…1台あたり5580円。
で、こちらも複数項目ある場合は割引処置があるようです。
(ちなみに、1台だけで申請したとすると、20000+24000+24000+42000=11万)

で・・・ここで出た費用は、あくまで、取得するのに必要な最低費用です。

実際には、技術基準満たしており、試験項目を通過できるように、製品の品質を揃えておく必要があります。
申請したけど、これらの基準を満たせなかった場合は「再申請」となります。

海外から端末を持ってくる場合は、その端末が日本の基準を満たしているのか、といったことをあらかじめ確認し、足りていなければ設計を変更する、などを行う必要があります。

ここのプロセスにどれくらい手間と費用がかかるか、という点が、無視できない要素だと思われます。
で・・・ここらへんのコストをどれくらい見込むか、というところが、端末価格に響いてきます。

技適を100台分申請して、サンプル検査で引っかかり1回落ちた、2回目の申請で通過した、なんてことになったら、56万*2回な上に、サンプル検査で引っかかったところを改修するのにいくらかかることやら・・・とかね。


2014/06/19追記

電気安全環境研究所(JET)にて「法律に基づく検査 電波法:技術基準適合証明・認証」というページを発見。

取得の際に必要な手続きの流れが解説されていました。


2015/02/20追記

Cerevo TechBlogで「自前で技適を取得し、中華の安価なBLEモジュールを使って製品を作る方法」という記事が公開されました。

業務として製品を出したい場合に、どのような感じで手続きを行っているのかが書かれているので、参考になるかと思います。

Nimble Storage CS700とAll-Flash構成が登場



HDD+SDDのハイブリット型iSCSIストレージのNimble Storageに新機種CS700と、All-Flash構成が登場したようです。

リリース:Nimble Storage Redefines Storage Market With Adaptive Flash Platform

4xCS700という最大のクラスタ構成+All-Flashにした場合に、500,000 IOPSを提供するという、CS700というモデルと、それに使用するAll-FlashエンクロージャES1-AFSがリリースされました。

単体のCS700としては、CS400シリーズの2.5倍速い、とうたっています。
adaptive-flash6

公式のスペック情報など出ている限りの情報を確認してみたところ、CS700のスペックとしては、以下の様な感じです。

・CS400シリーズの2.5倍速い
・ストレージ容量などはCS460相当
・ネットワークポート数が変更
標準 1Gb*2ポート
増設 「10Gb-T*4ポート」or「10Gb SFP+*4ポート」

1Gbで使うことは想定されなくなった模様・・・まぁ、この高スペックを1Gbで使うというのは、意味が無いですからね。

ただ・・・スペック情報ページに「It delivers up to 2.5x the performance of the CS400 series.」と書いてあるのに、上にも引用している画像では、どう見ても2.5倍無いんだけどなぁ・・・

All-Flashエンクロージャの方は全然情報がない。
CS700に接続できる、というのは、ほぼ確定ですが、それ以外のモデルに接続できるのかどうか、というところ。

おそらくは、現在RC版のNimble OS 2.1か、その次のバージョンあたりがAll-Flash対応のOSになるんだろうけど、果たしてどうなるのか?
少なくとも、現状公開されているNimble OS 2.1のマニュアルでは、記載を発見できませんでした。
PDFカタログの書きようをみると、全モデルで使えそうな感じもします・・・

PDFカタログに「Max Flash Capacity with All-Flash Shelf (GB)」という欄がありました。
CS2xxシリーズは、All-Flash非対応
CS4xxとCS700がAll-Flash対応、とのこと。

ポラスマのOEM元を調べようとして断念したメモ



ポラロイドから出ているポラスマのOEM元を調べようした時のメモ。

造形的に一番近いのは、Gionee Elife E3なんだけど、正面カメラの位置、背面のカメラとフラッシュの位置が逆、とか、4.7インチ液晶、とかで、違う・・・
02171053ao0f
021717374vyg
7.9mm厚、とか似てる点もあるんだけどねぇ・・・

ascii.jp:SIMフリーのキッズ向けスマホ!?気になるPolaSmaとKurio実機レビューと、インプレス:ポラロイドの大人向けSIMロックフリースマホ「LINEAGE」に写っているバッテリーに書かれたメーカ「深圳市朝力亚电子有限公司」は、調べてみると、バッテリー屋さん
バッテリーの製造元、というだけだった。