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

目次

テストしてからセットします。 - テスト・アンド・セット - Test-and-Set 2009/01/31



アトミックに処理できることを保証したのちに、変数をテストして、セットできるならセットします。

えーと、Javaならどうなんだろう。
あるオブジェクトをシンクロナイズドしたのちに、テストしてセットかな。

package testandset;

public class Main {

class A {
String s;
}

A a = new A();

public static void main(String[] args) {

}

public Main(){
new Main().a();
}

void a(){
synchronized (a) {
// テストして
if("F".equals(a.s)){
// セット
a.s = "T";
}

}
}

}

[java]あれーーー、匿名クラスのアノテーションは実行時につかないの? - いやつきます。 その2 2009/01/30

先日書いた記事(プログラマメモ2: [java]あれーーー、匿名クラスのアノテーションは実行時につかないの?)で、コメントをいただきまして、@Inheritedを使う事で解決。

うーん勉強になりました。

というわけで再びコード

package build;

import java.awt.Container;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class TestAnnotation {

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {

}


@MyAnnotation
static class MyContainer extends Container {

}

public static void main(String[] args) {

Container container = new MyContainer();
Container container2 = new MyContainer() {
};

System.out.println("*** not anonymous inner class:"
+ container.getClass().isAnnotationPresent(MyAnnotation.class));
System.out
.println("*** anonymous inner class:"
+ container2.getClass().isAnnotationPresent(
MyAnnotation.class));

}

}


結果は、
*** not anonymous inner class:true
*** anonymous inner class:true

ある文脈時に、変数がとりうる値から状態を決めたいわけです 2009/01/29
2009/01/30

ある状態のときにある動作をするプログラムを書くときに、
実装者に条件判定(if)を書かせないようにしたい。

とくにif文がネストするようなコードを書かせたくない(書きたくない)。

if(){
if(){
if(){

}
}
} else {
if(){


} else {

}
}


こういったコードになりがちなのはアプリケーションのもつ状態を把握していないときにおこると思います。
状態を把握していない場合、実装者が自分に都合のよいフラグを安易に(やむにやまれず)導入したりします。

アプリケーションは、《ある条件のときにある処理を実行してよい》、の積み重ねと考えると、ある条件を、
抽出する方法を簡単に(一目で把握)できないかなと。

アプリケーションのもつ状態をアプリケーションがもつ変数のその瞬間時の組み合わせとするなら、
状態を表にできるかなと考えたわけです。

これは僕の以前からずーともっているテーマなのですが、これをうまく表現するための方法がないかな。

ある文脈時に、変数がとりうる値から状態を決めたいわけです。

アイデアレベル
/* 文脈 abcWindow */
CONTEXT:abcWindow

/* 変数から状態を決定 */
STATE(name:ST_1): a:true, b:false, c:3, d:visible
STATE(name:ST_2):STS_1, e:false
STATE(name:ST_3):STS_2, e:true
STATE(name:ST_4):a:true, b:false, c:3, d:not visible, e:true

/* 変数の取得方法 */
VALUE(name=a):{

}
VALUE(name=b):{

}
VALUE(name=c):{

}
VALUE(name=d):{

}
VALUE(name=e):{

}

[java]あれーーー、匿名クラスのアノテーションは実行時につかないの? 2009/01/28
2009/01/30

Javaアノテーション実験です。

匿名クラスにつけたアノテーションが実行時につかないっぽい。
使い方まちがってるかなぁ

追記
匿名さんからのコメントです。@Inheritedをつけるとオッケーでした!!


以下テストコード。

package build;

import java.awt.Container;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class TestAnnotation {

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {

}

@MyAnnotation
static class MyContainer extends Container {

}

public static void main(String[] args) {

Container container = new MyContainer();
Container container2 = new MyContainer() {
};

System.out.println("*** not anonymous inner class:"
+ container.getClass().isAnnotationPresent(MyAnnotation.class));
System.out.println("*** anonymous inner class:"
+ container2.getClass().isAnnotationPresent(MyAnnotation.class));

}

}


実行結果
*** not anonymous inner class:true
*** anonymous inner class:false

[java] Guiceをちょこっと触ってみた。 2009/01/27


対応はJava5以降、アノテーションを使ってます。

重要なアノテーションはずばり

@Inject


参考
シンプルだなと思いました。


以下、コード

package guice;

import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Scopes;

public class TestA {

public static class MyModule implements Module {

public void configure(Binder binder) {
/*
* インターフェイスIContextの実装は、MyContextです。シングルトンで作成
*/
binder.bind(IContext.class).to(MyContext.class)
.in(Scopes.SINGLETON);
}
}

/*
* 実験メイン
*/
public static void main(String[] args) {

/*
* インジェクターを作成します。定義を記述したModuleを使う
*/
Injector injector = Guice.createInjector(new MyModule());
/*
* 注入して作成
*/
A a = injector.getInstance(A.class);

/*
* コンテクストが入ってるか出力してみる
*/
System.out.println(a.context);
}

/*
* インターフェイス
*/
interface IContext {
}

/*
* 実装です。
*/
static class MyContext implements IContext {

public String toString() {
return "my context...";
}
}

static class A {

IContext context;

// アノテーションを忘れずにないと注入されないよ。
@Inject
public void context(IContext context) {
this.context = context;
}
}
}

[java]AWTEventMulticaster - マルチキャストイベントディスパッチを行う仕組み 2009/01/19

Javaです。AWTEventMulticasterです。

AWTEventMulticaster は、java.awt.event パッケージで定義される AWT イベントに、効率的で、スレッドセーフな、マルチキャストイベントディスパッチを行う仕組みを実装します。javadoc


AWTEventMulticasterを使うと、Toolkitを使ってイベントひろってくれますね。

Swingでは、EventListenerListを使うようですけど、これだとjava.awt.Toolkitでイベントひろえないようなんだよなぁ。。。


package awtevent;

import java.awt.AWTEvent;
import java.awt.AWTEventMulticaster;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test {

public static void main(String[] args) {

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {

@Override
public void eventDispatched(AWTEvent event) {
System.out.println("*** " + event);
}
}, 0xffffffff);

a();
}

static void a() {

ActionListener actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("*** a:[" + e.getActionCommand() + "]");
}
};
actionListener = AWTEventMulticaster.add(actionListener,
new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
System.out.println("*** b:[" + e.getActionCommand()
+ "]");
}
});

actionListener
.actionPerformed(new ActionEvent(new Object(), 7, "test"));
}

}

実行時にアノテーションの情報を利用するときは、@Retention(RetentionPolicy.RUNTIME)を忘れずに。 2009/01/16




アノテーションを設定して、実行時にチェックしたいなぁと考えました。
@Retention(RetentionPolicy.RUNTIME)を設定することせずに、getClass().getDeclaredMethods()を使って、Methodごとのアノテーション情報を実行時に取得してチェックしようとしました。

Annotation[] annotations = method.getDeclaredAnnotations();

で、設定したアノテーション情報が取得できない場合は、定義したアノテーションクラスに、@Retention(RetentionPolicy.RUNTIME)を設定しているかチェックすべしです。

package ql;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Nonnull {}

JPEGファイルを読みこんで返すJSP 2009/01/15

えーと、Javaです。
JSPを使って任意のJPEGファイル読み込み適当に返します。

web.xmlです。
mappingで拡張子がjpg,jpegであるものに適用します。

<servlet>
<servlet-name>read_image</servlet-name>
<jsp-file>/read_image.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>read_image</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>read_image</servlet-name>
<url-pattern>*.jpeg</url-pattern>
</servlet-mapping>



JSPです。
結構イージーにつくってます。
<%@ page language="java"
contentType="image/jpeg"%><%
String root = "/";
String s = request.getRequestURI();
System.out.println("jpeg request:[" + request.getRequestURI() + "] imagepath:[" + s + "]");
java.io.BufferedInputStream input = new java.io.BufferedInputStream(
new java.io.FileInputStream(root + s));
java.io.BufferedOutputStream output = new java.io.BufferedOutputStream(response
.getOutputStream());
byte[] buf = new byte[8192];
int len = -1;
while ((len = input.read(buf)) != -1) {
output.write(buf, 0, len);
output.flush();
}

input.close();
output.close();
%>

[java]何気に、フレームの透明化 Java SE 6u10でね。 2009/01/15



何気にこの機能、はいってたのね。。。

ああ、JDBCを使ってるときにでるORA-00911は、SQLのうしろに;をつけてたりするかも。 2009/01/14

ああ、JDBCを使ってるときにでるORA-00911は、SQLのうしろに;をつけてたりするかも。

ァ-ヶ - 2009年においても、全角カタカナ判定は面倒..Orz... 2009/01/12

全角カタカナ判定ってどうやるんだろうって思っていたりします。
ユニコードならァ-ヶで全角カタカナ判定ができるようです。


で、プログラムで出力。


public class ZenkakuKatakanaOut {

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

static void a(){
char a ='ア';
char b = 'ヶ';
for(int i=a;i<=b;i++){
System.out.print((char)i);
}

}
}


結果は、それっぽくでてます。
アィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ


しかし、全角カタカナ判定面倒くさい.....

参考

iPhoneでLuaって使えるかな その2 2009/01/09



今回はエラーがなくコンパイルできること目標に。
もともとLuaはANSI C環境だけでコンパイルできる。
そのことに気がついたのは、luaconf.hをみてからなのだけども。

とりあえずコンパイル、リンクまではうまくいったMakefileです。
実際には動かしてはいません。
#if defined(LUA_USE_LINUX)
#define LUA_USE_POSIX
#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
#define LUA_USE_READLINE /* needs some extra libraries */
#endif

#if defined(LUA_USE_MACOSX)
#define LUA_USE_POSIX
#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
#define LUA_DL_DYLD /* does not need extra library */
#endif


今回のMakefileは、

PLAT= iphone

#SDK=/Developer/Platforms/iPhoneOS.platform/Developer
SDK=/Developer/Platforms/iPhoneSimulator.platform/Developer

#ARCH=armv6
ARCH=i386

#SYSROOT = $(SDK)/SDKs/iPhoneOS2.1.sdk

#SYSROOT = $(SDK)/SDKs/iPhoneOS2.2.sdk
SYSROOT = $(SDK)/SDKs/iPhoneSimulator2.2.sdk

#CC=$(SDK)/usr/bin/arm-apple-darwin9-gcc-4.0.1
CC=$(SDK)/usr/bin/gcc
CFLAGS= -O2 -Wall $(MYCFLAGS) -arch $(ARCH) -I$(SDK)/usr/include/gcc/darwin/4.0 -isysroot $(SYSROOT)

AR= ar rcu
RANLIB= ranlib
RM= rm -f
LIBS= -lm $(MYLIBS)

MYCFLAGS=
MYLDFLAGS= -framework UIKit -framework CoreFoundation -framework Foundation -framework CoreGraphics -lobjc -bind_at_load -arch $(ARCH) -isysroot $(SYSROOT)
MYLIBS=

PLATS= iphone

LUA_A= liblua.a
CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o ¥
lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o ¥
lundump.o lvm.o lzio.o
LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o ¥
lstrlib.o loadlib.o linit.o

LUA_T= lua
LUA_O= lua.o

LUAC_T= luac
LUAC_O= luac.o print.o

ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
ALL_A= $(LUA_A)

default: $(PLAT)

all: $(ALL_T)

o: $(ALL_O)

a: $(ALL_A)

$(LUA_A): $(CORE_O) $(LIB_O)
$(AR) $@ $?
$(RANLIB) $@

$(LUA_T): $(LUA_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)

$(LUAC_T): $(LUAC_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)

clean:
$(RM) $(ALL_T) $(ALL_O)

depend:
@$(CC) $(CFLAGS) -MM l*.c print.c

echo:
@echo "PLAT = $(PLAT)"
@echo "CC = $(CC)"
@echo "CFLAGS = $(CFLAGS)"
@echo "AR = $(AR)"
@echo "RANLIB = $(RANLIB)"
@echo "RM = $(RM)"
@echo "MYCFLAGS = $(MYCFLAGS)"
@echo "MYLDFLAGS = $(MYLDFLAGS)"
@echo "MYLIBS = $(MYLIBS)"

# convenience targets for popular platforms

none:
@echo "Please choose a platform:"
@echo " $(PLATS)"

iphone:
$(MAKE) all MYCFLAGS=-DLUA_ANSI

# list targets that do not create files (but not all makes understand .PHONY)
.PHONY: all $(PLATS) default o a clean depend echo none

# DO NOT DELETE

lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h ¥
lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h ¥
lundump.h lvm.h
lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h
lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h ¥
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h ¥
ltable.h
ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h ¥
llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h ¥
lfunc.h lstring.h lgc.h ltable.h lvm.h
ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h ¥
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h ¥
ltable.h lundump.h lvm.h
ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h ¥
lzio.h lmem.h lundump.h
lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h ¥
lstate.h ltm.h lzio.h
lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h ¥
lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h
liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h
llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h ¥
lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h ldo.h
loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ¥
ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h
lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h ¥
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h ¥
lfunc.h lstring.h lgc.h ltable.h
lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h ¥
ltm.h lzio.h lstring.h lgc.h
lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h ¥
lmem.h lstring.h lgc.h ltable.h
lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h
luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h ¥
lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h ¥
lundump.h
lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h ¥
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h ¥
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h
lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h ¥
lzio.h
print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h lopcodes.h lundump.h

# (end of Makefile)

findしてgrepしてマッチさせてからコピー、xargsを二度ほど使ってます。 2009/01/09

コマンドです。

ファイル内検索してマッチしたファイルだけを別のディレクトリ(フォルダ)に移動(コピー)したいという気持ちにときたまなります。

まず、いまいるディレクトリでファイル内検索してマッチさせます。

find .|xargs grep "マッチ!!"


つぎにこのマッチしたファイルを別のディレクトリにコピーします。
はじめxargsでどう実現するのかしらと頭を悩ませたのですが、mv,cpのコマンドには移動場所を指定するオプションがあります!!

-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY


-t, --target-directory=DIRECTORY
copy all SOURCE arguments into DIRECTORY


このオプションを使って、実現してみます。

find .|xargs grep -l "マッチ"|xargs cp -t 移動


xargsを二度使ってます。

参考
ディノオープンラボラトリ — いまさらxargsの便利さを主張してみる

iPhoneでLuaって使えるかな その1 2009/01/08

ふとiPhoneアプリの開発でLuaを使えるかしらと思ったのでした。


本屋で立ち読みしてましたら、ゲーム、組み込みで実績のあるスクリプトの用で、ソースコード、モジュールのサイズがとても大きいというものでもないようなので、iphoneで使えるのかしらと期待大です。
ファンクター、クロージャーが使えるようです。

mac osxでosx用Luaのコンパイルはさくっとできるので簡単にできるだろうと考えています。

どこから手をつけていいかわからないので、とりあえずMakefileをガシガシ書き換えてみました。
Makefileの参考はここで、HOWTO compile iPhone applications using traditional development tools - MacTalk Forums

PLAT= iphone

#SDK=/Developer/Platforms/iPhoneSimulator.platform/Developer
SDK=/Developer/Platforms/iPhoneOS.platform/Developer
ARCH=armv6
#SYSROOT = $(SDK)/SDKs/iPhoneOS2.1.sdk
SYSROOT = $(SDK)/SDKs/iPhoneOS2.2.sdk

CC=$(SDK)/usr/bin/arm-apple-darwin9-gcc-4.0.1
CFLAGS= -O2 -Wall $(MYCFLAGS) -arch armv6 -I$(SDK)/usr/include/gcc/darwin/4.0 -isysroot $(SYSROOT)
AR= ar rcu
RANLIB= ranlib
RM= rm -f
LIBS= -lm $(MYLIBS)

