串口工具ckermit


默认配置文件

/etc/kermit/kermrc
一般配置一个home下的自己的配置文件就ok了。
~/.kermrc


set line /dev/ttyS0
set speed 9600
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5

操作

C-\ 切换到命令行
c 打开链接



插件

mouseless mutt key

像mutt一样操作邮件,非常方便。
m: write email
n/p: next,preview
r: re
f: forward
s: 加星


Contact Tabs

方便查看联系人

Thunderbird Conversations

把显示样式呈现的更友好


实现回复在前面

默认Thunderbird是将回复加在回复邮件的后面,可以通过修改配置项实现回复在前面,
首选项–>高级–>高级配置–>配置编辑器
找到配置编辑器,将 mail.identity.default.reply_on_top 这一项由默认的0改为1即可。


3列显示

在view显示为垂直视图



对ubuntu one有点失望

我本来是用ubuntu one,但是我先在使用ubuntu one来同步我的org笔记,同时我的org笔记又使用hg同步。
也就是一个文件夹同时使用hg和ubuntu one同步,结果发现ubuntu one同步总是出错,尤其是我使用hg fetch一个版本的时候。
经常把我一个文件夹的内容同步没了,幸亏我有hg,否则这些文件就丢失啦。
所以决定还是用dropbox吧,本来我手机使用dropbox来同步照片的,所以又申请了一个帐号,专门用于同步笔记。
而且最终要的是:
ubuntu one没有历史版本功能
而dropbox可以可以回退到以前的历史版本,这个非常好。


dropbox同步任意文件夹问题

本来还是我是打算用dropbox的,但是发现dropbox只能指定一个主目录,不想ubuntu one可以随便指定文件夹。
但后来发现,其实只要做一个软链接到Dropbox目录就ok了。
而且发现dropbox同步的速度非常快。


dropbox安装

需要使用https链接去登录dropbox主页,下边有如何安装的方式,很简单,就是wget一个压缩包,然后解压就ok了。
默认是.dropbox_dist目录。
然后启动dropboxd就ok了


ubuntu one的一些命令

查看当前传输字节数
u1sdtool --current-transfers
显示共享的文件夹
u1sdtool --list-folders
删除文件夹
u1sdtool --delete-folder=FOLDER_ID
其他命令使用–help查看

ssh的一些技巧


多条连接共享

如果你需要在多个窗口中打开到同一个服务器的连接,而不想每次都输入用户名,密码,或是等待连接建立,
那么你可以配置SSH的连接共享选项,在本地打开你的SSH配置文件,通常它们位于~/.ssh/config,然后添加下面2行:
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
现在试试断开你与服务器的连接,并建立一条新连接,然后打开一个新窗口,再创建一条连接,你会发现,第二条连接几乎是在瞬间就建立好了。


长连接

如果你发现自己每条需要连接同一个服务器无数次,那么长连接选项就是为你准备的:
ControlPersist 4h
现在你每次通过SSH与服务器建立连接之后,这条连接将被保持4个小时,即使在你退出服务器之后,这条连接依然可以重用,
因此,在你下一次(4小时之内)登录服务器时,你会发现连接以闪电般的速度建立完成,
这个选项对于通过scp拷贝多个文件提速尤其明显,因为你不在需要为每个文件做单独的认证了。


别再输入密码

如果你还在通过密码方式登录SSH,那么你或许应该试试SSH Keys,首先使用OpenSSH为自己声称一对密钥:
$ ssh-keygen
跟随指示,完成之后,你应该可以在你的.ssh目录下看到两个文件,id_rsa就是你的私钥,而id_ras.pub则是你的公钥,
现在你需要将你的公钥拷贝到服务器上,如果你的系统有ssh-copy-id命令,拷贝会很简单:
$ ssh-copy-id smylers@compo.example.org
否则,你需要手动将你的私钥拷贝的服务器上的~/.ssh/authorized_keys文件中:
$ < ~/.ssh/id_rsa.pub ssh clegg.example.org ‘mkdir -p .ssh; cat >> .ssh/authorized_keys; chmod go-w .ssh .ssh/authorized_keys’


或者 cat ~/.ssh/id_dsa.pub | ssh you@remote ‘cat - >> ~/.ssh/authorized_keys’
现在试试重新连接到SSH服务器,或是拷贝文件,是不是已经不需要再输入密码了?


省去用户名

如果你在远程服务器上的用户名和你本地的用户名不同,你同样可以在SSH配置中进行设置:
Host www* mail
HostName %h.example.com
User simon
现在就算我的本地用户名是 smylers,我仍然可以这样连接我的服务器:
$ ssh www2
SSH会使用simon账户连接你的服务器,同样,Putty可以保存这个信息在你的session中。


