首页 文章 精选 留言 我的

精选列表

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

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

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

蓝牙、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世界网 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

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

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,后设置对焦位置,就会导致很奇怪的现象,对焦位置是你上次点击的位置。所以一定要先设置位置,再设置对焦模式。 曝光同上

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

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 并分析网络的连通性。

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

- 每天5分钟玩转 OpenStack(102)

上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由。今天探讨为什么要用 namespace 封装 router? 回顾一下前面的网络逻辑结构图: 我们需要讨论一个深层次的问题: 为什么不直接在 tape17162c5-00 和 tapd568ba1a-74 上配置 Gateway IP,而是引入一个 namespace,在 namespace 里面配置 Gateway IP 呢? 首先考虑另外一个问题: 如果不用 namespace,直接 Gareway IP 配置到 tape17162c5-00 和 tapd568ba1a-74 上,能不能连通 subnet_172_16_100_0 和 subnet_172_16_101_0 呢? 答案是可以的,只要控制节点上配置了类似下面的路由。 Destination Gateway Genmask Flags Metric Ref Use Iface 172.16.100.0 * 255.255.255.0 U 0 0 0 tapd568ba1a-74 172.16.101.0 * 255.255.255.0 U 0 0 0 tape17162c5-00 既然不需要 namespace 也可以路由,为什么还要加一层 namespace 增加复杂性呢? 其根本原因是:为了支持网络重叠。 云环境下,租户可以按照自己的规划创建网络,不同租户的网络是可能重叠的。 将路由功能放到 namespace 中,就能隔离不同租户的网络,从而支持网络重叠。 下面通过例子进一步解释。 Tenant A vlan100 subnet A-1: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.254"} Tenant A vlan101 subnet A-2: 10.10.2.0/24 {"start": "10.10.2.1", "end": "10.10.2.254"} Tenant B vlan102 subnet B-1: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.254"} Tenant B vlan103 subnet B-2: 10.10.2.0/24 {"start": "10.10.2.1", "end": "10.10.2.254"} A,B 两个租户定义了完全相同的两个 subnet,网络完全重叠。 不使用 namespace 的场景 如果不使用 namespace,网络结构如下: 其特征是网关 IP 配置在 TAP interface 上。 因为没有 namespace 隔离,router_100_101 和 router_102_103 的路由条目都只能记录到控制节点操作系统(root namespace)的路由表中,内容如下: Destination Gateway Genmask Flags Metric Ref Use Iface 10.10.1.0 * 255.255.255.0 U 0 0 0 tap1 10.10.2.0 * 255.255.255.0 U 0 0 0 tap2 10.10.1.0 * 255.255.255.0 U 0 0 0 tap3 10.10.2.0 * 255.255.255.0 U 0 0 0 tap4 这样的路由表是无法工作的。 按照路由表优先匹配原则,Tenant B 的数据包总是错误地被 Tenant A 的 router 路由。 例如 vlan102 上有数据包要发到 vlan103。 选择路由时,会匹配路由表的第二个条目,结果数据被错误地发到了 vlan101。 使用 namespace 的场景 如果使用 namespace,网络结构如下: 其特征是网关 IP 配置在 namespace 中的 veth interface 上。 每个 namespace 拥有自己的路由表。 router_100_101 的路由表内容如下: Destination Gateway Genmask Flags Metric Ref Use Iface 10.10.1.0 * 255.255.255.0 U 0 0 0 qr-1 10.10.2.0 * 255.255.255.0 U 0 0 0 qr-2 router_102_103 的路由表内容如下: Destination Gateway Genmask Flags Metric Ref Use Iface 10.10.1.0 * 255.255.255.0 U 0 0 0 qr-3 10.10.2.0 * 255.255.255.0 U 0 0 0 qr-4 这样的路由表是可以工作的。 例如 vlan102 上有数据包要发到 vlan103。 选择路由时,会查看 router_102_103 的路由表, 匹配第二个条目,数据通过 qr-4 被正确地发送到 vlan103。 同样当 vlan100 上有数据包要发到 vlan101时,会匹配 router_100_101 路由表的第二个条目,数据通过 qr-2 被正确地发送到 vlan101。 可见,namespace 使得每个 router 有自己的路由表,而且不会与其他 router 冲突,所以能很好地支持网络重叠。 好了,目前我们已经搞清楚了 Neutron 内部 subnet 之间是如何通信的了。下一节我们将学习 OpenStack 内部网络如何与外部网络通信。

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

