Archive for 2007

TWM in a nutshell

文:Charry

本文只涉及到TWM的入门级知识,大家都知道很多UNIX下程序的教程都可以写成一本书,在这里我只介绍入门的一些东西,如果本文能帮助某些朋友对TWM有个大致的了解,就算完成它的使命了,其他的复杂部分,就需要自己去探索了。

TWM是Tab Window Manager for the X Window System的简称,它是一个窗口管理器,初次发布于1988年4月,是个非常容易上手的Window Manager。不像其他的X程序,它没有基于任何GUI组件,而是直接使用的XLib,这样带来的好处就是:小、更方便的配置。所谓窗口管理器,它是一个特殊的程序,它用来给X程序提供诸如:标题的绘制、窗口阴影、窗口图标化、用户自定义宏、鼠标点击、键盘焦点、缩放等功能。

它和GNOME、KDE不同,不是一个桌面环境(Desktop Enviroment,DE)。那些所谓的桌面环境都会有一个窗口管理器,比如CentOS的GNOME用的就是MetaCity,这些DE集成了大量的应用程序,包括一些非常便利的系统管理工具、实用小工具、游戏等,大大方便了用户。

桌面环境纵有千般好,也会有它的短处,比如:由于它的庞大,在系统启动的时候会显的很慢,其实有很多应用我们都不会用到,这个时候,你可选择只加载一个窗口管理器即可。而且你将会发现,几乎所有的窗口管理器都可以用rc文件来配置,你可以在允许的范围内,任意的配置。比如TWM的配置文件就是.twmrc。它位于用户目录下,在TWM启的时候它会首先从用户的主目录下找这个文件,如果它找不到,TWM就会使用一个系统共用的配置文件,一般情况下它位于:/usr/X11R6/lib/X11/twm/system.twmrc。

为了要启动TWM,而不是GNOME或KDE,我们需要在用户的目录下编辑一个.xinitrc的文件,它的内容如下:

#!/bin/sh

xclock -geometry 70x70+5+5 &
xterm -geometry +200+200 -fn 7x13 -fg gray -bg black &

exec twm

这样,当你在执行startx的时候,就只会启动TWM了。最后一行表示启动TWM,前面的两行表示启动的其他程序,比如xclock,它是一个时钟程序,它后面的参数表示它启动后所在的位置和大小。需要注意的是,除了最后一行,其他的行要在最后加上后台运行标志,否则后面的程序都没法进行了。除了最后一行,其他的都是可选的,你可以把你常用的一些程序放在exec twm前,这就和Windows下的启动一样。startx后,你将会发现,TWM的启动非常的快,至少比GNOME,KDE快多了,当然这样比有失公平。

TWM的配置逻辑上被分为三类概念:变量(Variables)、绑定(Bindings)和菜单(Menus)。它们都保存在用户目录下的.twmrc文件中。

变量
变量的配置必须放在第一,它用来描述字体、颜色、指针、边框宽度、图标、窗口的位置摆放,高亮、自动获得焦点等。

变量的名字和关键字是非大小写敏感的。字符串必须用引号引起来,比如:”blue”,并且字符串是大小写敏感的。

举个例子:

BorderColor "gray50"
{
"XTerm" "red"
"xmh" "green"
}

上面表示,所有的窗口的边框颜色为gray50,大致为灰色,括号中间表示特殊的情况,比如第一行的意思是:如果窗口的名字为”XTerm”,或者它的类名为”XTerm”(注),它的边框颜色就为red,即红色的。我们可定义很多窗口元素的颜色,如菜单背景、菜单前景、标题背景、标题前景等。

Color
{
MenuBackground "gray50"
MenuForeground "blue"
BorderColor "red" { "XTerm" "yellow" }
TitleForeground "yellow"
TitleBackground "blue"
}

绑定
绑定配置通常放在第二位,主要用于描述键盘或者鼠标在窗口、图标、标题、框架上动作时,产生的影响。

比如我们可以把F1键绑定为最小化操作,把F2绑定为更改窗口的层次,把F11绑定为最大化窗口,把Shift+F4绑定为关闭窗口,F12用来把窗口焦点移到某个窗口上。

