<?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>liulang&#039;s blog</title>
	<atom:link href="http://www.liulang.cq.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://www.liulang.cq.cn</link>
	<description>既然选择了远方，便只顾风雨兼程……</description>
	<lastBuildDate>Mon, 05 Dec 2011 15:49:44 +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应用开发者的十个建议</title>
		<link>http://www.liulang.cq.cn/20111205/10-android-app-performance-tips-for-developers.html</link>
		<comments>http://www.liulang.cq.cn/20111205/10-android-app-performance-tips-for-developers.html#comments</comments>
		<pubDate>Mon, 05 Dec 2011 15:49:44 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=315</guid>
		<description><![CDATA[尽管现在Android智能手机和平板电脑的运行速率越来越快，但开发者仍需牢记，应用的运行环境仍受到电池和处理器等诸多资源的限制。以下是如何为应用“瘦身”的十条建议，以便能在当前和以后的所有Android设备都能运行出最佳效果。 1）首先要有良好的编码习惯 一个优秀的开发者应该善于运用常识、完善的算法和标准设计模式。要有资源意识，打开了就要记得关闭，尽量做到晚获取，早释放。这些由来已久的编码准则同样适用Android应用开发，尤其是使用基础设备服务时。 2）让阻塞操作远离主UI线程 通过使用AsyncTask、线程、IntentService和自定义后台服务，保证应用的灵活性。使用加载工具简化游标等长时间加载数据的状态管理。当有其他程序运行时，不能让你的应用滞后或中止。 如果一个操作需要消耗较多时间和资源时，取消该操作，换成异步处理，这样应用就能保持响应，用户可以继续各种操作。该方法适用磁盘读写、访问内容提供方、数据库和互联网，以及解析和其他需要花费较长时间的任务。 3）使用最新的Android SDK版本和API 使用Android平台的最新产品，保证你的应用紧跟Android的更新步伐。随着Android平台的不断发展，部分功能可能被弃用或被更好的功能 取代，核心API接收了bug修复和性能改进，新API有助于开发者编写出更稳定的应用。要明白最佳的做法总是随着时间的推移而变，聪明的开发者应该总是 站在整个平台的最前沿。 4）考虑使用StrictMode 从Android 2.3开始提供了一个新的类StrictMode，该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用，可以帮助开发者改进程序，使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑，避免主线程被阻塞。 5）发布前禁用或尽量减少调试 如果开发周期较长，你很可能在应用中内置了一些日志或调试代码，在发布前确保这些功能已经最小化或完全禁用。 6）确保UI布局简单优雅 简单的屏幕不仅方便阅读，还能加快加载速度。与其在一个单一屏幕上堆砌太多不必要的功能，不如花时间去开发优雅的用户界面。简单优雅的UI不仅能提高应用性能，还能提高用户使用该应用时的效率。 7）根据目标设备调整应用资源 为尽可能高效地被加载，需要根据具体设备的配置调整相应资源，尤其是图片资源。为使应用包文件合理适用不同设备，首先可只添加运行该应用需要的核心资源，然后再根据具体设备下载相关内容。 8）使用Hierachy Viewer可视化调试工具 Hierachy Viewer能很方便地在开发者设计，调试和调整界面时，快速定位问题，解决问题，提高开发效率。 9）使用layoutopt进行布局优化 Layoutopt是一款简单的命令行工具，可帮助找到不必要的控件嵌套以及缩减布局资源，从而使应用变得可能“苗条”。控件越少、布局层次越浅，性能就越好。 10）使用Traceview及其他Android工具进行分析 Android SDK随带了很多用于应用分析的工具，其中最受欢迎的是Traceview，这款图形工具可以帮助调试和找到应用中的性能瓶颈。 结语 提升Android应用性能的方法有很多，有些需要使用特定的算法，有些依赖切实可行的调试和性能监测技术。幸运的是，Android平台随带了众多免费的实用工具，可以帮助跟踪和解决应用程序中的性能问题。]]></description>
			<content:encoded><![CDATA[<p>尽管现在Android智能手机和平板电脑的运行速率越来越快，但开发者仍需牢记，应用的运行环境仍受到电池和处理器等诸多资源的限制。以下是如何为应用“瘦身”的十条建议，以便能在当前和以后的所有Android设备都能运行出最佳效果。</p>
<p><strong>1）首先要有良好的编码习惯</strong></p>
<p>一个优秀的开发者应该善于运用常识、完善的算法和标准设计模式。要有资源意识，打开了就要记得关闭，尽量做到晚获取，早释放。这些由来已久的编码准则同样适用Android应用开发，尤其是使用基础设备服务时。<br />
<span id="more-315"></span><br />
<strong>2）让阻塞操作远离主UI线程</strong></p>
<p>通过使用AsyncTask、线程、IntentService和自定义后台服务，保证应用的灵活性。使用加载工具简化游标等长时间加载数据的状态管理。当有其他程序运行时，不能让你的应用滞后或中止。</p>
<p>如果一个操作需要消耗较多时间和资源时，取消该操作，换成异步处理，这样应用就能保持响应，用户可以继续各种操作。该方法适用磁盘读写、访问内容提供方、数据库和互联网，以及解析和其他需要花费较长时间的任务。</p>
<p><strong>3）使用最新的Android SDK版本和API</strong></p>
<p>使用Android平台的最新产品，保证你的应用紧跟Android的更新步伐。随着Android平台的不断发展，部分功能可能被弃用或被更好的功能 取代，核心API接收了bug修复和性能改进，新API有助于开发者编写出更稳定的应用。要明白最佳的做法总是随着时间的推移而变，聪明的开发者应该总是 站在整个平台的最前沿。</p>
<p><strong>4）考虑使用StrictMode</strong></p>
<p>从Android 2.3开始提供了一个新的类StrictMode，该类可以用于捕捉发生在应用程序主线程中耗时的磁盘、网络访问或函数调用，可以帮助开发者改进程序，使主线程处理UI和动画在磁盘读写和网络操作时变得更平滑，避免主线程被阻塞。</p>
<p><strong>5）发布前禁用或尽量减少调试</strong></p>
<p>如果开发周期较长，你很可能在应用中内置了一些日志或调试代码，在发布前确保这些功能已经最小化或完全禁用。</p>
<p><strong>6）确保UI布局简单优雅</strong></p>
<p>简单的屏幕不仅方便阅读，还能加快加载速度。与其在一个单一屏幕上堆砌太多不必要的功能，不如花时间去开发优雅的用户界面。简单优雅的UI不仅能提高应用性能，还能提高用户使用该应用时的效率。</p>
<p><strong>7）根据目标设备调整应用资源</strong></p>
<p>为尽可能高效地被加载，需要根据具体设备的配置调整相应资源，尤其是图片资源。为使应用包文件合理适用不同设备，首先可只添加运行该应用需要的核心资源，然后再根据具体设备下载相关内容。</p>
<p><strong>8）使用Hierachy Viewer可视化调试工具</strong></p>
<p>Hierachy Viewer能很方便地在开发者设计，调试和调整界面时，快速定位问题，解决问题，提高开发效率。</p>
<p><strong>9）使用layoutopt进行布局优化</strong></p>
<p>Layoutopt是一款简单的命令行工具，可帮助找到不必要的控件嵌套以及缩减布局资源，从而使应用变得可能“苗条”。控件越少、布局层次越浅，性能就越好。</p>
<p><strong>10）使用Traceview及其他Android工具进行分析</strong></p>
<p>Android SDK随带了很多用于应用分析的工具，其中最受欢迎的是Traceview，这款图形工具可以帮助调试和找到应用中的性能瓶颈。</p>
<p><strong>结语</strong></p>
<p>提升Android应用性能的方法有很多，有些需要使用特定的算法，有些依赖切实可行的调试和性能监测技术。幸运的是，Android平台随带了众多免费的实用工具，可以帮助跟踪和解决应用程序中的性能问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20111205/10-android-app-performance-tips-for-developers.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>install Android Ice Cream Sandwich on a Samsung Nexus S</title>
		<link>http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html</link>
		<comments>http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html#comments</comments>
		<pubDate>Tue, 22 Nov 2011 08:13:10 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[操作系统]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=310</guid>
		<description><![CDATA[1. Download the custom ROM Hit up XDA-Developers and download the Nexus S custom ROM (v2, “no need for wifi patch”). If you have a 4G Nexus S, you can download the appropriate custom ROM, but we haven’t tested it — &#8230; <a href="http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>1. Download the custom ROM</h3>
<p>Hit up XDA-Developers and <a href="http://forum.xda-developers.com/showthread.php?t=1354263">download the Nexus S custom ROM</a> (v2, “no need for wifi patch”). If you have a 4G Nexus S, you can download the appropriate custom ROM, but we haven’t tested it — so be careful.</p>
<p>Once the zip file is downloaded, transfer it to your phone’s SD card.</p>
<p>&nbsp;</p>
<h3>2. Root your phone and install ROM Manager</h3>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-menu.jpg"><img title="ROM Manager" src="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-menu-300x295.jpg" alt="ROM Manager" width="300" height="295" /></a></p>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-menu.jpg"></a> If you’re already using <a href="http://www.cyanogenmod.com/">CyanogenMod</a> (which hopefully you are), your phone will already be rooted and have <a href="https://market.android.com/details?id=com.koushikdutta.rommanager&amp;hl=en">ROM Manager</a> installed. Otherwise, you’re going to have to root your phone. This isn’t particularly hard, but it is a multi-step process, and there’s a risk that you could brick your Nexus S. The best way to do this is to <a href="http://www.youtube.com/watch?v=FZMAkp89fao">follow a video guide</a>, but googling for “how to root nexus s” works as well.</p>
<p>With ROM Manager installed, open it up and make sure the latest version of the ClockworkMod recovery image is installed (“Flash Clockwork Mod Recovery” — see right).</p>
<h3>3. Make a backup!</h3>
<p>Scroll down in ROM Manager and select “Backup Current ROM.” This will back up all of the system and app data on your phone — but not any data on your SD card, such as photos or music. This backup is saved on your phone’s SD card, in the “clockworkmod” directory — and once it’s done, you should copy this to your computer via USB. You will need this backup if you want to restore your phone to its pre-ICS state.</p>
<p><strong>Installing ICS on your Nexus S should not affect the contents of your SD card</strong>, but it’s always wise to make a copy of your photos and videos, just in case. To do so, plug your phone into a computer and transfer the files via USB.</p>
<p><strong>Please bear in mind that installing this build of ICS will completely wipe out your installed apps.</strong>You can reinstall them, but you will lose all of your settings. You shouldn’t proceed unless you really want to try out Ice Cream Sandwich. Remember, though, that you should be able to restore your backup without issue — so you do have a way out.</p>
<h3>4. Install Android 4 on your Nexus S</h3>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-wipe.jpg"><img title="ROM Manager, wipe data and cache" src="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-wipe-246x300.jpg" alt="ROM Manager, wipe data and cache" width="246" height="300" /></a></p>
<p><a href="http://www.extremetech.com/wp-content/uploads/2011/11/rom-manager-wipe.jpg"></a> Now, from ROM Manager, hit “Install ROM from SD Card,” and surf to the zip file on your SD card (“ics-crespo-aosp-4.0.1-v2-unsigned.zip” or similar). Select “Wipe Data and Cache” and “Wipe Dalvik Cache” from the menu and press OK (see right).</p>
<p>ICS will now install. Your phone will reboot, and in about 60 seconds you’ll be greeted by Ice Cream Sandwich’s phone setup screens, and then some basic tutorials.</p>
<p><strong>Welcome to Ice Cream Sandwich!</strong> This build is pre-rooted, so to revert to Gingerbread you will simply have to re-install ROM Manager and restore your backup..</p>
<p>&nbsp;</p>
<p>国内rom传送:</p>
<p><a href="http://115.com/file/cljnf2ks#">http://115.com/file/cljnf2ks#</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20111122/install-android-ice-cream-sandwich-on-a-samsung-nexus-s.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(转)区分Activity的四种加载模式</title>
		<link>http://www.liulang.cq.cn/20110425/activity-four-launchmode.html</link>
		<comments>http://www.liulang.cq.cn/20110425/activity-four-launchmode.html#comments</comments>
		<pubDate>Mon, 25 Apr 2011 06:33:38 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=305</guid>
		<description><![CDATA[转自：http://marshal.easymorse.com/archives/2950 在多Activity开发中，有可能是自己应用之间的Activity跳转，或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例，而不是产生大量重复的Activity。 这需要为Activity配置特定的加载模式，而不是使用默认的加载模式。 加载模式分类及在哪里配置 Activity有四种加载模式： standard singleTop singleTask singleInstance 设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性： &#60;activity android:name=”ActB” android:launchMode=”singleTask”&#62;&#60;/activity&#62; 也可以在Eclipse ADT中图形界面中编辑： &#160; 区分Activity的加载模式，通过示例一目了然。这里编写了一个Activity A（ActA）和Activity B（ActB）循环跳转的例子。对加载模式修改和代码做稍微改动，就可以说明四种模式的区别。 standard 首先说standard模式，也就是默认模式，不需要配置launchMode。先只写一个名为ActA的Activity： package com.easymorse.activities; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class &#8230; <a href="http://www.liulang.cq.cn/20110425/activity-four-launchmode.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>转自：<a href="http://marshal.easymorse.com/archives/2950">http://marshal.easymorse.com/archives/2950</a></p>
<p>在多Activity开发中，有可能是自己应用之间的Activity跳转，或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例，而不是产生大量重复的Activity。</p>
<p>这需要为Activity配置特定的加载模式，而不是使用默认的加载模式。</p>
<p><span id="more-305"></span></p>
<h4>加载模式分类及在哪里配置</h4>
<p>Activity有四种加载模式：</p>
<ul>
<li>standard</li>
<li>singleTop</li>
<li>singleTask</li>
<li>singleInstance</li>
</ul>
<p>设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性：</p>
<blockquote><p>&lt;activity android:name=”ActB” <strong>android:launchMode</strong>=”singleTask”&gt;&lt;/activity&gt;</p></blockquote>
<p>也可以在Eclipse ADT中图形界面中编辑：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image54.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb54.png" border="0" alt="image" width="498" height="144" /></a></p>
<p>&nbsp;</p>
<p>区分Activity的加载模式，通过示例一目了然。这里编写了一个Activity A（ActA）和Activity B（ActB）循环跳转的例子。对加载模式修改和代码做稍微改动，就可以说明四种模式的区别。</p>
<h4>standard</h4>
<p>首先说standard模式，也就是默认模式，不需要配置launchMode。先只写一个名为ActA的Activity：</p>
<blockquote><p>package com.easymorse.activities;</p>
<p>import android.app.Activity;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.LinearLayout;<br />
import android.widget.TextView;</p>
<p>public class ActA extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
TextView textView = new TextView(this);<br />
textView.setText(this + “”);<br />
Button button = new Button(this);<br />
button.setText(“go actA”);<br />
button.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
Intent intent = new Intent();<br />
intent.setClass(ActA.this, ActA.class);<br />
startActivity(intent);<br />
}<br />
});<br />
LinearLayout layout = new LinearLayout(this);<br />
layout.setOrientation(LinearLayout.VERTICAL);<br />
layout.addView(textView);<br />
layout.addView(button);<br />
this.setContentView(layout);<br />
}<br />
}</p></blockquote>
<p>例子中都没有用layout，免得看着罗嗦。可见是ActA –&gt; ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创建新ActA实例。</p>
<p>第一个界面：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image55.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb55.png" border="0" alt="image" width="244" height="101" /></a></p>
<p>点击按钮后：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image56.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb56.png" border="0" alt="image" width="244" height="114" /></a></p>
<p>可以多点几次。发现每次都创建了该Activity的新实例。standard的加载模式就是这样的，intent将发送给新的实例。</p>
<p>现在点Android设备的回退键，可以看到是按照刚才创建Activity实例的倒序依次出现，类似退栈的操作，而刚才操作跳转按钮的过程是压栈的操作。如下图：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image57.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb57.png" border="0" alt="image" width="244" height="233" /></a></p>
<p>&nbsp;</p>
<h4>singleTop</h4>
<p>singleTop和standard模式，都会将intent发送新的实例（后两种模式不发送到新的实例，如果已经有了的话）。不过，singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例，则将intent发送给该实例，而不发送给新的实例。</p>
<p>还是用刚才的示例，只需将launchMode改为singleTop，就能看到区别。</p>
<p>运行的时候会发现，按多少遍按钮，都是相同的ActiA实例，因为该实例在栈顶，因此不会创建新的实例。如果回退，将退出应用。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image58.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb58.png" border="0" alt="image" width="244" height="144" /></a></p>
<p>singleTop模式，可用来解决栈顶多个重复相同的Activity的问题。</p>
<p>如果是A Activity跳转到B Activity，再跳转到A Activity，行为就和standard一样了，会在B Activity跳转到A Activity的时候创建A Activity的新实例，因为当时的栈顶不是A Activity实例。</p>
<p>ActA类稍作改动：</p>
<blockquote><p>package com.easymorse.activities;</p>
<p>import android.app.Activity;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.LinearLayout;<br />
import android.widget.TextView;</p>
<p>public class ActA extends Activity {<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
TextView textView = new TextView(this);<br />
textView.setText(this + “”);<br />
Button button = new Button(this);<br />
button.setText(“go actB”);<br />
button.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
Intent intent = new Intent();<br />
intent.setClass(ActA.this, ActB.class);<br />
startActivity(intent);<br />
}<br />
});<br />
LinearLayout layout = new LinearLayout(this);<br />
layout.setOrientation(LinearLayout.VERTICAL);<br />
layout.addView(textView);<br />
layout.addView(button);<br />
this.setContentView(layout);<br />
}<br />
}</p>
<p>&nbsp;</p></blockquote>
<p>ActB类：</p>
<blockquote><p>package com.easymorse.activities;</p>
<p>import android.app.Activity;<br />
import android.content.Intent;<br />
import android.os.Bundle;<br />
import android.view.View;<br />
import android.view.View.OnClickListener;<br />
import android.widget.Button;<br />
import android.widget.LinearLayout;</p>
<p>public class ActB extends Activity {<br />
@Override<br />
protected void onCreate(Bundle savedInstanceState) {<br />
super.onCreate(savedInstanceState);<br />
Button button=new Button(this);<br />
button.setText(“go actA”);<br />
button.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
Intent intent=new Intent();<br />
intent.setClass(ActB.this, ActA.class);<br />
startActivity(intent);<br />
}<br />
});<br />
LinearLayout layout=new LinearLayout(this);<br />
layout.addView(button);<br />
this.setContentView(layout);<br />
}<br />
}</p>
<p>&nbsp;</p></blockquote>
<p>ActB类使用默认（standard）加载，ActA使用singleTop加载。结果类似下图：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image59.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb59.png" border="0" alt="image" width="244" height="211" /></a></p>
<p>如果把ActA的加载模式改为standard，情况一样。</p>
<h4>singleTask</h4>
<p>singleTask模式和后面的singleInstance模式都是只创建一个实例的。</p>
<p>当intent到来，需要创建singleTask模式Activity的时候，系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。</p>
<p>把上面singleTop的实例中的ActA的launchMode改为singleTask，ActB的改为standard。那么会发现在ActA界面中按一次按钮：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image60.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb60.png" border="0" alt="image" width="244" height="217" /></a></p>
<p>然后在ActB1界面中按按钮，因为ActA是singleTask，会使用原来的ActA1实例。这时候栈内的情况:</p>
<p>&nbsp;</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image61.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb61.png" border="0" alt="image" width="244" height="134" /></a></p>
<p>如果多次按按钮跳转，会发现始终只有ActA1这一个ActA类的实例。</p>
<p>&nbsp;</p>
<h4>singleInstance</h4>
<p>解释singleInstance模式比较麻烦。</p>
<p>首先要说一下Task（任务）的概念。</p>
<p>如果是Swing或者Windows程序，可能有多个窗口可以切换，但是你无法在自己程序中复用人家的窗口。注意是直接复用人家的二进制代码，不是你拿到人家api后的源代码级调用。</p>
<p>Android可以做到，让别人的程序直接复用你的Activity（类似桌面程序的窗口）。</p>
<p>Android为提供这种机制，就引入了Task的概念。Task可以认为是一个栈，可放入多个Activity。比如启动一个应用，那么Android就创建了一个Task，然后启动这个应用的入口Activity，就是intent-filter中配置为main和launch的那个（见<a title="一个APK文件部署产生多个应用安装的效果" href="http://marshal.easymorse.com/archives/2929">一个APK文件部署产生多个应用安装的效果</a>）。这个Activity是根（Root）Activity，可能会在它的界面调用其他Activity，这些Activity如果按照上面那三个模式，也会在这个栈（Task）中，只是实例化的策略不同而已。</p>
<p>验证的办法是调用和打印Activity的taskId：</p>
<blockquote><p>TextView textView2 = new TextView(this);<br />
textView2.setText(“task id: “+this.getTaskId());</p></blockquote>
<p>会发现，无论切换Activity，taskId是相同的。</p>
<p>当然也可以在这个单一的Task栈中，放入别人的Activity，比如google地图，这样用户看过地图按回退键的时候，会退栈回到调用地图的Activity。对用户来说，并不觉得在操作多个应用。这就是Task的作用。</p>
<p>但是，有这样的需求，多个Task共享一个Activity（singleTask是在一个task中共享一个Activity）。</p>
<p>现成的例子是google地图。比如我有一个应用是导游方面的，其中调用的google地图Activity。那么现在我比如按home键，然后到应用列表中打开google地图，你会发现显示的就是刚才的地图，实际上是同一个Activity。</p>
<p>如果使用上面三种模式，是无法实现这个需求的。google地图应用中有多个上下文Activity，比如路线查询等的，导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中。</p>
<p>singleInstance模式解决了这个问题（绕了这么半天才说到正题）。让这个模式下的Activity单独在一个task栈中。这个栈只有一个Activity。导游应用和google地图应用发送的intent都由这个Activity接收和展示。</p>
<p>这里又有两个问题：</p>
<ul>
<li>如果是这种情况，多个task栈也可以看作一个应用。比如导游应用启动地图Activity，实际上是在导游应用task栈之上singleInstance模式创建的（如果还没有的话，如果有就是直接显示它）一个新栈，当这个栈里面的唯一Activity，地图Activity回退的时候，只是把这个栈移开了，这样就看到导游应用刚才的Activity了；</li>
<li>多个应用（Task）共享一个Activity要求这些应用都没有退出，比如刚才强调要用home键从导游应用切换到地图应用。因为，如果退出导游应用，而这时也地图应用并未运行的话，那个单独的地图Activity（task）也会退出了。</li>
</ul>
<p>如果还是拿刚才的ActA和ActB的示例，可以把ActB的模式改为singleInstance，ActA为standard，如果按一次按钮切换到ActB，看到现象用示意图类似这样：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image62.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb62.png" border="0" alt="image" width="244" height="222" /></a></p>
<p>如果是第一次按钮切换到ActB，在ActB在按按钮切换到ActA，然后再回退，示意图是：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2010/07/image63.png"><img title="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb63.png" border="0" alt="image" width="342" height="166" /></a></p>
<p>另外，可以看到两个Activity的taskId是不同的。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20110425/activity-four-launchmode.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android开发者必须深入学习的10个应用开源项目</title>
		<link>http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html</link>
		<comments>http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html#comments</comments>
		<pubDate>Sat, 18 Dec 2010 13:37:29 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=297</guid>
		<description><![CDATA[Android开发又将带来新一轮热潮，很多开发者都投入到这个浪潮中去了，创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项 目，贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目，这些项目不仅提供了优秀的创意，也可以直接掌握 Android内核的接口使用： 1、Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始，可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目，包含了游戏、图像处理、时间显示、开始菜单快捷方式等。 地址：http://code.google.com/p/apps-for-android/ 2、 Remote Droid RemoteDroid是一个Android应用，能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触 摸屏手指运动等很好的样例。 地址：http://code.google.com/p/remotedroid/ 3、 TorProxy和Shadow TorProxy应用实现了Android手机无线电电传通讯(TOR)，和Shadow应用一起使用，可以使用手机匿名上网。从该项目源代码中，可以 掌握socket连接、管理cookie等方法。 地址：http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/ http://www.cl.cam.ac.uk/research/dtg/android/tor/ 4、 Android SMSPopup SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。 地址：http://code.google.com/p/android-smspopup/ 5、 Standup Timer Standup Timer应用用于控制站立会议时间，类似秒表倒计时，可以提醒每个人的讲话时间已到，从而保证每个与会者使用时间一样。从该项目的代码中，可以学会如何 使用时间函数。另外，这个项目的代码是采用视图view、模型model严格分离的设计思路。 地址：http://github.com/jwood/standup-timer 6、 Foursquare 是Foursquare.com的一个客户端应用，该应用主要分为两个模块：API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中，可以学会如何同步、多线程、HTTP连接等技术。 地址：http://code.google.com/p/foursquared/ 7、 Pedometer &#8230; <a href="http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Android开发又将带来新一轮热潮，很多开发者都投入到这个浪潮中去了，创造了许许多多相当优秀的应用。其中也有许许多多的开发者提供了应用开 源项 目，贡献出他们的智慧和创造力。学习开源代码是掌握技术的一个最佳方式。下面推荐几个应用开源项目，这些项目不仅提供了优秀的创意，也可以直接掌握 Android内核的接口使用：</p>
<p><span id="more-297"></span></p>
<p><strong>1、Android团队提供的示例项目</strong><br />
如果不是从学习Android SDK中提供的那些样例代码开始，可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项 目，包含了游戏、图像处理、时间显示、开始菜单快捷方式等。<br />
地址：<a href="http://i.ctoof.com/link.php?url=http://code.google.com%2Fp%2Fapps-for-android%2F" target="_blank">http://code.google.com/p/apps-for-android/</a></p>
<p><strong>2、 Remote Droid</strong><br />
RemoteDroid是一个Android应用，能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触 摸屏手指运动等很好的样例。<br />
地址：<a href="http://i.ctoof.com/link.php?url=http://code.google.com%2Fp%2Fremotedroid%2F" target="_blank">http://code.google.com/p/remotedroid/<br />
</a><br />
<strong>3、 TorProxy和Shadow</strong><br />
TorProxy应用实现了Android手机无线电电传通讯(TOR)，和Shadow应用一起使用，可以使用手机匿名上网。从该项目源代码中，可以 掌握socket连接、管理cookie等方法。<br />
地址：<a href="http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/" target="_blank">http://www.cl.cam.ac.uk/research/dtg/code/svn/android-tor/</a><br />
<a href="http://www.cl.cam.ac.uk/research/dtg/android/tor/" target="_blank">http://www.cl.cam.ac.uk/research/dtg/android/tor/</a></p>
<p><strong>4、 Android SMSPopup</strong><br />
SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。<br />
地址：<a href="http://code.google.com/p/android-smspopup/" target="_blank">http://code.google.com/p/android-smspopup/</a></p>
<p><strong>5、 Standup Timer</strong><br />
Standup Timer应用用于控制站立会议时间，类似秒表倒计时，可以提醒每个人的讲话时间已到，从而保证每个与会者使用时间一样。从该项目的代码中，可以学会如何 使用时间函数。另外，这个项目的代码是采用视图view、模型model严格分离的设计思路。<br />
地址：<a href="http://github.com/jwood/standup-timer" target="_blank">http://github.com/jwood/standup-timer</a></p>
<p><strong>6、 Foursquare</strong><br />
是Foursquare.com的一个客户端应用，该应用主要分为两个模块：API(com.joelapenna.foursquare)和界面前端 (com.joelapenna.foursquared)两部分。从该项目代码中，可以学会如何同步、多线程、HTTP连接等技术。<br />
地址：<a href="http://code.google.com/p/foursquared/" target="_blank">http://code.google.com/p/foursquared/</a></p>
<p><strong>7、 Pedometer</strong><br />
Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准，但是从这个项目中，可以学习几个不同的技术：加速器交互、语音更新、后台运行服 务等。<br />
地址：<a href="http://code.google.com/p/pedometer/" target="_blank">http://code.google.com/p/pedometer/</a></p>
<p><strong>8、 OpenSudoku-android</strong><br />
OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据，以及如何和一个网站交互等技术。<br />
地址：<a href="http://code.google.com/p/opensudoku-android/" target="_blank">http://code.google.com/p/opensudoku-android/</a></p>
<p><strong>9、 ConnectBot</strong><br />
ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中，可以学习到很多Android安全方面的内容，这些是你在开发应用 时经常需要考虑的安全问题。<br />
地址：<a href="http://code.google.com/p/connectbot/" target="_blank">http://code.google.com/p/connectbot/<br />
</a><br />
<strong>10、 WordPress的Android应用</strong><br />
当然在最后不能不提Wordpress的Android应用了，这是Wordpress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调 用（当然还有更多的优秀内容）。<br />
地址：<a href="http://android.svn.wordpress.org/trunk/" target="_blank">http://android.svn.wordpress.org/trunk/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20101218/androiddev-10-opensourceproject.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编译 android 2.1 (eclair) 源码 For HTC G1</title>
		<link>http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html</link>
		<comments>http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html#comments</comments>
		<pubDate>Sat, 18 Dec 2010 12:37:22 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=292</guid>
		<description><![CDATA[1. 说明 1) 下载编译最基本的android源码，无法在真机上使用（不能生成boot.img），只能在模拟器上使用。这是因为没有编译相关机型的内核和硬件 驱动。以下介绍的是用android源码编译出对应HTC G1的版本，和烧写的过程。编译生成的版本除相机不能用之外，其它绝大 部分功能都能正常使用，在G1上运行2.1版的速度也不错。 2) 本文主要参考日文文档G1/G2烧机指南，感谢原文作者，原文地址： http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2 同时加入中文系统 的支持和JIT支持（提高速 度），以及相关文字解释。 3) 以下步骤都经过验证（只验证G1手机，G2部分请参见日文文档），实验系统ubuntu8.04，实验日期2010年5月8日 4) 关键字: android 2.1 eclair g1 源码编译 2. 建立android源码编译目录 $ export ANDROID=/exports/android/android_2.1_cn/ $ mkdir -p $ANDROID $ cd $ANDROID 3. 源码下载 $ repo init -u &#8230; <a href="http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1.           说明</p>
