<?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>阳春面的学习摘录</title>
	<atom:link href="http://chenyc.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://chenyc.info</link>
	<description>人生是一个不断折腾的过程，生命不息，折腾不止</description>
	<lastBuildDate>Thu, 15 Mar 2012 11:25:36 +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>重写kindle摘录同步客户端</title>
		<link>http://chenyc.info/2012/03/kindlesync-client-rewrite/</link>
		<comments>http://chenyc.info/2012/03/kindlesync-client-rewrite/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 04:55:29 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[kindle]]></category>
		<category><![CDATA[kindlesync]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=957</guid>
		<description><![CDATA[原因：原来用python写的，在kindle 3.3版本下无法运行。

于是决定重写，本想用shell直接搞定，却在curl上碰到问题，还有md5加密和urlencode处理起来也挺麻烦。

方案1：用awk+curl来实现，cygwin中已跑通，但curl在kindle上无法加载cookie，放弃

方案2：用awk+java来实现，先用awk解析摘录文件，然后用java编写代码处理同步

目前采用方案2，在我的kindle3上运行良好，
从理论上讲，kindle 2估计也能运行，只是猜测...

具体的处理过程分为以下四个部分：

<strong>1.awk解析脚本</strong>

剔除书签类型，取出摘录编号大于count的摘录（或笔记）

<pre>
BEGIN {
	ORS="\n" 
	FS="\n" 
	RS="==========\r\n" 
	#RS="==========\n" 
} 

{
	
	 if(match($2,/Bookmark/) == 0 &#038;& NR > count){
	 	sub(/\((.*)\)/,"",$1);
		print NR; 
		if(match($2,/Highlight/) != 0)
		{
			print "Highlight";
		}
		else
		{
			print "Note";
		}
		print $1; 
		print $4; 
    } 
} 
</pre>


RS代表记录分隔符，在我的kindle上有２种情况，早期生成的是unix格式，不带\r的
现在生成变成dos格式了，都有\r,原因未明。
awk相关教程，参考<a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm" target="_blank">Awk学习笔记</a>

<strong>2.java同步实现</strong>
使用HttpURLConnection提交数据到服务端，需要注意的一点是kindle上的java没有StringBuilder类，所以String类型不能直接相加
<pre>
	public static void sendweibo(String type,String title, String comment) throws Exception {

		URL url = new URL(
				"http://kindlesync.sinaapp.com/comment/comment_insert.php");
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestProperty("Cookie", sessionId);
		connection.setDoOutput(true);
		connection.setDoInput(true);
		connection.setRequestMethod("POST");
		connection.setUseCaches(false);
		connection.setInstanceFollowRedirects(false);
		connection.setRequestProperty("Content-Type",
				"application/x-www-form-urlencoded");
		connection.connect();
		DataOutputStream out = new DataOutputStream(
				connection.getOutputStream());
		StringBuffer buffer = new StringBuffer();
		buffer.append("type=");
		buffer.append(URLEncoder.encode(type, "UTF-8"));
		buffer.append("&#038;title=");
		buffer.append(URLEncoder.encode(title, "UTF-8"));
		buffer.append("&#038;comment=");
		buffer.append(URLEncoder.encode(comment, "UTF-8"));
		out.writeBytes(buffer.toString());
		out.flush();
		out.close(); // flush and close
		connection.getInputStream();
		// 断开连接
		connection.disconnect();
	}

</pre>



<strong>3.使用bash脚本整合解析和同步</strong>
在本机用cygwin调的bash代码，移植到kindle上也会有一些问题，比如bash的if语句中没法用(())这种形式，还有date命令在cygwin和kindle上的使用方式也不一样.
<pre>
#!/bin/sh
# Create by chenyc 
# 2012-03-03
#
#临时文件已存在，则删除
if [ -e "tmp.txt" ] ;
then
	rm tmp.txt ;
fi 

#取最大已同步条数，不存在默认为0
if [ -e "count.txt" ] ;
then
	count=`awk  'BEGIN{FS="="} /^count/{print $2}' count.txt` ;
else
	count=0 ;
fi


#使用awk提取需要同步的摘录
filename="/mnt/us/documents/My Clippings.txt" 
if [ -e "$filename" ] ;
then
	awk -v count=$count -f kindle.awk "$filename"   > tmp.txt ;
fi



#同步摘录
if [ -s "tmp.txt" ] ;
then
	/usr/local/bin/java Sync config.txt tmp.txt count.txt ;
fi

#摘录文件超过最大条目，备份，提供处理速度
maxitem=`awk  'BEGIN{FS="="} /^MAXITEM/{print $2}' config.txt` 
if [ $maxitem -ne -1 ]  &#038;& [ $count -gt  $maxitem ] ;
then
	datestr=`date -I` ;
	mv "$filename" "$filename$datestr" ;
fi

date -I
</pre>



4.配置crontab和launchpad
在crontab的配置文件/etc/crontab/root中加入以下代码，使其能够自动同步
<pre>
*/15 * * * * /mnt/us/kindlesync/dosync.sh
</pre>



配置launchpad，提供安装/卸载，以及手工同步的功能
<pre>
[Actions]
T T = !source /mnt/us/kindlesync/dosync.sh &#038;
T I = !source /mnt/us/kindlesync/install.sh &#038;
T U = !source /mnt/us/kindlesync/uninstall.sh &#038;
</pre>

]]></description>
			<content:encoded><![CDATA[<p>原因：原来用python写的，在kindle 3.3版本下无法运行。</p>
<p>于是决定重写，本想用shell直接搞定，却在curl上碰到问题，还有md5加密和urlencode处理起来也挺麻烦。</p>
<p>方案1：用awk+curl来实现，cygwin中已跑通，但curl在kindle上无法加载cookie，放弃</p>
<p>方案2：用awk+java来实现，先用awk解析摘录文件，然后用java编写代码处理同步</p>
<p>目前采用方案2，在我的kindle3上运行良好，<br />
从理论上讲，kindle 2估计也能运行，只是猜测&#8230;</p>
<p>具体的处理过程分为以下四个部分：</p>
<p><strong>1.awk解析脚本</strong></p>
<p>剔除书签类型，取出摘录编号大于count的摘录（或笔记）</p>
<pre>
BEGIN {
	ORS="\n"
	FS="\n"
	RS="==========\r\n"
	#RS="==========\n"
} 

{

	 if(match($2,/Bookmark/) == 0 &#038;&#038; NR > count){
	 	sub(/\((.*)\)/,"",$1);
		print NR;
		if(match($2,/Highlight/) != 0)
		{
			print "Highlight";
		}
		else
		{
			print "Note";
		}
		print $1;
		print $4;
    }
}
</pre>
<p>RS代表记录分隔符，在我的kindle上有２种情况，早期生成的是unix格式，不带\r的<br />
现在生成变成dos格式了，都有\r,原因未明。<br />
awk相关教程，参考<a href="http://man.lupaworld.com/content/manage/ringkee/awk.htm" target="_blank">Awk学习笔记</a></p>
<p><strong>2.java同步实现</strong><br />
使用HttpURLConnection提交数据到服务端，需要注意的一点是kindle上的java没有StringBuilder类，所以String类型不能直接相加</p>
<pre>
	public static void sendweibo(String type,String title, String comment) throws Exception {

		URL url = new URL(
				"http://kindlesync.sinaapp.com/comment/comment_insert.php");
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestProperty("Cookie", sessionId);
		connection.setDoOutput(true);
		connection.setDoInput(true);
		connection.setRequestMethod("POST");
		connection.setUseCaches(false);
		connection.setInstanceFollowRedirects(false);
		connection.setRequestProperty("Content-Type",
				"application/x-www-form-urlencoded");
		connection.connect();
		DataOutputStream out = new DataOutputStream(
				connection.getOutputStream());
		StringBuffer buffer = new StringBuffer();
		buffer.append("type=");
		buffer.append(URLEncoder.encode(type, "UTF-8"));
		buffer.append("&#038;title=");
		buffer.append(URLEncoder.encode(title, "UTF-8"));
		buffer.append("&#038;comment=");
		buffer.append(URLEncoder.encode(comment, "UTF-8"));
		out.writeBytes(buffer.toString());
		out.flush();
		out.close(); // flush and close
		connection.getInputStream();
		// 断开连接
		connection.disconnect();
	}
</pre>
<p><strong>3.使用bash脚本整合解析和同步</strong><br />
在本机用cygwin调的bash代码，移植到kindle上也会有一些问题，比如bash的if语句中没法用(())这种形式，还有date命令在cygwin和kindle上的使用方式也不一样.</p>
<pre>
#!/bin/sh
# Create by chenyc
# 2012-03-03
#
#临时文件已存在，则删除
if [ -e "tmp.txt" ] ;
then
	rm tmp.txt ;
fi 

#取最大已同步条数，不存在默认为0
if [ -e "count.txt" ] ;
then
	count=`awk  'BEGIN{FS="="} /^count/{print $2}' count.txt` ;
else
	count=0 ;
fi

#使用awk提取需要同步的摘录
filename="/mnt/us/documents/My Clippings.txt"
if [ -e "$filename" ] ;
then
	awk -v count=$count -f kindle.awk "$filename"   > tmp.txt ;
fi

#同步摘录
if [ -s "tmp.txt" ] ;
then
	/usr/local/bin/java Sync config.txt tmp.txt count.txt ;
fi

#摘录文件超过最大条目，备份，提供处理速度
maxitem=`awk  'BEGIN{FS="="} /^MAXITEM/{print $2}' config.txt`
if [ $maxitem -ne -1 ]  &#038;&#038; [ $count -gt  $maxitem ] ;
then
	datestr=`date -I` ;
	mv "$filename" "$filename$datestr" ;
fi

date -I
</pre>
<p>4.配置crontab和launchpad<br />
在crontab的配置文件/etc/crontab/root中加入以下代码，使其能够自动同步</p>
<pre>
*/15 * * * * /mnt/us/kindlesync/dosync.sh
</pre>
<p>配置launchpad，提供安装/卸载，以及手工同步的功能</p>
<pre>
[Actions]
T T = !source /mnt/us/kindlesync/dosync.sh &#038;
T I = !source /mnt/us/kindlesync/install.sh &#038;
T U = !source /mnt/us/kindlesync/uninstall.sh &#038;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/03/kindlesync-client-rewrite/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>使用Spring-Android获取和解析json数据</title>
		<link>http://chenyc.info/2012/02/spring-android-json/</link>
		<comments>http://chenyc.info/2012/02/spring-android-json/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 05:57:16 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=941</guid>
		<description><![CDATA[项目中需要的LIB:
spring-android-core-1.0.0.M4.jar
spring-android-rest-template-1.0.0.M4.jar
gson-2.1.jar 使用google的这个json解析lib是因为这个lib较小

服务端返回数据如：
<pre>{"id":"109","word":"test","translation":"n. 试验；检验"}</pre>
客户端建立对应的Domain类，如：

<pre>
public class Word {
private int id;
private String word;
private String translation;
}
</pre>



使用Spring-Android调用，并转换成Word类

<pre>

String url = "http://localhost/api/word/detail.php?id=109";
RestTemplate restTemplate = new RestTemplate();
Word word = restTemplate.getForObject(url, Word.class);

</pre>



另外Spirng Android的Lib库中还提供了解析XML，RSS，还有OAuth验证的实现。]]></description>
			<content:encoded><![CDATA[<p>项目中需要的LIB:<br />
spring-android-core-1.0.0.M4.jar<br />
spring-android-rest-template-1.0.0.M4.jar<br />
gson-2.1.jar 使用google的这个json解析lib是因为这个lib较小</p>
<p>服务端返回数据如：</p>
<pre>{"id":"109","word":"test","translation":"n. 试验；检验"}</pre>
<p>客户端建立对应的Domain类，如：</p>
<pre>
public class Word {
private int id;
private String word;
private String translation;
}
</pre>
<p>使用Spring-Android调用，并转换成Word类</p>
<pre>

String url = "http://localhost/api/word/detail.php?id=109";
RestTemplate restTemplate = new RestTemplate();
Word word = restTemplate.getForObject(url, Word.class);
</pre>
<p>另外Spirng Android的Lib库中还提供了解析XML，RSS，还有OAuth验证的实现。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/spring-android-json/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>（转载）Android UI 优化-使用theme 预加载</title>
		<link>http://chenyc.info/2012/02/android-ui-theme-preload/</link>
		<comments>http://chenyc.info/2012/02/android-ui-theme-preload/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 05:41:59 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[黑屏]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=936</guid>
		<description><![CDATA[在很多时候，我们需要给一个Layout设置一个背景。例如，我们下下面的layout中使用了这样一个背景:

<pre>&#60;?xml version=”1.0″ encoding=”utf-8″?&#62;
&#60;LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”@drawable/antelope_canyon”&#62;
&#60;TextView android:text=”@+id/TextView01″
android:id=”@+id/TextView01″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” &#62;
&#60;/TextView&#62;

&#60;/LinearLayout&#62;</pre>



其中的LinearLayout使用了 背景图片antelope_canyon。

如果仔细观察程序的运行过过程，我们首先看到了黑色的activity背景，然后才看到背景图被加载，那是因为在activity start以后，我们才能调用setContentView设置我们的layout，然后才绘制我们在layout中放置的背景图。而在此之前，程序中绘制的是android中默认黑色背景。 这样会给用户感觉我们的activity启动较慢。
然而，如果将背景图定义在一个主题中，如下：
<div id="highlighter_479126" style="text-align: left;">

<pre>&#60;?xml version=”1.0″ encoding=”utf-8″?&#62;
&#60;resources&#62;
&#60;style name=”Theme.Droidus” parent=”android:Theme”&#62;
&#60;item name=”android:windowBackground”&#62;@drawable/antelope_canyon&#60;/item&#62;
&#60;item name=”android:windowNoTitle”&#62;true&#60;/item&#62;
&#60;/style&#62;
&#60;/resources&#62;</pre>



</div>
然后在activity中使用这个主题 ：
<div id="highlighter_79994" style="text-align: left;">

<pre>&#60;?xml version=”1.0″ encoding=”utf-8″?&#62;
&#60;manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.droidus”
android:versionCode=”1″
android:versionName=”1.0″&#62;
&#60;application android:icon=”@drawable/icon” android:label=”@string/app_name”&#62;
&#60;activity android:name=”.SpeedUpStartupActivity”
android:label=”@string/app_name”
android:theme=”@style/Theme.Droidus”
&#62;
&#60;intent-filter&#62;
&#60;action android:name=”android.intent.action.MAIN” /&#62;
&#60;category android:name=”android.intent.category.LAUNCHER” /&#62;
&#60;/intent-filter&#62;
&#60;/activity&#62;

&#60;/application&#62;
&#60;uses-sdk android:minSdkVersion=”4″ /&#62;

&#60;/manifest&#62;</pre>



</div>
运行程序，可以看到背景图马上显示了，没有再看到黑色的背景图。

为什么会有这样的现象呢？那是因为 程序的主题是在程序启动的时候加载的，而不是在activity启动之后加载！
而如果在layout使用背景，背景图是在activity启动之后才加载，故而会让用户看到一个黑色背景闪动的过程。

原文地址：<a href="http://www.oschina.net/question/54100_34081">http://www.oschina.net/question/54100_34081</a>]]></description>
			<content:encoded><![CDATA[<p>在很多时候，我们需要给一个Layout设置一个背景。例如，我们下下面的layout中使用了这样一个背景:</p>
<pre>&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:background=”@drawable/antelope_canyon”&gt;
&lt;TextView android:text=”@+id/TextView01″
android:id=”@+id/TextView01″
android:layout_width=”wrap_content”
android:layout_height=”wrap_content” &gt;
&lt;/TextView&gt;

&lt;/LinearLayout&gt;</pre>
<p>其中的LinearLayout使用了 背景图片antelope_canyon。</p>
<p>如果仔细观察程序的运行过过程，我们首先看到了黑色的activity背景，然后才看到背景图被加载，那是因为在activity start以后，我们才能调用setContentView设置我们的layout，然后才绘制我们在layout中放置的背景图。而在此之前，程序中绘制的是android中默认黑色背景。 这样会给用户感觉我们的activity启动较慢。<br />
然而，如果将背景图定义在一个主题中，如下：</p>
<div id="highlighter_479126" style="text-align: left;">
<pre>&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;resources&gt;
&lt;style name=”Theme.Droidus” parent=”android:Theme”&gt;
&lt;item name=”android:windowBackground”&gt;@drawable/antelope_canyon&lt;/item&gt;
&lt;item name=”android:windowNoTitle”&gt;true&lt;/item&gt;
&lt;/style&gt;
&lt;/resources&gt;</pre>
</div>
<p>然后在activity中使用这个主题 ：</p>
<div id="highlighter_79994" style="text-align: left;">
<pre>&lt;?xml version=”1.0″ encoding=”utf-8″?&gt;
&lt;manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.droidus”
android:versionCode=”1″
android:versionName=”1.0″&gt;
&lt;application android:icon=”@drawable/icon” android:label=”@string/app_name”&gt;
&lt;activity android:name=”.SpeedUpStartupActivity”
android:label=”@string/app_name”
android:theme=”@style/Theme.Droidus”
&gt;
&lt;intent-filter&gt;
&lt;action android:name=”android.intent.action.MAIN” /&gt;
&lt;category android:name=”android.intent.category.LAUNCHER” /&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;

&lt;/application&gt;
&lt;uses-sdk android:minSdkVersion=”4″ /&gt;

&lt;/manifest&gt;</pre>
</div>
<p>运行程序，可以看到背景图马上显示了，没有再看到黑色的背景图。</p>
<p>为什么会有这样的现象呢？那是因为 程序的主题是在程序启动的时候加载的，而不是在activity启动之后加载！<br />
而如果在layout使用背景，背景图是在activity启动之后才加载，故而会让用户看到一个黑色背景闪动的过程。</p>
<p>原文地址：<a href="http://www.oschina.net/question/54100_34081">http://www.oschina.net/question/54100_34081</a></p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/android-ui-theme-preload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kindle摘录同步的代码开源</title>
		<link>http://chenyc.info/2012/02/kindle_sync_open_source/</link>
		<comments>http://chenyc.info/2012/02/kindle_sync_open_source/#comments</comments>
		<pubDate>Mon, 27 Feb 2012 14:19:08 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[kindlesync]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=927</guid>
		<description><![CDATA[代码稍微整理了一下，开源给有需要的人。

我另外还有一个想法，想在web端管理kindle上的文件，就是在kindle里同步一个目录结构到web端，然后在web端整理目录，kindle上定时获取整理的操作指令，通过Linux的相关操作命令进行处理；希望有兴趣的朋友可以帮忙实现一下，呵呵。

开源代码地址：<a href="https://github.com/chenyc/KindleSync">https://github.com/chenyc/KindleSync</a>
<pre>使用说明
1.kindle摘录同步是基于SAE平台的,需要先申请帐号，并建立项目.
申请地址：<a href="http://sae.sina.com.cn/">http://sae.sina.com.cn/</a>
2.在SAE上建立数据库，导入sql目录下的app_kindlesync.sql.
3.修改根目录下的config.php,需要开启哪个微薄的同步，把对应的设置为true,
同时填入在各个微薄上申请的开发APPKEY和APPSECERT。

4.客户端代码修改
下载<a href="http://chenyc.info/myapp/kindle%E6%91%98%E5%BD%95%E5%90%8C%E6%AD%A5.zip">http://chenyc.info/myapp/kindle摘录同步.zip</a>
修改其中的sync_comments.py，将其中的“kindlesync.sinaapp.com”
全部替换成你自己申请的地址。</pre>]]></description>
			<content:encoded><![CDATA[<p>代码稍微整理了一下，开源给有需要的人。</p>
<p>我另外还有一个想法，想在web端管理kindle上的文件，就是在kindle里同步一个目录结构到web端，然后在web端整理目录，kindle上定时获取整理的操作指令，通过Linux的相关操作命令进行处理；希望有兴趣的朋友可以帮忙实现一下，呵呵。</p>
<p>开源代码地址：<a href="https://github.com/chenyc/KindleSync">https://github.com/chenyc/KindleSync</a></p>
<pre>使用说明
1.kindle摘录同步是基于SAE平台的,需要先申请帐号，并建立项目.
申请地址：<a href="http://sae.sina.com.cn/">http://sae.sina.com.cn/</a>
2.在SAE上建立数据库，导入sql目录下的app_kindlesync.sql.
3.修改根目录下的config.php,需要开启哪个微薄的同步，把对应的设置为true,
同时填入在各个微薄上申请的开发APPKEY和APPSECERT。

4.客户端代码修改
下载<a href="http://chenyc.info/myapp/kindle%E6%91%98%E5%BD%95%E5%90%8C%E6%AD%A5.zip">http://chenyc.info/myapp/kindle摘录同步.zip</a>
修改其中的sync_comments.py，将其中的“kindlesync.sinaapp.com”
全部替换成你自己申请的地址。</pre>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/kindle_sync_open_source/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android方位指向功能的实现</title>
		<link>http://chenyc.info/2012/02/android-azimuth/</link>
		<comments>http://chenyc.info/2012/02/android-azimuth/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 09:05:45 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[定位]]></category>
		<category><![CDATA[指北针]]></category>
		<category><![CDATA[方位角]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=907</guid>
		<description><![CDATA[实现功能：
根据当前位置和目的位置的经纬度，将方向指针指向目的地。

如图:

<a href="/blog/wp-content/uploads/2012/02/device-2012-02-15-160628.png"><img class="alignnone  wp-image-308" title="device-2012-02-15-160628" src="/blog/wp-content/uploads/2012/02/device-2012-02-15-160628.png" alt="" width="288" height="512" data-pinit="registered" /></a>

使用到的技术点主要有指北针，定位，方位角计算。

<strong>1.指北针</strong>

Android方向感应器取的数组中第0项即为方向（值得范围是 0 ~ 359 其中0=North, 90=East, 180=South, 270=West）

<pre>
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//注册方向感应器
mSensorManager.registerListener(mListener, mSensor,
SensorManager.SENSOR_DELAY_GAME);
//方向感应传感器监听事件，取到第0项方向值，并传递给自定义View展示
private final SensorEventListener mListener = new SensorEventListener() {

@Override
public void onSensorChanged(SensorEvent event) {
mValues = event.values;
if (mView != null) {
mView.setValues(mValues);
mView.invalidate();
}
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
</pre>



<strong>2.定位</strong>

采用基站定位，速度快，缺点是必须移动网络可用

取得基站信息

<pre>
private JSONObject doApn() throws Exception {
JSONObject holder = new JSONObject();
holder.put("version", "1.1.0");
holder.put("host", "maps.google.com");
holder.put("address_language", "zh_CN");
holder.put("request_address", true);

TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
GsmCellLocation gcl = (GsmCellLocation) tm.getCellLocation();
int cid = gcl.getCid();
int lac = gcl.getLac();
int mcc = Integer.valueOf(tm.getNetworkOperator().substring(0,
3));
int mnc = Integer.valueOf(tm.getNetworkOperator().substring(3,
5));

JSONArray array = new JSONArray();
JSONObject data = new JSONObject();
data.put("cell_id", cid);
data.put("location_area_code", lac);
data.put("mobile_country_code", mcc);
data.put("mobile_network_code", mnc);
array.put(data);
holder.put("cell_towers", array);

return holder;
}
</pre>



提交基站信息到google的服务器，获取经纬度数据

<pre>
public HttpResponse execute(JSONObject params) throws Exception {
HttpClient httpClient = new DefaultHttpClient();

HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),
20 * 1000);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 20 * 1000);

HttpPost post = new HttpPost("http://74.125.71.147/loc/json");
// 设置代理
if (postType == DO_APN) {
// 获取当前正在使用的APN接入点
Uri uri = Uri.parse("content://telephony/carriers/preferapn");
Cursor mCursor = context.getContentResolver().query(uri, null,
null, null, null);
if (mCursor != null) {
if(mCursor.moveToFirst()) {
String proxyStr = mCursor.getString(mCursor
.getColumnIndex("proxy"));
if (proxyStr != null &#38;&#38; proxyStr.trim().length() &#62; 0) {
HttpHost proxy = new HttpHost(proxyStr, 80);
httpClient.getParams().setParameter(
ConnRouteParams.DEFAULT_PROXY, proxy);
}
}
}
}

StringEntity se = new StringEntity(params.toString());
post.setEntity(se);
HttpResponse response = httpClient.execute(post);
return response;
}
</pre>



<strong>3.方位角的计算</strong>

根据两点的经纬度计算方位角

<pre>
// 计算方位角,正北向为0度，以顺时针方向递增
private double computeAzimuth(double lat1, double lon1, double lat2,
double lon2) {
double result = 0.0;

int ilat1 = (int) (0.50 + lat1 * 360000.0);
int ilat2 = (int) (0.50 + lat2 * 360000.0);
int ilon1 = (int) (0.50 + lon1 * 360000.0);
int ilon2 = (int) (0.50 + lon2 * 360000.0);

lat1 = Math.toRadians(lat1);
lon1 = Math.toRadians(lon1);
lat2 = Math.toRadians(lat2);
lon2 = Math.toRadians(lon2);

if ((ilat1 == ilat2) &#38;&#38; (ilon1 == ilon2)) {
return result;
} else if (ilon1 == ilon2) {
if (ilat1 &#62; ilat2)
result = 180.0;
} else {
double c = Math
.acos(Math.sin(lat2) * Math.sin(lat1) + Math.cos(lat2)
* Math.cos(lat1) * Math.cos((lon2 - lon1)));
double A = Math.asin(Math.cos(lat2) * Math.sin((lon2 - lon1))
/ Math.sin(c));
result = Math.toDegrees(A);
if ((ilat2 &#62; ilat1) &#38;&#38; (ilon2 &#62; ilon1)) {
} else if ((ilat2 &#60; ilat1) &#38;&#38; (ilon2 &#60; ilon1)) {
result = 180.0 - result;
} else if ((ilat2 &#60; ilat1) &#38;&#38; (ilon2 &#62; ilon1)) {
result = 180.0 - result;
} else if ((ilat2 &#62; ilat1) &#38;&#38; (ilon2 &#60; ilon1)) {
result += 360.0;
}
}
return result;
}
</pre>



方位角计算的公式参考此文：<a href="http://www.codeguru.com/Cpp/Cpp/algorithms/article.php/c5115" target="_blank">http://www.codeguru.com/Cpp/Cpp/algorithms/article.php/c5115</a>

<strong>4.画方向指针和旋转</strong>

代码直接拷贝自API DEMO，在旋转方位做了一点修改

构建方向指针

<pre>
public SampleView(Context context) {
super(context);
mPath.moveTo(0, -25);
mPath.lineTo(-10, 30);
mPath.lineTo(0, 25);
mPath.lineTo(10, 30);
mPath.close();
}
</pre>



旋转canvas，并画方向指针

<pre>
protected void onDraw(Canvas canvas) {
Paint paint = mPaint;

canvas.drawColor(Color.WHITE);

paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

canvas.translate(getWidth() / 2, getHeight() / 2);
if (mValues != null) {
canvas.rotate(-mValues[0] + (float) directionAngle);
}
canvas.drawPath(mPath, mPaint);

}
</pre>



项目下载：<a href="/blog/wp-content/uploads/2012/02/north.zip">方位指向</a>]]></description>
			<content:encoded><![CDATA[<p>实现功能：<br />
根据当前位置和目的位置的经纬度，将方向指针指向目的地。</p>
<p>如图:</p>
<p><a href="/blog/wp-content/uploads/2012/02/device-2012-02-15-160628.png"><img class="alignnone  wp-image-308" title="device-2012-02-15-160628" src="/blog/wp-content/uploads/2012/02/device-2012-02-15-160628.png" alt="" width="288" height="512" data-pinit="registered" /></a></p>
<p>使用到的技术点主要有指北针，定位，方位角计算。</p>
<p><strong>1.指北针</strong></p>
<p>Android方向感应器取的数组中第0项即为方向（值得范围是 0 ~ 359 其中0=North, 90=East, 180=South, 270=West）</p>
<pre>
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//注册方向感应器
mSensorManager.registerListener(mListener, mSensor,
SensorManager.SENSOR_DELAY_GAME);
//方向感应传感器监听事件，取到第0项方向值，并传递给自定义View展示
private final SensorEventListener mListener = new SensorEventListener() {

@Override
public void onSensorChanged(SensorEvent event) {
mValues = event.values;
if (mView != null) {
mView.setValues(mValues);
mView.invalidate();
}
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
</pre>
<p><strong>2.定位</strong></p>
<p>采用基站定位，速度快，缺点是必须移动网络可用</p>
<p>取得基站信息</p>
<pre>
private JSONObject doApn() throws Exception {
JSONObject holder = new JSONObject();
holder.put("version", "1.1.0");
holder.put("host", "maps.google.com");
holder.put("address_language", "zh_CN");
holder.put("request_address", true);

TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
GsmCellLocation gcl = (GsmCellLocation) tm.getCellLocation();
int cid = gcl.getCid();
int lac = gcl.getLac();
int mcc = Integer.valueOf(tm.getNetworkOperator().substring(0,
3));
int mnc = Integer.valueOf(tm.getNetworkOperator().substring(3,
5));

JSONArray array = new JSONArray();
JSONObject data = new JSONObject();
data.put("cell_id", cid);
data.put("location_area_code", lac);
data.put("mobile_country_code", mcc);
data.put("mobile_network_code", mnc);
array.put(data);
holder.put("cell_towers", array);

return holder;
}
</pre>
<p>提交基站信息到google的服务器，获取经纬度数据</p>
<pre>
public HttpResponse execute(JSONObject params) throws Exception {
HttpClient httpClient = new DefaultHttpClient();

HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),
20 * 1000);
HttpConnectionParams.setSoTimeout(httpClient.getParams(), 20 * 1000);

HttpPost post = new HttpPost("http://74.125.71.147/loc/json");
// 设置代理
if (postType == DO_APN) {
// 获取当前正在使用的APN接入点
Uri uri = Uri.parse("content://telephony/carriers/preferapn");
Cursor mCursor = context.getContentResolver().query(uri, null,
null, null, null);
if (mCursor != null) {
if(mCursor.moveToFirst()) {
String proxyStr = mCursor.getString(mCursor
.getColumnIndex("proxy"));
if (proxyStr != null &amp;&amp; proxyStr.trim().length() &gt; 0) {
HttpHost proxy = new HttpHost(proxyStr, 80);
httpClient.getParams().setParameter(
ConnRouteParams.DEFAULT_PROXY, proxy);
}
}
}
}

StringEntity se = new StringEntity(params.toString());
post.setEntity(se);
HttpResponse response = httpClient.execute(post);
return response;
}
</pre>
<p><strong>3.方位角的计算</strong></p>
<p>根据两点的经纬度计算方位角</p>
<pre>
// 计算方位角,正北向为0度，以顺时针方向递增
private double computeAzimuth(double lat1, double lon1, double lat2,
double lon2) {
double result = 0.0;

int ilat1 = (int) (0.50 + lat1 * 360000.0);
int ilat2 = (int) (0.50 + lat2 * 360000.0);
int ilon1 = (int) (0.50 + lon1 * 360000.0);
int ilon2 = (int) (0.50 + lon2 * 360000.0);

lat1 = Math.toRadians(lat1);
lon1 = Math.toRadians(lon1);
lat2 = Math.toRadians(lat2);
lon2 = Math.toRadians(lon2);

if ((ilat1 == ilat2) &amp;&amp; (ilon1 == ilon2)) {
return result;
} else if (ilon1 == ilon2) {
if (ilat1 &gt; ilat2)
result = 180.0;
} else {
double c = Math
.acos(Math.sin(lat2) * Math.sin(lat1) + Math.cos(lat2)
* Math.cos(lat1) * Math.cos((lon2 - lon1)));
double A = Math.asin(Math.cos(lat2) * Math.sin((lon2 - lon1))
/ Math.sin(c));
result = Math.toDegrees(A);
if ((ilat2 &gt; ilat1) &amp;&amp; (ilon2 &gt; ilon1)) {
} else if ((ilat2 &lt; ilat1) &amp;&amp; (ilon2 &lt; ilon1)) {
result = 180.0 - result;
} else if ((ilat2 &lt; ilat1) &amp;&amp; (ilon2 &gt; ilon1)) {
result = 180.0 - result;
} else if ((ilat2 &gt; ilat1) &amp;&amp; (ilon2 &lt; ilon1)) {
result += 360.0;
}
}
return result;
}
</pre>
<p>方位角计算的公式参考此文：<a href="http://www.codeguru.com/Cpp/Cpp/algorithms/article.php/c5115" target="_blank">http://www.codeguru.com/Cpp/Cpp/algorithms/article.php/c5115</a></p>
<p><strong>4.画方向指针和旋转</strong></p>
<p>代码直接拷贝自API DEMO，在旋转方位做了一点修改</p>
<p>构建方向指针</p>
<pre>
public SampleView(Context context) {
super(context);
mPath.moveTo(0, -25);
mPath.lineTo(-10, 30);
mPath.lineTo(0, 25);
mPath.lineTo(10, 30);
mPath.close();
}
</pre>
<p>旋转canvas，并画方向指针</p>
<pre>
protected void onDraw(Canvas canvas) {
Paint paint = mPaint;

canvas.drawColor(Color.WHITE);

paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

canvas.translate(getWidth() / 2, getHeight() / 2);
if (mValues != null) {
canvas.rotate(-mValues[0] + (float) directionAngle);
}
canvas.drawPath(mPath, mPaint);

}
</pre>
<p>项目下载：<a href="/blog/wp-content/uploads/2012/02/north.zip">方位指向</a></p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/android-azimuth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自我激励的方法(转载)</title>
		<link>http://chenyc.info/2012/02/self-motivation/</link>
		<comments>http://chenyc.info/2012/02/self-motivation/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 07:00:29 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=897</guid>
		<description><![CDATA[文/晨曦

在我们不断塑造自我的过程中，影响最大的莫过于是选择乐观的态度还是悲观的态度。我们思想上的这种抉择可能给我们带来激励，也有可能阻滞我们前进。清晰地规划目标是人生走向成功的第一步，但塑造自我却不仅限于规划目标。要真正塑造自我和自己想要的生活，我们必须奋起行动。莎士比亚说得好：“行动胜过雄辩。”一旦掌握自我激励，自我塑造的过程也就随即开始。

以下方法可以帮你塑造自我，塑造那个你一直梦寐以求的自我。

<strong>1. 树立愿景</strong>
<p style="padding-left: 30px;">迈向自我塑造的第一步，要有一个你每天早晨醒来为之奋斗的目标，它应是你人生的目标。愿景必须即刻着手建立，而不要往后拖。你随时可以按自己的想法做些改变，但不能一刻没有愿景。</p>
<strong>2. 离开舒适区　</strong>
<p style="padding-left: 30px;">不断寻求挑战激励自己。提防自己，不要躺倒在舒适区。舒适区只是避风港，不是安乐窝。它只是你心中准备迎接下次挑战之前刻意放松自己和恢复元气的地方。</p>
3. <strong>把握好情绪</strong>
<p style="padding-left: 30px;">人开心的时候，体内就会发生奇妙的变化，从而获得阵阵新的动力和力量。但是，不要总想在自身之外寻开心。令你开心的事不在别处，就在你身上。因此，找出自身的情绪高涨期用来不断激励自己。</p>
<strong>4. 调高目标</strong>
<p style="padding-left: 30px;">许多人惊奇地发现，他们之所以达不到自己孜孜以求的目标，是因为他们的主要目标太小、而且太模糊不清，使自己失去动力。如果你的主要目标不能激发你的想象力，目标的实现就会遥遥无期。因此，真正能激励你奋发向上的是，确立一个既宏伟又具体的远大目标。</p>
<strong>5. 加强紧迫感　</strong>
<p style="padding-left: 30px;">自以为长命百岁无益于你享受人生。然而，大多数人对此视而不见，假装自己的生命会绵延无绝。惟有心血来潮的那天，我们才会筹划大事业，将我们的目标和梦想寄在“虚幻岛”的汪洋大海之中。其实，直面死亡未必要等到生命耗尽时的临终一刻。事实上，如果能逼真地想象我们的弥留之际，会物极必反产生一种再生的感觉，这是塑造自我的第一步。</p>
<strong>6. 撇开朋友　</strong>
<p style="padding-left: 30px;">对于那些不支持你目标的“朋友”，要敬而远之。结交那些希望你快乐和成功的人，你就在追求快乐和成功的路上迈出最重要的一步。对生活的热情具有感染力。因此同乐观的人为伴能让我们看到更多的人生希望。</p>
<strong>7. 迎接恐惧　</strong>
<p style="padding-left: 30px;">世上最秘而不宣的秘密是，战胜恐惧后迎来的是某种安全有益的东西。哪怕克服的是小小的恐惧，也会增强你对创造自己生活能力的信心。如果一味想避开恐惧，它们会象疯狗一样对我们穷追不舍。此时，最可怕的莫过于双眼一闭假装它们不存在。</p>
<strong>8. 做好调整计划</strong>
<p style="padding-left: 30px;">实现目标的道路绝不是坦途。它总是呈现出一条波浪线，有起也有落。但你可以安排自己的休整点。事先看看你的时间表，留出你放松、调整、恢复元气的时间。即使你现在感觉不错，也要做好调整计划。这才是明智之举。在自己的事业波峰时，要给自己安排休整点。安排出一大段时间让自己隐退一下，即使是离开自己挚爱的工作也要如此。只有这样，在你重新投入工作时才能更富激情。</p>
<strong>9. 直面困难　</strong>
<p style="padding-left: 30px;">每一个解决方案都是针对一个问题的。二者缺一不可。困难对于脑力运动者来说，不过是一场场艰辛的比赛。真正的运动者总是盼望比赛。如果把困难看作对自己的诅咒，就很难在生活中找到动力。如果学会了把握困难带来的机遇，你自然会动力陡生。</p>
<strong>10. 首先要感觉好</strong>
<p style="padding-left: 30px;">多数人认为，一旦达到某个目标，人们就会感到身心舒畅。但问题是你可能永远达不到目标。把快乐建立在还不曾拥有的事情上，无异于剥夺自己创造快乐的权力。记住，快乐是天赋权利。首先就要有良好的感觉，让它使自己在塑造自我的整个旅途中充满快乐，而不要再等到成功的最后一刻才去感受属于自己的欢乐。</p>
<strong>11. 加强排练　</strong>
<p style="padding-left: 30px;">先“排演”一场比你要面对的敌人要复杂的战斗。如果手上有棘手活而自己又犹豫不决，不妨挑件更难的事先做。生活挑战你的事情，你定可以用来挑战自己。这样，你就可以自己开辟一条成功之路。成功的真谛是：对自己越苛刻，生活对你越宽容；对自己越宽容，生活对你越苛刻。</p>
<strong>12. 立足现在</strong>
<p style="padding-left: 30px;">锻炼自己即刻行动的能力。充分利用对现时的认知力。不要沉浸在过去，也不要耽溺于未来，要着眼于今天。当然要有梦想、筹划和制订创造目标的时间。不过，这一切就绪后，一定要学会脚踏实地、注重眼前的行动。要把整个生命凝聚在此时此刻。</p>
<strong>13. 敢于竞争　</strong>
<p style="padding-left: 30px;">竞争给了我们宝贵的经验，无论你多么出色，总会人外有人。所以你需要学会谦虚。努力胜过别人，能使自己更深地认识自己；努力胜过别人，便在生活中加入了竞争“游戏”。不管在哪里，都要参与竞争，而且总要满怀快乐的心情。要明白最终超越别人远没有超越自己更重要。</p>
<strong>14. 内省　</strong>
<p style="padding-left: 30px;">大多数人通过别人对自己的印象和看法来看自己。获得别人对自己的反映很不错，尤其正面反馈。但是，仅凭别人的一面之辞，把自己的个人形象建立在别人身上，就会面临严重束缚自己的危险。因此，只把这些溢美之词当作自己生活中的点缀。人生的棋局该由自己来摆。不要从别人身上找寻自己，应该经常自省并塑造自我。</p>
<strong>15. 走向危机　</strong>
<p style="padding-left: 30px;">危机能激发我们竭尽全力。无视这种现象，我们往往会愚蠢地创造一种追求舒适的生活，努力设计各种越来越轻松的生活方式，使自己生活得风平浪静。当然，我们不必坐等危机或悲剧的到来，从内心挑战自我是我们生命力量的源泉。</p>
<strong>16. 精工细笔　</strong>
<p style="padding-left: 30px;">创造自我，如绘巨幅画一样，不要怕精工细笔。如果把自己当作一幅正在描绘中杰作，你就会乐于从细微处做改变。一件小事做得与众不同，也会令你兴奋不已。总之，无论你有多么小的变化，点点都于你很重要。</p>
<strong>17. 敢于犯错　</strong>
<p style="padding-left: 30px;">有时候我们不做一件事，是因为我们没有把握做好。我们感到自己“状态不佳”或精力不足时，往往会把必须做的事放在一边，或静等灵感的降临。你可不要这样。如果有些事你知道需要做却又提不起劲，尽管去做，不要怕犯错。给自己一点自嘲式幽默。抱一种打趣的心情来对待自己做不好的事情，一旦做起来了尽管乐在其中。</p>
<strong>18. 不要害怕拒绝　</strong>
<p style="padding-left: 30px;">不要消极接受别人的拒绝，而要积极面对。你的要求却落空时，把这种拒绝当作一个问题：“自己能不能更多一点创意呢？”，不要听见不字就打退堂鼓。应该让这种拒绝激励你更大的创造力。</p>
<strong>19. 尽量放松　</strong>
<p style="padding-left: 30px;">接受挑战后，要尽量放松。在脑电波开始平和你的中枢神经系统时，你可感受到自己的内在动力在不断增加。你很快会知道自己有何收获。自己能做的事，不必祈求上天赐予你勇气，放松可以产生迎接挑战的勇气。</p>
<strong>20. 一生的缩影　</strong>
<p style="padding-left: 30px;">塑造自我的关键是甘做小事，但必须即刻就做。塑造自我不能一蹴而就，而是一个循序渐进的过程。这儿做一点，那儿改一下，将使你的一天（也就是你的一生）有滋有味。今天是你整个生命的一个小原子，是你一生的缩影。 大多数人希望自己的生活富有意义。但是生活不在未来。我们越是认为自己有充分的时间去做自己想做的事，就越会在这种沉醉中让人生中的绝妙机会悄然流逝。只有重视今天，自我激励的力量才能汩汩不绝。</p>]]></description>
			<content:encoded><![CDATA[<p>文/晨曦</p>
<p>在我们不断塑造自我的过程中，影响最大的莫过于是选择乐观的态度还是悲观的态度。我们思想上的这种抉择可能给我们带来激励，也有可能阻滞我们前进。清晰地规划目标是人生走向成功的第一步，但塑造自我却不仅限于规划目标。要真正塑造自我和自己想要的生活，我们必须奋起行动。莎士比亚说得好：“行动胜过雄辩。”一旦掌握自我激励，自我塑造的过程也就随即开始。</p>
<p>以下方法可以帮你塑造自我，塑造那个你一直梦寐以求的自我。</p>
<p><strong>1. 树立愿景</strong></p>
<p style="padding-left: 30px;">迈向自我塑造的第一步，要有一个你每天早晨醒来为之奋斗的目标，它应是你人生的目标。愿景必须即刻着手建立，而不要往后拖。你随时可以按自己的想法做些改变，但不能一刻没有愿景。</p>
<p><strong>2. 离开舒适区　</strong></p>
<p style="padding-left: 30px;">不断寻求挑战激励自己。提防自己，不要躺倒在舒适区。舒适区只是避风港，不是安乐窝。它只是你心中准备迎接下次挑战之前刻意放松自己和恢复元气的地方。</p>
<p>3. <strong>把握好情绪</strong></p>
<p style="padding-left: 30px;">人开心的时候，体内就会发生奇妙的变化，从而获得阵阵新的动力和力量。但是，不要总想在自身之外寻开心。令你开心的事不在别处，就在你身上。因此，找出自身的情绪高涨期用来不断激励自己。</p>
<p><strong>4. 调高目标</strong></p>
<p style="padding-left: 30px;">许多人惊奇地发现，他们之所以达不到自己孜孜以求的目标，是因为他们的主要目标太小、而且太模糊不清，使自己失去动力。如果你的主要目标不能激发你的想象力，目标的实现就会遥遥无期。因此，真正能激励你奋发向上的是，确立一个既宏伟又具体的远大目标。</p>
<p><strong>5. 加强紧迫感　</strong></p>
<p style="padding-left: 30px;">自以为长命百岁无益于你享受人生。然而，大多数人对此视而不见，假装自己的生命会绵延无绝。惟有心血来潮的那天，我们才会筹划大事业，将我们的目标和梦想寄在“虚幻岛”的汪洋大海之中。其实，直面死亡未必要等到生命耗尽时的临终一刻。事实上，如果能逼真地想象我们的弥留之际，会物极必反产生一种再生的感觉，这是塑造自我的第一步。</p>
<p><strong>6. 撇开朋友　</strong></p>
<p style="padding-left: 30px;">对于那些不支持你目标的“朋友”，要敬而远之。结交那些希望你快乐和成功的人，你就在追求快乐和成功的路上迈出最重要的一步。对生活的热情具有感染力。因此同乐观的人为伴能让我们看到更多的人生希望。</p>
<p><strong>7. 迎接恐惧　</strong></p>
<p style="padding-left: 30px;">世上最秘而不宣的秘密是，战胜恐惧后迎来的是某种安全有益的东西。哪怕克服的是小小的恐惧，也会增强你对创造自己生活能力的信心。如果一味想避开恐惧，它们会象疯狗一样对我们穷追不舍。此时，最可怕的莫过于双眼一闭假装它们不存在。</p>
<p><strong>8. 做好调整计划</strong></p>
<p style="padding-left: 30px;">实现目标的道路绝不是坦途。它总是呈现出一条波浪线，有起也有落。但你可以安排自己的休整点。事先看看你的时间表，留出你放松、调整、恢复元气的时间。即使你现在感觉不错，也要做好调整计划。这才是明智之举。在自己的事业波峰时，要给自己安排休整点。安排出一大段时间让自己隐退一下，即使是离开自己挚爱的工作也要如此。只有这样，在你重新投入工作时才能更富激情。</p>
<p><strong>9. 直面困难　</strong></p>
<p style="padding-left: 30px;">每一个解决方案都是针对一个问题的。二者缺一不可。困难对于脑力运动者来说，不过是一场场艰辛的比赛。真正的运动者总是盼望比赛。如果把困难看作对自己的诅咒，就很难在生活中找到动力。如果学会了把握困难带来的机遇，你自然会动力陡生。</p>
<p><strong>10. 首先要感觉好</strong></p>
<p style="padding-left: 30px;">多数人认为，一旦达到某个目标，人们就会感到身心舒畅。但问题是你可能永远达不到目标。把快乐建立在还不曾拥有的事情上，无异于剥夺自己创造快乐的权力。记住，快乐是天赋权利。首先就要有良好的感觉，让它使自己在塑造自我的整个旅途中充满快乐，而不要再等到成功的最后一刻才去感受属于自己的欢乐。</p>
<p><strong>11. 加强排练　</strong></p>
<p style="padding-left: 30px;">先“排演”一场比你要面对的敌人要复杂的战斗。如果手上有棘手活而自己又犹豫不决，不妨挑件更难的事先做。生活挑战你的事情，你定可以用来挑战自己。这样，你就可以自己开辟一条成功之路。成功的真谛是：对自己越苛刻，生活对你越宽容；对自己越宽容，生活对你越苛刻。</p>
<p><strong>12. 立足现在</strong></p>
<p style="padding-left: 30px;">锻炼自己即刻行动的能力。充分利用对现时的认知力。不要沉浸在过去，也不要耽溺于未来，要着眼于今天。当然要有梦想、筹划和制订创造目标的时间。不过，这一切就绪后，一定要学会脚踏实地、注重眼前的行动。要把整个生命凝聚在此时此刻。</p>
<p><strong>13. 敢于竞争　</strong></p>
<p style="padding-left: 30px;">竞争给了我们宝贵的经验，无论你多么出色，总会人外有人。所以你需要学会谦虚。努力胜过别人，能使自己更深地认识自己；努力胜过别人，便在生活中加入了竞争“游戏”。不管在哪里，都要参与竞争，而且总要满怀快乐的心情。要明白最终超越别人远没有超越自己更重要。</p>
<p><strong>14. 内省　</strong></p>
<p style="padding-left: 30px;">大多数人通过别人对自己的印象和看法来看自己。获得别人对自己的反映很不错，尤其正面反馈。但是，仅凭别人的一面之辞，把自己的个人形象建立在别人身上，就会面临严重束缚自己的危险。因此，只把这些溢美之词当作自己生活中的点缀。人生的棋局该由自己来摆。不要从别人身上找寻自己，应该经常自省并塑造自我。</p>
<p><strong>15. 走向危机　</strong></p>
<p style="padding-left: 30px;">危机能激发我们竭尽全力。无视这种现象，我们往往会愚蠢地创造一种追求舒适的生活，努力设计各种越来越轻松的生活方式，使自己生活得风平浪静。当然，我们不必坐等危机或悲剧的到来，从内心挑战自我是我们生命力量的源泉。</p>
<p><strong>16. 精工细笔　</strong></p>
<p style="padding-left: 30px;">创造自我，如绘巨幅画一样，不要怕精工细笔。如果把自己当作一幅正在描绘中杰作，你就会乐于从细微处做改变。一件小事做得与众不同，也会令你兴奋不已。总之，无论你有多么小的变化，点点都于你很重要。</p>
<p><strong>17. 敢于犯错　</strong></p>
<p style="padding-left: 30px;">有时候我们不做一件事，是因为我们没有把握做好。我们感到自己“状态不佳”或精力不足时，往往会把必须做的事放在一边，或静等灵感的降临。你可不要这样。如果有些事你知道需要做却又提不起劲，尽管去做，不要怕犯错。给自己一点自嘲式幽默。抱一种打趣的心情来对待自己做不好的事情，一旦做起来了尽管乐在其中。</p>
<p><strong>18. 不要害怕拒绝　</strong></p>
<p style="padding-left: 30px;">不要消极接受别人的拒绝，而要积极面对。你的要求却落空时，把这种拒绝当作一个问题：“自己能不能更多一点创意呢？”，不要听见不字就打退堂鼓。应该让这种拒绝激励你更大的创造力。</p>
<p><strong>19. 尽量放松　</strong></p>
<p style="padding-left: 30px;">接受挑战后，要尽量放松。在脑电波开始平和你的中枢神经系统时，你可感受到自己的内在动力在不断增加。你很快会知道自己有何收获。自己能做的事，不必祈求上天赐予你勇气，放松可以产生迎接挑战的勇气。</p>
<p><strong>20. 一生的缩影　</strong></p>
<p style="padding-left: 30px;">塑造自我的关键是甘做小事，但必须即刻就做。塑造自我不能一蹴而就，而是一个循序渐进的过程。这儿做一点，那儿改一下，将使你的一天（也就是你的一生）有滋有味。今天是你整个生命的一个小原子，是你一生的缩影。 大多数人希望自己的生活富有意义。但是生活不在未来。我们越是认为自己有充分的时间去做自己想做的事，就越会在这种沉醉中让人生中的绝妙机会悄然流逝。只有重视今天，自我激励的力量才能汩汩不绝。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/self-motivation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>黑苹果安装折腾记</title>
		<link>http://chenyc.info/2012/02/black-mac-install/</link>
		<comments>http://chenyc.info/2012/02/black-mac-install/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 14:01:44 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[黑苹果]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=864</guid>
		<description><![CDATA[准备学习一下IOS开发，必须使用MAC系统，于是果断决定安装黑苹果。

我的笔记本上联想的B460，之前看到有人安装黑苹果成功过，这一款本本算是比较容易安装成功的。

我的笔记本配置参数：
<ul>
	<li>屏幕尺寸：14英寸 1366x768</li>
	<li>CPU型号：Intel 酷睿i3 370M</li>
	<li>CPU主频：2.4GHz</li>
	<li>内存容量：2GB DDR3 1066MHz</li>
	<li>硬盘容量：320GB 5400转，SATA</li>
	<li>显卡芯片：NVIDIA Geforce 310M</li>
</ul>
我采用的懒人版的MAC 10.7系统，安装时只有一个PCI配置问题，算是相当顺利了。

MAC系统下载地址：
<div>
<div id="code_o3k">
<ol>
	<li><a href="http://www.ctdisk.com/file/1357845" target="_blank">http://u.115.com/file/clo1vkwd</a></li>
	<li><a href="http://u.115.com/file/aqax6p1n" target="_blank">http://u.115.com/file/aqax6p1n</a></li>
	<li><a href="http://u.115.com/file/cloyqps2" target="_blank">http://u.115.com/file/cloyqps2</a></li>
	<li><a href="http://u.115.com/file/aqaoyxsp" target="_blank">http://u.115.com/file/aqaoyxsp</a></li>
</ol>
</div>
</div>
安装时至少准备30G的空间，我第一次只分配了20G的，结果安装完xcode后系统只有几百兆空间了，没办法又重装了一次。

安装参考教程：<a href="http://bbs.pcbeta.com/viewthread-897025-1-1.html" target="_blank">http://bbs.pcbeta.com/viewthread-897025-1-1.html</a>

系统引导我是通过安装Windows版的“<a href="http://bbs.pcbeta.com/viewthread-967947-1-1.html">变色龙</a>”引导的，没有按照教程里来。使用变色龙，需要加入一些附加的驱动，首先安装<a href="http://www.onlinedown.net/soft/31914.htm" target="_blank">MacDrive 8</a>，使Windows能够访问MAC系统的分区，然后拷贝<a href="http://www.ctdisk.com/file/1368177">extra</a>目录到硬盘安装盘的根目录，最后重启进入变色龙，选择MAC安装盘，加入-f -v参数（选择盘后直接用键盘输入）启动安装。

安装完成后，也需要到Windows中把<a href="http://www.ctdisk.com/file/1368177">extra</a>目录复制到MAC系统的根目录下。

总结一下安装时遇到的问题：

1.启动安装盘时，停止于'PCI Configuration Begin'。
<p style="padding-left: 30px;">解决方法：在启动参数里加入 npci=0x2000</p>
2.系统安装完，重启后找不到文件，无法启动。
<p style="padding-left: 30px;">原因：因为安装MAC系统的分区被设置活动分区，而C盘如果没有设置为活动分区，BIOS就会用找到的活动分区（mac系统所在的分区）开始引导。</p>
<p style="padding-left: 30px;">解决办法：用Windows的安装盘运行Windows PE,再打开磁盘管理软件，将C盘设置为活动分区；或者进入DOS，用fdisk设置为活动分区。</p>
3.直接启动安装好的MAC系统还是会停止在'PCI Configuration Begin'
<p style="padding-left: 30px;">解决办法：在Windows中打开MAC系统所在的盘，定位到\Library\Preferences\SystemConfiguration，编辑com.apple.Boot.plist文件，在&#60;string&#62;&#60;/string&#62;当中加入“npci=0x2000 GraphicsEnabler=yes”，重新启动；加入GraphicsEnabler参数后，如果显卡驱动还没有加载成功，再安装一下<a href="http://www.ctdisk.com/file/1357845" target="_blank">Enabler_for_Nvidia_and_multiple_ATI_cards.pkg</a>。</p>
4.无法播放声音，声卡驱动有问题，目前还没有解决办法，不准备弄了。

PS1：安装好的mac系统用ghost也能备份/恢复；但是有一个问题，我因为分区太小，备份了系统，然后扩展分区大小到30G，再恢复，结果系统还只能认到20G。

PS2：使用windows 7的磁盘管理工具压缩空间，然后创建了新的分区，在操作完成后，不知道什么原因，最后一个分区没了;如果出现这种情况，千万不要格式化，可以通过DiskGenius软件（版本3.5以上）的“找回丢失的分区”功能把分区找回来。]]></description>
			<content:encoded><![CDATA[<p>准备学习一下IOS开发，必须使用MAC系统，于是果断决定安装黑苹果。</p>
<p>我的笔记本上联想的B460，之前看到有人安装黑苹果成功过，这一款本本算是比较容易安装成功的。</p>
<p>我的笔记本配置参数：</p>
<ul>
<li>屏幕尺寸：14英寸 1366&#215;768</li>
<li>CPU型号：Intel 酷睿i3 370M</li>
<li>CPU主频：2.4GHz</li>
<li>内存容量：2GB DDR3 1066MHz</li>
<li>硬盘容量：320GB 5400转，SATA</li>
<li>显卡芯片：NVIDIA Geforce 310M</li>
</ul>
<p>我采用的懒人版的MAC 10.7系统，安装时只有一个PCI配置问题，算是相当顺利了。</p>
<p>MAC系统下载地址：</p>
<div>
<div id="code_o3k">
<ol>
<li><a href="http://www.ctdisk.com/file/1357845" target="_blank">http://u.115.com/file/clo1vkwd</a></li>
<li><a href="http://u.115.com/file/aqax6p1n" target="_blank">http://u.115.com/file/aqax6p1n</a></li>
<li><a href="http://u.115.com/file/cloyqps2" target="_blank">http://u.115.com/file/cloyqps2</a></li>
<li><a href="http://u.115.com/file/aqaoyxsp" target="_blank">http://u.115.com/file/aqaoyxsp</a></li>
</ol>
</div>
</div>
<p>安装时至少准备30G的空间，我第一次只分配了20G的，结果安装完xcode后系统只有几百兆空间了，没办法又重装了一次。</p>
<p>安装参考教程：<a href="http://bbs.pcbeta.com/viewthread-897025-1-1.html" target="_blank">http://bbs.pcbeta.com/viewthread-897025-1-1.html</a></p>
<p>系统引导我是通过安装Windows版的“<a href="http://bbs.pcbeta.com/viewthread-967947-1-1.html">变色龙</a>”引导的，没有按照教程里来。使用变色龙，需要加入一些附加的驱动，首先安装<a href="http://www.onlinedown.net/soft/31914.htm" target="_blank">MacDrive 8</a>，使Windows能够访问MAC系统的分区，然后拷贝<a href="http://www.ctdisk.com/file/1368177">extra</a>目录到硬盘安装盘的根目录，最后重启进入变色龙，选择MAC安装盘，加入-f -v参数（选择盘后直接用键盘输入）启动安装。</p>
<p>安装完成后，也需要到Windows中把<a href="http://www.ctdisk.com/file/1368177">extra</a>目录复制到MAC系统的根目录下。</p>
<p>总结一下安装时遇到的问题：</p>
<p>1.启动安装盘时，停止于&#8217;PCI Configuration Begin&#8217;。</p>
<p style="padding-left: 30px;">解决方法：在启动参数里加入 npci=0&#215;2000</p>
<p>2.系统安装完，重启后找不到文件，无法启动。</p>
<p style="padding-left: 30px;">原因：因为安装MAC系统的分区被设置活动分区，而C盘如果没有设置为活动分区，BIOS就会用找到的活动分区（mac系统所在的分区）开始引导。</p>
<p style="padding-left: 30px;">解决办法：用Windows的安装盘运行Windows PE,再打开磁盘管理软件，将C盘设置为活动分区；或者进入DOS，用fdisk设置为活动分区。</p>
<p>3.直接启动安装好的MAC系统还是会停止在&#8217;PCI Configuration Begin&#8217;</p>
<p style="padding-left: 30px;">解决办法：在Windows中打开MAC系统所在的盘，定位到\Library\Preferences\SystemConfiguration，编辑com.apple.Boot.plist文件，在&lt;string&gt;&lt;/string&gt;当中加入“npci=0&#215;2000 GraphicsEnabler=yes”，重新启动；加入GraphicsEnabler参数后，如果显卡驱动还没有加载成功，再安装一下<a href="http://www.ctdisk.com/file/1357845" target="_blank">Enabler_for_Nvidia_and_multiple_ATI_cards.pkg</a>。</p>
<p>4.无法播放声音，声卡驱动有问题，目前还没有解决办法，不准备弄了。</p>
<p>PS1：安装好的mac系统用ghost也能备份/恢复；但是有一个问题，我因为分区太小，备份了系统，然后扩展分区大小到30G，再恢复，结果系统还只能认到20G。</p>
<p>PS2：使用windows 7的磁盘管理工具压缩空间，然后创建了新的分区，在操作完成后，不知道什么原因，最后一个分区没了;如果出现这种情况，千万不要格式化，可以通过DiskGenius软件（版本3.5以上）的“找回丢失的分区”功能把分区找回来。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/black-mac-install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>node.js初体验</title>
		<link>http://chenyc.info/2012/02/node-js-learn/</link>
		<comments>http://chenyc.info/2012/02/node-js-learn/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 12:27:45 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[web]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=847</guid>
		<description><![CDATA[因为阿里的云计算平台采用的是<a href="http://nodejs.org/">Node.js</a>，好奇所以就简单的了解了一下.

<a href="http://nodejs.org/">Node.js</a>可以用JavaScript编写服务端的代码，实际上编写<a href="http://nodejs.org/">Node.js</a>的应用，

不仅仅是编写一个应用，而是整个服务器。

Node.js的特性
<p style="padding-left: 30px;"><strong>1. 单线程</strong></p>
<p style="padding-left: 30px;"><strong>2. 非阻塞IO</strong></p>
<p style="padding-left: 30px;"><strong>3. Google V8</strong></p>
<p style="padding-left: 30px;"><strong>4. 事件驱动</strong></p>
据网上的评测，由于事件驱动和非阻塞IO等特性，Node.js编写出来的程序性能极高，但由于是单线程的，难于利用多处理器的优势，另外也因为是单线程，导致Node.js编写的程序极其脆弱，如果有一个页面访问出错，就会导致整个应用服务器崩溃掉，所以我认为得<a href="http://nodejs.org/">Node.js</a>编写的程序需要充分测试（或许还有方法可以避免应用服务器直接崩溃掉）。

另外Node.js不像python这样可以修改后直接看到效果，而是需要重启服务器，这点感觉调试起来感觉很不爽。

来个Hello World的例子，拷贝以下代码保存为hello_world.js:
<pre>var http = require("http");

function onRequest(request, response) {
  console.log("Request received.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);

console.log("Server has started.");</pre>
<pre>运行：在命令行输入 node hello_world.js</pre>
我是参照<a href="http://www.nodebeginner.org/index-zh-cn.html">http://www.nodebeginner.org/index-zh-cn.html</a>学习的，总体感觉还是比较容易上手的，另外<a href="http://nodejs.org/">Node.js</a>还有一个比较流行的MVC框架<a href="http://expressjs.com/">Express</a>，有空可以研究一下。

附：
<p style="padding-left: 30px;"><a href="http://blog.sina.com.cn/s/blog_593832910100o1v5.html" target="_blank">node.js调研与服务性能测试</a></p>

<h1 style="padding-left: 30px;"><a id="cb_post_title_url" href="http://www.cnblogs.com/QLeelulu/archive/2011/01/28/nodejs_into_and_n2mvc.html" target="_blank">Node.js：用JavaScript写服务器端程序-介绍并写个MVC框架</a></h1>
<h3 style="padding-left: 30px;"><a href="http://snoopyxdy.blog.163.com/blog/static/60117440201183101319257/" target="_blank">巅峰对决：node.js和php性能测试 </a></h3>
&#160;]]></description>
			<content:encoded><![CDATA[<p>因为阿里的云计算平台采用的是<a href="http://nodejs.org/">Node.js</a>，好奇所以就简单的了解了一下.</p>
<p><a href="http://nodejs.org/">Node.js</a>可以用JavaScript编写服务端的代码，实际上编写<a href="http://nodejs.org/">Node.js</a>的应用，</p>
<p>不仅仅是编写一个应用，而是整个服务器。</p>
<p>Node.js的特性</p>
<p style="padding-left: 30px;"><strong>1. 单线程</strong></p>
<p style="padding-left: 30px;"><strong>2. 非阻塞IO</strong></p>
<p style="padding-left: 30px;"><strong>3. Google V8</strong></p>
<p style="padding-left: 30px;"><strong>4. 事件驱动</strong></p>
<p>据网上的评测，由于事件驱动和非阻塞IO等特性，Node.js编写出来的程序性能极高，但由于是单线程的，难于利用多处理器的优势，另外也因为是单线程，导致Node.js编写的程序极其脆弱，如果有一个页面访问出错，就会导致整个应用服务器崩溃掉，所以我认为得<a href="http://nodejs.org/">Node.js</a>编写的程序需要充分测试（或许还有方法可以避免应用服务器直接崩溃掉）。</p>
<p>另外Node.js不像python这样可以修改后直接看到效果，而是需要重启服务器，这点感觉调试起来感觉很不爽。</p>
<p>来个Hello World的例子，拷贝以下代码保存为hello_world.js:</p>
<pre>var http = require("http");

function onRequest(request, response) {
  console.log("Request received.");
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);

console.log("Server has started.");</pre>
<pre>运行：在命令行输入 node hello_world.js</pre>
<p>我是参照<a href="http://www.nodebeginner.org/index-zh-cn.html">http://www.nodebeginner.org/index-zh-cn.html</a>学习的，总体感觉还是比较容易上手的，另外<a href="http://nodejs.org/">Node.js</a>还有一个比较流行的MVC框架<a href="http://expressjs.com/">Express</a>，有空可以研究一下。</p>
<p>附：</p>
<p style="padding-left: 30px;"><a href="http://blog.sina.com.cn/s/blog_593832910100o1v5.html" target="_blank">node.js调研与服务性能测试</a></p>
<h1 style="padding-left: 30px;"><a id="cb_post_title_url" href="http://www.cnblogs.com/QLeelulu/archive/2011/01/28/nodejs_into_and_n2mvc.html" target="_blank">Node.js：用JavaScript写服务器端程序-介绍并写个MVC框架</a></h1>
<h3 style="padding-left: 30px;"><a href="http://snoopyxdy.blog.163.com/blog/static/60117440201183101319257/" target="_blank">巅峰对决：node.js和php性能测试 </a></h3>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/node-js-learn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>迁移Blog到Amazon EC2云服务器</title>
		<link>http://chenyc.info/2012/02/blog-to-ec2/</link>
		<comments>http://chenyc.info/2012/02/blog-to-ec2/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 16:10:03 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://chenyc.info/blog/?p=827</guid>
		<description><![CDATA[<a href="http://aws.amazon.com/ec2/" target="_blank">Amazon EC2</a>云服务器首年使用免费，第二年开始得每年100多美元，到时候再重新弄个帐号，再搬一下。
注册<a href="http://aws.amazon.com/ec2/" target="_blank">Amazon EC2</a>还是比较麻烦的，需要通过手机和信用卡认证，可以参考<a title="Amazon EC2一年免费服务注册过程(图解)" href="http://www.bityun.com/archives/42" target="_blank">Amazon EC2一年免费服务注册过程(图解)</a>。

注册完成后选择实例，需要选择基于EBS文件系统的，且主机类型需要选择micro类型，这样才能有第一年免费;接着安装和配置服务，我选择的是LNMP，参考<a href="http://blog.hebine.com/archives/1552.html">http://blog.hebine.com/archives/1552.html</a>

EC2提供了不同区域的服务器，我测试了美国西海岸和日本东京的，美国西海岸在网通下速度还行，在电信下非常的慢；日本东京的稍微好一些，所以就选择了日本东京的服务器。

最后迁移<a href="http://www.wordpress.org" target="_blank">wordpress</a>,最简单的办法就是备份所有文件和数据库，到新服务器上还原就行了，然后打开<a href="https://www.godaddy.com/" target="_blank">godaddy</a>修改域名解析，EC2提供了独立IP，所以直接配置中指定IP就OK了，域名修改生效也非常快。

如果服务稳定的话，以后准备一直使用下去了，毕竟EC2就是一台VPS啊，拥有所有的权限，非常方便，以后还可以配置基于SSH的代理等；还可以部署一个Python web服务器，在自己折腾一些想法的时候使用（SAE也可以，但是受控感觉不大方便）。

<strong>为了以后迁移方便，记下一些主要步骤</strong>
<p style="padding-left: 30px;">1.选择AMI安装系统，搜索“099720109477”发布的Ubuntu 11.04系统，这是Ubuntu官方在EC2上提供的系统。</p>
<p style="padding-left: 30px;">2.安装LNMP，参考<a href="http://blog.hebine.com/archives/1552.html">http://blog.hebine.com/archives/1552.html</a>。另外由于采用了nginx，实现wordpress固定链接的支持需要在nginx的配置中加入</p>

<pre style="padding-left: 30px;">try_files $uri $uri/ /index.php?q=$uri&#38;$args;</pre>
<p style="padding-left: 30px;">3.安装vsftpd，配置ftp服务器。参考<a href="http://www.douban.com/note/80626720/">http://www.douban.com/note/80626720/</a>，在windows连接vsftpd时需要选择被动模式，在EC2下连接其他FTP服务器时，需要使用ftp -p ip地址，必须加上-p参数。</p>
<p style="padding-left: 30px;">4.tar备份/home/www目录，phpMyAdmin备份数据库。</p>
<p style="padding-left: 30px;">5.通过ftp下载备份文件并解压，恢复mysql数据库。</p>
<p style="padding-left: 30px;">6.检查恢复的系统是否存在问题，正常的话，修改goDaddy域名解析的配置。</p>]]></description>
			<content:encoded><![CDATA[<p><a href="http://aws.amazon.com/ec2/" target="_blank">Amazon EC2</a>云服务器首年使用免费，第二年开始得每年100多美元，到时候再重新弄个帐号，再搬一下。<br />
注册<a href="http://aws.amazon.com/ec2/" target="_blank">Amazon EC2</a>还是比较麻烦的，需要通过手机和信用卡认证，可以参考<a title="Amazon EC2一年免费服务注册过程(图解)" href="http://www.bityun.com/archives/42" target="_blank">Amazon EC2一年免费服务注册过程(图解)</a>。</p>
<p>注册完成后选择实例，需要选择基于EBS文件系统的，且主机类型需要选择micro类型，这样才能有第一年免费;接着安装和配置服务，我选择的是LNMP，参考<a href="http://blog.hebine.com/archives/1552.html">http://blog.hebine.com/archives/1552.html</a></p>
<p>EC2提供了不同区域的服务器，我测试了美国西海岸和日本东京的，美国西海岸在网通下速度还行，在电信下非常的慢；日本东京的稍微好一些，所以就选择了日本东京的服务器。</p>
<p>最后迁移<a href="http://www.wordpress.org" target="_blank">wordpress</a>,最简单的办法就是备份所有文件和数据库，到新服务器上还原就行了，然后打开<a href="https://www.godaddy.com/" target="_blank">godaddy</a>修改域名解析，EC2提供了独立IP，所以直接配置中指定IP就OK了，域名修改生效也非常快。</p>
<p>如果服务稳定的话，以后准备一直使用下去了，毕竟EC2就是一台VPS啊，拥有所有的权限，非常方便，以后还可以配置基于SSH的代理等；还可以部署一个Python web服务器，在自己折腾一些想法的时候使用（SAE也可以，但是受控感觉不大方便）。</p>
<p><strong>为了以后迁移方便，记下一些主要步骤</strong></p>
<p style="padding-left: 30px;">1.选择AMI安装系统，搜索“099720109477”发布的Ubuntu 11.04系统，这是Ubuntu官方在EC2上提供的系统。</p>
<p style="padding-left: 30px;">2.安装LNMP，参考<a href="http://blog.hebine.com/archives/1552.html">http://blog.hebine.com/archives/1552.html</a>。另外由于采用了nginx，实现wordpress固定链接的支持需要在nginx的配置中加入</p>
<pre style="padding-left: 30px;">try_files $uri $uri/ /index.php?q=$uri&amp;$args;</pre>
<p style="padding-left: 30px;">3.安装vsftpd，配置ftp服务器。参考<a href="http://www.douban.com/note/80626720/">http://www.douban.com/note/80626720/</a>，在windows连接vsftpd时需要选择被动模式，在EC2下连接其他FTP服务器时，需要使用ftp -p ip地址，必须加上-p参数。</p>
<p style="padding-left: 30px;">4.tar备份/home/www目录，phpMyAdmin备份数据库。</p>
<p style="padding-left: 30px;">5.通过ftp下载备份文件并解压，恢复mysql数据库。</p>
<p style="padding-left: 30px;">6.检查恢复的系统是否存在问题，正常的话，修改goDaddy域名解析的配置。</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/02/blog-to-ec2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正则表达式学习摘录</title>
		<link>http://chenyc.info/2012/01/regex-study/</link>
		<comments>http://chenyc.info/2012/01/regex-study/#comments</comments>
		<pubDate>Tue, 17 Jan 2012 09:31:26 +0000</pubDate>
		<dc:creator>阳春面</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://chenyc.info/?p=812</guid>
		<description><![CDATA[1．正则表达式匹配匹配结果，只包括匹配上的部分，不包括整个字符串，
   如果需要把整个字符串传递到后续处理时，需要注意。

2．字符点（.）可以匹配任何一个字符，可以在正则表达式中多次出现。

3.[]中的字符，代表字符集，如[ns]将匹配n或者s字符

4.^符号，代表取非操作

5.\b 回退符 \f 换页符 \n 换行符 \r 回车符 \t 制表符（TAB） \v 垂直制表符

6.\d 任何一个数字，\D 任何一个非数字

7.\w 任何一个字母，数字字符，\W 任何一个非字母，非数字字符

8.\s 任何一个空白字符，\S 任何一个非空白字符

9.{}中的哦数字，代表匹配的重复次数

10.{2,4}的含义最少重复2次，最多重复4次

11.？代表出现0次或1次

12.*,+号等匹配时默认都是贪婪型元素符，如
<blockquote>测试文字：&#60;b&#62;hello&#60;/b&#62;&#60;b&#62;world&#60;/b&#62;

采用此正则&#60;[Bb]&#62;.*&#60;/[Bb]&#62;匹配时，会从头匹配到结尾，结果是

&#60;b&#62;hello&#60;/b&#62;&#60;b&#62;world&#60;/b&#62;

但我们不需要这种贪婪型匹配时，需要加载*号，将其变成懒惰型，改成

&#60;[Bb]&#62;.*?&#60;/[Bb]&#62;,此时的匹配结果如下：

【匹配结果：2】

(1)&#60;b&#62;hello&#60;/b&#62;

(2)&#60;b&#62;world&#60;/b&#62;</blockquote>
13.位置匹配

\b 单词边界，如\bcat\b,将在文本中只匹配cat单词

^匹配字符串开头

$匹配字符串结尾

(?m) 表示分行匹配模式，^和$可以匹配每一行的开始和结尾

14.子表达式,子表达式用()括起来即可

15.回溯引用 \1 代表在正则中出现的第一个表达式

16.替换中使用$1表示正则中的第一个表达式、

17.前后查找，?=表示向前查找，只找到对应值，但不出现到匹配结果里; ?&#60;=  表示向后查找]]></description>
			<content:encoded><![CDATA[<p>1．正则表达式匹配匹配结果，只包括匹配上的部分，不包括整个字符串，<br />
   如果需要把整个字符串传递到后续处理时，需要注意。</p>
<p>2．字符点（.）可以匹配任何一个字符，可以在正则表达式中多次出现。</p>
<p>3.[]中的字符，代表字符集，如[ns]将匹配n或者s字符</p>
<p>4.^符号，代表取非操作</p>
<p>5.\b 回退符 \f 换页符 \n 换行符 \r 回车符 \t 制表符（TAB） \v 垂直制表符</p>
<p>6.\d 任何一个数字，\D 任何一个非数字</p>
<p>7.\w 任何一个字母，数字字符，\W 任何一个非字母，非数字字符</p>
<p>8.\s 任何一个空白字符，\S 任何一个非空白字符</p>
<p>9.{}中的哦数字，代表匹配的重复次数</p>
<p>10.{2,4}的含义最少重复2次，最多重复4次</p>
<p>11.？代表出现0次或1次</p>
<p>12.*,+号等匹配时默认都是贪婪型元素符，如</p>
<blockquote><p>测试文字：&lt;b&gt;hello&lt;/b&gt;&lt;b&gt;world&lt;/b&gt;</p>
<p>采用此正则&lt;[Bb]&gt;.*&lt;/[Bb]&gt;匹配时，会从头匹配到结尾，结果是</p>
<p>&lt;b&gt;hello&lt;/b&gt;&lt;b&gt;world&lt;/b&gt;</p>
<p>但我们不需要这种贪婪型匹配时，需要加载*号，将其变成懒惰型，改成</p>
<p>&lt;[Bb]&gt;.*?&lt;/[Bb]&gt;,此时的匹配结果如下：</p>
<p>【匹配结果：2】</p>
<p>(1)&lt;b&gt;hello&lt;/b&gt;</p>
<p>(2)&lt;b&gt;world&lt;/b&gt;</p></blockquote>
<p>13.位置匹配</p>
<p>\b 单词边界，如\bcat\b,将在文本中只匹配cat单词</p>
<p>^匹配字符串开头</p>
<p>$匹配字符串结尾</p>
<p>(?m) 表示分行匹配模式，^和$可以匹配每一行的开始和结尾</p>
<p>14.子表达式,子表达式用()括起来即可</p>
<p>15.回溯引用 \1 代表在正则中出现的第一个表达式</p>
<p>16.替换中使用$1表示正则中的第一个表达式、</p>
<p>17.前后查找，?=表示向前查找，只找到对应值，但不出现到匹配结果里; ?&lt;=  表示向后查找</p>
]]></content:encoded>
			<wfw:commentRss>http://chenyc.info/2012/01/regex-study/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

