<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>K99K</title>
<link>http://www.k99k.com</link>
<description>关注于android手机应用开发、WEB技术和JAVA开发，撰写java,xhtml,css,jQuery相关技术文章和教程，收集各类资源。</description>
<language>zh-cn</language>
<copyright>Copyright 2004-2010 k99k.com. Some rights reserved.</copyright>
<webMaster>keel.sike@gmail.com (Keel) </webMaster>
<atom:link href="http://www.k99k.com/rss.xml" rel="self" type="application/rss+xml" />
	<item>
		<title>愚人节应用:触摸警报!发布</title>
		<link>http://www.k99k.com/writes/android_freeze.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>壁纸App发布后，反响还不错，前段时间愚人节，熬夜做了个愚人节app：“触摸警报!”，顾名思义，就是让任何碰到手机的人听到你预先设置好的声音，可设置敏感度，开始响应的时间和重新准备的时间间隔。声音可以自己录制好，然后放到SD卡的voice目录即可。
&lt;p&gt;下载：可以在google market 搜索 KEEL 即可下载。另外，在安卓市场应用中的幽默搞笑区和eoe market应用中的娱乐休闲区均可找到，也可以通过搜索KEEL来找。如果各位觉得还行，别忘记评个星，呵呵。当然，也可扫下面的图： &lt;br /&gt;
&lt;img src='../img/qr_alert.png' alt='touch alert' /&gt;
&lt;/p&gt;
&lt;p&gt;界面个人觉得还可以进一步优化，等有时间再做吧，此外，加一个录音的功能看来是比较需要的！&lt;/p&gt;
&lt;p&gt;又及：精品壁纸收藏阁2.0版已发布，所有图片进行了重新制作，特别为N1,Droid,xt800等大屏手机提供了高清的大图全屏壁纸！推荐升级！&lt;/p&gt;
 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/android_freeze.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Tue, 6 Apr 2010 15:15:22 CST</pubDate>
		<guid>http://www.k99k.com/writes/android_freeze.html</guid>    
	</item>
	<item>
		<title>android app完成:精品壁纸收藏阁</title>
		<link>http://www.k99k.com/writes/android_start.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>这算是第一个个人发布的免费android app吧(又名猎户座精品壁纸),可以在google market 搜索 KEEL 即可下载。另外，在安卓市场应用中的主题区和eoe market应用中的娱乐休闲区均可找到，也可以通过搜索KEEL来找。如果各位觉得还行，别忘记评个星，呵呵。
&lt;p&gt;开发过程中的确碰到了不少问题，但都解决了，开发android手机应用还是蛮有乐趣的。这个APP需要网络连接和SD卡访问权限，在app打开时会远程更新图片索引，之后的图片请求都是远程的，客户端体积很小。图片均做了优化处理，特别是在浏览大图时增加了横向滚动功能，可以更好地查看在android手机上的实际效果，把屏横过来则可以看到全图。只要大图载入，下载和设置为壁纸都是一瞬间的事情，不需要再次从服务器下载大图。此外，国内用户访问可以得到更快的速度。 &lt;/p&gt;
&lt;p&gt;功能上还是属于比较简单的，初次上google market时没注意语言问题，结果拿了两个一星评价，其中一个居然在评论中喊'All Japanese!'。晚上熬了两三个小时把多语言给做上了，支持简繁中文，英文，还假模假样支持日文，其实就是google翻译出来的，这样手机设置什么语言在APP上就显示对应的语言，图片索引没办法处理，把中英文一起放上了。&lt;/p&gt;
&lt;p&gt;后续还有功能更新计划，什么时间能完成就不好说了，期待第2版！如有问题和好的建议，请发邮件到:keel.sike[at]gmail.com 。另附上google market的QR图:&lt;/p&gt;
 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/android_start.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Thu, 11 Mar 2010 10:15:22 CST</pubDate>
		<guid>http://www.k99k.com/writes/android_start.html</guid>    
	</item>
	<item>
		<title>谈应用托管与免费服务的弊端，云计算的风险</title>
		<link>http://www.k99k.com/writes/new_project.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>目前国内的网络局势大家都很清楚了，google app engine在国内基本上用不起来，其实所有使用国外服务的应用都可能有同样的问题，所以把自己的应用建立在自己的平台和硬件设备上才是相对稳妥的办法，当然如果能够实现双保险更好。
