文章列表
 
您正在查看 "Os" 分类下的文章

2010年09月03日 星期五 下午 5:32
欢迎访问我的新主页:http://huoding.com/

作者:老王

现在,对一个Web程序员来说,图像处理已经属于必会知识之一了。且不说FlickrYupoo等专业图片分享网站,就算是一个和图片分享不沾边的网站,也会用到很多图片处理的功能,比如说:用户上传头像,然后自动生成缩略图。

常用的图片处理工具有GDImageMagickGraphicsMagick等等。GD就是个阿斗,略过不提;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;GraphicsMagick的功能略逊于ImageMagick,但是它的效率更强悍,就好比Apache和Nginx一样,一个功能更强,一个效率更胜。

现在更看重效率,所以本文就以GraphicsMagick为例来说说:

对于PHPer来说,有两种使用GraphicsMagick的方式:

1:使用PECL Gmagick扩展。
2:使用GraphicsMagick命令行。

PECL扩展的方式我并不喜欢,一来PECL代码Bug多多,二来PECL扩展的实现,代码写起来很罗嗦:比如缩放一个GIF动画图片,如果你用命令行的方式,一句话就搞定,而用PECL扩展的话,还得先算动画有几帧,再循环处理,很麻烦。所以说我更倾向于使用命令行的方式,虽然命令行操作听起来很“重”,但如果建立若干台图片服务器,通过Gearman连接起来,其实很是很有弹性的。

下面我们就以GraphicsMagick为例,采用命令行的方式来看看如何使用缩略图功能:

先上一个原始图片(input.jpg:160x120),以后的各个例子都会用到它:



BTW:列位看官现在可以咽口水了。

缩略图1

gm convert input.jpg -thumbnail '100x100' output_1.jpg



实际生成的图片大小是:100x75,也就是说说按此命令,会保持图片比例不变生成缩略图。这样很不错,但是有一个潜在的问题:我们不能简单明了的知道图片的最终大小,结果是前端显示的时候,无法设置img标签的width和height属性,如果我没记错的话,一般是推荐设定width和height属性的,否则浏览器渲染起来可能会稍稍慢一点。

缩略图2

gm convert input.jpg -thumbnail '100x100!' output_2.jpg



这次
实际生成的图片大小按定义来,但图片变形了,有时候这是不能接受的。

缩略图3


gm convert input.jpg -thumbnail '100x100^' \
-gravity center -extent 100x100 output_3.jpg



这次不仅保证了大小,还保证了比例。不过图片经过了裁剪。

缩略图4

gm convert input.jpg -thumbnail '100x100' \
-background gray -gravity center -extent 100x100 output_4.jpg



这次不仅保证了大小,还保证了比例,同时没有对图片进行任何裁剪,多余的部分按指定颜色进行填充。

缩略图5

gm convert input.jpg -thumbnail '10000@' \
-background gray -gravity center -extent 100x100 output_5.jpg



这次保证了大小和比例,其中的10000就是100x100的乘积,同时在填充和裁剪之间做了一个平衡。


明白了以上几个例子,缩略图基本就能通吃了,肯定有一种会适合你的需求。GraphicsMagick的资料非常少,但好消息是GraphicsMagick和ImageMagick的用法基本兼容,所以你可以通过
ImageMagick的资料来套用。

补充:如果想让用户手动裁剪头片的话,imgAreaSelect是个好选择。

参考链接:

http://www.imagemagick.org/Usage/thumbnails/
http://www.graphicsmagick.org/GraphicsMagick.html#details-thumbnail
 
2010年05月16日 星期日 下午 8:00
欢迎访问我的新主页:http://huoding.com/

作者:老王

FastCGI就像它的名字一样,已经非常快了。但是SCGI更快!虽然都是CGI协议的继承人,但SCGI协议FastCGI协议更简单。

主流Web服务器都支持SCGI:

Apache:mod_scgi源代码),mod_proxy_scgi
Lighttpd:mod_scgi
Nginx:mod_scgi

