Tiny Apps
tinyapps.org
tinyapps.org
I want to cry when I see simple software like Sticky Notes in Windows 10 using dozens of MB of memory and have a 30+MB install size with minimal functionality.
I don't have a big issue with .NET and Java based apps but I seem to be using more and more Electron based software and while the software isn't bad it sucks that every program comes with its own bloated framework :(
https://web.archive.org/web/20030618002602/http://www.tinywi...
[1] Nintendo reported us to some software theft agency over "Tiny Donkey Kong" (I forget what the agency was called) and that got us threatened us with scary emails. We tried to protest that we just supplied emulators, and not ROM images, but it fell on deaf ears and we were too young and intimidatable to stand our ground. It's a shame, since it was a popular site in its day.
https://groups.google.com/d/msg/alt.comp.freeware/yKQBaHgjGD...
https://news.ycombinator.com/item?id=12985672
I'm afraid (or perhaps the word I'm looking for is "glad" ;-) that the Internet has passed tinyapps.org on by. After its fleeting 15 seconds of fame back in 2001 (thanks to a Slashdotting and tiny blurb in Wired), the site has mainly served as an irregular tech blog lo these many years.
Your blog is always a breath of fresh air any time I happen to stumble by one of your solutions in response to searching for help. Definitely one of my "trusted" sources - don't ever let that domain expire!
great job Miles
Is there some sort of @mention bookmarklet/browser extension in HN?
The first HN notification system I learned of and used was HN Notify[2,3] by Riyad of The Buzz Media[4].
I've been using edavis' hnrss.org[5] of late; it "provides custom, realtime RSS feeds for Hacker News", including for user posts and comments.
A quick search just now turned up dangrossman's HN Replies[6,7] and a few other monitoring options[8].
But in this case, it was indeed steanne's kind email that alerted me to the HN post.
[2] https://web.archive.org/web/20120103200449/http://hnnotify.c...
[3] https://github.com/rkalla/hnnotify
[4] https://web.archive.org/web/20120119135841/http://www.thebuz...
[5] https://edavis.github.io/hnrss/
[7] https://news.ycombinator.com/item?id=11080539
[8] https://www.google.com/search?q=hacker+news+comment+notifica...
Executable size may not be the best measure of these things though. Ram usage of some things can be quite huge. tinyapps.org seems to avoid this by disallowing things needing runtimes, which while not the cause of RAM bloat, often tends to be a common factor.
I'd actually like to see an interface for micro controller style apps. Like An 8 bit AVR emulator that could do some kernel syscalls to the hosted environment. It would allow for a class of apps to be written that would have a fixed memory footprint. There's some Irony here in that this would also be a runtime.
I once had a volume knob widget on my task bar that used 4 meg of ram. Somehow I feel it could have been done better.
https://en.wikipedia.org/wiki/Apollo_Guidance_Computer
https://en.wikipedia.org/wiki/IBM_System/4_Pi
https://www.nasa.gov/mission_pages/shuttle/flyout/flyfeature...
The minute you start touching modern languages and OS's things become significantly more difficult to shrink into small platforms.
When I'm not being so grumpy, I'm glad it's easier to write apps than ever before. I think someone on here posited that it's a choice between something written in Electron or not written at all. I think that's fair enough - maybe we just need to make it easier to write tiny apps. Rust and Go look great, even with a very steep learning curve coming from C# and Python.
And yes, I know as a C# developer sitting on top of hundreds of megabytes of runtime, I'm "part of the problem".
I was actually, partly, looking for a community who built or curated lists of apps with artificial constraints, for example: app must not use more than N MB of ram, must be open source, etc.
there is the demo scene, but I want to build practical apps, and there is suckless, but I found their community and philosophy a bit ... hardcore and unaccommodating.
"app must not use more than N MB of RAM" is a tricky one - how would you measure usage in all cases?
I once did all the fundamental C and C++ type stuff, writing a memory manager and my own implementations of certain datastructures and algorithms, it doesn't seem unreasonable to write something that would enforce program limits in a transparent way.
But it was easy before. If you are willing to forego completely native UIs (which you are when you are using Electron), it's always been easy to make GUI apps with Qt. Drag together an UI in designer, use (py|whatever)uic to generate classes, hook up signals/slots, and you are done.
I can only pin it on intellectual laziness of front-end programmers not wanting to learn anything else than HTML/CSS/JS and companies wanting replaceable developers. There is virtually no benefit for the end user over native applications or cross-platform applications written with e.g. Qt.
To be fair, Qt is a lot trickier than Electron - you've mentioned slots and signals which are not something you'd encounter every day (at least in webdev world).
Edit: I also don't buy any argument that relies on "intellectual laziness". There's enough elitism around already.
I recall being disappointed it wouldn't run nicely on '98 for some people, because it used about 25mb of RAM, and many only had 128mb for their entire system.
I just tried, because it's only 5 minutes of work. The demo apps (including a movie player and an image viewer) are generally in the 30MB of memory ballpark on OS X.
you've mentioned slots and signals which are not something you'd encounter every day
It's something that you can pick up in a few minutes. Widgets emit signals. You can connect signals of choice to slots to handle those signals. In Python, a slot is just a Python method. In C++ is slot is also a method, but you have to add a small 'annotation' that is processed by moc.
Here is an old video i made 2-3 years ago where i write a small 2D tilemap editor with Lazarus (the first 5-6 minutes are downloading and installing Lazarus and a tile editing tool i wrote since i used Windows 7 for that vidoe and the Win7 paint program sucks) https://www.youtube.com/watch?v=_3JgeIUo1X0
Note that there are a few versions flying around that are unofficial builds, some with addons that break it. Sadly one of them is the one from getlazarus.org which is both unofficial and often comes with unfinished and buggy features from development versions that cause it to crash and be generally more unstable. Combine this with the fact that the guy behind getlazarus.org tries his utmost to promote Lazarus (his version from his site) and there is a chance people who first learn about Lazarus will use the buggy one. He obviously means well, but i really wish he would link to the official site (http://www.lazarus-ide.org/) instead. The builds there are much better tested and there are many week-long release candidate builds that are tested by many people in the mailing lists, forums, etc before an actual final release is made.
Also note that the native Mac version is really in a worse state than the Windows and Linux versions. Thanks to Apple discontinuing Carbon (which is what Lazarus uses on Mac by default), a ton of work has to be done to rewrite the backend in Cocoa and there are very few programmers working on the Mac version so this progress is slow (also AFAIK this was delayed to implement the "Objective Pascal" extension to the compiler that would allow using Objective C classes directly without needing an intermediate C layer). Today you can use both Carbon and Cocoa as backend targets, but between the two the Carbon one is still the most stable. As an alternative you can use the Qt backend though that is more stable and featureful (thanks to it being also worked by the Linux devs), but you'll need to bundle a bunch of shared libs and are throwing all notions of minimalism out of the window :-P. Still it is the only way to get full featured stable 64bit apps with Cocoa made in Lazarus, at least until the Cocoa backend improves. And it isolates the bloat to a single platform, which while not ideal, is better than nothing (and IMO even the Qt+LCL combo is still better than bundling an entire web browser with your program).
TBH i'm not sure if it would be Qt5 or the data access components as personally i don't use either :-P. I use Lazarus to make tools mainly for game development (and mainly for 3D stuff) so i don't use the database features at all. Also i tend to use the Gtk2 backend on Linux, mostly because it is the default but also because it tends to fit better the minimalistic window managers i am using (mainly window maker).
Of course it all depends on what you want to do, but for me at least that was never a problem.
VsCode is an excellent use case for electron - a complex cross platform app with a very quick release cycle, a large plugin ecosystem and a requirement for display and processing of a lot of different types of markup.
But I've also seen a tray notification app worn in electron. It didn't even have a UI. There's also an sd card formatter, and a "quick" launcher.
Devs who wasn't to release some tiny single function app like this should rightly be ridiculed for using electron, but more complex stuff (gitKraken etc) should get a pass. Building a large, complex editor is hard work
This should be a solvable problem, IMO.
I mean, C/C++ apps are not inherently tiny - they sit on top of a large runtime too, but one that usually comes with the OS. What makes Python or Lisp apps (in binary form) multi-megabyte by default is that they can't depend on users having the runtime installed, unlike C/C++ apps. JVM managed to cross that gap too - most users, at some point, will install a JRE, which allows .jar files to be small.
I wonder why generalized solution for managing programming language runtimes OS/user-side didn't materialize.
What makes managed/VM based languages big is that those runtimes are general purpose, and therefore have to embark what most people need. A C/C++ app embarks (mostly) only what's necessary.
I can compile a hello world for bare metal, replace puts with a routine that sends the characters to the serial output, add the necessary UART initializations, and the final program will still be a bunch of order of magnitudes smaller that a Python install. The comparison is unfair of course, but it proves one thing: no multimegabyte runtime in C.
I believe that it is Delphi which sits right at the sweet spot of 'native code', 'easy gui development' and 'easy deploy' and I am sad that it is not really in use anymore.
Yesterday, I decided to finally retire my old self-written 'sticky notes' utility, and migrate all my notes to the built in Windows 10 Sticky Notes.
* My note app: ~3mb whilst running.
* Win10 Sticky Notes: ~22mb whilst running.
22mb might not be a lot of ram, but I do struggle to understand how it's using that much memory just to display small squares with text in them...
...
Anecdote: Two hours later, whilst trying to copy-paste text from one note to another, I lost the text completely, and Sticky Notes crashed... ~sigh~ back to my crappy app then...
Basically there's just a lot going on under the hood for many of these "simple" apps that isn't user facing. For better or for worse, that's why.
hmm wasn't aware of that, and didn't see the option - if this so, then I shall redact my outrage. :)
See: https://www.howtogeek.com/285944/how-to-use-sticky-notes-on-...
Sticky Notes these days packs in a surprisingly large number of features. (None of which I use, but it explains the 22 MB footprint.)
> I'd actually like to see an interface for micro controller style apps. Like An 8 bit AVR emulator that could do some kernel syscalls to the hosted environment. It would allow for a class of apps to be written that would have a fixed memory footprint. There's some Irony here in that this would also be a runtime.
As rebootthesystem suggests, this sounds a lot like a niche that would be well-served by a purpose-built Forth interpreter. Such interpreters have been used to e.g. facilitate interactive development or hot-patching on actual microcontrollers and other constrained systems. There's a surprising amount of symmetry with Lisp systems, but the traditions of Forth tend to value small code for both application and implementation. There's probably nothing preventing a tiny Lisp from filling the same role.
> Home of dwm, dmenu and other quality software with a focus on simplicity, clarity, and frugality.
These are all no-dependency, and all <100KBytes:
Keyboard layout switcher for Windows: https://github.com/tom-seddon/kbswitch
Windows window manipulation tools, for use with AutoHotKey: https://github.com/tom-seddon/align_window2, https://github.com/tom-seddon/align_window3, https://github.com/tom-seddon/dispswitch
Snack-size Windows clock: https://github.com/tom-seddon/NotifyClock
I think the large ones are only as large as they are because they statically link with the CRT. I used to do the full /NODEFAULTLIB /OPT:NOWIN98 thing, and leave out the CRT entirely, so the EXEs were tiny and had no dependencies - but this was a bit of a pain to work with. And dynamically linking with the CRT caused me a couple of deployment problems here and there, since I used to share my binaries folder between several PCs in the past. So eventually I settled on the purely no-dependency option: statically linking with the CRT, and ignoring the EXE size. The average app just isn't made meaningfully larger in the grand scheme of things by this, and by modern standards it barely even counts as measurable. Even if it's a tiny app, and now 10x larger, it might still be only 90KBytes...
It seems that programs get bloated and slower with each passing day. I'd love to see a Renaissance of small, focused, efficient applications.
Is it just something waiting to happen? Is there a company that is already doing this? It could probably be done one independent hospital at a time. Eventually you could get a small network, etc. I understand there is quite a bit of complexity involved, but isn't that what technology excels at?
Edit: Did I forget to mention expensive? These systems are not cheap, and usually involve engineers spending weeks or months onsite setting it up. That means there should be a significant of margin to cut out for competition, and/or healthy revenue for a startup, at least further down the road.
You can't just slap together a single page javascript app and close a deal. You need credibility, capital, time, solid engineers... and most strong engineers will avoid EMR software like the plague given the riches they can make in other areas in 1/10 the time.
I wish everyone the best of luck, it needs to happen, but it will be hard.
You're essentially using software to automate how hospitals and outpatient clinics work. Each one of those has established workflows/procedures; each of those workflows have started or evolved to be (at bare minimum) subtly different than everywhere else. Each and every procedure has to be build into the software or adapted to it. Installs are comparable to installing ERP systems into fortune 500 or fortune 100 companies, with at least comparable risks. Imagine how risk adverse you would be if inaccessible, incorrect, or incomplete health records could quite reasonably contribute to severe medical problems for humans.
If you were ever in a hospital for something serious pre EMRs, you would be unsurprised to have a file that is several hundred sheets of paper. Every single scrap of paper in a hospital has to make it's way into Epic's EMR.
Oh, and hospitals / clinics often buy these systems piecemeal, starting eg with labs. Your code has to talk to their code.
Lots of these got started before web clients worked well, so they're deployed clients. You can't upgrade 10k seats simultaneously, so both the clients and the servers have to be compatible up and down protocol versions. Ponder just how much fun that would be.
Or ponder just how convoluted the logic would be to ask if a person who does X in clinic A is allowed to see record B for patient C. In, for example, a hospital chain that may employ 25k+ people in the hospital and various outpatient clinics.
And follow up with questioning the idea (and expense!) of retraining every nurse, doctor, aide, tech, etc in a hospital on a new system.
When I see COBOL fixed width data at my workplace, I just think about that article and thank my lucky stars.
Additionally, as was mentioned, the health care systems depend on the EMR for all government and compliance reporting. The EMRs also do NOT play nice together so even if you get customers, it is hard to get data out and shared with other systems. It is possible to disrupt this space but you better start with a war chest, start with a very focused niche (say Urologists) and be prepared to slog it out for a decade.
[1] https://www.athenahealth.com/more-disruption-please/labs
https://web.archive.org/web/20160710205728/http://donkeyssta...
https://web.archive.org/web/20160619170739fw_/http://donkeys...
Via Wayback Machine,unfortunately, as often happens another dead piece of the internet.
The actual Winexplorer tool has not been cached, I just uploaded a copy here:
http://www90.zippyshare.com/v/OlyKhob6/file.html
The compiled executable is 164 kb, and the .zip includes sources.
It is a simple replacement for Explorer with a number of nice features.
Even the latest MacOS, Windows, Linux, etc are all running decades old chunks of code. And yet, they still run well.
Old code is debugged code. It's (mostly) proven code. It's aged leather. It feels good and it just works.
Everything doesn't have to be "modern".
[1]: https://fman.io
[2]: https://fman.io/blog/picking-technologies-for-a-desktop-app-...
Back in the 90s I used this DOS text editor that fit on a single floppy sector (512B). I forget the name, but it was a part of my standard toolkit for many years.
These days, I run "evilwm" for my home desktop. That's about as small and efficient as a DE/WM gets anymore, and I love it.
Disclaimer: Currently working at AnyDesk.
http://www.bcheck.net/apps/hoe.htm
customized hotkey launcher.
Written in assembly I believe. You can modify it far beyond bosskey.
nircmd is low in memory footprint as well as binary size.
http://members.ozemail.com.au/~nulifetv/freezip/freeware/
http://members.ozemail.com.au/~nulifetv/freezip/freeware/dsf...
Sort of dd for Windows:
dsfi.exe 5,061 bytes
dsfo.exe 6,637 bytes
fsz 6,144 bytes <- same use as /dev/zero can create files filled with 00's
And - as a side note - a related rant: http://reboot.pro/topic/15207-why-everything-is-so-dmn-diifi...