极简设计

flume 2016-01-01

flumeAgentModel

Flume Agent内部以Flume Event形式传递数据,具体内部由Source、Channel、Sink多线程相互协调进行

单节点 Flume 配置

# example.conf: A single-node Flume configuration
 
# Name the components on this agent
a1.sources = r1
a1.sinks = k1
a1.channels = c1
 
# Describe/configure the source
a1.sources.r1.type = netcat
a1.sources.r1.bind = localhost
a1.sources.r1.port = 44444
 
# Describe the sink
a1.sinks.k1.type = logger
 
# Use a channel which buffers events in memory
a1.channels.c1.type = memory
a1.channels.c1.capacity = 1000
a1.channels.c1.transactionCapacity = 100
 
# Bind the source and sink to the channel
a1.sources.r1.channels = c1
a1.sinks.k1.channel = c1

bin/flume-ng agent --conf conf --conf-file example.conf --name a1 -Dflume.root.logger=INFO,console

PS:-Dflume.root.logger=INFO,console 仅为 debug 使用,请勿生产环境生搬硬套,否则大量的日志会返回到终端。。。 -c/--conf 后跟配置目录,-f/--conf-file 后跟具体的配置文件,-n/--name 指定agent的名称

然后我们再开一个 shell 终端窗口,telnet 上配置中侦听的端口,就可以发消息看到效果了:

telnet localhost 44444

Flume 终端窗口会打印信息就表示成功了

Flume 启动时的最大堆内存大小默认是 20M,线上环境很容易 OOM,因此需要你在 flume-env.sh 中添加 JVM 启动参数: JAVA_OPTS="-Xms8192m -Xmx8192m -Xss256k -Xmn2g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:-UseGCOverheadLimit" 然后在启动 agent 的时候一定要带上 -c conf 选项,否则 flume-env.sh 里配置的环境变量不会被加载生效。

windows java.exe -Xmx20m -Dflume.root.logger=INFO,console -Dlog4j.configuration=file:///%CD%\conf\log4j.properties -cp "Z:\flume\lib*" org.apache.flume.node.Application -f Z:\flume\dd.conf -n a1

Flume 1.6.0 梳理 http://ningg.top/flume-1-6-0-summary/

吐槽 flume-ng http://www.sudops.com/fuck-flume-ng.html

Read More


eclipse 插件 2016-01-01

fullscreen 全屏插件 fullscreen

editbox 背景着色 editbox

log4e log4e

egit egit

m2 m2

jd jd

jarsearch jarsearch

font 调字体大小 font

wordwrap wordwrap

rmi plugin rmi plugin

nwire nwire

Read More


dubbo 2016-01-01

Dubbo与Spring的整合

spring可扩展Schema自定义配置支持使Provider/Consumer可以通过Spring配置完之后,就可以像使用spring bean一样进行服务暴露和调用了,完全看不到dubbo api的存在

META-INF下\spring.handlers指定了dubbo的xml解析类:DubboNamespaceHandler 被解析成ServiceConfig/ReferenceConfig

url总线的设计&jdk spi扩展

dk spi扩展 ExtensionLoader实现对spi的扩展

(1)jdk spi仅仅通过接口类名获取所有实现,而ExtensionLoader则通过接口类名和key值获取一个实现;

(2)Adaptive实现,就是生成一个代理类,这样就可以根据实际调用时的一些参数动态决定要调用的类了。

(3)自动包装实现,这种实现的类一般是自动激活的,常用于包装类,比如Protocol的两个实现类:ProtocolFilterWrapper、ProtocolListenerWrapper。

url总线设计 使得各层解耦 通常的设计会把层与层之间的交互参数做成Model,层与层之间沟通成本比较大,扩展起来也比较麻烦

Dubbo各层之间通信都用ur 注册中心启动时 registry://0.0.0.0:9090?codec=registry&transporter=netty 当前是注册中心,绑定所有ip,端口9090,解析器registry,底层网络通信框架是netty

