Disk Prices on Amazon - <AUTHOR> https://diskprices.com/ <comment><USER3> Anecdote. I swore off spinning disks for my PC years ago, but I've been a bit cheap and recently got fed up with my 500GB "storage" drive always being near full and my work VM as well :/ So I finally went onto Google to look into storage and was absolutely, postively, shocked that I somehow missed the whole m.2 nvme surge. So much so that I got a 1TB 970 EVO for just $170. Nearly 500k random IOPS with qd32, and 3.5GB/s and 2.5GB/s sequential read/write?! Yes please.

I was even able to jump through hoops to get bitlocker working with hardware encryption, so I'm getting full disk encryption at nearly spec speeds. Awesomeness.

EDIT: It's a shame the situation with RAID controller software, drivers, and physical controllers is such a crap show ATM. Doing anything "enterprise" with them seems a bit of a cluster F ATM. Anyone know what's up with that?

<comment><USER4> Does NVMe make a difference over SATA2? Isn't the latter plenty fast anyway? I've been holding off on upgrading because it doesn't seem like I'd see a benefit.

<comment><USER5> SATA2 is really old. The SATA revisions are:

SATA1 - 1.5Gb/s SATA2 - 3.0Gb/s SATA3 - 6.0Gb/s

SATA3 is often referred to as SATA6G although because of 8b/10b encoding overhead you a SATA6G link maxes out at 4.8Gb/s

There are many NVMe SSDs that use 4 lanes of PCI-E Gen 3 which is just under 32Gb/s

If you read this review you can see read speeds of 3500MB/s which is 28Gb/s or just under the 32Gb/s limit.