&lt;p&gt;另外，对于免费的服务，google的GAE平台还是相对比较好的，也经常出现这样那样的问题，真正商用的平台似乎不太敢上在上面。我也使用过DreamHost等服务商的免费服务，那个问题更是频繁得难以置信，动不动就数据库崩溃了。&lt;/p&gt;
&lt;p&gt;而且，Google对于GAE的免费提供实际上也是招揽广大热情的“测试员”为其商用服务打基础，云计算服务并不是说“免费”那么简单的。在真正的商业模式下，业务数据是非常重要的，也是具有保密特性的，将数据存储在云端也有潜在的风险。&lt;/p&gt;
&lt;p&gt;所以，计划年内将自己的平台上线。另外，开始将关注点集中到android平台，不再研究GAE了。&lt;/p&gt;
 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/new_project.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Wed, 8 Jul 2009 10:45:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/new_project.html</guid>    
	</item>
	<item>
		<title>进一步理解javascript对象、数组和哈希表</title>
		<link>http://www.k99k.com/writes/javascript_object_array.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>在javascript中，对象实际上就是一个哈希表，比如下面这个user对象：
&lt;pre&gt;
function user(n, a)
{
    this.name = n;
    this.age = a;
    this.toString = function() {
        return 'Name:' + this.name + ', Age:' + this.age;
    }
}
var u = new user('tom', 18);
for (var k in u) {
    alert('key: ' + k + ', value:' + u[k]);
}
&lt;/pre&gt;
稍作改动，使用Array对象来代替对象:
&lt;pre&gt;
var user = new Array();
user['name']='tom';
user['age']=18;
user['toString']=function(){
	return 'Name:' + this.name + ', Age:' + this.age;
}
alert(user.toString());
&lt;/pre&gt;
更简单的写法：
&lt;pre&gt;
var u = {
	'name':'tom',
	'age':18
}
u.toString = function(){return 'Name:' + this.name + ', Age:' + this.age;};
alert(u.toString());
&lt;/pre&gt;
由以上这些代码可以看出：
&lt;ul&gt;
&lt;li&gt;所有的javascript对象,包括Array对象在内实际上就是一个哈希表,属性名称就是哈希表的key，而属性的值就是哈希表的值。&lt;/li&gt;
&lt;li&gt;Array对象与通常意义的数组对象并不相关，通常的数组仅能通过下标来定位，而javascript中的Array却可以像哈希表一个通过key来定位集合中的对象。&lt;/li&gt;
&lt;li&gt;可以将一个function直接作为值赋给对象的“哈希表”。&lt;/li&gt;
&lt;/ul&gt;
前端时间看了阮一峰的&lt;a href='http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html'&gt; 《数据类型与Json格式》&lt;/a&gt; 一文，提到在yaml描述数据时，将所有的数据分成三种类型：
&lt;ul&gt;
 &lt;li&gt;第一种类型是scalar（标量），一个单独的string或数字，比如“北京”这个单独的词。&lt;/li&gt;
 &lt;li&gt;第二种类型是sequence（序列），若干个相关的数据按照一定顺序并列在一起，又叫做array（数组）或List(列表)，比如“北京，东京”。&lt;/li&gt;
 &lt;li&gt;第三种类型是map（映射），一个键/值对（Key/value），又称作hash（散列）或dictionary（字典），比如“首都：北京”。&lt;/li&gt;
&lt;/ul&gt;
可能这三种类型我们都很熟悉，但文中提到的对json的四条规则却正好剖析了javascript描述数据的方式:
&lt;ul&gt;
 &lt;li&gt;并列的数据之间用逗号（“,”）分隔。&lt;/li&gt;
 &lt;li&gt;映射用冒号（“:”）表示。&lt;/li&gt;
 &lt;li&gt;并列数据的集合（数组）用方括号('[]')表示。&lt;/li&gt;
 &lt;li&gt;映射的集合（对象）用大括号（“{}”）表示。&lt;/li&gt;
&lt;/ul&gt;
有了这四条规则（再加上对function的理解），对于很多看上去非常“诡异”的写法，都可以理解了。因此，一个javascript对象，实际上就是一个数组或是映射。 &lt;br /&gt;
关于数组与映射的不同，可以看下面这个例子：
&lt;pre&gt;
var m = {
	name:'keel',
	age:5
}
var a = [m,'sss',3];
//以下请求成功定位到name属性
alert(m['name']);
alert(a[0]['name']);//a[0]定位到m
alert(a[0].name);
//以下失败
alert(m[0]);//映射无法以数组下标的方式访问
&lt;/pre&gt;
&lt;ul&gt;
 &lt;li&gt;从定位到成员的方法来看，映射使用key来定位其中的成员，而数组使用下标，映射无法使用下标定位，同样数组也无法使用key（理所当然，根本就没有key）；&lt;/li&gt;
 &lt;li&gt;从表示方法来看，映射可以使用类似对象属性的方式来访问（如:m.name），也可以使用带key的[]方式（如:m['name']，这是javascript一个特例，看上去像数组，实际上仍是映射）；但数组仅能使用下标的方式；&lt;/li&gt;
 &lt;li&gt;从顺序来看：数组是有顺序的，映射是无序的；&lt;/li&gt;
