EINDEX 的博客

EINDEX 的博客

分享技术、想法、职业与生活

2023 总结 - 软技能大提升
回顾

2023 总结 - 软技能大提升

不知不觉又是一年,今年过的尤其的快。可能是因为疫情三年,又或者是因为其他的原因,感觉时间像是抛下了这一年。 今年我最大的收获就是,知道了自己想要什么,想做什么,想成为什么。同时也意识到什么叫作计划赶不上变化,以及过于单纯导致风险。 这些事件也导致我从一个 INTJ 变成 INTP 然后成为 INFP,哈哈哈。 另一件事就是今年感觉精力大不如前,能够有效输出的时间更少了。今后要把时间花在更有价值的事情上,比方说自我提升,英语,考证或者是做产品,又或者是去旅行,体验各种不同的生活方式。 随心而行。 技能 今年应该是一个更称职的安全咨询师了,各种咨询的技巧,沟通技巧以及写 PPT 上都有一些些的进步。 总的来说在 Thoughtworks 的这几年大多都是在横向发展,现在我应该是超级一字形人才,我常自嘲自己是全干全菜工程师。 成就 * 我的 Logseq Copilot 有 2000 用户了 * 在 Github 上获得了大约 200 Star
2 min read
青甘大环线: 西北自驾游
旅行

青甘大环线: 西北自驾游

缘起 时间飞逝,转眼间我就要 29 岁了 写此文的时候我已经 29 了,去年我和我的女伴约定今年一起进行一次大规模的旅行。 正好在 8 月份,青甘大环线是最热门的路线,同时青海湖也是最美的时候。我女伴对莫高窟一直挂念以及关注其每年都会有所衰退,因此我建议何不就选择青甘大环线自驾游呢?只去莫高窟似乎有些无趣。不过事实上,莫高窟并不会每年都稍微消失一点,所以各位读者大可不用担心。 计划 在规划路线的时候,看到图片上各个景点美丽的风景,脑中已经忍不住开始幻想目的地的美丽,同时也必须要处理的是每天需要开车 5-7 小时的事实。同时,因为是自驾游,所以在租车上也考虑到了是否要节省点成本,或者是租一个我心仪的坦克 300,但是坦克 300 的租金比普通车贵一倍,价格大约在 420 元/天。 同时我们还需要考虑哪里要去哪里不去,我发现了 lewang 制作的 Google 地图 和旅行指南,以及一系列的旅行推文,真的帮我们大大减少了纠结。 考虑到旅行中大部分时间都在车上,所以我还是选择租我一直心仪的坦克
9 min read
2022 总结 - 找到新的目标
回顾

2022 总结 - 找到新的目标

2022 2022 年过去了,又是一年,今年好像什么也没做。 我很讨厌这一年经历的一些事,封城,跑毒等等,总让我感觉没有安全感。 职业 从内部岗位来到了外部岗位,工作更加单一也更专注了,尝试了一些新的领域 DevSecOps 和给客户公司做安全咨询服务以及代码审计。 这个工作内容倒是出乎意料的适合我。期待在新的一年里能有新的挑战和机会。 个人 今年开车跑了 2 万公里了,开心,新房子也住了一年了。 英语水平获得海量的提升,今年可以用英文讲安全课程,英语水平收获很多同事的好评。 技术 Blog 最终还是被我弄起来了,这可能是去年投入时间最多的事情。最终用 Zola 搭建了现在这个静态博客。以后有机会分享一下这个博客网站的架构吧。 22 年有更多的时间去研究新东西了,比方说 Pulumi、 Kubernetes、 istio、 Github Action、Semgrep、ChatGPT。 我更多时候还是把自己看作一个程序员,什么事情都想亲自去做一下,希望来年可以多宣传一下自己做的这些玩具们。更多的提升一下软技能和某单一技能的深度。
3 min read
回顾

反躬自问 - 迷茫中的求索