[https://www.anandtech.com/show/13761/the-samsung-970-evo- plu...](https://www.anandtech.com/show/13761/the-samsung-970-evo-plus-ssd- review)

I am using lowercase "b" for bit and capital "B" for byte

<comment><USER4> Hmm, maybe my disk is using SATA3 then, I have an Evo and a not-ancient motherboard. However, I'm wondering whether I'll see a practical difference in my day to day workloads, which is mostly web development and no gaming.

<comment><USER6> IMO - not really. You might if you're memory constrained and you're doing analysis of logs or something like that.

<comment><USER4> That's what I figure as well, thank you.

</comment></comment></comment></comment></comment></comment><comment><USER7> We stopped buying drives from Amazon when we got drives for "the wrong region" and couldn't RMA them.

NewEgg is a bit better, but don't buy refurbished drives. Provantage is another reputable vendor that usually has decent prices.

If you're local to the SF bay area, check out Central Computers. King Star USA also works if you're a business customer making a large purchase.

<comment><USER8> I don't understand why anyone still buys anything at Amazon. Their Fulfilled- by-Amazon (FBA) idea was quite a game changer, but the implementation with the inventory co-mingling is something that I'd much rather stay away from as a consumer.

There's been oh-so-many reports that even if you're buying from the official store of any known brand, with FBA, then you might as well still receive a knock-off, due to the inventory co-mingling issue. Have they ever resolved this for good, or is noone really bothers to even pay any attention to this anymore?

<comment><USER9> >>I don't understand why anyone still buys anything at Amazon. Their Fulfilled-by-Amazon (FBA) idea was quite a game changer, but the implementation with the inventory co-mingling is something that I'd much rather stay away from as a consumer.

As far as I know it doesn't happen in the UK at all. I have placed 200+ orders with Amazon in last year alone and haven't had any issues except for a couple deliveries which were a day late(Amazon extended my prime by a month each time). 99% of my deliveries arrive in 1 day as promised. They have exemplary customer service as well. In a way, I don't understand why you'd buy from anyone else but amazon :P

<comment><USER10> I wonder if this knock-off problem I keep reading about is something specific to the US. I've ordered ~200 things over the last 3 years from Amazon, and I've never received a knock-off either. I've never even heard of that happening outside of internet comments. Plus sending things back to Amazon is usually fairly trivial.

<comment><USER11> How would you know whether what you received was authentic?

<comment><USER12> For example, one wouldn't know their bike helmet was a knockoff unless they had fallen and hit their head.

[https://www.npr.org/2018/09/16/647377213/fake-bike- helmets-c...](https://www.npr.org/2018/09/16/647377213/fake-bike-helmets- cheap-but-dangerous)

</comment></comment></comment></comment></comment></comment><comment><USER13> Setting aside the issue of counterfeits on Amazon, this is really nice. Clear, simple, functional and allows you to explore the space not just comparison shop for a specific item.

I've long thought Amazon has terrible search and sort options for things like computer parts. Trying to buy e.g. RAM is a nightmare.

<comment><USER14> Amazon's sort just flat out doesn't work, I don't understand it, it's obviously not incompetence (and anyone can call a std lib `sort` fn on a given field anyway) so I don't understand why it's an option, why it pretends that sorting by price is something that you can do.

It's not just that it doesn't include shipping (for those which have a fee, which tends to be the cheap tack, presumably to try to catch you out) - <USER2> including shipping the order just seems all over the place. I can only assume it's paid-for rankings etc. with no indication of that to the user, but it's a crap site. As a business/seller/provider of goods it's great, and gets too much of my money, but the site really is crap.

<comment><USER15> I was at an Amazon all-hands years ago (I haven't worked there for years) and I saw an employee ask Bezos what Amazon was going to do about the poor quality of search. Bezos brushed off the criticism and said the search team did good work.

I don't know why. Maybe he earnestly thinks it's good, or just has different priorities. But I don't expect it to get better.

<comment><USER16> I was there too when someone asked why Google seemed to always have better search results for Amazon.com than Amazon itself, and I remember he said that if you always start searching on Amazon and only fall back to Google when you don't like Amazon's results, you'll notice when Amazon has poor results and Google has good results, but not the reverse. Something of a copout perhaps, but I thought it was an astute observation.

<comment><USER17> Honestly it's really good to hear it's not intentionally bad.

I wish there was a way to just download the catalog and query/search/sort it myself though.

<comment><USER15> > _I wish there was a way to just download the catalog and query /search/sort > it myself though._

That would be nice and not _entirely_ without precedent, since you can download some of IMDB's catalogue (owned by Amazon since 1998.) However I suspect this feature is a vestigial remnant of IMDB's earlier days on Usenet.

[https://www.imdb.com/interfaces/](https://www.imdb.com/interfaces/)

<comment><USER17> There are other e-commerce sites: Sparkfun let you do this until a few years ago, I think you still can with digikey.

</comment></comment></comment></comment></comment></comment></comment><comment><USER18> I find it interesting how stable HDDs are in terms of price.

I just cross-checked with german "Geizhals"[1], and the 4 TB Seagate IronWolf (ST4000VN008) started at ~160€ in Sep. 2016, quickly fell to 140€ a few days later, and then slowly descended to 105€ in Jan. 2018 - and that's the region it's been sitting there for two years now. The UK price chart looks almost the same.[2]

[1]: [https://geizhals.de/seagate-ironwolf-nas-hdd-4tb- st4000vn008...](https://geizhals.de/seagate-ironwolf-nas-hdd-4tb- st4000vn008-a1504505.html)

[2]: [https://skinflint.co.uk/seagate-ironwolf-nas-hdd-4tb- st4000v...](https://skinflint.co.uk/seagate-ironwolf-nas-hdd-4tb- st4000vn008-a1504505.html)

<comment><USER19> Nobody puts any R&D into new drive technologies. If demand drops, factories close since they are producing at near zero margin. All R&D costs are already amortized or written off.

End result: Static prices.

The only time prices will change is when only one manufacturer is left and they jack the prices as a monopoly on antique tech that a few big companies still need. We're a long way from that tho.

<comment><USER20> >producing at near zero margin

:)) [https://ycharts.com/companies/STX/gross_profit_margin](https://ycharts.com/companies/STX/gross_profit_margin)

SSDs are unsuitable for long term storage, technology is simply incapable (cells losing charge, normal usage physically degrading medium, limited number or charges per cell). We dont have anything better than spinning magnetic medium at the moment, and nothing viable on the horizon.

<comment><USER19> > cells losing charge

Leave it powered up and let the controller re-write the data every year or so automatically.

>normal usage physically degrading medium

For 'read-only' data that is rewritten once per year to compensate for cells loosing charge, you can expect a lifetime over 10,000 years.

Sure, some SSD's available today wont handle the above cases properly and data will be lost, but it is not a theoretically unsolvable issue.

<comment><USER20> 1 more like every 30 days [https://www.anandtech.com/show/8617/samsung- releases-firmwar...](https://www.anandtech.com/show/8617/samsung-releases- firmware-update-to-fix-the-ssd-840-evo-read-performance-bug)

2 No such thing as read only SSD. Just like in ram, SSDs experience read disturbance (rowhammer) [https://users.ece.cmu.edu/~omutlu/pub/flash-read- disturb-err...](https://users.ece.cmu.edu/~omutlu/pub/flash-read-disturb- errors_dsn15.pdf)

"A key contributor to this reduced reliability is read disturb, where a read to one row of cells impacts the threshold voltages of unread flash cells in different rows of the same block. Such disturbances may shift the threshold voltages of these unread cells to different logical states than originally programmed, leading to read errors that hurt endurance"

The very best SSDs today promise to go into read only mode in case of a failure, and in tests almost none are. Intel server family of drives famously brick itself despite stating "read only" in documentation.

</comment></comment></comment></comment></comment><comment><USER21> At least [edit:] three of the 4TB drives I checked was categorized as "new" but was in fact reburbished ("with a new warranty"). One of them was pretty shady about hiding this fact.

[Life is too short and data is too dear to ever buy one of these refurb units]

</comment><comment><USER22> If you are trying to build a NAS or similar then my suggestion is go with shucked WD EasyStore externals, you need to either use molex to sata power to bypass the 2.2v issue or tape the pin but they are WD Whites inside and work very well from my experience. I just keep waiting for the 14TB's to fall a little further so I can replace one of my 5TB parity drives with that so I can grow my array.

<comment><USER23> I think I hear /r/DataHoarder/ calling you.

<comment><USER22> Oh, they have me hook, line, and sinker haha. Them along with /r/homelab and /r/unraid

</comment></comment></comment><comment><USER24> Wow, SSD prices bounced back after December. I think most people were (and still are) expecting $100/TB to be the new baseline.

[https://camelcamelcamel.com/product/B078DPCY3T?context=searc...](https://camelcamelcamel.com/product/B078DPCY3T?context=search)

<comment><USER25> From a Gamers Nexus news video near the start of the year - apparently some of these companies shifted some production to RAM due to high demand from new consoles and high end phones.

</comment></comment><comment><USER26> Anyone know of one that can display a sorted price per GB _with an offset_? E.g. so you can put in a marginal cost per additional SATA port and get corrected figures?

Saving 5 dollars on drives by using 30 3TB drives instead of 6 15TB drives isn't a win in terms of pricing when you consider the total cost.

<comment><USER27> Also, an option to penalize excessively huge drives would be nice too. For the same price per GB I'd rather buy 2 8TB drives than 1 16TB.

<comment><USER28> It's cheaper per TB to buy 16s rather than 2x 8 TB, or was when I did it a 2 weeks ago. The cost of more bays pushed me there more than anything.

<comment><USER27> Of course. What I meant is I'd like to see an option to weigh in smaller (to be exact: closer to a particular point of available capacity distribution) drive size as a positive feature for the resulting chart.

So, in a sense, the same idea, but an opposite of a GP comment.

</comment></comment></comment></comment><comment><USER29> It is worth noting the design and density of information presented in this website - we've forgotten how to present lots of data to users because the modern trend is to pad everything with whitespace. Dense design, no frills, just a table - this is what the web needs more of.

<comment><USER30> Clear and simple, with filtering and sorting: [https://pangoly.com/en/chart/ssd](https://pangoly.com/en/chart/ssd) (also performance included)

</comment></comment><comment><USER31> Given Amazon's system for packing items, I would not buy hard drives from them. I don't want my hard drive's retail box bouncing around all over inside the outer amazon box for however long it takes to get to me. That's a recipe for issues down the road (or immediately).

That said, this looks like a useful tool. I can accept prices from Amazon and shop around for someone who knows how to pack.

</comment><comment><USER32> I wish the entire web looked like this once again. Ah the good ol' days.

Please add Newegg and other non-Amazon vendors. Newegg has an API and everything. Around 10 - 15 years ago, I used to use a simple site called pricewatch that wasn't too far off from this.

<comment><USER33> Apparently it's against Amazon's API terms to compare with other sites. I recall years ago the guy who runs the site explained that he is only ok to compare Amazon with Amazon.

<comment><USER34> I don't think it's against the rules, but the rules are complex and spread all over multiple places, and they're like Google in that you have no due process if someone there decides they don't like what you're doing.

<comment><USER35> It is against the rules. If you are an e-commerce company (i.e. a competitor) or you operate a shopping comparison service, you are not allowed to use the API at all.

[https://advertising.amazon.com/resources/ad- policy/en/api](https://advertising.amazon.com/resources/ad-policy/en/api)

<comment><USER34> That appears to be specific to their advertising API, not the affiliate program. The affiliate program policies[0] say:

> if you choose to display prices for any Product on your Site in any > "comparison" format (including through the use of any price-comparison tool > or engine) together with prices for the same or similar products offered > through any web site or other means other than an Amazon Site, you must > display both the lowest "new" price and, if we provide it to you, the lowest > "used" price at which the Product is available on the Amazon Site.

... which implies that it's not forbidden, but I can't blame someone for not wanting to risk it.

[0] [https://affiliate- program.amazon.com/help/operating/policies](https://affiliate- program.amazon.com/help/operating/policies)

<comment><USER36> That seems to be what PCPartPicker is doing to remain compliant. Example:

[https://pcpartpicker.com/product/MwW9TW/western-digital- inte...](https://pcpartpicker.com/product/MwW9TW/western-digital-internal- hard-drive-wd10ezex)

</comment></comment></comment></comment></comment></comment><comment><USER37> This seems all Amazon links only (with affiliate codes). Given their known counterfeit problems and fake reviews, I would recommend avoiding it for important things like disk drives. Plus, they are not guaranteed to be the cheapest anyway.

If you need to buy a drive, I would recommend local brick and mortar store first, and some sort of proper aggregator (which looks at multiple sites, not just Amazon) second.

<comment><USER38> Have you ever tried to buy tech at a B&M store? They will have obsolete products that have been on the shelves for years listed at the original MSRP. I'm sure there are exceptions but this is generally terrible advice.

<comment><USER39> If possible, Micro Center or Frys. Frys is somehow profitable but with dwindling stock at every California/Nevada location I've been to recently (maybe an indicator of higher prices?), but Micro Center is great.

<comment><USER40> There was a big thread about Fry's a few weeks ago. Apparently the story behind the empty shelves is they're having contract issues with suppliers.

<comment><USER41> That's the line they're giving out, anyway. I'm curious to see if it's just a ruse to keep some employees around and keep customers coming in paying full price as they clear the shelves before something else like complete shutdown.

<comment><USER25> It's weird, the shelves are as empty as you could hope for in a liquidation scenario and there's just crap left. Continuing to pay rent to try get rid of a few hard to sell pieces of old tech or low value items like phone cases is definitely past the point of being sensible.

So I think someone in management genuinely believes suppliers will come around to supplying them goods with payment on sale, despite all evidence to the contrary

<comment><USER41> I suspect they actually own some of their buildings and have for some time, starting from way back when property values and mortgages were lower. Or at least "own" in the usual sense of being the owner of the mortgage. Which would maybe? give them a few months more comfort zone in that they aren't paying that extra margin of current market rents to a landlord, at least in those cases where they own.

</comment></comment></comment></comment></comment></comment></comment><comment><USER42> The list is not comprehensive.

For example, this one is missing:

WD 6TB Elements Desktop Hard Drive 6TB [https://www.amazon.com/gp/product/B076MPMZDV](https://www.amazon.com/gp/product/B076MPMZDV)

(I bought it just 1 month ago so it's not newly listed.)

</comment><comment><USER43> This website appears to be messing with my history? After clicking some filters I can't go back.

</comment><comment><USER44> See also [https://pcpartpicker.com/products/internal-hard- drive/](https://pcpartpicker.com/products/internal-hard-drive/)

</comment><comment><USER45> Why is that external drives are often cheaper than internal?

<comment><USER46> I have thought about this as well. I would love someone more knowledgable to chime in - but if I had to guess it is that consumer hard drive sales have been declining a lot in recent years. Desktops are a thing of the past for your average PC user, and as a result hardware/storage upgrades. Laptops, mobile devices, and cloud storage is where it's at. No one is buying hard drives anymore except large enterprises. In order to appeal to the consumer market HDD manufacturers need a value prop to compete with cloud storage. So discounting bulk storage is the play. I am guessing that they are selling "white label" enclosed drives at a lower margin than the enterprise counterparts but still netting more in the long run.

<comment><USER35> When I shuck drives like these, I frequently find the higher quality models of drives in there. However, I have heard that they bin their drives and the drives that don't pass muster for enterprise end up getting used in these external drives.

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

</comment></comment></comment><comment><USER41> This should account for shipping prices, because sellers use them to game the system.

</comment><comment><USER47> I see a lot of folks talking about the risk of Amazon commingling and used drives. I buy drives off Amazon, but only external/new. I only uses these drives as backups, and everything is stored on multiple drives (not RAID, they're stored in different places for fire/theft security). I've been doing this for the last 20 years and have rarely had any drive errors (usually it's a partition that goes, but after reformatting it's fine). What I've found is that I outgrow the drive before it dies on me. Once I outgrow a drive, I just buy another that is twice the size and copy everything over from the old drive, which I hang onto but never use.

But I wonder, am I doing something wrong here? Or are other people just using drives in different ways (for active files or huge media libraries that they don't want to store redundantly)? I would understand that under those circumstances, failure of a single drive is more catastrophic. I don't mean to be critical here, as I'm far from an expert!

</comment><comment><USER48> Missing External SSD option (also while at it, would need to add speed as it's quite important factor).

<comment> Const-me IMO it's better to make that yourself.

When you let the companies pick which model of disk to embed in their product, they pick the cheapest one available. Probably not what you want.

Personally, I have Zalman ZM-VE300, also no-name m.2 2280 USB 3 enclosures, both work fine. If you'll do the same, don't forget there're 2 sorts of m.2 disks, SATA and NVME, USB enclosures for them aren't compatible.

<comment><USER49> DIY portable SSDs are great, unless you want something ruggedized/splashproof.

</comment></comment></comment><comment><USER50> This guy posted in a thread here a few months ago about side hustles. I was tempted to start my own off of this model. It appears it's not as easy to get started, and with a new baby I've been too distracted. But at the same time with a new baby it's more tempting for the extra cash.

<comment><USER23> When my son was small I would put him to bed every night with a book and then sit there in the dark and wait for him to fall asleep. I had a big pillow thing that I would sit on next to the crib (it was big enough that it had back support). Well, that hour of sitting there with my laptop was always one of my most productive hours of the day. Sometimes I would just sit there even after he fell asleep and continue to work.

</comment></comment><comment><USER51> Although different in 2 ways, this reminds me of this table of RAM prices 1957-2019:

[https://jcmit.net/memoryprice.htm](https://jcmit.net/memoryprice.htm)

</comment><comment><USER52> See also: "Price per TB" \- [http://edwardbetts.com/price_per_tb/](http://edwardbetts.com/price_per_tb/)

<comment><USER53> Also because I was curious -- looks like LTO-8 is about $12.75 on newegg. Which is still keeping below disk - but only just (and ignores the cost of drives)

<comment><USER54> It's a pain to format LTO-7 for higher capacity in LTO-8 drives, but once you do it's only $5-$5.50 a TB

<comment><USER26> Your comment inspired me to do some math:

I have an old 24 tape robot I haven't used in a while. Priced out a used LTO8 drive and 24 LTO7 tapes, and assuming that they're formatted M8 to 9TB, it still costs out to $0.02/GB-- so only just breaking even with the 12TB USB3 external drives.

You need a lot of tapes before LTO starts comparing favorably to current drive prices even using LTO7 tapes. :( like 1PB before it's really attractive.

</comment></comment></comment></comment><comment><USER55> Hi, this is my site. Thank you for all of the feedback! I can address a few of the issues you've raised...

Missing some products. This is a known bug in how I'm currently importing product data from Amazon's API. Some products are listed with variations that appear on the same product page but are completely separate products in Amazon's catalog. There's no way to get the API to return all of the variations at once, so I have to perform several subrequests to enumerate those. Currently, that doesn't happen. However, I'm in the process of reworking a lot of the data import code to use the new PA-API 5.0 and am planning to make variations work properly with those changes.

Filter by products sold by Amazon. Initially, diskprices.com was set to filter out products not sold by Amazon, but I received quite a bit of feedback asking me to remove that filter as some of the best deals are from resellers. The new PA-API does have a populated Merchant field for most products, so I may try to expose that.

Display prices including shipping costs. This is addressed in the FAQ ([https://diskprices.com/faq.html](https://diskprices.com/faq.html)), but it really comes down to privacy. I'd need you to login with your Amazon account or give me your location in order to compute tax and shipping information and I really don't want the burden of handling PII.

Clicking the Back button does weird things. This is a bug. Whenever you change a filter, a bit of JavaScript updates the URL in your address bar so that you can copy/paste a link to the page you're looking at with the current filters and send it to someone. It appears I'm not capturing the Back event and updating the filters to match the address bar. I'll get this fixed soon.

External SSD category is missing. Up until the last few months, there really weren't many external SSDs for sale on Amazon, but it looks like this is definitely becoming it's own product category, so I'll add it.

Add Amazon.co.jp. Funny story, diskprices.com had support for Amazon Japan when I first launched it, but they suspended my account and sent an email telling me why, written in japanese. Google Translate couldn't make any sense of the email and I'd had some significant data quality issues with the filters, so I decided not to pursue it further. This is the first time somebody's asked for Amazon.co.jp support. I'll look into setting it up again, but Amazon's added some new restrictions on API access across all regions since then, so it's a bit more difficult to get new regions added now.

Account for per-port cost in calculating prices. This is something I've been thinking about for a while. I think this feature ends up looking a lot like pcpartpicker, with a constraint solver bolted on the side... Given a set of parameters for total capacity, redundancy, bandwidth, etc, optimize for the best price/performance. I currently don't have enough metadata about most of the drives to implement this properly and it's a big feature to develop, but it's something I want to experiment with eventually.

Again, thank you all for the feedback!

edit: formatting

</comment><comment><USER56> More interested in the tech behind the website. Amazon traditionally blocks scrapping quite aggressively

<comment><USER57> Well, it's not a lot of links. Few hundred maybe. I bet that's not enough for them to start to notice. Hard to parse the page still, maybe.

<comment><USER56> >I bet that's not enough for them to start to notice.

I got blocked on very first attempt to scrap from cloud. Literally request #1.

...with code that worked fine on residential IP five mins earlier (where I coded it).

I'm sure it can be circumvented, but that experience led me to believe it's better to just save the time and pay for a res proxy (as sketchy as that concept is)

<comment><USER57> Wow that's impressive. One solution is to just have some random subset of your users do your scraping for you... Then send the data to the server.

Insecure, but probably good enough for a page like this.

</comment></comment></comment></comment><comment><USER58> How are they getting the data? Is there a API or its plain old scraping?

</comment><comment><USER59> This works great, just need to filter the outliers ie: [https://imgur.com/XHPtfqa](https://imgur.com/XHPtfqa)

</comment><comment><USER60> I believe its against TOS to provide price on your website for specific product. It could lead to amazon affiliate account ban.

</comment><comment><USER61> I just spent a few days looking for server hard drives.

IOPs, NVMe doesn't RAID, throughput, latency, raid controllers, on hard drive DRAM cache, SAS vs SATA vs M2 vs PCI, drive writes per day, mean time between failure, specific server firmware on drive...

I'd buy anything off this list for me personally, but I'm definitely in research mode and there just isn't enough info here. Buy on price alone!? Savages!

</comment><comment><USER62> I think you'd do a lot of money with referal links. I'd be a regular user. Please extend.

</comment><comment><USER63> The price sorting doesn't taken into account shipping (some items aren't Amazon Prime).

</comment><comment><USER64> It would be nice to have sorting!

</comment><comment><USER65> This is the second "Find _X_ on Amazon more easily" sites that I've come across in the last week or so (the last was a USB hub filtering site). Including eBay in the mix, it's the third such site[0].

I _love_ these sites. It's just sad that it's difficult-to-near-impossible to actually use Amazon (or eBay) for the exact same purpose. The perfect example hit me, yesterday. I wanted a new A/C adapter for my Thinkpad. It's a USB-C laptop, so simple, right? Start with a search. OK, there's a lot of A/C adapters, and a lot of USB-C adapters for phones. In the mix is one or two (over-priced, non-OEM) adapters.

Let's try the A/C adapters category, maybe I can click into that and filter based on the metadata? First, find the category. A few minutes later, settle on something somewhat close. This shouldn't be too difficult; this thing can be powered by anything 60W or higher that supports USB-PD and has a USB-C end on it. Nope. Not a single filter and a few thousand results are returned[1].

Product properties/metadata are _so important_ \-- why are so many important bits of data completely missing/unavailable to me while trying to _find what I need_? I feel like Amazon and eBay have managed to recreate the experience of shopping at a Walmart Super Center online -- a store full of products, organized by some magician, in order to make a 2 minute purchase require 20 minutes of browsing. I guess I don't have to roll the dice picking a check-out line that might move quickly, but outside of that, the experience is so bad that I have a solid four or five things I need to buy which I've attempted to find and simply given up.

And it used to be that you could find other shops online that were more narrow in their product categories (but not selection in said categories) and offered better options for filtering and finding the precise item you were looking for. Many of those are gone, now. The ones that remain all use a handful of off-the-shelf cart software and are often _worse_ for finding products[2] or the price is so much worse that you end up finding the product and searching for its specific part number on Amazon.

I have to say, though, I clicked this link because I have been putting off purchasing an NVMe SSD drive. So _thank you_ to whomever is responsible for this site; that was very helpful in getting me to pull the trigger.

In a more perfect world, a site designed to make it possible to filter available products by a set of incredibly important, common properties which is _directly tied_ to the site who's job it is to _sell you the actual products_ wouldn't even _exist_. In this world, it gets over 250 upvotes and has more than 160 comments after being on HN for about 13 hours.

[0] [https://labgopher.com](https://labgopher.com)

[1] Unless, of course, I decide to sort by anything other than "Featured" whatever-the-heck-that-means, then there's 150 or so.

[2] NewEgg does a _better_ job than Amazon, but too often a filter will eliminate a set of products because they refer to a common property of a product by a different name; I can tolerate that, but it'd be nice if I didn't have to so frequently.

</comment><comment><USER66> Such a great site! Love the simple design and lack of ornamentation.

</comment><comment><USER67> Please add Japan (amazon.co.jp) m(-_-)m

</comment><comment><USER68> Does this site work for amazon Canada?

</comment><comment><USER69> Data is beautiful.

</comment><comment><USER70> Isn't it against amazon terms to show prices?</comment>


We Forgot About the Most Important Job on the Internet - <AUTHOR> https://www.nytimes.com/2020/03/13/opinion/sunday/online-comment-moderation.html <comment><USER2> Hey!</comment>


Coming soon to a Dropbox for Business near you: Single sign-on - <AUTHOR> https://www.dropboxatwork.com/2013/04/coming-soon-to-a-dropbox-for-business-near-you-single-sign-on-sso/

<comment><USER2> "Dropbox is used in 95% of the Fortune 500".

I wonder what percentage of those officially allow their employees to use it though. A lot lower I bet.

</comment><comment><AUTHOR> No point in submitting twice, so here's the announcement on the main blog: [https://blog.dropbox.com/2013/04/say-hello-to-dropbox-for- bu...](https://blog.dropbox.com/2013/04/say-hello-to-dropbox-for-business/)

</comment><comment><USER3> Will it work with Google Apps SSO? Wasn't mentioned in the blog post.

<comment><USER4> If you're using a SAML Identity Provider to login to your Google Apps environment, then, yes, it should work with your current IdP.

</comment></comment><comment><USER5> Do many folks here use Dropbox for large(r) scale collaboration (i.e. 100 or 10,000 users)?

I find folders work okay for myself and maybe up to 5 people but as the number of documents and collaborators goes higher than that it seems like it'd be really frustrating.

Unless the "search" is significantly better for business users.

<comment><USER6> I use it for an org with anywhere between 25 and 50 using it at any one time, assuming that you spend a bit of time organizing the folder structure at the beginning it's not a major issue but it does require staff discipline to keep it organized. It doesn't beat a dedicated Document Management system but it strikes a nice balance for working on frequently updated files.

<comment><USER5> Thanks. Glad to know it's possible :)

</comment></comment></comment><comment><USER7> As long as they don't want to leak my e-mail address.

</comment><comment><USER8> Why is the blog https?

<comment><USER9> Everything should be https.</comment></comment>


Why Is Pisano Happy with Clojure? - <AUTHOR> https://medium.com/pisanoeng/why-is-pisano-happy-with-clojure-c50e27fd18fb <comment><AUTHOR> > The following list displays several well-known organizations using Clojure…

> Walmart, Facebook, Apple, Boeing, Amazon, Netflix

Oft repeated but is Clojure still in active use in these companies?

<comment><USER2> Here's a recent comment from somebody working at Walmart [https://news.ycombinator.com/item?id=19728502](https://news.ycombinator.com/item?id=19728502)

And here's one from a developer at Netflix [https://news.ycombinator.com/item?id=18346043](https://news.ycombinator.com/item?id=18346043)

I have a friend who works at Apple, he says that a lot of iTunes backend code runs Clojure. Here's a recent podcast from one team using it [https://www.therepl.net/episodes/15/](https://www.therepl.net/episodes/15/)

Personally, I find it really weird that people keep questioning if companies are actually using Clojure. It's like people just can't wrap their head around the idea that big companies might be using a non-mainstream language and that it solves problems for them.</comment></comment>


On the Way Down: The Erosion of America's Middle Class - <AUTHOR> http://www.spiegel.de/international/world/0,1518,712496,00.html <comment><USER2> I just sent this link to several friends and family members who are interested in the economy (most aren't, or prefer not to talk about it). The sad thing is that so many in the middle class believed the hype of living on borrowed money. The long term consumer borrowing binge helped the rich, hurt most of the rest of the population.</comment>


Show HN: Timely – Changing location recommendations to maximize user efficiency - <AUTHOR> https://itunes.apple.com/us/app/timely-make-most-out-your/id1022562586?ls=1&mt=8

<comment><USER2> interesting idea. what api do you pull the data from, yelp or foursquare?</comment>


Chef extends open-source licensing to all its software - <AUTHOR> https://blog.chef.io/2019/04/02/chef-software-announces-the-enterprise-automation-stack/ <comment><USER2> It sounds like all Chef code will be open source (I'm curious what _isn 't_ open source today), but there is no release engineering work in public, and so if you want a supported / stable release, you need to either pay them, make a release internally yourself, or hope that someone like a Linux distro builds a release for you. It's intentionally patterned on the Red Hat model, and very much unlike the MongoDB / Redis Labs / Elastic approaches.

I'm of the opinion that depending on someone else's release of OSS is an antipattern anyway because if you're not going through your own release process, you're not confident that a one-line bug-fix is actually only changing that one line. (The exception is when you know their release is through some decently hermetic build environment like distro packaging or Travis or Docker, such that you expect to be able to replicate that build environment for yourself when the time comes.) But I think a lot of companies use vendor binaries even when the vendor source is open source, so this seems likely to make Chef pick up a few support contracts.

<comment><USER3> Chef Automate was not previously open source but will be.

</comment></comment><comment><USER2> Chef co-founder and board member Adam Jacob has a blog post about it: [https://medium.com/@adamhjk/goodbye-open-core-good- riddance-...](https://medium.com/@adamhjk/goodbye-open-core-good-riddance-to- bad-rubbish-ae3355316494)

> _This morning, Chef Software announced that it will be releasing 100% of its > software as Open Source, under the Apache License. Going forward, all of its > product development will be done in the open, with the community, and > released as Open Source Software. Chef is done with being Open Core, and is > now a Free Software Product company. Good riddance to bad rubbish._

<comment><USER4> Happy to answer questions about it, if anyone has any. :)

<comment><USER5> What about a fellow hner's comment above:

"""

jandeboevrie 23 minutes ago [-]

Too little, too late. Surpassed by Ansible (and AWX) a long time ago. Chef was nice in 2014 to get rid of puppet... """

<comment><USER4> Every person can decide for themselves what story they want to tell. Chef has been declared dead/dumb/irrelevant from the beginning. It's doing great as a business, and as software. You play your game - y'all can think it's irrelevant, and it'll just keep on focusing on solving people's problems. Turns out it works.

</comment></comment></comment></comment><comment><USER6> I really want to like Chef, but their ecosystem around their Infra-suite is just such a mess of different offerings, all with different limitations and features, I hope maybe this will consolidate things.

Chef-solo, Chef-zero, Chef-server, little-chef and tooling like knife and knife-solo.

<comment><USER7> Chef Workstation is your answer - try it out Vikram Ghosh, VP Biz Dev Chef Software

</comment></comment><comment><USER8> I love that the new "Download Chef" page _requires_ you to fill out a contact form in order to download it.

<comment><USER9> Today we have two easy methods for getting Chef's bits. 1) www.chef.io/get- chef/ \- which is intended for newer users where we collect contact information so we can help with customer success. 2) downloads.chef.io which provides all of our downloads, ungated, for advanced users.

hope this helps clarify.

Best, Brian Goldfarb CMO, Chef

<comment><USER10> > so we can help with customer success.

Lol. Your privacy policy says you do much more with user info than 'customer success'.

<comment> yjftsjthsd-h Point of view:) A "success" is a customer from which more money can be extracted;)

</comment></comment></comment></comment><comment><USER11> Too little, too late. Surpassed by Ansible (and AWX) a long time ago. Chef was nice in 2014 to get rid of puppet...

<comment><USER12> Chef (and configuration management in general) is an anti-pattern for a cloud native approach.

The soup of the Chef ecosystem has always seemed hard to understand (and teach new team members): Chef, Chef-solo/zero, rubocup, test kitchen, food critic, berkshelf automate, delivery druck, inspec, infa, etc...

With containers and immutable infrastructure there just isn't the need anymore. They obviously realized this and created Habitat as a response, but after trying it a few times, I don't see why I'd use it over plain old Docker + K8s.

If you still need configuration management, Ansible is more flexible, is easier to learn/teach (no need to learn Ruby), agentless, no need to run a sever and can also do some orchestration.

<comment><USER13> > no need to learn Ruby

Instead we'll just learn yet another ad-hoc language clumsily built atop YAML, and put up with Norway always being false when abbreviated. :)

<comment><USER14>
        "no"

Doesn't address the issue? Of course, I'd rather if boolean evaluation was in the markup only true and false specifically be translated

<comment><USER15> It does, but only if you know about it in advance.

</comment></comment></comment></comment></comment><comment><USER16> @bgoldy

We use manage chef server in multiple production environments and long standing customer and install the binaries automatically when building new servers and AMI's etc. Can someone explain how this will change in the future and impact us licensing wise? As up to now we pay for number of nodes managed by chef cloud servers (manage.chef.io) which makes it very clear what we paying for.. With these news it now not clear at all what we need to have liencing for :(

Also what happens to chef-zero etc? I looked at the pricing page [https://www.chef.io/pricing/](https://www.chef.io/pricing/) which has been updated. Is this per month, year or perpetuity? and what counts as a chef infra target and inspec targets actually mean? as we use these for test- kitchen local development and testing as well we use chef-zero for Packer Images (AMI's) and AutoScaling vms.

I read the FAQ section ([https://www.chef.io/bmc- faq/](https://www.chef.io/bmc-faq/)) and none of it is very clear as Chef does not need to be used with just a central server but can work standalone. So can someone explain how the pricing will work for these non connected workflows in the future? Chef-Zero for AutoScaling VMs, Packer Builds, and InSpec Profiles for Local Testing etc..

As looking at these changes it will be huge nightmare to keep track of every chef-client and inspec target installed everywhere when we got autoscaling and build systems running Chef as we prefer to use the official binaries but with this change that seems we may have to fork the Open Source Repos, even if we paying for some of infrastructure to be central managed by chef directly so we are 100% confident we not breaching any terms of service.

Will the build release process be also made open source so we can have confidence we will be creating compatible builds? As we much prefer to use vendor releases but under this new licensing terms that does not seems possible :(

<comment><USER9> James -

For the $$ questions I strongly advise you talk to your sales rep. We will make it simple for you and your scenario. It's great to see real world concepts and we are working to align how you work with how we price. I'm confident we can work something out - no need to try to solve it on your own.

As for the build release process, no - we are not releasing the release engineering pipeline work. But since I'm confident we can get to constructive, affordable commercial relationship with you this shouldn't matter.

</comment></comment><comment><USER17> Reading this makes me worry that they will no longer be providing easily installable downloads that are free for commercial use.

I suppose that is a good tradeoff, like Red Hat providing RHEL source but not installation media. But it will make harder to get started with Chef, and I don't know if there is enough community motivation to create a CentOS equivalent for Chef. I hope AWS's Open Distro project takes on more software projects ([https://opendistro.github.io/for- elasticsearch/](https://opendistro.github.io/for-elasticsearch/)).

<comment><USER9> @antoncohen - We will provide easily installable downloads for non-commercial, experimentation, and individual use which should make getting started with Chef just as easy today as it was yesterday.

<comment><USER2> What prevents companies from using those downloads for commercial use? Is it "just" a copyright violation (i.e., the same thing that prevents them from paying for one copy of Windows and running a thousand), or is there something in the code (limits on scaling, time bombs, etc.) to make them unsuitable for production use?

<comment><USER4> Historically the answer is nothing, or very little. The commercial products have a licensing mechanism that nags you, or at least it did. I don't know what their plan is on that - but I know they'll do it in public now. :)

Since everything Chef makes is used for production infrastructure, they have historically avoided doing anything that would break functionality for license compliance.

</comment></comment></comment></comment><comment><USER18> You will get a lot more customers if you drop the enterprise-style website and the contact form requirements for downloads. Switch to a Stripe-like landing page.

</comment><comment><USER19> Any reason to use Chef instead of Ansible ?

<comment><USER20> If you already have a complete config management setup, you're already getting 85% of the benefit.

If you're choosing one, Chef and Puppet work by having an agent on each client contact a server and pull down whatever's designated for that client. Then they try to make the local client conform to that state. Ansible is a push system where your server goes out to each client and tells it what to do over SSH.

In the event of a server issue, a chef-controlled system will continue trying to be in the last state it downloaded. That is, if you make a manual changeto something that chef controls, expect it to be reverted shortly. An ansible- controlled system will diverge with every manual change, up until contact with the server is regained.

The major difference between Chef and Puppet is that Chef recipes are Ruby programs with supplementary libraries, while Puppet uses a DSL written in Ruby. If you already have some Ruby experience or coworkers who write in Ruby, Chef is probably a better choice for that alone.

If you don't know any Ruby at all, ansible configuration may be faster for you to pick up.

<comment><USER21> FWIW, we've had a lot of success with a super simple pull version of ansible. You can configure ansible to run against a local host instead of via ssh push, so we have a cron on all servers that pulls the latest configs from S3, runs ansible, and reports any failures to cloudwatch metrics. This is a good fit in particular for configuring stable host OSes that don't change all that often, for something like deploying application code where you want to be able to run it right away instead of in ~30 minutes the next time the cron runs. If we really needed to push out a critical patch or something, we could also parallel ssh to the necessary servers and trigger a run immediately.

I believe Ansible Tower is their enterprise tool to do a similar pull-based model. I haven't used it but I've used a Puppetmaster setup in the past, and I'm really not a fan of how much of walled garden, standalone solution these things all are. They introduce coordination that you might not really need and have their own protocols for dealing with it, they have their own patterns for bootstrapping new servers, authentication to servers, encrypting secrets, tracking which servers are up or down, etc. and a lot of that is redundant with other tools you might be using (e.g., secret management or monitoring) and other primitives that the cloud provider likely has built in (like IAM profiles to solve the bootstrapping problem).

<comment><USER22> What you've described is essentially Puppet in masterless mode.

One of the reasons why I prefer Puppet to Ansible is the speed: Ansible in push mode is incredibly slow, even after applying all of the recommended tuning options and configuring Mitogen. I haven't yet used Ansible in pull mode on a large scale infrastructure, but I'd love to know if it's faster.

</comment></comment></comment></comment><comment><USER23> TLDR:

\- "Chef will move all of our product software development to an open source model with 100% of our product code available and licensed under Apache 2.0"

\- "Chef will produce a new distribution (release), Chef Enterprise Automation Stack, built for commercial users with new terms and conditions of use."

<comment><USER24> From the FAQ ([https://www.chef.io/bmc-faq/](https://www.chef.io/bmc-faq/)):

Q: What do I have to differently today than I had to do yesterday?

For our existing commercial customers there is no action required.

For existing customers using Chef for non-commercial purposes, experimentation, or individual use there is no change.

For contributors to Chef OSS projects, non-profits, and other special groups we are still working on how we will partner with those communities around licensing Chef products. Stay tuned for more info.

Everyone else can continue using our current releases in perpetuity – although they will be end-of-support in 12 months and no further bug fixes or security updates will be available for those versions without a commercial arrangement. Customers who choose to use our new software versions will be subject to the new license terms and will have an opportunity to create a commercial relationship with Chef, with all of the accompanying benefits that provides.

Q: How will this impact existing customers?

For existing customers this change will not impact their usage or contracts. Companies that already pay us for Chef Infra (formerly Chef), Chef Inspec, Chef Habitat and/or Chef Automate will continue to do so and we will continue to increase the value of their relationship with Chef.

Users who do not pay Chef today (use our free open source binaries), and net new users, will have three options going forward:

        License our commercial software distribution.
        Take our open source code and create a software development org to build and manage their own distro (create their own downstream fork) or leverage a public free distribution (which may or may not exist).
        Stay on an older free distribution in perpetuity. For example, they could use Chef 14.7.17 forever but they would not receive security updates , bug fixes or support from Chef starting 1 year after Chef 15 is released.

We will make licensing accommodations for individuals and significant community contributors to continue to use Chef Infra, Chef Inspec and Chef Habitat in the same way that they have been. In addition, we want to make it equally easy to experiment and self-learn with our various products.

Finally, we will have a low cost "Essentials" suite of our commercial distributions that should satisfy the needs of smaller businesses.

<comment><USER25> So on one hand all the software will be open source and on the other hand there will be no free as in beer distribution anymore. Sounds similar to the RedHat model. I wonder if the community is active enough to produce a CentOS like alternative distribution for Chef.

The Essentials distribution is interesting, I wonder what is in it. I assume it will not have things like Role Based Access Control (RBAC).

<comment><USER4> Original author of Chef here (although no longer with the company day-to-day). I would not assume that - 100% of the software Chef produces is open source, so no reason to ever differentiate on features in licensing. So I doubt they would remove anything.

<comment><USER9> Correct - Essentials is just a low cost suite of Chef products. We offer two suites,. Effortless Infrastructure, focused on core config mgmt and security/compliance use cases and Enterprise Automation Stack which includes all of that plus a wide range of app automation capabilities including dependency mgmt, lifecycle mgmt, etc.

see pricing for the suites at [https://www.chef.io/pricing/](https://www.chef.io/pricing/)

<comment><USER25> Cool! Thanks for following up.

</comment></comment></comment></comment></comment></comment><comment><USER26> Too late, as people are moving away from bloated Chef and Puppet.

<comment><USER27> To where?

<comment><USER26> Containers, orchestration of containers. Lots of ad hoc tasks can be done with ansible.

</comment></comment></comment><comment><USER28> Disgusted by the spin. They are making it so more people will pay them by saying "we are more open and free". Dishonest.

<comment><USER29> "we are more open and free" \- There is nothing dishonest about that. What we are seeing is companies trying out different business models and seeing what works. I can respect that.

As an end user, if you care about free software- this is good news. Instead of having different "Enterprise" and artificially handicapped "open-source" edition, we get to see everything out in the open. The secret sauce is now limited to the release process. They say openly that if you need to, fork them and create your own releases - yeah go for the "knockoffs" if you can trust them - or else try the branded (Chef) product.

MongoDB got a lot of flak for misappropriating the name "open source". What Chef is doing is IMHO more clear and honest. They need to make money too.</comment></comment>


Clojure, the Good Parts - <AUTHOR> https://rasterize.io/blog/clojure-the-good-parts.html <comment><USER3> Programmers should know their trade-offs. It's not so much that STM should be avoided, but that the use cases it was designed for don't often present themselves in production. Same with agents, core.async, metadata, etc.

So I also get a bit twitchy when I hear for wholesale use of Timbre, Component, Schema. Every one of these libraries has tradeoffs. And those tradeoffs should be understood before adopting them. As an example, if you have a need for Schema, perhaps your data model needs some refining. Maybe you need Schema at the edges of your API, but you should define why you need a library before you just adopt it wholesale.

Likewise with Timbre, often we need tight integration with Java tools, so perhaps my project really does need a "native" java logging library.

Perhaps "understand all the trade-offs" should be the mantra of programming, in any language.

<comment><USER4> The sweeping recommendation on STM was especially hollow to me since the software I work on doesn't use a database at all.

<comment><USER5> A lot of his points say to offload to services such as a database or queue. It makes sense that if all you are doing in your Clojure application is some simple business logic then you won't need the more sophisticated tools for concurrency and shared state, but if you were trying to write those services in the first place, or if you need higher performance so that sending everything over a socket to a database isn't realistic, then you may need them.

<comment><USER6> This really only makes sense for service-oriented software. Not all uses of clojure attempt to saturate use of available resources, and here STM is a win.

But the OP implicitly assumed everyone was writing "production" software, assumably as part of a commercial service offering.

<comment><USER7> Although he didn't reiterate it in the STM section, up front he was pretty explicit about what he meant by "production" software, really a specific kind of production software. So the recommendations might not apply if you write a different kind.

 _To make my biases explicit, I mostly write webapps and data analysis on servers in the cloud. If you use Clojure in significantly different applications, these recommendations might not apply to you._

</comment></comment></comment></comment></comment><comment> j-pb I don't agree on a few points.

Global atoms provide a good way to confine state into a single place. In my applications they serve as a in-memory database while everything persistent is written to disk in the form of a log (kafka, file append, you name it).

Agents provide a good way to serialise events akin to a transactor. Not every problem requires the parallelism or the concurrency gained by smearing it out into a nondeterministic pile of communicating processes that is a nightmare to test. In those cases having determinism and centralised state is a godsend. I see them as the atoms bigger brother.

In cases where you need some concurrency or parallelism futures are fine. They provide a simpler interface and can even be canceled as first class citizens, unlike CSProcesses which potentially linger around indefinitely without having a first class handle to kill them or see their status.

Core.async is heavily overused. If your application doesn't contain a multitude of moving parts that all need to execute concurrently I wouldn't touch it with a ten feet pole. The go macro is a clojure to continuation passing style compiler, and don't get me wrong it's a marvel of engineering, but it's also a sausage machine that makes code impossible to debug. The fact that processes aren't first class citizens makes it impossible to build erlang style resilient systems, and creates tons of zombie processes when using figwheel. People immediately grab it when building cljs applications even though a log/queue would give them much more reliable performance guarantees, much better debug-ability and better tool compatibility. (Re-Frame for example ditched core.async for their own queue implementation.) (If somebody is sharing that sentiment and looking for a kafka style log for cljs, I wrote one and it's been used in production for a while :) [https://gitlab.com/j-pb/franz](https://gitlab.com/j-pb/franz))

Last but not least, transducers make it onto my list of things to avoid. I'm not sure if they or core.async are clojures million dollar mistake. They are incredibly complex, even brought the spawn of the devil, volatile, into the language. Just for a bit of speedup and core.async integration.

<comment><USER8> > Global atoms provide a good way to confine state into a single place.

I think it's simpler to pass state as an argument to your functions instead. That's less complex and easier to test.

> Last but not least, transducers make it onto my list of things to avoid... > They are incredibly complex, even brought the spawn of the devil, volatile, > into the language. Just for a bit of speedup and core.async integration.

Transducers are not just for performance and core.async. They're a hugely useful tool that allows the various collection functions to be applied to sources that are not easily seq-able.

For instance, say I have some source of events, and I can register a callback to receive events. With transducers I can still use all the standard collection functions, even though there isn't an obvious collection to use them on.

<comment> j-pb > I think it's simpler to pass state as an argument to your functions instead. > That's less complex and easier to test.

I completely agree with that sentiment. But I prefer to execute those functions with swap! on my application state.

That way I can always inspect it in the repl during development and production. Which is not so easy when it's just bound in the local variable of some thread somewhere.

As for transducers, tbh I haven't encountered the use case you describe yet.

</comment></comment></comment><comment><USER9> It's sad to see that STM is not recommended. It is _hugely_ important in Haskell. I jump to believe that this is an artifact of type-driven STM, but it may be something else instead.

I've recently moved from Component to Mount. It is less powerful but just a vast syntactic overhead reduction.

Absolutely avoid metadata. The worst thing ever is using it like how Reagent does in ClojureScript where it _actually provides important program semantics_. This is a Terrifically Bad Idea.

Schema is wonderful. Schema is terrible. It is nothing resembling a replacement for static types. The more you use it the more obviously it is deficient for such things.

Absolutely just use Clojure.Test. I don't even understand why this is a question. What is up with cutesy testing APIs?

<comment><AUTHOR> Haskell noob here. How is STM used in Haskell? What is type-driven STM?

In Clojure, I don't recommend it because it's Just Another Place To Stick State. It's cool, but provides little semantic value over compare-and-set! on an atom.

<comment><USER10> Aren't atoms a part of STM in clojure?

<comment><USER11> Nope, atoms are based on simple CAS (Compare And Swap) operation that replaces the reference value. They are pretty much a sugar around AtomicReference in Java (in case of JVM implementation of course).

It is pretty much as like this

      1. Dereference a variable and keep the old reference.
      2. Create a new modified variable.
      3. Use CAS on old reference and new variable
              to update the reference to point to the new vairable.
        In case of failure (some other thread made the update before) go to 1.

But the version of SMT implemented in Closure is very similar to the CAS, just now you can apply it to the multiple variables i.e. it is multi variable CAS.

It has the same drawbacks and advantages as atomic references: your code does not depend on lock taking order (as they are managed by the transaction manager) and you avoid dead locks as the locks are taken in the same order before applying the update, but now two different threads can start the transaction to update the same variable, but only one of them can finish as the first one and the other one should be cancelled and repeated.

In principle you can get away with a simple atomic reference (that is much faster) when the set of the updated variables is always the same - you make a pair of them and update them together.

<comment><USER10> Interesting. I've never needed anything other than the occasional atom.

</comment></comment></comment></comment></comment><comment><USER12> Solid advice (I've been writing Clojure for the last 6 years or so and I agree with pretty much everything). I would like to add, however:

* before you decide to use Component, take a look at Mount and see which one suits you better (I settled on mount for both Clojure and ClojureScript and I'm happy so far),

* use Timbre: yes. Definitely. In fact, pretty much anything by Peter Taoussanis will be a good choice (for example, Sente is a wonderful tool for writing client+server apps). If you use Timbre in a mixed Clojure+ClojureScript application, consider sending logging from client-side to server side via Sente. I did and it's fantastic to be able to log something in ClojureScript code and have it appear in your server logs. Just don't overdo it, or you'll be flooded with logs.

* avoid lein plugins: yes, in general. But I still use one, lein-git-version, which names output artifacts using `git describe --tags` and places a version.txt file in resources/. This is difficult to do in any other way.

<comment><USER13> We don't use Component in production, because it's way too heavy for us. Our web store uses Datomic, PayPal and Stripe, and a few AWS services, and none of these need to be started or stopped.

But we do take a tip or two from stuartsierra's "Reloadable" work flow (which he based Component on), specifically that there should be no global state, and all dependencies should be passed into functions that need them as a parameter.

In our case, we call it `env` since it's the "environment" that a function runs in or can affect, and contains things like the database connection, email service, etc.

Some of these are records which implement a protocol, so that you can have e.g. LiveEmailService in production and MemoryEmailService in development or while running tests.

All in all, I like and have used some of Stuart's ideas, but not necessarily Component itself. There's strong mindshare for it in the Clojure community right now, and it's tempting to look at it as The Solution™ for almost everyone's use-cases because of that. And the ideas it has are good, but that doesn't always mean it's the best solution for each person.

<comment><USER10> Isn't your use of an env as a parameter just another form of global state?

If not, can you elaborate?

<comment><USER14> Consider unit testing. With global state, it gets harder to keep things clean; requires more "resetting" type code.

</comment></comment></comment></comment><comment><USER8> The article has some fairly reasonable rules of thumb to follow. For whatever reason I rarely find refs or agents to be useful, and lexical scoping is more limited and predictable than dynamic scoping.

That said, I feel it's a little too harsh in places. Metadata is fine so long as you don't expect it to persist to derived data structures. If you think of metadata as being about a particular piece of data and nothing else, then you won't run into problems. One place I find metadata particularly useful is annotating event data, which could allow, for example, treating events from different sources with different priorities.

I find that there are a lot of specialised tools in Clojure. Most of the time it's good advice to avoid them, but in the rare cases where they are needed, you're glad to have them. Keyword inheritance, for instance, is something I've been using recently, yet I've rarely had need of it before.

</comment><comment><USER15> Pretty good list that I mostly agree with. I think the only point of contention I may have is with using timbre--having tried it in the past, I found it didn't do much that clojure.tools.logging couldn't do for most use- cases, and added configuration complexity while not sparing me the trouble of dealing with logback XML configs and whatnot--Java logging seems to rears its ugly head no matter what you do, especially when using a fair amount of interop as our project does (and as any big project probably does to some extent). Seems like it's best to simply suck it up and learn how Java logging works. But, it's probably worth giving it the benefit of the doubt, and perhaps I should give it another shot--it's been a little while since I last tried it so maybe it's improved, or maybe I simply didn't understand well enough how to set it up effectively.

Otherwise, lots of great points. One other thing I will say about Schema ([https://github.com/plumatic/schema](https://github.com/plumatic/schema)): while it's a lifesaver in a lot of ways, its mere existence really does expose some of Clojure's deficiencies when it comes to the type system (or lack thereof). I'm probably in the minority in the Clojure world but I really wish that it had better static typing and a more sophisticated type system sometimes. I've mostly made my peace with it but once in a while I look longingly at ML-family languages from afar...

<comment><AUTHOR> Author here. I agree, Timbre is new, and has some rough edges, but in my projects, I've found them worth putting up with. In my current project (18k LoClojure), I think the only serious dependency I have that uses j.u.logging or SLF4J is Datomic. Timbre has an interop library that will pipe java logs through timbre.

I agree knowledge of how Java logging works is still useful, but I'm not willing to be part of the problem anymore :-)

Agreed on Schema, and how it illustrates deficiencies in the type system. I still want core.typed, or something like it, but it's too immature for production use.

<comment><USER15> Totally understood re: timbre and not being a part of the problem of the Java logging ecosystem. I'll play with it again next time I have a chance and see if the interop lib can't solve some of the issues I had before.

Yeah, the post you folks put out on core.typed last fall ([https://circleci.com/blog/why-were-no-longer-using-core- type...](https://circleci.com/blog/why-were-no-longer-using-core-typed/)) was certainly disappointing but not unexpected...I'm curious to see if Jaunt goes anywhere at this point too: [https://www.arrdem.com/2016/02/22/clojarr_- _a_friendly_cloju...](https://www.arrdem.com/2016/02/22/clojarr_- _a_friendly_clojure_fork/)

Anyways, thanks for the piece!

</comment></comment></comment><comment><USER16> I am not sure about this article. Using Clojure for ~6 years I know one thing for sure: use whatever gets the job done for you. Using X, don't use Y is just another way of saying, you do not need to get to know the tool you are using. Offering very little insight into why that decision has made is just not really appealing to me as an engineer who likes to know the internals of the tools he uses, does not matter if it is the linux kernel, a firmware of a high level programming language.

</comment><comment><USER17> I agree with most of the recommendation in this article (thanks for publishing it!), but the advice about futures should be taken with a grain of salt. You need to be careful with futures because they swallow exceptions. However, the solution given (setting a global exceptions handler), while sound advice in general, doesn't actually solve the problem of hidden errors, as futures catch all exceptions and return them (so the caller can handle the failure in whatever way it prefers).

If your goal is "fire and forget" behavior (e.g. sending off a confirmation email), then it's better to use java.util.concurrent.Executors directly. It's actually easier than it sounds: [https://gist.github.com/pesterhazy/c41786690ee0f8a3e5a21f88f...](https://gist.github.com/pesterhazy/c41786690ee0f8a3e5a21f88fa4a486a). Also see [https://stuartsierra.com/2015/05/27/clojure-uncaught- excepti...](https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions)

</comment><comment><USER18> Hm, I've used defs and bindings together inside macros to reduce redundant args like this function here: [https://github.com/shriphani/clj- lmdb/blob/master/src/clj_lm...](https://github.com/shriphani/clj- lmdb/blob/master/src/clj_lmdb/core.clj#L68)

I think brevity is far more important than being explicit all the time. When we speak, we use a lot of context to infer what is said - no reason code shouldn't look like that.

<comment><USER19> The problem with that is that if `put!` or some other function is used inside `map` or some other lazy context, it may get realized outside the context of `with-read-txn`. Making `binding` part of your public API breaks referential transparency.

<comment><USER18> So what would you recommend that function look like? I think it is bad taste to say (with-read-txn db-name (put! db-name)) - no reason you should specify again what db you are dealing with.

<comment><USER19> There's plenty of reason: you can put any code you like inside of `with-read- txn`, including closures that are evaluated lazily. If you dislike the duplication, create a syntactic form that allows less, like this:

        (transaction-> db-name
          (put! ...)
          ...)

This doesn't lend itself to every kind of action, but it is narrower. Alternately, create a variadic version of `put!` which guarantees eager evaluation inside of a transaction.

The nightmare scenario here is not that the sequence will lazily evaluate outside of `with-read-txn`, because that at least will throw an error. Rather, it's that it will be evaluated inside a _different_ transaction, without anyone ever realizing it. By leaving that possibility open, you're doing a huge disservice to the users of your library.

<comment><USER18> Ok I see your point. I am curious how that would happen though - <USER2> you'll need to bind the _txn_ to a different transaction from the one intended and the whole thing locks up.

I am curious how to guarantee eager evaluation - dorun, doall and run! are all sequence-oriented right?

<comment><USER19> It's not that hard to imagine: map a `get` over a series of keys inside a transaction, return that lazy sequence, and use the results to do another series of operations within a different transaction.

Libraries typically can't guarantee eager evaluation, since that's a property of the top-level execution. That's why libraries shouldn't use `binding`.

<comment><USER18> Funnily enough, I think I picked up this habit from Korma source: [https://github.com/korma/Korma/blob/master/src/korma/db.clj#...](https://github.com/korma/Korma/blob/master/src/korma/db.clj#L299)

</comment></comment></comment></comment></comment></comment></comment><comment><USER20> I like the write-up, but I disagree with the reasoning to avoid STM. It sounds a lot like "avoid ConcurrentHashMap in Java". It's true that web applications mostly persist their data in a database or some other persistent structure, and obviously an STM or a ConcurrentHashMap would not do you any good for that. However; if you are working with in-memory data, then STM is a very valuable tool just like ConcurrenthHashMap is.

<comment><USER21> That was going to be my point as well. My "production" application runs light shows for electronic music events. The only state that matters is in-memory in the STM. There is no database. STM works wonderfully in the rare cases where there are multiple values which need to be changed in a coordinated way.

</comment></comment><comment><USER22> _Use raw Java concurrency instead._

Back to square one.

<comment><USER23> Um, not really.

The main feature that Clojure provides for concurrency is immutability, not just the possibility of using existing data structures in an immutable manner, but an entire suite of immutable data types and data structures. This makes concurrency, even using Java's primitives, like Thread, (which was the original way Clojure was intended to be used anyway,) with Clojure's data structures is a win over using Java's if you want safe, predictable behaviour in a concurrent program.

<comment><USER22> Thanks, skimming through clojure's website it mentions that _Clojure simplifies multi-threaded programming in several ways. Because the core data structures are immutable, they can be shared readily between threads._ which is exactly what you said, I though its concurrency features where emphasized more on its refs stuff(refs, agents) or futures, delays, promises. Also reading that clojure being hosted is a feature then I guess leveraging the host is idiomatic, (using Thread or other concurrency APIs).

Can you elaborate on why using Thread was the intended way to use Clojure for concurrency?

</comment></comment></comment><comment><USER24> Most of these are excellent pieces of advice, and practices I generally try to adhere to. I don't use schema as much as I used to, but timbre is fantastic, clojure.test is great, and all of the core points are excellent. I've never had cause to use agents or STM, and atoms are best used when enclosing some stateful function.

core.async is also great, but not without caveats, and it also has some strong footgun potential. I've written a little bit on the subject [http://blog.goose.haus/2016/04/01/the-puts-and-takes-of- core...](http://blog.goose.haus/2016/04/01/the-puts-and-takes-of-core- async.html) and [http://blog.goose.haus/2016/04/04/producers-and-error- handli...](http://blog.goose.haus/2016/04/04/producers-and-error- handling.html), with more coming, but the tl;dr is that core.async will swallow exceptions by default and there are a few other gotchas.

</comment><comment><USER25> It would be great if the author of the post expounded on the good libraries to use. In the couple of false starts I have had with clojure I spent most of my time evaluating libraries instead of writing code.

Also: Seeing what clojure considers bad parts makes me laugh since I spend most of my day writing python and javascript.

More language orthogonality more problems I guess..

<comment><USER26> It's like, the more languages I come across, the more problems I see...

<comment><USER25> Yes! At this point I have come to accept that there will be many annoyances in any programming language.

Seeing how sophisticated clojure is compared to python makes me weep however.

</comment></comment></comment><comment><USER27> I agree that using binding to avoid passing arguments is a bad design. That is not the only use of binding or more generally dynamic/special vars.

Clojure has naive implementations of pmap, send, send-off & future. They're useful in the REPL, but you need to understand their shortcomings before using in would-be production code. Promise & delay have limitations, but are not so hamstrung as former functions.

Even if you don't expect any function to preserve meta, metadata is still useful. E.g., I've used it on a compiler to provide compiler tracing and decompilation.

Component is not essential. It helps if you're accustomed to OO languages. It's arguably better than the procedural style of with-redefs & bindings.

As amazing as core.async is, I am not a fan. I'd rather use queues, logs or an actor library.

</comment><comment><USER28> Why Clojure instead of Racket (or even Common Lisp)?

Is it because of Java interop?

<comment><USER29> Sometimes it's for Java/Javascript interop or access to the large variety of libs in those languages, but other possible reasons you might pick Clojure instead of another Lisp are:

1\. immutable by default 2\. strong focus on concurrency/parallelism 3\. well- thought-out design of core library (one of the most cohesive I've ever seen) 4\. largest single Lisp community (just going by GitHub, Clojure has ~18k repos, CL has 10k, Racket has 5.5k, Scheme has 7.5k) 5\. unified syntactic sugar for common data structures like maps/arrays

The above are just factors that distinguish it from other Lisp-based languages. If you're coming from Java/C/C++/Ruby/Python/PHP/etc, there's way more reasons than that.

</comment></comment><comment><USER26> _Prefer Clojure Over Build Tools_

Clojure scripts take several seconds to start for me, and even jars take almost a full second. Am I doing g it wrong? Do people actually find this tolerable, when they are piping several of these scripts together, with the later stages being started a new for each input?

I must be doing it wrong. Are these clojure build tools supposed to run as daemons, that take requests from... bash scripts?

<comment><USER26> Oh I know, I can write clojurescript tools, and run them through node ;)

</comment></comment><comment><USER30> The Thread/setDefaultUncaughtExceptionHandler code! I read that and went, Oh! Is _that_ how you do it! Why is this not the default? I've found the silent exception raising in futures to be one of the warts of Clojure. I had resorted to a macro that I used instead of future that caught the exception and reported it.

+1 for the pro tip!

</comment><comment><USER31> Metadata was a really nice idea and I was exited about it, back in 1.0. Sadly because of clojure hosted nature, it was really hard to interduce. Their is to much native stuff that can not handle it very well. Its sometimes nice, but not often.

If your doing a new language, you should look into it.

</comment><comment><USER32> 9 out of 10 arguers by authority agree... bindings are code smell

</comment><comment><USER33> Any recommendations for routing / handling web requests? The article doesn't mention anything in this category.

<comment><USER34> Compojure is pretty standard for routing on top of the simple Ring abstraction.

I start projects with the template:

        lein new compojure my-app

Ring quickstart: [https://github.com/ring- clojure/ring/wiki](https://github.com/ring-clojure/ring/wiki)

Ring API docs: [http://ring-clojure.github.io/ring/](http://ring- clojure.github.io/ring/)</comment></comment>


Show HN: Stag, Streaming graphs inside your terminal - <AUTHOR> http://seenaburns.github.io/stag/ <comment><USER2> This is really cool, do you have any real life examples?

<comment><AUTHOR> Any script you throw together to output floats works. One example I have (for linux) samples wlan0 stats every two seconds to test download kbps.

The code is here: [https://github.com/seenaburns/stag/blob/master/examples/netw...](https://github.com/seenaburns/stag/blob/master/examples/network.sh)

Trying out some of the examples for Spark is also fun: [https://github.com/holman/spark/wiki/Wicked-Cool- Usage](https://github.com/holman/spark/wiki/Wicked-Cool-Usage)</comment></comment>


How Facebook's Oracular Algorithm Determines the Fates of Startups - <AUTHOR> https://www.nytimes.com/2017/11/02/magazine/how-facebooks-oracular-algorithm-determines-the-fates-of-start-ups.html?rref=collection%2Fsectioncollection%2Fmagazine&action=click&contentCollection=magazine&region=rank&module=package&version=highlights&contentPlacement=3&pgtype=sectionfront <comment><USER2> Good long read. With a real world example of a startup called Hubble Contacts pursuing their distribution strategy through Facebook ad microtargeting and Instagram promotions.

Nice blueprint for managing a small team with limited resources. Producing inbound content. Raising venture funds. Sourcing and packaging product. Discovering secondary network leads. Dealing with customer service. And on and on ;)</comment>


Details on the TCP "Split Handshake" Attack [pdf] - <AUTHOR> http://nmap.org/misc/split-handshake.pdf

<comment><USER2> Almost a dupe of: <http://news.ycombinator.com/item?id=2441553></comment>


Ask HN: Where did you go to college? - <AUTHOR>

Today I was denied from my first choice school and I'm anxious to send out my regular decision applications soon. I am interested in studying business, but more specifically entrepreneurship or marketing.<p>Where did you choose go to college, and why? <comment><USER2> The Royal Melbourne Institute of Technology in Melbourne, Australia. It turned out to be a complete dud. I went there to do Communications and Electronic Engineering in 1981 because it was famous (our own MIT) and hard to get into and I was very disappointed. Like two other institutions I have encountered, the good people were vastly outnumbered by the bad ones. I kept having the feeling that we were being taught engineering by a bunch of failed engineers who couldn't hack it in the real world. That turned out to be true when I worked with some of them later on. They were bright enough for rote memory and battling fellow academics but they had no real feeling for what they were doing.

One of my biggest regrets is that I had an opportunity to move to another uni, less famous but still accredited, after my first year (Freshman) and I didn't take it. I eventually dropped out in third year (Junior).

</comment><comment><USER3> Get an engineering degree, then get an MBA. But if you are set on business, I got my MBA (mostly entrepreneurship and marketing) right out of undergrad at Indiana University so I kind of enjoyed the undergrad life while in grad school and it was great. It's a top ten business program and Bloomington, IN is a great town.

One of the countries largest biotech firms offered to pay for my MBA (I was extremely talented in the biological sciences) at a few different schools, I got to pick. All the schools were about the same rank but IU had a brand new building, a top ranked entrepreneurship and marketing program, and really hot girls. I had a blast and learned quite a lot, though compared to getting an engineering degree the MBA program was a breeze, so I got to enjoy the college lifestyle I didn't have during undergrad.

You should take a look at IU Bloomington.

</comment><comment><USER4> Simon's Rock College of Bard.

I was incredibly bored in high school and it is a school designed for bright kids who aren't doing well in high school due to boredom. If I hadn't gotten out when I did, I was on a fast track to a state school w/ lecture classes, more boredom and probably dropping out...

</comment><comment><USER5> If you are looking at Entrepreneurship and/or Marketing, do what I did and attend the University of Houston.

UH has the #1 Entrepreneurship program in the country (<http://bit.ly/feQIsL>) and the #1 Sales program in the country (<http://bit.ly/gTaHte>).

There are TONS of companies that recruit here as well for jobs and internships. Entrepreneurship program rankings from Entrepreneur Magazine (<http://bit.ly/3jZHv0>).

I went there because I wanted to be in a big city and I hate the cold. No snow in Houston :-D

Edit: I double-majored in Marketing and Entrepreneurship. It was only 3 extra courses for both degrees.

</comment><comment><USER6> University of Mo., ROlla: It sounded cool. University of Wi, Whitewater: Had family nearby Praire State college: Convenient. Indian River Community College: Convenient. Florida Atlantic College: Convenient-Computer Engineering degree at age 36.

</comment><comment><USER7> I went to film school for 1 semester then studied performance art for a semester before dropping out. Less than 2 years later raised 750k for my first startup.

Formal education can be very important; being an autodidact is just as important.

</comment><comment><USER8> Got both my B.S. Degrees at a state university in TX; they offered me a good scholarship and it was far enough from home. As a programmer/engineer I have to say that school is less important than what you do with yourself while in school - particularly if you want to go the entrepenuer route.

Of course for some professions (lawyer or doctor?) if you have your sights set on a particular employer you'd probably better cater to any favored alma mater(s) that employer has.

Bottom line is study what you love and work hard at it; you'll get good/better as you go. Take schooling seriously but not too seriously.

</comment><comment><USER9> London School of Economics. The opportunities on offer for grad school were really good. Great peers, amazing public lectures, awesome job opportunities, the school is slowly developing a start-up/entrepreneurship culture via societies and the careers service. Lastly, the campus is based right in the heart of the city.

I had an awesome year and I still have regrets about not doing more extra- curriculars/freelance/taking up opportunities.

</comment><comment><USER10> I went to a variety of in-state schools. My advice to people selecting a school for an undergraduate degree is to decide the sort of environment you want to live in for the next four years, then select a school in that type of environment.

There's a Manhattan in New York and in Kansas. Each is the best choice for some people.

<comment><USER11> _There's a Manhattan in New York and in Kansas. Each is the best choice for some people._

Manhattan Kansas rocks (or did when I was there). :)

</comment></comment><comment><USER12> Two days left at the University of Illinois in Urbana-Champaign. General Engineering (aka Enterprise Systems Engineering). Worst decision of my life. Thank goodness I'm graduating early, thus only wasting 3.5 years of my life as opposed to the typical 4 or 5 years.

<comment><USER13> Hey I went to UIUC for Electrical and Computer Engineering (ECE), the best 4 years (and decision) of my life :-) Of course, it was 95-99 so some of the headiest, fastest paced years in the history of mankind. God I miss the 90s. I feel bad for kids who had to grow up in the 2000s, but am hopeful that they will work harder than we did to make the world a better place.

</comment></comment><comment><USER14> Technical University of Madrid. I love the city but the university is generally out of sync with reality and passing is very hard, let alone getting good grades. Illinois Institute of Technology. I love Chicago too, but it's cold!

</comment><comment><USER15> Harvard. I applied back when they had early action, got in, and then didn't apply anywhere else.

I went primarily for the name, which in retrospect was not a good reason, but I ended up learning a lot anyway.

</comment><comment><USER16> I went to a low-caliber school because I lacked the intelligence to successfully attain the grades, test scores, and extracurricular achievements necessary to gain admission to a superior school. Now that I am either out of school or at a college whose competition is even weaker than that of my high school, I imagine that my failures were completely by choice, that I am _smart but just lazy_. Though I have zero facts to back up these delusions, I am at least free from the constant stream of academic measurement that says otherwise. Nevertheless, I still look down on those who either did not go to college or attended schools I view as inferior to even my lowly alma mater.

</comment><comment><USER17> Stanford. B.S. Physics, M.S. Aerospace Engineering. I went there for a combination of weather, prestige, good science/engineering, and weather.

It's a good place.

</comment><comment><USER18> Vienna University of Technology, Austria

Very nice place to live and some very inspiring courses in software engineering and entrepreneurship.

</comment><comment><USER19> Baylor University. I got a full ride scholarship, and it's a good school for undergraduates (if you're motivated).

</comment><comment><USER20> Loyola Chicago because I didn't want to apply to college and my parents chose it.

</comment><comment><USER21> National University of Singapore Law School.

</comment><comment><USER11> I think at last count I had taken classes from about 9 different colleges. I have an associate's, 2 completely unrelated certificates, and am a few classes short of a bachelor's (and have been "a few classes short" for a few years).

The reason: "Classic Military Wife Syndrome". :-D

</comment><comment><USER22> Rutgers</comment>


Show HN: Privacy-focused iOS hiking app - aggregator-ios https://headings.carrd.co <comment> aggregator-ios Fitness changed my life, and I wanted to use my strengths as a software engineer to help others explore the outdoors.

A lot of fitness apps present information in a newsfeed or through competitions. Unfortunately, this is the same kind of environment that is intimidating in a gym or any activity where there's a large group of people who have been doing it for years. I made Headings to make it comfortable for people to explore at their own pace and privacy.

Everything in Headings is private by default. So you never see others' stats, or have emotions about how you're doing compared to someone else. It also respects your privacy by not displaying ads, or selling your information.

<comment><AUTHOR> Could you add your twitter or contact page on the product page which I can use to reach out to you?

</comment></comment><comment><USER2> It's hard for me to make that commitment to download if the website provides literally zero information on UI, Features, or how my privacy may be protected.

</comment><comment><USER3> if this is a privacy focused app. Could you add the privacy policy to your website and post also an article explain you strategy how to keep privacy while still earning money.

</comment><comment><USER4> Looks cool! Could you allow creating an account with just email?

<comment> aggregator-ios Thank you! I was considering creating an account with email+password, but I wanted to reduce the cognitive load on both sides. The consumer side of having to remember passwords (made somewhat moot by the iOS keychain auto-suggesting strong passwords). And the implementation side (since I'm just 1 engineer) getting tricky of saving passwords securely and handling that flow.

Having said that, if there is more interest in having email+password accounts, I'm more than happy to look into it, but it would have to wait for a later version.

<comment><USER5> Presumably an app focused on privacy wouldn't even _have_ an account for the user to sign up with? Just let them install the app and off they go.

<comment><USER6> This is what I'd like!

You could maybe offer a cloud save feature (for users who want that) like Duck Duck Go does for settings.

When the user wants to save something they enter some phrase/password/whatever with which they can later retrieve it.

This would allow users to change devices or reinstall without loosing their data temporarily. Maybe delete it after it's been retrieved?

<comment> aggregator-ios I agree that this is most ideal. Thank you for the suggestions, let me investigate and see what I can do :)

</comment></comment></comment></comment></comment><comment><USER7> there is no information on the website.

or does the website for the privacy focused app require javascript to display anything other than a download button?

<comment> aggregator-ios Thanks for checking it out! The website is just a placeholder for the beta test. I didn't want to link directly to the TestFlight link, as that would have been jarring.

I've copy pasted the description from the TestFlight app description here:

Thank you for beta testing Headings! You can track your hikes, drop pins, view all of your past hikes and pins with a free Headings account

Tips for beta testing: * Test the app during a hike, bike ride, or your commute to work by pressing the "Start Hike" button. When you've reached your destination, tap on the red flag to stop recording * Look at the stats, are they accurate? * How was your battery life? Did it drain too much too quickly? * Save them to your account, did signing up for a new account work? * Drop pins along the way and see if they show up in the map * Log out of your account and log back in. Did all of your previously saved info come back?

Hope this helps!

<comment><USER8> You should add more details about how you're protecting the user's privacy. If you are saving all the geo ip data that is linked to a fb/google account in your database that may be problematic. I suggest you encrypt that with a client side key or just store everything on the client.

<comment> aggregator-ios A client side key sounds great, let me investigate this route and see how to do this. I imagine it's a similar pattern to end to end encryption.</comment></comment></comment></comment>


Ask HN: Best testing site for mobile browsers? - <AUTHOR> Got a complaint from an Android "4" user I need to support. Long story and actually have relatively lots of people using my site with very old phones. What's the best way to test for old mobile devices? (yes, I considered buying her a new phone). <comment><USER2> I have used browserstack.com and had good results but I've primarily used it for automated tests on real devices rather than manual testing, but you can do both. There are others, AWS has a device farm as does SauceLabs.

<comment><USER3> Using browserstack.com too, looks ok so far.

</comment></comment><comment><USER4> Here you can select old mobile OS: [https://www.mobilephoneemulator.com/](https://www.mobilephoneemulator.com/) but no Android 4 excactly there.

[https://kobiton.com/](https://kobiton.com/) this one seems to have more options and wide choice OS.

Another option is to install Android x86 on VirtualBox (version 4 is supported) and test on VB emulator.</comment>


Google account not letting me log out.  - <AUTHOR>

So I usually develop in FireFox on Mac, but keep Safari (3.1.2 at moment) open for occasional browsing, HackerN, googling, gmailing.
Today I notice that I cannot log OUT from gmail account from the main google.com page in Safari.  Clicking "sign out" just refreshes the page. [ Everything like Javascript is turned ON; no add-on ware to Safari. ]
Next I went to Firefox, and I could log in - and then log out, no problem.
But not from Safari.  I could track down the cookie and delete, but I'd like first to figure out WHY google should be glitching.  Doesn't this strike others as a strange state of affairs?  Ever had it in any browser? <comment><USER2> This should be on a site like Stackoverflow. That being said, the same thing happened to me. The problem was the GMail offline plugin for Google Gears. Delete it from /Library/Internet Plug-Ins/ and restart Safari.

</comment><comment><USER3> Yea this happened to me the other day. Not sure why but clearing your cookies will fix it.</comment>