投稿者「admin」のアーカイブ

Pythonと各種ツールの連携

Pythonを活用するための
「ツールとライブラリに関するノート」
を公開しています.著作権は保持していますが「フリーソフト」としますので,自由にご使用ください.

—- 掲載しているサンプルプログラムやデータ —-

test11.txt myconf.jconf
snd01.wav snd02.wav
bn_gmp01.c bn_gmp02.c bn_mpfr01.c
MeCabEx.py kspeech.py

Pythonによるデータ処理のテキスト

学生に教えるためのテキストを作っています.
「Python3を用いたデータ処理の基礎」
無料で差し上げますので,意見や感想をくださいませ.
→ katsu_wm%mukogawa-u.ac.jp (’%’を’@’に変えるとメールアドレスになります)
→ コメントもできます(非公開)(名前,メールアドレス無しでも大丈夫です)
 
ご意見,ご助言をいただいた方は,テキストの謝辞の頁に謝意と共にお名前を掲載させていただきます.(ご希望なさらない方はその旨ご連絡ください)

「Python3を用いたデータ処理の基礎」(PDF形式,78ページ,2.02MB)

まだ試作段階で,どんどん改訂しています.

ここに公開しているテキストは「フリーソフトウェア」とします.(著作権は保持しています)
印刷,再配布共にしていただいて構いませんが,その際は内容の改変をせずにお願いします.
 
● テキスト中のサンプルデータ

dat_kokugo.csv dat_kokugo_noheader.csv dat_seiseki.csv
dat_seiseki_2.csv address_jp.csv dat_rand1M.csv
db01_gov_office.csv db01_geographic.csv genDB01.py

Java FX 8 の入門書

うちのゼミの活動を通してわかったことをまとめてマニュアルにしています.
 
まだ世間では Java は SE 7 が標準なのでしょうか.
Java SE 8 / Java FX 8 に関する情報がまだ世間に少なすぎて,仕方がないので本家ORACLEのサイトを見ながら,サンプルプログラム作って実験しながら自力で使い方を発掘しています.
 
まだまだ発展途上で,やり残し満載のマニュアルですが,どんどん加筆してゆきます.
 
PDFで約2.7MBです→javafx_main.pdf
 
まだクレームをいただけるような状態でもないですが,ご意見いただけたらありがたいです.
→ katsu_wm%mukogawa-u.ac.jp (%を@に変えてください)
 
【マニュアル中のサンプルプログラム】
FXsample01.java
FXsample02.java
FX3Dsample01.java
FX3Dsample03.java
 貼り付ける画像:texture.gif
FXMLsample01.fxml
FXMLsample01.java
FXMLappl001.java
FXMLDocumentController.java
FXMLDocument.fxml
FXChart01.java
FXChart02.java
FXChart03.java
FXChart04.java
FXimage01.java
FXimage02.java
 読み込む画像:Earth.jpg
AnimSample01.java
FX3Dsample04.java
 貼り付ける画像:physical-free-world-map-b1.jpg