在服务器间跳转

有些时候,你可能没法直接连接到某台服务器,而需要使用一台中间服务器进行中转,这个过程也可以自动化。
首先确保你已经为服务器配置了公钥访问,并开启了agent forwarding,现在你就可以通过2条命令来连接目标服务器,不会有任何提示输入:
$ ssh gateway
gateway $ ssh db
然后在你的本地SSH配置中,添加下面这条配置:
Host db
HostName db.internal.example.com
ProxyCommand ssh gateway netcat -q 600 %h %p
现在你就可以通过一条命令来直接连接目标服务器了:
$ ssh db
这里你可能会需要等待长一点的时间,因为SSH需要进行两次认证,注意netcat也有可能被写成nc或者ncat或者前面还需要加上g,你需要检查你的中间服务器来确定实际的参数。


穿越Web代理

有些时候,你所在的网络不止封锁SSH端口,它们有可能更进一步,只让你通过Web代理来访问网络,幸运的是我们有一个叫做Corkscrew的程序可以通过Web代理来发送SSH数据。Corkscrew的使用非常简单,一般我都是在需要时搜索,然后直接下载,跟随网站上的指示,然后就搞定了,一般你需要这样一条配置:
ProxyCommand corkscrew proxy.example.org 8080 %h %p


shfs

另一种让远程GUI程序显示在本地的替代方案就是让本地的GUI程序可以直接操作远程文件,你可以通过SSHFS来实现,只需要创建一个空目录,然后使用SSHFS将一个远程目录mount到这个目录就可以了:
$ mkdir gallery_src
$ sshfs dev:projects/gallery/src gallery_src
$ cd gallery_src
$ ls
现在你就可以使用任何你喜欢的本地程序来便捷这个目录中的文件了,它们看起来是在你的本地,但其实时远程服务器上的文件,你可以使用fusermount命令来unmount这些文件,不要担心记不住,它们就在
sshfs手册的顶上:
$ cd ..
$ fusermount -u gallery_src
SSHFS可以在Linux和OSX上工作,Windows用户我目前还没找到什么好办法。


使用本地App连接远程服务器

有时可能有些服务,比如数据库或是Web服务器,它们运行在远程服务器上,但是如果有用方式可以直接从本地程序连接它们,那会非常有用,要做到这一点,你需要用到端口转发(port forwarding),
举个例子,如果你的服务器运行Postgres(并且只允许本地访问),那么你就可以在你的SSH配置中加入:
Host db
LocalForward 5433 localhost:5432
现在当你连接你的SSH服务器时,它会在你本地电脑打开一个5433端口(我随便挑的),并将所有发送到这个端口的数据转发到服务器的5432端口(Postgres的默认端口),然后,只要你和服务器建立了连接,你就可以通过5433端口来访问服务器的Postgres了。
$ ssh db
现在打开另外一个窗口,你就可以通过下面这条命令在本地连接你的Postgres数据库了:
$ psql -h localhost -p 5443 orders
如果你想要使用服务器不支持的图形化Postgres客户端时,这条命令会显得尤其有用:
$ pgadmin3 &
或者你有一个后台的Web服务器,你不希望直接通过Internet访问它,你也可以通过端口转发来访问它:
Host api
LocalForward 8080 localhost:80
现在连接到服务器:
$ ssh api
然后将浏览器指向你选择的端口号:
$ firefox http://localhost:8080/


减少延迟

如果每次连接服务器都意味着你需要等待几十秒而无所事事,那么你或许应该试试在你的SSH配置中加入下面这条:
GSSAPIAuthentication no
如果这条命令有效的话,你应该通知你的系统管理员让他在服务器上禁用这个选项,这样其他人就不用再分别添加这条配置到它们的本地配置了。
在server端修改:
/etc/ssh/sshd_config
添加
USEDNS no
service sshd restart


ssh-agent

如果你的密码加了密码,每次使用密钥都需要输入密码,则这时ssh-agent就起到作用了。
启动ssh-agent后,通过ssh-add ~/.ssh/id_rsa
把自己的私钥添加到agent后,以后再使用次密钥就不需要输入密码了。


保持链接不断

有的时候中间有防火墙,防火墙的session很短时间就会超时,导致ssh登录中断。需要在客户端这边配置。


只需要在sshd的配置文件上(/etc/ssh/sshd_config)加上两个选项就
行:ClientAliveInterval 10和ClientAliveCountMax 100000000。其中
ClientAliveInterval是保活数据包发送的时间间隔,这个数字可以自己选定,单
位是 秒;ClientAliveCountMax是保活数据包发送的次数上限,这里的设置应该是
无敌的。
TCPKeepAlive yes


A Unix Utility You Should Know About:lsof



前言

