2014年7月 ’ 的文章存档

一致性hash和solr千万级数据分布式搜索引擎中的应用

互联网创业中大部分人都是草根创业,这个时候没有强劲的服务器,也没有钱去买很昂贵的海量数据库。在这样严峻的条件下,一批又一批的创业者从创业中获得成功,这个和当前的开源技术、海量数据架构有着必不可分的关系。比如我们使用mysql、nginx等开源软件,通过架构和低成本服务器也可以搭建千万级用户访问量的系统。新浪微博、淘宝网、腾讯等大型互联网公司都使用了很多开源免费系统搭建了他们的平台。所以,用什么没关系,只要能够在合理的情况下采用合理的解决方案。

那怎么搭建一个好的系统架构呢?这个话题太大,这里主要说一下数据分流的方式。比如我们的数据库服务器只能存储200个数据,突然要搞一个活动预估达到600个数据。
可以采用两种方式:横向扩展或者纵向扩展。
纵向扩展是升级服务器的硬件资源。但是随着机器的性能配置越高,价格越高,这个代价对于一般的小公司是承担不起的。
横向扩展是采用多个廉价的机器提供服务。这样一个机器只能处理200个数据、3个机器就可以处理600个数据了,如果以后业务量增加还可以快速配置增加。在大多数情况都选择横向扩展的方式。如下图:
阅读全文

编程易犯的错误

Bash Pitfalls 文章介绍了40多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。每条作者在给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。文中有不少引用的文章,也值得大家仔细阅读。仔细阅读了这篇文章后,收获很多,不感独享,把这篇文章以半翻译半笔记的形式分享给大家。

1. for i in $(ls *.mp3)

Bash写循环代码的时候,确实比较容易犯下面的错误:

for i in $(ls *.mp3); do # 错误!
some command $i # 错误!
done

for i in $(ls) # 错误!
for i in `ls` # 错误!

for i in $(find . -type f) # 错误!
for i in `find . -type f` # 错误!

files=($(find . -type f)) # 错误!
for i in ${files[@]} # 错误!

 

这里主要两个问题:

我们不能避免某些文件名中包含空格,Shell会对$(ls *.mp3)展开的结果会被做单词拆分(WordSplitting)的处理。假设有一个文件,名字为01 – Don’t Eat the Yellow Snow.mp3,for循环处理的时候,会今次遍历文件名中的每个单词:01, -, Don’t, Eat等等:

$ for i in $(ls *.mp3); do echo $i; done
01
-
Don't
Eat
the
Yellow
Snow.mp3

比这更差的情况是,上面命令展开的结果可能被Shell进一步处理,比如文件名展开。比如,ls执行的结果中包含*号,按照通配符的规则, *号会被展开成当前目录下的所有文件:

$ touch "1*.mp3" "1.mp3" "11.mp3" "12.mp3"
$ for i in $(ls *.mp3); do echo $i; done
1*.mp3 1.mp3 11.mp3 12.mp3
1.mp3
11.mp3
12.mp3
1.mp3
11.mp3
12.mp3

不过,在这种场景下,你即使加上引号,也是无济于事的:

$ for i in "$(ls *.mp3)"; do echo --$i--; done
--1*.mp3 1.mp3 11.mp3 12.mp3--

阅读全文

数字证书原理

文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用。接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理,最后演示使用makecert生成数字证书。如果发现文中有错误的地方,或者有什么地方说得不够清楚,欢迎指出!

1、基础知识

这部分内容主要解释一些概念和术语,最好是先理解这部分内容。

1.1、公钥密码体制(public-key cryptography)

公钥密码体制分为三个部分,公钥、私钥、加密解密算法,它的加密解密过程如下:

  • 加密:通过加密算法和公钥对内容(或者说明文)进行加密,得到密文。加密过程需要用到公钥。
  • 解密:通过解密算法和私钥对密文进行解密,得到明文。解密过程需要用到解密算法和私钥。注意,由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。

公钥密码体制的公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。

 

1.2、对称加密算法(symmetric key algorithms)

在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。这个和上面的公钥密码体制有所不同,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥和私钥。
阅读全文

Top11种怎样成为更优秀的程序员的方法

1.实践与犯错误

第一个建议是你应该保持不断练习,代码敲得越多就越高效、犯的错误越多收获得就越多。为什么在你练习时,犯错非常重要?你编的代码越多,你就会意识到你在处理错误、设计、线程处理等情况下犯的错误。你将会从这些错误中学习,这时你的技术将会越来越好。

