存档

作者存档

Facebook SNS游戏排名

2009年12月19日

最近半年前5大游戏排名没有变化,但是一年前最流行的(Lil) Green Patch只有600万MAU,但现在,冠军FarmVille,则是有近6900万使用者。此外,数据显示,Facebook每月超过300万MAU的成长都來自Socail Gaming的贡献。

Top10中有过半的游戏都是由Zynga出品,占了6款,分別是FarmVilleCafe’ WorldMafia WarsFishVilleTexas HoldEm PokerYoVille

11月被EA收购的PlayFish在Top 10只占了两款,分別是Pet SocietyRestaurant city,而且Restaurant city竟然是呈负增长的状态,流失近70万的玩家。

inetdemon 电子商务

易趣10周年聚会

2009年9月19日

9月11日参加了海伦宾馆的易趣10周年聚会,虽然比不上阿里10周年纪念的规模,但也有不少人参加了,看到了一些很久没有见到的老同事,还是挺激动的。为了节约笔墨,上点图。

IMG_8821易趣内部解决的同志们2.JPG聚会大合影2市场和Bo的10年纪念合影.JPG技术朱继盛.JPG

inetdemon 互联网圈

购买办公座椅的经历

2009年8月29日

电脑工作者通常都有职业病,如颈椎痛,脊椎痛等,年轻时生龙活虎的不觉得,5,6年后方才开始慢慢有所体会。我有一次去检查脊椎,医生说脊椎和颈椎已经钙化,骨龄比我实际年龄要老十几岁。想想在按摩方面的花费这几年来也不止几千,如果一把椅子能够端正坐姿,使得腰背更健康,那比打针吃药按摩还 治不好要来得划算得多。

至于是否应该买一把5,6千元乃至上万的椅子,我觉得台湾的一个网友说得好,请看:

我覺得有幾個指標,可以促使大家決定『是否要買一張這麼貴的椅子』:

  1. 每個月花在按摩整脊的費用超過2000元。
  2. 每天坐在爛椅子上超過8小時
  3. 屁股大腿常常悶熱無比
  4. 常常靠說脖子酸、手酸、肩膀酸、腰酸
  5. 貼立康、虎標、肌樂是你的好友

所以把我用过的和了解的一些办公座椅及其品牌介绍一下

震旦AURORA

在钢质椅子方面较强。最早的时候买过一些震旦的办公桌,没有买过震旦的椅子。

美时Lamex

公司新开的时候买了些二手的美时椅子,还算是耐坐。香港的牌子,质量还算不错,耐坐。和震旦一样算是很不错的选择。2006年被全球办公家具三强之一的HNI集团收购。而另外一个和美时超不多的香港品牌欧美/Ultra也在2007年被最大的办公家具公司Steelcase收购。

海沃氏Harworth

这家也应该算是全球帮工家具的前三强,他们家的家具看上去就是很耐用的感觉。中国区的总部就设在上海的新天地,在浦东有工厂。

Steelcase

因为以前公司用的都是Steelcase的Let’s B系列,所以印象很好,属于价廉物美了。这次到在Steelcase工作的朋友那里,听说淘宝一口气定了3000把。

Lets-BLets B2Lets B 4Lets B 3

Steelcase的Think系列也是获得多项设计大奖的经典款,很多公司在会议室中使用,也有不少公司作办公椅用。

steelcase Thinksteelcase think

think 3steelcase think in google office

这张照片显示google的office里用的也是steelcase think系列。

赫尔曼.米勒Herman Miller

Herman Miller的Aeron系列是该公司最畅销的椅子之一,由于其经典的人体工学设计,该椅子由Bill Stumpf设计,被收录为纽约现代艺术博物馆永久陈列品。

aeron chair6aeron chair12aeron chair14aeron chair0aeron chair7aeron chair

有些网友甚至拍摄了 Aeron Chair开箱全过程

Aeron之经典实在难以超越,因此Herman Miller在去年才推出了其最新款Embody,当然售价也相当的令人乍舌,基本款为12000元左右,而高配的款式则要18000元一把,淘宝上随便搜索下就知道了。当然无论从价位还是设计来看,似乎都不是很适合普通办公用途。

