プログラマメモ2 - programmer no memo2

JavaでSpaceNavigatorからの値をとってみる。Windowsで。 2008/11/28
2008/12/01

Javaです。Windowsです。
SpaceNavigatorという入力デバイスからの値を取得してみます。

スペースナビゲーター


開発元からSDK(参考コード)が提供されています。
Windows、OSX、Linuxで動作するそうです。
SDKの利用は要登録

Windows上で、Javaを使ってこのデバイスから入力値を取得してみます。

使うもの、JACOB(JAVA-COM Bridge)

新しい
古い

このJACOBを使うとJAVA-COM間のやりとりが便利!?に行えます。

ちなみにCOMって何だ?というのは、Component Object Model - Wikipedia
コンポーネント・オブジェクト・モデルですね。


とりあえず、SensorのTranslation値は取得できました。
Rotationの値は取得できませんでした。。。
環境依存なのかしら。。。

綴りまちがえていた。。。
RotationをRotaionとしていたOrz...

import java.util.Scanner;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class TestSpaceNavigator2 {

public static void main(String[] args) throws InterruptedException {

final ActiveXComponent activeXComponent;
activeXComponent = new ActiveXComponent("TDxInput.Device");
System.out.println(activeXComponent.getProgramId());
System.out.println(">>>>>" + activeXComponent.invoke("Connect"));
/*
* アプリケーション終了のためのスレッド
*/
Runnable runnable = new Runnable() {

@Override
public void run() {

// System.in
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.next();
if ("q".equals(s)) {
System.out.println("*** Disconnect");
Dispatch.call(activeXComponent, "Disconnect");
System.exit(0);
}
}
}

};

new Thread(runnable).start();

Variant v = activeXComponent.invoke("Type");
System.out.println("*** TYPE:" + v);
Dispatch sensor = activeXComponent.invoke("Sensor").getDispatch();
while (true) {

// Dispatch rotation = sensor.call(sensor, "Rotaion").getDispatch();
try {
// sensor.call(sensor, "Rotaion").getDispatch();
Variant variant = sensor.call(sensor, "Translation");

Variant x = variant.getDispatch().call(variant.getDispatch(),
"X");
Variant y = variant.getDispatch().call(variant.getDispatch(),
"Y");
Variant z = variant.getDispatch().call(variant.getDispatch(),
"Z");
Variant length = variant.getDispatch().call(
variant.getDispatch(), "Length");
System.out.println("IsConnected:["
+ activeXComponent.invoke("IsConnected")
+ "] Translation x:[" + x + "] y:[" + y + "] z:[" + z
+ "] length:[" + length + "]");
variant.getDispatch().safeRelease();
} catch (Exception e) {
System.out.println("*** error");
}
Thread.sleep(100);
}

}

}

XcodeとInterfaceBuilderをいったりきたり 2008/11/19

ちょっとわかったこととか
MVC(モデルービューーコントローラ)で考えること。
XcodeとInterfaceBuilderのふたつの開発ツールをいったりきたりで開発していく。


Xcodeでコントローラを追加。
そのUIを変数にして、IBOutletとつけるとInterfaceBuilderで認識してくれる。

IBOutlet UIButton *button;
IBOutlet UITextField *text;


IBActionと返り値にするメソッドを追加すると、InterfaceBuilderで認識してくれる。
- (IBAction)ok{
NSLog(@"*** OK!!! CLICKED!!");
[text setText:@"しげげです。!!"];
}


以下、整理されていない自分メモ
InterfaceBuilderで、MainWindow.xibを編集すると仮定します。
[Tools]-[Library]
でライブラリの画面をだして、ControllersからObjectを選んでドラッグしてxibに追加して、object identyでXcodeで追加したコントローラがでてくるって感じ。
インスペクターでアウトレットをUIのものとむすびつけていく。
線をひっぱていくようにしていくのがおもしろい!!
まずInterfaceBuilderでUIを配置しておいて、Xcodeでコントローラを作成って感じなのかな。

Java側からSWTのデータを取得したいです。 2008/11/19

SWTです。
JavaからSWTのデータを取得したいです。
SWTにさわる場合はSWTのスレッド上でないといけないという制約があります。
で、 org.eclipse.swt.widgets.Display.getDefault()を使ってsyncExecを呼び出して触ります。



テンポラリーに使う場合にデータホルダーを作って、そこに格納したりしてみました。

