SymPy学习笔记(四)化简
SymPy中的 simplify() 可以进行智能的化简
但是,simplify() 的输出有时候会和你的预想不同,因为并没有“最简”并没有一个严格的定义。
想要得到 (x+1)2(x+1)^2(x+1)2 应该使用 factor()。
而且,simplify() 会调用多种化简函数,为了方便,一般在交互式界面里使用 simplify() 。如果在程序里使用,会造成运行效率低下。当你知道需要化简成什么形式时,应该使用对应的化简函数。这样不仅运行快,而且输出的格式是固定的。
以下是一些常用的化简函数
expand()展开,如
(x+2)∗(x−3)=x2−x−6(x + 2)*(x - 3) = x^2 - x - 6
(x+2)∗(x−3)=x2−x−6
factor()因式分解,如
x2z+4xyz+4y2z=z(x+2y)2x^{2} z + 4 x y z + 4 y^{2} z = z \left(x + 2 y\right)^{2}
x2z+4xyz+4y2z=z(x+2y)2
如果希望得到所有因子的列表,用factor_list()
3. collect(ex ...
ZJU校巴-SQL_injection解题记录
前言
继续学习CTF,记录一下第一道Web。
题目
作为教程性质的题目,这道题几乎把什么都写出来了,连表名flag_is_here都知道了,真好。
题目已经告诉我们表名,并且给出了注入类型属于数字而不是字符串,因此不需要加单引号。
简单试一下 1 OR 1 = 1 发现给出了 0-7 全部的题目。
再试一下 1 AND EXISTS(SELECT * FROM flag_is_here),返回了第一条数据,题目果然没骗我。
猜测列名为 “flag” ,先手注 1 AND EXISTS(SELECT flag FROM flag_is_here) ,发现有这个列,居然一次就猜对了XD。
然后试一下有几行 1 AND (SELECT count(*) FROM flag_is_here) = 1,不行,居然不止一个。再来试试2个,发现成功了,有两行flag。
题目不允许使用 UNION ,那么只能考虑布尔盲注(Boolean-based Blind Injection)了,注意到这个题目的输出其实并不是 True or False,而是八个 bit 的数据,一共 256 种情况,可以 ...
Linux下的inode与软硬链接
inode
inode(index node),索引节点,是文件系统中用来储存文件元数据(metadata)的数据结构,例如文件储存的位置、创建时间、最后修改时间、所有者、访问权限等(但不包括名字)。每一个inode在创建的时候都会分配一个唯一的编码,知道了这个编码,就可以查到文件的元数据。
inode文件系统会将储存空间分成两个连续的区域,一个是由inode组成的表,另一个储存了文件的内容数据。读取文件时先通过inode找到文件储存的位置,再读取文件。
类Unix系统中的目录其实就是一种特殊的文件,也有自己的inode。这个特殊的文件中保存了所有包含的文件和子目录的名称以及它们的inode号码。访问目录,就是在读取目录这个特殊的文件中的内容。
硬链接与软链接
在Linux中,使用ln <target> <link_name>命令可以创建链接,默认创建的是 硬链接(hard link)。加上-s(代表soft)可以创建 软链接(soft link)。那么,两者有何区别?
首先要强调的是,在日常的使用中,软硬链接几乎是一样的,他们的区别在于底层的实现。
硬链接
...
SymPy学习笔记(三)输出
初始化
init_printing()会为你启用当前环境下可用的最佳的输出效果。
12from sympy import init_printinginit_printing()
如果你使用交互式命令行,init_session() 函数将自动导入SymPy中的所有内容,创建一些常用符号,设置绘图,并运行 init_printing()。
12345678910111213>>> from sympy import init_session>>> init_session() Python console for SymPy 0.7.3 (Python 2.7.5-64-bit) (ground types: gmpy)These commands were executed:>>> from __future__ import division>>> from sympy import *>>> x, y, z, t = symbols('x y z t')>> ...
SymPy学习笔记(二)需要避免的坑
坑一:符号与变量
符号(Symbol)指的是SymPy提供的,用symbols()定义的符号,而变量是Python提供的。
12345>>> x = symbols('x')>>> expr = x + 1>>> x = 2>>> print(expr)x + 1
以上这个程序,并没有输出3,而是输出了x + 1,这是因为x = 2只是将变量x的值,从符号xxx,变成了数字2,而符号xxx并没有发生改变,因此expr的值也就没有改变。
想要计算expr在x=2条件下的值,可以使用subs:
1234>>> x = symbols('x')>>> expr = x + 1>>> expr.subs(x, 2)3
坑二:等于号
假如你用==检测两个式子是否相等,你将会得到错误的结果:
12>>> (x + 1)**2 == x**2 + 2*x + 1False
SymPy并没有扩展Python的语法,=依 ...
SymPy学习笔记(一)安装与基本使用
简介
SymPy 是一个开源的符号计算Python库,SymPy采用了宽松的BSD开源协议,并且完全免费。它的目标是成为一个全功能的计算机代数系统(CAS),同时保持代码尽可能简单,以便于理解和扩展。
本学习笔记参考官方的教程:https://docs.sympy.org/latest/tutorials
安装
如果你使用Anacoda,无需安装,Anacoda内置了SymPy。
如果你使用pip:
1pip install sympy
前置芝士
会Python就行。数学水平因人而异,根据自己的需要选用相应的功能。
什么是符号计算?
前面提到,SymPy是一个 符号计算 库,那么什么是符号计算。符号计算(Symbolic Computation),就是在计算机上用符号精确表示数学对象,而不是得到一个近似的数值解。
看一个例子:
123>>>import math>>>math.sqrt(8)2.8284271247461903
Python的math库给出的计算8\sqrt 88的结果是2.82842712474619032.8284271247 ...
ZJU校巴-Reverse1解题记录
前言
最近开始正式学习CTF了,准备先打一打校巴上比较简单的题,遇到什么不懂的再去学习。慢慢提升自己的水平。
这是我的第一道Reverse。
题目
题目给了一个二进制可执行程序,执行这个程序,会显示“Please input flag:”,尝随便输入几个字符,结果会输出“Your flag is not right.”。
使用Ollydbg打开这个程序,找到以下这段需要逆向分析的主要内容
在这段代码之前,还有一系列的赋值操作,以ASCII的形式读取,可以获得 “MMMwjau`S]]S}ybS?4:;5:<4<q” 这串神秘的字符串,猜测与flag的值有关。
123456789101112131415161718192021222324252627004015AB |. E8 40110000 CALL <JMP.&msvcrt.scanf> ; \scanf004015B0 |. C74424 4C 0000>MOV DWORD PTR SS:[ESP+4C],0004015B8 |. EB 40 ...
XPath语法参考
简介
XPath代表XML路径语言(XML path language),当然,XPath也是可以用于HTML的。
XPath可以用类似路径的写法,识别和导航XML中的元素。
比如写爬虫的时候,需要解析HTML,就可以用XPath方便的导航到你想找到的元素。
另外,我发现 Chrome 的 Dev Tools 有很方便的功能,就是你可以在“Elements”一栏里右键某个元素,并选择“Copy > Copy XPath”就可以很方便地获得元素的XPath
下面是一些XPath常用的语法,记录在这里用作参考。
选择元素
表达式
说明
name
选择所有名字为“name”的元素
/
从根节点开始选择,类似Linux中的绝对路径
//
选择所有后代(孩子、孩子的孩子等等)
.
相当于Linux中的相对路径,从当前元素开始选择
…
和Linux中的路径相同,选择父元素
@
选择属性
[n]
选择第n个元素,注意下标从1开始
[last()]
选择最后一个元素
[last()-n]
选择最后n个元素
[position()<=n]
...
SQL学习笔记(七)建立索引
引入
当数据量小的时候,查找操作几乎是瞬间完成的,但是当数据库的规模很大的时候,对数据库的搜索操作会变得很慢,因为默认情况下数据库是使用低效的线性查找,这时候就需要我们建立 索引 。
1CREATE INDEX 索引名 ON 表名 (列名, ...);
1CREATE INDEX title_index ON movies (title);
当执行这个语句之后,数据库会为这几列创建一种名为 B树(B-Tree) 的数据结构,将搜索加速到 O(logn)O(\log n)O(logn) ,但同时使用的储存空间也会更多,所以推荐只在需要经常查找的字段上建立索引。
另外,.timer on可以打开计时器比较执行速度,但是在我使用的这么小的数据里是看不出效果的。
SQL学习笔记(六)主键与外键
准备
为了介绍 主键(Primary Keys) 与外键 (Foreign Keys) ,我们再新建一个数据库。
1234sqlite3 movies.db# SQLite version 3.43.1 2023-09-11 12:01:27# Enter ".help" for usage hints.# sqlite>
假如movies.db不存在,SQLite会自动创建它。
我用ChatGPT又生成了一些数据(不确定有没有错误)。
movies.csv:(两列分别代表id和title)
123456781,The Dark Knight2,Inception3,The Shawshank Redemption4,The Godfather5,The Godfather: Part II......
stars.csv:(两列分别代表id和name)
123456781,Christian Bale2,Heath Ledger3,Aaron Eckhart4,Michael Caine5,Gary Oldman......
movies_stars.cs ...