2011 年 11 月

浏览模式: 标准 | 列表 | 图文
文抄公

文抄公

文抄公是一种鄙视,事实上有很多时间我们都在做着文抄公的事情。嗯,我也是一个文抄公。仅此而已
抄是一种美德,抄是一种文化,天下文章都是一大抄,无非就是你抄我我抄你的,几年前的黄夏留老师也说过,当全班同学都在抄的时候,只有一个同学没抄,他的名字叫杨伟。
好吧,这仅仅是一个笑话。
互联网上的东西,确实抄来抄去的比较多,但怎么着也得给对方留一下链接,代表了文章的来源。你摘抄了没错,但也不能否认别人的辛苦劳动。如果大家都只抄内容不抄链接,这终将是一个恶性循环。
事实上,很多人在抄的同时,都放弃了原作者原内容的样式、风格,甚至连内容都有放弃,这个时候你让别人在看到你的文章时怎么想?
给别人留条后路,也给自己留条路。

jquery mobile 1.0终于发布了

jquery mobile 1.0终于发布了

其实这很正常,也不意外,这么久了。。。也该正式版了
不过,jQueryMobile里我想找那个DoubleTap事件也没有好好找到。可能是我没有仔细关注吧?
然后一些clientX移动的事件,也不是特别的爽。。。
OK,去官网看看吧,http://jquerymobile.com
官方说这次正式版的性能提高了很多,在这里有一张图片:http://jquerymobile.com/blog/2011/11/16/announcing-jquery-mobile-1-0/
demo其实也能看,不过要好效果的话,还是建议使用webkit核心的浏览器:Demos & Documentation

vsftp + mysql的架设文档

vsftp + mysql的架设文档

上次介绍的vsftpd的配置是官方文档,这次是COPY来的,相对也是比较方便的,而且改动也很少。
只是需要libpam-mysql,mysql-dev等包。如果是基于ubuntu,那就实在是方便多了。都可以apt回来。。
OK,还是来原文吧,内容有点长,慢慢看就OK了:http://www.extmail.org/forum/thread-5427-1-1.html

VSFTP+MySQL虚拟用户配置

参考
[url]http://www.mysql-china.com/bbs/archiver/?tid-114.html[/url]
[url]http://blog.chinaunix.net/u1/39544/showart_310591.html[/url]
VSFTPD是一种在UNIX/Linux中非常安全且快速的FTP服务器,目前已经被许多大型站点所采用。VSFTPD支持将用户名和口令保存在数据库文件或数据库服务器中。VSFTPD称这种形式的用户为虚拟用户。相对于FTP的本地(系统)用户来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。
环境:
操作系统: centos 4
流程图: user --> vsftpd-2.0.1 --> pam_mysql-0.71 --> mysql-server-4.1

1,初始化centos升级服务器.
# vi /etc/yum.repos.d/CentOS-Base.repo
=============== 代码 { ================================================
[base]
name=CentOS-4 - Base
baseurl=http://mirror.be10.com/centos/4/os/i386/
gpgcheck=1

#released updates
[update]
name=CentOS-4 - Updates
baseurl=http://mirror.be10.com/centos/4/updates/i386/
gpgcheck=1

#packages used/produced in the build but not released
[addons]
name=CentOS-4 - Addons
baseurl=http://mirror.be10.com/centos/4/addons/i386/
gpgcheck=1

#additional packages that may be useful
[extras]
name=CentOS-4 - Extras
baseurl=http://mirror.be10.com/centos/4/extras/i386/
gpgcheck=1

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-4 - Plus
baseurl=http://mirror.be10.com/centos/4/centosplus/i386/
gpgcheck=1
enabled=0

#contrib - packages by Centos Users
[contrib]
name=CentOS-4 - Contrib
baseurl=http://mirror.be10.com/centos/4/contrib/i386/
gpgcheck=1
enabled=0

#packages in testing
[testing]
name=CentOS-4 - Testing
baseurl=http://mirror.be10.com/centos/4/testing/i386/
gpgcheck=1
enabled=0
=============== 代码 } =================================================

# rpm -import [url]http://mirror.be10.com/centos/RPM-GPG-KEY-CentOS-4[/url]

2.安装所要软件包:
# yum -y install mysql-server*
# yum -y install vsftpd
# yum -y install vim*

3.建立系统用户,用户ftp登录时访问目录权限.但用户不允许登录.
# useradd vsftpdguest
# vi /etc/passwd
============= 代码 { =====================================
vsftpdguest:x:501:501::/home/vsftpdguest:/bin/nologin
============= 代码 } =====================================

