原创地址:https://www.cnblogs.com/xbcq/p/5884463.html
背景:项目JDK升级1.5到1.7,版本控制由SVN改为GIT,数据库不变,操作系统不变
测试人员测试发现:当在文本框输入换行符之后,数据库保存的数据在换行符处多了“@Enter”;同时从数据库取数时,中间含有换行符的数据,页面输出也会多“@Enter”。
过程:服务器测试,本地复现,添加debug,读前台程序,,,,
最后查找到,程序是在读取数据之后对数据做了特殊字符转换,OK,开始读转换代码。发现windows下面换行符为\r\n,而从配置文件读出来的规则为\n做相应转换,同时程序中写读取配置文件规则为校验\r\n。。。so,配置文件的换行符有问题,开始查找准生产的文件做替换,测试通过。用git提交,发布,测试。。。问题还在。。重新查看配置文件,没有被修改,,为什么??
最后,查阅相关资料,找到原因。这个问题是git在window与linux的换行符问题,autocrlf在window和linux下不一样。假如不同的终端提交时候使用了不同的换行符,就会出现这个问题。
由于我们需要提交时不修改为linux下的换行符,但是这是在git管理平台设置的,只能麻烦配置人员做修改了。
如果只是因为操作平台不一致的话,我们可以参考如下方法,来设置本地和服务器统一编码。
解决方案:a、安装时候,大家的选项大多是默认安装,所以在autocrlf选项时候,一般也是默认的
但是,在多人协同开发时候,不同终端不同git的配置不一样,就会导致问题
安装时候可以选择这个,checkout不修改文件换行符,commit不修改文件换行符 b、假如已经出现问题。
如果你的源文件中是换行符是LF,而autocrlf=true, 此时git add就会遇到 fatal: LF would be replaced by CRLF 的错误。有两个解决办法:
1. 将你的源文件中的LF转为CRLF即可【推荐】
2. 将autocrlf 设置为 false
如果你的源文件中是换行符是CRLF,而autocrlf=input, 此时git add也会遇到 fatal: CRLF would be replaced by LF 的错误。有两个解决办法:
1. 将你源文件中的CRLF转为LF【推荐】
2. 将autocrlf 设置为true 或者 false
在Mac上设置 autocrlf = input, 在Windows上设置autocrlf = true(默认值)。
http://www.sohu.com/a/217314007_297710
1、下载libffi $wget -c http://ftp.nchu.edu.tw/Unix/sourceware.org/libffi/libffi-3.2.tar.gz 2、解压libffi $tar xvf libffi-3.2.tar.gz 3、配置libffi $cd libffi-3.2/ $sudo ./configure 4、编译并安装libffi $sudo make install libffi将安装到/usr/local/lib/目录下 5、配置环境 $gedit ~/.bashrc 在.bashrc文件最后添加如下内容: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/ 6、编译测试用例 进入到libffi解压后的根目录下, $sudo gcc -I”./include” -I”./src/x86” -I”.” -o app ./testsuite/libffi.call/cls_12byte.c -lffi -L”/usr/local/lib/” 7、运行测试用例 $./app
使用foreach()处理集合时不能使用break和continue这两个方法,也就是说不能按照普通的for循环遍历集合时那样根据条件来中止遍历,而如果要实现在普通for循环中的效果时,可以使用return来达到,也就是说如果你在一个方法的lambda表达式中使用return时,这个方法是不会返回的,而只是执行下一次遍历
public void t1(){ List<String> list = Collections.EMPTY_LIST; list = Arrays.asList("awg","weg","wweg","wegwe"); list.forEach(System.out::println); list.forEach(str -> { if("awg".equals(str)){ return; } System.out.println(str); }); } 执行结果:
awg
weg
wweg
wegwe
weg
wweg
wegwe
另外lambda的foreach执行效率很低,不如增强for循环
公钥基础设施(Public Key Infrastructure,简称PKI)是目前网络安全建设的基础与核心,是电子商务安全实施的基本保障,因 此,对PKI技术的研究和开发成为目前信息安全领域的热点。本文对PKI技术进行了全面的分析和总结,其中包括PKI组成、证书认证机构CA、PKI应 用、应用编程接口和PKI标准等,并对CA的开发做了简要分析。本文对PKI,特别是CA的开发、应用和普及具有一定的促进作用。
1 前言
随 着网络技术和信息技术的发展,电子商务已逐步被人们所接受,并在得到不断普及。但由于各种原因,国内电子商务的安全性仍不能得到有效的保障。在常规业务 中,交易双方现场交易,可以确认购买双方的身份。利用商场开具的发票和客户现场支付商品费用,无须担心发生纠纷和无凭证可依。但通过网上进行电子商务交易 时,由于交易双方并不现场交易,因此,无法确认双方的合法身份,同时交易信息是交易双方的商业秘密,在网上传输时必须保证安全性,防止信息被窃取;双方的 交易非现场交易,一旦发生纠纷,必须能够提供仲裁。
因 此,在电子商务中,必须从技术上保证在交易过程中能够实现身份认证、安全传输、不可否认性、数据完整性。在采用数字证书认证体系之前,交易安全一直未能真 正得到解决。由于数字证书认证技术采用了加密传输和数字签名,能够实现上述要求,因此在国内外电子商务中,都得到了广泛的应用。
PKI 采用证书进行公钥管理,通过第三方的可信任机构(认证中心,即CA),把用户的公钥和用户的其他标识信息捆绑在一起,其中包括用户名和电子邮件地址等信 息,以在Internet网上验证用户的身份。PKI把公钥密码和对称密码结合起来,在Internet网上实现密钥的自动管理,保证网上数据的安全传 输。
因 此,从大的方面来说,所有提供公钥加密和数字签名服务的系统,都可归结为PKI系统的一部分,PKI的主要目的是通过自动管理密钥和证书,为用户建立起一 个安全的网络运行环境,使用户可以在多种应用环境下方便的使用加密和数字签名技术,从而保证网上数据的机密性、完整性、有效性。数据的机密性是指数据在传 输过程中,不能被非授权者偷看;数据的完整性是指数据在传输过程中不能被非法篡改;数据的有效性是指数据不能被否认。
一 个有效的PKI系统必须是安全的和透明的,用户在获得加密和数字签名服务时,不需要详细地了解PKI的内部运作机制。在一个典型、完整和有效的PKI系统 中,除证书的创建和发布,特别是证书的撤销,一个可用的PKI产品还必须提供相应的密钥管理服务,包括密钥的备份、恢复和更新等。没有一个好的密钥管理系 统,将极大影响一个PKI系统的规模、可伸缩性和在协同网络中的运行成本。在一个企业中,PKI系统必须有能力为一个用户管理多对密钥和证书;能够提供安 全策略编辑和管理工具,如密钥周期和密钥用途等。
PKI发展的一个重要方面就是标准化问题,它也是建立互操作性的基础。目前,PKI标准化主要有两个方面:一是RSA公司的公钥加密标准PKCS(Public Key Cryptography Standards),它定义了许多基本PKI部件,包括数字签名和证书请求格式等;二是由Internet工程任务组IETF(Internet Engineering Task Force)和PKI工作组PKIX(Public Key Infrastructure Working Group)所定义的一组具有互操作性的公钥基础设施协议。在今后很长的一段时间内,PKCS和PKIX将会并存,大部分的PKI产品为保持兼容性,也将会对这两种标准进行支持。
PKI 的发展非常快,已经从几年前的理论阶段过渡到目前的产品阶段,并且出现了大量成熟技术、产品和解决方案,正逐步走向成熟。PKI的发展受应用驱动的影响, 比如,早期的Internet商务和Web安全要求主要依赖于SSL,并要求应用首先对证书进行处理,所以,在很多公司的消息和群组产品中都提供了公钥和 证书系统,如Exchange和Notes等。另外,基于标准的基础设施和应用也同样促进了PKI的发展,它能够保证基于Internet的安全消息传送 的可交互性,如S/MIME等。
目 前,PKI产品的生产厂家很多,比较有代表性的主要有VeriSign和Entrust。VeriSign作为RSA的控股公司,借助RSA成熟的安全技 术,提供了PKI产品,为用户之间的内部信息交互提供安全保障。另外,VeriSign也提供对外的CA服务,包括证书的发布和管理等功能,并且同一些大 的生产商,如Microsoft、Netscape和JavaSoft等,保持了伙伴关系,以在Internet上提供代码签名服务。
Entrust作为北方电讯(Northern Telecom)的控股公司,从事PKI的研究与产品开发已经有很多年的历史了,并一直在业界保持领先地位,拥有许多成熟的PKI及配套产品,并提供了有效的密钥管理功能。
另外,一些大的厂商,如Microsoft、 Netscape和Novell等,都开始在自己的网络基础设施产品中增加PKI功能。Netscape已经开始把证书服务器作为了SuiteSpot的 一部分,虽然其证书服务器没有Entrust产品的功能全面和完善,但提供了基本的证书生成和管理功能。即使没有密钥管理功能,但由于Netscape把 证书服务器同SuiteSpot服务器和Communicator客户端产品的集成,依靠广泛的市场基础,也取得的越来越多的市场份额。由SUN和 Netscape联盟组成的iplanet公司(Sun|Netscape Alliance)也在PKI方面做了很大的努力,凭借其在网络和电子商务方 面的优势,发展了很多性能优越的PKI产品,如LDAP目录服务器和证书管理系统等。
2 PKI组成
PKI作为一组在分布式计算系统中利用公钥技术和X.509证书所 提供的安全服务,企业或组织可利用相关产品建立安全域,并在其中发布密钥和证书。在安全域内,PKI管理加密密钥和证书的发布,并提供诸如密钥管理(包括 密钥更新,密钥恢复和密钥委托等)、证书管理(包括证书产生和撤销等)和策略管理等。PKI产品也允许一个组织通过证书级别或直接交叉认证等方式来同其他 安全域建立信任关系。这些服务和信任关系不能局限于独立的网络之内,而应建立在网络之间和Internet之上,为电子商务和网络通信提供安全保障,所以 具有互操作性的结构化和标准化技术成为PKI的核心
PKI在实际应用上是一套软硬件系统和安全策略的集合,它提供了一整套安全机制,使用户在不知道对方身份或分布地很广的情况下,以证书为基础,通过一系列的信任关系进行通讯和电子商务交易。
图 1 PKI组成
一个典型的PKI系统如图1所示,其中包括PKI策略、软硬件系统、证书机构CA、注册机构RA、证书发布系统和PKI应用等。
BIP0032描述了分层确定性钱包(HD wallet) 动机: 为了解决传统非确定性钱包每当一批私钥用完后必须重新生成一批私钥并且及时备份的问题。 一.Key的派生: 1.Extended keys(可扩展密钥): 这里定义了从父key派生子key的函数。为了防止派生过程完全依赖key本身,分别给私钥和公钥延伸出256位的熵,称之为链码(chain code)。 可扩展的私钥:(k, c),k为普通私钥,c为链码。 可扩展的公钥:(K, c),K为普通公钥,c为链码。 每个可扩展密钥拥有2的31次个正常子钥和2的31次个强化(hardened)子钥。每个子钥都有一个索引,正常子钥的索引从0到2^31-1,强化子钥从2^31到2^32-1。简化表示:i'即i + 2^31。 2.子钥派生函数(Child key derivation (CKD) functions) 给出一个可扩展密钥和索引i,可以计算出相应的子可扩展密钥。这个算法取决于子钥是否是强化的(即i是否大于等于2^31),以及是在计算私钥还是公钥。 Private parent key → private child key Public parent key → public child key Private parent key → public child key Public parent key → private child key 这个是不行的。 3.密钥树 标识符m/x/y/z描述的是⼦密钥m/x/y的第z个⼦密钥。 4.序列化数据格式: 可扩展公钥/私钥的序列化数据格式如下,共78bytes: 以上内容可以机行base58check编码,生成的字符多大112个字符,主网上会以“xprv”或“xpub”开头,testnet上的“tprv”或“tpub”开始。 5.master key的生成 master key不是直接生成的,而是由种子来生成。 即
在安装mysql时遇到一个问题,每次到最后一步的时候就失败了(如下图)。主要原因还是mysql的相关配置数据没有删除干净(之前安装过mysql,之后又卸载了,可能大家遇到的原因不一定一样),最后删除了一下mysql的相关配置数据,重启电脑后重新安装,就可以安装成功了。
删除mysql相关配置数据的步骤如下:
1、先在控制面板--》程序和功能中卸载mysql。
2、删除mysql的相关目录,一般在mysql的安装目录下。
3、删除系统盘(一般c盘)下ProgramData目录下的mysql相关目录(ProgramData目录是个隐藏目录,建议先显示隐藏目录再删除,怎么显示隐藏目录请自行百度)
4、删除注册表中相关mysql目录
<1>开始--》运行中输入regedit进入注册表
<2>删除HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/Eventlog/Applications下的MySQL目录
<3>删除HKEY_LOCAL_MACHINE/SYSTEM/ControlSet002/Services/Eventlog/Applications下的MySQL目录
<4>删除HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Eventlog/Applications下的MySQL目录
<5>可以编辑--》查找搜索一下mysql相关配置数据
5、重启机器,重新安装。
一般通过以上步骤就可以解决问题了
步骤1.系统启动时进入系统选择页面按【e】进入步骤2。
步骤2.在“linux16”命令最后加上“init=/bin/sh”,按【Ctrl+x】进入单用户模式。
步骤3.
输入“mount –o remount ,rw /”,将所有文件设置为可读写模式。
输入“passwd”,填写新的root密码。
输入“ touch /.autorelabel”,修改系统时间标签。
输入“exec /sbin/init”重启系统。
步骤4.
完成密码修改,切换root用户,使用新密码即可登录。
#include <stdio.h> #include <stdlib.h> #include <cstring> using namespace std; typedef struct HuffNode { int weight; int parent, lchild, rchild; }HuffNode, HuffTree; void select(HuffTree* H, int m, int* s1, int* s2) //在索引为0~m的元素中找到**parent为0**且权重最小的两个元素的索引s1,s2 { //初始化两个最小的元素min1,与min2, 且min1<min2 int min1 = 500; int min2 = 1000; int min1_index, min2_index = 1000; for(int i = 0; i<=m; i++) { if(H[i].parent==0) //这个条件很重要!!它使得前一次被选中的根节点在这次选择中不会被选中 { if(H[i].weight < min1) //则当前元素<min1<min2, 应将min2用min1赋值, 再将当前元素赋给min1 { min2 = min1; min2_index = min1_index; min1 = H[i].
8.连接Windows的Visual Studio开发工具和虚拟机的Xamarin.iOS 在苹果虚拟机,打开系统偏好设置,点击【网络】,确认苹果系统的IP。 在系统偏好设置,点击【共享】。设置电脑名称,打开远程登录,允许所有用户访问。 在Windows系统,打开Visual Studio,新建iPhone项目。 执行Xamarin Mac代理。 添加新的Mac。 输入Mac的IP,就是刚才确认的IP。 输入苹果虚拟机的帐号和密码。如果提示错误,可以重启虚拟机和VS2017,再次检查IP、虚拟机的远程登录设置是否正确。 登录成功后,可以在模拟器中选择合适的调试设备。如果看不到,可以切换iPhone Simulator和设备,或者重启VS2017。 运行项目,Visual Studio在苹果虚拟机上自动打开iPhone手机模拟器,可以看到运行结果。可以选择不同的手机型号,可以查看APP在不同机型的差异。可以将手机模拟器窗口调整到适合观看。Xcode9.2自带的iPhone模拟器已经支持任意大小缩放,比老版本只能固定选择几种大小好多了。 如果运行出现以下报错,重新生成项目即可。 启动失败。无法在“iPhone 6 iOS 10.3”上启动应用“iOSApp”。错误: error MT0069: The app directory ‘/Users/sunny/Library/Caches/Xamarin/mtbs/builds/iOSApp/440bd0f0a252dd8502d577c4cee6b5f0/bin/iPhoneSimulator/Debug/iOSApp.app’ does not exist.
简单的介绍一下Mac常用按键与PC键盘的对应关系。 应用举例: 选中iPhone模拟器窗口,在菜单栏找到【Hardware】-【Home】,点击它,就会向iPhone模拟器发送Home键。如果想通过按键操作,需要同时按下三个键⇧⌘H,对应PC键盘的Shift-Win-H。
花了一天时间找到了问题原因,中途找厂商售后排故无果,自己用时间啃出来的结果。
**问题现象:**某日下午同事突然告诉我某服务器(Error_A)无法访问了,接着是一批服务无法访问。
排故:1 先ping下目标机器,可以ping通(我有点怒,我不信出问题了)。
2 我ssh远程了下目标机器,果然连不上(telnet x.x.x.x 22端口tcp链接不上)。
3 直接用wireshake抓个包看下,发现只有去往目的的服务器的SYN握手信息,然后就是两个重传SYN报文,这肯定是网络不可达了,三次握手不能建立连接。
4 进机房排故,排除是硬件or网络设备原因。(主机、网络设备、线路检查了一遍都没问题)
5 用显示器键盘登陆服务器,ping和ssh同vlan的其他设备没问题,ping网关有问题了,延迟非常高,还丢包。ping跨vlan的机器,结果是一样的。
6 这肯定是网关机器的原因了。
7 STELNET网关华为设备,登陆后在网关上ping Error_A,ping 没问题。
8 不是配置问题(这是突然出现的问题),那就查看网关设备的运行日志了,logbuffer把最近的都查了,没见异常信息。
9 奇怪了,同一个vlan有四份之一的机器出问题了,其他机器去正常。
10 查了vlan配置,接口up/down(物理和管理方式),arp表,mac信息都正常。没发现设备有啥问题。那就分离有问题的机器,测试排故。
11 直接把有问题的机器Error_A单独拿出来,直接接到网关设备网口上。
12 看网关的arp表(dis arp network x.x.x.x)出有问题了,这个映射还在以前的接口上?(奥,是mac表没有老化原因,直接手动清除)
<HUAWEI>display arp network x.x.x.x <HUAWEI>reset arp dynamic 13 发现有问题设备Error_A的源mac不能被交换机学习,这是问题原因? 不能动态学习mac地址了?
我们手动添加arp表,验证下结果
[HUAWEI]arp static x.x.x.x aaaa-aaaa-aaaa vid 109 interface GigabitEthernet 0/0/43 [HUAWEI]display arp network x.x.x.x 14 配置路由可达,用pc1机跨网段ping Error_A,ping 不通了,换台pc2代替Error_A接入网关相同网口,pc的mac可以正常被学习,通信正常。奇怪了就对Error_A有问题???
15 直接通过acl对Error_A的mac进行做流分类,统计该mac通信是否有丢包的情况。测试结果无丢包,无错误包。
16 对比观察,多次操作dis inter br g0/0/40(连接Error_A),发现问题了,input 有数据再增加,output统计没有数据量增加。
简述:
1> Qt线程间共享数据主要有两种方式:
1)使用共享内存。即使用一个两个线程都能够共享的变量(如全局变量),这样两个线程都能够访问和修改该变量,从而达到共享数据的目的。
2)使用singal/slot机制,把数据从一个线程传递到另外一个线程。
第一种方法在各个编程语言都普遍使用,而第二种方法是QT的特有的,本文主要介绍第二种。 2 > 槽参数类型
1) 在线程间使用信号槽进行通信时,槽参数必须使用元数据类型的参数;
2) Qt内生的元数据类型,如int double QString等;
3) 如果要用自定义的数据类型,需要在connect之前将其注册(qRegisterMetaType)为元数据类型。
4) 线程间用“信号与槽”传递引用参数的话,要加const,因为const文字常量存在常量区中,生命周期与程序一样的长。这样可以避免slot调用的时候参数的运行期已过而使引用无效。
connect(m_thread, SIGNAL(MsgSignal(const QString&)),
this, SLOT(OnMsgSignal(const QString&)));
3 > Q_DECLARE_METATYPE与qRegisterMetaType Q_DECLARE_METATYPE
如果要使自定义类型或其他非QMetaType内置类型在QVaiant中使用,必须使用该宏。
该类型必须有公有的 构造、析构、复制构造函数。
qRegisterMetaType 必须使用该函数的两种情况:
如果非QMetaType内置类型要在Qt的属性系统中使用。
如果非QMetaType内置类型要在queued 信号与槽中使用。
两者的关系:
Q_DECLARE_METATYPE展开后是一个特化后的类QMetaTypeId<TYPE>
qRegisterMetaType将某类型注册到MetaType系统中。
QMetaTypeId<TYPE>的类中成员包含对qRegisterMetaType的调用。
1、传递int参数(主线程与子线程) testthread.h 文件
#ifndef TESTTHREAD_H #define TESTTHREAD_H #include <QThread> #include "msg.h" class TestThread : public QThread { Q_OBJECT public: explicit TestThread(QObject *parent = 0); protected: void run(); signals: void TestSignal(int); private: Msg msg; }; #endif // TESTTHREAD_H testthread.
6.在虚拟机安装Xcode开发工具 建议到苹果官网把Xcode安装包下载到本地,再安装,不要直接在AppStore里安装。需要Apple ID登录苹果开发者网站。 https://developer.apple.com/download/more/ 下载xip文件。 把xip文件拷贝到苹果虚拟机的下载文件夹。 安装前确保剩余磁盘空间至少20G。 在Finder双击xip文件。 解压并验证。如果在VMware共享文件夹直接双击xip文件安装,到这一步就会报错Block-compressed payload operation failed。必须拷贝到下载文件夹再安装。 装完之后,把Xcode图标拖到应用程序文件夹。 然后删除xip文件。 为了确保后续Visual Studio能够连接使用Xcode,需要运行一次Xcode,同意协议。 7.在虚拟机安装Xamarin.iOS 访问以下网址,它提供了Xamarin最新版本安装文件的详细资料 https://xampubdl.blob.core.windows.net/static/installer_assets/v3/Mac/Universal/InstallationManifest.xml 找到这2个安装包的下载地址,安装包的版本号会持续升级 https://dl.xamarin.com/MonoFrameworkMDK/Macx86/MonoFramework-MDK-5.4.1.7.macos10.xamarin.universal.pkg https://dl.xamarin.com/MonoTouch/Mac/xamarin.ios-11.6.1.4.pkg 然后把这2个安装包下载到本地,放在虚拟机的共享文件夹。然后在虚拟机里依次双击Macx86/MonoFramework-MDK-5.4.1.7.macos10.xamarin.universal.pkg、xamarin.ios-11.6.1.4.pkg安装文件,完成安装。 完成安装后重启虚拟机。
问题描述:替换本地file.project文件中的所有某一字符串,test.project中含有中文,发现缺少QTextCodec::codecForName("utf-8")后总是乱码。所以总结出QTextStream的默认编码方式不是utf-8,所以需要手动指定一下才能正确解析。示例代码如下:
QTextStream fileStream(&file ); fileStream.setCodec(QTextCodec::codecForName("utf-8"));//必须加,否则含有中文时乱码 QString qsAll = fileStream.readAll(); file.close();//关闭文件 if (!file.open(QIODevice::WriteOnly|QIODevice::Truncate)) { return DxFunctionResult(ERROR_COMMON_READ_STYLESHEET_FAILURE); } QTextStream out(&file ); out.setCodec(QTextCodec::codecForName("utf-8"));//必须加,否则含有中文时乱码 QString qsOldKey = kPatientInfo + "/" + qsOldPatientID + "/"; QString qsNewKey = kPatientInfo + "/" + qsPatientID + "/"; qsAll.replace(qsOldKey, qsNewKey ); out << qsAll; file.close();
看代码的遇见子类或者接口的实现时,如果有个类图工具就能让我们层次和关系一目了然,如果您的IDE是IntelliJ IDEA,推荐使用其自带的类图功能;
工具版本 社区版不带类图功能,所以请使用完整版,以下是我用的版本信息:
使用类图功能 以Spring源码的工程为例,假设我已经打开了ApplicationContext.java,在这个类的大括号内的区域点击右键,选择Diagrams -> Show Diagram,即可打开类图,如下图红框所示:
打开的效果如下图所示:
ApplicationContext.java的继承关系一目了然;
调整布局 在类图上点击右键,选择"Layout",在子菜单中可以调整排列效果,如下图:
您可以选择一种适合自己的排列布局,例如“Orthogonal Layout”的效果如下图:
查看更多信息 如下图,点击红框中的按钮,可以看到类或者接口的方法信息,另外绿框中的按钮也比较实用,当我们对图像做过方法或者缩小后,可能字体会不清晰,这时点绿框中的按钮就会回到原始比例,此时字体就清晰了:
在类上点击右键,选择“Show Implementations”可以看到此类的实现或继承,如下图:
如果想看类图中某个类的源码,点击该类后按下“F4”键即可; 以上就是类图工具的简单用法,希望能帮你更直观的了解源码的结构和关系;
欢迎关注我的公众号:程序员欣宸
升级 CentOS 内核参考资料 1 升级 CentOS 内核参考资料 2 通过 /proc 虚拟文件系统读取或配置内核 Linux 内核官网 CentOS 官网
1. 关于 Linux 内核 Linux 内核分两种:官方内核(通常是内核开发人员用)和各大 Linux 发行版内核(一般用户常用)。
1.1 官方内核 在使用 Docker 时,发现其对 Linux 内核版本的最低要求是 3.10(这也刚好是 CentOS 7.2 的内核版本),但是在这个版本上有部分功能无法实现。目前 Linux 内核已经发布到 4.X(可以随时在 Linux 内核官网 查看当前版本),为了使用最新版本的内核,只好在安装 CentOS 7 后对内核进行升级。
当然,内核也不能选最新的,防止有尚未发现的 BUG。而且为了减少以后停止维护带来的麻烦,最好安装长期支持版本。各个版本的支持时间在 这个页面 查看。每个版本可能有四种类型,概述如下:
Prepatch:Prepatch 或 “RC” 内核是主要的内核预发行版本,主要针对内核开发人员和 Linux 爱好者。必须从源代码进行编译,并且通常包含必须在可以放入稳定版本之前进行测试的新功能。Prepatch 内核由 Linus Torvalds 维护和发布。Mainline:Mainline 主线树由 Linus Torvalds 维护。这个版本的内核会引入所有新功能。新的 Mainline 内核每 2-3 个月发布一次。Stable:每个主线内核被发布后,即被认为是“stable”。任何对 stable 内核的 BUG 修复都会从 Mainline 主线树中回溯并由指定的 stable 内核维护人员使用。 在下一个主线内核可用之前,通常只有几个 BUG 修复内核版本 - 除非它被指定为“longterm maintenance kernel(长期维护内核)”。stable 内核更新按需发布,通常每月 2-3 次。Longterm:通常会提供几个“longterm maintenance”内核版本,用于修复旧版内核的 BUG。这些内核只会修复重大 BUG,并且不会频繁发布版本。 Longterm release 的内核:
最近项目要做改版,需要评估一下工时,因为项目比较大,导致在Studio搜索某些数据的时候数量出现100+的情况(比如统计项目中的Button数量),没办法统计到具体的数据.故写了一个统计xml文件标签的方法(java),分享一下,希望能帮到同样遇到这种问题的童鞋.
需求 修改项目中所有Activity的背景色,字体颜色等,修改所有Button(其他控件)的风格.评估工作量.
分析 看到需求的时候,会不会有童鞋有打开项目一个一个数的想法的(哈哈,其实我也有过,不过一瞬间就被干掉了)?当然这样做也可以,不过就和咸鱼没什么区别了,作为一名程序猿,当然要用程序猿的方式来解决这个问题.
首先分析一下,既然需要评估工作量,就需要知道项目中有多少个Activity和多少个Button(控件).怎么统计呢? 方法其实很多,首先看一下Activity的统计:
方法一)日常开发中一般Activity都是以XxxActivity来命名的,所以可以遍历项目src文件夹,找到所有文件名包含Activity的文件,统计出数量.但是这样统计有没有问题呢?仔细想一下,问题还是挺多的,比如有的Activity文件不是以XxxActivity格式命名的或者说有的非Activity的文件文件名中也包含Activity,这样统计出来的数据就会存在误差.
方法二)每个Activity创建时都需要在AndroidManifest文件中注册之后才能使用,所以打开项目的AndroidManifest文件,看一下有多少个activity标签就可以了.当然在AndroidManifest文件中用Studio中直接搜索就可以看到有多少个activity标签了,这里也用代码实现了一下,两种方式都可以.
在看一下Button(控件)的统计:
因为项目比较大,所以搜到的Button标签的数量很多,Studio里边提示的是100+(当然可能可以在Studio里边设置显示为确切的数据,不过这里没有去具体研究,直接用代码解析的),没办法看到确切的数据.
这要怎么解决呢?这里考虑一下,其实Button标签在项目中大都是写在布局文件中的(极少部分代码添加),布局文件都是xml文件,所以这里解析一下xml文件找到Button标签并统计个数其实就可以了,当然项目中有很多布局文件,所以遍历项目中的layout文件夹并统计所有xml文件中的Button标签总个数即可.
具体实现 代码如下:
import org.w3c.dom.Document; import org.w3c.dom.NodeList; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; /** * @author junweiliu * @version 1.0 * @date 2018/2/28 * @QQ 1007271386 */ public class FileRead { public static void main(String[] args) { // 统计activity数量,当然也可以在IDE中直接查看 System.out.println("activity的个数是" + labelNum("...你的本地路径/AndroidManifest.xml", "activity")); // 统计按钮数量(当然其他控件标签也可) try { File file = new File("...你的本地路径/layout"); List<String> resultFileName = new ArrayList<String>(); List<String> fileNames = new ArrayList<String>(); fileNames.
1. cd 到你的工程目录,删除已经创建好的virtualenv
2. 创建一个新的virtualenv
virtualenv flask 3. cd 进入flask目录
4. 激活最新创建的这个 virtualenv
source bin/activate 5. 安装flask
pip install flask 6. 退出 flask目录,在当前的工程目录下创建您自己的python文件,例如 hello.py
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" if __name__ == "__main__": app.run() 7. 最后 run python
转载于:https://www.cnblogs.com/StephenWu/p/8474733.html
recycleview 填坑:
最近使用RecycleView 莫名出现一个问题,子布局item写的是填充父控件,但是没有填充整个屏幕,是因为我们的adapter中填充子view时出现的问题;
错误代码:
@Override public albumHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_presion,null); albumHolder holder = new albumHolder(view); return holder; } 正确代码:
@Override public albumHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_presion,parent, false); albumHolder holder = new albumHolder(view); return holder; }只需改一个地方即可,将inflate()两个参数的重载方法改为三个参数的重载方法; LayoutInflater.from(context).inflate(R.layout.item_presion,parent, false); 因为使用.inflate(R.layout.xx,null)加载布局,没有父容器,得到的布局的宽高都是wrap_content的,所以无论在xml文件中怎么写宽度和高度都是无效的。所以我们使用三个参数的重载方法;
补充: item布局的父布局高度一定是wrap_content,要不然有可能一个item填充整个屏幕高度
简单学习了JS中的递归和回调函数后,用相关的方法解决一些曾经文章解决过的小问题,如下:
例一:用递归求1+100的和,代码实现如下:
<script> alert(getSum(100)); function getSum(n){ //跳出条件 if(n<1){ return 0; } //累加 return n+getSum(n-1); } </script>通过多次调用本身函数进行累加加和,这个过程叫做递归,给出条件使之跳出递归。 例二:用递归求斐波那契数列第12项?代码实现如下:
<script> console.log(FB(12)); function FB(n) { if(n<=2){ return 1; } return FB(n-2)+FB(n-1); } </script> 将以上代码进行优化,利用三目运算将代码量减少,如下: <script> function fib(n){ return n <=2 ? 1: fib(n - 1) + fib(n - 2); } console.log(fib(12)); </script>例三:定义四个规则,加减乘除,代码实现如下: <script> console.log(fn(10,5,test1)); console.log(fn(10,5,test2)); console.log(fn(10,5,test3)); console.log(fn(10,5,test4)); function fn(num1,num2,demo){ return demo(num1,num2); } function test1(a,b){ return a+b; } function test2(a,b){ return a-b; } function test3(a,b){ return a*b; } function test4(a,b){ return a/b; } </script>先调用fn函数后再调用demo函数,完成回调规则。