这是“你应该知道的Unix和Linux命令”系列的第三篇,在这篇文章中,我会介绍lsof这个工具,如果说netcat是进行网络诊断的瑞士军刀,那么lsof就是Unix调试的瑞士军刀。


Lsof是遵从Unix哲学的典范,它只做一件事情,并且做的相当完美——它可以列出某个进程打开的所有文件信息。
打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,明明管道,符号链接,Socket流,网络Socket,UNIX域Socket,以及其它更多。因为Unix系统中几乎所有东西都是文件,你可以想象lsof该有多有用。


如何使用lsof?


这篇文章中我会尽力列举我能想到的所有lsof的用法,让我们先从最简单的开始(或许你已经知道了),然后逐渐增加复杂度:


列出所有打开的文件


lsof


不带任何参数运行lsof会列出所有进程打开的所有文件。


找出谁在使用某个文件


lsof /path/to/file


只需要执行文件的路径,lsof就会列出所有使用这个文件的进程,你也可以列出多个文件,lsof会列出所有使用这些文件的进程。


你也可以一次制定多个文件:


lsof /path/to/file1 /path/to/file2


递归查找某个目录中所有打开的文件


lsof +D /usr/lib


加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢:


= lsof | grep ‘/usr/lib’ =


之所以慢是因为+D首先查找所有的文件,然后一次性输出。


列出某个用户打开的所有文件


lsof -u pkrumins


-u选项限定只列出所有被用户pkrumins打开的文件,你可以通过逗号指定多个用户:


lsof -u rms,root


这条命令会列出所有rms和root用户打开的文件。


你也可以像下面这样使用多个-u做同样的事情:


lsof -u rms -u root


查找某个程序打开的所有文件


lsof -c apache


-c选项限定只列出以apache开头的进程打开的文件:


所以你可以不用像下面这样写:


lsof | grep foo


而使用下面这个更简短的版本:


lsof -c foo


事实上,你可以只制定进程名称的开头:


lsof -c apa


这会列出所有以apa开头的进程打开的文件


你同样可以制定多个-c参数:


lsof -c apache -c python


这会列出所有由apache和python打开的文件


列出所有由某个用户或某个进程打开的文件


lsof -u pkrumins -c apache


你也可以组合使用多个选项,这些选项默认进行或关联,也就是说上面的命令会输入由pkrumins用户或是apache进程打开的文件。


列出所有由一个用户与某个进程打开的文件


lsof -a -u pkrumins -c bash


-a参数可以将多个选项的组合条件由或变为与,上面的命令会显示所有由pkrumins用户以及bash进程打开的文件。


列出除root用户外的所有用户打开的文件


lsof -u ^root


注意root前面的^符号,它执行取反操作,因此lsof会列出所有root用户之外的用户打开的文件。


列出所有由某个PID对应的进程打开的文件


lsof -p 1


-p选项让你可以使用进程id来过滤输出。


记住你也可以用都好来分离多个pid。


lsof -p 450,980,333


列出所有进程打开的文件除了某个pid的


lsof -p ^1


同前面的用户一样,你也可以对-p选项使用^来进行取反。


列出所有网络连接


lsof -i


lsof的-i选项可以列出所有打开了网络套接字(TCP和UDP)的进程。


列出所有TCP网络连接


lsof -i tcp


也可以为-i选项加上参数,比如tcp,tcp选项会强制lsof只列出打开TCP sockets的进程。


列出所有UDP网络连接


lsof -i udp


同样udp让lsof只列出使用UDP socket的进程。


找到使用某个端口的进程


lsof -i :25


:25和-i选项组合可以让lsof列出占用TCP或UDP的25端口的进程。


你也可以使用/etc/services中制定的端口名称来代替端口号,比如:


lsof -i :smtp


找到使用某个udp端口号的进程


lsof -i udp:53


同样的,也可以找到使用某个tcp端口的进程:


lsof -i tcp:80


找到某个用户的所有网络连接


lsof -a -u hacker -i


使用-a将-u和-i选项组合可以让lsof列出某个用户的所有网络行为。


列出所有NFS(网络文件系统)文件


lsof -N


这个参数很好记,-N就对应NFS。


列出所有UNIX域Socket文件


lsof -U


这个选项也很好记,-U就对应UNIX。


列出所有对应某个组id的进程


lsof -g 1234


进程组用来来逻辑上对进程进行分组,这个例子查找所有PGID为1234的进程打开的文件。


列出所有与某个描述符关联的文件


lsof -d 2


这个命令会列出所有以描述符2打开的文件。


你也可以为描述符指定一个范围:


lsof -d 0-2


这会列出所有描述符为0,1,2的文件。


-d选项还支持其它很多特殊值,下面的命令列出所有内存映射文件:


