javascript replace函数

2014年8月11日 20:39

定义
replace()函数用于替换字符串.
 
语法
stringObject.replace(regexp/substr, newSubStr/function)
参数
regexp/substr       正则表达式/字符串
newSubStr/function  替换文本/生成替换文本的函数
 
示例
var str = "Visit Microsoft!";
var res = str.replace("Microsoft", "W3Schools");
 
替换字符
假如替换字符newSubStr中包含$符号,它表示什么?
$1、 $2、 ...、$99 与 regexp 中的第1到第99个子表达式相匹配的文本
$& 与 regexp 相匹配的子串
$` 位于匹配子串左侧的文本
$' 位于匹配子串右侧的文本
$$ 直接量符号。
 
上面$1、$2...中提到的子表达式是什么意思?正则表达式中用小括号包裹起来的表达式.
例如:
/a/   无子表达式
/[a]/ 无子表达式
/(a)/ 有子表达式(a)
/(a), (b)/ 有子表达式(a)、(b)
 
示例
name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
//输出"John Doe"
 
替换函数
替换函数说明

function(match, p1, p2,..., offset, string)
match      匹配到的字符串
p1, p2...  匹配到的子表达式
offset     匹配到字符串的位置
string     整个字符串
 
示例
var name = "ace:mm-Abc".replace(/([\:\-\_]+(.))/, function(match, p1, p2, offset, total){
        console.log("match:" + _);
        console.log("p1:" + separator);
        console.log("p2:" + letter);
        console.log("offset:" + offset);
        console.log("total:"+ total)
        return offset ? p2.toUpperCase() : p2;
})
console.log(name)
/*输出
substr::m test.html:43
p1::m
p2:m
offset:3
total:ace:mm-Abc
aceMm-Abc 
*/
上面正则表达式中有两个子表达式
p1是子表达式([\:\-\_]+(.))匹配到的内容":m"
p2是子表单是(.)匹配到的内容"m"
 

Tags: js
评论(0) 阅读(1238)

不用翻墙的google地址

2014年8月08日 15:38

域名地址
 
ip地址
不定时更新的iplist
 
 
最近的可用IP地址
24.156.131.119|193.192.250.173|193.134.255.173|193.92.133.45|197.84.128.40|41.201.164.54|
58.145.238.48|212.188.10.223|212.188.15.53|64.15.119.181|193.192.250.182|64.233.166.189|
109.232.83.101|31.7.160.231|213.186.229.29|95.143.84.159|103.1.139.227|41.201.128.55|
31.7.160.238|61.19.2.44|212.188.7.40|220.255.5.158|58.145.238.27|118.143.88.82|80.228.65.172|
213.186.229.35|80.228.65.153|109.232.83.102|31.7.160.216|41.201.164.25|212.188.7.103|
62.197.198.223|213.240.44.18|103.1.139.174|212.188.15.15|220.255.6.55|212.188.7.119|
178.60.128.37|193.192.226.148|103.1.139.240|193.90.147.20|223.26.69.37|
197.84.128.34|208.117.228.121|212.188.15.44|93.183.211.251|64.15.115.94|149.3.177.88|
37.228.69.23|95.143.84.181|212.188.10.94
 

 

评论(0) 阅读(1150)

你以为你在合群,其实你在浪费青春[转]

2014年8月03日 21:32

曾经有一个宿舍,宿舍里面八个人。每当宿舍八个人都凑齐的时候,寝室长总会组织一个游戏,就是把八个人分成两组,每组三个人,组织大家打牌,剩下两个人就打开电脑,打起了dota,或者拿出手机不停地刷着网页,或者躺在床上拿着psp等待着他们的轮换。
然后,一晚上就这样过去了。
然后,一年就这样过去了。
然后,四年就这样过去了。


八个人里面,一定会有一两个人混的还可以,但是也一定会有人混的差。混的可以的,在大学四年,活的多么假:因为他组织别人堕落,自己却坚定的向前,表里不一,活的多么难受。而混的差的,永远不知道问题出在哪里。他根本不知道,他就是跟风了,可是到底哪里出了错误了,他根本不知道。


最近的课堂上,我不停地强调一点给我的学生,大学期间,你无法选择自己的室友,但是你可以选择自己的朋友。
因为,最近我开始发现,寝室,是堕落的开始;合群,是淘汰的起点。在好多人的字典里面:
四个人,三个人不停地下载着苍井空,第四个人不看,就是不合群。
四个人,三个人打着游戏,第四个人不玩儿,就是不合群。
四个人,三个人搞着gay,第四个人不搞,就是不合群。
人是怕寂寞的,于是,大多数人都选择合群。
. 可是,你以为你在合群,其实你是在浪费自己的青春;
你以为你交了朋友,当你毕业一无是处时,谁还会把你当朋友;
你以为你大学四年不孤单,当你毕业没有工作时,没有老婆的日子你会更孤单。
有人说孤单痛苦,那谁又说过,实现自己的目标,不会痛苦?
 

我短暂的大学期间,目睹了太多为了合群和合污的惨剧,记得大一,总有人叫我打游戏,我也打,可是留下的,是和他们一样的空虚。
记得大二,当他们拿着手机不停下载新的游戏,我在角落却是拿着单词书背单词。
记得大三,寝室七个人对我集体发起攻击,说我不合群。更有人到处说我傲气逼人,到处说我坏话,但是我明白,与众不同,不是我错了,最后我只有申请换寝室。但是现在我明白了,几年后的今天,当一些人在烈日下暴晒时,我却在空调房写文章。


最重要的是,我已经忘记了当时说我不合群那些人的名字是什么。我知道,他们中有可能还有人惦记着我,盼望我早点死掉,但是我只想说,他们惦记着我,说明他们生活里面不能没有我;而我忘记了他们的名字,说明我的生活里面可以没有他们。
直到今天,我认识了许多人,有些是有名的大导演,有些是知名的演员,有些是牛掰的创业家,有些是银行、政界的大亨,有些是当初都不会正眼看我一眼的美女,最重要的是,我交了一帮好朋友。此时此刻我才会感激,当初我没有合群,现在,我才到了属于我自己的群体,去做我应该做的事情。
如果当初我合群,现在身边,又会是谁,又会是什么景象。


我一直坚信,英雄,永远是孤独的,只有小喽喽才扎堆。“二八定律”永远适合在地球的每一个角落:百分之二十的人,占有百分之八十的资产;百分之八十的人,为百分之二十的服务。
尤其是男孩子,大学四年,一直合群,一直在寝室,一直不打开视野,固步自封,井底之蛙,这一切,总会在今后走进社会的某一时刻一次性还给自己。
而女孩子,更是需要在大学中培养出独立的人格,依靠一个男人,永远比不上依靠一个自己双手创造的未来踏实。
但是,我想说,我这里说的不合群,不是结仇,不是桀骜不驯。这里,我在大学做的不够,我检讨。至少,千万不要得罪人,因为道不同,不为谋。但是不代表连话都不讲,或者恶语相向。你支持他的生活模式,只是你需要拥有自己的思想。


这个世界很邪门,你永远不会相信,当年最混蛋的那个人,十年后会是政治界最有潜力的谁;你也不会相信,当年最不合群的人,成为了百万富翁。
无论如何,那些有点成就的人,都不合群;就算表面合群,他们内心,也总有着自己的一片世界,他们喜欢静静的思考,并且一直向它迈进。

评论(0) 阅读(804)

mkstemp、mktemp、TemporaryFile区别

2014年7月30日 13:07

mkstemp

fd, name = tempfile.mkstemp 创建临时文件,并且将文件打开
>>> import tempfile
>>> tempfile.mkstemp()
(3, '/tmp/tmpkgWSR1')
查看/tmp目录,看到已经生成真实的文件
 
lsof查询打开的临时文件
[wyq@localhost tmp]$ lsof|grep tmp|grep python
python    8095           wyq    3u      REG               0,33         0     254593 /tmp/tmpkgWSR1
 
发现mkstemp不仅创建文件,而且将文件打开. 使用mkstemp很容易忘了这点,最终造成OSError: [Errno 24] Too many open files错误.
mkstemp返回的是文件描述和文件路径,并不常用,常用的是下面两个.

mktemp

name = tempfile.mktemp 返回一个临时文件的路径,但不创建该临时文件
>>> import tempfile
>>> tempfile.mktemp()
'/tmp/tmpPVidBM'
仅仅生成临时文件名

TemporaryFile

tempfile.TemporaryFile 返回文件对象(file-like)用于临时数据保存。当文件对象被close或者被del的时候,临时文件将从磁盘上删除
import time
with tempfile.TemporaryFile(mode='w+r') as f:
    f.write("=============")
    f.seek(0)
    print f.read()
    time.sleep(10)
TemporaryFile并未在/tmp目录中创建临时文件,应该只存在与内存中.
 

评论(1) 阅读(2173)

理解指令的restrict属性

2014年7月30日 01:26

restrcit属性说明
restrict: EACM中的任意一个之母。它是用来限制指令的声明格式的。
E - 元素名称:<my-directive></my-directive>
A - 属性: <div my-directive="exp"> </div>
C - 类名:<div class="my-directive: exp;"></div>
M - 注释: <!-- directive: my-directive exp -->
 
它做了什么
示例
<html ng-app='app'>
<body>
    <hello> </hello>
    <div hello> </div>
    <div class="hello"> </div>
    <!-- directive: hello -->
</body>

<script src="bower_components/angular/angular.js"></script>
<script>
var appModule = angular.module('app', []);
appModule.directive('hello', function() {
    return {
        restrict: 'AEC',
        template: '<h3>Hi there</h3>',
        replace: true
    };
});
</script>
</html>
 
运行结果
<h3>Hi there</h3>
<h3 hello>Hi there</h3>
<h3 class="hello">Hi there</h3>
<h3>Hi there</h3>
可以看到几种方式,做的事情一样,只有部分区别. 这些区别有什么作用,用在什么场合?
 
使用场合
restrict=E时,浏览器无法识别指令的声明元素,那么可以知道这个指令一定是起替换作用,也就是说template一定有值.
restrict=A时,指令是以元素属性形式存在的,这个指令的作用则可以不是替换作用. 那么它可以做什么?以link方式操作dom.
比如为元素聚焦
<input type="input" focus/>

appModule.directive('focus', function() {
    return {
        restrict: 'A',
        link:function(scope, elem, attrs){
            $(elem).focus();
        }
    };
});
restrict=C,则是在绑定指令的同时,指定它的css样式,让指令与样式同步.
restrict=M,则在一些场合非常有用,方便在注释与代码之间切换.
 
 

Tags: angularjs
评论(4) 阅读(2372)

webpy在insert时psycopg2.OperationalError: ...currval 仍没被定义

2014年7月15日 10:45

在用webpy的db.insert()向postgres插入数据时出现

Traceback (most recent call last):
  File "upgrade2.0.py", line 170, in <module>
    copy_webservice()
  File "upgrade2.0.py", line 165, in copy_webservice
    db36.insert('top_node_location', **r)
  File "/usr/lib/python2.7/site-packages/web/db.py", line 777, in insert
    self._db_execute(db_cursor, sql_query)
  File "/usr/lib/python2.7/site-packages/web/db.py", line 587, in _db_execute
    out = cur.execute(query, params)
  File "/usr/lib/python2.7/site-packages/DBUtils/SteadyDB.py", line 631, in tough_method
    raise error # reraise the original error again
psycopg2.OperationalError: 错误:  在此会话中序列 "top_node_location_id_seq" 的 currval 仍没被定义   
 
找到/lib/python2.7/site-packages/web/db.py
def _process_insert_query(self, query, tablename, seqname):
    if seqname is None:
        # when seqname is not provided guess the seqname and make sure it exists
        seqname = tablename + "_id_seq"
        if seqname not in self._get_all_sequences():
            seqname = None
    
    if seqname:
        # 注释掉此句
        #query += "; SELECT currval('%s')" % seqname
        pass
        
    return query
原因是webpy在insert时,有一个额外的select使用currval获取当前序列值,但是在postgres9.3中已经不支持currval()了.
看来webpy作者去世,后面没有更新维护了
 

 

Tags: webpy;postgres
评论(0) 阅读(1440)

python终端模拟工具pexpect

2014年7月14日 22:28

Pexpect是一个纯Python模块。 可以用来和ssh、ftp、passwd、telnet 等命令行程序进行自动交互。实现与命令行交互的自动化.
 
它提供了两个主要接口 run()函数和spawn类.
 
run()函数
run功能相对简单,只能实现简单交互
run(command,timeout=-1,withexitstatus=False,events=None,extra_args=None, logfile=None, cwd=None, env=None)
run运行命令,然后返回结果,与os.system类似.
示例
pexpect.run('ls -la')

# 返回值(输出,退出状态)
(command_output, exitstatus) = pexpect.run('ls -l /bin', withexitstatus=1)
 
spawn类
spawn功能比run强大,可以实现更复杂交互
class spawn 
    __init__(self, command, args=[], timeout=30, maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None)
timeout指定交互是等待的超时值
maxread设置read buffer大小. 每次pexpect尝试从TTY(Teletype终端)从读取的最大字节数.
searchwindowsize 指定了从输入缓冲区中进行模式匹配的位置,默认从开始匹配.
logfile 参数指定日志的记录位置
 
工作过程
# 第一步与终端建立连接
child = pexpect.spawn('scp foo user@example.com:.')
# 第二步等待终端返回匹配内容
child.expect('Password:')
# 第三步根据返回内容发送命令进行交互
child.sendline(mypassword)
 
pxssh类
pxssh是pexpect的派生类,用于建立ssh连接,比pexpect好用.
 
login()  建立到目标机器的ssh连接
logout() 释放该连接
prompt() 等待提示符,通常用于等待命令执行结束
 
工作过程与pexpect相同
# 初始化pxssh示例
s = pxssh.pxssh() 

hostname = raw_input('hostname: ') 
username = raw_input('username: ') 
password = getpass.getpass('password: ') 
# 建立ssh连接
s.login (hostname, username, password) 
# 发送命令到远程终端
s.sendline ('uptime') # run a command 
# 等待远程终端返回
s.prompt() # match the prompt 
# 打印匹配到的内容
print s.before  # print everything before the propt. 

# 发送命令到远程终端
s.sendline ('ls -l') 
# 等待远程终端返回
s.prompt() 
# 打印匹配到的内容
print s.before 

s.sendline ('df') 
s.prompt() 
print s.before 

# 释放ssh连接
s.logout() 
 
 
 

评论(0) 阅读(3037)

vim树形目录插件NERDTree

2014年7月11日 12:21

开始
  • 打开vim
  • 输入:NERDTRee,回车打开Tree
  • ctrl+w+h/l在左右侧窗口间切换光标,多次ctrl+w效果相同
  • ? 打开或关闭帮助文档
  • CD切换根目录
  • u返回上一层根目录
  • :q关闭窗口
 
命令
:NERDTreed [start-directory] 打开NERDTree
:NERDTreeClose 关闭目录树
 
快捷键
o  打开文件,目录,书签
go 打开选择的文件,但不移动光标
t  在新的tab中打开节点和书签
T  同上,但是停留在当前tab中
i  在分割的窗口中打开文件
gi 同上,但光标仍留在树中
s  在新的vsplit打开文件
gs 同上, 但光标仍留在树中.
O  递归打开选择的目录
x  收缩当前节点的父节点.
X  收缩当前节点的所有子节点
e  编辑当前目录
D  删除当前书签
P  跳到根节点
P  跳到当前节点的父节点
J, K      当前树深度上下跳转
C-J, C-K  当前目录相邻目录的上下跳转
C  改变树的根为所选择的目录
u  根的上一层目录为树的根
U  同上, 但旧的根目录仍保持打开
r  递归更新当前目录
R  递归更新当前根
cd 改变CWD为所选择节点的目录
CD 改变CWD为树根所在目录
I  切换模式, 表示隐藏文件是否可见.
f  切换模式, 表示是否使用文件过滤器
F  切换模式, 表示文件是否可见
B  切换模式, 表示书签表格是否可见
 
鼠标
  • 双击同 o
  • 中键单击, 文件同 i, 目录同 e
来源
http://www.cnblogs.com/summericeyl/p/350247

Tags: vim;nerdtree;插件
评论(0) 阅读(1458)

web路径解析三种方式

2014年7月10日 17:12

路径解析经过三个阶段:
文件路径
静态文件与网站目录结构一致,动态文件也是根文件路径执行脚本,比如/index.asp
MVC
java中的struts就是典型的MVC模式,将url映射到控制器,调用服务操作数据,再返回结果.
操作的行为主要是用post和get请取方法.
restful
目前最流程的就是restful,restful全称是Representational State Transfer表现层状态转换
它将服务器端提供的内容实体看作资源,并表现在url上, 对资源的操作体现在http方法上, 资源的类型体现在请求字段Accept和响应字段Content-Type上
 
在MVC中,主要使用post和get请取方法,增删操作表现在url上
POST /user/add?username=jacksontian
GET  /user/remove?username=jacksontian
POST /user/update?username=jacksontian
GET  /user/get?username=jacksontian
在restful中
POST   /user/jacksontian   增加
DELETE /user/jacksontian   删除
PUT    /user/jacksontian   更新
GET    /user/jacksontian   查询
 
 
 

Tags: restful;nodejs
评论(0) 阅读(1173)

理解svg中画箭头代码[viewbox,refX,refY]

2014年7月09日 20:52

常见示例
最常见的在线条上画箭头代码
<svg>
    <!-- 预定义marker-->
    <defs>
        <marker id="arrow" refX="0" refY="3" markerWidth="20" markerHeight="20" orient="auto">
            <path d="M0 0 L0 6 L10 3" style="fill: #ffff;"></path>
        </marker>
    </marker>
    </defs>
    <!-- 引用预定义的marker -->
    <line class="link" marker-end="url(#arrow)" x1="0" y1="0" x2="80" y2="80"></line>
</svg>
先预定义了一个箭头形状的marker,然后画了一条线,并且将预定义的marker标到线条末端.
 
画出的图形
 
实现方法是用path画一个三角形并填充到marker中,形成三角marker,之所以用marker是因为,只有marker才能标到其它图形上. 但是marker是怎样被标记线条末端的?在marker中有refX、refY作用就是用来指定线条末点连接到marker上的位置. 连接上后,箭头指向哪边?orient属性则指定marker的方向.
 
 
如何为marker中坐标取值
首先marker与包含的path共用一个坐标系,如果坐标值不对则会显示不全.
比如上面marker的显示范围是(0,0)到(20, 20), path的范围是(0,0)到(10,6),可知道path完全处在marker的显示区域内,因此path可以全部显示.
 
如果需改path值,path显示范围为(0,-3)到(10,3),有一半内容在marker显示区域外,我们看到的就是半个三角形。设置坐标时要知道marker与path是共用同一个坐标系,path坐标不是相对于marker,注意path要在marker的可视范围内
<svg>
    <!-- 预定义marker-->
    <defs>
        <marker id="arrow" refX="0" refY="0" markerWidth="20" markerHeight="20" orient="auto">
            <path d="M0 -3 L0 3 L10 0" style="fill: #ffff;"></path>
        </marker>
    </marker>
    </defs>
    <!-- 引用预定义的marker -->
    <line class="link" marker-end="url(#arrow)" x1="0" y1="0" x2="80" y2="80"></line>
</svg>
如下
 
理解marker的viewBox属性
用法viewBox(xmin, ymin, width, height)
查看文档可知道viewBox作用是拉伸图形。它是如何控制拉伸的?要想拉伸的话,指定长宽比例就可以了,怎么会用到xmin, ymin, width, height这些值,它们是和拉伸有什么关系?怎么理解?
实际上拉伸只是它的一个功能,换一种叫法就很好理解: 取景框. 它使用xmin,ymin,width,height这些参数确定取景范围,然后将取到的景象,放到marker中,并且充满整个marker. 如果取到的景象比marker可视范围小,则景象会被放大再充满marker;如果取到的景象比marker可视范围大,怎取景会被缩小再充满marker. 所以viewbox有两个功能:一是填充功能;二是拉伸.
 
比如上面只显示半个三角形,可以通过设置viewbox让它,在marker中完整显示.
<svg>
    <!-- 预定义marker-->
    <defs>
        <marker id="arrow" refX="0" refY="0" markerWidth="20" markerHeight="20" orient="auto" viewBox="0, -3, 10, 6" >
            <path d="M0 -3 L0 3 L10 0" style="fill: #ffff;"></path>
        </marker>
    </marker>
    </defs>
    <!-- 引用预定义的marker -->
    <line class="link" marker-end="url(#arrow)" x1="0" y1="0" x2="80" y2="80"></line>
</svg>
上面viewBox控制了取景范围,正好将整个三角形取出来,再放入长20宽20的marker中,因为viewbox取到的景象长为10宽为6,小于marker大小,要想让三角形充满,则要放大景象,放大的比例长为20/10,宽为20/6.
显示结果
 
 
 

Tags: SVG
评论(0) 阅读(5485)