TinyLab

Keep eyes on the star and feet on the ground.


  • 首页

  • 归档

  • 分类

  • 标签

每周一荐:《奇特的一生》

发表于 2012-12-13   |   分类于 每周一荐

《奇特的一生》里面讲述了一位用自己的一生去规划时间的人——亚历山大·亚历山大德罗维奇·柳比歇夫(BTW:这位大师的名字可真是太长了)。

通过学习统计学,他自己总结出来的时间统计法,五十几年如一日的去记录自己的每一天都做了些什么有意义的事情。在有限的生命里,多个领域都有所涉猎,不为名利,只为给自己有个交代。生活对于他来说,就是精辟地理解。“蠕虫那么长,人生可是那么的短!”,时间必须认真对待!

他坚信,时间是最宝贵的财富,不能乱用到怄气上,不能乱用到竞争角逐或满足虚荣心上。在他看来,对待时间的态度是个道德问题。

或许我们会认为这样的生活难免太过机械了,但我们日出而作、日落而息、吃饭、穿衣何尝不是每一天都在机械的进行着?他只是在最大化地利用自己的时间,在有限的生命里面去做更多的事情,去更好的理解这个世界。

奇特的一生

摘录一些语句:

现在的人们却如此轻易的为了未来而忘记过去。

蠕虫那么长,人生可是那么短!

科学是以怀疑为始,以深信不疑为终点。哲学同样也是如此。

竟然有这么多我不需要的东西啊!

决定一个人精神品质的,不是他的行为本身,而是他的意图。

生活就是透辟地理解

有能量守恒定律、有质量守恒定律——为什么没有时间守恒定律呢?为什么时间会无影无踪地从人类生活中不知去向了呢?

每周一荐:差异利器Beyond Compare

发表于 2012-11-01   |   分类于 每周一荐

前一段时间,介绍过用Total Commander来完成文件夹同步的时候,一位朋友留言推荐了Beyond Compare——一个强大的超越了文件差异比较的工具。Beyond Compare对于提升工作效率,绝对是一个利器。

单独的文件差异工具不胜枚举,如:WinMerge、WinDiff、Diffuse等,还有Unix/Linux下犀利的命令行工具:diff,一般源码的补丁就是靠它搞定的,先用diff差异一下,再patch一下就OK了;版本控制软件一般默认也都提供了自己的差异和合并软件(如:TortoiseSVN的TotoiseMerge)。

Beyond Compare

Beyond Compare正如其名,“超越了比较”,它有三个核心功能:

  • 差异比较
  • 文件夹同步
  • 文本合并

1. 差异

支持多种文件格式的差异,对于我们“程序猿”来说,最重要的要数文本文件差异和语法高亮了。对于策划或其它经常使用Excel的来说,数据文件差异是个非常强大的功能。

1.1 文件夹的差异

选择Folder Compare,选择要进行比较的两个目录。蓝色高亮的部分就是比较的另一个目录缺失的,红色高亮的就是两边都存在,但存在差异的。工具栏提供了许多选项,使用的过程中可以慢慢摸索。

Beyond Compare

1.2 文本文件的差异

选择“Text Compare”,选中两个文本文件。如果是代码,同时可以进行语法高亮显示,其它差异软件一般都会有此功能。

Beyond Compare

1.3 数据文件差异(如:Excel文件)

选择“Data Compare”,选择要比较的两个数据文件,可以是Excel文件,也可以CSV等数据文件。这个功能对于经常做数据的朋友来说,是非常有用的。

Beyond Compare

1.4 16进制数据差异

选择“Hex Compare”,选择要比较的两个二进制文件。该功能会对选择的两个文件,每个字节进行比较。差异的地方高亮显示。

1.5 图像的差异

选择“Picture Compare”,选择要比较的两个图像文件,然后中间一个窗口就会把两张图片差异的部分显示出来,可以通过拖动图片或者选择工具栏相关选项做调整。

Beyond Compare

2. 文件夹同步

选择“Folder Sync”,选择要同步的两个目录,点击“Sync”即可。Total Commander也有类似的功能,该功能对于经常做文件备份的朋友会非常有用,当备份之间存在差异的时候,文件夹只需要同步一下,万事OK,免得丢失文件或者一个个去对比浪费时间。

Beyond Compare

3. 文本合并

文本文件是可编辑的,在差异的基础上对两个文件进行编辑合并,对于代码版本控制、解决冲突非常有用。

小结

BeyondCompare是一款非常不错的提高工作效率的利器,推荐给大家使用。(文件差异与合并、目录同步这些功能有相应的开源的可以代替Beyond Compare)。

关于程序员面试的一点想法

