洛阳铲的日志

2010年11月26日

别了SecuryCRT

Filed under: OS_Tips — 标签:, — 洛阳铲 @ 17:09

SecuryCRT用了近5年,惭愧的是没有购买版权,不得不说SecuryCRT是个很棒的软件,Tab支持,自定义光标,会话分组,多种身份验证机制(口令、密钥……)、端口/X11转发,Alt/Meta替换(Emacs用户福音),Xmodem/Zmodem支持(sz/rz即可上下传文件)。与其说是成天和服务器打交道,还比如说是成天和SecuryCRT打交道。如此的喜欢这个软件,但是这不能成为继续不合法的在使用它的理由,所以我也做出了痛苦的决定:试用开源的Putty,如果不适应,就购买正式版本的SecuryCRT,不是我钱多到无处花,而是因为,不能养成不劳而获的恶习。如果得到,就得必须付出!想要舒服的SecuryCRT就得为此买单,哪怕高达99美金也是必须的。
image

为了节省这99美金,一定要学会Putty。学习下来,可以肯定的说:Putty已经足够满足我对SecuryCRT80%的功能,剩下20%可以通过其他方法解决。使用Putty之前,首先对Putty的默认设置进行配置,然后在添加主机,这么做省去了添加一堆机器之后,修改某个设置后,又得回过头来一个机器几个机器的修改设置。下面是一些重要的设置:
首先关掉Bell,默认情况下终端里自动完成的tab键,man结尾的空格等等都会出发“嘟嘟”的声音,这些东西其实大可不必瞎嚷嚷,让它们都哑巴了吧:
image
禁用新开screen,screen其实也是一个命令,它可以让多个会话共享当前终端,互不干扰,哪怕关掉ssh连接也没关系,但是这儿这个screen和这个命令不是一个事情,此处的禁用新开screen是为了应对这种情况:emacs、vi、man等等命令,为了显示自己特殊的屏幕控制,而新建一个screen,这个screen和当前的终端一般是独立的,这种情况下,一旦退出emacs、vi、man,他们自己创建的那个screen便会消失、当前屏幕上面什么都不会留下,“雁过留声”是必须的,所以:
image

ssh有一项防发呆设置,在Putty中设置一下发送keepalives,设置每10秒发送空操作,这样不会莫名其妙的出现会话inactive错误。

image

关于密钥,ssh V1格式密钥的两种实现(OpenSSH和ssh.com)putty都可以完美支持,而由于ssh v2的密钥因为没有统一的格式,结果openssh、ssh.comhe和putty就各自为政,出来了三种格式,不过好在putty支持把ssh v2的openssh和ssh.com格式密钥导入或者导出成putty格式,这样可以利用putty的工具(puttygen.exe)来只有完成密钥在三种格式之间的自由转换。 为了安全期间,
当然别忘了给密钥设置密钥:
image

有了密钥之后,登录服务器就不需要输入密码了,只需要输入一次密钥,提供密钥就OK。这样你的密码甚至不会在网络上进行传输。
但是如果登录机器比较频繁,每登录一台服务器,都输入一次公钥密码似乎也是很麻烦的事情,现在该pageant.exe上场了,
image
它把密钥用密码解码之后加载到内存里面,putty每次登录机器的时候就可以直接向pageant.exe索取密码,而无需多次输入密码了,一次输入,多次使用。现在每天开机之后,只需要点击”Add Key”按钮,然后输入密码,就不用再和密码打交道了。完美!

image

如果觉得每次打开工作站或者自己的笔记本之后都重复执行”Add Key”也很繁琐的话,OK, 没问题,pageant.exe支持命令行调用增加sshkey,只需要在自动启动项加入一个cmd或者bat批处理: 
start D:\PROGRA~1\putty\PAGEANT.EXE  D:\ssh\ssh.ppk

这样每天开机之后,pagent.exe会自动运行起来,同时提示密码之后把ssh.ppk加载到内存。

