<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Some reminiscences, some memories &#187; Java</title>
	<atom:link href="http://www.mikespook.com/index.php/category/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mikespook.com</link>
	<description>Just another boring day</description>
	<lastBuildDate>Tue, 10 Jan 2012 03:14:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Android 上的 SSH 通道翻墙利器：Connectbot</title>
		<link>http://www.mikespook.com/2011/03/android-%e4%b8%8a%e7%9a%84-ssh-%e9%80%9a%e9%81%93%e7%bf%bb%e5%a2%99%e5%88%a9%e5%99%a8%ef%bc%9aconnectbot/</link>
		<comments>http://www.mikespook.com/2011/03/android-%e4%b8%8a%e7%9a%84-ssh-%e9%80%9a%e9%81%93%e7%bf%bb%e5%a2%99%e5%88%a9%e5%99%a8%ef%bc%9aconnectbot/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 02:48:31 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[My life]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tunneling]]></category>
		<category><![CDATA[翻墙]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=878</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
最近发现，Android 翻墙版 Opera越来越难以翻墙了。越来越卡，越来越慢……有时甚至完全打不开。于是乎，得寻其他途径。VPN 我是不想用的，一用，整机翻墙，有时用起来反而还慢。

还好，发现 Connectbot 这个利器。Connectbot 是 Google Code 上的开源项目，在 Android 市场上的原文介绍如下：

ConnectBot is a powerful open-source Secure Shell (SSH) client. It can manage simultaneous SSH sessions, create secure tunnels, and copy/paste between other applications.

<span class="readmore"><a href="http://www.mikespook.com/2011/03/android-%e4%b8%8a%e7%9a%84-ssh-%e9%80%9a%e9%81%93%e7%bf%bb%e5%a2%99%e5%88%a9%e5%99%a8%ef%bc%9aconnectbot/" title="Android 上的 SSH 通道翻墙利器：Connectbot">阅读全文——共781字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>最近发现，<a href="http://www.mikespook.com/index.php/archives/741" target="_blank">Android 翻墙版 Opera</a>越来越难以翻墙了。越来越卡，越来越慢……有时甚至完全打不开。于是乎，得寻其他途径。VPN 我是不想用的，一用，整机翻墙，有时用起来反而还慢。</p>
<p>还好，发现 <a href="https://market.android.com/details?id=org.connectbot" target="_blank">Connectbot</a> 这个利器。Connectbot 是 <a href="http://code.google.com/p/connectbot/" target="_blank">Google Code 上的开源项目</a>，在 Android 市场上的原文介绍如下：</p>
<blockquote><p>ConnectBot is a powerful open-source Secure Shell (SSH) client. It can manage simultaneous SSH sessions, create secure tunnels, and copy/paste between other applications.</p>
<p>This client allows you to connect to Secure Shell servers that typically run on UNIX-based servers.</p></blockquote>
<p>要知道，SSH Tunneling 是我在桌面翻墙的至爱，Firefox 配合 FoxyProxy 可以选择性翻墙，很是轻松。</p>
<p>使用 Connectbot 翻墙很容易，只需下面四步：<br />
<span id="more-878"></span><br />
第一步，打开 Connectbot，在下方选框中选择 ssh 方式，并在其后的文本框中输入“用户名@主机名:端口”。如 root@yoursitehere.com:22。输入后，点“完成”，即开始连接 ssh。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-1.png"><img class="size-full wp-image-880 aligncenter" title="connectbot-1" src="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-1.png" alt="" width="320" height="480" /></a></p>
<p>第二步，连接过程跟普通ssh过程一致。正常连接，并登录后，点击 menu 按钮，调出菜单。选择“端口转发”。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-2.png"><img class="size-full wp-image-881 aligncenter" title="connectbot-2" src="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-2.png" alt="" width="320" height="480" /></a></p>
<p>第三步，根据需要选择端口转发的类型和方式。我习惯上会使用动态的 socket 转发。这其实跟普通的 ssh tunneling 没啥区别。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-3.png"><img class="size-full wp-image-882 aligncenter" title="connectbot-3" src="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-3.png" alt="" width="320" height="480" /></a></p>
<p>第四步，设置好了以后，在“设置”里选择“无线和网络”，在“Proxy settings”里设置主机名为 127.0.0.1，端口为刚才设置的源端口即可。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-4.png"><img class="size-full wp-image-883 aligncenter" title="connectbot-4" src="http://www.mikespook.com/wp-content/uploads/2011/03/connectbot-4.png" alt="" width="320" height="480" /></a></p>
<p>然后，你就可以随意“小鸟”、“脸谱”了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2011/03/android-%e4%b8%8a%e7%9a%84-ssh-%e9%80%9a%e9%81%93%e7%bf%bb%e5%a2%99%e5%88%a9%e5%99%a8%ef%bc%9aconnectbot/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Android Market 的三个更新</title>
		<link>http://www.mikespook.com/2010/11/android-market-%e7%9a%84%e4%b8%89%e4%b8%aa%e6%9b%b4%e6%96%b0/</link>
		<comments>http://www.mikespook.com/2010/11/android-market-%e7%9a%84%e4%b8%89%e4%b8%aa%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Thu, 18 Nov 2010 01:29:17 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[App]]></category>
		<category><![CDATA[changes]]></category>
		<category><![CDATA[Market]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=771</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
早上起来收到 Android Market 项目组的公告邮件，对于明天的更新做了简单的说明。主要的更新点有三个，显然 Google 在 Android Market 的业务上面有新的动向了。

原文摘录如下：



<span class="readmore"><a href="http://www.mikespook.com/2010/11/android-market-%e7%9a%84%e4%b8%89%e4%b8%aa%e6%9b%b4%e6%96%b0/" title="Android Market 的三个更新">阅读全文——共1814字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>早上起来收到 Android Market 项目组的公告邮件，对于明天的更新做了简单的说明。主要的更新点有三个，显然 Google 在 Android Market 的业务上面有新的动向了。</p>
<p>原文摘录如下：<br />
<span style="color: #808080;"><br />
First, we have added support for a recent changes feature, which allows you to add notes about changes specific to the newest version of your application. You are able to submit these from the Developer Console, similar to descriptions. In the Market app, these notes will appear under the app description as “Recent changes.”</span></p>
<p>Second, there is now a ‘draft upload’ capability for application updates. This feature enables you to edit your app listing and upload a new version without affecting the version live in Market. Your app listing edits will not change your live listing until you select “Publish.”</p>
<p>Finally, we are adding support for larger promotional graphics to showcase your application. In addition to the currently required app screenshot, you will be required to upload one “feature” graphic. Supported promotional assets will now include:</p>
<ul>
<li>A “feature” graphic, landscape aspect ratio, 1024 x 500 (required).</li>
<li>A high-res icon, 512 x 512 (required)..  The Android icon design guidelines located at <a href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html">http://developer.android.com/guide/practices/ui_guidelines/icon_design.html</a> apply.</li>
<li>2 screen shots, 320w x 480h, 480w x 854h, or 480w x 800h, increasing to 8 screen shots in the future (1 required).</li>
<li> A link for a promotional video hosted on YouTube (optional).</li>
</ul>
<p><span id="more-771"></span>翻译如下：</p>
<p><span style="color: #808080;">首先，我们增加了近期更新的功能，这允许你添加对于应用的新版本更新内容的备注。你可以在开发者控制台添加这些，跟描述的操作一样。在市场中，这些备注将作为“近期更新”被显示在应用的描述下面。</span></p>
<p><span style="color: #808080;">其次，现在应用的更新有了“草稿上传”的功能。这个功能可以让你在不影响已经在市场的应用的前提下，编辑你的应用列表或者上传新的版本。你的编辑不会真得生效，知道你选择“发布”。</span></p>
<p><span style="color: #808080;">最后，我们添加了大的促销图用于显示你的应用。同时，现有的应用截屏你也需要上传一张“特色”图。增加的包括：</span></p>
<ul>
<li><span style="color: #808080;"> “特色”图，横屏，1024&#215;500（必须）。</span></li>
<li><span style="color: #808080;"> 大资源图标，512&#215;512（必须）。Android 图标设计指南在<a href="http://developer.android.com/guide/practices/ui_guidelines/icon_design.html">http://developer.android.com/guide/practices/ui_guidelines/icon_design.html</a>有。</span></li>
<li><span style="color: #808080;"> 两个截屏，320w x 480h，480w x 854h，或者 480w x 800h，增加到支持 8 幅截屏（必须有一个）。</span></li>
<li><span style="color: #808080;"> 在 TouTube 上的促销链接（可选）。</span></li>
</ul>
<p>从上面的内容可以看出，Google 对于现在简陋的 Android Market 开发控制台有所改进，期望更多的开发者、更好的应用进入。同时，加强了促销等内容，或许是为了改变 Android Market 上的现有应用，免费为王的局面。以便更好的应用，更好的推广。</p>
<p>对于 512&#215;512 的大资源图标，猜测可能是为了应对越来越多的 Android Pad，而提前准备的高质量视觉资源。</p>
<p>还应该从中间能看出一些动向的端倪，我不废话了，大家意淫吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2010/11/android-market-%e7%9a%84%e4%b8%89%e4%b8%aa%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android 实时获取麦克风输入音量的代码</title>
		<link>http://www.mikespook.com/2010/11/android-%e5%ae%9e%e6%97%b6%e8%8e%b7%e5%8f%96%e9%ba%a6%e5%85%8b%e9%a3%8e%e8%be%93%e5%85%a5%e9%9f%b3%e9%87%8f%e7%9a%84%e4%bb%a3%e7%a0%81/</link>
		<comments>http://www.mikespook.com/2010/11/android-%e5%ae%9e%e6%97%b6%e8%8e%b7%e5%8f%96%e9%ba%a6%e5%85%8b%e9%a3%8e%e8%be%93%e5%85%a5%e9%9f%b3%e9%87%8f%e7%9a%84%e4%bb%a3%e7%a0%81/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 12:02:25 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[android]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=762</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Android 上有一些很有趣的应用，例如《吹裙子》、《吹气球》之类的。利用的是实时获取麦克风输入音量，然后进行相应的处理。录音过程中怎样获得声音的大小呢？网上也不少人问如何处理这个事情，也有一些解答，不过都没有实际的代码。简单摸索了一下，写了个小 Demo 试了试，果然可以。给大家共享一下。

不解释代码了，大家看注释。



<span class="readmore"><a href="http://www.mikespook.com/2010/11/android-%e5%ae%9e%e6%97%b6%e8%8e%b7%e5%8f%96%e9%ba%a6%e5%85%8b%e9%a3%8e%e8%be%93%e5%85%a5%e9%9f%b3%e9%87%8f%e7%9a%84%e4%bb%a3%e7%a0%81/" title="Android 实时获取麦克风输入音量的代码">阅读全文——共1304字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Android 上有一些很有趣的应用，例如《吹裙子》、《吹气球》之类的。利用的是实时获取麦克风输入音量，然后进行相应的处理。录音过程中怎样获得声音的大小呢？网上也不少人问如何处理这个事情，也有一些解答，不过都没有实际的代码。简单摸索了一下，写了个小 Demo 试了试，果然可以。给大家共享一下。<br />
不解释代码了，大家看注释。</p>
<p><span id="more-762"></span></p>
<pre class="brush: java; title: ; notranslate">
package com.xxiyy.spl;

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.util.Log;

public class RecordThread extends Thread {
	private AudioRecord ar;
	private int bs;
	private static int SAMPLE_RATE_IN_HZ = 8000;
	private boolean isRun = false;

	public RecordThread() {
		super();
		bs = AudioRecord.getMinBufferSize(SAMPLE_RATE_IN_HZ,
				AudioFormat.CHANNEL_CONFIGURATION_MONO,
				AudioFormat.ENCODING_PCM_16BIT);
		ar = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE_IN_HZ,
				AudioFormat.CHANNEL_CONFIGURATION_MONO,
				AudioFormat.ENCODING_PCM_16BIT, bs);
	}

	public void run() {
		super.run();
		ar.startRecording();
                // 用于读取的 buffer
		byte[] buffer = new byte[bs];
		isRun = true;
		while (isRun) {
			int r = ar.read(buffer, 0, bs);
			int v = 0;
                        // 将 buffer 内容取出，进行平方和运算
			for (int i = 0; i &lt; buffer.length; i++) {
				// 这里没有做运算的优化，为了更加清晰的展示代码
				v += buffer[i] * buffer[i];
			}
			// 平方和除以数据总长度，得到音量大小。可以获取白噪声值，然后对实际采样进行标准化。
			// 如果想利用这个数值进行操作，建议用 sendMessage 将其抛出，在 Handler 里进行处理。
			Log.d(&quot;spl&quot;, String.valueOf(v / (float) r));
		}
		ar.stop();
	}

	public void pause() {
                // 在调用本线程的 Activity 的 onPause 里调用，以便 Activity 暂停时释放麦克风
		isRun = false;
	}

	public void start() {
                // 在调用本线程的 Activity 的 onResume 里调用，以便 Activity 恢复后继续获取麦克风输入音量
		if (!isRun) {
			super.start();
		}
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2010/11/android-%e5%ae%9e%e6%97%b6%e8%8e%b7%e5%8f%96%e9%ba%a6%e5%85%8b%e9%a3%8e%e8%be%93%e5%85%a5%e9%9f%b3%e9%87%8f%e7%9a%84%e4%bb%a3%e7%a0%81/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Netbeans 6.8 发布，首先需要解决的小bug</title>
		<link>http://www.mikespook.com/2009/12/netbeans-6-8-%e5%8f%91%e5%b8%83%e4%ba%86%e2%80%a6%e2%80%a6%e9%a6%96%e5%85%88%e8%a7%a3%e5%86%b3%e7%9a%84%e5%b0%8fbug/</link>
		<comments>http://www.mikespook.com/2009/12/netbeans-6-8-%e5%8f%91%e5%b8%83%e4%ba%86%e2%80%a6%e2%80%a6%e9%a6%96%e5%85%88%e8%a7%a3%e5%86%b3%e7%9a%84%e5%b0%8fbug/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 03:02:14 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[bug]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=441</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Oracle 对 Sun 的收购，还未真正尘埃落定，坊间就流言四起……Netbeans 6.8 的发布，无疑增强了大家对 Netbeans 在带着神谕的阳光下生存下去的信心。于是，还未上班前，趁着大家吃早餐的时间全速下回来了最新的 Netbeeans 6.8 的 j2se 开发版本。赏玩一番……

本来呢，由于工作的原因，Netbeans 我会用来做 PHP、C 的开发（无奈 python 插件还有许多 bug，python 的开发已经迁移到 pyDev 了），java 本身只是做做作业，随便玩以下的。但是完整的 Netbeans 版本体积直逼 Eclipse，下载起来实在让人心焦，所以就按照以往的习惯，下一基本的版本，再安装插件。

<span class="readmore"><a href="http://www.mikespook.com/2009/12/netbeans-6-8-%e5%8f%91%e5%b8%83%e4%ba%86%e2%80%a6%e2%80%a6%e9%a6%96%e5%85%88%e8%a7%a3%e5%86%b3%e7%9a%84%e5%b0%8fbug/" title="Netbeans 6.8 发布，首先需要解决的小bug">阅读全文——共1082字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Oracle 对 Sun 的收购，还未真正尘埃落定，坊间就流言四起……Netbeans 6.8 的发布，无疑增强了大家对 Netbeans 在带着神谕的阳光下生存下去的信心。于是，还未上班前，趁着大家吃早餐的时间全速下回来了最新的 Netbeeans 6.8 的 j2se 开发版本。赏玩一番……</p>
<p>本来呢，由于工作的原因，Netbeans 我会用来做 PHP、C 的开发（无奈 python 插件还有许多 bug，python 的开发已经迁移到 pyDev 了），java 本身只是做做作业，随便玩以下的。但是完整的 Netbeans 版本体积直逼 Eclipse，下载起来实在让人心焦，所以就按照以往的习惯，下一基本的版本，再安装插件。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-splash.png"><img class="alignnone size-full wp-image-442" title="netbeans-6.8-splash" src="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-splash.png" alt="netbeans-6.8-splash" width="472" height="297" /></a><span id="more-441"></span>新的启动闪屏还是很有感觉的，貌似，能提高编码的兴趣……我是瞎说的……</p>
<p>菜单中文字体过小的这个缺陷看来还没有被修正。或许 Netbeans 的开发人员不觉得菜单字太小是个麻烦吧。</p>
<p>打开了“工具-&gt;插件-&gt;可用插件”准备安装 PHP、Python、C/C++ 的支持插件。这时发现不对了，插件怎么这么少？只有 21 个？看错了？Bug？搜索了以下，PHP 插件只有“Selenuim Module for PHP”这个 beta 版的插件。正式版的 PHP 插件没有了。Python 这个 Beta 版的插件有。C/C++ 支持这个正式的插件没有。</p>
<p>这实在太诡异了……是不是插件目录加载不完全？点击“重新装入目录”让 Netbeans 重新加载下插件目录，这时出问题了：<a href="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-warning.png"><img class="alignnone size-full wp-image-443" title="netbeans-6.8-warning" src="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-warning.png" alt="netbeans-6.8-warning" width="422" height="370" /></a></p>
<p>居然提示我无法连接……难道是给墙了？在浏览器里打开 Netbeans 默认的更新地址：<a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog_zh_CN.xml.gz" target="_blank">http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog_zh_CN.xml.gz</a>，404 错误，原来是插件目录文件不存在。</p>
<p>访问 <a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/ " target="_blank">http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/</a> 得到插件目录文件 <a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog.xml.gz" target="_blank">http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog.xml.gz</a>，通过“工具-&gt;插件-&gt;设置”添加这个插件目录作为更新中心的源。删除原来不存在的更新中心。PHP、C/C++ 的插件再次出现在可安装的插件列表里。</p>
<p>看来是多语言包出的问题啊！</p>
<p>跟进：<a href="https://netbeans.org/bugzilla/show_bug.cgi?id=178459" target="_blank">https://netbeans.org/bugzilla/show_bug.cgi?id=178459</a> 原来，更新中心的文件是对的，但是他们忘记发布了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2009/12/netbeans-6-8-%e5%8f%91%e5%b8%83%e4%ba%86%e2%80%a6%e2%80%a6%e9%a6%96%e5%85%88%e8%a7%a3%e5%86%b3%e7%9a%84%e5%b0%8fbug/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Netbeans Python 调试，郁闷的包导入问题</title>
		<link>http://www.mikespook.com/2009/11/netbeans-python-%e8%b0%83%e8%af%95%ef%bc%8c%e9%83%81%e9%97%b7%e7%9a%84%e5%8c%85%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/</link>
		<comments>http://www.mikespook.com/2009/11/netbeans-python-%e8%b0%83%e8%af%95%ef%bc%8c%e9%83%81%e9%97%b7%e7%9a%84%e5%8c%85%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 03:50:00 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[调试]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=419</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
这几天在帮忙开发一个 python 项目。使用 netbeans 的时候，遇到一个诡异的问题。

如果使用“运行”来跑项目，一切正常。而如果使用“调试”来跑项目，当执行到 import 第三方的库的时候，就会产生“ImportError: No module named xxxx”。郁闷不已，上网查了半天，没找到可用的信息。

毛主席教育我们“自己动手，丰衣足食”。于是就祭出“观察、归纳和总结”的科学的研究方法，对这个灵异现象进行了一番探索。

<span class="readmore"><a href="http://www.mikespook.com/2009/11/netbeans-python-%e8%b0%83%e8%af%95%ef%bc%8c%e9%83%81%e9%97%b7%e7%9a%84%e5%8c%85%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/" title="Netbeans Python 调试，郁闷的包导入问题">阅读全文——共1424字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>这几天在帮忙开发一个 python 项目。使用 netbeans 的时候，遇到一个诡异的问题。</p>
<p>如果使用“运行”来跑项目，一切正常。而如果使用“调试”来跑项目，当执行到 import 第三方的库的时候，就会产生“ImportError: No module named xxxx”。郁闷不已，上网查了半天，没找到可用的信息。</p>
<p>毛主席教育我们“自己动手，丰衣足食”。于是就祭出“观察、归纳和总结”的科学的研究方法，对这个灵异现象进行了一番探索。<span id="more-419"></span></p>
<p>出现导入问题的包都是用了 egg 打包的第三方包。在我的系统中，这几个包都是放在/usr/local/lib/python2.6/dist-packages/下。在命令行能正常执行，在 netbeans 中直接执行也无异常。说明包本身的安装没有问题。那么 netbeans 调试就出现找不到这个包，是不是 netbeans 的调试环境有什么特殊呢？看了一下 netbeans 的调试窗口，发现这个脚本~/.netbeans/6.7/config/nbPython/debug/nbpythondebug/jpydaemon.py。很明显，这个是 netbeans 为了集成调试功能而开发的一个 python 调试器。难道是这个netbeans自带的调试器的问题？祭出 sys.path 一看，果然正常执行的时候，dist-packages 下的 egg 包都被放到搜索路径里。而调试的时候，没有一个 egg 包在 sys.path 中。而是多了一些 netbeans 使用的目录而已。</p>
<p>郁闷啊，为什么调试器不能直接继承系统环境呢？</p>
<p>于是乎，将每个 egg 包都手工加入 Python Platforms 的 Python Path 里。问题解决了。可以带第三方 egg 包来调试项目了。</p>
<p>虽然问题解决了，不过还是不爽，如果我一个项目要是有 n 个 egg 包，那不是要每个都设置一下？</p>
<p>Hacking……</p>
<p>发现 jpydaemon.py 的 1588 行修改了sys.path，导致默认的路径信息丢失。</p>
<pre lang="python">pythonPath = dbgutils.PythonPathHandler(None)
pythonPath.getPyPathFromEnv()</pre>
<p>再检查 dbgutils.py ，原来 netbeans 的调试环境只读取了环境变量 PYTHONPATH，未添加默认的 sys.path。而我并没有使用 PYTHONPATH 环境变量，所以导致一些安装好的包无法导入。164 行直接覆盖了 sys.path。</p>
<pre lang="python">    def getPyPathFromEnv( self ):
        "PYTHONPATH env and set sys.path out of it "
        pyPath = os.environ["PYTHONPATH"]
        # cleanly take care of previous ';' convention
        if os.pathsep != ';':
            pyPath.replace(';' , os.pathsep)
        if pyPath.find(os.pathsep) != -1:
            sys.path = pyPath.split(os.pathsep)
            # remove empty nodes first
            for element in sys.path:
                if ( len(element.strip())==0 ):
                    sys.path.remove(element)</pre>
<p>修改 164 行</p>
<pre lang="python">sys.path = pyPath.split(os.pathsep) + sys.path</pre>
<p>这个世界又清爽了……</p>
<p>不知道会不会有什么问题。有问题，继续 fix 好了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2009/11/netbeans-python-%e8%b0%83%e8%af%95%ef%bc%8c%e9%83%81%e9%97%b7%e7%9a%84%e5%8c%85%e5%af%bc%e5%85%a5%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>在游戏中使用脚本语言</title>
		<link>http://www.mikespook.com/2009/05/%e5%9c%a8%e6%b8%b8%e6%88%8f%e4%b8%ad%e4%bd%bf%e7%94%a8%e8%84%9a%e6%9c%ac%e8%af%ad%e8%a8%80/</link>
		<comments>http://www.mikespook.com/2009/05/%e5%9c%a8%e6%b8%b8%e6%88%8f%e4%b8%ad%e4%bd%bf%e7%94%a8%e8%84%9a%e6%9c%ac%e8%af%ad%e8%a8%80/#comments</comments>
		<pubDate>Fri, 22 May 2009 05:55:34 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[Game]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Scripting]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=330</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
这只是一个有趣的探索，demo 使用 java 编写。模拟了一个龙与地下城类 RPG 游戏中，在不同的房间内移动的简单游戏场景。

阅读本文前，首先下载使用 Netbeans 6.5 建立的完整项目代码：下载。然后，我会用 UML 图的方式来说明如何在游戏中使用脚本，其中可能还会简介一下游戏中实体对象的建立和管理（不知道值得不值得另外写一篇文章来介绍了）。

I have a dream&#8230;

<span class="readmore"><a href="http://www.mikespook.com/2009/05/%e5%9c%a8%e6%b8%b8%e6%88%8f%e4%b8%ad%e4%bd%bf%e7%94%a8%e8%84%9a%e6%9c%ac%e8%af%ad%e8%a8%80/" title="在游戏中使用脚本语言">阅读全文——共3691字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>这只是一个有趣的探索，demo 使用 java 编写。模拟了一个龙与地下城类 RPG 游戏中，在不同的房间内移动的简单游戏场景。</p>
<p>阅读本文前，首先下载使用 Netbeans 6.5 建立的完整项目代码：<a href="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting.zip">下载</a>。然后，我会用 UML 图的方式来说明如何在游戏中使用脚本，其中可能还会简介一下游戏中实体对象的建立和管理（不知道值得不值得另外写一篇文章来介绍了）。</p>
<p>I have a dream&#8230;<span id="more-330"></span></p>
<p>现在要构建一个极为无聊的小世界。说它小，是因为我只打算让它有三个房间，三个房间之间两两互通的门。仅此而已。首先上图：<a href="http://www.mikespook.com/wp-content/uploads/2009/05/rooms.gif"><img class="alignright size-full wp-image-333" title="三个房间" src="http://www.mikespook.com/wp-content/uploads/2009/05/rooms.gif" alt="三个房间" width="241" height="241" /></a></p>
<p>我们假设左边上面的房间叫 room-1，右边上面的房间叫 room-2，下面的房间叫 room-3。玩家在这三个房间中穿行，当然，不可能是穿墙。人，一定是要走门的。如图。就这么简单的逻辑而已，不用脚本语言也能轻松完成。不过如果希望多来一点拓展性呢？比如，room-3 不允许等级在5级以下玩家进入；room-2 当十级以上玩家进入后就会自动瞬间移动到 room-1；门锁住以后就不能通过，更夸张一点，门锁住以后如果不把锁打坏就不能通过……可能性太多了。不用脚本的情况下，如果要将这么多都实现，是一件非常繁琐的事情。</p>
<p>好吧，让我们来看看那些游戏公司是怎么解决这个问题的。哦，需要说明的是，这里的解决方案仅仅是一个 demo，只用来解释原理。真正的环境中，还要更复杂一点，不过也就是复杂一点点而已。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting-e7b1bbe59bbe-1.jpg"><img class="alignleft size-medium wp-image-334" title="类图" src="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting-e7b1bbe59bbe-1-300x211.jpg" alt="类图" width="300" height="211" /></a>游戏中实体类如图设计，为了简化期间，没有实体管理器，所以也没有集成自统一的父类。</p>
<p>Ninny 类也就是玩家，有保存当前所在房间的成员变量。Room 类也就是房间，保存有在当前房间的玩家列表。Door 是描述门的类，保存了这个门连接的两个房间的列表。</p>
<p>为了简单期间，demo 中使用了 java 内置的 javascript 作为脚本语言，详情看<a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/" target="_blank">这里</a>。</p>
<p><span style="text-decoration: line-through;">本来还想多写一点的，急着出门。算了，反正有代码，大家看看先。有空回头写。重点在 js 目录下的那几个脚本 enterDoor.js，exitDoor.js，enterRoom.js，exitRoom.js。</span></p>
<p>好，继续！</p>
<p>为了用起来方便，稍稍封装了一下Scripting的代码。大家直接看代码，不说话：</p>
<pre lang="Java" line="1">
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class Script {

    private final static ScriptEngineManager factory = new ScriptEngineManager();
    private final static ScriptEngine engine = factory.getEngineByName("JavaScript");

    public void put(String key, Object value) {
        engine.put(key, value);
    }

    public Object get(String key) {
        return engine.get(key);
    }

    public Object eval(String fileName) throws ScriptException {
        try {
            return engine.eval(new FileReader(System.getProperty("user.dir", ".") + "/js/" + fileName + ".js"));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Script.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}
</pre>
<p>从类图上可以看到，Door 和 Room 都实现了 Enterable 接口，两个方法：一个入 enter，一个出 exit。显然，当进入一个 Room 的时候，必须从另外一个房间出来。为了保证这个一致性，所以限定玩家不能穿墙只能走门：</p>
<pre lang="Java" line="1">
        Room r1 = new Room("room-1");
        Room r2 = new Room("room-2");
        Door d12 = new Door();
        d12.add(r1);
        d12.add(r2);
        Ninny player = new Ninny("ninny", r1);
        d12.enter(player);
</pre>
<p>在不用脚本的情况下怎么写这个 Door 的 enter 方法呢？首先判断一下 ninny 是不是跟 Door 在同一个房间；获得 ninny 的当前房间后 exit；获得门另一端的房间 enter。就是这么简单。不过考虑到前面说说的那种种可能性，为了拓展让我们来看一看用脚本是如何处理的：</p>
<pre lang="Java" line="1">
// Door 的 enter 方法
    public boolean enter(Ninny ninny) {
        Room currentRoom = ninny.getOwner();
        // 玩家在当前门所在的房间
        if(!member.containsKey(currentRoom.getName())) {
            return false;
        }
        // 门另一侧的房间
        Room nextRoom = getAnotherRoom(currentRoom);

        try {
            Script script = new Script();
            script.put("room1", currentRoom);
            script.put("room2", nextRoom);
            script.put("door", this);
            script.put("player", ninny);
            script.eval("enterDoor");
            System.out.println("enterDoor: " + script.get("message"));
            return Boolean.valueOf(script.get("result").toString());
        } catch (ScriptException ex) {
            Logger.getLogger(Door.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
</pre>
<p>这里实际上 enter 什么也没有做，只是传递了一些数据到 Script，然后执行了 enterDoor 这个脚本：</p>
<pre lang="JavaScript" line="1">
importClass(Packages.foobar.Room);
importClass(Packages.foobar.Ninny);
importClass(Packages.foobar.Door);

room1.exit(player);
room2.enter(player);

var message = player.getName() + " enter from the room " + room1.getName() +  " to the romm " + room2.getName() + "!";
var result = true;
</pre>
<p>脚本也很简单，只是让玩家推出当前房间，进入下一个房间。如果房间对进入的玩家有等级要求，则只需：</p>
<pre lang="JavaScript" line="1">
importClass(Packages.foobar.Room);
importClass(Packages.foobar.Ninny);
importClass(Packages.foobar.Door);

var result = false;
var message = '';
if(room2.needLevel >= player.level ) {
    room1.exit(player);
    room2.enter(player);

    message = player.getName() + " enter from the room " + room1.getName() +  " to the romm " + room2.getName() + "!";
    result = true;
} else {
    message = player.getName() + " can't enter the romm " + room2.getName() + "! Level" + room2.needLevel +" needed!";
}
</pre>
<p>在我的例子代码中并没有这部分代码，实际上 Room、Door、Ninny 这几个类都应该从一个父类 Entity 中继承。这个 Entity 有一个 Map<String, Object> 的成员变量。通过 setAttr(String, Object) 和 getAttr(String) 两个方法就可以分别设置和获取每个 Entity 的属性。这样就可以在脚本中自由的使用各种属性来实现各种功能。<br />
通过 Enterable（可进入），Pickable（可捡起），Attackable（可攻击）等接口，调用对应的脚本来完成真正的游戏逻辑。<br />
其实那神秘的游戏脚本化就是这么简单。本来还想画几个序列图说明一下脚本的调用，实在有些困了。<br />
准备洗洗睡觉。尚未补充完整的内容，全当大家进阶学习吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2009/05/%e5%9c%a8%e6%b8%b8%e6%88%8f%e4%b8%ad%e4%bd%bf%e7%94%a8%e8%84%9a%e6%9c%ac%e8%af%ad%e8%a8%80/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>在 Netbeans 6.5 中运行和调试基于 Darkstar 的服务器程序</title>
		<link>http://www.mikespook.com/2008/12/%e5%9c%a8-netbeans-65-%e4%b8%ad%e8%bf%90%e8%a1%8c%e5%92%8c%e8%b0%83%e8%af%95%e5%9f%ba%e4%ba%8e-darkstar-%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%a8%8b%e5%ba%8f/</link>
		<comments>http://www.mikespook.com/2008/12/%e5%9c%a8-netbeans-65-%e4%b8%ad%e8%bf%90%e8%a1%8c%e5%92%8c%e8%b0%83%e8%af%95%e5%9f%ba%e4%ba%8e-darkstar-%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%a8%8b%e5%ba%8f/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 08:43:45 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Darkstar]]></category>
		<category><![CDATA[MMO]]></category>
		<category><![CDATA[Web game]]></category>
		<category><![CDATA[设置]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=247</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
Web game 一直以来被大家认为是开发技术门槛低，推广容易的一种游戏形式。但是在我1年来开发 web game 积累下来的经验来看，没有服务器端的 web game 只能被当作玩具，而不是一个可以运营的游戏（当然关于 Web game 技术考量关于这个话题，是我可能要写的另外一篇文章了）。为了这个目的，最近特意研究了一下 Darkstar。

Darkstar 是 SUN 公司支持的一个开源的多人在线游戏（MMO）架构，它提供了任务、数据、信道以及会话管理等一系列的功能。使得开发人员可以更加专注的设计开发游戏相关逻辑，而不是服务器基本功能设计或负载调优等等重复的体力活。关于 Darkstar 的详细介绍，可能要写 N 篇文章来说明。先有个大概了解就好了。

<span class="readmore"><a href="http://www.mikespook.com/2008/12/%e5%9c%a8-netbeans-65-%e4%b8%ad%e8%bf%90%e8%a1%8c%e5%92%8c%e8%b0%83%e8%af%95%e5%9f%ba%e4%ba%8e-darkstar-%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%a8%8b%e5%ba%8f/" title="在 Netbeans 6.5 中运行和调试基于 Darkstar 的服务器程序">阅读全文——共1785字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>Web game 一直以来被大家认为是开发技术门槛低，推广容易的一种游戏形式。但是在我1年来开发 web game 积累下来的经验来看，没有服务器端的 web game 只能被当作玩具，而不是一个可以运营的游戏（当然关于 Web game 技术考量关于这个话题，是我可能要写的另外一篇文章了）。为了这个目的，最近特意研究了一下 Darkstar。</p>
<p><a href="http://www.projectdarkstar.com/" target="_blank">Darkstar</a> 是 SUN 公司支持的一个开源的多人在线游戏（MMO）架构，它提供了任务、数据、信道以及会话管理等一系列的功能。使得开发人员可以更加专注的设计开发游戏相关逻辑，而不是服务器基本功能设计或负载调优等等重复的体力活。关于 Darkstar 的详细介绍，可能要写 N 篇文章来说明。先有个大概了解就好了。</p>
<p>基于 Darkstar 开发服务器端的时候，不需要自己写主类。只要按照 Darkstar 提供的标准实现如 AppListener 等等的接口，就可以将开发人员实现的相关功能加入 Darkstar 架构中执行。Darkstar 分别在 *nix 系统和 windows 系统提供了 sgs.sh 和 sgs.bat 两个脚本，以方便使用。</p>
<p><a href="http://www.netbeans.org/" target="_blank">Netbeans 6.5</a> 的发布，给沉闷的开发带来了一丝生气。即使是我那 512M 内存的运行 xubuntu 的笔记本，跑起 Netbeans 也如行云流水般流畅（Eclipse 的粉丝别砸我，Eclipse 我开都不敢开）。<span id="more-247"></span>我一般是使用 Netbeans 编写 java 代码，上网找了一下，netbeans 的一个 Darkstar 插件已经有一些时候没有更新了。这使得在 Netbeans 中开发 Darkstar 很不方便，不能直接运行，也不能调试。在研究了 sgs.sh 和 sgs.bat 之后发现，这两个脚本实际上只是设置了 java 命令的一些参数，使得 Darkstar 可以执行。那么将这些参数移入 Netbeans 就可以在其中直接运行和调试了（这篇<a href="http://www.projectdarkstar.com/component/option,com_smf/Itemid,120/topic,634.0" target="_blank">帖子</a>验证了这个想法）。</p>
<p>首先添加库的时候，除了设置类路径和 javadoc 外，还应将 sgs-server-0.9.7-sources.jar 设置到源中去，方便开发和调试。</p>
<p>然后在“项目属性”中找到“运行”，按照下表填写：</p>
<p>主类：com.sun.sgs.impl.kernel.Kernel</p>
<p>参数：foobar.properties</p>
<p>工作目录：F:\java\FoobarServer\data</p>
<p>VM 选项：-Djava.library.path=F:\java\libs\sgs\sgs-server-0.9.7\lib\bdb\win32-x86</p>
<p>其中<strong>主类</strong>是在项目导入的 sgs-server.jar 中的类。在任何环境下都只可以填写这个 Kernel 类。</p>
<p><strong>参数</strong>是项目的配置文件，这个文件一般有下面的内容：</p>
<p>com.sun.sgs.app.name=HelloFoobar<br />
com.sun.sgs.app.root=F:/java/FoobarServer/data/<br />
com.sun.sgs.app.port=1139<br />
com.sun.sgs.app.listener=com.xxiyy.game.server.FoobarServer</p>
<p>name 是项目名称。root 是项目根目录，跟目录必须含有子目录 dsdb，用来存储序列会对象数据。port 是服务器监听的端口。listener 即是实现 AppListener 接口的用户类了。需要注意的是，如果不是用绝对路径，properties 文件是相对于<strong>工作目录</strong>来说的。</p>
<p><strong>工作目录</strong>需要对应 properties 文件中的 root 选项。一定要注意，工作目录必须含有子目录 dsdb。否则运行的时候会提示无法找到路径的错误。</p>
<p><strong>VM 选项</strong>是因为 Darkstar 默认使用了Berkeley db，需要加载动态库文件。对于windows 就是 bdb 所带 win32-x86 目录中的 libdb_java45.dll。对于 32 位 linux 就是 linux-x86 目录中的 libdb-4.5.so 和 libdb_java-4.5.so。其他不同系统类推。如果你在运行后出现 java.lang.UnsatisfiedLinkError: no libdb_java45 in java.library.path 这样的异常，说明你的 java.library.path 没有设置正确。</p>
<p>确定后，就可以像普通 java 程序那样在 netbeans 中直接运行或调试 Darkstar 程序了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2008/12/%e5%9c%a8-netbeans-65-%e4%b8%ad%e8%bf%90%e8%a1%8c%e5%92%8c%e8%b0%83%e8%af%95%e5%9f%ba%e4%ba%8e-darkstar-%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%99%a8%e7%a8%8b%e5%ba%8f/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>netbeans 6.5 rc 下建立 Zend Framework 项目</title>
		<link>http://www.mikespook.com/2008/10/netbeans-65-rc-%e4%b8%8b%e5%bb%ba%e7%ab%8b-zend-framework-%e9%a1%b9%e7%9b%ae/</link>
		<comments>http://www.mikespook.com/2008/10/netbeans-65-rc-%e4%b8%8b%e5%bb%ba%e7%ab%8b-zend-framework-%e9%a1%b9%e7%9b%ae/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 04:37:13 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=205</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
首先，这不是一个指南，这只是一个简易说明。描述了如何在 netbeans 6.5 rc for php 中建立、开发、调试 Zend Framework 项目。

step by step:

1. 安装 netbeans 6.5 rc for php，由于 netbeans 6.5 rc for php 官方只放出了英文版本。中文版本要在这里下载。

<span class="readmore"><a href="http://www.mikespook.com/2008/10/netbeans-65-rc-%e4%b8%8b%e5%bb%ba%e7%ab%8b-zend-framework-%e9%a1%b9%e7%9b%ae/" title="netbeans 6.5 rc 下建立 Zend Framework 项目">阅读全文——共1782字</a></span>]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>首先，这不是一个指南，这只是一个简易说明。描述了如何在 netbeans 6.5 rc for php 中建立、开发、调试 Zend Framework 项目。</p>
<p>step by step:<span id="more-205"></span></p>
<p>1. 安装 netbeans 6.5 rc for php，由于 netbeans 6.5 rc for php 官方只放出了<a href="http://download.netbeans.org/netbeans/6.5/rc/bundles/netbeans-6.5rc1-php-windows.exe" target="_blank">英文版本</a>。中文版本要在<a href="http://dlc.sun.com.edgesuite.net/netbeans/6.5/rc/" target="_blank">这里下载</a>。</p>
<p>2. 安装 xdebug，这不是必要的一部，不过如果你想在 netbeans 中调试 php。这是非常必要的。相关内容去 <a href="http://xdebug.org/" target="_blank">xdebug 官方网站</a>了解，<a href="http://www.mikespook.com/index.php/archives/34" target="_blank">这里</a>也有简单的说明。</p>
<p>3. 我假设你在安装 netbeans 6.5 rc for php 未遇到任何问题，如果遇到了，请参考 netbeans 的 <a href="http://wiki.netbeans.org/NetBeansUserFAQ#section-NetBeansUserFAQ-Installation" target="_blank">FAQ 关于安装的部分</a>。</p>
<p>4. 打开 netbeans 6.5 rc for php，在菜单中选择“新建项目”。当然更多时候 Ctrl+Shift+N 是一个更好的主意。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_1.jpg"><img class="alignnone size-medium wp-image-208" title="netbeans_for_php_1" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_1.jpg" alt="" width="296" height="128" /></a></p>
<p>5. 选择“PHP 应用程序”点下一步。也可以导入现有的代码，实际上两者并无本质区别。</p>
<p>6. 设置项目的名称以及存储目录。实际上这个存储目录需要将所有项目用到的文件，如代码、文档、配置都包含进去，否则开发时将遇到无穷无尽的从 netbeans 切换到其他工具，再切换回来的情况。而用到的不再进行修改的库文件，反而可以不用包含。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_7.jpg"><img class="alignnone size-medium wp-image-209" title="netbeans_for_php_7" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_7.jpg" alt="" width="148" height="99" /></a></p>
<p>7. 设置好名称和目录后，在“运行配置”中选择项目的部署方式，以及索引文件。通常本地开发网站，默认选择第一种方式即可。这时，netbeans 会默认以项目目录作为 webroot。索引文件可先随意选择一个项目目录中的文件。通常 Zend Framework 开发中 webroot 只是包含 index.php 入口和样式、图片等客户端使用的文件。例如目录“&lt;项目目录&gt;/www”。由于 Zend Framework 部署的特殊性，这里还要做修改。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_2.jpg"><img class="alignnone size-medium wp-image-210" title="netbeans_for_php_2" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_2-300x94.jpg" alt="" width="300" height="94" /></a></p>
<p>8. 在“项目”面板中选择刚才建立的 php 项目，点击鼠标右键选择菜单项“属性”。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_8.jpg"><img class="alignnone size-medium wp-image-211" title="netbeans_for_php_8" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_8-225x300.jpg" alt="" width="225" height="300" /></a></p>
<p>9. 在类别“源”的“Web 根目录”选择你真正的 webroot。例如：&lt;项目目录&gt;/www。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_3.jpg"><img class="alignnone size-medium wp-image-212" title="netbeans_for_php_3" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_3-300x84.jpg" alt="" width="300" height="84" /></a></p>
<p>10. 在“项目属性”的“运行配置”类别中，调整索引文件到 index.php。实际上，如果你完成了 step 9，这里会有一个“不是合法的索引文件”的警告。直到你重新调整索引文件为合法文件。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_4.jpg"><img class="alignnone size-medium wp-image-213" title="netbeans_for_php_4" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_4-300x72.jpg" alt="" width="300" height="72" /></a></p>
<p>11. 在“项目属性”的“PHP 包含路径”中设置你的 Zend Framework 路径。例如从 svn 导出的某个路径 ~/Zend Framework\library。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_5.jpg"><img class="alignnone size-medium wp-image-214" title="netbeans_for_php_5" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_5-300x99.jpg" alt="" width="300" height="99" /></a></p>
<p>12. 至此已经基本设置完成，需要注意的是“项目属性”中的“调试服务器端 PHP”和“调试客户端 JavaScript” 需要勾上才可以正常调试。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_6.jpg"><img class="alignnone size-medium wp-image-215" title="netbeans_for_php_6" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_6-300x90.jpg" alt="" width="300" height="90" /></a></p>
<p>简单测试一下代码编辑和调试的情况：</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_9.jpg"><img class="alignnone size-medium wp-image-216" title="netbeans_for_php_9" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_9-283x300.jpg" alt="" width="283" height="300" /></a></p>
<p>漂亮完整的代码提示，包括方法或属性类型、参数、所在的类名或文件名等等。同时还会解析 phpdoc。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_10.jpg"><img class="alignnone size-medium wp-image-217" title="netbeans_for_php_10" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_10-300x94.jpg" alt="" width="300" height="94" /></a></p>
<p>强大的单步调试，我以前说过 php 让我头疼的就是调试。虽然 xdebug 很完美，但是所有调试器都有这样那样的不足。现在 netbeans 带来的是 java style 的调试方式，很好，很强大。</p>
<p><a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_11.jpg"><img class="alignnone size-medium wp-image-218" title="netbeans_for_php_11" src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_11-300x176.jpg" alt="" width="300" height="176" /></a></p>
<p>变量的监视信息详实准确，无需再为一个变量的值而 echo 来 var_dump 去了。</p>
<p>总体上来说，netbeans 6.5rc for php 是我见过的比较好的 IDE for php 之一。即便我坚信 IDE is evil ，netbeans for php 也让我眼前一亮。再配合其他插件如 svn、uml、database，已经无需其他工具辅助即可完成 php 日常开发所需。不过试用之后，也发现一些不足的地方：比如有一些提示框中英文混杂在一起；新建 php 工程的向导设置也过于简单，以至于建立 Zend Framework 项目时需要建立好后再次调整项目设置；又比如会莫名其妙的提示一个临时目录下某文件无法访问；再如代码提示时不能正确解析魔法方法，无法提示魔法方法提供的魔法属性等等。不过相信在正式的 6.5 版中这些问题都会一一得到解决，作为一个 rc 版本的软件来说，netbeans 已经做得够好了。</p>
<p>我计划在 PNP-广州 PHP 街坊群中推荐 netbeans 作为初学 Zend Framework 的平台，这样可以利用强大的单步功能，和代码提示功能来学习 Zend Framework，了解 Zend Framework 的运行机制。不知道大家对此有什么看法和意见，欢迎讨论。</p>
<p>PS: 推荐 eclipse 的朋友务必请考虑一下我那只有 512M 内存的本本，当时选择用 netbeans 写 java，就是因为它不是那么消耗内存和 cpu。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2008/10/netbeans-65-rc-%e4%b8%8b%e5%bb%ba%e7%ab%8b-zend-framework-%e9%a1%b9%e7%9b%ae/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Contineo &#8212; 開源的 DMS</title>
		<link>http://www.mikespook.com/2008/05/contineo-%e9%96%8b%e6%ba%90%e7%9a%84-dms/</link>
		<comments>http://www.mikespook.com/2008/05/contineo-%e9%96%8b%e6%ba%90%e7%9a%84-dms/#comments</comments>
		<pubDate>Mon, 26 May 2008 08:04:47 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Contineo]]></category>
		<category><![CDATA[DMS]]></category>
		<category><![CDATA[文檔管理系統]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=132</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
今天在 sourceforge 上看到 Contineo 這個項目。是基于 java 開發的文檔管理系統。簡單看了一下，其中用到了 lucene、Axis2 等技術。文檔可以分層放于樹狀目錄中，并可以根據關鍵字進行檢索。似乎值得研究，特別備忘一下。

]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>今天在 <a href="http://www.sf.net" target="_blank">sourceforge</a> 上看到 <a href="http://contineo.wikispaces.com/" target="_blank">Contineo</a> 這個項目。是基于 java 開發的文檔管理系統。簡單看了一下，其中用到了 lucene、Axis2 等技術。文檔可以分層放于樹狀目錄中，并可以根據關鍵字進行檢索。似乎值得研究，特別備忘一下。</p>
<p><img src="http://sourceforge.net/dbimage.php?id=162593" border="1" alt="Screenshot" width="640" height="449" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2008/05/contineo-%e9%96%8b%e6%ba%90%e7%9a%84-dms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans 6 下使用 vim 的插件</title>
		<link>http://www.mikespook.com/2008/04/netbeans-6-%e4%b8%8b%e4%bd%bf%e7%94%a8-vim-%e7%9a%84%e6%8f%92%e4%bb%b6/</link>
		<comments>http://www.mikespook.com/2008/04/netbeans-6-%e4%b8%8b%e4%bd%bf%e7%94%a8-vim-%e7%9a%84%e6%8f%92%e4%bb%b6/#comments</comments>
		<pubDate>Tue, 29 Apr 2008 06:37:20 +0000</pubDate>
		<dc:creator>mikespook</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[viex]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.mikespook.com/?p=118</guid>
		<description><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
在厭倦了來回切換 gvim 和 netbeans，以及無數次向代碼中插入冒號之后，決定為 Netbeans 安裝一個 vim 插件。externaleditor 已經過分古舊。大概是對自己的編輯器很有信心吧, 官方沒有提供 6.0 的編輯器擴展方式。

在 sf 上找到了這個東東——VIEX，還可以，就像它介紹的那樣“Is not very good, but useful”。

不過遺憾的是，好像并不是直接內嵌 vim 到 netbeans。而是模擬了 vim 的使用方式。所以總有些用著不合適的地方。不過不管怎么說 :w 能存盤了。

]]></description>
			<content:encoded><![CDATA[<style type="text/css">
#leftcontainerBox {
	float:left;
	position: fixed;
	top: 60%;
	left: 70px;
}
#leftcontainerBox .buttons {
	float:left;
	clear:both;
	margin:4px 4px 4px 4px;
	padding-bottom:2px;
}
#bottomcontainerBox {
	width: 50%;
	padding-top: 1px;
}
#bottomcontainerBox .buttons {
	float: left;
	margin: 4px 4px 4px 4px;
}
</style>
<p>在厭倦了來回切換 gvim 和 netbeans，以及無數次向代碼中插入冒號之后，決定為 Netbeans 安裝一個 vim 插件。externaleditor 已經過分古舊。大概是對自己的編輯器很有信心吧, 官方沒有提供 6.0 的編輯器擴展方式。</p>
<p>在 <a href="http://www.sf.net" target="_blank">sf</a> 上找到了這個東東——<a href="http://viex.sourceforge.net/" target="_blank">VIEX</a>，還可以，就像它介紹的那樣“Is not very good, but useful”。</p>
<p>不過遺憾的是，好像并不是直接內嵌 vim 到 netbeans。而是模擬了 vim 的使用方式。所以總有些用著不合適的地方。不過不管怎么說 :w 能存盤了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikespook.com/2008/04/netbeans-6-%e4%b8%8b%e4%bd%bf%e7%94%a8-vim-%e7%9a%84%e6%8f%92%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

