My開発メモ

最近の投稿

MySQL あるいは MariaDB の文字コードの設定

参考にしたサイト

設定前

設定前の状況を確認する。

XAMPP のコントロールパネルから、シェルを起動して、

# mysql <return>

と入力し、

MariaDB[(none)]> show variables like 'char%'; <return>

mariaDB_pre01.PNG

次に以下も試してみる。

MariaDB[(none)]> status; <return>

mariaDB_pre02.PNG

「cp932」とは「拡張SJIS」のことだそうである。

文字コードが設定されていないことがわかる。

やったこと

my.ini を開いて、151行目辺りからの以下の行のコメントをはずす。

最初の設定 init-connect=\'SET NAMES utf8\' ではうまくいかないので、

「\'」をはずした。

my.ini

## UTF 8 Settings
init-connect=SET NAMES utf8
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
character_sets-dir="C:/xampp/mysql/share/charsets"

これで、mysql に接続し、設定を見る。

MariaDB[(none)]> show variables like 'char%'; <return>

mariaDB_pre03.PNG

MariaDB[(none)]> status; <return>

mariaDB_pre04.PNG

無事、UTF-8に設定された。

コマンドプロンプト用の設定 (2020.07.28 追加)

Windowsのコマンドプロンプトは、文字コードが cp932 である。

> chcp 65001 と、文字コードを utf-8 に変更しても、日本語入力がうまくいかない。

そこで、cp932 のまま mysql に接続したい。

ただ、保存するデータは utf-8 にしたい。

そのための my.ini の設定。

C:\xampp\mysql\bin\my.ini

......

[client]

......

default-character-set=utf8              # <== <1>


[mysqld]
......

## UTF 8 Settings のところはそのまま
#init-....
#collation...
#character....
#skip-....
#character....
sql_mode=.....
log_bin_.....

character-set-server=utf8              # <== <2>
collation-server=utf8_general_ci       # <== <3>
...

としておいた。

<1> -- これは少し自信がない。cp932でもいいのかもしれない。

<2> -- MySQLサーバーは utf-8 にする。

<3> -- 照合順序はこんなもんだろう。

mysql> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | cp932                      |
| character_set_connection | cp932                      |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | cp932                      |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

こういう感じである。

これで、コマンドプロンプトから日本語を入力しても、サーバーには utf-8 で保存される。

参考サイトなど

この設定メモでの疑問は、以下である。

1) UTF-8 Settings で、「init-connect=\'SET NAMES utf8\'」となっている点。 これだと、MariaDBは、「ODBCに接続できない」っていうエラーが出るんだけどな。

2)[mysqldump][mysql]で「character_set_server=utf8」と記述している点。 これは、他のサイトも同様。ここは別に記述しなくても、UTF-8になるとおもう。(MriaDB> status;で確認した)

カテゴリ: MySQL
タグ: my.ini
Count: 81

設定ファイルを作成して、それを読み込ませる方法(Java)

たとえば、以下のような設定ファイルがある。

game.conf

col 6
row 6
 

これを1行ずつ読み込ませ、 col に 6、row に 6 という値を設定したいとする。

Javaの BufferedReader クラスの readLine メソッドを使うと 1行ずつ読みこんでくれる。しかも、改行は省いてくれる。

ただし、最終行(ここでは2行目)を読み込んだあと、 次の行を読み込むとき、NullPointerException が発生する。

それを避けるために、改行のみの空行を最終行に設けている。

読み込んだ行が中身なしの空行であった場合、ルーチンを 抜けるようにしている。

GetConf.java

package util;

import java.io.*;
import java.util.*;
import java.util.stream.*;

/**
 * settei.conf の内容を Map<String, String> の形で読み取る
 * 使い方:
 *   settei.conf
 *     username Seiichi
 *   Map<String, String> mapList = new GetConf("settei.conf").load();
 *   String username = mapList.get("username");
 *
 * ここでの使用法:
 *   settei.conf
 *     row 6
 *     col 6
 *     (空行)
 * 
 *   settei.conf の書式は以下のように決まっている。
 *     プロパティ名 (空白) 値 (改行)
 *     プロパティ名 (空白) 値 (改行)
 *     (改行のみの空行)
 *   BufferedReader の readLine は、改行を取り除いてくれる。
 *   読み取った行は line に入れている。
 *   そして addMap(line) で token[0] と token[1] という
 *   配列に入れている。
 *   settei.confの最終行が(改行)のみの空行でなかった場合、
 *   readLine は、NullPointerException を返す。
 *   それを避けるために(改行)のみの空行を入れている。
 */
public class GetConf {