DateTest01.java
DateTest02.java
DateTest06.java
DateTest07.java
FXsample05.java
LmbdSample01.java
SoundTest01.java
SoundTest02.java
SoundTest03.java
 サウンドサンプル:music001.wav(サイズに注意!:17MB)
 (提供元:フリーBGM素材 『霞む道を』 試聴ページ フリーBGM DOVA-SYNDROME
GUIdesign01のプロジェクト
FXsample04.java
 
—– 目次 —————————————————–
1 はじめに
2 GUI構築の基本
2.1 Applicationクラス
2.2 StageクラスとSceneクラス
2.3 ウィンドウサイズの変更を禁止する設定
2.4 GUIの可視属性の設定
2.5 複数のウィンドウを生成する方法
2.6 アプリケーションの終了に関する処理
2.6.1 アプリケーション終了時に呼び出されるメソッド
3 三次元グラフィックス
3.1 基礎事項
3.2 直方体,円柱,球
3.2.1 シーングラフの準備
3.2.2 Colorクラスによる色の指定
3.2.3 基本的な三次元オブジェクトの扱い
3.2.4 平行移動,回転,拡縮
3.2.5 光源
3.2.6 直投影型カメラ
3.2.7 透視投影型カメラ
3.3 メッシュ・グラフィックス
3.3.1 メッシュへのテクスチャの貼付け
4 FXMLを利用したGUI構築
4.1 サンプルプログラム
4.2 NetBeans IDEの利用
4.2.1 生成された雛形を利用したアプリケーション開発
4.2.2 単独で動作するアプリケーションの生成について
4.3 Java FX Scene Builder
4.3.1 インスペクタ
4.3.2 イベントハンドラとの関連付け
4.3.3 NetBeans IDEとの連携
5 図形の描画
5.1 Shapeを利用した描画
5.1.1 線の描画: Line / Polyline
5.1.2 線に属性を与えるメソッド
5.1.3 図形描画における「枠」と「塗り」
5.1.4 各種図形の描画: Rectangle / Circle / Ellipse / Arc / Polygon
5.1.5 塗りの属性
5.1.6 文字の描画: Text
5.1.6.1 システムで利用できるフォントを調べる方法
5.1.7 画像の表示: ImageView
5.1.8 Shapeオブジェクトの位置の設定: relocate
5.2 Canvasを利用した描画
5.2.1 GraphicsContext
5.2.2 各種の描画メソッド
5.3 チャートの描画
5.3.1 棒グラフ:BarChart
5.3.2 折れ線グラフ:LineChart
5.3.3 円グラフ:PieChart
5.4 画像データの扱い
5.4.1 画像データの入力: Imageクラス
5.4.2 画素(ピクセル)の操作
5.4.3 画像データの出力
5.4.4 サンプルプログラム
5.4.5 ノードの描画状態のキャプチャ
6 時間によるイベント処理(アニメーション)
6.1 タイミング・イベントについて
6.2 タイムラインとキーフレーム
6.3 サンプルプログラム
7 日付と時刻
7.1 旧来のAPI(Java SE 7)
7.1.1 日付と時刻のためのクラス
7.2 新しいAPI(Java SE 8)
7.2.1 基本的なクラス
7.2.2 日付・時刻に関する基本的な処理
7.2.3 和暦の扱い
8 ラムダ式
8.1 イベントハンドラ登録への応用
8.2 関数型インターフェースでの応用
9 サウンドの再生(Java SE 7)
9.1 基礎事項
9.2 実用的なサウンド再生
10 メディアデータの再生(Java FX 8)
10.1 動画再生に関すること
11 付録
11.1 Java FXで利用できるGUIの部品(代表的なもの)
11.1.1 コンテナ:Containers
11.1.1.1 HBox,VBoxを用いたGUIの配置
11.1.2 コントロール:Controlls
11.1.2.1 項目データを与える方法
11.1.3 値の変化を検知するイベント
11.2 メニューの構築
11.3 ファイル選択ダイアログの実装
11.4 Java FX 8 の重要なクラス
11.5 イベントについて
11.5.1 旧来のGUIで扱うイベント
11.5.2 タッチデバイスで扱うイベント
—————————————————————-

超入門:立体の表示,回転と平行移動,カメラ,光源の基本

超入門:立体の表示,回転と平行移動,カメラ,光源の基本
 

import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.stage.Stage;
import javafx.scene.shape.*;
import javafx.scene.transform.*;
import javafx.geometry.Point3D;

public class FX3Dsample01 extends Application {

	@Override
	public void start(Stage Stage) {
		//--- Top Node and Scene ---
		Group root = new Group();
		Scene scene = new Scene(root, 1024, 768, Color.rgb(0,0,0));

		// Axis for Rotation
		Point3D aX = new Point3D(100,0,0);
		Point3D aY = new Point3D(0,100,0);
		Point3D aZ = new Point3D(0,0,100);

		//--- Solid Model Generation ---
		// (Box)
		Box bx1 = new Box(300d,200d,150d);
		root.getChildren().add(bx1);
		PhongMaterial mt1 = new PhongMaterial(); // 別々に作る!
		mt1.setDiffuseColor(Color.rgb(255,0,0));
		bx1.setMaterial(mt1);
		bx1.getTransforms().addAll(
			new Translate(-300d,0d,0d), // 先に平行移動
			new Rotate(30,aX),
			new Rotate(30,aY),
			new Rotate(20,aZ)
		);
		// (Cylinder)
		Cylinder cl1 = new Cylinder(80d,300d);
		root.getChildren().add(cl1);
		PhongMaterial mt2 = new PhongMaterial(); // 別々に作る!
		mt2.setDiffuseColor(Color.rgb(0,255,0));
		cl1.setMaterial(mt2);
		cl1.getTransforms().addAll(
			new Rotate(30,aX),
			new Rotate(0,aY),
			new Rotate(-20,aZ)
		);
		// (Sphere)
		Sphere sp1 = new Sphere(140d);
		root.getChildren().add(sp1);
		PhongMaterial mt3 = new PhongMaterial(); // 別々に作る!
		mt3.setDiffuseColor(Color.rgb(0,0,255));
		sp1.setMaterial(mt3);
		sp1.getTransforms().addAll(
			new Translate(280d,0d,0d)
		);

		//--- Light Setting ---
		AmbientLight aLight = new AmbientLight(Color.rgb(127, 127, 127));
		root.getChildren().add(aLight);

		PointLight pLight = new PointLight(Color.rgb(255,255,255));
		pLight.setTranslateX(500d);
		pLight.setTranslateY(-300d);
		pLight.setTranslateZ(-200d);
		root.getChildren().add(pLight);

		//--- Camera Setting ---
		ParallelCamera cmr = new ParallelCamera();
		cmr.getTransforms().addAll(
			new Translate(-512d,-384d,0d)
		);
		scene.setCamera(cmr);

		//--- Window Activation ---
		Stage.setTitle("FX3Dsample01");
		Stage.setScene(scene);
		Stage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}
}

 
FX3Dsample01_exe

FXMLアプリケーション構築例(NetBeans IDE & Java FX Scene Builder)

マニュアルをまとめつつあります.)
 
 ここでは,NetBeansIDEとJava FX Scene Builerを用いた画像ビューワのアプリ構築の例を紹介します.
 
