我们的数据库课

很久之前的一篇文章,怎么也是上上学期吧,写成草稿了,现在贴出来吧。

我并不是要批评我们的老师,我觉得我们的老师还是挺负责任的,能讲到的还是尽量讲到还是都讲到了。

其实最重要的是我并不知道这课到底是在讲什么,老师在某节课上说:“我们这门课主要是讲授数据库理论,这个内容就不讲了”(意思是这样的)。当时我就震惊了,我一直以为这门课讲的是数据库如何使用数据库的……老师上课的时候也经常说作为数据库的使用者如何如何,那我们的这门课到底是在讲理论还是使用呢……

作为大学的课程,我认为应该以理论为主,怎样使用只是顺带一提,以自学为主就好,就像传言中国外大学某些课程一样,一次课讲完一门语言,SQL 这种东西完全可以一次课讲完,剩下的靠大家自学或者直接实践,但是上半学期除了绪论,就一直在讲关系代数和 SQL,这个东西需要这么多时间来讲吗?我个人认为,4个课时就足够了(可能有点太激进了)。这门课上用了八周,也就是 22 个课时来讲这些东西。

我是一个理论比较弱的人,所以就想着靠学校里的数据库课补一下理论知识的。在我眼中,这门课讲的东西确实是必须的,但是内容太少了,深度也不够。这个 playlist 是印度一所大学的数据库课程,我只看了标题,来比较一下我们课程的内容。Lecture 1~9 我们是讲过的,10~16 没讲过,17~23 讲过,24~26 没讲过,27~29 讲过,30~42 没讲过,只有 19/42 的内容我们覆盖到了,也就是只有 45%。看看我们漏掉了什么东西,存储过程、索引、查询过程和优化、分布式数据库、数据挖掘、XML 和对象数据库还有很多 case study。我想要的是什么?我想学的就是数据库是怎么实现的,存储过程、索引、查询过程和优化为什么没有?这是本科教育对吗?不是职业教育,我们要知道原理才能更好地利用数据库,对吗?学校里学不到的指望我们在工作中学吗?大家都清楚,工作了就更没有机会去学理论了。怎样用 SQL 需要教吗?DBMS 就会告诉你你的 SQL 是对是错,你也能一眼看出来结果是否正确,尝试一下,总会正确的。但是如果你一句 SQL 执行了一分钟,DBMS 会告诉你为什么吗?会告诉你子查询的速度慢吗?会告诉你优化器做了什么吗?会告诉你中间创建了哪些临时表吗?不会的,起码不会一眼就看出来,你需要理论知识的支持,可是这门课给了我们什么?

要说这门课重视实践,那我又不明白了。现在起码在互联网方面,大家都只是把数据库当作一个存储数据的地方,很多高级的功能、很复杂的 SQL 都很少出现,那么我们写一堆长长的带着子查询,带着 ANY 带着 EXISTS 的东西有什么用呢?做教务系统吗?用非常复杂的 SQL 来实现一些应用语言很容易就能实现的功能有什么必要呢?SQL 不是过程化的,非得拿他来做一些过程化的事情不是强人所难吗?我在 QCon 会场抢了两本书——《SQL沉思录》《SQL解惑》里面写的内容就是用 SQL 做一些非常奇怪的问题,甚至于解决稳定婚姻问题(谜题67),这种东西真的有用吗?作者当时的时代还是 SQL 大行其道的时候,可能写这样的东西练习 SQL 还说的过去,但是现在 SQL 并没有那么热,各种 NoSQL 纷纷出现的现在,练习 SQL 而不是学习数据库本身的理论有什么价值呢?拿索引来说,就算某种数据库并不是利用 SQL 进行查询,那它为了性能也需要一个类似索引的东西,对吗?只要这种索引还是要用 B 树或者散列表,那我们学习索引的理论就还是有用的。就这两本书被随意赠送的可怜的处境来看,整页的 SQL 真的没有什么用。

说一个比较极端的例子,教大家使用数据库的时候并没有提到 LIMIT,可能很多人并不会知道 SELECT id FROM user ORDER BY id LIMIT 100000, 5 为什么总是慢的要死。

还有一个问题,这个希望老师改进一下,老师上课演示的所有 SQL 语句里面的关键字都是小写,SQL 是不区分大小写,但是我们都知道关键字推荐是全部大写的,希望以后不会看到我同学写出小写关键字的 SQL……我们都懒,但是老师需要教学生养成良好的习惯,不是吗?

发这么多牢骚,其实还是对数据库这么课抱了很大期望,希望能补一下数据库的知识,不幸让我失望了。还是自己学吧,印度人虽然英语非常差,但是讲数据库应该还可以。

好在期末考试没有非常坑,没有非常古怪的题目,算是真的考察水平吧,不过还是希望能多些理论知识,让同学多一些进步。我觉得现在所有的内容压缩到上半学期,下半学期讲些理论和 case study 会非常好。

Tags:

Posted in Information Technology | Tagged | 5 Comments

iOS dev: 将 Xcode 中的 CODE SIGN IDENTITY 分离出 VCS

做 iOS 开发的时候每个人都有不同的开发者证书/私钥,只有通过这个私钥进行代码签名之后 app 才能在 iPhone 上运行起来。项目中用来确定使用哪个私钥签名的配置文件是 project.pbxproj,由于它也记录了项目地很多其它信息,所以它往往会出现在版本控制系统中,这样就造成只有一个人能够成功地签名。好在我们可以通过 .xcconfig 文件来将这个配置抽离出来。

首先新建一个文件(Cmd+N),在 Other 中选择 Configuration Settings File,新建一个配置文件 CodeSign.xcconfig。在这个文件中添加一行:
CODE_SIGN_IDENTITY = iPhone Developer: 人甲 路 (XXXXXXXXXX),其中证书的名称可以在 Keychain Access 里面找到。

之后删除原来 project.pbxproj 里面的签名,直接在 build settings 里面删除就好,注意 project 和 target 的都要删掉(都选中之后 Cmd+delete)。

最后在 Project 的 info 中,看到 Configuration 一栏,在 Based on Configuration File,选择我们创建的文件 CodeSign。

最后在 build settings 里面应该是这个样子:(项目和目标那一栏都是空的)

最后注意不要把 CodeSign.xcconfig check in 进去。

参考:http://respectthecode.co/2011/06/11/xcode-4-and-xcconfig-files/

Tags:,,,

Posted in Information Technology | Tagged , , , | Leave a comment

Lion 对加密卷的支持

今天想给硬盘数据做备份,毕竟硬盘已经用了两年了,不用查 SMART 信息也知道他已经老了,虽然诸如代码之类的都有很多备份,但是还是有些文档、照片需要备份。

又阴差阳错得到一块老旧移动硬盘,灰常好啊。开工吧。

拿来的时候是 NTFS,第一件事情就是改成 HFS+,拿 Disk Utility 格式化的时候发现多出了加密的选项,不用多说,先试试。不得不说这个 Lion 的 GM 版本还不够到正式版的水平,这个输入密码的输入框如果输入超过十位的密码就会 crash,这个完全不能忍受啊,尝试了半天发现先在别的地方输入好然后复制过来就可以了。(好吧,我不得不说我写文章想截图的时候这个 bug 又神秘的消失了)

这样格式化好了之后每次插入移动硬盘的时候都会提示你输入密码才能访问,像是做备份这种应用就会安全很多。

之后我就发现加密卷的密码无法修改,我猜测这种加密是用密码加密一个密钥,再用密钥加密数据的,应该可以修改密码,现在无法修改的原因应该是 Apple 还没想好在哪里放这个功能,也或许 Apple 不会给这个功能提供 GUI,那我们转战 CLI 吧,Disk Utility 对应的命令行工具是 diskutil,里面提供了很多 GUI 中没有的功能。鼓捣一会之后发现 diskutil 有个叫做 CoreStorage 的模块,进一步发现 diskutil coreStorage changeVolumePassphrase 可以修改 CoreStorage 卷的密码,其中所需的卷 UUID 可以通过 diskutil coreStorage list 获得。

可以看得出,CoreStorage 又是苹果推的一种新技术,看 diskutil 里面的用语(PV、LV)推测是类似 LVM 的东西,Mac 以前似乎没有类似 LVM 的技术(AFAIK),网上搜索也搜索不到 CoreStorage 的相关信息,Lion 的 Developer Library 里面也是没有,最后还是在手册(man diskutil)里找到了一些信息。看完之后的感觉就是 CoreStorage 就是一个 LVM,Apple 终于有了 LVM。 :-) 不过看起来许多功能还没有开发出来接口,比如 LVM 的一些最基本的功能⋯⋯ :-(

看来 Lion 不光是在界面上模仿 iOS(我对这点颇有不满),在底层也下了不少功夫,CoreStorage 就是在看不见的地方默默发挥作用的一个好同志啊。底层的 UNIX 配合 用户友好的界面,是 Mac 的制胜法宝,只有这样才能留住如此多的开发者和一些相当挑剔的用户(比如设计师)。底层的 BSD 也给苹果减少了许多开发的困难,可以到处抄来抄去,可以派几个人推动一下某个项目的开发(比如 LLVM),看被抄的人不爽了还过去帮助修改(比如各种 BSD)。相比之下,再大的微软也不能把所有事情做好,至少给自己增加了许多开发难度。

另外,苹果你抄个 ZFS 过来吧,ZFS 多适合你现在的各种用途啊,又没有 Linux 的许可证问题,抓紧啊,I want a better filesystem!

PS:最后贴上 diskutil 手册的一部分,如果你有兴趣的话。

Tags:,,,

Posted in Information Technology | Tagged , , , | 2 Comments

VMWare Fusion 装 Gentoo⋯⋯

发现其它发行版真的没法胜任开发工作,而我又不喜欢自己编译,Ubuntu 里面的 nginx 缺少我需要用的模块,真伤心,本来想在虚拟机里弄一个不用编译的发行版来着,看样子还是得 Gentoo 出马。

VMWare Fusion 又傲娇了,又是驱动问题,偷懒用 genkernel 就好了,可谁让我这么勤奋呢?

lspci 告诉我们,VMWare 有个设备叫 00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01),查到对应的内核选项是 CONFIG_FUSION,记得选上。这样就解决了启动的时候找不到分区的问题⋯⋯

还有一个问题是,启动到一半说 Freeing unused kernel memory,然后就死掉了,是新引入的 OpenRC 的问题,解决办法在这里

Happy coding!

Posted in Uncategorized | 1 Comment

Installing Gentoo Linux on DELL R710

公司买了一台 R710,第一次自己装服务器上的 Linux,虽说区别不是很大,但是还是很值得纪录一下的哦。

服务器跟 PC 最大的区别大概就是硬件了吧,涉及到驱动的基本上就只有 RAID 控制器了吧?编译内核的时候那个纠结啊……那个启动不起来啊……真是……

首先是得照着一个指南做,就是这个指南啦,比较适合以前装过 Gentoo 的人看。这个指南是装软件 RAID 和 LVM2,我们做的是硬件 RAID,所以里面软件 RAID 相关的东西就不用安装了,比如 dm-mod 之类的就不用装了。我还是习惯把 /boot 放在 LVM 里面,其实自己有的时候也觉得没啥必要,有点犯贱的意思……如果你也希望把 /boot 放在 LVM 里面,可以参考 Gentoo Wiki 的这篇文章,不过里面的内容略微有点过时了,比如内核参数 dolvm2,现在写成 dolvm 了。一开始安装的时候忘了做 initrd,查了半天才发现,还是不细心啊。

剩下的大概就是编译内核了,先随手把什么声卡驱动什么的去掉,然后重点是 RAID 驱动,一开始天真地以为 RAID 控制器的驱动是 LSI Logic MegaRAID SAS RAID Module 之类的,结果就是直接启动不起来了。后来认真起来,按照 lspci 的结果去网上找内核模块,发现应该是 CONFIG_FUSION 这个选项,之后就能顺利地启动了。

配置好一些基本的东西之后,还有一些硬件相关的小工具,最重要的还是 RAID 控制器的监控工具,网上找了很多,不过大多数都没法用,这一页有两个工具,都比较好用,HWRaid 这个站似乎也很强大。里面提到的 lsiutil 是 LSI 官方提供的,Gentoo 源里那个似乎年久失修了,LSI 的官网上能够找到,不过不是很好找,下载下来是二进制。还有些能改前面板 LCD 的小工具什么的,我觉得没多大用,就算了(想改的话 BIOS 里面就有)。

有点后悔买了一个比较弱的 RAID 控制器,不过一切还要等有了负载再说,哈哈。

Tags:,,,,

Posted in Information Technology | Tagged , , , , | 1 Comment