如何更好地学习dubbo源代码 http://jm-blog.aliapp.com/?p=3138






                 				

Read More


docker 2016-01-01

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" sharedfolder add "boot2docker-vm" -name "ram" -hostpath "z:\"

boot2docker ssh "sudo mount -t vboxsf -o uid=1000,gid=50 ram /ram"

init

boot2docker.exe init

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe\" sharedfolder add boot2docker-vm -name home -hostpath d:/data/docker boot2docker.exe up -v boot2docker.exe ssh

sudo vi /var/lib/boot2docker/profile export HTTP_PROXY=http://192.168.59.3:9257 export HTTPS_PROXY=http://192.168.59.3:9257 sudo /etc/init.d/docker restart

查看宿主的tinycore linux vm ip

boot2docker ip 192.168.59.103

boot2docker ssh用户名密码 docker/tcuser

docker pull ubuntu:14.04.1 docker run -i -t ubuntu:14.04.1 /bin/bash

echo "deb http://mirrors.163.com/ubuntu/ utopic main restricted universe multiverse" > /etc/apt/sources.list apt-get update apt-get install -y vim htop git curl docker commit -m "vim" -a "ddatsh" b6d5bb5a766b dd docker save dd | bzip2 -9 -c>/Users/images/dd.tar.bz2

保存 docker commit -m "htop" -a "username" 98eaba64ba2c ddubuntu /htop:v1 98eaba64ba2c 是docker images里的ubuntu id

docker save dd | docker-rebase ubuntu.tar.bz2 | bzip2 -9 -c >/Users/images/dd.tar.bz2

删除所有容器 docker rm $(docker ps -aq) 删除所有镜像 docker rmi $(docker images -q)

其他写法 docker rm docker ps -a -q docker ps -a -q | xargs docker rm

docker run -t -i ubuntu:14.04 /bin/bash docker run -it 10.0.34.200:5000/centos_base /bin/bash docker run -t -i ddubuntu/htop:v1 /bin/bash

--privileged

进入 container 的ssh docker run -v /usr/local/bin:/target jpetazzo/nsenter

然后PID=$(docker inspect --format container的pid ) sudo nsenter --target 793 --mount --uts --ipc --net --pid

bzip2 -d -c < /Users/images/xx.tar.bz2 | docker load

windows tinycore linux

安装gcc tce-load -wi compiletc bzip2 tce-load -wi bzip2

docker save IMAGENAME | bzip2 -9 -c>img.tar.bz2

apt-get install gcc g++ vim htop