4.将虚拟用户保存在MySQL数据库服务器中
建立数据库vsftpdvu,表users,字段name和passwd用于保存虚拟用户的用户名和口令,增加两个虚拟用户q和ftp1。
# service mysqld start
# mysql
mysql> create database vsftpdvu;
mysql> use vsftpdvu;
mysql> create table users(name char(16) binary,passwd char(16) binary);
mysql> insert into users (name,passwd) values ('q','q');
mysql> insert into users (name,passwd) values ('ftp1','success8');
mysql> quit

授权vsftpdguest可以读vsftpdvu数据库的users表。执行以下命令:
# mysql -u root mysql -p
mysql> grant select on vsftpdvu.users to vsftpdguest@localhost identified by 'i52serial0';
mysql> quit;

验证刚才的操作是否成功可以执行下面命令:
# mysql -u vsftpdguest -pi52serial0 vsftpdvu
mysql> select * from users;

5.设置MySQL的PAM验证(pam_mysql.so)
利用mysql进行pam验证的开源项目([url]http://sourceforge.net/projects/[/url]),主要目的是生成 pam_mysql.so文件
# tar xvzf pam_mysql-0.5.tar.gz
# cd pam_mysql
# make
# make install
make install这一步可能会出现错误,那只好手动将该目录下生成的pam_mysql.so复制到/lib/security目录下。

设置vsftpd的PAM验证文件。打开/etc/pam.d/vsftpd文件,修改内容:
# vi /etc/pam.d/vsftpd
======================== 代码 { ======================================
#%PAM-1.0
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
#auth required pam_stack.so service=system-auth
#auth required pam_shells.so
#account required pam_stack.so service=system-auth
#session required pam_stack.so service=system-auth
auth required pam_mysql.so user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=0
account required pam_mysql.so user=vsftpdguest passwd=i52serial0 host=localhost db=vsftpdvu table=users usercolumn=name passwdcolumn=passwd crypt=0
======================== 代码 { ======================================  
上面涉及到的参数,只要对应前面数据库的设置就可以明白它们的含义。这里需要说明的是crypt参数。crypt表示口令字段中口令的加密方式:crypt=0,口令以明文方式(不加密)保存在数据库中;crypt=1,口令使用UNIX系统的DES加密方式加密后保存在数据库中;crypt=2,口令经过MySQL的password()函数加密后保存,但是使用了crypt=2时会出错,可能是pam_mysql.so文件问题.

6.设置vsftpd 登录模式:
# vi /etc/vsftpd/vsftpd.conf
======================= 代码 { ==============================
local_enable=yes <--本地用户登录权限,要开启
pam_service_name=vsftpd <--验证文件/etc/pam.d/目录下
anonymous_enable=NO <--取消匿名登录
guest_enable=YES <--除了匿名用户外的所有用户都是guest
guest_username=vsftpdguest <--初了匿名用户外的所有用户使用vsftpdguest
======================= 代码 } ==============================
7.重启mysql、vsftpd数据库,进行测试:
# service mysqld restart
# service vsftpd restart

8.进一步的虚拟用户设置
首先,介绍虚拟用户的权限设置。
   新添了virtual_use_local_privs参数,当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。
 当virtual_use_local_privs=YES时,只需设置write_enable=YES,虚拟用户就可以就拥有写权限。
当virtual_use_local_privs=NO时,对虚拟用户权限的设置就更多一些更严格一些。
控制虚拟用户浏览目录:如果让用户不能浏览目录,但仍可以对文件操作,那么需要执行以下二个步骤:
第一步骤:配置文件中:
anon_world_readable_only=YES
允许虚拟用户上传文件: write_enable=YES
anon_upload_enable=YES
允许虚拟用户修改文件名和删除文件: anon_other_write_enable=YES
第二步骤:虚拟用户目录的权限改为只能由vsftpdguest操作:
# chown vsftpdguest.vsftpdguest /home/vsftpdguest
# chmod 700 /home/vsftpdguest
由于以上选项的设置同样会对匿名用户生效。如果不想匿名用户趁机拥有同样的权限,最好是禁止匿名用户登录。

  其次,由于虚拟用户在系统中是vsftpdguest身份,所以可以访问到系统的其他目录。为了更加安全,我们可以将虚拟用户限制在自家目录下。有两种做法:
   第一种做法:在配置文件中修改
chroot_local_user=YES。
第二种做法:在配置文件中增加以下选项
 chroot_local_user=NO
 chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
然后,在/etc/vsftpd.chroot_list文件中加入虚拟用户名q和ftp1。
经过修改后,虚拟用户登录后其根目录就限制在/home/vsftpdguest下,无法访问其他目录。

9.虚拟用户个人目录(没有测试)
登录后所在的目录都是/home/vsftpdguest,即都是guest_username用户的自家目录。为每个虚拟用户建立自家目录。
首先,在主配置文件中加入以下选项:
# vi /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vsftpd_user_conf
然后,生成/etc/vsftpd/vsftpd_user_conf目录,并在该目录下建立与特定虚拟用户同名的文件:
# mkdir /etc/vsftpd/vsftpd_user_conf
# cd /etc/vsftpd/vsftpd_user_conf
# touch q
以上操作为虚拟用户q建立了个人配置文件/etc/vsftpd/vsftpd_user_conf/q.
接下来,在q的个人配置文件中将 q虚拟用户的自家目录修改为/home/q,配置选项为:
local_root=/home/q
最后,新建q目录,并将权限设为vsftpdguest:
# mkdir /home/q
# chown vsftpdguest.vsftpdguest /home/q
# chmod 600 /home/q
  经过以上设置,q登录VSFTPD后,用“pwd”指令就可以发现被自己被定位到自己的“/home/q”目录。
从文件系统层次来看,由于“/home/q”目录的权限是属于vsftpdguest的,所以其他的虚拟用户同样也可以访问q的自家目录。
解决这个问题也很简单,只需要让VSFTPD负责将虚拟用户限制在其自家目录,就可以避免虚拟用户的互相访问。具体做法参照前面第8步中所述。经过以上设置后,虚拟用户就可以拥有属于自己的目录了。
使用user_config_dir参数,在每个用户独立的配置文件里设定不同的权限和local_root参数就可以了

帮助:
在第5步处可以对程序进行调整:
# vi /etc/vsftpd/vsftpd.conf 查看ftp连接情况
log_ftp_protocol=YES
dual_log_enable=YES
syslog_enable=YES
# vi /etc/pam.d/vsftpd 调试pam_mysql连接情况
auth required /usr/local/lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 verbose=1
account required /usr/local/lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 verbose=1

---------
最后,你在上传的时候会发现,文件权限都是600,看vsftpd.conf里,有一个local_umask,上面还有注释,如果要改改成022,大多数Ftpd都是这么配置的。
关于umask为什么是022,可以查看老王的文章:Umask补习班
里面有这么一句:注:权限计算实际上是二进制位的与操作,参考All About the umask and Permissions。

rework 摘录二

rework 摘录二

看到这里的时候,又有点感触。
事实上现在就处于这种情况,想找人的时候找不到,不想找人的时候,面试的人一大堆。
可是你说真要拿来做人才储备吧,可能几个月都用不上他,那时候更纠结。

OK,看看rework中怎么说:

应付不来的时候才雇人

不要在高兴的时候去雇人;雇人是为了解决事情。重复的问自己:如果我们不雇佣任何人又怎样?那些让我们烦恼的加班是否真的有必要?我们能用一部分软件或者改变一下业务来解决这个问题吗?如果我们不这样做又会怎样?

同样的,如果你解雇了某人,不要立刻找人来替代他的位置。 看看你没有了那个人和那个职位可以撑多久。你会发现其实实际上不需要想象中那么多人。

雇人的正确时间是你顾及不过来的时候。你不能再做更多的事情,发现产品质量在下滑;当你苦恼的时候就可以雇人了,不能太早。

割舍那个你并不需要的牛人

有的公司对雇人乐此不疲。有的公司在不需要雇人的时候都在招聘。他们听说某某很厉害,于是造出一个职位和头衔吸引人家入伙。结果人家来了,坐上一个不重要的位子,做些不重要的事情。

别管那些你不需要的人,就算你觉得那个人是个牛人。 如果你引进一个做些无用功的人才,那这样对你的公司来说是有害而无一利的。

问题出现在你有超过需求的人员。你开始弄出点工作好让这些人忙起来。人为的工作导致人为的项目。而人为的项目导致实际成本和错综复杂的状况。

不要担心“错过了那个人”。让一个人做些没有意义的事情会更糟。天底下有那么多人才。当你真正有需求的时候就会找到一个合适的人选。

牛没什么用。如果你不需要人,那你就不需要雇人。

rework 摘录一

rework 摘录一

这是其中一段,事实上在很久以前就知道了,但最终都无法改变
里面的一小段说的很有意思,那就是,会议会衍生会议,。。。。

OK,上原文:

会议有毒

会议是最糟糕的打断方式。原因是:

通常会议只是文字和抽象的内容,没有实质。

通常会议每分钟只传达出极为少的信息。

人们在会议中容易跑题堪比暴风雪里的芝加哥出租车。

会议要求做充分的准备,但是大多数人难以做到。

频繁的提出模糊的议程而没有人能真的清楚目标是什么。

常常会出现至少一个傻瓜不可避免的,毫无意义的浪费大家时间。

会议会繁殖。一次会议会导致另外一次,再生出下一次......

不幸的是会议典型的时间表就像电视节目。

你腾出 30 分钟或一个小时因为那是软件安排的行时间表( 你决不会看见任何人安排 7 分钟时间和 Outlook 开会)。太糟了。如果只是花 7 分钟时间就能完成会议目标,那这就是你所要花的所有时间。别把 7 分钟拖到 30 分钟。

想想看,会议所花费的真实时间是惊人的。 假如你准备安排一次会议持续一个小时,你请了 10 个人到场。那确实是 10 个小时的会议,不是一小时会议。你用 10 小时的生产力换来一个小时的会议时间。也有可能花超过 15 小时的时间,因为要停下你正在做的事情,需要精神转换, 去哪里见什么人,然后再重新开始预先在做的事情。

花 10 小时生产力去换 1 个小时的会议可以吗?有时,也许可以。但这样真的不划算。 就基于付出的来说, 这种规模的会议很快就变成一种不利因素而不是有力因素。 想想你浪费的时间,值得吗?

如果你执意要聚一下,试着坚持以下原则会让你的会议有成效:

用计时器。当它响起,会议结束。句号。

尽量减少与会人员。

保持清楚的议程。

开篇点题。

就地解决。指出实际问题,提出实质改变。

作出结论,找个靠谱的人去执行。

mac os x上禁用虚拟内存

mac os x上禁用虚拟内存

发现活动监视器上虚拟内存居然是300多G,很震精,问了thinkinlamp群里的淫,都说内存大的情况下,可以禁用虚拟内存。
找了一下资料:(http://www.keakon.net/2011/06/17/%E8%AE%B0%E5%BD%95%E4%B8%80%E4%BA%9BMacOSX%E6%8A%80%E5%B7%A7)
摘抄其中的一段如下:
禁用虚拟内存
Mac OS X有个很奇葩的设定,它把内存分为了可用内存、联动内存、活跃内存和非活跃内存,详情可以看《通过活动监视器了解系统内存使用情况》。
其中,当你退出一个软件时,它所占用的部分内存并不会释放,而是标记为非活跃,下次运行它时可以转换成活跃内存。但如果你不幸把可用内存用完了,Mac OS X并不会使用这些非活跃内存,而是直接使用虚拟内存(交换文件),这会严重影响运行效率。
如果你的内存有4GB以上,大部分情况下都已经够用了,于是就可以禁用虚拟内存,以获得更快的速度:

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

禁用以后,磁盘上还保留着这些交换文件,它们已经没用了,也可以删掉:

sudo rm /private/var/vm/swapfile*

如果要重新启用虚拟内存的话,可以执行这条命令:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

如果要临时释放不活跃内存,可以执行这条命令(需要安装Xcode,执行时会比较卡):

purge

----
purge我是会经常用的。4G内存的时候,我用的次数很多,现在用的少了。。。。。
不过,刚才试了之后,重启电脑 发现虚拟内存还是272G,真纠结啊。
最后再转贴一点常用的快捷键等功能:

  1. Dock的相关操作
    将鼠标指针放在分隔线上面,直到箭头出现,然后上下拖动可以改变Dock大小。
    按住control键并点按分隔线,可以打开Dock快捷键菜单。
    按下control-fn-F3可以移动到Dock,然后可以使用左右方向键在图标之间移动,按下return可以打开一个图标。
  2. 按键图标(如果看不到部分图标,可能是字体缺失,Mac OS X下无问题)
    ⇧ Shift
    ↩ Return
    ⇞ PageUp
    ⇟ PageDown
    ⌃ Control
    ⌤ Enter
    ⌘ Command
    ⌥ Option(Alt)
    ⌫ Delete
    ⎋ Esc
    ⏏ Eject
  3. 快捷键
    可参考官方文档,这里只列出一些常用的。
    fn-F1~F12:F1~F12的原始功能
    fn-delete:向后删除
    fn-上/下:PageUp/PageDown
    fn-左/右:滚动到文档顶部/底部
    control-左/右:定位到行首/行尾(Xcode中为定位到上一个/下一个单词)
    option-左/右:定位到上一个/下一个词(以标点符号和空格分隔)
    command-左/右:定位到行首/行尾
    command-上/下:定位到文档的开头/结尾
    command-上:Finder中打开上级文件夹
    control-a/e:定位到行首/行尾
    command-delete:删除文件、删除光标位置到行首的内容
    option-delete:删除光标位置前的一个单词
    fn-option-delete:删除光标位置后的一个单词
    shift-command-3:将屏幕捕捉到文件(保存到桌面)
    shift-control-command-3:将屏幕捕捉到剪贴板
    shift-command-4:将所选内容捕捉到文件(保存到桌面)(若按空格,可以选择捕捉的窗口)
    shift-control-command-4:将所选内容捕捉到剪贴板(若按空格,可以选择捕捉的窗口)
    command-m:最小化窗口
    option-command-m:最小化当前程序的所有窗口
    command-h:隐藏窗口
    command-w:关闭窗口
    command-q:退出程序
    option-command-esc:强制退出程序
    option-command-w:关闭当前程序的所有窗口
    option-command-d:隐藏/显示Dock
    command-.:弹出自动完成菜单

乔大妈:【插件】史上最强EditPlus插件OpenCTags使用指南--EditPlus开发者必备

这是乔大妈推荐的插件,在推荐的时候用上了:推荐积德,不推荐积业
好吧,我为了积德推荐一下,当然乔大妈说了,使用的人应该推荐。嗯,我不用Editplus很久了。
原文来自:

首先:
感谢Romeo JunCU的卓绝工作,是他让我们拥有史上最强EditPlus插件OpenCTags,让EditPlus插上了翅膀

demo.png

使用:
1. 将OpenCTags解压后的所有文件,拷贝到EditPlus\User Tools\ctags\下

2. 在EditPlus的用户工具中,进行如下设置:
a.
菜单名称:CTags Build
命令:......\EditPlus\User Tools\ctags\ctags.exe (请根据实际路径设置)
参数:-R *
初始目录:$(FileDir)
动作:捕捉输出
输出模板:默认
保存:无

b.
菜单名称:OpenCTags
命令:......\EditPlus\User Tools\ctags\OpenCTags.exe (请根据实际路径设置)
参数:-word "$(CurWord)" -editor editplus -sel "$(CurSel)" -file $(FilePath) -line $(CurLine) -one
初始目录:$(FileDir)
动作:退出时关闭窗口
输出模板:默认
保存:无

3. 使用方法:
a. 到项目的根目录,打开一个文件,然后执行“CTags Build”,等待建立ctags完成,在根目录会生成tags文件,注意在svn/git/hg/cvs等中设置忽略该文件
b. 打开项目内任意文件,选中需要查看的关键字(类名或者函数方法名或者任意玩意),执行“OpenCTags”,将会打开OpenCTags提示窗口,提示对应的tags信息
c. 提示窗口中,会给出匹配的名称,原型缩写,以及所在的文件相对路径,鼠标移动上去,会显示完整的原型提示,双击,会自动打开对应的文件并定位到对应的位置
d. 提示窗口中,左则的图标代表不同的类型,包括但不限于:类、方法/函数、常量定义、变量等等
icon.png

附加:
0. ctags是个什么东东?格纹滚,自己上网查去,这个不知道,等于没有编过程。
1. 该插件,来自于sf的OpenCTags,我只是经过简单完善和给予中文说明后提供;再次感谢Romeo JunCU的卓绝工作。
2. 如果是editplus2,请使用-editor editplus2
3. 也可参考以上设置,为其他编辑工具配备
4. 欢迎推广,欢迎传播至少一人,一旦使用,将自动接收以下锲约:
传播积德,不传播积业!!!

5. 如有问题和建议,请致信honestqiao@gmail.com,谢谢

6. 欢迎访问史上最强PHP中文手册--PHP手册中文翻译补完计划 --http://code.google.com/p/phpdoc-zh/

问题:

Q. Could not find install dir for editor editplus?
A. 找不到EditPlus的安装路径,绿色版本的一般会出现该问题;
打开“EditPlus安装路径.reg”,将其中的EditPlus路径修改为你自己的,然后导入即可。
或者打开regedit,在HKEY_CURRENT_USER\Software\ES-Computing\EditPlus 3\Install,设置Path字符串属性,值为EditPlus安装路径,不存在的就建立新的
如果是EditPlus2,记得修改为EditPlus 2

Q. 双机无法打开文件?
A. 请打开“Microsoft Visual Studio Spy++.exe”,点搜索菜单,点查找窗口,然后点那个瞄准器,拖到EditPlus的编辑代码的那个位置(需要预先打开一个文件),然后告诉 我,Spy++的“窗口搜索”的类那个地方显示的信息,例如我的是“AfxFrameOrView90su”,你的呢?
Spy++.png

Q. 修改或者增加新的代码后,匹配不到怎么办?
A. 此时,需要及时再来一次:CTags Build

下载:enCTags.tar.gz (1.25 MB)

IPAD 上的Safari 中的一些小问题

今天在为ipad上的一个图片加上点击效果,在safari浏览器里一切正常,但到了ipad上,点击效果就死活出不来。
折腾了很久我才发现,我原来的触发的一个效果是写在a标签上的,也就是说,它是一个链接,然后onclick效果就起作用了。
于是我CreateElement了一个a,为它加上了onclick效果,果然,起作用了。。

------------
事实上很多人都和我说,div是有onclick事件的,嗯,我用Safari也测试确实有,但就是在ipad上无法实现。好吧。我承认我烂,可能是。。。。
可是我都一一在代码中测试了。
附上我那恶心至极的代码 (这是其中的一段,纯备份了):

function ee(elem,popLayer) {
var e = document.createElement("a"),scb=popLayer[0].querySelector('.showCaptionBody');
e.setAttribute("href", "###");
e.style.cursor = "pointer";
e.style.position = "absolute";
e.style.zIndex = 9;
e.style.display = "block";
e.style.right = "3px";
e.style.bottom = "3px";
e.style.width = "16px";
e.style.height = "16px";
e.style.backgroundImage = "url(data:image/gif;base64,R0lGODlhEAAQAIAAAMzMzP///yH5BAAHAP8ALAAAAAAQABAAAAIahI+py+0RHILy0Aoug7zH5HnPV2mSOWLqihUAOw==)";
e.onclick = function() {
var s = document.createElement("img");
s.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAAElSURBVEiJ1ZZNioQwEIVfhiYXqtmIIIokJxaRuEgOYM7hCdxas2gMbWKrDJ1FF9SmKr7PpJ4/gpmRMx4AIISYcogz8+9PDuHXeERE+oSoEMIfAtZ1/YT+LuId5AXk2MFuyOu67lJKiaIokvqWRVFASpnU3wKYeZdEBO89yrJMemVZwnsPIkp6iEUBTACmZVk4TiJiAExEp7XX3PSY+XoGzjnUdQ3vPaqqAoBw5865y7ndcpG1Fk3TwPunvYkI1tpbrvu3i+6uvQVQSoVjAZ5H1LYtxnG8BJy6iJl34sYYGGOCu5RSh9e8BcR+1loH8WEYQn0YhgDRWt9/DuKFm3jf90mv7/sAOQOczmCe58P6Fl3XnfYTwFe+7LIDBDN/9zdZ5P5t+QPZ7357iXsw1QAAAABJRU5ErkJggg==";
scb.innerHTML = elem.innerHTML.split("\n").join("<br />");
scb.removeChild(scb.querySelector("a"));
scb.appendChild(s);
popLayer[0].style.display="block";
popLayer[0].querySelectorAll(".closeShow")[0].onclick = function(){
popLayer[0].style.display="none";
}
};
elem.appendChild(e);
delete e;
}

阿强说,是因为div没有宽度和高度,我说是100%,他说100%的话就是0。
好吧,我不是前端,我开始的时候没明白,但我没有时间来处理,我也没有空设定固定宽度,因为要考虑横竖屏。。所以先用临时方法替代了。

rework

rework

最近很多人提到了《rework》这本书。
嗯,我最早是在劣头翔的博客(黑暗代码界)上看到了这本书的介绍,开始以为是关于网站重构啊或者什么其他的,可是打开了之后才发现这是本关于创业的书。
嗯,其中有些话说的真靠谱:创造一款伟大的产品或者服务的最直接、最简单的方法就是去做你自己想用的。这会让你设计出你所了解的产品,并能立即明白你做的东西是否靠谱。

本来还在慢慢看呢,coolshell上面也有介绍(http://coolshell.cn/articles/5815.html),它是这么说的:好吧,让我再回到创业的话题上来,有一本书叫“Rework”,想创业的朋友可以好好读一读。 “保持 小的公司规模,你不需要加班,你没有必要耗尽你一生的积蓄,承担财务风险。你可以一边继续日常工作,一边开始创业,这样随时都能有现金满足需要。你甚至不 需要办公室。现在可以在家工作,和从未见面离你千里之外的人合作…… ” 这是一本让你可以去思考的书,远比那些名人们的微博有价值地多得多。不要跟随大流,保持住内心的理想,Think it Big, Make it Different。

好吧,既然这样,那为什么不好好看看这本书呢?
http://www.v2ex.com/rework,这里有在线版,v2ex,这个站,你们总熟悉的吧,曾经国内一直被墙的站点之一。套用一句老话,判断一个站是否知名,就看它有没有被墙过。
我的站从未被墙过,所以,它是不知名的。这点,我确认

转:关于“产品驱动”和“技术驱动”

转:关于“产品驱动”和“技术驱动”

其实关于产品驱动和技术驱动,历来就有很大的讲法。产品驱动最大的隐患就是时间,技术驱动的话,一个原型很有可能就能够拿来卖钱,产品驱动,从原型到可运行,其中的时间也是很长的。

第二个就是产品驱动和技术驱动中,技术人员的地位问题,在国内的很多公司时,技术人员的地位其实是很低的,产品驱动在国内还算是好的,更多都是业务驱动。 业务驱动比产品驱动又狠一点,业务可能时时会变,甚至连一个产品线的时间都一定准确。国内很多小公司都是这样的,其实很多大公司也差不多是这样处理的,也 就造成了技术人员在疲于奔命,如果你硬要解释,领导的话可能就是,这么一个改动能给公司带来几十万的收益,你改不改?哭泣中。。。。。。

OK,下面是转来的内容:

公司的运行方式有两种:“产品驱动”和“技术驱动”。

国内甚至国际上绝大部分的公司都是“产品驱动”型,它的运作方式是这样的:公司高层负责“战略布局”,只提出需求“我要个什么东西,能实现 什么功能”,然后给出一个时间点,要抢在什么什么时间点上线这个项目。如果有现成的团队,那么由这个团队去完成,如果没有,那么招人或内部调整组织起来这 么个队伍。队伍里会有产品经理和项目经理,产品经理负责设计工作的把控和对产品的收益负责,也就是说,由他来对这个产品的经济效益扛KPI。项目经理负责 开发团队的日常进度管理,协调资源分配开发任务什么的。产品经理和项目经理虽然同称为“经理”,但事实上,产品经理是公司高层和开发团队的扭带,公司高层 并不会关心开发工作的细节,他们只会跟产品经理衔接,对于开发团队来说,产品经理是公司高层的代表,是项目需求方,而且他对产品的经济效益扛KPI,所以 产品经理其实权力非常大!

但产品经理通常都没有技术背景,他们不懂技术,也不懂工程师文化,不知道工程师对什么在意,他的思想集中在“商业”和“产品设计”上。项目经理的职责是对 项目的进度进行把控,他其实是很需要“软件工程”方面的知识的,如果项目经理靠谱的话,事情也好办,但往往项目经理大多数对“软件工程”其实并不太了解, 项目经理往往是“技而优则仕”提拔起来的,也许“开发”能力过得了关,但“开发”和“管理”是两码事,“软件工程”之所以能独立成为一个方向,正是因为其 重要程度已经达到了一个不可忽视的地步——上世纪六、七十年代的软件危机,就是因为缺少“软件工程”方面知识的指导而暴发的。

项目经理对“软件工程”的知识欠缺导致的问题就是:公司高层习惯了指定一个粗略的项目需求和一个时间点,而产品经理接受这个任务,一方面对项目需求进行进 一步的详细设计并定时向高层反馈项目进展,另一方面对开发团队提出详细的产品需求。开发团队接受开发需求,在项目经理的带领上进行实际的项目开发。这里有 两个问题需要重点关注:“时间点”和“产品需求的详细度”。“时间点”是由公司高层决定的,他们习惯了这样的方式,而“产品需求的详细度”是由产品经理控 制的。我们知道软件开发的几个步骤应该是“提出需求-->概要设计-->详细设计-->编码-->测试-->发布”,理论 上在工程师“编码”之前,产品人员应该把“详细设计”的工作做完,“项目需求的详细度”应该非常高,项目进入编码阶段,需求就不应该再改动了。但稍有经验 的工程师都知识,产品人员不会也不可能会在项目进入编码阶段前完成详细的设计,他们总是会不停地进行修改。理想情况下,项目经理应该会很懂“软件工程”, 为了保证项目进度,他们会对开发团队做出一些保护,阻止产品人员在项目开发过程中修改需求,就算无法完全阻止,至少会做一些措施,提高产品人员修改需求的 门槛——比如说,修改可以,但时间点要重新预估。也就是说,“时间点”确定的前提下,“需求的修改”就不能那么随意,必须有一套合理的游戏规则平衡“高层 管理”、“产品经理”、“项目经理”、“开发团队”各种角色的责任和权利。但实际情况是,产品经理权利过大,项目经理往往无法保护开发团队,更有些甚至不 懂去保护开发团队,只会“拿鞭子抽”,成了一个监工的角色。开发团队于是成了埋头干活,却几乎完全没有话语权的编码机器人。时间点确定了,需求不停地改, 监工不停地催,代码在一次次修改中越变越腐坏,只好不停地加班,期望通过延长工作时间这种原始的办法来按时完成开发任务。结果就如大家所熟悉的那样:开发 人员抱怨产品人员需求老在变,代码越变越糟糕满是bug,产品人员抱怨开发团队不能按时交付高质量没bug的产品,开发团队加班严重,人员流失严重,项目 组成员不停地更替,交接工作不可能完美,新人且对历史遗留代码头疼不已,项目开发前快后慢,维护成本越来越大直到某一天,某人实在受不了了,大喊一声“重 构吧”。。。

上面提到的画面大家一定很熟悉吧,没错,这是“产品导向”的公司的基本行态。产品经理权利过大,产品的原型完全是由产品人员和公司高层决定的,开发团队完 全是棋子,编码机器人,开发压力大,加班严重,生产的代码质量差,很难在预计时间点交付高质量产品。所谓“兵熊熊一个,将熊熊一窝”,在这种体制下,整个 产品线完全围绕产品经理转,再牛B的工程师也扛不住不靠谱的产品经理,产品经理是如此之重要,以至于一个不靠谱的产品经理很可能会毁了一整支团队。“产品 驱动”的体制大体上分产生两类问题:1)产品创意来自非技术人员 2)软件开发管理混乱。 对于第2点,通过推行好的软件开发方法(比如scrum)可以解决,当然,推行起来会有它的困难,但这不是这篇博客想要探讨的,后面有时间会再另写一博文 探讨。对于第1点,完全无解,“产品驱动”的机制先天就无法解决这个问题。“创意”应该来自两个层面,一个是脱离技术的纯应用层面的创意,这是产品人员的 长处,他们的灵感主要来自于用户需求,发掘用户所需,提供用户所想但IT圈里还没有做的产品,比如团购、sns都是;另一个层面应该来自技术层面的创意, 比如说技术上出现了什么新的技术,这种技术如何合理应用,发挥一些创意,可以用它来做成什么的产品,它的灵感来自于各种技术api的创意用法,比如 gmail的ajax,比如google地图,这些都不可能由非技术人员去创意出来,他们压根就不知道这能否实现,对这种类型的“创意”他们并不敏感。虽 然任何产品最终最会落实到具体的技术实现上,但非技术人员对技术层面不了解,这是他们的短板,哪怕他们再也创造力,技术上的创意他们无能为力。

“技术驱动”型的运作模式非常罕见,google应该算是。如果在产品驱动型的公司,工程师们想到什么创意其实很难去实施,很难去启动一个项目——大多数 公司面对工程师的创意会去问“有其他公司在应用这个技术吗?”,如果没有,那么很难得到高层的支持去做。所以你可以看到国内大多数公司只会去抄一个国外的 创意项目,迅速将其山寨化,拼的是山寨的速度,而不是创意。在技术驱动型的公司里,可以很好地发挥工程师们的创意,启动一个项目的并不是公司高层,而是工 程师自己,工程师自己有什么创意就可以动手去跑这个项目,项目没有一个明确的上线的时间点,甚至不一定被要求要上线。项目开发到相对完善的程度了,可以请 产品经理参与进来,如果产品经理对这个项目感兴趣,可以从产品设计角度提出修改意见,并帮助工程师将项目运作起来向外发布。产品经理的角色权力不会过大, 他们在他们擅长的领域“产品设计”领域里可以发挥所长,但不会对“项目开发过程”有权力——他们并不在行这个,这方面他们没权力反而更好,对技术层面负责 的完全是工程师。产品经理的KPI考核会有别的机制,并不像“产品驱动”型那样,背负过重的压力,导致有过大的权力,导致在他们不擅长的“管理”领域不得 不过分关心。在“技术驱动”型的公司里,工程师有着非常高的权力,有着自由得多的时间,做着自己感兴趣的事,他们的KPI考核机制也和“产品驱动型”公司 完全不同。为什么google是工程师梦想的天堂?不是没有原因的。

“技术驱动”型的公司竟然这么好,那么为什么这么多的公司都不用这种模式?因为他的成本很高,产品的原型完全是工程师去做的,也许他 最终只能成为一个“技术成功”的项目,而无法带来“商业价值”,因为这不是工程师们的兴趣和长处所在。也就是说,也许100个项目里,最后有一个项目获得 了商业上的成功,其他99个也许挣不到钱,甚至有可能夭折。而且技术驱动的公司,对工程师的要求很高,不会让一些能力很弱的工程师来公司混日子,公司相对 很自由但相应的,进入门槛会很高——google和facebook的招聘条件大家都有所耳闻吧?门槛高意味着开出的薪水也会很高,而这些工程师开发的项 目还有可能并不挣钱!“技术驱动”型的公司,必须有玩得起的资本,并不是什么公司都玩得起和有那个胆量去玩的。

-------

上面的原文来自于:http://hi.baidu.com/cly84920/blog/item/741a13ced83ad21093457ea5.html