&lt;/ul&gt;
 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/javascript_object_array.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Mon, 1 Jun 2009 10:45:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/javascript_object_array.html</guid>    
	</item>
	<item>
		<title>Google App Engine Java SDK 1.2.1 新版出现,JSP编码中文问题解决</title>
		<link>http://www.k99k.com/writes/google_appEngine_java_sdk_121.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>&lt;a href='http://code.google.com/p/googleappengine/wiki/SdkForJavaReleaseNotes'&gt;Google App Engine Java SDK1.2.1&lt;/a&gt;终于出来了！很荣幸地看到我提交的&lt;a href='http://code.google.com/p/googleappengine/issues/detail?id=1257'&gt;BUG(Issue1257)&lt;/a&gt;被作为重要的fix给补好了，从此jsp的中文问题彻底解决了！
&lt;p&gt;&lt;strong&gt;这个1.2.1带来了这些新的变化&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增加了对 appengine-web.xml, cron.xml, and datastore-indexes.xml文件的效验。&lt;/li&gt;
&lt;li&gt;新的&amp;lt;user-permissions&amp;gt;节点加入到appengine-web.xml中，支持定义第三方的权限系统。&lt;/li&gt;
&lt;li&gt;支持任意的无索引datastore properties。&lt;/li&gt;
&lt;li&gt;新增http proxy支持appcfg.sh&lt;/li&gt;
&lt;li&gt;Response 限制从1MB扩大到了10MB!&lt;/li&gt;
&lt;li&gt;修复了Servlet version 2.5部分丢失的方法。&lt;/li&gt;
&lt;li&gt;修复了ServletInputStream 一些bytes读取时的符号错误。&lt;/li&gt;
&lt;li&gt;Expect header，如100- continue现在会被忽略，不会引起500错误。&lt;/li&gt;
&lt;li&gt;内置的commons-logging-1.2.1.jar不再会覆盖用户自己的。&lt;/li&gt;
&lt;li&gt;Groovy 权限支持了local runtime。&lt;/li&gt;
&lt;li&gt;解决了一些JRE上的Reflection错误。&lt;/li&gt;
&lt;li&gt;&amp;lt;url-pattern&amp;gt;节点现在可以出现在&amp;lt;jsp-property-group&amp;gt;中 &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSP使用UTF-8编码时无法正确编译的问题&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;静态的welcome文件(首页，如index.html)现在优先于动态的welcome文件(如index.jsp).&lt;/li&gt;
&lt;li&gt;支持Thread.setContextClassLoader()&lt;/li&gt;
&lt;li&gt;Content-Type not set in local implementation of URLFetch API .&lt;/li&gt;
&lt;li&gt;AppCfg request_logs command is limited to 100 lines .&lt;/li&gt;
&lt;li&gt;Timestamp added to datastore indexes file uses current locale .&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;strong&gt;此外还有一些对JDO/JPA的变化,都是一些很重要的fix和新的功能支持:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;修复了自定义@Order的问题&lt;/li&gt;
 &lt;li&gt;支持字段限制&lt;/li&gt;
 &lt;li&gt;query literals支持doubles&lt;/li&gt;
 &lt;li&gt;支持BigDecimal fields &lt;/li&gt;
 &lt;li&gt;支持在持久化时使用类的父类&lt;/li&gt;
&lt;li&gt;等等其他变化……&lt;/li&gt;
&lt;/ul&gt;
 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/google_appEngine_java_sdk_121.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Fri, 15 May 2009 20:45:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/google_appEngine_java_sdk_121.html</guid>    
	</item>
	<item>
		<title>John Resig创建了新的processing.js和sizzle.js网站</title>
		<link>http://www.k99k.com/writes/processing_sizzle.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>&lt;a href='http://ejohn.org/'&gt;John Resig&lt;/a&gt;创建了新的&lt;a href='http://processingjs.org/'&gt;processing.js&lt;/a&gt;和&lt;a href='http://sizzlejs.com/'&gt;sizzle.js&lt;/a&gt;网站。 &lt;br /&gt;----注：&lt;a href='http://ejohn.org/'&gt;John Resig&lt;/a&gt;就是大名鼎鼎的&lt;a href='http://jquery.com'&gt;jQuery&lt;/a&gt;的作者。