2.利用网络和书籍自学

显而易见,提高你技术最好的方法是自学技术,去关注你所匮乏的技术。最绝大部分的程序员来说,一个比较好的途径是去阅读来自不同地方的技术文档,比如Google的 website for developers,这里有很多经验丰富的程序员写了很多高质量的引导性文章。 Code academy, Code.org, W3 Schools, 以及 HTML5 Rocks 都是一些很好的学习网站。

对于技术书籍,虽然有些方法很旧,但是也非常有必要去阅读一系列技术书籍。绝大部分技术书籍都是作者根据自己多年的经验来写的。
比如:对于新手程序员,Head First Java, Head First HTML with CSS & XHTML and Head First HTML5以及其它以“Head First”开头的系列书籍都是非常不错的选择。
阅读全文

2014 年 15 款新评定的最佳 PHP 框架

通常,框架都会被认为是帮助开发者快速设计和开发动态网站的软件应用。每个月都有极大数量的新发布的 PHP 框架,使网站开发更简单更高效。

如果你是位 PHP 开发者,正在寻找当前最好的一些 PHP 框架来帮助开发你的项目,那么这里正是你要找的地方。在这篇文章我们会介绍 15 款最好的 PHP 框架,这些框架都是最新评定的,可以大大的简化你的开发任务。这些 PHP 框架可以帮助开发者快速设计和开发各种跨浏览器的动态网站和 web 应用,最后,希望你能在这些列表中找到你想要的 PHP 框架,Enjoy !!

1. Yaf : Yet Another Framework

a1
阅读全文

如何借助Motion操控Linux监控摄像头