1. 新規プロジェクトの作成(FXMLappl01)
FXMLappl01
 
「Java FX FXMLアプリケーション」を選択します.
FXMLappl02
 
「プロジェクト名」と「FXML名」を設定します.
FXMLappl03
 
空のFXMLを追加します.
FXMLappl04
 
FXMLファイルの名前を指定します.
FXMLappl05
 
ここでは既存のFXMLコントローラを使うことにします.
FXMLappl06
 
FXMLのコード:FXML1.fxml









  

 
FXMLのコード:FXML2.fxml










  

 
ファイル:FXMLappl01.java

package fxmlappl01;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class FXMLappl01 extends Application {
    
    public static Stage stage2;
    
    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("FXML1.fxml"));
        
        Scene scene = new Scene(root);

        stage.setTitle("Main Window");
        stage.setScene(scene);
        stage.show();
        
        
        /* Another Window */
        stage2 = new Stage();
        stage2.initOwner(stage);
        
        Parent root2 = FXMLLoader.load(getClass().getResource("FXML2.fxml"));
        
        Scene scene2 = new Scene(root2);
        
        stage2.setTitle("Picture Window");
        stage2.setScene(scene2);
        stage2.show();
        
        /* image from "http://www.ashinari.com/" */
        Share.img1 = new Image(getClass().getResourceAsStream("1.jpg"));
        Share.img2 = new Image(getClass().getResourceAsStream("2.jpg"));
    }

    public static void main(String[] args) {
        launch(args);
    }
    
}

 
ファイル:Share.java

