昨天在邮箱里面看到Godaddy的1美元注册com域名的优惠码,立马就去Godaddy申请了一个域名,支付选项居然又只有信用卡。像我这样没有双币信用卡的就只好另想办法了。比如敲同学的,嘿嘿。昨天拉住某个悲惨的娃就拿他信用卡就付款了。不过算下来也就8RMB不到。

域名一到手就想着把信用卡绑定给取消了,免得明年又自动扣钱,续费还是手动安心。虽然扣的是我同学的卡,保险期间还是去了吧。

在Godaddy里面研究了半天的英文,结合网上的一些资料就把信用卡的信息给去掉了。然后悲剧就此发生,域名管理里面的域名全没了。。。。。。吓的我一身冷汗!

后来google了半天总算知道怎么找回了,老的域名直接可以在域名管理里面找回来。

步骤如下:

  1. 点击 My Account
  2. 找到右边的并点击 View all in domain manager
  3. 鼠标移动左上角的 Domain 按钮上,点击下拉框的 Recover Expired Domains
  4. 勾选你要恢复的域名,然后点击 Recover
  5. 接着会生成新的购买清单,里面价格是0的,操作方式跟买域名的时候一样
  6. 买好后域名就回来了。

接下来是新域名的找回了,这个必需要跟客服聊聊了,发封 E-mail 给客服吧。我英文不好,睡觉前发了一份,没有附上四位数的PIN码,结果客服给我发了上面的这种操作方式。后来去网上重新找了一下,附上四位PIN码,据说加上这个客服处理起来要给力的多,内容是参考 http://www.enkoo.net/recover-deleted-new-domain-in-godaddy.html :

Hi!
I just made a mistake to cancel enkoo.net from my account.
Please tell me how to get it back!
My godaddy Customer Number is ********,Username is ******,4 digit support pin is ****.
Thanks very much!

大概等了三个多小时后客服给我回了一份邮件,大概意思是让我重新设置一下 NameServers 。然后我登陆Godaddy,里面新注册的plotcup.com已经回来了。就是 NameServers 要改一下,我把这个改成Godaddy的61和62的两台 NameServers 。然后就可以解析域名了。

这次花了同学的Money给自己买了一次教训,心里真是平衡啊。希望大家以后去Godaddy里面操作的时候小心点,别像我一样,刚买的东西就在眼皮底里飞了。找回来的域名已经没有关联的支付信息了,下次到期前自己手动去付费就可以了。

tip

取消自动续费其实只要把域名管理里面的 Auto Renew 给关了就可以了。

在ubuntu的源里面有一个mldonkey-server,但那个版本比较老一点,所以我去直接下载了一个新版本的。

下载地址: mldonkey-3.1.0.static.i386-Linux_glibc-2.11.2.tar.bz2

1、修改配置并设置密码

把下载过来的mldonkey解压出来,运行一下里面的mlnet然后关闭掉。这样在~/.mldonkey目录下就会生成默认的配置文件。

首先要设置~/.mldonkey/downloads.ini文件,把里面的allowed_ips参数改成

1
allowed_ips = ["0.0.0.0/0";]

然后启动mlnet,再用浏览器去访问4080端口。这时会提醒你用useradd admin password设置用户名和密码。

图示设置密码

2、配置mldonkey

在~/.mldonkey/downloads.ini文件里找到web_infos,里面一共有两段,前一段是示例不用管它,直接去修改后面一段,把里面的

1
("server.met", 0, "http://www.gruk.org/server.met.gz");

改成

1
("server.met", 0, "http://www.emule.org.cn/server.met");

这个是VC的server.met。

client_name 设置nickname,随便设置就可以了,不过一般设置为[CHN][VeryCD]xxxxxx,这个是emule的命名方式,冒充emule的用户,有些server需要特殊的nickname才可以连上。(实际上没有多大效果)

max_hard_upload_rate, max_hard_download_rate 最大上传速度和最大下载速度,根据自己的实际带宽,最大下载速度大于实际带宽就可以了。如果要限制传输速度,就设置这两个参数,0表示不限,单位是KB/s。上传速度最好大于10KB/s否则会影响下载速度

ED2K-max_connected_servers:10 最多连接的服务器数目,设置为10就可以了,最后只会稳定在几个。

max_opened_connections 默认是200,最大可以到924,理由同上。 max_indirect_connections 这个范围是30-70,它表示客户端允许的外来连接数为最大打开连接的百分比。如果你想要更多的连接,可以修改高一点。

max_concurrent_downloads 最大容许的同时下载数,默认是50。

max_upload_slots 最大可以同时上传给多少人

shared_directories 这个是共享目录,我一般设成跟下载目录一样。

allow_browse_share 是否容许别人浏览你共享的文件。

temp_directory 缓存路径,可以修改成你想要的路径 (如果把下载目录路径修改到了别的硬盘分区 最好把缓存路径修改到相同的硬盘的分区,否则下载完成转移临时文件时会频繁读盘)

auto_commit 表示mldonkey会自动把下载完成的文件从temp_directory 移动到incoming_files里面。 可以修改为自己想存储的路径,默认的路径是在隐藏目录下的,比较不方便查看。如果不想修改,就把~/.mldonkey下面的temp目录和incoming目录都干掉,然后建个链接。也可以改动incoming_files的值,这个值是在shared_directories里面的。

pyrex可以用来生成C语言代码,并编译成python的扩展。pyrex的语法类似于python,但在里面有C语法的类型声明之类的东西。

一、首先安装pyrex

1
pip install pyrex

二、然后编写代码

1.foo.py

1
2
3
4
5
6
7
8
9
10
def run():
b = 0
i = 0
while i < 10000000:
if i%2 == 0:
b = b + i
else:
b = b - i
i = i + 1
return b

2.setup.py

1
2
3
4
5
6
7
8
from distutils.core import setup
from distutils.extension import Extension
from Pyrex.Distutils import build_ext

setup(
name='foo', ext_modules=[Extension("foo", ["foo.pyx"])],
cmdclass={'build_ext':build_ext}
)

三、编译成pyd

1.windows下编译

1
python setup.py build_ext --inplace -c mingw32

编译完成后会在当前目录下面生成foo.pyd和foo.c文件,还有一个build目录,只要把foo.pyd拿过来使用就可以了。

tip

在windows编译的时候要使用mingw32,我这里使用的是dev c++。我这里编译的时候找不到msvcr90,在windows目录下面搜索msvcr90.dll,把这个dll复制到C:Python26libs目录下,并改名为msvcr90.lib。

2.linux下编译

1
python setup.py build_ext --inplace

和windows的区别就是少一个-c mingw32参数。

四、测试速度

测试脚本test.py

1
2
3
4
5
from timeit import default_timer
from foo import run
t = default_timer()
print "result:%s"%run()
print "runtime:%s"%(default_timer() - t)

1.未使用pyrex

1
2
result:-5000000
runtime:1.96459442065

2.使用了pyrex

1
2
result:-5000000
runtime:0.0141805698895

像这种计算的速度提升还是很大的,推荐把部分复杂的算法用pyrex编译成pyd来提速。不过现在计算机硬件这么牛叉,语言的速度差别越来越不明显了。

Celery这东西刚开始啃它的文档的时候很痛苦,英文不行啊。而且这东西我压根没找到中文资料。折腾这东西来来回回折腾了好几回,总算有那么点感觉了。以前一直以为Celery必需装RabbitMQ,经林刚提醒终于弄明白如何直接使用redis,不再需要安装RabbitMQ。

配置文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BROKER_BACKEND = 'redis'
BROKER_HOST = '127.0.0.1'
BROKER_PORT = 6379
BROKER_VHOST = "8"

CELERY_RESULT_BACKEND = "redis"
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DB = 8
REDIS_CONNECT_RETRY = True

CELERY_DEFAULT_RATE_LIMIT = '500/m'

CELERY_IMPORTS = ('app.tasks',)

其实只要设定好BACKEND和相关参数就可以了,以前楞是没注意到BROKER_BACKEND这个参数,还以为必需要RabbitMQ。

顺便附上只使用sqlite的:

1
2
3
4
5
6
7
8
9
BROKER_BACKEND = 'sqlalchemy'
BROKER_HOST = "sqlite:///my.db"

CELERY_RESULT_BACKEND = "database"
CELERY_RESULT_DBURI = "sqlite:///my.db"

CELERY_DEFAULT_RATE_LIMIT = '500/m'

CELERY_IMPORTS = ('app.tasks',)

要使用sqlite要安装kombu-sqlalchemy,sqlalchemy

1
sudo pip install sqlalchemy kombu-sqlalchemy

如果使用mysql的配置方法类似。 我在小系统上面就是喜欢sqlite,小数据量的时候性能很不错,而且占内存也小。

以前写任何web应用的时候都找 WYSIWYG 的编辑器,后来发现了markdown这么一个东西。在很长的时间里都没有真正的去使用过它。昨天查找资料的时候在某人的博客看到markdown,突然又对这个燃起了些兴趣。

markdown的格式易于阅读,自从习惯了VIM后,对这种不需要强大的编辑器支持的标记语言也觉得很爽。所以就决定把blog换成使用markdown来编写文章。

默认的markdown的code block是不支持标记为何种语言的,这样如果全部交给pygments来识别,有些地方可能识别率真不够高。所以还是喜欢自己来指定这段代码使用的是何种语言。

