自带语法高亮的 cat – ccat

cat 源代码时如果带上语法高亮,会不会让工作效率更高一些呢?我们来做一个吧:

function ccat() {
    local style="monokai"
    if [ $# -eq 0 ]; then
        pygmentize -P style=$style -P tabsize=4 -f terminal256 -g
    else
        for NAME in $@; do
            pygmentize -P style=$style -P tabsize=4 -f terminal256 -g "$NAME"
        done
    fi
}

把上面代码片段放入你的 .bashrc 中,并且安装依赖:

sudo pip install pygments

就可以跟 cat 一样的用法查看文件内容了:

对比下老的 cat 效果:

是不是清爽多了?

有人在网上推荐个类似的工具,Go 语言写的 ccat,效果丑死了:

黑色背景下都看不清楚,这个一万多行的 Go 写的效果,比我们 10 行 bash 写的差远了啊。

补充:其他网友推荐的 sharkdp/bat 看了下效果也相当不错,但是你不想下载安装几兆的东西的话,上面十行代码就够了,熟练掌握 Bash,很多事情需要就自己撸,效果也还不错,自己动手丰衣足食,不用网上找,不用求人开发。

Loading

Posted in 随笔 | Tagged , | Leave a comment

KVM 虚拟化环境搭建 – ProxmoxVE

送大家一套完全开源免费的 VmWare / vSphere 的代替方案,代价是稍微动一下手,收获是你再也不需要任何商用付费的虚拟机软件了。KVM 整套解决方案一般分三层:

  • KVM:内核级别的虚拟化功能,主要模拟指令执行和 I/O
  • QEMU:提供用户操作界面,VNC/SPICE 等远程终端服务
  • Libvirtd:虚拟化服务,运行在 Hypervisor 上提供 TCP 接口用于操作虚拟机的创建和启停

第一个是 Linux 内核自带,后两个是各大发行版自带的标准组件。这里的 qemu 不是原生的 Fabrice 的 qemu,而是定制的 kvm 版本的 qemu 。

你当然可以用 qemu-system-x86 程序写很长的一串参数来启动你的虚拟机,但是这样十分不友好,所以有了 Libvirtd 这个东西,将物理机的所有资源:存储/网络/CPU 管理起来,并且提供统一的服务接口。

那么 KVM + Libvirtd 有几种不同层次的玩法:

  • 初级:在 /etc/libvirtd/qemu 下面用 xml 描述每一台虚拟机的配置,然后用 virsh 在命令行管理虚拟机,最后用 VNC/SPICE 按照配置好的端口链接过去,模拟终端操作。
  • 中级:使用各种 libvirtd 的前端,比如基于桌面 GUI 的 Virt Manager 给你界面上直接编辑和管理虚拟机,桌面版本的 VNC/SPICE 会自动弹出来,像 VmWare 一样操作。
  • 高级:使用基于 Web 的各种 virt manager 进行集群管理,比如轻量级的 WebVirtMgr / Kimchi,适合小白的 Proxmox VE。基本是用 WebVnc/Web
  • 超级:上重量级的 OpenStack,搭配自己基于 libvirt (libvirtd 的客户端库,比如有 python-libvirt 的封装)写的各种自动化脚本。

前两种太弱智了,OpenStack 又基本需要一个 DevOps 团队才玩得转。所以作为个人或者中小团队,买了台硬件过来,想把它变成一套小型的阿里云,腾讯云的系统,可以在 web 上创建/配置虚拟机,装系统,管理硬件资源,进行迁移备份等,基本就是第三套解决方案。

不想折腾的话,最简单的做法是直接下载 ProxmoxVE 社区版的 ISO ,刻录到 U 盘里,按照安装普通操作系统一样的安装到物理机上,立马把你的物理机变成一台 Hypervisor:

Proxmox VE 安装后启动,你可以登陆进去,ProxmoxVE 基于 Debian 9 ,进去可以用 apt-get 进行版本升级。接着按提示打开网页:https://your-ip:8006/ 用系统 root 密码登陆:

ProxmoxVE 可以方便的管理各种硬件资源(计算,存储,网络)和虚拟机系统,你可以方便的新建一台虚拟机并进行硬件配置:

Continue reading

Loading

Posted in 未分类 | Tagged | 1 Comment

Nano 编辑器可以做些什么?

终端下如果你不喜欢 Vim/Emacs 的话,Nano 是一个不错的选择,它是一个真正意义上的跨平台编辑器,基本上在所有 Linux 发行版上都默认自带 Nano,并且有 Windows 版本。

不少初学 Linux 都很喜欢用 Nano,但是我发现他们很多都是在裸用,既没配置,也一直在用一些比较低效的操作方法。

Q:下面的帮助占三行,很碍眼,能否隐藏?

可以在编辑时使用 ALT+x 就可以切换下面的帮助信息,或者在你的 ~/.nanorc 里面加一行:

set nohelp 

效果如下图:

恩,那两行恶心的帮助已经被我们去掉了,需要时还可以用 ALT+x 把它切换回来。

Q:如何打开语法高亮?

有的 Linux 发行版自带了 /etc/nanorc 文件,里面定义了语法高亮,而另外一些系统可能没有这个定义,你需要在 ~/.nanorc 中加一行:

include "/usr/share/nano/*.nanorc"

各种语言的语法文件一般位于:/usr/share/nano/ 下面,设置前先确认一下。

Q:怎么编辑 ~/.nanorc,常用设置有哪些?

常见的 nano 配置如下:(点击 more/continue 继续)

Continue reading

Loading

Posted in 随笔 | Tagged , | Leave a comment

WSL 服务自动启动的正确方法

2018 年 Windows 10 下的 WSL 已经可以保留后台进程了,从此后,用了十多年的 cygwin 基本失去了存在的价值了。网上有很多 WSL 自动启动服务的方法,但是都有些大大小小的问题,很多又是针对最老的 ubuntu16.04 发行版(输入 bash启动哪个),你如用商店里下载的最新的 WSL 版本 Debian9/Ubuntu18.04 就会出错。

所以正确在 WSL 里自动启动服务的方式有必要记录一下。

创建启动脚本:

进入任意 WSL 发行版中,创建并编辑文件:/etc/init.wsl

#! /bin/sh
/etc/init.d/cron $1
/etc/init.d/ssh $1
/etc/init.d/supervisor $1

里面调用了我们希望启动的三个服务的启动脚本,设置权限为可执行,所有者为 root,这时候可以通过:

sudo /etc/init.wsl [start|stop|restart]

来启停我们需要的服务,接着在 Windows 中,开始-运行,输入:

shell: startup

按照你 WSL 使用的 Linux 发行版创建启动脚本,比如我创建的 Debian.vbs 文件:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d debian -u root /etc/init.wsl start", vbhide

这个脚本就会在你登陆的时候自动在名字为 “debian” 的 wsl 发行版中执行 /etc/init.wsl 启动我们的服务了,如果你用的是 ubuntu18.04 的发行版,那么修改上面脚本里的 debian 为 ubuntu1804.vbs

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide

而如果你不知道自己的 WSL 发行版叫做什么名字,可以用 “wsl -l” 来查看。不管你用最初的 bash (ubuntu 16.04) 还是商店里下载的 debian/ubuntu1804 都能顺利启动服务了。

WSL 中有很多有用的服务,你可以按需删改 /etc/init.wsl ,但没必要塞很多东西进去影响你的启动速度,比如 mysql/mongodb 这些重度服务,可以需要的时候再启动,用完就停了。

我自己用的比较多的服务就三个:sshd(启动了以后支持终端软件登陆wsl,像远程服务器一样操作),supervisord(用于托管其他服务,比如 ssr),crond(crontab,自由定制定时任务),大部分时候,用上面三个足以。

Loading

Posted in 未分类 | Tagged | 2 Comments

为什么希特勒要反犹太人?

因为希特勒需要一个假想敌,这个假想敌一方面能给国内的飞涨的物价、大规模的失业、饥荒还有战争背锅。另一方面可以吓唬德国人民,让他们认为只有服从纳粹,才能对抗可怕的敌人。

所有这些战争都是在德国媒体疯狂的鼓动下进行的,尽管现实中的假想敌可能没做什么,却也会被媒体描述成歇斯底里的存在,他们马上就会到来,破坏你的土地家园,奴役你的妻儿。因此对付这个假想敌的重要性超越了:公共权力,社会福利,医疗,住房等一切现实问题。

所有事情都要为其开道,一切问题的对错都以是否有利于实现目标进行判断,一切德国法律也需为它做出修改,一切妨碍实现最高目标的人员都应即时调整,一切社会资源都应该向其集中,这样才能凝聚内部最大的力量抵抗外敌。

  • 希特勒让犹太人对德国国内所有社会弊病背锅。
  • kim家族猛烈的抨击美国和西方资本主义,认为他们应该为朝鲜所发生的一切负责
  • pakistan 军zf总是鼓动大家,同印度的异教徒做斗争。

以上

Loading

Posted in 随笔 | Tagged | Leave a comment

VimScript 五分钟入门(翻译)

译注:折腾 Vim 当然要能看懂和改写相关脚本,而中文资料匮乏,缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute Vimscript》,立足于让你用最短的时间掌握 VimScript 的基础和要点,你可以把它看成一份语言速查表。

Vim有着丰富的内建文档系统,使用 :h <关键词> 就可以阅读,如果你想在方便的尝试各种 vimscript ,你可以通过 NORMAL 模式下使用 gQ 命令进入 VimScript 的交互式环境调试命令。

注意:下面的例子中会包含一些形如 <符号> 的符号,意味着正式使用时应该被完全替换成真实的东西,包括左右两边的尖括号。而单独的 <> 在 VimScript 中被用作比较符号。

变量

  • let 命令用来对变量进行初始化或者赋值。
  • unlet 命令用来删除一个变量。
  • unlet! 命令同样可以用来删除变量,但是会忽略诸如变量不存在的错误提示。

默认情况下,如果一个变量在函数体以外初始化的,那么它的作用域是全局变量;而如果它是在函数体以内初始化的,那它的作用于是局部变量。同时你可以通过变量名称前加冒号前缀明确的指明变量的作用域:

  • g:var – 全局
  • a:var – 函数参数
  • l:var – 函数局部变量
  • b:var – buffer 局部变量
  • w:var – window 局部变量
  • t:var – tab 局部变量
  • s:var – 当前脚本内可见的局部变量
  • v:var – Vim 预定义的内部变量

你可以通过 $name 的模式读取或者改写环境变量,同时可以用 &option 的方式来读写 vim 内部的设置值。

数据类型

Number:32 位有符号整数

-123
0x10
0177

Float: 浮点数,需要编译 Vim 的时候,有 +float 特性支持

123.456
1.15e-6
-1.1e3

String: NULL 结尾的 8位无符号字符串

"ab\txx\"--"
'x-z''a,c'

Funcref: 函数引用,函数引用类型的变量名必须以大写字母开头

:let Myfunc = function("strlen")
:echo Myfunc('foobar') " Call strlen on 'foobar'.
6

List: 有序列表

:let mylist = [1, 2, ['a', 'b']]
:echo mylist[0]
1
:echo mylist[2][0]
a
:echo mylist[-2]
2
:echo mylist[999]
E684: list index out of range: 999
:echo get(mylist, 999, "THERE IS NO 1000th ELEMENT")
THERE IS NO 1000th ELEMENT

Dictionary: 无序的 Key/Value 容器

:let mydict = {'blue': "#0000ff", 'foo': {999: "baz"}}
:echo mydict["blue"]
#0000ff
:echo mydict.foo
{999: "baz"}
:echo mydict.foo.999
baz
:let mydict.blue = "BLUE"
:echo mydict.blue
BLUE

没有布尔类型,整数 0 被当作假,其他被当作真。字符串在比较真假前会被转换成整数,大部分字符串都会被转化为 0,除非以非零开头的字符串才会转化成非零。

Continue reading

Loading

Posted in 随笔 | Tagged | 1 Comment

卡片生成词典(Anki)

最近在学习使用 Anki + WordQuery,发现几个问题:

  1. WordQuery 里面词典一多就很混乱,还会互相冲突。
  2. 每个词典都要重复一遍词头音标之类的。
  3. 内容冗长不堪,经常要翻好多页。
  4. 配置使用太麻烦
  5. 很多网上现成的 apkg 包内容实在太简陋,惨不忍睹
  6. 篇幅越长同步越慢

所以弄了个《卡片生成词典》分为两个mdx:正面(anki-front.mdx)和背面(anki-back.mdx),目标是:

篇幅精简减少滚屏,内容丰富准确,风格统一重点突出

选词使用 COCA 6 万 + CALD 索引,差不多7万单词,超过的也没太大有背的必要。

包含内容

正面内容:anki-front.mdx
1. 词头
2. 音标
3. 考试大纲和 COCA/BNC 词频,
4. 柯林斯星级
5. 是否是牛津核心词汇的 K 标志

背面内容:anki-back.mdx
1. 单词简明释义(XX词霸)
2. 单词释义分布
3. 《剑桥高阶第三版》
4. 《不择手段背单词》
5. 《新东方词根词缀》
6. 《优词词根》
7. 《有道近义词辨析》
8. 《有道同义词词典》

这么多内容放在一起,用 WordQuery 岂不是很乱?一点也不乱,因为这些东西不是胡乱拼在一起的,而是都经过我整合梳理,再划分为:【释义】【助记】【双解】【辨析】 四大区域,按使用频率排序,第一次看完从上到下,越熟悉,视线越集中在上面部分。

效果演示

(点击 more/continue 继续)

Continue reading

Loading

Posted in 未分类 | Tagged , | 1 Comment

Windows 10 – 1803 更新又给我出幺蛾子

Windows 10 的 1803 版本更新后,Cygwin 的 Open SSH 服务无法始用,调查半天,Windows 10 新建了个 sshd 的服务,原来的 Cygwin Open SSH 服务被删除了,也安装不上去,解决方法是 ssh-host-config 后面加个参数 --name sshd2 换个新名字重新安装服务。

Loading

Posted in 随笔 | 1 Comment