梅宏院士:软件定义的未来 ——万物皆可互联,一切均可编程 - CNCC 2017

感谢大会给的这个机会!近几年中,我在不同的场合也做了很多不同的报告,但是这几年都是被动地被拉去讲大数据,后来想想,差点把自己的主业忘了。现在软件很重要,我们每天的生活都离不开软件,可能大多数人每天早上起床的第一件事儿就是打开某个APP。所以我今年给自己订了一个小目标,但凡有机会做报告,我就只讲软件,也是为本行业的人呼吁一下,所以我今天讲的题目很大,软件定义一切。

无处不在的软件

“软件定义一切”并不是我说的,我要是这么说可能把咱们今天在座的很多同行都给得罪了。我是想借这个题目讲一讲软件的三个阶段。第一个题目我想大家都认可,软件已经无处不在,第二个题目是软件定义的时代。我们正在进入一个新的时代,刚刚过去的十九大讲是中华民族复兴的时代,我是从信息技术对人类社会的改造这个角度来谈这个新时代,不同的人从不同的角度也给了这个时代不同的赋名。从基础设施视角来看,这是一个互联网+时代;从计算模式视角来看,这是一个云计算时代;从信息资源视角来看,这是一个大数据时代;从信息应用视角来看,这是智能化时代。我想说在这些里面有一项很重要的技术,那就是软件。某种意义上来说,我们这个时代就是一个软件定义的时代。

梅宏院士:软件定义的未来——万物皆可互联,一切均可编程

软件产业呈持续增长态势。从国内来看,国家工信部公布的2012年到2016年的五年数据中,软件和信息技术服务业始终保持高增长,在电子信息行业的比重也在不断上升。2008年金融危机开始以后,很多行业都在下滑,而信息技术行业还在保持增长,而软件行业的增长又是远远高于信息技术其他的比重。从国际上来看,全球有19个国家软件支出占国内生产总值的比重超过0.5%,其中美国已经超过1%。这个产业规模一直在保持增长。第二个软件从业的人数,2014年全球ICT技术工人约为2900万人,其中专业软件开发人员约1100万人。国家工信部给出的近五年数据中,软件从业人数也在逐年增长,2016年达到576万人。但如果换一个视角,从开源社区来看,比如程序员经常去的一个软件问答网站stack overflow,注册3200万人,其中超过2500万人是多次访问。再比如CSDN,注册用户达2500万,活跃用户超过800万。它们普遍都要比工信部公布的数据高,这说明和软件相关的从业人数有很多。

回顾过去计算机软件发展,我认为大概可以分为三个阶段。第一个是1946到1975中期,是软硬一体化阶段。第二个是1975年以后,软件产品化、产业化阶段;第三个是1995年以后,软件的网络化、服务化阶段。

梅宏院士:软件定义的未来——万物皆可互联,一切均可编程

我想讲一讲这三个阶段的大体特征。在软硬一体化阶段,也就是计算机刚出现的时候,是没有软件的,都是以程序实现的,大体上展现方式的是机器语言,汇编语言。早期应用领域以破解密码,军事领域的计算为主。60年代初期,开始出现“软件”一词,融合程序和文档为一体,作为独立的形态从硬件分离出来,以IBM 360系列机为代表(尽管还是和硬件捆版一起销售),也逐渐形成了计算机学科和程序员行业。它的展性形式是高级程序语言+文档,应用领域主要是商业计算和其他科学计算领域。软件产品化、产业化阶段,以Microsoft和Oracle的出现,标志着软件开始成为一个独立产业。PC的广泛应用和软件产品化催生了人类历史上信息化的第一波浪潮,其主要特征即以单机应用为特征的数字化阶段。紧接着就出现了办公软件,彻底改变了人类传统的办公行为,微软office迄今依然是微软标志性产品之一。九十年代中期开始 ,软件进入网络化,服务化阶段。互联网推动了软件从单机向网络计算环境的延伸,带来了信息化的第二波浪潮 ,其基本特征是以联网应用为特征的网络化阶段。


