2011-11-06
■[CentOS][backup]Mondo Rescueのインストール
自宅ルータをCentOS5.7を古いノートパソコンにインストールして自作したのだが、すぐに不具合が発生しそうで怖い。なのでDVDにでもバックアップしておこうかと思う。
backupツールとしては、Mondo Rescueなるソフトがisoイメージに圧縮できるなど、良いらしい。
[ThinkIT] 第1回:オープンソースMondo Rescueによるバックアップ手法 (1/3)
ひとまずインストールして、バックアップをしておこう。
インストール
OSはCentOS5.7です。
CentOS: MondoRescueの導入 | 自転車で通勤しましょ♪ブログ
yumでインストールできるものはyumで、rpmが必要なものはダウンロードしてインストール。
mkisofsはiosイメージを作るのに必要。cdrecordは焼付けに必要。lzo、lzopは圧縮に必要らしい。
# yum -y install mkisofs cdrecord
# cd /usr/local/src
# wget http://pkgs.repoforge.org/lzo/lzo-2.04-1.el5.rf.i386.rpm
# wget http://pkgs.repoforge.org/lzop/lzop-1.03-1.el5.rf.i386.rpm
# wget ftp://ftp.mondorescue.org/rhel/5/i386/afio-2.4.7-1.i386.rpm
# wget ftp://ftp.mondorescue.org/rhel/5/i386/buffer-1.19-1.i386.rpm
# wget ftp://ftp.mondorescue.org/rhel/5/i386/mindi-2.0.7.7-1.rhel5.i386.rpm
# wget ftp://ftp.mondorescue.org/rhel/5/i386/mindi-busybox-1.7.3-1.rhel5.i386.rpm
# wget ftp://ftp.mondorescue.org/rhel/5/i386/mondo-2.2.9.6-1.rhel5.i386.rpm
バックアップ
バックアップ先ディレクトリを作成して、そこに4.2GBで分割したフルバックアップのisoイメージを作成する。
# mkdir /var/backup
# mondoarchive -Oi -g -L -N -s 4200m -d /var/backup -E /var/backup
| オプション | 意味 |
|---|---|
| -Oi | isoイメージを生成 |
| -g | GUIを出力 |
| -L | lzoを利用して圧縮を行う |
| -s | メディアサイズを指定、ここでは4.2GB指定 |
| -d | バックアップを出力するディレクトリを指定 |
| -E | 除外ディレクトリを指定 |
[ThinkIT] 第1回:オープンソースMondo Rescueによるバックアップ手法 (3/3)
あとはバックアップしたisoイメージをcdrecordで焼き付ける。
# cdrecord -scanbus dev=ATAPI
# cdrecord -v -eject -speed=8 dev=ATAPI:0,0,0 /var/backup/mondorescue-1.iso
レストアするには、このDVDからブートしてnukeとすればよいらしい。
■参考サイト様
2011-10-31
■[NoSQL]Kyoto tycoonをインストール
公式サイト
Kyoto Cabinet: a straightforward implementation of DBM
Kyoto Tycoon: a handy cache/storage server
Kyoto cabinetをインストール
# wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.70.tar.gz
# apt-get install g++
zlibはインストールされているので無視する。
configure & make
# tar -zxvf kyotocabinet-1.2.70.tar.gz
# cd kyotocabinet-1.2.70
# ./configure
# make
# make install
インストールされているかテスト。下記が表示されれば問題なし。
# kchashmgr
kchashmgr: the command line utility of the file hash database of Kyoto Cabinet
usage:
kchashmgr create [-otr] [-onl|-otl|-onr] [-apow num] [-fpow num] [-ts] [-tl] [-tc] [-bnum num] path
kchashmgr inform [-onl|-otl|-onr] [-st] path
kchashmgr set [-onl|-otl|-onr] [-add|-rep|-app|-inci|-incd] [-sx] path key value
kchashmgr remove [-onl|-otl|-onr] [-sx] path key
kchashmgr get [-onl|-otl|-onr] [-rm] [-sx] [-px] [-pz] path key
kchashmgr list [-onl|-otl|-onr] [-max num] [-rm] [-sx] [-pv] [-px] path [key]
kchashmgr clear [-onl|-otl|-onr] path
kchashmgr import [-onl|-otl|-onr] [-sx] path [file]
kchashmgr copy [-onl|-otl|-onr] path file
kchashmgr dump [-onl|-otl|-onr] path [file]
kchashmgr load [-otr] [-onl|-otl|-onr] path [file]
kchashmgr defrag [-onl|-otl|-onr] path
kchashmgr setbulk [-onl|-otl|-onr] [-sx] path key value ...
kchashmgr removebulk [-onl|-otl|-onr] [-sx] path key ...
kchashmgr getbulk [-onl|-otl|-onr] [-sx] [-px] path key ...
kchashmgr check [-onl|-otl|-onr] path
Kyoto Tycoonのインストール
普通にダウンロードして、configure & make.
# wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.51.tar.gz
# tar -zxvf kyototycoon-0.9.51.tar.gz
# cd kyototycoon-0.9.51
# ./configure
# make
# make install
動作確認を行う。
下記のコマンドを入力する。
# ktserver
2011-10-31T16:44:07.113262+09:00: [SYSTEM]: ================ [START]: pid=19714
2011-10-31T16:44:07.113385+09:00: [SYSTEM]: opening a database: path=:
2011-10-31T16:44:07.113544+09:00: [SYSTEM]: starting the server: expr=:1978
2011-10-31T16:44:07.113607+09:00: [SYSTEM]: server socket opened: expr=:1978 timeout=30.0
2011-10-31T16:44:07.113627+09:00: [SYSTEM]: listening server socket started: fd=3
別でターミナルを立ち上げて、下のようになればOK。
$ ktremotemgr set japan tokyo
$ ktremotemgr set korea seoul
$ ktremotemgr set china beijing
$ ktremotemgr get japan
tokyo
$ ktremotemgr get korea
seoul
$ ktremotemgr get china
beijing
以上でインストールはOK。課題としてはレプリケーションなど。
2011-10-25
■[Cassandra][PHP]CassandraのPHP用クライアントをインストール
PHPからCassandraを使うには、ThriftをインストールしてPHP用Cassandraクライアントを生成するという方法もあるのですが、phpcassaなるライブラリを利用したらThriftのインストールがバッサリとショートカットできた…。
一応Thriftを使った方法はウノウラボさんの所で紹介されていますので、そちらを参照くださいませー
ウノウラボ by Zynga Japan: 今からはじめるCassandra入門
ひとまずこのエントリーではphpcassaのインストールと簡単な使い方を紹介しておきます。
phpcassaのインストール
# wget https://github.com/downloads/thobbs/phpcassa/phpcassa-0.8.a.2.tar.gz
# tar -zxvf phpcassa-0.8.a.2.tar.gz
# cp -R phpcassa-0.8.a.2 /usr/local/phpcassa
# cd /usr/local/phpcassa/thrift/ext/thrift_protocol
# phpize
# ./configure
# make && make install
上記では /usr/local にコピーしていますが、コピーする位置はお好みでどうぞ。
phpが認証するように、php.iniファイルへ記述。Ubuntuの場合はconf.dディレクトリにthrift_protocol.ini を作成。
# vi /etc/php5/apache2/conf.d/thrift_protocol.ini
以下を記述
extension=thrift_protocol.so
# apache2ctl restart
phpにthrift_protocolがインストールされているか確認。
/etc/php5/cli/conf.d/thrift_protocol.ini,
thrift_protocol
PWD => /usr/local/phpcassa/thrift/ext/thrift_protocol
_SERVER["PWD"] => /usr/local/phpcassa/thrift/ext/thrift_protocol
cassandra-cliでテストデータを追加。
# cassandra-cli
[default@unknown] connect localhost/9160;
[default@unknown] create keyspace Keyspace1;
[default@unknown] use Keyspace1;
[default@Keyspace1] create column family ColumnFamily1;
[default@Keyspace1] quit;
ひとまずテストスクリプトを書いて、動かしてみる。
<?php require_once '/usr/local/phpcassa/connection.php'; require_once '/usr/local/phpcassa/columnfamily.php'; // Making a Connection $pool = new ConnectionPool('Keyspace1', array('localhost')); // Getting a ColumnFamily $column_family = new ColumnFamily($pool, 'ColumnFamily1'); // Inserting Data $column_family->insert('row_key', array('col_name'=>'col_val')); // Getting Data $tmp_arr = $column_family->get('row_key', array('col_name')); print_r($tmp_arr); /* array( [col_name]=>[col_val] ) */ // Removing Data $column_family->remove('row_key', array('col_name')); $pool->close();
phpcassaのドキュメントはこちら。
phpcassa 0.8.a.2 Documentation — phpcassa v0.8.a.2 documentation
2011-10-24
■[Cassandra][NoSQL]Thriftのインストール
Cassandraをインストールして、PHPクライアントをインストールしようと思ったのだが、Thriftのインストールが必要というのでインストールした。ところがphpcassaを使えば、Thriftはインストールせずにいけた orz まぁ幾つかハマりどころがあったのでメモしておこうと思う。
環境はUbuntu 10.10。Cassandraはインストール済み。
必要なライブラリ
このあたりは公式wikiにある内容をそのままapt-getしてやればOK。
GettingDebianPackages - Thrift Wiki
# apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
ダウンロード、インストール
http://thrift.apache.org/download/
# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache//thrift/0.7.0/thrift-0.7.0.tar.gz
# tar -zxvf thrift-0.7.0.tar.gz
# cd thrift-0.7.0
configureでなぜかpermission denied
# chmod 755 *
# ./configure
ハマりどころその1。
2011/9/1 追記。
thrift-0.7.0が出ていたのでビルドしようとしたら configureに実行可能フラグが立っておらず、ビルドできませんでした。どうもアーカイブか壊れている気がします。他のファイルも怪しいです。
install-shも実行可能になってませんね。以下のコマンドで修正してください。
chmod +x configure install-sh
# tar -zxvf apache-thrift-8514755.tar.gz
# cd apache-thrift-8514755
# ./bootstrap.sh
# ./configure
ハマりどころその2。
makeするとなぜかfastbinary.cでハマる。Python関係のライブラリの様子。以下エラー文。
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.6 -c src/protocol/fastbinary.c -o
build/temp.linux-x86_64-2.6/src/protocol/fastbinary.o
src/protocol/fastbinary.c:20:20: error: Python.h: No such file or directory
src/protocol/fastbinary.c:21:23: error: cStringIO.h: No such file or directory
src/protocol/fastbinary.c:138: error: expected specifier-qualifier-list before ‘PyObject’
src/protocol/fastbinary.c:148: error: expected specifier-qualifier-list before ‘PyObject’
src/protocol/fastbinary.c:157: error: expected specifier-qualifier-list before ‘PyObject’
src/protocol/fastbinary.c:168: error: expected specifier-qualifier-list before ‘PyObject’
src/protocol/fastbinary.c:178: error: expected specifier-qualifier-list before ‘PyObject’
src/protocol/fastbinary.c:183: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
src/protocol/fastbinary.c:185: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
src/protocol/fastbinary.c: In function ‘check_ssize_t_32’:
src/protocol/fastbinary.c:190: warning: implicit declaration of function ‘PyErr_Occurred’
src/protocol/fastbinary.c:194: warning: implicit declaration of function ‘PyErr_SetString’
src/protocol/fastbinary.c:194: error: ‘PyExc_OverflowError’ undeclared (first use in this function)
src/protocol/fastbinary.c:194: error: (Each undeclared identifier is reported only once
src/protocol/fastbinary.c:194: error: for each function it appears in.)src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:201: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:220: error: expected declaration specifiers or ‘...’ before ‘PyObject’src/protocol/fastbinary.c: In function ‘parse_set_list_args’:
src/protocol/fastbinary.c:221: warning: implicit declaration of function ‘PyTuple_Size’src/protocol/fastbinary.c:221: error: ‘typeargs’ undeclared (first use in this function)
src/protocol/fastbinary.c:222: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c:226: warning: implicit declaration of function ‘PyInt_AsLong’
src/protocol/fastbinary.c:226: warning: implicit declaration of function ‘PyTuple_GET_ITEM’
src/protocol/fastbinary.c:231: error: ‘SetListTypeArgs’ has no member named ‘typeargs’
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:237: error: expected declaration specifiers or ‘...’ before ‘PyObject’
src/protocol/fastbinary.c: In function ‘parse_map_args’:src/protocol/fastbinary.c:238: error: ‘typeargs’ undeclared (first use in this function)
src/protocol/fastbinary.c:239: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c:253: error: ‘MapTypeArgs’ has no member named ‘ktypeargs’src/protocol/fastbinary.c:254: error: ‘MapTypeArgs’ has no member named ‘vtypeargs’
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:260: error: expected declaration specifiers or ‘...’ before ‘PyObject’
src/protocol/fastbinary.c: In function ‘parse_struct_args’:
src/protocol/fastbinary.c:261: error: ‘typeargs’ undeclared (first use in this function)
src/protocol/fastbinary.c:262: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c:266: error: ‘StructTypeArgs’ has no member named ‘klass’
src/protocol/fastbinary.c:267: error: ‘StructTypeArgs’ has no member named ‘spec’
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:273: error: expected declaration specifiers or ‘...’ before ‘PyObject’
src/protocol/fastbinary.c: In function ‘parse_struct_item_spec’:
src/protocol/fastbinary.c:276: error: ‘spec_tuple’ undeclared (first use in this function)
src/protocol/fastbinary.c:277: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c:291: error: ‘StructItemSpec’ has no member named ‘attrname’
src/protocol/fastbinary.c:292: error: ‘StructItemSpec’ has no member named ‘typeargs’
src/protocol/fastbinary.c:293: error: ‘StructItemSpec’ has no member named ‘defval’
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:304: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:309: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:314: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:319: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:324: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:338: error: expected ‘)’ before ‘*’ token
src/protocol/fastbinary.c:584: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
src/protocol/fastbinary.c: In function ‘free_decodebuf’:
src/protocol/fastbinary.c:613: warning: implicit declaration of function ‘Py_XDECREF’
src/protocol/fastbinary.c:613: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:614: error: ‘DecodeBuffer’ has no member named ‘refill_callable’
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:618: error: expected declaration specifiers or ‘...’ before ‘PyObject’
src/protocol/fastbinary.c: In function ‘decode_buffer_from_obj’:
src/protocol/fastbinary.c:619: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:619: warning: implicit declaration of function ‘PyObject_GetAttr’
src/protocol/fastbinary.c:619: error: ‘obj’ undeclared (first use in this function)
src/protocol/fastbinary.c:619: error: ‘_intern_cstringio_buf’ undeclared (first use in this function)
src/protocol/fastbinary.c:620: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:624: warning: implicit declaration of function ‘PycStringIO_InputCheck’
src/protocol/fastbinary.c:624: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:626: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c:630: error: ‘DecodeBuffer’ has no member named ‘refill_callable’
src/protocol/fastbinary.c:630: error: ‘_intern_cstringio_refill’ undeclared (first use in this function)
src/protocol/fastbinary.c:632: error: ‘DecodeBuffer’ has no member named ‘refill_callable’
src/protocol/fastbinary.c:637: warning: implicit declaration of function ‘PyCallable_Check’
src/protocol/fastbinary.c:637: error: ‘DecodeBuffer’ has no member named ‘refill_callable’
src/protocol/fastbinary.c: In function ‘readBytes’:
src/protocol/fastbinary.c:653: error: ‘PycStringIO’ undeclared (first use in this function)
src/protocol/fastbinary.c:653: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:660: error: ‘PyObject’ undeclared (first use in this function)
src/protocol/fastbinary.c:660: error: ‘newiobuf’ undeclared (first use in this function)
src/protocol/fastbinary.c:663: warning: implicit declaration of function ‘PyObject_CallFunction’
src/protocol/fastbinary.c:664: error: ‘DecodeBuffer’ has no member named ‘refill_callable’
src/protocol/fastbinary.c:664: error: ‘NULL’ undeclared (first use in this function)
src/protocol/fastbinary.c:670: warning: implicit declaration of function ‘Py_CLEAR’
src/protocol/fastbinary.c:670: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:671: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:673: error: ‘DecodeBuffer’ has no member named ‘stringiobuf’
src/protocol/fastbinary.c:681: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c: In function ‘checkTypeByte’:
src/protocol/fastbinary.c:745: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c: In function ‘skip’:
src/protocol/fastbinary.c:857: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:870: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
src/protocol/fastbinary.c:874: error: expected declaration specifiers or ‘...’ before ‘PyObject’
src/protocol/fastbinary.c:874: error: expected declaration specifiers or ‘...’ before ‘PyObject’
src/protocol/fastbinary.c: In function ‘decode_struct’:
src/protocol/fastbinary.c:875: error: ‘spec_seq’ undeclared (first use in this function)
src/protocol/fastbinary.c:883: error: ‘PyObject’ undeclared (first use in this function)
src/protocol/fastbinary.c:883: error: ‘item_spec’ undeclared (first use in this function)
src/protocol/fastbinary.c:884: error: ‘fieldval’ undeclared (first use in this function)
src/protocol/fastbinary.c:884: error: ‘NULL’ undeclared (first use in this function)
src/protocol/fastbinary.c:901: error: ‘Py_None’ undeclared (first use in this function)
src/protocol/fastbinary.c:912: error: too many arguments to function ‘parse_struct_item_spec’
src/protocol/fastbinary.c:917: error: ‘PyExc_TypeError’ undeclared (first use in this function)
src/protocol/fastbinary.c:924: warning: implicit declaration of function ‘decode_val’
src/protocol/fastbinary.c:924: error: ‘StructItemSpec’ has no member named ‘typeargs’
src/protocol/fastbinary.c:929: warning: implicit declaration of function ‘PyObject_SetAttr’
src/protocol/fastbinary.c:929: error: ‘output’ undeclared (first use in this function)
src/protocol/fastbinary.c:929: error: ‘StructItemSpec’ has no member named ‘attrname’
src/protocol/fastbinary.c:930: warning: implicit declaration of function ‘Py_DECREF’
src/protocol/fastbinary.c: At top level:
src/protocol/fastbinary.c:942: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
src/protocol/fastbinary.c:1160: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
src/protocol/fastbinary.c:1195: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ThriftFastBinaryMethods’
src/protocol/fastbinary.c:1204: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘initfastbinary’
error: command 'gcc' failed with exit status 1
make[3]: *** [all-local] エラー 1
make[3]: ディレクトリ `/usr/local/src/apache-thrift-8514755/lib/py' から出ます
make[2]: *** [all-recursive] エラー 1
make[2]: ディレクトリ `/usr/local/src/apache-thrift-8514755/lib' から出ます
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ `/usr/local/src/apache-thrift-8514755' から出ます
make: *** [all] エラー 2
ggrと次の情報がヒット
lib/py/setup.pyがPython用のライブラリなので、そのなかにあるfastbinaryに関する記述をコメントアウト。
include_dirs = [] if sys.platform == 'win32': include_dirs.append('compat/win32') #fastbinarymod = Extension('thrift.protocol.fastbinary', # sources = ['src/protocol/fastbinary.c'], # include_dirs = include_dirs, # ) setup(name = 'thrift', version = '0.8.0-dev', description = 'Python bindings for the Apache Thrift RPC system', author = ['Thrift Developers'], author_email = ['dev@thrift.apache.org'], url = 'http://thrift.apache.org', license = 'Apache License 2.0', packages = [ 'thrift', 'thrift.protocol', 'thrift.transport', 'thrift.server', ], package_dir = {'thrift' : 'src'}, #ext_modules = [fastbinarymod],
該当箇所をコメントアウトした後、make && make install。
# make && make install
次のコマンドを叩いてみてバージョンが出るようなら問題なし。
# thrift -version
2011-10-22
■[windows]dropboxがインストール出来ない!
自宅PC(windows7)のdropboxのバージョンを見ると最新バージョンではない。これは更新するべとdropbox1.1.46を落としてきてインストール。すると途中でインストール失敗。まぁ仕方ないよねwindowsだもんね。俺のwindowsはそんなに可愛いはずがない(c)伏見つかさ。
インストールファイルを右クリックして「管理者権限で実行」。それはともかくとしてこんな雑事はぱっぱと済ませるに限る。日常的に使うPCがこんなに面倒くさくていいのか?こちらの方もMacに趣旨替えしょうかな…。
追記 2011/10/24
ユーザログイン時にスタートアップに追加されているにも関わらず、自動でdropboxが起動しない場合がある。その場合タスクに追加してしまえば良い。
コントロールパネル→システムとセキュリティ→タスクのスケジュール
右カラムの「タスクの作成」をクリック。
全般の名前には「dropbox」と記入。
トリガータブを開き、新規トリガーを追加。新しくウィンドウが開くので、タスクの開始を「ログオン時」に変更。
操作のタブで、新規操作を追加。操作はプログラムの開始のままで、プログラム/スクリプトのフォームにC:\Users\yuki\AppData\Roaming\Dropbox\bin\Dropbox.exeと追加。
これでいけました。これでダメそうな場合はUAC周りを変更しましょう。





助かりました。ありがとうございます。