H2 Database Engine

H2 is a Java SQL database, with following features:

  • fast, open source, JDBC API
  • Embedded and server modes; in-memory databases
  • Browser based console application
  • small footprint: around 1.5MB jar file size

连接方式

H2 数据库支持三种连接方式,三种模式都支持内存、持久化到文件,三种模式对同时开启的数据库数量和连接数没有限制。

嵌入式模式

本地 JDBC 连接,最方便的一种,嵌入式下,JVM 启动 H2 数据库通过 JDBC 连接。

服务器模式

通过 JDBC 或者 ODBC API 远程连接数据库,可以部署在不同的 JVM 或者不同的物理机中。数据通过 TCP/IP 协议传输,比嵌入式慢。

混合模式

第一个应用通过嵌入式打开 H2 数据库,同时数据库开启服务器模式,其他应用可以远程连接。

连接字符串

driver=org.h2.Driver
url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1
username=sa
password=

使用

控制台启动

java -jar h2*.jar

在 Spring 应用中 maven 配置

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.x.xxx</version>
</dependency>

连接配置

driver=org.h2.Driver
url=jdbc:h2:mem:testdb;MODE=MYSQL;DB_CLOSE_DELAY=-1
username=sa
password=

reference


2014-07-28 h2 , database , in-memory-database , jdbc

国内各大音乐网站使用感受

最近几天在电脑上听歌,不由自主的在键盘上敲出了 http://music.163.com , 而在不久之前还是用 xiami.com 听歌呢,所以禁不住思考起来.

最初

最早用电脑听歌还是应该用的酷狗,酷我,多米之类的电脑端软件,那个时候经常是将歌曲下载到自己电脑上,伴随着清脆的一声”Hello kugou”,才开始听歌之旅的. 那个时候听的歌曲还往往是知道名字,知道歌手,很有针对性的去听的.那个时候的播放列表还往往是本地的自己的列表,如果换一台电脑那些列表还不一定能够同步过去.虽然后来酷狗,酷我都做了同步播放列表的功能,但是那时候的体验和感受都留在了那个时候.

后来

在大学的时候,渐渐的发现自己的播放曲库就那么几首歌,全部循环播放还是那么几首歌,所以萌生了寻找自己喜欢听的歌曲的想法,如果能有一个平台能够提供不间断播放的歌曲,能根据自己喜欢的歌曲推荐同样类似的歌曲,后来我找到了 douban.fm 这样一个平台,虽然我不知道豆瓣这个电台什么时候发布的,但它确实伴我走了多一段时间,也让我找到了很多喜欢的歌曲,我记得那时候听得最多的轻音乐电台,让我找到”班得瑞”这一系列的轻音乐.

再后来

可是用了一段时间的豆瓣 FM 就会发现出现了些问题,一是豆瓣 FM 不允许下载歌曲,虽然我的加心歌曲很多了,却一首也不允许我离线的播放.一旦离开了互联网,我就往往又回到了那几首歌的时候.这个时候如果在豆瓣 FM 找到了喜欢的歌再用酷狗,酷我,多米,百度之类的下载,也略显麻烦,况且如果喜欢的歌曲多了,还得一首一首的找并下载,这个过程太麻烦.二是我渐渐的发现有些我喜欢的歌从来不会在豆瓣 FM 中出现,并且豆瓣 FM 还经常出现某些人翻唱的歌曲.那个时候我就意识到是不是豆瓣 FM 的曲库并不是很完整,如果它本身的曲库就不是很完整,如何能推荐到那些缺失的好歌?

转到虾米

再后来就是转到了虾米,虽然知道虾米的曲库也并不是很全,但是至少感觉比豆瓣的要全一些,并且虾米至少还是一直是做音乐的嘛. 豆瓣转到虾米之后很长一段时间都是在用虾米电台在听歌,当然一些听歌习惯也留在了虾米.但后来移动大潮来临,那个时候虾米 Android 客户端还一直不错,至少在酷狗,酷我,百度等等客户端中还是值得一看和一用的.可是那个时候虾米的封闭就体现出来了.虾米因为下载需要类似积分的东西,所以在 Android 客户端中下载的音乐只有通过虾米客户端才能播放,虾米并不是直接以 mp3 保存的歌曲.那个时候还是并不是很在意这个问题,可是突然有一天我意识到,如果有一天虾米”倒闭”或者怎么样了呢?(⊙o⊙)… 那个时候开始我渐渐的将一些喜欢的歌曲下载到本地,那些歌曲列表也不怎么去贡献,只维护着自己喜欢的歌曲列表. 然后渐渐地将自己的听歌之路转到本地,那个时候还曾经找好用的PC 音乐管理软件很长一段时间.

