Ubuntu在Terminal下使用代理的问题(找不到libproxychains.so.3)

人在天朝,随时能准备好梯子是一件非常重要的事情,在terminal下升级或者安装ubuntu软件的时候,时常给封了,所以,在terminal下用代理就是必须的了,我推荐使用proxychains,如何配置是一件简单的事,网上找一下就是,但是我升级到了18.04以后,突然不能用了,出现如下的错误:

继续阅读“Ubuntu在Terminal下使用代理的问题(找不到libproxychains.so.3)”

175. Debian(1): 一个名字起源于爱情的Linux发行版

这一期讲一下Debian这个操作系统,Debian在Linux中举足轻重,如果按照时间来说,Debian是最古老的Linux之一,如果按照衍生版本来说,Debian是子孙后代最多的发行版之一,包括我现在见人就推荐的Ubuntu,也是Debian的后代,可能是最出色的后代了,有人统计过,从Debian衍生出去的Linux有影响力的至少有100多种,画了一个图表,非常的看不清楚,太多了,我把这个链接放在我的网站上,因为微信公众号里不允许放非马家的链接,你可以复制粘贴这个链接到浏览器里看看,最好在电脑上看,因为太多了,手机上看不清楚。

继续阅读“175. Debian(1): 一个名字起源于爱情的Linux发行版”

Ubuntu 如何加上 Windows 10的启动菜单

如果有人问我用什么版本的Linux时候,我就会说用Ubuntu,最好是用虚拟机装一下。

但是总有人就是在电脑上装系统,结果装完成以后,有时候会发现没有Windows 10的启动菜单,这种情况最好处理了,两条命令就能解决:

sudo os-prober
sudo update-grub

其它的情况要难处理一些,不过现在都是固态硬盘了,我觉得在虚拟机里玩会好很多。

别人家的孩子 :)

做这个电台和公众号加起来也有两年多了,总的来说,积累了一些听众和读者。我觉得是手机设计的问题,文章发出3天后,就没人愿意去翻以前的文章。

肯从电台加我公众号的人,很多都是来咨询一些问题的,于是每个月都有人来问类似的问题,我再重复回答一下。

继续阅读“别人家的孩子 :)”

174. Red Hat(3): 卖软件就是卖品牌和服务

每家品牌都有自己的市场定位。在Red Hat成功之前,软件这个行业已经有了巨大的统治者,比如IBM,HP,Apple还有Microsoft这些公司在当时已经是巨无霸了,尤其是对于一个当时只卖图书和软件的小门头房,要想在软件这一行中取得一席之地,那是非常的困难的。因此,如何精确的定位自己对于竞争的成功是至关重要的。

好像在营销界有一本书叫《定位》,就是说的营销策略,我读过,但是自己没什么实际操作的概念,毕竟一个钢管舞演员,没有必要定位。但是,我还是看看别人的公司,然后看看别人是如何定位的。我觉得每一家公司,成功以后,至少有自觉或者不自觉的给自己定位了,否则是不可能在某个领域取得成功的。这次就以Red Hat为例,来说明一下定位的重要性。

