雑記帳 2009年 5月第2週

2009/05/03 Sun.

undefined.

2009/05/04 Mon.

undefined.

2009/05/05 Tue.

undefined.

2009/05/06 Wed.

就職してから初めての予定が皆無のGWだったのでは?本当に何もしないで連休を過ごすというのは、やはり苦痛でしかない。
1年目は何だっけか、2年目は伊豆、3年目は仙台、4年目は郡山、5年目は南九州、6年目は沖縄。もっと旅行行きたいなー。

で、連休中は何をやっていたかを白状すると、実際のとこ、俺は何やってたんだ?ロマサガ3?「932SH」関連とか。
そうそう、色々やってみたけれど「932SH」の操作感を軽くするのは限界がありそうだな。そろそろ諦め気味かも。
後はmicroSDに関してあれこれと。どこに何を入れれば使えるようになるのかが理解しづらい。説明書に何も書いてないし。
画像は\PRIVATE\MYFOLDER\My Items\Picturesに、着メロは\PRIVATE\MYFOLDER\My Items\Sounds & Ringtonesに。
暇つぶし用にテキストをHTMLベースで持ち歩くならローカルコンテンツ。場所は\PRIVATE\MYFOLDER\Local Contentsです。
最近の携帯には着うたとやらがあるらしいけど、この携帯でも自作で作れんのかな。wavベースのmmfを作ってみるか。

メール着信用の着うたを作ろうってことで、適当な15秒程度のwavを用意。サンプリングレートは後で変換が必要。
YAMAHAのサイトからSMAFを生成する「サウンドデコレータ」を落としてインストール。とりあえず立ち上げておきます。
先ほど用意した15秒程度のwavを「サウンドデコレータ」で取り込み、EditのSample Typeから22,050Hzに変換しておく。
これをMA-7でSave Asでファイル名を指定して保存すると、mmfに変換されたwavが完成。「932SH」は300KBの制限あり。
ちなみに15秒ジャストのwavから22,050Hzに変換して作成したmmfのモノラルのファイルサイズは165,589バイト。
これが25秒になると275,838バイト、30秒で330,963バイト。28秒で308,915バイトのmmfの再生はできなかった。
300KBは307,200バイトなので、制限に引っかかった模様。27秒で297,888バイトのmmfあたりで妥協しておこう。

で、YAMAHAのサイトで「SMAF対応携帯電話端末」なんてページがあった。こんなのはさっさとブックマーク行きだ。
上記のはモノラルで作成したけど、ステレオだと単純にファイルサイズが倍になるっぽい。13~14秒しか再生できないか。
どうせ自分には電話がかかってくることは滅多に無いし、メール用だけ用意しておけばいいか。色々作っておこう。

で、ちょっとメモ。「SoundEngine Free」でwavを編集する際、いちいちmp3をwavにデコードするのがメンドくなった。
調べてみたら、「SoundEngine Free」のインストールディレクトリ下にlame_enc.dllとVBMP3.dllを置けばmp3を直接読めるとか。
早速実験してみる。mp3を直接ドロップして開いてみると、何やらデコードを行っているようなプロンプトが出てきた。
数秒もするとデコードが完了し、そのまま編集作業ができるようになりました。やべ、これ便利だな。早く導入するべきだった。

[Folder Open]

[Trim]
Selection=0,0:27,-1

[Folder Save]
Sec=None
Extension=wav

ついでなので、「SoundEngine Free」でファイルの先頭27秒を切り出してwavで保存するスクリプトを書いておこう。
でも、mmfへの変換は全て手作業でやらないとダメなんだよな、これはメンドいかもしれん。暇な時にでもやろうか。

2009/05/07 Thu.

今日から「MySQL」の勉強を開始。ついでにJavaのSwingと合わせて低コストな開発手法を覚えておきたい。
この場合のコストというのは作業量を指すものではなくて、費用的な意味です。JavaでSwingだったら作業量は増えるし。

まずはインストーラーを「ここ」からダウンロードしてインストール。mysql-5.1.34-win32.msiって名前のインストーラーかな。
基本的なインストール手順は「MySQL初心者入門講座」を参考。いいんです、俺は超初心者ですので。
一通りのインストールが終わったら、外部プログラムから接続できるようにコネクタを導入。「ここ」からダウンロード。
Accessで使うにはConnector/ODBCからmysql-connector-odbc-5.1.5-win32.msiを入れる。ODBCデータソース設定は後で。
Javaからも使うので、Connector/Jからmysql-connector-java-5.1.7.zipを落として解凍しておきます。
肝心のライブラリはこのzipの中のmysql-connector-java-5.1.7-bin.jarというもの。CLASSPATHも設定しておきます。
MySQL」のインストール時に指定したポート番号は、Windows ファイアウォールで例外設定をして、穴を開けておきます。

で、早速コマンドプロンプトからログイン。バージョン情報が表示されますが、導入したバージョンは以下の通り。

