首页 文章 精选 留言 我的

精选列表

搜索[玩转EdgeOne],共1751篇文章
优秀的个人博客,低调大师

玩转ECS -- 2020修炼手册(第1季)

近期热点 赢取5000大奖 - 阿里云弹性计算自动化部署及运维模板挑战赛 面向全社会开放报名,欢迎企业开发者、个人开发者、学生群体、国际开发者的参与,报名时间2月24日-5月15日。我们希望通过此次比赛,沉淀和总结各行业使用云计算的服务和管理云基础架构的场景和经验,让更多用户了解和借鉴云上自动化部署运维的最新实践。 华南河源地域全网开服,支持30万台服务器规模,应对海量扩容需求。先进的金融级安全、稳定、可靠性保障,小于 1ms 的地域内可用区间延迟。 重点发布 自助排查问题的利器 — 操作审计实例的操作审计功能,可查询实例及其关联资源的所有操作记录,并且对操作记录的影响等级进行标注,把具有重大影响的操作从记录中高亮出来,助您高效排查问题和自证清白。 ECS 新版移动端购买发布啦!!!全新的体验,支持购买按量付费 ECS 以及更多丰富的功能,移动端购买 ECS 变得更加流畅。 不必晚睡早起做运维 — 实例定时开关机当您需要批量对ECS实例开关机状态进行管理时,通过OOS定时开关机可轻松搞定,当前支持每天以及指定每周中具体某些天的方式进行定时开关机。 标签管理利器 — 标签编辑器,多地域多产品千台资源一次搞定支持跨地域跨类型的资源(单次2000个)编辑标签与导出包含标签信息的资源列表。支持查询5000资源,并导出全部资源信息到CSV。突破describeInstance通过标签查询限制1K的瓶颈。 标签遇上监控 — 一键配置ECS实例的分组监控对标签一键配置监控能力,自动为每个标签创建云监控应用分组,从而简便的查看和管理通过标签分组的实例的监控数据。 ECS Linux系统盘损伤自救方案当您的 Linux 系统盘遇到突然掉电等引起的启动问题时,可以尝试自行一键修复系统盘,内部逻辑包括卸载系统盘、挂载到临时实例上、执行修复脚本、修复完成后重新挂载回原实例等。 弹性计算欢迎您!各产品或模块相继发布新版欢迎页,如专有宿主机 DDH、预留实例券 RI、云助手、弹性伸缩、弹性容器实例 ECI、运维编排服务 OOS、资源编排 ROS。提炼最佳实践,助您快速入门,减少学习曲线。 最新功能 云服务器ECS 成本优化 您的变配为什么不生效?执行完变配操作后需重启实例后新配置方可生效,控制台变配操作页提供立即和预约重启选项,别让您的钱打水漂。 新购 ECS 实例时,购买页面新增场景化配置选型,众多实例规格不知如何选择,场景化配置选项帮您分忧。 按量付费 ECS 调整带宽时支持实时查看当前配置的价格,避免误操作选了很高带宽后产生超出预期的费用。 按量付费云盘创建量的限制由原来的块数切换到了GB per Region机制,更加透明和精细化的管理创建量,也更加方便地申请容量提升。 国际站购买 ECS 支持按固定带宽计费,当您的带宽使用率比较固定时,使用按固定带宽计费成本更低。 ECS 金融云价格详情发布,一目了然查看各个实例规格不同计费时长的价格,支持查看优惠价和目录价。 安全容灾 系统盘出问题不求人 — 实例支持卸载系统盘,当文件损坏无法启动 ECS 实例时,您可以卸载系统盘后作为数据盘挂载到其他 ECS 实例进行修复,修复完毕后再作为系统盘挂载到源 ECS 实例。 实例释放时保留系统盘,云盘挂载到ECS实例上后,默认随实例释放,通过关闭“云盘随实例释放”功能,在实例被释放的时候,系统盘可以自动转换为按量付费的数据盘被保留下来。 本地盘实例详情页风险提示,现有的云盘快照功能无法支持本地盘,推荐使用HBR方案来进行实例文件备份,即使本盘出现故障,能通过HBR将数据便捷迅速地恢复,对业务的影响降到最低。 到期实例支持创建快照,当您需要保存一台到期实例的数据,您可以为磁盘创建快照,再使用快照创建镜像,从而实现保存数据的目的。 本地快照功能上线公测,ESSD 盘支持创建本地快照,本地快照将大幅缩短快照创建时间。目前仅开放香港region。 为避免退款误操作导致数据丢失,ECS发布包年包月退款延期释放功能。实例增加“退款后过期”新状态,实例退款后进入过期状态后其计算资源会在24小时后释放,数据将保留15天。 Windows 2008镜像已下线!由于微软不再对 Windows2008 提供维护,该镜像实例需要您签协议继续使用。 支持加密系统盘,镜像拷贝支持加密选项,支持选择和更换加密算法,更灵活地满足不同场景的加密需求。 让您的突发性能实例始终正常运行,突发性能实例固然性价比高,但性能受CPU积分的约束,当CPU积分消耗完毕后,实例性能将无法超过基准性能。若您部署的应用此时需要较高的算力,则会受到影响。为了让您及时获知积分状态,便于做出相应的处理,控制台提供了突发性能实例性能受限事件。 高效运维 新购 ECS 支持挂载 NAS,提升您的运维效率,让一键挂载 NAS 成为可能。 新购 ECS GPU 实例自助安装驱动 2.0 发布,相比 1.0,2.0 支持选择 NVIDIA cuDNN,支持勾选 GPU 助手(自动为您安装 GPU AI 加速器,快速搭建高性能分布式深度学习训练系统)。 资源搜索 — 给您的云资源画一张地图 ,如果您保有的实例分布在不同的地域下,您想根据某种或者某几种过滤条件跨地域过滤并导出实例,您可以去资源搜索页进行相关操作。 远程连接新方式 — workbench 云服务器ECS支持通过多种方式连接实例,包括Workbench、VNC和第三方客户端工具。您可以综合考虑目标实例的操作系统、本地设备的操作系统、需要执行的操作等因素,选择合适的连接方式。 资源概览支持全地域数据查询和全量数据导出。资源概览会从多个维度统计您名下的资源情况,全地资源导出将大幅减少您花在对每个全地数据拼接的时间。 网卡多IP更方便,创建网卡可同时为网卡指定多个辅助IP和多个安全组。 实例替换安全组,相比之前,要先加入新的安全组再离开老安全组有明显效率提升。利用此能力还可以实现实例级安全组类型切换,从普通安全组切换到企业安全组,实现大规模组网。 标签控制台集成资源概览视图,报表形式呈现资源状态和动态。 体验优化 本实例快照增加创建快照入口,方便您在对单一实例管控时快速保存云盘数据。 控制台实例列表页支持实例规格族筛选实例,一览实例机型。 实例列表支持批量打开/关闭突发性能实例约束。 创建弹性网卡支持批量选择多个安全组。 实例列表和详情支持绑定复制弹性网卡。 存储容量单位包SCU SCU 支持选择指定时间生效,您可以事先为未来某个时间点采购 SCU 存储容量包,适用于对财资有很好规划的企业或个人。 SCU 支持小规格,如 20G/40G。 SCU 支持加入购物车,与其他产品一同结算。 SCU 支持一次购买多个(购买数量),支持选择短周期 1、3、6 个月,让购买更加便捷可控。 预留实例券RI Reserved Instance Allocation 发布,当您在多账号之间协同使用 Reserved Instance,可以方便地进行财资权限管理。 专有宿主机DDH 调整实例规格部署,更加灵活地调整宿主机中的实例规格,快速适应业务变化,灵活调整运维架构。 宿主机接入云监控,帮助客户监控管理保有宿主机资源,快速了解各宿主机的状态和性能。 宿主机数据导出,支持宿主机资源数据的汇总导出,生成报表文件为客户提供不同维度的数据查看和管理。 弹性伸缩AutoScaling 全新引导页发布,归纳了最佳实践、产品优势,帮助您更快的了解和使用AutoScaling。 伸缩组支持挂起和唤醒,可以主动暂停伸缩组中的流程,更精细得控制伸缩组动作,方便您执行需要指定流程处于静态时的操作。 控制台新版创建流程上线,全新的交互体验以及新增的实例创建伸缩组的操作路径,帮助您更快更容易的使用弹性伸缩的服务。 AutoScaling接入标签(Tag),支持通过Tag管理伸缩组,对齐跨产品的Tag体验,帮助您更好的管理弹性伸缩资源。 弹性容器实例ECI 新版ECI控制台发布,新增欢迎页和监控功能。新的欢迎页在介绍ECI特性的同时,支持快速创建ECI。 创建页支持 FlexVolume,ImageCache。创建ECI的同时,您可以指定 FlexVolume 和 ImageCache,无需创建后再修改。 快速创建支持绑定EIP,容器组支持按内网IP搜索。容器组可以按EIP和内网IP直接搜索出需要的容器组。 运维编排服务OOS&云助手 云助手和OOS新版欢迎页发布,图形化创建与执行远程命令的流程: 明确了云助手的使用优势和场景。 添加了常见问题以及Open API的超链接。 迅速对云助手有全方位立体的了解,一看就知道这是您所需要的工具。 自动化运维提炼出常用运维任务和最佳实践,帮助您快速入门,减少学习曲线。 批量实例新增初始化和更新系统盘操作,轻松搞定批量ECS实例的系统盘初始化和更新操作。 批量管理软件轻松搞定 ,当您需批量对ECS实例中软件进行管理时,通过OOS批量管理软件可轻松搞定,当前支持管理阿里云提供的客户端软件(如云监控Agent和日志服务Agent),以及常见软件包管理系统(如yum和apt-get)。 定时运维添加执行时间预览功能,动态解析CRON表达式,提前告知您最近几次执行的任务时间。 事件 与 告警 运维,提供一种在云产品资源的监控指标达到指定的阈值或者云产品资源的状态变更后,去执行指定的模板,达到相关运维目标的功能。 新版执行详情页,全新的体验,从不同的维度细化执行结果,帮助您聚焦重要的部分,更有高级可视化视图来帮您把控整个执行的详细过程和结果。 发布代码心不慌 - 通过OOS批量启动ECS实例实践,使用运维编排服务OOS的公共模板 ACS-ECS-BulkyStartInstances 实现批量启动多台ECS实例。 支持通过标签管理我的模板和执行结果,帮助企业或个人将相同作用的OOS资源归类,便于搜索和资源聚合。 云助手执行命令的实例筛选页面深度优化,不再有多余的弹窗令您心烦意乱;根据您命令的类型智能匹配实例操作系统;支持对实例ID,名称以及IP的模糊搜索,令您省去很多记忆成本。 云助手可同时执行命令的实例数量突破50个:曾经我们限制了可同时执行命令的最大实例数量为50个,可能会给您带来不便,现在我们突破了这一限制。当您选择的实例数量大于50个时候,系统会智能的为您分批,保证命令顺利执行。 云助手执行命令的结果页面深度优化,执行命令的总实例数、完成数、以及失败的数量都显示在列表中,您可以对每条命令的执行结果一目了然;查看命令的页面重新布局,将命令的内容、执行结果非常有序的显示出来,异常便利。 资源编排ROS 新版欢迎页,归纳出常见的部署架构以及优势和学习路径,帮助您更快地学习使用ROS。 控制台 嵌套模板 的支持,帮助您在日常工作中分离一些常见组件并为其创建专用模板,并且能够混合和匹配不同的模板,并使用嵌套资源栈来创建单个统一的资源栈。 发布 资源栈组 功能,您可以使用管理员账号定义和管理ROS模板,并根据模板进行统一的多账号和多地域的资源栈部署和管理,提高了您的部署效率并降低维护成本,特别是为您在中心化管控场景下,对于业务环境的跨账号跨地域分发提供了更好的支持。 资源栈创建时支持询价了,在创建资源的过程中,能够提前通过询价功能查看当前资源栈资源所需要的花费。 解决方案模板继续扩充,资源编排解决方案中心继续把最优的企业上云实践以模版的形式呈现给您。您可以一键部署这些模版或进行必要的修改,轻松完成复杂场景的部署和架构优化。 资源类型支持按产品分组,帮助您快速通过云产品来过滤出相应的资源类型,更加细化体验,提高工作效率。 Open API 发布批量启停的API,一次性启动、停止或重启多台ECS实例,提升了吞吐量,减少被流控概率。 StartInstances RebootInstances StopInstances 您在创建自定义镜像时,可配置 ImageFamily 属性,在创建实例时指定 ImageFamily,默认选取您指定的 ImageFamily 中最新创建的可用镜像。 网卡查询支持NextToken DescribeNetworkInterfaces ,查询更方便。

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