package fxmlappl01;

import javafx.scene.image.*;

public class Share {
    public static Image img1, img2;
}

 
ファイル:FXML1Controller.java

package fxmlappl01;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.image.*;

public class FXML1Controller implements Initializable {
    
    @FXML
    private Button btn1, btn21, bnt22, btn23;
    @FXML
    private ImageView iv1;
    
    @FXML
    private void handleButton_btn1(ActionEvent ev) {
        System.out.println("Open Another Window!");
        FXMLappl01.stage2.show();
    }
    
    @FXML
    private void handleButton_btn21(ActionEvent ev) {
        iv1.setImage(Share.img1);
    }
    
    @FXML
    private void handleButton_btn22(ActionEvent ev) {
        iv1.setImage(Share.img2);
    }
    
    @FXML
    private void handleButton_btn23(ActionEvent ev) {
        iv1.setImage(null);
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
    
}

 
このアプリを実行したところ:
FXMLappl01_exe
 
プロジェクト全体(Zip圧縮):FXMLappl01.zip

まず最初に(C/C++ 超入門)

C言語では「関数」を定義することでプログラミングします.
すなわち,関数 f(x,y,z) を評価すると,その定義として記述されたプログラムを実行します.

もう少しわかりやすく説明します.

tasu(x,y) := x + y

として関数 tasu を定義しますと,

a = tasu(1,2)

を計算(評価)することで変数 a に 3 が格納されます.
これをC言語で記述すると

int tasu(x,y)
int x,y;
{
	return(x+y);
}

となります.

C言語ではメインのプログラム本体も1つの関数 main として記述します.
例えば

int main()
{
	int a,b,c;

	a = 1;
	b = 2;
	c = a + b;
}

と記述して,これをコンパイルして実行すると,変数 c に 3 が格納されます.

先に定義した関数 tasu を main から呼び出すこともでき,

int main()
{
	int a,b,c;

	a = 1;
	b = 2;
	c = tasu(a,b);
}

と書くと a+b の結果が c に格納されます.

【ポインタと値】

C言語の初心者がまずはじめに悩むのが「ポインタ」です.
コンピュータ上のデータは変数などの記憶に格納されます.
ということは当然ですが,そのデータを格納している記憶域の「場所」があります.
また,コンピュータの記憶は1バイトづつ一直線に並んだ構造をしているので,
記憶の場所は「先頭から〜番目」という形で表現されます.

このように,記憶の「〜番目」を意味するものが「ポインタ」だと理解するとわかりやすいです.
言い換えると「記憶域のアドレス」の値がポインタであると言うこともできます.

変数のポインタ(アドレス)の値を得るには ‘&’ を使います.
すなわち,変数 a の格納場所の番地を求めるには &a とします.

例.記憶域の中での変数の場所(アドレス)を調べる
次のようなプログラムを作って実行してみましょう.

#include	

int main()
{
	int	a = 3;

	printf("a = %d, address = %u\n",a,&a);
}

これを実行すると次のような表示になります.

a = 3, address = 1352710956

これはどういう意味かというと,
「変数 a には値 3 が入っており,それを格納している記憶域の番地(アドレス)は 1352710956 である」
ということです.

「ポインタ」はどんな場合に使うのか?
一言で「ポインタは〜に使う」とは言えないですが,よくある使用例を紹介します.
プログラムで扱うデータは,変数として扱うだけでは不便な場合があります.
例えば「データレコード」のような概念がありますが,それは複数の変数たちをまとめて1つの意味ある情報として扱う考え方です.C言語では「構造体」,C++では「クラス」というものがありますが,それらは「データレコード」を実現するものと考えることができます.

現実的なプログラミングでは,1つのアプリケーションをつくるために,幾つものサブルーチン(C/C++では関数)に分割して開発するのが普通です.分割された関数にデータレコードを引き渡す際にこのポインタが便利です.
どういうことかというと,関数にデータを渡す際に「データは記憶のこの番地においてある」という情報を相手関数に知らせるだけでよいということになり,データレコードの中身の全てを取り出して関数に送りつける必要がなくなるわけです.(わかります?)

ポインタの活用方法については,実際にプログラミングをしながら身につけて行きましょう.

【構造体】

C言語でデータレコードを実現するものとして構造体があります.
例えば次のようなプログラムを見てみましょう.

#include	
#include	

typedef	struct {
	char	name[32];
	int	age;
	int	gender;	// 1:male, 2:female
	char	tel[24];
} PersonalInfo;

int main()
{
	PersonalInfo	db[100];

	strcpy( db[0].name, "Sato Taro" );
	db[0].age    = 29;
	db[0].gender = 1;
	strcpy( db[0].tel,  "123-4567" );

	printf("size of PersonalInfo:%lu, size of db:%lu bytes\n",
		sizeof(PersonalInfo),sizeof(db));
}

このプログラムは個人情報を保持する簡単なデータベースを実現するものです.
氏名(name),年齢(age),性別(gender),電話番号(tel)を1つのまとまりとする構造体を記述し,それを PersonalInfo という型として定義しています.
main の中では PersonalInfo 型のレコードの配列 db を定義しています.また,PersonalInfo と db のデータサイズを出力しています.
実行例

size of PersonalInfo:64, size of db:6400 bytes

このように,構造体を用いると複数の変数からなるデータのまとまりを1つのレコードとして扱うことができます.

構造体の要素(メンバ)へのアクセス
上のプログラム例のように,ドット ‘.’ を使って構造体の要素(メンバ)にアクセスすることができます.

■■■ C++ ■■■

さて C++ ですが,基本的には C 言語の文法がベースになります.
なので「Cは勉強せずに,C++だけ学ぶ」というのはできません.(念のため)

ファイルの所有者・グループの設定

UNIXにおいてファイルの所有者や所属グループを変更するには chown 関数を呼び出します.
 
使い方: chown(ファイルのパス, ユーザID, グループID)
 
例えば,対象ファイルのパス名を格納する記憶へのポインタを char *p, ユーザIDが uid_t u に,グループIDが gid_t g に格納されているとき chown( p, u, g ) として実行します.
 
処理が正常に終了した場合,戻り値は0となります.
 
サンプルプログラム ファイル a の所有者・グループを設定する

#include	
#include	
#include	

int main()
{
	char	p[] = "a";
//	uid_t	uid = 501;
	uid_t	uid = 503;
	gid_t	gid = 20;

	if ( chown(p,uid,gid) != 0 ) {
		fprintf(stderr,"chown failed.\n");
	}
}

シンボリックリンクの作成と削除

