RSA在PHP加密中的应用

最近涉及到一个项目,其中的业务中有一个支付业务,开始考虑了很多种加密验证的办法,RC4,普通的MD5验证,最后敲定为RSA。
因为项目是PHP代码实现的,因此,服务端就需要用PHP来处理密文的处理。消费端则为JAVA等其他语言。这样就出现了RSA算法中各种语言互通的问题。
找了很多PHP关于RSA的类库。其中有PEAR库中的http://pear..net/package/Crypt_,结果发现速度很慢,1024bits的加密解密过程需要很长的时间。不得已采用了PHP的openssl扩展来完成业务需求。

简单介绍一下RSA的算法流程。
RSA(Rivest-Shamir-Adleman)算法是基于大数不可能被质因数分解假设的公钥体系。简单地说就是找两个很大的质数。一个用来做对外公开的公钥(Public key),另一个不告诉任何人,称为私钥(Private key)。
RSA体制的密钥生成可以简单描述如下:
(1)选择两个大素数p和q(p≠q)。(一般为100位以上的十进制数)
(2)计算出n=p*q及φ(n)=(p-1)(q-1) ,这里φ(n)是Euler函数。
(3)选择一个随机整数e(加密密钥),且满足1 (4)计算解密密钥 e*d mod φ(n)=1,计算解密密钥d.
(5)明文为a ,对每一个密钥k=(n,p,q,d,e),定义加密变换为:Ek(a)= aemod n = c,定义解密变换为:Dk(c)= cd mod n = a。
(6)公布整数n和加密密钥e。以{e,n}作为公开密钥,以{d,n}作为私有密钥。

由上图可以看出。
一般业务中使用流程:首先生产密钥对,私钥和公钥。私钥作为服务端,作为解密只用,公钥发往消费端,作为数据加密只用。每次消费端用公钥加密信息后,提交服务端用私钥解密,得到密文信息。
Continue reading

MessagePack简介

MessagePack是一种新的基于二进制的对象序列化类库。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。
MessagePack简称msgpack,官方网站是http://msgpack.org/ ,代码可以在github上查看 https://github.com/msgpack。
官方介绍是“Extremely efficient object serialization library for cross-language communication.It’s like JSON, but very fast and small.”,是一种跨语言的基于二进制的数据格式。从官方的介绍来看,它能够比google protocol buffers快4倍,比json快10倍多。
msgpack支持众多语言,同样支持php。PHP安装mskpack可以通过扩展方式安装。

1
2
3
4
5
6
$ git clone https://github.com/msgpack/msgpack.git
$ cd msgpack/php
$ phpize
$ ./configure
$ make
$ make install

然后再到php.ini添加
extension=msgpack.so Continue reading

基于oci8的oralce数据库PHP类库

[cc lang=""]

< ?php
define('ORA_CHARSET_DEFAULT', 'UTF8');
define('ORA_CONNECTION_TYPE_DEFAULT', 1);
define('ORA_CONNECTION_TYPE_PERSISTENT', 2);
define('ORA_CONNECTION_TYPE_NEW', 3);
define('ORA_MESSAGES_NOT_CONNECTED', 'Not connected to Oracle instance');