Motion(http://www.lavrsen.dk/foswiki/bin/view/Motion/)是一款小巧、轻型但又功能强大的应用软件,可以用来在Linux上操控监控摄像头。它能够与任何支持Linux的摄像头协同运行,包括所有的V4L网络摄像头、许多IP摄像头以及安迅士(Axis)摄像头,它还可以控制平移和倾斜功能。Motion可以录制使用JPEG、PPM和MPEG等格式的短片和快照,你可以在Web浏览器中远程查看这些视频,这要归功于Motion的内置HTTP服务器。它将图像文件存储在你所选择的一个目录里,它也不需要数据库,不过它支持MySQL和PostgreSQL,如果你的确想要使用其中一个的话。

a1

 

图1:Foscam网络摄像头监视着进入本人地盘的所有人。

首先不妨看一下如何使用我那只很可靠的Foscam FI8905W(图1),借助Motion,让IP摄像头工作起来,然后我们将添加一只USB网络摄像头。

安装过程在Debian和Debian衍生版本上很容易,因为Motion已包含在标准软件库当中。所以,你只需要运行apt-get install motion。你还需要libav-tools,这是ffmpeg的一个分支。许多月以前,Debian丢弃了ffmpeg,以libav-tools取而代之。在其他发行版上,查阅下载页面(http://www.lavrsen.dk/foswiki/bin/view/Motion/DownloadFiles)和安装指南(http://www.lavrsen.dk/foswiki/bin/view/Motion/MotionGuideInstallation),即可了解相关的操作说明。另外大多数发行版仍包括ffmpeg。
阅读全文

让用户更高效地完成表单填写

填写互联网表单几乎是每个用户每天的经历,如用户进行网站注册和登录、购物等,都需要填写各种表单。用户为了获得想要的东西,表单成了用户完成需求和网站系统需要数据之间的互动形式。那么表单设计的首要目标也更清晰:让用户迅速高效快捷并且轻松地完成填写。

设计目标已清晰,那么如何设计表单呢,以下从表单的内容、组织方式、流程、表单元素控件及交互等方面详细阐述。
阅读全文

为开发者准备的 10 个新鲜的框架

一个框架就是一个软件应用,它可以帮助开发者进行快速设计和开发动态站点。每个月都会有那么几个开发者发布一些五花八门的框架,来使得开发工作更加轻松和高效。

本文中,我们收集了10个新的框架, 其中一些比其它的更为复杂,提供了更多的配置选项,组件,和接口选项。不管怎样,他们使得你可以在站点上创建出更棒的东西。希望你可以找到最适合你的需求的那一款,好好享受吧 !!

1. Famo.us

Q1

 

Famo.us是个免费并且开源的JavaScript平台,用来构建手机应用和桌面体验。Famo.us与众不同的一点是它的JavaScript渲染引擎和3D物理引擎,赋予开发者力量和工具来创建本地高质量应用和动画,而且只需要用到JavaScript即可。

2. Concise

Q2

 

Concise 的构建目标是使你可以拥有很多开箱即用的选项。它被重新构建之后,变的移动友好化,拥有了一个简单的网格系统,漂亮的字体,以及其它一些花边小应用。 不管怎样,它仍然没构建的十分精简,只有刚刚超过2,000行的CSS和几百行的JavaScript代码。Concise被特意构建成可定制化的, 可修补的和高端复杂的框架。

3. Ampersand.js

a3
阅读全文

几种华丽无比的开发方式

不要被我的标题骗了。我可不是来宣扬什么模型驱动开发,或者什么测试驱动开发的,那些都弱爆了。今天我要说的,是几种看起来激动人心、华丽无比,但是可以让程序员们痛苦不堪的开发方式,特别适合那些热衷于折磨虐待程序员的项目经理和产品经理们。当然,掌握以后,偷偷用就好了,请不要来感谢我。

进度驱动开发(SDD,Schedule Driven Development)

这是在国内最为流行的开发方式,大家心照不宣,口口相交,代代相传,我只是把它写下来而已。它最华丽的地方在于,可以百分之百,甚至百分之二百地压榨程序员的劳动力。

需要实现哪些需求?用什么技术?用什么平台?项目采用什么流程管理?这些都不重要。重要的是——什么时候交付?

假使说,老大们通知,下个月的这个时候要看到产品发布,那么:

  • 三周以后就要拿出完备的产品准备上线;
  • 两周以后就请发布beta测试版本,ST、IT之类的东西就得在那之前完成;
  • 本周就必须完成编码和UT,那么周一设计,周二、周三开发,周四、周五测试和修正问题。

看,项目计划多么完美。项目时间本来就该是根据deadline倒排的。

项目做什么呢?先做那些相对重要的需求,可是如果时间紧的话就只好砍需求了吧……不!你怎么能那么容易就放弃呢?你看,我的完美的计划里面没有安排周六和周日嘛,大家可以来加加班嘛,年轻的时候不得奋斗一把嘛,不用砍需求,平时的时间再压一压不就可以如期上线了?
阅读全文

Linux 技巧:重定向 stderr 和 stdout 输出到 gdb 窗口

简介

本文介绍了一个实用 gdb 调试技巧。 它结合实际例子,一步一步示意如何重定向 stderr 和 stdout 到 gdb窗口,使得查看应用程序的输出信息更为方便,从而提高调试者的工作效率。

问题

为了调试基于 Eclipse 的 Java 和 C++ 混合的应用程序时,通常同时使用 Eclipse 和 gdb 来分别调试 Java 和 C++ 代码。此时,被调试程序的标准输出( stdout )和标准错误输出( stderr )取决于这个该程序的启动方式。如果程序是在 Eclipse 的 IDE 环境下启动的,那默认情况下 stderr 和 stdout 都会输出在 Eclipse 的 console 窗口下,如果这时又需要用 gdb 来调试 C++ 的代码,那为了查看输出的调试信息,还不得不切换到另外一个窗口(比如 Eclipse 的 console窗口)去查看,然后再切回来继续调试,这是不是很不方便呢?

 

解决之道

下面本文将介绍个一个简单的方法用以重定向 stderr 和 stdout 到指定的目的地,包括正在使用的 gdb 窗口。

由于这个方法是基于 gdb 提供的基本而又强大的两个功能之上的,所以在介绍它之前,先简单介绍一下 gdb 的这两个功能。

使用 call 命令调用外部函数

GDB 提供的 call 命令允许调试者在当前函数调用栈的栈顶调用函数,犹如在被调试的程序中执行的一般。比如想关闭某个文件(文件描述符为 fd ),那只需要在 gdb 中输入:

(gdb) call (int)close(fd)

有了它,gdb 就可以具有很强大的功能,因为只要把所需要的功能写成一个函数编译进应用程序,调试时候在 gdb 中 call 该函数便可。

利用 .gdbinit 来自定义 gdb 命令

GDB 在启动的时候会按一定的路径顺序(通常是先当前目录而后用户目录)寻找 .gdbinit 文件,一旦找到,就会自动执行里面的命令。这个功能允许用户把常用的一些命令放在这个文件里,这样就不用每次进入 gdb 后再去手动执行这些命令。事实上,.gdbinit 就是一个脚本,甚至可在里面把常用的若干 gdb命令序列定义成一个新命令,这样只要在 gdb 里面输入这个新命令就等于自动执行了被定义的那个命令序列。
阅读全文