    String filename = null;
    Map<String, String> confList = new HashMap<>();

    public GetConf(String fname) {
        this.filename = fname;
    }
    
    public Map<String, String> load () {
        try {
            File file = new File(filename);
            BufferedReader reader = new BufferedReader(new FileReader(file));

            String line = "";
            while (! (line = reader.readLine()).equals("")) {
                addMap(line);
            }
        } catch (FileNotFoundException fe) {
            System.out.println("ファイルがありません。");
            System.exit(1);
        } catch (IOException ie) {
            ie.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return confList;
    }

    void addMap(String line) {
        String[] token = line.split(" ");
        // Arrays.stream( token ).forEach( ele -> System.out.println(ele) );
        if (token.length == 2) {
            confList.put(token[0], token[1]);   
        }
    }
}

カテゴリ: Java
タグ: 設定ファイル readLine BufferedReader
Count: 2

実行可能なjarファイルを作成する

以下のような構成のディレクトリがあるとする。

./othello
├── LICENSE
├── README.md
├── build.xml
├── classes
│   ├── GuiTest.class
│   ├── Main.class
│   ├── agent/
│   │   └── Bot.class
│   ├── conf/
│   │   └── game.conf
│   ├── game.conf
│   ├── gui/
│   │   ├── Masu.class
│   │   ├── NukGui$Board.class
│   │   ├── NukGui$Masu.class
│   │   └── NukGui.class
│   ├── helper/
│   │   └── GameHelper.class
│   ├── model/
│   │   ├── Action.class
│   │   ├── Direction.class
│   │   ├── Field.class
│   │   ├── Koma.class
│   │   ├── MasuData.class
│   │   └── Score.class
│   ├── othello.jar/
│   ├── pic/
│   │   ├── Black.jpg
│   │   ├── GreenFrame.jpg
│   │   └── White.jpg
│   └── util/
│       ├── ConsoleControl.class
│       ├── GetConf.class
│       ├── GetUserInput.class
│       └── PlatformUtils.class
└── src
    ├── GuiTest.java
    ├── Main.java
    ├── agent/
    │   └── Bot.java
    ├── conf/
    │   └── game.conf
    ├── gui/
    │   └── NukGui.java
    ├── helper/
    │   └── GameHelper.java
    ├── model/
    │   ├── Action.java
    │   ├── Direction.java
    │   └── MasuData.java
    └── util/
        ├── ConsoleControl.java
        ├── GetConf.java
        ├── GetUserInput.java
        └── PlatformUtils.java

実行可能なjarファイルを作成する。

classディレクトリにて、作業する。

$ cd classes

マニフェストファイルを作成する。

$ mkdir META-INF
$ touch META-INF/MANIFEST.MF

META-INF/MANIFEST.MF

Manifest-Version: 1.0
Main-Class: Main
 

Main-Class: で、public static void main があるクラスを指定する。

今回の場合は、Main.class

最後に改行のみの行を含める。

classディレクトリは、以下のような構成になる。

./classes
├── GuiTest.class
├── META-INF
│   └── MANIFEST.MF
├── Main.class
├── agent
│   └── Bot.class
├── conf
│   └── game.conf
├── game.conf
├── gui
│   ├── Masu.class
│   ├── NukGui$Board.class
│   ├── NukGui$Masu.class
│   └── NukGui.class
├── helper
│   └── GameHelper.class
├── model
│   ├── Action.class
│   ├── Direction.class
│   ├── Field.class
│   ├── Koma.class
│   ├── MasuData.class
│   └── Score.class
├── othello.jar
├── pic
│   ├── Black.jpg
│   ├── GreenFrame.jpg
│   └── White.jpg
└── util
    ├── ConsoleControl.class
    ├── GetConf.class
    ├── GetUserInput.class
    └── PlatformUtils.class

jarファイルの作成

$ jar cmvf META-INF/MANIFEST.MF othello.jar agent conf gui helper model pic util *.class

オプション

c -- jarファイル作成
m -- マニフェストファイルを指定する。今回は、META-INF/MANIFEST.MF
v -- 詳細を表示
f -- jarファイルを指定する。今回は、othello.jar

続けて、jarファイルに含めるディレクトリを指定している。今回は、agent, conf, gui, helper, model, pic, util

最後に、カレントディレクトリにあるクラスファイルを含めている。

これで、できあがったのが、othello.jar

中身を閲覧するには、

$ jar tvf othello.jar

jarファイルを実行する。

$ java -jar othello.jar

で実行できる。

参考


カテゴリ: Java
タグ: jarファイル 実行可能 jar
Count: 4