发表于 2012-10-12   |   分类于 项目管理

从去年到现在,算算也面试过不少人了。对于如何通过面试找到合适的人才这个问题,也想了很多。面试往往都是,聊一聊技术和工作经验,调侃一下游戏程序员“悲惨的命运”,感觉技术不错,有激情,扛得住“无底线”的加班,基本上都OK。下周要去西安进行校招面试,抽空整理了一下思路。关于如何有效地进行面试,有了点想法,希望大家多多提建议。

如何设计面试方案?

程序员面试

招聘的目的就是:找到能按时、高效、准确地完成工作任务的人。要想完成这个目标:

  • 首先,要明确日常的工作任务都有那些;
  • 其次,思考这些完成这些任务都需要具备怎样的条件和能力;
  • 最后,设计一个合理、高效的面试方案

针对上面三点,要想清楚下面三个基本问题:

  • 需要新人完成什么样的任务?(明确任务)
  • 什么样的人能完成这些任务?(明确新人需具备的能力)
  • 通过什么途径和方法去找到这些人?(设计招聘方案、面试问题)

设计面试问题的时候,可以参考一下下面的原则:

  • 每一个面试问题都有明确的目的。你不仅自己了解,还能向其他面试官解释清楚。
  • 多提一些开放性的问题,而不是那种用Yes/No就可以回答的问题。这样做使你有机会与面试者展开讨论,并且提出后续的问题,尽可能多地了解对方。
  • 不要问太复杂的问题。因为面试者没有太多思考时间,所以无法周全地回答,你也就无从判断他的能力了。

案例:网游程序员面试方案设计

第一步: 明确日常工作中遇到的任务,然后由工作任务展开,然后思考完成这些任务需要具备什么样能力、知识体系的人。针对这些能力,进一步设计面试问题。这样做的好处是系统地整理了一下需要新人完成的任务,和其必须具备的能力,然后又有针对性地提问。问题目的非常明确,我们需要的就是可以回答这些问题,具备这样能力的人。

关于网游开发程序员需要完成的任务和问题整理如下:(不完整,各个游戏公司肯定也有很大不同)

程序员面试

第二步:上面主要集中在职业技能,需要具备的技术(有侧重点)。下面针对非技术能力来设计面试问题,这个最重要的是看公司企业文化,公司的环境氛围和项目的实际情况,来寻找适合的人。

程序员面试

第三步:收集技术能力测试的问题和非技术能力的问题,进行合理配置,最终方案如下(针对校招生):

程序员面试

小结

细想了一下,其它行业的面试,思路也都大同小异。面试前,一定要先想清楚上面提到的“三个问题”,这样才能做到有针对性,才有可能招到合适的人才。个人认为,面试其实个人感觉还是有很重的分量,有时第一印象,言行举止都可能引起感觉不对,很有可能淘汰掉优秀的人才。

对于如何进行有效的面试,你有什么看法了,欢迎探讨。邮箱:heaven.hell.or@gmail.com

每周一荐:支持latex的思维导图软件docear

发表于 2012-08-23   |   分类于 每周一荐

提起思维导图软件,能想到很多,开源的、商业的、简洁的、复杂的,不胜枚举!如:Xmind、MindManager、FreeMind、inspiration、Axon等。想要知道更多,请google之。去年看了托尼·巴赞关于思维导图的几本书之后,无论做笔记还是思考一些问题的时候,都会用笔随便画一画,思路理清楚了之后,输入到FreeMind。使用FreeMind的理由很简单:开源、免费、简洁,功能虽然无法与MindManager、Inspiration等商业软件相比,对于个人应用足以。

直到最近,重拾数学的旧梦,当然学习数学最好的工具就是笔和纸,也想着把数学知识体系用MindMap表示,以方便记忆。数学公式最好的编码方法无非就是latex了,网上找了下,FreeMind有个支持Latex的插件(需要的同学,可以在文章后面的链接去下载),随后又看到一个在FreeMind基础上扩展的一个专门用于理工科的MindMap软件,叫SciPlore。进入SciPlore主页,赫然写着:”SciPlore MindMapping is outdated. Please use Docear the successor of SciPlore MindMapping instead“。试用了一下,感觉还不错,给大家推荐一下。(注意:docear现在还只是Beta测试版,才发布没多久)

docear

Docear为搜索、组织和创作学术文献,如作业、论文、书籍和研究论文,提供完整解决方案,就像一个办公软件包一样。集成了学术搜索引擎、文件管理、PDF阅读器、思维导图、笔记工具、参考文献管理和文字处理等功能。并且它的各个功能模块是可以替换的,比如你不喜欢用Docear的参考文献管理,你可以轻而易举地使用其它的。