其实不止Red Hat,很多公司都有自己独特的定位。比如说,如果有一家公司定位于和假医院假药公司合作,赚病人救命的钱。这个就是定位,那么这家公司的核心业务就是为这个定位服务的。有了这个定位以后,就能解释这家公司的许多行为了,比如说,这家公司会在网上撒播假信息,然后误导你去医院,比如你脸上长了个粉刺,给你说成是皮肤癌,然后把你吓的去医院。但是,这个还形成不了直接的利益,因为就算是你害怕了,还可能去正规的医院啊。所以,为了形成闭环,还得有自己的地图和导航软件,比如说有个长了粉刺的家伙,在网上搜了一下,给吓坏了,然后去搜医院,一搜,导航软件故意给你指定一个合作的假医院,然后用户就去了。但是,还是有可以让这个人去的是真医院,比如,这个家伙出门打车,人家出租车师傅说,小伙子,你去的这个地方不是个正经医院,这下要到手的钱又打水漂了。所以,这个公司正是因为这个定位,一定要研发AI,尤其是自动驾驶的汽车,这个自动驾驶的汽车,没有司机啊,所以,只要上车,不管你说去哪儿,直接给你拉到合作方的医院,因为大家都可能是他其它产品的客户,比如他们检测到你2年前搜过肚子疼,那就是胃癌前期,如果6个月前搜过头晕,那肯定是中风前期,然后自动驾驶的汽车会在汽车进医院的时候发个信息给医院,说一下来货了,大数据分析一下,能从这个货身上刮下多少钱来。不管有病没病,至少你得手术台上让人切一切,然后这个小伙打完麻药,躺在手术台上,然后发现主刀医生是山东兰翔学厨师的前女友,举着一把刀在对他笑,这种医院,各行各业的人都能在这里发光发热。切的时候结合前女友的心情,用大数据再分析一下,要不要通知殡仪馆和火葬厂。如果病人人不够多,这家公司可能会投资餐饮行业,没病也得吃出病来。当然了,我只是为了说明定位这个例子,我觉得应该不会有这么黑心的公司,只干坏事,不做好事。

Red Hat当然是另外一种类型的公司,这个公司切切实实的做了不少好事,但是在初期的时候,Bob Young还是花了不少时间来给Red Hat公司定位。因为有卖软件和图书的经验,Bob Young为了赚钱,对消费者的需求还是挺有一套的。他发现了,当时对这些软件行业的巨头最大的抱怨是买了软件不能修改,因为没有源码。如果要找突破口的话,这是一个很重要的突破口。要宣传Linux的开放源代码以及可定制性。与其它公司的UNIX和Windows这种操作系统不同,Linux是另一个维度上的软件,这个新的,叫做Red Hat的操作系统把对操作系统的控制权交给了用户,而不是一个专有版权的,只提供二进制的操作系统,这样,Red Hat就有机会获得这个市场的统治地位。

Bob Young说,Linux就像是汽车一样,没有人真正的开一台品牌叫”汽车“的汽车,广义上来说,汽车不是一种品牌,而是一个行业。Linux也是,没有人用Linux,而是用的某一种品牌的Linux。比如说,我们不开汽车,我们开的是宝马,本田。而宝马和本田都是全球采购东西,自己制造的东西极少,比如从Dupont购买油漆,从Michelin购买轮胎,从TRW购买安全气囊,然后把汽车组装起来以后,把自己的标放在车上,然后给你担保,还有一个遍及全球的售后网络。

Red Hat也是如此,Red Hat自己写的东西极少,从Apache获得web服务器,从GNU获得编译器,从不同的组织获得编程语言。然后Red Hat把这些软件组装起来,就像宝马和本田一样,给你一个证书,担保这些东西不会有问题。就算所有的零件都可以采购,也没人愿意自己亲手去装一台汽车。同样,就算可以到处找免费开源的代码做一个和Red Hat一模一样的操作系统,也没有多少人愿意这么做。当用户买了汽车以后,如果对原厂的配置不满意,可以自己改装一下,比如说改一下轮毂,16寸的改成19寸的,显得这车比较牛一些。当然,这个大改装在中国是不行的,如果改装太大了,自己又不认识人,年检可以就挂了。小改装没事,比如我的五陵宏光S,就在前挡风玻璃上改装了一下,贴了一张财神的画像,希望能保佑我发财。这个可以过年检。

如果有客户买了Windows或者Unix,要满足自己的要求,可能不是很方便。但是你买了Linux,随便你改装,并且,你改装好了以后,还可以卖给别人。因为用户有有修改Red Hat源代码并且不通知Red Hat公司的权力。这个和汽车一样,你买了就买了,你可以改装以后,再卖给别人,没什么问题。这个是非常重要的,尤其是对一些大型的商业机构或者国家机构。Bob Young举了一个例子,Fermilab,也就是芝加哥的费米实验室要用到集群计算机,市面上所有的操作系统都不支持他们特殊的需求,就找到了Red Hat,于是联系了几次,就购买了Red Hat作为Fermilab正式的操作系统。这个当然是个大事,Red Hat有事没事就拿出来说说,Fermilab都买了,说明Red Hat还是有很大实力的。后来NASA也用了,这下让Red Hat历害了。