 「シンボリックリンク」はUNIX独特のものです.
 
大抵のOSでは,ファイルの別名を意味するアイコンを作ることができます.
Microsoft Windowsでは「ショートカット」,
Apple OS Xでは「エイリアス」というものを作って,
ファイル本体とは別のものとして別名のアイコンを作ることがあります.
 
UNIX独自のファイルの別名として「シンボリックリンク」を理解してください.
 
シンボリックリンクを作成するための関数に symlink というものがあります.
使い方は簡単です.
 
元のファイルのパス名を文字列として格納した記憶へのポインタを char *p1,
リンク(別名)のパス名を文字列として格納した記憶へのポインタを char *p2,
として symlink(p1,p2) として関数を呼び出すことでシンボリックリンクが作成されます.
正常に実行が終了した場合の戻り値は 0 です.
 
サンプルプログラム1: ファイル s_symlink.c のリンク(別名)を s_symlink_l として作成する

#include	
#include	

int main()
{
	int	r;
	char	p1[] = "s_symlink.c", p2[] = "s_symlink_l", lnk[256];

	r = symlink(p1,p2);
	if ( r == 0 ) {
		r = readlink(p2,lnk,256);
		fprintf(stderr,"symlnk success!: %s -> %s\n",p2,lnk);
	
	} else {
		fprintf(stderr,"symlnk failure.\n");
	}
}

 
サンプルプログラム2: リンク s_symlink_l を解除する

#include	
#include	

int main()
{
	int	r;
	char	p[] = "s_symlink_l";

	r = unlink(p);
	if ( r != 0 ) {
		fprintf(stderr,"unlnk failure: %d\n",r);
	}
}

ディレクトリの作成/削除/移動

【ディレクトリの作成】
 ディレクトリを作成するための関数 mkdir の使い方について説明します.
 
使い方: mkdir( 作成するディレクトリのパス名 , アクセス権 )
 
ディレクトリを作成する際には,誰に対して読み書き・実行を許可するかという「アクセス権」を設定します.
 
アクセス権は
 1) ユーザに対する読み書き・実行
 2) グループに対する読み書き・実行
 3) 他人に対する読み書き・実行
