Category Archives: Dev

Scala 高级函数特性

函数和其他常量、变量一样,也是一个值。

Continue reading

Posted in Dev, Java|Scala.

Linux下常见代理设置

1. 系统级
export http_proxy=username:password@my_proxy_hostname:8080

2. yum
vim /etc/yum.conf
proxy=http://my_proxy_hostname:8080
proxy_username=username
proxy_password=passwd

3. git(http://stackoverflow.com/questions/783811/getting-git-to-work-with-a-proxy-server)
git config –global http.proxy http://my_proxy_hostname:8008
or
git config –global http.proxy http://username:passwd@my_proxy_hostname:8080
此时配置会写入:
$ vim $HOME/.gitconfig
[http]
proxy = http://my_proxy_hostname:8080

unset the proxy:
git config –global –unset http.proxy
or
git config –global http.proxy “”

4. svn(http://hittyt.iteye.com/blog/889181)
vim $HOME/.subversion/servers
[global]
http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = my_proxy_hostname
http-proxy-port = 8080
# http-proxy-username = username
# http-proxy-password = password

5. maven
在$MAVEN_HOME/conf/settings.xml中可以找到,取消注释设置即可。

optional
true

http proxyuser

proxypass my_proxy_hostname

8080 local.net|some.host.com

————————————————————

6. Windows下一个比较好用的代理服务器kangle
安装之后服务已经启动,浏览器打开本机80端口,输入admin/kangle可以进行设置。
停止服务:
net stop kangle
打开服务:
net start kangle

Posted in Java|Scala, Linux.

Core Python Programming Reading Note 3

1. stringIO, CStringIO
StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO。

我们看到了StringIO的行为,基本与file一致。StringIO提供了一个方法,可以方便的获取其中的数据:StringIO.getvalue()。
如果使用read方法获取其中的数据,必须通过seek先设置”文件指针”的位置。
Python标准模块中还提供了一个CStringIO模块,它的行为与StringIO基本一致,但运行效率方面比StringIO更好。
但使用cStringIO模块时,有几个注意点:
1. CStringIO.StringIO不能作为基类被继承;
2. 创建cStringIO.StringIO对象时,如果初始化函数提供了初始化数据,新生成的对象是只读的。所以下面的代码是错误的:
s = cStringIO.StringIO(“JGood/n”);
s.write(“OOOKKK”);
2. module
模块是按照逻辑上组织Python代码的方法,那么文件爱你是物理层上组织代码的方法。因此一个文件可以被看作一个独立的模块。一个模块也可以被看作一个文件。
模块的文件名就是模块的名字加上扩展名.py。每个模块都定义了自己独立的名字空间。
模块的搜索路径:sys.path列表。像该列表加入自己的新模块路径即可:sys.path.append(“/home/luffy/pycode”)
三个名字空间:内建名字空间(__builtins__),局部名字空间和全局名字空间。最先加载的是内建空间,随后加载模块的全局名字空间。局部空间的内容是随时变化的(全局空间是不变的)。获得局部空间和全局空间的符号:globals()和locals()。

Python的一个有用的特性是你可以在任何需要房子数据的地方获得一个名字空间。所以给函数添加属性可以(例如添加version和__doc__属性等):

可以看出,局部变量和同一名字空间下的变量是不一样的。
—–习惯的import顺序—–
Python标准库模块
Python三方模块
应用程序自定义模块
—–from-import语句—–
把模块的名称引入到当前域.
但是from module import *的操作会污染当前作用域的名字空间,要谨慎shiyo
—–import xxx as yyy语句—–
import Tkinter as tk
—–引入时执行模块—–
加载模块会直接导致这个模块被执行。也就是被导入模块的顶层代码将直接被执行。
一个模块只会被加载一次,无论他被引入多少次。这可以组织多重导入时代码被多次执行。
—–模块名称重复—–

C:Usersluffy>python importer.py
importee abc
importee efg
importee abc
这种引入方法是和不好的,所以推荐使用import和白完整的标识符名称。
__import__()函数
__import__(module_name[, globals[, locals]])
reload()函数
重新导入模块。重新导入的模块需要的直接模块名而非字符串。
3. Package
包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的Python应用程序执行环境。用户解决下面问题:
为平坦的名称空间加入有层次的组织结构;
把有联系的模块结合在一起(子包);
解决有冲突的模块名称;
使用目录结构而不是一大堆混乱的文件。
初始化包需要有有一个__init__.py文件,__init__.py的文件将会被执行。否则导致一个ImportWarning信息。
sys.modules变量包含了一个由当前载入(完整&成功)到解释器的模块组成的字典。模块名作为键,它们的位置作为值。
4. lambda函数
lambda函数是一种快速定义单行的最小函数,是从 Lisp 借用来的,可以用在任何需要函数的地方。常常和map,reduce,filter等函数中使用,例如阶层:
print reduce(lambda x,y:x*y, range(1, 1001))
自定义排序方法:
list_people=[People(21,’male’),People(20,’famale’),People(34,’male’),People(19,’famale’)]
list_people.sort(lambda p1,p2:cmp(p1.age,p2.age))
其他简写:
>>> arrayA = [1,2,3,4,5,6,7]
>>> arrayB = [ number for number in arrayA if number % 2 ]
>>>people_who_want_to_watch_av_film = [person1, person2, person3, person4]
然后,我们检查他们的年龄,产生能够观看的人员的列表,并打印出来:
>>> people_who_can_watch_av_film = [‘Hi, %s %s, you can watch av!’ % (person[‘surname’], person[‘givename’]) for person in people_who_want_to_watch_av_film if person[‘age’] >= 18]
lambda工厂式:

删除之中的偶数

5. class & magic method
(1). __init__ & __del__

(2). __str__和__unicode__
__str__() is a Python “magic method” that defines what should be returned if you call str() on the object. Thus, you should always return a nice, human-readable string for the object’s __str__. Although this isn’t required, it’s strongly encouraged.

__unicode__(self)同理,调用buildin函数unicode(obj)时调用。
__repr__(self)同理,输出更详细的类型信息
(3). 私有机制
python对象没有权限控制,所有的变量都是外部可以调用的。但是程序员只有一些约定俗成的方法:私有变量加双下划线。如__name。
(4). __iter__
buildin函数iter
i1 = iter(itr, ‘c’)
这个意思是说,返回itr的iterator,而且在之后的迭代之中,迭代出来’c’就立马停止。对这个itr有什么要求呢?这个itr在这里必须是callable的,即要实现__call__函数
i1 = iter(itr)
这里itr必须实现__iter__函数,这个函数的返回值必须返回一个iterator对象

# i1必须是callable的,否则无法返回callable-iterator

(5). super()
调用父类的方法:

这里我们发现python的继承不会自动调用父类的构造器/析构器,必须亲自调用它。
1. super并不是一个函数,是一个类名,形如super(B, self)事实上调用了super类的初始化函数,产生了一个super对象;
2. super类的初始化函数并没有做什么特殊的操作,只是简单记录了类类型和具体实例;
3. super(B, self).func的调用并不是用于调用当前类的父类的func函数;
4. Python的多继承类是通过mro的方式来保证各个父类的函数被逐一调用,而且保证每个父类函数只调用一次(如果每个类都使用super);
5. 混用super类和非绑定的函数是一个危险行为,这可能导致应该调用的父类函数没有调用或者一个父类函数被调用多次。
(6). 函数的名称,doc_string
func_doc The function’s documentation string, or None if unavailable Writable
__doc__ Another way of spelling func_doc Writable
func_name The function’s name Writable
__name__ Another way of spelling func_name Writabl
(7). magic method
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
object.__cmp__(self, other) #Called by comparison operations if rich comparison (see above) is not defined. Should return a negative integer if self other
object.__hash__(self) #Called by built-in function hash()
If a class does not define a __cmp__() or __eq__() method it should not define a __hash__() operation either;
if it defines__cmp__() or __eq__() but not __hash__(), its instances will not be usable in hashed collections.
If a class defines mutable objects and implements a __cmp__() or __eq__() method, it should not implement __hash__(),
since hashable collection implementations require that a object’s hash value is immutable
(if the object’s hash value changes, it will be in the wrong hash bucket).

Posted in Python|R.

Core Python Programming Reading Note 2

1. zip, enumerate
enumerate(list) 参数为可遍历的变量,为字符串或列表,返回(index,元素)的组合。
例1 找到某一个字符串中1出现的位置:

例2:

Continue reading

Posted in Python|R.

Core Python Programming Reading Note 1

1. build-in functions
int(obj)
str(obj)
len(obj)
type(obj)
help(obj) 获得对象说明
dir(obj) 显示对象属性/方法列表

操作和man帮助类似,space翻页,q退出。
2. id, type, isinstance
每一个对象有一个id值,使用id()函数得到的。对象还可以使用type()来获得类型信息。

关于类和对象的类型:

判断对象是不是某个类的:isinstance函数:

当一个对象的引用计数为0时,将会被gc自动收集。
3. eval,exec,compile
eval(str [,globals [,locals ]])
函数将字符串str当成有效Python表达式来求值,并返回计算结果。
同样地, exec语句将字符串str当成有效Python代码来执行..exec(str) 这种形式也被接受,但是它没有返回值。
最后,execfile(filename [,globals [,locals ]])
函数可以用来执行一个文件,看下面的例子:

默认的,eval(),exec,execfile()所运行的代码都位于当前的名字空间中. eval(), exec,和 execfile()函数也可以接受一个或两个可选字典参数作为代码执行的全局名字空间和局部名字空间. 例如:

# 将上边的字典作为全局和局部名称空间

如果你省略了一个或者两个名称空间参数,那么当前的全局和局部名称空间就被使用。
注意例子中exec语句的用法和eval(), execfile()是不一样的. exec是一个语句(就象print或while), 而eval()和execfile()则是内建函数.
当一个字符串被exec,eval(),或execfile()执行时,解释器会先将它们编译为字节代码,然后再执行.这个过程比较耗时,所以如果需要对某段代码执行很多次时,最好还是对该代码先进行预编译,这样就不需要每次都编译一遍代码,可以有效提高程序的执行效率。
compile(str ,filename ,kind )函数将一个字符串编译为字节代码, str是将要被编译的字符串, filename是定义该字符串变量的文件,kind参数指定了代码被编译的类型– ‘single’指单个语句, ‘exec’指多个语句, ‘eval’指一个表达式. cmpile()函数返回一个代码对象,该对象当然也可以被传递给eval()函数和exec语句来执行,例如:

4. is(is not) & ==(!=)
is 是变量是否指向同一对象,即id()的相同。==是对象的内容是否相等(通过对象内建函数__cmp__来定义)。

需要注意的是,数值常量和字符串常量会被哈希缓冲。所以指向相同字符串的变量,其id也会相同。
几种python中没有的机制:
a). 不分float, double,只有float
b). 没有指针
c). 没有char/byte类型
d). 没有short类型,但是有int和long。其类型自动判断。

