「C++」typeid 介绍

typeid 是 c++ 中的一个关键字,它和 sizeof 类似,它是一个运算符,能获取到 c++ 的类型信息。

typeid 能够对多态对象在运行时获取其真实的类型信息。

阅读全文

「VimTips」 快速执行 Normal 命令

在批量对一些行做一些简单修改时,使用 normal 命令会很方便。 例如可以通过 %normal A, 在文件所有行的末尾添加一个 , 字符。 但 normal 命令会频繁地触发 InsertEnterInsertLeave 等事件,一些插件例如 airline 会监控这些事件来执行某些操作, 这会导致 normal 命令执行特别慢,处理每一行时都会有一些卡顿。

本文会介绍如何屏蔽已安装插件的影响,能够快速地执行 normal 命令。

阅读全文

竞价广告排序策略

从毕业到现在一直都在从事广告行业,却从来没有写过广告相关的技术文章,也是挺不应该的。 今天就先写一篇来介绍下业内常用的竞价广告排序策略。

阅读全文

基于 Seafile 自建网盘

现在公司给配置了 iMac 和 Macbook,平时在公司时就用 iMac,在家的时候会用 Macbook,多个终端就涉及到一些数据的同步, 例如一些配置文件、写了一半的 PPT 等。最开始尝试过使用国内的微云等网盘来进行同步,但发现同步速度很慢, 而且经常出现一些莫名其妙的同步错误。后面用过一段时间的 Dropbox,但在家时使用的翻墙工具很不稳定, 经常出现无法连接 Dropbox 的问题,而且 Dropbox 的免费空间也很小,要是同步一些大文件就显的不够用。

因为在公司可以申请一些个人使用的开发容器,磁盘空间有 500GB 左右,就考虑可以自己搭建一个同步网盘, 这样就不会被限速,而且空间也只受硬盘大小的限制;唯一的缺点就是需要连上公司的 VPN 才能使用网盘, 但毕竟也会经常同步一些公司内部的资料,连 VPN 才能使用也是一种安全保险,避免一不小心就 “高压线了”。

阅读全文

博客中自动插入剪贴板图片链接

我是通过 Vim 写 Markdown 的方式来写博客,这种方式在需要插入剪贴板里的图片时不是很方便。 之前我是通过一些图床工具来实现剪贴板图片插入,但这里会存在两个问题:

  1. 图床链接有可能会失效,这样博客里的图片就变成了不可访问的状态;
  2. 在网络不好的时候,本地上传图片可能要很久,特别是我使用的是高分辨率的 imac,截图时图片大小会很大。

鉴于刚才提到的问题,我希望通过如下的方式来插入图片:

  1. 通过一个 Shell 工具来保存剪贴板里的截图到博客网站的某个子目录里,并输出对应的 Markdown 图片链接;
  2. 添加自定义的 Vim 命令来插入 Shell 工具输出的 Markdown 图片链接。

下面是 Shell 脚本代码,主要是基于 pngpaste 读取剪贴板里的图片,并按照 md5-timestamp.jpg 文件名保存到特定目录:

IMG_DIR="img/posts"
DEST_DIR="$HOME/Dropbox/blog/source/$IMG_DIR"

prepare() {
if ! which pngpaste &> /dev/zero; then
brew install pngpaste
fi
}

markdown_link() {
echo "![](/$IMG_DIR/$1)"
}

main() {
prepare
cd $DEST_DIR
local timestamp=$(date +%s)
local filename="${timestamp}.jpg"

pngpaste "$filename"

local finalname="$(md5sum $filename | awk '{print $1}')-${timestamp}.jpg"
mv "$filename" "$finalname"
local md_link=$(markdown_link "$finalname")
# echo "$md_link" | pbcopy
echo "$md_link"
}
main "$@"

把上面的 Shell 脚本保存为 blogimg 并添加可执行权限,然后在 vimrc 里加上如下的配置:

command! -nargs=0 InsertImg :r !blogimg

后面就可以通过执行 InsertImg 来直接插入剪贴板图片对应的链接:

阅读全文

使用 Vim 查看 Fiddler 生成的 saz 格式 session 包

Fiddler 是 Windows 下很流行的 Http 抓包工具,它可以把抓到的 Http 请求保存为 saz 格式。 在工作中调试后台服务时,同事经常会发过来一个 saz 格式的文件,但我是用的 macOS 系统, 而 Fiddler 没有 macOS 的版本,就没法直接查看 saz 格式文件。

后来通过 Google 发现 Fiddler 其实是一个 zip 包,Http 的请求和回包都保存在特定的文件里:

  • sessionid#_c.txt 客户端请求
  • sessionid#_s.txt 服务端回包

而最新版本的 Vim 是可以直接识别 zip 包并打开对应的文件的,这样我们就可以直接用 Vim 查看 saz 格式的文件了。 先在 vimrc 里加上如下的配置:

autocmd BufReadCmd *.saz call zip#Browse(expand("<amatch>"))

然后就可以直接用 Vim 打开 saz 文件了:

如果想要可以直接双击打开 saz 文件,可以安装 GUI 版本的 VimR

阅读全文

如何使用 Vim 编辑二进制文件

前段时间参加公司内部的一个技术比赛:实现一个打印自己 MD5 值的最小 elf64 格式二进制文件。 在这个过程中需要对二进制文件的某些字节进行修改、删除等编辑操作,本文介绍如果通过 Vim 来编辑二进制文件。

阅读全文

通过 Github V4 API 来了解 GraphQL

前几天看到一篇名为 现代后端开发者必备技能 的博客. 其中有一个条目提到了 GraphQL, 称它为 REST 2.0, 再加上之前偶然间看到最新版的 Github API 使用了 GraphQL, 便想了解一下它到底是个什么东东.

GraphQL 是 Graph Query Language 的简称, 在 Github 官方文档 中指出了 GraphQL 的几个特点:

  • A Specification 可以在 API Server 上定义 Schema, 客户端发起的 query 请求会基于 Schema 进行验证;
  • Strongly typed 强类型; 可以在 Schema 中指定某个 field 的类型, 以及不同对象之间的关系;
  • Introspective 客户端可以通过 query 获取详细的 Schema 定义;
  • Hierarchical API 调用是基于 query 中指定的层级关系及 fields 进行返回的, 不会返回不必要的冗余信息;
  • An application layer GraphQL 不是一种数据存储模型或者数据库查询语言, 它可以连接不同的数据存储源;

阅读全文

基于 Quorum 集群搭建讲解如何从 docker-compose 迁移到 Kubernetes

我们经常会遇到搭建多节点集群得需求, 例如摩根推出的基于以太坊的区块链 Quorum. 对于这种搭建多借点得需求, 我一般都是先通过 docker-compose 在本地实现多节点, 然后再基于 docker-compose 迁移到 Kubernetes .

这样做是因为基于 docker-compose 来实现要简单很多:

  • 调试很方便;
  • 多节点间通过 Volume Map 可以很容易地实现数据共享;

同时, 我们在实现 docker-compose 多节点阶段的很多工作, 如创建 Docker Image 及编写 entrypoint.sh 等, 都可以在往 Kubernetes 上迁移时被复用到. 基于 docker-compose 的多节点环境也能作为开发环境使用.

阅读全文

Shell 脚本里遇到的一些坑

最近在写 Shell 脚本的时候遇到了一些坑, 稍不留意就会踩到, 在这里和大家分享一下.

阅读全文