Emacs 常用基本操作
Emacs 作为 Programmer 熟知的两大 Editor 之一流行了很多年了,据说学习曲线陡峭,一直处于劝退状态。但作为喜欢折腾各种工具的自己来说,内心一直有跃跃欲试的想法,终于最近两个月得闲,开始研究学习上了。通过学习官网Tutorials 熟悉其基本操作 & 配置,同时 Google 了解 Emacs 使用频次最高的一些插件,在使用过程中不断优化配置,打造成自己趁手的工具。目前,我主要有三种使用场景: 1. 文本编辑 2. 代码阅读 3. 写业余代码。以下是我在学习过程中整理的常用基本操作,分享出来一方面是当作学习笔记输出,以便后续遗忘时快速查找,另一方面也希望能带给他人一些帮助。
目前的常用操作有:
- 单文件操作
- 光标移动
- 复制(copy) & 粘贴(paste)
- 插入(insert) & 删除(delete)
- 撤销(undo) & 重做(redo)
- 窗口操作
- 阅读代码常用操作
- 查看帮助文档
在使用 Emacs 时,有几个关键概念:
- Buffer
- Window
- Frame
- Mode
请自行查阅文档了解。
…注:
C-h表示按住 Ctrl 键的同时按 h 键;M-x表示按住 Alt/Meta 键的同时按 x 键;S-p f表示按住 Windows 键,再依次按 p f 键。
MySQL 数据库优化
MySQL 数据库优化可从以下方面着手:
- SQL 语句优化
- 索引优化
- 锁优化
- 缓存优化
- InnoDB 存储引擎优化
1. SQL 语句优化
- 检查 select 的 where 条件是否走索引,可用 explain 查看。
- 最小化全表扫描次数。
- 定期使用
ANALYZE TABLE以保持表的统计信息是最新的。
更多,请参考: https://dev.mysql.com/doc/refman/8.0/en/select-optimization.html
2. 索引优化
参考: https://dev.mysql.com/doc/refman/8.0/en/optimization-indexes.html
3. 锁优化
参考: https://dev.mysql.com/doc/refman/5.7/en/locking-issues.html
4. 缓存优化
参考: https://dev.mysql.com/doc/refman/5.7/en/buffering-caching.html
5. InnoDB 存储引擎优化
5.1 InnoDB 存储磁盘 I/O 优化
5.1.1 参数 innodb_buffer_pool_size
innodb_buffer_pool_size 一般调为系统内存的 50%~75%。
5.1.2 参数 innodb_flush_method
InnoDB 默认为 fsync,但在一些 GNU/Linux 或 Unix 发行版下,fsync 刷新缓存文件至磁盘非常慢,可将 innodb_flush_method 调整为 O_DSYNC。
5.1.3 参数 innodb-fsync-threshold
InnoDB 默认为 0,可调整 innodb 缓存阈值,避免单次大文件缓存刷盘。
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 信息。
…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
Read more ⟶
将博客从Octopress迁移到Jekyll
Read more ⟶