如果你也和我一样,每天需要登录几百台服务器来进行管理,那么下面的小技巧可以节省不少时间:

因为ssh支持agent代理转发,这样只要在工作站或者笔记本(简记为W)上执行pageant.exe,登录服务器A的时候,会转发认证请求
到W的pageant.exe来验证公钥,从A再登录另外一台服务器B的时候也可以把ssh agent转发到W的pageant.exe。
类似的再从服务器B ssh到 服务器C一样可以转发ssh agent到W的pageant.exe。 为了做到这一点,只需要在putty中设置允许agent 转发,
同时在从A ssh到B的时候,增加A参数。

1. 允许agent转发

image

 

2. 使用-A 参数执行ssh,进一步转发agent,这样的好处就是只要W上面的pageant开着,不仅使用putty直接登录的服务器A可以使用pageant
来验证身份,而且登录A之后,再ssh到B也可以使用笔记本上的pageant来进行身份验证,如果到B的ssh也是-A的话,那么
在登录B之后,想再登录C,身份验证请求可以转发回B,而B则会转回A,A则会转回笔记本上的pageant。这样的话,
就会形成一个agent转发链,链的起点是当前登录的机器,终点就是运行putty的W。

SNAGHTML6c5045

 

2010年11月16日

捐赠维基百科

Filed under: 生活小札 — 标签:, — 洛阳铲 @ 14:42

今天在中文的维基百科上面看到这个捐赠号召。

维基百科创办人的公开信

写的很诚恳,于是捐10刀烟钱(不抽烟,权当抽了)。

维基百科创办人的公开信

捐款方法:

image

系统引导到PayPal系统登录

image

image

image 点击"Pay Now"确认捐赠。

image

捐赠完成之后,

image

http://bit.ly/cgHYPC 可以看到一些捐赠统计。每个捐助者都为这根增长的长线组一臂之力。

image

也见证了古话“人心齐泰山移”。其实这个捐赠号召已经发起好几年了,但是只要有捐赠,永远都不会迟!维基百科是一个公立、公正的文库,它会告诉你哪些话题有争议、哪些是事实,还有哪些是虚伪与丑恶。  我们不停在向世界索取,也请记得要想世界付出!

2010年11月12日

Free DNS service

Filed under: 生活小札 — 洛阳铲 @ 20:38

需要免费DNS解析,可以看看下面的东西,至于什么是DNS、怎么设置NS记录这些入门的问题直接google。

这儿提供一些免费的资源:

服务提供商 免费解析域名数量 申请地址 备注
ZoneEdit 5 https://www.zoneedit.com/ 动态域名DDNS支持,邮件转发,
he.net, 50 https://dns.he.net/  
MyDomain 未限制 http://www.mydomain.com/domains/services.php  
Godaddy 未限制    

Godaddy的免费域名解析服务隐藏的相当的深:我的账号、点击域名管理器(Domain Manager),然后选择Tool工具栏点击Off-site DNS即可。

image

这几个免费解析提供商中ZoneEdit是做的相当的不错,DDNS更是一大特色,相比而言花生壳一类真的只能下酒不可用来服务鸟。

2010年11月8日

国外PHP开源论坛选型

Filed under: PHP — 标签:, , , , — 洛阳铲 @ 10:17

首先本文只适合于有PHP经验,准备或者有能力做二次开发的使用者,如果仅仅是简简单单的需要一个论坛,那么目前国内耳熟能详的DZ、PHPWIND足矣!

Name 备选? 备注
PHPBB V3.0.7 No 参见用户系统集成分析一文,铁定不是备选方案
bbPress No 论坛版的Wordpress,WP的同胞兄弟,看过wordpress代码的同学知道,这是个什么level,ugly very much!

SMF

No 太简单,无法扩展(也许可以改名为SiMple Fourm),只能hack

MyBB

YES 提供merge系统,以便从其他平台迁移。而且其无处不在的hook系统此处有更多的hook介绍),方便进行扩展开发。同时提供一些有趣的特征:日程安排基于用户的post和行为reputation机制会员自动升级机制(基于post、reputation或者注册时间)、mass mail、警告机制维护任务系统

