出家如初,成佛有余

三鹿事件思考

Posted in Uncategorized by chuanliang on 2008/09/15

    在中国这片充满神奇的土地上,像三鹿这样的事件不是第一起,也绝对不会是最后一起。对于一个丧失了自己核心传统价值观、基本诚信严重缺失的社会,对于一个无所畏惧和毫无任何道德信仰的民族而言,这样令人发指的事件还会源源不断地涌现。拜托我们的人民公仆们不要再一次一次自淫什么中华民族的传统美德,一遍又一遍厚颜无耻地让大家对自己感恩戴德。如果我们的祖先曾经有过善良、与人为善的美德,那么这些美德早已经在一次又一次的革命运动中被洗刷掉了。其实一个民族或者企业最为恐怖的不是经济的贫穷、也不是环境的残酷,最为恐怖是整个民族丧失了基本的善恶标准,丧失了对自己基本信仰的坚持。

   有两种东西,我们愈是时常愈加反覆地思索,它们就愈是给人的心灵灌注了时时翻新, 有加无已的赞叹和敬畏 ——头顶的星空和心中的道德法则。 ——康德墓碑铭文

    我自己有多久没有仰望过头顶的星空和三省吾身了?没有自己信仰的东西,那始终不会因为满足而快乐,这或许是我自己不快乐的根源吧。

    经过此次事件,按照正常人的逻辑推断而言,三鹿应当倒闭,也必须倒掉。如果经历这样的事件后,这样的企业还能生存下来,那真是对整个社会莫大的讽刺,然而我相信最后基于各种“有中国特色的理论”的论证,三鹿事件会很快平息下来,三鹿最终也不会倒掉,这才是让我辈感到崩溃和绝望的。

    同样不道德的康师傅在矿泉水事件后仍然可以生存下来,因此矿泉水并不是其核心业务,而三鹿的奶粉是其生存的根本。每一个企业和各人都有自己核心品牌和核心竞争力,一定要好好捍卫好自己的核心品牌和核心价值,对于自己的核心价值不能拿一时的利益去交换。相信三鹿的各位老板也曾经权衡过得失利弊,最终还是屈从于利益的需要。当我面对自己的三鹿事件时候,我自己能够坚持自己的核心信仰吗?

    最好的危机公关是不制造危机,将自己的命运寄托在与自己一样不道德的人的身上,永远没有好的下场。

    与其相信并指望那些伟大、光荣、正确的东西,与其相信那些商场上光怪陆离的利益交换,还不如指望自己的努力来换取幸福和快乐,还不如相信自己心中的善恶标准,至少我们可以通过对心中信仰的满足来得到相对的宁静,至少还可以按照自己的标准过得相对的道德。

    每一个人都会面对自己的三鹿事件,我们该怎样应对?

关于Google Chrome的那些事儿

Posted in Uncategorized by chuanliang on 2008/09/14

    Google Chrome出来后,整个互联网都处于亢奋之中,铺天盖地都是关于Chrome的专题文章、博文,多到有点让人发吐的地步。大家从云计算入口、SaaS服务、无线互联网、浏览器等角度谈论了Chrome对于Google的战略意义,也有大量从“产品设计、用户体验”角度大力推崇其极简主义风格的,呵呵,当然更少不了的“挑战微软的垄断地位、挑战微软的霸权”之类的中国特色的口号。

    由于这段时间忙项目开发的事情,也没时间仔细去思考此事情,今天有空梳理一下自己对Google Chrome的理解。

