函数概念与极限
高数笔记
高数笔记
https://www.google.com/maps/@37.4219999,-122.0840575,3a,75y,35.56h,90t/data=!3m6!1e1!3m4!1sAFQjCNGR9Z5wZj4Y6h8q8zQ5hZ1Zl7q6Q!2e0!7i13312!8i6656
From the url
OSI模型(Open Systems Interconnection model),该模型分为7层:
tap:
属于数据链路层(第2层)。tap
设备用于在以太网帧级别操作。
tun, vpn:
属于网络层(第3层)。tun
设备用于IP包级别操作,VPN通常工作在第3层(网络层)。
icmp: 属于网络层(第3层)。ICMP(Internet Control Message Protocol)用于网络设备间的控制信息传递,如ping命令。
1 | - **tap**: 2层(数据链路层) |
proxychains
是一个工具,它会拦截应用程序的网络连接,并通过代理服务器转发这些连接。它通常用于让应用程序通过
SOCKS 或 HTTP 代理连接到网络。由于 proxychains
操作的是应用程序层的流量,并且修改传输层的连接请求,它应归类为应用层(第7层),尽管操作涉及传输层(第4层)的连接。In the development world, setting up a proxy is a common task, especially when working behind a corporate firewall or when you want to ensure secure and private browsing. Proxies act as intermediaries between your computer and the internet, helping in filtering requests, improving security, and managing network traffic more efficiently.
To configure npm to use a proxy, you can use the
npm config set
command as follows:
1 | npm config set proxy "http://localhost:7890" |
Here, http://localhost:7890
is the address of your proxy
server. Change it according to your proxy server's IP address and port
number.
If you need to remove the proxy configuration, for instance, when
you're not behind a proxy anymore, you can use the
npm config delete
command:
1 | npm config delete proxy |
You can set proxy environment variables in the shell as follows:
1 | export http_proxy="http://localhost:7890" |
Replace localhost:7890
with your proxy server's IP
address and port. Note the difference in the protocol (http
vs. https
) for http_proxy
and
https_proxy
.
To revert the changes or to disable the use of a proxy, you can
unset
these environment variables:
1 | unset http_proxy |
1 | pip --proxy http://localhost:7890 install somepackage |
Replace http://localhost:7890
with your proxy's URL.
Append the name of the package you wish to install instead of
somepackage
.
1 | git config --global http.proxy http://127.0.0.1:7890 |
1 | git config --global http.https://github.com.proxy http://127.0.0.1:7890 |
1 | git config --global --unset http.proxy |
在进行密码破解任务时,我遇到了一个典型但容易被忽视的问题:不同操作系统间的换行符差异。在这篇博客中,我将分享我的经验和解决方案,希望能帮助那些可能面临同样挑战的人。
在 Windows
系统上生成了一个用于密码破解的字典文件,文件中的换行符遵循
Windows
的标准,即 CRLF
(\r\n
)。然而,我的破解工具运行在 WSL
环境中,该环境以及大多数 Linux
工具期望的换行符是
LF
(\n
)。
我确定字典中有正确密码。当使用 VSCode
的
WSL
终端运行如下fcrackzip
命令时,破解尝试失败了
1 | fcrackzip -D -p ./vspro/passwords.txt -u flag.zip |
通过file
命令检查字典文件,确认了问题所在:
1 | ➜ code file ./vspro/passwords.txt |
这表明文件是用 CRLF
作为换行符的,而不是
WSL
和 Linux
工具期望的 LF
If conditions permit
在 linux
环境中使用脚本生成字典。
Else
使用指令转换换行符为了解决这个问题,我需要将字典文件中的 CRLF
换行符转换为LF
。Linux
和WSL
提供了一个非常方便的工具dos2unix
,它可以实现这种转换。
1 | sudo apt update && sudo apt install dos2unix |
安装完成后,使用dos2unix
命令转换文件:
1 | dos2unix ./vspro/passwords.txt |
转换完成后,再次使用file
命令验证文件的换行符:
1 | ➜ code file ./vspro/passwords.txt |
这次,文件描述不再提到CRLF
换行符,说明转换成功。
转换换行符后,我再次运行了fcrackzip
命令,这次成功破解了ZIP文件的密码。
This experience highlights that, when working across different platforms, even minor details like line breaks can lead to significant obstacles. Despite their seeming insignificance, these differences can greatly impact how files are processed and texts are parsed. Thankfully, with the use of straightforward tools and commands, these issues can be easily overcome, allowing for a seamless workflow.
I hope this blog post assists those facing similar challenges in cross-platform tasks, such as password cracking or any activity involving text file processing. Remember, when you come across unusual issues, it's worth starting with the basics, like the seemingly trivial matter of line breaks.
结构型模式主要包括以下几种:
这些模式在不同的应用场景中有着广泛的应用,比如在系统需要使用现有的类但其接口不符合系统的需要时,可以使用适配器模式来进行接口适配;当系统需要对一系列的对象进行操作而不想关心这些对象是简单的还是复杂的组合时,可以使用组合模式来统一对待。
通过运用结构型模式,开发者可以更容易地设计出结构清晰、关系简单、高效灵活的系统架构。
Creational
Patterns
创建型模式包括:
保证一个类只有一个实例, 并提供一个访问该实例的全局节点。
1 | public class Singleton { |
volatile
: 这是 Java 语言的一个关键字,用于指示
JVM(Java
虚拟机),这个变量可能会被多个线程同时访问和修改,但是它不会被线程缓存(每次访问变量时都要从主内存中读取),并且每次修改都会立即写入主内存。这个关键字的主要作用是确保变量的可见性和防止指令重排序优化,这对于多线程环境下安全创建单例至关重要。1 | public interface Shape { |
1 | //定义抽象工厂 |
这段 Java 代码完整实现了抽象工厂模式,包括抽象工厂接口、具体工厂类、抽象产品接口、具体产品类以及客户端代码。客户端代码仅依赖于抽象类型(GUIFactory、Button 和 Checkbox),使得你可以在不修改客户端代码的情况下引入新的工厂或产品变体。
1 | public class Car { |
这段 Java 代码展示了如何实现生成器模式,其中包括创建复杂对象的过程,使得最终产品的构建与其表示分离,允许相同的构建过程创建不同的表示。
复制已有对象
当直接创建对象的代价比较大时,则采用这种模式。
Java 中,原型模式通常通过实现 Cloneable
接口并重写
Object
类的 clone()
方法来实现。
1 | import java.util.HashMap; |
这段代码展示了原型设计模式的核心:通过克隆现有对象来创建新对象,从而避免了通过
new 关键字创建对象带来的成本。这里,Shape
抽象类实现了
Cloneable
接口,允许其子类 Rectangle
和
Circle
被克隆。ShapeCache
类用于预存储和克隆形状对象,而客户端代码演示了如何从缓存中获取并使用这些克隆对象。
设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
1、开闭原则 Open Close Principle
2、里氏代换原则Liskov Substitution Principle
3、依赖倒转原则Dependence Inversion Principle
4、接口隔离原则Interface Segregation Principle
5、迪米特法则,又称最少知道原则Demeter Principle
6、合成复用原则Composite Reuse Principle
Creational Patterns
Structural Patterns
Behavioral Patterns
。