yoy.be "Why-o-Why"

Freeware: --- [TreeBrowse] [DirDiff] [DirFind] [odo] [RE] [Connect 4] [CursorTime] [MetaClick] [MetaKeys][BarCode] [MailCount] [Ro] [Fa] [WebTop] [SideSwitch]

 actueel beurs coding computers dagboek delphi dotnet film internet muziek politiek tv weblog werk freeware

just an idea: var in code for variables of limited scope

2016-02-03 16:18  var-limited-scope  coding delphi  [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  actueel beurs  [permalink]

Hee, sinds wanneer hebben ze deze toegevoegd?


MetaClick v1.2.2.466

2015-12-11 00:00  metaclick466  freeware  [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

MetaKeys v1.0.4.466

2015-12-10 23:56  metakeys446  freeware  [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  delphi freeware  [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 mongoDBthen 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.

→ github.com/stijnsanders/TCouchDB

Types of Information

2015-11-24 11:04  typesofinformation  coding computers werk  [permalink]


Not just information

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.

But there's more

Don't expect to get all information. There is always more.

uu uk
ku U R

Known Unknown

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.

Unknown Known

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?

Unknown Unknown

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  coding internet werk  [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:

.aX1 {
max-height: 780px;
top: 92px !important;
.aX2 {
max-height: 780px;
top: 92px !important;
.aXjCH {
max-height: 600px;

*: 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  delphi freeware  [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.

txLocalOnlySetup.exe (~1.5MB)

Learn something new every day: set tab width on a plain TMemo

2015-10-09 09:30  TMemoTabWidth  delphi  [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 integer(@TabWidths[0]) then).


Skipping the COM registry by calling DllGetClassObject yourself

2015-09-30 16:07  DllGetClassObject  delphi  [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  coding  [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  film  [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  delphi  [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  coding delphi freeware  [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  delphi weblog  [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  coding  [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.

Compare-Assign: 121 selected "A single equals-sign "=" is comparison, assignment is something visibily different, e.g. ":=" [Pascal, Nim].", which I find strange, since it's not what the 'top' languages do (C-family, Java, JavaScript). Perhaps I hit a specific public on reddit that happens to prefer sub-top languages that have indeed made a sane selection in operators in comparison and assignment. Perhaps it just the formulation of the question that threw people off.
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  coding delphi freeware  [permalink]

→ md5

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  weblog  [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  delphi freeware  [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  coding  [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  internet coding  [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  delphi  [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  coding  [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  weblog coding werk  [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  freeware  [permalink]


data link changed from OLEDB/ADO to SQLite3.dll