"F1" = : all : f.iconify
"F2" = : all : f.raiselower
"F4" = shift : all : f.delete
"F11" = : all : f.fullzoom
"F12" = : all : f.warpto "XTerm Icon Manager"

绑定键盘的语法为:

Button or Key = modlist : context : function

Button or Key,就是鼠标的按键或者是键盘上的某个键。modlist是一些功能键或者它们的组合,比如shift, control, lock, meta, mod1, mod2,mod3, mod4, mod5等,shift, control和lock这些键大家都知道,meta在有些系统上就是alt键。其他的我也没搞明白是什么东西,如果你知道,请告诉我。context表示上下文,所谓上下文,就是指鼠标或者焦点所在的地方。比如上面的 F4键的行,其中的all表示当鼠标指针点在程序的任意位置,shift+F4都会把当前窗口关闭,上下文还包括:

root: 根窗口
frame: 窗口的框架
title: 窗口的标题
window: 窗口的客户区,就是窗口的内部那块区域,学过VC的应该很清楚
icon: 图标
iconmgr: 窗口管理器
all: 就是所有啦

再举个例子:

Button1 = : root : f.menu "TwmWindows"

表示当鼠标左键在根窗口上点击的时候,弹出TwmWindows菜单,TwmWindows是一个菜单的标志符,我将在后面说明。

上下文可以任意组合,比如想表示鼠标在框架或者标题上的绑定,我们可以这样写 “F1″ = shift : t|f : f.raise。其中t为title的缩写,f为frame的缩写。其他的上下文也都有缩写。

我们还可以把窗口的标题上加“标题按钮”,比如我们要在标题上加一个关闭按钮,我们可以这样:

LeftTitleButton "/usr/X11R6/include/X11/bitmaps/xm_noenter16" = f.delete

LeftTitleButton表示位置,然后是按钮图标的路径,最后是按钮的动作。

菜单
菜单用于给用户提供自定义单的机会。它们可以被分成不同组,方便管理。每个菜单都由一个名字来标识,这个名字将来用作f.menu的参数。并且,我们还可以定义菜单的背景色、前景色、菜单的项以及该项所对应的动作。如下例:

menu "LeftClickMenu"
{
"my menu" f.title
"fcitx" f.exec "exec fcitx &"
"kill fcitx" f.exec "exec killall fcitx &"
"" ("rgb:0/2/4":"rgb:4/b/f") f.nop
"Xterm" f.exec "exec xterm -fn 7x13 -fg gray -bg black &"
"GNOME Term" f.exec "gnome-terminal &"
"FireFox" f.exec "exec firefox &"
"Luma QQ" f.exec "exec ~/bin/LumaQQ/lumaqq &"
"Gaim" f.exec "exec gaim &"
"Time" f.exec "exec xmessage `date +\"%F %R:%S [%u]\"` &"
}

菜单的内容编辑好后,你需要设置菜单的激活条件。比如上面的菜单,我们让它在鼠标左键点击屏幕时弹出。方法是在.twmrc中加入

Button1 = : root : f.menu “LeftClickMenuButton1表示鼠标左键,root表示根窗口,可以说就是桌面。

正如你所看到的一样,配置非常的简单,其中我设置了一个空菜单,它用来分割不同类别的菜单项,它的颜色和别的稍有不同,括号中的前面表示前景色,后面表是背景色。而最后一项它的动作为f.nop表示没有任何动作。而f.exec表示执行某个程序。f.menu表示激活某个子菜单。

图标管理器
如果桌面上的图标过多,用起来比较麻烦,我们这个时候可以用图标管理器来简化工作。TWM支持多个图标管理器,每个还可以有一列或者多列,比如你想把所有的XTerm类程序的图标都放在一个图标管理器中管理,你可以创建一个如下的管理器:

IconManager
{
"XTerm" "=100x5-10+10" 1
}

XTerm是窗口的类名(注),后面的参数表示管理器窗口的位置在屏幕的右上角,大小为100X5, -10+10表示它在屏幕上的位置,最后的1表示它只有1列。这样你所打开的所有XTerm类的程序(比如xterm)的图标都会被这个管理器管理。管理器中的图标缺省是按照窗口打开的顺序来排序的,如果你愿意,你也可以修改排序的方式。

