[Java] 63 ネストしたArrayList→2次元配列→CSVファイル

ネストしたArrayListを2次元配列に変換し、CSVファイルにしました。確認のための出力はそのままにしています。

またしても文字列をドットにて分割するところでワナにかかりました。まだ2週間しかたっていないのに情けない。

こういったコードを書くとPythonのありがたさが身に染みます。文字列やリストを簡単に扱える自製ライブラリを作りたくなります。最初のfor文は結構手こずりました。appendを使えると大分違うのですが。出力時にtoStringメソッドを使うのも面倒です。

try文のcatchの直前に波カッコを書くことに違和感があるため、今のところ行が増えるのも構わず分けて書いています。審美的に難ありと思ったのですが、少数派でしょうね。

String[][] raceListConSorts_arrays = new String[raceListConSorts.size()][];
int i = 0;
for (ArrayList<String> ele:raceListConSorts) {
    String print_list = String.format("raceListConSorts リスト%d個目 ",i);
    System.out.println(print_list + ele);

    String[] array = ele.toArray(new String[ele.size()]);
    System.out.println("array " + Arrays.toString(array));

    raceListConSorts_arrays[i] = array;
    i = i + 1;
}

for (String[] ele:raceListConSorts_arrays) {
   	System.out.println("arrays作成後array確認 " + Arrays.toString(ele));
}

// 作成した2次元配列をCSV仕様に変換
List<String> list = Arrays.stream(raceListConSorts_arrays)
    .map(line -> String.join(",",line))
    .collect(Collectors.toList());

// HTMLファイル名からCSVファイル名を作成
String[] filename_split = filename.split(Pattern.quote("."));
System.out.println("filename_split " + filename_split);

String csvname = filename_split[0] + ".csv";
System.out.println("csvname " + csvname);

// CSVファイルを作成
try {
    Files.write(Paths.get(csvname), list, StandardOpenOption.CREATE);
}
catch (IOException e) {
    e.printStackTrace();
}

[Java] 62 Swing 05 switch文のbreak,文字列から数字抽出

Pythonにはなぜかswitch文がありません。

開発中のアプリでボタンのコマンドに付番してswitch文で条件分岐しようとしたら、ちょいハマりしました。

各caseに定数で分岐するのにも少し戸惑いましたが、最後にbreakを入れないと次のcaseも読み込んでしまうというのを知りませんでした。

そして以下のエラー発生。
“Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: “”

For input string: “”を見て他のJTextFieldへの読み込みを一瞬疑ったものの、それは後回し。System.out.printlnを随所に入れてチェックしまくりました。

まさかと思いながら、次のcaseの先頭にもSystem.out.printlnを挿入して実行するとあっけなく出力されてようやく原因判明。初心者あるあるでしょうか。

まあこのトラブル対応に伴い様々な小技を覚えたので良しとします。