SEO-Board

No 仅仅从安装配置过程来看,便是geek级别的论坛程序,扩展性无从考察

PunBB

无架构级别的hook,但提供扩展机制,并且官方提供很多扩展

FluxBB

中规中矩、基本的论坛功能都有,也提供有限的插件扩展机制

Vanilla

YES 基于MVC的框架(Garden),甚至Vanilla也只是此框架之下的一个APP,适合于技术强悍的团队使用,但是微薄化论坛UI,有些让人难以适应

Phorum

No 中规中矩、基本的论坛功能都有

IceBB

No 只能算个基本的论坛,无亮点可言,无开发资源

UseBB

No 只能算个基本的论坛,无亮点可言,无开发资源

XMB

No 轻型论坛,开发资源相当有限

上面这个表格展示了目前国外主流的开源php论坛程序,如果选择的话,无疑MyBB和Vanilla是最优选择。MyBB属于拿来即可用而且进来也有极大的扩展空间,而Vanilla属于拿来即可以开发,将来更有无限的扩展可能,但是技术要求要高很多。对于普通的团队而言,门槛低的MyBB也许是更好的选择

外部参考:

  1. MyBB Svn仓库地址:  http://svn.mybboard.net/mybb/branches/1.6-stable/
  2. MyBB中文社区:  http://www.mybbchina.net/
  3. Vanilla Git地址:  https://github.com/vanillaforums/Garden.git

2010年11月7日

用户系统集成分析

Filed under: PHP — 标签:, , , , — 洛阳铲 @ 22:30

系统不能是封闭的,否则死水一潭,还是诗里说的好,问渠那得清如许?唯有活水源头来!
先说说这个事情需要达成的目标:

尽可能少的修改核心代码的情况下实现开源论坛(以phpBB和phpWind来说)和其他第三方系统的
用户集成、发帖集成和等级积分集成

首先明确一下在上面提到的几个目标:

  1. 和哪些第三方系统集成?
    目前常用的第三方系统无非这几类: 网店、wiki、CMS、
    希望一个一个去集成他们,那绝对是痴人梦话。必须需找一个中立的系统。
    说道这个,康盛创想开了个好头,Ucenter的出现正好满足了这个目标。
    目前支持Ucenter的很多,ecshop、UCHome、DZ系、phpWind等等系统都对Ucneter提供支持。
    所以UCenter列为研究重点(没有知道UCenter是否开源,只说UCHome开源,不知道这在版权方面有没有什么隐患,知道的兄弟拍一下砖)。
    所以分别在这几类系统里面挑选一个系统来研究分析。
    网店系统当然就选ecshop、另外两类就选UCHome。 一来它们都开源,二来这两个系统为康盛系,最能代表康盛创想的官方思路。ecshop是康盛创想后来收购的,非康盛嫡系,但受康盛官方的Ucenter支持,这里面必然揉杂了ecshop本来的独立性和康盛的官方思路,和准备集成的系统是一个路子,正好可以搭车求思路。
  2. 集成哪些功能? 用户集成应该是需求量最大和紧迫性最高的一个,其余的则要次之。
  3. 尽量不要hack核心代码。如果官方版本升级之后怎么办? 打patch? 那绝对是个恶梦;从头开始再把项目进行一遍?恶梦2。所以不好hack核心代码,转而使用官方支持的技术手段,比如phpbb的hook系统等等。

 

ecshop用户集成分析