Server version: 5.1.34-community MySQL Community Server (GPL)

で、とにかく使ってみようってことで、ルートユーザーでログインして、ルートユーザとテストユーザのデータベースを作成。

create database root_db;
create database test_db;

ルートユーザーでログインしたままの状態で、今度はテストユーザーを作成してみる。パスは*で隠しちゃってます。

grant all on test_db.* to tester@localhost identified by '******';

で、作成したデータベースを続けて確認する。まずはログインしているルートユーザーからどのように見えるのか。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| root_db            |
| test_db            |
+--------------------+
4 rows in set (0.00 sec)

ルートユーザーからは、今作成したデータベースがきちんと参照できているみたいです。次はテストユーザーで確認。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test_db            |
+--------------------+
2 rows in set (0.00 sec)

おお、こういうことになるのね。grant文で指定したデータベースのみへのアクセスを許可することになるんだ。
んじゃ次は、ルートユーザーでログインしてからテーブルを1つ作成して、そこにレコードを1行追加してみよう。

mysql> use root_db;
Database changed
mysql> create table user_info (
name varchar(20) not null, age int(2) not null, primary key(name));
Query OK, 0 rows affected (0.49 sec)

mysql> insert into user_info values('junmix', 28);
Query OK, 1 row affected (0.04 sec)

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
+--------+------+
1 row in set (0.00 sec)

問題無さそう。「MySQL」で扱うSQLはよくわかってないけど、超基本的な構文に関してはOracleと同じって考えていいの?
ルートユーザーのデータベースにテーブル作ってレコード追加したので、次はテストユーザーで同じことをしてみる。

mysql> use test_db;
Database changed
mysql> create table user_info (
name varchar(20) not null, age int(2) not null, primary key(name));
Query OK, 0 rows affected (0.47 sec)

mysql> insert into user_info values('tester', 28);
Query OK, 1 row affected (0.05 sec)

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| tester |   28 |
+--------+------+
1 row in set (0.00 sec)

当然問題無し。ってなワケで、今度はJavaからレコードを引っ張り出してみる。「こんなソース」で実験してみよう。
localhostを指定して接続できるのは当然なので、今度はホスト名かIPアドレス指定でも繋がることを確認しておきます。

C:\java_src>java MySqlConnectTest
junmix  28      接続情報 = [jdbc:mysql://localhost:3306/root_db, root, *********]
tester  28      接続情報 = [jdbc:mysql://localhost:3306/test_db, tester, ******]
接続失敗/接続情報 = [jdbc:mysql://**.***.*.**:3306/root_db, root, *********]
(トレースログは中略)
接続失敗/接続情報 = [jdbc:mysql://**.***.*.**:3306/test_db, tester, ******]
(トレースログは中略)

都合のいいことに、IPアドレス指定で接続を行ったときだけ落ちた。何でだと思って調べたら、「こんな情報」が出てきた。
それじゃuserとdb、hostテーブルの情報を変更しなくちゃダメなのか。ルートユーザーで入り直してレコードを更新。

mysql> use mysql;
Database changed
mysql> select host, db, user from db;
+-----------+---------+--------+
| host      | db      | user   |
+-----------+---------+--------+
| localhost | test_db | tester |
+-----------+---------+--------+
1 row in set (0.00 sec)

mysql> select host, db from host;
Empty set (0.00 sec)

mysql> select host, user from user;
+-----------+--------+
| host      | user   |
+-----------+--------+
| localhost | root   |
| localhost | tester |
+-----------+--------+
2 rows in set (0.35 sec)

mysql> update db set host = '%';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update user set host = '%';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2  Warnings: 0

mysql> select host, db, user from db;
+------+---------+--------+
| host | db      | user   |
+------+---------+--------+
| %    | test_db | tester |
+------+---------+--------+
1 row in set (0.00 sec)

mysql> select host, user from user;
+------+--------+
| host | user   |
+------+--------+
| %    | root   |
| %    | tester |
+------+--------+
2 rows in set (0.00 sec)

本当に手順合ってんだろうな?単純にlocalhostを%に置き換えるだけじゃマズそうな気がしないでもないんだが。
で、接続に関する情報の変更なので、一応サービスを再起動してから、再度Javaでの接続を試してみることにする。

C:\mysql\bin>net stop mysql
MySQL サービスを停止中です..
MySQL サービスは正常に停止されました。

C:\mysql\bin>net start mysql
MySQL サービスを開始します.
MySQL サービスは正常に開始されました。

C:\java_src>java MySqlConnectTest
junmix  28      接続情報 = [jdbc:mysql://localhost:3306/root_db, root, *********]
tester  28      接続情報 = [jdbc:mysql://localhost:3306/test_db, tester, ******]
junmix  28      接続情報 = [jdbc:mysql://**.***.*.**:3306/root_db, root, *********]
tester  28      接続情報 = [jdbc:mysql://**.***.*.**:3306/test_db, tester, ******]

おおー、今度はちゃんと取れたぞ。なるほど、やり方が本当に正しいかはともかく、とりあえず動かせるようになって満足。
とりあえずテーブルを好き勝手に作って、データをあれこれ突っ込んだりしてコミットかけたりロールバックさせたり。
……ロールバックさせたり。あれ?ロールバックが効かないんですけど。トランザクションとかはどうなってんだ?

mysql> use root_db;
Database changed

mysql> insert into user_info values('temp', 99);
Query OK, 1 row affected (0.00 sec)

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
| temp   |   99 |
+--------+------+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
| temp   |   99 |
+--------+------+
2 rows in set (0.00 sec)

しょうがないので、また調べる。すると、今度は「こんな情報」が見つかった。まともに動かせるようにするだけでも大変だな。
デフォルトの設定では、自動コミットモードがオンになっているらしいので、これをオフにしてやらないといけないらしい。

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
| temp   |   99 |
+--------+------+
2 rows in set (0.00 sec)

mysql> set autocommit = 0;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from user_info where age = 99;
Query OK, 1 row affected (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.09 sec)

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
| temp   |   99 |
+--------+------+
2 rows in set (0.00 sec)

自動コミットモードをオフにしてから1レコードを削除してロールバックしてみる。おお、今度は大丈夫みたいだ。
さっきの情報」によると、自動コミットモードを再度オンにしたい場合は、autocommitに1を設定してやればいいらしい。

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
| temp   |   99 |
+--------+------+
2 rows in set (0.00 sec)

mysql> set autocommit = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from user_info where age = 99;
Query OK, 1 row affected (0.32 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info;
+--------+------+
| name   | age  |
+--------+------+
| junmix |   28 |
+--------+------+
1 row in set (0.00 sec)

ほほーう、そういうモノなのね。とりあえずautocommitの値で自動コミットモードを切り替えられることはわかりました。
で、このautocommitってのは何なのよ?MySQLが持つ環境設定変数(って言うのか?)みたいなモノってことでいいの?

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.01 sec)

よくわからんけど、とりあえず設定用の変数的な何かは、こんな感じで確認できるらしい。これは覚えておかないとな。
で、ログインするたびにこれを入力しないといけないの?ンなバカな、設定ファイルで何かしら書いておけるんだよな?
my.iniって設定ファイルがあるんだけど、どうやらここに記述を追加することで、デフォルトの設定が変更可能らしい。

# Note that the content of init_connect is not executed for users that have the SUPER privilege.
init_connect='set autocommit = 0'

起動時の自動コミットモードをオフにできるが、SUPER権限のユーザー(ルートユーザーなど)に対しては無効になるらしい。
要するに、何らかの処理をトランザクション単位で行う場合には、ルートユーザーなんかでやるんじゃねえぞってことか。
お遊びアプリを作る場合でも、ちゃんと専用のユーザーを作って動かすようにしよう。これは忘れちゃいそうだな。

さて、とりあえず今日はこんな感じのをやってました。明日はJavaでSwingアプリでも作って接続実験をしてみようかな。
そうそう、Swingのクラス設計をどうしたらいいかがどうにも理解できん。何かいいサンプルがあるサイトでも無いかな。
Panel単位とかでわけるモノなのか、それとも問答無用で1つのクラスに書いていいのか(これは保守性最悪だけど)。
とりあえず明日にでも考えよう。大して何もやってない一日だったのに、中途半端な疲労感が溜まってる気がするわ。

2009/05/08 Fri.

マジでSwingのアプリをナメてたわ。レイアウトが凄まじく難しいというかメンドいというか、考えて作らんとダメだな。
帰り際にJavaのGUIアプリのプログラミングの本を探してみたけど、どうにも見つからない。需要が無いってことなのか?
Amazon Java Swing」とかで検索すると、文献自体は結構存在するみたいなんだよな。店頭には出ないのだろうか。
つーか、何でどれも高いんだよ!「Amazonのこのページ」の関連書籍の値段を見ても、どれも4,000円前後するし。
とりあえず「MySQL」のDB情報を画面から変更できるくらいのSwingアプリを作ろうと思ったけど、レイアウトは断念しよう。
BoxLayout」で組んでる最中に「BoxLayout can't be shared」というエラーに引っかかって、解決するのにも苦労した。
普通に調べてもこれっていう回答が出てこなかったので、「Sun Forums」で調べてみると、やっと「回答」が見つかった。
……思っていた以上にややこしいな。結局Swingアプリのクラス設計ってのはどういうモンなのかも理解できちゃいないし。
レイアウト云々は置いておいて、まずは一旦動かせるくらいまで作ってみよう。どうせ来週も時間あるだろうしね。
あとはできればPerlでの「MySQL」の操作も覚えておきたい。これも来週に回そう。自宅マシンに「MySQL」は入れたくないし。

2009/05/09 Sat.

undefined.