2009/08/31

AccessとMySQLの表記の違い

このエントリーをはてなブックマークに追加
丁寧なドキュメントがあるのでそれを読むのがいいに決まってますが、覚え書きです。
基本的なSQLの表記が異なる箇所を列挙していければよいと思って。

・Access
文字列 "(値)"
日付 #(値)#
テーブル、フィールドなど [(名前)]
文字列結合 "a" & "b"
先頭からn件取得 select top n ~
Boolean "true" / "false"

・MySQL
文字列 "(値)"
日付 '(値)'
テーブル、フィールドなど `(名前)`
文字列結合 Concat("a" , "b")
先頭からn件取得 select ~ limit 0, n
Boolean(TINYINT(1)という型が使用される) -1 / 0

2009/08/24

javascriptの数値計算を高速化

このエントリーをはてなブックマークに追加
javascriptだけじゃなくて、他の言語でも同じようなことです。
なお、javascriptの場合は、クライアントのスペック、および使用されるブラウザに依存する部分が強いようなので、必ずしも全てに当てはまらない可能性があるので注意してください。

なお、よく参照する関数は、var cos=Math.cosというようにあらかじめグローバル変数に代入しておくほうが、参照が減る分高速です。

●商
x/2よりx>>1のほうが高速。ただし、xは整数。同じように、乗算も、x*2よりもx<<1のほうが高速です。>Firefox3
x / 2 = 71
x * 0.5 = 70
x >> 1 = 64

->IE8
x / 2 = 156
x * 0.5 = 141
x >> 1 = 78

->GoogleChrome2
x / 2 = 6
x * 0.5 = 19
x >> 1 = 3

●べき乗
単純に平方を求めるなら、Math.powを使うより同じ数を二回掛けたほうが高速。
Math.pow(x,2)よりx*x。

1000000回テスト(単位はms)
※powはループ前に、var pow=Math.powとして計算したものです。

->Firefox3
Math.pow(x,2) = 321
pow(x,2) = 215
x * x = 95

->IE8
Math.pow(x , 2) = 531
pow(x , 2) = 328
x * x = 94

->GoogleChrome2
Math.pow(x,2) = 143
pow(x,2) = 136
x * x = 4

●小数点以下の切り捨て(いわゆる整数化)
Math.floor(x)よりも、x|0のほうが早い。

1000000回テスト(単位はms)
※ floorはループ前に、var floor =Math. floorとして計算したものです。

->Firefox3.0
Math.floor(x) = 249
floor(x) = 108
x | 0 = 128

->IE8
Math.floor(x) = 468
floor(x) = 219
x | 0 = 94

-> GoogleChrome2
Math.floor(x) = 64
floor(x) = 67
x | 0 = 17

●距離判定
点p1(x1,y1)と点p2(x2,y2)の距離dが、範囲rよりも小さいかどうかの判定だけなら、Math.sqrtを使わなくてもできる。

d2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1); // 距離の平方
r2 = r * r; // 範囲の平方
if(d2 < r2){
// 近い
}

2009/08/11

C#バーコードを作成する(CODE39)

このエントリーをはてなブックマークに追加
CODE39を無料で作れないかと思って、うろうろしてました。

追記
下記のサイトで、イラストレータで利用可能なバーコードが作成できますのであわせてどうぞ。
バーコードどころ
http://barcode-place.azurewebsites.net/

CODE39の特徴

  1. バーコードは、太いバーと細いバー、太いスペースと細いスペースの4種類で構成される。
  2. 表現できる文字は、数字(0-9)とアルファベット(A-Z)、記号(-、.、半角スペース、$、/、+、%)。
  3. 桁の制限はない。
  4. 1文字を5本のバーと4本スペースで構成されていて、5本のバーのうち3本が太い。文字と文字の間は細いスペース。
  5. 用途としては、社内用の工程管理などの商品識別コードとして使われる。

詳細は下記参照。
CODE39
CODE-39規格

自力で作ってみる

所詮、黒い四角の連続なので、規格を読む分には、自作するのも思いのほか簡単そうです。
下記サイトにて自力で作成するためのコード説明がされています(全編英語ですが)。C#2.0でそのまま動作するサンプルもダウンロードできるようになっているので非常にありがたい。

B# .NET BLOG
CODE 39 BARCODES IN C#

