HN user

damncabbage

3,050 karma

Ruby/Haskell/JavaScript webdev based in Sydney, Australia.

  rob@robhoward.id.au
  http://robhoward.id.au
  http://twitter.com/damncabbage  
  http://github.com/damncabbage
Posts39
Comments663
View on HN
www.anandtech.com 9y ago

Seagate to Shut Down One of Its Largest HDD Assembly Plants

damncabbage
106pts93
www.atlassian.com 11y ago

Getting Git Right

damncabbage
4pts0
answers.microsoft.com 12y ago

MS Security Essentials reporting false positives in the Bitcoin blockchain

damncabbage
1pts0
opensslrampage.org 12y ago

OpenSSL feeds your private key to the system PRNG

damncabbage
7pts1
www.crowdtilt.com 12y ago

Let's make sure Heartbleed doesn't happen again.

damncabbage
5pts2
modelviewculture.com 12y ago

Model View Culture

damncabbage
3pts0
www.reuters.com 12y ago

Swiss to vote on linking bosses' pay to wage of office cleaner

damncabbage
18pts21
www.techworm.in 12y ago

(Unconfirmed) Twitter hacked, accounts leaked.

damncabbage
3pts3
productforums.google.com 13y ago

“Accounts merged and now my files are gone”

damncabbage
277pts111
blog.mailchimp.com 13y ago

Social login buttons aren't worth it

damncabbage
87pts69
www.theshortcutts.com 13y ago

The Short Cutts (Matt Cutts videos, summarised)

damncabbage
4pts0
inqk.net 13y ago

Note to Selves (on Event Management and Volunteering)

damncabbage
1pts0
gist.github.com 13y ago

Vagrant with apt-cache to speed up VM package installation

damncabbage
1pts0
www.theregister.co.uk 13y ago

How IT bosses turned the tables on our cushy consultancy gigs

damncabbage
24pts29
www.html5gamedevelopment.org 13y ago

The State of HTML5 Mobile Game Development

damncabbage
1pts2
www.folklore.org 13y ago

Make a Mess, Clean it Up

damncabbage
1pts0
www.smh.com.au 13y ago

Australian police want phone, web data kept indefinitely

damncabbage
2pts1
github.com 13y ago

GitHub bi-colour timeline graphs are back.

damncabbage
2pts1
github.com 13y ago

Strong_parameters integrated into Rails (RIP attr_accessible)

damncabbage
4pts0
muledesign.com 13y ago

Why I Need to Know Your Budget

damncabbage
1pts0
www.mrmoneymustache.com 13y ago

The True Cost of Commuting

damncabbage
7pts2
unprotocols.org 14y ago

How to Grow a Community

damncabbage
1pts0
twitter.com 14y ago

Yahoo! includes signing key inside Axis (anyone can publish as Yahoo!)

damncabbage
9pts1
angularjs.org 14y ago

AngularJS (Google-produced JS Framework)

damncabbage
12pts6
therabidbanana.github.com 14y ago

Eventbrite API Gotchas

damncabbage
1pts0
gist.github.com 14y ago

WooThemes still distributing exploitable code with Themes

damncabbage
3pts1
www.jabberwocky.eu 14y ago

Startups in Europe: Hurdles

damncabbage
3pts0
robhoward.id.au 14y ago

Temporal Testing with Timecop

damncabbage
1pts0
www.newscientist.com 14y ago

Entangled diamonds blur quantum-classical divide

damncabbage
1pts0
www.cbsnews.com 14y ago

Schools Grab .xxx Domains to Protect Names from Porn

damncabbage
4pts1
Sketches of Elixir 8 years ago

Relative to Ruby it has more upfront checking of some things. In Elixir, calling a function that doesn't exist or with the wrong number of arguments is something that will error out at compile-time; with Ruby, you don't find out until you run the code with the bad call.

I agree, though, that compared to Haskell and Rust it doesn't give you much. Dialyzer is (intentionally) a fail-open checker that doesn't allow expressing generics; I've had a rough time getting it to tell me my code is wrong. Credo is (intentionally) just a style linter. "Just let it crash" isn't useful when you're talking about code that is going to break because of its structural incoherence (a class of errors type-checker are good at catching), and not because of transient errors in external dependencies.

I checked out our shared Twitter history, we talked a fair bit in the past but I wasn't able to find _anything_ like this.

I mean this sincerely — are you _sure_ you didn't get me confused with someone else? I was definitely a dick from what I can see from the Twitter history and I apologize. However, I cannot remember and cannot find myself ever saying or implying something as horrendous as what you're describing here.

https://twitter.com/bitemyapp/status/477359528510382080

  [@bitemyapp] @KirinDave my first workflow video is up to 
  1,535 views on Youtube so far. Who knows how many people 
  have used my guide. I'm feeling good.

  [@KirinDave] @bitemyapp It is not about your traffic, it is 
  about their excitement. Get over yourself.

  [@bitemyapp] @KirinDave Drinking the haterade tonight. Some 
  of those pregger hormones transfer over?
  
  Should ramp up theft of Clojure library authors >:)

  [@KirinDave] @bitemyapp Yeah I'm hysterical that's real cool.

That covers a portion of the claim. (I'm trying to stay out of actually passing judgement on bitemyapp or his ">"-quoted defence or KirinDave's earlier claim.)