Bob Young虽然没有写代码的经验,但是他很早就预言了UNIX会失败,Linux会成功,这两个操作系统从软件层面上,差距并不大,之所以后者会成功,是因为Linux采用了GPL(通用公共许可证),这个许可证是开源软件的灵魂,正是因为这个许可证,让Linux这样一个协作开发项目非常的有效。他说,其实Linux也好,Unix也好,都是一个人开发的,Linux是Linus开发的,Unix最初是由Ken Thompson开发的。(多说一句,顺便做一下广告,我有一个知识星球,我在里面写Unix的事情。如果大家对Unix,Linux以及Mac还有后来的iOS,Android的历史有兴趣,可以去订阅。)

Bob Young说,无论Unix还是Linux,内核的部分只占很少的代码量,之所以这个能发展起来,完全是靠大家共同努力,像Linus和Ken Thompson这样的人,作用巨大,但是他们也只是启动这个项目的人,为什么Unix后来失败了呢?是因为没有选好类似GPL这样的协议。UNIX是靠大家帮助的(我在我的知识星球里有写哪些组织写了哪些代码),但是,这些后来帮过UNIX的大学和组织,突然有一天收到了一封信,说,你们要为UNIX付钱,否则不允许再使用了。这当然让这些大学感到非常失望,因为代码都是他们写的,他们参与了UNIX的成长,并且提供了大量的代码给UNIX,结果还要付钱。于是,UNIX的人心就散了。

Linux和UNIX的情况差不多,Linus开发了内核,但是这个内核有大量的热心人帮忙写的。GPL可以保证所有人的修改都会被公开,正是因为有GPL,所以Linus不会像UNIX做的那样,突然写一封信说,如果你再继续用Linux,可就得收钱了。Bob Young说,他觉得这个GPL协议太好了,如果Red Hat对Linux有所创新,和我们一起用Linux的人也能用到这些创新,如果竞争对手对Linux有创新,那么Red Hat公司也能用到这些创新,这种强制性的开放源代码能让所有用Linux的公司都能第一时间用到最先进的技术。这是一个强大的力量,如果你也做开源的Linux发行版,当市场上出现了一种更先进的技术的时候,如果你不采用,那么客户就不会去选择你。比如在1997年的时候,C语言的库函数glibc要更新,Red Hat首先选择了更先进的版本,但是兼容性不如旧版本好。做出这一得起的都以后,其它的Linux发行厂商都选择了快速跟进。

如果在UNIX上,那是不可思议的。所以,后来的UNIX分裂的非常严重,那都是各个厂商自己修改了以后,不公开,然后互相之间的差距也就越来越大了。当然,现在仍然有,只是越来越少的人质疑Linux开源的模式,但是早在1998年,Bob Young就预言,商业公司只要尝试过开源的好处,就不会再去选择不开源的系统了,就好像去过自由世界的人,就不会真正爱上专制一样。他还预言,以后所有的系统都会是开源的模式。我觉得真有点说不好,也许Windows以后也开源了。

观注后帮我点点广告就更好了 🙂

173. Red Hat(2): 如何用免费的东西赚钱

Red Hat的成功,可以说是利用开源软件上市第一个巨大的成功。起码看起来是这样,从1995年开始成立公司,到1999年就在Nasdaq上市了,总共也没几年时间。看起来是一个非常容易的成功,但是,我认为实际上并不是这么回事,因为Red Hat是第一个用免费软件赚到如此多钱的公司,后来者也是目瞪口呆。一直到Red Hat上市,所有的软件都有源码,任何人都可以用Red Hat的源码,实际上这些软件也不是Red Hat写的,然后就能做到上市,在当时是一个非常让人不能理解的事情。