1、战略性产品 vs. 战术性产品

    我同意Google Chrome对于Google整个互联网战略布局的意义。就目前而言,浏览器仍然是互联网应用的“入口”,作为”互联网入口“的客户端比网页形式的在线应用在展现上及服务推送上更为灵活,更能够有效培养用户对服务的依赖性和忠诚度,因此客户端是每一个互联网公司必争的地盘。对Google而言,应该是希望通过Google Chrome来摆脱对操作系统、浏览器等第三方资源的依赖,为自己的服务及应用找一个统一的控制点和接入点(当然这些服务及应用也可以以当下时尚的“云计算”的外壳来包装),早期的Toolbar、Desktop、Gtalk等桌面应用已经无法支撑Google的需求。Chrome早晚肯定会成为Google所有应用的聚合平台和入口平台,尽管目前Beta版本没有附带任何Google的产品。

    目前互联网大战的游戏才刚刚开始,目前只是google暂时领先(尽管其领先的优势还是蛮明显的),谁能够真正成为千秋万代的霸主尚言太早。其实并不是google做得太好了,而是因为微软做得太差了,看看微软的互联网产品就知道其内部战略有多么的混乱,真浪费了那么多好的资源,其实微软并不缺互联网应用的基础,缺少的是具有互联网思维方式、持续性的互联网战略及舍弃当前部分利益挥刀自宫的决心。但如果微软调整好其互联网战略,那这场互联网游戏就很好玩了,其Office Live(商务化平台)+XBox Live(娱乐化平台)+Windows Mobile(无线互联网平台)+其他传统资源及其他Live应用的组合(例如垃圾的Live Search)还是蛮具有杀伤力的,尤其是在操作系统、浏览器等互联网基础设施上其先天的优势。其中基于XBox Live的娱乐化平台(尽管目前尚处于亏损状况),个人极其看好其未来,而Google目前尚未有任何能力和资源能够进入。

   从微软这个公司的基因分析而言,个人认为不管微软目前互联网战略有多么糟糕,这个庞大的帝国肯定会顺利完成其转身的,只是是其付出的时间及成本而已,因此从Google角度而言,必须在微软完成转身前构筑起竞争壁垒,而通过对互联网入口的控制来强化自己对整个互联网的话语权是手段之一。那么对于Google而言,Google Chrome算是“战略性产品”、“战术性产品”抑或是“20%时间的产品”,是用于防御、进攻、防御性进攻?从Google各位老大的重视程度来看,Google Chrome应该是一个战略性产品,而就目前chrome的产品特征目前尚看不出有太多进攻性的特征,正如施密特所言“由于试图防止微软利用其占市场主导地位的Internet Explorer浏览器包抄自己,谷歌的此项决定带有一定的防御成分”。

    既然是战略性产品,就我辈理解,那Google Chrome所被寄予的期望就不单纯是浏览器了,其承载的Google通过客户端(PC、无线)掌控互联网入口的野心。

2、Google Chrome的朋友和敌人(Google Chrome vs. Firefox)

   伟大领袖告诉我们:“谁是我们的敌人?谁是我们的朋友?这个问题是革命的首要问题 ”

   我相信Google在打算自己推出Chrome前所作的产品规划中肯定已经明确回答了此问题,不知其内部是怎样定位Firefox、Opera、Safari这些早期的合作伙伴的。其实Google Chrome最大的受伤者不是微软,我觉得是Firefox,也是Google自己。预计在未来一段时间内,Google还是会作为Firefox顶级的商务合作伙伴(不是技术合作伙伴)对Firefox进行赞助,但没有理解Google自己为何对Firefox现有各种社区资源、丰富成熟扩展、良好的合作关系不顾,而直接选择了基于Webkit重启炉灶来开发自己的东西。如果是以为了提供“更快的速度、更好的用户体验、更强大的功能”的创新噱头而采用这样的策略,我觉得至少就目前Beta版本功能而言,Google Chrome并不能称得上一个典型的“Google式“创新的产品,如果一定要说创新,我觉得只能说是杂交了当下各种浏览器部分优点的产品而已。Google Chrome或许有美好的未来,但就当前而言,Google 在客户端战略上需要做的应当是团结一切可以团结的力量,利用一切可以利用的资源来帮助自己达到革命目标,而不是现在就开始从阵营内部分化。

    Google Chrome的目标不应当是做好的浏览器,而是为用户使用Google各种应用及服务(云计算)提供最好的接入点。其实Google Chrome可以考虑采用Webkit+Gecko双核心策略,这样可以兼顾各方的利益,同时可以应当充分利用Firefox现有的各种资源。

3、简洁制胜?(Google Chrome vs. Gtalk)

    其实Google并不是没有好的桌面端(手机端)整合接入工具, 一直觉得Google 其实白白浪费了Gtalk这么好的整合工具。不知Google对Gtalk的定位是怎样的,Gtalk发展了这么多年,一直还是到死不活的状态。一个软件出道时候标榜自己简洁可以博得众多的喝彩,但要是经过这么多年还是简洁到什么功能都不完善的程序,那还不如放弃算了。简洁≠功能简单≠功能不能强大。

    其实Gtalk要是早就采用开放平台策略(不单纯是通信协议的开放),参考Firefox或Chrome的扩展机制,提供一个足够简洁的核心基础框架,然后让众多人去帮助做插件和应用,这样可以保持内核框架的简洁和功能强大的平衡性,同时可以形成自己核心的社区。要是Gtalk早就按照此种思路去做,尤其是通过Gtalk来整合其搜索、地图、Orkut、Blogger等社区化元素,那Google现在做SNS或Chrome就容易多了。

    历史总是一次一次重复类似的故事,不知当年鼓吹“Gtalk简洁制胜,只用Gtalk”的各位仁兄们还有多少人仍然在坚持自己当初的承诺,但愿Google Chrome不要再走Gtalk及其他诸如Blogger、Orkut等Google产品老路子。

 

