2014年6月 ’ 的文章存档

redis 数据结构综述

这里所说的数据结构是针对 redis 内部存储 key-value 的,其他诸如 redis 配置相关的数据结构,不在此篇讨论范围。

一览 redis 数据结构

dict,哈希表,redis 所有的 key-value 都存储在里面。

// 哈希表(字典)数据结构,redis 的所有键值对都会存储在这里。其中包含两个哈希表。
typedef struct dict {
    // 哈希表的类型,包括哈希函数,比较函数,键值的内存释放函数
    dictType *type;

    // 存储一些额外的数据
    void *privdata;

    // 两个哈希表
    dictht ht[2];

    // 哈希表重置下标,指定的是哈希数组的数组下标
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */

    // 绑定到哈希表的迭代器个数
    int iterators; /* number of iterators currently running */
} dict;

redisObject,任何 value 都会被包装成一个 redisObject,redisObject 能指定 value 的类型,编码方式等数据属性。
阅读全文

MySql注入科普

默认存在的数据库:

      mysql       需要root权限读取
      information_schema       在5以上的版本中存在

测试是否存在注入方法

假:表示查询是错误的 (MySQL 报错/返回页面与原来不同)
阅读全文

Clojure 编程语言

充分利用 Eclipse 的 Clojure 插件

Lisp 是一种编程语言,以表达性和功能强大著称,但人们通常认为它不太适合应用于一般情况。Clojure 是一种运行在 Java™ 平台上的 Lisp 方言,它的出现彻底改变了这一现状。如今,在任何具备 Java 虚拟机的地方,您都可以利用 Lisp 的强大功能。在本文中,了解如何开始使用 Clojure,学习它的一些语法,同时利用 Eclipse 的 Clojure 插件提供帮助。

本文介绍了 Clojure 编程语言。Clojure 是一种 Lisp 方言。本文假设您不熟悉 Lisp,但需要您具备 Java 技术方面的知识。要编写 Clojure 程序,需要 Java Development Kit V5 或更高版本以及 Clojure 库。本文使用的是 JDK V1.6.0_13 和 Clojure V1。此外,您还需要利用 Eclipse 的 Clojure 插件(clojure-dev),因此还要用到 Eclipse。在本文中,我们使用了 Eclipse V3.5 和 clojure-dev 0.0.34。相关链接,请参见 参考资料

什么是 Clojure?

不久前,要想在 Java Virtual Machine (JVM) 上运行程序,还需要使用 Java 编程语言来编写程序。但那个时代已经一去不复返了。现在更多的选择,比如 Groovy、Ruby(通过 JRuby)及 Python (通过 Jython),带来了一种更为过程化的脚本式的编程风格,或者它们各自拥有独特的面向对象编程特色。这两种都是 Java 程序员所熟悉的。也许有人会说用这些语言与用 Java 语言编写程序没什么区别,只要习惯不同的语法就可以了。
阅读全文

为生活可以忍,侮辱技术行不行?

几年前追《叶问》,当我看到叶问2时就被洪金宝的一句话给震撼住了:“为生活可以忍,侮辱中国武术就不行”。

前段时间我也听到了类似一句话,是一个程序员朋友说的,这厮气鼓鼓的在QQ签名上写了一句话,后来被我转到微信朋友圈里了。这句话是:为生活可以忍,侮辱技术就不行。

于是我通过QQ,用脑残的表情跟他聊了一番(原谅我其实一直是一个很八卦而且好奇心很强的人),发现大概情况是这样的:

这位年入30的姜姓程序员在一家中小型软件公司做一线开发外加项目管理,平时上班沉默寡言,大家基本可以理解为“逆来顺受型”,按照他的说法:要还贷款、上老下小要养,因此工作上任何不顺心的事都可以忍受,什么都可以丢,工作不能丢。我估摸着他的收入还是可以的,因为那是一家虽小但是很有“相关背景”的公司,论前途谈不上,但是不太会差钱。

姜姓程序员给我举了几个“为生活可以忍”的列子:
阅读全文

如何编写好的jQuery代码

讨论jQuery和javascript性能的文章并不罕见。然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码。好的代码会带来速度的提升。快速渲染和响应意味着更好的用户体验。

首先,在脑子里牢牢记住jQuery就是javascript。这意味着我们应该采取相同的编码惯例,风格指南和最佳实践。

