2006年04月28日

Visopsys自从1997年以来就已经开始开发,目前最新版本为0.62,它非常小巧,光盘版的才5MB左右,而软盘版的也700KB不到。并且它运行起来非常快,而且还是开源软件。它虽然小,但是提供了功能齐全的图形界面,支持实时可占先多任务和虚拟内存。

各个版本的下载地址:http://visopsys.org/download/index.html

2006年04月23日

(一) 网络中遍布著大量的Linux相关站点;

(二)用户无须详细了解每一个此类站点,实际上,一百个站点足够你使用了。
  

  评选出的这100个优秀站点,将按照下述20个类别作以评介:

  (一) 文件下载

  (二) 幽默娱乐

  (三) 相关新闻

  (四) 通用硬体

  (五) 专用硬体

  (六) 新手站点

  (七) 图形/多媒体

  (八) 游戏站点

  (九) 网路杂志

  (十) 入口(教育、链结)

  (十一) 软体发展

  (十二) 购物

  (十三) Linux内核

  (十四) 职业机会

  (十五) 科学工程

  (十六) 文档管理

  (十七) X-Window 系统

  (十八) Linux 分发站点

  (十九) 用户团体

  (二十) 网管站点

                 

(一) 软件下载

(1) Freshmeat站点

网址:http://www.freshmeat.net

评介:如果你绝对肯定,非要获取开放源代码应用程式,那毫无疑问,
Freshmeat就是个不错的站点。
这个最值得推崇的软体下载站点,有著数以千计的大量开放源代码应用程式的分类链结。
此外,Freshmeat站点在更新程式的基础上,每天还会添加10到30个新程式链结。

(2) Tucows Linux

网址:http://linux.tucows.com

评介:最初,该站点是一个基於Windows的软体园地,几年後,Tucows拓宽领域。
现在,该站点已经发展成为了最开放的Linux下载站点之一。
不过,说真的,这也是因为Linux从一开始就增强了伺服器的缘故。

(3) Woven Goods for Linux

网址:http://www.fokus.gmd.de/linux

评介:Woven Goods for Linux 是一个德语站点,
它的特徵就在於英文和德文版的Linux程式下载和文档。
该站点还有一个很不错的综合列表,几乎列出了你所能想像出的每一个Linux分发。

(4) Linux ISO Images

网址:http://www.LinuxISO.org

评介:是不是已经极其厌倦了查找ISO图像?
在LinuxISO.org站点中一个非常醒目的地方,就放置了最流行的Linux 分发ISOs的链结。
当然,它不能让你56k的数据机具有更快的下载速度,但他们已经竭尽所能了,
那些有DSL或光缆数据机的用户们会非常高兴的。

(5) RPMfind.net

网址:http://www.rpmfind.net

评介:如果你还沉浸在网路海洋寻找最新用RPM
(Red Hat Package Manager)格式编写的软体,
那这个站点最适合不过了。
凡是存在的RPM Package,这里都可以找到,而且这些软体还被编进了索引,
用户可以通过多种不同方式来分类。
例如,你可以分别用类别(比如游戏等等)、创建日期、
package maintainer或名称等等多种方式查询一个套装软体。

(二)娱乐休闲

(1) UserFriendly

网址:http://www.userfriendly.org

评介:真应该建议Netscape在流览器(就在"Home"旁边)上添加一个按钮,
以便用户可以很轻易地跳转到User Friendly上的Daily Static链结中去。
喜欢新奇感觉的用户可能没有人愿意错过该站点上的冒险体验。
此外,还有其他像卡通等等内容丰富的东西。
User Friendly站点的最大特点就是每日都有新服务内容,
而且还有庞大的人才资料库和Ufie社区。

(2) Segfault

网址:http://www.segfault.org

评介:是一个不错的Linux娱乐站点。
该站点的特徵在於喜欢拿Linux界的名流人物来开涮,非常可笑且带有讽刺意味。
在这里用户不会找到太多有用的资料,但绝对可以让你捧腹大笑。

(3) Sluggy Freelance

网址:http://www.sluggy.com

评介:可以肯定,第一名的UserFriendly绝对不是惟一的滑稽喜剧站点,
Sluggy Freelance就是一个典型例证。
该站点的创建日期可以回溯到1997年,特徵就是提供了不少通俗易懂的素材。
尤其值得一提的是,Sluggy站点非常体贴新用户,专门在最醒目的位置放置了新读者指南。
建议大家不妨请一天假,完完整整地流览一个这个不错的网站。

(4) Humorix

网址:http://i-want-a-website.com/about-linux

评介:Humorix站点既讲述Linux的相关知识,
又著力於Linux,、Microsoft以及其他许多相关系统或软体的趣事收集。
此外,还有许多专栏作者和自愿投稿者的搞笑文章。

(5) Jargon File

网址:http://www.tuxedo.org/~esr/jargon

评介:不是特别了解"行话"?难道不想去深入了解滑稽语言隐含的深层含义?
那就访问Jargon File站点吧。该站点收集了庞大的滑稽行语概要,时间跨度相当大。
在这里,你会同时发现像早期的"Bit Bucket"和"404",
同时还有现在时新的有关Hacker Writing Style和Lamer-speak的文章。
该站点由Eric Raymond编辑整理而成。

(三)相关新闻

(1) Slashdot.org

网址:http://slashdot.org

评介:这个自称为"为大众服务的新闻"站点早先是以"晶片和程式"起家的。
後来慢慢发展成为搞笑闲谈的场所。
成千上万的铁杆支持者和匿名用户通过该站点搜寻大量的技术故事和未过滤的社区回信。
当CmdrTaco和Hemos的语法成为时兴後,
他们关於这个搞笑网站尝试後的成功地位自然也无人可比了。

(2) Linux Today

网址:http://www.Linuxtoday.com

评介:Linux Today网站遵从的是Rolling Stone Magazine杂志的座右铭
"All the News that Fits"。
并且作为一个网站,它的确作得相当不错。
对於想直接访问大多Linux业界主要大事的用户来说,
由於该站点提供了新闻故事、出版发行等相关资讯,所以确实是一个不错的切入点。

(3) Linux Weekly News

网址:http://www.lwn.net

评介:如果你想查找所有简明扼要的新闻,那就不应该错过Linux Weekly News站点。
它的范围非常广泛,远至安全事件,近至社会问题。
而且每周星期四,该站点都非常有规律地提供一个关於所有业界所发生事件的编辑评注,
仔细流览,你会发现它的评注非常合情合理。

(4) Wired News

网址:http://www.wired.com

评介:尽管,每周Wired News站点只有几组专门的Linux新闻故事,
但这些新闻故事中却总有技术爱好者所关心的资讯。
而且在当今充盈著"链结到—-网站"的情况下,
该站点还做了其他此类网站没有时间去真正做的事—-自己亲自动手写稿件。

(5) Wide Open News

网址:http://www.wideopen.com

评介:该站点的新闻区经常包含一些相当有意义的专题特写和文章,
而且一般都由专业记者撰写。
Wide Open News站点每周都会发布一些原创作品,而且通常稿件质量都很高。
喜欢流览行业新闻的不妨去感受一番。

(四)通用硬体

(1) Linux Hardware

网址: http://www.linuxhardware.net/

评介:Linux Hardware站点中包括一个内容非常广泛的Linux系统中所有的硬体资讯资料库。
用户既可以流览这些资料库资料,
也可以使用该站点的搜索引擎来快速查找所需要的硬体资料。
同样,该站点也允许搜索Usenet 组。
其中Linux Friendly Hardware Vendor 列表也是另一个特点所在。

(2) Linux Hardware Database

网址:http://lhd.datapower.com

评介:尽管每天Linux下的硬体支援变得越来越少,
但不可否认仍然有那么几款硬体非常适合於Linux用户。
Linux Hardware Database站点就是一个可以找到此类适合Linux的控制项类别的不错站点。

(3) The Linux Benchmarking Project

网址:http://www.tux.org/bench

评介:差不多每一个电脑爱好者都喜欢基准,
特别是当他们的硬体产品处於顶级时更是如此。
The Linux Benchmarking Project站点提供了一个基准结果资料库,
以及可供下载的基准软体。

(4) Tom’s Hardware Guide

网址:http://www.tomshardware.com

评介:该站点虽然并不是一个专门的Linux站点,
但是有关Linux的内容非常不错,很值得一看。
用户不但在这里可以找到评论、新闻、技巧,还可以查找图形资讯、微处理器硬体等等。