[玩转MySQL之一]MySQL体系架构简介

引言 MySQL是一个典型的C/S架构程序,MySQL Server提供数据库服务,完成客户端的请求和操作,Client负责连接到Server。MySQL和其他关系型数据库不一样的地方在于它的弹性以及可以通过插件形式提供不同种类的存储引擎,MySQL请求处理过程会根据不同的存储引擎发生变化,比如事务性的InnoDB和非事务性的MyISAM,数据的存储和SQL的执行会产生很大的差异。本文以MySQL5.7为例,简单介绍MySQL的物理和逻辑架构。 1. MySQL物理结构 1.1 配置文件 auto.cnf: 配置了MySQL Server的UUID my.cnf: MySQL的配置文件 1.2 其他重要文件 -basedir=dir_name: MySQL安装的二进制文件目录 -datadir=dir_name: MySQL的数据目录和 -pid-file=file_name: 保存MySQL进程ID文件 -log-error=file_name: MySQL错误日志文件 2. MySQL逻辑体系架构 MySQL逻辑系统架构分为3层: 应用层 MySQL服务层 存储引擎层 2.1 应用层 应用层是MySQL体系架构的最上层,它可其他client-server架构一样,主要包含如下内容: 连接处理 用户鉴权 安全管理 1. 连接处理当一个客户端向服务端发送连接请求后,MySQL server会从线程池中分配一个线程来和客户端进行连接,以后该客户端的请求都会被分配到该线程上。MySQL Server为了提高性能,提供了线程池,减少了创建线程和释放线程所花费的时间。 2. 用户鉴权当客户端向MySQL服务端发起连接请求后,MySQL server会对发起连接的用户进行鉴权处理,MySQL鉴权依据是: 用户名,客户端主机地址和用户密码 3. 安全管理当客户连接到MySQL server后,MySQL server会根据用户的权限来判断用户具体可执行哪些操作。MySQL 提供的部分权限的如下: mysql> show privileges \G; *************************** 1. row *************************** Privilege: Alter Context: Tables Comment: To alter the table *************************** 2. row *************************** Privilege: Alter routine Context: Functions,Procedures Comment: To alter or drop stored functions/procedures *************************** 3. row *************************** Privilege: Create Context: Databases,Tables,Indexes Comment: To create new databases and tables 2.2 MySQL 服务层 该层是MySQL Server的核心层,提供了MySQL Server数据库系统的所有逻辑功能,该层可以分为如下不同的组件: MySQL Management Server & utilities(系统管理) SQL Interface(SQL 接口) SQL Parser(SQL 解析器) Optimizer (查询优化器) Caches & buffers(缓存) 1. MySQL Management Server & utilities(系统管理)提供了丰富的数据库管理功能,具体如下: 数据库备份和恢复 数据库安全管理,如用户及权限管理 数据库复制管理 数据库集群管理 数据库分区,分库,分表管理 数据库元数据管理 2. SQL Interface(SQL 接口)SQL接口,接收用户的SQL命令并进行处理,得到用户所需要的结果,具体处理功能如下: Data Manipulation Language (DML). Data Definition Language (DDL). 存储过程 视图 触发器 3. SQL Parser(SQL 解析器)解析器的作用主要是解析查询语句,最终生成语法树。首先解析器会对查询语句进行语法分析,如果语句语法有错误,则返回相应的错误信息。语法检查通过后,解析器会查询缓存,如果缓存中有对应的语句,就直接返回结果不进行接下来的优化执行操作。 注:读者会疑问,从缓存中查出来的数据会不会被修改,与真实的数据不一致,这里读者大可放心,因为缓存中数据被修改,会被清出缓存。 4. Optimizer(查询优化器)优化器的作用主要是对查询语句进行优化,包括选择合适的索引,数据的读取方式。 5. Caches & buffers(缓存)包括全局和引擎特定的缓存,提高查询的效率。如果查询缓存中有命中的查询结果,则查询语句就可以从缓存中取数据,无须再通过解析和执行。这个缓存机制是由一系列小缓存组成,如表缓存、记录缓存、key缓存、权限缓存等。 2.3 存储引擎层 1. 存储引擎存储引擎是MySQL中具体与文件打交道的子系统,也是MySQL最有特色的地方。MySQL区别于其他数据库的最重要特点是其插件式的表存储引擎。他根据MySQL AB公司提供的文件访问层抽象接口来定制一种文件访问的机制(该机制叫存储引擎)。 2. 物理文件物理文件包括:redolog、undolog、binlog、errorlog、querylog、slowlog、data、index等 3. 参考文献 MySQL Architecture and ComponentsUnderstanding MySQL Architecture带你认识 MySQL 之 MySQL 体系结构 更多内容请关注公众号

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