herman miller embody

岗村制作所

意大利设计师所设计的Contessa

contessa4contessa

inetdemon 家居生活

ZF1.8 DB字符集设定

2009年8月11日

Zend Framework的db 字符集设置,由于ZF的一个bug,以前在设置db的字符集为utf-8时,通常是在bootstrap中设定

 $db = Zend_Db::factory($this->_config->db);
 $db->query("SET NAMES utf8");  //setup encoding

这种做法的一个缺点就是DB的lazy loading机制变得无效,所有不调用数据库的页面也需要去打开一个数据库链接。困难之处在于每种数据库的charset名称并不相同,之前一直有一个提议,将charset做一个db的option来设置,ZF1.7开始将这个建议实施,现在我们可以用如下方法,设置db的option

 <?php
$db = new Zend_Db_Adapter_Pdo_Mysql(array(
'host'     => 'your_host_or_ip',
'username' => 'your_myslq_username0,
'password' => 'mysql_pass',
'dbname'   => 'your_db_name',
'driver_options'  => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'utf8\'')
));?>

除此之外,还可以在config中设置,不过由于config文件并不认得常量,因此只能用以下方式来设置:
db.params.driver_options.1002 = “SET NAMES utf8″
其中1002即PDO::MYSQL_ATTR_INIT_COMMAND这个常量的值。

如果想直接修改DB的charset collocation可以参考mysql的charset转化指南

感谢 julian的提醒,自从ZF1.8开始已经可以使用db.param.charset=”UTF-8″来设定; 如果使用的是Zend_Application,可以设定resource.db.params.charset=”UTF-8″.

inetdemon 程序开发

美国Steelcase公司介绍

2009年8月7日

Steelcase在1912年成立于美国密歇根州大瀑布城(Grand Rapids,Michigan),名为The Metal Office Furniture Company。1914年,获得首个专利——金属纸篓,成功解决了传统草编纸篓易燃的弊端,是当时一项重要发明品;随后,又研发了金属办公桌。沿着这条创新之路,Steelcase不断开发产品与服务。今天,Steelcase的产品仍贯彻办公环境的三个核心元素:室内结构、办公家具与精湛技术。1954年,企业更名为Steelcase,并于1988年上市。

公司大事记

1912-在美国密歇根州大瀑布市创立了Metal Office Furniture Company,公司专门生产文件柜和保险箱。

1915-销售首张防火钢板办公桌。

1937-Metal Office公司采用Frank Lloyd Wright的设计,生产椭圆形办公桌,这些办公桌用于美国庄臣公司办公大楼――财富杂志将其称为“20世纪最富想象力的办公大楼”。

1954-公司名称更改为Steelcase。

1968-引进Mobiles®专利产品,这是第一种使用系统家具概念的产品。

1972-开始采用木材制造办公家具。

1973-与Kurogane有限公司在日本大阪组建了一家合资企业,公司占有25%的股份。

1974-与Strafor S.A.公司在法国特拉斯堡组建了一家座椅合资生产企业,公司占有50%的股份。

1980-收购西德多特蒙德市Pohlschroder GmbH & Company KG公司50%的股份。

1981-收购Strafor S.A.公司及子公司50%股份,包括法国的5家制造和组装厂以及非洲的4家制造厂。

1987-组建Steelcase设计合作伙伴,这是由多家高端设计、领导市场的家具公司组成。

1989-Steelcase开设了企业开发中心作产品研发,企业开发中心的成立让Steelcase公司成为家具行业中拥有最大的研究专家。

1990-在美国设立Steelcase设计合作伙伴公司Details。

1992-Steelcase推出了可供信息管理的全球储存柜系列。

1993-与泰国领导的办公家具生产商Modern form Group Company Ltd.签订许可协议。

1995-Steelcase Inc.宣布与Godrej & Boyce签订许可协议,成为首家踏足印度市场的大型家具生产商。

1996-Steelcase宣布向美国加利福尼亚州Palo Alto市最大的一家独立生产和开发公司IDEO进行产权投资。

Steelcase位于德国Rosenheim及法国Sarrebourg的制造厂荣获ISO14001认证。