(5) Linux on Laptops

网址:http://www.cs.utexas.edu/users/kharker/linux-laptop/

评介:如果你还在顽强地想将Linux装进你的笔记本电脑,
那这个站点绝对是最适合不过了。
从德克萨斯学院毕业的Kenneth Harker用了五年的时间
来对相关笔记本电脑的站点进行精选和分类。
同时,还让真正的用户推荐如何可以在他们的笔记本电脑中装入和运行Linux系统。

(五)专用硬体

(1) LinuxPPC.org

网址:http://www.linuxppc.org/

评介:如果你正在犹豫,不能判断壁橱里的老式Macintosh能不能支援Linux系统,
那LinuxPPC.org站点就是个值得一去的地方。
它是通往Linux/PPC方案的家园,能够将Linux埠置於Mac,
而且还可以链结到Linux/Macintosh邮件列表、常用问题解答、软体等等。

(2) iMac Linux

网址:http://www.imaclinux.net

评介:如果你难以忍受玻璃鱼缸样式、果冻般颜色的iMac,
而现在想运行Linux,不知行不行?
可以肯定地说,没问题,iMac Linux 网站可以帮助你在短短几分钟内完成你的心愿。

(3) Printer Compatibility Database

网址:http://www.picante.com/~gtaylor/pht/printer_list.cgi

评介:在Linux下执行列印任务可能有些烦人,
以至於想购买一个新的印表机来同Linux配套。
Printer Compatibility Database网站可以给用户提供一个
在Linux下工作的印表机综合列表,包括如何同Linux配套使用的综合资讯。
同时,用户可以在该网站找到Linux Printing HOWTO和其他有用的列印资讯。

(4) Linux Modem Compatibility Knowledge Base

网址:http://www.o2.net/~gromitkc/winmodem.html

评介:该站点提供了一个范围广泛的用户级数据机列表(包括Linux下)
以及一些有帮助价值的Linux数据机链结。

(5) SANE

网址:http://www.mostang.com/sane/

评介:如果你不知道如何在Linux下使用扫描器,
那SANE (Scanner Access Now Easy)站点就可以告诉你该怎么办了。
况且,该站点不仅有最流行的Linux扫描器软体,而且还以相容硬体的资料库而颇具特色。

(六) 新手站点

(1) Penguin Magazine

网址:http://www.penguinmagazine.com/

评介:事实上,找一个能给Linux入门者提供各种所需的网站并不是很多,
因此,相比之下,这个後起之秀Penguin Magazine站点的确还算是能解决这个难题。
该站点在今年初才启动,由一个名叫Scott Haven的Linux爱好者个人制作完成,
网站中包含了大量的有关Windows和Linux档系统的逐步式内容介绍。
在厌倦了阅读大多网站中专业化程度超过自己知识容量的资料之後,
Penguin Magazine可以让你轻轻松松地喘口气了。

(2) LinuxPlanet.com

网址:http://www.linuxplanet.com/

评介:由於制作优秀而被Big Company所认可的Linux站点之一就是LinuxPlanet,
自从去年推出核心Linux内容之後,该站点就被网际网路上的人们所看好。
难度适中的论坛、评论、以及一些列印、查找文档等现实问题的疑难指点等。
对於Linux菜鸟级的用户,LinuxPlanet绝对是一个有用的站点。

(3) Beginners Linux Guide

网址:http://www.linux.ie/beginners-linux-guide

评介:Beginners Linux Guide是Irish Linux User Group Web站点的一部分。
它的可圈可点之处在於其中通俗易懂的指南性专题,
包括如何使用基本Linux命令、以及安装资讯等等。

(4) Linuxdot.org

网址:http://www.linuxdot.org/

评介:从这个站点完全可以证明,Linux并不只是美国佬的专利。
因为Linuxdot.org是英国站点,而且的确是一个适用于初学者的向导性优秀站点。
几乎可以冠以"Linux入门者的手册"美称了。
该站点的特徵是从硬碟分区直到MySOL的简单介绍几乎无所不包,
囊括了所有Linux的相关知识。

(5) Linuxnewbie.org

网址:http://www.Linuxnewbie.org/

评介:Linuxnewbie.org是一个综合性站点,包括新闻标题、论坛、
著名的Newbieized帮助档(Newbieized Help Files)等等。
这种帮助档是为了帮助用户习惯使用Linux,进行部分系统的配置。
此外,用户还可以讨论或者检验该站点书架所推荐的图书。

(七)图形/多媒体

(1) LinuxArtist.org

网址:http://www.linuxartist.org/

评介:LinuxArtist.org是我们目前所见过的Linux系统下最综合全面的图形站点。
不论用户喜欢平面图形还是三维图形,
LinuxArtist.org都能给那些使用Linux来创建名作的艺术家们
提供大量的链结和邮件列表。

(2) The Gimp

网址:http://www.gimp.org/

评介:一旦你提到图像和Linux,那就不得不说说The GIMP Web站点。
该站点特别适合於那些希望在Linux市场里得到最好图形程式的用户。
站点里包含了大量的资源和下载软体,此外还展示了一些GIMP.自己制作的美术作品。

(3) 3D software for Linux

网址:http://www.linux3d.org/

评介:虽然3D software for Linux站点不是网路中最可爱的网站,
但用户可以在这里找到许多有价值的Linux下的3D应用程式,
同时还有支援Linux的3D硬体等。
此外,站点页面中还有许多Linux下的3D相关链结、当前新闻、
Linux下的有关3D图形的事件等等。

(4) GraphicsMuse

网址:http://www.graphics-muse.com/

评介:GraphicsMuse站点是一个资源丰富的Linux下图形资讯网站。
在这个站点上,用户可以找到大量的图形资源、推荐图书、
关於GIMP的原始内容以及其他一些非常好的图形方案。

(5) General Graphics Interface Project

网址:http://www.ggi-project.org/

评介:不知你是否抱怨过,X Window系统可能压根就不适合你?
这些家伙们对於用X设计一点都没有激情,但他们希望有一种更好的工作方式。
现在,他们应该有了一个计画,而且,更重要的是,他们拥有beta代码。

(八)游戏站点
(1)Linux Game Tome

网址:http://happypenguin.org/

评介:从1995年开始,Linux Game Tome就已经成为了一个Linux游戏竞赛的专门场所。
而那时,Linux游戏世界本身也还是一片小天地。
现在,他们以http://happypenguin.org/ 为网址,
频道设置有新闻、游戏场景图片、游戏预告,以及最新游戏的评论等等。
同时,该站点还有一个不错的搜索引擎,可以让用户根据游戏类别、等级、名称,
甚至该游戏添加到网站的日期等分类流览游戏评论。

(2)Linux Games

网址:http://www.linuxgames.com/

评介:网站内容设置有下载、基本知识、论坛以及新闻等。
特别是新闻成为该网站的特色频道。
毫无疑问,Linux Games是一个可以覆盖全球绝大多数Linux游戏新闻的站点。

(3)Linux Quake

网址:http://www.linuxquake.com/

评介:绝对不能错过的站点。是一个非常精彩的《雷神之锤》站点。
包括了Linuxe下《雷神之锤》(Quake)的安装、运行,以及新闻和非常活跃的论坛等。

(4)Linux Game Development Center

网址:http://sunsite.auc.dk/lgdc/

评介:如果你想寻找一个非常精彩、且又能找到Linux游戏开发人员一切所需的场所,
那可以肯定目前这样的站点的确还没有出现。
不过,Linux Game Development Center 的发展目标也基本类似。
现在,该站点设置了精彩新闻、游戏开发指南、针对开发人员的访谈等,
但它还正在开发代码仓库、开发工具列表、以及新工作方案,以求不断发展。

(5)Loki

网址:http://www.lokigames.com/

评介:目前,Loki是一个商业性的Linux游戏公司。
从《文明》到《雷神之锤3》,再到《铁路大亨2》等等,
Loki公司几乎将所有最流行的游戏软体都移植到了Linux平台上。
如果你想看看最近有什么大游戏,那就上去看看吧!

(九)网上杂志

(1)Linux Journal Online

网址:http://www.linuxjournal.com/

评介:Linux Journal是其印刷杂志的电子版,大部分和印刷版特徵相符,
不过也添加了一些新的资料。
此外,电子版的特色频道还体现在职业中心、论坛,以及著名软体列表等等。
怎样说服你的老板使用Linux系统,只要看看该站点的企业部分就可以了。

(2)LinuxWorld

网址:http://www.linuxworld.com/

