Shawn's Blog
6 分钟阅读

「累」

0X00 正文 这篇内容可能是目前为止我所有博客内容里最特别的一篇了,今天不想写什么技术类文章,只是想发发牢骚,说说自己想说但一直没啥机会吐槽的事情。不知道各位有没有那种情况,其实自己是很乐观很开心的一个人,但就是偶尔会突然觉得很累,很烦,很焦虑。这些事情说大可能并不大,只是打个游戏可能某一关打不过去而已;说小可能也不小,甚至跟全国乃至全球数以亿计人口的健康相关。那接下来我就要开始吐槽了,也许会有些负能量,但把自己的「负能量」一股脑输出出来没准就能让自己变得更好呢 hhhhh tips: 这些内容不分前后顺序、没有主次关系、不一定符合你的看法、甚至你觉得我就是在胡说八道,但我不在乎~ 我就想随随便便看个综艺 本来我很早就看 _今晚80后脱口秀_ 的,虽然我并不是 80 后。也挺喜欢听他们说脱口秀的,不管是现在已经转行的王自健还是后面一直在说的蛋蛋建国什么的。后来 80 后脱口秀就不播了,我也就没再关注过脱口秀了。知道某天偶然间发现了 _脱口秀大会_…

5 分钟阅读

LVM 的创建扩容与压缩

0X00 介绍 阅读并了解 LVM 需要了解:Linux 基本操作、分区概念、文件系统概念 首先 LVM 的全称是 _Logical Volume Manager_ 逻辑卷管理。传统的方式是将一个磁盘分成类似于 sda1/sda2/sda3 的分区,然后再将这些分区格式化成类似于 ext4/xfs 这种文件系统,最后将文件系统挂载到某个目录上。但是这种方式下对磁盘空间进行重分配是比较麻烦的,将新安装的磁盘融入到现有系统中也是比较费力的,这就是 LVM 需要解决的问题。 总结下来 LVM 拥有这些功能 1. LVM 可以方便的对现有逻辑卷进行压缩(初次分配多的空间不会浪费,可以压缩出来) 2. 空闲的空间可以随时重新分配给逻辑卷(传统模式只能将空间分给最后一个分区,或者创建新分区) 3. 新加入的磁盘也可以为其他逻辑卷扩容(传统模式并不方便为某个现有分区扩容) 4. 可以将两块磁盘融合创建出一个更大的逻辑卷(两块 1T 磁盘可以创建出 2T 的分区) 特别需要注意的,RAID0 也可以将两个 1T 的磁盘合并为一个 2T 的,并且理论读写速度都会翻倍,但是这和 LVM…

8 分钟阅读

如何使数据库中的密码更安全:哈希、加密和加盐

0X00 前言 设计一个系统,不论是 Web 还是其他的什么形式,通过用户名和密码认证也是一个再正常不过的事情了。但是如何保存密码却是一个值得讨论的问题,相信各位最开始的一个有用户名和密码的程序多半也是用明文存储的密码吧 🤓 这里总结了六种比较常用于密码存储的方式,接下来可以逐一进行简单的分析以帮助我们更好的保护用户的密码 一清二白:明文存储密码,直接存 password 掩耳盗铃:使用 BASE64 之类的编码,存储为 cGFzc3dvcmQ= 盘古之法:使用早已不再安全的 md5 之类的摘要算法,存储为 5f4dcc3b5aa765d61d8327deb882cf99 祖宗之法:使用也已经不再安全的 sha-1 之类的摘要算法,存储为 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 凑合能用:使用现代的安全的例如 sha-256 之类额算法,存储为 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8 现代手段:采用系统化的多次迭代的加盐哈希方式加密,例如常见的…

1 分钟阅读

git stash 命名 / git stash 用法「重置版」

0X00 前言 本篇文章是这篇「使用 git stash save 将暂存区命名」的重置版。因为根据 Google 的统计数据我得知某些问题的关键词搜索出来之后我的博客排行会比较靠前,所以把最容易被各位点击到的文章做了个重置计划,改进之前的一些不足,争取能够说的更清楚一些,也能节省各位一点点时间,希望能真正的帮助到从搜索引擎点进来的各位~ 0X01 极度精炼的使用说明 可以使用 git stash save "message" 的方式为 stash 起来的变动命名,方便后面再次使用。 stash 起来过后可以使用 git stash list 来查看已经被 stash 的列表,这里可以看到已经有两条了,值得注意的是 stash 的 id 每次都在更新,最近 stash 的是 0,1 就是上次 stash 的,以此类推 如果需要从新应用某个 stash 的改动,可以使用 git stash apply STASH_ID 的方式,例如使用 git stash apply 1 就可以重新应用 id 为 1 的这个 stash。如果要丢弃掉某个 stash 的话使用 git stash…

2 分钟阅读

Python 内置函数:callable

0X00 换个方式定义函数 本篇内容不严格区分 function 与 method 🥹 我们都知道在 Python 中如何定义一个函数,只需要 def foo(arg_1, arg_2, args, *kwargs) 就足够了。知道的稍微多一些呢可能知道「Python 中万物皆对象,所以函数的调用也只是调用了函数对象中的 __call__ 方法」,所以我们可以尝试用这种方式调用一个函数 既然可以这样调用了,我们也就可以用类似的方法来定义一个假的 function,可以发现我们自定义了随便一个类,但是只要它实现了 __call__ 方法就可以被当做函数一样调用 0X01 callable 根据上面的方法可知我们可以用 hasattr(obj, '__call__') 来判断某个对象是不是函数,事实上我也确实在同事的代码里看到过这样用的。其实 Python 内置了一个名为 callable 的函数可以用,不过跟 hasattr(obj, '__call__') 并不完全一致 测试代码的第一行 Foo 类因为没有实现 __call__ 方法所以 hasattr 返回的是…

