chels:

seafarers:

Aerial Views of Icelandic Rivers

Oof, Iceland. Breakin’ my heart with your beauty.

冰岛的河。

如果用过 ssh 连接远程电脑,就会发现,无论是哪个系统,Ubuntu,或者 Windows,输入都会有很大的延迟。你输入了好多文字,它却要缓上好一会儿才显示得出来。

这是折腾 Mosh(Mobile shell) 的初衷。

首先,要使用 Mosh,需要在客户端及服务器端都安装它,或者在服务器端至少安装 mosh-server。Ubuntu 下可以通过 ppa 安装的:

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:keithw/mosh
$ sudo apt-get update
$ sudo apt-get install mosh

因为 Mosh 使用的是 UDP 端口,所以服务器上需要打开某 UDP 端口。

假设 Mosh 使用 60001 UDP 端口,则在服务器上运行:

$ sudo iptables -I INPUT -p udp --dport 60001 -j ACCEPT

这样就在服务器上打开 60001 UDP 端口。当然,最好是把上一条命令写入服务器 firewall 的规则中,这样不必要每次都手动打开这个端口。

接下来就是从客户端连接:

$ mosh -p 60001 sam@zfanw.com

p 参数用于指定 UDP 端口。

假如你的 SSH 连接 设置公钥/私钥连接,比如 ssh zfanw 即可直接连接服务器而无需输入密码,则 mosh 命令也可以以 mosh zfanw 的形式连接,基本上,可以把它当作 ssh 命令的替换,只不过 ssh 开的是 TCP 口,mosh 开的是 UDP 口。

效果如何?开两个窗口,一个直接 ssh 登录,一个通过 mosh 登录,对比输入一下就知道了 – 当然是 mosh 的输入流畅。

Mosh 有很多强于 ssh 的特性,比如连接不会掉,你可以盖上笔记本电脑让它休眠,然后再打开,mosh 的连接还在,而如果是 ssh 的话,直接就断掉。

不过折腾过程中真是碰上不少问题,比如 locale 问题,后来莫名地就折腾好了 – 本来还想写一篇关于 Locale 的内容,现在省了。

FQDN 全称叫 Fully qualified domain name,举个例子:

www.zfanw.com

其中 www 是主机名即英文的 hostname,表示域名指向的是 World-Wide Web 服务器,简单地说,可以把它理解成计算机的名称。比如我 Ubuntu 的计算机名称叫 Sam,登录的用户名为 sam,则打开 terminal emulator,命令行上能看到 sam@Sam,表示 Sam 计算机上的 sam 用户目前正在使用中。如果是 Windows 系统,则可以通过系统属性查看“完整的计算机名”,如果你有打开过 Windows 网上邻居,经常能看到各种五花八门的计算机名,这些就是所谓的 hostname。

zfanw 是二级域名(Second-Level domain),.com 是顶级域名(Top-Level domain),类似的顶级域名还有 .org、.net 等。

至于平时常见的 http,它是个互联网协议,类似的还有 ftp 等,这个与 FQDN 倒是无关。

在 Linode 的文档中,有一节写的是设置 hostname。因为这个设置与后期安装 Apache 有关,所以有此一篇说明。

Linode 的这节文档中给出的设置 /etc/hosts 文件的参考例子是:

127.0.0.1        localhost.localdomain    localhost
12.34.56.78      plato.example.com        plato

其中 plato 是主机名,plato.example.com 正是所谓的 FQDN,这需要你先通过 DNS 设置绑定一个子域名到你的 Linode 服务器 ip 上。

比如我可以到我的域名商 DNS 面板做一个 A 记录,解析 plato.zfanw.com 到 xxx.xxx.xxx.xx 这个 ip 地址,即 Linode 服务器的 ip 上。

然后到 /etc/hosts 文件中增加如下一行:

xxx.xxx.xxx.xxx plato.zfanw.com plato

参考例子中,localhost 应该是个特殊的主机名,如果你是第一次通过 ssh 登录到 Linode 服务器,可以看到 shell prompt 显示的是 root@localhost,按我粗浅的理解,localdomain 应该也是个特殊域名。不过这两个我们可以不用管,默认即可。

保存 /etc/hosts 文件后 logout 出服务器,再登录可以看到,shell prompt 已经变成 root@plato 而非 root@localhost。

使用命令 hostname --fqdn 显示的结果是 “plato.zfanw.com”。

这样,就完成了 Linode FQDN 的设置。如果光设置 hostname 且更新 /etc/hosts 内容而不曾解析二级域名,后期在安装完 Apache 后重启会出现如下错误:

apache2: apr_sockaddr_info_get() failed for plato

apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.0.1 for ServerName

对的,我折腾这一篇纯是因为这个错误,不然我实在懒得再开 DNS 解析一个二级域名。因为 Linode 明明已经有个 FQDN,lixxx-y.members.linode.com 这样的格式

最后附一个我的 Linode Referal URL,作用是如果你通过这个 URL 购买了 Linode 服务器并且使用达 3 个月以上,我就可以收到 Linode 返还的 $20 美金,相当于 Linode 512 套餐一个月的价格,如果吃快餐的话,可以吃上 10 顿左右,下馆子大概一次搞定 – 当然,如果你在厦门,我不介意一起下馆子,反正,花的是 Linode 的钱。

一个网站,图片或 CSS 、JavaScript 等文件一般都不经常修改,这样,当用户再次访问时,完全可以直接从浏览器缓存中读取这些文件,这样可以加快用户再次访问的速度,二来服务器需要返回的内容少了,可以减小服务器的负担。

logo 这样的整站使用的图片也是一样,a 页面请求过了,b 页面就没必要再向服务器请求,可以直接从浏览器缓存中读取。

设置方法

设置缓存的方法有多种,这一种是通过修改 HTTP headers。

假设服务器是 Apache,可以通过配置 .htaccess 文件来启用缓存:

<IfModule mod_expires.c>
    # 启用缓存
    ExpiresActive On

    #默认缓存时间为 1 天
    ExpiresDefault "access plus 1 day"

    #图片的缓存时间设置为一周
    ExpiresByType image/x-icon "access plus 7 days"
    ExpiresByType image/jpeg "access plus 7 days"
    ExpiresByType image/png "access plus 7 days"
    ExpiresByType image/gif "access plus 7 days"


    ExpiresByType application/x-shockwave-flash "access plus 7 days"

    #CSS 的缓存时间也设置成一周
    ExpiresByType text/css "access plus 7 day"

    #Javascript 的缓存时间同样设置为一周
    ExpiresByType text/javascript "access plus 7 day"
    ExpiresByType application/x-javascript "access plus 7 day"


    ExpiresByType text/html "access plus 10 minutes"
    ExpiresByType application/xhtml+xml "access plus 10 minutes"
</IfModule>

以上设置针对不同类型文件设置不同的有效期限,比如 jpeg/png/gif 图片,从用户第一次访问算起,7 天内有效,如果用户在 7 天内还访问这个网站,则直接从浏览器缓存中读取该图片,无需服务器上再返回。

打开 firebug,启用 Net 面板,刷新页面,如果看到有返回的状态是 304 Not Modified 的图片或 CSS 文件,说明设置成功。

以我博客首页来看,设置浏览器缓存后,首页总共 23 个请求,内容大小 417.8 KB,其中有 404 KB 是从缓存中直接读取的,也就是说,服务器上只需要传输 13.8 KB 内容给客户端。

参考

  1. w3 – caching in http
  2. cache docs
  3. Apache mod_expires
  4. Apache mod_headers

如果你有一个 SSH 账号,允许你登录到远程电脑,那么可以将 Firefox 请求的数据通过 SSH tunnel 发送给远程电脑,借助远程电脑访问你想要访问的信息,可以保证信息一定程度上的安全。

首先,通过 SSH 连接上远程电脑:

$ ssh -D 9999 -C 4yl@zfanw.com

D 参数表示 SSH 隧道在本地电脑监听的端口,C 参数指示压缩传输的数据。这样我们就利用 SSH 转发端口功能在本地电脑与远程电脑之间建立起一条安全通道。

接着是启用 Firefox 的 SOCKS 代理,打开 firefox 的首选项中的网络,选择“设置”然后进入代理配置对话框,按下图所示填入信息:

firefox代理设置

这样,firefox 浏览器所请求的数据将通过 SSH tunnel 发送给远程电脑,再由远程电脑代理我们请求。

不过,上面的设置中,firefox 发出的 DNS 请求并没有走 SOCKS 代理,如果需要(一般都需要),可以在 firefox 中增加一个设置,如下:

在 firefox 中打开 about:config,右击新建一个布尔值选项,填入名称 network.proxy.socks_remote_dns,然后将值设置为 true,这样,当 firefox 启用 SOCKS 代理时,DNS 请求同样经由 SSH 隧道,如果关闭 SOCKS 代理,该选项自动失效。

可是,如果经常要切换 SOCKS 代理呢?总不能时不时要打开代理设置对话框。当然,可以考虑装一个 firefox 扩展,不过我 firefox 上扩展的数量已经不下 10 个了,没打算为着这么个小功能特意装个插件。

autoproxychanger.js

如果你使用 Vimperator 扩展,则可以安装 autoproxychanger.js,这是一个 vimperator 脚本扩展,用于通过命令行控制代理的切换、开关。

首先将其安装到 .vimperator/plugin/ 目录下,然后打开 .vimperatorrc 配置文件,加入如下两行内容:

let autochanger_proxy_settings = "[{ name:'disable', usage: 'direct connection', proxy:{type:0} },{ name:'socks', usage: 'ssh tunnel', proxy:{type:1,socks:'localhost',socks_port:9999,no_proxies_on:'localhost,127.0.0.1',}}]"

let autochanger_proxy_enabled="true"

保存,然后重启 firefox,按 : 进入命令行模式,输入命令 proxy,再按一个空格,可以看到有三个自动补齐项:

  1. default
  2. disable
  3. socks

选择 socks 即可启用 firefox 的 SOCKS 代理,disable 则是不使用代理。

前些日子买了个 ssh,想着总有机会使用到,但来来去去,实在找不到大用处,后来都差点遗忘了它。但我总算找到一个用处,就是当 ftp 使,往服务器上传文件。

很多空间服务器商在卖给你空间的同时,其实都有配一个 ssh,用于建立安全通道,保证访问空间的同时数据的安全性。

比如我的博客空间,可以通过以下命令访问到服务器上的内容(本文基于 Ubuntu12.04 系统):

$ ssh zfanwcom@zfanw.com

zfanwcom 指用户名,zfanw.com 指 ssh 服务器地址。随后会要求输入登录密码。

登录到服务器上后,可以使用 ls 命令查看默认目录下的内容,这些内容与用 ftp 连接看到的内容一样,只不过数据的传输要比 ftp 安全。而如果使用命令 pwd 查看当前目录,则显示的是 /home/zfanwcom,即用户主目录。

输入密码的方式有几个不好之处,一是如果密码太复杂太长,不方便输入,另外安全性也差,因为只是个密码。因此 ssh 还有其他方式登录,比如公钥/私钥。

据我经验,很多服务器上都提供生成 ssh 公钥/私钥的功能,先在服务器空间生成一对公钥/私钥,然后将私钥下载到电脑上,假设名称为 id_rsa,保存到 ~/.ssh/ 目录下,

注意,需要更改该私钥的读写权限为 rw-------,如果权限设置不正确,ssh 会拒绝使用。

$ chmod 600 id_rsa

接下来可以通过如下命令来访问服务器:

$ ssh -i $HOME/.ssh/id_rsa server

这样我们就不需要输入密码。但这样还是需要输入服务器地址,所以还有一个更简便的方法,就是设置 ssh config 文件。

打开 ~/.ssh/config 文件,写入以下内容

Host zfanw
    HostName zfanw.com
    Port    22
    User    zfanwcom
    IdentityFile    ~/.ssh/id_rsa

保存后在命令行输入 ssh zfanw 即可以不输入密码访问空间服务器,但可能还需要输入一个 passphrase,这是用于加密私钥用的,如果偷懒,可以设置得简单一点,又或者不设置。

以上是在空间服务器上生成一对公钥/私钥的,那么如果在本机生成一对公钥/私钥,则可以使用 ssh-keygen 命令:

$ mkdir -p $HOME/.ssh
$ chmod 0700 $HOME/.ssh
$ ssh-keygen -t rsa

根据提示操作,这样就在 ~/.ssh/ 目录下会生成一个私钥 id_rsa,一个公钥 id_rsa.pub,接着用 ssh-copy-id 命令将公钥拷贝到 ssh 服务器上,这个方法能省去很多拷贝、设置权限的操作:

$ ssh-copy-id ~/.ssh/id_rsa.pub zfanwcom@zfanw.com

然后输入密码,就将公钥加入到 ssh 服务器上的 ~/.ssh/authorized_keys 里。

接下来通过配置 .ssh/config 文件来更简便地连接 ssh 服务器。

需要说明的是,一对公钥/私钥应该可以通用,也可以分别针对不同服务器生成各自的公钥/私钥,比如为 github 服务器生成 github_id_rsa/github_id_rsa.pub,zfanw 服务器则使用 zfanw_id_rsa/zfanw_id_rsa.pub,这是鸡蛋放不同的篮子,如果一个出问题不会影响到另一个。

参考

  1. Wikipedia 上的 ssh-keygen 词条
  2. Simplify Your Life With an SSH Config File
  3. Generating SSH Keys – github

前些天,在福州的朋友来电,说是把她的花店转让出去了。还说她现在有钱了,问我要不要借钱。

我曾经在博客上写过一篇,略微介绍给她张罗花店网站的事 – 那是拖了好久才完成的。我现在记不清具体时间,也懒得翻博客,只隐约觉得是在今年年初。则从那时到现在,大约过去半年时间。当然,她的花店开了可不止半年。去年的某个时候,我到福州,还开了 foursquare check in 了一回

花店的名字,叫“此前经年鲜花屋“,”此前经年”四字,是她开店前与我聊天所得,纯是偶然,现在来看,倒也应了点冥冥之中的什么。虽然她信基督,我无信仰,说“冥冥之中”其实欠妥。

至于说我没有信仰这件事,却其实有个小缘由。上上份工作,有一次,公司的一个女同事问我,xxx,你信佛吗?我回说不信。她又问,那信基督?我还回说不信。然后她恍然大悟似地说,哦,你没信仰。我当然不承认自己没信仰,我当时甚至在心里讥讽说,我的信仰,可比你的信佛坚定多了呢。此后,因为某些同学所谓的我的“鸡婆”即“三八”性格,时时要把“我没信仰”挂在嘴边来嘲弄谁一番。

你不开花店,准备做什么。我问她。

朋友说,准备去学英语,那个什么课程都已经买了一学期。

我马上把我表哥那儿听来的无聊事拿出来讲。说是他在美国的时候,认识一些在美国的中国妓女,因为并不怎么懂英语,于是就去参加“床上英语”培训,学些床上办事时该用的英语。具体是什么我其实不清楚,不过自己一翻脑补,则大抵不过 “oh fuck me, yeah, yeah, you are so good……”。

她当然是骂了我,用当下流行的“你妹的”骂我。不过我脸皮厚,耐得住这种骂。只是每每害我妹挨骂,不知她心里作何想。也许也要骂我“你妹的”?

我其实并不经常折腾手机。

就说最近,只偶尔刷刷 CM10 Nightly 版本。所以对 SuperCharger 的存在一直都不知道,直到昨天看到 [不折腾会死]系列之 Android最强优化脚本V6 Supercharge简单流程 ,才知道还有这玩意儿。

看下它的介绍:

SuperCharger = Speed + Multitasking!

No more lag! No more launcher redraws! Smooth & Snappy!

It’s the ONLY Complete Memory Management Fix!

There is NOTHING ELSE LIKE IT!

It Runs Like A…

这段文字后是一张配图,一幅地狱场景,一个人骑在摩托车上,因为车速太快,整个身体向后跌去,表示你一定要牢牢抓住。

这样我们就大概知道 SuperCharger 是干什么的。

不过它的教程真的是看着头疼,就好像一个人开了 Word 软件,然后到处加粗字体,突出颜色,链接来来去去不知多少趟。

所以,这是一篇再再(再的应该是不折腾会死系列)整理的内容,在我的 Motorola Defy 即 ME525 手机上操作。请先阅读不折腾会死的那一篇,对整个操作的必要条件等作个了解。

安装本管理工具 – SManager

Google Play 上下载 SManager 并安装,这个应用用于运行脚本,如果更喜欢命令行工具的话,很多 ROM 里都提供有终端模拟器,可以通过它来运行脚本。

安装 SuperCharger Starter Kit

这个工具包是为后面作准备,它会给系统安装 fixed su binary,zipalign binary,sqlite3 binary 和 busybox v1.19.4,如果系统上已经有了(比如 CM10 就没必要),就直接跳过。

安装方法是从 XDA 论坛上下载最新的 SuperCharger_Starter_Kit_RCXX.zip 压缩包,解压并上传到 SD 卡根目录下。

然后通过 SManager 工具运行解压出的 SuperCharger_Starter_Kit 目录下的 StartMeUp.sh 脚本,它会自动安装以上列出的一切。

给 services.jar 打补丁

作用不多提,总之是种种好 – 按作者的说法。

过程还是根据 XDA 上面的教程

首先打开 ”Ultimate Jar Power Tools“ 页面,在该页面查找 ”Attached Files“,当下时间该附件名称为 ”ALL_ROMS_Ultimate_Jar_Power_Tools-Smali_Patcher_Test_RC1.sh.txt“,另存到电脑上,把 .txt 扩展名去掉,还原它的脚本扩展名 .sh。

hotfile 链接下载 jar_file_decompile_and_compiler_with_tutor.zip 文件,解压到 C:\super 文件夹下(操作系统为 Windows xp)。

Google code 网站上下载两个最新版的 jar 文件,分别重命名为 smali.jar 和 baksmali.jar,放入 C:\super 文件夹,覆盖掉原有的两个同名文件。

进入手机 /system/framework/ 目录,复制一份 services.jar 文件放入 C:\super 文件夹。(注意备份一个 services.jar 文件

打开 Windows 系统的 cmd 窗口:

$ cd c:\super
$ java -jar baksmali.jar -x services.jar -o classout

将 services.jar 文件反编译到 classout 文件夹,可以看到 C:\super 文件夹下多出来 classout 文件夹。

进入文件夹 C:\super\classout\com\android\server\am,找到 ActivityManagerService.smali 与 ProcessList.smali 文件(ICS 与 Jelly Bean 需要这两个文件,其他版本有所不同),将这两个文件并上面下载的 ALL_ROMS_Ultimate_Jar_Power_Tools-Smali_Patcher_Test_RC1.sh 文件一同存入 SD 卡某一目录,假设为 ultimate 目录。

打开手机上的 SManager,定位到 ultimate 目录,运行 ALL_ROMS_Ultimate_Jar_Power_Tools-Smali_Patcher_Test_RC1.sh 脚本。

基本上就是一路 yes 下去,完成后 ultimate 目录后的两个 smali 文件拷回 C:\super\classout\com\android\server\am,覆盖。

回到 cmd 窗口,仍是在 C:\super 目录下:

$ java -Xmx512M -jar smali.jar classout -o classes.dex

在 C:\super 目录下生成一个 classes.dex 文件。

使用压缩软件打开 C:\super 目录下的 services.jar 文件,然后将 C:\super 目录下新生成的 classes.dex 拖入,覆盖旧的 classes.dex,这样就生成一个新的 services.jar 文件。

(以上办法纯手工操作,非常麻烦,所以 XDA 上还提供了一个在 Windows 系统下的简便方法)。

将新的 services.jar 文件上传到手机 SD 卡上,然后设置 /system 目录可读写,将其拷入 /system/framework 覆盖掉原来的 services.jar – SManager 就可以完成这样的操作。

打开终端模拟器:

$ cd /system/framework
$ su
$ chown 0.0 services.jar //将文件所有者/组更改为 root,注意是数字 0,不是字母 o,0.0 表示 root.root
$ chmod 644 services.jar //设置文件读写权限

(分享一下我打过补丁的 services.jar,请谨慎使用,出问题一概不负责)

然后重启,进入恢复模式,清空 Dalvik Cache,

运行 SuperCharger 脚本

具体步骤 XDA 上都有,打开该页面,搜索 “Installing/Using” 就可以看到。其实过程非常简单。

下载最新版 SuperCharger,比如当下时间 ”V6_SuperCharger_for_Android-Update9_RC10.sh.pdf “,另存到电脑,去掉 .pdf 扩展名。上传到手机 SD 卡根目录。

打开 SManger,定位到 SD 卡根目录,运行 V6_SuperCharger_for_Android-Update9_RC10.sh 脚本,根据提示操作,直到最后。这个过程所花的时间不短,所以请在电量很足的情况下操作。

运行结束后,系统要求重启,进入系统后显示正在优化应用……

以上。

Ubuntu 下的 OpenVPN 设置与 Android OpenVPN 设置很相近。

首先是在 Ubuntu 系统安装 OpenVPN:

$ sudo apt-get install openvpn network-manager-openvpn

接着打开网络设置,Gnome 下叫 network connections,如下:

ubuntu vpn 设置

选择 “VPN” 标签 -> Add

ubuntu 选择 vpn 连接类型

列表项中选择 OpenVPN,

openvpn 具体设置

填入需要的信息,Authentication 选择 password,CA 文件选择从 VPN 服务器下载的 crt 文件,接着点击 Advanced 进入高级设置:

openvpn 高级设置

将 General 标签页如上图所示的两个选项勾起来,第一个填入相应的端口。

然后保存。接下来连接这个 OpenVPN 就可以。

Android 自 ICS 4.0 版本起,在手机上使用 VPN 就会强制要求启用 PIN 码或者密码。对我来说,这非常麻烦,于是有很长一段时间,我都懒得在手机上开 VPN。

直到有一天,在时间线上发现的 OpenVPN for Android 这款应用

OpenVPN for Android 是一个 OpenVPN 客户端,无需 root 系统就能使用,另外,也是最重要的,就是无需启用 PIN 码或密码。而且设置简便,只不过系统版本要求 4.0 以上。

首先,你需要一个 OpenVPN 账户,免费的、收费的均可。登录你的账户,根据你 VPN 提供商的说明下载 ca 文件,保存为 openvpn.crt,然后传输到手机上备用。

在手机上安装好 OpenVPN for Android,打开,如下:

选择 vpn 列表

如上图所示,点击 “VPN 列表”进入下一个界面

添加 vpn 配置

选择上图中右上方的加号图标,添加配置文件,名称任取

基本配置内容

设置界面有许多内容,据我经验,只要设置”基本“就可

点击”基本“后将进入具体设置内容,如下图:

openvpn 具体设置内容

将已有的资料填入上图,比如 VPN 地址,端口,用户名,密码,其中 VPN类型 选择 用户名/密码,CA 证书选择之前下载保存的 openvpn.crt。后退即自动保存信息。

之后连接即可。而且据我的使用经历,OpenVPN 要比 PPTP/L2TP 连接稳定多了。