今天我写了一个处理 Google Reader API 的 Python 模块,当我在其他程序中 import 这个模块的时候,第一次运行(在生成 pyc 文件之前)顺利通过,第二次运行就失败,显示如下错误:
Traceback (most recent call last):
File "test.py", line 1, in <module>
import readerapi
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 36-37: invalid data
但是我尝试在 Notepad++ 中将文件编码进行改变:ANSI、带 BOM 的 UTF-8、不带 BOM 的 UTF-8,始终都是失败。
后来我尝试把文件从桌面(这个路径含有空格和中文)转移到一个简单的路径,运行就没有问题。
折腾了半天未果,怀疑是 3.0.1 有 bug,下载安装 Python 3.1 alpha 1 就好了=.=!
Notepad++ 是一个开源的文本编辑器,功能强大而且使用方便。编辑和调试 Python 程序使用什么编辑器或者 IDE 不同人有不同见解。在不考虑使用调试工具的情况下,Vim 或者 Emacs 用户自然可以无视其他编辑器,不过在 Windows 环境下,使用 Notepad++ 之类的编辑器也是很好的选择。
我是在 PortableApps.com 上下载的 Notepad++ Portable,它的好处是可以在每次关闭程序的时候把所需的配置文件单独保存,省却每台机器上重新配置的烦恼。
Tab长度和空格转换
因为 Python 对缩进要求严格,我们将 Tab 设置成4个空格,在 "设置->首选项->编辑->制表符设置" 中修改。
语法高亮
只要正确设置了扩展名,Notepad++ 就会自动识别语言并进行语法高亮。如果对高亮的颜色或者字体不满意,在 "设置->语言格式设置" 中可以进行修改。
自动完成
Notepad++ 也提供了自动完成和输入提示功能,在 "设置->首选项->备份与自动完成" 中可以设置。Python 的自动完成所需的文件在安装的时候自带了,存放在 "YOUR_NPP_DIR\plugins\APIs"(详见官方FAQ:Auto-completion)。默认的快捷方式是 Ctrl+Space 和 Ctrl+Enter,可能和输入法的快捷键冲突,不过 Notepad++ 的所有快捷键都可以自定义。
运行程序
点击 "运行->运行" (默认快捷键是 F5 ),在弹出的菜单中输入:
cmd /k C:\Python30\python.exe "$(FULL_CURRENT_PATH)" & PAUSE & EXIT
选择 "保存",就可以给这条命令设置一个快捷键并起一个名字,比如叫 "Run Python"。以后运行直接按自定义的快捷键就可以了。注意如果想修改这个快捷键,可以在 "设置->管理快捷键->Run Commands" 中修改。还有几点说明:
- 如果想修改这条命令,目前只能通过修改 shortcuts.xml 文件,这个文件保存在 Notepad++ 的配置文件中,可能在 Notepad++ 的目录,也可能在 Documents and Settings 下的 Application Data 内。
- $(FULL_CURRENT_PATH) 的含义是当前文件的完整路径,这是 Notepad++ 的宏定义,更多的相关宏可以参见官方FAQ:Run external tools。注意要用引号括起来,防止路径中间有空格。
- 直接执行 python.exe 在运行结束后窗口会自动关闭,所以要用 cmd 来执行。(在 Python 2.5 似乎有所不同,但是 3.0 需要这样设置。)
- cmd /k 的含义是执行后面的命令,并且执行完毕后保留窗口。& 是连接多条命令。PAUSE 表示运行结束后暂停,等待一个任意按键。EXIT 表示关闭命令行窗口。如果使用 cmd /c 就可以省掉 EXIT 了。
更多 Plugin
因为 Notepad++ 支持插件扩展,所以可以使用很多有用的插件(下载页面有插件列表)。比如有一个插件:NppExec,可以在 Notepad++ 中增加一个 Console 窗口,使得运行命令和脚本更加方便。可以通过这个插件设置 Python 的运行命令。
不过这个插件有个问题是只有程序运行结束了才会返回输出结果,这样就没法实时观察程序的运行了。不知道有没有好的解决方法?
2009-03-14Up:
关于输出不及时问题,可以通过刷新 stdout 缓冲来解决。
前几天决定尝试下 Python 3.0,安装的版本是 3.0.1。不出意外,原来的代码都不能用了。
我想要修改的是使用 Python 登录网站中的程序,经过把 print 语句改成函数,重新查找标准库的用法,修改字符串的表达方式这些常规的修改,终于不提示语法错误了。
不过我运行程序,却发现没有登录成功。经过调试,发现在发送登录请求的时候,编码出了问题。论坛需要 GBK,而 Python 使用 urlencode 编码得出的是 UTF-8。
在 Python 3 中取消了原来的 unicode 类型,现在的字符串类型为 str,并且存放的就是 unicode 字符串。这样,在 Python 程序内部就不用为各种字符编码困扰了。现在使用字符串,只要保证在与外界交互,即读取(比如赋值、从文件读、从网络读)和输出(比如存储文件、发送信息)的时候使用正确的编码即可。但是这样也就造成原来很多程序都要重新写。
字符串经过具体编码,就不再是 str 了,而是 bytes 类型。对一个 str 可以用个 encode 编码成 bytes 数据,而一个经过编码的 bytes 数据可以通过 decode 解码成 unicode 字符串。在 Python Docs: What's New In Python 3.0 : Text Vs. Data Instead Of Unicode Vs. 8-bit 中有详细说明。
在读取文件的时候,默认是以 text mode 打开的,所以读取的资料直接可以存放到 str 字符串中,同时在 open 的时候可以指定编码系统。而如果文件不是文本,则需要在 open 的时候使用 "b"以 binary mode 打开。
回到之前那个论坛登录程序,我使用标准库自带的 urlencode 将个人用户名和密码等参数进行 URL 编码,而由于 Pyhton 字符串机制发生根本变化,这个函数默认将文字(比如用户名是中文)按照 UTF-8 进行编码。而论坛需要的是 GBK 编码,所以造成无法登录。
通过查看标准库相关的代码:Lib\urllib\parse.py 文件中的 urlencode 函数可以看出,它默认使用的就是 UTF-8,也没有提供可选的编码参数。所以要想实现 GBK 编码,只能放弃使用 urlencode 函数,直接使用 quote_plus 来编码。不过就要手动实现把编码后的参数用"&"连接起来了。
如果在安装过程中选择了商用环境,那么 TeamViewer 安装结束后就是试用版,在使用一段时间后过期。
因为 TeamViewer 的 ID 是根据包括 MAC 地址在内的硬件信息生成的,所以即使重装系统,依然会生成同一个 ID,那么原本是商用的 ID 在重新安装的时候就会跳过"Environment"这一个选择页面。
从原理上,修改 MAC 地址可以欺骗软件认为换了一台机器,重新生成一个 ID,不过这个我没有尝试成功,我想可能是没有把系统已安装的信息清理干净,软件没有重新扫描硬件信息。
下面介绍一个简单的方法,也是官方提供的,不过"隐藏"得比较深。
在菜单上选择 Extras -> Your trial period,这个选项只有试用版才有,免费版是没有的。然后会弹出一个窗口,选择 extend the trial period,这个时候重新选择 I use TeamViewer for .. 下面的 personal,输入 Email 即可,最后那个 newsletter 的选项可以去掉,点击 continue 即可。
其实这个网页为:
http://www.teamviewer.com/integrated/trial.aspx?ID=你的ID&IC=你的IC
分析一下软件生成的日志文件可以知道这个 IC 相当于一个校验码,应该是先于 ID 在本地产生的。
如果按照上面的方法,被告之验证错误,无法点击 continue,这个时候可能是服务器那边有问题,稍等刷新即可。
Linux 下远程终端操作和本地没什么区别,但是 Windows 环境下就对远程控制/远程桌面软件有很大的需求。
这类软件对网络环境的要求很高,比如在局域网内我觉得使用 Windows 自带的远程桌面最方便;对使用者也有一定的要求,在公网下最方便的应属 QQ 远程协助。
我有一台机器处于教育网,一台机器处于不能修改路由设置的局域网,一般软件很难胜任这种"糟糕"的网络环境,经过试用,我觉得 TeamViewer(主页) 非常不错:
- 使用方便,应用范围很强,可以说只要计算机能连上 Internet,就可以远程控制。
- 个人非商业使用是完全免费的!
- 提供免安装版(安装以后有更多的功能) 。
- 有 Mac 版本。
下面我详细介绍安装的过程,因为如果不小心把用户类型选择成商用,就变成试用版了,不太容易再改成个人版。
从官方网站上下载(便携版)后运行,我下载的是普通的安装版,进入第一个选择界面如下:
第一项"Install"是将软件安装到计算机中,第二项"Run"相当于免安装,想立刻使用的可以先试试这项,没有管理员权限时也可以使用。注意,这里的免安装并不是便携,因为它仍要写注册表和配置文件。如果选择"Install",不妨把下面的高级设置选上,可以多设置一些参数。
点击"Next"进入下一个页面,这一步选择非常重要。
第一项"company"是指商业应用,选择以后软件就是试用版,有使用期限,过期可以申请延长和更改许可(但是我没有试过,只是看到菜单上有这一项)。而且一旦选定,即使重装系统安装的时候也不会再出现这个页面了。所以我们选择第二项"personal",这是免费的,而且功能也不少,只是在每次连接结束后会弹出一个提示你不能商用的窗口。
这步不用多说,勾选上即可,因为上面选择的是个人非商用,所以这里第二项就是保证在本台机器上是个人使用。
这一步是选择是否开机启动服务,对于要远程控制的机器,肯定是要选择随 Windows 启动。只有这样才能使用远程重启的功能。下面要求输入的密码就是远程登陆所需要的密码。当然,选择"Normal installation"之后也可以很方便的设置成随 Windows 启动。
最后是询问是否安装 VPN,不知道这是什么的可以先不安装,之后在软件的选项中可以随时安装卸载。
再之后就是常规的安装步骤,一路 Next 下去即可。
安装完之后(或者在第一步点击了 Run),就可以运行了,保证计算机联网就可以获得一个九位 ID 和一个四位 Password,显示在"Wait for session"中,如下:
这个 ID 是根据机器的硬件信息(这个信息至少包含了MAC地址)生成的,所以即使重装系统,ID 也不会变化。而四位的密码则是每次随机生成的,如果对密码进行了自定义,则会显示"Predefined"。
如果另外还有一台机器也安装了 TeamViewer,在"Create session"中输入对方机器的 ID,并且经过密码认证,就会连接到远程桌面。
连接上以后的设置就比较普通了,比如画面质量、远程屏幕分辨率、是否显示桌面等等。文件传输也非常方便。
使用远程桌面的控制面板:Actions-> Switch side with partner,可以立刻切换控制和被控制的两端。这个功能也是非常有用的。当有的时候因为防火墙设置等原因(比如在使用 IP 直连时),可能会出现只有一端能连到另一端,但是反过来则因为被防火墙屏蔽无法连上,这个时候用切换功能就很方便。
TeamViewer 允许在 ID 中直接输入 IP 地址,这在局域网环境中非常方便,但是注意要在 Options -> General -> Connection -> 勾选 Accept incoming LAN connections。
当需要控制的机器很多时,要记住这些 ID 也是件麻烦事。申请一个 TeamViewer 的账户就方便多了,点击程序主界面下方的"Partner list"就可以注册和管理了。
最后还有几点相关的内容:
- 如何屏蔽使用 TeamViewer。因为此软件的穿透能力很强,对个人自然是好事,但是对公司数据的安全就造成了威胁。因为 TeamViewer 获取 ID 必然要连上自己的服务器,所以只要屏蔽这个服务器即可。
- 关于数据传输安全,因为使用 ID 进行连接必定要在服务器进行数据交换(使用加密传输),所以这一步的数据安全只能依靠 TeamViewer 公司来保证了。在建立了连接后,应该就是两端直接相连了。
- 有一个 CrossLoop 的软件功能和 TeamViewer 差不多,不过我用了一下,没连上...
- 我看到一个十分详细的 TeamViewer 使用说明:Jackbin 的懶人筆記: 功能強大的遠端控制軟體 (2) - TeamViewer,从安装到注册到配置各个细节都有。文章的选项界面和我略有不同,应该是版本问题。
- 如果不小心把应用环境选成了商用,改回个人免费版的方法见:如何将 TeamViewer 从商业试用版改回个人免费版。
本来,退订一个 Blog 是不应该单独写一篇的,不过月光博客如此知名,写写倒也无妨。我还记得,在月光博客上看到很多写作技巧类的文章,比如十个避免RSS订阅被退订的方法。
之前,我忍痛退订了 GSeeker(G速客),毕竟是换人了,关注内容和文章风格差异太大。
这次,退订月光博客,我也考虑了很久,很早就有这个念头,因为这个博客的内容已经不再吸引我了。
- 新闻类的文章:就内容来说,不是独家或首发,到处都能看到,就文章质量来说,仅仅是简单的介绍,没有深度的内容。(这让我非常怀念当前的 GSeeker,每篇文章都有自己的测试和见解。)比如说,讨论某次 Gmail 界面更新,我看的其他任何一个写同样内容的 Blog 都要比他的详尽。我感觉,仅仅是为写这个话题而写这篇文章,是为了搜索引擎优化吗?
- 教程类的文章:现在几乎没有了。
- 翻译类的文章:我现在也订阅原文出处的 Blog,所以这类文章对我而言没有必要了。而且,翻译的内容甚至还不如原文内容多...也很少很少有个人的补充和见解。
- 时事类的文章:力度和深度都不够,对问题的分析不够透彻,感觉行文仓促。
我一边写上面的文字,一边在想,我写下这篇的目的是什么。我想,主要还是对这个原本觉得不错的知名博客的失望吧。我猜测,很有可能是在写博客上面的时间投入不如以前多了。
今天我的一台 Sony SZ28 笔记本在把音量调大的时候突然发出刺耳的啸叫声,就跟以前把麦克风靠近音响时的声音一样,调节屏幕面板角度,声音也会不同。
的确是我没有把内置的麦克风(在摄像头旁边)静音造成的。这是麦克风和扬声器的自激效应。扬声器声音能量的一部分通过声传播的方式传到麦克风,又被麦克风放大而引起啸叫。这个问题在很多笔记本中都存在,Sony SZ 系列听说尤其明显。
所以解决这个问题,有如下几种选择:
- 在音量设置里面将麦克风静音。
- 如果需要使用麦克风,并且没有外置的,则需要将麦克风音量调小,关闭高级选项里面的麦克风增强。
- 使用耳机或者外置的麦克风。
出现这个问题不能说笔记本的设计不好,我觉得这种声反馈很难避免。而且越是高品质、高敏感度的设备越容易出现声反馈。
当我们把麦克风静音的时候,并不是禁止麦克风接收声音,而是不让扬声器反馈麦克风的声音。事实上,静音状态下,麦克风还是正常工作,并且可以录音。