转到网易云音乐

可是突然有一天网易发布了它自己的音乐播放网站和 Android 客户端,不愧是网易不鸣则已一鸣惊人,网易云音乐发布的时候就称自己跨平台,当然后来才慢慢发布了 PC 端和 Mac 端的软件,但是那个时候的 Android 应用一发布,我眼前就一亮,继承了网易新闻的操控性,美观性,并且功能强大.并且当时网易云音乐一发布曲库就很全面,我也不知道网易从哪里搞了这么多版权,总是他就是做到了. 于是开始试用最初还是觉得网易云音乐用来下载音乐很方便,成了 Android 手机上的音乐下载器,可是后来真的用了起来.有一天,我发现能导入虾米歌曲列表,能导入豆瓣 FM 加心歌曲,果断全部导入,自此以后虾米都很少打开了.

于是就出现了文章最前面出现的一幕.到现在总结下虾米和网易,虾米有一些小细节我很喜欢,但是已经不能抵挡我使用网易的大势了.不过那些小细节总结一下总还是可以提醒一下网易:

  1. 虾米能够记录所有听歌的记录,无论是哪里使用虾米,WEB 页面试听还是,在电台听的,还是在 Android 客户端听得,所有的记录都能在历史记录中看到.并且有一点和 Last.fm 相似的就是能统计出哪些歌手的歌播放了多少次,哪些歌曲播放了多少次,对于我这种没有特别钟爱谁的听众很有帮助,自动统计出了对谁谁谁的歌特别偏爱.
  2. 虾米电台是我觉得做得最好的电台了.各种各样的电台都有,如果喜欢一个歌星可以只听这个歌星的歌曲,而如果最近只喜欢轻音乐,可以只听轻音乐.
  3. 虾米能够将音乐生成嵌入式代码,在网页上共享,这点网易没有.像下面这样,

</embed>

总结

经过这一些系列的回忆,对于一个互联网产品,我总结出几点:

WEB 化

在网络渐渐发展到可以流畅在 WEB 页面听歌的时候,类似酷狗,酷我这样的播放软件便会走下坡路.虽然我不知道酷狗,酷我之类现在活得是否还好,但至少让我这样的用户离开了.如果能够在网页上直接能够听歌,为何还要下个客户端呢?WEB 是互联网的大潮.如果没有抓住这个大潮,可能就要吃亏了吧.虽然现在好像酷狗和酷我都已经可以在线播放了,可是我也已经不用了.没有什么特别理由,就是不好了吧.再其次酷狗,酷我根本没有我的播放习惯,随意就可以抛弃,换另外一个平台.这也就是我要谈的第二点—-账号系统.

账号系统

所有的音乐库应该跟随者用户,用户登陆账号即可获取到所有的歌曲库.这一点网易就很聪明,在网易刚刚发布 PC 客户端的时候,如果用户不登陆就不能使用.用户可以收藏喜欢的歌曲,新建歌曲列表,分享歌曲列表,这样网易就能学习用户的习惯,推送更多用户喜欢的歌曲.

跨平台

跨平台其实和第二点账号系统一样,账号应该跟随着用户走,对于一个产品应该是用户走到哪里,只要有个账户就能够轻易的获取到用户的所有资料,爱好,习惯.那当然,我用微软的 Windows 还好,还是用 Google 的 Android,还是 Apple 的 Mac,只要有用户在就要提供给用户获取自己产品的入口,当然网易 WEB 播放器是我见过的最好的.无论是从设计还是到操作性,都给人很亲切的感受.

UGC 用户贡献内容

当然虾米和网易都可以由用户生成音乐列表,而最近看到新闻说豆瓣 FM 也支持用户贡献音乐列表了.UGC 是 WEB2.0 的特征,虾米雇再多的虾小编生成的内容也不会有用户多.所以干脆直接把内容编辑交给用户得了.当然现在发现好歌的途径又多了一点,不仅可以听自己喜欢的电台,还能关注兴趣相投的好友,看他分享的音乐列表.这些列表里是用户整理好的好听歌曲,去循环播放去啦.

