分布式
0x00 CAP 理论
经济学中有一个著名的论断叫蒙代尔不可能三角,说货币政策的独立性、汇率的稳定性以及资本自由流动,三者不能都要,最多只能实现其中两个。分布式系统中也有一个类似的CAP理论(CAP theorem),说数据的一致性、系统的可用性以及允许分区,三者不能都要,最多只能实现其中两个。
数据的(强)一致性(Consistency):表示数据的更新操作在所有节点间都像原子操作一样,要么同时成功要么同时失败,不会出现部分成功的状况。以数据库为例,则是主从库之间的同步不会出现一个中间状态,主库更新了,但从库没有更新,继而导致查询从库与主库结果不符的现象。
系统的可用性(Availability):表示集群的服务一直处于可用状态,可用状态的要求则是在有限的时间内返回正确的结果。即便部分节点挂了,其它存活的节点也能正常返回数据,哪怕会有不一致的情况发生。
允许分区(Partition Tolerance):分区是指因为网络故障或其它原因导致分布式系统中的部分节点与其它节点失去连接,形成独立分区。如下图所示的情况,node02为主库,剩下的两个为从库,node02和node03之间的 ...
Java 分层编译
0x00 前言
一开始接触到分层编译是因为我们这的服务每次发布/重启后都会短暂地出现CPU满线程池满的情况,然后过一段时间又能自动恢复。经排查后是因为启动时JVM将部分热点代码编译为机器代码导致的,这个过程中JIT编译器会占用大量的CPU。
一个Java的源代码文件变成可直接执行的机器指令,需要经过两段编译,第一段是把.java文件转换成.class文件。第二段是把.class文件转换为机器指令。
第一段的编译相对固定,也就是将Java代码翻译为字节码并打包为jar的过程。而字节码的执行则有两种方式,第一种是由解释器(Interpreter)即时解释执行,第二种则是由JIT编译器编译执行。具体采用哪种执行方式则主要看当前的代码是否为「热点代码(Hot Spot Code)」。当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是热点代码。此后,JIT会把部分热点代码的class直接编译为本地机器相关的机器码,并进行优化,然后再把翻译后的机器码缓存起来,以备下次使用。JIT的运行则主要依赖于运行时的profiling信息,由此则被称为Just-in-time Compilation ...
DOLG Single Stage Image Retrieval with Deep Orthogonal Fusion of Local and Global Features
0x00 导言
传统的图像检索往往分为两个步骤,第一步即提取图像的全局特征并在搜索引擎中进行搜索,第二步即对检索出图像的局部特征采用空间验证等手段对进行重排序并返回。本文提出了一种新的特征算法,有效融合了局部特征及全局特征,仅一步就可返回最佳结果。
0x01 背景知识
0x00 GeM池化
对于一张K×h×wK\times h\times wK×h×w(KKK为通道数)的特征图X\mathcal{X}X而言,GeM池化的公式表达是这样的:
f(g)=[f1(g)⋯fk(g)⋯fK(g)]where fk(g)=(1∣Xk∣∑x∈Xkxpk)1pk, ∣Xk∣=h×w\text{f}^{(g)}=[\text{f}^{(g)}_1 \cdots\text{f}^{(g)}_k\cdots\text{f}^{(g)}_K] \\
\text{where }\text{f}^{(g)}_k=(\frac{1}{|\mathcal{X}_k|}\sum_{x\in \mathcal{X}_k}x^{p_k})^{\frac{1}{p_k}},~ |\mathcal{X}_k|=h\times ...
Block Based Image Matching for Image Retrieval
0x00 导言
文章地址:Science Direct
我的批注版地址:Commented Paper
这篇文章旨在解决图像检索问题中以子图搜全图的问题。
0x01 背景知识
0x00 VLAD
VLAD算法的简介可简单参考这篇论文的2.1小节All about VLAD。
VLAD是一个比较老的图像特征提取算法,过程也相对简单:
首先需要在训练图片数据集上训练一个码表(codebook),词表的训练方法为:对训练集中的图像提取d维的SIFT特征,然后将所有图像的所有SIFT描述子汇总在一块,使用K-means算法去做一个聚类,然后将所有聚类的中心点组合为一个码表。其中K的选择一般为64或256。在此步,我们可以将提取出的SIFT兴趣点记为x=(x1,x2,⋯ ,xn)x=(x_1, x_2,\cdots, x_n)x=(x1,x2,⋯,xn),同时将训练好的码表记为Cvlad=(c1,c2,⋯ ,cK)C_{vlad}=(c_1, c_2, \cdots, c_K)Cvlad=(c1,c2,⋯,cK),其中K为聚类中心点的个数。
对于一张新来的图像,首先 ...
优雅的 Windows 开发
0x00 背景
本文讲述如何在 Windows Subsystem for Linux 里跑起一个支持 CUDA 的 docker 容器来的。
我们的工作相当于将上图中的 NVIDIA CUDA 换成了 docker container。
0x01 步骤
0x00 安装 WSL
首先,现在 win11 默认装的 WSL 已经是2.0版本了,所以无需在命令里单独使用 wsl –set-default-version 2 指定2.0版本的 WSL 了。仅使用如下命令即可一键安装 Ubuntu 发行版的 WSL:
1wsl --install -d Ubuntu
Tips
不用重启 Windows,仅重启 Ubuntu subsystem 的方法:
1wsl --shutdown
同时,我们可以关闭Windows Subsystem for Linux GUI来降低WSL的CPU占用,以及解决日常高CPU占用、屏幕频繁刷新以及频繁获取失去焦点的bug。可以在%UserProfile%目录下新建一个.wslconfig文件,并写入如下配置:
12[wsl2]guiApplications=f ...
Deep Image Retrieval A Survey
导言
文章地址:Arxiv
本文是一篇Survey,主要调研了2012年以来的基于深度学习的图像检索方法。这篇Survey主要是从如下3个科学问题展开:
如何使预训练的模型提取出来的特征超过传统数学模型?
如果我们使用在别的领域训练过的模型(比如:图像分类)所提取出来的特征来做图像检索的话,如何才能让这些模型保持或取得更好的效果呢?
深度特征普遍维度较高,如何才能更好地利用这些特征在大规模图像数据集上取得更好的检索效果呢?
总结
目前来说,现有的DCNN模型的来源主要有二:在别的任务上预训练好的以及fine-tune过的。二者之发展,可参照下图:
上图中,左侧路线呢是off-the-shelf模型,也就是说,一个预训练好的DCNN模型就直接拿过来,什么也不做,就直接应用到图像检索任务中。在这方面的研究呢,主要集中在提升表现层的输出质量上,相关的工作则有单次通过模型,或多次通过模型(将一张图片拆分为多个子图然后多次通过模型)。而右侧路线呢,则是针对已有模型在检索任务上进行过fine-tune后的模型,工作主要可以分为有监督的学习和无监督的学习两类。
如果从检索效果的提升上来 ...
Three Things Everyone Should Know to Improve Object Retrieval
0x00 导言
文章地址:Visual Geometry Group - University of Oxford
我的批注版地址:Commented Paper
本文旨在解决在大规模图像数据集中依据给定图片做快速(准实时的)目标检索。
0x01 背景知识
此前解决此类问题,有一个标准的方法:首先,使用词袋模型(BoW)来表示一张图片。其次,使用TF-IDF(Term Frequency Inverse Document Frequency)算法计算一个Rank值用于对图像进行排序和召回。
传统的方法有如下几个痛点:特征提取中的丢失,噪音点,描述子比较标准(距离计算方法)不合适,量化或归一化描述子时带来的损失。
0x00 TF-IDF(Term Frequency Inverse Document Frequency)
TF-IDF(Term Frequency Inverse Document Frequency),中文即:词频逆文本指数,是一种用于信息检索的加权技术。这是一种统计方法,用于评估一个词对于一个文件集或者一个语料库中某一份文件的重要程度。字词的重要性与它在文件中出现 ...
CTF Penetration Writeup 2
0x00 前言
比赛入口:
1http://192.168.50.133/intro.html
代码部分:
Flag A level 0: https://pastebin.ubuntu.com/p/HDWBHp3cRY/
Flag A level 1: https://pastebin.ubuntu.com/p/sv2DXCqjTN/
Flag B&C: https://pastebin.ubuntu.com/p/cCrgMFhVTK/
Flag D:
Flag E:
0x00 Flag A
这个题的目的很简单——登陆系统。我们可以从代码中看出,三个level用的都是相同的登陆逻辑,只不过是对输入内容的过滤措施不一样而已。我们挨个等级来看一下。
level 0: FLAG_A0_13FFEDE591_A
从代码中我们可以看到,level0的反注入措施只是仅仅将输入中的空格去掉了。我们可以使用块注释符来代替空格:
输入的用户名为:
12-- md5('123')='202CB962AC59075B964B07152D234B70'123 ...
CTF Intro
0x00 前言
挖洞,也就是找漏洞,本身就是个很随缘的技术,而且多半是八分靠运气,二分靠实力,尤其是在你不知道你要渗透的网站后端源代码的情况下。所以说,即便找不到漏洞,也不要认为是你个人能力不行导致的。举个例子,Linux系统被安全人员研究了几十年了,但是到目前为止,被发现的内核提权漏洞你用一双手就能数得过来。这不是研究它的安全人员的能力不行,而是找漏洞本身就是个很随缘的过程。你缘分到了,有个漏洞可能就被你找着了。缘分没到,那也没办法。
很有幸,本科期间遇到一位对的老师,打过一年CTF比赛,也曾给校赛出过题。但是我和安全行业的缘分实在没到,所以后来读研、实习也没有选择安全方向。
现在只能以一位业余安全爱好者的身份,在组里,来介绍一些安全方面的常识,组织这么一场比赛,来增进大家的安全防范意识。也算对我曾经学过的知识的一次复习。
0x01 SQLi
SQL注入问题产生的根源在于直接拼接SQL语句,而使用预编译的SQL语句则没有SQL注入的问题。目前已经很少有场景下会直接拼接SQL语句了,所以SQL注入攻击也在逐渐淡出网络安全圈的视野。不过校级的CTF比赛往往还比较喜欢往这个方向上出题,因为 ...
JVM 内存管理及垃圾回收
0x00 运行时数据区组成
程序计数器(Program Counter Register):如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。
虚拟机栈(VM Stack):虚拟机栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。同理,这也是递归容易导致内存溢出现象的原因。
本地方法栈(Native Method Stack):Java栈是为执行Java方法服务,而本地方法栈则是为执行本地方法(Native Method)服务。在JVM规范中,并没有对其具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在Hotspot虚拟机中直接就把本地方法栈和Java栈合二为一。
方法区(Method Area):存储每个类的信息(包括 ...