銀河英雄伝説は昔、CS放送で深夜にやっていたのをチラチラと見たことがあったのですが、原作小説は全く読んだことがありませんでした。4月からアニメ化するみたいですね。
なんだか気になってAmazonで原作の10巻セットを買ってみました。一度に小説を10巻買ったのとか初めてです。面白いかな?。
2018/02/19
から 松原正和
0件のコメント
銀河英雄伝説は昔、CS放送で深夜にやっていたのをチラチラと見たことがあったのですが、原作小説は全く読んだことがありませんでした。4月からアニメ化するみたいですね。
なんだか気になってAmazonで原作の10巻セットを買ってみました。一度に小説を10巻買ったのとか初めてです。面白いかな?。
2018/02/13
から 松原正和
0件のコメント
Windows 10 Anniversary Update からのはずですが、ミラキャストという無線のディスプレイ接続技術を用いて、ノートPCやタブレットをセカンドディスプレイにすることができます。
で、レノボ ThinkPas X270を買ったときから思っていたのですが、レノボ Yoga Tablet 2 with Windowsをセカンドディスプレイにしたいなーと思っていました。
CPUはATOM Z3745でメモリも2GB、ストレージも32GBでタブレットとして使うには性能不足の感も否めませんが、セカンドディスプレイにするだけなら、Full HD表示もできますし、まだまだ使えそうな気もします。
Yoga Tablet 2 with Windowsはタブレットとしては少し特殊な構造をしていて、スタンドが内蔵されており、別途タブレット用スタンドを用意しなくとも机に立てて使用することができます。スタンドを持ち歩く必要もないですし、デザイン的にもとてもすっきりします。
セカンドディスプレイ接続できたの図 ↓
これまで、何度か接続しようと頑張っていたのですが、なぜか接続時にエラーが発生し、接続できなかったのですが、ディスプレイドライバをIntel社の最新のものに更新することで接続することができました。HDCP関連か何かだと思うのですが、ディスプレイアダプタの機能も接続可否の要件に入るようです。
あと、注意点として、もともとWindows 8.1のタブレットなので、今からWindows 10にアップデートしようとすると料金がかかってしまうのと、少し古い機種なので売っている店舗(サイト)も少なくなっているような気もします。
でも、古い機種なので探せば掘り出し物もゲットできるかもしれません。
2018/02/12
から 松原正和
1件のコメント
A5:SQL Mk-2でこれまで、SQLの結果セットに論理名を付加する Captions疑似命令というのがあったのですが、SQLの列を追加・削除、あるいは順序の変更などするたびCaptions疑似命令も書き換えなければなりませんでした。
また、Captions疑似命令の書き換え忘れで、結果セットのグリッドで表示された列名と表示内容が異なってしまい、トラブルの原因ともなるようでした。
そこで、CaptionList疑似命令と、CaptionFromComment疑似命令を追加しました。これからは、Captions疑似命令は非推奨とし、CaptionListまたはCaptionFromComment疑似命令を推奨としたいと思います。
使い方は以下の通り。
CaptionList疑似命令
1 2 3 4 5 6 7 8 9 |
--* CaptionList 'ORDER_NO=オーダー№' --* CaptionList 'CUST_NO=顧客№, POSTAL_CD=郵便番号, ORDER_DT=受注日' select ORDER_NO , CUST_NO , POSTAL_CD , ORDER_DT from TB_ORDER ; |
CaptionList の後に ’ ’ で括って ‘Key1=Value1, Key2=Value2, Key3=Value3…’形式で記述します。
CaptionList疑似命令は複数記述することができます。
CaptionFromComment疑似命令
1 2 3 4 5 6 7 8 |
--* CaptionFromComment select O.ORDER_NO as ORDER_NO /* オーダー№ */ , O.CUST_NO as CUST_NO -- 顧客№ , O.POSTAL_CD as POSTAL_CD, -- 郵便番号 O.ORDER_DT as ORDER_DT -- 受注日 from TB_ORDER O ; |
CaptionFromComment疑似命令を記述しておくと、SELECT文の列定義(列名)の後ろに記述されたコメントを論理名として扱います。列定義を区切るカンマの位置は列定義の前でも後ろでも構いませんが、列定義(の最終行)の後に書く必要があります。
2018/01/14
から 松原正和
1件のコメント
データベースのテーブル定義を修正したら、いったんテーブルをDROP TABLEしてから、CREATE TABLEで作り直すことなどがよくあると思います。
でもこの時悩ましいのが、登録されているテーブルデータが消えてしまうこと。
ここで A5:SQL Mk-2 version 2.13.0 beta 35から、DROP TABLEの前にテンポラリテーブルを作ってデータを保存し、CREATE TABLEの後にテンポラリテーブルからデータをロード&テンポラリテーブル削除する機能を付けてみました。
以下のようにBackupToTempTable, RestoreFromTempTable 疑似命令を使います。
1 2 3 4 5 6 7 8 9 10 |
--* BackupToTempTable drop table TARGET_TABLE; --* RestoreFromTempTable CREATE TABLE TARGET_TABLE ( COL1 VARCHAR2(10) NOT NULL , COL2 VARCHAR2(20) , COL3 VARCHAR2(20) , PRIMARY KEY (COL1) ); |
このように書くことで、以下のような動きをします。
1.$$TARGET_TABLEという名前(現状では元テーブルの前に$$を付けた名前で固定)でテンポラリテーブルが作られ、TARGET_TABLEテーブルのデータが保存されます。
2.DROP TABLEが実行されます。
3.CREATE TABLEが実行されます。
4.$$TARGET_TABLEテーブルからTARGET_TABLEにデータが書き戻され、成功したら、$$TARGET_TABLEは削除されます。
注意点として$$TARGET_TABLEからTARGET_TABLEにデータが書き戻されるとき、同じ名前の列のみ書き戻されます。新しいテーブルの列の長さが短くなるなどして、書き戻すのに失敗する可能性があることに注意が必要かもしれません。
あと、テーブルのデータ量は考慮しないので、巨大なテーブルではバックアップ&リストアで大量のトランザクションが発生してデータベースに負荷をかけてしまう可能性も注意が必要かもしれません。
A5:SQL Mk-2 version 2.13.0 beta 35ではERエディタから生成するDDLにはこれらの疑似命令はつかないですが、生成するDDLに標準でこれを付けるようにすれば、結構便利かと思うのですがどうでしょう?。
2018/01/07
から 松原正和
0件のコメント
長らく Docker を試してみたかったのだけど、仮想マシンでDockerを試すのもなんだかという気がしていたし、Docker for WindowsはHyper-Vを使うけどウチの環境はVMware WorkstationでVMがたくさんあったりするので試せないなあと思っていました。
A5:SQL Mk-2のテスト用データベースをVMware上のLinux (Cent OS 7)に移行したのを機に仮想マシンでDockerを導入したのでいろいろ調べてみると、なんだかDocker for WindowsとVMware上のLinuxの組み合わせができそうな気がしてきたので、試してみました。
通常Linux上ではdockerコマンドからソケットまたはTCPプロトコルでdockerdデーモンと通信を行い、コンテナを操作します。
Docker for Windowsでは、docker.exe(Windowsの実行ファイル)からHyper-V上で動作するMobyLinuxVMという名前の仮想マシン上のdockerdデーモンと通信を行い、コンテナを操作します。
ならば、Hyper-Vなしで、Docker for Windows のdocker.exeとVMware上のLinuxのdockerdデーモンと通信させれば行けるはず。
以下手順です。
■VMware Workstation上にCent OS 7を導入
説明は省略します。
■Cent OS 7 上にdockerを導入
そういうブログ記事とかは多いと思うのでさらっと。
1 |
# yum install -y yum-utils device-mapper-persistent-data lvm2 |
1 |
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
1 |
# yum makecache fast |
1 |
# yum install docker-ce |
1 2 3 4 5 6 |
# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd ↓ ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 # systemctl daemon-reload |
1 2 |
# firewall-cmd --add-port=2375/tcp --zone=public --permanent # firewall-cmd --reload |
1 2 |
# systemctl enable docker.service # systemctl start docker.service |
1 2 3 4 5 6 7 |
$ sudo usermod -aG docker matsubara $ export DOCKER_HOST=tcp://0.0.0.0:2375 $ vi ~/.bash_profile # 最後に以下を追記 export DOCKER_HOST=tcp://0.0.0.0:2375 |
■Windows端末から名前解決できるようにする
Windows端末から名前解決できるようにするためsamba(のnmb)を導入する。
1 |
# yum install samba -y |
1 2 3 |
# vi /etc/samba/smb.conf [global]にnetbios nameを追記 netbios name = VMCentOS |
1 2 |
# firewall-cmd --permanent --zone=public --add-service=samba # firewall-cmd --reload |
1 2 |
# systemctl enable nmb.service # systemctl restart nmb.service |
■Docker for Windowsからのアクセス
普通にDocker for Windows をダウンロードしてインストール
https://docs.docker.com/docker-for-windows/install/
Get Docker for Windows [Stable] からダウンロードしてインストールした。
以下のコマンドを実行して、自分のユーザーがdocker-usersグループに含まれているか確認する。
1 |
> net localgroup docker-users |
自分のユーザーがdocker-usersグループに含まれていない場合、以下で追加
1 |
> net localgroup docker-users matsubara /add |
再起動すると Hyper-Vが稼働していないとか言ってくるが無視する。
(OK/キャンセルだが、OKしてはいけない…と思う)
Ctrl+Shift+Escでタスクマネージャーを起動し、「スタートアップ」タブを選択
Docker for Windows が有効になっているので無効にする。
コルタナまたはWin+Rから「Control」でコントロールパネルを起動
コントロールパネル > システムとセキュリティ > システム …を選択
左ペインの「システムの詳細設定」
[環境変数(N)…]ボタン
ユーザーの環境変数・システムの環境変数のどちらでも追加
変数名(N): DOCKER_HOST
変数値(V): tcp://VMCentOS:2375
これで、コマンドプロンプトを起動すれば、dockerコマンドが使えるようになっているはず。
Docker for Windows のサービスも止める (2018/01/08追記)
管理者モードでコマンドプロンプトを開き、scコマンドを使って「Docker for Windows Service」 を「手動」に変更する
1 |
sc config "com.docker.service" start=demand |
看過できない疑問
これ、セキュリティ(Dockerのアカウント)ってどうなってるんだろう?dockerdの-Hオプションで接続元IPをある程度制限できそうだけど…分かったら追記します。
2018/01/06
から 松原正和
0件のコメント
VMWare 上のCentOS 7.4 に Oracle Databaseと Microsoft SQL Server 2017とIBM Db2 Express-CとPostgreSQLとFirebirdとMySQLとMariaDBを入れてみました。
パクリ記事ばっかりになりそうな気もしなくもないですが、とりあえず、MySQLとMariaDBから。
参考: DockerでさくっとPostgreSQL/MySQL/MariaDBを触る方法
環境は以下のような感じです。
OS : CentOS Linux release 7.4.1708 (Core) (VMware Workstation上の仮想マシン)
メモリ : 4GB 割り当て
MySQLとMariaDB以外のデータベースはCentOS上にそのままインストールしたのですが、MySQLとMariaDBは共存が面倒そうだったので、Dockerをインストールし、その上で動作させることで共存させています。
参考(OS上で直接共存させる方法): Installing MariaDB Alongside MySQL
■Dockerのインストール
1 |
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
■リポジトリ追加
1 |
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo |
■yumのパッケージインデックスを更新
1 |
$ sudo yum makecache fast |
■インストール
1 |
$ sudo yum install docker-ce |
■自動起動の設定と起動
1 2 |
$ sudo systemctl enable docker.service $ sudo systemctl start docker.service |
■自分のユーザーでDokerを起動できるようにする
※matsubaraの部分は適宜書き換えること
1 |
$ sudo usermod -aG docker matsubara |
MySQLとMariaDBは永続化のためにデータボリュームを作りつつ docker run します。
MySQLとMariaDBのDocker上で利用できるバージョンはdockerのオフィシャルサイトから確認できます
MySQL : https://hub.docker.com/_/mysql/
MariaDB : https://hub.docker.com/_/mariadb/
MySQLとMariaDBのインストール手順はほぼ同じです。ただし、MySQLとMariaDBはデフォルトではどちらも3306ポートを使うため、そのままDockerホストにマップするとバッティングします。各コンテナのポートをマップするためにポート番号は以下のルールにしてみました。
MySQL : 33xy
MariaDB: 133xy
x … メジャーバージョンの下1桁
y … マイナーバージョンの上1桁
つまり、MariaDB 10.2のポートは Dockerホストの 13302に、MySQL 5.7のポートはDockerホストの3357にマップします。
Docker上で動作するMySQLやMariaDBを操作するために、あらかじめMySQLのクライアントだけをCentOS上に入れておきます。
■MySQL クライアントの導入
1 2 |
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm $ sudo yum install mysql mysql-devel mysql-server mysql-utilities |
以下mariadb 10.2のインストール
■コンテナの3306ポートを13302にマップしてMariaDBを開始(docker run)
※ボリューム(mariadb_10.2_data)を作成しつつ、docker run している
※rootパスワードのXXXXXXXXは適宜変えること
1 |
$ docker run --name mariadb_10.2 -d -v mariadb_10.2_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXXXXXX -p 13302:3306 -d mariadb:10.2 |
■データベース(UTF8MB4_DB)の作成とユーザー(matsubara)の作成及び権限の設定(雑・セキュアではない)
mysqlコマンドを実行するとき、-h オプションを付けない場合、localhostに対してログインします。MySQLクライアントは接続先ホストが localhostの場合(-h オプションを指定しない場合も含む)tcpプロトコルでなくソケット接続を使用し、–portオプションを無視するらしいです。このため、「–protocol tcp」を付加するか、「-h 127.0.0.1」を指定してTCPプロトコルで接続します。
1 2 3 4 5 6 |
$ mysql -u root -p --port 13302 --protocol tcp mysql> select version(); mysql> create database UTF8MB4_DB default character set = UTF8MB4; mysql> create user 'matsubara'@'%' identified by 'XXXXXXXX'; mysql> use UTF8MB4_DB mysql> grant all on UTF8MB4_DB.* to 'matsubara'@'%'; |
■サービスの設定ファイル作成(自動起動のために)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo sh -c 'cat << EOF > /usr/lib/systemd/system/mariadb_10.2@docker.service [Unit] Description=MariaDB 10.2 Service on Docker After=docker.service Requires=docker.service [Service] Type=simple RemainAfterExit=yes ExecStart=/usr/bin/docker start mariadb_10.2 ExecStop=/usr/bin/docker stop mariadb_10.2 [Install] WantedBy=multi-user.target EOF' |
Type=simpleはデフォルトなので実は要らないですが、dockerコマンドはRemainAfterExitを付けないと、うまく自動起動しませんでした。どうも、起動しないというより、正しく起動できたことをうまく検知できなくて、直後にサービス停止コマンド(ExecStop)が実行されてしまうようです。
Type=forkingやType=oneshotも試したのですが、うまくいきませんでした。
■サービスの設定ファイルをsystemdに読み込ませる。
1 |
$ sudo systemctl daemon-reload |
■サービスを自動起動に設定
自動起動しない場合は要らない
1 |
$ sudo systemctl enable mariadb_10.2@docker.service |
以下MySQL 5.7 のインストール
■コンテナの3306ポートを3357にマップしてmysqlを開始(docker run)
※rootパスワードのXXXXXXXXは適宜変えること
1 |
$ docker run --name mysql_5.7 -d -v mysql_5.7_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XXXXXXXX -p 3357:3306 -d mysql:5.7 |
■データベース(UTF8MB4_DB)の作成とユーザー(matsubara)の作成及び権限の設定(雑)
1 2 3 4 5 6 |
$ mysql -u root -p --port 3357 --protocol tcp mysql> select version(); mysql> create database UTF8MB4_DB default character set = UTF8MB4; mysql> create user 'matsubara'@'%' identified by 'XXXXXXXX'; mysql> use UTF8MB4_DB mysql> grant all on UTF8MB4_DB.* to 'matsubara'@'%'; |
■サービスの設定ファイル作成(自動起動のために)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo sh -c 'cat << EOF > /usr/lib/systemd/system/mysql_5.7@docker.service [Unit] Description=mysql 5.7 Service on Docker After=docker.service Requires=docker.service [Service] Type=simple RemainAfterExit=yes ExecStart=/usr/bin/docker start mysql_5.7 ExecStop=/usr/bin/docker stop mysql_5.7 [Install] WantedBy=multi-user.target EOF' |
■サービスの設定ファイルをsystemdに読み込ませる。
1 |
$ sudo systemctl daemon-reload |
■サービスを自動起動に設定
1 |
$ sudo systemctl enable mysql_5.7@docker.service |
以上です。…あと、調子に乗ってmysql 5.5 と MariaDB 5.5, MariaDB 10.1もインストールしてしまいました。
(自動起動はしません。)
2017/12/17
から 松原正和
0件のコメント
本日はA5:SQL Mk-2でも利用している、データベースアクセスコンポーネント、Devart社のUniDACコンポーネントのご紹介をしたいと思います。これは有償のコンポーネントなのですが、とても便利でユニークな機能を備えたデータベースアクセスコンポーネントです。
開発者ライセンス・チームライセンス・サイトライセンスがあり、ロイヤリティフリーで使用できます。
32bit,64bitに対応し、Delphi, C++ Builder, Lazarusに対応し、Oracle Database、Microsoft SQL Server、MySQL、InterBase、Firebird、PostgreSQL、SQLite、IBM DB2、Microsoft Access、SAP Sybase Advantage Database Serverなどに接続できます。(できるそうです。)
個人的に一番便利だと感じている機能として、ダイレクトモードによるデータベースごとのクライアントライブラリの要らないデータベース接続です。
ダイレクトモードに対応したデータベースとしては、Oracle Database, Microsoft SQL Server, MySQL, PostgreSQL,SQLite等があります。ダイレクトモードでこれらのデータベース接続するとき、Oracle Client (OCI)も、Native Clientも、libmysql.dllもlibpq.dllもsqlite3.dllも必要ありません。
Oracle接続するのに、Oracle Client要らないってのは結構びっくりですよね。あと、MySQLへ接続するのにlibmysql.dll (GPL) が必要ないので、GPLの縛りなくMySQLに接続できるというのが大きいです。
最低限、TUniConnectionとTUniQueryを抑えれば、SELECT, INSERT, UPDATE, DELETEができます。TUniQueryは、もちろんTDataSetを継承しています。
こんな感じ…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var UniConnection: TUniConnection; UniQuery: TUniQuery; begin // Oracle OCI接続のとき UniConnection := TUniConnection.Create(nil); UniConnection.ProviderName := OracleUniProvider.TOracleUniProvider.GetProviderName; // Oracleへの接続 UniConnection.Server := 'ServerName:1521/ORCL'; // Oracleの簡易接続 UniConnection.SpecificOptions.Values['Direct'] := 'False'; // OCIを使った接続 UniConnection.SpecificOptions.Values['UseUnicode'] := 'True' // Unicodeを使った接続(基本Trueがよいです) UniConnection.Options.EnableBCD := True; // BCD型を使う(多分Trueのほうが何かと良いと思う) UniConnection.Options.EnableFMTBCD := True; // FmtBCD型を使う(多分Trueのほうが何かと良いと思う) UniConnection.Open; … |
Oracleダイレクトモードのときは以下
1 2 3 4 5 6 7 8 |
UniConnection := TUniConnection.Create(nil); UniConnection.ProviderName := OracleUniProvider.TOracleUniProvider.GetProviderName; // Oracleへの接続 UniConnection.Server := 'ServerName:1521:ORCL'; UniConnection.SpecificOptions.Values['Direct'] := 'True'; // OCIを使わない接続 UniConnection.SpecificOptions.Values['UseUnicode'] := 'True' // Unicodeを使った接続(基本Trueがよいです) UniConnection.Options.EnableBCD := True; // BCD型を使う(多分Trueのほうが何かと良いと思う) UniConnection.Options.EnableFMTBCD := True; // FmtBCD型を使う(多分Trueのほうが何かと良いと思う) UniConnection.Open; |
MySQLなら以下(MySQLはダイレクトモードのみ)
1 2 3 4 5 6 7 8 9 10 11 12 |
UniConnection := TUniConnection.Create(nil); UniConnection.ProviderName := TMySQLUniProvider.GetProviderName; // MySQLへの接続 UniConnection.Server := 'ServerName'; UniConnection.Port := 3306; UniConnection.Database := 'DB_NAME'; UniConnection.UserName := 'username'; UniConnection.Password := 'password'; //UniConnection.SpecificOptions.Values['Direct'] := 'True'; // MySQLは指定してもしなくてもダイレクトモードになる UniConnection.SpecificOptions.Values['UseUnicode'] := 'True' // Unicodeを使った接続(基本Trueがよいです) UniConnection.Options.EnableBCD := True; // BCD型を使う(多分Trueのほうが何かと良いと思う) UniConnection.Options.EnableFMTBCD := True; // FmtBCD型を使う(多分Trueのほうが何かと良いと思う) UniConnection.Open; |
クエリーの実行
1 2 3 4 5 6 |
UniQuery := TUniQuery.Create(nil); UniQuery.Connection := UniConnection; UniQuery.UniDirectional := False; // 双方向結果セットが欲しいときはFalse、バッチなどで片方向でよいときはTrue UniQuery.Options.QuoteNames := True; // 更新可能な結果セットのとき、内部でDMLが作られるが、クォート文字で列名をくくる。…予約語と被るようなカラム名があるときはTrueにする UniQuery.SQL.Text := 'SELECT * FROM TABLE_NAME'; UniQuery.Open; |
MySQLでのクエリー実行は以下のオプションも追加
1 2 |
// MySQLの追加のオプション(UniQuery.Openの前に) UniQuery.SpecificOptions.Values['EnableBoolean'] := 'False' // これをしないと MySQLのtinyint(1)がBoolean扱いになってしまう。 |
PostgreSQLでのクエリー実行は以下のオプションも追加
1 2 |
// PostgreSQLの追加のオプション(UniQuery.Openの前に) UniQuery.SpecificOptions.Values['OIDAsInt'] := 'True' // これをしないと OID型がうまく表示できない |
基本的にDB接続ではものすごいお役立ちコンポーネントなのですが、ちょいちょい不具合などもあるようです。UniDACのライセンスを購入すると、ソースコードが付いてくるので、A5:SQL Mk-2では以下の不具合修正やカスタマイズを行って利用しています。
利用される際はこれらの点に気を付けて使うとよいかと思います。修正箇所はDevart社の著作物に関わるところなのでここでは公開できませんが、連絡いただければご相談に乗れるかもしれません。
■不具合関連
・DB2で、ODBCドライバ名が「IBM DB2 ODBC DRIVER」でない場合もつなげるように修正
UniDACではDB2への接続にODBCドライバを使いますが、この時のODBCドライバの名前が決め打ちで記述されています。これだと、最近のバージョンのDB2では接続できなかったりするので、DB2接続前にODBCドライバ名を動的に取得するように修正しています。
・固定長文字列型で、更新時は”にならない限りTrimして更新する対応
CHAR(x)などの固定長文字列では、文字コードセットによって’あ ‘を2文字として扱うか、3文字(以上)として扱うかが変わってきてしまいます。このため、Insert, Update時には文字列をTrimして保存することで、内部的に文字列が長すぎると判定される問題を回避します。ただし、元の文字列が ‘ ‘ 等ではTrimすると、”となってしまいますが、この時はTrimしません。
・SJISのCHAR(2)型で、’あ’が ‘あ ‘になってしまうのを防ぐ
上と同じような話ですが、CHAR(2)のデータ型を取得したときに’あ’があると「2文字」に拡張されて’あ ‘になって表示されるのを防ぎます。
・MySQLでプロシージャのパラメータが取得できない不具合の修正
MySQLのプロシージャのパラメータを取得しようとすると、スキーマ名(データベース名)が必要なところで記述されていないため、うまく取得できない不具合があります。これを修正して使っています。
・MySQLでbigint unsignedの12345678901234567890が -6.10106517247498E18 とかになる不具合修正 (MyClassesUni.pas)
内部でMySQLの型からDelphiのデータ型にマッピングするときの問題でbigint unsignedの値がうまく扱えないことがあります。64bitの符号付整数で扱えない型はBCD型で扱うように修正しています。
・MySQLでエラー文字化け対応
MySQLの文字コードの取り扱いがうまくないので日本語のエラーメッセージが文字化けしてしまいます。これを修正して使っています。
・Oracleへの直接接続で、セミコロンをSQL中に含むステートメントを実行できない問題修正
Oracleへのダイレクトモードでの接続でSQL中にセミコロンがあるようなSQLを実行できません。上述のOraNetUni.pasを修正すればよいのですが、OracleへOCIなしで接続する機能は虎の子なのか、ソースは付属するものの、きっちり難読化されていてほとんど手出しできません…何とか直しました。一般的なアプリケーションなら、単純にセミコロンを含むSQLを発行しないようにしたほうが早いと思います。
・Oracleへの直接接続で、エラーメッセージを日本語で受け取ると、メッセージが途切れる不具合を修正
英語圏のプログラムでありがちなマルチバイト文字が通らない系の不具合です。文字数とバイト数を混同して扱っている箇所があるためです。例によって難読化されているソースコードなので、修正が大変です。エラーメッセージは英語で扱ったほうが良いと思います。(NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 とか)
・SQLServerでパラメータとして日付型データが渡せない不具合を修正
SQLでパラメータとして日付型(時刻型・日付時刻型も)を渡すときなんか、内部で扱っているポインタがTDateTimeだったり文字列だったり混同しているようです。
■機能追加・修正関連
・レコード件数制限 (MaxRecords)
DelphiのADO接続の標準コンポーネントTADOQueryにはMaxRecordsのようなプロパティがありますが、UniDACにはありません。このため、MaxRecordsに相当する機能を追加して使っています。
・SQLiteの自動インクリメント型表示対応
SQLiteの自動インクリメント型に対応していないので、対応させています。
・MySQLの0000-00-00対応
MySQLには 0000-00-00という変な日付があります。A5:SQL Mk-2ではこれを扱えるように修正しています。…ただし、0001/01/01 が扱えなくなります…。ただ、これはUniDACの問題というより、MySQLが0000-00-00というおかしな日付を持つのがよくないと思います。0000-00-00という日付を使うくらいなら、NULLを使うのが正解かと。
・–コメントを/**/コメントに書き換えているロジックを削除…Oracleとかでエラー位置が正しく扱えなくなってしまう問題の対処
これは大抵のアプリケーションでは問題とならないのですが、なぜか UniDACでは — 形式のコメントを内部的に /**/のコメントに変換してからDBサーバーに送ります。…なんでそんなことするんですか?。A5:SQL Mk-2ではSQLにエラーがあった場合、エラー位置を表示したりしますが、 SQLを内部で書き換えていると、エラー位置がずれてしまうので面白くありません。この機能は無効化しています。
・MySQLでJSON型対応
UniDACの最近のバージョンでようやくMySQLのJSONに対応しました。A5:SQL Mk-2では独自に対応していました。
・MySQLでTEXT型を普通の文字列として扱えるように
MySQLのTEXTは通常ftMemo型として扱われますが、ftStringとしても扱えるように修正しています。
・OracleでOCI(のDLL)の初期化に失敗したときのエラーメッセージをわかりやすく
アーキテクチャ(32bit/64bit)が異なるoci.dllをロードしようとしてしまったとき、単に初期化に失敗しただけではわからないことがあるので、ビット数が異なることを明示するエラーメッセージにしています。
・PostgreSQLでSQL_ASCIIのデータベースで強制的にエンコーディングを指定できるようにする。
PostgreSQL でSQL_ASCIIのデータベースが文字化けしてしまう問題に対処するため、エンコーディングを指定できる機能を追加しています。
・PostgreSQLで0100/01/01より前の日付を扱えない問題の修正
なぜか、PostgreSQLで0100/01/01より前の日付を弾くチェックロジックがあるのでコメントアウトして使ってます。
・PostgreSQL 7.2 対応(主にv7.2ではスキーマに対応していないことの対応)(PgClassesUni.pas)
標準の状態ではPostgreSQL 7.2に対応しないので修正しています。具体的にはPostgreSQL 7.2はスキーマに対応しないので、システムテーブルを扱うときスキーマを扱っている箇所をスキーマを使わないように修正しています。
・PostgreSQLでTEXT型を普通の文字列として扱えるように(PgClassesUni.pas)
TEXT型は通常だと、ftMemo型として扱われますが、ftStringにマッピングできるように修正しています。
・SQLiteでTEXT型を普通の文字列として扱えるように(LiteClassesUni.pas)
TEXT型は通常だと、ftMemo型として扱われますが、ftStringにマッピングできるように修正しています。
・SQLServerでMoney型を通貨型ではなくBCDとして扱うように修正(特定の通貨である前提はないから…OSの設定により、勝手に\とかついてしまう対処)(MSClassesUni.pas)
Money型はOS設定から通貨記号や小数点の丸め処理が行われますが、外国の通貨を扱ったりすることもあるので、BCD型として扱えるようにしています。
■その他
・MySQLやPostgreSQLではそうでもない気がしますが、Oracleのダイレクトモード接続は変わったデータ型とか使ったりOracleの新しい機能を使ったりすると、チョイチョイ不具合を起こしがちな気がします。おそらくOracleのプロトコル(Net8)自体公開はされていないので、Devart社が独自に解析しているため、追従しきれないところがあるのではないかと思うのですが、可能ならダイレクトモードではなく、OCIを経由して接続したほうがトラブルが少ない気がします。
・SQLiteはデータの暗号化もサポートします。ただし、使うライブラリごとに暗号化方式は互換性がありません。UniDACでも暗号化はできるのですがUniDAC以外の暗号方式とは互換性がないため、利用には注意が必要です。
2017/12/02
から 松原正和
0件のコメント
2017/11/18 にJJUG CCC 2017 Fallという、Javaのカンファレンスに参加してきたのですが、Java 9でAOTコンパイルが導入されたよという話を聞いてきました。
M10 Javaで使えるもう一つのコンパイル方式 -AOT (#ccc_m10)
JavaはもともとJITコンパイルと呼ばれる実行時コンパイラが導入されているのですが、AOTコンパイルでは、プログラム実行前にJavaバイトコードをネイティブコードに変換してしまいます。
AOTコンパイルがJava 9で導入されるよとは聞いていたのですが、その後の情報が少なく、リリース時にも全然聞かなかったので、てっきりキャンセルされたのかと思っていました。
どうも、Java 9ではLinux版のみの対応でサポートも行われないようです。WindowsはJava10以降の導入らしい…。ガッカリ。
だけど、Windows 10にはWindows Subsystem for Linux (WSL)があるじゃあないか!!ということで試してみました。
1.Windows Subsystem for Linuxの有効化
最近のWindows 10はコントロールパネルの呼び出しが面倒くさいのですが、Windows+Rキーで「ファイル名を指定して実行」か、コルタナの入力域で「control」とだけ打てば、コントロールパネルが呼び出せます。
「プログラムと機能」から、「Windows の機能の有効化または無効化」を呼び出し、「Windows Subsystem for Linux」のチェックをONにします。
2.Ubuntu(とか)の導入
Microsoft StoreからUbuntuを検索し導入します。
Ubuntu以外もOpenSUSEやFedoraなんかもあるようですね。今回はUbuntuを入れてみました。
3.Java(もちろんLinux版)を導入
ここからはスタートメニューからUbuntuを起動して実行します。
以下のブログを参考にさせていただきました。
https://hirooka.pro/?p=9259
1 2 3 4 5 |
sudo apt-get -y install python-software-properties software-properties-common sudo sh -c "echo 'oracle-java9-installer shared/accepted-oracle-license-v1-1 select true' | debconf-set-selections" sudo add-apt-repository -y ppa:webupd8team/java sudo apt-get update sudo apt-get -y install oracle-java9-installer |
すみません、前半の内容よくわかりません。Java導入するのにPython必要なんですか?。インストール時の応答を自動化して要るっぽいのでしょうか。とりあえず、全部そのままコピペして実行しました。
導入できたら、「Java -version」できちんと導入されたことを確認します。
4.なんか実行してみる
とりあえず、手持ちのソートアルゴリズムを…。
Mas4Sort 自分がJJUG CCC 2017 FallでもセッションしたMasSort(3-way Mergesort)の兄弟で4-way…つまり、4分割版のマージソートです。これは、JITコンパイルのオーバーヘッドが大きいので今回のテストにはうってつけです。
(そもそもコードが(ムダに)長くなりがちなため、JavaよりC++のほうがMas4Sortアルゴリズムと相性がいい気がする)
以下のコマンドで10000000件の乱数の整数キーを持つオブジェクトのソートを10回繰り返してみます。
1 |
java -classpath bin mmsort.SortTest mmsort.Mas4Sort 10000000 R I 10 |
初回実行は約7.9秒、2回目以降はJITコンパイルが効いて速くなって約5.8秒…、ちなみにWindows版のJava9では、初回8.5秒、2回目以降は5.6~5.7秒くらいでした。Java VMのコンパイラの違いとかいろいろあるでしょうが、単純計算だけなら、Windows Subsystem for Linuxを使っているからと言ってそこまでオーバーヘッドが大きいわけではないようです。
5.AOTコンパイルを試してみる
JavaのAOTコンパイルのコマンドはjaotcです。なんだかよくわからないのだけど、クラスパスが指定できない?みたいな感じで、クラスパスのルートディレクトリに移動してからコンパイルしました。「–directory」とか「–serch-path」とかオプションがあるみたいなのだけど…。
1 |
jaotc --output ../mmsort.so mmsort/*.class |
オプションを見ると、jarファイルなんかも指定できるっぽいですね。…試してません。
6.AOTライブラリを指定して実行してみる
なんだかよくわからないのですが、「-XX:AOTLibrary」でライブラリファイル(.so)を指定するときは、先頭に「./」を付けてやらないとうまく動きませんでした。
ちなみにライブラリを複数指定するときは、「:」で繋ぐらしいです。
1 |
java -classpath bin -XX:AOTLibrary=./mmsort.so mmsort.SortTest mmsort.Mas4Sort 10000000 R I 10 |
実行結果は…8.9~9.0秒くらい…遅くなってる!?なんで?。Windows Subsystem for Linuxなんて使っているせいなのか?、JavaのAOTコンパイル機能がまだ未成熟なのか…。
そもそも、JITコンパイルって、実行時に得られる状態をもとにコンパイルできるから、事前にコンパイルするより高速に実行できるんですよという触れ込みだったはずなので、実行時情報の取得できないAOTコンパイルはちょっと遅くなっちゃうのかも?とも思います。
まあ、Windows Subsystem for LinuxでJava動かしている時点で、パフォーマンス云々は検証しても意味ないのかもしれませんが…。
ただ、最初からコンパイルされているため、初回実行と2回目以降で実行時間に有意な差はないように見えます。遅くなったといってもインタプリタより早いでしょうから、1回しか実行されないバッチ処理などで真価を発揮するかもしれません。
2018/1/2 追記
その後調べたところ、AOTコンパイル時に –compile-for-tiered オプションを付加することで、初回実行時間はJITよりやや速く、2回目以降はJITと同等になることを確認しました。
1 |
$ jaotc --compile-for-tiered --output ../mmsort.so mmsort/*.class |
以下も読んでみてください。
JJUG ナイトセミナー: 年送りビール&LT大会 2017/12/27
2017/11/19
から 松原正和
0件のコメント
11/18 に JJUG CCC 2017 Fall に参加してきました。初参加ですが、「高速なソートアルゴリズムを書こう!!」というセッションをさせていただきました。
緊張はそこまでしていなかったようにも思いますが、説明を時間内にきちんと行うのに精いっぱいで、聞いてくださっている方々の反応とかまで見ていられませんでした。タイムキーパーの方が残り「10分」・「5分」・「1分」とA4くらいの紙で教えてくれていたはずだったのですが、まったく見ている余裕ありませんでした。
「高速なソートアルゴリズムを書こう!!」の内容は、スライドシェアにアップさせていただきました。
発表の内容自体は、初学者でも概ね理解できるように仕立てたつもりでしたが、逆にJJUG CCCに参加されるようなエッジな方々には少々つまらなかったかもしれません。ちょっと空席があったのがトホホです。ちょっと内容が客層に合ってなかったかもですね。
ただ、A5:SQL Mk-2を使ったことある人どのくらいいますか?との問いにはほとんどの方が挙手してくださったのがうれしかったです。励みになりました。
その他、気になって聞いたセッション、、、
#ccc_e2 OpenJDK 参加入門
…やっぱ敷居高そう。「メーリングリストで気軽に聞いてね。」とのことだったが、英語の壁がまず高いです。
自分のセッションでもちょっと話しましたが、自分のソートアルゴリズムを将来的に OpenJDKに取り込んでもらう野望があるので…。
まだまだ先の話になりそう。
#ccc_m10 Javaで使えるもう一つのコンパイル方式 – AOT
AOTコンパイルとは事前コンパイルのこと。
少し前にJava 9で採用されると聞いていたけれど、全然その後話を聞かなかったので、Java 9ではナシになったのかと思ってました。まだ実験的リリースだそうで、Linux 64bit版のみ、ドキュメントもないそうです。
同じ環境(同じメモリ量)でないといけないなど、まだ制約も多いみたいです。
はやくWindowsでも試してみたいですね。自分のMasSort(3-way MergeSort)はJITコンパイルが行われていない、初回呼び出しなどは他のアルゴリズムよりも遅い傾向にあるので、AOTが採用されるとだいぶん話が違ってくるのです。
…聞きたかったけど、帰らなければいけなかったので聞けなかった話。
#ccc_c7 CPUから見たG1GC
スライドどこかにアップされないかな…。
その他にもいくつかセッション聞いた、自分のセッション前は自分のセッションが気になって頭に入ってこず、自分のセッションの後は気が抜けて頭に入ってきませんでした。…なんだかんだ緊張していたのでしょうね。
あと懇親会…参加したかったな…。(そればっかり)
2017/11/11
から 松原正和
0件のコメント
LenovoのThinkpad X270 を購入しました。
前回書いた通りJJUG CCC 2017 Fallで登壇するのですが、その時のプレゼンにノートPCが必要だったからです。それだけというわけではないのですが、これからプレゼンみたいなことを増やしていきたいなあと思ったので。
たぶん10年ぶりくらいのノートPCです。安価なWindowsタブレットは持ってましたが、HDMIのような外付けディスプレイがつけられないのでプレゼンでは使えません。サブマシンなので高価なPCも買えません。
キーボードもうるさいほうで、普段はHHKB Professional JPを使っています。ノートPCのパンタグラフキーボードは慣れません。とくに、キートップの真っ平らなノートPCもありますが、タッチタイプしていて、キートップ中心から指がずれて打っていてもわかりにくいので、キートップはくぼみのあるタイプがいいです。
選定基準は以下の通り。
・外部ディスプレイが接続できる(今更D-SUBはちょっと…)
・サブマシンだけど、ちょっと開発もしたい(i5 or i7)
・持ち運びしやすいサイズ(~13インチくらい)
・キーボードがマシなもの
・なるだけ安く(できれば10万円以下)
SurfaceBookなどのウルトラブックも考慮したのですが高いですね。ミニディスプレイポートというのもちょっと…多分プレゼンの機会ごとに異なるでしょうが、標準サイズのHDMIポートが付いているほうが安心かな~とか。
なので、結局LenovoのThinkpad X270に落ち着きました。キーボードも他社より評価が高く、実際触ってみても、ちょっとの時間ならこれでも打てるかな…といった感じ。
あと、買ってみて気が付いたのですが、指紋認証がなにげに便利です。妻も羨ましがってました。
なかなか良いです。