<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Chris.Xiao]]></title><description><![CDATA[点滴记录技术进步进程]]></description><link>https://blog.youkuaiyun.com/shawhe</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; shawhe]]></copyright><item><title><![CDATA[利用GSON解析简单Json字符串]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/68067463</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/68067463</guid><author>shawhe</author><pubDate>Wed, 29 Mar 2017 17:47:04 +0800</pubDate><description><![CDATA[之前一直使用fastjson来解析json串，性能高，上手快，简单易学不错的！
最新听说fastjson爆出一个安全漏洞，只能寻找新的json库替代，就找到了gson，google开发的一款解析json的库，
平时工作中，复杂的json串解析用不太多，一般就是最基本的json串
用gson解析简单json串的示例如下：
String jsonString = "{\"uid\":\"189]]></description><category></category></item><item><title><![CDATA[Shell变量while循环内改变无法传递到循环外]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/65631543</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/65631543</guid><author>shawhe</author><pubDate>Fri, 24 Mar 2017 15:33:25 +0800</pubDate><description><![CDATA[今天刷Leecode（192 Word frequency）时，遇到一个shell语法问题，记录下来。首先将题目描述和代码呈上

  1 #!/bin/bash
  2 
  3 # Write a bash script to calculate the frequency of each word in a text file words.txt.
  4 #
  5 # For]]></description><category></category></item><item><title><![CDATA[JDK源码走读（4）：容器之LinkedList]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/54618155</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/54618155</guid><author>shawhe</author><pubDate>Thu, 19 Jan 2017 17:27:36 +0800</pubDate><description><![CDATA[本章分析List系列中的LinkedList，真正意义上的链表，底层采用链表形式存储数据元素。LinkedList是一个双向链表，可以向前或向后两个方向遍历链表。LinkedList也可以存放null元素。