public void actionPerformed(ActionEvent e) {
    // 文字列(Button1)から数字(1)を抽出してデータ型を整数に変換(今回覚えた小技の一つ)
		String cmd = e.getActionCommand();

		String cmd_i = cmd.replaceAll("[^\\d]", "");
		Integer cmd_i2 = Integer.parseInt(cmd_i);

		switch(cmd_i2) {
			case 1:
      <中略>
      break;

[Java] 61 Swing 04 メソッドの追加 mySQL検索

50日ぶりにGUIフレームワークのSwingをいじりました。第1言語のPythonはともかく第2言語のJavaはしばらく書かないと文法を思い出すのに少々時間がかかります。

アプリの機能拡充が手付かずになっていたので、もっとこまめに手を入れるようにしたいです。

Javaの習いはじめは記述がくどくどしくてあまり好きではなかったのですが、慣れてくると独特の心地よさがあります。

情報へのアクセス性が高く、多機能性に優れ、Pythonと文法が比較的似ていて、Pythonがこうだからこうなるのでは?といった類推が大体当たります。Pythonとの連携が弱いのが数少ない欠点の一つでしょうか。JythonのPython3版開発に期待です。

// profメソッド
	public static ArrayList<String> profSearch(String ID) {
		System.out.println("profメソッド内出力 " + ID);

		String birthyear = ID.substring(0,4);
		ArrayList<String> profList = new ArrayList<String>();
		try {
        	Connection conn = DriverManager.getConnection(url, user, password);
            String sql = String.format("SELECT horseID,検索馬名,馬名,稼働,性別,毛色,生年月日,調教師,馬主,募集情報,生産者,産地,セリ取引価格,近親馬 FROM horse_list.horse%S WHERE horseID = '%S'",birthyear,ID);
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();

            String horseID = null;
            String 検索馬名 = null;
            String 馬名 = null;
            String 稼働 = null;
            String 性別 = null;
            String 毛色 = null;
            String 生年月日 = null;
            String 調教師 = null;
            String 馬主 = null;
            String 募集情報 = null;
            String 生産者 = null;
            String 産地 = null;
            String セリ取引価格 = null;
            String 近親馬 = null;

            while (rs.next()) {
                horseID = rs.getString("horseID");
                検索馬名 = rs.getString("検索馬名");
                馬名 = rs.getString("馬名");
                稼働 = rs.getString("稼働");
                性別 = rs.getString("性別");
                毛色 = rs.getString("毛色");
                生年月日 = rs.getString("生年月日");
                調教師 = rs.getString("調教師");
                馬主 = rs.getString("馬主");
                募集情報 = rs.getString("募集情報");
                生産者 = rs.getString("生産者");
                産地 = rs.getString("産地");
                セリ取引価格 = rs.getString("セリ取引価格");
                近親馬 = rs.getString("近親馬");

                profList.add("horseID " + horseID);
                profList.add("検索馬名 " + 検索馬名);
                profList.add("馬名 " + 馬名 );
                profList.add("稼働 " + 稼働);
                profList.add("性別 " + 性別);
                profList.add("毛色 " + 毛色);
                profList.add("生年月日 " + 生年月日);
                profList.add("調教師 " + 調教師);
                profList.add("馬主 " + 馬主);
                profList.add("募集情報 " + 募集情報);
                profList.add("生産者 " + 生産者);
                profList.add("産地 " + 産地);
                profList.add("セリ取引価格 " + セリ取引価格);
                profList.add("近親馬 " + 近親馬);
            }
        }
        catch (Exception e) {
                e.printStackTrace();
        }
		return profList;
	}

[JavaScript] 06 ElectronによるGUIアプリ作成 その4 windowを閉じてアプリ終了

[macOS Catalina 10.15.7]

Electronの教本を購入してそれなりに本腰を入れて取り組むことにしました。さくっと概要をつかむだけのつもりがそうもいかなかったので。

OpenJS FoundationのElectronサイトを見て、かなりのポテンシャルの高さを感じました。その恩恵を享受するにはある程度の専門知識が必要だと悟りました。私のような初心者が片手間で扱おうなんて土台無理な話です。サイトの内容が実装できるのであれば、多少のコストは惜しみません。

とりあえずElectronで立ち上げたウィンドウを閉じると同時にアプリも終わらせるようにしました。私自身根っこがWindowsなのでmacOSのDockで待機というのがどうも好きになれません。

教本に同様の内容が掲載されていましたが、いきなりコードが間違っていました。そのコードではWindowsやLinuxでしか終われないです。本の構成はしっかりしてそうなのに大丈夫なのだろうか。

ゆくゆくはElectronで競馬データベースアプリを作り、JavaのSwingベースの自製アプリと処理速度や機能を競わせてみたいです。Javaと比べてSQLコマンド作成速度等がどんな感じなのか興味津々です。

正直GUIアプリ開発において動的型付け言語にはさほど期待していなかったのですが、JavaScriptという意外な伏兵の出現でモチベーションが上がってきています。処理速度的に問題があってもTypeScriptという選択肢もあり、いずれにせよ有意義な検討になりそうです。

app.on('window-all-closed', () => {
    console.log('app.window-all-closed');
    app.quit();
  }
);

[JavaScript] 05 ElectronによるGUIアプリ作成 その3 positionプロパティ

前回コンテナの位置を上げられなかった件に関しては、positionプロパティでtopの相対位置をマイナスに設定して解決しました。

次にボタン押下時のアクション設定なんですが、調べてみると色々ややこしくて今度こそ撤退になりそうです。

やろうとしていることに対して、覚えるべきスキル・コード記述量・ファイル数が多いという印象です。労力的時間的コスパが良くないですし、動的型付け言語としてのメリットが感じられないのは残念です。

JavaScriptによるデスクトップアプリGUI作成は思っていたよりハードルが高かったです。もし同様に困っている方々がいらっしゃったら、PythonのtkinterやJavaのSwing、JavaFXを自信を持ってお勧めします。

1日粘ったものの、結局JavaScriptアレルギーが悪化しただけのような気がします。浅いながらも様々なプログラミング言語を学びポジティブな刺激を受けてきましたが、今回に限っては何とも形容し難い不思議な心境です。

.container {
    display: grid;
    grid-template-columns: 224px 60px;
    position: relative;
    top: -10px;
}

[JavaScript] 04 ElectronによるGUIアプリ作成 その2

一旦撤退を決意しましたが以前もWordPressのCSSに悩まされたことを思い出し、ある程度のレベルに達するまでもうひと頑張りすることにしました。

GUIのレイアウトをそれなりに整えました。WordPressの時もそうでしたがMac版Chromeで発生する謎の上部空白(≠margin)については、リセットCSS(destyle.css)を使っても解決しませんでした。

次はボタン押下によるイベントについてコードを記述していきます。

<html>
<head>
 <meta charset="UTF-8">
 <title>CHARACTER CODE CONVERTOR</title>
 <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <div class="container2">
            <text id="lbl1">Path</text>
            <input id="txt1" type="TEXT"></input>
        </div>
        <button id="btn1" >判定</button>

        <div class="container3">
            <text id="lbl2">文字コード</text>
            <input id="txt2" type="TEXT"></input>
        </div>
        <button id="btn2" >変換</button>
    </div>
</body>
</html>
body {
    background-color: #91d8e8;
    margin:0px 8px 8px 8px;
}
.container {
    display: grid;
    grid-template-rows: 1fr 1fr;
    grid-template-columns: 224px 60px;
    vertical-align:top;
}
.container2 {
    display: inline;
    margin:4px 2px 2px 2px;
}
.container3 {
    display: inline;
    margin:4px 2px 2px 2px;
}
#lbl1 {
    grid-row:1;
    grid-column:1;
}
#txt1 {
    grid-row:1;
    grid-column: 1;
    width:170px;
    margin:0px 0px 0px 2px;
}
#btn1 {
    grid-row:1;
    grid-column:2;
    margin:4px 4px 4px 4px;
}
#lbl2 {
    grid-row:2;
    grid-column:1;
}
#txt2 {
    grid-row:2;
    grid-column:1;
    width:80px;
    margin:0px 0px 0px 2px;
}
#btn2 {
    grid-row:2;
    grid-column:2;
    margin:4px 4px 4px 4px;
}