lsof -d mem


txt则列出所有加载在内存中并正在执行的进程:


lsof -d txt


输出使用某些资源的进程pid


lsof -t -i


-t选项输出进程的PID,你可以将它和-i选项组合输出使用某个端口的进程的PID,下面的命令将会杀掉所有使用网络的进程:


kill -9 `lsof -t -i`


循环列出文件


lsof -r 1


-r选项让lsof可以循环列出文件直到被中断,参数1的意思是每秒钟重复打印一次,这个选项最好同某个范围比较小的查询组合使用,比如用来监测网络活动:


lsof -r 1 -u john -i -a


如何安装lsof?


许多Unix系统都内置了lsof,如果你的系统没有安装,你可以从这里直接下载源代码。


BSD系统有一个类似的工具可以做同样的事情,叫做fstat。


你可以通过man lsof来了解关于lsof的完整文档,或者通过lsof -h查看。


functional-programming-is-hard-thats-why-its-good


函数式编程很难,这正是你要学习它的原因

很奇怪不是,很少有人每天都使用函数式编程语言。如果你用Scala,Haskell,Erlang,F#或某个Lisp方言来编程,很可能没有公司会花钱聘你。这个行业里的绝大部分人都是使用像Python,Ruby,Java或C#等面向对象的编程语言——它们用起来很顺手。不错,你也许会偶然用到一两个“函数式语言特征”,例如“block”,但人们不会去做函数式编程。


然而,很多年来,我们一直被教导说函数式编程语言很好很棒。我仍然记得当我第一次阅读ESR的著名的关于学习Lisp语言的论文时的困惑。也许大多数的人对Paul Graham 的《Beating The Averages》这篇文章更加熟悉:


使用Lisp开发使我们的开发周期迭代的如此之快,以至于有时当竞争对手在新闻发布会上推出他们的新功能一两天后,我们就能复制出同样的功能。当报道产品发布的新闻记者打电话给我们时,我们的产品已经拥有了同样的功能特征。


那些皈依函数式编程的人中,一直常见的考虑是:学习这种新的、函数式的语言“对你有好处”;就像是某些人建议说每天30分钟的健身房活动会“让你的身体健康”一样。但这也同时暗示了这样做的难度和需要的付出。Lisp语言跟Haskell、Ocaml和Scala语言不同,被认为是出了名的难学,可以说是臭名昭著。文雅的人说这是Lisp语言的“深度&广度”的体现。不文雅的人说这是“意淫”或“玩弄学术”或简单的“没必要”。我认为,它的难度跟你对它熟不熟悉有关,而且,这种难度是一种重要指标显示:学习这样的一种语言会让你编程更有效率、能力更强。


can your programming language do this


你的编程语言能这样做吗?

一日,你查看你的程序代码,你有两大块代码看起来几乎完全的一样。事实上它们就是完全一样,除了一个代码里说的是“Spaghetti(意大利面条)”,另一个代码里说的是“Chocolate Moose(巧克力慕丝)”。


// 一个小例子:

alert("I'd like some Spaghetti!");
alert("I'd like some Chocolate Moose!");
这个例子恰好是用Javascript写的,但即使是你不懂Javascript,你也应该能看懂我说的。


当然,重复的代码看起来不太好。所以你决定写一个函数:


function SwedishChef( food )
{
    alert("I'd like some " + food + "!");
}

SwedishChef("Spaghetti");
SwedishChef("Chocolate Moose");
没错,这个例子很简单,但你可以想出一些更有实际价值的例子。这样做是更好一些,有很多理由,这些理由估计你都听说过一万遍了。可维护性,可读性,抽象 = 好!


org-mode学习笔记


头信息注释


#+TAGS: { 桌面(d) 服务器(s) }  编辑器(e) 浏览器(f) 多媒体(m) 压缩(z)
#+TAGS:  { @Windows(w)  @Linux(l) }  
#+TAGS:  { 糟糕(1) 凑合(2) 不错(3) 很好(4) 极品(5) } 
#+SEQ_TODO: TODO(T) WAIT(W) | DONE(D!) CANCELED(C@) 
#+COLUMNS: %10ITEM  %10PRIORITY %15TODO %65TAGS

  1. 启动时概览
  2. 设定标签,括弧中的为标签快捷键(如果没有指定,默认为首字母)。可以设置在多行中
  3. 花括号为标签组,组中的标签只能选一个
  4. 设定待办状态。将项设置为 | 后面的状态时(DONE CANCELED),会打上 CLOSED 标志
  5. 设定列视图
  6. 更新了参数后在参数区域按C-c C-c进行更新


这里的内容可以随时更改,但是要记得在改后用 C-c C-c 刷新设置