当然如果你没有使用过网易云音乐,那么就请你试试吧:http://music.163.com/,如果你觉得我的歌曲品味和你的相似,也同样欢迎你提供更好的音乐.


2014-07-20 music , knowledge , music-library , music-management , music-platform

适用于编程 Coding 的字体

之前的一篇文章就曾经提到字体的历史,这篇文章着重在推荐几款我个人认为非常适合编程这个环境的字体。

在选择一款字体之前,先要了解几个术语

  • monospace font 等宽字体,每一个字符宽度占用都是一样的
  • Sans-serif font 无衬线字体
  • Serif font 衬线字体
  • font weight 字重,字体的粗细程度,常见的字重有 Light, Regular, Medium, Bold 等等

在选择一款编程字体的时候我会考虑以下几个点:

  • 能否区分,数字 0 以及大小写 oO
  • 能否区分,数字 1 以及大写字母 I 以及小写字母 l
  • 个人喜欢等宽的字体,并且可以兼容终端,IDE 和各种操作系统

综合上面的考虑,我个人使用 Fira Code 作为终端,IntelliJ IDEA,VSCode 的编程字体已经很多年了。

另外 JetBrains 推出的 JetBrains Mono 字体也是一个不错的选择。

推荐一个盲测字体对比的网站

通过两两对比,最后选出你最喜欢的编程字体。

Azeret Mono

通过上面的对比,最后选择出来的我个人喜欢的字体。

Source Code Pro

Source Code Pro 是由 Adobe 公司设计的开源字体,使用很长一段时间的字体,中规中矩,字体很容易识别,非常适合日常编码使用。

source code pro

Noto Sans

Noto 字体是 Google 开发的一款开源字体,使用场景非常广泛的一个字体,当然用来做 Coding 也不是不行,不过也一样,比较中规中矩。

noto sans

Ubuntu Mono

又一个等宽字体,在 Ubuntu 上看久了 Ubuntu Mono ,真实对比一下其他字体之后发现 Ubuntu Mono 字体胖胖的,所以字间距看起来很舒服。

Inconsolata

DescriptionInconsolata is an open-source font created by Raph Levien and released under the SIL Open Font License. It is a humanist monospaced font designed for source code listing, terminal emulators, and similar uses.

inconsolata

Fira Code

个人使用的编程字体 Fira Code,用了很多年了。

为 Programming 设计的等宽字体。该字体为 Programming 做了非常多的特殊设计,比如大于等于,不等于等等。

这款字体区别与其他字体的另一个典型特点就是 @, &r 的区别。

fira code font

Nerd Fonts

Hasklig

Fantasque Sans Mono

更多编程字体预览:

  • https://coding-fonts.netlify.app/
  • https://www.programmingfonts.org/#pt
  • https://github.com/subframe7536/Maple-font
  • https://rubjo.github.io/victor-mono/
  • https://github.com/TakWolf/fusion-pixel-font
  • https://www.ibm.com/plex/
  • https://github.com/be5invis/Sarasa-Gothic

reference


2014-06-20 fonts , font , coding , programming , style

优化 SQL 语句

CHAR vs VARCHAR

在设计数据库字段时经常需要保存字符,MySQL 中有两个容易混淆的字段 CHAR 和 VARCHAR。

  • VARCHAR 是可变长度,仅使用必要的空间,需要额外使用 1 个或者 2 个字节来记录字符串长度,最大长度小于等于 255 字节,只需要额外使用一个字节,否则需要 2 个字节
  • CHAR 是固定长度,MySQL 在存储 CAHR 时会删除所有末尾空格,适合存储很短的字符串,或者所有值都接近同一个长度

VARCHAR(10) 需要 11 个字节存储空间,VARCHAR(1000) 列需要 1002 字节存储,2 个字节用来存储长度信息。

适用场景:

  • 字符串 COLUMN 的最大长度比平均长度大很多,列很少更新,不容易产生碎片
  • 如果预测到要保存的内容是固定长度,可以使用 CHAR,比如保存 MD5 值,保存性别代号等等;对于经常需要更新的数据 CHAR 也比 VARCHAR 更好,定长 CHAR 不容易产生碎片

与 CHAR 和 VARCHAR 类似的类型还有 BINARY 和 VARBINARY,存储的是二进制字符串。二进制字符串存储的是字节码而不是字符,填充也不一样,MySQL 填充 BINARY 采用的是 \0 零字节,而不是空格,检索时也不会去掉填充值。

