一、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里有个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。
一、项目准备 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.
在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
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] !
首先在.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了。
具体做法:
比如说你要定义一个 返回类型为空,参数为空的函数指针:
在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是使用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 }
背景来源场景:
H5拉起APP ,使用的方式是 URL Scheme
调用代码是
location.href = "xixi:// " 会出现
当你点击了取消之后会出现 “Safari浏览器打不开该网页,因为地址无效” 提示语
解决 debug 调试了一下发现
1、多次调用 location.href = "xixi:// " 点击取消是会出现
2、如果调用了location.href = "xixi:// " 跟着也会调用 打开App Store ,点击取消也是会出现上面的提示语
如下图所示 解决方案:
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这种错误有可能是因为引入资源的路径出错提示
所以就要看看是那个文件无法引入,比如后台报错file://translate.google.com/………………
这种就是设置有误
比如html文件设置的语言属性是lang=“en”,如果报错的话将其改为lang="zh-cn"即可
作者:小豪看世界
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.
/**
* @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;
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 存储的基本管理 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 次方计算大小;
您的代码建议您稍后在同一方法中使用异步操作的结果,因此您无论如何都必须处理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 网站,导致试用期不过。
前两天还看到不少推文,大意是:看小电影前一定要注意网址是不是 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 访问网站的时候,就算流量被截取监听,获取到的信息也是加密的,啥实质性的内容也看不到。