Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Have you created programs for only your personal use?
423 points by smarri on April 13, 2022 | hide | past | favorite | 652 comments
Curious to know if anyone has written programs for their own, regular, & personal use. And if so what they are? E.g. A colleague of mine tracks all of his homes energy use through a custom program which disaggregates the energy consumption per device and outputs a report to a tablet.



Hundreds! Doesn't everyone? Most of them are just bash scripts, many of which have now reached a complexity so high that I wish I'd started writing them in a different language but it's too late now. The majority of the rest are Python.

Off the top of my head, the most used ones are:

* A replacement front-end for "tar" and various compressors

* A script to synchronize my music library to a compressed version for playing in my car

* A secure-but-readable password generator

* A system to batch compress folders full of video files. (For ripped blu-ray discs, mostly.)

* A replacement front-end for "ffmpeg", see above

* A "sanity check" program for my internet connection to see if the problem is me, or Comcast

* A front-end for "rm" that shows a progress bar when deleting thousands of files. (Deletes on ZFS are unusually slow.)

And lots more tiny things.


> * A replacement front-end for "ffmpeg", see above

I have one of these too... It's kind of frightening how hard ffmpeg is to use without some kind of custom frontend. I have probably dozens of bash/python scripts to invoke ffmpeg for different common tasks.

- One to extract audio

- One to extract all the individual streams from a container

- A couple different transcoding scripts

- One specifically for gifs

- One to crop video

- A few that I can't remember the purpose of... and can't tell from reading the source


People always say this but... I'm not sure I agree. I think people confuse "hard" with "powerful".

With the exception of cropping I can do all of the above from memory. Maybe I just use ffmpeg a lot.


I think this is it. Repetition.

You could threaten to kill me and I wouldn't be able to user ffmpeg from memory. I just don't have to use it often enough. So I created a script w/ the settings I usually want to encode certain things that I need to encode semi-often. It definitely doesn't make it easier to remember ffmpeg command line options because I don't have to use them.

kubectl and our home grown command line tools to interact with our build and deployment? I know most of it by heart of course because I use it daily. I really don't like some of the scripts that we have and do it "by hand" instead because I have to use it all often enough that I want to know what is really going on underneath in case things don't go the way they should (and there's always something). I am able to diagnose and fix or work around all these issues with ease because of it, while lots of other people just run the wrapper scripts and if something doesn't work they very often aren't able to even troubleshoot the simplest problems. I'm that guy w/ ffmpeg ;)


I thought everyone just searches for their exact needed pattern on SO


I just keep a "cook book" of common commands I've gathered from SO so I don't need to search each time to refresh my memory.


I'm pretty sure you meant this in a different way but it reminded me of another thing I see a lot with people.

They have these huge lists (written down in some tool or another) of commands to do specific things and they copy and paste them. It's heart wrenching to see them search for these sometimes (even if they find them) and then they copy and paste them. But they sometimes (many times) don't work or are super simple things. Like the `kubectl get pod` thing I mentioned, they might have that in one of those lists under some heading like "dev environment commands" or somesuch together with 10 or 15 others.

Because they never actually tried to understand the simple logic and meaning behind these command line tools and only ever copy and pasted, they get very easily tripped up by even the simplest things, such as replacing the parts that need to be adjusted for their specific situation, even if clearly marked, such as `kubectl -n <yournamespace> get pod` (or one that comes up even more often in troubleshooting sessions 'The command from the docs does not work and I made sure I copy and paste so I don't mistype it' and if you ask what they did it was `kubectl -n examplenamespace get pod`). Or they might have written down a command from the onboarding docs that combined multiple things into one command line. To fix issues with their environment, they have to basically nuke everything and start from scratch, because only then will their copy and pasted command actually work. They haven't learned to decompose these and use the parts individually or recompose them.


I agree that keeping a cookbook of stuff pasted from the internet without knowing the fundamentals is an anti-pattern.

For me (and probably for GP), my cookbook is stuff that took me more than a few minutes of tinkering or reading manpages to figure out, and it’s stuff that I use maybe once every couple weeks — not often enough to memorize, and annoying if I have to figure it out again.


Have you tried

curl cht.sh/ffmpeg


It’s the ‘wrong’ way to think about it in the sense of subjectivity : powerful in this context means lots of arguments and config settings you have to learn, memorize or look-up.

That means you have to become an expert level user to become fluent (where the user would call it “easy”)

It’s an UX that would exclude entry level computer user (since entry level here means not even knowing where the shell is for ffmpeg) and would perhaps be a barrier intermediate computer users.


When it comes to UI, powerful often implies hard.


A useful distinction is "complex" versus "difficult".


ffmpeg arguments generally compose pretty well, although it's powerful enough that (as other comments have mentioned) for special use cases you do often have to look things up.

If you can remember 3 or 4 things you can do most stuff without looking anything up, however:

    -i -> input file
    -vcodec / -acodec -> video and audio codec; "copy" specifies copying the input stream
    -vn / -an / -sn -> disable the video / audio / subtitles in the output file
    -ss / -t -> specify the start time and length of the conversion from the input file
So, just by looking at the above, you can easily see how to extract audio (or any individual stream). For gifs specifically I would recommend using gifski which has much better results anyway. For cropping, I don't find the `-vf crop` syntax too bad.


But when you have differing behaviour based on argument position like putting -ss / -t before the -i or after (fast seek vs accurate seek), it gets confusing pretty fast.


I wrote one of those last week as a sort of poor man’s video editor. Besides aliases for common commands (like extracting a time range without re-encoding), it also takes the tedium out of repeatedly typing file names. Output file names are generated based on the input file name, with a prefix that auto-increments like sql. Input files can be referenced by prefix. It makes a huge difference.


Perhaps because ffmpeg and other swiss army knife tools can do so many useful things.



> Hundreds! Doesn't everyone?

I certainly have. Interestingly, one was the same "sanity check" program for my internet connection, because of the same ISP you mention. Amazing coincidence...I don't think. :-)


I ginned up a "wait for the internet to come back up" script that repeatedly pinged something with one packet, and used the Mac 'open' command to play an mp3 file once the ping succeeded. Unsexy, but when you can't google up a better solution...


I made something similar but I used macos' `say` command instead :)


I like this idea. Some company that I may or may not work for either does or does not install malware on our computers, extending the boot sequence and something in the network layer that makes it take MINUTES for anything http to be usable, even after the DE is loaded. Would love to add such a script to my login’s boot sequence


Add another Comcast outage checker and logger to the pile. Used to call and hassle them for outage refunds regularly.


Chalk me up to that too. And my brother. Originally I'd used Ping Plotter. When I went 100% Linux I stopped using that. My brother ended up putting together a Grafana board tied to influxdb & infping and monitors several friend and family internet connections complete with alerts.

Here [0] is a screenshot of the Comcast cable connection from a year and a half ago. I have since switched to AT&T gigabit fiber. Here [1] is a screenshot from today.

[0]: https://knightoftheinter.net/img/20201102143900.png

[1]: https://knightoftheinter.net/img/Screenshot_20220413_171934....


I love that you are crowdsourcing data from several friends and family members. We need this for most of the SaaS world!


Hah. I did not realize that was an option. Should have been keeping track of downtime :)


I've written one too, if you count a simple shell alias for ping google.com

Comcast "service" has probably driven the creation of more trivial internet connection test programs than any college course in the world.


I get more calls from users of my apps that have Comcast as the access provider than any other, and by far. The first thing I do when they have connection issues is check downdetector.com


Mine uses notify-send to send a notification when connection is back up/ when connection goes down.


> Hundreds! Doesn't everyone?

Raising my hand in agreement!

A couple highlights:

- Video syncing library before those became cool (2014). Originally built on top of firebase; now rewriting with my own backend. Very slow going :)

- Twilio server + interface. I'm my own service provider (thanks to Twilio)


> - Twilio server + interface. I'm my own service provider (thanks to Twilio)

What does this mean? You run a pbx that implements twilio's apis and can be accessed via twilio's api endpoints? Or something else?


Twilio is the PBX and gateway for calls + texts.

I run a server that lets me receive calls wherever I am (SIP or forwarding, as required) and send messages. Like a self-hosted Google Voice but more flexible and with a greater choice of numbers + forwarding destinations.

All my server does is respond to HTTP requests from Twilio and send HTTP requests when I send a message.

Somewhere in the Twilio interface, you can define a SIP endpoint, but I forget where it is. That's enough for placing calls and does not require running a server.

Almost forgot to mention that I receive text notifications via pushover because I am not an Apple developer ... so no app for me.


What is your monthly twilio bill?


Interested in making it open source? Self-hosted Google voice sounds awesome!


It's ugly and not user-friendly but I encourage you to play with Twilio! They make everything super easy.


It's cool that you do that, but "Doesn't everyone?" implies to me that you might be a bit out of touch. This is common among a certain type of person and unheard of for everybody else.


> This is common among a certain type of person and unheard of for everybody else.

I suspect the venn diagram of that is very close to the venn diagram of hn readers and everybody else.

I think "doesn't everyone here" is implied there.


Yeah, that's the thing I think you imagine is true but actually isn't. I'd guess that the majority of HN readers don't do this, assuming they represent average technical employee across the industry. They probably _could_ if they needed to.. but I bet they don't. (Just based on my sample of: all the people I've worked with).


> I'd guess that the majority of HN readers don't do this, assuming they represent average technical employee across the industry.

That would be the disagreement then I think: you and him have different models of the majority HN reader. Based on my experience in the industry and on hn, I also don't think the typical hn commenter represents the average technical employee. Perhaps the typical hn reader does, but then I have a lot less information about that group.

I don't think it's right to say he's "out of touch" for an off the hand remark like that, even regardless of this discussion.

e: also, there is a poll option for hn posts, it might be interesting to find out more about who does/doesn't do this.


Not to cast shade on you, by any means, but if you're an engineer (which I think is the implied everyone,) I'm surprised you don't!


> but if you're an engineer (which I think is the implied everyone,) I'm surprised you don't!

I’m an engineer but I only write programs for money and not for myself


Yeah, I'm an engineer. I'd guess that neither I nor most of my coworkers do. It's much more common amongst lower-level engineers than, say, product engineers. Heck, I work full time in Python + Typescript and I don't even know Bash. I never even have things I want to script. Most of my time is spent making sense of code, not doing any sort of complicated repeatable task.


