2015-03-03 Tuesday 20:02:29

xdg-mime设置默认程序

$xdg-mime default firefox.desktop x-scheme-handler/http #默认用firefox打开http链接

其实是修改了 ~/.local/share/application/mimeapps.list 文件

zsh与readline

  • zsh不用readline,因此 ~/.inputrc 里的设置对其无效

  • zle与readline有一点不同的是,kill-word这个功能的默认快捷键, 虽然都为 M-Backspace 但zle对word的分界是非空白字符,/path/to/here对它来说是一个word。而readline中,会把/path/to/here当作三个单词。readline中把/path/to/here当作一个单词删除的快捷键是 C-W

you-get

  • 下载视频网站的视频!神器!

$pip3 install you-get # pip 安装
$you-get -i URL # 查看视频信息,如标题,分辨率,大小等
$you-get -F {hd2,mp4} URL # 选择某一个分辨率下载

rlwrap

  • 不支持readline的程序,例如python,可以在前面加上 rlwrap 来加上readline支持!

alias python='rlwrap python'
alias maxima='rlwrap maxima'
alias guile='rlwrap guile'
  • zsh不用readline,因此 ~/.inputrc 里的设置对其无效

  • zle与readline有一点不同的是,kill-word这个功能的默认快捷键, 虽然都为 M-Backspace 但zle对word的分界是非空白字符,/path/to/here对它来说是一个word。而readline中,会把/path/to/here当作三个单词。readline中把/path/to/here当作一个单词删除的快捷键是 C-W

2015-03-04 Wednesday 14:57:56

youtube-dl

下载youtube视频,很给力的一个工具,但好像不支持国内的视频网站,不过有 you-get ,是日本人写的。

$youtube-dl -F URL # 列出所有可供下载的格式,每个前面有一个ID
$youtube-dl -f ID  # 下载指定格式的码流
$youtube-dl -f bestaudio URL # 下载质量最好的音频码流,下载音乐和有声读物时很有用,之前不知道,还专门找从youtube上下mp3的网站,当时就怀疑,这些网站不可能是自己下载视频后再提取音频的,不然太慢了!

2015-03-05 Thursday 18:54:39

Fabric Bellard

  • 神人啊。QEMUffmpeg 都是他写的。他还写过C编译器,整个代码只有不到4M,而且是ISO C99兼容的,编译速度比 gcc 快7倍!

  • 还记得刚上大学那会儿看到过有人用个人电脑破了计算pi的记录,那个人就是他。而且是基于他自己发现的公式 Bellard formula 的!他不仅知道怎么做,而且做得比别人更快更好! (通常发明公式的应该是数学家,而数学家一般不会自己去用代码实现。)

  • 前一段他还提出并实现了 BGP 图像编码格式,是基于HEVC的技术,对高分辨率的图像有更好的压缩效果。

  • 而且他的网站非常之简洁。看得我有些惭愧。

  • 或许专注一件事情才是成功之道吧!

xorg-server

  • 开学后的 pacman -Syu 好像更新了不该更新的东西,使得终端刷新的时候会把整个显示器搞乱。开始以为是i3wm的问题,但是回滚后还是不行。

  • 想起来xrandr显示的显示器名称也变了,之前是DVI-I-1和DVI-I-2,现在成了DVI-1和DVI-2。于是把xrandr也降级,问题依然存在。

  • 本来想去IRC上问一问,但是感觉这问题挺不好描述。才想起来去看Archlinux的更新公告 xorg-server 1.17.1 is now available,然后把 xorg-video-modesetting 装回来就好了。

Location hash Property

  • 就是在URL后添加 #section 来定位到html文件的某一部分的功能。wikipedia上很常见。如何在Asciidoc中实现呢?

Python中的二维数组定义

首先应该定义成列表的列表。

