A Reply to "Let's stop copying C" - <AUTHOR> https://www.gingerbill.org/article/2020/01/25/a-reply-to-lets-stop-copying-c/ <comment><USER3> >NULL/nil is just one of many invalid memory addresses, and in practice most of invalid memory address are not NULL.

I want a language that can check at compile/check time that none of my pointers will have invalid addresses. Recognizing null as just another invalid value makes it more obvious to me that I want a language to handle it differently than how C does it.

In memory-safe languages, it's already unthinkable (/ very rare outside of situations where you're deliberately doing unsafe/native code integrations) to get non-null invalid pointers that point to a different type of thing than you want. When was the last time you had a Java program crash because a typed reference actually had a different type of reference at runtime somehow? Isn't that great how that basically never happens? -- But if you consider nulls a different type of reference, then it does actually happen sometimes. It would be great if we could try to close off that issue.

I'm a huge fan of languages with non-nullable references as the standard, like Kotlin, Typescript, and Rust. In my experience, it's much easier as a programmer to understand how a codebase uses nulls when the codebase is in a language with default non-nullable references, and therefore null-related issues where a future programmer passes a nullable value somewhere it shouldn't be happen much less often.

<comment><USER4> > I want a language that can check at compile/check time that none of my > pointers will have invalid addresses.

This is incompatible with pointer arithmetic, as it would require to solve the halting problem. You could, still, verify it at run time.

<comment><USER3> Right, but another option is to eschew pointer arithmetic. Iterators in many languages address many usages of pointer arithmetic, and can be designed to compile to the same sort of code as pointer arithmetic-using C compiles to.

C wouldn't ever be able to take out pointer arithmetic, so I worry anyone envisioning a new language as some diff from C is probably going to get stuck on that sort of thing too. I'm a big fan of the original referenced article by Eevee for bringing this sort of thing up.

<comment><USER5> Pointers and pointer arithmetic are a physical reality. If you forbid them you are necessarily limiting yourself. It's a tradeoff.

Iterators may work only very locally, or require garbage collection, for example.

Static option types add complexity to the typesystem and require many typecasts in practice (which can me made safe with runtime checks and panics, but they are a hassle).

<comment><USER6> The problem with pointer arithmetic in C is that it's the _default_. Every pointer implicitly supports it, even though the vast majority of them point to a single object of a given type, and so it doesn't really make sense for them. So it's much easier to get an invalid pointer than it ought to be.

The obvious fix, as seen in e.g. Zig, is to have different types for pointers to objects and pointers to arrays. But once you have that, you can relegate the latter to the "unsafe" opt-in subset of the language.

<comment><USER5> I've worked on a hobby programming language where I've made that design decision, too. But it makes pointers less general. Single "Objects" are arrays of length 1, but not in the type system. And in practice it often happens that I want to treat an object as an array of length 1.

On the other hand I can't remember that I've ever given a pointer to an object that was treated as an array. I figure it happens about as often, and is about as easy or hard to debug, as swapped function call arguments. Which is pretty rare in my experience. And my philosophy is that making separate types for things that are structurally the same is usually a bad idea. Because it splits your world in two.

</comment></comment></comment></comment></comment></comment><comment><USER7> TIL the C variable declaration syntax is meant to evoke how you would use the variable. For instance,

      int *x[3]

means that to get an int, I type

      *x[3]

(well ok, _3_ would be a poor choice). Whereas if I have

      int (*x)[3]

I'd dereference it as

      (*x)[0]

meaning, it's a pointer to array of ints, while the first is an array of int pointers.

This is mildly life-changing.

<comment><USER8> You got an off by one bug in your first example ;-)

<comment><USER9> If we used languages with 1-based arrays, then the first element was 1, the last was n, and find(x) could return 0 as an "item not found" marker instead of returning -1 or worse uint_max. Reasoning about counting from the end could be off-by-one easier: n+1-i instead of n-i-1, n-1-i or n-(i+1), whichever nonsense you like better. Looping: i=1, i<=n. Setting next: a[n+1]=x, where the capacity allows.

But when you mention one of these languages, you get a bunch of "oh, 1-based arrays, so uncool, not an option".

<comment><USER10> The downside of 1-based indexing is that pointer arithmetic stops being consistent with array indexing. Both approaches have downsides.

<comment><USER9> And one may see that as a nice way of ditching pointer calculus completely to the machine level where it belongs.

<comment><USER5> fact is, array indexing _is_ pointer arithmetic.

And how do you for example index an array of 256 elements with one byte, with 1-based indexing?

<comment><USER9> 257, 300, 100k elements? You do not index it with one byte, that simple. If that is a hard requirement (8-bit chip, low ram, etc), leave it to C _or_ a special syntax. __ptr_offset(p, n), p+n, p: array[0..n] of x, option base 0, you name it.

I mean, we can ask ourselves tens of such in-the-box questions for any feature that doesn't fit it, but out-of-box world doesn't really crave all of that by default.

<comment><USER5> No, I'm trying to show is that offset-indexing is the right way to do it: because it makes sense, mathematically. If you need more and better arguments, have a look at Dijkstra's "Why numbering should start at zero" (it also argues why we should have left-inclusive and right-exclusive bounds).

<comment><USER9> >...unnatural by the time the sequence has shrunk to the empty one. That is ugly, ...

I reread his article for clarity. He first makes the "ugly" argument, which originates from 1) natural number domain definition issues, and 2) only then he goes to the range definition argument based on 1). It may be valid when you're working in your mind on math problems of natural numbers starting* with 0, which is a self-referential argument btw. But it doesn't have to be applied to software arrays of items. Dijkstra's argument is repeated as a mantra, but the general consensus is that representation of natural numbers (unsigned ints) brings more issues than ought to solve, so we don't use them today, which defeats 1), and then 2) loses its causality.

>>find(x) could return 0 as an "item not found" marker instead of returning -1 or worse uint_max

Let's test that against Dijkstra's statement on range unnaturalness? Which is more unnatural, 0, -1, NSNotFound?

Programmatically it doesn't make any sense except in salary gains from mastering off-by-ones.

* Edit: natural numbers start differently in different countries, but you may s/0/1/ there and it still holds, because he speaks about domain borderlines. The same holds true for e.g. [321..500].

<comment><USER5> It's not about number definition issues. The argument is convincing that the difference of upper and lower range bounds should equal the number of contained elements, and that it's ugly to represent empty ranges with an upper bound that is lower than the lower bound. (I agree and I held that opinion before even reading this article).

Note that I rewrote his argument a little here, because it is not really about natural vs unnatural, but more about looking at the difference between upper and lower bound. Now, if I may presume that we can agree that the difference of the bounds should equal the number of elements, leading to left-inclusive and right-exclusive bounds, the question is would you rather have a lower bound of 0 (which is an entirely "natural" number that is already in the game for subsequences of length 0), or would you introduce an entirely new number for the upper bound, (size + 1), which also needs an addition operation to compute?

I don't care about definitions of natural numbers. As demonstrated, numbering elements as offsets makes a lot of sense for purposes of indexing, and if you insist on starting with 1, then you need to either lower your base pointer by 1, or subtract 1 at every indexing operation (both is not exactly simple), and you frequently need to add 1 to the size.

I have no issues with zero-based indexing, and I don't think I've ever had to write quirky code. The most "ugly" thing is that the last element must be indexed as (size - 1) (which also makes some sense, since the last element need not necessarily exist. The subtraction makes clear that this is dangerous).

> Which is more unnatural, 0, -1, NSNotFound?

