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

2014年8月03日 21:32

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


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


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

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


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


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


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

评论(0) 阅读(1234)

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目录中创建临时文件,应该只存在与内存中.
 

评论(30) 阅读(5372)

理解指令的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) 阅读(3635)

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
评论(1) 阅读(2646)

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() 
 
 
 

评论(1) 阅读(4495)

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;插件
评论(145) 阅读(3943)

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
评论(211) 阅读(3512)

理解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
评论(9) 阅读(10832)

web前端开发包管理器bower[笔记]

2014年6月25日 05:13

    Bower是用于web前端开发的包管理器。对于前端包管理方面的问题,它提供了一套通用、客观的解决方案。它通过一个API暴露包之间的依赖模型,这样更利于使用更合适的构建工具。Bower没有系统级的依赖,在不同app之间也不互相依赖,依赖树是扁平的。
    Bower运行在Git之上,它将所有包都视作一个黑盒子。任何类型的资源文件都可以打包为一个模块,并且可以使用任何规范(例如:AMD、CommonJS等)。
 

安装

#安装bower
npm install -g bower

基本用法

#安装包
bower install jqeury
#指定版本
bower install jquery#1.10.3
#查找包
bower search jquery
#卸载包
bower install jqeury

使用包

<script src="/bower_components/jquery/index.js"></script>

配置

配置文件.bowerrc
{
  "directory" : "components", #指定安装路径
  "json"      : "bower.json",
  "endpoint"  : "https://Bower.herokuapp.com",
  "searchpath"  : "",
  "shorthand_resolver" : ""
}

来源:http://bower.jsbin.cn/

Tags: bower
评论(8) 阅读(2768)

linux与linux之间共享目录

2014年6月19日 22:46

简述

在linux与windows之间共享目录使用smbfs. 但是在linux与linux之间共享目录要用nfs(Network File System网络文件系统). 服务端用nfs提供共享目录服务,客户端通过mount将共享目录挂载到本地.

以fedora 20设置共享目录为例

  • 安装nfs
fedora 20要安装以下两个包
[wyq@localhost ~]$ rpm -qa |grep nfs
libnfsidmap-0.25-8.fc20.x86_64
nfs-utils-1.3.0-2.1.fc20.x86_64
  • 配置共享目录
在/etc/exports文件中添加以下内容
/home/wyq/share  192.* (insecure,rw,sync,no_root_squash)
  • 设置防火墙,允许nfs服务
输入sudo firewall-config打开防火墙配置界面,选中nfs服务
  • 启动nfs服务
sudo service nfs start
  • 挂载目录
sudo mount -t nfs 127.0.0.1:/home/wyq/share /home/wyq/mount
  • 取消挂载
umount /home/wyq/mount
 
 
 
exports配置文件说明
/home/wyq/share 共享的目录
192.*           允许访问的主机IP, 如果不能确定 ,请使用 *(在fedora 20实验中表示任意IP时,不用加星号,否则nfs会无法启动) 
insecure        一个安全选项, 如果nfs服务端口号小于1024则可以不添加这个选项, 否则不添加的话, 是无法访问的.其他主机访问的话就会被拒绝.
rw              共享目录的权限,rw 是可读写的权限,只读的权限是ro.
sync            同步的选项, 可选的还有 async. sync是不使用缓存,随时写入同步, async是使用缓存的.
no_root_squash  NFS服务共享的目录的属性, 如果用户是root, 那么对这个目录就有root的权限.
 
启动nfs失败示例
  • 启动nfs时提示失败
[wyq@localhost workspace]$ sudo service nfs start
Redirecting to /bin/systemctl start  nfs.service
Job for nfs-server.service failed. See 'systemctl status nfs-server.service' and 'journalctl -xn' for details.
  • 根据提示查看错误信息
[wyq@localhost workspace]$ sudo systemctl status nfs-server.service
nfs-server.service - NFS Server
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled)
   Active: failed (Result: exit-code) since 四 2014-06-19 22:20:37 CST; 5s ago
  Process: 4984 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 4980 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 3778 ExecStartPost=/usr/libexec/nfs-utils/scripts/nfs-server.postconfig (code=exited, status=0/SUCCESS)
  Process: 3761 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS $RPCNFSDCOUNT (code=exited, status=0/SUCCESS)
  Process: 5371 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=1/FAILURE)
  Process: 5369 ExecStartPre=/usr/libexec/nfs-utils/scripts/nfs-server.preconfig (code=exited, status=0/SUCCESS)
 Main PID: 3761 (code=exited, status=0/SUCCESS)

6月 19 22:20:37 localhost.localdomain systemd[1]: Starting NFS Server...
6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs: No options for /home/wyq/share *: suggest *(sync) to avoid warning
6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs: No host name given with /home/wyq/share (insecure,rw,sync,no_root_squash), suggest *(insecure,rw,sync,no_root_squash) to avoid warning
6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs: incompatible duplicated export entries:
6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs:         *:/home/wyq/share (0x422) [IGNORED]
6月 19 22:20:37 localhost.localdomain exportfs[5371]: exportfs:         *:/home/wyq/share (0x425)
6月 19 22:20:37 localhost.localdomain systemd[1]: nfs-server.service: control process exited, code=exited status=1
6月 19 22:20:37 localhost.localdomain systemd[1]: Failed to start NFS Server.
6月 19 22:20:37 localhost.localdomain systemd[1]: Unit nfs-server.service entered failed state.
注意到信息中"exportfs: incompatible duplicated export entries:" 意思是有重复配置
  • 查看配置文件/etc/exports, 内容如下
/home/wyq/share  *  (insecure,rw,sync,no_root_squash)
  • 猜测是配置错误导致nfs无法启动
将配置更改为以下几种,逐一尝试
第一种
/home/wyq/share  192.*  (insecure,rw,sync,no_root_squash)
第二种
/home/wyq/share  (insecure,rw,sync,no_root_squash)
 
发现使用以上两种方式的配置,nfs均能正常启动并且被挂载.
  • 结论
在fedora 20的nfs配置文件/etc/exports中,如果想让任意主机访问共享目录,不需要用*表示,不填即表示任意主机.
 
 

Tags: mount;共享目录
评论(11) 阅读(5005)