>>> arr = [[0] * 3] * 3
 [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> arr[0][0] = 1
>>> print arr
 [[1, 0, 0], [1, 0, 0], [1, 0, 0]]

明明只改了一个值,但却有三个位置的值改变了。看下它们是否是同一个对象:

>>> [id(x) for x in arr]
 [140692558271840, 140692558271840, 140692558271840]

但是注意

>>> a = [0] * 3
>>> print a
 [0, 0, 0]
>>> a[1] = 1
>>> print a
 [0, 1, 0]

当重复的对象类型是int时,就是复制了不同的实例了?其实不然,再看:

>>> [id(x) for x in arr]
 [23646576, 23646576, 23646576]

那既然如此,为什么改变一个值不会影响到其它三个呢?在 IRC上问了,马上得到了回答,大概是说,int类型是不可变的,你改变它,Python其实是生成了一个新的实例。而列表类型是可变的,你改变它,就会看到它的三个拷贝都变了。

那么正确的方式应该是什么呢?用列表展开!

>>> arr = [[ 0 for i in xrange(3)] for j in xrange(3)]
>>> arr = [[ 0] * 3 for i in xrange(3) ]

用一个for的列表展开更简洁,但是不那么直观,包含了一些隐式行为。

单个物理屏幕的截屏

2015-03-07 Saturday 21:40:26

py2exe, pyinsaller

  • py2exe 可以把.py程序转化成.exe程序,以在没有安装Python的Windows机器上运行,但必须在Windows中的Python中使用。:(

  • pyinstaller 支持多平台,但在Linux中,还是转化成ELF可执行文件,而不是exe。所以貌似不能用它来实现交叉编译?

python中的排序算法

  • 用的是Timsort,具体方法在源代码的Objects/listsort.txt中有描述。

  • DSU模式,在Python 2.4之前,为列表指定cmp函数的一种方法。就是先将每个元素x与val(x)绑定(Decorate),然后对元组(val(x), x)进行默认的排序(Sort),最后再从排序后的元组中得到原来的元素(Undecorate)。

  • 在Python 2.4中,只需要为sort传入key=cmp就行了。cmp函数还可以用lambda表达式来做。

查看man page的N种方法

  • 在浏览器中查看: man -Hfirefox ls 有目录链接。

  • 在(g)Vim中查看::Man ls 或者在关键字上按_Shift+k_ 推荐前者,有语法高亮。

  • 用GNOME中的yelp: yelp man:ls 只是提供了一个图形界面,并不怎么方便。

2015-03-08 Sunday 14:53:57

Vim的Syntastic插件对Python 2和Python 3的支持

  • 为了能够分别对待两个不同的版本,需要使用https://github.com/scrooloose/syntastic/issues/385[virtualenv]

2015-03-09 Monday 10:43:16

zle

  • kill-buffer( ) 与 kill-whole-line() 有什么区别?

  • M-lM-u ,down-case-word, up-case-word 将光标到行尾的字符全部变成小写或者大写。

  • M-' quote-line 引号括起当前行。

  • M-a 执行当前行,并保留到下一行。

  • M-x 执行命令,例如backward-delete-word之类。

  • vi-backward-kill-word 会把/path/to/somewhere看作六个单词,就像readline中 M-Backspace 一样。而zsh默认是把backward-kill-word绑定到 M-Backspace 的。终于弄清了这个问题!现在的问题是如何在配置文件中表示 M-Backspace 。目前是将其绑定到了 C-Backspace

readline的一些默认快捷键移植到Vim中

  • 又一个tpope的Vim插件!https://github.com/tpope/vim-rsi[vim-rsi]

vim-fugitive

  • git的Vim前端插件!

2015-03-11 Wednesday 16:50:23

Python的初始化配置

  • ~/.pythonstartup

    import matplotlib as mpl
    mpl.use('Qt5Agg')
    import numpy as np
    import matplotlib.pylab as plt
  • matplotlib画图

    1. 本来挺简单的事情,由于选择太多,反而搞得很复杂。

    2. 首先python2还是python3?

    3. 然后ipython2还是ipython3?

    4. 用哪个图形后端?

    5. matplotlibrc 文件中,有 backend选项说明。

    6. 一旦选定图形后端,应该是不可更改的,除非重启python shell。

    7. ipython中查看当前的图形后端可以用_%matplotlib_ 命令。要想在notebook中显示图形,还需要 %matplotlib inline

    8. 由于各种图形后端都依赖于不同的系统桌面环境,所以有时候通过pip安装matplotlib会不能显示图像。 最好用包管理来安装

    9. 在python shell中,plt.show()显示图像时,会阻塞shell。记得之前换了backend后就不阻塞了,跟Matlab中一样可以交互了。然而相当不稳定。可以先执行plt.ion()

    10. pylab库相当于 numpy + matplotlib.pyplot ,画简单的图形demo时, from pylab import * 很方便。

mpl.matplotlib_fname() #显示matplotlibrc文件的位置。
# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.
backend      : GTKAgg
# If you are using the Qt4Agg backend, you can choose here
# to use the PyQt4 bindings or the newer PySide bindings to
# the underlying Qt4 toolkit.
#backend.qt4 : PyQt4        # PyQt4 | PySide
# Note that this can be overridden by the environment variable
# QT_API used by Enthought Tool Suite (ETS); valid values are
# "pyqt" and "pyside".  The "pyqt" setting has the side effect of
# forcing the use of Version 2 API for QString and QVariant.

2015-03-15 Sunday 00:20:06

videogrep

通过搜索字幕文件中的单词来定位到相应的视频处,并将其输出。

2015-03-25 Wednesday 22:42:29

Firefox字体渲染

  • github网站的字体总是看着很难受,像是点阵字体。设置Firefox的Latin字体,并禁止网站自己选取字体可以解决,但是系统中没有什么字体能够正确显示图标。而Chromium是可以正常显示的。原因是github默认字体是Helvetica,而Firefox对该字体是先找点阵字体的。解决方法是:

ln -s /etc/fonts/conf.avail/70-no-bitmaps.conf /etc/fonts/conf.d

2015-03-26 Thursday 10:03:06

TeX字体安装

  • TeX的字体安装在 /usr/share/texmf-dist/fonts 目录中,fc-list的结果中是没有的。根据https://wiki.archlinux.org/index.php/TeX_Live#Fonts[Archwiki中的方法],需要生成几个软链接:

$ ln -s /etc/fonts/conf.avail/09-texlive-fonts.conf /etc/fonts/conf.d/09-texlive-fonts.conf

一些常用字体

  • Consolas 不多说,可是不支持汉字,YaHei Consolas Hybrid 是个备选

  • Menlo 在自己显示器上效果不如别人的截图

  • Monaco 终于找到了这个字体!不过效果也不如别人截图上那么好 :o

  • 官方源中的 adobe-source-han-sans-cn-fonts 字体包。目前Firefox中的Latin字体就设置为这个,比YaHei Consolas Hybrid看起来还要舒服。

Windows命令行编译

  • 有时候只有一个.c的源文件,要编译还要新建一个工程,有点麻烦。其实VS也是调用的命令行工具的。手动编译的方法如下(VS2008):

    • 把VS安装目录(这里是 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC )加入系统环境变量PATH中。

    • 在命令行中运行 vcvarsall

    • 然后就可以用 cl 来编译.c文件了。

      Note
      每次都要运行 vcvarsall ,否则系统找不到 cl 命令。如果要生成其它平台的代码,需要给 vcvarsall 添加参数,例如要编译x64的程序,则运行 vcvarsall x64

Vim命令

Vim用了这么久,还是有很多命令不知道,下面是几个我实际中经常需要用到的功能,但是有更简单的做法。

标准方法 可选方法 功能

10|

根据当前所在的位置,计算出需要移动的列数,例如当前在第3列,就可以用 7l 来到达第10列

跳到指定第10列

y$

vg$y

复制从当前位置到行尾的内容(其实更常用的是 vg_y ,复制到行尾最后一个非空字符,但是好像 y_ 命令是不存在的)

C-x,C-l

未知

整行补全

C-a, C-x

未知。这个很酷,但实际中用处有多大还不清楚。

把光标所在位置处的数字增加或者减少1

.c 和 .cpp 文件的Vim Snippet

C++ 中可以写纯C,把头文件和main函数模板写成snippet,可以快速地完成代码。

snipMate插件是根据文件扩展名来识别源文件所用的语言的,例如 cpp.snippets 中定义的代码块只在 .cpp.cc 文件中起作用。但 c.snippets 同样也对 C[]+ 文件起作用,甚至默认的 _cpp.snippets_ 里面就没有几行,都是针对 C+ 独有的语法,共用的语法都使用 c.snippets

gcc的一个bug?

C99标准支持 Designated Initializers,就是委托初始化。例如:

int a[10] = {[5] = 4, [8] = 13};
int b[10] = {[2 ... 5] = 4, [8 ... 9] = 13};

编译的时候,需要指定 -std=c99 参数。而且源文件扩展名必须是.c而不是.cc,不管你是用gcc还是g++。

所以 gcc test.cc 的话,其实还是调用了 g++

注意当要初始化的是一个数组区间的时候,点号要与数字分开,否则会被编译器认为是浮点数而报错。而且这种特性是GNU的扩展,不属于C99标准(但是-std=c99也能编译成功。)

Note
微软的编译器就是不支持C99,不能在代码中间部分定义变量,不支持for循环中定义变量。除非用C++(其实就是扩展名从 .c 变成 .cc

2015-03-28 Saturday 18:07:50

Monaco字体

Monaco for Powerline才是正解!显示效果要比Monaco好。

cowsay, cowthink, fortune

无聊的时候可以拿来玩~~

$ fortune -c | cowthink -f $(find /usr/share/cows -type f | shuf -n 1)
 _______________________________________
( (songs-poems) % Volcanoes have a      )
( grandeur that is grim And earthquakes )
( only terrify the dolts, And to him    )
( who's scientific There is nothing     )
( that's terrific In the pattern of a   )
( flight of thunderbolts!               )
(                                       )
( -- W.S. Gilbert, "The Mikado"         )
 ---------------------------------------
o                             .       .
 o                           / `.   .' "
  o                  .---.  <    > <    >  .---.
   o                 |    \  \ - ~ ~ - /  /    |
         _____          ..-~             ~-..-~
        |     |   \~~~\.'                    `./~~~/
       ---------   \__/                        \__/
      .'  O    \     /               /       \  "
     (_____,    `._.'               |         }  \/~~~/
      `----.          /       }     |        /    \__/
            `-.      |       /      |       /      `. ,~~|
                ~-.__|      /_ - ~ ^|      /- _      `..-'
                     |     /        |     /     ~-.     `-. _  _  _
                     |_____|        |_____|         ~ - . _ _ _ _ _>

xorg-server 和 xf86-video-modesetting

几周前更新后出现问题,现在问题又来了。还是重新做了一遍,完全没有长记性!主要习惯性 pacman -Syu ,有时想不了那么多。

这次把步骤记下来,然后把 xorg-server Ignore掉。

# 两个包有依赖,要同时卸载?
$ pacman -U /var/cache/pacman/pkg/virtualbox-guest-utils-4.3.20-1-x86_64.pkg.tar.xz /var/cache/pacman/pkg/xorg-server-1.16.3-2-x86_64.pkg.tar.xz
$ pacman -U /var/cache/pacman/pkg/xf86-video-modesetting-0.9.0-2-x86_64.pkg.tar.xz

然后在 /etc/pacman.conf 中加入

IgnorePkg = virtualbox xorg-server

话说virtualbox从4.2.22以来,更新后总是有问题,干脆停掉算了!

PSNR和MSE的对应关系

import numpy as np
import matplotlib.pylab as plt
def mse(n):
    return 20 * np.log10(255.0/n)
x, xx = np.linspace(0.1, 10, 100), np.linspace(1, 10, 10)
y, yy = mse(x), mse(xx)
plt.plot(x, y, xx, yy, "r*")
plt.xlabel("MSE")
plt.ylabel("PSNR(dB)")
plt.grid(True)
plt.show()
MSE PSNR(dB) Plot

1

48.13

psnr

2

42.08

3

38.59

4

35.99

5

34.15

6

32.46

7

31.13

8

29.83

9

28.94

2015-03-29 Sunday 21:12:52

统计程序执行时间的Python模块

方便地统计一个小程序的运行时间。在解决一个问题时,可能会有很多Python的库可供选择,如果不知道哪个更好,可以两个都用一下(Python就是这么任性?),然后看哪个胜出。

命令行中 timeit 模块的使用:

$ python -m timeit -n 1 -r 10 "import myfun.py; myfun.foo()"

n 参数指定每个循环运行这个程序多少遍, r 参数指定运行多少次循环。

最终会返回一个最快循环的运行时间。

大数据

看了下实习的要求,好多公司的好多职位都是跟大数据相关的。还在犹豫要不要找实习。

突然就感到自己有点落伍了,对大数据一点概念都没有。准备先把Hadoop搭起来,统计个单词什么的。

  • 软件源里没有 hadoop ,ABS里有。

  • 然后装了 maven , scala. 我都不知道 maven 是干嘛的。反正都跟Java相关吧。突然发现Java好像又火了(还是一直都很火只是我没有注意到)。

  • 装了 intellij-idea-community-edition 竟然不能启动。

  • Java 都到 JDK 8 了。

  • 好久不用Java,还得重新设置环境变量。这么多年一直没变吗。这是为什么呢,为什么其它程序都能自动设置好环境变量而Java就不行呢,是不是跟它的特性有关呢?

  • 装了 apache-spake ,其实不知道它是干嘛的,Archlinux上要在自己机器上编译,眼看这它从 maven.org 下了好多文件。期间去知乎上看大数据相关的回答,好多都是几年前的了。

  • 啊,还记得第一次接触分布式的概念,是大一还是大二的时候,一个文献综述的征文,那时就看了Google的三篇经典文章,当然没看懂,只是字面意思过了一遍。。

  • 要不要试试看这些东西都是干嘛的呢?

  • 现在情况是, Hadoop, Spark, Strom 三个平台?

  • 目前对数据库的理解基本处于空白,需要恶补?

  • 名词太多,记不过来。程序员好无聊,起这么多名字。YARN, MPI

2015-03-30 Monday 10:03:33

RFC on Archlinux

community 源中,有一个包囊括了rfc的大部分文档(目前有7297份),安装在 /usr/share/doc/rfc 目录下,有 ps, pdf, txt 格式。当然大部分都是txt格式,提供pdf和ps格式的只有很少一部分。

为了方便阅读,给 shell 加上一个函数好了:

rfc(){ gvim /usr/share/doc/rfc/txt/$1.txt }

Pacman Cache

发现 /var 又满了,一看 /var/cache 有九个多G。所有通过 pacman 安装的软件的安装包都会存在这里,如果很久不清理,就会变得很大,但是如果全部清理掉,万一出现问题了,回滚就会很麻烦。记得之前(14年7月?)自己写过一个脚本,删除掉每个软件包最旧的几个版本,费了好大劲,用 ls, cut, sort -V, sed 最终只是勉强能用,不过后来竟然找不到那个脚本了!

其实有这个需求的人应该很多,所以 pacman 软包本身就有一个命令 paccache 是来干这个工作的。 paccache -r 就会只保留已安装软件最新的三个安装包。 pacman -m 是移动过旧的安装包到指定目录。

如果确定自己现在的系统不会出问题了,还可以只保留当前已安装的软件包。看 wiki 上的意思,好像可以根据这些软件包自动克隆出一个一模一样的系统。

后台运行,终端脱离

在命令后加 & 是后台运行( jobs 命令查看当前终端的后台进程),但如果终端退出了,这个后台进程也就随之被kill掉了(准确点说,可能是HUP)。

为了使程序独立于启动它的终端,启动时可以在前面加上 nohup

如果启动时只是用 & 后台运行,之后也可以用 disown 补救。先用 jobs 查看命令的job ID,然后 disown %id 就可以了。如果 disown 没有参数,那它就会将最后一个工作脱离当前终端。

但 nohup 和 disown 其实是有些微的差别的。 type nohuptype disown 是不一样的, nohup 是/usr/bin下的一个程序,而 disown 是 bash 的内置命令。

默认情况下终端退出时会对其下所有还在运行的 jobs 发送 HUP 信号(猜的),nohup 只能在程序开始执行的时候添加才有用,因此可能是启动程序时,改了该程序的信号处理程序(继续猜)。而 disown 是 bash 内置的,只需让 bash 记住退出的时候不要给相应程序发送HUP信号就可以了,这也说明了为什么可以在程序已经在运行了的时候再 disown 。