4、Google Chrome的核心应用场合

   众多人都说无线互联网是Google Chrome是核心应用场合。是的,没错,无线互联网是下一个Big Deal,当然少不了Google,当然也少不了Google的战略性产品的身影。只是个人觉得Google Chrome的最大价值是google各种应用的聚合接入点,而不单纯是其中的一个市场,也不单纯是一个浏览器本身。

   其实这一点Google Chrome应当充分学习Firefox社区及各种应用扩展的思路,把自己的各种应用无缝融入Google Chrome中,我想这应该是Google内部度量Google Chrome是否成功的标准之一。

   Google Chrome距离成功还有很大的距离,只不过这对于我辈并不重要,重要的是浏览器战火的重燃、竞争的加剧才能激发各产品的创新动力,而我们是最大的受益者。

使用awstats完成门户社区流量统计分析

Posted in Uncategorized by chuanliang on 2008/09/13

    Web站点中主要有三类数据:内容数据、结构数据、使用数据。同时Web Mining也分成三类:Web Content Mining、Web Structure Mining、Web Usage Mining。

    Web Content Mining和Web Structure Mining的对象都是网络上的原始数据。

    Web Usage Mining面对的是用户和网络交互过程中抽取出来的二手数据,这些数据主要是用户在访问Web时在Web日志(logs)里留下的信息,以及其它一些交互信息,包括:访问日期、时间、用户IP地址、服务器IP地址、方法、所请求URL资源、服务器响应状态、用户代理、发送字节等。Web Usage Mining就是对Server Logs、Error Logs、Cookie Logs等日志信息,以及用户的注册数据、社区发帖数据、点击行为数据、消费数据等进行挖掘,以发现有用信息。

    可以说对门户社区的访问流量进行统计分析是进行社区运营的重要手段,可以根据用户行为分析结果及时调整网站结构,提高用户体验。

    对用户行为分析最为准确的还是诸如协同过滤这样的技术,但由于涉及统计分析等复杂算法,后期再逐步引进,目前先针对访问日志进行统计分析。

    对Web日志的分析采用awstats来完成,下面简单说明一下awstats的安装使用。

1、 系统环境:

OS:Red Hat Enterprise Linux Server release 5

Apache:httpd-2.2.3-6.el5

Perl:perl-5.8.8-10

2、 关闭selinux

vi /etc/selinux/config

SELINUX=disabled

将SELINUX=enforcing修改为disabled,重启服务器

如果不想重启服务器,执行如下命令,但是只在当次启动有效:

selinuxenabled 0

查看目前selinux的状态: sestatus

如果要查询到更多的信息,可使用sestatus –v

查看selinux对httpd的参数值:getsebool -a | grep httpd

要设定selinux对httpd的参数值,可利用setsebool,例如:

setsebool -P httpd_disable_trans 1

3、 下载awstats

wget http://awstats.sourceforge.net/files/awstats-6.9.tar.gz

4、 安装awstats

tar zxvf awstats-6.9.tar.gz

mv awstats-6.9 /usr/local/awstats

cd /usr/local/awstats/tools

perl awstats_configure.pl

………………………省略部分内容…………………………

Do you want to continue setup from this NON standard directory [yN] ? //具体设置

输入y,如果awstats放在/usr/local/目录下,则不会显示这一步

—–> Check for web server install

………………………省略部分内容………………………….

输入/etc/httpd/conf/httpd.conf

………………………省略部分内容………………………….

—–> Need to create a new config file ?

输入y

………………………省略部分内容………………………….

—–> Define config file name to create

输入你想分析的网站域名如:localhost

………………………省略部分内容………………………….

—–> Define config file path

默认即可

………………………省略部分内容………………………….

—–> Add update process inside a scheduler

回车即可

A SIMPLE config file has been created: /etc/awstats/awstats.localhost.conf

You should have a look inside to check and change manually main parameters.

You can then manually update your statistics for ‘localhost’ with command:

> perl awstats.pl -update -config=localhost

You can also read your statistics for ‘localhost’ with URL:

> http://localhost/awstats/awstats.pl?config=localhost

Press ENTER to finish…

回车安装完毕

5、 安装来访者IP未知插件:

wget http://www.ieasy.org/download/qqhostinfo.pm

cp qqhostinfo.pm /usr/local/awstats/wwwroot/cgi-bin/plugins

wget http://www.ieasy.org/download/qqwry.pl

cp qqwry.pl /usr/local/awstats/wwwroot/cgi-bin/plugins

下载QQWry.Dat(http://update.cz88.net/soft/qqwry.rar),上传到/usr/local/awstats/wwwroot/cgi-bin/plugins下

也可以使用GeoLiteCity.dat,但GeoIP对中国城市的统计不准确,在国内还是珊蝴虫和纯真版IP数据库相对准确。

6、 配置httpd

修改/etc/httpd/conf/httpd.conf,修改内容如下:

AddHandler cgi-script cgi pl

#

# Directives to allow use of AWStats as a CGI

#

Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"

Alias /awstatscss "/usr/local/awstats/wwwroot/css/"

Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"

ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"

#

# This is to permit URL access to scripts/files in AWStats directory.

#

<Directory "/usr/local/awstats/wwwroot">

Options None

AllowOverride None

Order allow,deny

Allow from all

</Directory>

7、 配置awstats

mkdir -p /var/lib/awstats

chmod -R +x /var/lib/awstats

修改/etc/httpd/conf/httpd.conf

将CustomLog “logs/access_log” common修改为

CustomLog “logs/access_log” combined

LoadPlugin=”qqhostinfo”

编辑/etc/awstats/awstats.localhost.conf 修改

LogFile="/etc/httpd/logs/access_log"

perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=localhost –update

8、 重启httpd

service httpd restart

9、 访问awstats

http://192.168.1.202/awstats/awstats.pl?config=localhost

10、 参考资料

http://www.ieasy.org/reload/cat2/awstats_qqhosti.html

http://www.chedong.com/tech/awstats.html

http://www.osxcn.com/journal/awstats-plugins.html

在linux下使用nfs及软链接解决图片文件共享问题

Posted in Uncategorized by chuanliang on 2008/09/13

    由于在门户社区中,诸如图片、下载软件这样的资源都较大,且在下载过程中,对带宽资源的占用也较大,因此为不影响正常业务应用,一般情况下都是将图片等资源部署到一台单独的服务器上以分配单独的带宽(在同一台服务器上也将这些资源存放在磁盘空间较大的地方),此种情况下图片等资源与应用不一定在同一台服务器上,即使在同一台服务器上也不一定部署在同一目录下。方案如下:

1、 图片等资源部署在单独的另外一台服务器上

此种模式可以通过linux的nfs来把完成远程文件mount为本地的文件目录(类似于windows的网络共享),步骤如下:

下面以将192.168.1.199(NFS服务器端)上的目录/liang mount到192.168.1.202(NFS客户端)上为例,说明一下远程mount的实现

1) NFS服务端(192.168.1.199)执行如下操作

  • 在NFS服务端(192.168.1.199)修改/etc/exports,内容如下
         /liang 192.168.1.0/255.255.255.0(ro,no_root_squash,sync)

格式如下:directory machine1(option11,option12)

       注意:好像采用很多文档所说的 /liang 192.168.1.*(ro,no_root_squash,sync)存在问题
  • 在NFS服务器端启动NFS:

/etc/rc.d/init.d/portmap start

/etc/rc.d/init.d/nfs start

  • exportfs命令:

在启动了NFS之后又修改了/etc/exports后可以用exportfs命令来使改动立刻生效,命令格式如下:

exportfs [-aruv]

-a :全部mount或者unmount /etc/exports中的内容

-r :重新mount /etc/exports中分享出来的目录

-u :umount 目录

-v :在 export 的时候,将详细的信息输出到屏幕上。

2) 在NFS客户端(192.168.1.202)执行如下操作

  • 建立本地mount点目录

mkdir /liang

  • mount远端目录到本地目录

mount 192.168.1.199:/liang /liang

  • 修改/etc/fstab以在系统重启时候自动mount:
     # device       mountpoint     fs-type     options      dump fsckorder
     192.168.1.199:/liang  /liang    nfs          rw            0    0
  • showmout命令

-e :显示指定的NFS SERVER上export出来的目录。

-a :是用来显示已经mount上本机nfs目录的cline机器,一般在NFS SERVER上使用

2、 图片等资源与应用部署在同一台服务器上,但资源目录与应用目录不在一处

此种情况,采用linux的软链接把图片等资源链接链接到应用的目录下。

ln  -s /image /www/newwap/wap/image

由于安全上的考虑,tomcat及jboss缺省情况下都不允许访问软链接的文件,改动如下:

在conf/server.xml中或conf/Catalina/localhost(根据虚拟主机配置情况做相应改变)下的context中增加如下内容:

<Context path=”” docBase=”/www/newwap/wap”  allowLinking=”true”>

<Resources className=”org.apache.naming.resources.FileDirContext”

allowLinking=”true”/>

<Logger className=”org.apache.catalina.logger.FileLogger”/>

</Context>

3、参考资料

http://nfs.sourceforge.net/nfs-howto/ar01s04.html

Technorati Tags: ,,,,,

Ucenter Home 1.5安装及单点登录集成方案

Posted in Uncategorized by chuanliang on 2008/09/07

    整理一下安装Ucenter Home1.5版本及Discuz BBS的过程及与公司自己的门户社区整合过程中的注意事项作为备忘。

