web安全之CSRF
CSRF即跨站点请求伪造(Cross—Site Request Forgery), 在CSRF攻击中,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
CSRF即跨站点请求伪造(Cross—Site Request Forgery), 在CSRF攻击中,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。
计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态。如果将这每一个状态对应一个符号,就是256个符号,从00000000到11111111。

例如,ASCII 字符集只是定义了字符与字符码(character code,也称 code point 代码点)的对应关系。也就是说这一层面只是规定了字符A用 65 表示,至于这个 65 在内存或硬盘中怎么表示,它不管,那是 ASCII 编码做的事。
什么是短路器?
断路器本身是指电气安全装置,旨在保护电路免受超过设备可以安全承载的电流。断路器可以重置(手动或自动)以恢复正常运行。在软件工程中用于保护系统稳定性,防止资源过载。
Docker是一个用于开发,交付和运行应用程序的开放平台.Docker提供了在松散隔离的环境(称为容器)中打包和运行应用程序的功能.隔离和安全性使您可以在给定主机上同时运行多个容器.容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行.这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器.甚至可以在实际上是虚拟机的主机中运行Docker容器!
Docker提供了工具和平台来管理容器的生命周期:
举个例子:
本文是《李智慧. 大型网站技术架构:核心原理与案例分析 . 电子工业出版社. 》一书的读书笔记。
大型网站的特点:
函数式编程是一种编程范式,它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据。它是一种声明式的编程范式,通过表达式和声明而不是语句来编程。函数式编程是幂等的(无状态的):函数的返回值仅取决于其参数,因此调用具有相同参数值的函数始终会产生相同的结果。这与命令式编程形成对比,在命令式编程中,除了函数的参数之外,程序状态可以影响函数的结果值。随着多核平台和并发计算的发展,函数式编程的无状态特性,在处理这些问题时有着其他编程范式不可比拟的天然优势。
TrueTime 并不是让服务器的墙钟永远不回拨,而是承认“本地时钟可能不准”这个现实:它把一次读取得到的时间表示成一个保证包含真实时间的区间,再让 Spanner 在提交时等待足够长的时间,直到这个时间戳确定已经过去。换句话说,它不是消灭时钟误差,而是把误差变成一个有界的、可推理的 ε,然后用少量等待换取跨机器的时间戳单调性。
本篇是论文 Spanner: Google’s Globally-Distributed Database 的中文翻译,尽量保持原文的章节顺序与表述。
拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:
graph TD id1((1)) --> id2((2)) id1((1)) --> id4((4)) id2((2)) --> id4((4)) id4((4)) --> id3((3)) id2((2)) --> id3((3)) id4((4)) --> id5((5)) id3((3)) --> id5((5))
有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。
shell 脚本选项参数解析通常有 3 种方法。
布尔基础:
逻辑表达式: 由逻辑变量和与 $\land$ ,或 $\lor$ ,非 $\neg$ 3种运算符连接所构成的表达式。
析取式: 表达式之间都通过逻辑或连接的复合表达式。
合取式: 表达式之间都通过逻辑与连接的复合表达式。
合取范式 (Conjunctive Normal Form)2 是命题公式的一个标准型,它由一系列析取子句 用合取操作连接而来。如 $(a) \land (a \lor \neg c) \land (b \lor c)$
与之相反,析取范式 (Disjunctive Normal Form) 是命题公式的另一个标准型,它由一系列 合取子句 用 析取操作 连接而来。如 $(a) \lor (a \land \neg c) \lor (b \land c)$
表达式化简:
JMH 是openJDK项目下的JVM工具,用于构建,运行和分析用Java和其他语言编写的针对JVM的nano/micro/milli/macro微基准测试。
随着多核芯片的广泛使用,线程是提升性能的首选方案。适当提升一点线程数会很好;事实上,拥有太多线程可能会使程序陷入困境。过多的线程主要对两个方面有影响:
split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。
本文是学习flink源码前的准备工作。在开始之前,先做好准备工作:
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
先行版本号及版本编译元数据可以加到主版本号.次版本号.修订号 的后面,作为延伸。
生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
java 的 nio包提供了对文件系统的监控服务,主要使用系统原生文件服务,同时在没有原生服务的时候,使用轮询来监控。下面是一个代码示例:
String path = "/tmp";
// 获取当前OS平台下的文件系统监控器
WatchService watcher = FileSystems.getDefault().newWatchService();
//将监控器注册给指定的文件节点,该方法会让监控器线程就绪并运行,调用完后监控器就开始监控
/* 文件变化枚举类型
* ENTRY_CREATE:创建
* ENTRY_DELETE:删除
* ENTRY_MODIFY:修改
*/
Paths.get(path).register(watcher,
StandardWatchEventKinds.ENTRY_CREATE,
StandardWatchEventKinds.ENTRY_DELETE,
StandardWatchEventKinds.ENTRY_MODIFY);
while (true) {
WatchKey key = watcher.take();
// 获得WatchKey(监控池)中的具体监控信息,
// !!! 一个文件变化动作可能会引发一系列的事件,因此WatchKey中保存着一个事件列表List<WatchEvent<?>> list
for (WatchEvent<?> event: key.pollEvents()) {
System.out.println(event.context() + " comes to " + event.kind());
}
// 完成一次监控就需要重置监控器一次.
boolean valid = key.reset();
if (!valid) {
break;
}
}
// ---------- output --------------
// tmp.log comes to ENTRY_DELETEAOP Alliance 项目是许多对Aop和java有浓厚兴趣的软件开发人员联合成立的开源项目,旨在确定Aop的标准。面向切面编程是设计和开发应用程序的一个好方案,AOP 提供了一种通用方法来构建关注点(横切关注点),并将它们灵活地作为模块插入应用。但是,也带来了问题: 不同的AOP实现并不能适配所有环境。
大多数人不相信完美系统,我们认为一个系统总是能处理给定的一个问题和环境(不需要适配其他)。现在已经有了很多的AOP实现或AOP相关的技术,例如,通用代理,拦截器或字节码翻译工具。具体如下:
对我们而言,这些实现没有好与坏的区别,都适合于某些问题或环境。AOP Alliance的目的不是提出新的AOP模型,也不是提供一个更好的AOP实现来解决所有场景的问题。其目的在于提炼所有AOP实现的共同核心能力: