lizongbo at 618119.com 工作,生活,Android,前端,Linode,Ubuntu,nginx,java,apache,tomcat,Resin,mina,Hessian,XMPP,RPC

2008年01月31日

Java和Php的多国语言资源文件编辑工具

Filed under: Java,JAVA IDE — 标签:, — lizongbo @ 10:00

java使用properties文件来存放多国语言信息,编辑java的properties文件,
可以用一些java ide自带的插件,也可以使用可独立运行的langproper,

来自: http://sourceforge.net/projects/popeye

langproper可以方便的切换文本的正常内容和编码后的内容,支持同时将多种语言一起显示,方便对照修改。

下载地址为:
http://jaist.dl.sourceforge.net/sourceforge/popeye/langproper-0.54-source.jar
http://nchc.dl.sourceforge.net/sourceforge/popeye/langproper-0.54.jar

php一般用po文件存放多国语言信息,po的源文件是mo文件,
比较好用的编辑工具是poedit,来自: http://www.poedit.net/download.php#win32

参考: http://www.chedong.com/blog/archives/001115.html
下载地址为:
(windows版) http://nchc.dl.sourceforge.net/sourceforge/poedit/poedit-1.3.9-setup.exe

2008年01月29日

关于分布式负载均衡的几个设置

Filed under: DNS,JavaScript — 标签:, , , — lizongbo @ 08:38

服务器对外的展现要统一,简洁。
即用户在URL里看到的地址是很方便记忆的。

而对于页面中嵌入的图片,脚本,样式表,视频,音频等文件,则可以放在其它服务器上。

第一层: DNS记录轮询负载均衡
www.google.com为例进行分析
1.首先是将 www.google.com,指定多个cname,根据不同的网络线路请求得到不同的别名

比如在中国得到的别名为:www.l.google.com,
www.l.google.com 的别名为: www-china.l.google.com

www-china.l.google.com再指定多个ip的a记录,
例如 ip 64.233.189.99, 64.233.189.104,64.233.167.147.

99,104,147这三个ip分别实现ip别名绑定,即如果99这个ip挂了,104会自动接管该ip到本机。

通过这样的方式,保证用户最终访问到的ip始终在线。

在cname解析的地方,可以使用多层cname解析,以实现更细粒度的负载均衡并灵活切换。

假设当www-china.l.google.com下整个节点都断网了,则只需要将www.l.google.com指向www-usa.l.google.com这样就可以切换了。

(纯属猜测:指定了cname的域名,则不要再配置a记录,因为a记录的优先级比cname高。)

dns解析过程记录如下:

[code]
E:\>nslookup
DNS request timed out.
timeout was 2 seconds.
*** Can’t find server name for address 192.168.18.1: Timed out
*** Default servers are not available
Default Server:  UnKnown
Address:  192.168.18.1

> server 202.96.128.86
DNS request timed out.
timeout was 2 seconds.
Default Server:  [202.96.128.86]
Address:  202.96.128.86

> server 202.96.128.86
Default Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

> set q=cname
> www.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

Non-authoritative answer:
www.google.com  canonical name = www.l.google.com
> www.l.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

Non-authoritative answer:
www.l.google.com        canonical name = www-china.l.google.com
> www-china.l.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

l.google.com
primary name server = f.l.google.com
responsible mail addr = dns-admin.google.com
serial  = 1331146
refresh = 900 (15 mins)
retry   = 900 (15 mins)
expire  = 1800 (30 mins)
default TTL = 60 (1 min)
> set q=a
> www-china.l.google.com
Server:  cache-a.guangzhou.gd.cn
Address:  202.96.128.86

Non-authoritative answer:
Name:    www-china.l.google.com
Addresses:  64.233.189.99, 64.233.189.104

[/code]

(也可用这个命令查询: dig @202.96.128.86 www.google.com +trace)

第二层,服务端请求分发。