[JavaScript] 03 ElectronによるGUIアプリ作成 その1

ElectronによるGUIアプリ作成に取り掛かりましたが、やはりJavaFXで要素を自在にドラッグする快適さが忘れられず、とりあえず下記コードまでにしてJRuby+JavaFXでの開発環境構築に移行します。

style.cssファイルにてグリッド設定を書いていて、あまりの面倒さに頭が拒否反応を示しました。paddingを書く気力が早々になくなりました。おそらくHTMLやCSSの文法が私には合わないのでしょう。Sassのようにfor文を使えたらまだいいんですが。

これなら多少不満があってもPythonのtkinterで書きます。せっかくJavaScriptとお近づきになれたのに残念です。

どうやら日々のプログラミング生活でロジカル思考が染み付いてしまい、ルールに縛られた上での思考が苦手になっているのでしょう。なので異なるプログラミング言語間の行き来は比較的容易でも、論理よりもルールが優先のスタイルシート言語等ではストレスが溜まるようです。

次にJavaScriptのコードを書くのはいつになることでしょう。

const {app, BrowserWindow} = require('electron');

// メインウィンドウ
let mainWindow;

function createWindow() {
  // メインウィンドウ作成
  mainWindow = new BrowserWindow({
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: false
    },
    width: 300, height: 150,
  });

  // メインウィンドウに表示するhtmlファイル指定
  mainWindow.loadFile('index.html');

  // メインウィンドウが閉じられたときの処理
  mainWindow.on('closed', () => {
    mainWindow = null;
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', () => {
    app.quit();
});

app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});
<html>
<head>
 <meta charset="UTF-8">
 <title>CHARACTER CODE CONVERTOR</title>
 <link rel="stylesheet" href="style.css">
</head>

<body>
    <div id="container">

    <text id="lbl1">Path</text>
    <input id="txt1" type="TEXT"></input>
    <button id="btn1" >判定</button>

    <text id="lbl2">コード</text>
    <input id="txt2" type="TEXT"></input>
    <button id="btn2" >変換</button>

    </div>
