占位手记 2(0分)

  • 主题发起人 小雨哥
  • 开始时间

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
老套路:
本贴是一个占位手记,没有十分的必要,请勿跟贴。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
日新月异,除了大富翁没变。顺带地,还有一批老富翁,常回家看看。
感谢,这是我唯一可以表达的词语。感谢大富翁,感谢大富翁上所有的人。我的生命的每一天都会非常快乐,因我一直在编程,一直活跃在大富翁。
追溯起来,九几年(记不清了,操作系统被NG了几百回,电脑也换了N代,手头没有遗留下任何痕迹),一直混迹在钱智达先生的邮件列表上,那时候最先进的交流平台是一个叫“蓝波”的字符界面的发布系统,没有滚动条,阅读的唯一方式就是 PageUP 和 PageDown,而且仅限于学院内部(文字也是一个一个往外蹦,刷新时,上半部分屏幕有内容了,等你看光了上半部分,就可以出去小解一下,抽根烟再回来看下半部分有没有显示出来。386嘛,还是我在广州买了配件自己装的,市场价是 1万6,自己装500块,那时居然没有能力组织生产,要不然也可能就是中国“戴尔”了,哈哈),也根本谈不上“主题”,几乎就是新闻旧闻的报道体裁(其实,我也是最近才知道,网络上所谓的主题,是指一个内容被集中地、高密度地从不同角度被审视)。邮件列表因为可以每天收到对主题的讨论,从而被当时的极少数人热衷(极少数是因为当时大部分人还根本不会用电脑)。后来有了一个叫“济南万千”的论坛,是我记忆中国内唯一的拥有纯技术版块的论坛(记得好像它有其他版块,只是少有人访问,它还同时兼有邮件列表功能,甚至我还记得有一次我因商务谈判出门2个月,回家打开信箱时,几千个新邮件把电脑整死在那里的情景),一直到它在99年关门(2004年的某一天,我收到了一封邮件,通知我“济南万千”重新开张,出于对它的尊重,我第一时间访问了那里)。玩完了,没有地方可以去了,虽然每天跑的是“吱~~滴滴滴”,说是56K,实际只有17、8K(bps/s)的电话线拨号上网的猫,每月支出260多元的电话费的状态,还是最后跑到QQ论坛上去混了半年多。
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
沙发!我靠,现在流行这个~~~
另外,可能我记忆有错误,当年的“万千”,可能根本就只是一个邮件列表而不是论坛。又随手搜索了一下,嗨,居然还有这么多当年的“万千”众生怀念着它。呵呵,不知道他们是否也还记得我了,年轻真好。
 
D

dingbaosheng

Unregistered / Unconfirmed
GUEST, unregistred user!

冰力不足

Unregistered / Unconfirmed
GUEST, unregistred user!
小雨哥的代码写得很好的, 几年前我为了搜索验证码识别的资料, 看过小雨哥的代码. 那个站叫什么 01来着.
 
S

shunweb

Unregistered / Unconfirmed
GUEST, unregistred user!
01cn.net 可惜好久不能访问了。
如果有以前的数据库和论坛系统,我个人也许可以出份薄力,我现有的一个 1G MySQL5.0 + PHP 的空间也许可以做个镜像。我不想承诺什么,只是有这个想法^_^
 
C

cobook

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi虽然日薄西山了,想起年轻时在delphi上的日日夜夜,还是很怀念的。看到小雨哥、dingbaosheng等熟悉的“面孔”,还是很亲切。
 
W

wjqhyg

Unregistered / Unconfirmed
GUEST, unregistred user!
鄙视马甲!!!!
 
Y

yayongm

Unregistered / Unconfirmed
GUEST, unregistred user!
A

apiao

Unregistered / Unconfirmed
GUEST, unregistred user!
现在这里还有谁比我老!!
 

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
小雨哥,现在准备去哪混啊。
 
W

wql

Unregistered / Unconfirmed
GUEST, unregistred user!
今天回来看看,既然有点感叹!
 
L

leilele

Unregistered / Unconfirmed
GUEST, unregistred user!
各位老人家,小妹有个爬遍论坛无人理会的问题想请教一下,加我QQ252809265
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
谢谢大家关注呀。回天真兄,我现在还在盛大来着。回冰力不足兄,01cn 好像停办了,我也无法访问到。
今天还是象往常一样,论坛也一直没有什么起色。说实在的,如今的技术论坛,不论国内国外,都处于萧条状态,也就是说,纯技术的论坛,到今天这样就已经到头了,大富翁还能保持资料的全面开放,许多国内国外类似的技术论坛,连资料都不再开放了。然而,另一种源于技术论坛的论坛却额外地在近一年时间里被关注起来,那就是所谓的“开发者论坛”。
技术论坛在近年里,走过了象大富翁这样的论坛形式,在这个形式下,大富翁论坛是曾经最成功的论坛,之后,技术论坛进入了 BLOG 化,大富翁也是最早引入这个概念的,但目前比较成功的 BLOG 论坛是 CSDN,技术领域的 BLOG 的出现,给许多技术中坚提供了即可以展示自己、又可以避免被口水淹没的领地,但它本身与论坛的氛围差距实在太远,注定了只是论坛的附属品,为什么会这样呢?因为 BLOG 这种形式,违背了马斯洛的需求宝塔,它提供的只是自娱自乐的场所,几乎隔断了所有善意的交流。
这预示着技术论坛还将会改变,它会变成怎么样呢?GOOGLE 尝试着古老的开放源代码库的方法,就是 code.google.com ,不过,这可不是象看着那么纯粹,google 绝不会停留在早在上世纪 50 年代就形成的开放源代码库的水平,它要通过这个地方推广它的理念,把 google 带出 PC 走向每个人的日常生活。邀请制怎么样?没有注册页面,来的人都是成员间相互推荐和邀请,这种形式在 BT 论坛越来越盛行,吵得不可开交的 BT 论坛,用这种方式来彼此阻断资源的共享,假如流入技术论坛,不仅没有解决交流的阻碍,也无法解决老态论坛自身的问题。那么商业化吧,象淘宝,经过这些年的经营,它已经俨然是网络交易的法律,但技术论坛拿什么商业化?贴 N 多的广告?还是把回答问题的得分直接换算成 RMB?显然是很难操作的一件事。
正当技术论坛陷于迷茫的时候,交友论坛的空前成功,给大家带来了很多的启示:网络是社会的,既然我们不能阻断现实中的恶习,就让恶习在网络里平衡。每个 ID 应该有它的领地,就像 BLOG 那样,但这个领主同样要接受被好评和差评,就像淘宝的交易信誉一样,论坛应该提供一种让人一目了然的标记,提醒准备参加讨论的人,讨论是由什么样的人发起的。
如果说 WEB2 是为了个性化,WEB3 就是为了社会化。社会化的技术论坛还没有浮现,开发者论坛却已经悄悄走近,苹果、微软、谷歌、索尼都在拼,我想,目前来看,开发者论坛这样的操作,还是产品企业有能力和有必要做的事,纯技术论坛还是再等等看看比较好。
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
看到 http://www.delphibbs.com/delphibbs/dispq.asp?lid=3924528 在讨论如何得知很大的文件是否相同,突然有个想法,是否可以这样做:
利用黄金分割点的办法,快速地选择检查点,从而大致判定二个很大的文件是否相同,于是就写了下面这个代码。方法就是选择一些特别的点去评估,代码中只是从头到尾地做了一遍,假如再从尾到头地来一遍,准确度就不见得会输于用 MD5 的比较,而耗费的时间却极短,完全可以用于非人为做假前提下的超大文件的相似性判定(代码中只做了是否相同的判定,没有做相似性判定,如果有需要,我想,做相似性判定的意义更大些)。
实际上,不论是 MD5 还是其他的方法(校验和除外),本质上都是获取文件特征,而获取文件特征就有初略的和精细的分别,对于很大的文件,用这种特定点的取样来处理,未必不是一条可行之路。
完整的源代码贴于下面,并在最后还有简单的测试代码样例,供大家参考和批评:
unit CheckPoint;
interface
uses
Windows, SysUtils, Classes;
const
DefaultPoint = 1000;

type
TSampleCompare = class(TList)
private
procedure Init;
function CreateCheckPoint(Num:integer): integer;
function GetPosition(Index: Integer): Longword;
procedure SelectSample(FileName: string;
SampleBuffer: TMemoryStream);
public
constructor Create(CheckPoint: integer = DefaultPoint);
function FileCompare(FileName1, FileName2: string): Boolean;
property DiffPoint[Index: Integer]: Longword read GetPosition;
default;
end;

implementation
{ TSampleCompare }
constructor TSampleCompare.Create(CheckPoint: integer);
var
i: integer;
begin
inherited Create;
Count := CheckPoint;
Items[0] := pointer(0);
Items[1] := pointer(1);
Items[2] := pointer(1);
for i := 3 to (CheckPoint - 1)do
Items := pointer(-1);
Init;

end;

function TSampleCompare.CreateCheckPoint(Num: integer): integer;
begin
Result := integer(Items[Num]);
if (Result = -1) then
begin
Result := CreateCheckPoint(Num - 2) + CreateCheckPoint(Num - 1);
Items[Num] := pointer(Result);
end;

end;

function TSampleCompare.FileCompare(FileName1, FileName2: string): Boolean;
var
M1, M2: TMemoryStream;
begin
Result := False;
M1 := TMemoryStream.Create;
M2 := TMemoryStream.Create;
try
SelectSample(FileName1, M1);
SelectSample(FileName2, M2);
if (M1.Size = M2.Size) then
Result := CompareMem(M1.Memory, M2.Memory, M1.Size);
finally
M1.Free;
M2.Free;
end;
end;

function TSampleCompare.GetPosition(Index: Integer): Longword;
begin
if (Index < 0) or (Index >= Count) then
Result := Longword(Items[0])
else
Result := Longword(Items[Index]);
end;

procedure TSampleCompare.Init;
var
i: integer;
begin
for i := 3 to Count - 1do
CreateCheckPoint(i);
end;

procedure TSampleCompare.SelectSample(FileName: string;
SampleBuffer: TMemoryStream);
var
FHandle: integer;
FSize:Longword;
FStruct:TOFStruct;
i: integer;
FBytesRead: Longword;
FWrite: Pointer;
begin
if not Assigned(SampleBuffer) then
exit;
SampleBuffer.Clear;
FillChar(FStruct, sizeof(FStruct), 0);
FHandle := OpenFile(PChar(FileName), FStruct, 0);
try
FSize := GetFileSize(FHandle, nil);
for i := 0 to Count - 1do
begin
if DiffPoint < FSize then
begin
SetFilePointer(FHandle, DiffPoint, nil, FILE_begin
);
SampleBuffer.Position := SampleBuffer.Size;
SampleBuffer.Size := SampleBuffer.Size + sizeof(integer);
FWrite := Pointer(Longword(SampleBuffer.Memory) + SampleBuffer.Position);
ReadFile(FHandle, FWrite^, sizeof(integer), FBytesRead, nil);
end
else
Break;
end;

finally
CloseHandle(FHandle);
end;
end;

end.

测试的样例代码如下,也非常简单:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CheckPoint;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
FCheckPoint: TSampleCompare;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
const
FileName1 = 'C:/Heroes5.zip';
// Size > 1.5G
FileName2 = 'C:/TrackMania.rar';
// Size > 1.5G
procedure TForm1.FormCreate(Sender: TObject);
begin
FCheckPoint := TSampleCompare.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FCheckPoint.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
FMsg: string;
begin
FMsg := '二个文件似乎是不相同的!';
if FCheckPoint.FileCompare(FileName1, FileName2) then
FMsg :='二个文件好像是相同的.';
ShowMessage(FMsg);
end;

end.
 
W

wjiachun

Unregistered / Unconfirmed
GUEST, unregistred user!
小雨哥,好久不见,一事相求,如果有收集过“酷太阳工作组”的图形方面的实验文档,麻烦发送一份至 jiachun@gmail.com ,如果没有也表示感谢。
 
L

luoyanqing119

Unregistered / Unconfirmed
GUEST, unregistred user!
老的新的富翁,大家都不要感叹了。生活总要继续
 
M

madic

Unregistered / Unconfirmed
GUEST, unregistred user!
今天看了一下,还能看到小雨哥的回复,我还以为大富翁的厉害人物都不上这了..
对于小雨哥的回复,我的回答也是和你一样的... 我对于一般文件会做前中后3K的检查...
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
——永远不变的只有变化
计算机在被刚发明时,全世界只有十来个顶尖的专家才会使用,随着时间的推移,越来越
多的技术人员以及普通人开始接触它——用户群在变化,需求在变化,计算机也在变化。计
算机是如此,硬件、软件技术、网络也是一样。
技术人员关心技术的实现细节,而非技术人员更加关心技术能干什么,为了满足前者,开
源软件及代码库应运而生,为了满足后者,网上购物、博客、相册等如雨后春笋。做为技术
论坛,实际上承担着技术性和社会化两个方面的责任,所以,在不同的时期调整两个方面的
比例以适应需求,也是有必要的。
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
啊,确实如此。本着学习的精神,最近安装了 Delphi2009 12.0.3128.15596 版本,观察其中的 System 单元的变化如下:
[版本:255天预发布版 12.0.3128.15596 - Unregistered]
1. Char 默认是 WideChar 类型,使用原来的 AnsiChar 类型的 Char 时,必须指明是 AnsiChar
2. 增加编译标识 {$DEFINE UNICODE}、{$IFNDEF UNICODE}、{$IFDEF UNICODE}
不过,很遗憾,并没有 ~Unicode 这样的编译指示,导致以前版本的代码可能都需要修改啦
3. RTLVersion = 20.00 (Delphi2007 = 18.00)
4. 增加类型的别名定义:
CppLongInt = type LongInt;
CppULongInt = type LongWord;
Int8 = ShortInt;
Int16 = SmallInt;
Int32 = Integer;
UInt8 = Byte;
UInt16 = Word;
UInt32 = Cardinal;
5. Variant 类型增加 21、258(varUInt64 和 varUString)另外增加 vtUnicodeString = 17
6. 虚方法表成员位置改变(好像是增加了三个成员:vmtEquals、vmtGetHashCode、vmtToString,
用于扩展 TObject 的特性(新的方法)。于是,原值统统变化 3 * 4)
7. TObject 还增加了一个方法 UnitName,可以在 Form 所在单元中获得实例所在的单元文件名
8. 新增加一个 TMonitor 的 record (带方法的记录类型)和使用这个东西的函数
function MonitorEnter(AObject: TObject;
Timeout: Cardinal = INFINITE): Boolean;
inline;
function MonitorTryEnter(AObject: TObject): Boolean;
inline;
procedure MonitorExit(AObject: TObject);
inline;
function MonitorWait(AObject: TObject;
Timeout: Cardinal): Boolean;
inline;
procedure MonitorPulse(AObject: TObject);
inline;
procedure MonitorPulseAll(AObject: TObject);
inline;
procedure MemoryBarrier;
9. 新增加 strict 标识符,可以用在作用域和类函数声明中
10. 新增 IEnumerator 迭代器,用于模拟“模板”效果(感觉有点象工厂,不过,没有 Clone 函数)。
11. 新增 IComparable ,早该有的东西,不知道是否有什么新的含义
12. 新增 interface<T> 的语法
13. UTF8String 是代码页为 65001 的 AnsiString
14. 新增 TMonitorSupport = record
15. deprecated 描述符可以增加原因说明了,如:'Use AcquireExceptionObject'
16. 增加全局变量
CPUCount: Integer;
DefaultSystemCodePage: Integer;
DefaultUnicodeCodePage: Integer;
UTF8CompareLocale: Cardinal;
17. Ansi 字符串函数都有了内部的 Wide 重载函数,保持函数名和调用方式一致
18. 引入新的字符串函数:
function StringElementSize(const S: UnicodeString): Word;
overload;
inline;
function StringElementSize(const S: RawByteString): Word;
overload;
inline;
function StringCodePage(const S: UnicodeString): Word;
overload;
inline;
function StringCodePage(const S: RawByteString): Word;
overload;
inline;
function StringRefCount(const S: UnicodeString): Longint;
overload;
inline;
function StringRefCount(const S: RawByteString): Longint;
overload;
inline;
procedure SetCodePage(var S: AnsiString;
CodePage: Word;
Convert: Boolean = True);
function _EnsureUnicodeString(var S: UnicodeString): Pointer;
inline;
StringCodePage 的出现,表示字符串前面现在有了三个特别字节:代码页、引用计数、字符串长度(以前是二个)
19. 引入一个新的 RawByteString 类型 (type AnsiString($ffff)),引入 UnicodeString 类型
20. 部分原来在 Windows 单元的函数,现在出现在 System 单元了,主要是重写了 Unicode 部分
 

小雨哥

Unregistered / Unconfirmed
GUEST, unregistred user!
网上看到的一篇:
hi
------------------------------------------
Hi see much web pages for speak of Delphi 9 and Unicode...Unicode...Unicode...Unicode...Unicode...
and i see only very small update from Delphi 2007 -> 2009 , except Unicode.
( generic is important ok , but for me the 90 % of Delphi developers... willdo
n't use this )
my interest on unicode is : ZERO.
and I think that many companies USA / west Europe / south Europe.. is the same.

CG should sell much Delphi in China / India , OK , PERFECT .. but...

Delphi on Usa / Europe lost another year against V.S. and all dev. world.

take more Internal developpers on delphi 2009, if you want running towards the future.
You are too slow..... the world tecnology is more 'fast you.

------------------------------------------
a delphi fan.
sorry for my bad english. :)
 
顶部