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