<?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>飞扬轻狂&#039;s blog &#187; 随笔</title>
	<atom:link href="http://blog.fallseir.com/category/%e9%9a%8f%e7%ac%94/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fallseir.com</link>
	<description>我心飞扬 我意轻狂</description>
	<lastBuildDate>Tue, 31 Aug 2010 06:59:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/><cloud domain='blog.fallseir.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>安装zeromq</title>
		<link>http://blog.fallseir.com/2010/05/learn_zeromq/</link>
		<comments>http://blog.fallseir.com/2010/05/learn_zeromq/#comments</comments>
		<pubDate>Thu, 06 May 2010 07:13:26 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[闲言片语]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=251</guid>
		<description><![CDATA[安装zeromq]]></description>
			<content:encoded><![CDATA[<p>- 安装zeromq</p>
<pre class="brush:bash">
$ wget http://www.zeromq.org/local--files/area:download/zeromq-2.0.6.tar.gz
$ tar -xzf zeromq-2.0.6.tar.gz
$ cd zeromq-2.0.6
$ ./configure --prefix=/home/app/zeromq
$ make
$ sudo make install
// 重建so文件链接
$ sudo ln -s /home/app/zeromq/lib/libzmq.so.0.0.0  /usr/lib/libzmq.so.0
$ sudo ln -s /home/app/zeromq/lib/libzmq.so.0.0.0  /usr/lib/libzmq.so
</pre>
<p>- 测试zeromq</p>
<pre class="brush:c">
// client.c
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "/home/app/zeromq/include/zmq.h"

int main ()
{
    int rc;
    void *ctx, *s;
    zmq_msg_t query, resultset;
    const char *query_string, *resultset_string = "OK";

    /* Initialise 0MQ context, requesting a single application thread
       and a single I/O thread */
    ctx = zmq_init (1, 1, 0);
    assert (ctx);
    /* Create a ZMQ_REP socket to receive requests and send replies */
    s = zmq_socket (ctx, ZMQ_REP);
    assert (s);
    /* Bind to the TCP transport and port 5555 on the 'lo' interface */
    rc = zmq_bind (s, "tcp://lo:5555");
    assert (rc == 0);

    while (1) {
        /* Allocate an empty message to receive a query into */
        rc = zmq_msg_init (&#038;query);
        assert (rc == 0);

        /* Receive a message, blocks until one is available */
        rc = zmq_recv (s, &#038;query, 0);
        assert (rc == 0);

        /* Process the query */
        query_string = (const char *)zmq_msg_data (&#038;query);
        printf ("Received query: '%s'\n", query_string);
        zmq_msg_close (&#038;query);

        /* Allocate a response message and fill in an example response */
        rc = zmq_msg_init_size (&#038;resultset, strlen (resultset_string) + 1);
        assert (rc == 0);
        memcpy (zmq_msg_data (&#038;resultset),
            resultset_string, strlen (resultset_string) + 1);

        /* Send back our canned response */
        rc = zmq_send (s, &#038;resultset, 0);
        assert (rc == 0);
        zmq_msg_close (&#038;resultset);
    }
}
</pre>
<pre class="brush:cpp">
// server.cpp
#include <stdio.h>
#include "/home/app/zeromq/include/zmq.hpp"

int main ()
{
    try {
        // Initialise 0MQ context with one application and one I/O thread
        zmq::context_t ctx (1, 1);
        // Create a ZMQ_REQ socket to send requests and receive replies
        zmq::socket_t s (ctx, ZMQ_REQ);
        // Connect it to port 5555 on localhost using the TCP transport
        s.connect ("tcp://localhost:5555");

        // Construct an example zmq::message_t with our query
        const char *query_string = "SELECT * FROM mytable";
        zmq::message_t query (strlen (query_string) + 1);
        memcpy (query.data (), query_string, strlen (query_string) + 1);
        // Send the query
        s.send (query);

        // Receive and display the result
        zmq::message_t resultset;
        s.recv (&#038;resultset);
        const char *resultset_string = (const char *)resultset.data ();
        printf ("Received response: '%s'\n", resultset_string);
    }
    catch (std::exception &#038;e) {
        // 0MQ throws standard exceptions just like any other C++ API
        printf ("An error occurred: %s\n", e.what());
        return 1;
    }

    return 0;
}
</pre>
<pre class="brush:bash">
// 编译
$ gcc `pkg-config --libs --cflags /home/app/zeromq/lib/pkgconfig/libzmq.pc` -o server server.c
$ g++ `pkg-config --libs --cflags /home/app/zeromq/lib/pkgconfig/libzmq.pc` -o client client.cpp
</pre>
<p>注意：将so链接到usr/lib下 测试程序才运行成功！</p>
<p>- 安装java扩展不成功</p>
<pre class="brush:bash">
configure.in:3: error: Autoconf version 2.61 or higher is required

$ autoreconf --version
autoreconf (GNU Autoconf) 2.59
</pre>
<p>没有时间细弄了 下次有时间再试吧 准备看下 activemq去</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2010/05/learn_zeromq/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP AES-CBC 密钥插件使用实例</title>
		<link>http://blog.fallseir.com/2010/05/php-aes-cbc-example/</link>
		<comments>http://blog.fallseir.com/2010/05/php-aes-cbc-example/#comments</comments>
		<pubDate>Wed, 05 May 2010 11:20:45 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[闲言片语]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=247</guid>
		<description><![CDATA[libmcrypt
php-5.2.13/ext/mcrypt/]]></description>
			<content:encoded><![CDATA[<pre class="brush:bash">
// 安装 MCrypt 包
$ wget http://downloads.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz?use_mirror=cdnetworks-kr-2
$ tar -xzf libmcrypt-2.5.8.tar.gz
$ cd libmcrypt-2.5.8
$ ./configure --prefix=/home/app/libmcrypt-2.5.8
$ make
$ sudo make install
// 编译 php
$ wget http://cn.php.net/get/php-5.2.13.tar.gz/from/this/mirror
$ tar -xzf php-5.2.13.tar.gz
$ cd php-5.2.13/ext/mcrypt/
$ /home/php-5.2.0/bin/phpize
$ ./configure --with-php-config=/home/php-5.2.0/bin/php-config --with-mcrypt=/home/app/libmcrypt-2.5.8/
$ sudo mkdir -p /home/php5/lib/php/extensions/no-debug-non-zts-20060613
$ sudo cp -p modules/mcrypt.so /home/php5/lib/php/extensions/no-debug-non-zts-20060613/
</pre>
<p>测试：</p>
<pre class="brush:php">
dl("mcrypt.so");
$string = "test@abc.com";
$stuff="String to enc/enc/dec/dec =,=,";
$key="XiTo74dOO09N48YeUmuvbL0E";
$iv = mcrypt_create_iv (mcrypt_get_block_size (MCRYPT_TripleDES, MCRYPT_MODE_CBC), MCRYPT_DEV_RANDOM);

$iv64=base64_encode($iv);
echo "iv:".base64_encode($iv);
echo "<br/>\n";

$key=base64_decode("U42/zc3r6zC2Ok11BqO+lA==");
$iv=base64_decode("xTXaC2FQEGWOVBqPIipt1A==");
//$enc=mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_ENCRYPT, $iv);
//MCRYPT_RIJNDAEL_128
$enc=mcrypt_cbc (MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_ENCRYPT, $iv);
$ret=base64_encode($enc);

echo "encrypt:".$ret;
echo "<br/>\n";
$string=$ret;
$string = trim(base64_decode($string));
//$dec = mcrypt_cbc (MCRYPT_TripleDES, $key, $string, MCRYPT_DECRYPT, $iv);
$dec = mcrypt_cbc (MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_DECRYPT, $iv);

echo "decrypt:".$dec;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2010/05/php-aes-cbc-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1、声明不定长的方法 &#8211; 需要知道的9个PHP实用方法</title>
		<link>http://blog.fallseir.com/2010/05/php_9_funs_1_arguments/</link>
		<comments>http://blog.fallseir.com/2010/05/php_9_funs_1_arguments/#comments</comments>
		<pubDate>Wed, 05 May 2010 06:46:27 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[闲言片语]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=242</guid>
		<description><![CDATA[使用 func_get_args 获取当前方法的实际传入得参数个数]]></description>
			<content:encoded><![CDATA[<p>偶尔翻看 美味书签 发现这篇了这篇文章 就迫不急待的把她保留在自己的空间了<br />
虽然这篇文章中提到的方法只有个别的几个不知道，但这些东西确实很少被使用和初学者知道<br />
摘自: <a href="http://net.tutsplus.com/tutorials/php/9-useful-php-functions-and-features-you-need-to-know/">9 Useful PHP Functions and Features You Need to Know</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212; 英文不好，咱只过代码 ~ O(∩_∩)O ~ &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
1. 声明不定长参数个数的方法<br />
这个功能在函数库里经常会用到如printf中参数的个数就是不固定的<br />
样例<br />
<code language="PHP"><br />
// 声明空参数的方法， PHP是动态语言，所以在调用时可以不遵守约定输入任意参数~~<br />
// 如果在java里 需要这样声明 foo(Object ... args)<br />
function foo() {<br />
	// 得到所有的传递进来的实际参数值（实参）<br />
	$args = func_get_args();<br />
        // 将所得到的实参输出<br />
	foreach ($args as $k => $v) {<br />
		echo "arg".($k+1).": $v\n";<br />
	}<br />
}</p>
<p>foo();<br />
/* 什么都不打印 */</p>
<p>foo('hello');<br />
/* 打印<br />
arg1: hello<br />
*/</p>
<p>foo('hello', 'world', 'again');<br />
/* 打印<br />
arg1: hello<br />
arg2: world<br />
arg3: again<br />
*/<br />
</code><br />
这个功能很实用，书写起来也很直观<br />
类似的PHP为我们提供的<a href="http://cn.php.net/manual/en/ref.funchand.php">方法处理函数</a>还有：<br />
&#8211; 获取当前方法本次调用时的参数信息<br />
func_get_arg 获取当次方法调用的指定位置的参数<br />
func_get_args 获取当次方法调用的参数列表<br />
func_num_args 获取当次方法调用的参数个数<br />
&#8211; 扩展： 通过字面量调用已定义的方法 ， 允许通过变量传递方法名，将调用方和实现方解耦<br />
function_exists 验证方法是否存在<br />
call_user_func 通过方法名调用方法<br />
method_exists 验证成员方法是否存在<br />
forward_static_call 在成员方法中调用外部静态方法</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2010/05/php_9_funs_1_arguments/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HelloWorld Java 2: Arguments &amp; Signal</title>
		<link>http://blog.fallseir.com/2010/03/helloworld-java-1-arguments-signal/</link>
		<comments>http://blog.fallseir.com/2010/03/helloworld-java-1-arguments-signal/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 08:03:39 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[闲言片语]]></category>
		<category><![CDATA[helloworld]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=234</guid>
		<description><![CDATA[使用apache的commons.cli解析命令行参数 Java Code: package test.helloworld.cmd; // fallseir 2010-03-26 import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.GnuParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Option; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options;<a href="http://blog.fallseir.com/2010/03/helloworld-java-1-arguments-signal/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>使用apache的commons.cli解析命令行参数<br />
Java Code:</p>
<pre class="brush:java">
package test.helloworld.cmd;
// fallseir 2010-03-26
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class Cli {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GnuParser parser=new GnuParser();
		Options opts=getCmdOptions();
		CommandLine line=null;
		try {
			line=parser.parse(opts,args);
		} catch (ParseException e) {
			//e.printStackTrace();
			System.err.println(e.getMessage());
			HelpFormatter helper=new HelpFormatter();
			helper.printHelp("cmdLineSyntax", opts);
		}
		if(line==null) return ;
		if(line.hasOption("h")){
			HelpFormatter helper=new HelpFormatter();
			//helper.printHelp("cmdLineSyntax", opts);
			helper.printHelp(80, "tester", "header", opts, "footer");
			return;
		}
		boolean debug=false;
		if(line.hasOption("debug")){
			debug=true;
			System.out.println("debug is set");
		}
		if(line.hasOption("arg")){
			String arg=line.getOptionValue("arg");
			System.out.println("arg "+arg);
		}
	}

	private static Options getCmdOptions() {
		Options options=new Options();
		Option opt=OptionBuilder.create("debug");
		options.addOption(opt);
		opt=OptionBuilder.isRequired()
					.hasArg()
					.withArgName("arg")
					.withDescription("arg description")
					.withLongOpt("argument")
					.withValueSeparator()
					.create("arg");
		options.addOption(opt);
		options.addOption(new Option("h","help",false,"print help"));
		return options;
	}

}
</pre>
<p>Signal Shell下基于信号的应用通信<br />
使用 sun.misc.Signal ，但 sun 已经提示Signal将在其后版本剥离<br />
建议使用 socket 进行通信吧 </p>
<pre class="brush:java">
package test.helloworld.cmd;
// fallseir 2010-03-26
import sun.misc.Signal;
import sun.misc.SignalHandler;

public class SignalHandle {
	public static void main(String args[]){
		System.out.println("start");
		SignalHandle cmd=new SignalHandle();
		if(cmd.isLinux()){
			cmd.installSignalHandler("QUIT");
			cmd.installSignalHandler("HUP");
			cmd.installSignalHandler("USR1");
			cmd.installSignalHandler("USR2");
			cmd.installSignalHandler("PIPE");
		}
		cmd.installSignalHandler("TERM");
		cmd.installSignalHandler("ABRT");
		cmd.installSignalHandler("INT");
		try{
			Thread.sleep(1000*10*10);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
	private void handleSignal(String signal){
		System.out.println("handleSignal "+signal);
	}
	private boolean isLinux() {
		return System.getProperty("os.name").indexOf("Linux")>=0;
	}
	private void installSignalHandler(String signal){
		System.out.println("installCheckSignal "+signal);
		SimpleSignalHandler shandler=new SimpleSignalHandler();
		try{
			SignalHandler old = Signal.handle( new Signal( signal ), shandler);
			shandler.setOld(old);
		}catch(Exception e){
			System.err.println("installShutdownSignal "+signal+" "+e);
		}
	}
	class SimpleSignalHandler implements SignalHandler{
		SignalHandler old=null;
		public SimpleSignalHandler() {
		}
		public void handle( Signal sig ) {
			try{
				System.out.println("Handle Signal "+sig.getName() );
				handSignal(sig);
				if( old != null &#038;&#038; old != SIG_DFL &#038;&#038; old != SIG_IGN ) {  //chain back to previous handler if one exists
					old.handle( sig );
				}
			}
			catch( Throwable t ) {
				System.out.println(String.format("ShutdownSignalHandler.handle %s : %s",sig.getName(),t.getMessage())+t);
			}
		}
		protected void handSignal(Signal sig) {
			handleSignal(sig.getName());
		}
		public void setOld(SignalHandler old){
			this.old=old;
		}
	}
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2010/03/helloworld-java-1-arguments-signal/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HelloWorld Java 1: ShutdownHook &amp; start/stop Script</title>
		<link>http://blog.fallseir.com/2010/03/helloworld-java-1-shutdownhook-startstop-script/</link>
		<comments>http://blog.fallseir.com/2010/03/helloworld-java-1-shutdownhook-startstop-script/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 07:59:16 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[闲言片语]]></category>
		<category><![CDATA[helloworld]]></category>
		<category><![CDATA[X shell]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=232</guid>
		<description><![CDATA[Java 代码： package test.helloworld.cmd; // by fallseir 2010-03-26 public class ShutdownHook { public static void main(String args[]){ System.out.println("start"); ShutdownHook cmd=new<a href="http://blog.fallseir.com/2010/03/helloworld-java-1-shutdownhook-startstop-script/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Java 代码：</p>
<pre>
package test.helloworld.cmd;
// by fallseir 2010-03-26
public class ShutdownHook {
	public static void main(String args[]){
		System.out.println("start");
		ShutdownHook cmd=new ShutdownHook();
		cmd.installShutdownHook();
		try{
			Thread.sleep(1000*10*10);
		}catch(InterruptedException e){
			e.printStackTrace();
		}
	}
	private void shutdown(){
		System.out.println("shutdown");
	}
	private void installShutdownHook(){
		Runtime.getRuntime().addShutdownHook(new Thread(){
			public void run(){
				shutdown();
			}
		});
	}
}
</pre>
<p>sh 代码：</p>
<pre>
#!/bin/sh
# -----------------------------------------------------------------------------
# fallseir 2010-03-26
# Start/Stop Script for the test.helloworld.cmd.ShutdownHook system
# run.sh start|stop|check
#
base="."
lib="$base/lib"
log="$base/log"

app="run"
mainCls="test.helloworld.cmd.ShutdownHook"
pid="$app"".pid"

cp=""
#cp="$cp:$lib/log4j-1.2.13.jar"

cmd="java -cp $cp $mainCls $args"

ARG=$1
if [ "x$ARG" = "x" ] ; then
  ARG="start"
else
  shift
fi

if [ ! -d "$log" ] ; then
  mkdir "$log"
fi

if [ "$ARG" = "start" ] ; then
  AppErr="$log/$app.err"
  AppOut="$log/$app.out"
  # 备份历史日志
  if [ -f "$AppErr" ] ; then
    mv "$AppErr" "$AppErr".`date +%Y%m%d`"."$$
  fi
  if [ -f "$AppOut" ] ; then
    mv "$AppOut" "$AppOut".`date +%Y%m%d`"."$$
  fi
  # 在后台启动应用
  echo "$cmd $@ > $AppOut 2> $AppErr"
  $cmd "$@" > "$AppOut" 2> "$AppOut" &#038;
  # 记录进程ID
  if [ ! -z "$pid" ] ; then
    echo $! > $pid
  fi
# 使用USR2 进行简单通信
#elif [ "$ARG" = "check" ] ; then
#  if [ ! -z "$pid" ]; then
#    echo "check: `cat $pid`"
#    kill -USR2 `cat $pid`
#  else
#    echo "Kill failed: \$pid not set"
#  fi
elif [ "$ARG" = "stop" ] ; then
  # kill 应用进程
  if [ ! -z "$pid" ]; then
    echo "Killing: `cat $pid`"
    kill -15 `cat $pid`
    rm $pid
  else
    echo "Kill failed: \$pid not set"
  fi
fi
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2010/03/helloworld-java-1-shutdownhook-startstop-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>谨慎的在c++中使用cin进行交互</title>
		<link>http://blog.fallseir.com/2008/10/note_std_cin/</link>
		<comments>http://blog.fallseir.com/2008/10/note_std_cin/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 09:34:28 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[随笔]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cin]]></category>
		<category><![CDATA[fallseir]]></category>
		<category><![CDATA[learn]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=107</guid>
		<description><![CDATA[在使用c++ 进行控制台交互时 也许你也容易忽略掉的细节 &#8211; 飞扬轻狂 20081024 fallseir[at]gmail.com http://blog.fallseir.com/2008/10/note_std_cinnote_std_cin/ 注意1： &#8221; cin >> value &#8221; 没有正确的读取换行 注意2： 不匹配的类型 将导致输入流错误 而在其后的调用中自动返回 注意3：<a href="http://blog.fallseir.com/2008/10/note_std_cin/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>在使用c++ 进行控制台交互时 也许你也容易忽略掉的细节</p>
<p>&#8211; 飞扬轻狂 20081024 fallseir[at]gmail.com</p>
<p>http://blog.fallseir.com/2008/10/note_std_cinnote_std_cin/</p>
<p>注意1： &#8221; cin >> value &#8221; 没有正确的读取换行<br />
注意2： 不匹配的类型 将导致输入流错误 而在其后的调用中自动返回<br />
注意3： 空字符 在使用 >> 赋值给变量时将自动过滤 直到读入非空字符为止</p>
<p>出错的代码 ！！</p>
<pre>
$ vim 02-05-BasicIO-err.cpp
---------------------------------------------
#include <iostream>
using namespace std;
int main( int argc, char *argv[] ){
  int num;
  string str,line;

  cout << "Please enter a number:" ;
  cin >> num;
  cout << "Please enter a text :" ;
  cin >> str;
  cout << "Please enter some words :" ;
  getline( cin, line );

  cout << endl;
  cout << "number : " << num << endl;
  cout << "text : " << str << endl;
  cout << "some words : " << line << endl;

  return 0;
}
---------------------------------------------
$ g++ 02-05-BasicIO-err.cpp
$ a.out # 貌似正确的输入
----------------
Please enter a number:12<enter>
Please enter a text :message<enter>
Please enter some words :
number : 12
text : message
some words :
----------------
/*
 分析原因：
 第二次输入 "message" 的时候 自动过滤前次的<enter> 并得到了正确的值
 getline 的时候 因为输入流中还有一个 <enter> 没有被读取 所以没有等待用户输入，直接返回了
 */
--------------------
$ a.out # 貌似正确的结果
----------------
Please enter a number:13 message some words in the line <enter>
Please enter a text <img src='http://blog.fallseir.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> lease enter some words :
number : 13
text : message
some words :  some words in the line
----------------
/*
 分析原因：
 cin >> str 的时候 从流中读取了 "message"
 getline 的时候 读取了流中剩下的内容
 */
--------------------
$ a.out # 错误的开始
----------------
Please enter a number:a
Please enter a text <img src='http://blog.fallseir.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> lease enter some words :
number : 6696948
text :
some words :
----------------
/*
 分析原因：
 cin >> num 的时候 从流中读取了不匹配的数据 "a" ，cin 进入异常状态
 cin >> str 和 getline 的时候 因为流异常 所以没有进行读取
 */
--------------------
</pre>
<p>优化的严谨的代码</p>
<pre>
$ vim 02-05-BasicIO.cpp
---------------------------------------------
#include <iostream>
using namespace std;
int main( int argc, char *argv[] ){
  int num;
  string str,line;
  string tmp;

  cout << "Please enter a number:" ;
  cin >> num;
  while(cin.fail()){ // 如果出现错误
    cin.clear(); // 清除错误
    getline(cin,tmp); // 清除缓存
    cerr << "Error input!!,Please try again" << endl;
    cin >> num;
  }
  getline(cin,tmp); // 使用getline清除缓存，因为 >> 操作符不会对末尾的 <enter> 进行读取 

  cout << "Please enter a text :" ;
  cin >> str;
  getline(cin,tmp);

  cout << "Please enter some words :" ;
  getline( cin, line );
  cout << endl;
  cout << "number : " << num << endl;
  cout << "text : " << str << endl;
  cout << "some words : " << line << endl;

  return 0;
}

---------------------------------------------
----------------
$ a.out
----------------
Please enter a number:123 message test words!
Please enter a text :word and message
Please enter some words :some words in the line!

number : 123
text : word
some words : some words in the line!
----------------
</pre>
<p>-- </p>
<p>http://blog.fallseir.com/2008/10/note_std_cinnote_std_cin/</p>
<p>飞扬轻狂<br />
fallseir[at]gmail.com<br />
blog.fallseir.com<br />
2008年10月24日<br />
转载请注明</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2008/10/note_std_cin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过.htaccess 配置cgi环境</title>
		<link>http://blog.fallseir.com/2008/06/cgihtaccess/</link>
		<comments>http://blog.fallseir.com/2008/06/cgihtaccess/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 10:18:19 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[随笔]]></category>
		<category><![CDATA[cgi]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=93</guid>
		<description><![CDATA[1、配置 .htaccess &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; AddHandler cgi-script .cgi .pl #添加handler Options +ExecCGI # 允许目录执行cgi &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; 2、更改目录权限为apche apache可以执行目录下的文件 3、测试 test.cgi &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; #!/usr/bin/perl print<a href="http://blog.fallseir.com/2008/06/cgihtaccess/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>1、配置 .htaccess<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
AddHandler cgi-script .cgi .pl #添加handler<br />
Options +ExecCGI # 允许目录执行cgi<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
2、更改目录权限为apche apache可以执行目录下的文件<br />
3、测试 test.cgi<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
#!/usr/bin/perl<br />
print &#8220;Content-type: text/html\n\n&#8221;;<br />
print &#8220;Hello, World.&#8221;;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2008/06/cgihtaccess/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>升级到了wp2.5</title>
		<link>http://blog.fallseir.com/2008/04/update_wp2/</link>
		<comments>http://blog.fallseir.com/2008/04/update_wp2/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 08:36:16 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[随笔]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[测试TAG]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=86</guid>
		<description><![CDATA[升级到了wp2.5 原来升级很简单 呵呵 1、覆盖原始文件 2、运行 http://example.com/wordpress/wp-admin/upgrade.php 一切ok！ 当然如果你要升级 最好先备份数据库和原始文件 主要应该是后台更新了 界面更清爽了 其他的因为我不常用 所以没有留意什么是新的 哈 增加了TAG underone 的 G7 v5 不错<a href="http://blog.fallseir.com/2008/04/update_wp2/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>升级到了wp2.5<br />
原来升级很简单 呵呵<br />
1、覆盖原始文件<br />
2、运行 http://example.com/wordpress/wp-admin/upgrade.php<br />
一切ok！<br />
当然如果你要升级 最好先备份数据库和原始文件</p>
<p>主要应该是后台更新了 界面更清爽了  其他的因为我不常用 所以没有留意什么是新的 哈<br />
增加了TAG</p>
<p>underone 的 <a href="http://www.underone.com/2008/04/02/theme-g7v5-final/">G7 v5</a> 不错 赞！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2008/04/update_wp2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>code:在php中捕获错误和异常</title>
		<link>http://blog.fallseir.com/2007/08/code%e5%9c%a8php%e4%b8%ad%e6%8d%95%e8%8e%b7%e9%94%99%e8%af%af%e5%92%8c%e5%bc%82%e5%b8%b8/</link>
		<comments>http://blog.fallseir.com/2007/08/code%e5%9c%a8php%e4%b8%ad%e6%8d%95%e8%8e%b7%e9%94%99%e8%af%af%e5%92%8c%e5%bc%82%e5%b8%b8/#comments</comments>
		<pubDate>Tue, 14 Aug 2007 11:48:12 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/2007/08/code%e5%9c%a8php%e4%b8%ad%e6%8d%95%e8%8e%b7%e9%94%99%e8%af%af%e5%92%8c%e5%bc%82%e5%b8%b8/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><?php<br />
class Error_handler{<br />
    function Error_handler(){<br />
        $this->_init();<br />
    }<br />
    function _init(){<br />
        /**<br />
         * Sets error handler to be Prado::phpErrorHandler<br />
         */<br />
        set_error_handler(array($this,&#8217;handler_error&#8217;),error_reporting());<br />
        /**<br />
         * Sets exception handler to be Prado::exceptionHandler<br />
         */<br />
        set_exception_handler(array($this,&#8217;handler_exception&#8217;));<br />
    }<br />
    function handler_error($errno,$errstr,$errfile,$errline){<br />
        printf(&#8220;%s,%s,%s,%s\n&#8221;,$errno,$errstr,$errfile,$errline);<br />
    }<br />
    function handler_exception($exception){<br />
        print_r($exception);<br />
    }<br />
}<br />
$h=new Error_handler();<br />
$a=3/0;<br />
throw new Exception();<br />
?></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2007/08/code%e5%9c%a8php%e4%b8%ad%e6%8d%95%e8%8e%b7%e9%94%99%e8%af%af%e5%92%8c%e5%bc%82%e5%b8%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>test:测试feedsky的wp插件</title>
		<link>http://blog.fallseir.com/2007/07/test%e6%b5%8b%e8%af%95feedsky%e7%9a%84wp%e6%8f%92%e4%bb%b6/</link>
		<comments>http://blog.fallseir.com/2007/07/test%e6%b5%8b%e8%af%95feedsky%e7%9a%84wp%e6%8f%92%e4%bb%b6/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 06:07:49 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/2007/07/test%e6%b5%8b%e8%af%95feedsky%e7%9a%84wp%e6%8f%92%e4%bb%b6/</guid>
		<description><![CDATA[测试feedsky的wp插件 &#8212;&#8212;&#8212;&#8212;&#8212; 去除一直使用的ping url http://www.feedsky.com/api/RPC2 使用feedsky的wp插件进行 更新和rss转向测试 插件下载地址：Feedsky Feed 插件 1.1 摘录波波以前的文章 Feedsky Feed 插件介绍 Feedsky是一家Feed管理服务商，提供给Blogger（博客）、网站（Website）和商业出版者等内容出版者在线的服务平台，帮助他们加强Feed的优化和传播管理。 Feedsky会处理用户的Feed格式，使用户的Feed能够自动适应各种RSS格式以及各种阅读器，同时还会帮助用户建立一个面向读者的订阅引导页面，并且统计每天、每周和每月的读者数量和使用的阅读器种类及文章点击数。 该插件是Feedsky为Wordpress用户专门提供的功能性辅助插件，用以快速直接的使用Feedsky的相关服务。插件需要你提供你在Feedsky上的Feed名称，请先进行 Feedsky Feed<a href="http://blog.fallseir.com/2007/07/test%e6%b5%8b%e8%af%95feedsky%e7%9a%84wp%e6%8f%92%e4%bb%b6/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>测试feedsky的wp插件<br />
&#8212;&#8212;&#8212;&#8212;&#8212;<br />
去除一直使用的ping url</p>
<p>http://www.feedsky.com/api/RPC2</p>
<p>使用feedsky的wp插件进行 更新和rss转向测试<br />
插件下载地址：<a href="http://blogs.feedsky.com/feedsky-ping.1.1.zip">Feedsky Feed 插件 1.1</a></p>
<p>摘录<a href="http://yangbo.name/">波波</a>以前的文章</p>
<blockquote><p>
<a href="http://my.donews.com/blogbug/2006/09/12/bIGheNUuTlPrPLHjFPQEvISSSGAuoZwwYuWO/">Feedsky Feed 插件介绍</a></p>
<p>Feedsky是一家Feed管理服务商，提供给Blogger（博客）、网站（Website）和商业出版者等内容出版者在线的服务平台，帮助他们加强Feed的优化和传播管理。 Feedsky会处理用户的Feed格式，使用户的Feed能够自动适应各种RSS格式以及各种阅读器，同时还会帮助用户建立一个面向读者的订阅引导页面，并且统计每天、每周和每月的读者数量和使用的阅读器种类及文章点击数。</p>
<p>该插件是Feedsky为Wordpress用户专门提供的功能性辅助插件，用以快速直接的使用Feedsky的相关服务。插件需要你提供你在Feedsky上的Feed名称，请先进行 Feedsky Feed 绑定。目前该插件包括两个功能：</p>
<p>    * Ping 服务 （默认启用）<br />
    * Feed 转向 （默认启用）</p>
<p>Feedsky Ping 功能</p>
<p>Ping Feedsky 是Feedsky针对Feed内容更新提供的一个强大功能。启用这个插件后，当您更新了Blog，便会自动向Feedsky发送通知，Feedsky的爬虫会立即对内容进行抓取，以保证您的Feed得到最快速度的更新。</p>
<p>Feedsky Feed 转向功能</p>
<p>Feedsky Feed转向功能，可以将对您Blog中所有RSS Feed的请求和流量，完全转至您在Feedsky生成的Feed地址，您无需通知已有的大量订阅用户进行任何更改，便可以享受到更专业的Feed统计和管理服务了。 </p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2007/07/test%e6%b5%8b%e8%af%95feedsky%e7%9a%84wp%e6%8f%92%e4%bb%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