当存储二进制,并且希望 MySQL 使用字节码而不是字符进行比较时,这些类型比较有用。MySQL 比较 BINARY 字符串时,每次按一个字节,并且根据该字节的数值比较。因此,二进制比较比字符比较简单很多,也就更快。

合并语句

把对同一个表的修改合并为一个 alter 语句,避免多次拷贝,提高改表效率

合并

altertable t1 addcolumn a int;
altertable t1 addcolumn b int;

合并后

altertable t1 addcolumn a int, add column b int;

更新语句

执行更新语句时尽量将同一张表的内容合并到一行。

UPDATE tablename SET column1 = "value1", column2 = "value2" ....

主键

自增主键设置为 unsigned 类型, MySQL 表只能有一个主键,但是可以有多个唯一键,可以尝试将自增 ID 作为主键,实际有意义的字段作为唯一键。

冗余索引

假如有 idx1(a,b) 和 idx2(a) 时,idx2 是没有必要的,当查询语句是 where a=xx 时会使用 idx1


2014-06-04 mysql , sql , optimize , slow-query , database

毕设相关

##Word目录自动生成 如果想要目录自动生成,就必须事先对文章标题进行格式化,我使用的方式是在大纲视图中对章节标题进行一级二级三级格式化。另外的方法是通过格式中标题去给每一个标题添加样式。网上的教程太多了,我就做一个备忘吧,以后说不定在其他论文中也要生成目录。在格式化标题之后,导航窗口基本上就能显示一个简单的目录了,此时再自动生成目录一般不会出现太大的问题。

##Word页眉页脚 有些页需要重新从1页开始编号,则要在该页之前插入分节符。如需生成第1页 共XX页这种格式的页码,最好不要手工输入总共的页码,因为可能需要修改论文内容,而如果手工修改可能最后不会自动更新,会造成很大的问题。最好是在文档部件->域->编号里面插入总页数。

##MP4转gif 项目因为在Android手机上,需要录制视频展示,Android(API level 19) 开发工具中提供了录制视频的方法:

adb shell screenrecord /sdcard/demo.mp4

在PC下连接手机,运行以上命令即可录制手机屏幕,视频格式为MP4,存放在手机SD卡,默认录制时间180s. 该命令还有其他一些参数,运行:

adb shell screenrecord --help

可以查看所有参数。几个可能会使用到的参数是:

  • --time-limit 10 录制时长
  • --size 1280*720 录制分辨率大小
  • --bit-rate 6000000 比特率

官方文档: http://developer.android.com/tools/help/adb.html#screenrecord 中文参考: http://blog.csdn.net/wirelessqa/article/details/22725581

录制完视频之后面临的一个问题是,怎么转成gif供PPT或者演示使用。最初想到的方法是使用Photoshop,也找到了一些方法能够将MP4视频转成Web使用gif,但是因为Photoshop将视频每一帧都保存,消耗内存太大,之后适当的调整了几次效果都不是很好,生成的文件也比较大。所以后来就直接使用了迅雷看看的gif生成了,不过缺点很明显,分辨率被调到很小,图像变得不清晰了。


2014-05-31 skills

每天学习一个命令:dd 读取转换输出数据

dd 命令可以复制文件并对原文件内容进行转换和格式处理。dd 命令经常被用来备份设备。

比如创建一个空文件:

dd if=/dev/zero of=test.txt bs=1M count=1

解释:

  • if 输入文件,不指定从 stdin
  • of 输出文件,不指定默认 stdout 作为默认输出
  • bs 字节为单位的块大小
  • count 表示被复制的块

几个设备:

  • /dev/null 向其输入任何内容都会被吞掉
  • /dev/zero 输入设备,用来初始化文件,提供无穷的 0.

使用实例

注意: 运行 dd 命令需要非常小心,如下命令如果不清楚其含义请千万不要轻易尝试。

测试硬盘读写速度

可以使用如下的命令来测试磁盘的读写速度:

dd if=/dev/zero bs=1024 count=1 of=/tmp/test.file
dd if=/dev/zero bs=1G count=1 of=/tmp/1Gb.file

说明:

  • if input file
  • of output file
  • bs block size 表示同时读入/输出的块大小
  • count number of blocks ,拷贝的块个数
  • oflag synchronization I/O for data

最后读写的文件大小是 bs 乘以 count 数。