<p>1)           下载编译最基本的android源码，无法在真机上使用（不能生成boot.img），只能在模拟器上使用。这是因为没有编译相关机型的内核和硬件  驱动。以下介绍的是用android源码编译出对应HTC G1的版本，和烧写的过程。编译生成的版本除相机不能用之外，其它绝大  部分功能都能正常使用，在G1上运行2.1版的速度也不错。</p>
<p>2)          本文主要参考日文文档G1/G2烧机指南，感谢原文作者，原文地址：<br />
<a href="http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2">http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2</a><br />
同时加入中文系统 的支持和JIT支持（提高速 度），以及相关文字解释。</p>
<p><span id="more-292"></span></p>
<p>3)          以下步骤都经过验证（只验证G1手机，G2部分请参见日文文档），实验系统ubuntu8.04，实验日期2010年5月8日</p>
<p>4)          关键字: android 2.1 eclair g1 源码编译</p>
<p>2.            建立android源码编译目录<br />
<em>$ export ANDROID=/exports/android/android_2.1_cn/<br />
$  mkdir -p  $ANDROID<br />
$ cd $ANDROID</em></p>
<p>3.           源码下载<br />
<em>$ repo init -u   git://android.git.kernel.org/platform/manifest.git -b android-2.1_r2 </em><em> ＃设定下载</em><em> 2.1</em><em>版代码</em><em><br />
$ vi .repo/local_manifest.xml           # </em><em>新建下载配置文件</em><br />
编辑内容如下</p>
<p>&lt;?xml version=”1.0″ encoding=”UTF-8″?&gt;<br />
&lt;manifest&gt;<br />
&lt;project path=”kernel” name=”kernel/msm” revision=”refs/heads/android-msm-2.6.29-donut”/&gt;<br />
&lt;project path=”vendor/htc/common-open” name=”platform/vendor/htc/common-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/htc/dream-open” name=”platform/vendor/htc/dream-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/htc/prebuilt-open” name=”platform/vendor/htc/prebuilt-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/htc/sapphire-open” name=”platform/vendor/htc/sapphire-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/qcom/android-open” name=”platform/vendor/qcom/android-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/qcom/proprietary-open” name=”platform/vendor/qcom/proprietary-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/pv-open” name=”platform/vendor/pv-open” revision=”master”/&gt;<br />
&lt;project path=”vendor/aosp” name=”platform/vendor/aosp” revision=”master”/&gt;<br />
&lt;project path=”hardware/htc/dream” name=”platform/hardware/htc/dream” revision=”master”/&gt;<br />
&lt;/manifest&gt;</p>
<blockquote><p><em> </em></p>
<p><em> </em></p></blockquote>
<p><em> </em></p>
<p><em> </em>注意：其中msm是高通芯片组，path指明下载到源码目录中的位置，name指明git上的项目名<br />
<em>$ repo sync                    # </em><em>开始下载代码，此时需要等待较长时间</em></p>
<p>4.           打补丁以支持动态壁纸（此为步骤为可选）<br />
<em>$ wget <a href="http://android-development-environment.googlecode.com/files/patch_devphone_eclair.tar.gz">http://android-development-environment.googlecode.com/files/patch_devphone_eclair.tar.gz</a><br />
$ tar zxvf  patch_devphone_eclair.tar.gz<br />
$  ./patch/eclair-build-patch.sh</em></p>
<p>5.           编译内核及无线网络驱动<br />
<em>$ cd $ANDROID/kernel<br />
$ make  ARCH=arm    CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-    msm_defconfig                  # </em><em>设 定默认的</em><em>msm</em><em>配置</em><em><br />
$ vi  .config                    # </em><em>修改新生成的配置文件，以重新设置</em><em>CPU</em><em>最高频率，修改如下：</em><br />
<em>修改</em><em>CONFIG_MSM_CPU_FREQ_ONDEMAND_MAX</em><em>项为</em><em>CONFIG_MSM_CPU_FREQ_ONDEMAND_MAX=528000</em><br />
<em>$ make ARCH=arm   CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-   #</em><em>编译内核</em><em><br />
$ cd  $ANDROID/system/wlan/ti/sta_dk_4_0_4_32<br />
$ make  ARCH=arm    CROSS_COMPILE=$ANDROID/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-    KERNEL_DIR=$ANDROID/kerne         l </em><em>＃编译无线网络驱动</em><em><br />
$ cp $ANDROID/kernel/arch/arm/boot/zImage   $ANDROID/vendor/htc/dream-open/kernel<br />
$ cp   $ANDROID/system/wlan/ti/sta_dk_4_0_4_32/wlan.ko   $ANDROID/vendor/htc/dream-open/wlan.ko</em></p>
<p>6.           编译android源码<br />
在HTC网站<a href="http://developer.htc.com/adp.html">http://developer.htc.com/adp.html</a><br />
下载名为<em>signed-dream_devphone_userdebug-ota-14721.zip</em>的包，并把它放在$ANDROID目录下<br />
<em>$ cd $ANDROID<br />
$ source  build/envsetup.sh<br />
$  lunch aosp_dream_us-eng           # </em><em>指明机型</em><em><br />
$ cd vendor/htc/dream-open<br />
$   ./unzip-files.sh </em><em>＃　解压</em><em>htc</em><em>相关驱动</em><em><br />
$ cd  $ANDROID<br />
$ vi  buildspec.mk </em><em>＃　新建配置文件</em><em><br />
</em><em>加入如下内容</em><em><br />
CUSTOM_LOCALES:=zh_CN</em> <em># </em><em>设置编译为中文系统</em><br />
<em>WITH_JIT:=true</em> <em># </em><em>加入</em><em>JIT</em><em>支持，使得运算速度加快</em><em>1-2</em><em>倍</em><br />
<em>$ make -j2 </em><em>＃</em><em> </em><em>编译</em><em>android</em><em>源码，需要等待较长时间</em></p>
<p>7.           把编译好的软件烧写到手机<br />
用usb线连接手机到电脑，按home+power键将手机启动到工程模式，按back键准备烧写<br />
<em>$ <a>export  PATH=$PATH:$ANDROID/out/host/linux-x86/bin</a> # </em><em>把 烧写工具所在目录加上路径</em><em><br />
$ cd  out/target/product/dream-open/<br />
$ fastboot flash  system system.img<br />
$  fastboot flash boot boot.img<br />
$ fastboot reboot</em><br />
烧写系统后第一次启 动手机需要几分钟，请耐心等待</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20101218/android-2-1-eclair-for-htc-g1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nutch1.0导入Eclipse中配置运行</title>
		<link>http://www.liulang.cq.cn/20101202/nutch-eclipse.html</link>
		<comments>http://www.liulang.cq.cn/20101202/nutch-eclipse.html#comments</comments>
		<pubDate>Thu, 02 Dec 2010 14:25:47 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[搜索引擎]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=284</guid>
		<description><![CDATA[&#60;1&#62;: 首先从http://nutch.apache.org/  下载最新的nutch.在这里我使用的是nutch1.0。 &#60;2&#62;: 在eclipse中新建立一个Java Project. 名字自己定义(Nutch). 选择”Create project from existing source”，指向自己nutch-1.0的目录. &#60;3&#62;: 点击下一步，切换到”Libraries”选择”Add Class Folder&#8230;” 按钮，从列表中选择”conf”.  &#8212;- Add project &#8216;conf&#8217; to build path&#8212;-&#62;Default Output floder &#8212;-&#62;选择刚才conf. &#60;4&#62;: finised.修改conf下面的 (a):nutch-defaul.xml : &#60;!&#8211; plugin properties &#8211;&#62; &#60;property&#62; &#60;name&#62;plugin.folders&#60;/name&#62; &#60;value&#62;/home/user/tools/nutch-1.0/src/plugin&#60;/value&#62; &#60;!&#8211;指向nutch1.0目录的plugin&#8211;&#62; &#60;description&#62;Directories &#8230; <a href="http://www.liulang.cq.cn/20101202/nutch-eclipse.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&lt;1&gt;: 首先从http://nutch.apache.org/  下载最新的nutch.在这里我使用的是nutch1.0。</p>
<p>&lt;2&gt;: 在eclipse中新建立一个Java Project. 名字自己定义(Nutch). 选择”Create project from existing source”，指向自己nutch-1.0的目录.</p>
<p>&lt;3&gt;: 点击下一步，切换到”Libraries”选择”Add Class Folder&#8230;” 按钮，从列表中选择”conf”.  &#8212;- Add project &#8216;conf&#8217; to build path&#8212;-&gt;Default Output floder &#8212;-&gt;选择刚才conf.</p>
<p><span id="more-284"></span>&lt;4&gt;: finised.修改conf下面的</p>
<p>(a):nutch-defaul.xml :</p>
<p>&lt;!&#8211; plugin properties &#8211;&gt;</p>
<p>&lt;property&gt;</p>
<p>&lt;name&gt;plugin.folders&lt;/name&gt;</p>
<p>&lt;value&gt;/home/user/tools/nutch-1.0/src/plugin&lt;/value&gt;</p>
<p>&lt;!&#8211;指向nutch1.0目录的plugin&#8211;&gt;</p>
<p>&lt;description&gt;Directories where nutch plugins are located.  Each   element may be a relative or absolute path.  If absolute, it is used   as is.  If relative, it is searched for on the classpath.&lt;/description&gt;</p>
<p>&lt;/property&gt;</p>
<p>(b):nutch-site.xml:</p>
<p>&lt;property&gt;</p>
<p>&lt;name&gt;http.agent.name&lt;/name&gt;</p>
<p>&lt;value&gt;lance&lt;/value&gt;</p>
<p>&lt;description&gt;lance&lt;/description&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property&gt;</p>
<p>&lt;name&gt;http.agent.description&lt;/name&gt;</p>
<p>&lt;value&gt;Nutch spiderman&lt;/value&gt;</p>
<p>&lt;description&gt; Nutch spiderman&lt;/description&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property&gt;</p>
<p>&lt;name&gt;http.agent.url&lt;/name&gt;</p>
<p>&lt;value&gt;http://www.163.com/&lt;/value&gt;</p>
<p>&lt;description&gt;http://www.163.com&lt;/description&gt;</p>
<p>&lt;/property&gt;</p>
<p>&lt;property&gt;</p>
<p>&lt;name&gt;http.agent.email&lt;/name&gt;</p>
<p>&lt;value&gt;cqllang@163.com&lt;/value&gt;</p>
<p>&lt;description&gt;cqllang@163.com   &lt;/description&gt;</p>
<p>&lt;/property&gt;</p>
<p>(c):crawl-urlfilter.txt:</p>
<p># accept hosts in MY.DOMAIN.NAME</p>
<p>+^http://([a-z0-9]*\.)*163.com/</p>
<p>&lt;5&gt;:下载MP3跟rtf的jar文件</p>
<p><a href="http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-mp3/lib/" target="_blank">http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-mp3/lib/</a>，</p>
<p><a href="http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-rtf/lib/" target="_blank">http://nutch.cvs.sourceforge.net/nutch/nutch/src/plugin/parse-rtf/lib/</a></p>
<p>分别拷贝到src/plugin/parse-mp3/lib 和 src/plugin/parse-rtf/lib/文件夹下</p>
<p>&lt;6&gt;:刷新几下，右键选择工程文件夹，选择Build Path-&gt;Configure Build Path&#8230;在弹出的窗口上，切换到Libraries，选择Add Jars&#8230;，添加刚才下载的jar文件到工程。</p>
<p>&lt;7&gt;:到这一步，一般的工程都会有两个错误，nutch的official 1.0 release版本中，这两个问题因为licensing issues没有修复。</p>
<p>接下来的就是最关键的部分了。</p>
<p>修改&#8212;-  src\plugin\parse-rtf\src\java\org\apache\nutch\parse\rtf下RTFParseFactory.java</p>
<p>添加&#8212;&#8211; import org.apache.nutch.parse.ParseResult;</p>
<p>将  &#8212;&#8211; public Parse getParse(Content content) {</p>
<p>改为&#8212;- public ParseResult getParse(Content content) {</p>
<p>将  &#8212;- return new ParseStatus(ParseStatus.FAILED,</p>
<p>ParseStatus.FAILED_EXCEPTION,</p>
<p>e.toString()).getEmptyParse(conf);</p>
<p>改为&#8212;&#8211;return new ParseStatus(ParseStatus.FAILED,</p>
<p>ParseStatus.FAILED_EXCEPTION,</p>
<p>e.toString()).getEmptyParseResult(content.getUrl(), getConf());</p>
<p>将&#8212;&#8212;return new ParseImpl(text,</p>
<p>new ParseData(ParseStatus.STATUS_SUCCESS,</p>
<p>title,</p>
<p>OutlinkExtractor.getOutlinks(text, this.conf),</p>
<p>content.getMetadata(),</p>
<p>metadata));</p>
<p>改为&#8212;&#8212;return ParseResult.createParseResult(content.getUrl(),</p>
<p>new ParseImpl(text,</p>
<p>new ParseData(ParseStatus.STATUS_SUCCESS,</p>
<p>title,</p>
<p>OutlinkExtractor.getOutlinks(text, this.conf),</p>
<p>content.getMetadata(),</p>
<p>metadata)));</p>
<p>修改&#8212;&#8212;src\plugin\parse-rtf\src\test\org\apache\nutch\parse\rtf下的TestRTFParser.java</p>
<p>将&#8212;&#8211;parse = new ParseUtil(conf).parseByExtensionId(“parse-rtf”, content);</p>
<p>改为&#8212;-parse = new ParseUtil(conf).parseByExtensionId(“parse-rtf”, content).get(urlString); 到这一步，eclipse上面的工程就会没有错误了 .</p>
<p>&lt;8&gt;:在nutch1.0的目录下新建立一个文件夹urls,然后再在urls中建立一个文本文件url. 写上链接。注意后面要有 “/”. 选择Run-&gt;Run As-&gt;Java Application在弹出的Select Java Application上选择Crawl-org.apache.nutch.crawl. 接下来，选择 Run-&gt;Run Configurations…在左边的Java Application下面会有Crawl这一项，选择它， 切换到Arguments，Program Arguments的内容就是要设置的参数，填上urls -dir crawl -depth 3 -topN 50（这里视自己的具体情况而定，urls为链接） 在VM arguments下面填上-Dhadoop.log.dir=logs -Dhadoop.log.file=hadoop.log.</p>
<p>&lt;9&gt;:直接运行吧：看在你的控制台上出现信息了没.</p>
<p>PS:可能碰到的问题，就是Java Heap Size的问题，查看logs/hadoop.log或控制台输出，如果出现类似java.lang.OutOfMemoryError: Java heap space语句，</p>
<p>可以设置Eclipse -&gt; Window -&gt; Preferences -&gt; Java -&gt; Installed JREs -&gt; edit -&gt; Default VM arguments</p>
<p>设置为-Xms5m Xmx250m，其中Xms为最小内存，Xmx为最大内存。</p>
<p>另外我还碰到http.agent.name为null的错误。</p>
<p>将hadoop-site.xml 改成nutch-site.xml一样内容并删除crawl文件夹重新运行。</p>
<div><span style="font-family: 'Lucida Grande', Verdana, Arial, 'Bitstream Vera Sans', sans-serif;"><span style="white-space: pre-wrap;"><br />
</span></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20101202/nutch-eclipse.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>电影有时候不仅仅是娱乐，哈佛商学院和斯坦福要求学生必看的20部电影（当然你可以选择不看，没有人逼迫只有梦想只有天真和勇气的你）</title>
		<link>http://www.liulang.cq.cn/20100610/20movie.html</link>
		<comments>http://www.liulang.cq.cn/20100610/20movie.html#comments</comments>
		<pubDate>Thu, 10 Jun 2010 11:41:08 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[杂记]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=281</guid>
		<description><![CDATA[在复杂的商业社会，你想创业，不懂经济，不懂商业，不懂人情世故，不懂法律边沿，你只有勇气，只有梦想，只有天真，只有一场空。 这20部电影可以学到的商业社会必须的经济常识，以及每天都发生着的经济欺诈。 这20部电影都是英语国家孩子在学习商业知识方面必须看的影片。其中包括哈佛商学院一直排第一位的《华尔街》，还有沃顿商学院排第一位的《Trading place》。斯坦福要求商科学生必须看的《boiler room》。 总之，一一看后，算是真正懂了一点西方商业的本质。 1、Wall Street（华尔街） (1987) 内部交易是违法的，不违法怎么能够发财。关键看如何违法同时可以掩盖。不看这个影片怎么能够随便进入股市。 2、Glengarry Glenn Ross（拜金一族）(1992) 当房地产进入萧条的时候，美国的房屋中介的销售顾问都在忙什么？他们如何利用数据库，如何门到门地将房地产销售出去。如何在萧条期包装房地产，如何瞄准新婚家庭的住房需求，如何对准投资需求？看了才知道，如今的美国房地产萧条肯定不会是问题。 3、Trading Places （颠倒乾坤）(1983) 经济是交易行为的代名词。只要有交易，就需要学会评估交易是否合算，就需要透视交易对方内心的秘密。交易中学到三个核心法则，在世界上任何国家，如何地方只要有交易的地方都适用的本质法则。 4、Boiler Room（锅炉房）(2000) 难以想像的是违法交易几乎与证券市场形影不离。一个19岁的年轻人如此近距离地目睹财富的操纵过程，让谁富有，那不过是一个随机的选择。 5、Pirates of Silicon Valley（硅谷传奇）(1999) 比 尔·盖茨与斯蒂夫·乔布斯在所有方面的看法，观点都是对立的。他们只有在一个事情上是绝对共同的，那就是尽一切可能封杀这个影片。硅谷的高科技公司是如何 孵化的，是怎么演变成今天这个样子的，不到25岁的年轻人利用了什么样的市场规则，又是如何让市场规则，让客户，让竞争对手形成一个共同体的。阴谋一个接 一个，层出不穷的点子笼罩在硅谷的上空。 6、The Coca-Cola Kid（可口可乐小子）(1985) 不是地震中的可乐男孩，而是美国男孩的可乐生涯。作为一个碳酸饮料的营销从业员，他不得不回答一个问题，在边远的澳大利亚小镇，为什么没有一瓶可口可乐？营销是生意不可缺的部分。尤其是创业中不可缺少。一个男孩用可乐创造一个事业的故事。 7、The Secret of My Succe$s（发达之路）(1987) 任 何年轻人的梦想中都至少包括两个绝对共同的东西，一个是金钱，一个是美女。明天早晨醒来，发现你不过就是一个北漂的时候，不过就是陷入大上海茫茫人海中的 &#8230; <a href="http://www.liulang.cq.cn/20100610/20movie.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>在复杂的商业社会，你想创业，不懂经济，不懂商业，不懂人情世故，不懂法律边沿，你只有勇气，只有梦想，只有天真，只有一场空。 </p>
<p>这20部电影可以学到的商业社会必须的经济常识，以及每天都发生着的经济欺诈。 这20部电影都是英语国家孩子在学习商业知识方面必须看的影片。其中包括哈佛商学院一直排第一位的《华尔街》，还有沃顿商学院排第一位的《Trading place》。斯坦福要求商科学生必须看的《boiler room》。<br />
<span id="more-281"></span><br />
总之，一一看后，算是真正懂了一点西方商业的本质。 </p>
<p>1、Wall Street（华尔街） (1987) </p>
<p>内部交易是违法的，不违法怎么能够发财。关键看如何违法同时可以掩盖。不看这个影片怎么能够随便进入股市。 </p>
<p>2、Glengarry Glenn Ross（拜金一族）(1992) </p>
<p>当房地产进入萧条的时候，美国的房屋中介的销售顾问都在忙什么？他们如何利用数据库，如何门到门地将房地产销售出去。如何在萧条期包装房地产，如何瞄准新婚家庭的住房需求，如何对准投资需求？看了才知道，如今的美国房地产萧条肯定不会是问题。 </p>
<p>3、Trading Places （颠倒乾坤）(1983) </p>
<p>经济是交易行为的代名词。只要有交易，就需要学会评估交易是否合算，就需要透视交易对方内心的秘密。交易中学到三个核心法则，在世界上任何国家，如何地方只要有交易的地方都适用的本质法则。 </p>
<p>4、Boiler Room（锅炉房）(2000) </p>
<p>难以想像的是违法交易几乎与证券市场形影不离。一个19岁的年轻人如此近距离地目睹财富的操纵过程，让谁富有，那不过是一个随机的选择。 </p>
<p>5、Pirates of Silicon Valley（硅谷传奇）(1999) </p>
<p>比 尔·盖茨与斯蒂夫·乔布斯在所有方面的看法，观点都是对立的。他们只有在一个事情上是绝对共同的，那就是尽一切可能封杀这个影片。硅谷的高科技公司是如何 孵化的，是怎么演变成今天这个样子的，不到25岁的年轻人利用了什么样的市场规则，又是如何让市场规则，让客户，让竞争对手形成一个共同体的。阴谋一个接 一个，层出不穷的点子笼罩在硅谷的上空。 </p>
<p>6、The Coca-Cola Kid（可口可乐小子）(1985) </p>
<p>不是地震中的可乐男孩，而是美国男孩的可乐生涯。作为一个碳酸饮料的营销从业员，他不得不回答一个问题，在边远的澳大利亚小镇，为什么没有一瓶可口可乐？营销是生意不可缺的部分。尤其是创业中不可缺少。一个男孩用可乐创造一个事业的故事。 </p>
<p>7、The Secret of My Succe$s（发达之路）(1987) </p>
<p>任 何年轻人的梦想中都至少包括两个绝对共同的东西，一个是金钱，一个是美女。明天早晨醒来，发现你不过就是一个北漂的时候，不过就是陷入大上海茫茫人海中的 一个小小小小的水滴的时候，如何实现自己梦想中这两个无法或缺的元素。且看美国堪萨斯的男孩在纽约飘荡的历程。如果纽约可以代表近100年人类商业活动的中心，那么，任何21世纪的年轻人，你不得不面对大城市的喧嚣、躁动，美女可以让你实现金钱的梦想，同样，金钱也可以让你品味美女的诱惑。去追求你梦想中的金钱、美女吧。 </p>
<p>8、In Good Company（优势合作）(2004) </p>
<p>想成为全球级别的公司，怎么能够不看这个影片，至少5次以上呢。大公司都是通过收购来长大的。你会收购吗？知道收购后销售主管是怎么想的吗？知道销售人员背后议论什么吗？联想收购IBM失败的核心因素就是根本没有看懂这个影片。你看得懂吗？当公司与公司之间发生买卖的时候，公司一员的你，位置在哪里？ </p>
<p>9、Barcelona（巴塞罗那）(1994) </p>
<p>美国人的销售方式，销售方法真的可以同行全球吗？一个美国销售在西班牙的销售经历让我们学到销售的价值观，销售对客户文化的处理方式，销售对客户关系的把握。 </p>
<p>10、Jerry Maguire（甜心先生）(1996)<br />
做生意要拿出诚意来。这个影片为美国文化提供了两条经典的短语，风行美国经久不衰。show me the money 让我看到钱才是真的。任何生意都如此。怎么才能看到钱，什么情况下，你会忘记这一点，而且通常是客户劝你忘记这一点。生意中没有牢靠的友谊，这是你在创业 前必须要牢记的教训。做销售，建立大客户关系不容易。认真看上10遍吧。 </p>
<p>11. office space （上班一条虫）  （1999） </p>
<p>公 司缩减规模，预备裁员的时候，这个哥们居然不知道，而且，就在裁员开始的那天，他却决定请假一天。他的两个办公室的好友已经处在被开掉的边缘，无奈，哥们 三个决定实施一个神秘计划，将公司帐号上的钱陆续转移，当然，通过木马病毒的方式。然而，由于这个哥们本来对办公室工作就没有感觉，于是，对于裁员特别轻 松，满不在乎，公司高层偏偏就欣赏这样的态度，他居然被留下了。<br />
办公室政治课实战教材。市场经济环境中公司遇到危机时，裁员的本质动机，员工对公司的作用的核心意义都是必须要学习的商业社会的基本规则。 </p>
<p>12. the corporation （解构企业） （2003） </p>
<p>18世纪美国法律正式通过了一个企业可以是一个个人的组织行为后，到21世纪，仅仅两个多世纪，美国的这个公司法居然影响了全球，你可以在中国的公司法中也看 到 类似的描述。恰好是这样的法律文本影响了人类社会的组织形态，这个冠之以法人的称号横行全球，世界每一个角度都受到影响。个人的贪婪，个人的无度，个人的 欲望没有止境地扩张，膨胀。从最深刻的本质揭示了资本主义商业规则，并无情地揭示了其存在的弊病以及可以打败之的机会。 </p>
<p>商业法，垄断法，公司治理的必修课程。 </p>
<p>13. the insider（惊爆内幕） （1999） </p>
<p>当商业秘密与巨额货币纠缠在一起的时候，阿尔8226;帕 西诺主演的主持人面对了两难的处境。在资本主义的商业社会，在没有约束的情况下，金钱可以换来什么？商业社会的本质是货币自由交换，只要你情我愿，交换什 么都可以，哪怕是交换对公众危害严重的吸烟的秘密。科学家的良知能否用钱收购，中国古语说的有钱能使鬼推磨，真的在外国对于鬼来说有效吗？ </p>
<p>交易中的商业价值，交易中的定价原理，商业信誉在交易中的作用都是这个影片中活生生地展示出来的，商科学生必须要理解金钱统治人类社会的必然结果，以及这种结果具备的不可逆的特性。 </p>
<p>14. the hudsucker proxy（影子大亨）  （1994） </p>
<p>一 个缓慢叙事风格的影片。一个票房不怎么样的影片，一个懂商业的人说好的影片，一个社会大众看不懂的影片。一个公司的老板自杀了，似乎特别符合现在的萧条期 的潮流。然而，老板自杀了，其公司还蒸蒸日上呢，董事会的实权人物开始行动，行动的目的当然是私欲横流，监管呢？正直呢？<br />
公司治理，企业董事会操作实战等都是这个影片不可多得的实战教案。学吧，从血淋淋中学到教训，并用来治理好自己的大型企业。 </p>
<p>15. antitrust（反垄断） （2001） </p>
<p>商 业社会信任容易建立吗？谁值得信任、给钱的人值得信任吗？给你一个录用的机会就值得信任吗？影片中的大型软件公司暗指微软，公司老板也是用比尔盖茨为原型 的。从斯坦福录用天才软件工程师毕业生，然后应付已经严重推迟了的软件发布日期，然而，信任却突然成了一个问题，一个公司，法律，个人，专业性之间复杂 的，纠缠不清的问题。 </p>
<p>任何学科的学生都要看上五遍。毕业了，有的是大公司如同鳄鱼一样盯着你，不是用鳄鱼般的嘴，而是用诱人的薪酬，宽松的待遇包装起来的网，你已经准备好投怀送抱了吗？ </p>
<p>16. rogue trader（魔鬼营业员）  （1998） </p>
<p>学习银行业务，尤其是投资业务最好的教材。一个能够将百年老字号银行一夜之间弄垮的业务模式到底是什么？其中伴随着一个职员怎样的人生辉煌？如何巧妙地利用廉价的不懂业务的员工？如何利用大银行罕见的机会？ </p>
<p>还记得里森在巴林银行的所作所为吗？应该不会忘记2008年华尔街横行的杠杆吧。学习金融，学习投资，学习银行业基本操作的实战教案，怎么能够错过？！ </p>
<p>17. other peoples’s money （抢钱世界）   （1991） </p>
<p>商业法，企业兼并，商业诉讼规范，商业流程，兼并重组流程等。也是一个基于美国真实故事改编的影片。美国商业自由市场中到处充满了利己行为与利他行为的冲突，矛盾。也恰好是这些冲突和矛盾中可以学到不同的人的心思，不同的人的动机，以及各种让人眼花缭乱的手段。<br />
商业法的学生，商科学生，法律学生必看。 </p>
<p>18. disclosure （败露）   （1994） </p>
<p>迈克尔道格拉斯的影片总是让人经久不忘。这个影片的主题是性骚扰，是公司办公室性骚扰。一个高管面对提升的机会，提升的关键人是他大学的女友，女友的动机并不单纯，在办公室发生了一切，一切，第二天却在法庭相见。 </p>
<p>商业法，办公室行为，公司群体人际关系行为准则，公司高管提拔等都是难得的教材，生动的雷人的教案。 </p>
<p>万万不能错过的是道格拉斯的滔滔不绝，振振有词以及慷慨激昂。 </p>
<p>19. what women want（男人百分百）  （2000） </p>
<p>用最巧妙的方式揭示女性所思所想的影片。天生上帝都羡慕的帅哥自以为是，从事的又是广告行业，居然没有机会升迁，居然老板还是女性。一个意外，就一个小小的车祸，让他具备了能够阅读女性头脑的能力，他居然真的发现了女性竟然是这么想的。 </p>
<p>商业心理学，女性行为学，广告学等都是这个影片中最需要学习的亮点。 </p>
<p>20. barbarians at the gate （门口的野蛮人）  （1993）   </p>
<p>    当一个大师级的销售高手销售的产品是他的公司的时候，你要小心了，因为你面对着千载难逢的机会，那就是发大财的机会。看好他的公司的股票，立刻购买，无论多 少钱都要买，因为眼看着他将这个公司的股票从40推到100，一个夜晚并不漫长，一个夜晚让有钱的更加有钱，贪婪是商业资本主义社会无法回避的主题，当然 也无法忘记，每次贪婪遇到正直，为什么赢的总是贪婪。现代公司政治，公司价值，投资机会，销售技巧等都是这个影片贯穿始终的启发。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100610/20movie.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle命令</title>
		<link>http://www.liulang.cq.cn/20100520/oracle%e5%91%bd%e4%bb%a4.html</link>
		<comments>http://www.liulang.cq.cn/20100520/oracle%e5%91%bd%e4%bb%a4.html#comments</comments>
		<pubDate>Thu, 20 May 2010 04:17:11 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=276</guid>
		<description><![CDATA[1.Oracle 关闭 SQL>SHUTDOWN (ABORT&#124;IMMEDIATE&#124;NORMAL) 2.Oracle 启动 SQL>STARTUP (REMOUNT&#124;MOUNT&#124;OPENT) 3.SQL> HELP SHOW SHOW &#8212;- Shows the value of a SQL*Plus system variable, or the current SQL*Plus environment. SHO[W] option where option represents one of the following terms or clauses: system_variable ALL &#8230; <a href="http://www.liulang.cq.cn/20100520/oracle%e5%91%bd%e4%bb%a4.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1.Oracle 关闭<br />
SQL>SHUTDOWN (ABORT|IMMEDIATE|NORMAL)</p>
<p>2.Oracle 启动<br />
SQL>STARTUP (REMOUNT|MOUNT|OPENT)<br />
 <span id="more-276"></span><br />
3.SQL> HELP SHOW</p>
<p> SHOW<br />
 &#8212;-</p>
<p> Shows the value of a SQL*Plus system variable, or the<br />
 current SQL*Plus environment.</p>
<p> SHO[W] option</p>
<p> where option represents one of the following terms or clauses:<br />
     system_variable<br />
     ALL<br />
     BTI[TLE]<br />
     ERR[ORS] [{FUNCTION | PROCEDURE | PACKAGE | PACKAGE BODY | TRIGGER<br />
        | VIEW | TYPE | TYPE BODY | DIMENSION | JAVA CLASS} [schema.]name]<br />
     LNO<br />
     PARAMETERS [parameter_name]<br />
     PNO<br />
     REL[EASE]<br />
     REPF[OOTER]<br />
     REPH[EADER]<br />
     SGA<br />
     SPOO[L]<br />
     SQLCODE<br />
     TT[ITLE]<br />
     USER</p>
<p> SHOW SPOOL is not available in iSQL*Plus</p>
<p>4.TNSPING<br />
TNS连接问题检测<br />
TNSNAME.ORA</p>
<p>5.执行SQL Script<br />
SQL>@C:\RUN.SQL</p>
<p>6.查看执行结果（开启/关闭）<br />
SQL>SET ECHO ON(OFF)</p>
<p>7.常用配置<br />
SQL>SET LINESIZE 1000<br />
SQL>ECHO ON<br />
SQL>SET TIMING ON<br />
SQL>SPOOL C:\TEST.LOG<br />
SQL>SELECT * FROM XXXXX<br />
SQL>SPOOL OFF</p>
<p>8.授权<br />
 建立连接 GRANT CREATE SESSION TO USERNAME<br />
 移除连接 REVOKE CREATE SESSION TO USERNAME<br />
其他授权<br />
GRANT SELECT,INSERT,DELETE,UPDATE ON SCOTT.EMP TO USERNAME<br />
确认更改<br />
SQL>COMMIT</p>
<p>9.更改密码<br />
Alter user username identified by password</p>
<p>10.察看Datafile<br />
SQL>SELECT * FROM V$DATAFILE</p>
<p>11察看结构<br />
SQL>DESC V$DATAFILE</p>
<p>12,察看DB File<br />
SQL>SELECT * FROM V$DBFILE</p>
<p>13.察看Tablespace<br />
SQL>SELECT * FROM V$TABLESPACE</p>
<p>14.察看SGA大小<br />
SQL> SHOW PARAMETER SGA</p>
<p>15.更改 SGA大小，<br />
SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=..M</p>
<p>16.察看CONTROLFILE<br />
SQL> SELECT * FROM V$CONTROLFILE</p>
<p>17察看REDO LOG<br />
SQL> SELECT * FROM V$CONTROLFILE</p>
<p>18.察看所有的用户<br />
SQL> SELECT USERNAME FROM DBA_USERS</p>
<p>19.在Offline状态下搬迁数据库文件<br />
关闭数据库<br />
SQL>SHUTDOWN IMMEDIATE<br />
搬迁数据文件<br />
连接数据库<br />
SQL>CONN / AS SYSDBA<br />
SQL>STARTUP MOUNT<br />
SQL>Alter database rename file ‘e:\&#8230;&#8230;.’ to ‘c:\&#8230;&#8230;.’<br />
SQL>ALTER DATABASE OPEN<br />
SQL>SHUTDOWN<br />
删除旧的数据文件</p>
<p>20.更改ONLINE REDO LOG<br />
SQL>ALTER SYSTEM SWITCH LOGFILE;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100520/oracle%e5%91%bd%e4%bb%a4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux下启动oracle11g 命令</title>
		<link>http://www.liulang.cq.cn/20100520/linux-startoracle.html</link>
		<comments>http://www.liulang.cq.cn/20100520/linux-startoracle.html#comments</comments>
		<pubDate>Thu, 20 May 2010 04:06:35 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=272</guid>
		<description><![CDATA[//启动oem： emctl start dbconsole //启动监听 lsnrctl start su &#8211; oracle sqlplus /nolog SQL>conn[ect] /as sysdba SQL>startup]]></description>
			<content:encoded><![CDATA[<p>//启动oem：<br />
emctl start dbconsole</p>
<p>//启动监听<br />
lsnrctl start</p>
<p>su &#8211; oracle<br />
sqlplus /nolog<br />
SQL>conn[ect] /as sysdba</p>
<p>SQL>startup</p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100520/linux-startoracle.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android TTS  语音朗读 的开发</title>
		<link>http://www.liulang.cq.cn/20100518/android-tts.html</link>
		<comments>http://www.liulang.cq.cn/20100518/android-tts.html#comments</comments>
		<pubDate>Tue, 18 May 2010 08:38:18 +0000</pubDate>
		<dc:creator>刘 浪</dc:creator>
				<category><![CDATA[移动开发]]></category>

		<guid isPermaLink="false">http://www.liulang.cq.cn/?p=266</guid>
		<description><![CDATA[1、首先要tts是否有所需语言的语音数据，如果没有需安装它 Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); private TextToSpeech mTts; protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MY_DATA_CHECK_CODE) { if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { // success, create the TTS instance mTts = new &#8230; <a href="http://www.liulang.cq.cn/20100518/android-tts.html">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1、首先要tts是否有所需语言的语音数据，如果没有需安装它<br />
<span id="more-266"></span></p>
<p><code><br />
Intent checkIntent = new Intent();<br />
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);<br />
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);   </p>
<p>private TextToSpeech mTts;<br />
protected void onActivityResult(int requestCode, int resultCode, Intent data) {<br />
    if (requestCode == MY_DATA_CHECK_CODE) {<br />
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {<br />
            // success, create the TTS instance<br />
            mTts = new TextToSpeech(this, this);<br />
        } else {<br />
            // missing data, install it<br />
            Intent installIntent = new Intent();<br />
            installIntent.setAction(<br />
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);<br />
            startActivity(installIntent);<br />
        }<br />
    }<br />
} </code></p>
<p>2、设置地区（语言）<br />
<code><br />
mTts.setLanguage(Locale.US);<br />
 </code></p>
<p>3、判断是否支持某地区的语言<br />
mTts.isLanguageAvailable(Locale.FRANCE))<br />
或 </p>
<p>mTts.isLanguageAvailable(new Locale(“spa”, “ESP”)))  </p>
<p>或 </p>
<p>mTts.isLanguageAvailable(new Locale(“spa”))  </p>
<p>如果没有语言数据，会返回TextToSpeech.LANG_MISSING_DATA，否则返回ACTION_CHECK_TTS_DATA </p>
<p>4、处理发音<br />
<code><br />
String myText1 = "Did you sleep well?";<br />
String myText2 = "I hope so, because it's time to wake up.";<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);<br />
</code></p>
<p>5、加参数 </p>
<p><code><br />
HashMap<String, String> myHashAlarm = new HashMap();<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);<br />
</code></p>
<p>6、加完成监听 </p>
<p><code></p>
<p>mTts.setOnUtteranceCompletedListener(this);<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));<br />
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);<br />
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "end of wakeup message ID");<br />
// myHashAlarm now contains two optional parameters<br />
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);   </p>
<p>public void onUtteranceCompleted(String uttId) {<br />
if (uttId == "end of wakeup message ID") {<br />
    playAnnoyingMusic();<br />
}<br />
}  </code></p>
<p>7、将发音录入文件<br />
<code></p>
<p>HashMap<String, String> myHashRender = new HashMap();<br />
String wakeUpText = "Are you up yet?";<br />
String destFileName = "/sdcard/myAppCache/wakeUp.wav";<br />
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);   </p>
<p>mTts.addSpeech(wakeUpText, destFileName);<br />
mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);<br />
</code></p>
<p>8、关闭tts<br />
<code></p>
<p>mTts.shutdown();<br />
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.liulang.cq.cn/20100518/android-tts.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

