Machine Learning in JavaScript - <AUTHOR> http://burakkanber.com/blog/machine-learning-in-other-languages-introduction/

<comment><USER2> Author here -- thanks for submitting, xd!

Let me know if you have any questions. I do intend to keep up with this series, although my pace is pretty slow at about one article every three months or so.

There are already a couple of comments about running ML in JS and how JS and the browser environment isn't terribly suited for heavy calculations. First: you're totally correct; second, I chose JS because it's

1) accessible -- whether you're Python or Ruby or PHP on the backend, you're probably comfortable with JS and

2) it demystifies machine learning -- you have to write your ML from scratch, without the help of all those wonderful Python libs, and I think this exercise shows you that it's not so mysterious after all.

Anyway, thanks for reading, and I'll poke in here throughout the day if you have questions.

<comment><USER3> "2) it demystifies machine learning -- you have to write your ML from scratch, without the help of all those wonderful Python libs, and I think this exercise shows you that it's not so mysterious after all." \- you can demystify machine learning in any better language.

JS and PHP are slow, crappy and bug prone. Sane languages (like Python, C++) have tools to make your job easier (like numpy, blas, eigen and other libraries). They provide fast and reliable math routines so you don't have to worry about some eigenvalue decomposition, matrix multiplication and other problems.

<comment><USER4> JS isn't particularly slow any more, thanks to the massive efforts invested in the optimization of the various competing JS engines. It is generally faster than Python 3 ([http://benchmarksgame.alioth.debian.org/u64/benchmark.php?te...](http://benchmarksgame.alioth.debian.org/u64/benchmark.php?test=all&lang=v8&lang2=python3&data=u64)) and not just a little. Just for the hell of it I compared node and python on naive fibonacci. That is anecdotal, of course, but node is _30 times faster_. I do agree with you that JS has horrid, bug-prone semantics, but it's impressively well optimized.

I also agree that other languages offer better tools. For instance, Python has Numpy. However, that's written in C++, not in Python. You can write plugins for Node in C++ too, so nothing would stop someone from writing a Numpy equivalent for JS. You might even be able to run it in some browsers through something like Emscripten with a performance overhead of 2-3x (I think?)

<comment><USER5> Let's not forget webCL. Gpu based matrix multiplication is available in javascript too.

</comment></comment></comment></comment><comment><USER6> For those who aren't familiar Andrej Karpathy has done a lot of cool stuff with ML in JS. Particularly he has a CNN library -- deep learning comes to JS!

[http://cs.stanford.edu/people/karpathy/convnetjs/](http://cs.stanford.edu/people/karpathy/convnetjs/)

[http://cs.stanford.edu/people/karpathy/svmjs/demo/](http://cs.stanford.edu/people/karpathy/svmjs/demo/)

Heather Arthur (npm libraries brain, classifier) has also done a bunch of cool stuff!

[https://github.com/harthur](https://github.com/harthur)

</comment><comment><USER7> To those wondering why someone would want ML in JS, there are loads of reasons.

For starters, node.js, which makes most of the arguments regarding server/client moot.

Secondly, there are many client side applications for these types of algorithms as well. K-means clustering, for example, is already used by many mapping libraries to group together large numbers of points[1].

I personally use neural networks and affinity propagation in many of my applications for predictive analysis. This does not have to only be educational, or of a 'toy' nature.

[1] [http://danzel.github.io/Leaflet.markercluster/example/marker...](http://danzel.github.io/Leaflet.markercluster/example/marker- clustering-realworld.388.html)

<comment><USER8> Nodejs is for i/o, i know it has workarounds for long running tasks(threadpool) but it does not excell at that. Training your model, updating your model, validation, matrix factorization on large datasets etc, i just don't see how Javascript helps here. Maybe just taking the http request and dumping it onto a rabbitmq queue to to classify something but you still have a whole host of other stuff to deal with.

<comment><USER7> > Nodejs is for i/o

Node is a general purpose language that can be used for all kinds of things. I switched from Python to node.js about a year ago for exactly the sort of tasks you are describing and could not be happier. Right off the bat I had huge speed improvements.

Also, io is one of the biggest issues with web based data analysis, so it really should not be underestimated. I can do more with less with node than I could with Python. This is especially true with long running tasks where a 1 minute processing time vs a 20 minute processing time might mean you need 1/20th the number of servers in a cluster ($$$).

Of course, this could be a pretty good argument for something even faster/lower level, but for me, node.js struck a good balance between performance and ease of development/ecosystem. As usual, YMMV.

One last point. The language you choose cannot always be the best language for every task you need. Typically you choose a stack based on the most common/important tasks in your infrastructure, then for less common tasks you just make it work with what the chosen language provides. In this case node.js does not need to be the best solution for ML, it just needs to check the box for being possible, so that devs who needed node.js for other reasons now have the ability to add ML to their toolbox.

<comment><USER9> > Node is a general purpose language that can be used for all kinds of things.

Node is a _library_ that can be used for all kinds of things. FTFY

<comment><USER7> Fair enough, it is not a language, but I would not call it a library either. Perhaps a platform?[1] It contains many libraries, but also has a cli tool, packages a runtime, a debugger, and even includes a package manager. It contains the sorts of things that would be packaged when you install languages like Python or Ruby.

[1] [http://nodejs.org/](http://nodejs.org/)

</comment></comment></comment></comment></comment><comment><USER10> This blog also contains a JavaScript physics series which is very cool.

Do hope this author writes more again it has been quite.

<comment><USER2> Thanks! -- I am intending to write more, but the pace is _sloooowww_.

</comment></comment><comment><USER11> For neural networks, you can use BrainJS

[https://github.com/harthur/brain](https://github.com/harthur/brain)

<comment><USER12> So the input/output pairs are a linked list of objects? Which then contain vectors comprised of linked lists? I am not very into JavaScript, but that right there must preclude this from doing anything significant in a reasonable amount of time?

</comment></comment><comment><USER13> That's great, keep up the good work.

For some reason it's somewhat hard to find C-style science code examples in some disciplines. Python feels a bit like a plague in this respect. Everytime I have to wrap my head around while converting code to C-like language (C, C++, PHP, JS).

<comment><USER14> The distance to convert math to python is so much shorter than math to C or math to javascript.

You need something like numpy to make working in javasctipt easier before there will be a proliferation of of ML in JS.

I really love JS for its distribution and some of the visualizations are amazing. But the low level, numerically stable, matrix math primitives are sorely lacking.

<comment><USER10> I feel the people doing heavy work with graphics APIs and 3D work with robots too will push this back into the javascript language given some time.

<comment><USER14> I work with robots. The leading middleware is ROS. It is multi language, but does not support JS out the box (unlike LISP, Java, C++ and Python), though there is movement there [http://brandonalexander.com/rosnodejs/](http://brandonalexander.com/rosnodejs/)

I can see JS useful for a UI to a robot, but I can't see it replacing Python for math, or C++ for speed, or LISP for planning systems.

That said, I can imagine node.js being a better async message router than the current C++ one.

ROS is glued together with XML-RPC, which I think was a mistake (why not JSON???)

</comment></comment></comment></comment><comment><USER15> If you're looking for more on this, or some general purpose JS NLP you'd do worse than to checkout node-natural[0]

[0]: [https://github.com/NaturalNode/natural](https://github.com/NaturalNode/natural)

</comment><comment><USER16> Interesting, but I wonder about this:

> … well, most of the time. There are some things you really can't do in PHP > or Javascript, but those are the more advanced algorithms that require heavy > matrix math.

Leaving out javascript (in the browser), it sounds like an odd statement to make about php -- after all one of php strengths is how easy it is to link with c-libraries (or other with c ffi)? Among other things I quickly found:

[http://www.php.net/manual/en/intro.lapack.php](http://www.php.net/manual/en/intro.lapack.php)

</comment><comment><USER17> I still view JS as a UI-oriented language, and I really don't know why would you want to implement processor-heavy algorithms in a browser environment, which need a lot of data and don't use the networking.

I would still stick to python. Or java. Or anything else which has a clear syntax and can run at a useful speed (I'm not mentioning C++ because of the coding overhead and dirty tricks which makes it a bit unfriendly for learning an algorithm)

<comment><USER18> Clarity of syntax is a matter of opinion (personally, I agree that Python is clearer than JS... Java, not so much.)

Implying that JavaScript can't "run at a useful speed" is wrong, using modern implementations. This is especially true for code that runs through lots of repetition as the just-in-time compilers in the JS engines do a remarkable job.

Not to mention that viewing JS as a UI-oriented language seems a bit out of date given the 40k or so packages for Node.js that are in npm.

JavaScript of today is pretty different than JS of 2007, and there are more changes coming with generators, iterators, destructuring, class syntax, arrow functions, promises, etc.

<comment><USER15> While I disagree with the comment you're responding to, and agree with yours, there are some interesting problems doing resource heavy operations in ML/NLP in an environment like Node that's inherently single threaded.

I'm actually adding multi-threading to classifier training in node-natural as we speak [0] so it's something I'm recently familiar with. Multi-threading in JS isn't new or particularly exciting (even less so is multithreading in ML/NLP applications) but the marriage of the two has led to a few interesting problems in JS's asynchronous/event based view of the world!

[0]: [https://github.com/NaturalNode/natural/issues/124](https://github.com/NaturalNode/natural/issues/124)

\--

Edited for clarity

<comment><USER18> That's a good point. Of course, the problems with shared mutable state are well-documented and I'm glad that JavaScript hasn't headed down that path. But you're right that Node doesn't have good, mature solutions for that yet (short of your central data store option)

</comment></comment></comment></comment><comment><USER19> I kicked around with some JS manifold learning stuff[1] a while back for essentially the same purpose: practice in writing things from scratch, while making it easier for other people to play with.

[1]: [https://github.com/perimosocordiae/js_manifolds](https://github.com/perimosocordiae/js_manifolds)

</comment><comment><USER20> Cool project! Have you already tried asm.js and/or measured performances?

<comment><USER13> You cannot write asm.js by hand (in a sane way... it uses one big array for everything). It's meant to be translated from emscripten clang compiler project. So you can compile C/C++ code to asm.js.

But Javascript engines like V8 with its JIT are way faster than Python. You can even use typed arrays that give you almost native speed for such operations (e.g. matrix). I am coding a 3D game in WebGL and JS is as fast as Java when used in a modern fashion, though JS run in every browser

</comment></comment><comment><USER21> X in JavaScript..... _ugh_

if all you have is a hammer, everything looks like a nail

<comment><USER2> Have you read the article? I make it pretty apparent that JS is used primarily for its educational value :)

<comment><USER21> To be honest i didn't initially. I just read it.

I think it is a noble thing to explain this in JS. But i don't think "because every body uses js" is a good reason to choose js.

However your specific use case makes sense. But in a broader sense I see more and more people fleeing to JS because its what they know.

<comment><USER22> What alternatives would you recommend for someone new to programming and CS?

I guess fleeing implies that they were using other tools already, but a lot of new devs are going to JS because it just makes sense to start there (lots of flexibility, hyperactive community, education value).

<comment><USER23> If you are at the point of your CS education that you are taking a serious look at machine learning and understanding the theory then you shouldn't have a problem translating into whatever your language of choice is. I get why a teacher would just want to pick a language and say "this is what it is in" but I don't get people who need CS concepts taught in their language of choice. The hard part is the theory and not the implementation.

When I took it in university it was taught in language agnostic psuedocode and we were free to use any language from a long list for our assignments.

<comment><USER2> > If you are at the point of your CS education that you are taking a serious > look at machine learning and understanding the theory then you shouldn't > have a problem translating into whatever your language of choice is.

This feels like begging the question. Why does that need to be the case? Why can't someone strive to learn machine learning _without_ learning a new language? Why can't they get a head start on the concepts early in their career? Is there some requirement that ML _must_ be an advanced topic, only accessible to polyglots that I haven't heard about?

<comment><USER23> Because the nature of the subject requires a fair amount of background. To truly understand the subject and a lot of the approaches a firm understand of statistics, data structures, and even some calculus. Usually by the time someone these subjects down enough for anything substantial in ML then they've seen enough different languages to suss out the general idea of most algorithm sample code.

I'm not saying there isn't room for the easier to understand and easier to read guides to ML. More the better, Mitchell was a beast to read through. Its just the language isn't the hard part of the subject. You are the author of the link, correct? I read through some of it, and its approaches the theory and subject matter in a gentle way which is what matters. The sample code is easy to read. I've written _maybe_ 100 lines of js in my life and avoid all web dev like the plague. Your guide is well written and useful. I am not dogging it at all and please don't take it that way. I think its great!

What I'm saying is if someone is saying to themselves "I would be able to learn machine learning if only their was a guide in X" then they are probably mistaken. The code is easy, the math and theory is what is hard.

<comment><USER2> > Its just the language isn't the hard part of the subject.

For you, sure -- but not for everyone.

This series has actually been up for a little over a year now. I get emails from people who didn't know what machine learning was before they started reading the articles, and now they're building some of the most creative and beautiful projects out there. I also get emails from people who need to implement ML in JS or C-like languages but have had trouble seeing the algorithms in full relief when translating from Python, for instance.

The point is, your experience is not everyone's experience. My goal is _purely_ one of accessibility of education. There _are_ smart, talented people who never played with ML simply because they didn't want to dive into a different language, different platform, and different environment just to muck around. There _are_ people who hadn't heard of ML before, but tried it out because JS was _right there_ for them. There _are_ people who stayed away from ML because they thought higher math and a CS education were requirements. Those are facts. This series serves all those people, and it serves them well.

<comment><USER23> I just want to make sure that its clear that I think you are hitting that goal and your posts look great. There is nothing worse than posting something on the internet to have some snarky neckbeard from the peanut gallery put it down for some tangential reason.

</comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER24> Only a question of time before the Machine Learning wave arrived at the arguably least suited--but certainly the most popular--platform!

There's money to be made with this combination. The field is ripe.

Good write up too.</comment>


Everything you need to know about pointers in C (2010) - <AUTHOR> https://boredzo.org/pointers/ <comment><USER2> The time [0] I found out about ptr_b in

      int* ptr_a, ptr_b;

isn't actually initialized as a pointer I changed all my C code to marking * before the variable name, fun times. It's helpful to think int as the base type and * the indicator of functionality like [] and ().

Also just found out the author was the developer of Adium [1], which is one of my favorite softwares (best logo) on macOS.

[0] [http://c-faq.com/decl/charstarws.html](http://c-faq.com/decl/charstarws.html)

[1] [https://adium.im/](https://adium.im/)

<comment><USER3> Besides writing

      "int *p"

instead of

      "int* p"

I also always use one line per variable declaration, which should avoid confusion when the first style is used. But that's my personal preference.

Edit: corrected code quotation.

<comment><USER4> When quoting code, leave a line and indent by two spaces.

<comment><USER3> Sorry, will do so in the future. Thx.

</comment></comment></comment></comment><comment><USER5> > void pointers are incremented or decremented by 1 byte.

No, void pointer arithmetic is not allowed by the C standard: [https://stackoverflow.com/questions/3523145/pointer- arithmet...](https://stackoverflow.com/questions/3523145/pointer-arithmetic- for-void-pointer-in-c#3524270)

<comment><USER6> That answer does mention that GCC permits it as an extension. If the author uses GCC, maybe that's where the confusion comes from?

<comment><USER5> But then he also writes that "sizeof(void) is illegal".

OTOH, GCC documentation says "sizeof is also allowed on void and on function types, and returns 1".

</comment></comment></comment><comment><USER7> By C half-assedly trying to make "* " part of the name, just so you can use "* ptr" everywhere like it is an actual variable name, you get confusions such as this.

First "foo_ptr's type is int * ", but then "The pointer has a type, too, by the way. Its type is int.".

I also refuse to agree with "An int * * 's type is int * ". :)

But I guess "the type of `* ptr` is int, the type of `ptr` is int * " would be even more confusing.

<comment><USER8> It's a pretty bad syntax.

A demonstration of a declaration statement where the asterisk operator binds to an identifier rather than to a type:

        int my_int, *my_ptr, my_other_int;

A demonstration of a different declaration where the asterisk operator does not bind to an identifier, as an identifier isn't even needed:

        extern void my_function(int*, char*);

So the real answer is that it depends on what you're doing. Terribly clunky.

Interestingly the D programming language mostly keeps C's syntax, but handles multiple declarations differently. [https://dlang.org/spec/declaration.html#declaration_syntax](https://dlang.org/spec/declaration.html#declaration_syntax)

</comment></comment><comment><USER9> int array[] = {...}

1[array] == array[1]

Now add in some poorly named variables for some real fun

[https://github.com/Droogans/unmaintainable-code#cs- eccentric...](https://github.com/Droogans/unmaintainable-code#cs-eccentric- view-of-arrays)

</comment><comment><USER10> > A pointer is a memory address.

This is an amazingly wrong statement. In assembly you deal with memory addresses. Pointers in C are a much higher level abstraction.

> On current mainstream Intel processors, it occupies four bytes of memory > (because an int is four bytes wide).

This depends on the compiler as well as the processor.

<comment><USER11> _> This depends on the compiler as well as the processor._

Yes. On x64 compilers targeting 64bit cpus, the following prints 8 instead of 4:

      #include <iostream>
      int main () {
          std::cout << sizeof(int*) << std::endl;
      }

<comment><USER12> Posting C++ in a thread about C is odd. In C it's:

        #include <stdio.h>

        int main(void)
        {
          printf("%zu\n", sizeof (int *));
          return 0;
        }

<comment><USER8> There's a double-quote character missing.

<comment><USER12> Thanks. I suck at posting from my phone. Edited.</comment></comment></comment></comment></comment>


AT&T's Backflip Android phone is a face plant - <AUTHOR> http://blogs.computerworld.com/15715/at_ts_backflip_android_phone_is_a_face_plant <comment><USER2> I bought a Backflip yesterday and returned it today. I was so excited about getting an Android phone finally. What a disappointment when I realized I couldn't install apps from the web. I tried to install the Android Scripting environment that Google released, but I couldn't. Motorola support told me it was due to "carrier restrictions"

<comment><USER3> Apparently, the situation is not quite as bad as it first seems; the article links to instructions for setting up the Android debug environment on a host computer, which can be used to install apps.

<http://forum.xda-developers.com/showthread.php?t=643866></comment></comment>


SpinalHDL: An alternative hardware description language [video] - <AUTHOR> https://media.ccc.de/v/33c3-7873-spinalhdl_an_alternative_hardware_description_language <comment><USER2> This project looks very interesting!

And it seems they have addressed many of the issues with Chisel (of RISC-V fame) in Spindal: [http://spinalhdl.github.io/SpinalDoc/chisel/](http://spinalhdl.github.io/SpinalDoc/chisel/)</comment>


With Bright Benches, London Shows Off Its Love Of Books - <AUTHOR> http://www.npr.org/blogs/thetwo-way/2014/07/14/331396567/with-bright-benches-london-shows-off-its-love-of-books

<comment><USER2> More benches would be welcome in London, most existing benches are designed to be uncomfortable, so as to dissuade the homeless from hanging around.</comment>


Ask HN: Rate my app: PNGSquash - <AUTHOR> http://github.com/msanders/PNGSquash

<comment><USER2> After running PNGSquash on a directory containing 10 PNGs totaling 456KB (which had already been optimized with pngcrush from the command line), it shrunk them to 432KB using the smallest squash level. The processing time was around 4m20s on a MacBook Pro with 3GB RAM.

A similar tool is ImageOptim <http://pornel.net/imageoptim/en> , an open souce GUI for the following PNG / JPG optimizers: AdvPNG, OptiPNG, PngCrush, JpegOptim, jpegtran, and optionally PNGOUT.

Just curious about PNGOUT - did you get permission to bundle it with your app? Their license <http://www.advsys.net/ken/utils.htm#pngoutkziplicense> seems pretty restrictive: "Redistributing, repackaging, or reusing the PNGOUT or KZIP executable is prohibited without the express consent of Ardfry Imaging, LLC, and a formal business agreement."

<comment><AUTHOR> _The processing time was around 4m20s on a MacBook Pro with 3GB RAM._

Is this good or bad? One possible speedup I could use is to compress more than one image at a time, although the progress indicator would probably have to become asynchronous.

 _Just curious about PNGOUT - did you get permission to bundle it with your app? Their license<http://www.advsys.net/ken/utils.htm#pngoutkziplicense> seems pretty restrictive: "Redistributing, repackaging, or reusing the PNGOUT or KZIP executable is prohibited without the express consent of Ardfry Imaging, LLC, and a formal business agreement._

No I didn't, thanks for pointing this out. I'll remove it for now; didn't realize their license had that restriction. That's pretty lame :\\.

<comment><USER3> Could you not take the ffmpegX route and have the people download the pngout on their own? If they do not download it you can still make the program work without pngout but for the people that want the smallest filesize they can take the additional steps to download it and put it in the correct location.

Also, I think that having it finish quicker is >> correctly indicated timeline.

<comment><USER4> Alternately, just pop up a confirmation dialog stating "I hereby confirm that I am requesting of my own volition to download PNGOUT to aid the functionality of this program," and then download it automatically.

<comment><USER5> The license clearly specifies that "reusing" is itself not allowed without permission, so that doesn't change anything...his program still uses pngout without permission, and it's his (the programmmer's) use that is at issue here, not the end user.

</comment></comment></comment></comment></comment><comment><USER6> Nice app. I use pngout from the command line, so this might save me some typing.

Feature suggestion: Tell me which of the 4 compressors gave the best result.

Also, since the point of testing 4 png compressors is to get the smallest size possible, why not use "smallest" as the default setting?

<comment><AUTHOR> _Feature suggestion: Tell me which of the 4 compressors gave the best result._

This is a good idea, but I can't technically do this currently. The compressors are run one after another (it's essentially like "pngcrush infile outfile && optipng outfile && advpng outfile && pngout outfile"), so there is no real "best result", it just gets a bit smaller each time.

 _Also, since the point of testing 4 png compressors is to get the smallest size possible, why not use "smallest" as the default setting?_

That's a good point, I've just committed the change :)

Thanks for the suggestions!

<comment><USER7> Have you tested that the sequence is optimal? What if pngcrush changes the image in a way that will make on of the later steps miss it's most promising optimization? Oh the joys of combinatorial explosion...

</comment></comment></comment><comment><USER8> I compared ImageOptim and PNGSquash and PNGSquash made both files about 4KB smaller than ImageOptim did, both were using the highest optimization settings for smallest file size. I had PNGOUT installed too.

I like PNGSquash and I think I'll use it to optimize all my images. The only features I'd like included that ImageOptim does have are the ability to drag a folder into the window, so I don't have to pick out the pngs from a project I'm working on, and an auto-updater. Growl support would be nice as well.

For an auto-updater framework I like Sparkle a lot: <http://sparkle.andymatuschak.org/>

Also, I agree with weaksauce's comment, you could just have the user download and install pngout separately, just tell them to drag it to /usr/bin and look in that folder for it, that's the usual location for it anyways. ImageOptim does this already.

</comment><comment><USER9> Can we get something that works on linux or windows?

Although I guess I can just chain the 4 compressors myself on the command line...

<comment><USER10> Try using the <http://smush.it/> web app.

<comment><USER11> Give punypng a try as well... and make the world more puny.

<http://www.gracepointafterfive.com/punypng>

</comment></comment></comment><comment><USER12> I'd love to, but I can't:

\- You linked me to a source control repository instead of a product page.

\- There's a download button, but it seems to want to give me source code.

\- reading comments here, it seems that the source is actually only compilable on a Mac.

In short, you have not produced an App. Even if I wanted to use your product, and had the right system to use it on, I couldn't.

If you want this to be software the people use, you'll need to register a domain name and build a site for it. That site will need to describe what it does (which, incidentally, your github description fails to do), and provide me with a prominent Download button that links to an installer or at least an executable.

Once you do that, please post it back here, and I'll be happy to give you feedback.

<comment><USER2> _You linked me to a source control repository instead of a product page._

Have you never downloaded apps from SourceForge, Google Code, GitHub, etc? It's really not that unusual or difficult.

 _There's a download button, but it seems to want to give me source code._

No, the download button gives you PNGSquash.tar.gz, which contains PNGSquash.app, the application, not source code. Since you are opening it on an operating system other than OS X, it opens like a directory when double clicked. <http://en.wikipedia.org/wiki/APP_(file_format)>

_reading comments here, it seems that the source is actually only compilable on a Mac._

Yes, it is a Mac app - at the top of the page it says "Description: A PNG compressor app for OS X." And no, it does not require compiling if you download the binary (the huge "Download" link next to the logo).

 _In short, you have not produced an App._

Yes he has. Witness all of the comments from folks who have used it.

 _Even if I wanted to use your product, and had the right system to use it on, I couldn't._

You could learn to do it in a few seconds: [http://guides.macrumors.com/Installing_Applications_in_Mac_O...](http://guides.macrumors.com/Installing_Applications_in_Mac_OS_X#Application_Bundles)

 _That site will need to describe what it does (which, incidentally, your github description fails to do)_

Again, at the very top of the page: "Description: A PNG compressor app for OS X."

 _provide me with a prominent Download button that links to an installer or at least an executable._

That is already the case.

<comment><USER12> Try not to blame the messenger. He asked to have his application reviewed, so I reviewed it. That was my customer experience trying to download and install his product.

Here, for a counterexample, is the homepage for a different open source software product:

[http://www.mozilla.com/en- US/firefox/firefox.html?from=getfi...](http://www.mozilla.com/en- US/firefox/firefox.html?from=getfirefox)

You'll notice some key differences. That page describes exactly what the software does and how it will benefit me as a user. It includes a prominent link to an installer right off the page.

That's what the public face of a software product should look like. That's the message I was trying to convey to the original poster. Dropping potential users off at Github is a dead-end for most of them. An explanation as to why can be found here:

[http://www.kalzumeus.com/2009/03/07/how-to-successfully- comp...](http://www.kalzumeus.com/2009/03/07/how-to-successfully-compete-with- open-source-software/)</comment></comment></comment>


First time these Kenyan eight graders are seeing Apple photo effects - <AUTHOR> https://www.linkedin.com/feed/update/urn:li:activity:6558059135991193601 <comment><USER2> Haha</comment>


Entanglement: addicting js puzzle game - <AUTHOR> http://entanglement.gopherwoodstudios.com/

<comment><USER2> I'm using FF 3.0.19. For me, it puts up the "Loading" screen, plays music and just sits there. Anything special required?

<comment><AUTHOR> Any webkit based works perfectly. Opera and Firefox 4 beta works too

<comment><USER3> Firefox 3.6 too.</comment></comment></comment>


Everything's broken and nobody's upset - <AUTHOR> https://www.hanselman.com/blog/EverythingsBrokenAndNobodysUpset.aspx <comment><USER2> As someone who has been decrying the continual decline of software quality for about 10 years now, I can say that at least one person is upset.

</comment><comment><USER3> (2012)</comment>


EU funds open source language Scala  - <AUTHOR> http://www.h-online.com/open/news/item/EU-funds-open-source-language-Scala-1170222.html

<comment><USER2> How nice for the researchers in Lausanne - especially since Switzerland is not even part of the EU.

<comment><USER3> We're probably world leaders in cherry picking. Sorry about that.

EPFL is a quite international school though, the borders get very blurry around Lausanne and Geneva.

<comment><USER2> No need to be sorry, we're all going to profit when a free software project receives funding.

</comment></comment></comment><comment><USER4> What sort of features have they agreed to further implement or refine? I suspect something like this is in their grant contract.

Note that, like all EU money, the Scala people will have to fund themselves and then a year or so later would they actually see the check.

<comment><USER5> It has to do with making parallel programming more palpable. See <http://lambda-the-ultimate.org/node/4178>

<comment><USER6> The article says this: "A paper by Odersky states that the EU funding will mainly be provided for the definition of domain-specific languages (DSLs) in libraries." and refers to this blog post: <http://www.scala- lang.org/node/8579>

Is that the same thing?

<comment><USER5> I do believe so as the technique that Scala seeks to utilize to tackle parallel programming _"is to use "language virtualization", combining polymorphic embeddings with domain-specific optimizations in a staged compilation process."_.

\</comment></comment></comment></comment><comment></comment><comment>---

This thread's article has:

 _"Over the next five years the group of developers working at Switzerland's EPFL (École polytechnique fédérale de Lausanne) will be receiving €2.3 million from the European Research Council."_

The LMTU thread links to the blog post you mention above which contains:

 _"The Scala research group at EPFL is excited to announce that they have won a 5 year European Research Grant of over 2.3 million Euros to tackle the "Popular Parallel Programming" challenge. This means that the Scala team will nearly double in size to pursue a truly promising way for industry to harness the parallel processing power of the ever increasing number of cores available on each chip."_

Basically they all point to the same place.

</comment><comment><USER6> I hope the money does not come with too many strings attached in terms of reporting requirements and so on.

2.3 million euros is pocket change for the EU but for Odersky and his team it is a very large sum of money to be able to use to expand their team and to put more power behind the scala effort.

</comment><comment><USER7> This is great! Fantastic to see government get behind innovation like Scala.</comment>


The potential risk to ZFS created by the shift in its userbase - <AUTHOR> https://utcc.utoronto.ca/~cks/space/blog/solaris/ZFSUserbaseShiftRisk <comment><USER2> The nail in the coffin was Delphix switching away from Illumos for similar reasons the author cites in another article. As they drive most of the complex feature development directly with staff developers, and by virtue of having Matt Ahrens on staff drive a lot of the leadership and organization of ZFS, it makes sense to follow their lead as the repo of truth and lower the barrier to entry (illusions-gate wasn't working out).

Since FreeBSD support is going to be merged directly into the ZoL repo, ZoL devs will see the FreeBSD CI build results and it will be a lot closer to a unified upstream than the past. Being a downstream instead of integrated into the source of truth made feature development a laborious two way sync and communications were spread over many mailing lists and bug trackers. I think this move will be good for both communities, companies like iX Systems will help get trim across the finish line in ZoL.

In terms of shifting userbase, FreeBSD might even win in terms of ZFS revenue or other metrics like shipping systems due to FreeNAS (would have to spend a few hours researching the ZoL companies business models since a lot of the work is subsidized by the US Government via LLNL). I don't think there will be any tectonic shifts in userbase, there are still pros and cons to both Linux and FreeBSD in different areas and being behind in ZFS wont be wont be a con for either now.

<comment><USER3> >I don't think there will be any tectonic shifts in userbase

Unrelated to this post, I'm quite interested in knowing how Canonical's move has worked out so far. Does anyone know if they've got customers at any meaningful scale who are using ZoL ? Or is Canonical contributing to ZoL ? There may not be an immediate shift in userbase, but Canonical can certainly make a more comprehensive bid to future customers with their overall offering that also includes ZoL, compared to a specialty storage provider that supports ZFS on FreeBSD.

<comment><USER2> I think it has mostly lowered the barrier to entry for Linux users already interested in ZFS, which is a good thing for user experience, but I haven't seen Canonical driving any feature dev and they aren't doing extensive backports or uplifts into their LTS distros to stay current with ZoL AFAIK. If they wanted to monetize it better, they could do a spin for the SOHO market that either helped replace proprietary filers the same way FreeNAS does, or highly integrate it into their private cloud stack.

</comment></comment></comment><comment><USER4> How real is the risk?

ZFS on Linux is loaded via DKMS. DKMS is basically the compile-from-source alternative to binary blob drivers. Is there a reason to believe that ZFS via DKMS is materially different, legally, to Nvidia drivers being loaded via binary modules?

Indeed it appears that Nvidia proprietary drivers these days go via the DKMS route. Are they also at risk?

<comment><USER5> The risk is in trying to keep compatible with the Linux Kernel, when not part of the Linux Kernel dev team.

If ZFS was a module within the Linux kernel source tree, Linux kernel devs would keep it in mind when making changes to the Linux kernel's APIs. They wouldn't make potentially breaking changes to that API, or replace APIs with ones that can't be made compatible with ZFS at all, without considering the effect it would have on ZFS. The Kernel devs have to take the whole tree into account, including all the modules.

But since ZoL is not part of the kernel, and is instead a separate independent module that gets loaded into the kernel, the ZoL have to play catch up. Instead of Kernel devs working with them to make sure things stay compatible, or giving them a heads up when something needs to be changed for a new version, the ZoL team is on the outside, trying to make sure they don't get boxed out of the Kernel API.

It can be a tenuous position to be in. For a more everyday example, look at the Firefox and Chromium browser updates. For Firefox Quantum they completely revamped their extensions system, making all existing extensions worthless. Either the extension devs rewrote them with the new API, or the extension is just gone. Similarly Chromium is changing its API for how extensions can interact with the DOM and networking, which would make Ublock unusable. If these features were officially part of the browser or official extensions, the browser devs would work with the extension devs to make sure things stayed working; instead the extension developers need to keep up or watch their product die.

If the Linux Kernel completely changed its module API, and ZoL was caught flat footed and needed to make substantial rewrites, what would the projects backers do? Would they commit the dev time and resources needed to make those changes, or would they compare the benefits of ZFS vs the competition -- solutions based on btrfs or LVM, both built into the kernel -- and decide to jump ship before committing more time? That's where the danger really lies. If the Linux Kernel makes a serious breaking change, ZoL's supporters might double down to fix it, or they might just cut their losses.

And while there is an official way to integrate external filesystems into the Linux kernel, FUSE, it's extremely slow compared to Kernel native modules. There was a userland FUSE implementation of ZFS, and there's a reason it's fallen out of favor. ZoL is significantly faster because of its direct kernel extension, but it's playing with fire by not being part of the kernel tree itself.

<comment><USER6> >ZoL was caught flat footed

Which would essentially be impossible.

OpenZFS is designed in a way that uses a shim layer between ZFS's internal Solarisish API usage and the native OS's usage This allows the same ZFS code to run essentially unmodified on many *nixes without major changes.

In ZoL, this is called SPL (Solaris Porting Layer), and is one of the two kernel modules required to use ZoL. Linux does not export the proper APIs that ZFS requires to work here, and SPL fills that gap.

ZFS modules do "break" often due to internal API changes, but the fix is usually shipped in ZFS stable before the kernel itself is shipped. Only people who follow ZoL development closely ever see the sausage being made.

It is highly unlikely that Linux can ever do anything that ends up with a situation that the SPL and ZFS kernel modules can't easily #ifdef their way out of. It wouldn't make sense for Linux to, either.

<comment><USER7> > ZFS modules do "break" often due to internal API changes, but the fix is > usually shipped in ZFS stable before the kernel itself is shipped. Only > people who follow ZoL development closely ever see the sausage being made.

Eh, it depends on the distribution. I use Fedora, and there have been quite a few times when a kernel update has resulted in ZoL becoming useless for a while until they push an updated version. The solution, of course, is just booting the earlier kernel until ZoL catches up.

In fact, this is happening right now. The 4.20 kernel was pushed to updates on Fedora (at least my system) on 1/23\. The latest stable ZoL doesn't work with it. They're on RC3 for the next release, though, and that does. Hopefully it comes out soon.

In the mean time, I'm running the last 4.19 kernel. _shrug_

<comment><USER8> > I use Fedora, and there have been quite a few times when a kernel update has > resulted in ZoL becoming useless for a while until they push an updated > version.

Alternatively, you can use the variation of a distro, if it exists, that provides a more stable kernel and package version set. In this case, that would be RHEL/CentOS.

For a workstation, that can be annoying, but as you said, just use an older kernel for a bit longer. Perhaps mark it as to be skipping in normal package operations, and have a cron job that runs to check the kernel specifically and emails you if there are updated versions of the kernel that exist.

For a server, I imagine it's rarely a problem since those should be running more stable distros anyway, since 99% of the time the kernel is older and back-patched (it _may_ be the current kernel, but still weeks after it was released right at point release updates), which should result in a stable API for ZoL.

The trade-offs there don't seem too onerous to me. A little hand configuration for a workstation (of which there's likely one or two for a person to deal with as long as there's smooth server support which is generally both more important to have solid because it can be harder to fix if there's a problem and because it can scale from none to many per person.

<comment><USER9> How does RHEL help there? They ship kernel updates. Those kernel updates once broke HP b120i properietary driver (HP releases new version of this driver for every minor RHEL release). I don't see how fakeraid driver is fundamentally different from ZFS.

<comment><USER8> Kernel updates are back patched. That means that in-between point release updates (which generally happen every 6-12 months) the kernel version stays the same, and any bug-fixes are ported into the older kernel that is shipped. Point releases _may_ update the kernel version (I think?), but generally keep it the same as well, but they will back port some features into the older kernel as well, not just bug/security fixes. You can see here[1] for RHEL versions and the kernels they ship with.

If a security fix breaks your ZoL integration, my guess is you're actually better off waiting for that to play out and resolve itself than to expect it to work. If a feature back port breaks it, that might be a little more annoying, but I imagine it will be fixed in short order, and you only have to worry about that once every 6-12 months (and it's well publicized).

> Those kernel updates once broke HP b120i properietary driver (HP releases > new version of this driver for every minor RHEL release).

If HP is releasing closed source drivers for RHEL, I imagine they would want to be on the certified hardware list and test, or at a minimum seek access to the beta spins of the point releases (which I think is where it broke) so they can test before it comes out. I'm not sure I blame Redhat for HP trying to specifically support RHEL and failing to do so, given the systems I know they have in place to help companies in just that situation (because it helps RHEL users).

In any case, all I'm really noting is that between Fedora, which ships a new kernel version every kernel update (AFAIK) and RHEL/CentOS, which ship larges the same kernel with only the specific changes needed the majority of the time, keeping ZoL working should be vastly easier on RHEL systems (and in fact, any OS which does back patching of kernels, which I believe includes SuSE and the LTS releases of Ubuntu).

1: [https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux#RHEL_...](https://en.wikipedia.org/wiki/Red_Hat_Enterprise_Linux#RHEL_7)

<comment><USER9> It's not really the same kernel. They backport a lot of features with every minor release. They still call it 2.6.x or whatever, but it really is different. I know that RHEL has some subset of internal kernel API that they promised to keep stable within major release, so if HP failed to rely on those API, it's their problem, but it might happen.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER10> Speaking of all this, am I the only one where NFS clients with executables on NFS (such as PXE booted machines) get bus errors when the server runs recent 4.19/4.20 Linux kernels with recent ZoL code?

As a reminder, those bus errors are supposed to happen when a client-side mapped file has been unlinked on the server. So the ZFS export does not provide pages to the client on a client page fault the same way NFS would on deletion. Tried dedup and compression on and off, no change. A reboot of the server clears it up for a couple of days, but then it starts the same way. Something seems very broken in caching there.

This popped up during maybe the last 4-5 months.

</comment><comment><USER11> Interesting article. So is the "unfriendliness" of Linux kernel developers towards ZFS that is mentioned strictly due to licensing issues or are there other points of contention?

<comment><USER12> BTRFS is being positioned as an alternative to ZFS (amongst others) without the licensing issues (and less rational concerns like the current/past politics of it all), so perhaps there is a "why do we X it when Y is close" with a bit of extra NIH syndrome mixed in?

<comment><USER13> Isn't btrfs also at risk? I was under the impression that it lost some steam in the recent past and was on its way to become the next Hurd.

<comment><USER14> btrfs has a problem with it's image as being unreliable (some well deserved). Redhat obsoleted it, because they use kernel 3.10 in RHEL7 and they were doing nothing but backporting, without having any btrfs expertise in house anyway. Btrfs continues to be developed by Oracle, Suse, Facebook, Fujitsu and the rest of the usual suspects.

<comment><USER15> RHEL is famous for using kernels that are _ancient_ , even by the notoriously conservative and risk averse debian-stable standards.

I can't even imagine the hassle of backporting stuff from much newer kernels into 3.10 to make btrfs work.

If you want to use btrfs in production (not the best idea, IMHO, but orgs such as facebook do it) you absolutely need to be running a 4.9.x or better kernel.

<comment><USER16> Calling them ancient is a bit unfair, they regularly backport hardware support and select other features from newer kernels. Unlike other distributions, however, they have a stable kernel ABI for an entire release, so they can't bring in changes that break white listed symbols.

</comment></comment></comment></comment></comment></comment><comment><USER17> Zfs is very modularize. Most of the platform specific code is in SPL. Don't think this would affect freebsd

</comment><comment><USER18> I would speculate part of Java's success is due to being available but not deeply integrated on Linux-based OSes, for similar legal reasons. As with ZFS, it became very easy to upgrade your version of Java without having to go through an upgrade of the whole baseline OS (which was often the natural path if you wanted to use a new version of, say, Python).

Of course ZFS has a lot more potential to be broken by kernel updates than Java, but the parallel is interesting.

</comment><comment><USER19> Why was CDDL chosen for ZoL?

<comment><USER20> ZoL was forked from Oracle ZFS, if you want the real answer you need to ask Oracle, presumably it was so that ZFS would be incompatible with their competition (Linux GPL based work)

<comment><USER21> Even before Oracle, Sun had licensed it as CDDL. So Oracle itself may not be able to answer that question anymore.

<comment> yc-kraln CDDL includes patent grants which GPL (et cetera) does not. CDDL allows also file-based licensing, which allows for projects with combined free/nonfree sources to be distributed, which was a requirement for Solaris. It's not that they chose CDDL to make it not work on Linux, they created CDDL because they didn't have a choice.

<comment><USER22> Sun created CDDL in order to be Linux GPLv2 incompatible, even the person who was tasked by Sun management to write CDDL (Danese Cooper) said so.

And it's not as if that admission was needed, as anything else would have been insane from Sun.

They were losing badly to Linux, so in the eleventh hour they decided to go open source in an attempt at getting more mindshare = marketshare.

Solaris had some real technical advantages over Linux like ZFS and DTrace, however if they licensed Solaris with a GPLv2 compatible license, Linux could just incorporate their coveted tech, which would be business suicide. Hence CDDL.

You can't blame them given the situation they were in.

</comment></comment></comment></comment></comment><comment><USER23> Speaking of filesystems- is there one that allows me to add tags? Or alternate streams (like NTFS does), so I can add my own tagging system on top?

<comment><USER24> As someone who has spent a lot of time on this problem: you don't want to store tags as attributes/resource forks/streams/etc in a traditional filesystem. The single most important characteristic for a tag-based organization system is that search operations must be extremely fast and cheap. Walking a hierarchical filesystem and stat'ing a bunch of files to discover their tag information is anything but cheap.

What you want is to store the tag metadata heap in an easily indexed structure (i.e: a search tree.) That heap then just contains pointers into content addressable storage. You can kind of build such a thing on top of existing filesystems which support hardlinks, however I'd advise against that for the metadata itself. Once you have the power of tagged content a natural evolution is querying that data using set operators. You will inevitably re-invent (some approximation of) SQL once you arrive at this discovery.

<comment><USER25> It might still make sense to keep the canonical metadata in xattrs so that tools can interoperate on it and build a search index from it when you actually need to do search.

On a NVMe drive rebuilding the search index shouldn't be too costly, even on hundred thousands of files.

I think there were also some ioctl additions for btrfs that let you sequentially walk the filesystem by extents or inodes instead of by directory tree, which makes indexing a lot easier.</comment></comment></comment>


Kinesis Ergo Keyboard Advantage 2 Available - <AUTHOR> The original Advantage keyboard saved my career 25 years ago, so I feel obliged to tell everyone I know about them. :)<p>https://www.kinesis-ergo.com/products/#keyboards-section <comment><USER2> Is there a way in which the Advantage 2's better than the original?

<comment><AUTHOR> It looks like they have better function keys, more programmability, and a "low force" version. Also a version with Qwerty/Dvorak switching.

<comment><USER3> There's a LF version of the original as well (I have it).

I think the main advantage is they replaced the horrible squishy row of function keys with mechanical keys. I'm sure there's a lot of internal/firmware changes or whatever too.</comment></comment></comment>


Show HN: I hacked my microwave with a Raspberry Pi - <AUTHOR> http://madebynathan.com/2013/07/10/raspberry-pi-powered-microwave/ <comment><USER2> Brilliant! Having suffered an expensive microwave with a dreadful UI - I love this concept.

<comment><USER3> Assuming this isn't a troll, I'm curious -- how dreadful can microwave UIs actually get?

<comment><USER4> As an example, amongst the buttons on our old microwave:

* a picture of a whole chicken

* one ice cube

* two ice cubes

* something that might have been a burger or a slice of bread

* 3 x straight lines

* 3 x wavy lines

Never being sure, I ignored all of those buttons. But even the basic 'set a time, a power and go' method was awful.

* Choose a power. There was no default. You had to do this _before_ you'd set the time, or the time would reset back to 0.

* Turn a wheel which increases the time. The first two minutes increment 1 second. After that they increment in 10 seconds. So to get to 5 minutes, you had to spend ages turning it.

* Press 'Go'.

Next to the 'Go' button there was a 'Cook' button, which reset everything.

There was a defrost mode, which seemed to heat the contents for 2 minutes and 10 seconds (couldn't change the time). The results were identical to just heating it on full power.

<comment><USER5> As someone with a passion for good UI, this is infuriating. We've had microwaves for 50 years; their UI should be solved by now. After a half- century, we should have a standard set of controls that are simple, intuitive, efficient, and forgiving.

Instead, we all have stories like this about microwaves with dials, modes, stages, levels, pre-programmed jobs, and recipe databases, but that lack a simple way to microwave something for 30 seconds!

I assume this is because every microwave designer wants to invent some new feature they can tout on the box. I have often fantasized about enacting a law that requires designers of new interfaces to be forced to use said interfaces in their personal lives for a month. Hopefully this would promote better design; alternatively, it could be used as a form of penance.

<comment><USER6> I think that the best microwave UI is just two analog knobs. One for power level (although it would be nice to get rid of this as well, but some packaged foods ask to be cooked at 50% power for part of the time), and one for cooking time which also starts the cooking if the door is closed. Turn the nob to whatever time you want and it starts cooking. If you want to stop cooking before time is up, you can either turn it back to 0 or just open the door.

<comment><USER7> Oh, the dials would drive me crazy.

The best microwave UI I've used has several functions above the number pad, all of them completely optional. Typing a time on the number pad and pausing made the microwave start -- to rephrase, if you press _4 5_ and didn't press anything for 3 seconds, the microwave would begin and operate for 45 seconds. Pressing _1 3 0_ and walking away would run it for 1 minute 30 seconds. When it was done it beeped 3 times, then once every 10 minutes, until you open the door or press a button. At the bottom was a _Power_ button which you could press to change the power level at any time, and a _Start / +30 sec_ button which would add 30 seconds to the amount of time on the timer. And if the clock wasn't set, it would just display 00:00 solidly, not blinking.

Maybe this is a mis-remembered mix of the best UI elements from several microwaves, but to me it's ideal.

<comment><USER6> The only downside I can think to that is what if you make a typo? "Stop/Clear" I assume?

<comment><USER8> No typos. This is a high stakes microwave.

</comment></comment></comment></comment></comment></comment></comment></comment><comment><USER9> > _Can use a barcode scanner to look up cooking instructions from an online > database_

> _There weren 't any online microwave cooking databases around, so I made > one_

Brilliant.

</comment><comment><USER10> These guys are building a machine that can cook recipes from fresh ingredients:

[http://everycook.org](http://everycook.org)

<comment><USER11> Awesome. I was thinking the other day that an automated kitchen should be entirely possible.

You buy groceries, place them in their designated slots in the fridge. Robot arms know which slots hold each ingredient, and can measure and cut appropriately (using scale, food processor, and maybe some other specialized cutting appliance for trickier items). Stove top is easy to control and pans are all lined up for the robot arms to repeatedly grab. Most recipes could fit within this somewhat limited set of "building blocks" that the kitchen robot could easily perform: measure 8 oz of tomatoe, dice onion, boil pasta, slice chicken breast into strips, pour 2 oz of oil on pan, etc. The hardest part might be washing the dishes.. Heh

<comment><USER12> > _measure 8 oz of tomatoe, dice onion, boil pasta, slice chicken breast into > strips, pour 2 oz of oil on pan, etc._ //

Surely you have the industrial machines do the pasta sauce in a factory, so no need to measure tomatoes and dice onions. Similarly the chicken breast can be cooked and pre-sliced (or cubed).

The greatest problem I foresee with this is maintaining hygiene. The machine will slop and mess, eg pouring ragu, cooking with oil that splatters. Those surfaces will need cleaning and ingredients that spoil readily (fresh diced chicken) will need disposing of and replenishing regularly. It certainly doesn't seem impossible but each section would need specialised washing equipment it seems, or maybe be entirely submersible and so allow the machine to be flushed from the top and then have a steam wand clean the individual stations.

I see it working for making dishes in an automat ([http://en.wikipedia.org/wiki/Automat](http://en.wikipedia.org/wiki/Automat)) but not really being efficient enough for a domestic situation.

Perhaps a digester for the expired foodstuffs and left overs could be built in to generate energy for heating and cooling required in the machine?

</comment></comment></comment><comment><USER13> Amazing, wish I could do things like this. I bet if this was made by a common microwave manufacturer, it'd be advertised as the microwave of the future and cost $3500!

</comment><comment><USER14> Very cool project, but I would imagine that an internet connected microwave might result in these headlines:

"Apartment complex burnt to the ground by toddler with iPad"

"Chinese hackers crash US power grid using Microwave exploit"

NFC or Bluetooth control might be better suited for this than full web connectivity.

</comment><comment><USER15> Before you think about opening up your own microwave, you should know that microwaves contain high voltage capacitors that will seriously shock or kill you even when they are unplugged. I knew a guy who got thrown across the room and was in serious condition for months. He didn't even touch anything, but he was wearing a wedding band and his hand got too close. Microwaves are serious business.

That said, I HATE the UI on my microwave & would love to fix it. Do people really eat that much popcorn that it deserves it's own button??? For me, I want exactly 3 controls: a time wheel, power up/down & a start button. Hit start for a quick minute, twice for 2 minutes, etc.

<comment><AUTHOR> Yep, I was very careful about the high-voltage capacitor. I made sure to unplug it whenever I removed the microwave case. That's a crazy story about the guy, I hope he's doing better now.

</comment></comment><comment><USER16> This is a great idea. One thing I would like to point out is that microwaves come in different power levels. A large one may be 1200W while a small dorm microwave may be 750W. The cooking instructions in your database will need to account for this.

<comment><USER17> Also, some microwaves are continuous power (magnetron always running) and some cycle on/off instead. Based on my struggle to find a continuous power microwave for a Senior Design Project (disposing of toxic compounds in standard microwave oven, I can't imagine this will effect too many models, but cycle times do differ between microwaves.

The Raspberry Pi microwave is awesome, though I do wonder why the 1 second buttons exist.

<comment><USER18> > I do wonder why the 1 second buttons exist

Ever tried to soften a small piece of cold butter? 10 seconds is way too long for that

<comment><USER19> Wouldnt hitting "4" and "start" be almost as fast? Unless you eat an absurd amount of butter I don't see how much time it could possibly save someone.

</comment></comment></comment></comment><comment><USER20> Very nice project.

One thing that it seems to miss (that all microwaves that I know miss) and that would probably be very easy to implement is a mute button for late night snacks.

<comment><USER21> Along with that a way to shut the door quietly. Maybe newer ones are better but all the microwaves I've used sound like they are being slammed no matter how you shut the door.

<comment><USER22> Like those fancy kitchen drawers that you can't slam. They slow down to a satisfying glide at the end.

</comment></comment></comment><comment><USER23> I like the new control pad definitions.

One of the problems I have with GE microwaves is that the number pad isn't always for entering time - if you touch "2" in preparation for entering 20 seconds, you get programmed time #2. Unless you hit the "Time" button first... Bad design, General Electric.

<comment><USER24> I think the GE ovens with the "express cook" feature (e.g. press 1 for 1 minute, 2 for 2 minutes) expressly show that right on the keypad. Or at least they do _now_.

Example: [http://www.plessers.com/photos/p/00027/279032.jpg](http://www.plessers.com/photos/p/00027/279032.jpg)

</comment></comment><comment><USER25> Missed opportunity to use phrase "Raspberry Picrowave"

<comment><USER26> That's the name of the project: [https://github.com/ndbroadbent/raspberry_picrowave](https://github.com/ndbroadbent/raspberry_picrowave)

</comment></comment><comment><USER27> This was a fantastic article and a wonderfully complete software and hardware task spanning many disciplines. Nathan's done a great job on this. I'd love to hire him.

Circuit design, soldering, graphic design, firmware and even a standalone website.

If you've worked on electronics and software projects like this please give me a call (details at [http://gridspy.com](http://gridspy.com)) because we need you.

</comment><comment><USER28> There are 4 really bad ideas from the article:

      1. Clock is automatically updated from the internet

      2. The microwave has a web page so you can control it
         from your phone (why not), and set up cooking
         instructions for products

      3. Tweets after it's finished cooking something

      4. Can be controlled with voice commands ∗∗

         ∗∗ ...not that bad, but subject to pranks and false positive
                microwave commands, from people in the same room

This is all _REALLY_ bad from a safety perspective. Exposing household appliances to the wilds of the internet is all kinds of dangerous. You shouldn't advertise that this is a good idea, and leave readers with the assumption that maybe it's password protected or maybe not (it is: [http://www.microwavecookingdb.com/products/new?upc=871100027...](http://www.microwavecookingdb.com/products/new?upc=8711000279571)), or maybe it's wrapped up in TLS/SSL and maybe not (it's not: [http://www.microwavecookingdb.com/users/sign_in](http://www.microwavecookingdb.com/users/sign_in)). Is the internet control framework just security by obscurity, operated by arbitrarily obscure URL parameters? Who knows? Maybe? (here's the code: [https://github.com/ndbroadbent/raspberry_picrowave](https://github.com/ndbroadbent/raspberry_picrowave)) I mean, yeah it's just a DIY project, but immediately, I see some opportunities to wreak havoc.

First of all, it's not merely polling an internet time server, but that's one port exposed to the internet, that anybody can just start dumping malicious payloads on. Second, and worst, it can be switched on from the internet. Third, it gives feedback that can be accessed by the entire internet, tells the internet what it is, and what it's doing, right now in real time, allowing an attacker to monitor the success of malicious efforts. This way, you'll know as soon as you're able to send a command to power up the microwave for one second, to test and prove the ability to control it.

People will attack these kinds of openings, just for the sheer amusement of running up a total stranger's electric bill, nevermind start a fire. This article seems relatively smart and competent, and so maybe we should ASSUME that proper security exists?

This is the kind of design inspiration that's going to encourage some other engineer (or worse, an MBA in charge of some stupid startup) to go out and expose the electric grid to twitter with some poorly tested SCADA system, and on a dark, stormy night, in the far flung future, I'm going to be eating cold beans from a can, in the dark, because of it.

<comment><USER29> > This article seems relatively smart and competent, and so maybe we should > ASSUME that proper security exists?

Or, maybe the guy just likes playing around with electronics for fun? Perhaps he doesn't really consider this a production ready appliance and just wants to share his hobby with the world.

If everyone adhered to your cautious approach no experimentation would ever take place as all new things carry risks and lessons to be learned. You can't always nail it first time round, you have to make mistakes to make progress. And there is absolutely nothing wrong with sharing your experiments.

> This is the kind of design inspiration that's going to encourage some other > engineer...

This makes me think your whole comment is just trolling.

<comment><USER30> > This makes me think your whole comment is just trolling.

The user name kind of gives the game away

</comment></comment></comment><comment><USER31> Great project! I would have suggested FoodEssential's API for preparation instructions (ran into them at SXSW, seem really cool), but they don't have prep, only ingredients and nutritional data. [http://developer.foodessentials.com/](http://developer.foodessentials.com/)

<comment><USER32> Hey, I live in St. Louis and won the National Day of Civic Hacking with one of the Food Essentials devs, Henry. Nice guy! They had one of their Solr queries printed and hung on the wall... crazy awesome stuff.

</comment></comment><comment><USER33> This is fantastic. I love how the Raspberry Pi is getting used in hardware hacking so much. It's ideal for it.

So far my efforts have been limited to hacking electricity and gas meters but this microwave is much more complex. I gave a talk on this last night at the HN London meetup. Slides will be online at [http://unop.co.uk/dev/raspberry- pi-electricity-monitor/](http://unop.co.uk/dev/raspberry-pi-electricity- monitor/) soon. The videos will be online soon too I hope.

</comment><comment><USER34> I'm surprised there's still so much manual entry going on for people with microwaves. I guess my needs are much simpler than for most. 70% of my microwave needs are met by just pressing the "Heat/Start" button and letting the microwave auto-heat to 75 C. 20% are met by just pressing "Defrost" then "Heat/Start". It's quite rare I actually need to set the time manually (it's basically only for popcorn...)

</comment><comment><USER35> A lot of fun, but one of the primary issues with smart appliances is you end up having to physically interact with them anyway. It's almost more of a hassle to physically load up the microwave, give a voice command and then physically open and remove what you cooked then to just do the whole thing right there.

The Jetsons-eque toaster oven still requires you to put the bread in.

<comment><USER36> I tend to think of this as integration stinking right up until it doesn't.

I suppose another way to put it is that "these things can work together" is far worse than "these things work together".

</comment></comment><comment><USER37> Being able to scan a barcode and know how long food should be cooked for? It just makes sense and I wonder why it hasn't been thought of before. I think this is a genius hack and definitely the scanning of a barcode for cooking times makes sense, this guy should definitely pitch it to the likes of Samsung.

</comment><comment><USER38> This is an awesome project. But by far this is the most amazing and innovative part of the article:

> If cooking instructions are posted for a 1000W microwave, you can request > the instructions for a 700W microwave, and the cooking times will be > automatically adjusted

</comment><comment><USER39> Unfortunately this idea was patented 13 years ago:

[http://www.google.com/patents/US6124583](http://www.google.com/patents/US6124583)

Makes you realize why there are no commercial implementations of this and why patents are terrible.

<comment><USER40> At least it expired 9 years ago.

</comment></comment><comment><USER41> I saw the post that inspired this project on /r/CrazyIdeas too. Very cool to see how you've implemented the idea! If I ever get my hands on a Raspberry Pi, I'm going to have to try this.

</comment><comment><USER42> Thank you for this! It's about time someone disrupted the microwave.

<comment><USER24> The problem with appliance design is that people _think_ they want and need all these features, but they never use them.

Appliance makers sit around all day thinking of new ways to entice people to buy new appliances, but in reality they know that the complexity comes back to bite them eventually and the majority of users just use the microwaves for heating water and making popcorn.

This whole "scan the UPC" thing? Not disruptive. It's been done before:

[http://www.smarthome.com/13041/Beyond-Microwave- Oven/p.aspx](http://www.smarthome.com/13041/Beyond-Microwave-Oven/p.aspx)

So the question is, do you really need disruption in this area? Are people really clamoring for an easier way to heat up their Lean Cuisine even though all they really need to do now is push the "4" button?

<comment><USER30> Heating water in a microwave? I've never known anyone do that in the UK. Is that an American thing because you don't have kettles?

</comment></comment></comment><comment><USER43> If you're not planning on marketing this, please share your process. I'd love to give this a try (if I can get my wife's permission... _crosses fingers_ )!

<comment><USER44> A substantial amount of detail is provided in the linked article...

</comment></comment><comment><USER45> Don't you have to get up and stir every once in a while?

</comment><comment><USER46> Awesome job! This goes above and beyond for a 'hack'. You should have it upload cooking data to Xively so you can keep track of what you cooked over time.

</comment><comment><USER47> Another consumer tech suggestion culled from reddit: my TV should have a button on the side which causes the remote to emit some kind of noise so I can find it.

<comment><USER48> I'm pretty sure that this has been independently rethought up many times since the creation of the untethered remote, long before reddit.

<comment><USER24> Indeed: [http://www.youtube.com/watch?v=4cPxSk3uIvk](http://www.youtube.com/watch?v=4cPxSk3uIvk)

</comment></comment></comment><comment><USER49> This has to be the coolest use for a Raspberry Pi I've ever seen. I honestly wish I had the skills to make this happen.

</comment><comment><USER50> Interesting that the redesigned touchpad was designed (subconsciously?) taking cues from bootcamp css...

</comment><comment><USER51> See you CAN run Linux on a microwave. If only somebody can get it to run on a toaster...

<comment><USER12> With a voice synthesiser:

"Would you like a waffle?"

</comment></comment><comment><USER52> Really great project, and well documented too!

</comment><comment><USER53> Awesome!

</comment><comment><USER54> brilliant</comment>


Zapcc 1.0 now available – A (Much) Faster C++ Compiler - <AUTHOR> https://www.zapcc.com/ <comment><USER2> As far as I could tell, not actually a faster compiler, but a heavily caching one. Can also be useful, but not exactly the same thing. (Now tcc is a _faster_ compiler, though alas not generally applicable...)</comment>


Ask HN: What can employers monitor while you work from home? - <AUTHOR> It occurred to me that the only employer provided equipment that I use for work is my laptop. The monitor and peripherals are all mine.<p>Can an employer use my webcam and microphone to monitor me or my activity? Can they log keystrokes typed on my keyboard? Can they do all of this through the internet service that I pay for? And should they be able to do all or any of this? <comment><USER2> > And should they be able to do all or any of this?

Personally, I don't think they should which is why I wouldn't work for anyone who tried to enforce this. It would be a massive red flag if an employer brought this up. Also, the companies that manage remote well know this and none of them are implementing invasive monitoring. The ones that try it are a small number of short-sighted old-fashioned shops that feel like they're losing control if an employee is remote and are desperately tring to gain that control back.

</comment><comment><USER3> It varies hugely, and is often more than is obvious.

Logging keystrokes and webcam monitoring is at the extreme ends of the covert/overt spectrum, and the trust/control spectrum. Perfectly possible, illegal in many countries, and betrays a lack of trust in employees (in most cases) that likely means the company has a rather toxic environment. There are some very unpleasant examples of this out there, not only for employees but also students using school-issued equipment.

In a much more subtle example, a company which provides their own DNS infrastructure can effectively monitor internet activity on company endpoints without relying on a proxy, and without the conscious awareness of most employees.

</comment><comment><USER4> We ask employees to install a monitoring agent based on OSQuery for compliance reasons. It does very little. It queries (read-only) OS meta details about whether or not they're using antivirus (true/false), have a password manager (true/false), the HD is encrypted (true/false), whether or not location services is active (true/false) and a list of applications. I think this is pretty typical. Some companies might go deeper, but I think we're in the norm.

<comment><AUTHOR> Do managers or HR personnel have the ability to dig deeper?

<comment><USER4> Nope

</comment></comment></comment><comment><USER5> I worked as a partner to a tech giant who had some security requirements, where they'd only release code to us if all the people with the code met certain requirements. It was a day-long security audit and there were several pages of checklists.

What I commonly see is them monitoring all data going in and out, especially through USB drives. Rival services like Google Drive are often blocked. I wouldn't be surprised if some have a kind of analytics but it's unlikely. I doubt webcam and microphone are used to monitor activity unless you're working somewhere like Facebook.

</comment><comment><USER6> They certainly CAN monitor all of this.. but a lot of them don't. I don't think it really matters if the mouse or something is yours, it's really about the computer itself. The policies and practices vary between companies. Are you suggesting there might be an issue because they are 'using your resources' to do this?

Would be interesting to see the liability a company opens themselves up to by monitoring an unaware employee with a webcam while they work from home though!

<comment><AUTHOR> > Are you suggesting there might be an issue because they are 'using your > resources' to do this?

Not suggesting, but asking. It certainly feels invasive to me, though.

</comment></comment><comment><USER7> Depends who your employer is, there are varying levels of remote monitoring & administrative tools. Smaller companies are likely to invest less in this due to limited resources, where larger companies may invest more heavily for compliance and security.</comment>


Show HN: The dht(distributed hash table) network crawler - <AUTHOR> https://github.com/NanYoMy/DHT-simDHT

<comment><AUTHOR> Hey guy, This piece of python code is holy simple. it could find all the Magnet linker in DHT network. engjoy it!</comment>


E-mail didn't really evolve since Gmail. Why is it so hard to innovate? - <AUTHOR> http://blog.frontapp.com/why-is-it-so-hard-to-innovate-in-the-e-mail-space <comment><USER2> I don't think the premise is right. From the beginning to now, Gmail evolved quite a bit. For one, they used their analytical knowledge to prioritize emails, which I found to be very helpful. Two, they started filtering newsletters and advertisements automatically. Third, the UI got revamped quite a bit. Add to that all the basics Gmail does right (spamfiltering, tag+-syntax, …), and you see why it is hard to compete.

That said, I don't use gmail anymore because I don't want my emails to be directly in the hands of the NSA.

But let's focus on their list for a bit. Because innovating a sector is not a goal. Having a goal and therefore innovating, that is a goal. So, does the list they formulated hold up? I don't think so:

 _better interfaces_ : Better than gmail? Good luck. Besides, even old-style programs like claws-mail, sylpheed and thunderbird have really good interfaces, for their purpose.

 _better email management_ : Gmail does that. And one has to be really careful with that: It is not something every user need, sure not something every user wants, especially if it even once sorts something the wrong way.

 _better workflow integration_ : Emails are not tasks. They don't need task management in general. Emails are a communication medium, and sometimes, they contain or become tasks. but that is not a general requirement for users.

 _better attachment handling_ : What does that mean besides searching for attachments, maybe including their title, and browsing through the photos? Like attachments.me tried to do. But all of that is not innovation…

 _better social integration_ : The action one might want to do, like tweetbacks, should be linked in the email. Isn't that already the case? Blogs do that (ok, serendipity does, don't know about the others).

 _better prioritisation and analytic_ : To general. Besides, Gmail tries that already.

So, hmpf. Though I want to add that their general product idea (shared inboxes for taskmanagement) doesn't look bad, for a very specific usecase.

<comment><USER3> I agree with you almost entirely. Although I do have one specific minor off- topic feature I'd love to have in email that I haven't seen anywhere.

I want the ability to "like" an email, and have the sender know that I "liked" it. I don't want to write "yes, I agree", or even worse, a terse response of "like" as I feel that's a waste of my time, the sender's time, an unnecessary "+1" in their inbox.

I just want a way to say "I read your email and it sounds good to me" without having to actually write anything. Just click the "heart" or whatever symbol, and the sender is notified next time they open their email client with the heart showing next to the thread. Would work out nicely for lists and group emails as well.

I suppose there are clunky workarounds that would allow such a thing dependent upon client implementation, but it's just not that significant of a thing.

As for shared inboxen for task management, I'd recommend Asana (with whom I've no affiliation, besides being a happy customer).

<comment><USER4> What about an UI which mimic a social network in the Facebook style but which uses email as backend? It would be decentralized for free, and entirely interoperable with people using plain email (those who uses this UI would see that you liked there message, others would see a reply that says "I liked your email", for instance). Comments would be responses to email (using the In- reply-to header). The interface could easily creates groups of contact or post to all of them (equivalent to posting on your "wall"), etc. The action of "friending" someone on this UI could optionally be mutual GPG key signing behind the scene which would enable encryption of messages between friends.

I think there is a lot to do with this idea.

<comment><USER5> I have wondered if you could build a federated social network (or something that is more like an inter-social-network) with email as the underlying transport. You'd need to layer a _lot_ of top of this, of course, but it would be kind of fun.

</comment></comment></comment></comment><comment><USER6> The #1 difficulty with email startups is that they have to invent a market that doesn't exist and doesn't want to exist.

Few people even know that they can access Gmail anywhere other than at mail.google.com or via the Gmail app. Ditto for hotmail/outlook.com and pretty much every other freemail service out there. And of course ad-supported freemail providers have no incentive to let their users access email with a third-party app.

The distinction between an email service and an email app is so murky in the minds of most people, that Mozilla added a dialog box to Thunderbird where they offer to create a new email account for the user. Seriously, a lot of people were wondering why Thunderbird didn't come with its own email address! Instead of trying to dispel this myth, Mozilla just let people keep believing it.

<comment><USER7> You're ignoring enterprise, there is a huge industry around business email hosting which more often than not uses an email client (and more often than not that client is outlook or the iphone mail app).

Google Apps was certainly taking a huge chunk out of enterprise, but I don't know if that's still happening now that you have to pay for it from employee #1.

Outlook usage is so embedded and big enough that Google built a sync app, but moderately funnily, the 'how to integrate google apps with Outlook' video on this page is missing, not sure if that's a reflection of how few people use it?

[https://support.google.com/a/answer/33322?hl=en](https://support.google.com/a/answer/33322?hl=en)

</comment></comment><comment><USER8> Here is an idea for something that has been in my head for some time.

All that would be required to jumpstart the innovation process is a developer- friendly API and standardised events for extending email:

      onReceive(headers, body);
      onOpen(...);
      onTagged(...);
      ...

That would allow developers to do creative things with email. It may even give way to niceties such as:

      npm install email-itinerary-parser

These events could be standardised across the board. A plugin ecosystem would allow emails to operate much like blogging platforms do today. You could have a self-hosted email platform with a plugin dashboard where you would pick and choose your plugins. The UI would be the hard part but is a tractable problem given the state of client-side MVC libraries that didn't exist until a few years ago.

A service like Akismet would provide SPAM filtering and other services could be built around it. The trust factor would be an issue but it might be even possible to send these services only extrapolated data instead of the entire contents of the email.

It would even be possible to build atypical interfaces around your email. You could for example build a blogs UI that shows all emails sent to firstname.lastname@example.com. The blogs Controller could automatically reply to that email with the published status.

In general, things could move in a progressive direction much faster in the hands of the developer community.

</comment><comment><USER9> Email didn't evolve with Gmail. Only the UI evolved.

It could be suggested that Wave was a revolution rather than an evolution, and that was its greatest weakness. I'm sad that it's gone.

<comment><USER10> Not completely gone, it still exists as Apache incubator project : [http://incubator.apache.org/wave/](http://incubator.apache.org/wave/)

<comment><USER9> True. But for it to succeed and be widely adopted, it really needs an organization that is able to host it for the masses.

</comment></comment></comment><comment><USER11> Yet another case of a blog where I click the logo at the top and I don't get taken to the product, I get taken to the blog index. Infuriating!

<comment><USER12> It's fixed, sorry for the infuriation :)

</comment></comment><comment><USER13> Interactive email Web UI is around since 1997 when Microsoft introduced Outlook Web Access. GMail is not really that special.

I think largest email innovation is right now happening at KDE with integration of KMail into rest of the desktop.

<comment><USER14> I love it when the Microsoft apologists come out :)

Outlook Web Access... yeah that changed the world, gmail was but a shadow in its glory.

<comment><USER13> I use Linux since 2002 and actually hate M$.

But yes, it introduced Ajax and changed the world. Gmail was revolutionary because it offered 1GB when 10MB was the norm. Not because of UI.

<comment><USER14> Microsoft introduced a proprietary technology only IE5 could use and changed the world?

Google implemented in both a maps app (completely new UI, and WAY more novel use of Ajax than outlook) and a mail app a standard that worked across all browsers (also something missing in outlook).

Google showed us that you can use a new piece of tech across all browsers. Microsoft showed us you could do something in IE, and only IE.

Your statement is equivalent to saying "ActiveX changed the world". You maybe right, but no one cared about the change, and the change was probably negative.

<comment><USER15> > completely new UI, and WAY more novel use of Ajax than outlook

As to novelty: XMLHttpRequest was _invented_ by Microsoft _for_ Outlook Web Access. "Ajax" was invented by Jesse James Garret as a new name for XMLHttpRequest.

I remember the first time I saw someone use OWA on IE, thinking: HTF does that work? Then I remembered he was using IE and chalked it up to proprietary browser extensions, which was correct. Proprietary but useful enough that the other browsers eventually had to duplicate the feature, with different syntax.

That duplication is what made Google Maps (and later, Gmail) possible.

So, yes. Microsoft gets credit for this one. Not for the generosity of their hearts, but for doing it and making it work and dragging the rest of the world along behind them. That had been the tradition with browser tech since the beginning, with positive and negative effects. This was a positive one.

Definitely not a Microsoft apologist here. And XHR could have been better. But no one else cooked it up, so, they get some credit.

<comment><USER14> This is like saying we should thank Sun for Java Applets, because they gave us web sockets, 3d graphics, etc in the browser. They dragged the whole industry into the future!

The could do what ajax does before microsoft "invented" XMLHttpRequest...

Or we could admit, that coming up with proprietary crap on the web doesn't mean much, the hard part is making it work for everyone.

</comment></comment></comment></comment></comment></comment><comment><USER16> [https://news.ycombinator.com/item?id=7313277](https://news.ycombinator.com/item?id=7313277)

</comment><comment><USER17> This thread is one discussion where I hardly see any coherence or modality in opinions (not that it's bad). To me, this indicates that email innovation has a lot of latent potential. For example, email could have evolved to encompass messaging as a first class citizen rather than an add-on widget.

</comment><comment><USER18> I see this as similar to Blueray, a solution searching for a problem. The vast majority of people don't have a significant problem with the current implementation of email, and those that do develop workflows. It's like a toaster, it works fine as it.

</comment><comment><USER19> The next step in the evolution should be end to end encryption that is (yet) impossible to crack

</comment><comment><USER20> Email in its existence is a medium of communication and there can be innovation in the the modes of communication but the service in its own concept is difficult to be changed. Its same as saying to innovate on letter writing.

</comment><comment><USER21> The innovation was Google Wave. And it was pretty much ignored.

<comment><USER22> Because it's based on extremely complex ideas. Multi-dimensional emails are great but they are really hard.

</comment></comment><comment><USER23> Since Gmail? What new did Gmail bring to email users exactly?

<comment><USER24> Gmail introduced conversation threading, gigabyte storage, speed, powerful search, and lots more no?

<comment><USER25> for me: what is that "a lot more"? I just want to learn something new (btw, labels/tags are not really new, just redesigned imap folders)

<comment><USER26> Tags have an important difference from folders in that messages can have multiple tags and you don't think of messages as being _in_ a folder.

Personally I find this quite useful and it definitely improved the way I use email.

<comment><USER27> Opera Mail had tags quite early on, not sure if it was before Gmail though.

</comment></comment></comment></comment></comment><comment><USER28> I've been testing Front and it's very promising.

</comment><comment><USER29> Why do we always _need_ to innovate?

</comment><comment><USER30> " Why is it so hard to innovate? " Hmmm ... because mail just works since 20+ years And most of us just need grep command you IOS fanboy

<comment><USER31> I was going to say much the same that it works fine already. Although thinking about it there have been real improvements like being able to send 2GB files with gmail which was darn hard 20 years ago. And presently if I compose a reply with gmail it does it in a stupid little pop up window while if I fire up Outlook it takes like 5 minutes to come to life. So maybe it's not all perfect yet.

Actually what still bugs me is that I use email as my default record of all conversations I've had since 94 or so but I have not found a way for it to include SMS messages. Facebook you can forward to email but not SMS as far as I know. I want to be able to say to the program show me all the conversations with Bob last year and see everything, SMS, WhatsApp etc included. So come on startup dudes, build away! I daresay much of the problem is the likes of Apple being precious about letting you download the SMSs, but anyway.</comment></comment>