今日もプログラミング

IT技術とかプログラミングのこととか特にJavaを中心に書いていきます

jnr-ffiでJavaからCを呼び出すときに構造体を扱いたい

構造体ポインタを引数にとるCの関数をJavaから呼び出したい 以前、jnr-ffiを使ってJavaからCのライブラリを呼び出してみた。 jnr-ffiでJavaからCを呼び出す (Windows) このときは、intとかStringなどの基本的な型しか使っていなかったが、構造体の場合はどう…

embulk-output-sqlserverのパフォーマンスを計測したら結構速かった

embulk-output-sqlserverとは embulkとは、オープンソースのバルクデータ転送ツールである。 そして、embulk-output-sqlserverとは、embulkのプラグインの1つで、SQL Serverにデータをロードするためのものである。 これを使うと、CSVファイルとか他のデータ…

embulk-output-oracleのパフォーマンスを向上する!

背景 ここでも書いたが、embulk-output-oracleを業務システムで使うには、もう少し速くしたい。 そこで、embulk-output-oracleのパフォーマンスを向上することにした! embulk-output-oracleの現状のパフォーマンス まずは、現状(embulk 0.8.12 + embulk-ou…

Embulkを業務システムで使った話

背景 自分はSIerのエンジニアである。 いろいろなお客様の、いろいろな業務システムと格闘するのがお仕事である。 また、今はembulk-input-jdbcとかembulk-output-jdbcのコミッタもやっている。 業務システムとRDBとテキストファイル 業務システムでは、たい…

パフォーマンスとメンテナンス性で揺れるembulk-output-oracle

embulk-output-oracle embulkとはバルクでのデータ転送ツールだ。 embulk-output-oracleはそのプラグインの1つで、Oracleにデータをロードするためのものだ。 OCIの利用 OCIとは、Oracle Call Interfaceのことで、要するにOracleのネイティブライブラリAPIだ…

データベースの列名で大文字と小文字は区別される?

データベースのテーブル名で大文字と小文字は区別される? と同じ結果になると思われるが、一応確認してみた。 Oracle SQL> create table case_column_test (c1 char(2), C1 char(2)); create table case_column_test (c1 char(2), C1 char(2)) * 行1でエラ…

データベースのテーブル名は大文字と小文字のどちらで管理される?

以前、「データベースのテーブル名で大文字と小文字は区別される?」という記事を書いたが、もう少し調査を進めてみた。 Oracle SQL> create table "case_test" (id1 char(2)); 表が作成されました。 SQL> select table_name from user_tables; TABLE_NAME -…

データベースのタイムゾーン付型について調べてみた

embulk-input-jdbcでこんな問題が上がっていたので、データベースのタイムゾーン付の型について調べてみた。 MySQL (5.6) ドキュメントを見ると、TIMESTAMP型はタイムゾーンに対応しているらしい。 DB内ではUTC、クライアント側ではtime_zoneシステム変数で…

SQL ServerのNative Clientを使ってバルクロードしてみる

embulk-output-sqlserverをリリースしました 先日、バルクデータローダEmbulkのプラグインとして、SQL Serverにロードするためのembulk-output-sqlserverをリリースした。 しかし、embulk-output-sqlserverは単純にINSERT文でデータをロードするので、たぶん…

Oracle SQL*LoaderのPARTITIONについて

Oracle SQL*Loaderでは、制御ファイルに以下のように書くと、特定のパーティションにロードすることができる。 INSERT INTO SOME_TABLE PARTITION (SOME_PARTITION) VALUES ... 挙動について ドキュメントによると、 「行が指定のパーティションに対応しない…

jnr-ffiでJavaからCのポインタを使う

jnr-ffiは、Javaから簡単にCのライブラリを呼び出せるフレームワークだ。 JNIのような煩雑なコードを書かなくてよいのがメリット。 前に記事を書いたときは、プリミティブ型とかStringしか試さなかったので、今回はそれ以外のポインタを試してみる。 Pointer…

Embulkの環境を丸ごとコピーする

Embulkでプラグインをインストールすると、実行ユーザのホームディレクトリの下に.embulkディレクトリができて、gemがインストールされる。 別の環境でも同じようにEmbulkを動かすには、Javaをインストールして、Embulkの実行ファイルをコピーして、ホームデ…

EmbulkでCSVからDBにロードするときのエラーについて調べてみた

以前、Embulkのエラー処理について調べてみるというタイトルで記事を書いたが、あれからずいぶんとバージョンが上がっているので、再度確認してみることにした。 CSVの項目が多過ぎる場合 以下のような警告が出て、スキップされた。 2015-12-11 16:02:29.364…

MySQLのLOAD_FILEではまった

LOAD_FILEがNULLを返す? MySQLのblob列に画像データを突っ込もうとして、 insert into xxx values( ..., load_file('/data/image.jpg') ); のようなSQLを投げてみたが、どうしてもNULLになってしまう。 ファイルはちゃんとあるのに…、なぜだろう? パス指定…

データベースのテーブル名で大文字と小文字は区別される?

embulk-output-oracleを使っている方から、テーブルがあるのにエラーになってしまう、という問い合わせがあった。 調べてみると、テーブル名は大文字なのに、設定ファイルは小文字で書いてある。 普通にOracleでSQLを書くと大文字/小文字は区別されないが、…

embulk-output-redshiftのパフォーマンスを計測してみた

embulk-output-redshiftを使えばテキストファイルを簡単にAmazon Redshiftにインポートできる。 だが、やはり気になるのはパフォーマンスだ。 という訳で、embulk-output-redshiftのパフォーマンスを計測してみた。 計測環境 AWSのリージョンはTokyoを使用し…

jnr-ffiでJavaからCを呼び出す (Windows)

jnr-ffiとは? JavaからCを呼び出す、と言えばJNIだが、C側にJNI固有の処理を書いたりするので結構めんどい。 jnr-ffiというフレームワークを使うと、C側の関数をそのままJavaにマッピングして呼べるらしい。 具体的には、C側に int length(char *s) のよう…

embulk-input-jdbc 0.5.0では型を指定できるようになった

以前embulk-input-jdbcをOracleで試したときは、いろいろと問題があった。 整数なのに小数点以下が出力される 大きな数値が指数表記で出力される DATE型なのに時分秒が出力される TIMESTAMPの秒未満が出力されない しかし、embulk-input-jdbc 0.5.0 (および …

embulk-output-redshiftのタイムゾーンについて

embulk-output-redshiftでタイムゾーンがどう扱われるかを確認してみた。 Redshift側のタイムゾーン UTC固定らしい。 検証の準備 テーブル create table test1 ( id char(4), varchar_item varchar(20), integer_item int, numeric_item numeric(10,2), date…

embulk-output-jdbcの型についてまとめた

embulk-output-jdbcではいろいろな型が出てくる。 ややこしいので、現在の実装に基づいてまとめてみた。 embulk-output-jdbcに出てくる型の種類 入力の型 column_optionsのvalue_type column_optionsのtype 出力先テーブルの列の型 入力の型 embulk内部の型…

EmbulkでRedshiftにデータをロードしてみる

今回は、EmbulkでRedshiftにデータをロードするのを試してみたい。 マシンの準備 まずはRedshiftのインスタンスを準備する。 とりあえずは動作確認なので、一番安いdw2.largeにした。 うちの社内からデータをロードしようとすると、ユーザ認証が必要なプロキ…

POIでコネクタを描いてみる

POI

POIでコネクタは描けるのか? SIerはExcelが大好きなので、設計書もExcelで作ることが多い(いいか悪いかは置いといて…)。 でも手で全部書くのは面倒なので、Javaのソースから自動生成できると便利だなー、とか思うことがある。 設計書には、オートシェイプ…

EmbulkのCSV parserのスキーマをDBメタ情報により定義する

DBメタ情報からCSVの列を定義したい EmbulkでCSV parserを使うときは、ymlファイルに列の定義を書く必要がある。 Embulkにはguessという便利な機能があって、CSVファイルから列の定義を出力することもできる。 だけどCSVファイルをDBにロードする場合は、ロ…

Embulkの設定ファイルでエイリアスを使う

Embulkの設定ファイルを書いていると、同じ値が繰り返し現れることがある。 例えば、CSVをTSVに変換する設定ファイルを書いてみると、 in: type: file path_prefix: 'data/test.csv' parser: type: csv charset: SJIS delimiter: "," header_line: false col…

Oracleでembulk-input-jdbcを試してみた

※2016/6/23: この記事は古いので、 こちらをご参照ください。 embulk-output-oracleもだいぶ良くなってきたので、そろそろinputの方も試してみたい。 どうやらembulk-input-oracleは無いようなので、汎用的なembulk-input-jdbcを使ってみることにした。 準備…

embulk-output-oracleのパフォーマンスを計測してみた

embulk-output-oracleとは? embulk-output-oracleについては何度か書いているが、一応概要を。 embulkは、オープンソースのバルクデータ転送ツールで、プラグインにより様々な入出力に対応することができる。 embulk-output-oracleも出力プラグインの1つで…

Hadoopでプロキシ経由でAmazon S3にアクセスする

Hadoopと言うか、HadoopのFileSystemクラスを利用してS3にアクセスしたいのである。 AWS SDKがあるのに、なんで?かと言うと、FileSystemを使うとローカルファイルとかHDFSとかと同じインターフェイスでアクセスできるので、汎用的なツールを作るのに便利だ…

Embulkのエラー処理について調べてみる

自分はEmbulkを業務システムに組み込むことを考えている。 となると、気になるのはエラー処理。 エラー時にどんな挙動になるかを確認しておきたい。 Embulkのプラグインの組み合わせは多数あるが、とりあえず想定しているのはCSVファイルを読み込んでRDB(例…

embulk-output-oracleを高速化したので使い方についてまとめる

embulk-output-oracleを劇的に高速化した0.2.2がリリースされたので、使い方について書いてみる。 どのくらい速くなったかは改めてまとめる予定だけど、これに沿った感じになると思う。 3つの挿入モード READMEにも書いたけど、embulk-output-oracleには nor…

JDBCからストアドプロシージャを呼び出す(Oracle、SQL Server、MySQL)

RDBMSの差異を吸収してくれるのがJDBC…、のはずが、なかなかそううまくはいかない。。 ストアドプロシージャの呼び出しも、RDMBSによって細かな違いがあるようだ。 MySQLのストアドプロシージャを呼び出す まず、テスト用のストアドプロシージャを準備する。…

POIで正方形を描画する

ちょっと間が空いてしまったが、この前の続き。 今回はPOIを使って、正方形を描いてみたい。 テキストボックスを描くのは簡単だが、問題は座標だ。 POIの座標指定 POIでテキストボックスを描くには、まず Sheet#createDrawingPatriarch() により、XSSFDrawin…

OCIを使ってOracleに高速にデータをロードする

最近こればっかりだが…、現在embulk-output-oracleの高速化に励んでいる。 どうやったら大量データをOracleに高速に突っ込めるか?というのをいろいろ試してみた。 SQL*Loader Oracleが提供する、大量データロード用のツール。 その目的に作られているだけあ…

JNIでC側のポインタを保持する方法について

Cのポインタを保持したい 現在embulk-output-oracleを高速化するために、JNI(Java Native Interface)を使ってプログラミングしている。 その時ちょっと悩んだのが、Cのポインタをどうやって保持するか、だ。 フローとしては、 Java C 初期化処理 → 必要なメ…

embulk-output-oracle(0.2.1)の仕様について

embulk-output-oracleが一応公開されたが、とりあえず動く、というレベルのもので、まだ完成度は低い。 とは言え、現状の仕様についてまとめてみる。 Oracleのバージョン 12c(Windows)で検証したが、たぶん他のでも動くと思う。 driver_path ymlファイル中の…

ファイルを分割して入力するEmbulkプラグインを作ってみた

Embulkの並列処理 Embulkは、処理を複数のタスクに分割して並列に実行する仕組みを備えている。 しかし、標準のファイル入力プラグインでは、単純に1つのファイルを入力すると1タスクにしかならないようだ(こちら参照)。 ソースを読んでみると、複数ファイ…

Embulkプラグインのテストを楽にやりたい

EmbulkではJavaやRubyでプラグインを開発することができる。 自分は今のところJavaで開発しているので、それについて書いてみたい。 どうやってプラグインをテストする? EmbulkのプラグインはRubyのgemとして配布される。 そして、embulk gem install ~ で…

OracleのJDBC型を調べてみたら大変だった

Javaでデータベースに関するツールを作るときに便利なのがjava.sql.DatabaseMetaData。 これを使うとテーブルの情報とかカラムの情報などいろいろ取れる。 しかし、面倒なのは、DBMSの型がJDBCのどの型にマッピングされているかだ(JDBCの型はjava.sql.Types…

EmbulkでMySQLに4GB突っ込んで測ってみた

Embulkを使えば、いろいろなデータを簡単にDBに突っ込めるはず。 でも、パフォーマンスが気になるよね。 という訳で、Embulkのパフォーマンスを測ってみることにした。 環境の準備 自分のマシンでパフォーマンステストをすると他のことができなくなってしま…

JDBCのカタログとかスキーマについて調べる(Oracle、SQL Server、MySQL)

JDBCには便利な機能があって、テーブルや列のメタ情報を取得できる(java.sql.DatabaseMetaDataのgetTablesとかgetColumnsとか)。 で、これらのメソッドの引数にはカタログとかスキーマを渡す必要がある。 これって何なの?というのを調べてみたい。 ちなみ…

POIの座標について調べてみる

POI

業務システムでは「Excelファイルをアップロードしてデータを入力したい」「検索結果をExcelファイルでダウンロードしたい」というような要求が日常茶飯事だ。 そんなときに役に立つのが、ApacheのPOI。 POIではセルの値を読み書きするだけでなく、図形を描…

embulk-output-mysqlのソースを読んでみる

MySQLはWebサービスでは広く使われていると思うけど、業務システムではOracleやSQL Serverも多く使われている。 しかし、今のところOracleやSQL Server用のプラグインは無いようだ。 自作するとしたらきっとMySQL用のプラグインが参考になるはずだ。 という…

EmbulkをWindowsで正しく起動する

embulk.batで起動する 前回は、Embulkを java -jar embulk.jar <command> ... で起動していたが、実はこれは正式な起動方法ではない。 embulk.jarをembulk.batにリネームし、 embulk <command> ... で、すっきりと起動できるのだ! 但し、0.4.8まではembulk.bat <command> ...でないと起</command></command></command>…

EmbulkでMySQLに出力してみる

Embulkでexampleとembulk-plugin-input-randomまで試したので、いよいよMySQLへの出力を試してみる。 ちなみに、実行環境はWindows。 embulk-output-mysqlプラグインのインストール MySQLへの出力は、embulk-output-mysqlプラグインが利用できる。 java -jar…

new BigDecimal(String)について調べてみた

業務システムでは必須とも言うべきBigDecimalクラス。 今回は、Integer.parseInt(String)、Double.parseDouble(String)に続いてnew BidDecimal(String)を調べてみた。 整数だけでなく、当然小数もparseできる。 new BigDecimal(".1") new BigDecimal("1. ") …

Embulkをさわり始めてみた

最近リリースされた、オープンソースのバルクローダEmbulk。 業務システムでもテキストファイルをRDBにロードすることはよくあるので、使えるかもしれないと思い、さわりはじめた。 Quick Startを試した後、くまメモを参考にさせてもらい動かしてみる。成功…

Double.parseDoubleできるのは「数字」だけではない

前回Integer.parseIntについて調べたので、今回はDouble.parseDoubleについて調べてみる。 JavaのdoubleというかIEEE754の浮動小数点数には、特殊な値がいくつかある。 非数(Double.NaN)と無限大(Double.POSITIVE_INFINITYとDouble.NEGATIVE_INFINITY)だ…

Integer.parseIntは奥が深い

Javaで文字列を整数に変換するには、Integer.parseIntを使う。 だが、こいつは半角数字だけでなく全角数字も通すので、 Integer.parseInt("1234") なんてのも正常になる。 まあ親切なんだけど、業務システムだと「半角数字のみOK」な仕様なことが多いの…

Excelの1900/2/29をPOIで取得してみる

POI

1900年は閏年ではない。 しかし、Excelのバグで1900/2/29という日付を設定できてしまう。 これをJavaからPOIで取得するとどうなるか?を試してみた。 ほんとうはExcelファイルを作って、POIで読み込んで…、とするべきなんだろうけど、面倒なのでPOIのDataUti…

javaでdiffを

開発用のツールとかを作っていると、ソースの差分をとる機能が欲しくなるときがある。 しかし、外部プロセスでdiffを呼ぶのはちょっと重たいし、そもそもWindowsだとdiffは標準で入ってないし、かと言ってfcは微妙だし…。 Javaでdiffができるライブラリとか…

nullを含む演算をどう処理するか?

BigDecimal result = n1.add(n2); みたいなとき、n1あるいはn2がnullだとNullPointerExceptionが投げられる。 でも、そうではなくてresultもnullになってほしい、という場合がある。 こういうとき、どうするか? nullチェックを直接入れるとコードが見にくく…