有用的设定
TWM默认情况下,在建立新窗口时,需要用户指定窗口的位置,这个“特色“实在让人头疼,不知道TWM的作者当初的用意何在。还好,有参数可以关闭它,在.twmrc的最上面加入RandomPlacement即可,以后新打开的窗口就会自动的找一个位置了。

在.twmrc中加入AutoRelativeResize,然后你就可以拖动标题栏最右边的按钮来改变窗口大小了。在实际操作中,我发现,如果要缩小窗口,需要先向放大的方向拖动,然后再往缩小的方向拖动才可以。如果不加入这个参数,要想改变窗口大小,需要把鼠标移动到右下角才可以,不够方便。

AutoRaise。有些窗口,我们会经常用到它,比如XTerm类(注)的窗口。为了方便起见,我们在配置中加入

AutoRaise{“XTerm”}把你的鼠标移动到XTerm的窗口上,看到了吧,无须任何点击,窗口就会被放到最上层。

结尾
TWM并不是一个完美的窗口管理器,比如它在某种意义上说不够漂亮。但是每个窗口管理器都有它自己独特的地方,每个人都有可能爱上TWM,也许有一天你厌烦了别的管理器,你会尝试用一下TWM,以缓解一下审美疲劳。

顺便附上我的TWM配置文件:.twmrc

附注:类的概念,前面我有提到XTerm类,我做一下解释。X下有应用程序类这种说法,每个程序都属于一个类。比如:xterm是XTerm类中的一员,xclock和oclock都属于Clock类(也有可能xclock属于XClock类)。把应用程序分类的好处之一就是,对类的设置会涵盖对它成员的设置,比如对Clock配置,这将影响到所有Clock类的程序。不过UNIX有很多应用程序类都只有一个成员,如XLoad只有xload。在TWM下,你可以设置一个菜单的动作为f.identify,用它你可以看到每个窗口的信息,其中就有它的类信息。

XFCE之初体验

文:Charry

XFCE介绍
XFCE是一个轻量级的桌面环境,,它被广泛的运用于各种UNIX中,它非常的小巧,运行程序很快,节省系统资源。XFCE融合了UNIX哲学中的“模块化”和“可重用性”这两个极为重要的思想。它包含了很多的组件,而正是这些组件构成了整个XFCE的强大。这些组件都可以单独安装,你可以按照自己的需求,定制出自己的桌面环境。

XFCE的特点:

一个简单,易于使用的桌面环境。
完全通过鼠标的拖动和按键来控制等。
与CDE 相似的主面板,菜单,applets和应用launchers。
集成的窗口管理器,文件管理器,声音管理器, GNOME应用模块,和其他一些。
可配置界面的主题。
快速,轻便,高效:对于比较老的/旧的机器或带有很少内存的机器仍然很理想。

安装
下载安装包
首先去XFCE的官方站点:http://www.xfce.org下载你要安装的XFCE的安装包,我下载的是xfce-4.2.1.1-rpm-fdr-i386.tar.bz2,我的Linux发行版是CentOS4.1,网站没有提供对应的安装包,所以所以我选择了它的近亲,Fedora版本的包。

解开后,里面大概有如下几个文件:

dbh-1.0.22-1fdr.i386.rpm
gtk-xfce-engine-2.2.6-1fdr.i386.rpm
libxfce4mcs-4.2.1-1fdr.i386.rpm
libxfce4mcs-devel-4.2.1-1fdr.i386.rpm
libxfce4util-4.2.1-1fdr.i386.rpm
libxfce4util-devel-4.2.1-1fdr.i386.rpm
libxfcegui4-4.2.1-1fdr.i386.rpm
libxfcegui4-devel-4.2.1-1fdr.i386.rpm
xfcalendar-4.2.1-1fdr.i386.rpm
xfce4-appfinder-4.2.1-1fdr.i386.rpm
xfce4-iconbox-4.2.1-1fdr.i386.rpm
xfce4-icon-theme-4.2.1-1fdr.noarch.rpm
xfce4-mixer-4.2.1-1fdr.i386.rpm
xfce4-panel-4.2.1.1-1fdr.i386.rpm
xfce4-panel-devel-4.2.1.1-1fdr.i386.rpm
xfce4-session-4.2.1-1fdr.i386.rpm
xfce4-session-devel-4.2.1-1fdr.i386.rpm
xfce4-session-engines-4.2.1-1fdr.i386.rpm
xfce4-systray-4.2.1-1fdr.i386.rpm
xfce4-toys-4.2.1-1fdr.i386.rpm
xfce4-trigger-launcher-4.2.1-1fdr.i386.rpm
xfce-mcs-manager-4.2.1-1fdr.i386.rpm
xfce-mcs-manager-devel-4.2.1-1fdr.i386.rpm
xfce-mcs-plugins-4.2.1-1fdr.i386.rpm
xfce-utils-4.2.1-1fdr.i386.rpm
xfdesktop-4.2.1-1fdr.i386.rpm
xffm-4.2.1-1fdr.i386.rpm
xfwm4-4.2.1-1fdr.i386.rpm
xfwm4-themes-4.2.1-1fdr.noarch.rpm
xfprint-4.2.1-1fdr.i386.rpm