使用integrate抽象会员处理类,根据不同的系统使用不同的实现来完成集成,
include_once(ROOT_PATH . ‘includes/modules/integrates/’ . $GLOBALS[‘_CFG’][‘integrate_code’] . ‘.php’);
对于Ucenter,使用includes/modules/integrates/ucenter.php中的ucenter类, 来完成ecshop和ucenter双向注册。
具体流程为:
在ecshop的register.php调用lib_passport.php的register()来完成注册,register()是使用$GLOBALS[‘user’]->add_user()
来注册用户,$GLOBALS[‘user’]变量代理了所有的用户相关的操作,$GLOBALS[‘user’]是调用来自lib_common.php的&init_users()函数来实例化的用户对象,
$user =& init_users();
之后的所有用户操作都基于此对象。下面是具体实现:
//根据配置,加载integrate接口的实现文件,并初始化该接口类

  function &init_users() { 
    $set_modules = false; 
    static $cls = null; 
    if ($cls != null){ return $cls; } 
    include_once(ROOT_PATH . 'includes/modules/integrates/' . $GLOBALS['_CFG']['integrate_code'] . '.php'); 
    $cfg = unserialize($GLOBALS['_CFG']['integrate_config']); 
    $cls = new $GLOBALS['_CFG']['integrate_code']($cfg); return $cls; 
} 

使用的时候,直接使用$GLOBALS[‘user’]->user_method(), 进行调用。

比如 includes/lib_passport.php中用户注册可以用下面来完成:

$GLOBALS[‘user’]->add_user($username, $password, $email)

对于使用ucenter的ecshop,则使用includes/modules/integrates/ucenter.php来实现真正的注册。

在includes/modules/integrates/ucenter.php中:

$uid = uc_call("uc_user_register", array($username, $password, $email));

之后再做一次insert操作把用户信息也插入ecshop自己的用户表,完成ecshop和UCenter双向注册。

在这儿有两个设计思路:

  1. 使用modules/integrates/’ . $GLOBALS[‘_CFG’][‘integrate_code’] . ‘.php’ 来抽象了用户集成管理
  2. 在UCenter和ecshop中使用双用户表

Ucenter Home

对于Ucenter Home而言。直接使用uc_client库中的:uc_user_register进行用户注册。

所有用户信息保存在UCenter中。

因为uc_client对需要和ucenter集成的地方都很重要,所以做个简单分析:

前面提到的uc_user_register()函数位于uc_client/client.php中。

在22行,有一个定义:

define('UC_API_FUNC', UC_CONNECT == 'mysql' ? 'uc_api_mysql' : 'uc_api_post'); 

这就是Ucenter 接口开发手册中提到的两种调用方式。真正注册是下面的调用:

function uc_user_register($username, $password, $email, $questionid = '', 
$answer = '') { return call_user_func(UC_API_FUNC, 'user', 'register', 
array('username'=>$username, 'password'=>$password, 'email'=>$email, 
'questionid'=>$questionid, 'answer'=>$answer)); }

换句话说如果UC_CONNECT是’mysql’的时候,通过用uc_api_mysql操作ucenter的用户数据表完成用户注册,

否则使用uc_api_post来向Ucenter发送远程调用来完成注册。

具体的数据库注册细节或者post XML请求注册细节可以参考uc_client/client.php

phpBB集成思路

完美的方法是使用官方支持的方法。对于phpBB, 官方支持的其实就是hook系统。

据说老版本phpBB而言是有挂钩的的,但是对于最新的发行版3.0.7 PL1,hook系统提供有限的支持:

line 225 in common.php:

$phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));

即只提供exit_handler,phpbb_user_session_handler,append_sid,templates,display的hook。

对于用户注册,其实现位于 includes/ucp/ucp_register.php 的328行:

$user_id = user_add($user_row, $cp_data);

user_add是includes/functions_user.php的函数。无挂钩操作!

遗憾的是在用户注册这条路上,看到ucp_register::main中直接使用user_add来往数据库写注册用户的那一刻,偶心都凉了。

老实说真想去改user_add来增加钩子;但是如果以后钩子系统做改动或者phpBB出来3.4或者4.0。这些工作又要重新来过。

此条路不通!

说到这儿随便bs一下phpbb的代码,看着满屏的SQL语句,没有OO的意思,时不时就会冒出扔掉的冲动。