评介:LinuxWorld是一个发行量很大的周刊,范围涉及到Linux的方方面面,
从软体评论到Linux市场的大幅专题。
对於反微软的业界来说,LinuxWorld可是一个几乎无人不知的驰名站点。

(3)Linux Gazette

网址:http://www.linuxgazette.com/

评介:Linux Gazette是由Linux Journal 出版的电子刊物,
属於Linux Documentation Project的一部分。
自从1995年成立以来,无数的志愿者都在踊跃提交稿件,
以至於该站点现在已经成为一个实力很强的站点之一
(如果翻看他们的档案,就能看到一个非常非常古老的Red Hat图示)。
对於很多高级Linux用户来说,该站点的优势在於提供了很多指南和技巧,
同时用户还可以对未来想了解的专题发送提议。

(4)Salon Magazine: The Free Software Story

网址:http://www.salon.com/tech/special/opensource/

评介:最早在1998年,Salon就开始初涉Linux和开放源代码。
和其他大量再线Linux杂志不同的是,该站点所涉的内容题材非常广泛而且相当有意义。

(5)Linux Focus

网址:http://www.linuxfocus.org/

评介:这个定期按时发送的电子杂志自从1997年就开始诞生了。
它以月刊的形式,给用户提供了许多新颖(多少有些深奥)的技术性文章。
而且以多种语言发行,当然也包括英文版。

(十)链结/入口

(1) Linux.com

网址:http://www.Linux.com

评介:仅仅一年的时间,VA Linux的Linux.com 就已经成长为
网际网路上最具竞争力的Linux站点之一。
在网站经理Trae McCombs和他的自愿者小组努力下,
该网站为Linux社区添加了无数非常有用的特色内容和资源。
近来,该站点和O’Reilly & Associates结成合作关系,
双方合作的结果使Linux.com站点更具有专业化和更高质量。

(2) LinuxStart.com

网址:http://www.LinuxStart.com

评介:想一想Yahoo,基本就能够想像得出Linux的同类站点
——LinuxStart.com站点的特色
也正在於有一个相当不错的分成好多个主题区的精选链结。
此外,如果你正在费劲地用Hotmail发送网路信件,不妨试试Linux-Start的电子信箱。
甚至你还可以将你的网页也一并搬到上面。

(3) LinuxLinks.com

网址:http://www.linuxlinks.com

评介:LinuxLinks.com是最综合性的Linux站点之一,
在这里你能见到许多曾经印象比较深刻的站点链结。
目前,该站点的链结数量超过10,000,而且随时都在增加。

(4) Linux Online

网址:http://www.linux.org

评介:Linux Online的名称甚至比它的功能变数名称Linux.org更为知名。
是一个比较早的Linux站点,虽然介面做得并不是非常漂亮,
但其中包含的Linux资源价值却使其成为了一个必须参观的网站之一。

(5) Linsight

网址:http://Linsight.com

评介:Linsight在宣传中介绍自己为"Linux时代的Linux资讯"。
该网站实际上是由好几个部分组成的,
其中包括命名为LinDeveloper的一个开发人员分区、
一个叫做Linsider的Linux市场跟踪区、
追踪全年所发生的Linux业界焦点事件报导的LinEvents区、
以及可以告诉你和你的员工们在那里得到Linux培训的LinTraining专区。

(十一)软体发展

(1) SourceForge

网址:http://www.SourceForge.net

评介:SourceForge站点是VA Linux针对开发人员的一个入口。
程式师们在这里可以放置他们的开放源代码方案,
包括CVS工具、调试追踪和补丁管理工具。
SourceForge给所有没有资源来自己安装一个伺服器的Linux和
开放源代码程式师们一个家园。
用户可以流览和下栽网站上已开发的软体,也可以给这些方案做补丁。

(2) Catalog of Free Compilers and Interpreters

网址:http://www.idiom.com/free-compilers/

评介:在没有明确限制Linux和开放源代码软体的时候,
免费编译器和解释程式的目录对於开放源代码的开发人员还是会有些兴趣的。
此外,该站点包含了许多编程工具和编译器。

(3) SourceXchange

网址:http://www.sourcexchange.com

评介:SourceXchange是一个可以让Linux和开放源代码软体发展人员得到报酬的站点。
通过链结到一个付费的商业公司,就可以用开放源代码软体赚钱了。
需要开放源代码吗?需要提交方案、标明你的价格——-当然,
成功的前提是他们必须正好有你所需要的代码。

(4) CoSource

网址:http://www.cosource.com

评介:CoSource是又一个专门给源代码开发人员提供的付费站点。
目前,表单上已经有将近250个要求,总量达$71,500。

(5) Linux Source Navigator

网址:http://www.metalab.unc.edu/navigator-bin/navigator.cgi?

评介:该站点将源代码镶进一个简单的导航性分层档夹系统中,
以便用户快速查找到所需要的代码。

(十二)购物

(1) LinuxMall.com

网址:http://www.linuxmall.com

评介:可能由於最近更新过的缘故,LinuxMall.com站点看起来不想是购物站点,
倒像是一个专门的Linux链结入口。
而且,它还远不只是一个普通的电子商务站点。
目前,该站点已经打算建立很多特色社区了,如论坛以及已经启动的新闻服务等。

(2) Thinkgeek

网址:http://thinkgeek.com

评介:该网站有随手可得地最酷Linux附件。
但除了一些$1.99的发行CD外,用户可能在这里不会找到任何软体。
不过,如果你想用""compile"、"telnet"、和"regexp"写点东西,
最好还是上这个站点看看吧!

(3) The Linux Store

网址:http://thelinuxstore.com

评介:该站点比较自豪的是他们易於使用、简洁的介面、非常广泛的产品线,
以及大量的技术支持,没准在这里你还能找到你需要的东西呢。

(4) eLinux.com

网址:http://www.elinux.com

评介:这个进入Linux购物市场的新入口是由Creative Computers公司提供支援的,
该公司同时还有PCMall和MacMall。
Elinux站点中有一个非常广泛的Linux硬体和软体区,
同时还有一个由Linuxcare提供支援的FAQ资料库。

(5) Linuxcentral

网址:http://www.linuxcentral.com

评介:图书、T恤——–用户在这里可以找到所有传统Linux电子商务所能买到的东西,
此外,在这里还有一些更有趣的东西,比如网卡等等。

(十三)Linux内核

(1) Kernel Notes

网址:http://kernelnotes.org

评介:KernelNotes.org是一个可以得到所有内核的地方。
该站点所包括的内容比较广泛,而且,特色是能够找到最新内核的升级技巧。

(2) The Linux Kernel Archives

网址:http://www.kernel.org/

评介:该站点奉行的原则是:简洁、简洁,再简洁。
用户可以选择Linux内核、不稳定内核、稳定内核以及内核源代码。
如果你想找最新的稳定Linux内核或开发中内核,那就去看看吧。

(3) Kernel Traffic

网址:http://kt.linuxcare.com/

评介:难道每周不想要一个几乎达到6MB的Linux开发邮件列表吗?
Kernel Traffic站点的那帮家伙们早就替你想到了这一点。
Kernel Traffic是一个时事通讯周刊,总结了本周主要的专题。
一个不错的站点。

(4) GNU Hurd

网址:http://www.gnu.ai.mit.edu/software/hurd/hurd.html

评介:稳定版目前已经具体化,但关於Hurd kernel 的GNU Project还在发展之中。
Hurd内核是一个微核设计的实练。
GNU/ Hurd站点的特徵就是说明了如何将Hurd安装进Debian distribution中去。

(5) Linux Mama

网址:http://www.LinuxMama.com/

评介:无论如何,也不是每一个内核补丁都得作到fold中,
如果你正好属於好奇心比较重的类型,想玩玩非正式内核补丁,
那就不要错过Linux Mama了。

(十四) 职业机会

(1)Geekfinder

网址:http://www.geekfinder.com/

评介:主机位於User Friendly站点的Geekfinder是一个猎职的好去处。
该站点不只限於Linux类相关工作,
用户可以根据自己的技能搜索和选择最适合自己的工作。
此外,用户还可以根据自己的意愿按照州和地区来搜索职位。

(2)Linux.com Jobs Page

网址:http://www.linux.com/jobs/

评介:想寻找专职Linux工作的人,值得来Linux.com’s Jobs page站点看看。
根据提交的职位,该站点有大量适用於Linux求职者的有用专题和链结。

(3)eLance

网址:http://www.elance.com

评介:正式发布於去年的eLance站点为包括电脑业求职的各类自由服务开辟了一个新市场。
用户可以在该站点填写个人资料表格,并在其"固定薪酬"
部分根据填写者自己要求的计时薪酬
(在这里你也可以以每小时3到300美圆的价格雇佣其他人),
或者你也可以流览网站上的各种资讯看看是否有适合你的自由工作。

(4)Linux Today Jobs

网址:http://jobs.linuxtoday.com/

评介:该站点有两个特徵:网路上综合性最强的Linux新闻站点之一;
能够同时提供Linux企业公司招聘和Linux个人求职的专业站点。

(5)Hotjobs.com

网址:http://www.hotjobs.com

评介:Hotjobs.com是一个不局限於Linux特定求职的网站,
该站点每天发布5到10个Linux相关职位,
而且所公布的职位资料绝对不是那些看起来充裕却几乎没有什么回映的过时消息。

(十五)科学工程

(1) SAL: Scientific Applications for Linux

网址:http://www.kachinatech.com/SAL/

评介:Linux现在不仅仅是供玩乐的东西了,但这并不是意味著就此失去了许多乐趣。
对於年轻的科学工作者们来说,
可以在该网站找到许多适用於Linux下各种科研应用程式的开放源代码、
共用软体和商业软体等等。

(2) Beowulf Project at CESDIS

网址:http://beowulf.gsfc.nasa.gov/

评介:一个很酷的Linux站点。以帮助科学家们联系大量质优价廉的电脑而出名。

(3) High-Availability Linux Project

网址:http://www.henge.com/~alanr/ha/

评介:如果你正在Linux下运行企业级的应用程式,
或者只想验证一下Quake伺服器从不会崩溃,那该站点就太适合你了。
同时该站点还提供了许多簇管理、Linux-HA软体以及大量地此类相关站点链结。

(4) Free Physics Project

网址:http://freephysics.sourceforge.net/

评介:是一个创建Linux下的GPL物理模拟器的站点。
用户可以下载运行代码、专案处理等等。

(5) Linux and Chemistry

网址:http://chpc06.ch.unito.it/chem_linux.html

评介:这是一个综合了Linux和化学的网站,其中有许多商业、共用软体和GPL的软体,
适合於那些在Linux下做研究工作的化学家。想必化学系的学生和教授应当喜欢这个站点。

(十六)文档管理

1)Linux Documentation Project

网址:http://www.linuxdoc.org/

评介:在所有Linux站点中,LDP已经作了相当久的FAQ、HOWTO以及Linux导引了。
该站点最为夸耀的是各种格式的Linux详细资讯集萃。
此外,此站点中的HOWTO分项也是一个能解答用户所有疑难问题的权威场所。
最近由於新鲜血液的加盟,该站点又有了新特色。

2)Open Source Writer’s Group

网址:http://www.oswg.org:8080/oswg

评介:该站点是由LinuxChix的Deb Richardson在去年制作完成的,
为一个开放源代码的集萃站点,特别适合於开放源代码项目的用户。

3)Linux Resources

网址:http://www2.linuxjournal.com/cgi-bi….pl/lr-toc.html

评介:该站点是一个优秀的资料站点,同时适用于Linux新手和专业人士。
在这里,用户可以找到所有相关Linux的资料,而且它还告诉你,
在哪里可以找到相关资料、可以和使用这些资料的人见面,以及其他更多。

4)GNU Project Documentation

网址:http://www.gnu.org/doc/doc.html

评介:如果你手里有一个很好的免费软体却不知如何使用,怎么办?
幸运的是,GNU Project Documentation站点的管理人员已经
为你提供了一个非常综合的文档区。
此外,如果你心情不错,
那么还可以去读读Free Software and Free Manuals上刊登的Richard Stallman的评论。

5)The Vim Homepage

网址:http://www.vim.org/

评介:一个绝对让新手震动的Linux网站。这里有大量的Vim资讯和使用资料。

(十七)X-Window 系统

1)Themes.org

网址:http://www.themes.org

评介:这里有装扮你桌面的所有好东西,
同时还有在window 管理器和其他流行套装软体上更新的X资源和新闻。
此外,Themes.org还有SawMill、Afterstep、 Enlightenment、
WindowMaker、KDE专区等等。

2)KDE Home

网址:http://www.kde.org

评介:该站点能提供给你适用於K Desktop Environment的任何开发资料,
而且还有随时更新的适用於KDE的最新发行软体。
此外,KDE还有许多像K Office之类的相关资料。

3)GNOME Home

网址:http://www.GNOME.org

评介:Gnome.org是一个组织最好的免费软体站点。
在这里,用户可以得到有关GNOME的开发资源,可以加入GNOME邮件列表,
还可以进行软体下载。
开发人员将搜索到最新的附加资料,GNOME用户们还将找到大量有用的文档。

4)XFree86 Project

网址:http://www.xfree86.org

评介:XFree86 Project站点将给用户Linux系统的相关资料、最新发行的软体、
以及一个精彩的FAQ等等。
XFree86站点对於刚入门的Linux新手来说将是一个不可错过的站点。

5)Window Managers for X

网址:http://www.PLiG.org/xwinman

评介:Window Managers for X站点是有关X视窗管理器的最综合性站点。
从最早的一直到最新的乃至全部,以及最大的视窗管理器都可以在该站点找到。
还不知道一个视窗管理器和一个桌面环境的区别吗?该站点也可以回答你这些基本问题。

(十八)Linux 分布站点

1)Debian

网址:http://www.debian.org

评介:Debian网站用户介面非常友好,
并且关於Debian GNU/Linux和Linux一般使用方面内容丰富。
如果你喜欢冒险,
你甚至可以在这里找到如何使用GNU/Hurd内核运行Debian而不是我们都知道
和喜爱的Linux内核。而且还有很多各种各样免费资源的链结供用户使用!

2)Red Hat

网址:http://www.RedHat.com

评介:Red Hat的网站在过去的一年里已经多次发生变化。
但是RedHat.com只是保持做更好的改变。
最新的介面容易流览,并且还为用户提供了大量的链结和下载。

3)SuSE

网址:http://www.SuSE.com

评介:SuSE网站是一个商业站点──没有打算成为"门户"站点或其他。
所以该网站只是仅仅包含了你想了解的SuSE Linux的一切相关资讯。
SuSE的网站对於想知道Linux是否能和他们的硬体相容的用户则是非常有用。

4)Slackware

网址:http://www.Slackware.com

评介:该站点让用户唯一不满的就是太多的图片和太慢的下载速度。
相对而言,Slackware站点是一个漂亮、整洁、黑白形象设计,
而且还对所有重要的材料建了链结。

5)Linux-Mandrake

网址:http://www.Linux-Mandrake.com

评介:Linux-Mandrake站点对於Linux-Mandrake distro的用户来说
确实是一个优秀的网站。
无论你是一个需要寻找技术支援的菜鸟,还是一个想同最新的代码打交道的开发者,
Linux-Mandrake都是实现这一切的捷径。

(十九)用户团体

1)Linux User Groups WorldWide

网址:http://lugww.counter.li.org/lugww.php3

评介:想要寻找离你最近或最远的Liunx用户组吗?
Linux User Groups WorldWide网站有最全面的相关LUGs(Linux用户组)列表。
基於用户地址定位的列表允许相互间建立联系,而且该站点还给出如何创建指南。

2)SVLUG

网址:http://www.sulug.org

评介:该网站很可能是世界上最有活力的LUG站点,
而且一定是人们常频繁光顾的热点地带。
Silicon Valley Linux Users Group站点包含了许多相当有趣的历史和有用链结。

3)Groups of Linux Users Everywhere

网址:http://www2.linuxjournal.com/glue/index.html

评介:GLUE是Linux Journal的主办者。
注册过的LUGs可以参加世界各地的友好Linux公司所提供的活动。
同时,GLUE网站中也有一定数量的LUGs资源,包括技巧等等。

4)Linux Online’s Linux User Group Registry

网址:http://www.linux.org/users/index.html

评介:Linux Online有一个很全面的世界性LUGs列表。
如果你想在此找点你的LUG,请在Linux Online site上列出来。

5)LinuxChix

网址:http://www.linuxchix.org

评介:没错,Chix的确是在钻研Linux。
创立LinuxChix的Deb Richardson想打算制作一个能让女性使用的Linux邮件列表。
LinuxChix发展的很快,简直比Deb期望的还要流行。
而且地区化的LinuxChix LUGs 也已经开始走向全球。