ためしに作成してみて、プリントアウトしたものをバーコードリーダーで認識してみたところ全然問題ないようです。出力するときはサイズに注意(とはいえ、リーダーは大概なら余裕で読む)。

2009/08/01

MySQLのセットアップ

このエントリーをはてなブックマークに追加
言わずと知れたMySQLはオープンソースのSQLデータベースです。

MySQL自体が定番とも言えるほどの人気者なので多くの解説を探すことができるものの、知識がないとやっぱり厳しい。
管理ツールは全編英語(※探せば日本語の管理ツールもあります)。
長らく真っ当な管理ツール(GUI)がなかったという偏見と、前提知識が当たり前のように要求されるという意味もあって敬遠しがちでした。

選択肢としてあるとものすごく便利なので、緊急に必要あってというわけではないけれど学習のために弄っています。
いくつか嵌った点を含めて書いておきます。

●MySQLのダウンロード&インストール

MySQLはバージョン5.1.35。
MySQLの本体部分のインストールなど、下記サイトが参考になりました。


バージョン違いのため、多少セットアップ画面が異なるところがあったもののすんなりインストールできた(と思います)。


●MySQL GUI Toolsのインストール

バージョンは5.0。
MySQLを管理するための管理ツールをインストールした。公式から入手できるといこともあってこれを使うことに。
  1. MySQL Administrator
  2. MySQL Migration Toolkit
  3. MySQL Query Browser
  4. MySQL System Tray Monitor
下記のサイトで全部説明してくれてるので説明は省略。


●ネットワークアクセスの設定

他のマシンからネットワークを通してDBをメンテすることもあると思ってアクセスしてみたがつながらない…。
MySQL Query Browserから「Server Host」を所定のマシンに設定して接続してみた。ローカル環境で「127.0.0.1」を指定する分には問題なくつながることは確認済み。
このようなエラーが出る。

Could not connect to the specified instance.
MySQL Error Number 2003
Can't connect to MySQL server on '(IP)'(10061)
If you want to check the network connection, please click the Ping button.
「指定されたインスタンスに接続できませんでした」ということらしい。
原因の対策には下記のサイトが参考になりました。


要点は、
1.ポート(一般には3306)が開いていない
2.MySQLのユーザー権限設定が変更されていない
3.my.ini になぜか bind-addressが設定されている
二番目の、ユーザー権限設定については知らないと辛い。つまり許可設定しないと接続できないのは当たり前。
項目をそれぞれ確認して、設定したところ接続を確認することができました。

●他のDBから移行

Access2000のMDBから移行するという案件をシミュレートしてみる。MySQL Migration Toolkitを使えば楽チンにできるという甘い言葉に誘われてやってみました。
が、もちろん何も知らないで触ってるわけで、二箇所ほどで詰まりました。その回避策を書いておきます。

Source Database Connectionに「MS Access」を指定。パスワードなどが掛かっている場合は、ユーザー名、パスワードを指定することができるのでしょう。
ウィザード形式で次へ画面を送っていって、一応最後の画面まで到達。

・一行たりともインポートされてない

MySQL Query Browserで見てみると、スキーマが作成されていて、テーブルが作られている。けれど、中身がありません。一行もインポートされていない模様。
もう一度、MySQL Migration Toolkitを起動させて、同様の手順を踏むも、同じ。

いろいろ触りながら、調べていくと、キャラクターコードの設定があるらしいということに行き着く。
MySQL Migration Toolkitの「ObjectMapping」の工程にて、SetParameterを押して設定情報を表示させて、DataBaseとTableのキャラクターコードが設定できるようになっている。
初期は、「Latin1」となっている。
「utf8」を設定することで、「Bulk Transfer」の工程でレコードが吸い出されるようになった。

・1300行足らずしかインポートされない

で、再度MySQL Query Browserで確認してみたけれど、なんて中途半端な。
テーブルの構成から何から確認してみたものの、結局MySQL Migration Toolkitの「Bulk Transfer」の進捗状況が行ったり来たりしてもたもたしていてることが気になってログを見ると、下記のようなメッセージがある。
Packet for query is too large (1067387 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

my.iniにmax_allowed_packetというパラメータを設定してあげればよい、とのこと。
MySQL Administratorでは、Startup Variablesから「Advanced Networking」の「Max.packet.size」を設定する(当方は16Mに設定)。
無事にテーブルとレコードの移行が完了、確認できた。

※mysql.ini変更の際はサーバーの再起動をお忘れなく。