★5. map, reduce, filter, apply
使用C语言编写并作了优化,代替循环来提升性能。
map(fun , list) #将list的每个元素作用于一元函数fun,并且返回所有fun值的列表

apply(func [, args [, kwargs ]]) #间接执行一个函数func,它的参数在列表args中,或者在字典kwargs中。apply的返回值就是func的返回值。apply()的元祖参数是有序的,元素的顺序必须和func()形式参数的顺序一致。
#需要把一个图片拆分为大小相同的很多的小图片。按照以前写程序的思想就是写两重循环了,枚举开始左上角的点。

在数据分析时,集合对象的操作和map,filter,reduce等函数尤其重要。

Book 《Python核心编程 第二版》

Posted in Python|R.

Scala类的方法命名约定

对于一般的方法,则调用的目标是运算符前面的实例

这里相当于调用了s.^(T(“HELLO WORLD”) )
如果方法以冒号:结尾,那么调用目标的是运算符后面的实例。

另外,一元运算符+ – ! ~也是以其后的实例为目标的,会映射成unary_+()等方法。

Posted in Java|Scala.

【APUE】UNIX下的文件操作

1. 内核文件数据结构

内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程的影响。
(1). 每个进程在进程表中都一个记录项(task_struct),包含一个打开文件描述符表(存放在用户空间)。每个文件描述符为表中一项,包括文件描述符标识和指向一个文件表项的指针。
(2). 内核为所有打开文件维持一张文件表,每个文件表项包括:
a). 文件状态标识(RD, WR, APPEND, 同步和非阻塞等)。注意,文件描述符作用域是一个进程,而文件状态标识则适用于指向文件表中该表项的所有进程的描述符。使用fcntl函数来修改这两个结构。下面第3节将会解释。
b). 当前文件偏移量
c). 指向该文件v节点表项的指针。
(3). 每个打开文件或设备都有一个v-node结构,包含文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v-node还包含了该文件的i-node节点(i-node包含文件所有者、长度、所在设备、指向文件数据库在磁盘上位置的指针等)。这些信息是打开文件时从磁盘读入内存的,所以所有关于文件的信息都是快速可以使用的。
Linux没有使用v-node,而是使用了通用的i-node节点结构。虽然两者实现有所不同,但在概念上,v-node和i-node是一样的,都指向文件系统相关的i-node结构。
Continue reading

