我使用常见的嫌疑人(Apache,MySQL和PHP)在CentOS上运行一个网站.自从这个网站最初推出以来,它已经发展了很多,现在我想用它做更好的事情 - 即实时通知.根据我的阅读,Apache处理这个问题很糟糕.我想知道我是否可以用Node.js替换Apache(因此代替" LAMP "它将"LNMP").
我试过在线搜索解决方案,但还没找到.如果我正确地解释了我读过的东西,似乎大多数人都说Node.js可以同时替换Apache和PHP.我有很多现有的PHP代码,所以我宁愿保留它.
如果它还不是很明显,我很困惑,可以使用一些启示.非常感谢!
在Delphi 中使用流畅的接口有什么优缺点?
流畅的接口应该会增加可读性,但我有点怀疑有一个包含大量链接方法的长LOC.
有编译器问题吗?
有任何调试问题吗?
是否有任何运行时/错误处理问题?
Fluent接口用于例如TStringBuilder,THTMLWriter和TGpFluentXMLBuilder.
更新:
David Heffernan询问我关注哪些问题.我已经考虑过这个问题了,整体问题是"明确指定它是如何完成"与"让编译器决定如何完成"之间的区别.
AFAICS,没有关于编译器如何实际处理链接方法的文档,也没有关于编译器如何处理链式方法的任何规范.
在本文中,我们可以阅读有关编译器如何向声明为函数的方法添加两个额外的var参数,以及标准调用约定在寄存器中放置三个参数以及在堆栈中放置下一个参数的情况.因此,具有2个参数的"流畅函数方法"将使用该堆栈,而具有2个参数的"普通过程方法"仅使用该寄存器.
我们也知道编译器在优化二进制文件方面做了一些魔术(例如字符串作为函数结果,评估顺序,参考本地proc),但有时会给程序员带来惊人的副作用.
因此,内存/堆栈/寄存器管理更复杂以及编译器可能会产生一些无意识的副作用,这对我来说非常臭.因此问题.
在我阅读了答案(非常好的答案)后,我的担忧大打折扣,但我的偏好仍然是相同的:)
我使用以下代码来获取特殊目录
uses
ActiveX, ShlObj;
{...}
procedure TForm1.Button1Click(Sender: TObject);
// Replace CSIDL_HISTORY with the constants below
var
Allocator: IMalloc;
SpecialDir: PItemIdList;
FBuf: array[0..MAX_PATH] of Char;
PerDir: string;
begin
if SHGetMalloc(Allocator) = NOERROR then
begin
SHGetSpecialFolderLocation(Form1.Handle, CSIDL_PERSONAL, SpecialDir);
SHGetPathFromIDList(SpecialDir, @FBuf[0]);
Allocator.Free(SpecialDir);
ShowMessage(string(FBuf));
end;
end;
Run Code Online (Sandbox Code Playgroud)
现在我想得到我的文档路径,所以我使用mydocfolderpath:= string(FBuf)+'\ Documents',我认为它运作良好但我怀疑这是所有Windows PC(个人文件夹/文件)上的mydocuments路径可以用户更改此结构并使我的文档文件夹anywhare else(例如:c:\ documents)如果用户更改路径给我一个正确的方式,我想知道mydocuments文件夹的名称是什么(我的文档或文档)
具有64位编译功能的Delphi现在处于测试阶段,但只有受邀的beta测试人员才能获得此版本.
Beta测试人员应该测试什么?
大多数第三方组件供应商使用特定前缀作为其自己的单元名称和组件名称.
我可以在任何地方找到这些前缀的任何概述吗?
例如
gtUnitname = Gnostice
frxUnitname = FastReport
cxUnitName = Developer Express
Run Code Online (Sandbox Code Playgroud)
两个原因
1)需要找到单元的供应商
2)想在自己的组件中使用唯一的前缀
我想向用户显示代码执行期间发生的所有相关消息的摘要(例如,解析,算法,转换,验证等).过程完成后,消息应一起显示.
类似的事件可能不会发生,一次或多次.如果事件发生,应通知用户.可能有几种类型的事件.
我不确定方案是否清晰,但也许一些代码会有所帮助:
伪代码:
begin
//Execute computing process//
repeat
Set a flag if an incident occurs
Set another flag if another incident occurs
until done
//Show message to user//
if AnyFlagIsSet then
ShowPrettyMessageToUser
end;
Run Code Online (Sandbox Code Playgroud)
可执行的DELPHI代码:
program Test;
{$APPTYPE CONSOLE}
uses
SysUtils, StrUtils;
var
i: Integer;
tmpFlags: Array[1..4] of Boolean;
tmpMessage: String;
tmpChar: Char;
begin
Randomize;
repeat
//Initialization//
for i := 1 to 4 do
tmpFlags[i] := False;
//Will insident occur?//
for i := 0 to 5 do
begin
if (Random(10) …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
type
TFoo1 = class
public
procedure DoSomething1;
end;
TFoo2 = class
private
oFoo1 : TFoo1;
public
procedure DoSomething2;
procedure DoSomething3;
constructor Create;
destructor Destroy; override;
end;
procedure TFoo1.DoSomething1;
begin
ShowMessage('TFoo1');
end;
constructor TFoo2.Create;
begin
oFoo1 := TFoo1.Create;
end;
destructor TFoo2.Destroy;
begin
oFoo1.Free;
inherited;
end;
procedure TFoo2.DoSomething2;
begin
oFoo1.DoSomething1;
end;
procedure TFoo2.DoSomething3;
var
oFoo1 : TFoo1;
begin
oFoo1 := TFoo1.Create;
try
oFoo1.DoSomething1;
finally
oFoo1.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我正在为一个班级创建单元测试,我坚持下去.我的问题都是关于模拟对象和我应该使用的设计模式的最佳方法.我是单元测试的类不是由我创建的.
在下面的示例中,我需要模拟,Foo1因为它向我在单元测试期间无法调用的Web服务发送请求.但是Foo1正在由TFoo2构造函数创建,我无法模仿它.在这种情况下我该怎么办?我应该修改TFoo2构造函数来接受这样的Foo1对象吗?
constructor TFoo2.Create(aFoo1 …Run Code Online (Sandbox Code Playgroud)delphi unit-testing design-patterns dependency-injection mocking
假设我暂时想要在TClientDataSet上执行耗时的操作期间禁用OnCalcFields事件(例如,通过设置cdsCalcFields := nil).当我重新附加OnCalcFields方法时,如何告诉TClientDataSet重新计算计算字段?
可能需要手动重新计算的另一种情况是某些计算字段取决于其他数据集的情况(例如,计算字段用于临时保存来自其他数据集的某些聚合值).这在大多数情况下都可以正常工作,因为OnCalcFields事件的执行频率足以从其他数据集中获取正确的值.但在某些情况下,需要重新计算才能从其他数据集中获取正确的值.
将AutoCalcFields属性设置为False也可能会使您进入需要手动重新计算的某些情况.
我已经看到了关于如何减少OnCalcFields事件执行的几个解释,但我找不到一个简单的方法来执行重新计算......
有什么建议?
我今天写了一些代码,列出了PE文件中的所有部分...代码可以工作,但最后它给出了一个例外:无效的指针操作......我不知道为什么......有人可以找到错误
这是代码
procedure TForm1.Button1Click(Sender: TObject);
var
IDH:PImageDosHeader;
buf:Pointer;
INH:PImageNtHeaders;
ISH:array of TImageSectionHeader;
FS:TFileStream;
i,total:Word;
begin
if OpenDialog1.Execute then
begin
Self.Caption:=OpenDialog1.FileName;
FS:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead or fmShareDenyNone);
GetMem(buf,FS.Size);
FS.Read(buf^,FS.Size);
FS.Free;
IDH:=buf;
INH:=Ptr(Cardinal(buf)+Cardinal(IDH^._lfanew));
ISH:=Ptr(Cardinal(buf)+Cardinal(IDH^._lfanew) + Sizeof(TImageNtHeaders));
total:=INH^.FileHeader.NumberOfSections - 1 ;
for i:=0 to total do
begin
ListBox1.Items.Add(PAnsichar(@ISH[i].Name));
Application.ProcessMessages;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud) 在Delphi中编写无操作语句的最佳方法是什么?
拿这个代码:
if a=b then
SomeOldStatement
else
AnotherStatement;
Run Code Online (Sandbox Code Playgroud)
并说你暂时想要退出SomeOldStatement.
你会选择这个解决方案吗?
if a=b then
//SomeOldStatement
else
AnotherStatement;
Run Code Online (Sandbox Code Playgroud)
就个人而言,我不喜欢空白then部分,并希望在那里有一些可编辑的东西 ......
if a=b then
NoOp
//SomeOldStatement
else
AnotherStatement;
Run Code Online (Sandbox Code Playgroud) delphi ×9
coding-style ×2
64-bit ×1
apache ×1
delphi-xe2 ×1
directory ×1
mocking ×1
no-op ×1
node.js ×1
pointers ×1
prefix ×1
testing ×1
unit-testing ×1