既然UCenter作为中心,那么何不利用Ucenter和外部系统进行通讯,实现系统间用户注册同步呢?

即关闭phpbb的用户注册功能,转而使用UCenter的用户注册模块,并且通过UCenter调用自行开发的PHPBB API进行用户注册。

 

PHPwind7.5 SP3用户注册分析

register.php第203行,通过L::loadClass(‘Register’)加载注册类register.class.php。使用PW_Register::execute进行注册操作。

在PW_Register::execute()中,使用uc_client/uc_client.php中的uc_user_register()来抽象用户注册(这个uc_user_register意外的和康盛创想的uc_client保持了目录结构和函数名称及调用格式惊人相似,这种相似一度迷惑我以为phpwind直接使用UC的客户端),uc_user_register 使用uc_data_request( ‘user’, ‘register’)来加载: uc_client/class_core.php实现MVC方式的进行注册,这后面的动作和UC非常类似, 只是写表操作(uc_client/model/user.php的add函数)发生在PHPWind自己的用户表上面。

uc_data_request中UC()->control(‘controle’)加载控制器控制器自己在构造函数中使用UC()->load( ‘model’ )加载需要使用的model。

即PHPWind对用户注册有抽象层,即可通过此处实现用户注册。

开发PHPWind的API的时候,发现用UC的Client库的时候到处出现已经声明过的函数错误,诸如:us_user_**系列 函数,好在php5.3之后支持命名空间,很容易的解决这个问题之后, 发现很多地方仍然有问题,深入debug发现,n多的常量居然也是同名,典型的莫过于UC_APPID 实在无语,PW_APPID也好过UC_APPID。 看来PHPWind的工程师要么是系统地学习了UC的代码,要么就是两家公司的开发人员浑然天成的心有灵犀!

因为上面这些分析的结果都是以UCenter为中心展开,所以有必要对UCenter做深入的分析。

UCenter的分析

UCenter的入口文件是index.php。在index.php中,根据$_REQUEST[‘release’]选择release/UC_CLIENT_RELEASE/版本。

同时根据传入的模块参数$m,选择app、frame、user、mail等等不同的模块。

如果没有则使用默认的版本:

if(empty($release)) { 
  define('RELEASE_ROOT', "release/20080429/"); 
} elseif(  intval($release) != UC_SERVER_RELEASE) { 
  define('RELEASE_ROOT', "release/$release/"); 
} else { 
  define('RELEASE_ROOT', ''); 
}
  
if(file_exists(UC_ROOT.RELEASE_ROOT.'model/base.php')) { 
  require UC_ROOT.RELEASE_ROOT.'model/base.php'; 
} else { 
  require UC_ROOT.'model/base.php'; 
}
if(in_array($m, array('app', 'frame', 'user', 'pm', 'pm_client', 'tag', 'feed', 'friend', 'domain', 'credit', 'mail', 'version'))) {

if(file_exists(UC_ROOT.RELEASE_ROOT."control/$m.php")) { 
  include UC_ROOT.RELEASE_ROOT."control/$m.php"; 
  } else { 
  include UC_ROOT."control/$m.php"; 
  }
  $classname = $m.'control'; 
  $control = new $classname(); 
  $method = 'on'.$a; 
if(method_exists($control, $method) && $a{0} != '_') { 
  $data = $control->$method(); 
  echo is_array($data) ? $control->serialize($data, 1) : $data; 
  exit; 
}elseif(method_exists($control, '_call')) {
  $data = $control->_call('on'.$a, ''); 
  echo is_array($data) ? $control->serialize($data, 1) : $data; 
  exit; 
} else { 
  exit('Action not found!'); 
  }}

使用MVC模式,根据m参数加载控制器$m.php。$m.’control’调用其父类base::load方法加载模型。

function load($model, $base = NULL, $release = '') { 
  $base = $base ? $base : $this; 
  if(empty($_ENV[$model])) { 
  $release = !$release ? RELEASE_ROOT : $release; 
  if(file_exists(UC_ROOT.$release."model/$model.php")) { 
  require_once UC_ROOT.$release."model/$model.php"; 
  } else {
  require_once UC_ROOT."model/$model.php"; 
  } 
  eval('$_ENV[$model] = new '.$model.'model($base);'); 
  } 
  return $_ENV[$model]; 

不得不说UCenter的这个设计思路是相当灵巧的:

  1. 客户端可以指定Ucenter兼容的版本,服务器如果无法提供,也会有一个默认的版本: model/base.php 这个是UCenter服务端的默认版本
  2. 让我们扩展UCenter成为了可能,比如现在最新的UCHome的uc client是使用’20090121’版本(define(‘UC_CLIENT_RELEASE’, ‘20090121’);),

    而ecshop中的UCclient是使用’20081212’版本( define(‘UC_CLIENT_RELEASE’, ‘20081212’); )

    而服务器只有两个版本一个是主版本,另外一个是位于release下面的20080429。 既没有UCHome的20090121也没有ecshop的20081212.

    所以其实使用的版本是主版本model和control两个目录中的代码。 换句话说,如果我们提供一个自己的20081212或者20090121 release,

    那么我们就扩展了现在的UCenter。

  3. control+model典型的MVC模式。在API通讯中V可以忽略不计。更好的消息是在基础控制器中负责加载模型的load()函数,它也工具release

    选择不同的模型,这就是说: 不仅可以扩展控制器、还可以扩展模型。当然对于集成这个任务而言简单的扩展模型就可以实现目标

如何整合?

对于PHPBB,整合系统代码功能分析:

  1. 给phpBB增加API,将phpBB功能以服务的形式提供出来。最主要的是暴露给提供UCenter中自定义的模型使用,

    之所以选择API,而不是直接操作数据库,是因为在以后的pbpBB升级过程中可以更加平滑。同时不仅仅可以给UCenter使用,也可以给别的第三方使用
  2. 关闭phpBB的注册功能

另外,深入的分析和试用,发现phpBB不大适合国情,因为:

  1. UI需要修改,默认的字体在e文先很漂亮,但不适用于咱们的方块字。
  2. SEO不原生支持,虽然可以通过插件支持,但是一旦升级,seo的插件不一定赶得上,则意味着之前的url统统都白搭
  3. 代码开源,但是架构封闭,就拿用户注册那一部分的分析就可以窥豹一斑。

鉴于此,增加phpWind作为一号候补,不选择Dz,完全是因为看不到代码,没有真相,而且phpWind提供类似UCHome的个人中心也十分容易和其他系统集成,而且本身提供API(只是没有正式公布)而ecshop支持和phpwind集成,这样一来论坛、个人中心和网店可以无缝集成。由于此时 phpWind8还是beta版本,而且只有gbk没有utf-8版本,放弃了初期以php8作为分析整合对象的目标,转而还是以php7.5 SP3为目标。 不过因为和UCHome重复的原因,这儿需要做些选择到底是:phpWind还是UCHome?

在可以预计的将来,独立的第三方应用会越来越多,所以还是以平台中立为重点,基于此,倾向于UCHome,而phpWind只是UC中的论坛app。

在新版本的DZ X中,似乎削弱了这种UC平台的中心地位,同时把很多UCHome的功能嵌入到了论坛中去,这似乎是在向PW学习。

老实讲,我并不看重这种思路,原因很简单:KISS原则,做最简单的自己, 做最专业的自己。DZ也好PW也好最实用的还是论坛功能,其他

功能圈子、群组之类的并不是你的特长,也不需要你很特长,如果把自己包装成面面俱到的多面手,到头来就会变成个四不象:什么功能都有,

但是什么功能都不专业。反而提供一个通用的接口或者平台,与其他系统完美的交互,构造自己在网络平台的中心位置,这才是重中之重!

也许看起来功能很简单、单一,其实在周围已经繁衍出无数的外围产品,

Older Posts »

Powered by WordPress