随笔 - 3  文章 - 2  trackbacks - 0
<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(1)

随笔分类

随笔档案

相册

收藏夹

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜

用delphi编写图片播放组件(原创)-----转载请写明出处
{ ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::  Author:pengyi    Email:pengyi.yi@126.com    ::
:: ::
:: Unit : UnitImagePlay ::
:: ::
:: Developer Team : Mdcl DevTeam ::
:: $Id: UnitImagePlay.pas,v 1.13 2006/07/13 08:22:24 Exp $ ::
:: ::
:: Created Date : 2005-12-8 ::
:: Last Modified: $Date: 2006/07/13 08:22:24 $ ::
:: Last Modifier: $Author:pengyi $ ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: }

unit UnitImagePlay;

interface
uses Messages, Windows, SysUtils, Classes, CutlineU,
Controls, Forms, ExtCtrls, Graphics, StdCtrls, Dialogs;
type
TXPImage = class;

TShowPicture = class(TThread)
private
Fidx: integer; {当时显示的数}
//I:integer;
FItem: TXPImage;
protected
procedure Execute; override;
public
procedure SetPicture;
constructor Create(Aowner: TXPImage);
end;

TXPImage = class(TComponent)
private
FActive: Boolean; //当前是否击活
FInterval: Integer;
//FTimer :TTimer;
FImgbmp: TBitmap;
//FImage: TImage;
FImage: TCutline;
FImageList: TImageList;
FshowPic: TShowPicture;
procedure SetActive(Value: Boolean); virtual;
procedure SetInterval(Value: Integer);
procedure SetImageList(Value: TImageList);
procedure SetImage(Value: TCutline);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Start;
// Procedure Pause;
//Procedure Continue;
procedure Stop;
property Active: Boolean read FActive write SetActive;
property Interval: Integer read FInterval write SetInterval;
property Imgbmp: TBitmap read FImgbmp write FImgbmp;
property ImageList: TImageList read FImageList write SetImageList;
//Property Image:TImage Read FImage Write SetImage;
property Image: TCutline read FImage write SetImage;

//Property showPic:TShowPicture Read FshowPic;
end;

implementation

uses
CommonU, DbugIntf;

{ TXPImage }

constructor TXPImage.Create(AOwner: TComponent);
begin
inherited;
FInterval := 800;
FImgbmp := TBitmap.Create;
//FImage := TCutline.Create(AOwner);
//FImageList := TImageList.Create(AOwner);
//FTimer := TTimer.Create(AOwner);
//FImage := TImage.Create(AOwner);
end;

destructor TXPImage.Destroy;
begin
if Assigned(FImgbmp) then
FImgbmp.Free;
//FTimer.Free;
//FImage.Free;
//FImageList.Free;
inherited;
end;

procedure TXPImage.SetActive(Value: Boolean);
begin
FActive := Value;
if (FshowPic <> nil) and Value then
FshowPic := TShowPicture.Create(Self)
else
FshowPic.Terminate;
end;

procedure TXPImage.SetImageList(Value: TImageList);
begin
FImageList := Value;
end;

procedure TXPImage.SetInterval(Value: Integer);
begin
FInterval := value;
end;

procedure TXPImage.SetImage(Value: TCutline);
begin
FImage := Value;
end;

procedure TXPImage.Start;
begin
FActive := true;
//创建线程
FshowPic := TShowPicture.Create(Self);
//FshowPic.Resume;
end;

procedure TXPImage.Stop;
begin
//FActive:= false;
if FshowPic <> nil then
begin
FshowPic.Terminate;
FshowPic := nil;
end;
end;

{procedure TXPImage.Continue;
begin
IF FshowPic<> nil then
begin
FActive:= true;
FshowPic.Resume;
end;
end;

procedure TXPImage.Pause;
begin
IF FshowPic<> nil then
FActive:= false;
end;}

{ TShowPicture }

constructor TShowPicture.Create(Aowner: TXPImage);
begin
inherited Create(false);
FItem := Aowner;
Fidx := 0;
FreeOnTerminate := true;
end;

procedure TShowPicture.Execute;
//var
// nTickCount: Cardinal;
begin
inherited;
while not Terminated do
begin
if FItem.Active then
begin
//Application.ProcessMessages;
synchronize(SetPicture); {注意此处}
Fidx := Fidx + 1;
if Fidx >= FItem.FImageList.Count then
Fidx := 0;
if terminated then
exit;
//Item.;
Sleep(FItem.FInterval);

// nTickCount := GetTickCount;
// while FItem.Active and (GetTickCount - nTickCount < FItem.FInterval) do
// Application.ProcessMessages;
end
else
begin
Suspend;
end;
end;
end;

procedure TShowPicture.SetPicture;
var
sMsg: string;
begin

//SendMethodEnter(Format('“%s” 播放动画中的设置图片', [FItem.Image.Caption]));
if FItem.Imgbmp <> nil then
begin
try
//SendDebug('开始从 Imagelist 中获取图片');
FItem.FImageList.GetBitmap(Fidx, FItem.Imgbmp);
//SendDebug('完成从 Imagelist 中获取图片');
//FItem.FImageList.GetBitmap(Fidx,FItem.FImage.Picture.Bitmap);
//SendDebug('开始从把图片给 Cutline 图片');
FItem.Image.SetImage(FItem.Imgbmp);
//SendDebug('完成从把图片给 Cutline 图片');
//SendDebug('开始刷新 Cutline');
//FItem.FImage.Refresh;
//SendDebug('完成刷新 Cutline');
application.ProcessMessages;
except
on E: Exception do
begin
sMsg := Format('错误位置:[%s] 类:[%s] 名称:[%s] 错误类:[%s] 错误信息:[%s]',
['播放动画' ,ClassName, FItem.Image.Caption, E.ClassName, E.Message]);
SendDebugEx(sMsg, mtError);
WriteLog(sMsg);
end;
end;
end;
//SendMethodExit(Format('“%s” 播放动画中的设置图片', [FItem.Image.Caption]));
//SendSeparator;

end;

end.

posted @ 2006-09-21 12:45 pengyi 阅读(726) | 评论 (2)编辑 收藏

有关英语学习的一点体会(原创) ----- 欢迎大家拍砖

               Beth
bethz@263.net
        (
转载请注明作者,否则保留追究的权力 )
   
记得我一个老师说过 “English is a friend that never betrays you.” ,既然如此,那么大家何不交这么一个朋友呢。下面我讲一讲自己有关英语的学习体会,多是个人的经验之谈,不一定就正确,欢迎切磋。
   
现在的时代,要学的东西太多,在时间有限的情况下,讲究一点实用主义没有坏处。所以就英语学习而言,也不妨有的放矢。英语学习的目的不同,作法的侧重点也有差异。下面我简单分为两类来谈: 1 。应试型。 2 。应用提高型。
一.   应试型
   
这种情况往往是被动的学习,而且时间上受到限制,多见于学校的等级考试与社会上种种名目的资格考试。因为主要是应付考试,甚至考完拉倒,所以更有必要讲究一点所谓的 技巧 ,免得占用太多的时间。
每种名目考试要求的层次不同,出题的风格也不同。所以为在最短的时间内取得最好的效果,不妨首先在这两个方面分析一下。多数考试都有多有大纲或指导之类的书籍,这些书多数还是发起考试的单位所著,这些书上面额往往写得很清楚:词汇量要求达到多少 ( 比如四级是 5000~6000, 六级 6000~8000 ,考个四级非要背 10000 词未免跟自己过不去 ) ,有的甚至还附一个词汇表;题型都有哪几类,听力、阅读、还有语法占的比例都有多大,难度和速度要求怎样,多数还都有考试样题作参考。做上一两套,稍微分析一下就能得出来的。比如国产的考试很注重语法和阅读。而国外的考试则更注重听力和读写,即使有语法题也出得非常简单。实在没有这种经典资料,也往往有 众人拾柴火焰高 性质的东西可寻,如 热心 的过来人写的经验心得(几乎各个方面的都有:比如阅读的体裁、题材、出题模式分析等等),甚至提供的第一手考试资料(如 GT 机经),这些也很管用的。虽然这本身反映了一种不合理的现象,但不妨入乡随俗嘛。这方面就不多说了。
二.应用提高型
   
这种情况多是为了提高日常交往英语能力或者某个专业领域的英语应用能力。往往个人的学习主动性更强一些,时间的随意性也较强。所以可以更好的作个规划,讲究一点循序渐进的科学方法甚至趣味性。
首先要说得一点:学好一门语言的法宝永远都是 使用 二字。但作为二外甚至三外的学者往往恰恰缺乏这样一个环境,也即缺乏语境。好在现在的社会条件,有了录音录像技术的帮助,借助于随身听、电脑电视等,还是较容易就能创造一个英语语境的,不一定非得到说英语的国家去。
   
下面首先按听、说、读(词汇)、写四个方面谈一谈,然后介绍一下学习资料选曲方面的内容,读者可以各取所需。
1
 
   
听是听、说、读、写四项中最容易的一个了。没什么捷径,多听!能一心一意的练习更好,但也不一定非得痛苦的固定在板凳上,这方面有一些比较轻松有趣的方式。听英文歌就是一个很好的途径。找些经典英文歌曲,什么 卡萨布兰卡 “Wind flower” 之类的,旋律优美又耐听。开始可以随意的一遍遍的听,听得比较熟了,还可以把歌词打出来,歌词对照着,理解一下意思,慢慢的,你会发现掌握了很多常见的发音,而且印象深,这对口语也有帮助的。除了歌曲,还可以找一些情景英语的段子,走遍美国就不错,口语说得很自然流畅( toefl 听力听起来也挺舒服的),不像国产的那么呆板可恨。没事就放一放,实在烦了,该干什么干什么(比如打扫卫生甚至看小说),放着它当背景音乐好了,潜移默化,一样有效果的(能对照一下原文效果更好。)。小孩子学语言不就是这样的嘛,它们也没有非常专注刻意的学,听多了,也就知道是怎么回事了。还可以找些趣味性强的英文片看看比如英文大片(带字幕的)、或《六人行》之类的肥皂剧。娱乐的同时得到提高,何乐不为?总之,不管采用何种方式,但只要磨耳朵够多,开始可能还体会不到,慢慢就有语感啦。对了,还有,选材的时候可以先选听速度慢些的,不然不懂的比例太多,会容易有厌烦情绪。(比如开始可以听 VoA English special( 美国之音广播中的慢速英语 ) ,到后来可以听听 VoA (正常语速)、 BBC (英国广播)之类的。只是用收音机不太好收,还总有噪音,网上倒有一些链接,还能凑合)
2

   
练习口语,就不像听力那泛泛也可以了。这个比较忌讳庞杂。否则只是变相的练了听力而已。最好选一个经典些的教材(如 900 句之类的,走遍美国也不错, TSE 的选题也不错),有针对性地、反复的练练习常用场景的惯用句式,如找人的,问路的等等这样,直到把常用的句式掌握纯熟。说得容易,做起来真需要克服一定的浮躁心理呢,我做得就很不好。常用句式掌握了,可再在此基础上扩展,学一些特定情景的惯用对话,什么办公室的、商务的等等。更高的层次就是俚语、谚语、流行用语了,个人认为这些是锦上添花的东西。
   
另外练习口语,一定要脸皮够厚,敢说。越是敢说,越能说好,从而形成良性循环。不练的话,任你阅读、听力、单词再好,再要出口表达时,你会发现自己连很简单的意图都难以组织。可惜大多数人都很难克服这个心理障碍,比如在英语角,张不开口,这样从一开始就被口语拒之门外了。那又有没有别的办法呢?有 :) 。那就是找一两个平时比较说得来的,又都迫切想要提高英语的。采用随时随地的方式,以随意的态度来说,英汉夹杂也可。这样次数多了,嘴巴就张开了,慢慢的也就有基础了。

   
有人可能会问,怎么说了这么多,还没提到词汇呢?我的体会是这样的:听说和读写可以说是完全是两个不同的方向,但是如果只是为了日常听说使用,真的没必要这么狠记单词。记得有个统计,口语常用词才 1000 多个。想一想,很多大字不识的人汉语不还是照样说的很流利?一个大学教授未必就能说得一个卖菜的文盲。语言的学习都是一个道理。
   
曾听过余敏宏一次讲座。余提到的一件事,让我印象非常深刻。他说有一次,发现他在美国的女儿,居然能将刚刚听到的一个挺长的新单词拼出来,从没有人教过她这个词的拼法!怎么回事呢?因为从小生活在英语环境中,英语说得很流利,语感很好,碰到一个单词的时候,她根据这个单词的读音,自然而然的就能把对应的字母拼出来了。而中国早期的英语教育(至少 80 年代前生人接受的教育),正好逆天而行,上来就是单词的拼法,语法。听说反而被轻视,结果本末倒置,费力不讨好,学出一批不实用的哑巴英语。今天再看小学生的英语教育,一上来就是听说,不正体现了教育部门在意识到这个问题后,教育方法的改进吗?可惜我们这一代,没赶上这好时候。

3
.读
   
读写 就不同了。单词对应到中文就是汉字,而不识字如何 读写 ”? 所以说到阅读,就有必要提到与之息息相关的单词了。
   
单词学习可以说也是分阶段的,一个阶段有一个阶段的词汇量要求。比如若为四六级考试,大学英语课的词汇量足够了,甚至不用刻意背什么四六级词汇,我大学最厌背单词。只要抓好阅读,当然为了考试,还要练习语法。但是,再往后,想要提高,你会发现很难突破了。就是你读的再多,听得再多,也很难有大的提高,你会发现你阅读、听力的层次徘徊不前,似乎一切努力都无用。
问题根源是什么呢?词汇量!也就是说,这时靠阅读方法等已不能克服单词造成的障碍了。要达到一个更高的层次,词汇量首先需要进阶了。这是我考 G 的过程中意识到的。在强迫自己极了大量似乎一辈子都用不着的单词后,发现自己阅读和听力速度和理解力都容易上去了。很多以前看见就头疼的科普读物也能读一些了。也是,很多 G 词汇是为读大学教科书准备的呢。 Gre 词汇还是有它道理的。
   
背单词本身而言,基本上是体力活,选书的话,如果带词根词缀分解更好(红宝 2 版就是这样的)。而一开始,词根词缀一类的知识还是起不了多大作用的。因为脑子里还没有积累一定的词汇量时,理论联系不了实际,这些词根词缀的东东根本用不上。往往是单词看得差不多了,自己开始有意识的总结时,在看有关词根词缀之类的知识,有种豁然开朗的感觉,这时再用就如鱼得水了。就象大学计算机专业时学的数据结构,操作系统之类的知识,学是学了,很多跟实践联系不上。甚至有时候还认为那些课程没什么用。等编程的实践做得、见得够多了,才意识到,哦,那些东西是这么有用的啊。
   
另外,如有特定的应用学科领域需求,还要有针对的补些专业词汇才好,如计算机英语、商务英语等等。
   
模糊记得一篇单词与阅读的文章,结合人脑思维的特点,觉得挺不错。大致意思是这样的:单词可以分为两类,一类是非常直观的,如 building,plant 等等人脑直接就能反映出是什么意思的,所以使用时,占用的人脑的 内存 较小 . 而另一类则是比较抽象的,如 philosophy, religion 等等,对这这种词汇,人脑在进行理解与使用的时候,往往要对该词的内涵外延做一些联想和记忆,大脑里需要开辟一个较大空间。所以如果一篇文章多是第一类直观的单词,就能很快的理解,阅读速度自然快。而若第二类出现的多的时候,就容易出现 转不过弯来 的现象,理解程度和速度自然就下来了。所以若能对这些抽象的词汇进行一下强化记忆,也是阅读加速的有效方法之一。那篇文章还对所谓常出现的抽象的词汇作了一个总结。 可惜这篇文章没能即时保存,后来再查也找不到了 :(
   
下一步就是句型。科普、文学等方面的文章难懂,除了专业词汇,主要难在长句上,有时一句话就是一个段落,定状补从句可能比主句还长,里面可能还套着定状补。常有这种情况:放眼看去,每个单词都懂,但放在一起就不知所云了,主谓宾怎么也找不出来啦。出现这种状态,那就说明只掌握基本的句型已经不够用了。需要补充一些复杂句式。说得挺恐怖,其实,这些所谓的复杂句式还是很有限的。《杨鹏 100 句》就总结的很好,基本囊括了科普文章里常出现的复杂长句类型。把它熟练掌握了,句型这一关也就基本 Ok 了。
   
另外阅读方法也很重要。这就跟中文文章类似,不同的体裁如说明文、议论文有着特定的展开模式。如议论文往往在每段的第一句或最后一句给出论点等等。网上这方面的东西就太多了,书也多,总结的又细又全,我就不赘述了。但是这些技巧性的东东,还是那句话,不从大量的实践中领会,还是水中捞月而已。
   
补充一点,做练习的初期,若能多看一些趣味性强的或比较经典的的文章段落更好。个人认为这个选材的过程很多教育专家们已经为我们做了。其实很多四六级模拟题的阅读选材达到了这一点,很多文章选段在内容、文彩方面很不错。若能在阅读的同时,若能同时注意领会在知识上的提高、获得欣赏美文一样的满足,就会产生培养对阅读的兴趣,变枯燥为乐事。若能忘我的投入,才是学习的最高境界啊。
4
.写
   
这是四项中要求最高的一项,最体现水准。就拿单词和句式来说吧,对之掌握的程度比阅读要求要高的多,也最容易出现眼高手低的现象。能够阅读内容、结构都较晦涩的文章,却未必能写好一篇最基本的三段式议论文。读的时候觉得句子这么写很顺畅、很地道啊。自己下笔的时候,就不知道意思该怎么表达,句型该怎么组织啦,往往出现 “Chin-english” (中式英语)的现象。怎么办呢?再练练句型基本功吧。另外,跟中文作文是相通的。小学上语文课,老师经常建议背好词好句。英文写作一样的。 学会唐诗三百首,不会做来也会偷 。这方面经典背诵书籍为《新概念英语》,在学校和单位遇到好多老师推荐它。可惜啊,虽然早就知道这部经典,迄今为止我才背了两篇,现在还忘得差不多了。写作也是有体裁之分,不同体裁有一些段落展开模式(如应付考试的议论文三段式),还有的体裁有一些特别的规定或模式如信函、简历等等。这个倒是相对比较好掌握的。
   
写这个方面的经验较少。我真是纸上谈兵了,不说了。

下面谈谈有关学习资料选取,这方面我的体会有两点:
1
.贵专不贵多
   
现在出英文辅导书的名人可真不少,徐国章、李阳、还有个什么刘毅。看的人眼花缭乱。其实谁的都行,怎么说呢。跟定一个,扎扎实实的练习才是最实际的。除了极少数特别经典(如新概念,趣味性、科学性、词句规范严谨等各方面都较过硬)的以外,别的都是 just so so, 选一套就行了,不必对某个专家特别捧场。所以我也就不特别推荐谁的书啦。要提的是,外语教学与研究出版社出版的外国语大学的书比较权威,学校大多选他们的书为教材,这点可以作为买书参考。
   
用书不贵多,而贵在专。公司一英语很棒的 海龟 介绍过,他最初练习口语素材仅仅是 900 句而已。有了烂熟的 900 句基础,日常的口语基本就能应付了。资料贪多无用。有的网友资料下了一堆,甚至本身就是英文版块的坛主,各种东东应有尽有。到头来却发现仅仅作了了储藏收集的工作而已,程度却不见长。
2
.循序渐进
   
其实就像我一个朋友说的,循序渐进的方法是最科学,长远看来效率最高的方法。我原来这方面做得不好,近来意识到这一点,所以还是说说这方面的想法,能给大家以启发或警示最好。
选材的时候要注意循序渐进。其实这个方面,学校教育提供的资料挺不错的。特别是听力方面。比如说吧,听力多分初、中、高级(如外研社的教材),从简单的句型、对话、小段落,到场景对话、短文,再到演讲独白等,各种类型的正式与非正式材料应有尽有。由浅入深、由慢到快。开始时,练听力约等于练习听单词,单词都听出来了,意思也就知道了。再往后,要慢慢注意总结常用说法,比如有的可能不很合语法规范等;注意语音语调不同,所表达意思的不同等。
   
虽然泛听能增强语感,但到了一定程度,会发现决平日里积累下来不少耳熟却不很明确意思的地方。这是进阶的关键时刻,须借助于精听了。有时精听时,容易出现精神涣散的现象,即使耳朵塞着耳机,放着很大声的英语,思想却不知跑到哪里去了,特别对于听 了的段子,更易出现这种情况。怎么办呢?好在还有 听写 (听力教材也常见这种题型)这招,能帮助克服这种障碍。 toefl 听力也是不错的精听材料。走遍美国趣味性强,可作为辅助泛听材料,当背景的那种。
   
单词方面,可以这样:四六级词汇 - 〉托福词汇 - Gre 词汇。这样一步一步来,有个缓冲,不至于太痛苦。
   
阅读材料要多选练难度适中的,偶尔穿插尝试一些难度高一点的。什么样的是针对自己难度适中的呢?一篇阅读文选拿在手中,随意抽查几篇文章。若是一篇文章几乎没遇到什么单词,几乎不假思索一遍就过,内容什么也能概括个八九不离十的,那说明选材太容易啦,没有挑战性,该换本深点的。若文章看下来,有一些生词很正常,但是不查它,或稍查几个也能顺过去;总有个别句子需要重复看上两三遍,但最后也能根据上下文把文章大意领略个差不多。那么这个难度就是适中的,比较适合当前阶段的学习用。等练到这样的文章也达到前面的那种程度了。那恭喜你,你已经有了可喜的进步,可以进阶啦!
   
要注意的是,千万不要上来就选些超出自己层次许多的,比如上来就啃原著,搞大跃进。也许有人说不是推荐看原著吗?那是对阅读 ( 包括单词 ) 功底已足够深的人说的。读原著确实是更原滋原味,特别是名著,语言或文彩绚丽或意味深长,对提高欣赏水平和作文层次有好处。但对初学者来说,读一句话化上十分钟查单词,根本无法领略这种好处。一步一步来,不断的收获小小的进步,其中的成就感对保持旺盛的斗志有好处。急功近利,无疑是在扼杀自己对阅读的兴趣和耐心。当然更难提长进。
   
顺便提一句:有条件最好备个文曲星,很方便哦,还可利用之抓住点滴时间背单词。我最没耐心查字典,特别是做阅读的时候查最不爽,本来一篇文章看了一半,查几个单词回来,看过的什么东东也忘得差不多了,特别是稍有难度的文章。文曲星查起来快多了。
   
另外,英语学习的持续性比较重要。特别是阅读,隔一段时间不看,再拿起来就不得不从一个低些的层次在往上进步,仿佛语感上出了断层。所以要尽量不间断,不然 逆水行舟,不进则退
最后一点,现在种种吹嘘的所谓学英语的捷径不少,似乎还没有哪个经得起检验呢。还是踏踏实实最明智。共勉吧!欢迎大家拍砖和切磋,尤其期待说、写方面有心得的,把你们的珠玉 show 出来吧!

 

备注:此文于 2004-7-28 首发于太傻论坛 - 〉英语综合学习讨论版

posted @ 2006-09-21 12:36 pengyi 阅读(366) | 评论 (0)编辑 收藏

[转]一个程序员如何月进万金的 

本人与大家一样,原来只是一个普通的程序员, 靠给软件公司打工谋生。后来感觉这样长期干下去没有什么前途,虽然现在年轻还可以加班加点靠拼身体吃饭,以后年纪大了怎么办?听说很多人自己单干每年靠共 享软件都可以赚几十万,我为什么就不行?仗着自己技术好,并且当时已经有了成熟软件的思路,我就辞职出来加入共享软件这一行当了。

   通过半年多的日夜苦干,软件终于编出来了。由于我觉得自己的软件功能比较新颖,编程的技术也很好,以为只要一发布就会大家抢着注册购买,也可以像那些成 名的共享软件作者一样每月坐拿几万元,结果却是令我想象不到的,在发布后的第一年,只有1个人注册,只得到可怜的几十元。我这下才认识到了软件推广的重要 性 — 我们作为技术人员,往往是重技术轻营销,结果是再好的软件也由于无人知晓而只能孤芳自赏。我这时就有意在网上搜索软件推广方面的文章,国内的资料少就到国 外的共享软件论坛去查,另外还结合自己在实际推广中的经验教训不断改进自己的推广技巧,慢慢地在第二年软件推广有了初步起色,拿到了一千多元。接连在共享 软件领域摸爬滚打了几年后,现在终于每月都有近万元入账。虽然比起那些共享大牛们来说这点钱还不足挂齿,但自己认为还算不错了。为了避免程序员们重走像我 当初的很多弯路,现在把自己的经验教训写出来,给大家在软件推广方面一点启示。

  第一、 对软件本身的要求。

  也许大家会觉得奇怪,不是讲软件怎么推广吗?怎么会讲起软件本身的要求来了呢?

  其实一点也不出奇,高楼万丈在于基础是否稳固。没有一个好的软件产品而去空谈什么推广,不要说很少有成功的,即使是推广出去了,客户拿到手之后也会有受骗上当的感觉,退货以及退款,再加上对你的软件的负面宣传会搞得你焦头烂额的。

   那么怎么才算是一款好的软件呢?首先你的软件要新颖独特,要有别的软件没有而大家又需要的功能。很多程序员常犯的一个毛病是,他们喜欢从自己的技术出 发,编自己喜欢编的东西,或者干脆就是卖弄自己的编程技术。其实作为用户来说,他们不懂也根本不会关心你的软件中使用了什么先进的编程技术,他们所关心的 是这个软件能给自己带来什么有用的东西。有些程序员没有自己的独特的思路,总是人云亦云,一看到网络上什么软件热门了,马上就进行仿造,现在不是QQ流行吗,他也跟着编一个聊天软件;不是FlashGet很热门吗,他也随着编一个下载软件。这样的软件能销出去才怪了呢。

   在这里我的经验是,如果你不知道编什么样的软件才能好销,你就站在普通电脑用户的角度来考虑问题。要一切从用户观念出发,要从用户的要求入手,只要是用 户需要的功能,那怕软件只有这一个功能,只要别人的软件还没有包含,你在这里就有成功的可能。例如周弈的MP3 CD Maker,功能并不复杂,但大家需要这个功能,而当时的很多流行软件如Nero等并不具有,因此他凭这一点就可以月进上万美金。

  还 有就是,软件本身必须尽可能完美,也就是没有什么明显的Bug。现在有许多人在软件还没有经过什么测试的情况下就急着发布,结果别人一用到处都是问题,这 样的软件给用户的印象很差,只会给软件造成很大的负面影响。 我的经验是,软件编好后至少要经过两个月的测试。不但是自己要彻底测试,而且要交给你身边的亲戚朋友测试,当然能交给普通的用户测试就更好了。也许你会说 别人会愿意这样做吗?我的经验是只要答应测试完后免费给他们正式版的注册码,他们是很乐意为你测试的。

  第二、 软件推广的常用方法

   首先,当然是把你的软件发布到大型的软件下载网站,如华军软件园、天空软件站等,至于那些成百个小型的下载网站嘛,就没有必要一个一个发布了。当初我也 想在这些小软件下载站发布,可很多根本就没有发布软件的页面。有的给个Email地址就算不错了(不过我用电子邮件发布软件后也像泥牛入海,杳无音信), 有的干脆只有一个QQ号码。其实据我观察,只要你在华军软件园、天空软件站等发布成功,就会有不少软件下载网站也跟着转载。这样也好,省去了我的不少时 间。

  其次,是要专门为你的软件建立一个网站。也许你会说,我不是已经把软件发布到其他网站了吗?为什么自己还要费力去做一个网站。原 因很简单,别人的网站是别人的,你自己必须也要专门有个网站来推广,同时这个网站也要负责搜集用户的信息反馈等,另外更重要的是:共享软件重在服务,你还 要依靠这个网站来对你的软件用户提供技术支持等服务。值得特别要提醒的是,你的网站要做得很专业,要使得用户进入你的网站后能产生你们有着强的技术能力的 印象。千万不要认为自己是做软件的,不懂得编网站,就随便制作一个对付了事。我有个朋友,下载某软件试用后曾经想购买正式版,可一进入作者的简陋的网页, 就没有了购买的欲望。因为你的网站做得差,容易使别人联想到你的编程技术以及服务也差。所以说,差的网站不但不能对你的软件起到推广作用,还相反可能把你 的潜在客户赶跑。

  其实既然你都能够编得出软件,要设计出一个网站也不应该是什么多难的事,关键还是在于你舍不舍得下功夫。如果你实在 没有时间学习编写网页,那就花点钱请专门的网页设计公司帮你制作一个吧。也许你又会说,那我没有钱怎么办。这里,我叫你一个密招(我轻易不会教给别人 的),去大型下载网站下载排名TOP 10之内的软件的官方网站中找一个最符合你软件风格的,用Frontpage 把整个网页照搬下来,把文字及图片换成你的,而保留原来网站的布局及CSS样式,这样一个专业的软件推广网站就诞生了。这一招我在当初也使用过,不过后来 自己学习了网站设计方面的知识后,就不断加以改进完善,早已经比原来的别人的网站都专业多了。

  网站有了之后,也不是就万事大吉了,网站本身也有个推广的问题。要根据你的软件,设计一些关键字,把这些关键字用在你的网站的标题以及网站内容之中,使得别人在用这些关键字在GOOGLE等搜索引擎上搜索时,能很快找到你的网站。当然,网站的推广不是我们这里要讨论的话题,你在网络上应该能方便地找到这些资料。如果你能把有关你软件的关键字做到GOOGLE搜索结果的第一页,那么恭喜你,你离成功不远了。
再次,是有关软件的广告宣传问题。

  有人会说了,那很简单,找一个流量大的网站如新浪、网易, 在上面打广告宣传不就得了。是啊,如果你每月能付得起几万元的广告费这样做当然无可厚非。不过如果你每月有几万元的收入,我看也就用不着靠共享软件吃饭 了。其实打广告是很有学问的,不是单单看网站的流量大小,而是要针对你的软件的潜在用户的情况来定。关键是你要仔细分析来该网站的浏览者是什么样的人,如 果与你软件的潜在用户群相同,及时网站的流量不是特别大,你也可以在上面打广告。这样你花的钱不多,但正中你的目标用户,广告的效果是很好的。
 
   我有个行业应用软件,一开始在一般的软件下载站打广告,但发现效果并不好,因为这些用户只是来寻找一些常用系统工具软件的,对我的软件并不感兴趣。后来 我发现有个软件商务网http://www.bizsofts.com 的浏览者与我软件的用户群相吻合,就在这个网站上打广告了。广告是文字类型的,在网站的“热销软件”栏目中,由于该栏目出现在软件信息的所有的页面中,所 以浏览量也不少。最主要的是广告费不贵,每月才100元,广告发布后效果很不错。现在也有人在做GOOGLE ADWORDS文字广告,不过我还没有试过。

  第三、 软件如何推向海外

  你的软件已经在国内推广了,还要不要走向 海外?回答是肯定的。由于国内存在对盗版解密等活动打击不力的问题,你辛辛苦苦工作出来的劳动成果,给别人破解后可能全部付诸东流。所以在国内防止软件被 破解是一个重大的课题,对付破解的问题我留到下一点再仔细讲。而在国外,由于对于盗版以及破解打击的力度较大,另外用户的正版意识普遍比国内要高,所以付 钱注册购买的人也相对较多。所以你的软件在国外推广是很有必要的。就拿我来说,现在软件收入的大部分就是来自海外用户。

  在海外推广软 件的第一步也与国内相类似,也要把软件提交到大型的软件下载网站。国外的大型下载网站主要有两个:一个是www.download.com ,另一个是 www.tucows.com 。与国内软件站不同的是,在download.com 上发布软件是要收费的,每提交一次要收79美金,UPDATE一次也要收79美金。如果你真想把软件推向海外的话,这笔钱是不能省的。因为 download.com 实在是太热了,名符其实是全球第一的软件下载站,如果不在这里发布,你会损失一大半的软件用户。另一个软件下载网站 tucows.com 虽然号称能免费发布,其实你如果真这样做的话,你会大失所望的。我有个软件,一月份就向 tucows.com 提交了,可是到六月份还没有发布,进入作者管理界面一查,是在 8340个待审查的软件中排第 1367 位,可能一两年后才有可能发布。后来干脆花了 59美元“插队费”,结果没过两天就发布了。

  另外,在国外一般都是找一家代理公司帮你收钱,每月定期寄支票给你。代理行业在国外已经 是一个很成熟的行业了,不用担心代理会不给钱你。比较大一点的代理有:www.RegNow.com 设施最完备的代理,需要开户费。www.Qwerks.com 免费开户,据说信誉极好。还有www.Shareit.com 也是一家不错的软件代理公司。 还有www.RegSoft.com 不过据说反映一般。

  除了把软件发布到这些下载或代理网站之外,你自己也要相应有一个英文网站。如果你的英文不是特别好的话,奉劝你找一个英语特别棒的朋友或干脆花钱请专业的英语专家翻译一遍再发布你的网站,否则你的网站不但起不到推广作用,还会给国外用户留下很差的印象。

   要想软件推向海外,除了以上介绍的方法之外,重视国外用户的反馈信息以及搞好服务也是特别重要的。我有个软件发布在 download.com 后,大约过了一个月看到上面有一个评论,把我的软件评价为最差,并且加了一大堆评语:说他虽然是个捷克人,英语并不是他的母语,却也发现了我软件中的英语 是terrible English ,充满了错拼的单词,不存在的单词等;另外软件打开以后,界面没有操作提示,根本不知怎么使用,功能也不完善;在1024 x 768的分辨率下无法满屏显示等。总之把我的软件贬得一无是处,用他的话来说是: Terrible, just terrible。

   一开始,我也觉得很灰心丧气,但后来我仔细一想,何不趁此改正Bug,并升级软件呢。由于在download.com中找不到评价者的联系方式,我就在 软件的注册者信息中找到他的Email地址,把我改正过后的软件电邮给他,并诚恳地请他继续指正我的错误。果然不久他就回复了我的EMAIL,在邮件中他 一条一条地指出了我的其他错误。我借此机会进一步更正错误并把软件升级到了2.0 ,使我的软件上了一个大台阶。总之,重视用户对你软件的评价及批评,积极面对用户的意见,这样即使是坏事也能变成好事。

  另外在国外, 是会遇到别人购买你的软件后觉得不满意而要求退款的。PayPal以及其他的付款方式都有几十天内不满意可以要求退款的条文。对于要求退款的用户,他如果 坚持要退是一定可以退的。所以一般都是根据用户要求直接就退给他,并告诉他Keep my software as a gift,反正他已拿到注册码了,你做什么都没用,不如来个顺水人情。即使他退完款后又来信要求你提供技术服务,你也要尽可能帮助他。能做到这点你的服务 才能算真正到家了。

  第四、 如何应对软件的破解

  在国内推广软件,你要面对的最大问题莫过于软件被破解了。很多软件作者反映说,原来软件在被破解前交费注册的人还不少,但被破解后收入就直线下降,连成本都收不回来。您想,有了免费的东西人们还交那个钱干什么?

   在这里,我借鉴了一个软件作者的防破解经验:发行1.0版时2.0版已经写的差不多的。发行1.0版时要把1.0版的防破解或者注册算法写的简单些等着 别人去破解。一但出现1.0的破解,等待几周,这几周的时间足以使网上1.0的破解版遍天下。然后,分析破解过程更改2.0版算法(层层加密,复杂再复 杂),虽无法根除破解但可以浪费破解者的时间和耐力!一般情况下,在网上一搜你的软件已经有破解版了(1.0的)新的破解者很少会再去破解,何况2.0版 本更复杂些。我的一个软件用了此法,推出一月后被破解组织破解,公开破解过程及注册算法,并做成破解教程。其实破解从某种意义上说是帮我宣传了软件。我在 一个月后推出早已经写好的新版本,还注册成了“特别版”以迷惑想要破解版的人。使用上述方法后至少在我更新了几次软件后的今天仍没出现破解。但在网上搜破 解版、特别版、注册版到处都是,可没一个是真的。其实一些破解高手只是想试探自己的能力,破解一个软件后,一般会把目标定在下一个软件上。不过如果你的软 件成为人手必备的工具,此法怕是不灵了。

  另外,从技术上讲也有一些防破解的方法。假设你的注册部分有300行,你可以分成30个 inline函数调用(一定要inline),func1(),func2()... func30(). 将他们随意放到程序的各个部分,一定不能放在一起。不要用Memcpy等常用系统调用拷贝注册码,尽可能自己写,像Memcpy很好写,性能差点无所谓。 经过编译后inline函数展开,注册部分和其他代码混在一起,他要写出注册机就很困难,因为要向在几十万甚至上百万汇编代码里找出有用的注册部分那简直 就像是在大海里捞针。另外注册码也不要放在一起,假设你的注册码是12位,千万不要用一个12位的数组放注册码,你可以在程序的不同位置定义12个全局字 符变量,每个放一位,这样注册码在内存就不连续了。最好再加密处理一下(简单的字符异或就可以),验证时再解密。只要破解者找不到你验证结束的地方,暴力 和Loader破解也没有可能。很重要的一点是不要用连续内存保存验证用到的变量,尽量将用到的验证临时变量分散定义在程序的不同处,再在验证中,不断转 移一些值到其他变量中,对付暴力和Loader会比较有效。没有必要用复杂的加密算法,更容易成为追踪的目标。只要你将注册部分隐藏的足够好,也没有漏 洞,你花1天写的加密算法,破解者可能会花100-1000倍的时间破解。大部分人都会放弃。你将注册做在一起,就像将你的财宝放在现代保险箱里,虽然非 常坚固难以解密,对于开锁高手两分钟就打开了。对于一些比较专业的破解者采用上面的方法也是很有效的但是,还是要避免一些低级失误例如:不要在内存中直接 出现注册码和明显的注册码比较部分不要给用户太多的有关注册验证的信息,也不要接收到注册码后立刻就进行比较。在软件的不同功能处实现验证时的好处还有就 是不会立刻执行到验证代码注册码,可以分多次验证,也可以分成几部分验证,还可以分成几层验证验证时,可以尽量多执行一些无用的操作,加上一些象递归之类 难于调试追踪的代码,但在其中要穿插实现软件功能的代码,否则人家直接就跳了过去。反正就是越不引人注意越好,亦即越乱越好。

  其实要想彻底防止破解也是不现实的,除了研究一下破解方法,在发布前加壳外,并采用以上所说的方法外,不断升级程序也是比较好的方法。

  总之,推广软件对于搞惯了技术的软件作者来说一开始会走一些弯路,但只要不断学习成功者的经验,不断吸取自己失败的教训,你也会成功的。最后,祝大家个个都成为共享高手。  

posted @ 2006-09-20 18:01 pengyi 阅读(201) | 评论 (0)编辑 收藏