の3種類を設定します.
 
アクセス権を意味する記号(定義)は下記の通りで,それらを論理和として組み合わせ,整数型の値にして mkdir の引数にします.

S_IRWXU	00700	ファイル所有者のアクセス許可用のビットマスク
S_IRUSR	00400	所有者の読み込み許可
S_IWUSR	00200	所有者の書き込み許可
S_IXUSR	00100	所有者の実行許可

S_IRWXG	00070	グループのアクセス許可用のビットマスク
S_IRGRP	00040	グループの読み込み許可
S_IWGRP	00020	グループの書き込み許可
S_IXGRP	00010	グループの実行許可

S_IRWXO	00007	他人 (others) のアクセス許可用のビットマスク
S_IROTH	00004	他人の読み込み許可
S_IWOTH	00002	他人の書き込み許可
S_IXOTH	00001	他人の実行許可

 
サンプルプログラム: アクセス権を設定してディレクトリ s_mkdir_d をつくる

#include	
#include	

int main()
{
	const char	dname[] = "s_mkdir_d";
	int		r;
	mode_t		mode;

	/*--- mode ---- read -- write - execute --------*
	 |   user	  1	  1	  1		|
	 |   group	  1	  0	  1		|
	 |   other	  1	  0	  1		|
	 *----------------------------------------------*/
	mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;

	r = mkdir(dname,mode);
	printf("result: %d\n",r);
}

 
【ディレクトリの削除】
 ディレクトリを削除するための関数 rmdir の使い方について説明します.
 
使い方: rmdir( 削除するディレクトリのパス名 )
 
サンプルプログラム ディレクトリ s_mkdir_d を削除する

#include	
#include	

int main()
{
	const char	dname[] = "s_mkdir_d";
	int		r;

	r = rmdir(dname);
	printf("result: %d\n",r);
}

 
【ディレクトリの移動】
 ディレクトリを移動(カレントディレクトリを変更)するための関数 cd の使い方について説明します.
 
使い方: chdir( ディレクトリのパス名 )
 これを実行することで,カレントディレクトリを「ディレクトリのパス名」にすることができます.
 
サンプルプログラム ディレクトリ s_mkdir_d2 を作成した後そこに移動し,更に同じ名前のディレクトリ s_mkdir_d2 を作成する

#include	
#include	
#include	

int main()
{
	const char	dname[] = "s_mkdir_d2";
	int		r;
	mode_t		mode;

	/*--- mode ---- read -- write - execute --------*
	 |   user	  1	  1	  1		|
	 |   group	  1	  0	  1		|
	 |   other	  1	  0	  1		|
	 *----------------------------------------------*/
	mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;

	r = mkdir(dname,mode);
	printf("result: %d\n",r);

	if ( r == 0 ) {
		r = chdir(dname);
		if ( r == 0 ) {
			r = mkdir(dname,mode);
			printf("result: %d\n",r);
		} else {
			fprintf(stderr,"chdir failure: %s\n",dname);
		}
	} else {
		fprintf(stderr,"mkdir failure(1): %s[%d]\n",dname,r);
	}
}