2016-12-05

Java DB を試す

Apache Derby は、IBM から寄贈された Cloudscape のソースコードを元に、Apache ソフトウェア財団によってプログラムの開発が進められている、Java 技術で実装された RDBMS のソフトウェアです。Java DB は、オープンソースの Apache Derby データベースをオラクルがサポートしたディストリビューションです。JDBC API および Java EE API により標準の ANSI/ISO SQLをサポートします。Java DBは、JDKに含まれています。

以前、Python で SQLite3 のデータベースを操作するサンプルを紹介しましたが [1]、Java と Python を状況に応じて使い分けており、アプリケーション専用で使用するような簡単なデータベースが利用できると、どちらの場合も便利です。Java の開発環境である JDK では、Java DB が利用できるので、わざわざ SQLite を使わなくとも、ひとまず、Java DB を使ってみることにしました。

動作環境は次の通りです。Linux (Fedora) ですが、標準パッケージの OpenJDK は使用していません。

  • OS: Fedora 25 (x86_64)
  • Java: jdk1.8.0_112-1.8.0_112-fcs.x86_64 (Oracle)
  • IDE: NetBeans IDE 8.2

ライブラリの追加

Java DB を使うためには、Java DB 用の JDBC ドライバーの入っているライブラリーが必要になります。組込用途には derby.jar を、クライアント/サーバー環境用には derbyclient.jar をクラスパスに追加します。

今回は、組込用途として derby.jar を下記のように NetBeans のプロジェクトに追加しました。

サンプルソース

今回も DBOnlineSQLite入門 › データの追加と削除 › データの更新 [2] で使われている例をベースに焼き直しています。あらかじめご了承ください。

リスト:JavaDBTest.java 
package javadbtest;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

public final class JavaDBTest {

    Connection conn;

    JavaDBTest(String dbFile) {
        connection(dbFile);
    }

