辰迅云帮助中心

其他类

这篇文章主要介绍了如何解决mysql5.6 utf8设置无效问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。绿色版安装的mysql5.6解压之后,里面会有一个my-default.ini文件,此时,如果直接对my-default.ini文件进行字符集修改,重启之后会发现又会恢复原来的设置,根本无效。解决办法是,复制my-default.ini文件重命名为my.ini我在my.ini配置结果如下:[mysqld]basedir = D:\development tools\mysql\mysql-5.6.20datadir = D:\development tools\mysql\mysql-5.6.20\datasql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES character-set-server=utf8collation-server=utf8_general_ci[client]default-character-set=utf8重启我的mysql服务,命令是net stop mysql,然后net start mysql扩展mysql是干什么用的?MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。感谢你能够认真阅读完这篇文章,希望小编分享的“如何解决mysql5.6 utf8设置无效问题”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注辰讯云资讯频道,更多相关知识等着你来学习!...

小编给大家分享一下Nginx+Keepalived如何实现双机主备,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,起初是专为LVS负载均衡软件设计的,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现web服务端的高可用。Keepalived以VRRP协议为实现基础,VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。下面我们介绍一下nginx keepalived高可用方案的部署安装。环境准备在两台主机上准备如下压缩文件:keepalived-2.0.20.tar.gznginx-1.16.1.tar.gz虚拟IP真实IPnginx端口主从192.168.124.20192.168.124.1380MASTER192.168.124.20192.168.124.1480BACKUP安装nginx新建一个用户:useradd tianyan确定安装目录,我这里的安装目录是:/home/tianyan/tianyan_soft/nginx.install。在这个目录下分别新建两个目录用于安装nginx和keepalived,解压两个压缩包。执行安装命令:./configure --prefix=/home/tianyan/tianyan_soft/nginx.install \ --sbin-path=/home/tianyan/tianyan_soft/nginx.install/sbin/nginx --conf-path=/home/tianyan/tianyan_soft/nginx.install/conf/nginx.conf \ --error-log-path=/home/tianyan/tianyan_soft/nginx.install/error.log \ --http-log-path=/home/tianyan/tianyan_soft/nginx.install/access.log \ --pid-path=/home/tianyan/tianyan_soft/nginx.install/nginx.pid \ --lock-path=/home/tianyan/tianyan_soft/nginx.install/nginx.lock \ --user=tianyan --group=tianyan \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-threads \ --with-pcre \ --http-client-body-temp-path=/home/tianyan/tianyan_soft/nginx.install/client/ \ --http-proxy-temp-path=/home/tianyan/tianyan_soft/nginx.install/proxy/ \  --http-fastcgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/fcgi/ \ --http-uwsgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/uwsgi \ --http-scgi-temp-path=/home/tianyan/tianyan_soft/nginx.install/scgi如果报错,记得安装相关依赖:yum install gcc gcc-c++nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)。注:以非root权限启动时,会出现 nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) 错误。原因:Linux只有root用户可以使用1024一下的端口解决办法:1.按照root权限启动2.将 /usr/local/nginx/conf/nginx.conf 文件中的80端口改为1024以上。安装keepalived./configure --prefix=/usr/local/keepalived上述命令执行完毕后继续执行:make && make install安装完毕后,目录是这个样子:将配置文件拷贝到系统对应的目录下mkdir /etc/keepalived cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived编辑 master 节点的 keepalived.confvim /etc/keepalived/keepalived.conf内容参考如下:! Configuration File for keepalivedglobal_defs {  #一个没重复的名字即可  router_id hyq_slave  }#ng是否运行vrrp_script chk_nginx {    script "/etc/keepalived/nginx_check.sh"    interval 2    weight -20}vrrp_instance VI_1 {  state BACKUP   # 必填,可以是MASTER或BACKUP  interface ens33  virtual_router_id 101  priority 90  advert_int 1  # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式  # 本机ip  unicast_src_ip 192.168.124.14  unicast_peer {    # 其他机器ip    192.168.124.13  }  # 设置nopreempt防止抢占资源  nopreempt  authentication {    auth_type PASS    auth_pass 1111  }  # 与上方nginx运行状况检测呼应  track_script {    chk_nginx  }  virtual_ipaddress {    192.168.124.20  }}编辑 slave 节点的 keepalived.confvim /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {  #一个没重复的名字即可  router_id hyq_slave  }#ng是否运行vrrp_script chk_nginx {    script "/etc/keepalived/nginx_check.sh"    interval 2    weight -20}vrrp_instance VI_1 {  state BACKUP   # 必填,可以是MASTER或BACKUP    interface ens33  virtual_router_id 101  priority 90  advert_int 1  # 如果两节点的上联交换机禁用了组播,则采用vrrp单播通告的方式  # 本机ip  unicast_src_ip 192.168.124.14  unicast_peer {    # 其他机器ip    192.168.124.13  }  # 设置nopreempt防止抢占资源  nopreempt  authentication {    auth_type PASS    auth_pass 1111  }  # 与上方nginx运行状况检测呼应  track_script {    chk_nginx  }  virtual_ipaddress {    192.168.124.20  }}编写nginx_check.sh脚本在/etc/keepalived目录下新建nginx_check.sh脚本touch nginx_check.sh编辑其内容为:#!/bin/shA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ]then /usr/sbin/nginx  sleep 1  A2=`ps -C nginx --no-header |wc -l`  if [ $A2 -eq 0 ]  then  systemctl stop keepalived  fifi含义是:如果 nginx 停止运行,尝试启动,但是如果无法启动,则杀死本机的 keepalived 进程, keepalied将会把虚拟 ip 绑定到 BACKUP 机器上。 注意: /usr/sbin/nginx是nginx的启动命令,如果你安装到其他目录,则相应的替换。Keepalived的日志Keepalived日志默认位置是在/var/log/messages目录下。我们将其修改一下。由于系统是centos7,修改位置为:/lib/systemd/system/keepalived.service原内容:EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalivedExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS修改为:修改完毕后重新加载servicesystemctl daemon-reload创建命令软连接:ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived执行:keepalived -D -f /etc/keepalived/keepalived.conf-D 将日志输出到message日志,默认日志也在message-f 是指定配置文件修改/etc/sysconfig/keepalived把KEEPALIVED_OPTIONS="-D" 修改为:KEEPALIVED_OPTIONS="-D -d -S 0"在/etc/rsyslog.conf 末尾添加local0.*/var/log/keepalived.log最后执行命令:service rsyslog restart重启keepalived后就可以看到日志在/var/log/keepalived.log下了。测试验证VIP当keepalived和nginx都启动后,我们来测试一下。首先在浏览器里面访问三个地址http://192.168.124.20(vip)http://192.168.124.13(master)http://192.168.124.14(slave)我修改了一下nginx的index.html,可以看到当前vip指向是13的master节点:然后,我们手动停止13上的nginx,再次访问http://192.168.124.20。说明安装成功。其中通过ip address命令可以观察到网卡的变化实验到这里,我们就完成了keepalived + nginx 主从配置的安装部署了。思考:如何开启双主模式什么是双主模式?分别介绍一下两种配置1、Nginx+keepalived 主从配置这种方案就是上文介绍过的,使用一个vip地址,前端使用2台机器,一台做主,一台做备,但同时只有一台机器工作,另一台备份机器在主机器不出现故障的时候,永远处于浪费状态,仅仅用于灾备,平时都是空闲着的。2、Nginx+keepalived 双主配置这种方案,使用两个vip地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,如下图:以上是“Nginx+Keepalived如何实现双机主备”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...

这期内容当中小编将会给大家带来有关使用python怎么制作一个云打卡系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的数据类型有哪些?python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点型)。2.字符串,分别是str类型和unicode类型。3.布尔型,Python布尔类型也是用于逻辑运算,有两个值:True(真)和False(假)。4.列表,列表是Python中使用最频繁的数据类型,集合中可以放任何数据类型。5. 元组,元组用”()”标识,内部元素用逗号隔开。6. 字典,字典是一种键值对的集合。7. 集合,集合是一个无序的、不重复的数据组合。1.安装python可以直接下载Python主页,需要路径环境配置,最好下载简单的编辑器。也可以在anaconda平台环境下下载配置,平台自动捆绑Spyder。本文操作使用的是anaconda安装的Python3.7.anaconda是开源的包、环境管理器,可以在同一个机器上安装不同版本的包和依赖,可以在不同的环境中切换。2.代码示例import requests def school_clock(inputAccount , inputPassword , firstLocation , lastLocation ):     ################# 第一个界面:进入登陆界面 ######################    myHeaders1 = {         'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 '        #该页面只允许手机端登录    }     url = 'https://nco.zjgsu.edu.cn/genqrcode/2019032'    r1 = requests.post(url, headers=myHeaders1)      ################# 第一个界面:进入登陆界面后的登录操作 ######################    myHeaders2 = {         'Upgrade-Insecure-Requests': '1',         'Content-Type': 'application/x-www-form-urlencoded',         'Cookie': 'zjgsusessionsid=s%3AGSYaaVwF_2pedsizsHYTYSY64hVl3vL_.NMnLf1bV1PJSAS%2FeZXUkcyPkFpBq%2BcMVQYq4XPHXAAU; _ncov_uuid=a59e0ac8-da06-4fb1-83d8-000976c317a9; _ncov_username=这里直接填入账号; _ncov_psswd=这里直接填入密码',         'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 '    }     myHeaders2['Cookie'] = r1.headers['set-cookie']     payload = {         'name': ' ',         'psswd': ' '    }     payload['name'] = inputAccount     payload['psswd'] = inputPassword     url = 'https://nco.zjgsu.edu.cn/login'    r2=requests.post(url, data=payload, headers=myHeaders2)#登录操作    ################# 第二个界面:填写报送信息 ######################    myHeaders3 = {         'Upgrade-Insecure-Requests': '1',         'Content-Type': 'application/x-www-form-urlencoded',         'Cookie': 'zjgsusessionsid=s%3AOIlBmUda3tnT-fWds6uWEKKADgTt3IAd.zQ1LcseRzDNFPv5EU1AlkyyWeSMz6424x6HK8cbov8Q; _ncov_uuid=03d31c9b-696f-4429-a0ca-6e2b7a2e10ce; _ncov_username=这里也是直接输入账号; _ncov_psswd=这里也是直接输入密码',         'User-Agent': 'Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 '    }     myHeaders3['Cookie'] = r2.headers['set-cookie']     payload2 = {         'uuid': 'a59e0ac8-da06-4fb1-83d8-000976c317a9',         'locationInfo': '%E6%B5%99%E6%B1%9F%E7%9C%81%E6%9D%AD%E5%B7%9E%E5%B8%82',         'currentResd': '%E6%B5%99%E6%B1%9F%E7%9C%81%E6%B8%A9%E5%B7%9E%E5%B8%82%E9%BE%99%E6%B8%AF%E5%B8%82%E4%B8%B4%E6%B8%AF%E8%B7%AF862%E5%8F%B7',         'fromHbToZjDate': '',         'fromHbToZj': 'C',         'fromWtToHzDate': '',         'fromWtToHz': 'B',         'meetDate': '',         'meetCase': 'C',         'travelDate': '',         'travelCase': 'D',         'medObsvReason': '',         'medObsv': 'B',         'belowCaseDesc': '',         'belowCase': 'D',         'temperature': '',         'notApplyReason': '',         'hzQRCode': 'A',         'specialDesc': ''    }     payload2['locationInfo'] = firstLocation     payload2['currentResd'] = lastLocation     url = 'https://nco.zjgsu.edu.cn/'    r3 = requests.post(url, data=payload2, headers=myHeaders2)     print(r3.text)##################调用上述打卡函数###################### school_clock(inputAccount = '这里直接输入账号' ,inputPassword = '这里直接输入密码' ,firstLocation = '这里输入省市地区,如江苏省徐州市' ,lastLocation = '这里输入详细地址,如江苏省徐州市云龙区XXX大学' )3.附加说明(1)以上代码使用函数实现。(2)以上代码中有8个数据需要用户自己输入数据的存储也可以使用txt文件,使用mysql实现数据库,这里由于数据有限而直接分配。(3)注意:不同学校提交的打卡页面可能略有不同,需要用户自己修改post参数,这类网页只能通过手机端进入,若要查看这类网页的开发者模式,必须要带上旧版手机浏览器的User-Agent(eg:”Mozilla/5.0 (Linux; U; Android 2.3.6; en-us; Nexus S Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1”)上述就是小编为大家分享的使用python怎么制作一个云打卡系统了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注辰讯云资讯频道。...