Posted in C|C++, Linux.

UNIX文件信息

1. stat, fstat和lstat

stat, fstst, lstat – get file status

stat() stats the file pointed to by path and fills in buf. lstat() is identical to stat(), except that if path is a sym‐bolic link, then the link itself is stat-ed, not the file that is refers to.
fstat() is identical to stat(), except that the file to be stated is specified by the file descriptor fd.
Continue reading

Posted in C|C++, Linux.

UNIX进程环境和动态链接

1. 环境表

每个程序都会从父进程那里接收一张环境表。和参数包一样,环境表也是一个字符指针数组,其中每个指针包含你一个null结束的C字符串地址。全局变量environ则包含该指针数组地址,称为环境指针。环境指针指向环境表,保存每个环境字符串的地址。每个环境字符串都是name=value的形式。可以用getenv和putenv来访问特定的环境标量。
extern char **environ;
环境指针—–> 环境表:
environ—–> 环境字符串地址—–> HOME=/home/luffy
环境字符串地址—–> PATH=:/bin:/usr/bin
环境字符串地址—–> SHELL=/bin/bash
环境字符串地址—–> USER=luffy
环境字符串地址—–> LOGNAME=luffy
Continue reading

Posted in C|C++, Linux.

UNIX进程控制

1. 交换进程与init进程
进程ID0是调度进程,常常被称为交换进程(swapper)。该进程并不执行任何磁盘上的程序。它是内核的一部分,因此也被称为系统进程。
进程ID1通常是init进程,在自举过程结束时由内核调用(swapper进程创建一个内核线程,然后exec来执行init)。该进程的程序文件/sbin/init。此进程负责在内核自举后启动一个UNIX系统。init通常读与系统有关的初始化文件(/etc/rc*),并将系统引导到一个状态(例如多用户)。虽然init是一个普通的用户进程(swapper进程是内核的系统进程而非用户进程),但init进程决不会终止。但是它以超级用户特权运行。
在某些UNIX的虚存实现中,进程PID=2是页精灵进程(page daemon)。此进程负责支持虚存系统的请页操作。与交换进程一样,页精灵进程也是内核进程。
Continue reading

Posted in C|C++, Linux.