前端的ip得到客户端的请求,并不是在本机进行业务逻辑处理,而是对请求进行初步解析过滤,再分发给其它服务器进行处理,
请求分发规则通常是基于url的,也可根据其它附加条件进行分发,例如GET/POST,user-Agent,remoteAddr,urlhash等。

第三层:客户端分发请求。

通常用于对图片资源的请求进行分发,按找浏览器的默认限制,对同一服务器的并发连接不超过2个,
因此,假设一个网页里要显示40张图片,而这40张图片,如果使用同一个域名的话,及时后台做了请求分发,
而受浏览器的限制,假设一秒中下载两张图,打开这40张图片,也需要20秒,

而在采取客户端分发请求的模式,将图片的链接自动分布的请求到远程多台服务器,那么以同时请求5台为例,则相当于将对网站的并发请求提高了 5倍,
获得了了10个并发请求。
不光是图片资源,其它资源也都可以采取这种模式,url的动态分布,可以在服务端生成html代码的时候完成,
也可以在html的Javascript中预先存放一个可用服务器列表

www.flickr.com为例:

http://farm1.static.flickr.com/
http://farm2.static.flickr.com/
http://farm3.static.flickr.com/
……
http://farmx.static.flickr.com/

2008年01月25日

用JavaScript为OpenLayers.Marker的加上单击显示详细信息的功能

Filed under: Java — 标签:, , — lizongbo @ 09:09

 代码实现的效果为:

用于显示时,在地图上标记出对应的坐标,单击该标注时显示详细信息,再单击标注,隐藏详细信息,

