0X00 前言 为什么要写这么一篇文章?按理说大家工作了一段时间之后肯定有一个最基础的认知:md5 不是加密,base64 也不是。起码我最开始以为大家应该都知道,但是后面发现有些人对这两个东西的理解真的有很大的问题。所以才打算写这么一篇文章。 事情的起因是这样的: 所以我接下来打算首先介绍一下 base64 究竟是怎么得到的(算法本身),再来说明白 base64 为什么不可以通过前面加 32 个随机字符来实现“加密”(随机长度也不行)。 <!-- more --> 0X01 常识性的知识 首先我们明确一个事情,就是「编码」「加密」「哈希」之间的区别: | 名称 | 是否可逆 | 是否安全 | 典型 | | | | | | | 编码 | 是 | 否 | base64 | | 加密 | 是 | 是 | AES | | 哈希 | 否 | 不总是 | md5 | 编码,是将一段内容通过某种算法直接转换成另一段内容,只是形式发生了变化,在明确编码算法的情况下是可以轻松解码获得原始内容的 加密,是将一段内容通过某种算法和 密码…
0X00 开头 最近买了本书,叫做《100个Go语言典型错误》,发现这样的总结很有意思。决定自己也写一个,不过以我的水平写本书还是有点离谱了,但是写一篇博客还是没什么问题的,所以就有了这篇文章。 0X01 函数默认值传递空列表 这是一个典型错误,很多很多的 Python 程序员都犯过这个错误。一般在定义一个函数且给它设置默认值的时候我们都会写成 def foo(a=0, b="", c=None) 这个样子,这种写法是完全没有问题的。但是有时候也会写成:def foo(d=[]),这就完犊子了~ 我们看下面这段代码 你以为会输出 10 个 ['x']?那就大错特错了,真正的输出是这样的: 为什么呢?因为函数在定义的时候就将空列表初始化了,并且记录下了引用,以后每次都会对同一个列表进行操作。另外不只是列表,字典作为默认值也会有这个问题的。 0X02 对闭包的无意识理解 很多人对闭包的理解就是粗浅的「函数里定义函数」,当然这是没错的,但是缺少了一些东西。如果只是函数里定义函数的话,下面这段代码会发生什么? 没错,这段代码是会正确输出 2…
0X00 正文 前几天尝试用自己的服务器通过 docker 启一个新服务,没注意这个服务需要的内存比较大(我的服务器只有 2G 内存),导致 docker compose up -d 命令敲下去不到一分钟服务器直接卡死了...... 当时还没意识到是内存不足导致的问题,以为是 CPU 卡住了,毕竟一般情况下服务刚启动的时候确实会占用比较多的资源。所以直接摆烂,等它一会儿好了。半个小时之后发现服务器还是卡死状态,ssh 也上不去,所以干脆去云平台重启。发现云平台的监控上已经看不到CPU/内存的占用率了,意味着装在服务器里的 agent 也已经完蛋了。而且,重启服务器也没有什么效果。 好在云平台可以通过类似 IPMI 的方式直接接入到服务器的 console,所以可以通过 console 登陆。虽然每一步的操作都非常非常卡,敲一串命令要等很久才能回显。使用 free -h 检查了内存占用情况之后发现确实是内存瓶颈,并且系统没有配置交换分区,所以才出了下面的这个骚招: 1. 使用 free -h 确认当前内存使用情况,发现内存爆满且没有交换分区 2. 意识到 Linux…
0X00 叠甲 开局先叠甲,我到现在为止用过一台 Mac mini,一台 Intel 的 MacBook Pro 和一台 M2 Max 的 MacBook Pro,自费购买 MacBook 花费超过 3W 元,累计使用超过 5 年,是个不折不扣的 macOS 用户。我认可很多 MacBook 和 macOS 的设计理念,如果我现在只能保留一台电脑,那极大可能我会选择一台 MacBook Pro。 😡 好了现在开始输出 😡 0X01 难用的包管理器 首先就是这个 homebrew,我在买 MacBook 之前看攻略的时候就看到很多人在吹 homebrew 有多好用,有多厉害,有多方便。他们的说辞一般是:一个命令就可以更新系统里很多的组件、一个命令就可以安装好开发环境、一个命令就可以XXXX。当时我作为一个 Archlinux 用户是有些懵逼的,但是看在这么多人吹捧的份上我也就相信了,心想着「这么多人都这样推荐,应该确实会很好用,如果能像 pacman 或者 apt 或者 dnf 这样的话那确实是很好的」。 结果呢?这个 homebrew…
0X00 没有什么意义但我就是想写的前言 有一说一现在的大模型发展太快了,最开始我列这个大纲的时候是把 deepseek 作为「凑合能用但超级便宜」的一个国产替代品来介绍的,没想到过了个年它直接翻身了,现在甚至能打 GPT-4o。所以我决定现在立刻马上把这篇文章写完,否则没准又杀出来个什么模型,会导致我永远写不完了 🤣 这篇文章的主要受众群体如下: 1. 知道最近 AI 很火,想用用看但是不知道怎么上手的朋友 2. 尝试用过一些大模型,但是觉得接入不方便或者价格高的朋友 3. 想全面接入 AI,让 AI 成为自己得力助手的朋友 这篇文章会介绍这些内容: 1. 成品工具:只需要一个浏览器或者一个 APP 即可访问的最大众化的 AI 接入模式 2. 模型选择:列举常见模型的特点,根据你的需求选择合适的大模型 3. API 接入:不方便接入原生 Claude/OpenAI API 时的优秀替代品 4. 三方工具:通过 API 接入后能大幅改善日常使用体验的一些工具 5. 本地部署:有关本地部署的一些个人看法 那么废话少说,现在开始正文了 0X01 商业化成品工具 想要最快速的接入 AI…
0X00 碎碎念 数数看这已经是我的第六篇年度总结了,每当回过头去看之前的总结就感觉写这些也还挺有意义的。虽然写日记对我来说太困难了,但是写「年记」好像还行,甚至有点乐在其中 🤔 廖凡_饺子_姜文.mp4 说起来小学时候大家都不喜欢家庭作业里有日记这一项,因为要写好多字,而且都没什么可写的。我就不一样了,因为我小学时候的日记全文都是:今天去XXX玩了,很高兴/今天去XXX家写作业,很开心。 🤣 回到正题。今年的生活完全被打乱了,比疫情还在的时候更乱,以至于我第一次 delay 了我的年度总结。哦不是,是完全没有去检查年初制定的计划到现在完成了多少(估计有个 30% 就谢天谢地了),具体是什么情况导致的我后面再说吧。这次给博客列的大纲就是零零散散不成体系,只能说尽力拼凑了一个年度总结出来,不管是长度还是质量肯定是不及去年和前年的万字长文了。那么就直接开始吧。 0X01 专业能力 今年本来的计划是更多的去深入学习之前已经掌握的知识和技能,结果完全没深入哪里去。反倒是之前两年多次「下定决心」要学的 Go…
0X00 你需要一台 NAS 吗 不知怎么的,在移动互联网疯狂发展的今天,反而慢慢开始兴起了自建网络服务这种复古风潮。最近这些年身边的朋友同事越来越多聊到 NAS 了,甚至 B 站上出现了一小撮 NAS 区 UP 主(没错,你知道我说的是谁)。就更不说现在淘宝咸鱼上大量的 NAS 专用机箱,甚至是 3D 打印的定制化版本了。 你真的需要一台 NAS 吗?NAS 说白了就是一块连着网的硬盘,速度比直接插电脑上还慢一些,如果你平日里需要访问数据的设备并不多,且拥有一个台式电脑,那不如先买两块硬盘插上去。通过文件共享功能将台式机转换成一个带有存储功能的兼职 NAS。 如果你家里的多个手机、平板、电脑、电视都需要访问存储,或者你没有台式机可以扩容,那确实可以考虑搞一台 NAS。 我自己的需求是这样的: * 平时喜欢摄影,每次拍摄回来的照片少则 10G 多则 50G,日积月累已经有大几百 G 了,需要备份 * 也喜欢拍一些视频,相机拍摄的码率都很高,随随便便 50G 100G 的,需要备份 * 患有仓鼠症,喜欢囤一些高清电影电视剧来看,总共搞了有差不多 8T 了 *…
0X00 来骗,来偷袭 这次来介绍一个来骗来偷袭的 Python 库:Faker。我们平时经常会跟数据库、跟 csv 这些东西打交道。尤其是当你设计一个数据库表的时候,开发和测试环境中只有空荡荡一个表,没有测试数据就很尴尬。 Faker 就是设计来解决这种问题的,它可以快速生成各种你需要的假数据。安装和使用都非常简单:pip install Faker 就可以完成安装。 这篇 mini 博客的目的是解决「不知道自己不知道」的问题,也就是说明有这么一个库可以做什么,然后介绍简单的用法;具体这个库的完整用法还是要去查看文档。 这里给出一个简单的使用实例: 简单示例 这里仅仅有两条需要注意的: 1. 实例化 faker 的时候记得标记语言,默认是英文信息; 2. 实例化的 faker 每次调用都会生成新的假数据,只需要实例化一次即可; Faker 支持生成非常非常非常多数据类型,这里就不也没必要一个个介绍出来。分享一个我自己的用法:可以用 dir(faker) 的方式看它究竟有多少假数据类型可用,也可以在 iPython 中实例化一个 faker 出来然后通过 faker. TAB…
0X00 前言 不知道为什么,当三个好用的工具在一起的时候就会被称作:三剑客;四个好用的工具在一起的时候就会被叫做四大天王 🤔。 算了,这不重要。 这篇文章的目的是带不了解这三个工具的朋友们简单上手使用它们,默认各位是掌握了 Linux 的基本用法的,其中也会出现有关正则的内容。如果你不懂正则的话建议跳过正则的部分,并且看完这篇文章马上就去学。另外,不要因为正则看起来有点像通配符就按通配符的操作进行下去。 0X01 grep 首先这三个工具中最常用的应该就是 grep 了,它用于从文件中搜索你感兴趣的内容。例如下面的例子就可以输出 /etc/passwd 文件中包含 root 的行 也可以接多个文件,这样输出的时候就会以文件名开头了 下面介绍几个参数: * -i 忽略大小写 * -v 显示不匹配的行(取反) * -n 增加行号显示 * -c 显示总共多少行,而非具体内容 * -r 递归查找所有文件 * -A 也就是 after,即显示匹配行和它后面的 n 行 * -B 也就是 before,显示匹配行和它后面的 n 行 * -C 相当于 -A 和 -B 一起用,显示匹配行和它前后各…
0X00 基础知识 常用 Linux 的各位估计都知道 iptables、firewalld 和 ufw 这三个工具吧,或者还知道 netfilter 这个内核组件。但是他们究竟是什么关系呢?从关系上来讲,可以将他们分成三层:最底层是 Linux 的安全框架 netfilter,上面是用来操作 netfilter 的 iptables,再上层是 firewalld 和 ufw。 其中 firewalld 一般会默认安装在 RHEL 和 CentOS 中,ufw 会默认安装在 Debian 和 Ubuntu 中。不过由于很多人还是习惯直接操作 iptables 所以这次的重点就是它了。很多人会说 iptables 是防火墙,这其实并不严谨,它的标准定义应该叫做 Packet Filter 也就是包过滤工具。而且事实上也是如此,它不仅能够实现防火墙的限制流量功能,还能提供 NAT 转发的能力。 iptables 内部总共拥有 4 张表(table),又有多个链(chain),如下图所示。 既然是「写给新手的 iptables 使用说明」,自然是挑选最重要的一部分来介绍的,也就是 nat…