Ask HN: What automation tools have you used to replace mundane activities? - <AUTHOR> For my travel site side hustle (beatthatflight.com.au/), I find and publish cheap flights for Australians. Sounds simple, but even if say, someone gave me the flights each day, there's posting the, sometimes to deals sites, as well as then editing it and posting it on my site, and out to social media, and then to specific mailing lists on mailchimp, depending on the source city of the deal, or type of post.
A LOT of that becomes tedious. Mailchimp can auto post to FB/twitter/instagram etc, but even converting the blog post into mailchimp emails gets tiring, as you need to choose a feature photo, the specific mailing list etc.
I'm a selenium guy, so have built some scripts to minimise some of it, but the rush each time of finding a deal still pains me when I think of the tedium ahead of publishing it.
Ideally, my goal would be to submit [to][from][when] to a script and the whole process would be automatic.  I can see that selenium could do it, but my goodness, it'd be slow and potentially flaky all via the web UI for those sites.
I'd love suggestions, examples of automation you've done, and tools used? <comment><USER2> I have a slack workspace that has several bots, some listen for specific keywords and or phrases around the web and post to the relevant channels. Other bots remind me if I'm slacking off (maybe stayed a little too long on youtube), remind me of appointments, to drink water, if a stock price falls and some more. Also have filtered rss feeds for business and finance news etc. All of these bots also have custom identities that make it much more engaging like Axelrod is my bot for finance related news.

Others tell me if my server is getting swamped, forward important emails like renewing a cert, a deploy failed, bug in prod or something else that requires often immediate attention. Chat widgets from sites in production also go directly to Slack so I can reply quickly if needed. (Gmail, Sentry, Freshchat, Ploi etc, integrate them all and filter out what's critical).

Everything generally operates on a 15 min interval or so it's not noisy and I've pretty much tuned it to only receiving specific stuff I want to see. Having a central assistant like hub to go to is very useful and time saving.

<comment><USER3> Oh cool, I didn't know if others were doing this. I've recently just started going down this path with some zero effort IFTTT triggers but I'm not happy with how infrequent they seem to trigger. My next step is to build my own set of listeners/scrapers.

<comment><USER4> I posted the same thing on a similar thread yesterday but if you're looking to build some scrapers and listeners and make it easy for yourself I'd highly recommend Huginn ([https://github.com/huginn/huginn](https://github.com/huginn/huginn)). I set it up a few months back and I've been using it to scrape all sorts of info and alert me on things. IE:

* A change in GBP -> NOK exchange rate, to indicate if it's a good time to buy ready for my next trip to Norway.

* Alerts on flight prices to help me purchase flights when they're at their cheapest.

* Daily digest email with content I'm interested in from HN and some web comics.

* A summary of new content coming into my RSS reader.

It works really well for this sort of stuff and I found it fairly easy to get up and running.

<comment><USER5> Thanks for the link! huginn looks cool and useful (good combination!). Impressive work by 179 contributors.

I have had numerous simpler projects automating my digital life but I made the (probable) mistake of always starting from scratch and writing stuff all on my own.

<comment><USER4> I was in a similar boat but refused to build my own system. Huginn was a perfect solution for me and I really enjoy using it. You can write your own agents if you need to but I haven't had to so far.

Since I set it up a few months ago I've been using it a bunch, it's event driven system is great for when you want to trigger off multiple streams half way through a flow. You can also go back through past events if you want which is really powerful.

</comment></comment></comment></comment></comment><comment><USER6> I use YNAB ([https://youneedabudget.com/](https://youneedabudget.com/)), which requires inputting every one of your transactions by hand or importing them from your bank. The downside of the import is it takes a few days for the transaction to show up and you need to give YNAB your bank username/password, which I'm not comfortable with.

I wrote this [https://github.com/buzzlawless/ynab-live- import](https://github.com/buzzlawless/ynab-live-import) to import credit card transactions instantly with no need of giving up my bank credentials.

The whole stack runs on Amazon Web Services. Simple Email Service receives a notification email from the bank that I've made a purchase, saves it to S3, and triggers a particular lambda function tailored to whichever bank the notification came from. The lambda function retrieves the email from S3, parses it for transaction data (account, payee, amount, date), and writes that data to a DynamoDB table. The table has a stream enabled, which triggers another lambda function when the table is updated. The function reads the transaction data from the stream and posts the transaction to YNAB using their API.

I've mentioned this on HN once or twice before and got some positive interest with people even submitting pull requests, which is awesome :) Going to find the time soon to review those and maybe add more features

<comment><USER7> That sounds a lot more complicated than just downloading bank statements and uploading them to YNAB and adds a lot more points of failure

<comment><USER8> It does, but it also keeps YNAB more in sync with your bank account, since transactions will typically take a couple days to show up in the statement.

<comment><USER7> Sure, but a database? Isn't that part of what YNAB provides?

<comment><USER9> One of the key features of YNAB is using it to actually inform you before you make purchases. By having it near instant (manual, or by this method), your decisions are fully informed when you make them.

</comment></comment></comment></comment></comment><comment><USER10> I used to work at an architecture firm that specialized in design and manufacturing. One of our more popular products was facades made from aluminum panels with "graphic perforation", a pattern of holes made to form an image at a distance. As you can imagine, for larger projects the number of unique pieces to be cut was into the hundreds. This represented a lot of time for our CAM programmers because the (quite mature and industry standard) CAM software we used was incapable of determining the proper cut orientation without manual input. This meant clicking holes a bunch of times per panel to switch which side of the curve was cut. No Bueno.

One of our primary CAD suites was Rhino which is very nice and has a great python API. So I wrote a full-fledged 2.5D CAM processor for that. This allowed us to batch process hundreds of these parts with a single click.

</comment><comment><USER11> Playwright is a new alternative to Selenium, and besides being cross-browser, is focused on performance, developer ergonomics and reliability (death to flakiness!). Might be worth checking out? [https://github.com/microsoft/playwright](https://github.com/microsoft/playwright).

Disclaimer: I work with the Playwright team at Microsoft.

<comment><USER12> Hi thanks for mentioning your project. Are there any plans to use it for automated UI testing for desktop apps? Selenium supports it (more or less) with WinAppDriver, which is another project from Microsoft.

[https://github.com/microsoft/WinAppDriver](https://github.com/microsoft/WinAppDriver)

<comment><USER11> Desktop support is definitely on our long-term roadmap! We're simply starting web, since it's an area we think we can make big improvements to, before moving on to the broader developer landscape.

As we build out Playwright, we hope to learn a lot about how to make automation more reliable, ergonomic, and enjoyable for developers. Ideally, we could then apply those principles/learnings to desktop, mobile, etc. automation too. Stay tuned!

</comment></comment></comment><comment><USER13> >>my goodness, it'd be slow and potentially flaky all via the web UI for those sites

Generally, I've had better luck using undocumented APIs for this kind of stuff. I was a heavy user of Selenium to automate many a task (I work in wholesale construction goods, tons of automations needed everywhere).

But then discovered that using internal APIs (which surprisingly don't change much) is far easier than trying to exception manage changing UIs.

Open up dev tools on your browser and watch the GETS/POSTS as you complete your daily tedium. I use Python (usually just requests and beautifulsoup is enough) to mimic the calls and I have yet to find a use case where I wasn't able to automate something online.

I'm currently developing an SDK for our 18th-century ERP system, which has no API. I've also automated getting shipping container tracking data from a various shipping lines and railroad company websites, many with complicated login processes.

Happy to chat, email in profile.

<comment><USER14> Yup. I did this with a local Android app, that tells you the gps location of a public bus. I sniffed the http packets, found the requests i needed and made a python script that pinged me at slack when my bus was 5 minutes from my bus stop. Useful when I worked at night.

<comment><USER15> I'm familiar with the web dev tools, but no clue about mobile. Can you point me in the right direction on how to do the same?

Were you using an android emulator on desktop or there's some way to easily do this on android?

<comment><USER13> I use mitmproxy or charles proxy with an android emulator, with an older version of Android so it allows for a man-in-the middle, without being finicky about certificates.

</comment></comment></comment></comment><comment><USER16> I have 141 custom scripts in my $HOME/bin. Most of it is in bash, but there's a couple of node.js scripts as well.

\- I _mostly_ automate my bookkeeping with a set of recurring & dependent taskwarrior tasks and scripts as annotations that I run with taskopen[1]. That's creating a bunch of folders, turning some emails in mutt into PDFs, gathering PDFs from emails, fetching bills with selenium, moving files from $DOWNLOADS into the appropriate bookeeping folder, putting a date on some files, turning the whole thing into a zip file, and sending it to the bookkeeper with mailx.

\- I automated the email send of my daily summary to my clients with mailx (so I can send it directly from vim)

\- I automated turning screen recordings into thumbnails+mp4 link (since GitHub only supports gifs)

\- I automated making before/after screen recordings for when I do noticeable performance improvements (page load/animations)

\- I automated booting/killing my development servers

\- I automated making PRs with `hub pr` (finding the origin/upstream, putting labels, etc.)

\- I bound to a key combo switching to the logs of specific development servers

\- I turned my client's time tracking (tempo) into a CLI because I got tired of using the UI to say I worked X hours on that ticket and 7.5 - X on the other. Now I only do `tempo log $ticket1 2h $ticket2 3h $supportTicket rest`

[1]: [https://github.com/ValiValpas/taskopen](https://github.com/ValiValpas/taskopen)

<comment><USER17> How do you like using Node for CLI? I started playing around with it a couple years ago, and at this point, I don't even consider BASH scripts if they involve the slightest bit of logic. Part of me feels like by going all-in, I'm going to lose touch with my ability to write direct BASH scripts, which are likely to work literally forever. Meanwhile, I expect my Node scripts to have a relatively short lifespan, particularly in that I'm leaning on NPM. It's been so nice though, I've decided it was a worthy tradeoff.

<comment><USER16> I've been doing pretty much the same thing. If the logic gets crazy, of if I want lots of subcommands, I'd write it with node & commander. There's only so much you can do with `jq` when it comes to processing JSON.

</comment></comment></comment><comment><USER18> I run Home Assistant with Zigbee devices for automatic lighting at home:

\- switch on when I get home and sun is set

\- switch on when I'm home and the sun sets

\- switch on in the morning, full brightness, coldest color to help waking up (really helps me a lot and is not as stressful as an alarm clock)

\- automatically turn light off when I (my smartphone) leave home (not visible in the WLAN for 10 minutes)

Will look into more automations there. Perhaps something about turning the heat up in the bathroom in the morning when the windows are closed (there are sensors for that).

I ran NodeRed on a Raspberry Pi too for some time, but I found that helped me only little. Mainly did logfile analysis through that but did not look into other use cases for me.

For work I've got the de-facto standard for the printing industry, I'm doing everything possible with that.

<comment><USER19> Interested why you use the coldest colour for waking up? I do the same, but use a sunrise simulation instead that goes from warm to cold.

<comment><USER18> Hm, maybe it's self inflicted torture. I just feel uncomfortable with the blueish light and will get up quickly to leave that behind me. Maybe I will give your sunrise simulation a try, might work just as well, not sure.

</comment></comment></comment><comment><USER20> I manage a Family Office and do monthly performance presentations with PowerPoint, the slides have an unique design, and updating them every month became extremely tedious and error prone.

I was already looking for an excuse to learn Python and this was perfect.

Instead of recreating the slides I created templates (just the last set of presentations) and update them with info directly queried from the database, using python-pptx and pyodbc.

This isn't exactly an example of a "tool", but I think the most important part isn't really the tool, but to be able to identify what you can automate. How you do it might range from DIY to paying someone to code for you, but the feeling after getting rid of manual processes is great!

<comment><USER21> Check out revealjs.com

<comment><USER22> Reveal is good but very hard to recreate ppt slides.

</comment></comment></comment><comment><USER23> I spend a lot of time with web automation

Especially for public library catalogues. There the webpage shows when the borrowed books are due, and you need to check it every week, or pay late fees. And you cannot set a bookmark, since you need to login first, which is tedious. So I automated it to renew all books and show me a warning.

And because that needs to run silently everyday, I decided to make it as fast as possible (and because I only had a single core cpu with less than 1gb ram). No browser, no javascript, no selenium, no python, no java. Only viable languages would be C or Pascal, and for memory safety I implemented everything in Pascal.

Because it is also tedious to build HTTP requests in native code and recompile it all the time, I then wrote a scripting language for it, all the webscraping is done in the script, but it is still fast because the processing is done in native code.

To read data from the HTML, I use pattern matching, e.g. \+ would read all links, and foo\+ would read all links with text foo.

Nowadays I do not even visit public libraries anymore, but the automation tool has become an open-source project at [http://www.videlibri.de/xidel.html](http://www.videlibri.de/xidel.html) .

I also started playing some browser games, but they are boring, so I stopped. But I want to stay in the highscore list, so I wrotes bot for them. Because they have anti cheat detections, you cannot send the http requests directly. For javascript based games, I wrote a bot with Greasemonkey. For flash games that does not work, so I have decompiled the flash file, added the automation functions to the flash, and then recompiled it.

</comment><comment><USER24> I use Home Assistant to automate a lot of stuff around my house. The one I use at least daily is a trigger based on the light switch in my bedroom. A double click down triggers an automation that turns off all the lights in the rest of the house, makes sure the garage doors are closed, and that the rest of the doors are locked.

<comment><USER25> One future Home Assistant project that I would love to implement is a whole house lighting system that gradually transitions all the lights from white/blue in the morning, to yellow/orange in the evening to aid natural melatonin production. Such a project would have to be fully automated, otherwise I'd forget to set it each day. Blue LEDs are terrible for sleep and throw off your body's natural sleep pattern. I got the idea from the excellent book "Why We Sleep"[1]. It's possible that a similar HA project already exists.

[1] [https://en.wikipedia.org/wiki/Why_We_Sleep](https://en.wikipedia.org/wiki/Why_We_Sleep)

<comment><USER26> I use Circadian Lighting [0] component for this one. Works pretty well all around the house.

[0] - [https://community.home-assistant.io/t/circadian-lighting- cus...](https://community.home-assistant.io/t/circadian-lighting-custom- component/61246)

<comment><USER25> Wow, very nice. This looks like exactly what I had in mind.

</comment></comment></comment></comment><comment><USER27> You mention selenium, i use Selenium IDE

Its a browser plugin that allows you to record and playback anything that you do in your browser.

[https://selenium.dev/selenium-ide/](https://selenium.dev/selenium-ide/)

There is a right-click action to record hovering over a section if it is hidden by css, its a well-known gotcha in wordpress admin listings and other sites that love to hide until you hover over a section.

I've still to look into whether the file format that is saved from selenium ide could be used within a virtual browser like phantomjs or the like.

For direct scraping, i tend to go straight to xpath with dom.

Its far more reliable than trying to get stuff out via regular expressions, that i only use when i need to get a certain part of the node value from a text node.

I used to use php for that, but i wrote my own programming language that uses a library called htmlquery (its a go library)

[https://github.com/antchfx/htmlquery](https://github.com/antchfx/htmlquery)

If i have to login, i fake each request with the correct headers. Plenty of libraries around that help with that for every language.

</comment><comment> Oldham-Made I threw together a quick python script which scrapes listings from cinemas local to me, along with each movie's IMDB score, and compiles the results into a weekly Friday-morning email which I send to myself and my SO.

It's nice to know what movies are out, and when we can book, without having to remember to check or wait for pushy emails from the cinemas themselves.

I'm planning on doing the same to email us the latest menus from our favourite restaurants/cocktail bars so we can see when they change.

<comment><USER28> Would love to see this turned into a website that does recommendations based on zip code.

</comment></comment><comment><USER29> Probably off initial topic, but:

\- FileJuggler on Windows, to automatically clean Desktop, Download folder and archive everything into a date-based folder structure in Drive.

\- AutoHotKey to insert text templates into everything (e.g. current date, formatted Jira issues, annoying things to type)

The problem with automation is that one will want to break even quickly [time saved > (time spent finding/setting/maintaining)] otherwise automation is just a glorified delayed action. Time saving is not the only reason for automating but I assume it's n°1's when it comes to personal use.

<comment><USER25> Some more items that I've setup in AHK:

\- Launching commonly used apps, like Notepad, Windows Explorer or Sublime Text

\- Launching commonly used websites in a browser, e.g. gmail

\- Paste from the clipboard into a language translation site (languageX to languageY via URL parameters)

\- Open a to do list in Excel (hard coded file path)

\- Text expansion for personal and work email addresses

\- With one keypress, open the train schedule on the website, type in the 'from' and 'to' stations, search

\- Text expand to symbols that I always forget, eg. euro symbol, hash sign etc

\- Google/Wikipedia search clipboard text

<comment><USER30> Hopefully you are prolific enough in AHK to use it directly, for all other people I suggest Lintalist:

[https://lintalist.github.io/](https://lintalist.github.io/)

which is a AHK based tool, very easy also for the "casual" user (like I am).

<comment><USER25> Thanks for linking this, I hadn't heard of this tool before (I've been using AHK for many years).

Another very useful tool that I recommend for automating PixelSearch and the like is Pulover's Macro Creator:

[https://www.macrocreator.com/](https://www.macrocreator.com/)

It spits out AHK code after recording actions (e.g. a long mouse and keyboard sequence), it's a great time saver for more complex scripts.

</comment></comment></comment></comment><comment><USER31> Take a look at Huginn [0], it's very powerful with the existing agents for taking input, parsing, and outputting data to different locations.

I use it mainly for when I can't do things in IFTTT or have sensitive things I'd prefer to keep in a self-hosted system.

0\. [https://github.com/huginn/huginn](https://github.com/huginn/huginn)

<comment><USER32> Now that you mention IFTTT. I've recently visited their website and found out it has a web hook "if". An http endpoint where you can GET/POST data and trigger actions on it.

</comment></comment><comment><USER33> Too many to list here, but one of my most useful ones is a Python script to help pay out affiliates.

It crawls through monthly CSV files provided by my payment gateways, finds sales and returns by a specific affiliate, calculates what I owe them and returns a dollar amount, a sales break down for each course, how to send it (paypal, wire, etc.) and who to send it to.

It's nice because it takes around 2 minutes to payout everyone each month with a very high confidence level in the results. Prior to the script, it was a stressful work flow with many chances of human error. I only did it once before automating it.

Another script I use helps me invoice my freelance clients each month. It's a Bash script and is open source [https://github.com/nickjj/invoice](https://github.com/nickjj/invoice). It saves me a ton of time every month since I can calculate how much I need to invoice folks in a few seconds with it.

</comment><comment><USER34> [https://smmry.com/about](https://smmry.com/about)

Summarizing long text-based articles! Found this on HN. Now when my family/ friends send me stuff they haven't actually read ... at least I can reply somewhat intelligently.

<comment><USER35> I'd still love to be able to self-host this.

<comment><USER36> It's development has stalled long ago, but you could try OpenTextSummarizer [0]. It is available on the Debian repos [1] and you can try a web interface [2] to see if it fulfills your expectations.

[0] [https://github.com/neopunisher/Open-Text- Summarizer/](https://github.com/neopunisher/Open-Text-Summarizer/)

[1] [https://packages.debian.org/search?keywords=libots](https://packages.debian.org/search?keywords=libots)

[2] [https://www.splitbrain.org/services/ots](https://www.splitbrain.org/services/ots)

</comment></comment></comment><comment><USER37> I have many cron jobs in AWS Lambda functions for many tasks.

I wrote a blog post about how to monitor a competitor website using Python / Lambda and serverless framework for deployment: [https://dzone.com/articles/monitor-your-competitors-with- aws...](https://dzone.com/articles/monitor-your-competitors-with-aws-lambda- and-pytho)

For lots of workflows we also use No-code/Low-code tools like Zapier / Integromat.

<comment><USER38> How much does that cost?

</comment></comment><comment><USER39> I used google scripts and google forms for some of my automation like:

1 - Notify me when Movie tickets are available to book. Used google scripts that run every minute and hit a URL to check if tickets are available now.

2 - Book a class when it's available, I have joined a Gym where you have to book a class before going, and the Zumba is very famous there the time it opens it fills up in 30seconds and there are limited seats, so if you are late it's gone. I wrote a script that checks and books the slot for me and then adds the same in my calendar. I extended the same using google forms when I want to book another class at some specific time which is currently not available if somebody cancels it will be available. The script keeps on checking until class start time, if available books and notify me.

3 - In my team, everyone plays Foosball and after lunch, it's everyday discussion who will play first and with whom. I wrote a script which will decide the matches and players in each team. I used the google app engine to deploy it, which is still running and just by hitting the API will sort the things for us.

There are a few other automation I did using IFTTT.

<comment><USER40> I wonder who else is refreshing the class registration page and filling it up within 30 minutes? Or do the special people get advance notice that registration is about to open?

I remember reading a wild tale of how someone made a program for a used car salesman that would check a particular car auction site to make sure they get a good deal (I wish I could remember the details, or better yet, find the URL)

<comment><USER41> You're looking for "Defcon 21 - How my Botnet Purchased Millions of Dollars in Cars and Defeated the Russian Hackers"

[https://www.youtube.com/watch?v=sgz5dutPF8M](https://www.youtube.com/watch?v=sgz5dutPF8M)

<comment><USER40> That should be it. Thanks, Deepthroat!

</comment></comment></comment></comment><comment><USER42> Automated investing and wealth reporting.

I use a few services to automatically invest money into a few different financial vehicles at a regular basis

* Vanguard finds (bi-weekly transfer into various ETFS)

* Titan Invest (robo advisor bi weekly)

* IRA and 529 (monthly)

I use personal capital to connect see view my cash flow and returns across all my accounts.

I have been doing this for the past 3 years and my returns have increased significantly.

I am 34 and I wish I had started doing this when I was younger.

<comment><USER43> Have you figured out a way to automate exporting of data from Personal Capital into somewhere else (spreadsheet, DB, etc)?

<comment><USER42> That's a great question. I haven't tried it but seems like you can access their private API. [https://github.com/haochi/personalcapital](https://github.com/haochi/personalcapital)

<comment><USER43> I've been building something that looks very similar to this for Mint in Ruby but am still implementing exception handling for 2FA. I'll have to check it out--thanks!

</comment></comment></comment></comment><comment><USER44> I use tasker on android along with a plugin to automate turning down my screen brightness in the evenings, turning off screen rotation in a particular orientation for specific apps (IE I prefer to text in portrait mode since I can see what I'm replying to).

I've semiautomated setting up a new laptop using a private repo with my dot files with some bash scripts. Started with linux, now works with Mac os x (but won't handle linux well and I haven't gone back enough to make it worth case by case stuff).

I still have to generate a public private key pair, and some things on macs aren't perfect, but I have a todo list for the non automated things in the repo. I get going less on new macs nowdays since the keyboards are such crap (fingers crossed this year will bring better 13 inch keyboards), but everytime I do it I add something.

</comment><comment><USER45> Last week I built an automated expense tracking dashboard on Tableau using SendGrid and Google Sheets. I use a Gmail filter to forward my credit card transaction emails to an Inbound Parser setup on SendGrid, which makes a POST call to my home server with the content of the email. A regex then captures the details from the POST body and pushes them to a Google Sheet.

Next I use Tableau Public to read data from Google Sheets and publish a dashboard to Tableau Public Online. Tableau Public automatically refreshes data on the server side from Google Sheets every few hours.

The good part is that all of this can run automatically without any manual intervention whatsoever and I get a beautiful near real-time dashboard for my daily expenses that I can access from anywhere (dashboard is publicly accessible but hidden).

<comment><USER46> Are you comfortable sharing your personal expenses with so many public sources?

<comment><USER45> Tableau Public is the one that makes me uncomfortable. If this dashboard continues to work well and be useful I'll look into self-hosted alternatives.

<comment><USER47> Metabase may be of interest as an alternative

<comment><USER45> Yeah, I've used it in the past. Problem is my home server is a tiny RPi Zero and Metabase is too heavy for it. I'll look into running it on AWS/DO if I absolutely have to.

<comment><USER47> I've given in and bought an energy efficient homelab server for a few hundred off eBay. Intel makes the nuc, Lenovo has tiny thinkcentres, and HP has the elite desk among others.

The strange thing is how many odd lxc container projects I've stood up just to play with. Proxmox is sweet.

</comment></comment></comment></comment></comment></comment><comment><USER48> Better Selenium alternatives would be - puppeteer, cypress, testcafe etc.

For Windows automation AutoIt is good. VBScript for MSOffice automation. Python/shell scripts for mostly everything.

</comment><comment><USER49> Ansible!

I've been working on a "mail to cloud storage" project on the side for fun, but also as an excuse to learn Rust.

As part of this effort, I decided to try out Ansible. Man, it is one great tool!

For development, I have all of my server "groups" pointing to the same host, so my Ansible playbooks install and setup everything on a single machine. Makes testing much easier tbh.

<comment><USER50> I'm currently migrating a system at work to using Ansible and I'm absolutely in love with it.

My next project will be creating Ansible Playbooks for my workstation, so I can easily re-setup my Arch workstations on Desktop, Laptop, private and at work.

</comment></comment><comment><USER51> A bit more basic, but I use two free desktop PC automation tools which I now can't do without.

1\. TyperTask ([https://typertask.en.uptodown.com/windows](https://typertask.en.uptodown.com/windows)) to automate common tasks like adding different email signatures for different addresses etc etc.

2\. ClipX ([http://bluemars.org/clipx/](http://bluemars.org/clipx/)) for managing a huge clipboard history file. This saves me SO much time it's unbelievable.

<comment><USER52> It surprises me how many people don't use a clipboard manager. I use PasteBot on the Mac.

<comment><USER53> I've had Ditto [0] on my PC for almost a year now, and I could probably count on two hands the number of times it's come in handy for me. Can you explain what is so great about having a clipboard manager? I feel like I'm missing something, and if it would become truly useful to me by using it a different way I'd like to learn.

[0] [https://ditto-cp.sourceforge.io/](https://ditto-cp.sourceforge.io/)

<comment><USER54> It depends on your workflow. I sometimes find myself alt-tabbing multiple times to copy stuff over. Othertimes I accidentally overwrite my clipboard and lose some text that I was writing. Being able to recover it from the history is nice.

I use Pasteapp on macOS and FastKeys on Windows, which comes with other useful stuff, such as a shortcut for controlling volume by using the mouse scroll wheel on the right edge of the screen, macros, and a text-expander. The ones I use the most are:

ddate = 2020-02-18 ttime = 03:40:26 nnow = 2020-02-18 03:40:28 @@ = my email

</comment></comment></comment></comment><comment><USER55> I just commented on something similar: [https://news.ycombinator.com/item?id=22345215](https://news.ycombinator.com/item?id=22345215)

Disclaimer, it's a project of mine, but if the websites you're watching are compatible that will save you some hassle trying to extract data.

Use a lot of google sheets as well, it's super helpful to make sense and use of the data you scrape.

You can check it out here [0], and feel free to ask if you need something.

[0]: [https://monitoro.xyz](https://monitoro.xyz)

</comment><comment><USER56> Autohotkey on windows is my goto tool. I don;t know much about it but I can do the basics like move mouse to x.y coordinate and click it, or send a string of keystrokes to a form etc.

<comment><USER57> Autohotkey is such a beast. I really miss that now that I've started using Linux. i spent nearly 4 years writing scripts to automate all sorts of things in windows but to recreate them on linux might take me much longer since i would have to learn maybe 6 or 7 different programs just to get the same features. but alas Windows was doing my head in so I had to jump ship!

<comment><USER58> Autohotkey is also a tool I sorely miss since I moved to linux so many years ago. Sadly, there is no linux-equivalent and no one seems keen on porting AHK to linux.

</comment></comment></comment><comment><USER59> Make is an incredibly powerful tool for managing any automated process, not just software compilation. It doesn't know how to do any of the individual steps itself, of course, but it lets you break down a process into indivdual small pieces that can be automated separately.

</comment><comment><USER60> 'make all' the things with (GNU)Makefile!

From pandoc pre-processing with a great tool called 'pp', to generating my CV in different languages and paper sizes, to ensuring my repositories have the latest .gitignore files.

I feel it requires a significant effort to setup, but once you're there, it eases your development flow and enhances reproducible outcomes, in my opinion.

<comment><USER61> I use makefile to front each project in a consistent way (whether it's my blog, a golang project or a hardware flashing setup, `make start` will probably work..)

</comment></comment><comment><USER62> We use Jenkins to run .bat files that package our video game, upload to Steam and spool up Gamelift matchmaking servers on AWS every night. Before this I did it by hand, now I wonder how I could ever have operated with that inefficiency!

<comment><USER63> Jenkins? .bat? That's some masochism.

<comment><USER64> Can you elaborate on how that's masochistic? The game likely needs to be built on Windows.

</comment></comment></comment><comment><USER65> In a somewhat similar vein to the OP, some of the details associated with publishing a new podcast can be rather manual and error-prone. This is especially annoying in the context of simple interview/discussion podcasts that don't really take all that much time to edit/post.

A fairly simple Python script can automate the fiddly things like creating XML for a new podcast and uploading things to wherever you're hosting. (I used to use a script to add intro and outro audio too but I now do that as part of the audio leveling process with Auphonic.)

<comment><USER66> It looks like you could build a small SaaS around this...

</comment></comment><comment><USER67> I build a web site [https://visalogy.com](https://visalogy.com) with help of a keyboard/mouse automation tool.

It was too simple to just automate and control my laptop with scrolling to certain web pages, xpath the elements, and copy-pasta data to a CSV file.

Nowadays, I use bash scripts to automate some scraping. Cron scripts in Travis CI are amazing, this [https://visalogy.com](https://visalogy.com) web site practically runs by itself thanks to them.

<comment><USER68> My kid just drop by when I was looking at your site and pointed out the flag you have for Sri Lanka seems a bit wrong - the lion in the flag is missing. :)

Anyway, great work to build such a useful site!

</comment></comment><comment><USER69> Greatly simplified, accelerated and automated the creation of project directories.

I have always been annoyed by creating directories for new projects. Always the same procedure. Always the same commands. Always the same source files. So I wrote a small shell function which created C++ and Python projects for me. But after a few months I started to learn golang. And there I was again. Creating directories and files myself. But at this point the function could hardly be extended.

So I started to transform my shell function into a powerful and expandable go application. Learning go by starting a new project and solving a personal problem at the same time? Perfect!

Now a few months have passed and proji has become much more powerful and diverse. The templates it uses, which are called classes, are not bound to languages or anything like that, you can create a class for really everything. No matter how complex the class is, proji creates the project in seconds. Class configurations can be imported and exported, making it easy to share them with other users.

With the latest version of proji there is a new feature that takes proji to the next level. Proji can copy the structures of repositories on Github and Gitlab and import them as a class which you can use locally to create your own projects.

Additional features: Classes support shell scripts, template files to minimize the boilerplate code you have to write, ...

[ 1 ]: [https://github.com/nikoksr/proji](https://github.com/nikoksr/proji)

</comment><comment><USER70> I jut begun to do some partial automation of website interaction with the extension Tampermonkey for Google Chrome to inject my own scripts on certain websites, often creating an additional control panel UI for custom actions such as scraping or data input. I use Tampermonkey in such a way that the code managed by Tampermonkey are only loading scripts that load my actual scripts from GitHub and other sources, such that I always get the latest published versions of my scripts.

<comment><USER71> would be interested to see why you use tampermonkey instead of GreaseMonkey. I tried both but stuck to GreaseMonkey as it was open source.

<comment><USER72> Not OP, but I decided to switch to Tampermonkey after GM version 4 which broke almost all my scripts due to the GM_## api changes. I no longer remember the exact details but it was poorly executed/communicated, and it's easier to switch to TM instead of updating all the scripts.

The dashboard interface in TM is a lot nicer than GM too

<comment><USER73> When Firefox stopped supporting legacy extensions, the Greasmonkey developers saw that as a chance to redesign their API (to use promises).

Tampermonkey used to be open source, but unfortunately isn't any more. I still use it though, as it has better UX (e.g. nicer dashboard, prefills @match when creating new scripts, better editor, etc).

An alternative to Tampermonkey that is open source and still uses the old style of user scripts is Violentmonkey (which also lacks in the UX department, if i recall correctly).

</comment></comment></comment></comment><comment><USER74> If you travel regularly, Tripit is a great service for organizing your flights and hotels on to your calendar (Google Calendar also does this with Gmail but it doesn't work reliably, especially if you book some of your travel via your personal email account). You can set up a free Tripit account and either forward your receipts to it or let it look into your email for them automatically. Add the calendar of your Tripit trips to your work Google Calendar. These now show up in as a second calendar but are not visible to your co-workers. Create a free Zapier account and use a Zap to automatically copy all events from your Tripit calendar to your work calendar, which your colleagues can see. If you want to be shown as available while traveling, you need to change the multi-day event that Tripit creates from busy to available. And if you change your flights, you need to manually delete the old ones. But, people will no longer book you into meetings when you're on a plane.

Zap: [https://zapier.com/apps/google- calendar/integrations/google-...](https://zapier.com/apps/google- calendar/integrations/google-calendar/10039/copy-new-google-calendar-events)

</comment><comment><USER75> * Home Automation, like opening shutters at sunrise and closing them at sunset or turning on LED lights at night when movement is detected and turning them off after a certain amount of time since the last movement. Z-wave relay modules control most devices, and the command-center is Raspberry Pi + Aeon Z-Stick (aeotec.com/z-wave-usb-stick/), which allows for a vast amount of flexibility compared to standard Z-Wave controllers.

* an extensive collection of custom made /usr/local/bin scripts which automate things such as video recording and encoding for youtube (recordmydesktop + avconv), backups, and certain time-taking and repetitive operations on websites (like downloading invoices; through selenium-webdriver - github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings)

* zaps on zapier.com for pushing data between multiple cloud services that would otherwise have to be moved by hand (i.e., Gmail email with matching subject to a task in kanbantool.com)

* autokey on Ubuntu, which allows me to type phrases like "!thx" and have them automatically expanded to i.e., "Thank you for your email!"

</comment><comment><USER76> Written couple of scripts related to storage space in Shared Drive Folder and Database storage. If the storage goes below certain threshold, then the notification is sent to the group email.

Using the google rss notification (e-mail) for keywords which I am interested in (e.g my name, stock ticker and company name etc).

I use www.hnreplies.com for alerts when someone responds to my HN comments.

</comment><comment><USER77> The script I get the most personal use of is for one of the _most_ mundane things you can imagine—automating the repetitive process of keeping everything on my computer up to date. By "everything", I mean:

• my OS packages

• my OS-overlay packages (e.g. Homebrew, Nix)

• the versions of any standalone SDKs I use, that aren't maintained as OS packages (e.g. Rust from rustup, the Google Cloud SDK)

• any globally-installed packages for the package ecosystem of each language I install such stuff from (not libraries, but standalone utilities, e.g. youtube-dl in pip, or Foreman in Rubygems)

Here's the script: [https://gist.github.com/tsutsu/270e09c68690ec85c51dbd054e22b...](https://gist.github.com/tsutsu/270e09c68690ec85c51dbd054e22b9ef)

I think automating this might help a lot of people, because people tend to forget that they even _can_ update a lot of this stuff, or they don't know there's a command to get certain things to happen at all. (E.g. did you know that `brew cask upgrade` will switch out your application-bundles installed via casks with newer versions?)

I never polished it up, though, because it's still frail in some ways. (I still don't exactly trust the way it does pip package updates, for example; sometimes pip decides to upgrade packages into an inconsistent state where a package's deps get too new for it to use.)

But the idea is that you run this _interactively_ , first thing in the morning when you sit down, in its own fresh terminal window, right after maybe letting your computer restart to update to a new OS version. It's like putting your workspace in order in the morning. It's doing the grunt work, but you're still making the decisions and fixing the exceptional conditions.

\-----

I feel like this _could_ be polished into a universal tool that'd literally update _everything_ for _everybody_ with one well-known command.

But, better yet, the problem could be reversed, and a standard for registering installed package ecosystems and their respective update/clean/etc. commands could be created, that installed ecosystems could register with by placing files in a directory (like e.g. pkg-config or bash-completion) such that this command could outsource its smarts to the ecosystem creators themselves.

</comment><comment><USER78> I work at a local college and was recently tasked with collecting and aggregating instructor workload requests. We are in the planning stages of which courses each instructor will teach in the fall 2020 semester and my department wanted an easy way for instructors to submit their requests as well as be able to see what courses other teachers have requested and which are available.

Manually, if have to receive each spreadsheet or email of choices from each instructor and then add it to an Excel spreadsheet of some sort. This wouldn't have been live at all.

So I came up with a system.

I made an excel proposal template each instructor fills out with their name, school ID and the courses they want to teach as well as the hours they'd have available for each course. They then send it to my email which has a rule on it to send excel attachments to a Gmail account I own. This is because I can't access the API of outlook so I need to get outlook to send this stuff to my Gmail account. My Gmail account has a watch on it so whenever an email comes in to it, I get a push request on my server. My server reads the contents of the excel file and sends it to a database.

From the user side, if a teacher wants to access the full list of what courses each instructor has chosen, I've made a website in react with an excel like row and column layout where the columns are each teacher and the rows are the courses. Where the two meet we have the hours the teacher wants to teach for that course. When this page is visited, it pulls from my database and populates the whole thing with the latest data. The site can also export all the data to an Excel file to be implemented once all the teachers have made their choices.

I learned a lot with this project. Learned react, setting up https, basic authentication, postgres, running a server and routing, and a while lotta other stuff. Super valuable to me in my learning even if I could have spent less time doing it manually!

</comment><comment><USER79> I've started playing with some things with node-red + open hab to control my lights, but more in line with what you're talking about I've also played with Huginn for automating some small daily actions and webscraping. So far it's been going well but I'm not doing anything terribly difficult yet.

</comment><comment><USER80> Hey, I recommend you RPA (Robotics Process Automation), there some open source option such as Open RPA or community options as UiPath. Actually I work as an RPA developer and you can automate whatever you want. For example read an email, capture that information in an Excel and fill web forms based on the excel.

</comment><comment><USER81> Be careful, my antivirus blocked the site when I visited the "Privacy" page from the top menu.

[https://www.virusradar.com/en/HTML_ScrInject.B/description](https://www.virusradar.com/en/HTML_ScrInject.B/description)

</comment><comment><USER82> I run a robotics themed weekly newsletter as a side project.

At one point I decided that it would be nice to add header images to every issue. I decided to do it through a quick and dirty python script that adds the text for me.

Another thing I've just recently automated is the python script calling mailchimp API to show me the most popular link together with unique opens. I'm currently planning to embedd this info in every issue.

The next step that I'd like to automate is the campaign creation. With the API I don't suppose this will be a huge deal, just need to put some time on this. When I have it then I'd like to create a commit hook that will do all of these things automatically after pushing changes to the repo.

</comment><comment><USER83> In the engineering office (non-software) I work in, I've done wonders with classic scripting for me and my colleagues. Some Excel VBA, lots of Powershell, AutoLisp, etc. Doesn't need to be shiny to be effective.

</comment><comment><USER84> What about headless chrome and some cron jobs to run tasks for you. It'd be similar to selenium. But, on a headless browser. There are also some scraping services that let you get data on a set interval with a phantomjs scraper. I have one that uses apify and then notifies a zapier hook on success and then zapier posts to my google sheet. My webapp then calls a GCP instance REST API endpoint which internally calls the google spreadsheet through an exposed api, cleans the data and sends back to the webapp.

</comment><comment><USER85> This one is a shameless plug (I created the app) while it's still in early stages of development, the core features are working, I use [https://github.com/rmpr/atbswp](https://github.com/rmpr/atbswp) to automate demos, whenever I have to present a demo in front of people, I just record it before and replay, but the app can have many use cases beside this. You're only limited by your imagination.

</comment><comment><USER86> I use a collection of tools from this repo to automate mundane developer activities such as posting release notes slack messages containing linked pivotal or Jira story titles: [https://github.com/sufyanadam/pivotoolz](https://github.com/sufyanadam/pivotoolz)

There's a bunch of stuff in there that saves you seconds each time you have to work with a user story or cut a branch or merge etc... Saved me a bunch of time over the years!

</comment><comment><USER87> Airbnb experiences will not add an API, so if you run any kind of tours, you have to go the App to add/remove/change dates/prices/starting points.

Selenium takes care of it now.

<comment><USER88> Everytime I use Selenium, even for legitimate use cases, I feel dirty deep down under. My soul writhens and I want to do something else in life other than writing Selenium automation - perhaps chop some wood.

</comment></comment><comment><USER89> I've used IFTTT a bit, along with Zapier. Biggest issue is trying to do multiple actions when you need to automate tasks for multiple rows of data at a time.

<comment><USER90> Look at Integromat. I used to use Zapier but have moved mostly over to this instead.

</comment></comment><comment><USER91> Usually, my download folder is quite messy. I wrote a script to re-organize any such folder using a simple CLI. It also has a config that can be updated to account for different file types or categories.

[https://github.com/functioncall/neat](https://github.com/functioncall/neat)

</comment><comment><USER92> slightly mundane, but I'm an academic and my cv needs updating a _lot_. I finally got latex to work on netlify, and now all I have to do is update a yaml and push a commit and my cv is updated.*

* At least on one of the three locations my cv lives... the next step is to point all the other domains at my new CI/CD home...

</comment><comment><USER93> I manage two calendars for work and often have to make sure my calendar events exist on both so I don't get double booked. I wrote [https://syncmycalendars.com/](https://syncmycalendars.com/) to automate and simplify that process for myself and others.

</comment><comment><USER94> I started with selenium and still use it when I have to but try to just make http requests and parse responses directly whenever possible. Probably my favorite travel-related script was one that watched for an opening at a hard to book hotel and snatched it up when it became available.

<comment><AUTHOR> and to parse the responses (Assuming they're HTML page sources, not json/xml) - you using scrapy or something else?

<comment><USER94> I pretty much always use lxml. It has an html method but I typically just use etree.parse(). It's very fast and has excellent XPath query support.

</comment></comment></comment><comment><USER95> I use telegram, ifttt, Google sheets to calculate expenses.

At my last job, I used Zapier & Zoho CRM to automate creating leads from email requests which saved me hours of time.

<comment><USER96> Was at a startup that was super low-overhead (and as dysfunctional as a 4 person team could be), we used Zapier to automatically create Gmail drafts as replies to new lead enquiries on the website and follow-up responses as needed. We could then spice up the response if needed, or just bulk run through and hit "Send".

Appears personal to all email systems and spam filters, but actually was semi- automatic marketing automation.

</comment></comment><comment><USER97> Maybe check out huggin

</comment><comment><USER98> Unfucking the many many ways that banks screw up exporting financial transactions into well-formed OFX files that MoneyDance can consume

</comment><comment><USER99> Have you tried [https://pipedream.com](https://pipedream.com)? You can run Node.js (with any npm package) on webhook/http requests, emails and schedules for free. It also manages auth (including oauth token generation and refresh) for popular apps like Google Sheets, Discord, Slack and Airtable -- just use the auths object to reference tokens and keys in code.

<comment><USER100> Looks very promising! However the pricing is opaque. What will this cost me, if my business becomes successful and hit their free tier rate limits?

[https://docs.pipedream.com/pricing/](https://docs.pipedream.com/pricing/)

<comment><USER101> Hi, I'm a co-founder and engineer at Pipedream.

Paid tiers are coming soon, and if you hit our daily compute limit before that, we're happy to raise your limit to make sure your workflows run without issue.

Let me know if you have any other questions! Feel free to reach out to me directly at dylan [at] pipedream [dot] com.

</comment></comment></comment><comment><USER102> auto delete certain messages from gmail after 30 days . i use filters to tag messages as "autodelete" and create a google script that runs periodically to delete them . It shouldn't be so hard to do something so simple.

<comment><USER103> I'm fairly certain this is how the "trash" in gmail works by default.

Anything that gets sent to there stays there for 30 days then is automatically deleted.

<comment><USER102> i mean, for my own reminders and messages that i forget to delete.</comment></comment></comment>


Android KTX: Kotlin Development for Android - <AUTHOR> https://android-developers.googleblog.com/2018/02/introducing-android-ktx-even-sweeter.html <comment><USER2> > You may notice that Android KTX uses package names that begin with androidx. > This is a new package name prefix that we will be using in future versions > of Android Support Library. We hope the division between android.* and > androidx.* makes it more obvious which APIs are bundled with the platform, > and which are static libraries for app developers that work across different > versions of Android.

Ugh, okay. It's going to be a blast refactoring all my existing code and custom tools to reference this new package.

<comment><USER3> Hopefully just a couple of simple global search and replaces? Anyways I think the current support library structure is confusing and it's a good thing that they will refactor it.

<comment><USER4> Android Studio handles that pretty well and it'll probably fix most of those in a single "Optimize imports" pass.

</comment></comment></comment><comment><USER5> As an alternative to learning Kotlin on Android, you can spend the time learning flutter. Then you get concise code which works on Android and IOS now and on other platforms in the future - including desktops.

<comment><USER6> And it's made by Google, unsurprinsingly.

A big plus for Kotlin is that being a jetbrains project, it has top of the line intellij tooling support right at release date.

<comment><USER7> If it's made by Google, shouldn't we avoid it as it's likely to be discontinued in a few months?

<comment><USER8> Flutter will be official development platform for Google Fuchsia, their next big OS*. Google is supporting Android and iOS with flutter So that they can have plenty of apps available already when Fuchsia is launched.

With the big investment they are doing in Fuchsia it seem unlikely they will abandon it soon.

<comment><USER9> Big investment? Their next big os?

Please give us some sources, as to me it's just a project a team there is developing, and so far it can just as well be an experiment with no future.

</comment></comment></comment></comment></comment><comment><USER10> Not to be confused with Kotlin Android Extensions, which although handy is really just a convenient way to reference views in XML.

[https://kotlinlang.org/docs/tutorials/android- plugin.html](https://kotlinlang.org/docs/tutorials/android-plugin.html)

<comment><USER11> Kotlin Android Extensions is a tad more than that. It's also a View cache that grabs all view references in a single pass. I routinely have to explain to other senior Android developers that findViewById() traverses the entire view hierarchy until it finds that ID each time you call it. This won't be noticeable with simple views, but becomes a bigger problem as complexity increases. Which also results in more wasteful calls to findViewById().

Android Data Binding does something very similar to Kotlin Android Extensions, which is why it also perplexes me to see experienced devs bind a model to a view and then call findViewById() to alter it. I'll see calls to binding.getRoot().findViewById(), which is crazy redundant.

</comment></comment><comment><USER12> Still working in Java on Android. Have a feeling that I will be left behind soon.

<comment><USER13> Same here. On my my most recent project the client requested we use Java, since after they take over they can use devs with Java knowledge.

<comment><USER14> It will take a week or two to convert experienced Java devs to Kotlin.

<comment><USER13> Yea I agree. I like Kotlin a lot and found the transfer from Java to Kotlin fairly straightforward.

Just not all clients are open to one more thing for their devs to do/learn. In the specific case for us, the devs were new to Android so they wanted to use a language they were comfortable in.

<comment><USER15> If they are new to Android how are they comfortable in Androids' take on Java? Trying to use paradigms from enterprise/server side Java in Android is going to backfire hard on all but the most trivial projects.

</comment></comment></comment></comment></comment><comment><USER16> Curious, is anyone inside of Google using Kotlin for their Android apps, or is this all for third party developers?

<comment><USER11> I heard the Android data binding compiler was written in Kotlin. At KotlinConf, they announced that Google had dropped Java altogether for writing Lint rules because of Kotlin's much greater capabilities for handling deprecated code and IDE quick fixes.

<comment><USER17> Wasn't the linter thing just about moving the lint rules (for checking proper Android API usage) to a language-independent format so that they could be shared by Java and Kotlin? Previously they only worked for Java code.

<comment><USER11> You can watch the KotlinConf session video by Tor Norbye. It was what you said and more. To clarify, I meant they dropped Java internally for their own lint rules, not that they dropped support.

[https://www.youtube.com/watch?v=p8yX5-lPS6o&list=PLQ176FUIyI...](https://www.youtube.com/watch?v=p8yX5-lPS6o&list=PLQ176FUIyIUY6UK1cgVsbdPYA3X5WLam5&index=9)

</comment></comment></comment></comment><comment><USER18> some examples are fine, but come on...

> Uri.parse(myUriString)

vs.

> myUriString.toUri()

I'm not sure if I would prefer the second one...

<comment><USER19> Discoverability via autocomplete is much higher in the second one. Extension methods probably seem really strange to anyone coming from a FP background (myself included), but in practice they've ended up being pretty useful when paired with Intellij.

<comment><USER20> Doesn't it get a bit overwhelming to get a huge list of choices with autocomplete? I've never done any serious work with Java or Kotlin, so I'm genuinely curious.

As long as you have good docs, I find discoverability is rarely an issue. One of the first things I do when picking up a language is look through its built- in constructs, to familiarize myself with the available options.

<comment><USER4> Hmm, have you used any of the Java-based autocompletion systems? - IntellJ / Android Studio autocompletion system is context aware and will only list relevant methods (which means that the list is rather short and useful for the context). Which is a stark contrast to many ctags-like autocompletion systems, which will just dump all the symbols on you and aren't very useful in my experience.

Using autocompletion means you don't have to leave the editor window and I've found it hugely useful for methods which have several overrides - instead of leaving the editor, you just choose the one you need as you type.

<comment><USER20> Most of my experiences with Java were during college with Eclipse. I just remember finding it rather frustrating to have the autocomplete regularly popping up and showing me dozens of options without an easy way of learning more about em.

At some point I read through the Kotlin docs and found it interesting, but didn't have any projects in mind for it. I might try my hand again along with IntelliJ / Android Studio.

I've happily used other JetBrain products such as RubyMine and WebStorm.

<comment><USER21> With autocomplete open in IntelliJ, you can press F1 to view the docs for that currently highlighted autocomplete method inline. Works really well.

</comment></comment></comment></comment></comment></comment><comment><USER22> We've already seen something similar before: when Apple "modernized" many of the their Cocoa Touch APIs to work better with Swift.

<comment><USER23> Can you elaborate on what we have seen? Modernization in quotes suggests that Apple wasn't successful.

<comment><USER22> I put modernization in quotes because in most cases it was really a shim placed ontop of the existing Objective-C API that changed some names or parameter types; so, in this case it wasn't _quite_ as extensive as a Java->Kotlin transition would be since Objective-C already supports many "modern" features such as closures.

</comment></comment></comment><comment><USER24> Laughed when I saw this Apache Groovy code slinking away at the bottom of the article:

> To start using Android KTX in your Android Kotlin projects, add the > following to your app module's build.gradle file:

      repositories {
        google()
      }

      dependencies {
        // Android KTX for framework API
        implementation 'androidx.core:core-ktx:0.1'
        ...
      }

<comment><USER25> Yes - that's Gradle's language de jour right now, though there is a ton of effort being put into supporting Kotlin as an alternative scripting language for it. I think you could use it right now actually.

</comment></comment><comment><USER26> Florina killed it again! go go girl (She's a genius)

</comment><comment><USER27> Why is it that these large web companies can put out such sophisticated tools, and yet can't make a functional web page? Literally cannot see the content you are trying to show me.

[https://imgur.com/a/lXY8J](https://imgur.com/a/lXY8J)

And no, there's no scrolling or zooming allowed.

Seriously, let's stop the focus on web framework du jour and actually make web sites that work, please.

<comment><USER28> Well, if you think about it in terms of priority, making better tools that literally millions of engineers will be using to develop apps for billions of people has a higher impact than improving a blogging platform that is used by a handful of people at Google.

That's not to excuse the shitty state of web on mobile, but let's face it: we are talking about completely different teams and priorities.</comment></comment>


Google Ad supported free car? Would you drive it? - <AUTHOR> http://www.zurb.com/article/523/would-you-buy-a-car-from-google

<comment><USER2> Google is slowly becoming too much invasive, and we are happy and pleased.

I was thinking today that with all google serivices that i'm using such as gmail, google voice and (just begin few weeks ago) latitude, every information about me could easly show up by just clicking few times.

Driving a google ad sponsored car? why not :-)</comment>


Startup Marketing Mistake: Losing People Through the Bottom of Your Funnel - <AUTHOR> http://www.softwarebyrob.com/2009/12/15/startup-marketing-mistake-losing-people-through-the-bottom-of-your-funnel/

<comment><USER2> _if your conversion rate is 1%, losing a single customer is like 100 people never coming to your website. Strike that traffic from your logs._

I'm not sure how well this actually holds up logically. (There are other parameters to take into account.) But it's a reasonable motivator to analyze retention in your specific case.

</comment><comment><USER3> In other words, don't forget to actually _make_ something. I don't think this will be much of a worry for such a technically-minded community as HN.</comment>


Every '… is down' posts. - <AUTHOR>

I wanted to complain on the GitHub thread but I wanted to hear the rest of the community's opinions before I spoke.
What's everyone's views on the "Github is down", "Heroku is down." To me, they clutter what's meant to be about news, and exciting new developments. Often I think of these as karma bait (though I don't always assume that of everyone - I believe there are genuine people.)
It doesn't help anyone though, does it? If Github's not working for me, I'll check "isitdownforeveryoneorjustme", ask on Twitter or prod someone on IM. To me it's noise?
Do people find them interesting? Or beneficial to the community? If so, what is it that I'm missing? <comment><USER2> They do seem a bit pointless, especially when the problem will be self- evident, and verifiable with one Google search. They get even more pointless when they get spammed, because nobody checks the feed before posting.

It's also fairly off-topic. It's categorically not news, nor is it startup promotion. I don't get the logic either. just because you can do it, doesn't mean you should. I could post what I had for lunch as a thread, but I won't, I understand context. I'm getting fairly angsty about it now, or at least sounding angsty. But it doesn't bother me a lot, I just move on to the next item. I still think it should be kept to a minimum though, after all if we don't keep some semblance of order then HN will just waste away with low quality items and people will move on. Although that might not be a bad thing if a better replacement pops up.

</comment><comment><USER3> I think "x is down" posts are relativley meaningless anyway. For many (especially the larger) services with multiple components,spread over many servers and data centers, what does it really mean to be down? If I can't sign in is it down? If nobody on the west coast of Canada can get in, is it down? If you can read, but not post is it down - if the front end is up but the database is not, is it down?

It's pretty rare that 'gmail is down'... much more likely that x% of gmail users are having issues. Let's save the 'x is down' post for when it really is 'down'.

</comment><comment><USER4> I see it as useful sometimes if I didn't hear about it from some other means. Maybe they also serve as a discussion point for people to have a bitch about the downtime?

<comment><USER5> I'm curious as to how it's useful if you didn't hear about it. If you attempt to go to the site, you will see it's down. You will waste negligibly more time than reading the words "Site is down" but you will only waste this time if you actually try to go to the site. It's not particularly useful if you aren't trying to use the site but it still takes up a slot on the front page.

<comment><USER6> Like a traffic jam. Its obvious once you're in it. Sometimes, nice to know not to bother. Etc.

<comment><USER5> Unlike with a traffic jam, bothering has a very small cost, especially as compared to the cost of reading "X is down" on the HN front page.

<comment><USER6> Understood, but still if XYZ is down at 9AM and you don't need to go there untill 11AM, you're not likely going to check. So then, you go about doing PQR task all morning, to then find out its still F@cked at 11AM. So, the cost is not the 30 seconds to figure it out, but the whole AM you wasted.

Or alternatively, all the time you pre-emtively are checking all over the place at T-1 for using it at T. Depending upon the resolution of this, that can be a PITA and a waste of time. Far more than you skipping over 1/30 of a page on the internet.

Alternatively, there may be some better way to do it. There could be a list/screen for relevance to the community or a seperate page or whatever. But one needs to address or dimensionalize the tension between information flow and efficiency a bit more than your first formulation.

</comment></comment></comment></comment></comment><comment><USER7> These are services that a lot of HN users use. Also, the discussion and cause of the down time could lead to good advice for members.

<comment><USER8> I do wish that if, say, GitHub is down, people wouldn't post a link to GitHub that _won't load because GitHub is down_.

If people want to post a link to a GitHub status page that provides more information, then fair enough. And if people just want to discuss the outage and there's no good source of information to link to then make it a self-post. But linking to a site that's down seems perverse.

</comment></comment><comment><USER9> Postmortems are interesting. The "is down" posts are not.</comment>


Ant colony optimization - <AUTHOR> http://www.scholarpedia.org/article/Ant_colony_optimization

<comment><USER2> I implemented this and extended it as part of my undergraduate thesis was back in 1999. I extended into automatically planning carriers channels in 2G mobile phone networks. Always meant to go back and try this out on today's hardware!</comment>


Show HN: Securely Handle Encryption Keys in Go - <AUTHOR> https://github.com/libeclipse/memguard <comment><USER2> Looking at this more closely, this takes arbitrary buffers of data and uses syscalls such as mlock to prevent paging memory to disk, as well as cleans up at the end by zero'ing out the buffers for you.

Has this been audited in any way? Is there a garuntee that the Go runtime won't, say, keep a duplicate of the buffer you copy() from in memory somewhere that can be paged?

Additionally, a technical description of how this works in the README would be nice for those that aren't familiar with how the memory gets locked.

Neat project. Curious to see how this develops.

<comment><USER3> The linked approach does not work for exactly the reasons you specify. Go can and will move and copy memory around as it sees fit, which defeats the purpose of this library. You _must_ manage the memory yourself to have any chance of doing this reliably.

[https://news.ycombinator.com/item?id=14174500](https://news.ycombinator.com/item?id=14174500)

<comment><USER4> Does hashicorp's vault have similar problems?

<comment><USER5> Yes, but it's (reasonably) excluded from their threat model: [https://github.com/hashicorp/vault/issues/1446#issuecomment-...](https://github.com/hashicorp/vault/issues/1446#issuecomment-221625921)

</comment></comment></comment></comment><comment><USER6> Prior art: [https://github.com/stouset/go.secrets](https://github.com/stouset/go.secrets) (with a technical description at [https://github.com/stouset/go.secrets/blob/master/secrets.go...](https://github.com/stouset/go.secrets/blob/master/secrets.go#L4))

<comment><USER7> go.secrets uses the libsodium sodium_memzero to clear the bytes, whereas memguard sets each byte to 0.

I feel more comfortable with the first, but can't exactly explain why. memguard seems better organised in the repo like a ready to go package; I think go.secrets would be a better solution if it was organised as well as memguard.

<comment><USER3> Author of `go.secrets` here (it's defunct, btw). Memguard, at first glance, will _not_ actually do anything. Why? Because go's garbage collector can and will move and copy memory as it sees fit. `mlock` on a go-managed buffer just prevents the original memory location from being swapped out to disk, but does nothing to the copies that the go runtime will periodically create.

This is why I used libsodium (I also implemented this same concept, much more maturely for Rust[1]). If you want this approach to work, you _have_ to manage the memory yourself.

In the Rust version, I also use Rust's ownership rules to automatically `mprotect` with `PROT_NONE` when it's not in use, `PROT_READ` when it's being borrowed immutably, and `PROT_WRITE` when it's being borrowed mutably, all with static compilation guarantees. Plus libsodium creates guard pages before and after the allocation (ensuring no underflows or overflows either into or out of the allocated memory space), and also places a canary before the allocated region that panics when the memory is freed if the canary has been modified. It's far, far more than a simple `mlock`.

I have a rewrite half-in-progress[2] that handles stack-allocated secrets with fewer guarantees (`mlock` and zero-on-free) but that's more appropriate for short-lived stack secrets.

[1]: [https://github.com/stouset/secrets](https://github.com/stouset/secrets)

[2]: [https://github.com/stouset/secrets/tree/stack- secrets](https://github.com/stouset/secrets/tree/stack-secrets)

<comment><USER8> You could evade the runtime relocation by copying the data into a new buffer allocated by mmap.

<comment><USER3> You could, but then you still have the original data in the original location which needs to be scrubbed. And go does not, to my knowledge, provide semantics that allow for doing this in a way that should be considered cryptographically reliable.

The go runtime might optimize away your memzero, or it could have created other copies that you don't have a handle to.

In the Rust version of my library (and maybe in the go version, it's been ages since I worked on it), I go out of my way to make it difficult to copy data from runtime-managed memory into a secret buffer. You _can_ do this, and it makes a best-effort attempt at zeroing the data when you do, but you lose a lot of hard guarantees when you do.

<comment><USER9> Not really, you're suppose to use memguard to create a slice then an address is returned; there is no original data.

<comment><USER3> The GP specifically mentioned copying data into an `mmap`'d buffer. My point is that copying presupposes secrets already in managed memory, and at that point you've already lost.

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> Why is Protect a non-blocking call? That means that after I call Protect on some data, it's not actually protected yet.

<comment><AUTHOR> Hey there! Thanks for this advice, I'll definitely consider this in the next release. Like I said in other parts of this thread, the project is in very early stages right now and, as I understand from reading a lot of the replies, I seem to have missed a lot.

All of this stuff will be fixed soon.

<comment><USER3> I would strongly encourage you to just wrap `libsodium`. The authors have thought about this problem a lot, and have done the hard work for you — there is a surprising amount being done behind the scenes to give the kinds of guarantees cryptographic keys warrant.

If CGo isn't acceptable, at least use their implementation to guide the design your go-native version.

</comment></comment></comment><comment><USER10> This is fun in theory, but doesn't really give you a lot in practice. A few random points:

* On many server systems swap is already disabled today (for availability reasons), so you don't really win anything. (Although what you're doing also won't hurt, so it's fine.)

* On many desktop systems on the other hand, swap is not the only reason for memory to end up on disk, mainly due to hibernation modes. This doesn't just include OS-implemented hibernation modes, but also firmware-provided ones (e.g. Intel's RST.)

* If you're running in a VM (in the cloud?), the hypervisor pretty much doesn't care what you lock in memory.

* If your process crashes you may end up with a crash dump, depending on the system's configuration. (On Linux you can avoid that using prctl's PR_SET_DUMPABLE option.)

Even if none of that is a problem for you, you still need to fill and use the values you protected. Where do you get the keys from? Is that path protected as well? This might be fine if you can generate them in place, but even then it's pretty hard. The same is true for key usage: How do you make sure that the key doesn't end up in another portion of your memory? It's almost certain that it ends up either on the stack or somewhere else sooner or later...

</comment><comment><USER11> Hashicorp Vault seems to be locking _all_ the memory: [https://github.com/hashicorp/vault/blob/c44f1c9817955d4c7cd5...](https://github.com/hashicorp/vault/blob/c44f1c9817955d4c7cd5822a19fb492e1c2d0c54/helper/mlock/mlock_unix.go)

They also set the ipc_lock capability before starting the process in docker: [https://github.com/hashicorp/docker- vault/blob/e8edfef53deb6...](https://github.com/hashicorp/docker- vault/blob/e8edfef53deb64e1898fea66e5fb7488b7dc3154/0.6.3/docker- entrypoint.sh#L83)

</comment><comment><USER12> I have no technical expertise to chime in. But I just wanted to say, that I like how nicely formatted the README is.

I think the only feedback would be to show sample usages and adding a bit more technical information*

[*] That would be understandable to people with basic encryption knowledge.

</comment><comment><AUTHOR> To anyone reading this in the future, all of the issues raised in this thread have been handled in v0.2.0.</comment>


Samsung Electronics considers splitting firm in two - happy-go-lucky http://www.bbc.com/news/business-38140007 <comment><AUTHOR> Plot twist:Firm will be split by putting a Galaxy Note 7 into one of their washing machines.</comment>


WordPress Plugin Developers Get The Shaft, Donations Are 0.1% Of All Downloads - <AUTHOR> http://tomuse.com/wp-plugins-developer-business-model/ <comment><USER2> Donations are not a business model. Its putting out a tip cup and hoping money falls into it. Tip cups do not have a curious property in physics that causes money to be attracted to them.

I do downloadable software, of the "makes people substantially less money than Wordpress" variety. Roughly 1.8% of downloads result in people paying me money. The average paid me is, I say without fear of contradiction, far above the average donation any Wordpress developer with a significant amount of donations has received. (Edit to add: here's a point of reference. Back when MoveableType was donationware, the average donation was 38. Cents.)

When you offer something for donations, you're saying "It would be REALLY NICE if you could put ANY money into this here tip cup because, as you know, almost nobody will. That $1 there, that makes you a better person than 99.9% of the public." This is a cruddy frame of mind to put your I-can't-believe-its-not-a- customer into from the perspective of separating them from their money.

When you offer stuff for sale, you say "It would be TOTALLY MANDATORY that you pay me exact what it says on the sticker for this here thing. Everybody pays for it, except thieves. [In point of fact 98.2% of people do not pay for it, but I don't clobber my users over the head with that fact, now do I.] Offering to pay me $1 for it doesn't make you nice, it makes you a _cheapskate_ and parasite on society." (And the best part is you never have to tell people this because _they already know_.)

There are people who do well with donations. Rick Brewster of Paint.NET is the only one who springs readily to mind for me. He pushes the donations fairly aggressively (+) and distributes a program which is probably competitive with some of Adobe's low-end consumer offerings.

\+ Another problem with donations: they fail quite frequently because people are embarrassed to ask for money, like they feel they are doing something wrong. So they bury the tip cup out of the way and don't aggressively promote it within the application, for fear of being thought poorly of by cheapskates who think $1 is too much to pay for $APP. People with this philosophy will never be mollified, and charging money from the getgo means you never have to worry about what they think of you.

<comment><AUTHOR> Joost de Valk seems to be pushing donations pretty hard yet his donation rate is 0.1%.

Do you know what kind of donate rate Rick Brewster is able to achieve?

<comment><USER2> Previously, in a comment on my blog, he mentioned that Bingo Card Creator has a higher conversion rate by "more than an order of magnitude" from him, which would imply his donation rate was at the time below .2%

He prefers to be circumspect with regards to exactly how much money he makes. As I respect his privacy, I will not elaborate further on my earlier comment that he does quite well with donations.

</comment></comment></comment><comment><USER3> There is a difference between what people want, and what the legalities are. Premium plugins doesn't have a sustainable foundation since they have to be GPL. What's to stop me from buying a so-called premium plugin, and then re- selling it to someone else, or giving it away for free? The GPL explicitly allows me this freedom.

Correct me if I'm wrong, but as I see it, it doesn't matter how many people believe premium plugins are the way to go. The GPL license will still undermine it. Unless WordPress is re-released under a non-GPL license. I'm not sure this is doable though.

</comment><comment><USER4> This reminds me the recent HN news item saying "Non profits kill the innovation". But this article makes me think that things are even worse than that. Wordpress should do something to change this I guess.

<comment><AUTHOR> Yes, it definitely seems unfair for the plugin developers to do all the work and receive very little compensation for all their time.

<comment><USER5> I disagree- it just reflects what the market value of a wordpress plugin is. Anyone who feels they're not fairly rewarded can just stop doing it. Nobody is forcing them to do the work.

Besides, they most likely have motivations other than money- there's no way anyone starts making wordpress plugins thinking they're going to get rich (at least I hope not!)

<comment><USER6> It doesn't reflect the value of a wordpress plugin, since the value of an item is the most the market will pay for it before going for an alternative.

The only thing this price means is that it is difficult to make money by giving away stuff for free.</comment></comment></comment></comment>


Show HN: Daily collection of Hacker News front page stories - <AUTHOR> http://hn-daily.appspot.com

<comment><AUTHOR> Hacker News Daily is a daily collection of all of the stories that have reached the homepage of Hacker News since the morning (currently 10:00am ET or 15:00 UTC).

Feedback welcome.</comment>


Ask HN: Sci-Fi novels? - <AUTHOR>

Just finished "Ready Player One".<p>Do you have any other good Sci-Fi books suggestion ? <comment> dan-g If you're talking about any sort of science fiction, I (and I'm sure countless others) would recommend Dune by Frank Herbert -- the best-selling sci-fi novel of all time, and for good reason. It's not as light-hearted as Ready Player One, though.

<comment><AUTHOR> I've read the entire Dune series more than 15 years ago, one of the best Sci- Fi series I've ever read.

<comment><USER2> That's no longer the entire Dune series, then.

Unfortunately.

</comment></comment></comment><comment><USER3> I misread your question as sci-fi novellas, but I still think you'll enjoy these (Three Worlds and Prime Intellect are both quite long, anyway).

Three Worlds Collide

[http://robinhanson.typepad.com/files/three-worlds- collide.pd...](http://robinhanson.typepad.com/files/three-worlds-collide.pdf)

The Metamorphosis of Prime Intellect

[http://localroger.com/prime- intellect/mopiall.html](http://localroger.com/prime-intellect/mopiall.html)

The next few are short stories:

The Last Question

[http://www.thrivenotes.com/the-last- question/](http://www.thrivenotes.com/the-last-question/)

The Last Answer

[http://www.thrivenotes.com/the-last-answer/](http://www.thrivenotes.com/the- last-answer/)

Let's Help Germinate This Seed

[http://www.thrivenotes.com/lets-help-germinate-this- seed/](http://www.thrivenotes.com/lets-help-germinate-this-seed/)

The Egg

[http://www.galactanet.com/oneoff/theegg_mod.html](http://www.galactanet.com/oneoff/theegg_mod.html)

<comment><USER4> Just returned the new novella pair _Stepping Stone_ and _Love Machine_ by Walter F Mosely to the public library. I'm a Mosely fan but his science fiction is less conventional than Socrates Fortalow and Easy Rawlins and they're not tight to.the mold of detective fiction. It reminds me of Harlan Ellison a lot and a little of Lovecraft.

</comment></comment><comment><USER5> My two favorites are _Permutation City_ by Greg Egan and _The Golden Age_ by John C. Wright (actually that one's a trilogy).

I hear good things about Iain M. Banks' _Culture_ novels. I've only read one ( _The Player of Games_ ) and while it was enjoyable it was still sort of meh, if that makes sense... (I've got _Excession_ in my queue and I suspect I'll enjoy it more.)

While it's more in the realm of science-fantasy, you might enjoy this alternate universe imagining of the Harry Potter story: [http://hpmor.com/](http://hpmor.com/)

</comment><comment><USER6> "Old Man's War" by John Scalzi

"Hyperion" by Dan Simmons

<comment><USER7> Those are definitely two of my favorites. Funnily enough, a few days ago there was a discussion about the most memorable space ships. Mine was "Yggdrasil" :).

</comment></comment><comment><USER4> I have found the Hugo Award winners to be a great way to find books and authors that I didn't know I would like based on what I already knew I liked.

[http://en.m.wikipedia.org/wiki/Hugo_Award_for_Best_Novel](http://en.m.wikipedia.org/wiki/Hugo_Award_for_Best_Novel)

</comment><comment><USER8> What did you like about it? I'd suggest Tad Williams' Otherland, Neal Stephenson's Diamond Age & Snow Crash, and Gibson's Pattern Recognition purely based on subject matter (gamey-cyberpunk-ARG-AI), but none is quite as lighthearted in terms of nodding towards videogame culture.

</comment><comment><USER9> I too just finished Ready Player One. Such a great read. I tend to lean on Good Reads lately for recommendations. But picked up Atopia Chronicles ([http://amzn.com/B00DUK1RKY](http://amzn.com/B00DUK1RKY)) after browsing popular sci-fi on amazon's best-sellers list. It has great similarities to Ready Player One - virtual presences, future VR challenges, etc. but a very different kind of book (split into multiple story lines, not one continuous story). But that said, if you've not read Snow Crash then drop everything and read that next!

</comment><comment><USER7> Are you looking for something similar?

It's not easy to recommend something based on a single book but have a look at Vicious by V. E. Schwab, This Perfect Day by Ira Levin or Wool by Hugh Howey.

<comment><AUTHOR> Not necessarily similar, just new Sci-Fi novels, I'm familiar with the classics: Herbert, Asimov, P.K. Dick ...

<comment><USER7> I run a sci-fi/fantasy blog with a few other people where we review books etc. So are you looking for more action/adventure type sci-fi, hard sci-fi, space opera, loads of alien life, etc?

<comment><AUTHOR> What is the address of your blog ?

<comment><USER7> [http://speculativebookreview.blogspot.com](http://speculativebookreview.blogspot.com)

<comment><AUTHOR> Thanks.

</comment></comment></comment></comment></comment></comment><comment><USER10> Lexicon - Max Barry. The Ocean at the End of the Lane - Neil Gaiman. Channel Skin - Jeff Noon. The Long Earth - Terry Pratchett & Stephen Baxter. The Difference Engine - William Gibson.

<comment><USER2> Oh, never noticed there was new Max Barry since "Jennifer Government"! That was good times, though - I should pick up some more...

</comment></comment><comment><USER11> These days I seem to prefer extended series of books that develop a detailed alternate universe. Three truly excellent series (Author-Series-1st Book):

Eric Flint - 1632 - "1632"

David Weber - Honor Harrington - "On Basilisk Station"

Stephen Brust - Vlad Taltos - "Taltos"

</comment><comment><USER12> Armor by John Steakley

</comment><comment><USER13> Most anything by Charles Stross, especially the Laundry series (Atrocity Archives, Jennifer Morgue, etc)

<comment><USER14> I really enjoyed Halting State, and Accelerando, and also the MaddAddam Trilogy by Margaret Atwood as well as Philip K. Dicks works, Valis in particular.

</comment></comment><comment><USER15> A Scanner Darkly - Philip K Dick Neuromancer - William Gibson Expanded Universe - Robert A. Heinlein

<comment><USER16> [http://www.lib.ru/GIBSON/neuromancer.txt_with-big- pictures.h...](http://www.lib.ru/GIBSON/neuromancer.txt_with-big- pictures.html)

</comment></comment><comment><USER17> Of course, "The Moon Is A Harsh Mistress" if you like it down and dirty, a tale of a "Computerman" working for the man but secretly using his machine to subvert the powers that be up until the final showdown.

</comment><comment><USER18> I just finish "The Martian: A Novel" by Andy Weir and I really enjoyed it.

</comment><comment> opionion-matter Neurovont was a nice surprise: [http://www.amazon.com/NeuroVont-Incorporated- Gil-A-Waters/dp...](http://www.amazon.com/NeuroVont-Incorporated-Gil-A- Waters/dp/0982280920)

</comment><comment><USER19> I'm ancient and have been reading Sci-Fi my entire life. I just finished "The Darwin Elevator" (1st of 3 in a trilogy) and it was the most refreshing SF I've read in a least 10 years.

</comment><comment><USER20> Altered Carbon

I liked Peter Watts stuff: [http://www.rifters.com/real/shorts.htm](http://www.rifters.com/real/shorts.htm)

</comment><comment><USER17> Stranger In A Strange Land.

Edgier than Star Trek but has that same feel of charming naivite; think 400 pages of Lt. Commander Data on a love potion.

</comment><comment><USER21> Personal favorites: "Flowers for Algernon", "Snow Crash" and "Schild's Ladder" #YMMV

</comment><comment><USER17> Friday, if you want a stunning cross of tech Sci-Fi with a Bond Girl in the lead role.

</comment><comment><USER22> Because no one has mentioned it yet: 'Blindsight' by Peter Watts.

<comment><USER23> Peter Watts is excellent. Blindsight and the Rifters trilogy are both fun hard sci-fi bent reads

</comment></comment><comment><USER24> "Snow Crash" by Neal Stephenson</comment>


The art of the homepage - <AUTHOR> http://googleblog.blogspot.com/2010/06/art-of-homepage.html

<comment><USER2> Google just doesn't get visual design right, when it's a bit more than just a plain UI.

Chrome's themes are just ugly: <https://tools.google.com/chrome/intl/en/themes/index.html>

Such are many of the background pictures Google is providing for the home page. It's sad.

<comment><USER3> Google has a cult of data that I think is pretty dehumanizing. Perhaps they look ugly because they don't ultimately give a damn about the design -- only that the data told them they are losing market share.

</comment></comment><comment><USER4> Google had Bing envy, so through a massive engineering effort and R&D they have managed to reverse engineer and clone Bing's #1 differentiator. Let The Search Engine Wars Begin Anew!

<comment><USER5> Gruber is that you?

</comment></comment><comment><USER6> I see no way to have no image background. The "White" editor's choice image doesn't make it look like it used to. Very annoying.

<comment><USER7> The link at the bottom left saying "Remove background image" puts it back to normal. Proof: <http://skitch.com/petercooper/d8t8h/remove>

(Update: Seems this doesn't work for everyone!)

<comment><USER8> Interesting; it's probably an A/B test, since I'm not given that option. At the bottom left corner, my screen says, "Change background image."

EDIT: Actually, I selected a background, and then I was given the option to "Remove background image." Unfortunately, this just reset my background image to whatever Google had chosen for me.

</comment></comment></comment><comment><USER9> Ah - blessed relief. Quoth Google: "Please be assured these images will only be displayed today, and the homepage will return to its regular white background tomorrow."

See the response from one "Paul" (Google Employee) here:

[http://www.google.com/support/forum/p/Web%20Search/thread?ti...](http://www.google.com/support/forum/p/Web%20Search/thread?tid=52d49a85dcfbdb9f&hl=en)

</comment><comment><USER10> The first background image I got was absolutely awful. It greatly obscured the actual content of the page, and didn't look very good either. I tried the "Change background image" link, but couldn't actually change it without logging into a Google account. In fact, it was so awful that I left and did my search with Bing.

Trying the homepage again just now I got an image that had a little more contrast with the page content, and looked a little better, but still is not very attractive overall. Most of the sample pictures they list don't look very appealing either.

This is one of the biggest failures I've seen from Google. Marissa, if you're listening, please give us our white background back. I will not be executing any more Google searches with these backgrounds, and choosing my own background on an iGoogle homepage is not an acceptable solution.

In all the time since my first Google search in the late 90s, this is the ONLY thing that has given me sufficient motivation to switch my default search engine away from Google.

</comment><comment><USER11> Holy cow. No wonder they have trouble retaining visual design talent.

</comment><comment><USER12> Google must be loosing market share to Bing to behave so panicky. First there is Bing like left column in search result page, and now the background image. Maybe they get sleepless with Bing appearing on iOS devices.

</comment><comment><USER13> Did anyone else get a default picture of the gulf oil spill?

<comment><USER14> From what I can tell, yes.

</comment></comment><comment><USER15> The only site that I've seen really get themes right is WolframAlpha. Their small, tasteful theme gallery (<http://www.wolframalpha.com/homesettings.html>) is really very well put together.

</comment><comment><USER16> Why would google do this?

<comment><USER17> Bing!

<comment><USER18> Bong!

<comment><USER17> Heh, I hear ya.

</comment></comment></comment></comment><comment><USER19> Waiter, there's bing in my google.

</comment><comment><USER20> The photos they provide are very nice, but as everybody has pointed out, they are pointless.

However, what if the image was dynamically generated, say from news articles/photos or some other dynamic graphic that's related to the user. That's the only use I see.

</comment><comment><USER21> This was incredibly useless for both google and users.I can't see any point to it.

</comment><comment><USER22> Why would you do this and not offer 'no background' as an option?

</comment><comment><USER23> Can I get my minimalist Google back?

</comment><comment><USER24> How is this news? If it was anyone but Google, nobody would care.

<comment><USER22> Since Google is the #1 search engine by a extremely wide margin and this change is obviously a response to competition, and the change is poorly implemented, it becomes of interest to the HN crowd. Consider it a water- cooler topic - not earth shattering, but still a way to pass the time.

</comment></comment><comment><USER25> hate it.

use <https://google.com> if you don't want the background.

<comment><USER9> Doesn't work for me. I get the background no matter what. I've tried typing in every permutation. It's like they locked me out of removing the background. Ugh.

</comment></comment><comment><USER26> Google can shove images up their arse. I don't give a damn. I was keeping them as my browser's home page as long as it was clean. Now I have switched to DDG.

<comment><USER27> Not that DDG is a bad idea, but that seems pretty rash seeing as they're only doing it for today, and you can opt out of it.</comment></comment>


Angled rotors let drone fly in any orientation (and play catch) - <AUTHOR> http://newatlas.com/fetching-drone-catch-ball/49796/ <comment><USER2> Man that is insane, how it's able to predict and catch the ball wow.

reminds me of the drone with onboard laser system it was like a 3D plane with it's agility/wingloading and it could fly through an underground parking lot...

[https://youtu.be/kYs215TgI7c?t=2m9s](https://youtu.be/kYs215TgI7c?t=2m9s)

</comment><comment><USER3> that looks very cool and well controlled.

since the rotors are at fixed positions some of the thrust be in opposition to other rotors. isn't that wasteful?

<comment><USER4> Eh, drone flight is already pretty inefficient so it might not make much of a difference.

Regular RC heli's are much more efficient than quadrocopters, I have no idea why the quads "won" popularity-wise

<comment><USER5> Probably because flying a drone is easy while flying a heli is extremely difficult. In the end the biggest part of the people flying drones won't be able to fly a heli.

<comment><USER4> It's only easy to control because of electronic gyros and control. Without those a quad would be more unflyable than a hell.

I'm not sure why the automatic control systems haven't made their way to regular helis

<comment><USER6> They have, even in the mini copters, like the Nano CPX, for $99. This doesn't have the self leveling, but I think that's a much harder problem with a heli at a reasonable angle.</comment></comment></comment></comment></comment>


Show HN: A different sort of website 'lightbox' animation - <AUTHOR> http://scrawl.rikweb.org.uk/demos/demo120.html <comment><USER2> I'm not a web dev or anything but as a user I like it.</comment>


Linus Torvalds: [Ksummit-Discuss] GPL Defense Issues - <AUTHOR> https://lists.linuxfoundation.org/pipermail/ksummit-discuss/2016-August/003603.html <comment><AUTHOR> The entire thread is very interesting. It's basically two worlds of people with support for the GPL clashing into each other. The one side wants the GPL enforced no matter what at the risk of harming the project, the other appears to be happy to accept license violations for as long as some companies can be convinced to become proper contributors.</comment>