乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

关于Git版本回退的几种方法

发表于 2020-11-17

如果已经commit 想要回退

版本回退

1
git reset --hard HEAD^   //一个^代表一个版本 如果回退两个版本那就HEAD^^ 以此类推

指定版本/版本穿梭

1
git reset --hard 8383f01   //一个^代表一个版本 如果回退两个版本那就HEAD^^ 以此类推

如果还没有commit

第一种 使用reset回退到当前版本初始状态

1
git reset --hard HEAD

第二种 使用checkout

1
2
git reset checkout . //放弃所有文件的修改
git reset checkout 指定相应文件

第三种 使用stash

1
git stash  //暂存当前修改的代码

第四种 使用revert重做

1
git revert -n 版本号

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

关于Git打标签Tag分支

发表于 2020-11-17

分支管理

查看当前标签

1
git tag

在本地代码仓库给项目打上一个标签

1
git tag -a v1.0 -m "version 1.0"

将标签推送到远程仓库

1
git push origin v1.0

检出v1.0标签

1
git checkout origin v1.0

从检出状态创建v1.0bugfix分支

1
git checkout -b bugfix1.0

查看远程分支

1
git branch -r

删除远程分支

1
git branch -r -d origin/bugfix1.0

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

短视频拍摄手法大致有哪些

发表于 2020-11-17

推

说明: 视频拍摄中常用的手法之一, 是指把手机或相机慢慢想拍摄主体推进, 常用于烘托氛围或者强调某个人/事/物

拉

说明: 是指把手机或者相机慢慢向后拉, 使拍摄主体在画面中慢慢变小, 常用于向观众张氏拍摄主体所处的环境

摇

说明: 是只拍摄者拍摄机位不懂(站在原地), 通过摇动手机臂带动手机/相机呈弧线运动

移

说明: 通常是指在水平方向, 按一定运动轨迹进行运动拍摄, 是一种侧面跟拍人物的表现手法

跟

说明: 通常是指在物体后方一直跟着拍摄主体进行拍摄

升

说明: 通常是指在手机由下往上进行拍摄, 这种拍摄方式是展现拍摄氛围的绝佳手段

降

说明: 通常是指在手机由上往下进行拍摄, 这种拍摄方式是拍摄光晕的首选

旋转

说明: 通常是指被拍摄物是圆形的中心点, 手机按一定半径围绕圆心点进行旋转

静

说明: 镜头固定 适合知识类型讲解的画面

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

python金融量化交易

发表于 2020-11-17

量化投资绝对是一个趋势

免费数据回测平台

  • 米筐 www.ricequant.com
  • 聚宽 https://www.joinquant.com/

相关代码

以米筐api为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 #需求: 获得市盈率大于50且小于65, 营业总收入前10的股票
# 每日调仓
def init(context):

# 沪深300
context.hs300_list=index_components("000300.XSHG")

# 在context中保存全局变量
context.s1 = "000001.XSHE"
# 实时打印日志
logger.info("RunInfo: {}".format(context.run_info))

# 开启定时器 按月调仓
# scheduler.run_monthly(getdata,tradingday=1)


def getdata(context, bar_dict):
# 在一号的时候 先执行before_trading 然后执行getdata定时任务方法 最后执行handle_bar
q=query( fundamentals.eod_derivative_indicator.pe_ratio,fundamentals.income_statement.revenue).filter(
fundamentals.eod_derivative_indicator.pe_ratio>50
).filter(
fundamentals.eod_derivative_indicator.pe_ratio>65

).order_by(
fundamentals.income_statement.revenue.desc()

).filter(
# 在指定的股票池当中选择
fundamentals.stockcode.in_(context.hs300_list)

).limit(10)
found=get_fundamentals(q)
# 格式化显示
logger.info(found.T)
# 将第一列股票代码 放候选表中
context.stock_list=found.T.index

# before_trading此函数会在每天策略交易开始前被调用,当天只会被调用一次
def before_trading(context):
# 选股 获得市盈率大于50且小于65, 营业总收入前10的股票
q=query( fundamentals.eod_derivative_indicator.pe_ratio,fundamentals.income_statement.revenue).filter(
fundamentals.eod_derivative_indicator.pe_ratio>50
).filter(
fundamentals.eod_derivative_indicator.pe_ratio>65

).order_by(
fundamentals.income_statement.revenue.desc()

).limit(10)
found=get_fundamentals(q)
# 格式化显示
logger.info(found.T)
# 将第一列股票代码 放候选表中
context.stock_list=found.T.index


