A RESTful Micro-Framework in Go - <AUTHOR> http://dougblack.io/words/a-restful-micro-framework-in-go.html <comment><USER2> This looks like a great resource! A bit of a rant (not directed at the person who wrote this, because the link at hand is great):

Writing APIs in Go is not the hard part. There are a ton of options for routing basic URLs to handlers. There are a few areas that are a nightmare, total total nightmare:

* SQL - The raw database/sql package in Go is very low-level. It is a terrible experience to use in a project that makes anything more than a handful of simple queries. I'm not asking for an ORM, but it would really benefit the community if there was a SQLAlchemy style (the non-ORM part of it) library for Go. It should be MUCH easier to make basic queries to SQL and get out results.

* Templating - The built in "html/template" package is just not good enough for a web app when compared to something like Jinja (Python). "html/template" gets points for being simple, and actually its not a complaint against "html/template": I think there just needs to be a more feature-packed templating package like Jinja for Go. "html/template" doesn't support things like inheritance, didn't even support comparison operators until Go 1.2, etc.

These two problems have made it so I've pretty much given up web apps in Go for now. Services in Go are _amazing_. But if you're trying to get a full blown web app (again, not the point of the linked article above), then you're gonna have a bad time.

<comment><USER3> We're about to release our Go web framework which, I think, implements all the features you're mentioning and a few more. We're aiming for a release in Q1, but getting everything cleaned up and writing good documentation is taking a bit longer than expected. Right now, our internal framework (codenamed Gondola, but subject to change), includes:

* A full ORM which generates tables from structs and allows relations between models, as well as a simple querying system based on Go functions which joins the tables automatically for you e.g.

       memeId := base36.Decode(param)
       var meme *Meme
       var template *Template
       err := ctx.Orm().One(orm.Eq("Meme|Id", memeId), &meme, &template)

Meme declares a FK to Template, so the ORM automatically joins the tables and populates both pointers. Note that the ORM does not require the backends to be relational, so even when ATM we only have database/sql based backends you could write a backend for mongodb or rethinkdb.

* Inheritance based template system, with a declarative assets pipeline supporting compilation (e.g. it compiles coffescript to JS and less to CSS on demand - also pluggable). This is the base template from one of our apps:

       {{/*
          jquery|if=~ie-gte-9: 2.0.3
          jquery|if=ie: 1.10.2
          bootstrap|fontawesome=4.0.3: 3.0.0
          styles|bundle: css/style.css, lightbox/css/lightbox.css
          scripts|top,bundle: js/modernizr.js, js/detectizr.js
          scripts|bundle: js/responsiveslides.js, lightbox/js/lightbox-2.6.min.js, js/site.js
          analytics|nodebug: {{ $Config.Analytics }}
       */}}
        <!DOCTYPE html>
        ...
        {{ template "main" }}...

This server query 1.10 and 2.0 from Google's CDN, bootstrap and fontawesome from bootstrapcdn.com and bundles all our styles and scripts a CSS and a JS file. Then other templates can extend this one and override its blocks e.g.

       {{/*
         extends: base.html
       */}}
       {{ define "main" }}...

(note that base.html could also define its own "main" block which would act as a default if you loaded base.html and it would be replaced by main.html's "main" block if you loaded "main").

* Easy to use signed and encrypted cookies.

* Regular expression based URL routing.

* Functions for easily parsing input parameters.

* A development server which automatically rebuilds the source as it changes and reports compilation errors in the browser itself. While developing, runtime errors are also reported in the browser with complete backtraces and printing the values passed to each function. While running in production, those reports are sent by email to the project administrator(s).

* App-wide and low-level caching system with pluggable backends, currently supporting Redis and Memcache as well as a dummy backend for development.

* Form generator and validator from Go structs, with renderers for both Bootstrap and Foundation (renderers are also pluggable, so you could also write your own. We also support generating forms from multiple objects so you e.g. write an object which generates a captcha and include it in any form with a single line in code (in fact, we provide just that, but a simple numeric captcha a a full-blown recaptcha object). It also does automatic CSRF protection.

* A complete i18n system, which extracts strings from Go code and templates, generates .pot files which can be translated using any editor (or a specialized .po editor if you feel like it) and them compiles .po files back to Go code again. This makes packages with their translations "go-get-able".

* Periodic and background tasks which can either be scheduled or just started from any web request.

* A configuration package which takes a struct and fills it by parsing an optional configuration file as well as command line flags.

* Support for administrative commands, which can be executed from the command line or started remotely.

* Support for pluggable apps. e.g. we do have a "users" app which provides user registration, authentication and social integration. This can be included in any other app with a couple of lines of code (one line for the import, another line to tell our main app to include it). Included apps can do a lot of stuff, like inserting code in every template rendered by the parent app, including external assets like images, styles or scripts and even rendering their own templates contained inside your parent's app base template.

* Last but not least, a minimal overhead (in the range of 100ns per request) profiling framework which lets you know how much time a request spent in the cache, the orm, the template, e.g... as well as seeing how much each operation took (e.g. you can check how much time a SELECT took and also perform an EXPLAIN on it). Users can also define their own events and profile them by instrumenting their code (it usually requires just a line of code per resource, to indicate its name). You can also profile a live server by using a command line app included in the framework.

We also have helper and utility functions for the more mundane stuff and basically everything you could expect from a web framework. We took inspiration from Django, Tornado and Rails and tried to take the best of them while building this framework (I used to contribute to Tornado back in the day). We've been developing this internally for almost 2 years and it's now around 40KLOC of Go and a couple of K of coffescript, less and html.

<comment><USER4> That sounds incredible. Where can I follow news about your release?

<comment><USER3> I'll send a message to golang-nuts to announce it as soon as it gets released.

<comment><USER5> Hopefully the ORM is not a lock-in for the framework. Good old sql calls have their place.

<comment><USER3> We support hand written SQL queries, in fact we are using them because the ORM still does not have all the features like e.g. Django's ORM.

</comment></comment></comment></comment></comment></comment><comment><USER6> This looks like great work, so probably this comment is a little off topic, but here goes anyways:

Every web framework I've seen for Golang seems to do a competent job of tackling the easiest part of designing a web framework, which is routing requests to handlers.

Actually, the built-in net/http library already does a serviceable job of handling requests, and if you understand closures, filtering them and maintaining request state as well.

The thing no framework I have seen so far addresses is persistence. SQL persistence in Golang is a bit of a nightmare. It's raw SQL, and the database libraries are fussy.

The thing that makes Rails so easy to write in, especially for newcomers, is ActiveRecord. As far as I can tell, nothing like it exists (in a stable form) for Golang.

<comment><USER7> I agree with you re: the lack of ORMs in golang. I actually enjoy writing and profiling my own SQL, but if I want to prototype, ORMs can speed up the process.

I will say that some of the parts of SQL in golang that I find most annoying, such as populating structs, are handled very nicely by jmoiron's sqlx library. [1] This is not an ORM, but it's an extension to sql that removes some of the most annoying boilerplate nevertheless.

1 = [https://github.com/jmoiron/sqlx](https://github.com/jmoiron/sqlx)

<comment><USER8> This looks like an awesome library. I like how he does this:

type Person struct { FirstName string `db:"first_name"` LastName string `db:"last_name"` Email string }

to map columns to structs.

</comment></comment></comment><comment><USER9> This post really highlights what I like about Go so far vs other languages -- the evolving community. Like Rails, there is an emphasis on abstraction and productivity. Unlike Rails, the blog posts I've seen so far seem to be centered around _explaining_ how to implement the functionality instead of just _wrapping_ the functionality and providing an easy API. Now that I've read this post, I could download his library, implement my own, or extend the parts I want to customize very easily. I feel more powerful.

</comment><comment><USER10> I would have taken a different approach for handling unsupported resource methods. I'd love to hear some feedback on whether or not this is considered idiomatic. Instead of this:

      type HelloResource struct {
         sleepy.PostNotSupported
         sleepy.PutNotSupported
         sleepy.DeleteNotSupported
      }

Something like this:

      type HelloResource struct {
         sleepy.DefaultResponder
      }

DefaultResponder is simply a struct which has all the methods of sleepy.PostNotSupported, sleepy.PutNotSupported, etc, and is defined:

      type DefaultResponder struct{}
      func (DefaultResponder) Get(values url.Values) (int, interface{}) {
         return 405, map[string]string{"error": "Not implemented"}
      }
      func (DefaultResponder) Post(values url.Values) (int, interface{}) {
          return 405, map[string]string{"error": "Not implemented"}
      }
      func (DefaultResponder) Put(values url.Values) (int, interface{}) {
          return 405, map[string]string{"error": "Not implemented"}
      }
      func (DefaultResponder) Delete(values url.Values) (int, interface{}) {
          return 405, map[string]string{"error": "Not implemented"}
      }

Now, if you want to implement resource methods, you define them on the top- level struct, like so:

      type HelloResource struct {
         sleepy.DefaultResponder
      }
      def (HelloResource) Get(values url.Values) (int, interface{}) {
         data := map[string]string{"hello": "world"}
         return 200, data
      }

So now, if you call Get on a HelloResource type, it uses the method defined on HelloResource, not the one defined on it's embedded DefaultResponder type. But if you call HelloResource.Post, it uses the method defined on DefaultResponder, i.e., it returns a 405 error. This is effectively like "overriding" in Java or other object oriented languages and saves a few lines when people are using your library.

What do you think? Again, I'm really just looking for feedback here as I too am new to go. Is this something that would be considered idiomatic, or is the original solution better?

(Apologies in advance for any typos or syntax errors. Didn't check this with a compiler, but hopefully you get the idea.)

<comment><USER11> You could even go further and assume all user resources are logical extensions of sleepy.Resource:

      type HelloResource struct {
        sleepy.Resource
      }

This makes it clear that you're inheriting everything from sleepy.Resource, so you can provide reasonable implementations for all methods of resources, not just HTTP methods handlers, e.g. getBodyAsJSON(), redirect(resource), etc.

Also, depending on how your mux works, you could store app-level data in sleepy.Resource, to be accessed by all resources:

      sleepy.Resource.DB
      sleepy.Resource.Session
      sleepy.Resource.Root

and other things I can't think of right now.

</comment></comment><comment><USER12> Nice, easy to use, really straightforward code. The only thing I would have done differently is make sleepy.Api implement http.Handler so that it would easily integrate with other libraries that build upon and play nicely with net/http.

</comment><comment><USER13> I haven't seen the full picture of Go yet, partially by some examples. I found it makes calling multi-threading functions a lot easier.

I consider Ruby, Python, Go and Julia are the new generation of programming languages aiming to be quickly picked up and made hands-on working.

Can anybody tell me if Ruby, Python, Go supports a full spectrum of functionalities for various network protocols, multi-threading, messaging (sync and async) and concurrent accessing etc. Those kind of functionalities don't only require additional libraries, but also frameworks and algorithms.

Maybe by using Jython, JRuby or something like that, they are able to achieve the complete functionalities like Java.

According to some research, Python evolved from Lisp, and Ruby is closed to Perl. So why aren't those script-based language more popular than Java/C++?

</comment><comment><USER14> Languages live or die on their libraries.

This is great. I sat down to write a quick api in go about three weeks ago but couldn't find a framework that I wanted to use. This looks like it has a decent abstraction and libraries like this really help language adoption.

Much thanks to the author of the library.

</comment><comment><USER15> I appreciated the development narrative rather than a post-project summary. Thanks!

</comment><comment><USER16> Drive-by code review:

I don't see any reason for the Api type to exist. Just make them normal functions?

It would also be helpful to print the portstring rather than just "Hi.".

</comment><comment><USER17> Why exactly do Resource's methods take variadic argument? In what scenario can there be more than one?

Also, small remarks about code: You define type HandleFunc in your package which is identical to http.HandlerFunc. Looks like it can be removed. Some error logging (rw.Write, json.Marshal) would be useful as well.

<comment><USER18> Author.

Great points. They don't need to be variadic. I misunderstood the type of url.Values. And I didn't see http.HandlerFunc!

I eschewed error logging in the interest of simplicity.

Thanks for the corrections! Updating the article now.

</comment></comment><comment><USER19> Kinda off-topic, but would you write a real-time web application in Go today?

<comment><USER6> We did. Worked well.

<comment><USER19> I'm glad to read that. May I ask what technology did you guys use? SockJS' Python implementation works well (well, I haven't deployed yet...), but the Go port isn't that mature IIRC.

</comment></comment></comment><comment><USER20> I'm yet to test this, but any idea how it compares against Martini?

<comment><USER21> It doesn't have the same aim as Martini, which provides more of a full middleware manager.

Sleepy is a simple wrapper for RESTful resources that takes a few steps out of the handler work, e.g. internally handles the work of encoding a response to JSON and then sending it.

Nice to see new developers delving in, albeit a little clumsy at first :P

</comment></comment><comment><USER22> Wonderfully small, easy to grok, and put into practice.</comment>


Ask HN: User telemetry which isn't Google Analytics? - <AUTHOR>

So I, like many, have always been an avid user of Google Analytics on my sites. However I never realised that was seemingly my ONLY option until now...
We have a project which will be primarily aimed at children. And while management would love your typical Google Analytics experience, they cannot authorise the collection of data by an external company (both for PR/political reasons, but also the lawyers are nervous even with a privacy policy about lawsuits and other state's data collection laws (it might rarely apply)).
I've been googling around I'm really not coming up with much. All everyone talks about is Google Analytics or even Microsoft's Azure version of the same (Application Insights, which is still externally grabbed).
So what are my options here? .Net would be ideal but failing that anything with a Web-API interface will be workable. It just has to be in-house, and not cost a huge sum (because the politics of spending more than the department budget is a headache). <comment><USER2> I've used Piwik (piwik.org) before with success. It's fairly extensible as well.

<comment><AUTHOR> That looks pretty interesting. We'd need to install MySQL for that in particular, but honestly we could just single-box the Piwik and basic infrastructure it requires (PHP, Apache, MySQL).

Thanks for the suggestion definitely something I'll be looking into further.

</comment></comment><comment><USER3> I run small hosting company and want to offer analytics services to my clients, that will include all details that Google analytics hides as well as allows us to host all the data locally, without using any third party service. Here's project description with image snapshot:

[http://www.mensk.com/traffic-ray-new-splunk-app-to- visualize...](http://www.mensk.com/traffic-ray-new-splunk-app-to-visualize- your-http-web-traffic-for-security-and-analytics-needs/)

It's multi-platform, open source, fully operational with a free Splunk license. Currently support only apache logs, but wouldn't be that difficult to add IIS support

</comment><comment><USER4> I used to use this some years ago: [http://smartertools.com/smarterstats/web- analytics-seo-softw...](http://smartertools.com/smarterstats/web-analytics- seo-software.aspx) if you're on windows servers.

</comment><comment><USER5> You could try stat counter: [https://statcounter.com/](https://statcounter.com/)</comment>


Ask HN: How much did your organization save by migrating to AWS, Azure or GCP? - <AUTHOR> <comment><USER2> The value comes from saving engineering resources and time for implementation, while getting a highly flexible and global environment with lots of features.

With some providers like GCP + provisioned capacity, you can get pretty close to dedicated machines while maintaining the highly available cloud environment.

</comment><comment><USER3> Our move to Azure was actually a slight cost bump, but we are doing it because it will empower us to built new and better services and give us new flexibility. It's getting harder and harder for smaller data centers to compete on features that the cloud providers are constantly starting to offer.

</comment><comment><USER4> If you have an established data centre you won't save money moving to the cloud, it is about the opportunity to do more.

If you are a startup it means you don't need the upfront investment in hardware.

The cloud doesn't save you money it just allows you to do more.

<comment><USER5> Agree with you, though I'd like to add that it can save you money. For example, if you previously had dedicated resources and only needed a serverless solution available in the cloud where you pay based on use.</comment></comment>


Stop abusing tabs. Love, Firefox - <AUTHOR> http://codesketch.com/?p=1179 <comment><USER2> I actually use separate windows for this purpose. Tabs have been draggable between windows for a while now. Drag the tab off, you have a new 'group'. The system task bar keeps an ordering, so I have spacial recognition.

Also, at one point, I was curious, so installed this plugin so I could stop counting... <https://addons.mozilla.org/en-US/firefox/addon/4422/>

There's also tree-style-tabs... <https://addons.mozilla.org/en- US/firefox/addon/5890/>

<comment><USER3> I discovered tree-style tabs a few months ago and love them. However, I find myself running Chrome for its superior performance on my Mac. Is there a grouping tab manager anyone can recommend for Chrome?

</comment></comment><comment><USER4> I laughed when I read this: "I just counted. I have 17 tabs currently open"

Am I the only person that sometimes has literally hundreds of tabs open? I love tabkit, but a hundred or two tabs seems to be the limit with that approach. I'm definitely looking forward to Tab Candy...

<comment><USER5> I regularly have over a hundred tabs open in Opera.

I also found this part of the article funny, "I found myself abusing tabs. Sometimes I would leave tabs opened for days, just chewing at my system memory."

Wow.. tabs open for days? Try months! Once every few months or so, I go back through my open tabs and clean out the ones I don't care about, and ones that are actually worth bookmarking.

On rare occasions, Opera will crash and get in to a state where it can't restore the tabs I had open. That's a real disaster... but at least it lets me start from scratch with my open tabs.

I would like my tabs to be better organized, but wish the organization could be automated somehow. Even bookmarking sites and organizing my bookmarks is just too much of a hassle sometimes (though I do do it with some really important stuff). With open tabs, I rarely bother.

<comment><USER6> I have a few tabs that have been open for _years_. After the first time Opera corrupted my autosave.win file I wrote an autobackup script for it (and these days it's automatically committed to a git repo every hour then backed up with the rest of my git repos).

</comment></comment></comment><comment><USER7> I'll preface this with, I don't have a better solution, so kudos to the FF crew for trying something new. That being said:

I don't find this compelling at all. Do I really want to spend part of my time browsing, by sorting and organizing my tabs into folders?

Did this ever work for email? I'm pretty happy with the Gmail model of searching instead of organizing, although that probably wouldn't work for tabs.

<comment><USER8> The idea is that you organize it as you go, rather than repeatedly wasting time every time you have to figure out which tab a page is on by scanning the tab bar.

As other people have stated in past threads, there's plenty of room in the idea for automated organizing to be implemented later.

</comment></comment><comment><USER9> This seems like a natural step forward in the browsing experience, and I for one am looking forward to it. But, at the same time, doesn't it look like tabs are starting to step into the domain of bookmarks more and more. What is the difference between an old group of unread tabs and a standard bookmark folder?

The problem I see with this is performance. Currently, Firefox tends to get really slow on Linux with multiple tabs open.

<comment><USER8> Here's a hint: there's no difference between bookmarks, open tabs (read or unread), and page history.

<comment><USER10> There is a very big difference to those of us who don't have persistent Internet connections. Because of a rather unique social situation, I spend a lot of my time house-sitting at the home of a family member who died recently. I have DSL at my own home, but that place has nothing except electricity, water, and gas.

The result is that I tend to grab a large number of pages from my home connection on my laptop, keep them as open tabs, and read through them when I am away from home. An RSS reader like Brief (a Firefox extension) is also useful for this method of short-term information storage.

My conclusion: an open tab (or a page successfully saved to disk) is something you can use whenever you want, but a bookmark is something you can only reach when you are connected to the Internet.

</comment></comment></comment><comment><USER11> I guess I'm in a minority here. I rarely have more than 5 tabs open. I can honestly not fathom ever needing to use more than 50.

To the people who use gigantic numbers of tabs, what does your browsing workflow look like where you end up with that many?

<comment><USER12> For me at least it's a combination of stuff I notice that seems interesting but don't have time to read at present (yes, one would think a delicious account with a "toread" tag would make the most sense), and stuff I find useful and think I'll want to refer to again Real Soon Now. This just grows over time, as the longer I leave something on my to-do list, the smaller the possibility is that I'll ever get to it. Yes, I recognize that I have a problem, but I'm not particularly motivated to try to fix it :-P.

Every now and then I go all "inbox-zero" style on my browser and close everything and start fresh, but it pains me a little when I do this.

On my work machine, I usually have 5-7 windows open, each with 25-35 tabs. Usually each window has stuff related to what I'm working on on that particular workspace. On my personal machine I usually limit myself to 1 or 2 windows (I don't have an external monitor attached to my personal laptop like I do with my work laptop), and I go anywhere from as low as 20 tabs to as high as 60. Usually on the higher end, though.

Having said all that, I'm not sure Tab Candy would be something I'd use. The video of it makes it look excessively cool and awesome, but I feel like that's a level of organization my brain isn't wired to do on a regular basis.

</comment></comment><comment><USER13> I have "Mindfulness In Plain English" (<http://www.kusala.org/udharma4/mpe.html>) currently open. I'm not sure, but I think I've had this open for more than one week. Reading it should help me with concentration. This seems somewhat ironic.

<comment><AUTHOR> I do things like this all the time. Frankly I'm surprised it has taken this long for a solution to come up. Perhaps it's only power users that run into this issue? I'd love to see some data on how people typically use their browsers.

<comment><USER13> I know that my mother (apart from being a teacher, a very normal internet user) also has quite a few tabs permanently open, but that's mostly facebook and similar sites; she spends less time reading long articles than I do.

In other words: This is a problem that mostly power users who shifted all of their reading to the web face. I, for example, now only read about 6 physical books a year, but spend a lot more time reading online. I probably read the equivalent of a small book every day, it's just that this happens in the browser and thus instead of stacks of unread books I have heaps of unread tabs.

</comment></comment></comment><comment><USER14> Only 17 tabs? Although I'd love to be able to organize tabs better, I don't care about that nearly as much as I care about the performance of my system when that many tabs are open. (a) Memory usage (b) risk of some plugin or javascript on a page causing firefox to start eating 99% of my cpu.

Theoretically those two problems can be solved concurrently, but still-- favicons, hotkeys, and the ability to drag and drop solves most of my problems with tab organization. I use alternate windows only when really necessary.

What I'd really like is to have a second, isolated firefox process that I can run alongside my main one with as much functional independence as possible. One process will be for the relatively safe, familiar, and stable, text- oriented type sites with minimal advertising (hacker news, gmail, wikipedia, python.org, clojure.org, paulgraham.com, etc.), and the other process will be for heavy sites, new/risky sites, or otherwise problematic sites (eg if I have a youtube tab open I can't ctrl-PgDwn past it, when I hit that tab I have to stop and use the mouse-- a pain in the ass).

While Chrome's process-per-tab model is really nice, they're still all tied together and there's a risk of losing everything sometimes.

<comment><USER15> _What I'd really like is to have a second, isolated firefox process that I can run alongside my main one with as much functional independence as possible._

What's stopping you from running a separate process?

<comment><USER16> Firefox is a single-process application, and won't let you start another one (at least sharing the same user data; you can run a different build, but you can't share/use the same user data).

<comment><USER15> Given that you're looking for "functional independence", I don't understand why you'd want it to run on the same profile. Share your bookmarks and history between them with Firefox Sync, and tailor your selection of add-ons to the types of content you'll be viewing with each one.

</comment></comment></comment></comment><comment><USER17> When I used Firefox I had up to 15 tabs open.

When I switched to Chrome, I found that a few changes in behavior of tabs allowed me to maintain up to about 75 tabs.

When I enabled No More Tabs, (a piece of advice from a recent article posted on HN) I dropped to 5 tabs and I really haven't felt a lot of loss over the change.

When I browse with my iPad, I use 1 tab even though the device supports more.

I suspect the anything related to "tab management" is solving the wrong problem.

</comment><comment><USER18> Well, I'm pretty sure I'm in minority here. After abusing tabs for a long time I decided to switch back to windows and I must say I'm very happy. Now when I Command-Tab in Safari I get a new window. These windows pile on the desktop, so eventually I must do something about them, either read, bookmark, when it's something I want to read soon I just drag the page icon to the desktop. And I think that's better for me personally than having hundreds of tabs open. Usually I'll go clicking and filling the desktop and at some point, start to read and close the accumulated windows.

But I try to avoid web applications for mail, rss and anything I can find a decent desktop app, so maybe my way of dealing with windows wouldn't apply to someone who wants to check gmail all day.

</comment><comment><USER19> I never understood why everyone left this task to the browser. Your window manager's job is to manage windows, why not let it? I'll have at most 2-3 tabs per browser. But A simple cmnd-tab or use of expose and I can do everything Firefox is doing here, except even better.

</comment><comment><AUTHOR> I wonder if Google will compete with this in Chrome. For that matter, I wonder if a similar feature will make an appearance in Chrome OS. It would have the potential to be a subtle, but important tweak to the desktop paradigm.

</comment><comment><USER20> Any innovation in this space is welcomed by a chronic tab abuser like me.

That said, I was pretty disappointed when they started talking about identifying why you wanted to revisit a particular tab group and then failed to take the next logical step of adding in timed notifications...

The spammy sounding recommendation feature and sinister-sounding tab groups that could be shared in real time sounded like options I'd want turned off by default too.

</comment><comment><USER21> I have nothing to add to this conversation. However, I have to say that the comments about having tabs open for years, or hundreds of tabs open at once, make me a bit nervous. Like when I use someone else's computer and they have thousands of files on the desktop. I usually just slowly back away.

</comment><comment><USER22> Hmm.. it seems like people are using tabs to deal with a problem that bookmarks have already solved. Someone on here said they have one or two hundred tabs open for months. Is that really necessary? Couldn't tabs organised in folders solve that problem and increase your computers performance?

</comment><comment><USER23> Could work, but I'm sure almost no one will take the time to name a group, so you want to do that automatically (which you can do by finding out what those pages have in common)

</comment><comment><USER24> Bartab ( <https://addons.mozilla.org/en-US/firefox/addon/67651/> ) is a good stopgap solution.

</comment><comment><USER25> Sure, I'll have 2-5 and sometimes 10 tabs open. But 50? 200? "Save to read later" (as in later than in 20 minutes)?

I just use bookmarks.

<comment><USER26> Opening tabs is faster than closing them. When I'm trying to track down some information (say, understanding a bug) I'll generally open 3 or 4 tabs near- instantly (variously-worded google searches, checks on the appropriate bugtracker or forum, etc), then keep on opening new tabs until I track down the answer. Once I solve the problem I forget or don't bother to close the tabs -- it's a PITA selectively closing tabs, and they don't do much harm. Instead I'll do a close all every now and again, when I reach a point where there aren't any that I want open. But by that point it's quite possible that I will have worked up 100+ tabs.

[I know there are extensions to more easily close tabs; so far it just hasn't been worth the effort to choose and install one]

</comment></comment><comment><USER27> You'd downvote me to hell but I once had ~700 tabs opened all at once in 5 different browsers.

~200 is normal.</comment>


I Don't Give a Shit About Licensing - <AUTHOR> https://www.rdegges.com/2016/i-dont-give-a-shit-about-licensing/ <comment><USER2> So companies sell fortune 500 companies pieces of software that, for millions of dollars, scan all deps and recursive deps right on your CI server. They fail the build if a rule trips.

Kind of dumb, but accidently including GPL code in your codebase can be a billion dollar mistake.

If you have no assets who cares. If you have a billion dollar company you should care.</comment>


New Fight for Online Privacy and Security, Australia Falls: What Happens Next? - <AUTHOR> https://www.eff.org/deeplinks/2018/12/new-fight-online-privacy-and-security-australia-falls-what-happens-next <comment><USER2> Australia essentially just made Man-In-The-Middle attacks required by law. Let's hope that Mozilla/LetsEncrypt, Signal, Apple and others flat out refuse.</comment>


Google Pixelbook Hands on Video - <AUTHOR> https://chromeunboxed.com/google-pixelbook-hands-on-first-look/ <comment><USER2> Can't wait for this device!!!</comment>


Ask HN: pairing in Ruby with someone who hasn't coded since Z80 Assembler? - <AUTHOR>

The guy in question is very smart, & is a subject matter expert for a system I'm helping build in RoR + backbone.js.  I've managed to persuade him to join in one of our Hack Days as a coder.
The catch is, the last code he cut was Assembler for a Z80, back when they were mainstream.  He tells the most awesome story of when 'remote debugging' meant calling the security guard at a distant location & talking him through patching code at a terminal :-)
Does anyone have any suggestions for how to approach pairing?  I'm thinking ping-pong pairing, combined with a gentle introduction to as few infrastructure items as possible (Git, rspec, bundler, TextMate).
Any advice or experience would be greatly appreciated ... <comment><USER2> As someone who first leant to program in Z80 asm, I would say just let them dig into some 'real' code, initially ignoring most (all) of the infrastructure. Just get a text editor, and a repl open, and quickly iterate real world code (actual problems). They should very quickly get a feel for the language, and then you can add infrastructural like git, TDD, package management.</comment>


Show HN: PHP Serialized Editor – Online Visual Editor for Serialized Data - <AUTHOR> https://serializededitor.com/ <comment><USER2> This looks like it could be really useful for those rare occasions when I need to quickly modify some serialized data. It can be pretty annoying to have to count the characters in a string :)</comment>


Manga comics turn gray – but spirited – along with readers - <AUTHOR> https://www.reuters.com/article/us-japan-ageing-comics/aging-japan-manga-comics-turn-gray-but-spirited-along-with-readers-idUSKCN1M80P4 <comment><USER2> Living in Japan as an exchange student in high school, I used manga as a way to learn colloquial Japanese. It was a good experience overall and the stories are engaging. Plus, lots of the kanji have jimaku (written in the phonetic characters) underneath because many readers, like me, were learning all the characters required to read at an adult level.

The only problem I encountered was reading one during classical Japanese class, which I couldn't understand at all. The teacher was lecturing in the room and walked up behind me talking. Everyone else would read comics in class, so I didn't stop. My Japanese was not good enough to realize his conversation had shifted away from the subject of koten (classical Japanese literature) to me and my reading material until a few seconds, by which time the whole class was laughing at me. I think he knew I was committed to learning the Japanese I could at that moment in my learning.

</comment><comment><USER3> This is fascinating to me even though it shouldn't be. Since manga has been around as a mainstream thing i japan for as long as it has it was bound to start happening. I mean, fans of American superhero comics will likely still enjoy them as they grow older but will need a different type of character to keep being able to relate to the comics.

Looking forward to any superhero story that takes the old "bitten by a bug -> now has powers" to an actual perspective from an elderly person, and get their unique take on the events following.

<comment><USER4> "Inuyashiki: Last Hero" is an interesting anime take along the lines of the premise you mention.

<comment><USER5> And was a manga first. It actually was the one that came mind when reading the article. It's the perfect example of an old sad salary-man gaining supwerpower and rescuing the world and beating some sense into the ignorant youth. Because rule of thumb for japanese productions is that the main characters are reflection of the main target group.</comment></comment></comment>


Ask HN: What was that thing with the public AWS box? - <AUTHOR>

I remember reading on here or Medium about a guy who paid for a cloud server (AWS Linux box I think) and just gave everyone shell access and people started making crazy sites of whatever they wanted. I'm struggling to find it.. anyone remember? <comment><USER2> Tilde club?

<comment><AUTHOR> Yes!! Thank you! That was doing my head in.</comment></comment>


Ask HN: If you got this assignment back, what would you do? - <AUTHOR>

Hey HN, I just got back this homework assignment: http://bayimg.com/image/danjkaabg.jpg
It would have been a 150%, but the grander marked me down to a 70% because I typed it instead of writing it by hand.  I showed all my work.  A friend of mine literally wrote down everything I did in pen and got full credit.  I'm a computer science major, and my handwriting is illegible.
Do I:
* Talk to the prof, who marks me as a troublemaker for the next ~7 months I'll be in his class?
* Print out all my homework in a font of my handwriting (almost legible, few points knocked off for neatness, somewhat "dishonest")
* Actually write everything out (quality varies greatly, points knocked off for neatness)
* Appeal to some higher power
As a reference point, I have about a 95% average in the non-homework grades in this class.  This type of homework is worth about 15% of the final grade, which would push me down a letter grade. <comment><USER2> Talk to the grader. Tell him your handwriting sucks and that's why you typed it. (Show him your handwriting sucks, if you want.) Tell him you've talked to classmates with similar work who got full credit. See what he says.

If the grader gives you a reasonable answer, accept it. If not, go to the professor and repeat what you explained to the grader.

You won't be labeled a "troublemaker" unless you make trouble, usually... so just be honest and courteous. Profs and graders get students _all the time_ that have questions about their grades.

Lastly, in the grand scheme of things, an A vs a B doesn't matter all that much when you're getting a job. All the companies I interviewed with at my college's job fair were more interested in my projects and extra-curricular stuff than my GPA. I wish I had been on some open-source project that I could've put on my resume, because that would have opened many more doors than a 0.01 GPA bump.

<comment><AUTHOR> The grader for this class is anonymous (otherwise he would probably be getting death threats from some of the students), so my only recourse is to the prof.

I try not to care too much about grades, but a B in this class runs me a serious risk of losing a sweet scholarship (much more than I make interning in the summer). Sucks, but that's the way the world works.

<comment><USER3> Good advice from the person above. Since the grader was anonymous, then you must appeal to your professor. Don't go in angry. Learn to work within the system (greatest hack of all) and let your professor know this.

</comment></comment></comment><comment><USER4> The fact that you have things like "In[5]" and "Out[8]" makes it look like you've used the computer to perform your calculations. Whether you did or not is moot - you are giving the wrong impression. (Unless you _did_ use the computer, in which case you are giving the _right_ impression and the grader is right anyway).

It's not going to be the typing of your solutions, it's the impression that you've used something other than paper and approved calculator. And now you've created that impression, it may be too late to correct it.

It's your responsibility to make it absolutely obvious.

</comment><comment><USER5> Tip: learn to write well. Don't do it for this class, do it for yourself.

My handwriting use to be atrociously bad. I worked on it a little and it got to the point where what I write is legible (though, not neat).

It's a useful skill to have, writing on paper.

In the short term, just talk to the professor.... what's hard about this? Also, DO NOT "appeal to a higher power". The prof will find out about it, and the higher power will say "talk to your damn professor". Now you ARE the troublemaker.

<comment><USER6> This is so true. I find it a little shocking that this poster isn't capable of writing with a pen.

</comment></comment><comment><USER7> It seems that the prof finds some value in the type of thinking that going back to pen-and-paper can help engender.

I would comply with his wishes even if you don't see value in it. I've _forced_ myself to work on paper even though I am a computer nut and I absolutely beleive it is a good habit to have. It engages a different part of your mind, and is very valuable even when you do go back to computer-based work.

The best you can hope for when paying through the nose for college is that some prof you run into will have some subtle but deep insight that you couldn't, or wouldn't have stumbled on through self-directed learning. Those gems are rarely intuitive and never make sense on face value. True, this guy may turn out to be just a kook, but to me, it seems worth humoring him because who knows, you may find out there is real value in it.

<comment><USER8> Follow directions. When you're the one establishing them you'll appreciate compliance.

</comment></comment><comment><USER9> Were the instructions "do not use a computer solution" specified ahead of time?

If this was either in the syllabus or otherwise discussed, then it's your bad, and you have to eat it.

Otherwise, it's outrageous that rules are made up on the fly, and you should appeal to the professor.

Appeal to the professor first; don't go over his head.

Your argument should emphasize fairness: rules are being made up on the fly.

Don't print out your homework in a font of your handwriting. You won't fool anyone, and you'll be rightfully nailed for quibbling.

</comment><comment><USER10> Take your time and do your homework written on paper. Say what you want about it being the "same thing." It isn't, and you should get prepared for the tests using the methods you will have available then - and that isn't MATLAB (or Python, or whatever you used).</comment>


DigitalOcean leaks customer data between VMs - <AUTHOR> https://github.com/fog/fog/issues/2525 <comment><USER2> TL;DR: In the DigitalOcean web panel you can check the "scrub data" checkbox when destroying a VM. When using the API this option is not ticked. This can lead to other customers being able to retrieve your data.

The author thinks that this is a security issue because this option should be enabled by default. However, (I assume) it's not in Digital Oceans interest to do full disk scrub because it reduces the lifespan of their SSD.

If a user forgets to log out of Facebook on a public computer, is it Facebook's responsibility? Similarly, if a user does not correctly delete data on a budget host, is it the hosts fault?

<comment><USER3> Wait a second. Why does this option exist at all? Are you saying there are people who DO NOT WANT their data destroyed when they destroy a VM? Who are these people?

<comment><USER4> It's probably there for DO's sake. SSDs have limited rewrite cycles, and each secure wipe will definitely shorten the lifespan of the drive much more than a simple quick wipe. This translates into cost savings.

<comment><USER5> Yes. This is a shitty default peddled as a benefit for the customer, when in fact it benefits DO.

<comment><AUTHOR> No other provider charges you extra to erase your data when tearing down an instance.

It's called a dark pattern.

<comment><USER6> Okay, the misinformation is getting a little out of hand here. DigitalOcean certainly aren't charging you to erase your data, all you have to do is check the "Scrub Data" checkbox. Yes, you have to pay for the time your VPS is on while erasing, but that's perfectly reasonable.

<comment><USER7> Why would that be perfectly reasonable? They have an obligation to not make my data available to other people, I don't give a rats ass about the technical details of doing that.

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> There are a couple of things I wanted to say, and I can speak with some authority on the subject as I speak on behalf of DigitalOcean.

This was mentioned to me on twitter hours ago, prior to this post. The first thing I said is that most people these days understand the importance of a responsible disclosure, and that we take all security issues very seriously. Not following responsible disclosure with a company such as DigitalOcean is extremely irresponsible and I would be amiss to point that if anyone did ever find a software vulnerability filing it and waiting 24 hours for the appropriate response is preferred. - [https://www.digitalocean.com/security](https://www.digitalocean.com/security)

As far as I can tell here, there is no unexpected behavior that isn't documented or stressed. In both our API documentation, and our control panel, we note that you must either pass a flag or check the box to security delete the data. As far as I can tell, the flag is currently functionally correctly. so..

Is the complaint that customer data is being leaked from VMs? That the flag being passed via our API/Dash isn't actually working? Or, that our policy on not doing a secure delete by default isn't something you agree with?

j.

<comment><USER9> It doesn't seem like a security issue by DO in any way. It seems that the fog api (the project this 'issue' is filled for) doesn't allow a user to access the required flag to scrub the drive. Not a DO problem in any way I can tell assuming the scrub parameter is working correctly.

<comment><USER10> This is a well-documented situation that almost every provider of 'consumable infrastructure' before DigitalOcean came along has faced and solved.

It is disheartening to see the same mistakes being made.

Whilst I absolutely see their USP was always solid-state storage, and that has pitfalls in terms of how you can scrub data to avoid it being leaked, the platform should take every precaution to protect customers data.

There shouldn't be an option to 'scrub data' and it shouldn't be defaulted to off so they can save some hassle, and avoid spending a few dollars. It shouldn't be an option because it should be on all the time, anything else is surprising the customer mightily.

"What do you mean, my data leaked? Oh that's fine" -Nobody

"Why'd you pick a provider who doesn't take our companies information security seriously?" -Every boss anywhere

</comment></comment></comment><comment><USER11> This reminds me my own story: few weeks ago I was trying out their service and on newly created droplet I've noticed a... shell history of downloading and executing a shell script:

        1  clear
        2  ls
        3  clear
        4  wget https://kmlnsr.me/cleanimage.sh
        5  rm cleanimage.sh
        6  cd /tmp/
        7  wget https://kmlnsr.me/cleanimage.sh
        8  chmod +x cleanimage.sh
        9  ./cleanimage.sh

This looked very disturbing, so I went and check what that script is, and it is available to read for everyone, and seems to be a part of their provisioning procedure for the vm's, written by some guy who works for DigitalOcean as 'Community Organizer' (however, at that point I thought the website might be created by an attacker and misleading).

Not only it looks bad and alarming to customers, but also poses a security threat, where an attacker could target his website and/or server and replace the script with something nasty inside. How long before they'd notice such fact? No idea, but I've opened a ticket about it right on, giving them some advice on why its bad (availability, scaling, performance, security and PR reasons) but also how to better handle it, and it seems nothing has been done about it so far.

That rings a bell in my head not to use Digital Ocean service as things they do are looking pretty amateur.

<comment><USER12> To be honest, this looks like an artifact of the base image creation process.

"This file is used to clean up traces from DigitalOcean images before being published."

I don't think someone actually logged in and ran those commands on your instance. I could be wrong, but I'd bet this is just from sloppy creation of the base image leaving weird stuff in history after the image was published.

<comment><USER11> I have not said that someone does it manually, I only said, that on first look, that looks really suspicious. And, at the end, the support told me that:

"This is Kamal Nasser's script that has been set up to run on the images. The cleanimage.sh script sometimes doesn't clear the history. Thank you for bringing this to our attention. I've brought this to his attention.

There is nothing to worry about with this."

So in fact, it seems like it is being used, instead of being a leftover in shell history. In addition to that, I was later answered to the same ticket, by different support member that this script is not being used and just sits on that web page, but it all looks really bad in terms of professionalism.

<comment><USER12> Agreed. I wasn't defending DO's professionalism there, just saying that from my experience creating base images for a (different) cloud provider, it looks like an artifact of image creation rather than a real cause for alarm (I would certainly be alarmed if random people were logging in to my instance and running random scripts from the web!).

</comment></comment></comment></comment><comment><AUTHOR> Oh, hey guys, they've responded. It's no big deal, they just disabled the security because because _users were complaining_.

Turns out it "add[s] a very large time to delete events" when you actually delete things when a user makes an api call to DESTROY. Who knew?

[http://i.imgur.com/MFW8ng6.png](http://i.imgur.com/MFW8ng6.png)

<comment><USER13> Damn straight.

If I have something important on a VM it is purged before issuing a destroy. I will overwrite the block device myself so I know it is empty.

Why should I have to pay for DO to do the same again just because someone can't be bothered to read the manual.

<comment><USER14> As I replied to you elsewhere, I feel your comment here may lead people to believe that it would cost DigitalOcean money to correct this behavior.

This is wrong, it is costing DigitalOcean money not to fix it - in terms of SSD lifetime, not TRIMing those blocks increases fragmentation of the internal physical layout of the pages of flash memory. The behavior of DigitalOcean's virtual machines has surprisingly managed to achieved the worst possible outcome. Their hardware is being misused and their customer's data is being mishandled.

</comment></comment></comment><comment><USER15> Interesting: this sounds like a recurrence of the same issue which was described a number of months back:

[https://www.digitalocean.com/blog_posts/resolved-lvm-data- is...](https://www.digitalocean.com/blog_posts/resolved-lvm-data-issue)

At the time, the blog post claimed that the issue was resolved and that data was now being wiped by default. I wonder why that would have changed.

<comment><AUTHOR> I'm the one who reported it. I was able to recover someone else's web logs from 29 December 2013 on a VM an hour old.

</comment></comment><comment><USER13> Talk about a link bait title. Its a bit hard to call it a leak,Its a configuration option that is well presented in the web UI. It is optional as it adds ~ 10 minutes of billing to the small 512mb VMs and as such it is optional if you do it.

If your using an overlay or API on top of a cloud or service, its the overlay's responsibility to ensure a consistency with your expectations. The API is consistent with the UI.

While other cloud providers accept the time that this takes as non-billable, DO don't. By getting higher utilization is how they are able to offer their prices and still have some modicum of service.

<comment><AUTHOR> Let's be clear about what this is: they are charging their customers after their customers have deactivated a service (destroyed a VM) to not create the situation wherein they give that data to another customer later.

What sort of mental gymnastics are required to make that a reasonable choice?

<comment><USER16> >they are charging their customers after their customers have deactivated a service (destroyed a VM)

They are charging their customers for the number of minutes it takes to safely destroy the VM. This is not a charge for something coming 'after'. It's fundamentally a charge for their actual server use, not a bonus fee.

>What sort of mental gymnastics are required to make that a reasonable choice?

They aren't charging for security, they are giving you the option to buy less server time if you don't need security, or handle it yourself by wiping only the sensitive files. There are no mental gymnastics here.

<comment><USER17> I think you hit the nail on the head here: offering the option to buy less server time if you don't need to wipe data is probably reasonable.

Now, the problem here is that DO turned that choice around, and are therefore not providing security by default, but offering you the option to pay more to get it.

Additionally, this is poorly advertised (the API docs do not clearly state "Your data may be accessible by other users!"), and that explains why many customers are (reasonably) a bit pissed at DO.

<comment><USER16> Yeah, they screwed up the default via the API, but the choice is a reasonable one to have.

</comment></comment></comment></comment></comment><comment><USER18> Anyone who's tempted to use "the cloud" for anything sensitive should first be forced to write out, at least 5000 times, in longhand:

"The cloud. Somebody else's computer".

I think cloud computing is great for the right applications, as long as people understand the risks.

But there will always be problems like this. Always. This is part of the hidden cost of "simple cloud hosting".

<comment><USER19> What about complicated cloud hosting? Rackspace is still "Somebody else's computer".

</comment></comment><comment><USER20> Since day one, Amazon EC2 used a copy on write system with their LVM volumes to protect against this problem (without them having to do expensive zeroing operations).

This has been an identified and solved problem for YEARS. No excuse for a modern VPS/IaaS provider to be leaking customer data in this way, except incompetence.

<comment><USER21> Amazon shifts the costs of zeroing on the user of the new VM. Because the blocks are zeroes on first access writes are twice as slow on the first pass. You can try that out easily by running `dd if=/dev/zero of=/mnt/test` twice.

<comment><USER22> Yeah, but that isn't a big deal especially when you consider the alternative: leaked data.

</comment></comment></comment><comment><USER14> This is a huge problem and there seems to be a good deal of misinformation about this issue that has confused things. I'm going to debunk two things: first, that DigitalOcean is not violating user expectations (they are), and second, that doing this correctly is difficult (it isn't). The tl;dr is that if DigitalOcean is doing this, they are not using their hardware correctly.

First, it's not uncommon for virtual disk formats to be logically zeroed even when they are physically not. For example, when you create a sparse virtual disk and it appears to be XGB all zeroed and ready to use. Of course, it's not. And this doesn't just apply to virtual disks, such techniques are also used by operating systems when freeing pages of memory - when a page of memory is no longer being used, why zero it right away? Delaying activities until necessary is common and typically built in. Linux does this, Windows does it [[http://stackoverflow.com/questions/18385556/does-windows- cle...](http://stackoverflow.com/questions/18385556/does-windows-clear-memory- pages)], and even SSDs do it under the hood. For virtual hard disk technology, Hyper-V VHDs do it, VMWare VMDKs do it, sparse KVM disk image files do it. Zeroed data is the default, the expectation for most platforms. Protected, virtual memory based operating systems will never serve your process data from other processes even if they wait until the last possible moment. AWS will never serve you other customer's data, Azure won't, and none of the major hypervisors will default to it. The exception to this is when a whole disk or logical device is assigned to a VM, in which case it's usually used verbatim.

This brings me to the second issue. Because using a logical device may be what DigitalOcean is doing, it's been asked if it's hard for them to fix it. To answer that in a word: No. In a slightly longer word: BLKDISCARD. Or for Windows and Mac OS X users, TRIM. It takes seconds to execute TRIM commands on hundreds of gigabytes of data because, at a low level, the operating system is telling the SSD "everything between LBA X and LBA X+Y is garbage." Trimming even an SSD with a heavily fragmented filesystem takes only a matter of seconds because the commands to send to the firmware of the SSD are very simple, very low bandwidth. The SSD firmware then marks those pages as "free" and will typically defer zeroing them until use. Not only should DigitalOcean be doing this to protect customer data, but they should be doing it to ensure the longevity of their SSDs. Zeroing an SSD is a costly behavior that, if not detected by the firmware, will harm the longevity of the SSD by dirtying its internal pages and its page cache. Not to mention the performance impact for any other VMs that could be resident on the same hardware as the host has to send 10s of gigabytes of zeroes to the physical device.

Not only is DigitalOcean sacrificing the safety of user's data, but they're harming the longevity of their SSDs by failing to properly run TRIM commands to clean up after their users. It hurts their reputation to have blog posts like this go up, and it hurts their bottom line when they misuse their hardware.

Edit: As __RWG __points out, not all SSDs will read zeroes after a TRIM command, so other techniques may be necessary to ensure the safety of customer data.

<comment><USER23> In your second paragraph, you're conflating two different things. File-based disk images don't leak data when they're deleted because the filesystems those images live on ensure that (non-privileged) users can't get at data from deleted files. Sparse images can be smaller than the data they contain because...well, they're sparse images. They're files with holes in them, and the filesystem automagically turns those holes into zeroes on read.

Now, about Trim... Trim is only an advisory command. You tell the disk, "I'm not using these LBAs anymore, so feel free to do whatever with them." The disk has the option to completely ignore your Trim command, and even if it does mark those LBAs as unused in whatever LBA->NAND mapping table it uses internally, the disk can also continue returning the old data on reads of those LBAs if it wants to. There _are_ disks that make the guarantee that Trim'd LBAs will always read back zeroes until written again (an ATA feature called Read Zero After Trim), but I'm guessing DigitalOcean isn't using SSDs that support RZAT since that's generally only found on more expensive SSDs, like Intel's DC S3700.

What I'm getting at is that Trim isn't guaranteed to do what you think it does. Unless the disk supports RZAT, the only way you can guarantee that the disk won't return old data in response to a read command is to write zeroes over that block.

If you're a VM provider and can't count on Trim doing what you want it to (reading back zeroes on Trim'd LBAs) because your drives don't support RZAT and you don't want zero out partitions at creation or destruction time, the right thing to do is encrypt every partition with its own randomly generated key at creation, then destroy the key when the partition is destroyed. Users will see random data soup on their shiny new block devices, which isn't as nice as seeing a zeroed out block device but is still nicer than seeing some other user's raw data. (Also note that doing this doesn't stop you from also issuing a Trim for a partition when destroying it so the SSD gains some breathing room.)

<comment><USER14> You're absolutely right and thank you for the clarification. I didn't intend to conflate sparse files with file-based disk images, but I was trying to convey that there can be a difference between the logical data of a disk image and the physical data, and that deferred zeroing is the default and the expectation of developers and sysadmins. Images can be sparse and/or file- based, as the features are orthogonal, if cross-cutting.

More importantly, you clarify that RZAT is a necessary feature for what I'm mentioning to work properly. You're right. They should both be ensuring the blocks served to customer VMs are zeroed on use _and_ ensure that they are appropriately running TRIM commands to ensure maximum performance from their hardware. Not all SSDs perform RZAT, and it wouldn't be a bad idea for the host to ensure the device is logically zeroed for the VM anyway.

DigitalOcean could easily switch to doing both, or at least guaranteeing the former by creating new logical disks for customers as every other vendor does. If, as they have blogged about in the past, they are directly mapping virtualized disks to the host's LVM volumes, they are unnecessarily complicating their hosting set up and making their host configuration more brittle. With thin-provisioned/sparsely-allocated or with file-based virtual disk images, they can more flexibly deploy VMs with different disk sizes with minimal changes in host configuration.

Alternatively they could trivially ensure that even forensic tools would have a very difficult time erasing volumes by enabling dm-crypt on top of LVM, and resetting the key every time a virtual machine is deleted. This could reduce performance on some SSDs (particularly SandForce based models) but would allow minimal changes to their configuration to ensure deleted data is unrecoverable.

<comment><USER23> Using 1:1 mappings of LVM logical volumes to guest VM block devices is the most straightforward and performant method of doing it on Linux, short of doing 1:1 mappings of entire disks or disk partitions to guest VM block devices. While using file-based disk images would prevent data leaks between customers without any further effort required on the VM provider's part (assuming they don't reuse disk images between customers!), there are tons of downsides to file-based disk images, mostly related to performance and write amplification.

I don't agree that file-based disk images are more flexible than LVM's logical volumes — it's ridiculously easy to create, destroy, resize, and snapshot LVs.

<comment><USER24> Until very recently there were serious problems with putting LVM under any sort of concurrent load. Making more than a few snapshots at the same time, for instance, was asking for trouble. I say "was" \- I've got no idea if these problems were fixed. You just don't have those problems with file-based images.

<comment><USER25> Yeah but you can't snapshot a file based image, so lvm without snapshots is just as good (and much faster).

<comment><USER24> ZFS and btrfs both let you do this, as do qemu COW images.

</comment></comment></comment></comment></comment></comment></comment><comment><USER26> There is a simple solution to this: don't trust providers to do what they say they'll do with your data. You should scrub any drive that's ever contained sensitive info before you throw it away, and terminating a VM instance is precisely equivalent to handing the VM's harddrive to your provider.

It's pretty easy nowadays to scrub a drive. Writing zeroes would suffice.

Personally, I'd worry more about what data is being leaked when your VM is paged to disk on your provider's servers. Parts of each of your VMs will probably reside in the pagefile at some point, so therefore writing zeroes won't save you if the provider has bad disposal practices (like not scrubbing before disposal). So it seems impossible not to have to trust a cloud computing provider whatsoever; some basic trust seems to be a requirement.

But that minimum level of trust should be the extent to which you trust them. Not scrubbing your drive before handing it over is placing faith where faith doesn't belong.

<comment><USER27> You may not always have the chance to scrub it yourself, for example when your VM has a hardware issue.

</comment></comment><comment><USER28> FWIW, this kind of problem is minor in comparison to the potential exploits that have and will continue to crop up in shared computing environments.

[https://www.cs.cornell.edu/courses/cs6460/2011sp/papers/clou...](https://www.cs.cornell.edu/courses/cs6460/2011sp/papers/cloudsec- ccs09.pdf)

[https://www.informationweek.com/security/risk- management/new...](https://www.informationweek.com/security/risk- management/new-virtualization-vulnerability-allows-escape-to-hypervisor- attacks/d/d-id/1104823)?

[http://www.insinuator.net/2013/05/analysis-of-hypervisor- bre...](http://www.insinuator.net/2013/05/analysis-of-hypervisor-breakouts/)

[http://slashdot.org/story/12/03/02/0059202/linode-exploit- ca...](http://slashdot.org/story/12/03/02/0059202/linode-exploit-caused-theft- of-thousands-of-bitcoins)

[http://thoughtsoncloud.com/index.php/2013/07/how-your- data-l...](http://thoughtsoncloud.com/index.php/2013/07/how-your-data-leaks- from-a-virtual-machine/)

I was trying to find any cases of a public cloud provider's customer data being leaked or easily visible on the internal customer network, but didn't come up with anything. Somebody's got to do a study on the major cloud providers and see if the good old methods to subvert network routes still works, or if you can easily mitm vm neighbors. (My guess is you can...)

</comment><comment><USER29> Just a random idea from an ignorant individual..

What if DO actually encrypted the SSD space with a key that they only have, and a new key is created for each droplet?

Then any droplets that are created later in a deleted space will just see effectively random data, no?

<comment><USER30> You can put the key on the disk itself too--you just need to zero out the space containing the key when you're done. That's how phones with encryption and remote wipe features usually do it.

In fact, a lot of SSDs, e.g. Samsung's, already work this way, transparently AES-encrypting data before it is written. (With AES in hardware, the overhead is negligible, even for high-performance drives.) The "Encryption" feature they advertise actually just lets you set your own key for the encryption key container--it happens either way.

<comment><USER31> Intel FDE, as far as I know, also works this way.

The key is protected. In the event that the drive must be re-provisioned (like in the case of a lost password), the decryption key is simply overwritten by the new key, rendering the original data unreadable.

</comment></comment></comment><comment><USER32> It's almost public knowledge as there's an option in the GUI called "scrub data", the absence of a tick there implies that it's not going to be erased before the VMs partition is reassigned. I had a chat to the support months back about "erase data" not being in the API at the time, and the solution I came to was just to ditch their API and go back to scraping their forms for the option.

That said, this would probably go down better for the company and the community if you tried a private disclosure rather than posting about it on Github.

[https://www.digitalocean.com/security](https://www.digitalocean.com/security)

<comment><USER33> I've been a DO customer for about a year and some, this is news to me. So no, I wouldn't say it's public knowledge.

That said, I haven't really destroyed many of my VMs.

<comment><USER32> [http://i.imgur.com/Aliyewf.png](http://i.imgur.com/Aliyewf.png)

I suppose when I made that comment I was expecting everybody to be like me; eager to flip switches to see what they do.

<comment><USER34> I would expect that option to do something along the lines of scrubbing the data on the hardware level so that someone who physically examined the disk wouldn't be able to access my data. That's because I'd expect my data to be at least logically wiped in the first place.

<comment><USER35> Same here

</comment></comment></comment></comment></comment><comment><USER36> If the "securely scrub" parameter has ANY kind of performance impact which I suspect it does then isn't it a good thing that DO gave their users the choice ? There are plenty of use cases where I would trade privacy/security for performance.

Anyway disingenuous title to say the least.

<comment><USER37> It is good to give users the choice. It is bad to default to the dangerous choice. It is even worse to not describe the bad consequences of the default anywhere.

Nowhere in the DO UI for destroying a droplet does it indicate that they will leak all of your data to the next customer if you don't check the box.

</comment></comment><comment><USER38> This is bad for Digital Ocean as the checkbox is nothing but a legal excuse to let beginners shot themselves in the foot and for a new company, this isn't a situation you want to be into. Look at Amazon - how do they solve the same problem? Is it harder for them? Is there a checkbox? When you compete with Amazon you have to be that and better, not worse, and treat beginners better than experts!

<comment><USER39> Amazon doesn't do SSD VMs for $5 a month... If you are beginner you are using the Web GUI which clearly states you need to click the box to securely wipe all the data (which has a cost associated with it) if you are using the API then you should RTFM (Read the F Manual) if you build a service on top of the API then it is the service's fault for not including (which is what the gist is about)

<comment><USER40> From above: [http://i.imgur.com/Aliyewf.png](http://i.imgur.com/Aliyewf.png)

What that poorly worded checkbox says to me: "tick this box if you want to prevent DigitalOcean from reading your stuff."

Nothing in that web GUI "clearly states" that not ticking the box will allow the next random user to read my files.

</comment></comment></comment><comment><USER41> New response [https://digitalocean.com/blog_posts/transparency- regarding-d...](https://digitalocean.com/blog_posts/transparency-regarding- data-security)

I like DO as a service, but this is kind of strange. Humans act always the same. When catastrophe hits they want to sit it out, underestimating the impact

</comment><comment><USER35> Please DO, do something brave and make the default behavior sane ( there is absolutely no way i would except another customer to get my data with a one line shell script, ever). I LOVE your service, so dont screw it PLEASE !!

</comment><comment><USER42> DO released a blog post on the issue[0]

[0] [https://www.digitalocean.com/blog_posts/transparency- regardi...](https://www.digitalocean.com/blog_posts/transparency-regarding- data-security)

</comment><comment><USER43> It would be interesting to see a survey of the various cloud VM services; if any of them will return non-zero (data) blocks for uninitialized storage.

Sounds like a major risk if SSH, SSL, passwords etc can leak this easily.

<comment><USER12> Also, even if they zero the primary block device, what about swap if it's provided as a separate block device?

<comment><USER13> DO provide a single block device (so swap is on the same block device), that gets zeroed if you set the scrub data option.

</comment></comment></comment><comment><USER44> I just moved one of my apps from linode to DO several days ago, some explanations here just blowed my head off.

</comment><comment><USER45> I have created a uservoice issue to scrub by default, please vote: [http://digitalocean.uservoice.com/forums/136585-digitalocean...](http://digitalocean.uservoice.com/forums/136585-digitalocean/suggestions/5280685-scrub- vms-on-delete-by-default)

</comment><comment><USER46> Onapp has the same issue by default, it's not set by default to zero fill the old disks are being destroyed. This need to specifically be enabled in the config file by the administrators.

In case you are running a VM on top of their platform you may want to check to make sure this is enabled.

</comment><comment><USER47> Is it the same issue, or a different one, from this one back in April of 2013?

[http://www.wired.com/wiredenterprise/2013/04/digitalocean/?c...](http://www.wired.com/wiredenterprise/2013/04/digitalocean/?cid=co6834744)

</comment><comment><USER41> for those wondering, how that compares to AWS. AWS sec policies [http://awsmedia.s3.amazonaws.com/pdf/AWS_Security_Whitepaper...](http://awsmedia.s3.amazonaws.com/pdf/AWS_Security_Whitepaper.pdf)

</comment><comment><USER48> Hmm have you done this with private disclosure? If not, please do that next time. It is unethical to disclose security-related issue of some PaaS publicly without first going through the responsible party first. Even if a security issue you want to report is actually something only the owner can see... I don't know what this do because I don't really use DO, but just judging the way it is reported, it looks like you haven't...

<comment><USER49> Even if one bought the ridiculous notion that private disclosure of vulnerabilities is a good thing, why would you think it would be necessary to privately "disclose" to anyone what Digital Ocean already publicly documents in their API?

<comment><USER48> [edit]: okay I misunderstood the issue here.

Some day I would forget to close my home door with a bang. No home invasion yet because nobody notice that the door wasn't fully closed. Now I am telling people I will forget to close my door, and I will get an invasion.

Some people's repo have password committed. It only takes someone to google that to find out. If someone posts that on HN, yeah, it's on the web anyway, it only takes one person to make my password known instantly.

<comment><USER49> You are extremely confused. Digital Ocean does this deliberately and already publicly documents it. It is intentional.

This is not a bug report to Digital Ocean or any other PaaS. It is a request for a third-party library to support an option Digital Ocean's API provides.

<comment><USER48> [edit]: okay I misunderstood the issue here.

</comment></comment></comment></comment></comment><comment><USER50> Linkbait. Title should be "Digital Ocean API is not told to scrub (securely delete) VM on destroy"

<comment><USER37> "Don't scrub" does not imply "give the data to the next guy".

If I delete a file on my computer without doing a secure delete, I know that the data is still on the disk and can still be recovered. However, I _also_ know that in _normal_ operation of the computer, that data will never show up again. There are no circumstances where I can create a new file and have it get filled out with the contents of the deleted file. There are _certainly_ no circumstances where another user on my computer can do that and get my data.

I would have every expectation that this scrub option works the same way. That it defends against specialized recovery efforts, not random people making new VMs. DO's documentation says nothing to indicate otherwise.

</comment></comment><comment><USER51> what i dont understand is, why would any one want to START with a VM that has some one elses data on it? Forget people wanting their data scrubbed on delete.

</comment><comment><USER52> This makes me wonder if AWS secure on this front?

<comment><USER53> Customer instances have no access to raw disk devices, but instead are presented with virtualized disks. The AWS proprietary disk virtualization layer automatically resets every block of storage used by the customer, so that one customer's data are never unintentionally exposed to another. AWS recommends customers further protect their data using appropriate means. One common solution is to run an encrypted file system on top of the virtualized disk device.

[1] [http://awsmedia.s3.amazonaws.com/pdf/AWS_Security_Whitepaper...](http://awsmedia.s3.amazonaws.com/pdf/AWS_Security_Whitepaper.pdf)

</comment></comment><comment><USER54> have you gone to DO directly with this first?

<comment><AUTHOR> According to them, it's either a bug they already fixed in April, or leaking data today by design?

[https://www.digitalocean.com/blog_posts/resolved-lvm-data- is...](https://www.digitalocean.com/blog_posts/resolved-lvm-data-issue)

[https://twitter.com/jedgar/status/417515181418479616](https://twitter.com/jedgar/status/417515181418479616)

<comment><USER12> I don't really see how this is leaking data. I can use the dropbox API to make a bunch of files with private data shared with the world. But dropbox isn't "leaking" my data, I'm using the API in such a way that makes my data accessible. Not an exact analogy, and I would agree that the option should be on by default so people who know what they're doing can opt-out and everyone else gets a safer default, but this isn't a "data leak."

<comment><AUTHOR> It absolutely is a data leak.

I spun up a vm and ran "strings" on the blockdev and got this:

[http://i.imgur.com/fJOxRN9.png](http://i.imgur.com/fJOxRN9.png)

Some poor iPhone users in Portugal have no idea that the app they're using is backed by a webservice on a VM that gives its block storage contents to anyone who gives Digital Ocean a $5 PayPal payment.

If that isn't a data leak, I don't know what is.

<comment><USER12> If you make an API call that asks for your data NOT to be scrubbed, then it's not a leak that your data isn't scrubbed--you asked for it. If you haven't read the docs, you might not be aware that you're asking for it. That's a Bad Thing. No question. It should be enabled by default, to prevent unknowing users from leaking their own data. If you ask for a scrub and you can still find data on the scrubbed block device, then you have a leak from DO.

<comment><AUTHOR> I'd agree with you, except that in this case the API call is called "destroy". Were it called "deallocate", this would be a different story.

</comment></comment></comment></comment></comment></comment><comment><USER55> lol of course.

</comment><comment><USER56> these problems cannot be avoided

</comment><comment><USER57> leaks leaks leaks. no good!</comment>


ICOs, VCs, IPOs and SPACs - <AUTHOR> https://www.bloomberg.com/view/articles/2017-09-15/icos-vcs-ipos-and-spacs <comment><USER2> >We have talked before about the shifting balance of power between entrepreneurs and capital providers. I have argued that the rise of founder- friendliness in startup funding is not just an idiosyncratic matter of philosophy, but a structural matter of negotiating power: If good ideas are rare and valuable, and capital is cheap and plentiful, then people with ideas will be able to extract whatever terms they want from people with capital.

This is very, very true, especially if you compare current funding terms with what was prevalent in the 80's.

</comment><comment><USER3> > selling $600 million of stock to the public so that it can go out and hunt > for a unicorn to take public

Holy shit. They're literally selling a chance for your money to be spent on potentially nothing. I'm not one to usually cry that the sky is falling/it's a bubble, but this is getting ridiculous.

<comment><USER4> Is this your commentary on Social Capital's performance to date, or your general distaste for venture capital?

</comment></comment><comment><USER5> I'm starting a coin education program at [https://simplecoin.life](https://simplecoin.life) to address these issues. The only way to help society is to educate the masses about the block chain. The only way to do that is make a simple example.

</comment><comment><USER6> I'm curious if anyone can quantify the creation of new financial products and compare against GDP growth?

My recollection is post 2008 many economists were concluding that the hyper financialization of the economy was a detriment and was not actually creating long term value. Curious if ICO's, SPACs are as a result of loosening regulatory appetite as the political winds have changed and memories of pre-2008 start to recede.

</comment><comment><USER7> A month ago anyone mentioning ICO's on HN was downvoted to hell. Maybe someone at YC is starting to look at ICOs, the mood is changing here

<comment><USER8> The mood of HN commentators does not necessarily reflect the mood of YC, though.

</comment></comment><comment><USER9> Oh, make sure you read the stuff on Shkreli.</comment>


[SEO Case Study] How we optimized Crawl Budget by removing 72% of indexed URLs - <AUTHOR> https://engineering.skroutz.gr/blog/SEO-Crawl-Budget-Optimization-2019/ <comment><AUTHOR> This is a story about the technical side of SEO on a large e-commerce website like Skroutz.gr, with nearly 1 million sessions daily and how we dealt with some significant technical issues we found a year and a half ago.</comment>


Show HN: Snebu, a fast snapshot compressing deduplicating backup for Linux - <AUTHOR> https://github.com/derekp7/snebu <comment><AUTHOR> Just put out a new release, which adds the ability to limit users to specific actions such as backup but not delete, or restore only.

I'm looking for some feedback on this project, as it provides features not found in rsync snapshots, Borg/Attic, Restic, and others. Only thing currently missing is encryption, however you can use Luks encryption on the target, and encryption in flight is handled by ssh.

A separate in-app encryption module is being worked on currently.</comment>


Monitoring containers in production - <AUTHOR> https://blog.netsil.com/container-monitoring-simplified-with-the-netsil-aoc-8048bed74365 <comment><USER2> Blah. Based on the title I expected a more generically applicable pattern rather than a product pitch. Could be interesting but it's something I see as a difficult sell over K8's and open source tools</comment>


Imagining a Cashless World: Sweden Begins Eliminating Cash from Daily Life - <AUTHOR> http://www.newyorker.com/magazine/2016/10/10/imagining-a-cashless-world <comment><USER2> This is a dangerous movement.There are documents from Visa and I believe Mastercard about how to push for a cashless system, which would be in their best interest. Imagine having to pay a 2% transaction fee on EVERYTHING. Water bill, 2% more. Gas, 2% more, food, 2% more on top of the 2% to 3% inflation that grows each year. Etc. etc. etc. A lot of "futurist" have talked about how cash is archaic but being stuck in ONLY electronic banking, and your just closer to global slavery.

<comment><USER3> While this is true, cash has a really high cost too: there is a need to print it, distribute it, keep it safe, robberies...

Electronic money, even with the 2% fee is still probably much cheaper than using cash.

My main worry is be the loss of privacy.

</comment></comment><comment><USER4> See also this Freakenomics podcast [http://freakonomics.com/podcast/still- using-cash/](http://freakonomics.com/podcast/still-using-cash/)</comment>


Why can't we get rich like Zuckerberg? (comic) - <AUTHOR> http://joyoftech.com/joyoftech/joyarchives/1038.html <comment><USER2> Start a competitor to FaceBook called EarBox.

<comment><USER3> I was hoping for NoseBucket

<comment><USER2> <http://www.urbandictionary.com/define.php?term=box+your+ears>

_box your ears_

To strike someone on one or both their ears with the flat of your palm,this totally destroys their balance and usually destroys their eardrums if done right.

<comment><USER4> So really you should start a site called EarBoxZuckerberg.com

</comment></comment></comment></comment><comment><USER5> Why is this supposed to be funny?

<comment><USER6> yes

</comment></comment><comment><USER7> jealousy.</comment>


Four More Analysts Call Market Bottom - <AUTHOR> http://mast-economy.blogspot.com/2009/04/four-more-analysts-call-market-bottom.html <comment><USER2> so, the site that says it only posts good news on the market is posting good news on the market? you don't say...</comment>


Kintsugi - <AUTHOR> https://en.wikipedia.org/wiki/Kintsugi <comment><USER2> I'm about to go to bed but I have been practicing kintsugi for years if anyone wants to ask specific questions.

I learned it by using interlibrary loan to get a bunch of different partial resources and a university librarian to help me translate them. I'm sure youtube or something is an option these days.

The materials are available online. It is a very, very difficult skill. It involves a lot of experience and intuition with the mixing of many materials involved, plus a lot of spacial intelligence to fit the things back together correctly. And finally just tolerance for frustration because it often doesn't work, wasting hours of work and setting you back weeks.

If you like the aesthetics just use epoxy or something and gold dust. I can't really recommend it for the end result alone. Not worth the effort and frustration.

<comment><USER3> I wish I have seen your post few days ago.

I just finished mending something dear for my mum.

I practiced few techniques on a cheap mug. In order to try out how the end result would look like.

From the photos and scarce info I got something to get me going.

I really don't like how the 'craft' method looks like - cheap western approximation of Kintsugi.

I wanted to get the look of smooth gold surface merging two pieces seamlessly. But also I want the gold line to be visible.

I couldn't really find info on what materials to use to acheive the original Kintsugi look, so I bought few things and started experimenting.

When practicing I noticed that when crack is clean there is barely space for golden seam. Also its hard to align pieces perfectly smooth. So the first thing I did was to file down the cracked edge with diamond file, at angle to preserve lower layers that will make contact and help align the pieces. This makes the crack gap appear larger, it makes it look easier and better looking in my opinion.

I ended up clear quick epoxy, to bind the pieces together. I used small amounts of it. When it was set but not dry i used a scalpel to cut out excess and make a groove in the crack. Then clean up the surface and let it set overnight.

Next I used slow setting clear epoxy mixed 1:1 ish with golden pigment (It was pure titanium oxide). I tried multiple pigments and the pale yellow seems closest to the really gold look. I filled in the gaps carefully making sure its barely above surface of the crack.

After hour or so when the epoxy mixture was gooey I used flat piece of wood with wet paper tissue to even out the surface. I pushed the 'spillovers' into the grove (for cleanup) and move the excess along the surface of the crack.

When that was all done, I clean off the surface next to crack and applied real gold leaf (its not too expensive, mine costed me €3 in total). Gold leaf is pain and I wasted some in the beginning.

The end result looks nice though not as good as the original pictures.

Can you comment on my technique and maybe give some info on traditional materials? Maybe recommended readings?

<comment><USER2> Aligning the pieces is definitely the hardest part. You can get them to fit perfectly together without a binder but once you add glue or resin or anything they can move and it's just very difficult.

My advice is just to focus on getting them together correctly at that point and make sure the angles and curves are right. It's extremely difficult and there will be glue or resin everywhere but you can clean it up later.

A part of the traditional technique you might be able to use is how to apply the gold. They use a fine gold powder, but it isn't mixed into the resin. Once the crack is fitted and set it is painted over with resin again and then gold dust is sifted onto the resin before it cures. This ends up looking a lot smoother and better than leaf or gold mixed with the resin. There are some techniques where dust is embedded into it then sanded down but I don't recommend them for starting out.

Honestly it sounds like you're doing fine. That sort of experience is consistent with how I learned, it took about a dozen attempts before I got anything worth showing anyone. Like I said, it's a difficult, frustrating skill.

<comment><USER3> Thanks for sharing insight. Do you use a varnish over the crack to protect the golden surface? If so what kind of product would you recommend?

I might have few accidental breakages in the future :)

I find it quite relaxing and it could be my next hobby.

<comment><USER2> I don't use a varnish, I find the resin cures hard enough to not need it for normal use. If you're using something softer like epoxy you'll probably want something but I don't have any experience there.

<comment><USER3> If you don't mind me asking what kind of resin are you using?

<comment><USER2> I use urushi and sometimes cashew lacquer. These may not truly be "resin" if that word has a specific technical meaning. Some of my original sources used resin as a translation for the urushi material so I do too.

<comment><USER3> Thanks, for the info. I appreciate your time.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER4> Just so you know: the "lacquer" used for kintsugi is actually urushi - the sap of a tree related to poison oak and poison ivy. Before you think about trying this, understand that your choice is to gown up completely and avoid all contact or just go with the rash and gain immunity over time.

That said, urushi in all its forms is one of the most amazing art forms - there are literally thousands of decorative techniques and uses.

<comment><USER5> Thank you for the warning. I'm planning to get into the hobby with a box of preserved broken objects and that was not something I'm ready for. Has anyone found an alternative lacquer or used biohazard-like PPE and procedures to avoid contact completely?

<comment><USER4> Personally, I don't think there is anything like it. Since it is an adhesive you can do things like glue broken pottery. Or you can cover it with tiny pieces of egg shell (rankaku). You paint on goo, cure it in warm&humid environment and it becomes food safe, water safe and alcohol safe. The curing changes the formula so it is no longer toxic at all.

I know some people who are very diligent about contact and manage to work without getting a rash. If you want to go that route you have to be very diligent. Apron, gloves, long sleeves, you don't need a mask. The problem for many people comes when their phone rings and they reach into their pocket (true story) or their nose itches. I am not that neat so I just went with it.

<comment><USER5> Thank you! That sounds very manageable. One trick I learned working with non- volatile hazardous material is apiarist suits. They're cheap on Amazon and the screen is enough to remind me that I'm working with stuff that shouldn't touch my face without being suffocating in the California heat. Though I usually put on a pair of latex gloves instead of the apiarist gloves for better mobility and use a water proof phone for less awkward cleaning.

Are there any English language sites/communities dedicated to kintsugi that I should check out?

<comment><USER4> I have not been able to find a community. In larger cities you may be able to find a teacher. I found individuals who helped me and a person in Boston. Japanese swords use urushi so you may find some resources among those groups who build those.

</comment></comment></comment></comment></comment><comment><USER6> This is really cool. I've seen and heard about it but didn't know what it was called.

Seems like it would be fun with (food-safe) epoxy and dye. One problem is that it seems like most glass-ware is tempered so when it does break it shatters in a million pieces.

</comment><comment><USER7> There is a good documentary series that shows different trades from East Asia. And there is an episode about kintsugi: [https://youtu.be/CUxAfpHc7Jo](https://youtu.be/CUxAfpHc7Jo)

The two seasons are worth a watch if you like this kind of documentaries:

[https://www.youtube.com/playlist?list=PL-qn- eiR753dIGQwqS2xs...](https://www.youtube.com/playlist?list=PL-qn- eiR753dIGQwqS2xsdZtXTVIwb27g)

[https://www.youtube.com/playlist?list=PL-qn- eiR753ccooonsx0U...](https://www.youtube.com/playlist?list=PL-qn- eiR753ccooonsx0U3j1ACk5YZJtE)

<comment><USER8> This nerdwriter1 video in kintsugi is also really nice.

[https://youtu.be/lT55_u8URU0](https://youtu.be/lT55_u8URU0)

</comment></comment><comment><USER9> Also the title of a Death Cab for Cutie album.

[https://en.wikipedia.org/wiki/Kintsugi_(album)](https://en.wikipedia.org/wiki/Kintsugi_\(album\))

<comment><USER10> Also co-opted by Henkel as Loctite Kintsuglue™ [1] ; which itself is a knockoff of the crowdfunded Sugru™ [2]

[1] [https://www.henkel.com/press-and-media/press-releases-and- ki...](https://www.henkel.com/press-and-media/press-releases-and- kits/2018-02-05-much-more-than-glue-loctite-kintsuglue-824138)

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

</comment></comment><comment><USER11> I just watched all of Man in The High Castle; they show this in some later episodes. Neat concept--I wonder if there are specific formulas to make repairs to mugs &c food-safe?

<comment><USER12> I guess it's fine to hold things like dry fruit but if you pour boiling water on it, I think the risk is if that could that leach something into the water?

Certified food safe epoxies exist but are expensive, e.g. ArtResin is one.

</comment></comment><comment><USER13> I guess kintsugi becomes a dying art form once a new bowl can be stamped out at 1/50 the cost and speed of an old master trying to repair the worn out thing with gold.

<comment><USER3> Its a philosophy of repairing broken things and in doing so making them a better more interesting more unique and above all personal.

But some people will be satisfied living in plastic houses eating of plastic plates.</comment></comment>


How Coke and Pepsi make millions from bottling tap water - <AUTHOR> https://www.consumerreports.org/bottled-water/how-coke-and-pepsi-make-millions-from-bottling-tap-water-as-residents-face-shutoffs/ <comment><USER2> This story's all over the place. It starts out with a COVID-19 angle that's only relevant because of the publication date. It gets randomly dropped in, almost like someone was updating an evergreen story.

There's bits on equality in billing, criticism of profits, criticism of undercharging for groundwater, undercharging for surface water, something about perceived quality of tap water, and a plug for their review on home water filters. It also lacks specifics around how widespread most of its criticisms are--it just has an example of a particular criticism.

I'm not sure what to take away from this.

</comment><comment><USER3> "Hoarding bottled water simply isn't necessary for most people."

At all times people should have emergency water. fema recommends two weeks.

[https://www.fema.gov/pdf/library/f&web.pdf](https://www.fema.gov/pdf/library/f&web.pdf)

If you don't understand why this is especially important in a pandemic, just trust fema as a minimum.

<comment><USER4> hot tip: in case of a water crisis, extract the remaining water from your hot water tank (it has a drain port).

That's about two weeks (drinking) for most families (30-80 gallons).

</comment></comment><comment><USER5> Bottled water is just another way to rip off all taxpayers, chiefly the stupid.</comment>