</body>
</html>
body {
    background-color: #91d8e8;
}
#container {
    display: grid;
    grid-template-rows: 50px 50px;
    grid-template-columns: 50px 50px 50px 50px;
    position:relative;
    top: 10px;
}
#lbl1 {
    grid-row:1;
    grid-column:1;
}
#txt1 {
    grid-row:1;
    grid-column: 2 / 4;
}
#btn1 {
    grid-row:1;
    grid-column:4;
}

#lbl2 {
    grid-row:2;
    grid-column:1;
}

#txt2 {
    grid-row:2;
    grid-column:2;
}

#btn2 {
    grid-row:2;
    grid-column:4;
}

[JavaScript] 02 JavaFX イベントハンドラの作成

FXMLファイルにおいて、イベントハンドラによるボタン押下時の動作内容等の設定はJavaScriptやJythonなどJSR 223にあるスクリプト言語でできるようです。

とりあえずJavaScriptで簡単なイベントを書いてみました。さてJythonの場合はどうすればいいのでしょう。

<?xml version="1.0" encoding="UTF-8"?>

<?language javascript?>
<?import javafx.scene.effect.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="125.0" prefWidth="300.0" style="-fx-background-color: khaki;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
	<fx:script>
		function onButton1Action(){
			text1.setText("JavaScriptテスト");
		}
	</fx:script>
	<children>
     	<Label layoutX="14.0" layoutY="15.0" prefHeight="44.0" prefWidth="69.0" text="Path" />
     	<Label layoutX="14.0" layoutY="64.0" prefHeight="44.0" prefWidth="69.0" text="文字コード" />

     	<TextField fx:id="text1" layoutX="49.0" layoutY="24.0" prefHeight="27.0" prefWidth="175.0" />
     	<TextField fx:id="text2" layoutX="90.0" layoutY="73.0" prefHeight="27.0" prefWidth="135.0" />

		<Button fx:id="button1" layoutX="240.0" layoutY="24.0" mnemonicParsing="false" onAction="onButton1Action(event);" text="判定" />
     	<Button fx:id="button2" layoutX="237.0" layoutY="69.0" mnemonicParsing="false" prefHeight="35.0" prefWidth="51.0" text="変換" />
	</children>
</AnchorPane>

[Python] 296 Jython 03 FXMLファイルの読み込み

軽い気持ちで取りかかったら見事にハマりました。

なかなか解決しなかったのは、launchメソッドの2番目の引数とFXMLファイルのパスの書き方です。

いわゆるヌルポ(NullPointerException)から脱するため、Thread.currentThread().getStackTrace()を走らせたり色々調べても解決の糸口を見出せず。

結局、引数はsys.argv、パスはプロジェクトディレクトリ直下の絶対パスでした。JavaではMainファイルからの相対パスになります(スラッシュなしのファイル名のみ)。スラッシュの有り無しは全く意識してませんでした。

EclipseからPyCharmに検討環境を移す寸前でStackOverFlowの英語版にヒントを見つけました。またしても海外のギークに助けられました。

GUI内のカタカナなど2バイト文字が明らかに中華系フォントなので、別途フォント指定が必要ですね。

from javafx.application import Application
from javafx.fxml import FXMLLoader
from javafx.scene import Scene
import sys

class JythonJavafx(Application):
    def start(self, stage):
        root = FXMLLoader.load(self.getClass().getResource('/test.fxml'))
        stage.setScene(Scene(root, 300, 125))
        stage.setTitle("CHARACTER CODE CONVERTOR")
        stage.show()

if __name__ == "__main__":
    Application.launch(JythonJavafx().__class__, sys.argv)
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="125.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
    <center>
        <Label text="FXML ロード成功" BorderPane.alignment="CENTER" />
    </center>
</BorderPane>

[Python] 295 Jython 02 JavaFXプロジェクトの移植

JavaFXプロジェクトのJythonへの移植を試みています。

ガワは再現できたので次はFXMLの導入です。

Application.launchの引数でエラーになっていましたが、オブジェクトのクラス__class__で解決しました。

おそらくexe化はできないため、私にとってこのスキルの必要性は高くないです。気が向いた時にのんびり進めていきます。

from javafx.application import Application
from javafx.scene import Scene
from javafx.scene.layout import AnchorPane;

class Main(Application):
    def start(self, stage):
        root = AnchorPane()
        stage.setScene(Scene(root, 300, 125))
        stage.setTitle("CHARACTER CODE CONVERTOR")
        stage.show()

if __name__ == "__main__":
    Application.launch(Main().__class__, [])