HNHacker News
TopNewBestAskShowJobs

ericmoritz

734 karma · joined January 6, 2011

submissionscomments
ericmoritz··on Pyre: Fast Type Checking for Python
Java's verbosity made us all hate type systems in the early 2000s so many of us migrated to dynamic languages such as Python, Ruby in the mid 2000s that allowed us to work fast and loose and get things done.

After about 10 years of coding in a fit of passion we ended up with huge monolithic projects written in dynamic languages that where extremely brittle.

Fortunately languages with type inference (Rust, Golang, OCaml, Scala, etc) started becoming the answer to our problems. (We also collectively decided that Microservivces were another solution to our woes though that cargo cult is being questioned).

So we have a decade of code and packages written in Python and JavaScript that work well for our use cases (Data Science, MVP web apps/services, Database integration, etc) that is hard to give up. Often because alternatives aren't available yet in the statically typed languages (Hurry up Rust!).

There is often a lot of friction to get new languages introduced. I love Rust, but I don't think I can introduce it into our Golang/NodeJS/Javascript environment anytime soon.

ericmoritz··on Twitter Soars After Surprise Sales Gain, First Real Profit
I've pretty much dumped Twitter for Mastodon. My mental health couldn't keep up with the air of constant outrage on Twitter.
ericmoritz··on Mozilla’s Send makes it easy to send a file from one person to another
Yup, that's exactly what they're doing: https://github.com/mozilla/send/blob/65c24990cd1646bc8c6e6c0...
ericmoritz··on Mozilla’s Send makes it easy to send a file from one person to another
I don't know for certain without digging into the code but they are probably using the WebCryptoAPI and doing everything client-side to encrypt the file.

The URL that is shared contains the key for the file. You'll notice that the URL contains a fragment identifier, i.e the #foo part of http://example.com/#foo, this isn't transmitted to the server by the browser and therefore the key isn't exposed beyond who the URL is shared to.

https://www.w3.org/TR/WebCryptoAPI/

ericmoritz··on Raspberry Pi Zero W, with Wi-Fi and Bluetooth, priced at $10
I would get a Z-Wave daughter board and use Z-Wave devices for controlling the electronics. Z-wave devices aren't Internet connected so you only have to worry about locking down the Pi.

Apparently there's already an open source project called Home Assistant for this purpose.

https://home-assistant.io/

ericmoritz··on Easy XMPP: What are we doing here?
We don't need another federated network. Administrators of those nodes are putting themselves into danger. What we need to develop is a purely decentralized p2p network that is resistant to censorship and eavesdropping.
ericmoritz··on How We Designed for Performance and Scale
Keep in mind that Erlang processes != System processes. Erlang processes are preemptively scheduled microthreads that are scheduled by the Erlang VM.
ericmoritz··on How We Designed for Performance and Scale
No, usually there's an accept process spawning working processes and passing the connection off to it.

Erlang can have two versions of a module present in memory at a time. At the moment of a code upgrade, the processes working with existing connections continue to use the old code while newly accepted connections are passed to the version of the module that was loaded in between connection accepts.

ericmoritz··on Tim Berners-Lee: 25 years on, the Web still needs work
The comments here describe doom and gloom of the web dying.

I doubt the web is going anywhere. The future is going to hyperlink driven link data services that can power both native and web clients.

I have started to architect such a solution for my employer and let me tell you, it is the freaking future!

ericmoritz··on Riak 1.4 Released
Turner broadcasting uses Lua/openresty and riak: https://github.com/bakins/lua-resty-riak
ericmoritz··on Awsbox: A DiY PaaS for Node.JS
Basically, open heroku
ericmoritz··on Awsbox: A DiY PaaS for Node.JS
This is a fantasy of mine as well. A generic opensource PaaS would be awesome. Now if I just had the ambition... It is quite an undertaking.
ericmoritz··on Mock your HTTP responses to test your REST API
this isn't any better than using a live server for testing.

Build a good client library for your applications to use, mock the client library and don't worry about tests failing because of availability problems.

ericmoritz··on The McDonald's Theory of Bad Ideas
Works until you're forced to build a PHP site with GDBM as a backend because everyone but you thought it was a good idea.
ericmoritz··on Why Python, Ruby, and Javascript are Slow
Using generators in Python will get similar laziness in Python:

    from itertools import imap
    map(f, imap(g, imap(h, someList)))
I think Python 3's map built-in is a generator so you no longer have to use the itertools module.

Unfortunately we don't have . or currying in Python so no pointfree python :(.

    from itertools import ifilter
    # ugly python function with a "Maybe dict" return type
    def query(data, date):
        """Return the first dict where date is > x['date'] or None"""
        is_greater = lambda x: date > x['date']
        return next(
           ifilter(
               is_greater,
               data
           ),
           None
        )
