Friday, October 17, 2008

Asynchronious call Delegate

参见 http://blogs.yodersolutions.com/net/?p=17
当我们声明了Delegate 变量(比如FooDelegate), 我们可以使用下面两种方法,来触发这个Delegate,
1. FooDelegate.Invoke(), 或者直接是FooDelegate().
2. FooDelegate.BeginInvoke().
第一种调用方法是同步执行这个delegate.
而第二种方式是异步执行这个delegate, 这个delegate会在另一个线程中被执行, 当前线程将继续执行其它代码. 需要说明的是, 一定要确保这个delegate有机会调用了EndInvoke(), 否则会有资源和内存泄漏.
异步调用的一个简单示例是:
subscriber.BeginInvoke(this, new EventArgs(), Callback, subscriber);
其中第3个参数是回调函数, 它的签名是AsynCallback delegate.当subscriber被执行完后, Callback会被调用.
其中第4个参数一定要是subscriber本身,或者是subscriber本身的一个wrapper, 这样在callback函数体中, 就能访问到subscriber本身来EndInvoke.


class Program
{
static void Main(string[] args)
{
EventPublisher eventPublisher = new EventPublisher();
eventPublisher.FooEvent += new EventHandler(eventPublisher_FooEvent1);
eventPublisher.FooEvent += new EventHandler(eventPublisher_FooEvent2);
Stopwatch sw = new Stopwatch();
sw.Start();
eventPublisher.AsynFireFooEvent();
Console.WriteLine(sw.ElapsedMilliseconds.ToString());
Console.ReadKey();
}

static void eventPublisher_FooEvent1(object sender, EventArgs e)
{
Thread.Sleep(100);
}
static void eventPublisher_FooEvent2(object sender, EventArgs e)
{
Thread.Sleep(200);
}
}



class EventPublisher
{
public event EventHandler FooEvent;


/// <summary>
/// synchronized invoke the all the subscriber services.
/// The process will return until all delegates executions are over.
/// </summary>
public void FireFooEvent()
{
if (FooEvent != null)
FooEvent(this, new EventArgs());
}


/// <summary>
/// Raising events asynchronously lets the event subscribers do their processing in another thread
/// and allows the thread that raised the event to continue processing.
/// </summary>
public void AsynFireFooEvent()
{
if (FooEvent != null)
{
Delegate[] subscribers = FooEvent.GetInvocationList();
foreach (EventHandler subscriber in subscribers)
{
//the 3rd arg should be a AsyncCallback type delegate. When one subscriber service will completed, the AsyncCallback method will be raised.

//the 4th arg should be the exact subscriber or subscriber wrapper, so that in callback function,
// we can access the subcriber to call EndInvoke()
subscriber.BeginInvoke(this, new EventArgs(), Callback, subscriber);
}
}
}



void Callback(IAsyncResult ar)
{
EventHandler raisedEvent = (EventHandler)ar.AsyncState;
raisedEvent.EndInvoke(ar);
}
}

Thursday, September 11, 2008

Best Free Anonymous Surfing Service

copied from
http://www.techsupportalert.com/best-free-anonymous-surfing-service.htm

There are many reasons people have for wanting to surf anonymously, ranging from simple paranoia in terms of protecting personal data, to hiding browsing activities from other users of a computer including parents, spouses, or even other organizations. Whatever your reasons for wanting to use anonymous browsing services, or criticizing others for wanting to use them, I will not debate the political, legal, moral, ethical and other reasons, but simply review the available technology. Be aware that most corporate networks will block the use of anonymous surfing activities at the corporate firewall. Corporate networks and internet links are after all the property of your employer and should never be misused in violation of corporate acceptable use policies, so don’t expect any help here in finding ways to circumvent firewall blocking.

The most obvious anonymous browsing application for most people is in internet cafes, on public terminals, using wireless or even wired access points away from home, or in fact, on any PC including your own, where you don't want to leave traces of your private surfing activities. Some other browsing activity cleaners exist that clear the cache, cookies, history and other traces, some are even available as a standard in most browsers, but anonymous browsing goes a step further. What attracts me is not so much the privacy aspect, but rather the security potential, because all of the anonymizing browser proxy based services create a secure encrypted connection between the PC you are using and the first anonymizing proxy server. This allows you to safely transmit information without little risk of local interception, making it ideal for surfing on open Wi-Fi networks, or in hotels while travelling.

Previously, secure surfing on such networks required the use of private VPN networks, generally an option only available to corporate employees, those with the available money to pay for it and the technically savvy. Now, using any of the Tor or JAP based browsers, any surfer can reap the same sort of security benefits for their browsing. Whatever the reasons anyone may have for using anonymizing browsing, commercial services that offer anonymity are doing well, and a number of both free and subscription based browsing applications and services have become available.

Two dominant services exist which provide the foundation for free, secure anonymous browsing. The JAP network was good enough that the German Police insisted in 2004, that a backdoor be put into the product to allow interception of child pornographers. This was done, but subsequently removed as a result of court action by the JAP development team. The alternative is Tor (The Onion Ring), which is a system that not only allows anonymous browsing but also anonymous P2P, email, IM, and IRC chat. Given the US Navy origin of Tor, the suspicion inevitably arises that this system may have a permanent backdoor, however, the source code is now publicly available so that suspicion can perhaps be set aside. More worrying was a raid by German police in September 2006 involving the seizure of some Tor servers in that country. Again, pedophiles were the supposed target, but who really knows.

OperaTor

OperaTor is my clear first choice, a portable version of Opera with an included and well integrated Tor engine that uses the free Tor network. OperaTor is small and relatively fast, using just 6Mb of memory for it’s Tor engine, 2Mb for the Polipo caching proxy, 3Mb for the OperaTor loader and 18Mb for Opera. In my experience, OperaTor is by far the fastest browser, even with multiple proxies on the Tor network so that the browsing trail is frequently changing for greater security. Some people don't like the fact that OperaTor is not released with source code available (at least not that we have yet located) which may influence the choice in whether to use it or not. I believe that unless a user is proficient in programming, or at least reading the development language of any particular application, this becomes rather irrelevant, unless some amount of comfort or security might be perceived in knowing that source is available and others might be checking it even if the user of the application can not read it personally. Even closed source projects that become popular generally receive enough user and peer scrutiny that most problems would be quickly exposed.

JonDo anonymous network

JonDo (previously known as JAP) is my second choice and is in some ways a more flexible option, in that it is simply a Java application that performs the role of a local (PC based) proxy server that redirects browser requests via the JonDo (formerly JAP) network. This allows the user to configure their choice of any browser rather than requiring a change to Opera. Unfortunately, being Java based means that the application becomes somewhat bloated, requiring 54Mb of memory just for the Java JonDo application, as well as another few Mb for the JAP engine, and then whatever additional is required for the web browser of choice. JonDo does have quite a nice GUI display which shows the strength of the anonymity based on the number of anonymizing proxy servers, and takes care of managing the random proxy changes for greater anonymity. A commercial service known as JonDonym has been introduced which uses dedicated servers to provide higher speeds, higher levels of availability and more security along with support for chat, ftp and ssh in addition to web browsing. Another offering from the commercial JonDonym group is JonDoFox, a customized version of Firefox with JonDo code embedded along with other anonymizing optimizations. Unfortunately, JonDo not being a network like Tor is prone to some limitations in terms of the numbers of free servers, and some subsequent downtimes may be more likely with the smaller server base.

Vidalia using Tor anonymizing network

Vidalia is my third choice, a close match to JonDo in that it is quite a bit lighter in memory use and generally feels faster, but may not have the same level of anonymizing as JonDo. Vidalia is another integrated package using a combination of Privoxy and a Tor engine to connect to the Tor network, but it offers many new features. As with JonDo, Vidalia behaves as a local proxy for use by any browser, but it also provides configurations allowing it to run either as a simple standalone process or as a Windows service (for security and performance reasons, among others). Vidalia allows the user to participate in the anonymizing process by becoming a Tor Relay to help censored users in a similar way to becoming a BitTorrent relay, and a live realtime facility is available showing a map of the earth with lines representing connections to the Tor server participants. Vidalia uses 24 - 32Mb of memory, with an additional 4Mb used for Privoxy and another 16.5Mb for the Tor engine. One initially confusing aspect of Vidalia is that it provides a configuration access through port 9051, but it is not immediately obvious that Privoxy is listening on port 8118. Browsers using the Vidalia bundle must be configured to use the Privoxy port 8118 as the proxy server, not port 9051. Like JonDo, the Vidalia/Privoxy combination constantly changes proxy servers to mask the trail to provide greater anonymity.

Whatever your preference, both JAP and Tor networks offer a level of secrecy that is better than many commercial systems, though they are not watertight. Expect your surfing to slow down, in some case substantially, because you'll be relayed through a chain of servers, all heavily impacted by BitTorrent users seeking to hide from the RIAA. Note: the latest V5 release of JAP now allows Tor users to use JAP as a software access point to the Tor network.

XeroBank Firefox based browser

The XeroBank Browser (previously known as TorPark) provides a new customized version of the Firefox browser configured to work with the free Tor anonymizing service, or with a subscription service for higher speeds using dedicated servers, and other features. Firefox users may feel more comfortable with XeroBank, as it is based on Firefox, but also need not make any changes at all if they make use of either the JonDo or Vidalia bundles to access the Tor engine other than to set the proxy server, and of course, manual cleanup of the cache, cookies and browsing history after use. XeroBank claims to have many advanced features, but for the average user most of these may not be apparent, unless the subscription service is used. While the XeroBank browser is free to use on the Tor network, the XeroBank web site promotes the use of their subscription-based account. During installation, the XeroBank Browser offers the choice of using either the commercial XeroBank Client or the free Tor service. Caution! Some antivirus scanners report trojan infected code in the XeroBank download. Use http://jotti.org to verify all downloads, and use XeroBank and all other applications with caution, but be aware that some of the virus scanners used by jotti.org may also be overly zealous in their reporting of infections. Some claimed virus or trojan infections in various applications are no more than firewall detection, or software product key reporting capabilities mis-diagnosed by the scanner as a potential threat.

The downside of XeroBank as contrasted with using JonDo or Vidalia, is that you would need to use XeroBank for anonymous browsing and your regular browser for other surfing. Using JonDo or Vidalia, you can use the browser of your choice, and just reconfigure to use the proxy when you want to anonymous surfing. This won't automatically clean out all other personal data (cache, history, cookies etc.) when the application is shut down, which OperaTor and XeroBank do.

UltraSurf browsing proxy

A final item for review recently brought to my attention by Peter, one of our visitors, is UltraSurf, which seems to be primarily targeted at people in China wanting to circumvent official government internet censorship. We will not get into the politics or ethics of either the censorship or circumvention of censorship, however the facility exists and may be useful to some people. UltraSurf is a very simple application, a single tiny 281Kb download containing just one executable, u.exe. When running, this little program uses just 7.5Mb of memory and performs the same role of proxy server as other applications, redirecting all browser requests via the UltraSurf proxy servers. While this is an interesting new development claiming to be very sophisticated, it seems on the surface to be rather simplistic, and does not appear to change proxy servers in the same way that JAP and Tor do. Browsing speeds also seemed to be somewhat slower than with either Tor or JAP browsing. The program appeared to be clean on a http://jotti.org virus scan, other than one possible trojan reported by F-Prot, so as with all software, while it appeared to be safe on my tests, test it out and scan it yourself. By default, UltraSurf changes proxy settings and launches Internet Explorer when it starts, but I was able to shut down Explorer and start FireFox and Opera with the proxy reconfigured to use the same port and successfully browse via UltraSurf.