Docear是用Java写成的,运行在任何安装了Java虚拟机的机器上。提供了Windows、Linux、Mac系统的安装包。

实例——漂亮的MindMap:

docear

实例——完美支持Latex公式

docear

参考资料:

  • Freemind Latex插件下载地址:http://vdisk.weibo.com/s/F2C-
  • Docear主页:http://www.docear.org/

每周一荐:Objective-C的开源开发环境GNUstep

发表于 2012-08-16   |   分类于 每周一荐

Objective-C近几年变得越来流行,TIOBE世界编程语言排行榜中Objective-C的排名不断上升,同时也反应出Apple平台的开发受到越来越多的人关注。Objective-C语言作为Apple世界的官方语言,无论是MAC开发还是iOS开发,甚至系统层的编写它都能够胜任。融合了C和Smalltalk的面向对象特性,Objective-C变得简单、高效(比起C++等面向对象语言)。一般情况下,要想玩玩Objective-C,可以购买一台MAC电脑+免费的Xcode,就拥有了一整套Objective-C的开发环境,就可以为你的iPhone、iPad、iTouch、Mac机编写应用了。Apple的东西,做工精细的同时也价格不菲,难怪有人说:“单反毁三代,苹果毁一生”。本文要给大家推荐一个开源的Objective-C开发环境——GNUstep,从此以后你既可以在Linux平台上玩ObjC,也可以在Windows平台上玩ObjC了。

1. 一点历史

简单来说,GNUstep 是使用OpenStep 界面的开源(Open Source) 计划,目的为提供跨平台的面向对象的开发环境。

早在1985 年,Steve Jobs 离开苹果电脑(Apple) 后成立了NeXT 公司,并于1988 年推出了NeXT 电脑,使用NeXTStep 为操作系统。在当时,NeXTStep 是相当先进的系统。 以Unix (BSD) 为基础,使用PostScript 提供高品质的图形界面,并以Objective-C 语言提供完整的面向对象环境。

尽管NeXT 在软件上的优异,其硬体销售成绩不佳,不久之后,NeXT 便转型为软件公司。1994 年,NeXT 与Sun(Sun Microsystem) 合作推出OpenStep 界面,目标为跨平台的面向对象程式开发环境。NeXT 接着推出使用OpenStep 界面的OPENSTEP 系统,可在Mach, Microsoft Windows NT, Sun Solaris 及HP/UX 上执行。1996 年,苹果电脑买下NeXT,做为苹果电脑下一代操作系统的基础。 OPENSTEP 系统便演进成为MacOS X 的Cocoa 环境。

在1995 年,自由软体基金会(Free Software Fundation) 开始了GNUstep 计划,目的在使用OpenStep 界面,以提供Linux/BSD 系统一个完整的程式发展环境。但由于OpenStep 介面过于庞大,开发人力不足,及许多技术在当时尚未成熟(如Display PostScript),所以直到目前为止,GNUstep 才算是一个完整的编程开发环境。

尽管OpenStep 早在1994 年便提出,其界面及架构在现今仍相当先进及实用,使得开发GNUstep 程序相当容易。

2. 简介

GNUstep 使用Objective-C 语言,是C 语言加上SmallTalk 的面向对象的功能。结合两者的优点,又不至于像C++复杂。

GNUstep 提供两个主要的程序库,Foundation 及AppKit。Foundation 处理非图形介面的部份。如字串, 档案, 网路, 基本资料结构, 多行绪等, 又称之为GNUstep Base。AppKit 则处理图形介面的部份, 包含视窗, 使用者界面等, 又称之为GNUstep GUI。

由于GNUstep 具有跨平台的特性,有关绘图及字型的部份,则交由GNUstep Back 来处理。使用者可依所使用的操作系统,选择适当的后端处理(Backend)。 GNUstep GUI 会自行处理与Back 相关的功能,程式开发者只要使用GUI 程式库,便可适用于各种后端上, 完全不用考虑平台问题。

3. Linux下安装GNUstep

在此仅介绍一下Ubuntu下面的安装,其它安装方法,参考GNUStep官方文档:http://www.gnustep.org/resources/documentation/User/GNUstep/gnustep-howto_toc.html。

Step1:让gcc支持objective-C的编译

$apt-get install gobjc
$gcc -x objective-c hello.m -o hello

hello.m 随便写几个c函数,编译通过就OK了。例如:

int main(int argc, const char* argv[])
 {
 printf("Hello Objective-C!");
 return 0;
 }

Step2:安装GNUstep

$apt-get install gnustep
$apt-get install gnustep-devel
$apt-get install libgnustep-base-dev

