Learn something new every day: set tab width on a plain TMemo
2015-10-09 09:30 TMemoTabWidth [permalink]
Strange that I haven't thought of this before, but it's surprisingly easy to do:
TabWidth:=12;//override the default of 32 'units'
If you want/need to you can pass an array of tab-stop positions instead if just the one (but use
See also EM_SETTABSTOPS
Skipping the COM registry by calling DllGetClassObject yourself
2015-09-30 16:07 DllGetClassObject [permalink]
Yey! For the first time ever I created a COM object from the DLL, skipping the COM registry. (Should have done this much, much sooner!) Why, you ask? Just to be sure you're using the correct DLL, and that the registry is not (ab)used to divert it to another DLL. And also this way in some cases you can avoid having to get administrative privileges at some point just to get that COM registration into the Windows registry...
T_DGCO=function(const CLSID, IID: TGUID; var Obj): HResult; stdcall;//DllGetClassObject
x:IMyObject;//replace by an interface of choice
if (p=nil) or (p(CLASS_MyObject,IClassFactory,f)<>S_OK) then
if f.CreateInstance(nil,IMyObject,x)<>S_OK then
x.Hello('World');//or whatever your object does
Results of survey "Designing a new language, what would you use?"
2015-09-14 17:26 plsurvey2results [permalink]
After having done a first survey, more intended as a joke than in seriousness, I decided to do another survey, (also on reddit) just to get to know a little more on where the people at large are about the things I read about when researching the web for what I need with this toy programming language I started.
As per the last time, I noticed answers come in in the first 24 hours and then nothing, so I thought I'd wait a few days and then process the results. First this: thank you, thank you, thank you very much for the 34 responses.
For back-end, 18 of 33 would use LLVM, 5 JVM, 4 CLR, 4 GCC, just one LuaJIT, and one other offered the gentle advice to use "IR, then translate that IR into whichever backend you want." Which I find strange since that's what I thought a back-end is for... I'm surprised to see so little for JVM, it fuels my suspition that some programming languages are more written about than written in...
For run-time, 19 of 31 would use "FFI to anything C" which makes sense as most do as far as I can tell; 4 JVM, all of which had also JVM for the previous question, again makes sense; 4 CLR, 3 of which had CLR for the previous question, and one LLVM: I have checking out Roslyn high on my to-do list, but I'm not sure if all of the puzzle pieces are out there (yet) to get that working; 2 OCaml, 2 Python, and someone entered "variant of c++" not sure what that is, but it might just be the same as what I meant by "anything C"...
As one could predict, the choices for IDE are a bit more diverse, but roughly what I anticipated:
* 6 emacs
* 4 atom.io, which is pretty good for the new kid on the block
* 4 Eclipse, only 2 of those had JVM on the previous questions
* 4 Microsoft Visual Studio
* 3 IntelliJ IDEA, strangely enough none of those with JVM on the previous questions
* 3 vim
* 2 Code Blocks
* 1 Codelite
* 1 Delphi
* 1 kdevelop
* 1 pharo.org
* 1 "just a text editor"
* 1 "made in this new lang"
* 1 "no ide"
* 1 "shouldn't be tied to an IDE"
To build a parser, 8 out of 30 recommend yacc. 7 advise to roll your own, which kind of surprises me but also not that much, since as someone also points out, it allows you to pay extra attention to having the parser spew out usefull errors when it hits syntax it doesn't understand. 6 would go with GNU Bison, 2 JavaCC, 2 "parser combinations", 1 "recursive decent", 1 "Ada's OpenToken library", 1 Json; those in quotes I should look up as I may have heard about them but am not fully acquainted with (yet!).
For debugger, 18 of 29 would go with gdb, 7 with lldb, 2 with WinDbg, someone would let it depend on the platform, someone else would like to see a "More indepth debugger". And there's someone that would have the debugger be written in the language using meta programming, but this person also left all the questions unanswered, except "pharo.org" for IDE, and "SmallTalk" for the next question. The world needs all kinds of people.
And then the question I was looking forward to the most: projects to learn from
* 9 LLVM
* 9 Lua
* 2 OCaml
* 2 CoffeeScript: which apparently, I noticed, has annotated source right there on the website!
* 2 Haskell (someone wrote "GHC", assuming that stands for the Glasgow Haskell Compiler, I'll count it here)
* 1 Rust
* 1 Smalltalk
* 1 clojure
* 1 DMD
* 1 GCC
* 1 "Ada, a Lisp varient, and probably an ML-language", those are three at once! A LISP variant, I agree, I have clojure in this list but not Scala, strange. And as ML-languages go I've only heard about OCaml.
* 1 "Assembly "Learn e.g. x86 assembly. Without which you will not be able to understand how it is being execute.d=" I don't know what dee equals, but x86 isn't quite the open source compiler I was thinking of. Also I've read this one back to back, does that count?
5th Element: a remake?
2015-09-07 23:42 5thElementRemakePlease [permalink]
Naar mijn bescheiden mening is het tijd voor een 5th Element remake. Misschien is het dat wel al een tijdje. (van 2013!) Niet dezelfde film, akkoord, maar er zat zo veel goed in die film. Jammer genoeg ook een hoop waar een hoop mensen, terecht, van wegblijven, maar op mij had het van direct de eerste keer de indruk dat als je die dingen negeert, je de parels kan rapen in die film. Zoals andere grotere verhalen gaat het over een selecte groep mensen die per toeval er toe komen het volledige universum te redden van de ondergang. Dat is en blijft een goede kapstok voor gelijk welke film, vooral als de fictieve elementen goed ineen lijken te zitten en ze uit de buurt van ongeloof blijven. Plus, mij krijg je gewonnen als alles niets is wat het lijkt. Een verenigde militaire kracht die in al zijn kunde toch even niet weet wat gedaan, de strenghouders van het geloof die bevraagd worden om antwoorden, maar eigenlijk zelf niet weten dat ze het niet (meer) weten... De slechteriken die eigenlijk echt ook wel hard werken aan hun inzet en ambities. De zakenman die eerst dacht een zaakje te kunnen doen, maar dan toch snapt dat de partner niet echt een parnerschap in gedachten had. Dat moet zeker allemaal blijven. Flikken die in een McDonalds-kamion belanden? Misschien. Een hyperactieve radiopresentator die op de gekste momenten dan maar tussen het geflikflooi een programma moet neerzetten? Nee dank je.
Hier is nog een idee: waarom niet 5th Element, maar 5 Elements, en er zoals het nu in zwier is, een serie. Een paar afleveringen dat het er zit aan te komen dat de Mondochewan zullen moeten komen ingrijpen. Een paar afleveringen dat het allemaal kapot is, en langzaam het misverstand uit komt. Dan de reconstructie (het pakje met de witte stroken, remember?) en het uitzoeken wat er dan moet gebeuren, en dan een hoop afleveringen waarin ze elk van de elementen moeten gaan opsnorren...
Natuurlijk in dezelfde tijdsgeest, met de heerlijke sneren naar de dingen die nu fout gaan en dan nog altijd fout(er) gaan zitten. Met effecten. Niet persé 3D, maar ik denk aan district 9 (nee ik heb Chappie nog niet gezien), en aan de 'overzichten' van de ruimteschepen in Battlestar Galactica, het lijkt of je er tussen zou kunnen hangen, er bij zou kunnen zijn, en dan leef je beter mee in het verhaal. Zolang het maar klopt als een bus. Nog meer dan dat je op het nieuws ziet dat de opruimdiensten staken, en dat de luchthaven dan vol afval ligt. Da's een goed begin, maar fan kan je voor je winnen door een verhaal dat zich afspeelt naast het verhaal te laten zien aan hints hier en daar. Maar misschien heb ik te veel naar Yamato 2199 gekeken.
Awel ja, waarom niet een mash-up van dat, met Macross er gewoon tussendoor (maar dan het verhaal en de setting, niet perse de mecha), en een echte serie slechteriken die in de weg lopen bij het redden van de wereld en alles... Maar ik zit maar wat te dromen natuurlijk.
TMongoWire can now authenticate over SCRAM-SHA-1
2015-07-09 00:51 mongoAuth3 [permalink]
You can now use TMongoWire on mongoDB version 3.0 or newer and authenticate over SASL with SCRAM-SHA-1. This harder form of encryption offers a strong protection of your credentials and prevents against 'man in the middle' attacks. (But does not encrypt the data over the wire, it's advised to use TLS for that.) I did not find a ready-made SASL library for Delphi, so made the required encryption tools myself. I have added this support for HMAC and PBKDF2 to md5.zip.
To authenticate, call
MongoWireAuthenticate from the new unit
mongoAuth3.pas on a connected TMongoWire instance. (For backwards compatibility,
mongoAuth.pas remains available.)
jsonDoc: JSON object for Delphi based on IUnknown and OleVariant
2015-06-26 21:21 jsonDoc [permalink]
I was using bsonDoc.pas and bsonUtils.pas from the TMongoWire project in several projects that didn't have anything to do with MongoDB, so I thought this one deserved a repository of its own:
yoy/delphi on beginend.net
2015-06-25 18:07 yoybe on beginendnet [permalink]
I've proposed the Delphi RSS feed of this site to https://www.beginend.net/. Thank you Eric.
Results of the programming paradigms survey
2015-06-25 00:11 plsurveyresults [permalink]
A while ago I created a little survey about programming language specifics, and posted it on reddit/programming. Here are the results.
There were 123 responses on May 21st, 8 on May 22nd and one more on the 23rd. I guess then it moved off the first page on reddit... The posted ended on a solid score of zero upvotes.
Whitespace: the majority of you (93 votes) like whitespace to be unimportant to syntax, the others (34) like that it defines scope or levels in code.
6 prefer not to use an operator for assignment. Some nice people note that Lisp uses (set! ) for assignment, and Scheme uses equal, which are not really operators. Someone warns not to use == in Java for general comparison. Good to know. (Reminds me to send the daily thank you to the person that once warned me not to use Java.)
Readability: 87 like code to read like human language, against 41 that appreciate that it's for the machines that we're writing. So that's bad news for my attempt at designing a programming language without reserved words...
Subject Object Verb: 109 prefer infix notation (a+b), 15 prefer prefix notation (+ a b), 1 voted postfix (a b +) and 7 prefer something else than operators.
Declarative-Executive: 60 like declarative and executive separate and can live without having them nested, 16 find that declarative and executive should be visually separate but may occur nested, 47 think executive prevails (so they can manipulate their declarative, eew!)
Compiler directives, Pre-compiler: 49 prefer language specific syntax to denote code that is dependent on something external, 39 prefer the linker to be smart enough to ignore unused logic, 38 sticks to the heavy pre-compiler with its own box of tricks.
Garbage collection: 57 likes reference counting; 43 doesn't even bother with clean-up or gives the GC a ping; 26 does their own object lifetime management (or is unwittingly writing leaks).
Multiple Inheritence: 88 claim not to need it; 38 claim to use it; 3 claim do be blissfully oblivious, the lucky bastards.
Concurrency: 80 prefer syntax to work with a parallel workload, 36 likes to just write loops and have the language put the metal to work, 14 roll their own threads.
Generics: Yea 98, Nay 32, the yeas have it. Another reminder I'm part of a (shrinking?) minority...
As I noted in the reddit remarks, I'm not used to setting up surveys like this, and may not have selected the most neutral wordings for the questionnaire, perhaps steering the results a little. In any case, it's nice to hear back from people, and compare where you are in relation to the masses, get to know if your niche is still comfortably narrow.
2015-06-23 21:25 sha512 [permalink]
I added SHA-512 to the collection! I also had a quick comparison with code similar to some other implementations where instead of a loop, a long list of 'round' calls are made, with some convolution made in the arguments, and it turns out the way I go at it here performs better. (Your milage may vary)
yoy.be new design!
2015-06-19 20:50 new design [permalink]
I finally have the new design for this website ready! It was long over due. Hope you like it. I have removed a lot of the dynamic back-end of this website, it was very under-used here, but it lives on in another form. The re-design also serves as a re-focus for this website, so it serves its two main purposes better: my personal weblog and the main place to download my freeware from and get updates. The openness to add things here is gone, but I am always available for advice, comments, remarks and questions on twitter, stackoverflow, google+, github and others like that.
2015-03-03 21:42 r1825 [permalink]
- error page: back link when referer, refresh link only on GET
- LoadCopy by library file signature to avoid multiple copies being loaded, retries on access denied
- default xxmSession on TStringList (sorted!) instead of TObjectList
- parser: in code, treat lines that start with "<" and end with ">" as HTML,
allow [[#]] section on one line in a code section
- recycle allocated memory buffers, use HeapAlloc instead of GlobalAlloc
- long polling support (IXxmContextSuspend, IXxmProjectEvents2)
- xxmHttp: thread to wait on groups of (slow) connections that have all content in buffer
- xxmHttp: support basic authentication (401, "WWW-Authenticate: Basic")
- xxmIsapi: asynchronous sending on more than 64KiB in buffer (project should set Context.ContentBuffer!)
- xxmLocal: custom handling of WWW-Authenticate,
when debugging hold 'X' on authenticated page load to clear stored credentials
- xxmConv: /noupdate switch
- revised thread scheduling from thread pool
trick: get a non-empty recordset with NULLs
2015-02-26 10:31 i3098 [permalink]
If you ever need a non-empty recordset with all NULL values, e.g. for listing the columns:
select C.* from (select 1 X) X left outer join Customer C on C.ID=0
"Even snel een login-procedure maken"...
2015-01-09 17:21 r1823 [permalink]
→ "Even snel een login-procedure maken"...
Gaat ook hierover: http://blog.codinghorror.com/the-god-login/
About WideChar and CharInSet...
2015-01-08 23:58 i3097 [permalink]
I posted this on Google+ a while ago, but didn't think of posting it here, so here it is.
I'm sorry, but I have to vent this: (Attention: what follows is a rant about something with programming in Delphi)
What's up with this?
[dcc32 Warning] W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.
CharInSet?! It contains Result:=C in CharSet; so it is actually just a tiny wrapper. But one that causes an extra jump, stack frame and return! Very wasteful of resources, and typically in places where I want iterations to go as fast as possible.
TSysCharSet, by the way, is apparently fixed to a set of byte chars. So I suppose some implicit conversion takes place. I wonder why SysUtils' CharInSet doesn't get a warning then? Not even one like this:
[dcc32 Warning] W1058 Implicit cast with potential data loss from 'WideChar' to 'Char'
But more importantly, I think it goes against the grain of the language. With Pascal being firmly rooted in the academic and mathematic, it saddens me deeply that I can not describe a set of WideChar literals. They're ordinal constants like any other, or am I mistaken?
In other words: if I take some old code where s is still just string, is it too much to expect s[i] in ['0'..'9'] to compile to something that checks if the 16-bit value falls between these two 16-bit limit values or not? As far as I know, it's easily done in both 32 and 64 bits machine code. (*1)
Oh, and one more thing. All of this is darkly overshadowed by this: http://utf8everywhere.org/ with which I most strongly agree. Regretfully I do a lot of work on a platform that has decidedly chosen for the 16-bit-character way of handling text, so I have to work with it up to where I can decide to do it otherwise. In practice this means my programming is a mix of WideString and UTF8String complexed by the ennerving equivalence of the latter with AnsiString.
*1: I know, I know, I should be using Unicode's IsDigit, but I have a lot of existing code for parsing script that uses a lot of while s[i] in [..] do inc(i); (*2)
*2: I know, I know, I should be using a lexer/tokenizer/compiler-compiler. See also: a lot of existing code.
*3: Skipping to the last paragraph are we? All right then:
tl;dr: I strongly regret that "WideChar reduced to byte char in set expressions"
2014-11-05 15:39 i3096 [permalink]
Of the 5 existing versions of UUID, version 4, based on a mostly random value, is most widely in use. Though chances of a collision are astronomically low, it is not nihil. Also key sequentiality is lost.
In this day and age of highly connected systems, and highly standardised administration thereof, these issues are addressed by this proposal, while still using the available provisions made for UUID values.
UUID with value:
after this AND-mask is applied:
consists otherwise of values with this provenance:
A (16 bits): A unique identifier assigned to a corporation, organization or institution that assumes ownership of the software generating the UUIDs, as registered by a single global (online?) registry.
See http://yoy.be/UUIDv6 (for now? see below. if this will find any acceptance and/or could accrue some budget to host something definitive, it'll move)
B (16 bits): A unique identifier assigned to the specific application, database or software suite, as registered by above corporation, organization or institution, optionally also publically registered in the single global registry.
C (16 bits): A unique identifier assigned to the specific instance or installation of this application, database or software suite.
D (12 bits): reserved for future use, use only 000 for now
E (12 bits): A unique identifier assigned to a certain set or collection of entities within this application or database.
F (16 bits): A range identifier assigned from a central storage in the application or database to one single of possibly many sources of UUIDv6 values.
G (32 bits): A unique index into the assigned range.
If the range is depleted by having generated all possible UUID values with this range, and no new range identifier(s) are readily available, the UUID value source should fall back to UUID v4 values, based on 122 random bits.
Optionally the number of bits used by F and G may use a different partition of the total of 48 bits. Take care when making changes to this, so the values generated by the new partition will not collide with any values currently in use.
Listed here for these few first entries, may get moved to a more permanent location later:
0001;(testing/staging/private use);for testing, staging or private use only
0001;0001;(testing/staging/private use);for testing, staging or private use only
The ongoing search for the best suitable font.
2014-10-03 18:50 i3078 [permalink]
There is something mesmerizingly strange about the font “PT Sans” (and “PT Sans Serif” and “PT Mono” for that matter, but in this specific case it’s about “PT Sans”).
For something at work I was looking for a font to use throughout a set of applications and a web-site to tie them together and set them apart from all of the other day-to-day work that people at work do. Therefore this font has a lot of requirements to conform to:
I have tested a large number of fonts for all of these. Some are too wide, some too narrow, some too ugly, some too frivolous. Some are bad at the default screen size. Some are too much just another Helvetica clone. A few were only missing a bold or italic version. I know what I’m asking for is a lot, but fonts that get close are generally of a certain age, further along than version ‘1.0’. It takes a lot of work to make a font, and a lot more of work to make a good font. It shows when the font has gotten a lot of care and attention.
From time to time I search the web for other fonts and go through a procedure to test them: make the website use the font, watch a number of pages with lists and common operations to see what they look like. If I like that, put the font up in an application and see if that looks good. Then run the application on the oldest workstation to see what it looks like.
I like to read about the story behind a font. Who made it, why was it made, what was it originally used for. (How come it’s made free for use?) There is so much there.
For now “PT Sans” is about the only font that fits all of my wishes the best. This is the strange thing about it. It appears to be made specifically for Cyrillic script, but the Latin are really good as well. It’s well balanced, does digits well, renders on screen resolution good. So by that logic there must have been a very large amount of work put into it. Based on a very rich set of knowledge on the subject. But I don’t find any record of that, or don’t know where to look for it.
But that’s it. The last few searches have not resulted in a better fit to my needs than “PT Sans”. The project is in development still, but is using “PT Sans” throughout. It’s looking great. Helping its little bit to make a splendid first impression to everyone I’ve demoed to up till now.
And look at that capital Q. Look at it.
2014-05-14 23:13 r1811 [permalink]
data link changed from OLEDB/ADO to SQLite3.dll
xxmData.pas: Convert queries.xml to queries.sql
2014-05-07 23:57 i3076 [permalink]
It's nice to see projects work nicely together. Especially when they're your own projects. I've combined WikiEngine and xxm (and TSQLite) before. Now I've changed xxmData.pas so it no longer uses XML to store the queries in, but a plain SQL file, which you can load into any SQL editors (especially nice when it has code-completion). So I have a number of queries.xml to transform into queries.sql. There's a tool for that: [[RE]], download queries_xml_to_sql.rxe, change the file path and run it to transform the XML into SQL using the new notation.
2014-04-20 21:21 r1802 [permalink]
Update: rethinkdb 1.13 will drop protocol buffers from it's network protocol in favor of JSON (see here)
2014-04-11 22:17 i3075 [permalink]
When looking to start a Delphi rethinkdb connector, I soon enough found out I'll need a separate solution to work with Google's Protocol Buffer definition files.
And this is it: dpbp: the Delphi Protocol Buffer Parser. It parses a
.proto file, and outputs a
.pas unit that defines a class for each message. They inherit from
TProtocolBufferMessage (defined in the
ProtBuf.pas unit) and have the internals to load/save the property values. Run
dpbp without command line parameters to see the options you can use to fine-tune the generating process.
Available under the MIT license.
2014-01-01 21:54 r1798 [permalink]
→ Regular Expression
To whomever this might be of interest: I've decided to open-source this project: https://github.com/stijnsanders/RE
2013-12-20 22:32 r1794 [permalink]
→ Regular Expression
- fixed issue with file left open after save
- 'Builder' item (Multiple)
- 'Groups' item (RegEx)
2013-06-20 00:38 r1789 [permalink]
update! there appears to be an issue with UTF8String constants in Delphi XE
2013-04-17 23:14 r1787 [permalink]
- Multi-line matches show first line when double-click matching file
"database locked" errors with SQLITE_CONFIG_SERIALIZED
2013-03-23 22:36 i3068 [permalink]
I've been impressed by sqlite3 ever since I get to know about it. It's open source, and even more it's really put in the public domain completely avoiding the licensing headache. I haven't read the source in great detail, but as I understand it it's all in a single big file! Even how it works internally is impressive.
Since I didn't like the options available, I created my own very thin wrapper for sqlite3.dll without much trouble. Only in this one multi-threaded application, I've run into an occasional "database locked" error, so I had to search documentation and source for what I can do about it.
Working with other database solutions, I've had the common sense of using a database connection for each thread, so each could work with the database undisturbed by eachother. As it turns out this is not required with sqlite3! As stated with SQLITE_CONFIG_SERIALIZED, which is the default setting, you're better off using a single connection over all threads. Indeed in my case it solved the "database locked" errors.