A5:SQL Mk-2

開発のこと、日々のこと

2018/02/13
から 松原正和
0件のコメント

レノボ Yoga Tablet 2 with Windowsをセカンドディスプレイにする。

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でCaptionList及びCaptionFromComment疑似命令を追加(SQL結果セットで論理名表示)

A5:SQL Mk-2でこれまで、SQLの結果セットに論理名を付加する Captions疑似命令というのがあったのですが、SQLの列を追加・削除、あるいは順序の変更などするたびCaptions疑似命令も書き換えなければなりませんでした。

また、Captions疑似命令の書き換え忘れで、結果セットのグリッドで表示された列名と表示内容が異なってしまい、トラブルの原因ともなるようでした。

そこで、CaptionList疑似命令と、CaptionFromComment疑似命令を追加しました。これからは、Captions疑似命令は非推奨とし、CaptionListまたはCaptionFromComment疑似命令を推奨としたいと思います。

使い方は以下の通り。

CaptionList疑似命令

CaptionList の後に ’ ’ で括って ‘Key1=Value1, Key2=Value2, Key3=Value3…’形式で記述します。

CaptionList疑似命令は複数記述することができます。

 

CaptionFromComment疑似命令

CaptionFromComment疑似命令を記述しておくと、SELECT文の列定義(列名)の後ろに記述されたコメントを論理名として扱います。列定義を区切るカンマの位置は列定義の前でも後ろでも構いませんが、列定義(の最終行)の後に書く必要があります。

 

2018/01/14
から 松原正和
1件のコメント

A5:SQL Mk-2でDROP TABLEとCREATE TABLEを実行してもデータが消えないようにする機能を実装

データベースのテーブル定義を修正したら、いったんテーブルをDROP TABLEしてから、CREATE TABLEで作り直すことなどがよくあると思います。

でもこの時悩ましいのが、登録されているテーブルデータが消えてしまうこと。

ここで A5:SQL Mk-2 version 2.13.0 beta 35から、DROP TABLEの前にテンポラリテーブルを作ってデータを保存し、CREATE TABLEの後にテンポラリテーブルからデータをロード&テンポラリテーブル削除する機能を付けてみました。

以下のようにBackupToTempTable, RestoreFromTempTable 疑似命令を使います。

このように書くことで、以下のような動きをします。

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件のコメント

Hyper-VでなくVMwareでDocker for Windows を使う

長らく 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を導入

そういうブログ記事とかは多いと思うのでさらっと。

 

■Windows端末から名前解決できるようにする

Windows端末から名前解決できるようにするためsamba(のnmb)を導入する。

 

■Docker for Windowsからのアクセス

普通にDocker for Windows をダウンロードしてインストール
https://docs.docker.com/docker-for-windows/install/
Get Docker for Windows [Stable] からダウンロードしてインストールした。
以下のコマンドを実行して、自分のユーザーがdocker-usersグループに含まれているか確認する。

自分のユーザーがdocker-usersグループに含まれていない場合、以下で追加

再起動すると 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」 を「手動」に変更する

 

看過できない疑問

これ、セキュリティ(Dockerのアカウント)ってどうなってるんだろう?dockerdの-Hオプションで接続元IPをある程度制限できそうだけど…分かったら追記します。

2018/01/06
から 松原正和
0件のコメント

CentOS 7.4のdockerにMySQLとMariaDBを入れた話

VMWare 上のCentOS 7.4 に Oracle Databaseと Microsoft SQL Server 2017とIBM Db2 Express-CとPostgreSQLとFirebirdとMySQLとMariaDBを入れてみました。

パクリ記事ばっかりになりそうな気もしなくもないですが、とりあえず、MySQLとMariaDBから。

参考: DockerでさくっとPostgreSQL/MySQL/MariaDBを触る方法 

参考 : CentOS7にDockerをインストールする

 

環境は以下のような感じです。
OS : CentOS Linux release 7.4.1708 (Core) (VMware Workstation上の仮想マシン)
メモリ : 4GB 割り当て

MySQLとMariaDB以外のデータベースはCentOS上にそのままインストールしたのですが、MySQLとMariaDBは共存が面倒そうだったので、Dockerをインストールし、その上で動作させることで共存させています。
参考(OS上で直接共存させる方法): Installing MariaDB Alongside MySQL

 

■Dockerのインストール

 

■リポジトリ追加

 

■yumのパッケージインデックスを更新

 

■インストール

 

■自動起動の設定と起動

 

■自分のユーザーでDokerを起動できるようにする

※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 クライアントの導入

 

以下mariadb 10.2のインストール

 

■コンテナの3306ポートを13302にマップしてMariaDBを開始(docker run)

※ボリューム(mariadb_10.2_data)を作成しつつ、docker run している

※rootパスワードのXXXXXXXXは適宜変えること

 

■データベース(UTF8MB4_DB)の作成とユーザー(matsubara)の作成及び権限の設定(雑・セキュアではない)