伸手党福利-从零开始玩转图库

名词解释 vetex:节点 edge:边 graph:图 tinkerpop tinkerpop是一个图库标准,一个框架,学习图库,先从这个项目入手比较合适, neo4j, janusGraph只是它两个组件(图storage-engine)的vendor而已。图库是节点&边的集合,边描述了节点间的关联关系。 tourist 打开gremlin-console,我们可以通过groovy语言对图进行curd操作,也可以使用gremlin语法进行遍历 $ bin/gremlin.sh \,,,/ (o o) -----oOOo-(3)-oOOo----- plugin activated: tinkerpop.server plugin activated: tinkerpop.utilities plu

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

带你玩转七牛云存储——高级篇

七牛云图片存储优点 支持各种尺寸的图片缩放; 支持图片自动压缩; 支持水印添加:图片水印、文字水印两种模式; 图片防盗链,限制访问来源; 设置ip黑白名单,防止恶意盗刷、攻击; 自定义图片域名,看起来更具有归属性; 统计图片的各种访问数据; 支持上传日志文件,可保存30天,便于排除程序问题; 水印 灵活的水印配置:可设置位置、透明度等,同时支持图片和文字两种水印模式,如图: 图片处理 图片处理里面最好用的是生成各种缩略图,超好用只需要加参数就好。 比如我需要得到一张图等比200*200的缩略图,只需要在原有连接的基础上加上“?imageView2/0/w/200/h/200”即可,全部路径如下:http://icdn.apigo.cn/68.jpg?imageView2/0/w/200/h/200 更多详细文档:https://developer.qiniu.com/dora/manual/1279/basic-processing-images-imageview2 图片上传 上传步骤 简单来说,图片上传分为两步: 根据AccessKey + SecretKey (可在个人中心=》秘钥管理查看) + bucket(存储空间名称),生成token; 使用图片源(文件流/文件地址)和token提交信息到七牛存储图片; 上传途径 上传途径分为两种: 服务器端上传:分为本地文件上传、字节数组上传; 客户端上传:Base64模式上传、Blob模式上传; 本文服务器端使用nodejs开发,客户端使用javascript开发。 服务器端-nodejs上传 在开始上传之前,首先需要获取一下七牛的token,也就是上传步骤的第一步,这个token是通用的,不管是服务器上传还是客户端上传token值都是通用的,实现代码也是一样的。 获取token 使用npm安装七牛SDK: npm install qiniu 使用下面代码获取uploadToken: var accessKey = 'xxx'; //可在个人中心=》秘钥管理查看 var secretKey = 'xxx'; //可在个人中心=》秘钥管理查看 var bucket = "apigo"; //存储空间名称 var mac = new qiniu.auth.digest.Mac(accessKey, secretKey); var options = { scope: bucket } var putPolicy = new qiniu.rs.PutPolicy(options); var uploadToken = putPolicy.uploadToken(mac); return this.jsonp({ 'token': uploadToken }); 注意:下面所有的实现方面里的uploadToken都是从本方法获取的。 方式一:本地文件上传 代码如下: var config = new qiniu.conf.Config(); config.zone = qiniu.zone.Zone_z1; // 空间对应的机房 var formUploader = new qiniu.form_up.FormUploader(config); var putExtra = new qiniu.form_up.PutExtra(); var key='test.png'; //上传到服务器的名称 var localFile = "D:\\img\\test.png"; // 本地文件路径 formUploader.putFile(uploadToken, key, localFile, putExtra, function (respErr, respBody, respInfo) { if (respErr) { throw respErr; } if (respInfo.statusCode == 200) { console.log(respBody); } else { console.log(respInfo.statusCode); console.log(respBody); } }); 其中,机房对应的对象如下: 华东 qiniu.zone.Zone_z0 华北 qiniu.zone.Zone_z1 华南 qiniu.zone.Zone_z2 北美 qiniu.zone.Zone_na0 方式二:字节数组上传 完整实现思路:前台页面input[type=file]Post请求到后台,后台转换读取文件流对象传递给七牛云,使用putStream保存文件。 前台代码 <form action="http://127.0.0.1:8360/qiniu/upload" method="POST" enctype="multipart/form-data"> <input name="f" type="file" /> <button type="submit">提交</button> </form> nodejs服务器端代码 var _file = this.file("f"); //前台type=file post过来的文件 var putExtra = new qiniu.form_up.PutExtra(); var config = new qiniu.conf.Config(); config.zone = qiniu.zone.Zone_z1; // 空间对应的机房 var formUploader = new qiniu.form_up.FormUploader(config); var key = "test1.png"; var readStream = fs.createReadStream(_file.path); //文件流对象 formUploader.putStream(uploadToken, key, readStream, putExtra, function (respErr, respBody, respInfo) { if (respErr) { throw respErr; } if (respInfo.statusCode == 200) { console.log(respBody); } else { console.log(respInfo.statusCode); console.log(respBody); } }); 方式三:Base64转字节数组上传 前后台使用Base64进行数据传递也是比较常用的方式之一,尤其是不同平台的传值,比如手机、平板Post数据给PC,类似方式二的实现方式,我们只是把前台传递给我们的Base64转换成文件流对象,使用putStream进行上传,具体nodejs代码如下: import { Duplex } from 'stream'; var b64string = 'xxx'; //base64必须去掉头文件(data:image/png;base64,) var buff = new Buffer(b64string, 'base64') var stream = new Duplex(); stream.push(buff); stream.push(null); var putExtra = new qiniu.form_up.PutExtra(); var config = new qiniu.conf.Config(); config.zone = qiniu.zone.Zone_z1; // 空间对应的机房 var formUploader = new qiniu.form_up.FormUploader(config); var key = "test.png"; formUploader.putStream(uploadToken, key, stream, putExtra, function (respErr, respBody, respInfo) { if (respErr) { throw respErr; } if (respInfo.statusCode == 200) { console.log(respBody); } else { console.log(respInfo.statusCode); console.log(respBody); } }); 需要注意的一点是base64字符串必须去掉头文件(data:image/png;base64,)才能进行字节流的转换。 客户端-javascript上传 步骤一:引用qiniu.min.js 先引入qiniu.min.js文件,格式:https://unpkg.com/qiniu-js@/dist/qiniu.min.js 其中为版本号,查看发布的版本版:https://github.com/qiniu/js-sdk/releases ,示例:https://unpkg.com/qiniu-js@2.3.0/dist/qiniu.min.js <script type="text/javascript" src="https://unpkg.com/qiniu-js@2.3.0/dist/qiniu.min.js"></script> 步骤二:获取uploadToken 参考上文获取uploadToken通用方法。 步骤三:base64模式直接上传 //base64模式直接上传 var base64 = 'xxx'.replace('data:image/png;base64,', ''); var imgName = toBase64('xxx.png'); //自定义文件名必须是base64格式的 var url = "http://upload.qiniup.com/putb64/-1/key/" + imgName; //非华东空间需要根据注意事项-修改上传域名(upload.qiniup.com) var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { //上传成功,返回信息 console.log(xhr.responseText); } } xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/octet-stream"); xhr.setRequestHeader("Authorization", "UpToken " + uploadToken); xhr.send(base64); function toBase64(data) { var toBase64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var base64Pad = '='; var result = ''; var length = data.length; var i; // Convert every three bytes to 4 ascii characters. for (i = 0; i < (length - 2); i += 3) { result += toBase64Table[data.charCodeAt(i) >> 2]; result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i + 1) >> 4)]; result += toBase64Table[((data.charCodeAt(i + 1) & 0x0f) << 2) + (data.charCodeAt(i + 2) >> 6)]; result += toBase64Table[data.charCodeAt(i + 2) & 0x3f]; } // Convert the remaining 1 or 2 bytes, pad out to 4 characters. if (length % 3) { i = length - (length % 3); result += toBase64Table[data.charCodeAt(i) >> 2]; if ((length % 3) == 2) { result += toBase64Table[((data.charCodeAt(i) & 0x03) << 4) + (data.charCodeAt(i + 1) >> 4)]; result += toBase64Table[(data.charCodeAt(i + 1) & 0x0f) << 2]; result += base64Pad; } else { result += toBase64Table[(data.charCodeAt(i) & 0x03) << 4]; result += base64Pad + base64Pad; } } return result; } 注意点: url参数注意空间存储区域,不同地域url地址不同,华东upload.qiniup.com,华北upload-z1.qiniu.com,华南upload-z2.qiniu.com,北美upload-na0.qiniu.com; 文件名(imgName)必须是base64格式的; 请求头Authorization的值格式:"UpToken " + uploadToken(服务器端获取uploadToken,见上文); 步骤三(2):base64转blob上传 var putExtra = { fname: "", params: {}, mimeType: [] || null }; var config = { useCdnDomain: true }; // base64 转 blob 模式上传 var base64 = 'xxx'.replace('data:image/png;base64,', ''); var contentType = 'image/png'; var blob = base64ToBlob(base64, contentType, undefined); var observable = qiniu.upload(blob, 'xxx.png', qiniuToken, putExtra, config); var subscription = observable.subscribe({ next(res) { // console.log(res); }, error(err) { console.log(err); }, complete(res) { console.log(res); } }); //base64转blob function base64ToBlob(base64, contentType, sliceSize) { contentType = contentType || ''; sliceSize = sliceSize || 512; var byteCharacters = atob(base64); var byteArrays = []; for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) { var slice = byteCharacters.slice(offset, offset + sliceSize); var byteNumbers = new Array(slice.length); for (var i = 0; i < slice.length; i++) { byteNumbers[i] = slice.charCodeAt(i); } var byteArray = new Uint8Array(byteNumbers); byteArrays.push(byteArray); } var blob = new Blob(byteArrays, { type: contentType }); return blob; } 更多开发语言:https://developer.qiniu.com/sdk#official-sdk 参考文档:https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code 开启你的使用之旅吧 注册链接:https://portal.qiniu.com/signup?code=3li1yhz9s7qky 如果本文对你有所帮助,请打赏——1元就足够感动我:) 联系邮箱:intdb@qq.com 我的GitHub: https://github.com/vipstone 关注公众号: 作者: 王磊 出处: http://vipstone.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,请标明出处。

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