So, what are you engineering? Ci/cd pipelines with ready made tools?


Full stack stuff, more or less.


> A "sanity check" program for my internet connection to see if the problem is me, or Comcast

It's funny, I've never thought of doing this, but now realise it would be quite handy. Not just for connectivity but also some quick bandwidth/latency tests, and perhaps even a few basic internal network checks too.

The number of times I'm trying to troubleshoot Zoom calls these days... it would be handy to have a little bash script to run to rule out obvious issues.

For my specific use case, a big one would also be a quick automated check for whether my primary network connection is Wifi or Ethernet since I swap between the two and often forget which I'm currently using (which can impact connection quality if it's not the one I intended).


I also had tons of these scripts. Since then I found one ScriptKit which might be interesting to you. https://www.scriptkit.com/

I have since ported over most of my common ones to this.


Looks pretty interesting! On my cursory glance it doesn't seem to by obvious what flavours of scripts it supports, other than the JS examples. Is it restricted to just Javascript?


Yup it is only (Type|Java)Script but it has a bunch of global functions which makes translating easy.


> A secure-but-readable password generator

I love pronounceable passwords, but there's research indicating that such generators typically produce lower than expected entropy. Do you mind sharing what algorithm you use?


I'm confident that http://canonical.org/~kragen/sw/netbook-misc-devel/bitwords.... produces passwords with precisely the expected entropy, and it's secure under Kerckhoffs's principle, so I don't mind sharing it. For the ones that consist of words, the wordlist I use is http://canonical.org/~kragen/sw/netbook-misc-devel/wordlist, the frequencies of the words that occur 5 times or more in the British National Corpus.

This representation is my favorite:

The 84-bit number 10231239242746186561668573 can be represented as: ...

In 12-bit words of 5 letters or less: hits towel bloke gala blah jimmy barry

Diceware is good too.

A word of warning: be careful playing around with stochastic text generation if you're susceptible to delusions and hallucinations. You'd have to be pretty far gone to think "hits towel bloke gala blah jimmy barry" was a message from God, but of course we all know people who have fallen into that kind of belief, and the strain on credulity gets smaller as the text model gets more sophisticated.


Wouldn't a generator like this significantly increase risk of succumbing to dictionary attacks? I probably just don't understand part of what it's doing, but I'm curious.


It depends on what your baseline is. With knowledge of the generation algorithm, a dictionary attack on a password generated that way will definitely succeed, but on average it will take 2⁸³ tries (twice that at worst). At a billion tries per second this is 300 million years, almost long enough for the Sun to engulf the Earth if your attacker devotes only a single CPU to the task. There are commonly used password hashing algorithms that can only do a few hundred tries per second per CPU, which pushes the average success time to a quadrillion years, fifty thousand times the current age of the universe.

By contrast, trying every phrase of 20 words or less in every book that has ever been published would only take something like 129 million × 19 × 500,000 = 1.225 quadrillion tries. At a billion tries a second, that's only two weeks. (And if the password hash is inadequately salted, the attacker can use a rainbow table and put in that effort ahead of time and distribute it across all the victims.)

An attacker with more resources might devote a million CPUs to the problem, which would cut the time to success from 300 million years down to only 300 years (assuming a billion tries a second). In the next few decades it will become practical to devote much larger amounts of computation to problems like this, so such an attack might succeed, but currently it is beyond the capabilities of all but a few adversaries. And, as I understand it, Grover's algorithm will enable a large enough quantum computer to solve your password in only 2⁴² tries, which is only about four trillion tries, under an hour at the billion-tries-per-second speed I suggested above. I'm not sure, but I think it would need to prevent qubit decoherence for that period of time.

You can get equivalent security with a shorter password that looks like random gibberish, such as b7fc d750 9a52 ad6a e48c a, eedgckeimbjdefhcjclmghh, mgujdlrgdfmadtlidu, 1qvrx21zego0scvyi, 17uUPBKnfX7fSNY, >4h)&crV,+E{O, or 宜潨阰揫難侌, but those are a lot harder to memorize. They're shorter to type, though, and they're less vulnerable to side-channel attacks.

Looking random isn't good enough, though. They need to actually be random.


In short, oodles of noodles is a better chew than fewer, stranger noodles in your alphabet soup.


Is this your password?!


Nice try:-)


Not OP, but I prefer memorable passwords, thus, correct-battery-horse-staple style passwords in bash: (Install cracklib, or any dict file)

  #!/bin/bash
  pickaword() {
        WORDFREQFILE=/usr/share/dict/cracklib-small;
        WORDLENGTH=$1;
        awk -v wordlength="$WORDLENGTH" 'length($1) == wordlength {print $1}' "$WORDFREQFILE"|shuf|head -n 1;

    }
  [[ ! -z $1 ]] && numWords=$1 || numWords=4
  separator="-"
  count=0
  currentWord=""
  while [[ $count -lt $numWords ]]; do 
    [[ $count != 0 ]] && echo -n $separator
    num=$((3 + RANDOM % 10))
    word=$(pickaword $num)
    echo -n "$word"
    count=$(($count + 1));
  done
  echo ""
Edit: code formatting is hard. Source is: https://gitea.slowb.ro/ticoombs/dotfiles/src/branch/main/bin...


Please don't use $RANDOM or $((RANDOM)) or standard `shuf` for password generation. These RNGs are not cryptographically secure. Use input from /dev/urandom instead.

Modulo operations like these are another thing to avoid. To get equal chances for each word, the simplest thing to do is e.g.

    do
      wordlistlength = 10e3
      randomnumber = os.urandom(1) * 256 + os.urandom(1)
    while randomnumber > wordlistlength
    return wordlist[randomnumber]
(Adjust if your list length is greater than 255×256+256, of course.)

Further, I see that cracklib-small is 52k words. That's not good or bad, but it makes the default 4-word phrase 52e3⁴ ~ 63 bits of entropy, which isn't terrible but in my opinion on the short side as a default. It will be perfectly fine if you only ever want to defend against online attacks, but in some cases (think disk encryption or password manager) offline cracking should be kept in mind and for the rest you should usually use a password manager anyhow (so then memorability doesn't matter).

Or perhaps more succinctly: please don't roll your own crypto.

I understand that this is of course very unlikely to be abused if it's just for yourself and nobody knows of this weakness in your credentials (security through obscurity works... until it doesn't), but one day someone will use this as inspiration or it will spread somehow, say through an HN comment... just use good password generators or at least keep insecure ones secret.

Btw: many standard Debian(-based) installations have /usr/share/dict/words available so you don't need an extra install; I haven't seen cracklib used before but that might just be me.


I'm curious. What kind of attacks do you open yourself up to if you use $RANDOM in this situation?

Also, why do we avoid modulo operations?


$RANDOM has low entropy, a predictable sequence and it's even more predictable if you use modulus.

$RANDOM provides 15 bits of randomness (32768 possible values) from an LCG[1] - https://en.wikipedia.org/wiki/Linear_congruential_generator