备份整块磁盘

将整块磁盘 /dev/sda 备份到 /dev/sdb,注意 sdb 上的数据将会被覆盖!!!

dd if=/dev/sda of=/dev/sdb bs=4M

创建空文件

创建一个 512M 大小的空文件

dd if=/dev/zero of=/path/to/file count=1024 bs=500000

销毁磁盘数据

利用随机数据填充磁盘,用以销毁数据

dd if=/dev/urandom of=/dev/sda1

全盘数据备份与恢复

备份

dd if=/dev/sda of=/root/sda.img

恢复镜像到指定盘

dd if=/root/sda.img of=/dev/sda

使用 gzip 压缩备份

dd if=/dev/sda | gzip > /root/image.gz

将压缩文件恢复

gzip -dc /root/image.gz | dd of=/dev/sda

对比

dd bs=64k count=4k if=/dev/zero of=test
dd bs=64k count=4k if=/dev/zero of=test; sync
dd bs=64k count=4k if=/dev/zero of=test conv=fdatasync
dd bs=64k count=4k if=/dev/zero of=test oflag=dsync

dd 命令的区别在于写缓存的处理方式。

  • 第一条,不包括 sync,dd 命令完成之前并没有让系统把文件写入磁盘,只是把数据读入内存缓存中。dd 命令完成之后系统才会往磁盘写数据,所以这个速度不是真实速度
  • 第二条,使用独立的 sync 命令,但是在 sync 命令执行之前 dd 就已经把速度打印出来了,所以也不是真正的速度
  • 第三条命令使用 conv=fdatasync 执行之后,会执行一次同步操作
  • 第四条命令 oflag=dsync 在执行每次都会进行同步写入操作,这是最慢的一种很是,基本没有用到写缓存

2014-05-26 dd , linux , command

Jekyll 修改全纪录

对于本博客的 Jekyll 修改全纪录

Rakefile 修改

增加中文拼音支持 参考:

自动隐藏 Bootstrap 导航条

开源项目 Github

404 页面

参考:

http://yizeng.me/2013/05/26/create-a-custom-jekyll-404-page/


2014-05-25 jekyll , rankfile

使用 dnsmasq 转发 DNS 请求

什么是 dnsmasq,从官方页面,或者 Wikipedia 上能知道,dnsmasq 可以提供 DNS Forward, 也可以作为 DHCP, 它被设计在低功耗,小内存的路由器,防火墙等小型设备上使用。现在的大部分 Linux 发行版都内置了 dnsmasq 。 dnsmasq 也常常被用来缓存 DNS 请求,用来加速访问过的地址速度。

Install

Debian/Ubuntu:

sudo apt install dnsmasq

DNS

使用 dnsmasq 很大一部分应用场景就是缓存 DNS 解析,dnsmasq 首先会检查 /etc/hosts 等本地静态的 hosts 文件,然后使用 /etc/resolv.conf 配置的 DNS 服务器地址。

配置

通常 dnsmasq 的配置文件都在 /etc/dnsmasq.conf 文件中,该文件配置详细内容可以参考如下注释。

这里主要配置 dnsmasq 作为 DNS Cache 服务器来使用。

# 配置额外的上级 DNS 主机 (nameserver)
# 通常会在定义的文件中配置域名服务器地址 nameserver 127.0.0.53
# 如果访问没有被解析过的域名,那么就会尝试使用文件中定义的地址去解析
resolv-file=/etc/resolv.conf

# 默认情况下 dnsmasq 会发送查询到它的任何上游 Dns 服务器上,如果取消注释,则 dnsmasq 则会严格按照 /etc/resolv.conf 中定义的 Dns Server 顺序进行查询,直到成功为止
# strict-order

# 如果不想 dnsmasq 读取 /etc/resolv.conf 文件获得它的上级 servers。即不使用上级 Dns 主机配置文件 (/etc/resolv.conf 和 resolv-file)可以开启改选项
#no-resolv

# 不允许 dnsmasq 通过轮询 /etc/resolv.conf 或者其他文件来获取配置的改变,则取消注释。
#no-poll
# 向上游所有服务器查询
all-servers
# 启用转发循环检测
dns-loop-detect
# 重启后清空缓存
clear-on-reload
# 完整域名才向上游服务器查询,如果是主机名仅查找 hosts 文件
domain-needed

# 为特定的域名指定解析它专用的 nameserver。一般是内部 Dns name server
# server=/myserver.com/192.168.55.1