Step3:配置GNUSTEP_MAKEFILES和执行GNUstep.sh,自动加载其它环境路径

$chmod +x /usr/share/GNUstep/Makefiles/GNUstep.sh
$export GNUSTEP_MAKEFILES=/usr/share/GNUstep/Makefiles
$source /usr/share/GNUstep/Makefiles/GNUstep.sh

也可以把后面两条放在.bashrc或.bash_profile中,这样就不用每次登陆或者新开终端都敲一遍了。

Step4:编译一个简单的hello程序,测试下看GNUstep安装的是否OK

hello.m内容如下:

#import <Foundation/Foundation.h>
int main(int argc, const char* argv[])
 {
 NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
 NSLog(@"Hello GNUstep!!\n");
 [pool release];
 return 0;
 }

编译一下:

$gcc -Wall -g -o hello hello.m -I/usr/include/GNUstep/ -fconstant-string-class=NSConstantString  -lobjc -lgnustep-base
$./hello
2012-08-16 17:54:08.315 hello[12915] Hello GNUstep!!

编译没有出错,运行hello看到”Hello….”,恭喜你!GNUstep安装成功!

4. Windows下安装GNUstep

Windows下安装GNUstep是比较简单了,直接在此下载安装包:http://www.gnustep.org/experience/Windows.html,内置了MSYS系统。直接从菜单“开始”->”所有程序” -> “GNUstep” -> “shell”, 创建Objective-C文件hello.m(内容同上),用如下命令编译:

$ gcc -o hello hello.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Library/Libraries/ -fconstant-string-class=NSConstantString -lobjc -lgnustep-base

5. 参考资料:

  • 官方主页:http://www.gnustep.org/

每周一荐:Python Web开发框架Django

发表于 2012-08-09   |   分类于 每周一荐

花了两周时间,利用工作间隙时间,开发了一个基于Django的项目任务管理Web应用。项目计划的实时动态,可以方便地被项目成员查看(^_^又重复发明轮子了)。从前台到后台,好好折腾了一把,用到:HTML、CSS、JavaScript、Apache、Python、mod_wsgi、Django。好久不用CSS和JavaScript了,感到有点生疏了,查了无数次手册。后台Django开发环境的搭建也花了不少时间和精力。记录下来,免得以后走弯路。同时给大家推荐一下Django框架,如果你想非常快速地编写自己的web应用,可以考虑使用Django,同时Django还会给你提供一个功能强大的后台管理界面。

Django是一个开源的Web应用框架,由Python写成。采用MVC的软件设计模式,主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don’t Repeat Yoursef)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。它可以运行在启用了mod_python或mod_wsgi的Apache2,或者任何兼容WSGI(Web Server Gataway Interface)的Web服务器。

1. Django的快速开发

  • 第一步(Model):设计自己的数据模型。
  • 第二步(View):创建网页模板。Django自己的Html模板语言,非常容易将数据和模板结合起来,创建动态页面。
  • 第三步(Control):定义URL,提供服务和控制。

  • 入门教程:https://docs.djangoproject.com/en/1.4/intro/tutorial01/

2. Django开发环境的搭建

Django可以运行在任何遵守WSGI的Web服务器上。本文主要介绍Apache2+mod_wsgi+Django的环境搭建。所需要的软件如下:

  • Apache2:Web服务器
  • Python2.x:Python语言支持
  • mod_wsgi:Apache的WSGI模块,有了该模块的支持,就可以用Python做为CGI脚本来编写网络应用(之前还有一个mod_python,在Apache官网上发现mod_python已经过时,渐渐要被mod_wsgi替代,据说mod_wsig性能要好一些)
  • Django:一个强大的Python Web开发框架,本文的主角。

2.1 Apache的安装

下  载:http://httpd.apache.org/download.cgi (选择版本2.2.22,mod_wsig暂不支持2.4.2)
解压缩 :$tar xvfz httpd-NN.tar.gz
$cd httpd-NN
编译配置:$./configure –with-included-apr –prefix=PREFIX #with-included-apr选项指定使用apache软件包里面的apr库
编  译:$make
安  装:$make install
配  置:$vim PREFIX/conf/httpd.conf
测  试:$PREFIX/bin/apachectl -k start
参  考:
官方主页:<http://httpd.apache.org/>
安装文档:<http://httpd.apache.org/docs/2.2/install.html>

2.2 Python的安装

下  载:http://www.python.org/getit/releases/2.7.3/(选择2.X版都可以,3.0暂不支持)
解压缩 :$tar xvf python-X.tar
$cd python-Y
编译配置:$./configure –enable-shared –prefix=PREFIX #–enable-shared选项指定生成python的动态库
编  译:$make
安  装:$make install
测  试:$python
参  考:
官方主页:http://www.python.org/

2.3 mod_wsgi模块的安装

下  载:http://code.google.com/p/modwsgi/ (选择3.3版本)
解压缩 :$tar xvfz mod_wsgi.X.Y.tar.gz
$cd mod_wsgi.X.Y
编译配置:$././configure –with-apxs=/usr/local/apache2/bin/apxs –with-python=/usr/local/bin/python # 指定Apache2的模块编译程序和Python解析器
编  译:$make
安  装:$make install
测  试:$python
2.3.1 配置Apache(修改/usr/local/apche2/confi/httpd.conf)

1>. 加载wsgi模块

LoadModule wsgi_module modules/mod_wsgi.so
....

2>. HTTP请求处理脚本

WSGIScriptAlias /test  /home/xxx/www/test.wsgi
<Directory "/home/xxx/www">
Order allow, deny
Allow from all
</Directory>
2.3.2 编写test.wsgi(WSGI标准:http://www.python.org/dev/peps/pep-3333/)
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]
2.3.3 重启apche2

在任意网络浏览器中输入:http://www.mysite.com/test。看到“Hello World!”,恭喜你成功安装了WSGI模块。

参  考:
官方主页:http://code.google.com/p/modwsgi/
安装文档:http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide
配置文档:http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide
WSGI文档:http://www.python.org/dev/peps/pep-3333/

2.4 Django的安装

下  载:https://www.djangoproject.com/download/ (选择1.4版本)
解压缩 :$tar xvfz Django-1.4.tar.gz
$cd Django-1.4
安  装:$python setup.py install
测  试:
$python
>>> import django
>>> print(django.get_version())
参  考:
官方主页:https://www.djangoproject.com/
安装文档:https://docs.djangoproject.com/en/1.4/intro/install/
快速入门:https://docs.djangoproject.com/en/1.4/intro/tutorial01/

3. Django中文支持

Django使用的是UTF-8编码,所以对于国际化支持不成问题。因为初次玩Django,中文显示乱,折腾死人了(一直在用的的mysql默认字符串是latin1编码,vim默认保存的文件编码为ascii)。最终得出结论,如果中文显示乱码,或者Django报错(… unicode …blabla…),请检查:

Django的设置。打开自己项目的settings.py,LANGUAGE_CODE=”zh_CN” ?FILE_CHARSET=’UTF-8′ ?DEFAULT_CHARSET=’utf-8′?

查看自己项目所有的文件编码是否以UTF-8编码保存的?确保.py文件第一行要加上:#-- coding:utf-8 -- ?

HTML模板文件head部分,添加<meta http-equiv=“Content-Type” content=“text/html;charset=utf-8″/>

检查自己项目的数据库字符串编码是否为UTF-8,命令如下:

查看:

show create database dbname;
show create table tablename;
show full columns from tablename;

创建:

create database dbname CHARACTER SET utf8;
create table tblname CHARACTER SET utf8;

修改:

alter database dbname CHARACTER SET = utf8;
alter table tablename CONVERT TO CHARACTER SET utf8;

4. Django应用的部署

Django应用的运行有两个方式,一种是在开发阶段,使用创建项目下面的manager.py runserver ip:port来启动一个用Python实现的轻型web服务器;另外一种就是通过mod_wsgi将你自己的应用部署到生产环境,对外提供服务。下面简单介绍一下Django的部署(虚拟主机上的配置,自行参考文档)。

假设你创建的Django项目文件列表如下:

my-site
|- my-site
|- myapp
    |-static
    |- ...
|- static
    |- css
    |- js
    | ...
|- apache
|- ...

4.1. 创建Django项目的wsgi脚本(my-site/apache/django.wsgi),内容如下:

import os, sys

sys.path.append('/.../www/')
sys.path.append('/.../www/my-site')
os.environ['DJANGO_SETTINGS_MODULE'] = 'my-site.settings'
os.environ['PYTHON_EGG_CACHE'] = '/.../www/.python-eggs'

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ, start_response):
    if environ['wsgi.url_scheme'] == 'https':
        environ['HTTPS'] = 'on'
    return _application(environ, start_response)

4.2. 配置Apache(httpd.conf),内容如下:

1>. 请求访问www.xxx.com/的时候,转到django.wsgi

WSGIScriptAlias / /.../www/my-site/apache/django.wsgi

<Directory /.../www/my-site/apache>
Order deny,allow
Allow from all
</Directory>

2>. 静态文件的访问路径配置