&lt;p &gt;
&lt;strong&gt;&lt;a href='http://processingjs.org/'&gt;processing.js&lt;/a&gt;&lt;/strong&gt;: &lt;br /&gt;其实早在一年前就已经released了，现在它终于有了官方站点，目前它主要由&lt;a href='http://hyper-metrix.com/'&gt;Alistair MacDonald&lt;/a&gt; 维护。在 &lt;a href='http://groups.google.com/group/processingjs'&gt;Processing.js Google Group&lt;/a&gt;可以进行交流。
&lt;/p&gt;
&lt;p &gt;
processing.js使用javascript实现类似FLASH动画的“神奇”效果，这让我想起了很多年前网上四处流行的“特效代码生成器”：满屏的雪花飘……钟表跟着鼠标跑……现在居然已成往事(那时候的好处就是不存在浏览器兼容问题)，呵呵。看看processing.js，新一代的特效更酷更有魅力！这些&lt;a href='http://processingjs.org/learning'&gt;DEMO&lt;/a&gt;让人不敢相信这居然是javascript而不是flash.
&lt;/p&gt;
&lt;p &gt;&lt;strong&gt;&lt;a href='http://sizzlejs.com/'&gt;sizzle.js&lt;/a&gt;&lt;/strong&gt;: &lt;br /&gt;可能大家更熟悉了，jQuery新的高速选择器！我想大部分使用jQuery的人们首先都是被其优雅的选择器所吸引的，现在sizzle独立了，大家又多了一个选择，如果不喜欢jQuery日渐丰满的体型，可以单独使用sizzle，未压缩时只有24K大小，压缩后仅4K。&lt;/p&gt;
&lt;p &gt;sizzle在使用时与jQuery是不同的，可以看一下它的&lt;a href='http://wiki.github.com/jeresig/sizzle'&gt;文档&lt;/a&gt;，其实主要的方法就是三个'Public API'，非常简单实用。&lt;/p&gt;  &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/processing_sizzle.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Tue, 5 May 2009 09:55:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/processing_sizzle.html</guid>    
	</item>
	<item>
		<title>通过SSH在位于F5后面的SUSE Linux上配置jdk和tomcat</title>
		<link>http://www.k99k.com/writes/suse_linux_jdk_tomcat.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>前段时间通过SSH在SUSE Linux上配置了一下JAVA的WEB服务器环境,主要是 jdk和tomcat的安装,以及后期发现的F5后面需要注意的问题,在此记录一下,以便以后参考。&lt;br /&gt;
&lt;strong&gt;JDK的安装&lt;/strong&gt;
&lt;ol&gt;
 &lt;li&gt;下载JDK：事先找到的jdk下载位置复制到剪贴板，用Putty通过SSH连到服务器，找个合适的位置准备下载JDK安装文件，如&quot;/usr/java &quot;,然后在此目录中输入:&lt;br /&gt;
server:/usr/java # wget http://www.sun.com/....../jdk-6u13-linux-x64-rpm.bin 回车后即会开始下载。&lt;/li&gt;
 &lt;li&gt;安装：执行server:/usr/java # ./jdk-6u13-linux-x64-rpm.bin,会自动解压并安装，这个jdk6版本安装完成后，直接输入java -version 就可以看到相关的安装信息了，但为了更好地使用，还是需要配置环境变量。&lt;/li&gt;
 &lt;li&gt;配置环境变量: 使用VIM修改profile文件 &lt;br /&gt;server:/usr/java # vim /etc/profile &lt;br /&gt;在文件末尾添加下列语句: &lt;br /&gt;
export JAVA_HOME=/usr/java/jdk1.6.0_13 &lt;br /&gt;
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar &lt;br /&gt;
export JRE_HOME=$JAVA_HOME/jre &lt;br /&gt;
export PATH=$JAVA_HOME/bin:$PATH &lt;br /&gt;
然后logout,再连一下，使用echo $JAVA_HOME就可以看到环境变量已经生效了。至此jdk安装算是完成了。
&lt;/li&gt;
&lt;/ol&gt;
&lt;strong&gt;tomcat的安装&lt;/strong&gt;
&lt;ol&gt;
 &lt;li&gt;下载:事先找到tomcat的下载位置复制到剪贴板，然后下载 &lt;br /&gt;
server:/usr/java # wget http://tomcat.apache.org/download...../apache-tomcat-6.0.18.tar.gz &lt;br /&gt;
 &lt;/li&gt;
 &lt;li&gt;安装:复制这个安装文件到/usr/local/ 然后解压缩: &lt;br /&gt;
server:/usr/local # tar xvzf apache-tomcat-6.0.18.tar.gz &lt;br /&gt;
最好调整一下目录，将tomcat的文件放到/usr/local/tomcat下面。
 &lt;/li&gt;
 &lt;li&gt;启动:在tomcat的bin目录下运行 &lt;br /&gt;
server:/usr/local/tomcat/bin # ./startup.sh &lt;br /&gt;
随后可在浏览器中看到可爱的汤姆猫了。
 &lt;/li&gt;