It falls short on many things TS would immediately flag

I'm kind of curious what you've run into personally. Having a dependency without any type-defs get silently treated as `any` is my own beef, but I haven't hit much else yet.

(Some type-defs' use for `any` also gets my goat, such as Promise's catch argument and some of the lodash functions, but I'm considering that a separate thing.)

And honestly, some of the decisions around the language just feel strange. Not knowing what kind of bool to use [0] is pretty emblematic of where it is going as a language.

This is more an existing JS weirdness (`true`/`false` vs `Boolean()`); Flow doesn't mess with runtime semantics, only adding a layer that you check with then strip out.

And TypeScript has the same thing:

  var a: boolean = new Boolean(1);
  
  // Produces:
  // NewTypering.ts(29,5): error TS2322: Type 'Boolean' is not assignable to type 'boolean'.

It means restricting to where you can perform IO actions, eg. printing to a log, writing to a shared area of memory, etc.

Haskell does this by representing IO actions as values, eg. "IO String" (something like "IO<String>", for people more familiar with that syntax), representing an IO action that, when later evaluated, will yield a string that you can use in subsequent actions.

Haskell's "main" (entry-point) function is a value of type "IO ()" (IO of a value representing nothing useful; you don't get anything out of it, so you just have a nothing placeholder). When a Haskell program is run, it ostensibly (hand-waving here) takes that IO value and interprets it, performing the action IO.

You have functions like putStrLn (print a line) that takes a String, and returns an "IO ()" . Accordingly, if you have

  main = putStrLn "Hello, World!"
... you have a value that lines up with the expected return value of main "IO ()". More complicated examples, like
  main =
    readLn >>= (\x -> putStrLn ("Hello, " ++ x))
... are doing the same thing (checking the types line up), just with more moving parts (the Monad thing you mentioned, which we're using to relate the "read line" function with the "print line" function).

The key bit is that it's just "IO Blah" values standing in for IO actions, and like jigsaw pieces, these IO-returning functions only fit together where the types line up, restricting how you can use them.

Monads are tangential to this; the type-checking of that jigsaw puzzle is what matters here.

A list of items in an array. Some items in that list are of particular note.

(Say you have 15 items in an array. For whatever reason, such as you not being in control of the expected input structure of whatever you're giving this JSON to, you have them grouped with comments at the top of each block.)

I've used the Haste compiler which IS Haskell that supports ALL GHC extensions except TemplateHaskell, supports the Cabal build tool and in practice it has its own ecosystem; most of Hackage will not compile on it.

As someone who's standing on the precipice of GHCJS, Haste and PureScript, I'm very curious to hear about your Haste experiences in this regard.

(I've been using PureScript in my side-projects for a bit. For the sake of completeness of this list, I've tried Elm and am not interested.)

Agreed; HipChat is unfortunately a bit terrible about this. I'll often "lose" a notification from someone when I'm offline: it sends an email, yep, but the chat client itself loses the "unread message" bubble. I have to make sure I check email on every reconnect.

I'd be cautious: the range is too small for me (6'1" / 188cm). On a regular desk that suits me, it doesn't go high enough, and if you prop things on the desks up a bit, you then need to remove them when you lower it.

(It's also a bit wobbly, which isn't great, but probably expected.)

... being signed in is in-memory state.

Can be in-memory state. Everything beyond toy-sized I've ever worked on has externalised this sort of state to a database of some kind, if only so you can run a second copy for the sake of failover. I don't believe your example is relevant.

  I'm of the opinion that languages around the 10 year mark 
  (which PHP is obviously well past) really ought to focus on 
  becoming the best X they can be, rather than chasing the 
  tail lights of constantly-moving best practice.
Would that include not adding:
  * Anonymous functions and closures
  * Namespaces
  * Late static binding
  * Dynamic dispatching to static methods
  * Rackup/SimpleHTTPServer-like web server
  * "finally" in exception-handling
  * Being able to call foo()[0] instead of the clumsy
    assign-then-dereference two-step.
What does "the best PHP it can be" mean? Anonymous functions (for example) are arguably way outside the style of the PHP from ten years ago, but they're tremendously useful.

(I used to use PHP. I dislike it as a language, but I have nothing against them continuing to improve it like they have over the last nine years.)

PS: PHP already supports threading via a PECL module. http://php.net/manual/en/class.thread.php

I think there may be a typo with the first example:

  newtype ID a = ID Int deriving (Eq,Ord,Show)
Should possibly just be:
  newtype ID a = ID a deriving (Eq,Ord,Show)
Git 2.0 12 years ago

I can almost understand with something like Subversion (which seems to subtly skew the entire development process to work around the friction some of its basic operations introduce), but not even Mercurial? :(

  This Crowdtilt will fund a focussed crowdsourced security assessment (otherwise
  known as a bug bounty) on OpenSSL.
  ...
  Security crowdsourcing company Bugcrowd will organize a “sprint bounty;”
  coordinating and incentivising the security research community to thoroughly
  test OpenSSL for potential security concerns.
I'm a little worried this is just PR move for Bugcrowd, but it might be genuinely useful in producing a bunch of bug reports for holes not discovered yet.

(Having said that, if you're a blackhat the amount you'd get selling or using anything you found would eclipse whatever Bugcrowd would pay you... But that'd happen regardless if this ran or not.)