/*
标记地区
参数 deleteEnable 是否允许删除
adminCode 行政区号,6位长
alarmLevel 图标级别

alarmMsg 消息
*/
function lzbmarkArea(deleteEnable, adminCode,alarmLevel,alarmMsg){
var isSelected=0;
var lonLatx=112;
var lonLaty=22.5;
var adminName=””;
if(!alarmMsg){alarmMsg=””};
for(var i=0;i<=gdareainfo.length;i++){
if(gdareainfo[i]==adminCode){
lonLatx=gdareainfo[i-2];
lonLaty=gdareainfo[i-1]+0.5;
adminName=gdareainfo[i+1];
}
}
if(adminName==””) {
//alert(‘no info ‘);
return;
};

for(var j = markers.markers.length-1; j >=0 ; j–){
if(adminCode == markers.markers[j].adminCode)
{
markers.removeMarker(markers.markers[j]);
}
}
var size = new OpenLayers.Size(50,50);
var calculateOffset = function(size) {
return new OpenLayers.Pixel(-(size.w/2), -size.h);
};
var icon = new OpenLayers.Icon(getAlarmLevelImg(alarmLevel),
null,null,null);
// size, null, calculateOffset);
//var marker =new OpenLayers.Marker(map.getLonLatFromPixel(e.xy), icon);//显示到当前点中的坐标
var marker =new OpenLayers.Marker(new OpenLayers.LonLat(lonLatx, lonLaty), icon);//显示到县市的中心点
marker.adminCode=adminCode;
marker.adminName=adminName;
marker.showLabel=true;
marker.labelStr=””;
//显示文本标签信息。
marker.text = marker.adminName+”(“+marker.adminCode+”)”;
if(alarmMsg!=””)
{
marker.text= marker.text+” ” + alarmMsg;
}
//alert(marker.text);
if(marker.text != “”){
marker.icon.imageDiv.style.fontSize = “14px”;
marker.icon.imageDiv.style.color = “blue”;
//marker.icon.imageDiv.style.backgroundColor = “rgb(255, 255, 215)”;
marker.icon.imageDiv.style.whiteSpace = “nowrap”;
//marker.icon.imageDiv.style.width=”100%”;
//marker.icon.imageDiv.style.height=”30″;
var str = “”;
str+= “<img src='”+marker.icon.url+”‘ alt='”+marker.text+”‘”+”‘ title='”+marker.text+”‘>”;
marker.icon.imageDiv.innerHTML = str;//imageDivStr + str;
}
this.labelStr=marker.icon.imageDiv.innerHTML;
if (deleteEnable) {
marker.events.register(‘click’, marker, function(evt) {
markers.removeMarker(this);
OpenLayers.Event.stop(evt);
});
}else{
marker.events.register(‘click’, marker, function(evt) {
//alert(” 当前状态 “+this.showLabel);
//alert(this.icon.imageDiv.innerHTML);
if(this.showLabel){
var str = “”;
this.showLabel=false;
str+= “<table border=\”0\” bordercolor=\”#FF0000\”>”;
str+= “<tr><td bgcolor=\”rgb(255, 255, 215)\” style=\”white-space:nowrap\”>”;
str+= “<img src='”+marker.icon.url
+”‘ ‘ height=20px width=20px alt='”+marker.text+”‘”+”‘ title='”+marker.text+”‘ ”
+” />”;
str+= this.text.replace(new RegExp(“\n”,”gm”),'<br/>’);
str+= “</td></tr>”;
str+= “</table>”;

this.icon.imageDiv.innerHTML = str;//imageDivStr + str;
}else{
var str = “”;
str+= “<img src='”+marker.icon.url
+”‘ height=20px width=20px ”
+”‘ alt='”+marker.text+”‘”+”‘ title='”+marker.text+”‘ ”
+” style=\”FILTER: progid:DXImageTransform.Microsoft.Alpha(opacity=0);WIDTH: 20px; POSITION: relative; HEIGHT: 20px\” /><br/>”;
//alert(‘不显示label’);
this.showLabel=true;
this.icon.imageDiv.innerHTML = str;//imageDivStr + str;
}
//alert(this.icon.imageDiv.innerHTML);
OpenLayers.Event.stop(evt);
});
}
markers.addMarker(marker);

}

function getAlarmLevelImg(level) {
var imgName = “”;
if (level == 1) {
imgName = “alarm_red.png”;
} else if (level == 2) {
imgName = “alarm_orange.png”;
} else if (level == 3) {
imgName = “alarm_yellow.png”;
} else if (level == 4) {
imgName = “alarm_blue.png”;
} else {
imgName = “alarm_other.png”;
}
return “/was/images/weather/” + imgName;
}

用于标注的的代码为:

if (deleteEnable) {
map.events.register(‘click’, map, function (e) {
//alert(map.getLonLatFromPixel(e.xy));
//document.getElementById(‘nodelist’).innerHTML = “正在载入… 请稍后…”;
var url =  map.layers[0].getFullRequestString(
{
REQUEST: “GetFeatureInfo”,
EXCEPTIONS: “application/vnd.ogc.se_xml”,
BBOX: map.getExtent().toBBOX(),
X: e.xy.x,
Y: e.xy.y,
INFO_FORMAT: ‘text/xml’,
QUERY_LAYERS: map.layers[0].params.LAYERS,
FEATURE_COUNT: 50,
srs: ‘EPSG:4326’,
layers: ‘gdmap:Dguangdong_region’,
styles: ”,
WIDTH: map.size.w,
HEIGHT: map.size.h
},
gisctx+ “/wms”
);

var selectPoint = function(varresponse){
var rs=varresponse.responseText;
rs=rs.replace(“‘”,””);
// alert(rs);
if(rs.indexOf(“ADMINCODE = “)<1){// alert(“no info”);
return ;}
rs=rs.substr(rs.indexOf(“ADMINCODE = “)+12);
rs=rs.substr(0,6);
var adminCode=rs;
rs=varresponse.responseText;
rs=rs.substr(rs.indexOf(“ADMINNAME = “)+12);
rs=rs.substr(0,rs.indexOf(“\n”));
var adminName=rs;
var alarmLevel =”1″;
alarmLevel = document.getElementById(“alarmLevel”).value;

lzbmarkArea(deleteEnable, adminCode,alarmLevel);
}

OpenLayers.loadURL(url, ”, this, selectPoint, setHTML);
OpenLayers.Event.stop(e);

});

};

Older Posts »

Powered by WordPress