&lt;/ol&gt;
&lt;strong&gt;在F5后面需要注意的问题&lt;/strong&gt;
因为这个应用是用来分析统计WEB流量用的，在这个SUSE上部署好后，可以看到有一个内网的监测请求每隔一段时间就访问这个80端口，因此，我在Servlet上作了处理，对于这种请求直接就用return过滤掉，不纳入统计范围。后来发现，这样处理后，过一段时间，80端口就无法访问到了，询问F5的相关工程师，看到此服务器的80端口是down掉的状态。试着把这种过滤策略去掉，咦？居然又好了，80端口一直正常。反复测试后发现，对于这种F5产生的监控请求，不能直接return掉，甚至不能返回空字符串,就是这样也不行： &lt;br /&gt;
response.getWriter().print(&quot;&quot;); &lt;br /&gt;
return; &lt;br /&gt;
必须返回一个有效的字符串才能保证80端口的正常，所以修改成如下的过滤方式后，问题解决： &lt;br /&gt;
response.getWriter().print(&quot;404&quot;); &lt;br /&gt;
return;  &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/suse_linux_jdk_tomcat.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Sat, 2 May 2009 12:55:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/suse_linux_jdk_tomcat.html</guid>    
	</item>
	<item>
		<title>放弃CMS系统,使用Fmpp和freemarker从本地创建纯静态网站(1)</title>
		<link>http://www.k99k.com/writes/fmpp_freemarker_website.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>在上个世纪90年代，很多人创建网站都是使用的Dreamweaver创建静态的html文件，然后上传到服务器的。这种方式最简单而且直接，从今天的角度来看仍然还是最为稳定和高性能的，当然它最大的缺点就是难以维护，做一个公司简介，业务介绍之类的“公司网站”当然问题不大，但对于真正有点内容的门户，就基本上不可能维护起来了。虽然Dreamweaver有“模板”和“库”的方式可实现模块化的静态站构建，而且有相当强大的html重构功能，但仍然不足以对网站内的静态页内容进行管理和维护。 所以，这种情况一般都需要使用服务端的动态页技术，如ASP,PHP等。 &lt;p &gt;
到今天来看，服务端的动态技术得到了很强的发展，从JAVA的角度看过去，就可以看到眼花缭乱的服务端WEB技术，还可以看到各种复杂的架构和分层。而且，不少CMS系统都以生成静态页的方式来提升站点的性能。 其实，对于小型站来讲，CMS系统并不是必须的，有一个很好的工具可以使用：fmpp。 &lt;/p&gt;&lt;p &gt;
 简单来讲,fmpp就是使用freemarker模板引擎来生成文件的工具，它有很多的用途，在这里，我用它来生成纯静态的Blog站，也就是本站 &lt;a href=&quot;http://www.k99k.com&quot;&gt;www.k99k.com&lt;/a&gt;。 &lt;/p&gt;
 fmpp可以设置它的数据源，输出方式，编码等，足以满足一般网站的需求，而且因为基于模板技术，每个页面的每个细节都可以随意进行修改，而不会局限于某某系统的功能。于是就形成了以下目标：
 &lt;ul&gt;
  &lt;li&gt;通过freemarker模板和数据文件在本地生成静态html文件，然后进行上传更新.&lt;/li&gt;
  &lt;li&gt;每新添一篇文章，就是新写一个数据页,然后执行fmpp命令完成静态页生成，类别，标签页等也随之自动进行处理.&lt;/li&gt;
  &lt;li&gt;可以控制每个内容页的keywords,description,title,html文件名信息，这是很少有cms系统能做全和做好的。&lt;/li&gt;
  &lt;li&gt;自动生成面向google的sitemap文件，自动生成rss文件&lt;/li&gt;
  &lt;li&gt;后期可以通过fmpp的front-end机制，设置一个内容输入界面，并自动完成FTP上传工作&lt;/li&gt;
 &lt;/ul&gt;
现在除了最后一点，其他的均已实现，大家可以看看本站，就是这样炼成的，更新和修改起来也是非常方便快捷，所有的操作都在本机运行，主机上不需要任何服务端技术，一个简单的http服务器就行了，安全性和性能也是没说的了。 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/fmpp_freemarker_website.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Fri, 1 May 2009 20:55:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/fmpp_freemarker_website.html</guid>    
	</item>
	<item>
		<title>Google AppEngine for java 的JDO测试</title>
		<link>http://www.k99k.com/writes/googleAppEngine-java-jdo-datastore.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>研究了一下dataStore文档，并作了一个简单的留言板，没有用DEMO里的那个，自己做的更方便修改，省时间。&lt;br /&gt;
&lt;br /&gt;
有几个心得：&lt;ul&gt;&lt;li&gt;使用eclipse的google插件可以节省很多必要的麻烦，我在&lt;a href='writes/googleAppEngine-java-eclipse.html'&gt;前文&lt;/a&gt;中已有说明。&lt;/li&gt;
&lt;li&gt;google  的dataStore分为标准api和low  api(底层api)，标准api分为jdo和jpa两种。底层API看上去比较复杂，文档也少（实际上只有javadoc），而比较jdo和jpa，虽  然后者比较新，但显示google对jdo的支持更全面，从文档和DEMO可以看出。&lt;/li&gt;
&lt;li&gt;按google的建议，先创建一个PMF工厂，然后使用Query对象构造查询，删除和新增经测试问题都不大，关键是查询和index。&lt;/li&gt;
&lt;/ul&gt;感觉最麻烦的就是索引(index)处理了，与SQL相比，这一部分比较不太一样。eclipse在build项目时会自动处理Query产生的  index,并在WEB-INF/appengine-generated/下生成datastore-indexes-auto.xml配置文件，如果有数据更新，还会生成local_db.bin,这实际上就是数据保存的文件了，删除这个文件数据就消失了，这个文件不会上传到googleApp，所以本地调试时生成的数据是不会在上传时与googleApp上的数据同步的。 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/googleAppEngine-java-jdo-datastore.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Sat, 11 Apr 2009 20:02:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/googleAppEngine-java-jdo-datastore.html</guid>    
	</item>
	<item>
		<title>两个不错的多文件上传组件(jQuery,flash)</title>
		<link>http://www.k99k.com/resources/file-upload-by-jQuery-flash.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>这是一个使用jQuery和flash的多文件上传组件：&lt;br /&gt;