理解 Glance - 每天5分钟玩转 OpenStack(20)

OpenStack 由 Glance 提供 Image 服务。 理解 Image 要理解 Image Service 先得搞清楚什么是 Image 以及为什么要用 Image? 在传统 IT 环境下,安装一个系统是要么从安装 CD 从头安装,要么用 Ghost 等克隆工具恢复。这两种方式有如下几个问题: 如果要安装的系统多了效率就很低 时间长,工作量大 安装完还要进行手工配置,比如安装其他的软件,设置 IP 等 备份和恢复系统不灵活 云环境下需要更高效的解决方案,这就是 Image。 Image 是一个模板,里面包含了基本的操作系统和其他的软件。 举例来说,有家公司需要为每位员工配置一套办公用的系统,一般需要一个 Win7 系统再加 MS office 软件。 OpenStack 是这么玩的: 先手工安装好这么一个虚机 然后对虚机执行 snapshot,这样就得到了一个 image 当有新员工入职需要办公环境时,立马启动一个或多个该 image 的 instance(虚机)就可以了 在这个过程中,第 1 步跟传统方式类似,需要手工操作和一定时间。但第 2、3 步非常快,全自动化,一般都是秒级别。 而且 2、3 步可以循环做。 比如公司新上了一套 OA 系统,每个员工的 PC 上都得有客户端软件。 那么可以在某个员工的虚机中手工安装好 OA 客户端,然后执行 snapshot ,得到新的 image,以后就直接使用新 image 创建虚机就可以了。 另外,snapshot 还有备份的作用,能够非常方便的恢复系统。 理解 Image Service Image Service 的功能是管理 Image,让用户能够发现、获取和保存 Image。 在 OpenStack 中,提供 Image Service 的是 Glance,其具体功能如下: 提供 REST API 让用户能够查询和获取 image 的元数据和 image 本身 支持多种方式存储 image,包括普通的文件系统、Swift、Amazon S3 等 对 Instance 执行 Snapshot 创建新的 image Glance 架构 上面是 Glance 的架构图 glance-api glance-api 是系统后台运行的服务进程。 对外提供 REST API,响应 image 查询、获取和存储的调用。 glance-api 不会真正处理请求。 如果是与 image metadata(元数据)相关的操作,glance-api 会把请求转发给 glance-registry; 如果是与 image 自身存取相关的操作,glance-api 会把请求转发给该 image 的 store backend。 在控制节点上可以查看 glance-api 进程 glance-registry glance-registry 是系统后台运行的服务进程。 负责处理和存取 image 的 metadata,例如 image 的大小和类型。 在控制节点上可以查看 glance-registry 进程 Glance 支持多种格式的 image,包括 Database Image 的 metadata 会保持到 database 中,默认是 MySQL。 在控制节点上可以查看 glance 的 database 信息 Store backend Glance 自己并不存储 image。 真正的 image 是存放在 backend 中的。 Glance 支持多种 backend,包括 A directory on a local file system(这是默认配置) GridFS Ceph RBD Amazon S3 Sheepdog OpenStack Block Storage (Cinder) OpenStack Object Storage (Swift) VMware ESX 具体使用哪种 backend,是在 /etc/glance/glance-api.conf 中配置的在我们的 devstack 环境中,image 存放在控制节点本地目录 /opt/stack/data/glance/images/ 中 其他 backend 的配置可参考http://docs.openstack.org/liberty/config-reference/content/configuring-image-service-backends.html 查看目前已经存在的 image 查看保存目录 每个 image 在目录下都对应有一个文件,文件以 image 的 ID 命名。 下节我们来实际操作 Glance。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

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文件系统,支持十年生命周期更新。

用户登录
用户注册