SCGI源于Python社区,在PHP社区里,似乎支持很少,只看到一个名为appserver-in-php的项目里有SCGI相关代码,实现方式很直接,就是用stream函数建立Socket服务器,然后按照SCGI协议的格式来处理数据,由于是用PHP实现的,所以想投入实战估计效率成问题。

附:Wiki上有些SCGI相关资料
 
2010年01月15日 星期五 下午 7:44
欢迎访问我的新主页:http://huoding.com/

作者:老王

Java官方没有提供CHM格式的文档,但是给出了推荐Java documentation in Windows Help format,不过这个文档里有一个版权页,会让有“洁癖”的程序员感到不爽,我曾经龌龊的试图用CHM Editor删除版权信息,可惜未遂,下面看看有“洁癖”的程序员是如何制作CHM格式的Java文档的:

我们不必一切从头开始制作CHM格式的Java文档,已经有人设计了一些方便的工具,比如说:javadoc2chm,为了使用它,先安装好Ruby环境,然后再装上HTML Help Workshop,稍后会用到,最后下载好HTML版本的Java文档备用。

javadoc2chm的使用很方便:ruby createhhp.rb java java /path/to/docs/api

稍后片刻,就会生成java.hhp,java.hhc,java.hhk。用HTML Help Workshop打开java.hhp,选择File->Compile,就可以开始编译CHM了,由于HTML文档体积比较大,所以编译过程相对比较漫长,得耐心等待,如果不出意外,就能生成java.chm文件了,在编译时,你可能会看到类似下面的警告信息:

Warning: Too many topics associated to the "equals(java.lang.Object)" keyword...
Warning: Too many topics associated to the "hashCode()" keyword...
Warning: Too many topics associated to the "toString()" keyword...

这是CHM文件本身的限制所致,并不影响CHM文档的使用,唯一的缺点是当你使用CHM里的search功能时,有些数据可能搜索不到。

我第一次操作到这里的时候,以为大功告成了,可是当我浏览java.chm的时候,发现很多页面上面的导航里都有很多FRAMES,NO FRAMES链接,其中FRAMES链接点击后竟然显示“This program cannot display the webpage”,虽然这并不影响使用,但是对一个有“洁癖”的程序员来说,这就像在肉包子里发现头发一样恶心,所以还得想办法,通过查看HTML格式的文档,你会发现相关的源代码:

<A HREF="..." target="_top"><B>FRAMES</B></A>  &nbsp;
&nbsp;<A HREF="..." target="_top"><B>NO FRAMES</B></A>  &nbsp;

这两个链接其实一点用也没有,所以我们只要把它们删除就可以了,使用下面的Shell:

find /path/to/docs -name "*.html" | xargs sed -i '/FRAMES<\/B><\/A>/d'

如此一来我们的目的就达成了,sed真是居家必备的工具。接下来再用一遍javadoc2chm就好了。

回过头看看,本文的出发点真是有点无厘头,不过在操作过程中又熟悉了若干个工具,也算是有所得了。
 
2010年01月03日 星期日 下午 4:30
欢迎访问我的新主页:http://huoding.com/

作者:老王

通常linux下的安全防护方式会首选iptables,比如说想block某个ip(<IP>)的话,可以使用如下规则:

iptables -A INPUT -s <IP> -j DROP

附:iptables相关教程

除了iptables以外,linux下还有一种名为TCP Wrappers的安全防护方式,它并不能取代iptables,但是由于用法更简单,所以可以作为一个有效的补充手段,简单点说就是通过/etc/hosts.allow和/etc/hosts.deny文件来控制对进程的访问权限,详细的介绍可以参考:man -S 5 hosts_access

hosts.allow文件的优先级更高,如果在hosts.allow文件里查到满足的条件,就无需再解析hosts.deny文件,可以这样测试:

# vi /etc/hosts.allow
ALL : ALL : spawn (/bin/echo allow >> /var/log/hosts.log)