tar -xvf ~/jdk-xxx.tar.gz sudo mkdir -p /usr/lib/jvm/jdkXX sudo mv jdkXX/* /usr/lib/jvm/jdkXX/ sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdkXX/bin/java" 1 sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdkXX/bin/javac" 1 sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdkXX/bin/javaws"

sudo vim /etc/profile

JAVA_HOME=/usr/lib/jvm/jdk8 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME export JRE_HOME export PATH

docker save dd | ./docker-rebase /Users/images/ubuntu.tar.bz2 | bzip2 -9 -c >/Users/images/dd.tar.bz2

echo "proxy=http://192.168.59.3:3142" >> /etc/yum.conf

docker run -it ubuntu:latest /bin/bash echo "Acquire::http::Proxy \"http://192.168.59.3:3142\";" > /etc/apt/apt.conf.d/30proxy apt-get update

how to use physical partition in boot2docker

Read More


并发 2016-01-01

多进程和多线程的优缺点

  • 多进程:立体交通,虽然造价高,上坡下坡多耗点油,但不堵车
  • 多线程:平面交通,造价低,但红绿灯太多,老堵车

现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车

风格之争:Coroutine模型 vs 非阻塞/异步IO(callback)

多进程 linux下服务程序广泛采用,如大名鼎鼎的apache 主进程负责监听和管理连接 子进程处理具体业务逻辑

最大好处:隔离性,子进程crash不会影响父进程 缺点: 进程间通讯效率造成瓶颈,需要大量父子进程IPC,对效率来说是一种损失 通常用share memory等技术减低通讯开销

多线程 windows下面较常见。一线程处理一个client 编程简单,有一个清晰连续顺序的work flow。简单意味不易出错 太多的线程会减低软件的运行效率

多进程/线程资源耗费都较大,高并发服务器端使用并不多

基于callback/coroutine的架构

Callback 非阻塞/异步IO

架构发挥到极致的代表node.js 使用非阻塞的IO,server可以持续运转,而不需要等待,只需很少线程,即使只一个 需要定期的任务可以采取定时器来触发

传统写法 var file = open('my.txt'); var data = file.read(); //block print(data); //block

node.js

fs.open('my.txt',function(err,data){ setTimeout(1000,function(){ console.log(data); } }); //non-block

好处:performance会比较好 缺点:编程复杂,以前连续的流程切成了很多片段。也不能充分发挥多核的能力

Coroutine 协程

本质上是一种轻量级的thread,开销比thread少很多 多coroutine可按照次序在一个thread执行 一个coroutine如果处于block状态,可以交出执行权,让其他的coroutine继续执行 coroutine可用清晰编程模型实现状态机

go对coroutine语言级支持,关键字go启动一个coroutine(Go语言对coroutine的重视),结合chan(类似于message queue)来实现coroutine的通讯,实现了Go的理念 "Do not communicate by sharing memory; instead, share memory by communicating."

coroutine编程简单,流程清晰。但是内存消耗会比较大,每个coroutine要保留当前stack的一些内容,以便于恢复执行。

Callback vs Coroutine 在业务流程实现上,coroutine确实是更理想的实现,基于callback的风格,代码确实不是那么清晰,你可能会写出这样的代码。

//pseudo code socket.read(function(data){ if(data==’1’) db.query(data,function(res){ socket.write(res,function(){ socket.read(function(data){ }); }); }); else doSomethingelse(...); }); 当然你可以使用独立的function函数来代替匿名的函数获得更好的可读性。如果使用coroutine就获得比较清晰的模型。

//pseudo code coroutine handle(client){ var data = read(client); //coroutine will yield when read, resume when complete if(data==’1’){ res = db.query(data); … } else{ doSomething(); } }

这是一种风格的选择,优劣并不是绝对的

Golang适合高并发场景的原因分析 http://blog.csdn.net/ghj1976/article/details/27996095

Go-简洁的并发

http://www.yankay.com/go-clear-concurreny/

Golang, Erlang, Scala等为并发设计的程序语言的兴起,新的并发模式逐渐清晰 让软件释放多核的威力,更好利用多核处理器 go的编程模式有一个极其简洁的内核,还有在此之上丰富的外延。可以解决现实世界中各种各样的问题

并发模式之内核

以前并发编程非常困难。写良好的并发程序前,要了解线程,锁,semaphore,barrier甚至CPU更新高速缓存的方式,而且他们个个都有怪脾气,处处是陷阱

go简洁的并发模式不需要这些复杂的底层元素,协程和通道就够了 协程负责执行代码,通道负责在协程之间传递事件

过程式编程中,调用一个过程时,要等其执行完才返回 调用协程时,不需等其执行完,会立即返回 协程十分轻量,Go可在一个进程中执行有数以十万计的协程,依旧保持高性能

通道是协程之间的数据传输通道。通道可在众多协程间传递数据(值或引用)

通道使用方式 协程试图向通道放入数据,如果通道满了,挂起协程,直到通道可以为他放入数据为止 协程试图向通道索取数据,如果通道没有数据,挂起协程,直到通道返回数据为止 如此,通道就可以在传递数据的同时,控制协程的运行。有点像事件驱动,也有点像阻塞队列

Golang Erlang Scala(Actor)
协程 goroutines process actor
消息队列 channel mailbox channel

只要有协程和通道,就可以优雅的解决并发的问题。不必使用其他和并发有关的概念 那如何用这两把利刃解决各式各样的实际问题呢?

并发模式之外延

协程相较于线程,可以大量创建。打开这扇门,我们拓展出新的用法,可以做生成器,可以让函数返回“服务”,可以让循环并发执行,还能共享变量。但是出现新的用法的同时,也带来了新的棘手问题,协程也会泄漏,不恰当的使用会影响性能。下面会逐一介绍各种用法和问题。演示的代码用GO语言写成,因为其简洁明了,而且支持全部功能。

生成器

有的时候,我们需要有一个函数能不断生成数据。比方说这个函数可以读文件,读网络,生成自增长序列,生成随机数。这些行为的特点就是,函数的已知一些变量,如文件路径。然后不断调用,返回新的数据。

下面生成随机数为例, 以让我们做一个会并发执行的随机数生成器。

非并发的做法是这样的:

http://blog.csdn.net/yatere/article/details/8019682

Read More


Concurrent 2016-01-01

高并发编程里多线程(进程)的弊端 著名C10K 问题谈到高并发编程时,多线程/进程是一种不可取的解决方案, 线程/进程本质上都是os资源, 每线程要额外占用1/2M内存,2G内存,能承受线程数极限1k这个量级 线程由os调度, 线程/进程数到达一定量级(并发线程数1k以上后, os基本上就已经不堪重负,调度不过来了)

事件驱动 已知多线程无法解决高并发问题, 异步IO/事件驱动等概念来解决高并发编程 典型Node.js ,事件驱动, 底层使用libuv 然后通过各种回调函数注册事件, 当事件触发的时候回调函数也被触发 事件驱动确实能解决高并发的问题, 但最费劲的就是各种丧心病狂不停的回调, 在回调里面再嵌套回调,容易陷入所谓的【回调地狱】。 这也是 Node.js 最受人诟病的地方

高并发解决方案之协程 面向对象最典型Java , 事件驱动最典型的语言是 Node.js , 协程最典型golang 协程相对于事件驱动是一种更先进的高并发解决方案, 复杂的逻辑和异步都封装在底层, 让程序员在编程时感觉不到异步的存在, 【用同步抒写异步情怀】

协程也称用户级线程, 线程/进程调度是由os来调控, 而协程由用户自己调控。 所以协程调度器可以在协程A即将进入阻塞IO操作, 比如 socket 的 read (其实已经设置为异步IO )之前, 将该协程挂起,把当前的栈信息 StackA 保存下来, 然后切换到协程B, 等到协程A的该 IO操作返回时, 再根据 StackA 切回到之前的协程A当时的状态

ucontext 云风简单的协程实现 cloudwu-coroutine, 主要是基于 ucontext 来进行状态的切换

ucontext 由以下四个函数组成:

getcontext setcontext makecontext swapcontext 其实就是一种类似 goto 的编程方法, getcontext 就是将当前协程上下文获得并存起来, setcontext 就是跳转到某个协程上下文状态。 前者类似 label , 后者类似 goto 。 makecontext 和 swapcontext 稍微再复杂一点点, 但是也都是干着上下文切换的勾当。

如何减少上下文切换 - 无锁并发编程:多线程竞争,引起上下文切换,要避免锁,如数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据 - CAS算法:Java的Atomic包用CAS算法更新数据,而不需要加锁 - 使用最少线程:避免创建不需要的线程,比如任务少,但是创建了很多线程来处理,造成大量线程都处于等待状态 - 协程:单线程实现多任务调度,并在单线程里维持多个任务间的切换

Read More


命令 2016-01-01

win查占用端口进程,杀之 netstat –ano|findstr "8080"

tasklist|findstr "PID号"

find large dir du -Sh | sort -rh | head -n 15

find large file find . -type f -exec du -Sh {} + | sort -rh | head -n 15

Read More


chrome 2016-01-01

目前为止,Chrome 浏览器主要包括 Stable 、Beta 、DEV 、Canary金丝雀版以及鼻祖 Chromium 版 稳定性,Stable>Beta>DEV>Canary>Chromium 更新速度相反 Chromium>Canary>DEV>Beta>Stable

Windows 平台: 32位离线安装包: Canary 金丝雀版:http://www.google.com/chrome/eula.html?platform=win&extra=canarychannel&standalone=1 Dev开发版:http://www.google.com/chrome/eula.html?platform=win&extra=devchannel&standalone=1 Beta测试版:http://www.google.com/chrome/eula.html?platform=win&extra=betachannel&standalone=1 Stable稳定版:http://www.google.com/chrome/eula.html?platform=win&extra=stablechannel&standalone=1

MAC: Stable正式版:https://www.google.com/chrome/browser/?platform=mac Bata 测试版:https://www.google.com/chrome/browser/beta.html?platform=mac&extra=betachannel DEV 开发版:https://www.google.com/chrome/browser/?platform=mac&extra=devchannel Canary 金丝雀版:http://www.google.com/chrome/browser/canary.html?platform=mac

Linux: Stable 正式版:https://www.google.com/chrome/browser/?platform=linux Ubuntu/Debian 32-bit Bata 版: https://www.google.com/chrome/browser/beta.html?platform=linux Ubuntu/Debian 32-bit DEV 版: https://www.google.com/chrome/browser/?platform=linux&extra=devchannel Ubuntu/Debian 64-bit Bata 版: https://www.google.com/chrome/browser/beta.html?platform=linux Ubuntu/Debian 64-bit DEV 版: https://www.google.com/chrome/browser/?platform=linux&extra=devchannel Fedora/OpenSUSE 32-bit Bata 版: https://www.google.com/chrome/browser/beta.html?platform=linux Fedora/OpenSUSE 32-bit DEV 版: https://www.google.com/chrome/browser/?platform=linux&extra=devchannel Fedora/OpenSUSE 64-bit Bata 版: https://www.google.com/chrome/browser/beta.html?platform=linux Fedora/OpenSUSE 64-bit DEV 版: https://www.google.com/chrome/browser/?platform=linux&extra=devchannel

Chromium下载地址: http://commondatastorage.googleapis.com/chromium-browser-continuous/index.html

Chromium:

  • Google Chrome的基础,是一个开源项
  • 拥有诸多尖端优势
  • 拥有众多的版本包括Windows、Mac及Linux,几乎每天都在进行更新;
  • 该版本不稳定

Google Chrome dev:

  • 以Chromium最新版本为基础
  • 每星期更新;
  • 相对稳定,类似同类产品的“测试版”
  • 最新的功能和特性都有体现;

Google Chrome beta:

  • 基于稳定的开发版本
  • 每月更新
  • 最新的功能和特性基本定型;
  • 可以正常使用,很少会出错

Google Chrome Stable(稳定版):

  • 基于最稳定的Google Chrome beta
  • 新功能基本固定,经过数月测试;
  • 每隔几个月发布
  • 版本稳定

http://liulanmi.com/chrome https://www.zhihu.com/question/19705312 http://hzy.pw/p/1627/2

Read More


cache-client 2016-01-01

入口

src/main/resources/META-INF/spring.handlers

http://www.handpay.com.cn/schema/cache=com.handpay.framework.cache.client.config.HandpayCacheNamespaceHandler

HandpayCacheNamespaceHandler extends NamespaceHandlerSupport

@Override public void init() { registerBeanDefinitionParser("cache-executor", new CacheExecutorParser()); registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenParser()); }

配置


<?xml version="1.0" encoding="GBK"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:hpcache="http://www.handpay.com.cn/schema/cache"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.handpay.com.cn/schema/cache
        http://www.handpay.com.cn/schema/cache/handpay-cache.xsd">

    <hpcache:cache-executor appcode="dev">

        <hpcache:server-address>
            <hpcache:http
                endpoint="http://127.0.0.1:8080/cache-monitor/ws/cache-server.htm" />
        </hpcache:server-address>
    </hpcache:cache-executor>

    <bean id="cacheClient" class="com.ddatsh.maven.CacheExecutorExample">
        <property name="executor" ref="cacheExecutor" />
    </bean>

</beans>

使用

ApplicationContext ctx = new ClassPathXmlApplicationContext("application-cache.xml");
CacheExecutor executor = (CacheExecutor) ctx.getBean("cacheExecutor");

executor.set("name", "dd");

executor.executeInTransaction(new TransactionAction() {
    public void doInTxAction(CacheExecutorOperation operation) throws CacheClientException {
        operation.set("name", "dd");
    }
});

interface CacheExecutor extends TransactionCacheExecutor

interface TransactionCacheExecutor extends IntegratedOperation
    void executeInTransaction(TransactionAction tx) throws CacheClientException;

interface IntegratedOperation extends GetOperation, SetOperation,
    DeleteOperation, AtomicCounterOperation, KeyOperation, AppendableOperation 

IntegratedOperation

子接口有两个
interface CacheExecutorOperation extends IntegratedOperation
interface TransactionCacheExecutor extends IntegratedOperation
    void executeInTransaction(TransactionAction tx) throws CacheClientException

CacheExecutorOperation实现之DefaultCacheExecutorOperation

被事务回调用
class DefaultCacheExecutorOperation implements CacheExecutorOperation
/**
* 委托使用的操作对象
*/
    private IntegratedOperation operation;

    public DefaultCacheExecutorOperation(IntegratedOperation operation) {
        this.operation = operation;
    }