下面以在服务器192.168.1.202上安装配置说明一下整合过程。

    操作系统:Redhat AS 4

    Mysql : 5.0

   

1、下载UCenter、UCenter Home、Discuz! 集成安装包

    http://download.comsenz.com/UC_UCH_DZ/UC_UCH_DZ_SC_GBK.zip

2、下载ucenter home 1.5

    http://www.jz123.cn/soft/download.asp?softid=12538&downid=62&id=12427

    目前ucenter home 1.5版本为beta版本,官方尚未正式发布,由于功能相对全,因此采用此版本。

3、下载ucenter头像升级页面

    http://u.discuz.net/download/avatar.zip

4、数据库安装,以utf8创建数据库并创建sns的用户

    create database sns default character set utf8;

    grant all privilege on *.* to sns@’localhost’ identified by ‘sns’;

    flush privileges;

5、apache及php安装配置

   使用Redhat AS 4自带的httpd及php,修改/etc/httpd/conf/httpd.conf

       port  80

        DocumentRoot "/var/www/html/sns"

6、安装UCenter、UCenter Home、Discuz! 集成安装包

    mkdir /var/www/html/sns

    unzip UC_UCH_DZ_SC_GBK.zip

    mv upload/* /var/www/html/sns/ 

7、访问http://192.168.1.202,开始安装过程

        UCenter的访问网址:

            http://192.168.1.202/ucenter

        DISCUZ!的访问网址:

            http://192.168.1.202/bbs

        管理员访问网址:
            http://192.168.1.202/bbs/admincp.php
        UCenter Home的访问网址:
            http://192.168.1.202/home
        管理员访问网址:
            http://192.168.1.202/home/admincp.php

8、将ucenter home从1.0版本升级ucenter home 1.5版本

     将UCenter_Home_1[1].5RC1_SC_GBK.rar中的upload目录下的文件upload/ 目录中,除 config.new.php 文件、install/ 目录以外的其他所有文件全部上传到home/目录下并覆盖当前程序,特别注意的是,最新数据库结构 ./data/install.sql 文件不要忘记上传将程序包UCenter_Home_1[1].5RC1_SC_GBK.rar update目录中的update.php文件上传到home/目录目录,并在浏览器运行。

    http://192.168.1.202/home/update.php

    升级成功完成安装后:

      删除home/update.php文件

      删除 home/data/tpl_cache目录中的所有模板缓存文件

      上传avatar.zip中的avatar.php到ucenter/下并覆盖原来的文件

9、为整合门户社区需要进行的修改问题汇总

9.1、ucenter home注册及登录页面校验逻辑修改

注释掉sns安装目录下home/source/function_common.php下的对formhash认证的函数,修改如下:

    //判断提交是否正确

function submitcheck($var) {

        if(!empty($_POST[$var]) && $_SERVER[‘REQUEST_METHOD’] == ‘POST’) {

                if((empty($_SERVER[‘HTTP_REFERER’]) || preg_replace("/https?://([^:/]+).*/i", "1", $_SERVER[‘HTTP_REFERER’]) == preg_replace("/([^:]+).*/", "1", $_SERVER[‘HTTP_HOST’])) ) {

//删除  && $_POST[‘formhash’] == formhash()

//              if((empty($_SERVER[‘HTTP_REFERER’]) || preg_replace("/https?://([^:/]+).*/i", "1", $_SERVER[‘HTTP_REFERER’]) == preg_replace("/([^:]+).*/", "1", $_SERVER[‘HTTP_HOST’])) && $_POST[‘formhash’] == formhash()) {

                        return true;

                } else {

                        showmessage(‘submit_invalid’);

                }

        } else {

                return false;

        }

}

9.2、门户集成ucenter home注册页面实例

一个典型的注册页面

<form id="registerform" name="registerform" action="do.php?ac=register&&ref" method="post" class="c_form">

<table>

  <tr><th>Username</th><td><input type="text" id="username" name="username" value="" /></td></tr>

  <tr><th>Pass</th><td><input type="password" name="password" id="password" value=""  /></td></tr>

  <tr><th>Pass2</th><td><input type="password" name="password2" id="password2" value=""  /></td></tr>

  <tr><th>mail</th><td><input type="text" id="email" name="email" value="@" /></td></tr>

  <tr><td><input type="submit" id="registersubmit" name="registersubmit" value="register" /></td></tr>

</table>

<input type="hidden" name="refer" value="space.php?do=home" />

</form>

注意上述提交按钮<input type="submit" id="registersubmit" name="registersubmit" value="register" />必须以此种形式提交,因为是ucenter程序验证了submit的name或id,
程序提交时候不要忘记了此参数。

9.3、注册码问题:

由于用户一般情况下并不需要登录UCHOME的注册页面,因此此处可以先注释掉注册码验证逻辑,只验证用户名称及密码。