首先,如果你是一个javascript新手,我建议您阅读 《给JavaScript初学者的24条最佳实践》 ,这是一篇高质量的javascript教程,接触jQuery之前最好先阅读。
阅读全文

Python 与 Javascript 之比较

最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里。我觉得对于从Javascript转到Python,有必要总结一下它们之间的差异。

基本概念

PythonJavascript都是脚本语言,所以它们有很多共同的特性,都需要解释器来运行,都是动态类型,都支持自动内存管理,都可以调用eval()来执行脚本等等脚本语言所共有的特性。

然而它们也有很大的区别,Javascript这设计之初是一种客户端的脚本语言,主要应用于浏览器,它的语法主要借鉴了C,而Python由于其“优雅”,“明确”,“简单”的设计而广受欢迎,被应用于教育,科学计算,web开发等不同的场景中。

编程范式

Python和Javascript都支持多种不同的编程范式,在面向对象的编程上面,它们有很大的区别。Javascript的面向对象是基于原型(prototype)的, 对象的继承是由原型(也是对象)创建出来的,由原型对象创建出来的对象继承了原型链上的方法。而Python则是中规中矩的基于类(class)的继承,并天然的支持多态(polymophine)。

OO in Pyhton

01	class Employee:
02	   'Common base class for all employees'
03	   empCount = 0 ##类成员
04	 
05	   def __init__(self, name, salary):
06	      self.name = name
07	      self.salary = salary
08	      Employee.empCount += 1
09	    
10	   def displayCount(self):
11	     print "Total Employee %d" % Employee.empCount
12	 
13	   def displayEmployee(self):
14	      print "Name : ", self.name,  ", Salary: ", self.salary
15	## 创建实例
16	ea = Employee("a",1000)
17	eb = Employee("b",2000)

OO in Javascript

01	var empCount = 0;
02	//构造函数
03	function Employee(name, salary){
04	    this.name = name;
05	    this.salary = salary;   
06	    this.empCount += 1;
07	}
08	 
09	Employee.prototype.displayCount = function(){
10	    console.log("Total Employee " + empCount );
11	}
12	 
13	Employee.prototype.displayEmployee = function(){
14	    console.log("Name " + this.name + ", Salary " + this.salary );
15	}
16	//创建实例
17	var ea = new Employee("a",1000);
18	var eb = new Employee("b",2000);

 

因为是基于对象的继承,在Javascript中,我们没有办法使用类成员empCount,只好声明了一个全局变量,当然实际开发中我们会用更合适的scope。注意Javascript创建对象需要使用new关键字,而Python不需要。

除了原生的基于原型的继承,还有很多利用闭包或者原型来模拟类继承的Javascript OO工具,因为不是语言本身的属性,我们就不讨论了。

线程模型

在Javascript的世界中是没有多线程的概念的,并发使用过使用事件驱动的方式来进行的, 所有的JavaScript程序都运行在一个线程中。在HTML5中引入web worker可以并发的处理任务,但没有改变Javascript单线程的限制。

Python通过thread包支持多线程。

不可改变类型 (immutable type)

在Python中,有的数据类型是不可改变的,也就意味着这种类型的数据不能被修改,所有的修改都会返回新的对象。而在Javascript中所有的数据类型都是可以改变的。Python引入不可改变类型我认为是为了支持线程安全,而因为Javascript是单线程模型,所以没有必要引入不可改变类型。

当然在Javascript可以定义一个对象的属性为只读。

1	var obj = {};Object.defineProperty(obj, "prop", {
2	    value: "test",
3	    writable: false});

在ECMAScript5的支持中,也可以调用Object的freeze方法来是对象变得不可修改。

Object.freeze(obj)

 

数据类型

Javascript的数据类型比较简单,有object、string、boolean、number、null和undefined,总共六种

Python中一切均为对象,像module、function、class等等都是。

Python有五个内置的简单数据类型bool、int、long、float和complex,另外还有容器类型,代码类型,内部类型等等。

布尔

Javascript有true和false。Python有True和False。它们除了大小写没有什么区别。

字符串

Javascript采用UTF16编码。

Python使用ASCII码。需要调用encode、decode来进行编码转换。使用u作为前缀可以指定字符串使用Unicode编码。

数值

Javascript中所有的数值类型都是实现为64位浮点数。支持NaN(Not a number),正负无穷大(+/-Infiity)。

Python拥有诸多的数值类型,其中的复数类型非常方便,所以在Python在科研和教育领域很受欢迎。这应该也是其中一个原因吧。Python中没有定义NaN,除零操作会引发异常。

列表

Javascript内置了array类型(array也是object)

Python的列表(List)和Javascript的Array比较接近,而元组(Tuple)可以理解为不可改变的列表。

除了求长度在Python中是使用内置方法len外,基本上Javascript和Python都提供了类似的方法来操作列表。Python中对列表下标的操作非常灵活也非常方便,这是Javascript所没有的。例如l[5:-1],l[:6]等等。

字典、哈希表、对象

Javascript中大量的使用{}来创建对象,这些对象和字典没有什么区别,可以使用[]或者.来访问对象的成员。可以动态的添加,修改和删除成员。可以认为对象就是Javascript的字典或者哈希表。对象的key必须是字符串。

Python内置了哈希表(dictS),和Javascript不同的是,dictS可以有各种类型的key值。

空值

Javascript定义了两种空值。 undefined表示变量没有被初始化,null表示变量已经初始化但是值为空。

Python中不存在未初始化的值,如果一个变量值为空,Python使用None来表示。

Javascript中变量的声明和初始化

1	v1;
2	v2 = null;
3	var v3;
4	var v4 = null;
5	var v5 = 'something';

 

在如上的代码中v1是全局变量,未初始化,值为undefined;v2是全局变量,初始化为空值;v3为局部未初始化变量,v4是局部初始化为空值的变量;v5是局部已初始化为一个字符处的变量。

Python中变量的声明和初始化

1	v1 = None
2	v2 = 'someting'

 

Python中的变量声明和初始化就简单了许多。当在Python中访问一个不存在的变量时,会抛出NameError的异常。当访问对象或者字典的值不存在的时候,会抛出AttributeError或者KeyError。因此判断一个值是否存在在Javascript和Python中需要不一样的方式。

Javascript中检查某变量的存在性:

1	if (!v ) {
2	    // do something if v does not exist or is null or is false
3	}
4	 
5	if (v === undefined) {
6	    // do something if v does not initialized
7	}

 

注意使用!v来检查v是否初始化是有歧义的因为有许多种情况!v都会返回true

Python中检查某变量的存在性:

1	try:
2	    v
3	except NameError
4	    ## do something if v does not exist

 

在Python中也可以通过检查变量是不是存在于局部locals()或者全局globals()来判断是否存在该变量。

类型检查

Javascript可以通过typeof来获得某个变量的类型:

typeof in Javascript 的例子:

1	typeof 3 // "number"
2	typeof "abc" // "string"
3	typeof {} // "object"
4	typeof true // "boolean"
5	typeof undefined // "undefined"
6	typeof function(){} // "function"
7	typeof [] // "object"
8	typeof null // "object"

 

要非常小心的使用typeof,从上面的例子你可以看到,typeof null居然是object。因为javscript的弱类型特性,想要获得更实际的类型,还需要结合使用instanceof,constructor等概念。具体请参考这篇文章

Python提供内置方法type来获得数据的类型。

1	>>> type([]) is list
2	True
3	>>> type({}) is dict
4	True
5	>>> type('') is str
6	True
7	>>> type(0) is int
8	True

同时也可以通过isinstance()来判断类的类型

1	class A:
2	    pass
3	class B(A):
4	    pass
5	isinstance(A(), A)  # returns True
6	type(A()) == A      # returns True
7	isinstance(B(), A)    # returns True
8	type(B()) == A        # returns False

 

但是注意Python的class style发生过一次变化,不是每个版本的Python运行上述代码的行为都一样,在old style中,所有的实例的type都是‘instance’,所以用type方法来检查也不是一个好的方法。这一点和Javascript很类似。

自动类型转换

当操作不同类型一起进行运算的时候,Javascript总是尽可能的进行自动的类型转换,这很方便,当然也很容易出错。尤其是在进行数值和字符串操作的时候,一不小心就会出错。我以前经常会计算SVG中的各种数值属性,诸如x,y坐标之类的,当你一不小心把一个字符串加到数值上的时候,Javascript会自动转换出一个数值,往往是NaN,这样SVG就完全画不出来啦,因为自动转化是合法的,找到出错的地方也非常困难。