Alias /static/ /.../www/my-site/static/

<Directory /.../www/my-site/static>
Order deny,allow
Allow from all
</Directory>

4.3. 配置setting.py

EBUG=False

自定义404.html,500.html模板(网页未找到、服务器内部错误)

4.4. 静态文件

STATIC_ROOT = ‘/…/www/my-site/static/’
STATIC_URL = ‘/static/’
$./manager.py collectstatic

注意:开发阶段,一般都会把相应app的静态文件,放在app目录下的static目录下。在正式生产环境部署的时候,使用./manager.py collectstatic来把所有静态文件收集到STATIC_ROOT指定的位置,包括管理后台的。

4.5. 重启apahce

浏览器输入相应的URL地址,看到你自己的web应用界面的话,恭喜大功告成!

5. 总结

本文主要介绍了一下Django开发环境的搭建、Django应用的部署和中文乱码的解决方法。具体如何使用Django快速地创建自己的web应用,并没有提及。Django相对来说,文档比较齐全,加上官方推出的一本书:《The Django Book》,相信只要开发环境搭建好,创建自己的Web应用也会非常容易。

进一步学习Django,请看:

  • Django1.4文档:https://docs.djangoproject.com/en/1.4/
  • Django Book 英文版:http://www.djangobook.com/en/2.0/
  • Django Book 中文版:http://djangobook.py3k.cn/2.0/

每周一荐:TotalCommand的文件夹同步功能

发表于 2012-07-05   |   分类于 每周一荐

有空的时候就喜欢拍一些照片,虽然技术不怎么样,但往往辛苦得来的照片,不忍心丢失,所以会隔一段时间将照片备份到NAS(网络存储)。电脑上的照片,闲暇的候翻看的时候,也可能会修改一些照片(PS、裁剪等)。备份的时候,直接把照片目录(Photos)直接复制过去,久而久之,照片的数量越来越多,甚至一个电脑的硬盘都装不下了,复制的代价越来越大,加之对NAS的访问只通过WIFI,所以备份将是一个非常耗时的事情。

TC(Total Command,下面都以TC简称)的“Sychronize Dirs”功能,是在无意间发现的,该功能可以对比两个文件夹的差异,并且可以把差异的部分同步。操作步骤如下:

Step1:打开需要同步的两个的文件夹,如图:

TotalCommand

Step2:菜单Commands->Sychronize Dirs,然后对文件夹进行对比,有四种对比的结果:

  • “->” :左边有,右边没有,同步的时候会将左边的文件复制到右边的文件夹
  • “=” :左右相等,同步的时候这些文件不会发生任何改变
  • “!=”:文件不相等(文件的修改时间,可以勾选“by Content”来对比内容,对于不同的文件需要安装插件),同步的时候从左复制到右,还是从右复制到左?这种情况由用户决定要怎么处理。
  • “<-” :左边没有,右边有的,同步的时候会将右边的文件复制到左边的文件夹

TotalCommand

提示:

  • 可以通过上面的Show:”->” ”=” ”!=” ”<-” 来控制需要同步的差异类型
  • 可以通过勾选”Asymmetric”, “Subdirs”, ”by Content”, “ignore date” 来改变对比和同步的结果

Step3:确认每个文件需要同步的操作类型。确认完成后,点击右上角的“Synchronize”按钮,完成同步操作。

TotalCommand

TC的目录同步功能,正好可以用来完成添加、删除、修改频率比较高,并且数量很大的文件的差异备份。使用TC的目录同步功能后,遇到难以取舍的照片的时候就不用发愁了,保存下来,定期使用TC对电脑里面的照片和NAS里面的备份,进行一次同步。代价远远小于复制式的备份。下面是自己的照片管理方案,相信已经很安全了(曾经痛失过上G的和家人一起的照片,要吸取教训)。

TotalCommand

每周一荐:学习ACE一定要看的书

发表于 2012-06-08   |   分类于 每周一荐

近两个月都在学习ACE,一个超级强大,也超级复杂的网络框架库。对ACE的大名早有听说,同时也听说过它的复杂性,所以一直不敢去碰它。ACE对程序员的要求是比较高的了,需要对C++、设计模式、POSA、网络、并发等有一定的了解后,才能去碰它。不然真的是一头扎进茫茫大海,越看越复杂,直到消磨完所有对ACE的热情。

经过两个月的摸索,查找各种资料,最后也总算是知道了该如何去学习这个Ace(王牌)基本的ACE,以后有所心得,也会即时在博客上予以分享。下面推荐几本学习ACE必备的工具书。

ACE

###《C++网络编程:运用ACE和模式消除复杂性 卷1》(简称:C++NPv1)