教程:用强化学习玩转恐龙跳跳

DeepMind在2013年发表了一篇题为《用深度强化学习玩Atari》的文章,介绍了一种新的用于强化学习的深度学习模型,并展示了它仅使用原始像素作为输入来掌握Atari 2600计算机游戏难度控制策略的能力。在本教程中,我将使用Keras实现本文。我们将从增强学习的基础开始,然后深入代码中进行实践性的理解。 AI玩游戏 我在2018年3月初开始了这个项目,并取得了一些不错的成果。但是,只有CPU的系统是学习更多功能的瓶颈。强大的GPU极大地提升了性能。 在我们运行模型之前,我们需要了解许多步骤和概念。 步骤: 在浏览器(JavaScript)和模型(Python)之间构建双向接口 捕获和预处理图像 训练模型 评估 源代码:https://github.com/Paperspace/DinoRunTutorial.git 入门 要按照原样训练和玩游戏,

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

玩转linux 这些命令就成高手了

知识分享 现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 此篇文章只是给大家列举常用命令 更高级的linux学习视频会送给大家 在公众号内回复 "linux" 即可获取 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo 显示CPU info的信息 cat /proc/interrupts 显示中断 cat /proc/meminfo 校验内存使用 cat /proc/swaps 显示哪些swap被使用 cat /proc/version 显示内核的版本 cat /proc/net/dev 显示网络适配器及统计 cat /proc/mounts 显示已加载的文件系统 lspci -tv 罗列 PCI 设备 lsusb -tv 显示 USB 设备 date 显示系统日期 cal 2007 显示2007年的日历表 date 041217002007.00 设置日期和时间 - 月日时分年.秒 clock -w 将时间修改保存到 BIOS 关机 (系统的关机、重启以及登出 ) shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 shutdown -r now 重启(1) reboot 重启(2) logout 注销 文件和目录 cd /home 进入 '/ home' 目录' cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 cd - 返回上次所在的目录 pwd 显示工作路径 ls 查看目录中的文件 ls -F 查看目录中的文件 ls -l 显示文件和目录的详细资料 ls -a 显示隐藏文件 ls *[0-9]* 显示包含数字的文件名和目录名 tree 显示文件和目录由根目录开始的树形结构(1) lstree 显示文件和目录由根目录开始的树形结构(2) mkdir dir1 创建一个叫做 'dir1' 的目录' mkdir dir1 dir2 同时创建两个目录 mkdir -p /tmp/dir1/dir2 创建一个目录树 rm -f file1 删除一个叫做 'file1' 的文件' rmdir dir1 删除一个叫做 'dir1' 的目录' rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 rm -rf dir1 dir2 同时删除两个目录及它们的内容 mv dir1 new_dir 重命名/移动 一个目录 cp file1 file2 复制一个文件 cp dir/* . 复制一个目录下的所有文件到当前工作目录 cp -a /tmp/dir1 . 复制一个目录到当前工作目录 cp -a dir1 dir2 复制一个目录 ln -s file1 lnk1 创建一个指向文件或目录的软链接 ln file1 lnk1 创建一个指向文件或目录的物理链接 touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm) file file1 outputs the mime type of the file as text iconv -l 列出已知的编码 iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick) 文件搜索 find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 find / -user user1 搜索属于用户 'user1' 的文件和目录 find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限 find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备 locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 whereis halt 显示一个二进制文件、源码或man的位置 which halt 显示一个二进制文件或可执行文件的完整路径 挂载一个文件系统 mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出 fuser -km /mnt/hda2 当设备繁忙时强制卸载 umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 mount /dev/fd0 /mnt/floppy 挂载一个软盘 mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 磁盘空间 df -h 显示已经挂载的分区列表 ls -lSr |more 以尺寸大小排列文件和目录 du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统) 用户和群组 groupadd group_name 创建一个新用户组 groupdel group_name 删除一个用户组 groupmod -n new_group_name old_group_name 重命名一个用户组 useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 useradd user1 创建一个新用户 userdel -r user1 删除一个用户 ( '-r' 排除主目录) usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 passwd 修改口令 passwd user1 修改一个用户的口令 (只允许root执行) chage -E 2005-12-31 user1 设置用户口令的失效期限 pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户 grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组 newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组 文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 chown user1 file1 改变一个文件的所有人属性 chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 chgrp group1 file1 改变文件的群组 chown user1:group1 file1 改变一个文件的所有人和群组属性 find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 chmod g-s /home/public 禁用一个目录的 SGID 位 chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 chmod o-t /home/public 禁用一个目录的 STIKY 位 文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 chattr +a file1 只允许以追加方式读写文件 chattr +c file1 允许这个文件能被内核自动压缩/解压 chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 chattr +s file1 允许一个文件被安全地删除 chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 lsattr 显示特殊的属性 打包和压缩文件 bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 bzip2 file1 压缩一个叫做 'file1' 的文件 gunzip file1.gz 解压一个叫做 'file1.gz'的文件 gzip file1 压缩一个叫做 'file1'的文件 gzip -9 file1 最大程度压缩 rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1' rar x file1.rar 解压rar包 unrar x file1.rar 解压rar包 tar -cvf archive.tar file1 创建一个非压缩的 tarball tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 tar -tf archive.tar 显示一个包中的内容 tar -xvf archive.tar 释放一个包 tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 tar -xvfj archive.tar.bz2 解压一个bzip2格式的压缩包 tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 tar -xvfz archive.tar.gz 解压一个gzip格式的压缩包 zip file1.zip file1 创建一个zip格式的压缩包 zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 unzip file1.zip 解压一个zip格式压缩包 RPM 包 - (Fedora, Redhat及类似系统) rpm -ivh package.rpm 安装一个rpm包 rpm -ivh --nodeeps package.rpm 安装一个rpm包而忽略依赖关系警告 rpm -U package.rpm 更新一个rpm包但不改变其配置文件 rpm -F package.rpm 更新一个确定已经安装的rpm包 rpm -e package_name.rpm 删除一个rpm包 rpm -qa 显示系统中所有已经安装的rpm包 rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 rpm -qi package_name 获取一个已安装包的特殊信息 rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 rpm -q package_name --whatprovides 显示一个rpm包所占的体积 rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l rpm -q package_name --changelog 显示一个rpm包的修改历史 rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 rpm --checksig package.rpm 确认一个rpm包的完整性 rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 rpm -Va 检查系统中所有已安装的rpm包- 小心使用 rpm -Vp package.rpm 确认一个rpm包还未安装 rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 YUM 软件包升级器 - (Fedora, RedHat及类似系统) yum install package_name 下载并安装一个rpm包 yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 yum update package_name.rpm 更新当前系统中所有安装的rpm包 yum update package_name 更新一个rpm包 yum remove package_name 删除一个rpm包 yum list 列出当前系统中安装的所有包 yum search package_name 在rpm仓库中搜寻软件包 yum clean packages 清理rpm缓存删除下载的包 yum clean headers 删除所有头文件 yum clean all 删除所有缓存的包和头文件 DEB 包 (Debian, Ubuntu 以及类似系统) dpkg -i package.deb 安装/更新一个 deb 包 dpkg -r package_name 从系统删除一个 deb 包 dpkg -l 显示系统中所有已经安装的 deb 包 dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包 dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 dpkg -S /bin/ping 确认所给的文件由哪个deb包提供 APT 软件工具 (Debian, Ubuntu 以及类似系统) apt-get install package_name 安装/更新一个 deb 包 apt-cdrom install package_name 从光盘安装/更新一个 deb 包 apt-get update 升级列表中的软件包 apt-get upgrade 升级所有已安装的软件 apt-get remove package_name 从系统删除一个deb包 apt-get check 确认依赖的软件仓库正确 apt-get clean 从下载的软件包中清理缓存 apt-cache search searched-package 返回包含所要搜索字符串的软件包名称 查看文件内容 cat file1 从第一个字节开始正向查看文件的内容 tac file1 从最后一行开始反向查看一个文件的内容 more file1 查看一个长文件的内容 less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 head -2 file1 查看一个文件的前两行 tail -2 file1 查看一个文件的最后两行 tail -f /var/log/messages 实时查看被添加到一个文件中的内容 文本处理 cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug" grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇 grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" sed 's/stringa1/stringa2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2" sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 echo 'esempio' | tr '[:lower:]' '[:upper:]' 合并上下单元格内容 sed -e '1d' result.txt 从文件example.txt 中排除第一行 sed -n '/stringa1/p' 查看只包含词汇 "string1"的行 sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 sed -e 's/stringa1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 sed -n '5p;5q' example.txt 查看第5行 sed -e 's/00*/0/g' example.txt 用单个零替换多个零 cat -n file1 标示文件的行数 cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行 echo a b c | awk '{print $1}' 查看一行第一栏 echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏 paste file1 file2 合并两个文件或两栏的内容 paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分 sort file1 file2 排序两个文件的内容 sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) sort file1 file2 | uniq -u 删除交集,留下其他的行 sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容 comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容 comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分 字符设置和文件格式转换 dos2unix filedos.txt fileunix.txt 将一个文本文件的格式从MSDOS转换成UNIX unix2dos fileunix.txt filedos.txt 将一个文本文件的格式从UNIX转换成MSDOS recode ..HTML < page.txt > page.html 将一个文本文件转换成html recode -l | more 显示所有允许的转换格式 文件系统分析 badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 初始化一个文件系统 mkfs /dev/hda1 在hda1分区创建一个文件系统 mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 fdformat -n /dev/fd0 格式化一个软盘 mkswap /dev/hda3 创建一个swap文件系统 SWAP文件系统 mkswap /dev/hda3 创建一个swap文件系统 swapon /dev/hda3 启用一个新的swap文件系统 swapon /dev/hda2 /dev/hdb3 启用两个swap分区 备份 dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份 dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份 restore -if /tmp/home0.bak 还原一个交互式备份 rsync -rogpav --delete /home /tmp 同步两边的目录 rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作 dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作 ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容 ( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录 tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录 find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包 dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容 光盘 cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件 mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) cdrecord --scanbus 扫描总线以识别scsi通道 dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD 网络 - (以太网和WIFI无线) ifconfig eth0 显示一个以太网卡的配置 ifup eth0 启用一个 'eth0' 网络设备 ifdown eth0 禁用一个 'eth0' 网络设备 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing) dhclient eth0 以dhcp模式启用 'eth0' route -n show routing table route add -net 0/0 gw IP_Gateway configura default gateway route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16' route del 0/0 gw IP_gateway remove static route echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing hostname show hostname of system host www.example.com lookup hostname to resolve name to ip address and viceversa(1) nslookup www.example.com lookup hostname to resolve name to ip address and viceversa(2) ip link show show link status of all interfaces mii-tool eth0 show link status of 'eth0' ethtool eth0 show statistics of network card 'eth0' netstat -tup show all active network connections and their PID netstat -tupl show all network services listening on the system and their PID tcpdump tcp port 80 show all HTTP traffic iwlist scan show wireless networks iwconfig eth1 show configuration of a wireless network card hostname show hostname host www.example.com lookup hostname to resolve name to ip address and viceversa nslookup www.example.com lookup hostname to resolve name to ip address and viceversa whois www.example.com lookup on Whois database JPS工具 jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。 使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。 jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path. $> jps 23991 Jps 23789 BossMain 23651 Resin 比较常用的参数: -q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数 $> jps -q 28680 23789 23651 -m 输出传递给main 方法的参数,在嵌入式jvm上可能是null $> jps -m 28715 Jps -m 23789 BossMain 23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log -l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名 $> jps -l 28729 sun.tools.jps.Jps 23789 com.asiainfo.aimc.bossbi.BossMain 23651 com.caucho.server.resin.Resin -v 输出传递给JVM的参数 $> jps -v 23789 BossMain 28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m 23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl - Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl sudo jps看到的进程数量最全 jps 192.168.0.77 列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099 (前提是远程服务器提供jstatd服务) 注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。 详细情况请参考sun官方文档。 http://java.sun.com/j2se/1.7.0/docs/tooldocs/share/jps.html

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

