Just another debugging story from the trenches
2016-05-27 23:23 a-debug-story [permalink]
It's all logic, really. Once you get to the bottom of it. But getting there... Phew!
So I was working on something that had a line like this:
function TPostgresConnection.Insert(const TableName: UTF8String;
const Values: array of OleVariant; const PKFieldName: UTF8String=''): int64;
I forgot what went wrong in the beginning (it was somewhere yesterday between midnight and bedtime...) but to check something out, to debug without a debugger so to speak, I wanted to dump a string. Deep within the data-layer you can't really access the things that handle the output to the user, so I just do this:
And then run the application again and reproduce the issue you're tending to. But it doesn't throw this exception, it throws a quite severe access violation instead, strange. Not the error it started with, but none the less something strange going on in the exact same bit of code you're working on. But it was running late and I felt ready to go to sleep, so that is where I left it. It's always nicer to leave a project in working order at the end if the working day, but problems like this typically look different when viewed with a freshly rested set of eyes.
So the next day, let's move the debug exception somewhere higher up in the function body. Actually, all that happens before is handing the values in the
Values array... So instead, I put this in near the top:
for i:=0 to l-1 do sql1:=sql1+','+IntToHex(VarType(Values[i]),4);
Which gives me:
Hmm, so it looks like the list of VarType's of the Values array, but these values are totally bogus! The VarType constants are (at least in older Delphi versions) right there at the top of System.pas (the unit that's always included, even if you don't list in a
uses-clause), $0000 is varEmpty, but $FD18 is impossible since only
varArray = $2000 and
varByRef = $4000 are used of the highest 4 bits... And I'm sure I didn't pass any empties in. What is this?! Time to break out the real debugger then, I guess.
An xxm project pre-compiles files that have HTML and server-side pascal in the same source-files, into a full-fledged set of .pas files and a .dpr file, have that compiled, and then hot-swaps this new DLL in place to handle the next web-requests. So the usual development on an xxm project doesn't involve the Delphi IDE (I actually use atom.io since a while now.) but since the source is right there, you can open it in the plain old Delphi IDE and have the debugger start the DLL using something like xxmHttp.exe (the xxm handler that doesn't auto-recompile like xxmHttpDev.exe, since that would interfere with debugging.)
So, let's see what the debugger makes of this Values array the moment of this debug execption:
Values: (Unassigned, Variant array of Unknown, Unknown type: 21, Variant array of Unknown, Variant array of Unknown, Unassigned, Delphi exception EAccessViolation at $...
Yikes. But good news since with debugger it is doing the exact same thing wrong. That's something you can't take for granted, but that's another story.
So setting a breakpoint at this specific call to Insert, to see if the values get passed in:
Hey! Those are the correct values. But just one press of the F7 key later:
Bam, they're gone. Hmm, switching on the compiler "Use Debug DCUs" setting and retrying this doesn't bring me into any underlying code (sometimes some behind-the-scenes work is done on variants and strings for you), so nothing there...
And then it dawned on me! I know of one thing that can 'eat' your memory like that and it's compiler optimization.
By putting in that 'debug raise', using only an unrelated string, the optimization might conclude it can get away with releasing the memory of that Values array sooner, apparently disregarding the work that's been done on it. (Newer versions of Delphi may handle this differently, but that's another story...) So having a quick try with this:
for i:=0 to l-1 do sql1:=sql1+','+IntToHex(VarType(Values[i]),4);
if l<1000 then
And it works! So that's the weird misbehaving variant array out of the way. Now I feel extra silly not remembering what was originally the thing that I thought went wrong, was I just getting tired? This function is rather new, so I was just trying to debug for the first time, I guess. Still, makes for a nice story about debugging deeper and deeper until hitting the system, then finding out what's causing your trouble, calling on more of your knowledge of that system than usual.
(In case you want to know more about what I was working on in the first place, look here.)
Microsoft is Coca-Cola.
2016-05-23 10:10 mscc [permalink]
Or, at least, that was what popped into my head when I thought (again) about Microsoft open-sourcing the Windows operating system. Why wouldn't they? Coca-cola gave the super-secret recipe away at some point. It takes a certain stability, and vision, and momentum, to do that, but in my humble opinion both Coca-Cola and Microsoft have that.
Let's see how this could work. It's not because Microsoft would open-source Windows that they should stop selling it. Far from it. You can still buy Coca-cola, right? Have you ever bought cola made from the official Coca-Cola recipe, but concocted by someone else? Would you? Same goes for Windows. If you're in the market for a new computer, and want to run Windows on it, you'll probably go to the source, buy Microsoft, and be sure to get updates (and some free OneDrive space, and an Office365 trial...)
So I really am hopeful. Recently Microsoft has really (really!) opened up quite a bit, and even chose the MIT-license for some things, which was unthinkable just a few years ago. So a logic step would be to go all the way, and release the cash-cows, such as Windows, perhaps SQL Server... Even only perhaps there's a small chance they won't be the cash-cows for much longer... Computer sales is under pressure from smartphones and other hand-held devices. The database landscape is still suffering after-shocks from the NoSQL phenomenon, and from things like PostgreSQL and MariaDB, we roughly know what it takes to run a database anyway. So to ensure cash flowing in in the long run, it's almost a must to open up on old secrets. At least in my humble opinion.
Delphi and PostgreSQL
2016-05-13 00:19 LibPQData [permalink]
Searching for an alternative way to use PostgreSQL from Delphi? In the spirit of the other as-light-as-it-gets database connector wrappers, I've converted the header(s) to the LibPQ dll. See the LibPQ and LibPQData units in this repository:
To start an attempt to move to something more like a generic database layer, I've started this DataLank idea, but it needs more work. Actually I don't intend to develop it all the way into a full-fledged data-layer. Specialities of each specific database solution are so diverse and important, that I really don't want to hide them between an opaque abstraction layer. I want a database connector wrapper to be as light as possible, but also to allow access to the underlying technology. The main point for using DataLank, is to have less work changing DB's by using TDataConnection and TQueryResult types, but not no work. Adapting the used SQL to a different dialect will probably involve updating many (or all) calls the database anyway. But I'll post about that later when I put some more time in. (And perhaps write a libmysql.dll wrapper first...)
postgreSQL: date and time manipulation
2016-05-13 00:06 pg1 [permalink]
Babysteps! I've had the chance to dabble a bit in PostgreSQL, and after (years of) T-SQL, and some MySQL/MariaDB and SQLite, it's yet another SQL dialect to get a hang of. First impressions are good. It feels like a mature dialect. Searching the docs usually helps me find swiftly what I'm looking for. (And there's this ofcourse.) Porting an existing project makes you bump into the differences:
'f'instead of 1 and 0)
create procedure, but there's
create or replace function ... returns void
exec, but since it's all functions use
ID int identity(1,1) not null, use
ID serial primary key not nullor hook up a sequence by yourself...
insert into x (...) values (...) returning ID into NewID
I'll probably hit a lot more like these in the time to come, but that you should use
timestamptz) instead of
datetime2) deserves a separate mention. Especially there's no
extract, that's pretty straight-forward, but to replace
dateadd, you do something like it feels it should always have been: plain arithmetic.
PostgreSQL is pretty intelligent about operators (just do
select * from pg_operator, wow!) so just subtract two timestamps to get something of type
interval, something like
x + interval '2 days' result into exactly what you'd expect, and for constructing, apparently casting is pretty smart, for example:
select now()+(X.X||'day')::interval from (values (0),(1),(2),(3),(4)) X(X)
One more: instead of
datediff(dd,x,y)=0 just do this:
x::date=y::date pretty obvious if you think about it. Like I said, PostgreSQL made a pretty good first impression.
2016-05-03 19:17 plasm [permalink]
It is also a play thing to try and tame this beast that is assembler. Not any assembler in particular, but just in general what it is to try and make things work with a limited set of registers and instructions and having to shuffle anything that doesn't fit in those to and from memory. If I put more work into this, it could go two ways:
I can evolve the machine code further and try to design a binary encoding for the possible instructions, and have the code turn up in the memory as it is accessed by the normal registers. (It is not now, the
I register now indexes into a separate set of instructions, possibly with overlapping values.)
Otherways I could try and build a compiler that compiles code into this set of machine instructions (perhaps based on this one), finding out along the way what is all the fuss about register allocation and heuristic optimizations...
And ofcourse the both meet and I could try to build a compiler straight into these virtual machine instructions, but I have the luxury of not having to do this. And since it's all about learning and exploring by doing, it'll probably get me stuck faster.
But for now I think I'll let this rest for a little while. See how it looks when I come back to it after a while.
See also https://github.com/stijnsanders/plasm
2016-05-03 19:02 xxm430 [permalink]
- xxmISAPI: fixed issue with open connections not accepting new requests
- revised context object lifetime management (lock-less reference counting)
- demo 7 "Resources": added "If-Modified-Since"
- demo 12 "Long Polling": added example EventSource (text/event-stream)
SQLite: "collate nocase"
2016-03-11 20:35 sqlitenocase [permalink]
Learn something new each day! (Or also: I should have known about this!) SQLite is so strict! But in a good way. It's in the little things that come up now and then that you notice how delightfully strict it is designed, with reliability and safety up front. And no extra's. So it's quite logic that sorting a column with string values* is sorted case-sensitive, with al upper-case letters before the lower-case letters. To change this, add
collate nocase either to the
create table statement or the
order by clause of queries. I've picked up somewhere that it's better for performance to have it in the
create table statement, but I haven't checked this with the documentation or by testing in a test setup (yet), but for now I just went for updating the tables since changing all the queries would take much more work. That said, updating: not quite.
Alter table doesn't have
alter column apparently, but it does have a
rename to, and
insert into TblUpdate select * from Tbl works great, even with an autoincrement primary key (if you fields are still in the same order), so it's a relatively painless transition.
And this barely a week after I find out about the busy timeout!
(*: due to manifest typing different records may hold values of different type in the same field, but in practice you'll usually follow the type as determined by the schema.)
"What will you do?"
2016-03-11 11:50 whattodo [permalink]
"I'm trying to decide between making a big change for a small number of people, or making a small change for a big number of people.
What I dream of is making a big change for a big number of people, but that's everybody's childhood dream, isn't it?
Then again, most people that did make a big change for a big number of people, were only trying to make a small change for themselves."
2016-03-08 10:27 20160308i [permalink]
Nu moest ik toch even lachen met deze: N-VA: "Turkije hoort niet thuis in EU. Nooit" Zou mijn voorspelling van vijf jaar terug dan alsnog uitkomen? Dat ze Europees gezien het zichzelf onmogelijk gaan maken?
De laatste dagen vroeg ik me al af wat er gebeurd was dat ze in Brussel plots dikke vriendjes spelen, en zelfs niet-Erdohan laten zeggen dat ze er echt wel bij willen. Ah, een gigantische stroom oorlogsvluchtelingen natuurlijk.
Even terzijde, jammer dat ze in het nieuws er niet in slagen een juist beeld te geven van de juiste mix Syriërs-Irakezen-Afganen-Afrikanen-etc, maar dat is dan ook een moeilijk geval, zelfs voor de betrokken diensten ter plaatse.
Maar Turkije dus, en de EU, ik ben aan het aftellen tot wanneer het woord Cyprus eindelijk valt. Waarschijnlijk na ze iets in de vorm van een akkoord hebben over wat ze voor (niet met!) de vluchtelingen gaan doen. En heel misschien valt zelfs eerst nog het woord Koerdistan. Soit, ik hou nog even deze goed in de gaten...
jsonV: plain and simple JSON viewer based on jsonDoc
2016-02-19 21:39 jsonV [permalink]
I decided to create a really simple JSON viewer based on a TTreeView instance and jsonDoc, which itself is heavily based on OleVariants (I really hate long lists of overloads!) so I have some VarType values handled, but show the rest
'('+IntToHex(VarType(v),4)+')'. It could do so much more, but it then would be no longer a really simple JSON viewer. (I currently use Atom with beautify for JSON editing.) I've commited the source in the jsonDoc repository, see here for a ready-to-run executable (It's an exe in a zip, so some browsers and virus-scanners may cry havok about the security risk):
just an idea: var in code for variables of limited scope
2016-02-03 16:18 var-limited-scope [permalink]
I've been reading around a lot about the new programming languages (Go, Rust, D, WebJavaECMACoffee6asm.ScriptX) and there's ofcourse this thing, but I still do most work for work and distraction in Delphi. So all of a sudden, in a large code block (I know, I know, one is supposed to keep their methods many and small) I thought of something like this:
more_code_that_makes_the_world_tick(); //perhaps even using 's' but the one declared way above...
In light of the asynchronous programming most languages get pushed upon them, and the need to have 'scope' outliving the usual runtime of the function call, this may have been considered. But purely on the basis of syntax, this could be done. A 'var' token at that point is never valid, so could get used by a parser to initiate a declaration block, followed by a begin/end block, that the compiler would know how to convert into a separate scope (with unwinding, and auto-calling release on interfaces/reference-counted-instances)...
But it currently doesn't. The closest thing you could get is define an anonymous function and call it once there and then, but that may look ugly and is too much code for what it does, in my humble opinion.
So for now I will just be (re-)using a single
s:string; on top, I'm afraid. (I feel your sqeam, but I'll be really carefull I promise.)
Google Finance: BTCEUR
2015-12-11 08:22 gfBTCEUR [permalink]
Hee, sinds wanneer hebben ze deze toegevoegd?
2015-12-11 00:00 metaclick466 [permalink]
- when suspended, time down to unsuspend only on self
- time down on buttons on self is always a normal click
- setting: hide unless mouse over (only show corners)
- setting: alpha blend level
2015-12-10 23:56 metakeys446 [permalink]
- issue changing font with "hide unless mouse over"
- replaced "Wingdings 3" for "Symbol" in default kbl's
- code 666 closes MetaClick
- code 777 opens settings dialog
- codes 1000..1999 loads "000.kbl".."999.kbl"
- code XXXYYY resizes to XXX by YYY pixels
- code KKKXXXYYY loads "KKK.kbl" and resizes to XXX by YYY pixels
- hide unless mouse over (only show corners)
CouchDB connector: TCouchDBConnection
2015-12-03 07:43 TCouchDB [permalink]
After creating my own wrapper around ADO with the least possible of extra's, but with the most ease-of-use I could get; I tried the same for mongoDB; then Redis; then RethinkDB, but first had to tackle protocol buffers, but in the mean time both advanced to a new version and RethinkDB dropped protocol buffers, so I dropped my RethinkDB connector and put both on the to-do list again.
So now I thought I'd look into CouchDB, it's all HTTP so it should be easy enough. The point is you connect to your CouchDB instance on an address and port that's not publicly accessible, so a full-fledged HTTP library would be too much (though it's still highly recommended nowadays to use TLS over internal connections as well, but that's on the roadmap for xxmHttp). For handling JSON I can re-use what I created for TMongoWire: jsonDoc. So there it is. For now it offers a basic call to exchange JSON with the server, but this should be enough to unlock the main features CouchDB has to offer.
Types of Information
2015-11-24 11:04 typesofinformation [permalink]
Life would be good if all we had was information. If only we could get all the information. We can't handle that much information, so we build systems to handle the information for us. Strange things happen when information comes in. Good systems are designed to handle these well. In designing information processing systems, you have to cater for the following.
Some input signals contain no information. They are either damaged in transport, incomplete, or not of a correct form for the system to handle. Either report them to find out if repair is possible, or keep count of them to be able to report about the health of the system.
Some input signals come in twice, and contain the same information. Or do they? If possible try to have the last step in the chain report if an event did take place twice, or if it's an echo on the line. Sometimes a clerk does drop a pack of cards and enters them again just to be sure. Be ready to take only the new cards.
Some information is wrong. Us humans do make mistakes. The system sometimes doesn't know. It processes a signal, of the correct form, holding valid information. Then again, the fact that some information already in the system may be incorrect is also information.
Don't expect to get all information. There is always more.
More input is coming in. Sometimes we know how much input is still waiting to come in. We'll roughly know how much information there'll be added. In most cases it follows a measurable trend. In some cases it follows the business.
Information processing is one thing, but does it deliver the required new information? Is there more to mine out of the amassment? Sometimes the numbers can show what you need to know, but do you know where to look?
It's hard to design for things we don't know we don't know (yet). But it serves to be prepared. New things have a knack for looking a lot like something we have already. Sometimes they deserve a new module, sometime just a new category, but don't forget to put the existing items in a category also.
GMail: make the labels menu larger
2015-10-22 09:36 GMailLargerLabelsMenu [permalink]
When you don't like it: adapt it.
At work we've been switched to Google Mail for some time now, and to make sense of the mayhem that is the incoming torrent of e-mail, I've been using an extensive set of labels and sub-labels with nice colours and stuff.*
But the list of labels on the pop-up-menu if the 'move' and 'label' buttons is so small, only showing the first few labels, and I had to scroll most of the time.
Is there way to adapt this? It turns out there is. At first I read about user stylesheets, but these got removed from Google Chrome, but there's an extension that does the same: Stylish
Install this, and for URL's that start with "
https://mail.google.com/mail/", add this:
top: 92px !important;
top: 92px !important;
*: Extra tip: I was searching for something nice to prefix the label-names with that would cause them to get storted (alphabetically) at the end. In theory you could use "zzz " as prefix, but that's ugly. And assumes you'll never have an account named "zzz".
After a bit of searching around the unicode spec, I stumbled upon Bopomofo, so now i use ㄍ and ㄑ which apparently sort past 'z' and look pretty nice.
2015-10-16 22:24 tx [permalink]
tx started as a tool to keep track of things. From there it evolved into a new take on data, categorisation, oversight, structure, registration, evaluation...
To complete the configuration, set up a multi-user environment or tweak the project to your needs, it's advised to install and build from the source code.
To get started quickly with default configurations, download and install this easy installer. It has tx and xxm combined into a single executable (that conveniently launches the URL in the default browser at start-up), and a minimal database to get you started. Read more about configuring tx here.
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.