-
Content Count
3416 -
Joined
-
Last visited
-
Days Won
113
Everything posted by Lars Fosdal
-
Better way to maintain a list in a database table??
Lars Fosdal replied to Ian Branch's topic in General Help
The format was made before JSON was a thing, but I should have had a tab as the separator after the header. The logs were meant to be human readable and referenceable text for RegEx searching. -
Better way to maintain a list in a database table??
Lars Fosdal replied to Ian Branch's topic in General Help
Local text logs are very handy and low cost. Just to give you some ideas... Since I have servers in many places, I ended up with a scheme that named the logfile something like this AppName.MachineName.LogContext.yyyymmdd-day-hhmm.pid-nnnn.log where the timestamp is when the logfile was created. That gives me a unique log name, across apps, servers and instances, and I can filter on the timestamp part of the name when I want to delete logs that is older than my limit. In memory, I write log entries to a circular buffer, and I have a background thread that "burst" write the log every second to avoid having the logging thread lagging on file operations. The logfile contains a "header" for each line which is applied when the log entry is added to the buffer. line number {hh:mm:ss,nnn (threadid) memoryload} log text Also, ensure that you don't write secrets to the log file. This particular logfile grows to about 250MB per day and rolls over to a new file at midnight. So, make sure that you have a mechanism that ensure your logs don't grow to infinity and that you delete the old ones, or your storage will suddenly be depleted. Database logs are great if accessing the machine where your process runs is cumbersome security-wise. But: If the database is unreachable, you have a problem - also, writing to a database is far more costly than writing to a local file. -
Swagger (2.0) had a name transplant and is now known as OpenAPI (3.0). And... I now have literally hundreds of Swagger 2.0 APIs to translate to Delphi... Any news from you guys on Delphi and Swagger libs? Edit: Oh, btw - there is code in source\data\EMS.ResourceTypes.pas (D11.1) that generates rudimentary Swagger 2.0 specs in Json or YAML, but it contains numerous TO-DO comments. I guess the author never got to do them, and there doesn't seem to be anything to read Swagger or YAML.
-
I stalk everyone. That is the job of admins and mods. If you can't edit or delete the comment anymore - just PM me with the comments you want removed. Also - large fonts and colors does not improve communications. I am having a deja-vu here...
-
Please delete any incorrect information in your previous comments.
-
I ended up writing a small class around THTTPClient from System.Net.HttpClient. No need for the humongous REST.* classes.
-
Delphi 11.2 unofficial LSP patch
Lars Fosdal replied to Brandon Staggs's topic in Delphi IDE and APIs
Any company would add such a disclaimer when releasing unofficial "patches". It means: If it didn't work, don't blame us. -
Alternatively, simply spawn a cmd.exe and execute net start / net stop commands. We've been doing that for years without any problems.
-
@chmichael - Have you been hacked?
-
uses WinApi.ShLwApi, ... type TCompareLogical = class(TComparer<String>) function Compare(const Left, Right: string): Integer; override; end; function TCompareLogical.Compare(const Left, Right: string): Integer; begin Result := WinApi.ShLwApi.StrCmpLogicalW(@Left[1], @Right[1]) end; procedure TForm1.Button1Click(Sender: TObject); var LArr: TArray<string>; begin LArr := ['1','1.1','1.1.1','1.2.1', '1.1.1.1','1.1.1.2','1.1.1.3','1.1.1.4','1.1.1.5','1.1.1.6','1.1.1.7','1.1.2' ,'1.1.2.1','1.1.2.2','1.1.3','1.1.3.1','1.1.4','1.1.4.1','1.1.4.2','1.1.5','1.1.5.1','1.1.6','1.1.6.1' ,'1.1.6.2 ','1.2','1.2.1.1','1.2.1.10','1.2.1.11','1.2.1.2','1.2.1.3','1.2.1.4','1.2.1.5' ,'1.2.1.6','1.2.1.7','1.2.1.8','1.2.1.9' ]; var Comp := TCompareLogical.Create; TArray.Sort<string>(LArr, Comp); Memo1.Lines.AddStrings(LArr); Thanks, @Stefan Glienke, I didn't know about that function. I also did not know about HIERARCHYID in SQL, so thank you for that one, @mofareh ORDER BY Cast ('/' + acc_numb + '/' AS HIERARCHYID)
-
"Always break line between else and if" vs. comments
Lars Fosdal replied to uligerhardt's topic in GExperts
Well, I am not that consequent, so I'll make do, doing it manually. It did take me 30+ years to develop this style for readability, though. One of the benefits of breaking before then, is that it becomes easy to comment out parts of the if condition. One of the benefits of the hanging indent on single line statements, is that it is easy to spot where the full statement ends. Readability is cruical. Maintainability improves with readability. -
LOL, no 😄
-
"Always break line between else and if" vs. comments
Lars Fosdal replied to uligerhardt's topic in GExperts
/off-topic Preferences of code. I like begin/end for clarity. However, I also like unusual breaks before then and strange indentations of single statements. If only I could convince the formatter to do my bidding. procedure MyProcedure(a, b: Boolean); begin if a then begin if b then Beep else Beep end else begin if b // Kommentar then Beep else Beep; end; end; -
I think I was fooled by my own expectations with regards to the simplicity of OAuth2 and functional level of the TOAuth2Authenticator. The C# code example can be found here, but it uses another assembly from Thinktecture to do the http parts. https://github.com/LarsFosdal/csharp-ion-api-sdk/blob/master/DotNetBackendOAuth2/Program.cs I'll ponder a little, google some more, and see if I can't crack this nut.
-
I have instrumented the C# app with logging, so I see exactly what happens. The challenge is convincing the Delphi REST components to do the same thing.
-
There also is a confusing comment here https://docwiki.embarcadero.com/CodeExamples/Sydney/en/FireDAC.SQLite_Encryption_Sample
-
It is just weird with the message saying that the DB is NOT encrypted? Ref. https://docwiki.embarcadero.com/Libraries/Sydney/en/FireDAC.Phys.SQLite.TFDSQLiteSecurity.CheckEncryption
-
Are you sure there is no way to convince FD to use the appropriate encryption method?
-
Why can't it connect?
-
What if you in the app, first export to json with UniDAC, then close all Unidac DB conns, and then import with FireDAC?
-
It might be a bit banale, but what about a new version of the old app that exports to a json or xml file, and then the new app can import from that json or xml file?
-
filter box Object Inspector Filter Box Search in Sub-Properties
Lars Fosdal replied to Maximiliam's topic in Delphi IDE and APIs
Nice idea, though. File a suggestion at https://quality.embarcadero.com/secure/Dashboard.jspa -
Please enter a report in https://quality.embarcadero.com/secure/Dashboard.jspa
-
$ is not mentioned on that page, and $$ did not help.