Squeakあれこれ

Squeak関連情報など

[Squeak]サムネイルとプロジェクトファイル(3)

2005-05-28 | squeakあれこれ
ひさびさの更新です。Yaxoとかの解析とかしててblogから遠のいてました。

前回はWorkspaceから操作する方法であったが,Projectメニューの'手元のディスクにだけプロジェクトを保存する'で保存できるようにProject>>writeFileNamed:fromDirectory:toServer:を下記のように変更した。これでメニューから保存できるようになった。だが、読込はどうしようか?やはりProjectメニューの'プロジェクトをファイルから読込…'にいれるべきかな。読み込みも出来て、ある程度テストしたらチェンジセットにまとめて公開します。
	| local resp gifFileName f project writer projectFile |

	projectFile := localDirectory oldFileNamed: localFileName.
	gifFileName _ self name,'.png'.
	localDirectory deleteFileNamed: gifFileName ifAbsent: [].
	local _ localDirectory fileNamed: gifFileName.
	thumbnail ifNil: [
		(thumbnail _ Form extent: 100@80) fillColor: Color orange
	] ifNotNil: [
		thumbnail unhibernate.
	].
	f _ thumbnail colorReduced.  "minimize depth"
	f depth > 8 ifTrue: [
		f _ thumbnail asFormOfDepth: 8
	].
	project := FileStream readOnlyFileNamed: projectFile fullName.
	project binary.
	writer := PNGSqeuakObject on: local.
	[ writer nextPutImage: f interlace: 0 filter: 0 Object: project contents]	
		ensure: [local close. project close. projectFile close.].
	[local _ StandardFileStream readOnlyFileNamed: (localDirectory fullNameFor: gifFileName).
	(primaryServerDirectory isKindOf: FileDirectory)
		ifTrue: [primaryServerDirectory deleteFileNamed: gifFileName ifAbsent: []].
	resp _ primaryServerDirectory putFile: local named: gifFileName retry: false.
	] on: Error do: [:ex |].
	local close.

	primaryServerDirectory updateProjectInfoFor: self.
	primaryServerDirectory sleep.	"if ftp, close the connection"

[Squeak]サムネイルとプロジェクトファイル(2)

2005-05-18 | squeakあれこれ
 とりあえず使い方とソース。クラス名などへぼへぼですが、PNGのチャンクの操作方法のサンプルということで。
プロジェクトファイル(名無し2.001.pr)とそのサムネイル画像(名無し2.gif)からプロジェクトファイルを埋め込んだPNG画像(002.png)生成:
| writer image project newName  |
project := FileStream readOnlyFileNamed: '名無し2.001.pr'.
project binary.
newName := '002'.
image := ImageReadWriter formFromFileNamed: '名無し2.gif'.
writer := PNGSqeuakObject on: (FileStream newFileNamed: newName, '.png').
[ writer nextPutImage: image interlace: 0 filter: 0 Object: project contents]	
	ensure: [writer close. project close]

上記PNG画像からプロジェクト読込:
| reader |
reader := PNGSqeuakObject on: (FileStream readOnlyFileNamed: '002.png').
reader nextImage

ソースプログラム:
PNGSqeuakObject.st

[Squeak]サムネイルとプロジェクトファイル(1)

2005-05-17 | squeakあれこれ
 プロジェクトをファイル保存するとサムネイル画像(gif)とプロジェクトファイルを圧縮したファイルができるが、どうもうまく管理するのが難しい。そこでサムネイル画像側のリソースにプロジェクトファイルを埋め込むことを思いつく。
 画像にリソースを埋め込める画像形式としてTIFFやPNGがあるが、TIFFはSqueakで正式サポートされていない。というわけでPNG画像に独自のプライベートチャンクを付加してそこにプロジェクトファイルを埋め込んでみた。プライベートチャンクならば通常の画像表示時には無視される。コーディングはProjectLoadingクラスの#openName:stream:fromDirectory:withProjectView:を参考にPNGReaderWriterクラスを継承したクラスに実装した。このメソッドはかなり込み入っているので、ここ2,3日費やしてしまった。現在の実装は予め保存したプロジェクトファイルとサムネイル画像(gif)からプロジェクトを埋め込んだPNG画像を生成する。PNG画像読込時に該当するプライベートチャンクがあれば、プロジェクト読込処理を行うようにした。
 ソースなどはもう少しチェックしてから公開します(といっても、利用する人はいないだろうが)。

[Squeak][N7]UDP受信できず #2

2005-04-23 | squeakあれこれ
で、http://squeak.hpl.hp.com/svn/squeak/trunk/platforms から最新ソースを取ってきて見たけどやっぱり、sqSocketSendDataBufCountとなっていた。

そこで、初めてVMをbuildしてみた。例の部分をsqSocketReceiveDataBufCountに直して、VMMakerでGenerate Allを実行して、build.batを実行してみる。すると,Squeak.exeとFFTPlugin.dllが出来た。でも配布されているのはSqueakFFIPrims.dllで名前が違う。何か間違えたかも。不安を残しつつ、UDP受信コードを実行したら、動いた(ちゃんと受信できた)!もしこんなのが原因だったら、すぐ直されてるだろうし。もしかしたら、動かしているメソッドがすでに、Obsoleteだったりして。。。もしわかる人がいたら、教えて欲しいな。でそのコードを
| listen port buff received |
buff := ByteArray new: 100.
port := 55555.
listen := Socket newUDP  setPort:  port.

[
	received := listen receiveUDPDataInto: buff.
	received first = 0] whileTrue.
Transcript show: buff.
received inspect.
listen close

[Mingw]winsock2 and dll

2005-04-23 | 一般
■Mingwでwinsock2プログラムを作成する場合
 gcc -mwindows hogehoge.c -lws2_32

■DLL作成 Makefile:
DLL_NAME = app.dll# created by dllwrap
DLL_EXP_DEF = app.def# created by enhanced dlltool
DLL_EXP_LIB = libapp.a# created by any version of dlltool

DLLWRAP_FLAGS = --driver-name $(CC) --def $(DLL_EXP_DEF)

$(DLL_NAME): $(DLL_OBJS) $(DLL_EXP_DEF)
	$(DLLWRAP) $(DLLWRAP_FLAGS) -o $(DLL_NAME) 
	$(DLL_OBJS) $(DLL_LDFLAGS) $(DLL_LDLIBS)

$(DLL_EXP_LIB): $(DLL_EXP_DEF)
	$(DLLTOOL) --dllname $(DLL_NAME) --def $(DLL_EXP_DEF) 
		--output-lib $(DLL_EXP_LIB)

$(DLL_EXP_DEF): $(DLL_OBJS)
	$(DLLTOOL) --export-all --output-def $@ $(DLL_OBJS)