1,013 karma · joined April 4, 2010
Join our growing team to work on a variety of problems across CircuitHub's entire stack. No direct experience with factory automation or electronics is necessary but we like curious people willing to learn.
Our stack:
* Haskell API server using GHC 8, Yesod, Opaleye, and many other libraries from Hackage.
* Elm front end.
* PostgreSQL for data storage, with querying via Opaleye & Rel8.
* AWS / Heroku for hosting.
* NixOS for development environments, continuous integration and deployments.
* Functional reactive programming for standalone GUI applications.
* Prometheus and Grafana for metrics and instrumentation.
What we look for:
* You enjoy figuring out what to work on and teaching yourself whatever you need to get the job done.
* You enjoy working as part of a team and you're also happy working on your own.
* An ability to move quickly and and respond to changing requirements.
* Pride in your work, taking ownership of features and collecting requirements from end users.
Interested? Get in touch! https://circuithub.com/careers/haskellers
On the practical side, I love having types that let me refactor so mercilessly, along with a very mature compiler with a decent suite of warnings.
I am trying to write my own formatter at the moment, and this is exactly the property I want, also. I'm working in Haskell, and one example is case statements. There are two ways I'd like to format them:
case foo of A -> ... B -> ...
or
case foo of A -> ...
B ->
...
The first is when every case fits on one line, but the second is when at least one case needs to span multiple lines. I don't want this:case foo of A -> ...
B -> ...
I haven't yet come up with a good way to do that heuristically and efficiently, but maybe just looking at how the original code is formatted would be enough! Thanks for providing some food for thought :) mkTexty :: Text -> Maybe Texty
mkTexty = \a ->
let a' = T.dropAround Char.isSpace (ICU.normalize ICU.NFC a)
in if T.null a' then Nothing
else Just (Texty a')
{-# INLINE mkTexty #-}It's really messy code, and I have to do a bunch of hacking to invent a type from the PostgreSQL function metadata, but once I do that I can invoke hint: https://github.com/ocharles/plhaskell/blob/master/PlHaskell....
Are you sure? And if so, can you convince me as to why you are so sure?
* Fully expire the accounts (and send emails asking them to reset their password)
* If they successfully login to their account and you have the plain text password, you can re-hash that using argon2i.
* Have them reset their password on next sign in before allowing them to do anything.
* Let the user know their account has less security than it could, and they can upgrade the security by changing their password.
Afaik, there is nothing you can do to upgrade their passwords, modulo argon2'ing the result of another hash function - I am simply too unclear on the safety of this approach so I don't do it.