Python 深拷贝和浅拷贝
前言在写某个脚本时,用了DFS(深度有限遍历)算法判断两个点的可达性,并传入参数trace记录路径,如下因为直接采用赋值形式,导致函数逻辑错误(cur_trace改变的时候,trace也改变了),这才了解到在Python中存在赋值、浅拷贝和深拷贝的区别。
相关概念在了解赋值、深浅拷贝之前,先来了解以下概念:
对象:
不可变对象:一旦创建就不可修改的对象,如数值(int, float)、字符串、元组是不可变对象。
可变对象:对象本身可变,如列表、字典、集合。
引用:在python中,新建一个变量都是在为某个对象新增一个引用,引用本身不占有内存空间,只是对对象的一个指向(别名)。如下图,在a=2中,2是一个对象,a是对2这个对象的一个引用。
赋值
方法:“=”
特点:赋值就是对对象的引用,不开辟新的内存空间。如下,b=a只是对a所指的对象增加一个引用b,a和b指向同一个对象。
当改变b时:a也会改变。
浅拷贝
方法:
切片操作:b = a[:]
列表生成式:b = [ _ for _ in a]
工厂函数:b ...
Python 正则表达式用法
前言正则表达式是特殊的字符串序列,可以实现模糊匹配一个字符串是否符合某种指定模式。
用法语法精确字符匹配
模式
描述
^
匹配字符串的开头
$
匹配字符串的末尾。
.
匹配任意字符,除了换行符
[…]
匹配一组字符,或的关系,如[amk] 匹配 ‘a’,’m’或’k’
[^…]
匹配不在[]中的字符,非的关系,如[^abc] 匹配除了a,b,c之外的字符。
\w
匹配字母数字及下划线
\W
匹配非字母数字及下划线
\s
匹配任意空白字符,等价于 **[ \t\n\r\f]**。
\S
匹配任意非空字符
\d
匹配任意数字,等价于 [0-9].
\D
匹配任意非数字
\A
匹配字符串开始
\Z
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。
\z
匹配字符串结束
\G
匹配最后匹配完成的位置。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B
匹配非单词边界。’er\B’ 能匹配 “ver ...
git常用命令
常用命令
clone远程仓库到本地:在准备放仓库的路径下,git clone +仓库地址
更新本地仓库:git pull
查看仓库提交状态:git status
放弃所有更改:git checkout .
修改commit的注释:git commit –amend,进入vim编辑后保存
分支管理
切换分支:git checkout 分支名
新建本地分支并切换:git checkout -b 分支名
提交本地分支到远程,创建/更新同名远程分支:git push origin 本地分支名
删除远程分支:git push –delete origin 远程分支名
删除本地分支 (ps:先切换到其他分支,才能删除该分支):git branch -d 本地分支名
常用操作同步1.保存本地更改
1> git add .
2.保存提交
1> git commit -m "本次提交的备注"
3.本地仓库和远程同步
1> git pull
4.将提交推到远程仓库
1> git push
合并分支—分支合并到mast ...
Android Handler 异步消息处理机制
前言在Android 多线程场景中,存在主线程和子线程之分,主线程是应用程序首次启动时自动开启的,子线程由人为创建和开启。主线程不允许执行耗时任务,子线程不允许更新UI控件(多个线程并发操作UI控件存在线程不安全),所以当某些耗时任务执行后需要更新UI控件时,通常由子线程去执行耗时任务,然后再根据任务执行结果由主线程(又称UI线程)更新响应的UI控件。这其中,子线程与主线程之间通常使用Handler异步消息处理机制完成通信。
Handler机制基本原理Handler异步消息处理机制主要有4部分组成:Message,MessageQueue,Handler,Looper
Message:存储线程需要传递的信息的对象。Message可以携带少量信息,用于不同线程之间的数据交换。
MessageQueue:消息队列,先进先出,存储所有需要处理的消息。每个线程有一个MessageQueue。
Handler:消息处理者,有两个功能:(1)通过Handler.sendMessage()方法将消息发送到MessageQueue中存储;(2)通过Handler.handleMessage对接收到 ...
Java Lambda表达式
相关概念函数式编程函数式编程(Functional Programming)思想以函数为基本运算单元,函数可以允许函数作为参数,也可以返回函数。Lambda表达式是一种函数式编程风格。
函数接口如果一个接口只定义一个抽象方法,那么这种接口成为函数接口(Functional Interface),在Java中可以用注解@FunctionalInterface标记,这是可选的,当使用此标记时,编译器会自动检查是否符合函数接口规范。Lambda表达式主要用于函数接口的实现,略微抽象,但比匿名内部类实现方式更加简洁。
类型推断机制Java编译器通过查看每个方法调用和相应声明来确定适于调用的参数类型,这种能力称作类型推断。Lambda表达式之所以可以大大简化表达,依赖的主要机制之一是Java编译器的类型推断能力。
Lambda 表达式语法Lambda表达式是Java 8 发布的重要新特性。它依赖函数式编程风格和类型推断机制,通过省略接口名、省略方法名、以及可选的省略某些表达格式,简化函数匿名内部类写法,更加简洁实现函数接口。
语法格式如下:
一般形式:(参数1,参数2)-> { ...
Pillow批量打水印
Pillow介绍PIL(Python Imaging Library)是Python图像处理标准库,但只支持Python2.7;Pillow是在其基础增加了兼容性和其他新特性,支持最新Pytho3.x。进行图像处理时,可以直接安装Pillow,就能使用PIL和Pillow中的API。
打水印方法预期效果:
打水印前
打水印后
方法:
创建一个和底图相等大小的画布,透明度设置为0,在画布上添加水印的文字并调整好位置,叠加到底图上。
注意事项:
在批量添加水印的过程中,由于底图大小不一,所以水印文字的大小应该由底图大小来动态决定
由于水印的文字大小是动态的,水印位置如果设置成绝对位置,会出现吞字情况,所以水印的位置也应该设置成动态的。
示例代码
PIL.Image.new(mode,size,color): 创建新图像。mode:图像的模式(RGB/RGBA),size图像大小,color初始化图像底色。
PIL.Image.alpha_composite(img1,img2): 将img2复合到img1上,相当于图层叠加。img1必须是RGBA模式,img2也必须 ...
Java反射机制
Java反射机制概念Java的反射机制本质是在运行时,通过对象实例来动态加载对象的信息。是为了解决在运行期间,对某个实例不知道是什么类的情况下,如何调用其声明方法、字段的问题。
场景举例现有主类Main、Person类和Person的子类Student,主类的main函数中获取Student类的一个实例stu,并传入test方法。但是由于test方法的参数是顶级父类Object对象,调用test方法时可以传入任何对象,所以对于test方法内部来说,并不能知道实际传入的对象是什么,如果想要在test中访问具体传入对象的属性和方法怎么办呢?
这种情况下,通过反射就可以在test方法中得到此时传入的object具体实例以及访问它的方法和字段
12345678910111213141516171819202122public class Main{ public static void main(String[] args){ Student stu = new Student(); stu.age =22; test(st ...
Java回调机制及Android中的回调方法
Java回调机制回调函数可以使得工作流更加灵活。回调机制是一种常见的设计模型,它在工作流中将某个功能按照约定的接口提供给用户,由用户实现这部分功能,由工作流决定回调时机。
回调机制分为两步:回调函数注册和回调
回调函数注册:首先,假设 class A提供一个工作流,在该工作流中有个方法a可由用户实现,于是class A规定了接口i,在接口中告诉用户去实现方法a。这时候来了一个用户class C需要使用class A的工作流,class C实现了a方法。
回调:class C调用了class A的工作流,在执行a方法时,其实回调了自己实现的a方法。
举例class A中提供一个方法testTime(工作流),计算某个给定方法的执行时间。计算的方法可以由用户指定。此时有一个用户class C,需要调用class A的testTime来计算自己的方法testMethod执行时间
首先定义接口,将回调的功能单独抽离,并在接口中提供方法a,计算方法可以放到a中,实现调用:
123public interface CallBack{ public void a();} ...
论文阅读--Towards Measuring Supply Chain Attacks on Package Managers for Interpreted Languages
论文阅读——Towards Measuring Supply Chain Attacks on Package Managers for Interpreted Languages
论文链接:https://cyfi.ece.gatech.edu/publications/NDSS_21.pdf
开源项目地址:https://github.com/osssanitizer/maloss
这篇论文来自NDSS 21,第一作者是来自佐治亚理工学院的Ruian Duan。这是一篇对解释型语言的包管理生态的评估研究。其中有很多人工分析部分工作,但是做得非常全面,系统,细致。
引言
包管理器(package manager 或称registry)在现代软件开发过程中扮演十分重要的角色。通过包管理,开发者可以直接复用第三方代码,防止重复造轮子,实现高效开发。然而近年来包管理被发现存在安全问题,攻击者可能通过包管理发起供应链攻击:攻击者向包管理上传恶意包,让供应链下游开发者使用这些恶意包,实现攻击终端用户。
为了分析评估包管理供应链生态以及强调包管理供应链攻击的危害性,论文设计一个针对包管理的分 ...
Android之ICC机制(三)
前言
从v2.8开始,FlowDroid集成ICCTA模块,只要提供指定格式的ICC信息(即ICC model),FlowDroid可以在CallGraph(CG)中增加重定向边,弥补ICC的在CG中的不连续(如下)。本篇文章小结为了让FlowDroid实现ICC插桩,构造尽可能完整且有效的ICC model的过程。
1234eg. Activity1在onCreate()中调用startActivity(),调起Activity2。ICCTA在CG中实现如下:Activity1#onCreate() -> redirector1() -> Activity2#dummyMain() -> Activity2#onCreate()
获取完整有效的ICC model
方案一:IC3中获取ICC model
FlowDroid中的ICCTA模块以IC3生成的ICC model作为输入样例。所以首先尝试的方法从IC3中获取ICC model。
IC3生成ICC model过程如下:
step1: 首先通过反编译工具dare获取apk的.class文件。
step ...