LCGs are multiply followed by add followed by modulus, which is usually implied by a mask or a native word bit length rolling over. You should observe that multiplies have patterns in the lower digits which an add will only offset, and the modulus will only throw away high bits rather than mix them back in to the low bits. Consider the low digit in multiples of 7 (what you'd get picking a number between 0 and 9 inclusive via modulus):

    7 -> 7
   14 -> 4
   21 -> 1
   28 -> 8
   35 -> 5
   42 -> 2
   49 -> 9
   56 -> 6
   63 -> 3
   70 -> 0
   77 -> 7
   84 -> 4
   91 -> 1
   98 -> 8
  105 -> 5
  112 -> 2
  119 -> 9
  126 -> 6
  133 -> 3
  140 -> 0
The lowest digit has the sequence 7418529630 repeating, which isn't very random. Modulus preserves low order bits and throws away the magnitude of the number. The result is that if you want to get half-decent low-valued random numbers from an LCG, you should take x/range * limit rather than %. You can do this with integer arithmetic via multiply and shift if you have an integer twice the size of your LCG.

But again, don't use an LCG for generating your password.

[1] I looked at the source. Bash looks like it tries to use random(3) if it's available, otherwise it seems to use this, which doesn't have an add:

  x(n+1) = 16807 * x(n) mod (m)


Sometimes I use passages from books. Easy to remember a >60 char password, can always check the book and it brings back to memory a book that I enjoyed each time I use it. For PINs I like to use a long sequence of digits of a physical/mathematical constant.


From books? Having anything that's natural language will kill your entropy, way way below correct horse battery staple. Moreso if it's indexed by Google Ngrams.


Yes. But it’s much more dramatic in the movie when the villain runs his finger along the spines of the books in your library idly but then his eyes narrow and he aggressively pulls a book off the shelf and flips it open to a well worn spot. Checkmate!


Theoretically, maybe. But I'm tempted to believe that for all practical purposes it's a 60+ chars password.


Don't. It isn't.


Just FYI, if there is an incentive to get your password, there are existing programs to match arbitrary length strings from books or any text source. One such program has been used to steal cryptocurrency from wallets that are generated from a passphrase like NXT.


That's why I also add punctuation to the phrases :), or some suffix.


Look at diceware.com for a good way to do that. You can calculate the entropy without "research". I use a simple python script for the purpose, filtering out the words < 7 chars long from /usr/share/dict/words instead of bothering with the official diceware list. Example output: "snored-Hoff-virtue-tab-eroded-Perl's" with estimated 87 bits of entropy. If you write the phrase on a piece of paper and refer to the paper when typing the phrase into a computer, then after a few uses you will remember the phrase without any special memorization effort. At that point you can shred or burn the paper, or possibly record it in an offline encrypted file requiring its own security efforts.


Also take a look at the EFF’s wordlists [1] as an alternative to the Diceware list. Quoting from their blog post, here are some issues with the Diceware list that they have resolved: - It contains many rare words such as buret, novo, vacuo

- It contains unusual proper names such as della, ervin, eaton, moran

- It contains a few strange letter sequences such as aaaa, ll, nbis

- It contains some words with punctuation such as ain't, don't, he'll

- It contains individual letters and non-word bigrams like tl, wq, zf

- It contains numbers and variants such as 46, 99 and 99th

- It contains many vulgar words

- Diceware passwords need spaces to be correctly decoded, e.g. in and put are in the list as well as input

[1] https://www.eff.org/deeplinks/2016/07/new-wordlists-random-p...


Thanks for the link, but it's broken, should be: https://www.eff.org/deeplinks/2016/07/new-wordlists-random-p...

I think you copy-pasted it from elsewhere on HN, causing the end to be cut off.


> Do you mind sharing what algorithm you use?

Actually, I do mind. And so should you! I developed it myself, however, and feel reasonably confident about it.


I think the generator from xkcd sounds pretty good. https://xkcd.com/936/


Problem is so many websites have these arbitrarily low password lengths that usually max out at 20 characters.


I haven't seen those in a while now. For random sites you should use a password manager anyway though, not try to remember a thousand passphrases. You're going to end up reusing passwords if you try to memorize them all, or else you'll have to write some down and then you are already using a password manager :). Or you use a system and then 1-2 cracked passwords/-phrases will likely break them all.

Note that this advice is for the average, common site. If you have special considerations for your bank, broker, or similarly high-value sites, different advice might apply of course (but this is not really the place for that and there are already enough recommendations online).


Worse are the ones that let any length input but only read the first ten characters or so.


For ages I remembered this as 'battery-horse-staple-correct' but then I see loads of people saying 'correct-battery-horse-staple' so now I think I'm the one who is wrong.

I wonder which way round is actually the right way to say it?


Neither? As the linked comic says, it's "correct horse battery staple".


ok typo on my part... anyhoo - does "correct" go at the front or back?! Because the way I read it, the speech bubble saying 'correct' is after the horse and the other two words.


"Correct" goes at the front; see panel 4. You remember the order along with the words, and the imagery is a cue to aid memory, not a script.


Maybe it's because I'm a visual learner that I stored panel 6 and not panel 4.... Even though I clearly stored it incorrectly regardless.


I gave up on readable.

    with open('/dev/urandom', 'rb') as f:
        return base64.urlsafe_b64encode(f.read(12))


alias genpwd="tr -dc 'a-zA-Z0-9!@#$%*()[]{}' < /dev/urandom | fold -w 16 | head -n 1 | xclip -sel clip"


I always find those annoying to copy (we use a lot of shared credentials, like when the customer gives us 3 accounts with different permission levels to pentest an application with) and it also simplifies the command to not have to specify all those symbols. You can also avoid the whole `fold` thing by just telling `head` to give you a certain number of -c instead of a certain number of -n.

    </dev/urandom tr -dc a-zA-Z0-9 | head -c 16
(Then again, you were proposing an alias, so then command complexity/memorability doesn't really matter.)

Security level: log((26+26+10)¹⁶)/log(2) ~ 2⁹⁵ (95 bits of entropy), comparable with adding those 12 extra symbols: log((26+26+10+12)¹⁶)/log(2) ~ 2⁹⁹. (Adding a character makes more sense than adding a symbol if you want more security, all else being equal of course.) If a stupid application still has outdated password requirements (thankfully this is rare among the applications I use) then one can of course add the classic ! at the end.


They are annoying, specially when it's the wifi password and you have to enter it using a TV remote.


Using head -c 16 will show an ugly '%' at the string end when not piped.


Right, I forget that it's not the default to print a \n as the first character of your PS1. Doesn't make sense to me that this isn't the default, as there are quite a few commands that might not end with a newline and then it messes up the prompt position, and it doesn't impact backwards compatibility to add it now.


On which OS? There it is piped, but I can't make it display a "%" any way (why would it?). I'm on Linux, using head from GNU coreutils.


Arch Linux. When using Zsh the last char is always a '%'. When using Bash it does no show a '%' but there's no line break. Possibly an weird interaction with my $PS1.


That's definitely a Zsh thing, showing that there was no newline: https://zsh.sourceforge.io/Doc/Release/Options.html#Promptin.... It's not to do with PS1 or PROMPT, or head.


Also passwords you can select by double click (ie certain special characters) and don’t have characters that look ambiguous (ilI, oO0, etc)


Something like

    cat /usr/share/dict | shuf -n 4 | tr '\n' '-'
(inb4 unnecessary use of `cat`)


I use cat like this all the time. It means I can easily change whatever program I'm using to interact with the program (e.g. switching `tr` to `sed`).


You can replace "cat /usr/share/dict |" in that invokation with "</usr/share/dict" and it will be equally easy to switch between tr and sed. Yes, you can put that redirection at the start, not just at the end of a command line. Although I admit I still haven't got used to doing it.


I posted some advice in a sibling thread, <https://news.ycombinator.com/item?id=31021503>, that applies here as well:

> Please don't use $RANDOM or $((RANDOM)) or standard `shuf` for password generation. These RNGs are not cryptographically secure. Use input from /dev/urandom instead.


You can do this with "shuf --random-source=/dev/urandom".

The same with gshuf.

I use an alias to add this switch by default.


When using shuf for cryptographic purposes, I'd first check if it advertises as being able to be a secure cryptographic token generator when provided with a secure random source. It might very well use modulo operations, for example.



Yeah, I think OP might be more interested in "what is the most elaborate program you wrote only for your personal use?" Most of my personal programs have been command-line script. I have written a couple of single-page web apps and a Mac app once. These were more learning projects than programs I used long term.


* A replacement front-end for "tar" and various compressors

Could you elaborate on this? I feel like this is something that could save people hours of time. I'm so incredibly sick of the various decompression flags and tools, (de)compressing something on the commandline should be as easy as it is with a GUI.


I've memorized a total of two commands from decompressing things (`tar xfv $file` and `unzip $file`) and one for compressing (`tar cf $archive.tar $file1 $file2 $directory`) which seems to have done everything I've wanted for more than 20 years of unix usage. Is there something I'm missing out on? Sometimes, a `gunzip` or `7z` has been needed, but they are far apart that I can look it up each time. I'm not sure how I can save hours of time as non-tar or non-zip files is not something I often come across.


I just use dtrx: https://github.com/moonpyk/dtrx. That only does decompression, but that's generally good enough for me and supports basically everything (even more exotic stuff like Java JARs and DOCX, which are both ZIP archives under the hood).


If you're using GNU tar, there are four short options to specify compression/decompression: -Z for compress, -z for gzip, -j for bzip2 and -J for xz. Using long options, you can specify --compress, --gzip, --bzip2, --xz for the same, or even --lzip, --lzma, --lzop or --zstd for others.


That's exactly why people hate tar/UNIX generally. Tons of parameters that don't EVEN CLOSELY represent their purpose. For example: -j -J if noone told me, I'd assume they were "join" or "jump", or something. PS: zcvf zxfv, and, - surprise, surprise! - by default tar deletes source archive!


tar czvf "create ze vucking file"

tar xzvf "extract ze vucking files"

source: https://news.ycombinator.com/item?id=18909789



Links, please.


Yes. And it’s a strange one.

I made a program to gender swap any text you put into it and then got a book deal to rewrite and illustrate Fairy Tales. It’s been published around the world.

https://genderswappedfairytales.com

The idea is to shine a light on the original versions but it also creates a lot of never-written-before characters. A lot of brave princesses and lady-beasts, but also men desperately wanting children and being rewarded for kindness.

I wrote the gender swap algorithm in Swift. It seemed like it would just be a simple auto replace type thing when I started but there’s some weird things in English, for example with his/him/her/hers where they don’t swap back and forth sensibly and you have to understand the context.

It was his > it was hers.

It was his sword > it was her sword

So I ended up down this rabbit hole of natural language processing to break up each sentence into verbs, nouns etc to work out the correct words to use. Even tried training an AI to do it based on the finished swapped text but a whole bunch of rules worked more reliably.


For anyone else who enjoys this, consider the Jailbreak the Patriarchy browser extension, which does basically this for text on the web.

https://chrome.google.com/webstore/detail/jailbreak-the-patr...


This is great, thanks - this was actually my initial idea and it sat there in my head for 5 years and then morphed into doing a book.

We’re doing a sequel this year and I’m going to redo the website with the aim of turning genderswapping into a movement and getting other people to join in. I’ll link this this for sure!


Sounds like an interesting challenge although I’ll admit on this one I would have just went to fiver and hired someone to edit the existing text. My guess is under and week and a couple hundred bucks at most and you’d be set.


I think this is a case of "chop your wood and it will warm you twice"... ie. the value derived from this exercise was not just from the outcome, but also the journey there!


Totally agree and get it, I do it selectively as well - and on this one, I don't think I would have enjoyed the challenge of it so I would have just outsourced the work to be done manually. It's such a straight forward thing to explain to someone else, I think most gig workers that spoke english reasonably well could quickly knock it out. Actually, so much so that since most of these stories are fairly short and you probably end up proofreading them dozen of times as you tweak the code and/or review the outsourced work for accuracy/completion... so I might have just done it myself manually and it would have taken probably less than a dozen hours without the communication overhead of going through fiver or similar. It's more of a do things that don't scale approach I suppose as myself with a toddler that loves reading stories I value my time above all else and could find a dozen more interesting things to hack on in my limited free time (highly subjective I know, just my hot take on the topic at hand).


One reason it was nice was to instantly swap the story and get to read it back as if it’s new.. if I’d had to swap it all myself I’d already have been bored of it by the time I was done! Also allowed swapping lots of versions to see which I liked best.

But I have to admit too, that I just wanted to see if I could make it work ;)


This is so cool! I think I'm going to gift your book to my niblings next Christmas. Thank you for sharing!


Thank so much! I hope you enjoy


The Inclusive Coding Bot (a stupid Github bot that went around Github making pull requests replacing "he" with "they") guy should've talked to you...

https://news.ycombinator.com/item?id=30877930


Those who don't know history are doomed to repeat medireview mistakes.

(I'm old enough to remember when Yahoo's attempt at preventing cross-site scripting, blindly replacing eval with review, resulted in such shenanigans as "Please reviewuate my CV for Professor of Medireview History". Some of the corruptions persisted outside of Yahoo mail when people emailed text to themselves as a form of file transfer. Yes, this went into production in one of the two largest email providers at the time.)


People need to stop thinking this bot was a serious attempt. It is very obviously a troll making fun of people who advocate for gender neutral phrasing.


Poe's Law strikes again.


Wow this book is beautiful! Thank you for sharing.


Thanks! It’s illustrated by my wife. She did a frickin incredible job! More of her stuff here if you’re interested: KarrieFransman.com


I made myself a Chrome extension called Headlamp that puts a red dot by each link, button, text box, etc., and clears them as I click or type while I’m testing a web app.

When I hand off a build to a client, if all the red dots are gone, I know I’ve at least TOUCHED everything.

If I’m working with another engineer, we can both see the dots in our browser and collaborate to clear them all while we test.


That's really smart.


Nice! Can you share it?


Sure! It’s not really bulletproof yet and could use some more features, but I’d love to get your feedback and bug reports. I’m thinking about turning it into real product…

https://headlamptest.com


> Headlamp is like having a second manager on the team.

I'm not sure I would use that endorsement...


Good point! Wrote that many years ago. It’s a side project I’m resurrecting.


Cool product, it's something I'd personally be interested in if free or one-off license, but as someone who just dabbles now and then (but including sometimes for business stuff) it's nowhere near worth the monthly cost for me. $50 one-off would frankly be possibly more than the value I'd get, but I'd definitely buy it in the hope it would be useful. (Appreciate, I'm not everybody and just because that's where I fit it doesn't mean your pricing needs to be aimed at me.)


