YON CISE

Python Formal Parameter and Argument

首先, 我们定义一个函数:

def f(name = 2, *arguments, **keywords):
    print name
    print arguments
    print keywords

三种 Argument (实参)

  1. Default Argument

    f(), 传入了一个 Default Argument, name 的值为定义函数 f 时指定的 2.

  2. Positional Argument

    f(4), 传入一个 Positional Argument, name 的值为 4.

  3. Keyword Argument

    f(name = 24), 传入一个 Keyword Argument, name 的值为 24.

    同一个 Argument 只能被赋值一次:

     f(4, name = 24)
    

    这条语句非法, 因为 name 被赋值了两次, 第一次是 Positional Argument, 第二次是 Keyword Argument.

    Keyword Argument 必须接在 Positional Argument 的后面, 下面一条语句非法:

     f(name = 24, 4)
    

三种 Formal Parameter (形参)

  1. 形如 name

    最普通的形参, 不解释.

  2. 形如 *arguments

    这种类型的形参就像个收容所, 收容那些没有匹配成功的 Positional Argument, 其值为没匹配成功的 Positional Argument 组成的 Tuple.

     f(4, 5, 6, k = 7)
    

    4 与 name 相匹配, k = 7 是 Keyword Argument, 所以最终的值为 (5, 6).

    一个函数定义中只能有一个这样的形参, 且无法用 Default Argument 来赋值, 下面两个函数都是非法的:

     def foo(*args1, *args2):
         pass
    
     def bar(*args = (2, 4)):
         pass
    

    那么我们可不可以通过 Keyword Argument 来传参呢, 例如:

     f(arguments = (2, 4))
    

    上面这条语句并不会报错, 但是你会发现 arguments 的值仍然为 (), 空的 Tuple, 为什么会这样呢? 这和下面一种 Parameter 有关.

  3. 形如 **keywords

    这种 Parameter 和上面一种差不多, 只不过它收容的是所有未匹配成功的 Keyword Argument, 其值为没匹配成功的 Keyword Argument 组成的 Dictionary.

     f(name = 24, m = 2, d = 4)
    

    name = 24 与 name 相匹配, 所以 keywords 的值为 {‘m’: 2, ‘d’: 4}

    同样的, 一个函数中也只能有一个这样的形参, 我们也无法通过 Default Argument 为其赋值. 还记得 f(arguments = (2, 4)) 这条语句么? arguments 之所以为空 Tuple, 是因为 arguments 被 keywords 给”强制收容”了, keywords 的值为 {‘arguments’: (2, 4)}. 那么 f(keywords = {‘m’: 2, ‘d’: 4}) 呢? 自己试试看吧.

Vim 变量

Variables

Vim 中可以通过 let 对变量进行赋值, 比如:

:let foo = "bar"

Options as Variables

Vim 中可以通过 set 对 options 进行设置, 比如:

:set foldlevel=24

但是我们也可以通过一个特殊的语法把 options 当做变量来操作:

:let &foldlevel=24

foldlevel 前面加上 & 就是为了告诉 Vim 我们想把 foldlevel 这个 option 当成变量, 如果没有这个 &, 我们就是在对 foldlevel 这个变量赋值.

Registers as Variables

同样的道理, 我们也可以将 registers 当成变量, 只不过这里用的不是 & 而是 @ 而已:

:let @a = "foobar"
:reg

你会发现 a 寄存器里的值已经变成了 foobar.

特殊的寄存器 =

我们可以利用这个寄存器将变量的值插入到文本中.

Insert mode:

<C-r>=VARIABLES

Normal mode:

"=VARIABLES<CR>p

将 VARIABLES 换成你自己的变量名, 可以使用上面提到的三种变量, 只是别忘了 & 和 @ (如果需要的话). 其实这里的 VARIABLES 也可以是 Vim 的函数, 比如在插入模式下:

<C-r>=expand('%:t')

就会将当前文件的文件名插入到文本中.

Variables / Learn Vimscript the Hard Way

PHP 安装 MySQL extension

几乎所有网上都是说, 打开 php.ini, 找到下面这一行

;extension=php_mysql.dll

将分号 (;) 去掉, 再找到下面这一行

extension_dir = "./"

改成

extension_dir = "./ext"

保存, 然后重启 Apache 就可以了, 但是我这样操作以后, phpinfo() 的输出里始终没有 MySQL 的相关信息.

最后看官方文档才发现, 原来对于 PHP 5.0.x, 5.1.x, 5.2.x, 要想 PHP 支持 MySQL, 还需要 libmysql.dll 这个文件. 正确的安装 MySQL extension 的方法除了上述步骤之外, 还要将 libmysql.dll 所在文件夹添加到环境变量 PATH 中.

ps. 必须要添加到系统变量中, 而不是 xxx 的用户变量里. 而且添加到系统变量之后必须要重启系统才能生效. 还有种更简单的办法, 直接将 libmysql.dll 移动到 C:\WINDOWS 文件夹下面, 都不需要重启系统, 直接重启 Apache 就行了.

PHP: MySQL Installation

Apache 将共享文件夹作为 DocumentRoot

VirtualBox 中安装了 Windows XP, 并设置了共享文件夹. 最近想用虚拟机搭建 Apache + PHP + MySQL 服务器, 并且我希望将 Apache 中默认的 htdocs 目录修改为我的共享文件夹, 这样我就可以在本机里编程, 仅仅将虚拟机作为服务器.

假如我虚拟机中共享文件夹的地址为 E:\htdocs, 我本以为只要将 Apache 的配置文件 httpd.conf 中的 DocumentRoot 的值修改为 E:\htdocs, 然后找到下面这行代码:

#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory xxx>

将其中的 xxx 修改为 E:\htdocs 就可以了, 但是这样修改之后 Apache 就启动不了了, 提示我 The requested operation has failed!

最后发现原来是要使用共享文件夹的网络地址才行, 比如我对应的地址是 //VBOXSVR/Downloads/htdocs, 只要用这个网络地址替换刚才的 E:\htdocs 就可以正常启动 Apache 了.

ps. 在 httpd.conf 中, 地址分隔符是用的正斜杠 (/), 而不是反斜杠 (\). 我一开始使用 \\VBOXSVR\Downloads\htdocs, Apache 一样启动不了. 所以说, 就算 DocumentRoot 可以用 E:\htdocs 这样的地址来指向共享文件夹, 也应该修改成 E:/htdocs 才行.

VirtualBox VT-x is not available

折腾了几天终于在 x201i 上安装好了黑苹果, 驱动什么的基本完美, 已经能满足我日常使用了.

今天安装完 VirtualBox, 运行时竟然提示我 VT-x is not available (VERR_VMX_NO_VMX).

解决方法是:

将 VirtualBox 退出 (重要)

进入 ~/VirtualBox VMs/HOSTNAME 目录, 用 Vim 或者其他文本编辑工具打开 *.vbox 文件, 找到下面这一行:

<HardwareVirtEx enabled="true"

将其改为:

<HardwareVirtEx enabled="false"

保存, 重启 VirtualBox 即可.

VT-x is not available (VERR_VMX_NO_VMX)