Sunday, 11. October 2009, 14:39:13
python
题目:
给定一个十进制正整数 N,写下从1 开始,到 N的所有整数,然后数一下其中出现的所有“1”的个数。
例如:
N= 2,写下1,2。这样只出现了 1 个“1”。
N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1
的个数是5。
问题是:
写一个函数f (N) , 返回1到N之间出现的“1”的个数,比如f (12)
=5。
书里面用数学归纳法列出公式,进行计算。
我没想那么多,直接用递归解决,看着没人家清楚,不过我可以说俺的代码简洁:0
def sum1s(C) :
iLen = len(str(C))
if iLen == 1 :
return 1
iFirst = C / (10 ** ( iLen - 1 ))
if iFirst != 1 :
return iFirst * sum1s(10**(iLen-1)-1) + 10 ** (iLen-1) + sum1s(C-iFirst*(10**(iLen-1)))
else :
return iFirst * sum1s(10**(iLen-1)-1) + C-iFirst*(10**(iLen-1)) + sum1s(C-iFirst*(10**(iLen-1))) + 1
if __name__ == "__main__" :
iResult = sum1s(9999999999)
print "result is %d" % iResult
Saturday, 10. October 2009, 13:21:09
erlang
当然总是可以在application中写上mnesia:start()诸如此类的代码,
不过yaws作为本着生成动态页面的webserver,本身具有启动mnesia的功能。
不过linux下都好说,windows下怎么调也不好使,上网google了一下,
限制还不少,不能指定绝对目录,路径还要加上double quote和single quote合起来
代码:
yaws -i -M "'path/to/db'"
Monday, 21. September 2009, 14:57:17
erlang
stdlib中不支持多List的zip函数,最多支持3个List,以下是我的尝试,支持锯齿List组
参数形式为L = [[L11,L12,L13,...],[L21,L22,L23,...],...[Ln1,Ln2,Ln3,...]]
-module(myzip).
%%-compile(export_all).
-export([zip/1,zip_longest/1]).
%%L = [[L11,L12,L13,...],[L21,L22,L23,...],...[Ln1,Ln2,Ln3,...]]
zip(L) ->
zip_tr(L).
zip_tr(L) ->
IniAcc0 = array:to_list(array:new(lists:min([length(I) || I <-L ]),{default,[]})),
Results = [lists:reverse(I) || I <- lists:foldl(fun zipfunc/2, IniAcc0, L )],
%%io:format("~p~n",[Results]),
Results.
zipfunc(Elem, AccIn) ->
%%io:format("~p~n",[AccIn]),
zipfunc_tr(Elem, AccIn, 1, length(AccIn)).
zipfunc_tr(_,AccIn,_Index,0) ->
AccIn;
zipfunc_tr([H|T], AccIn, Index, Count) ->
%%io:format("~p~n",[element(1,lists:split(Index-1,AccIn)) ++
%% [[H|lists:nth(Index,AccIn)]] ++ element(2,lists:split(Index, AccIn))]),
zipfunc_tr(T, element(1,lists:split(Index-1,AccIn)) ++
[[H|lists:nth(Index,AccIn)]] ++ element(2,lists:split(Index, AccIn)), Index+1, Count-1).
zip_longest(L) ->
zip_longest_tr(L).
zip_longest_tr(L) ->
IniAcc0 = array:to_list(array:new(lists:max([length(I) || I <-L ]),{default,[]})),
Results = [lists:reverse(I) || I <- lists:foldl(fun zipfunc_longest/2, IniAcc0, L )],
%%io:format("~p~n",[Results]),
Results.
zipfunc_longest(Elem, AccIn) ->
zipfunc_longest_tr(Elem, AccIn, 1, length(AccIn)).
zipfunc_longest_tr(_,AccIn,_Index,0) ->
AccIn;
zipfunc_longest_tr([],AccIn,Index,Count) ->
zipfunc_longest_tr([],element(1,lists:split(Index-1,AccIn)) ++
[[undefined|lists:nth(Index,AccIn)]] ++ element(2,lists:split(Index,AccIn)), Index+1, Count-1);
zipfunc_longest_tr([H|T], AccIn, Index, Count) ->
zipfunc_longest_tr(T, element(1,lists:split(Index-1,AccIn)) ++
[[H|lists:nth(Index,AccIn)]] ++ element(2,lists:split(Index,AccIn)), Index+1, Count-1).
输出:
4> L=[[l11,l12,l13],[l21,l22,l23,l24,l25],[l31,l32,l33,l34]].
[[l11,l12,l13],[l21,l22,l23,l24,l25],[l31,l32,l33,l34]]
5> myzip:zip_longest(L).
[[l11,l21,l31],
[l12,l22,l32],
[l13,l23,l33],
[undefined,l24,l34],
[undefined,l25,undefined]]
6> myzip:zip(L).
[[l11,l21,l31],[l12,l22,l32],[l13,l23,l33]]
Monday, 14. September 2009, 14:53:33
erlang
the source can be extented to solve N queens problem, just modify the macro.
-module(eightqueen).
-export([start/0]).
-define(N,8).
start() ->
[eightqueen(P,[],?N) || P <- lists:seq(1,?N)],
init:stop().
eightqueen(P,L,1) ->
case isvalid(P,L,1,length(L)) of
false -> false;
true ->
io:format("----------------~n"),
[output(L++[P],Col) || Col <- lists:seq(1,?N)]
end;
eightqueen(P,L,N) ->
case isvalid(P,L,1,length(L)) of
false -> false;
true ->
[eightqueen(P1,L ++ [P],N-1) || P1 <- lists:seq(1,?N)]
end.
isvalid(P,[H|T],Start,Len) ->
if
P =:= H ->
false;
abs(P - H) =:= Len + 1 - Start ->
false;
true ->
isvalid(P,T,Start+1,Len)
end;
isvalid(_P,[],_Start,_Len) ->
true.
output(L,Col) ->
lists:foreach(fun(P) -> if
P =/= Col ->
io:format("-");
true ->
io:format("Q")
end
end, L),
io:format("~n").
compilation:
erlc eightqueen.erl
execution:
erl -noshell -start eightqueen start
Saturday, 11. July 2009, 14:22:49
django, extjs
Ajax的处理都是异步的,所以想实现文件下载这种同步的操作,就比较捉襟见肘。
不过google了一下,找到了一个方法,当然不是完美
主旨就是提交一个request,在server端将文件生成好,然后返回文件名,
client端则在js中隐藏一个frame,将frame的src指向生成的文件(根据返回的文件名)
client:
Ext.Ajax.request({
url: '/csvoutput/',
success: function(r, o) {
obj = Ext.util.JSON.decode(r.responseText);
try {
Ext.destroy(Ext.get('downloadIframe'));
}
catch(e) {}
Ext.DomHelper.append(document.body, {
tag: 'iframe',
id:'downloadIframe',
frameBorder: 0,
width: 0,
height: 0,
css: 'display:none;visibility:hidden;height:0px;',
src: obj.filename
});
},
failure: function(r, o){
},
headers: {
'my-header': 'csvoutput'
},
params: { }
});
server:(django)
result = {}
result['filename'] = filename
result['success'] = True
return HttpResponse(simplejson.dumps(result), mimetype='text/javascript')
Tuesday, 30. June 2009, 10:12:46
django, extjs
extjs还真是方便,可惜是一个商业软件,不过按照opensource也可以免费下载
现在js framework是百花齐放百家争鸣,各有各的长处,各有各的不足。
jquery无疑是现在用户群最多的,可以他的代码我愣是没看懂(汗一个,还是我太弱)
倒是extjs不错,document写的也很清楚,代码也很oo,所以很容易懂得。
extjs+django的组合就很完美啦
extjs在前台做UI,通常客户端能实现的功能在单一页面都能很好的实现,
而且支持很多widget,还很pp,而且是以event driven的,业务处理只需要
告诉url和parameters就够了,剩下的交给django来处理好了。
django这边就更方便了,url config的正则表达式匹配,方便的不是一点半点
内嵌的ORM能够处理大部分业务数据处理,做到最后每个view只需要返回json
数据就够了。
几个注意的地方:
1.返回的json数据,如果是嵌套的话,就需要name mapping,不然store不能
正确读出数据。
2.store的baseparam可以提供request参数,初始化定义也行,在load的地方
用也行,不过考虑到灵活性,还是在load的地方指定比较好,因为初始化定义的
参数都是静态的,如果store的参数需要动态获得的话,初始化的时候,有些widget
可能还没有初始化好,这个时候可能取不到值。
3.combobox中valueField,displayField,hiddenName三个属性很重要。
4.取得页面的widget的方法,用get('id')和getCmp('id')都能取得,
后者按照组件的方式返回,能够获得更多的信息。
5.任何panel都支持tbar和bbar,这个很方便的,尤其是页面空间有限的话。。。
最后要说的是,所有提交都是ajax方式的,所以时刻考虑到提交的动作都是异步的
不能按照同步操作那样考虑问题,可能在出bug的时候,更好地发现出现问题的地方。
Friday, 19. June 2009, 15:30:58
django
用django尝试写了一个简单的业务类site,真是一波三折。
djangoproject上的doc中规中矩,到挑不出毛病,但是碰到
一些个性化问题,就捉襟见肘啦
1,虽然django1.0已经提供了formwizard了,应该很好用,
可惜我的要求比较变态,还是不能胜任,所以索性就用hiddenfield
来一个一个form传下去(formwizard后台其实也是这么做的)
2,ChoiceField定义的时候,并不能动态的获得显示记录集,这个时候
可以重载form或者ChoiceField构造函数,来为以后的动态设定留下钩子。
例子如下:
class XXXXXXForm( forms.Form ) :
def __init__( self, myqs, *args, **kwargs ) :
self.myqs = myqs
super(XXXXXXForm, self).__init__(*args, **kwargs)
list_xxxxx = forms.ModelChoiceField( queryset=None,
widget=forms.RadioSelect(), empty_label=None, required=False )
hidden_xxx_name = forms.CharField( max_length = 80, widget=forms.HiddenInput() )
hidden_xxxxxx_name = forms.CharField( max_length = 40, widget=forms.HiddenInput() )
def populate( self ) :
self.fields['list_xxxxx'].queryset = XXXXXXX.objects.filter( xxxxxx_type__code=self.myqs )
声明变量的时候,不要忘了紧接着调用populate
default = {'hidden_xxx_name':xxx, 'hidden_xxxxxx_name': xxxxxx}
form3 = DepartStationListForm( qs, default )
form3.populate()
Friday, 27. April 2007, 14:45:38
★QR Code 简介:
QR Code码是由日本Denso公司于1994年9月研制的一种矩阵二维码符号,它除具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点外,还具有如下主要特点:
普通的一维条码只能在横向位置表示大约20为的字母或数字信息,无纠错功能,使用时候需要后台数据库的支持,而二维条码是横向纵向都存有信息,可以放入字母、数字、汉字、照片、指纹等大量信息,相当一个可移动的数据库。如果用一维条码与二维条码表示同样的信息,QR二维码占用的空间只是条码1/11的面积。
QR 码 (2D 符号) 在横向和纵向上都包含有信息,而条码只有一个方向上包含有信息。QR 码能够包含的信息比条码多得多
点击按原始大小查看图片
QR 二维码比其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势。QR码的三个角上有三个寻象图形,使用CCD识读设备来探测码的位置、大小、倾斜角度、并加以解码,实现360读高速识读。每秒可以识读30个含有100个字符QR码。QR码容量密度大,可以放入1817个汉字、7089个数字、 4200个英文字母。QR码用数据压缩方式表示汉字,仅用13bit即可表示一个汉字,比其他二维条码表示汉字的效率提高了20%。QR具有4个等级的纠错功能,即使破损或破损也能够正确识读。QR码抗弯曲的性能强,通过QR码中的每隔一定的间隔配置有校正图形,从码的外形来求得推测校正图形中心点与实际校正图形中心点的误差来修正各个模快的中心距离,即使将QR码贴在弯曲的物品上也能够快速识读。QR码可以分割成16个QR码,可以一次性识读数个分割码,适应于印刷面积有限及细长空间印刷的需要。此外微型QR码可以在1厘米的空间内放入35个数字或9个汉字或21个英文字母,适合对小型电路板对ID号码进行采集的需要。
多到 7,089 数字可以被编码(下图为300 个字符或数字被编进这样大小的QR码里面)
点击按原始大小查看图片
同样的数据只有条码的十分之一大小
点击按原始大小查看图片
超高速识读:
从QR Code码的英文名称Quick Response Code可以看出,超高速识读特点是QR Code码区别于四一七条码、Data Matrix等二维码的主要特性。由于在用CCD识读QR Code码时,整个QR Code码符号中信息的读取是通过QR Code码符号的位置探测图形,用硬件来实现,因此,信息识读过程所需时间很短,它具有超高速识读特点。用CCD二维条码识读设备,每秒可识读30个含有 100个字符的QR Code码符号;对于含有相同数据信息的四一七条码符号,每秒仅能识读3个符号;对于Data Martix矩阵码,每秒仅能识读2~3个符号。QR Code码的超高速识读特性是它能够广泛应用于工业自动化生产线管理等领域。
全方位识读:
QR Code码具有全方位(360°)识读特点,这是QR Code码优于行排式二维条码如四一七条码的另一主要特点,由于四一七条码是将一维条码符号在行排高度上的截短来实现的,因此,它很难实现全方位识读,其识读方位角仅为±10°。
能够有效地表示中国汉字、日本汉字:
由于QR Code码用特定的数据压缩模式表示中国汉字和日本汉字,它仅用13bit可表示一个汉字,而四一七条码、Data Martix等二维码没有特定的汉字表示模式,因此仅用字节表示模式来表示汉字,在用字节模式表示汉字时,需用16bit(二个字节)表示一个汉字,因此 QR Code码比其它的二维条码表示汉字的效率提高了20%。
点击按原始大小查看图片
编码字符集:
1、数字型数据(数字0~9);
2、字母数字型数据(数字0~9;大写字母A~Z;9个其他字符:space ,$, %, *, +, -, ., /, :);
3、8位字节型数据;
4、日本汉字字符;
5、中国汉字字符(GB 2312对应的汉字和非汉字字符)。
QR Code码符号的基本特性
符号规格 21×21模块(版本1)-177×177 模块(版本40) (每一规格:每边增加4个模块)
数据类型与容量(指最大规格符号版本40-L级)
· 数字数据 :7,089个字符
· 字母数据 :4,296个字符
· 8位字节数据 :2,953个字符
· 中国汉字、日本汉字数据 :1,817个字符
数据表示方法 深色模块表示二进制“1”,浅色模块表示二进制“0”。
点击按原始大小查看图片
纠错能力
· L级:约可纠错7%的数据码字
· M级:约可纠错15%的数据码字
· Q级:约可纠错25%的数据码字
· H级:约可纠错30%的数据码字
以默认的M级(推荐使用默认的级别)为例,当图片损坏或编码部分被破坏时,仍然能够正确地识别出编码中的信息:
点击按原始大小查看图片 | 点击按原始大小查看图片
完好的图片 损坏的图片
结构链接(可选) 可用1-16个QR Code码符号表示一组信息
掩模(固有) 可以使符号中深色与浅色模块的比例接近1:1,使因相邻模块的排列造成译码困难的可能性降为最小。
扩充解释(可选) 这种方式使符号可以表示缺省字符集以外的数据(如阿拉伯字符、古斯拉夫字符、希腊字母等),以及其他解释(如用一定的压缩方式表示的数据)或者对行业特点的需要进行编码。 独立定位功能
QR Code码可高效地表示汉字,相同内容,其尺寸小于相同密度的PDF417条码。目前市场上的大部分条码打印机都支持QR code条码,而且在手机上的应用也在迅速发展。
Monday, 26. February 2007, 13:58:37
Programmers. The system administrators worship their bit twiddling capabilities. The users exchange vast quantities of beer for new features and tools. And the project managers sell their soul when they make the magic work. But inside the average programmer's psyche are several demons that need exorcising.
Pride
This is all too common in programmers. Instead of asking whether a particular function exists, or for the best way to retrieve data from the system, a proud programmer is likely to write their own. Especially when faced with a large, or unfamiliar, code base. By re-inventing the wheel there are now two very similar routines. Not only does this increase the code size, it doubles the amount of maintenance required, creates another opportunity for bugs, and adds inconsistency. Later, when another programmer sees these two functions, they will have to choose between them. Which one will depend on their mood (are they also too proud to seek help?), who's on holiday or who's outside smoking, at the time! This can equally be applied to duplicate constants, member variables or structures.
Envy
Programmers should improve themselves by learning from others, not blindly emulating them. All coding methodologies (be they syntactical or design-based) come with caveats. A programmer might inline a function with the pre-processor because he's seen it done elsewhere, unaware of potential side effects, as in this classic example.
#define SQUARE(x)x*x
Gluttony
Not an evening at the all-you-can-eat buffet, but the problem of writing too much code. Every hour spent coding will require an extra hour of testing, and possibly two more of maintenance. And guess who gets lumbered with the maintenance?
Worse still, this does not scale. A two-minute feature (or one line bug fix) may also take an hour to test. Whatever your gluttonous reasons are - attempts to impress, an under-staffed team, late night camaraderie, or personal pride - curb them. Spending the whole morning trying to unravel last nights two-minute feature is like the buffet - you get stuffed afterwards!
Lust
Programmers crave pleasure; they love to 'scratch their own itches'. If unchecked, some developers will write fantastic, innovative, original... and completely unnecessary, code. It could be a new graphics shader, a faster search algorithm or an entire processing engine! Make sure any code written is actually needed. Will it get used? Or will it distract the users who, in turn, add a new plug-in system, just to make use of the code? Is that particular search algorithm slow? Is it on the critical path? Do you need a new engine? Is middleware a viable solution? Have off-the-shelf components been rejected because it was "Not Invented Here"? Curbing programmer lust allows more time spent on the important tasks. Like the software.
Anger
Do not code out of anger. Do not ignore good ideas, regardless from where they come. If a more junior programmer has a solution to the problem in hand - discuss it. If it works - use it! The engine programmer should not be allowed to implement his own solution just because "He's the engine programmer".
Do not code out of spite. Lead programmers: love your coders. Code reviews, for example, should raise the ability of the whole team, and not be used for leads to show off, introduce new jargon, demonstrate obfuscated syntax or exhibit other prima donna characteristics.
Do not code out of fury. Programmers: love your leads. They distribute work because it needs doing. Don't work on somebody else's tasks because you're more suited, or believe it should have been yours. If you want to move into other areas of programming, talk to your lead. Develop prototypes at home. Employing enthusiasm in this manner will win more brownie points than ignoring the task list and schedule.
Sloth
Don't procrastinate! If a particular piece of code is uninteresting or difficult (like an obscure crash bug), more interesting tasks should be available to compensate. Also, make sure all the tasks are clear, consistent and given from one manager. Opposing requests from different managers will make one of them unhappy, and starting such a doomed task is no fun for anybody.
Greed
This final point is directed more towards management. Everyone should feel valued. Financially and metaphorically. This is especially true during crunch time, when even the most junior programmer can work out their hourly pay packet could be improved by working on the cold meat counter at Tesco! Paying for late night food goes without saying (I hope!), but an occasional pub evening also helps. This gets everyone out the office, showing that management aren't greedy with an employee's time, either. Leads should check for warning signs, like 'funny' comments in the code - "I'll do this properly when I get a fscking pay rise!!!". Follow Dilbert. Less money for staff does not mean more for management.
Naturally, the lead programmer should help prevent such sinful practises. But as responsible professionals, we should all try and curb the devil inside first.
Wednesday, 24. January 2007, 14:03:05
http://www.hanselman.com/blog/ScottHanselmans2006UltimateDeveloperAndPowerUsersToolListForWindows.aspx工欲善其事,必先利其器
不错的地方,值得去看看
Eric J Smith's CodeSmith
WinMerge
HightLight for Windows
NAnt
BusyBoxDotNet at a Glance
Tool
BusyBoxDotNet
Version covered
0.2.1
Home page
http://busybox.sourceforge.net
Power Tools page
http://www.windevpowertools.com/tools/22
Summary
An ASP.NET web-control library capable of showing a customizable message during time-consuming activities
License type
LGPL
Online resources
Quickstart guide, online and downloadable demo
Supported Frameworks
.NET 1.x until 0.2.1; NET 2.0 since 0.2.1
NxBRE at a Glance
Tool
NxBRE
Version covered
2.5.1
Home page
http://www.agilepartner.net/oss/nxbre/
Power Tools page
http://www.windevpowertools.com/tools/142
Summary
Software component for executing business rules expressed in XML. Usable in standalone or multithreaded systems.
License type
LGPL
Online resources
Documentation, online knowledge base (Wiki), forums
Supported Frameworks
.NET 1.1, 2.0
log4net at a Glance
Tool
log4net
Version covered
1.2
Home page
http://logging.apache.org/log4net/
Power Tools page
http://www.windevpowertools.com/tools/143
Summary
Application logging framework for .NET
License type
Apache License 2.0
Online resources
Mailing lists
Supported Frameworks
.NET 1.0, 1.1, 2.0
.NET Compact Framework 1.0 (1.0.5000)
Mono 1.1.13
Microsoft Shared Source CLI 1.0 Compatible
The NSort Library provides 15 different sort algorithms:
Bidirectional Bubble Sort
Bubble Sort
Combo Sort 11
Double Storage Merge Sort
Fast Quick Sorter
Heap Sort
In Place Merge Sort
Insertion Sort
Odd/Even Transport Sort
Quick Sort
Quick Sort with Bubble Sort
Selection Sort
Shaker Sort
Shear Sort
Shell Sort
TortoiseCVS/TortoiseSVN at a Glance
Tool
TortoiseCVS/TortoiseSVN
Version covered
1.8.25/1.3.2
Home page
http://www.tortoisecvs.org
http://tortoisesvn.tigris.org
Power Tools page
TortoiseCVS: http://www.windevpowertools.com/tools/13
TortoiseSVN: http://www.windevpowertools.com/tools/14
Summary
Provide GUI interfaces into CVS and Subversion via Windows Explorer shell extensions
License type
GPL
Online resources
User's guides, FAQs, mailing lists, bug and feature trackers
Related tools in this book
SVN 1-Click Setup, AnkhSVN
WinMerge at a Glance
Tool
WinMerge
Version covered
2.4.6
Home page
http://winmerge.sourceforge.net
Power Tools page
http://www.windevpowertools.com/tools/17
Summary
Quickly and easily track down differences in files and merge changes between versions
License type
GPL
Online resources
Documentation, mailing lists, FAQ, forums, bug tracker
Basecamp at a Glance
Tool
Basecamp
Version covered
N/A (online service)
Home page
http://www.basecamphq.com
Power Tools page
http://www.windevpowertools.com/tools/120
Summary
Manage your projects online with messaging, to-do lists, milestone lists, and more
License type
N/A
Online resources
Forums
Related tools in this book
Community Server, Subtext, FlexWiki
BugTracker.NET at a Glance
Tool
BugTracker.NET
Version covered
2.2.5
Home page
http://btnet.sourceforge.net/bugtrackernet.html
Power Tools page
http://www.windevpowertools.com/tools/159
Summary
Simple to set up and configure, easy to learn and use defect/issue tracker
License type
GNU
Online resources
Forums, bug tracker
Supported Frameworks
.NET 2.0
Related tools in this book
CodeTrack, Bugzilla, Trac
NHibernate at a Glance
Tool
NHibernate
Version covered
1.02
Home page
http://www.nhibernate.org
Power Tools page
http://www.windevpowertools.com/tools/128
Summary
Full-featured .NET open source O/RM tool
License type
GNU LGPL
Online resources
Mailing lists, forums, issue tracker, Wiki, development team blog
Supported Frameworks
.NET 1.1, 2.0
Related tools in this book
NPersist, ObjectMapper
Web Developer Toolbar for Internet Explorer
Web Developer Extension for Firefox
Provide great functionality in a browser, enabling you to outline elements, examine ID and class values for items, view and change CSS on the fly, and much more. Both tools let you look into the DOM, giving you a glimpse of the exact structure of the content you're rendering. These are perhaps two of the most critical tools for any web developer.
Web Development Helper
Enables you to view script errors, debug scripts, manipulate the DOM, and trace HTTP requests from the browser.
Drip
Lets you monitor allocation and management of DOM objects as your web applications are running. Helps you track object and memory usage over time, enabling you to isolate where problems are occurring.
DOM Helper
Provides a concise tool for working specifically with DOM objects in Internet Explorer.
W3C Markup Validation Service
WebXACT
HTML Tidy
Help you ensure that your sites contain valid markup, meet web standards published by the World Wide Web Consortium, and meet accessibility requirements. HTML Tidy also automatically corrects invalid markup.
Cropper at a Glance
Tool
Cropper
Version covered
1.8.0
Home page
http://blogs.geekdojo.net/brian/articles/Cropper.aspx
Power Tools page
http://www.windevpowertools.com/tools/169
Summary
Elegant screen-capture utility with many handy features
License type
Shared Source (see License.rtf in install folder)
Online resources
Author's blog, email
Showing posts 1 -
10 of 27.