受精力所限, 光线誌近来打理的很少, 虽然访客不多, 但从访问日志来看, 每天还是有很多恶意性质的访问. 在恶意访问当中, 对于 WordPress 的试探性攻击占了绝大多数, 例如尝试登录后台, 或是发起 XML-RPC 攻击, 等等. 博客在改造之前, 经常会完全宕掉, 无法连接数据库或是完全不能访问, 是因为经常遭到大量的 XML-RPC 请求, 无端占用 CPU / 网络资源, 处理起来有些恼人.
WordPress 容易遭受攻击与其繁多的功能是脱离不了关系的, 但其中很多功能我并不需要, 只要一个纯粹的博客就好. 与 WordPress 这类需要依靠后台生成内容的博客相对, Jekyll, hexo 等全静态化博客系统正越来越流行, 它们只在文章发布时运行以生成静态资源, 访问时完全不依赖后台服务. 没有了可以直接调用的服务, 博客运行起来将省心不少, 于是我将博客迁移到了 hexo, 开始了 Docker 化改造的第一步.
Docker 有其最佳实践, 在对博客进行 Docker 化改造时, 建议每个容器只提供一个单一的服务, 类似于时下提倡的微服务, 将一个完整的系统拆分为多个独立的容器, 维护起来更加省心.
目前博客运行的容器为:
要管理这四个 Docker 容器其实也是件很麻烦的事情, 使用 docker-compose 可以快速的编排容器, 负责构建, 连接, 启动容器, 并在容器挂掉的时候自动重启. 服务器启动完成之后, docker-compose 就会负责帮我们把博客启动起来, 十分省心.
最近恰逢阿里云双十一, 限定几种规格的云服务器卖的非常便宜 (1 核 1 GB 内存的 ECS 价格为 720RMB/3yr, 2 核 4GB 内存的 ECS 价格为 1500 RMB/3yr), 我将博客搬到了新购的服务器上. 但服务器的带宽只有 1Mbps, 如果要加带宽价格非常高, 由于已经完成了博客的静态化, 实际上带宽问题很好解决了:
CDN 迁移的成本比 OSS 要小, 而且 cdn 一般在各地都由部署节点, 速度上肯定比单一的 OSS 要快. 腾讯云 CDN 每个月都有 10 GB 的流量, 对于我的博客来说基本上不用花钱了😂.
最终, 我的博客结构成了这个样子:
]]>Docker 能带给个人博客什么好处呢? 我想了想, 大概有这几点:
最主要的, 是 Docker 镜像开箱即用的特性, 它大大简化了网站的部署过程.
Dockerfile
来构建), 而且 Docker 允许我们指定基础镜像, 不必从零开始. 这样做的好处是, 如果将应用迁移到另一台不同的主机上, 由于 Docker 提供了应用与系统之间的抽象层次, 使得我们可以不配置或少量配置应用, 就能在另一台主机上启动起来 (感觉像是某种语言宣传的一次编写, 到处运行 [误]).Docker 占用资源少.
Docker 的容器技术比普通虚拟机快得多, 几乎感受不到 Docker 中运行的应用在速度上的差别, 内存占用也相当小, 即使是一个配置较差的 VPS, 也能顺畅的运行 Docker.
运行在 Docker 中的应用较为安全.
Docker 提供的容器具有一定的隔离能力, 容器与宿主机之间, 容器与容器之间基本上是不能感知的. 例如:
Docker 使用 namespace 来隔离资源, 容器不能访问其它 namespace 的资源; 例如 Docker 对容器的 PID 进行了隔离, 容器内部看到的 PID 为 1 的进程, 在容器外部会是另一个 PID. Docker 已提供了附表中的 namespace 隔离.
需要说明的是, 当前版本 (1.13.1) 的 docker 默认没有开启 user namespace 的隔离, 一些 linux 发行版甚至默认没有开启对 user namespace 的支持. 要在 docker 上隔离 user namespace, 可以参考 Docker安全之用户资源隔离.
Docker 还可以与 SELinux 结合, 实现对权限更加细致的控制.
值得注意的是, Docker 的安全只是相对于应用直接在宿主机中运行而言的, Docker 的安全性仍存在很多质疑, 并不推荐在 Docker 中运行不明来源的程序,
Docker 是免费的.
开源, 免费, 想用就用.
由此, 博客 VPS 上几乎所有的服务都运行在了 Docker 中, 结合 Docker Compose, 实现一整套应用一键启停和自动重启. 接下来的文章将记录下现在的架构.
附: Docker 的 namespace 隔离:
namespace | 引入支持的 Linux 内核版本 | 被隔离的资源 | 隔离效果 |
---|---|---|---|
mount | Linux 2.4.19 | 文件系统挂载点 | 容器内部只能访问指定的文件系统, 且结构与宿主机无关 |
uts | Linux 2.6.19 | 主机名与域名 | 每个容器有独立的主机名与域名 |
ipc | Linux 2.6.19 | 进程间通讯资源, 如共享内存 | 只有同一个 ipc 内的进程才能互相通信 |
pid | Linux 2.6.24 | 进程 id | 每个容器都有独立的进程 id, 容器内每个进程的内部和外部 pid 不一样 |
network | Linux 2.6.24 - 2.6.29 | 网络 | 每个容器都有独立的网络设备, 网络栈, 端口等 |
user | Linux 2.6.23 - 3.8 | 用户和用户组 | 每个容器内进程的用户和用户组 id 与容器外不同 |
首先按照惯例, 介绍一下小伙伴们. 先说组长, 也是我的队友 @淓徽, 为了战狼队的粮票表现灰常积极, 也在做推荐系统的时候, 和我一起努力为系统的前端添砖加瓦; 另一位队友 @鸭绒, 担负测试的重任, 也兼任前端, 她的认真, 也让人敬佩.
为了不落俗套, 我将先介绍数据再介绍后端.
数据童鞋有: @夕岚, 自我介绍时就强调过自己很高的妹子, 坐在她旁边比较有鸭梨; @仕明, 萌萌哒自拍狂魔, 占据了 1505 期自我介绍的黄金广告位; @沁钊, 研究生同班童鞋, 「然并卵」组员之一.
后端的朋友们, 你们好吗? 让我看到你们的双手!
后端童鞋有: @玄景, 滨江童鞋之一, 就在我的楼上, 觉得他是我组最拼的童鞋, 似乎经常加班到凌晨; @良弦, 「然并卵」组员之一, 酷爱报警, 吓得我赶紧举报了; @贤齐, 不知道和任贤齐有什么关系, 也许是雷锋与雷峰塔、@奥巴 与奥巴马的关系吧; @子咺 (xuan), 同班同实验室童鞋、室友, 每天一起狂奔西溪.
还有 @缨络 和 @晓篱, 在你们的带领下我们度过了愉快的培训时间.
第一天就要去采访一些老阿里人.
不得不说阿里人很拼, 很能干. 我听到最多的就是, 要踏踏实实做事, 多思考, 多交流, 成功并无捷径. 虽然朴实, 但却是最有用的句子, 我以后要努力践行.
之后几天, 还安排了一些培训: 《阿里技术的前世今生》《阿里前端的前世今生》《技塑人生》《职业素养之有效沟通》, 不同岗位的师兄分享了不同方向的经验. 我们知道了阿里技术的演变, 听取了个人成长的故事, 还学习了为人处事的技巧. 印象最深刻的, 是《技塑人生》的主讲, 无论在 7:40 滨江开往西溪的班车上, 还是在 21:30 西溪开回滨江的班车上, 都能看到他的身影, 他在用实际行动证明着他的技术人生.
这次品码会的目标, 是开发 ATA 的文章推荐系统. 由于没有前端, 由我、@淓徽 与 @鸭绒 兼职了前端. 我弄过的东西比较杂, 称不上全栈工程师, 充其量只是个全蛋工程师.
在前端方面, 为了保险起见, 选择了 bootstrap 作为界面框架, 然而并没有应用 MVC 框架, 因为不太熟悉. 这一点也被师兄点评的时候吐槽了, 批评说是传统的不易维护的编码方式. 还有最后, 因为 json 数据中包含了很多没有用到的内容而被扣分了, 实在是难辞其咎.
总结一下开发过程中掉进去的坑:
不知道是谁提议跳舞的, 毫无舞蹈经验的我们只好寻找简单易学的舞蹈. 一开始想跳《二次元广场舞》, 学习的时候发现还是太难, 但那段舞蹈视频之后居然附送了一段《ようかい体操第一 (妖怪体操第一) 》, 正好符合我们的要求. 在 @夕岚 的带领下, 我们蹩脚的学完了这段舞, 令人意外的跳出了不错的效果. 简直赞.
(其实视频中总共有三段, 我们只学习了第一段, 单曲循环了三遍.)
放张毕业照吧.
]]>最大的问题是, Church Numerals 究竟是什么? 其实就像助教小哥举得那个例子, 我们有很多种方式可以计数, 例如使用阿拉伯数字, 例如 4
, 也可以用二进制, 例如 0b100
, 甚至是用星号表示, 例如 ****
. 既然有这么多种方式表示数字, 那么在算数系统中有没有一种中性的、尽可能抽象的方法来表示数字呢? Church Numerals 就是一种在函数式框架下实现的表示数字的模型.
Church Numbers 基于两个参数: zero
, 就表示 0, 我理解成数字的基准, 以及 successor
, 用于求数字后继的函数, 例如 successor 4 == 5
, successor "****" == "*****"
, 等等. 所以, 数字 _n_ 可以表示为
n s z
其中, s 与 z 分别是 successor
与 zero
. 举个实际的例子, 数字 1 就可以表示为 (+1) 0
.
那么, 用 Church Numerals 该怎样表示数字呢? 我们有
1 | zero s z = z |
其实也不难理解对吧, 零就直接返回表示零的东西好了, 一的话取得零的后继就是了, 二的话得取零的后继两次, 以此类推. 当然在 Haskell 里面会更喜欢这样写:
1 | zero = \f -> id -- zero s = id |
其中 zero
中的 id
是 Prelude
里的函数, 它的作用是接收啥就返回啥, 主要作用是为了让代码更简洁 (取代 \x -> x
, 所以 one
定义成 one = id
也是没有问题的), zero = \f -> id
扔掉了第一个参数, 直接返回后面的东西, 也就是 z
.
有了数字, 我们就能在上面进行一些基本运算.
最最基本的, 是自增操作, 在 Haskell 里可以定义的五花八门:
1 | incr n s z = n s (s z) |
各种定义有各种解释, 第一种是说把基准值往上自增了, 然后再取后继, 第二种是说直接在数字上取后继, 但 _n_ (_s_ . _s_) _z_ 就不对, 因为这相当于把取后继的速度加快了一倍, 变成了取两倍的函数.
我们可以把它变得更符合 Haskell 精神:
1 | incr n s = n s . s |
证明 n s . s = s . n s
, 感觉是句废话, 但又不好证, 乱写一通:
1 | n s . s = (s . s . ... . s) [n 个 s] . s |
加法操作的第一个定义很符合直觉:
1 | add n m = n incr m |
看起来就是 _n_ 加上 _m_, 到底是怎么回事呢? 实际上 incr
成了后继函数, 而 _m_ 成了零, n incr m
就是对着 _m_ 调用了 _n_ 次 incr
. 按着这个理解, 就有了第二种形式:
1 | (add n m s) z = n s $ m s z |
也即
1 | add n m s = n s . m s |
证明 add (incr n) m = add n (incr m)
:
1 | add (incr n) m s = (incr n) s . m s |
还记得刚刚说 n (s . s) z
不是加法而是乘法了吗, 因为我们把后继函数加快了一倍, 如果我们放 _m_ 个 _s_ 进去, 变成 n (m s) z
, 实际上就是 _n_ 与 _m_ 相乘了, 是不是很神奇?
1 | mul n m s z = n (m s) z |
或者是:
1 | mul n m = n . m |
上面这行实际上是先把 s z
给 _m_ 处理, 得到 (m s) z
, 再丢给 _n_ 处理.
证明 a*(b+c)=a*b+a*c
:
1 | mul a (add b c) s = a (add b c s) |
注*: 不清楚等号是否在所有情况均成立, 但在 Church Numerals 的前提下是成立的.
乘方的形式与乘法非常接近, 就是:
1 | pow n m = m n |
如何去理解? 先把乘方补完:
1 | pow n m s z = m n s z |
可以看出, 是把乘以 _n_ 的操作调用了 _m_ 次, 也即乘方.
甚至可以用它推出一些定理:
1 | pow n (incr m) = incr m n |
因此得到了 nm+1 = nm*_n_.
]]>作为一名初学者, 利用以下资源学习会比较快上手.
Monad
弄得头大, 正在研读教程 All About Monads.感觉 Haskell 没有什么特别好的 IDE 可用, 试过一些, 列举如下.
Ctrl + 空格
进行补全, 当然在中文输入法下没用.学 Haskell, 功利心不可以太重, 当然还是可以去官方看看有哪些公司在用 Haskell: Haskell in industry.
私以为, 学习 Haskell 就是为了开拓视野, 从不一样的角度去看问题. 虽然说语言被划分了命令式与函数式的界限, 但函数式编程已经渗透到很多命令式编程语言当中, 只要有 Lambda 演算的地方, 函数式编程的知识就可以用到. 特别是函数式编程的一些特性, 例如 Immutable Data、First Class Function、Lazy Evaluation, 都极大的改变了传统的编程观: 不能改变数据的值, 该如何表示一个不断演进的计算? 一批数据需要进行处理, 怎样做才简洁高效? 明明看起来是无穷递归的嵌套引用, 为什么计算在运行时可以终止?
现在我又想到那个困扰我的 Monad
了, Monad
是 Haskell 中以某种方式合并计算结果以进行更加复杂运算的一种策略, 使用神奇的 Monad
配合 do
语法糖, 就能让 Haskell 看起来像命令式语言那样, 对「变量」赋值并运算, 就像下面这样:
1 | do |
看完 Learn you a Haskell 里面的 Monad
时, 我处于非常迷糊的状态, 只能非常机械的理解: 喔, x
与 y
表示了两个不确定的值, 在 return (x, y)
的时候 Haskell 也不知道你究竟要什么, 只好把所有的组合都给你列出来啦, 也就是 [(1,3),(1,4),(2,3),(2,4)]
. 那么问题来了, 究竟是 Haskell 的什么机理让它这样执行? 通过这几天持续的学习, 渐渐对上面的几行代码有了新的理解. 我们知道, do
表示法与以下式子等价:
1 | [1,2] >>= \x -> [3,4] >>= \y -> return (x, y) |
下面的处理就要归功于 bind
这种神奇的函数了, List Monad
的定义如下:
1 | instance Monad [] where |
原来在 [1, 2] >>= f 的时候, 会把 [1, 2] 里的每个值都拿出来调用 f, 而 [3, 4] >>= f’ 的时候也会把 [3, 4] 里的每个值都拿出来调用 f’, 所以才会看到所有的值两两组合. 同时, 最后的 return
还进行了类型推导, 不由得让我惊叹 Haskell 类型系统的精妙.
其实 Learn you a Haskell 里面也有提到这些, 但在当时阅读这些文字是绝对无法体会到为什么能这样做、为什么要这样做的, 唯有经过自己不断地练习, 去反复理解每一句话的执行机理, 才能慢慢领会各种奥秘.
我想到了某个 Haskell 讨论帖中, 一位 Haskell 初心者的回帖:
你这个代码写的不错, 我研究了一个月, 终于看明白了. 谢谢! – 此处省略两个感叹号.
是怎么回事呢? 楼主贴了一段用 Haskell 求数列组合的代码, 当时把这段寥寥数字的代码看懂了, 暗自认为这个人花一个月看懂也未免太过夸张, 觉得很好笑. 直到做 H-99 碰到一些用 Haskell 优雅解出的题目, 自己却很难看明白, 便明白 Haskell 当真是字字珠玑, 要想吃透 (甚至仅仅上手) 实属不易.
所以说, Haskell 的学习曲线是比较陡峭的, 尤其对于之前没有接触过函数式编程的人. 套用 Erik Meijer 老师的梗, 得要 on and on: wax on wax off, wax on, wax off…直到形成肌肉记忆, 便能手到擒来.
]]>这次写文章, 是因为又换了云服务器. 光线誌这个博客已经有些年数了, 空间来来回回倒腾过好几回, 去年因为遇上了推特上的东哥做促销, 换到了他家的云服务器上, 之后就也没怎么花心思打理. 前几天云服务器到期, 续费价格很贵, 巧的是前一阵子 GitHub 提供了 Student Pack, 这真心是个有诚意的大礼包, 里面包含了 GitHub 的高级账号、NameCheap 的域名与证书、DigitalOcean 的云存储等等一系列价值不菲的服务, 于是就把博客搬到了 DigitalOcean.
话说 DigitalOcean 这家主机商, 原来在国内也算是很有名气了, 被赞誉无论是价格、配置、数据中心还是稳定性都与 Linode 有的一拼. 可惜虽然它提供了新加坡线路, 居然比美国西海岸线路还要慢, 权衡再三选择了位于三藩市的节点. 然而, 最近功夫网愈发变本加厉, 样式表常常被卡住下载不来, 浏览器只得白屏很久, 不清楚的人还以为网站坏了.
3 月 2 号无意中打开了某个 Linode 日本服务器的站点, 简直秒开, 于是把服务器搬到了 Linode 日本.
接着, 还去 NameCheap 兑换了域名与证书, 域名是 raychow.me, 先开个坑, 以后放点儿 About me 的东西上去, 反正暂时不要钱.
自己做得主题也用的很久了, 做那个主题的时候 Google Wave 还没正式倒闭, 它的设计在当时来讲非常新潮, 所以主题风格模仿了 Google Wave, 后来做的太 High, 以至于出了三篇文章[1][2][3]介绍如何山寨. 而今 Google 力推的 Material Design, 还是有很重的 Google Wave 影子在里面.
所以还是想用 Material Design 的主题, 无奈 WordPress 里能用的也没几套, 几乎都有瑕疵, 现在用着的是看上去最顺眼的. 也不知道为什么, 作者自己的网站很正常, 但发布的主题里面有些毛病, 只好一一改了过来.
顺便还去整理了一下友链, 每次整理的时候都会一阵唏嘘, 因为会发现一些朋友的博客倒下了. 很多人做独立博客是一时兴起, 时间久了以后就长了草, 服务到期便也随风流逝, 至于剩下的那些活着的博客, 也基本上如我一样处于停滞状态. 但我一定要把博客坚持下去, 无论有没有人看, 都要一直存在, 因为这真的是会让人有历史感的东西.
接下来想加快写博客的频率, 最近写大论文实在是有些乏味, 在这里写一些自己感兴趣的东西吧. 嗯.
]]>shared_ptr
、unique_ptr
, 脑子一抽风把 scoped_ptr
也说出来了, 但是把 weak_ptr
和 intrusive_ptr
忘在了脑后…他问我了一个问题, 对于 shared_ptr
的操作是否为线程安全的, 当时庆幸这个问题之前有做过了解, 就按照某个博客的说法来回答: 尽管使用计数提供了原子性修改操作, 但 shared_ptr
的赋值操作由复制对象指针和修改使用计数两个操作复合而成, 因此仍不是线程安全的, 具体理由如下.
设有两个线程与三个智能指针:
1 | thread thread1; |
在某时刻, spObject1 与 spObject2 的状态是这样的:
两个线程同时进行了 shared_ptr
的赋值操作:
1 | // thread1 |
观察 spObject1
与 spObject2
的操作, 首先 thread1
执行, spObject1
的对象指针指向了 spObject2
指向的位置:
接着 thread2
执行, spObject2
的指针指向了 spObject3
指向的的位置, 并且修改使用计数, 导致 object2
与相应的使用计数被销毁, spObject1
指向了一个被销毁的对象:
thread1
执行时, spObject1
修改使用计数, 错误的指向了原本 spObject3
的使用计数.
据此原博得出结论, 多线程无保护读写 shared_ptr
是不安全的, 必须加锁. 当我把这个过程呈现给面试官的时候, 他表示了疑惑: 既然 shared_ptr
的读写不是线程安全的, 那么使用计数操作的原子性意义何在? 我当时就囧了, 但仍然坚持原来的主张, 于是面试官便让我回去查查.
首先我阅读了 VC 2013 的 STL 库, 对于赋值部分看起来是线程安全的, 这里是赋值的源码:
1 | _Myt& operator=(const _Myt& _Right) _NOEXCEPT |
swap
交换是实现异常安全的惯用手法, 不难理解. _Swap
声明在基类 _Ptr_base<_Ty>
中, 具体如下:
1 | void _Swap(_Ptr_base& _Right) |
此处注意首先交换了使用计数, 然后是对象指针. 我们再看 shared_ptr
的复制构造函数, 因为赋值语句的第一行用到了它:
1 | shared_ptr(const _Myt& _Other) _NOEXCEPT |
可以注意到, 在泛型函数的 _Reset
中, 已经取得了一份 _Other
的拷贝, 也就是说争用情况不会发生在此之后, 只会在泛型版本 _Reset
调用 非泛型版本 _Reset
时发生.
下面做一个简单的实验证明上面的结论:
1 | shared_ptr<int> sp1(new int); |
此程序在 Debug
模式下运行不久就会出现错误, 因为尝试越界访问 (可能是写入一个已经销毁的堆上对象).
令人疑惑的是, cppreference.com 指出, 对不同的 shared_ptr
实例操作时是不需要额外同步的, 即使那些实例共享了同一个对象. 在上面的实验中, 两个线程只进行以下操作:
operator=
;reset
.对于 VC 2013 的 STL 库, 以下的执行顺序是可能的:
t1
中, 泛型 _Reset
取得了 <sp2._Rep;t2
中, 完成了 sp2 = sp3, sp2._Rep 与 sp2._Ptr 被销毁;t1
中, 泛型 _Reset
取得了 sp2._Ptr (实际上已经是 sp3._Ptr), 调用非泛型 _Reset
, 对已销毁的 sp2._Rep 进行操作, 发生错误.在 gcc 中测试, 也会发生类似的问题.
至此, 我仍然坚持 shared_ptr
并非线程安全这一观点, 起码对于现在的库来说是不安全的.
QFileSystemModel
, 此模型与 QListView
等控件配合就可以实现目标了.但是, 我在 64 位的 Windows 8.1 下实验发现, QFileSystemModel
打开包含了大量文件的文件夹时很容易卡死. 譬如位于固态硬盘的系统的 System32 文件夹, 包含了将近四千个文件 (子文件夹中的文件不做计算), 使用 Qt Creator 使用 MSVC 2013 编译器创建的程序要花费近十秒钟才能恢复响应, 如果直接在 VS 2013 下编译的程序表现会更加糟糕, 花费时间达到了二十余秒. 这么久的时间显然是不可接受的.
经过几个小时的跟踪, 发现问题出在 QFileSystemModelPrivate::_q_fileSystemChanged
上, 这个函数根据描述应该是作为线程调用, 但不幸的, 程序经过了某段黑魔法代码后, 由主线程调用了这个函数. 此函数将所有文件的信息读取并缓存, 正是读取图标的过程严重拖慢了整体速度.
奇怪的是, 网上很少人提到了这个问题, 只看到 Stack Overflow 上的一则回答:
I think the reason for this could be the icons. Within the _q_fileSystemChanged() slot fileInfoGatherer.getInfo() gets called which - among other things - resolves the icons for the paths. In it’s current design QFileIconProvider uses QIcon to represent icons and QIcon can only be used in the UI thread. QImage seems to be the only class allowed to use in other threads, but I think it may be to expensive to use QImage in the background thread and convert it to an QIcon in the UI thread.
So it is possible that the platform implementation of QFileIconProvider is slow on network paths under some circumstances and therefore slows down the UI main thread.
I don’t know if this is the source of your problem, but at least this should be the reason why _q_fileSystemChanged() is called within the UI thread.
由于用于表示文件图标的 QIcon
需要在主线程中使用, _q_fileSystemChanged
也被迫执行在了主线程上, 也许以后的 Qt 将会修复这个问题.
目前的权宜之计是, 加快图标的读取速度. 经过多次实验, 我发现读取可执行程序的图标是导致卡顿的主要因素. 既然如此, 干脆不显示程序图标, 速度就能加快很多.
QFileSystemModel
使用 QFileIconProvider
来读取图标, 我们继承这个类, 重写其中一个用于读取图标的 icon
函数:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class MyFileIconProvider
: public QFileIconProvider
{
public:
MyFileIconProvider()
: QFileIconProvider()
{}
QIcon icon(const QFileInfo &info) const
{
if (info.isExecutable())
{
return QIcon();
}
return QFileIconProvider::icon(info);
}
};
在传入一个可执行程序的信息时, 函数直接返回了一个空图像.
接着, 继承 QFileSystemModel
并设置其 IconProvider
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class MyFileSystemModel
: public QFileSystemModel
{
Q_OBJECT
public:
MyFileSystemModel(QObject *parent = 0)
: QFileSystemModel(parent)
{
setIconProvider(&m_myFileIconProvider);
}
private:
MyFileIconProvider m_myFileIconProvider;
};MyFileSystemModel
在显示可执行文件时, 将使用一个未知文件类型的图标来代替, 如图所示:
经过实验, Qt Creator 使用 MSVC 2013 编译的程序在两秒内就能打开 System32 文件夹, 速度尚可接受.
]]>有关 QPush 的介绍, 可以看看電腦王阿達写的《QPush 快推 – 把各種訊息推送到手機的最簡單方案》, 相信事无巨细的描述让你比开发者还要会用这款应用. 不过, QPush 现在还只是 iOS 限定, 不知道开发者有无 Android 版本开发计划.
能够自由向手机推送消息是我一直期望的功能, 毕竟我们原本只能靠安装一款软件来接收有关此软件的通知, 不能够按照自己的需求发送. 可能有这些情境:
只要有相关服务开通了 API, 我们就能利用 API 获取信息并推送至手机, 个人感觉这是个很有意思的想法 :-).
我对 WordPress 做了一点儿试验, 加上了将评论通过 QPush 推送到手机的功能. 虽然可以通过邮件通知获得评论通知, 但 Gmail 的推送速度总是慢半拍, 而且它已经不推送被归在「动态」类别的邮件了.
例如, 我在博客留下一则评论:
此评论在提交时被立刻推送到手机:
打开即可看到全文:
美中不足的是, 推送的链接不能直接点击.
在你主题的 functions.php
文件中加入以下内容, 也可以试一试 QPush 推送的神奇:
1 | function beamnote_qpush($comment_ID, $comment_approved) |
为了避免产生骚扰, 待审核与垃圾评论都不会被推送, 在登录状态下产生的评论亦不被推送; 另外, 多人博客需要再做修改, 否则会接收到所有作者文章的评论.
QPush 属于刚刚起步的应用, 并没有开放 API 相关的宣告. 在官方没有说明的情况下, 现行的调用方式在未来也许会变动; 但如果能够保持开放的心态同时增强手机端功能, 相信能够受到更多人的欢迎.
]]>网站呢最重要的就是数据了, 很多 VPS 不像虚拟主机, 每天都有备份的, 出现问题能够自助连上备份服务器寻回档案, 因此 VPS 使用者一定要做好备份工作. 备份当然不能放在本机, 否则主机坏了备份丢失岂不是白忙活; 现在云服务这么发达, 备份到云端成了不错的选择. Dropbox 作为云服务中经历多年风雨洗礼的佼佼者一直广受推崇, 得益于其 API, 我们也能将网站资料备份到 Dropbox 之中.
在使用虚拟主机的时候, 我就有用 BackWPup 这款 WordPress 插件, 它能定时将你的数据库与网站文件备份到 Dropbox、Amazon S3、SugarSync 等一系列云服务中, 在出现异常的时候还能够发出邮件通知, 算是十分贴心了. 但这款插件设置选项有一些儿多, 而且有时会出现好几分钟都不能完成备份而报错的意外, 尚不明确是主机问题还是插件问题; 另外, 这款插件在 WordPress 的后台地方留下了很多链接, 看着很烦人.
现在既然用 VPS, 那就用 VPS 的方式去实行备份吧. 数据库与网站文件备份到 Dropbox 自不必再说, 不少网站都提供了方法, 但全盘压缩备份的方法对于图片来说有些不合适了, 毕竟一个网站的图片压缩下来至少也有数十 MB, 保留几十天备份的话就要在 Dropbox 里占用数 GB 空间, 对于那些动不动就扩容 2TB、3TB 的国内网盘来说简直是九牛一毛, 但对于寸土寸金的 Dropbox 来说实在是太浪费了. 而且图片这种文件基本上不会修改, 在 Dropbox 储存一对一的备份是完全可以的.
本着这种想法, 我又写起了很少接触的 Bash 脚本, 无奈水平太差, 差点打算放弃用 Python 来写, 但最后查查补补倒也折腾出来了. 这段脚本调用了 Bash 脚本 Dropbox Uploader, 通过 Cron 每天定期执行, 检查上次同步以来被添加或修改的文件, 并同步至 Dropbox. 如果有文件同步失败则中止同步, 等待下一次 Cron Job 执行再做尝试.
Dropbox Uploader 请在这里下载: https://github.com/andreafabrizi/Dropbox-Uploader
将 dropbox_uploader.sh 放到合适的位置 (我放在了 /usr/local/sbin
中) 并赋予执行权限, 运行这个脚本, 它会提示你在此创建 Dropbox API 并将 API 资料填入其中. 执行完成后, 你可以尝试执行 ./dropbox_uploader.sh upload file /
来检查 Uploader 是否正常工作.
然后, 将以下代码根据实际情况修改后保存为 Bash 脚本.
1 | IMG_DIR=/path/to/public_html # 图片 (文件) 所在目录 |
并在 Crontab 中为此脚本设置合适的执行时间, 例如在每天三点执行备份:
1 | 0 3 * * * /usr/local/sbin/backup_img.sh |
可以先手动执行一次检查错误, 如果一切正常, 第一次运行时会将所有图片 (文件) 同步到 Dropbox, 耗时较长请耐心等待. 其实, 这段脚本不一定必须用来同步文件, 同步服务器文件也是可以的, 只是要同步的文件数量多时速度比较慢.
]]>光线誌之前存放在老薛的主机上, 平心而论老薛主机实惠量足, 一开始是在美国空间, 年费 100 元, 去年八月续费时转到了香港空间, 年费也只要 200 (似乎还有九折的折扣). 在用老薛主机之前, 用的似乎是一家不知名的主机商, 选择那家主机主要就是因为便宜, 还送一个独立 IP, 但是用到后来几乎每天博客都要来大姨妈; 换到老薛后, 不能访问的情况极少发生, 香港空间的速度更是不错, 凌晨 PING 延迟可在两位数, 平时在一百多毫秒的样子, 上行速度也可接收.
实际上老薛的主机要到今年八月份才会过期, 但前几日看到一位推友给自己的主机 HomeZZ 做的广告:
这个价格可是相当实惠了, 比 Linode 便宜了将近一半 (不过 Linode 最近有大幅升级), 第二天就买了下来.
之前断断续续用过一段时间 Ubuntu (还一直说要钻研 Linux 内核至今尚未起步…), 所以第一次用 VPS 倒也还算顺利. 在开通 VPS 后的一点儿小插曲是, 兴冲冲地给 VPS 安装 CentOS 6.4, 结果怎么都装不上, 而 CentOS 5.9 能装上却不能连接 SSH. 支持单得到的回复是系统模板还未做好, 所幸稍等之后 CentOS 6.4 就可以用了.
其实对于我这个过气的博客来说, 除去那些无聊的攻击之外, 一天并没有多少人来拜访, 之前的虚拟主机已经完全够用; 而且也没想到什么需要 VPS 才能运行的东西, 所以换 VPS 现在仅当练手吧, 至少被 iptables 烦恼了很久.
因为换到 VPS 的关系, 我登入了万年不进的 DNSPod, 在修改解析记录的时候意外的发现了主机记录为「*」 (星号) 的一条解析, IP 地址被指向了 107.151.110.52.
起初我还以为是 DNSPod 的什么默认设置, 但 Google 搜寻发现不对劲, 原来带星号的记录属于泛解析, 任何未命中已有记录的访问都会被解析到泛解析设定的 IP 上. 果然, 我访问博客不存在的子域名, 会被跳转到一个极其傻逼的破解收费聊天室的广告中.
我的上网习惯应该是极好的, 主动泄露 DNSPod 密码的可能性几乎为零, 不得不怀疑 DNSPod 网站自身问题. 而且, 在 DNSPod 进行操作会产生邮件、短信通知, 我一条都没有收到, 十分蹊跷.
在 DNSPod 删除了这条记录, 并且修改了账户密码. 尽管没有太多登入的必要, 以后还是要经常检查 DNSPod 才比较放心.
网路上总是有这样那样无聊的人, 学习所谓的黑客技术并且攻击素不相识毫无利益瓜葛的网站. 从去年年底开始, 我的博客就一直遭受着来自世界各地的攻击. 去年十一月中旬, 博客因为流量耗尽而被迫关闭; 之后采取了一些措施有效阻挡了恶意访问才使得博客正常运作. 上个月的访问数据显示, 博客在一月份共承受攻击约五十万次, 这个数字也许对大中型网站不算什么, 但足以消耗数十 GB 流量、拖慢博客速度, 最终致使流量超限关闭.
还好要抵御这些攻击并不难, 通过一些 iptables 与 .htaccess 的设置, 攻击者被挡在门外, 因而你能够看到速度这个还算正常的页面.
]]>这回先说 LAVA, 这在星界是一个神奇的名词, 因为在 LAVA 出现之前, 我们只能玩到海量但简单的 GVBASIC 游戏, 或者是汇编做成的游戏 (几乎都是金远见自己做的, 毕竟太底层). 直到 Lee 的 LAVA 横空出世, 那些经典让人回味的游戏才如雨后春笋般冒了出来.
对于 LAVA 的历史, 我没有清晰地了解, 网路上也没有人整理. 似乎是在 Lee 先释出了 LAVA, 后来被文曲星收编成为内建功能, 后来出彩屏版文曲星时 LAVA 还升级成为支援彩色显示的 GVM2, 但此时文曲星大势已去, GVM2 再也不能像上一代那样名声大噪了.
LAVA 为什么能火, 与 GVBASIC 和汇编相比不难得出结论. 维基百科有曰), LAVA 提供全面超越 GVBASIC 的图形支持, 图形处理速度也大大超过 GVBASIC , 跨平台是它最大的优点. 与 GVBASIC 相比, LAVA 的执行速度更快, 提供了更多的图形函数, 以及跨平台支持的文本、图形缓冲区访问; 与汇编相比, 引入了 C 语言的部分特性, 开发效率大大提高, LAVA 程序在 LAVA 虚拟机中执行, 因此不用编译为机器代码 (文曲星官方文档指出, LAVA 程序在电脑端伪编译后, 生成由一系列伪指令组成的 lav 文件), 以此实现了跨平台工作.
说说经典的游戏以及应用吧. 由于年代太久远, 只能依稀记得其中一些了, 例如蛙蛙大富翁、蛙蛙马戏团、神州、仙剑后传、魔塔、中国烟火、下 100 层等等. 不得不提的是, 文曲星上的游戏基本上都是星迷们自发无偿开发的, 几乎都没有什么商业利益的成分, 游戏内容也基本上搬用其它平台的经典游戏.
上面有几个游戏直到现在还比较有印象, 蛙蛙大富翁是「复刻」了大宇公司的大富翁 2, 蛙蛙马戏团则是红白机马戏团的翻版; 神州是采用一个 LAVA 平台上的 RPG 游戏引擎开发的 (高端吧, 连引擎都有), 这个引擎自带的素材中有口袋妖怪风格的图像, 因此很多以此制成的游戏最大特色便是画风很像口袋妖怪, 唯仙剑后传是个例外, 因为画面素材不是取自口袋妖怪, 而是取自仙剑 95 版…. 仙剑后传讲述的似乎是仙剑一完结后的一段剧情, 游戏画面虽不是 100% 还原 PC 版仙剑, 但地图都有用心做, 而战斗画面则真正的与 PC 版一致, 这让我很怀念; 魔塔这个游戏在当时很火, 其实我不是很喜欢玩 (因为是此类游戏的苦手…), 变种很多, 但主线剧情都是王子去魔塔营救魔王劫走的公主, 需要一层层的打妖怪、找钥匙、开门, 最后到达顶层达成营救目标; 中国烟火似乎是某个工作室的游戏, 这个工作室的游戏都很精致 (也许正是蛙蛙), 当时我以为这是原创游戏, 这款游戏的游戏方式与水管工相似, 只是将管道从左边连接到右边的烟火, 就能引燃烟火, 虽是黑白画面也能让人感觉很华丽; 下 100 层则是还原了同名 PC 游戏, 在有按键的小设备上玩这个游戏还是很爽的.
除了 LAVA 游戏之外, 还有一些不错的 LAVA 应用, 例如数学、物理的学习辅助工具、解压缩工具(°Д°)、音乐播放器(°Д°) (你能想象存储空间只有几兆字节, 还要放一首 WAV 格式的音乐进去的感受吗? ) 、电子书阅读器等等.
随着达人们对文曲星研究的不断深入, 后来甚至出现了灰度屏模拟技术, 这种技术通过某种手段 (也许是疾速刷新) 让黑白点阵屏拥有了 16 级灰度显示能力. 在这种技术的推动下, 运作于 LAVA 平台的灰度图片浏览器诞生了; 之后, 甚至出现了灰度游戏. 这已经是文曲星巅峰后期的事情了, 我也只玩到了一款山寨版口袋妖怪的预览版, 只能在第一个村子晃悠, 更不要说去抓神奇宝贝了, 但画面是真真的灰度, 确实让人耳目一新.
在这之后的发展, 由于我的文曲星不慎损坏, 已经没有再关注了.
前面说过, 文曲星里的汇编应用基本上是金远见自己做的, 也许他们自己做了编译器也不一定 (或者真是一点一点的用汇编写出来的? ).
在汇编应用中, 最有影响力应该是下面几个: LAVA 解释器、SYSTOOLS、超级玛丽.
LAVA 解释器自不必说, SYSTOOLS 也是一款神奇的应用. 在 SYSTOOLS 出现之前, 如果我们要向文曲星传送文件, 需要使用金远见开发的专用传输程序, 能够传输的文件类型、传送文件的目标都受限制 (就像苹果公司的 iTunes ( ´∀`)σ); SYSTOOLS 就赋予了使用者完全掌控文曲星的能力, 能够传输任何文件到任何位置, 简直神器.
而超级玛丽, 也是旷世奇作, 这是一款完完全全移植于红白机同名作的游戏, 似乎出自 LAVA 的作者 Lee 之手. 这个游戏移植工作据说极为繁琐, 这里有 Lee 写出的一套流程:
- 把 FC 游戏的 ROM 文件中的程序部分反汇编;
- 把反汇编的程序中的数值标号换成名字标号;
- 把程序中所有对零页「$00-$3f」寻址的指令的地址改到别的地方;
- 去掉游戏中的发音程序;
- 把对 IO 的操作用文曲星程序模拟出来;
- 把 FC 游戏的 ROM 文件中的字模部分由 88 点阵压缩成53;
- 把程序和压缩的字模组织好, 加上文件头 (对于有些文曲星还要加密).
即便对着这套流程, 也没有见过更多游戏被移植到文曲星( ・ิω・ิ).
总结的话, 就贴上某论坛某成员关于文曲星程序员去向的发言, 以此怀念逝去的文曲星吧:
]]>
- 冰魄组件——很早期的 basic 程序员算是自制游戏的开创者之一, 也很早就没做了, 我也不熟;
- xuhonghai——早期的汇编程序大师, 很多中期的汇编程序员都是看他的教材学会汇编的. 最早的非官方 bin 文件就是由他通过 GVBASIC 的漏洞来实现的. 至今还能在百度文库上搜到他的汇编教程, 学习汇编入门其实也算很不错的教材了;
- SUN——香港某数据库公司的资深程序员, 算是当之无愧的大师级人物, 基本后面 Basic 能够出现那么多游戏都是因为他的 Basic+ 增加的那 3 个指令才得以实现. WQXHEX 工具, 基本文曲星汇编程序员必须安装的工具, 后面还公布了他的花指令写法, 对反编译保护有很大的帮助, 后面移植过不少 APPLE II 上的游戏. 基本是个很低调的人;
- Lee——最早假装自己是个女的, 后来被人识破发现是个大叔, 最大贡献是移植了 FC 的超级玛丽和研发了 LAVA. 不过这人品有点问题, 喜欢别人追捧, 从来不公布自己的源代码和研究成果 (当时文曲星编程界基本是处于一个大家完全公开代码一起研究的一个状态.), 后来加入过一段时间 GGV (文曲星的公司), LAVA 后来被联想的某款手机使用过.
- Fantasy DR——最早制作出给文曲星制作 RPG 游戏的 PC 端制作工具, 神州的作者之一. 后来在上海 UBI 工作;
- Lendy——实现了在文曲星的黑白 2 色屏幕上看 16 级灰度图片的功能, 也实现的 WAV 声音格式的播放. 后来在腾讯工作;
- 曾半仙——拆机狂人, 基本帮我们弄清楚了文曲星的所有硬件结构, 后来和点虫虫实现了文曲星删除词典增加容量的功能. 后来在 9U 做工程师去了, 现在似乎在做 Android 版的文曲星模拟器;
- 点虫虫——精通汇编, 和曾半仙一起实现了文曲星删除词典增加容量的功能. 后来在某中学当老师;
- QIQI——最开始利用一些系统函数做过一些小软件, 性格同 Lee 吧, 很喜欢别人吹捧自己, 印象中没做出过什么特别的贡献, 做过一些音乐播放工具, 后来据说去了 360, 在多个论坛和人对喷技术问题还出过一次名;
- EPC——后期的游戏程序员, 后期有做过不少很不错的游戏, 可惜我不是很熟;
- Isword——同上.
我的文曲星应该是在初二或者初三的时候入手的, 那个时候还不了解电子词典的功能什么的, 完全是初中时的小伙伴推荐的, 似乎理由是可以写 BASIC (好像还强调了红外线功能), 于是以学习的名义向父母申报了购买文曲星 NC2600C, 这个东西看起来是这个样子的:
还有这个样子的:
怎么样, 是不是一种笔记本式的的高大上感觉啊?
尽管这台小小的设备的配置在现在看来简直低到不行 (6502 系 CPU、数十 MB ROM、数 KB 内存、160*80 像素点阵屏), 但却支持 GVBASIC、汇编、LAVA 三大程序平台, 特别是 GVBASIC, 是可以直接在文曲星上写完 BASIC 程序然后运行的, 甚至还出现了病毒 :-o , 可玩性不知道比现在那些弱智的学习机点读机高到哪里去了.
GVBASIC, 是金远见公司为文曲星开发的一种 BASIC 变种语言, 文曲星上自带编辑工具以及运行环境, 所以可以随时写 BASIC 程序, 再加上 BASIC 是一种解释型语言, 写完就能立刻执行, 简直秒杀现在的苹果安卓.
以前最喜欢做的一件事, 是用 GVBASIC 做一个伪造的英汉查词界面, 只要有人问我借文曲星, 我就先打开这个程序, 一旦按下一个键就开始死循环 BEEP (扬声器鸣叫), 基本上上课的时候都会被吓到. 后来同学再问我借文曲星的话, 都要先按一下「英汉」键从假冒程序中跳出, 因为读键值的函数只能检测普通按键, 而不能检测与阻止功能切换键, 所以后来做出了加强版: 直接通过循环 PEEK 读取系统内存的按键值区域, 由于循环时程序是无法通过功能切换键跳出的, 这样即使按下切换键都会一直叫了; 这样做的话还有一个缺点, 可以按「跳出」键强制退出程序, 所以在透过 POKE 指令修改内存某区域, 禁止了「跳出」键功能, 效果简直完美.
用 GVBASIC 做的最大的一个程序, 是已经达到了单文件限制 (貌似是 64KB) 而无法继续编写的一个很无聊的锁屏程序. 这个程序只有一个功能, 就是锁定文曲星…要求用密码才能解锁, 密码错误数次后会强制禁止尝试一段时间 (所以说 iOS 什么的这样的功能都是抄袭我的嘛), 还特别用心的使用了当时流行的 XP 风格, 这可是要一点一点自己画出来的, 看起来效果很好. 密码是可以自定义的, 为了加快速度没有使用系统内建的文件读取函数, 而是直接读写内存; 程序还具有非法退出的记录功能, 如果上次文曲星是通过捅重启键非法退出的, 就会在下次运行时收到警告. 此外, 还有花里胡哨的屏保功能, 写了好几种刷屏方式, 样式多的让人捉不着头脑 :-? .
在这里解释一下 PEEK 和 POKE 指令, 它们用于通过指定地址来直接操作内存. 这是两条黑指令来的, 金远见公司没有公布, 更加不会说明内存各地址的作用, 所以使用者都是乱放数据的, 不小心就导致系统挂掉需要重启, 更加严重的似乎会导致主板坏掉只能送修 (为此官方还出了谨防恶意软件的通知), 真是杀人放火居家必备之良药啊.
此外, 自制的最实用的一款程序是计算器, 除了实现了普通计算器的功能, 还可以对分数约分、加减, 以及小数化分数、小数化根号什么的. 还做过一个小小的探险游戏, 因为想写出一点儿移动画面, 太麻烦半途而废了; 做的最成功的游戏是让一个自由落体的小点在不接触边界、障碍物和自己运动产生的曲线的情况下到达目的地, 颇具难度和趣味.
说一说网上的人一般都做什么样的 GVBASIC 程序吧, 由于 GVBASIC 本身效率很低 (特别是操作屏幕的某些自带函数) 、语言特性不完全 (例如无法自定义函数、缺失一些控制语句等等) 、程序大小有限制, 所以质量上超过汇编与 LAVA 的很少, 发布的程序多为数学辅助工具, 即使有游戏也是用字符画出的界面.
不过在坛子上有人为了证明 GVBASIC 也能做出很炫的效果, 释出了一个打地鼠游戏, 这个游戏不仅有精美的游戏画面, 还有 GVBAISC 苦手们看到碉堡的毫无闪烁的画面平移特效. 但是打开程序的源代码, 只能看见满屏的 PEEK、POKE 黑魔法.
我猜测一下这个程序的原理: 亮瞎狗眼的特效是直接操作显示区缓冲来实现的, 主程序全是内存操作语句, 可能是直接将要运行的机器指令写入了程序运行的区域, 这让 BASIC 程序几乎成为了汇编代码, 所以执行速度 UP, 可读性降为 0.
自此之后, 就有人开始用这个方法丧心病狂的对 GVBASIC 代码加密, 再后来就有了一种折衷的方式: 代码是可读的, 但是中间插入了一些用于验证代码是否被修改的代码, 检测到代码被修改就立刻停止运行. 我只记得 GVBASIC 能够读写文件, 但应该不能直接读取自身, 不过似乎是有办法通过黑指令读写任意文件, 甚至修改当前目录, 所以校验程序自身应该也是不难的.
似乎在这种能够自我校验的 BASIC 程序出现后不久, 文曲星界就没落了, 于是再也没看到过更牛的 GVBASIC 程序了.
]]>谷歌拼音输入法的用户无法在 IDE 的属性窗口中输入中文, 各种方法尝试无果, 无奈只能从其它窗口复制粘贴; 后来无意中按下 Shift + Space
, 输入面板居然就…出现了. Orz…
其它输入法 (包括 Windows 自带输入法) 没有这种问题.
微软一心想要让 Windows XP 早些儿消失, Visual Studio 2012 的多数套件似乎都放弃了对 Windows XP 的支持. 如果将 Visual C++ 2012 编译的程序拿到 Windows XP 中执行, 你会看到一个郁闷的窗口:
不是编译链接出错了, 也不是系统出了问题, 而是微软根本没打算让你的程序在叉屁下运行. 后来 Visual C++ 团队博客宣称会提供 Windows XP 的支持, 还好他们的话兑现了. 起初是放出了一个单独的安装包, 但现在集成入了 Visual Studio 2012 Update, 所以你需要安装新版本的 Update, 并在项目属性页中将平台工具集改为「Visual Studio 2012 - Windows XP (v110_xp)」, 这样生成的程序才可以在 Windows XP 中执行.
顺便提一下, Update 2 包含 Update 1 的所有更新.
STL 流行三个版本, Visual C++ 一直用的是 P.J. Plauger 的 STL 实现 (你可以通过源文件找到他的注释). thread 是 C++ 11 新标准的一个内容, Visual C++ 2012 的 STL 实现了这个类, 可惜出现了严重问题: 在某些地方哪怕仅仅定义一个 thread 对象, 然后析构, 就会出现恼人的内存泄漏. 如这个反馈所述.
1 | std::thread th([](){}); |
以上代码放在 CRT 中执行会产生内存泄露, 泄漏来源甚至无从查起, 此问题官方至今未予解决:
1 | Detected memory leaks! |
个人推荐使用 Boost 库部分代替 STL 库, 例如, boost::thread 不仅没有上述问题, 还提供比 std::thread 更加强大的功能, 如中断、限时等待等.
这个控件貌似是微软从 BCGSoft 买的, 买就买吧, 还出问题. 同一个窗口如果出现多个掩码编辑框, Tab 顺序为第一个的框就会退化为普通文本框, 就像下图那样:
我也不知道怎么更好的解决这个问题, 只有多放一个掩码文本框, 将它设为 Tab 第一顺序并且隐藏, 真的很别扭.
]]>要获得 OpenWrt 二进制文件, 除了寻找官方或私人编译之固件, 更可以自行编译. 自行编译的好处在于可自行定制组件, 而且某些组件对版本要求比较严格, 老版本的固件 (甚至是前一天刷入的) 往往无法安装官网提供的组件, 自行编译就不存在这样的问题; 另外, 还可将配置写入固件, 这样刷好机后无需重新配置.
编译 OpenWrt 的一般方法可以总结如下:
OpenWrt 需要在主流的 GNU/Linux 发行版下编译, 以 Ubuntu 为示例: 安装好 Ubuntu——无论是安装在实体机, 还是在虚拟机 (但虚拟机下的 Ubuntu 在与路由器进行 TFTP 通讯时需要设定桥接连接网路) 均可, 并安装编译 OpenWrt 所需的依赖包.
首先安装的是版本管理和编译工具:
1 | sudo apt-get update |
此外, 根据系统的不同, 还要安装不同的软件包, 以 Ubuntu 12.04 LTS 为例, 应输入:
1 | sudo apt-get install git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl |
具体软件包的命名, 可以在下面的表格中找到:
Prerequisite | Debian | Suse | Red Hat | OS X (via MacPorts) | Fedora | NetBSD |
---|---|---|---|---|---|---|
asciidoc | asciidoc | asciidoc | asciidoc | asciidoc | asciidoc | ? |
bash | bash | bash | ? | bash | ? | bash |
binutils | binutils | binutils | binutils | binutils | binutils | ? |
bzip2 | bzip2 | bzip2 | bzip2 | bzip2 | bzip2 | ? |
fastjar | fastjar | fastjar | libgcj | fastjar | libgcj | ? |
flex | flex | flex | ? | flex | flex | ? |
git | git-core | git-core | ? | ? | ? | ? |
g++ | g++ | gcc-c++ | gcc-c++ | ? | gcc-c++ | ? |
gcc | gcc | gcc | gcc | ? | gcc | ? |
getopt | util-linux | util-linux | ? | getopt | ? | getopt |
GNU awk | gawk | gawk | gawk | gawk | gawk | ? |
gtk2.0-dev | libgtk2.0-dev | ? | gtk2-devel | gtk2 | gtk2-devel | ? |
intltool-update | intltool | intltool | intltool | intltool | intltool | ? |
jikes | — | jikes | ? | jikes | — | ? |
libz, libz-dev | zlib1g-dev | zlib-devel | zlib-devel | zlib | zlib-devel | ? |
make | make | make | ? | gmake | make | gmake |
ncurses | libncurses5-dev | ncurses-devel | ncurses-devel | ncurses | ncurses-devel | ? |
openssl/ssl.h | libssl-dev | libopenssl-devel | openssl-devel | openssl | openssl-devel | ? |
patch | patch | patch | ? | patchutils | patch | ? |
perl-ExtUtils-MakeMaker | perl-modules | perl-ExtUtils-MakeMaker | perl-ExtUtils-MakeMaker | p5-extutils-makemaker | perl-ExtUtils-MakeMaker | ? |
python2.6-dev | python2.6-dev | python-devel | ? | python26 | ? | ? |
rsync | rsync | rsync | ? | rsync | rsync | ? |
ruby | ruby | ruby | ? | ruby | ruby | ? |
sdcc | sdcc | sdcc | sdcc | sdcc | sdcc | ? |
unzip | unzip | unzip | ? | unzip | unzip | ? |
wget | wget | wget | wget | wget | wget | ? |
working-sdcc | — | ? | ? | ? | — | ? |
xgettext | gettext | ? | ? | gettext | gettext | ? |
xsltproc | xsltproc | libxslt | ? | libxslt | libxslt | ? |
zlib, zlib-static | zlib1g-dev | zlib-devel | ? | ? | ? | ? |
下列依赖包不能被 make config
检查, 应保证它们已被安装:
Package | Prerequisite | Debian | Suse | Red Hat | OS X | Fedora | NetBSD |
---|---|---|---|---|---|---|---|
intltool | [Perl] XML::Parser | libxml-parser-perl | ? | perl-XML-Parser | ? | ? | ? |
一般我们只需要主干版本的源码, 除非你有别的需求. 假设需要将代码下载到 ~/openwrt
中:
1 | mkdir ~/openwrt |
接着下载并安装 feeds:
1 | cd ~/openwrt/trunk |
使用其中任何一个命令来检查依赖关系:
1 | make defconfig |
目前, 完整的 OpenWrt 源码会占用数百兆字节空间, 在编译之后占用空间将会增长至数百万兆字节 (GB).
每次编译前, 可以使用以下命令将源码更新到最新:
1 | cd ~/openwrt |
在 OpenWrt 目录下运行 make menuconfg
, 便打开了 OpenWrt Buildroot 配置接口, 在这里可以选择目标平台、Toolchain 版本以及所需包含的软件包.
在界面中, 按空格可以将软件包在 Y (快捷键 Y) 、* (快捷键 M) 、N (快捷键 N) 三个状态中切换:
opkg
命令安装此包;虽然直接执行 make
就可以开始编译, 但出于各种原因编译很难一次就顺利结束, 因此建议使用以下命令以查看详细的编译信息:
1 | make V=s |
最容易碰到的问题和编译本身没有关系, 由于编译过程中需要在网上下载其它人开发之组件的源码, 常常会由于文件已被删除或被墙的关系而失败. 失败后可以在输出信息的最后几行找到需要下载的文件, 翻墙或自行搜索此文件, 放置在 dl
目录下, 重新执行编译即可.
编译需要数十分钟时间, 慢慢等待吧.
]]>这个系列延续了很久了, 从 2012 年的十月中旬, 一直到现在——2013 年一月中旬, 掰掰手指数数估计再多写一话就能大结局吧, 期间萌生的很多好题材也都忘记了, 好记星性不如烂笔头, 多做笔记才能抓住灵感.
印象笔记 (国际版称 Evernote) 是一款适合每个人使用的笔记本软件, 所以我几乎向身边每个人推荐它; 特别是官方推出中国版后, 它的访问速度已不再是问题, 足以成为贯穿日常生活的优质软件.
简单的介绍印象笔记, 这是一款让你随时随地记录笔记的软件, 无论是电脑、平板、手机, 甚至是搭载智能系统的相机、电视机、冰箱; 配合时下流行的云端概念, 任何改动都能与云端同步, 手机上新增的笔记立刻能在电视机上看见, 利用这一点甚至可以实现多人协作; 提供笔记的历史版本功能, 像时光机一样还原以前的修改 (不过只有收费的高级版才提供).
在 Windows 中, 有很多方法能够建立新笔记:
印象笔记提供了 Windows 客户端, 按下 Win + N
能够新建笔记, 按下 Win + A
能够将选中的文字保存为笔记, 按下 Win + PrintScreen
能够将屏幕截图保存为笔记. 笔记可以包含文字、图片、声音、PDF 以及任何其它文件, 还能够附加来源、作者、地点、标签等信息.
除了手动录入笔记, 还有很多网路上的内容也值得剪辑, 配合印象笔记提供的浏览器插件可以轻松实现. 以 Chrome 浏览器为例, 官方提供了印象笔记 · 剪藏与印象笔记 · 悦读两款扩展程序, 剪藏能够直接保存网页上的内容, 并提供搜索笔记的功能 (搜索结果是嵌入在 Google、百度等搜索网站中的), 而悦读能够将网页重新排版, 明快的展现正文部分、让内容更易阅读, 此外还提供批注功能, 并可一键剪辑到印象笔记. 剪藏能够指定要保存的部分, 而悦读会优化排版且只能剪辑整个重排后的版面, 这是两者的主要区别.
在 Android 与 iOS 平台中, 印象笔记均提供了功能强大的应用, 实现了与电脑端极为相近的功能. 移动端的应用更加快捷, 可以一键添加快照、录取音频, 更可结合印象笔记 · 圈点、印象笔记 · 人脉、印象笔记 · 食记功能, 渗透生活的点点滴滴.
不久以前电脑是按层次记录信息的, 在 Windows 中就是根目录里套着很多文件夹, 文件夹里又套着文件夹, 寻找一个文件就得层层递进, 记错众多父文件夹中的一个就会找不到文件. Windows 7 中引入了「库」的功能, 旨在通过按文件的属性分类来帮助大家摆脱这种单一的对应关系——文件尽管存放的位置唯一, 但可以有很多属性, 通过属性查找文件不是更加自然和简单么? 令人扼腕的是, 大家对于新系统关注更多的是「有没有更好看」、「和以前的操作有没有不同」、「速度怎么样」等更加表面、实在的问题, 却忽略了新系统带来的新功能、新理念, 反正我身边没有一个人在用「库」这种东西.
提这个例子, 实际上是要说印象笔记也提供了按属性分类笔记的功能. 前面提到了在新建笔记的时候就可以附加来源、作者、地点、标签等信息, 这些自动 (浏览器端的印象笔记可以自动加入来源信息, 移动端的印象笔记可以自动加入地点信息) 或人为添加的信息, 方便了以后的检索.
例如, 一篇关于 C++ 调用打印机的文章, 分类在「编程」笔记本, 同时选中「C++」与「打印机」标签, 就能立即定位到这篇文章; 一篇关于含马兜铃酸的中药是如何危害人体的文章, 分类在「杂文」笔记本, 同时选中「中医」与「中药」标签, 也可以迅速筛选出相关文章.
其实「笔记本」与「标签」的概念极为相似, 唯一的区别在于一篇笔记可以属于多个「标签」但只能属于一个「笔记本」, 因此「笔记本」应记录笔记最重要的属性. (有意思的是, 博客系统 WordPress 中「分类目录」与「标签」除了名称不同, 其它性质完全相同, 一篇文章能够同时属于多个「分类目录」.)
此外, 印象笔记更支持直接搜寻笔记内容 (Windows 客户端的搜寻快捷键为 Win + Shift + F
), 高级版更可搜索 PDF 附件中的文字.
印象笔记是开放 API 的, 不仅在云端, 连本地客户端也可以操作. 官方开发的几个 App 的用家应该不少, 有给图片做标记的印象笔记 · 圈点, 有人脸识别障碍症必备的印象笔记 · 人脉, 有吃货好帮手印象笔记 · 食记, 大家可以试试.
相比于云端笔记, 云端存储是面向文件的. 目前国际上知名的云端存储有 Dropbox、Google Drive、SkyDrive、SugarSync、iCloud, 国内的云端存储有坚果云、酷盘、金山快盘、百度云网盘、360 云盘、华为网盘……太多以至数不过来.
在构思本文时我原本会理所当然的推荐三年前就写过文章介绍的 Dropbox, 但最近发生了一件事情让我产生了动摇: 这学期一门专业课的小组 project 要求合作写一篇论文, 我在实验室写好了论文 (当然同步到了 Dropbox), 回到宿舍后发现宿舍不能上网. 这时小组同学让我把论文发给他, 我只好用手机版 Dropbox 生成了论文的链接发送给同学, 但 Dropbox 的下载链接是在墙外的, 同学缺乏番蔷经验折腾半天也没弄到手, 最后只好回到实验室发出论文.
所以如果选择国外的云端存储服务, 就面临着文件无法分享的风险, 如果同步的文件只是私人使用当然无所谓, Dropbox 的客户端无需番蔷就能使用. 但谁也不能保证会不会突然有共享文件的需求, 能否连接和传输速度的问题在中国显得尤为重要.
以上几个国外网盘, Dropbox、Google Drive、SugarSync 在国内早已无法访问, 而 SkyDrive、iCloud 速度也不算理想, 要想共享给国内用户只有选择国内云端存储.
下面再谈谈除了速度、空间以外的几个要素, 一是历史记录功能, 二是团队协作功能, 三是增量传输功能.
一说到文件的历史记录功能, 我就想到对 Microsoft Office 的一个吐槽: Office 进化了这么多年, 保存按钮居然还没有去掉. 这句话的槽点在于, 明明就可以自动保存, 何须画蛇添足的加上一个按钮? 只要结合「历史记录」之功能, 完全不必担心打开文件后不小心作出的修改.
再以论文写作为例, 假使我的论文删去了几段文字, 但一段时间后又想还原那些句子, 或是被人恶意破坏、删除, 我就可以利用云端存储提供的「历史记录」,将, 件还原到任何一个历史版本.
国外网盘中, Dropbox、Google Drive、SkyDrive 支持历史记录功能, SugarSync 似乎只能提供五次历史记录, iCloud 尚不清楚;
国内网盘中, 坚果云、酷盘、金山快盘支持历史记录功能, 而百度云网盘、360 云盘、华为网盘像一个单纯的网路优盘, 不具有此功能.
利用团队协作功能, 能够共享文件夹或者文件给指定使用者.
对于共享文件夹形式的团队协作, 其实任何一款云端网盘都能做到, 只要参与协作的人员登入同一个帐号就可以; 但对于共享文件形式的团队协作, 通常需要提供共同编辑文件的方法, 因此仅有 Google Drive 与 SkyDrive 是支持这一特性的.
以 Google Drive 为例, 使用者可以利用共享功能, 将文件设定为针对特定人员访问, 并赋予允许修改或仅允许查看的权限. 多方使用网页版同时打开文件时, 任何一方所做的更改会立刻呈现在其他人的页面.
这个功能是指更新文件时仅同步被修改的部分, 而不需要完全上传 / 下载. 例如修改一首音乐的演唱者信息, 同步软件应该能够仅仅同步文件中包含 ID3 信息的一小部分, 而非完全上传整首音乐.
据我所知, Dropbox、坚果云是支持这一功能的, 其它服务未作了解.
国外的云端存储服务功能比较强大, 问题在于连通性与速度, SkyDrive 应该是最值得推荐的, 毕竟微软与中国政府关系一直不错, 而且技术和实力也有保证;
国内的云端存储仍是山寨为主, 从上面几点分析, 坚果云和酷盘算是佼佼者, 不过我没有用过这些服务, 具体优劣还请自测.
我目前还在用 Dropbox, 如果你现在打算注册不妨点击下面这个推广链接, 这样你我都有 500 MB 空间送:
]]>离开安全软件的范畴, 我再推荐一些免费又好用的工具软件. 当然, 照样不是「新奇异缺」.
不知从何时起, WinRAR 就坐上了中国压缩软件安装量第一的宝座, 那时有盗版 Windows XP 的电脑, 就几乎装有盗版的 WinRAR. 有一些「小白」在网上下载了没有破解的原版进行安装, 对这款软件 40 天之后就不能使用的问题感到苦恼. 好在后来杀出两款免费压缩软件: 7-zip 与 2345 好压, 再也不用忍受每次打开 WinRAR 时的试用弹窗了 (幸亏 RAR 解码器是开源的, 否则那么多 RAR 压缩文件该怎么办!).
现在就压缩表现对 7-zip、2345 好压与 WinRAR 做一个比较, 使用它们压缩一个 Visual C++ 源码文件夹. 用过比较新的 Visual Studio 的朋友都知道, 为了节省时间, Visual Studio 会将源码中用到的头文件与 Intellisense 等信息全部索引到数据库中, 致使一个小项目也会占上几十兆字节的空间.
测试文件夹大小为 360 MB, 测试结果如下:
格式 | 压缩软件 | 花费时间 | 大小 | 速度 | 压缩比 |
---|---|---|---|---|---|
7z | 7-Zip | 2 分 34 秒 | 58,460 KB | 2.34 MB/s | 15.86% |
7z | 2345 好压 | 5 分 | 58,465 KB | 1.20 MB/s | 15.86% |
zip | 7-Zip | 56 秒 | 93,533 KB | 6.43 MB/s | 25.37% |
zip | 2345 好压 | 31 秒 | 97,552 KB | 11.61 MB/s | 26.46% |
rar | WinRAR | 15 秒 | 96,888 KB | 24.00 MB/s | 26.28% |
rar | WinRAR | 37 秒 | 75,004 KB | 9.73 MB/s | 20.35% |
测试结果显示, 7z 格式有着最高的压缩比, 但相应所花费的时间也越多. 如果选择 7z 格式, 则 7-zip 显然比 2345 好压更快更优秀 (7z 压缩格式是作者自主开发的, 当然表现更好). 对于 zip 格式, WinRAR 居然拔得头筹, 不仅速度够快而且压缩文件的体积与其它软件相比相差不大.
当然, 严谨的测试需要更大的样本, 不同的压缩算法与参数选择显然会因不同样本有不同表现, 限于精力我就不继续测试了 ;-).
这里将 2345 好压与 7-zip 做一些其它方面的比较:
2345 的一些缺点是国产软件的共性, 我更加推荐绿色、无网络访问的 7-zip.
记事本应该是很多人使用的第一款纯文字编辑器, 应急用倒还凑合, 但有些情况实在让人抓狂: 大文件会卡住、编码支持的有问题、还只支持微软自家的换行方式, 稍微有文字处理需求的使用者都应该换用其它软件.
无奈的是, 纯文字编辑软件虽然玲琅满目, 却几乎是一些收费产品. 以前用的是 UltraEdit, 似乎对中文支持的不够好, 而且它也不是免费的; 之后我就一直寻找合适的替代, 暂时找到最好 (且免费) 的也就是这一款编辑器, Notepad++.
不说那些各家都有的像编码格式转换、代码高亮、正则搜寻等的基本能力, Notepad++ 有一些功能做的很不错:
1. 宏 (巨集)
Notepad++ 的宏简易又实用, 点一下工具栏上的按钮就能开始开始录制, 录制完成后能选择回放多次或者是运行到文件尾. 碰上什么重复性的工作, 例如加入行首空格, 点几下就能搞定.
但遗憾的是, 保存的宏似乎没有办法编辑, 也不能像 EmEditor (收费软件) 那样简简单单的编写脚本就能运行.
2. 快捷键
Notepad++ 中几乎可以对所有功能设定快捷键, 无论是自有功能、宏、插件命令或是外部程序. 例如, 选中一段文字, 按下 Alt + F3
就能查询维基百科的解释.
3. 插件支持
Notepad++ 的插件库很强大, 可以弥补一些没有实现的缺憾. 上图中的十六进制编辑模式, 便是 Hex-Editor 插件发挥效用的结果.
TextFx 是其附带的一个强大插件, 能够快速的实现匹配括号、格式化文本、增加行号、按行排序、清除空行等很多功能, 值得一试.
]]>今次要推荐的软件是适合于普通电脑的两款免费安全软件 (言下之意, 以不折腾但又勘用为主), 德国 Avira Operations GmbH & Co. KG 开发的杀毒软件 Avira Free Antivirus, 与美国 PWI, Inc 开发的防火墙 Privatefirewall.
Avira 在中国已经是比较知名的杀毒软件了, 中国网民亲切的称呼其为「小红伞」. Avira 向普通用户提供免费版 (Avira Free Antivirus) 、高级版 (Avira Antivirus Premium) 与互联网安全版 (Avira Internet Security) 这几个不同的版本, 显而易见, 高级版与互联网安全版是收费的 (且官方收费昂贵, 如果需要购买, 建议先看看经官方授权的淘宝店).
免费版只提供较为单纯的病毒防护功能 (现在还提供了 Web Protection 功能, 但使用此功能需要额外安装浏览器插件);
高级版不仅包括免费版的全部功能, 还提供了 Web Protection 与 Avria 专家的实时支持 (如上所述, 免费版已经拥有了 Web Protection, 而对于个人用户专家支持也显得比较鸡肋, 所以这个版本的存在意义是什么? );
互联网安全版不仅包括高级版的的全部功能, 还提供了防火墙、垃圾邮件防护与备份工具 (垃圾邮件防护交给邮件服务器做就好了, 备份工具显然与 Windows 自带功能重复…).
所以现在针对不折腾的个人用户推荐两种方案, Avira 免费版 + Privatefirewall, 或是 Avira 互联网安全版.
对于第一种方案, 由上所述 Avira 最受欢迎的其实是免费版, 不仅因为免费, 还因为这个版本提供了一个单纯的防病毒软件——病毒查杀能力高、没有防火墙、没有太多的主动防御、较低的硬件要求, 很适合与其它安全软件搭配使用.
卡饭论坛上流行的搭配组合是「红豆」组合, 即将 Comodo 防火墙与 Avira 免费版进行搭配. Comodo 亦是一款来自美国的安全产品, 其防火墙也带有 HIPS, 只是需要花费一些精力学习; 如果想要学习 Comodo, 请按此处.
本文不打算讨论 Comodo 的更多内容; 对于普通用户来说, Privatefirewall 既可以不加设定的使用, 也可以手动打磨, 打磨的难度是低于 Comodo 的.
首先下载安装 Avira 免费版. 请注意, Avira 的 Web Protection 的安装选项在勾选安装 IE 浏览器插件后才会出现, 但 Web Protection 与 Privatefirewall 有冲突, 会导致 Privatefirewall 不能拦截某些程序的流量. 尚不清楚各自的新版本是否解决了这个问题. 因为 Web Protection 表现的不是特别出色, 常有人反馈它拖慢了某些下载软件 (如迅雷) 的速度, 或者是因为误报导致少数网页显示异常. 由于 Web Protection 主要检测网络流量中的恶意内容, 但不具备防火墙的能力, 只安装病毒防护功能其实不会牺牲此方案的安全性.
另外, 即使是目前最新的版本 Avira 2013 也未能兼容 Windows8, 请 Windows8 用户慎重使用. 新的测试版 Avira Version 2013 Patch5 声称改善了 Windows8 兼容性, 可以按此处获得安装文件.
Avira 免费版带有广告, 基本上每天会弹出一次; 广告内容倒不像国产软件那般低俗, 多数为自家软件的宣传. 不过可以通过很简单的方式屏蔽广告, 具体方法请按此处.
如果你打算试用 Web Protection, 修改注册表可以骗过 Avira 安装程序让你不安装浏览器插件就能使用 Web Protection (再次说明, Web Protection 可能导致 Privatefirewall 冲突) :
对于 32 位系统, 将以下文字保存为 reg 文件并双击导入注册表:
1 | Windows Registry Editor Version 5.00 |
对于 64 位系统, 将以下文字保存为 reg 文件并双击导入注册表:
1 | Windows Registry Editor Version 5.00 |
安装时取消勾选安装浏览器插件, 完成后会发现 Web Protection 成功开启.
再说 Privatefirewall. Privatefirewall 原来是一款付费软件, 但也许公司不做个人的生意了, 所以现在完全免费.
Privatefirewall 体积很小, 占用资源也很低, 界面更加朴素, 属于大部分时间都没有存在感的软件; 但倘若有什么可疑进程有动作, 它内建的 HIPS 就会发出警告.
中上方的三个图标为情景模式选择, 可以根据家庭 / 工作 / 公用网路选择不同的防护等级, Firewall 红绿灯可以关闭 / 打开防火墙, 或者完全阻止网路流量.
可以针对不同进程设定是否允许特定 IP 段 / 端口的入站 / 出站 UDP 或 TCP 访问:
Privatefirewall 还拥有一个轻量级 HIPS, 默认情况下会放行受信任的发布商所发行的程序, 而提醒未知程序的关键动作:
如果信任此程序, 则同时勾选「Remember this setting」和「Apply to all alerts」并点击「Allow」, 否则根据情况暂时放行或阻止此动作, 甚至终止程序.
此外, 程序还提供了防火墙日志和当前监听网络的程序列表, 方便寻找网络异常源头.
Privatefirewall 拥有定期学习的功能, 会自动放行你常用的程序, 并结合其「默认放行受信任的程序」之功能, 既保护了你的电脑, 又不用进行繁琐的设定.
方案一是完全免费且比较轻松的一种搭配, 但如果想要更加简单易用, Avira 互联网安全版也是不错的选择.
前面说过, Avira 互联网安全版除了病毒防护, 对个人用户意义较大的功能还有 Web Protection 与防火墙, 这些都不用特别设定就能使用.
Avira 不提供控制其它程序行为的 HIPS, 防火墙是纯粹的网路防火墙. 有新程序试图访问网路时会发出提示.
要详细设定防火墙的话也可以, 只是有些麻烦, 因为 Avira 提供的规则设定不太友好, 要在一段话里通过点击关键词来改变含义 (简直是奇葩了喂!) ! 点多几下头脑就会晕掉…
Avira 互联网安全版是收费软件, 官方购买要价 RMB 292.00 / 年, RMB 585.00 / 三年, 但经官方授权的淘宝店却要便宜很多.
Safebeta 是 Avira 初进大陆市场时的合作店家, 现在似乎因为没时间打理的关系, Avira 互联网安全版正以 RMB 25.00 / 两年的价格抛售, 而且更有新浪微博转发送序列号的活动, 有需要的可以看看:
【正版特价】小红伞 Avira Internet Security 2012 2013 两年正版
请注意, 在上面这家店购买的序列号授权的用户为 Uschi Lotz 而非你的名字, 经过实验序列号也不可以叠加, 对此介意的朋友可以看看下面这家.
iholy 的店主似乎一直混迹于卡饭, 也是可以相信的店家, 价格要贵一些, RMB 234.00 / 三年:
【正版】Avira Internet Security2013 小红伞 三年 (S)
发淘宝的链接不是为了做广告, 也不是为了什么返利, 只是提供更优惠的正版, 也方便大家对价格进行比较.
]]>那个时代网络不发达, 软件获取与更新基本都靠父亲定期去买盗版「装机光盘」, 选择余地也很小. 豪杰超级解霸、KV3000、RealPlayer、Winamp、ACDSee、WinZip、FoxMail、NetAnts 在那个时代都是鼎鼎大名的.
到我零九年上大二的时候, 有了第一台自己的笔记本. 那时正是暴风影音、360 安全卫士、瑞星杀毒软件、傲游 2 浏览器等等国产软件流行的时候 (当然现在也还算流行 :-| ), 特别是暴风与 360, 几乎能在每台电脑上寻到它们的踪影.
随着电脑使用经验的不断积累, 还受到近几年发生的 XX 大战的影响, 我挑选软件的标准已经从当初单一的流行度转变到:
我试用过很多软件, 结合刚刚提到的标准, 筛选出适合日常使用的精品软件. 360 安全卫士热衷于给电脑评分, 尽管我的电脑没有安装 360, 可能也评不了高分, 但我的电脑不会比 360 所谓的高分电脑慢, 而且更加安全.
今次要推荐的软件是由 Ronen Tzur 开发的沙盒软件 Sandboxie.
沙盒是一种隔离运行程序的安全机制, 常用于执行从未验证的第三方供应商、不可信的用户与网站提供的不可信的程序. 沙盒为这些程序提供了严格控制的资源, 如磁盘与内存的暂存空间. 网络访问、扫描主机或读取输入设备的行为一般都会被禁止或严格限制. 在这点来说, 沙盒属于虚拟化技术的一种.
因此使用 Sandboxie, 您可以:
沙盒的最初作用就是隔离主机与不可信程序, 这在没有病毒防护软件的情况下特别有用. 即使程序有恶意行为, 也无法对主机产生影响, 在程序关闭后清空沙盒即可清除它的所有痕迹.
另外, 沙盒中运行的程序是被降权的, 程序不能加载服务、驱动, Sandboxie 基本不会出现程序影响到沙盒之外的主机, 也就是漏沙的问题.
担心程序偷偷上传隐私资料, 或是窃听其它程序? 不愿意让程序修改电脑的设定? Sandboxie 可以很好的完成这些任务.
将程序放在独立的沙盒中运行, 不仅主机与沙盒之间, 就连沙盒与沙盒之间的程序也是没有办法互相访问的.
(唯独需要提防截屏行为, Sandboxie 不阻止截屏. 为此, 您可能需要另外的 HIPS 软件以达到更高安全标准.)
很多程序原本是不需安装就能运行的绿色软件, 不过官方一般都不会提供绿化版本下载; 尽管第三方软件站可以下载到绿色版本, 其安全性却无法保证.
有了 Sandboxie, 可以把安装程序丢到沙盒里运行, 再拷贝出程序文件夹, 不少程序都能直接运行了. 当然, 另一些不能绿化的程序, 还是没有办法让他直接执行.
(还有一个好方法是免费的解压缩软件 7-Zip, 这个以后再介绍.)
程序会减缓电脑速度, 主要有两个原因.
一是会有后台进程甚至是服务常驻内存.
沙盒中默认不允许加载服务, 如果程序一定要服务才能正常运行, 只有先将程序在主机安装一遍, 使之正常创建服务, 再将之丢到沙盒. 不过这样还是对主机产生了影响.
对于有后台进程的程序, 可以设置「驻留程序」或是「先导程序」, 驻留程序指其它进程关闭后将被终止的程序, 先导程序与驻留程序相反, 先导程序的关闭将导致整个沙盘关闭.
二是向硬盘写入文件, 在系统分区频繁写入文件可能显著减缓电脑速度.
在沙盒中运行的程序, 其文件写入操作均被重定向到了沙盒保存的文件夹. 所以, 将沙盒文件夹移动到非系统分区, 沙盒一关闭, 程序对系统的影响仿佛不复存在.
一些游戏只允许同时运行一个实例, 可能多用户 / 多虚拟机的方式能解决多开问题, 但 Sandboxie 显然是成本最低的.
建立多个沙盒, 分别在每个沙盒中打开游戏. 由于沙盒对游戏的限制, 游戏没有办法检测到其它实例, 因此可以实现多开.
请注意, 未注册的 Sandboxie 不允许一个程序在多个沙盒中同时打开, 因此建议您注册 Sandboxie.
虽然我知道将下载 / 可移动介质的程序放在沙盒中运行比较安全, 但总有忘记这一操作的时候. 所幸 Sandboxie 提供了强制入沙的功能, 让恶意程序无机可乘.
强制入沙的方式中, 比较常用的是「强制运行文件夹」, 它能够强制整个文件夹的文件在指定沙盒打开. 将下载文件夹、可移动介质的分区都添加到强制运行文件夹中, 就实现了对它们的强制入沙.
这个功能也需要注册才能使用.
一些共享程序有时间限制, 而且重新安装程序并不会重新计时. 但在沙盒中就不一样了, 将程序在沙盒里运行, 试用期截止后清除沙盒, 剩余使用时间又神奇的回来了.
这算是 Sandboxie 的一个不正当应用, 当然有条件还是要支持正版.
Sandboxie 提供 30 天试用, 30 天之后会有提示但不影响使用. 推荐您购买这款软件, 因为它的授权费用比较便宜且允许多台电脑使用, 更重要的是可以实现强制入沙等高级功能.
PlaySoft 正组织 Sandboxie 个人授权团购, 原则上允许同时运行在一个用户的三台电脑上. 原价 29 欧元 (248.06 人民币元), 零售商原价 169 元, 参与团购仅需 125 元.
与零售版相比, 团购版本授权推送较慢 (不到一天时间), 且序列号不是通过官方邮件发送, 而是由店主代为发送; 但 PlaySoft 是 Sandboxie 官方授权的零售商, 官网能够查验, 本人亲身购买经历, 可以放心. 机不可失, 时不再来.
如果您对价格感到不放心, 或是错过了团购时间, 可以以 169 元的原价购买:
Ronen Tzur 官方授权 Sandboxie 沙盘个人版 - 中文【终身更新】
有兴趣的同学可以加入 PlaySoft 组织的软件团购群,其, 会不定期发布团购消息.
]]>新浪微博于近期全面启用了 OAuth 2.0 授权, 本插件仅支持旧版 OAuth, 因此在月底左右将无法通过认证, 亦无法获取微博.
停止支持的决定出于以下原因而作出:
如果有其它微博也作出如此无语的升级, 此插件基本上会停止支持.
]]>