class ORACLE
{
private static $_instance;
private $conn_handle;
private $conn_data;
private $errors_pool;
private $statements = array();
private $autocommit = false;
private $fetch_mode = OCI_BOTH;
private $last_query;
private $var_max_size = 1000;
private $execute_status = false;
private $charset;
private $session_mode = OCI_DEFAULT;

//fetch模式
public function SetFetchMode($mode = OCI_BOTH)
{
$this->fetch_mode = $mode;
}

//自动提交
public function SetAutoCommit($mode = true)
{
$this->autocommit = $mode;
}

//参数最大字符数
public function SetVarMaxSize($size)
{
$this->var_max_size = $size;
}
Continue reading

php对汉字进行unicode互转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function unicode2utf8($unicode,$charset = 'UTF-8')
{
    $unicode = preg_replace("/(\&\#[0-9]{5}\;)/es", "de_unicode('\\1','$charset')", $unicode);
    return $unicode;
}

function de_unicode($unistring, $charset = 'UTF-8', $prefix = '&#', $postfix = ';')
{
    $arruni = explode($prefix, $unistring);
    $unistring = '';
        for($i = 1, $len = count($arruni); $i < $len; $i++)
        {
            if (strlen($postfix) > 0)
            {
            $arruni[$i] = substr($arruni[$i], 0, strlen($arruni[$i]) - strlen($postfix));
      }
      $temp = intval($arruni[$i]);
      $unistring .= ($temp < 256) ? chr(0) . chr($temp) : chr($temp / 256) . chr($temp % 256);
        }
    return iconv('UCS-2', $charset, $unistring);
}

function en_unicode($string, $charset = 'UTF-8', $prefix = '&#', $postfix = ';')
{
    $string = iconv($charset, 'UCS-2', $string);
  $arrstr = str_split($string, 2);
  $unistring = '';
    for($i = 0, $len = count($arrstr); $i < $len; $i++)
    {
    $dec = hexdec(bin2hex($arrstr[$i]));
    $unistring .= $prefix . $dec . $postfix;
  }
  return $unistring;
}

echo unicode2utf8('<p>&#21475;&#22797;<img src="flexp://[ha_ha]"></p>');   //示例

程序员真的“编码太多没时间思考”了吗

如题,这是有朋友问我的一个问题,我觉得这个问题也代表了一部分程序员的迷惑,所以不妨在此啰嗦几句。

我们都知道,目前程序员的工作强度很高,压力很大,白天8小时是不够的,加班肯定是家常便饭,整个人几乎全部的时间都用在了编码上。于是才产生了这个疑问,如果我整天都在机械的编码,那么我如何才能思考问题、获得提高呢?

我 认为首先要明确的一点是编码与思考这两项活动不是串行的,不是说时间用来编码就没有时间思考了。编码是为了解决问题的,而寻找问题的本质,探索解决方法, 直到能通过代码把问题解决出来,这本身不就是在思考吗?不仅是思考,还是深刻的思考。否则,可能没能力胜任编码工作了。也就是说,看上去是编码,但实际上 这中间从来没停止过思考。量变到质变会在潜移默化中发生。

其次,思考不是独立的活动,不是说思考的时候就什么也干不了了。公交车上可以思考、看电视时可以思考、睡觉前可以思考……除了工作,余下还有很多时间可以思考很多事情,不可能所有的时间都被编码占据。

其 实,说“编码太多没时间思考”的话,其重点不是“没时间”,这只是个借口。我倒是觉得其中的重点是在逃避,可能是对编码的厌烦,可能是对压力的缓解,也可 能是找不到该思考的方向,于是找个借口来逃避一下。如果你对一件事有着强烈的渴望的时候,时间总是会有的,你可以在别人看电视的时候读读技术书籍,可以在 别人打游戏的时候随手写一段测试代码来练习设计模式,可以比别人早起10分钟了解一下新技术发展,只要想挤,时间就有。所以“没时间思考”这只是个站不住 脚的借口,更不可能把这个借口建立在“编码太多”这个前提之上。

写到这里,我想可以结束了,现实的情况是编码工作多了点、压力大了点,但这绝不是我们停止思考和学习的借口。“每天叫醒自己的不是闹钟,而是梦想”,以此句共勉。

我的VIM配置(代码补全,自动注释)

特意整理了一番,现在分享一下,需装一下插件:neocomplcache,gvimfullscreen,DoxygenToolkit。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"常用设置
set nu!
set ts=2
set sw=2
set noai
set nocp
set history=100 "
历史为100
set nocompatible  "去掉VIM键盘模式
set noexpandtab
set clipboard+=unnamed  "
与windows共享剪贴板

"在状态行上显示光标所在位置的行号和列号
"
set ruler
"set rulerformat=%20(%2*%<%f%=\ %m%r\ %3l\ %c\ %p%%%)

set nocin
set nobackup  "
禁止生成备份文件
set paste
set formatoptions=tcrqn
set iskeyword+=_,$,@,%,#,-  "带有如下符号的单词不要被换行分割

set guioptions-=T  "去掉工具条
set guioptions-=m "
隐藏菜单栏
set guioptions-=L " 隐藏左侧滚动条
set guioptions-=r "
隐藏右侧滚动条
set guioptions-=b " 隐藏底部滚动条
set showtabline=0 "
隐藏Tab栏

au GUIEnter * simalt ~x "自动最大化

filetype on "
检测文件类型
filetype plugin on "载入文件类型插件

syntax on "
语法高亮

source $VIMRUNTIME/vimrc_example.vim  
source $VIMRUNTIME/mswin.vim  
behave mswin

"配色方案
colors slate
set guifont=Courier\ New\ Bold:h14
set backspace=indent,eol,start

"
强制UTF-8字符
set termencoding=utf-8  
set fileencodings=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936

if has("win32")  
    set fileencoding=chinese
else  
    set fileencoding=utf-8  
endif

"底部状态栏
highlight StatusLineNC guifg=Gray guibg=White
set laststatus=2
set statusline=%F%m%r%h%w\ [%{strftime(\"%m-%d\ %H:%M\")}\][格式:%Y]\[ASCII:%03.3b]\[HEX:%02.2B]\[位置:%l,%v][进度:%p%%]\[行数:%L]
let &termencoding=&encoding

"
全屏
if has('gui_running') && has("win32")
    map <F11> :call libcallnr("gvimfullscreen.dll", "ToggleFullScreen", 0)<CR>
endif

"自动提示
let g:neocomplcache_enable_at_startup=1  "
启动
let g:neocomplcache_enable_smart_case = 1
let g:neocomplcache_enable_camel_case_completion = 1
let g:neocomplcache_min_syntax_length = 3
let g:neocomplcache_lock_buffer_name_pattern = '\*ku\*'
let g:neocomplcache_max_keyword_width = 80
let g:neocomplcache_max_filename_width = 255
let g:neocomplcache_min_keyword_length = 3
let g:neocomplcache_min_syntax_length = 3
if !exists('g:neocomplcache_keyword_patterns')
  let g:neocomplcache_keyword_patterns = {}
endif
let g:neocomplcache_keyword_patterns['default'] = '\h\w*'
if !exists('g:neocomplcache_omni_patterns')
let g:neocomplcache_omni_patterns = {}
endif
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
let g:neocomplcache_omni_patterns.php = '[^. \t]->\h\w*\|\h\w*::'
imap <expr><TAB> neocomplcache#sources#snippets_complete#expandable() ? "\<Plug>(neocomplcache_snippets_expand)" : pumvisible() ? "\<C-n>" : "\<TAB>"


"doxygen toolkit 注释插件
let g:DoxygenToolkit_briefTag_pre="
@synopsis  "
let g:DoxygenToolkit_paramTag_pre="
@param "
let g:DoxygenToolkit_returnTag="
@returns   "
let g:DoxygenToolkit_blockHeader="
--------------------------------------------------------------------------"
let g:DoxygenToolkit_blockFooter="
----------------------------------------------------------------------------"
let g:DoxygenToolkit_authorName="
Yee, <assad2008@sina.com>"
let g:DoxygenToolkit_licenseTag="
GPL 2.0"

let g:DoxygenToolkit_authorName="
Yee, <assad2008@sina.com>"
let s:licenseTag = "
Copyright(C)\<enter>"
let s:licenseTag = s:licenseTag . "
For free\<enter>"
let s:licenseTag = s:licenseTag . "
All right reserved\<enter>"
let g:DoxygenToolkit_licenseTag = s:licenseTag
let g:DoxygenToolkit_briefTag_funcName="
yes"
let g:doxygen_enhanced_color=1

[下载地址]Windows 8 客户预览版正式公布 简体中文ISO更新

戒备森严滴水不漏的测试过程终于宣告结束,微软今晚准时公布了Windows 8 客户预览版Build 8250,同时包含32和64位版本。
微软已经在下载页面中列出并开始向所有用户供应这一版本。以下是下载地址,简体中文ISO版本正式公布,不必再下载WIM版本了。

下载:Windows 8 Consumer Preview ISO images

English

64-bit (x64)                    Download (3.3 GB)                    Sha 1 hash — 1288519C5035BCAC83CBFA23A33038CCF5522749

32-bit (x86)                    Download (2.5 GB)                    Sha 1 hash — E91ED665B01A46F4344C36D9D88C8BF78E9A1B39

Product Key:   DNJXJ-7XBW8-2378T-X22TX-BKG7J

Chinese (Simplified)

64-bit (x64)                    Download (3.4 GB)                    Sha 1 hash — DF69B851F9A81DECBB16648CC452461894416EB0

32-bit (x86)                    Download (2.6 GB)                    Sha 1 hash — E29A2072745A48C14A1C2E5A61F5230841BEDB45

Product Key:   DNJXJ-7XBW8-2378T-X22TX-BKG7J

French

64-bit (x64)                    Download (3.3 GB)                    Sha 1 hash — A9358E6799ABEEF29EDBA054AD34849C02C7F51F

32-bit (x86)                    Download (2.5 GB)                    Sha 1 hash — 2EF8013B9F50B93AEAC8068F4827E2C1DC0DC0B1

Product Key:   DNJXJ-7XBW8-2378T-X22TX-BKG7J Continue reading

PHPExcel读取EXCEL中的图片

PHPExcel是相当强大的 MS Office Excel 文档生成类库,当需要输出比较复杂格式数据的时候, 是个不错的选择。
经过认真研究API文档和查看官方文档,终于找到读取EXCEL中的图片,目前我只能读取excel 2003格式的。excel2007貌似还不支持。
其中主要使用的API为PHPExcel_Worksheet,PHPExcel_Worksheet_BaseDrawing,PHPExcel_Worksheet_MemoryDrawing。
废话少说,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require_once './Classes/PHPExcel.php';
$objPHPExcel = new PHPExcel();
$objReader = PHPExcel_IOFactory::createReader('Excel5');  //加载2003的
$objPHPExcel = $objReader->load("goods_list.xls");  //载入文件
foreach ($objPHPExcel->getSheet(0)->getDrawingCollection() as $k => $drawing) {
        $codata = $drawing->getCoordinates(); //得到单元数据 比如G2单元
        $filename = $drawing->getIndexedFilename();  //文件名
        ob_start();
        call_user_func(
            $drawing->getRenderingFunction(),
            $drawing->getImageResource()
        );
        $imageContents = ob_get_contents();
        file_put_contents('pic/'.$codata.'_'.$filename.'.jpg',$imageContents); //把文件保存到本地
        ob_end_clean();
}

简简单单的几行,哎,搞了好几个小时。

关于MongoDB,你可能不知道的十件事

很简单,参照着一些常用的教程下载相应平台的二进制包、创建dbpath然后启动基本上就可以跑了。但是如果你真的打算在生产环境中使用MongoDB,还是请多进行深入的研究,下面是一位MongoDB的爱好者在参加完MongoNYC大会后总结的十个自己了解到的知识点,看看有没有你不知道的吧。

 1.MongoDB有一个大的全局锁,这使得一个MongoDB Daemon只能同时进行一个写操作,即使是对不同collection的操作,也只得排队。
 2.MongoDB并没有一个基于统计的查询优化器,对查询并发的执行多个不同的计划,在最快的那个返回后就终止其它任务,并将这个最快的计划指导查询。当然不是每次查询都执行多个不同计划,这个会隔一段时间执行一次。
 3.Mongos只有在你使用Sharding时才需要,在不用Sharding时,实际上是客户端来实现负载均衡的。
 4.MongoDB不仅仅只有Replica Sets,还有传统的Master-Slave模式。(实际上你想配置成Master-Master也完全可以)
 5.MongoDB的同步机器支持“slave-delay”参数,这个参数指定Slave机器延迟Master多长时间。这个参数用来做准备非常合适。
 6.MongoDB 使用了mmap,在32位系统下数据文件只能达到2G,所以32位系统下的MongoDB玩玩就够了。
 7.MongoDB会在日志里记录执行时间超过100ms的操作,实际上这个是可以灵活配置的。
 8.MongoDB可以运行一些耗时较长的统计分析任务。
 9.MongoDB不支持多主对单从的架构(这个应该是支持的,原文作者可能理解错了)。
 10.MongoDB的Replica Sets 模式下,可以设置一些节点为Arbiter,它们不存储数据,只在需要重新选Primary时参与投票。

原文链接:Ten things I didn’t know about MongoDB

使用xunsearch为wordpress建立全文搜索

关于xunsearch我介绍过,点击查看xunsearch-1.3.0
1.安装xunsearch,参见文档:http://www.xunsearch.com/doc/php/guide/start.installation,这里不必多说
2.启动xunsearch $prefix/bin/xs-ctl.sh start,即可启动xunsearch
3.构建项目:首先参考文档:http://www.xunsearch.com/doc/php/guide/ini.guide文档中说明了项目的一些必要元素。现在举个例子:以wordpress的数据为例吧。

首先,分析数据,对于搜索,从上图可知,我们需要文章标题,文章内容,作者,时间,已经文章分类,同时,我们设定了可选的搜索条件:分类选择,时间选择,以及时间排序,只?搜索标题等条件。 Continue reading

基于MongoDB的url缩短服务(短链服务)[PHP]

本软件基于YOURLS URL 修改而来,基于MongoDB数据库开发。访问性能比基于mysql要高的多。并且支持php-cli方式运行。代码总行数不过几千行,小巧玲珑!呵呵。
使用方法,首先建立MongoDB数据库。
建立一个shorturl数据库。在该库下创建url_table集合和op_id集合,url_table主要记录短链相关信息,op_id记录当前短链的数量,并且是自增,主要用于生产字符串。
该软件只编写了接口访问。api.php为api文件。stcli.php为命令行运行文件。
伪静态配置:
nginx下为:rewrite ^/(\w+)$ /index.?id=$1 last;
下载shorturl
欢迎使用缩短吧服务,基于本代码建成,缩短吧

LNMP安装脚本(BASH)第二版

借鉴http://lnmp.org/上的脚本
对脚本进行了完善。修改了部分无用功能,比如删除了FTP等,因为很多人并不用这个功能。对某些功能进行了优化。
软件来源依然采用lnmp.org的软件来源。
加入了对oracle数据库的支持,对MongoDB的支持,对redis的支持;
同时编译入了scws中文分词系统的扩展。具体使用见:http://www.ftphp.com/scws/
更换nginx为淘宝修改后的nginx,Tengine,详情见:http://tengine.taobao.org/index_cn.html
增加了eAccelerator,mongo,redis,xhprof,,scws扩展。
增加了imagick扩展和ionCube模块。




下载第二版

使用:上传到服务器
$unzip installlnmp2.zip
$cd installlnmp2
$ sh .sh
按照提示出入即可,然后自己看着安装吧。

软件版本号排序(PHP)

最近有个需求,是软件版本排序,鉴于软件版本的复杂命名,使排序也变得比较困难。普通的排序已经无法适应。而软件版本的命名也是软件版本无法直接比较。
比如,两个版本:num1 = ’5.0.1.3′; 05,num2 = ’5.0.1.4′; 如果按照小数比较,这个版本应该很好比较出来。但是对于2.20.2和2.1002来说,应该是2.1002是比较高的版本,因此,普通的比较无法直接使用。因此小数比较是行不通的,因此,需要进行按位比较才行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function bj($v1,$v2)
{
    $version_split = explode('.',$v1);
    $rel_split = explode('.',$v2);
    $len1 = count($version_split);
    $len2 = count($rel_split);
    $count = $len1 == $len2 ? $len1 : ($len1 > $len2 ? $len1 : $len2);
    for($i = 0;$i < $count;$i++)
    {
        if((int)$rel_split[$i] > (int)$version_split[$i])
        {
            return true;
        }elseif((int)$rel_split[$i] < (int)$version_split[$i])
        {
            return false;
        }else
        {
            continue;
        }
    }
}

这个函数执行的过程是按位进行比较的。对版本以点进行切分,来逐个比较。
如果版本出现不规则的命名。则在排序之前,我们只需要检测是否可以进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
function is_sort($data)
{
    foreach($data AS $v)
    {
        $version_split = explode('.',$v['version']);
        if(!is_numeric($version_split[0]))
        {
            return false;
        }
    }
    return true;
}

如果版本出现不是数字的命名,则放弃比较。
Continue reading

为程序员量身定制的12个目标

对程序员们来说挑战自我非常重要,要么不断创新,要么技术停滞不前。新年伊始,我整理了12个月的目标,每个目标都是对技术或个人能力的挑战,而且可以年复一年循环使用。

01. 变得有耐心

02. 保持健康

03. 拥抱变化带来的不适应

04. 学习一门新的编程语言

05. 自动化

06. 学习更多数学知识

07. 关注安全

08. 备份你的数据

09. 学习更多理论知识

10. 接触艺术和人文

11. 向新的软件学习

12. 完成一个自己的项目

接下来我会对这些建议逐个介绍。

变得有耐心

程序员们会担心锻炼耐心付出的努力得不到应有的回报。其实,培养耐心只要付出很小的投入就能够得到相对而言很大的收获。下面是开始锻炼耐心可以尝试的一个列表,只要全身心投入其中任意一项,都可以在一个月左右脱离门外汉(成为有经验的新手)的阶段:

烹饪、徒步、滑雪、天文、慢跑、木工、武术、舞蹈
 
保持健康 Continue reading

xunsearch-1.3.0 (基于xapian/scws/php的开源中文全文搜索,新增同义词、修正BUG)

经过一个月的全力开发和测试,今天很高兴先发布 1.3.0 正式版,加入了同义词功能并修正了许多小 BUG,强烈建议所有用户升级到这个最新稳定版本。

1.3.0 堪称一个里程碑级的更新,实现了预期的绝大部分功能,将 xunsearch 带入一个新的阶段。我们以后将着力先进行稳定性的跟进,完善周边配套工具和应用产品。

主要更新如下:

1. 内部优化中文复合词的查询分析器,升级整合最新的 xapian-1.2.8、scws-1.1.9

2. 新增自动同义词搜索功能,详见同义词专题文档
http://www.xunsearch.com/doc/php/guide/special.synonym

3. 调优服务端参数,大幅度提升并发处理能力(3~5倍),精简服务端日志
4. 允许使用空搜索条件,空搜索条件相当于全部匹配
5. 搜索服务端增加请求数、运行时间的监控,避免内存泄露等不稳定因素。
6. 搜索语句的最大长度人 80 字节增加到 192 字节

其它改动详见下面相关链接:

官方网站:http://www.xunsearch.com/
下载地址:http://www.xunsearch.com/download/xunsea…st.tar.bz2
代码仓库:https://github.com/hightman/xunsearch
修改日志:https://github.com/hightman/xunsearch/commits/1.3.0
CHM 手册 http://www.xunsearch.com/download/xs_php_manual.chm

后续方面,我们将进一步推进 xunsearch 的配套管理工具,同时正在重新基于 xunsearch 开发站内搜索云计算服务 xungle ,敬请关注。

比尔·盖茨的60条睿智语录

1、让你最不耐烦的客户是你最大的学习来源。
2、只是在时间分配方面,宗教并非非常有效,星期天早晨有很多事等着我们去做呢!
3、像大多数E-mail用户一样,我每天收到成打的垃圾邮件,大部分邮件都声称可以帮助我远离债务或者快速致富。这很搞笑,如果其实并没有那回事。

4、成功是一个差劲的老师,它诱使聪明人认为他们不会输。
5、这是进入商界的最佳时机,未来10年将要进行的改变将超过过去50年的总和。
6、为成功而庆祝是应该的,但更重要的是吸取失败的教训。
7、如果情况已经非常糟糕时你才意识到麻烦,那已经晚了。要有希望,除非你总是保持危机感。
8、我深信任何可以增进人与人之间沟通的方法都具有长远的价值,人们借此相互学习,并且共同努力达到彼此认同的自由。
9、当我是个孩童时我做了许多梦,如今很多梦都已成为现实。我曾有机会进行大量阅读,这给了我契机。
10、我相信如果你给人们问题的同时给以解决方案,人们必将采取行动。
11、在微软诞生的众多绝妙想法都是来自于顶端吗?不尽然。
12、展望下一个新世纪,真正的领袖必将是那些给人以希望的人。
13、如果你确实做不好,那么至少让它看起来好。
14、幸运之神会光顾世界上的每一个人,但如果她发现这个人并没有准备好要迎接她时,她就会从大门里走进来,然后从窗子里飞出去。
15、我不知道上帝是否真的存在,但我认为宗教的原则值得赞同。
16、如果我只想赢的话,我早就跑到另外一个舞台上了。如果我以前为自己设定了终线,难道你不认为我几年前就已冲线了吗?
17、我们总是高估今后一两年内将要发生的变革,总是低估未来10年将要发生的变革。所以,不要让你自己陷入无所作为的窘境。
18、只要有坚强的持久心,一个庸俗平凡的人也会有成功的一天,否则即使是一个才识卓越的人,也只能遭遇失败的命运。
19、大家知道,很多人希望把他们积累的财富留给下一代,这样做当然合情合理,无可厚非。但对我个人而言,如果我能把自己有幸掌管的巨额财富回馈社会,用到重要的事业上,如科技、教育、医学研究、社会服务及其他领域,这更利于社会,也更利于我的孩子。
19、在我们以美妙的方式教育每个孩子前,在每座城市的市中心得到彻底清理前,我们还没到无事可做的时候。
20、30年前保罗·艾伦与我创建微软的时候,我对软件开发充满很多梦想。我们希望自己的软件能够对这个世界产生重要影响,让每一个办公桌和家庭拥有电脑也一直是我们讨论的话题。令我们感到惊讶和兴奋的是,梦想中的很多东西都已经成为现实并且涉及到生活的很多方面。我从没想过一家令人难于置信且异常重要的公司竟然源于这些最初的想法。 Continue reading

《Clean Coder》读后感:程序员自我管理的9个原则

最近刚读完 Robert C. Martins 的新书 《The Clean Coder: A Code of Conduct for Professional Programmers 》(编注:暂无中文版)。我可以毫不犹豫地、诚实地说,这本书真的改变了我对于专业软件开发人员的看法和观念。在阅读过程中,我一直把学习到的事情和头脑中瞬间转变的事情写在剪贴簿上。

我强烈建议任何,不论老手或者新手,只要是还没有机会读这本书的软件开发人员都应该找时间读一下。关于成为一名专业软件开发人员的意义,这本书提供了许多有价值和有趣的信息。

声明:请注意,因为不同的人有不同的看法。这是我对这本书阐述内容的理解。

我学到的9件事

□ 一名专业开发人员了解所开发项目的领域

□ 一名专业开发人员是具有团队精神的人

□ 一名专业软件开发人员能肩负责任

□ 一名专业开发人员知道模式和准则

□ 一名专业开发人员能够在忙碌中保持冷静

□ 一名专业开发人员会不断训练自己的专业技能

□ 一名专业开发人员会适当休息

□ 一名专业开发人员懂得时间的宝贵

□ 一名专业开发人员从不害怕说不

Continue reading

让SVN自动更新代码注释中的版本号

SVN手册中找到了一个非常简单的解决方案:
1、打开C:/Users/[username]/AppData/Roaming/Subversion文件夹
2、找到 config文件,并打开
3、找到 nable-auto-props = yes 行,去掉行首的注释;
在[auto-props]节上添加以下字段:

1
2
3
4
5
6
*.css = svn:keywords=Id
*.php = svn:keywords=Id
*.html = svn:keywords=Id
*.tpl = svn:keywords=Id
*.txt = svn:keywords=Id
*.js = svn:keywords=Id

保存后创建一个文件,并在文件注释处添加 $Id$ ,然后添加并提交到版本库。提交成功再回过头看看这个文件,当$Id$被替换成类似这样:

1
$Id: UsersController.php 19629 2011-12-19 10:18:16Z Yee $

说明已经可以自动将SVN版本号更新到注释啊。注意,这种替换只对新创建的文件有效;当在已经提交到版本库中的文件添加$Id$发现并不会被替换成当前的版本号。
转自:http://www.coderbolg.com

几个常用的PHP函数

1. 使用 Glob() 查找文件

很多PHP的函数都有一个比较长的自解释的函数名,但是,当你看到glob() 的时候,你可能并不知道这个函数是用来干什么的,除非你对它已经很熟悉了。

你可以认为这个函数就好?scandir() 一样,其可以用来查找文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 取得所有的后缀为PHP的文件
$files = glob('*.php');

print_r($files);
/* 输出:
Array
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] => test.php
)
*/

你还可以查找多种后缀名

Continue reading

梧桐飘落的深秋

作者:金泳

许多年后,我还会忆起30年前母亲为我送米的那个下午。

  那时我在县一中念书。作为第一次远离父母到城里念书的农村孩子来说,想家是难免的,很多同学都在夜里哭过,由于交通不便,同学们一学期都在学校度过,因而家长按月送米到学校便成了同学们一月的巴望。那是深秋的一个晴朗的下午,晚餐时我仍在教室里写作业,省得去食堂排长蛇阵,当同桌来告诉我母亲来了时,我便飞似地向宿舍跑去。路过操场,我看见了晒在双杠上的我的被子,那一定是母亲晒的。远远地我望见了母亲,她站在宿舍前的台阶上,中等个儿,一身朴素整洁的打扮,傍晚的阳光把她的半身染成了金黄。她用那双慈爱的眼睛在来来往往的学生中搜寻着她的儿子,终于她看见我了,向我挥手。“妈,你来啦!”我高兴地跑上前去,她的脸上洋溢着笑,“你在哪儿?怎么才来?”我摸着脑袋讷讷地说:“在教室里,这会人多,待会再去。”她说:“饭我打来了,快去吃吧。”

  “妈,还没到时候呢,想不到你就来了。”

  “妈想你了,就来了,现在得闲,过几天就忙了。”

  说话间我们进了宿舍,两份饭摆在床前的木箱上,还有母亲从家里带来的一包油炸小鱼,一罐头瓶肉烩咸菜,床上是她送来的夹衣。“这是你的。”她把一份饭递给我,里面的菜是粉蒸肉,她自己吃有南瓜的那份。哟!粉蒸肉,那时是我最喜欢吃的菜了,一进食堂就能闻到它的香味,一碗碗排在菜桌上,红嫩的色泽,上面冒一层油,肉或骨头往往露在外头,让人看了直流口水。但是吃一个小菜是五分钱,吃一个粉蒸肉要二角钱,按我每天二角钱的生活费计算,需得连吃三天小菜之后,才能吃一个粉蒸肉,要是遇到买学习用品、买药之类的事,这一周甚至两周就甭想吃它了。今天,当母亲把这份饭递给我时,我便喜滋滋地吃起来,觉得今天的饭菜格外香。现在想想,为什么当时不和母亲的那份换换呢?难道这是天经地义的么?唉,我那时是太天真了。母亲又忙着招呼同室的同学来吃菜,可他们都端了饭碗远远地躲开,只拿眼睛朝这边瞅。我当时心想:你们就别害羞了,要是我妈不在,菜早被你们抢光了。母亲又把鱼一一地送到他们碗里。她见我狼吞虎咽,三下五除二就吃完了,就把自己的饭分我一些。我说:“妈,你……”她说:“我来时吃得多,现在还不饿。”真的,现在回想起来,那是我学生时代吃得最香的一顿饭。 Continue reading

centos建立VPN脚本

程序来源网上,本人做过些许修改,测试通过

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
yum remove -y pptpd ppp
iptables --flush POSTROUTING --table nat
iptables --flush FORWARD
rm -rf /etc/pptpd.conf
rm -rf /etc/ppp

mkdir /tmp/pptpd/
cd /tmp/pptpd/
wget http://imcat.in/down/vpn/pptpd/dkms-2.0.17.5-1.noarch.rpm
wget http://imcat.in/down/vpn/pptpd/kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
wget http://imcat.in/down/vpn/pptpd/pptpd-1.3.4-1.rhel5.1.i386.rpm
wget http://imcat.in/down/vpn/pptpd/ppp-2.4.4-9.0.rhel5.i386.rpm

yum -y install make libpcap iptables gcc-c++ logrotate tar cpio perl pam tcp_wrappers
rpm -ivh dkms-2.0.17.5-1.noarch.rpm
rpm -ivh kernel_ppp_mppe-1.0.2-3dkms.noarch.rpm
rpm -qa kernel_ppp_mppe
rpm -Uvh ppp-2.4.4-9.0.rhel5.i386.rpm
rpm -ivh pptpd-1.3.4-1.rhel5.1.i386.rpm

mknod /dev/ppp c 108 0
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "mknod /dev/ppp c 108 0" >> /etc/rc.local
echo "echo 1 > /proc/sys/net/ipv4/ip_forward" >> /etc/rc.local
echo "localip 172.16.36.1" >> /etc/pptpd.conf
echo "remoteip 172.16.36.2-254" >> /etc/pptpd.conf
echo "ms-dns 8.8.8.8" >> /etc/ppp/options.pptpd
echo "ms-dns 8.8.4.4" >> /etc/ppp/options.pptpd

pass=`openssl rand 6 -base64`
if [ "$1" != "" ]
then pass=$1
fi

echo "vpn pptpd ${pass} *" >> /etc/ppp/chap-secrets

iptables -t nat -A POSTROUTING -s 172.16.36.0/24 -j SNAT --to-source `ifconfig  | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk 'NR==1 { print $1}'`
iptables -A FORWARD -p tcp --syn -s 172.16.36.0/24 -j TCPMSS --set-mss 1356
service iptables save

chkconfig iptables on
chkconfig pptpd on

service iptables start
service pptpd start

echo "VPN service is installed, your VPN username is vpn, VPN password is ${pass}"

rm -rf /tmp/pptpd/

直接保存为sh文件,然后运行即可!

CentOS SVN客户端应用

一、CentOS安装TortoiseSVN
yum install  subversion

二、SVN客户端命令

1、查看帮助
命令: help

2、同步(checkout)服务器数据到本地
命令:svn checkout [directory]
svn co[directory]

3、提交(commit)本地文档到服务器
命令:svn commit -m “” [directory|file]
svn ci -m “” [directory|file]

4、更新(update)服务器数据到本地
命令:svn update [directory|file]
svn up [directory|file]

5、查看日志
命令:svn log [directory|file]

6、增加(add)本地数据到服务器
命令:svn add

C语言之父辞世引发“分号”悼念

昨日,在众多的国际互动论坛上,计算机爱好者们以特有的方式纪念这位编程语言的重要奠基人。许多网友的发帖中没有片言只字,仅仅留下一个分号“;”。在C 语言中,分号标志着一行指令语句的结束,网友们以此来悼念“C语言之父”,美国著名计算机专家丹尼斯·里奇(Dennis Ritchie)所引领的时代悄然远去。

在日益纷繁复杂的程序设计语言王国中,C语言因其简洁、有效、通用的特性而始终占据一席之地。被誉为“C语言之父”,同时也是操作系统Unix之父的C语言发明人之一丹尼斯·里奇10月9日以70岁之龄辞世。

  生于1941年9月9日的丹尼斯·里奇曾在哈佛大学学习物理学和应用数学,1967年他进入贝尔实验室,并曾经担任朗讯技术公司系统软件研究部门的领导人。

  1983年,美国计算机协会将当年的图灵奖破例颁给了作为软件工程师的肯·汤普逊与里奇,获奖原因是他们“研究发展了通用的操作系统理论,尤其是实现了 Unix操作系统”。并且,美国计算机协会当年还决定新设立一个奖项软件系统奖,以奖励那些优秀的软件开发者,首个软件系统奖当然也是非他们两人莫属。

  尽管通过Unix拿奖拿到手软,但令里奇引起最大关注和反响的则是C语言的问世。1999年,里奇和汤普逊为发展C语言和Unix操作系统一起获得了美国国家技术奖章。

  虽然在C语言之后,C++、Java等各式各样计算机高级语言层出不穷,但不少程序员仍旧认为,C语言简洁、高效、灵活的特性令其具有独特魅力。“现在的程序编写朝着越来越冗长庞大的方向发展,而C语言虽然属于相对‘低级’的编程语言,但它的简洁之美是无可替代的。”一位电脑程序员道出了自己格外青睐C 语言的原因。 Continue reading

2011年10月编程语言排行榜:Java人气持续走低

在TIOBE公布的2011年10月编程语言排行榜中,Java继续着9月的势头,持续走低,下降了几乎1%的人气,尽管Oracle在八月初发布了最新的Java
7。看来下个月C语言又要复返第一的宝座了。

其他值得关注的有Object-C和Transact-SQL的人气又创新高,分别达到了6.245%和0.909%。Assembly则重返Top20,挤下了上个月进入前20的D语言,Visual
Basic .NET从39位上升到25位,而在8月份榜单中曾闯入Top20的F#已经掉落到46名。

以上内容由乌帮图根据英文原文翻译,如有错误,还望指正。

具体榜单请看下面的示意图,注意表格第二列是该语言上一年的排名,而非上月。可参照2011年9月编程语言排行榜查看。

2011年10月编程语言排行榜Top 20:

注意:TIOBE
编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新。这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎(诸如Google、
MSN
、雅虎)以及Wikipedia和YouTube进行计算。请注意这个排行榜只是反映某个编程语言的热门程度,并不能说明一门编程语言好不好,或者一门语言所编写的代码数量多少。

这个排行榜可以用来考查你的编程技能是否与时俱进,也可以在开始开发新系统时选择语言时用来进行策略性的决策。

Tiobe英文原文:http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

让普通用户临时性获得root用户权限

Sudo的工作流程:
(1)root用户编辑/etc/sudoers文件,添加要分配的普通用户记录,其中有这么一行记录:root ALL=(ALL)  ALL,在这行后面添加:Sam ALL=(ALL)  ALL
(2) 那么sam用户在执行操作时,如果所执行的操作自己没有权限,则会去/etc/sudoers文件中查找是否有对应的记录,如果有的话则临时获得root权限,执行只有root才能执行的操作.
注意:这里会提示输入密码,但是输入的是sam用户的密码,而不是root用户的密码.例如:
Shell> sudo mkdir –p a/b/c/d
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

Password:           #这里的密码是sam用户自己的密码,而不是root的密码

几个操作:
1) 编辑/etc/sudoers文件,使用visudo命令, Continue reading

苹果前CEO史蒂夫·乔布斯逝世

苹果官网讣告译文:

苹果失去了一位有远见和创意频出的天才,世界失去了一位出色的人类。我们当中很荣幸能与史蒂夫相知共事的那些人失去了一位亲爱的朋友和一位鼓舞人心的导师。史蒂夫留下的是一家只有他可以建造的公司,他的精神将永远是苹果的根基。

PHP之面向对象之我见

PHP作为脚本语言,已经将近快10年了,自从PHP在PHP4初步引进OO思想以来,PHP开始支持OO编程,在PHP5对面向对象、异常处理方面做了若干改进,也使得PHP更像java了。我不明白,如此优秀的脚本语言,让我变得有点迷茫。

PHP对我来说最大的吸引力是其简单易用和处理速度,然则现在国内出现了可以说是规模庞大的框架之争和面向对象之争。FleapPHP的作者很NB的说,你不用框架是因为你不愿意接受新事物。

我没深入的接触过JAVA以及那些面向对象之类的语言,给我的感觉,JAVA的纯面向对象语言,对于所有功能的实现,全部基于对象上,一个简简单单的功能,却要复杂的使用对象对实现,我不觉得这是一种进步,但是从整个语言来说,JAVA不得不这么做。但是对于PHP,他丰富的内建函数,丰富的扩展,都得以让它在功能的快速实现上,业务的编写中变得更简单,更容易去实现。这是脚本语言上的优势,预置的函数给你做好一切,让你能快速上手。我很喜欢这点。

但是很多人现在疯狂的开发PHP的各种框架应用,采用面向对象,MVC模式。而且很多招聘上明确提出:精通PHP,精通OO思想。我想了想,我也许达不上这个招聘的要求,因为我面向对象很差,对于PHP面向对象的高级应用,我掌握的不是很好。可是我又想了想,面向对象究竟能给PHP的开发带来什么?更加迅速的开发?更高的性能,更好的实现?还是更深奥的语言构建呢? Continue reading

继父泪

我跪在继父坟前,说:“爸爸,如果您还活着,我就是结草衔环也要报答您的恩情啊!”可再多的悔泪也唤不醒憨憨的继父了。在我的后半生,我无法原谅自己。

不是我家的人,不要让他住进来

    我的亲生父亲是个走村串户的货郎,为人谦和,总是一副笑眯眯的样子,却在一次夜归中被野狗咬伤,感染了急性狂犬症,三天后不幸死亡。那年,我7岁,妹妹5岁。
    母亲很多天以水度日,谁也别想让她吃进半粒米。我懂事地端着一碗饭,逼着母亲吃,还人小鬼大地说:“妈,爸爸死了,还有我。要是有人欺负您,我绝不饶他!”母亲露出一丝苦涩的笑,将我揽在怀里。
    奶奶早逝,爷爷强忍丧子之痛,里外张罗。给父亲做“三七”那天,家里要来很多客人,爷爷一大早就爬上暗楼抱柴火,因精神恍惚从梯上滚下,不幸中风,大小便都拉在床上。母亲除了照顾我和妹妹,还要照顾公爹,那时,她几乎绝望了,连死的念头都有,好几次抱着刺鼻的农药瓶发呆,可是舍不得我们,母亲没有迈出那一步。
    村支书是个很有魄力的人,召集村干部在我家开会,说:“声声妈的情况很特殊,过去那种‘守孝三年才能改嫁’的老观念要变,不然会饿死人。”大家一致建议母亲招夫入赘,病榻上的爷爷也点头同意。大人的话我听得懵懵懂懂,只知我家要来个人,且是“长住”。我不乐意,大声向母亲抗议:“不是我家的人,不要让他住进来!”母亲摸摸我的头,说:“你哪知大人的辛酸啊!”
    父亲满“百日”后,家里的“客人”络绎不绝,都是来瞧“对象”的。母亲那时才32岁,端庄贤淑。可人家瞅着这一窝子老弱病残,还有我满怀敌意的目光,都借故离去。我心里有说不出的高兴。

    一天,村支书领着一个身材壮实、但模样邋遢的男人来了,还带着个鼻涕流得老长的小男孩,我看着就烦。男人讨好地望着母亲笑,母亲皱了皱眉。支书见状,把母亲叫到一旁,嘀咕了老半天,末了,母亲点点头。支书大声对那男子说:“憨头,她家有老有小,你可不能半途而废。如果同意,过两天你俩就去把结婚证拿了。”叫憨头的男子连连应道:“同意同意。”原来,憨头的老婆嫌他穷,在广东打工时另找了人,坚决要与憨头离婚。憨头想着留人留不住心,就答应了,儿子归他。这次在村支书的撮合下,到我家“倒插门”。憨头将儿子留给老母后,只身来了我家。