显示标签为“BookNote”的博文。显示所有博文
显示标签为“BookNote”的博文。显示所有博文

2015年4月21日星期二

笔记:基于开源工具的数据分析

chap 2

cdf 累积分布函数
分位数图是将x轴与y轴互换的cdf图
概率图的目的是判断一个给定的数据集是否来自一个特定的已知分布。例如,很多统计技术都假设误差或残差服从高斯分布,概率图可用于验证该假设是否成立。

秩序图














帕累托图


箱形图

2013年4月26日星期五

笔记:Practial Common Lisp

命名列表

CL-USER> (getf (list :a 1 :b 2 :c 3) :a)
1



format循环打印

(defun dump-db ()
  (format t "~{~{~a:~10t~a~%~}~%~}" *db*))

其中 ~{ ~} 进入一层循环,~% 换行,~a 打印字符, ~10t 格式化字符串间距


根据指定的selector-fn条件,选取出对应的行,进行更新

(defun update (selector-fn &key title artist rating (ripped nil ripped-p))
  (setf *db*
        (mapcar
         #'(lambda (row)
             (when (funcall selector-fn row)
               (if title    (setf (getf row :title) title))
               (if artist   (setf (getf row :artist) artist))
               (if rating   (setf (getf row :rating) rating))
               (if ripped-p (setf (getf row :ripped) ripped)))
             row) *db*)))


前面加'(),括号里的内容当数据处理,不执行
> (list 1 2 '(+ 1 2))
(1 2 (+ 1 2))

前面加反引号的话,只有,()里面的内容才被解释执行(注意前面有个逗号),其余都当成列表数据
`(1 2 (+ 1 2))       → (1 2 (+ 1 2))
`(1 2 ,(+ 1 2))      → (1 2 3)

加,@() 往里拆一层出来
`(and ,(list 1 2 3))  → (AND (1 2 3))
`(and ,@(list 1 2 3)) → (AND 1 2 3)

闭包

(let ((count 0))
  (list
   #'(lambda () (incf count))
   #'(lambda () (decf count))
   #'(lambda () count)))


赋值
Simple variable:    (setf x 10)
Array:              (setf (aref a 0) 10)
Hash table:         (setf (gethash 'key hash) 10)
Slot named 'field': (setf (field o) 10)


宏参数
  •  &optional 可选
  •  &key  参数以关键字表示(类似perl里的hash)
  •  &rest 剩余参数,也可写作 &body
在宏里面新建变量的时候,记得用上GENSYM,不然命名重复的话,宏展开后执行可能出错



2013年3月11日星期一

笔记:Land of Lisp

chap 2 - chap 4

(defparameter *foo* 6)  全局变量,可修改
(defvar *foo* 5) 全局变量,只在定义时赋值一次
(let (a 5)) 词法变量

defun 定义全局函数
flet 定义局部函数,函数间不可相互引用
labels 定义局部函数,函数间可相互引用

'(expt 2 3) 数据模式
(expt 2 3) 代码模式

列表连接
> (cons 'pork (cons 'beef (cons 'chicken ())))
(PORK BEEF CHICKEN)

首个元素
> (car '(pork beef chicken))
PORK

除掉首个元素之后的列表
> (cdr '(pork beef chicken))
(BEEF CHICKEN)

除掉首个元素之后的列表,之后再取首个元素 =》 第二个元素嘛。。。
> (cadr '(pork beef chicken))
BEEF

还有 cddr, caddr, cddar, cadadr 等等

按顺序执行语句,最后一条语句的运行结果作为返回值
> (progn (setf *number-was-odd* t)
'odd-number)

when / unless 与progn类似,不过多一个判断条件

cond 条件可以写的比较复杂,case一般用于字符串比对

if 的结构相对简单,一个判定条件,2个分支
> (if (member 1 '(3 4 1 5))
'one-is-in-the-list
'one-is-not-in-the-list)

检查1个元素是否在列表里,如果存在,则返回以该元素为起始的剩余元素列表
> (member 1 '(3 4 1 5))
(1 5)

指定函数,对列表做grep
> (find-if #'oddp '(2 4 5 6))

eq 做符号比较
equal 做多种类型数据比较
eql 做数值和符号比较
equalp 比较复杂的比较

chap 5 - chap 6

mapcar相当于列表做函数映射(perl中的map)

apply的第一个参数指定调用函数,后面是调用该函数时传入的参数列表
>(defun describe-paths (location edges)
(apply #'append (mapcar #'describe-path (cdr (assoc location edges)))))


根据指定的key找出符合条件的记录
> (find 'y '((5 x) (3 y) (7 z)) :key #'cadr)
(3 Y)

print 每个元素单独打一行
prin1 不加换行符打印
princ 打印字符
read 输入
#\newline #\tab #\space 换行符、tab符、空格符


转换字符串列表
>(defun tweak-text (lst caps lit)
  (when lst
    (let ((item (car lst))
          (rest (cdr lst)))
      (cond ((eql item #\space) (cons item (tweak-text rest caps lit)))
            ((member item '(#\! #\? #\.)) (cons item (tweak-text rest t lit)))
            ((eql item #\") (cons item (tweak-text rest caps (not lit))))
            (lit (cons item (tweak-text rest nil lit)))
            (caps (cons (char-upcase item) (tweak-text rest nil lit)))
            (t (cons (char-downcase item) (tweak-text rest nil nil)))))))

> (tweak-text  '(#\a #\Space #\b) 't 'nil)
(tweak-text  '(#\a #\Space #\b) 't 'nil)

总共6个可能:
  1. 如果是空格,原样输出
  2. 如果是!/?/. 等结束符,下个字符就转成大写(tweak-text rest t lit)
  3. 如果是"子字符串,则转换之前的lit模式
  4. 如果正处于lit模式,则不强制转换成大写 (tweak-text rest nil lit)
  5. 如果caps为真,则强制转换为大写,后面默认不转换(cons (char-upcase item) (tweak-text rest nil lit))
  6. 否则,转换为小写,后面默认不转换 (cons (char-downcase item) (tweak-text rest nil nil))
> (defun game-print (lst)
 (princ (coerce (tweak-text (coerce (string-trim "() "
 (prin1-to-string lst))
'list)
t
 nil)
'string))
(fresh-line))

> (game-print  '(i am a. test "c aNnd d" b))
I am a. Test "c aNnd d" b


注意game-print的处理过程:




lambda函数

> (mapcar (lambda (n) (/ n 2)) '(2 4 6))
(1 2 3)

chap 7

循环列表,将foo尾部指针指向foo首部
> (defparameter foo '(1 2 3))
FOO
> (setf (cdddr foo) foo)
#1=(1 2 3 . #1#)
把exp中非字母数字类的字符都转换成_
(defun dot-name (exp)
(substitute-if #\_ (complement #'alphanumericp) (prin1-to-string exp)))

截取字符串s的前 *max-label-length* -3 个字符,后面加3个点
(concatenate 'string (subseq s 0 (- *max-label-length* 3)) "...")

一张edges图中有多个node,每个node有多个edge,按结构嵌套处理
(defun edges->dot (edges)
  (mapc (lambda (node)
    (mapc (lambda (edge)
      (fresh-line)
      (princ (dot-name (car node)))
      (princ "->")
      (princ (dot-name (car edge)))
      (princ "[label=\"")
      (princ (dot-label (cdr edge)))
      (princ "\"];"))
  (cdr node)))
edges))
调用thunk函数,输出的结果写入fname文件,再执行指定shell命令画图
(defun dot->png (fname thunk)
 (with-open-file (*standard-output*
fname
:direction :output :if-exists :supersede)
 (funcall thunk))
(ext:shell (concatenate 'string "dot -Tpng -O " fname)))

maplist对列表的cdr依次调用指定的函数

(defparameter *wizard-edges* '((living-room (garden west door)
(attic upstairs ladder))
(garden (living-room east door))
(attic (living-room downstairs ladder))))

(defun uedges->dot (edges)
 (maplist (lambda (lst)
    (mapc (lambda (edge)
     (unless (assoc (car edge) (cdr lst))
       (fresh-line)
       (princ (dot-name (caar lst)))
       (princ "--")
       (princ (dot-name (car edge)))
       (princ "[label=\"")
       (princ (dot-label (cdr edge)))
       (princ "\"];")))
      (cdar lst)))
edges))

  用maplist遍历edges子集合,注意每次遍历都是取cdr

  每次遍历,先用(cdar lst)取出此次首个对象对应的边的集合

  以首次遍历的节点living-room为例,就有两条边(garden west door)、(attic upstairs ladder)
 
  对于每一条边,检查这条边的节点(car edge) = garden、attic,是否会在后面(cdr lst) =(garden, attic)遇到

  如果后面还会遇到,就先不打印,死撑到最后。。。

  通过maplist、assoc的判断,实现去重,很漂亮!

chap 8

循环

(loop repeat 10
collect 1)

(loop for n from 1 to 10
collect n)


取出所有从node能够到达的节点集合visited

取出node起始的边:(direct-edges node edge-list)

从node指向的节点开始递归遍历:(traverse (cdr edge))
(defun get-connected (node edge-list)
 (let ((visited nil))
(labels ((traverse (node)
(unless (member node visited)
 (push node visited)
 (mapc (lambda (edge)
(traverse (cdr edge)))
(direct-edges node edge-list)))))
(traverse node))
visited))

分割出不相邻的节点集:
从nodes取出一个节点node,然后调用get-connected遍历,得到该节点node能够到达的节点集合connected
对剩余unconnected的节点集合重复上述处理过程 

(defun find-islands (nodes edge-list)
(let ((islands nil))
 (labels ((find-island (nodes)
(let* ((connected (get-connected (car nodes) edge-list))
(unconnected (set-difference nodes connected)))
(push connected islands)
 (when unconnected
(find-island unconnected)))))
(find-island nodes))
islands))

按顶点置换边集合:
把(1 2) (1 3) 换成(1 (2) (3))
(remove-duplicates (mapcar #'car edge-list)) 取出不重复的顶点集
对每个顶点node1,取出对应的边集合(remove-duplicates (direct-edges node1 edge-list)
把每个边集合的顶点换成list形式 (list (cdr edge))

(defun edges-to-alist (edge-list)
   (mapcar (lambda (node1)
            (cons node1
                   (mapcar (lambda (edge)
                            (list (cdr edge)))
                            (remove-duplicates (direct-edges node1 edge-list)
                                              :test #'equal))))
          (remove-duplicates (mapcar #'car edge-list))))

添加cops标记
对于每个顶点的alist集合做处理:(1 (2) (3))
例如node1 = 1 , node1-edges = (2) (3)
如果nod1-edges里的顶点node2,与node1连接的边正好在edges-with-cops边集合里
则把(node2) 转换成(node2 'cops),否则,原样输出edge
(defun add-cops (edge-alist edges-with-cops)
   (mapcar (lambda (x)
            (let ((node1 (car x))
                  (node1-edges (cdr x)))
              (cons node1
`                     (mapcar (lambda (edge)
                              (let ((node2 (car edge)))
                              (if (intersection (edge-pair node1 node2)
                                                  edges-with-cops
                                                  :test #'equal)
                                    (list node2 'cops)
                                  edge)))
                            node1-edges))))
          edge-alist))

检查是否至少有一个cops
(some #'cdr (cdr (assoc n edge-alist)))
mapcan 将map之后的结果都合并成一个列表
> (defun ingredients (order)
     (mapcan (lambda (burger)
                (case burger
                   (single '(patty))
                   (double '(patty patty))
                   (double-cheese '(patty patty cheese))))
             order))
INGREDIENTS
> (ingredients '(single double-cheese double))
'(PATTY PATTY PATTY CHEESE PATTY PATTY)

chap 9

这章草草看过,回头有空重读一下。。。说实话,这个作者真话痨。。。

数组赋值
> (defparameter x (make-array 3))
#(NIL NIL NIL)
> (setf (aref x 1) 'foo)
FOO
> x
#(NIL FOO NIL)
> (aref x 1)
FOO

列表赋值
> (setf foo '(a b c))
(A B C)
> (second foo)
B
> (setf (second foo) 'z)
Z
> foo
(A Z C)

HASH赋值
> foo
#(NIL NIL (X Y Z) NIL)
> (setf (car (aref foo 2)) (make-hash-table))
#S(HASH-TABLE)
> (setf (gethash 'zoink (car (aref foo 2))) 5)
5
> foo
#(NIL NIL (#S(HASH-TABLE (ZOINK . 5)) Y Z) NIL)

aref在数据量较大的时候比nth快得多,nth仅适用于小数据量
> (nth 1 '(foo bar baz))
BAR

用values关键字让函数返回多个值
> (defun foo ()
    (values 3 7))
FOO
> (foo)
3 ;
7

默认只取第1个返回值,也可用multiple-value-bind绑定多个返回值
> (+ (foo) 5)
8
> (multiple-value-bind (a b) (foo)
                       (* a b))
21

hash版本的edges
 (defun hash-edges (edge-list)
   (let ((tab (make-hash-table)))
     (mapc (lambda (x)
            (let ((node (car x)))
               (push (cdr x) (gethash node tab))))
          edge-list)
     tab))

定义结构体
> (defstruct person
             name
             age
             waist-size
             favorite-color)
PERSON

新增一个对象
> (defparameter *bob* (make-person :name "Bob"
                                   :age 35
                                   :waist-size 32
                                   :favorite-color "blue"))
*BOB*

对象属性取值、赋值
> (person-age *bob*)
35
> (setf (person-age *bob*) 36)
36

直接批量赋值
 > (defparameter *that-guy* #S(person :name "Bob" :age 35 :waist-size 32 :favorite-color "blue"))

一些序列处理函数,find-if 过滤、count 计数、position 首次出现的位置、some 至少存在一个元素满足断言、every 每个元素都满足断言
> (find-if #'numberp '(a b 5 d))
5
> (count #\s "mississippi")
4
> (position #\4 "2kewl4skewl")
5
> (some #'numberp '(a b 5 d))
T
> (every #'numberp '(a b 5 d))
NIL
求和
> (reduce #'+ '(3 4 6 5 2))
20

取出最大的偶数
 > (reduce (lambda (best item)
             (if (and (evenp item) (> item best))
                 item
               best))
          '(7 4 6 5 2)
           :initial-value 0)
6

初始化数组
(make-array 5 :initial-contents '(1 2 3 4 5))

以list形式返回map结果
> (map 'list
       (lambda (x)
            (if (eq x #\s)
               #\S
               x))
       "this is a string")
 (#\t #\h #\i #\S #\  #\i #\S #\  #\a #\  #\S #\t #\r #\i #\n #\g)

子字符串
> (subseq "america" 2 6)
"eric" 
排序
> (sort '(5 8 2 4 9 3 6) #'<)
(2 3 4 5 6 8 9)

接口固定,根据参数类型处理(适用于简单判断)
> (defun add (a b)
     (cond ((and (numberp a) (numberp b)) (+ a b))
           ((and (listp a) (listp b)) (append a b))))
ADD
> (add 3 4)
7
> (add '(a b) '(c d))
(A B C D)

接口固定,支持多种参数类型处理(扩展性好)
> (defmethod add ((a number) (b number))
     (+ a b))
ADD
> (defmethod add ((a list) (b list))
     (append a b))
ADD

chap 10

循环例子


chap 11

输出内容到 t 终端 / nil字符串 / stream
> (format t "Add onion rings for only ~$ dollars more!" 1.5)
Add onion rings for only 1.50 dollars more!
NIL
~s会保留",而~a会去掉分隔符
> (format t "I am printing ~s in the middle of this sentence." "foo")
I am printing "foo" in the middle of this sentence.
> (format t "I am printing ~a in the middle of this sentence." "foo")
I am printing foo in the middle of this sentence.
> (format t "I am printing ~10a within ten spaces of room." "foo")
I am printing foo        within ten spaces of room.
> (format t "I am printing ~10@a within ten spaces of room." "foo")
I am printing        foo within ten spaces of room.

打印数组
> (format t "~{I see a ~a... or was it a ~a?~%~}" *animals*)

两种换行
> (progn (format t "this is on one line ~%")
(format t "~%this is on another line"))
this is on one line

this is on another line
> (progn (format t "this is on one line ~&")
(format t "~&this is on another line"))
this is on one line
this is on another line
此外还有数值处理,居中、两端对齐等等,用的时候再翻书

chap 12

写文件
> (with-open-file (my-stream "data.txt" :direction :output)
 (print "my data" my-stream))

读文件
> (with-open-file (my-stream "data.txt" :direction :input)
(read my-stream))
"my data"

写字符串
> (defparameter foo (make-string-output-stream))
> (princ "This will go into foo. " foo)
> (princ "This will also go into foo. " foo)
> (get-output-stream-string foo)
"This will go into foo. This will also go into foo. "

 socket的简单例子
> (defparameter my-socket (socket-server 4321)) ;ON THE SERVER
MY-SOCKET
> (defparameter my-stream (socket-accept my-socket)) ;ON THE SERVER

> (defparameter my-stream (socket-connect 4321 "127.0.0.1")) ;ON THE CLIENT
MY-STREAM
> (print "Yo Server!" my-stream) ;ON THE CLIENT
"Yo Server!"

> (read my-stream) ;ON THE SERVER
"Yo Server!"
> (close my-stream)
T

chap 13

写了一个简单的web server

包括解析url,解析参数,解析http header,根据请求参数进行应答等等


chap 14

介绍函数式编程


chap 15

又是一个游戏


chap 16  宏

;This function is finally safe to use
(defmacro split (val yes no)
 (let1 g (gensym)
 `(let1 ,g ,val
(if ,g
(let ((head (car ,g))
(tail (cdr ,g)))
,yes)
,no))))
其中,gensym是为了避免调用的时候也有变量名为g,导致冲突出错


chap 17

DSL介绍,举了svg的例子,大概就是新建一些函数or宏,生成特定格式的文件or转换为特定格式的内容

比较灵活,容易自行扩展,但只适用于特定领域

chap 18

延迟求值

chap 19

游戏例子,没看

chap 20

还是游戏例子,没看

2012年11月4日星期日

大数据 : 笔记 chap 7 聚类

欧氏空间下,簇的半径(radius)是指簇内所有点到质心的最大距离

非欧空间下,选取簇中的一个点来代表整个簇,一般是最小化中心点到簇内其他点的距离

BFR算法

k-means的一个变形,主要是在高维欧氏空间中对数据进行聚类。对簇的形状给出了一个非常强的假设,即它们必须满足以质心为期望的正态分布。

用<点数N,所有点在每一维的分量和,所以有点在每一维的分量平方和>表示点集,方便扩展

2012年10月31日星期三

R语言数据操作:笔记 chap 8

按地区划分收入高于和低于收入中位数的州的数量:
hiinc = state.x[ , 'income' ] > median(state.x[ , 'income' ])

stateinc = table(state.region , hinnc)

#f_stateinc 共三列:state.region, hinnc, freq(频数)

f_stateinc = as.data.frame(stateinc)

按各列取值去重,算频数:
as.data.frame( table(x) )

添加行合计/列合计:
tt = table(infert$edu, infert$partity)

addmargins(tt,c(1,2))

频率统计:prop.table

按列计算:
sumfun = function(x) c(n=sum(!is.na(x)), mean = mean(x), sd=sd(x))

x = apply(somedata, 2, sumfun)

矩阵每一列除以该列的最大值:
maxes = apply(somedata,2,max)

final = sweep(somedata,2,maxes,"/")

按time和diet分组,求weight的均值:
cweights = aggregate(data$weight,data[c('time','diet')], mean)

cweights = tapply(data$weight, data[c('time', 'diet')], mean)



mclick = melt(somedata, measure.var = 'weight')

cast(mclick, diet + time ~ variable, mean)

reshape包

以region为行,求各变量的均值
cast(somedata,region~variable,mean)

以每个变量为一行
cast(somedata,variable~region,mean)

指定变量子集
cast(somedata, region~variable, mean, subset=variable %in% c('population', 'life'))

求各列变量均值、中位数、标准差
cast(somedata, variable~., c(mean,median,sd))

按region汇总各列变量均值、中位数、标准差
cast(somedata, region~variable, c(mean,median,sd))

2012年7月2日星期一

笔记:数学之美

P74
我一直认为,一个人想要在自己的领域做到世界一流,他的周围必须有非常多的一流人物。
有道理。

物以类聚,人以群分。

蓬生麻中,不扶自直;白沙在涅,与之俱黑。

你的兴趣是啥?想追求什么?价值何在?

君子博学而日参省乎己,则知明而行无过矣。

真正做好一件事没有捷径,需要一万小时的专业训练和努力。
确实。

勿在浮沙筑高台。

我能保证的事,是不做【不经思考、为了KPI去走所谓捷径】,不做【所谓敏捷、再不断返工或直接报废】的活。

这不是我自己的人生里,最美好的年华,所应该做的事。

早在AT&T,他旧对搜索问题的各个西街进行了仔细的研究,他的那些简单而有效的解决方案,常常是深思熟虑去伪存真的结果。其次,辛格坚持每天要分析一些搜索结果不好的例子,以掌握第一手资料,即使在他成为Google Fellow以后,依旧如此。
试问今日之中国,有多少码农想着做几年技术转管理?

如何提升境界?

技无止境,唯勤而已。
 
用"凑"的方法来解决问题,在中国尤其如此。这样的做法说得不好听,就是山寨。

上了市、有了钱甚至利润成为了在世界上也数得上的公司,做事情依然如此,就让人觉得境界低。

需要境界,需要境界。

2012年2月19日星期日

笔记:构建可扩展的WEB站点

DNS负载均衡的一个问题:由于缓存时间,很难做到快速移除一台机器。
LVS负载均衡:能够提供在线故障转移。
GSLB:提供的是与DNS最近度量的DC地址,而非用户所在地最近的DC地址。此外,我们不能仅返回最近的DC,这会丢失在DC失效时故障转移的能力。可以返回排好序的IP地址,但是中途的DNS可能打乱这个序列;可以多次包含某个IP地址,但仅是增大用户就近访问该IP的概率,而不是确定性
还有一种是利用路由处理。需要有自治系统AS号码,以及各个DC的ISP合作。在DC1故障时,发布BGP路由将流量引到DC2。
Akamai的EdgePlatform服务,提供故障转移功能。

2011年10月8日星期六

笔记:智能WEB算法

Lucene 读取文档,分词,索引,搜索 =》 其中,分词至关重要

PageRank 链接分析,认为用户更有可能点击他认为正确的搜索结果

基于用户相似度的推荐是可靠的,但用户量大时会比较低效

基于条目相似度数量级相对较小,较为可行

基于内容相似度有词法分析精度的问题

商用推荐系统的一个要求是,在不牺牲推荐质量的前提下具有进行实时推荐的能力

数据的特性决定了算法能否成功

聚类没有任何先验知识,因此是"无监督学习"

层次型聚类是在分组中识别分组

凝聚型聚类自底向上关联分组

高维度扩大了数据点所分布的空间,就很难判断出聚类的优劣;并且,在高维度空间中,任何数据集的数据点,无论用何种距离度量,数据点之间的差异都会变小

有可能你的分类器在一个小规模数据集工作良好,但当它作用于一个充分大的数据集时,表现急剧下降。

如果一个分类器极其精确但极其缓慢,它其实与废物差不多!

如果你使用的是基于规则的系统,也许会遇到可用性问题,学习的过程-规则的收集-会导致生产环境中的系统整体变得缓慢起来。

分类方案应该易于维护、易于测试、并且还要能够迅速的产生结果。

更多的数据并不一定意味着更多的信息量。

监督学习:我们告诉分类器应该懂得什么,然后它就尝试着通过修改自身的参数来同化这些知识,例如贝叶斯、神经网络权重、基于规则。

如果你没有告诉分类器什么是正确的,那它该如何工作?

分类器融合:降低单分类器用于未知数据的风险;平滑每个分类器在训练集中的敏感性;表达性组合效果更好。

一个分类器如果输入受到轻微的扰动时会产生不一样的输出,就称为是非稳定的。

搜索、推荐、聚类、分类

2011年9月12日星期一

笔记:JavaScript 高级程序设计 第2版 (Nicholas C.Zakas)

如果将document.domain设置为wrox.com之后,就不能再将其设置回p2p.wrox.com,否则将会导致错误。
使用innerText/innerHTML/outerText/outerHTML替换子节点可能会导致浏览器的内存问题,尤其是在IE中。最好先手工移除被删除子树中的事件处理程序及javascript对象属性。
addEventListener,最好将事件处理程序添加到事件流的冒泡阶段,可以最大限度的兼容浏览器。
添加到页面上的事件处理程序数量将直接关系到页面的整体运行性能。
CSRF 未被授权的系统伪装自己,让服务器认为它是合法的,从而获取某个资源。可选的方案:1)SSL连接;2)每次请求均附验证码。无效的方案:1)用POST而非GET;2)检查来源URL;3)验证cookie。
如果某个域的资源并没有允许访问,javascript就不应该能够请求该域中的资源。js默认只能访问包含它的页面的同一个域下的资源。
跨域请求和响应中不应携带cookie,且要确保未经授权无法访问相应资源。
访问内部资源时用相对url,访问远程资源时用绝对url。
json解析很快,但是eval()比较危险,需要对传给eval的参数进行检查,避免恶意内容XSS的攻击。
同源策略:相同的域,相同的端口,相同的协议
cookie数据并非存储在一个安全环境中,其中包含的任何数据都可以被他人访问。
不要在客户端机器用javascript存储敏感数据,因为数据缓存并不加密。
避免创建多个全局变量和函数,使用命名空间。
最小化现场更新,即,最小化对用户的显示进行更新,可以使用文档碎片createDocumentFragment。
HTML跨文档消息传递,用于支持不同域名的文档通信;不允许对另一个文档的DOM和相关信息直接访问,但允许发送和接收包含数据的消息。

2011年8月3日星期三

笔记:JavaScript 权威指南

chapter 1 - 10

变量没有块级作用域,在函数中任意位置定义的变量,在整个函数体都可用

函数使用变量时,先从局部作用域开始找,然后才是全局作用域

typeof(null) 返回的是object,而不是undefined

void舍弃运算数的值,返回undefined

抛出异常 if(x<0) throw new Error(“x must not be negative”); 后javascript解释器会跳转到最近的异常处理器(一直往上找,如果没找到就作为错误处理)

try/catch/finally块,finally一定会执行,就算try中间要跳走,也要等finally执行了再说

object.property 这个属性名是标识符,静态对象硬编码,比较像C++中的静态对象

object[“property”] 这个属性名是字符串值,可以动态指定,相当于关联数组

slice函数返回指定数组的一个片段,splice函数用于插入或删除数组元素

search函数返回第一个匹配的位置

replace函数是正则替换

match函数是正则匹配

exec函数是每次调用执行一次匹配尝试,index往前走

test是尝试匹配一次,返回true/false


chapter 11

function定义的函数使用词法作用域
   
var x = “global”;

function f() {

var x = “local”;

function g() { alert(x); }

g();

}

f();  //打印出local

Function() 创建的函数不使用词法作用域,而是当作顶级作用域编译
   
var y = “global”;

function constructFunction() {

var y = “local”;

return new Function(“return y”);

}

alert(constructFunction()());  //打出global


chapter 12

html解析器遇到script时,必须停止解析文档,等待script执行。如果script指定defer属性,表示这块script不生成任何文档输出,浏览器可以继续解析html文档,推迟执行script

脚本执行过程是浏览器进行HTML解析的一部分,如果一个脚本在<head>出现,那么该文档的<body>就还没有被定义,也就是说文档主体还没有被创建,脚本不能对它作操作

onload是当文档或框架被完全装载时调用的,onunload是在刚要卸载页面之前执行的(浏览器要显示新页面了)

reload()重新载入当前页面,replace()替换当前页面(history会失效)

如果一个frame设置了name,例如<frame name=”test_frame” src=”test.html”>,则兄弟框架可以用parent.test_frame引用之

document.write()动态生成文档

cookie的secure属性为真时,表示只有在https和安全协议连在一起时被传输

2011年7月11日星期一

笔记:Learning Perl 第6版

正则式描述符:
/a 表示匹配ascii字符
/u   表示匹配unicode字符
/l 表示匹配本地字符
命名匹配: (?<name>\w+)
在正则式中复用之前的命名匹配:\g{name} 或 \k<name>
匹配完取内容:$+{name}
image
相对于given-when的默认smart match,也可以用以前正则匹配的dump match
在when的代码块末尾加continue,就会继续往下匹配,而不是默认的有个匹配后跳出given-when检查
获取外部命令输出的模块  IPC::System::Simple
执行指令挂掉检查,autodie配合Try::Tiny来用
每次取三个元素出来处理:
image
附录有介绍unicode

2011年6月20日星期一

笔记:HTTP The Definitive Guide

Media Types:browser根据指定的MIME类型处理收到的数据

100 Continue :  收到request的一部分内容,client得继续交

101 Switching Protocols : server按client要求的换协议了

如果client没发entity,就不要发100-continue的Expect头给server

如果server没收到client的100-continue Expect头,就不能发100 Continue的状态码给client

如果中间节点收到的response包含Connection header,它会按Connection header的做,然后把Connection头删掉再传给用户

中间透明代理如果不看Connection:Keep-Alive就转发给server,就会导致server一直到超时都不关连接,同时client给proxy的keep-alive信息被proxy忽略。因此,代理绝对不能转发Connection头

Proxy-Connection头,绕过上述问题:如果代理不认识Proxy-Connection,就当传了一个未知头;如果中间代理支持Connection:keep-alive,就把Proxy-Connection换成Connection传给server

连接方式:

    Parallel connection 同时起多个TCP连接,对内存/CPU要求高
    Persisten connection  延长TCP连接使用时间,重用已有TCP连接发起新的HTTP请求,keep-alive;一次发一个request;server返回的内容要在length
    Pipeline connection :只有确认已经使用了持久连接,才能用pipeline;不需等前一个request的response返回,就可以发新的request

Keep-Alive: max=5,timeout=120 最多5个HTTP会话,120秒超时

Chapter 5 - 10

web server 处理并发连接的方式:
  • single thread
  • multiprocess and multithread
  • multiplex i/o
  • multiplexed multithread
几种proxy:
  • surrogate,或称reverse proxy、server acccelerator
  • transcoder,可以修改server给的response,比如原来给的是png,把它压缩成jpg传给用户
  • anonymizer,把用户个人标识、referer、email、cookie等涉及隐私的头部都去掉
怎么配置才能让用户用上代理:
  • client 指定代理服务器
  • 路由设备监听请求,转移到代理,又称intercepting proxy
  • 在用户使用的DNS SERVER上改IP
  • web server把用户重定向到proxy
客户端自动设代理的配置文件PAC
客户端自动配置代理的协议 WPAD,为客户端自动寻找可用的PAC file,支持好几种配置:
DHCP
  • SLP
  • DNS well-known hostnames
  • DNS SRV records
  • DNS service URIS in TXT records
HTTP TUNNEL:CONNECT 连外面的SSL,RESPONSE返回的时候,不用带Content-Type头,因为连接成功后,就开始传二进制流了
SSL TUNNEL:HTTP头套在SSL数据的外面

Chapter 11 - End

包含用户状态信息的url称为fat url,最好别用
Content-Encoding 取 identity 表示没编码
Delta Encoding :server只传更新的那部分内容给client,不用把全部内容往回传。client先发A-IM请求给server,server返回IM、Etag、Delta-base头信息,返回码226
Delta-base 表示与当前最新内容生成delta信息的源内容的Etag版本号
WCCP (web cache coordination protocol) 路由器重定向web流量到代理缓存
GRE(generic router encapsulation):支持WCCP重定向HTTP数据包到一个特殊的server,IP头是到那个server的
Internet Cache Protocol (ICP):问临近的cache是否有client请求的数据,邻居返回一个HIT或MISS的应答;用UDP通信,挨个问一圈,实在没有再自己去源server请求内容
Cache Array Routing Protocol(CARP):对url做hash,一个cache server存一部分内容,每个cache server存的url各不相同;问题是,如果一个cache server挂掉,hash要打乱重来,消耗较大;
Hyper Text Caching Protocol (HTCP):允许通过url、http request、http response头查询邻居是否有请求的数据;与ICP的差别在于request和response的详细程度
Hit Metering Protocol:扩展HTTP协议,在cache与server之间传递一些信息
几个代理相关的头Via/X-Cache/X-Forwarded-For/
APPENDIX B是HTTP状态码说明
APPENDIX E是BASE64是编码方案说明,比较简单,把8位bit合并,再拆分成6位一组,映射到一个字符表中;最后的生成的bit串长必须是24整数位(6和8的最小公倍数),不足的部分用=号填充

2011年6月4日星期六

笔记:HTTP Developer’s Handbook

Chapter 1 - 5

http 是无状态协议,一个请求不需要其他请求的信息
头部信息有3种:
  • General headers : 请求和应答都能有的
  • Request headers:只有请求时才有的
  • Entity headers:与content相关的
请求类型:
  • GET:url有限制,一般不超过1024字符;一般没有content,所以也就没有entity headers
  • POST:支持提交大量数据;有一些entity headers说明content的信息,比如post提交的content的长度Content-Length,类型Content-Type
  • TRACE:过一个代理会加一个Via头,就可以看出是经过哪些代理
  • OPTIONS:获取一些Web Server的支持信息
  • CONNECT:中转server向目标服务器发connect请求,但不解释HTTP头,只是透明转发。最常用的就是,客户端通过代理请求某个https资源
Max-Forwards的request header如果置0,则代理必须自己进行应答。要是这时请求类型是OPTIONS,代理还是得自己答
Server发出Set-Cookie的应答后,并不知道browser有没有存cookie;除非browser再发一个请求过来。
HTTP 1.1 要求每个请求都有Host头
If-Match是请求时指定一些,要求返回的内容的ETag能满足的条件。例如ETag用作缓存版本号,这个时候指定If-Match作用就跟If-Unmodified-Since很像
If-Modified-Since可以用于中间proxy给server请求内容,要是有更新,server就缓回带Last-Modified信息的新内容,否则就返回304给proxy
图5.7/5.8给出了TRACE请求指定Max-Forwards时的例子,可用于测试。Max-Forwards只有在TRACE/OPTIONS请求时不能被忽略
Range 指定请求某一部分的内容,比如只取前500字节,就可以写成0-499
TE表示传输数据采用的编码方案,当server无法确定返回内容长度时,就没有Content-Length头,而是在TE头指定chunked
gzip 与 deflate 的资料:使用 gzip 或 deflate 压缩网页内容与 deflate,说的还不错的文章

Chapter 6 - 状态码

HTTP/1.1 默认是持久连接,如果client在request加上Connection: close,那么,server可以在发完response后关掉连接
状态码:
  • 信息100-199 :HTTP/1.1才开始用
    • 100 Continue 客户端收到真正内容之前,server给个反馈
  • 成功200-299:
    • 203 Non-Authoritative Information 表示有数据,但不是之前设想的来源提供的数据
    • 204 No Content 返回内容为空,不用刷新document view
    • 205 Reset Content 需要刷新document view
    • 206 Partial Content 返回请求的部分内容,与request的Range头对应
  • 重定向300-399:经常要带上Location指定资源的新位置
    • 300 Multiple Choise 没法提供请求的资源,但可以在response content或Location头中给出建议的资源
    • 301 Moved Permanently 永久转向
    • 302 Found 临时转向;事实上客户端看到302咋会操作之前没有规定,由客户端自定;一般来说,不论之前资源请求方式是不是GET,在转向之后Location指定的新资源默认用GET取
    • 303 See Other 跟302一样是临时转向,只是显式指定Location指定的新资源要用GET方式取
    • 304 Not Modified 资源从某个时间点开始就没被改过,返回的content为空;与request的If-Modified-Since对应;一般还会带上个Date头,有 时还有ETag和Content-Location头;而且由于这个经常是给proxy回的,还会出现Expires、Cache-Control、 Vary头等等
    • 305 Use Proxy 要求用代理取,Location中给出指定代理的地址;注意,只有当前请求的这个资源是指定要用这个代理取
    • 307 Temporary Redirect 跟302一样是临时转向,只是取Location指定的新资源时采用跟原始请求相同的method
  • client错误400-499:
    • 400 Bad Request 请求格式错误,比如少提交了Host之类
    • 401 Unauthorized 请求一个保护资源时,会先给个401,同时带上WWW-Authenticate的头,用户输入正确的认证的信息之后,浏览器一般会自动接下去请求内容
    • 402 Payment Required 要求付费?实际上基本没出现过
    • 403 Forbidden 没有权限请求该内容;不想被黑客盯上也可以直接返回404
    • 404 Not Found 资源不存在
    • 405 Method Not Allowed 不支持该请求指定的method
    • 406 Not Acceptable 没法满足request中指定的Accept条件
    • 407 Proxy Authentication Required 代理跟client说要求认证,带上个Proxy-Authenticate头
    • 408 Request Timeout 请求超时。例如server需要接到第2个request才给内容,但是client之前指定了Connection: close直接断连接了,然后就超时
    • 409 Conflict 冲突,比如client刚请求了某个版本的资源,资源版本又更新了。
    • 410 Gone 不再存在了
    • 411 Length Required
    • 412 Precondition Failed 不满足If-Match之类指定的条件
    • 413 Request Entity Too Large
    • 414 Request-URI Too Long
    • 415 Unsupported Media Type
    • 416 Requested Range Not Satisfiable
    • 417 Expectation Failed 不满足请求指定的Expect条件
  • server错误500-599:
    • 500 Internal Server Error 不知道cgi出啥错了
    • 501 Not Implemented 服务器不支持该请求指定的method
    • 502 Bad Gateway 代理收到invalid reponse的时候,会返回502给client
    • 503 Service Unavailable 服务器暂时没法处理请求,一般会给个Retry-After跟client说啥时候再来请求
    • 504 Gateway Timeout 代理等server的应答等超时了,会返回504给客户端
    • 505 HTTP Version Not Supported
Accept-Ranges 是否支持分段请求
Age 现在返回的内容已经从原始server拿过来多久了;代理算的时候会加上传输时间
Content-Disposition 经常用做指定建议网页另存为的文件名
Etag 资源版本
Location 必须是绝对路径
Vary 中间代理不能修改的头信息;例如Accept-Language,同一网址,有不同语言版本

Chapter 7 General Headers

Cache-Control
  • no-cache 不是不让缓存,只是在给用户缓存内容前先检查下;如果指定no-cache=”Set-Cookie”这种,则是指定缓存中不保留的部分
  • no-store 不做缓存 (IE直接无视此信息)
  • max-stale  缓存系统不经检查直接返回内容给用户的最大时间
  • min-fresh 缓存系统只能返回过期时间比min-fresh长的资源给用户
  • no-transform 不修改内容
  • only-if-cached 缓存系统不能去找原始服务器,但还是要给用户返回缓存;一般是缓存系统与原始服务器通信有问题
Connection : 指定是否持久连接Keep-Alive/Close,HTTP/1.1默认是持久连接,HTTP/1.0默认是非持久连接;也可以设成Upgrade
Pragma 是HTTP/1.0用于控制cache的,现在就一个用法,Pragma: no-cache跟人家说不要缓存
Trailer 在content之后还可以带HTTP headers,只在Transfer-Encoding: chunked的时候可用
Transfer-Encoding 持久连接的时候,不知道啥时候内容传完,所以要指定chunked传输
Warning 经常用于跟client说缓存出了什么问题

Chapter 9 - 14

url用iso-8859-1编码
ascii字符表:http://www.asciitable.com
Content-Disposition 如果想下载,指定attachment;如果想嵌入,例如流媒体,指定inline
session 除了保持用户的认证状态之外,还保持一些与应用相关的数据
server给的Set-Cookie一些属性不会再由client从Cookie提交回去(只提交name<->value对),这些属性只是用于browser决定何时该提交cookie
用户数据放在server比在网络中传来传去安全多了
cookie之类的状态管理机制的唯一用途在于标识客户端,不用于用户认证,或传用户数据
默认提交的表单参数写成hidden型的表单参数提交,不要放在表单url里
还有一种方案是在url里带上unique identifier
尽量不要把关键数据放在用户侧
缓存需注意避免三个问题:1) 用户获取过期的数据;2) 把别的用户数据发给当前用户;3) 敏感信息被缓存
Cache-Control 的取值:
  • public 可以任意缓存
  • private 可以缓存,但不是公共缓存
  • no-transform 可以缓存,但不能改内容
  • must-revalidate 过期后缓存总是要重新验证
  • proxy-revalidate 除了代理之外,过期都要重新验证
  • max-age 可以把当前缓存send给用户的时间区间
  • s-maxage 与max-age相同,但private-cache会忽略这个
  • cache-extension 非明确指定通用的;proxy可以忽略这个
GET发请求时,加上If-Modified-Since,如果没更新,Server返回304 Not Modified,可以省流量
返回的Content-Range: 600-900/1234 表示总共有1024字节,当前按请求仅返回600-900字节的内容,Content-Type为multi-part/byteranges
部分请求成功返回码为206 Partial Content,失败为416 Requested Range Not Satisfiable 
 

Chapter 15 - 16

缓存协议:
  • Internet Cache Protocol (ICP):最流行的,squid也用它;轻量级的,HIT/MISS两状态,用UDP通信
  • Cache Digest Protocol :通过内容的摘要比对确定是否要更新缓存;用TCP通信,摘要可通过http链接获取
  • Cache Array Resolution Protocol:多个代理逻辑上并做一个代理;通过url和缓存id标识;有负载不均衡的问题;新添一个proxy,整个hash表要重算
  • Web Cache Coordination Protocol:解析http request头,重定向到cache proxy;适合做透明代理;直接从底层看端口转流量
负载均衡,是否总是由同一个server服务同一个特殊的client?
《Server Load Balancing》  by  Tony Bourke 
 

Chapter 17 - 25

SSL 缓存,可复用之前协商过的对称密钥
TLS是IETF搞的,SSL是Netscape搞的
Secure HTTP request 包裹着正常的HTTP request
磁盘阵列介绍:RAID,最常用的是RAID5
XSS 尝试插入恶意代码,获取用户cookie;针对特定站点的信任
CSRF 伪造HTTP请求,利用已认证的用户身份绕过安全检查;针对特定用户的信任
CSRF比XSS更难防,一些考虑做法:
  • 重点表单禁用GET请求
  • POST请求的结果会更容易看到,因为POST返回的内容是for parent resource,而非an embedded one
  • 表单加上随机数,在server端校验
SOAP服务,指定SOAPAction,通过POST方式发出请求,远程执行完毕后返回格式化的xml内容
WebDAV服务,例如svn/cvs
P3P 用户设置哪些隐私可以被收集,相关参考资料:《P3P Web隐私》
 
 

2011年6月1日星期三

Head First SQL

指定某个列默认值建表:  test_column varchar(100) NOT NULL DEFAULT ‘’

_ 指定单个任意字符查询:select * from test_table where test_column like ‘_ttt’;

坚持到200页,实在撑不住了,图太多,看的眼花,放弃了。

2010年12月6日星期一

笔记 : Automating System Perl

netstat -ano

tcpvcon -anc

有个用IO::Socket发DNS请求和解析DNS应答的例子

lstat与stat的差别:
stat返回symbolic link本身的信息,stat返回symbolic link指向的目标文件信息

笔记 : Perl DBI

Storable模块:nfreeze比freeze慢,但是保证可跨系统使用

Fcntl的flock

DB_FILE可以有三种存储形式 HASH、B树、RECNO(文本)

MLDBM 支持将复杂的数据结构写入文件

DBI的PrinterError对应warn,RaiseError对应die

错误消息:$DBI::errstr

quote函数自动转义引号

trace函数指定输出DB操作详情,debug用

dump_results打印执行结果,指定写入文件

bind_param_inout指定输出的参数写入到什么变量

bind_col

$sth->{NUM_OF_FIELDS}返回的列数

$sth->{NAME}->[$i-1] 第i列的名字

AutoCommit如果设为0,在执行一系列操作后,$dbh->commit(); if($@) { $dbh->rollback(); },较稳妥。

ODBC标准化了错误码,支持更多函数操作

DBI PROXY : 转发client的query给db,把db返回的结果转给client,这样中转一下,unix机器就能访问windows access的数据库

2010年11月21日星期日

笔记 : SQL Cookbook

连接字符串: concat

条件逻辑: select col_a, case when col_b<100 then 'small' else 'big' end as state from sometable

按某个字段的最后两个字符升序:select col_a,col_b from sometable order by substring(col_b, length(col_b)-2)

重叠结果输出:[SELECT SQL A] union all [SELECT SQL B]

union all不删重复项;union删重复项;除非必要,否则不要用union、distinct

从一个表中取数据导入另一个表:insert into table1(col_a, col_b) select (col_aa, col_bb) from table2 where colcc='somevalue'

出现三次以上部门:select col_a from sometable group by col_a having count(*)>=3

列出索引:show index from emp

正则:select data from sometable where data regexp '[^0-9]' = 0

将同一部门的人名合在一行显示:select dept, group_concat(name order by id, ',') from emp group by dept

滚动结果集,每页五行(limit 5),显示第2页(offset 5):select col_a from sometable order by col_a limit 5 offset 5

笔记 : Marstering Perl

前向查找:(?=pattern) (?!pattern)

后向查找:(?<=pattern) (?<!pattern)

正则的debug:

脚本中 use re 'debug';

命令行 perl -Mre=debug script.pl

Regexp::Common 常用正则表达式

use Carp qw/carp croak cluck confess/;

cluck :打印堆栈后继续执行

confess:打印堆栈后停止执行

Hook::LexWrap 封装子程序,在子程序执行前后进行预定义代码

perl -d:SmallProf script.pl

DBI::Profile

perl -d:DProf script.pl

Devel::Profiler、Devel::Cover、Devel::Peek

Perl::Critic

临时修改某个库函数:*Some::Module::bar = sub { ... }

perl 命令行参数 -s ,简单置值(默认设为1),例如:

perl -s script.pl -someval=abc -otherval

$someval="abc"、$otherval=1,二者为全局变量

ConfigReader::Simple、Config::Scoped、AppConfig

IO::Interactive

$! 操作系统或库函数调用得到的错误

$? 最近一次调用wait()得到的错误

$@ 最近一次调用eval()得到的错误

$^E 操作系统特有的错误信息

退出值:my $exit_value= $?>>8;

终止程序的信号值:my $signal=$?&127;

若子程序出现内核转储,则低字节第8位置1:my $core_dump = $?&128;

__LINE__ 当前所在行数

use Fatal; 作用是open失败时自动输出die错误信息

Log4perl

do 每次都重新解析文件,而require和use只解析一次文件。

如果找不到文件,$!;如果找到文件,但是无法读取或解析,$@

YAML、YAML::Tiny、YAML::Syck

Storable、Clone::Any

DBM::Deep

二进制数 my $value = ob 10; # $value=2

Devel::Size、Devel::Peek

vec 将一个字符串当成二进制位向量处理

Tie::Cycle、Tie::Hash::Word::Counter

创建一个模块的发布包:

$ Scriptdist Module.pm

$ make disttest

$ make tardist

2010年8月4日星期三

笔记:professional perl programming

chap 1-8

Scalar and List Context 赋值有点特殊:
$variable = ('a', 'list', 'of', 'strings');
print $variable; # returns 'strings'
$count = @variable; # returns 4 for @variable above. 

(/^BEGIN/) ... (/END$/) 与 (/^BEGIN/) .. (/END$/)的区别在于某个行同时满足(/^BEGIN/) 和(/END$/)的时候的处理

do { ... } while/until 不是loop块,因此next、last不能用,只能加标签解决,比较麻烦(所以尽量不用这两种结构)

use subs 覆盖系统内嵌函数

*main::subroutine = \&My::Module::subroutine;

chap 9-chap 26

ExtUtils::Installed  查看已安装的模块
fcntl、ioctl
File::Temp
Term::ReadKey
Term::ReadLine
Term::Complete
Term::Screen
Curses
Text::Tabs
Text::Wrap

use POSIX qw(:sys_wait_h);
$exitsig = WSTOPSIG($?);
$exitcode = WEXITSTATUS($?);

chap 22  进程间通信
chap 23  网络编程

2010年7月22日星期四

Effective Perl Programming : Item 87-120

Item 87 - Item 98 : 测试

Item 99 - Item 115
Carp模块的 carp、croak、confess函数
Try::Tiny
Perl::Critic
用Text::CSV_XS读入多列分隔的文件,而不要用正则表达式每行split,速度会慢很多

Item 116
用unpack处理固定列宽的文件

Item 117
用URI::Escape转码