后来,Red Hat的创始人Bob Young出来解释过Red Hat是一个什么样的商业模式。我认为他的解释非常的好,虽然他本人不会写代码,但是这个事吧,不会写代码不见得没有能力做软件。做出那么多经典游戏的任天堂的老大山内溥不仅不会写软件,他连游戏也不玩,在最初的时候,他看到一个游戏,他就站在公司员工后面看别人玩,如果他觉得好玩,这个项目就能立项上线。在以前的时候,我曾经觉得我会写代码,应该会比不写代码的人看得长远,实际上我搞错了。就好像是农民工会盖房子,会挖地下通道,但是城市并不是农民工的。程序员也是这样,就算你会写软件,比如说你是哪个公司的,加班写了很多代码,但是,公司并不是程序员的,而是老板的。

所以,再回到Bob Young,Red Hat的创始人这里来,他说,卖软件很难赚到钱,不管是卖开放源码的,还是卖开放源代码的,都非常难。不要只看到了微软,就觉得卖不开放源代码的软件容易赚钱,这是一种假相。有大量的公司死了别人都不知道怎么死的,做软件和淘金一样,人的眼睛都放在淘金赚到钱的少数几个人身上,大量的人淘几年,连命都丢了,只是这些人都被大众忽视了。所以,在他卖软件和图书的时候,就发现了,这种事情非常的难,大量的软件和图书根本收不回成本。

他仔细研究了软件这个行业,他觉得他要开辟一个新的领域才行。他本人有个兴趣,对铁路很有研究,他说在以前,资本家都只关心铁路,实际上美国不少的大城市都是铁路的车站发展起来的,他举了一个例子是芝加哥,就是一个车站发展起来的。当时的铁路垄断者只关心铁路的干线,只要垄断的铁路的干线,就可以轻松的赚钱。外人根本就没法和他们竞争。

只凭借低价是没法挑战这些铁路巨头的,而是要换一种方法,把铁路巨头拉下马的是汽车,因为火车只能送到火车站,汽车可以送到你的家门口。汽车是比火车更好的运输模式。所以,他觉得他可以把开源这个模式发展成一个把不开源的拉下马的模式。当然了,当时没人相信他。他就一家一户的去卖,去推销,实际上,只要不怕失败,总是有一些公司相信他的话,然后买他的产品。

实际上我站在这里说故事是轻描淡写,可能受的苦,人家也不说,他只说了,无数的人听到一半就让他们出去了。上一期也说了,Bob Young不是富二代也不是官二代,开个卖图书软件的小店,在开这个小店的几年里,可能是卖软件,图书多了,就有了一些感悟。

他后来说,软件行业根本不能把自己看成高科技行业,而是要把自己看成是日用品行业。当时是1996年,他就有这个觉悟了,他说多年以后,每个人每天都要用软件,所以很有先见之明,现在我们每天都在用软件了。在1996年的时候,我连电脑都没用过,他就已经预见到软件是日用品行业了。日用品他有经验,他还从事过番茄酱的销售,他举的例子就是番茄酱的情况。

他说,番茄酱这个东西,最简单了,自己在厨房里就可以做,这东西也没什么版权,你有番茄,有醋和盐就能做出来,品味的区别仅仅是这些佐料不同的比例,没什么技巧。但是,80%多的番茄酱是Heinz的,他就很不理解,难道Heinz的就这么好吃么?他就拿着不同的番茄酱去不吃番茄酱的国家做实验,就会发现,只有两种情况,要么是这个人不喜欢吃番茄酱,所有的都不喜欢吃,要么是,都差不多,并没有证据证明Heinz的要好吃。

