自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(300)
  • 资源 (3)
  • 收藏
  • 关注

原创 使用Unsafe获取数组某个特定下标的内容

看ForkJoin源码的时候,发现了一个有趣的用法,在每一个WorkQueue里面都有一个array来存放任务,如果要取一个具体的任务,首先这个array的长度一定是2的次幂,这时候就可以用unsafe里的arrayBaseOffset获取到第一个元素的偏移地址,然后和arrayIndexScale(获取数组里每一个元素的大小)联合使用便可以获得某一个下标的具体位置:long i = (((a.length - 1) & b) << ASHIFT) + ABASE;这里((a.le

2022-01-29 10:21:25 695 2

原创 liunx内核中的互斥自旋锁和读写自旋锁的实现详解

今天把这两个锁的内核实现源码重新捋了一遍,基于liunx2,6.0,直接粘注释版:核心文件,x86下实现的spinlock#ifndef __ASM_SPINLOCK_H#define __ASM_SPINLOCK_H#include <asm/atomic.h>#include <asm/rwlock.h>#include <asm/page.h>#include <linux/config.h>extern int printk(con

2022-01-19 14:14:30 503

原创 使用线程自己join自己完成线程门栓

public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Runnable() { @Override public void run() { try { //这里可以放一个变量看看是否是0,只有1和0两种状态,当为0时,才可以进行后续代码,

2022-01-18 22:12:02 604

原创 记录java从左上到右下打印二维数组,从左下到右上打印二维数组

左上到右下 public static void main(String[] args) { int[][] matrix = new int[][]{ new int[]{2, 3, 5,10}, new int[]{5, 2, 4, 1}, new int[]{3, 3, 1, 1} }; process(matrix); } pri

2021-12-30 19:52:34 372

原创 Symmetric multiprocessing(SMP)下的spinlock

现在的计算机都是多核对称的cpu处理器,本文通过liunx内核2.6.0代码来分析在多核处理器下,如何使用自旋锁和抢占来进行高效的内核运转。如果正在内核中运行着的任务此时可以抢占另外一个内核执行的任务,比如说有一个优先级很高的任务想去抢占内核中正在运行的任务,在linux2.6之前是没有实现的。在2.6版本的内核中,加入了抢占相关的信息,在preempt.h头文件里,定义了一个preempt_count如果这个count大于零表示不可以被抢占,如果等于零,表示可以被抢占。#define preempt

2021-12-01 17:04:05 373

原创 fortran的cmakelist的写法

cmake_minimum_required(VERSION 3.19)project(study Fortran)add_compile_options(-O3 -ffree-line-length-none -fdefault-integer-8 -finteger-4-integer-8 -freal-4-real-8 -fallow-argument-mismatch -std=legacy -fdec-format-defaults )enable_language(Fortran)add

2021-11-26 22:02:39 883

原创 fortran的bug:Fortran runtime error: Unit number in I/O statement too large

我使用的是11.0版本的gfortran,需要开启一些参数才能使程序正常工作:add_compile_options(-O3 -ffree-line-length-none -fdefault-integer-8 -finteger-4-integer-8 -freal-4-real-8 -fallow-argument-mismatch -std=legacy -fdec-format-defaults )...

2021-11-26 21:06:46 865

原创 多级页表的好处

在32位系统下,物理内存进行了分页,每一页的大小为4kb,如果已经通过分段生成了线性地址空间,然后线性地址空间再去找分页的物理地址,比如说,找到了是第xxx页,在通过线性地址里的后12位的offset进行结合找到具体的物理地址,如果只使用了一个页表,一个表项的大小为4byte,32位系统有4GB的物理空间(一个进程看到是4GB大小的虚拟空间),每一个表项对应着物理空间的第xxx页(4KB大小的页),那么应该有4GB/4KB=1MB个表项,因为每个表项4byte,所以一共有4MB的大小,那么一个进程就会浪费掉

2021-11-23 22:28:49 1551

原创 使用mac m1跑fortran代码hello world

vim test.f90添加代码如下:program helloprint *, "Hello World"end program hello进行编译和运行gfortran test.f90 -o test./test即可。

2021-11-22 16:52:45 1100

原创 二叉树最大宽度与leetcode662的二叉树最大宽度

首先先实现二叉树的最大宽度,也就是某一层最多的节点个数,使用了两种方法,第一种是使用一个map数组盛放当前节点以及当前节点的层数。public static int maxWidthUseMap(Node head) { if (head == null) { return 0; } Queue<Node> queue = new LinkedList<>(); queue.add(head); // key 在 哪一层,value HashMap&l

2021-11-21 20:27:27 505

原创 字符串所有排列组合暴力递归

给你一个字符串"acb",可以打印出六种排列组合,这里又是一种index推动的递归,但是这里有一些小trick,就是从第一个开始,在后面的字符串的每一个字符进行交换,这样就可以省很多空间,在数组内原地交换,遍历到每一个字符上也有很多细节,将后面的每一个字符和当前字符进行交换,并且每次遍历完一个,这个字符就不要在动了,随后再还原现场。 public static void main(String[] args) { String input = "abz"; Hash

2021-11-20 11:20:27 622

原创 排列出所有子串暴力递归

比如说给你一个字符串"dfadcdcad",让你排列出所有的子串,比如说df就是,dc也是,如果子串中有重复,可以打印出,因为题目如果说改成不能有重复,改成hashset即可,子串可以有间隔,这又是一个要与不要的问题,和0-1背包很像,但是0-1背包要返回最大价值,所以在细节处理上有些区别。要与不要的问题核心都是有一个index伴随递归的开始到结束,这就体现了暴力递归的思想。public static void main(String[] args) { List<String&gt

2021-11-20 10:42:19 417

原创 0-1背包问题暴力递归

给你一系列物品的价值数组和所占背包容量的数组,给你一个有限容量的背包,求能背的背包的最大值,并返回这个最大值。这里是不能多拿背包的,也就是这里的背包都有且只有一个。实现如下,首先递归函数的逻辑就是:选择拿不拿当前遍历到的背包,如果拿就要选择加上当前背包的价值,并且把当前背包的所占容量也加上去,在遍历到下一个index,这里index就推动了递归的进行,并且两个终止条件分别代表的意思是如果当前情况下背包已经占有的容量大于了背包的容量,这时候返回一个不成功,此时这个背包在当前情形下是不能有的,返回一个-1,

2021-11-20 10:27:37 4206

原创 汉诺塔问题实现

其实就是三大步:第一步:1-N-1个盘子从最左边的柱子放到中间第二步:第N个盘子从最左边放到右边第三步:1-N-1个盘子从中间放到左边那肯定递归的入参里面必定有A,B,C和每一次要移动几个盘子class Solution{ public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {process(A.size(),A,C,B);} //from to other

2021-11-18 11:12:32 367

原创 将vue部署在nginx上

在前面已经讲了如何利用docker安装nginx,现在就将项目部署到上面:首先通过npm run build打包成dist目录可以先看一下devServer是如何写的:devServer:{ disableHostCheck: true, port: 8081, proxy:{ '/showBooks':{ target:'http://192.168.231.155:8082',

2021-11-05 16:05:43 2642

原创 使用docker开启nginx

vim /usr/lib/sysctl.d/00-system.conf添加如下内容:net.ipv4.ip_forward=1安装好docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \

2021-11-05 14:00:09 1967

原创 mac m1下安装kubenetes的dashboard

在docker界面开启kubernetes功能:接下来下载:wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml下载好后修改port为nodeport:保存退出执行:kubectl apply -f recommand.yaml使用如下命令查看service:端口为32322使用https协议打开,获取token:kubectl -n kube

2021-10-31 17:07:15 479

原创 mac m1上运行jenkins

首先在docker官网上下载好支持m1版本的desktop客户端,随后打开jenkins.io查看安装命令:docker run \ -u root \ --rm \ -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins-data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ jenkinsci/blueocean安装好后输入密

2021-10-24 22:40:48 4261 2

原创 将博客搬至CSDN

将csdn上的博客搬到此处除了使用传统的给定一个变量每次进行对比找到最大数以外,可以将其改成递归形式用来开拓思路:javapublic int findMax(int[] arr){ int max = process(arr,0,arr.length-1); return max;}public int process(int[] arr,int L,int R)...

2021-10-24 17:28:53 16

原创 寻找最大数的递归

除了使用传统的给定一个变量每次进行对比找到最大数以外,可以将其改成递归形式用来开拓思路:public int findMax(int[] arr){ int max = process(arr,0,arr.length-1); return max;}public int process(int[] arr,int L,int R){ if(L==R){ return arr[L]; } int M = L + ((R-L)>>1);

2021-10-24 10:50:48 2118

原创 记录java在后台运行命令

nohup java -jar xxx.jar >/dev/null 2>&1 &

2021-10-20 10:02:18 233

原创 解决在linux跑连接sql server老版本会报错的问题

先贴链接:https://aws.amazon.com/cn/blogs/opensource/tls-1-0-1-1-changes-in-openjdk-and-amazon-corretto/网上搜索的大部分方法无法帮助我。报错如下:The server selected protocol version TLS10 is not accepted by client preferences [TLS12]在java的根目录下(我的是1.8),在jdk11会在conf下找安全性文件,在jre/

2021-10-17 22:18:58 555

原创 mac m1下golang连接mysql极速入门

首先配置好golang环境,我此时使用的是1.17版本m1已经支持docker了,下载好docker使用如下命令安装mysql:官方的镜像是不支持arm架构的,所以我们要使用如上所示的docker镜像。接下来开启一个容器,此时我命名为mysql:如上所示开启了映射端口并且使用了端口映射在3306处。接下来进入容器:进入后进入mysqlmysql -u root -p输入刚刚设置的密码:123456进入mysql命令行:为了让程序能够连接进行相应配置项的修改:CREATE USER

2021-10-14 22:04:35 299

原创 mac m1下编译spring框架

首先安装好jdk8以上的版本,下载azul的,已经适配m1:去官网上下载gradle压缩包.zip即可:https://gradle.org/releases/我这里下的最新版7.2(二进制bin即可,不用下all),将其放到自己想放的目录,不用解压接下来去spring官网下载相应的spring framework的源码,我选择的是3.4.11。接下来解压源码包,修改比较重要的文件:首先是gradle文件夹下wrapper文件夹下的:修改:打开项目根目录下的build.gradle在re

2021-10-02 12:56:05 544

原创 golang中如何抓取panic让程序正常退出

golang在运行时,出现panic会导致程序立刻崩溃,可以在处panic的方法上加上recover来进行捕捉并让程序安全退出:defer func() { if err := recover(); err != nil { fmt.Println(err) } }()

2021-09-28 20:18:17 705

原创 从字节码角度解释i++和++i

@Test public void test2(){ int i = 10; i = i++; System.out.println(i); }代码片段如上。通过class文件反编译得到字节码指令: 0 bipush 10 2 istore_1 3 iload_1 4 iinc 1 by 1 7 istore_1 8 getstatic #2 <java/lang/System.out : Ljava/io/Prin..

2021-09-27 20:40:15 185

原创 HSDIS工具在macbook M1电脑的安装

HSDIS可以查看java的汇编指令,在github上找不到相关的已经编译好的包,可以通过自己编译的方式运行:首先下好jdk的源码:git clone https://github.com/openjdk/jdk.git其次进入目录:cd jdk/src/utils/hsdis下载并解压:wget https://ftp.gnu.org/gnu/binutils/binutils-2.35.1.tar.xztar -xf binutils-2.35.1.tar.xz最核心的一步进行编译

2021-09-27 13:22:07 378 5

原创 vue实现接受后端传过来的zip数据,axios实现

接受要以blob的方式,这是细节也是重点,这里贴出一个method的实现 exportSelectZip() { const totalSelectPicList = this.pictureOfSelectBookList.join("&xxx"); axios .get("xxx" + totalSelectPicList, { responseType: "blob", }) .then((respo

2021-09-23 22:31:17 684

原创 前后端分离项目后端向前端返回压缩包的方法实现java版

最近公司的项目是让前端有让用户下载zip压缩包(里面都是图片,图片是保存在ftp上的)的任务,经过调研,将最终方案复制在下面: //zip文件的下载 @GetMapping("/zip/{imagePath}") @ResponseBody public void zip(HttpServletResponse response, @PathVariable(value = "imagePath", required = false) String imagePathList)

2021-09-23 22:27:05 1596

原创 n皇后问题java版

n皇后问题是一个典型的回溯算法的题目,就是在n*n的面板上,放n个皇后,每个皇后会攻击同一列和同一行还有两个斜边上的元素,问你放的方法,返回形式是一个List嵌套List,每个List里都是一种解决方案,每一个解决方案都是画一个面板,解决方案里的每一个元素都是每一个横行,如果没有放皇后,则以.来形容,如果放了皇后,以Q填充,在思想上肯定还是有一定难度的,先贴上java代码的实现,这里已经优化了很多,因为我们是一行一行来放的,所以在放入一行之后,这一行(执行方法isVaild时还没有往该行放Q的操作,所以此行

2021-09-23 22:20:35 1490

原创 链接 动态链接 静态链接

要想了解底层,链接是一个不得不过的一关,我总结了下学习的心得,首先要了解链接器到底是如何工作的,链接器分为两类,一个是静态链接,一个是动态链接,先来讲解静态链接,静态链接要干两件事:符号解析 目标文件定义和引用符号 符号解析的目的是将每个符号引用和一个符号定义联系起来重定位 编译器和汇编器生成从地址零开始的代码和数据节。链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。静态链接的输入文件是一系列的目标文件,输出是可执行的目标

2021-09-21 22:34:19 133

原创 用堆实现第k大元素

除了使用传统的各种排序方法找到第k大元素外,尝试了用堆实现,虽然时间复杂度高了点,但是相当于一次逻辑思维的探索:class Solution { public int[] swap(int[] heap,int i,int j){//交换函数,不必赘述 int tmp = heap[i]; heap[i] = heap[j]; heap[j] = tmp; return heap; } public int[] hea

2021-09-19 12:41:58 203

原创 实操汇编原理cmp指令 对比sub与cmp指令

mov ax, 5mov bx, 5cmp ax, bx这段指令是5-5=0,但是并不是在寄存器中a改值:还没有给ax寄存器放值之前如上图,放入ax和bx之后如下图:这个时候再step调试一步也就是走cmp ax,bx之后变成如下:这里可以看到ax并没有发生改变,改变的是flags:0x82->0x46转换成二进制:1000_0010->0100_0010查看表格:可以看到第7位的改变从1变为0,这是因为结果0也算正数。第六位变成了1,因为这是0是一个零标志。

2021-09-17 09:49:20 1577

原创 从字节码层面分析==比较integer和int

public class aaa { public static void main(String[] args) { Integer a = 1; int b = 1; System.out.println(a == b); }}这样一段代码输出的是true,通过javap -c -l得到相应的字节码指令: Code: 0: iconst_1 1: invokestatic #2

2021-09-15 10:50:24 196

原创 记录x86调试命令总结

首先,liunx系统下得有nasm命令,没有可以安装,接下来把写好的.asm汇编代码编译成二进制文件。nasm xxx.asm -o xxx.bin接下来切换成df硬盘,使用bximage的命令创建一个硬盘,可以设置硬盘的名称和硬盘的大小,因为软盘已经过时了。修改对应的bochsrc文件:...

2021-09-14 10:17:43 223

原创 使用gui调试x86系统的汇编代码

bochs是一个很好的调试环境首先在liunx系统下下载bochs和bochs-x,前提你的liunx下已经安装好了gdb等调试工具,接下来在写好的asm汇编文件下输入bochs,选择4,输入bochsrc生成相应文件:进入bochsrc文件下,修改display_library行添加gui选项:接下来输入bochs -q当然要用root用户的权限即可出来调试界面:...

2021-09-14 09:08:55 201

原创 利用go语言创建web server的两种方式

相比于java/c#的mvc框架,go语言写web项目及其简单,创建一个web只需要简短的几行代码就可以实现功能:package mainimport "net/http"func main() { http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request){ w.Write([]byte("Hello World")) }) // http.ListenAndServe("localhost:8080",nil)//写

2021-09-12 16:19:43 721

原创 Rust中对某个结构体实现方法于rust中的关联函数

写法比较独特,但与go语言相差不了太多,都是为结构体单独进行方法的实现:struct Rectangle{ width: u32, length:u32,}impl Rectangle{ fn area(&self) -> u32 { self.width*self.length }}fn main() { let rect = Rectangle{width:30,length:50}; println!("{}",re

2021-09-12 15:09:16 314

原创 自我分析colly的robots源码

colly是golang语言的爬虫框架,我看了下网上没有一个人去讲解相关的内容,所以自己去研究了下源码。首先,是在colly.NewCollector()完毕后拿到了colly对象,可以通过将c.IgnoreRobotsTxt=false将robots协议开启,随后打断点进入调试可以看见colly框架到底是如何解析不同形式的robots协议的,因为robots协议是一个非强制性的协议,所以大家虽然遵循但是写法上都会略有不同,所以在解析robots文件上不是一个简单的split就能做到的,看了下源码,是需要

2021-09-09 09:32:49 110

原创 golang中的go mod开发

在新版的go中,推荐使用go mod的方式来管理依赖,可以通过go env查看是否开启:GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:当前目录在GOPATH/src之外且

2021-09-08 16:51:29 393

design-parttens.zip

23种设计模式

2021-10-24

algorithm.zip

算法的一些题目解答

2021-10-24

spring-framework-5.3.zip

可供源码学习

2021-10-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除