首页 文章 精选 留言 我的

精选列表

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

Python机器学习(sklearn)——分类模型评估与调参总结(下)

21.集成方法有随机森林(random forest)和梯度提升树(gradient boosted decision tree)GBDT 随机森林中树的随机化方法有两种: (1)通过选择用于构造树的数据点构造随机森林需要确定用于构造的树的个数为了确保树与树之间的区别,对每棵树的数据进行自助采样从样本数据中有放回的多次抽取(一个样本可能被抽取多次),抽取创建的新数据集要和原数据集大小相等(数据数量相同) (2)通过选择每次划分测试集的特征在每个节点处,算法随机选择特征的一个子集,并对其中一个特征寻找最佳测试,而不是对每个节点都寻找最佳测试。使用参数max_features, 如果max_features= n_features,则每次考虑所有特征,即第二种随机性没用上当max_features较大,随机森林中每棵树都会很相似(因为采用的

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

Python机器学习(sklearn)——分类模型评估与调参总结(上)

1.如果只划分测试集和训练集 经验是75%作为训练集 sklearn中的train_test_split()默认这样划分from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split() 2.通常使用sklearn中的score方法计算结果的精度(正确预测比例) 3.KNN算法有两个重要参数:邻居个数和数据点之间距离的度量方法在实践中,选择较小的邻居个数(例如3或5个)效果较好,sklearn中默认使用欧氏距离构建KNN模型速度很快,若训练集很大(特征数多或样本数多),预测速度可能较慢对于稀疏数据集(大多数特征值为0),KNN效果很不好 4.普通最小二乘法,即要求预测值和真实值均方误差最小

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

Java 学习(11)--继承/final 关键字/多态/抽象类

1.继承 (1)继承:子类可以自动拥有父类的非私有的成员变量和成员方法 (2)Java中如何表示继承呢?格式是什么呢? A:用关键字 extends表示 B:格式: class 子类名 extends 父类名 {} 示例: (3)继承的好处: A:提高了代码的复用性 B:提高了代码的维护性 C:让类与类产生了一个关系,是多态的前提 (4)继承的弊端: A:让类的耦合性增强。这样某个类的改变,就会影响其他和该类相关的 类。 原则:低耦合,高内聚。 耦合:类与类的关系 内聚:自己完成某件事情的能力 B:打破了封装性 (5)Java中继承的特点 A:Java中类只支持单继承(当多继承有重复的方法时,子类调用方法时无法判断是哪个方法) B:Java中可以多层(重)继承(继承体系) (6)继承的注意事项 A:子类不能继承父类的私有成员,只能继承父类所有的非私有成员 B:子类不能继承父类的构造方法,但是可以通过 super 去访问 C:不要为了部分功能而去继承 (7)什么时候使用继承呢 ? A:继承体现的是: is a 的关系。 B:采用假设法 (8)Java继承中的成员关系 A:成员变量 a:子类的成员变量名称和父类中的成员变量名称不一样 b:子类的成员变量名称和父类中的成员变量名称一样, 子类的方法访问变量的查找顺序: 在子类方法的局部范围找,有就使用。 在子类的成员范围找,有就使用。 在父类的成员范围找,有就使用。 找不到,就报错。 示例a 示例b 输出: ls 输出: ww 在子类方法的局部范围找,有就使用。 在子类的成员范围找,有就使用。 在父类的成员范围找,有就使用。 找不到,就报错。 B:构造方法 a:子类的构造方法默认会去访问父类的无参构造方法 是为了子类访问父类数据的初始化 b:父类中如果没有无参构造方法,怎么办 ? 子类通过 super去明确调用带参构造 子类通过 this 调用本身的其他构造, 但是一定会有一个去访问了 父类的构造 让父类提供无参构造 C:成员方法 a:子类的成员方法和父类中的成员方法名称不一样 b:子类的成员方法和父类中的成员方法名称一样,这个怎么访问呢 ? 通过子类对象访问一个方法的查找顺序: 在子类中找,有就使用 在父类中找,有就使用 找不到,在父类的父类中找,有就使用;都没有就报错 类和类之间的关系: 1.继承 <strong>class Fu{} class Zi extends Fu{}</strong> 2.组合:一个类是另一个类的成员变量 <strong>class Cat{} class person{ Cat cat; String name; }</strong> 3.关联:一个类是另一个类方法的参数 <strong>class Car{} class Driver{ public void drive (Car car){ } }</strong> 耦合:用来形容类和类之间的关系,耦合性越强说明类和类之间的关联越强 耦合性:继承 > 组合 > 关联 面试题: 1.Override和Overload的区别?Overload是否可以改变返回值类型 ? 答:方法重写:在父子类中,子类重写父类的方法,出现和父类中一模一样的方法声明的现象。 特点:1.如果方法名不同,调用对应的方法 2.如果方法名相同,最终使用的是子类自己的 注意:1.父类中私有方法不能被重写 2.子类重写父类方法时,访问权限要更高 3.父类静态方法,子类也必须通过静态方法进行重写 方法重载:同一个类中,出现的方法名相同,参数列表不同的现象。方法重载能改变返回值类型,因为它和返回值类型无关。 2.this和super的区别和各自的作用 ? 答 :this: 代 表 当 前 类 的 对 象 引 用 super:代表父类存储空间的标识。 (可以理解为父类的引用, 通过这个东西可以访问父类的成员 ) 数据初始化的面试题 A:一个类的初始化过程 1.成员变量的初始化默认初始化 2.显示初始化 3.构造方法初始化 B:子父类的构造执行过程:先进行父类初始化,然后进行子类初始化。 2.final 关键字 (1)是最终的意思,可以修饰类,方法,变量。 (2)特点: A:它修饰的类,不能被继承。 B:它修饰的方法,不能被重写(可以被继承)。 C:它修饰的变量,是一个常量(只能被赋值一次,不能再更改) 输出:ls final 修饰后 不赋值会报错 输出:张三 6 final 修饰形参 报错 (3)面试相关: A:局部变量 a:基本类型值不能发生改变 b: 引用类型地址值不能发生改变,但是对象的内容是可以改变的 B:初始化时机 a:只能初始化一次。b: 常见的给值定义的时候。 (推荐 )构造方法中。 3.多态 ( 掌握 ) (1)定义:同一个对象在不同时刻体现出来的不同状态(同一个变量调用同一个方法,执行不同的代码)。 输出:动物吃 输出:小猫吃鱼 多态示例: 输出:小狗吃肉 (2)多态的前提: A:有继承或者实现关系。 B:有方法重写。 C:有父类或者父接口引用指向子类对象。 (3)多态的分类: a:具体类多态 <strong>class Fu {} class Zi extends Fu {} Fu f = new Zi(); </strong> b: 抽象类多态 <strong>abstract class Fu {} class Zi extends Fu {} Fu f = new Zi(); </strong> c:接口多态 <strong>interface Fu {} class Zi implements Fu {} Fu f = new Zi();</strong> (3)多态中的成员访问特点 A:成员变量:编译看左边,运行看左边(无多态) B:构造方法:子类的构造都会默认访问父类构造 C:成员方法:编译看左边,运行看右边 D:静态方法:编译看左边,运行看左边(无多态) (4)多态的好处: A:提高代码的维护性 (继承体现) B:提高代码的扩展性 (多态体现) (5)多态的弊端: 父不能使用子的特有功能。 现象: 子可以当作父使用,父不能当作子使用。 (6)多态中的转型 A:向上转型 :从子到父 B:向下转型:从父到子 示例: 4.抽象类 ( 掌握 ) (1)把多个共性的东西提取到一个类中,这是继承的做法。 但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体不一样。 也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。 所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。 而一个没有具体的方法体的方法是抽象的方法。 在一个类中如果有抽象方法,该类必须定义为抽象类。 (2)抽象类的特点 A:抽象类和抽象方法必须用关键字 abstract 修饰 B:抽象类中不一定有抽象方法 ,但是有抽象方法的类一定是抽象类 C:抽象类不能实例化,就是用来被继承的(强制继承类中的方法,这个抽象类实际上是定义规范的) D:抽象类的子类 a:是一个抽象类。b: 是一个具体类。这个类必须重写抽象类中的所有抽象方法。 (3)抽象类的成员特点: A:成员变量:有变量,有常量 B:构造方法:有构造方法,不能实例化 C:成员方法:有抽象,有非抽象 (4)抽象类的练习 A:猫狗案例练习B:老师案例练习C:学生案例练习D:员工案例练习 (5)抽象类的几个小问题 A:抽象类有构造方法,不能实例化,那么构造方法有什么用 ? 用于子类访问父类数据的初始化 B:一个类如果没有抽象方法 ,却定义为了抽象类,有什么用 ? 可以,为了限制类的实例化,只想让继承 C:abstract 不能和哪些关键字共存 a:final 冲 突(final 类不能被继承,abstract抽象类只能被继承) b:private 冲 突(私有的不能被继承) c:static 无意义 (static 本来就不能实例化,不能继承) 参数传递 问题:猎人拿着猎枪去打猎物,拿着猎物去酒吧换酒 类:猎人 猎枪 猎物 酒吧 酒 输出:孟凡宝拿着AK47打了一个小兔子 思路

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

干货|一篇文章带你学习分布式事务

小蚂蚁说: 分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在这几年越来越火的微服务架构中,几乎可以说是无法避免,本文就围绕分布式事务各方面与大家进行介绍。 一. 事务 1.1 什么是事务 数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 事务拥有以下四个特性,习惯上被称为ACID特性: 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态是指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能被观察到(这层语义也有说应该属于原子性)。 隔离性

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

Mysql 用中间件atlas进行读写分离(学习笔记十四)

〇 Atlas架构介绍 Atlas是Qihoo360开发的一个中间件,位于Client和MySQL Server中间层,可以作为读写分离,分库分表中间件。 对于MySQL Server而言,Atlas像是个Client,而对于Client而言,Atlas则是一个DB server。 〇 实验结构 OS: CentOS 6.5 64bit MySQL version: 5.6.30 Master:192.168.1.185 Slave:192.168.1.186 proxy(Atlas):192.168.1.187 客户端:192.168.1.192 〇MySQL部分: (主从建立步骤略) 主/从上建立具有增删改查账号: GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'dev'@'192.168.1.187' IDENTIFIED BY 'dev'; FLUSH PRIVILEGES; 从库上可以设置: SET GLOBAL read_only=1; 如果该从库永远不用做master,可以写到配置文件中。 〇Atlas部分: Atlas开发者给出部分建议: 1、Atlas只能运行在64bit的发行版本上 2、若曾经安装过,在新安装时会报错:如“file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64”,此时需要sudo rpm –e Atlas-1.0.3-1.x86_64,再执行新的安装。 3、建议使用MySQL 5.6,此外,不宜小于MySQL 5.1 在proxy机上安装Atlas: wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm rpm -ivh Atlas-2.2.1.el6.x86_64.rpm 通过rpm包安装方式,默认的配置文件在 /usr/local/mysql-proxy/conf/test.cnf 首先可以先获取一下之前步骤中,dev@'192.168.1.187'这个用户加密后的密码: # /usr/local/mysql-proxy/bin/encrypt dev A2OS3vFVUmY= 因为之前给dev用户的密码的明文是dev,所以此处也对dev加密,加密后的密码输出在其后,也就是A2OS3vFVUmY=这个密码稍后要添加到Atlas配置文件中。 test.cnf配置文件内容可以参考这个: [mysql-proxy] # 基础设置 # 以守护进程方式启动 daemon = true #设置atlas的运行方式,若为true,则表示多一个monitor,该进程会在woker进程挂掉后将其重启。若为false,则只有一个工作进程woker。 keepalive = true # atlas实例名,便于区分一台机子上的不同atlas instance = test # 工作线程数,atlas开发人员推荐将其设置为CPU个数的2~4倍。 event-threads = 8 # SQL日志的开关,共有三个可选项:OFF、ON、REALTIME,分别为:不记录sql日志、记录sql日志,并等待缓冲区填满后,才会落地到磁盘、记录sql日志并实时写入磁盘。 sql-log = OFF # 等同于客户端连接到mysql-server后输入SET names utf8; charset = utf8 # 如果这样配置,可以通过mysql -h127.0.0.1 -P2345 -uadmin -padmin可以连接到Atlas管理界面 admin-username = admin admin-password = admin # 该参数设置Atlas后台管理地址和端口 admin-address = 192.168.1.187:2345 # 设置主库和从库的地址,其中主库为写库,从库为只读库 # 主库地址 proxy-backend-addresses = 192.168.1.185:3306 # 设置读库地址和端口 proxy-read-only-backend-addresses = 192.168.1.186:3306 # 若配置为主库也分担读请求,并且设置权重为 (主:从)=(1:3),则可以写作 #proxy-read-only-backend-addresses = 192.168.1.185:3306@1, 192.168.1.186:3306@3 # 设置Atlas工作监听的地址和端口,应用程序将连接到这个地址,既然客户端把Atlas当做一个mysql-server,故此处直接写成3306端口 proxy-address = 192.168.1.187:3306 # 设置用户的密码(这个密码为MySQL中dev用户通过Atlas加密程序加密后的密码),多个可以用逗号隔开 pwds = dev:A2OS3vFVUmY= # 设置Atlas日志信息,其中log-level有message、warning、critical、error、debug五个级别 log-level = message # 日志存放的路径,日志名为$instance_name.log,比如$log-path/test.log log-path = /usr/local/mysql-proxy/log # 设置允许连接Atlas的客户端ip,非必须,可以是多个,可以是精准ip也可以是ip段,比如: #client-ips = 127.0.0.1, 192.168.1 #挂接lvs的物理网卡ip,若有lvs结构,且设置了client-ips,则必须设置此项,反之可不设置。 #lvs-ips = 192.168.1.1 配置好后,直接启动就好: /usr/local/mysql-proxy/bin/mysql-proxyd test start 其中test为配置文件中instance的值。 当然可以检查一下是否已经启动成功: /usr/local/mysql-proxy/bin/mysql-proxydteststatus MySQL-Proxyoftestis running(5176) MySQL-Proxyoftestis running(5177) 比如这样就可以连接到Atlas后台界面: mysql -h192.168.1.187 -P2345 -uadmin -padmin 进去之后可以查看当前配置的DBserver和状态。 mysql>SELECT*FROMbackends; +-------------+--------------------+-------+------+ |backend_ndx|address|state|type| +-------------+--------------------+-------+------+ |1 |192.168.1.185:3306|up|rw| |2|192.168.1.186:3306|up|ro| +-------------+--------------------+-------+------+ 2 rowsinset(0.00 sec) 当然更多的选项可以通过SELECT * FROM help;来获取: mysql> SELECT * FROM help; +----------------------------+---------------------------------------------------------+ | command| description| +----------------------------+---------------------------------------------------------+ | SELECT * FROM help| shows this help| | SELECT * FROM backends| lists the backends and their state| | SET OFFLINE $backend_id| offline backend server, $backend_id is backend_ndx's id | | SET ONLINE $backend_id| online backend server, ...| | ADD MASTER $backend| example: "add master 127.0.0.1:3306", ...| | ADD SLAVE $backend| example: "add slave 127.0.0.1:3306", ...| | REMOVE BACKEND $backend_id | example: "remove backend 1", ...| | SELECT * FROM clients| lists the clients| | ADD CLIENT $client| example: "add client 192.168.1.2", ...| | REMOVE CLIENT $client| example: "remove client 192.168.1.2", ...| | SELECT * FROM pwds| lists the pwds| | ADD PWD $pwd | example: "add pwd user:raw_password", ...| | ADD ENPWD $pwd| example: "add enpwd user:encrypted_password", ...| | REMOVE PWD $pwd| example: "remove pwd user", ...| | SAVE CONFIG| save the backends to config file| | SELECT VERSION| display the version of Atlas| +----------------------------+---------------------------------------------------------+ 其他参数: sql-log-slow=10 # 类似于mysql的long_query_time,如果设置了该选项,则日志只记录超过该值的日志记录,若没有添加这个参数选项,则表示全部记录,单位为ms wait-timeout=10 # Atlas会关闭超过该时间之后一直未活跃的连接,单位s tables=db_name.table_name.user_id.100 # 分表设置,其中格式为:【库名.表名.分表字段.子表数量】,若设置多项则用逗号分隔。注,子表必须已经存在,其中子表命名规则为:【表名_数字】,范围为【0,子表数量-1】,即百表为table_name_0 table_name_1...table_name_99。 〇测试: 为了方便看到请求是否读写分离,可以先在master & slave两个实例上打开general_log,并放入表中: SETGLOBAL log_output='TABLE'; SETGLOBAL general_log=on; master上创建一张测试表: master>CREATETABLEtest.a(idint); Query OK,0 rows affected(0.03 sec) 然后再到客户端(192.168.1.192)尝试对Atlas(192.168.1.187)发起增删改查请求: 此处写了一个php脚本来模拟请求: <?php $con=mysql_connect("192.168.1.187","dev","dev"); if(!$con){ die('connect error: '.mysql_error()); } mysql_select_db("my_db",$con); mysql_query("INSERT INTO test.a SELECT 1;"); mysql_query("UPDATE test.a SET id=222 WHERE id=1;"); mysql_query("DELETE FROM test.a WHERE id=222;"); mysql_query("INSERT INTO test.a SELECT 123456;"); mysql_query("SELECT count(1) FROM test.a;"); mysql_close($con); ?> 此处可以通过yum install -y php php-mysql来安装一下php相关依赖。 执行这个php脚本后,可以分别检查一下master(192.168.1.185)和从库(192.168.1.186)的general log: master>SELECTuser_host,argument ->FROM mysql.general_log ->WHERE user_host='dev[dev] @ [192.168.1.187]'; +-----------------------------+-------------------------------------+ |user_host|argument| +-----------------------------+-------------------------------------+ |dev[dev]@[192.168.1.187] |INSERTINTOtest.a SELECT 1| |dev[dev]@[192.168.1.187]|UPDATEtest.a SET id=222 WHERE id=1| |dev[dev]@[192.168.1.187]|DELETE FROMtest.a WHERE id=222 | |dev[dev]@[192.168.1.187]|INSERTINTOtest.a SELECT 123456 | +-----------------------------+-------------------------------------+ 4 rowsinset(0.00 sec) slave>SELECT user_host,argument ->FROM mysql.general_log ->WHERE user_host='dev[dev] @ [192.168.1.187]'; +-----------------------------+-----------------------------+ |user_host|argument| +-----------------------------+-----------------------------+ |dev[dev]@[192.168.1.187]|SELECT count(1)FROMtest.a| +-----------------------------+-----------------------------+ 1 rowsinset(0.00 sec) 最后再检查一下跑完这个php脚本后的test.a表的数据,是否和预期的一致: slave> SELECT * FROM test.a; +--------+ | id | +--------+ | 123456 | +--------+ 1 row in set (0.00 sec) 当然,显然是与预期一致。 显然Atlas作为proxy,已经将写请求提交给master(192.168.1.185),将读请求提交给slave(192.168.1.186)。 对于客户端和开发人员,只需要获取一个Atlas的服务器地址、端口、用户名及密码便可使用读写分离。 Atlas也可以实现分表功能,此处可自行翻阅Atlas Home。

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

Nginx 搭建FTP图片服务器(学习笔记二十四)

一、需要的组件 图片服务器两个服务: Nginx(图片访问): 1、http服务:可以使用nginx做静态资源服务器。也可以使用apache。推荐使用nginx,效率更高。 2、反向代理 实现 负载均衡 ftp服务(图片上传): 使用linux做服务器,在linux中有个ftp组件vsftpd。 二、Nginx服务器搭建 1.安装Nginx 要求安装vmware虚拟机。 Linux:CentOS6.4(32) Nginx:1.8.0 Vsftpd:需要在线安装。 虚拟机以及Linux安装很简单此处略。 Linux的局域网IP为:192.168.1.110 修改Linux的IP并立即生效的命令: [java]view plaincopy #切换root管理员用户 [root@localhost~]#su password #设置本机IP并立即生效 [root@localhost~]#ifconfigeth0192.168.1.110netmask255.255.255.0 1.1、nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境。 n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:yum install gcc-c++ n PCRE PCRE(PerlCompatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。 [java]view plaincopy [root@localhost~]#yuminstall-ypcrepcre-devel 注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。 n zlib zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。 [java]view plaincopy [root@localhost~]#yuminstall-yzlibzlib-devel n openssl OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。 nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。 [java]view plaincopy [root@localhost~]#yuminstall-yopensslopenssl-devel 1.2、把nginx安装包nginx-1.8.0.tar.gz上传到服务器。 在secureCRT打开sftp会话框,上传文件 使用put/get命令 或者直接拖拽文件 1.3、解压缩(在安装包所在目录执行) [java]view plaincopy [root@localhost~]#tar-zxvfnginx-1.8.0.tar.gz 在root@bogonnginx-1.8.0目录下 ./configure && make && make install //在这里吃过亏 1.5、编译安装 编译: [java]view plaincopy [root@localhostnginx-1.8.0]#make 安装: [java]view plaincopy [root@localhostnginx-1.8.0]#makeinstall 安装成功以后进入安装目录(创建makedir时指定的”--prefix=/usr/local/nginx \“) [java]view plaincopy [root@localhostnginx-1.8.0]#cd/usr/local/nginx/ 2、nginx运行 2.1、启动nginx [java]view plaincopy [root@localhostnginx]#cdsbin [root@localhostsbin]#./nginx 2.2、关闭 [java]view plaincopy [root@localhostsbin]#./nginx-sstop 2.3、重新加载配置文件 [java]view plaincopy [root@localhostsbin]#./nginx-sreload 2.4、关闭防火墙 [java]view plaincopy [root@localhost]#/sbin/iptables-IINPUT-ptcp--dport80-jACCEPT [root@localhost]#/etc/init.d/iptablessave [root@localhost]#/etc/init.d/iptablesrestart 2.5、访问nginx服务 顺便给新手推荐一个无意中发现的Java网站,感觉超级适合入门级的Java开发, 基础知识写的挺好,练手项目也很丰富很,基本都是文档形式指导,简明易懂,不像视频一样费时间。 地址是http://how2j.cn?p=24192 3、关于图片服务器配置 进入配置文件目录 [java]view plaincopy cd/usr/local/nginx/conf/ nginx的默认配置文件nginx.config [java]view plaincopy #usernobody; worker_processes1; #error_loglogs/error.log; #error_loglogs/error.lognotice; #error_loglogs/error.loginfo; #pidlogs/nginx.pid; events{ worker_connections1024; } http{ includemime.types; default_typeapplication/octet-stream; #log_formatmain'$remote_addr-$remote_user[$time_local]"$request"' #'$status$body_bytes_sent"$http_referer"' #'"$http_user_agent""$http_x_forwarded_for"'; #access_loglogs/access.logmain; sendfileon; #tcp_nopushon; #keepalive_timeout0; keepalive_timeout65; #gzipon; server{ listen80; server_namelocalhost; #charsetkoi8-r; #access_loglogs/host.access.logmain; location/{ roothtml; indexindex.htmlindex.htm; } #error_page404/404.html; #redirectservererrorpagestothestaticpage/50x.html # error_page500502503504/50x.html; location=/50x.html{ roothtml; } #proxythePHPscriptstoApachelisteningon127.0.0.1:80 # #location~\.php${ #proxy_passhttp://127.0.0.1; #} #passthePHPscriptstoFastCGIserverlisteningon127.0.0.1:9000 # #location~\.php${ #roothtml; #fastcgi_pass127.0.0.1:9000; #fastcgi_indexindex.php; #fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name; #includefastcgi_params; #} #denyaccessto.htaccessfiles,ifApache'sdocumentroot #concurswithnginx'sone # #location~/\.ht{ #denyall; #} } #anothervirtualhostusingmixofIP-,name-,andport-basedconfiguration # #server{ #listen8000; #listensomename:8080; #server_namesomenamealiasanother.alias; #location/{ #roothtml; #indexindex.htmlindex.htm; #} #} #HTTPSserver # #server{ #listen443ssl; #server_namelocalhost; #ssl_certificatecert.pem; #ssl_certificate_keycert.key; #ssl_session_cacheshared:SSL:1m; #ssl_session_timeout5m; #ssl_ciphersHIGH:!aNULL:!MD5; #ssl_prefer_server_cipherson; #location/{ #roothtml; #indexindex.htmlindex.htm; #} #} } 配置图片服务器 方法一、在配置文件server{}中location /{} 修改配置: [java]view plaincopy #默认请求 location/{ root/home/ftpuser/www;#定义服务器的默认网站根目录位置 indexindex.htmlindex.phpindex.htm;#定义首页索引文件的名称 } 其中:/home/ftpuser/www;为创建FTP服务账户ftpuser的根目录下的www目录 方法二、在http{}内配置新服务 [java]view plaincopy server{ listen8080; server_namelocalhost; #charsetutf-8; #access_loglogs/host.access.logmain; #默认请求 location/{ root/home/ftpuser/www;#定义服务器的默认网站根目录位置 indexindex.htmlindex.phpindex.htm;#定义首页索引文件的名称 } } 因为需要开始端口号8080,所以要在防火墙中开启8080端口 [java]view plaincopy [root@localhost]#/sbin/iptables-IINPUT-ptcp--dport8080-jACCEPT [root@localhost]#/etc/init.d/iptablessave [root@localhost]#/etc/init.d/iptablesrestart 三、FTP服务的安装与启动 1、安装vsftpd组件 vsftpd组件为Linux的FTP服务组件,安装方式为在线安装。 [root@localhost~]# yum -y install vsftpd 安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件。 2、添加一个ftp用户 此用户就是用来登录ftp服务器用的。 [java]view plaincopy [root@localhost~]#useraddftpuser 这样一个用户建完,可以用这个登录,记得用普通登录不要用匿名了。登录后默认的路径为 /home/ftpuser. 为这个ftp账户添加密码 [java]view plaincopy [root@localhost~]#passwdftpuser 输入两次密码后修改密码。 3、防火墙开启21端口 因为ftp默认的端口为21,而centos默认是没有开启的,所以要修改iptables文件 [root@localhost~]# vim /etc/sysconfig/iptables 在行上面有22 -j ACCEPT 下面另起一行输入跟那行差不多的,只是把22换成21,然后:wq保存。 还要运行下,重启iptables [java]view plaincopy [root@localhost~]#serviceiptablesrestart 4、修改selinux 外网是可以访问上去了,可是发现没法返回目录(使用ftp的主动模式,被动模式还是无法访问),也上传不了,因为selinux作怪了。 修改selinux: 执行以下命令查看状态: [root@localhost~]# getsebool -a | grep ftp allow_ftpd_anon_write --> off allow_ftpd_full_access --> off allow_ftpd_use_cifs --> off allow_ftpd_use_nfs --> off ftp_home_dir --> off ftpd_connect_db --> off ftpd_use_passive_mode --> off httpd_enable_ftp_server --> off tftp_anon_write --> off 执行上面命令,再返回的结果看到两行都是off,代表,没有开启外网的访问 [root@localhost~]# setsebool -P allow_ftpd_full_access on[root@localhost~]# setsebool -P ftp_home_dir on 这样应该没问题了(如果,还是不行,看看是不是用了ftp客户端工具用了passive模式访问了,如提示Entering Passive mode,就代表是passive模式,默认是不行的,因为ftp passive模式被iptables挡住了,下面会讲怎么开启,如果懒得开的话,就看看你客户端ftp是否有port模式的选项,或者把passive模式的选项去掉。如果客户端还是不行,看看客户端上的主机的电脑是否开了防火墙,关吧) FileZilla的主动、被动模式修改: 菜单:编辑→设置 5、关闭匿名访问 修改/etc/vsftpd/vsftpd.conf文件: 重启ftp服务: [root@localhost~]# service vsftpd restart 6、开启被动模式 默认是开启的,但是要指定一个端口范围,打开vsftpd.conf文件,在后面加上 pasv_min_port=30000pasv_max_port=30999 表示端口范围为30000~30999,这个可以随意改。改完重启一下vsftpd 由于指定这段端口范围,iptables也要相应的开启这个范围,所以像上面那样打开iptables文件。 也是在21上下面另起一行,更那行差不多,只是把21 改为30000:30999,然后:wq保存,重启下iptables。这样就搞定了。 7、设置开机启动vsftpd ftp服务 [root@localhost~]# chkconfig vsftpd on 四、部署验证 在www下新建文件夹images,下面放一张图片001.jpg 测试访问:http://192.168.1.110/images/001.jpg 这是转载过来的,需要注意的是nginx.conf配置文件最上面的那个 “# user nobody”要改成 “user ftpuser”,不然访问可能会出现403错误

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

量子学习及思考7-量子基本数学知识

NM的才刚入门就是一堆数学知识,可见数学才是一切科学的本源.所谓狗屁科学,只不过是数学的一个实例或者是一个近似的表达而已.越接近数学的,离正确性越近. 本人数学基础太垃圾,好在现在有互联网,本人说过,程序员+互联网=超人,有说过吗?有,只不过现在明确提出这个超人定理: 超人定理:超人=程序员+互联网 我们再看看其它的算法: 计算机系统=软件+硬件 人=肉体+灵魂(就是你大脑里正在运行的程序,或者叫思想) 程序=算法+数据结构 程序员=人+程序 互联网=数据+知识+数据+知识+数据 + ... 超人=肉体+灵魂+算法+数据结构+数据+知识+数据+知识+... 所以这里的程序员并非一般意义上的程序员,而是指可以具有能力无限应用计算机系统及互联网的人,人的精力,时间是有限的,所

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

Jenkins +maven+tomcat自动构建部署(学习笔记三十六)

https://my.oschina.net/denglz/blog/524154 摘要: jenkins + maven + svn + tomcat 自动部署 jenkins 是做什么用的,如果不知道请自行google 通俗的说 jenkins 可以帮助我们编译发布代码,比如我们提交到SVN后,要发布运行,就可以用过jenkins进行编译运行 环境(这里主要标注下我的环境): 1: SVN服务器 项目检出地址https://192.168.1.22/svn/trunk/crm(centos) 2: maven 私服http://192.168.1.23:8080(cnetos) 3: tomcat web serverhttp://192.168.1.24:10086 (centos) #这个tomcat我使用的不是8080因为这个端口要让jenkins来使用.当然这些不是固定的!! 注: 因为我这边是测试环境,就吧jemkins放到了tomcat web server 上. 正式部署jenkins A:登录192.168.1.24部署jenkins #我使用的帐号是root,你可以用其它的. 这台机器安装了tomcat7 和 JDK8, 主要用到了下面两个环境变量. export JAVA_HOME=/usr/local/jdk8#环境变量 export CATALINA_HOME=/usr/local/tomcat7 mkdir -p/usr/local/jenkins #用来存放下载的jenkins 下载地址:http://mirrors.jenkins-ci.org/war/在这里选择安装版本 wgethttp://mirrors.jenkins-ci.org/war/1.588/jenkins.war #我这里下载的版本是1.588 是14年11月更新的. 我安装最新的版本的时候没能正确安装部署war到tomcat server的插件...能力问题.. 执行命令 java -jar jenkins.war #如果报类似下面的警告执行这个命令 java -Dhudson.DNSMultiCast.disabled=true -jar jenkins.war 十一月19,20144:13:12下午javax.jmdns.impl.DNSIncomingreadAnswer警告:TherewasanOPTanswer.Notcurrentlyhandled.Optioncode:65002data:6DE368DADD8543B8 一般情况到此安装结束. 访问http:192.168.1.24:8080 就能出现jenkins界面 #jenkins默认使用8080 更改端口需要在执行命令的时候添加参数. 注: 执行java -jar jenkins.war 命令以后 在当期用户的家目录会生成一个.jenkins目录, 以后创建的项目,编译生成的war文件都在里面. 如果刚部署好里面应该没有这么多文件. B: 项目的添加 #这个项目的流程 从svn检测代码---> 编译----->发布到tomcat webapps目录. 1:点击 左上角的"新建" 出现下面的界面 注:为例方便我们的java开发人员我们搭建了一个maven私服 , 在crm项目的pom文件里配置了maven私服的地址,在jenkins编译java代码的时候遇到需要jar包回到我们的maven私服去下载. 2:配置crm项目里面的各项内容 a:配置subversion 如图 选择Subversion 配置 Repository URL 配置你svn里面的项目,然后会提示你配置检出项目的用户与密码. 其选项默认 b:点击 "增加构建后操作步骤" 选择 "Deploy war/ear to a contalner" 这个选项是安装插件以后才有的. 安装"Deploy Plugin"插件. 注: 插件下载地址:http://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/plugins/deploy/1.10/deploy.hpi下载插件以后通过 系统管理-->管理插件-->高级 上传插件 然后重启jenkins( 下载地址时间长了也许会失效) c:配置有关编译好的war目录与tomcat的相关配置 WAR/EAR files 这个里面配置的是:相对于jenkins的workspace目录的相对路径. 我的全路径是/root/.jenkins/workspace/crm/crm.adminWeb/target/crm.adminWeb.war context path / #/ 代表的是会把crm.adminWeb.war 换成ROOT.war放到 tomcat的webapps目录. tomcat的信息主要是用户名和密码(来自tomcat-users.xml) 还有tomcat访问的地址http://192.168.1.24:10086 到此 jenkins 部署 自动检出发布java代码完成... 到主界面点击带有绿色箭头的图标进行 检出-->编译--->发布 如下图 #点一下就好了...反映会有一点迟钝. 补充: enkins默认会存放在用户主目录下的.jenkins文件夹中 #这个感觉很不爽..因为jenkins目录以后会边的很大..... 如:Linux root用户:/root/.jenkins 注意:这是linux版本的。windows系统请自行更改。这个值在Jenkins运行时是不能更改的.请先将Jenkins停止运行。 如果查看当前Jenkins目录:系统管理→系统设置→主目录→/root/.jenkins(注意:用户不同,路径也不同) 首先移动用户家目录下的隐藏jenkins目录移动到到指定的目录下面 /storage mv /home/.jenkins /storage/jenkins Jenkins储存所有的数据文件在这个目录下. 你可以通过以下两种方式更改: 使用你Web容器的管理工具设置JENKINS_HOME环境参数. 打开tomcat的bin目录,编辑catalina.sh文件。在#OSspecificsupport.$var_must_besettoeithertrueorfalse.上面添加:exportJENKINS_HOME="/storage/jenkins"#你可以指定别的目录在引号中填入你的路径。 在启动Web容器之前设置JENKINS_HOME环境变量. 用root用户登录编辑profile文件:vi/etc/profile在最后加入:exportJENKINS_HOME=/storage/jenkins#你可以指定别的目录保存,退出后执行:source/etc/profile让配置生效 最后重启jenkins服务就OK了!! /usr/bin/java -Dhudson.DNSMultiCast.disabled=true -jar /usr/local/jenkins/jenkins.war&

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

Jenkins +Gradle实现Android自动化构建(学习笔记三十二)

https://blog.csdn.net/mabeijianxi/article/details/52680283 http://www.liuling123.com/2016/10/jenkins-gradle-auto-build.html Jenkins简介 Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。目前大部分公司都在使用Jenkins来持续构建。 Jenkins下载与安装配置 Jenkins下载 安装Jenkins有两种方式: 第一种就是下载安装包直接安装,下载地址:http://mirrors.jenkins-ci.org 第二种就是下载war包,放到Tomcat中启动。war包下载地址:http://mirrors.jenkins-ci.org/war/, 或者http://updates.jenkins-ci.org/download/war/ 这里因为我电脑上面之前装了Tomcat,所以我使用直接下载war包的方式进行安装。 Jenkins安装 将下载的jenkins.war放到Tomcat下的webapps目录下,然后启动Tomcat。在浏览器中访问”Tomcat访问地址/jenkins”即可安装,因为我的Tomcat装在本机,并且端口为8080,所以访问http://localhost:8080/jenkins/即可进行安装。 Jenkins配置 Jenkins安装之后可以进行用户的权限设置、插件的安装等配置。 用户权限设置 系统管理–>Configure Global Security 如下图所示,在此处可以添加、删除用户以及配置用户权限。 插件安装 搭建Android自动化打包环境需要安装Gradle插件,如果使用Git还需要Git的插件,安装Jenkins时默认已经安装了这两个插件。如果没有安装可以进入“系统管理>管理插件”进行插件的安装。 创建Jenkins任务 要想Jenkins能够帮我们自动构建项目,我们需要创建一个任务,并且配置这个任务要它帮我们执行什么操作,以及什么时候执行等。 如上图所示,点击“新建”按钮并且选择“构建一个自由风格的软件项目”,完了之后会进入到任务的配置界面,配置好之后任务会出现在如上图右边的任务列表中。 任务配置 创建一个任务之后,会自动跳转到任务的配置界面对该任务进行配置,大概包括如下配置: 源码管理 构建项目,当然得有代码了。Jenkins支持使用版本控制工具来进行源码管理,比如Git或者SVN。这里我使用的是Git,项目使用的是我的github上面的一个多渠道打包的demo。在Repository URL中输入项目地址,点击Add按钮添加认证信息,然后选择构建的分支,我这里使用的是master分支。 构建触发器 Jenkins支持上图所示的触发时机配置,如果都不选,则为手动构建,需要点击“立即构建”按钮才构建。 Build periodically:周期进行项目构建(它不关心源码是否发生变化); Build when a change is pushed to GItHub:表示只要GitHub上面源码一更新即进行构件; Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作。 Build periodically和Poll SCM都支持日程表的设置,这个与Spring框架中定时器的日程表配置类似,有5个参数: 第一个参数代表的是分钟 minute,取值 0~59; 第二个参数代表的是小时 hour,取值 0~23; 第三个参数代表的是天 day,取值 1~31; 第四个参数代表的是月 month,取值 1~12; 最后一个参数代表的是星期 week,取值 0~7,0 和 7 都是表示星期天。 如: 选择Build periodically并设置日程表为“0 4”,则表示每天凌晨4点构建一次源码。 选择Poll SCM并设置日程表为“ /10”,则表示每10分钟检查一次源码变化,如果有更新才进行构建。 构建工具 因为现在Android项目默认都是使用Gradle来进行构建的,所以在构建中我选择的是Invoke Gradle script。当然你也可以选择其它的构建工具,比如Ant。 选择Invoke Gradle script之后可以选Invoke Gradle和Use Gradle Wrapper,选择Invoke Gradle就是调用本地安装配置好的Gradle,此时需要指定Gradle路径。为了方便所有开发者同意Gradle版本,一般都使用Gradle Wrapper。关于Gradle和Gradlew的区别可以看这篇文章https://www.zybuluo.com/xtccc/note/275168。 Tasks中填上需要执行的gradle的task。上面我填的clean assembleRelease,即执行gradlew clean assembleRelease。 构建后的操作 配置构建后的操作可以让Jenkins在构建完之后执行什么操作,比如邮件通知、构建其它项目等。 这里我配置了Archive the artifacts,在“用于存档的文件”中填写需要存档的文件名,可以使用通配符。比如上面我配置了app/build/outputs/apk/v*.apk,表示疑v开头的apk文件都存档。构建完之后在任务首页可以下载存档的文件。 任务配置完成之后,点击任务首页的“立即构建”按钮,即可开始构建,构建过程首先会将源码下载下来,位于jenkins目录下的workspace中。然后执行配置好的gradle命令,如果使用gradlew,第一次应该会下载gradlew设置的版本的gradle,最后执行构建任务。构建完之后,如下图,可以看到存档的文件,点击即可下载。 附:Android工程build.gradle文件 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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 apply plugin:'com.android.application' android { compileSdkVersion23 buildToolsVersion"23.0.2" defaultConfig { applicationId"com.lauren.multichanneldemo" minSdkVersion17 targetSdkVersion23 versionCode1 versionName"1.0" } signingConfigs { release { defliulingStoreFile = System.getenv("LIULING_STORE_FILE") defliulingKeyAlias = System.getenv("LIULING_KEY_ALIAS") defliulingKeyPassword = System.getenv("LIULING_KEY_PASSWORD") defliulingStorePassword = System.getenv("LIULING_STORE_PASSWORD") defisSigning = (liulingStoreFile !=null) && (liulingKeyAlias !=null) && (liulingKeyPassword !=null) && (liulingStorePassword !=null) if(isSigning){ storeFilefile(liulingStoreFile) keyAlias liulingKeyAlias keyPassword liulingKeyPassword storePassword liulingStorePassword }else{ storeFilefile("debug.keystore") keyAlias"AndroidDebugKey" keyPassword"android" storePassword"android" } } debug { storeFilefile("debug.keystore") keyAlias"AndroidDebugKey" keyPassword"android" storePassword"android" } } buildTypes { release { // 不显示Log buildConfigField"boolean","LOG_DEBUG","false" //启用混淆代码的功能 minifyEnabledtrue //压缩对齐生成的apk包 zipAlignEnabledtrue //指定混淆规则,需要压缩优化的混淆要把proguard-android.txt换成proguard-android.txt proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' shrinkResourcestrue signingConfig signingConfigs.release//打包命令行:gradlew assembleRelease } debug { signingConfig signingConfigs.debug } } lintOptions { abortOnErrorfalse } // productFlavors { // _91 { // manifestPlaceholders = [MTA_CHANNEL_VALUE: "91"] // } // wandoujia { // manifestPlaceholders = [MTA_CHANNEL_VALUE: "wandoujia"] // } // xiaomi { // manifestPlaceholders = [MTA_CHANNEL_VALUE: "xiaomi"] // } // // _360shoufa{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "360shoufa"] // } // anzhi{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "anzhi"] // } // baidushoufa{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "baidushoufa"] // } // huaweishoufa{ // manifestPlaceholders = [MTA_CHANNEL_VALUE: "huaweishoufa"] // } // } // 如果嫌上面写法麻烦,也可以这样简写,加上一个批量处理即可. productFlavors { _91 {} wandoujia {} xiaomi {} _360shoufa{} anzhi{} baidushoufa{} huaweishoufa{} } //批量处理 productFlavors.all { flavor -> defchannel = name.startsWith("_") ? name.substring(1) : name flavor.manifestPlaceholders = [MTA_CHANNEL_VALUE: channel] } applicationVariants.all { variant -> variant.outputs.each{ output -> defoutputFile = output.outputFile if(variant.buildType.name.equals('release')) { //可自定义自己想要生成的格式 defchannel = variant.productFlavors[0].name.startsWith("_") ? variant.productFlavors[0].name.substring(1) : variant.productFlavors[0].name deffileName ="v${defaultConfig.versionName}_${releaseTime()}_${channel}.apk" output.outputFile =newFile(outputFile.parent, fileName) } } } applyfrom:'productFlavors.gradle' } defreleaseTime() { returnnewDate().format("yyyyMMdd", TimeZone.getTimeZone("UTC")) } dependencies{ compilefileTree(dir:'libs',include: ['*.jar']) testCompile'junit:junit:4.12' compile'com.android.support:appcompat-v7:23.1.1' compile'com.android.support:design:23.1.1' }

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

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

用户登录
用户注册