后来他觉得是Heinz定义了番茄酱,Heinz通过强大的广告策略,让人觉得只有Heinz的番茄酱才是正常的味道,其它的不是番茄酱。我个人也有点感触,因为我们周围都有一些人,只喝可口可乐或者只喝百事可乐,有的比较挑剔的只喝铝罐装的可乐。因为我不怎么喝可乐,我也喝不出来啥区别,我是山东人,我们对一个人非常失望的时候,会说,算了算了,你喝啤的吧。如果对一个人彻底绝望了,才会说,来,服务员,给他一瓶可乐。我一般不会让人绝望到让我喝可乐。在山东,尤其是我们山东的农村,一喝酒,都是拼酒,看谁先抛弃理智和健康。

还有他举了另外一个例子,现在发达国家的自来水可以随便喝,但是,法国的Evian的水就是每年能卖几亿美元。这很大程度上是因为人们已经有了一种非理性的恐惧,让人们认为从水龙头里流出的水是不可信的。中国有点不一样,水龙头里的水真的要烧开了再喝,不要直接喝。

Bob Young有了这种思想的指导,就觉得这是Red Hat的一个机会,Red Hat要提供方便,提供质量,最重要的是要在客户中定义一个操作系统是什么样子的。如果能提供一个质量很高的产品,然后再能卖到比较高端的机构里,人们就会认为Red Hat的质量是不一般的。到时候,人们会愿意花50美元来买Red Hat而不是在网上下载免费的软件。Evian水就是这样的,因为人总是要喝水的,有人喝不起不要紧,只要基数足够大,总有人愿意花很贵的价格来买一瓶水。(我没喝过,在超市里见过,大概10来块钱一瓶水,好像那些明星都喝这个)。

所以,Red Hat的策略是,首先要让大量的人使用Linux,只要用Linux的人足够多,就一定有人愿意用Red Hat。爱好Linux的人越多就越好。他在文章里写的叫品牌的力量在技术交易中占有巨大的作用。我觉得翻译成人话就是,只要你有了品牌,人家就会信任你,就算你软件做的烂一点,也没太大问题。说到这里的时候,我想到了我工作时候的一件事,我工作比较早,早到那时候还没有git,这个是后来的,这个软件现在很流行,以前呢,大家用SVN,这种都是源码的管理软件。我呆的公司,不知道技术的老大怎么想的,这个SVN(Subversion)我个人觉得还是挺好用的,这个东西是免费的,是Apache出品的。但是,不知道什么原因,这个老大是参加了一个聚会,还是收到了一封促销邮件啊,他觉得SVN不行,要花个几十万用一家商业公司的产品。这个时候就显示出品牌的力量了,这个公司叫IBM,一听,就觉得靠谱啊,IBM啊,会跳舞的大象。反正我们打工的,让用啥就用啥呗,还能反抗不成?

IBM也有一个收费的代码管理软件,我觉得到我生命的尽头我也能记住他的名字,这个软件叫Rational ClearCase。这是公开场合,我不能说人家的软件难用,只能说这个软件和我们几个人八字不合吧。当时用的开发软件也是IBM主导的Eclipse,我当年写过不少Java的软件,按道理说,这两个软件都算是IBM深度参与的,至少插件应该很好用吧,结果不好意思,一点也不好用。bug狂多。但是因为这个软件是老大点头买进来的,不可能不用了啊,大家就硬着头皮用啊。一天至少有一个半小时在和这个软件做斗争,后来大家实在是要崩溃了,老大同意,再请IBM的人来给培训,我去,IBM又赚了一笔钱。

我说这个例子只是因为讲到了Red Hat这个策略,建立一个强大的品牌,让消费者认为这是一个高质量的产品。这个策略当然很有效,其它的公司,比如IBM也肯定是这种策略,但是,我们作为个人,不能让这些品牌给忽悠了,自己试试。同样的道理还有像现在Google这样的公司,他们有钱有人有时间,最近这几年还好了,前几年的时候,Google几乎一年出一个社交的产品。因为Google的名声在国内还是不错的,再加上当时国人就用QQ,一些互联网大牛都会写一些类似的标题:聊天软件就要变天了,社交媒体就要变天了。那几年,我总是被拉去用各种新的聊天软件,比如Orkut,Google Wave,Google Buzz,Google+等等。但是,最后都一地鸡毛,还是老老实实的用QQ。我们不能一直随波逐流。听任这些大公司忽悠,即使像Red Hat或者IBM,Google这样的公司。