ericmoritz··on Why Python, Ruby, and Javascript are Slow
If you really want power, use NumPy:

    from numpy import arange

    def squares_numpy(n):
        a = arange(n)
        return a * a

    $ python -m timeit -s "from squares import squares_append" "squares_append(1000)"
    10000 loops, best of 3: 130 usec per loop
    $ python -m timeit -s "from squares import squares_comprehension" "squares_comprehension(1000)"
    10000 loops, best of 3: 95.4 usec per loop
    $ python -m timeit -s "from squares import squares_numpy" "squares_numpy(1000)"
    100000 loops, best of 3: 5.31 usec per loop
ericmoritz··on Why Use Make
I can't tell you how many projects I've shelved for months and when I returned thought, "Damn it. How do I build this again? Oh look a Makefile. Thank you Past Eric."

Even for projects that use more sophisticated build tools like rebar, leiningen or npm I write a Makefile so I don't have to remember those tools. Make provides a universal interface to those tools.

ericmoritz··on Python vs. Node vs. PyPy benchmarks
Yeah, because of cowboy and Erlang's design it is going to out perform a single process evented server hands-down.

  1. The evented servers are bound to one CPU, Erlang will use all CPUs 
  2. any bit of blocking code will stall the other code, even it just for a moment.
It is a little unfair to compare the two approaches.
ericmoritz··on Heroku Blog: Routing Performance Update
As far as I know, the one process per dyno is not a restriction that Heroku puts on the application, it is an architectural decision of the application.

Spawn up worker pool if you want > 1 req at a time.

ericmoritz··on How Lisp is Going to Save the World
I'm missing something; how does LISP enable bug-free programs?
ericmoritz··on Erlang OTP Tutorial For Beginners
"OTP in Action" is an excellent book for learning OTP.

The following reading will take you a long way with Erlang:

Learn you some Erlang http://learnyousomeerlang.com/

OTP In Action http://www.amazon.com/Erlang-OTP-Action-Martin-Logan/dp/1933...

On Erlang, State and Crashes http://jlouisramblings.blogspot.com/2010/11/on-erlang-state-...

"Making reliable distributed systems in the presence of software errors" http://www.erlang.org/download/armstrong_thesis_2003.pdf

The last two links are "Erlang propaganda" describing the hows and whys of Erlang.

ericmoritz··on FreezeGun: easy mocking of Python datetimes
nice project. I usually avoid this by making my APIs accept a datetime objects and make the client code create the datetime object.

Pure functions make tests simple.

ericmoritz··on Should Gittip use an ORM or raw SQL?
The correct solution is to abstract away the database from the developer. An ORM forces a square peg into a round hole.
ericmoritz··on Playing with Go: Embarrassingly Parallel Scripts
Or Erlang

https://gist.github.com/bb01a85404e6b445dcb3#file_resolve_do...

    % -*- erlang -*-                                                                                                                              
    %%! -smp enable                                                                                                                               
                                                                                                                                                  
    worker(Hostname) ->                                                                                                                           
        {ok, IP} = inet:getaddr(Hostname, inet),                                                                                                  
        io:format(                                                                                                                                
          "~s => ~s~n",                                                                                                                                 
          [ip_to_string(IP)]                                                                                                                      
         ).                                                                                                                                       
                                                                                                                                                  
    ip_to_string({N1,N2,N3,N4}) ->                                                                                                                
        io_lib:format(                                                                                                                            
          "~w.~w.~w.~w",                                                                                                                          
          [N1,N2,N3,N4]                                                                                                                           
         ).                                                                                                                                       
                                                                                                                                                  
    main([DomainFile]) ->                                                                                                                         
        {ok, Bin} = file:read_file(DomainFile),                                                                                                   
        String = binary_to_list(Bin),                                                                                                             
        Domains = string:tokens(String, "\n"),                                                                                                    
        plists:foreach(                                                                                                                           
          fun(Domain) -> worker(Domain) end,                                                                                                      
          Domains                                                                                                                                 
        ).

This uses https://github.com/eveel/plists/
ericmoritz··on templayed.js - The Fastest & Smallest Mustache Compliant Templating Library
not as ridiculous as this. https://gist.github.com/969788
ericmoritz··on HTTP 2.0 Draft – SPDY Protocol
oh man, this one is and its "clear host cache" will come in handing in the future. chrome://net-internals/#dns
ericmoritz··on Am I (Un)Hireable As A Coder?
You sound like every contractor being hired everyday in the DC Metro area.
ericmoritz··on Nexus 4′s Glass Back, the Worst Idea Since the Last Phone With a Glass Back
This is exactly what I do. I don't even have to look at the connector
ericmoritz··on The Erlang Stack
This is handy if you every find yourself hacking together a parallel map for a escript:

https://github.com/rprimus/plists

ericmoritz··on We're doing for payments what MP3s did for CDs
It is basically a pre-paid credit card without the plastic and fees
Page 1 of 8Next →