<?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>[ xiaog&#039;s blog ]</title>
	<atom:link href="http://www.xiebiao.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.xiebiao.com/blog</link>
	<description>关注web开发，系统运维，开源软件.</description>
	<lastBuildDate>Tue, 08 May 2012 00:57:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>如何学习Linux命令-初级篇</title>
		<link>http://www.xiebiao.com/blog/?p=842</link>
		<comments>http://www.xiebiao.com/blog/?p=842#comments</comments>
		<pubDate>Mon, 07 May 2012 15:05:22 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=842</guid>
		<description><![CDATA[首先声明，本人也是菜鸟，整理这篇博客只是为了记录自己学习Linux命令的一些心得，各路高手拍砖请手软。 也许作为一个刚入门的Linux新手，在众多的Linux发行版本面前，难免会眼花，有大把... ]]></description>
			<content:encoded><![CDATA[<p>首先声明，本人也是菜鸟，整理这篇博客只是为了记录自己学习Linux命令的一些心得，各路高手拍砖请手软。<br />
也许作为一个刚入门的Linux新手，在众多的Linux发行版本面前，难免会眼花，有大把时间倒腾的同学，肯定不止在两个版本中游走过，不过大部分人首先体验到的还是桌面环境，毕竟我们中很多人还是从windows接触到计算机的，想要进步同学肯定抵不Linux命令的诱惑，于是在网上搜索各种命令，或者在使用中遇到问题后，放狗一搜就能找到解决方案。<br />
当你已经把玩Linux一段日子后，会发现貌似你已经使用过很多命令了，但是让你回忆，你又说不上几个来（特别是面试的时候），这时候你应该吃一点<a href="http://linux.vbird.org/">鸟哥私房菜</a>了。<br />
当你对Linux的发展历史有一定了解的时候，你应该明白在Linux其实最基本的就是：Kernel + GNU工具，由于不同的Linux发行版本由不同的团队开发，一些是商业公司，比如红帽子，一些纯粹由社区维护(例如:Debian)，他们在自己的发行版本中添加了一些独特工具，导致了不同的Linux发行上有着一些不同的命令，但是GNU提供的工具是最通用的，如果你懂C语言，那么就更好了，下载GNU下面的<a href="git://git.sv.gnu.org/coreutils">coreutils</a>,这里一共有100多个命令，这些命令基本上是所有Linux发行版本上都具有的，同时还带有源码，这绝对是一个提高自己的机会。<br />
作为一个普通的Linux使用人员（我是指你不是开发linux内核或者Linux底层应用的开发人员），那么把这100多个命令使用得炉火纯青，那么Linux能给你带来很大的帮助，当然100多个命令，难免还是有点让人头晕，于是网上有人对这些命令做了一个分类，这是很好的一种方式，比如把命令分为：文件管理，文件传输，磁盘管理，用户权限管理，等等，我建议当你使用一段时间Linux后，对这些众多的命令按照这样的分类，列出一个属于自己的列表，学会一个新命令就加到自己的列表上。<br />
不过命令让很多人却步主要还是各种参数的使用，我相信很多一入门的同学，肯定都知道搞不明白的就找男人（man），但是用man查看后，更茫然了，各种参数描述，根据个人经验，其实很多linux命令还是有很多规律可寻，比如 &#8211;h,-h,&#8211;help,这就是查看命令使用说明的参数，基本上每个命令都有这样的参数（所以如果有一天你编写的工具也应该有帮助）。</p>
<p>其实所谓Linux命令很难的说法，根源还是所学知识没有投产，你如果仅仅是玩玩linux命令，那么几个月后，你肯定会忘记一大半，你要思考那些牛人为什么开发这个工具，这肯定是有需求的，我觉得普通开发人员（像我这样的人）使用Linux就是因为在现实生活中会用到很多Linux的小工具，比如Linux下面的文本处理 awk，sed，等等，假设有一个需求：为一个文本日志文件加上行号（假设你是java程序员），你是不是打开eclipse（或许你是editplus）开始coding，no，其实你只需要awk完成这个任务，所谓牛人就是能熟练地运用所学知识，而不仅仅是一味的学习。</p>
<p>总之你不要惧怕，当然也千万不要认为会使用100多个Linux命令就能行走江湖了，你应该好高鹜远，看看 <a href="http://www.commandlinefu.com/commands/browse">http://www.commandlinefu.com/commands/browse</a> ，这样的网站。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=842</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 11.10外接显示器遇到的问题</title>
		<link>http://www.xiebiao.com/blog/?p=806</link>
		<comments>http://www.xiebiao.com/blog/?p=806#comments</comments>
		<pubDate>Fri, 30 Dec 2011 07:29:17 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=806</guid>
		<description><![CDATA[因为自己用的T61笔记本，总感觉显示太小，于是在公司就使用外接显示器，一方面双屏可以提高效率，而且大显示器看着也舒服，但回到家中就不能用外接现实器了，有时候在公司也会连接投... ]]></description>
			<content:encoded><![CDATA[<p>因为自己用的T61笔记本，总感觉显示太小，于是在公司就使用外接显示器，一方面双屏可以提高效率，而且大显示器看着也舒服，但回到家中就不能用外接现实器了，有时候在公司也会连接投影仪，前不久发现一个问题，接上外部显示器开机，出现以下提示:<br />
<a href="http://www.xiebiao.com/blog/wp-content/uploads/2011/12/Screenshot-at-2011-12-30-093914.png"><img src="http://www.xiebiao.com/blog/wp-content/uploads/2011/12/Screenshot-at-2011-12-30-093914-300x123.png" alt="" title="Screenshot at 2011-12-30 09:39:14" width="300" height="123" class="aligncenter size-medium wp-image-807" /></a><br />
后来回想起来，在台式机的Ubuntu 11.04的时候也出现过这样的情况。<br />
google一翻，大概明白了原因.<br />
Ubuntu在开机进入桌面的时候，会调用gnome-setting-deamon 这个程序，这个程序调用当前用户的一些设置，比如字体，显示器，开机运行的程序，等等。<br />
Could not apply the stored configuration for monitors<br />
上面这个弹出窗口的意思是，不能应用当前monitor的设置，也就是显示器的设置有错误。<br />
个人分析，因为我在公司使用的是双屏幕现实，在显卡自己做了设置，在关机的时候，gnome-setting-deamon 会保存上一次的设置，生成一个monitors.xml的文件。在用户目录下$user.home/.config/monitors.xml，要解决上面的问题，最简单的办法就是删除这个monitors.xml文件,重启一下电脑.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=806</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个常见的算法题目</title>
		<link>http://www.xiebiao.com/blog/?p=739</link>
		<comments>http://www.xiebiao.com/blog/?p=739#comments</comments>
		<pubDate>Wed, 30 Nov 2011 16:40:34 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Program]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=739</guid>
		<description><![CDATA[/** * 假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配， * 比如：abcda和adabc,由于出现的字符个数都是相同， * 只是顺序不同，所以这两个字符串是匹配的, * 要求高效. */ ... ]]></description>
			<content:encoded><![CDATA[<pre>/**
* 假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配，
* 比如：abcda和adabc,由于出现的字符个数都是相同，
* 只是顺序不同，所以这两个字符串是匹配的,
* 要求高效.
*/
public class CompareString{
    public static void main(String args[]){
       System.out.println(compare(args[0],args[1]));
    }
    public static char[] copyNew(char[] src,int exclude){
        char[] n = new char[src.length-1];
        int i=0,j=0;
        for(; i&lt;src.length ;i++){
            if(i != exclude){
                n[j] = src[i];
                j++;
            }
        }
        return n;
    }

    public static boolean compare(String str1,String str2){
        char [] char1 = str1.toCharArray();
        char [] char2 = str2.toCharArray();
        if(char1.length != char2.length ){
            return false;
        }
        char[] _char = new char[char1.length];
        char[] tmp = char2;
        for(int i=0;i&lt; char1.length;i++){
            int j=0;
            for(;j&lt; tmp.length;j++){
                if(char1[i] == tmp[j]){
                   tmp = copyNew(tmp,j);
                   //处理下一个
                   break;
                }
                if(j == tmp.length-1){
                  //在第二个数组没找到相同的
                   return false;
                }
            }
        }
        return true;
    }
}</pre>
<pre>//=================</pre>
<pre>这道题有一个陷阱,上面这个解法显然不是高效的，我从编程之美中学到一个思路，
就是通过比较字符串对应的ASCII码的和，来判断</pre>
<pre></pre>
<pre class="brush: java; ruler: true; first-line: 1; ">public class CompareString{
    public static void main(String args[]){
       System.out.println(compare(args[0],args[1]));
    }
    public static boolean compare(String str1,String str2){
        char [] char1 = str1.toCharArray();
        char [] char2 = str2.toCharArray();
        if(char1.length != char2.length ){
            return false;
        }
        int sum1=0,sum2=0;
        for(char c:char1){
            sum1 = sum1+(int)c;
        }
        for(char c:char2){
            sum2 = sum2+(int)c;
        }
        if(sum1 == sum2){
            return true;
        }
        return false;
    }
}</pre>
<pre>&lt;/pre&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=739</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>算法小练</title>
		<link>http://www.xiebiao.com/blog/?p=734</link>
		<comments>http://www.xiebiao.com/blog/?p=734#comments</comments>
		<pubDate>Mon, 28 Nov 2011 17:26:46 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Program]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=734</guid>
		<description><![CDATA[1.统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数 import java.io.*; import java.util.*; import java.lang.*; /** * 统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及... ]]></description>
			<content:encoded><![CDATA[<p>1.统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数</p>
<pre class="brush: java; ruler: true; first-line: 1; ">
import java.io.*;
import java.util.*;
import java.lang.*;
/**
*   统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数
*/
public class TextStatisticsMain{
    public static void main(String args[]){
        TextStatisticsMain tm = new TextStatisticsMain(args[0]);
        tm.print();
    }
    private List<TextStatistics> textStatistics = new ArrayList<TextStatistics>();
    private String rootPath;
    public TextStatisticsMain(String file){
        this.rootPath = file;
    }

    public void print(){
         statistics(new File(this.rootPath));
          System.out.println("==== Statistics ====");
          System.out.println("                     ");
        for(TextStatistics t:textStatistics){
            System.out.println("File: "+t.getFileName());
            System.out.println("letCount: "+ t.getLetCount());
            System.out.println("numCount: "+ t.getNumCount());
            System.out.println("spaceCount: "+t.getSpaceCount());
            System.out.println("lines: "+t.getLines() );
            System.out.println("----------------------------");
        }
    }
    private  void statistics(File file){
        if(file.isDirectory()){
        //是目录
            for(File f:file.listFiles()){
                statistics(f);
            }
        }else{
        //是文件
          try{
            FileReader fread = new FileReader(file);
            BufferedReader lnf = new BufferedReader(fread);
            String b;
            String fileName = file.getPath();
            int letCount=0, numCount=0,spaceCount=0, lines=0;
            while ((b = lnf.readLine()) != null) {
                lines++;
                for(char c:b.toCharArray()){
                  //对比ASCII码
                  if((int)c>=48 &#038;&#038; (int)c<=57){
                  //是数字
                   numCount++;
                  }else if((int)c==32){
                  //空格
                    spaceCount++;
                  }else if((int)c>=65 &#038;&#038; (int)c<=90){
                  //大写字母
                    letCount++;
                  }else if((int)c>=97 &#038;&#038; (int)c<=122){
                  //小写字母
                    letCount++;
                  }
                }
            }
                textStatistics.add(new TextStatistics(fileName,letCount,numCount,spaceCount,lines));
            }catch(Exception e){
                System.out.println(e);
            }

        }
    }
}
</pre>
<pre class="brush: java; ruler: true; first-line: 1; ">
public class TextStatistics{
    private String fileName;
    private int letCount;
    private int numCount;
    private int spaceCount;
    private int lines;
    public TextStatistics(String fileName,int letCount,int numCount,int spaceCount,int lines ){
        this.fileName=fileName;
        this.letCount=letCount;
        this.numCount=numCount;
        this.spaceCount=spaceCount;
        this.lines=lines;
    }
    public String getFileName(){
        return this.fileName;
    }
    public int getLetCount(){
        return this.letCount;
    }
    public int getNumCount(){
        return this.numCount;
    }
    public int getSpaceCount(){
        return this.spaceCount;
    }
    public int getLines(){
        return this.lines;
    }

}
</pre>
<p>2.现在一个表，有姓名、性别、年龄，字段分别为varchar(20),varchar(20),int，<br />
现有表中已经有上百万条记录了，在姓名上建索引，现在有一个文本文件，已经格式化为姓名、性别、年龄，写一个函数，<br />
怎么样一次性的将该文件中的数据以最快的速度导入到数据库中。<br />
如有函数，实现该函数：<br />
save(Connection c,File f)<br />
{<br />
    //直接导入文件就行了,大概思路就是这样<br />
    Statement s = c.createStatement();<br />
    s.execute("LOAD DATA INFILE '"+f.getPath()+"' INTO TABLE tablename fields terminated by ',' lines terminated by '\n'");<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=734</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[收藏] LINUX下的21个特殊符号</title>
		<link>http://www.xiebiao.com/blog/?p=709</link>
		<comments>http://www.xiebiao.com/blog/?p=709#comments</comments>
		<pubDate>Mon, 07 Nov 2011 14:43:05 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=709</guid>
		<description><![CDATA[1． > 重定向输出符号。 2． >> 重定向输出符号，但有追加的功能。 3． 2> 错误重定向输出符号，覆盖原文件内容。 4． 2>> 错误重定向输出符号，有文件内容追加的功能。 5． * 匹配任意字符。 ... ]]></description>
			<content:encoded><![CDATA[<p>1．  <strong>></strong>  重定向输出符号。<br />
2．  <strong>>></strong> 重定向输出符号，但有追加的功能。<br />
3．  <strong>2></strong> 错误重定向输出符号，覆盖原文件内容。<br />
4． <strong> 2>></strong> 错误重定向输出符号，有文件内容追加的功能。<br />
5．  <strong>*</strong> 匹配任意字符。<br />
6．  <strong>？</strong> 匹配任意一个字符。<br />
7．  <strong>|</strong> 管道符号。<br />
8．  <strong>&#038;</strong> 后台进程符。<br />
9．  <strong>&#038;&#038;l</strong> 逻辑与符号。用法：命令1 &#038;&#038; 命令2  表示如果命令1执行成功，继续执行命令2。<br />
10． <strong>||</strong> 逻辑或符号。用法：命令1 | | 命令2 表示如果命令1执行成功，不执行命令2；但如果命令1执行失败才执行命令2。<br />
11．逻辑非符号。排除指定范围。<br />
12． <strong>[x-y]</strong> 表示一定的范围。<br />
13． <strong>#</strong> 注释符。<br />
14． <strong>” ”</strong> 双引号表示把它所包含的内容作为普通字符，但` ` $  \ ‘ ‘ 几个符号除外。<br />
15． <strong>’ ’</strong> 单引号表示把它所包含的内容作为普通的字符，无特殊例外。<br />
16． <strong>$</strong> 变量符。<br />
17． <strong>\</strong> 转义字符。<br />
18． <strong>’ ’</strong> 倒引号，表示它所包含的内容。<br />
19． <strong>；</strong> 命令分隔符。<br />
20． <strong><</strong> 重定向输入符。<br />
21． <strong>（）</strong> 表示整体执行命令。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=709</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>菜鸟学习awk</title>
		<link>http://www.xiebiao.com/blog/?p=692</link>
		<comments>http://www.xiebiao.com/blog/?p=692#comments</comments>
		<pubDate>Mon, 07 Nov 2011 14:20:59 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=692</guid>
		<description><![CDATA[Linux下面，如果要处理格式化的文本数据，awk算是利器了，一般bash + awk 能写出神一般的处理程序，如果对awk还没有一点认识的，那么先 man awk 详细看完这个简单的教程。 简单的说，awk是一个简... ]]></description>
			<content:encoded><![CDATA[<p>Linux下面，如果要处理格式化的文本数据，awk算是利器了，一般bash + awk 能写出神一般的处理程序，如果对awk还没有一点认识的，那么先</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
man awk
</pre>
<p>详细看完这个简单的教程。<br />
简单的说，awk是一个简单的动态解释性脚本语言，数值比较，控制流，循环，数组，这些语法基本上和C语言一样，所以我只需要了解awk独特的地方就行了。<br />
awk是按行和列来处理输入，简单地说awk是按照table的样式处理数据，就像我们excel数据一样。<br />
有如下的测试数据：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
It hurts to love someone and not
But what is more painful is to love someone
and never find the courage to let that
</pre>
<p>awk解析数据为表格格式：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
|It  |hurts |to   |love |someone |and |not
|But |what  |is   |more |painful |is  |to  |love |someone
|and |never |find |the  |courage |to  |let |that
</pre>
<p>同时保存测试数据为 test.txt<br />
我们来点实例：<br />
假如只输出第二列数据，可以在控制台中：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
cat test.txt|awk '{print $1}'
</pre>
<p>或者</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
awk '{print $1}' < test.txt
</pre>
<p>输出:</p>
<pre class="brush: shell; ">
hurts
what
never
</pre>
<p>这里只是展示了awk在命令行下的运用，在命令行下<br />
执行 awk 'expression' ,其中 expression 就是awk的语句，上面的例子只是简单的输出，awk还可以在开始读入数据的前后，做一些处理，例如：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
cat test.txt|awk 'BEGIN {print "--START--"} {print $0} END { print "--END--"}'
</pre>
<p>输出：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
--START--
It hurts to love someone and not
But what is more painful is to love someone
and never find the courage to let that
--END--
</pre>
<p>这里的 BEGIN 和 END 是awk的特殊语法<br />
大家看到这里可能就应该知道awk脚本几个特殊的地方，比如上文种出现的 $0 ,$2,还有print，这些代表什么含义，上文我们说了awk的按行和列处理数据的，所以这里的 $ 是变量前缀，$0 代表整行，$1,代表第一个字段，也就是按照分割符的第一列数据，$2,$3...类推，这些都是awk内嵌变量。</p>
<hr/>
参考：<br />
<a href="http://www.grymoire.com/Unix/Awk.html">http://www.grymoire.com/Unix/Awk.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=692</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux下查看文本相关的命令</title>
		<link>http://www.xiebiao.com/blog/?p=653</link>
		<comments>http://www.xiebiao.com/blog/?p=653#comments</comments>
		<pubDate>Wed, 05 Oct 2011 01:45:46 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=653</guid>
		<description><![CDATA[当你经常游离在linux系统之上时，你更多的是对日志类的文本文件操作，所以掌握一些linux下关于文本的操作还是很有必要。 首先你可能想找到某个文件，这时候需要用到find命令： find . -name tes... ]]></description>
			<content:encoded><![CDATA[<p>当你经常游离在linux系统之上时，你更多的是对日志类的文本文件操作，所以掌握一些linux下关于文本的操作还是很有必要。<br />
首先你可能想找到某个文件，这时候需要用到find命令：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
find . -name test.log
</pre>
<p>该命令是用于查找当前目录下名字为test.log的文件，当然你可以用正则来查找一类文件，</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
find . -name test＊.log
</pre>
<p>查找当前目录下名字为test开头，.log结尾的文件，比如test0.log,test1.log &#8230;<br />
find还有很多有用的参数可选<br />
当你找到一个文本文件后，你当然想看一下它了，如果文件不是很大，不到1M，你可以直接vi打开（vi的使用网上有很多的教程了），<br />
但是如果文件太大，而且你也不想看文件的全部内容，那确实太多了，这时候你就需要用到head命令了</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
head -n 5 test.log
</pre>
<p>只看test.log文件的前5行<br />
当然了Linux是一门艺术，如果你想看文件名以test开头的所有文件的第一行，可以这样：</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
head -1 test*
</pre>
<p>好吧，其实我很少用head这个命令，因为日志文件的写入都是在文件的最后，所以我更想看文件的最后几行</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
tail -n 1 test*
</pre>
<p>tail命令还有一个重要的功能，比如你想实时观察web服务器的访问日志，那么</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
tail -f -n 10 test.log
</pre>
<p>该命令会动态返回文件最后10行的变化.<br />
我比较奇怪，我就是喜欢看浏览你们所有的东西，那么</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
cat test.log
</pre>
<p>cat命令是将文件的内容全部输出到标准输出上的（zcat 命令可以查看压缩包里面的所有文本文件），如果文件很多超过你的显示器，其实你只能看到一屏的显示，这时候，就得使用组合命令了，<br />
很多时候，你其实在看日志文件的时候，往往会过滤掉无用的信息的（日志文件不是武侠小说），所以你会借助 grep这个命令来看你想看的内容，</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
cat test.log | grep "test"
</pre>
<p>该命令过过滤出文件中所有含有test的行，其中&#8221; | &#8221; 是linux下的强大的管道命令，也是很有想象力的命令，借助它你可以写出外星人都无法理解却又神奇的命令组合。<br />
我无聊，我就是喜欢拿日志文件当小说看，</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
cat test.log | more
</pre>
<p>more这个命令用于分页查看文件，可以单独使用，</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
 more test.log
</pre>
<p>如果每页只显示文件的一行，可以这样</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
 more -1 test.log
</pre>
<p>more也可以一次打开多个文件，当然个人觉得没什么用处，<br />
与more相对的就是less命令，less是从文件的最后分页的。</p>
<p>上面总结的这几个简单的命令很多linuxer都应该很熟悉，这些命令主要还是用于肉眼查看分析。</p>
<hr/>
高级进阶参考 ：<br />
<a href="http://linuxcommand.org/learning_the_shell.php">http://linuxcommand.org/learning_the_shell.php</a><br />
<a href="http://www.commandlinefu.com/commands/browse">http://www.commandlinefu.com/commands/browse</a><br />
<a href="http://www.grymoire.com/Unix/">http://www.grymoire.com/Unix/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=653</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restlet框架解读-2</title>
		<link>http://www.xiebiao.com/blog/?p=580</link>
		<comments>http://www.xiebiao.com/blog/?p=580#comments</comments>
		<pubDate>Sun, 17 Jul 2011 13:41:52 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[restlet]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=580</guid>
		<description><![CDATA[1）代码结构 Restlet目前有三个分子版本，1.1.X，2.0.X，2.1.X，2.1.X是开发主干，有很多新的特性在添加和修改，本文主要解读2.0.X这个版本，同时会涉及到1.1.X的部分内容。 下载完restlet代码后，可... ]]></description>
			<content:encoded><![CDATA[<p>1）代码结构<br />
Restlet目前有三个分子版本，1.1.X，2.0.X，2.1.X，2.1.X是开发主干，有很多新的特性在添加和修改，本文主要解读2.0.X这个版本，同时会涉及到1.1.X的部分内容。<br />
下载完restlet代码后，可以看到如下的目录结构</p>
<blockquote><p>
/+ org.restlet.* （restlet API）<br />
 + org.restlet.engine.* (restlet的一个默认实现)<br />
 + org.restlet.example.*<br />
 + org.restlet.ext.*<br />
 + org.restlet.test.*
</p></blockquote>
<p>restlet源码中主要包括三个部分，核心API，引擎，和扩展。<br />
2）核心API<br />
restlet是构建http协议之上的，按照<a href="http://roy.gbiv.com/pubs/dissertation/rest_arch_style.htm">http://roy.gbiv.com/pubs/dissertation/rest_arch_style.htm</a>实现,所以在restlet的API中很多类名都是完全按照论文所提到的概念来设计。<br />
核心API主要分为以下一个包：</p>
<ul>
<li>Base package</li>
<li>Data package（针对数据的抽象）</li>
<li>Representation package（表示层的抽象）</li>
<li>Resource package（资源的抽象）</li>
<li>Routing package（请求路由）</li>
<li>Security package（安全）</li>
<li>Service package（服务）</li>
<li>Util package</li>
</ul>
<p>详细的API说明可以查看<a href="http://wiki.restlet.org/docs_2.0/13-restlet/27-restlet.html">http://wiki.restlet.org/docs_2.0/13-restlet/27-restlet.html</a><br />
目前对restlet框架的代码结构有了一个简单的认识后，我们来看看restlet到底做了哪些工作。<br />
restlet就是实现了HTTP协议下对一个URL资源的访问，所以restlet必然要实现HTTP协议，然后将请求路由到指定的处理类上，过程就这么简单，现在我们就来看看核心API，这里需要引入大师的文字：</p>
<blockquote><p>
Uniform REST interface. &#8220;The central feature that distinguishes the REST<br />
 * architectural style from other network-based styles is its emphasis on a<br />
 * uniform interface between components. By applying the software engineering<br />
 * principle of generality to the component interface, the overall system<br />
 * architecture is simplified and the visibility of interactions is improved.<br />
 * Implementations are decoupled from the services they provide, which<br />
 * encourages independent evolvability.&#8221; Roy T. Fielding
</p></blockquote>
<p>大概意思就是说明：REST架构区别与其他基于网络的软件架构最重要的特点就是REST强调组件之间接口统一。<br />
所以在restlet核心API中所有的类都继承org.restlet.Uniform这个接口。</p>
<p>
<a href="http://www.xiebiao.com/blog/wp-content/uploads/2011/07/restlets.png"><img src="http://www.xiebiao.com/blog/wp-content/uploads/2011/07/restlets.png" alt="" title="restlets" /></a>
</p>
<p>Uniform接口中只有一个handle方法，注意到Restlet这个类是一个抽象类，在restlet的wiki中说到，Restlet设计成抽象类完全是为了API设计，因为大家都知道，如果想更改一个接口，那么对他的实现影响会很大，如果有什么新特性需要添加，可以在这个抽象类中进行，这样不会直接影响到实现类,所以Restlet仅仅是一个抽象类，而没有提供抽象方法，这也是设计中的一个很好实践。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=580</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restlet框架解读-1</title>
		<link>http://www.xiebiao.com/blog/?p=557</link>
		<comments>http://www.xiebiao.com/blog/?p=557#comments</comments>
		<pubDate>Sun, 17 Jul 2011 13:41:16 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[restlet]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=557</guid>
		<description><![CDATA[对于REST的概论，本文就不在说明， 简介： 具象状态传输（Representational state transfer，REST）是设计基于命名资源而非消息的松耦合应用程序的一种风格。构建 RESTful 应用程序的最困难的部分在于... ]]></description>
			<content:encoded><![CDATA[<p>对于REST的概论，本文就不在说明，</p>
<blockquote><p>简介： 具象状态传输（Representational state transfer，REST）是设计基于命名资源而非消息的松耦合应用程序的一种风格。构建 RESTful 应用程序的最困难的部分在于确定要公开哪些资源。解决了这个问题之后，再使用开源 Restlet 框架构建 RESTful Web 服务就是小菜一碟了。本教程从 REST 的基本概念开始，逐步指导您使用 Restlet 框架构建应用程序。</p></blockquote>
<p>IBM上有针对REST规范的<a href="http://www.ibm.com/developerworks/cn/education/java/j-rest/index.html">详细描述</a>，本文只针对Restlet框架的解读。<br />
在REST实现框架中，restlet算是比较老牌，目前支持REST规范的框架有：<br />
restlet:<a href="http://www.restlet.org/"> http://www.restlet.org/</a><br />
cetia4：<a href="http://www.acsinet-solutions.com/en/cetia4/">http://www.acsinet-solutions.com/en/cetia4/</a><br />
axis2：<a href="http://axis.apache.org/axis2/java/core/">http://axis.apache.org/axis2/java/core/</a>（更多的还是面向SOAP / WSDL ）<br />
sqlrest：<a href="http://sqlrest.sourceforge.net/">http://sqlrest.sourceforge.net/</a><br />
rest-art：<a href="http://rest-art.sourceforge.net/">http://rest-art.sourceforge.net/</a>（貌似已经没有更新了）<br />
serfj：<a href="http://serfj.sourceforge.net/">http://serfj.sourceforge.net/</a><br />
resteasy：<a href="http://www.jboss.org/resteasy/">http://www.jboss.org/resteasy/</a><br />
这里只是简单罗列了一些，如果想了解更多，可以到http://www.oschina.net/上找找。<br />
上面罗列的这些框架，目前有强大团队支持的就restlet和resteasy，定期发布版本，有比较完善的wiki。<br />
个人只对restlet有过深入使用，其他框架只有肤浅的认识，不过在后续的解读中，尽量将restlet与另外一款流行的REST框架对比。<br />
解读Restlet之前，先下载Restlet源码:</p>
<pre class="brush: shell; ruler: true; first-line: 1; ">
svn co http://restlet.tigris.org/svn/restlet restlet
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=557</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>处理Too open many files</title>
		<link>http://www.xiebiao.com/blog/?p=516</link>
		<comments>http://www.xiebiao.com/blog/?p=516#comments</comments>
		<pubDate>Fri, 28 Jan 2011 14:23:17 +0000</pubDate>
		<dc:creator>xiaog</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.xiebiao.com/blog/?p=516</guid>
		<description><![CDATA[最近遇到的一个问题，其实Linux 下的Too open many files 问题很普遍，常用的解决办法 http://www.javaeye.com/topic/240389，我这里的情况还有些不一样，具体情况是，在项目中使用memcached作为缓存，同时使... ]]></description>
			<content:encoded><![CDATA[<p>最近遇到的一个问题，其实Linux 下的Too open many files 问题很普遍，常用的解决办法 <a href="http://www.javaeye.com/topic/240389">http://www.javaeye.com/topic/240389</a>，我这里的情况还有些不一样，具体情况是，在项目中使用<a href="http://memcached.org/">memcached</a>作为缓存，同时使用<a href="http://code.google.com/p/xmemcached/">xmemcached</a>作为客户端包，程序中由于大量从网络机器中获取缓存数据，打开大量的IO，项目使用了5台机器负载均衡，唯独有一台机器报出以下异常，其他机器正常：</p>
<pre class="brush: java; ruler: true; first-line: 1; ">
[2011-01-27 18:24:35] 415615 [resin-tcp-connection-*:10002-8] INFO impl.AbstractController  - Controller has been stopped.
[2011-01-27 18:24:35] java.io.IOException: Too many open files
[2011-01-27 18:24:35] 	at sun.nio.ch.EPollArrayWrapper.epollCreate(Native Method)
[2011-01-27 18:24:35] 	at sun.nio.ch.EPollArrayWrapper.<init>(EPollArrayWrapper.java:68)
[2011-01-27 18:24:35] 	at sun.nio.ch.EPollSelectorImpl.<init>(EPollSelectorImpl.java:52)
[2011-01-27 18:24:35] 	at sun.nio.ch.EPollSelectorProvider.openSelector(EPollSelectorProvider.java:18)
[2011-01-27 18:24:35] 	at java.nio.channels.Selector.open(Selector.java:209)
... ...
</pre>
<p>问题显然是处在<a href="http://en.wikipedia.org/wiki/Epoll">epoll</a>上，最后修改了一下系统参数：<br />
echo &#8220;1024&#8243; >  /proc/sys/fs/epoll/max_user_instances<br />
echo &#8220;1306071&#8243; >  /proc/sys/fs/epoll/max_user_max_user_watches</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xiebiao.com/blog/?feed=rss2&#038;p=516</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