安装核心文件
首先安装gtk-xfce-engine-2.2.6-1fdr.i386.rpm,然后安装几个lib打头的包,如果你不知道安装顺序,也不要紧,因为如果你的顺序有误,系统会提示你需要先安装哪个包。所有的lib打头的包装完以后,我们再安装xfwm4-4.2.1-1fdr.i386.rpm。这个是XFCE的窗口管理器的包,这个装完后,其实我们就可先体验一下XFCE了。编辑你的目录下面的.xinitrc,内容如下:

#!/bin/sh

exec xfwm4

然后,在命令行中输入startx,你会发现这样其实也可以用。

安装其他组件
理论上,上面的步骤已经可以满足你使用X的需求了,但是,XFCE是一个轻量级的桌面环境,上面的步骤只是安装了它的窗口管理器(WM)。虽然我们完全可以用它的窗口管理器xfwm4来管理X,但毕竟还有些不太方便。那么下面,我们就需要把其他的一些包也安装上。

其他的包的安装方法同上。首先随便找一个包安装,如果可以安装,就安装下一个。如果提示它所倚赖的包没有,则先安装它所倚赖的包。过程非常简单,这里你最好建一个空目录,把安装过的包都移这个目录下,等所有的包都被移到这个目录下后,你的安装也就完成了,这样不至于搞不清哪些包安装过了,哪些没有安装,以免引起混乱。

使用
安装完成后,在命令行中输入switchdesk XFCE,回车后再startx就可以了。如果你不想改变默认的桌面环境,你也可以直接运行:startxfce4命令,不过这样运行和前者还是有少许不同,比如输入法可能不会被自动打开等。

XFCE的配置也是非常的简单,它本身也提供了大量的主题,非常的漂亮。你完全可以用鼠标点一点就可以定制出一个你所钟意的环境出来,这一点对于初学者和懒人是非常有吸引力的。下面附上我暂时使用的类XP界面的风格。点击这里查看。

如果你系统中有GNOME或者KDE,建议你不要把它们删除,因为,我们可以在XFCE下使用它们附带安装的应用程序。

键盘快捷方式:

移动窗口有一个比较方便的方法,你不需要选中标题,而只要按住Alt键,就可以用鼠标选中窗口中的任何位置移动窗口了,这个和TWM是类似的。
最大化窗口:Alt+F5,再按一次还原。
全屏幕窗口:Alt+F11,再按一次还原。
改变窗口大小:Shift+Alt+方向键
隐藏窗口:Alt+F8
改变窗口的层次:Shift+Alt+PageUp/PageDown
上面的这些快捷键,如果你不太习惯,你可以在“窗口管理器”的配置项中配置。

其他
XFCE应该和GNOME以及KDE归属于一类,不过它比前两者速度快多了,但还是比直接使用窗口管理器慢了些。如果你厌倦了GNOME和KDE的慢,何不尝试一下XFCE呢,并且它在美观方面丝毫不比前两者差「其实我倒觉得XFCE已经胜过前两者」。

想要了解XFCE的更多更详悉的知识么,不要去到处问人或者到处去搜教程了,看它的帮助文档吧,在那里你可以找到你要的一切,如果你的英文不行的话,找个电子词典。

酷炫issue及其他

文:Charry