Python在这一点上就非常的谨慎,一般不会在不同的类型之间做自动的转换。

语法

风格

Python使用缩进来决定逻辑行的结束非常具有创造性,这也许是Python最独特的属性了,当然也有人对此颇具微词,尤其是需要修改重构代码的时候,修改缩进往往会引起不小的麻烦。

Javascript虽然名字里有Java,它的风格也有那么一点像Java,可是它和Java就好比雷峰塔和雷锋一样,真的没有半毛钱的关系。到时语法上和C比较类似。这里必须要提到的是coffeescript作为构建与Javascript之上的一种语言,采用了类似Python的语法风格,也是用缩进来决定逻辑行。

Python风格

1	def func(list):
2	    for i in range(0,len(list)):
3	        print list[i]

Javascript风格

1	function funcs(list) {
2	    for(var i=0, len = list.length(); i < len; i++) {
3	        console.log(list[i]);
4	    }
5	}

 

从以上的两个代码的例子可以看出,Python确实非常简洁。

作用范围和包管理

Javascript的作用域是由方法function来定义的,也就是说同一个方法内部拥有相同的作用域。这个严重区别与C语言使用{}来定义的作用域。Closure是Javascript最有用的一个特性。

Python的作用域是由module,function,class来定义的。

Python的import可以很好的管理依赖和作用域,而Javascript没有原生的包管理机制,需要借助AMD来异步的加载依赖的js文件,requirejs是一个常用的工具。

赋值逻辑操作符

Javascript使用=赋值,拥有判断相等(==)和全等(===)两种相等的判断。其它的逻辑运算符有&& 和||,和C语言类似。

Python中没有全等,或和与使用的时and 和 or,更接近自然语言。Python中没有三元运算符 A :B ?C,通常的写法是

(A and B) or C

因为这样写有一定的缺陷,也可以写作

 B if A else C

 

Python对赋值操作的一个重要的改进是不允许赋值操作返回赋值的结果,这样做的好处是避免出现在应该使用相等判断的时候错误的使用了赋值操作。因为这两个操作符实在太像了,而且从自然语言上来说它们也没有区别。

++运算符

Python不支持++运算符,没错你再也不需要根据++符号在变量的左右位置来思考到底是先加一再赋值呢还是先赋值再加一。

连续赋值

利用元组(tuple),Python可以一次性的给多个变量赋值

(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)

 

函数参数

Python的函数参数支持命名参数和可选参数(提供默认值),使用起来很方便,Javascript不支持可选参数和默认值(可以通过对arguments的解析来支持)

1	def info(object, spacing=10, collapse=1):
2	    ... ...

 

其它

立即调用函数表达式 (IIFE

Javascript的一个方便的特性是可以立即调用一个刚刚声明的匿名函数。也有人称之为自调用匿名函数。

下面的代码是一个module模式的例子,使用闭包来保存状态实现良好的封装。这样的代码可以用在无需重用的场合。

01	var counter = (function(){
02	    var i = 0;
03	    return {
04	        get: function(){
05	            return i;
06	            },
07	        set: function( val ){
08	            i = val;
09	            },
10	        increment: function() {
11	            return ++i;
12	            }
13	        };
14	    }());

 

Python没有相应的支持。

生成器和迭代器(Generators & Iterator)

在我接触到的Python代码中,大量的使用这样的生成器的模式。

Python生成器的例子

1	# a generator that yields items instead of returning a list
2	def firstn(n):
3	    num = 0
4	    while num < n:
5	        yield num
6	        num += 1
7	   
8	sum_of_first_n = sum(firstn(1000000))

 

Javascript1.7中引入了一些列的新特性,其中就包括生成器和迭代器。然而大部分的浏览器除了Mozilla(Mozilla基本上是在自己玩,下一代的Javascript标准应该是ECMAScript5)都不支持这些特性

Javascript1.7 迭代器和生成器的例子。

01	function fib() {
02	  var i = 0, j = 1;
03	  while (true) {
04	    yield i;
05	    var t = i;
06	    i = j;
07	    j += t;
08	  }
09	};
10	 
11	var g = fib();
12	for (var i = 0; i < 10; i++) {
13	  console.log(g.next());
14	}

 

列表(字典、集合)映射表达式 (List、Dict、Set Comprehension)

Python的映射表达式可以非常方便的帮助用户构造列表、字典、集合等内置数据类型。

下面是列表映射表达式使用的例子:

1	>>> [x + 3 for x in range(4)]
2	[3, 4, 5, 6]
3	>>> {x + 3 for x in range(4)}
4	{3, 4, 5, 6}
5	>>> {x: x + 3 for x in range(4)}
6	{0: 3, 1: 4, 2: 5, 3: 6}

Javascript1.7开始也引入了Array Comprehension

1	var numbers = [1, 2, 3, 4];
2	var doubled = [i * 2 for (i of numbers)];

 

Lamda表达式 (Lamda Expression )

Lamda表达式是一种匿名函数,基于著名的λ演算。许多语言诸如C#,Java都提供了对lamda的支持。Pyhton就是其中之一。Javascript没有提供原生的Lamda支持。但是有第三方的Lamda包。

1g = lambda x : x*3

 

装饰器(Decorators)

Decorator是一种设计模式,大部分语言都可以支持这样的模式,Python提供了原生的对该模式的支持,算是一种对程序员的便利把。

Decorator的用法如下。

1	@classmethod
2	def foo (arg1, arg2):
3	    ....

 

更多decorator的内容,请参考https://wiki.python.org/moin/PythonDecorators

本人对Javascript和Python的认识有限,欢迎大家提出宝贵意见。

 

文章来自:http://my.oschina.net/taogang/blog/264351

别站着编程:站着工作未必对你的健康有好处

我曾对站立式办公的好处深信不疑。

听说这个工作方式很好,也看了不少相关的研究,我一直想要一个站立式办公桌。

美国癌症协会对12.3万人作了长达18年的跟踪调查后得出结论:每天坐超过6个小时的人的死亡率比较高

在一项超过20万人参与的调查中,研究人员发现,即便是热爱运动的人群(每周至少锻炼身体5小时),久坐也会提高他们的死亡风险。
阅读全文

JVM日志和参数的理解

写这篇wiki的目的:最近在调整Hbase的JVM,翻了些文档和wiki,想写点东西,给自己和想了解jvm日志和参数的同 学提供些帮助.


 一:理解GC日志格式,读GC日志的方法

1:开启日志

-verbose:gc

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-Xloggc:/path/gc.log

-XX:+PrintGC包含-verbose:gc

-XX:+PrintGCDetails //包含-XX:+PrintGC

只要设置-XX:+PrintGCDetails 就会自动带上-verbose:gc和-XX:+PrintGC

-XX:+PrintGCDateStamps/-XX:+PrintGCTimeStamps 输出gc的触发时间

提示:gc日志文件不会分割需要手动处理.

 2:新生代(Young GC)gc日志分析

2014-02-28T11:59:00.638+0800: 766.537:[GC2014-02-28T11:59:00.638+0800: 766.537:
[ParNew: 1770882K->212916K(1835008K), 0.0834220 secs]
5240418K->3814487K(24903680K), 0.0837310 secs] [Times: user=1.12 sys=0.02, real=0.08 secs]

阅读全文

关于Spring的69个面试问答——终极列表

这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会被问到的。下次你再也不用担心你的面试了,Java Code Geeks这就帮你解答。

大多数你可能被问到的问题都列举在下面的列表中了。所有的核心模块,从基础的Spring功能(如Spring Beans)到上层的Spring MVC框架,文章中都会进行简短的讲解。看完这些面试问题,你应该看看我们的Spring教程

我们开始吧!
阅读全文

高效程序员的特征:聪明,懒惰

这里我使用了聪明懒惰程序员这几个词。我说的这几个词的意思是:

  • 程序员:有积极活力的,专注于用代码解决真实世界里的问题
    • 不是指那些梦想家,那些永远只想不做的人
  • 聪明:能够周全的思考问题(不是那些耍小聪明的人)
  • 懒惰:就像是程序中的lazy-loading,是指延后写代码的时间(而不是无所事事的人)。

正确的软件开发应该是懒惰式开发,也被称作忍耐式开发;这种开发方式的表现是,在真正动手写代码前,程序员要花大量的时间通盘考虑所有可能的解决方案和途径。这可以看作是延缓写代码,在没有完全理解问题前绝不动手写代码。先把问题理解清楚,确保将要写的代码能真正的解决问题,这将会避免之后写出大量无用的代码。
阅读全文