1997-Steelcase-Werndl位于德国Rosenheim制造厂荣获EMAS认证(环境管理及审查计划)。

Steelcase收购德国Durlangen的Waiko Büromöbel GmbH公司。

1998-Steelcase推出欧洲最畅销的办公桌组合TNT。

Steelcase在纽约证券交易所上市。

Steelcase推出欧洲最受欢迎的办公椅Please。

1999-Steelcase收购Strafor Facom S.A.公司的其余股份。

Steelcase推出高效能产品Leap®座椅。

2000-Steelcase GmbH成为控股公司,Pohlschröder GmbH成为集团公司之一。

Orgatec展览中展示了Werndl’s成为Steelcase集团一份子后首次推出的产品。

2001-Werndl Büromöbel AG正式改名为Steelcase Werndl AG。

Steelcase成为财富500强公司之一(美国500大公司)。

Steelcase在密歇根州的全新制木家具工厂,成为全球首家荣获LEED (Leadership in Energy and Environmental Design)认证的工厂。

Steelcase与在东南亚占领导地位的马来西亚Artwright Holdings Berhad公司签订制造厂协议。

Steelcase收购PolyVision公司,专门制造视觉沟通工具。

2002-IBM和Steelcase宣布开展一项名为BlueSpace的全球性计划,对未来办公室进行设计。创造出将建筑、家具与先进科技结合在一起的创新工作环境。

“最受赞赏的公司”是《财富》杂志在全国对企业按其具有的社会责任感进行的排名,其中Steelcase列第六。

2003-Steelcase引入灵感办公室的概念,提供了以科学为基础的顾问过程,企业可引导员工发挥所长,以及改善公司整体效率。

Steelcase在Best of NeoCon评选中,赢得6项金奖、3项银奖。

Steelcase密歇根工厂在进行金属表面处理时,成功消除几乎全部有机挥发物(VOCs)的排放,这是公司另一环保里程碑。

Steelcase宣布与Johnson Controls公司成为合作伙伴,共同研发把Leap® 技术用于汽车座椅上。

2004-Steelcase推出Think座椅—这是种明智、简单及环保的座椅产品,满足客户对中等价位座椅的需求,更符合人体工学原理。此产品在芝加哥的年度展会上赢得最佳NeoCon项奖。

在德国科伦举办的全球最大办公室展览Orgatec上,Steelcase推出最新产品- Think座椅以及全新办公建筑系统Forward。

2005-Steelcase在英国Design Prima展览中展示Forward产品。

2006-Steelcase加入U.S. Environmental Protection Agency的Climate Leaders计划,这是一项工业部门与政府的合作计划,旨在开发综合性的长期应对气候变化。参加计划后,Steelcase承诺将减少温室气体排放。

Steelcase International在法国斯特拉斯堡附近,设立了新的全球总部WorkL@b,其引入激发创意的设计,既配合Steelcase的国际文化,也提高雇员的工作经验。

Steelcase的工业城(City of Industry Plant)是公司首家获得Shingo奖的生产设备,该奖项是北美地区生产企业的最高奖项,用于表彰企业追求卓越的精神。

2007-Steelcase宣布超过20条生产线获得Scientific Certification (SCS)颁发的Indoor Advantage™认证,以改善室内空气质素。

inetdemon 家居生活

美时办公家具有限公司

2009年8月5日

美时Lamex自1977年成立以来已发展成为中国最大的家具生产商,代理世界各地著名品牌如Frezza, Forma, Sedus, Dauphin, Girsberger等。另外,美时亦致力设计,研发及生产美时的家具,提供过千种产品。美时现时拥有超过50多家特许经营商及分行遍布中国、香港、澳门 及台湾。

美时已发展为首屈一指的家具生产商。生产厂房位于东莞,面积超过十万平方米,为国内最大型的生产厂房。主要生产线分为四种,包括屏风家具系列,办公桌, 文件储存系统及办公室座椅。LAMEX厂房为一所综合大楼,集生产厂房,品质测试中心,设计及发展,货仓,行政中心,培训中心及陈列室等,使公 司运作更有效率。

公司大事记:

1977-美时公司成立

