preference的解析与显示

一、preference的xml解析过程 解析触发流程: 在一个继承自PreferenceActivity类的子类中调用addPreferencesFromResource(R.xml.voicemail_settings);后,就开始了xml的解析过程。在方法PreferenceActivity.addPreferencesFromResource中,首先是调用PreferenceManager.inflateFromResource–PreferenceInflater.inflate得到PreferenceScreen实例引用,该PreferenceScreen中保存了从xml中解析到的所有preference元素的对象引用。 xml的解析工作主要由PreferenceInflater类完成,它继承自GenericInflater, 大致流程: 1.解析从PreferenceInflater.inflate方法开始; 2.首先是得到AttributeSet实例,大致过程: XmlResourceParser parser = getContext().getResources().getXml(resource); AttributeSet attrs = Xml.asAttributeSet(parser); 3.然后开始逐一解析xml文件的所有元素节点,将xml中配置的所有preference创建出对应的java实例: 3.1 首先得到根元素实例:inflate–createItemFromTag–onCreateItem 3.2 然后开始循环遍历创建每个非根元素实例: 1)inflate–rInflate–onCreateCustomFromTag——解析preference中配置的intent,并调用Preference.setIntent方法将intent保存在preference对象中。 2)inflate–rInflate–createItemFromTag–onCreateItem——这里类似创建根节点元素实例的逻辑,创建好preference对象后,调用PreferenceGroup.addItemFromInflater方法将preference引用传到PreferenceGroup(一般是PreferenceScreen)缓存, 3)rInflate–rInflate,递归调用自己,这个情况属于内嵌了PreferenceScreen或PreferenceCategory的情况,它将继续解析子PreferenceScreen或PreferenceCategory里面的preference元素。 4)最终得到下面的树形数据结构: PreferenceScreen { preference,preference,…, PreferenceScreen { preference,preference,…, PreferenceCategory {preference,preference,… } }, PreferenceCategory {preference,preference,…} } 4.创建每个节点元素实例的流程: 主要逻辑在方法: public final T createItem(String name, String prefix, AttributeSet attrs), 参数: name:各preference类的name prefix:程序员自定义的preference时,prefix值为null,android系统的preference,prefix值为android.preference. attrs:这个是创建preference实例时,会传入的参数,即在preference构造方法中会使用到,用来获取xml元素节点中配置的preference的属性值。 主要逻辑代码如下,完整代码参考createItem方法: Constructor constructor = (Constructor) sConstructorMap.get(name); try { if (null == constructor) { // Class not found in the cache, see if it's real, // and try to add it Class clazz = mContext.

数组扁平化(展开多层嵌套数组)

通用方法 1、缺点:只能处理不包含null、undefined、NaN、对象等的普通数组,否则会出现异常 arr.join(',').split(','); 2、适用于各种数组 const flattern = (arr) => { return arr.reduce( (prev, cur) => prev.concat(cur instanceof Array ? flatten(cur) : cur), [] ) } const flattern = (arr) => { if (!Array.isArray(arr)) { return arr } return [].concat(...arr.map(flattern)) } 二维数组降维 Array.prototype.concat.apply([], arr)

实现sqlite datediff日期时间相减(日期差)的方法

sqlite里有个julianday函数转化后可以直接相减,得到的结果是以天(day)为单位数值,如果不足一天会以小数表示。于是想到应该可以用来换算成时间,即可以进行时间比较,比如要计算精确到hour级的比较,可以这样 sqlite》 select (julianday( datetime(‘2013-10-09 17:40’) )- julianday(strftime(’%Y-%m-%d %H:%M’,datetime(‘now’,‘localtime’))))24 。精确到分钟的比较可以24*60。

【零基础学爬虫】第五章:scrapy数据解析实战(二)

一、项目准备 1.创建工程 scrapy startproject qiubaiPro 2.创建爬虫文件 需求:爬取糗事百科中“段子”栏中的数据:https://www.qiushibaike.com/text/,解析作者名称+段子内容。 cd qiubaiPro scrapy genspider qiubai https://www.qiushibaike.com/text/ 3.修改配置文件 ROBOTSTXT_OBEY = False # 显示指定类型的日志信息 LOG_LEVEL = 'ERROR' # 修改UA伪装 USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' 二、程序编写 1.编写程序 import scrapy class QiubaiSpider(scrapy.Spider): name = 'qiubai' # allowed_domains = ['www.xxx.com'] start_urls = ['https://www.qiushibaike.com/text/'] def parse(self, response): # 解析作者的名称+段子内容 # 这里的xpath和etree.xpath不是同一个方法,但是用法几乎一样 div_list = response.xpath('//div[@class="col1 old-style-col1"]/div') for div in div_list: # xpath返回的是列表,但是列表元素一定是selector类型的对象 # extract 可以将selector对象中data参数存储的字符串提取出来 author = div.

iw命令 linux 没有_linux下ifconfig、iwconfig、iwlist命令详解

在linux下查看网络信息。 一、ifconfig 用途:配置网络信息。 如果没有参数,将给出当前的active 接口。 # ifconfig eth0 Link encap:Ethernet HWaddr 02:00:E1:00:11:5A inet addr:192.168.1.234 Bcast:192.168.1.255 Mask:255.255.254.0 inet6 addr: fe80::e1ff:fe00:115a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:17338002 errors:0 dropped:11993 overruns:0 frame:0 TX packets:228594 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1759095713 (1.6 GiB) TX bytes:67780580 (64.6 MiB) Interrupt:33 Base address:0xc000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:43362 errors:0 dropped:0 overruns:0 frame:0

es 父子查询_ElasticSearch 父子文档及多代父子文档(grandchild)解析之爸爸去哪儿了...

0x00 elasticsearch elasticsearch 简称 ES,是一个当前流行的搜索服务器(全文搜索引擎),不得不说,它的搜索速度以及提供的丰富搜索选项,在面对企业级的需求时,大多数情况都可以应付自如。从 2010 年诞生至今,已经更新到了 5.6 版本,github 上获得了 25000+的 star。但有些问题在国内还是很少见到解决办法,国内整体还是要比老外落后几年。 最近在面对一个较复杂的索引结构时,使用了多代父子关系文档,但其中遇到了一些问题,这里将解决过程中的收获总结出来给后来的人提供一些借鉴和思路。 0x01 父子文档 父子文档,你可以简单的理解为关系型数据库中的一对多关系,但我们不必自己去维护映射关系,ES 维护了父子映射关系,我们要想使用这个功能,需要完成下面两件事,缺一不可: 指定某一个文档 type 是另一个文档 type 的父亲 在存储子文档时通过 parent 参数指定父文档 id 其实还有一个隐含前提条件,父子关系文档必须被索引在同一个分片上,但最简单的父子关系(只有一代,没有祖辈及以上)不必去考虑,完成上面第二点其实就已经保证了这一点,多代父子的问题下面我会提。 对于指定关系,我们只有两个时间点去设置,创建索引时或者在子 type 创建之前更新父 type 的 mapping,大家可能发现了,这两种方式几乎都是需要重新定义相关的索引结构,所以父子关系的最好在设计之初就想好。 0x02 定义父子关系 PUT /es_test { “mappings”: { “parent_test”: {}, “child_test”: { “_parent”: { “type”: “parent_test” } } } } 1 2 3 4 5 6 7 8 9 10 11 最简单的例子,在创建 child_test 文档 type 时,指定 parent_test 的文档 type 为其父亲。

简单数字问题之数字黑洞问题

#include<algorithm> #include <iostream> using namespace std; void divide(int a, int b[] ) { for (int i = 0; i < 4; i++) { b[i] = a % 10; a /= 10; } } bool cmp1(int a, int b) { return a > b; } bool cmp2(int a, int b) { return a<b; } int sort1(int c[]) { int a = 0; int pow = 1; //从大到小 sort(c, c + 4, cmp1); for (int i = 3; i >=0; --i) { a += c[i] * pow; pow *= 10; } return a; } int sort2( int c[]) { int b = 0; sort(c, c + 4, cmp1); int pow = 1; for (int i = 0; i < 4; i++) { b += c[i] * pow; pow *= 10; } return b; } int a = 0; int c = 0; int b[4] = {}; int main() { int n; cin >> n; divide(n, b); int flag = 0; for (int i = 1; i < 4; i++) { if (b[i - 1] !

VC6.0 The value of ESP was not properly saved across a function call 错误的解决方法

首先在.dll里面简单写了一个int返回值的函数 extern "C" DLL_1_API int fTest_1(int k) { int i=5; int j=6; i=i+k; return i*j; } 然后在.exe文件里面调用dll文件 int main() { int a; int b=3; HINSTANCE dll123; typedef int (WINAPI *myfun)(int); dll123=LoadLibrary("DLL_1.dll"); if(dll123==NULL) { printf("cannot find dll"); } myfun msg1; //FARPROC 4字节指针 msg1=(myfun)GetProcAddress(dll123,"fTest_1"); if (msg1==NULL) { printf("cannot find function"); } else { a=msg1(b); printf("%d\n",a); } return 0; } 看着功能没有问题,但是一执行就出现了错误。如下图所示,这么大的红色错误让我很惊讶,虽然点击忽略已经能够正常执行程序了,但是我还是不想看到这样一个错误。 经过网上探究,发现了解决办法。 首先这个错误出现的原因是你定义函数指针原型时出错。 其实你定义的没有错,但是编译器不认识而已,因为你调用的dll函数是一个远函数,而且是一个C函数,你得告诉编译器它是个c函数才行。那么你就可以在定义该函数的时候加上一句话, FAR PASCAL 或者 __stdcall 这个就OK了。 具体做法: 比如说你要定义一个 返回类型为空,参数为空的函数指针:

JS快速排序算法

在Javascript中,排序算法是比较常用到的。 //快速排序 function quickSort(arr) { if (arr.length <= 1) { return arr } const middleIndex = Math.floor((arr.length - 1) / 2) const middle = arr.splice(middleIndex, 1)[0] const left = [] const right = [] for (let i in Object.keys(arr)) { const item = arr[i] if (item <= middle) { left.push(item) } else { right.push(item) } } return quickSort(left).concat([middle], quickSort(right)) }

使用bitmap处理海量数据的统计问题

bitmap是使用int型的byte位来表示某个数字是否存在。 一个int型占4个字节,共有32位,可以表示32个数字。通过判断某一位是否为1来确定某一个数是否存在。 vector<unsigned int> bitVec(INT_MAX>>5+1,0);//全部的数子需要多少个int数字表示 void bitmapSet(int val) { int index = val>>5;//获取第几个数字 int offset = val%32;//获取是第几位 bitVec[index] = bitVec[index] | (1<<offset);//按位或只要存在过这个数字就置为1; } bool bitmapGet(int val) { int index = val>>5;//获取第几个数字 int offset = val%32;//获取是第几位 return bitVec[index] & (1<<offset);//按位与当该位为1时,返回为true }

解决 为什么会出现 “Safari浏览器打不开该网页,因为地址无效“ 的提示

背景来源场景: H5拉起APP ,使用的方式是 URL Scheme 调用代码是 location.href = "xixi:// " 会出现 当你点击了取消之后会出现 “Safari浏览器打不开该网页,因为地址无效” 提示语 解决 debug 调试了一下发现 1、多次调用 location.href = "xixi:// " 点击取消是会出现 2、如果调用了location.href = "xixi:// " 跟着也会调用 打开App Store ,点击取消也是会出现上面的提示语

pytorch avg_pool2d

avg_pool2d用法 首先看一下官方文档解释 input :输入张量kernel_size :pool的大小,可以是一个单个数字,也可以是一个tuple,如果是单个数字,例如2,就是(2,2)stride: pool移动的大小,可以为单个数字,也可以是一个tuplepadding :在两侧填充0,可以为单个数字,也可以是一个tupleceil_mode :如果为True,将在公式中使用ceil而不是floor来计算输出形状。count_include_pad :值为true时,将在平均计算中包括零填充,默认为True。divisor_override :如果指定,它将用作除数,否则将使用池化区域的大小。 首先看最简单的使用: 输入一个向量: import torch import torch.nn.functional as F F.avg_pool2d(a,(1,2))#输入tensor为a,kernel_size为(1,2) 输出: 当输入的kernel为一个数字时: F.avg_pool2d(a,2)#kernel_size为(2,2) 红框外面的是剩下的,默认不使用,如果想用可以设置ceil_mode ,下面讲解 stride参数的使用: 默认情况下stride大小为kernel_size的大小,这里设为1,就以1为单位向右向下移动。 padding 参数的使用: 在两侧填充0 ceil_mode 参数的使用: 如果为True,将在公式中使用ceil而不是floor来计算输出形状。 count_include_pad 参数的使用: 值为true时,将在平均计算中包括零填充,默认为True。 divisor_override 参数的使用: 如果指定,它将用作除数,否则将使用池化区域的大小。 参考 https://pytorch.org/docs/stable/nn.functional.html?highlight=avg_pool2d#torch.nn.functional.avg_pool2d

net::ERR_FILE_NOT_FOUND报错

net::ERR_FILE_NOT_FOUND这种错误有可能是因为引入资源的路径出错提示 所以就要看看是那个文件无法引入,比如后台报错file://translate.google.com/……………… 这种就是设置有误 比如html文件设置的语言属性是lang=“en”,如果报错的话将其改为lang="zh-cn"即可

JS语法 ES6、ES7、ES8、ES9、ES10、ES11、ES12新特性

作者:小豪看世界 https://segmentfault.com/a/1190000039272641 本文集合了 ES6 至 ES11 常用到的特性,包括还在规划的 ES12,只列举大概使用,详细介绍的话内容量将十分巨大.。PS:使用新特性需要使用最新版的 bable 就行转义 新特性 ES6(2015) 1. 类(class) class Man { constructor(name) { this.name = '小豪'; } console() { console.log(this.name); } } const man = new Man('小豪'); man.console(); // 小豪 2. 模块化(ES Module) // 模块 A 导出一个方法 export const sub = (a, b) => a + b; // 模块 B 导入使用 import { sub } from './A'; console.log(sub(1, 2)); // 3 3. 箭头(Arrow)函数 const func = (a, b) => a + b; func(1, 2); // 3 4.

java 的typed_Java TypedValue.COMPLEX_UNIT_MM属性代码示例

/** * @param unit {@link TypedValue} Not recommended COMPLEX_UNIT_PX、COMPLEX_UNIT_DIP、COMPLEX_UNIT_SP * recommend COMPLEX_UNIT_PT */ private void setDensity(Context context, int unit) { if (context != null) { try { Resources res = context.getResources(); if ((res.getClass().getSimpleName().contains("MiuiResources") || res.getClass().getSimpleName().contains("XResources")) && !enableOtherResources) return; float xdpi = 0f; DisplayMetrics dm = getMetrics(context.getResources()); if (dm == null) return; switch (unit) { case TypedValue.COMPLEX_UNIT_PT: xdpi = dm.widthPixels / DESIGN_WIDTH * 72; break; case TypedValue.COMPLEX_UNIT_IN: xdpi = dm.widthPixels / DESIGN_WIDTH;

java算法 蛇形矩阵_算法基础之蛇形矩阵

1.[代码][Java]代码 package com.mark.pratice; import java.util.*; /** * Created by markzuo on 15-5-18. */ public class SnakeNumber { private int n; public SnakeNumber(int n) { this.n = n; } public void print() { int[][] data = new int[n][n]; data[0][0] = 1; data[n-1][n-1] = n * n; //根据蛇形矩阵的特点,分为上下两部分,以斜线为单位计算数据,从1开始编号 //本矩阵将从左至右为开始 //Top:上半部分,负责对角线,斜线数为k,1<=k<=(n-1),对于矩阵阶数n不区分奇偶,k区分 //每条斜线的最小数成递增数列,以1为开始 for (int k = 1; k <= n-1; k++) { if (k % 2 == 1) { //当k为奇数时,没条线的最小数在上方 data[0][k] = 1 + k * (k + 1)/2;

Linux 存储的基本管理

Linux 存储的基本管理 1. 实验环境的配置2. 设备识别3. 设备挂载4. 设备中文件的查找5. 分区6. swap 分区7. 磁盘配额 1. 实验环境的配置 在虚拟机中添加一块硬盘。 linux 中用超级用户的身份打开虚拟机控制界面,选择要添加硬盘的虚拟机;选择Add Hardware ,进入添加设别界面; 选择添加一块 5G 的硬盘,如图所示; 完成之后,会看到系统中有两块硬盘。 2. 设备识别 设备接入系统后都是以文件的形式存在。 设备文件名称: SATA/SAS/USB /dev/sda, /dev/sdb ##s= SATA ,d=DISK ,a表示第一块,b 表示第二块 IDE /dev/hd0,/dev/hd1 ##h= hard VIRTIO-BLOCK /dev/vda,/dev/vdb ##V=virtio M2 (SSD) /dev/nvme0,/dev/nvme1 ##nvme=m2 SD/MMC/EMMC(卡) /dev/cdrom,/dev/sr0,/dev/sr1 ##mmcblk=mmc卡 光驱 /dev/cdrom,/dev/sr0,/dev/sr1 设备查看 命令含义fdisk -l查看磁盘分区情况lsblk设备使用情况blkid设备管理方式及设备iddf查看正在被系统挂载的设备cat /proc/partitions查看系统识别设备 其中 df -h 和 df -H 时以规定的方式来显示正在被系统挂载设别的大小;如图所示: 输入命令 df 查看正在被系统挂载的设备; 输入命令 df -h 是以 2 的 n 次方计算大小;

java future 异常处理_java – 从CompletableFuture抛出异常

您的代码建议您稍后在同一方法中使用异步操作的结果,因此您无论如何都必须处理CompletionException,因此处理它的一种方法是 public void myFunc() throws ServerException { // Some code CompletableFuture a = CompletableFuture.supplyAsync(() -> { try { return someObj.someFunc(); } catch(ServerException ex) { throw new CompletionException(ex); } }); // Some code running in parallel to someFunc() A resultOfA; try { resultOfA = a.join(); } catch(CompletionException ex) { try { throw ex.getCause(); } catch(Error|RuntimeException|ServerException possible) { throw possible; } catch(Throwable impossible) { throw new AssertionError(impossible); } } // some code using resultOfA

试用期没过,因在公司上了 1024 网站...

最近浏览到一个知乎问题:某运营同学在试用期期间因为在工作期间上了某 1024 网站,导致试用期不过。 前两天还看到不少推文,大意是:看小电影前一定要注意网址是不是 HTTPS 的,因为 HTTPS 是加密的,别人就不知道了。 看到上面几个问题,我不禁想问(这脑回路也是……): 通过浏览器访问 HTTPS 站点,其他人真的没法知道吗? 通过 App 访问匿名论坛(HTTPS),公司怎么知道的?(他是不是接入了公司 WiFi?) 总之就是,上班时间上网摸鱼吗?哪怕用 HTTPS 访问,如果公司知道,是通过什么手段? 本文谈谈我的看法,主要分为以下几个方面: HTTPS 为什么安全? HTTPS 真的安全吗? App 如何保证信息安全,不被爬走? 公司可能的监控手段有哪些?我们如何做才能确保自己的隐私泄露? HTTPS 为什么安全 HTTPS,也称作 HTTP over TLS,TLS 前身是 SSL,会有各个版本。 TLS 协议在 TCP/IP 协议栈中的关系 上图描述了在 TCP/IP 协议栈中 TLS(各子协议)和 HTTP 的关系,HTTP+TLS 也就是 HTTPS。 和 HTTP 相比,HTTPS 的优势: 数据完整性:内容传输经过完整性校验。 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥。 身份认证:第三方无法伪造服务端(客户端)身份。 HTTPS 原理 上图就是大致介绍了 HTTPS 的握手流程,感兴趣的同学可以用 WireShark 抓包详细看看其中的每一个步骤,有助于理解 HTTPS 的完整流程。这里,我就不详述了。 大致就是客户端和服务端通过 “握手会谈” 商量出一个双方支持的加密算法和相应随机参数,得到一对密钥,后续的传输的内容都通过这对密钥进行加解密。 这对密钥很牛皮,比如要加密传输消息『tangleithu』,客户端通过公钥加密得到的密文『xyyaabbccdd』进行传输,服务端用自己的私钥对密文解密,恰好能得到『tangleithu』。 中间错一位都不行,这样就保证了数据完整和隐私性。这个过程比较复杂,本文不详述。 因此,你在通过 HTTPS 访问网站的时候,就算流量被截取监听,获取到的信息也是加密的,啥实质性的内容也看不到。