这应该是你需要了解的第一本关于ACE的书,本书中提出了ACE作者对于网络问题的研究,分为四个设计空间:网络、并发、服务、配置。本书核心讲述网络和并发应用程序的开发,及其ACE与之对应的Wrapper Facade Class,并以一个日志服务器实例作为演示,使用多种方式实现该日志服务器(实例代码参见,ACE_Wrapper/examples/C++NPv1)。(关于Wrapper Facade 模式可以参考《POSA 卷2》,具体优缺点不在此赘述了)。

ACE

###《C++网络编程:基于ACE和框架的系统化复用 卷2》(简称:C++NPv2)

本书核心内容主要讲述《C++NPv1》中分出的四个设计空间中的:服务器设计空间和配置设计空间,及ACE基于Wrapper Facade的框架实现。如:Connector-Acceptor、Reactor、Proactor、Stream、Service Configurator等。对应于ACE的框架层。

ACE

###《ACE程序员指南:网络与系统编程的使用设计模式》(简称:APG)

阅读APG,可以对ACE有一个整体的了解,Wrapper层、框架层都有涉及。但本书只对用法做了描述,所以很多地方不如《C++NPv1》和《C++NPv2》深刻,可以将本书作为入门第一本。

ACE

###《面向模式的软件架构:网络与并发模式 卷2》(简称:POSAv2)

POSA系列的第二本,由ACE作者Douglas C. Schmidt和三位网络开发界几位大牛执笔,根据自身开发网络应用的经验,总结出网络和并发相关模式。许多模式读来,醍醐灌顶。把网络应用开发中的各个难点都提出了相应模式解决方案。因为ACE中运用了很多网络、并发架构模式,都可以在本书中找到相应的描述和讲解。作为一个做服务器端开发的人(在此,指的是做底层框架而非仅仅是应用逻辑开发的),这本书是必须要读的,并且要深刻理解里面提到的模式。

ACE

ACE相关论文集(网上的资料,未见相应出版物)

下面这些资料,都是网上一些热爱ACE的人整理的。因为ACE对于网络程序开发有非常大的影响,Douglas C. Schmidt及其ACE热爱者关于ACE也写了不少论文,同时使用ACE实作了很多的应用实例。(多数实例都可以在ACE的源码目录下example、app目录下找到)

  • 上篇-ACE技术论文集
  • 中篇-ACE程序员教程
  • 下篇-ACE应用实例

小结和建议

鉴于ACE的强大和复杂,许多人对此都会望而却步。但作为一个强大而深刻网络开发工具包,很有必要好好研习一番,就算以后不会用到它去直接做开发,但其中的设计思想和设计、架构模式对我们以后做服务器架构和开发有着巨大的帮助。我也会在此信念下,不断地学习ACE,并从中学习关于网络服务器开发的知识,有所心得,会及时分享。也是刚找到一条学习ACE的路线,希望会坚持下去,写下该篇算是第一步。

对于ACE,只看书肯定是不行的,一定要阅读ACE的代码,刚开始学习,最好的开始就是ACE_Wrapper/examples。

坚持、坚持、再坚持!ACE,一定要搞定!希望本篇推荐的关于ACE的书,会对网络开发程序员有所帮助!

每周一荐:Google的序列化框架Protobuf

发表于 2012-05-31   |   分类于 每周一荐

1. 简介

Protocol Buffers是Google的一个序列化框架,可以非常方便地把程序中用到的结构化数据转换成二进制字节块,并且它对于结构化数据的编码也是比较特殊的,一个字节最高位(MSB)代表下一个字节是否和当前这个字节构成一个数据。因此,Protobuf的存储效率比较高,数值小的占的字节数少,数值大的占的相应的字节数就比较多。

Protobuf对于程序中对应的结构会有一份结构描述文件。可以通过它提供的protoc生成指定类型的代码(C++、Java等),对于网络协议的编写有极大的方便,一处定义,然后可以转换成多种语言的代码。同时,还支持RPC。

以前在项目中也写过序列化相关的代码,最质朴的BYTE、WORD、DWORD、QWORD或者对应的数组,并且可以非常方便地对于STL容器进行序列化,容器的嵌套也不在话下(如:std::map<DWORD, std::vector<…> >)。但对于数据结构的变动,就必须自己进行版本化控制。而Protobuf对于结构每一个字段都有一个标识,只要保证按着它的添加规则来(具体参考下面的链接),版本控制基本上就都可以靠Protobuf搞定了。

2. 一个简单的例子

step1:写一个example.proto文件

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}

step2:使用protoc编译,生成指定程序类型的代码(example.pb.h, example.pb.cc)

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/example.proto