上过BBS的人都知道,有很多朋友的签名档非常的炫目,花花绿绿、闪闪烁烁,煞是好看。其实那些只是加入了控制字符的ASCII文档。大家知道issue和issue.net文件是Linux下的登陆提示文件,我们可不可以把这个文件也做的像BBS的签名档一样呢?当然可以。

如果只是要编辑你的BBS签名档,你大可不必看这篇文章,因为有很多非常方便的程序可以辅助你创作,比如BBSEdit就是其中之一,但是BBSEdit编辑的文件,并不一定可以做为issue。下面我介绍一下如何用vi编写这样的文档。

首先看一个彩色文字的例子:

^[[40;32mcharry.org^[[0m

其中charry.org是文本的内容,其他的是控制字符。注意这里控制字符可并不是你所看到的那样。开头的‘^[’的输入方法是:先按Ctrl键+V,然后按Esc键。第二个‘[’,就是简单的括号,你直接输入就可以了。后面是字符的颜色,文字后面的控制字符的作用是把文字的颜色还原。把这些保存好了,用more看一下,是不是绿色的’charry.org’:),如果你在X下,你得用XTerm,其他的Term可能不支持。

文字颜色的格式为:背景色;前景色m。在上面的例子中,40表示黑色,32表示绿色。常用的颜色代码有:

^[[40;32m 黑底绿字
^[[40;33m 黑底黄字
^[[40;37m 黑底白字
^[[40;36m 黑底青字
^[[41;32m 红底黄字

你注意到最后的的‘^[0m’了吗?这个是用来还原颜色控制的,你最好不要省了它,否则会影响到后面的文字的颜色。好了,你已经学会了编辑彩色文本了,把它保存为issue,然后放到/etc下,然后,退出到登陆界面,看到了吧。如果想从网络登陆的用户也看到这个彩色的画面,你用同样的方法编辑issue.net,当然最终还得看网络用户的终端是否支持。

下面我们看一下如何编辑闪烁的文字,举个例子:

^[[0;5mcharry.org^[[0m
^[[1;5mcharry.org^[[0m
^[[4;5mcharry.org^[[0m
^[[7;5mcharry.org^[[0m
^[[31;1;5mcharry^[[0m
^[[32;1;5mcharry^[[0m
^[[33;1;5mcharry^[[0m
^[[34;1;5mcharry^[[0m
^[[35;1;5mcharry^[[0m
^[[36;1;5mcharry^[[0m
^[[37;1;5mcharry^[[0m
^[[31;4;5mcharry^[[0m
^[[31;7;5mcharry^[[0m

你注意到上面代码中的数字5吗?它就是控制字符闪烁的。比如最后一行,你可以猜测到,前面的31表示前景色,中间7表示背景色,最后的5表示闪烁。你也可省略前景色,比如前四行。

上面的这些规则,是我从BBS Edit生成的代码中推断出来的,也许会有些错误,恳请大家指正。这里附上稍前例子的代码文件,点这里下载。同时,也附上我的issue文件,你可以把它保存在你的/etc下,稍作修改,体验一下彩色且闪烁的issue。上面的两个文件,我之所以以sh结尾,是为了方便您的下载,如果您要保存issue.sh,请改名为issue。

最后提示大家一下,为了让你的issue看起来更漂亮,你可以去各大BBS的ASCII艺术版拷贝一些ASCII图画,比如我的issue中的绿鸽子就是从smth拷贝来的。还有,在Makefile、Shell Script等文件中都可以使用彩色或者闪烁的效果,您可以用它来做一些醒目的提示信息。

我的ImageMagick使用心得

文:Charry

在认识ImageMagick之前,我使用的图像浏览软件是KuickShow,截图软件是KSnapShot,这两款软件都是KDE附带的软件,用起来也是蛮方便的。在一次偶然的机会中,我遇到了ImageMagick,才发现Linux竟然有如此功能强大的图像软件。

你将会发现,大部分的操作,你只要在终端下动动键盘即可,省得你用鼠标点来点去。

下面,我对ImageMagick的主要功能做一个简单的介绍,其中覆盖的大都是人们常用的一些功能,如果你要全面的了解它的知识,你可以看看它的man手册。

convert

convert顾名思义就是对图像进行转化,它主要用来对图像进行格式的转化,同时还可以做缩放、剪切、模糊、反转等操作。

格式转化
比如把 foo.jpg 转化为 foo.png:

convert foo.jpg foo.png

如果要想把目录下所有的jpg文件都转化为gif,我们可借助于shell的强大功能:

find ./ -name “*.jpg” -exec convert {} {}.gif \;

转化后的gif名称为 *.jpg.gif ,这样看起来不太自然,没关系,我们可以再来一步:

rename .jpg.gif .gif *.jpg.gif

本来,我想在find的时候,用basename来取得不带后缀的文件名的,这样就不会形成.jpg.gif这种丑陋的名子了,可是不知道为什么,就是不行,如果你知道的话,告诉我

或者,你也可用shell script来完成上述的操作:

for i in *.jpg
do
convert $i `basename $i .jpg`.gif
done

我们还可用mogrify来完成同样的效果:

mogrify -format png *.jpg

上面命令将会把目录下面所有的jpg文件转化为png格式。

convert还可以把多张照片转化成pdf格式:

convert *.jpg foo.pdf

大小缩放
比如我们要为一个普通大小的图片做一个缩略图,我们可以这样

convert -resize 100×100 foo.jpg thumbnail.jpg

你也可以用百分比,这样显的更为直观:

convert -resize 50%x50% foo.jpg thumbnail.jpg

convert会自动地考虑在缩放图像大小时图像的高宽的比例,也就是说着新的图像的高宽比与原图相同。

我们还可以批量生成缩略图:

mogrify -sample 80×60 *.jpg

注意,这个命令会覆盖原来的图片,不过你可以在操作前,先把你的图片备份一下。

加边框
在一张照片的四周加上边框,可以用 -mattecolor 参数,比如某位同志牺牲了,我们需要为他做一张黑边框的遗像,可以这样:

convert -mattecolor “#000000″ -frame 60×60 yourname.jpg rememberyou.png

其中,”#000000″是边框的颜色,边框的大小为60×60

你也可以这样加边框:

convert -border 60×60 -bordercolor “#000000″ yourname.jpg rememberyou.png

在图片上加文字

convert -fill green -pointsize 40 -draw ‘text 10,50 “charry.org”‘ foo.png bar.png

上面的命令在距离图片的左上角10×50的位置,用绿色的字写下charry.org,如果你要指定别的字体,可以用-font参数。

模糊
高斯模糊:

convert -blur 80 foo.jpg foo.png-blur

参数还可以这样-blur 80×5。后面的那个5表示的是Sigma的值,这个是图像术语,我也不太清楚,总之,它的值对模糊的效果起关键的作用。

翻转
上下翻转:

convert -flip foo.png bar.png

左右翻转:

convert -flop foo.png bar.png

反色
形成底片的样子:

convert -negate foo.png bar.png

单色
把图片变为黑白颜色:

convert -monochrome foo.png bar.png

加噪声

convert -noise 3 foo.png bar.png

油画效果
我们可用这个功能,把一张普通的图片,变成一张油画,效果非常的逼真

convert -paint 4 foo.png bar.png

旋转
把一张图片,旋转一定的角度:

convert -rotate 30 foo.png bar.png

上面的30,表示向右旋转30度,如果要向左旋转,度数就是负数。

炭笔效果

convert -charcoal 2 foo.png bar.png

形成炭笔或者说是铅笔画的效果。

散射
毛玻璃效果:

convert -spread 30 foo.png bar.png

漩涡
以图片的中心作为参照,把图片扭转,形成漩涡的效果:

convert -swirl 67 foo.png bar.png

凸起效果
用-raise来创建凸边:

convert -raise 5×5 foo.png bar.png

执行后,你会看到,照片的四周会一个5×5的边,如果你要一个凹下去的边,把-raise改为+raise就可以了。其实凸边和凹边看起来区别并不是很大。

其他
其他功能都是不太常用的,如果你感兴趣的话,可以看它的联机文档

import

import是一个用于屏幕截图的组件,下面列出的是我们常用的功能,其他的功能,你参考它的man好了。

截取屏幕的任一矩形区域

import foo.png在输入上述的命令后,你的鼠标会变成一个十字,这个时候,你只要在想要截取的地方划一个矩形就可以了

截取程序的窗口

import -pause 3 -frame foo.png

回车后,用鼠标在你想截的窗口上点一下即可。参数-frame的作用是告诉import,截图的时候把目标窗口的外框架带上,参数-pause的作用很重要,你可以试着把它去掉,对比一下,你会发现,目标窗口的标题栏是灰色的,pause就是让import稍微延迟一下,等你的目标窗口获得焦点了,才开始截图,这样的图才比较自然。

截取一个倾斜的窗口
如果想让你的截图比较cool,你可以把截取一个倾斜的窗口,方法如下:

import -rotate 30 -pause 3 -frame foo.png

截取整个屏幕

import -pause 3 -window root screen.png

注意,暂停了3秒钟,你需要在3秒钟内切换到需要截取的画面噢。

display

display应该是我们使用的最为频繁的图像处理软件了,毕竟,还是看的多

显示图片

display foo.png

如果你要显示多个文件,你可以使用通配符

display *.png

幻灯片

display -delay 5 *

每隔5个百分之秒显示一张图片

一些快捷键

space(空格): 显示下一张图片
backspace(回删键):显示上一张图片
h: 水平翻转
v: 垂直翻转
/:顺时针旋转90度
\:逆时针旋转90度
>: 放大
<: 缩小
F7:模糊图片
Alt+s:把图片中间的像素旋转
Ctrl+s:图象另存
Ctrl+d:删除图片
q: 退出

其他

ImageMagick还提供有丰富的编程接口,比如,你可以用php来调用它,用ImageMagick来生成验证码图片,效果非常棒。

ImageMagick还有一个小工具identify,它可以用来显示一个图片文件的详悉信息,比如格式、分辨率、大小、色深等等,你都可用它来帮你的忙。

如果你对命令行不太熟悉,你也可以在图片上单击,你会发现,通过鼠标你也可以完成图像的编辑。

ImageMagick的网站:www.imagemagick.org。这里是ImageMagick加工过的图片的例子。

Update an app in a matter of time & Solution (draft)

类似MSN, QQ等, 如果要在短时间内更新大量的客户端程序, 这个过程对于服务器端的压力是非常的大的, 在没有更多服务器的情况下, 下载策略尤为重要.

暂时拟定一个方案:

Auto Update

Agloco – Own The Internet

About AGLOCO

Do You Realize How Valuable You Are?
Advertisers, search providers, and online retailers are paying billions to reach you while you surf. How much of that money are you getting?

You Deserve A Piece of the Action
AGLOCO gets paid by companies to reach our Members through our Viewbar™ software.We give that money back to you.

Build the Community, Make More Money
Through our Referral Program, we reward those who are helping to build this Global Community. The bigger the community, the more money AGLOCO makes for its Members.

What’s the Catch?
No catch. Sign up, refer your friends, download the free Viewbar™ software and surf the Internet as you normally would.

Privacy Counts.
Your information will never be sold, rented,or shared with anyone else. Bulletproof privacy is a core commitment of AGLOCO.

Visit www.agloco.com for more information!

My Sniffer

最近写的一个Sniffer小程序,可以捕获当前用户上了哪些网。
(设置混杂模式部分参考网络文章,SocketInfo来自codeproject.com)

下载:http://www.mpfive.com/m/myapps/MySniffer.rar

使用方法:
1:拷贝下面的文件到你的工程下

HttpParser.cpp
SocketInfo.cpp
SocketInfo.h
define.h
SnifferManager.h
Sniffer.cpp
Sniffer.h
HttpParser.h
SnifferManager.cpp

2:在程序中 include SnifferManager.h
3:在你的程序中开启Sniffer的地方加入:

CSnifferManager *pSM = CSnifferManager::GetInstance();
pSM->StartSniffers();

4:程序关闭的地方加入:

this->ShowWindow(SW_HIDE);if(CSnifferManager::DestroyThreads())

       CSnifferManager::FreeInstance();

else

{

       PostMessage(WM_CLOSE);

       TRACE("// %s:%dn", __FILE__, __LINE__);

       return;

}

比如在OnClose中加入

void CMySnifferDlg::OnClose()

{

       this->ShowWindow(SW_HIDE);       if(CSnifferManager::DestroyThreads())

              CSnifferManager::FreeInstance();

       else

       {

              PostMessage(WM_CLOSE);

              TRACE("//%s:%dn", __FILE__, __LINE__);

              return;

       }

CDialog::OnClose();

}

Single Sign-On

单点登录,即Single Sign-On使得用户只需在一个Entry Point登录便可以在多个应用之间来回的切换,而无须再次登录,这样大大的增强的用户体验,最为著名的SSO的例子就是MS的Passport,想必大家已经体会到了SSO的便捷功能。

如果你Google SSO,得到的大都是WEB站点和WEB站点之间的SSO技术,对于Windows应用程序和WEB站点之间共享验证信息的技术几乎没有,目前IM软件中通常采用这样的技术,比如MS的Windows Live Messenger以及Tencent的QQ等。在这样软件中,用户只要在IM中登录,通过程序界面打开浏览器浏览WEB站点,就不需要再次登录了。

下面是我的一种解决方案:

比如用户要访问:http://www.googlestop.com/user/cp,这里假设用户名为:charry,密码为:123456,该密码MD5后为:e10adc3949ba59abbe56e057f20f883e。如果不考虑安全问题,我们可以把所有的信息都追加在URL中,比如:

http://www.googlestop.com/usre/cp/?uid=charry&passwd=e10adc3949ba59abbe56e057f20f883e

这样服务器端只要验证该用户名和密码是否都正确就可以判断来访者是否是个有效用户。但是这样做有很多缺点,比如:将用户名和密码的Hash值都以明文的方式呈现出来是个安全隐患,如果Cracker收集了这些信息将导致安全问题,还有,用户完全可以把这个URL复制出来,发给另一个用户,当另一个用户访问该URL时,他也被认为是一个合法用户。并且这个URL可以被保存下来,任何时候都可以再次使用,这么一来,Sign-In模块就形同虚设了。

如果我们把用户名和密码再次加密一次,是不是就不会导致安全性的问题了呢?回答是肯定的。针对上述的URL,我们可以把

http://www.googlestop.com/usre/cp/?uid=charry&passwd=e10adc3949ba59abbe56e057f20f883e

加密后再放到URL中。这里一定要保证的是此次加密是可逆的,否则发给服务器后,将毫无用处。注意,这里的加密算法是可逆的,我们假定选择AES算法。首先使用一个KEY将上述的URL加密,假设得到的密文是:

#$DKJFSDFSDFK(不可能这么短,只是假设)

这样我们把加密后URL,提交给 http://www.googlestop.com/redir/?q=#$DKJFSDFSDFK。服务器端通过把#$DKJFSDFSDFK解密后,就得到了

http://www.googlestop.com/usre/cp/?uid=charry&passwd=e10adc3949ba59abbe56e057f20f883e

这样它就知道用户要访问的URL、用户的ID、用户的密码等信息。

问题是,那个用于加密和解密的KEY该如何生成并告知服务器端?我们可以让程序在用户打开浏览器前,随机生成一个KEY,比如”sdfk7879#@”,然后用这个KEY加密上述的URL,然后马上在程序内部使用HTTPS协议把这个KEY发给服务器端,并保存到表中。当服务器端接到一个请求时,它首先去表中查询,是不是在短时间内(比如30秒)有一个KEY被发过来,如果有,就取得该KEY,并用KEY解密URL中得密文。接下来得事情就好办了。

上面的解决方法中存在一个隐患,如果在一个短时间内有大量的这样的请求,将导致大量的KEY被发到服务器的表中,那么服务器端如何分辨每个用户呢?解决起来也容易,在每次用户请求前,除了随机生成一个KEY外,我们再多生成一个GUID,我们把KEY和GUID一起发给服务器(HTTPS方式),作为两个字段,GUID为主键,同时明文的URL中,我们也加上这个GUID(假设为:19270efa-a213-4733-b117-bdeb4b4528a2)

http://www.googlestop.com/redir/?q=#$DKJFSDFSDFK&GUID=19270efa-a213-4733-b117-bdeb4b4528a2

这样服务器端就可以通过GUID来查找KEY了。

上面使用的是GET的方法提交,有可能会超过GET的长度限制,我们也可以用POST的方法,只是需要借助一个临时html文件来中转,好像QQ就是这么做的。

To be continued…

Page 6 of 6« First...23456

Switch to our mobile site