欢迎关注我的公众号:软件那些事儿。点点广告就更好了 🙂

SQL语言算不算编程语言?为什么看起来这么奇怪?

简单的来说,当然算!

接下来我要复杂的说。

编程语言有几种范式?

编程语言林林总总,可谓是不计其数,但是总的来说,不外乎这几种范式:命令式,对象式,并发式还有声明式。

先一个一个来说。

继续阅读“SQL语言算不算编程语言?为什么看起来这么奇怪?”

UNIX历史(4): 1974—1979年, UNIX被外界所知的几年

这是我在我的知识星球上写的《我所知道的UNIX故事》连载之一,有1/3是免费放出来做广告的,本文就是免费的,如果有兴趣,欢迎订阅我的知识星球。

上文说到,1974年,在《美国计算机通信》(Communications of the ACM)上发表了关于UNIX的第一篇论文——《UNIX Time-Sharing System》——之后,外界开始对UNIX关注起来。在那篇论文中,主要是写了UNIX如何的简洁,如何的优美,如何的容易移植,并且可以跑在配置不用太好的机器上。在论文中,说明了已经在UNIX上跑的600个应用。所有的这一切让外界对UNIX的兴趣大增。

当时个人还是买不起计算机的,能买得起的都是大学或者一些实验室。这些大学或者实验室的科学家都希望能体验一下UNIX,于是就写信到贝尔实验室,希望能搞一份UNIX来用用。在1958年的时候,由于贝尔实验室为解决反拖拉斯案例和政府达成的协议,AT&T不能从事与计算机相关的工作。所以,UNIX不能卖钱。当时的协议还规定,贝尔实验室必须将非电话业务的技术许可给任何提出需求的人,美国的法律咱不懂,反正UNIX必须要给任何提出需求的人。当然了,Ken发的论文,这事当然得Ken自己来搞。

我认为,刚开始的时候,请求肯定不会特别多,毕竟那个年代电脑少,要用到UNIX的人肯定也少。在初期的时候,ken一个人负责将装有UNIX的磁带和磁盘邮寄出去,在每一个邮包里,都有ken亲自写的一张纸条,上面写着:”love, ken”

我们可以想到,UNIX被安装进大学的实验室,大学里的人肯定有各种各样的需求。而且那个年代,能用UNIX的人自然也是计算机非常NB的人,需求肯定是难以满足,而且那些人肯定不会上网找代码,毕竟没有什么现成的东西可以用。所以,在最初的几年里,非常多的人为UNIX做出了巨大的贡献,我只列举一些至今仍然在用的项目,这些都是当年那些和ken要了UNIX源码的学校做出的贡献:

耶鲁大学觉得UNIX的Shell版本不够好用,最初的shell叫Thompson shell,可能不太好用,耶鲁大学改进了UNIX的shell;普渡大学要用到UNIX的多用户,当时UNIX并没有特别考虑UNIX的多用户,所以并不完善,普渡大学的电子工程系改进了UNIX的多用户设计;多伦多大学要给UNIX安装一些打印机,所以,多伦多大学完善了UNIX的驱动程序,并且制定了一些规则;加州大学也开发了一个新的shell,c shell,还有包括vi在内的众多软件;最初的UNIX是不支持网络的,这个功能也是在普渡大学,加州大学等一众大学的共同努力下完成的。

所有的这些改进,又通过各种渠道反馈给了ken,于是在1970年代后期,Bell lab发布Unix V7的时候,都把这些改进加入到了UNIX之中,最终,产生了一个更加完善,更加强大的系统。于是,学术界,工业界,商业界之间的互相交流和反馈,让UNIX越来越强大。