2006年04月22日

一:Peercast整体架构分析

原文http://blog.csdn.net/bbisonic/archive/2006/04/18/667974.aspx

现在的P2P流媒体主要有两种架构:

1.基于树的架构。这是由流媒体的多播演化而来的,也就是播放同一频道的节点组成一棵树,提供广播的源节点为这棵树的根。每个节点可以为下层几个节点提供数据。但这种架构仍然会对上层的结点造成太大的负担,而且在节点动态加入和退出的情况下树不易维护。另外还存在传输延迟问题,所以树的高度不能太大。

2.基于图(MESH)的架构。通过邻居发现寻找相关的节点。这种架构可以实现完全非中心化。

Peercast采用的是基于图的架构。所有Peercast节点都在同一网络中,而且一个Peercast可以同时转播多个频道。由于Peercast集合了客户端和服务器功能,所以一个Peercast可以同时是广播者、转播者和收听者。

Peercast网络架构可分为三层。

第一层是YP。
YP(yp.peercast.org)从广播者中收集频道信息,是整个网络的根。

第二层是广播者。
广播者向YP发送频道信息,这样YP就能有一个完整的广播者的列表。

第三层是转播者
转播者收听频道,每个广播者维护一份转播者的列表。

P2P流媒体的运行模式
视频/音频输入+编码器+Peercast+播放器

视/音频输入:这是频道的来源,可以是实时事件(电视),也可以是文件(MP3/WMV)
编码器:用于将文件编码成更易于传输的流格式,可以是SHOUTcast DSP和windows media encoder等
播放器:播放编码后传输的文件

Peercast:根据其完成的功能可分为下列几个模块:
1.获取媒体数据:作为广播者读取编码器发送过来的流数据
2.用户界面:以GUI和网页方式提供控制
3.数据传送:在节点间传递控制信息和频道流具体数据
4.节点选择:选择要进行传输的最佳节点
5.缓冲管理:管理流缓冲以实现流媒体下载和播放
6.HTTP服务器。将流数据用HTTP方式送往播放器

节点的加入与退出:

当一个Peercast节点第一次加入Peercast网络时(点击yp.peercast.org中特定频道的PLAY按钮),例如访问地址是peercast://pls/EF49346D72FD05F234D3DA2C33FF3A9C?ip=61.213.94.129:2010 。它会先与广播这个电台的IP(61.213.94.129:2010)建立连接。由于这个广播者是不变的,所以至少会有一个特定的连接。如果广播者是满负荷的,那么这个节点可以通过这个广播者同其他转播同一电台的节点建立连接。
通常会建立8个连接。


在这点上是与Gnutella网络不同的,由于必定存在一个广播者,所以不必实现Gnutella中关于节点第一次加入网络的机制(GWebCache),而此时广播者相当于BT软件的一个原始种子。

与本节点转播同一频道的节点(也就是邻居)的信息保存在ChanHitList中,其中ChanHitList是一份ChanHit的链表,每个ChanHit保存一个相关结点的信息。Hit的意思是你想收听的频道的广播者或转播者。

拥塞控制:

当output队列超过50%时进入拥塞控制模式。系统丢弃一些incoming包,并根据包类型和跳树来给outgoing包区分优先值。当output队列降到25%时,系统会关闭拥塞控制模式。

转播时间更久的节点比刚开始转播的节点拥有更高的优先权,这体现在TTL上。刚开始转播的节点广播的包的TTL值为1,而这个TTL值每5分钟会递增1。这样转播时间超过35分钟的结点会有着最高的TTL值7。

节点间的通信:
节点间的通信通过发送和接收控制信息包来实现。Peercast专用协议PCP规定了控制信息包的类型和格式。
ServMgr负责分配、删除和使用servent对象,每个servent对象负责一个具体的连接,而其中包的发送、接收和解析工作由PCP Stream来实现。

传输者的选择:

在建立初始连接之后,节点需要选择一个最佳的节点来传输频道数据。
选择的顺序依次如下:
1.本地转播者
2.邻居转播者
3.本地广播者
4.邻居转播者

比如说如果找到邻居转播者就不用继续往下找,然后从其中选取出最佳的节点作为传输对象,其他作为备用传输者。
这个最佳可从以下三个方面来衡量:


如果这个传输者退出网络,那么必须重新按上次方法选择下一个传输者。
由于备用传输者较多,所以当节点动态退出网络时不会造成太大的影响。


缓冲机制:

流(stream):流在Peercast中是一个非常重要的概念。所谓流,就是字符串的集合。所以无论是包、视/音频数据都可以看做是一个流。

Peercast的缓冲机制是通过ChanPacketBuffer实现的,里面包含有多个ChanPacket,每个ChanPacket封装了实际的数据。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
二、Peercast收听电台的源代码流程分析

原文:http://blog.csdn.net/bbisonic/archive/2006/04/12/660876.aspx

以收听JOKV-FM(TEST)为例,在YP上点击Play,则其URL地址为
peercast://pls/25838B9F1EAE27079B793C9FBA0E4156?tip=222.148.187.176:7144


case WM_COPYDATA:
   {
    COPYDATASTRUCT *pc = (COPYDATASTRUCT *)lParam;
    LOG_DEBUG("URL request: %s",pc->lpData);
    if (pc->dwData == WM_PLAYCHANNEL)
    {
     ChanInfo info;
     servMgr->procConnectArgs((char *)pc->lpData,info);
     chanMgr->findAndPlayChannel(info,false);
    }
    //sys->callLocalURL((const char *)pc->lpData,servMgr->serverHost.port);
   }
   break;

// 解析连接参数,str表示相应的频道URL,例65051E037A7A2A3433090065051E037A?tip=211.132.83.9:7144
// 从URL中解析频道的相关信息以初始化info

void ServMgr::procConnectArgs(char *str,ChanInfo &info)
{
 char arg[512];
 char curr[256];

 //使args等于?后面的字符串,即tip=211.132.83.9:7144
 char *args = strstr(str,"?");
 if (args)
  *args++=0;

 info.initNameID(str);

 if (args)
 {
  //nextCGIarg分解字符串,把"tip"保存到curr中,"211.132.83.9"保存到arg中
  while (args=nextCGIarg(args,curr,arg))
  {
   LOG_DEBUG("cmd: %s, arg: %s",curr,arg);

   if (strcmp(curr,"sip")==0)
   // sip – add network connection to client with channel
   {
    Host h;
    h.fromStrName(arg,DEFAULT_PORT);
    if (addOutgoing(h,servMgr->networkID,true))
     LOG_NETWORK("Added connection: %s",arg);

   }else if (strcmp(curr,"pip")==0)
   // pip – add private network connection to client with channel
   {
    Host h;
    h.fromStrName(arg,DEFAULT_PORT);
    if (addOutgoing(h,info.id,true))
     LOG_NETWORK("Added private connection: %s",arg);
   }else if (strcmp(curr,"ip")==0)
   // ip – add hit
   {
    Host h;
    h.fromStrName(arg,DEFAULT_PORT);
    ChanHit hit;
    hit.init();
    hit.host = h;
    hit.rhost[0] = h;
    hit.rhost[1].init();
    hit.chanID = info.id;
    hit.recv = true;

    chanMgr->addHit(hit);
   }else if (strcmp(curr,"tip")==0)
   // tip – add tracker hit
   {
    Host h;
    h.fromStrName(arg,DEFAULT_PORT);
    chanMgr->addHit(h,info.id,true);
   }


  }
 }
}

根据info中的信息寻找和播放频道


void ChanMgr::findAndPlayChannel(ChanInfo &info, bool keep)
{
 ChanFindInfo *cfi = new ChanFindInfo;
 cfi->info = info;
 cfi->keep = keep;
 cfi->func = findAndPlayChannelProc;


 sys->startThread(cfi);
}

启动线程

THREAD_PROC findAndPlayChannelProc(ThreadInfo *th)
{
 ChanFindInfo *cfi = (ChanFindInfo *)th;

 ChanInfo info;
 info = cfi->info;


 Channel *ch = chanMgr->findChannelByNameID(info);

 chanMgr->currFindAndPlayChannel = info.id;

 if (!ch)
  ch = chanMgr->findAndRelay(info);

 if (ch)
 {
  // check that a different channel hasn`t be selected already.
  if (chanMgr->currFindAndPlayChannel.isSame(ch->info.id))
   chanMgr->playChannel(ch->info);

  if (cfi->keep)
   ch->stayConnected = cfi->keep;
 }

 delete cfi;
 return 0;
}