1978-首家香港办公室家具公司提供5年产品保用

1989-首家香港办公室家具引入本地屏风系统生产线

1990-开始进入中国市场

1991-首家香港办公室家具公司提供电脑绘图和电脑生产线

1992-所有座椅产品采用不助燃海绵

1996-自行研发革命性的支柱式屏风系统 – 338屏风系统

1997-首家办公室家具公司在国内引入特许经营方式

美时创办人林正华先生获颁香港青年工业家奖

1998-338屏风系统于广州国际家具展获得金奖

1999-美时获得国际ISO9002品质认证

2001-美时投资二百五十万美元引入CNC Combima先进生产技术

美时为APEC会议的指定会议家具供应商

2002-美时荣获香港十大名牌

2003-美时荣获广东十大名牌,ISO9001及IQ Net

2004-美时荣获ISO14025 III 型环境认证。

美时获香港社会服务联会颁发“商界展关怀”。

2005-美时再度荣获“香港名牌”的奖项以及“商界展关怀”的嘉许状。

美时的销售员荣获“杰出推销员奖”。

inetdemon 家居生活

Zend Framework 1.8 中的Model

2009年8月1日

在ZF1.8以后Module的问题得以完善,但是仍然有很多领域需要改进,Model就是其中一个

Model的类型用DbTable<->Mapper<->Model的DataMapper Pattern (同时参照IdentityMapUnitOfWork)来调用,其中对象Model用于导入对象,导入后就由UOW拥有的Identity对象来跟踪,以此来保持数据的同步。比如一个Users表,我们有如下类:

Model_User是业务域模型(domain Model),关于domain design的模式可以参见domain driven design一书

Model_UserMapper来完成Model对象和数据库的映射关系

Model_DbTable_Users extends Zend_Db_Table_Abstract类负责数据库方面的设定

以上pattern的使用在这篇帖子Zend 的proposal中有讨论到。这个Pattern的好处是,如果你将来不用数据库来保存数据,而换用文件或者Memcached,那么你就不用修改你的Controller了;从来引来的一个缺点是几乎每个调用都需要来定义Mapper,从而导致复杂度提高。通常情况下对于不是比较复杂的情况,1:1的应用来说,Table Gatewy, Row, Rowset的Pattern已经足够使用。

关于DataMapper的Model使用模型还在更新过程中,同时还有个datashuffler在ZF上的实现目前也在研究中。

inetdemon 程序开发

ZF1.8 快速上手

2009年7月30日

ZF有段时间没有弄了,自从ZF1.8出来之后改动比较大,把一些东西整理一下,温故而知新。

首先是下载ZendFramework,由于ZF的版本更新很快,一些小版本基本是2周出一次下载最新的ZF,下载后将ZF放到系统类库目录,我们假设是/usr/local/lib/,

其次,将ZF添加到系统目录中去,可以修改php.ini(如果不确定php.ini所在目录,可以通过phpinfo查看),在include_path中增加如下目录:include_path=”.:/path/to/zf:/usr/share/php:/usr/share/pear”,对于以ZF为主的系统,将ZF包含目录放在最前面有助提高效率,详细请看这篇文章。在进行下一步之前,我们需要先确定目录构造,请参见ZF所推荐的Zend Framework的目录结构

开始工作,首先index.php比较简单:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
 || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
 || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
 realpath(APPLICATION_PATH . '/../library'),
 get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
 APPLICATION_ENV,
 APPLICATION_PATH . '/configs/config.ini'
);

$application->bootstrap()
 ->run();

接下来是bootstrap.php我最开始写ZF的时候最麻烦的部分就是bootstrap,花了不少时间调试。Bootstrap,顾名思义就是系鞋带,指出发之前做的准备工作。自从Zend Framework 1.8以后,ZF出了Zend_tool和Zend_Application,因此Bootstrap有了比较大的调整,基本来讲,只需要在index.php中调用Zend_Application,就可以直接免去过去设定config文件,DB,view等。如果需要对这些做特别设置,可以在Bootstrap中扩展Zend_Application_Bootstrap_Bootstrap,用_init*资源函数来设定,BootStrap将依顺序逐个调用这些_init*资源函数,然后执行dispatch。用这里有篇是介绍如何将老的Bootstrap迁移到ZF1.8上。需要注意的有几点,