用Python玩转微信的正确姿势!

0. itchat 最近研究了一些微信的玩法,我们可以通过网页版的微信微信网页版,扫码登录后去抓包爬取信息,还可以post去发送信息。 然后发现了itchat这个开源项目,作者是@LittleCoder,已经把微信的接口完成了,大大的方便了我们对微信的挖掘,以下的功能也通过itchat来实现。 安装itchat这个库 pip install itchat 先来段简单的试用,实现微信的登录,运行下面代码会生成一个二维码,扫码之后手机端确认登录,就会发送一条信息给‘filehelper’,这个filehelper就是微信上的文件传输助手。 importitchat# 登录itchat.login()# 发送消息itchat.send(u'你好', 'filehelper') 除了登录和发送消息我们还可以这么来玩,往下走~ 1. 微信好友男女比例 想统计

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

一机玩转docker之三:搭建jira

目标 因为工作需要,需搭建atlassian公司出品的系列工具,包括: crowd jira bitbucket confluence bamboo crucible 本次先讲搭建jira的步骤。 一、创建数据库容器 执行如下命令: docker run \ -dit \ --rm \ --name tool_mysql56 \ --network main_net \ --ip 10.112.0.0 \ -v /data/tool/db/mysql56:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6 #以mysql5.6版本的镜像为基础启动容器 注:后续安装其他atlassian工具时,使用的外部数据库都使用该容器。 连接数据库后,创建数据库jira。 二、以centos镜像为基础启动容器 docker run \ -dit \ --name tool_jira \ --network main_net \ --ip 10.115.0.1 \ -v /data/tool/jira:/var/atlassian/application-data/jira \ centos 命令说明: docker run \ #从镜像启动容器 -dit \ #实际相当于-d -i -t;-d后台启动,-i保持输入打开即使不接入容器,-t分配给虚拟tty(命令行终端) --name tool_jira \ #将容器命名为tool_jira --network main_net \ #设定容器使用的网络main_net --ip 10.115.0.1 \ #设定容器在网络中的地址为10.115.0.1; -v /data/tool/jira:/var/atlassian/application-data/jira \ #挂载宿主机目录/data/tool/jira为容器目录/var/atlassian/application-data/jira centos #以centos为启动镜像 三、下载jira安装包和mysql数据库驱动 cd /data/setup/ #进入安装包目录 wget https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-software-7.7.1-x64.bin #从atlassian下载jira安装包(宿主机中执行) wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.45.tar.gz #从mysql官方下载mysql的java驱动(宿主机中执行) tar zxf mysql-connector-java-5.1.45.tar.gz #解压缩驱动包(宿主机中执行) 注:安装jira不需要预装jdk 四、安装jira docker cp atlassian-jira-software-7.7.1-x64.bin tool_jira:/root/ #将下载到宿主机的jira安装包复制到容器的/root/目录下(宿主机中执行) docker exec -it tool_jira bash #进入容器(宿主机中执行) cd /root/ #进入/root/目录下(容器中执行) chmod +x atlassian-jira-software-7.7.1-x64.bin #增加jira安装包的可执行权限 ./atlassian-jira-software-7.7.1-x64.bin #执行安装命令 #注:应用安装目录为/opt/atlassian/jira #注:数据存放目录为/var/atlassian/application-data/jira,即挂载数据卷目录 cd /opt/atlassian/jira/bin #进入执行目录(容器中执行) ./stop-jira.sh #停止jira(容器中执行) exit #退出容器(容器中执行) docker cp mysql-connector-java-5.1.45/mysql-connector-java-5.1.45-bin.jar tool_jira:/opt/atlassian/jira/atlassian-jira/WEB-INF/lib/ #将mysql数据驱动文件复制到目录中(宿主机中执行) docker exec -it tool_jira /opt/atlassian/jira/bin/start-jira.sh #重新启动jira(宿主机中执行) 五、在主nginx配置文件中增加反向代理配置 在/data/main/nginx/conf.d/下增加文件tool_jira.conf 文件内容: #以下配置为将域名jira.yourdomain.com反向代理到宝塔面板的管理页面 #注:在域名解析设置中需把域名jira.yourdomain.com指向该阿里云ECS的公网IP server{ listen 80; server_name jira.yourdomain.com; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://10.115.0.1:8080/; break; } } 执行nginx容器反向代理加载最新配置命令 docker exec -it main_nginx nginx -s reload #在main_nginx容器中重新加载配置文件(在宿主机中执行该命令) 六、登陆jira并配置 访问jira.yourdomain.com,即可打开jira配置页面。 配置完成后即可正常使用jira。

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

