2011年11月12日土曜日

VBAでツールを作るのはもうやめようか。

業務でしばしばエクセルVBAを用いたツールを作ってきた。
簡易ツールもあるが、かなり業務を遂行する上で必須となるようなツールも作ってきた。

はじめて触れたのは新人のころで実行環境と開発環境がエクセル1個で済み、
マクロの保存なんかですぐにコードが保存できる点なども勉強しやすくこれはいいと思って
食い入るように勉強したのを覚えている。

ただ、最近はVBAでツールを作成することに少し疑問を抱いてきた。(重要度が高いツールに限る)

業務上必須となるようなツール。
例えば開発ルーチンに組み込まれるようなツール。
ソースの自動生成とか。試験ツールとか。

こういったツールは、開発の状況次第でメンテナンスが頻繁に発生したりする物だと思う。
エクセルVBAをわざわざ使うということは、そのツールの扱うデータはエクセルである場合がほとんどである。
エクセルVBAはエクセルのデータを参照する場合にはとても楽で悪いところが見当たらないように思える。
だが、メンテナンスが頻繁に発生する場合に以下の観点でエクセルVBAはとても扱いづらい。

・バージョンの管理
・使用者へのアップデート通知とその徹底
・メンテナンスを行う人間の教育


バージョンの管理について
エクセルVBAは開発環境自体がエクセルのVBエディタ機能を利用する。
そしてツールのコードは、フォーム、モジュール、クラスと分かれるがこれはエクセル形式として
内部にまとまってしまっている。
これらのコードのバージョン管理をきちんと行おうとすると?
それらをエクスポートして別管理としなければならない。
しかもそれらはまたインポートするなんて手間もかかる。

使用者へのアップデート通知とその徹底
バージョン管理ソフトにツール本体を管理させておいて、周知して最新版を使って下さい。
これならあまり問題はないのだろうが、問題なのはファイルサーバなんかにおいてしまった場合。
エクセルなんて簡単にコピーができる。
どこに派生しているかわかったもんじゃない。
そして、同じ名前が付いたツールを使用者全員が最新版かなんて意識しているほうが珍しいだろう。
最新版とそれ以前のツールを混合して使用された場合、そのツールで一定の品質なんて保てると言えるのだろうか。

メンテナンスを行う人間の教育
メンテナンスを行う人は、いつまでも初期開発者とは限らない。
僕の従事するプロジェクトは主にJavaをメインに扱うプロジェクトであったため
エクセルVBAをコーディングできる人間は割と少なかった。(ちょっと書ける程度の人間は省く)
そういったプロジェクトでメンテナンスできる人間を育てるのは面倒である。

上記のような理由で僕は最近VBAでツールを作成することに少し躊躇する。
これからはなるべくJavaを用いて業務ツールを作成しようと思う。
POI、VelocityをはじめJavaでも実現が可能だから。
あとVBAはOSによっていきなり参照が効かなくなったりするしね。

長々と講釈たれたなぁ。
何年後かに自分で見たら違う意見を持ってたりして恥ずかしくなるんだろうな。

2011年11月3日木曜日

MySQL5をMacにアンインストールとMacPortsで再インストール

MySqlはMacに前に入れたが、なんか入れ直したくなったので入れ直した。

まずアンインストール。
# rm -rf /usr/local/mysql
# rm -rf /usr/local/mysql-5.X.XXXXXXX
# rm -rf /Library/StartupItems/MYSQLCOM
# rm -rf /Library/PreferencePanes/MySQL.prefPane
# rm -rf /Library/Receipts/mysql-XXXXXXXXXXXXXX.pkg

次に、MacPortsの更新確認とか行う。
とりあえずこれは馬鹿長い。
sudo port selfupdate
sudo port upgrade outdated

MacPortsで再インストールする。
 
>sudo port install mysql5-server
 
…省略…
 
###########################################################
# A startup item has been generated that will aid in
# starting mysql5-server with launchd. It is disabled
# by default. Execute the following command to start it,
# and to cause it to launch at startup:
#
# sudo port load mysql5-server
###########################################################
--->  Installing mysql5-server @5.1.59_0
******************************************************
* In order to setup the database, you might want to run
* sudo -u _mysql mysql_install_db5
* if this is a new install
******************************************************
--->  Activating mysql5-server @5.1.59_0
--->  Cleaning mysql5-server
 

以下のコマンドを実行しないと、MySqlが動かない。
 
>sudo -u _mysql mysql_install_db5
 
…省略…

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/opt/local/lib/mysql5/bin/mysqladmin -u root password 'new-password'
/opt/local/lib/mysql5/bin/mysqladmin -u root -h PC名.local password 'new-password'

Alternatively you can run:
/opt/local/lib/mysql5/bin/mysql_secure_installation
 
…省略…
  

rootのパスワードを上記メッセージないように従って、設定する。
 
>/opt/local/lib/mysql5/bin/mysqladmin -u root password '設定するパスワード'
 

これで再インストールは終わり。
続いて設定を行う。

MySQLの設定ファイルをテンプレートからコピーする。
 
>sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /opt/local/etc/mysql5/my.cnf
 

編集する。
 
>sudo vim /opt/local/etc/mysql5/my.cnf
 
 …省略…
 
# The MySQL server
[mysqld]
port            = 3306
socket          = /opt/local/var/run/mysql5/mysqld.sock
skip-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 128K
 
## OWNSETTINGS …書き加えたところ
default-character-set = utf8
default-storage-engine=innodb
skip-character-set-client-handshake
 

ここまでで再インストール作業は全て完了
すでにMySQLが立ち上がっているなら停止/起動を行う。

 
>sudo /opt/local/share/mysql5/mysql/mysql.server stop
 
Shutting down MySQL
... SUCCESS! 
 
>sudo /opt/local/share/mysql5/mysql/mysql.server start
 
Starting MySQL
. SUCCESS! 
 

ちなみに、MySQLの文字コードが以下のようになっていることを接続した後確認すると良いです。
 
mysql> show variables like 'char%';
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | utf8                                    |
| character_set_connection | utf8                                    |
| character_set_database   | utf8                                    |
| character_set_filesystem | binary                                  |
| character_set_results    | utf8                                    |
| character_set_server     | utf8                                    |
| character_set_system     | utf8                                    |
| character_sets_dir       | /opt/local/share/mysql5/mysql/charsets/ |
+--------------------------+-----------------------------------------+
8 rows in set (0.00 sec)