1.  在initView的时候尽量不要标注Response属性,这样这个Bootstrap不会在layout之前实例化Response;

2.  可以判断ajax的request头,用以去除layout, ViewRender,errorHandler和Exception的输出,这样就免除在ajax页面里面单独进行设定了。

3. ZF1.8之后可以通过设定driver option的方式对ZF的DB charset进行lazy load方式的设定了。

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
 protected $_config;
 protected $_cache;
 protected $_requesttype;

 public function run() {
 $frontController = Zend_Controller_Front::getInstance();
 $frontController->dispatch();
 }

 protected function _initAutoload(){
 $autoloader = new Zend_Application_Module_Autoloader(array(
 'namespace' => '',
 'basePath'  => APPLICATION_PATH,
 ));
 return $autoloader;
 }

 protected function _initConfig(){
 // config
 $this->_config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/config.ini', APPLICATION_ENV);
 Zend_Registry::set('config', $this->_config);
 Zend_Registry::set('env', APPLICATION_ENV);

 //Load Application Level configure
 $appconf = new Zend_Config_Ini(APPLICATION_PATH . '/configs/app.conf', APPLICATION_ENV);
 Zend_Registry::set('appconf', $appconf);

 if (1 == (int)$this->_config->debug->showpageinfo){
 Zend_Registry::set('PageStartTime', microtime(true));
 }
 }

 protected function _initDB(){
 if($this->_config->db) {
 $db = Zend_Db::factory($this->_config->db);
 if($this->_config->cache->tablemeta && isset($this->_cache)) //setup Metacache to speed up
 Zend_Db_Table::setDefaultMetadataCache($this->_cache);
 Zend_Db_Table_Abstract::setDefaultAdapter($db);
 Zend_Registry::set('db', $db);
 }
 }

 protected function _initView(){
 // view and layout setup
 $view = new Zend_View(array('encoding'=>'UTF-8'));
 $view->addHelperPath(APPLICATION_PATH.'/default/views/helpers/');
 //$viewRendered = new Zend_Controller_Action_Helper_ViewRenderer($view);
 //Zend_Controller_Action_HelperBroker::addHelper($viewRendered);

 Zend_Dojo::enableView($view);
 $view->dojo()->setDjConfigOption('parseOnLoad', true)
 ->requireModule('dijit.form.FilteringSelect')
 ->requireModule('custom.PairedStore');
 //$view->addBasePath(realpath('./templates/default/'));

 //if ajax submit
 if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
 $this->_requesttype="ajax";
 }else{
 $this->_requesttype="html";
 Zend_Layout::startMvc(array(
 'layoutPath'=>APPLICATION_PATH . '/layouts',
 'layout'=>'layout'
 ));
 }
 $view->doctype('XHTML1_STRICT');
 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer')->setView($view);
 }

 protected function _initFrontController(){
 $frontController = Zend_Controller_Front::getInstance();
 $frontController->setControllerDirectory(APPLICATION_PATH .'/controllers');
 $frontController->setParam('env', APPLICATION_ENV);
 if ("ajax" == $this->_requesttype){
 // Disable the ErrorHandler plugin
 $frontController->setParam('noErrorHandler', true);
 // Disable the ViewRenderer helper
 $frontController->setParam('noViewRenderer', true);
 }
 $frontController->throwExceptions(false);
 $frontController->setBaseUrl('/');
 // action helpers
 Zend_Controller_Action_HelperBroker::addPath(APPLICATION_PATH .'/controllers/helpers');
 }

 protected function _initSession(){
 if (isset($this->_config->session)){
 $session = $this->_config->session;
 if (empty($session->save_path))
 $session->save_path = APPLICATION_PATH. "/../data/sessions/";
 }
 Zend_Session::setOptions($this->_config->session->toarray());
 }

 protected function _initCache(){
 /**
 * Setup Core Cache
 */
 if ('true' == $this->_config->cache->caching){
 $CacheFrontendOptions = array(
 'lifeTime' => $this->_config->cache->lifetime,  // cache lifetime of half a minute
 'caching' => $this->_config->cache->caching,
 'automatic_serialization' => $this->_config->cache->automatic_serialization,  // this is default anyway
 'automatic_cleaning_factor'=>$this->_config->cache->automatic_cleaning_factor,
 'logging' => $this->_config->cache->logging,
 );
 switch($this->_config->cache->backend){
 case 'memcached':
 $MemcachedBackendOptions = array(
 'servers'=>array(array(
 'host' => $this->_config->cache->memcached->host,
 'port' => $this->_config->cache->memcached->port,
 'persistent' => $this->_config->cache->memcached->persistent
 )));
 $this->_cache = Zend_Cache::factory('Core', 'Memcached', $CacheFrontendOptions, $MemcachedBackendOptions);
 break;
 case 'file':
 default:
 $FileBackendOptions = array(
 'cache_dir' => APPLICATION_PATH.'/../data/cache/',
 'read_control'=>true,
 'read_control_type'=>'md5',
 'hashed_directory_level'=>'1'
 );
 $this->_cache = Zend_Cache::factory('Core', 'File', $CacheFrontendOptions, $FileBackendOptions);
 break;
 }//End of switch
 Zend_Registry::set('cache', $this->_cache);
 }
 /**
 * Setup Page cache
 */
 if($this->_config->cache->page->caching){
 $pageCacheRegexpsConfig = array(
 'cache_with_get_variables'=>true,
 'cache_with_post_variables'=>true,
 'cache_with_session_variables'=>true,
 'cache_with_files_variables'=>true,
 'cache_with_cookie_variables'=>true,);
 $pageCacheFrontendOptions = array(
 'lifetime' => $this->_config->cache->lifetime,
 'debug_header' => $this->_config->cache->page->debug, // for debugging
 'regexps' => array(
 // cache the whole IndexController
 '^(.+)-lc-(.*).html' => array_merge($pageCacheRegexpsConfig,array('tags'=>array('lc'))),
 )
 );

 if (empty($FileBackendOptions)){
 $FileBackendOptions = array(
 'cache_dir' => APPLICATION_PATH.'/../data/cache/',
 'read_control'=>true,
 'read_control_type'=>'md5',
 'hashed_directory_level'=>'1'
 );
 }

 // getting a Zend_Cache_Frontend_Page object
 $page_cache = Zend_Cache::factory('Page',
 'File',
 $pageCacheFrontendOptions,
 $FileBackendOptions);
 $page_cache->start();
 }
 }

 protected function _initTranslation(){
 //Setup Locale
 Zend_Locale::setDefault('en');   //fallback locale
 $locale = new Zend_Locale('auto'); //auto detection for user locale
 if (isset($this->_cache)) Zend_Locale::setCache($this->_cache); //cache locale to speed up
 Zend_Registry::set('Zend_Locale', $locale); //set up application-wide locale
 //Setup Zend Translate

 //$this->_cache = Zend_Cache::factory('Page','File',$frontendOptions,$backendOptions);
 //Zend_Translate::setCache($this->_cache);
 $translate = new Zend_Translate('gettext','../data/locales/',NULL,array(
 'scan' =>Zend_Translate::LOCALE_DIRECTORY,
 'disableNotices' => true
 ));
 Zend_Registry::set('Zend_Translate', $translate);
 //Zend_Validate_Abstract::setDefaultTranslator($translate);
 Zend_Form::setDefaultTranslator($translate);
 }

 protected function _initRoutes(){
 //$router = new Zend_Controller_Router_Rewrite();
 //$router->addConfig($appconf, 'routes');
 }
}

