2010年5月7日星期五

Mac OS X中不尽如人意的地方

可能吧发了一篇文章: Macbook Pro初体验, 基本说出了我想说的.

所以好处就不说了, 这里只列出使用时感觉到不方便的地方:

1. delete键
别告诉我"要删除文件只要拖到废纸篓就好了"

2. 图片预览时没有上一张和下一张图片这个按钮或者快捷键
别告诉我"先Ctrl-A, 然后再预览图片就好了"

3. Ctrl-X
每次要剪切文件的时候只能先复制再删除...

4. Finder没有地址栏
切换文件夹的时候不是特别方便.

5. 没有最大化
所谓的"最适合大小", 对我来说说服力不那么大.


暂时这么多.

ps. 那个磁性电源的设计虽然很人性化, 但是会不会容易吸附一些铁器从而造成短路啊?

2010年5月5日星期三

[Note] Programming In Lua 笔记(2): 函数

21.
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。
上述规则有一个例外,当函数只有一个参数并且这个参数是字符串或者表构造的时候,()可有可无:
print "Hello World" <--> print("Hello World")
dofile 'a.lua' <--> dofile ('a.lua')
print [[a multi-line message]]<--> print([[a multi-line message]])
f{x=10, y=20} <--> f({x=10, y=20})
type{} <--> type({})

22.
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
-- 不知道Lua里面有没有与python类似的默认参数? 支持, 不过有所不同, 参见PIL 5.3 命名参数

23.
多返回值的函数调用 的 返回值:
1). 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
2). 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)。
3). 可以使用圆括号强制使调用返回一个值。

-- 这个部分的规则比较奇怪. 例子比较长, 就不贴出来了, 还是仔细看原文吧.

24.
特殊函数unpack,接受一个数组作为输入参数,返回数组的所有元素。unpack返回a所有的元素作为f()的参数
f = string.find
a = {"hello", "ll"}
print(f(unpack(a))) --> 3 4

25.
可变参数:
Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。

26.
如果我们只想要string.find返回的第二个值。一个典型的方法是使用哑元(dummy variable,下划线):
local _, x = string.find(s, p)
-- now use `x'
...


初级语法知识似乎到这里就结束了, 后面的(从第6章再论函数开始)是稍微高级一点的内容了, 或者说是Real world Lua?

[Note] Programming In Lua 笔记(1): 类型, 值, 表达式, 基本语法

1.
prompt> lua -la -lb
命令首先在一个Chunk内先运行a然后运行b。(注意:-l选项会调用require,将会在指定的目录下搜索文件,如果环境变量没有设好,上面的命令可能不能正确运行。)

2.
prompt> lua -i -la -lb
将在一个Chunk内先运行a然后运行b,最后直接进入交互模式。
-i选项要求Lua运行指定Chunk后进入交互模式.

3.
在交互模式下加载库:
> dofile("lib1.lua") -- load your library

4.
Lua的变量默认是全局的. 定义局部变量使用local关键字.
--[[
应该尽可能的使用局部变量,有两个好处:
1. 避免命名冲突
2. 访问局部变量的速度比全局变量更快.
--]]

5.
注释:
单行注释:--
多行注释:--[[ --]]

6.
nil是Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量赋nil可以删除该变量。类似python中的None.

7.
在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。

8.
string
用单引号和双引号表示字符串, 多行字符串使用[[...]]

9.
运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。反过来,当Lua期望一个string而碰到数字时,会将数字转成string。
-- 尽量避免自动转换, 避免数字与字符串的混合操作.

10.
".."在Lua中是字符串连接符,当在一个数字后面写".."时,必须加上空格以防止被解释错。

11.
显式将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil。反之,可以调用tostring()将数字转成字符串.

12.
and和or的运算结果不是true和false,而是和它的两个操作数相关。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
-- pretty tricky

13.
一个很实用的技巧:如果x为false或者nil则给x赋初始值v
x = x or v
等价于
if not x then
    x = v
end

14.
C语言中的三元运算符
a ? b : c
在Lua中可以这样实现:
(a and b) or c

15.
not的结果只返回false或者true, 和and/or不同

16.
table是非常强大的一个存在. 它的索引下标"默认"从1开始, 而不是0.
它的元素可以是任何类型, 也可以包含数据成员(如下面的x和y).
a = {x=0, y=0, 'aaa', 'bbb', {1,2}, 123}

可以指定索引(模拟字典):
opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}

强制下标从0开始:
days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。
{x=10, y=45; "one", "two", "three"}

17.
多个变量同时赋值:
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数 按变量个数补足nil
b. 变量个数 < 值的个数 多余的值会被忽略 容易引起误解的变量初始化:
a, b, c = 0
print(a,b,c) --> 0 nil nil
容易误解为c=0或者a=b=c=0

-- 尽量保证变量个数和值的个数一致

18.
控制结构语句:
if ... then ... elseif ... then ... else ... end
while ... do ... end
repeat ... until ...
for ... do ... end
for ... in ... do ... end

19.
for语句有两大类:

第一,数值for循环:
for var=exp1,exp2,exp3 do
    loop-part
end
exp1,exp2,exp3分别为初始值,终止值,步进值. exp3默认为1, 此时可省略.
注意: 这三个表达式只会被计算一次,并且是在循环开始前。

第二,范型for循环:
for i,v in ipairs(a) do print(v) end
for k in pairs(t) do print(k) end

20.
Lua语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前),例如:
local i = 1
while a[i] do
    if a[i] == v then break end
    i = i + 1
end
有时候为了调试或者其他目的需要在block的中间使用return或者break,可以显式的使用do..end来实现:
function foo ()
    return --<< SYNTAX ERROR
    -- 'return' is the last statement in the next block
    do return end -- OK
    ... -- statements not reached
end

[Tips]如何快速打开豆瓣电台精简版

新建书签,地址为:
javascript:if(!window.open('http://douban.fm/radio','radiowin','height=186,width=420,toolbar=no,menubar=no,scrollbars=no,location=no,status=no')){location.href='http://douban.fm/radio'}

ps. 为什么我觉得豆瓣改版改得很失败呢?首先是打开电台比原来要麻烦;其次那个搜索栏不再是全能的了。