各种get,set委托

TransactionCacheExecutor 两个子接口

interface CacheExecutor extends TransactionCacheExecutor
interface InternalCacheExecutor extends TransactionCacheExecutor
     int DEFAULT_EXPIRATION_SECONDS = 1800;

Read More


c++ 流派 2016-01-01

  • 经典C++流 类是核心,例程多用C Runtime的,很少用模版,一般是正统教育的结果
  • 古典C流 基本上当C用,偶尔用用对象,不使用异常,喜欢怀旧
  • MFC流 秉承MFC的风格,主要使用MFC/ATL对象和Win32 API,不喜欢STL,用很多的宏把IDE的语法提示模块折磨到崩溃
  • Portable流 以C Runtime和STL为主要工具,使用类和模版,不跨平台毋宁死
  • Functional流 以模版和STL为主要武器,大量使用函数式语言的设计方法,并号称这才是真正的C++
  • Win32流:多使用全局函数,偏爱Win32 API,但不排斥C Runtime,通常喜欢轻量级的程序,所以身材也比较苗条
  • Java流 全面使用Java的风格,不能容许任何全局成员,但允许使用STL的集合类,写很多叫Factory的类
  • COM流 喜欢AddRef()和Release(),大量使用接口,隐藏一切可以隐藏的东西,诵经的时候要把上帝替换成COM
  • 戒律流 追求完美的C++程序,计较每一个const和throw(),极力避免不安全的cast,随身一定要带一本ISO C++手册
  • 混沌流 其程序无常形,无恒道,变幻莫测,吾不知其名

  • C流 精通C,习惯了她的思想
  • C/C++流 精通C,对C++一般,但是为了项目或者其他需求,不得不实现混用。而且不爱写注释
  • MFC/C++流 使用类,几乎不用模版。大量派生!大量异常!
  • STL/C++流 大量使用范型,创建可移植!!能用crt的全部使用crt
  • DP/C++流 热爱设计模式,大量类,但都讲求自认为的精细,间或使用范型。大量注释,恨不得比代码还多,XP方法下的产物