    // database connection
    void connection(String dbFile) {
        try {
            conn = DriverManager.getConnection("jdbc:derby:" + dbFile + "; create=true");
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Executes the given SQL statement that returns nothing
    void executeSQL(String sql) {
        Statement stat;
        try {
            stat = conn.createStatement();
            stat.executeUpdate(sql);
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Executes the given SQL statement, which returns a single ResultSet object.
    ResultSet querySQL(String sql) {
        Statement stat;

        try {
            stat = conn.createStatement();
            return stat.executeQuery(sql);
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    // database termination
    void shutdown(String dbFile) {
        try {
            conn.close();
            DriverManager.getConnection("jdbc:derby:" + dbFile + "; shutdown=true");
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) {
        String dbName = "test01";
        String dbDir = new File(System.getenv("HOME"), "tmp").getPath();
        String dbFile = new File(dbDir, dbName).getPath();

        JavaDBTest db = new JavaDBTest(dbFile);

        // create table
        db.executeSQL("create table staff(id integer, name varchar(10), unit varchar(10), flag varchar(4))");
        db.executeSQL("insert into staff(id, name, unit, flag) values (1, 'Satoh', 'Sales', 'Yes')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (2, 'Mori', 'Office', 'No')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (3, 'Yamada', 'Office', 'Yes')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (4, 'Asada', 'Tech', 'Yes')");
        db.executeSQL("insert into staff(id, name, unit, flag) values (5, 'Noguchi', 'Sales', 'No')");

        // query
        ResultSet res = db.querySQL("select * from staff");
        try {
            while (res.next()) {
                System.out.println(res.getInt("id") + "\t" + res.getString("name")
                        + "\t" + res.getString("unit") + "\t" + res.getString("flag"));
            }
        } catch (SQLException ex) {
            Logger.getLogger(JavaDBTest.class.getName()).log(Level.SEVERE, null, ex);
        }

        // database termination
        db.shutdown(dbFile);
    }
}

実行例

CPU (N2830) が非力だからでしょうか、妙に時間がかかっています。

run:
1 Satoh Sales Yes
2 Mori Office No
3 Yamada Office Yes
4 Asada Tech Yes
5 Noguchi Sales No
ビルド成功(合計時間: 12秒)

参考サイト

  1. bitWalk's: Python と SQLite3
  2. データの更新(UPDATE文) - SQLite入門
  3. JavaDBメモ(Hishidama's JavaDB Memo)
  4. Windows上でjavaDBをとりあえず使ってみる

 

ブログランキング・にほんブログ村へ
にほんブログ村

2016-11-28

PlayOnLinux を試す

PlayOnLinux は Linux 上で Wine を使って Windows のゲームなどのインストールを簡単にするためのアプリケーションです [1]

Wine は、Windows 向けのアプリケーションを Linux 上で動作させるため、オープンソースで Windows API を実装した Windows 互換レイヤーです [2]

Linux 上で Windows のゲームをしたいとか、どうしても Windows のアプリケーションを Linux 上で動作させたいといった強い動機がなかったので、Wine に触れることが無くなってしまっていたのですが、Fedora でも PlayOnLinux のパッケージを利用できることを知ったので試してみました。なお PlayOnLinux については、参考サイト [3] に詳しい紹介がされています。

使用環境は以下のとおりです。

  • OS: Fedora 25 (x86_64)
  • Wine: wine-1.9.22-1.fc25.x86_64 と関連パッケージ
  • PlayOnLinux: playonlinux-4.2.10-9.fc25.x86_64

PlayOnLinux のインストール

端末エミュレータを起動して、root 権限で次のようにタイプしてインストールします。私の環境の場合、既にインストールされているパッケージのせいでインストールできなかったので、パッケージの依存性を解決するため、--allowerasing オプションを付加しました。

$ su
パスワード:
# dnf install --allowerasing playonlinux
Failed to synchronize cache for repo 'Dropbox', 無効化。
メタデータの期限切れの確認は、1:27:39 時間前の Sun Nov 27 18:01:50 2016 に実施しました。
依存性が解決されました。
================================================================================
 Package                  アーキテクチャ
                                  バージョン                     リポジトリ
                                                                           容量
================================================================================
インストール:
 ImageMagick              x86_64  6.9.3.0-3.fc25                 fedora   170 k
 ImageMagick-libs         x86_64  6.9.3.0-3.fc25                 fedora   2.2 M
 bzip2-libs               i686    1.0.6-20.fc24                  fedora    46 k
  ...
  ...
 playonlinux              x86_64  4.2.10-9.fc25                  fedora   2.3 M
  ...
  ...
(途中省略)
  ...
  ...
ダウングレード済み:
  gnutls.x86_64 3.5.5-2.fc25             gnutls-c++.x86_64 3.5.5-2.fc25        
  gnutls-dane.x86_64 3.5.5-2.fc25        gnutls-devel.x86_64 3.5.5-2.fc25      
  gnutls-utils.x86_64 3.5.5-2.fc25      

完了しました!
#

PlayOnLinux の起動

GNOME のアクティビティ メニューから「アプリケーションを表示する」を選んで、PlayOnLinux のアイコンをクリックして起動できますが、悲しいかな UTF−8 化されていてもやっぱり日本語環境には優しくなくて、インストール可能なアプリケーションの一覧の画面までたどり着けませんでした。

そこで、端末エミュレータ上で以下のようにデフォルトロケール export LANG=C を設定して PlayOnLinux を起動しました。

# exit
exit
$ export LANG=C;playonlinux
Looking for python... 2.7.12 - wxversion(s): 3.0-gtk3
selected
[main] Message: PlayOnLinux (4.2.10) is starting
[clean_tmp] Message: Cleaning temp directory
[Check_OpenGL] Message: 64bits direct rendering is enabled
[Check_OpenGL] Message: 64bits direct rendering is enabled
[POL_System_CheckFS] Message: Checking filesystem for /home/bitwalk/.PlayOnLinux/
[main] Message: Filesystem is compatible
[install_plugins] Message: Checking plugin: Capture...
[install_plugins] Message: Checking plugin: ScreenCap...
  ...
  ...
  ...

起動したら Install ボタンをクリックします。

しばらく待つと、インストール可能なアプリケーションの一覧が表示されます。

Windows アプリケーションのインストール

ここでは Development で Notepad Plus Plus (Notepad++) をインストールしてみます。Notepad Plus Plus を選択し、右下の Install ボタンをクリックします。

すると、PlayOnLinux Wizard なるダイアログ画面が表示されるので、Next ボタンを押して次へ進みます。

三番目のダイアログ画面で PlayOnLinux Installation Wizard になるのですが、画面上の文字列が溢れているためか、下の Next や Cancel のボタンが見えなくなってしまっています。

しかし、前のダイアログ画面で Next ボタンがあった辺りに、このダイアログ画面でもマウスのポインタを持っていってクリックすると次の画面に進みます。

次のダイアログ画面で Download the program を選択して Next ボタンをクリックすると、インストーラのダウンロードが始まります。

NotePad++ のインストーラが起動しますので、ダイアログに従ってインストールを進めます。

インストールが終了して(Plugin Manager の設定後)Notepad++ が起動します。

Windows のアプリケーションをインストールしてしまえば、アクティビティから「アプリケーションを表示する」を選んで、PlayOnLinux のアイコンをクリックして起動しても使い物になります。インストールした Windows のアプリケーションは PlayOnLinux の画面から起動することができるからです。

まとめ

マルチバイトの言語環境固有の問題なのでしょうか、PlayOnLinux を利用するにはちょっと工夫が必要になります。それでも Linux 上で利用したい Windows のアプリケーションがあり、PlayOnLinux のリストに収録されていれば、インストール/アンインストールの管理が簡単な PlayOnLinux を利用する価値はあるように思います。

参考サイト

  1. Home - PlayOnLinux - Run your Windows applications on Linux easily!
  2. WineHQ - Run Windows applications on Linux, BSD, Solaris and Mac OS X
  3. WindowsのゲームをLinuxで楽しむ PlayOnLinux | OSDN Magazine [2008-3-13]

ブログランキング・にほんブログ村へ
にほんブログ村

2016-11-27

Fedora 25 リリース

Fedora 25 が、米国時間 11 月 22 日にリリースされました。遅くなってしまいましたが、今回のリリースの特徴をまとめました。Fedora 25 のラインナップには,デスクトップ向けの Fedora Workstation、サーバ向けの Fedora Server、そしてクラウドに最適化した Fedora Atomic がありますが、ここではデスクトップ向けの変更を中心にまとめています。

デスクトップで変更を実感できるものは、GNOME の新機能がほとんどになりますが、今後、新機能を確認して特筆すべきものについて個々に紹介していきたいと考えています。

ディスプレイサーバ
GDM (GNOME Display Manager) が、X11 の代わりに Wayland をデフォルトで使用するようになりました。
Gnome 3.22: Karlsruhe [5]
GNOME 3.22 が採用され、以下の機能が追加されました。
  • Flatpak: アプリケーションが必要とするコマンドやライブラリを SandBox に含めて提供するフレームワーク
  • 複数のファイル名を一度に変更する
  • 写真をソーシャルメディアと共有
  • 「ソフトウェア」アプリケーション(パッケージのインストール、更新などを管理する GUI ツール)の改善
  • ファイルアプリケーション Files (nautilus) の改善
  • Files (nautilus) でバッチファイルのリネーム [6]
  • キーボード設定のリデザイン
  • dconf エディタのリデザイン
  • その他多数…
  • Firefox 49
    Firefox 49 が採用されています [7]
    インプットメソッド
    ibus-libpinyin を使用しているユーザーは Ctl + Shift + d で、記憶されている過去に入力されたフレーズが消去されます。
    新しい国際化(多言語化)パッケージ
    フォント
    • adobe-source-serif-pro-fonts
    • oflb-coval-fonts
    • astigmatic-grand-hotel-fonts
    • typetype-molot-fonts
    ライブラリ
    • sharpfont
    • libXfont2
    • nodejs-os-locale
    • nodejs-y18n
    IBus Typing Booster 多言語サポート
    IBus Emoji(絵文字)入力 [8]

    参考サイト

    1. Fedora 25 Release Notes (CC BY-SA 3.0)
    2. Fedora 25がリリース ―GNOME 3.22をサポート,Waylandがデフォルトに:Linux Daily Topics|gihyo.jp … 技術評論社 [2016-11-24]
    3. Waylandがデフォルトとなった「Fedora 25」リリース | OSDN Magazine [2016-11-24]
    4. 「Fedora 25」 正式リリース | Think IT(シンクイット) [2016-11-25]
    5. GNOME 3.22インストール | 主な追加機能・変更点 | 普段使いのArch Linux [2016-10-16]
    6. Nautilus 3.22 Adds Batch File Renaming, Native Compression Features - OMG! Ubuntu! [2016-08-31]
    7. Firefox 49.0 リリースノート [2016-09-20]
    8. bitWalk's: 今度の Fedora 25 では絵文字が使えるらしい [2016-09-30]

     

    ブログランキング・にほんブログ村へ
    にほんブログ村

    2016-11-20

    Python と SQLite3

    Python では、バージョン 2.5 から標準ライブラリに含まれる sqlite3 モジュールで SQLite のデータベースを利用できるようになっています [1]。Python から SQL 文を実行することで、プログラム的には非常に柔軟にデータベースを操作することができるようになります。

    以前、本ブログで sqlite3 のコマンドを紹介しましたが [2]、今回は Python から SQLite のデータベースを操作する例を紹介します。

    使用環境は以下のとおりです。

    • OS: Fedora 25 beta (x86_64)
    • Python: python-2.7.12-7.fc25.x86_64

    ここで紹介する例は、DBOnlineSQLite入門 › データの追加と削除 › データの更新 [3] で使われている例をベースにして、Python から操作したかのように焼き直しています。あらかじめご了承ください。

    データベースの作成とデータの追加

    データベースの作成とデータを追加する例を示しました。

    # -*- coding: utf-8 -*-
    import os
    import sqlite3
    
    db_name = "test01.db"
    db_file = os.path.join(os.environ['HOME'], "tmp", db_name)
    conn = sqlite3.connect(db_file)
    cur = conn.cursor()
    
    sql = "create table staff(id integer, name text, unit text, flag text);"
    cur.execute(sql)
    
    sql = "insert into staff(id, name, unit, flag) values (?, ?, ?, ?);"
    users = [
        (1, 'Satoh', 'Sales', 'Yes'),
        (2, 'Mori', 'Office', 'No'),
        (3, 'Yamada', 'Office', 'Yes'),
        (4, 'Asada', 'Tech', 'Yes'),
        (5, 'Noguchi', 'Sales', 'No')
    ]
    cur.executemany(sql, users)
    conn.commit()
    
    sql = "select * from staff;"
    for row in cur.execute(sql):
        print(row)
    
    conn.close()
    

    実行例を示します。

    (1, u'Satoh', u'Sales', u'Yes')
    (2, u'Mori', u'Office', u'No')
    (3, u'Yamada', u'Office', u'Yes')
    (4, u'Asada', u'Tech', u'Yes')
    (5, u'Noguchi', u'Sales', u'No')
    

    データの更新

    これは特定のレコードのデータを更新する例です。レコードを決めて更新するのではつまらないので、name フィールドが 'Yamada' であるレコードを探し、'Yamaoka' に変更するようにしました。しかし、合致するレコードは(あるとしても)一つしかないという前提でコーディングしています。

    # -*- coding: utf-8 -*-
    import os
    import sqlite3
    
    db_name = "test01.db"
    db_file = os.path.join(os.environ['HOME'], "tmp", db_name)
    conn = sqlite3.connect(db_file)
    cur = conn.cursor()
    
    user = ('Yamada',)
    cur.execute('select * from staff where name = ?', user)
    result = cur.fetchone()
    
    if isinstance(result, tuple):
        sql = "update staff set name = ? where id = ?;"
        user_swap = ['Yamaoka', result[0]]
        cur.execute(sql, user_swap)
        conn.commit()
    
        sql = "select * from staff;"
        for row in cur.execute(sql):
            print(row)
    else:
        print result
    
    conn.close()
    

    実行例を示します。

    (1, u'Satoh', u'Sales', u'Yes')
    (2, u'Mori', u'Office', u'No')
    (3, u'Yamaoka', u'Office', u'Yes')
    (4, u'Asada', u'Tech', u'Yes')
    (5, u'Noguchi', u'Sales', u'No')
    

    Python の sqlite3 モジュールの使い方については、参考サイト [4] に判りやすくまとめられていましたので、参考にさせていただきました。

    参考サイト

    1. 11.13. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 2.7.x ドキュメント
    2. bitWalk's: sqlite3 のコマンド [2016-10-02]
    3. データの更新(UPDATE文) - SQLite入門
    4. Pythonでsqlite - Qiita [2016-05-12]

    ブログランキング・にほんブログ村へ
    にほんブログ村

    2016-11-19

    RStudio が version 1.0 になっていました

    RStudio は R 用の統合開発環境 (IDE) です。ずいぶんと長い間バージョンが 0.9 台のままだったのですが、ふと RStudio のサイトを見てみると、RStudio 1.0.44 が 11/1 にリリースされていました [1]

    RStudio には Desktop 版と Server 版があり、それぞれ無料のオープンソース版と有償版が提供されています。Windows、MacOS および Linux (Ubuntu, Fedora) に対応したバイナリおよびソースがダウンロードできるようになっています [2]

    以下は Fedora 25 beta (x86_64) 上での Desktop 版 (Free) の実行例です。

    参考サイト

    1. RStudio Release Notes – RStudio
    2. Download RStudio – RStudio
    3. RStudio Adds SparklyR Support [2016-11-09]
    4. IBM, Cloudera join RStudio to create R interface to Apache Spark | Computerworld [2016-09-28]

     

    ブログランキング・にほんブログ村へ
    にほんブログ村