For all anonymizing services, check that you are running in anonymous mode by first browsing to one of many servers which reports your IP address, for example http://www.whatismyip.com/ and take note of your IP address. Reconfigure your browser to make use of the anonymizing service, and reload / refresh the browser and verify that the reported IP address has changed. Some IP reporting servers will also tell you which country, and even which city you now appear to be connecting from.

Most of the services reviewed are able to run directly from a USB flash drive if the executables are simply copied as is from their installation directories. This works really well, just plug your flash drive into any PC with a USB port, launch both the anonymizing proxy software and a browser, set the browser to redirect via the anonymizer and you will be in business. In the case of both OperaTor and XeroBank, all you need to is launch the browser from your flash drive and you will be ready to start browsing.

XeroBank XBMachine Live CD running under QEMU virtual machineWhile some 'LiveCD' applications such as XeroBank Machine and Incognito Live CD have been created and may provide similar functions, they mostly seem to be currently released in various stages of alpha or beta test versions and have bugs or limitations. For example, the XeroBank Machine provides two options. You can either run the xBMachine.exe from a Windows prompt which starts a QEMU virtual machine and then runs a GenToo Linux kernel, or by booting from a "Live CD". This Live CD boots the same customized GenToo Linux environment from CD without any Windows involvement. In simple terms, both xBMachine options simply provide a different "hardened" OS platform to run the Firefox based XeroBank Browser. Is LiveCD really useful? To some people, yes, not to me. It does mean that like SandBoxie, your guest operating system is protected from malicious web sites via your browsing, and when you stop the QEMU virtual machine or reboot the PC from hard disk rather than CD all traces are removed. I am a Unix / Linux geek so I am totally at home with them, but for the average person, I suspect the LiveCD and QEMU based options will provide a confusing level of complexity that will just interfere with their browsing and desire to be safe. Not much can beat truly safe browsing habits, whatever browser or add-on tools you use. xBMachine is a 380Mb zip file download, which unpacked yields a 391Mb ISO image to create a CD as well as another 10Mb or so of the QEMU environment. The QEMU hosted browser uses 292+Mb of XeroBank XBMachine Live CD running under QEMU virtual machinememory, requires the ISO image present, and took more than 5 minutes to load and be ready for use on a 1.8Ghz dual core Intel PC with 1Gb or memory. It provides a Linux X-Windows GUI with a profile configuration, a network configuration, xBBrowser, e-mail, Pidgin instant messenger, terminal and an option to configure for the paid subscription network. I don't know about you, but I am not willing to wait 5 or more minutes and have close to 300Mb of disk space tied up in a browser that took another minute or two to load, and then in my case never managed to connect out anyway. For those who feel that having source available makes a better product, go ahead and try to download the XeroBank source. All of the links gave me a 7Mb source zip file which was corrupted and would not open. Would this give you "open source available" feelings of security? I don't think so.

I'm a freeware and open source fan, I can read and write programs, but not when the source file is corrupted, and I am not likely to start poring through tens of thousands of lines of code even if I could unpack the source. Even if it does unpack, how do we know that exact source was used to build the tool, and not another set of customized source with a built in Trojan or spyware? The reality is that we really don't know unless we both inspect the source code and then compile it and compare the distributed executable.

One final comment on anonymizing, your browsing activities will never be 100% secure and guaranteed to be anonymous. It will be very difficult for anyone to trace you while browsing through the Tor network, except as reported in the Tor wiki, "when you access pages that use Java, Javascript, Macromedia Flash and Shockwave, QuickTime, RealAudio, ActiveX controls, and VBScript are all known to be able to access local information about your operating system and local network. These technologies will work over proxies and can tunnel the information back to their source."

Product Details

JonDo
Website: http://anon.inf.tu-dresden.de/index_en.html
Download Link:
http://anon.inf.tu-dresden.de/download_en.html
Author:
JonDo is a software development within the Project Anonymity in the Internet sponsored by the German Research Foundation and the Federal Ministry of Economics and Technology. The Project works closely with the Independent Center for Data Privacy Schleswig-Holstein.
Current version:
00.10.003
Version date:
-n/a-
License:
Freeware
Download File size:
15.8 Mb
Operating Systems Supported:
Windows 95/98/Me/NT/2000/XP/2003 Server/Vista,
Macintosh, OS/2, Linux/Unix
Additional Software Required:
Java (downloadable from http://sun.java.com) Tor is included in the zip file and integrated. After installation use your choice of browser, and for complete privacy remember to clean out the cache, cookies and history when finished.
64 Bit Capable:
No specific 64 bit version is available, however it should run without problems on 64 bit environments.
Portable Version Available:
Yes
Non-English languages supported:
German, French, Dutch, Czech and Russian.
Other relevant information:
None

OperaTor
Website: http://archetwist.com/en/opera/operator
Download Link:
http://archetwist.com/en/opera/operator - direct links are best avoided as new versions make old links redundant.
Author:
Arche Twist
Current version:
3.2
Version date: August 29, 2008
License:
Freeware
Download file size:
7 Mb
Operating Systems Supported:
All Windows
Additional Software Required:
None, Opera 9.5.2, Tor 0.2.0.30 and Polipo (caching proxy) are included in the zip file and integrated into OperaTor
64 Bit Capable:
No specific 64 bit version is available, however it should run without problems on 64 bit environments.
Portable Version Available:
Yes, download the zip file and unpack it.
Non-English languages supported: Yes, many.

Tor
Website: http://www.torproject.org/
Download Link: http://www.torproject.org/download.html
Author:
Tor Project
Current version:
0.1.2.19
Version date: January 17, 2008
License: BSD Freeware (information on website)
Download file size: 6.6 Mb
Operating Systems Supported: Windows 95/98/Me/NT/2000/XP/2003 Server/Vista,
Mac OS, Linux/Unix
Additional Software Required: None. After installation, use your choice of browser, and for complete privacy remember to clean out the cache, cookies and history when finished.
64 Bit Capable: No specific 64 bit version is available, however it should run without problems on 64 bit environments.
Portable Version Available: No
Non-English languages supported: French, Italian, Spanish, Portuguese, Swedish, Dutch, Suomi, during installation with all the same and a number more supported during operation.

UltraSurf
Website: http://ultrareach.com
Download Link: http://ultrareach.com
Author: UltraReach
Current version: 8.9
Version date: July 4, 2008
License: Freeware
Download file size: 201 Kb
Operating Systems Supported: All Windows
Additional Software Required: None, it uses Internet Explorer by default, but you after installation, you can use your choice of browser, and for complete privacy remember to clean out the cache, cookies and history when finished.
64 Bit Capable: No specific 64 bit version is available, however it should run without problems on 64 bit environments.
Portable Version Available: Yes, download the zip file and unpack it.
Non-English languages supported: None

Vidalia
Website: http://vidalia-project.net
Download Link: http://vidalia-project.net
Author: Vidalia development team
Current version: 0.1.6
Version date: July 8, 2008
License: Freeware
Download file size: 7 Mb
Operating Systems Supported: All Windows
Additional Software Required: None, Tor and Privoxy are included in the installation file and integrated. After installation, use your choice of browser, and for complete privacy remember to clean out the cache, cookies and history when finished.
64 Bit Capable: No specific 64 bit version is available, however it should run without problems on 64 bit environments.
Portable Version Available: No, however it can be copied after installation. Privoxy will need to be launched manually, and the location of Tor will need to be changed in the Vidalia configuration if it is copied to a different location that where it was installed.
Non-English languages supported: Yes, Bulgarian, Finnish, French, German, Russian, Simplified Chinese, Swedish.

XeroBank Browser
Website: http://www.xerobank.com/xB_browser.html
Download Link: http://update.xerobank.com/distro/XeroBank/xB-Browser_latest.exe
Author: XeroBank
Current version: 2.0.0.14b
Version date: March 4, 2008
License: Freeware, however a subscription service is available which provides additional features and dedicated high speed servers.
Download file size: 10.4 Mb
Operating Systems Supported: Windows NT and Later
Additional Software Required: None
64 Bit Capable: No specific 64 bit version is available, however it has been reported to run without problems on 64 bit environments, but the homepage blog also reports some 64bit problems.
Portable Version Available: No
Non-English languages supported: One user has reported that 36 different languages are supported, though I have not yet personally verified this statement.

Incognito LiveCD
Website: http://anonymityanywhere.com/incognito/
Download Link:
Author:
Current version:
Version date:
License:
Download file size:
Operating Systems Supported:
Additional Software Required:
64 Bit Capable:
Portable Version Available:
Non-English languages supported:

Thursday, August 21, 2008

svn authorization

预先的环境是: svn server的IP是: 11.12.13.14, OS是windows 2003 server. repository的目录是D:source, 我们在该repository下建立了两个项目, 分别是Project1和Project2. 建立repository的过程, 见这个blog
常用的Svn访问协议有三种, 第一种是file协议, 第二是svn协议, 第三是https协议.
https协议比较适合于跨广域网的项目开发, 需要有apache的支持, 所以配置比较复杂一些, 可参考网络上的文章 .

  1. Setting up an ASP.NET website development environment using Visual Studio .NET, Subversion, and Windows XP http://www.codeproject.com/KB/aspnet/Subversion.aspx
  2. HOWTO: Subversion for Windows with Apache server - a beginner's guide [version 0.4] http://svn.spears.at/
  3. Setting Up Subversion for One or Multiple Projects http://www.linuxjournal.com/article/7655
file协议最适合一个人的项目, 设置非常简单, 你在你本机开一个svn server, 同时在你本机创建一个repository. 你的svn客户端就可以用file协议访问repository了. 也可以多人一起用, 但必须将repository 的目录共享出来, 所以安全性很差, 不建议在多人项目中使用这种模式.
本机file协议访问project1的url是 file:///D:/source/project1 .
如果是局域网访问的话是, file:/// .12.13.14/source/project1
Svn协议比较适合于局域网内部多人项目的开发, 在svn server建立了一个repository之后, 我们就可以使用svn协议了, URL是 svn://11.12.13.14/source/project1 ,这是因为缺省情况下, 这个repository已经被开启了匿名读权限了, 但写权限被关闭了. 所以任何人都可以读取这个repository的内容. 我们需要为每个人定制不同的访问权限. 需要修改这个repository目录下的三个文件, 它们都在D:harrysourceconf下.
(1) svnserve.conf文件, 你需要处理掉4个label的注释, 分别是authz-db和password-db和anon-access和auth-access.需要注意的是, 确保每行前边没有多余的空格, 否则当你访问svn会报错. 另外最好为realm这个label设置一个有意义的名称, 因为svn client连接server时候, 会显示server的realm名称. 同时如果你想让多个repository共用同一组用户账号, 可以将这几个repository的passwd文件指向同一个文件, 可以使用相对路径来指定passwd文件(相对路径是基准是conf目录), 也可以用绝对路径来指定. 需要注意的, 路径必须使用unix风格的分隔符/, 而不能是.

(2) passwd文件, 在[users]section下定义用户和密码, 每个账号一行,用户名和密码用=号分隔 .
(3) authz文件, 这是最关键的配置文件. 下面是authz文件的配置:
[groups]
Prj1_Dev_Team=harry,helen
Prj2_Dev_Team=tom,peter
Test_Team=sally,mark
QA_Team=andy

[/]
*=r #所有人都能读取这个repository
harry=rw #harry具有这个repository的读写权限

[/project1]
#*=rw #取消所有人的读写权限
@Prj1_Dev_Team=rw
@SE_Team_QA=rw

[/project2]
#*=rw
@Prj2_Dev_Team=rw
@SE_Team_QA=rw
@Test_Team=rw

Saturday, August 16, 2008

Registry requisite tools

Regsnap -registry and windows system folder snapshot tool and analysis tool.
RegMon.exe--product from sysinternal company, it is free tool

Friday, August 15, 2008

SMS sending service for Exchange server

BlackBerry有一个Push mail的功能, 当你有新邮件时候, Blackberry enterprise server(BES) 就将邮件以数据形式发送到你的BlackBerry手机中. 由于在中国, Blackberry的套餐费高的离谱, 同时能提供push mail的邮箱必须是电信运行商的邮箱, 不能是你的企业邮箱账户.
如果能开发一个专门针对企业的Exchange server的短信提示服务器, 市场应该也不错. 首先终端不限(因为所有的手机都有收发短信的功能), 其次你所用的邮箱仍然是你的企业邮箱.
1. 功能

  • 当某个邮件账户接受到新邮件时候, 通过短信将邮件发送到对应的手机上(包括邮件的标题, 附件的大小, 邮件在SMS 服务器上的ID号, 以及简要的邮件body)
  • 用户可以用短信来控制邮件的转发, 比如将邮件转发到其他邮箱中.(通过短信回复前面说的那个ID到sms 服务器)
  • 用户可以通过短信来删除这个邮件(通过短信回复前面说的那个ID到sms 服务器)
  • 用户可以通过短信或网站或Msn机器人来管理邮件短信提示, 包括开启和关闭短信提示, 包括获得操作帮助.

2.目标客户
大企业, (有自己的Exchange mail server)中重要的人物, DBA, CEO, CFO这些人对于某些邮件往往很重视, 比如DBA对于DB的故障邮件, 商务人士对于重要客户的邮件.

Monday, August 11, 2008

routine tortoisesvn operations-2

我自己写了一点关于svn的常用功能, 见http://focuswindows.blogspot.com/2008/08/routine-tortoisesvn-operations-1.html


以下内容摘自http://blog.csdn.net/iNarcissuss/archive/2007/09/16/1787411.aspx

Check-out(检出) 和 Export(导出)
+-------------------------------------------------
从 服务器取得 最新版本(Subversion术语--Head Revision)或某个历史版本的拷贝 复制到本地的某个目录,这个本地的目录有个Subversion专门的术语---working copy(工作拷贝),working copy的特点是自动与服务器关联,并受服务器的版本控制。
所以Subverion的CheckOut相当于VSS的 设定工作路径+签出 。
与CheckOut类似的一个命令是------Export(导出),它能将某个版本复制一份到本机的某个目录,与CheckOut不同的是,这个目录不是woking copy,Export(导出)
后就与服务器没有任何关系了,当然更不会受服务器的版本控制。
TortoiseSVN会在是working copy的目录上加上各种标志,而Export的目录不会有任何标志
SVN Update(SVN 更新) & Get Lock
+-------------------------------------------------
最常用的命令,你可以只CheckOut一次,但是最好经常update,特别是在你修改之前尤其特别一定用Update,以保证本地工作拷贝与服务器项目版本库一致。它的功能是
,从服务器取得最新版本跟新本机工作拷贝,相当于VSS的Get Latest Version,如果习惯VSS,并且对SVN的复制--修改--合并模型不放心的话,可以在Update之后,马上使用
“获取锁定”命令,它的作用是使的别人不可以修改你正在修改的文件,以避免冲突。
Import Export (导入 导出)
+-------------------------------------------------
Import是一种快速批量向服务器添加文件的方法,如果你像把本地的文件或文件夹添加到服务器的某个目录下面,那么在本地目录中,右单击选择Import命令,然后
设定URL即可,这是从别的版本管理系统向VSS迁移的一种方法,在版本浏览器上单击某个目录,会有加入文件和加入文件夹的命令,其中加入文件一次只能加入一个文件
加入文件夹只能加入该文件夹下的所有文件,不能加入子文件夹,你可以根据实际需要使用.需要注意的是, 本机目录导入到服务器后,本机目录没有改变,和服务器也没关联,
并不是工作拷贝。Export命令请在本文其他地方找。
Switch & Relocate (切换和重定位)
+-------------------------------------------------
Switch -----在版本库内改变与当前工作拷贝关联的服务器路径URL(只限于同一个Repository内),应用情景:有时,服务器的目录会有所变化,和你当前工作拷贝
关联的服务器URL改变了,这种改变的直接结果是,你在工作拷贝中所做的修改不能提交到服务器,这时就需要Switch到正确的URL再提交。
Relocate----功能和Switch雷同,差别在于,Relocate实现的是Repository和Repository之间的切换。当服务器地址或Repository名称发生变化时,可以用它来更新
你的工作拷贝。
Create/Apply patch (创建和应用补丁)
+-------------------------------------------------
如果你对某个文件没有修改的权限,但又必须对它进行修改,这时你可以对其创建补丁,然后把补丁发给对此目录有write权限的工作人员,他进行一系列的审核,审核
通过后,他会执行应用补丁命令,可以将你所做的修改提交到服务器上。
copy to working copy...(复制到工作拷贝...)
+-------------------------------------------------
首先,注意这里是working copy ,后面在选择目录时一定不要选错!,当然,选错了tortoisesvn会提示错误的,正确的操作应该是选那些有tortoisesvn标志的目录。
执行此命令会在working copy中增加你copy的目录和文件,然后修改,再commit,repository中就做了相应的变化。
当你需要用到这样一个模块,它与已经存在的某个模块类似,然而又不完全一样,需要有一定改动时,用copy to working copy...命令较为快捷。
Resolved ...(已解决的...)
+-------------------------------------------------
当两个人同时编辑一个文件,一个人先提交后,另一个人再进行提交时就会出现冲突,TortoiseSVN会提出必须更新你的工作拷贝后才能对这个文件进行修改,
Subversion冲突的种类及解决方法
+-------------------------------------------------
--->1.当两个人同时编辑一个文件的不同部分,一个人先提交后,另一个人再进行提交时就会出现冲突
--->解决方法:在冲突的文件上调用命令SVN Update(SVN更新),TortoiseSVN会自动从服务器上下载最新版本,并与本地工作拷贝进行合并,然后调用命令
SVN Commit(SVN 提交),就会自动生成一个新版本传到服务器上。
--->2.当两个人同时编辑一个文件的相同部分,一个人先提交后,另一个人再进行提交时就会出现冲突
--->解决方法:这种情况下调用SVN Update时,由于是同一部分修改,TortoiseSVN不知道应该怎么办,它会自动在发生冲突的文件的目录下生成三个文件,一个
发生冲突文件的基础版本,名称为文件的全名再加上基础版本的版本号,如FileConflict.cpp.r90,另一个是你调用SVN Update时更新的版本,名称也是文件
的全名再加上基础版本的版本号,如FileConflict.cpp.r95,它是别人已经修改好提交的文件, 还有一个是你的本地修改,后缀为.mine,而原文件以一种TortoriseSVN能识别的方式显示冲突的双方,而且这个文件上会出现TortoiseSVN的图标,要解决这种
冲突要求造成冲突的两个人进行沟通,确定最终的修改方案,然后进行修改,具体操作是右击有冲突图标的文件,选择“编辑冲突”命令,这时就可以对出现冲突
的文件进行编辑,TortoiseSVN会打开TortoiseMerge,里面会显示别人的修改、你的修改、最终合并的文件,在最终合并的文件中产生冲突的行上右击,根据弹出
菜单选择使用别人的修改、我的修改还是两个都用,编辑完后保存,关闭TortoiseMerge,然后右击有冲突图标的文件,选择Resolved...(已解决的...)命令后
确定即可。

关于“基础版本”及其命令 ---比较差异,检查更新,显示日志,版本分支图
+-------------------------------------------------+-------------------------------------------------
当我们从服务器上CheckOut某个版本,经过一定的修改后,右击修改的文件(注意,不是目录)会有一个“比较差异”命令,调用它会弹出TortoiseMerge,它列出了
当前修改的工作拷贝与我们CheckOut时用到的版本之间的差异,这个被我们CheckOut的版本称为当前工作拷贝的“基础版本”,注意,基础版本不一定是最新版本,最新版
本也不一定是基础版本,比如另一个人和我们CheckOut同一个版本,它在我们之前提交了一份修改会形成一个最新版本----这时,我们进行提交可能造成冲突。
刚才说过,只有文件才会有“比较差异”命令,而目录没有,有没有办法看到目录的变化呢?--肯定有,是哪个呢?先试一下第一个---“显示日志”,结果不行,它只
显示的是当前工作拷贝对应的服务器目录或文件的版本变化记录,从第一个版本到最新版本,一个也不缺。“版本分支图”也一样,它是“显示日志”命令的图形化显示,
功能和“显示日志”完全一样。答案是----“检查更新”,它比较的是当前工作拷贝相对于基础版本的更新记录,不仅能显示文件的变化,也能显示目录的增减等。
Revert (复原) 和 Update to version
+-------------------------------------------------
当你CheckOut并修改了文件后,如果在提交前发现修改不正确,可以用Revert来取消这次的修改,使文件回到基础版本的状态;如果已经提交,可以用Update to Version
(更新至版本)返回某个旧的版本,或者调用显示日志命令,在任意一处日志上单击,在下方会出现修改记录,右击某一记录,在弹出菜单中选择Save Revision to(保存版本至)
,也可以把原来版本进行存档。需要注意的是,你的本地工作拷贝可以返回到原来的版本,可是服务器上只会记录你对它进行最后一个提交的版本,所以服务器端版本不
会 变化,如果你想把服务器端的文档内容也换为原来的状态,可以用旧版本文件覆盖新版本文件,然后提交,或者使用Revert changes from this revision 和 Revert to this revision命令,她们的用法在本文档中有,自己找找,调用显示日志命令,在任意一处日志上右击,在快捷菜单中会出现这两个命令。
注意,Revert命令很危险,它不向Ctrl-Z命令一样一次只撤销一次修改,它的名字是“还原”,它会把所有的修改全部撤销,直接回到基础版本的状态,如果想只撤销
一 次的修改,我的方法是,使用“检查更新”和“比较差异”命令在TortoriseSVN中修改,TortoriseSVN中的"use this text block ","use other text block ","use both text block "等命令很方便,关于这两个命令在本文中也有介绍,自己找。
Revert changes from this revision 跟Revert to this revision的区别?
+-------------------------------------------------
譬如有个文件,有十个版本,假定版本号是1,2,3,4,5,6,7,8,9,10。

-->1.Revert to this revision(恢复到某个以前的版本): 如果在版本6这里点击“Revert to this revision",表示7~10的修改全部作废,历史倒退到了版本6那个年代。
如果你做了多处修改,然后决定要返回到版本 N,你就可以使用这个命令。再次说明,恢复的修改位于你的工作复本,在你提交之前,并不会影响版本库。
注意,这将会丢弃从那个版本以来的所有修改,使用选中的版本来替换文件/文件夹。

-->2.Revert changes from this revision(还原选中版本所做的修改):如果在版本6这里点击“Revert changes from this revision",表示版本6这个历史事件被抹杀了,只剩下9个历史事件了。 如果同时选择了6,7,8三个历史时期并点击“Revert changes from this revision”,表示抹杀6~8这仨历史时期。同理,如果同时选择7~10,然后点击“Revert changes from this revision”,则效果跟在版本6这里点击“Revert to this revision”是一样的。
还原的内容只在你的工作副本中,所以此操作完全不会影响版本库!要注意的是,这个操作仅仅还原该版本中的修改。不是将整个文件替换成选中的那个版本。
它对于已经做过其它无关修改的还原早期修改非常有用。如果你做了本地修改,此命令将会合并修改到工作副本。
关于“基础版本”及其命令 ---比较差异,检查更新,显示日志,版本分支图
+-------------------------------------------------+-------------------------------------------------
当我们从服务器上CheckOut某个版本,经过一定的修改后,右击修改的文件(注意,不是目录)会有一个“比较差异”命令,调用它会弹出TortoiseMerge,它列出了
当前修改的工作拷贝与我们CheckOut时用到的版本之间的差异,这个被我们CheckOut的版本称为当前工作拷贝的“基础版本”,注意,基础版本不一定是最新版本,最新版
本也不一定是基础版本,比如另一个人和我们CheckOut同一个版本,它在我们之前提交了一份修改会形成一个最新版本----这时,我们进行提交可能造成冲突。
刚才说过,只有文件才会有“比较差异”命令,而目录没有,有没有办法看到目录的变化呢?--肯定有,是哪个呢?先试一下第一个---“显示日志”,结果不行,它只
显示的是当前工作拷贝对应的服务器目录或文件的版本变化记录,从第一个版本到最新版本,一个也不缺。“版本分支图”也一样,它是“显示日志”命令的图形化显示,
功能和“显示日志”完全一样。答案是----“检查更新”,它比较的是当前工作拷贝相对于基础版本的更新记录,不仅能显示文件的变化,也能显示目录的增减等。
Branch & Tag (分支与标记)
+-------------------------------------------------
---->1.定义与理解
-->1.1 Branch and Thunk (分支和主线)
版本控制系统的一个特性是能够把各种修改分离出来放在产品的一个分割线上。这条线被称为Branch(分支)。
分支经常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定之后,产品的分支就可以混合回Thunk(主线)里.

-->1.2 Tag (标记/标签)
版本控制系统的另一个特性是能够标记特殊的版本(例如某个发布版本),所以你可以在任何时候重新建立一个特定的构件和环境。这个过程被称作Tag(标记/标签)。
Subversion 没有专门的用于建立分支和标记的特殊命令,它所谓的分支其实就是一个拷贝,把原目录的内容拷到一个新的目录下面。但是这个拷贝的操作不是真正意义
上的拷贝,Subversion称之为"Lean copy"(便宜复制),它类似于Linux的硬链接,实际的操作是建立了一个内部链接,指向那个被建立分支的目录,只有当我们提交一个文件
的修改,才在分支目录下建立一个真实的文件,它的内容就是我们提交的内容,需要注意的时,这时候,除了这个文件以外,其余的文件仍然是作为被建立分支目录下文件的
链接存在的。
采用Lean copy技术的结果是分支和标记能迅速被创建,并且没有在版本库里占据任何额外的空间。
-->1.3 理解Branch
建立分支的情况举例:
a.Project发行版已经完成,正在继续开发Project贺岁版,计划在两个月后发行。不久,客户开始抱怨Project有问题,于是CheckOut(检出)Project的发行版,
找到几个错误,并进行代码更正。但是当前的版本是个不稳定的版本(现在正处于Project2贺岁版的开发中.....),并且在下个月才能有希望稳定下来,这样就没有办法基于
最新的代码去发行一个修复错误的版本。....这种情况下就可以创建一个Branch(分支),分支的所有文件是基于Project发行版的,可以修改这个分支而不影响到主干(即当
前正在开发的Project2贺岁版),当Project2贺岁版完成时,你可以选定是否要把这个分支同主干(Project2贺岁版)合并或继续保留在这个分支里。
b.如果我们在维护一个项目的文档,但有一天,另一个项目也要这份文档,她们有和我们不同的需求,因此要对文档做一些修改才能适应她们的需要,这时,也可以对
这个文档建立一个分支。
c.Branch可以是项目分支,也可以是私有分支。
所谓的项目分支,是指两个项目需要并发开发,它们基于同一个原始版本的拷贝,且这两个项目又互不干扰的进行独立开发,那么这两条开发线对于原来的那个原始版
本来说,就是项目分支,而原始版本就是项目主干。
所谓的私有分支,是指如果多个人共同负责一个模块,当出现两个人同时修改一个文件的同一部分的情况时,就会不断的出现冲突,开发人员就要花大量的时间解决这
些冲突,而在分支上工作避免了频繁的解决冲突,这种分支叫做私有分支,个人可以在主干上建立一个私有分支出来,当开发到一定阶段以后,可以再对自己分支与主干进
行合并,在与主干进行合并的同时,也能关注到其他人在这一段时间内对主干做的修改。
---->2.创建分支
利用TortoiseSVN有两种方法建立分支:
-->1.从本地工作拷贝到服务器建立,在本地工作拷贝右击在弹出菜单中选择“Branch/Tag”会弹出一个对话框,在其中设定要建立分支的URL即可。
-->2.从URL到URL,在Repository Explorer(版本浏览器)中右击要建立分支的目录,在弹出菜单中选择Copy to...(“复制到...”),在弹出对话框设定要建立分支的URL.
---->3.分支的合并
创建分支后一段时间可以根据需要进行Merge(合并)操作,我们既可以将主线的改动合并到分支上,也可以将分支的改动合并到主线上:
-->1.将主线的改动合并到分支上,需要在分支的工作拷贝下进行合并,合并的范围是从主线上上次合并的版本(或建立分支时候的版本)到当前主线上的最新版本,
如果主线和分支都修改了相同的文件的相同部分,合并后会出现冲突,就要进行解决冲突,如果主线修改但是分支没有修改,则主线上合并的变更内容会增加到当前工作
拷贝中,合并的结果会保存到当前的工作拷贝中,提交后改动就会体现在分支中,如果是第一次合并,则起始版本号是上次建立分支的版本号。
-->2.将分支的改动合并到主线中,需要在主线的工作拷贝下进行合并,相关事项与上雷同。
Blame (追溯)
+-------------------------------------------------
这个命令很不错,能显示文件的所有行在哪个版本中被修改及修改的时间,还可以追溯版本库等,有兴趣可以自己研究。

routine tortoisesvn operations-1

接下来, 我们讲一下tortoisesvn的常规操作. update, revert和switch的区别, 这三个命令的图标都是从服务器端到客户端的箭头, 容易搞混.

1. update是最常用的操作, 就是用来更新本地的work copy, 当然, 如果某个文档是基于svn server的最新版本做了修改,那么update并不会从svn server上download这个文档. 如果你的文档是基于svn server上的一个老版本作了修改, tortoisesvn会让启动一个向导让你解决这个conflict.

2. revert, 这个操作忽略本地work copy的任何修改, 它直接从svn server上下载被你修改了的文档.

3. switch, switch是update的一个超强版本, update是从原有的svn folder下取代码的, 而switch可以指定另一个folder的URL(但是仅限于在同一个repository之下的另一个folder), switch操作使得本地的work copy指向新的URL, 同时更新versioned file的footprint信息. 这个操作因为不需要download所有文档的内容, 所以速度很快.

4. checkout, 就是将svn上的某个directory所有文档都下载到一个本地目录,同时下载文档的footprint信息, 它要求本地目录必须是空目录. 也叫作fresh checkout.

移动和复制

当我们对源码结构进行重新组织时, 经常会对versioned file进行复制和移动操作. Tortoisesvn的move和copy命令比较隐蔽, 在tortoisesvn菜单上是找不到这些命令的, 只能是先选中要移动的folder/file, 然后按下鼠标右键, 拖拉到另一个目录, 这时候会出现一个弹出菜单, 其中就有SVN copy和SVN move.

TortoiseSVN合并和回滚操作

合并功能是Subversion最大的亮点. 它甚至是改变了我们的开发模式(和Sourcesafe的checkout-lock-checkin模式相比). 当然合并操作本身是很复杂的. 主要有3种合并模式, 需要提醒的是, 合并操作后, 结果仅仅反映到本地的work copy上了, 这时候还没有在svn server上进行merge. 如果你真的要在server上merge的话, 需要再执行commit操作.

合并模式1-(merge a range of revisions):即同一个branch不同版本的merge, 在这个向导中, 你需要指定一个URL(因为已经有个缺省值, 所以一般情况下你不需关心这个), 然后你要指定一个要merge的版本序列, 这个不好理解, 为什么是一个版本序列呢? 在一般情况下, 你只需要指定一个版本号, 并不需要merge几个版本. 但svn仍然提供了一个让你一次性merge多个版本的功能.

合并模式2-(reintegrate a branch): 这是subserver提供的一个非常有用的功能, 它可以将我们的另一个branch代码和本地的work copy进行merge.

合并模式3-(合并两个树): 这应该是三种合并模式中, 最灵活的一种, 选项也最多, 你可以指定两个repository 的URL, 以及相应的版本号码, 然后merge.

版本回滚: TortoiseSVN的rollback功能放在Show Log的界面上了, 最方便的一个回滚方法是: Revert to this revision, 这个很好理解, 就是将版本回滚到你选定的那个版本上, 点击之后, 会将work copy回滚到刚刚指定的那个版本. 需要commit之后, 才会将这个版本真正地在svn server上了.

Friday, August 8, 2008

MS LiveID registry URL

Register LiveID by your email or hotmail https://accountservices.passport.net/reg.srf?bk=1203928119&cru=http://login.live.com/login.srf&sl=1&vv=550&lc=2057

logon live ID and change password
https://login.live.com/ppsecure/secure.srf?lc=2057&sf=1&id=10&ru=https://accountservices.passport.net/default.srf%3fid%3d10%26vv%3d600%26lc%3d2057&tw=1200&fs=1&kv=7&cb=&cbid=10&seclog=10&wlsu=1

Sign up

https://signup.live.com/signup.aspx?ru=http%3a%2f%2fg.live.com%2f3WCEN-US%2f20&wa=wsignin1.0&rpsnv=10&ct=1232765708&rver=5.5.4177.0&wp=MBI&wreply=http:%2F%2Fwindowslivehelp.com%2FDefault.aspx&lc=1033&id=259655&bk=1232765716&rollrs=12&lic=1

Sunday, August 3, 2008

shareware product web template

奥大软件版权所有
http://www.aodasoft.com/

best pratice for new shareware developer

我一直在努力 -- 送给所有的共享新手

楼主greensleeve(绿袖子)
http://topic.csdn.net/t/20040731/08/3228726.html我一直在努力
经常看到很多同行们对共享软件能否赚到钱感到困惑,虽然大家都知道的周易前辈的MP3 CD Maker创下了月入四万的记录,但这对我们大多数人来说,只是一个很遥远的梦,就好象是水中的月亮,可望不可及。这个也曾经是我投入这个行业是的目标, 虽然到目前我的收入才达到他的四分之一,但我已心滿意足了,回顾两年多的编程生活,总结了一些经验,希望和大家分享,最重要的一点,我将它做为这篇文章的 题目吧,那就是 :我一直在努力。
一 困惑
共享软件能赚到钱吗?怎么才能收到钱?很多朋友在刚入行时都会问这样的问题。其实很多高手都能证明共享软件是可以赚到钱的,这一点是无须置疑的。以国外人 的观念,凡是付出了劳动的东西都是有价值的。对于软件也一样,而且国外由于法律严格,大家都有版权意识,所以对共享软件在国外销售有很大帮助。至于怎么样 才能收到钱,对于一般的用户来说,都是找一家代理公司帮你收钱,每月定期寄支票给你。代理行业在国外已经是一个很成熟的行业了,不用担心代理会不给钱你。 比较大一点的代理:
www.RegNow.com 设施最完备的代理,需要开户费
www.Qwerks.com 免费开户,据说信誉极好,我也用它
www.Shareit.com 最可气的是:客户退货竟然要收手续费
www.RegSoft.com 反应平平

二 心态
在投入这个行业之前,调整好自已的心态非常重要。做共享软件绝不等同于你在公司里打工,只要程序写完了就可以每月按时拿工资了。当你滿怀信心开始一个产品 的开发,经过了无数个不眠之夜,最后产品开发成功,说明书也写好了,网站也做好了,提交到下载站点了,结果怎么样?没有单!不是今天没单,而且是昨天也没 单,这个星期也没单,这个月也没单,连这一年都没单。你会怎么做?如果你不幸真的遇到这种情况,希望这篇文章的标题能帮助你。
现在共享软件市场确实充滿各种各样的作者,大部份人都是本着一个诚实认真的态度,一种互惠互利的态度,也就是说用我们的软件让别人得到帮助后,我们自已也 得到实惠。用一句话说,就是要做一个有用的东西。用自已的特长来做软件是可行的,相反对于那些急于赚到钱,看见别人什么软件赚钱就赶紧照抄无误,完全不考 虑是否是自已的专长的人,他们是肯定赚不到大钱的。

三 技术和素质
1. 熟练掌握一门编程语言是必不可少的,至于什么语言倒不是很重要。常看到有人争论VB和VC哪个厉害,个人观点:两种语言一样厉害。如果一个用VB的人可以 写出和别人用VC写的一样的程序,那这个用VB的人很厉害,如果一个用VC的人不能写出别人用VB写的程序,那这个用VC的人不厉害。
2. 至少两年的编程序经验。这个很重要。通过几年的经历,你会对程序和系统有一个更深的理解。对你以前的课本知识会有一个更深的理解。如果你刚刚毕业或还在校 学习,你会不会觉得数据结构和操作系统这两门课基本上没有用处?曾经有一个刚毕业的小伙子,别人问他什么是线程同步?他回答说:我写过的所有的程序都不用 线程同步就可以完成所有的功能。真是牛啊!所以说新来的大学生永远是各个行业中最牛(英语中第二个字母)的人了。我们也是从这个时候过来的,看到他们的现 在就想起了我们的过去。
3. 责任心
这是各行各业的基本素质,对于做共享软件行业来说,这个尢其重要。你要确保你的产品不会对客户的机器造成损害。客户买不买你的软件你都要负责到底。强烈的责任感会使和客户的关系形成一个良性循环,这是一笔无形的资产。以后再论。
总而言之,如果你准备一个人单打独斗来做共享软件,你至少要会这些东东:
VC or VB or JAVA or other programming language
HTML, ASP or PHP
所有计算机专业的基础课(包括数学)
两年以上的专业经验
FTP软件的使用 (我发现竟然有很多人不会用FTP?)
如果你认为你这些都具备了,让我们开始吧。
四 做什么
这是个问得最多的问题,实际上问这个问题的人是想问:做什么软件能赚到钱?对这个问题最简单有效的回答是:做有用的 软件。试想一下,如果你做的软件连你自已都不准备用它,你会希望别人会用吗?你在做的时候可能就是持着能捞就捞,捞不到拉倒的心态。这样只是浪费时间,劳 而无获。现在很多人抱怨抄的人太多,什么是抄呢?如果你做数据库软件,我也做数据库,这不叫抄。这叫参与行业竟争。所谓抄者,是指那些全完模仿别的人样子 来做软件的人,别人做什么,他就做什么,别人的界面做成什么样,他就做成什么样,别人的网站是什么样,他就做成什么样,别人的网站是:xxx.com ,他的就是 xxx.net . 别人的软件名字叫:AOB,他的软件就叫A0B. 但是对于这些抄者来说,他们的产品就他们的网站和软件名字一样,看起来象,其实是无法比的。用这种方法的人大多是想快速发财的,但结果总是不会令人如意的。
让我们静下心来考虑一下:到底该做什么?
我们在各自的专业领地里已经干了多年了,是不是发现有些事靠人手来做太慢,能不能让它自动化一下?我们当前使用的工具是不是太麻烦或太简单了,能不能简化 一下或增加一些功能?在某一个项目的开发中是不是创造了一种新技术?这样多想想,创意自然就来了。举几个例子:
我们做程序员是不是喜欢一边写程序一边泡MM?INTERNET是少不的了,当我们正聊的火热的时候老板突然朝我的座位走过来怎么办?赶紧切换到VC编缉 器吧,可按MOUSE的次数太多了,声音太响了,动作太大了,任务栏上还有一排按键是关不掉的了。即使老板没看到你在做什么,他也能猜到你在做什么。能不 能有一种程序让我们只按一个键就隐藏所有其它的窗口,只显示我们需要的窗口?当老板向我们走来时,我们可以一边从容镇定地望着他走来,一边悄无声息地按下 我们预设的隐藏键,当老板走到身边时,我们可以目不转睛地盯着他的眼睛问:你要干嘛?于是创意来了,就做这个,就叫做“一键隐藏”。开始做吧?别忙,创意 有了,看有没有人先想到。上网找一下吧,晚了,已经有人做了。再想下一个吧。
九七年我做研究生论文时,是在AutoCAD是做二次开发,为CAD增加三个造形功能。当时的CAD版本还没有这三种功能,当时我花了十个多月的时间研究 CAD的二次开发库,最后实现这三个功能。现在想起来,其实我可以将这个功能包装一下,完全可以变成一个很好的共享软件。可惜那时还没有这种意识。现在的 CAD版本可能已经加上这几个功能了。举这个例子是希望大家能举一反三,多留意身边的事情,从自已专业工作中产生的IDEA比盲目地模妨别人的东西最后产 生的效果要好得多。

五 模妨 VS 抄袭
好不容易想到一个创意,一阵激动过后,上网一查,原来别人早已想到而且类似的软件已滿天飞了。怎么办呢?放弃吗?重新再想吗?这个时候你要冷静下来,对同 类的软件做一些细致的分析,找出他们的优点和不足之处。我们要知道,在现在这样一个时代,要有一个全新的独一无二的创意是很难很难的了,何况人类科技的发 展就是后人踩着前人的肩膀而不断向前的。所在以分析了别的软件后,再仔细考虑一下自已将要做的软件有什么新意,不需要一个全新的东西,只需要有几个亮点就 行。举个例子可能明白一点,现在市面上有很多注册表类软件,谈到在注册表里加一项能够让某个程序能自动启动自已,大多数软件可能都会用到这样一些键:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
等等。但很少有软件会知道这个键也能让程序自已动启动:
HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Run
如果你准备做类似的注册表软件,你是否认为你对注册表的了解超过其它的软件呢?如果是的,那就加上这些吧,而且要在说明中大书特书,这就是你竟争的本钱,要不然你的软件就会被淹没在注册表软件的海洋中。
怎么做呢?是不是和别人的一模一样呢?那是抄袭,所有的抄袭只能抄外表,无法抄到里面。我这里谈到的模妨是在研究了别的软件的基础上,总结一下别人组织界 面的方式和设计软件的方法,别人在易用性和直观性上的优点,在这个基础上,加上自已对程序的理解,做出有自已风格的产品。当我们刚入行时,如果我们的软件 是销售到海外的,我们当然应该了解外国人使用软件的习性,学习一些设计得很好的软件的界面,这样更易于提高我们的软件在国外的竟争能力。比方说界面上的一 个BUTTON,当MOUSE移到上面时,会显示一个提示信息告诉用户这个BUTTON是做什么用,这样一种用户友好的界面是受欢迎的。
六 设计与编码
这个是所有程序员都经历过的,也是一个很烦索的过程。不过也是一个很有乐趣的过程。以前在一家软件公司打工,老板很开明,上班时可以听音乐,可以聊天,曾经有一次我们五个人同时泡上一个北京的 美眉,那小妹妹打字非快,以一敌五,真是佩服。老板不在我们还可以打三角洲,常常是公司十来个人打得天混地暗,最后发觉程序还没写完,只好连夜加班赶进 度。如果你已经开始你的共享软件开发了,尽量不要给自已太大的圧力,写程序的时候听听音乐,聊聊天,会给枯燥的编程生活带来很多乐趣。我这儿有一首绝版的 齐秦的歌,歌名叫做:燃烧爱情,生于七十代的朋友可能都听过,现在好象全世界只有我有这个的MP3版,如果感兴趣,发EMAIL给我,我寄给你。
总之,在设计程序时,尽量做到简单易用,要让用户一安装你的软件就会用,不要指望用户会花时间去看你的说明书。几个有用的原则:
1. 尽可能简化操作
2. 尽可能地将结果显示给用户
3. 尽可能在用户第一次使用的时候就能做出一个好的结果
这一点想具体说明一点,比方说你做一个清理注册表的软件,即使用户的注册表是干净的,你也要设法从他的注册表中找一点不干净的东西来。我是意思是说要靠你的技术功底,不是靠欺骗用户。这样当他第二次用你的软件但已过了试用期时,他的购买的冲动就会大一些。

七 网站
通常做共享软件是要申请一个国际域名和一个主机空间的。对于刚开始的朋友,可能经济上的原因,无法达到这一点,那就无妨找一个免费的主机空间,用他的二级 域名,我刚开始时也是用我的ISP提供给我的免费的10M空间存放我的网页,慢慢地积累一些收入,经济上可行了,就马上申请了域名和空间。如果你的软件是 给一些专业用户使用的,那还是一开始就申请域名和主机吧,这个钱不能省的。如果你的软件是给一般计算机用户用的,这些用户对什么域名不是很了解的话,你不 妨用我的方法。当然如果你有钱,就直接进入专业共享的行列吧。
怎么样设计网页呢?要找一个专业人士帮忙吗?个人认为:简单即是美。网页不用很专业,但要实用,也就是说,要让用户一看你的主页,就知道你这个网站是做什 么的,或者知道你的软件是做什么的。这是一个最基本的原则。第二,要考虑一下你的网页的下载速度。你可能用ADSL或CABLE上网,但还有很多用户是用 MODEM的,所在要你的第一页不要加载很多图片。在有图片的地方要加上ALT字段,这样可以让用户知道这是一张什么图片即便图片没有显示出来。
写到这里,我想起了一个IDEA,在设计网站的时候,经常要用FTP把文件传上去,下载下来,久而久之,很可能在服务器上有很多用不到的文件,比方说一些 图象文件,一些临时的文件了,这些东西对于我们维护网站造成很大的麻烦,轻易地删除又可能删掉了有用的文件。所以我想,能不能有这样一种软件,它即有 FTP的功能,又能帮我们检查网站上哪些文件是没有用到的,而且还能帮我们测试网页的下载速度(模拟不同的上网方式)。这种软件可以启名叫:FTP for web developer. 现在世面上FTP的东西太多了,但有这个功能的基本上没有。光凭这个名字,就会有多少WEB DEVELOPER会感兴趣啊。怎么样,你也可以试试这个,做好了别望了给个免费的版本我,这可是我的IDEA呀。再一次证明创意是从工作中来的。
八 提交
经过几个月的努力,程序写好了,文档也做好,网站更是令人滿意,下面就是让用户知道你的软件了。通常的做法是将软件提交到一个下载网站,这类网站种类繁多,质量也参差不齐,好一点下载网站还需要付费。下面介绍一些下载网站:
1.www.download.com
最有名的软件下载站。$79USD 每提交一次,UPDATE一次也要收$79。但它热呀,没办法,如果有钱,一定要提交DOWNLOAD
2.www.tucows.com
这也是一个有名的下载网站,而且会HOSTING你的软件在他们遍布全世界的服务器上。(这里又想起了模妨与抄袭的事,你能说TUCOWS 和DOWNLOAD是谁抄谁的吗?他们各自有各自的特点)
另外,TUCOWS现在还有免费提交的选项,对于经济不宽裕的朋友确实是一个好地方。
3. www.webattack.com
这个网站能在众多竟争者中站住脚,与他们的编缉的良好素质有极大的关系。最低费用是$20吧,这个网站的最大特点就是:他们的编缉会细致地测试你的软件, 并且会详细地告诉你你的软件的不足。根据他们专业经验指点一下,相信你的软件即使被拒收了,也会收益不浅的。
4. www.versiontracker.com
这可能比较热门的免费下载网站之一,它会将你的软件放在首页两天,在这两天中,你可以分析你的软件的热门程度。
5. www.soft32.com
这是一个比较专业的类似于Affiliate性质的网站,就是帮别人卖软件的网站。
还有很多下载网站,当你准备提交你的软件时,请注意以下几点:
1. 你的收入的绝大部分是来自于DOWNLOAD和TUCOWS这样的大网站的。
2. 提交太多的小网站只是浪费带宽。
3. 但越多的小网站有链接到你的网站,你的网站在GOOGLE上的排名会越靠前。(这真是个很难取舍的问题)
4. 写你的软件简介时,一般都有一个短一点的介绍,用一句话说明你的软件是做什么的,在这个地方不要写得太含糊,要让用户一看就懂,就明白。
5. 在要输入你的网站链接的地方一定要输入。

九 等待
最难受的时候到了,这个时候的人们往往会有一种神经质,总是怀疑自已的EMAIL信箱是不是坏了,以致于每隔五分钟就要收一次EMAIL来检查是否有的 ORDER。很有可能,你的软件自提交后就再也没有消息了,似乎提不提交都是一样的。这个时候我希望你想想这篇文章的题目:我一直在努力! 曾几何时,这句话就象古代的节妇用捡黄豆的方法来打发漫漫长夜一样,这句话让我渡过了无数个难熬的等待日子。今天没单,昨天没单,前天没单,这个星期没 单,这个月也没单。第二个月,我收到一单了,$7.75美元。我当时第一个软件定价$10美元,被代理收去最低手续费$2.25美元。这对于我可以一个划 时代的日子,从此我就一头踏进了“我一直在努力”的漫漫征程。做共享近两年的时间,从最初第一个月的$7.75美元,到后来超过$500美元,到现在月入 过万,从最初每天工作至少十小时,从无节假日,到现在每天工作四小时,有节假日。只有那句话能让我能走到今天。
那么当我们限入漫长的等待时,我们该做些什么呢?消极等待是不可取的,除非你觉得这个工作可有可无,反正有铁饭碗在手。在这个时候,我们应该花多一点时间 来改进我们的软件,要知道任何一个软件在刚出来的都是一个丑小鸭,WINDOWS刚出道时才卖出多少份?比比WINDOWS XP和WINDOWS  3.1,真是有天壤之别。如果在这个时候放弃很可能你会失去一个本来可以成名的IDEA和一个可以名扬四海的软件。就好象一个节妇守了二十年寡,等到五十 多岁时却出来给人当二奶,晚节不保,你说她还能快活几年呀?在我们不断地改进我们软件时,我们可能会从起初的创意派生出新的东西来,这是非常宝贵的,因为 这个新派生出来的想法可能是经过我们对实验经验的总结而得出的,是非常实用的。
如果你的软件一年都没收到一单(有这样可怕的事吗),那只能说明你的软件不是有一点问题,而是太有问题了,你的创意不是不好,而是太不好了。你营销的方式 不是不对,而是太不对了。我见过这样一个软件也可以赚到钱:一个随机产生一个10以内的加法让小朋友们回答,难后给出正确如否的评论。如果都对了,就说 “You are so great”,这是男人最喜欢女人对他们说的一句话。象这样一个软件都可以赚到钱,这个创意竟然是我大学时教BASIC的老师给我们的一道上机题。可想而 知,你的创意不好到了什么程度。所以说,每个月不来那么一两单,对心情也不好。我们那口袋也挺紧的。

十 创收
现在每个月可能来几单了,心情也不错了,但口袋还是挺紧的。怎么办?英语中有个词叫PROMOTION,我不知怎么翻译成中文,意思就是说想一些办法来提 高你软件的知名度。说白了就是花钱在一些大网站上做广告。现在广告公司的种类也太多了,我们都希望把钱花在刀刃上,有很多骗人的网站,也是要小心的。下面 介绍这些广告公司的类型。
1. 流量类:这类公司声称会在短时间内给你的网站带来极大的流量,并且根据付款的多少,相应带来不等的流量。对所有这种类型的公司绝对不要理它!表面上你的网 站确实增加了访问量,但我可以告知他们的做法是:将你的网址加入他们的一个客户端软件的列表中,这个客户端软件会不停地以轮回的方式去连接列表中的站点, 一切都在后台运行,坐在那台机器前的人可能正在看黄色网站。他对你的站点没有一点兴趣。
2. 点击付费类
以GOOGLE 的ADWORDS和OVERTURE两家公司最为出名,效果最佳。GOOGLE的每点击费用最低是$0.05美元,OVERTURE的 是$0.1美元。两家公司的效果可以说是旗鼓相当,只是OVERTURE的成本要高一些。个人认为,用收索引擎营销是一种成本极低的方式,而且易于掌控, 你永远不会说:我控制不了你。以目前我的广告的转化率计算:
每天点击 : 300 左右
转化率:   4%
成本:    $20美元左右
收入:    $500美元左右
这样的收益比起提交DOWNLOAD等下载网站的成本要低得多,收入也高得多,以致现在GOOGLE和OVERTURE是我的主要收入来源。
现在DOWNLOAD也提供类似点击付费的广告类型,它是当一个用户完全下载了你的软件时,你才用付钱,最低费用:$0.15美元/下载。真他妈的黑心。我从没做过这类广告,不知效果如何,但我计算过用这个做广告的其中的一个软件,数据如下:
一周下载量: 26000
最低费用:  26000 X $0.15 = $3900
假设的购买率5%(似乎太高了):26000 X 0.05 = 1300
单价:    $40
总收入:   1300 X $40 = $52000
净收入:  $52000 - $3900 = $48100
以上的计算是以假设的购买率为5%来计算的,实际的数字可以比这个低得多,所以不得盲目操作。
下面是一个我所知道的朋友的数据,这个较真实一点:
一周下载量: 5500
费用:     5500 X $0.20 = $1100
购买率(1%)  5500 X 0.01 = 55
单价:     $28
总收入:    55 X $28 = $1540
净收入: $1540 - $1100 = $440
这个朋友每月靠这个软件能赚1000多美元。
3. 按周/月付费类:
这类公司以TUCOWS为代表,他们在自已的网站的预留一定的位置用于显示你的广告,根据位置的不同有不同的价格,当然效果也会不一样,一般放在主页的广 告效果比较明显。我曾在TUCOWS是投过一个星期的栏目广告,收入不是很大,小赚一笔。在SOFT32上做过一个月的首页广告,点击无数,但成交寥寥。 基本上没有保本。
4. 杂志类:
通常你需要写信给他们的编缉,介绍你的软件,然后他们认为合适就会在下期杂志上介绍你的软件。这无疑会带来相当多的收入。但如果你不是英语专业研究生毕业 的,你还是不要写这种信丢咱中国人的脸吧,如果你是英语专业研究生毕业的,我不明白为什么你也会挤到我们这条船上来?哪里找不到一碗饭吃呀。
难道我们就不能用这种方法来提高我们的软件的知名度吗?还是有的,那就是要不断地提高软件质量,一段时间后,自然会有自称某个国家最流行的某本杂志的某个 编缉写信给你,问你是否允许他们将你的软件放入他们下期杂志的CD中。你只要给他们回信说:I authorize XXX magzine to place my software “牛牛牛” in their enclosed CD-ROM. Thank you.
以后你就等着收单吧。写到这里,我想到我的第一个软件,当时不知是哪一家荷兰的杂志上介绍我的软件,他们也不通知我一声,害得我一年以后,还有人写信问 我:他从某杂志上看到我的软件的介绍,问我怎么才能购买?我当时已经把那个软件全部删掉了,连购买链接都没有了,我只好为他专门做了一个购买链接,又赚 了$7.75美元,结果那天吃饭时一高兴多给了人十块小费。

写到这里,差不多把做共享的整个流程都介绍了一遍了,希望对刚入行者有些帮助。做共享并不难,最难的是在遇到困难时不能坚持下去。记住:我一直在努力。本 来想搁笔的,又想起一些大家经常争论的问题,想表达一下自已的看法,以下观点纯属个人意见,如与某些人的观点冲突,请见谅。
1. 破解坏了我的软件吗?
个人认为:破解对你的软件毫无损失。
2. 注册算法越复杂越好吗?
个人认为:天下没有攻不破的盾。最好不要把功夫花在注册算法上,除非你的软件就是帮助别人搞注册算法的。所有的鈅匙只能防君子,防不了小人。所以我觉得, 也是我的经验,注册算法简单一点也无妨,我所有的软件都用一个硬编码的注册码,发现破解时(一般只有那些刚入门的破解者会把这么容易破解的东西拿来眩吆自 已,相反那些高手会对这么简单的注册方式感到是对他们的侮辱)。基本上我的软件一出来就可以找到破解,刚开始时,我只用把注册码改一个字母,那个破解者就 白做了。后来我发现即使到处是破解版,我的收入并不下降反而上升,我也就懒得再改注册码了。有一次我还写信给一个RUSSIAN的破解网站,让他们能不能 把我的破解版的链接指向我的DOWNLOAD的下载链接,好让我的DOWNLOAD下载计数也能因破解版而增加一些,而且我答应无偿提供所有注册码给他 们。结果没音讯。
3. 试用期长一点好还是短一点好?
个人认为:30太长了,7天到10天比较合适。3到5天最好。

Saturday, August 2, 2008

how to spread your share software

青石:我的软件推广成功之路
转载自 IT人网 http://www.iteer.net/modules/doc/article.php?storyid=1722&page=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倍的时间破解。大部分人都会放弃。你将注册做在一起,就像将你的财宝放在现代保险箱里,虽然非 常坚固难以解密,对于开锁高手两分钟就打开了。对于一些比较专业的破解者采用上面的方法也是很有效的但是,还是要避免一些低级失误例如:不要在内存中直接 出现注册码和明显的注册码比较部分不要给用户太多的有关注册验证的信息,也不要接收到注册码后立刻就进行比较。在软件的不同功能处实现验证时的好处还有就 是不会立刻执行到验证代码注册码,可以分多次验证,也可以分成几部分验证,还可以分成几层验证验证时,可以尽量多执行一些无用的操作,加上一些象递归之类 难于调试追踪的代码,但在其中要穿插实现软件功能的代码,否则人家直接就跳了过去。反正就是越不引人注意越好,亦即越乱越好。
其实要想彻底防止破解也是不现实的,除了研究一下破解方法,在发布前加壳外,并采用以上所说的方法外,不断升级程序也是比较好的方法。
总之,推广软件对于搞惯了技术的软件作者来说一开始会走一些弯路,但只要不断学习成功者的经验,不断吸取自己失败的教训,你也会成功的。最后,祝大家个个都成为共享高手。

wifi tools

第一步, 确定是否有热点(无线网卡没有限制)
工具1. Wifi device scanner:--NetStumbler 0.40, 它支持所有的wireless card, 可以探测出附近的所有热点, 但因为好几年没有新版本, 所以无法用它来准确探知热点的加密的方式
工具2. Wifi Hopper, 这是一个商业软件, 可以免费用15天, 它可以帮助我们获取热点的加密方式

第二步, 抓取wifi和合法网卡的握手包
并不是所有的网络都能用来抓包, 我的TP-Link TL-WN620g(USB无线网卡)就不能用. 支持的网卡有: http://www.wildpackets.com/support/downloads/drivers, 从网上查到,常用可支持网卡:

  • ATHEROS 5212A、BROADCOM 430XMP、Cisco AIR-CB21AG、NEC WL54SC
  • TP-LINK系列:前两个是PCI卡(TL-WN550G,TL-WN551G), 这两个是笔记本PCMCIA卡( TL-WN510G,TLWN610G) TL-WN650G TL-WN65G
  • 芯片系列:AR5001, AR5002, AR5004, AR5005 and AR5006
工具1. WinAircrackPack(俺下载有, http://www.anxz.com)--这个工具应该所包含破解wifi所需的所有工具, include all tools for crack wifi router such as airodump.exe,WinAircrack.exe, airdecap.exe, 另外还包含了大名鼎鼎的NetStumbler
工具2. OmniPeek Personal, 这个工具可以抓包,

第三步, 破解
工具1. WinAircrackPack (俺下载有, http://www.anxz.com)
工具2. Cowpatty for win32,
工具3. 暴力破解字典下载 www.lastbit.com/dict.asp


教程:
1. 中文 http://www.cooaoo.com/article.asp?id=79
2. 中文 http://hi.baidu.com/lktsllj/blog
3. 网站 http://wirelessdefence.org/Contents/coWPAtty_win32.htm

Friday, August 1, 2008

how to get your WAN IP

我的软件, 需要将使用者的IP反馈给我. 接下来的问题是怎样获得使用者的IP地址呢?
google了一下后发现, nirsoft网站上有一个软件ipnetinfo,
同时也可以访问网页http://www.nirsoft.net/show_my_ip_address.php 来获得IP地址.
这个网站的速度很快. 返回的title中包含你的IP地址, Title的格式是:
Your IP address is 116.227.173.137
从上面字符串中, 很容易获得IP.

Wednesday, July 30, 2008

no charge VPN

1. http://www.hotspotshield.com/


2. VPN提供商:linkideo
免费用户带宽:128KB/s
用户名:需要注册
密码:自己注册
VPN服务器地址:pptp1.linkideo.com
注册地址:http://www.linkideo.com/sign-up
备注:通过电信使用Linkideo的VPN,访问国外网站的速度那是相当地快。 不但可以访问SourceForge,而且适用于访问Blogger或者Wordpress提供的免费博客,一举多得噢!


VPN提供商:千渡
地点:中国
带宽:256KB/s
用户名:zlnic.net
密码:zhichiaoyun
VPN服务器IP:电信区:244server1.1000du.net网通区:244server2.1000du.net铁通\移动\联通\教育网服务器:244server3.1000du.net
注册地址:http://bbs.1000du.net
备注:共用用户名和密码,每个星期会更换密码,大家可以收藏此页,我同步更新。
最后更新:20080707
免费VPN收集

VPN提供商:linkideo
地点:英国
带宽:128KB/s
用户名:自己注册
密码:自己注册
VPN服务器IP:pptp1.linkideo.com
注册地址:http://www.linkideo.com/sign-up
备注:适合访问国外网站。

VPN提供商:Relakks
地点:瑞典
带宽:16MB/s
用户名:自己注册
密码:自己注册
VPN服务器IP:pptp.relakks.com
注册地址:https://www.relakks.com/register.php
备注:只提供30天的免费服务,但可以修改MAC地址无限试用。详细参考Relakks——高速免费的无限制VPN代理

VPN提供商:八匹马
地点:中国
带宽:2MB/s
用户名:自己注册
密码:自己注册
VPN服务器IP:专用客户端登陆
注册地址:http://passport.duniu.com/buserregister
备注:每个账号可以体验5个小时,繁忙时段每半小时掉线一次,适合网络加速。

VPN提供商:Prairie Dog VPN
地点:香港
带宽:未知
用户名:随机分配
密码:随机分配
VPN服务器IP:61.238.150.146
注册地址:http://www.pdog-vpn.com/freeaccount.php
备注:香港的VPN,我这里速度很快,Ping才50。注册过程,点击上面地址,填入邮箱,收邮件获取用户名和密码。

Tuesday, July 29, 2008

Continuous Integration Tool--CC.Net

TeamCity is good tool, the free version is enough for most small-medium projects.
Cruise Control.Net is absolutely free and open source tool. Actually, it is more hard to configure.
Fortunately, there is a sourceforge project can help you.
cc-config: http://cc-config.sourceforge.net/

PS, CC.Net http://cruisecontrol.sourceforge.net/

Monday, July 28, 2008

Continuous Integration Tool--TeamCity

TeamCity is another famous Continuous Integrating Tool. It is much easier to configure than CC.Net because TeamCity is allowed to configure through Web UI. The latter one has too many xml files to configure.

Product Site http://www.jetbrains.com/teamcity/
Free Version License Including

  • 3 Build Agents at no additional cost
  • 20 User Accounts
  • 20 Build Configurations

More detail Info, View the following blogs,
  1. Our Build Config--TeamCity(http://blog.eleutian.com/2008/03/07/OurBuildConfigurations.aspx)
  2. CruiseControl.NET is dead. Long live Team City!(http://blog.eleutian.com/2007/12/22/CruiseControlNETIsDeadLongLiveTeamCity.aspx)
  3. Integration of NCover into Team City for Tech Head Brothers(http://weblogs.asp.net/lkempe/archive/2008/03/30/integration-of-ncover-into-team-city-for-tech-head-brothers.aspx)
  4. Continuous Integration Revisited(http://www.zorched.net/2006/08/10/continuous-integration-revisited/)

NDbUnit Framework

NDbUnit test is a good UnitTest framework if you are familiar with C#. But this project seems not active since 2006.
Home Page: http://qualitylabs.org/projects/ndbunit/

Safari account

Online Login

Getting started is easy. Just log on to the URL shown below:

URL: http://liqwidkrystal.safaribooksonline.com/?uicode=cognizant

Username: FirstName.LastName@Company.com

Password: 8901704050

How to increase scalability--InfoQ article

http://www.infoq.com/articles/scalability-panel

Thursday, July 24, 2008

One Ph.D C# Developer Resume

One good sample resume
http://www.eggheadcafe.com/articles/pbrombergresume.asp

version control with TortoiseSVN without SVN Server

If you only have a limited number of users, and do not need remote access, you can use Tortoise without a subversion server. This makes set-up much easier.
Steps:
1. Install TortoiseSVN software
2. Open Windows Explorer.
3. Create a empty folder as your repository, this can be local or on network drive.
4. Right click the empty folder, and then click on "Create repository here".
5. Then you can use TortoiseSVN--Repository browser to manage your repository directory. Maybe you can add such directories.
-project_a
-trunk
-branches
-tags
6. After the first 5 steps. you can do any operations just like the repository on a SVN Server.

How to arrange the svn repository layout

怎样组织svn的目录其实非常有学问,比如我们是要将多个项目放在一个svn repository下, 还是为每个项目都建立一个独立的svn repository呢? 实际上, 这两种做法各有优缺点. 

使用单一svn repository的优点是:只需要维护一个svn库,工作量自然会少了很多, 这里维护工作包括routinely backup,dump以及升级svn软件. 当然缺点也很明显: 一个项目的开发人员可以访问另一个项目的文件,另外一个严重的缺点是,每个项目的commit email list很可能不同, 但如果在一个repository下,就不能为不同的项目配置不同的email list, 这样一旦项目A被commit,项目B的也会收到commit email. 

下面是一个多项目的repository结构, 但项目的repository也可参照这个.

要说明的是trunk,branches和tags的意义, trunk里面维护着是项目的主要开发版本. branches是trunk版本的各类分支版本.tags是保存着trunk和branches的某一时刻的快照. 

/
calc/
trunk/
tags/
branches/
calendar/
trunk/
tags/
branches/
spreadsheet/
trunk/
tags/
branches/

Tuesday, June 10, 2008

Restart eDCenter Dev and sales

eDCenter 从2007年3月之后, 一直沉寂。
2008年5月接到的一个厂家询问, 我决定重新启动eDCenter 软件, 希望能带来好运!

Freesoftware and opensoftwares

优秀开源和免费软件下载网站有:
http://portableapps.com/
http://nirsoft.net/
http://www.pendriveapps.com/
http://www.downloadsquad.com/
http://www.osalt.com/

24 Killer Portable Apps For Your USB Flash Drive
http://www.downloadsquad.com/2008/09/02/24-killer-portable-apps-for-your-usb-flash-drive/


Database Browser(Portable Edition,支持Oracle, SQL Server,ODBC)
http://www.dbsoftlab.com/index.php/Freeware/Database-Browser.html


NetSetManagement (portable Edition) 方便切换多个IP和网关
http://www.pendriveapps.com/2008/03/31/netsetman-portable-network-settings-manager/


WinDirStatPortable(分析磁盘文件的占用情况)
http://portableapps.com/apps/utilities/windirstat_portable


PidginPortable(MSN, QQ等IM 客户端)
http://portableapps.com/apps/internet/pidgin_portable


EraserPortable(securely Delete file/folder)
http://portableapps.com/apps/utilities/eraser_portable


MyUninstaller(非常好用的卸载工具)
http://www.nirsoft.net/utils/myuninst.html


Sumatra PDF Portable (PDF Reader)
http://portableapps.com/apps/office/sumatra_pdf_portable


Keepass--Protect your password
http://keepass.info/

italc--Local network computer projector, for team learning and team computer control.
http://italc.sourceforge.net

Desktops--Virtual Windows desktop manager, just like linux multi-desktop
http://technet.microsoft.com/en-us/sysinternals/cc817881.aspx

EyeDefender--Alert you when you have used computer for a period
http://eterlab.com/

Locate--Just the linux locate command
http://locate32.webhop.org/

WordWeb--English thesaurus and dictionary lookup
http://wordweb.info/free/

Monday, May 26, 2008

How to hide or show TabPage of TabControl

C# 的TabControl功能严重不足, 尤其是你用它来制作Wizard界面时候, 下面代码会有所帮助的.


namespace LiuHarry.Utils.Components
{
using System;
using System.Windows.Forms;

public class TabControlHelper
{
private TabControl m_tabControl;

public TabControlHelper(TabControl tabCtrl)
{
this.m_tabControl = tabCtrl;
}

public void HideTabPage(TabPage tp)
{
if (this.m_tabControl.TabPages.Contains(tp))
{
this.m_tabControl.TabPages.Remove(tp);
}
}

private void InsertTabPage(TabPage tabpage, int index)
{
if ((index < 0) || (index > this.m_tabControl.TabCount))
{
throw new ArgumentException("Index out of Range.");
}
this.m_tabControl.TabPages.Add(tabpage);
if (index < (this.m_tabControl.TabCount - 1))
{
do
{
this.SwapTabPages(tabpage, this.m_tabControl.TabPages[this.m_tabControl.TabPages.IndexOf(tabpage) - 1]);
}
while (this.m_tabControl.TabPages.IndexOf(tabpage) != index);
}
this.m_tabControl.SelectedTab = tabpage;
}

public void ShowTabPage(TabPage tp)
{
this.ShowTabPage(tp, this.m_tabControl.TabPages.Count);
}

public void ShowTabPage(TabPage tp, int index)
{
if (!this.m_tabControl.TabPages.Contains(tp))
{
this.InsertTabPage(tp, index);
}
}

private void SwapTabPages(TabPage tp1, TabPage tp2)
{
if (!(this.m_tabControl.TabPages.Contains(tp1) && this.m_tabControl.TabPages.Contains(tp2)))
{
throw new ArgumentException("TabPages must be in the TabControls TabPageCollection.");
}
int index = this.m_tabControl.TabPages.IndexOf(tp1);
int num2 = this.m_tabControl.TabPages.IndexOf(tp2);
this.m_tabControl.TabPages[index] = tp2;
this.m_tabControl.TabPages[num2] = tp1;
this.m_tabControl.SelectedIndex = this.m_tabControl.SelectedIndex;
string text = tp1.Text;
string str2 = tp2.Text;
tp1.Text = str2;
tp2.Text = text;
}
}
}

DataGridViewHelper class

DataGridView这个控件在开发中经常会被用到, C#的组件总觉得不如Delphi组件那么容易使用, 怎样在Grid上选择一个Row, 怎样选择一个Cell, 我就被block了好久. 下面是代码:


namespace LiuHarry.Utils.Components
{
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;

public class DataGridViewHelper
{
private DataGridView m_DataGridView;
private SortedList<string, string> m_MapListFieldColumn = new SortedList<string, string>();
private DataView m_ShowedDataViewInGrid;

public DataGridViewHelper(DataGridView dataGridView, DataView showedDataViewInGrid)
{
this.m_DataGridView = dataGridView;
this.m_ShowedDataViewInGrid = showedDataViewInGrid;
this.InitFieldColumnMapList();
}

private string _GetGridViewColumnName(string dataFieldName)
{
for (int i = 0; i < this.m_DataGridView.Columns.Count; i++)
{
if (this.m_DataGridView.Columns[i].DataPropertyName == dataFieldName)
{
return this.m_DataGridView.Columns[i].Name;
}
}
return "";
}

private void InitFieldColumnMapList()
{
this.m_MapListFieldColumn.Clear();
for (int i = 0; i < this.m_ShowedDataViewInGrid.Table.Columns.Count; i++)
{
string columnName = this.m_ShowedDataViewInGrid.Table.Columns[i].ColumnName;
string str2 = this._GetGridViewColumnName(columnName);
this.m_MapListFieldColumn.Add(columnName, str2);
}
}

public string QuickFindGridViewColumnName(string dataFieldName)
{
int num = this.m_MapListFieldColumn.IndexOfKey(dataFieldName);
if (num < 0)
{
throw new Exception("There no a column in DataGridView corresponding DataFieldName=" + dataFieldName);
}
return this.m_MapListFieldColumn.Values[num];
}

public void SelectAndScrollToCell(string fieldName, object fieldValue)
{
this.m_DataGridView.ClearSelection();
if ((fieldName != null) && (fieldValue != null))
{
string str = this.QuickFindGridViewColumnName(fieldName);
foreach (DataGridViewRow row in (IEnumerable) this.m_DataGridView.Rows)
{
if (object.Equals(row.Cells[str].Value, fieldValue))
{
this.m_DataGridView.CurrentCell = row.Cells[str];
this.m_DataGridView.CurrentCell.Selected = true;
break;
}
}
}
}

public void SelectRow(object valueOfSortedField)
{
DataView showedDataViewInGrid = this.m_ShowedDataViewInGrid;
this.m_DataGridView.ClearSelection();
if ((showedDataViewInGrid != null) && (valueOfSortedField != null))
{
int num = showedDataViewInGrid.Find(valueOfSortedField);
if (num >= 0)
{
this.m_DataGridView.Rows[num].Selected = true;
}
}
}

public SortedList<string, string> MapListFieldColumn
{
get
{
return this.m_MapListFieldColumn;
}
}
}
}

Managed ExecuteShell API



namespace LiuHarry.Utils.Foundation
{
using System;
using System.Diagnostics;

public class CommandShell
{
public static string RunCmd(string command)
{
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/c " + command;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
return process.StandardOutput.ReadToEnd();
}

public static void CallWindowsApp()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
//call calculator
proc.StartInfo.FileName="calc";
proc.Start();
}

public static void GotoWebSite()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.FileName="iexplore";
proc.StartInfo.Arguments=http://www.microsoft.com;
proc.Start();
proc.WaitForExit();
MessageBox.Show("You have just visited www.microsoft.com");
}

public static void OpenWordDocument()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.FileName="winword";
proc.StartInfo.Arguments="C:DotnetstuffTestWordDoc.doc";
proc.Start();
}

public static void ExecuteBatchFile()
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.FileName="c:dotnetstuff
etdrv.bat"
;
proc.Start();
MessageBox.Show("Map Drive Created");
}

}


}

How to create a new XmlElement

XmlNode是一个Context相关的对象, 你不能直接调用XmlNode的构造子来创建一个XmlNode. 要创建一个XmlNode有两个方法. 假设要在xmlParentNode下创建一个newNode.
方法1: 通过XmlDocument的CreateElement方法创建一个XmlNode
  public XmlElement CreateElement(prefix,localName,namespaceURI),如果元素带有namespace,必须加上namespaceURI, 比如:
步骤1:XmlElement newNode= docNode.CreateElement("w", "br", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");
步骤2:xmlParentNode.InsertAfter(br, rNode.FirstChild);

方法2: 不是直接创建XmlElement,而是通过修改xmlParentNode的InnerXml文本, 来增加一个节点.记住:如果新加的内容包含前缀,一定要加上namespace URI.否则会报错的.  


xmlParentNode.InnerXml= @"<w:r xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main""><w:rPr>
</w:rPr>
<w:br/>
<w:t>Some string </w:t></w:r>"
;

Tuesday, May 6, 2008

How to design a class which has absolute readonly List property


有时候, 我们设计的类,包含一个Collection对象, 要求该类的使用者可以访问这个Collection属性, 而不能修改Collection的Item, 比如一个容器类.
如果这个属性是List<T>类型的话, 即使该Collection属性只有getter方法, 也无法阻止容器类的使用者修改的Collection的元素.



.Net的System.Collections.ObjectModel命名空间中包含一个ReadOnlyCollection<T>,
可以帮你做到对Collection的绝对只读封装. 其实ReadOnlyCollection类实现了IList<T>接口, 但它没有将Items属性设置public, 而是将它设为protected,
这样就ReadOnlyCollection对象就不能得到Items属性, 但可以通过属性索引来查的单个元素的值.ReadOnlyCollection的这种实现方法值得好好学习.




.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}

.csharpcode .lnum { color: #606060; }


/// <summary>
/// CtrlContainer的使用者
/// </summary>
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void button1_Click(object sender, EventArgs e)
{
CtrlContainer cc = new CtrlContainer("file1.dfm");
//可以通过cc.ListControl属性增加一个元素
cc.ListControl.Add("ImageBox");

//不能可以通过cc.ReadOnlyListControl属性增加或修改一个元素, 只能读取某个元素
string firstControlName = cc.ReadOnlyListControl[0];
MessageBox.Show(firstControlName);
}
}


/// <summary>
/// 一个展现ReadOnlyCollection的Demo Class,
/// 这个类是一个Control的容器类, 它通过分析一个dfm文件, 获取该文件包含的所有Control,
/// 不允许CtrlContainer类的使用者修改Control的列表
/// </summary>
public class CtrlContainer
{
private List<string> m_ListControl = new List<string>();


/// <summary>
/// 这个只读属性其实并不能很好地防止CtrlContainer类的使用者修改m_ListControl的元素,
/// 因为他仍然可以使用ListControl.Add()等方法.
/// </summary>
public List<string> ListControl
{
get { return m_ListControl; }
}

//using System.Collections.ObjectModel;
ReadOnlyCollection<string> m_ReadOnlyListControl;


/// <summary>
/// 这个属性可以确保CtrlContainer类的使用者不能修改m_ListControl的元素, 只能读取m_ListControl的元素
/// </summary>
public ReadOnlyCollection<string> ReadOnlyListControl
{
get { return m_ReadOnlyListControl; }
}


public CtrlContainer(string dfmFileName)
{
//parse the dfm file, and extract all controls
m_ListControl.Add("Button");

// 因为m_ListControl是以引用的方式传给ReadOnlyCollection,
// 所以, 无论是在创建m_ReadOnlyListControl之前或之后, 对m_ListControl的元素进行操作, 都将反映到m_ReadOnlyListControl上
m_ReadOnlyListControl = new ReadOnlyCollection<string>(m_ListControl);

m_ListControl.Add("Richbox");
m_ListControl.Add("ComboBox");
}
}

Monday, May 5, 2008

A simple method to parse characteristic text to enum


设想下面的场景, 我们要解析一个文本文件, 在该文件中包含一些特征文本, 有richbox, 有combobox, 就像是delphi的dfm文件一样. 然后我们要针对不同的特征做不同的处理.


这时, 我们往往定义一个枚举类型, 然后读取文本, 根据特征文本, 转成一个枚举值.


我以前的做法是定义一个SortedList<string,ControlType>, 其中包含richbox和对应的枚举值. 在解析特征文本的时候, 通过这个SortedList, 就可以得到枚举值.



其实, 这个过程也可以使用Enum这个类的Parse()来完成, 前提是你定义的枚举值的名称和特征文本一摸一样(大小写可以不同). 下面是一个示例:



public class EnumMapping
{

/// <summary>
/// 根据枚举的名称,返回对应的枚举值
/// </summary>
/// <param name="enumName"></param>
/// <returns></returns>
public ControlType ConvertFromName(string enumName)
{
return (ControlType)Enum.Parse(typeof(ControlType), enumName, true);
}
}


public enum ControlType
{
richbox,
combobox,
image
}