常用工具集

Vim快捷键:

  • 跳到第一行 :1 或 gg
  • 跳到最后一行 😒 或 Shift+g
  • 复制 yy
  • 删除 dd
  • 撤销 U
  • 粘贴 P

加载Python自带Web Server:

  • python -m SimpleHTTPServer 80
  • python3 -m http.server 80

Webstorm快捷键

  • Ctrl + Alt + L 格式化代码
  • 双击shift 全局查找
  • 快速代码补全 emmet
  • 快速生成框架 !html

Onenote使用笔记

  • 截图:Win+shift+S

Nginx

  • 重新加载配置:nginx -s reload
  • 快速关闭:nginx -s stop
  • 安全关闭:nginx -s quit

FFmpeg

celery 4 in Windows

  • 不支持pool:celery -A your_app_name worker --pool=solo -l info

lsof:list open files

查看进程打开的文件列表

  • lsof -c -p pid
  • lsof -c program

获取当前缓存(加载)的动态链接库:

  • ldconfig -p | grep libssh

查看可执行文件所依赖的库:

  • ldd 绝对路径
  • (程序的某个section中会记录动态链接的信息)

aliases

  • alias de=‘ps -ef |grep’
  • alias c=‘clear’
  • alias ncat=‘netstat -nlp |grep’
  • alias listp=‘pkg-config --list-all |grep’
  • alias versionp=‘pkg-config --modversion’
  • alias finf=‘find / -name’
  • alias s=‘apt-cache search’

高亮日志分析工具(log navigator):

  • apt-get install lnav

ovs

  • 运维:

    • 运维脚本位置
      • /usr/share/openvswitch/scripts
      • /usr/local/share/openvswitch/scripts
    • 启动:ovs-ctl start
    • 重启:ovs-ctl restart
    • 状态:ovs-ctl status
  • 查看日志:

    • ovsdb-tool show-log
  • 查看ovsdb里面的数据表:

    • ovsdb-client list-tables
  • 查看ovsdb中的相关字段定义

    • ovsdb-client list-columns Interface | grep ofport
  • 查看ovsdb中的相关数据:

    • ovs-vsctl – --columns=external_ids,name,ofport,ofport_request list Interface
  • alias:

    • alias ovss=‘ovs-vsctl show’
    • alias apps=‘ovs-appctl fdb/show’
    • alias ofs=‘ovs-ofctl show ofc-bridge’

编译相关

  • cmake:

    • 一个跨平台编译工具 用于生成适配平台的Makefile
    • mkdir build
    • cd build
    • cmake …
    • make && make install
    • 重新cmake之前需要删除CMakeCache.txt
  • pkg-config:

    • 编译库的时候 使用这个工具管理其依赖
    • 即记录头文件和库文件的存放位置 用于编译和链接
    • pkg-config --list-all | grep libnetconf
    • pkg-config --modversion libnetconf

IPv6 DNS:

  • 国内公共DNS(延迟2ms):
    • 240c::6666
    • 240c::6644
  • he.net(US延迟156ms):
    • 2001:470:20::2
    • 2001:470:0:9d::2
  • Google(延迟156ms):
    • 2001:4860:4860::8888
    • 2001:4860:4860::8844

屏蔽广告:

hexo博客之旅 [3]: 添加gitment评论和链接分享功能

一个博客如果没有评论和分享功能,势必是单点的,你只是单向的发布信息,读者无法评论和快速分享,这对博主和读者都是巨大的损失。

添加评论系统

gitment是一个基于github issue给博客添加评论的系统,原理大概是通过博客作者在某个repo创建带有某个label的issue,来为某篇博客对应评论,由于github的在线编辑器支持markdown预览,还是很优雅的,而且这样做也不用为hexo这样的静态博客添加动态代码来存取评论。

一篇博客对应一个issue,只有博主经过授权后,才可以初始化issue,这样后续的读者就可以用自己的github账号登录博主的gitment应用,来向这篇博客添加评论,里面的对文章的点赞和对其他用户的点赞,其实跟issue主页的点击操作一样,都是通过api操作的。

这么说来,gitment只是一个基于issue的评论前台,用于存取issue里面的评论数据。

部署的时候,我参考了这篇文章,并且遇到了一个问题,登录自家博客之后,文章底部出现了gitment的框架,由于没有初始化issue,点击初始化按钮后,提示Validation Failed

