Pythonを活用するための
「ツールとライブラリに関するノート」
を公開しています.著作権は保持していますが「フリーソフト」としますので,自由にご使用ください.
—- 掲載しているサンプルプログラムやデータ —-
| test11.txt | myconf.jconf | |
| snd01.wav | snd02.wav | |
| bn_gmp01.c | bn_gmp02.c | bn_mpfr01.c |
| MeCabEx.py | kspeech.py |
Pythonを活用するための
「ツールとライブラリに関するノート」
を公開しています.著作権は保持していますが「フリーソフト」としますので,自由にご使用ください.
—- 掲載しているサンプルプログラムやデータ —-
| test11.txt | myconf.jconf | |
| snd01.wav | snd02.wav | |
| bn_gmp01.c | bn_gmp02.c | bn_mpfr01.c |
| MeCabEx.py | kspeech.py |
学生に教えるためのテキストを作っています.
「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 は 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);
}
}
マニュアルをまとめつつあります.
■ 超入門: 立体の表示,回転と平行移動,カメラ,光源の基本
(マニュアルをまとめつつあります.)
ここでは,NetBeansIDEとJava FX Scene Builerを用いた画像ビューワのアプリ構築の例を紹介します.
1. 新規プロジェクトの作成(FXMLappl01)

「Java FX FXMLアプリケーション」を選択します.

「プロジェクト名」と「FXML名」を設定します.

空のFXMLを追加します.

FXMLファイルの名前を指定します.

ここでは既存のFXMLコントローラを使うことにします.

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
}
}
このアプリを実行したところ:

プロジェクト全体(Zip圧縮):FXMLappl01.zip
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++だけ学ぶ」というのはできません.(念のため)
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);
}
}