Archive for the ‘Development’ Category
Posted by jpluimers on 2021/07/21
On one of my Raspberry Pi boxes, somehow I could not access files over SFTP (SSH File Transfer Protocol) via FileZilla.
I would consistently get this error:
"Connection timed out after 20 seconds of inactivity"
Figuring the exact cause took a while.
TL;DR: SFTP uses an interactive non-login shell, then interprets the output from that shell. For that kind of shell, ensure few or none scripts run that output text.
These links finally got me to the cause
Read the rest of this entry »
Posted in *nix, *nix-tools, bash, bash, Communications Development, Conference Topics, Conferences, Development, Event, Internet protocol suite, Power User, Scripting, SFTP, Software Development, SSH, TCP | Leave a Comment »
Posted by jpluimers on 2021/07/21
Below, for my link archive, some searches and relevant posts on FastMM related method calls to track or report memory usage.
Searches:
- LogMemoryManagerStateToFile
- FastGetHeapStatus {Returns summarised information about the state of the memory manager. (For
backward compatibility.)}
- GetMemoryManagerState (InternalBlockSize, UseableBlockSize, AllocatedBlockCount, ReservedAddressSpace) {Returns statistics about the current state of the memory manager}GetMemoryManagerUsageSummary {Returns a summary of the information returned by GetMemoryManagerState}
- GetMemoryMap {Non-POSIX only; Gets the state of every 64K block in the 4GB address space}
- ScanMemoryPoolForCorruptions; {Scans the memory pool for any corruptions. If a corruption is encountered an “Out of Memory” exception is raised.}
- It is very costly in CPU usage, but helps finding heap corruption quickly.
- function GetCurrentAllocationGroup: Cardinal;
- {Returns the current “allocation group”. Whenever a GetMem request is serviced
in FullDebugMode, the current “allocation group” is stored in the block header.
This may help with debugging. Note that if a block is subsequently reallocated
that it keeps its original “allocation group” and “allocation number” (all
allocations are also numbered sequentially).}
- procedure PushAllocationGroup(ANewCurrentAllocationGroup: Cardinal);
procedure PopAllocationGroup;
- {Allocation groups work in a stack like fashion. Group numbers are pushed onto
and popped off the stack. Note that the stack size is limited, so every push
should have a matching pop.}
- LogAllocatedBlocksToFile
- {Logs detail about currently allocated memory blocks for the specified range of
allocation groups. if ALastAllocationGroupToLog is less than
AFirstAllocationGroupToLog or it is zero, then all allocation groups are
logged. This routine also checks the memory pool for consistency at the same
time, raising an “Out of Memory” error if the check fails.}
- SetMMLogFileName
- {Specify the full path and name for the filename to be used for logging memory
errors, etc. If ALogFileName is nil or points to an empty string it will
revert to the default log file name.}
Posts (note that not all of them get their calculations right):
- [WayBack] How to get the Memory Used by a Delphi Program – Stack Overflow
- [WayBack] delphi – FastMM: Total Allocated Memory – Stack Overflow
- [WayBack] delphi – Does calling FastMM4 LogAllocatedBlocksToFile() periodically use up memory space? – Stack Overflow:
I have tracked this down to be a version mismatch of the support library FastMM_FullDebugMode.dll.
An older version of the library works with the newer version compiled into the executable. There seems to be no check that versions do match. However, modules don’t really work together at run-time.
- [WayBack] delphi – How to solve memory segmentation and force FastMM to release memory to OS? – Stack Overflow
- [WayBack] TURBU Tech » Blog Archive » Wanted: live leak detection for FastMM
- [WayBack] Strategy or tools to find “non-leak” memory usage problems in Delphi? – Stack Overflow:
- use non-FastMM tools: AQTime, MemProof, SleuthQA
- use FastMM methods GetMemoryManagerSTate, GetMemoryManagerUsageSummary, LogMemoryStateToFile
FastMM4991 introduced a new method, LogMemoryManagerStateToFile:
Added the LogMemoryManagerStateToFile call. This call logs a summary of the memory manager state to file: The total allocated memory, overhead, efficiency, and a breakdown of allocated memory by class and string type. This call may be useful to catch objects that do not necessarily leak, but do linger longer than they should.
- [WayBack] delphi – How can I find out how much memory is used by a specific component or class? – Stack Overflow
- [WayBack] What does GetMemoryManagerState, ReservedAddressSpace do in Delphi? – Stack Overflow
These help you track leaks that do not appear as leaks during shutdown: memory allocations that will be released at the end of your application, but are mostly unused while your application is still alive.
A few things to take away from these:
- “Out of Memory” (or exception
EOutOfMemor) could mean that the memory manager structures are hosed, but memory is still available.
- You can specify the FastMM log file used (for instance to include a PID or run-time ID in them so each run gets a separate filename)
- When carefully setting up allocation groups, you are able to zoom in at allocations
A gist with a MemoryManagerUnit showing a few of these calls is below.
An example of its usage is this:
procedure TMyTestClass.TestMethod();
begin
TLogMemoryStatesHelper.DumpMemoryStatesBeforeAndAfter('TestMethod',
TLogging.LogDir,
TFileLogger.GetLogFileName,
procedure (const AFormat: string; const Args: array of const)
begin
TLogging.LogEvent(ltInfoHigh, aFormat, Args);
end,
procedure()
begin
try
// Given
BuildSomeTestScenario();
// When
InitializeTestScenario();
// Then
CheckEquals(0, TestScenarioSummary());
finally
// Cleanup
CleanUpTestScenario();
end;
end
);
end;
–jeroen
Read the rest of this entry »
Posted in Delphi, Development, FastMM, Software Development | Leave a Comment »
Posted by jpluimers on 2021/07/19
[WayBack] windows – Is there any sed like utility for cmd.exe? – Stack Overflow
TL;DR: many people suggest to use PowerShell, but there is GNU sed in Chocolatey
The chocolatey part:
The PowerShell part: read the other answers from the above question.
–jeroen
Posted in *nix, *nix-tools, CommandLine, Power User, PowerShell, RegEx, sed, Windows | Leave a Comment »
Posted by jpluimers on 2021/07/16
Everyone can learn from an outage. CloudFlare shows how to do it right, for instance on the RegEx-going-wild downtime 2 years ago.
So it’s time to link to that one again: [WayBack] Details of the Cloudflare outage on July 2, 2019
More like these at [WayBack] Post Mortem – The Cloudflare Blog.
More on evaluating regular expressions in linear time:
- [WayBack] Regular Expression Search Algorithm KEN THOMPSON Bell Telephone Laboratories, Inc., Murray Hill, New Jersey
- [WayBack] Programming Techniques: Regular expression search algorithm / [WayBack] Programming Techniques: Regular expression search algorithm
A method for locating specific character strings embedded in character text is described and an implementation of this method in the form of a compiler is discussed. The compiler accepts a regular expression as source language and produces an IBM 7094 program as object language. The object program then accepts the text to be searched as input and produces a signal every time an embedded string in the text matches the given regular expression. Examples, problems, and solutions are also presented.
Programming Techniques: Regular expression search algorithm
| Full Text: |
PDF |
| Author: |
Ken Thompson |
Bell Telphone Labs, Inc., Murray Hill |
Published in:
 |
|
| · Magazine |
| Communications of the ACM CACM Homepage archive |
Volume 11 Issue 6, June 1968
Pages 419-422
ACM New York, NY, USA
table of contents doi>10.1145/363347.363387 |
|
|
- Thompson’s construction – Wikipedia
is a method of transforming a regular expression into an equivalent nondeterministic finite automaton (NFA)
The algorithm works recursively by splitting an expression into its constituent subexpressions, from which the NFA will be constructed using a set of rules.[3] More precisely, from a regular expression E, the obtained automaton A with the transition function δ respects the following properties:
- A has exactly one initial state q0, which is not accessible from any other state. That is, for any state q and any letter a, {\displaystyle \delta (q,a)}
does not contain q0.
- A has exactly one final state qf, which is not co-accessible from any other state. That is, for any letter a, {\displaystyle \delta (q_{f},a)=\emptyset }
.
- Let c be the number of concatenation of the regular expression E and let s be the number of symbols apart from parentheses — that is, |, *, a and ε. Then, the number of states of A is 2s − c (linear in the size of E).
- The number of transitions leaving any state is at most two.
- Since an NFA of m states and at most e transitions from each state can match a string of length n in time O(emn), a Thompson NFA can do pattern matching in linear time, assuming a fixed-size alphabet.
- [WayBack] A Regular Expression Matcher Code by Rob Pike Exegesis by Brian Kernighan
Via [WayBack] Details of the Cloudflare outage on July 2, 2019 | Hacker News
–jeroen
Posted in Algorithms, Development, Power User, RegEx, Software Development | Leave a Comment »
Posted by jpluimers on 2021/07/15
For my link archive: [WayBack] c# – Algorithm to check whether a certain hour falls into a given time period – Stack Overflow answered by [WayBack] kennytm:
Assume you only have the time and not the date.
if end_time >= start_time:
return start_time <= current_time <= end_time
else:
return start_time <= current_time or current_time <= end_time
I totally agree with this comment:
– [WayBack]
I love it when algorithms are simple and elegant.
It reminded me of another scheduling related algorithm: [WayBack] Activity Selection Problem | Greedy Algo-1 – GeeksforGeeks
–jeroen
Posted in .NET, Algorithms, C#, Development, Software Development | Leave a Comment »
Posted by jpluimers on 2021/07/15
[WayBack] How do I get the application exit code from a Windows command line? – Stack Overflow solutions below.
Note they ONLY work when nobody sets the ERRORLEVEL environment variable.
- – [WayBack]
-
something.exe
echo Exit Code is %errorlevel%
– [WayBack] Samuel Renkert
-
start /wait something.exe
echo %errorlevel%
– [WayBack] Gary
-
@echo off
my_nify_exe.exe
if %ERRORLEVEL% EQU 0 (
echo Success
) else (
echo Failure Reason Given is %errorlevel%
exit /b %errorlevel%
)
– [WayBack] Curtis Yallop
- It’s worth noting that .BAT and .CMD files operate differently.Reading https://ss64.com/nt/errorlevel.html it notes the following:
There is a key difference between the way .CMD and .BAT batch files set errorlevels:
An old .BAT batch script running the ‘new’ internal commands: APPEND, ASSOC, PATH, PROMPT, FTYPE and SET will only set ERRORLEVEL if an error occurs. So if you have two commands in the batch script and the first fails, the ERRORLEVEL will remain set even after the second command succeeds.
This can make debugging a problem BAT script more difficult, a CMD batch script is more consistent and will set ERRORLEVEL after every command that you run .
This was causing me no end of grief as I was executing successive commands, but the ERRORLEVEL would remain unchanged even in the event of a failure. – [WayBack] RockDoctor
–jeroen
Posted in Batch-Files, Development, Scripting, Software Development | Leave a Comment »
Posted by jpluimers on 2021/07/15
Officially, the answer to [WayBack] inheritance – Delphi: How to call inherited inherited ancestor? – Stack Overflow is that you can’t on the language level as I explained in my answer
You can’t in a regular language way, as this would break the object oriented aspects of the language.
You can fiddle around with pointers and clever casts to do this, but before even starting to answer that: is this really what you want?
As others mentioned: your need sounds like a serious “design smell” (which is similar to code smell, but more severe.
Edit:
Going down the pointer fiddling road might save you work in the short term, and cost you weeks of work in the long term.
This makes for some good reading on that: Upstream decisions, downstream costs.
If you really want, then there is a clever hack around this by [WayBack] User kludg – Stack Overflow.
His hack is centered around understanding what what the [WayBack] System.TMethod Record essentially is:
Read the rest of this entry »
Posted in Conference Topics, Conferences, Delphi, Development, Event, Software Development | Leave a Comment »