2005-06-10 20:46 freeware [permalink]
Here are a few applications I wrote, a few of them I use myself, a few were just for fun...
They're put public here as FreeWare, some are OpenSource. I haven't figured out yet if I need to put them here under a license or even which one. So for now they're all rights reserved and use em at your risk, though there's really nothing to fear because they really don't do more then they're supposed to do.
Anyway, if you really want to have a look at the SourceCode, let me know -- StijnSanders
(Click on these icons:)
AllSorts (shell extension)
2017-02-03 22:54 MetaClick500 [permalink]
→ MetaClick v18.104.22.1680
2017-02-03 22:52 MetaKeys500 [permalink]
→ MetaKeys v22.214.171.1240
2016-12-16 22:30 DirFind494 [permalink]
2016-12-10 23:57 metaclick497 [permalink]
- fixed issue about division by zero at start-up
- now open source on github
Another Multi-User Dungeon
2016-12-08 23:15 amud [permalink]
I wanted to make an extra demonstration of WebSockets from/on/with an xxm project. What I also have dreamed about is making a multi-user game where players would navigate a virtual realm and manipulate the objects in it. Problem is that I don't have too much experience with playing existing multi-player online games, and that animated graphics design is not one of my strong points. But still, I wondered if combining the two would lead to something that somehow works.
So I started a project and set out to get something working, without losing too much effort on anything non-essential. Not even on a name for it, so I called it "Another Multi-User Dungeon". I've put the source up on github and host a running version on this computer at home I use to run my xxm projects (so don't shoot me if it's not available, it's not an always-on full-fledged web-server, but it also shows xxm projects don't ask much of a machine to run stabily). Feel free to have a try:
The view shows, from top to bottom:
Anything you type into the entry box, when you press enter, is passed on to your in-game persona to speak into the room it is in. Click on items or people to get a list of actions you can do with it or them. Some actions use the last statement that was spoken by your in-game persona, for example 'make a note' from the NoteBloc object (ask for a NoteBloc from the hotel's receptionist). Click on an item again to select it, and in some cases extra actions are available on other items, for example the 'give' action to pass something from your inventory to someone else in the room. Most 'door' objects have a 'go' action that will move your in-game persona to a different room, unless you don't have the key to its lock or the room is fully occupied.
For now I haven't put too much up into the virtual realm. By default you enter the world in the first free room of the Sunburst Hotel, and apart of a welcome leaflet there's not much there. I thought a decent virtual realm would have computer-operated agents you could interact with, so I remembered ELIZA. A lot has changed in the world of chat-bots since then, but I thought it would be nice to have just that in there. It turns out the syntax of the bot-script at its base serves nicely for other roles as well, so I fashioned a receptionist for the hotel that answers back to some questions (and for now can provide you with a NoteBloc if you ask politely). At the city hall, there's a registry office where you can change your display name, and perhaps leave your e-mail address into the internal database, I might make it required for some operations later or if someone wants system support. There's also money you can pick-up and drop, but nothing else you can do with it (yet!).
Under the hood, it's heavily based on a single WebSocket, your 'feed' through which you get information about the virtual realm, and through which you can send commands back. The set of commands is limited and any extra requests lauched by the client-side script use a personalized single-use key based on your personal authentication key stored in LocalStorage. (I could have gone with a cookie, but if the WebSocket were hosted over TLS, LocalStorage offers slightly better security.)
I'm not sure where to take it from here. I've been thinking about creating a shop you could use money to buy things, but then you'd need something you can earn money with... And transporters that could move you to locations further away. But I guess designing more of a city will take some effort already... Perhaps I've got what I wanted: to create a platform that has the basics to build a game on. Only the idea for a specific game isn't there yet. And thinking up a thrilling plot of an exploratory adventure isn't one of my strong points either. If you have ideas please let me know in an issue on GitHub. Perhaps I could hand out a few RoomMaker objects to people and see what they do with it...
2016-11-13 21:04 dirdiff2 [permalink]
It feels like this was a very long time in the making, but all the little bits of time here and there probably still amount to a recent number of man-hours... It took a couple of attempts to get "An O(ND) Difference Algorithm and Its Variations" by Eugene W. Myers in an implementation of my own that performed to my liking. I've chosen to use xxHash to speed things up. Once I got that, I continued the grand re-work of DirDiff so it would accept, not 2 files, but n files (or folders); handle the work in background threads, and have both the folder-overview (and XML three) and content in the same window. In case anyone would like to have a peek inside, I've decided to open-source it as well, under the MIT license on github
I've open-sourced my productivity tools
2016-11-12 16:49 tools [permalink]
I've finally decided to open-source a set of my home-made tools, some of which I use almost every (working) day. Some may be very taylored to my personal taste, others may be easier to use by the broader public. Most are missing documentation, but the typical operation should be self-explanatory. (Except for handy hidden features, should make a list of those somehwere sometime soon...)
These tools have been available here for download in binary form since long, but by putting the source code in a public repository I hope I can inspire anyone that would like to know more what's going on behind the scenes to have a look, and who knows perhaps get someone to make improvements or additions.
RethinkDB: here to stay or on the way out
2016-10-07 23:23 RethinkDB-in-or-out [permalink]
I'm worried and confused. The news these days is that RethinkDB is shutting down, at least the company. The database itself may live on. I had been attempting to write a really-thin Delphi wrapper for RethinkDB a number of times before, but got diverted into writing DelphiProtocolBuffer first, because it was used for the base of the server protocol and I couldn't find the Delphi support I was looking for (I'm sorry, but I'm a bit picky). Later it looked like they were planning on dropping this in favor of something else, but I wasn't able to investigate further at that time. In the mean time, I did a CouchDB, PostgreSQL and a MariaDB/MySQL wrapper, and a neat way to tie them together, and kept TMongoWire working, which turns out to be the one in the series of DB connectors that has the most success to date. (And which envolved learning all about PBKDF2...)
So now I'm confused about wether to keep RethinkDB on my to-do list? Or drop it? Or move it up to have a look sooner... Just like MongoDB, it may be that I won't really have a full-grown project anytime soon that is based on RethinkDB, but demand for a thin Delphi wrapper is out there and makes it worth it, I don't know. (Please let me know.)
And I'm worried about this new tale of an open-source-but-also-corporate endeavour going sour. It's only natural that when the projected sales don't appear to manifest, a project is best to get ended cleanly (as I recently witnessed over at the day-job). So I'm rooting for the open-source project to find a good new home. That the eco-system of volunteers may survive the orphanization. That the real-world users may carry enough weight to force the project into a viable after-life.
It's important to have a good climate to have entrepreneurs get enticed to take the step and start a company, but with this series of high-profile undertakings going bust, and aqui-hires where users get left in the dark, it starting to look like it's running out of control. Some people may called it a bubble, but I find the image of a pendulum swinging more appropriate. Is it swinging back already? I'm in no position to tell accurately. But I am worried.
For the record, I have had no economic gain from my open-source undertakings what-so-ever (up till now?) though OpenHub estimates about half a million went into xxm up till now. Not bad for a hobby...
But about RethinkDB, I guess I'll have to wait a little until the dust settles down...
Update 2017-02-06: RethinkDB's assets have been bought from RethinkDB Inc. By something something Linux Foundation, and a re-license to the Apache Public License. Sky is clearing up.
xxHash: an extremely fast non-cryptographic hash algorithm
2016-09-23 23:50 xxHash [permalink]
I'm slowly but surely (finally!) working towards a (long overdue!) rewrite of DirDiff, but this time using threads and perhaps a different algorithm. Apparently there's still progress to make there, and I read good things about the diff git is using internally. Looking into that, some performance can be gained by doing the actual comparing on hashes of the data, instead of all of the data itself. Which lead me to xxHash, which should hit the sweet spot between fast enough and safe enough against collisions. (Unless I misunderstood.) I'm not sure if anyone thought of combining those two. But I may be looking into that for DirDiff 2... But since I didn't find a Delphi implementation rightaway, here it is, and it fits nicely with this collection of other hashes I did before. (Though xxHash is specifically a non-cryptographic hash...)
Delphi and MySQL or MariaDB
2016-09-15 21:12 libmysql [permalink]
Tadaa! I added a wrapper around libmysql.dll (to connect with MySQL or MariaDB) to my collection of really (really!) thin wrappers around things like ADO, or LibPQ (to connect with PostgreSQL) or now libmysql.dll. I also had the idea to align them as much as possible into almost the same interface. It's specifically not my point to have them be exactly the same, but very much almost so, just in case when I use this for a project and need to switch database back-end later on, the work that goes into that is minimalised and can concentrate around the different in SQL dialects. (for example the postgres branch here)
AES, DES (TripleDES)
2016-09-09 23:08 aesdes [permalink]
I've added AES and DES. DES may be deprecated, and Triple-DES may be soon, in any way it's cryptographically superceded by other ciphers, but still in use by some systems. I should do some work extra and change
array[0..7] of byte into
record l,r:cardinal; end; or even
int64 but I needed it only for something small and this works, so I'll leave it at that for now.
2016-07-08 22:52 jsonv103 [permalink]
jsonV now shows more sensible type labels, and only the fout-digit-hex-internal-value only on the most exotic variant types.
Ctrl+Shift+C now copies the value only, not just the node caption.
I also discovered a blocking issue when jsonDoc was trying to construct an array of int64 values. (more about that here)
2016-06-16 17:40 jsonv102 [permalink]
jsonV now accepts json-files that contain an array at the root level.
I also changed jsonDoc so all OleVariant arguments are passed const. This may break older versions, but should offer a little improvement in performance.
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...)
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)
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):
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.
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.
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:
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)
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
2014-05-14 23:13 r1811 [permalink]
data link changed from OLEDB/ADO to SQLite3.dll