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 61 62 63 64 65 66 67 68 69 70 -- 首先是删除该数据库中该用户名下的所有表、序列与触发器, -- 其中触发器是通过表格级联删除的。 declare cursor usertables is select * from user_tables where table_name not like 'BIN$%'; cursor usersequences is select * from user_sequences; begin for next_row in usertables loop execute immediate 'drop table ' || next_row.
这主意是我一同学想到的(至少是他告诉我的),基于一种实际的需要。假设你有两台内网机,都没有公网地址,你想从一台机器访问另一台机器的服务,这时要怎么办呢?当然很可能是我无知了,就我所知,网上倒是有一些提供这类服务的网站,但都是基于 Windows 的远程桌面的,至于 Linux ,我没找过。
于是那家伙联想到了 IM Bot 这种东西。现在网上有各种各样的 IM Bot ,可以通过与之聊天执行各种各样的自动化任务,那为什么不能让它把发过去的命令交给另一台机器的 Shell 执行,并把结果返回呢?这不就实现了一个简单的 Telnet 了吗?这就是最初的想法了(我没去找现成实现,因为我也该练练手了)。而我刚好才折腾过 OpenVPN ,于是就有了标题所说的这个最终想法。这样的话,就能一下子从只支持一种应用协议到支持几乎所有的应用协议了,而且实现的工作量也同时减到了最低。真是好主意啊,自我夸奖一下 :-)
肯定有许多人遇到过这个问题,也肯定有许多现成的解决方案被发现,可是我没找到(或者说没耐心找)。无所谓,自己找到的话,得到的就不仅仅是最终结果了。
闲话少说。其实以前也干过类似的事情,就是在保存的时候自动去掉所有的行末空白;不过这个操作使用 Vim 本身的功能就能实现,不需要借助于外部程序,所以只要简单地设一个 BufWrite
时的自动命令就行了。但当需要借助外部程序的时候,在 BufWrite
或者 BufWritePre
或者 FileWritePre
时执行的自动命令就不行了,老是提示说什么文件本身已更改,是否确定写入。我在这上面反覆试了好多次,才发现是自己没有搞清楚底下到底发生了什么。要让外部程序对文件内容进行格式化(或者其他什么操作。我想调的是 gofmt,顺带一提),首先当然得要那个外部程序能看到你做过的,还没有保存的更改,所以说应该是先写入再操作的,即在 BufWritePost
的时候执行自动命令。而我一开始就把基本步骤给搞反了。
我的编译环境是 Visual Studio Team System 2008 版本 9.0.21022.8 RTM , Windows Mobile 5.0 SDK R2 ( VS2008 自带的版本)。当然, Perl 也是需要的,我装的是 ActivePerl 。我要编译的 OpenSSL 版本是 0.9.8e 。
VS2008 的安装
那个 Web Developer Tools (好像叫这个)的安装会失败,又不能不装,根据网上的说明,要把它的目录单独从光盘上解压出来安装,且安装的时候要挂 Office 的安装光盘(我的 Office 版本是 2007 )。这个装好了之后,再从光盘上安装 VS2008 就没有问题了。
其实嗫,这个问题已经有标准和其他的解决方案了。标准解决方案参见 Control.Applicative
中的 ZipList
,不过这东东用起来蛮麻烦的说;其他解决方案见 bff 库的 Data.Zippable
模块,嗯,我还没搞明白这玩意怎么用,不过总感觉杀鸡用牛刀了有点(Template Haskell ,以及其他依赖)。
所以,如果你只是跟我一样,看 Data.List
中的那一砣 zipn
不顺眼的话(其实也只是看着不顺哈,用着还是蛮顺的,反正实现不用我写),一个更简单的方案在此:
说实话,我之前有就这个题目很有激情地写了很长很罗嗦的一篇草稿的,哦,确切来说是大半篇,直到被打断,激情不再,这篇草稿也就此躺了两个多月。好吧,其实是我还不是八卦那块料,就不卖弄了,直接总结。
要在 Haskell 中实现可变长参数列表,就是利用其 Typeclass 系统,对函数进行最终结果类型和中间函数类型之间的重载,然后利用 Haskell 的类型推导机制为我们自动调用合适的重载版本。嗯,就这么简单。下面是一个最简单的例子:
C/C++ 中的宏是个让人又爱又恨的家伙(感觉这句话好俗啊),在带给我们很强大的 Power 的同时,却也需要我们绝对的细心,而这也是在宏定义中诸多惯用法的由来。
当我们要把一组语句定义成一个宏,并希望像用一条语句那样来使用它的时候,我们就可以这样做:
我正在看虎书,在这本书中所给出的那个 MiniJava 语言的语法并不是 LALR(1) 语法,因此在某些情况下,所生成的语法分析器会对正确的输入给出语法解析错误。不过 Bison 提供了一个简单而又强大的解决方案,可以轻易的解决掉这个问题。
我以前只知道,在 C++ 中,如果要表示一个类是抽象基类,只要为它定义一个纯虚析构函数就可以了,没想到今天用到的时候才发现,连接的时候通不过,说没有找到那个函数的定义。到网上一搜才知道,原来纯虚函数也是可以有定义的啊。在实现文件中加上它的空定义之后,一切就 OK 了。
不过,因为我那个基类里面已经有了一个纯虚函数,所以貌似没必要把析构函数也定义成纯虚的。
PS. 在 C++ 里面要实现 AST 还真是一件麻烦的体力劳动,要写那么多类,每个类还得写那么一砣的样板代码。幸好不是那种长期运行的服务器程序,不需要太考虑 memory leak 的问题,就不用写析构函数和 delete
了(实际上是懒得写),不然样板代码还要更大砣。不知道有什么更好的方法没。
注意,我用的软件版本为:Bison - 2.4.1,Flex - 2.5.35 。至于老的版本会怎样我就不深究了。工具不是重点。
%skeleton "lalr1.cc"
可以用
%language "c++"
来代替了,其中参数 “c++” 不区分大小写。