栗子℃

栗子℃

_(:з」∠)_

吐槽 (?) 基础复习 数据库

如何理解数据库事务的一致性

总而言之,复习的时候发现了某些对事务一致性 (Consistency) 比较玄乎的中文解释,简单搜了下,发现大部分答案都是那么解释的……决定来个通俗版本? 简单搜到看到的版本。。。 版本1:事务执行前后数据库的状态保存一致。(某公众号复习资料)感想: ??? 版本2:几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。(百度百科)感想:感觉这个解释更偏向隔离性? 版本3:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。感想:听君一席话,如听一席话 版本4:数据库处理前后结果应与其所抽象的客观世界中真实状况保持一致。感想:好像有点明白,有几个版本是从这个角度说的(很多都是银行账户存取款的例子,转账前后钱应该守恒,且不能转超出余额的钱让余额变成负数等等)。一致性有时也被称为正确性 (Correctness),即操作前后,数据库记录的数据是正确、符合期望的。 索性连英文的版本也一起查了: Consistency ensures that a transaction can only bring the database from one valid

笔记 备忘单

设计模式 Design Pattern

设计模式是指前人从实践中摸索出、并反复验证过的,对常见问题的经典解决方案。而这些解决方案,可以帮我们思考在特定情况下,如何组织、设计类和接口来达成一定目的。 创建型模式 Creational Pattern如何创建对象。如隐藏一些具体的创建逻辑,从而提高代码的灵活性与可重用性。 工厂 Factory不直接靠new来创建实例,而是建造一个工厂类,再通过工厂的方法创建“产品”类。使用者使用产品,不需要知道工厂具体怎样生产、产品的具体细节,只需要知道工厂可以生产产品,且生产出来的产品都具有自己想要的某种用途(产品们需要有统一接口)就可以了。public interface Product { void doSomething(); void showName(); } /*------Product A -----*/ public class ProductA implements Product { public String name = "Product A"; void doSomething() { System.out.println(

笔记 Tech

设置WSL2

WSL什么是WSLWSL是Windows Subsystem for Linux的缩写。简单来说,它可以直接在Windows上跑一个Linux(可以自己挑发行版),这样就可以方便的在Windows机子上用Linux系统的软件与工具了。比如在Windows上,安装Docker要求WSL2或者Hyper-V。家庭版的Windows就没得选啦,只能WSL2…… 其他选择与比较在装了Windows的机子上使用Linux的其他选择主要有 VM(虚拟机)双/多系统其中VM主流上是使用VMWare(付费)、VirtualBox(免费)、Hyper-V(Windows比较贵的版本限定…)和系统镜像在Windows里配置、启动虚拟系统。硬件足够好的时候可以同时启动多个。 多系统就是直接在硬盘上再多安装一个或多个系统,然后在启动时选择要启动哪个。可以最高效的让系统使用硬件资源,但一次只能开一个系统。安装前需要根据要安装的系统对部分硬盘进行格式化,而安装后也可能因为文件系统的不兼容,切换系统后存在一定的文件读写上的困难(如Windows无法直接读取Linux的各种ext格式,跨系统访问文件后也可能产生一些奇奇怪怪的文件占用和锁)。 WSL与VMWSL可以启动得比VM更快,占用资源也比VM更少(WSL2其实是使用VM的,但有针对性优化)WSL与Windows的连通性更好,文件系统可以说是的联通的。而VM和Windows是分隔开的,作为沙盒,有更好的安全性,更适合做各种作死的实验……VM里可以提供更完整全面的Linux功能,比如图形、音频、硬件支持VM里可以跑的不只是Linux,泛用性更好一些WSL和WSL2的差异Ref: https:

Java 备忘单

Java基本数据类型

数字整数Integer / int32位有符号整数,具体范围是:-231 (-2147483648) ~ 231 -1 (2147483647)大致范围:正负2*109 不用管溢出,1010 不行Integer接受null, int不接受Integer需要是用equals判断相等(直接用==会判断是否是同一个对象,而非是否数值相等),但>=与<=可以可以正常使用Integer.parseInt返回int,Integer.valueOf返回IntegerLong / long64位有符号整数,具体范围是 -263 (-9223372036854775808) ~ 263 -1 (9223372036854775807)大致范围:-9*1018 ~ 9*1018默认值是0LByte / byte8位有符号整数,具体范围是 -128 ~ 127Short / short16位有符号整数,具体范围是-32768 ~ 32767小数Float / float有符号32位IEEE754标准的浮点数符号位(s):1,指数位(E)

Web 笔记

常见的网页字体

英文字体 ref: Common Fonts for Windows & MAC ‌‌ SerifSerif 来自古荷兰语的“短线”、“线”。Serif 指衬线字体,即在字母的开始、结束的地方有额外装饰的字体。 衬线字体的由来:据说是来自对笔刷、雕刻字体的模仿。衬线即用刷子刷字时,为了让字母的开始、结尾整齐无毛刺,而垂直书写方向进行划线、停顿等而留下的痕迹。以及雕刻时下刀、收刀、或为了遮盖结尾不整齐而留下的痕迹。 下图中箭头指的就是衬线。 serif vs sans较常见的 serif 字体有 Times (即Time Roman), Times New Roman, Georgia, Palatino, Bookman等。 Sans SerifSans 是法语的“没有”。Sans-Serif 指无衬线字体,如上图所示。 较常见的

基础复习 笔记 Java

复习 ---- 位运算,乘除与移位

位运算且 &  Bitwise AND按位且。向右对其,对其后两位都在且两位都为1的时候才为1。 例:1110 & 0001 = 0000,1111 & 1101 = 1101, 1010 & 1001 = 1000 常见用途:掩码,取某个数第n位(& 除了第n位是1,其他都是0的数,然后除以n个2), 判断一个数的奇偶(&1==1是奇数) 或 |  Bitwise OR按位或。向右对其,对其后有一位为1就为1 例:0000|1111 = 1111, 0101 & 1010 = 1111,0010 & 1010 = 1010 非 ~  Bitwise Complement/

笔记 折腾VPS Web

在博客养一只猫 -- Live2D SDK 4.x 探索

提前声明,这不能当教程,只是一份笔记,还有吐槽。 搞一只看版猫到博客居然比搞一只看板娘还要麻烦……囧 虽说最后猫是放出来了,但八成还是哪里没用对吧,编译出来动辄四五百kb的js文件(虽然确实是没有特别狠的压缩,uglify全开之后运行会出错……),还有官方原版Demo直接编译出的1.6MB js+sourcemap(不含模型与图片),怎么看怎么别扭(捂脸)…… 这个只有短短5页的官方文档也是没说多少东西,也可能是因为大部分用户都是开发手机原生应用,而不是网页的吧。 要找教程的话,往这边走吧~ 其他人努力研究的v4 SDK教程: https://blog.csdn.net/qq_37735413/article/details/119413744 (让我意识到了模型使用非标准参数名的问题)还不清楚是哪个版本,但是文档链接很多: https://github.com/stevenjoezhang/live2d-widget应该是旧版本SDK的应用: https://blog.csdn.net/qq_37735413/article/details/

基础复习 算法

基础复习 —— 排序

性能总览ref: https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/pxal47/性质稳定性按比较的标准,两元素相等时,不会改变这两个元素的相对顺序。 意义是,在按某一标准进行排序时,不打乱按其他标准已经排好的顺序。 例:(A, 2), (B, 1), (C, 3), (D, 2) 本身已经按字母排序,若对数字排序,非稳定的排序可能会将D放到A前面,而稳定的排序可以确保A, D间顺序不变。 就地性是否需要额外的空间存放辅助数组,还是直接在要排序的数组上操作就可以。 另外,无关就地性,如果希望输入的数组不要被改动,可以在排序前先复制数组再操作。 // 例,利用Arrays.copyOf int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);自适应性时间复杂度受元素分布影响。 能找到的相关资料不多,可能这个说法不太常见,但用处应该是,在已经近似是有序(知道无序元素并不多)

Tech 折腾VPS

Nginx反代 - 多站点、X光共存

这里是不使用一键脚本,全手动配置的方法之一。缺点是繁琐,有很多前提条件。优点是比脚本更灵活一些,可以按想要的那样配置。 接上面SSL与泛域名解析。 在已经有域名、域名证书、配置好Nginx反代和Cloudflare DNS+CDN的情况下,如果你的VPS下面硬件所在的机房地理位置不错……可以考虑再挂个X光。 Nginx 这边可以这样写 server { listen 80; listen [::]:80; server_name <secondary_domain>.<your_domain>.com; # 安全起见,不使用自己打算长期使用的域名 # 使用Cloudflare的免费证书的请不要设置三级域名,不支持的 # 虽然想排列组合出更多域名的心情我懂 return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443

折腾VPS Ubuntu

给VPS挂载网盘

安装Rclone Rclone官方 Rclone的git网址 对Linux/macOS/BSD系统挺简单的: curl https://rclone.org/install.sh | sudo bash 等它几秒刷刷跑完,就安好了。 连接网盘的准备步骤 很可能会需要一把梯子 先连接上网盘,然后再挂载。 连接一个微软OneDrive 大概是需要你的VPS位于国外,因为国内有一半是墙的。。。另外自动验证时也有可能需要科 学 上 网。 另外,如果你的VPS是基于OpenVZ的,你还有可能遇到一个问题,就是FUSE没开,而你自己又开不了。遇到这个问题的时候,没啥办法,开一张工单(ticket)问(qiu)问(qiu)客服能不能给你开吧。(所以还是KVM更禁得住折腾啊~怎么折腾都不需要问别人的同意) OneDrive的容量还是挺大的,1T。留学生们基本人手一个了(学校账户/alumni校友账户),淘宝也有一些在买的(可以很便宜的买到5T甚至25T的,

折腾VPS Ubuntu

安装面板Ajenti2

安装好的Ajenti2面板 – 还有很多插件没有安装的状态Ajenti 2是个轻量级的面板,大概有点小众,文档也写得不是很清楚(使用说明相当有限)。 不知道是不是因为我把它塞在nginx后面,有部分功能有问题,然后也有部分功能即便从本地访问不经ssl也照样有问题(报错)。。。 但总之,还是能满足我从网页端看VPS状态、上传个文件、偶尔用下terminal的需求的。 (--2021/07/15更新--之前新安的插件在ssl后会莫名其妙的404,本地访问正常,设置、重启nginx也没用。今天又莫名其妙的自己把自己修好了???难道和caching有关??暂且,没搞明白。。。) 安装方法 Ajenti官网 Ajenti安装文档--其他相关文档也在 可以使用官方脚本一键安装 curl https://raw.githubusercontent.com/ajenti/ajenti/master/scripts/install.sh | sudo bash -s 安装完,面板前端会默认在8000端口启动,可以用VPS已有的用户的账号密码登录。目前似乎并没有禁止root用户登录这个面板的方法,而且这个面板也没有几次输错密码就封IP的功能,所以,入口的网址一定把名字搞复杂点,账号密码也别设太简单。

折腾VPS Ubuntu

把SSL和二级域名们架上吧

域名准备 想要架上二级域名,首先,我们需要一个一级域名……自行在心仪的厂家选购。我比较常用的(价格比较实惠的)是国内的是万网,特价的时候一百多人民币买过十年的。国外的是NameSilo,首年特价很多,.com,.xyz比较实惠,但像.top之类的还是当年万网买得更便宜。(不过拿.top,.cyou之类的便宜域名发邮件比较容易被当成垃圾邮件屏蔽……) 提醒一下,Freenom的虽然免费,但在那个bug多端的网站申请其实还挺麻烦的,而且实测无法使用LetsEncrypt获取证书(不支持那几个顶级域名)。 DNS准备 获得域名后,如果那家的DNS不尽如人意,可以转接其他服务商的DNS,比如Cloudflare。NameSilo接Cloudflare走这里 在Cloudflare的话,可以这样配置域名: Type Name Content A 你弄到的那个域名,比如mydomain.com 你的IP(IPv4) CNAME 二级域名,比如blog 你的主域名,如上面的mydomain.com CNAME 另一个二级域名,如repo 你的主域名

折腾VPS

让Namesilo用Cloudflare的DNS

Namesilo 还算是域名比较便宜的地方,不用备案,但是自带的DNS很不给力,对变更的反应极慢。。。 Cloudflare 登录之后 登录之后,点home下这个增加站点让选plan,就选个免费的吧,够用了之后,DNS record那页可以暂且不填,之后再说,继续continue。 Cloudflare会给出两个Nameserver在Namesilo里点进一个domain (图中第一条是还用着默认name server的)找到Nameservers一栏点change,然后把默认的三个name server清空,换上Cloudflare那两个,点submit。然后回Cloudflare,点Done, check nameservers按钮。 好啦,于是再设置DNS就用Cloudflare就行了。后续按网页提示,可以把Automatic Http Rewrites (自动把http换到https),Always use HTTP还有Optimize performance (自动minify网页、样式和脚本。当然,如果你的toolchain跑一趟下来本来就minify过了,也就不用开了)。

折腾VPS

给VPS换SSH端口

单纯是因为那些扫22端口乱试密码的家伙们太烦了(在日志里刷屏),在配置完防火墙之前,换ssh端口基本是我常规操作了。。。 去/etc/ssh/sshd_config,随便什么编辑器(需要root或者sudo),找到port那一行(默认应该是带#注释掉了,去注释),把端口号改成自己想要的。 service ssh restart 或者 /etc/init.d/ssh restart 顺带也可以把root登录给禁止掉,不过禁止前一定要留个能登录的sudo用户哦,不然可能会很惨(如果VPS控制台那边也没法修复网络设置的话)