隨筆 - 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 閱讀(747) | 評論 (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 閱讀(381) | 評論 (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 閱讀(209) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 弥渡县| 新乐市| 肥东县| 大洼县| 金乡县| 玉门市| 赣州市| 竹山县| 金阳县| 泌阳县| 慈溪市| 岚皋县| 定结县| 嘉善县| 太保市| 百色市| 江阴市| 海兴县| 麻城市| 西乡县| 金溪县| 康马县| 随州市| 堆龙德庆县| 永嘉县| 汉阴县| 积石山| 张家港市| 麟游县| 岚皋县| 山东| 大埔区| 寻乌县| 肇东市| 德化县| 郯城县| 北安市| 伊宁县| 施甸县| 万源市| 湖口县|