mysqlコマンドを実行するとき、-h オプションを付けない場合、localhostに対してログインします。MySQLクライアントは接続先ホストが localhostの場合(-h オプションを指定しない場合も含む)tcpプロトコルでなくソケット接続を使用し、–portオプションを無視するらしいです。このため、「–protocol tcp」を付加するか、「-h 127.0.0.1」を指定してTCPプロトコルで接続します。

 

■サービスの設定ファイル作成(自動起動のために)

Type=simpleはデフォルトなので実は要らないですが、dockerコマンドはRemainAfterExitを付けないと、うまく自動起動しませんでした。どうも、起動しないというより、正しく起動できたことをうまく検知できなくて、直後にサービス停止コマンド(ExecStop)が実行されてしまうようです。

Type=forkingやType=oneshotも試したのですが、うまくいきませんでした。

 

■サービスの設定ファイルをsystemdに読み込ませる。

 

■サービスを自動起動に設定

自動起動しない場合は要らない

 

以下MySQL 5.7 のインストール

 

■コンテナの3306ポートを3357にマップしてmysqlを開始(docker run)

※rootパスワードのXXXXXXXXは適宜変えること

 

■データベース(UTF8MB4_DB)の作成とユーザー(matsubara)の作成及び権限の設定(雑)

 

■サービスの設定ファイル作成(自動起動のために)

 

■サービスの設定ファイルをsystemdに読み込ませる。

 

■サービスを自動起動に設定

 

以上です。…あと、調子に乗ってmysql 5.5 と MariaDB 5.5, MariaDB 10.1もインストールしてしまいました。

(自動起動はしません。)

2017/12/17
から 松原正和
0件のコメント

Devart社の UniDACコンポーネントのご紹介

本日は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を継承しています。

 

こんな感じ…。

 

Oracleダイレクトモードのときは以下

 

MySQLなら以下(MySQLはダイレクトモードのみ)

 

クエリーの実行

 

MySQLでのクエリー実行は以下のオプションも追加

 

PostgreSQLでのクエリー実行は以下のオプションも追加

 

基本的に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件のコメント

Windows Subsystem for Linux で Java 9のAOT(事前)コンパイルを試してみた話

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

すみません、前半の内容よくわかりません。Java導入するのにPython必要なんですか?。インストール時の応答を自動化して要るっぽいのでしょうか。とりあえず、全部そのままコピペして実行しました。
導入できたら、「Java -version」できちんと導入されたことを確認します。

 

4.なんか実行してみる
とりあえず、手持ちのソートアルゴリズムを…。
Mas4Sort 自分がJJUG CCC 2017 FallでもセッションしたMasSort(3-way Mergesort)の兄弟で4-way…つまり、4分割版のマージソートです。これは、JITコンパイルのオーバーヘッドが大きいので今回のテストにはうってつけです。

(そもそもコードが(ムダに)長くなりがちなため、JavaよりC++のほうがMas4Sortアルゴリズムと相性がいい気がする)

以下のコマンドで10000000件の乱数の整数キーを持つオブジェクトのソートを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」とかオプションがあるみたいなのだけど…。

オプションを見ると、jarファイルなんかも指定できるっぽいですね。…試してません。

 

6.AOTライブラリを指定して実行してみる
なんだかよくわからないのですが、「-XX:AOTLibrary」でライブラリファイル(.so)を指定するときは、先頭に「./」を付けてやらないとうまく動きませんでした。
ちなみにライブラリを複数指定するときは、「:」で繋ぐらしいです。

 

実行結果は…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と同等になることを確認しました。

 

以下も読んでみてください。

JJUG ナイトセミナー: 年送りビール&LT大会 2017/12/27

Javaで使えるもう一つのコンパイル方式 – AOT  … を無理やりWindowsでやってみた話

2017/11/19
から 松原正和
0件のコメント

JJUG CCC 2017 Fall に参加した話(高速なソートアルゴリズムを書こう!!)

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件のコメント

Thinkpad X270 買いました。

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に落ち着きました。キーボードも他社より評価が高く、実際触ってみても、ちょっとの時間ならこれでも打てるかな…といった感じ。

あと、買ってみて気が付いたのですが、指紋認証がなにげに便利です。妻も羨ましがってました。

 

なかなか良いです。

 

2017/11/08
から 松原正和
0件のコメント

JJUG CCC 2017 Fallで登壇する話

もっと早く告知するべきだったのでしょうが、来る11/18日、JJUG CCC 2017 Fallにて登壇します。

お題目は「速いソートアルゴリズムを書こう!!」です。

Javaのカンファレンスなので、標準のArrays.sort()メソッドをベンチマーク対象として、クイックソートやマージソートの改良アルゴリズムを提案します。省メモリマージソートというのも。

こう言うの出るの初めてですし、初心者の20分枠で話させていただきます。

自分はRoom Mの15:45~16:05で登壇します。

会場見取り図

 

まだ、参加を受け付けているようですので、聴いてみたいなって方は是非参加してみてください。