2018年6月

用强大的 history 命令使你的命令行提示符更有效率。

随着我在终端中花费越来越多的时间,我感觉就像在不断地寻找新的命令,以使我的日常任务更加高效。GNU 的 history 命令是一个真正改变我日常工作的命令。

GNU history 命令保存了从该终端会话运行的所有其他命令的列表,然后允许你重放或者重用这些命令,而不用重新输入它们。如果你是一个老玩家,你知道 history 的力量,但对于我们这些半吊子或新手系统管理员来说, history 是一个立竿见影的生产力增益。

历史 101

要查看命令历史,请在 Linux 中打开终端程序,然后输入:

$ history

这是我得到的响应:

1  clear
2  ls -al
3  sudo dnf update -y
4  history

history 命令显示自开始会话后输入的命令列表。 history 有趣的地方是你可以使用以下命令重放任意一个命令:

$ !3

提示符中的 !3 告诉 shell 重新运行历史列表中第 3 个命令。我还可以输入以下命令来使用:

linuser@my_linux_box: !sudo dnf

history 将搜索与你提供的模式相匹配的最后一个命令,并运行它。

搜索历史

你还可以输入 !! 重新运行命令历史中的最后一条命令。而且,通过与grep 配对,你可以搜索与文本模式相匹配的命令,或者通过与 tail 一起使用,你可以找到你最后几条执行的命令。例如:

$ history | grep dnf
3  sudo dnf update -y
5  history | grep dnf
$ history | tail -n 3
4  history
5  history | grep dnf
6  history | tail -n 3

另一种实现这个功能的方法是输入 Ctrl-R 来调用你的命令历史记录的递归搜索。输入后,提示变为:

(reverse-i-search)`':

现在你可以开始输入一个命令,并且会显示匹配的命令,按回车键执行。

更改已执行的命令

history 还允许你使用不同的语法重新运行命令。例如,如果我想改变我以前的命令 history | grep dnfhistory | grep ssh,我可以在提示符下执行以下命令:

$ ^dnf^ssh^

history 将重新运行该命令,但用 ssh 替换 dnf,并执行它。

删除历史

有时你想要删除一些或全部的历史记录。如果要删除特定命令,请输入 history -d <行号>。要清空历史记录,请执行 history -c

历史文件存储在一个你可以修改的文件中。bash shell 用户可以在他们的家目录下找到 .bash_history

下一步

你可以使用 history 做许多其他事情:

  • 将历史缓冲区设置为一定数量
  • 记录历史中每行的日期和时间
  • 防止某些命令被记录在历史记录中

有关 history 命令的更多信息和其他有趣的事情,请参考 GNU Bash 手册


via: https://opensource.com/article/18/6/history-command

作者:Steve Morris 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

编者按:本文是 Linux 中国特约记者范凡在参加了 2018 LC3 首日会议和 Linus 媒体见面会后的花絮。

大家好,我是范凡,2018 年度的 LC3 再次在北京的国家会议中心召开,这次,我蒙 Linux 中国的老大指派,来 LC3 大会上去“巡风”一番,而且我还有个重大责任,就是和 Linus Torvalds 先生来个亲密接触。然而,想到就要见到传说中的我们的开源领袖,我竟然……太过激动,夜不成寐,直到凌晨 3 点才昏昏睡去——还好我的闹钟很尽责,在 6 点钟时将我叫了起来。

睡了不到 3 个小时,又赶上周一早高峰,两个多小时的车程,你知道的,当我到达现场的时候已经临近开场时间,整个人都是木木的。

签到之后领到了今年的 T 恤,不像去年,今年是蓝色的啦。 而为了参加这次大会,我还专门制作了咱们 Linux 中国自己的 T 恤。

进入主会场,大会很快就开始了,惯例还是由 Linux 基金会董事 Jim 做开场演讲。演讲中 Jim 还谈到了微软收购 GitHub 的事件,Jim 说微软是一个很强的软件公司,而 GitHub 能够提供更多的优秀的开发者,这两个强强结合肯定能为世界带来更多的好的改变。

之后,经过了几个演讲之后,大会主持人用一个笑话引入了众所期盼的 Linus Torvalds 演讲环节。

Jim 说 Linus Torvalds 很喜欢黑色和白色的动物,在他来到中国看过我们黑白相间的大熊猫之后,Linus 说我们要不要把 Linux 的吉祥物从那支黑白相间的企鹅,换称中国的大熊猫?!

图片中的大熊猫看起来很开心,但是似乎是因为那根胡萝卜,而不是因为它旁边是 Linus

之后便是和 Linus 的一个问答式的对话。之所以采用这种方式是因为 Linus 真的不喜欢公开演讲,所以这种方式会让他感觉稍微好一些。

具体的问答内容我基本忘干净了,主要内容还是和内核维护相关,内核维护的相关人员主要分为两类,一类是开发人员,另外一类是维护人员。Linus 对他们在整个内核维护过程中的职责和相关工作方法发表了一些个人的看法。

简单来说既是要求内核开发人员的代码要求有很好的 品味 taste 。然后就是大家需要通力合作才能够将整个项目良好维持下去。

然后趁着中间休息的机会和 Linux 中国的小伙伴们会了面,分了下我们定制的衣服,大家穿起来,一起开心的深蹲合了个影。

中国合伙人式深蹲合影。(谁说前面该放四个盆的,你出来,我不打死你!)


下面是重头戏!

下午,会有媒体参加的新闻发布会,Linus Torvalds 会亲自参加。Linux 中国作为邀约媒体,有幸参加,而我,则是那个幸运儿,可以近距离接触脱袜子先生啦(不枉我朝思暮想而夜不成寐)。

新闻发布会是 13:30 开始,根据老王的经验,一定要提前入场。于是乎我 12:32 就来到了会议的地点。

厚着脸皮坐到了第一排,会前准备期间,就看到了三位大佬在讨论事宜。

趁着讨论的空隙,再一次厚着脸皮拿到了下面的合影。

非常的和蔼,没有任何脾气。标准的 Linus 式微笑……至于美颜效果我表示不知道怎么关

之后各路大佬们就这样坐在台前一一回答台下记者们的问题。

在示意可以提问后,我顾盼了一下,大家还有点腼腆,于是赶快率先举手提了第一个问题:

Linus 将来会不会写一本书来告诉大家他心目中的有品位的代码是什么样子的?

Linus 的的回答说了一大堆,简单来说就是,他不会再去写书了。他的更多的经历会放在内核项目的管理上,因为这样才更有意义。

在提问期间,Linus 有说到英语的话题,说现在在场的其实大部分都不是社区的开发者。他也知道,中国的社区开发者在很多时候都会因为英文的问题导致工作上会有相关的障碍,尽管 Linux 基金会现在也在做汉化的工作(linuxfoundation.cn),但是还是希望大家能够通过自己的努力解决自身英文的问题。他拿自己举例子,说你们现在可能也听不出来我的母语其实不是英语,他在成长过程中其实是说的另外两种语言,(他也是后天才学习的英语)也希望中国的开发者也能够像他一样通过自己的努力解决自身的英文问题,这样在今后的开发过程中会轻松很多。(我的理解是:学英语是多么重要呀~开源的大火车就要开了,你居然 没有买到票 不会英语 扒在车厢外面 靠别人的翻译 一定不轻松呀~)

然后我还依稀记得,他有说到关于开源组织的一个理念。开源组织是一帮人在做一个事情遇到问题的时候他们想出了一套方法来解决对应的问题,然后将实现的代码共享出来给大家,如果大家在用的时候遇到了新的问题,Linus 更多的期望是,大家拿着这套代码继续去深入开发,解决相关领域的更多的新的问题,而不是去等待最初的团队来再次的付出人力完善他们的代码。

中间还有很多问答,现在完全不记得了。(抱歉各位~我录了音 但是音质实在太渣了,我保证下回弄一个专业的设备去录音。)

在最后的合影时候,我利用这最后的机会疯狂的将各位大佬当成背景自拍,这一个举动被站在 Linus 旁边的 Jim 看到了,他走过来拿着我的手机说,“天哪,我看你一直在自拍,自拍了不下十次,我知道你一定想和Linus合个影对吧?”于是乎我得到了下面这张由 Jim 亲手拍摄的:

感激坏了,难怪人家说 Jim 是最 nice 的人了,从此对 Jim 比心心,然后我又和他来了一张。

当时脑袋全都是木的。应该说 You and me……结果说成了 Me and you……,Jim 也只自己疑惑的重复了一下,然后完全不在乎这些细节。他们人都好 Nice。

然后在接下来的各种疯狂要签名的环节里面,我弄到了如下两个~(恩是的。我吃这么胖就是为了让自己脸皮厚一点。)

尽管由于前一天晚上太过激动,只睡了大概 2 个多小时就前往会场,导致整个人都是木的。

但是一天下来,还是被震撼了还几次,收获不少。能够从 IT 界大佬们的口中感受到我们的世界正在发生着不断地变化,不管是国内的还是国外的(其实抛开政治我们是一体的),这种变化的支撑需要优秀的贡献者,我们作为工作在一线的工程师们(是的,今天我是以媒体身份混进去的。)还是要不断的学习,提高自己的各方面能力,才能够赶上时代的步伐,去见证这一奇迹时代的到来。

最后容我用我的朋友圈嘚瑟一句。我们可以从“在每天上下班路上利用我们的智能手机鲸吞蚕食地看完一本书” 开始,踏上这一美妙的征程。

有关本次大会更多信息,请移步这里

DNS 轮询将多个服务器映射到同一个主机名,并没有为这里展示的魔法做更多的工作。

如果你的后端服务器是由多台服务器构成的,比如集群化或者镜像的 Web 或者文件服务器,通过负载均衡器提供了单一的入口点。业务繁忙的大型电商在高端负载均衡器上花费了大量的资金,用它来执行各种各样的任务:代理、缓存、状况检查、SSL 处理、可配置的优先级、流量整形等很多任务。

但是你并不需要做那么多工作的负载均衡器。你需要的是一个跨服务器分发负载的简单方法,它能够提供故障切换,并且不太在意它是否高效和完美。DNS 轮询和使用轮询的子域委派是实现这个目标的两种简单方法。

DNS 轮询是将多台服务器映射到同一个主机名上,当用户访问 foo.example.com 时多台服务器都可用于处理它们的请求,使用的就是这种方式。

当你有多个子域或者你的服务器在地理上比较分散时,使用轮询的子域委派就比较有用。你有一个主域名服务器,而子域有它们自己的域名服务器。你的主域名服务器将所有的到子域的请求指向到它们自己的域名服务器上。这将提升响应时间,因为 DNS 协议会自动查找最快的链路。

DNS 轮询

轮询和 旅鸫鸟 robins 没有任何关系,据我相熟的图书管理员说,它最初是一个法语短语,ruban rond、或者 round ribbon。很久以前,法国政府官员以不分级的圆形、波浪线、或者直线形状来在请愿书上签字,以盖住原来的发起人。

DNS 轮询也是不分级的,简单配置一个服务器列表,然后将请求转到每个服务器上。它并不做真正的负载均衡,因为它根本就不测量负载,也没有状况检查,因此如果一个服务器宕机,请求仍然会发送到那个宕机的服务器上。它的优点就是简单。如果你有一个小的文件或者 Web 服务器集群,想通过一个简单的方法在它们之间分散负载,那么 DNS 轮询很适合你。

你所做的全部配置就是创建多条 A 或者 AAAA 记录,映射多台服务器到单个的主机名。这个 BIND 示例同时使用了 IPv4 和 IPv6 私有地址类:

fileserv.example.com. IN A 172.16.10.10
fileserv.example.com. IN A 172.16.10.11
fileserv.example.com. IN A 172.16.10.12

fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::10
fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::11
fileserv.example.com. IN AAAA fd02:faea:f561:8fa0:1::12

Dnsmasq 在 /etc/hosts 文件中保存 A 和 AAAA 记录:

172.16.1.10 fileserv fileserv.example.com
172.16.1.11 fileserv fileserv.example.com
172.16.1.12 fileserv fileserv.example.com
fd02:faea:f561:8fa0:1::10 fileserv fileserv.example.com
fd02:faea:f561:8fa0:1::11 fileserv fileserv.example.com
fd02:faea:f561:8fa0:1::12 fileserv fileserv.example.com

请注意这些示例都是很简化的,解析完全合格域名有多种方法,因此,关于如何配置 DNS 请自行学习。

使用 dig 命令去检查你的配置能否按预期工作。将 ns.example.com 替换为你的域名服务器:

$ dig @ns.example.com fileserv A fileserv AAA

它将同时显示出 IPv4 和 IPv6 的轮询记录。

子域委派和轮询

子域委派结合轮询要做的配置会更多,但是这样有一些好处。当你有多个子域或者地理位置比较分散的服务器时,就应该去使用它。它的响应时间更快,并且宕机的服务器不会去响应,因此客户端不会因为等待回复而被挂住。一个短的 TTL,比如 60 秒,就能帮你做到。

这种方法需要多台域名服务器。在最简化的场景中,你需要一台主域名服务器和两个子域,每个子域都有它们自己的域名服务器。在子域服务器上配置你的轮询记录,然后在你的主域名服务器上配置委派。

在主域名服务器上的 BIND 中,你至少需要两个额外的配置,一个区声明以及在区数据文件中的 A/AAAA 记录。主域名服务器中的委派应该像如下的内容:

ns1.sub.example.com. IN A 172.16.1.20
ns1.sub.example.com. IN AAAA fd02:faea:f561:8fa0:1::20
ns2.sub.example.com. IN A 172.16.1.21
ns2.sub.example.com. IN AAA fd02:faea:f561:8fa0:1::21

sub.example.com. IN NS ns1.sub.example.com.
sub.example.com. IN NS ns2.sub.example.com.

接下来的每台子域服务器上有它们自己的区文件。在这里它的关键点是每个服务器去返回它自己的 IP 地址。在 named.conf 中的区声明,所有的服务上都是一样的:

zone "sub.example.com" {
    type master;
    file "db.sub.example.com";
};

然后数据文件也是相同的,除了那个 A/AAAA 记录使用的是各个服务器自己的 IP 地址。SOA 记录都指向到主域名服务器:

; first subdomain name server
$ORIGIN sub.example.com.
$TTL 60
sub.example.com  IN SOA ns1.example.com. admin.example.com. (
        2018123456      ; serial
        3H              ; refresh
        15              ; retry
        3600000         ; expire
)

sub.example.com. IN NS ns1.sub.example.com.
sub.example.com. IN A  172.16.1.20
ns1.sub.example.com.  IN AAAA  fd02:faea:f561:8fa0:1::20
; second subdomain name server
$ORIGIN sub.example.com.
$TTL 60
sub.example.com  IN SOA ns1.example.com. admin.example.com. (
        2018234567      ; serial
        3H              ; refresh
        15              ; retry
        3600000         ; expire
)

sub.example.com. IN NS ns1.sub.example.com.
sub.example.com. IN A  172.16.1.21
ns2.sub.example.com.  IN AAAA  fd02:faea:f561:8fa0:1::21

接下来生成子域服务器上的轮询记录,方法和前面一样。现在你已经有了多个域名服务器来处理到你的子域的请求。再说一次,BIND 是很复杂的,做同一件事情它有多种方法,因此,给你留的家庭作业是找出适合你使用的最佳配置方法。

在 Dnsmasq 中做子域委派很容易。在你的主域名服务器上的 dnsmasq.conf 文件中添加如下的行,去指向到子域的域名服务器:

server=/sub.example.com/172.16.1.20
server=/sub.example.com/172.16.1.21
server=/sub.example.com/fd02:faea:f561:8fa0:1::20
server=/sub.example.com/fd02:faea:f561:8fa0:1::21

然后在子域的域名服务器上的 /etc/hosts 中配置轮询。

获取配置方法的详细内容和帮助,请参考这些资源:

通过来自 Linux 基金会和 edX 的免费课程 "Linux 入门" 学习更多 Linux 的知识。


via: https://www.linux.com/learn/intro-to-linux/2018/3/simple-load-balancing-dns-linux

作者:CARLA SCHRODER 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

命令行审计不会影响数据库,因为它使用从数据库中释放的数据。

我兼职做数据审计。把我想象成一个校对者,校对的是数据表格而不是一页一页的文章。这些表是从关系数据库导出的,并且规模相当小:100,000 到 1,000,000条记录,50 到 200 个字段。

我从来没有见过没有错误的数据表。如你所能想到的,这种混乱并不局限于重复记录、拼写和格式错误以及放置在错误字段中的数据项。我还发现:

  • 损坏的记录分布在几行上,因为数据项具有内嵌的换行符
  • 在同一记录中一个字段中的数据项与另一个字段中的数据项不一致
  • 使用截断数据项的记录,通常是因为非常长的字符串被硬塞到具有 50 或 100 字符限制的字段中
  • 字符编码失败产生称为乱码的垃圾
  • 不可见的控制字符,其中一些会导致数据处理错误
  • 由上一个程序插入的替换字符#Replacement_character)和神秘的问号,这是由于不知道数据的编码是什么

解决这些问题并不困难,但找到它们存在非技术障碍。首先,每个人都不愿处理数据错误。在我看到表格之前,数据所有者或管理人员可能已经经历了 数据悲伤 Data Grief 的所有五个阶段:

  1. 我们的数据没有错误。
  2. 好吧,也许有一些错误,但它们并不重要。
  3. 好的,有很多错误;我们会让我们的内部人员处理它们。
  4. 我们已经开始修复一些错误,但这很耗时间;我们将在迁移到新的数据库软件时执行此操作。
  5. 移至新数据库时,我们没有时间整理数据; 我们需要一些帮助。

第二个阻碍进展的是相信数据整理需要专用的应用程序——要么是昂贵的专有程序,要么是优秀的开源程序 OpenRefine 。为了解决专用应用程序无法解决的问题,数据管理人员可能会向程序员寻求帮助,比如擅长 PythonR 的人。

但是数据审计和整理通常不需要专用的应用程序。纯文本数据表已经存在了几十年,文本处理工具也是如此。打开 Bash shell,您将拥有一个工具箱,其中装载了强大的文本处理器,如 grepcutpastesortuniqtrawk。它们快速、可靠、易于使用。

我在命令行上执行所有的数据审计工作,并且在 “cookbook” 网站上发布了许多数据审计技巧。我经常将操作存储为函数和 shell 脚本(参见下面的示例)。

是的,命令行方法要求将要审计的数据从数据库中导出。而且,审计结果需要稍后在数据库中进行编辑,或者(数据库允许)将整理的数据项导入其中,以替换杂乱的数据项。

但其优势是显著的。awk 将在普通的台式机或笔记本电脑上以几秒钟的时间处理数百万条记录。不复杂的正则表达式将找到您可以想象的所有数据错误。所有这些都将安全地发生在数据库结构之外:命令行审计不会影响数据库,因为它使用从数据库中释放的数据。

受过 Unix 培训的读者此时会沾沾自喜。他们还记得许多年前用这些方法操纵命令行上的数据。从那时起,计算机的处理能力和 RAM 得到了显著提高,标准命令行工具的效率大大提高。数据审计从来没有这么快、这么容易过。现在微软的 Windows 10 可以运行 Bash 和 GNU/Linux 程序了,Windows 用户也可以用 Unix 和 Linux 的座右铭来处理混乱的数据:保持冷静,打开一个终端。

 title=

例子

假设我想在一个大的表中的特定字段中找到最长的数据项。 这不是一个真正的数据审计任务,但它会显示 shell 工具的工作方式。 为了演示目的,我将使用制表符分隔的表 full0 ,它有 1,122,023 条记录(加上一个标题行)和 49 个字段,我会查看 36 号字段。(我得到字段编号的函数在我的网站上有解释)

首先,使用 tail 命令从表 full0 移除标题行,结果管道至 cut 命令,截取第 36 个字段,接下来,管道至 awk ,这里有一个初始化为 0 的变量 big ,然后 awk 开始检测第一行数据项的长度,如果长度大于 0 ,awk 将会设置 big 变量为新的长度,同时存储行数到变量 line 中。整个数据项存储在变量 text 中。然后 awk 开始轮流处理剩余的 1,122,022 记录项。同时,如果发现更长的数据项时,更新 3 个变量。最后,它打印出行号、数据项的长度,以及最长数据项的内容。(在下面的代码中,为了清晰起见,将代码分为几行)

tail -n +2 full0 \
> | cut -f36 \
> | awk 'BEGIN {big=0} length($0)>big \
> {big=length($0);line=NR;text=$0} \
> END {print "\nline: "line"\nlength: "big"\ntext: "text}'

大约花了多长时间?我的电脑大约用了 4 秒钟(core i5,8GB RAM);

现在我可以将这个长长的命令封装成一个 shell 函数,longest,它把第一个参数认为是文件名,第二个参数认为是字段号:

现在,我可以以函数的方式重新运行这个命令,在另一个文件中的另一个字段中找最长的数据项,而不需要去记忆这个命令是如何写的:

最后调整一下,我还可以输出我要查询字段的名称,我只需要使用 head 命令抽取表格第一行的标题行,然后将结果管道至 tr 命令,将制表位转换为换行,然后将结果管道至 tailhead 命令,打印出第二个参数在列表中名称,第二个参数就是字段号。字段的名字就存储到变量 field 中,然后将它传向 awk ,通过变量 fld 打印出来。(LCTT 译注:按照下面的代码,编号的方式应该是从右向左)

longest() { field=$(head -n 1 "$1" | tr '\t' '\n' | tail -n +"$2" | head -n 1); \
tail -n +2 "$1" \
| cut -f"$2" | \
awk -v fld="$field" 'BEGIN {big=0} length($0)>big \
{big=length($0);line=NR;text=$0}
END {print "\nfield: "fld"\nline: "line"\nlength: "big"\ntext: "text}'; }

注意,如果我在多个不同的字段中查找最长的数据项,我所要做的就是按向上箭头来获得最后一个最长的命令,然后删除字段号并输入一个新的。


via: https://opensource.com/article/18/5/command-line-data-auditing

作者:Bob Mesibov 选题:lujun9972 译者:amwps290 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

MySQL 文档存储 可以跳过底层数据结构创建、数据规范化和其它使用传统数据库时需要做的工作,直接存储数据。

MySQL 可以提供 NoSQL JSON 文档存储 Document Store 了,这样开发者保存数据前无需 规范化 normalize 数据、创建数据库,也无需在开发之前就制定好数据样式。从 MySQL 5.7 版本和 MySQL 8.0 版本开始,开发者可以在表的一列中存储 JSON 文档。由于引入 X DevAPI,你可以从你的代码中移除令人不爽的结构化查询字符串,改为使用支持现代编程设计的 API 调用。

系统学习过结构化查询语言(SQL)、 关系理论 relational theory 集合 set 和其它关系数据库底层理论的开发者并不多,但他们需要一个安全可靠的数据存储。如果数据库管理人员不足,事情很快就会变得一团糟,

MySQL 文档存储 允许开发者跳过底层数据结构创建、数据规范化和其它使用传统数据库时需要做的工作,直接存储数据。只需创建一个 JSON 文档集合 document collection ,接着就可以使用了。

JSON 数据类型

所有这一切都基于多年前 MySQL 5.7 引入的 JSON 数据类型。它允许在表的一行中提供大约 1GB 大小的列。数据必须是有效的 JSON,否则服务器会报错;但开发者可以自由使用这些空间。

X DevAPI

旧的 MySQL 协议已经历经差不多四分之一个世纪,已经显现出疲态,因此新的协议被开发出来,协议名为 X DevAPI。协议引入高级会话概念,允许代码从单台服务器扩展到多台,使用符合 通用主机编程语言样式 common host-language programming patterns 的非阻塞异步 I/O。需要关注的是如何遵循现代实践和编码风格,同时使用 CRUD (Create、 Read、 Update、 Delete)样式。换句话说,你不再需要在你精美、纯洁的代码中嵌入丑陋的 SQL 语句字符串。

一个新的 shell 支持这种新协议,即所谓的 MySQL Shell。该 shell 可用于设置 高可用集群 high-availability cluster 、检查服务器 升级就绪状态 upgrade readiness 以及与 MySQL 服务器交互。支持的交互方式有以下三种:JavaScript,Python 和 SQL。

代码示例

下面的代码示例基于 JavaScript 方式使用 MySQL Shell,可以从 JS> 提示符看出。

下面,我们将使用用户 dstokes 、密码 password 登录本地系统上的 demo 库。db 是一个指针,指向 demo 库。

$ mysqlsh dstokes:password@localhost/demo
JS> db.createCollection("example")
JS> db.example.add(
      {
        Name: "Dave",
        State:  "Texas",
        foo : "bar"
      }
     )
JS>

在上面的示例中,我们登录服务器,连接到 demo 库,创建了一个名为 example 的集合,最后插入一条记录;整个过程无需创建表,也无需使用 SQL。只要你能想象的到,你可以使用甚至滥用这些数据。这不是一种代码对象与关系语句之间的映射器,因为并没有将代码映射为 SQL;新协议直接与服务器层打交道。

Node.js 支持

新 shell 看起来挺不错,你可以用其完成很多工作;但你可能更希望使用你选用的编程语言。下面的例子使用 world_x 示例数据库,搜索 _id 字段匹配 CAN. 的记录。我们指定数据库中的特定集合,使用特定参数调用 find 命令。同样地,操作也不涉及 SQL。

var mysqlx = require('@mysql/xdevapi');
mysqlx.getSession({             //Auth to server
        host: 'localhost',
        port: '33060',
        dbUser: 'root',
        dbPassword: 'password'
}).then(function (session) {    // use world_x.country.info
     var schema = session.getSchema('world_x');
     var collection = schema.getCollection('countryinfo');

collection                      // Get row for 'CAN'
  .find("$._id == 'CAN'")
  .limit(1)
  .execute(doc => console.log(doc))
  .then(() => console.log("\n\nAll done"));

  session.close();
})

下面例子使用 PHP,搜索 _id 字段匹配 USA 的记录:

<?PHP
// Connection parameters
  $user = 'root';
  $passwd = 'S3cret#';
  $host = 'localhost';
  $port = '33060';
  $connection_uri = 'mysqlx://'.$user.':'.$passwd.'@'.$host.':'.$port;
  echo $connection_uri . "\n";

// Connect as a Node Session
  $nodeSession = mysql_xdevapi\getNodeSession($connection_uri);
// "USE world_x" schema
  $schema = $nodeSession->getSchema("world_x");
// Specify collection to use
  $collection = $schema->getCollection("countryinfo");
// SELECT * FROM world_x WHERE _id = "USA"
  $result = $collection->find('_id = "USA"')->execute();
// Fetch/Display data
  $data = $result->fetchAll();
  var_dump($data);
?>

可以看出,在上面两个使用不同编程语言的例子中,find 操作符的用法基本一致。这种一致性对跨语言编程的开发者有很大帮助,对试图降低新语言学习成本的开发者也不无裨益。

支持的语言还包括 C、Java、Python 和 JavaScript 等,未来还会有更多支持的语言。

从两种方式受益

我会告诉你使用 NoSQL 方式录入的数据也可以用 SQL 方式使用?换句话说,我会告诉你新引入的 NoSQL 方式可以访问旧式关系型表中的数据?现在使用 MySQL 服务器有多种方式,作为 SQL 服务器,作为 NoSQL 服务器或者同时作为两者。


via: https://opensource.com/article/18/6/mysql-document-store

作者:Dave Stokes 选题:lujun9972 译者:pinewall 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

想要在今天的快节奏的商业环境中获得成功?要么选择 DevOps,要么死亡。

在很久之前,遥远的银河系中,在 DevOps 成为主流实践之前,软件开发的过程是极其缓慢、单调和按部就班的。当一个应用准备要部署的时候,就已经为下一个主要版本迭代积累了一长串的变更和修复。每次为新版本迭代所花费的准备时间都需要花费数个月的时间去回顾和贯穿整个开发周期。请记住这个过程将会在交付更新给用户的过程中不断的 重复。

今天一切都是瞬间和实时完成的,这个概念似乎很原始。这场移动革命已经极大的改变了我们和软件之间的交互。那些早期采用 DevOps 的公司已经彻底改变了对软件开发和部署的期望。

让我们看看 Facebook:这个移动应用每两周更新和刷新一次,像钟表一样。这就是新的标准,因为现在的用户期望软件持续的被修复和更新。任何一家要花费一个月或者更多的时间来部署新的功能或者修复 bug 的公司将会逐渐走向没落。如果你不能交付用户所期待的,他们将会去寻找那些能够满足他们需求的。

Facebook,以及一些工业巨头如亚马逊、Netfix、谷歌以及其他公司,都已经强制要求企业变得更快速、更有效的来满足今天的顾客们的需求。

为什么是 DevOps?

敏捷和 DevOps 对于移动应用开发领域是相当重要的,因为开发周期正变得如闪电般的快。现在是一个密集、快节奏的环境,公司必须加紧步伐赶超,思考的更深入,运用策略来去完成,从而生存下去。在应用商店中,排名前十的应用平均能够保持的时间只有一个月左右。

为了说明老式的瀑布方法,回想一下你第一次学习驾驶。起先,你专注于每个独立的层面,使用一套方法论的过程:你上车;系上安全带;调整座椅、镜子,控制方向盘;发动汽车,将你的手放在 10 点和 2 点钟的方向,等等。完成一个换车道一样简单的任务需要付出艰苦的努力,以一个特定的顺序执行多个步骤。

DevOps,正好相反,是在你有了几年的经验之后如何去驾驶的。一切都是靠直觉同时发生的,你可以不用过多的思考就很平滑的从 A 点移动到 B 点。

移动 app 的世界对越老式的 app 开发环境来说太快节奏了。DevOps 被设计用来快速交付有效、稳定的 app,而不需要增加资源。然而你不能像购买一件普通的商品或者服务一样去购买 DevOps。DevOps 是用来指导改变团队如何一起工作的文化和活动的。

不是只有像亚马逊和 Facebook 这样的大公司才拥抱 DevOps 文化;小的移动应用公司也在很好的使用。“缩短迭代周期,同时保持生产事故处于一个较低水平,以及满足顾客追求的整体故障成本。”来自移动产品代理 Reinvently的工程部的负责人,Oleg Reshetnyak 说道。

DevOps: 不是如果,而是什么时候

在今天的快节奏的商业环境中,选在了 DevOps 就像是选择了呼吸:要么去做要么就死亡

根据美国小企业管理局的报道,现在只有 16% 的公司能够持续一代人的时间。不采用 DevOps 的移动应用公司将冒着逐渐走向灭绝的风险。而且,同样的研究表明采用 DevOps 的公司组织可能能够获得两倍的盈利能力、生产目标以及市场份额。

更快速、更安全的革新需要做到三点:云、自动化和 DevOps。根据你对 DevOps 的定义的不同,这三个要点之间的界限是不清晰的。然而,有一点是确定的:DevOps 围绕着更快、更少风险地交付高质量的软件的共同目标将组织内的每个人都统一起来。


via: https://opensource.com/article/18/2/devops-delivers-cool-apps-users

作者:Stanislav Ivaschenko 译者:FelixYFZ 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出