公认的第一个版本的UNIX并不是ken在PDP上开发的UNIX,那个UNIX太简单了。UNIX公认的第一个版本是被各个大学,商业机构使用,并反馈源码以后形成的UNIX V7,这个版本可以说是集当时之大成,在1979年由ken亲自发布的。

在当时,UNIX文化产业还形成了一本非常重要的书,叫作《莱昂氏UNIX源代码分析》,这本书有中文版,各大学校的图书馆里肯定有,我当年也曾经借来放了几周,看不懂。本书由上、下两篇组成。上篇为UNIX版本6的源代码,下篇是莱昂先生对UNIX操作系统版本6源代码的详细分析。本书语言简洁、透彻,曾作为未公开出版物广泛流传了二十多年,是一部杰出经典之作。本书的作者是澳洲人,可以看出当年UNIX已经影响到澳洲了。希望大家有兴趣的可以去图书馆找来看看,我确信你的学校里一定有这本书。

当UNIX火了以后,就开始有专门的商业公司开始运作这个事情,在1980年的时候,甚至有一家叫Microsoft的公司也开发了一个叫XENIX的UNIX开销售。当时,Internet已经慢慢的开始发展,如果没有Internet,不止UNIX,我们的生活将会是另外一个样子。

下一篇,就开始讲UNIX在1980年到1990年的发展,在这10年之中,最精彩的莫过于TCP/IP和UNIX版权的斗争了。敬请观注。

我的微信公众号是:软件那些事儿。如有兴趣,可以观注,或者,只是点点广告,让我多赚一点钱也很好 🙂

软件那些事儿

第十三次视频 Active Record

什么是面向对象

现在所有程序员都知道的一个编程方式叫面向对象编程,我个人认为,面向对象编程最大的好处是让编程更容易使用了,其实复用对我来说还是其次的。比如说,在面向对象编程的时候,调用方法的时候要合理很多。

现在大量的语言都宣称自己是面向对象的语言,比如我录的这个Ruby语言就是如此。

什么的关系数据库

SQL语言是一种特定的语言,是针对数据库的语言。

但是不要认为数据库是数据库管理员的事。虽然在这个视频里我总是说可以不用写SQL语句,因为很多的框架都实现了今天我要讲的这个Active Record,但是,这都是一种宣传。

数据库绝对不止是DBA的事情,种框架实现的ORM也不能完全取代数据库的设计和SQL语言。实际上在写应用的时候,即使有了ORM,也要写大量的存储过程(stored procedure),所以,还是希望大家能比较熟练的手写SQL语句。

我们使用的MySQL数据库叫关系数据库,在设计的时候,没有考虑面向对象的问题,因此,如何将面向对象和关系数据库结合起来,就成了一个重大的问题。也正是因为这个需求,催生了对象关系映射(ORM)这么个东西。

什么是ORM

对象关系映射(ORM)是一种技术,把应用中的对象和关系型数据库中的数据表连接起来。使用 ORM,应用中对象的属性和对象之间的关系可以通过一种简单的方法从数据库中获取,无需直接编写 SQL 语句,也不过度依赖特定的数据库种类。

在Web开发刚兴起的时候,当时的方法是CGI,就是在PHP,Perl语言中嵌入HTML代码,当时没这么复杂,也不考虑什么MVC,更没有什么ORM,只是后面业务复杂了,这事才显得重要了。

Ruby on Rails这个框架就是众多框架中实现了ORM的一种,也算是最早期的之一吧,后来者比如用Perl写的Catalyst,Python写的Pylon,PHP中的CakePHP都是后来者,都或多或少的从Ruby on Rails中找了一些灵感。

DEMO部分,演示在ORM中增删查改

用英超的球队来举例子:

rails new premier_league
rails g model Team name point:integer 

这样就会生成一个migration,要使该migration生效,可以使用

rails db:migrate

生成的模型(model)文件叫country.rb,虽然在这个文件中没有任何东西,但是默认自动生成几个属性。可以在console里使用Country.column_names来查看。