# vi /etc/hosts.deny
ALL : ALL : spawn (/bin/echo deny >> /var/log/hosts.log)

然后登陆一下,再查看hosts.log日志,就会发现里面是allow字样。

不管是哪个文件,其格式都是一样的:daemon_list : client_list [ : shell_command ]

如果不写shell_command的话,对于hosts.allow文件,就意味着ALLOW,对于hosts.deny文件,就意味着DENY。

举例:比如说我们想禁止192.168.0.1这个IP使用SSH,那么就需要在hosts.deny文件里增加下面一行:

sshd: 192.168.0.1

利用这一点,我们可以写脚本来动态防护系统,定期扫描/var/log/messages日志,发现有人恶意穷举密码,就把其IP加到hosts.deny文件中,这样系统安全系数就会提升一个档次,实际上已经有现成的软件可以使用了,就是DenyHosts,有兴趣的网友可以下载使用。

那我们是否可以使用TCP Wrappers技术来防护任何软件的访问呢?比如说:Apache?答案是否定的!我们先看看是如何知道SSHD内建了TCP Wrappers支持的,自然也就知道如何判断Apache是否内建了TCP Wrappers支持:

# type sshd
sshd is /usr/sbin/sshd

# ldd /usr/sbin/sshd | grep libwrap
libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00dbb000)

搞定,也就是说,libwrap是判断一个程序是否内建了TCP Wrappers的标志,同样的操作步骤,如果用在Apache上的话,则没有结果,对于Apache而言,如果你想控制客户端的访问,应该在httpd.conf配置文件里使用“Order allow,deny”ACL机制,这里就不多说了。
 
2009年12月26日 星期六 下午 8:08
作者:老王

欢迎访问我的新主页:http://huoding.com/

学了subversion之后,我就把cvs忘得一干二净了,现在git越来越火了,在全面切换到git之前,特地总结一下subversion,以免以后又什么都不记得了。

创建仓库:

svnadmin create /path/to/repository

修改一下配置:

vi /path/to/repository/conf/svnserve.conf

如果不是开源项目的话可能需要配置禁止匿名访问:

[general]
anon-access = none
auth-access = write
password-db = passwd

设定用户密码:

vi /path/to/repository/conf/passwd

假设创建一个密码是<password>的用户<username>

[users]
<username> = <password>

此外,还可以设定基于路径的authz认证方式,读者请自己看配置文件,这里就不多说了。

subversion有很多运行方式,比如说搭配apache使用,不过它本身也可以单独作为服务存在:

svn -d -r /path/to/repository

在客户端可以使用svn import的方法来创建项目(也可以用svn mkdir的方式来创建项目,就不多说了):

mkdir -p /path/to/project/trunk
mkdir -p /path/to/project/branches
mkdir -p /path/to/project/tags

svn import /path/to/project svn://server/project

其中,trunk,branches,tags目录并不是必须的,但多数人习惯这样,所以最好不要标新立异。

接下来就可以checkout了:

svn co svn://server/project/trunk project

开发时常用的命令很简单,基本就是更新svn up,提交svn ci之类的。

在项目开发初期,可以仅仅使用trunk来管理代码,不过一旦项目发展起来,开发时就不应该直接操作trunk了,此时应该使用branches来管理代码,比如可以使用下面的命令建立一个名为1.x的branches:

svn copy svn://server/project/trunk svn://server/project/branches/1.x

开发工作都在branches中完成,一旦完成了编码,就可以把代码合并到trunk中去:

先要查查branches是什么时候创建的:

svn log --stop-on-copy svn://server/project/branches/1.x

假设查到的版本号是<version>, 然后进入到trunk工作拷贝中,执行:

svn merge -r <version>:HEAD svn://server/project/branches/1.x

最后提交即可:

svn commit

这还不算完,此时应该在tags里发布这个新版本(比如说版本号是1.0):

svn copy svn://server/project/trunk svn://server/project/tags/1.0

为了记牢一点,再唠叨一下trunk,branches,tags的用途:

trunk:仅保存最新的稳定代码,代码的改变尽可能通过branches来merge,而不要手动commit代码。
branches:用来管理代码的日常开发,可以手动commit代码。
tags:仅保存各个版本的代码快照,比如类似版本:1.0,1.1,1.2等等。

不同人针对同样的文件提交修改的时候,subversion会尽可能的自动合并修改,不过有的时候还得手动来解决冲突,有以下几种方式:

1:放弃自己的修改,转而使用服务器端的代码版本:

svn revert file.php
svn update file.php

2:使用自己的代码版本覆盖服务端的修改:

cp file.php.mine file.php
svn resolved file.php

3:手动处理<<<<<<<和>>>>>>>标识出来的冲突代码:

svn resolved file.php

有一些文件和项目本身掺杂在一起,但不适合作为版本控制的保护对象,这时应该忽略它们,比如说Smarty的模板编译目录templates_c:

svn propedit svn:ignore /path/to/templates_c

使用subversion的自动属性功能可以节省很多精力,比如说想让不同系统的用户在得到php文件的时候使用适合自己的行结束符,可以这样:

vi ~/.subversion/config

[miscellany]
enable-auto-props = yes

[auto-props]
*.php = svn:eol-style=native

注意:如果你使用的是windows操作系统,配置文件config的路径是:%APPDATA%\Subversion\config

subversion有很多钩子脚本,可以方便维护工作,其路径位于:

cd /path/to/repository/hooks

里面有很多现成的模板,比如pre-commit,post-commit,我们可以用它来实现很多效果:

比如说我们想保证所有的svn ci操作都要编写适当的日志信息,可以这样:

cp pre-commit.tmpl pre-commit

这样就够了,钩子模板缺省的内容就实现了这个效果,具体的实现内容可以参考钩子本身代码。

说到日志信息,随便唠叨一下,写日志信息的时候不要写诸如把a改成b之类的东西,因为通过svn diff可以很容易知道你做了哪些改变,而应该写为什么做这些改变,这样的日志信息才是有意义的。

post-commit文件也可以有很多用途,比如说我们可以利用它来自动更新线上代码,大概的代码如下:

/usr/bin/svn update /path/to/work/copy

此外,要注意在Web服务器上保护.svn目录,不然就不安全了,如果是apache的话,可以这样:

<DirectoryMatch "/\.svn/">
Order allow,deny
Deny from all
</DirectoryMatch>

最后说说svn+ssh的连接方式,本文的例子基本都是使用单纯的svn连接方式,不过svn+ssh可以使用系统本身的账户作为验证方式,并且传输过程是加密的,所以更方便,更安全。此外,使用svn+ssh的方式,你连服务都不用启动了,因为已经通过ssh转换成类似本地的file://操作了。

svnadmin create /path/to/repository
groupadd subversion
usermod -G subversion <username>
chgrp -R subversion /path/to/repository
chmod -R 770 /path/to/repository

在客户端查看配置文件:

more ~/.subversion/config

[tunnels]
# ssh = $SVN_SSH ssh

缺省情况下,这里使用了一个名为SVN_SSH的环境变量,所以你需要设定一下它:

export SVN_SSH="/usr/bin/ssh [-p port ...]"

注意:如果是windows,可以使用putty中的plink,或者使用TortoisePlink,并在环境变量中设定SVN_SSH。

设定好了之后,就可以使用svn+ssh的方式了:

svn+ssh://server/path/to/repository/...

注意,使用svn+ssh连接的时候,后面是完整的物理路径,这和单纯使用svn连接时是不一样的。

好了,subversion常用的功能基本都介绍了一遍,时不时拿出来看两眼,应该就不会忘记了。

补充:合并算是比较难掌握的功能,可以参考:講解 Subversion 分支與合併:以 TortoiseSVN 為例
 
   
 
 
文章存档
 
     
 
最新文章评论
  

[表情]
 

不错!
 

linux大师之路,www.linuxmr.com
 

引导一直没有整明白说。
 

[表情]
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu