» Publishers, Monetize your RSS feeds with FeedShow: More infos (Show/Hide Ads)
OR mapping中比较有意思的地方是各个object之间的关系。如果各个对象只能取到自己的属性,只能说面向对象的伟大理想实现了30%。
通过annotation的注释,可以申明各个javabean之间的关系1:n,n:n,n:1,1:1。
这样可以Group user.getGroup(), List
对于Group类:
@OneToMany(cascade=CascadeType.ALL,
mappedBy="group") private List
public List
return users;
}
public void setUsers(List
this.users =
users;
}
对于User类:
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name =
"groupId")
private Group group;
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group =
group;
}
通过上面的申明,可以使得User和Group之间建立起联系。
user.getGroup()会根据user表的groupid属性,去找Group类中的key id,然后知道数据库中映射的字段为mygroup表里面的id。自动关联并产生group对象。
同样的,group.getUsers()会根据方法的返回对象List
Group group = em.find(Group.class, new Integer(1));
System.out.println("get group users:"+group.getUsers().get(0));
运行结果是:
get group users:1,user1,Thu Dec 30 03:03:00 CST 1999,2009-11-01 00:00:00.0,333.11,id:1,name:group1,试用一下JPA - java persistence API,选择了使用Hibernate的实现。
记得n年前使用过Hibernate,当时还是2.0,2.1版本的。当时使用了大量的hbm文件来进行OR mapping。相当的繁琐。并且最麻烦的是要维护hbm和javabean的关系。当修改一个字段的时候,要同时打开2个文件修改;当使用javabean的时候,并不知道它的映射关系以及和其他pojo之间的关系是什么,要找到hbm才可以。
使用了annotation的JPA以后就舒服多了,首先是标准的API接口,不是Hibernate私有的API,这样可以使用标准的接口,而自由的选择各种不同底层实现。如Oracle的TopLink.再就是找OR映射关系,以及POJO字段,直接去javabean里面找就可以了,省了很多心。
ok,让我们开始了。
1,先来创建数据库
这里使用的mysql数据库。建立了user和mygroup表。一个user属于一个group,一个group可以包含很多user。很简单的关系。
# MySQL-Front 3.2 (Build 14.3)
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='SYSTEM' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */;
/*!40101 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */;
/*!40103 SET SQL_NOTES='ON' */;
# Host: localhost Database: test
# ------------------------------------------------------
# Server version 5.0.27-community-nt
DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test`;
#
# Table structure for table mygroup
#
CREATE TABLE `mygroup` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#
# Dumping data for table mygroup
#
INSERT INTO `mygroup` VALUES (1,'group1');
INSERT INTO `mygroup` VALUES (2,'newgroup');
INSERT INTO `mygroup` VALUES (3,'newgroup');
INSERT INTO `mygroup` VALUES (4,'newgroup');
INSERT INTO `mygroup` VALUES (5,'newgroup');
#
# Table structure for table user
#
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(255) default NULL,
`account` double default NULL,
`time` datetime default NULL,
`date` date default NULL,
`groupId` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `groupId` (`groupId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
#
# Dumping data for table user
#
INSERT INTO `user` VALUES (1,'user1',333.11,'1999-12-30 03:03:00','2009-11-01',1);
INSERT INTO `user` VALUES (2,'user2',13212.123123123,'1200-12-30 03:02:00','2100-01-12',1);
INSERT INTO `user` VALUES (3,NULL,333.11,NULL,NULL,1);
INSERT INTO `user` VALUES (4,NULL,333.11,NULL,NULL,1);
INSERT INTO `user` VALUES (5,NULL,333.11,NULL,NULL,2);
INSERT INTO `user` VALUES (6,NULL,333.11,NULL,NULL,3);
#
# Foreign keys for table user
#
ALTER TABLE `user`
ADD FOREIGN KEY (`groupId`) REFERENCES `mygroup` (`id`);
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
2,建立javabean
建立larry.Group
package larry;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "mygroup")
public class Group {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "id:" + id + ",name:" + name ;
}
}
3,建立运行类
packge larry;
import java.util.List;
import javax.persistence.*;
public class HelloWorld {
public static void main(String[] args) {
// Start EntityManagerFactory
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("helloworld");
// First unit of work
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
Group group = em.find(Group.class, new Integer(1));
tx.commit();
System.out.println("get Group:"+ group);
em.close();
emf.close();
}
}
4,创建persistence.xml
user password设置成自己的。注意,该xml要房子classpath下面.如META-INF/
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="helloworld">
<properties>
<!-- Scan for annotated classes and Hibernate mapping XML files -->
<property name="hibernate.archive.autodetection" value="class, hbm"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="use_sql_comments" value="true"/>
<property name="hibernate.dialect"
value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.connection.driver_class"
value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/test"/>
<property name="hibernate.connection.username"
value="root"/>
<property name="hibernate.connection.password"
value="root"/>
<property name="hibernate.c3p0.min_size"
value="5"/>
<property name="hibernate.c3p0.max_size"
value="20"/>
<property name="hibernate.c3p0.timeout"
value="300"/>
<property name="hibernate.c3p0.max_statements"
value="50"/>
<property name="hibernate.c3p0.idle_test_period"
value="3000"/>
</properties>
</persistence-unit>
</persistence>
/properties>
/persistence>
/persistence>
5, 下载hibernate/jpa libs
http://hibernate.org 可以下载。本人项目中包含以下jar。
2006-09-03 10:38 443,432 antlr-2.7.6.jar
2006-09-03 10:38 16,777 asm-attrs.jar
2006-09-03 10:38 26,360 asm.jar
2006-09-03 10:38 487,360 c3p0-0.9.0.jar
2006-10-19 05:22 282,338 cglib-2.1.3.jar
2006-09-03 10:38 175,426 commons-collections-2.1.1.jar
2006-09-03 10:38 38,015 commons-logging-1.0.4.jar
2006-09-03 10:38 313,898 dom4j-1.6.1.jar
2006-09-21 10:05 50,668 ejb3-persistence.jar
2006-11-10 07:35 363,627 hibernate-annotations.jar
2006-11-10 07:35 109,113 hibernate-entitymanager.jar
2006-11-10 07:35 322,763 hibernate-tools.jar
2006-11-10 07:35 2,185,080 hibernate3.jar
2006-10-19 05:17 643,806 hsqldb.jar
2006-09-03 10:38 446,045 javassist.jar
2006-09-03 10:38 12,539 jboss-archive-browsing.jar
2006-09-03 10:38 8,812 jta.jar
2006-10-19 05:17 358,180 log4j-1.2.13.jar
6,运行larry.HelloWorld.java:
get group users:1,user1,Thu Dec 30 03:03:00 GMT 1999,2009-11-01 00:00:00.0,333.11,id:1,name:group1,
|
function f1(name)
{
var v1 = f2(name){ alert("Hello! "+name); }
return v1;
}
var v2=f1("jungleford"); |
|
typedef void (*F)(char* name);
void f1(char* name, F f)
{
f(name);
}
void f2(char* name)
{
printf("Hello! %s", name);
}
int main(int argc, char* argv[])
{
f1("jungleford", f2);
} |
Predicate:把判断逻辑(if,switch)操作数化,就是得到一个程序流分支。
Transformer:把从对象构造另一个对象的过程操作数化。
Closure:把业务逻辑(广义上的函数)操作数化。
基本上现代的操作系统都有自己类似与Linux中epoll的实现,在Solaris 10中我们可以选择使用/dev/poll或者Event Completion Framework。
/dev/poll 或者叫做poll(7d)是一个特别的Driver,可以让你高效的poll大量的File Descriptor。因为/dev/poll将整个poll动作在内核中完成,具体使用可以查看Solaris Man Page,里面有一些实际的代码可供参考。
-bash-3.00$ man -s 7d poll
或者访问docs.sun.com: http://docs.sun.com/app/docs/doc/816-5177/6mbbc4g9q?l=zh&a=view
这里有一篇比较老的文章,大家也可以参考一下,里面有一些Benchmark数据:
http://developers.sun.com/solaris/articles/polling_efficient.html
不过这个机制,现在不推荐大家使用了,因为Solaris 10推出了更为出色的解决方案Event Completion Framework,也叫做Event Port。这个Framework提供更方便的Event-Driven 实现机制,更加优秀的API,抽象化操作各种Event,包括File descriptors, Sockets, Timers, Pipes, Message Queues, Asynchronous I/O, 自定义Events。具体可以参考这份文章,里面还有针对其它操作系统各自epoll实现的比较:
http://developers.sun.com/solaris/articles/event_completion.html
Solaris Man Page:
-bash-3.00$ man port_create
docs.sun.com: http://docs.sun.com/app/docs/doc/816-5168/6mbb3hris?l=zh&a=view
Sun的工程师Dave Pacheco就这些Solaris上的Poll方式做过一些Benchmark的值,大家可以访问他的Blog (http://blogs.sun.com/dap/entry/event_ports_and_performance)。
各个操作平台上都虽有Solaris的epoll实现
各自epoll实现,很可惜这个方式还未标准化。不过一些开源的软件已经就此做了一些努力,尝试对这些系统之间差异的函数做了封装,比如Apache的APR (http://apr.apache.org/),它为UNIX/Linux程序抽象了底层平台各自的实现,包括Solaris的Event Completion Framework,BSD的Kqueue,Linux的epoll和poll。或者也可以参考使用BSD License的libevent(http://www.monkey.org/~provos/libevent/)。最近看到一个非常有趣的推广活动, Sun搞的,叫做 "Temple of the Sun":打Flash游戏,寻找C/C++程序Bug。奖金还挺高的,$5,000美金呢。可参与的地区包括中国。是一个难得的机会,活动到6/19/2007,大家可千万别错过。
活动游戏地址:http://www.sun.com/templeofthesun
最近终于说动领导,给会议室用的本本装Solaris。笔记本是一台Toshiba Portege M500。通过SAID盘安装的Solaris Nevada Build 60。
装完后居然有线和无线网卡都没认。
有线网卡是 Intel PRO/100 VE
无线网卡是 Intel PRO/Wireless 3945ABG
试了一下午了,终于把有线网卡装上了,无线还在努力ing
1. 使用 /usr/X11/bin/scanpci 查看系统上的PCI设备:
pci bus 0x00003 cardnum 0x08 function 0x00: vendor 0x8086 device 0x1092
Intel Corporation PRO/100 VE Network Connection
2. 编辑/etc/driver_aliases,增加以下内容
iprb "pci8086,1092" (iprb是intel网卡的接口名,后面的id是刚刚用scanpic查到的 8086是venderid)
3. /boot/solaris/devicedb/master文件,加入以下内容:
pci8086,1092 pci8086,1092 net pci iprb.bef "Intel Pro/100 VE Network Connection"
4. 运行devlinks
5. 运行touch /reconfigure
6. 重新启动系统
7. ifconfig iprb1 plumb
1. 使用 /usr/X11/bin/scanpci 查看系统上的PCI设备:
pci bus 0x00003 cardnum 0x08 function 0x00: vendor 0x8086 device 0x1092
Intel Corporation PRO/100 VE Network Connection
2. 编辑/etc/driver_aliases,增加以下内容
iprb "pci8086,1092" (iprb是intel网卡的接口名,后面的id是刚刚用scanpic查到的)
3. /boot/solaris/devicedb/master文件,加入以下内容:
pci8086,1092 pci8086,1092 net pci iprb.bef "Intel Pro/100 VE Network Adapter"
4. 运行devlinks
5. 运行touch /reconfigure
6. 重新启动系统
7. ifconfig iprb1 plumb
Toshiba Portege M500 网卡安装
背景:实验室的机器有两个操作系统:windows 2000和 windows xp,windows 2000安装在C盘主分区,windows xp安装在E盘,E盘是一个逻辑分区
f盘是我准备安装SOLARIS的磁盘。也是系统最后一块磁盘分区,我用磁盘工具将f盘的分区信息删除,系统显示其为未划分空间。然后后开始用自动安装盘安装solaris10,出现报错信息如下:
在实验室用自动安装盘安装solaris的时候我遇到过如下一个问题:
背景:实验室的机器有两个操作系统:windows 2000和 windows xp,windows 2000安装在C盘主分区,windows xp安装在E盘,E盘是一个逻辑分区
f盘是我准备安装SOLARIS的磁盘。也是系统最后一块磁盘分区,我用磁盘工具将f盘的分区信息删除,系统显示其为未划分空间。然后后开始用自动安装盘安装solaris10,出现报错信息如下:
<<<using DVD install_config>>>
not found
...............
WARNING:Not enough free space to create Solaris fdisk partition(c0d0)
...............
ERROR:At least one 30 Mbyte Solaris fdisk paritition is required on a selected
drive.
ERROR:Flash installation failed.
Solaris installation program exited.
这个错误的意思是:由于没有足够的磁盘空间,(solaris的fdisk要求至少30M的磁盘空间)所以安装失败。
自 动安装盘应该是找到系统最后一块未划分的空间来进行自动安装,这个错误说明自动安装盘没有找到我划分出来的空间,后来我发现原因是由于实验室的机器的网卡 上安装了还原芯片,系统还原功能在硬盘最后的一个10M左右的隐藏分区里保留了还原系统所需要的信息。所以自动安装盘在安装过程中,找到的是这个隐藏分 区,而不是我划分的空间。很多的笔记本电脑也会存在同样的问题,厂商在硬盘的最后空间往往放置了系统恢复或者还原的信息。所以使得自动安装盘找不到前面的 磁盘空间。
解决方法:由于自动安装盘安装的过程无法人工干预,所以基本上只能破坏隐藏空间的分区信息才能完成安装。或者大家可以尝试改写自动安装的脚本,需要认真学习一下Jump Start定制安装的相关知识
我 的做法是:没有用自动安装盘,改用普通安装盘。普通安装盘可以在最初的阶段进行磁盘的分区。在分区的时候,将最后的10m左右的空间让出来作为自由空间, 这样可以不破坏还原卡的隐藏空间(这个做法对于南京远志的还原卡是有效的,对其他的还原卡没有验证),然后再进行solaris 10的安装。
安 装完成后: 发现出现了另外一个问题,solaris自带的Grub引导项为,solaris和windows.但是进入window的引导程序后,windows 2000可以引导,但是windows xp的引导失败了。进入windows 2000后,尝试修改boot.ini中windows xp的引导磁盘编号都失败了。
后来找到原因是由于分区的顺序混乱了,solaris的分区插在了windows的逻辑分区中间,所以c盘的主分区中windows的引导程序找不到被不明分区(Solaris分区)挡住的另外的逻辑分区了,导致了引导失败。
解决方法:用分区工具,比如pqmagic将windows xp的分区装换成主分区,我转换的时候没有丢失任何文件。
OK, 三个系统终于安装成功了。 cheers :)
很久没来这里灌水了,今天不说技术,来点轻松的话题。平时上班途中,坐公车的时候就习惯了听收音机,而且只听一个频道,中国国际广播电台的Easy FM,对小飞和喻舟的Easy Morning很是喜欢,听上一个小时的节目,总是能让自己有一个好心情,现把这两天听到的笑料整理一下(可能不是完全的原话,大概意思吧):
1,默契
喻舟(念听众的短信):我和老公十分的默契,经常同时说出同样的话来,至少有100次这样的事情了
小飞:恩,两个人相对坐着,突然互相说:“去死吧”
喻舟(狂笑中)
2,广告
小飞(还是念听众的短信):我有个5岁小侄女,经常说广告里的词啊
小飞(学老外说中文的声音):洗洗真舒服
喻舟又狂笑
REST虽然不是一种标准,但是它是使用的都是标准:
*http
*URL
*xml/html/gif/jpeg/etc (资源的表现)
*text/xml, text/html, image/gif, image/jpeg, etc (MIME types)
以一个仓库公司的REST系统为例:
为了让client可以得到一系列资源的状况,client可以通过下列URL来得到parts列表:
http://www.parts-depot.com/parts
下面是client得到的文档:
<?xml version="1.0"?>
<p:Parts xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part id="00345" xlink:href="http://www.parts-depot.com/parts/00345"/>
<Part id="00346" xlink:href="http://www.parts-depot.com/parts/00346"/>
<Part id="00347" xlink:href="http://www.parts-depot.com/parts/00347"/>
<Part id="00348" xlink:href="http://www.parts-depot.com/parts/00348"/>
</p:Parts>
(其实client可以得到其他的资源表现方式,这里假设是希望得到xml格式的表示-利于machine与machine之间进行对话)
这里返回的内容中有link,这样可以使得client从一个状态到下一个状态)
得到具体的信息
http://www.parts-depot.com/parts/00345
client接收到:
<?xml version="1.0"?>
<p:Part xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part-ID>00345</Part-ID>
<Name>Widget-A</Name>
<Description>This part is used within the frap assembly</Description>
<Specification xlink:href="http://www.parts-depot.com/parts/00345/specification"/>
<UnitCost currency="USD">0.10</UnitCost>
<Quantity>10</Quantity>
</p:Part>
提交PO
client提交一个新的PO.xml,放在http POST里面。
PO的service返回一个URL,这样client可以以后update/edit这个resource。这样这个PO就在client和server之间共享,并且被server暴露成一个web s
首先,什么是REST?
REST : REpresentational State Transfer
代表性状态传输旨在反映设计良好的 Web 应用程序的行为图像:由网页组成的网络,其中用户通过选择链接继续进行使用,选择链接将导致将下一页传输给用户并进行呈现,以供其使用。
创建 REST 的目的是为了提供有关 Web 应该如何运行的设计模式,并作为 Web 标准和设计 Web 服务的指导框架。
只能在 HTTP 上工作。
并没有很多实现库可用。
体系结构参考。不需要标准(非标准的)。
特定于实现。
一个老外的几句话说的挺明白的(是不是英语表达本身就比较概要。。。)不多翻译了,我把重要的地方都注出来了
REST's URL-style lookup model is eminently familiar to all Web users and is just one way that REST leverages the successful aspects of existing Internet protocols.
To cap off the REST model, the URI and an HTTP verb (GET, POST, PUT, DELETE) are used together to issue a request to a REST Web service to access and manipulate the server-side state, or data record, identified by the URI.
The actual XML message is contained in the HTTP request and security is provided by HTTPS.
两句话总结:对用URI定位的服务器的某artifact进行(get/post/put/delete)操作。用xml信息放在http request里面,安全性可用https来保障。
它是和什么概念平级别的?
和XML-RPC(ajax最近用的很多。。。),soap(不用介绍这个了吧,呵呵。最近比较熟悉)
它和其他技术规范相比,优势在于、劣势是?
人家老外总结的挺好,在下就不多言语了。。。
REST
SOAP
- Messages are represented in plain XML
- HTTP is used for the transfer protocol
- HTTP verbs are used for access/manipulation commands
- URIs are used to uniquely identify resources in message
- HTTP authentication provides security
- There is no formal method for expressing the interface contract
- Messages are represented in a standardized XML SOAP "envelope"
- Can be bound to various protocols including HTTP and SMTP
- Access to and manipulation of data are application specific
- Security is not described by SOAP and is to be provided by the developer
- XML schemas are used to define the contract between client and service
从最后一句看,REST的plain XML是没有schema的了。也就没有namespace。看来REST在企业级应用中会有一定的劣势,但是轻便简单容易理解肯定是它最大的优势了。(想起当时第一次看soap信息... 如果不是工作的养家户口的动力... -_-b)
后面将会具体看看REST是个什么东西了,会有具体的code的。
TO BE CONTINUED
全文请参见:
http://developers.sun.com.cn/home/export/sites/default/home/ISVs/docs/docs/RBAC_Identity_Manager.html
Sun Fire X4500 服务器(代号 Thumper)将世界上一流的服务器和存储器技术组合在一个服务器中,从而可输出高性能的 I/O。该服务器将四路 x64 服务器与多达 48 个磁盘驱动器和 24TB 存储器组合在一起, 使存储成本降为 2 美元/GB。另外,由于 Sun Fire X4500 服务器还捆绑了 Solaris ZFS,因此您可以在非常大的数据集内保持数据完整性。
有没有想过利用Sun的ZFS文件系统创建一个自己的Thumper呢?
德国的CSI(Computer Systems Integration)提供了一段video,向你介绍了如何利用ZFS将若干个U盘“捆绑”在一起,提供一个大容量、高性能、可靠的存储空间。
视频在这里:http://video.google.com/videoplay?docid=8100808442979626078
乌克兰基辅,和北京时差5小时(晚)
来基辅的飞机是10月18号的,直到16号下午才拿到签证,还以为来不了了。在北京拿签证是太难了,本来以为没多少人会来乌克兰,签证会好拿。最初的想法也对也错,对的是每天也就十几号人来办签证,错的是这十几号人对乌克兰使馆来说以经很多了,他们每天只有两个小时接受申请。第一天是十点到的,排到十二点,使馆下班了,前面还有五、六个人,未果。只好委托给使馆外的“专业人士”代办,价格1000元/人。“专业人士”觉得邀请信不正规,但答应试试,为以后他们提价到4000元打了附笔。还好,Joey比较机灵,马上就发信给乌克兰的同事反映了情况,要有国徽印的邀请信。后因“专业人士”要价太高,我们撤回了第一次申请。还好,正规的邀请信在国庆长假后及时寄到,我们才能再次提交了申请,不过还是付给了“专业人士”200块买了个排队的号,否则也没戏,别人都是凌晨两点开始排队,我们9点到是没有希望能递交申请的。乌克兰使馆的低效着实养活了一批人。
飞机辗转维也纳总共飞了13个小时总算到了基辅,以经是凌晨了。刚下飞机我只披了件甲克里面是件T恤,着实把我冻坏了,10月的基辅已经可以比拟北京的初冬了,气温也就几度,还好我有了莫斯科的经验,带了足够的衣服。
基辅的街头美女真是不少,高挑,凸凹有致的身材加上精致的五官,白皙的皮肤,金色的头发,害的我和Joey上街时把头都扭酸了。餐馆里的服务员绝色美女比比皆是,甚至有的厨师也是脸蛋粉扑扑的刹是好看。在中国长得有如此姿色得女人是不会干餐馆服务生的。不过这些美女都很冷,大有冰美人的风范。男的却走向了另一个极端,长得好看的不多,圆圆的脸配上厚实的北极熊的身材,穿着皮衣,总是给人像是黑手党的感觉。我们从机场搭的士去旅馆的路上一直惴惴不安,语言不通,又读不懂路标,的士司机还一副黑手党的尊容,忍不住在心里把老板和老板他自己都不知道存在的祖先统统数落了一通。旋着的心直到了旅馆才落下来,实在忍不住多给了司机5个美元,难道是下意识里感谢他的“型”不副实?后来通过几天的接触,我才发现乌克兰人其实是很朴实的,开始时错怪他们了。
基辅的旅馆一般般了。第一天住的Rus Hotel最多也就三星了,屋子虽不小,还是个套间但装修比较陈旧,和上海金贸的金壁辉煌是没的比,连窗帘都拉不拢。设施也一般,连网口都没有。可是价钱可不菲,一晚上要1040乌克兰元,换成人民币也快两千了。后来换到了Radisson,装修好多了,家具新多了,也能上网了,当然价格也上了一个台阶,一下蹦到了350欧元每晚。预算肯定要超了,也不知道回去能不能顺利报销。
基辅没有太多的高楼,比较新的楼也不多。临街的楼涂得花花绿绿得,虽然颜色褪得很厉害,看上去还不错,也很干净。但顺着小巷子看进去,里面的建筑物就相当的陈旧了,表面的石灰膏大多都已脱落,地面也是坑坑洼洼的泥地,门也歪歪斜斜地勉强支撑着,一副破败得景象。基辅也算是乌克兰的首都了,连首都都这样,其它地方可想而知,想必乌克兰的经济不会好到哪去。在一个景点前,我居然被乌克兰大妈拉着一块合影,看来我这样的东方面孔在这里是很少见了,以至于大妈把我当成了稀奇的物件。一个连中国人都不愿意来的地方,是不是也从侧面说明当地的经济的的确确是相当的不活跃呢?可是为什么物价那么贵呢?我也没看见象莫斯科那样的实行外国人和本地人双重价格的现象,连我花公司的钱都觉得贵的价格,当地人怎么承受得起?
基辅的旅游景点主要是教堂,方方正正的巴洛克建筑,白色的墙,绿色的屋顶加上黄潺潺的塔尖,刹是好看。美中不足的是所有教堂(至少著名的那几个)都沿袭相同的风格,致使我和Joey在短短的一个下午就产生了审美疲劳。结婚的人特多,Sophia教堂前的广场几乎都让结婚的人们占据了,以至于都实行了交通管制。我都怀疑10月21号是不是乌克兰的黄道吉日。乌克兰女的本来就漂亮,穿上白色的结婚礼服让我恍惚认为是仙女下凡尘,本想凑近抓拍几张相片的,没敢,不了解乌克兰民风,怕引起国际纠纷。后来总算看见一个不是那么漂亮的新娘,于是感叹想找一个不漂亮的新娘是很不容易地。教堂中Kyievo-Pechers’ka National Preserve的教堂是维护得最好的了,而且没被开发成景点仍是信徒供奉上帝的地方,有修道士,定期举行法事,人们都相当的虔诚,进教堂前必画十字、鞠躬。我们听见唱圣歌的声音,寻着声音进了一个Cathydra,发现人们默立着正在做祈祷,我们怕亵渎了神灵赶紧走了出来。
在Joey的鼓动下我们体会了一下基辅的地铁。进了站走上浮梯,我们马上觉得有点怪,那浮梯的速度相当快,比北京的浮梯快了至少三倍,我们正奇怪着,浮梯过了开头平坦的部分开始下降,我们立马就明白那浮梯为什么那么快了,因为地道挖得深。那浮梯差不多成45度角,我们望下去,发现那浮梯得有300到400米那么长,浮梯底端的人都变成了小小的蚂蚁了。即使浮梯那么快我们还是花了大约两分钟的时间才降到底,有些人干脆就坐在浮梯上了。浮梯旁的广告牌浩浩荡荡一列排下去颇是壮观,可惜我们去讨论乌克兰人挖这么深的地道是不是为了防原子弹了,没想起来应该照张相。到了底部我们就更挠头了。我们拿的是英文地图,站名却是乌克兰文,根本对不上!乌克兰文和俄文相似,属斯拉夫语系,走的不是英文的拉丁语系,虽然也是拼音,但字母完全和英文是两回事,对不上!虽然我们手里拿着地图,可我们想搞清我们在哪一站都不可能。不得以,抓住一个美女就问,运气还好,美女懂一点英语,在图上指出了我们的位置和我们要去的地方。既然看站名是不灵了,就记座几站吧,勉强也把我们送到了目的地。乌克兰的地铁也是相当的老旧,但很宽敞,开得也快,班次也多,平均一、两分钟就一辆,很方便。价格很便宜,一张票半个乌克兰元,相当一块钱。我和Joey高价惯了,递进50乌元买两张票,还怕不够,当售票员找回49块时,我脑子里还在想她肯定是搞错了。我觉着这个价钱才和当地的经济相匹配。
邀请您参加上海OpenSolaris用户组第二次活动
时间: 2007年3月17日周六下午1:00 - 5:00
地点:
上海市汉口路398号华盛大厦907室(近中山西路),Sun上海培训中心。乘地铁可在二号线南京东路下车。
参加办法:
回邮件到shosugevent at gmail.com
请在邮件主题上“注明参加3月17日OpenSolaris活动”
日程安排:
1. 介绍OpenSolaris特性。以DTrace 和系统性能为重点。(Xinfeng Liu)
2. 介绍利用OpenSolaris提高开发效率。(Xinfeng Liu)
3. 介绍OpenSolaris社区的项目。(Adam Zhang)
4. 自由活动时间,互相认识,一起讨论我们用户组的今年计划。
地图:
关于上海OpenSolaris用户组(SHOSUG):
该用户组旨在为上海及周边地区的Solaris/OpenSolaris的爱好者,开发者提供一个技术交流的平台。我们希望通过这个平台在推广OpenSolaris同时,能够一同促进OpenSolaris社区的发展。
用户组的官方网页是:
http://www.opensolaris.org/os/community/os_user_groups/shosug/
我们提供了一个线上交流的平台。我们有一个邮件列表,访问链接即可订阅:
http://mail.opensolaris.org/mailman/listinfo/ug-shosug
以往活动归档链接:
http://www.opensolaris.org/os/community/os_user_groups/shosug/archived_events/