创建频道

// 寻找和转播相应频道
Channel *ChanMgr::findAndRelay(ChanInfo &info)
{
 char idStr[64];
 info.id.toStr(idStr);
 LOG_CHANNEL("Searching for: %s (%s)",idStr,info.name.cstr());
 peercastApp->notifyMessage(ServMgr::NT_PEERCAST,"Finding channel…");


 Channel *c = NULL;

 c = findChannelByNameID(info);

 //如果当前没有转播该频道,则新创建一个频道
 if (!c)
 {
  c = chanMgr->createChannel(info,NULL);
  if (c)
  {
   c->setStatus(Channel::S_SEARCHING);   
   c->startGet();
  }
 }

 for(int i=0; i<600; i++) // search for 1 minute.
 {

  c = findChannelByNameID(info);

  if (!c)
  {
   peercastApp->notifyMessage(ServMgr::NT_PEERCAST,"Channel not found");
   return NULL;
  }

  
  if (c->isPlaying() && (c->info.contentType!=ChanInfo::T_UNKNOWN))
   break;

  sys->sleep(100);
 }

 return c;
}

创建频道

Channel *ChanMgr::createChannel(ChanInfo &info, const char *mount)
{
 lock.on();

 Channel *nc=NULL;

 nc = new Channel();

 //将新建的频道加入频道列表
 nc->next = channel;
 channel = nc;


 nc->info = info;
 nc->info.lastPlayStart = 0;
 nc->info.lastPlayEnd = 0;
 nc->info.status = ChanInfo::S_UNKNOWN;
 if (mount)
  nc->mount.set(mount);
 nc->setStatus(Channel::S_WAIT);
 nc->type = Channel::T_ALLOCATED;
 nc->info.createdTime = sys->getTime();

 LOG_CHANNEL("New channel created");

 lock.off();
 return nc;

开始获取数据,即新创建一个Source并调用startStream进行实际传输
void Channel::startGet()
{
 srcType = SRC_PEERCAST;
 type = T_RELAY;
 info.srcProtocol = ChanInfo::SP_PCP;


 sourceData = new PeercastSource();

 startStream();
}

启动传输线程
void Channel::startStream()
{
 thread.data = this;
 thread.func = stream;
 if (!sys->startThread(&thread))
  reset();
}

进行实际的流传输,调用ChannelSource::stream函数
THREAD_PROC Channel::stream(ThreadInfo *thread)
{
// thread->lock();

 Channel *ch = (Channel *)thread->data;

 while (thread->active && !peercastInst->isQuitting)
 {
  LOG_CHANNEL("Channel started");


  ChanHitList *chl = chanMgr->findHitList(ch->info);
  if (!chl)
   chanMgr->addHitList(ch->info);

  ch->sourceData->stream(ch);

  LOG_CHANNEL("Channel stopped");

  if (!ch->stayConnected)
  {
   break;
  }else
  {
   if (!ch->info.lastPlayEnd)
    ch->info.lastPlayEnd = sys->getTime();

   unsigned int diff = (sys->getTime()-ch->info.lastPlayEnd) + 5;

   LOG_DEBUG("Channel sleeping for %d seconds",diff);
   for(unsigned int i=0; i<diff; i++)
   {
    if (!thread->active || peercastInst->isQuitting)
     break;
    sys->sleep(1000); 
   }
  }
 }

 ch->endThread();

 return 0;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

三、用Peercast广播视频文件(WMV格式)

原文:http://blog.csdn.net/bbisonic/archive/2006/04/12/660678.aspx

1.安装Windows media encoder

2.新建会话中选择自定义会话

3.源来自选择文件,在文件名中点击浏览选择要广播的视频(WMV)

4.在输出中选择自编码器拉传递,端口号填8080

5.点击应用

6.在Peercast的Broadcast页面中URL填入http://localhost:8080,其他项根据你的选择设置,然后点击Create Relay

7.在WIndows media encoder中菜单中选择控制->开始编码

8.若广播建立成功,在Relays页面中可以看见刚刚建立的频道,点击Play即可播放

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

四、Peercast各个版本的更新记录

原文:http://blog.csdn.net/bbisonic/archive/2006/04/12/660660.aspx

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

五、Peercast的日志实现

原文:http://blog.csdn.net/bbisonic/archive/2006/04/06/653221.aspx

这里以输出DEBUG信息为例子。

输出日志函数为LOG_DEBUG。具体使用方法为LOG_DEBUG("Play request: %s",pc->lpData);

void LOG_DEBUG(const char *fmt,…)
{
 if (servMgr)
 {
  if ((servMgr->showLog & (1<<LogBuffer::T_DEBUG)) && (!servMgr->pauseLog))
  {
   va_list ap;
     va_start(ap, fmt);
   ADDLOG(fmt,ap,LogBuffer::T_DEBUG);
      va_end(ap); 
  }
 }
}

ADDLOG函数

void ADDLOG(const char *fmt,va_list ap,LogBuffer::TYPE type)
{
 if(sys)
 {
  const int MAX_LINELEN = 1024;

  char str[MAX_LINELEN+1];
  vsnprintf(str,MAX_LINELEN-1,fmt,ap);
  str[MAX_LINELEN-1]=0;

  if (type != LogBuffer::T_NONE)
   sys->logBuf->write(str,type);

  peercastApp->printLog(type,str);
 }
}

void APICALL MyPeercastApp ::printLog(LogBuffer::TYPE t, const char *str)
{
 ADDLOG(str,logID,true,NULL,t);
 if (logFile.isOpen())
 {
  logFile.writeLine(str);
  logFile.flush();
 }
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

六、Sys.h源代码分析

原文:http://blog.csdn.net/bbisonic/archive/2006/04/06/652931.aspx

String类:完成字符串的一些定义和操作

Random类:可调用next方法返回随机数

Sys类:提供一些系统功能,如线程操作、返回随机数、返回时

WEvent类:

WLock类:对临界区操作的封装,用于线程同步

ThreadInfo类:线程信息

String类:完成字符串的一些定义和操作

Random类:可调用next方法返回随机数

Sys类:提供一些系统功能,如线程操作、返回随机数、返回时

WEvent类:

WLock类:对临界区操作的封装,用于线程同步

ThreadInfo类:线程信息

String类:完成字符串的一些定义和操作

Random类:可调用next方法返回随机数

Sys类:提供一些系统功能,如线程操作、返回随机数、返回时

WEvent类:

WLock类:对临界区操作的封装,用于线程同步

ThreadInfo类:线程信息

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

七、Peercast的命令行使用方式

原文:http://blog.csdn.net/bbisonic/archive/2006/04/06/652749.aspx

Peercast也可以从命令行启动,有如下几种参数选择

Peercast:正常方式启动

Peercast -inifile:启动,并设置配置文件参数

Peercast -kill:启动后立即关闭

Peercast -url:按照频道的URL地址启动Peercast并播放相应电台

Peercast -multi:以非互斥方式启动

具体实现如下:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 char tmpURL[8192];
 tmpURL[0]=0;
 char *chanURL=NULL;   //频道地址


 iniFileName.set(".\\peercast.ini");

 // off by default now
 showGUI = false;  //初始化时不打开图形窗口

 //根据命令行参数进行处理
 if (strlen(lpCmdLine) > 0)
 {
  char *p;
  if ((p = strstr(lpCmdLine,"-inifile"))!=NULL)
   iniFileName.setFromString(p+8);

  if (strstr(lpCmdLine,"-zen"))
   showGUI = false;

  if (strstr(lpCmdLine,"-multi"))
   allowMulti = true;

  if (strstr(lpCmdLine,"-kill"))
   killMe = true;

  if ((p = strstr(lpCmdLine,"-url"))!=NULL)
  {
   p+=4;
   while (*p)
   {
    if (*p==’"’)
    {
     p++;
     break;
    }    
    if (*p != ‘ ‘)
     break;
    p++;
   }
   if (*p)
    strncpy(tmpURL,p,sizeof(tmpURL)-1);
  }
 }

 // get current path
 {
  exePath = iniFileName;
  char *s = exePath.cstr();
  char *end = NULL;
  while (*s)
  {
   if (*s++ == ‘\\’)
    end = s;
  }
  if (end)
   *end = 0;
 }

 
 if (strnicmp(tmpURL,"peercast://",11)==0)
 {
  if (strnicmp(tmpURL+11,"pls/",4)==0)
   chanURL = tmpURL+11+4;
  else
   chanURL = tmpURL+11;
  showGUI = false;
 }

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
八、wsocket.h源文件分析
原文:http://blog.csdn.net/bbisonic/archive/2006/04/06/652642.aspx

WSAClientSocket继承自ClientSocket,完成对基本WinSock函数的封装。

ClientSocket只是提供一个接口,具体实现由其继承类WSAClientSocket(WINDOWS)和UClientSocket (UNIX)实现

这里先介绍一下Host类:

unsigned int ip; //主机IP

unsigned short port; //主机端口号
 unsigned int value;

下面介绍一下WSAClientSocket的具体实现

//初始化,每个Winsock应用都必须加载合适的WinSock DLL版本.加载库是通过调用WSAStartup函数实现的

void WSAClientSocket::init()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
   
 wVersionRequested = MAKEWORD( 2, 0 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
  throw SockException("Unable to init sockets");

}

//建立套接字,通过调用socket函数来实现

void WSAClientSocket::open(Host &rh)
{
 sockNum = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

 if (sockNum == INVALID_SOCKET)
  throw SockException("Can`t open socket");

 setBlocking(false);
#ifdef DISABLE_NAGLE
 setNagle(false);
#endif

 host = rh;

 memset(&remoteAddr,0,sizeof(remoteAddr));

 remoteAddr.sin_family = AF_INET;
 remoteAddr.sin_port = htons(host.port);
 remoteAddr.sin_addr.S_un.S_addr = htonl(host.ip);

}

//服务器绑定。一旦为某种协议创建了套接字,就必须将套接字绑定到一个已知地址上。使用bind函数

void WSAClientSocket::bind(Host &h)
{
 struct sockaddr_in localAddr;

 if ((sockNum = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
  throw SockException("Can`t open socket");

 setBlocking(false);
 setReuse(true);

 memset(&localAddr,0,sizeof(localAddr));
 localAddr.sin_family = AF_INET;
 localAddr.sin_port = htons(h.port);
 localAddr.sin_addr.s_addr = INADDR_ANY;

 if( ::bind (sockNum, (sockaddr *)&localAddr, sizeof(localAddr)) == -1)
  throw SockException("Can`t bind socket");

//接下来要做的,是将套接字置入监听模式。bind函数的作用只是将套接字和指定的地址关联在一起。指示套接字等待连接传入的API是listen

 if (::listen(sockNum,SOMAXCONN))
  throw SockException("Can`t listen",WSAGetLastError());

 host = h;
}

 //现在我们已做好了接受客户机连接的准备,通过ACCEPT函数来完成

ClientSocket *WSAClientSocket::accept()
{

 int fromSize = sizeof(sockaddr_in);
 sockaddr_in from;

 int conSock = ::accept(sockNum,(sockaddr *)&from,&fromSize);


 if (conSock ==  INVALID_SOCKET)
  return NULL;

 
    WSAClientSocket *cs = new WSAClientSocket();
 cs->sockNum = conSock;

 cs->host.port = from.sin_port;
 cs->host.ip = from.sin_addr.S_un.S_un_b.s_b1<<24 |
      from.sin_addr.S_un.S_un_b.s_b2<<16 |
      from.sin_addr.S_un.S_un_b.s_b3<<8 |
      from.sin_addr.S_un.S_un_b.s_b4;


 cs->setBlocking(false);
#ifdef DISABLE_NAGLE
 cs->setNagle(false);
#endif

 return cs;
}

 //关闭套接字

void WSAClientSocket::close()
{
 if (sockNum)
 {
  shutdown(sockNum,SD_SEND);

  setReadTimeout(2000);
  try
  {
   //char c;
   //while (readUpto(&c,1)!=0);
   //readUpto(&c,1);
  }catch(StreamException &) {}

  if (closesocket(sockNum))
   LOG_ERROR("closesocket() error");


  sockNum=0;
 }
}

//客户端连接

 void WSAClientSocket::connect()
{
 if (::connect(sockNum,(struct sockaddr *)&remoteAddr,sizeof(remoteAddr)) == SOCKET_ERROR)
  checkTimeout(false,true);

}

//发送数据

void WSAClientSocket::write(const void *p, int l)
{
 while (l)
 {
  int r = send(sockNum, (char *)p, l, 0);
  if (r == SOCKET_ERROR)
  {
   checkTimeout(false,true); 
  }
  else if (r == 0)
  {
   throw SockException("Closed on write");
  }
  else
  if (r > 0)
  {
   stats.add(Stats::BYTESOUT,r);
   if (host.localIP())
    stats.add(Stats::LOCALBYTESOUT,r);

   updateTotals(0,r);
   l -= r;
   p = (char *)p+r;
  }
 }
}

//接收数据

int WSAClientSocket::read(void *p, int l)
{
 int bytesRead=0;
 while (l)
 {
  int r = recv(sockNum, (char *)p, l, 0);
  if (r == SOCKET_ERROR)
  {
   // non-blocking sockets always fall through to here
   checkTimeout(true,false);

  }else if (r == 0)
  {
   throw EOFException("Closed on read");

  }else
  {
   stats.add(Stats::BYTESIN,r);
   if (host.localIP())
    stats.add(Stats::LOCALBYTESIN,r);
   updateTotals(r,0);
   bytesRead += r;
   l -= r;
   p = (char *)p+r;
  }
 }
 return bytesRead;
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

2006年04月18日

发现了将feed转变成js代码的在线服务,便去试用了一下,可以在blog里显示出来,更有趣的是它也是开源的,便载了回家自己玩,放在了自己的免费php空间作己用,下面为我自己的feed的效果:

提供了比较详细的css设置,可以做自己的rss输出,有兴趣的可以去 试一下

开源下载

2006年04月12日

以下引自:http://www.postshow.net/2006/04/webcs.php
web版本的游戏我们首先考虑到的可能是基于Flash,或者基于Ajax技术的猜谜游戏,虽然国外很多神人开发了鼠标移动平滑视觉效果逼真的动作游戏,但是Flash右键的局限是个问题。

1、今天给大家介绍的是一个基于ShockWave的在线多人射击游戏,叫phosphor
目前还是beta1,但是已经足够好玩了。当你这个游戏的时候浏览器会提醒你安装ShockWave运行平台【如果你没有】,安装完成后游戏开始自动加
载,这个加载过程类似于我们运行桌面游戏的过程,我们可以看到各个进程。你会发现它实际上相当于你远程启动了一个桌面游戏。最值得一提的是这款游戏的体验
丝毫不逊于CS,设置项丰富,鼠标速度和平滑度也可以自己调试,真的是一个高级游戏,值得大家消遣。

游戏地址

2、当然,如果你和我一样在游戏里只有死的份儿,还是建议玩这个吧——Bunny Hunt,这款游戏是用javascript写出来的,这里应该是用了Ajax技术。

以下引自http://blog.bsdos.cn/archives/239

3、以前在[超强]flash版的雷神之锤(Quake)一文中介绍过一款基于web网页的游戏,但这个游戏其实并不真正的Quake,只是类型类似于Quake。而这次又在digg上面发现了一个真正的基于网页的Quake游戏。

游戏地址:QUAKE 3 Forever demo v0.52

2006年04月11日

 FLASH导航菜单生成:http://www.hostsun.com/gr/flash_generators.php

图片菜单生成:http://www.hostsun.com/gr/tools6.php
演示:点击查看

下拉菜单:http://www.hostsun.com/gr/tools7.php
演示:点击查看

鼠标移过图片菜单特效:http://www.hostsun.com/gr/tools8.php

CSS(导航菜单):http://www.hostsun.com/gr/tools9.php
演示:点击查看

DHTML(导航菜单):http://www.hostsun.com/gr/tools10.php
演示:点击查看

DHTML ToolTip(导航菜单):http://www.hostsun.com/gr/tools11.php
演示:点击查看

Java Script Menu Generators
集合CSS(按钮):http://www.hostsun.com/gr/tools12.php

弹窗代码生成:http://www.hostsun.com/gr/tools13.php

IE5.5滚动条代码生成:http://www.hostsun.com/gr/tools14.php

用过Google Analytics 如果还需要一个更强大但简单的工具,可以试试ClickTracks的免费网页分析软件:Appetizer。下载前需要注册以便通过e-mail获得序列号。

2006年04月06日

开源在今天的软件业已经很普遍,但开源是否意味着使用者可以对开源后的代码为所欲为呢?答案是否定的。开源运动同样有自己的游戏规则和道德准则。不遵行这些规则不但损害开源运动的健康发展,也会对违规者造成名誉和市场上的损失,更可能陷入法律纠纷和赔偿。

现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。

这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。

BSD开源协议

BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但“为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。

2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。

3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Apache Licence 2.0

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

1. 需要给代码的用户一份Apache Licence

2. 如果你修改了代码,需要再被修改的文件中说明。

3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。

4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

GPL

我们很熟悉的Linux就是采用了GPLGPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linuxlinux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。

GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL 协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。

LGPL

LGPLGPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。 LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

P.S. 随手写写,是因为跟客户交谈的时候发现很多人其实对开源有完全错误的理解,特别是开源协议。很多人认为只要是开源,就意味着随便用,随便改都可以。

dlee补充:

这些知识 Linux Fans 大多比较清楚,因为经常使用开源软件,每天下载源代码,编译、测试、安装是常事。这些问题在各个 Linux 论坛上也早已经是老生常谈,但是有些 Java Fans 以及大多数 M$ 平台的开发人员几乎一无所知。我在这里一般不会谈跟 Java 关系不大的内容。既然 Charlesxp 想谈谈,我也补充一下。

首先,软件有两种分类方法:

商业软件 vs. 免费软件

商业软件:软件是要卖钱的。

免费软件:软件不卖钱,出于兴趣开发,可以随便使用。

开源软件 vs. 私有软件

开源软件:软件的源代码是公开的,可以在遵守某种 license 的条件下加以修改。

私有软件:软件的源代码不公开,用户仅仅只能得到软件的二进制版本。

  从上面的两种区别我们可以看出,开源软件和商业软件不是对等或对立的关系,开源软件同样也可以卖钱。但是给了你源代码,你如果没有一定的功力也未必能看懂。而且用户常常不具备相应的能力(没有从事过软件开发),仅仅想要使用软件的功能。既然这样,开源对于这类用户还有何意义呢?开源可以保护这类用户免于陷入厂商设置的锁定陷阱。因为提供了全部源代码,只要用户能找到有能力维护这些代码的人或公司,他就可以持续发展这些代码的功能。这个人或公司不一定是最初卖软件给他的那一家。用户不会在大部分功能用的好好的,某个关键功能无法使用的时候,买家告诉他,你希望获得的这个功能在我们的下一版本中有,但是你必须支付我们 10w$ 升级费我们才可以提供。这个就叫做厂商锁定。如果软件不是开源的,用户没有办法做出选择,上了贼船后想下来可就难了。所以开源的商业软件对于保护用户自己的利益是非常重要的。用户可以获得真正的安全,而且更体现了软件的本质就是一种高级的服务。

  那么有人会担心,这样做究竟能不能赚到钱?你能不能赚到钱要看市场和需求有多大。只盯着厂商锁定一种方式来赚钱其实是一种短视的行为。现在国内大部分软件开发商都不重视维护和服务,仅仅靠卖软件本身的 copy license 来赚钱,用户感觉不到自己是上帝,怨声载道。其实用户所需要的还是长期的维护和服务。所以这样的软件如果真能把服务做好,用户是会非常欢迎的。既然经过分析预计会有很大的需求,从长期看,我相信肯定是可以赚到钱的。

  还有一类软件:共享软件。这类软件不是开源的,但是有免费的版本可以使用。如果你用的很爽,良心发现了,可以把钱汇给作者。如果希望作者提供服务,也可以找他谈。国内很有名的 FoxMail 就是这类软件。但是对于用户最有价值的一类软件,其实还是开源的商业软件。

  开源软件卖的是长期的服务,不是软件本身的 copy。不是所有的软件都有可能卖服务,也不是所有的用户都需要服务(这个问题我们以后可以讨论)。但是一个大型企业或者重要的政府机关,假设使用了 JBoss+MySQL 这种组合,长期的服务是非常必要的(至少出了事情可以找到一个替罪羊)。你问这个问题就说明你没有多少企业应用的经验,不知道 IBM 这些公司的商业模式就是建立在 IT 服务的基础之上的。开源软件提供了一个新的组合,对于更好地做好这种服务非常有帮助。实际上,IBM 的解决方案中就包括了大量开源的成果。HP 做的方案也有采用 JBoss 的,为了得到长期的服务,HP JBoss 专门签订了长期合作的协议。

    中国国内由于市场容量的限制,以及用户缺乏信息化的经验,对于软件长期服务的重要性认识不足,因此总是只看到软件本身的售价,给了一些夫妻店竞相压价钻空子的机会。但是必须承认,这并不是一种良性竞争的状态。最终还是要走到切实为用户做好服务的道路上来的。服务是值钱的,不是免费的。你去路边的理发馆随便理个发,5 块钱,出来以后仍然蓬头垢面。你去高级发廊做头,500 块,但是你得到了按摩等各种服务(不要联想引申),身心得到了放松,出来以后精神焕发。你只盯着路边的理发馆,但是仍然有别人愿意去高级的发廊。

  当然,真正要做好服务,对于技术等各方面的能力要求是非常高的。这种要求不是随便哪个夫妻店就能够达到的。

robbin补充:

  Richard StallmanGNU创始人和GPL的创造者,Stallman开发的比较著名的GPL软件包括GNU GCCGNU Emacs。其中EmacsStallman独立开发的早期也是卖钱的。Stallman定的Emacs售价为每份150美元。

  因此请记住: 开源软件不等于免费软件。

2006年04月01日

据说在欧洲被称为唯一能与NOD32媲美的杀软。
来自捷克的AVAST,已有17年的历史,但最近才在我们这里兴起,它在国外市场一直处于领先地位。
    它的家庭版是免费得,只要在它的网页上填写一下资料,但是邮箱一定要写正确,这样它才能把使用KEY发给你,这你也就可以享用它14个月了,然后再注册再使用。
    Avast!的实时监控功能十分强大!它拥有七大防护模块:网络防火墙防护、标准的本地
文件读取防护、网页防护、即时通讯软件防护、邮件收发防护、P2P软件防护。这么完善的防
护系统,定能让你的系统练就一副金刚不坏之身!任意开启各项保护模块能够查杀流氓软件,比如3721。升级很人性化
    Avast是捷克一家软件公司(ALWIL Software)的产品。ALWIL
软件公司的研发机构在捷克的首都-布拉格,现在他们和世界上许多国家的安全软件机构都有良好的合作关系。
    早在80年代末ALWIL公司的安全软件已经获得良好的市场占有率,但当时仅限于捷克地区。
ALMIL公司是擅长于安全软件方面的研发,开发的Avast
    Antivirus系列是他们的拳头产品,Avast在许多重要的市场和权威评奖中都取得了骄人的成绩,同样在此后进军国际市场上也赢得了良好的增长率。
主要特点:
(1)高侦测的反病毒表现,多次获得过ICSA和Virus
Bulletin
100%认证,启发式强大。
(2)较低的内存占用和直观,简洁的使用界面。
(3)支持SKIN更换,完善的程序内存检测
(4)对SMTP/POP3/IMAP邮件收发监控的全面保护。
(5)支持MS
OUTLOOK外挂,智能型邮件帐号分析。
(6)支持宏病毒文档修复,修复档案后自动产生病毒还原数据库(VRDB功能)。
(7)支持P2P共享下载软件和即时通讯病毒检测,保护全面。
(8)良好有效的侦测并清除病毒,如虫,广告和木马程序
(9)病毒库更新速度快,对新型病毒和木马有迅捷的反应。
 功能特性如下:
*反病毒内核
*自动升级
*简单的使用界面
*病毒隔离区
*实时监控
*系统结合 
*P2P和聊天软件监控保护
*病毒清除
*网络防护
*64位系统支持
*网页防护
*多国语言支持
*增强型用户界面
*恶意脚本屏蔽       *DOS下扫描
*扩展病毒库升级      *移除病毒备份
占用内存不到25兆,让老机器也流畅
序列号:
S6039686R6039W1106-FBYVE2MU 有效期2009.5.6
升级有效期2010.1.1
S7935192R4371Z1106-S1BJD5AJ 有效期2012.1.6
升级有效期2008.8.1
S6945137R6826L1106-WXH4K1SJ 有效期2008.4.6
升级有效期2010.9.
官方原版下载:
下载ENGLISH:http://files.avast.com/iavs4pro/setupengpro.exehttp://files.avast.com/iavs4pro/setupengpro.exe
中文简体下载:http://files.avast.com/iavs4pro/setupchspro.exehttp://files.avast.com/iavs4pro/setupchspro.exe