Read More


c 2016-01-01

C专家编程 c诡异离奇,缺陷重重,即获得了巨大的成功-Dennis Ritchie c史前阶段,源于庞大失败的Multics工程 Multics失败,Ken没有机器(GE-635)可以再玩自己的写的游戏star travel,基于闲置淘汰主机PDP-7汇编,用B语言写第一版UNIX 后Dennis M. Ritchie加入,基于B语言开发出C语言,重写UNIX,安装于PDP-11/20机器 Thompson与Rob Pike在Plan 9上实现UTF-8

参考 Unix操作系统发明者Ken Thompson和Dennis Ritchie http://www.bigsea.com.cn/archives/1269/ Unix/Linux历史和大事记 http://imax.blog.techweb.com.cn/archives/48

https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E6%B1%A4%E6%99%AE%E9%80%8A

Unix发展与现状 http://www.178linux.com/6735

plan 9 https://zh.wikipedia.org/wiki/%E8%B2%9D%E7%88%BE%E5%AF%A6%E9%A9%97%E5%AE%A4%E4%B9%9D%E8%99%9F%E8%A8%88%E7%95%AB

更全的一篇 Unix之父、C语言的发明人:丹尼斯·利奇和肯·汤普生(Dennis M. Ritchie、Ken Thompson) http://www.itnewsstand.com/html/jishu/563.html

Read More


c 2016-01-01

http://m.oschina.net/blog/368991 http://zhiwei.li/text/page/3/

http://demon.tw/page/6 http://emacslisp.com/?p=7 http://www.lofter.com/postentry?from=search&permalink=3b23a9_1358b95 http://chenyufei.info/blog/2011-03-06/wrap-c-function-using-libtcc/ http://jingpin.jikexueyuan.com/article/38895.html

Read More


books 2016-01-01

几本作者签名的书 maven实战 git权威指南 设计模式之禅 Spring 3.x 企业应用开发实战

Read More


分布式Java应用基础与实践 2016-01-01

强引用

A a=new A(); 对象主动释放引用后才被GC

软引用

JVM内存不足、或认为不经常活动时被回收,适用于缓存 -XX:SoftRefLRUPolicyMSPerMB=1000

HotSpot JVM garbage collection options cheat sheet http://blog.ragozin.info/2011/09/hotspot-jvm-garbage-collection-options.html

Read More


token 2016-01-01

OpenID/OAuth

Read More


Selenium 2016-01-01

http://seleniumhq.org/download/ 下载Selenium Server http://selenium.googlecode.com/files/selenium-server-standalone-2.24.1.jar

jar 包 http://selenium.googlecode.com/files/selenium-java-2.24.1.zip

不要每次测试都开新浏览器

import com.thoughtworks.selenium.HttpCommandProcessor;

public class CustomizedCommandProcessor extends HttpCommandProcessor {

    public CustomizedCommandProcessor(String serverHost, int serverPort,
            String browserStartCommand, String browserURL, String sessionId) {
        super(serverHost, serverPort, browserStartCommand, browserURL);
        this.setSessionInProgress(sessionId);
    }
} 
public static void main(String[] args) {
        String session = "e9d60557a1cf47a082cdf361848c21ad";
        CustomizedCommandProcessor cp = new CustomizedCommandProcessor(
                "localhost", 4444, "*googlechrome",
                "http://www.kaixin001.com/", session);
        Selenium selenium = new DefaultSelenium(cp);
        // 这里不需要selenium start()和 selenium.open("/")。从下面开始添加你想debug的函数即可。
        selenium.open("http://www.kaixin001.com/");
    }

session 值替换

Read More


使用AJAX+PushState技术进行无刷新浏览 2016-01-01

http://iczbix.com/NovBoX.html 使用AJAX+PushState技术进行无刷新浏览 http://www.welefen.com/use-ajax-and-pushstate.html

Read More