易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
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

apache 404转发

apache 404转发

平时我们用apache的404转发,大多数是:
ErrorDocument 404 /404.html
但这样其实也只能做到404的提示信息,会更加人性化一一点,但事实上我们要做到几件事情
比如我的图片不存在,我转发后,会根据图片的URL自动生成一张,这一点行不行呢?
于是乎,利用404转发就势在必行了
ErrorDocument 404 /xxx.php
在PHP里写上
<?php
header("Location:http://xxx.xxx.com".$_SERVER['REQUEST_URI']);
?>
或许有人说,为什么我的不起作用呢?
嗯,在ErrorDocument中,如果用其他域名就不行了
比如说我ErrorDocument 404 http://xxx.xxx.com/xxx.php
在其他域名下的Xxx.php不要说$_SERVER['REQUEST_URI']取不到,连HTTP_REFERER也没有的。
所以,还是在自己当前的项目写一下文件 ,利用header转发一下才是最OK的

Infomation:WebKit Does HTML5 Client-side Database Storage

资料备份,其中有两个链接很重要 :
原资料中的:client-side database storage.已经打不开了,好象是换成这个了:10.1.2.2 A worker for updating a client-side database
但我也说不准,详情还是看这个页面吧:http://www.whatwg.org/specs/web-apps/current-work/multipage/

对了,因为是基于webkit的,所以,FF上是没法用的。更多的还是用于ipad,iphone之类的上面吧。

jQueryMobile的代码里应该是有了

WebKit Does HTML5 Client-side Database Storage

Posted by Brady Eidson on Friday, October 19th, 2007 at 4:04 pm

The current working spec for the HTML5 standard has a lot of exciting features we would eventually like to implement in WebKit. One feature we felt was exciting enough to tackle now even though the spec is still in flux is client-side database storage. So for the last few weeks andersca, xenon, and I have been cooking up an implementation!

The client-side database storage API allows web applications to store structured data locally using a medium many web developers are already familiar with – SQL.

The API is asynchronous and uses callback functions to track the results of a database query.
Compact usage defining a callback function on the fly might look something like this:

var database = openDatabase("Database Name", "Database Version");

database.executeSql("SELECT * FROM test", function(result1) {
// do something with the results
database.executeSql("DROP TABLE test", function(result2) {
// do some more stuff
alert("My second database query finished executing!");
});
});

There will also be a small example of how to use the API in a real site that we’ll try to keep up to date as things evolve.

This initial implementation has some things missing from the spec as well as a few known bugs. But it does the basics and the best way to discover what needs work is to get it out there for people to start using it!

If you find any bugs, would like to suggest features, or have gripes about the spec itself, please drop by #webkit or drop us a line on the WebKit email lists.

Oh, and one more thing…

We’re landing this initial implementation with pretty cool Web Inspector support!
So far you can view the full contents of any table and run arbitrary queries on each database a page is using. We have a lot of ideas for improvements but would also love to hear yours.
DatabaseInspector