缘起 事情还得从一次因防疫政策变化导致的“特殊”出差说起。 人在远离舒适圈的时候,总会经历种种困难与不适,噪音、拥挤、打卡、隔离、被缩短的工期、不合理的政策……都让“出差”成为了一项挑战,而“疫情”和“三年第一次出差”,这两重因素的叠加,更让我对这次出差中将面临的未知感到恐惧,这种恐惧甚至大于好奇。 下面我会尝试用“自我问答”的方式,记录这次出差的体验与感想。 自问 衣食住行上有什么体验? 衣:没啥好说的,我在出发前带了一些换洗衣服,还在当地“程序员服装供应商”之一的优衣库那的采购了一点新的。 食:我吃不惯,太辣,成都人的口味真的好重。 住:我隔离的时候住在宿舍里,嗯,怎么说呢。除了床之外,其他都挺好,床就是块板子,让腰疼的我“疼上加疼”😭。后几天的隔离时间里,我都睡沙发了,让我惊讶的是,
6 min read
2021 总结 - 开始做安全的第一年
回顾

2021 总结 - 开始做安全的第一年

2021 年就要过去了,分享一下我今年都干了些什么事请。 下面会分为几个维度来说。 职业 今年无缝转职成了安全从业人员,学习到了很多 DevSecOps 的知识,同时了解到安全不仅仅是技术开发,有时候流程安全能比应用安全起到更多更大的作用。这里也要感谢一下我的领导们。 也更了解如何去和其他人和团队沟通,如何去推动其他人或团队做事情。更高效的完成事情,同时也让双方都觉得比较舒服。以及知道如何去和 stakeholder 沟通,让大家的利益趋向一致。 在内部处理了 Log4J 这个史诗级的漏洞,不仅快速排查/修复问题可能出现的点,而且从多个角度重新审视了整个内部安全流程与 DevSecOps 的设计,收获颇丰。 个人 今年在自己这边,提升最大的可能是英语了,了解我的人知道我英语很差(高考五十几分)也没过四级,现在可以用英文与外国同事交流,能写长邮件文档。 在光顾了心理医生和自己研究学习之后,知道如何排解内心的情绪,也更了解什么时候需要做什么事情,应该大大降低了我自身的跳楼风险,虽然我不是毛星云那样的天才。 19 年交付的房子,21 年总算是简单搞了一搞
5 min read
财务自由,早退休

Beancount - 复式记账工具介绍

本文简单介绍一下复式记账和 Beancount 的使用方法。 为什么要记账 记账是理财的第一步,熟话说得好:”你不理财,才不理你。“ 记账可以明确自己每一笔钱花在哪去了,这个月最大的开销是什么,以及对自己的冲动消费、不必要消费能有一个反思。 我曾使用过很多记账软件如:挖财、随手记、网易有钱、MoneyWiz、MOZE 等,其实记账最大的问题在于很难坚持下来,因为短期来看记账的收益并不高,而从长远来看,账本也能体现经济的健康状况。 复式记账是什么 复式记账(Double Entry Bookkeeping)是以资产与权益平衡关系作为记账基础,对每一笔账单,都要以相等的金额在两个相互联系的账户中进行记录。 原理: 资产 = 负债 + 所有者权益 复式记账的优点是: * 账户对应关系清楚,可以鲜明的表示各种经济活动的来龙去脉。 * 有借必有贷,借贷必相等的记账方式,对于检查账单是否记对非常有帮助。 何为 Beancount Beancount 是一个用 Python 实现的开源复式记账软件。 数据文件基于纯文本,所以不用担心程序出问
4 min read
Python

百行代码的异步爬虫 - 基于 Python 实现