Getters 和 Setters

当我们在使用支持面向对象语言写程序的时候,会使用attr_accessors来读写一个对象的属性。

在Ruby on Rails中,这个也是自动生成的,可以使用类似china.name, china.population来读取或者设置其中的数据,而不用写SQL语句。

ActiveRecord 里的数据类型(Data Types)

当我们在写Ruby on Rails项目的时候,一定会有如下的疑问:

  1. Rails到底支持多少种类型?
  2. 如果我用的是MySQL,他用的是SQLite,你用的是PostgreSQL,我在这里设置的类型,会有什么不同么?
  3. 当我要给一篇文章Post建立一个模型,比如有title,我应该是让title是string类型呢还是text类型呢?
  4. 官方文档太长了,我不想看……

这些答案并不复杂,ActiveRecord要支持各种各样的数据类型,前面用到了integer类型,这个是整数类型,ActiveRecord还支持如下的类型,和不同的数据库的对应关系如下:

添加测试数据项 (Adding Records)

在做测试的时候,可以在db/seeds.rb中提前输入数据,这样可以让项目开始的时候有一些数据。然后执行下面的命令,将seed中准备好的数据存入数据库中:

我使用英超最近的积分来测试,将这些比分:

Team.create(name:"Man City", point: 20)
Team.create(name:"Liverpool", point: 20)
Team.create(name:"Chelsea", point: 20)
Team.create(name:"Tottenham", point: 18)
Team.create(name:"Arsenal", point: 18)
Team.create(name:"AFC Bournemouth", point: 16)
Team.create(name:"Wolverhampton", point: 15)
Team.create(name:"Watford", point: 13)
Team.create(name:"Manchester United", point: 13)
Team.create(name:"Leicester City", point: 12)
Team.create(name:"Everton", point: 12)
Team.create(name:"Burnley", point: 8)
Team.create(name:"Brighton", point: 8)
Team.create(name:"Crystal", point: 7)
Team.create(name:"West Ham", point: 7)
Team.create(name:"Southampton", point: 5)
Team.create(name:"Fulham", point: 5)
Team.create(name:"Huddersfield", point: 3)
Team.create(name:"Newcastle", point: 2)
Team.create(name:"Cardiff", point: 2)
rails db:seed

如果在此之前数据库里已经有一些东西,我们不想要了,只要seed文件里的东西,那么可以执行下面这条命令:

rails db:reset

有两种方法来新增一个数据项:

  1. new和save
  2. create

find

在删除一个条目之前,要先查到这个条目,在Rails中,可以用很多方法来查找。最简单是find,这个find是按照primary key来查找的。可以传递一个单独的参数,也可以传递一个数组。返回值分别是对象或者数组。

Team.find(1)
Team.find([1,3,5])

where

如果要查找更细致的信息,可以使用where方法。where方法可以接受好几种参数,注意要搞清楚返回的值是不是数组。

Team.where(point: 20)
Team.where(point: 12..16)
Team.where(point: [2, 20])

not

not和where结合起来使用,是相反的操作,会返回不符合条件的查询。

Team.where.not(point: 20)

or

这个操作类似于编程中的or,自己试试就知道。

Team.where(point: 20).or(Team.where(name: “Arsenal”)

如果所有的方法都不行,还可以使用SQL来查询

因为SQL语句有个注入攻击,所以在传入SQL的时候,分成两种,一种是Sanitized Queries,一种是管它攻击不攻击,直接传进去。

在where内直接以传入SQL语句即可。

 Team.where( 'name like ?', '%Man%' ) 

Lazy Loading

我们在查询的时候,并不是说我们的指令下发了,就会查询,而是等到必须要用到结果了才云查询,在此之前,这些查询仅仅保存为ActiveRecord::Relation。这个机制非常好,不会在没有用到的时候浪费时间去查东西。

自动优化查询

当查询的时候,Active Record会优化我们写的查询,所以,就算写的不太好,可能也会优化成一样的。