Darkstar 是Sun主推的开源game server project。Darkstart project 是集合了一些强大的技术,它帮助开发者关注在game开发本身,而不是game server的基础平台。
目前Sun正在努力退出一套可以免费download的SDK来让游戏开发者开发client side和server side的code。
Project Darkstar包含了ea的SDK和Sun Game Server(SGS)。
目前EA的SDK可以支持WAN和LAN的游戏开发,大概可以支持20到50人同时在线。
Sun Game Server
SGS是可以可扩展的,并且可以支持增量式的扩展。独一无二的SGS技术架构使得许多不同的游戏可以同时存在在同一个平台基础上。
开发成本来说,优势有:
- Streamlined development
The game programmer simply writes event-handling code; the system does the rest. Coding for massively scalable multiplayer game servers takes months rather than years. - Zero server-side investment risk
There is nothing to buy up front; the SDK is free. - Massive scalability
The SGS is designed to be more scalable than any other game server solution in the market. - Full persistence
There is no database code to worry about; players can make permanent changes as they play. Every object in the system is innately persistent. - "5-nines" fault tolerance
Even if a server completely fails, that failure is hidden from the user and will not interrupt game play. Companies can add or remove servers, patch server code, or even roll back patches all without interrupting players. - Client agnosticism
Sun provides APIs for C++, the Java Platform, Standard Edition (Java SE platform), and the Java Platform, Micro Edition (Java ME platform) (cell-phone Java software). The connection API is developer extensible, making it possible to add unique clients and connection strategies.
总结
其实这样说来,从开发角度,有些特性可以研究研究,
比如
- runtime的server update/add/remove "5-nines" fault tolerance
- j2me的支持。具体是怎么在server对j2me支持的(需要吗,和普通pc client有不同?数据量优化?),客户端的支持(有没有)
- Full persistence。这个是最有意思的。它要解决不同node/instance同步persistence问题,cache和persistence的冲突,具体怎么订立persistence的粒度,persistence的效率。







