Squeakあれこれ

Squeak関連情報など

[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)

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

2005-04-23 | squeakあれこれ
以前、Socketが動かなくなったと書いたが具体的にはUDP受信ができないというもんだった。そこで昨日から本格的に調べてたんだが、どうもうまくいかない。というわけで、3.7.1のSocketPluginのソースを眺める。するとUDP受信でsqSocketSendDataBufCountが呼び出されている。なんで!?
int sqSocketReceiveUDPDataBufCountaddressportmoreFlag(
  SocketPtr s, int buf, int bufSize,  int *address,  int *port, int *moreFlag)
{
  int nRead;
  if(UDPSocketType != s->socketType) 
    return interpreterProxy->primitiveFail();
  /* bind UDP socket*/
  sqSocketConnectToPort(s, *address, *port);
  if(interpreterProxy->failed()) return 0;
  /* receive data */
  nRead = sqSocketSendDataBufCount(s, buf, bufSize);
  if(nRead >= 0) {
    *address= ntohl(ADDRESS(s)->sin_addr.s_addr);
    *port= ntohs(ADDRESS(s)->sin_port);
  }
  return nRead;
}

どうみても、sqSocketReceiveDataBufCountのような気がするんだが?
後で、最新ソースを
http://squeak.hpl.hp.com/svn/squeak/trunk/platforms
から引っ張ってみて確認しよう。

[Squeak][N7]XML-RPCサーバを動かす(1)

2005-04-01 | squeakあれこれ
なにをいまさらSqueakでXML-RPCサーバかと思われますが(実際多数の実装実績がある)、まぁスキルアップってことで。

まずXML-RPCサーバをインストールします。今までのおさらいの意味を含めてYAXO(XML-Parser)からのインストール方法を下記に示します。

  1. YAXOをSqueakMapよりインストール
  2. Spy-XML-RPCを試すを参考にSpy-XML-RPCをインストール
  3. Comanche/httpserverをインストールしてみるを参考に'Comanche/httpserver'をインストール
  4. Squeak SWikiよりXMLRPC-Server-mfrit.mczをダウンロードしてファイルリストよりインストール(SqueakMapではインストールに失敗する)

インストールはこれでOKのはずです。

次に下記に示すテスト用のクラスを作成します。これはRPCのAPIを実装するクラスとなるもので、文字列を引数にしてそれを評価した結果を返す、test.evaluateというAPIを用意します。
XMLRPCmyTest.st
詳細は次回で説明します。

HTTPサーバを起動します。
| ma xmlrpc |
xmlrpc := XMLRPCHttpModule new.
ma := ModuleAssembly core.
ma serverRoot: FileDirectory default fullName.
ma alias: '/xmlrpc' to: [ma addPlug: [:request | xmlrpc process: request]].
ma documentRoot: FileDirectory default fullName.
ma directoryIndex: 'index.html index.htm'.
ma serveFiles.
(HttpService startOn: 8080 named: 'httpd') plug: ma rootModule

Spy-XML-RPCで先ほどのAPIを実行します.次の内容をprint itします。
| url proxy |
url := Url absoluteFromText: 'http://localhost:8080/xmlrpc/'.
proxy := XMLRPCProxy withUrl: url.
proxy 
	invokeMethod: 'test.evaluate' withArgs: #('2 + 3')

どうですか?意外と簡単でしたね。次回は上記の内容を少し詳しく説明します。