一个优雅的爬虫需要一下这些东西: * 请求器 * 页面解析器 * 链接生成器 * 调度器 请求器 负责发送请求。 页面解析器 负责从页面上解析出继续爬的链接。 链接生成器 负责处理继续爬虫的链接并放入队列。 调度器 决定链接是否应该被爬去的核心部件。 异步 同时有多个请求在发送,即时异步爬虫。 代码 相关代码已上传到 Github[https://github.com/EINDEX/100-line-async-spider]。 import aiohttp, asyncio, aiofiles, lxml, pathlib, sys, re, lxml.html from urllib.parse import urlparse from pathlib import Path from hashlib import md5 MAX_GET, MAX_
2 min read
读后感

《1984》读后感

这本书看了很久了,下面这句话一直环绕在我脑中,始终不能忘记。 “老大哥在看着你。” 在书中的那个时代, 是个反乌托邦的社会, 这个社会有一个叫做老大哥的统治者。四处都贴着老大哥的肖像, 大家崇拜着这个叫做老大哥的领袖。 那个社会中存在这样一句口号: “战争即和平;自由即奴役;无知即力量。” 看着就觉得非常厉害,读完之后在看这句话, 更能理解其中的深意。 文中以一个小职员主人公温斯顿的日常生活,带领我们进入《1984》的世界。老大哥控制思想、老大哥永远正确、老大哥创造了历史,老大哥是人民的救星。当然也有反对老大哥的人,想推翻国家政权的人。 而我们的主人公因为有自己的思想,负责修改历史记录,所以他犯下了思想罪,迎接他的就是死亡。因为“思想罪不会带来死亡,思想罪本身就是死亡。” 之后温斯顿遇到了爱情,以及真正的性,同时加入到了反老大哥的组织。他读到反党领袖所写的《寡头政治集体主义的理论与实践》,他读到这本书关键之处,被思想警察活捉。 在监狱,反复被拷打,被改造,只有相信老大哥的人才能真正的出狱。 他也出狱了,他放弃了自己的思想,他死去了。 这本书里
2 min read
算法

倒排索引的工作原理

世界上最伟大的互联网产品,说是搜索引擎,绝对没有别的产品可以替代,尤其是伟大的先在市场占用率最高的搜索引擎,Google Search. 还有很多差一大截的,比如 Bing, Yahoo 和 YANDEX. 什么是搜索引擎 所谓搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术。 搜索引擎技术的核心模块一般包括爬虫、索引、检索和排序等,同时可添加其他一系列辅助模块,以为用户创造更好的网络使用环境。 搜索引擎干了些什么 简单的说搜索引擎从网络上爬取网页,然后对网页信息进行提取,构建正排索引,然后分析网页内容,建立倒排文件. 接下来我将依次介绍 正排索引、 倒排索引 等知识点. 正排索引 正排索引通常是 id-document 的键值对 id name context eng_context 1 小明 今天吃了 3 个包子 today eating 3 baozi 2
4 min read
Python

Pipenv + Autoenv 更友善的工作环境

Python 包管理一直都是一个问题,如今 3.6 推荐采用 Pipenv 出自 Requests 的大牛做所。配合上他写的 Autoenv 切换环境再也不是问题。 安装 MacOS brew install pipenv brew install autoenv 其他平台自行 Google。 Pipenv pipenv 在安装之后会在当前目录上生成一个 Pipfile ,这个文件不在是像 requestments.txt 那样的纯粹的文本结构,加入了一些配置内容。 比如说可以配置使用的 pipy 源,Python 版本号,以及包管理。 Pipenv 的包管理比其他的有点在于可以直接在配置文件中指定 正式运行 packages 和 开发环境中的 packages,管理一个文件比管理多个版本文件的好处不言而喻。 同时 pip 加入了 pip
1 min read
Python

KMP 算法 - 基于 Python 实现

在计算机科学中,Knuth-Morris-Pratt 字符串查找算法(简称为 KMP 算法)可在一个主文本字符串 S 内查找一个词 W 的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。 这个算法是由高德纳(Donald Ervin Knuth)和沃恩·普拉特在 1974 年构思,同年詹姆斯·H·莫里斯也独立地设计出该算法,最终由三人于 1977 年联合发表。 原理 将待匹配字符串命名为 m 源字符串命名为 S 。本算法对待匹配字符串做处理之后,找到他的真前缀和真后缀。并通过真前缀与后缀重合的数量的值,这个值是在匹配状态中发生矢配时,位于原始字符串上 S 的指针移动的方向与距离。 简单的说就是匹配失败时。通过之前的真前缀和后缀表,直接移动在匹配字符串上的指针,达到减少无用匹配的效果。 优点 节约时间,相比于朴素的匹配方式,新的匹配算法只需要 O(m + n)
2 min read
Python

编辑距离算法 - 基于 Python 实现

编辑距离是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。编辑距离可以用在自然语言处理中,例如拼写检查可以根据一个拼错的字和其他正确的字的编辑距离,判断哪一个(或哪几个)是比较可能的字。DNA 也可以视为用 A、C、G 和 T 组成的字符串,因此编辑距离也用在生物信息学中,判断二个 DNA 的类似程度。Unix 下的 diff 及 patch 即是利用编辑距离来进行文本编辑对比的例子。 编辑距离有几种不同的定义,差异在可以对字符串进行的处理。 在莱文斯坦距离中,可以删除、加入、取代字符串中的任何一个字元,也是较常用的编辑距离定义,常常提到编辑距离时,指的就是莱文斯坦距离。 也存在其他编辑距离的定义方式,例如 Damerau-Levenshtein 距离是一种莱文斯坦距离的变种,但允许以单一操作交换相邻的两个字符(称为字符转置),如 AB→BA 的距离是 1(交换)而非 2(
3 min read
Python

树的遍历于常见算法 - 基于 Python 实现

树是计算机科学中常用的数据结构之一,常见的地方有,Java 的继承树等。 还有一些基于树的特殊数据结构,比如二叉树,B 树,等等。 本篇会讲述一些关于简单关于树的操作。 树的定义 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由 n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: * 每个节点有零个或多个子节点 * 没有父节点的节点称为根节点 * 每一个非根节点有且只有一个父节点 * 除了根节点外,每个子节点可以分为多个不相交的子树 节选自 树(数据结构) 定义数据结构 class TreeNode(object): """ 一个树节点 """ def
5 min read
算法

基本排序算法 - 基于 Python 实现

本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序。希望大家回顾知识的时候也能从我的这篇文章得到帮助。 为了防止误导读者,本文所有概念性内容均截取自对应 Wiki 冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 步骤 冒泡排序算法的运作如下: 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 代码 def bubble_sort(
11 min read
回顾

Thoughtworks 一月

距离加入 Thoughtworks 已有一个月。 这家公司也并非互联网公司,没有高强度的工作节奏,没有 996,有一些敏捷信仰。 对于武汉来说,也算是一个优秀的公司。 同时正如网上所言:该有的缺点也是有的。好奇的同学可以去看一下我的编程引路人(也是我司黑粉头子)耗子叔(陈皓)的文章。 技术变更 通过一个月的折磨,本人成为一名勉强能用的 Salesforce 开发者。 现在的技术栈新增了: * Apex * SOQL * Lighting Web Content 使用的产品新增了: * AWS lambda * Salesforce 但怎么说呢 Salesforce、Apex、SOQL 对开发者真的是非常不友善基本的功能都不完全。 先来说说 SOQL: 1. 不支持 update delete insert 2. 不支持 join 3. 子查询只能写一层(本人也不推荐多层)
2 min read
Python

基本线性数据结构 - 基于 Python 实现

本篇主要实现四种数据结构,分别是数组、堆栈、队列、链表。我不知道我为什么要用 Python 来干 C 干的事情,总之 Python 就是可以干。 所有概念性内容可以在参考资料中找到出处 数组 数组的设计 数组设计之初是在形式上依赖内存分配而成的,所以必须在使用前预先请求空间。这使得数组有以下特性: 1. 请求空间以后大小固定,不能再改变(数据溢出问题); 2. 在内存中有空间连续性的表现,中间不会存在其他程序需要调用的数据,为此数组的专用内存空间; 3. 在旧式编程语言中(如有中阶语言之称的 C),程序不会对数组的操作做下界判断,也就有潜在的越界操作的风险(比如会把数据写在运行中程序需要调用的核心部分的内存上)。 因为简单数组强烈倚赖电脑硬件之内存,所以不适用于现代的程序设计。欲使用可变大小、硬件无关性的数据类型,Java 等程序设计语言均提供了更高级的数据结构:ArrayList、Vector 等动态数组。 Python 的数组 从严格意义上来说:Python 里没有严格意义上的数组。 List可以说是 Python
6 min read
新手教程

小白也能上手的 ArchLinux 安装教程

ArchLinux 是一个非常符合我个人哲学的操作系统,深得与我一样的大部分 Pythonista 之心(不好意思代表你们了)。 什么是 ArchLinux > ## 原则 >以下核心原则构成了我们通常所指的 Arch 之道,或者说 Arch 的哲学,或许最好的结词是 Keep It Simple, Stupid(对应中文为“保持简单,且一目了然”)。 简洁 >Arch Linux 将简洁定义为:避免任何不必要的添加、修改和复杂增加。它提供的软件都来自原始开发者([上游](https://en.wikipedia.org/wiki/Upstream_(software_development) "wikipedia:Upstream (software development)")),仅进行和发行版(下游)
7 min read