I'm not saying the above poster is wrong, but never ever take pricing advice from devs.

Especially not devs on Hacker News.

If you want to sell this (and you may not), sell into QA or product leaders.

"Are you tired of deployments from your devs with dead links? A yearly license of red light is only $6k for a team of 20"


I'm not even a dev, as I said I'm just a dabbler so certainly wasn't suggesting they build a business plan around my willingness to pay, was just adding a data point in terms of hobbyist interest :)


I tried to make my comment as aggressiveness as possible, but it still sounded harsher than I wanted.

I wanted to communicate to the other poster: - You (swores), are probably correct about everything - You (swores), and I, probably aren't buyers

There may be a ton of buyers out there who aren't us


Thanks for the feedback!

It’s free to use for now. I’d like to bill heavy corporate users someday. Not sure what the criteria will be for that.


Maybe I misunderstood from glancing at the pricing table, what is the difference between "public projects" (free) and "private projects" (enterprise $50/m)?

My assumption from glancing at the page was that I'd only be interested if I could have the full version, and that I might be willing to buy a license to own it but not to pay a subscription to keep using it. Mainly because I don't mind an impulse purchase that's half hoping to turn out worth buying and half supporting a dev / product creator I think worth supporting, whereas if something wants money every month I want to actually know it's going to be a good use of money long-term, which is a much higher bar to clear in my mind.

A side-thought: if it turned out to be a useful enough tool that I started getting colleagues to use it, and incorporating it in work done for clients, then I'd prefer it to be open source and ideally easy to customise / potentially white label.


Thanks for the feedback.

I don’t know what to do about pricing, only that I’m leaning towards a freemium model where hobbyists and occasional users pay nothing.

It is a cloud-based service with ongoing costs to pay and work to be done, so I think it’ll be subscription-based.

I would love to do this full-time if there is enough interest to justify the effort.

For now, I’m really excited about welcoming some real users other than myself and getting lots of bug reports and feature requests. Please give it a try and get in touch with me over email!


I created a program that prints QR codes onto sheets of peel-and-stick labels. When someone scans the code, they are directed to a simple web app that manages food sharing with my four roommates.

We noticed that we buy a lot of the same things (bananas, avocados, eggs, etc), so we implemented a system where anyone can stick a QR code onto something they want to share, and anyone else can scan it to record what they took. For example, this morning I pulled a carton of eggs out of the fridge, scanned it, recorded that I took 3, and a Splitwise expense was automatically updated between me and the person who bought the eggs (much easier and less awkward than handing someone 75 cents). Everyone is logged into the application via Splitwise OAuth, and all products/expenses/debts are automatically simplified within Splitwise and updated via the API - so the app is pretty much a wrapper over Splitwise specifically for granular sharing of food.


It’s like Web 3.0 for your fridge… make a market for anything.

A roommate taking 3 eggs from me doesn’t bother me. Firing off a text, “Hey, I took 3 eggs” is all I need.

We really just don’t like to share these days. That’s the problem we are now solving it appears.


Lol do you really need to criticize someone else's code written by that person to solve their own problem in their own sphere based on your personal (sharing-positive) ideology? This is peak Hackernews.

Live and let live is what I say. Writing code for yourself and your own problems is fun.


Long-term sharing breaks down when one person feels they are contributing more than another. For low-price household items like toilet paper, soap, etc, and common kitchen items like olive oil, flour, etc, we all still pitch in to a fixed "house fund" since it takes more time to split it evenly. But for everyday quantity-based items, it has helped us all stop over-purchasing and throwing out as much fresh produce, and any roommate can opt-in to share as much/as little as they want.


Yea. I might set something like this up if I had awful roommates or some special reason why we couldn’t share. Otherwise, a shared fund for pantry items seems like less hassle for the same outcome.


> We really just don’t like to share these days. That’s the problem we are now solving it appears

Yeah, capitalism took over the sharing economy and turned it into the gig economy.


What label printer do you use and did you end up automating the printing process or just the QR code generation process?


I use a regular desktop printer and feed in sheets of sticky address labels (the 1" x 2.625" and 2" x 2" squares are ideal). I wrote a Java program to output QR codes with random IDs onto a PDF document, and generated one long PDF such that I could pre-print a couple thousand labels.