这篇文章主要介绍了Tensorflow怎么获取张量Tensor的具体维数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。获取Tensor的维数>>> import tensorflow as tf>>> tf.__version__'1.2.0-rc1'>>> x=tf.placeholder(dtype=float32,shape=[1,2,3,4])>>> x=tf.placeholder(dtype=tf.float32,shape=[1,2,3,4])>>> x.shape TensorShape([Dimension(1), Dimension(2), Dimension(3), Dimension(4)])>>> x.get_shape() TensorShape([Dimension(1), Dimension(2), Dimension(3), Dimension(4)])# 返回tuple>>> x.shape[2] Dimension(3)>>> x.get_shape()[2] Dimension(3)# 获取具体维度数值>>> x.shape[2].value3>>> x.get_shape()[2].value3# 也可以将TensorShape变量转化为list类型,然后直接按照索引取值>>> x.shape.as_list() [1, 2, 3, 4]>>> x.shape.as_list() [1, 2, 3, 4]# 可以与int型数值比较>>> x.shape[2] == 3True>>> x.get_shape()[2] == 3True感谢你能够认真阅读完这篇文章,希望小编分享的“Tensorflow怎么获取张量Tensor的具体维数”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注辰讯云资讯频道,更多相关知识等着你来学习!...

这期内容当中小编将会给大家带来有关使用Python怎么爬取豆瓣电影名,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Python对代码格式的要求没有那么严格;2、Python属于开源的,所有人都可以看到源代码,并且可以被移植在许多平台上使用;3、Python面向对象,能够支持面向过程编程,也支持面向对象编程;4、Python是一种解释性语言,Python写的程序不需要编译成二进制代码,可以直接从源代码运行程序;5、Python功能强大,拥有的模块众多,基本能够实现所有的常见功能。一、爬虫豆瓣电影名思路分析1、爬虫代理 headers = {         'user-agent':             'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit' +             '/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'    }2、获取网络连接 res = requests.get("https://movie.douban.com/top250", headers=headers)第一个参数就是网址,要确保网址能够打开,第二个参数就是代理。3、对网址进行解析soup = BeautifulSoup(res.text, 'lxml')第一个参数是网站,后缀名".text"是将网站源码转换为文本,方便解析;第二个参数是解析器,而lxml就是一种解析器,用来解析网站。4、匹配所有电影名所在的标签 targets = soup.find_all("div", class_="hd")5、使用简单的for循环,输出标签中的电影名   for each in targets:        print(each.a.span.text)循环输出就可以了,但要注意转换为文本,避免出现乱码的情况。二、爬虫豆瓣电影名简单代码示例import requestsfrom bs4 import BeautifulSoupif __name__ == '__main__':     headers = {         'user-agent':             'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit' +             '/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'    }     res = requests.get("https://movie.douban.com/top250", headers=headers)     print(res.status_code)     soup = BeautifulSoup(res.text, 'lxml')     targets = soup.find_all("div", class_="hd")     for each in targets:         print(each.a.span.text上述就是小编为大家分享的使用Python怎么爬取豆瓣电影名了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注辰讯云资讯频道。...

小编给大家分享一下Python中requests怎样获取网页,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!python有哪些常用库python常用的库:1.requesuts;2.scrapy;3.pillow;4.twisted;5.numpy;6.matplotlib;7.pygama;8.ipyhton等。主要记录使用 requests 模块获取网页源码的方法class Crawler(object): """  采集类  """ def __init__(self, base_url):  self._base_url = base_url   self._cookie = None  self._getCookie()  def _getCookie(self):  """   获取站点cookie   :return:   """  try:    res = requests.get(self._base_url)    res.raise_for_status()    # TODO response.cookies获取到的是一个cookiejar对象,需要使用requests.utils.dict_from_cookiejar来   # TODO 将cookiejar对象转换为一个字典,这个字典后续使用的时候,在请求时直接传入就可以了,   # 如 requests.get(url, cookies=cookies)   self._cookie = requests.utils.dict_from_cookiejar(res.cookies)    print self._cookie   except Exception as e:    print e  def get_html_text(self, url, **kwargs):  """   爬取网页的通用代码框架   :param url:   :param method:   :param kwargs:   :return:   """  try:    kwargs.setdefault('cookies', self._cookie)    res = requests.get(url, **kwargs)    # TODO 若响应状态码不是200, 抛出 HTTPError 异常   res.raise_for_status()    res.encoding = res.apparent_encoding    # print requests.utils.dict_from_cookiejar(res.cookies)   return res.text   except Exception as e:    print traceback.print_exc()    return以上是“Python中requests怎样获取网页”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...

这篇文章主要介绍Linux中获取硬件详细信息的命令是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,使用Linux能运行主要的Unix工具软件、应用程序和网络协议。在Linux系统特别是服务器系统中常常会需要查看设备的硬件信息,这时候使用命令查看就显得非常方便。在Linux系统中查看硬件信息的命令,它们是lspci、lsblk、lscpu 和 lsusb。lspci 命令从命令的名称ls+pci的组合上大致也能看出来,lspci用于显示有关系统中的PCI总线以及与其连接的设备的信息。默认情况下,它显示设备的简短列表,如果配合指定的选项使用可以显示输出更详细的信息。语法格式:lspci [参数]常用参数:选项描述-n以数字方式显示PCI厂商和设备代码-t以树状结构显示PCI设备的层次关系-b以总线为中心的视图-s仅显示指定总线插槽的设备和功能块信息-i指定PCI编号列表文件,不使用默认文件-m以机器可读方式显示PCI设备信息使用示例:默认情况下终端中直接输入该命令,显示当前主机的所有PCI总线信息:lspci输出类似如下:00:00.0 Host bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 DMI2 (rev 04)00:01.0 PCI bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 1a (rev 04)00:02.0 PCI bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2a (rev 04)00:02.2 PCI bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 2c (rev 04)00:03.0 PCI bridge: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 PCI Express Root Port 3a (rev 04)00:05.0 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 VTd/Memory Map/Misc (rev 04)00:05.2 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 IIO RAS (rev 04)00:05.4 PIC: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 IOAPIC (rev 04).....以树状结构显示PCI设备的层次关系:lspci -t输出:-+-[0000:ff]-+-08.0 |           +-09.0 |           +-0a.0 |           +-0a.1 |           +-0a.2 |           +-0a.3 |           +-0b.0 |           +-0b.3 |           +-0c.0 |           +-0c.1 |           +-0c.2 |           +-0c.3 |           +-0d.0 |           +-0d.1 |           +-0d.2 |           +-0d.3 |           +-0e.0 |           +-0e.1 |           +-0f.0 |           +-0f.1 |           +-0f.2 |           +-0f.3 |           +-0f.4 |           +-0f.5 |           +-10.0 |           +-10.1 |           +-10.2 |           +-10.3 |           +-10.4 |           +-10.5 |           +-10.7 |           +-13.0 |           +-13.1 |           +-13.4 |           +-13.5 |           +-16.0 |           +-16.1 |           \-16.2 +-[0000:80]-+-00.0-[81]-- |           +-05.0 |           +-05.2 |           \-05.4......如果想得到更详细的信息,可以使用如下命令:lspci -vvx-vv:使得 lspci 以过冗余模式显示更详细的信息 (事实上是 PCI 设备能给出的所有东西)。这些数据的确切意义没有在此手册页中解释,如果你想知道更多,请参照 /usr/include/linux/pci.h 或者 PCI 规范。-x:以十六进制显示 PCI 配置空间 (configuration space) 的前64个字节映象 (标准头部信息)。此参数对调试驱动和lspci本身很有用。更多关于lspci中说参数说明可以在终端中通过man lspci来查看。lsblk命令lsblk列出有关所有或指定块设备的信息,lsblk列出有关所有或指定块设备的信息。默认情况下,该命令以树状格式打印所有设备(RAM磁盘除外)。语法格式:lsblk [参数]使用示例:默认情况下直接输入命令,类似如下:lsblk输出:NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsda      8:0    0  1.1T  0 disk ├─sda1   8:1    0  500M  0 part /boot├─sda2   8:2    0 31.3G  0 part [SWAP]└─sda3   8:3    0  1.1T  0 part /sr0     11:0    1 1024M  0 rom  NAME : 这是块设备名。MAJ:MIN : 本栏显示主要和次要设备号。RM : 本栏显示设备是否可移动设备。注意,在本例中设备sdb和sr0的RM值等于1,这说明他们是可移动设备。SIZE : 本栏列出设备的容量大小信息。例如298.1G表明该设备大小为298.1GB,而1K表明该设备大小为1KB。RO : 该项表明设备是否为只读。在本案例中,所有设备的RO值为0,表明他们不是只读的。TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda和sdb是磁盘,而sr0是只读存储(rom)。MOUNTPOINT : 本栏指出设备挂载的挂载点。也可以列出指定设备的信息:lsblk /dev/sda输出类似:NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTsda      8:0    0  1.1T  0 disk ├─sda1   8:1    0  500M  0 part /boot├─sda2   8:2    0 31.3G  0 part [SWAP]└─sda3   8:3    0  1.1T  0 part /lsblk命令也可以用于列出一个特定设备的拥有关系,同时也可以列出组和模式。可以通过以下命令来获取这些信息:lsblk -m输出:NAME    SIZE OWNER GROUP MODEsda     1.1T root  disk  brw-rw----├─sda1  500M root  disk  brw-rw----├─sda2 31.3G root  disk  brw-rw----└─sda3  1.1T root  disk  brw-rw----sr0    1024M root  cdrom brw-rw----更多信息可以在终端中输入man lsblk查看。lscpu命令此命令用来显示cpu的相关信息 ,lscpu从sysfs和/proc/cpuinfo收集cpu体系结构信息,命令的输出比较易读。lscpu命令输出的信息包含cpu数量,线程,核数,套接字和Nom-Uniform Memeor Access(NUMA),缓存等 ,不是所有的列都支持所有的架构,如果指定了不支持的列,那么lscpu将打印列,但不显示数据 。语法格式:lscpu [参数]常用参数:参数说明-a打印在线和离线的CPU-b仅打印在线CPU-c仅打印离线CPU-h打印帮助并退出-V打印当前版本号默认情况下,终端中直接输入命令:lscpu输出内容类似如下:Architecture:          x86_64CPU op-mode(s):        32-bit, 64-bitByte Order:            Little EndianCPU(s):                32On-line CPU(s) list:   0-31Thread(s) per core:    2Core(s) per socket:    8Socket(s):             2NUMA node(s):          2Vendor ID:             GenuineIntelCPU family:            6Model:                 62Model name:            Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHzStepping:              4CPU MHz:               1200.000BogoMIPS:              5187.29Virtualization:        VT-xL1d cache:             32KL1i cache:             32KL2 cache:              256KL3 cache:              20480KNUMA node0 CPU(s):     0-7,16-23NUMA node1 CPU(s):     8-15,24-31更多命令详细说明,可以在终端中输入man lscpu命令查看。lsusb命令lsusb命令用于显示本机的USB设备列表,以及USB设备的详细信息。lsusb命令显示的USB设备信息来自“/proc/bus/usb”目录下的对应文件。语法格式:lsusb [参数]常用参数:选项描述-v显示USB设备的详细信息-s<总线:设备号>仅显示指定的总线和(或)设备号的设备-d<厂商:产品>仅显示指定厂商和产品编号的设备-t以树状结构显示无理USB设备的层次-V显示命令的版本信息使用示例:默认情况下,在终端中直接输入命令:lsusb显示USB设备列表:Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching HubBus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching HubBus 001 Device 003: ID 046b:ff10 American Megatrends, Inc. Virtual Keyboard and MouseBus 002 Device 003: ID 0424:2513 Standard Microsystems Corp. 2.0 Hub以树状显示USB设备列表:lsusb -t输出:/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/8p, 480M        |__ Port 5: Dev 3, If 0, Class=hub, Driver=hub/3p, 480M/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/2p, 480M    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/6p, 480M        |__ Port 6: Dev 3, If 0, Class=HID, Driver=usbhid, 12M        |__ Port 6: Dev 3, If 1, Class=HID, Driver=usbhid, 12M显示USB设备详细信息:lsusb -v输出类似:Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubDevice Descriptor:  bLength                18  bDescriptorType         1  bcdUSB               2.00  bDeviceClass            9 Hub  bDeviceSubClass         0 Unused  bDeviceProtocol         0 Full speed (or root) hub  bMaxPacketSize0        64  idVendor           0x1d6b Linux Foundation  idProduct          0x0002 2.0 root hub  bcdDevice            2.06  iManufacturer           3 Linux 2.6.32-642.el6.x86_64 ehci_hcd  iProduct                2 EHCI Host Controller  iSerial                 1 0000:00:1a.0  bNumConfigurations      1  Configuration Descriptor:    bLength                 9    bDescriptorType         2    wTotalLength           25    bNumInterfaces          1    bConfigurationValue     1    iConfiguration          0     bmAttributes         0xe0      Self Powered      Remote Wakeup    MaxPower                0mA    Interface Descriptor:      bLength                 9      bDescriptorType         4      bInterfaceNumber        0      bAlternateSetting       0      bNumEndpoints           1      bInterfaceClass         9 Hub      bInterfaceSubClass      0 Unused      bInterfaceProtocol      0 Full speed (or root) hub      iInterface              0       Endpoint Descriptor:        bLength                 7        bDescriptorType         5        bEndpointAddress     0x81  EP 1 IN        bmAttributes            3          Transfer Type            Interrupt          Synch Type               None          Usage Type               Data        wMaxPacketSize     0x0004  1x 4 bytes        bInterval              12Hub Descriptor:......以上是“Linux中获取硬件详细信息的命令是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注辰讯云资讯频道!...

这篇文章主要介绍了Java如何实现雪花算法的原理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型。3、字符类型,字符类型的关键字是“char”。4、布尔类型,是表示逻辑值的基本数据类型。SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。给大家举个例子吧,比如下面那个 64 bit 的 long 型数字:第一个部分,是 1 个 bit:0,这个是无意义的。第二个部分是 41 个 bit:表示的是时间戳。第三个部分是 5 个 bit:表示的是机房 id,10001。第四个部分是 5 个 bit:表示的是机器 id,1 1001。第五个部分是 12 个 bit:表示的序号,就是某个机房某台机器上这一毫秒内同时生成的 id 的序号,0000 00000000。①1 bit:是不用的,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。 ②41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。 ③10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10 台机器上,也就是 1024 台机器。 但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器),也可以根据自己公司的实际情况确定。④12 bit:这个是用来记录同一个毫秒内产生的不同 id。12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。简单来说,你的某个服务假设要生成一个全局唯一 id,那么就可以发送一个请求给部署了 SnowFlake 算法的系统,由这个 SnowFlake 算法系统来生成唯一 id。这个 SnowFlake 算法系统首先肯定是知道自己所在的机房和机器的,比如机房 id = 17,机器 id = 12。接着 SnowFlake 算法系统接收到这个请求之后,首先就会用二进制位运算的方式生成一个 64 bit 的 long 型 id,64 个 bit 中的第一个 bit 是无意义的。接着 41 个 bit,就可以用当前时间戳(单位到毫秒),然后接着 5 个 bit 设置上这个机房 id,还有 5 个 bit 设置上机器 id。最后再判断一下,当前这台机房的这台机器上这一毫秒内,这是第几个请求,给这次生成 id 的请求累加一个序号,作为最后的 12 个 bit。最终一个 64 个 bit 的 id 就出来了,类似于:这个算法可以保证说,一个机房的一台机器上,在同一毫秒内,生成了一个唯一的 id。可能一个毫秒内会生成多个 id,但是有最后 12 个 bit 的序号来区分开来。下面我们简单看看这个 SnowFlake 算法的一个代码实现,这就是个示例,大家如果理解了这个意思之后,以后可以自己尝试改造这个算法。总之就是用一个 64 bit 的数字中各个 bit 位来设置不同的标志位,区分每一个 id。SnowFlake 算法的实现代码如下: public class IdWorker {   //因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。  //机器ID  2进制5位  32位减掉1位 31个 private long workerId; //机房ID 2进制5位  32位减掉1位 31个 private long datacenterId; //代表一毫秒内生成的多个id的最新序号  12位 4096 -1 = 4095 个 private long sequence; //设置一个时间初始值    2^41 - 1   差不多可以用69年 private long twepoch = 1585644268888L; //5位的机器id private long workerIdBits = 5L; //5位的机房id private long datacenterIdBits = 5L; //每毫秒内产生的id数 2 的 12次方 private long sequenceBits = 12L; // 这个是二进制运算,就是5 bit最多只能有31个数字,也就是说机器id最多只能是32以内 private long maxWorkerId = -1L ^ (-1L << workerIdBits); // 这个是一个意思,就是5 bit最多只能有31个数字,机房id最多只能是32以内 private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);   private long workerIdShift = sequenceBits; private long datacenterIdShift = sequenceBits + workerIdBits; private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; private long sequenceMask = -1L ^ (-1L << sequenceBits); //记录产生时间毫秒数,判断是否是同1毫秒 private long lastTimestamp = -1L; public long getWorkerId(){ return workerId; } public long getDatacenterId() { return datacenterId; } public long getTimestamp() { return System.currentTimeMillis(); }       public IdWorker(long workerId, long datacenterId, long sequence) {   // 检查机房id和机器id是否超过31 不能小于0 if (workerId > maxWorkerId || workerId < 0) { throw new IllegalArgumentException( String.format("worker Id can't be greater than %d or less than 0",maxWorkerId)); }   if (datacenterId > maxDatacenterId || datacenterId < 0) {   throw new IllegalArgumentException( String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; this.sequence = sequence; }   // 这个是核心方法,通过调用nextId()方法,让当前这台机器上的snowflake算法程序生成一个全局唯一的id public synchronized long nextId() { // 这儿就是获取当前时间戳,单位是毫秒 long timestamp = timeGen(); if (timestamp < lastTimestamp) {   System.err.printf( "clock is moving backwards. Rejecting requests until %d.", lastTimestamp); throw new RuntimeException( String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); }   // 下面是说假设在同一个毫秒内,又发送了一个请求生成一个id // 这个时候就得把seqence序号给递增1,最多就是4096 if (lastTimestamp == timestamp) {   // 这个意思是说一个毫秒内最多只能有4096个数字,无论你传递多少进来, //这个位运算保证始终就是在4096这个范围内,避免你自己传递个sequence超过了4096这个范围 sequence = (sequence + 1) & sequenceMask; //当某一毫秒的时间,产生的id数 超过4095,系统会进入等待,直到下一毫秒,系统继续产生ID if (sequence == 0) { timestamp = tilNextMillis(lastTimestamp); }   } else { sequence = 0; } // 这儿记录一下最近一次生成id的时间戳,单位是毫秒 lastTimestamp = timestamp; // 这儿就是最核心的二进制位运算操作,生成一个64bit的id // 先将当前时间戳左移,放到41 bit那儿;将机房id左移放到5 bit那儿;将机器id左移放到5 bit那儿;将序号放最后12 bit // 最后拼接起来成一个64 bit的二进制数字,转换成10进制就是个long型 return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift) | (workerId << workerIdShift) | sequence; }   /**  * 当某一毫秒的时间,产生的id数 超过4095,系统会进入等待,直到下一毫秒,系统继续产生ID  * @param lastTimestamp  * @return  */ private long tilNextMillis(long lastTimestamp) {   long timestamp = timeGen();   while (timestamp <= lastTimestamp) { timestamp = timeGen(); } return timestamp; } //获取当前时间戳 private long timeGen(){ return System.currentTimeMillis(); }   /**  *  main 测试类  * @param args  */ public static void main(String[] args) { System.out.println(1&4596); System.out.println(2&4596); System.out.println(6&4596); System.out.println(6&4596); System.out.println(6&4596); System.out.println(6&4596);// IdWorker worker = new IdWorker(1,1,1);// for (int i = 0; i < 22; i++) {// System.out.println(worker.nextId());// } } }SnowFlake算法的优点:(1)高性能高可用:生成时不依赖于数据库,完全在内存中生成。(2)容量大:每秒中能生成数百万的自增ID。(3)ID自增:存入数据库中,索引效率高。SnowFlake算法的缺点:依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复。实际中我们的机房并没有那么多,我们可以改进改算法,将10bit的机器id优化,成业务表或者和我们系统相关的业务。感谢你能够认真阅读完这篇文章,希望小编分享的“Java如何实现雪花算法的原理”这篇文章对大家有帮助,同时也希望大家多多支持辰讯云,关注辰讯云资讯频道,更多相关知识等着你来学习!...

小编给大家分享一下GO语言ini配置文件的读取操作示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go适合做什么go是golang的简称,而golang可以做服务器端开发,且golang很适合做日志处理、数据打包、虚拟机处理、数据库代理等工作。在网络编程方面,它还广泛应用于web应用、API应用等领域。iniconf描述使用iniconf更简单的读取go的ini配置文件以及根据特定格式的各种配置文件。安装方法go get github.com/clod-moon/goconf使用方法ini配置文件格式样列[database]username = rootpassword = passwordhostname = localhost[admin]username = rootpassword = password[nihao]username = rootpassword = password初始化conf := goini.InitConfig("./conf/conf.ini")  //iniconf.InitConfig(filepath) 其中filepath是你ini 配置文件的所在位置获取单个配置信息username := conf.GetValue("database", "username") //database是你的[section],username是你要获取值的key名称fmt.Println(username) //root删除一个配置信息conf.DeleteValue("database", "username") //username 是你删除的keyusername = conf.GetValue("database", "username")if len(username) == 0 {  fmt.Println("username is not exists")   //this stdout username is not exists}添加一个配置信息conf.SetValue("database", "username", "chun") username = conf.GetValue("database", "username") fmt.Println(username) //chun 添加配置信息如果存在[section]则添加或者修改对应的值,如果不存在则添加section获取所有配置信息conf.GetAllSetion() //返回map[string]map[string]string的格式 即setion=>key->valueiniconfAbout使用iniconf更简单的读取go的ini配置文件以及根据特定格式的各种配置文件。examplefunc main() {  conf := iniconf.InitConfig("./config.ini")  for key,value :=range conf.Conflist {   fmt.Println(key)   for k,v := range value{    fmt.Println(k,":",v)   }  }  fmt.Println(conf.GetValue("esinfo","addr"))  conf.SetValue("esinfo","addr","127.100.100.100")  fmt.Println(conf.GetValue("esinfo","addr")) }outputesinfoaddr : 127.0.0.1port : 9200index : casetype : case127.0.0.1127.100.100.100Process finished with exit code 0补充:GoLang 使用goconfig读取配置文件(.ini、.json、.yaml)一、goconfig读取.ini类型配置文件1、配置文件(config.ini)如下:[RabbitMQ]MQUrl        = amqp://trkj:trkj@192.168.5.62:5672/testExchange     = EX.WALLDATAExchangeType = fanoutRoutingKey   = RK.WALLDATA  [Base]messageFrequency = 52、解析配置文件:package main import (  "fmt" "github.com/hyahm/goconfig")  type RabbitMQ struct {  MQUrl string Exchange string ExchangeType string RoutingKey string}  type BaseConfig struct {  MsgFrequency int64 // 消息发送频率 RabbitMQ // MQ信息}  func ReadBaseConfig(bconfig *BaseConfig, confFile string) {  goconfig.InitConf(confFile, goconfig.INI)  bconfig.MsgFrequency = goconfig.ReadInt64("Base.messageFrequency", 3)  bconfig.RabbitMQ.MQUrl = goconfig.ReadString("RabbitMQ.MQUrl", "")  bconfig.RabbitMQ.Exchange = goconfig.ReadString("RabbitMQ.Exchange", "")  bconfig.RabbitMQ.ExchangeType = goconfig.ReadString("RabbitMQ.ExchangeType", "")  bconfig.RabbitMQ.RoutingKey = goconfig.ReadString("RabbitMQ.RoutingKey", "") }  func main() {  baseConfig := BaseConfig{}  ReadBaseConfig(&baseConfig, "./Config.ini")  fmt.Printf("mq.MQUrl = %s \t mq.Exchange = %s \t mq.ExchangeType = %s \t mq.RoutingKey = %s\n", baseConfig.RabbitMQ.MQUrl, baseConfig.RabbitMQ.Exchange, baseConfig.RabbitMQ.ExchangeType, baseConfig.RabbitMQ.RoutingKey)  fmt.Printf("msgFrequency = %d\n", baseConfig.MsgFrequency)   }以上是“GO语言ini配置文件的读取操作示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注辰讯云资讯频道!...

这篇文章给大家分享的是有关android studio如何打包自动生成版本号与日期的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。一. 打开项目选择如图示1 (build.gradle 项目位置)二. 1. build.gradle 文件添加内容如下。gradle是【com.android.tools.build:gradle:3.0.0 以下版本】android{     defaultConfig {...}     自动追加版本号和版本名称   android.applicationVariants.all {     variant->variant.outputs.each {       output-> output.outputFile = new File(output.outputFile.parent,"app_device_v"+defaultConfig.versionName+"_"+new Date().format("yyyy-MM-dd")+"_"+buildType.name+".apk")     }   } }output.outputFile.parent 可以指定输出到指定文件夹2. build.gradle 文件添加内容如下。 gradle是【com.android.tools.build:gradle:3.0.0及其以上版本】android{     defaultConfig {...}     //release版本输出包名自动追加版本号和版本名称  applicationVariants.all {     variant ->       variant.outputs.all {         //只处理生产版本        if (buildType.name == 'release') {           def createTime = new Date().format("YYYY-MM-dd", TimeZone.getTimeZone("GMT+08:00"))            // app包名称          outputFileName = "app_v" + defaultConfig.versionName + "_" + createTime + "_" + buildType.name + ".apk"          ////指定release输出到指定文件夹          variant.getPackageApplication().outputDirectory = new File(config.appReleaseDir + "/${createTime}")         }       }   } }三. 打包查看结果:图示3(直接点击assembleRelease即可)补充知识:Android编译gradle 动态修改版本号在构建代码的时候不想每次都修改版本号,需能够增加一个功能在特定的条件下动态的修改版本号在manifest里面加入占位符号<manifest xmlns:android="http://schemas.android.com/apk/res/android"    android:versionCode="${versioncode}"    android:versionName="${versionname}">修改build.gradleimport com.google.gson.Gsonclass Version {   int versionCode   String versionName } def versionJsonFile = file('./version.json')//这个文件最好放一个所有项目人员都能够访问的地方  def versionJsonObject = new Gson().fromJson(versionJsonFile.text, Version.class)   android.applicationVariants.all {     variant ->       println("variants name : " + variant.name)   //只有满足特定条件的情况下才会版本自增一,这个可以看看各个项目的特定配置      if (variant.name.toLowerCase().contains("ceshirelease") ) {         println("variants name : versionCode " + versionJsonObject.versionCode + "versionname: " + versionJsonObject.versionName)         versionJsonObject.versionCode = versionJsonObject.versionCode + 1        int lastIndexPoint = versionJsonObject.versionName.lastIndexOf(".")         String newStr = versionJsonObject.versionName.substring(0, lastIndexPoint)         println("newStr" + newStr)         versionJsonObject.versionName = newStr + "." + versionJsonObject.versionCode         println("versonJsonStr.versionName " +  versionJsonObject.versionName)       }   //这句是核心,可以调整版本号和版本明,修改了这个会影响到BuildConfig.class里面的属性      variant.mergedFlavor.versionCode = versionJsonObject.versionCode       variant.mergedFlavor.versionName = versionJsonObject.versionName   //如果没有加下面这句,当应用安装后会出现应用信息没有版本号的问题,这个必须有      variant.mergedFlavor.manifestPlaceholders.put("versioncode", versionJsonObject.versionCode)       variant.mergedFlavor.manifestPlaceholders.put("versionname", versionJsonObject.versionName)   }    //为了记住最新的版本号,是需要进行文件的回写的,什么时候回写会好一点 //个人认为只有当打包apk的动作执行成功后 回写文件记录的版本号最优  afterEvaluate {     project ->       gradle.taskGraph.afterTask {         task, taskState ->     //这里如果assembleceshirelease 就具体的打包的变种项目,各个应用肯定不一样,需要调整下          if (task.name.toLowerCase().contains("assembleceshirelease") && taskState.getFailure() == null) {             println("try assemble ceshi release" )    //回写文件操作            versionJsonFile.withPrintWriter { out ->                 out.println(new Gson().toJson(versionJsonObject))             }           }       }   }给apk重新命名也是同样的道理  variant.getOutputs().all {         File file = it.outputFile;         println(" file property file.canRead() " + file.canRead() + " file.canWrite " + file.canWrite())         String pathString = file.getPath();         println(" path String : " + pathString + " File.pathSeparator: " + File.separator)    //指定最终输出的文件的目录和名字        pathString = file.getParent() + File.separator + "test.apk";         println(" path pathString : " + pathString)         file.renameTo(pathString)       }感谢各位的阅读!关于“android studio如何打包自动生成版本号与日期”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!...