数据可视化的方法、工具和应用 - 林骥

1. 数据可视化简介

数据可视化,是指用图形的方式来展现数据,从而更加清晰有效地传递信息,主要方法包括图表类型的选择和图表设计的准则。随着互联网的广泛应用,我们的工作和生活等各个方面,每时每刻都在产生大量的数据,也就是所谓的「大数据时代」,发展的趋势是人们越来越喜欢用数据说话。

数据可视化作为一种有效传递信息的手段,被越来越广泛地应用到很多领域。一个比较典型的案例,是淘宝双十一的数据可视化,在一块大屏幕上实时动态展示交易数据,使用的数据可视化工具是阿里云出品的 DataV,体现了阿里巴巴用数据驱动运营的一种探索。

如果想要让数据发挥更大的价值,那么合理地运用数据可视化的方法和工具就显得特别重要。

2. 数据可视化的图表选择

根据数据分析的实际情况,需要有针对性地选择合适的数据可视化方法。但是可视化的图表花样繁多,我们应该如何选择并设计你的图表呢?下面这张图最早是从刘万祥老师的公众号「Excel图表之道」上发现的,原图来自于 http://chart.guide,我做了一点修改。

img

本文将把它拆分为 8 个部分,逐一进行介绍。

(1) 当你需要对不同的类别进行比较时,有很多种图形可供选择,其中条形图是最常见的,垂直瀑布图适合用来比较并分析各个组成部分的变化情况,词云图适用于大量文本的分析和比较。

img

(2) 当你想要直观反映关键业绩指标随时间的变化情况时,用柱形图或曲线图是比较好的选择。建议不要用面积图,因为可视化的目标应该不仅仅只是为了视觉上的好看,准确有效地传递信息更加重要。


为 Centos 7 设置静态IP

  1. 编辑 ifcfg-eth0

    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    
  2. 增加/修改设置

    BOOTPROTO="static" # dhcp改为static 
    ONBOOT="yes" # 开机启用本配置
    IPADDR=192.168.7.106 # 静态IP
    GATEWAY=192.168.7.1 # 默认网关
    NETMASK=255.255.255.0 # 子网掩码
    DNS1=192.168.7.1 # DNS 配置
    
  3. 重启网络

    service network restart
    

kubernetes 限制磁盘IO

磁盘 IO 限制 在 IaaS 层是一个基本功能,在 docker 中也有实现。

参考这篇文章: 《限制容器的_Block_IO_每天5分钟玩转_Docker_容器技术 - IBM developerworks》

Block IO 指的是磁盘的读写,实际上 docker 是通过 cgroups 做了限制,通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。 --device-read-bps,限制读某个设备的 bps。 --device-write-bps,限制写某个设备的 bps。 --device-read-iops,限制读某个设备的 iops。 --device-write-iops,限制写某个设备的 iops。

docker run -it --device-write-bps /dev/sda:30MB ubuntu /bin/bash

time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

不清楚是什么原因,kubernetes 一直未把 io 限速加入到系统功能中。社区中相关的 issue 和 pull request 已经多到不行了,例如:

然而一直未合并至主分支。

由于我使用的为 1.10 某版本的kubernetes,参考了这位朋友的提交,完成了对 block io 的支持 honglei24/kubernetes

修改完成代码之后根据之前 《kubernetes 的编译、打包和发布(v1.10)》,编译完成。

使用时按照代码也可以猜出来用法了:

以下注释表示限制磁盘写的速度为30M:

annotations: 
  BlkioDeviceWriteBps: '/dev/sda:31457280'

使用 deb 包安装 docker

手头有一个某云平台的虚拟机,很不幸无法使用docker官方的脚本安装docker:

curl -sSL https://get.docker.com/ | sh
usermod -aG docker $USER
systemctl enable docker
systemctl start docker

报错则是xxx链接超时。我使用的是debian系统,所以这一篇记录如何使用deb包安装docker。