class Temp {
String val;
}
final Temp temp = new Temp();
Display.getDefault().syncExec(new Runnable(){
@Override
public void run() {
temp.val = xxxx.getText();
}
});

max-heap-sizeとjava-vm-argsの-Xmx、どちらが有効? 2008/11/19

JNLPです。
JNLPファイルに
max-heap-sizeとjava-vm-argsの-Xmxの指定が両方あった場合に、どちらが有効になるか?
max-heap-sizeが有効のようにみえます。

あと、java-vm-argsが正しくない場合JNLPでアプリケーションが起動しなくなるケースがあるようにみえます。

たとえば

java-vm-args="-Xmx64"

ただしくは
java-vm-args="-Xmx64m"

max-heap-sizeを指定しないと起動しませんでした。

ちなみにローカルでjnlp起動時のcodebase指定は、
windowsでは
codebase="file:/C:/tmp"

って感じでうまくいきました。

[objective-c]アウトレット 2008/11/18

Objective-Cです。
Objective-Cでは、他のオブジェクトを追跡するインスタンス変数のことをアウトレットというそうです。
アウトレット(outlet)は接続口という意味だそうです。
アウトレットという用語は、Interface Builderで使われていました。

IBxxxのIBってInterface Builderの頭文字なのかしら。

参考

applicationDidFinishLaunchingって? 2008/11/18

iphoneの開発初日です。
先週は、エディタでコード書いてで、gccでコンパイルしていましたが、そろそろXcodeを使いはじめます。
プロジェクトテンプレートからスタートして頭が???になったのでメモしておきます。

mainからどういったシーケンスで動くのだろうとおいかけようとしたら、いきなり下記のコードで悩みました。

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}




UIApplicationMainで設定を読みこんでdelegateで実行って感じのようです。
おそらく、
Info.plistのNSMainNibFileのxxxをよんで、xxx.xibを読みこんでクラスを決定して、そのクラスには、applicationDidFinishLaunchingが実装されていて、画面の初期化が終わってからユーザー定義のapplicationDidFinishLaunchingが実行という流れかな。

applicationDidFinishLaunchingが自分で行う初期化の実装箇所のようです。

ちなみに、UIはInterfaceBuilderを使ってツールで作成のようです。
Xcode上で、xxx.xibをダブルクリックするとInterfaceBuilderが起動します。
右クリックメニューから「形式を指定して開く」でテキストとしてみると中身はxmlでいろいろ定義してあります。


- (void)applicationDidFinishLaunching:(UIApplication *)application {
// ここで初期化処理。
}


参考
iphone開発でもNSLogは使えます。
Xcode [実行]-[コンソール]でNSLogが出力されるコンソールがでてきます。
ログ出力

[objective-c][cocoa]NSString 2008/11/13
2008/11/13

Objective-Cです。Cocoaです。
NSStringです。

NSLogを使って、Terminalで日本語を出力しようとしていて、何故か出力されなくて困ってしまいました。

NSLog(@"日本語");

この一行で出力がとまってしまうのです。
原因は、Terminalの設定-詳細-言語環境-文字エンコーディングがEUCの環境で動作させていたからでした。
unicode(UTF-8)にしたら出力されました。
Orz...

コード
#import <Foundation/NSString.h>
#import <Foundation/NSAutoreleasePool.h>

int main(void){
// !!
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *s = @"123日本語";
NSString *s2 = [NSString stringWithCString:"123日本語" encoding:NSUTF8StringEncoding];
NSString *s3 = [NSString stringWithString:@"123日本語"];

NSLog(@"123日本語");
NSLog(s);
NSLog(s2);
NSLog(s3);
return 0;
}


Objective-Cではソースコードで文字列を扱うときには@""とします。
C言語ライクに使う場合は、""でよいようです。

この書き方で書くとオブジェクト定数(object constant)というものになって、NSStringとして扱えるそうです。


参考

[objective-c]windowを表示してみる。その2 2008/11/12
2011/01/11

Objective-Cです。Cocoaです。
NSWindowを閉じるときにどうやってアプリケーションを終了させるのだろうと思いました。


NSWindowのdelegateを使って閉じるイベントをつかまえて、NSApplicationにterminateメッセージをおくってあげます。
NSApplicationは大域変数NSAppで参照可能。

#import <Cocoa/Cocoa.h>
@interface A:NSObject{
NSWindow *win;
}
-(void)go;
-(void)windowWillClose:(NSNotification *)notification;
- (void)windowDidMove:(NSNotification *)notification;
@end
@implementation A