inetdemon 程序开发

thinkvantage中没创建恢复介质(Create Recovery Media)的解决方法

2009年5月8日

享受了一个多月碧波帮我带回来的新的ibmT500(2242CTO)到手,感觉速度真是比台式机还快。不过这两天发现两个问题,足见ibm易主lenovo后服务是越来越差。其一是一项以商务服务著称的thinkpad从4月开始停止了自动system update服务,用户更新驱动程序需要手动到联想网站上查询后下载。联想的thinkpad笔记本论坛里面是议论纷纷
另外一件不太方便的事情是我的think vantage中没有创建系统恢复盘的功能,于是查了下美国的lenovo论坛中有篇说明是由于选择的Vista downgradable to XP造成的, 无奈只能按坛子里面的指示直接调用”C:\Program Files\Common Files\Lenovo\spi\RRMedia.exe”, 看来lenovo的走向也越来越不是面向商业用户,而是走向低端化了。另外创建恢复盘的话,XP是1CD+1DVD or 7CD, vista是1CD+2DVD, 必须要CD的。

配置如下:

Core2 Duo T9400 2.5Hz(6M L2)/2G DDR3/160G SATA2 7200/LED backlight/集成显卡ATI X4500HD/Vista downgradable to XP Professional/Displayport

inetdemon 软件和工具

