用Python 2/3建立最简单的web服务器

在Python 2.x中,可以用如下的命令启动一个最简单的Web服务器(默认端口号8000):

python -m SimpleHTTPServer [端口号]

接下来直接访问 http://localhost:[端口号] 即可 在Python 3.x中,这几个模块都已经改名了,如果需要如上的功能,可直接换用如下命令:

python3 -m http.server [端口号]

参见: http://stackoverflow.com/a/7943768

阅读更多

用Scriptish来修复教务网的显示问题

嗯,火狐打开jw.dhu.edu.cn的“查看选课结果”页面是这样的(没有显示课程门数和学分信息): [caption id=”attachment_290” align=”alignnone” width=”869”]教务网在Firefox下的显示结果 教务网在Firefox下的显示结果[/caption] 好吧,祭出Scriptish,写脚本,期间遇到问题。唉,不说了,上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ==UserScript==
// @name Fix innerText for JW.DHU
// @namespace www.robberphex.com
// @include http://jw.dhu.edu.cn/\*
// @version 1
// ==/UserScript==

Object.defineProperty(HTMLElement.wrappedJSObject.prototype, 'innerText', {
get: function(){
return this.textContent;
},
set: function(val) {
this.textContent = val;
}
})

使用方法 首先,为火狐安装Scriptish扩展。 然后,将上述代码保存到一个js文件中。 在 about:addons 页面,点击右上角的齿轮,选择 “Install Script From File”(从文件安装User Script),选择保存代码的js文件,点击确认即可。 显示结果(显示了课程门数和学分信息。_数值什么的,看看就好_): [caption id=”attachment_292” align=”alignnone” width=”854”]修改后的教务网显示结果 修改后的教务网显示结果[/caption]

阅读更多

PEP 3107 -- 函数注解[译]

本文是PIP 3137的翻译。

背景

Python 2.x系列缺乏一个标准的方式来说明一个函数的参数和返回值,各种工具和库的出现填补了这一空白。一些工具使用了“PEP 318”中的装饰器,而其他的工具则去解析函数的文档注释,寻找注解。 在这一点上,众多已存在的机制和语法造成了很大的混乱。本PEP的目的是提供一个单一的,标准的方式指定这些信息,减少这些混乱。

函数注解的基础知识

在仔细讨论Python 3.0的函数注解的细节之前,首先让我们大致讨论下注解是什么、不是什么:

  1. 函数注解,无论是对参数的还是对返回值的函数注解,完全是可选的。

  2. 函数注解无非是一种方法,用来在编译时将任意Python表达式和函数的不同部分关联起来。就这点而言,Python并没有给注解赋予特殊的意义和重要性。Python仅仅让这些表达式可以被访问而已,以一种像本文的“访问函数注解”中描述的方法。注解对含义产生作用的唯一方式是当它们被第三方库解释的时候。这些注解的使用者可以用这些函数注解做他们想做的任何事情。例如,一个库可以利用字符串类型的注解来提供改进过的帮助信息:

    1
    2
    3
    4
    def compile(source: "something compilable",
    filename: "where the compilable thing comes from",
    mode: "is this a single statement or a suite?"):
    ...

    另一个库可以用来提供Python函数和方法的类型检查。这个库可以使用注解来说明函数的预期输入和返回值的类型:

    1
    2
    def haul(item: Haulable, \*vargs: PackAnimal) -> Distance:
    ...

    然而,不论是第一个例子中的字符串还是第二个例子中的类型信息,它们自己没有任何含义;含义来自第三方库。

  3. 根据第二点,该PEP不会试图引入一种标准的语义,即使是为那些内置类型。这个工作留给第三方库。

语法

参数

对参数的注解跟随着参数名,采用了一种可选表达式的形式:

1
2
def foo(a: expression, b: expression = 5):
...
阅读更多

Fedora 20 Release Party Shanghai Report