查看系统版本

YUKI.N > lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.11 (stretch)
Release:        9.11
Codename:       stretch

进入下载页

进入到下载包页面 https://download.docker.com/linux/

点击进入 debian>dists>stretch 进入了这个连接地址 https://download.docker.com/linux/debian/dists/

选择一个比较新的版本

我选择的是 19.03

wget https://download.docker.com/linux/debian/dists/stretch/pool/stable/amd64/docker-ce_19.03.0~3-0~debian-stretch_amd64.deb

安装命令

sudo dpkg -i docker-ce*.deb
sudo apt-get -f install

安装完成后查看版本信息:

YUKI.N > docker version
Client: Docker Engine - Community
 Version:           19.03.2
 API version:       1.40
 Go version:        go1.12.8
 Git commit:        6a30dfca03
 Built:             Thu Aug 29 05:29:49 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.0
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       aeac9490dc
  Built:            Wed Jul 17 18:12:33 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

至此安装完成。


laravel 根据 postgresql jsonb 字段数组筛选数据行

这篇文章记录一下我如何解决在 laravel 中使用jsonb 数组筛选数据行。

背景

先描述一下背景,数据库中我们有一个jsonb字段data,这个字段里存的是数组。在 laravel 数据表中定义如下:

        Schema::create('xxx', function (Blueprint $table) {
            $table->uuid('uuid');
            $table->jsonb("data")->nullable(); // 
            ... ...
        });

在类中定义如下:


    protected $casts = [
        'data' => 'array',
    ];

在data中我们使用数组存了一组无序的数据,例如:

[ a,b,c ]

初始想法

这种情况和我们使用 jsonb 存对象,根据对象取记录行是不一样的。

先来看下常规的json对象如何筛选记录行的。如果我们使用对象来存,可以很方便的达到我们的效果,例如:

if (XxxClass::where("data->id", $id)->where("data->name", $name)->count() == 0) {
}

数组无法使用这种方式取值,故而pass。

而laravel我也没有查到相关的办法解决。所以比较好的办法是自己写SQL语句查询。参考 postgresql 官方的文档:https://www.postgresql.org/docs/9.4/functions-json.html

很自然的我选择了 ?| 操作符进行筛选,并且成功了!

p1

具体 SQL 语句如下:

select * from "xxx" where "data" :: jsonb ?| ARRAY['b']

由此查到了相关的记录。

p1

困难初现

难题在于通过这种方式无法在 laravel 中使用:

p1

以下是错误提示:

p1

从错误提示里可以知道 被转义成了laravel eloquent 默认的 变量了。 但即使使用了转义符 \ 仍然是同样的错误。

为了更准确地定位问题,我用了下面的代码查看生成的sql语句是什么:

echo DB::select('select * from "xxx" where "data" :: jsonb ?| ARRAY[\'b\']')->toSql();

这个和我使用纯sql语句一毛一样。在此时我一度陷入了困境,便开始群聊和谷歌之旅。

定位问题

此时一位能力强悍的老同事,找到了一个issue,不过竟然是golang的框架 gorm 的讨论:Way to escape Question Mark in Raw Query? #533 - github

问题也就是:这是 postgresql 9.4 的一个系统bug,目前官方并没有解决办法。

绕过问题

虽然问题一时半会无法解决,但是社区里找到了绕过此问题的方法,那就是——不使用 ?| 操作符!

https://laravel.io/forum/01-25-2015-postgres-94-new-question-mark-operator-cant-be-used-in-eloquent-raw-queries

具体来说,是使用 @> 操作符替代 ?|操作符:

select * from "xxx" where "data" :: jsonb @> '["b"]'

至于这两个操作符具体实现和效率有何不同,就不太清楚了,不过已经能解决目前遇到的问题了。转换到 laravel 的实现,使用下面的代码:

DB::table('xxx')->whereRaw('"data" :: jsonb @> \'["'.$this->name.'"]\';')->get()

问题解决~