# 指定 dnsmasq 默认查询的上游服务器,此处以 Google Public Dns 为例。
server=8.8.8.8
server=8.8.4.4

# 比如把所有.cn 的域名全部通过 114.114.114.114 这台国内 Dns 服务器来解析
server=/cn/114.114.114.114
server=/taobao.com/114.114.114.114
server=/jd.com/114.114.114.114
server=/qq.com/114.114.114.114


# no-hosts, 默认情况下这是注释掉的,dnsmasq 会首先寻找本地的 hosts 文件,再去寻找缓存下来的域名,最后去上级 Dns 服务器中寻找;而 addn-hosts 可以使用额外的 hosts 文件。
# Dns 解析 hosts 时对应的 hosts 文件,对应 no-hosts
addn-hosts=/etc/hosts
# Dns 缓存大小,Dns 解析条数
cache-size=1024
# 不缓存未知域名缓存,默认情况下 dnsmasq 会缓存未知域名并直接返回客户端
no-negcache
# 指定 Dns 同时查询转发数量
Dns-forward-max=1000

# 增加一个域名,强制解析到所指定的地址上,强行指定 domain 的 IP 地址
address=/doubleclick.net/127.0.0.1
# 知道这个原理之后,比如说可以屏蔽广告,把地址解析到一个本地地址
address=/ad.youku.com/127.0.0.1
address=/ad.iqiyi.com/127.0.0.1


# 多个 IP 用逗号分隔,192.168.x.x 表示本机的 ip 地址,只有 127.0.0.1 的时候表示只有本机可以访问。
# 通过这个设置就可以实现同一局域网内的设备,通过把网络 Dns 设置为本机 IP 从而实现局域网范围内的 Dns 泛解析(注:无效 IP 有可能导至服务无法启动)
# 监听的服务器地址,通过该地址提供服务
listen-address=192.168.x.x,127.0.0.1

# 对于新添加的接口不进行绑定。仅 Linux 系统支持,其他系统等同于 bind-interfaces 选项。
# bind-dynamic

# hosts 中主机有多个 IP 地址,仅返回对应子网的 IP
localise-queries

# 如果反向查找的是私有地址例如  192.168.x.x,仅从 hosts 文件查找,不转发到上游服务器
bogus-priv

# 对于任何解析到该 IP 的域名,将响应 NXDOMAIN 使得其解析失效,可多次指定
# 禁止跳转运营商广告站点
#bogus-nxdomain=64.xx.xx.xx

# 如果你想在某个端口只提供 Dns 服务,则可以进行配置禁止 dhcp 服务
no-dhcp-interface=

配置完成后,可以使用如下语法来检查正确性

dnsmasq --test

如果没有问题会输出 dnsmasq: syntax check OK.

管理 dnsmasq 服务

在 Debian/Ubuntu 系电脑上可以使用:

sudo systemctl status dnsmasq.service
# or
sudo /etc/init.d/dnsmasq status

查询

使用 nslookup 或者 dig 来查询 Dns 解析结果。

比如向 Google 提供的 Dns 服务器请求查询 einverne.info 域名的解析结果:

➜ dig einverne.info @8.8.8.8

; <<>> DiG 9.11.3-1ubuntu1.9-Ubuntu <<>> einverne.info @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53970
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;einverne.info.                 IN      A

;; ANSWER SECTION:
einverne.info.          2398    IN      A       69.163.x.x

;; Query time: 4 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Sep 20 16:26:54 CST 2019
;; MSG SIZE  rcvd: 47

在 dig 的结果中可以看到一个 Query time, 连续查询某一个域名两次,可以观察该时间是否从之前的几十或者几百毫秒,变成 0 毫秒,由此来判断 dnsmasq 有没有生效。

或者直接 nslookup

➜ nslookup youtube.com
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   youtube.com
Address: 2.1.1.2

dnsmasq 解析流程