注释方法,修改home/source/do_register.php,注释掉

/*

                if($_SCONFIG[‘seccode_register’]) {

                        include_once(S_ROOT.’./source/function_cp.php’);

                        if(!ckseccode($_POST[‘seccode’])) {

                              showmessage(‘incorrect_code’);

                      }

                }

    */

9.4、注册时候需要验证邮箱的问题

由于我们目前注册时候并不需要用户输入邮箱(号码管家也不要求用户使用邮箱注册),而sns注册时候需要用于邮箱,而此部分代码在ucenter中控制,此部分代码加密了的,没有办法修改,目前为简单起见,如果用户在注册时候填写了邮箱,则在门户提交给sns的注册页面参数中以用户填入为准,如果没有,则以用户手机号+”@”+mobile-soft.cn为用户邮箱。

9.5、自动激活问题

UCHOME、BBS通过UCENTER整合到一起后,在UCHOME注册后,在使用BBS时候首先必须进行激活操作,这对于用户体验并不是很好。

因此注册时候,同时完成用户在BBS的激活操作。

 注册时候自动激活用户BBS帐号:

在手软门户登录注册时候同时在cdb_members、cdb_memberfields中插入相应的数据,其中在cdb_members中的password字段可以任意填写

INSERT INTO `cdb_members` VALUES (’21’, ‘liang6’, ‘liang6’, ”, ‘0’, ‘0’, ’10’, ‘0’, ”, ‘192.168.1.7’, ‘1220466585’, ‘192.168.1.7’, ‘1220466638’, ‘1220466672’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘liangchuan@mobile-soft.cn’, ‘0000-00-00’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘1’, ‘1’, ‘1’, ‘0’, ‘9999’, ‘0’, ‘0’, ‘2’, ’26’, ‘0’, ‘0’);

INSERT INTO `cdb_memberfields` VALUES (’21’, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ‘0’, ‘0’, ”, ”, ”, ”, ”, ”, ‘0’, ‘0’);

以上插入记录的用户的id号可以从uc_members表中获得

9.6、门户集成ucenter home登录实例

<form id="loginform" name="loginform" action="do.php?ac=login&amp;&amp;ref" method="post" class="c_form">

<table class="formtable" cellpadding="0" cellspacing="0">

<tr><th width="100"><label for="username">Username</label></th><td><input name="username" id="username"  value="" type="text"></td></tr>

<tr><th><label for="password">Password</label></th><td><input name="password" id="password"  value="" type="password">

  </td></tr>

<tr><td><input id="loginsubmit" name="loginsubmit" value="Login" class="submit" tabindex="5" type="submit">

</td></tr>

</table>

<input name="refer" value="space.php?do=home" type="hidden">

</form>

9.7、bbs登录注册问题

由于bbs的注册通过sns的注册已经解决了,因此不需要单独的注册页面,开发时候把bbs的注册页面修改为手软门户的注册页面。

要实现在登录门户时候同时自动登录bbs相对简单,一个典型的登录表单:

    <form id="loginform" method="post" name="login" action="logging.php?action=login&amp;loginsubmit=true">

        <input name="username" value="" type="text"><br>

        <input id="password" name="password" type="password"><br>

        <button name="userlogin" type="submit" value="true">login</button>

</form>

 

在线主题制作技术实现方案