XSS攻击防范

2009年4月22日

最近一个朋友找我帮忙修复一个XSS注入漏洞,其实网站也是某上市互联网公司的中国站。现在XSS和CSRF攻击成为一个WEB软件工作者不得不重视的一个问题,很有必要深入研究下。

XSS漏洞很容易在大型网站中发现,在黑客圈内它非常流行。最著名的是2005年黑客Sammy Kamkar在myspace网站发布蠕虫病毒后,XSS就开始大行其道。FBI.gov、CNN.com、Time.com、Ebay、 Yahoo、Apple、Microsoft、Zdnet、Wired、Newsbytes,twitter都有这样那样的XSS漏洞。国内出现过XSS漏洞的网站有sohu,网易邮箱,校内网等,百度和著名电商网站淘宝也曾出现过XSS漏洞。

在商业产品中,平均每个月能够发现10-25个XSS漏洞。

假设你已经了解XSS的基本概念和类型,这里看看如何进行防范。先总结一下常见的XSS攻击手法:

依赖跨站漏洞,需要在被攻击网站的页面种入XSS脚本的手法

Cookie 盗取,通过javascript 获取被攻击网站种下的cookie,并发送给攻击者。
1.从cookie 中提取密码等隐私
2. 利用cookie 伪造session,发起重放攻击
Ajex 信息盗取,通过javascript 发起ajex 请求。
1. 从ajex 结果中获取隐私。
2. 模拟用户完成多页表单。

不依赖跨站漏洞的XSS攻击手法

1. 单向HTTP 动作,通过img.src 等方法发起跨站访问,冒充被攻击者执行特权操作。但是很难拿到服务器的返回值。
2. 双向HTTP 动作,如果服务器产生一段动态的script,那么可以用script.src 的方法发起跨站访问并拿到服务器的返回值。

XSS防范方法

XSS攻击防范主要是有程序漏洞造成的,要完全防止XSS安全漏洞主要依靠程序员较高的编程能力和安全意识,当然一些编程安全原则可以帮助大大减少XSS安全漏洞:

  1. 不信任用户提交的任何内容,对所有用户提交内容进行可靠的输入验证,包括对URL、查询关键字、HTTP头、REFER、POST数据等,仅接受指定长度范围内、采用适当格式、采用所预期的字符的内容提交,对其他的一律过滤。尽量采用POST 而非GET 提交表单;对”<”,”>”,”;”,”’”等字符做过滤;任何内容输出到页面之前都必须加以encode,避免不小心把html tag 弄出来。
  2. 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行,对于用户提交信息的中的img 等link,检查是否有重定向回本站、不是真的图片等可疑操作。
  3. Cookie 防盗。避免直接在cookie 中泄露用户隐私,例如email、密码等等;通过使cookie 和系统ip 绑定来降低cookie 泄露后的危险。这样攻击者得到的cookie 没有实际价值,不可能拿来重放。
  4. 确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。

PHP方面请参见PHP的安全防范工作

ASP.Net的可以用VS自带的XSSDetect来检测。

要更好的防范XSS和CSRF攻击等,除了加强程序开发的严谨度之外,还需要重视测试工作,通过专业的测试来减少问题发生的可能性,我们看到淘宝QA也重视XSS攻击测试了。

inetdemon 程序开发

页: 1 2 3 4 5 6 7 8 ...11 12 13 后一页