&lt;a href='http://www.uploadify.com/demo/'&gt;http://www.uploadify.com/demo/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
这是一个FLASH的多文件上传组件：&lt;br /&gt;
&lt;a href='http://www.apueee.com/2008/07/05/flash-multiple-file-uploader/'&gt;http://www.apueee.com/2008/07/05/flash-multiple-file-uploader/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
这里所说的多文件上传，是指点击浏览打开的本机文件浏览窗口可以选择多个文件！&lt;br /&gt;
而并非一次选一个，然后一次上传的概念，那还应该算是单文件上传，只不过批量而已。 &lt;br /&gt;[&lt;a href="http://www.k99k.com/resources/file-upload-by-jQuery-flash.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>资源</category>
		<pubDate>Fri, 10 Apr 2009 20:02:12 CST</pubDate>
		<guid>http://www.k99k.com/resources/file-upload-by-jQuery-flash.html</guid>    
	</item>
	<item>
		<title>GoogleAppEngine for Java的eclipse插件下载</title>
		<link>http://www.k99k.com/writes/googleAppEngine-java-eclipse.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>Google App Engine for Java的eclipse插件非常好！&lt;br /&gt;
很多烦琐的操作和步骤都代劳了。&lt;br /&gt;
比如：
&lt;ul&gt;
&lt;li&gt;创建project项目的结构&lt;/li&gt;
&lt;li&gt;加入jdo,jpa的相关lib&lt;/li&gt;
&lt;li&gt;build时使用的jdo优化&lt;/li&gt;
&lt;li&gt;直接集成jetty服务器测试&lt;/li&gt;
&lt;li&gt;最重要的，直接deploy，也就是上传你的APP&lt;/li&gt;
&lt;/ul&gt;
&lt;strong&gt;AppEngine for Java的eclipse插件下载&lt;/strong&gt;：&lt;br /&gt;
&lt;br /&gt;
一切都很好，但是第一次下载时简单慢得夸张(eclipse3.4- ganymede)，其根本原来原来是ganymede的update目录下载不了（这个是从eclipse的官网下的，google不会这么慢）。&lt;br /&gt;
&lt;br /&gt;
这里提供一个Google App Engine for Java的 &lt;strong&gt;eclipse3.4-(ganymede) 插件下载&lt;/strong&gt;： &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/googleAppEngine-java-eclipse.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Thu, 9 Apr 2009 21:52:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/googleAppEngine-java-eclipse.html</guid>    
	</item>
	<item>
		<title>Google App Engine for Java的JSP中文问题</title>
		<link>http://www.k99k.com/writes/google-appEngine-for-java-jsp.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>现象：直接使用java-sdk上传或使用eclipse上传后发现JSP中的中文是乱码的，Servlet在设置好request和respone的encoding后处理中文没有问题。&lt;br /&gt;
&lt;br /&gt;
在使用命令行方式上传中文的JSP时，我发现有一个JSP报错如下：&lt;br /&gt;
--------------------------------------&lt;br /&gt;
8% Compiling jsp files.&lt;br /&gt;
2009-4-10 8:43:16 org.apache.jasper.JspC processFile&lt;br /&gt;
信息: Built File:a.jsp&lt;br /&gt;11% Compiling java files.&lt;br /&gt;
classes/org/apache/jsp/a_&lt;br /&gt;jsp.java:43: 警告：编码 GB18030 的不可映射字符&lt;br /&gt;
out.write(&amp;quot;...head&amp;gt;
  meta http-equiv=/&amp;quot;Content-Type/&amp;quot; content=/&amp;quot;text/html; charset=UTF-8/&amp;quot;  /&amp;gt;
title&amp;gt;鎴戞潵浜??/title&amp;gt;
head&amp;gt;
body&amp;gt;
&amp;quot;);&lt;br /&gt;
1 警告&lt;br /&gt;
--------------------------------------&lt;br /&gt;
(因为blog发表的要求，部分html代码作了改动)&lt;br /&gt;
&lt;br /&gt;
这说明在使用org.apache.jasper.JspC processFile进行Compiling jsp  files使用了GB18030而不是UTF-8，而且在生成的临时文件夹中可以看到jsp编译后的.java文件直接就是乱码的，所以，并不是  googleApp的server不支持，而是appengine-java-sdk的JSP编译器的编码有问题。 &lt;br /&gt;[&lt;a href="http://www.k99k.com/writes/google-appEngine-for-java-jsp.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>撰文</category>
		<pubDate>Thu, 9 Apr 2009 21:02:12 CST</pubDate>
		<guid>http://www.k99k.com/writes/google-appEngine-for-java-jsp.html</guid>    
	</item>
	<item>
		<title>Java对象的强、软、弱和虚引用</title>
		<link>http://www.k99k.com/texts/java-reference.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>在JDK1.2以前的版本中，当一个对象不被任何变量引用，那么程序就无法再使用这个对象。也就是说，只有对象处于可触及状态，程序才能使用它。这  就像在日常生活中，从商店购买了某样物品后，如果有用，就一直保留它，否则就把它扔到垃圾箱，由清洁工人收走。一般说来，如果物品已经被扔到垃圾箱，想再  把它捡回来使用就不可能了。&lt;br /&gt;
但有时候情况并不这么简单，你可能会遇到类似鸡肋一样的物品，食之无味，弃之可惜。这种物品现在已经无用了，保留它会  占空间，但是立刻扔掉它也不划算，因  为也许将来还会派用场。对于这样的可有可无的物品，一种折衷的处理办法是：如果家里空间足够，就先把它保留在家里，如果家里空间不够，即使把家里所有的垃  圾清除，还是无法容纳那些必不可少的生活用品，那么再扔掉这些可有可无的物品。&lt;br /&gt;
从JDK1.2版本开始，把对象的引用分为四种级别，从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为：强引用、软引用、弱引用和虚引用。
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;1．强引用&lt;/strong&gt;&lt;br /&gt;
本章前文介绍的引用实际上都是强引用，这是使用最普遍的引用。如果一个对象具有强引  用，那就类似于必不可少的生活用品，垃圾回收器绝不会回收它。当内存空  间不足，Java虚拟机宁愿抛出OutOfMemoryError错误，使程序异常终止，也不会靠随意回收具有强引用的对象来解决内存不足问题。 &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;2．软引用（SoftReference）&lt;/strong&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;如果一个对象只具有软引用，那就类似于可有可无的生活用品。如果内存空间足够，垃圾回收器就不会回收它，如果内存空间不足了，就会回收这些对象的内存。只要垃圾回收器没有回收它，该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。&lt;br /&gt;
软引用可以和一个引用队列（ReferenceQueue）联合使用，如果软引用所引用的对象被垃圾回收，Java虚拟机就会把这个软引用加入到与之关联的引用队列中。&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3．弱引用（WeakReference）&lt;/strong&gt;&lt;br /&gt;
如果一个对象只具有弱引用，那就类似于可有可物的生活用品。  弱引用与软引用的区别在于：只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它  所管辖的内存区域的过程中，一旦发现了只具有弱引用的对象，不管当前内存空间足够与否，都会回收它的内存。不过，由于垃圾回收器是一个优先级很低的线程，  因此不一定会很快发现那些只具有弱引用的对象。 &lt;br /&gt;
弱引用可以和一个引用队列（ReferenceQueue）联合使用，如果弱引用所引用的对象被垃圾回收，Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;4．虚引用（PhantomReference）&lt;/strong&gt;&lt;br /&gt;
&amp;quot;虚引用&amp;quot;顾名思义，就是形同虚设，与其他几种引用都不同，虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用，那么它就和没有任何引用一样，在任何时候都可能被垃圾回收。&lt;br /&gt;
虚  引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于：虚引用必须和引用队列（ReferenceQueue）联合使用。当垃  圾回收器准备回收一个对象时，如果发现它还有虚引用，就会在回收对象的内存之前，把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是  否已经加入了虚引用，来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列，那么就可以在所引用的对象的内存被回收之前采  取必要的行动。&lt;br /&gt;
&lt;/p&gt; &lt;br /&gt;[&lt;a href="http://www.k99k.com/texts/java-reference.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>文库</category>
		<pubDate>Thu, 15 Jan 2009 11:12:12 CST</pubDate>
		<guid>http://www.k99k.com/texts/java-reference.html</guid>    
	</item>
	<item>
		<title>Mastering the Java CLASSPATH</title>
		<link>http://www.k99k.com/texts/master-java-classpath.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>&lt;strong&gt;1、class搜索路径的重要性&lt;/strong&gt;
&lt;p&gt;理解class搜索路径对所有Java开发人员来说都很重要，但是，IDE的广泛使用掩盖了这项技术，使大家普遍对它缺乏了解，甚至包括好多老鸟。这个问题在开发用于发布的应用程序（原文为distributed applications，但好像译为“分布式应用”有点晦涩）时尤其严重，因为应用程序运行时的系统环境可能和开发时的大不相同。&lt;/p&gt;
&lt;p&gt;本文详细描述了某些Java类被其他代码引用时，Java编译器和JVM如何使用类搜索路径（class search path  ）定位这些类。这儿用一个非常简单的例子——同一个包中的两个类——来具体说明。我们将通过不同的方式来编译这两个类，根据classpath的设置不  同，编译可能成功也可能失败。&lt;/p&gt;
&lt;p&gt;为了最清楚的说明这个问题，我们将只使用命令行工具进行编译。交互式开发工具有它们自己操作classpath的方法，这些方法因产品而异。&lt;/p&gt;
&lt;p&gt;至于是由Java编译器在编译时定位需要的类，还是由JVM在运行时来做，这两种方法没有本质的区别。但编译器可以从源代码中编译需要的类，而JVM不行。下面的例子中我们用编译器来做，但在运行时的实现也完全类似。&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;2、例子&lt;/strong&gt;&lt;/p&gt; &lt;br /&gt;[&lt;a href="http://www.k99k.com/texts/master-java-classpath.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>文库</category>
		<pubDate>Fri, 9 Jan 2009 11:02:12 CST</pubDate>
		<guid>http://www.k99k.com/texts/master-java-classpath.html</guid>    
	</item>
	<item>
		<title>jvm与tomcat内存设置</title>
		<link>http://www.k99k.com/texts/jvm-tomcat.html</link>
		<author>keel.sike@gmail.com (Keel)</author>
		<description>&lt;strong&gt;如何设置Tomcat的JVM虚拟机内存大小&lt;/strong&gt;
可以给Java虚拟机设置使用的内存，但是如果你的选择不对的话，虚拟机不会补偿。可通过命令行的方式改变虚拟机使用内存的大小。如下表所示有两个参数用来设置虚拟机使用内存的大小。&lt;br /&gt;
参数&lt;br /&gt;
描述&lt;br /&gt;
-Xms&lt;br /&gt;
JVM初始化堆的大小&lt;br /&gt;
-Xmx&lt;br /&gt;
JVM堆的最大值&lt;br /&gt;
这  两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的  情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，虚拟机就必须  重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程  序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出，并且导致应用服务崩溃。因此一般建议堆的最  大值设置为可用内存的最大值的80%。&lt;br /&gt;
Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。&lt;br /&gt;
Windows下，在文件/bin/catalina.bat，Unix下，在文件/bin/catalina.sh的前面，增加如下设置：&lt;br /&gt;
JAVA_OPTS='-Xms【初始化内存大小】 -Xmx【可以使用的最大内存】'&lt;br /&gt;
需要把这个两个参数值调大。例如：&lt;br /&gt;
JAVA_OPTS='-Xms256m -Xmx512m'&lt;br /&gt;
表示初始化内存为256MB，可以使用的最大内存为512MB。&lt;br /&gt;
另  外需要考虑的是Java提供的垃圾回收机制。  &lt;br /&gt;[&lt;a href="http://www.k99k.com/texts/jvm-tomcat.html"&gt;继续阅读&lt;/a&gt;]
		</description>
		<category>文库</category>
		<pubDate>Sun, 13 Jan 2008 21:02:12 CST</pubDate>
		<guid>http://www.k99k.com/texts/jvm-tomcat.html</guid>    
	</item>
</channel>
</rss>