一、 类实现/继承体系结构
为了对整个List实现/继承体系有个全貌，先将体系结构图画出来：
二、 关键数据成员
（1）节点类
private static classNode，包含]]></description><category></category></item><item><title><![CDATA[JDK源码走读（3）：容器之ArrayList]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53992839</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53992839</guid><author>shawhe</author><pubDate>Tue, 03 Jan 2017 11:30:47 +0800</pubDate><description><![CDATA[本章分析List系列中的ArrayList，有些与PriorityQueue类似，比如底层同样采取数组存储元素，也涉及到扩容操作等；也有不同之处，比如PriorityQueue不允许存入的元素为null，而ArrayList允许将null元素存放其中。
一、 类实现/继承体系结构
为了对整个List实现/继承体系有个全貌，先将体系结构图画出来：
二、 关键数据成员
（1）存储结构
tra]]></description><category></category></item><item><title><![CDATA[JDK源码走读（2）：容器之PriorityQueue]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53907307</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53907307</guid><author>shawhe</author><pubDate>Wed, 28 Dec 2016 12:08:18 +0800</pubDate><description><![CDATA[Java的容器分成四个系列：Set, List, Queue,Map，除Map外，其余三个都实现了Collection接口，List和Queue实现顺序存储，Map实现了K-V对。
本章分析其中实现较为简单的Queue系列
一、类实现/继承体系结构
为了对整个Queue实现/继承体系有个全貌，先将体系结构图画出来：
二、关键数据成员
（1）存储结构
PriorityQueue内部使用平]]></description><category></category></item><item><title><![CDATA[JDK源码走读（1）：开篇]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53907028</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53907028</guid><author>shawhe</author><pubDate>Wed, 28 Dec 2016 11:48:51 +0800</pubDate><description><![CDATA[概述

        打算从今天开始阅读jdk源码，一方面更熟悉各种结构、算法和功能库的实现机制，能更好的使用Java；另一方面，这些Java代码都是业界大牛所编写，经历几十年、各种场景的考验，非常值得学习！本系列作为阅读源码的笔记，记录代码实现的主要逻辑和自己的思考，也许有理解不对的地方，随着使用经验增加，对代码的理解会加深，后面再来优化。
        JDK版本]]></description><category></category></item><item><title><![CDATA[使用HtmlUnit实现自动打卡]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53485240</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53485240</guid><author>shawhe</author><pubDate>Tue, 06 Dec 2016 11:51:44 +0800</pubDate><description><![CDATA[打卡制度由来已久，对于公司管理员工的出勤比较重要，存在也是合情合理，但对于程序员这个向往弹性工作的群体，内心里还是不太乐意，遂利用HtmlUnit写了一个自动打卡的工具，放到公司内网，通过Crontab实现自动打卡，本意不在打卡，更多是为了学习HtmlUnit，为将来实现自动化测试热身。^_^
        对于网页解析部分，仅适用于我所在的公司的打卡页面，如果有同学恰好也需要这个功能，需要自]]></description><category></category></item><item><title><![CDATA[Twemproxy源码走读（5）：事件处理]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53431366</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53431366</guid><author>shawhe</author><pubDate>Fri, 02 Dec 2016 09:33:29 +0800</pubDate><description><![CDATA[概述
Twemproxy中的IO复用考虑了跨平台的情况，针对不同平台采用不同的IO复用机制，比如Linux下使用epoll、FreeBSD使用kqueue等，在event目录下都有实现，所有的IO复用机制对外实现了统一的接口（event/nc_event.h）：
struct event_base *event_base_create(int size, event_cb_t cb);
voi]]></description><category></category></item><item><title><![CDATA[Twemproxy源码走读（4）：运行主流程]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53389607</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53389607</guid><author>shawhe</author><pubDate>Tue, 29 Nov 2016 10:18:31 +0800</pubDate><description><![CDATA[Twemproxy在初始化完毕、运行前准备（nc_pre_run）结束后，开始进入正式的运行过程，
（1）   nc_run的整体流程
整体流程很清晰，



图1 nc_run整体流程图
（2）   core_start流程
core_start流程也不复杂，其中主要是创建struct context变量ctx，nc使用结构体structcontext变量ctx保存运行时的上下文]]></description><category></category></item><item><title><![CDATA[Twemproxy源码走读（2）:数据结构]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53363045</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53363045</guid><author>shawhe</author><pubDate>Sun, 27 Nov 2016 09:20:22 +0800</pubDate><description><![CDATA[Twemproxy内部定义了若干种数据结构，如概述中所述，包括自定义的数据结构和关键数据结构，本章将讲述两种数据结构，为后面的复杂的逻辑分析扫清障碍。

自定义的数据类型： nc_array.c、nc_array.h、nc_string.c、nc_string.h 关键数据结构和算法： nc_rbtree.h、nc_rbtree.c、nc_queue.h、nc_request.c、nc_res]]></description><category></category></item><item><title><![CDATA[Twemproxy源码走读（3）：初始化流程]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53302980</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53302980</guid><author>shawhe</author><pubDate>Wed, 23 Nov 2016 11:54:43 +0800</pubDate><description><![CDATA[Twemproxy初始化过程比较简单，这里把Twemproxy初始化过程分成两部分：（1）读取运行选项；（2）运行前的初始化和准备；
（1）   读取运行选项
             读取各项参数的设置，比如是否后台运行（daemonize）、日志级别、日志文件、配置文件名称等信息。
            正如前一章（概述）里讲到的，NC使用了一个全局变量nc（类型为struct ins]]></description><category></category></item><item><title><![CDATA[Twemproxy源码走读（1）：概述]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53239143</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53239143</guid><author>shawhe</author><pubDate>Sun, 20 Nov 2016 09:19:51 +0800</pubDate><description><![CDATA[Twemproxy（又称nutcracker，以下简称NC）是Memcached和Redis协议的代理服务器（下文中简单起见，只提及Redis，大部分情况适用于Memcached，不适用时会特别说明），并能有效减少大量连接对Redis服务器的性能影响。虽然Redis3.0版本具有集群的特性，但还不适合生产环境，单台Redis机器又受到内存大小限制，还存在出现故障会直接影响业务，同时，过多的客户端连]]></description><category></category></item><item><title><![CDATA[服务开发需考虑的事项]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53198003</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53198003</guid><author>shawhe</author><pubDate>Thu, 17 Nov 2016 11:47:43 +0800</pubDate><description><![CDATA[开发一个服务不是简单的将服务功能实现，程序能跑这么简单，还需要考虑到各个方面，大致整理如下：



逻辑正确，首先要保证程序的运行结果符合预期；方便修改，比如有些参数可能会修改，（1）这些就可以放到配置信息里，运行时，只需要改下配置，重启或者热修改，新的参数/配置就可以生效了；（2）还可以通过发送信号，与服务交互，服务代码中包含信号处理的逻辑，不同的信号，代表不同的信息；性能问题，现在的实]]></description><category></category></item><item><title><![CDATA[Redis简单扩容经验谈]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53166346</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53166346</guid><author>shawhe</author><pubDate>Mon, 14 Nov 2016 23:11:58 +0800</pubDate><description><![CDATA[team中的一个同学在其项目中使用了Redis作为缓存，将热点数据存放在Redis中。为了提升性能，写Redis时采用了管道的方式，平时使用时，Redis的性能、资源使用都能符合项目需求，但当访问量增加的时候，Redis的QPS还能满足要求，但CPU使用率高的时候已经达到90%+，平时只有30%+，而众所周知，Redis是单进程的，只能占用1个CPU核，跑满了也就100%，无法利用机器的多核，而当]]></description><category></category></item><item><title><![CDATA[开篇——概述]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/53166254</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/53166254</guid><author>shawhe</author><pubDate>Mon, 14 Nov 2016 23:07:24 +0800</pubDate><description><![CDATA[本分类记录了在工作过程中，遇到的、经历的或者听说过的问题，记录解决问题的思考过程，当然也有尚未解决的问题，也会记录在此，
        一来有知识经验的积累，加深印象，对自己算是个交代；
        二来呢，如果有哪位同行遇到了类似的问题，但有更优的解决方案，希望能在此留言指教，起到一个抛砖引玉的作用，倘若如此，不胜感激；
        这三来呢，也许有同学遇到了相同的问题，但还没有]]></description><category></category></item><item><title><![CDATA[深入调试的技术和工具读书笔记二]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/16334455</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/16334455</guid><author>shawhe</author><pubDate>Fri, 15 Nov 2013 07:15:35 +0800</pubDate><description><![CDATA[第2章 调试前的必知必会
Hack #4 获取进程的Coredump
启用内核转储
ulimit -c unlimited            //开启coredump，不限制coredump文件的大小。
ulimit -c 1073741824      //设置coredump文件的上限是1G
利用gdb调试Coredump文件：
gdb -c core_file_name ./]]></description><category></category></item><item><title><![CDATA[sigaction函数解析]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/13776409</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/13776409</guid><author>shawhe</author><pubDate>Thu, 31 Oct 2013 18:42:05 +0800</pubDate><description><![CDATA[sigaction函数的功能是检查或修改与指定信号相关联的处理动作（可同时两种操作）。
他是POSIX的信号接口，而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行，那么就应该使用这个接口)
给信号signum设置新的信号处理函数act， 同时保留该信号原有的信号处理函数oldact






int
sigaction(int signo,const]]></description><category></category></item><item><title><![CDATA[linux下astyle的使用]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/13770643</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/13770643</guid><author>shawhe</author><pubDate>Thu, 31 Oct 2013 13:05:14 +0800</pubDate><description><![CDATA[最近接触到一款格式化代码文件的小工具——astyle，感觉比较好用，记录如下：
1.首先下载astyle，本人使用的是linux版本的，下载地址：
http://download.youkuaiyun.com/detail/northteam/538518
2.tar -zxvf astyle_1.22_linux.tar.gz
3.cd astyle; cd buildgcc/
  执行make]]></description><category></category></item><item><title><![CDATA[EINTR错误]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/13704271</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/13704271</guid><author>shawhe</author><pubDate>Wed, 30 Oct 2013 20:16:15 +0800</pubDate><description><![CDATA[慢系统调用(slow system call)：此术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用有可能永远无法返回，多数网络支持函数都属于这一类。如：若没有客户连接到服务器上，那么服务器的accept调用就没有返回的保证。

EINTR错误的产生：当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时，该系统调用可能返回一个EINTR错误。例如：在socket服]]></description><category></category></item><item><title><![CDATA[深入调试的技术和工具读书笔记一]]></title><link>https://blog.youkuaiyun.com/shawhe/article/details/13670321</link><guid>https://blog.youkuaiyun.com/shawhe/article/details/13670321</guid><author>shawhe</author><pubDate>Wed, 30 Oct 2013 19:33:53 +0800</pubDate><description><![CDATA[第1章      热身准备
Hack #1 调试是什么
调试的流程如下：
（1）      bug复现；
（2）      调试；
（3）      确认执行过程（测试）；
（4）      程序行为与预期相同，则停止；程序行为与预期不同，转到（2）。
Hack #2 Debug hacks的地图
图1-3和图1-4将故障分类为“异常停止”、“不停止”和“其他现象”，并分别说明原因]]></description><category></category></item></channel></rss>