I chose a different system, you can buy something for yourself or you can buy something for everyone in which case the price is shared between everyone. Is it less fair? Perhaps the unfairness does accumulate (for example, I'm the only vegetarian here, but meat still gets added to the shared budget, but in exchange I eat more non-meat than others), but it would be really inconvenient to have, say, 3 packs of cheese (you can't just take an entire pack of cheese, so it can't be shared with your system). Also I don't need any labels!


You are living the future my friend


Are you maintaining a per item price list? Is is generic or updated after each trip to the market?

0.25 per egg assumed the dozen cost $3 but what happens when I go to a value brand and my cost is $2 or the fancy $5 dozen eggs. Does the roommate have to update the price per item for everything they buy?

How do things like a bag of chips work? Cost per weight probably makes the most sense but the overhead of such a system seems enormous.

Also, what happens when your roommate gets mad at you because they bought those eggs for a specific meal they planned on cooking for dinner and now have to go to the store for more or change their plan? This is the main reason I most had a no sharing rule with my roommates.


I took some screenshots to give better context to my answers below: https://imgur.com/a/5Vx9aOR

To initialize an item, you take a QR code off a sheet of QR stickers (each one has a random v4 UUID as part of the web app URL) and choose a sharing method. In the case of eggs, I would simply enter whatever I paid for the eggs, and it is up to the roommate that scans the code to decide whether to take it or not.

There are four "sharing schemes" supported so far - share by quantity, by rotation (so someone can join the rotation to replenish something like a spice), by percent (so someone can offer/claim 25% of a leftover pizza), or the whole item (probably ideal for the bag of chips example).

The whole system is very hands-free and opt-in, and everything stays synchronized with Splitwise (I wanted to add some screenshots of that bit, but my roommate's names were all over - I might set up an example or GitHub repo for this project some day).


Congrats! You've invented a very bare bones inventory management system :)


Decades ago I had a friend that needed to scan his CD cover to start selling it online. I only had a Linux machine. So I looked up the documentation for the HP scanners, found it was well documented at the protocol level, so I bought one.

I wrote some CLI tool that could trigger a scan and read the data back, into a file. Worked well enough, but I wanted a GUI.

I started thinking I wanted to make a GUI for it. I started thinking "I'll need to do X like xv does, I'll need to do Y like xv does, I'll need to do Z like xv does..." Clearly, what I needed to do is extend xv so it could do scanning. I spent a weekend making the prototype, and it worked brilliantly.

xv was open source but licensed $25 for commercial use. I made a deal with the author, John Bradley to become a reseller for xv. Over the next few years I sold, I don't remember exactly, but maybe thousands of copies. To people, to government labs, to businesses large and small. It was the beginning of a company that I ran until around 7 years ago, and that just shuttered for good a few months ago, 25 years later.

All for program I wrote to scan a friend's album cover art.

https://www.linuxjournal.com/article/4029


Very inspiring and insightful story! Thanks for sharing it.


Wow. Thanks for this story.


I created a program that outputs one of my kid's name if the day of year is even, the other kid's name if it's odd. I use it to determine who's turn it is to take a shower first. They'll argue with me and each other all day long but for some reason they will not argue with the computer.


Install a second shower-head and make them shower together. Parallel processing is your friend here.


Imagine how messy async showering would be?


I do that too! One of my kids was born on an odd year, month, and day, while the other was born on an even year, month, and day. They know who is who and they don't argue with the calendar. (We do it by day of month and we find another way to decide if we need to on the 31st.)


has it been more than a year? How does Jimmy feel about going first on Dec 31 (day 365) and Jan 1 (day 1)?


They don't have to take a shower on New Year's Day.


I guess it could be change to count whether if the number of days since Jan 1, 1970 up to today has been odd or even...


Probably since otherwise you’d just need a calendar or somehow know the date which most people do without custom code


Even if the decision was merely day-of-week based, that doesn't buy the key characteristic the author values (I assume): the kids will accept the Algorithm's ruling


Call it Shower Power


Love this!


Heck yes, all the time. While it seems like the major computer/OS vendors these days are trying to turn computers into limited purpose appliances, I was first exposed to computers as a child in the late 70's, when it was expected that anyone who owned a computer would also want to program it for their own purposes. My own personal projects tend not to be very large in scope, but can be quite handy. Some examples include:

- A Pomodoro timer that has exactly the features and user interface that I want

- A script to perform backups of select files and directories from a source drive to a specified backup volume

- A "pixels-per-inch" calculator that allows me to compare the resolutions of displays that I may be interested in purchasing; by entering the width and height of a display in pixels, and its diagonal in inches, it calculates the density in pixels-per-inch, and the dot pitch in millimeters

- Various user-friendly graphical interfaces to aid in solving different types of puzzles (think sudoku-like logic puzzles)

- Programs to actually solve various types of puzzles all on their own (I've written over 70 of these in the last 10+ years!)

- Various command line scripts for code management tasks (i.e. useful for sofware development itself)


I have a pixels-per-inch calculator too, but mine is an Excel spreadsheet. Lets me see all the displays I've been interested in or own, even things like phones.


For DPI I like this site: https://dpi.lv/


>- Programs to actually solve various types of puzzles all on their own (I've written over 70 of these in the last 10+ years!)

Cool, are these open source?


No, they're not in any public repo or anything. Besides, if you solve puzzles using a solver you didn't write yourself, it's cheating. :-)


Can you at least share a list of the puzzles? :)


Since you asked nicely:

Abstract Painting, Arrows, Battleships, Booty Island, Busy Seas, Castle Bailey, Castle Patrol, Chocolate, Clouds, Consecutives, Crosstown Traffic, Desert Dunes, Digital Battle Ships, Disconnect Four, Farmer, Fence Sentinels, FenceLits, Fillomino, Flower Beds, Free Planks, Fussy Waiter, Futoshiki, Half-Dominoes, Hedgehog, Hidden Clouds, Holiday Island, Inbetween Sumscrapers, Kakurasu, Kakuro, Knightoku, Kropki, Landscaper, Landscapes, Light Battle Ships, Magnets, Mine Ships, Mixed Tatamis, More Or Less, Neighbours, Nonogram, Noughts And Crosses, Number Crossing, Number Crosswords, Number Path, Odds Are Even, Orchards, Over Under, Paint the Nurikabe, Parks, Planks, Ponds And Flowerbeds, Power Grid, Ripple Effect, Robot Crosswords, Robot Fences, Sheep And Wolves, Skydoku, Skyscrapers, SlitherLink, Snail, Snake, Snake-omino, Square 100, Straight And Turn, Sudoku, Sumscrapers, Tatami, Tenner Grid, Tetromino Pegs, The Odd Brick, Trebuchet, Unblock Me (aka Rush Hour), Unreliable Hints, Vexed, Wish Sandwich, Zen Gardens, Zen Landscaper

Most of them are puzzles found in the following iOS apps:

https://apps.apple.com/us/app/100-logic-games-time-killers/i...

https://apps.apple.com/us/app/100-logic-games-more-puzzles/i...


Huh, I've never been asked that.

Yes, for over 30 years. I could never list them all. Nearly every thought I have becomes a program. I've written x86 asm game hacks (DOS era), 2D tile games (80's), Windows MIDI composers, game frame languages, ray-tracing renderers, OpenGL visualization, PID controllers, camera controllers, video controllers, circuit simulators, flight controllers, so so so many games, scripts for analyzing data, scripts for scraping websites, ODBC readers for my cars, FM synths, game solvers, and that's just stuff in C, not even getting started with the bazillion websites.

Over decades, programming becomes such a part of your life, that it is simply the way you move about the world, and think about it.


I wish I could shift my thinking to do this. I've been a web developer for 17 years and love programming. But any time I've tried to build my own projects or products, it's usually a revamp of an existing product or game, and I quickly lose interest.

I lack the ability to see everyday "issues" that could be resolved with programming. But if someone asks me to solve an issue with a program, I could probably come up with something pretty quickly.

Curious if anyone else has this problem, or have found a way out of it?


I didn't say everything was finished. ;-)

In fact, I'm not sure how to decide if something actually IS finished. Sometimes I just want to understand something, and when I get to that point, I call it done. I just like to learn.

Like with my FM synths: I made a TX802 clone a long time ago (in software), and once I got to a certain point I was like, "Yep, got it." I just wanted to construct something that could implement the FM algorithms and a filter. That's all. I could have made a fully-fledged MIDI synth, but I just wanted to understand synthesis. Or with ray tracing: once I got spheres, cubes, transparency, and reflections and a simple scene text-file syntax, I was like: I should add NURBS, but that was way too complicated, so I called that "done" because I understood how it worked.

You can ALWAYS keep going. Nothing is ever really done. When you lose interest, that's just your brain saying, "I learned enough, let's do something else!" Think of your brain on hobbies like a Golden Retriever: short attention span but always happy!


That's not a bad outlook and I had never thought of it that way. Even if I don't finish the project, at least I'm actively coding and having fun. Thanks!


If you don't need/want it yourself, and no one's paying you to do it, yes, you'll lose interest. I don't have your problem; I reach for code as a solution pretty quickly. Probably key is I'm not trying to "finish" personal projects or make a product, just doing as much as I need at the time.

Since you know web development, maybe install TamperMonkey and start "fixing" or improving websites you use regularly. You can often make a significant difference to your experience with a few lines of code written in a few minutes (changing/adding CSS rules, making links visible instead of hidden in dropdown menus, reordering/recolouring things, presenting information in a more sensible way, adding shortcut keys, converting static tables to DataTables, etc.). Over time some of my user scripts have grown to many hundreds of lines, and even been adapted to be essential components of workflows of me and my colleagues. They make my job/life easier dozens of times a day.

(Most of these are for internal websites or idiosyncratic to my needs, so there's no point in sharing them.)


Thanks for the suggestion on TamperMonkey, I'll check it out.


You're probably going for things that are too large in terms of scope and/or scale and don't really solve any need for yourself. Think about bite-sized problems that will help you with your day to day work/hobbies and don't try to solve them in an 'enterprisey' or bullet-proof way... think the simplest thing that can possibly work. Then over time, start getting more ambitious. It doesn't matter if it only works for 2% of cases (as long as it's the 2% you care about), runs slowly, is a memory hog, crashes every 8th time you run it or any number of other things you'd never dare do for 'production' code. Assume it's a throwaway project and then be pleasantly surprised if it isn't.


The way out for people like you and me is to realize that most problems don’t need to be solved with software. When you find an effective solution that doesn’t involve code or computers at all, you can congratulate yourself.


If you find a way, let me know


>>> I quickly lose interest

Working on self-directed projects didn't come naturally to me either and I had to learn how to get over this motivation issue.

It's taken me 10 years of working on side projects to finally be able to figure out which things I will actually finish vs. which ones I just like the idea of and will invariably give up on. It's some combination of what do I think is useful to myself or others, what can I turn into a small prototype in a short amount of time, and what can I actually accomplish in a short time [1].

Accountability was important for me to launch three side projects in the last year. I declared to my friends on New Years that I was going to make and launch a game that I had designed within that year. I kind of entangled my desire to finish projects with my desire to follow through with what I commit to.

I didn't actually finish it in that year, I finished it in January of this year, but I tried! I set it down a lot and ended up getting stuck multiple times. Probably because of that pesky day-job and regular life. My friend asked me if I had launched, and that caused me to put in a final weeklong sprint and launch it. If I knew how close I was to finishing I would have finished it months earlier. I ended up simplifying a lot of code in the first few days of that last sprint and all of a sudden finishing seemed possible.

Because I devoted myself to launching that one game, I have since been creating more and more things and launching them or getting them to a stage where they're generally useful.

In my case, having the confidence from finishing one project made it easier to start newer projects because I knew whether I could finish them based on my past success.

>>> I lack the ability to see everyday "issues" that could be resolved with programming.

Almost every idea that I have could initially be conceptualized as a revamp of an existing product or game, but I'm super excited about them because they're my revamp that I'll gain a skill from and will help me to work on more complicated things later.

I take notes whenever I have an idea and will expand on ideas that I'm still interested in later. I basically use the snowflake method, creating more elaborate detail about the ideas I'm most interested in. Sometimes they evolve a lot after expanding on them too.

Honestly 99% of my ideas are terrible, so I trained myself to try to write down every idea that I have and then later on when I'm itching to start a new project I can decide whether it's a project that I will actually finish vs. ones I just like the idea of.

[1] https://xkcd.com/1425/


Is there somewhere we can purchase/play the game? I'd be interested in giving it a shot!


Thanks!

It's called Wrds. There's a web app on playwrds.com and Android / iOS versions as well.


I don’t see it in the Dutch iOS App Store. You should add it there (most people speak perfect English here so you don’t need to worry about translations).


The whole family spent the last hour playing classic. It’s a good game!


I have a similar list - except I've never finished anything.


I wrote a scraper for various dating websites that would automatically generate activity on my behalf according to several empirical criteria (very simple stuff, no ML!), so that I could minimize the amount of time spent manually fishing.

It worked amazingly well, it got me hundreds (yes, 100+) of dates, incredible dating stories and a lifetime of memories, all in a semi-automated way without me requiring to “swipe right” or similar. As a matter of fact, my current girlfriend (of 5 years) was found through the software. She knows it and laughs about it.

Clearly the software didn’t do anything magical, I would have likely gotten the same results had I spent the time to individually message and interact with the 100s of women the software did in a semi-automated way, but it was really nice to save my time.

One day I should write a blog post.


  if waist/hip<0.75 and children==0:
     send_message("Sup hot stuff, your place or mine?")


What kind of activity was this generating? Just swiping/liking/whatever or were you using this to automate conversations?


Would be very interested in that blog post or some more detail haha

Did it have some kind of decision making functionality to decide which people to like?



That guy used k-Modes to game the questions on OKCupid to maximize his matches, which is (well the line here is fuzzy) an ML technique. So probably not?


Tons. Way too many at times. I build a lot of tools to make it easy to consume and produce media/social media offline (these flows usually involve turning things into email or Usenet articles and then transmitting them on a private network) both because it lets me control how/when I consume media and also because it's just plain fun.

Other than that though, I have a system that helps my D&D group (which meets weekly and has for years) choose what to order for dinner. The system keeps track of a number of restaurants in our area (hand annotated) and chooses 5 restaurants from different food genres and excludes the genre of food that was picked the previous week. The restaurant choices are placed in a ranked choice poll which I monitor and close manually to choose dinner. The ranked choice poll has been helpful when a restaurant actually ends up closed so we just step down the list and pick the next in ranking.

Admittedly this is a technical solution to a mostly social problem, but my D&D group has some neurodivergent personalities that are really bad at coming to consensus. Also, the system pretty much runs itself at this point as the restaurants are kept in a sqlite database and the code is so simple that it never really changes.


I wrote a mapping program that could display maps, my location on them, time estimates to a down-road position, etc.

"Why not Google Maps?"

Several reasons: Google Maps requires a cell connection. (They have offline maps now — they didn't at the time I built the tool — but my offline maps are far more controllable in what data I pull down. And if I need data I haven't got, and I have a cell signal, I can fetch it on the fly and add it to the offline cache.)

Google maps was much worse at the time about finding rest areas. They're better marginally better now, but it's still pretty tedious to do on mobile. (There's no general search for it; you can search rest areas and usually get rest areas + junk, but you also really want to also search at the same time for, e.g., Flying Js, Loves. Contextual knowledge about the road would be good too, in case I'm on a turnpike. Also, still waiting for it to realize that, if I'm looking for gas, food, etc. … I want it downroad.) Admittedly my own implementation could have been better here, but I also lack the nice datasets that Google has…

OSM's map data is, in my opinion, better.

The GPS device I have can acquire a signal pretty much instantly. The phone … cannot. Useful in situations where we needed a quick answer, b/c things are happening at 60mph.

Though, we did end up supplementing the program with the phone. (On-the-fly routing is better in Maps, b/c it's a really tough problem, and I didn't build an interface into OpenRoute or whatever its called.)

OpenLayers is an amazing library, too.


the Next Exit is a phenomenal tool while travelling.

https://thenextexit.com/

I keep an older copy in my car for when I travel.


My entire linux Desktop feels this way! It's my favorite part of working in a barebones Linux distro like Arch. I've got to build everything from the ground up. Need a screenshot program? OK... let's pull in Flameshot. Where's it going to host that image? Well, let's create a watch folder and shuttle everything off to a GCP static bucket.

Window manager? I3... heh, let's build a bunch of scripts. Vim? Well... man, that's a whole ecosystem of tooling I an hack together and write against.

I do this as a designer. I'm actually not a fantastic programmer, I just like the flexibility of building tools that are specific to me. My entire desktop feels like a love letter to building cool things the way I want.



I live by them; I probably couldn't name them all, they've become so embedded in my flow.

Probably the most important part of my flow is the following; it's a method for doing a personal "inbox" GTD style, 100% reliant on email + zim-wiki. I have a script that, when called manually, searches for new "inbox-marked" emails (i.e. ONLY those sent from me to me), and copies them to my zim notebook (specifically, to the page corresponding to "today" in the journal) as an open checkbox item.

Supporting that is-

- Desktop: a little shell script that pops open a zenity window to send such an email

- Smartphone: An android app called Blitzmail that does that and only that.(pops a window and sends to an address with no other interaction)

This replaces a LOT of things for me and helps prioritize immensely, (i.e. strongly prevents "email inbox as to-do list" which is a bad idea)


I created "Kid Money Manager", a tool to help manage my son's virtual account. He wasn't old enough to open his own bank account when I started, but we needed some way to track his "earnings" (returning bottles for their deposits or gifts from grandparents) and spending. It has both a Web UI and access via SMS text messages. We mainly use the text messaging—entering transactions at the store, etc.— since I didn't want to write a dedicated phone app for such a simple interaction.

Created it from scratch, live coding it on my (https://JitterTed.Stream) Twitch channel (and some videos on my YouTube channel at https://JitterTed.TV). Written using TDD in Java + Spring Boot, deployed on Heroku and open-source at https://github.com/tedyoung/kid-bank.

I also recently wrote "Format Hero" (https://formathero.dev), because I could never remember which letters to use in Java's DateTimeFormatter. Was also a good demonstration of Hexagonal Architecture and, of course, I live coded it, TDDing all the way. Source is at https://github.com/jitterted/format-hero. Still some work to do on that one, but filled my immediate need.

[edit: added proper links for Stream/YouTube]


I work as a water engineer, specializing in building hydraulic models so water utilities can simulate their network.

A big part of that is calibrating them which can be time consuming, you look through hundreds of options. I create a few web based apps to help grind through these tasks but ultimately they were for my own use as a consultant to close projects quickly.

I did pull out the engine as its own open source library for other to use, and that ended up helping me get my current role where I can now maintain it and be paid at the same time.

https://github.com/modelcreate/epanet-js


Dozens if not hundreds (my github recently exceeded 100 repos; more than half are personal projects)

What I've done at every job I've had (in software) is convince my boss "it's just a little code, let's open-source it! Maybe it'll go viral and a community will form to contribute & make it better!"

Which basically never happens (well it did once, in a big way) -- but when I'm working my next gig, guess what? I can use all that code again. And this time I can honestly recommend, "Let's use this thing on github, it does what we want & it's open source!!"


I have a fun one. The front door to my house had an automatic door opener, paired with a single-button remote control to unlock and open the door. The remote control was annoying to carry and use. (This was before IoT became a thing.)

I pried open the remote, soldered on an extra circuit bypassing the push switch, and hooked it up to an Arduino. When a packet is sent over serial, the Arduino simulates a button push:

    const int basePin = 2;

    void triggerRemote() {
        digitalWrite(basePin, HIGH);
        delay(2000);
        digitalWrite(basePin, LOW);
    }

    void setup() {
        pinMode(basePin, OUTPUT);
        Serial.begin(9600);
    }

    void loop() {
        if (Serial.available() > 0) {
            Serial.read();
            triggerRemote();
        }
    }
This was paired with a tiny web server to do the serial write:

    #!/opt/bin/python2.6

    PORT = 5525

    import BaseHTTPServer, SocketServer

    class LoccaHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
        server_version = "LoccaServer/1.0"
        def do_GET(self):
            if self.path.startswith("/trigger"):
                serial.write('A')
                self.send_response(200)
            else:
                self.send_error(404)

    serial = open("/dev/ttyACM0", 'wb', 0)

    httpd = SocketServer.TCPServer(("", PORT), LoccaHTTPRequestHandler, False)
    httpd.allow_reuse_address = True
    httpd.server_bind()
    httpd.server_activate()
    httpd.serve_forever()
Finally I threw together an iPhone app with the most basic UI imaginable: a static full-screen photo of the remote; tap once, it fires off a HTTP request, and the door swings open:

    - (IBAction)triggerRemote:(id)sender {
        NSURL *url = [NSURL URLWithString:@"http://10.0.8.48:5525/trigger"];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [NSURLConnection connectionWithRequest:request delegate:nil];
    }
That's basically all of the code. Considering how much of a janky hack this is, it worked great.

Ancient write-up with some photos: https://web.archive.org/web/20120103180640/http://ghughes.co...


At one point I had a gist with a bunch of links to a web server that controlled some home automation stuff. Add a link to your Home Screen and you’re good to go! Easy to share as well


After a quick burst of manic energy during exam phase, I decided to solve the pigeon problem on my balcony once and for all (and in a humane way).

So I bought a cheap electric water gun from Amazon, built in WiFi using an ESP8266 and a relay shield; 3D printed a window mount for my old iPhone (running a webcam app) and hacked together some openCV code in python.

After all this was working on my desk, I had the pleasure to discover that the PCB Antenna of the ESP is to weak to receive WiFi on my balcony so I connected the ESP to my (current) iPhone hotspot and wrote a small go relay for my server so that my laptop can send the shooting commands to the water gun ~~over the internet~~. Oh and while I was at it, I added a Siri Shortcut, so it’s voice controllable, too. (They are surprisingly hacker-friendly)

The surprising thing is, that this Ruben Goldberg machine actually works really well and without much fiddling.


Can you publish more details of your setup and the code?


Does this allow you to shoot the water gun, or is it recognizing pigeons in an automated way and firing?


I'd guess the latter if there's an OpenCV component


This sounds really amazing. I'd love to read more about this!


Some weeks ago I wrote a couple of bookmarklets, one of which was this:

javascript:(function(){ location.href = `https://nitter.net${location.pathname}` })();

You can take this JavaScript snippet and save it as a clickable bookmark (hence the name bookmarklet) in you browser. I've named this "re-open in Nitter". I deleted my Twitter account a while back but sometimes I get handed a Twitter link. This snippet let's me quickly re-open the link in Nitter which is a nag-free way to browse Twitter without having an account. :)


Related, I have a bookmark called "HN Migrate" that let's me redirect an HN comment section to a mirror (currently hackerweb.app).

    javascript:(function(){!function(){var a=new URL(location.href);if("news.ycombinator.com"===a.host){var e=new URLSearchParams(a.search.substr(1));if(e.has("id")){var n=new URL("http://hackerweb.app/");n.hash="#/item/"+e.get("id"),location.href=""+n}}}()})()
At some point I might add support for deep linked comment threads, but in practice it hasn't been enough of an itch.


Useful! There is a nitter add-on at least for firefox, called nitter redirect. All twitter links go there seamlessly.


Nice use-case for bookmarklets! With Firefox I've started using the LibRedirect extension for that, which also covers other big sites.


I have a strange problem with my monitor that I solved with a program.

Basically, I use a USB switch to switch my mouse, keyboard, and webcam between my personal desktop computer and the MacBook I use for work. I tried a full KVM switch at first, but every time I'd switch it to my MacBook, Windows on my PC would flip its shit. With the primary monitor disconnected, it would move everything to the secondary monitor, which was fine, except that when I moved the KVM switch back to my PC, it would move everything back to my primary display, whether or not it was originally on my primary or secondary. Additionally, since my two monitors are different resolutions, all my window sizing was wrong.

I tried to get around this by plugging my PC into my monitor's Display Port and plugging the MacBook into an HDMI port and just telling my monitor to switch inputs, and for the most part it works, but at 1 PM every day, if my monitor is set to HDMI, it drops the DP connection, making Windows think it lost the monitor, putting me back at square one.

So I wrote a simple program in Python that sits in my notification tray. I can tell it to save or restore all my window positions. So if Windows loses the monitor, after it comes back, I can restore everything to where it was.

As a bonus, I also added a "Easy Copy/Paste" menu to quickly copy emojis like ¯\_(ツ)_/¯ and ಠ_ಠ to my clipboard.


I love writing personal programs - you get to re-invent the wheel your own way to learn exactly how things work, with no code reviews or people shouting "[BLAH] ALREADY DOES THIS".

Sometimes you just want to code and see if you can recreate BLAH for yourself.

My oddest program was called 'heater' - it variable settings from warm -> hot and would peg the CPU at different rates (at the time I was in an unheated office, and rather than go buy a heater - I did what all programmers do and re-invent the wheel)

Programming is fun!


Any time I find myself doing something twice on a computer, I try and think if it would be easy to write some tool and do it if the value makes sense. Usually these are teensy little utilities that might pull data from websites, wrangle text and handle common files in my life, let me know upcoming meetings and connect to them, or even just little hobbies like making a scraper and local database of recipes vs manually going to that js heavy website prone to link rot.

All these exist on the command line, some are short functions in my bashrc, and some are more substantial written as discrete scripts and run via launch daemons. Not having to worry about gui or capturing each and every test case makes solutions fast and only a couple to a few dozen lines most of the time. I don't worry about awkard characters in my strings and all the esoteric regex and special cases that would need to go into a production ready script, because i simply don't use those characters in strings or do anything funky that stack overflow comments like to bring up as a potential pitfall. Makes it easy when I am my own client. plus it makes it easy getting all these programs to some new computer of whatever OS when all I need to do is pull a git repo full of these scripts to install.


Hacker News is part of my daily life. I try to follow the top stories every day when I have the opportunity. In order not to miss important stories on my busy days, I prepared a notification service. It was a very simple, ~40-line PHP script that sends me notifications for stories with over 200 points. I have been using this service for 7 months and I no longer worry about missing important stories.

Finally, I made this service available to everyone so that it can be useful to others. I have also obtained the necessary permissions from the HN moderators to share such a service with you. So, I hope you will not miss important stories from this awesome platform with the help of this service.

https://hnn.avci.me


Out of interest why not just use an RSS feed for the top posts?


Because I was already have Pushover account for mobile notifications, and started using directly without extra payment or application.

Now I checked after your question, I found this[1] good service, but do you have any suggestion about receiving mobile notifications from RSS (for iOS)?

And you can consider my personal project as an alternative.

[1] https://hnrss.github.io/


I have the feeling I am creating one every two weeks. If you tolerate windows, C# is a great multi-purpose language to develop quickly tools across desktop GUI, CLI and websites.

A UI over ffmpeg to look into downloaded movies and add/remove/rename/change default tracks without recompressing (or re compressing certain tracks only). And to autorename files with imdb titles and ids. And another one to collect timestamp from videos to edit out segments. Or to merge videos, auto finding the best size, fps, etc.

Own mp3 player with ability to exclude songs, import files from different sources and sync playlists with itunes on windows through COM. (Had so many bad experiences with itunes that I don’t trust it as my reference for song data, ratings and playlists and only use it to sync iphones).

Various tools to edit and manipulate gpx (fix time zones mostly and apply gps to photos) or srt files.

All sort of web scrapers.

A nimbletext-like on which you can drop files

A home website that contains the downloadable imdb data to manage my movie library and suggest movies I don’t own already.

Music sorter to try new songs with fast keyboard shortcuts to fast forward/flag/discard. Same for photos.

Lots of CLI tools: CLI for my domain names (for instance to maintain a dyndns-like subdomain). My own ACME client for wildcard certs that also updates various softwares with the new certificate (IIS, mail server, will look into synology soon). Tool for wake-on-lan my devices. A tool to auto-update the other tools based on a central repository. Various commands to put in a powershell script to send notifications, update my own "dead man snitch" website. Watch new real estate transactions in my neighbourhood on land registry (UK).


Also under the "If you tolerate windows" umbrella, PowerShell.

I've been a die-hard Linux user since the middle of high school, but during some work recently, I was pleasantly surprised by how quickly I could get a basic GUI for a PowerShell script I was writing.


Do you mean building a UI from powershell or some sort of UI wrapper for powershell?


Thousands.

Back in the day we used to clean them up and release them to Freshmeat. Clones of Freshmeat still exist today, but the kids today don't know about it, so nobody uses it, so it's mostly just old apps that are still maintained. But Freshmeat used to be the very first site you'd visit to find open source apps. Sooooo much easier than today where you have to search and search through various sites and still you're only seeing the most popular projects.


I wrote a web tool that automatically syncs all my brokerage transactions from multiple brokerages (either using their APIs or web scraping). It also grabs daily closing prices of my stocks and relevant foreign exchange rates from public sources, and then presents me with a bunch of graphs that I find relevant. It does my capital gains tax calculations every year.

It took me probably 6 months of hacking on it in my free time.


I’m curious: Why did you choose to do this yourself rather than use something like Personal Capital?


Personal Capital isn't available for Canadians.

In fact, there existed no other alternatives at the time (~2017). Especially none that did things like adjusting the cost basis of each security based on the foreign exchange rate on the day of purchase, and tracking gain/loss correctly in Canadian dollars. I also needed it to sync with my work's group RRSP provider which doesn't offer a standard API.

I don't know if this market has improved in the last 5 years, but I have a system I'm happy with now. :)


Thanks for responding!

I have the same issue with having multiple brokerage accounts. I haven’t signed up for Personal Capital because I read that they try to upsell you on wealth management services by phone periodically, plus I am uncomfortable giving my brokerage login credentials to them (or any other third-party service). So I was wondering if you were in the same boat!


Yeah I was definitely uncomfortable about giving brokerage logic credentials to anyone. Some brokerages can give you a read-only API key you can supply to an app, which is nice for systems like this. Maybe see if yours do that?

Wealthica is a Personal Capital competitor. Maybe take a look at them?


I’ll check them out, thanks.


I wrote a fairly large and involved desktop app in Python and PyQt5 to enable me to execute a project I was on where I the functional safety engineer for some fairly serious industrial Burner Management Systems, for a lithium processing plant.

The app enabled me to define the behavior of the BMS system as a state machine represented by a table (using PyQt tableview). It also simulated execution of the code as would be implemented, one scan at a time.

Once there, I added a bunch of tools to print out reports/documentation, run diff against models, extract transition comments where certain tags or similar existed (eg show all transitions with a comment that include "IEC 61511"), version tracking, etc etc etc.

It might sound slightly a trivial problem on first description, but one of the systems had ten burners and it ended up being a hierarchical set of 15 state machines 3 deep and it would have been almost impossible to define the behavior on paper - simulation picked up heaps of minor sequencing issues and allowed us to correct them before actual software was written and tested.

Basically, I ended up with an executable specification (not far off the IEC 61499 dream) that self documented. I could have made it write the core PLC code and export it as XML for import to the PLC programming tool, but it was sort of break even to go that far on SIL 2 systems, so I did not go the full distance on that. At one stage it looked like we might go SIL 3, so this would have been useful in that case.

In the end, I put in maybe 1200 hours to build this, in my spare time. Lots of late nights for well over a year, but I don't think we could have really done the project well without it, or something like it.

I looked at it, and decided to actually commercialize it in the form where I could maybe sell/give it to random punters was whole new level of effort. Plus it seemed to be the sort of software that people go broke trying to sell and support, so I just use it for my own purposes now.


I have written many web applications for my own use, where I do not have to take the extra effort to bulletproofing applications for unintended use (validation and verification requirements etc). Three applications stand out:

1) a web application to manage customer Q-tagged VLAN Ethernet circuits within specific color-coded optical fibers of municipal fiber-to-the-home cables (12, 36, 48 and 96 fiber cables). The application enabled fiber optic physical plant to be optimized for customer Ethernet circuits, reducing the cost of implementing customers considerably below industry average.

2) a double-entry bookkeeping system optimized for the monthly US Bankruptcy Court Chapter 11 financial reporting requirements to manage the same company as debtor-in-possession when our largest customer(s) filed bankruptcy during the dot com bust (circa 2001), forcing us to also file for protection. This enabled us to successfully double our customer base, double our revenue and retire all debt while reorganizing in bankruptcy.

3) a general accounting web application emerged from these experiences specializing in multi-currency accounting of businesses specializing in asset management (features that Quickbooks etc just do not have). This built on my personal situation of being a citizen of more than one country.

All 3 of these were developed using PHP/MySQL and I have refactored them over the decades up to PHP ver 8 / MySQL ver 8 running on the latest Ubuntu LTS server version. As I am the sole user (with a few personal assistants), I have been able to focus on the addition of features and capabilities rather than user support, security and general hardening of the applications.


I wrote Empire for my own enjoyment. Turns out, my friends (and even my not friends) liked it, too.

https://classicempire.com/

Also a disassembler, editor, file dumpers of various formats, directory comparators, accounting aids, audio file declicker, hard disk driver, a program that would image a floppy disk, VT52 emulator, etc.


Like many people of this community I have written multiple scripts and programs for my own use. Recently I was bored with Tinder, so I wrote a small CLI to automate the likes on Tinder. It's totally stupid and just likes everyone, but I found that it's easier to filter out uninteresting candidates afterwards instead of having to swipe manually in the app.

Another recent thing (this one is open source, search for "5hay/notionbackup"): I wanted regular backups of my Notion workspace, so wrote a little program in Go that does that. I'm doing weekly backups and pushing it to my Google Suite with rclone (encrypted).


What did you use for that Tinder script? Is it just based on the web version of it with some scraping?


I wanted to quickly hack together something and was too lazy to reverse engineer their private API. So I settled for their web app and Playwright (cross browser Puppeteer alternative). The auth stuff for their web app is stored in IndexedDB, so for it to work with Playwright you have to replicate the DB inserts.

It's pretty straight forward because Playwright is easy to use and has good documentation. You just need to have some basic CSS skills to find the correct selectors, but it's really not complex (Instagram and other big sites make it a bit harder).

I could run the script in a cronjob, but I decided to just start it manually whenever I want. So I have it connected to a Telegram bot of mine where I can just tell the bot to like the next n people.

I might write a small blog post about it at some point.


Absolutely. Most of the software I've written is for my personal use. I enjoy automating and customizing things on my computer, usually by plugging in my own scripts into the programmable environments. I'm also extremely fond of reinventing the wheel on purpose.

My biggest personal project is a streamlined android app I use to easily track my own job performance and statistics. I can back up my performance claims with real data, negotiate more valuable terms and identify optimization opportunities. It's helped me increase my profits by about 60% and also allowed me to work a lot less hours because I know how much time I need to accomplish each task and can optimize the use of my time accordingly.

I don't feel comfortable publishing things on github without at least polishing them a bit first and I no longer have enough free time or motivation to do it. Sometimes I come across an interesting concept that I just have to implement to convince myself it works and that I'm not insane for thinking it. Usually lose interest after it's proven, finishing it is a lot of work and it just feels pointless.


Like zillions.

I wired up all my house electrical circuits with a TED[1] unit and wrote code to track electrical usage by circuit.

I've written scripts the automate the creation of parts like screws that can be imported into 3D CAD tools.

I've written code that processes processor data sheets to generate include files for the register definitions.

I wrote a simple CMS to manage web pages.

I've got a bunch of programs that are part of some ML experiments for converting text books into knowledge graphs.

I wrote a simple database to manage all the DVD/Blurays I have so I can know quickly at a yard sale if the movie is one I don't have.

I wrote a 3D graphics package that would talk to the 3DFx libraries for their VooDoo graphics accelerators.

I wrote a filter designer that would optimize RF filters based on standard available parts and a minimum of winding my own coils.

Libraries for STM32 chips so that I could easily go from idea to something I could test.

The list does go on, but you have to understand that before I ever wrote code "for money" I wrote it for fun, learning, and exploration.

[1] https://www.theenergydetective.com/


> I've written scripts the automate the creation of parts like screws that can be imported into 3D CAD tools.

Cool!

I found a really cool plugin for Inkscape that computes gear parameters (I have access to both laser- and water-jet cutters). That kind of stuff is really useful for non-machinists like myself.

> Libraries for STM32 chips so that I could easily go from idea to something I could test.

I discovered CubeMX about, gosh, at least 10 years ago, and it changed my life. I went from Arduino to STM32 and suddenly i have all kinds of peripherals. Their stuff is awesome.


Yes - I wrote a full DVD authoring workflow to take weekly anime fansubs and produce finished DVDs for friends with either bad internet connections or who preferred to watch in their living rooms.

This was before having an HTPC or media center was a mainstream idea.

All you did was add in the video files sorted by file name in a subdirectory and add a main menu image template, a main menu audio file, and episode select image template (the layouts were static so that the same dvdauthor XML could be used) and it would stitch together a DVD with an intro video, main menu screen with subtitle, play, and episode select options, and generate episode select screens by taking thumbnails from the video files.

Last time I used it was about five years ago before same day/date streaming of anime really took off. I still hack on it from time to time. I don't really have a use for the output, but it's nice to maintain it as the tools it use change/update and as I learn new things.


Hundreds. Look, computers are tool builders and tools hosts, so when you need a tool you build it, if an adequate solution is not already available.

And tools can be anything: organizers, information accessors, information processors, learning aids...

As already mentioned, months ago I had to build a full word processor for Android. I just needed it and what was available was faulty. Worth mentioning because I had to laugh in front of the odd situation of having to build a Word Processor from scratch in 2021 - but there you go, you may need anything.


Most recent program: I wanted time-lapse photos of some potted plants I'm trying to grow. So I stuck QR codes on the pots and take a picture of each one each day with my phone. That goes to Google Photos, and a cron job scans new photos, recognizes the QR code, and copies the photos into directories for each plant with filenames that sort chronologically. Most of the plants died. I am a better programmer than gardener.

Most used program: I keep a journal of practical daily happenings in Emacs org-mode, organized hierarchically by year/month/day. It was too much hassle to add new entries (I'm lazy), so now I have a utility that inserts journal entries in the correct place from the command line, e.g., "add-journal 'talked with roofers to get estimate'". It's turned into an ad-hoc database for recording things like my weight, also, which gets parsed and turned into a graph.


> It was too much hassle to add new entries (I'm lazy), so now I have a utility that inserts journal entries in the correct place from the command line

Wouldn't it be easier to just use org-mode's capture functionality (https://orgmode.org/manual/Capture.html)? I.e.

  (setq org-capture-templates
        '(("j" "Journal" (file+olp+datetree "~/journal.org") "* %?")) ;Add more templates as needed

  (global-set-key (kbd "C-c c") #'org-capture)
Then `C-c c j` will prompt for a new entry, `C-c C-c` to save it. The `file+olp+datetree` will automatically put them in a year/month/day hierarchy.


Tons and tons of them over the years. I wish I'd kept better track of them because I've caught myself reinventing the wheel now and again.

- When I was a kid using a DOS PC I'd write them in Microsoft QuickBASIC or Turbo Pascal and compile them to EXEs. (I used to drag a few particularly useful ones around with me until a few years ago when the prevalence of 64-bit Windows made running them on a stock Windows machine impossible.) I had stuff there like a random password generator, dumping files to VGA mode 13h (to visually look for patterns in data), drop the DTR on a serial port (to hang up a modem from the command line), search/replace on INI files, and lots of others I've forgotten.

- I wrote a proto-Markdown text processor back in high school when I was taking notes on a vTech Laser PC4[0]. It took files from the vTech and rendered output files with Epson printer formatting codes, centered text, made headings, etc.

- I regularly use a script I wrote to import my phone backups' SMS logs and dump them into my IMAP mailbox. I love being able to search all my email and SMS communication in the same interface.

- I have a podcatcher I wrote bolted onto my (heavily forked) tt-rss[1] installation to download podcasts to a local webserver for archiving and playing.

- My father persists in using a DOS accounting package for his business. A small program I wrote ingests check printing output from the DOS app (meant for dot matrix tractor-fed checks) and reformats it for sheet-fed checks in a laser printer.

- Front-end scripts for lots of command line utilities so that I don't have to remember obscure options for common tasks.

[0] https://oldcomputermuseum.com/laser_pc4.html

[1] https://tt-rss.org/


I made a headless sqlite dbms (not nearly as feature rich as the real thing) for my own embedded development. It can show the values of any table, view specific cells, update cells with a text editor interface, beautifies json, and takes in SQL queries as well.

Got some bugs with formatting complex lines of text, but it works well enough for me. I plan on porting to Rust one of these days.

https://github.com/mathaou/termdbms


My main group of friends with whom I play videogames on a daily basis is on Telegram. We use voicechat and stream our gameplay on discord for others to watch/comment in a more private setting (other tools are too public). I wrote a bot that notifies on the telegram group whenever someone starts a stream on discord so others jump in and join the game/stream. Discord shares which game/activity through their API so we know exactly what someone is playing. I also add some personalized randomized spice depending on who is streaming and what they are playing to the telegram bot messages so we can laugh about it.

Whenever the bot has gone down (I turned off the home server or whatever) my friends complain, so I know the bot is fulfilling its purpose :)


One thing I do (and am curious if anyone else does anything like this) is I dynamically generate PDFs, generally to print out planning sheets and stuff. I like using templated printouts for planning my day/week, because I can scribble over them and break out of the predefined structure when necessary. But I also like digital calendar-type tools for their extra powers - they can pull in weather forecast data, events from shared work calendars, stuff like that. So I have a script that dynamically generates a day-planning PDF in my preferred tabular format, augmented with info from digital sources, before sending it to my printer. It's the best of both worlds.


Market Alerter - I created an app that alerts\emails you if your chosen stock meets some condition. There are many other sites that already do this. However, I wanted it to be able to expressions of one or more stocks. For example, if you want to monitor West Texas Intermediate (WTI) crude price or Brent crude price, you can do it easily. If you want to monitor the crack spread (WTI - Brent), existing solutions are limited. I made this to allow monitoring of combinations of stocks\commodities.

Options Simulator - An extended family member asked me to create a small simulator to help forecast the outcome when making options trades.


That's neat! Did you use paid APIs or free yahoo ones? Are you sharing code?


I don't know that I'd consider most of them "programs", but I've written hundreds of small helper scripts of various sorts over the years. Most of them aren't even published anywhere, not out of a desire to keep them from the light, but more because I write them, use them, and forget about them until they are rediscovered years (decades?) later.

One of the simpler scripts I wrote that I actually published is a little helper to output WiFi signal strength on Macs into printable glyphs so that you can include it in your prompts on the terminal.


I'm a scientific programmer so almost all my software is for my own personal use.

I'm just kidding, I'm assuming these are not for fun projects (because in that case, idk dozens to idk how many at this point) but general programs for my use as utilities beyond just the fun for programming, and I'm guessing scripts don't count, well once upon a time I made a notes app but that has fallen into disuse unfortunately.

Looking at the comment section, uh, scripts that are just wrappers for various tools (rsync, ffmpeg, others) are a dime-a-dozen I guess, I have so many in my ~/bin directory that I've forgotten what some of them do at this point.

Oh yeah, once upon a time I made a background changing app that just changes my desktop background based on the time so I would have backgrounds that matched the time of day, I did it in CL just because I loved learning CL but I have no real reason to use it in my work. I was going to make it automatically change the timestops based on the season, so evening photos etc change as the length of day changes, and make it based on the sunrise equation[0], but I sort of dropped it a few years ago and haven't really touched it since. You know I might do that again, just for an excuse to learn Lisp again.

[0] https://en.wikipedia.org/wiki/Sunrise_equation


I wrote a set of python scripts to pull down economic and stock market data. It pulls down several different data sets mostly from the Fred API service at the Federal Reserve. Using Jinja templates and Matplotlib for graphs, it builds a set of latex files and spits out a PDF that I can review. That way I don't have to look at 4 or 5 different sites to get the overall market picture I want. Essentially my own newsletter... to myself... okay, is that healthy?


it is healthy! i did something similar with https://econicles.com


I have GoPros on my bike and often when I arrive to work/home I forget to turn them off and the batteries die, so I wrote an app so I can shout across the room, "Hey Siri, stop all cameras".

I don't use it anymore myself and got a bug report last week. It's a couple of years since I've written any Swift at all, so I'm not mad keen on working on it, and I feel a bit bad that I have published it and it's not working. I never put the code on GitHub because the reverse engineering of the Bluetooth was somewhat incorrectly documented in the code and I didn't want to share bad information. Now GoPro have an SDK I could use.

Similarly, I wrote a Siri Shortcut for checking where the nearest Jump (bikeshare) bike is (Python on AWS Lambda). Then Uber sold Jump to Lime and there is no API access for me anymore (Sacramento).

https://www.youtube.com/watch?v=0RzahKxUYqc

https://apps.apple.com/ie/app/stoppro/id1453312416

https://gopro.github.io/OpenGoPro/demos/python/sdk_wireless_...

https://github.com/BrianHenryIE/Bikeshare-Siri-Shortcuts


Yes. Typely [1]. Made it to aid in writing better articles for myself and some employees at the time. Decided to put it up there after a while and is now being used in many schools around the world. This is the only one that was made for me initially - I have a lot of other projects but they are made for aiding my businesses or to try new ideas.

[1] https://typely.com


I spent a week or two creating a trading tool for the popular video game EVE Online. The tool identifies regional arbitrage opportunities between large market hubs and allows me to prioritise the movement of goods to maximise profit while minimising time investment. It also helps me update orders efficiently.

As it provides a decent competitive advantage I have no plans to publicise it, although it is on Github as a portfolio piece.


I've written a quick and dirty Django app to organize computer history literature (papers, manuals, books, etc). Every document includes an embedded pdf and is tagged with authors, institutions, and topics. It supports cross-references between documents. I also added a feature to mark a document as read and when it was read.

It has helped me wrap my head around certain areas of computing without getting lost in a pile of pdfs.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: