Java多线程笔记-1
Java多线程-1 线程创建 继承Thread类 实现Runnable接口 实现Callable接口 (了解) 一、继承Thread类 自定义线程类继承Thread类 重写run() 方法, 编写线程执行体 创建线程对象, 调用start() 方法启动线程 123456789101112131415161718192021// 创建线程方式一: 继承Thread类, 重写run() 方法, 调用start开启线程public class TestThread1 extends Thread { @Override public void run() { // run 方法线程体 for (int i = 0; i < 20; i++) { System.out.println("我在看代码" + i); } } // main 线程 主线程 public static void...
自编小程序PDF转图片
PDF转图片 完整源码:https://github.com/JiaZhengJingXianSheng/PDF2Image x86-64 可执行文件: 链接:https://pan.baidu.com/s/1Qk_SCLNtnYLSxfu0ArF5-Q 提取码:at0c 执行源码须自己配置依赖,需配置traits,请自行搜索解决。打包后的可执行程序链接如上。 注意: 程序因未作错误判定,请选择PDF文件夹时,保证文件夹下仅有pdf文件。 程序核心 1234567891011for file in os.listdir(self.path): pdf = fitz.open(self.path + "/" + file) # 逐页读取PDF for pg in range(0, pdf.page_count): page = pdf[pg] pm = page.get_pixmap() # 开始写图像 pm.save(self.path + "/../Image/" + str(file) + "/" +...
Linux下模拟实现简单的Shell
Linux下模拟实现简单的Shell 完整代码:https://github.com/JiaZhengJingXianSheng/Linux_Shell 一、 fork fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的程序计数器,相同的CPU寄存器,在父进程中使用的相同打开文件。 特点 1)在父进程中,fork返回新创建子进程的进程ID; 2)在子进程中,fork返回0; 3)如果出现错误,fork返回一个负值; 如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。因此我们可以通过判断fork返回值来确定进程是子进程还是父进程。 二、 execvp execvp() 会从PATH所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数...
朴素贝叶斯分类器
朴素贝叶斯分类器 完整代码:https://github.com/JiaZhengJingXianSheng/Naive-Bayes-Classify 基础 贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务。 而朴素贝叶斯分类器是基于独立假设的,即假设样本每个特 征与其他特征都不相关。 朴素贝叶斯分类器依靠精确的自然概率模型,在有监督学习 的样本集中能获取得非常好的分类效果。 条件概率 假设A,B是两个随机变量,它们的联合概率 P(A=x,B=y) 是指 A=x和B=y同时 发生的概率。 如果A和B是两个随机变量,且 P(B)≠0 。那么B条件下,A 的条件概率为 \[ P(A|B)=\frac{P(A,B)}{P(B)} \] 我们用Ω代表总样本空间,P(A|B)的隐含假设是,B确定要发生。当确定B发生时, 样本空间不再是Ω,而是缩小成B。我们在B样本空间中 寻找A发生的概率。 贝叶斯定理 贝叶斯定理 (Bayes theorem)...
Linux下模仿实现readelf部分功能
模仿实现Linux下 \(readelf\) 工具部分功能 完整实现: https://github.com/JiaZhengJingXianSheng/ReadELF ELF 目标文件格式的最前部是 ELF文件头 (ELF Header) ,它包含了描述整个文件的基本属性,比如 ELF 文件版本、目标机器型号、程序入口地址等。紧接是 ELF 文件各个段。其中ELF 文件中与段有关的重要结构就是 段表 (Section Header Table) ,该表描述了ELF 文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限及段的其他属性。 在 linux 下elf的定义存放在 \(/usr/include\) 下, 我们可以用 \(readelf -h\) 命令加上文件来查看ELF头文件。 1vim /usr/include/elf.h ELF 的文件头中定义了...
Java简单策略模式
Java策略模式 参考书目 《大话设计模式》 程杰 清华大学出版社 代码链接 https://github.com/JiaZhengJingXianSheng/Calculate_By_Java_Version2 本文是对上篇 Java简单工厂模式 的重写,以达到代码更易于维护的目的。 一、 定义接口 与上篇不同,这篇我们选择定义接口,并在后续功能实现中, \(implement\) 我们的接口。 接口定义加上参数,方便后期调用,定义如下 123public interface OperationInterface { double getResult(double A, double B) throws Exception;} 二、 定义运算 接下来定义各种方法,来实现我们的接口。 123456public class OperationAdd implements OperationInterface { @Override public double getResult(double A, double B)...
Java简单工厂模式
Java简单工厂模式 参考书目 《大话设计模式》 程杰 清华大学出版社 代码链接 https://github.com/JiaZhengJingXianSheng/Calculator_By_Java 我们在编写程序时为了容易修改,通常会用 封装、继承、多态 来降低程序的耦合度。 比如我们要实现一个简单的计算器功能,具体功能为传入两个数值和一个操作符,返回计算结果。 一、 抽象类创建 通常我们会在一个抽象类内部定义主要的信息,比如输出输出等。 1234567891011121314151617181920212223public abstract class Operation { private double _numberA = 0; private double _numberB = 0; public double get_numberA() { return _numberA; } public void set_numberA(double _numberA) { ...
排序
C++常用排序 代码链接 https://github.com/JiaZhengJingXianSheng/SortByCPlusPlus 选择排序 选择排序可以将序列看作有序序列和无序序列的结合。如何理解这句话,我们拿第一个值当作标定,和后面所有值对比,找出小于标定的结果并进行交换。那么一轮交换就可以选出一个最小值,当我们标定不断后移就可实现排序。当然,标定应该在倒数第二个值终止,因为最后一个值并无后续。 1234567891011void selectSort(int* &arr, int len) { for (int i = 0; i < len - 1; i++) { for (int j = i + 1; j < len; j++) { if (arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] =...
Seq2Seq
Seq2Seq 以往的循环神经网络,输入的是不定长的序列,输出确是定长的,我们选取最长词并通过对短的词扩充来实现输出定长。但有些问题的输出不是定长的,以机器翻译为例,输入一段英语,输出对应法文,输入和输出大概率不定长,比如 英文:Beat it. 法文:Dégage ! 英文:Call me. 法文:Appelle-moi ! 当输入输出序列不定长时,我们可以采用编码器-解码器(encoder-decoder)或Seq2Seq实现。 论文参考:https://arxiv.org/abs/1409.3215 编码器-解码器 编码器和解码器分别对应输入序列和输出序列的两个循环神经网络。 编码器 编码器将长度可变的输入序列转换成形状固定的上下文变量,并且将输入序列的信息在该上下文变量中进行编码。 假设输入序列是\(x_1,x_2,x_3...x_T\) ,其中\(x_t\)是输入文本序列中第t个词原,用\(h_t\) 来表示上一时间的隐藏状态,用函数\(f\)来描述为 \[ h_t=f(x_t,h_t−1) \] 编码器的背景向量 \[ c =...
AutoEncoder
AutoEncoder 自编码 AutoEncoder 是一种无监督学习的算法,他利用反向传播算法,让目标值等于输入值。 比如对于一个神经网络,输入一张图片,通过一个 Encoder 神经网络,输出一个比较 "浓缩的"feature map。之后将这个 feature map 通过一个 Decoder 网络,结果又将这张图片恢复。 如果说我们的数据集特别大,对于直接训练而言性能肯定较低。但如果我们对数据特征进行提取,缩减输入信息量,学习起来就相对轻松。 简单模型 下面是一个AutoEncoder的三层模型,其中 \(W^* = W^T\) 2010年,Vincent 在论文中表明,只用单组W就可以,所以W*没有必要去训练。 http://jmlr.org/papers/volume11/vincent10a/vincent10a.pdf 如果实数作为输入,损失函数为 \(L(f(x)) = {1\over2}\sum_{k}(\hat x_k - x_k)^2\) PCA 和...