Posted in Uncategorized by chuanliang on 2008/09/07

    在做门户社区实现中,有类似魔秀(http://www.moxiu.com)的在线主题制作需求,这种用户生成内容(UGC)的形式对于活跃社区气氛、提高用户对社区的粘性是大有好处的。

1、技术实现核心问题:

  • 提供用户自助上传图片的工具
  • 根据用户手机的分辨率,提供在线图片编辑工具,让用户选择要裁剪的区域,作为要制作主题的图片的宽和高
  • 用户提交选定的区域范围到服务器,后台程序根据用户选择图片指定的宽和高对图片进行自动裁剪,生成手机主题,当然还可以实现诸如打水印等功能
  • 参考各手机平台主题的制作方法,把背景图片打包成手机主题

2、技术实现方案如下:

  • 用户上传工具,直接使用struts2 的file upload 工具
  • 在线图片选择工具,采用jquery的img area select plugin实现http://odyniec.net/projects/imgareaselect/ 
  • 图片裁剪采用imagemagick实现,可以利用imagemagick的java接口,为灵活起见,避免由于java接口的不完备性及性能问题,使用Runtime.getRuntime().exec来直接调用imagemagick的命令行来完成。

依照此思路,编写了简单的测试代码,测试页面imgareaselect.html 用于演示img area select的使用。

ImagemagickTest.java是使用java 调用imagemagick接口调用实现图片操作的例子。

关于imagemagick其他功能使用的例子(例如打水印等)可以参考http://www.imagemagick.org/Usage/

   以上只是实现了初步的在线对背景图片制作的步骤,后续可以按照各个操作系统的主题制作技术,实现诸如symbian平台主题sis、windows mobile cab的制作。

3、imgareaselect.html

<html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>imgAreaSelect examples</title>
  <link rel="stylesheet" type="text/css" href="base.css">
  <link rel="stylesheet" type="text/css" href="imgareaselect.css">
 </head>

<script type="text/javascript" src="jquery-1.2.6.js"></script>
<script type="text/javascript" src="jquery.imgareaselect-0.5.js"></script>
<link rel="stylesheet" type="text/css" href="base.css">
  <!--[if IE 7]>
  <link rel="stylesheet" type="text/css" href="ie_7_hacks.css" />
  <![endif]-->
  <!--[if IE 6]>
  <link rel="stylesheet" type="text/css" href="ie_6_hacks.css" />
  <![endif]-->
<script type="text/javascript">
 function selectionEnd(img, selection)
 {
        //alert('width: ' + selection.width + '; height: ' + selection.height+'; x2:'+selection.x2);
 }

 function preview(img, selection)
 {
   var scaleX = 100 / selection.width;
   var scaleY = 100 / selection.height;
   $('#duck + div > img').css({
     width: Math.round(scaleX * 400) + 'px',
     height: Math.round(scaleY * 300) + 'px',
     marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
     marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
   });
 }
 $(document).ready(function () {
   $('<div><img src="duck.jpg" style="position: relative;" /></div>')
     .css({
       float: 'left',
       position: 'relative',
       overflow: 'hidden',
       width: '100px',
       height: '100px'
     })
     .insertAfter($('#duck'));
   $('#red').click(function () {
     $('#duck').imgAreaSelect({ selectionColor: 'red' });
   });
   $('#green').click(function () {
     $('#duck').imgAreaSelect({ selectionColor: 'green' });
   });
   $('#blue').click(function () {
     $('#duck').imgAreaSelect({ selectionColor: 'blue' });
   });
 });

/*
选择框初始化值大小设定,在社区实现时候选择框的初始化值由程序根据用户手机型号的分辨率来设定初始化值
通过设定最大值和最小值相等,来固定选择框的大小 

*/
 $(window).load(function () {

   $('#duck').imgAreaSelect({ x1: 120, y1: 90, x2: 280, y2: 210,maxHeight:120,maxWidth:160,minHeight:120,minWidth:160,resizable:false, onSelectChange:preview,onSelectEnd:selectionEnd });

 });
</script>

<body>
<p style="text-align: left;">
<button id="red" type="button" style="color: red;">Red</button>
<button id="green" type="button" style="color: green;">Green</button>
<button id="blue" type="button" style="color: blue;">Blue</button>
</p>
<p style="text-align: center;">
<img id="duck" src="duck.jpg" alt="测试" title="测试"  style="float: left; margin-right: 10px;">
</p>
</body>
</html> 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

4、ImagemagickTest

import org.apache.log4j.Logger;
import java.io.IOException;

public class ImagemagickTest {
    private static final Logger logger = Logger.getLogger(ImagemagickTest.class);
    private static final String CONVERT_PROG="C:/ImageMagick-6.3.9-Q16/convert.exe";

    /**
     * @param command Description of the Parameter
     * @return Description of the Return Value
     */
    private static boolean exec(String command) {
        Process proc;
        try {
            logger.debug("exec(String):Trying to execute command " + command);
            proc = Runtime.getRuntime().exec(command);
        } catch (IOException e) {
            System.out.println("IOException while trying to execute " + command);
            logger.fatal("exec(String):IOException while trying to execute " + command);
            return false;
        }

        if (logger.isDebugEnabled()) {
            logger.debug("exec(String):Got process object, waiting to return.");
        }

        int exitStatus;

        while (true) {
            try {
                exitStatus = proc.waitFor();
                break;
            } catch (java.lang.InterruptedException e) {
                logger.fatal("exec(String):Interrupted: Ignoring and waiting");
            }
        }
        if (exitStatus != 0) {
                logger.fatal("exec(String):Error executing command: " + exitStatus);
        }
        return (exitStatus == 0);
    }

    public static void main(String[] args) {
        String cmd=CONVERT_PROG;
        String parameter=" -crop 278x150+99+45 ";
        String inputFile=" D:/imagemagick/bee.jpg ";
        String outputFile=" D:/imagemagick/output1.jpg ";
        exec(cmd+parameter+inputFile+outputFile) ;
    }

}

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

在线制作手机桌面壁纸及铃声服务的一点启示

Posted in Uncategorized by chuanliang on 2008/09/07

    在做门户社区设计的时候,一个最大的挑战是服务的差异化,像图片、铃声这样的服务基本上每一个手机网站都有,要在这一点上要做到差异化很难,看到几个提供自助手机桌面及铃声的在线服务,或许能够给我们一些启示。

自助手机桌面及铃声的在线服务:

魔秀:http://www.moxiu.com/

吾主题:http://www.ownskin.com/

猪蹄网:http://www.zhuti.net.cn/

神空主题网:http://theme.kkek.net/

mobopic:http://mobopic.com/

    类似魔秀这样的手机主题制作网站的核心模式其实很简单:提供一个定制化的图片剪裁工具,用户可以通过选择手机型号来上传分享自己的图片,然后围绕此服务形成自己一个社区。从alexa排名运营情况来看,魔秀其实还是有一定的人气的。

   在技术层面,魔秀的定制化的实现并不难。

    另外还有一些在线的铃声制作的web2.0站点,可以参考:

http://mashable.com/2008/03/13/create-your-own-ringtone/

    像铃声及手机桌面壁纸这样的服务,其实算是一个典型的竞争红海市场,在图片及铃声服务上如果只是提供单纯的下载服务,那不会有太大的竞争力。

    对于门户社区而言,社区的建设不可能建立在空洞的服务上,必须依托一些有趣、使用的应用才能够在用户中引爆流行,我觉得通过类似这些服务可以做到与竞争对手一定程度的区隔(尽管这些服务并不能根本上决定门户社区的成败),另外可以通过众多这样的服务来整合与用户手机应用相关的各种服务,提高用户对门户社区的粘性。

Dreamhost Internal Server Error故障

Posted in Uncategorized by chuanliang on 2008/09/07

  9-5号访问寄存在dreamhost的www.yeeach.com主机时候,访问所有应用页面(blog、pligg、bbs、下载)都报Internal Server Error,查看服务器日志发现大量的如下错误:

[Thu Sep 04 00:41:53 2008] [error] [client 220.181.32.23] Premature end of script headers: php.cgi
[Thu Sep 04 00:41:53 2008] [error] [client 220.181.32.23] php.cgi: error while loading shared libraries: libsablot.so.0: cannot open shared object file: No such file or directory

    看来是apache出了问题,与dreamhost客服联系后,发现不是我自己的问题,近期dreamhsot对debian操作系统进行了升级,从32-bit升级到64-bit,导致原来的32-bit的php动态库不能够再使用。

   按照dreamhost提供的参考网页:

http://www.dreamhoststatus.com/2008/09/02/debian-upgrades-and-custom-php/

http://wiki.dreamhost.com/Installing_PHP5#Compiling_a_Customized_PHP_5

    看见繁琐的升级过程,头就大,也没有时间仔细去琢磨。突然想起来,前段时间遇到的upload_max_filesize时候曾经使用的shell脚本,修改Dreamhost虚拟主机的php.ini的upload_max_filesize参数限制 ,在服务器上执行了一下两个脚本,问题解决了。呵呵,看来多记笔记很有好处。

1、mkdir ~/yeeach.com/cgi-bin/

2、touch ~/php-copy.sh 

#!/bin/sh
CGIFILE="$HOME/yeeach.com/cgi-bin/php.cgi"
INIFILE="$HOME/yeeach.com/cgi-bin/php.ini"
rsync -a /dh/cgi-system/php5.cgi "$CGIFILE"
# REMOVE THE FOLLOWING LINE TO CREATE THE UPDATE-ONLY SCRIPT:
cp /etc/php5/cgi/php.ini "$INIFILE"

perl -p -i -e ‘
s/.*post_max_size.*/post_max_size = 100M/;
s/.*upload_max_filesize.*/upload_max_filesize = 100M/;
‘ "$INIFILE"

3、chmod +x php-copy.sh

4、./php-copy.sh

5、touch ~/yeeach.com/.htaccess

Options +ExecCGI
AddHandler php-cgi .php
Action php-cgi /cgi-bin/php.cgi

6、 php daily  update

cp php-copy.sh php-update.sh
#the php-update.sh content is :

#!/bin/sh

CGIFILE="$HOME/yeeach.com/cgi-bin/php.cgi"

INIFILE="$HOME/yeeach.com/cgi-bin/php.ini"

rsync -a /dh/cgi-system/php5.cgi "$CGIFILE"

perl -p -i -e ‘

s/.*post_max_size.*/post_max_size = 100M/;

s/.*upload_max_filesize.*/upload_max_filesize = 100M/;

‘ "$INIFILE"

7、crontab configure

crontab -e
#the crontab's content :
@weekly /home/myusername/php-update.sh

 

参考资料:

http://www.activecollab.com/forums/topic/1507/

http://wiki.dreamhost.com/index.php/PHP.ini .