Windows Mobile程序员玩转Android开发

现在的智能手机操作系统已经进入战国时代,老牌的Symbian、Windows Mobile和BREW面临着iPhone和Android等新势力的巨大挑战。最近有些闲暇时间了,可以研究下新手机操作系统的应用程序开发了。下一代的手机内置功能将不再是决定因素,如何让第三方快速开发手机上的应用将是兵家必争的制高点。 我是一个Windows Mobile程序员,而且也做了很久,为什么在新的手机操作系统里选择Android?因为Android和Windows Mobile太像了,为什么这么说? 1,都是操作系统与手机硬件分离模式,最有趣的是硬件供应商竟然是一家; 2,可以使用托管代码来进行开发(.NET CF和Java) 3,免费发布的SDK 4,IDE集成式开发环境(Visual Studio和Eclipse) 5,强大的服务器端软件支持(Windows Server、SQL Server、Exchange和Google Online Service) 所以说,从技术方向上来说,Windows Mobile和Android是相同技术的不同实现,体现了以软件和在线服务为核心的思想,区别于iPhone和Symbian的以手机为核心的思路。现在还说不好这两种思路谁对谁错。但是,我不选择iPhone还有一个非常重要的原因:我没有Mac电脑,所以无法搭建开发环境。如果将来iPhone落败,这将是一个非常致命的失误。 开发环境 好了,先来介绍一下开发环境,我的操作系统是Windows Vista,没有安装Visual Studio开发工具(不是我平时的工作用机)。第一步是访问Android主页,通过Google是很容易访问到的。必须承认,Android文档已经比我半年前访问时有很大的提高了,可以很容易地找到如何安装开发环境的指南。对于我们这些非Java开发者来说,这非常有用。 我安装的软件包括: JDK 6 Eclipse 3.4(我装了个支持JavaEE的版本) Android SDK 1.0 ADT(Android的Eclipse插件) 这些软件的链接在Android主页上都有。我首先安装了JDK 6,然后解压缩了Eclipse 3.4,无须安装;接下来是Android SDK 1.0也无须安装。 首先,我们要将Android SDK设置到环境变量中。在Android SDK的目录中包括docs、samples和tools目录,而我们需要将tools目录,设置到环境变量中的Path变量。 这一步完成后,我们需要进入Eclipse来设置Android的开发环境了。第一次启动Eclipse还是比较慢的,也可能是我装了JavaEE版本的原因? 进入Eclipse 3.4主界面后,我们就要设置ADT(Android开发的Eclipse插件),分为两步: 第一步,选择Help菜单中的Software Updates,会弹出Software Updates and Add-ons对话框,选择到Available Software标签页上: 点击Add Site按钮,在弹出的对话框中输入: https://dl-ssl.google.com/android/eclipse/ 输入URL之后,点击OK按钮,我们就能在列表中看到Android的URL,在下边Developer Tools节点下有两种:分别是Android开发工具和Android编辑器。点击Install按钮,安装Android开发工具。 通过一个向导之后,Android开发工具的安装就完成了。 第二步,设置Android SDK的位置,在Windows菜单里选择Preferences,进入对话框。然后再左侧的列表中选择Android。然后选择SDK Location后的Browse按钮,选择Android SDK所在的位置。 设置完成之后,Android开发环境的设置就完成了。跟Windows Mobile的开发环境比较一下,因为Visual Studio 2003以后版本都内置了对Windows Mobile开发的支持,所以Android安装时还是有一些复杂的,不过考虑到如果在Visual Studio中支持Windows Mobile新版本的话,其实只是多了设置SDK一个步骤。因为有详细的文档,所以Android开发环境的配置并不能,可以打8分。 Windows Mobile Android 开发环境配置 9分 8分 第一个程序 接下来就要开发第一个应用程序了,从HelloAndroid开始吧,在开发文档中也有详细的指导。 首先,在Eclipse的主界面里选择File菜单中的New-Project,呵呵,与Visual Studio的新工程创建步骤是一致的。 在弹出的New Project对话框中,选择Android节点下的Android Project。 然后是创建Android工程的向导,Project Name、Package Name、Activity name和Application name是需要填写的部分,我们选择Create new project in workspace,创建一个全新的工程。 接下来就进入的就是Eclipse的主界面了。 为了能够更快的看到Android应用的效果,我们就不修改代码了。接下来对Debug进行设置。选择主菜单上的Run-Run Configurations选项(这是Eclipse 3.4的情况,Eclipse 3.3中是Run-Open Run Dialog)。 在弹出对话框的左侧,选择Android Application,为了增加一个新的配置,我们需要双击Android Application,下面会出现New_configuration节点。右边的对话框,Name中填写的是该配置的名称;然后在Project对话框添加的工程名称,要和创建的工程名称一致;在Launch选择对应的Java包。最后点击Apply按钮保存配置文件。 好了,最后选择Debug按钮,就可以启动模拟器,看到应用程序的运行效果了。如下图: 总的来说,Android的开发环境非常好,让第一次使用的人感到非常舒服,完善的文档也是帮助开发者入门的很重要一步。 好了,继续评分: Windows Mobile Android 开发环境配置 9分 8分 创建应用程序 9分 9分 调试运行 8分 6分 开发文档 8分 9分 本文转自马宁博客园博客,原文链接:http://www.cnblogs.com/aawolf/archive/2008/09/26/1299625.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

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

用户登录
用户注册