自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 Unity游戏通用mod框架BepInEx生态的工作原理简介

本文主要对 BepInEx 及其基本工作原理进行简述, 希望能帮助想了解unity游戏mod开发的人入坑

2022-08-14 13:44:00 4562 1

原创 Java 中的固有函数(intrinsic)

WHY  为什么需要固有函数?  Java 是不支持宏的, 从抽象性上来说, Java少了一半的表达能力(按正则序展开),大体上来说,这并不太影响Java作为一门生产级的语言,但是在某些特定的地方,消除方法调用过程是非常必要的,比如Math包中的一些函数,亦或者JUC的Atomic类的compareAndSwap方法。所以Java提供了更加底层的(但并不"均一")的特定 – 固有(intrinsic)函数WHAT  什么是固有函数。  固有函数大概相当于C++ 的宏或者inline函数, 即消去.

2021-04-24 22:13:47 660

原创 Java对象的正确发布与DCL单例模式 -- 四个关键字一个JUC类

DCL单例模式及其volatile关键字  首先我们看一个经典的DCL单例模式class Singleton { private static volatile Singleton INSTANCE; public static Singleton getInstance() { if (INSTANCE == null) { synchronized (Singleton.class) { if (INSTANC

2021-04-11 13:58:57 190

原创 JVM GC 中的重要基础概念

GC和JVM的GC  据《深入理解Java虚拟机》所考,世界上第一门实现GC的动态语言是MIT的LISP语言,早在Java诞生之前,GC就已经被大量的研究过了。而随着现代编程语言的发展,GC也在不断的发展(其中各式各样的Jvm GC做出了不可磨灭的贡献)。C/C++往往通过对象统一管理的方式(从某种意义上这就是一个GC)避免野指针,并管理内存。Jvm通过GC管理内存,Rust语言实验性的探索“无GC”的特性。  GC本身是一个非常大的话题,实际上GC管理的并不只是垃圾,GC往往也涉及到整个内存空间的管.

2021-03-24 21:03:16 242

原创 原型设计模式及其java实现

原型设计模式思想  原型模式的思想在于可以不必了解一个对象本来的构造过程,仅根据这个对象本身构造一个跟他一样的对象。  有时候我无从得知一个对象的构建过程,抑或是我们无法调用该过程(比如从网络获取并反序列化一个对象),或者该过程开销太大。这时候就该原型模式发挥作用了。  对象可以将一些“公有字段”转发到自己原型上去。众所周知, javascript的动态类型系统是基于原型链的。也就是说,使用原型模式,你完全可以构造一套自己的(动态)类型系统出来。  在这里有两个问题需要回答,1. 为什么不使用静态.

2021-03-18 00:19:47 139

原创 工厂设计模式(因为太过概念化而没有java实现)

工厂设计模式思想  和绝大多数设计模式一样,工厂设计模式是为了实现开闭原则。这话是不是哪里听过?没错,我在单例设计模式中说了同样的话。实际上单例设计模式可以被看作工厂设计模式的一种。(但也不完全是)  从抽象的角度来看,一个对象实际上是一堆属性的集合。从一个对象生成,到这个对象可用之前,我们需要小心仔细的给对象的每一个属性赋上正确的值。  面向对象思想教育我们对象的属性初始化应该交给构造函数来完成。在大多数简单的情况下确实是这样的,然而我们总是会遇见非常复杂的对象初始化过程,尤其是有如下的要求的时候.

2021-03-17 23:45:17 87

原创 策略设计模式及其Java实现

策略设计模式思想基本思想  和大多数设计模式一样,策略设计模式是为了在软件系统中满足某项功能的开闭原则。对于某一个特定的功能Functionality F, 如果在未来很可能有多种不同的方式实现,并且无法在目前的开发阶段预测该功能的实现方式的种类,这时候就可以使用策略模式。  在开发中经常会遇到的问题是,功能F有多种可能的实现方式,并且不应该,也没有办法在开发的时候就确定所有的实现方式。也就是说必须要把该F的多样化的实现方式暴露为可扩展的。这种情况在游戏开发中尤其常见,举一个简单的例子,游戏中不同难.

2021-03-17 18:19:59 170

原创 单例设计模式及其在Java中的写法

单例思想  单例的思想是很简单的: 即仅使用一个对象来工作。这种模式在很多地方都有用武之地,最常见出现在对某一个系统进行统一管理的对象中,不仅是只使用一个对象“就可以了”,这种情况往往严格要求“只有”一个对象,这在并发环境下尤为需要注意。  一个好的编程习惯是,在设计每一个用于管理系统的类的时候,就思考,这个类需要多个对象吗,可以设计为单例吗?Java中的实现最简单的方式 – 饿汉式public class Hungry { private final static Hungry INS.

2021-03-17 15:37:21 60

原创 《算法导论》第六章 -- 堆,堆排序(含习题)

堆  堆,一般是指二叉堆,是指如下的数据结构  将一个数组上的元素从头到尾按照从左向右、从上向下的方式填到一颗二叉树上,就是一个堆。一个最大/小堆表示满足父节点总是大于/小于子节点的堆。堆用于排序的思想  因为堆上的很多操作只需要lgnlgnlgn的时间(包括从一个最大/小堆上取出最大/小值),所以堆可以用于在O(nlgn)O(nlgn)O(nlgn)时间内进行排序。  但是我认为堆最大的用处不在于排序, 而是在于堆维护自己的堆性质的操作基本上只需要lgnlgnlgn的执行时间,当需要对某个数据

2021-03-08 23:45:21 1014

原创 《算法导论》习题 6.1

《算法导论》习题 6.16.1-1题目  在高度为h的堆中, 元素个数最多和最少分别为多少解  最少:2h2^{h}2h, 最多2h+1−12^{h+1} - 12h+1−16.1-2题目  证明:n个元素的堆的高度为⌊lgn⌋\lfloor lgn \rfloor⌊lgn⌋解  因为n∈[2⌊lgn⌋,2⌊lgn+1⌋−1]n \in [2^{\lfloor lgn \rfloor}, 2^{\lfloor lgn + 1 \rfloor} - 1]n∈[2⌊lgn⌋,2⌊lgn+1⌋

2021-03-07 12:20:27 267

原创 《算法导论》5.4节习题 (有几题做不出来,大佬来帮忙康康)

《算法导论》习题 5.4-1 ~ 5.4-7  5.4 节本身就带星号,这节的题目基本上是概率论的题, 题目都比较简短,我尽量抄一下。有两个算期望的题目我确信自己写出了正确的概率P,但是计算期望的时候级数求和算不出来,后面再看吧,5.4-7和书上特征序列一节相关,这节难度相当大,我暂时完成不了。5.4-1题目  一个屋子里至少有多少人才会使某人和你生日相同的概率至少是 1/2 ?必须要有多少人才能让至少两个人生日为10月1日的概率大于1/2?解  第一小问, 将向屋子里加人其看作概率为 p=1/

2021-03-07 01:18:40 410

原创 《算法导论》习题5.3-1 ~ 5.3-7

《算法导论》习题 5.3.1 - 5.3.7 5.3-5 带星号我抄了一下题目, 5.3-6 比较有意思我抄了一下题目, 其他的题可以自己对照书(原书第三版).5.3-1  直接考虑第2次循环前, 第1次循环后第1个位置的元素是原集合1 ~ n中任意一个元素的概率总是 1/n1/n1/n, 所以可以以此为循环不变式的起点而不必使用空集合和0排列。5.3-2  容易证明该算法一定不会产生恒等排列, 因为第一次循环后第一个元素一定是原排列中2 ~ n中的某个元素。现在证明Kelp教授没有实现均匀随机排

2021-03-06 12:32:07 409

原创 随机算法思想, 使用循环不变式证明一个O(n)时间的随机排列算法

1. 随机算法1.1 WHY  一个非常显而易见的是事实是: 算法的运行时间常常和输入相关。一个最简单的例子是排序算法, 如果我的输入是已经排好序的算法,那么我就可以不用再排序了。(原始版本的快速排序算法可能不这么认为)。  虽然当我们进行算法分析的时候,常常使用下界来进行分析, 但是有时候知道平均(期望)运行时间是很有必要的。但是当提到期望的时候, 我们不得不对数据的分布做出假设,才有机会分析他的平均情况。但是我们无法知道数据的分布, 或者无法判断我们的输入到底是不是我们猜测的分布。所以,对于不确.

2021-03-04 00:47:11 194 3

原创 算法(三) 代入法(数学归纳法)验证递归算法的界

代入法和数学归纳法求解递归式  高中的时候我就被数学老师告知没有一种通用的手段从一个数列的递推公式得到他的通项公式。所以显然的也没有能对递归算法分析的万能算法。但是万幸的是, 我们总能使用代入法(即数学归纳法)来求证我们的猜测是否正确。1. 得到一个猜测  这是比较玄学的部分了, 可以完全靠灵感, 或者来自递归树分析。2. 数学归纳  数学归纳的基本思想是, 证明较小的参数 k 满足假设(边界条件当然需要满足假设), 并证明 k + 1 或者 k * 2等较大的输入规模下也会 满足假设,这样就证明

2021-03-03 15:14:13 782 2

原创 一篇文章搞懂XML中的xmlns,xsi, DTD, XSD,schemaLocation到底啥意思

理解XML中的 xmlns, DTD, XSD, xsi到底什么意思  用了很久的XML文件了,一直没有好好理解这些东西,今天就借这个机会一举把这些内容搞清楚。力求简练深刻  本文借鉴了以下的博客:xml中的xmlnsDTD 与 XSD1. xmlnsWHY  xml的标签完全是由用户自定义的, 所以同标签不同意义的情况一定会发生<table><head> ...</head><line> ...</line&

2021-03-03 00:18:51 1186

原创 四元数表示3d空间旋转使用总结

四元数表示3d空间旋转使用总结  最近在写一个小游戏,用到一些使用4元数表示旋转的地方,特此总结一下;1. 关于四元数  再简单讲一下我对四元数的理解吧;和二元数(虚数)类似,4元数可以表示3个自由度的旋转,或者4个自由度的拉伸或者旋转(二元数可以表示1个自由度的2d旋转或者2个自由度的2d拉伸或者旋转);表示的方法就是简单的乘法(左乘,2维旋转交换无所谓左右乘)。  和单位虚数一样,单位四元数构成一个群,单位虚数群是交换的,单位四元数群不交换。  四元数和二元数最大的不同在于,二元数乘法可以直观

2021-02-11 01:33:33 1073 4

原创 一句话理解四元数 -- __SAD__DOG__原创独家的四元数特殊看法

一句话理解四元数  开门见山, 直接说自己的一句话理解吧:  将一个三维物体, 沿着一个三维的轴进行一次四维的旋转, 然后再在四维空间中, 沿着另外一个方向对这个三维物体进行一次与刚刚的旋转方向正好相反的四维旋转, 恰好等于将这个三维物体沿着三这个三维轴旋转两次。公式对应一个三维中的点p和一个有序三元组(xp,yp,zp)(x_p, y_p, z_p)(xp​,yp​,zp​)相互对应一个三维中的轴a和一个有序三元组(xa,ya,za)(x_a, y_a, z_a)(xa​,ya​,za​)相互

2021-01-24 15:54:06 303 2

原创 以Typescript 的typeof和类类型为例再探类型系统

  如果要用一句点睛之笔形容静态类型和动态类型最大的不同。 我会举C/C++和javascript的例子。  一个指针在runtime运行时就仅仅只是一个内存地址而已, 只有在写源代码文本的时候, 编译器的限制才使得它具有了类型, 这便是静态类型。  而对任意一个javascript引用, 我总是能在运行时了解该对象中所有的key字段, 即了解该对象具有怎样的shape(shape这个词是前不久从Typescript的文档上看到的, 觉得非常精妙, 就不翻译了), 这就是动态类型。  熟悉Java的朋

2021-01-16 13:58:13 751

原创 图论可视化和算法库: cytoscape.js

什么是cytoscape.js  cytoscape.js是一个图论相关的可视化, 可响应, 且自带一些基本图论算法的js库。截至我写这篇博客的时候cytoscape.js在github上仍然相当活跃,既有商业应用也有开源软件使用这个库, 是一个相当可靠的库。有兴趣请访问其官方网站使用cytoscape.js  cytoscape可以跑在各种各样的地方,浏览器和Node.js都可以使用, cytoscape.js也提供了各种包格式。基本概念element  一个图最基本的元素就是“节点”(nod

2021-01-15 22:58:58 1004

原创 使用ts-jest简单配置jest用于teypscript(es6 module)的单元测试

目的  希望使用jest对(使用es6模块的)typescript进行单元测试, jest官网文档中说需要使用babel支持, 项目配置比较麻烦, 而且也需要额外的配置使得jest支持es6或者说typescript的模块, 还好我找到了ts-jest这个第三方库。项目需求yarn add --dev jest typescript  需要安装typescript 和 jest包安装ts-jest  ts-jest 是一个支持source map的, 用于预处理typescript脚本的jes

2021-01-15 15:19:43 2669

原创 Babel工具理解

Babel 是什么  最简单直白的说法是Babel 是一个编译器, 一个将es6+(等)其他更高级的javascript语法编译到指定版本(主要是一些比较老的浏览器所支持的版本)的js语法的 js -> js编译器怎样使用Babel浏览器端  体验Babel最简单的方式就是通过在<script>标签中直接使用babel-standalone了, 该软件包取代了已经过时的babel-browser包<script type="text/babel"> // so

2021-01-15 00:31:13 320 2

原创 算法(二)分治策略,递归分析和主方法

递归与分治策略  递归与分治策略是算法中一类常见的策略或者说思想,很多问题都可以通过递归或者分治的策略进行处理。递归  很难说递归算法起源于哪里(因为就计算机科学来说,使用循环是更为自然的算法),我相信递归思想的出现早于计算机出现很多年,其基本思路是确定一种算法,该算法对于 少数特定规模的输入即递归基, 仅进行常数时间的运算,在其他的输入规模下,该算法可以调用一个输入规模更小的自己,重复该过程直到调用递归基。递归与递推公式  我已不了解数列是否还是高中数学的重点内容(也许它跑到初中去了呢),但是我

2020-11-28 22:49:22 365

原创 算法(一):算法以及算法研究

什么是算法  算法很难有一个明确的定义,《算法导论》中第一章描述到:算法是任何良定义的计算过程。这个定义其实相当感性,但也可以理解关于算法定义的模糊性,因为算法本身就是难以定义的。  值得一提的是图灵对算法做出了一个相当严格,但是却同时也模糊的定义,图灵将算法定义为:一切可以使用完备图灵机执行的计算过程,乍一看这是个相当严谨的定义,但是问题是,完备图灵机同样难以定义,但是从可计算理论的角度来讲,图灵对于算法的定义仍然是最严谨的定义之一。  因为图灵还说过,给一个人一张纸一支笔,和一个明确的计算规则,.

2020-11-27 22:59:23 3143

原创 浅谈对“快照“的理解 -- 深入Git第一篇

系列简介(Series Intro)  凭借对文件系统的深入理解和独特见地,Linux之父打造了分布式版本控制系统git,而git也不负众望,从诞生之日起就吊打一众版本控制系统,伴随着互联网的普及,git也逐渐从程序员的工具箱流入了民间。因为受够了反复修改论文,以及手动维护word版本论文的苦恼,小弟的硕士毕业论文就是采用latex撰写,并采用git作为版本控制的(话说到这里我的latex已经忘得差不多了,真可惜了我埋头研究花费的时间啊,淦!)。  一方面,由于各种原因,小弟在生活和工作中对git的依赖

2020-10-14 18:03:38 2516 7

原创 redis集群自动化部署的坑 -- 无法在同一个母文件夹下开启多个redis-server

问题描述  问题是这样的,为了进一步学习redis集群相关知识,我决定在自己的centos(虚拟机)上开启多个redis-server,并将其作为redis集群来使用。暂不考虑在多个虚拟机上开启redis-server的情况,我决定在一台虚拟机上复制多个redis 的文件夹,分别在不同的端口开启。具体配置如下redis 版本:是在redis官网上直接wget下载然后make的源码版本操作系统信息  按照官网给出的步骤安装好redis以后,建立cluster文件夹,然后复制7份如下每一个red

2020-09-12 23:08:09 569 1

原创 浅谈对多任务(并发/并行)的理解

为什么需要多任务  从历史的角度来看,多任务执行诞生之初,最主要的目的是为了处理IO密集型的任务。由于IO的速度远远慢于CPU的执行,所以如果没有多任务处理系统的话,CPU将在等待IO的时候无事可做,这是一种极大的浪费(尤其是在CPU时间非常宝贵的计算机诞生早期)所以我们需要给CPU配上“任务调度”系统,以控制CPU在进行IO等待的时候能切换出来,去做别的事情。  另一方面,由于摩尔定理在21世纪初撞上了天花板,并行执行成为了提高CPU运行速度最好办法之一。单任务处理无法利用现代处理器的多执行流,所以多

2020-07-26 16:04:26 1736

原创 类型系统由浅入深,从C/C++到Java, 从 int 到 Java 类型系统地狱(自限定泛型)

类型系统基础:静态类型和动态类型  我们知道,每一门高级程序设计语言都有自己的类型系统。由于所有数据在内存中都是字节(当然,内存中的字节并非皆为"数据",还有可执行的代码)。而同样32位二进制数据在不同的解释方式下具有完全不同的意义(最简单的例子便是IEEE double浮点数与int32类型的数据, 同样的32位bit解释为浮点数和int类型讲得到完全不一样的数值)  所以,我们需要一套系统来确定某一段内存的数据所拥有的类型。这套系统帮助程序员维护数据的类型信息,而不是让程序员将某个内存位置的数据到底

2020-07-20 02:17:15 1012

原创 利用python import机制与类声明机制实现单例

利用python import机制与类声明机制实现单例import机制一:执行被导入代码当在python中执行一条import 语句的时候python解释器会按照sys.path变量中的顺序遍历文件夹寻找import 语句指定的包.如果指定的包是package(文件夹)则尝试执行__init__.py。在base.py中有如下语句# base.pyprint(f"base.py is been importing")在importBase_1.py中有如下语句# importBase_1.p

2020-07-19 13:17:07 280

空空如也

空空如也

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

TA关注的人

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