# 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
def handle_bar(context, bar_dict):
# 先判断仓位是否有股票 如果有,卖出不符合条件的股票
if len(context.portfolio.positions.keys())!=0:
for stock in context.portfolio.positions.keys():
if stock not in context.stock_list:
#如果持有的股票不在新股票池中, 卖出
order_target_percent(stock,0)
# 买入最新股票池中的10只股票 等比买入
for new_stock in context.stock_list:
order_target_percent(new_stock,1/len(context.stock_list))


# after_trading函数会在每天交易结束后被调用,当天只会被调用一次
def after_trading(context):
pass

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Charles抓取Https请求的相关配置Windows篇

发表于 2020-11-17

第一步添加SSL代理配置

添加代理主机

第二步 添加根证书

最后重启Charles即可抓包

补充

1.Charles Map rRemote

关于https的抓包, 我们在使用charles工具时还可以使用它的路径映射功能, 也就是自动将https替换成http协议

image-20220805142316685

image-20220805142357260

2.反编译全局替换

另外, 如果你是为了给App抓包, 刚好在反编译该App, 在条件允许的情况下, 可以在反编译smali后,批量对源码中的https进行替换 然后重新打包, 效果也不错

3.使用模拟器抓包

有些网站在手机上可以访问但是在电脑浏览器无法访问 大家懂的, 此时我们若通想通过浏览器控台提取相应的资源无法实现, 而且真机上的浏览器默认屏蔽了一部分https抓包功能 尤其是Android7.0以上版本机器

此时 我们可以考虑使用模拟器 比如网易模拟器 默认配备了Android6.0的系统, 低版本的系统相对来说限制要少很多

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android进阶之逆向安全反编译视频教程-胖薯出品

发表于 2020-11-06

适用人群

  • 对安卓逆向反编译有兴趣的同学
  • 安卓逆向从业者

课程要求

适用于有安卓开发基础的同学

课程概述

学完本课程后可以实现对App进行逆向破解操作, 其中包括:

  1. app内容篡改
  2. app运行流程篡改
  3. app数据拦截和替换
  4. https数据拦截以及xposed hook操作

课程特色

15课时 帮你快速入门安卓逆向反编译

课程亮点

  • 适合新手入门 只要有一定的安卓开发基础就能快速掌握

  • 内容清晰循序渐进 不拖沓 全程干货

  • 配套工具 快速上手 一边学习一边实战

课程大纲

  • 第一部分: 反编译工具的基本介绍和使用

  • 第二部分: App启动入口替换

  • 第三部分: Https请求抓包

  • 第四部分: JNI数据分析

课程观看

  • 网易云课堂
  • 51CTO课堂
  • 面包多付费观看
  • Udemy课堂
  • B站免费观看
  • YouTube观看
  • 淘宝/拼多多赞助观看

作者介绍

移动端讲师、作家、开发者、独立音乐人

《smali语言从门到精通》《安卓进阶之逆向安卓反编译从0到1》《硬件进阶之三大架构汇编语言入门》系列视频作者 九年移动开发经验 旨在将复杂的事情简单化

欢迎大家来学习 一块进步~

1b954d951bca464294b5761a77fae70d

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

smali基本语法

发表于 2020-11-06

注释

1
2


类声明

1
2


方法声明

1
2


字段声明

1
2


字段取值赋值

1
2


方法调用

1
2


方法取值

1
2


包名和签名

发表于 2020-11-06

包名作用?

1
唯一标识

一台机器能否同时运行两个相同包名的不同应用?

1
2
3
不可以
原因: 一个包名代表一个应用, 相同包名系统认为是同一个应用, 会进行覆盖安装
原理: 签名不一致

一台机器能否同时运行两个相同签名的不同应用?

1
可以

历史问题:反编译为什么必须要修改包名?

1
成为一款独立的应用, 方便用户下载安装

Smali语言从入门到精通视频教程-胖薯出品

发表于 2020-11-06

适用人群

  • 对Smali语言以及逆向反编译有兴趣的同学
  • 安卓逆向从业者

课程要求

有任意一门编程语言的同学均可学习, 有Java或者安卓基础最佳

课程概述

安卓逆向必备基础知识 学完后快速掌握smali语法

课程特色

23课时 帮你快速入门Smali语言

课程亮点

  • 从0到1快速入门 基础语法开始 循序渐进

  • 内容清晰流畅 不废话不拖沓

  • 配套工具 快速上手 一边学习一边实战

