Maple Windows version running on FreeBSD!

终于成功地在FreeBSD上跑起了Windows版的Maple! Maple的界面部分是基于java的,内核不是。所以界面用FreeBSD Native JDK跑,内核用Wine跑,速度还是可以的,但估计比Linux版慢一些…… 先在Maple目录里建一个脚本,命名maple(为了简便),然后输入: java -Xmx567m -Ddefault.browser=”firefox %1″ -cp “java/mapleresource.jar:java/mapleresource_ja.jar:java/openviz2.jar: java/plot.jar:java/mapleclient.jar:java/maplewks.jar:java/mathdoc.jar: java/mathworksheet.jar:java/mail.jar:java/pen.jar:java/jai_codec.jar:java/jai_core.jar: java/WMFWriter.jar:java/wksloader.jar:java/mathxmltools.jar:java/mapletbuilder.jar: java/MapleActivation.jar:java/xercesImpl.jar:java/xmlParserAPIs.jar:java/xalan.jar: java/externalcall.jar:java/freehep-base.jar:java/freehep-graphics2d.jar: java/freehep-graphicsio-ps.jar:java/freehep-graphicsio.jar:java/freehep-graphicsio-pdf.jar: java/update.jar:java/jniwrap-2.5.jar:jre/lib/rt.jar” -Dmaple.bin.path=”/d/tools/math/maple/bin.win” com.maplesoft.worksheet.application.WmiWorksheet (不要换行) 这些都是参考了bin.win/maplew.exe的出错信息得到的。最后一个rt.jar是参考了前面那些库之后运行的出错信息得到的(里面说apache的XmlParserImpl找不到…… 基于一定在这里的信心,终于靠枚举找到……) 然后,运行它,你能看见界面出来了。但是,随便建一些东西,回车看看:出来一个“Waiting for kernel connection…”的框。命令行那里能够看见,原来是server不能启动,它启动的是maple.bin.path里面的mserver。所以在bin.win里面建一个脚本,叫mserver,内容如下: wine mserver.exe $* 1>stdout.txt 2>stderr.txt 再启动试试~ Maple出来了吧~ 随便算一个东西,也可以了~Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61997.aspx

Deadlock Appeared!

procedure TProducer.Execute; begin repeat if n=MAXN then self.Suspend else begin n:=n+1; WriteLn(‘Produced one item! n=’,n); if n=1 then cons.Resume; end; until false; end; procedure TConsumer.Execute; begin repeat if n=0 then self.Suspend else begin n:=n-1; WriteLn(‘Consumed one item! n=’,n); if n=MAXN-1 then prod.Resume; { GetItem; ConsumeItem; } end; until false; end; 运行一段时间之后,终于看见DeadLock了……Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61832.aspx

Learning Java

从前有过一段时间看Java,但是没有坚持看完。现在有时间了,终于可以好好看了。正好我有个想了很长时间的项目没有做:我家的ADSL上网是限时的,每个月只有30小时,所以需要一个计时工具。但是网上找来的都要注册,用得很不爽。而且我同时要在FreeBSD和Windows下面计时,因此需要一个跨平台的,这样的网上就更加没有了…… 就一直打算用Java自己写一个,现在就当作顺便学习学习Java,练练手吧。家里有一本TSU(TUP)出版的《Java语言与面向对象程序设计》,二表哥读书时候留下的,就当作教材了。看得差不多之后,就开始做项目了。其实Java的语法等和C基本上是一样的,面向对象的部分让我感觉怎么和C#一模一样……(其实是C#和他一模一样……),觉得把System.out.println换成Console.WriteLine,把import …换成using …,就差不多了…………主要的新鲜部分是Java的各种系统类、各种控件类,还有——Java damn的控件布局方式! 很难直接指定位置,虽然这样对放大、缩小有好处,但是设计界面的时候,真是………… 控件主要是参考JBuilder的Help,比看书有效~现在在用JBuilder,这个是很早以前装着的不知道干什么用的~ 开始用一直有问题,光标在这里,按键却发现输入在后面几个字符的地方………… 琢磨一阵后发现:凡是有保留字(显示用的是粗体)的地方后面就会有这种情况,一个保留字就差一格,两个差两格…… 于是到选项里面把保留字的粗体显示给去掉…… 世界恢复正常了~ 真是怪事~JBuilder似乎自己也是用Java编的? 至少界面可以变成Java经典界面~ 用起来有点慢(Borland 9系列的东西似乎都这样……),易用性还是不错地(我特别喜欢那个Smart indent,的确非常Smart~)从下午写到晚上,差不多基本功能已经好了(历史纪录也好了),但是还不能监测网络情况,需要点击Button来表示连接/断开。Java也还行了~PS:JBuilder 9 的那个 Borland Look And Feel 比 Java 标准和 Windows 标准都漂亮多了~ 能整合进去多好~Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61627.aspx

使用Winsock API发送/接收UDP包

其实Winsock这堆底层API和BSD都是一样的么…… 难怪令人怀疑这个是抄袭BSD的源代码……UDP比较简单,只要bind一下,RP好的话就可以发了。先 s: = socket(AF_INET,SOCK_DGRAM,0);成功的话,s已经是一个可以用的socket了。 然后要指明绑定的addrsa:sockaddr_in;fillchar(sa,sizeof(sa),0);sa.sin_family:=AF_INET;sa.sin_port:=htons(port);sa.sin_addr.S_addr:=inet_addr(PChar(address));address为地址(a.b.c.d形式),port为端口号。而htons作用是把以主机存储方式存储的port转换为网络上通用的port形式。 接着就可以bind了bind(s,sa,sizeof(sa));成功的话,netstat -an能够看见你所bind的端口号。 bind完了,这个socket和端口也就建立了联系,所有扔到这个口的UDP包都会给这个socket 接着可以直接用recv收。但是假如没有数据过来,程序就会卡在这里,多不好……所以用WSAAsyncSelect来指明当收到包之后给窗口发消息。WSAAsyncSelect(s,form1.Handle,WM_RECEIVED,FD_READ);WM_RECEIVED自己定义,FD_READ说明只关心收到消息。 接着让窗口收到这种消息的时候运行给定的proc先定义这个proc:Procedure TForm1.OnMyMessage(var Msg:TMsg;var Handled:Boolean);然后在FormCreate的时候告诉窗口:application.OnMessage:=OnMyMessage;这样就完了 收到消息后:  if Msg.message=WM_RECEIVED then(万一不是呢……)lParam的底字节代表具体情况(我们只关心FD_READ,所以这里只会是FD_READ)高字节为出错信息wParam为收到消息的那个socket,我们这里只有s,所以其实也一样然后就可以recv了recv(Msg.wParam,data,MAXMSG,0);不出意外,消息就在data里了~ 好好处理消息吧~ 记得最后closesocket(s)哦~ 以免资源浪费~   Old Blog Link: http://computer.mblogger.cn/henryhu/posts/61586.aspx