I normally handle that as -1 which is absolutely ok, especially given that this value _is_ special. I concede that you might prefer 0 since that aligns well with evaluating truthiness of integers. It also makes a lot of sense (mathematically/programmatically) to use "size" (i.e. one-past-last index) as not-found, but that breaks when arrays are resized.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER11> The referenced article was discussed last year: [https://news.ycombinator.com/item?id=18977460](https://news.ycombinator.com/item?id=18977460)

and a bit at the time: [https://news.ycombinator.com/item?id=13079341](https://news.ycombinator.com/item?id=13079341)

</comment><comment><USER12> Hadn't read the original essay, but Eevee is always a great blog.

Honestly, Rust hits a lot of good points for me. My only concern so far has been `.await` and a minor concern that they'll keep adding junk and end up like Perl with too many features.

<comment><USER13> Rust has a standardized 'edition' system, so they can deprecate superseded/junk features from newer editions of the language while still playing nice with legacy code targeting an older 'edition'.

<comment><USER12> That's true and I hadn't really thought of it being used for removing features!

But, also, the features can only be removed from the language. The compiler must support them forever. :/

</comment></comment></comment><comment><USER14> I do not agree with all of them. I think assignment expressions is good, and textual inclusion is good (but should not be the only kind of inclusion), and increment/decrement operators is good, and macros is good (although the way C does it is not good enough; there are many things it doesn't do), and pointer arithmetic is good, and goto is good. But I agree with them that the C syntax for octal numbers is bad, and the C syntax for types is bad. Identifiers should not have hyphens if the same sign is also used as an operator. Strings should be byte strings which have no "default" encoding other than ASCII (although UTF-8 and other encodings are still usable too, if they are compatible with ASCII). Another problem with C is that it does not allow null declarations, and does not allow duplicate declarations even if they are the same. There are many other problems with C as well; some kind of low-level stuff is too difficult with C.

<comment><USER5> > Another problem with C is that it does not allow null declarations, and does > not allow duplicate declarations even if they are the same.

What do you mean here?

<comment><USER14> Well, it works now (so that problem no longer exists); but on the computer I used before this one, it didn't work.

</comment></comment></comment><comment><USER15> I'm having trouble following the negative modulo wording or formula. It says % and %% are identical for unsigned integers then below defines it as

a %% b == ((a % b) + a) % b

If that's the case I can't figure out how they are identical for unsigned integers. Or is that example only a hint for how it would work with negatives?

<comment><USER16> I don't precisely follow the text either; it looks like that formula computes ±(2a)%b.

Perhaps it's a typo for

a %% b == ((a % b) + b) % b

Which brings a negative modulus into the range [0, b)

<comment><USER17> I think you are probably correct. Lets try a set of simple cases.

        ( 4  % 3) == 1
        ( 4 %% 3) == 1

Are these two correct answers?

        (-4  % 3) == -2 ??
        (-4 %% 3) == 1 ??

Lets assume I got that correct and plug in some numbers.

         a %% b == (( a % b) +  **b** ) % b
        -4 %% 3 == ((-4 % 3) + 3 ) % 3
        -4 %% 3 == (-2 + 3) % 3
        -4 %% 3 == 1

However I think it would be clearer for maintenance if the extra operator wasn't used and instead some 'math.absolute()' function were used.

PS: Hopefully those are short enough to not die on mobile

<comment><USER18> It's definitely a typo.

Conceptually I prefer looking at them as

        a % b  = a - trunc(a / b) * b
        a %% b = a - floor(a / b) * b

The latter is even used as % in languages such as Python, which further compounds any syntactical confusion. :D

</comment></comment></comment></comment><comment><USER19> I hadn't given Odin a look before I read this post. As a fellow general purpose language author (Gosu) I applaud the author's pragmatic, albeit unpopular at times, point of view. For instance, his position regarding Null is spot on re the "streetlight effect" reference. Others include: * pascal- style declarations * type system * multiple returns * strings * switch Also I would not downplay the advantages of operator tokens && ||. More than just familiarity with C-family developers, in my experience, they are more generally effective as expression delimiters. They stand out better than 'and' 'or', which is better for readability.

</comment><comment><USER20> The direction of modulo with negative operands (and of division) was implementation-defined in C90.

At least it is pinned down now.

Common Lisp has a number different modulo operators that go every which way.

Firstly there are the single-valued _mod_ and _rem_ :

[http://clhs.lisp.se/Body/f_mod_r.htm](http://clhs.lisp.se/Body/f_mod_r.htm)

Secondly, the floor, ceiling, truncate and round functions also return a remainder:

[http://clhs.lisp.se/Body/f_floorc.htm](http://clhs.lisp.se/Body/f_floorc.htm)

</comment><comment><USER20> > _foo_ bar; // Is this an expression or a declaration? You need to check the > symbol table to find out*

Checking the symbol table is a simple one-liner.

Pushing all semantic information into the syntax so that the meaning of everything is known without any lookup is not realistic and will result in a bad language.

Lisp:

      (a b) ;; what is this?

You need the full surrounding context to know whether it's b applied to a, value of b being bound to variable a, or a list of base classes a and b in a defclass or what, ... and it's good that way.

</comment><comment><USER21> Most of what the author suggests is available in (modern) C++ - <USER2> maintaining backwards compatibility with C code:

* _Textual inclusion_ : C++20 has modules, where you include sematically, not textually.

* Bitwise operator precedence: Not soundly supported, but you can sort-of have custom infix operators in C++, see: [https://stackoverflow.com/questions/15632217/defining-new-in...](https://stackoverflow.com/questions/15632217/defining-new-infix-operators) so, specifically, one could implement the alternative modulo.

* Leading zero for octal: C++ has custom literals, so you could define a _octal or _hex etc and get the value determined at compile-time.

* No power operator: Same thing in Odin and C and C++, IIANM.

* Switch with default fallthrough: Since C++17, there's an official [[fallthrough]] anottation. You can make your compiler fail in cases when you implicitly fallthrough. So, not as elegant, but you can ensure you don't mess up and get the wrong behavior.

* (Type syntax: Nope, C++ has the contrived syntax of C.)

* Weak typing: With a library, you can have strong aliases which are not interchangeable with the aliased type. See this blog post: [https://foonathan.net/2016/10/strong-typedefs/](https://foonathan.net/2016/10/strong-typedefs/) and the library it links to. Things would be better, though, if the C++ standard committee allowed for an operator.

* Bytestrings: This is a library issue really. And both C and C++ have libraries which deal with wider characters, with UTF-8 and what-not.

* ++ and -- : You don't _have_ to use them... and it's possible to have static tools which forbid them in source files.

* ! Operator: C++ has !, && and || , but also "not", "and" and "or". I like the latter.

* Multiple returns: It's easy to return a tuple in C++, and with C++17 you can even construct and initialize multiple variables like that, e.g. `auto [index, name] = get_index_and_name(whatever)`.

* Errors: C++ is multi-paradigmatic here, supporting the traditional status return, an expected<T> type (either an actual T or an error; not yet standardized by available via widely-used ibrary), and exceptions. Monadic-style programming is not yet supported and will likely not be in C++20, but there are discussions about this.

* Nulls: With `std::optional` and `gsl::non_null`, and especially with no return types necessary, you can comfortably avoid using `nullptr` in C++ code.

So - with some choices and a little discipline (really not much!), you can have all of this "Odinish" behavior you like.

Of course - the price of C backwards compatibility and supporting multiple programming paradigms is complexity of the formal language definition, grammatic ambiguity, and a syntax that is not always pleasant.

<comment><USER22> > * Textual inclusion: C++20 has modules, where you include sematically, not > textually.

... provided that the libraries that you want to use are available as C++20 modules, not header files.

> * Leading zero for octal: C++ has custom literals,

... but no way to redefine the built-in "0" prefixed octal literal.

> * Weak typing: With a library, you can have strong aliases which are not > interchangeable with the aliased type.

... you can have that in theory, I agree it's very useful, but can you name one widely used C++ library that e.g. defines custom integer or string types purely for the purpose of type safety?

> * Bytestrings: This is a library issue really.

... indeed, and the standard library's std::string is quite unhelpful, there's no way provided to iterate code points if you put UTF-8 in std::string.

> * Errors: C++ is multi-paradigmatic here,

... but none of the paradigms available with just the language and standard library have any static checks that the caller of a function actually handles an error, whether return value or exception.

> * Nulls: With `std::optional` and `gsl::non_null`, and especially with no > return types necessary, you can comfortably avoid using `nullptr` in C++ > code.

... provided you never use any library from the C++ ecosystem, none of which currently use std::optional or gsl::non_null.

One of the problems I have with C++ is that re-using existing libraries vs. structuring your code to statically avoid sources of bugs is a trade-off; it shouldn't be.

<comment><USER21> > ... provided that the libraries that you want to use are available as C++20 > modules, not header files.

Yes. This will take time. But if you're writing most of the world from scratch (like with a new programming language), then you can write libraries in modules.

> ... but no way to redefine the built-in "0" prefixed octal literal.

True, but why use that? It's confusing if you don't know the convention.

> ... can you name one widely used C++ library that e.g. defines custom > integer or string types purely for the purpose of type safety?

Well, custom string types? QString is used in tons of apps; but custom string types are rarely about safety. Integers - there's Boost's safe_numerics library. Granted, I'm not sure it's very popular or just mildly popular, but still.

> ... indeed, and the standard library's std::string is quite unhelpful, > there's no way provided to iterate code points if you put UTF-8 in > std::string.

Yes, Unicode support in the C++ standard library is lacking, or where it isn't, it might as well have been. But again - it's not the language. So you can write your string library (or port ICU) in Odin or in C++

> ... but none of the paradigms available with just the language and standard > library have any static checks that the caller of a function actually > handles an error, whether return value or exception.

static checks are a compiler/IDE thing. But - there _is_ a [[nodiscard]] annotation in C++17, so that you can't just ignore a returned status altogether.

> ... provided you never use any library from the C++ ecosystem, none of which > currently use std::optional or gsl::non_null.

Toucheel and the backwards compatibility is a bitch here. But

1\. At those libraries' boundary, you have either silent or explicit conversion, which are safe, as long as you act safely on the outside. 2\. Most templated standard library code will use optional just fine...

> One of the problems I have with C++ is that re-using existing libraries vs. > structuring your code to statically avoid sources of bugs is a trade-off; it > shouldn't be.

Agreed. Having said that - writing lightweight wrappers for an existing library is a middle-of-the-road solution which is a lot less bug prone than just writing unsafe, old-style C++ all over.

</comment></comment></comment><comment><USER23> They are right about null. To say it is a billion dollar mistake is completely over blown. Maybe it was at the time but now a null pointer exception is extremely easy to find and fix. It doesn't compare to the other complex bugs one has to deal with most of the time.

<comment><USER24> If when you say "null pointer exception" you're thinking of Java: do you find any value in nullable / non-null annotations? Or if you've used Kotlin, its non-nullable references?

I find them very useful. I don't just want null pointer exceptions to be easy to debug, I want to avoid them completely in the first place.

<comment><USER25> > do you find any value in nullable / non-null annotations

Hah! Annotations. They're tales told by idiots, full of sound and fury, signifying nothing.

But seriously, they're about as meaningful as reading the javadoc. At least Optional enforces the contract; it's just clunky.

<comment><USER24> You can configure your IDE to warn of incorrect usage, and you can configure your compiler to flag warnings as errors. That will catch a lot of potential problems at compile time. It's not perfect but it can be lot better than nothing.

Java annotations are better than Optional when you're interoperating with Kotlin code, such as when you're partway through converting a large codebase to Kotlin.</comment></comment></comment></comment>


how do you reset your pass on YC.News? - <AUTHOR>

I couldnt find this information anywhere! <comment><USER2> At the moment you can't. It has been requested (<http://news.ycombinator.com/item?id=363>) a few times though.

</comment><comment><USER3> email pg and ask nicely?</comment>


Ask HN: Linux Adminstration Course for non-sysadmins? - <AUTHOR> Is there a site where you can learn or polish your skills in sys admin?
I'm a dev mainly but when I run into admin problems (ex. adding ssl, ip etc..) searching Google is not efficient. These documents are scattered all over the web.<p>Also, I'm not trying to get a certificate, I just need to know enough. <comment><USER2> There are so many things you might run into that I don't know how a course could possibly cover more than the very basics (using Bash, basic commands, etc.)

Miguel has a good blog post on learning Linux.

<http://tirania.org/blog/archive/2011/Sep-06.html>

Another great resource is to pick up a Linode VPS and go through the library.

<http://library.linode.com/>

I owe a lot of my start in Linux to the Slicehost articles but Slicehost is going away as it gets eaten by Rackspace.

Skip the courses, they are a waste of time.

<comment><USER3> You don't have to rent a VPS, you can [use linode and slicehost docs and] just run on your laptop, or even better on a virtual machine. Throw away your mistakes, for free.

<http://articles.slicehost.com/sitemap>

<http://slicehost.com/community/>

edit: [clarified]

</comment></comment><comment><USER4> You need these three things:

1\. A book ([http://www.amazon.com/System-Administration-Handbook- Edition...](http://www.amazon.com/System-Administration-Handbook-Edition- ebook/dp/B003YMNVCA/ref=tmm_kin_title_0))

2\. An infrastructure (<http://openstack.org/>)

3\. A community (<http://serverfault.com/>)

Oh, and some fun (<http://www.commandlinefu.com/commands/browse>)

:)

</comment><comment><USER3> AElien Frisch wrote a good book: Essential System Administration (3rd ed), [http://www.abebooks.com/servlet/SearchResults?isbn=978059600...](http://www.abebooks.com/servlet/SearchResults?isbn=9780596003432&sts=t)

Some/all of her books: <http://www.oreillynet.com/pub/au/678#Books>

Her O'Reilly articles: <http://www.oreillynet.com/pub/au/678#Books>

Any system administrator or general user can learn a lot from Unix Power Tools:

New, 3rd ed: <http://www.oreillynet.com/pub/au/678#Books>

Cheap, 2nd ed (prolly good enough if $ matters): [http://www.abebooks.com/servlet/BookDetailsPL?bi=8354343877&...](http://www.abebooks.com/servlet/BookDetailsPL?bi=8354343877&searchurl=sts%3Dt%26tn%3DUnix%2BPower%2BTools)

Some of this looks good, some looks like crap: [http://www.amazon.com/s/&url=search- alias=aps&field-...](http://www.amazon.com/s/&url=search-alias=aps&field- keywords=linux%20system%20administration?tag=duckduckgo-canonical-20)

</comment><comment><USER5> You could start with these google tutorials: <http://code.google.com/edu/tools101/index.html>

It is a commitment, but I recommend reading "The Manual": _UNIX and Linux System Administration Handbook_ by Evi Nemeth, Garth Snyder, Trent R. Hein, Ben Whaley [http://search.barnesandnoble.com/Unix-and-Linux-System- Admin...](http://search.barnesandnoble.com/Unix-and-Linux-System- Administration-Handbook-Evi-Nemeth/e/9780131480056)

</comment><comment><USER6> I don't know what level your looking for or if you want certification but here are two i've been eyeballing for some time now and both are expensive [http://www.cbtnuggets.com/it-training- videos/series/linx_rea...](http://www.cbtnuggets.com/it-training- videos/series/linx_realworld) or <http://www.oreillyschool.com/courses/sysadmin3/> both are online

</comment><comment><USER7> The Ubuntu Server Guide is an easy to read, succinct manual: <https://help.ubuntu.com/12.04/serverguide/>

That'll cover basic Ubuntu sysadmin tasks, which is Debian-based. It's a good place to start.

</comment><comment><USER8> Have you considered joining some relevant mailing lists? Alternatively, you can ask stuff on Stack Overflow.

In terms of more general learning, I suspect that much of it is very domain specific. Are you on a LAMP stack?</comment>


Show HN: Moment – Customer support by livechat, email, videocall, session rewind - <AUTHOR> https://www.momentcrm.com <comment><AUTHOR> Hey HN!

We built Moment because we found that there weren't any other platforms that make user data easy to manage. Each type of user data was in its own silo.

We'd have email/chat in Intercom/Drift, revenue data in Stripe/Chartmogul, demo and sales calls booked via calendly and tied to Google calendar, then the calls themselves would happen over Skype/Hangouts and disappear into the ether. Some support reps would take notes in Evernote, so they wouldn't be available to other reps. For analytics we'd use things like Hotjar, which was again siloed away from the rest of our user data.

Moment is designed to be the single source of truth for all of your interactions with your customers; no data silos. And of course, you can use just a part of it if you don't want to adopt it for all of the use cases above.

I'd be happy to answer any questions.

<comment><USER2> $25/mo for 2 seats. $99/mo for 50 seats.

Obviously way cheaper than other CRMs and support/marketing services. It's almost the "too good to be true" pricing which would make me walk away.

Is it a mistake on the website?

<comment><AUTHOR> No, we sell our chat at cost in order to expose customers to the other parts of our platform, which we think are far better (and directly translate to more revenue for our customers) than other, siloed platforms.

We expect to make money on our chat-only customers when they migrate other parts of their workflow to our platform.

Aside from that, we are still experimenting with pricing, but of course will grandfather the pricing that early users sign up with.

<comment><USER2> Okay, I opened on desktop and the pricing UI makes more sense now. I was under the impression it was $99 for everything (chat, marketing and CRM).

We use Intercom/Drift here and love their bots for qualifying leads. Do you guys have something similar?

<comment><AUTHOR> Thanks for the feedback, we'll work on the mobile version of the pricing page to make it less confusing.

We don't have bots yet, but they are coming in the near future. If you leave your email (just start a conversation on our site), I can follow up with you when they're ready.</comment></comment></comment></comment></comment>


EngageSPARK – a Twilio alternative without coding - <AUTHOR> https://www.engagespark.com/twilio-alternative-engageSPARK/ <comment><USER2> One of the founders here! I'm happy to answer any questions. We're also looking for great developers to join our team.

We've been used in 100+ countries already by customers like Facebook, Google, UNICEF, etc.</comment>


Ask HN: What is your philosophy when creating abstractions? - <AUTHOR> Hey, HN.
Having been in the industry I've seen people talk about abstraction in different forms, and displaying different sets of priorities for different properties of abstraction.
I was looking to find a list of things that people consider very valuable when building their own abstractions (or when evaluating which libraries to use in their projects), and what things they think make the codebase worse. <comment><USER2> Count the number of clients that will be ("will" not "could!") taking advantage of the abstraction. Is that number not greater than 3? Then the abstraction is useless and shouldn't be written.

</comment><comment><USER3> Always KISS. Abstractions should be done in case of Rule of 3 (if you're going to write something 3 times, create a layer of abstraction).

Just don't think too much on abstraction. I've worked on codebases that were designed with abstraction as its first thought, and saw scaling issues (major ones) over time. The key to sustainable codebases is to always KISS. You might feel goosebumps watching your abstract code but sadly, your team might not and the effort it might take to explain the same or the time it would take them to understsnd what you meant does not collectively profit the overall environment of the project as a whole.

</comment><comment><USER4> I've heard so much talk about abstractions lately but I'm not sure I know what an abstraction actually is.

<comment><USER3> an illusion.</comment></comment>


A-level and GCSE results government reversal - <AUTHOR> https://www.theguardian.com/education/2020/aug/17/a-levels-gcse-results-england-based-teacher-assessments-government-u-turn <comment><AUTHOR> UK people, please don't be too frustrated with your government. I cannot _imagine_ a similar reversal happening here in the US.</comment>


Tell HN: Readability bookmarklet now redirects to readability.com (here's a fix) - <AUTHOR>

I'm a huge fan of the Readability bookmarklet. Unfortunately yesterday it seems they updated it to advertise their new web service, which causes NoScript to complain, and appears to require cookies to save settings, both of which upset my habits.
So I've set up http://old-readability.appspot.com/ with the old site (from http://code.google.com/p/arc90labs-readability/ ). This URL isn't going away any time soon.
If you substitute "lab.arc90.com/experiments/readability/" with "old-readability.appspot.com" in your bookmarklet URL, things should go back to working as they did. <comment><USER2> Works!! Can't thank you enough for this. :)

</comment><comment> mike-cardwell Thank you!</comment>


Ask HN: Coronavirus has a huge economic impact. What are your predictions? - <AUTHOR> As the title suggests; Coronavirus seems to have a huge economic impact. What are your predictions? <comment><USER2> In 2 weeks, 3MM will file for initial unemployment claims. That's almost 5x more than the previous weekly record of ~650k. Unemployment rate will reach 10% in a month, the fastest it got to 10% ever.

All this will propagate to a full year of negative GDP growth each quarter. Economists are predicting GDP to grow in Q3 and Q4, but that was as of last week and every data point becomes stale every day.

Trump will be re-elected- not because he did anything remarkable during all this, but because the naturally progression of the virus will make it SEEM like he did it.

By 3 years, many more jobs will be outsourced. We think all this technology will help a WFH culture, and it will... just in homes/offices in other countries.

2 US airlines will go bankrupt and/or United and American will merge.

Schools will remain virtual after summer vacation of 2020.

Olympics will be canceled.

Longer term: Amazon will reach a $2T valuation by 2023. This won't mean necessarily that their business will double in output- asset price inflation will be a big factor.

By 2030 rural fly over cities will develop enough infrastructure to displace the largest cities today and we will see a big migration to new cities.</comment>


GM to launch autonomous cars in big cities sometime in 2019 - <AUTHOR> https://www.cnbc.com/2017/11/30/gm-to-launch-autonomous-cars-in-big-cities-sometime-in-2019.html <comment><USER2> GM is full steam ahead on Robotaxis. Here's a PDF of the slides used during GM's investor presentation:

[https://www.gm.com/content/dam/gm/events/docs/5265893-685163...](https://www.gm.com/content/dam/gm/events/docs/5265893-685163-Chartset-11-30-2017)

Some fun facts from the presentation:

> Cruise has 1,200 employees, up from 90 at acquisition in early 2016. (Vogt > just specified only 400 are full-time at Cruise) Planning to have ~2100 by > the end of 2018.

> They intend to get up to 1 million miles/month of testing in 2018.

> Their 3 simulators run 150 simulations per minute. Cruise CEO Kyle Vogt > repeatedly emphasizes Cruise's high rate of improvement.

> Their test map of SF shows they're staying off the freeways, but they're > pretty much everywhere else.

> Cruise is focused on an initial deployment in SF, but sees value on testing > in other cities to prevent overfitting for the SF driving environment. They > also test in Phoenix, and are planning to launch in NYC.

> Cruise projects It will take about 6 months to map and prepare for scaled > deployment in a new city.

> They expect to get Lidar costs down to ~$300 (either per vehicle or per > unit, not specified) with their recent acquisition of Solid state Lidar > startup Strobe.

> Their vehicles currently have 14 cameras, 3 articulating radars, 8 regular > radars, 5 lidar units, and 10 ulrasonic proximity sensors.

> They're projecting they can get the cost of an AV to under $1.00 per mile in > 2025.

> They project 20-30% margins after 2025.</comment>


Show HN: SwarmSports returns to the way it was - <AUTHOR> http://swarmsports.com

<comment><AUTHOR> Just put up SwarmSports.com back to the way it was before I ripped it down as a search tool for sports news stories. Pictures are back, the title needs adjusted as it should say something like "SwarmSports: Sports News Aggregation Tool" or something like that.

Enjoy!</comment>


Mozilla Paris is gearing up to become the center for Mozilla in Europe - <AUTHOR> http://www.rudebaguette.com/2012/05/24/mozilla/?utm_source=hackernews&utm_medium=hackernews&utm_campaign=hackernews

<comment><USER6> "I'm sure i'll switch once Mozilla gets its add-ons and plugins together into a store"

Er. <https://addons.mozilla.org/> ?

<comment><AUTHOR> Honestly, it's just not the same. I know Mozilla agrees, because my friend is in charge of bringing out a better "App store" for Firefox. It's not enough to appeal to the developer crowd, who's willing to search hard for what they want - you have to do the Apple and Chrome thing, and appeal to people who are not technophiles, and just want a browser with cool tools.

<comment><USER6> Out of interest, what's the difference? The chrome store looks a bit nicer (although it's a pain to navigate IMO) - but I don't really see much difference in terms of functionality. The search is just as good on the Firefox store.

<comment><AUTHOR> Perhaps its integration within the browser, or marketing - I'm not sure. But again, it's not a matter of assessing each feature and comparing the two, because that's what developers do. It's a matter of appealling to the non- developer community using the internet (much larger than the developer community, unfortunately).

<comment><USER7> It's not clear enough what the difference between these things are:

* Add-ons

* Extensions

* Plug-ins

* Themes

* Appearance

* Personas

(Note: I'm not asking for an explanation, I'm pointing out a problem)

<comment><USER6> Same applies to Chrome too, to an extent:

      - <USER2>
      - <USER3>
      - <USER4>
      - <USER5>

<comment><USER8> I think with Chrome, aside from Plugins, it's pretty clear. Extensions add stuff to the browser, Apps are applications, and Themes make the browser pretty (or ugly).

</comment></comment></comment></comment></comment></comment></comment><comment><USER9> I thought Mozilla London was the centre of Europe?

Good to see the big names promoting innovation and technology in Europe. I use to be a Mozilla fan but am now google heavy. Maybe it is time to come back?

<comment><AUTHOR> Technically, Mozilla Denmark is the highest level subsididary in Europe, so all offices in Europe are offices of that Mozilla Denmark (it says it on the Mozilla Paris office, it's pretty funny) - but it's much more metaphorical than official. It's a matter of where will European Mozillians go to meet up, work together, etc. I don't think London has that appeal; most non-UK Europeans don't consider London to really be Europe - hell, Londoners don't consider themselves to be european.</comment></comment>


Ask HN: Starting a drink business. - <AUTHOR>

So, HN, I know this is a pretty technical site in terms of programming, entrepreneurship, etc, but it looks like I'm starting a more traditional drink business with my brother. Background info really quickly: I'm 23, he's 20, and we have created a health shot from natural products that is really quite awesome (not going into too much detail here; it's not relevant. All I have to say is it's not an energy drink).
We plan on selling 50 ml bottles (about 2 oz) to local health markets to begin with, and see how things go from there.
What I want to know is this: what do I need to know about US health and food regulation before I get into this? I'm literally going to be preparing and bottling this in my kitchen for a while and selling directly to these local markets when I start out. Is there anything I should I be aware of before I start that would have the power to stop me?
EDIT: Starting out, it looks like I will be using these bottles: http://www.sks-bottle.com/340c/fin14e.html. Good enough, or will I need something better? (in terms of being able to preserve the contents?) <comment><USER2> For god's sake, lawyer up.

I don't even want to think about the liability you're walking into if you're not careful.

Is there some reason you don't want to try to sell the recipe to established firms who already have the infrastructure in place?

</comment><comment><USER3> The first thing you'll want to look at is HAACP, which is required by the US FDA for certain types of food (amongst them, juices, which your product may fall in to). There are likely other laws covering labelling - you may have to pay a laboratory to analyse the product for energy & fat content, sodium, sugars etc.

Have a look at: [http://en.wikipedia.org/wiki/Hazard_Analysis_and_Critical_Co...](http://en.wikipedia.org/wiki/Hazard_Analysis_and_Critical_Control_Points)

and: [http://en.wikipedia.org/wiki/Nutrition_facts_label#United_St...](http://en.wikipedia.org/wiki/Nutrition_facts_label#United_States)

There's probably other things too

(Disclaimer: I'm Australian, and not an expert in these things)</comment>


Ask HN: What do I need to learn how to write a scalable app? - <AUTHOR> I'm a self taught programmer. I mostly code in Python. I have built a couple of fairly well received applications at my workplaces, using flask and either React or Plotly's dash framework for UI. However I am facing a problem. My work does not involve much data. I write tools that are used to automate tasks. Visitors are below 10 to 20 at any given time, even though my company is a large fintech company. My work does not deal with much data. But I want to learn. I want to build something that involves billions of rows of data. I want to know how to speed it up.<p>Right now, I am building an application that has 2 million rows of data. It is centred around a lot of analytics around team productivity. I would like to increase how fast it is. I am already using redis as a cache, my database is postgres, I select only columns I need using flask Sqlalchemy and I have cut down a lot of the processing time already. But I am certain this can be faster. Where do I learn the design patterns for this? What do I use to figure out how to improve this application? How do I measure performance? How do I learn to build apps that achieve less than 300ms response time? <comment><USER3> >> I am building an application that has 2 million rows of data.

It will also be helpful to know what kind of hardware you are using for the database. How much RAM the machine has? Does the whole dataset fit in the RAM? If not, at least indexes should fit in the RAM.

Disk type: HDD/SSD?

Are you using indexes?

Did you check "explain analyze"[1] to check your query plans to ensure that the indexes are being used or not?

There are many things that affect database performance.

>> I want to build something that involves billions of rows of data. I want to know how to speed it up.

The key to this is "Shared nothing architecture" along with a Sharded Database. I have tried to explain this architecture here [2]. To understand Database sharding, I would recommend this Digital Ocean Article [3].

To learn more about highly scalable architectures I would suggest reading the real world architectures section [4] of the High Scalability Blog.

[1] [https://thoughtbot.com/blog/reading-an-explain-analyze- query...](https://thoughtbot.com/blog/reading-an-explain-analyze-query-plan)

[2] [https://mobisoftinfotech.com/resources/mguide/shared- nothing...](https://mobisoftinfotech.com/resources/mguide/shared-nothing- architecture-the-key-to-scale-your-app-to-millions-of-users/)

[3] [https://www.digitalocean.com/community/tutorials/understandi...](https://www.digitalocean.com/community/tutorials/understanding- database-sharding)

[4] [http://highscalability.com/blog/category/example](http://highscalability.com/blog/category/example)

<comment><USER4> > Did you check "explain analyze"[1] to check your query plans to ensure that > the indexes are being used or not?

Word of caution `explain analyze` actually executes the query and then returns the execution plan. Just `explain` will give you the estimated plan without executing (although usually less accurate than the analyze counterpart).

Learned that one the hard way.

</comment></comment><comment><USER5> Read this book:

[https://www.amazon.com/Designing-Data-Intensive- Applications...](https://www.amazon.com/Designing-Data-Intensive-Applications- Reliable-Maintainable/dp/1449373321)

</comment><comment><USER6> One thing that I have learned with large datasets is to add pagination in queries/APIs and always do them server side. Client side paginations are not good enough for large datasets.

Also in general, always query less data than more and then request more as needed. For example, lets say you are loading a table for users. You could have 2 million users in the database. Do you really want to query all 2 million at once even if you have optimized the code and hardware for it ? I would say No. Query may be a few hundred at once and then query more as needed.

<comment><AUTHOR> Thank you. I don't think pagination would help since I'm building a dashboard.

Perhaps if I explain what I'm trying to build it would help.

I am building a git analytics dashboard. I want to help my organization analyse developer productivity from bitbucket. So I am pulling in all the git commit logs, the diffs for all projects my org within the company has. We have 1500 repos across 20 projects. I am building dashboards atop of this. The data will grow daily. I would like to showcase project health in terms of commits, pull requests and whether there are duplications in work (surprisingly we have this. Actual repos being copies from here to there btw, insane shit). In doing this I realized I am struggling to scale it. The UI Takes 2 minutes to load. It is abysmal. The org is impressed but I am not, and it is for my own learning.

<comment><USER7> Dashboards with tons of charts are all about pre-computing. In the RDBMS world you abandon normal relational tables and use a non-relational star schema. Star schemas are basically just tables that store pre-computed data.

Sometimes it's a completely separate database for just reporting, with new daily data being fed in all the time, and results pre-computed.

These systems tend to be queries against the past. It's accepted that you may be 1 day behind. But that little concession to query past-only allows all sorts of great tricks to have instantaneous reporting against huge data sets. Making it seem like your reports have been blessed by the tears of the performance gods.

Even google search is "cheating" by searching against the past, not the present. Could you imagine how slow it would be if your google search query triggered a web crawler in real time to scour the internet? Yeah, you might be waiting several days for your crawl to complete.

</comment></comment></comment><comment><USER8> I'm in no way a DBA, but if your main usecase is analytics (OLAP) and updates are infrequent it's common to use column-oriented DBMS. Postgres has cstore_fdw, but you can also use others: DuckDB, MonetDB, ClickHouse among FOSS, and quite a few well-known proprietary options.

That said, 2M rows is not really a lot of data (unless the rows are huge). In case you don't need to worry about updates, you can just load everything into memory, e.g. in Pandas dataframe (large overhead, slow, many features) or more efficient implementation, like `datatable` (lower overhead, faster, less features).

Also I recently discovered BI tools (more like realized that despite the name it doesn't have to apply to business data). E.g. Metabase provides nice UI for non-complicated analytical (like SELECT avg(...) GROUP BY ...). So if it fits 90% of your queries, then maybe you got the frontend for free, and only need to work on backend (and the rest 10% of queries).

</comment><comment><USER9> Where exactly is your bottleneck right now? Database queries? I mean, where those >300ms go, foreach request or just some of them?

<comment><AUTHOR> Definitely the database. How would I begin speeding that up?

<comment><USER9> Two million rows in tables are not a problem even for old databases (I'm thinking of mysql 5.1)... Are you confident on your indexes, normalization, etc?

<comment><AUTHOR> I definitely will look at the indices. I have several joins. Perhaps if I explain what I'm trying to build.

I am building a git analytics dashboard. I want to help my organization analyse developer productivity from bitbucket. So I am pulling in all the git commit logs, the diffs for all projects my org within the company has. We have 1500 repos across 20 projects. I am building dashboards atop of this. The data will grow daily. I would like to showcase project health in terms of commits, pull requests and whether there are duplications in work (surprisingly we have this. Actual repos being copies from here to there btw, insane shit). In doing this I realized I am struggling to scale it. The UI Takes 2 minutes to load. It is abysmal. The org is impressed but I am not, and it is for my own learning.

<comment><USER10> Optimise your queries as well, complex queries with multiple many-to-many joins will add up quick to tons of rows to filter. Look at separating queries; to keep the overall in a single query, the db may have to churn through tens of thousands of rows. Where if you do a first select than a second based on the result of the first, you can bring it down to just hundreds or tens - <USER2> a quicker response than just one query.

</comment></comment></comment></comment></comment><comment><USER11> Since you mention you're using Flask. Before diving into data intensive stuff if need be, a lot can be done by profiling, refactoring, and improving the actual code:

\- Profiling and refactoring Python code in general:

Using yappi[^1] to profile and generate profile data, and KCachegrind[^2] to visualize that data in the form of call graphs, number of cycles, etc. can yield great results. You can find which functions in your code base are taking too long, and this can give great pointers to where bottlenecks are.

Using _pyreverse_ [^3], now integrated in _pylint_ [^4], to generate say a PNG image for class hierarchy and "UML diagrams" is extremely helpful. When I have used it and was the arrows going all over the place, it has helped me eke out better abstractions, remove a lot of code, write cleaner interfaces, and frankly write code I and others could actually read.

After installing _pylint_. On a package level for instance. Say package name is foo and follows standard hierarchy with `foo/foo`:

      cd foo
      pyreverse -o png .
      # generates classes.png and packages.png
      # You can also see pyreverse -o png foo

\- Profiling in the context of Flask:

Using Werkzeug's ProfilerMiddleware[^5] helps you see what's going on with each request. What functions are called, number of calls, total time, per call, which line, etc.

If the example in the documentation does not work, try the following:

      ...
      try:
          from werkzeug.middleware.profiler import ProfilerMiddleware
      except ModuleNotFoundError:
          # Older version
          from werkzeug.contrib.profiler import ProfilerMiddleware

      ...
      # Assuming you have an app object

      app.config['PROFILE'] = True
      app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions=[50])

General things: it is very helpful to extract as much code from the routes. This helps making the functions usable elsewhere, and not rely on Flask's testing client which can be pretty frustrating when dealing with the app context, especially in test suites involving database actions, and weird connections in setUp and tearDown if you're using unittest*.

As I said, this is general and not very specific for "big data" or "billions of rows", but these small things lead to bigger things in my opinion: making the code easier to read and extend, easier to test and cover, easier to profile and improve, compounds to a point you may postpone more involved approaches.

[^1]: [https://github.com/sumerc/yappi](https://github.com/sumerc/yappi)

[^2]: [https://kcachegrind.github.io/](https://kcachegrind.github.io/)

[^3]: [https://www.logilab.org/blogentry/6883](https://www.logilab.org/blogentry/6883)

[^4]: [https://github.com/PyCQA/pylint](https://github.com/PyCQA/pylint)

[^5]: [https://werkzeug.palletsprojects.com/en/1.0.x/middleware/pro...](https://werkzeug.palletsprojects.com/en/1.0.x/middleware/profiler/)

</comment><comment><USER12> Your first question is how to make what you are working on now faster. Follow a process to find the places where you can make improvements and there are bottlenecks. I always like to start at the data layer myself, and work my way up the stack.

\- If using an ORM, dump all the queries that it is creating on your behalf. Check how they compare to what you would hand write, look at the execution plans.

\- Tune the queries, reduce joins where possible, add/remove indexes etc. Sometimes removing an index helps more then adding new ones if insert/updates are a bottleneck. Don't forget to check these.

\- In the application layer, check all your translations/transformations to measure and tune those. These can add a lot of time if called repeatedly for many records.

\- At the UI level find places where there might be a lot more going on then needs be. I so often find places where a lot more data is being requested then needed and then you have to filter through it all and if nothing else it adds memory pressure which can lead to hard to find performance issues.

\- Cache's are awesome, but they sometimes just add complexity and delays where you don't need them. Small datasets usually can do really well just with some materialized views, data partitions and query tuning. I have actually removed caches before and improved performance after a little query work, don't ignore this. But I wouldn't say that is the norm, but it does exist.

\- Denormalize in places to remove joins if they are not substantially necessary. When working on a system that had large marketing datasets, I found that by caching a few fields on a highly used table we could eliminate many joins in the application which were on numerous pages (common queries), in some cases giving us 25x improvements. Of course, that adds a little extra time and consideration on inserts/updates but that tradeoff is usually worth it if you are read/query heavy.

As for learning to deal with large datasets. It starts with all of the above, you need to really tune the data/queries at the database level first. Postgres is awesome, relational data is great for a ton of things, but there may be a reason to store data in non-relational ways for some things (cache is a great example). This means you might have replicated data in places which adds a little complexity but aids in performance. Always consider how the data is going to be accessed and used by the application(s). Joins are an example of a place where small changes can result in magnitudes greater performance.

Large data means small details are way more important, and what I have seen a lot of times is people don't pay attention to a lot of the little details when working with smaller datasets. That's pretty fair most of the time because it really doesn't affect performance on small datasets. But in the end when you get to large data all those details matter. Even little things like picking the right datatype is more critical in large datasets. You don't want to store a number as a string and always be doing conversions on it as an example. It adds a lot of extra wasted cycles. Of course, on small data, you would rarely see a problem with it, which makes people get complacent with their choices many times.</comment>


Last uncov ever? - <AUTHOR> http://www.uncov.com/2008/1/21/crunchies-ingredients-fail

<comment> daniel-cussen First time I'd heard of uncov.

OK, it's ending. That's fine. But the picture of the track runner getting clotheslined by a hurdle was pretty funny, and the writing was funny too.

It was worth the five minutes. But in the internet, isn't that all anyone can aspire to?

</comment><comment><USER2> Damn... Where am I supposed to read reviews on Web 2.0 startups from now on?

</comment><comment><USER3> Good. He's probably about to launch his startup and is trying to distance himself from the asshole image he's been cultivating on Uncov.

This guy acts like he's so anti-"web 2.0" or whatever, and yet he still attends the Crunchies to blog for Valleywag?

And what exactly is he accomplishing by ripping on people like Leah Culver for writing a post on generating random strings? I get the sense that he feels superior to any startup that doesn't tackle some difficult problem.

</comment><comment><USER4> _When I finally did meet [Arrington], I was surprised. He was polite and complimented Uncov. I think he realizes that it's just the internet, [etc]_

Yeah, he probably "realizes". Or, he doesn't think it's very smart to argue with a troll who is widely read by other trolls. Could be either way.

</comment><comment><USER5> Someone spends too much time on /b/.

</comment><comment><USER6> It's really closing down? Just like that? Not even announced in its own post?

<comment><USER7> >> _Oh, right. One more thing. This is the last Uncov. Ever. I have been getting tired of it, and this has been manifesting itself in my writing. After seeing the spectacle at the Crunchies, I think it's finally time to quit._</comment></comment>


Ask HN: What are some important problems that few people are working on? - <AUTHOR> I'm a college student, and I want to work in an area where I can have high impact both within in the area and the world. <comment><USER2> The research communities are too broad and too deep. First you have to choose a broader field such as mathematics or physics or chemistry or biology. You could also think about inter-disciplinary fields which are considered "cool" in the last decade. It has to be a mix of something that interests you and something that you are capable to learn. This is an arbitrary and naive question. I can tell you to work on Millennium Prize Problems but is it really a relevant or helpful answer? I think not.</comment>


Arbtt: The automatic, rule-based time tracker - <AUTHOR> http://arbtt.nomeata.de/#what <comment><AUTHOR> I came across this yesterday and have been quite impressed with its customization. My previous attempts with automated time tracking through programs like rescue time involved lots of fiddling and not getting much work done. With this, after reading some notes in the documentation on Effective Use of arbtt ([http://arbtt.nomeata.de/doc/users_guide/effective- use.html](http://arbtt.nomeata.de/doc/users_guide/effective-use.html)) I've got a pretty useful time tracking app that's not distracting and only gives me the information I want.</comment>


Show HN: Make robust rest apis fast and easy with cookiecutter-django-rest - <AUTHOR> https://github.com/agconti/cookiecutter-django-rest <comment><AUTHOR> cookiecutter-django-rest takes care of the setup and configuration so you can focus on making your api awesome. Scaffolding a project takes seconds and it gives you authentication, user accounts, and the docs and tests to support them. After that, just add your own resources to the api and start shipping.

It also gives you a solid foundation for your api to mature by baking in things like asynchronous queueing, image optimization, and application monitoring.

We're happy to announce that we just released 0.5.0 this morning! We'd love to hear your feedback.</comment>


Show HN: Clerk.JS – A normalizer with denormalized data access for React - <AUTHOR> https://github.com/felipellrocha/clerkjs <comment><USER2> Nice! Can you compare it to [https://github.com/paularmstrong/normalizr](https://github.com/paularmstrong/normalizr) ?

<comment><AUTHOR> Yeah! It has pretty much the same goals as normalizr, except when it comes to data access. After normalizing:

const { result, entities: clerk } = normalize(data, Character)

This evaluates to true:

clerk.character[1].location[1] === clerk.location[1]

So, you can still access your data directly via your reducers, while accessing it via nesting in your components.</comment></comment>


Advice for New Managers - <AUTHOR> http://www.themacro.com/articles/2016/10/advice-for-new-managers/ <comment><AUTHOR> What a coincidence. HBR just ran a blog on How to Build a Strong Relationship with a New Boss, which seem complementary.

[https://hbr.org/2016/10/how-to-build-a-strong- relationship-w...](https://hbr.org/2016/10/how-to-build-a-strong-relationship- with-a-new-boss)</comment>


When You Account For Pensions, The Boston Globe Sold For Negative $40 Million - <AUTHOR> http://www.slate.com/blogs/moneybox/2013/08/03/pensions_included_boston_globe_sold_for_40_billion.html <comment><USER2> > What's even more shocking is that the Globe has been doing great > journalism—winning Pulitzers, etc.—and even turning a modest profit. But > that's the difference between a growing industry (where Tumblr can sell for > $1 billion with no profits or even meaningful revenue in sight) and a > shrinking one.

Well, do any startups offer pensions? Maybe that has more to do with it...

<comment><USER3> Yes. Don't most funded startups have 401Ks?

<comment><USER4> There is a huge difference between a pension and a 401k. If my understanding is correct, an employer only contributes to an employee's 401k while they are working. There is no future obligation to the employee.

An employer who offers a pension effectively says, "if you work for me x years, I will continue to pay you y salary for the rest of your life."

<comment><USER3> Isn't that a final-salary pension as opposed to a defined-contribution pension? They're both pensions. (Though I agree a final-salary scheme is much more attractive, and as it happens, I have a couple of years in one from an old gig.)

<comment><USER5> A 401(k) is essentially just a retirement savings account. Money goes in regularly, the account has a specific balance, and any future obligations are managed in a well-defined way by a bank or brokerage. There is no opportunity to conflate the performance of the business with the ratio of savers to pensioners or with the performance of the investment itself.

The other kind of pension, which we generally hear about in large companies or governments, is indistinguishable (to me) from accounting fraud. The whole point is to make the business (or government) look better today, and make big promises today, and hide the costs and obligations far into the future with optimistic projections.

I am not a lawyer or expert on this matter.

</comment></comment></comment></comment></comment><comment><USER6> Uh.... that's not how math works.

What you mean to say is "The Globe sold for $70 million, but if you think about the pension obligations, the buyer is really paying about $180 million for it." which is very different from the "sold for -$40 million", which isn't even a thing that makes sense.

<comment><USER7> No, the seller is retaining responsibility for the pension. Imagine that the Globe was worth $X including pension obligations. Then the Globe unencumbered by pension obligations should be worth $X+110M. The sale price implies $X+110M = 70M, so X = -40M.

<comment><USER8> That's not what the article says.

>That's because the terms under which John Henry is buying the paper ___stick the New York Times Company with the Globe 's pension obligations_ __, which are said to amount to around $110 million. Which is to say that the worth of the overall Globe enterprise is negative $40 million, not $70 million.

emphasis added

<comment><USER9> Notice that your emphasized words clearly state that the NYT (the seller) will pay the pensions, not the Globe's new buyer. So the article is correct.

</comment></comment></comment></comment><comment><USER10> Or perhaps the old parent company views pensions as an already sunk cost, and thus irrelevant, and thinks the actual operations of the paper are worth, you guessed it, $70M.

</comment><comment><USER11> You'll see more of this. Judging from his wiki entry, John Henry (who names a kid that?) is apolitical, but when the NYTimes, LATimes, etc, finally get completely sold to Carlos Slim or a Saudi Prince or whoever, the editorial direction of the country will get more and more one-sided.

It's amazing any newspaper is still in business, but eventually it will be strictly a subsidized game.

<comment><USER12> More one-sided? Most of the big dailies in the USA are already solidly left, editorially. Which way do you see the balance tipping?

<comment><USER13> [citation needed]

<comment><USER5> A citation is needed here but not for the original comment?

Peronally, I think this particular line of discussion is useless, with or without a link to some partisan "study" from one side or the other.

</comment></comment></comment></comment><comment><USER14> The article raises a decent point, but yes the -40 is obviously misleading. Why would anyone sell it for negative instead of just liquidate it? When NYT bought the paper it essentially paid 1bil + 100mil-ish assumption of pensions. Now when it sold it, it only got 70 mil.

It's better to correctly restate the purchase price, rather than make the selling price negative. But that wouldn't generate click throughs.

Edit: This is related to the Enterprise Value concept of a company. You include liabilities in this calculation when calculating a buyout valuation (not sure if that includes pensions or not; I don't do stocks anymore now because it's all just a giant federal reserve hedge fund)

Edit 2: wikipedia says EV should include unfunded pensions, which makes rational sense.

</comment><comment><USER15> This math is wrong. The pension obligations are liabilities and not an immediate expense. Many companies have huge pension liabilities along with monstrous amounts of debt. What you need to look at is the equity, in other words assets - liabilities, and if that equity figure is more then 70 million, then the purchaser got a discounted deal.

<comment><USER16> No you are confusing the price (or market value) of a company and it's balance sheet. For many reasons the price that a company sells for is almost never the same as the shareholder's equity (i.e. equity = assets - liabilities). First not all assets or liabilities are marked to market (i.e. regularly revalued) generally because some are hard to accurately value (e.g. IP, brand, customer relationships). Second neither assets nor liabilities consider the expected future profits of the company. Third the value of something depends on the buyer and seller as they many have different opinions. Forth the value of an entire or large portion of a business is different than a small portion (control premium). And these are only some of the most important reasons - there are many more!

Just take a look at any publicly traded company. The market value of the equity (i.e. market cap) almost never be the same as the shareholder's equity. And if you wanted to buy the entire company you would almost certainly have to pay more than market cap.

<comment><USER15> Sure, that I know that book values doesn't equal market values. But what was being proposed was that the pension liability is an immediate expense that should be added to the purchased price of the acquistion -- which is something that does not make sense at all.

</comment></comment></comment><comment><USER17> "What's even more shocking is that the Globe has been doing great journalism—winning Pulitzers, etc."

Wow! That buggy whip company is DOING GREAT! Some of their buggy whip makers just got awards from the Buggy Whip Makers Guild for their high quality buggy whips!

<comment><USER18> You're right, journalism is completely old fashioned and we can just do with pundits and gossip.

...

Have you gone mad? The medium is irrelevant to the content.

<comment><USER19> I think the argument is that Pulitzers are a low-meaning metric for journalistic quality today given that they're awarded by an (allegedly irrelevant) subset of the media. I read the "buggy whip" part as humorous garnishing.

<comment><USER18> Trust in journalism is inherently tied to brand: we trust the Globe (or the Times or whatever) to do fact-checking for us. There is still no reason for me to trust anyone on the internet with this regard: it could be karl rove in his PJs for all I know. In this sense newspapers still hold immense value even though they've lost most ways of commodifying it.

</comment></comment></comment></comment><comment><USER20> I wonder what they jettisoned in terms of other liabilities though.</comment>


Mars Needs Leap Days Too - <AUTHOR> https://www.nytimes.com/2020/02/28/science/leap-year.html <comment><USER2> > _That means that when the clock strikes midnight on New Year's Eve, Earth > hasn't quite circled all the way back to its starting point._

Circling back to the starting point would be a sidereal year, which isn't what we want either.

What the calendar is trying to synchronize to is not the sidereal year, but the tropical year: the equinoxes and solstices should occur around the same date each year, and the seasons shouldn't shift relative to the calendar over the years. Because of the precession of the earth's axis, this tropical year is about 20 minutes shorter than the sidereal year.

<comment><USER3> Why, physically speaking, is the tropical year almost but not quite as long as the sidereal year?

<comment><USER2> The seasons are caused by the orientation of the Earth's tilted axis relative to the sun. E.g the north pole is tilted towards the sun during summer of the northern hemisphere, and away from the sun in winter.

Now imagine the Earth being magically held in place, instead of orbiting around the sun. This would _almost_ stop the seasons from advancing, but not entirely. There would still be a slow 26000 year cycle of the seasons, because the Earth's axis precesses much like a spinning top. It's this effect that speeds up the cycle of the seasons by about 20 minutes each year. (1 year/26000 is about 20 minutes)

<comment><USER3> Is there a reason it precesses at that particular speed, some resonance or tidal locking or something? Or is it basically a random initial condition?

<comment><USER2> It's pretty random. It's mostly caused by gravitation from the sun and moon, and counteracted by the Earth's spin; faster spin would mean slower precession.

</comment></comment></comment></comment></comment><comment><USER4> A spacefaring civilization wouldn't care much at all about planetary motion and seasons. They'd likely go 'metric' with time.

"See you in a kilosec!"

"Oh she got promoted a couple megasecs ago, transferred out."

"I've been up for a hectasec; I have to catch some Z's!"\

"I graduated early, only 5 gigasecs old!"

<comment><USER5> 5 gigaseconds is about 150 years, so your "graduated early" indicates some serious life extension technology.

<comment><USER6> or relativistic travel

<comment><USER7> Whose gigasecs, then?

<comment><USER8> Tinder for nerds?

</comment></comment></comment></comment></comment><comment><USER9> Somewhat related to this, back in 2004 the JPL team working on Spirit and Opportunity were given specially-designed wristwatches that matched the 24 hour and 39 minute day on Mars in order to better match the daily working schedule that Mars required.[0]

[0] [https://mars.jpl.nasa.gov/mer/spotlight/spirit/a3_20040108.h...](https://mars.jpl.nasa.gov/mer/spotlight/spirit/a3_20040108.html)

<comment><USER10> I bet those watches sell for a pretty penny

</comment></comment><comment><USER11> [https://en.m.wikipedia.org/wiki/Timekeeping_on_Mars](https://en.m.wikipedia.org/wiki/Timekeeping_on_Mars)

I think you'll want more detail than the article gave.

<comment><USER12> > The term sol is used by planetary scientists to refer to the duration of a > solar day on Mars. The term was adopted during the Viking project in order > to avoid confusion with an Earth day. By inference, Mars' "solar hour" is > 1/24 of a sol, and a solar minute 1/60 of a solar hour.

I wish they would have picked another name. As a Spanish speaker, I can't stop my mind translating "sol" to "sun". I can already imagine hearing someone say, "how was your sun today?"

<comment><USER13> Which is perfect, by analogy with month and moon.

If you spoke a language where the word for sun and day were the same, you'd barely notice.

<comment><USER14> Chinese is one such language. Both "sky" and "sun" are also used for "day"

<comment><USER13> Yep!

Ming (明) is my favorite Hanzi, thanks to a lovely weekend spent at Sun-Moon Lake in Taiwan.

</comment></comment></comment></comment></comment><comment><USER15> I assume there are people at NASA / SpaceX/ etc. in charge of writing custom MarsDate modules for various languages. Sounds horrible. I'm not even sure we've solved how to deal with dates on earth yet.

<comment><USER16> I'd be more interested to see if a more generalised PlanetDate module could be written. Perhaps outside of Earth we could do away with months and just stick to days (based on rotations, assuming the planet rotates) and years, with leap days added in between? And if the planet doesn't rotate, just count by hours and years (with hours having a logical separator at 10 or 100)?

<comment><USER17> I think any interplanetary civilization will be practically forced to use a planet-agnostic time system - a true UTC

<comment><USER18> That'd be TCB--[https://en.wikipedia.org/wiki/Barycentric_Coordinate_Time](https://en.wikipedia.org/wiki/Barycentric_Coordinate_Time)

But we'd need a different standard if we colonized planets outside our solar system.

</comment></comment></comment></comment><comment><USER19> "There may come a time — if you have cultural civilizations that are living in this environment and you want to preserve the seasonal significance of a particular date on the calendar — that you would likely introduce some sort of a leap system,"

It never occurred to me until reading this that the main reason we care about syncing our calendar to the seasons is mostly cultural.

We could easily just count days and have equal months and be done with it if we didn't care about certain days happening in the same season.

Very interesting!

<comment><USER17> In fact, it was the Catholic church that officially declared the Gregorian calendar we use today. The motivation was to make sure Easter always fell on the same day.

<comment><USER5> Not quite on the same day as may be seen that it didn't fall on the same day before or after.

But he wanted it to stay close to the equinox.

</comment></comment></comment><comment><USER7> Doesn't every planet? I'd be astonished if every planet completed a revolution in a perfect multiple of rotation time. Wouldn't it would have to be an engineered system if it did.

Or is that just tidal locking? I know the moon does something similar but there it seems like revolution time = rotation time, not perfect multiple.

<comment><USER20> > But there is one planet where the calendar would need zero finessing: > Mercury. The small planet revolves exactly three times, or days, over the > course of two years — allowing its calendar to naturally align every other > year.

I would imagine that this is some form of resonance, like the tidal locking of the moon, but i can't explain it myself.

<comment><USER21> It is indeed:

> In some cases where the orbit is eccentric and the tidal effect is > relatively weak, the smaller body may end up in a so-called spin–orbit > resonance, rather than being tidally locked. Here, the ratio of the rotation > period of a body to its own orbital period is some simple fraction different > from 1:1. A well known case is the rotation of Mercury, which is locked to > its own orbit around the Sun in a 3:2 resonance.

[https://en.wikipedia.org/wiki/Tidal_locking](https://en.wikipedia.org/wiki/Tidal_locking)</comment></comment></comment>


What Programming methodology is this? - <AUTHOR> What is the programming methodology where only one person, at the time, is writing code while others developers, DBA, even the client are behind of him providing ideas or corrections, rotating the person who is writting code.<p>Months ago i read an article here at Hacker News about this, but i can not remember the name. <comment><USER2> It seems like a team building exercise. Everyone sees how everyone else works, and helps them grow. The 'client' is there to provide feature requests to see how whoever's on the hot-seat implements those and responds to changes/criticisms.

Note: In this scenario the client might just be a senior programmer, pretending.

</comment><comment><USER3> Mobbing?

[http://benjiweber.co.uk/blog/2015/04/17/modern-extreme- progr...](http://benjiweber.co.uk/blog/2015/04/17/modern-extreme-programming/)

</comment><comment><USER4> Probably "Cheap programming" as you can't afford to have more than one computer, everyone gets chance on that one computer in round robin way.

</comment><comment><USER5> It's the "Convince-your-competitors-to-use-it" methodology.

</comment><comment><USER6> Burnout driven programming.

</comment><comment><USER7> search google for "pair programming"

<comment><USER8> Well pair programming is when there are two programmers working together on one terminal.

When you have the whole team waiting behind the guy at the keyboard, I would call this methodology "Dumbest".

</comment></comment><comment><USER9> extreme programming ?</comment>


Study Finds Pesticides Linked to Depression in Farmers - <AUTHOR> http://modernfarmer.com/2014/11/landmark-20-year-study-finds-pesticides-cause-depression-farmers/

<comment><USER2> To read the actual paper: [http://ehp.niehs.nih.gov/1307450/](http://ehp.niehs.nih.gov/1307450/)

Results: After weighting for potential confounders, missing covariate data, and dropout, ever-use of two pesticide classes, fumigants and organochlorine insecticides, and seven individual pesticides—the fumigants aluminum phosphide and ethylene dibromide; the phenoxy herbicide (2,4,5-trichlorophenoxy)acetic acid (2,4,5-T); the organochlorine insecticide dieldrin; and the organophosphate insecticides diazinon, malathion, and parathion—were all positively associated with depression in each case group, with ORs between 1.1 and 1.9."

</comment><comment><USER3> Did they control for crop loss and farmer knowledge?

There is a chance that the causal links go like this:

* lack of knowledge -> spray at wrong time

* spray at wrong time -> no pests killed

* no pests killed -> crop loss

* crop loss -> income lost -> depression

* crop loss + lack of knowlege -> spray even more at the wrong times

Thus creating a destructive feedback loop with depression as an accidental side effect of the process. I can say with a high degree of certainty that each single link appears to be true. We'll say 90% confidence factor for each of the five steps, 60% total confidence factor across the whole causal loop.

Knowledge is a _huge_ factor for farming. I can say that from watching my family farm over the past 20 years, that as my family has figured out what to spray and (more importantly) when to spray our pesticide use has dropped and our yields have gone up.

<comment><USER4> This question should really be answered (props for bringing it up), without that being the case the value of the research is severely compromised!

<comment><USER3> It looks like one of the factors was "cumulative days use of any pesticide". However this did not take plot size into account - a farmer with a large plot and an appropriate use of pesticides is in the same category as a farmer with a small plot and an overuse of pesticides.

"Farm size" was mentioned in the previously identified confounding factors, but not one that was corrected for in the study after seeing it made no difference? Education was a confounding factor that was accounted for.

"Cumulative days use per acre" would be an interesting factor to test, but varies greatly between various crops and climates. "Crop loss despite pesticide application" would be the real one to measure but that requires a certain degree of god-like knowledge. Days-use-per-acre over time and yields- per-acre over time is probably the best that could be managed, where "time" is at least 5-10 years.

One term in the paper went over my head and I can't find a definition or sufficient context. Does "ever-use" mean a small amount or a large amount? (once-ever or for-ever)

</comment></comment></comment><comment><USER5> Having grown up on a farm it is usually the cost of pesticides that trigger depression!

</comment><comment><USER6> The much more interesting question: what do all those biozides do to the non- targetted wildlife, e.g. cats, dogs, bees, frogs, fish in the downstream of rivers where the rain accumulates...

At least in bees there are already concerns that massive amounts of biozides contribute to hive deaths.

</comment><comment><USER7> One statement that I disagree with is the one that farmers apply the majority of pesticides. In actuality commercial applicators, most likely employees of commercial fertilizer companies or Coops are applying a very large amount of total pesticides.

I spent twenty years in the fertilizer business as an agronomist. Interestingly a government study back in the nineties found a link between commercial pesticide applicators and depression. In that study it was only insecticides that caused problems. Note a large percentage of those insecticides are no longer applied as extensively because of genetically modified seeds.

</comment><comment><USER8> It seems to be mainly insecticides which are dangerous. This is because insecticides are by design meant to harm animals, which have much more biologically in common with us than plants or fungi.

</comment><comment><USER9> Just read about Roundup being commonly used by wheat farmers to "desiccate" the crop before harvest (allowing for earlier harvest). Maybe this whole gluten intolerance thing is actually a Roundup intolerance.

<comment><USER10> Given that this study is about pesticides, not herbicides, and glyphosate (RoundUp) wasn't one of the chemicals tested, I don't think there's any evidence for that here.

<comment><USER9> I should have put "off topic" in my comment, but I thought it was obvious since I didn't mention a pesticide or depression. I just thought my comment might be of interest to anyone that would be reading the post.</comment></comment></comment>


Idea vs execution: are ideas worthless? - <AUTHOR> http://blog.opportunitycloud.com/2011/03/31/idea-vs-execution-are-ideas-worthless/

<comment><USER2> It seems as if you have to put idea and execution together to really produce something of value. The real value comes from the looped feedback system from idea to execution to an idea modification to an execution modification ...etc . If you keep repeating that process you'll eventually come up with a great idea and a great execution. It's the feedback and improvement process that comes from the two that results in innovation.</comment>


Show HN: SVG Path Builder - <AUTHOR> http://anthonydugois.com/svg-path-builder/ <comment><USER2> This is really cool and really well done. You should probably put the link to the GitHub page on it and add a LICENSE file to specify if it's open source though!

It would also be really nice to have a feature to hide the points and control points to see what you've made more clearly.

GitHub link for others: [https://github.com/anthonydugois/svg-path- builder](https://github.com/anthonydugois/svg-path-builder)

<comment><USER3> I would like to see a license as well. Replies in general would be neat. Show HN and disappear for 6+ hours I guess.

</comment></comment><comment><USER4> Awesome! Definitely using this to make icons. Way handy to have something simple and online, and not have to fire up Inkscape or Illustrator.

Issues I saw: Ctrl-click to add point doesn't work well on OSX, where ctrl- click doubles as right-click and brings up a context menu.

After ctrl-click and seeing the context menu, it gets stuck in add-point mode until I tap ctrl again.

Maybe it would be easiest to add-point when you click in the background, and select-point when you click on a point?

Having an insert-point function would be really handy. Maybe it would be easiest to make it so that add-point checks the selected point before adding, and joins the selected point to the new point.

Might be nice to allow the point type options on the first point, in the case where you close the path? I don't know SVG paths well enough to know if it supports that natively, but if the only way to close a path is with a straight line, it limits the usefulness of having a close path option, yes?

<comment><AUTHOR> Thanks! Your suggestions are very relevant. The point insertion function is planned for the next update, as well as the ability to change the path code.

The close path function is natively present in SVG. The code ends with the command Z when you want to close the path. The first point is declared using the command M (Move To), so if you want to end the path with a curve, you just have to close it manually with an actual point. :)

</comment></comment><comment><USER5> Am I being thick? When I hold ctrl and click (on mac), the web context menu pops up and prevents me inserting a point. Although when the menu disappears I actually can add points. Also I have no idea how to create quad or bezier points.

EDIT: oh I am being somewhat thick, you can scroll down to see more menu options like line type. Its not at all obvious though at the resolution I am on. he CTRL click issue is still open for me though

<comment><USER6> Isn't control-click a right click emulation by default on OSX?

<comment><USER5> yeah. so thats the problem, ctrl + click is not usable on mac.

</comment></comment></comment><comment><USER7> Look at what I managed to do with this tool:

[http://imgur.com/hRJIKBW](http://imgur.com/hRJIKBW)

You know what that means? That this tool understands Bezier curves better than Adobe Illustrator. Why? Because Adobe has never heard of the phrase "cusp node".

If you have Illustrator, I challenge you:

\- Draw a box with 4 sides

\- Try and curve the top line _without causing the side lines to curve_

\- Welcome to insanity.

Kudos to the author of this tool. Shame on Adobe.

<comment><USER8> Not to take away from how cool this site is, but that is actually really easy to do in Illustrator.

\- Draw a box with 4 sides.

\- Use the Anchor Point Tool (shift + c) to select the top line and drag it. The adjacent points will split their anchors.

You can use the Anchor Point Tool to convert points between corner mode, mirrored anchor mode, and split anchor mode. Not sure if those are the official terms.

<comment><USER9> seriously. this is like AI 101.

<comment><USER7> Forgive me for being a little skeptical but can you show us a screenshot of the "toast shape" done in Adobe Illustrator (showing the guide lines, please)? (I'm changing the challenge a bit because just dragging the top line isn't the same as bestowing the top corners with guides and this challenge now necessitates the guides):

[http://imgur.com/UbcUfMu](http://imgur.com/UbcUfMu)

And make sure to tell us how long it took you. In SVG Path Builder the toast shape above took me 10 seconds, and it never gave me grief by trying to curve the sides, while still giving me the guides for each of the relevant corner nodes. Drawing that in Inkscape is just as easy. Same for CorelDraw.

If you can manipulate the guides of your corner nodes and have them affect only the top side, then you've succeeded in making those two top corner nodes cusp. I have never seen anyone online showing cusp nodes in Illustrator.

<comment><USER8> Sure, here is a toast shape: [http://imgur.com/x86KzRb](http://imgur.com/x86KzRb) Took about 10 seconds as well.

Again, the anchor point tool is necessary here. First you drag the top line up to add split anchors (or cusp nodes, haven't ever used that term) to the two adjacent points. Then you can use either the anchor point tool or the direct selection tool to adjust the two new anchors.

The anchor point tool is essential to using Illustrator. You can read more about it under "Convert an anchor point precisely using the Convert Anchor Point tool" here: [https://helpx.adobe.com/illustrator/using/editing- paths.html](https://helpx.adobe.com/illustrator/using/editing-paths.html)

One feature Adobe Illustrator is sorely lacking (afaik) is grid snapping for anchors. They will snap to objects, lines, and points, but grid snapping would be really helpful.

</comment></comment></comment></comment></comment><comment><USER10> This should just be the interface for path editing in Inkscape. Inkscape already has these features, but you have to randomly and madly left, right, and double-click various things along with some random keyboard modifiers until you get what you want.

On another note, Blender seriously needs a more intuitive interface like this.

<comment><USER11> Inkscape could have had the world if they just copied Adobe Illustrator, but instead they came up with their own unfamiliar UI. I'm not saying their UI is worse that Illustrator (although I feel that way personally), but it's not _better enough_ to justify the learning curve. I have to imagine Inkscape contributors were smart enough to realize this, so I guess they were afraid of getting sued. Same goes for Gimp/Photoshop.

<comment><USER12> I know nothing about Adobe, so I think Inkscape have more problems than being "Unfamiliar."

It's OK, but I never seem to remember if I'll change a property for a tool or my previous operation.

</comment></comment></comment><comment><USER5> You star! I was fumbling around with animatron (also pretty good) but this is more direct implementation for what I need for static svg paths. Great job!

[https://www.animatron.com/explore#staff- picks](https://www.animatron.com/explore#staff-picks)

</comment><comment><USER13> What I do for SVG logos is coding them directly in a live editor: [http://www.gamesfrommars.fr/live-svg- editor/](http://www.gamesfrommars.fr/live-svg-editor/)

</comment><comment><USER14> Lovely. I kind of grown affected to SVG after I had to create a lot of SVGs at our last customer. It's cool because all you need is a text editor and a SVG viewer (I use [1]) to create images.

Manually creating paths can be pretty difficult though and that's why I am happy to see tools like this one.

[1]: [https://atom.io/packages/svg-preview](https://atom.io/packages/svg- preview)

</comment><comment><USER15> Do you know svg-edit ([http://svg- edit.googlecode.com/svn/branches/stable/editor/sv...](http://svg- edit.googlecode.com/svn/branches/stable/editor/svg-editor.html))? It is an older project but it works quite well for me when I need to draw some SVG (not very often). It would be interesting to see how the two compare.

<comment><USER16> Spot on. Here is the one I used: [http://editor.method.ac/](http://editor.method.ac/)

</comment></comment><comment><USER17> Love it! I can see my self using this tool to create perfect SVG icons.

One thing it looks like it is missing is zooming.

<comment><AUTHOR> Thanks! I'll work on a zooming function. ;)

</comment></comment><comment><AUTHOR> Thank you very much guys! This is one of the first times that my work is so well received, and woh, what a great feeling! :D

I take into account your comments and suggestions. I will work on this strange behavior on Mac too. Thank you again.

</comment><comment><USER16> I found this one pretty useful as well: [http://framavectoriel.org/svg- editor.html](http://framavectoriel.org/svg-editor.html)

</comment><comment><USER18> I would love to use it, but would like to see a license first.

<comment><AUTHOR> There is a license [https://github.com/anthonydugois/svg-path-builder/blob/gh- pa...](https://github.com/anthonydugois/svg-path-builder/blob/gh- pages/LICENSE.md) :)

</comment></comment><comment><USER19> This is brilliant! Thanks for sharing.

</comment><comment><USER20> Awesome work!</comment>


Show HN: Share your memory and we will photograph it - js-coder http://www.snapmymemory.com/

<comment><AUTHOR> I hate to ask but how does this even work (sorry I don't get it)? I send to a detailed story and you make a mock scene of it and send me the picture?</comment>


NASA reveals new plan to stop asteroids before they hit Earth - <AUTHOR> https://www.nbcnews.com/mach/science/nasa-reveals-new-plan-stop-asteroids-they-hit-earth-ncna885316 <comment><USER2> Leviticus Lewis is a pretty spectacular name for a man tasked with smiting asteroids.</comment>


The Potential of Big Data - <AUTHOR> http://www.pcmag.com/article2/0,2817,2389276,00.asp <comment><USER2> TS;DR[1]: There's a lot of data. Business opportunity!

________________________________

Notes:

[1] Too short, didn't read.</comment>