课程大纲

  • 第一部分: Smali语言和Java语言的对比分析

  • 第二部分: 类和各种方法以及属性的定义

  • 第三部分: 寄存器的声明和定义

  • 第四部分: 手写Smali代码打印输出

课程观看

  • 网易云课堂
  • 51CTO课堂
  • 面包多付费观看
  • Udemy课堂
  • B站免费观看
  • YouTube观看
  • 淘宝/拼多多赞助观看

作者介绍

移动端讲师、作家、开发者、独立音乐人

《smali语言从门到精通》《安卓进阶之逆向安卓反编译从0到1》《硬件进阶之三大架构汇编语言入门》系列视频作者 九年移动开发经验 旨在将复杂的事情简单化

欢迎大家来学习 一块进步~

image-20240409102103326

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

smali语言之locals和registers的区别

发表于 2020-11-04

介绍

对于dalviks字节码寄存器都是32位的,它能够表示任何类型,2个寄存器用于表示64位的类型(Long and Double)。

作用

声明于方法内部(必须)

1
2
3
4
5
.method public getName()V
.registers 6

return-void
.end method

.registers和locals基本区别

在一个方法(method)中有两中方式指定有多少个可用的寄存器。指令.registers指令指定了在这个方法中有多少个可用的寄存器,

指令.locals指明了在这个方法中非参(non-parameter)寄存器的数量。然而寄存器的总数也包括保存方法参数的寄存器。

参数是如何传递的?

1.如果是非静态方法

例如,你写了一个非静态方法LMyObject;->callMe(II)V。这个方法有2个int参数,但在这两个整型参数前面还有一个隐藏的参数LMyObject;也就是当前对象的引用,所以这个方法总共有3个参数。
假如在一个方法中包含了五个寄存器(V0-V4),如下:

1
2
3
4
5
6
.method public callMe(II)V
const-string v0,"1"
const-string v1,"1"

return-void
.end method

那么只需用.register指令指定5个,或者使用.locals指令指定2个(2个local寄存器+3个参数寄存器)。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.method public callMe(II)V
.registers 5
const-string v0,"1"
const-string v1,"1"
v3==>p0
V4==>P1
V5==>P2

return-void
.end method

或者
.method public callMe(II)V
.locals 2
const-string v0,"1"
const-string v1,"1"
return-void
.end method

该方法被调用的时候,调用方法的对象(即this引用)会保存在V2中,第一个参数在V3中,第二个参数在v4中。

2.如果是静态方法

那么参数少了对象引用,除此之外和非静态原理相同,registers为4 locals依然是2

关于寄存器命名规则

v命名法

上面的例子中我们使用的是v命名法,也就是在本地寄存器后面依次添加参数寄存器,

但是这种命名方式存在一种问题:假如我后期想要修改方法体的内容,涉及到增加或者删除寄存器,由于v命名法需要排序的局限性,那么会造成大量代码的改动,有没有一种办法让我们只改动registers或者locals的值就可以了呢, 答案是:有的

除v命名法之外,还有一种命名法叫做p命名法

p命名法

p命名法只能给方法参数命名,不能给本地变量命名

假如有一个非静态方法如下:

1
.method public print(Ljava/lang/String;Ljava/lang/String;I)V

以下是p命名法参数对应表:

p0 this
p1 第一个参数Ljava/lang/String;
p2 第二个参数Ljava/lang/String;
p3 第三个参数I

如前面提到的,long和double类型都是64位,需要2个寄存器。当你引用参数的时候一定要记住,例如:你有一个非静态方法

1
LMyObject;->MyMethod(IJZ)V

方法的参数为int、long、bool。所以这个方法的所有参数需要5个寄存器。

p0 this
p1 I
p2, p3 J
p4 Z

另外当你调用方法后,你必须在寄存器列表,调用指令中指明,两个寄存器保存了double-wide宽度的参数。

注意:在默认的baksmali中,参数寄存器将使用P命名方式,如果出于某种原因你要禁用P命名方式,而要强制使用V命名方式,应当使用-p/–no-parameter-registers选项。

总结

  • locals和registers都可以表示寄存器数量,locals指定本地局部变量寄存器个数,registers是locals和参数寄存器数量的总数,两者使用任选其一
  • 同时,寄存器命名一共分两种,一种是v命名法,另一种是p命名法
v0 the first local register
v1 the second local register
v2 p0 the first parameter register
v3 p1 the second parameter register
v4 p2 the third parameter register
1…323334…51

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

505 日志
145 标签
RSS
© 2026 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%