- (void)go{
NSRect contrect;
contrect.size.width = 200;
contrect.size.height = 200;

NSUInteger wstyle = NSClosableWindowMask | NSTitledWindowMask;
win = [[NSWindow alloc] initWithContentRect:contrect styleMask:wstyle backing:NSBackingStoreBuffered defer:NO];
[win setReleasedWhenClosed:YES];
[win setDelegate:self];// DELEGATE
[win orderFront:nil];
}

- (void)windowWillClose:(NSNotification *)notification {
NSLog(@"windowWillClose!!");
[NSApp terminate:nil];
}
- (void)windowDidMove:(NSNotification *)notification {
NSLog(@"windowDidMove!!");
}
- (void)applicationDidFinishLaunching:(NSNotification*)notification {
NSLog(@"OK\n");
[self go];
}
@end

int main(int argc, const char *argv[]) {
id app = [NSApplication sharedApplication];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
A *a = [A alloc];
[a autorelease];
[app setDelegate:a];
[app run];
return 0;
}

[java]あるクラスがあるインターフェイスをインプリメントしているか調べる。 2008/11/12

Javaです。
あるクラスがあるインターフェイスをインプリメントしているか調べます。
listの中から調べて指定されたインターフェイスのリストを返します。
ジェネリックを意識したけど、これでいいのかな。

この Class オブジェクトが表すクラスまたはインタフェースが、指定された Class パラメータが表すクラスまたはインタフェースと等しいかどうか、あるいはそのスーパークラスあるいはスーパーインタフェースであるかどうかを判定します。どちらかに当てはまる場合は true を、そうでない場合は false を返します。javadoc


isAssignableFromだけで済むみたい。
あと、ジェネリックを使ってのキャストって(T)oとかを、Classにあるcastメソッドを使ってみました。

import java.util.ArrayList;
import java.util.List;

public abstract class ClassUtils {

static class Aaa implements Idummy1, Idummy2 {
}

interface Idummy1 {
}

interface Idummy2 {
}

interface Idummy_e3 extends Idummy2 {
}

public static void main(String[] args) {

List list = new ArrayList();
list.add(new Aaa());
list.add(new Idummy1() {
});
list.add(new Object() {
});
list.add(new Idummy2() {
});
list.add(new Idummy2() {
});
list.add(new Idummy2() {
});
list.add(new Idummy_e3() {
});
List<Idummy2> r = b(list, Idummy2.class);

System.out.println(r.size());
}

static <T> List<T> b(List<?> list, Class<T> clazz) {
List<T> r = new ArrayList<T>();
for (Object o : list) {
if (clazz.isAssignableFrom(o.getClass())) {
r.add(clazz.cast(o));
}
}
return r;
}
}

[objective-c]windowを表示してみる。 2008/11/11
2011/01/11

Objective-Cです。cocoaです。
とりあえず、windowを表示してみたいと思いました。
NSWindowというのはわかったんですが、アプリケーションを作成するお作法がわかりません。
NSApplicationというのがアプリケーションの中心にいるのかな。

NSWindow Class Reference

xcodeをつかわずエディターで。

gcc *.m -framework Foundation -framework AppKit


アプリケーションの終了のさせ方がわからないので、とりあえず表示してほったらかしなコードです。
終了させるときはctrl + cで...

#import <Cocoa/Cocoa.h>
@interface A:NSObject{
NSWindow *win;
}
-(void)go;
@end
@implementation A

- (void)go{
NSRect contrect;
contrect.size.width = 200;
contrect.size.height = 200;
contrect.origin.x = 100;
contrect.origin.y = 500;
NSUInteger wstyle = NSClosableWindowMask | NSTitledWindowMask;
win = [[NSWindow alloc] initWithContentRect:contrect styleMask:wstyle backing:NSBackingStoreBuffered defer:NO];
[win setReleasedWhenClosed:YES];
[win orderFront:nil];
}

- (void)applicationDidFinishLaunching:(NSNotification*)notification
{
NSLog(@"OK\n");
[self go];
}
@end


int main(int argc, const char *argv[]) {
id app = [NSApplication sharedApplication];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
A *a = [A alloc];
[a autorelease];
[app setDelegate:a];
[app run];
return 0;
}

[objective-c]手習いインスタンスの自動解放 2008/11/11

Objective-Cです。
インスタンスの自動解放(autorelease)です。
メモリ確保、解放といった手順をほとんど意識せずプログラムできる環境になれたので、頭がおいついておりません。


まだ使う場面が頭の中でイメージできてませんが、とりあえず、コード。
#import <Foundation/NSObject.h>
#import <Foundation/NSAutoreleasePool.h>
@interface A:NSObject
- (void)go;
@end
@implementation A

- (void)go
{
NSLog(@"OK");
}
@end

int main(void){
id a;
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
a = [A alloc];
[a go];
[a autorelease];
[pool release];
return 0;
}


メモ。
 NSAutoreleasePoolはいくつも用意できる。
最後につくったものが現在のpool。
NSObjectにautoreleaseがあるが、 NSAutoreleasePoolにaddObjectがあるらしい。

[objective-c]プロトコル 2008/11/10

Objective-Cです。プロトコル(protocol)です。
このプロトコルはJavaでいうところのinterfaceだと思います。
説明としては、「実装が期待されてるメソッドの定義集」って感じでしょうか。


宣言は、@protocolで。
メソッドを記述していきます。

#import <Foundation/NSObject.h>

@protocol MyProtocol
- (void)mymethod;
@end

@interface A:NSObject <MyProtocol>
@end


実装側。
#import "A.h"

@implementation A
- (void)mymethod {}
@end


実装せずコンパイルすると、
$ gcc *.m -framework Foundation
A.m:5: warning: incomplete implementation of class 'A'
A.m:5: warning: method definition for '-mymethod' not found
A.m:5: warning: class 'A' does not fully implement the 'MyProtocol' protocol


次に、Objective-C2.0では、プロトコルで定義されたものをすべて実装しなくてもすむオプションが用意されています。

@optional
@required


@optionalをつけると実装がなくてもコンパイラにおこられません。

[objective-c]カテゴリー - あとからばんばん機能を追加できる!? 2008/11/09

Objective-Cです。
カテゴリーは、クラスに機能を追加する方法です。


Aというクラスがあったとして、あとからAのソースコードに機能(メソッド)を追加するのではなく、外から定義できます。
これはサブクラス(継承)しなくても機能を追加できるということです。あとたくさんの機能をもっているクラスのソースを分割して記述できるということでもあるようです。

Aというクラスが定義されてあるA.h,A.mがあるとして、カテゴリーは、A+Category.hに定義します。実装は、A+Category.m
に。
クラス名+カテゴリ名.h、クラス名+カテゴリ名.mとするのがルールのようです。
このルールがあるで、ソースコードをみてすぐにどのクラスのなんというカテゴリかがわかるってことになるのかな


A+Category.hは下記の感じ、

#import "A.h"

@interface A (Category)
- (void)methodC;
@end


#import "ClassName.h"
@interface カテゴリーが追加されるのクラス名前 ( カテゴリー名 )
// メソッド宣言
@end


実装、A+Category.m
#import "A+Category.h"
#import <stdio.h>

@implementation A (Category)
- (void)methodC
{
printf("category method A:[%d]!!\n", i++);
}
@end


#import "ClassName+CategoryName.h"
@implementation カテゴリーが追加されるのクラス名前 ( カテゴリー名 )
// メソッド定義
@end


カテゴリーからは拡張したクラスのインスタンス変数がみれます。

機能追加対象のクラスのソースコードがなくても機能追加できます。

[objective-c]事始め 2008/11/08

Objective-Cです。環境はmac osx上です。事始めです。
4〜5年前に「オブジェクトCオブジェクトC」と連呼していたら、オブジェクティブCだよと訂正されたことがあります。

ソースコードの拡張子は.mです。

コンパイルは普通にgccで。
この時点では、特にオブションなしでgcc main.mとかで。

#include <stdio.h>
@interface A
@end
@implementation A
@end
int main(void){
printf("test to test!!\n");
return 0;
}


@〜でくくられたところは、コンパイラ指示子(compiler directive)


簡単な実装
ここからgccにおまじないが必要になります。
gcc main.m -framework Foundation

-framework Foundation
NSObjectにallocがあるようです。

#include <Foundation/NSObject.h>
#include <stdio.h>

@interface A: NSObject
{
int i;
}
- (void)mymethod;
@end

@implementation A
- (void)mymethod
{
printf("i am A:[%d]!!\n", i++);
}
@end

int main(void)
{
id a;
a = [A alloc];
[a mymethod];
[a mymethod];
return 0;
}


えーと、Objective-Cは
[オブジェクト メッセージ]

というふうに書く。
メッセージ式(message expression)っていうらしい。

javaとかで書くと
オブジェクト.メソッド
って感じなのかな。

新しい言語を学ぶときは、自分が慣れた言語から類推するとなんとなくわかるけど、「郷に入れば郷に従え」を心がけて名称とか、用語をきちんと守りたいところ。

[c]関数引数の値を変更したい。 2008/11/06
2008/11/07

Cです。
Cでは、関数に対して引数を値で渡すので、呼ばれた関数で、呼びもとの関数内の値を直接変えることができません。
と、K&Rで書いてありまして、K&Rではswap関数の書き方がのっていました。目的の効果を得るために、演算子&を使って関数に値を渡し、渡されたほうでは間接演算子*を使う。

お試し用のコードなので実用的ではない。
むしろ危険かも。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void func(char* c){
char* b = "abcdefg";
*c = b;
fprintf(stdout, "func address:%p ->%s\n", b, b);
fprintf(stdout, "func address:%p ->%s\n", c, c);
}


int main(void) {

char* c = "test";
fprintf(stdout, "main address:%p ->%s\n", c, c);
func( &c );
fprintf(stdout, "main address:%p ->%s\n", c, c);

return EXIT_SUCCESS;
}


結果例
main address:0x1fe4 ->test
func address:0x1fc6 ->abcdefg
func address:0xbffffa9c ->�
main address:0x1fc6 ->abcdefg


ああ、ポインタぁ。

コンパイル - libxml2を利用した共有ライブラリを作成したい 2008/11/06

libxml2を使いたいです。
The XML C parser and toolkit of Gnome

libxml2を利用した共有ライブラリを作成したいです。

ためしたのはLinux上です。
コンパイルオプションなどなど。

gcc -c -fPIC -I/usr/include/libxml2 myxpath.c
gcc -shared -Wl,-soname,libmyxpath.so.1 myxpath.o -o libmyxpath.so `xml2-config --libs`


ちなみに`xml2-config --libs`は、
-L/usr/lib -lxml2 -lz -lpthread -lm

となります。

[C]文字列の配列を返す関数って - ちょっと練習 2008/11/05

C言語です。
はじめてEclipseのC/C++版を使ってみたりしてます。
ctrl + spaceで関数を補完してくれるんですね!!

文字列の配列を返す関数ってどう書くのだろうと、記憶をたどりつつ。
あやうい。
Orz...

char **ss = (char **) malloc(sizeof(char *) * len);


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char** b(int len);

int main(void) {
int cnt = 0;
while (cnt++ < 900000) {
int len = 100;
char** ss = b(len);
int i = 0;
for (i = 0; i < len; i++) {
fprintf(stderr, "%d %s\n", i, ss[i]);
free(ss[i]);
}
free(ss);
}

return EXIT_SUCCESS;
}

char** b(int len) {
char **ss = (char **) malloc(sizeof(char *) * len);
int i = 0;
// char buf[1000];
// memset(buf, 0x0, 1000);
for (i = 0; i < len; i++) {
char* buf = malloc(sizeof(char) * 1000);
memset(buf, 0x0, 1000);
sprintf(buf, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%d", i);
ss[i] = buf;
fprintf(stdout, "%s\n", ss[i]);
}
//free(ss);
return ss;
}

void a(int len) {
char **ss = (char **) malloc(sizeof(char *) * len);
int i = 0;
char buf[1000];
for (i = 0; i < len; i++) {
sprintf(buf, "aaaaaaaaa%d", i);
ss[i] = buf;
fprintf(stdout, "%s\n", ss[i]);
}
free(ss);
}

[googleappengine]gaeutilities - セッションへの道 2008/11/01

googleappengineです。Pythonです。
はて、セッションってどう扱うんだろう。


gaeutilitiesを使ってみました。
どうかな...

セッションがある状態ない状態を交互につくるようなコードです。
はてこれでいいのかな?
最近、自信がない...
from appengine_utilities import sessions


def check_session(request):
sess = sessions.Session()
keyname = 'CHECK'
a = ''
if keyname in sess:
sess[keyname] = int(sess[keyname]) + 1
a = "YES" + str(sess[keyname])
sess.delete()
else:
sess[keyname] = 1
a = "NO" + str(sess[keyname])
return render_to_response('check_session.html', {'mysession': a})


慣れない言語だと、簡単なことしようと思ってなかなか...
__contains__(key)
とあると key in xxxxという書き方ができるの?


Called to implement membership test operators (in and not in).