Gingko

    2021 专业技能学习计划

    时常觉得自己看过的东西不少,但却没有很好地沉淀,主要有两方面弊端:1. 自我怀疑 花了不少时间学习了解,长时间不用,缺少实战经验,最终慢慢遗忘,最后会疑惑自己的时间花的到底值不值?为何要浪费时间在没有任何产出上?2. 没有形成知识面 最近两年很少系统地去学习知识,大部分时间花费在了碎片式学习上,东边一榔头,西边一棒槌,都是分散的知识点,很少总结回顾,沉淀成文字/视频等,导致后面用到时,重复浪费时间在资料查询搜集上,不能很好地缩短自己重拾知识时间,也未能很好地帮助他人。为此,这里特梳理下自己 2021 年的学习计划,形成知识索引,方面后续知识快速定位,也希望能给予他人一点点帮助。

    • 操作系统: 重点是Linux 进程管理 & 调度、进程间通信、内存管理、I/O 模型
    • 网络: TCP/IP 协议、HTTP 协议、DNS 协议、容器网络
    • 中间件: Redis, RabbitMQ/Kafka/RocketMQ, Nginx, Zookeeper/Etcd, ElasticSearch, MySQL
    • 设计原则 & 设计模式: SOLID, 24 种设计模式
    • 系统架构: Client/Server, MVC, Layer, Broker 等
    • 语言: Java/Go/Rust
    • 工具: 效率提升类, 问题定位分析类, 知识变现类
    • 其他: Google Analysis, 百度统计、SEO 相关

    阅读全文 »

    什么是文件系统?

    • 文件系统是什么?
    • 文件系统组成
    • 如何写一个简单的文件系统

    文件系统是什么?

    • 软件
    • 记录文件元信息(文件大小,所属用户,包含块等)

    文件系统组成

    inode

    inode 记录着文件的元信息,包含以下部分:

    • 文件大小
    • 组件文件的块(block)
    • 属主(owner)
    • 访问权限
    • 访问时间
    • 创建时间
    • 修改时间

    inode table

    为了管理 inode 信息,需要有个数据数据结构存储 inode 信息, 称之为 inode table, 会占一部分磁盘空间,若 inode 大小为 256 bytes, 一个 4k 大小的 block 可存储 16 个 inodes。

    allocation list

    为了管理 block 是否已分配,需要有个数据结构存储,通常可以用位图(bitmap) 算法进行存储, 用 1bit 表示该 block 是否已使用,一个 4k 大小的 block 可存储 32k 个 block 使用情况。

    superblock

    superblock 用于存储文件系统元信息,包括 inodes 数量、文件系统中数据块(data block)数量、inode table 起始块位置、用于标识文件系统类型的魔数(magic number)等。操作系统挂载文件系统时,会首先读取 superblock 信息。

    参考资料

    1. File System Implementation
    2. Writing your own file system is easier than you think
    3. Understanding Linux filesystems: ext4 and beyond

    阅读全文 »

    Java jar 是如何执行的?

    Java 作为一门古老又流行的编程语言,想必大家或多或少都听过,甚至使用过,也有一部分人甚至在生产环境部署过 java 应用。可你了解过 java 程序是如何加载运行的吗?如果你的答案是 yes, 那么建议不用浪费时间花费在已知的知识点了。

    下面主要针对 java 可执行 jar(还有有库类型的jar 包,eg: rt.jar) 分析 jar 的加载运行过程,主要包含以下三部分展开:

    • Java jar 生成
    • Java jar 内容
    • Java jar 加载 & 运行

    阅读全文 »

    IP 归属地查询

    这里分享下几个不错的 ip 地址库:

    1. https://ip.cn

    查询指定 IP

    curl https://ip.cn?ip=202.200.112.2
    

    查询本机 IP

    curl https://ip.cn
    

    优势: 国内服务,速度较快, 且免费

    劣势: 信息量太少, 没有经纬度信息

    阅读全文 »

    Go 二进制应用注入 version 信息

    当线上服务出现问题时,在排查问题前,我们需要确定线上服务部署版本、对应源码分支、最近一次提交记录、编译/打包时间、语言版本等,这些信息可写入配置文件,应用启动时读取。若采用 docker 部署时,也可将这些信息作为 LABEL 或应用镜像的 tag 中,方式多种多样,今天要介绍的是 go 应用下的另一个可选方式: 二进制编译时注入。

    阅读全文 »

    Ubuntu14.04上搭建ShadowSocks服务

    1. VPS选择

    之前一直使用GoAgent作为破墙工具,不过后来有一阵用不成,即使更新到最新版,也未能如愿,后来忙于写论文,便用微软的Bing临时代替Google。用了一阵Bing,发现其实也挺好用,无论是UI还是搜索内容,都相当不错。只是偶尔想呼吸墙外空气,却未能如愿,始终给人不快的感觉。所以便有意选择付费服务。一直听说ShadowSocks搭建代理特别稳定,便开始留意VPS。可选的VPS很多,比较流行的当属Linode和Digital Ocean,不过Linode服务实在是太贵了,且最低配都感觉有点大材小用,没必要这么奢侈。便着重关注了下DO。可选的VPS有:

    阅读全文 »

    Ubuntu安装TexStudio

    自从去年简历采用LaTex制作后,便逐渐对它有了好感.不过当时用的是Windows环境,直接采用Windows下的套装CTex进行简历的编辑与PDF的生成,编辑器采用的Texworks,且简历的模板还是网上宕下来并小作修改.虽然成功地生成简历,不过源码里面的不少细节还是一知半解.后来换到Ubuntu环境,又成功安装Linux下的LaTex编译环境Texlive,不过Texlive提供的只是编译环境而已,需要自己找寻称手的编辑器采用tex语法编辑好文档后并保存成.tex格式文件,然后采用texlive的编译幻镜进行编译.由于自己是Vim党,所以从一开始便试图采用Vim进行tex文档编辑,试了好几个Vim下的LaTex插件,都未能称心.我的需求大致如下:

    阅读全文 »

    将博客从Octopress迁移到Jekyll

    使用Octopress已将近两年,主题换了两三个,也能达到随时随地写博客的基本需求,只是总感觉少了点什么,让人不太自在.最近我想我找到原因了,那便是不够简洁,不够稳定,操作不够方便,同时太过臃肿.当换到新环境后,可能会由于新环境所装Ruby版本或rake版本与clone下来的环境不匹配,出现一些令人意想不到的问题.其臃肿的程度更不必细说,从Octopress作者Brandom Mathis一席话中便能知晓:

    Octopress is released as a single product, but it is a collection of plugins and configurations which are hard to disentangle. if you want to change or remove anything you are leaving the “golden path” and updates will be painful, if not impossible — short of copy and paste. Even I can not remove things from Octopress.

    阅读全文 »

    为什么而活?

    这些天经常为毕设及论文的事发愁,也因此变得浮躁不安起来,失了方寸,失了往日的沉着心态。整个人犹如悬在空中,飘飘然,毫无状态可言,如行尸走肉般活着。而每到夜深,躺在床上,头脑却越发清晰,不自觉地开始思考人生。心中时不时有一个声音在问自己:为什么活着

    如果在上小学以前,意义可能在于吃各种零食和玩各种新奇玩具;小学阶段,则希望身边有一堆玩伴,下课之余疯狂玩耍;初中阶段,则追求着时髦的穿着与发型及情窦初开的懵懂爱情;高中阶段,则处于挣扎彷徨之中,希望早日脱离被各种公式、概念与单词淹没的苦海,期待早日迎来老师口中描述的神圣而神秘的大学的那种自由生活。初入大学后,确实发现原来生活可以如此自由,不想上课就在宿舍闷头睡大觉,可以睡觉睡到自然醒而不用每天天不亮就起来背英语单词和文言文,不再有做不完的作业考不完的试,不再有班主任猥琐的监视,不再有想玩而不得的情景…

    阅读全文 »

    自由软件与开源软件

    图为电影《The Shawshank Redemption》的海报

    昨晚与张老师还有几位Linux小组成员一起去西邮参加了一个开源者行的活动,演讲嘉宾有GitCafe和Thoughtworks的人员。其实这次去只是想感受感受开源的气氛,一直听说西邮的开源气氛不错,未能亲身感受,所以趁还在西安,赶紧体会体会。这次最大的收获当属对开源文化的重新认识,也重新理解了free software与open source software的异同。

    首先,free software的最初版本由Richard Stallman起草,并通过Free Software Foundation发布,其初衷是确保最终用户能够自由使用、学习、分享和修改软件。要理解free software的概念,得先理解其中”free”里的含义,这里的”free”并不是”free of charge”中的含义,而是”free speech”中”free”表示的意思。

    通常所说的free software包含以下四种自由:

    阅读全文 »

    自我解剖

    文字的力量着实强大,但对我这个不善言语的人来说,使用起来略困难,难以透过文字准确阐释心中所思所想及所憧憬的未来生活。所以在写之前,便仔细筛选了上面这张图片,大概反应了我对于未来几十年后垂垂老矣的自己所憧憬的生活吧,因为垂钓在我童年生活中占据了不可估量的分量,至今仍难以忘怀,也是我生命中难得主动喜欢的一项兴趣爱好了。突然想到了海子的《面朝大海,春乱花开》:

    从明天起,做一个幸福的人
    喂马、劈柴,周游世界
    从明天起,关心粮食和蔬菜
    我有一所房子,面朝大海,春暖花开
    从明天起,和每一个亲人通信
    告诉他们我的幸福
    那幸福的闪电告诉我的
    我将告诉每一个人
    给每一条河每一座山取一个温暖的名字
    陌生人,我也为你祝福
    愿你有一个灿烂的前程
    愿你有情人终成眷属
    愿你在尘世获得幸福
    我只愿面朝大海,春暖花开

    阅读全文 »

    有关Markdown的两款工具介绍

    自从接触markdown这款简洁到不能再简洁的语法以来,我已经深深地喜欢上它,并在各种场合尝试使用它,比如说现在的博客、Evernote笔记、演示文档等。而今又发现一款新工具,采用markdown语法写邮件,现在几乎任何码字场合都能见到markdown的身影。

    我一直将自己归为工具控一类,作为一名程序员,编码水平三流,码字水平不入流,但确是重度工具控。每次都会为发现有趣华丽的工具而兴奋,不把玩一番便不快。言归正传,markdown真有那么好么?让人迷恋的地方在哪?

    当你向朋友推荐时,可能这是经常会被问到的问题,而且会问:word/wps已经很强大,为什么还要选择markdown?难道它比word更厉害?…

    下面我谈谈自己对markdown的认识及我为何选择markdown的原因。

    阅读全文 »

    Unix C的文件指针与文件描述符

    AISC C中通常用文件指针FILE *进行文件的操作,如fopen, fclose, fread, fwrite, fscanf, fprintf等函数,都是通过文件指针进行文件的一系列操作;而类Unix系统则大多用文件描述符(file descriptor)进行文件的操作,如open, close, read, write等函数,文件描述符是一个整数,是文件描述符表(file descriptor table)中的索引(文件描述符表其实是维护进程打开的文件)。当进程打开或者创建一个文件,内核便会在此进程对应的文件描述符表中分配一个位置,然后便可通过文件描述符操作文件。

    阅读全文 »

    Ruby环境的搭建

    Ruby简介

    第一次听到Ruby这个名词,可能会比较陌生,进而产生畏惧,毕竟在中国这片区域普及率还不是很高,但在世界范围内还是有不错的影响力,如果有所质疑,可以参考TIOBE上Ruby的排名情况,进几年一直在前10左右徘徊。到目前为止,大家可能只了解到Ruby是一门编程语言,具体还未做了解,那这里引用Ruby官网的解释,供大家参考:

    Ruby is a dynamic, open source programming language with a focus on simplicity and productivity. It has an elegant syntax that is natural to read and easy to write.

    用再多的语言描述都略显苍白,只有身临其中把玩一番才能有所体会,而且这种感触才最直观,最有说服力。这里,贴出一个网址,便可在浏览器中体验Ruby之美:

    http://tryruby.org/levels/1/challenges/0

    请感受它的魅力所在吧。

    阅读全文 »

    有关实习的一些感受

    前几天看了一篇文章,现在依然清晰的记得其中大意:

    人一生其实很短暂,只有30000天左右可供挥霍,所以请认真地对待每一天,抓紧时间做自己想做的事,不要给今后留有遗憾。

    细细思索一番,我的人生已过1/3,而其中的大部分时间却没有主动选择自己想过的生活,没有走自己想走的路,顿时心生悲哀,失落之情不禁涌上心头。二十五载的不断尝试、不断摸索,终于找准了自己人生的方向,已是万幸,接下来便是坚定不移的走下去了。也许随着年龄的增长,眼界心界不断改变,方向也会随之变化,这我无法左右,未来的事谁能说的准。唯一能做的就是坚定不移的走当前已确立的路,同时记录自己人生的历程,以此慰藉当前的心,同时也算是给未来的自己留一扇观察当前自己的窗。

    一月之余不写博客了,感觉无从写起。生活太过平淡,太过安逸,以致没有什么可值得念叨值得回味的故事,唯一记忆较深的当属实习之事了。自从12年上半年接触Ruby以来,一直断断续续的学习,时而放下,时而拾起。就在上上周(4.25号左右),无意在RubyChina上看到一则西安Ruby&Rails实习生招聘的信息,而且对实习生的技能要求我也符合,便给他们回邮件并附上自己简历,过了不到一天便给我回复让我去聊聊。听到“聊聊”这词,以为只是搞技术的人之间相互交流,不需要再带纸质简历什么的。结果刚到之后,公司前台人员直接来一句:“你带了简历么?”,我顿时伤了,心想电子简历都给你们发了,不一样么,还带什么纸质简历,经过这次算是长知识了。由于是小公司,老板是搞技术的,所以直接和老板聊的。聊完之后便让填个人基本信息,在填的过程中发现来了Rubyists圈子的一位朋友也来应聘,而且也是Rails,我俩的不同就是我是实习,他是正式。只想说西安Rubyists圈子很小,我了解认识的Thoughtworks大概占了70%以上,剩下的就是当作业余爱好来学习的,比如我。

    阅读全文 »

    随时随地用Octopress写博客

    Octopress所依赖的环境是Ruby和Git,所以要使用它写博客,必须先确保目标机器上已经安装Ruby和Git。有时候可能需要在新的环境中创作,那么得进行以下的一些操作了。在讲操作前先简要介绍下Octopress如何工作。

    Octopress是怎么工作的?

    Octopress默认有两个分支,即master和source。source分支主要存储用于生成博客的源文件,而master分支则主要包含生成后的博客。master分支存储在_deploy文件夹中,之所以以下划线命名,是因为在执行git push origin source时,下划线开头的文件夹会被忽略掉。

    当然,也可以创建自己的分支,但master分支一般主要用于存储生成后的博客,而博客源文件则可以自己新建分支存储。我目前在原有的基础上新建了newtheme分支,用于更改主题后的博客源码存储,以前的源码存储在source分支。

    创建本地Octopress库

    在新环境中写作时,需要进行以下几个步骤:

    阅读全文 »

    Git远程分支的一些操作

    我是个爱折腾的人,昨天晚上突然看着自己的博客主题不爽,便立马将其从原先的Greyshade换到现在的Cleanpress。换完并构思一篇新博客之后,再次提交到GitHub上,得到提示此分支滞后于GitHub上,采用git pull又产生了太多冲突,冲突少手动解决还可,太多更改起来太麻烦,便萌生推掉远程分支重新提交的念头。可之前从未对远程分支做过相关的操作,只是偶尔删除远程库上的单个文件而已,又不得不求助Google了。碰到问题在解决过程中总是会学到很多,并且记忆深刻,现予以记录,方便自己,也回馈社会。

    删除之前先查看远程分支,在确定的情况下再作删除,以致不会删错。

    查看远程分支

    采用git branch -a可查看所有的分支(本地+远程),而git branch -r仅显示远程。如果打开颜色支持,还会看到远程分支的颜色与本地不同。

    阅读全文 »

    有关安卓刷机的一些感受

    生命的乐趣在于体验各种新奇,每次尝试都会从中收获兴奋和快乐,同时也会有小小的成就感。但伴随这些快乐的往往是挫折,所以偷偷乐的同时也要正确看待这些不愉快的成分,其实他们就是生活的调味品,在充斥欢乐的时候来点不和谐的东西往往让人记忆深刻,生活需要刺激。

    平时一直都处于神游迷离的状态,突然脑中会闪过一丝新奇想法。这不前几天玩三国杀玩到吐的时候,突然闪过刷机的念头,于是在晚上将近12点的时刻,开始了刷机之旅。网上有关各种机型的刷机教程早已铺天盖地,随处可见,也有刷机过程时出现的各种问题。我也将加入这一行列,成为其中一员。

    阅读全文 »

    C语言中的Segment fault问题

    什么是Segment fault?

    a segmentation fault (often shortened to segfault) or access violation is a fault raised by hardware with memory protection, notifying an operating system (OS) about a memory access violation; on x86 computers this is a form of general protection fault.

    以上为Wikipedia对段错误的解释。用通俗易懂的话来说就是访问越界,访问了不存在或者受操作系统保护的内存,通常都是由于数组越界或者指针引起。

    产生段错误的原因

    1. dereferencing NULL
    2. dereferencing an uninitialized pointer
    3. deferencing a pointer that has been freed/out of scope
    4. writing off the end of an array
    5. recursive function that uses all of the stack space

    阅读全文 »

    2014西安归途随笔

    从1月20号到现在已有20多天了,说长不长,说短不短。回家的这段日子里很惬意,每天睡觉睡到自然醒,吃就更不用说了,无论在哪都不及家里吃的放心舒心,至于住么,家里自然比学校宿舍舒服多了。唯一美中不足的就是缺乏学习的氛围,不管多闲,都没心思整理开题报告,学习便更不用说了。一开始将其归结于家里没网,不过仔细琢磨下还是学习的气氛不够,导致自己变得懒惰。幸好在家呆的时间不是很长,不然真的要懒得无以复加。

    本来回去之前便已将回程票买好了,买的2.16的,从武昌走。原计划是提前去武汉玩两天再走,毕竟武汉哥们好几个,随意蹭个吃住不成问题。哪知导师开始催(其实也谈不上催,就QQ上发了一个他专署的?而已,顿时感觉情况不妙,赶紧问问教研室的同学,没想到同级的都去了好几个,而且老师前几天给他们说了句:研究生应该过完初十就来的,这。。。不敢久留,立马抢了张12号的票),便匆匆踏上了回西安的旅途。

    阅读全文 »