ZFS Gotchas - <AUTHOR> http://nex7.blogspot.ch/2013/03/readme1st.html <comment><USER2> Non-ZFS Gotchas:

Other file systems and RAID setups do not checksum your data. If you have a mirror of two disks (RAID1) and during a read two blocks differ from one another, most (all?) RAID controllers (hardware and software) will simply choose the lower numbered disk as canonical and silently "repair" the bad block. This leads to loads of silent data corruption on what we might consider a reliable storage solution.

By contrast, ZFS will store both the block and its checksum and will use the block with the correct checksum as canonical.

In other words, if you care about your data at all, use ZFS. I am frankly surprised it's not the standard file system for most situations as it is the only production filesystem that can actually be trusted with data.

P.S.: I have been told that at least on Linux if you have more than two drives, the Linux software RAID controller will try to choose the version of the block that is agreed upon by most drives, if that's possible. This is no guarantee, but it's better than randomly choosing one version.

P.P.S: BTRFS and friends seem to not yet be as production ready as ZFS. Conversely, ZFS works beautifully on Linux thanks to the ZFS on Linux project.

<comment><USER3> Sorry about the number of posts, but [https://groups.google.com/a/zfsonlinux.org/forum/#!topic/zfs...](https://groups.google.com/a/zfsonlinux.org/forum/#!topic/zfs- devel/RUBQHIaUugE) makes me very nervous to use ZFS on Linux.

<comment><USER2> I can only speak from my own limited experience, but for me ZFS on Ubuntu works as advertised. I was trying to put together a long term storage solution without becoming a storage expert. ZFS fit the bill. If you are nervous, go with a BSD: they are great choices.

<comment><USER4> I can only speak from my own limited experience, but for me RAID6 on linux works as advertised...

I'll gladly take silent data corruption over a hard total failure of the entire volume any day. At least I have a chance at fixing the former, and for my use cases that's preferable.

Every time ZFS on linux is brought up it's always met with skepticism, just as a lot of people trying out ZFS in virtual machines discovered the hard way (lost volumes) there are a lot that can go wrong (and it does seem like it can go wrong) and any version running on linux will not have been tested as much making it a risk. And that's the thing you are trying to minimize with using ZFS on Linux in the first place...

Now BTRFS isn't ready for production yet so that leaves, well, nothing if you want checksums and cheap snapshots.

I guess I'll have to wait another 5 years and see if BTRFS is ready, until then it seems the only thing I can hope for is luck.

</comment></comment></comment></comment><comment><USER5> > Examples of things you don't want to do if you want to keep your data intact > include using non-ECC RAM

I'm planning to build a (Linux) development workstation soon and was intending to run ZFS on at least a proportion of the disks in the system, if not the whole thing. But building a workstation that supports ECC appears to be ridiculously hard and expensive - most of the Haswell CPUs don't support ECC. Can anyone point me at a sensible CPU/motherboard combo that's comparable to something like an i7-4770k/Gigabyte GA-Z87MX-D3H?

(As an indication of the state of the component market, pcpartpicker.com doesn't support searching CPUs or motherboards by ECC support, but it does allow you to search by what colour the motherboard is!)

<comment><USER6> YMMV, but I've used ZFS on all my workstations and servers for over 2 years now. Many of them are ZFS on top of LUKS/cryptsetup for FDE. None of the machines use ECC RAM, and due lots of things (ie. me doing dumb shit, bad cutting edge kernel builds, fubar GFX drivers causing X to boot to black screen etc) I frequently either hard reset them, or Alt + Prtscreen + REISUB them, I've never had a single issue with ZFS.

By comparison, I've had issues with virtually every other filesystem that exists for Linux: ext(2,3,tho not 4), reiserfs, and especially the much hated xfs, death to xfs etc :)

I run his hardware, picked because... well cheap:

       GIGABYTE GA-990FXA-UD5 ( AMD 990FX/SB950 - Socket AM3+ - FSB5200 )
       4 x DDR3 4GB DDR1866 (PC3-15000) - KINGSTON HyperX [KHX1866C9D3/4G]
       or
       4 x 16gb of the same type as above
       AMD FX 8-Core FX-8320 [Socket AM3+ - 1000Kb - 3.5 GHz - 32nm ]

The ZFS all include root + swap running on ZFS with FDE, this sort of thing for workstations:

       NAME                    USED  AVAIL  REFER  MOUNTPOINT
       rpool                  13.2G  25.9G    30K  none
       rpool/root             11.1G  25.9G  5.10G  /
       rpool/root/home-users  6.02G  25.9G  6.02G  /home
       rpool/swap             2.06G  27.4G   646M  -

servers:

       NAME                         USED  AVAIL  REFER  MOUNTPOINT
       rpool0/ROOT/ROOT               6G  1.42T   198K  /
       rpool0/ROOT/swap              32G  1.42T   700M  -
       rpool0/ROOT/BACKUP           676G  1.42T   676G  /nfs/backup
       rpool0/ROOT/HOME            14.1G  1.42T  14.1G  /home
       rpool0/ROOT/MUSIC            358G  1.42T   358G  /nfs/music
       rpool0/ROOT/portage         14.9G  1.42T  14.9G  /nfs/portage
       rpool0/ROOT/vmware          45.9G  1.42T  45.9G  /vmware

The server hosts several virtual machines, many of which have their own root over NFS, the point being that the ZFS gets plenty of use.

<comment><USER7> You ever try JFS? I standardised on it for all my machines a few years ago and it's served me very well - fast fsck and no corruption so far. Bit long in the tooth now but that's no bad thing for a filesystem.

<comment><USER6> I have not, but the only reason for not trying it is because of my increasing use of RAID in hardware and VMs, I wanted something that was completely agnostic to disks, which is something ZFS delivers but JFS didn't seem to when I checked.

Basically I wanted something that doesn't intertwine the concept of file- system with the concept of disks or partitions, but as space. So changes to the underlying pool of disks (or partitions, or loopback files, etc) don't mean so much painful rebuilding for me, something I spent many hundreds of hours on in the past, often at stupid o'clock in the morning. Did I mention how much I hate XFS? That's why :)

</comment></comment></comment></comment><comment><USER8> What I would like to see is a Feynman-style "Introduction to Filesystems" geared toward programmers. And when I say Feynman-style, I mean lucid, devoid of jargon, and dense with meaningful concepts.

Granted, most application programmers don't deal with the file system in any meaningful way - most interaction is deferred to other processes (e.g. the datastore). But I for one would be interested in certain silly things like, oh, writing a program that can (empirically) tell the difference between a spinning disk and a solid state disk, or what file system it's running on, just from performance characteristics. Other fun things would be to determine just how fast you can write data to disk, and what parameters make this rate faster or slower.

</comment><comment><USER3> All this article tells me is that I'm not smart enough to run a ZFS NAS. But what are my alternatives?

<comment><USER9> I wouldn't take that lesson from it.

Many of these considerations don't have anything to do ZFS per se, but come up in designing any non-trivial storage system. These include most of the comments about IOPS capacity, the comments about characterizing your workload to understand if it would benefit from separate intent logs devices and SSD read caches, the notes about quality hardware components (like ECC RAM), and most of the notes about pool design, which come largely from the physics of disks and how most RAID-like storage systems use them.

Several of the points are just notes about good things that you could ignore if you want to, but are also easy to understand, like "compression is good." "Snapshots are not backups" is true, but that's missing the point that constant-time snapshots are incredibly useful even if they don't _also_ solve the backup problem.

Many of the caveats are highly configuration specific: hot spares are good choices in many configurations; the 128GB DRAM limit is completely bogus in my experience; and the "zfs destroy" problem has been largely fixed for a long time now.

<comment><USER3> There was a cheesy "CSI" video with some Sun engineers building a zfs pool from a crapton of USB sticks. I think I might do that to have a play with it before I spend ~$1500AUD building a NAS.

<comment><USER10> Or you could just use multiple partitions on a single scratch disk (or even a ramdisk). A great way to get familiar with the workflow and tools without going to a lot of effort. This is how I first experimented with ZFS.

<comment><USER11> You can also create files on disk and add them to pools.

There's actually a trick you can use to create a failed ZFS array (e.g. if you want to create a 5+1 array with only five disks), where you use dd to create a sparse file of the appropriate size, which lets you create a '1 TB' file while only writing 1 byte to disk. Add it to your zpool along with the rest of your disks, then fail it out, remove it, and replace it with a physical disk.

It's a good way of taking a drive with 2 TB of data on it and adding it to a ZFS filesystem which includes that disk while also keeping the data, but without using a separate disk (or copying the data twice).

<comment><USER3> Crap, I should have done that. Oh well, 4 USB sticks was only $24.

</comment></comment></comment></comment></comment></comment><comment><USER12> I don't see any mention of "for god's sake don't let your pool get more than 90% full or the molasses gremlins will ooze out of your disk controllers and gum up the plates" in that list...

</comment><comment><USER13> I'd add one more: it is impossible to remove a vdev from a pool. That means in a small server / home scenario, you have less flexibility to throw in an extra mirror vdev of old disks you had lying around, or gradually changing your storage architecture if HDD sizes increase faster than your data consumption.

However, none of these diminish what I think is the main use case of ZFS: very robustly protecting against corruption below the total-disk-failure level.

<comment><USER3> Does this mean I couldn't start with 4x3TB drives and move to 4TB drives as they become cost-effective?

This might kill my dreams of a ZFS NAS...

<comment><USER14> You can remove each disk and replace with a bigger one (wait for rebuild each time), and if you set autoexpand, the pool will resize afterwards.

<comment><USER3> Doing some more reading, this sounds like it "degrades" the array each time and could be risky. Other replies to my comment seem to suggest it can't be done.

<comment><USER15> I believe there are no problems with your scenario, there's zpool replace command which does this:

         zpool replace [-f] pool device [new_device]

             Replaces old_device with new_device.  This is equivalent to attaching
             new_device, waiting for it to resilver, and then detaching
             old_device.

             The size of new_device must be greater than or equal to the minimum
             size of all the devices in a mirror or raidz configuration.

             new_device is required if the pool is not redundant. If new_device is
             not specified, it defaults to old_device.  This form of replacement
             is useful after an existing disk has failed and has been physically
             replaced. In this case, the new disk may have the same /dev path as
             the old device, even though it is actually a different disk.  ZFS
             recognizes this.

             -f      Forces use of new_device, even if its appears to be in use.
                     Not all devices can be overridden in this manner.

<comment><USER16> Thanks for pointing this out. I still don't know how to see all of this in a home NAS context however. It would be really great if someone could explain.

Lets say I have 6 SATA ports. I have 4 drives that I collected from various computers that I now want to unify in a home built NAS:

       A. 1TB
       B. 2TB
       C. 4TB
       D. 1TB
       E. -empty-
       F. -empty-

Now all my drives are full and I want to either add a disk or replace a disk; How do I:

       1. replace disk A. with a 4TB disk
       2. add a 4TB disk on slot E.

<comment><USER10>
        1. connect 4T disk to F, "zpool replace pool A F"
        2. connect 4T disk to E, "zpool add pool E"

Where A, E, and F are virtual devices (vdevs) provided by your OS. On my FreeBSD system they are da0, da1, etc.

<comment><USER16> Thanks. There are a lot of complicated articles spread around which make ZFS seem very hard for some reason. This seems fine.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER17> Another gotcha: If you intend to physically move a pool of disks from one system to another, or even move them to different SATA or SAS ports on the same system (or different drive bays in a JBOD), you should EXPORT THE POOL FIRST. I came within a hair's breadth of losing a pool when I didn't do that, and import attempts resulted in "corrupted data" messages. I managed to straighten that out and recover the pool, but it was a close call.

When it is not exported, the pool stores the device names of its component disks, and if the wrong disks end up on the wrong devices, you get the "corrupted data" problem even though the data really isn't corrupted.

</comment><comment><USER18> Article mentions clustered file systems.

Is there any reason why one might choose that for a small office / home office setup instead of ZFS? Would it make setup/expansion easier.

Taking it in another direction.

I've been following this LeoFS project which basically replicates Amazon's S3 storage (so any S3 clients can work with it).

[http://leo-project.net/leofs/](http://leo-project.net/leofs/)

Its claim is one can add nodes to the cluster to expand its storage capability. Given enough physical space it might be cheaper to find 3-4 machines (towers) with 4 drive bays than building one new server with 12+ bays. Then use linux's fuse client to access it.

<comment><USER19> I've never seen a clustered filesystem that was friendly or simple enough for the small office / home use case. With ZFS I pile a bunch of disks in a server, run samba on it, and there you go. Still, best of luck if you try it.

<comment><USER20> Only problem with ZFS for budget/home use as I see it, is the inability to grow zpools (add a disk to get more space on an existing filesystem). Basically the the design is more "buy what you need (eg: 4x2TB), then replace (eg: 4x4TB as prices come down) -- and throw away your old disks".

<comment><USER18> Wouldn't "add more disks to get more space" also be a problem due to physical limitations on home computer style machine (even if ZFS allowed that).

At some point 2 older towers or hardware with only 4 drive bays might be cheaper than one motherboard and server tower that takes 8 or 12 drives.

That is why I was wondering about the clustered/distributed FS option.

<comment><USER20> If you're building something today, and get an avoton board, you'll have 10+sata ports on the board. I don't know what kind of midi-tower only support 4x 3.5" drives -- maybe you're thinking hot-swap, front-accessible?

If you get a full tower, you should be able to fit a couple of (or equivalent): [http://www.newegg.com/Product/Product.aspx?Item=N82E16817198...](http://www.newegg.com/Product/Product.aspx?Item=N82E16817198058)

(3.5" & 5.25" Black Tray-less 5 x 3.5" HDD in 3 x 5.25" Bay SATA Cage) in front -- if yo feel you need front-accessible drives.

I'd say you normally want less boxes to take care of (even if failure will be more catastrophic) on such a small scale. Depends on what you need of course.

</comment></comment></comment></comment></comment><comment><USER21> Is there a similar article but about BTRFS?

<comment><USER22> I'll say that reading about the ext3 to btrfs conversion made me laugh - it's a mad scientist thing that builds all the btrfs pointers in the ext3 free space, pointing to the data blocks as stored by ext3, and it keeps the filesystem readable as ext3 until it's completed and mounted as btrfs.

<comment><USER23> What's funny about it?

</comment></comment></comment><comment><USER24> Changed to document title to avoid the linkbait in "Things Nobody Told You About ZFS".

<comment><USER25> While I don't disagree that the original title is perhaps mildly link-baity, I don't think "Read me first" is very apt, either; this article assumes a nontrivial degree of familiarity with ZFS and its concepts.

<comment><USER24> Fair enough; if you or anyone would like to suggest a neutral, accurate title, we'd be happy to change it.

<comment><USER25> Something along the lines of "ZFS gotchas" or "ZFS caveats", perhaps?

Unrelated: I really don't think dang's post here warranted downvoting. I expect that it's being done by folks who _really_ want HN's moderators to know they're unhappy about titles being changed as capriciously as they sometimes are. This post is an actual moderator soliciting actual input on how to make at least one instance of that problem better, however, and I think that should be encouraged, not dinged.

<comment><USER24> Ok, we changed it to "ZFS Gotchas" because the body of the article more or less uses that word.

It's ok for dang to get dinged. But "capricious"? No. I realize it sometimes seems that way to people paying sporadic attention, but every change we make is in keeping with the HN guidelines, and those are hardly secret or unclear.

We make mistakes, of course, and are always open to improvement. The helpful way to criticize an HN title is to suggest a better one.

<comment><USER19> It may be the case that every change is in keeping with the guidelines, but it's certainly not the case that the guidelines are applied consistently. Looking at stories where the submitter added some useful, non-linkbaity detail that wasn't in the original title, it seems entirely arbitrary whether that detail will be left in place or cut from the title. And belittling your users' experience like that ("sporadic attention"?) will make you few friends.

Better policy a): Don't change the titles users submit. Trust the community to flag linkbait titles.

Better policy b): Don't allow users to submit a title. Automatically scrape the title from the linked page. Have moderators change the titles when they're unhelpful or misleading (this is much less likely to annoy users than the current system, because the moderator wouldn't be replacing the submitter's title, it would be the HN system replacing another part of the HN system).

edit: Suggest a better _title_ rather than suggest a better policy? How is one supposed to suggest a better title? There is no form for that, and it's not something to clutter the comments with.

</comment></comment></comment></comment></comment></comment><comment><USER26> > Do not use raidz1 for disks 1TB or greater in size.

Oops, I'm doing that on my home NAS. Does anyone know why this is bad?

<comment><USER27> I am as well (5x 3TB in Raidz1). I'm pretty sure it's because of the likelihood of having an unreadable bit/byte/sector on one of the non failed disks gets higher as the capacity increases and thus there is a good chance that you'll lose some data. This article discusses the theory. [http://www.zdnet.com/blog/storage/why-raid-5-stops- working-i...](http://www.zdnet.com/blog/storage/why-raid-5-stops-working- in-2009/16)

<comment><USER3> Is there a way to check statistics of failed read/writes?

<comment><USER9> "zpool status" will show if there have been errors reading data from individual devices. If a drive experiences enough failures, at least on illumos and Solaris-based systems, it will be marked degraded or faulted and removed from service. You can view individual failures on these systems with "fmdump -e". Here's a made-up worked example: [https://blogs.oracle.com/bobn/entry/zfs_and_fma_two_great](https://blogs.oracle.com/bobn/entry/zfs_and_fma_two_great)

</comment></comment></comment></comment><comment><USER17> Also note, if you're using an SAS HBA: the LSI 1068E-R based HBAs, when flashed with IT firmware, have a persistent drive mapping setting. When it is active, it will always give a specific physical disk the same device name, even if it gets moved to a different physical port. Let's say you a drive with serial number ABC123 on port 0 as c4t0d0 and serial number XYZ987 on port 1 as c4t1d0. You could swap the two drives and ABC123 would still be c4t0d0 and XYZ987 would still be c4t1d0.

If all ports on the controller were in use, and you yanked c4t7d0 and slid in a new drive, it would become c4t8d0 (unless you used lsiutil to remove the persistent mapping).

Other HBAs may have similar features.

</comment><comment><USER28> Ok, say you implemented Dedep accidentally and now your table is huge. I'm sure it is a slog to go back, but HOW DO YOU DO IT. I've tried the method here: [https://groups.google.com/a/zfsonlinux.org/forum/#!topic/zfs...](https://groups.google.com/a/zfsonlinux.org/forum/#!topic/zfs- discuss/at3Cb08d21A) and didn't get it fixed. Any more thoughts? Please don't recommend I make a new pool and send all data over, I don't have the space at 70% capacity.

</comment><comment><USER29> Overall, this is quite good. Some of it is oversold as "things nobody told you about" and some of it could really benefit from real data. A few things are a little too close to seemingly unsupported folk-wisdom rather than sound advice.

</comment><comment><USER30> Something I never see discussed, what is ZFS's effect on battery life? I have not put it on laptops for this concern.</comment>


Final Call for Papers - CCC Hacker Festival in August - <AUTHOR> http://events.ccc.de/camp/2007/Final_Call <comment><AUTHOR> The Chaos Communication Camp is an international, five-day open-air event for hackers, builders, and makers organized by the Chaos Computer Club (CCC). The camp provides a relaxed atmosphere for free exchange of technical, social and political ideas. Discuss, sunbathe, and enjoy camping with some of the most interesting people you might ever meet. And all that with internet, power, an abundance of weird self-made gadgets, and people willing to explain them to you, right next to your tent.

...

Two huge main hangars (room for 400 people each) will feature conference tracks with lectures and presentations, while workshops will take place in a central workshop area and in the various villages. To get a first glimpse of what to expect have a look at our self-organizing participants at the Camp Wiki: <http://events.ccc.de/camp/2007/Villages.>

...

Final Call for Paper Deadline: June 5th 2007, 23:59 CET</comment>


Workarea Commerce Platform - Open Source Ruby on Rails Commerce Platform - <AUTHOR> https://github.com/workarea-commerce <comment><USER2> I welcome head-to-head competitors to [https://spreecommerce.org/](https://spreecommerce.org/) which certainly has its warts. This seems to be pretty early-stage by comparison, but it can benefit from years of hindsight.

Also worth noting - [https://github.com/mirumee/saleor](https://github.com/mirumee/saleor) is an equivalent project on the Python/Django side.

<comment><USER3> It's early stage as an open source project, but it's pretty advanced as an ecommerce platform, and while it doesn't have a huge install base, the companies running Workarea are themselves sizable. It's a good solution if you've outgrown Shopify Plus but don't want to trigger Magento-induced PTSD.

Full disclosure: I'm employed by Workarea.

</comment></comment><comment><AUTHOR> Workarea Commerce Platform is now open source. It's an enterprise ecommerce / retail platform built with Ruby on Rails, MongoDB and Elasticsearch. The platform competes with Magento Enterprise and Salesforce Commerce cloud. The company behind the platform offers a cloud version as well which is a fully managed, platform as a service offering.</comment>


Translate Legal writing into English - <AUTHOR> http://bottomlineproject.org/

<comment><USER2> From the web page:

        If you want to be the first one to know
        when this becomes reality, subscribe:

Translation:

        This doesn't exist, may never exist, and
        by giving us your email you allow us to
        send you anything we like.</comment>


Why Thomas Watson was right. - <AUTHOR>

Head of IBM, Thomas Watson, is famously quoted as saying that "I think there is a world market for maybe five computers," -- while the veracity of the quote may be in question, it may in fact be largely true.
As all things do, the computing industry operates in cycles. We have seen the original monolithic machines used in the past for trajectory calculations grow, become big blue mainframes and shrink again to minis, the PC and now our mobile devices.
Currently, the computing powers of our civilization have fractured into millions of devices, billions of processors and trillions of transactions.
The sales channels and profits from the various big vendors are mind boggling and competition is fierce and a joy to behold.
But this is now.
Mr. Watson's quote (we'll just go ahead and give him credit, regardless), that there is only a market for maybe 5 computers was just 75 to 100 years too early... and lacked detail.
Cycles. The industry operates in cycles - everything is fractal. The big bang of our industry showered the planet in bits - thought, information, ideas, math, technology.... life quickly changing the fabric of humanity permanently. In a very short time, our world has changed - from Watson's piano peddling to farmers just a generation or so ago, through his leadership at IBM to now having the ability nearly instantly hear the last tweets of a celebrated director before his demise in a war torn region of the globe most of us would otherwise never think about.
The vast explosion of available technology upon the globe, and our lives looks massive, wide, diverse. So many different and varying options -- different colors, speed, screen sizes etc... there are literally too many options to pick from.
We form factions around the implementations we like, build entire businesses and careers on our choice and preference of design.
But in the end, we are all fighting over singular components. Not systems, not computers - but sensors.
The real value in everything we do, as an industry, and ultimately as a race and civilization, is in the data. The information. The creation, development and manifestation of our thoughts and knowledge.
Our relationships with one another, further our ability to communicate - digitally rebuild the tower of babel.
To these ends, we are seeing a collapsing of computing. The scale, complexity, power and capabilities growing, as Moore predicted, into perpetuity - but the idea of computing is collapsing again.
Collapsing to make Mr. Watson not only right, but prophetic.
In less than 10 years, we have seen a tiny online bookseller and a DVD mail-rental service literally redefine and set the direction for the entire industry.
Certainly, like today's outage, there are issues. But those are human issues; our design was wrong, our implementation had faults, something failed somewhere which caused a brief outage which seemed massive at the time - but in the larger picture is but a minor growing pain on the path towards the singularity.
Right now, we see the path for the current titans of our industry as they battle to maintain their dominance - but in the next ten to twenty years, the landscape will be exactly as Watson predicted.
Maybe five major computers. Each with trillions of sensors - all providing utility to their hundreds of millions of users.
Layer upon layer, built up in a global representation of the OSI - but even that model lacks enough layers to now accurately describe the scale and complexity of the worlds major compute powers.
The major computers of the world will be the future iterations of facebook, google, amazon, microsoft and apple.
These will be the physical computing behemoths upon which 90% of our digital existence will be built.
Entire cities of nodes, components, little bits of the digital fractal that has become the outward expression of all human informational consciousness - continually receiving updates via the trillions of sensors carried by every person and thing in the world.
These several ultra-compute-platforms will host the myriad of layered services and applications that are required for modern civilizations existence, providing us with seamless access to every bit we require from mundane to sublime.
They themselves will become even more interwoven, relying on each others services, infrastructure and users to survive.
Take a step back, abstract yourself from the seemingly separate nature of our reality. The device in front of you is not standalone. It never was, and it never could be. It is simply a component of a much larger, way more complex representation of its idea.
In years times, we may again find dear Watson was wrong. There was never a market for maybe five computers -- there is really only a market for one, but that one will be built supported and used through innumerable lenses represented by countless companies all building a tiny piece of a giant, global, single machine.
---
(First draft, stream of conscious inspired by todays Amazon outage.) <comment><USER2> It's an interesting idea but I completely disagree.

Example 1: I own four personal computers and operate two virtual machines in the cloud (with two different providers). I don't ever see me owning fewer computers. I will always want at least one machine completely under my control with guaranteed resource availability, regardless of connectivity to the internet.

Example 2: The place where I work has computers too. Lots and lots of them. For legal and governance reasons we're not to run our infrastructure externally.

I actually think that the number of providers of commoditised mass computing and infrastructure is going to increase over time as computers become more powerful. Right now it's tricky to operate at vast computational scale because of the amount of capital investment required, the sheer number of machines required, and the staff required to supervise them.

In the future I think we'll approach a point where there are "chips with everything" and buying computer cycles above and beyond what's embedded in your jewellery (or your skull) will be as simple as bidding a certain amount (or buy-it-now!) and firing off a long-running task into the compute-market.

I really can't see a situation in which a small number of players will be able to dominate over the long term. Even companies like Facebook who currently have a huge edge due to the network effects of their large memberships will lose market share as commoditised services spring up to replace them.

<comment><AUTHOR> The leap I am making in my little story is that one would stop to think of your personal machines and your virtual machines as "computers".

Taken in the context of IBM's Watson's perspective at the time, he was looking at the computer as an enormous, extremely complex and costly purpose built device, for say, munitions trajectory calculations.

How many of those can we sell?

Now look at the "computer" as an enormous, extremely complex and costly purpose built device, for say, hosting all the applications made for mobile access.

and the analogy holds.

Start to think of your personal machine simply as a sensor (it senses and collects data that you produce, and ships that data to the hosted applications in the cloud)

The fact that, itself, is a fractal representation of everything that is occurring in the cloud - that it is, indeed, a computer, doesn't matter.

It is a sensor. A very powerful, complex one.

</comment></comment><comment><USER3> Is this another one of Sokal's submissions to _Social Text_? Is that you, Alan?</comment>


A theory of modern Golang - <AUTHOR> http://peter.bourgon.org/blog/2017/06/09/theory-of-modern-go.html <comment><USER2> In other words, use a pure dependency-injection style, and ZERO globals.

I'm writing Python and some C++, and I have been doing this for maybe 5-6 years. It takes a little practice to structure your programs like this, but once you know how, it has a lot of benefits.

It's not really idiomatic in those communities either. Python and C++ Libraries use globals all the time, although I think it's becoming less common.

I guess Java programmers have been doing dependency injection for even longer. It probably became popular more than 10 years ago. But I'm not really sure how "pure" the Java ecosystem is. Singletons are banned under this style. Instead, a singleton is just an object you instantiate once in main(), and pass throughout the rest of your program.

I think the problem with Java is lack of free functions. Static methods confuse things too.

The pure-dependency injection style is basically _functional programming_ , requiring state as an explicit parameter.

<comment><USER3> Well, pure DI also has practical downsides. E.g. anything that wants to log something has to be able to access the logging configuration — so it needs to be passed into everything.

<comment><USER4> I just pass an "app" object down the tree, and the dependents can do app.logSomething("foo"). So basically just move all globals in the descendants to methods on the root app node.

<comment><USER5> This is also where I always end up with using DI, and it feels like cheating. Basically pretending that these globals aren't.

<comment><USER4> Interesting. How else could DI be done? I'm in the camp that 0 params to a fn are the best, followed by 1, occasionally 2, and almost never ever 3.

<comment><USER6> Ah, yeah, the good ol' fashioned

        public void doStuff() {
            // ...
        }

Everyone loves those!

</comment></comment></comment></comment></comment></comment><comment><USER7> This is basically "Use DI, and move towards SOLID"

Well, yeah! Those are great principles in any language - I find it concerning (and maybe indicative of something) that the Go community has voted this up. These are fundamental requirements to building testable, scalable systems in teams. Having global variables has been bad practice for what, 20 years? One of the first lines in Javascript, the Good Parts (closest book handy) is:

      JavaScript is built on some very good ideas and a few very bad ones. ... The bad ideas include a programming >model based on global variables.

<comment><USER8> this article falls into a particular genre "sensible advice that is either so internalized in other languages or the language itself prevents the pathology so why would you write that."

It's a winning combo because you can recycle old and simple ideas for a whole new context.

[edit] felt bad because rereading this it implies the author has bad intentions. Don't mean that. Just mean it's cute to watch the golang community learn Java.

<comment><USER9> In some ways, I consider Go to be a bit of a redo of the early ideas of Java, but with a bit more focus on tooling, and a stronger aim towards simplicity. And Go's standard library authors have the benefit of seeing how Java's early days played out.

I do enjoy that Go gives a bit more obvious control over memory layout than Java did, and I enjoy using it as a small projects language. I've never used it in full anger/production, so I haven't seen the worst of it.

One funny thing about Guice(mentioned elsewhere): I've heard more than one Googler say that dislike the framework quite a bit, due to how heavily it can be abused.

One bit of advice that seems to have gone either missing in Java/JVM, or common knowledge, is the idea that only main/binary packages should have config options via flags/env vars. Many, many JVM libraries do not follow that convention, and I've had to hunt down a log4j XML file for Spark in order to turn down the logging levels before. Would much rather have that be controlled via a flag.

<comment><USER2> Yes, flags vs. config files in Unix are a classic example of dependency injection vs. side effects, but at the process level rather than the programming language level.

At Google pretty much all server configuration is done with flags. Binaries can and do have thousands of flags. And I view that as a much better solution than a config file that is searched for.

The idea is that modular units like processes and functions don't "search for configuration", they just accept parameters, and led the higher level application configure them. Then the code becomes very straightforward to read and debug.

</comment></comment></comment></comment><comment><USER10> I don't think, in the limit, that this is a scalable approach. While I think injecting dependencies is fine in some cases, large programs might have hundreds or thousands of collaborators. It is simply not feasible to instantiate all of them in the main function then pipe all of them down to the package that uses them. This is especially true when you keep the interface small like this program seems to.

I think making the dependency explicit is good when it is likely that it is going to be desired to change the implementation on a per object basis. If it's unlikely or meaningless to have multiple different implementations within the same process, there's nothing wrong with making the configuration global.

Imagine how painful it would be to use the http module if it required the injection of its clock, compression suite, network interfaces, address resolvers, loggers, etc. And that's just one module of many.

</comment><comment><USER11> I think the author's two examples - a logger and a database connection - should be handled differently from each other. The database connection should be passed as a parameter, and the logger should be a global variable.

One difference is that it's reasonable to add logging to nearly any function anywhere, which means that you have to either make the logger global, preemptively provide a logger parameter to almost everything, or else change a whole bunch of method signatures at once every time you need to add logging to somewhere that didn't previously have any log statements. Global variables are unfortunate, but the other options are much worse.

The second difference is that you pretty much only ever have one logger object in a process, but processes often use multiple database connections and it may matter which one is being used. For example, a caller may want to make your function's database accesses part of its transaction. Or use a unit test database instead of a real database. Or a number of other things. Omitting the parameter hides the fact that a function uses the database, which is an important thing to know about it.

<comment><USER12> You may have many different loggers, and different loggers for different parts of an app. For example, you don't want to log certain database or password related stuff explicitly as it creates a security issues.

Also it's a lot easier to test logging, or anything that you would us a global object for, if it's DI based. That said, you can always pass a config object that holds what would normally be global variables but allows you to override.

</comment></comment><comment><USER13> I agree with every bit of this, especially with constructors taking their dependencies explicitly. In fact, I try to write my Go code in such a way that constructors aren't needed (sometimes this can't be helped) so the "constructor" is simply a type initialization expression `foo := Foo{Bar: 7}`. This keeps everything simple and testable.

<comment><USER14> Absolutely agreed on the ridding of constructors. Offer the option to set things (eg the Logger), and if it's nil, use some defaults. This seems much cleaner than making a huge function signature. The net/http package does this really well.

<comment><USER15> Are you going to do the nil check in every member function though? I run into this problem with Go a lot, actually. (I'd like to make initialization of a some member variable optional, but checking if it's nil every time I use it becomes a pain. Not all types have useful zero values either... I'm looking at you, map.)

<comment><USER14> Well, in my cases I usually add an unexported 'check()' method, which is generally called by every other method that needs state. It would basically just be something of x.Z == nil {x.Z = DEFAULTZ}

</comment></comment></comment></comment><comment><USER16> I favor an DI style as well, but sometimes in rare cases I like using the init functions.

This boils down to functions which follow the template.Must pattern, i.e.: either the function can be evaluated or the program should panic.

The other case is read-only lookup tables.

</comment><comment><USER17> I've recently been bit by global state that used function initializers (func init() isn't the only way to execute logic when a package is imported!). The package used very reasonable defaults, but panic()'d when things didn't look right. So, forking, maintaining patches until upstream changes the behavior, painful.

<comment><USER18> > func init() isn't the only way to execute logic when a package is imported!

What are other ways to execute logic when a package is imported? init() is the only one I'm aware of.

<comment><USER17> package globals

var ( X = blah() )

func blah() int { return 123 }

<comment><USER19> Those are all appended into the Package.init function in the compiled .a, so they are part of func init() not just in behavior, but in implementation as well.

</comment></comment></comment></comment><comment><USER20> > "modern Go"

The language was first released in 2007 :). Man...

<comment><USER2> It was developed starting around 2007 but it wasn't released / open-sourced until late 2009.

</comment></comment><comment><USER21> This isn't "modern go" but more the "standard" in any language.

<comment><USER13> Sadly not in Python or JavaScript or C++. But yes, definitely good ideas for any language.

</comment></comment><comment><USER22> The stdlib does include some globals/statics, for good reasons (the default logger, the default http mux).

I'm always wary about advice that says "you must never use {this tool provided by a language}". Never say never ;)

Globals can be and are useful in some circumstances. Having a blanket ban on globals because "globals are bad mmkay" is not useful.

I draw this line at "do I need to mock this for testing?". If I need to mock it to run tests, then it shouldn't be a global and should be DI'd (so I can DI the mock). If I'm not going to mock it, then it's probably fine to leave it as a global.

The Db and Logger are perfect examples: I frequently mock the Db connection, so I can test sql output. I almost never mock the logger, because I only use it to output meta information. So having a global logger is OK.

YMMV...

<comment><USER23> Shouldn't need a DB connection to create strings. Sometimes want to turn off, scope, or classify logging especially during testing.

When these new levels of granularity are desired in your project, switching from globals is no fun.

</comment></comment><comment><USER24> The author is basically complaining that Go (and its standard library) isn't functional.

</comment><comment><USER25> An internet discovers dependency injection. Hackernews responds, "Well of course we knew THAT." The Rust Evangelism Strikeforce is off on a secret mission in the Balkans.

<comment><USER26> "DI isn't idiomatic in Go" is what I've heard quite a few times. Java did it so it must be wrong.

<comment><USER25> Which pretty much confirms that Go is engineered to do things the stupid way around, and that developers inculcated in its idioms are _just now_ beginning to see the benefits of what boring old Java programmers have been doing for a decade or more.

</comment></comment></comment><comment><USER27> Expected to see an article about the development of modern Go the board game theory after the advent of AlphaGo and AI generally. Got disappointed. Happens every time :(

<comment><USER28> Ok, have a 'lang'.

<comment><USER29> Not cool. That's not the name of the language or the article. Please change it back.

<comment><USER28> It's common enough to have become a convention, especially where ambiguity is an issue, like in HN titles.</comment></comment></comment></comment>


1% of the Bitcoin Community Controls 99% of Bitcoin Wealth - <AUTHOR> https://www.cryptocoinsnews.com/1-bitcoin-community-controls-99-bitcoin-wealth/

<comment><USER2> The methodology is completely flawed. They correctly measure that 1% of the bitcoin addresses contain 99% of the bitcoin wealth, but this doesn't show wealth distribution in the "bitcoin community". Addresses don't translate to people.

Almost every wallet uses a number of addresses for accounting and anonymization. Even if I own a lot of bitcoins, if I regularly use my wallet I will most likely end up with a few addresses with a decent amount of bitcoin each and a bunch of addresses with small amounts of bitcoin each, leading to a distribution similar to the one observed.

As another factor, a lot of bitcoin wealth is in online wallets or other online services. Many of them consolidate all bitcoins into a handfull of addresses for practical reasons. That makes these services look super rich when in reality they just hold funds from other people.

</comment><comment><USER3> Major issues with this piece include: 1\. Doesn't adjust for wallets with zero, or near-zero bitcoin. 2\. Does not account for large service providers like Coinbase who use only a few hot wallets that hold large amounts btc.

Some math from a commenter: "Top 99.24% of Bitcoin addresses control 32.718% of Bitcoins _omitting the 67,723,836 bitcoin address containing balances of 0 - 0.001 btc_ amounting to 433.016 btc"</comment>


My $0.02 on the Rupee slide. - <AUTHOR> https://twitter.com/navchatterji/status/373385149301276674

<comment><AUTHOR> I'm def. no economist but I find the recent $/Rs news intriguing. Bullets above are my basic understanding of what is going on and why. I'd love to get more insight here on what is going on from folks that have a better understanding (pref. nothing macro - current account deficit, high crude/gold imports ..etc :p)</comment>


Academics: Why it's faster, more lucrative, and fun to do startups - <AUTHOR> http://www.academicproductivity.com/2009/the-economist-academia-ranked-last-as-source-of-innovative-ideas-and-my-thoughts-on-startups-vs-grant-money/

<comment><USER2> Startups don't do research. Some may try to commercialize research. Some research labs may also try to commercialize research. But true research is not something anyone would risk VC on. True research takes decades to see any ROI and usually even then it is unclear exactly what the ROI is, making traditional funding metrics useless. Here is an interesting book about Dupont, IBM, and other research labs trying to quantify the output of their research labs:

[http://books.nap.edu/openbook.php?record_id=6200&page=6](http://books.nap.edu/openbook.php?record_id=6200&page=6)

Bottom line: you have to invest in research because you know it will pay off. But it is impossible to say exactly how or when it will pay off. The only kind of institution that can support that kind of investment is government or large (probably monopolistic) corporations.

<comment><USER3> Not that the actual research part has paid off, but companies like Anybots have been much more successful in their bipedal research efforts (see Dexter @ <http://anybots.com/abouttherobots.html>) than many academic labs, much less other companies.

<comment><USER4> Anybots is probably not a traditional company in terms of the desire to make money ("maximize shareholder value").

<comment><USER5> I think this concept of a traditional company doesn't really exist, or is fairly rare.

Most companies care about their employees, and care about their work. They aren't trying to get every $ they can.

</comment></comment></comment></comment><comment><USER6> His timeline doesn't apply to Computer Science - and possibly other fields like engineering, but I have much less experience with them. Because CS Ph.D.s can get industry jobs, there's less need for them to do postdocs. Some do, but it's still common for freshly minted Ph.D.s to get academic jobs. Of course, getting those positions is still just as difficult as it is for the real sciences, but there's not necessarily the 2-6 year delay.

I've given this topic some thought recently. Academia has it's problems, but what I do like is that I can work on things that are interesting and useful, but not necessarily profitable.

How can something be useful without being profitable? I do research in systems and high performance. In theory, the software we create could be sold. Some startups exist that do just that - Cilk Arts and RapidMind are two examples. But I'm skeptical of their viability; companies that exists solely to sell compilers rarely do well.

The kind of research I do is valuable to companies, but rarely as something to sell on its own. Intel, for example, does research in programming models for emerging architectures not because they want to sell that software, but because they need it so programmers can use the processors they do sell.

</comment><comment><USER7> I'm suspicious that the measure of "innovation" is the number of patents filed, but I can't confirm that from the article. In academia, good ideas rarely materialize into patents; they become papers, and the relevance/influence/prestige is quantified in the number of other papers that cite them.

Fortunately, many schools do support startups (financially, even) coming out of their grad schools. I haven't noticed any discussion on the success of this kind of support versus traditional VC, but it makes lots of sense for a grad student to turn a thesis project into a startup immediately after graduation.

<comment> puzzle-out There is a lot more happening on the enterprise/university front. My new startup took pre-commercial funding from a fund set up between a consortium of universities. I think this is a potential solution to the problems the blog author identified, but for the funds to work properly, they need to be administered and run by business people, not academics, and especially not academic administrators.

</comment></comment><comment><USER8> Asking CEOs about sources of innovation seems rather biased. I think it is rather difficult to tackle difficult problems of certain kinds in a startup. Usually, you want to have an idea before you start that you can succeed.

Take the face recognition thing that Apple just announced. OK, that one came from a corporation, but one with lots of money. I think for a startup it would have been difficult to say "let's create a startup about face recognition in photos" because until recently, no sufficiently good method for doing it was known.

</comment><comment><USER9> They should add competitors - lots of companies are simply first followers.</comment>


Ask HN: What are your x questions to figure out the quality of a software team? - <AUTHOR> The Joel Test was the classic 12 questions to rate the quality of a software team, I was curious what you would ask now and if it has changed at all? Or, how you would improve it?
The Joel Test https://www.joelonsoftware.com/2000/08/09/the-joel-test-12-steps-to-better-code/
Do you use source control? Can you make a build in one step? Do you make daily builds? Do you have a bug database? Do you fix bugs before writing new code? Do you have an up-to-date schedule? Do you have a spec? Do programmers have quiet working conditions? Do you use the best tools money can buy? Do you have testers? Do new candidates write code during their interview? Do you do hallway usability testing? <comment><USER2> Tell me how ideas are brought up, prioritized, and implemented. What is the process? The answer usually tells me how nice it is to work there at a given position, and whether their process is stale and hasn't scaled, or whether it's inherently a top down thing and they don't want to hire independent thinkers.

</comment><comment><USER3> When someone detects a bug with smallest possible fix (e.g. typo) how long does it typically take from detection until all your users are able to see/receive the fix.

</comment><comment><USER4> How is the on-call rotation handled?</comment>


Ask HN: Visual note taking - <AUTHOR> 	Does anyone use any sort of visual note taking or mind mapping tools for personal use?
I'm about to start on a project that will attempt to create an elegant solution for taking notes, organizing them and managing them without mucking about with files and folders directly (my intention is to still store them in plaintext files and avoid any sort vendor lock-in). Current idea in my head is something like an intersection between mapping software, drawing software (diagram, not sketching, so like https://draw.io), and an editor.
What kinds of benefits have you noticed in current solutions? Is there something that's really bugging you with current approaches? What could applications do to avoid interrupting you while you're doing deep work or are in the zone with UI/UX annoyances? <comment><USER2> I've used FreeMind in the past when I've need to keep track of how concepts are inter-related (like protein signal cascades, studying distributions in a stats course, or writing long reviews).

[http://freemind.sourceforge.net/wiki/index.php/Main_Page](http://freemind.sourceforge.net/wiki/index.php/Main_Page)

</comment><comment><USER3> i agree there is a sweet spot that has not been hit yet. some some good attempts are OneNote (notes), LucidCharts (diagramming), Milanote (moodboards), some others i cant remember their names right now

feel free to hmu if you are interested in chatting more. maybe we can combine forces :) firstname.lastname@example.com</comment>


Facebook over Tor on Android - <AUTHOR> https://www.facebook.com/notes/facebook-over-tor/adding-tor-support-on-android/814612545312134 <comment><USER2> i haven't even clicked, but i already have a question: Why would anybody use an anonymous way to access a service which sole purpose is to gather and share personal information?

<comment><USER3> for the user it provides current location privacy.

for fb it provides the ip of the exit node you're currently using, could be used to flag you as a tor user and detect which version of tor browser bundle you're using.</comment></comment>


Online IP netsurveillance cameras of the world - <AUTHOR> http://www.insecam.cc/

<comment> digital-rubber This site was on the tv, 8 o'clock news here already 3 weeks ago.

Not sure what to think of it, many people are broadcasting on purpose. I think more can be said about people looking at the cams then the ones that forget to locks things down, or on purpose leave things insecure.</comment>


Nordic Valley's brilliant, zero-budget solution to trail/lift status - <AUTHOR> http://www.slopefillers.com/nordic-valleys-traillift-status/ <comment><USER2> Glad you guys dig this. As the author of the story, a bit more context here might be helpful for the non-ski crowd.

The simple verison is that small resorts really do operate on minuscule budgets. When I met with the marketing director of this mountain, they were struggling to afford email marketing. Vail might spend more on a single print ad than a mountain like Nordic Valley does all year on marketing. This means that vendors struggle to build stuff that would solve their needs because there's just not enough money in the ski area's pockets to buy it. In other words; solutions like this aren't just clever hacks, they are often necessities.

This often manifests itself in turning stock, off-the-shelf stuff into things like ski racks or signage or tools. Some industry publications will even devote sections of their magazines to these hacks because so much creativity is born from them. This, however is one of the first times I've really seen it crossover into technology which is an awesome step to see happen.

<comment><USER3> Nice blog btw, I'll definitely be digging in. What do you think the chances of Nordic Valley's planned expansion are?

<comment><USER2> Thanks, been writing 3-5x a week for about a decade so let me know if you're looking for a specific topic and I can give a starting point.

Re: expansion - I think the odds are really, really slim. Ski expansions at that scale just don't happen in 2019. I wouldn't be surprised to see them expand to the ridge just south of the resort like they've been trying for the last few years (and who knows, maybe this is a play to help that move along), but nothing near the plans being outlined.

</comment></comment></comment><comment><USER4> Everything old is new again! There's a little bit of an iframe renaissance happening, because even though iframes are a blunt instrument for combining content from different origins, they also have some really desirable features.

Cross-origin iframes are completely sandboxed, they can be styled quite nicely as transparent overlays with css, and they are supported on all browsers (including mobile).

Stripe Checkout uses iframes (in a super-nice, completely invisible) way. Intercom Messenger runs in (multiple, nested) iframes.

Our startup makes an in-browser video calling product and last year we started seeing people hacking together "embedded" video calling by wrapping our call pages in iframes. We thought, "that's cool!" and launched a full API to support this growing set of use cases. [0]

These days, if you want to combine interactive functionality on a web site, from multiple origins, you have several pretty good choices with different trade-offs: loading and using javascript libraries right in your DOM context, iframes, and (for patching in functionality at the user-level) Chrome extensions.

Here's to asymptotically approaching the Project Xanadu feature set. [1]

[0]-[https://docs.daily.co/reference#iframe-hello- world](https://docs.daily.co/reference#iframe-hello-world) [1]-[https://thenewstack.io/ted-nelson-can-still-learn- xanadu/](https://thenewstack.io/ted-nelson-can-still-learn-xanadu/)

<comment><USER5> I don't think iFrames ever went away. It's been a feature of embedded web software for as long as I can remember. I don't think there is a sufficient other solution. Injecting HTML into the DOM of an unpredictable set of pages is difficult/impossible without iFrames...

</comment></comment><comment><USER6> I love simple solutions!

It reminds me of a personal web site I built recently. I am climbing the 4000 footers of New Hampshire with my wife. It's a big challenge, to climb almost 50 of some of the biggest mountains east of the Mississippi, and a ton of fun for a weekend warrior couple.

We've been putting information into a spreadsheet to track our progress, and I decided it'd be fun to make a web site, where you can see the mountains we've done, the ones we haven't done, and see our trip reports and photos. I started queuing up a database and thinking about a UI to enter the hike data into, but then I realized: why not just use our google spreadsheet as the database, directly?

I did some research and you can set up a google sheet to be publicly available as a CSV. So when you access my web site, it simply downloads the CSV at that public URL, parses it, and uses it to power menus and individual hike report pages. When we finish another hike, we simply add another row (like we always had!), and the web site gets a new page made almost instantly. The code doesn't even authenticate with Google, since the data is public, and the whole thing runs pretty well!

<comment><USER7> That's pretty cool. How long does it take to load a page with that setup?

<comment><USER6> Each page takes a second to load usually, but it's a dopey Heroku web dyno, so it takes just about that long to load the landing page that doesn't go down that code path.

</comment></comment></comment><comment><USER8> In my mind the piece that makes this so appropriate is "The backend is the frontend". Does anyone know of other platforms/services where this approach is possible?

<comment><USER9> I don't know if this is exactly what you were thinking of, but Epic Games is using Trello to visualize their work on their store. They are well behind their competitors, so this is a way to show people that needed features are on the way.

[https://trello.com/b/GXLc34hk/epic-games-store- roadmap](https://trello.com/b/GXLc34hk/epic-games-store-roadmap)

</comment></comment><comment><USER10> This is one of the best demonstrations of "start with the simplest possible thing that could work" that I have seen.

</comment><comment><USER11> There are some things out there where people just want to see the relevant information. Nothing more, nothing less. A lot of companies are trying to dress up the pig when all we want is to eat the bacon.

Weather reports for example. The weather widget in google search is quite simple while still showing everything I need to know in one view. The weather widget on my phone has these ridiculous animations and only shows me one day at a time. Just show me the high, low, and clipart of a cloud dumping rain.

</comment><comment><USER12> So just in case you didn't notice it, the Nordic Valley team has simply put a docs.gooogle.com read-only link and put an iframe around it.

This is actually super interesting to me from both a company intranet perspective and for spinning up quick-view pages for my home gdocs instance.

</comment><comment><USER13> This reminds of [https://www.glideapps.com/](https://www.glideapps.com/), which was posted on HN a while back.

</comment><comment><USER14> This sounds like an elegantly simple solution.

This also brings back fond memories working for a larger resort and my team building an integrated lift status system. Simple API on top of a relational database, easy to use web application for lift operations to update lift status in realtime, integrated PDF generation to print reports for numerous front-desks (think all the main lodges, hotels, and businesses in town to receive and print). The big win was a large number of large plasma screens running out lift status flash application in various lodges with long runs of HDMI to proxy servers all getting pub/sub realtime status updates. The Flash application had continuous polling via AMF to our proxy servers with a cache layer, etc. and it was pretty well received by guests. We also had the same API support all mobile apps at the time. The big customer-loving feature was getting alerts when a lift was about to open on a bluebird powder day and get that to them in near realtime often before many of the "lifties" knew.

</comment><comment><USER15> I may be remembering wrong, but I recall an intranet site at my school using some ActiveX and DHTML trickery to get spreadsheets for school events showing in the browser (IE of course). The fact that this is now possible on the Internet with no gotchas is exciting.

</comment><comment><USER16> I recently built a little trivia game for my friend, and not wanting to spin up a database, I used Google Sheets as the backend.

My friend can edit the sheet at will, and the app pulls the data in via JavaScript. Google already sets the right CORS headers.

<comment><AUTHOR> I tried this a few years ago and ran into some speed issues ( [http://www.mooreds.com/wordpress/archives/1359](http://www.mooreds.com/wordpress/archives/1359) ). Is that something you've encountered?

<comment><USER17> There are a few interesting hacks you can do, the calls are slow to an individual cell (I think like 50-100ms). If you need arbitrary cells, you can use a sheet formula to put the desired result in a single cell.

For example I had a sheet that had hundreds of columns that the headers would change over time - instead of reading through each cell, I just used CONCATENATE(), read a single cell then split it in my program after pulling it.

</comment></comment></comment><comment><USER18> I live in a valley with a very large nordic (cross country) trail system and they have GPS tracking on all of the groomers. It's super useful as skate skiing is very condition dependent: [https://skitrails.info/report/methowtrails](https://skitrails.info/report/methowtrails)

</comment><comment><USER19> This is the value prop of tools like Airtable, right?</comment>


5 Reasons You Should Apply To Hacker School for female entrepreneurs - <AUTHOR> http://www.women2.com/5-reasons-you-should-apply-to-hacker-school/

<comment><USER2> 6\. You will find a date!</comment>


Overnight Success - <AUTHOR> http://gesturelab.com/?p=105

<comment><USER2> Huh? Is this meant as an example for "living in a bubble"?</comment>


Show HN: Houdini – A new way to test web apps - <AUTHOR> http://www.tryhoudini.com

<comment><USER2> First of all, I'm very interested in this.

Secondly, that was a very well-designed capture. You got me to give up my email, log in with GitHub, tell you how much I would pay, and then you gave me nothing. Houdini indeed!

Kudos. Now I'm waiting for my beta access email.

<comment><USER3> Seems like you can actually create a project on the left: [https://www.monosnap.com/image/NEWTlovotIcjL5wqSYceVSFX2P7Bm...](https://www.monosnap.com/image/NEWTlovotIcjL5wqSYceVSFX2P7BmY)

<comment><USER2> D'oh! Thanks :)

</comment></comment></comment><comment><USER4> In the dynamic content example; with the previous showing one item and the second screen shot showing two items, what is it about the DOM structure that makes this a passing test? How do you know that the functionality wasn't suppose to update an item?

Wouldn't you at least need three tests; an initial test to show that an item is inserted into the DOM, a second test to demonstrate that the system is inserting, not updating an item, and then finally your third test that demonstrates the functionality continues to insert into the DOM?

<comment><USER5> one approach is to look at the progressive diff between the insert tests & verify that the DOM is changing in the same incremental way

<comment><USER4> That was my point; a "progressive diff" isn't just two samples. At test sample #2, whether an item inserts or updates, either could be correct at that point.

</comment></comment></comment><comment><USER6> [http://en.wikipedia.org/wiki/Houdini_(software)](http://en.wikipedia.org/wiki/Houdini_\(software\))

<comment><USER7> yep, Houdini is a special effects software build by Side Effects, Inc., I used to work for them actually. Great company.

</comment></comment><comment><USER3> Looks really promising if it can work on complex dynamic sites!

The sample script provided is totally incorrect though:

      <script src="//cdn.tryhoudini.com/houdini.js"></script>
      Houdini.init("xxxx")
      Houdini.startListening();

Missing a script tag around `Houduni.init ... Houdini.startListening()`

</comment><comment><USER8> This concept of testing seems strange and very limiting when it comes to the assertions you wish to make. If you post "Hello World!" I would want to test that in my post feed there is a post from myself ( Assertion 1 ) and the contents is "Hello World!" ( Assertion 2 ). I don't see how this form of snapshot testing would accomplish this. Am I missing something?

</comment><comment><USER9> This looks awesome. Scared to put the Javascript on my site though, because it's unclear to me how the embedded Javascript will be able to differentiate me (the site owner) from regular users.

I don't want regular users seeing the "1 test generated" thing on each page. Maybe clarify this a little on the page where you give me the Javascript snippet.

<comment><AUTHOR> Will definitely clarify this on the dashboard. Users of the site won't see those notifications for sure. Those are configurable and you'd only use those on your dev environments.

</comment></comment><comment><USER10> Major "thank you" for doing github login without requiring me to hand over my private repositories.

<comment><AUTHOR> Thanks for the feedback! Definitely trying to be reasonable :) Definitely welcome any other suggestions!

</comment></comment><comment><USER11> Very cool. I recently had an idea along those lines. Good to see someone's building something in this area. Will it be possible to generate CasperJS- or Selenium-compatible test scripts from Houdini so tests can be run in a CI environment, too?

<comment><AUTHOR> Thanks! Yes we plan to make this possible. We've got a decent number of requests for similar functionality.

</comment></comment><comment><USER12> A great looking tool! Can't wait to try it out on a few hundred projects :)

</comment><comment><USER13> Would be recommending this to the QA folks at work. Thanks for sharing!

</comment><comment><USER14> This is intriguing. If those guys get it to work on complex, real-world web sites I think they can build a serious business around this. I'm gonna give this a try. Best of luck!

</comment><comment><USER15> Awesome!! I hate testing..

</comment><comment><USER13> this is great! Takes web development to a whole new level</comment>


Home networking 2.0 - <AUTHOR> https://medium.com/@joshuapeper/home-networking-2-0-6f3e79279ce0 <comment><USER2> I have the same switch and AP, but also the unifi security gateway. I LOVE the setup! Are you considering a USG or prefer to continue running your own via pfsense?

I also have a small k8s cluster that runs various things, including the unifi controller container. Really cool stuff! [https://hub.docker.com/r/jacobalberty/unifi/](https://hub.docker.com/r/jacobalberty/unifi/)

<comment><AUTHOR> I'l try running your container in k8s. Have it on a separate VM now.

</comment></comment><comment><USER3> Awesome post!</comment>


I helped reposition a database product that went on to make $1B in revenue - <AUTHOR> https://www.thefxck.com/interviews/product-positioning-april-dunford <comment><USER2> Agh.

April is terrific, and I agree that the right messaging and positioning can have disproportionately high impacts on revenue (speaking from experience with Netlify, Gravitational, and others), but this click-bait title is a huge disservice to April, other marketers, and founders who may be dissuaded from trying new messaging and positioning.

The actual story is that the person (April) was asked by a manager to interview a bunch of customers. When they brought back the data, the manager (or the team, collectively) acted on it by coming up with new product positioning.

Some years later, after countless product iterations and _three_ acquisitions, the product landed at a tech giant that does $30B/year. The author speculates it was then responsible for $1B in revenue, though doesn't know for sure.

So...

It's fair to say "I was there early and it was neat to solve these problems for a DB that later ended up at SAP." But to imply that your work directly resulted to $1B in revenue--as this title does--is just nonsense. What the F*ck were the editors thinking.

<comment><USER3> Why so angry. The title reads:

> _How I helped reposition a database product that went on to make $1 billion > in revenue_

It doesn't say _" How I single handedly repositioned"_ or even _" How I repositioned"_. The author literally _helped_ in the process that led to repositioning. By uncovering a key use-case for the product, which then became the key feature and selling point of the updated product.

And regarding the comment about $1B in revenue, is there any good reason not to give her the benefit of the doubt? She literally worked with the team and rubbed shoulders with them every day. A lot of non-public numbers get talked about casually at the water cooler.

There seems to be a trend where people are hyper-obsessed with nitpicking titles and calling out "clickbait". In this case, the article title is a pretty great representation of the article's contents - or at least as great as you can get in one sentence. I personally enjoyed the article, and was hoping to read a discussion about the main points raised in the article, or similar stories others may have. Instead, the top comment is an angry rant nitpicking the article's title.

<comment><USER4> Two points:

1\. The title does not make huge claims directly, but strongly implies it. That's how I read it when I was skimming the front page of HN. It's like writing an article with the title "I taught Michael Jordan basketball" and then explain how you showed him how to throw a ball for 30 minutes when he was the 5 years old. Or the old maxim that if you are a cashier at McDonald's, you can technically say that you "process high-frequency cash transactions for multi-billion dollar company on rotating supply-demand cycle".

2\. I don't like how the common advice for writing resume, which I can only presume reflects what hiring managers want to see in someone's resume, says you must quantify your achievements. You cannot just say I wrote the login system. You must somehow tie it to a business objective and achievement (increases sales by 7%, reduced support calls by 12%, etc). In reality, projects are often team efforts and except for certain niches such as sales and consulting, there is rarely a clear correlation between an individual employee's actions and business's results. I don't like writing pretending there is and writing it, and I don't like reading it.

<comment><USER5> > I don't like how the common advice for writing resume, which I can only > presume reflects what hiring managers want to see in someone's resume, says > you must quantify your achievements.

It's not about résumés but about how the skill of measuring/estimating one's own effectiveness/impact/productivity is positively correlated with successful outcomes and rate of progress in life in general.

Recall Mike Acton's principle questions[0] that a goal-orientated individual must answer:

>> \- I can articulate precisely what problem I am trying to solve.

>> \- I have articulated precisely what problem I am trying to solve.

>> \- I have confirmed that someone else can articulate what problem I am trying to solve.

>> \- I can articulate why my problem is important to solve.

>> \- _I can articulate how much my problem is worth solving._

[0]: [https://www.dropbox.com/s/doiq8ovho1k9d4b/fired.pptx?dl=0](https://www.dropbox.com/s/doiq8ovho1k9d4b/fired.pptx?dl=0)

<comment><USER6> Or more cynically, keep on doing your thing at your core, but do know that people expect to hear stuff like that so consciously sit down and architect some answers to those things. You can reinterpret and rewrite the story later, but you need to have one. Also you don't have to get too attached to it and believe it too much. Think of it as your interface towards society. They cannot all have time to actually latch onto your inner person. You must present to them all the handles you want to be grabbable by.

</comment></comment></comment></comment></comment><comment><USER7> April Dunford's book, Obviously Awesome, is very good and worth reading if you're a founder or marketer (or both.) We reverse engineered her workshop and did it as a team at the end of last year for my startup. Was very much worth the day.

<comment><USER8> Second this - it's a great book, and one of the few truly actionable guides to doing positioning (a lot of them get pretty academic).

Accessible to founders, and helps lay out the art and science of positioning, and give a methodology for actually doing it. Would recommend it also to technical people who are sceptical of marketing in general.

<comment><USER9> Do you have any similar books that you would recommend? I am always looking for good marketing books but these days it's all some guru trying to sell their book so hard to identify the solid through the noise.

<comment><USER8> Josh Kaufman's 'Your Personal MBA' is excellent - its rare that you have one book which goes through all of targeting, segmentation, positioning, marketing planning, and how it all sits together. Often books will focus on one small piece (like positioning, or value propositions) but without understanding how these pieces sit into the wider whole it's hard to put them to really effective use.

Byron Sharp's How Brands Grow is also a great book from one of the world's leading marketing professors, and aims to lay out some iron laws about buying behaviour. Byron is quite a spiky and contrarian personality, which makes the book a lot of fun to read, but he also really knows his stuff.

</comment></comment></comment></comment><comment><USER10> I'm going to give a lot of credit to April for this, and say the title is not click-bait.

Long before sqlite, or CouchBase, there was SQL Anywhere.

And SQL Anywhere had something in the 90's that's still rare even today - hands-off built-in production-ready replication.

(MySQL struggled for a decade to ship reliable replication after Yahoo paid them $40k for the original statement-based replication, and Postgres still doesn't have a great story out of the box.)

It's that multi-source production-ready replication that April shone a spotlight on that made Sybase worth $5.8 billion when it was sold to SAP.

[https://www.zdnet.com/article/sap-acquires-sybase- for-5-8-bi...](https://www.zdnet.com/article/sap-acquires-sybase- for-5-8-billion-but-why/)

So kudos to April for finding a huge diamond in the rough.

I've been to lectures on SQL Anywhere, but I hope some day to use it in a project. It's a killer embedded database.

Source: DBA.

<comment><USER11> I worked on some systems in the 90's that used Sybase SQL Server (AKA Adaptive Server Enterprise, not the Anywhere version.) Maybe "Anywhere" is okay, but you'd be laughed at if you suggested using Sybase SQL for a project these days. It's legacy tech.

<comment><USER10> > Sybase SQL for a project these days. It's legacy tech.

1) SQL Anywhere is not "Sybase SQL." Different products, with SQL Anywhere being an embedded database that can run on a smartphone and replicate bidirectionally to other masters.

Not many alternatives, even in 2020.

2) Legacy tech - when you care about your data, accept nothing less.

Fun fact: the #1 most popular and regarded RDBMS for the past few years is considered to be MySQL, and it was the key technology that powered both Web 1.0 and 2.0. If that's legacy, I want more legacy.

Source: DBA.

<comment><USER11> Yes, I know they are different products.

Early on, MySQL was known for anything but caring about your data. I've been using it since the 90's. Without "strict" mode, fields would be truncated and data types would be silently converted. Never mind the <5.x days where MyISAM was the default table type.

</comment></comment></comment></comment><comment><USER12> This happened at the first start-up I worked at, 3 years in and almost bankrupt, one large customer kept using the product for a different reason ( kinda hacking it all together), so we completely pivoted to survive with this customers needs and it became a huge success. That pivot was towards such a niche market that no one was really in the space, and no one outside it would have really even know about it.

<comment><USER13> Can you please give a link to the product page - assuming that you commercialized it for others as well.

<comment><USER12> No sorry, but I can tell you it provides video/text/meta data archiving for many countries' parliaments and state legislatures.

</comment></comment></comment><comment><USER14> It was the year 1999, remember that? I was working at a startup and we were preparing to IPO. I got a cold call from a - I kid you not - "Color Consultant"; I don't know why but I listened to her instead of hanging up, her spiel was:

"Do you know [Inser name of recent IPO]? Well they hired me and I changed the color of their corporate identity from Black on Green to Green on Black; well 4 months later they IPO's raising $250 million at a $1+ billion-dollar valuation".

WUT?

Her implication was that she was taking credit for the successful IPO.

So, there it is.

I am not saying that April's contribution was not useful, but... everything in a long process is useful, but not 1 single contribution is responsible for the entire (or majority) of success. Except for grit!

<comment><USER15> This reminds me of an early job. It was my first job as a mechanical engineer. I was lucky enough to work in a R&D team on an entirely new product line. Crazy but rewarding work from months on end. Near completion, I was moved to a side team to help out with other smaller projects. At this point the marketing guy comes in to decide on the name and color of the machine. So they bring in the consultants and in the end decided to stay with the name the engineers gave it and the same color as older machines (beige and black.) And the kicker was at the launch party they forget to invite me but invited the marketing guy who spent a couple days helping out. What a punch in the guts it was.

<comment><USER16> I've been in more than one meeting where, after lengthy discussion about product name, the group circled again back to the original (temporary) name created by the developers.

And in that time it had somehow subtly become adopted by marketing as theirs :)

(To be fair, picking names is hard, even if you are in marketing. I'm sure there's plenty of science, but one of the best ways IMO is to just blather them all around for a while and see what feels right/sticks after a day or two).

</comment></comment></comment><comment><USER17> Completely unrelated to the content of the article, but I find it so annoying when interview responses are rendered in italics.

For contrast, here's a nicely typeset interview from the NYTimes: [https://www.nytimes.com/interactive/2020/05/25/magazine/hann...](https://www.nytimes.com/interactive/2020/05/25/magazine/hannah- gadsby-interview.html)

<comment><USER18> Not sure why you're downvoted. I completely agree. I couldn't get past the first answer because of the italics. Why would someone do that. I'm sure it's an interesting Q&A, but I just can't read it.

</comment></comment><comment><USER19> I did my first internship working at Sybase on SQL Anywhere. Some great people worked at that office. Even some of the original Watcom guys were still there.

Fun fact: SQL Anywhere was still compiled using Watcom C++ long after the latter was discontinued as a commercial product. Most of the people who worked on the compiler still worked there, so they maintained it internally until SQL Anywhere finally switched over to MSVC.

<comment><USER20> > MSVC

I thought it ran on multiple operating systems

<comment><USER19> It does. I'm referring to the Windows builds.

</comment></comment></comment><comment><USER21> I searched online - seems that when SAP bought Sybase, net revenues of Sybase were around $1b - this was only one product in their portfolio.

Is it true that the product was making $1b / year?

<comment><USER22> It looks like the product was conceived in 1992, Watcom was first acquired in 1994 by Powersoft, which was bought by Sybase in 1995. SAP bought Sybase in 2010.

I'd bet the product has seen significant growth in the mobile / IoT era. Applications that work offline and synchronizes later are a pain to build. Seems like the kind of infrastructure that exists in every police car these days.

<comment><USER23> Despite the promise of Starlink of pervasive internet connection, there are always blind spots where connection just do not exist or just pain intermittent.

Personally I think the future of desktop applications should be designed around the premise of localhost first and cloud second. The ability of the locally host application to synchronize to the cloud or central repository (similar to rsync and Git) should be the default not the other way around (I am looking at you Microsoft Teams). Technically there should be no different between people working independently with their local copy of data to be merged centrally later, and an offline application with an intermittent internet connection.

Now with readily available VPN tools like Wireguard becoming more popular the notion of using web applications for distributed authoring and collaboration, etc, is not necessary anymore. But if you insist to use web based technology there is always protocol like webdav to the rescue. If you do not want either of them (VPN and webdav), the recently announced SMB over QUIC can be a very good alternative solution [1].

[1][https://redmondmag.com/articles/2020/03/02/microsoft-smb- ove...](https://redmondmag.com/articles/2020/03/02/microsoft-smb-over-quic-to- windows.aspx)

</comment></comment></comment><comment><USER24> survivorship bias in full swing here.

Can't find any followup successes after this product repositioning

<comment><USER25> Yes, more like narrative fallacy akin to sayin that one feature we added to a product was responsible for its success.

</comment></comment><comment><USER26> To read the article normally, open the web inspector and add

      em {
          font-style: normal;
      }

</comment><comment><USER27> I think that the talk here about taking the credit for the 1 billion is missing the point. What I think she wanted to emphasize is that they almost shut down a product that made more than 1 billion, and that she took part in the process that saved it.

<comment><USER28> I think a lot of the discussion in here is about how whoever wrote the title managed to destroy any chance of this interview getting any meaningful discussion. Which I think is appropriate, because it's a blog about marketing that manages to market their blog about marketing with the kind of deftness I expect from my 8 year old daughter's rendition of _Let it go_.

</comment></comment><comment><USER25> tl;dr version - Desktop DB product. She called customers, found most were not using, one was and was crazy about the product. Product "repositioned" around that use case. End of story.

I am sure there is a lot more to Dunford's book that this article reveals but IMHO product positioning is the wrong takeaway.

Product positioning, which sounds management consultancy speak like "product strategy" is top-down. Implies near perfect knowledge of the marketplace, customer use cases, existing alternatives..... Anti-thetical, if not opposite, to the Lean Startup method. Lean implies you have incomplete information but you map out the profitable niches by experimentation. You want to build that which is needed, not build and position it later.

Recommend Robert Fitzpatrick's Mom test instead. [http://momtestbook.com/](http://momtestbook.com/). He also has an youtube channel.

</comment><comment><USER29> SQL Anywhere was an amazing product. What's left out in the article is that it was also really fast.

I had an assignment in 1998 to benchmark it against another pocket database. SQL Anywhere was 100x faster. On the Excel throughput graphs I had to use right and left Y axes for each product. Otherwise product #2 was just a flat line on the X axis. ;-)

</comment><comment><USER30> This is a strange story. Did the company really believe there was a large market of people who "had to manipulate some data and write structured queries, but you didn't want to do it in Excel"? What was the actual incentive or opportunity that the product was meant to fill? Did anyone acknowledge the popularity of dBase, FoxPro, FileMaker (with Access coming soon)? What was the product failing to do for the 90% of customers who bought it then abandoned it, surely some common themes must have arisen via all her cold calls -- and why didn't they address those issues? On the other hand, Oracle compatibility and sync surely weren't trivial to build, how were these features not already a major part of the marketing strategy?

</comment><comment><USER31> Lesson: know your customers and their needs.

</comment><comment><USER32> Please add RSS to the site. Would've loved to subscribe via my Feedly reader.

<comment><USER33> They do have RSS. Unfortunately it's truncated at /interviews/rss.xml

</comment></comment><comment><USER34> Click Bait Alert

</comment><comment><USER35> This is stupid

</comment><comment><USER36> > And we had almost killed the product!

Well, one could argue that you _killed_ the product. You just reused the source code for a new product. A product is much more than the software.</comment>


Ask HN: Anyone have a geeky tech thing they do? - <AUTHOR> For me, I leave the default cover or screen protector on all of my electronics for as long as possible. One time the tech guy who fixed my laptop ripped it's thin screen cover protector off and I got really upset.
No man or woman should rip another man or woman's default screen cover protector off.
When it gets too old and falls off, I feel sad, like I failed at life or something, failed to keep it in near new condition. <comment><USER2> You sound like my father. He does the same thing. The biggest value screen proctors have for me is to make them less glossy. The default in my experience never do this.

I do the exact opposite I remove all stickers when I buy a new computer.

</comment><comment><USER3> you're weird, if you want a screen protector please buy one and not depend on a thin plastic film ...</comment>


Ask HN: Is showing a pair of boobs the only way to stand out in the app store? - <AUTHOR>

I'm tired of building apps and watching them slowly fail after launch. I've done all of the recommended stuff. I blog, I facebook, I tweet, I contact bloggers, I send out emails, I work on improving keywords, I add translation to the app, I fix every possible bug I'm aware of, I reply to user reviews, etc..but I can never see my app grow to more than a few new downloads a day.<p>I know there's no magic solution here, but what else can the average joe with no contacts do to better promote an app? <comment><USER2> Well things need to be very social nowadays. If you thought of some clever way to make your app into a social network of sorts, that's way better.

Also, what problem does your app (or others too) solve? Are you making these apps because you CAN, or because they're USEFUL?

I'd recommend thinking of some good uses for your app currently on GPlay (that camera one.) I can't really right now, but that's YOUR job. Your Gplay page should be ALL about telling ppl why your app is USEFUL, and _not_ a gimmick.

Once you've found some really clever uses for your app (assuming they exist), then you need to change your Gplay page, but also make those uses VIRAL. Then people can catch on.

And lastly, congrats on making an app in the first place. Hope this info is of some help.

\-- _Just a thought. Something to do with two people making faces at each other, or kissing (ie "duck") faces for the camera app.

<comment><AUTHOR> Thanks for the tips. You're right, maybe I was underestimating the importance of the app's screenshots. Thanks!

</comment></comment><comment><USER3> Is asking a question that's likely to be offensive to female readers the only way to stand out on HN?

<comment><AUTHOR> I never meant to be offensive. The reason why I wrote this title was because Google Play was currently showing me 'recommended apps' that were all border- line pornography apps whose icons showed precisely that.

</comment></comment><comment><USER4> Maybe you can not copy other apps?

Your app is pure plagiarism. [http://frontback.me/](http://frontback.me/)

<comment><AUTHOR> Yes, I do not claim to be original. I do add other features to the app though, such as photo filters. And also, frontback is by far not the first app to do this. Just do a simple search in the app stores and you'll find lots of apps that do the exact same, much earlier than frontback.

</comment></comment><comment><USER5> What's the app?

Edit: nevermind found it in your profile.

<comment><AUTHOR> Google Play link here: [https://play.google.com/store/apps/details?id=com.thirtymatc...](https://play.google.com/store/apps/details?id=com.thirtymatches.rearview)

<comment><USER5> I don't really have any helpful advice for this kind of app except don't neglect the Amazon App Store - there's less competition and a huge, quality audience that's easier to reach. Also don't neglect Windows etc, if you "get big" on any platform it might have a ripple effect.

<comment><AUTHOR> That's actually good advice. I've never really taken amazon into account when launching on Android. I will now.

</comment></comment></comment></comment><comment><USER6> I clicked on this link because it said boobs so yeah, maybe.

</comment><comment><USER7> FWIW I think you came up with a very creative solution.

<comment><AUTHOR> Thanks, I appreciate it!</comment></comment>