1 分钟阅读

一些由 int 方法引出的小知识点

0X00 可以被强制转换的自定义类 但凡写过 Python 的人应该都用过int()这个函数了,而且也都知道这个是将其他类型转换成int类型的内置方法,稍微用的多一点的还会知道这个方法如果传入不能被强制转换的数据时会抛出TypeError的异常。那你知道如何让自己定义的类可以被强制转换吗? 而且按照官方文档来说的话,如果你的class定义了__int__()方法,则int(your_obj)则会返回__int__()的值,如果定义了__index__()则会返回__index__(),如果定义了__trunc__()也会返回__trunc__()。当然是有优先级的,优先级`int index > trunc`,可以使用如下代码分别注释这些方法测试一下 0X01 int 的第二个参数 那你知道它其实还能接收第二个参数吗?其实 int() 方法可以接受第二个参数的,也就是用于进制转换的参数。换言说就是可以用内置的int()方法将其他进制的字符串数据转换成10进制 0X02 hex、 bin 等其他转换方法…

3 分钟阅读

Docker 容器中的文件持久化

0X00 最常见的持久化方式:挂载出来 相信各位学习使用 Docker 的时候都会出现过好不容易用 Docker 启动了个数据库容器,然后发现只要容器消失之后数据也就一起消失了的情况。然后通常来说会使用这么一个方法来解决问题:将宿主机的某个目录挂载到容器里,这样一来那个数据库容器就可以将数据内容和配置持久化地存储下来了。一般会使用这么一个方法将某个目录挂载到容器内部 docker run -dit --name new_container --mount type=bind,source=/Users/shawn/Downloads/test/test_dir,target=/test_dir alpine 。 下面图中首先创建了一个名为 this_container 的容器,并将其 /test_dir 目录和宿主机的 /Users/shawn/Downloads/test/test_dir 目录绑定到一起了。然后在容器里向 /test_dir…

5 分钟阅读

使用 ssh 命令建立网络隧道

0X00 前言 & 简介 说起来但凡各位用过 Linux 就应该用过 ssh 了吧,所以怎么使用 ssh 去连接一台服务器、怎么去配置 key 登陆而非密码、怎么允许/禁止 root 用户使用这种问题就不再过多讨论了,这篇文章来介绍一下 ssh隧道 这个东西。 说起来各位在生活工作中肯定遇到过这么一个情况,如图所示:我(A)自己想要访问一台机器(C)但是A和C是不通的,这时候有一台中间的机器(B),A可以访问到B且B和C也是通的(比如说梯子的应用场景)。r当然了你在中间的B机器上开一个 OpenVPN 肯定是可行的,但是一旦你的A连上了 VPN 之后所有流量也就都从B上走了,绝大多数情况下我们其实并不是很需要一个 VPN 而是需要一个轻量化的解决方案。这时候 ssh 隧道就是我们的一个很好的比较轻量化的解决方案,首先它不需要你在客户端和服务器上安装额外的软件(如果你连 ssh 都没装那就不说了);其次它不需要配置文件,为数不多的配置直接写在命令行里;最后它不需要额外的守护进程,你不用了就直接 Ctrl + C 干掉当前进程就行了。 ssh…

8 分钟阅读

2021 年终总结

0X00 先胡说两句 兄弟们我的年更文章它又来了~如果你看到这篇文章的时候发现发布时间是 2021-12-31 23:59:59 但你的手机电脑告诉你还没到这个时间,不要慌,一定是你穿越了。 我也不知道为啥莫名其妙就开始写年终总结了,而且今年已经是第三年了。人确实是一种很奇怪的物种,领导老师父母让你总结一年的时候暴躁不堪,根本不想写;但是自己突然来了这个念头之后就非常认真的写了一大堆,告诉我不是我一个人有这种“病”🙄 这次的总结打算换一种方法来写,大概分成了这么几个部分:去年的年度计划情况、年内做得不错的事、没做好的事、可以分享给各位的东西。 0X01 翻车的年度计划 2019 年度总结中我说“取法其上,仅得其中;取法其中,仅得其下”,但是今年就不一样了,今年的年度计划基本可以用四个字来形容:我是废物 😢(其实没这么离谱,听我慢慢道来) 今年就不给大家详细一个个的看我的年度计划了,简单说一下吧: 1. 阅读两个有兴趣的开源项目源码【完全没看】 2. 动手写两个自己练手新技能/知识的小项目【几乎没写】 3. 了解 5 个专业技能【就学到了俩】 4. 养成 4…

· ·
5 分钟阅读

Python 中格式化字符串的几种方式

0X00 前言 如果秉承着「能用就行」的原则,那么这篇文章提到的东西基本都没什么卵用;如果秉承着「写更好的代码」的原则,那么这里提到的东西也许对你有所帮助。 内容主要取材自 _Effective Python_ ,主要是作为自己学习后的一个输出而总结的这篇博客 0X01 使用 % 的 C 风格格式化 首先是沿用自 C 风格的使用 % 进行的字符串格式化方法: 这种写法在写惯了 C 的人身上比较常见,比较熟悉而且也比较简单。不过这种写法有几个问题,首先就是当百分号右侧的变量数量发生变化或者类型发生变化的时候,程序很有可能因为类型转化出现不兼容的情况 (当然了,本来是 %s %4d 对应字符串和数字,现在两个都是字符串了当然就出错了)。如果要解决这种问题的话,必须每次修改都要检查百分号左右的占位符和具体数值是否能对应的伤,而且一旦占位符多了之后还很容易看花眼。 还有一个问题就是填充数值的时候通常需要对具体的值进行一些处理,比如保留某几位长度之类的,这样一来表达式可能会很长,从而显得很混乱 。 我们来看 for…