1、启用fenced_code扩展

1
markdown(code,extensions=['fenced_code']

这样就可以使用fenced_code来扩展markdown的语法了。使用方法如下:

1
2
3
4
~~~~.python
def hello():
print "hello"
~~~~

2、使用pygments高亮代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def markdowntohtml(value):
"""将markdown转换成html并高亮代码"""
value = value.replace(u'全角空格',u'&#12288;')
value = markdown(value,extensions=['fenced_code'])#用markdown进行解析
#用lxml来用语法高亮
soup = fromstring(value)#生成dom对象
for s in soup.xpath('//pre/code'):
if s.get('class'):#判断是否指定class属性,用来确实用哪种lexer分析语法
lexer = get_lexer_by_name(s.get('class'))
result = highlight(s.text,lexer,HtmlFormatter())#生成高亮处理后的html
#替换掉原来的节点
s = s.getparent()
result = fromstring(result).xpath('//div')[0]
soup.replace(s, result)
return etree.tounicode(soup)[:-7][6:].replace(u'&#12288;',u'全角空格')

上面是我自己实现的解析markdown并实现代码加亮的代码,并保留中文的全角空格,我喜欢用中文的全角空格来实现段前空两格。

3、唠叨几句

其实markdown还有一个extension来配合pygments加亮代码,但那个似乎不能自己指定代码是什么语言,所以就配合lxml自己实现了一个。

最近觉得WinManager里面带的FileExplorer不太好用,听说NERD Tree不错就打算换上它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"NERD Tree设置名称
let g:NERDTree_title="[NERD Tree]"

"winManager setting
"设置界面分割
let g:winManagerWindowLayout = "NERDTree|BufExplorer|TagList"

"NERD Tree配置
function! NERDTree_Start()
exec 'NERDTree'
endfunction

function! NERDTree_IsValid()
return 1
endfunction

"定义打开关闭winmanager按键
nmap <silent> <F8> :if IsWinManagerVisible() <BAR> WMToggle<CR> <BAR> else <BAR> WMToggle<CR>:q<CR> endif <CR><CR>

将这段代码添加到.vimrc文件中去。

因为NERD Tree和WinManager有冲突,会在调用的时候弹出一个空白的BufExplorer,所以我在调用的快捷里面加上了判断,如果WinManager打开就执行一个:q,关闭掉空白的BufExplorer。

平时想写脚本去自动连接ssh服务器的时候都是在服务器上添加公钥。

但有时候不想在服务器上搞这个东西,那就要用到sshpass这个东东了。

sshpass -p “密码” ssh -o StrictHostKeyChecking=no 用户名@主机地址

tip

StrictHostKeyChecking最好加上,否则第一次连接的时候会有问题。

Celery是一个开源的基本分布式的任务队列程序,硬着头皮啃了一下这家伙的文档,终于啃出点感觉来。原来在介绍里面看到数据存储可以是sqlalchemy、redis、mongodb等等,一直以为可以不装rabbitmq使用。结果配置了一下马上提示无法连接broker,悲剧了。于是把RabbitMQ也给装上了,很是不想装这个玩意,觉得太大了,好在安装还是比较简单的,官网上有deb安装包。

安装的时候会提示缺少erlang:

sudo apt-get install erlang

然后就启动一下服务就可以用了。

Celery使用上也算方便,直接使用装饰器就可以定义一个任务。 example 用来快速实现异步任务队列很容易。但我自己还是喜欢小点的简单点的,一般的程序也不需要太复杂的,所以就选中了Httpsqs。

httpsqs使用tc做数据库,用http来操作消息队列。

非官方的Python Client: http://wendal.net/261.html ,这个客户端的使用上还是有点问题,不会自动用urlencode编码,结果+号传过去就传不回来了,有想改一通的冲动。这个冲动还是留在用到的时候再说吧。

一般情况我还是会用httpsqs来写吧,如果想跟随主流就用celery。

Redis这个数据库据说性能非常高,很适合拿来做缓存,所以就想着给Flask做个使用Redis的Cache模块。

1、装Python的Redis驱动

1
easy_install redis

或着

1
pip install redis

2、参考Flask-Cache模块写了一个rediscache模块

下载地址: rediscache.7z

3、使用方法

基本用法跟Flask-Cache类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#-*- encoding:utf-8 -*-
from flask import Flask
from Utils import cache

app = Flask(__name__)
cache.init_app(app)

@app.route('/')
@cache.cached(timeout=30)
def index():
return "hello world"

if __name__ == '__main__':
app.debug = DEBUG
app.run('127.0.0.1', 8080)

其它用法可以参考源代码,反正源代码也就这么几行。