step3:使用生成的代码

序列化代码片段:

1
2
3
4
5
6
7
8
Person person;
person.set_id(123);
person.set_name("Bob");
person.set_email("bob@example.com");

fstream out("person.pb", ios::out | ios::binary | ios::trunc);
person.SerializeToOstream(&out);
out.close();

反序列化代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
Person person;
fstream in("person.pb", ios::in | ios::binary);
if (!person.ParseFromIstream(&in)) {
cerr << "Failed to parse person.pb." << endl;
exit(1);
}

cout << "ID: " << person.id() << endl;
cout << "name: " << person.name() << endl;
if (person.has_email()) {
cout << "e-mail: " << person.email() << endl;
}

3. 更多参考资料

  1. Protobuf下载:https://code.google.com/p/protobuf/
  2. Protobuf文档:https://developers.google.com/protocol-buffers/?hl=zh-CN
  3. Protobuf编码规则:https://developers.google.com/protocol-buffers/docs/encoding?hl=zh-CN
  4. Protocol Buffer Basics: C++ https://developers.google.com/protocol-buffers/docs/cpptutorial?hl=zh-CN

每周一荐:用gnuplot绘制函数曲线

发表于 2012-05-17   |   分类于 每周一荐

喜欢数学的人,都说数学公式是世界上最简洁而深刻的诗,数学曲线是世界上最美的图画。本周给大家推荐一个开源的函数曲线绘制工具:gnuplot。别小看这个工具,年龄和我一般大,gnuplot 是在 1986 年由 Colin Kelley 和 Thomas Williams 最初开发的。许多参与者都在为不同的“终端”创建变种方面做出了贡献。在 1989 和 1990 年,这些变种被合并到 gnuplot 2.0 中。2004 年 4 月,发布了 4.0 版本。前缀gnu千万不要误解和Linux世界的GNU有关系,只是一个巧合,gnuplot被开发出来的时候,GNU不久才诞生。

Gnuplot 是一种免费分发的绘图工具,可以移植到各种主流平台。它可以下列两种模式之一进行操作:当需要调整和修饰图表使其正常显示时,通过在 gnuplot 提示符中发出命令,可以在交互模式下操作该工具。或者,gnuplot 可以从文件中读取命令,以批处理模式生成图表。例如,如果您正在运行一系列的实验,需要每次运行后都查看结果图表;或者当您在图表最初生成很久以后需要返回图表修改某些内容时,批处理模式能力会特别有用。当在 WYSIWIG 编辑器中很难捕获用于修饰图表的鼠标单击事件时,您可以很容易地将 gnuplot 命令保存在文件中,六个月后将其加载到交互式会话中重新执行。

启动界面:

gunplot

绘制二维函数曲线:

gunplot

damp(t) = exp(-s*wn*t)/sqrt(1.0-s*s)
per(t) = sin(wn*sqrt(1.0-s**2)*t - atan(-sqrt(1.0-s**2)/s))
c(t) = 1-damp(t)*per(t)

wn = 1.0
set xrange [0:13]
set samples 50
set dummy t
set key box

plot s=.1,c(t),s=.3,c(t),s=.5,c(t),s=.7,c(t),s=.9,c(t),s=1.0,c(t),s=1.5,c(t),s=2.0,c(t)
绘制三维曲面:

gunplot

set samples 20
set isosamples 20
set view 60,30
set xrange [-3:3]
set yrange [-3:3]
set zrange [-1:1]
set ztics -1,0.5,1
set grid z
set border 4095
splot sin(x) * cos(y)
绘制直方图:

gunplot

set title "A demonstration of boxes in mono with style fill pattern"
set samples 11
set boxwidth 0.5 
set style fill pattern border
plot [-2.5:4.5] 100/(1.0+x*x) title 'pattern 0' with boxes lt -1, \
                 80/(1.0+x*x) title 'pattern 1' with boxes lt -1, \
                 40/(1.0+x*x) title 'pattern 2' with boxes lt -1, \
                 20/(1.0+x*x) title 'pattern 3' with boxes lt -1

上面随便举了几个例子,gnuplot提供了很多函数曲线显示控制的命令。能绘制的曲线有两种:1> 数学函数;2> 数据文件。gnuplot用于数据可视化是个不错的选择。小巧但功能强大,推荐给喜欢数学的同学。

更多资料:
  1. 主页:http://www.gnuplot.info/
1…678…13
David++

David++

123 日志
25 分类
65 标签
RSS
GitHub 知乎 微博 豆瓣
© 2007 - 2021 David++
由 Hexo 强力驱动
主题 - NexT.Pisces