javafxのhide()で実行終了してしまう時のメモ

ドキュメントを見る限りhide()はウィンドウを非表示にするだけのメソッドなのにプログラムが終了してしまうので調べたら下のページが出てきた
stackoverflow.com
どうやらhide()はclose()と等価の動きをするらしい 今回の問題を解決するにはPlatform.setImplicitExit()にfalseを渡す
しかし、この方法だとexit()も終了しなくなるので適宜setImplicitExit()を呼び出す必要があるっぽい

javafxpackagerがよく分からんエラーを吐いた時のメモ

javaFXプログラムの実行可能jarファイルを生成するjavapackagerを実行したら

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
com/sun/javafx/tools/packager/Main : Unsupported major.minor version 52.0

というエラーを出したので調べたらJAVA_HOMEを設定していなかったことが原因だった
JAVA_HOMEはjavacのパスと違ってbinの一つ上を設定する

Graphillionのインストールメモ

Home · takemaru/graphillion Wiki · GitHubに書いてある通りにインストールしようとすると

src/pygraphillion.cc:25:20: fatal error: Python.h: そのようなファイルやディレクトリはありません
 #include <Python.h>

みたいな事を言われる
ググる
pipでインストール中にエラー「Python.h: そのようなファイルやディレクトリはありません」 - 座敷牢日誌
との事
開発用のツールらしいのでインストールしてなかったようだ
その他のパッケージは正常にインストールできた

node.jsのインストールと設定メモ

node.jsのインストール

node.jsはバージョンによって動作が異なる場合があるので、複数のバージョンを管理できるnvmをインストールする

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash

インストールしたらシェルを再起動してNode.jsをインストールする

$ nvm install v0.12.4
$ nvm alias default v0.12.4

今回は0.12.4をインストールした

nvmを使ってNode.jsをインストールした場合、sudoコマンド利用時に特定のコマンドが使えないらしいので、

$ sudo visudo

でvisudoコマンドを実行し、設定を変更する

Defaults !env_reset
Defaults env_keep += "HOME"  //無いなら作る
#Defaults secure_path = hogehogehoge  //serure_pathをコメントアウト

CでSQLiteを操作する

防備録として


まずはincludeするヘッダファイルの宣言とcallbackのプロトタイプ

#include <stdio.h>
#include <sqlite3.h>

int callback(void *,int,char **,char **);

callbackはSQLiteのコマンドの実行後に呼び出される関数 詳細は後で書く

次にメイン

int main(int argc,char *argv[]){
	sqlite3 *db;
	char *err_msg = NULL;
	int check;
	int counter = 0;

	if(argc < 3){
		fprintf(stderr,"Usage: %s database_name command\n",argv[0]);
		return 1;
	}

	check = sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READWRITE,NULL);

	if(check != SQLITE_OK){
		fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;
	}

	check = sqlite3_exec(db,argv[2],callback,&counter,&err_msg);

	if (check != SQLITE_OK){
		fprintf(stderr,"SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		ret
urn 1;
	}

	printf("%d callback(s) .\n",counter);

	sqlite3_close(db);
	return 0;
}

チェック

これらは見ての通り引数の数とか関数の戻り地をチェックしている

if(argc < 3){
		fprintf(stderr,"Usage: %s database_name command\n",argv[0]);
		return 1;
	}
if(rc != SQLITE_OK){
		fprintf(stderr,"Can't open database: %s\n", sqlite3_errmsg(db));
		sqlite3_close(db);
		return 1;
	}

if (rc != SQLITE_OK){
		fprintf(stderr,"SQL error: %s\n", err_msg);
		sqlite3_free(err_msg);
		sqlite3_close(db);
		return 1;
	}

SQLiteを操作する

肝心のSQLiteを操作しているのは「sqlite3_open_v2」「sqlite3_exec」「sqlite3_free」「sqlite3_errmsg」「sqlite3_close」の5つ
まずは「sqlite3_open_v2」から

check = sqlite3_open_v2(argv[1], &db, SQLITE_OPEN_READWRITE,NULL);

3つ目の引数はオープンするデータベースの権限を設定している
4つ目の引数はネームスペースに関する関する情報が入るらしいがネームスペースとはなんぞや
これはsqlite3_openでもオープンできる というかこっちの方が一般的っぽい

int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);

次は「sqlite3_exec」

check = sqlite3_exec(db,argv[2],callback,&counter,&err_msg);

これはsqliteコマンドを実行する関数 引数の二番目には実行するコマンド、というかSQL文(文字列)へのポインタを指定
3番目の引数にはcallbackへのポインタ 4番目にはユーザーが好きに指定していい これはcallback関数で使ったりする

「sqlite3_errmsg」はその時点での最後のエラーメッセージを返す

fprintf(stderr,"%s",sqlite3_errmsg(db));

「sqlite3_free」は

エラーメッセージのメモリ領域は sqlite3_malloc関数で確保されたものであるから、 メモリリークを避けるために、用済みになったらsqlite3_free関数で解放する。

との事 

最後の「slite3_close」はオープンしたデータベースをクローズする

sqliteを操作するためにはこれらの関数を使うだけではなく、callback関数を用意する必要がある
callback関数はSQLコマンドを実行した後に呼び出される関数でsqlite3_execの三番目の引数に指定した関数はこれである

int callback(void *user_data,int argc,char **argv,char **field){
	int i;
	int *counter = (int*)user_data;

	for(i = 0;i < argc;i++){
		printf("%s = %s\n",field[i],argv[i] ? argv[i] : "NULL");
	}
	printf("\n");

	(*counter)++;
	return 0;
}

callbackの一番目の引数はsqlite3_execで4番目に指定した変数
callbackはsqlite3_execで得られたデータをargvに入れる argcは受け取ったデータの数 fieldはフィールド名
例えばフィールド名がIDとNameでデータが255とhogeだったら、argcは2 argvは"255"と"hoge"を指している事になる fieldは"ID"と"Name"を指している
callbackはsqlコマンドの実行結果を処理する関数という事らしい

プログラムは動いたがメモはざっと書いたので間違ってるところもあるかもしれない



参考にしたもの

goのcontainer/list

使い方のメモ


container/listは双方向リストをサポートしている。listはリストそのものを表現するList型と格納される要素を表現するElement型で構成されている。


Element型はValueというinterface型を持っているので、どんな値でも入れられる。

 type Element struct {

        Value interface{}
       
}


func New() *List
初期化されたList型のポインタを返す

 hogelist := list.New()


func(l *list)Front()*Element
リストの先頭の要素のポインタを返す

p := hogelist.Front()

func(e *Element)Next()
eの次の要素のポインタを返す

  p = p.Next()

func(e *Element)Prev()
eの前の要素のポインタを返す

  p = p.Prev()


func(l *List)PushFront(value interface{}
リストの先頭から入れる

 hogelist.PushBack(8)
 hogelist.PushBack("bar")


func(*List)PushBack(value interface{}
リストの末尾から入れる

 hogelist.PushBack(8)
 hogelist.PushBack("bar")


func (l *List) InsertAfter(value interface{}, mark *Element) *Element
markで指定した要素の後ろに要素を挿入する

p := hogelist.Front()
hogelist.InsertAfter("hoge",p)


func (l *List)InsertBefore(value interface{}, mark *Element) *Element
markで指定した要素の後ろに要素を挿入する

p := hogelist.Front()
hogelist.InsertBefore("Golang",p)


func (l *List)MoveToBack(e *Element)
eを末尾に移動 移動させるだけなのでもちろん値は返さない

p := hogelist.Front()
hogelist.MoveToBack(p)


func (l *List)MoveToFront(e *Element)
eを先頭に移動

p := hogelist.Back()
hogelist.MoveToFront(p)


func (l *List)MoveBefore(e,mark *Element)
eをmarkの前に移動

s := hogelist.Front()
p := hogelist.Back()
hogelist.MoveBefore(p,s)


func (l *List)MoveAfter(e,mark *Element)
eをmarkの後ろに移動

s := hogelist.Front()
p := hogelist.Back()
hogelist.MoveBefore(p,s)


func (l *List)Remove(e *Element)
eをリストから削除

p := hogelist.Front()
hogelist.Remove(p)


func (l *List)Len() int
リストの長さを返す

len := hogelist.Len()

func (l *List)PushFrontList(l2 *List)
他のリストを前にくっつける

hogelist2 := list.New()
hogelist2.PushFront(888)
hogelist2.PushFrontList(hogelist)

func (l *List)PushBackList(l2 *List)
他のリストを後ろにくっつける

hogelist2 := list.New()
hogelist2.PushFront(888)
hogelist2.PushBackList(hogelist)


これぐらいの内容だったら
list - The Go Programming Language
を直接見た方がいい気がする

参考にしたもの