一番搜索后,发现是github issue中的label长度有限制,不能超过50字节。

label长度 <= 50字节

查看js代码后,发现id是window.location.href,这样长度会经常超出。由于我之前文章的url都是英文的,所以使用url中的英文标题作为id,后续需要整理一番英文title,以正常初始化issue:

1
2
3
4
5
6
var mod_id = window.location.href.split("/");
mod_id = mod_id[mod_id.length - 2];
Object.assign(this, {
id: mod_id,
title: window.document.title,
link: window.location.href

gitment评论系统很优雅,虽然有时候github的国内访问速度超慢,但github的数据很稳定,不会像多说一样为数据丢失担忧。

在使用过程中,发现gitment对于新文章的初始化需要博主自己点击,这对像我这样从其他博客迁移过来的用户而言,重复几十次的点击就不是那么有意思了。

为此,我写了一个自动化脚本,工作流程如下:

  1. 由于新开的chrome不包含github已登录session和cookie,所以需要模拟登录github账号
  2. 获取站点sitemap.xml,如(https://hackeryard.github.io/sitemap.xml),解析成文章的url
  3. 依次模拟打开上述url,初次打开需要login,之后的文章则不再需要
  4. 对每篇文章模拟点击init button,如果点击出错,表示已被初始化;如果成功,表示正在初始化,sleep 5s后打开下一个url

脚本在这里,欢迎使用!

替换分享链接到国内社交站点

话说hexo是一个台湾开发者写的,文章的默认分享都是分享到国外的社交平台,如Twitter/Facebook/G+等,能上这些网站的用户固然是少数,所以把分享功能本地化是很有必要的。

首先,我参考了这篇文章,由于我是用的hexo,其landscape主题里面的fonts是4.0.3版本的fontawesome,导致qq和腾讯微博的图标无法显示,按照文中的方法折腾了最新版的5.0.6版本,找到webfont子目录,替换了hexo中的fonts下的文件,发现这次原有图标失效,新添加了四个分享按钮却是正常的,我以为是缓存的问题,又去看了Edge浏览器,还有手机Brave/Chrome浏览器,仍然不行,正打算撤回老版本的时候,发现fontawesome的4和5版本差别很大(的确,想想python2/3,主版本间的差别可能很大),这可能就是不兼容的原因。

没在fontawesome官网上找到老版本的存档,搜了半天,找到一个4.7版本的站点,下载后解压,然后更新版本号即可。

其他参考

【实用技能】教你定制Hexo的landscape打造自己的主题

hexo博客之旅 [2]: 利用webhooks自动部署hexo博客

以前觉得hook是个深奥的技术,的确,到现在我还没写过一个hook,网上有很多文章讲hook都是用的win32 API,不知何时我竟然看不下去这种代码了,不知是喜是忧。

Github给出的解释搬运一段如下:

Webhooks allow you to build or set up GitHub Apps which subscribe to certain events on GitHub.com. When one of those events is triggered, we’ll send a HTTP POST payload to the webhook’s configured URL. Webhooks can be used to update an external issue tracker, trigger CI builds, update a backup mirror, or even deploy to your production server. You’re only limited by your imagination.

webhooks就是这样一种机制,当你的repo有某个特定的事件发生时,比如push/PR/issue/fork等,github在后台会向你填写的URL发送一个POST请求,里面包含了很多信息,比如issue会有sender和相应的repo,还有issue的地址等。

另外这段话里面也说明了update a backup mirror这个用法,vps上面的镜像博客给百度索引,github.io给谷歌索引。

根据webhooks的用法,我们在github pages的repo里面订阅对push事件的钩子,vps后台开启一个简单的web server监听此请求,然后使用git pull更新github pages里面的静态博客文件到本地。

设置Webhooks

之前参考的一篇博客已经记不起来了,只记得是用node写的,我用python重写了一下,见github

hexo博客之旅 [1]: 初探hexo

经历过WordPress,也尝试过github pages,因为WordPress的数据库由于机器内存吃紧,经常掉线,另一个原因是有人ddos,恶意攻击我的站点,导致我设置了一个定时任务,每一个小时重启数据库,基本可用。

github pages可以用来存放静态博客,以前用过来存放俱乐部站点或个人主页,但没充分利用来写博客。

借用官网的解释,Hexo 是一个快速、简洁且高效的博客框架,目前我们看到的很多IT博客都是用的hexo + next主题,认同度是比较高的。
初识Hexo,可以从官方文档开始了解。

最初是在vps上搭建,但是平时习惯用vscode编辑器,所以就在本地搭建一个博客,然后push到github pages,其实这样一个静态博客就可以访问了,但由于github.io禁止百度爬虫爬取,所以对于百度的SEO影响很大,也就是你的博客在百度里面几乎找不到。一个解决方法是用vps镜像一份博客内容,然后手动添加到百度的收录里去,详见hexo博客之旅 [2]: 利用webhooks自动部署hexo博客

安装好nodejs、git for windows、和hexo之后,

1
2
hexo init blog
cd blog

生成如下目录:

  • source(博客的源文件,用于生成最终的public目录下的各个文件)
    • _draft(保存的草稿)
    • _post(你将要写的一篇篇的以md结尾的博客)
  • themes
    • landscape(默认的主题)
  • _config.yml(全局的配置文件)
  • package.json(保存项目的依赖关系)

之后,

1
2
hexo generate
或者简写: hexo g

生成public目录,这个目录就是我们最终要放到github pages上的,接着我们测试一下:

1
2
hexo server
或者简写: hexo s

然后打开 http://localhost:4000 见第一面吧!

如果想更换端口,使用

1
hexo server -p [port]

到这里本地部署已经完成了,接下来就是部署到github:
新建一个repo为[your_github_name].github.io, 然后在repo的settings里面设置开启github pages:

开启github pages

接下来设置通过ssh来免密连接github,用于后期git操作不用重复输入密码,而且理论上更安全,这里推荐一篇文章

按照上面的操作,部署到github,并通过[your_github_name].github.io访问。
如果有出错,建议安装git的插件

另外,你可能需要补一下markdown的语法,这里推荐一篇Hexo-Markdown-简明语法手册

当你慢慢的,写的博客越来越多时,你可能还需要一个README,让别人在访问的repo的时候,就可以对你的博客有一个清晰地了解,我起初在网上没找到代码,就可以写了个generate_readme,可以复用

Vincent之死

下文所述仅依靠电影《Loving Vincent》中的故事对Vincent之死作一个推断,在这部电影之前,我并没有看过有关梵高更多的记载。

这是一部来自100多个艺术家的协作而完成的对梵高的致敬之作,Loving Vincent只是Vincent在给弟弟Theo写的信的末尾用语,类似于Yours Sincerely,以此作为题目,说明Vincent对弟弟Theo深深的爱,Vincent几乎每天都要给弟弟写信,诉说自己的近况和对弟弟的思念,还有心底的愧疚。

那么Vincent是怎么死的?

如果Vincent是自杀,为什么不跟Mazery医生说的那样,饮弹或者对准太阳穴、心脏这样的致命部位来一枪,而选择了在胃部开了一枪,然后一路忍受痛苦回到卧室,之后还有漫长的等待?

如果是他杀,想想也只有可能是富家公子Rene,但他也不会无端想要杀死Vincent,他们之间并不存在致命的冲突。

我一开始也没想到,我觉得Mazery医生说的很有道理,但是我也没考证过那时候的枪到底能不能在距离身体几十公分的位置发射,然后不打穿身体的。现在我觉得这个是没问题的,医生形容得过于夸张了,他怀疑是别人暗杀才可以达到那样的效果。

回看第二遍的时候,处处隐藏着Vincent执意要自杀的种种看似合理的理由,他给弟弟写信说自己度日如年,他来到弟弟的住所,然后更加知晓了弟弟的状况,他的好朋友玛格丽特被Gachet医生限制住,不跟Vincent来往,他被医生还刺激了一下(医生说他说了作为一个医生所不该说的话)… 这些仿佛都在诉说一个伟大画家的即将凋零,但这里面还有冲突:

  • 医生把女儿限制住,不是要给Vincent不被打扰的作画环境吗,为什么又跟Vincent吵了一架,而且可以推测,他不该说的话好像就是Vincent应该找个其他的谋生手段,不让自己的作画产生的经济负担压垮弟弟的家庭?
  • 医生是军医,可以帮Vincent取出子弹,但是他见死不救
  • 在电影中,枪击现场竟然没有出现,麦田里应该有那把手枪,还有他的画架

第一条,医生很照顾Vincent,但是他终归不是他的衣食父母,所以他让女儿不跟Vincent接触,理由却是不背打扰伟大画家的锅,其实他有所打算,所以他还是劝Vincent,我猜测大概就是别去作这些没人买的画了,为弟弟减负,但是他不听,反而起火了,甚至刻薄到说出医生是个伪艺术家这样的话,对于一个对艺术心存敬畏和追求的人而言,这是致命的打击。

第二条,医生本来希望他想想自己接下来的生活,他的目的是让他好好活下去,但是看到负弹的Vincent,他明白他活不久了,他对死的决心由来已久,所以什么也没有做。

第三条,枪击现场没有出现,警察也只是翻找Vincent卧室的东西,那里肯定没有证据,所以最重要的现场竟然不存在,这决定了无法进一步推测Vincent具体的死法。

最大的疑点是,Vincent为什么要忍受长久的痛苦,回到卧室等死?
我以为,他是有话给Gachet医生说,还有他的弟弟Theo。

医生看到这个样子的Vincent,一定以为是自己说了不该说的话,也就是上次争吵的事,而引发这次事件的,Vincent回来而不是立即自杀,是要医生明白,“我觉得这对大家都好”,这件事跟他无关。

Vincent最后也希望Theo到场,希望最后的时光能够有弟弟陪在身旁,这中间自有手足之情,还有Vincent对Theo的愧疚与解脱后的宽慰。

电影提到,他的出生很大程度决定了他性格的养成,从他的父母那里看出他注定是一个孤独的孩子,而孤独的孩子总是很敏感。

与弟弟相依为命,靠着作画展现自己的才华,却得不到艺术届的认同,估计放在中国古代,就会多一个怀才不遇的诗人,但是Vincent,我觉得他是彻底绝望的,他深爱的弟弟被自己慢慢拖垮,他的艺术也没得到人们的认同,他陷入了彻底的恐惧,并且在梦里,那激情的,梦幻的星空总是向他投来橄榄枝,他想要逃避,但同时他又说自己走在通往星空的路上。

对于我以为的艺术家而言,自杀才是主动的靠近那梦里星空所描绘的世界,而他完成了这个目的。

这是一个悲剧。

令我不解的是,医生和画铺子老板等人在Vincent生前都可以看出他的才华,为什么就不买一些他的画作?(电影最后说他生前只卖出一幅)

没有人知道全部真理,尽管电影中的Ravoux家族和Gachet家族的人,以及Mazery医生,仿佛都对Vincent的死抱有坚定不移的态度。

最后,我想起了宫泽贤治,还有海子的死。

如何发送空UDP报文

我们知道UDP是无连接的,接收和发送一个报文是独立的,而TCP则实现了一整套的诸如流量控制和拥塞控制机制,保证连接的可靠性。


在本文中,你将了解在Socket API中如何发送一个空的UDP报文,并且通过tcpdump抓取后用wireshark查看报文内容。

本文缘起对recvfrom的返回值的困惑,因为在TCP中,用recv或者read函数,我们可以通过其返回值是否为0,来判断对端的连接状态,是则表示对端关闭写通道,更可能的情况是close掉了连接。
但是在UDP中很少见到recvfrom的返回值是0,在man手册中,只说了TCP的recv保留0以指示对端关闭的情况,这个TCP包是空的,因为只需要TCP头部的FIN信息。

所以,动手看看吧!
recvfrom返回0表示有数据包达到,但是数据部分为空,在wireshark中看到,UDP的长度字段为8,正好是UDP的头部长度,数据部分的确为空。

下图是通过sendto函数广播的空UDP报文:
udp空数据

发送使用sendto,只是设置发送的长度为0,发现返回值为0;同样,接收使用recvfrom,接收广播的消息,发现当空数据包达到时,返回值为0。如下:

sendto(sockfd, buffer, 0, 0, (struct sockaddr *)&amp;brctaddr, addrsize); recvfrom(sockfd, buffer, 0, 0, NULL, NULL);

另外在广播过程中,使用tcpdump udp port 5001 -w test.pcap监听5001端口的流量,并保存在test.pcap中供wireshark查看。

实验结束。


TODO: socket API对应的内核相关操作(select和非阻塞IO等)

node实践 0x00

前言

接触node这十多天来,想想因为网站比赛的缘故,开始较为系统的学前后端,从阮一峰老师的博客得知他也在使用node开发,所以更加正好试试node进行开发。

概述

node又称nodejs,它提供了有别于浏览器的js执行环境,通过添加硬盘和网络io库的方式让js支持后端运行,而不必束缚在浏览器里处理UI。
另外Google v8引擎给了node强劲的性能,在《深入浅出Node.js》中,作者给出很多例子,比如计算同样位数的斐波那契数列,node的性能超过java,也曾有公司把网站用node重写,相比ruby,服务器削减了十倍,从中可见一斑。
node的一大特色就是异步io,我们知道,在网络服务中,服务进程大多是io密集型的,如果使用阻塞io库,进程将经常等待io完成,明白点说,在操作系统中,当一个进程被阻塞时,调度器会在就绪队列中选一个占用cpu进行执行,io一般又相当费时,当对于cpu这个计算资源而言,此进程就浪费掉了一部分时间片,从而影响性能,在需要尽量实时的服务上尤为明显。

安装python科学计算库 [windows下]

由于今天数据挖掘练习的缘故,需要安装一些常用的科学计算库,如耳熟能详的numpy,scipy,sklearn,matplotlib,seaborn等。

本机python 32位版本3.6,使用pip3安装相关库,看到知乎上要说换用anaconda(附带python和一些扩展库),再用conda工具安装没有的库,可以很好的解决依赖问题。由于我对Python的依赖关系的管理没有深入了解,只依赖于pip或者easy_install的使用,所以当遇到pip安装某个库失败时,就有些无措了。

解决方法如下:

前往http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy下载适合自己版本(我的是cp36,对应python3.6)的numoy+mkl(mkl是intel math kernal lib的意思,估计由于这样的原因,这种打包的numpy无法使用pip官方安装,也即就算pip install numpy成功了,当import scipy的时候,执行仍然报错,报错原因就是找不到numpy+mkl)

我用的校园网,实际下载速度只有15KB,而且经常断线且服务器不支持断点续传,所以很无奈。当想到有国内国外的vps,就挂上去看了下,使用

[c]wget http://www.lfd.uci.edu/~gohlke/pythonlibs/xuoh7y4k/numpy-1.13.0rc1+mkl-cp36-cp36m-win32.whl[/c]

发现404错误,用curl同样无法下载,苦闷中,发现用这个地址放到浏览器可以直接下载,所以应该是服务器屏蔽bot下载了,在wget后加

[c]–user-agent="Mozilla/5.0" [/c]

即可。

通过sftp工具下载到本机用pip3安装即可。

之后再安装其他依赖于mkl的库就没有问题了。

15年某日手记

人这东西,要学会与自己相处,与欲望同行,无论魏晋。
欲望是什么?

软件不足,还想要更多更好的硬件。

在物质领域,这也是人们生生不息的追求吧。

–6.25

老师还是讲点玄学的好,这样才完美。

–6.25

今天我写下的东西,不能明天就看不下去。

一半花开,一半花落。

一些细节被永远的抹杀了,走着走着就忘记了曾经的自己(真实的)。

–6.26

 

火已燃,心为之动,愿无悔。

–不详

一忌好为人师,二忌比来比去。

学习的基本单位是集体而非个人,在组织中,团体中每一个人需要成长和学习,并且是向着共同的目标奋进的。

优秀组织中的个人应该觉得自己属于一个比自我更强大的实体。

–不详

我更倾向于成为一个学者。

–7.03

 

apt-get笔记

apt-get是debian下的简易安装工具,可以解决依赖问题,但在使用过程中,也遇到一些问题,与大家分享:

apt-get install xxx之后,如果需要卸载此包,那么通过apt-get remove xxx之后,只是删除了二进制文件而已,还有配置和数据文件没有删除,这往往给我们带来麻烦,可以通过apt-get purge xxx删除所有的关于包xxx的内容,另外,如果想同时删除安装xxx时安装的依赖包,可以通过apt-get autoremove来完全去除依赖。

另外推荐一个安装工具aptitude,它是apt-get的图形化版本,但是可以简单的解决删除安装包和依赖的问题:aptitude remove xxx,使用此方法的前提是通过aptitude安装xxx,即aptitude install xxx