temp

程序性能优化之APK大小优化(六)下篇

馋奶兔 提交于 2019-12-06 02:49:06
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将继续从微信资源混淆AndResGuard原理来介绍APK大小优化: 微信的AndResGuard工具是用于Android资源的混淆,作用有两点:一是通过混淆资源ID长度同时利用7z深度压缩,减小了apk包大小;二是混淆后在安全性方面有一点提升,提高了逆向破解难度。本文从源码角度,来探寻AndResGuard实现原理。 阅读本文需要前提知识:掌握Android应用程序打包编译过程,尤其是对资源的编译和打包过程;熟悉resource.arsc文件格式。 推荐罗升阳文章: http://blog.csdn.net/luoshengyang/article/details/8744683 微信资源混淆工具源码地址: https://github.com/shwenzhang/AndResGuard 附上来自网络神图: ​ 0、程序入口CliMain.main() 该函数处理命令行参数、并解析自定义配置文件,混淆工具可以根据配置项进行特定处理,具体参考config.xml内容,针对其中特定内容,我们会在后面提到。然后进入真正混淆的入口函数resourceProgurad() 特别说明一下解析Configuration中关键点

Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)

烈酒焚心 提交于 2019-12-06 01:55:49
_ 前言 本文文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者: Bo_wen PS:如有需要最新Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=a3a533247e4c084a72c9ae88c271e3d1 最近两天学习了一下python,并自己写了一个网络爬虫的例子。 python版本: 3.5 IDE : pycharm 5.0.4 要用到的包可以用pycharm下载: File->Default Settings->Default Project->Project Interpreter 选择python版本并点右边的加号安装想要的包 我选择的网站是中国天气网中的苏州天气,准备抓取最近7天的天气以及最高/最低气温 http://www.weather.com.cn/weather/101190401.shtml 程序开头我们添加: # coding : UTF-8 1 2 这样就能告诉解释器该py程序是utf-8编码的,源程序中可以有中文。 要引用的包: import requests import csv import random import time import socket import http.client

String (套路Hash)

佐手、 提交于 2019-12-06 01:06:25
题目链接: https://vjudge.net/contest/344930#problem/I 题目大意:给你一个串s,和m,l.问你有多少长度为m*l的s的子串满足该子串由m个长度为l且个不相同的子串组成的个数.问的是长度为m * l的子串的个数。 思路:首先预处理出所有长度为l的字串的Hash值,之后有点像滑动窗口,前面减少了一个那么后面就增加一个。这样就可以避免算法的复杂度成为O(n^2) 1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <stdlib.h> 5 #include <string> 6 #include <string.h> 7 #include <math.h> 8 #include <vector> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 14 15 #define INF 0x3f3f3f3f 16 #define LL long long 17 18 typedef unsigned long long ull; 19 const int maxn = 2e5+10; 20 21 22 char s[maxn]; 23 ull

高效IO之Dex加密(三)

元气小坏坏 提交于 2019-12-05 22:57:47
更多Android高级架构进阶视频学习请点击: https://space.bilibili.com/474380680 apk加固原理之dex加密 原理其实不复杂,加固其实就是加密dex文件,防止dex专程jar 被阅读。后面才是热部署解密dex; 一、加密和解密方案 既然我们已经弄清了apk是如何打包的,那么将加密流程加到整个打包流程就相对清晰了。如下图 ​ 什么?还是不懂呢?那来看看我们整个加密和解密方案呢? ​ 我们的思路如下: 既然我们要加密,那么必然有解密,但是这个解密又必然是整个应用的一部分,但是连这部分都加密的话,那么系统就完全无法解析我们的应用,也就是完全无法安装了。所以我们需要将解密的部分提取出来单独作为一个module,且这个module是不能够被加密的。然后最好的解密时机就是首次启动应用的时候进行,所以Application自然成了我们负责解密的首选。那么是否意味着原apk中不能有这个module呢?答案是:错啦。原apk中同样要将这个解密module打包进去,否则原apk也无法编译通过啊。 我们都知道,系统在加载类的时候都是从我们apk的dex文件中加载的。ClassLoader会去维护一个这样的dex文件数组(这个在前面的热修复章节有介绍过)。而我们要做的就是将原apk中的dex都加密,然后将解密部分的代码单独编程成dex文件

19.yield和send的区别

泪湿孤枕 提交于 2019-12-05 22:42:12
转载: https://www.cnblogs.com/xhcdream/p/8304953.html     https://www.cnblogs.com/wushuaishuai/p/9212812.html send方法和next方法唯一的区别是在执行send方法会首先把上一次挂起的yield语句的返回值通过参数设定,从而实现与生成器方法的交互。 但是需要注意,在一个生成器对象没有执行next方法之前,由于没有yield语句被挂起,所以执行send方法会报错。 因为当send方法的参数为None时,它与next方法完全等价。但是注意,虽然这样的代码可以接受,但是不规范。所以,在调用send方法之前,还是先调用一次next方法为好。 #生成器的send用法 generator.send(value) def test(): i = 1 while i < 5: temp = yield i**2 print(temp) i += 1 t = test() #第一次运行只能使用next或者send(None) print(t.__next__()) #send的作用相当于使生成器继续运行,并且传递的参数为yield的返回值(程序中即temp的值) print(t.send("Hello World")) print(t.__next__())#相当于send(None)

定义对象并赋值

 ̄綄美尐妖づ 提交于 2019-12-05 22:10:06
2019年即将过去,回想一下这一年所经历的事情遇到的人和失去的一些东西,该以一个什么样的心态去迎接新的一年的到来... 树形数据转换 在处理商品分类数据、企业列表数据等情况下,后台会返回到前台所有的数据。我们需要根据parentId,数据ID将数据转换为树形数据进行渲染。 export function treeDataTranslate(data, id = 'id', pid = 'parentId') { var res = [] var temp = {} for (var i = 0; i < data.length; i++) { temp[data[i][id]] = data[i] } for (var k = 0; k < data.length; k++) { if (temp[data[k][pid]] && data[k][id] !== data[k][pid]) { if (!temp[data[k][pid]]['children']) { temp[data[k][pid]]['children'] = [] } if (!temp[data[k][pid]]['_level']) { temp[data[k][pid]]['_level'] = 1 } data[k]['_level'] = temp[data[k][pid]]._level +

Leetcode_395. Longest Substring with At Least K Repeating Characters_[Devide and Conquer]

笑着哭i 提交于 2019-12-05 20:35:46
题目链接 对一个字符串,找出一个最长的子串长度,这个子串中所有字符出现的次数至少为k。 1.滑动窗口 一开始把题目看成了,子串中每个字符至多出现k次。如果是这样,那么是一道典型的滑动窗口的题目。 然而,题目是至少出现k次。这样一来,滑动窗口不再适用。因为,在字符出现至多k次的问题中,当窗口尾部的字符超过k个,意味着只需要将窗口头部往后移动直至尾部字符等于k个;当尾部字符出现次数小于k次时,只需要将窗口尾部继续往后移动即可。而在字符出现至少k次的问题中,当尾部字符出现次数小于k次时,无法判断是移动窗口头部(舍弃尾部当前字符)还是移动窗口尾部(期待后面还有更多当前尾部字符)。 2.前缀和 然后想到了前缀和计数,然后用n^2的时间复杂度,检查每个子串是否满足所有字符至少出现k次。不出所料的超时。 3.一个想法 先对整个字符串的字符进行计数,假如存在出现次数少于k次的字符,那么目标串一定出现在被这个字符分隔开的几个字符串中。想到这里,我并没有得到什么更多的思路。。。 4.看了眼题解后 往深一步想, 假如存在出现次数少于k次的字符,那么目标串一定出现在被这个字符分隔开的几个字符串中 。那么,对这里的每一个分割产生的字符串,再求所有字符出现次数大于k的最长子串。不就得到原问题的一个子问题了吗?也就找到了递归关系。 class Solution { public: vector<string>

几种常见排序算法的实现原理性能分析和c语言实现

霸气de小男生 提交于 2019-12-05 19:19:47
~~~~~~~~~~~~~~~~~还未完成发布点错了~~~~~~~~~~~~~ 本文介绍8种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了方便比对,本文所有的排序全部是升序. 首先准备一个元素无序的数组,一个交换函数,在main函数中实现排序函数的调用,并输出排序结果: void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int length = sizeof(arr) / sizeof(int); sort(arr, length); for (int i = 0;i < length;i++) { printf("%d\n", arr[i]); } return 0; } 插入排序 第一次排序: 第二次排序: 第三次排序: 外层循环每执行一次就从无序区向有序区中插入一个数据arr[i]   里层循环控制插入的数据arr[i]与其前一个数据比较,如果比前一个数据小,就让前一个数据后移1位   ...不断重复上述步骤,直到找到不比arr[i]小的数据arr[j],因为arr[j]后面的数据都后移了1位,所以直接将arr[i]放在空闲的arr[j+1]位置 c程序实现: void CRsort(int

在做字符串拼接的时候,用string还是StringBuilder?

自闭症网瘾萝莉.ら 提交于 2019-12-05 16:43:05
转载请注明出处: http://www.bluesd7.com/蓝影闪电的随笔/ContentId/5/stringorStringBuilder string: 引用类型,适用于少量的字符串拼接操作。因为它会不断的创建对象,每次都要去申请内存空间,影响性能。 //大量字符串拼接 性能差 total time is: 2647ms string str = string.Empty; for (int i = 0; i < 10000; i++) { string temp = i.ToString() + "bluesd7.com"; str += temp; } StringBuilder: 引用类型,适用于大量的字符串拼接操作。在创建对象时会申请一大块内存空间,性能好。 //大量字符串拼接 性能好 total time is: 1ms StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { string temp = i.ToString() + "bluesd7.com"; sb.Append(temp); } 来源: CSDN 作者: 蓝影闪电 链接: https://blog.csdn.net/yuzhao_blue/article/details/82927457

hive 加载数据后在HDFS上的文件及其整合

我怕爱的太早我们不能终老 提交于 2019-12-05 15:11:40
建一个表,没有任何数据,在hdfs 上也没有对应的数据文件 hive> select * from product; OK id name Time taken: 0.104 seconds hive> dfs -ls /user/hive/warehouse/psi.db/product; hive> 从本地加载一个文件到该表: hive> load data local inpath 'product.txt' into table product; Copying data from file:/root/product.txt Copying file: file:/root/product.txt Loading data to table psi.product Table psi.product stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 25, raw_data_size: 0] OK Time taken: 0.398 seconds 查看数据: hive> select * from product; OK id name 1 apple 2 samsung 3 moto Time taken: 0.124 seconds, Fetched: 3 row(s) 查看HDFS