首页 文章 精选 留言 我的

精选列表

搜索[分库分表],共10000篇文章
优秀的个人博客,低调大师

5分钟掌握var,let和const异同

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/javascript-difference-between-var-let-and-const-ke 这个话题对于一些老鸟来说可能根本算不上疑问,但对于新手来说也许除了最常见的var之外,let和const较少使用的机会。 所以在本文中,我将会通过一些例子来为大家介绍如何在Javascript中灵活使用var、let和const这些关键字来定义变量,以及这些关键字它们之间有什么异同。 如果你懒得看下面的代码,那我可以先把概念结论说出: var定义的变量可被更改,如果不初始化而直接使用也不会报错 let定义的变量和var类似,但作用域在当前声明的范围内 const定义的变量只可初始化一次且作用域内不可被更改,使用前必须初始化 下面我将通过示例的形式来详细为大家介绍它们三者之间的异同: Var var用以声明一个变量,并且同时我们可以在声明语句中初始化所声明的变量。 例如: var a = 10; 变量的声明,会在代码被执行之前被处理。 用var声明的JavaScript变量,其可用范围在当前执行上下文。 在函数外声明的JavaScript变量,其作用范围是全局。 考虑以下代码片段: function nodeSimplified() { var a =10; console.log(a); // 输出 10 if(true) { var a=20; console.log(a); // 输出 20 } console.log(a); // 输出 20 } 在上面的代码中,你可以发现,当变量a在if代码段里被更新时,它的值被全局更新了,因此在经过了if代码后,被更新的值仍然被保留着。这与其他语言中的全局变量有点类似。但是,在使用这个功能时要非常小心,因为它有可能会覆盖一个已有的值。 let let语句在一个块级范围里声明一个局部变量。和var类似,我们可以在声明时初始化它的值。 例如: let a = 10; 这个语句允许你创建一个变量,使它的作用范围被限制在它所在的代码块。 它和Java、C#等其他语言的变量类似。 考虑下面的代码片段: function nodeSimplified() { let a =10; console.log(a); // output 10 if(true) { let a=20; console.log(a); // output 20 } console.log(a); // output 10 } 它和大多数语言中我们所见的表现行为是一致的。 function nodeSimplified() { let a =10; let a =20; // 抛出语法错误 console.log(a); } 错误信息:"未捕获的异常:标识符'a'已经被声明过。"但如果使用var就没事: function nodeSimplified() { var a =10; var a =20; console.log(a); // 输出 20 } 使用let语句,可以很好的维护变量的作用范围。当使用内部函数时,let语句让你的代码更整洁。 我希望上面的例子能帮你更好地理解var和let。如果有任何疑问,请在评论区留言。 const const语言中的变量只能被赋值一次,然后就不能在被赋值。const语句的作用范围和let语句一样。 例如: const a = 10; function nodeSimplified() { const MY_VARIABLE =10; console.log(MY_VARIABLE); // 输出 10 } 照例,命名规范指出我们应该用大写字母声明常量。当然,const a = 10在上面的代码中会的起到相同的作用。为了让代码长期可维护,命名规范还是值得遵守的。 问题:如果给一个const变量重新赋值会发生什么?考虑下面的代码: function nodeSimplified() { const MY_VARIABLE =10; console.log(MY_VARIABLE); // 输出 10 MY_VARIABLE =20; // 抛出类型错误 console.log(MY_VARIABLE); } 错误信息:"未捕获的类型错误:给const变量赋值"。 当我们尝试给已有的const变量赋值时,这段代码会抛出一个错误。 介绍就到此结束,希望这篇短小精悍的文章能够帮助到各位更好的理解在Javascript中声明变量时使用不同关键字上到底有何异同。

优秀的个人博客,低调大师

docker安装gitlab只需要3分钟

docker安装gitlab sudo docker run --detach --hostname 127.0.0.1 --publish 1443:443 --publish 180:80 --publish 122:22 --name gitlab --volume /data/gitlab/config:/etc/gitlab --volume /data/gitlab/logs:/var/log/gitlab --volume /data/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest centos 安装 git [root@wei-BaiDu soft]# yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel 已加载插件:langpacks, versionlock baidu-bcm | 2.5 kB 00:00:00 base | 3.6 kB 00:00:00 docker-ce-stable | 2.9 kB 00:00:00 epel | 4.7 kB 00:00:00 extras | 3.4 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/6): baidu-bcm/primary_db | 18 kB 00:00:00 (2/6): extras/7/x86_64/primary_db | 185 kB 00:00:00 (3/6): epel/x86_64/updateinfo | 917 kB 00:00:00 (4/6): epel/x86_64/primary_db | 6.3 MB 00:00:00 (5/6): docker-ce-stable/x86_64/primary_db | 12 kB 00:00:00 (6/6): updates/7/x86_64/primary_db | 6.9 MB 00:00:00 正在解决依赖关系 --> 正在检查事务 ---> 软件包 expat-devel.x86_64.0.2.1.0-10.el7_3 将被 安装 ---> 软件包 gettext-devel.x86_64.0.0.19.8.1-2.el7 将被 安装 --> 正在处理依赖关系 gettext-common-devel = 0.19.8.1-2.el7,它被软件包 gettext-devel-0.19.8.1-2.el7.x86_64 需要 --> 正在处理依赖关系 git,它被软件包 gettext-devel-0.19.8.1-2.el7.x86_64 需要 ---> 软件包 libcurl-devel.x86_64.0.7.29.0-42.el7_4.1 将被 安装 base/7/x86_64/filelists_db | 6.7 MB 00:00:00 updates/7/x86_64/filelists_db | 4.2 MB 00:00:00 ---> 软件包 openssl-devel.x86_64.1.1.0.2k-8.el7 将被 安装 --> 正在处理依赖关系 krb5-devel(x86-64),它被软件包 1:openssl-devel-1.0.2k-8.el7.x86_64 需要 ---> 软件包 zlib-devel.x86_64.0.1.2.7-17.el7 将被 安装 --> 正在检查事务 ---> 软件包 gettext-common-devel.noarch.0.0.19.8.1-2.el7 将被 安装 ---> 软件包 git.x86_64.0.1.8.3.1-12.el7_4 将被 安装 --> 正在处理依赖关系 perl-Git = 1.8.3.1-12.el7_4,它被软件包 git-1.8.3.1-12.el7_4.x86_64 需要 --> 正在处理依赖关系 perl(Term::ReadKey),它被软件包 git-1.8.3.1-12.el7_4.x86_64 需要 --> 正在处理依赖关系 perl(Git),它被软件包 git-1.8.3.1-12.el7_4.x86_64 需要 --> 正在处理依赖关系 perl(Error),它被软件包 git-1.8.3.1-12.el7_4.x86_64 需要 --> 正在处理依赖关系 libgnome-keyring.so.0()(64bit),它被软件包 git-1.8.3.1-12.el7_4.x86_64 需要 ---> 软件包 krb5-devel.x86_64.0.1.15.1-8.el7 将被 安装 --> 正在处理依赖关系 libkadm5(x86-64) = 1.15.1-8.el7,它被软件包 krb5-devel-1.15.1-8.el7.x86_64 需要 --> 正在处理依赖关系 libverto-devel,它被软件包 krb5-devel-1.15.1-8.el7.x86_64 需要 --> 正在处理依赖关系 libselinux-devel,它被软件包 krb5-devel-1.15.1-8.el7.x86_64 需要 --> 正在处理依赖关系 libcom_err-devel,它被软件包 krb5-devel-1.15.1-8.el7.x86_64 需要 --> 正在处理依赖关系 keyutils-libs-devel,它被软件包 krb5-devel-1.15.1-8.el7.x86_64 需要 --> 正在检查事务 ---> 软件包 keyutils-libs-devel.x86_64.0.1.5.8-3.el7 将被 安装 ---> 软件包 libcom_err-devel.x86_64.0.1.42.9-10.el7 将被 安装 ---> 软件包 libgnome-keyring.x86_64.0.3.12.0-1.el7 将被 安装 ---> 软件包 libkadm5.x86_64.0.1.15.1-8.el7 将被 安装 ---> 软件包 libselinux-devel.x86_64.0.2.5-11.el7 将被 安装 --> 正在处理依赖关系 libsepol-devel(x86-64) >= 2.5-6,它被软件包 libselinux-devel-2.5-11.el7.x86_64 需要 --> 正在处理依赖关系 pkgconfig(libsepol),它被软件包 libselinux-devel-2.5-11.el7.x86_64 需要 --> 正在处理依赖关系 pkgconfig(libpcre),它被软件包 libselinux-devel-2.5-11.el7.x86_64 需要 ---> 软件包 libverto-devel.x86_64.0.0.2.5-4.el7 将被 安装 ---> 软件包 perl-Error.noarch.1.0.17020-2.el7 将被 安装 ---> 软件包 perl-Git.noarch.0.1.8.3.1-12.el7_4 将被 安装 ---> 软件包 perl-TermReadKey.x86_64.0.2.30-20.el7 将被 安装 --> 正在检查事务 ---> 软件包 libsepol-devel.x86_64.0.2.5-6.el7 将被 安装 ---> 软件包 pcre-devel.x86_64.0.8.32-17.el7 将被 安装 --> 解决依赖关系完成 依赖关系解决 ======================================================================================================================= Package 架构 版本 源 大小 ======================================================================================================================= 正在安装: expat-devel x86_64 2.1.0-10.el7_3 base 57 k gettext-devel x86_64 0.19.8.1-2.el7 base 320 k libcurl-devel x86_64 7.29.0-42.el7_4.1 updates 300 k openssl-devel x86_64 1:1.0.2k-8.el7 base 1.5 M zlib-devel x86_64 1.2.7-17.el7 base 50 k 为依赖而安装: gettext-common-devel noarch 0.19.8.1-2.el7 base 410 k git x86_64 1.8.3.1-12.el7_4 updates 4.4 M keyutils-libs-devel x86_64 1.5.8-3.el7 base 37 k krb5-devel x86_64 1.15.1-8.el7 base 266 k libcom_err-devel x86_64 1.42.9-10.el7 base 31 k libgnome-keyring x86_64 3.12.0-1.el7 base 109 k libkadm5 x86_64 1.15.1-8.el7 base 174 k libselinux-devel x86_64 2.5-11.el7 base 186 k libsepol-devel x86_64 2.5-6.el7 base 74 k libverto-devel x86_64 0.2.5-4.el7 base 12 k pcre-devel x86_64 8.32-17.el7 base 480 k perl-Error noarch 1:0.17020-2.el7 base 32 k perl-Git noarch 1.8.3.1-12.el7_4 updates 53 k perl-TermReadKey x86_64 2.30-20.el7 base 31 k 事务概要 安装 5 软件包 (+14 依赖软件包) 总下载量:8.5 M 安装大小:31 M Is this ok [y/d/N]: y Downloading packages: (1/19): expat-devel-2.1.0-10.el7_3.x86_64.rpm | 57 kB 00:00:00 (2/19): gettext-common-devel-0.19.8.1-2.el7.noarch.rpm | 410 kB 00:00:00 (3/19): gettext-devel-0.19.8.1-2.el7.x86_64.rpm | 320 kB 00:00:00 (4/19): keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm | 37 kB 00:00:00 (5/19): libcom_err-devel-1.42.9-10.el7.x86_64.rpm | 31 kB 00:00:00 (6/19): krb5-devel-1.15.1-8.el7.x86_64.rpm | 266 kB 00:00:00 (7/19): libgnome-keyring-3.12.0-1.el7.x86_64.rpm | 109 kB 00:00:00 (8/19): libkadm5-1.15.1-8.el7.x86_64.rpm | 174 kB 00:00:00 (9/19): libsepol-devel-2.5-6.el7.x86_64.rpm | 74 kB 00:00:00 (10/19): libcurl-devel-7.29.0-42.el7_4.1.x86_64.rpm | 300 kB 00:00:00 (11/19): libselinux-devel-2.5-11.el7.x86_64.rpm | 186 kB 00:00:00 (12/19): libverto-devel-0.2.5-4.el7.x86_64.rpm | 12 kB 00:00:00 (13/19): git-1.8.3.1-12.el7_4.x86_64.rpm | 4.4 MB 00:00:00 (14/19): openssl-devel-1.0.2k-8.el7.x86_64.rpm | 1.5 MB 00:00:00 (15/19): pcre-devel-8.32-17.el7.x86_64.rpm | 480 kB 00:00:00 (16/19): perl-Error-0.17020-2.el7.noarch.rpm | 32 kB 00:00:00 (17/19): perl-TermReadKey-2.30-20.el7.x86_64.rpm | 31 kB 00:00:00 (18/19): zlib-devel-1.2.7-17.el7.x86_64.rpm | 50 kB 00:00:00 (19/19): perl-Git-1.8.3.1-12.el7_4.noarch.rpm | 53 kB 00:00:00 总计 17 MB/s | 8.5 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction 正在安装 : 1:perl-Error-0.17020-2.el7.noarch 1/19 正在安装 : libkadm5-1.15.1-8.el7.x86_64 2/19 正在安装 : gettext-common-devel-0.19.8.1-2.el7.noarch 3/19 正在安装 : libsepol-devel-2.5-6.el7.x86_64 4/19 正在安装 : keyutils-libs-devel-1.5.8-3.el7.x86_64 5/19 正在安装 : zlib-devel-1.2.7-17.el7.x86_64 6/19 正在安装 : pcre-devel-8.32-17.el7.x86_64 7/19 正在安装 : libselinux-devel-2.5-11.el7.x86_64 8/19 正在安装 : perl-TermReadKey-2.30-20.el7.x86_64 9/19 正在安装 : libverto-devel-0.2.5-4.el7.x86_64 10/19 正在安装 : libgnome-keyring-3.12.0-1.el7.x86_64 11/19 正在安装 : perl-Git-1.8.3.1-12.el7_4.noarch 12/19 正在安装 : git-1.8.3.1-12.el7_4.x86_64 13/19 正在安装 : libcom_err-devel-1.42.9-10.el7.x86_64 14/19 正在安装 : krb5-devel-1.15.1-8.el7.x86_64 15/19 正在安装 : 1:openssl-devel-1.0.2k-8.el7.x86_64 16/19 正在安装 : gettext-devel-0.19.8.1-2.el7.x86_64 17/19 正在安装 : expat-devel-2.1.0-10.el7_3.x86_64 18/19 正在安装 : libcurl-devel-7.29.0-42.el7_4.1.x86_64 19/19 验证中 : gettext-devel-0.19.8.1-2.el7.x86_64 1/19 验证中 : libcom_err-devel-1.42.9-10.el7.x86_64 2/19 验证中 : libgnome-keyring-3.12.0-1.el7.x86_64 3/19 验证中 : perl-Git-1.8.3.1-12.el7_4.noarch 4/19 验证中 : libverto-devel-0.2.5-4.el7.x86_64 5/19 验证中 : perl-TermReadKey-2.30-20.el7.x86_64 6/19 验证中 : krb5-devel-1.15.1-8.el7.x86_64 7/19 验证中 : 1:perl-Error-0.17020-2.el7.noarch 8/19 验证中 : libselinux-devel-2.5-11.el7.x86_64 9/19 验证中 : pcre-devel-8.32-17.el7.x86_64 10/19 验证中 : zlib-devel-1.2.7-17.el7.x86_64 11/19 验证中 : keyutils-libs-devel-1.5.8-3.el7.x86_64 12/19 验证中 : libsepol-devel-2.5-6.el7.x86_64 13/19 验证中 : git-1.8.3.1-12.el7_4.x86_64 14/19 验证中 : 1:openssl-devel-1.0.2k-8.el7.x86_64 15/19 验证中 : libcurl-devel-7.29.0-42.el7_4.1.x86_64 16/19 验证中 : gettext-common-devel-0.19.8.1-2.el7.noarch 17/19 验证中 : expat-devel-2.1.0-10.el7_3.x86_64 18/19 验证中 : libkadm5-1.15.1-8.el7.x86_64 19/19 已安装: expat-devel.x86_64 0:2.1.0-10.el7_3 gettext-devel.x86_64 0:0.19.8.1-2.el7 libcurl-devel.x86_64 0:7.29.0-42.el7_4.1 openssl-devel.x86_64 1:1.0.2k-8.el7 zlib-devel.x86_64 0:1.2.7-17.el7 作为依赖被安装: gettext-common-devel.noarch 0:0.19.8.1-2.el7 git.x86_64 0:1.8.3.1-12.el7_4 keyutils-libs-devel.x86_64 0:1.5.8-3.el7 krb5-devel.x86_64 0:1.15.1-8.el7 libcom_err-devel.x86_64 0:1.42.9-10.el7 libgnome-keyring.x86_64 0:3.12.0-1.el7 libkadm5.x86_64 0:1.15.1-8.el7 libselinux-devel.x86_64 0:2.5-11.el7 libsepol-devel.x86_64 0:2.5-6.el7 libverto-devel.x86_64 0:0.2.5-4.el7 pcre-devel.x86_64 0:8.32-17.el7 perl-Error.noarch 1:0.17020-2.el7 perl-Git.noarch 0:1.8.3.1-12.el7_4 perl-TermReadKey.x86_64 0:2.30-20.el7 完毕! [root@wei-BaiDu soft]# yum -y install git-core 已加载插件:langpacks, versionlock 软件包 git-1.8.3.1-12.el7_4.x86_64 已安装并且是最新版本 无须任何处理 [root@wei-BaiDu soft]# git --version git version 1.8.3.1 [root@wei-BaiDu soft]# 启动报错 http://www.runoob.com/git/git-server.html

优秀的个人博客,低调大师

Git安装及配置5分钟快速教程

Git是什么 Git是一款免费、开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 与常用的版本控制工具CVS、Subversion等不同的是它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。Git的速度很快,最为出色的是它的合并跟踪的能力。 Git当初是Linus Torvalds为了帮助管理Linux内核源码替换BitKeeper 而开发的一个开放源码的版本控制软件。 Git安装 安装地址: https://git-scm.com/downloads 可以在Mac OS X,Windows,Linux,Solaris这4个平台上进行安装。 安装过程略。 Git配置 配置Git上个人的用户名称和电子邮件地址,用来记录提交人的信息。 $ git config --global user.name "your name" $ git config --global user.email "your_email@youremail.com" --global:表示全局配置,配置文件用户主目录,如C:\Users\Administrator\.gitconfig,如果没有这个选项只针对目前项目生效,配置文件为项目下的.git/config`。 推荐阅读 去BAT面试完的Mysql面试题总结(55道,带完整答案) 阿里高级Java面试题(首发,70道,带详细答案) 2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案 Spring面试题(70道,史上最全) 通往大神之路,百度Java面试题前200页。 分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。

优秀的个人博客,低调大师

蓝牙、Wifi、ZigBee 能否三分“物联”天下?

中国的物联网市场究竟有多大?仅就市场规模而言,在2012年,我国的物联网市场规模就已达3650亿元,而据多家第三方机构预测,2015年我国 物联网市场规模将突破7500亿元,未来5年内,市场规模更是有望突破万亿元大关,未来物联网产业的年复合增长率超过30%,物联网前景可谓无可限量! 何为物联网?物联网是指通过射频识别、红外感应器、全球定位系统、激光扫描器等信息传感设备,按约定的协议,把任何物品与互联网相连接,进行信息交 换和通信,以实现智能化识别、定位、跟踪、监控和管理的一种网络概念,在此,我们可以将其简单的理解为通过物与物的联接来实现各种不同功能的应用。 那么物与物之间是通过哪些方式来进行联接的呢?两种方式,其一是有线联接方式,比如通过网线将你的电脑接入互联网或者通过同轴电缆将摄像机接入监控平台等;其二是无线联接方式,比如你的手机可通过无线WIFI实现上网等。 有线联接的优势主要体现在稳定性、可靠性与传输速度上,但由于其采用了实体的联接方式,便利性与实用性是其致命伤。随着无线技术在稳定性、可靠性与 速度上的进化,在未来的物联网应用中,应该说留给有线联接方式的发展空间已不大(当然也不会消失)。而在当下的物联网应用中,无线传输技术可谓众多,但细 数下来,笔者以为应用范围最广且最具潜力的无非是蓝牙、Wifi与ZigBee三种,这三种无线传输技术在物联网应用中上演着三国杀的大戏,那么究竟谁将 一统物“联”天下? 三国杀之曹魏:WIFI WIFI无线技术在当下的应用可谓极其广泛,其可将个人电脑、路由器、手持设备等终端以无线方式进行互相连接,WIFI是一种高频无线电信号,它拥有最为广泛的用户与群众基础,就像三国时代的曹魏,人多势众,实力雄厚,来势汹汹。 在技术上,WIFI的主要优势体现在传输速度与传输距离上,其最大传输距离可达300m,最大传输速度可达300Mbps,弱点则体现在功耗上,其最大功耗为50mA。 三国杀之蜀汉:蓝牙 尽管在手机及电脑领域中,蓝牙的应用并不普遍,几乎都快被人遗忘,但就像三国时代的蜀汉一样,蓝牙的血统高贵,默默无闻却从不放弃,不断地开疆拓 土,如今可谓有所成,由1.0版本发展到当下最新的4.2版本,功能也越来越强大,其中4.2版本中,蓝牙大大加强了物联网应用特性,可实现IP联接及网 关设置等诸多新特性。 跟WIFI相比,蓝牙的优势主要体现在功耗及安全性上,相对WIFI最大50mA的功耗,蓝牙最大20mA的功耗要小得多,但在传输速度与距离上的劣势也较明显,其最大传输速度与最远传输距离分别为1Mbps及100m。 三国杀之东吴:ZigBee 相对WIFI与蓝牙而言,ZigBee可算新贵了,这个新贵风度翩翩,前途无量,就像三国杀中的东吴一般年轻有为、野心勃勃!ZigBee作为一种无线通讯技术,目前其主要应用在智能家居领域,与众多的智能家居设备商有着良好的合作关系。 作为一种短距离的无线通讯技术,ZigBee的优势体现在低复杂度、自组织、高安全性、低功耗上,此外ZigBee还具备组网和路由特性,可以方便地嵌入到各种设备中,在功耗表现上,ZigBee在三者中表现最好,安全性则在WIFI与蓝牙之间。 谁将一统物“联”天下? 由此可见,蓝牙、Wifi与ZigBee这三种无线传输技术依据各自在技术上的优势,从而在物联网的不同应用中发挥所长,但它们彼此之间的竞争关系 却是毋容置疑的,正所谓天下大势,分久必合!那么在蓝牙、Wifi与ZigBee中,哪种无线传输技术将一统物“联”天下?抑或是还会出现第四种无线技术 参与瓜分天下?国内物联网巨头们最近又有哪些新动向? 原文发布时间为:2015年09月01日 本文作者:RFID世界网 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

一分钟带你读懂“云存储”

云存储不是存储,而是服务,使用者使用云存储,并不是使用某一个存储设备,而是使用整个云存储系统带来的一种数据访问服务,云存储的核心是应用软件与存储设备相结合,通过应用软件来实现存储设备向存储服务的转变。 云存储时代来临 过去十几年间,中国的经济、科技实力进步明显,众多科技热词都随着这股“洪流”奔涌出来,云存储就是其中之一。 对于非行业人士,听闻大数据、云存储这类字眼,便不由的打个“寒颤”,顿感虚无,但其实不然,云存储作为新时代的科技产品代表,其具有相当强的实用价值,它集成各种存储设备至一个平台,为人们服务;值得一提的是,它提供的还是多样化且定制化的服务,因此,客户选择它也不仅仅是存储需求的服务,更多的是其中以客户为中心的随时可变的多样化的数据服务。 云存储的发展轨迹 据度娘介绍,云存储是在云计算(cloudcomputing)概念上延伸和发展出来的一个新的概念,是一种新兴的网络存储技术,是指通过集群应用、网络技术或分布式文件系统等功能,将网络中大量各种不同类型的存储设备通过应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。当云计算系统运算和处理的核心是大量数据的存储和管理时,云计算系统中就需要配置大量的存储设备,那么云计算系统就转变成为一个云存储系统,所以云存储是一个以数据存储和管理为核心的云计算系统。简单来说,云存储就是将储存资源放到云上供人存取的一种新兴方案。使用者可以在任何时间、任何地方,透过任何可连网的装置连接到云上方便地存取数据。 总的来说,云存储是一种服务,是一种以计算机科学为载体的新兴服务,它可以是一个设备、一个工具、一个网络接口等等,它的每个部分都可利用存储作为平台来进行其他的数据访问;另外,云存储还可看做是服务器与存储设备的叠加,云技术可以大大减少服务器数量、大幅度减少数据传输环节、降低系统建设成本,提高工作效率,保证系统的稳定运行。 云存储的结构模型 云存储的整体架构也与普通设备大不相同,其不仅仅是单个的硬件组成,而是存在多个系统分布。 一、存储层 这是在云存储系统中最基础的部分,包含很多存储设备,利用互联网技术将这些不同的存储设备连接起来,构建成存储设备的管理系统;存储设备之上是一个统一存储设备管理系统,可以实现存储设备的逻辑虚拟化管理、多链路冗余管理,以及硬件设备的状态监控和故障维护。另外,该系统还可利用系统中的模块对设备进行监控和管理。 二、基础管理层 基础管理层是云存储最核心的部分,它在存储层之上,也是最复杂的部分,这个管理层利用集群分布的文件系统,实现存储设备之间的多重工作,使得存储设备可以提供新的服务,提高数据访问的可能性,保证数据的安全性;同时,通过各种技术和措施可以保证云存储中的数据不会丢失,保证云存储自身的安全和稳定。 三、应用接口层 应用接口层是云存储最灵活多变的部分。不同的不同的云存储运营单位可以根据实际业务类型,开发不同的应用服务接口,为用户提供不同的服务。 四、访问层 任何一个授权用户都可以通过标准的公用应用接口来登录云存储系统,享受云存储服务。云存储运营单位不同,云存储提供的访问类型和访问手段也不同。 云存储的优劣所在 云存储是一种功能强大、灵活多变的网络系统,首先其支持多种设备同时为一个客户服务,任何被授权的用户都可利用一个简单的网址就可登陆其指定的系统,尽享云服务;其次云存储的容量不再受到单一限制而是根据客户的需求扩大其容量,在后台进行设备维修和升级时也不会影响到客户的存储内容;再者,使用云存储还可提高资源利用率,将数据集中起来,用户可以在任何地点,依靠单机或是移动设备随时访问数据,实现网内资源共享和协同工作,减少了传统的资源交换,提高资源的利用率;另外大大降低,有效减少移动存储设备的使用,降低了企业成本,最后也是最重要的一点是数据不会丢失。 但,需要注意的是,云存储的顺利推行目前也存在着很多问题和挑战,安全问题是目前最大的一个困扰,因为其接口的公用化导致授权用户都可以对其数据访问,这是其便利的一个因素但同时是其最致命的地方,如果是数据在传输的过程中被拦截的话,就会造成数据泄露,虽然目前很多云存储都采用了加密的手段,但因为增加了访问的关卡,无疑又造成了访问的繁琐性,访问的速度也是目前云服务无法突破的一个瓶颈,另外,数据的所有权也是云存储的一大问题。 用哲学的观点来看这个问题,问题和矛盾是永远存在的,技术的探索与使用虽然可能会发生各种各样的故障,但没有哪一项技术可以做到完美无瑕,我们必须接受这个事实,最好找出问题解决它。 云存储的交互应用 与存储联系最紧密的莫过于数据,我们无时无刻不在产生数据,而且这个量是非常巨大的,但我们鲜有人了解它,甚至知道它,这些数据产生出来需要我们去存储起来以便后期的挖掘与分析,而这,正好是这两者的交集所在。 有资料指出,现在创建的数字化信息量超过可用存储空间的35%,而且这一数字还在逐年上升,那么,今后该用什么“容器”去承载这些大的可怕的数据量呢?云存储将成主流。 每个技术的兴起总是由一个巨无霸企业牵头而且,这在众多科技热词身上都得以体现,当然,云存储也不例外,之前,两家IT巨头戴尔和惠普竞购3PAR直截了当的告诉人们,云存储是未来的发展趋势并将成为主流存储模型。 相关行业人士表示,与传统解决方案相比,云存储的成本和复杂性都降低了,并且能够更好的保护数据,即使办公室着火,异地备份的数据也会安然无忧,因此,这些优势让云存储很快就会受到众多企业的青睐,道理很简单,花了最少的钱得到最优的数据保障。 今后,云存储将会走向一个更加成熟的阶段,它所给予的服务将会更加全面和完善。除了数据圈,在每个领域都会有广泛的应用,虽然现在还面临很多问题,但在不久后,这块将是很多行业不可或缺的重要内容。 作者:佚名 来源:51CTO

优秀的个人博客,低调大师

2分钟读懂Hadoop和Spark的异同

谈到大数据,相信大家对Hadoop和Apache Spark这两个名字并不陌生。但我们往往对它们的理解只是提留在字面上,并没有对它们进行深入的思考,下面不妨跟我一块看下它们究竟有什么异同。 解决问题的层面不一样 首先,Hadoop和Apache Spark两者都是大数据框架,但是各自存在的目的不尽相同。Hadoop实质上更多是一个分布式数据基础设施: 它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,意味着您不需要购买和维护昂贵的服务器硬件。 同时,Hadoop还会索引和跟踪这些数据,让大数据处理和分析效率达到前所未有的高度。Spark,则是那么一个专门用来对那些分布式存储的大数据进行处理的工具,它并不会进行分布式数据的存储。 两者可合可分 Hadoop除了提供为大家所共识的HDFS分布式数据存储功能之外,还提供了叫做MapReduce的数据处理功能。所以这里我们完全可以抛开Spark,使用Hadoop自身的MapReduce来完成数据的处理。 相反,Spark也不是非要依附在Hadoop身上才能生存。但如上所述,毕竟它没有提供文件管理系统,所以,它必须和其他的分布式文件系统进行集成才能运作。这里我们可以选择Hadoop的HDFS,也可以选择其他的基于云的数据系统平台。但Spark默认来说还是被用在Hadoop上面的,毕竟,大家都认为它们的结合是最好的。 以下是从网上摘录的对MapReduce的最简洁明了的解析: 我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“Map”。我们人越多,数书就更快。 现在我们到一起,把所有人的统计数加在一起。这就是“Reduce”。 Spark数据处理速度秒杀MapReduce Spark因为其处理数据的方式不一样,会比MapReduce快上很多。MapReduce是分步对数据进行处理的: ”从集群中读取数据,进行一次处理,将结果写到集群,从集群中读取更新后的数据,进行下一次的处理,将结果写到集群,等等…“ Booz Allen Hamilton的数据科学家Kirk Borne如此解析。 反观Spark,它会在内存中以接近“实时”的时间完成所有的数据分析:“从集群中读取数据,完成所有必须的分析处理,将结果写回集群,完成,” Born说道。Spark的批处理速度比MapReduce快近10倍,内存中的数据分析速度则快近100倍。 如果需要处理的数据和结果需求大部分情况下是静态的,且你也有耐心等待批处理的完成的话,MapReduce的处理方式也是完全可以接受的。 但如果你需要对流数据进行分析,比如那些来自于工厂的传感器收集回来的数据,又或者说你的应用是需要多重数据处理的,那么你也许更应该使用Spark进行处理。 大部分机器学习算法都是需要多重数据处理的。此外,通常会用到Spark的应用场景有以下方面:实时的市场活动,在线产品推荐,网络安全分析,机器日记监控等。 灾难恢复 两者的灾难恢复方式迥异,但是都很不错。因为Hadoop将每次处理后的数据都写入到磁盘上,所以其天生就能很有弹性的对系统错误进行处理。 Spark的数据对象存储在分布于数据集群中的叫做弹性分布式数据集(RDD: Resilient Distributed Dataset)中。“这些数据对象既可以放在内存,也可以放在磁盘,所以RDD同样也可以提供完成的灾难恢复功能,”Borne指出。 本文转自d1net(转载)

优秀的个人博客,低调大师

30分钟搞定iOS自定义相机

最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究了一下相机的自定义。 相机属于系统硬件,这就需要我们来手动调用iPhone的相机硬件,分为以下步骤: 2016-03-30 上午9.51.09.png 1、首先声明以下对象 #import <AVFoundation/AVFoundation.h> //捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入) @property (nonatomic, strong) AVCaptureDevice *device; //AVCaptureDeviceInput 代表输入设备,他使用AVCaptureDevice 来初始化 @property (nonatomic, strong) AVCaptureDeviceInput *input; //输出图片 @property (nonatomic ,strong) AVCaptureStillImageOutput *imageOutput; //session:由他把输入输出结合在一起,并开始启动捕获设备(摄像头) @property (nonatomic, strong) AVCaptureSession *session; //图像预览层,实时显示捕获的图像 @property (nonatomic ,strong) AVCaptureVideoPreviewLayer *previewLayer; 2、初始化各个对象 - (void)cameraDistrict { // AVCaptureDevicePositionBack 后置摄像头 // AVCaptureDevicePositionFront 前置摄像头 self.device = [self cameraWithPosition:AVCaptureDevicePositionFront]; self.input = [[AVCaptureDeviceInput alloc] initWithDevice:self.device error:nil]; self.imageOutput = [[AVCaptureStillImageOutput alloc] init]; self.session = [[AVCaptureSession alloc] init]; // 拿到的图像的大小可以自行设定 // AVCaptureSessionPreset320x240 // AVCaptureSessionPreset352x288 // AVCaptureSessionPreset640x480 // AVCaptureSessionPreset960x540 // AVCaptureSessionPreset1280x720 // AVCaptureSessionPreset1920x1080 // AVCaptureSessionPreset3840x2160 self.session.sessionPreset = AVCaptureSessionPreset640x480; //输入输出设备结合 if ([self.session canAddInput:self.input]) { [self.session addInput:self.input]; } if ([self.session canAddOutput:self.imageOutput]) { [self.session addOutput:self.imageOutput]; } //预览层的生成 self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; self.previewLayer.frame = CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64); self.previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; [self.view.layer addSublayer:self.previewLayer]; //设备取景开始 [self.session startRunning]; if ([_device lockForConfiguration:nil]) { //自动闪光灯, if ([_device isFlashModeSupported:AVCaptureFlashModeAuto]) { [_device setFlashMode:AVCaptureFlashModeAuto]; } //自动白平衡,但是好像一直都进不去 if ([_device isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeAutoWhiteBalance]) { [_device setWhiteBalanceMode:AVCaptureWhiteBalanceModeAutoWhiteBalance]; } [_device unlockForConfiguration]; } } 根据前后置位置拿到相应的摄像头: - (AVCaptureDevice *)cameraWithPosition:(AVCaptureDevicePosition)position{ NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; for ( AVCaptureDevice *device in devices ) if ( device.position == position ){ return device; } return nil; } 3、拍照拿到相应图片: - (void)photoBtnDidClick { AVCaptureConnection *conntion = [self.imageOutput connectionWithMediaType:AVMediaTypeVideo]; if (!conntion) { NSLog(@"拍照失败!"); return; } [self.imageOutput captureStillImageAsynchronouslyFromConnection:conntion completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { if (imageDataSampleBuffer == nil) { return ; } NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; self.image = [UIImage imageWithData:imageData]; [self.session stopRunning]; [self.view addSubview:self.cameraImageView]; } 4、保存照片到相册: #pragma - 保存至相册 - (void)saveImageToPhotoAlbum:(UIImage*)savedImage { UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL); } // 指定回调方法 - (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo { NSString *msg = nil ; if(error != NULL){ msg = @"保存图片失败" ; }else{ msg = @"保存图片成功" ; } UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"保存图片结果提示" message:msg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; } 5、前后置摄像头的切换 - (void)changeCamera{ NSUInteger cameraCount = [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count]; if (cameraCount > 1) { NSError *error; //给摄像头的切换添加翻转动画 CATransition *animation = [CATransition animation]; animation.duration = .5f; animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; animation.type = @"oglFlip"; AVCaptureDevice *newCamera = nil; AVCaptureDeviceInput *newInput = nil; //拿到另外一个摄像头位置 AVCaptureDevicePosition position = [[_input device] position]; if (position == AVCaptureDevicePositionFront){ newCamera = [self cameraWithPosition:AVCaptureDevicePositionBack]; animation.subtype = kCATransitionFromLeft;//动画翻转方向 } else { newCamera = [self cameraWithPosition:AVCaptureDevicePositionFront]; animation.subtype = kCATransitionFromRight;//动画翻转方向 } //生成新的输入 newInput = [AVCaptureDeviceInput deviceInputWithDevice:newCamera error:nil]; [self.previewLayer addAnimation:animation forKey:nil]; if (newInput != nil) { [self.session beginConfiguration]; [self.session removeInput:self.input]; if ([self.session canAddInput:newInput]) { [self.session addInput:newInput]; self.input = newInput; } else { [self.session addInput:self.input]; } [self.session commitConfiguration]; } else if (error) { NSLog(@"toggle carema failed, error = %@", error); } } } 6、相机的其它参数设置 //AVCaptureFlashMode 闪光灯 //AVCaptureFocusMode 对焦 //AVCaptureExposureMode 曝光 //AVCaptureWhiteBalanceMode 白平衡 //闪光灯和白平衡可以在生成相机时候设置 //曝光要根据对焦点的光线状况而决定,所以和对焦一块写 //point为点击的位置 - (void)focusAtPoint:(CGPoint)point{ CGSize size = self.view.bounds.size; CGPoint focusPoint = CGPointMake( point.y /size.height ,1-point.x/size.width ); NSError *error; if ([self.device lockForConfiguration:&error]) { //对焦模式和对焦点 if ([self.device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) { [self.device setFocusPointOfInterest:focusPoint]; [self.device setFocusMode:AVCaptureFocusModeAutoFocus]; } //曝光模式和曝光点 if ([self.device isExposureModeSupported:AVCaptureExposureModeAutoExpose ]) { [self.device setExposurePointOfInterest:focusPoint]; [self.device setExposureMode:AVCaptureExposureModeAutoExpose]; } [self.device unlockForConfiguration]; //设置对焦动画 _focusView.center = point; _focusView.hidden = NO; [UIView animateWithDuration:0.3 animations:^{ _focusView.transform = CGAffineTransformMakeScale(1.25, 1.25); }completion:^(BOOL finished) { [UIView animateWithDuration:0.5 animations:^{ _focusView.transform = CGAffineTransformIdentity; } completion:^(BOOL finished) { _focusView.hidden = YES; }]; }]; } } 7、遇到的一些坑和解决办法 1) 前后置摄像头的切换 前后值不能切换,各种尝试找了半天没找到有原因。后来发现我在设置图片尺寸的时候设置为1080P [self.session canSetSessionPreset: AVCaptureSessionPreset1920x1080] ,前置摄像头并不支持这么大的尺寸,所以就不能切换前置摄像头。我验证了下 前置摄像头最高支持720P,720P以内可自由切换。 当然也可以在前后置摄像头切换的时候,根据前后摄像头来设置不同的尺寸,这里不在赘述。 2)焦点位置 CGPoint focusPoint = CGPointMake( point.y /size.height ,1-point.x/size.width ); setExposurePointOfInterest:focusPoint 函数后面Point取值范围是取景框左上角(0,0)到取景框右下角(1,1)之间。官方是这么写的: The value of this property is a CGPoint that determines the receiver's focus point of interest, if it has one. A value of (0,0) indicates that the camera should focus on the top left corner of the image, while a value of (1,1) indicates that it should focus on the bottom right. The default value is (0.5,0.5). 我也试了按这个来但位置就是不对,只能按上面的写法才可以。前面是点击位置的y/PreviewLayer的高度,后面是1-点击位置的x/PreviewLayer的宽度 3)对焦和曝光 我在设置对焦是 先设置了模式setFocusMode,后设置对焦位置,就会导致很奇怪的现象,对焦位置是你上次点击的位置。所以一定要先设置位置,再设置对焦模式。 曝光同上

优秀的个人博客,低调大师

一分钟了解阿里视频云

什么是阿里视频云? 阿里视频云提供一站式视频点播、直播、短视频、监控等服务,集内容采集、上传加速、存储录制、码转/截图/水印、鉴黄服务、CDN分发及播放器等功能,用户可以非常简单地借此开展自己的网络视频业务。用户可通过“海量存储、高效分发、极速网络”等强大服务,轻松坐享CCTV-5、新浪微博、知乎等量级的传播能力。 阿里视频云有什么优势呢? 1、 完善且易接入的产品及服务,提供从推流,视频云服务,到播放的全套技术方案。最快1天搭建起直播系统。2、 业内最低的播放卡顿率,流畅度98%。业内最低的直播时延。3、 依靠阿里云强大的CDN能力,提供500+国内和300+海外的直播节点覆盖全球主流国家4、 业界先进的窄带高清转码技术,在同等清晰度下,码率低20%以上。5、 成熟的解决方案覆盖几乎所有的直播应用场景,电商、娱乐、财经,在线教育、游

优秀的个人博客,低调大师

2分钟教你玩转Tengine编译安装部署

Tengine部分特性 nginx -m 查看所有已经加载的模块,static说明已经安装的,shared说明是动态安装的; nginx架构是模块化的,除了主模块,其他模块都需在安装时进行编译安装,也可在安装后进行编译安装; tengine完全兼容nginx的配置; tengine实现动态加载模块,不需重新编译,就可以实现安装新的模块。动态模块功能会被默认安装。而nginx不支持模块动态加载,需要编译重启; 首先下载tengine-2.2.0.tar.gz;下载链接:http://pan.baidu.com/s/1jI7cycm密码:ig6x #安装编译所需环境: yumgroupinstall"developmentTools""ServerPlatformDevelopment"-y #安装编译所需的扩展模块: yum-yinstallzlib-develpcre-developenssl-devel #注释 zlib-devel扩展模块:支持压缩 pcre-devel扩展模块:支持url重写,pool扩展 openssl-devel扩展模块:支持https协议 #查看编译所支持的模块(个别常用的): [root@mengtengine-2.2.0]#./configure--help|less --prefix=PATHsetinstallationprefix#指定安装路径 --sbin-path=PATHsetnginxbinarypathname#nginx二进制启动脚本路径 --conf-path=PATHsetnginx.confpathname#conf配置文件路径 --error-log-path=PATHseterrorlogpathname#错误日志路径 --pid-path=PATHsetnginx.pidpathname#pid存放路径 --lock-path=PATHsetnginx.lockpathname#锁文件存放路径 --without-httpdisableHTTPserver#提供http服务,默认开启 --without-http-cachedisableHTTPcache#提供http缓存服务,默认开启 --without-http_stub_status_moduledisablengx_http_stub_status_module#ngixn自带的状态页面,默认关闭 --with-http_gzip_static_moduleenablengx_http_gzip_static_module#压缩木块 编译安装tengine: [root@mengtengine-2.2.0]#./configure--prefix=/usr/local/nginx--sbin-path=/usr/local/nginx/sbin/nginx--conf-path=/usr/local/nginx/conf/nginx.conf--error-log-path=/usr/local/nginx/log/error.log--http-log-path=/usr/local/nginx/log/access.log--pid-path=/usr/local/nginx/nginx.pid--lock-path=/usr/local/nginx/lock/nginx.lock--user=nginx--group=nginx--with-http_ssl_module--with-http_flv_module--with-http_stub_status_module--with-http_gzip_static_module #开启4个进程编译安装: [root@mengtengine-2.2.0]#make-j4&&makeinstall 配置文件部分: #修改nginx.conf文件中的http模块的配置,原有的文件可以mv做个备份。 vimnginx.conf userroot; worker_processes4; error_log/usr/local/nginx/log/error.log; pid/usr/local/nginx/log/nginx.pid; events{ worker_connections10240; useepoll; } http{ includemime.types; default_typeapplication/octet-stream; log_formatmain'$remote_addr-$remote_user[$time_local]$server_name"$request"' '$status$body_bytes_sent"$http_referer"' '"$http_user_agent""$http_x_forwarded_for""time:$request_time"'; access_log/usr/local/nginx/log/access.logmain; client_max_body_size500m; sendfileon; keepalive_timeout300; gzipon; gzip_disable"msie6"; gzip_proxiedany; gzip_min_length2048; gzip_comp_level4; gzip_typestext/plainapplication/x-javascriptapplication/javascripttext/javascripttext/cssapplication/xmlapplication/jsonp_w_picpath/jpegp_w_picpath/gifp_w_picpath/png; include/usr/local/nginx/conf/conf.d/*.conf; includeconf.d/*.conf;#当然也可以改为相对路径 } #nginx启动脚本,拷贝nginx的或者网上复制一份启动脚本,自己修改下。如下 [root@meng~]#cat/etc/init.d/nginx #!/bin/bash # #nginx-thisscriptstartsandstopsthenginxdaemon # #chkconfig:-8515 #description:NginxisanHTTP(S)server,HTTP(S)reverse #proxyandIMAP/POP3proxyserver #processname:nginx #config:/etc/nginx/nginx.conf #config:/etc/sysconfig/nginx #pidfile:/var/run/nginx.pid #Sourcefunctionlibrary. ./etc/rc.d/init.d/functions #Sourcenetworkingconfiguration. ./etc/sysconfig/network #Checkthatnetworkingisup. ["$NETWORKING"="no"]&&exit0 TENGINE_HOME="/usr/local/nginx/" nginx=$TENGINE_HOME"sbin/nginx" prog=$(basename$nginx) NGINX_CONF_FILE=$TENGINE_HOME"conf/nginx.conf" [-f/etc/sysconfig/nginx]&&/etc/sysconfig/nginx lockfile=/usr/local/nginx/lock/nginx.lock start(){ [-x$nginx]||exit5 [-f$NGINX_CONF_FILE]||exit6 echo-n$"Starting$prog:" daemon$nginx-c$NGINX_CONF_FILE retval=$? echo [$retval-eq0]&&touch$lockfile return$retval } stop(){ echo-n$"Stopping$prog:" killproc$prog-QUIT retval=$? echo [$retval-eq0]&&rm-f$lockfile return$retval killall-9nginx } restart(){ configtest||return$? stop sleep1 start } reload(){ configtest||return$? echo-n$"Reloading$prog:" killproc$nginx-HUP RETVAL=$? echo } force_reload(){ restart } configtest(){ $nginx-t-c$NGINX_CONF_FILE } rh_status(){ status$prog } rh_status_q(){ rh_status>/dev/null2>&1 } case"$1"in start) rh_status_q&&exit0 $1 ;; stop) rh_status_q||exit0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q||exit7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q||exit0 ;; *) echo$"Usage:$0{start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit2 esac #提示锁目录文件不存在 [root@meng~]#servicenginxstart 正在启动nginx:[确定] touch:无法创建"/usr/local/nginx/lock/nginx.lock":没有那个文件或目录 #创建锁目录,重新启动nginx [root@meng~]#mkdir/usr/local/nginx/lock/ [root@meng~]#servicenginxrestart nginx:theconfigurationfile/usr/local/nginx/conf/nginx.confsyntaxisok nginx:configurationfile/usr/local/nginx/conf/nginx.conftestissuccessful 停止nginx:[确定] 正在启动nginx:[确定] #创建一个静态web服务器: [root@mengconf.d]#catstatic.conf server{ listen80default_server; server_name_; location/{ root/data/company/; indexindex.htmlindex.htm; } } server{ listen81default_server; server_name_; location/{ root/data/www/; indexindex.htmlindex.htm; } } server{ listen82default_server; server_name_; location/{ root/data/meng/; indexindex.htmlindex.htm; } } #创建静态资源目录: mkdir/data/meng #创建一个index.html页面。 [root@mengmeng]#catindex.html 192.168.121.128 #通过浏览器访问: 到此编译安装配置完成。

优秀的个人博客,低调大师

配置 LBaaS - 每天5分钟玩转 OpenStack(121)

上一节学习了 Neutron LBaaS 的原理,今天开始实践。首先在配置中启用 LBaaS 服务。 Neutron 通过 lbaas plugin 和 lbaas agent 提供 LBaaS 服务。 lbaas plugin 与 Neutron Server 一起运行在控制节点上。 lbaas agent 运行在网络节点上。 对于我们的实验环境,控制节点和网络节点是一个,都是 devstack-controller。 配置 LBaaS agent Neutron 配置 LBaaS agent 的地方是 /etc/neutron/services/loadbalancer/haproxy/lbaas_agent.ini。 定义 interface_driver: interface_driver 的作用是设置 load balancer 的网络接口驱动,可以有两个选项: Linux Bridge interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver Open vSwitch interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver 配置 LBaaS plugin 在 /etc/neutron/neutron.conf 中设置启用 LBaaS plugin 在 /etc/neutron/neutron_lbaas.conf 中设置 service provider 从注释信息可以看到,除了默认的 HAProxy,Neutron 也支持第三方 provider,比如 radware,VMWareEdge 等。 重启 neutron 服务,确保 LBaaS 正常运行。 我们将实践如下 LBaaS 环境。 该环境描述如下: 1. 创建一个 Pool “web servers”。 2. 两个 pool member “WEB1” 和 “WEB2”,均为运行 Ubuntu cloud image 的 instance。 3. load balancer VIP 与 floating IP 关联。 4. 位于外网的 client 通过 floating IP 访问 web server。 下一节开始我们将一步一步实现这个 LBaaS。

优秀的个人博客,低调大师

创建 VXLAN - 每天5分钟玩转 OpenStack(111)

前面我们讨论了 VXLAN 的理论知识,并且在 ML2 中完成了相关配置。今天将通过 Web UI 创建 vxlan100_net 并观察节点网络结构的变化。 打开菜单 Admin -> Networks,点击 “Create Network” 按钮 显示创建页面。 Provider Network Type 选择 “VXLAN” Segmentation ID 即 VNI,设置为 100 点击 “Create Network”,vxlan100 创建成功。 点击 vxlan100 链接,进入 network 配置页面,目前还没有 subnet,点击 “Create Subnet” 按钮。 创建 subnet_172_16_100_0,IP 地址为 172.16.100.0/24。 底层网络发生了什么变化 在控制节点上执行 brctl show,查看当前的网络结构。 Neutron 创建了: 1. vxlan100 对应的网桥 brq1762d312-d4 2. vxlan interface vxlan-100 3. dhcp 的 tap 设备 tap4df76d0e-59 vxlan-100 和 tap4df76d0e-59 已经连接到 brq1762d312-d4,vxlan100 的二层网络就绪。 执行 ip -d link show dev vxlan-100 查看 vxlan interface 的详细配置。 可见,vxlan-100 的 VNI 是 100,对应的 VTEP 网络接口为 eth1。 此时 vxlan100 结构如图所示: 下节我们将部署 instance 到vxlan100_net 并分析网络的连通性。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册