dnsmasq 会先去 hosts 文件中查看配置,然后再解析 /etc/dnsmasq.d/*.conf 下的 conf 配置,这些文件配置优先级高于 dnsmasq.conf。

DHCP

DHCP 配置

dnsmasq 配置文件 (/etc/dnsmasq.conf),必要的配置如下:

# 选定需要侦听的网口
# Only listen to routers' LAN NIC.  Doing so opens up tcp/udp port 53 to
# localhost and udp port 67 to world:
interface=<LAN-NIC>

# dnsmasq will open tcp/udp port 53 and udp port 67 to world to help with
# dynamic interfaces (assigning dynamic ips). dnsmasq will discard world
# requests to them, but the paranoid might like to close them and let the
# kernel handle them:
bind-interfaces

#设定可分配的 ip 地址段和租约时间
# Dynamic range of IPs to make available to LAN pc
dhcp-range=192.168.1.50,192.168.1.100,12h

#绑定某些机器的 ip-mac 地址对,使其具有固定的 ip 地址
# If you’d like to have dnsmasq assign static IPs, bind the LAN computer's
# NIC MAC address:
dhcp-host=aa:bb:cc:dd:ee:ff,192.168.1.50
dhcp-host=00:0e:7b:ca:1c:6e,daunbook,192.168.0.12
#为 192.168.0.12 设置主机名:dannbook

# dhcp 动态分配的地址范围
dhcp-range=192.168.2.100,192.168.2.240,24h

# 同上,不过给出了掩码
#dhcp-range=192.168.2.100,192.168.2.240,255.255.255.0,12h

# dhcp 服务的静态绑定
# dhcp-host=08:00:27:D1:CF:E2,192.168.8.201,infinite 无限租期
dhcp-host=08:00:27:D1:CF:E2,192.168.2.201,db2
dhcp-host=08:00:27:D6:F0:9F,192.168.2.202,db3

# 设置默认租期
# Set the limit on DHCP leases, the default is 150
#dhcp-lease-max=150

# 租约保存文件路径
#dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

# 通过 /etc/hosts 来分配对应的 hostname
#dhcp-host=judge

# 忽略下面 MAC 地址的 DHCP 请求
#dhcp-host=11:22:33:44:55:66,ignore

# dhcp 所在的 domain
domain=freeoa.net

# 设置默认路由出口
# dhcp-option 遵循 RFC 2132(Options and BOOTP Vendor Extensions), 可以通过 dnsmasq --help dhcp 来查看具体的配置
# 很多高级的配置,如 iSCSI 连接配置等同样可以由 RFC 2132 定义的 dhcp-option 中给出。
# option 3 为 default route
dhcp-option=3,192.168.8.1

# 设置 NTP Server. 这是使用 option name 而非选项名来进行设置
#dhcp-option=option:ntp-server,192.168.8.4,10.10.0.5

reference


2014-05-02 dns , dnsmasq , domain , network

Vim 中 buffer 操作及管理

通常情况下工作的内容都会是打开一个文件进行编辑,但是 Vim 的强大之处不仅在于单文件编辑,更重要的是可以对多文件编辑,这些文件可以存在不同的 Tab 中,不同的 Windows 中,甚至不同的 buffer 中,这一篇主要就是集中整理一下 buffer 相关的操作内容。

A buffer is an area of Vim’s memory used to hold text read from a file. In addition, an empty buffer with no associated file can be created to allow the entry of text. –vim.wikia

Vim 中的 Buffer 是打开的文件,这意味着 Buffer 可能并不是当前可见的,Buffers 是 Vim 打开,存在于内存某个地方。通常只有一个 Buffer 可见。可以使用 :ls 来查看当前打开的 Buffers.

Vim 中的 Windows 是一个 viewport onto a single buffer,可以通过 :spit 或者 :vsplit 来水平或者垂直打开文件。

Vim 中的 Tab 是 collection of one or more windows. 可以允许用户来组织 Windows.

Buffer 创建

通常情况下 vim file1 file2 便是将两个文件放到了 buffer 中。

  • :e /path/to/file 也可以打开文件到 buffer 中
  • :new:vnew
  • :badd {filename} 添加到缓冲区,光标保持在当前缓冲

buffer delete

移除缓冲区

:bd[elete]
:bunload
:bwipeout
:3,5bdelete
:bd file1

如果未保存会退出失败,强行退出

:bd!

删除缓冲区并不会影响缓冲区关联的文件,只是简单地把文件从内存中删除。

:bd2

:bd2 会将第二个 Buffer 从内存中移除。

buffer navigation

使用 Ctrl + ^ 可以来在最近的缓冲去中切换。这个快捷键非常有用,得记住。可以使用如下命令来列出所有缓冲区:

:ls, :buffers          " 列出所有缓冲区

在展示的列表中有一些 buffer 的状态:

  • - 非活动的缓冲区
  • a 光标所在缓冲区
  • h 隐藏缓冲区
  • % 当前的缓冲区
  • # 交换缓冲区, 可以使用 Ctrl + ^
  • = 只读缓冲区
  • + 已经更改的缓冲区

切换缓冲区:

:bn[ext]
:bp[revious]
:b {number, bufname}
:bfirst
:blast

说明:

  • :b <Tab> “ 循环滚动 buffer 中的文件

假如在后面对 vim 了解更多之后,安装了 fzf-vim 插件,那么也可以直接使用 :Buffers 来模糊查找当前打开的 Buffers.

buffer 替换

在打开的所有 buffer 中替换操作:

:bufdo %s/pattern/replace/ge | update

2014-05-01 vim , buffer , vim-buffer

每天学习一个命令:top 查看资源占用

top 命令能够实时显示系统中各个进程资源占用情况。可以用它来快速排查系统性能问题。

先行概念

  • 用户空间,常规进程所在空间,用户空间非特权区域,不能直接访问硬件设备
  • 内核空间,操作系统所在空间,能与设备控制器通讯,控制用户区域进程运行状态

使用举例

直接使用

默认进入 top 时,各进程是按照 CPU 的占用量来排序的:

top

解释:

  • 第一行,系统时间,已运行天数,登录用户数,1 分钟,5 分钟,15 分钟负载
  • 第二行,运行任务数
  • 第三行,CPU 运行状态
    • us 用户空间(user)占用 CPU 百分比
    • sy 内核空间(system)占用 CPU 百分比
    • ni (nice)改变过优先级的进程占用 CPU 百分比
    • id (idle)空闲 CPU 百分比
      • wa IO 等待(wait)占用 CPU 的百分比
    • hi 硬中断(Hardware interrupts)占用 CPU 的百分比
    • si 软中断(Software Interrupts)占用 CPU 的百分比
    • st (steal)
  • 第四行,内存使用
    • total 全部物理内存
    • free 空闲内存
    • used 已使用内存
    • buff/cache 缓存内存
  • 第五行,swap 交换分区信息
  • 第六行,空行
  • 第七行及以下,各进程的运行状态

第七行信息,包括:

  • PID
  • USER
  • PR 进程优先级
  • NI 负值表示高优先级
  • VIRT 进程使用的虚拟内存总量,单位 kb。VIRT=SWAP+RES
  • RES (resident memory usage)常驻内存,进程使用的、未被换出的物理内存大小,单位 kb。RES=CODE+DATA
  • SHR (shared memory) 共享内存大小,单位 kb
  • S 进程状态,D= 不可中断的睡眠状态;R= 运行;S= 睡眠;T= 跟踪 / 停止;Z= 僵尸进程
  • %CPU 上次更新到现在的 CPU 时间占用百分比
  • %MEM 进程使用的物理内存百分比
  • TIME+ 进程使用的 CPU 时间总计,单位 1/100 秒
  • COMMAND 进程名

查看每个 CPU 状态

在交互状态下按下 1 展开,查看每个 CPU 情况。

改变排序规则

按下 Shift + < 或者 > 来改变排序规则。

显示完整命令:

top -c

显示指定进程信息

top -p 12002

交互命令

  • h 显示帮助
  • c 切换名字与完整路径
  • m 切换内存显示方式
  • i 忽略闲置和僵死进程
  • r 重新设置进程优先级别
  • P CPU 使用百分比排序

macOS 区别

在 Linux 机器上使用 top 命令。常用的快键键是:

  • p 键 - 按 CPU 使用率排序
  • m 键 - 按内存使用量排序

这 2 个快捷键在 macOS 上都不一样。对应的是,先输入 o,然后输入 CPU 则按 CPU 使用量排序,输入 rsize 则按内存使用量排序。

如果记不清了,可以在 top 的界面上按 ?,在弹出的帮助界面中即可看到。


2014-04-27 top , linux , command , io , cpu , memory

电子书

本站提供服务

最近文章

  • 从 Buffer 消费图学习 CCPM 项目管理方法 CCPM(Critical Chain Project Management)中文叫做关键链项目管理方法,是 Eliyahu M. Goldratt 在其著作 Critical Chain 中踢出来的项目管理方法,它侧重于项目执行所需要的资源,通过识别和管理项目关键链的方法来有效的监控项目工期,以及提高项目交付率。
  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。