The Fedora 20 Release Party in Shanghai was successfully held at 联合创业办公社 on Dec 22. It was organized by Fedora Zhongwen User Group and Shanghai Linux User Group. The release party began at 1:20 pm. (It was late for about 20 minutes.) After a short Opening address by me, speakers start talks. The first talk is “Fedora.prev & Fedora.next” by Robin Lee(a Fedora packager and skilled programmer). He introduce the new model of Fedora package system: Split single repository into four Ring. And organize some working group to maintain Ring. That model makes Fedora more friendly for other company. [caption id=”attachment_260” align=”aligncenter” width=”300”]“Fedora.prev & Fedora.next” by Robin Lee “Fedora.prev & Fedora.next” by Robin Lee[/caption] The second talk is about Fedora ARM by Fu Wei(a Software Engineer, in Fedora ARM team). He introduce how to make rpm package and image for ARM, some ARM server(Linaro). Then, He introduce LAVA, a automated test platform for ARM. [caption id=”attachment_262” align=”aligncenter” width=”300”]Fedora ARM by Fu Wei Fedora ARM by Fu Wei[/caption] After talks, the pizz is arrived, we start free talk, every talk about some Technical point, such as Python, Perl, OpenStack, etc. [caption id=”attachment_264” align=”aligncenter” width=”300”]free talk free talk[/caption] Last, we take a group photo. [caption id=”attachment_265” align=”aligncenter” width=”300”]Group Photo Group Photo[/caption] It is worth pointing out several issues for the event. The pizzas was sent earlier than the end of talks. There is not Registration. So to avoid the issues:

  • To prepare better, submit the budget earlier.
  • Contact the speaker before party.
阅读更多

Fedora 启动时初始亮度过暗的解决方案

本人惠普的本,安装 Fedora 后,启动后屏幕很暗。每次开机后必须使用 Fn 键来提高屏幕亮度,搜索了下,可以加启动参数来解决此问题。

解决方案一

添加启动参数 acpi_osi=Linux acpi_backlight=vendor 。 注意:我的电脑上,如果不加 acpi_osi=Linux 参数,屏幕亮度没有问题,但是笔记本休眠后无法唤醒。

解决方案二

添加启动参数 video.brightness_switch_enabled=1 video.use_bios_initial_backlight=0 。 来自 https://bugzilla.redhat.com/show_bug.cgi?id=912599#c4

阅读更多

将OVA格式的虚拟机导入KVM

首先,用file命令查看OVA文件,即可看到OVA文件实际就是tar文件:

1
2
$file Hortonworks+Sandbox+2.0+VirtualBox.ova 
Hortonworks+Sandbox+2.0+VirtualBox.ova: POSIX tar archive (GNU)

使用tar命令可以看到,其中包含了两个文件:

1
2
3
$tar tf Hortonworks+Sandbox+2.0+VirtualBox.ova 
Hortonworks Sandbox 2.0 VirtualBox.ovf
Hortonworks Sandbox 2.0 VirtualBox-disk1.vmdk

用tar解压:

1
2
3
$tar xvf Hortonworks+Sandbox+2.0+VirtualBox.ova 
Hortonworks Sandbox 2.0 VirtualBox.ovf
Hortonworks Sandbox 2.0 VirtualBox-disk1.vmdk

ovf文件保存的是配置信息,没法直接导入;但是一般能导入vmdk格式的镜像就可以了。 把vmdk格式的镜像转化为qcow2格式的:

1
2
3
$qemu-img convert -O qcow2 \
'Hortonworks Sandbox 2.0 VirtualBox-disk1.vmdk' \
'Hortonworks Sandbox 2.0 VirtualBox-disk1.qcow2'

转换完成后,用 Hortonworks Sandbox 2.0 VirtualBox-disk1.qcow2 文件创建虚拟机即可。

阅读更多

[转载]提升WordPress站点速度的八个建议

转自http://developer.51cto.com/art/201309/409825.htm WordPress是一个很棒的开源程序,几乎我认识的站长朋友当中,粗略估算有80%使用Wordpress。但很棒不等于完美,就在我所认识的这些朋友中,几乎所有人都会抱怨Wordpress太臃肿,运行效率太低了,大家有无同感? 所以,今天这篇博文和大家分享8个小贴士来提升WP的运行效率,如果您运用了这些方法后发现确实有帮助,请把这篇博文分享给更多的人好吧?当然为了尊重劳动成果,也烦请指明出处。

  • 使用高效的缓存插件

