0
Posted on 上午11:24:00 by Fan Zhang and filed under

本文在 github 中的镜像:Python 的 and-or 技巧

布尔上下文

在 Python 中,可以在布尔上下文中使用几乎所有类型的表达式。通常的数据类型的“空值”都为 False。

  • None 为假值
  • 数值 00.0 等为假值
  • 空串 "" 为假值
  • 空列表 [] 为假值
  • 空元组 () 为假值
  • ...

逻辑演算

在 Python 中,and 和 or 按照下面的规则执行布尔逻辑演算:

对于 and,从左到右运算:

  • 如果所有表达式都为真,则 and 返回最后一个表达式。
  • 否则,and 返回第一个假值。

对于 or,从左到右运算:

  • 如果有一个为真,则 or 立刻返回该值。
  • 否则,or 返回最后一个表达式。
  • or 找到第一个真值后会忽略计算剩余的表达式。

注意到:返回的并不是布尔值,而是其中某个参与比较的表达式值。

and-or 技巧

在 C 中,表达式 bool ? a : b 表示当 bool 为真时结果为 a,其它值则为 b。在 Python 中可以使用 and-or 实现类似的功能。

 
((test and [x]) or [y])[0]

在这个 Python 表达式中,如果 test 为真,则返回 x,否则返回 y。

这里使用列表将 x 和 y 括起来是为了防止 x 为空值的情况,比如想要实现:“如果 test 为真,则取 0,如果 test 为假,则取 1”,如果不将 0 括起来则为:

 
(test and 0) or 1

不论 test 是真是假,都只会返回 1。

0
Posted on 下午11:40:00 by Fan Zhang and filed under

行结束符

一个文本文件是由行组成的,本文所说的就是行与行之间用来表示新行(newline)的间隔,一般称作断行符(link break)或者行结束符(end-of-line, EOF)。

由于历史的原因,不同的操作系统用来表示换行的字符不同,这就给跨操作系统编辑文件带来不便。

操作系统中的差异

使用下面的 Unicode 标准定义的符号:

  • LF: Line Feed, U+000A, '\n'
  • CR: Carriage Return, U+000D, '\r'

不同的操作系统使用的行结束符:

  • Windows 使用 CR+LF,也就是 '\r\n'
  • Linux/Unix 系列使用 LF,也就是 '\n'

特别的,目前 Mac OS X 是基于 Unix 的,所以行结束符也是 LF。只有 v9 之前 Mac OS 才是用 '\r'。

历史

为什么对“另起一行”的处理有这样的差异,是因为早期的电传打字机(teletype)从左至右打完一行的时候,需要给打印机头重新移回左边界的时间,在一个字符的时间内,不足以让打印机头移动到正确的位置,这样会影响下一个字符的打印。所以就需要在一行结束的时候额外传递一个 CR 字符令装置 carriage 归位。

进一步阅读:Wikipedia: Newline

对不同换行符的处理

一般操作系统的运行库决定了文本文件的换行格式,在一个平台上使用另一种换行符的文件通常会有问题。大部分编辑器会自动识别换行符类型,并带有换行转换的功能。

比如某些 FTP 软件在进行文本传输的时候会对换行符进行转换(这样修改了原文件)。

Python 使用 "Universal Newline" 处理这个问题。在以文本方式 open() 的时候,会对换行符进行识别并一致处理成 '\n',在文件写入的时候,也只要 write('\n') 即可,Python 会根据操作系统自动处理。有关文档:

本文 github 中的镜像

0
Posted on 下午3:46:00 by Fan Zhang and filed under

可以访问本文镜像

为什么要引入本地存储

这个问题也是在做 Web App 的时候自然注意到,HTTP 的传输是无状态的(stateless),所以为了给用户个性化体验就必须在客户端存储一些数据。比如,网站的登录过程,事实上就是利用 Cookie 在客户端保存了用户的验证信息,在用户每一次发送 Request 的时候都会在 Header 部分加入 cookie 的信息,从而让网站服务器得知用户已经登录,并提供用户所需的信息。

Cookie 的缺点

Cookie 已经实现了在客户端储存资料,不过它有几点不足:

  • Cookie 的设计限制了大小为 4KB;
  • Cookie 每次 HTTP Request 都要传输一遍,并且通常不加密传输(可以使用 SSL 加密);
  • Cookie 通常存储了用户的浏览行为和隐私相关的信息,有可能造成安全隐患。

快速入门

如今知名的浏览器都已经支持了 HTML5 Storage,不过对国内来说 IE 的版本才是最大的问题(IE8 以上才支持)。并且包括 iPhone 和 Android 在内的手机浏览器也支持。

以下文章可以快速了解 HTML5 Storage 的特性和用法:

localStorage 和 sessionStorage

localStorage 可以认为不主动清除则一直存在。

sessionStorage 则是和会话相关,刷新页面不会清除,但是关闭浏览器则会清除。所以浏览器崩溃后,通常 sessionStorage 还可以存在。

更多参考

1
Posted on 下午3:28:00 by Fan Zhang and filed under , ,

可以访问:本文镜像

为什么要用 VimWiki

个人 Wiki 个性化的程度比较严重,所以千挑万选总也找不到好用的。Vim 虽然学习成本很高,但是我想既然已经到使用个人 Wiki 了,应该不会在乎这点投资。

Wiki 形式的文档好处在于易于写作,纯文本的管理,即使是源文件也有很强的可读性,可以方便地导出规范的 HTML 文件。

Wiki 的格式也很多,比如 Markdown,reStructuredText 等等,这都被称作 Lightweight markup language,在这个维基词条上也有些简单的对比。Travis 的主页有文章对这些做了总结(文章提到,选择太多,很难总结完善)。我个人依照我的喜好选择了 Google Code Wiki,其实我也觉得,如果不是写书,其实哪种 Wiki 形式都一样,重要的是开始写,选一个喜欢的语法和实现,并且保证用的人比较多的就行。

说了半天还没有介绍 VimWiki,它是一个 Vim 的开源插件,采用类似 Google Code Wiki 的语法,所有的文档组织就是利用 Wiki 格式的纯文本。结合 Dropbox 可以轻松实现同步。我觉得 Wiki 就不用版本控制了,简单在文中标注下必要的更新说明就是。

Quick Start

为了快速上手,下面各种操作不多做解释,官方文档能提供所有的解答,也有中文文档。另外,这个软件的更新较快,网上的一些设置介绍可能过时,需要及时查阅官方的文档。

下载安装

方法一:下载 .vba 是 Vimball 的安装文件,打开后使用 :so % 即可。

方法二:也可以直接使用 zip 文件,解压复制到相应路径。

注意:Vim 中涉及到的路径最好不要含有比较特殊的字符(比如空格,括号等),以免出现各种错误。

配置 vimrc

安装官方文档的要求,需要确保 vimrc 文件中有如下的设置:

 
    set nocompatible
    filetype plugin on
    syntax on

另外就是要设置个人 Wiki 库的存放地址和 HTML 模板:

 
let g:vimwiki_list = [{'path': 'D:\Link\Wiki\wiki\',
      \ 'path_html': 'D:\Link\Wiki\html\',
      \ 'template_path': 'D:\Link\Wiki\templates\',
      \ 'template_default': 'def_template',
      \ 'template_ext': '.html',
      \ 'css_name': '',
      \ 'auto_export': 1,
      \ 'diary_link_count': 5}]

注意到有关模板我使用的是 Dev (2010-12-27) 版本,所以和当前的 1.1.1 的设置有所不同。 因为 VimWiki 可以定义 css,所以有一个 css_name 的设置,应该是保存在文档中定义的 css(不确定)。

使用

这部分请看VimWiki 介绍中第二节。

在 Vim 中,键入 <leader>ww 三个键即可进入第一个 Wiki 库的首页(index.wiki)。其中 <leader> 一般是 \ 字符。

在首页中就可以随意输入了,使用类似 NewPage 之类的驼峰词可以创建新页面。如果需要创建中文词条可以使用: [[中文]] 或者 [[文件名|中文描述]] 的方法。

<tab> 和 <shift> + <tab> 键可以在词条之间跳转,<enter> 可以进入词条进行编辑,<backspace> 可以返回。注意到,通常情况下 VimWiki 会自动存盘。

使用 :Vimwiki2HTML 和 :VimwikiAll2HLML 可以导出 HTML 格式的网页。

Tips

  • 可配置多个 Wiki 库。访问第二个 Wiki 库可以键入 2<leader>ww,或者通过 <leader>ws 进行选择。
  • Wiki 中的 CamelCase 会自动转换为 link,按 <enter> 即可进入编辑,按 <backspace> 回到前一页。
     
    " 不需要驼峰英文成为维基词条
    let g:vimwiki_camel_case = 0
    
  • 可以设置在存档后自动更新 HTML 文件,在 vimwiki_list 中的 auto_export 属性。
  • 可以建立 to-do list,只不过默认的快捷键 <C-space> 和中文输入法切换的热键冲突,可以重新映射。比如下面映射成 <leader>tt,
     
    :map <leader>tt <Plug>VimwikiToggleListItem
    
  • 方便的日记功能,使用 <leader>w<leader>w 就可以开启一个以今天日期命名的 diay page,还可以结合 Calendar 插件,以日历形式显示日记。

发布

通过 HTML 模板,可以把 VimWiki 当做 Blog 和个人 Wiki 的发布工具使用,而且文档编辑简单,内容和样式分离,非常省心。 目前一个选择是使用 githubPages feature。本来 github 是代码托管服务,但是允许作者发布静态的网页作为主页。

对此不再赘述,可以参考:

0
Posted on 上午12:23:00 by Fan Zhang and filed under

  有的时候需要在局域网内调试 GAE 的程序,比如调试手机应用程序的时候,需要通过 WiFi 访问应用程序。

  默认的 dev_appserver 使用的地址是 localhost,如果需要其他计算机也能访问,则需要再启动的时候加入参数 --address= ... 设置服务器的主机地址,使用 0.0.0.0 则允许本地主机访问和主机名访问。参见:The Python Development Server: Command-Line Arguments

  如果使用的是 GAE Launcher,则是在 Application Settings 中在 Extra Command Line Flags 中加入:

 
-a 0.0.0.0