New Thunderbird Releases and New Thunderbird Staff - <AUTHOR> https://blog.mozilla.org/thunderbird/2017/12/new-thunderbird-releases-and-new-thunderbird-staff/ <comment><USER2> Thanks for not letting Thunderbird die. In my opinion it's still the best and most customizable opensource email client and there is just not a viable replacement.

Most of the open source email clients I have tested require you to run a local webserver and access the mail using a web browser with very limited features. All I want/need is a desktop app that can be customized to work similar to Gmail, pulls and deletes emails from remote SMTP/IMAP servers and allows me to create backups locally.

Thunderbird gives me that.

<comment><USER3> I've found Mutt, Alpine, Sup and Notmuch all to be very good, depending on your needs.

<comment><USER4> [https://www.postbox-inc.com/](https://www.postbox-inc.com/) is also a nice alternative (and mostly compatible to Thunderbird - at least when I migrated)

<comment><USER2> Even though Mutt, Alpine, Sup and Notmuch might work great for some people they seem to be accessible only from a terminal, emacs, etc and very text heavy. As much as I love spending time on the terminal, I prefer a GUI app for my email.

Postbox unfortunately doesn't support Linux, besides that while I don't mind paying licences for great software, it doesn't look like Postbox is fully opensource [1].

[1] [https://www.postbox-inc.com/coveredcode](https://www.postbox- inc.com/coveredcode)

<comment><USER5> BTW what makes you prefer GUI over text almost-GUI? My experience with email is that it's 99% text.

I use gmail because of the labels (no, folders are inadequate), full-text search, and the fact that it runs in browser which I keep always open anyway. I wish there was a comparable open-source solution.

<comment><USER6> > BTW what makes you prefer GUI over text almost-GUI? My experience with email > is that it's 99% text.

For me it is the fact that setting up a GUI client takes 10 minutes and learning to use it even less. If it was the same with mutt, I would switch in a heartbeat.

I tried gnus and mutt in the past, but gave up on them after a few days. I was spending too much time tweaking the config, trying to remember shortcuts or googling how to get it to work the way I wanted to. IIRC even displaying Greek with an ok font was a problem on gnus. That was 10+ years ago, could be that the documentation is better now and a good-enough setup is easier to achieve.

<comment><USER7> My experience is that mutt is a tool which rewards the learning process with massively improved productivity.

By way of contrast, people who use Outlook or Thunderbird feel comfortable in ten minutes, but they never make much progress.

If you deal with a lot of email, using the right tools is important. If email is not your primary communications method, there's no point in putting in the time to learn more advanced tools.

</comment></comment></comment></comment></comment></comment></comment><comment><USER8> Oh my god. Thank you for this great news. I was almost resigned to see Thunderbird being sunset. It's an amazing client and will only become better by utilising the progress made by Firefox.

<comment><USER9> Agreed! I just donated cash money, as I'd hate for it to go away.

<comment><USER10> Consider setting up a small monthly donation, as this helps nonprofits plan better and be more sustainable

</comment></comment></comment><comment><USER11> Is the new Thunderbird compatible with Microsoft's Exchange email service? If memory serves, I think that was what forced me to switch to the Evolution Mail client (which uses "Exchange Web Services") since my workplace uses Exchange.

With regard to the Photon UI, I'm weary of the calendar button being in the application header like that. It's just not where I would look for it, and I don't see what's different between it and the other buttons that would merit some of them being in the header and some of them not.

Either way, I'm happy that Thunderbird isn't dead. Even version 52 has some nice features that I couldn't find in other clients.

<comment><USER12> >Is the new Thunderbird compatible with Microsoft's Exchange email service? If memory serves, I think that was what forced me to switch to the Evolution Mail client

I see this very much as a Microsoft problem rather than a Thunderbird problem, although I appreciate that doesn't make your situation better.

I use davmail[1] to solve this problem at work. Davmail sits in your tray, connects to exchange and turns the exchange traffic into standards-compliant mail traffic for your email client.

Of course, you lose some features in the process. About once a month I have to remind HR that the "vote" buttons in exchange are not part of any email client except outlook. Still, it works well for sending/receiving mail and tolerably for handling calendar invites.

[1] [http://davmail.sourceforge.net/](http://davmail.sourceforge.net/)

<comment><USER13> Can you see the calendar availability of everyone who you invite as Outlook shows?

<comment><USER12> I have no idea, I mostly use the calendar for receiving invites to meetings. Try it and let me know?

</comment></comment></comment></comment><comment><USER14> I'm so glad for some news about Thunderbird's future. A conglomeration of little annoyances made me go hunting for an alternative client earlier in the year, and I just couldn't find one that would really replace it for me.

If any of the team are reading, I hope the search interface is on the radar for when the project is on stable footing again. That's Thunderbird's main area of weakness in my opinion.

<comment><USER15> I find recent emails with Thunderbird's search pretty reliably, but for indexing a large archive of emails I can definitely recommend Recoll. I have it run a scan daily as a cronjob and it finds absolutely everything.

[http://www.lesbonscomptes.com/recoll/](http://www.lesbonscomptes.com/recoll/)

</comment></comment><comment><USER16> I thought thunderbird was in pure maintenance mode and practically abandoned. Has something changed? Is this a maintenance release or is thunderbird starting to be a viable client again?

<comment><USER17> Why would Thunderbird need to change beyond maintenance in order to be "viable" in the first place? Email hasn't changed. It's still solving the same problem. It should be as good as ever.

<comment><USER18> > Email hasn't changed

Tell Google that. :/ Most of my email woes doing support over the years have been Gmail related. Google changes something, suddenly happy email clients cease working as users expect.

<comment><USER19> Oh so much this.

Google is, on a number of topics, dancing very close to the EEE behavior that MS has gotten lambasted for in the past.

You could probably plaster the colorful G over top of Vader's helmet in the old scene between him and Lando.

<comment><USER17> Hell, they basically outright _are_ EEE with regard to how they've treated XMPP. I basically just had to stop using Gchat (or whatever it's called now) because its behavior was just so incompatible with Pidgin.

</comment></comment></comment></comment></comment><comment><USER20> If you are using Thunderbird you're propably using Enigmail and might want to check out this new Enigmail vulnerability:

[https://twitter.com/symbolicsoft/status/943106337617084417](https://twitter.com/symbolicsoft/status/943106337617084417)

<comment><USER21> Actually according to usage share, if you are using TB you are probably not using enigmail, but thanks for the warning.

</comment></comment><comment><USER22> Finally! I hope they start moving forward again.

How about, once all the maintenance is done, \- Exchange support \- Native Calendar with Exchange and CalDAV support \- Native Contacts with Exchange and CardDAV support

(I'm currently using Evolution, and it mostly works. But elegant or polished it is not.)

</comment><comment><USER23> While I'm happy they are keeping development up, I'm sad about the 'move to web technologies'. I really like the idea of purpose-built applications in fast languages that compile to efficient native code. I don't really want a webapp, wrapped in a single-app browser, we already have so many of those.

<comment><USER24> More relevant to Firefox than Thunderbird, perhaps, but the advantage to using web technologies for their own front end is that it forces them to eat their own dogfood at least. Given that Mozilla wants the web to win, making sure their platform is well-rounded enough to performantly build their own products on top of seems like a wise strategy. Kind of a vote of no-confidence otherwise.

<comment><USER21> What makes you think mozilla wants the web to win ?

</comment></comment></comment><comment><USER25> If you love Thunderbird, set it (bug) free! You can help a lot without any C++ knowledge. I wrote about getting started in bug triaging earlier this year: [https://www.reddit.com/r/linux/comments/65upot/show_some_lov...](https://www.reddit.com/r/linux/comments/65upot/show_some_love_for_thunderbird_by_testing_bugs/)

Sadly I have not gotten around to guestblogging about my TB testing (done over the course of 3 months).

</comment><comment><USER26> I'm sorry, but from the blog article it's not completely clear what this is.

I knew a major rewrite was going to be required with Gecko and XUL being abandoned by Mozilla: is this a step in that direction? Or just a stopgap measure while still relying on legacy code?

</comment><comment><USER27> Thanks for all the work, it is my favourite email client since Netscape days.

Guess it is time to renew my donation.

<comment><USER28> I thought that Thunderbird (along with Firefox) was based on the Mozilla application suite which itself was open sourced from the code that Netscape wrote for their browser, mail and news client, and html composer/editor aka Netscape Communicator.

I still use Firefox as my main browser, and Thunderbird as my mail and news client and have been using their earlier incarnations since the Netscape days.

<comment><USER29> Yes. Thunderbird is a descendent of Netscape Messenger.

</comment></comment></comment><comment><USER30> I currently use ThuderBird but I'm very sad about the lack of some basic features (grouping email chains?).

I wish someone would make an open source replacement to Mailspring's sync engine. I'd switch to that as soon as available. I just don't like the thought of someone having hidden code touching my email.

[https://github.com/Foundry376/Mailspring](https://github.com/Foundry376/Mailspring)

<comment><USER14> > I currently use ThuderBird but I'm very sad about the lack of some basic > features (grouping email chains?).

If this means what I think it does, it's provided by the Thunderbird Conversations addon.

[https://addons.mozilla.org/en-US/thunderbird/addon/gmail- con...](https://addons.mozilla.org/en-US/thunderbird/addon/gmail-conversation- view/)

<comment><USER31> I use that but it's a bit of a mixed bag. Works pretty well in general but sometimes it's just incredibly slow, or decides to display a portait image with 100% width in a half-height view, spanning half a dozen screenfuls, instead of doing something reasonable like resizing so that both dimensions fit.

</comment></comment></comment><comment><USER32> Diehard thunderbird fan. Using it on OSX and Windows. Glad to see it still being updated.

</comment><comment><USER33> Not impressed by the visual "refresh". Looks like yet another trip to flatland to me. I wish this design trend would go away already.

<comment><USER21> Mozilla rarely impress with the unnecessary UI changes, but for some reason the make sure to deprive the user of the freedom fo choice by removing the previous UI instead of having an option in preferences to choose the UI the user prefer.

<comment><USER34> Because maintaining two separate GUI frameworks is utterly pointless.

</comment></comment></comment><comment><USER35> Wow, just last night I was thinking about how Thunderbird is getting so long in the tooth. It's still my favorite email client. Happy to see this update!

</comment><comment><USER36> I'm REALLY excited that Thunderbird has more people and releases. I'm hoping that calendar & native Exchange support will be eventually added.

</comment><comment><USER21> Thunderbird lacks privacy protection features and integration for GTD flow. I'm waiting for caliopen to be ready for public use and I'll switch all the TB install I maintain to caliopen[1].

[1]: [https://www.caliopen.org/en/](https://www.caliopen.org/en/)

</comment><comment><USER37> Great news!!! Thanks for keeping TB alive for us loyal users. Just yesterday I tried the 58beta and some problems I had with Lightning not loading properly after some restarts, disappeared. The visual refresh with the flat UI was also a nice change. Wish I could contribute...

</comment><comment><USER38> Awesome news, given that I still use it on a weekly basis on my Linux laptop. I pinned the apt on Ubuntu to make sure it would stay 'stable', will take a look at 58 once it goes out of beta.

</comment><comment><USER39> Great to see it is alive and kicking.

I have been a heavy thunderbird users for years until about half-year ago, I now move/forward all my email to outlook.com instead, so far it works for me well.

</comment><comment><USER40> Great news, made my day! It is the one usable mail client for Linux.

</comment><comment><USER41> It's sad to see Mozilla dropping off Thunderbird to basically a spin-off entity (this seems to be the direction).

</comment><comment><USER42> I see no information about integration with calendar and contacts web apps. Did I somehow miss it?

<comment><USER43> That's achieved with the Lightning add-on, I believe.

I'd like to see Thunderbird focus on separating their mail handling engine from the UI aspects. Much like how the Chrome V8 engine can be used by a variety of projects, it would be nice if a separate open source project could take the Thunderbird engine, and experiment with their own UI.

It would also allow the adoption of newer replacements for IMAP. My hope would be that it could also lead to the replacement of proprietary messaging networks such as Slack, Discourse, etc., with something based on the newer open email format.

<comment><USER44> I think you mistaken Discourse with Discord. Discourse is open source forum engine, the second is Slack-like but faster, with rich permissions system.

<comment><USER43> Yes, you're right. I meant Discord. Thanks for the correction. Too late for me to edit though.

</comment></comment></comment></comment><comment><USER45> Please have some sort of ACME support for automatically doing S/MIME.

</comment><comment><USER46> Thank you Mozilla for continuing to support Thunderbird!!!

</comment><comment><USER47> WOW, I used to use Thunderbird until around 2010 when I moved to more modern clients, it's so sad to see that they're still stuck in 2010 in terms of design.

<comment><USER48> > when I moved to more modern clients

Any chance you can give me your list? I haven't found any desktop e-mail client that rivals Thunderbird. Thanks.

<comment><USER47> Depends on what platform you are. I'm currently on Ubuntu and I use Google Inbox wrapped in an Electron app.

I used to use Mailbox (which I think became Google Inbox? or was it Sparrow that did), Sparrow, Airmail.

Thunderbird turns managing emails into a full-time job. No shortcuts whatsoever to help you getting rid of unimportant emails, awful spam protection.

Of course, if you're productive in Thunderbird who cares and why not just use that, this is just my opinion :-)

<comment><USER21> Sparrow has been dead for over 5 years so not exactly a modern thing, it was apple only, not cross platform anyways so not comparable to thunderbird.

Airmail is also apple only so useless to most people.

Mailbox was a phone only app that stopped operating last year, again not a cross platform desktop client.

You're welcome to try again, but AFAIK there are no such "modern" cross platform desktop email client that you throw around as a model to follow.

Even your current Inbox by google is a phone only / web only application and not a cross platform desktop email client.

Claws[1], sylpheed[2] are such cross platform desktop email client competing with thunderbird and I don't any of the features you're complaining about

I do not know what you are referring to when you mention thunderbird has awful spam protection. I maintain a dozen of TB installs and they do a great job of filtering spams for those who do not know better email hygiene.

You should try experiencing email outside of the giant mega centralized repository that is killing the web and internet and see how it's done in the outside world that you seem to not visit often.

[1]: [http://www.claws-mail.org/](http://www.claws-mail.org/) [2]: [http://sylpheed.sraoss.jp/en/](http://sylpheed.sraoss.jp/en/)</comment></comment></comment></comment>


Teach Yourself Programming in Ten Years - <AUTHOR> http://norvig.com/21-days.html?foo

<comment><USER2> I recently reached the end of my 10-year plan and let me tell you, it's more like "teach yourself programming in a lifetime" because if there's anything I've learned it's that there's always more to learn.

And if you don't have any "problems" anymore, you're not trying too hard... or you've solved every problem there is to solve.

<comment><USER3> You mean... learning happens the whole time you're alive?!

</comment></comment><comment><USER4> Cheater.. appending variables to be allowed to submit!

<comment><USER5> That's not cheating, that's hacking the system... Maybe this is actually a really clever meta-post :-)

</comment></comment><comment><USER6> Even though an old and previously posted article, is anyone listening? Or maybe it's a question of beliefs?

Because I think another aspect to look at this article with is that learning how to hack is fine, though start-ups should be focusing on the toughest problems, and ignoring _history_ (how things got to where they are today) won't help anyone.

All of you working on the next social platform better beware of the history.

<comment><USER7> Listening to what, exactly? "I suck, because I haven't programmed for 10 years"? What exactly is the message here?

<comment><USER8> when you've programmed for 10 years, how much further do you hope to be than you are now?

<comment><USER7> I have actually programmed for more than 10 years. My current impression is that I will probably never become a specialist for anything and will just have to make up things on the go, because technology changes so fast.

Maybe I have acquired some kind of taste, but then I always think about the many successful PHP projects out there (PHP is horrible in my opinion). So maybe even that "taste" is overrated. Just doing it seems to be all that counts.

Another thing is that I somehow try to optimize for the changing demands, and try to become faster at picking up stuff. I try to make it seem normal to pick up a new technology, rather than a reluctant effort. Not sure if it is the right way to go, though, and I also don't have a system for it.

</comment></comment></comment></comment><comment><USER9> <http://news.ycombinator.com/item?id=43243>

<comment><USER10> I don't think users should periodically repost a classic just because its message bears repeating.

I'm 23 years old. I started programming when I was 13. All my problems in software now revolve around people issues.

<comment><USER11> I've been programming for well over ten years. I found it hard at first, but now I find it really really hard. By the time I retire, hopefully it will be damn near impossible.

</comment></comment></comment><comment><USER12> Should you invest ten years in (a) becoming a better programmer? Or in (b) learning how to manage the people side of things? Or in (c) discovering what kinds of problems are worth solving?

How about (d) all of the above, making this "necessary but not sufficient"?

<comment><USER13> I'd invest 10 more years into enjoying programming in the first place. (Although I've already invested 20 into it.)

</comment></comment><comment><USER14> is norvig born in denmark or he just has danish heritage? couldnt find out via wikipedia or his site but he wrote "...my fellow dane..." on his site.</comment>


How Lisp macros differ from static code-generation and metaprogramming - <AUTHOR> http://brandonbyars.com/2008/02/12/understanding-syntactic-macros/ <comment><USER2> > Except, of course, that doesn't work. The preprocessor only makes one pass > > through the file, meaning a macro can't call another macro.

Huh? That's just blatantly wrong, and I (and many others) have used the C preprocessor to create multi-level macros in quite powerful ways. See for example <http://blog.nelhage.com/2010/07/implementing-an-edsl-in-cpp/> or the insanity Linux's tracing macros have implemented: [http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6...](http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=include/trace/define_trace.h;h=1dfab54015113b83bce9f3302470c3a5ed95b5e7;hb=HEAD)

His article has a point, but he's not doing C macros justice -- they are quite powerful and can be used in really cool ways, even if people tend to look at you funny when you do :)

<comment><USER3> The reason Linux trace macros are insane is because C preprocessor is so primitive.

Think about it.

> they are quite powerful

For small values of "quite". C macros are strictly less (and by large margin powerful than Lisp macros. One can't even use #ifdef inside #define!

<comment><USER4> Note, the power of the macro system is not equal to its general good.

The C macro system was already too powerful, and one of the things that hurts languages is a preprocessor of virtually any kind. The badness of the C preprocessor starts much earlier with things like include files, and the fact that you can't statically analyze the code in any reasonable way.

The benefit from the preprocessor is absurdly small. With that said, I think the benefit of the Lisp preprocessor is pretty small too. C would be harmed more by its omission due its compilation model, but as we've seen with languanges in its family, like C#, its unnecessary.

In a decade or less, the Lispers will see this light too.

<comment><USER5> It took five years for LINQ to be added to C# because it was too painful for anyone other than Microsoft to add any syntax to the language. Macros would have fixed that.

<comment><USER6> it's interesting that you say this because Nemerle, another language on the .NET platform implemented LINQ into the language using Macros.

</comment></comment></comment></comment></comment><comment><USER7> By the way, don't confuse macros with backquote; the backquote facility is probably closer to C's preprocessors. I haven't heard this claim before, and I might not be entirely right, but it's what provides for the "fill in the blanks" type symbolic computing.

For example:

      (defun sum (x y)
        `(,x + ,y = ,(+ x y)))

This is a SUM function which looks like this when run:

      (sum 4 5) ==> (4 + 5 = 9)

The backquote (`) says the following form and its sub-forms (if any) are all quoted. But you can poke holes in the quote and fill in with the value of outside variables, using comma (,). So in the example, everything is quoted in the body of sum, except three things: x, y, and (+ x y). Each of those is then evaluated yielding 4, 5 and 9, then, finally, the template is filled in (4 + 5 = 9).

If you want to confirm this, you can change the + and = to any other symbol and it would still display. E.g:

      (defun sum (x y)
        `(,x frob ,y != ,(+ x y)))

      (sum 4 5) ==> (4 FROB 5 != 9)

<comment><USER8> You can also splice values into backquoted expressions using ,@foo rather than ,foo - which I seem to remember being rather useful.

<comment><USER9> It's incredibly useful. The actual definition of until from Arc:

      (mac until (test . body)
        `(while (no ,test) ,@body))

It's really useful for bodies of code like this.

</comment></comment></comment><comment><USER10> _So Lisp macros provide compile-time code generation, but in doing so, you have access not just to the code-generation instructions – which are just Lisp data – but also to the entire Lisp language and environment._

The same can be said for classic Forth. Indeed, the enthusiastic way that Lispers describe macros I find eerily similar to how I used to hear Forthians describe their language. Except in Forth the relevant term isn't macro but "defining word". Indeed, I think programmers in both camps see the proper use of macros/defining words as a sign that one has passed the beginner stage of using the language.

A classic compiled Forth word (ie, function) would consist of the word's name followed a string of addresses to execute; how those addresses were laid down, where they pointed, etc. were totally open to programmer control -- both during compilation and afterwards. It's been a couple of decades since I looked at Forth code, but I don't think there's anything that could be done in Lisp macros that couldn't also be done easily in Forth as well.

I think the big difference between the two -- at least, so far as the macro topic goes -- is that Lisp starts with an assumption that code and data can and should be interchangeable while Forth was initially developed for the machine control (embedded systems before they were called embedded systems) and thus code was merely a vehicle for creating applications.

<comment><USER11> Forth is almost the complete opposite of Lisp, and thus very similar.

<comment><USER10> You're gotten a number of up-votes, yet this statement makes as much sense to me as saying bananas are the complete opposite of apples. You can make a case of similarity or dissimilarity depending on which language aspect you focus on. But, "opposite"? I have no idea what that means.

<comment><USER12> Let me guess at some of what (s)he means:

Forth is an interpreter that can be switched into compilation mode, Lisp is a compiler that can be switched into interpreter mode. [edit: thinking of that, this more reflects how I have used the two than what they are. Lisps start in an eval loop, too, yet they feel different to me]

Forth is postfix, Lisp is prefix.

Forth programmers know their stacks are the environment, but rarely think of it as an environment. Lisp programmers know their environment is in some stack-like data structures, but rarely think of those stacks.

<comment><USER11> Lisp and Forth are both very simple systems in terms of basic concepts, and push them to their limits.

Both are quite flexible.

Forth often runs on the bare metal, and exposes everything below. Lispers are customarily more shielded.

Both encourage code to be treated as data and vice versa (without even looking at macros), but Lisp builds on the lambda calculus to do that, while Forth just sees code and data as being contents of memory.

In Forth if there's a bunch of data flowing into a word, you might put the number of arguments on the top of the stack and the other arguments below. Lispers would run away screaming from this manual and error-prone approach.

Lispers like to build e.g. their their own object system, if necessary. And in Forth it's easy to tag on a garbage collector---from within the language.

I hope that's some meat to back up my assertion. I hope I got some good examples. What I really want to say, is that the languages feel related in spirit. But less like brothers, more like to generals from opposing armies still respecting each other.

<comment><USER10> Sorry for the belated response, but for a sense of closure, so to speak, I'll add that I agree with your general assessment. Both languages started with a simple core that allowed developers to take some basic ideas and see just how far they could go with them. It just didn't occur to me to describe that as "opposite".

Interestingly, both languages wound up with a schism of framework enthusiasts (CLOS & "big Forths") vs. minimalists (Scheme & Moore loyalists (for want of a better term)).

As an aside, your bunch of data example would run afoul of Forth catechism. The normal response would be to use a dictionary address or even address and offset to access a data structure. Antagonism to deep use of the data stack is so prevalent that Moore eventually reached the point with his chip designs of implementing the top of stack as a couple of on-chip registers -- if what you want isn't within the top couple of stack entries, so the logic goes, then you've failed to factor your design properly. Perhaps this preoccupation with very low level operations is an aspect where Forth programming might be considered the opposite of normal Lisp programming.

<comment><USER11> I wish HN would give me the option of bubbling up old threads that got new comments.

And you are right about my example with the deep stack. I probably did not remember correctly. The variable array was probably something with passing around an address plus length on the stack---while Lispers prefer that as one object.

</comment></comment></comment></comment></comment></comment></comment><comment><USER13> A couple points on the metaprogramming space (these aren't about the article, but the article reminded me of them):

1\. Macros aren't unique to lisp. They're most developed and used in the lisp family, but you don't need to have a homoiconic language to have macros. The Mirah programming language--statically typed Ruby on the JVM--has non-hygenic macros, I know there's been a number of efforts to add macros to coffeescript (so far without success), and there are a number of academic languages that also have them. None are in widespread use, but they exist.

2\. Metaprogramming's power is primarily limited by the restrictions of the host language. The best example I know of is Io where pretty much anything other than commas and parentheses is up for grabs. Example: <http://anttih.com/blog/2010/10/29/json-in-io.html>

3\. User definable mixfix operators are in the sameish domain. Unfortunately, they're almost always mentioned in passing by people who know what they are so I don't have a good reference for introducing what they are and don't have direct experience working with them. I'm just mentioning them as something to be aware of if you're interested in general metaprogramming concepts. Here's the closest thing to an intro I could google up: [http://maude.cs.uiuc.edu/maude1/manual/maude-manual- html/mau...](http://maude.cs.uiuc.edu/maude1/manual/maude-manual-html/maude- manual_31.html)

<comment><USER14> _1\. Macros aren't unique to lisp._

Perl6 also has macros (<http://en.wikipedia.org/wiki/Perl_6#Macros>) though they haven't been implemented in Rakudo yet. Also Ioke states that it has macros.

 _2\. Metaprogramming's power ... The best example I know of is Io where pretty much anything other than commas and parentheses..._

Touched on Io introspection/metaprogramming before on HN:

* <http://news.ycombinator.com/item?id=1804599>

* <http://news.ycombinator.com/item?id=1810480>

<comment><AUTHOR> The question isn't so much whether other languages have something they call "macros", but whether their macro systems approach Lisp's in power, flexibility, ease of use, integration with the language, and natural fit on to the language representation? Or is the macro system in question more of a Turing tarpit?

<comment><USER15> Prolog's macro system does, but given it's model of computation (search/pattern matching are built in), it ends up being used far less than Lisp's.

</comment></comment></comment></comment><comment><USER16>
      > Except, of course, that doesn't work. The preprocessor
      > only makes one pass through the file, meaning a macro
      > can't call another macro.

      macro.c:
      #include <stdio.h>
      #define LOOP(n) for (int i = 0; i < n; i++)
      #define PRINT10 LOOP(10) { printf("%d", i); }
      int main(void) { PRINT10; printf("\n"); }

      gcc -Wall -std=gnu99 macro.c  && a.out
      0123456789

Of course macros can call other macros: [http://gcc.gnu.org/onlinedocs/cppinternals/Macro- Expansion.h...](http://gcc.gnu.org/onlinedocs/cppinternals/Macro- Expansion.html)

Ignoring his poorly protected macros, and taking nothing away from Lisp, am I missing some subtle point he's making, or is the author just flat out wrong here? I think he's just wrong, and this makes it hard for me to even read the rest of his argument.

<comment><USER17> A C macro can't directly -- nor indirectly -- refer to itself; even through other macro. You can't do loops, you can't do recursion.

(a nonsensical example, as I can't think of a proper one right now)

#define PRINTFOO PRINTBAR

#define PRINTBAR PRINTFOO

PRINTFOO

The ANSI C standard says a macro, while it is being expanded by the preprocessor, ``is painted blue'' (is no subject to further expansion).

I'm not sure, but probably it follows the C macros are not Turing-complete.

EDIT: on the other hand, a LISP macro system is a Turing-complete programming language that's geared towards manipulating lists of symbols and values (which, incidentally, is LISP program).

<comment><USER16> Do you have a link for the "painted blue" reference? I agree with your explanation, but had never heard that particular phrasing and was intrigued by it. But searching on Google for things like 'expand ansi macro "painted blue"' returns only your comment and a scraped spam site of someone answering a similar question.

<comment><USER17> Indeed surprisingly hard to find a first hand reference. But <http://duckduckgo.com/?q=%22painted+blue%22+expansion> returned link to wikipedia article, which, in turn, links to some meta-document about new C standard. There's also some post on Boost (library) mailing list: <http://duckduckgo.com/?q=macro+%22painted+blue%22+boost> -> <http://lists.boost.org/Archives/boost/2006/01/99264.php>

Perhaps I was wrong; perhaps the phrase was in K&R C? Can't find the book online @_@;;

</comment></comment></comment></comment><comment><USER18> Nice try blanco niño, but the following program runs fine. This doesn't detract from your overall point, but if you're trying to win over people who think the Boost macros are super awesome, this argument won't do it.

#include <stdio.h>

#define LOOP(n) \ int i; \ for (i = 0; i < n; i++)

#define LOOP10 \ LOOP(10) printf("%d\n", i)

int main(int argc, char *argv[]) { LOOP10; }

<comment><USER7> Yesterday I was writing code that kept messing my Lisp's signal handling, so I wrote a FOR-DURATION macro that arms a timeout and makes sure whatever that runs in its body gets killed after N seconds.

Here it is:

      (defmacro for-duration ((seconds) &body body)
        `(handler-case
             (bt:with-timeout (,seconds)
    	   ,@body)
           (bt:timeout () nil)))

Five lines to alter the evaluation model of your language. Not bad.

Use as:

      (for-duration (10)
        (loop
          (print "Infinite loop! where is your Godel now?")))

"bt" is the bordeaux-threads package, a portable Lisp library for thread programming.

<comment><USER19> C99 + GCC extensions + POSIX:

      #define for_duration(seconds, body)                     \
        {                                                     \
          pthread_t tid_task, tid_watcher;                    \
                                                              \
          void* task(void* arg) {                             \
            body ;                                            \
            pthread_cancel(tid_watcher);                      \
            return NULL;                                      \
          }                                                   \
                                                              \
          void* watcher(void* arg) {                          \
            sleep((seconds));                                 \
            pthread_cancel(tid_task);                         \
            return NULL;                                      \
          }                                                   \
                                                              \
          pthread_create(&tid_task, NULL, &task, NULL);       \
          pthread_create(&tid_watcher, NULL, &watcher, NULL); \
          pthread_join(tid_task, NULL);                       \
        }

Use as:

      for_duration(10, {
          while (true) {
            printf("Infinite loop! where is your Godel now?\n");
          }
        });

Or with single brace-less statements:

      for_duration(10, while (true) printf("something\n") );

Lexical scope is sane:

      int i = 0;
      for_duration(10, {
          while (true) {
            printf("%d\n", i++);
          }
        });

My comparison isn't quite fair, because your threading library provides 'with- timeout', while pthreads doesn't. If you factored this out, say with a signature like:

      void with_timeout(unsigned int seconds, void (*func)(void));

(in analogy to the common lisp function), then the macro part becomes just four lines:

      #define for_duration(seconds, body) {			\
        void func() { body ; }				\
        with_timeout((seconds), &func);			\
      }

I acknowledge that the lisp solution is rather more elegant. Also, my C macro is potentially dangerous because it is unhygenic. (It shadows outer declarations of 'task()', 'watcher()', 'tid_task', 'tid_watcher', and 'arg', in the body of 'body'.)

<comment><USER20> Is there a C macro that can do this?

        (defmacro execute-in-reverse (&body body)
          `(progn ,@(reverse body)))

        (execute-in-reverse (print "Hi") (print "Middle") (print "Bye"))

Prints...

        "Bye"
        "Middle"
        "Hi"

Point: You can do whatever you want with the symbols sent to the macro, whatever their contents. Mahmud's wrapper macro is trivial (it could be done with lambdas). Lisp's macro system allows you to create new syntax, including changes in flow control.

But my example is trivial, too. I could go on to swap individual parts of my forms around, remap them to other forms depending on various conditions, etc.

In addition, people often talk about Lisp macros, but they neglect to mention the power of reader macros, which allow you to go beyond Lisp's basic AST look-and-feel.

<comment><USER19> > _Is there a C macro that can do this?_

No, of course. C macros only see strings; you need to parse a syntax tree to do your reverse example (like lisp macros).

No argument from me.

> _Lisp's macro system allows you to create new syntax, including changes in > flow control._

Well, C macros seem to be able to manipulate control flow. You can't break up an expression to do that (not smart enough to parse), but you can rearrange expressions that are given whole.

</comment></comment></comment></comment></comment><comment><USER21> Good post, but I still think that C's macro are pretty powerful. I've created a foreach loop in C (GNU C at least, though I could probably port it using C1x's _Generic) just to prove this: <https://gist.github.com/632544>.

</comment><comment><USER22> Lisp macros remind me of dynamically generating SQL statements.

If you've ever built a string in T-SQL or PL/SQL and then exec'd it, you're probably much closer to being productive with macros than you think.

Of course, this is probably because dynamically generating SQL is something that I've done. Other programmers probably have their own mental models that warp into lisp.

<comment><USER23> Yeah, I think that's a fair way to start thinking about them. But Lisp macros, to extend your example, are more like if you could generate the SQL using SQL. Which sounds like a totally horrible thing actually. :) But with Lisp it makes much more sense because lisp programs are lists. If SQL programs were tables, then it'd be a better fit...

<comment><AUTHOR> You'd have to stretch the analogy to not only _generating_ SQL with SQL, but _extending_ SQL with SQL, to create constructs that weren't even possible to write in SQL before you extended it.

</comment></comment></comment><comment><USER24> Thanks for presenting Lisp macros in terms that I (as a C++, Python et al programmer) can understand.

I can see why they are as powerful as claimed.

</comment><comment><USER25> Nice post, though I find the summarization of SICP and the Little Schemer as academic texts inaccurate. The paradigms covered in them are of greater importance than macros - that is, your macros are only as powerful as the abstractions your language gives you.

</comment><comment><USER26> Seeing how this guy comments about loop, be a little careful when using it. There is no formal standard on how to implement loop, so what you write might result in different answers depending on what Common Lisp implementation you use. Evaluate these loop-expressions and see what happens (from _ANSI Common Lisp_ by PG):

        (loop for y = 0 then z
              for x from 1 to 5
              sum 1 into z
              finally (return (values y z)))

and then evaluate this:

        (loop for x from 1 to 5
              for y = 0 then z
              sum 1 into z
              finally (return (values y z)))

<comment><USER27> What aspects of the actual behavior of loop are unspecified?

<comment><USER26> How to combine them is poorly defined and complex. The loop clauses by themselves is not the problem.

</comment></comment></comment><comment><USER28> Metaprogramming is a more general concept than the author claims. For example, lisp macros and eval/quote (at any level of compilation or runtime) are particular metaprogramming facilities. You can even metaprogram using only explicit code quotation if you prefer (with no implicit reflection exposure of regular code).

I agree with the definition at <http://en.wikipedia.org/wiki/Metaprogramming>

</comment><comment><USER29> In dialects that support fexprs such as Kernel, PicoLisp and Eight, you get something almost like first-class macros. Macros (or fexprs, rather) are then even more powerful, because they can be passed around as arguments to functions or even to other fexprs.

A key tradeoff is that they must be expanded at run-time, and in doing so they incur a performance penalty that doesn't exist with compile-time macros.

</comment><comment><USER30> Are natural languages homoiconic? (If you get my drift.) Does that question even make sense?

<comment><USER31> Hmm, I don't know about in general, but in English we have the double-quote when being used to refer to the statement itself. For example, I can talk about the use of "for example" by quoting it like that. So (written) English can embed English in a reasonably standard format. Very like the Lisp quote operator, no? The name is not coincidence.

However, we have no useful English operators to take the quoted words and change them into something else meaningfully. Though a non-English set can be argued to exist: <http://creativeservices.iu.edu/resources/guide/marks.shtml> If those were English themselves that would arguably complete the loop, but I would consider that stretching the point; these were explicitly invented to avoid the use of English and also translate to any other character-based language.

<comment><USER32> I can't think of a natural language equivalent for the comma operator, other than (maybe) incredibly awkward and confusing uses of parenthetical statements

</comment></comment></comment><comment><USER33> The factual errors concerning the C preprocessor aside, the author also ignores C++-style metaprogramming. Granted, C++ templates have their flaws, but they do provide a Turing-complete compile-time metaprogramming environment...

</comment><comment><USER34> I like run-time meta programing. Which i assume lisps are capable of. speed excites me not at all, and i consider having a compile-time to be a disadvantage.

i wish authors didnt craft their arguments around C/Java.</comment>


Drinking Online with Friends Is the New Dive Bar - <AUTHOR> https://boingboing.net/2020/03/13/on-nomi.html <comment><AUTHOR> Who is up for a drink this week, it's been a doozy.</comment>


Why Are So Many Tech and Telecom Companies Bad at Respecting Your Privacy? - <AUTHOR> https://consumerist.com/2017/03/23/why-are-so-many-tech-telecom-companies-bad-at-respecting-your-privacy/ <comment><USER2> Because your data is money on the table, whether you thought it was part of the bargain or not.

</comment><comment><USER3> They're not bad at it, they simply choose not to.

</comment><comment><USER4> Because they are companies, and need to make money?

</comment><comment><USER5> The profit motive incentivizes bad things?</comment>


Requests per second. How many is good? - Tornado Web Server - <AUTHOR> http://groups.google.com/group/python-tornado/browse_thread/thread/9a8bf0f62330f99b?pli=1 <comment><USER2> I'm probably missing something, but what's the point of using something like Tornado to handle loads of concurrent connections when your database can only handle a small number anyway? All those epolls will slow the app down, waiting on a connection from the db pool.

Check out Concurrence instead: <http://opensource.hyves.org/> At least that's got an async MySQL driver</comment>


Turn Your Smartphone into Any Kind of Sensor - <AUTHOR> http://www.nasa.gov/offices/oct/feature/turn-your-smartphone-into-any-kind-of-sensor <comment><AUTHOR> [1] Original Article: "NODE+ Platform Integrates Sensors with Smartphones" [http://spinoff.nasa.gov/Spinoff2016/cg_1.html](http://spinoff.nasa.gov/Spinoff2016/cg_1.html)</comment>


Is Docker Swarm Scheduler broken deliberately? - <AUTHOR> http://blog.megam.io/megam_docker_swarm_is_a_rip_off/

<comment><USER2> This seems like fairly boilerplate code to make sure you don't encounter conflicts in the scheduler across various goroutines.

I'm curious how long the wait was as it had to be pretty serious to explicitly make the code thread _unsafe_ to "fix" it.

</comment><comment><USER3> Mesos is written in C++. Mesos upstream is also looking to entirely remove the Zookeeper dependency so blind Java / JVM hatred is kind of stupid. Mesos is battle tested in multi thousand node clusters.</comment>


Git: Using Different User Emails For Different Repositories - <AUTHOR> http://orrsella.com/2013/08/git-using-different-user-emails-for-different-repositories/ <comment><USER2> There is better option.

You can have different email/name in <RepoRoot>/.git/config file.

For example:

#cat /home/test/project1/.git/config

[user]

         name = First Name

         email = firstname.lastname@example.com

#cat /home/test/project2/.git/config

[user]

         name = Second Name

         email = email@example.com

Ref: [http://git-scm.com/book/en/Getting-Started-First-Time-Git- Se...](http://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup)

I hope it is clear. Let me know if it needs further explanation.

<comment><USER3> Please read the article again. Per repo config is addressed before coming to the main point of the article - setting the said config every time you clone / init a new repo.

<comment><USER2> Yes, looks like I jumped to commit hook section directly.</comment></comment></comment>


Confirmed: Delicious Founder Joshua Schachter Joins Google - <AUTHOR> http://www.techcrunch.com/2009/01/12/confirmed-delicious-founder-joshua-schachter-joins-google/ <comment><USER2> Congrats to Joshua. One of the more amazing things early on at digg was how open and willing he was to share advice and knowledge with what must have looked like a competitor.

</comment><comment><USER3> If I were in his shoes, I'd do another startup. Why would you become a corporate bitch again, after you tasted the freedom of doing your own thing?

<comment><USER4> Not every place is bad or treats their employees badly.

It is an interesting opportunity, so I'm trying it on for size.

<comment><USER5> Congratulations Joshua!</comment></comment></comment>


SocialHistory.js: See Which Sites Your Users Visit - <AUTHOR> http://www.readwriteweb.com/archives/socialhistoryjs_see_which_site.php <comment><USER2> I wonder what other creative uses there are for this. For example, if someone visits digg you know they are likely to be a techie. If they visit seattle.craigslist.com you know they are likely to be in Seattle. If they visit drudgereport they may be a news buff. You could create a collection and if there user uses your site a lot you could try hundreds of things and pass them back to the server....interesting...

</comment><comment><USER3> I'm suffering severe internal ambivalence; this is either great or terrible.

Business part of Jacob's brain: "Great" User part of Jacob's brain: "Terrible"

I wonder how the public would split? And then I realise there will always be more users than businesses.

</comment><comment><USER4> <http://news.ycombinator.com/item?id=78939>

You could use that as a barebones way to send data to google analytics or getclicky, or plug it in to a user profile (generated by yourself). Of course Aza's solution is waayyy more elegant.

And I'm sure firefox/opera/webkit will be closing up this vulnerability in the near future.

<comment><USER5> This is cool.

Last summer I had an inkling of an idea that used basically the same strategy. My idea (never implemented) was to set the background images on visited anchors to a dynamic image url that could be used to track pageviews from other sites, to perhaps determine what links from your site your visitors found most interesting, even if they didn't click to them _from_ your site.

There are plenty of terrible use cases for something like this, but also plenty of benign and probably useful cases as well. If you were a search engine, for example, you could determine if a user has been to sites that show up in the search results, even if they don't click on the links from your site.

The full write-up of my strategy is here: <http://tinyurl.com/6fnjod>

</comment></comment><comment><USER6> This is not the scariest hack that can be done with HTML/JS. There is another one that checks if you are logged in to some web site, your bank for instance. Once a malicious page finds a site you are in, a hidden iframe can click on links and even submit forms on your behalf.

</comment><comment><USER7> <http://azarask.in/blog/post/socialhistoryjs/>

<http://news.ycombinator.com/item?id=201912>

</comment><comment><USER8> Phew, this is way less creepy than I thought from the title. At least they have to specify the sites.

</comment><comment><USER9> nice hack!

</comment><comment><USER10> clever</comment>


TapeDeck Goes Exclusive to the Mac App Store - <AUTHOR> http://supermegaultragroovy.com/blog/2011/01/06/tapedeck-on-the-mac-app-store/ <comment><USER2> It seems like a number of apps will probably do this. For instance, I can't find Twitter for Mac outside of the app store, which is disappointing because I'm still on Leopard, stuck with Tweetie 1.2.8. I would say to be wary of losing your Leopard user-base, but being on the Mac App Store probably will give you enough exposure that you'll make up for it and more.

<comment><USER3> I think there's not much benefit of staying on Leopard if you run an Intel Mac these days. The upgrade cost is pretty cheap, and the benefits do developers are quite heavenly.

I've been keeping Leopard support in TapeDeck because it's been pretty easy to do so, but with the work I'm doing on 1.4 right now, I've been tempted to hit that kill switch...(But I won't.)

<comment><USER4> I'm curious- If you're distributing through the AppStore only, and the App Store doesn't support 1.5, why maintain the code?

<comment><USER3> You mean 10.5, right?

I've got a fairly large install base, and I'd like to keep them happy if at all possible. In the future, when I have to get them to buy a v2 release on the App Store, then ideally I've made a good impression on my customers and they'll happily buy a license.

It's also not that big a deal to do. As long as the developer tools continue to let me target 10.5 from 10.6, I'll be OK.

<comment><USER4> Yes, I meant 10.5, sorry.

I hadn't thought about upgrades for existing customers, that makes quite a bit of sense. I was only considering that all New customers were 10.6+, so targeting 10.5 didn't make much sense.

Thanks for clearing that up!</comment></comment></comment></comment></comment>


Ghost ships: Bodies and boats unsettle Japanese community (2017) - <AUTHOR> http://edition.cnn.com/2017/12/22/asia/japan-north-korea-ghost-ships-intl/index.html <comment><USER2> There is a very long history of Japanese ships, also not well suited for open ocean travel, being caught in currents in the Pacific, and washing up in Oregon, Washington, and other areas. Some stories go back to the 1600's. I can't find the reference, but I read of a Japanese sailor who washed up on the Baja Peninsula in the early 1600's and lived there afterwards.

Here's one story - someone who washed ashore in 1832 in Washington state: [https://en.wikipedia.org/wiki/Otokichi](https://en.wikipedia.org/wiki/Otokichi)

<comment><USER3> Cheers for this. What a life Otokichi had!

<comment><USER4> Yeah, what a life, without his family friends.</comment></comment></comment>


U.S. counties with the highest annual savings potential - <AUTHOR> https://www.interviewqs.com/blog/location_col <comment><USER2> That's a terrifying map -- the vast majority of the USA is red as in "negative net savings on average."

<comment><AUTHOR> Yep - almost as scary as the stat that "40% of American adults can't cover a $400 emergency expense"[1]

[1] [https://www.cnbc.com/2018/05/22/fed-survey-40-percent-of- adu...](https://www.cnbc.com/2018/05/22/fed-survey-40-percent-of-adults-cant- cover-400-emergency-expense.html)

<comment><USER2> If something isn't done, the next populist demagogue will make Trump look like a kitten.</comment></comment></comment>


China warns US on South China Sea row as Clinton visits 1 hour ago - <AUTHOR> http://m.bbc.co.uk/news/world-asia-china-19473141?

<comment><AUTHOR> Test</comment>


Apply HN: Coporter – Secure and searchable contact management for journalists - <AUTHOR> Coporter is a contact and story management application that allows journalists and content makers to keep track of their sources, notes, and media securely in the cloud. Think of it like a CRM combined with Evernote, but designed around the needs of reporters and newsrooms.
In many newsrooms there is increasing pressure on journalists to cover more stories with less resources, but Coporter will make that burden easier. Journalists will be able to store details on sources, notes on conversations they've had, quotes from people they've talked with, links to previous stories they've featured in, and even upload photos or video. All of the story data will be searchable and available securely through web or mobile devices. When a journalist wants to find information on a person they spoke with a year or two ago they will have all the information available to them in an instant.
Coporter would be available as a free product, but with reduced features. Users will pay to unlock extra features (e.g more storage).
I'll target the product at individual users but I'd like to also create an enterprise version that can be sold to media companies and integrated into their publishing workflows. In this version, journalists will be able to work together with other reporters to collect and assemble stories, and share information securely with their co-workers.
Why build Coporter? - I'm a digital producer and journalist with experience working in newsrooms across Australia and I've noticed a need for a tool to help with the reporting process. Whilst there are some tools to help find stories on social media or to help you publish content - there aren't any useful tools to help with the day-to-day content gathering process.
Coporter is a tool that I desperately need to do my job, one that would make my work more efficient, and one that other reporters have told me they also need.
YCF would allow me to spend time building Coporter and making this a reality. <comment><USER2> A couple of thoughts:

My concern is that a monetization strategy where the paid tier is for commodity services like "more storage" directs the project toward building a monolithic silo. From where I sit on the internet, this looks counter to the trends of business software in general and the direction of journalism in particular.

One successful strategy for free software companies might be applicable here. A basic product that does everything at small scale and then building paid enterprise features on top of it. For example dashboards that only make sense at scale.

I'm not pushing this as free software, but by analogy I see an opportunity to have a free tool that works for an individual reporter and paid tools that work and only make sense for a news room.

On the other hand, I think there might be merit in considering a free or open source model for the software because another trend I see in journalism is software eating the delivery. Big news institutions are tech companies [Yesterday I noticed _The Guardian_ recruiting developers via browser debug screen] and independent journalists are often managing blog software.

The other trend I see in journalism is the rise of data analysis. Again this is tech and software and the winner is likely to be integration of open source tools rather than monolithic silos.

Anyway, very interesting. Good luck.

<comment><AUTHOR> Thanks for your thoughts! It's a really interesting observation you make regarding the paid tier and rise of data analysis.

I have spent a lot of time thinking about what would be the right way to go with monetisation and I'm still refining that aspect of the idea. In many ways I won't know the right strategy until I launch and iterate, but my initial thought was to limit the software by number of contacts someone would upload or security features. However after receiving some feedback from other reporters I decided to give all that functionality by default and just restrict based on storage space, or extra search functionality etc.

But I actually really like your idea of making the paid features the enterprise ones. This could very well be the direction I head in as it definitely makes a lot of sense. There's a lot of money in enterprise apps for newsrooms and it's probably easier to do this as a paid tier option rather than going B2B - that way it's more accessible to the people who make day-to- day decisions.

<comment><USER2> A couple of additional thoughts about storage.

1\. This seems like a headache for both journalists centering around confidentiality and for a SaaS platform centering around being a target for attack and potentially breaching confidential information. In the journalism the adversaries can be state level actors and the level of expertise required to hold them off is expensive.

2\. Holding data hostage isn't going to bring joy to users. Neither will security. It is always going to be taken for granted until something fails. And a company that stores a lot of data is a single point of failure.

4\. Aesthetically or philosophically if you prefer, there's something to be said for a symmetry of openness to public scrutiny between the goals of journalism as the fourth estate and an open source software.

5\. Maybe there is an analog in Git (store data where ever is convenient) and Github a business based on commercial service on top of a free technology.

6\. The growth model of infiltrating at the level of individual choice eventually making management spend money is how Apple entered enterprise [journalism being an exception at least in the US where Apple was already common].

Anyway, having fun thinking about it. I really like the idea. There's a lot of space between Wikileaks and enterprise software.

<comment><AUTHOR> Thanks! I really appreciate your questions and insight.

Definitely the biggest issue is security and confidentiality. Everything will need to be encrypted from day 1 - just in case it does become the target of an attack. I also need to include additional security measures to allow for anonymous or confidential contacts.

I also love your git analogy and is definitely giving me something to think about.

</comment></comment></comment></comment><comment><USER3> I'm worried about a disconnect with the actual workflows of journalists. In my very limited exposure to journalists, they take notes in a journal and probably make digital voice recordings. Is this still true? If so, how will you convince someone to input notes into your app?

I can see some value in organizing research, but how would you help me do this better than I can with say, evernote, or pinboard?

<comment><AUTHOR> You're absolutely right and there's particular reasons journalists work like that. One reason being security, and the other being there's currently no better way to take notes or store story data. Also those notes aren't searchable if I need to access them at a moments notice.

I'm not saying that a reporter won't use a notebook - but reporters have to keep these notes for years and over the course of a career you might go through boxes and boxes of notepads. And what happens if your editor asks you to call someone you did a story on 4 or 10 years ago? Those notes could be stored in a box at home so may not be easy to access. They also are your security if someone sues you or your company and could be used as evidence so you have to store your notes somewhere. And if you're someone who takes voice recordings, where do you store these securely? And what do you do if you have a mixture of written notes and recordings on someone?

I've also spoken with many reporters who store their contacts on their iPhone... but then never back those contacts up. If they lose their phone they lose all that information. I worked in one newsroom where many people stored their contacts in a word document, and in another newsroom they were stored in this archaic television broadcast software not designed for the purpose. It's just a really inefficient and insecure way to work.

Evernote is great - I love it as a product. But it's not designed around the way reporters work or the type of information we collect. That's why I see the value in a new product.

The main thing I need to do is convince reporters of the value in having that information stored in Coporter, and if I can get digital staff using it then they will encourage other reporters to use it.

<comment><USER2> It seems like there are two separate interests: long term storage and quick retrieval. The first requires a very high standard of care in regard to reliability [I'd bet disks go bad and companies go out of business more frequently than reporters who care about such things lose a file box full of notepads]. It feels like hardware.

The second seems an expectation of technological progress problem. Maybe it is software over the hardware of the first problem.

Rather than convince people to switch from what mostly works to the unknown, make the mostly what works work a little more often. There's a regression test there.</comment></comment></comment>


How not to go broke building your startup - <AUTHOR> http://thenextweb.com/entrepreneur/2013/12/19/go-broke-building-startup

<comment><USER2> "Know your limits beforehand."

I know a lot of entrepreneurs want to just jump in and take on the world, but this advice is awesome. Don't be pessimistic, believe you can do great things, but there are definitely limits somewhere. Knowing them can help mitigate disastrous failure.</comment>


$12 Billion Shipped to Iraq, $9 Billion 'Unaccounted For' - <AUTHOR> http://www.vanityfair.com/politics/features/2007/10/iraq_billions200710?currentPage=all

<comment><USER2> [2007]

Very sad that no one in any semblance of power takes any responsibility for seeing this sort of thing sorted out. Mind-boggling amounts of money, that almost every human on Earth dreams of and works tirelessly towards, squirreled away by opportunistic bastards.

</comment><comment><USER3> After reading this :[http://www.rollingstone.com/politics/news/the-real- housewive...](http://www.rollingstone.com/politics/news/the-real-housewives- of-wall-street-look-whos-cashing-in-on-the-bailout-20110411?print=true)

I am starting to get very very pissed off.</comment>


FarFaria: Netflix for children's books  - <AUTHOR> http://content.usatoday.com/communities/technologylive/post/2012/05/farfaria-netflix-for-childrens-books/1#.T7Ezpp9Ys2B

<comment><USER2> That's not Netflix for children's books. That's an app with 100 books in it (particular books that have been written for the app, not familiar children's books).

Now your local library... THAT is Netflix for children's books. Except that, unlike Netflix, it is free. At least for now... our library system is under attack and unless things change, free public libraries may not exist in a generation.

</comment><comment><USER3> Really cool concept, good business model, well made app. Definitely recommended for any geeky parent with kids who wants to bring the modernity of 21st century technology into the multi-millenia old act of telling stories to the younger generation before the night falls.

That being said, their massive amount of content is produced by underpaying recent grads from top art schools (my girlfriend did some work for them). That way, they get extremely high quality illustration skills for an extremely low price.

I hope that situation will change soon— children oriented iPad apps are taking off, and high quality illustrations have a big role to play in that— I think parents appreciate the value in a finely drawn story. But yet illustrators are still very much underpaid, especially in contrast to the developers of these apps.

<comment><USER4> I feel for the illustrators, but its supply and demand in effect. There are lot more good illustrators than good developers out there.

<comment><USER3> Very true. But I do hope that the rise of the iPad creates a bigger demand for talented illustrators.

</comment></comment></comment><comment><USER5> We are still doing the library for the young ones - I don't see myself wanting my offspring staring into the bright iPad screen all day reading or especially before nap and sleep at night when it can disrupt them.

<comment><USER6> Can't you dim it? If the iPad is brighter than the other surfaces around it, it's not set correctly.</comment></comment>


More on Nintendo and Handheld Gaming - <AUTHOR> http://daringfireball.net/2013/09/more_on_nintendo

<comment><USER2> I wonder why many Apple faithful are obsessed with what Nintendo does or doesn't do, should do or shouldn't do. Maybe they're secretly angry that the current CEO of Nintendo started programming on a Commodore PET, and not on an Apple device.

<comment><USER3> it's simple. they want to play Nintendo games on Apple hardware</comment></comment>


How to pitch bullshit - Slides from a cynical talk - <AUTHOR> http://www.slideshare.net/derwildemomo/how-to-pitch-bullshit

<comment><USER2> One or two chuckles here, but overall not worth the time.

<comment><USER3> the real presentation (android developer camp stuttgart) was hilarious.

sadly no video capture available :(

</comment></comment><comment><USER4> Good points about communicating your idea to your mother-in-law and using pictures to avoid the tl;dr issue.

The advice in here would have been helpful to the Google Wave team I think.

Communicating complex technical ideas is hard. Whenever we have an idea for a project, we see if we can sum the project up in a 5 or 6 word slogan. If we can't, it's too complicated and we ditch it.

<comment><USER5> I dont think the pitch of Wave was bad... just the UI and the lack of integration with your existing contacts.

<comment><AUTHOR> +1. The pitch was after all the best part, remember the expectations just after the announcement?

<comment><USER4> I remember an hour long video I had to sit through just so they could give the basic gist.

(I say this as a fan of Wave btw, used it on many projects very successfully, exceptionally sad to see it go)</comment></comment></comment></comment>


The Other as Noise - <AUTHOR> https://reallifemag.com/the-other-as-noise/ <comment><AUTHOR> Also, close cousin of misophonia is hyperacusis, an "abnormal intolerance, a heightened sense of volume and physical discomfort from ordinary, everyday sounds, which other people can tolerate well."

[https://www.dineenwestcottmoore.com.au/services/hyperacusis-...](https://www.dineenwestcottmoore.com.au/services/hyperacusis- and-misophonia/)</comment>


Rails has a younger brother — we are AngularJS developers - <AUTHOR> http://cloud.hussa.rs/6Y8H/BRc0ucSY

<comment><USER2> We are just developers.

<comment><USER3> Absolutely. I see this need to form tribes based around language and technology really, really bizarre.

(EDIT: I understand it's human behaviour, but most of us developers can get on with their job, picking the best technology for each solution, without chest- beating.)

<comment><USER4> When you know one thing really, really well and it's a niche, it can seem be in your best interest to setup camp or form a tribe, or whatever...maybe not the case here but I see it a lot, DBAs specifically come to mind.

<comment><USER5> I don't think Rails or Angular dev is "a niche".

</comment></comment></comment></comment><comment><USER6> Personally I think Ember is closer to being Rails younger brother due to philosophies. I'd love to hear in detail why you picked Angular over Ember and (understandably) Backbone.

<comment><USER7> And Ember shares a core developer with Rails. That said, they are different things, but Angular seems to be taking a jQuery-esque position against Ember's Prototype, IMHO.

</comment></comment><comment><USER8> sorry, but..who gives a shit?

<comment><USER9> People who read this article and upvote it, i guess.

</comment></comment><comment><USER10> The Rails & Angular combination should have a name like Rangular og RoRA. ;-)</comment>


US millionares took $80 Million in unemployment benefits last year - <AUTHOR> http://www.bloomberg.com/news/2013-04-05/millionaires-got-80-million-in-jobless-aid-in-recession.html

<comment><USER2> >Yet the unemployment aid to millionaire households underscores the lack of means-testing in some federal aid programs

Seriously, I don't think the author understands how unemployment insurance works. Firstly, it's insurance. You _PAY_ a premium based on a percentage of what you make. If you make more, you pay more.

Then, when you loose your job, you file a _claim_. This is _NOT_ aid, it's an insurance program.

That said, I've never taken it, but I see the state skimming 1.9% every paycheck and plan on filing my insurance claim if I ever need to.</comment>


Ask HN: efreeme.com Head to head with etsy.com, marketing help? - <AUTHOR>

Okay. I've built the site efreeme.com, proven it works, done the bare minimum required to get it off the ground, however now I'm looking for the marketing angle to push this. Any ideas?<p>My big competitive advantage over etsy.com is that we are completely free for both the buyer and sellers. <comment><USER2> Well your proposition is buy and sell handmade goods at no additional cost. Market that angle.

But I think soon you'll find you want a new proposition. There is a lot of work involved in processing payments, dealing with chargebacks, keeping customers happy, etc.

It looks like your revenue model is completely ad based? You need a way to start getting money now, rather than earning spare change each month via adsense.

Running customer service and daily operations take money. If you don't value your time (more than just spare time if you want this to grow) or don't mind paying out of your own pocket for someone else's time, I think you'll need to start taking a cut somewhere.</comment>


Offer HN: Lunch with AirBnB and other startup Founders - <AUTHOR>

So we just launched Skyara.com to the public and to our great surprise, one of the AirBnb founders offered to do lunch with people!
So there's a couple of spots left for lunch so I'm letting the rest of the HN community know about this event.
Also, you can book an exclusive behind the scenes look at i/o Ventures or chill with some of the other Skyara team members.
In the spirit of Offer HN, if would be cool if you guys can list some of your own experiences for booking as well. You can make them free if you like or donate the proceeds to a charity.
AirBnB Lunch: http://www.skyara.com/lunch-with-airbnb-cto-co-founder/san-francisco/69 <comment><USER2> Very, very cool. The fact I'm instantly down my CC info and $60 on three purchases is some incredibly convincing concept validation for myself, but the potential here, both in terms of impact and unique experiences, is unimaginably cool.

One important thing to note, you need to make your referral codes and messaging (i.e. refer a friend and you both win) more prominent. I told my friend about the site and when he asked me for a referral code, I had no clue what he was talking about, since apparently you don't get a referral code if you sign up in the purchase flow and I had to sign up with a secondary fake account to see what the deal was. So you probably want to:

1) Make the referral code actually accessible on the account page (It currently isn't there at all? Unless I'm in some n-way test?)

2) Make the referral code available on every completed transaction. Personally, I'd also recommend tossing in that cute turtle that appears during signup :)

3) Send the referral code, and whole welcome email, for that matter, to the user if they come in through the payment flow.

4) Add an entry on how to find your personal referral code in the FAQ.

Given the empirical success of such tactics (PayPal especially comes to mind) and especially given that many people will want to enjoy these experiences with their friends, you really want to make sure the user is aware of the promotion. Obviously, there are some considerations regarding the cost as you give out $10 and make less than 12% back after fees, but if you're going to run it on the traditional sign-up flow, you might as well put it everywhere. Especially since people who sign up via the purchase flow or make a purchase would be much more likely to refer their friends, since they've already validated the service.

Anyways, congratulations on the launch. See you guys at lunch ;)

</comment><comment><USER3> Link for the airbnb lunch: [http://www.skyara.com/lunch-with-airbnb-cto-co- founder/san-f...](http://www.skyara.com/lunch-with-airbnb-cto-co-founder/san- francisco/69)

I'll offer one: [http://www.skyara.com/lunch-with-a-skyara-founder/san- franci...](http://www.skyara.com/lunch-with-a-skyara-founder/san-francisco/14)

<comment><USER4> I'll gladly accept, and congrats on the launch!

</comment></comment><comment><USER5> The Dirty Jobs for Everyone aspect seems really fun.

</comment><comment><USER6> Very cool, I think I'm going to sign up for the Ranger fitness training.

<comment><USER6> Also a couple of usability notes:

\- I can't click on the menu stuff at the top right to open in a new tab (using Google chrome on windows) \- It would be nice if the search results had paging options at both the top and the bottom so I don't have to scroll up to the top every time I want to go to a new page.</comment></comment>


YouTube Applause Explained: New Video Button Costs $2 per Click - <AUTHOR> https://screenrant.com/youtube-viewer-applause-button-explained/ <comment><USER2> That sounds good.</comment>


Zen and the Art of Unit Testing - <AUTHOR> http://marcin-chwedczuk.github.io/zen-and-the-art-of-unit-testing <comment><USER2> I see this type of mock-heavy testing in lots of places. I used to do the same thing too, but I found that it basically just tightly couples your test to your implementation details. The whole purpose of unit tests is to be able to refactor things with confidence that your tests will still pass. If you so closely tie your test to your implementation you lose that.

In the example, the tests now really care about how data is being retrieved from the database. Instead, I'd use an in-memory database (or even a Dockerized one). That would then also test that the right queries are being done, but you could still refactor the internals of UserServiceImpl (terrible name btw) and your tests wouldn't fail.

<comment><USER3> I tend to do mock-heavy testing in Java projects, and it has burned me several times. You write mock tests along your architectural boundaries, but if those need to change due to a deeper refactoring, all your tests need to get refactored as well.

Mock testing essentially tests expected side effects. A more powerful concept is the use of pure functions wherever possible, so that your tests compare input/output pairs, instead of long, difficult to maintain and sometimes non- exhaustive lists of expected side effects.

Does anybody know how one can replace Services, Controllers, Presenters and other such imperative mediator objects with a more functional approach? I'm just speculating, but that should make test maintenance easier.

<comment><USER4> Take a look at Gary Bernhardt's talk "Boundaries"[1]. It touches on this very topic and was quite the eye-opener for me (having experienced all the same issues you've described).

[1][https://www.destroyallsoftware.com/talks/boundaries](https://www.destroyallsoftware.com/talks/boundaries)

<comment><USER3> I think this may hit the nail on the head, gonna check it out later. Thanks!

</comment></comment></comment></comment><comment><USER5> I must be one of the few who think this sort of unit-testing is necessary to a certain extent, but in practice seems rather to lend itself to causing terrible code smells all over the place: things like small one-liner functions for conditionals and basic arithmetic that are designed with mock- and test- ability in mind (rather than whether or not they make the code maintainable or correct), factoring code specifically to increase "code coverage" of the tests, etc.

I think integration and other coarse-grained tests are far more useful more often, and using asserts (which will cause these coarse-grained tests to fail, too) is a better pattern than "unit test all the things".

<comment><USER6> I've heard these change to design tradeoffs that occur to increase testability, test induced design damage _.

_ Enterprise craftsman I believe

<comment><USER5> This sort of rigid adherence to a particular paradigm isn't restricted to enterprise developers. I've seen this sort of thing in practice (or attempted) from colleagues in data pipelines for machine learning and other very much not-enterprise settings.

<comment><USER7> I find such religious devotion rules common among scientists who have to code even though they are not programmers by trade. Religious overcommenting etc. Whatever rule they happened to read in their FORTRAN-for-beginners book.

ML people are probably more knowledgeable, but their job is also often more like science than traditional software engineering.

<comment><USER5> That doesn't match my experience (as a former academic scientist who moved into software development). The governing rule for us was always "publish or perish." Programming was a means (exploring a problem) to an end (advancing knowledge and publishing the results). I, at least, never came across the jargon for testing, maintenance, etc. until I moved out of academia and into this industry.

<comment><USER7> Oh I agree, scientists are far less inundated by software "best practices" than professionals. It's just that those which they have heard of, they often stick to religiously.

Personally I prefer the results of these scientists to much of what I see from real software engineers. It might be wreck, but it is only 1000 lines of wreck -- and not a sophisticated wreck created with powerful modern tools.

</comment></comment></comment></comment></comment></comment><comment><USER8> Misleading title - there is absolutely no Zen in this article. The nearest it gets is a quote from Confucius, who wasn't a Buddhist.

<comment><USER9> I wish people would stop using that title. They seem to think it is a clever click-grabber, which is probably true for most people, but for those even remotely familiar with the book, _Zen and the Art of Motorcycle Maintenance: An Inquiry into Values_ , opening up the article and finding no application of Pirsig's Metaphysics of Quality is disappointing.

<comment><USER10> there's plenty of such things... "X considered harmful" seemed to have an uptick in usage for a while.

<comment><USER11> also "what we talk about whwn we talk about...", "the unreasonable effectiveness of ..."

</comment></comment></comment></comment><comment><USER12> I've been writing tests for a long time, and I went through a phase where I depended heavily on DI. While it's still useful in some conditions, I rarely make use of it.

First, DI is simply the least subtle for of IoC available. When all else fails, you can always rely on DI. But, this is something languages should be looking to help developers with. Elixir, for example, supports IoC as part of the language, and is much more elegant than DI [1]. When monkey patching is available, this is also a possible solution (easy to abuse, yes, but suitable in simple cases). Functions as first class values can also help (instead of passing a clock around, you can have a SystemClock.Time func that you can override in your tests, which is similar to what Date.now() is in javascript).

But, perhaps more importantly, and as much as I tried to deny it, integration tests are absolutely and totally worth the trouble. If you unit test two parts independently, you run the very real risk of having them pass under test, but fail once deployed. I've seen more production downtime caused by incorrect assumptions between services than anything else.

Also, lately, I've been writing more and more fuzz tests. I'm probably not very good at it yet, but I think for the couple of projects we did it, it's been a worthwhile effort (moreso when we started...they barely catch anything now since we're all coding much more defensively).

[1] [http://openmymind.net/Dependency-Injection-In- Elixir/](http://openmymind.net/Dependency-Injection-In-Elixir/)

<comment> UK-AL Nobody denies integration tests are good. You just don't want your unit tests to be integration tests.

Unit tests are meant to be fast, and quick to isolate the failing code.

<comment><USER13> If you make your so-called-'unit' tests too closely coupled to you don't actually work faster though, because you constantly have to refactor them to match the internal implementation.

Your testing feedback might be quicker, but quickly getting useless information (ie. your implementation changed) is just as bad as slower tests, because you need to fix the test, recompile and again before you get useful information.

Also not all 'integration tests' are slow. If you can test using SQlite in memory, instead of pointing at a PG instance that needs to be provisioned, for instance, you can get a lot of your end-to-end testing running really quickly.

<comment><USER14> Try CREATE TABLE UNLOGGED with postgres. The diversity of RDBMS and SQL dialects defeats the point of integration testing the persistence layer with SQLite.

<comment><USER13> Yes, but a large portion of code that needs testing is simple inserting, queries and joins, and SQLite can do this without any problems.

You can push complex or db-specific work to slower test groups, but not everything requires it.

<comment><USER10> even this is less clear - for some dbs it's normal to use a sequence for rowid's (vs some sort of autoincrement) and i don't think sqlite offers all the same behavior there.

</comment></comment></comment></comment></comment></comment><comment><USER15> I found the art of testing is more tied to the reality on the ground as opposed to the testing methodology.

1\. Do you have a a QA department doing manual or even automated testing? 2\. Do you have performance testing? 3\. Is the code base large or small? 4\. Transactions versus analytics? 5\. Social media? Some code doesn't need testing. Facebook doesn't test their code.

Each new project requires a flexibility to understand the reality of time and resources available for testing, the type of application and performance considerations. If one works at a bank or on transactional software then testing needs to verify exactness. If you are working on analytical software then what's another anomaly between friends, errors in your errors, who cares. If you are working on social media then just pump and dump like NodeJS.

That is the art of testing to me. A mind set of one size fits all with respect to the of value unit testing, integration testing, regression testing or manual testing is the opposite of art: it's ideology.

</comment><comment><USER16> > Without DI you are forced to write slow and difficult to maintain > integration tests instead of unit tests.

Integration tests are worthwhile even if you do have unit tests. They serve different purposes.

<comment> UK-AL Yes, but you keep them separate from unit tests. Unit tests should be fast to run, for quick feedback.

</comment></comment><comment><USER17> > String newPasswordHash = cryptoService.sha1(newPassword);

Ouch. It's 2017. I know it's a blog about unit testing, but using SHA-1, let alone unsalted SHA-1, for password hashing even if for illustration purposes is dangerous.

<comment><USER18> At the risk of spitting into the wind, so is using String in Java for passwords; the actual password-centric interfaces in the JVM use char[] because one can zero-out those, but cannot zero-out immutable Strings

</comment></comment><comment><USER19> It's a shame that the functional requirements, which were neatly stated in the spec, weren't preserved in the test code.

Rather than "arrange", "act", "assert", I've taken to writing the Gherkin spec inline with the test code, e.g.

      @Test
      public void onlyExistingEmailsCanResetTheirPasswords() {
       //Given an email address which is not in the database
          String email =  "firstname.lastname@example.com";
          when(userRepository.findByEmailAddress("email@example.com"))
    	   .thenReturn(null);

       //When a password reset is requested for that email
       UserServiceImpl userService = ...
       userService.startResetPasswordProcess("firstname.lastname@example.com");

       //Then no password reset notification should be sent
       verify(notificationService, never()).sendResetPasswordNotification(any());
       //And the user should be given a success message so they can't determine if the email address is already present
       verify(userInterface, once()).sendMessage("You have been sent Please check your email.");
      }

This way you preserve the intent for the programmers that will come after you, but you don't need a complicated Gherkin runner

</comment><comment><USER15> Testing cost money.

I find it very unusual to talk with developers who regularly modify their testing practice based on time and money.

The most expensive is to do it all: unit testing, integration testing, component testing, system testing, end-to-end testing, stochastic testing, performance testing.

The art of testing in no small part comes down to the art of money. How much bang-for-the buck does any testing provide given limited resources? I answer that question.

</comment><comment><USER15> Understand the workload.

Take the workload difference between in house versus public usage.

If one releases software into the public domain then one has no reasonable expectation as to the kinds of data driving your code. For this kind of general purpose, heavily reused software then code coverage with, unit testing and mocking makes the most sense is my experience.

However, one can also write code for a very specific, limited usage. In those cases I find regression testing with regression data works best. They are not paying me to find bugs to satisfy code coverage.

I find understanding the workload is a significant factor in determining the kinds of testing I use.

</comment><comment><USER20> > startResetPasswordProcess_givenEmailOfExistingUser_sendsNotificationToUser

It's sad that this is the state of the art when unit testing (but I have not found any viable alternative when the premise is that I have to use JUnit).</comment>


Kevin Rose doesn't deny Digg has secret editors - <AUTHOR> http://valleywag.com/346642/kevin-rose-doesnt-deny-digg-has-secret-editors

<comment><USER2> _"The consequences are stunning: Digg is not a democracy of news, and the way headlines make their way to Digg's homepage are neither fair nor transparent."_

LOL, some people act as if Digg is a nation-state or, even, Google. Was there really anyone out there who thought that Digg has no moderators for spam, kiddie porn, etc?</comment>