WordPress的插件们是非常有用的, 我推荐一款缓存插件可以改善页面载入时间,它就是W3 Total Cache,有了这个插件之后咱就不再推荐你其他缓存插件了,因为所有缓存插件有的功能它都有了,而且安装和使用非常方便。 拥有这款插件之后,你的页面载入速度会加快,因为网站的主要元素已经被缓存了。

  • 使用内容分发网络 (CDN)

基本上所有你喜欢的大网站都会使用CDN。简单来说,CDN是把你站点上的文件们(CSS\JS\图片等)发布到最接近用户所在的网络区域,让用户就近下载,这样就能提高站点运行速度。在国内ChinaCache是比较有名的CDN供应商,不过价格贵了一些,像各大门户网站,比如腾讯、新浪、网易等等都是用ChinaCache。所以不管你在哪里,访问这些门户网站都会觉得速度很快。当然啦,对于小站来说,这个成本可能会高一些。 所以,你无论是在南方,或者北方,还是在北美,访问这些门户网站,感觉速度都很快,最主要的原因之一就是CDN发挥了效果。一般小网站是用不起这服 务的,所以慢点就慢点了吧,可以租用互联互通的6线机房(6线机房是指包括网通、电信、铁通、移动、联通、教育网等多线接入的骨干网IDC机房,彻底消除 各地网络瓶颈,保证互联网访问畅通无阻的高速机房。) 顺便提一下,还有一个Wordpress插件叫Free-CDN,号称也能达到类似的效果,虽然我还没有做过测试…

  • 图片优化很重要

Yahoo! 有一个图片优化软件叫Smush.it可以最大程度无损压缩图片,不过,除非你超级有耐心,否则一张张压缩图片的话太浪费时间了,好在,还有一个很给力的WP插件叫WP-SmushIt,这货可以为你网站上所有的图片做一次性压缩,所以没有理由不去用它。

  • 优化你的WP数据库

你可以用WP-Optimize这个插件来优化你的WP数据库(清理spam,反复改版的文章,草稿,表格等等为你的服务器腾出更多空间从而提升效率);还有一些插件如WP-Cleaner,DB-Manger等。

  • 开启防盗链机制
阅读更多

C/C++语言对宽字符集的处理

我们接触C语言中的字符是从char开始的,但是众所周知,char类型是不支持中文的,于是那些先贤们把字符扩展为宽字符来表示一些非ANSI字符。 但是没有C语言标准支持的话,各个厂商又要开始各自为政,C语言的代码跨平台优势也就没有了,所以C99添加了对宽字符的支持。

C语言对宽字符的支持

wchar_t

对应与常见的char,宽字符版的char是wchar_t,wchar_t不是内置类型,而是定义在wchar.h文件中的。

有了wchar_t,我们可以在程序中存储宽字符了。

另外,wchar.h中定义了一个极为有用的宏L,它用来存储wchar_t常量。举例如下:

L”鲁”,L’鲁’ 分别表示的是字符串鲁和宽字符鲁。至于”鲁”,则在不同的平台下有不同的程序内表示方法,不跨平台。

wscanf, wprintf

能存储宽字符后,我们还得输入输出宽字符,所以wscanf, wprintf, wgets 等等函数都出现了,他们都是对应函数的宽字符版。

wscanf和wprintf的第一个参数是指向wchar_t的指针,为格式化字符串。

阅读更多

给Eclipse添加pkg-config支持

原来用gedit+gcc来编写GTK程序(主要是学习例程),后来随着代码越写越多,需要一个IDE来辅助开发,于是想到了万能的Eclipse。 可是Eclipse可以支持C语言开发,却不支持pkg-config命令集成。搞得每次新建GTK工程都要把pkgconfig的输出改到Eclipse中。 后来烦了,自己google之,得解:http://marketplace.eclipse.org/content/pkg-config-support-eclipse-cdt

安装Eclipse

首先,安装jre和jdk等依赖。 接下来下载Eclipse。我原来下载了Eclipse 4.3 Classic ,但是最新版成了Eclipse 4.3 Standard ,都是可以的。 然后解压Eclipse。(双击eclipse文件即可运行Eclipse) 另外,Eclipse CDT和gtk开发的其他依赖包也要安装。

安装Eclipse Marketpalce Client(MPC)

我下载的是Eclipse 4.3 Classic,所以需要安装MPC;如果你下载的是Eclipse 4.3 Standard,可以跳过此步。 在Install New Software窗口中选上所有网站,然后搜索market即可看到MPC;点击下一步,然后同意许可协议等。 安装完成后重启Eclipse即可完成MPC的安装。

在market中安装Pkg-config support

在帮助菜单中打开Eclipse Marketpalce: 1 搜索pkg-config,如图: 2 点击安装,一直确认、同意许可协议。

Pkg-config support的使用

首先,创建一个Hello World C工程,贴入GTK程序代码(代码附后),此时Eclipse提示程序中有好几处错误/警告: 3 接下来,打开项目的设置菜单 -> C/C++ Build -> Settings -> Pkg-config 选项卡: 4 在其中的选项中勾选 GTK+-2.0 (我个人使用的是GTK 2.0,可根据自己的情况酌情选择): 5 然后点击确定。 稍等几秒后就会发现Eclipse识别出来了头文件包含、GTK类型定义等,如图: 6 点击运行(Run),可以看到GTK程序在Eclipse中正常运行: 7 GTK测试代码

#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

阅读更多

unzip的中文问题

唉,unzip的-O选项一直是一个传说中的存在,而且unzip的开发者一直没有意向修复。 故自己动手,丰衣足食,用python写了一个MultiCharset ZIP,代码附上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sys
import zipfile
from optparse import OptionParser

def listZip(zipf):
    print "Archive:  %s" %zipf
    print "  Length      Date    Time    Name"
    print "---------  ---------- -----   ----"
    filist=zipfile.ZipFile(zipf).infolist()
    totalnum=0
    totalsize=0
    for finfo in filist:
        totalnum+=1
        totalsize+=finfo.file_size
        print "%9d " %finfo.file_size ,
        print "%04d-%02d-%02d" %(finfo.date_time[0],finfo.date_time[1],finfo.date_time[2]),
        print "%02d:%02d  " %(finfo.date_time[3],finfo.date_time[4]),
        print finfo.filename.decode('gb18030').encode('utf-8')
    print "---------                     -------"
    print "%9d" %totalsize ,
    print "                   ",
    print "%d files" %totalnum

def exZip(zipf,exdir):
    zf=zipfile.ZipFile(zipf)
    nlist=zf.namelist()
    nlist.sort(key=lambda x:len(x))
    for fn in nlist:
        fnew=unicode(fn,'gb2312').encode('utf8')
        if fnew.endswith('/'):
            os.mkdir(exdir+fnew)
        else:
            file(exdir+fnew,'wb').write(zf.read(fn))
        print fnew
    zf.close()

def main():
    usage = "usage: "+sys.argv[0]+" [options] zipfile1 zipfile2"
    parser = OptionParser(usage=usage)
    parser.add_option("-l","--list",action="store_true",help="list files in zip file",dest="islist",default=True)
    parser.add_option("-x","--extract",action="store_true",help="extract zip files",dest="isex",default=False)
    parser.add_option("-d","--exdir",action="store",help="define extract directory",dest="exdir",default=".")
    #parser.add_option("-z","--exdir",action="store",dest="exidr")

    (options,args)=parser.parse_args();

    if(options.isex):
        for zf in args:
            exZip(zf,options.exdir+"/")
    else:
        if(options.islist):
            for zf in args:
                listZip(zf)

if __name__ == "__main__":
    main()

可以在~/bin/目录下创建一个mczip文件,写入代码,添加可执行权限,即可在终端中用mczip来列出zip文件内容、解压zip文件。

用法:

1
2
3
4
5
6
Usage:mczip.py [options] zipfile1 zipfile2
Options:
-h, --help            show this help message and exit
-l, --list            list files in zip file
-x, --extract         extract zip files
-d EXDIR, --exdir=EXDIR     define extract directory`

只有列出zip包的文件内容和解压zip文件两个功能,只能处理gb18030编码。

注:Python3的zip模块判断更加奇葩了,只要文件名不是ascii编码,就认为是utf8编码,而且不保留bytes格式的文件名,有点难办啊。

阅读更多