I own the house I currently live in because of a script I wrote.
We had been looking for a new build for some time and had settled on a development and specific house we wanted to buy, but it was still months away from being released. We were told they released houses in person first, then listed them online later that day, but I was bored and wanted to see when new houses were listed, so I wrote a scraper to alert me whenever a new house became available.
One day, we got a call from the property developer telling us the house we were interested in would be available in person from 10am the next day. Because we wanted to be certain to get it, we appeared at 8am, only to find that 3 other people were already waiting. Houses are released in batches of 2 or 3, so whilst we weren't hopeful, we joined the queue and waited.
At 9am, while waiting in line, I got an alert telling me that the house had been released online, so I open their website on my phone and paid the deposit.
At 10am, when the sales office opened, all hell broke loose as the person first in line (waiting since 5am...) discovered the house they wanted had already been reserved online. I'd effectively stolen his house. It was awkward to say the least as all of us were crammed into a tiny portacabin while this unfolded.
In truth, I felt awful for depriving him of the house he and his family wanted, but relieved that we had reserved the house we wanted after a 5 month wait. A few weeks later the developer got in touch to say that they had changed their policy nationwide and would only be releasing houses online in the future because of "the incident"...
Whilst I wasn't willing to give up our reservation, I worked with the person who had wanted our house so that they were alerted whenever a similar house in the same development became available. He got one, there's no hard feelings, and him and his family are now my next door neighbours.
I appreciate you bringing this up, because I think this plays out all the time. I live in a small isolated town, and there wasn't a lot of turnover in houses even before the pandemic. I wrote a short script that scrapes all the listings, and alerts me to any new local listing. It was a fun little project to learn about generating text messages, and to see how effective a cron job on a sleeping MacBook can be. We ended up getting a house through a friend who sold their home without listing it, but those alerts were really helpful, and almost got us one house a little earlier.
The bigger story here is what this means for the divide between tech-literate people and the rest of the population. I don't think the parent commenter was wrong to write their script, and I don't think I was wrong to write mine, and if you wrote something similar I think it was a reasonable move as well. But we have to recognize the advantage this gives us, as people who are able to spot these opportunities and act on them.
I don't have any answers, but I think this story brings up a good discussion. I'm curious to hear other people's thoughts on this.
I think the answer here is to have a system that can't be "gamed" by more tech-literate people. Have a time period where people can throw in their names for consideration, and a randomly-ordered list is generated. You go down the list until you reach a person who can put down the deposit. A lottery, essentially.
You could probably poke holes in that system I just described, but it seems more fair than one that is prone to someone writing up a script to scoop it up. I don't want to live in a world of script wars where every desirable entity is quickly snatched by one of several competing computer programs.
I’m hard pressed to think of any first-come, first-served system for allocating scarce goods that wouldn’t be better run as a lottery.
The problem is that typically the person selling the item doesn’t care who gets it, so there’s literally zero incentive to spend any effort making a fairer distribution system.
I didn’t mean to imply that lottery was the best system in all cases, just that it’s pretty much always better than first one wins. Though thinking about it more a lottery probably results in more total entries, and you might end up giving the thing to someone who is closer to ambivalent than the folks willing to stand in line at 5AM.
Auctions are a great way to see that the item ends up in the hands of the person who “values” it most, where value is measured in currency. It does have the problem that in a system of high inequality the people at the bottom have essentially zero chance of winning.
> I think the answer here is to have a system that can't be "gamed" by more tech-literate people
The person selling the house wants to see offers as soon as possible and can accept one at any time--the sooner the better--or hold out for a better one if they're not satisfied. Any system that changes that dynamic to the seller's detriment is not "more fair" to the seller.
we expect that an auto mechanic gets a good deal getting his own car fixed, that real estate brokers have an edge getting their own properties, doctors with medical care, etc.
You spent years becoming tech savvy to save you a little time scanning real estate ads... I'm not sure what problem you're trying to fix?
> Have a time period where people can throw in their names for consideration, and a randomly-ordered list is generated. You go down the list until you reach a person who can put down the deposit. A lottery, essentially.
Stocks should be traded this way, too. Having an arms race for fiber latency makes a mockery of the idea that they are for efficient allocation of capital. Queue up all the trades requested in each second/minute, then execute them in random order.
> The bigger story here is what this means for the divide between tech-literate people and the rest of the population.
Where I live the good deals from private sellers (mostly older people) pretty much never get posted online, thus you would have to socially integrate somehow offline in the region you would like to buy a house :). It looks like I still have to wait for some cultural development to benefit from your proposed divide.
Especially in smaller markets, there aren't very many agents. You can get a lot out of inviting realtors to coffee from time to time. When somebody is thinking about selling, they often talk to realtors early on, so you can learn about them before they hit the MLS.
Regarding tech literacy, I participated in a project in early 2021 for this reason.
COVID vaccination slots were put online and would disappear the second they went up. Vulnerable people, like the elderly, had trouble booking the appointments they needed.
What ended up happening is a few developers got together and put together an alert system that scraped for appointment slots and automated alerts about when they were available publicly on social media. Quite a few people were able to get slots they wouldn't have got by just manually trying to get a slot.
>> Quite a few people were able to get slots they wouldn't have got by just manually trying to get a slot.
And the people who played fair didn't get those slots. Obviously there's nothing illegal about this (or the articles similar solution) but it rubs me the wrong way morally. Similar to people getting appointments because they knew someone working in a vaccine centre. If there is a clear order and booking system (e.g. oldest + most vulnerable to youngest/national booking system) and you skip the line or 'hack' the system to give yourself a better chance at getting a slot I'd find it hard not to think you're a dick. NB: this depends a lot on how things work in your specific country so I'm not judging your specific situation but just generally, 'hacking' systems to give yourself an unfair chance at getting something in high demand feels wrong to me.
I had a feeling his script somehow made him skip the queue.
When I was looking for a new apartment one of my friends told me about his startup that was basically scraping databases of realestate companies and I signed up with them and to my surprise I was alerted for an apartment in the location I wanted and it was up just a few minutes so I was able to contact the agent before they even started their advertisements.
I got the apartment but sadly the startup was bought and shut down operations soon aferwards
I had a similar experience, though not with a house. My sons school was organizing a couple of sport activities. We could sign him up for the different activities, but it was first come first serve. We were early, so our son ended up doing all the activities. This meant some kids ended up getting nothing.
I found this very unfair. Better would have been to let all the kids list there preferences and then fairly distribute the kids over the activities. However, I could see why the school wouldn't want to bother with this.
I ended up creating a tool (1) for them to do this easily. It's quite ugly, but it's open source (2) and it works. The tool is in dutch because it's a dutch school.
A similar story happened to me in the past with appointment slots at an embassy, and - shameless plug, I built a tool[0] to monitor websites on my behalf, and send custom alerts to Telegram, Discord, Slack, or archive data in Airtable, Sheets etc. No coding or devops is required, you can get it done in 2 min [1].
We're in Beta so stability is still a goal we're pursuing, but for many happy paths Monitoro is a huge timesaver.
I did basically exactly this but for reserving a spot at the visa centre for a residence permit appointment.
Subverting a small aspect of the Hostile Environment[1] took a little bit of the edge of the general bastardry of the whole process. Still a bloody expensive and emotionally draining experience though: if it has to be done again, I won't be putting a loved one though that again and we'll both be leaving.
>I own the house I currently live in because of a script I wrote.
Somewhat similar story for me. I live in a big European city where young people/students predominantly live in flatshares. One website which pretty much has a monopoly on room ads here also allows room seekers to post an inquiry themselves. So many people do it that after less than half an hour, your ad will already be somewhere at the end of page 2. I wrote a script to automatically update my ad every few minutes to push it back to the top. I ended up getting a lot of responses I probably wouldn't have gotten otherwise.
I think there are a large percentage of programmers at Swedish national soccer games, as they release tickets online at a first come, first served basis. (At least 10 years ago) This is also true for fancy restaurant bookings.
I have similar stories for launch day Nvidia cards, concert tickets, festival tickets, and original artwork from creators on Etsy. Any time I catch myself wasting time refreshing a page for availability, I try to replace myself with a script.
One of the things that always frustrates me (despite being very much in the "first world problems" category) is when queueing or reservation systems are unclear or chaotic or otherwise unfair, although I generally only encounter this at stores, never for something as significant as a house! The most ubiquitous one is the practice of totally separate parallel queues where you just have to guess which queue will be fastest. Another lovely related one is when you're waiting in your queue for quite some time, then a new queue opens up right next to you and quickly fills up with newcomers who haven't been waiting at all! Come on store owners, just have a single queue with multiple consumers popping off the same queue! Again, I'm not going to pretend this isn't totally a first world problem!
Berlin's international film festival has this horrendous system where they'll release a small batch of tickets online every morning on certain dates, and you just have to sit there, refresh refresh and hope you clicked fast enough.
Serious major events use a lottery system, which is vastly more fair and means you don't need the server infrastructure to deal with this huge flood of requests. I'm not really sure why everything doesn't work like that: let people submit their requests/applications/whatever, and if you truly have zero other criteria, just process them in random order after a cutoff.
Camping reservations for Ontario Parks are a big mess like this— so much so that people do ridiculous hacks like booking the full two weeks that lead into their desired weekend and later paying a fee to cancel just the first part of it. By the time the actual popular weekend would have come available for online booking, it was already taken weeks earlier.
Wow, thank you for explaining this!! I was wondering how weekends that were "not yet available for online booking" were already nearly fully booked when I looked on the booking site. Very irritating that people do this... With that out of the way, I'll go ahead and start doing this myself, if that's the price of admission
It's definitely a prisoner's dilemma type of situation— no one wants it to be like that, but once there's a critical mass of people doing it, then you kind of have to. Once everyone does, you're back to square one, except with a system based on unwritten rules that are confusing and exclude the uninitiated.
And it's not obvious how to fix it in a way that doesn't screw up the system for someone else:
- exorbitant cancellation fees would punish people whose plans change, and a lot of people would just swallow the extra cost anyway.
- insisting that the entire timeframe be in scope at time of booking would make it hard or impossible to book longer vacations at popular spots (which at this point is basically anything within 4h of Toronto).
- making the whole season available at once would create an ultra high stakes feeding frenzy, with the servers probably ending up crashing.
- some kind of bidding or lottery setup would be extra complexity, and would end up rewarding people with the time, money, and schedule flexibility to "play" whatever the system is.
I suppose the Ontario Parks mandate is to just maximize utilization, so from their point of view it doesn't really matter as long as weekends are booked solid and at least some proportion of the canceled midweek days end up being scooped up later by retirees or whoever.
I wrote a script to poll the Parks Canada reservation system for availability for a camping trip I wanted to do, so that I'd get notified the instant someone cancelled and space became available.
Sadly after two weeks they banned my IP for the rest of the year and I was no longer able to make reservations without going through a proxy.
A friend and I made a website based around this called campalert.live
We've had to stop doing BC and National Parks as the API changed and we haven't had time to update our end. But Alberta still works!
Something went wrong here. The price of the house should have been raised until only 1 person wanted to buy it. If you're first in line, the incentive is to sell it at a higher price to the person who's second in line, right?
I have to imagine some sort of regulatory thing was going on here, like they have to provide X% of units at Y% of market rate in order to get some tax concession or something.
I know there's not going to be a lot of sympathy for higher housing prices here, but it does feel like something went wrong in this specific case.
In a big development I imagine clearing inventory in a straightforward way at prices that'll net you a good profit margin anyway is more appealing than trying to run bidding wars for each unit individually. Depending on the market it's also possible that the gap between "price four people are willing to pay" and "price nobody is willing to pay" isn't very significant.
There's also a goodwill aspect in other cases: Sony kept selling PS5s at MSRP even when scalpers were getting $800+, because better for them that people are pissed at the scalpers than dealing with the bad PR of such a huge price hike over previous generations.
Yeah, for established brands like Sony who expect to have long recurring relationships with customers, it wouldn't make sense to run auctions on products because you're just going to upset people and no one will think you're making mass-market products any more. The same goes for some popular musicians: they could make more at a particular show by auctioning off tickets, but they often go out of their way to have a lottery and prevent people from re-selling tickets at higher prices.
It seems possible that a large housing developer has similar incentives.
Another variation I have been on both sides of: stores favoring certain channels over others. For example, a local fast-food restaurant might prioritize answering the phone for carry-out orders over in-person carry out orders.
I definitely appreciate a single queue. It doesn’t seem to be the norm though.
If it’s a place you frequent, pay close attention. The checker is usually a stronger indicator of line speed than the number of items in peoples’ baskets.
Whole Foods near me does this awful thing where the lines are in the aisles. You can’t even see how long the line is without walking the entire length of the store.
This was tried in a number of stores in Sweden. It lasted a couple of months after which they reverted to one queue per cashier. Turns out it wasn’t popular, either with the vendor, the customers, or both.
On a personal note I found the practice irritating for not really clear reasons. One might be that it’s a chore to traverse the whole queue cordoning when it happens to be empty. In any case, over time being the one skipping the line when a new register opens averages out. Also, there’s the lucky draw feeling when you get to skip that otherwise gets lost.
A number of stores here in Kitchener (Canada) use the single queue approach, particularly to feed a bank of self checkout stations. But I've also seen it at Old Navy (clothing), Winners (discount clothing), Indigo (bookstore), and others.
I think the main thing that's maybe a bit annoying is just that it's easy for the single line to stall if the people at the front of it aren't paying attention or don't know what to look for. So the store often ends up having to have an extra attendant who just stands there and pokes people for when a till comes available.
Is a jealousy issue? Without the second line you were going to take as long as you were. Opening a second line helped people further back catch up and in some cases surpass your speed. Someone else having a quicker experience shouldn't have changed your experience.
I wouldn’t call it jealousy to want everyone to be served in the order they arrived, since that’s obviously the intention of flat unprioritized queues. You can certainly make arguments that FIFO isn’t the best or right way to process a grocery store checkout queue, but for now I’d rather it be implemented well rather than poorly.
maybe it's more of a fairness issue. in theory, the proper way should be to have a single line that funnels to any available lane, so any newcomer would still have to join the same line and not get any advantage over someone who has been waiting.
Wouldn't it average out over time anyway? I.e. sometimes you're unlucky and have to wait twice as long as if you'd arrived to the queue a bit later, sometimes you're lucky and have your wait time cut in half. Over many store trips it's halfway between the one-queue and two-queue processing time.
lol don't feel bad; you took advantage of a broken system and automated your way through it. The first person in line would've done the same if they knew how!
Did the same for my previous apartment. I wrote a script scraping various “self-sale” sites (sales without real estate agents), the script would notify me when new apartments living up to my criteria was posted online.
When I got such a notification I would quickly check photos of the place etc. and then call the seller. The guy selling the place I ended buying, said it felt like I called him up instantly after he posted it online.
I did the same with the apartment I currently live in. Although it's a rental, places here are taken within minutes of being posted online, and my bot gave me the edge to put in a reservation before anyone else was
I did, yes. I set it up with some specific conditions that sent him an alert whenever a house similar to ours became available. In the end, he got the house directly next to ours and very similar in design.
Reminds me of "Project Thor" from my university days. Course registrations were online, but in phases, e.g. Seniors for a week, then Juniors for a week, and so down the line.
However, many students would snag a spot in a course only to drop it as they shuffled courses around. There existed a "queue" for the overflow, but it appeared to work as a CRON job or otherwise involved a human in the loop as one would routinely see:
Spanish 102 (Registered: (29/30), Queued:(60))
While in this state, one could simply click on the course and register, completely bypassing this poorly designed queue. So, naturally, I wrote a script to scrape the site on once a minute (hammering it, and so Project Thor) and alert me once a slot had opened up. Eventually provided this service to my friends as well.
My university actually had a bidding system. You would start the year with 10,000 points, and you could bid any number on electives. So you could spend a lot of points on one particular popular elective, and be guaranteed to get it, but then you would not be able to bid as high on other electives for the rest of the year.
The system was pretty smart, except for the part that you could bid negative amount of points on an elective that wasn't particularly popular and increase your total. That was a pretty major flaw.
[edit: I should say that I didn't use my extra points for anything. I wasn't particularly interested in the popular electives anyway. I did make sure to end the year with 10,001 points, hoping they would fix the bug, but I don't think they did.]
I did something similar at UIUC very many years ago.
I was called to the office of head of Department of Computer Science and kindly told while he thinks it is cool that I am applying my skills relevant to my field of study, I should stop what I am doing as even simply scraping could be construed malicious if it got the attention of the wrong people in the school.
My university had a queuing system used for presenting assignments. You could always access the page, but the queue wasn't open unless the TAs were there ready to take assignments. When the queue opened it would send a websocket message, so I made a browser extension that connected and waited for the queue open message and then immediately entered the queue. The effect wasn't huge (even in larger classes you would only have to wait 20-30 minutes even if you entered late) but it was nice to be able to sit back and not worry about getting a good spot.
I've got something similar for appointments at citizens' bureaus in some European cities. The waiting time is usually around a month, which is insane imo.
My script constantly looks for open/canceled spots and reserves them (some need email/phone confirmation, which makes it a bit harder). Pretty standard stuff.
That's how I got my appointment in 3 days instead of a month.
So, I'm thinking of making money from this, but I'm not sure about the legality of it all.
Not OP, but sounds like the places in Germany where you go to get or extend your passport, register after moving to a new place etc.
Notoriously hard to get a timely appointment for things that should not require an in person interaction in the first place.
As konha said, it's the government offices, providing services for registration, driver's licence, taxes, etc. It works the same way in several EU countries.
Sometimes you can just show up (and wait in a queue) but most often you make an appointment beforehand. In many states/cities, the waiting times are weeks and months long (even in my home city everything's booked a month ahead and you can see the big queues if you go in person).
People can indeed just refresh the page themselves and hope a spot opens up, but that's pretty annoying.
Wrote a TI-83 program (TI Basic) for a geometry course in high school. About a month prior to the feared final exam, I combed through all of our coursework to catalogue all of the calculations needed then wrote a program that would solve for any query (length of side, angles, etc.) based on the shape and input data.
I read the operators guide to the device cover-to-cover and found a way to store the program such that the teacher's method of "clearing" the device would not remove my program.
On the day of the test I realized I had accidentally taught myself geometry, as I didn't need the calculator at all and could do the calculations in my head. I did, however, use the TI-83 to verify my answers before handing in the test. According to my teacher I not only had a perfect score but did so in record time, and suspiciously so did my two best friends.
Nothing ever came of it, but I enjoy the fact that I accidentally learned a course to such proficiency by trying to cheat.
While in my Algebra II class, we were studying polynomial expansion, and I wrote a program on my TI-85 that would not only expand things like (2x^2 + x + 3)^4, but it would show the work. I literally just had to enter a couple values and then verbatim copy what it spit out onto the paper.
I asked the teacher if I could use it on the test, and she was like "If you can write a program that doesn't just solve it, but shows the work, then obviously you know the material incredibly well, so there's no need to make the test tedious. Go for it, just don't share the program with any of your friend."
The last bit was easy because I didn't have any friends. :-(
You might find it funny that a scaled-up version of this was the plot of a 1958 children's book, Danny Dunn and the Homework Machine. (Except the teacher figures it out and starts assigning the kids using the computer more advanced work that they have program the computer to perform.)
I actually got into programming on my graphing calculator in high school in the early 2000s. Most of our tests from algebra up thru calculus were simply "apply the correct formula to the problem". I would simply program the calculator with the formulas, use it to calculate the answers and then work backwards to "show my work". I got 100% on every test for 4 years. I'm still not sure whether I feel guilty or not.
I think this is every teacher's goal with tests where you can bring "one sheet of handwritten A4 paper" along as a cheat sheet.
The smartass students who don't want to study find ways to cram an incredible amount of information onto these sheets... and through this they end up actually learning much more than if the cheat sheet wasn't an option.
After years of similar work, mine culminated in a Link Cable Chat Program that I wrote on two calculators at the start of a big multi-hour test.
We didn't use it to cheat -- literally just to chat.
Similarly, we'd been writing programs to solve our problems all year so we already knew all the formulas (because we'd been re-entering the programs as needed on fresh calculators).
The teacher knew, which is why I think she allowed it.
In calculus I wrote a program that solved the last problem of the exam, during the exam. I wrote down the source code in the exam by hand. I got an A but the teacher wrote a letter to my parents saying he was concerned about my reliance on programming.
One I did when I was much younger was after a trip to a Cracker Barrel restaurant. They have these golf tee peg games (triangle shaped board with holes and golf tees inserted). There are rules for doing jumps and removing pegs, with the goal of getting down to 1 peg remaining.
So I went home, fired up basica on my PCjr, and wrote a brute-force solver for it. Turns out there something like tens of thousands of possible solutions.
Then it became a challenge, to filter out duplicates (each solution appears 3 times if you apply it to the board with each 120 degree rotation, plus you have mirrors of these, etc). Was an amazing feeling for a youngster getting into computers.
I did the same thing (only under Linux, not MS-DOS). I also found out that leaving 8 pegs is way harder than just 1 peg (2 ways, excluding reflections and rotations). And for 10 pegs, only 1 way.
Edit: Update number of ways to leave 8 pegs, and added number of ways to leave 10 pegs left.
Back in the days of Windows 3.0 / 3.1, a friend and I hung out in the computer labs with faaar too much time on our hands... We figured out how to beat all four levels of Windows "Reversi" (Othello) 64-0.
I wrote a program to distribute my lecture slides to my students in real time.
When I was a University Professor, I taught Theory of Computing (among other classes). I did not want to maintain two sets of slides (fill-in-the-blank style), and I didn't want the students to have to write non-stop during the lecture, so I wrote a couple of programs to distribute the slides in real time during the lecture.
Part 1: C++. A program ran on my computer. When I pressed a button, it took a screen shot of my chosen monitor and sent it to my server. Communication via websockets.
Part 2: Browser. Students connected to my server at the start of class. As I lectured, the slides appeared in their browser automatically. Of course, they could click through all previous slides (for that day as well as previous lectures), but if they were not actively browsing the slides, then the newest slide presented itself to them automatically. (Technically, it was always one slide behind, because I would not release a slide until I was done talking about it.) Communication via websockets. It worked in lectures attended by 100+ students.
Part 3: NodeJS. My server received screenshots from me (as well as some metadata), kept a small database of all past lectures/screenshots, and served a browsable interface to the students. It routed all the websocket connections so that everything "just worked"TM.
I thought it was cool. The students complained that the slides were not searchable like a PDF. I directed them to the index of the textbook.
Blanks in the slides are filled during the lecture with the students. With this solution, students don't have to copy the notes while trying to listen.
I used Google Slides, and didn't use annotations. The reason that I didn't wait until after the lecture is that, when covering technical- or notation-dense topics, especially if the information is new, students often need to look back during the lecture to remind themselves "What does this mean again?", either that, or ask the question out loud, which a lot of students are shy about.
In short, the students needed to be able to review the slides during the lecture, so I couldn't wait until the end. My only options were then to distribute slides ahead of time, fill-in-the-blank style, or create a live delivery system. Honestly, the live delivery system was easier and cooler.
It was Theory of Computing class, not Biology or Math, if I'd been his student I would've been mightily impressed. I mean every English teacher can fill out and email PDFs but this was actually real time applied computing.
The place I wanted to get a puppy from said that they didn't take reservations for the upcoming puppies until they were born. The only way to know when they were born was to check their website and then give them a call.
So the tiny program I wrote kept checking a webpage and whenever it changed content, it would sende a text message "PUPPY ALERT!".
A few hours after I deployed the program, I got message so I thought it had a bug, but no, the puppies had just been born <3
For anybody considering getting a dog - please consider adopting rather than buying.
• You’re Saving A Life
Adopting a dog from a shelter not only means that you’re giving him a happy life, but you also free up a spot at the rescue or shelter to save another dog’s life.
• Helps Fight Puppy Mills
Approximately 90% of puppies you can buy in pet stores or online are from puppy mills. Adopting a dog from a shelter takes business away from mills. The more people who adopt, the more puppy mills have a hard time staying in business.
Except every dog adoption place around here has requirements like "Must be an experienced dog owner, have a 5 acre yard, own your home, and be able to do 50 push-ups without getting out of breath. Expert sword-swallowers preferred."
Ok, so the above recommendation doesn't work for you, just ignore it then.
What you are saying doesn't apply everywhere, and I doubt it applies in most places around the world, since shelters usually have way too many dogs and would love to be able to find anyone to care for them before they have to effectively execute them.
Also, if you care about the environment, don't have children. And, really, best to off yourself as well. Might want to take down a few less enlightened folks with you when you go.
What an odd response. Did the prior post upset you in some way? Not having dogs and children are both reasonable and moral responses to the climate crisis. Suicide and murder are not.
There is a perspective I see sometimes where some people have elevated environmentalism so high in their value system relative to all else that they end up in a moral position where consuming any resources at all which all living things do is somehow morally unconscionable.
Reasonable environmentalists think humans have as much right to exist and seek joy as any other living being as long as it's done in a sustainable way. We just want people to, you know, maybe walk to work instead of driving sometimes. Don't litter. Push your government to pass laws against pollution.
There are lobbyists and well-funded organizations pushing against any progress on the environment and the existence of extreme views like "you're a horrible person if you —checks notes—have a fucking dog" makes it too easy for those groups to paint all environmentalists as out of touch kooks. That's the last thing we need.
The parent comment described pet ownership as "is among the biggest environmental stupidity I can think of". Call me crazy, but a couple of meaty snacks for Fido is pretty far down the list after, I don't know, carbon emissions, greenhouse gases, coral bleaching, acid rain, deforestation, fuel oil, fracking, chemical dumping, nuclear weapons, water table draining, etc.
> Reasonable environmentalists think humans have as much right to exist
There is a right to exist, but not a right to be created. Saying someone should kill themselves and kill some other along the way, is just not acceptable in a normal discussion.
> Call me crazy, but a couple of meaty snacks for Fido is pretty far down the list after
Those meaty snacks make 20% of worldwide meat-consumption. As a country, pets would be the 60th biggest CO2-emitter in the world. Just because there are bigger culprits, doesn't mean that the smaller ones are excused. Moving pets to more friendly foods would have a huge impact on the world.
> There is a right to exist, but not a right to be created.
But the top-level post is advocating adopting shelter animals and the reply was that keeping pets is bad for the environment. Those shelter animals already exist and if they aren't adopted, they will likely be killed. It's the same thing modulo different species.
Why are they not ? This is more of an ethical dilemma. I agree with @ munificient. I could probably list a lot of things that do a lot of bad for the environment.
But making everything hyper-efficient and reducing on EVERYTHING we almost possibly do just takes away our basic freedoms. I'm not saying you're wrong about not having dogs. I have one myself but yeah, you're right. It's like having a child. But I like being able to choose having it or not.
> The idea that we grow food to feed cattle or fish to feed pets is among the biggest environmental stupidity I can think of.
The meats that dogs and cats eat are essentially the waste products from meat production aimed at human consumption. You can certainly find some exceptions (especially on Instragram), but the vast, vast majority of people, even those feeding raw diets to their pets, use either meat not meant for human consumption or offal that most Americans don't consume.
The choice is: "Not rescuing a dog from the pound" vs what? ..."leaving them there to wait a few more weeks/months in a cage before being put to sleep"?
Nah. Have you ever bonded with a dog? Nah. I'll take dogs over people any day.
I'm all for closing puppy mills/farms, neutering etc but I draw the line at "don't rescue a dog that already exists"
Even premium dog kibble is made out of the lowest quality junk meat left over from what people eat. I too am a vegetarian (and I don't have kids, and have never owned a car and gave up flying years ago). But I do not begrudge my two hounds their bag of kibble. I'm fact I'd be willing to bet that my household CO² footprint is lower than yours, even with my two greyhounds.
> The idea that we grow food to feed cattle or fish to feed pets is among the biggest environmental stupidity I can think of.
That is the wildest exaggeration I can think of.
I’m also vegetarian, though I am because I’d rather not kill things when I don’t need to. The environmental benefit is an appreciable side effect, and confirms to me I’ve made the right choice for myself. I like to try to share my views with as many people as I can, but I think expecting everyone to ‘just get it’ is setting yourself up for failure, and ultimately unhelpful in the long run.
If you're adopting a rescue animal, there is no environmental argument. My dog was bred for racing, a cruel and violent industry that throws the dogs away like garbage when they are no longer used. I don't think there's any ethical argument to be made against adopting a dog like that.
If people giving their cats cat food is enough to make you question your commitment to vegetarianism, maybe you're not really that committed? You should do things for yourself, and base their value on the decisions of others
As I've said elsewhere, I do not drive, fly, eat meat or have kids. My laptop is a 8 years, my phone is a repairable FP3 which has had several parts replaced over the last 3 years. And yes, I rescued two greyhounds from a cruel fate, and I feed them kibble (reconstituted / recovered meat). I have zero problem with the latter, and still call myself am environmentalist.
Spend 50k on a Tesla and you get to enhance you lifestyle, signal your eco-solidarity and to some extent, affluence. Bang for buck, if you really care about the environment, don't have children. There is nothing that comes close to impact.
that's what I'm thinking if you want to suck all the joy out of life just move to the woods and live off the land, have the least environment impact possible
This is very good advice, but I wish it wasn't presented without qualifiers. There are good reasons to get a shelter dog:
- You are potentially saving a dog's life that would otherwise be put down.
- They are often initially cheaper than buying a dog from a breeder.
People rightly focus on the strong moral argument of the first point and they even emphasize the second to imply that it's a good self-interested choice too. But they advocate so strongly that they often omit the real downsides:
- The long-term cost may be higher. There are breeds that are known for significant health problems, but many breeds don't have them and if you buy a puppy of those breeds, their health is closer to being a known quantity. With a shelter dog, you are rolling the dice. There is maybe an argument that hybrid vigor makes shelter mutts statistically more healthy, but that has to be balanced against the facts that (1) the dog may have ended up in the shelter because of health problems or (2) the dog's life pre-shelter may have caused health problems.
- There may be long-term behavioral problems. Dogs in shelters may have been feral, living on the streets, abused, or relinquished because of behavioral problems. If they were feral and weren't potty trained well as a puppy, you may never train them out of marking. Even if the dog was homed, the kind of people who don't spay and neuter their animals (thus leading to puppies that end up in the shelter) are often the kind of people who don't train them well either. There also seems to be a correlation with shelter dogs coming from dog fighting communities. You see a ton of pitbulls, which are wonderful sweethearts when raised right but are not when they aren't. Even non-pit breeds may have been abused as bait dogs.
I love the dog I got from a breeder, and I love my shelter dog (who is snoring next to me as I write this), but the latter was not the pure win that shelter advocates often make it out to be.
The right way to think of it is sort of like getting a used car: it can save you money and be a morally good choice (in the case of a car, less waste and better for the environment), but it's also an unknown quantity where you need to do more due diligence to know what you're getting into, or accept that you are taking a risk with higher variance.
But, unlike with a car, you're signing up for the dog for life.
So, yes, please consider a shelter first. Any future dogs I get will likely be shelter dogs. But consider it cautiously and take your time finding the dog that is right for you.
I know this is right - but I feel obliged to point out that this is true with a new puppy too.
Training dogs properly is work, and inconsistent or incomplete training only gets harder and harder to fix. Plenty of dogs in shelters are there because owners could not rectify their own mistakes. Not from malice, or lack of caring. Simple unknowing incompetence.
Don't be too quick to judge those who give dogs up
I've rescued several greyhounds from the racing industry. One time, after our old greyhound "Pasha" died, we decided to take on a challenge: a greyhound who was rehomed several times, and even abandoned by a shelter (run by a bleeding heart who had no idea how to handle dogs). Lily was a crazy black greyhound who hated all dogs and was afraid of most people. Her name wasn't Lily - she was 6 years old and didn't have a name that she responded to. For the next 2 months we basically had these rules:
* Always have treats in your pocket
* Avoid triggers (dogs) but whenever Lily sees one at a distance, give her a treat
* If she acts aggressively, don't yank the leash or shout, put a treat at her nose and call her name
That's it, in a nutshell. It works for basically any behavioural problem in any dog. (Of course, the breed will have its own personality type - they all do). 6 months later Lily would go nose-to-nose with a rabid chihuahua and remain calm. She was one of the best dogs I've ever had. Still miss the old thing.
She died last year, and we rescued 2 greyhounds (brother/sister). Dorrie is fine but Merlin was, for reasons unknown, afraid of certain types of street light. Which is a massive pain in the ass of you live in a city. We followed the exact same rules, and within a few weeks he was ignoring them. (Still gets spooked at random stuff, like the moon, or light reflected from a kitchen knife onto the ceiling)
We have a new dog since a month (podenco mix) that had about 5 previous owners and is 4-5 years old. Lovely but very rough edges. Even a few scars on his nose and head so our guess is that he was at least in one tough fight.
Similarly he has problems with other dogs (not with our other podenco, who he loves). He is insecure, stares, starts to go full aggro if they stare back etc. We try to be as careful and consequent as we can. The good thing is he is a very fast learner, not as stubborn.
We give him praise and treats typically after he did well on an encounter (which we keep at fair distance as well). It wouldn't occur to me to give it to him beforehand.
Your method seems simple and I get why it would work, but it's counterintuitive. Can you elaborate? It is something that worked specifically for her for some reason? Or do you think the simple conditioning thing just works. My intuition would be that he has to show the desired behavior and then gets praise/treats. What do you think?
Not the person you asked but I’d guess it has to do with managing the emotions or anxiety that lead to the bad behavior. The way I think of it is I don’t want to teach the dog to overcome negative emotions, I want to help them not have negative emotions in the first place. If possible.
This, exactly. I think that the idea is to teach to dog how to interrupt the negative emotion with something positive. It gets to the point where they interrupt it themselves without your intervention. With Lily, it got to the point where she'd see a small dog or a cat, and she'd look straight up at me (good girl!)
To begin with, practice randomly when there is no trigger. Have a sneaky treat ready and say the dog's name. If it's difficult to begin with (because they don't know their name), try putting the treats into a small plastic container and shaking it, or taking the plastic packaging of their treats. They learn to respond to that noise very quickly. Words are more complex, but if you say their name when you make the noise they'll start responding to that too. Always carry accessible treats.
5 months since we adopted untrained (pretty wild) greyhounds, I can get either of them to sprint to me by calling their name, sit, high-five, lie down... no matter what's going on around them. That response makes it easier to discourage cat-chasing and to reduce their prey drive.
I think you're approaching it from an operant conditioning model where the treat must come after as a consequence of good behavior. But what they describe sounds like reciprocal inhibition:
The idea is that you can't feel opposing emotions simultaneously. So if you can make the dog feel relaxed (by giving a treat beforehand), it interferes with their ability to feel anxiety.
They aren't earning the treat for choosing not the be anxious. The positive emotional feeling from the treat prevents the anxiety from occurring.
With Lily we didn't take the risk of bad behaviour during an encounter. We would just ply her with treats and tell her she was a good girl as we walked by a small yappy dog. I think she started associating those encounters with positive emotions.
Thank you! I'm not very experienced with dogs (my partner is) and I'm still too much in my head instead of with the dog. I think I might be trying a bit too hard (or rather too often) to train him instead of just managing situations in a nice way if that makes sense.
I'm not saying this to judge the dogs' original owners. In many cases, the dog was feral and there is no original owner.
The important point is that dogs go through developmental milestones just like people and when you get a dog that has already finished its puppyhood, you have lost the opportunity to be present during those milestones and train the dog. Dogs can learn as adults, of course, but correcting bad behaviors is a lot harder. When you get a younger dog (shelter or not), they are more plastic and easier to train.
Yes, of course, it's on you to actually do that training well, but at least you have the chance. When you buy an adult dog, which is what most shelter dogs are, you're kind of stuck with what you get.
Right, but when you don't know the dog's breed (i.e. it's 17 types of cross-breeds) nor its history (if it's gonna have PTSD from being abused or fighting for its life in the streets), it's a much safer bet to get a purebred or simple/common cross of 2 breeds where you can Google the general behaviours of those types of dogs, and you know its entire history of life up to that point: being born, then laying around with its siblings and mom
You really want a common cross that has been breed from that same cross for generations. Otherwise what you get is an unpredictable grab bag of behaviors from the original breeds.
Wall of text on point. I got a shelter dog 5~ years ago and it is a relatively difficult breed. I knew nothing about dogs. But I love it and take care of it (because I take ownership of my decisions, particularly where they involve the life of another creature), and it's gotten better over time. I also exercise caution where necessary.
Anyone getting a shelter dog should pay for a dog behaviorist to either help them select a dog or evaluate the dog they have selected. They should also have a trainer lined up to help them teach the dog how to live with them. This goes 20x for first time dog owners.
I was ineligible to adopt a Daschund from a shelter because my property doesn't have 1 acre of fenced in yard. Other places required 2 veterinarian references (we had 1 reference due to owning a cat). It can be a lot harder than people think to adopt a dog from a shelter
I was recently having a conversation with a married couple I had just met through a mutual friend. They were detailing their recent difficulties trying to get a dog. They were looking at both shelters and breeders, and both had their own difficulties, costs, red tape, waiting periods, etc. The woman was also pregnant with their first child. I asked, and the irony was not lost on them.
This really varies. I got this kind of treatment from a group of ladies fostering Shi Tzus. I think they really just wanted an excuse to keep those dogs or give them to new potential old-lady friends.
At the next place I tried they basically threw the dog at me.
This is most excellent advice, and certainly did not state “you should not get a puppy from a reputable breeder”, which seems to be what a lot of the replies to it assume it said.
I feel like 'tiny personal programs' is one of the bigger reasons to teach 'everyone' to code.
Everyone has something in their life that is very specific to them that they would be much happier if it were 'just so'. Writing tiny scripts or being able to dive into the config/settings of something is a good way to get rid of some pain points.
For this reason, I often recommend 'Automate the Boring Stuff with Python' (https://automatetheboringstuff.com/) to beginners. It hits the basics and then moves pretty quickly to address: OK, what can I actually use this for?
I am not a programmer, but it has been fun learning little bits of Python and making scripts to automate tasks.
We have folders for clients at work and everything older than a couple of years should be archived, aside from certain legal documents. Building a script to check if any file is older than a certain date and checking that it does not contain certain words in the filename, was really easy, and useful, and gave me a good feeling of satisfaction seeing it actually work.
In 8th grade, I took a compulsory wood working class. I guess it was a skill that adults thought children should learn.
By that point, I had already been coding for 6 years. My school had a computer lab, but no coding was taught .... just typing. Also we played networked Oregon Trail Deluxe once or twice.
I wish more of the engineers I work with had taken a wood shop class, so that they would learn about things like kerf, working with things that are out of square, tolerances, and how certain milling or lathing operations are impossible. Most of the young engineers I work with only know about drawing things and running simulations on them, rather than how things are actually built.
This right here. So often general purpose software winds up being some feature anemic app that focuses on some common denominator functionality. Plugin and extension support has been great to expand capabilities in general to make said software less confining.
Ages ago, I had a second job as a speed-dating host for a social events company. I did it partly for the (beer) money, partly to meet women at her other social events for free (she charged for them), and partly to get her brash-but-actually-quite-useful online dating advice (that helped me find my now-wife, now that I think about it!).
The basic premise was simple: get 10-20 people into a hip restaurant or bar, set up tables, have women pick the tables they sit at, then have the men go from table to table having five-minute conversations. After everything was said and done, everyone would write the names of people they wanted to see again on a form and hand them to me.
I would manually go through each form and send emails to matches after the event was over. I also had a 24-hour soft SLO and a hard 72-hour SLO. This usually took me a whole 2-3 hours to do per event. I also mismatched people several times because humans gonna human.
I was very fluent in PowerShell at the time, so upon realizing that this can be automated with a matrix solver, I wrote a script that took the names of everyone that submitted a form, then, name by name, asked for everyone's matches, and sent everyone their match emails from a template I wrote. It took me about six hours to write and run through manual tests. (I know better now and use TDD for everything!)
My 2-3 hour error prone process went down to five minutes, tops, with no errors. It was beautiful. Towards the end of my stint doing this job, I was able to run this script _as people gave me back their forms_ and have emails queued up to send out once everyone was gone. I spent the remaining 2.95 hours I got back walking to my favorite izakaya and eating their amazing pork belly rice bowl.
Thanks, Julia, for making me miss my twenties for the first time in a while!
(I've written several small utility apps over the ages. It's a shame when I hear people say that they actively don't program outside of work; the ability to write code to bend the world to your will is an amazing superpower!)
I can relate to the document scanning issue. In my case, I digitize all documents I get on paper. For this, I've written this wrapper around scanimage and ocrmypdf: https://github.com/dbrgn/pydigitize
It does the following steps:
1. Scan a document with any scanner that supports SANE (ADF supported), 2. straightening and cleaning of scanned documents, 3. run OCR on PDF so that it becomes searchable, 4. generate PDF/A file for archival, 5. add keywords to the PDF file
I've probably saved many hours with this script, even when taking into account the time it took me to write it.
Tiny projects don't always save time, but they sure are gratifying when they work as intended!
I wrote a keypress-driven graphical utility that's basically a wrapper around scanadf, that allows me to call scanadf repeatedly, preview, delete pages, etc. For instance if a page misfeeds, I pull the remaining stack out, delete the bad scan, and restart from where it went wrong. When finished, the graphical window disappears, and it writes all the current pages out as an archive - the masters are checksummed, compressed with FLIF, converted to some low quality JPGs, and the whole thing is stuck in a ZIP archive with extension .cbz (viewable with evince).
The eventual goal is to transcode all these masters into nicer OCRed PDFs, but I've been making do with the low quality JPGs just fine. Your script seems like a great starting point to actually get this done!
Funny, I also wrote some code to solve one of my printer problems. It doesn't do double-sided scanning so the script waits for two recently PDFs in a folder (while trying to be smart about not picking incompatible PDFs) and merge them in the right way: https://github.com/RomainGehrig/PDFCollate
I could have worked the same amount of hours for a client and use the money to buy a duplex scanner, but where's the fun in that ?
I went through this pain when I bought a document scanner some years ago - there was no good solution on Linux that would let me from the command line scan, clean, OCR, and output a PDF. I found lots of scripts like yours, but none that was complete. I finally took an existing Perl script and hacked it to my needs.
Features one should have:
1. Output to PDF.
2. Option to OCR (optional)
3. Clean up (e.g. skip blank pages, straighten pages, etc)
4. Allow one to specify quality/dpi
5. Select grayscale vs color
6. Duplex vs single page
7. Dynamically recognize the size of the page.
The last one is the one I'm missing - if I scan something long, it trims it to fit a Letter size page.
Related tangent:
I haven't looked into OCR, but for a simple "iPhone camera to 'scanned' PDF", the Dropbox iOS app has a surprisingly good implementation.
I prefer not to upload all my potentially private documents into a cloud service :)
OCRmyPDF (https://ocrmypdf.readthedocs.io/) actually does a pretty good job! It also handles deskewing and all other stuff that's necessary for good OCR results.
I used to play a game called runescape and there was this client called OS Buddy that had data dump of all 'buy' and 'sell' orders in the grand exchange.
put the data in python and I calculated the "flip" ratio, average and liquidity of the items.
Now that was all profitable, but around this time there was a phase where everyone discovered that you could do pump and dumps and make obscene profits. They worked exactly how normal pump and dumps work, a select few insiders buy a bunch of the random item and then after a few days they annouce it to the clan and start selling their item. I could see a surge in abnormal buys for items with low liqidity and effectively have a birds eye view of all the pump and dumps before they aree 'Public".
I never had to have a job through high school as i could sell the GP and make around $50-60 a day!
Back when you could create accounts with usernames instead of emails, I wrote a c# program that would generate a random user/password/DOB, go through the three web forms, and create an account. I integrated this with TOR so that on every third account, I'd switch IPs to prevent throttling. I'd let the thing run almost constantly and ended up with thousands of accounts.
I sold these account lists to botters who would then go on to to their thing. Made a decent amount of money from this too!
Difference between the immediate sell price and immediate buy price.
You can sell an item instantly for X and can buy an item instantly for Y. You determine which items have the highest difference between X and Y. You buy for X and sell for Y.
yup but arbitrage is usually through other exchanges, or exploiting a triangle between assets. In runeescape there was downright no liquidity so it's more like day trading and using the liqudity gap as your margin.
My friend invited me out to karaoke, but most of the songs I know aren't popular enough to be in karaoke systems. It turns out that the local karaoke place has a song database that serves queries formatted as a URL parameter, so I wrote a script to query it for every artist I've listened to on Last.FM. I found out that Black Sabbath and Iron Maiden are surprisingly good picks for karaoke! There were also a few singles I didn't expect from Children of Bodom and Arch Enemy. https://github.com/vermarish/karaoke-sign-in
Very cool. As a fan of metal with “extreme” vocals, I was blown away one night at a karaoke place when a guy went up and screamed the vocals to an Arch Enemy song!
If any of you know don't know what LaTeX is, it's a way to write documents, it's usually used to write Math and Science research paper's because the of the formatting and symbols LaTex allows for. It has a lot of flexibility, but everything in LaTex requires a lot more effort to type then in something like MS Word. I have to use it for a class I'm currently taking where you have to do super long proofs, I created a short 50 line script where I can enter a mathematical expression using plain text and shorthand's for special symbols and the function returns a string I can copy and paste into LaTex. Saved me and my groupmates multiple hours, I also posted on my class forum so I can save my classmates the pain as well.
I recently came across a zine someone made called The Codex: Life with Linux. It's on Etsy for $6 [1], but their short chapter of LaTeX tips is fully shown in one of the screenshots [2]
> It has a lot of flexibility, but everything in LaTex requires a lot more effort to type then in something like MS Word.
It's not just super-flexible in the output but also in the input. It takes one short line in your preamble to define a new command or math operator, redefining long commands you use often - with parameters and/or optional parameters, if you like - to be whatever you want them to be. It sounds like you don't know that. Everything is redefinable, and it's easy enough to also make a short command name for a combination of symbols, or a new symbol, or anything you like. Commands can even draw pictures inline, e.g. with TikZ.
I have to disagree with you about LaTex being slower than word for equations. In fact, one of the big reasons I started using it was faster equation typing. And when word2003 was upgraded to 2007 or whatever came next, they actually changed the equation editor to allow latex style entry so you didnt have to click through the menus to get symbols.
What kind of shorthand do you use with your script? I honestly find latex's shorthand already short.
The course I'm currently taking makes me uses symbols like the biconditional, xor, and quantifiers. Each symbol requires an entire word to type out but I also frequency have to look at a reference sheet to find the command for each symbol.
I just use short hands like "-" for not, "and" for $\land$, etc. I'm sure if I used LaTex more often, I would have most of the commands memorized but I use it infrequency so I almost never remember.
Back in high school I used OneNote and had a pretty good MS equation editor setup. Most things can be done in a similar way to LaTeX, e.g. writing \theta for greek letters, writing a slash for fractions. With a few "replace with" "macros" I could write quite fast, probably faster than I can in LaTeX these days after about the same amount of practice, and almost never had to use the GUI.
These days my notes are all Markdown with inline LaTeX for math. I haven't yet found an editor that support "global" LaTeX macros/shorthand. Things like matrices can be bit of a pain, but then I haven't written any since linear algebra.
I don't think there are any engineers (people who have gone to engineering school) that haven't used LaTeX. [Editing based on replies]: Apparently I am wrong. Maybe it's just at the grad school level that one can expect to use LaTeX frequently; I made the assumption because I took a Master's.
You're very optimistic. I doubt anywhere near the majority of engineers have used LaTeX directly. I've seen a lot more (of all ages) who used Word for their technical writing. If they used LaTeX or TeX it was a one-off, not something they became skilled with.
In the UK the government runs the booking of driving tests from a central online system. Because of Covid, and because the test has a 50% pass rate at best, there is now a lot of pressure on this system. People wanting a test are getting test dates 6 months out.
A whole industry has grown up around scraping the website so that kids now are forced to pay sniping companies £20 a time to grab cancellations as they appear on the system if they want an earlier test date.
In my view private companies are camping on a government-run system and extracting their own tax on new drivers.
This is the dark side of clever sniping systems, it starts out as a way for an individual to get ahead but quickly gets industrialized so that those who can't afford to pay for the service are left out in the cold.
fwf -- "Filter With Feedback". It lets you write sed/awk/jq/grep etc things interactively. You type in a UNIX filter, and on every keystroke it renders the result in a column on the right, which you can compare to the original on the left (watch the video demonstration on the link if that description is confusing). I wrote it to make the feedback loop for text-processing as quick as possible. I use it all the time now. It makes the "activation energy" for writing shell pipelines a lot lower, if that makes sense.
I had a 200 line python script running on a junker PC that pulled a not insignificant amount of cash in. It was an arbitrage system that looked for poorly listed items in a couple of eBay niches. I'd literally buy the items it identified and then list them properly and reship. Average margin was 60%. On one occasion I managed to nab something for £15 and resell for £675 with a 4 day turnaround.
Alas I collapsed the whole niche in the end.
Edit: all it did was every 10 minutes scrape some carefully crafted eBay searches with beautiful soup 4, do some custom filtering, remove any duplicate items it had already seen (stored in redis), then send me an email via SES with the links in it where I would make a decision.
I've always wondered what would be the chance to win the lottery if I played consistently a certain set of numbers. Every day, no excuses.
So I wrote a script to scrape the lottery site archive and check retrospectively the success rate [0]. Well.. the result is what you would have expected.
Except for those few cases where the people planning the lottery don't know math and buying all the combinations costs less than the amount of the wins :)
That would be 49!/(43!6!) = 13983816 combinations. So, on average, you need to play 13983816 times before your first win (geometric distribution). At one game a day, that's nearly 40000 years.
I've built an entire business around some personal programs that I've written (all Python scripts).
Currently working about 4 days a week with no commute and pulling in 2-3x as much as I was back when I was an SWE. This is only going up as things get more automated and optimised. I think a lot of young people obsess with the high-status fields (AI, Robotics etc.) but there are plenty of ways to make a good living doing low-status work extremely efficiently (I'm in used video games, for example).
Specifically in our case, we sell used video games.
A lot of very labour-intensive work (pricing, writing listings, getting images) is all done by machine now, and I've recently made some semi-automated flows for shipping (think stage 1 of Manna[1], where a script tells you the optimal way to do a manual job). The next thing is to automatically decay the prices with a cron job to get rid of stale listings.
I think the important thing to point out is that we're not a software business!
We're a retail business that happens to use software to increase productivity and competitiveness in certain areas. The value doesn't come from the fact that the software is particularly technically impressive, but that it allows us to achieve in 50 man-hours per week what takes others 200.
As a side note, I think the whole "I'm a software engineer, therefore I should focus on making software" way of thinking is an incredibly common trap that leads many people towards creating worthless startups.
Ultimately, good software solves some kind of real-world problem, and your understanding of the problem that you're solving is in many cases more important than your programming skill.
I write code for a living, and I'm in a sweet spot where I actually do get to write things that make people's lives easier, but it's still easy to forget just how much of a superpower being able to write code is. I mean, the things we do, and the things Julia writes about here - this is literally modern day wizardry. We speak the right words to arcane and inscrutable systems and change reality around us. I love that I get paid for this, but I love it even more when I get to change something from "dauntingly difficult" to "easy" just by thinking about it a bit and asking correctly.
I love Glitch, I wrote a number of Twitter bots. But then they changed some things in the free tier (understandably), so I moved my bots to a local server that runs Docker, with each container running a bot, and I'm really happy it's chugging along.
This is super basic, but I finally sat down and learned the syntax for yt-dl and built a script for checking all of my favorite channels on youtube for any new content and archiving them locally. I was doing it manually before and that turned into a huge pain as my list of channels I wanted to archive continued to grow.
Now it runs every night and I get notifications if it runs into errors.
This script would be good for my kids. Would you be willing to share?
I want an easy way for them to watch their favorite channels, without seeing the suggestions from youtube. It often suggests similar content, but not child appropriate. Specifically, Minecraft content.
I think a local cache of videos served to a HTPC client would work well.
An alternative is to just block YouTube recommendations on the client. You can use the 'My Filters' feature of uBlock. See https://github.com/gorhill/uBlock/wiki/Static-filter-syntax for details. Personally, I get along just fine with something like the following:
Some notes on the batch file below. This is saved as a .bat file and runs in the middle of the night using task scheduler. I didn't include the error checking portion because it adds a bunch of complexity and dependencies. The batch file below can be copied and pasted in the same batch file for every channel you want to download. Just copy the block below and paste it below and modify it for the next channel. I also keep a copy of yt-dlp.exe in every folder I'm downloading to, and in the batch file, it runs an update of that file to make sure I always have the latest version before downloading. I also download the subtitles in English and I download the thumbnail for the video, so that it shows up nicely in Plex. The first time it runs, it will download all of the videos from the channel, and it will record the urls into a text file for all of the videos. The next time it runs, it will check the videos available from the channel against the list it recorded and only download new content. If you need help, consult the docs on yt-dlp github page. I don't really have time to help with tech support. I should also add that you'll need to replace the http string below with the url of your favorite youtube channel.
ECHO Checking Your Favorite Channel...
cd "\path\goes\between\the\quotes"
.\yt-dlp.exe -U
.\yt-dlp.exe --download-archive ./playlist.txt -iw -o "%%(title)s-%%(release_date)s.%%(ext)s" -o "thumbnail:%%(title)s\%%(title)s.%%(ext)s" -v https://www.youtube.com/channel/UCpil30eNi37bPLwKp4g4kUA
cd \
ECHO Your Favorite Channel updated
I have this set up for specific playlists that download to specific folders (tech,kids, etc) and when I or family member come across videos we want to watch later we just add to playlist and it's available for watching later on the HTPC.
I use a script to clean out the playlists occasionally.
I like my idea for a local cache with HTPC client because there are plenty of clients to choose from for Fire TV, and my kids are more comfortable with a 10ft interface.
YouTube is one of the few websites which I wouldn't trust to have a video that I watched today be available tomorrow. The reason can be anything — local geographic censorship, copyright strike, uploader removing his own video, video becoming private, lots of other things I can't recall right now.
There are several reasons I do this, and most of it comes down to not trusting Youtube to keep content available consistently for the various reasons others have listed.
There is an added benefit. I have one channel I follow that does a LOT of q&a type videos from the audience. Because I download the subtitles as well, I can throw those into a database with the video titles and make a searchable database if I want to see what the host has said about a particular topic. I don't have to rely on my memory or go hunting. I can just query my database and know exactly which video/timestamp has the topic I'm looking for.
The other day I visited a 3 years old Reddit thread. OP posted a playlist for a certain topic. There were about 100 links to songs on Youtube. About a third no longer work. For many Youtube doesn't even tell me what the titles were, so I can't search for alternatives. I'll never know what those links pointed to.
If you have a system for delivering locally stored content already, then this lets you avoid all of the anti-user aspects of YT like ads and the recommendation engine.
I absolutely love this, and I do the same. Small programs and scripts to solve problems I encountered in my daily life. When I make them for my own use, and for myself to enjoy making something, I don't care about whether it's the best solution or the most elegant solution, as long as it's a solution! And I really, really enjoy that. I don't care if it's one or one hundred lines, as long as it's enjoyable!
A few of my examples are:
1. A PyQt GUI for redshift. I use this every day, and have been for a few years.
2. Userstyle for horizontally flipping a video. Sometimes a video or stream is mirrored, for some reason, and it's just nice to be able to fix it.
3. Userstyle for scaling videos that originally had an aspect ratio of 4:3, but have been stretched out into 16:9 back to the original 4:3 aspect ratio. It's surprising how often you come across those.
4. Userscript for improving the functionality of the investment portal of my bank.
5. Bookmarklet for opening all videos on the page in new tabs, but there are some problems with iframes yet.
6. Bookmarklet for setting playback speed of videos on the current page. I use this several times per day.
One of the best tiny programs I wrote in half hour was to help my office mate automate his manual copy & paste of sample IDs to generate barcodes, aggregate them in 10 nos boxes and send them out. He had allocated the entire day to do this manual labour for 3800 samples. I showed up, asked if I could help, and wrote a simple python script that would read the excel doc with all sample IDs and prepare printable PDFs with 10 barcodes each that he can simply stick on the box.
The whole thing was over in 45 mins, and his mind was blown. He had been doing this manually about once a month for decades ;-)
I have moved on from that job, but have given him an executable on his laptop that will read an excel file of a specific name and print out the PDF the same way. It is his treasure now :-)
Back in high school I would try to play CS 1.6 on the library computers. The librarians had access to screen viewing software on all computers in the library and quickly caught me every time.
I played around with visual studio C# and created an application that would continuously monitor running applications (every X ms), detect when a specified .exe was found, and either (1) constantly kill it, (2) display a message, or (3) run a different .exe.
Never quite got to s1mple's level, but I did play a good amount of CS after that!
Love these kinds of projects! To me they represent what's the most fun in programming.
Here's a couple of mine:
* During COVID lockdowns, the local grocery chain delivery slots were reserved a week or more in advance, but they were opening up a few slots each day; I wrote a scraper that would detect a newly opened slot and ping me on Slack, saving me a few days' wait on each delivery.
* When I was buying a house, I wrote a scraper that would email me daily with what was new on the market; didn't end up buying through that, but I later repurposed it to check for used car classifieds and snatched a pretty nice deal.
Was watching a movie with a group of friends which someone had ... acquired from the internet, but it didn't have any subtitles. Someone found an SRT file, but the subtitles were offset by quite a bit - enough that you would be seeing dialogue in the subtitles for what had been onscreen 10+ seconds ago, which kind of defeated the point of getting the subtitles. So I wrote a program in a few minutes to specify an offset and rewrite all of the timestamps in the file. We timed the offset, ran the script and got to watch the movie with working subtitles less than 20 minutes later.
Even more so, the subtitle offset can be set as needed with two key shortcuts - SHIFT+H when the sentence you want to sync to is said, SHIFT+J when the sentence shows up in subtitles and SHIFT+K to confirm the sync. (source at https://wiki.videolan.org/VLC_HowTo/Adjust_subtitle_delay/ )
I've used Subshifter website occasionally for years to do that. There are others I guess. Subshifter can do constant difference as well as stretching, where the subtitles are at the wrong frame rate. You find and enter in the times where subs should be, at one spot near the beginning and one near the end. It does its job well.
It's nice when people share their cool tools free online like this. :-)
It used to be a regular thing for me since I already have subtitles on (ESL spouse). The worst is when you have a time shift and a different frame rate, as it'll slowly get worse over time, but seem ok for the first few minutes.
Recently, Plex's "agents" seem to be good enough at figuring it out and auto-downloading subtitles that it's not often a problem.
The stories on this page, as well as the other comments here, make me really happy because they're all examples of computers making life better, as opposed to being passive consumption devices. Pretty often, I think back to putting together a database to track invites to my bar mitzvah on a 386 running a program called MyDataBase - it created print jobs for envelopes, let me mark back RSVPs, track gifts and thank you notes, everything. We carry such powerful computers in our pockets these days, but there are so few apps that I know of that actually use the device to make our lives easier. I wish more people knew how to use these tools the way the audience here does, or that I knew enough to make something that others could then use to do the same.
So many people think that the most recent generations are more computer-savvy because they use computers and smartphones all of the time. Quite the opposite; many are app-savvy, not computer-savvy. While I've gotta hand it to the amazing PMs, UX researchers, designers, and SWEs that have contributed to this phenomenon, it's a shame that computer literacy in general is so poor on average.
> The stories on this page, as well as the other comments here, make me really happy because they're all examples of computers making life better,
Hear hear! I love stories where computers help relieve human misery.
I got into programming because my parents had a business that required them to mail their clients a legally required notice every year. They originally were copying the letter, changing the address and a few other pieces of data, and then printing it out and mailing it.
While I couldn't help with the latter, the former seemed like a great job for a database and mail merge. I set up WordPerfect to mail merge, and got started entering data (one month's clients at a time). Whenever the day to send out the mail came, it was a simple matter to merge in the data, generate a long WordPerfect doc, and print it out. Once the first year went by, it got even quicker. I ended up porting the dataset a couple of times to more advanced databases (eventually PostgreSQL).
The first time they saw how easy it was going to make this onerous task, they were pretty happy.
And I was hooked on software as a way to lessen such tedium.
Edit: Of course now, I'd use a tool like lob to actually send the mail too.
WordPerfect mail merges! Did we grow up in the same house?! That really takes me back. It is really cool to see that others had early computer experiences similar to mine, since so many of my friends with computers were just interested in playing games and stuff. I never really took to computer games when also offered the opportunity to play with BASIC or mess around in a terminal and figure out how the computer was working. Necessity may be the mother of invention, but it also seems to be the mother of learning as well.
These little quality of life scripts are life savers, I've made a script which I'm really proud of and still use to this day, in my university they usually release assignments every now and then and I had to check each course's page manually for any new deadline, so I made a python script that scraped the website and would print any new assignments since the last run of the script. I would later make a little telegram integration where new assignments were sent on a group chat for my class mates to get notified too and left the script running in crontab on some vps I had around.
https://github.com/hegzploit/lazy-chicken
If anyone is interested in a little script that grabs an image from a webcam pointed at a 7-segment LED display and returns the numbers it finds, let me know.
It uses the ironically-named “Let’s Go Digital” training set for the Tesseract OCR program. It works somewhat poorly, but good enough to read my hydronic-heat boiler’s display to let me know that it didn’t fire up in the middle of the night, so that I can get up and clean the flame probe.
A couple years ago, I switched from German QWERTZ to a UK QWERTY keyboard (wouldn't have minded US QWERTY but the differently shaped return key seemed too foreign). I am not looking back: for programming but also general tasks, having keys like
` [ ] \ / { }
very easily available is a blessing. The German QWERTZ keyboard has triple occupation on some keys, which is not ergonomic and harder to type fast with.
Anyway, both Linux and Windows offer fast switching between installed keyboard layouts/languages using SUPER+SPACE. This is needed in e.g. emails, where I still need Umlauts. It's just much easier to read that way. However, switching back and forth constantly is completely overwhelming and not viable. However, in German, there are perfectly and officially (?) acceptable alternative spellings for our special "Unicode"-characters. They can be typed using plain ASCII, aka a QWERTY keyboard.
So, I wrote a script to read in any text, combined it with AutoHotkey on Windows and now have a tool that, at the touch of a button, replaces selected text using alternative spellings (gruen, Duebel, Faehre) with their correct versions (grün, Dübel, Fähre). The tool could be extended for other languages rather easily. I've been using it for over a year now and recently got to release it properly on the cheese shop:
Before putting this together, I had looked around for an existing tool. To my surprise (there's always something!), I found nothing. I guess this scratches a too specific itch: using QWERTY but wanting proper spelling quickly, while remaining on QWERTY as to not have a mental breakdown and stay at full typing speed.
After writing, select everything (CTRL+SHIFT+HOME works well), hit shortcut, text will be replaced. This takes about 2 seconds, much faster than switching keyboard layouts back and forth. If this ran as a daemon with the dictionary loaded into RAM already, the script could run almost instantaneously (most of the 2 seconds is IO, reading from disk), in linear time according to the text input size.
Neat! I'm using QWERTY International layouts myself, where you can type umlauts and ß with special keys for modifiers (e.g. alt+u on Mac for ¨), but I still think this is a cool tool.
Looking through the repo I wondered why you would commit the complete German dictionary weighing in at over 30 MB, whereas you only need a small fraction, the words containing the umlauts (or their false matches). Surely this would be a huge performance boost?
Turns out: a whopping 30% of that dictionary are words containing "ae|oe|ue|ss|ä|ö|ü|ß". Crazy. I would not have guessed that, at all.
> Neat! I'm using QWERTY International layouts myself, where you can type umlauts and ß with special keys for modifiers (e.g. alt+u on Mac for ¨), but I still think this is a cool tool.
Yeah, I had looked into these but for some reason that didn't work. Don't remember why.
> Looking through the repo I wondered why you would commit the complete German dictionary weighing in at over 30 MB, whereas you only need a small fraction, the words containing the umlauts (or their false matches). Surely this would be a huge performance boost?
Yes! It would be performance boost. In fact, I had a "caching" sort of functionality in the tool before. The whole dictionary is shipped (because that makes it much easier and there's almost no risk of wrong-doing just copy-pasting a word list, plus it compresses well enough), but then a list containing only special characters will be generated on first use if it doesn't exist yet.
As you noted, a lot of words do contain special letters, so the "complexity" wasn't worth it to me and I removed that. Could be brought back anytime, but it's fine for now.
Just fyi, Windows will let you set a keyboard layout per window. If you like writing programs, you can write one to switch the linux keyboard layout based on active window.
A lot of the music I like is on YouTube, including many obscure remixes and covers. Now, I'm not a fan of forgetting things and YouTube can be pretty volatile, with videos getting removed.
Rather than downloading all the audio, I made a playlist scraper for the names. Runs once a day on PythonAnywhwre, collects the names into a database, helps me sleep at night.
You can schedule "takeouts" from takeout.google.com to run every 2 months for a year - but as far as I can tell they NEVER fire off more than the initial time. Very weird yet so very Google too.
I wrote a tiny program to help test the tire pressure sensors on my car. You can receive signals from these sensors using a cheap SDR dongle and a program called rtl_433. However, out of the box the process is bit messy and requires tweaking and interpretation. So I wrote a bash script that wraps rtl_433, guides you through the process in an easy-to-understand way and summarizes the results.
A program like this is not full automation, but it greatly reduces the cognitive overhead of doing this task. Now when I suspect a sensor is bad, I can just pull out the script without having to get back up to speed on how to orchestrate the component programs and interpret the results. It's like having a well-designed jig for a woodworking task, hanging on the wall for later use.
Writing tiny programs like this is really satisfying because the scope is small enough that I can carefully consider all decisions. I spent a lot of time reading through guides and code samples, considering dependencies vs pure bash, understanding shellcheck warnings, and making the code conform to a style guide. All not strictly necessary to achieve the goal, but I learned a lot and take satisfaction in a small, but refined result.
Do you have the code for this living anywhere? I think I have a bad TPMS sensor in one of my tires and it sounds like your tool would be immensely helpful in figuring out which one.
so far I have only tested it with Toyota sensors, so YMMV when used with other sensor types as I'm not sure if the rtl_433 output will be the same.
I also wrote a blog post when I first figured out how to test the sensors with rtl_433, before I wrote the script. probably useful for background information:
https://www.r-c-y.net/posts/tpms/
Thank you for sharing. I have a Prius and the tire pressure alert is on even though all the tires appear fully inflated. Is there a way to determine which sensor is detecting low pressure?
Incredibly helpful, thank you! I actually just found your blog post on this. I happen to have a 2008 Corolla with the same issue, so my guess is that the sensors are very similar.
I wrote a command-line MP3 player in C for Windows. I just wanted to play with the media manger API's, but I've ended up using this to play MP3's in succession via a script.
It doesn't work on all versions of Windows ... it depends on some configuration elements. This has been used in another developer's video game and I believe it's installed with an MP3 player library in node.js ( if you're running node.js under Windows. ) It also plays WAV files on Windows 10 (possibly 11) if you pass the name of a WAV file into the command-line.
I needed a command-line emailer that would send an email via Gmail with a very simple one-line body for my Mac. I also wanted to exercise Go's SMTP libraries while experimenting with trying to build a minimal emailer application.
I have a local media collection that I like to have as background noise/entertainment while I work. One thing I didn't like about self-managed libraries vs radio/television/etc. is that I still had the cognitive load of choosing what to watch, specifically. So I wrote a small program to take a list of shows and shuffle them[0] then interleave episodes. Depending on when you start this channel, it has a time offset so you're dropped in the middle of an episode (just like channel surfing!), and has support for showing a certain show only in sequential order[1], and even adding commercials between episodes.
[0] Native shuffle in my media player didn't feel random enough, with a poor play count distribution. Switching to programmatically shuffling means I can also weight things so that a specific show is more/less likely to show back-to-back.
[1] I actually only consider the smallest continuous run of unwatched episodes, starting from the end of the series, and interleave vs shuffling the episodes.
What a nice read. Motivates me to make a list of these small apps I have all over the place; Raspberry Pis, DO servers, Netlify, etc.
It also reminds me about that usenet story where in a company their lead developer left, and they discovered some fun scripts to automate excuses for his wife, or turning on the coffee machine through telnet. Can't remember the name.
Some years back at work, I actually hit the size limits of email rules in Outlook, just for filing emails into folders for my clients. So, I wrote the first of a few iterations of an email-filtering script in Python, connecting into the office's Exchange server in different ways as we upgraded.
The current version wraps exchangelib and, besides just running the straightforward Python code rules, checks whether the email is in a thread and files it away in the folder with the previous emails. (This is the slow part over the web API, with walking folders to find the location of any particular thread the first time it's encountered adding a few seconds to the run. If I find myself caring about the few extra seconds, I'll try one of a few ways it's occurred to me to speed it up.)
While at first I slightly minded having to run the script instead of Outlook silently tucking them away, I found I liked the chance to see what was in my inbox first.
Here's mine: Back in like 2006 when I was in college and they first released games on facebook, there was a game my friends liked that was multiple choice, matching song lyrics to artists (if I remember correctly). It was always four choices, you would get points for a correct answer and not lose any for an incorrect answer, then there was a leaderboard amongst your friends. So I thought clearly the right way to win this game is to write a program that just chooses randomly (actually I think it just always chose the first choice), but as quickly as the server will allow. My poor friends woke up the next morning to find I had about 1000x their points. A fun hack, but I also regret it because it ruined a fun game for me and my friends; I couldn't figure out how to reset my score.
I am self-taught and little scripts like these were my entry into programming. Favorite programs of mine include a script to tell me when a boutique guitar pedal would be available from the maker to avoid paying +200% markup in the reseller market[0], and more recently I created a "todo focused markup language"[1].
My tiny program regularly scans a dropbox folder. If it finds a pdf, it prints it and moves it to an archive folder. That was just to avoid every family member emailing me documents so it is nicely printed by the time they get home to study.
That's brilliant, my girlfriend and roommates refuse to install the printer driver onto their computers and print things themselves so it's an endless cycle of bugging me to print things. Going to get this going when I get home today.
I run a badly written monolith (my home automation system), and tend to make tiny personal programs some weird offshoot growth of it.
There's upsides and downsides to this. I'm aware it's basically guaranteed to be useless to anyone else because it's depending on software I'd never encourage someone else to run, for instance, and it locks me into certain coding choices.
However, I spend a lot less time doing boilerplate/framework stuff, because I've already got the basics running for other tasks: Stuff for logging, settings, data storage, and remote control and monitoring is already a given.
> one of my favourite things is to use secret undocumented APIs where you need to copy your cookies out of the browser to get access to them
I love this too. It's always a nice surprise when you realize you won't be needing to write xpath/pyquery/et al. after all... It's like the scraping has already been done for you!
My SO is not always reliable when it comes to handling home duties while I’m away for work. So I setup a little Python script to send a text message with a TODO list every day. Twilio handles SMS, reminders are store in sqlite3, and cron runs the script once a day. It lives on a DreamCompute instance so (hopefully) no worries of a local power outage eliminating crucial (ok, not really that crucial) reminders.
Are there better ways to do this? Undoubtedly. But I sure had a good time making it work.
Nice article!
Here are a couple of my recent personal projects..
I couldn't find a command line media player that was simple enough for my liking. So I wrote one for myself that uses gstreamer as the back-end. https://github.com/codabrink/aquinas/
It's hasty code. I plan to improve it in the future by adding features and switching the music library structure from an array to an iterator when I find time.
I also needed a daemon that would watch a folder for new files and upload them to Backblaze B2. https://github.com/codabrink/backblaze-upload/ I use this with Nginx on my vps to proxy requests to the bucket for nice looking vanity urls. (http://i.kota.is/5ruvD.png)
The code is really bad; the focus was to build it in under 90 minutes or so, but the important thing is it works, so therefore I'm not going to spend anymore time on this one.
My dream in life, seriously, is to get waaaay more people doing this sort of thing than they do now. If STEM is worth anything, it would be worth things like this*
*(I run a STEM non-profit, so I feel pretty qualified to criticize it this harshly)
Tiny projects like these are fun and rewarding. I just wish I were as good as Julia at keeping track of them. After reading this, I think I'll start keeping track of them in one place :)
This made my day, especially the scripts that were not ultimately useful, yet you are proud of them and glad you spent the time to do them. I tend to beat myself up for not doing more "productive" coding, and I need to appreciate the experience itself more. Thank you so much for this.
One of the most used "tiny program" I wrote [0] is a weird one to explain to non-technical people: a scoreboard UI to display the current score of your match on a stream when playing Eleven Table Tennis in VR. I see it being used quite frequently in Twitch streams.
It polls an API every 3 seconds, parses the match data and displays the score in HTML/CSS. The tricky part was finding a way to make it easy to add to OBS without a server, luckily OBS has a "browser source" so you can add any HTML page/URL, so the variables needed to select the match/player and are customizations are stored in the URL.
It's fun to build simple stuff that work, but it's even more rewarding to build stuff you actually use every day.
I made a simple expense tracker that will parse the SMS messages I get from the bank when paying for stuff, categorise based on merchant categories and push it to a google spreadsheet for traceability and visual charts. Good opportunity to play with building native images (it's done in java) in order to minimise resource usage as it's deployed in a 5$ digital ocean droplet.
10 years ago I've built a Swing app to generate invoices in a local compliant format. It was great to flexibility to customise everything.
>(“using the API of local services” seems to be an ongoing theme, one of my favourite things is to use secret undocumented APIs where you need to copy your cookies out of the browser to get access to them)
A basic step for securing a resource intensive API from DDOS attacks and some user impersonation attacks is to rely on a security token in a cookie set in the response to an earlier request. For example, a user may land on a web page and receive a unique, encrypted, short-lived security token cookie that is marked http only (inaccessible to javascript), plus a copy of the token in cleartext. When the user agent later polls an expensive API, it must send the cleartext token as part of the request. Server-side, that's compared to the encrypted copy (received from the cookie) and the expensive call is terminated early if they do not match.
A DDOS attack that relies on a malicious ad or web page directing user agents to poll your expensive API in a loop will no longer work as well, because those user agents will not have the correct security token cookie value, and the attacker is unable to figure out what the correct value is for any given user agent running their malicious code. More sophisticated/expensive attacks are still available, but anything is an improvement.
There are a few ways to skin this cat, so don't refer to the above as a how-to-guide - find a more authoritative voice on best practices than me, please, if you try to implement security like this.
Anyhow, if you want to use an API implementing security like this, you copy the cookies out of your browser and feed them to your program so it can add them to the calls.
I got an appointment at the registry office for my marriage because of a script I wrote.
Years ago I desperately tried to get an appointment for a marriage at my local registry office but as soon as their website listet possible appointments they were gone. So I wrote a web scraper that blocked an appointment as soon as it was offered, and sent me an sms (via Twilio) notifying me. My script was so eager that within an hour it blocked several appointments. I got a call from that office wondering how often I wanted to get married. So finally I got my appointment. Otherwise it was close to impossible to manually book an appointment.
I did something similar to the vaccine appointment bot but to get my passport appointment, I'm Venezuelan, and let me tell you getting a passport is almost impossible due to all the corruption and mismanagement, so years ago the webpage to schedule the passport appointment was down for 99.9% of the times, I am not joking the page was only functional for a 10~15 minutes per week at random intervals of the day, there were facebooks groups of people doing watch reloading the page every few minutes ALL DAY LONG to catch it when it was working and then inform the rest when it was up, It was insane I decided to do a simple(not really tho) bot that did the polling and fill my data to the form, I was very happy to result and event more because I didn't have to bribe anyone(This is the "normal" method to get the passport and the sky is the limit of how much are they going to charge you)
> investigating dice rolling patterns
A friend showed me a dice rolling game where you roll a bunch of dice and add up the values. I mentioned that if you roll enough dice and add up all the values, at some point it gets a lot less “random”.
And result turned out "true"? Rolled a die for 2500 times and the sum is all around 8500! I wonder what would be the results for 25/250 times? So, this is sum(expectations).. and for rolling a die, it is 3.5 [(1+2+3+4+5+6)/6 => 21/6], so the answer was 3.5 x 2500 = 8750. Should hold good for all numbers relatively large.
This is a classic illustration of the Central Limit Theorem--in fact, the example is even on the Wikipedia page [0]. The distribution tends towards a normal distribution as n increases (though to actually take the limit you need to rescale).
I have a script running on the raspberry pi that scrapes the Council website and emails me with what bins need to be out on Monday. Runs every Friday. I still await the email with anticipation every week.
One fun one is I was playing a game with friends and it felt super random to me. So I wrote a simulator and some simple strategies to see how effective these strategies were vs randomness. If the game is mostly strategy you would expect to see clear difference in all of the strategies. If the game is mostly random the good strategies would have a hard time differentiating them from each other consistently.
My wife was working a role that, as one of her more mundane jobs, required grabbing image descriptions from ShutterStock for their purchased images and replacing the filenames with them. It took up several hours of her week and was incredibly boring work. I wrote her a small script that she could simply drop it in the folder where the images were and double click.
I always wondered how monetizable this sort of thing was. I've debated building a marketplace for these things. Let me know if you think this could work!
The best monetisation for this would be to explicitly seek out and take up these jobs then automate them away and enjoy the free paychecks. With remote work you could get multiple jobs concurrently even.
Can anyone elaborate on "secret undocumented APIs where you need to copy your cookies out of the browser to get access to them"? That sounds fascinating
If you look at the `network` tab in developer tools, you'll see every http request made by your browser, and the headers that are sent along with the request.
e.g. when you hit the `reply` button in HN, it'll make some HTTP request, with a cookie in the header that identifies your user session.
You can right-click on the request and click "copy request as curl", and then paste it into a terminal to duplicate the request locally.
Fore example, Stripe has some API endpoints that are only available to logged-in dashboard.stripe.com users. They are not documented in the public API spec, and they have more powers than the public API. If you do the actions in the dashboard and record the requests, you can use those undocumented APIs: all you need it a session token!
This leads down an unstable path, where you write a browser-emulating script to login to $service, scrape the cookie, and then use the cookie to make requests against the $service's undocumented API. Not a good idea to build companies on this logic, but it's fine and fun for personal projects.
So as a part of my daily activities, I have to use a portal that has an absolutely terrible interface, with text reflowing on every click, parsing and loading a 1 MB JSON file from an internal API taking about 5 minutes (of course, its a janky SPA with developers filling it with useless JS).
Irritated, one day, I fired up dev tools, opened the Networks tab and copied the relevant API request that was being fired as a bash command, converted it to Python [1]. After that, I merely parsed the JSON, dumped it into a HTML file, and saved it on my hard drive so I wouldn't need to login to the portal again.
Here’s my list of tiny programs https://adi.onl/projects.html, the log analyzers are soon the be updated. There’s a set of plain text linters in there, percent encoding on the CLI, TAP testing for the CLI, a generic shell preprocessor, my static site generator, Void Linux installation script and my dotfiles if that counts. :P
I haven't turned it into a standalone program yet, but I wanted a way to calculate praying the Orthodox Book of Hours according to a sundial instead of a normal clock, and I used excel to do it.
I found the formula for determining sunrise and sunset using latitude and longitude from NOAA's website. This allowed me to generate a sunrise/sunset table for my location by day.
I use VBA to update a clock every 10 seconds (I didn't need it to be more accurate than that) that feeds to a cell, and I use that to know when it is time for First Hour (sunrise), Third Hour (9 am, or 25% of the day), Sixth Hour (50% of the day), and Ninth Hour (75% of the day).
I have it all working and it runs in Excel on my work computer. My goal is to translate the logic into an app on my phone so that I can get notifications when it's time to pray. It's been a fun project, which included a side project of making a 9-LED display in Excel for the clock. I have a clock for normal world time, and a clock for sundial time.
This may not be as impressive but I wrote a script to eliminate one of the primary roadblocks I faced when I moved to Wayland on my Linux desktop — a script to copy and autotype password store and gopass data, kinda like rofi-pass
I wrote a web scraper to determine how local Nissan dealerships changed prices on CPO Leafs over time. The script hit the Nissan CPO page, grabbed all the VINs, then updated the price & date if there had been a change.
I collected data for a while, then decided I wanted a different car. Still had fun writing that script though.
I can control my smart devices by typing the command
'turn [device-name] on'
in the terminal from my computer, and I feel like an super awesome hacker every time. Works great when I am at my computer but don't have my phone around to use the app. I had to use an android emulator to get the local network keys to make tinytuya work.
I wrote a script similar to Julia's and other people's here to score tickets to a sold out music festival. At the time, people were posting on the event page that they had tickets to sell, but they were scooped up very quickly. It was a simple script that used Facebook's API to pull the messages on the event page and notify me via email that a new post had been made. I ran it every minute via a cronjob on an ancient laptop I'd been gifted. It was arguably a little chatty since it notified me of every post, and of course I had to be wary of potential scammers, but it worked and the festival was great.
I'm currently in the process of changing careers from computer science to healthcare, but I'm glad my software development career has given me the tools, skills and knowledge to solve little problems like these.
I wrote a small program to manage my contracting time after it being gently suggested that I stick to 40 hours and that overtime wasn't needed of me (calculate hours per day and when to leave Friday to hit 40.0). I wrote it so that usage was absolutely as lazy as possible. So typical use cases look like this:
>$ tm 8:30-12:30 12:40-
Time to leave: 16:40
so as to hit 8.0 hours for the day.
and
>$ tm 8.5 9.27 8.83 8.87 9:45-1:23 1:33-
14:11
54 minutes
is an example of when to leave (early!) on Friday to hit 40.0
Note how you don't have to tell it AM/PM or use 24 hour time. Nor give it any special flags to tell it which calculation to run. And it just handles the rollover at noon for you.
Love this stuff. I use regular mini side programs/projects as motivation-boosting procrastination tools. Oxygen to a tired mind. Just yesterday I saw a front page post on hn that I didn't love the solution for and so took 3hrs to byo (3hrs from another, only slightly less-tiny, project). Often tiny programs form the seed of much bigger efforts. My last two major projects, both now well-funded scientific programs, can be found buried in tiny-program / MIT form on my codepen. In fact looking at it again now I have a codepen littered with tiny personal programs, most of which are utility-driven, I'd completely forgotten about, and would make no sense to anyone else.
Most of mine are one-time use or limited use. I have a few ongoing dev projects for personal use:
- My smaller blog is a (poorly) written CMS that makes a static site. Almost zero reason other than I wanted the experience of building my own CMS, could easily use another tool.
- I have a 'Pick'em' with friends for MLS soccer. It's a fully coded website, definitely my biggest ongoing project.
- I have a tool which looks at upcoming soccer games around the world and recommends the best ones to watch (looking at a number of variables such as relative ranking in the league, historic goals for and against, gambling odds, etc.)
- I have a weight and body fat tracker I use to enter my daily weigh in and see graphs and charts of my progress.
I frequent ProductHunt to see what new products are launched. I usually click on every link. That takes time and hurts my fingers clicking. So I automated it and created an app called Rockmelon.
It became a tool that opens multiple links all at once. Once I had the basic foundation, I created a daily ProductHunt link, which opens all the links at once. You can subscribe to daily product hunt links here.
A simple html js collects my time and date, and come fields, and ajax it to Apps Script running as web app.
Script logs it into a sheet, recent rows on top.
The html page has a link to get the timesheet. On click, it again asks the apps script to send back this month's time sheet data as json, shows it as a table.
Although no chance, but still all of these ajax expect a password.
====
Recently I got into telegram bot, a multi bot. It has a /help command. Help describe the expected command keywords. Backend is again Google apps script. A string split, an switch case.
The dice roll thing reminded me I wrote a small multi dice roll visualization in flash that took (x) repetition of (y) dice rolls and added them together in bar charts for each repeated sum of values. I was stunned how it was flat when there was only one dice but started to look like a bell curve as the number of dice increased.
Later on when I took a statistics class and learned about CLT and normal distributions it really helped to have this intuitive understanding of how multiple uniformly distributed variables combined result in a normal distribution. (and probably why the bell curve distribution shape is so common for real world data)
When my wife and I were looking at buying an investment property, I built a little program to use Zillow's API to get tons of data for a particular area, make some calculations, and then sort the data in order of most potential profit as a rental (based on their estimated rental rates, which are not always perfect of course). Then I added some filters so I could find a property that met our other criteria.
It worked really great, and we never ended up buying a property, but I couldn't help thinking this is a premium feature that Zillow could easily offer and charge for. If anybody at Zillow is interested, feel free to reach out.
When I was first learning to code, I spent a few hours writing a python script to get Advent of Code files and prompts, then open them in an editor, and also eventually made a util to check the answers. Fun times.
I save articles into HTML files with TagSpaces or SingleFile to read them later but I could not find a way to serve them easily to a Kindle Paperwhite and read them there.
I create this simple project to fulfill this need. It was just a weekend project that it's already valuable for me.
I wrote a little web app (Python and CGI) to organise a secret santa ring. You put in a load of names with email addresses, then it shuffles them, and sends an email to each person telling them to buy a present for the next person on the list (wrapping round). It meant a group of friends could do a secret santa without one person having to know who was buying for who.
There's a way to put people in groups where they shouldn't buy presents for each other, which is useful for couples of families, where they will probably be buying presents for each other anyway.
These resonate a lot! Tiny projects are very rewarding, because you get something that works pretty quickly, this works well with my short attention span. Couple of ones I did in the last two weeks:
- A little mac app that reads my calendar, grabs the next 2-4 events and sends them over to my Vestaboard.
- Setting up Cloudflare as a failover load balancer to reach my home network (I have two ISPs for redundancy), this involved writing a small script to get the WAN IPs out of my Omada router and using that as a custom command in ddclient to update the DNS entries for both uplinks.
I wrote a very simple script to automatically download desktop wallpapers from http://simpledesktops.com/. I then cron'd it to place wallpapers in a folder, and Mac OS automatically rotates through the wallpapers randomly every hour. I love the idea of small, simple projects that make your life better.
I had a relly nice free seaside summer vacation because of a Python script.
In our country we got vouchers to take a holiday because of Covid, but I couldn't use Booking.com because not all landlords had the proper paperwork to be able to redeem the voucher.
I wrote a script to e-mail all the properly registered landlords from a government list in a particular region with my requirements and then manually selected the best offer. I had a really good time.
I have had many small scripts or software doing automation for me. One of them is the one that found me a motorcycle. It was a neat web console JavaScript code, which would go over the listings and score them with a pretty basic algorithm. I scored a good Cbr250 with that. In turn I dislocated my shoulder in the upcoming days :) I rode the bike for a few years. It was also my first and the last motorbike. Fun times.
Yes! Tiny programs! And from one of my favorite zine makers and big inspirations for switching careers / getting a programming job. I need to make more of these at work. API team too busy to build an endpoint my team needs literally every day? No shame in making a mini webscraper and never wasting another minute asking them :^)
When I briefly returned to the Windows world, I wrote a quick-and-dirty application that would clean the shortcut links that installs would clutter my desktop with. https://github.com/MattGHarvey/ShortcutCleaner
Created a python script that scrapes the holding lists for each of my ETFs and outputs an aggregated list of all companies I am invested in through the ETFs. Can also compute how similar two ETFs are based on their holdings. Has saved me some order fees because it drastically reduced the ETFs I am investing in.
My parents work at a care home and every now and then, they will have a funny issue that I’ll try solve with code. Like, the staff tried going paperless so important documents needed to be hosted somewhere and a QR code was used to link them. It’s little things like this that honestly bring so much joy
I thought about writing a program to get myself a vaccine appointment, but ultimately decided that we probably didn't want to vaccinate people in order of software engineering ability. I don't have to physically go to work, and can afford to have groceries dropped off in front of my apartment, so there was really no reason I should get the vaccine before everyone else. I can just self-quarantine with zero inconvenience or consequence, so probably a better use of limited resources to give it to someone else first.
But at the same time, I also feel like literally nobody is looking out for you personally in the pandemic. I got the impression that pharmacies flat out lied to the government about vaccine availability (city websites would be like "oh yeah your CVS has tons of extra capacity" but then they have no appointments, and when you do get an appointment and show up, they turn you away). In that case, you have no choice but to DoS them to meet your basic medical needs. (Insert rant about how I was first able to buy N95 masks and at-home COVID tests in January 2022, 2 years after the first case. Now I have them for next time, I guess.)
> thought about writing a program to get myself a vaccine appointment, but ultimately decided that we probably didn't want to vaccinate people in order of software engineering ability
I wrote one to help me register for a college class that was full. I faced the same ethical question, but I decided that it was OK because it was a computer science class.
Wanted to say one other thing; I'm not criticizing the author of this blog post for writing such a script. Their risk factors/assessment may be much different than my own, and that's totally fine.
> When the second COVID vaccine doses opened up, all of the slots were full. It turned out that the website’s backend had an API, so I wrote a script to poll the API every 60 seconds or so and watch for cancellations and notify me so that I could get an earlier appointment.
I imagine the hacked together COVID vaccination websites were already under quite a high load. If it's anything like unoptimized WordPress websites it's doing a database query each time and I really hope the API wasn't being shared by healthcare providers. The saving grace appears to be that the script isn't shared.
I guess this is a reminder to be careful when sharing scripts that rely on other's services (especially important services). Cache when possible, poll minimally, etc. Recently I found out that Ubuntu doesn't cache DNS queries by default, which I discovered when I got temporarily blocked from a DNS server. Good job I didn't share that script!
Julia writes so nicely, something about the way she talks about projects and things is so earnest. I have a brag document because of her and it’s helped quite a bit. I have my own list of toy projects and I think it’s good to track them especially to find code examples later!
I really liked writing a http server in bash because I started just to see if I could. I also really like my project to get the top reddit stories from each country.
* With the spikes of gasoline prices, I have developed a tiny program that find the station with best gasoline prices close to my position. This might become a public website in the future
* I have mostly automated my mailing list: I save the links in Raindrop, save to Notion, write a bit of text, and send through Buttondown. It’s still work in progress, but it works nicely.
* To fronting vaccine booking for my parents, I wrote a script that check if the vaccine was open for their age group.
* When I moved to my new house, there was some technical problems to activate my ADSL (the telecom company need to dig into the street and it was planned, but not scheduled). Then I wrote a scraper that every 2 hours check on the website if my address was available for a new ADSL line.
* My wife is working on property management. For law enforcement, at the end of the month, they need to send details about guests to police. It’s a tedious activity to make by hand because you need to fill up a form for every guest. So, my wife has prepared a form in Airtable that the guests must fill up with all the information needed; then I wrote a Lambda function that at the end of the month, get the data from Airtable, generate a file in the format for bulk upload and send it to my wife via email. I saved her hours.
That Covid vaccine project gives me chills. That’s not saying it’s wrong to use an advantage like coding skill or anything else to increase your odds of surviving a pandemic— but it’s a new world we live in for sure.
Edit: I guess I need to clarify I’m not asserting anything was right or wrong.
But advantages aren't always that obvious. In my case, it was just "don't reload the page while waiting for the server to respond" as the servers were DDOSed on the first day they opened the appointments. Obvious to many programmers, not so obvious to the general public that you might lose your position in the queue if you reload the page and not wait for a proper error page before reloading.
Another advantage was getting my PS5. I wrote a simple web scraper that just looked if the shops had any PS5 in stock and wrote that into a static RSS I uploaded to my webserver and stuck this into my regular RSS reader.
Over the last year, this way I could provide myself and 3 friends/acquaintances the opportunity to get a PS5.
Other people can build tables and shelves. I'm a programmer.
Have done the same but using a scrapper, not for COVID, but for an impossible to schedule appointment I had to do in a government website.
I still think it could be monetized but I don't feel like doing it. I heard a friend that there is a lot of people doing this manually and they charge you a considerable rate.
We had a similar governmentally organized system in our country during the first vaccination round where people could book an appointment. The website fell over and the devs introduced a queuing system and had you waiting in line. Except that it was badly implemented and only enforced client-side (through JavaScript) and hence very easy to circumpass. It also had a similar API which could be polled to see when a slot freed up.
This actually happens quite often. As another example, there is a particular country visa centre which requires you to make an appointment and is typically fully booked for weeks on end. The calendar info is loaded in through an API call and the selected date then form POSTed with a hidden field's value set to an identifier representing the date and time. Not in plaintext, but easy enough so that it can be guessed. Once you spoof the value, no further server-side validation happens and no one at the centre will check it.
I wanted to book a restaurant a couple of weeks ago. As I was discussing options with a friend, the booking provider already forced a refresh and our desired time slot was gone. Again, taking a look in the Network tab of the browser and spoofing a value led to a confirmation at the desired time. I expected a call saying that they were overbooked, though strangely enough the place was not packed (I guess they kept some tables open for social distancing / walk-ins / phone reservations).
This is really security 101 on the same level as SQL injection. Strange how every dev seems to know how to hook up something to an API but still makes the same mistakes.
When vaccinations opened up for the elderly, I wrote a script to check open slots and get my grandparents a vaccine appointment.
They patched it up, but similar to the author, I managed to get them one soon after through their website. I’m wondering if we’re even talking about the same website.
I code every day, even when my job has me busy with other things that aren't coding related. I love banging out tiny programs and scripts to solve problems.
When I didn't have a problem of my own to solve I'd hang out on the Unity3D forums and write little time waster demos of questions that people had such as "how do I make a snowboard game?" or "how do I make a fishing line and have it sag in the middle?"
I wrote a space invaders game for my online resume.
I've made a number of interactive touch screen and motion controlled robots and laser pointers on robot arms as cat toys over the years. Made one that streamed video and let people control the laser pointer via a web browser.
I've made a litter box cleaner robot that outsourced each cleaning to Amazon's Mechanical Turk. Robot arm controlled via web browser, video feed, Mechanical Turk assigns a "cleaning job" to a worker (human).
I wrote a script that would take all the video from a bunch of cameras and process them, down rez the video, and properly label it for a bunch of tutorial videos I created.
A voice controlled "artificial intelligence" assistant producer to help me record tutorial videos "Hey producer, roll VT, and give me a close-up on camera 1."
I lost a bitcoin wallet address - it wasn't a lot, a few dozen at most. I knew which computer the wallet was originally on, and I snapshot a picture of my desktop every few seconds and store the images on a file server. So I wrote a script that would take all the images and batch process a text recognizer on Linux to look for when the wallet was open. Et voila, my seed phrase.
I wrote a script that monitors our street facing front door via video camera for packages and sends an alert if a package is detected on the front porch.
A PowerShell script to move Chia plots from the plotter to the farmer.
A MACH driver for my weird little NextWave Piranha desktop CNC. A script that will generate the g-code to cut dove tails on my CNC for me, but also the Ruby code to generate the dove tail view in SketchUp too before I perform the cut.
When doing some extensive travelling for work back in 2013/2014/2015 I created a small Android app that would count down the amount of time until my wife and I got to see each other again and show where we each were on a google map.
I run Timesnapper on my Windows machines to capture images of my active desktop usage, so I created a similar, though much simpler application for Linux and macOS to do the same thing.
A script to emulate a macOS Fusion drive, marrying a RAM drive and an SSD for super fast builds AKA fast tiering.
And a bcache kernel driver for ESXi that would put a RAM drive in front of the SSD array for VMs that were doing builds or lots of drive activity AKA fast tiering.
Back in 2016 I figured out a script for Linux that would spoof the OS identity so that Linux machines could connect to the corporate VPN, masquerading as an iPhone.
An NDI plugin for Unity3D.
And a bunch of bots to play or multibox various online MMORPGs and hack-n-slash games. Which lead to paying work with a couple of companies who wanted me to figure out ways to stop that sort of thing.
And a computer vision game playing bot for a few online games that I didn't want to grind on.
A parallel 3D printer partioning system to farm out jobs to 3D printers at our local makerspace.
An out-of-the-box VPN proxy running on OpenWRT so that any device connected to the OpenWRT router was automatically on the VPN.
A C# wrapper around the FFMPEG library.
A SenseCam application and associated hardware.
A chrome & firefox plugin (no longer maintained) for a People You May Know sorter for Linkedin.
I created a voice activated application that can open and close the garage door for me "open the pod bay doors hal" and also switch the dust extractor on and off when I am working, though I have since replaced the dust extractor power function with a dedicated device that detects power tool usage.
I created an application that will copy USB sticks en masse for my wife's technical conferences, and also update a USB stick with any appropriate updates such as new slides or presented papers as speakers submit them.
I wrote a script that would go through each of the conference papers and put the IEEE copyright footer on them before submission.
My mother-in-law was a research librarian and she and a few colleagues needed to run a study, and they had applied for a $10K or $20K grant to conduct the study to determine which journals a group of universities should continue to subscribe too. Grant application denied. $10K-$20K of research to save a few hundred thousand. I wrote a script in a couple of hours, and got paid a large gourmet pizza, that gathered all the results needed and dumped them into a spreadsheet, and so a group of universities saved a bunch of money on journals they didn't need.
I wrote a script that captures video of multiple in-office cameras that captures my activity in my office throughout the day, and wired it up to a button that lets me pause the recording, or erase the last 30 seconds, five minutes or hour. It is hooked up to an "on air" light so my wife is reminded not to walk in my office partially dressed when the camera is active. It gathers all the video feeds, and the depth sensor data and dumps it on a server.
I wrote a little in home dashboard that tracks our wallets, our phones, our cats, weather for the week, upcoming meal plan, appointments, and so forth.
A "Waterfull ring toss" game with a big button, just like you remember from your child hood, made from a 55" Samsung TV I found on the side of the road.
A bunch of time zone synchronized wall clocks in our upstairs hallway, with VFD displays showing location weather, financial headline to give you something to talk about with your client in that time zone, exchange rate, and so forth.
A neural network to pick horses in a race, that eventually turned in to a small side business.
I'm currently tinkering with a gesture controlled viewer dependent holographic display made from those spinny LCD fans with HDMI input you can buy through Aliexpress.
And dozens more over the years. I don't think I'll ever stop working on random ideas like this.
We had been looking for a new build for some time and had settled on a development and specific house we wanted to buy, but it was still months away from being released. We were told they released houses in person first, then listed them online later that day, but I was bored and wanted to see when new houses were listed, so I wrote a scraper to alert me whenever a new house became available.
One day, we got a call from the property developer telling us the house we were interested in would be available in person from 10am the next day. Because we wanted to be certain to get it, we appeared at 8am, only to find that 3 other people were already waiting. Houses are released in batches of 2 or 3, so whilst we weren't hopeful, we joined the queue and waited.
At 9am, while waiting in line, I got an alert telling me that the house had been released online, so I open their website on my phone and paid the deposit.
At 10am, when the sales office opened, all hell broke loose as the person first in line (waiting since 5am...) discovered the house they wanted had already been reserved online. I'd effectively stolen his house. It was awkward to say the least as all of us were crammed into a tiny portacabin while this unfolded.
In truth, I felt awful for depriving him of the house he and his family wanted, but relieved that we had reserved the house we wanted after a 5 month wait. A few weeks later the developer got in touch to say that they had changed their policy nationwide and would only be releasing houses online in the future because of "the incident"...
Whilst I wasn't willing to give up our reservation, I worked with the person who had wanted our house so that they were alerted whenever a similar house in the same development became available. He got one, there's no hard feelings, and him and his family are now my next door neighbours.