MYCFLAGS=
MYLDFLAGS= -framework UIKit -framework CoreFoundation -framework Foundation -framework CoreGraphics -lobjc -bind_at_load -arch $(ARCH) -isysroot $(SYSROOT)
MYLIBS=-lm

PLATS= iphone

LUA_A= liblua.a
CORE_O= lapi.o lcode.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o ¥
lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o ¥
lundump.o lvm.o lzio.o
LIB_O= lauxlib.o lbaselib.o ldblib.o liolib.o lmathlib.o loslib.o ltablib.o ¥
lstrlib.o loadlib.o linit.o

LUA_T= lua
LUA_O= lua.o

LUAC_T= luac
LUAC_O= luac.o print.o

ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O)
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
ALL_A= $(LUA_A)

default: $(PLAT)

all: $(ALL_T)

o: $(ALL_O)

a: $(ALL_A)

$(LUA_A): $(CORE_O) $(LIB_O)
$(AR) $@ $?
$(RANLIB) $@

$(LUA_T): $(LUA_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)

$(LUAC_T): $(LUAC_O) $(LUA_A)
$(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)

clean:
$(RM) $(ALL_T) $(ALL_O)

depend:
@$(CC) $(CFLAGS) -MM l*.c print.c

echo:
@echo "PLAT = $(PLAT)"
@echo "CC = $(CC)"
@echo "CFLAGS = $(CFLAGS)"
@echo "AR = $(AR)"
@echo "RANLIB = $(RANLIB)"
@echo "RM = $(RM)"
@echo "MYCFLAGS = $(MYCFLAGS)"
@echo "MYLDFLAGS = $(MYLDFLAGS)"
@echo "MYLIBS = $(MYLIBS)"

# convenience targets for popular platforms

none:
@echo "Please choose a platform:"
@echo " $(PLATS)"

iphone:
$(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX

# list targets that do not create files (but not all makes understand .PHONY)
.PHONY: all $(PLATS) default o a clean depend echo none

# DO NOT DELETE

lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h ¥
lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h ¥
lundump.h lvm.h
lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h
lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h
lcode.o: lcode.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h ¥
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h lgc.h ¥
ltable.h
ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h
ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h ¥
llex.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h ¥
lfunc.h lstring.h lgc.h ltable.h lvm.h
ldo.o: ldo.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h ¥
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lparser.h lstring.h ¥
ltable.h lundump.h lvm.h
ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h ¥
lzio.h lmem.h lundump.h
lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h ¥
lstate.h ltm.h lzio.h
lgc.o: lgc.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h ¥
lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h
linit.o: linit.c lua.h luaconf.h lualib.h lauxlib.h
liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h
llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h ¥
lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h
lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h
lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h ldo.h
loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h
lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ¥
ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h
lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h
loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h
lparser.o: lparser.c lua.h luaconf.h lcode.h llex.h lobject.h llimits.h ¥
lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h ldo.h ¥
lfunc.h lstring.h lgc.h ltable.h
lstate.o: lstate.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h
lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h ¥
ltm.h lzio.h lstring.h lgc.h
lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h
ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h
ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h
ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h ¥
lmem.h lstring.h lgc.h ltable.h
lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h
luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h ¥
lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h ¥
lundump.h
lundump.o: lundump.c lua.h luaconf.h ldebug.h lstate.h lobject.h ¥
llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h lundump.h
lvm.o: lvm.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h ltm.h ¥
lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h ltable.h lvm.h
lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h ¥
lzio.h
print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h ¥
ltm.h lzio.h lmem.h lopcodes.h lundump.h

# (end of Makefile)


とりあえずMakeを動かすとコンパイルしてはくれましたが最後でエラー。
Undefined symbols:
"_NSUnLinkModule", referenced from:
_gctm in liblua.a(loadlib.o)
"_NSLookupSymbolInModule", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
"__dyld_present", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
"_NSCreateObjectFileImageFromFile", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
"_NSDestroyObjectFileImage", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
"_NSLinkEditError", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
"_NSAddressOfSymbol", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
"_NSLinkModule", referenced from:
_ll_loadfunc in liblua.a(loadlib.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[1]: *** [lua] Error 1
make: *** [iphone] Error 2


仕方がないので、loadlib.cでシンボルがないといわれた箇所をすべて、コメントアウトしたら、とりあえずlua,luac,liblua.aができました。

できあがったモジュールが実際に動作できるかは検証してません。

参考

CGPointとか。あとNSLogとか。 2009/01/07

CGPointについてです。

定義は、


struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;

ちなみにCGFloatはfloatでした。

NSLogを使ってコンソールに出すときは、
NSLog(@"*** x:%f y:%f", point.x, point.y);

って感じかな。

あと、NSStringFromCGPointというのがあります。NSStringにしてくれるみたい。

たとえば、

NSLog(@"*** x:%f y:%f", point.x, point.y);
NSLog(@"*** %@", NSStringFromCGPoint(point));

とした場合はコンソールに下のようにでます。

*** x:184.000000 y:165.953613
*** {184, 165.954}


で、文字列からCGPointを作れる!!
CGPointFromStringを使います。
point = CGPointFromString(@"{111.123, 123.123}");


NSLogのフォーマット
%@  文字

%@で文字列です!!

参考
NSLog:NSLog

radial document visualizationっぽいのを描きたかった。 2009/01/05

Javaです。最近、お疲れ気味なので、さらに頭の切れ味が悪いです。


画面をキャプチャ
送信者 プログラマメモ2



radial document visualizationというのをみつけてかっこいいなぁと思いました。
ちなみに、radialは放射状の構造という意味だそうです。

ちょっと似た感じの描きたかったのですが。。。
ぜんぜん違うなぁ



package ggg;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestRadial {

/**
* 中心座標から、指定された半径の円を描くx, y, w, hを求める。
*/
static Rectangle a(int cx, int cy, int r) {

int x = cx - r;
int y = cy - r;
int w = r + r;
int h = w;

return new Rectangle(x, y, w, h);
}

static GeneralPath b(/* 中心点 */int cx, /* 中心点 */int cy, int r, /* 扇の幅 */
int d_size,
/* 描く角度( から) */int startA, int degree) {
Rectangle in_rec = a(cx, cy, r);
Rectangle out_rec = a(cx, cy, r + d_size);

Arc2D.Double out_arc = new Arc2D.Double(out_rec.x, out_rec.y,
out_rec.width, out_rec.height, startA, degree, Arc2D.OPEN);
Arc2D.Double in_arc = new Arc2D.Double(in_rec.x, in_rec.y,
in_rec.width, in_rec.height, startA + degree, degree * -1,
Arc2D.OPEN);

GeneralPath path = new GeneralPath();

path.append(out_arc, true);
path.lineTo(in_arc.getStartPoint().getX(), in_arc.getStartPoint()
.getY());
path.append(in_arc, true);
path.lineTo(out_arc.getStartPoint().getX(), out_arc.getStartPoint()
.getY());

return path;
}

static void bbb(Graphics2D g2d, int[] is){
final int CENTER_X = 200, CENTER_Y = 200;
double sum = 0;
for (int i : is) {
sum += i;
}

int pos = 0;
for (int i : is) {
GeneralPath path = b(CENTER_X, CENTER_Y, 80,
60 , pos, (int)(360 * (i/sum)) - 2);
draw(g2d, path, new Color(30,50, 80), Color.BLACK);
pos += (int)(360 * (i/sum)) - 1;
}
pos = 30;
for (int i : is) {
GeneralPath path = b(CENTER_X, CENTER_Y, 50,
30 , pos, (int)(360 * (i/sum)) - 2);
draw(g2d, path, new Color(100,150, 80), Color.BLACK);
pos += (int)(360 * (i/sum)) - 1;
}
}

static void draw(Graphics2D g2d, Shape shape, Color c1, Color c2){
g2d.setColor(c1);
g2d.fill(shape);
g2d.setColor(c2);
g2d.draw(shape);
}
static class MyFrame extends JFrame {
{
getContentPane().add(new JPanel() {

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

bbb(g2d, new int[]{3,8,2,3,4,5});


}

});
}

}

public static void main(String[] args) {

MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setLocation(300, 200);
frame.setVisible(true);

}

}

Core Graphicsの練習のために 2009/01/03

iphoneです。グラフィックです。
Core Graphicsの練習のためにお試しプロジェクトを作っていろいろ試そうかなぁと考えているのですが、勝手がわからず苦労しています。

実験コード作成するためのメモです。

xcodeは、window based で新規プロジェクトを作成します。
UIViewを継承したクラスを作成します。
drawRectメソッドをオーバライドします。
CGContextRefをUIGraphicsGetCurrentContext()関数を使用して取得して、このコンテクストを利用して描画コードを記述していきます。


- (void)drawRect:(NSRect)rect {
NSLog(@"*** drawRect !!!!");
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);
CGContextSetLineWidth(context, 2.0);

CGContextAddEllipseInRect(context, CGRectMake(30.0, 30.0, 60.0, 60.0));
CGContextStrokePath(context);
}


最後にこのUIViewをwindowに設定します。


- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window setContentView: [[my_view alloc] init]];
[window makeKeyAndVisible];
}

[java]ダーツ盤っぽいのを描いてみる。 2009/12/31

Javaです。ダーツ盤っぽいのを描いてみます。



package ggg;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Arc2D;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestA3 {

/**
* 中心座標から、指定された半径の円を描くx, y, w, hを求める。
*/
static Rectangle a(int cx, int cy, int r) {

int x = cx - r;
int y = cy - r;
int w = r + r;
int h = w;

return new Rectangle(x, y, w, h);
}

static GeneralPath b(/* 中心点 */int cx, /* 中心点 */int cy, int r, /* 扇の幅 */
int d_size,
/* 描く角度( から)*/ int startA,
int degree) {
Rectangle in_rec = a(cx, cy, r);
Rectangle out_rec = a(cx, cy, r + d_size);

Arc2D.Double out_arc = new Arc2D.Double(out_rec.x, out_rec.y,
out_rec.width, out_rec.height, startA, degree, Arc2D.OPEN);
Arc2D.Double in_arc = new Arc2D.Double(in_rec.x, in_rec.y,
in_rec.width, in_rec.height, startA + degree, degree * -1,
Arc2D.OPEN);

GeneralPath path = new GeneralPath();

path.append(out_arc, true);
path.lineTo(in_arc.getStartPoint().getX(), in_arc.getStartPoint()
.getY());
path.append(in_arc, true);
path.lineTo(out_arc.getStartPoint().getX(), out_arc.getStartPoint()
.getY());

return path;
}

static void p(Graphics2D g2d, int r, int w, int pos, Color[] cs) {
int pp = 360 / 20;
GeneralPath path = b(250, 250, r, w, /* スタート角度 */pp * pos, /* 角度 */pp);
if ((pos % 2) == 0) {
g2d.setColor(cs[0]);
} else {
g2d.setColor(cs[1]);
}
g2d.fill(path);

}

static class MyFrame extends JFrame {
{
getContentPane().add(new JPanel() {

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) g;

int[] r = { 0, 10, 30, 130, 150, 210 };
int[] w = { 10, 20, 120, 20, 60, 20 };
Color[][] cs = { { Color.BLACK, Color.BLACK },
{ Color.RED, Color.RED },
{ Color.BLACK, Color.YELLOW },
{ Color.RED, Color.GREEN },
{ Color.BLACK, Color.YELLOW },
{ Color.RED, Color.GREEN } };
for (int j = 0; j < r.length; j++)
for (int i = 0; i < 20; i++) {
p(g2d, r[j], w[j], i, cs[j]);
}
}

});
}

}

public static void main(String[] args) {

MyFrame frame = new MyFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 400);
frame.setLocation(300, 200);
frame.setVisible(true);

}

}