HNHacker News
TopNewBestAskShowJobs

jetti

1,446 karma · joined November 17, 2011

Current Clojure (and former C#) developer that plays with Elixir and Rust in my free time. Maintainer of Plsm[0]

You can reach me at jon [at] dontbreakthebuild [dot] com

[0] https://github.com/jhartwell/plsm

submissionscomments
jetti··on I finally found a use case for my Raspberry Pi Model B+
I also recently found a use for my rpi 3b as well. I bought a $30 USB SDR Receiver [0] and started collecting ADS-B [1] data and uploading to ADS-B Exchange [2]. I have been collecting flight data for aircraft flying overhead for a few weeks now and it is super interesting to see what kinds of aircraft are flying around me. There are a lot more military planes that I would've expected.

[0] https://www.adafruit.com/product/1497

[1] https://www.faa.gov/air_traffic/technology/adsb

[2] https://www.adsbexchange.com/

jetti··on EDI vs. API
I worked at a healthcare company at my last job and dealt with the X12 EDI. We had several ETL processes just to convert X12 834s (benefits/membership enrollment) into a common file format because every client seemed to do something different that was not part of the spec. It was hard because we would get the data from clients and since we were taking their money we had to accommodate their butchering of the specs. The thing is, though, that many of the files we received were generated from a COBOL program and then moved to our SFTP server. It isn't like there are many (if any) COBOL libraries that validate or enforce the standards and it isn't like they would be able to just update their COBOL programs to make API calls either.
jetti··on Are we losing enterprise desktop?
There are many places that have desktop application development teams but the application(s) are internal only so it doesn't exist to the outside world. I have done desktop development with .NET at a couple companies and have been contacted by recruiters for other jobs for desktop software written in .NET.
jetti··on Rocket Mortgage to trim 8% of workforce as home-loan market shrinks
I can't speak for the places that you contacted, but I know where I work there was a large amount of work for a staff that hadn't ramped up to meet the demand. There were people who coordinated closings that were working 80+ hours a week for almost a year in order to barely keep up with demand.

"There must be some pretty large moats in this industry because most shops are clearly not competing on competence or customer service."

There is. It is a capital intensive business that has licensing requirements for every state that you do business in. There are mortgage companies that will loan you the money and then turn around and sell that loan to an investor who would then service the loan. There are also mortgage companies that will loan you the money and also service the loan for its entire lifetime. In the case of the former, you can make your money back relatively quickly as you should be trying to sell the loan to an investor around the time of closing but there is risk in doing so. If you haven't done your due diligence about the borrower and something negative about the borrower comes to light (such as borrower lying about income) then the company that is buying the loan can pull out and now you are on the hook for a large loan that you issued to somebody who may not be qualified. With the latter, your income is going to be slow at first since you would only be making money from monthly payments.

jetti··on Rocket Mortgage to trim 8% of workforce as home-loan market shrinks
I imagine that Rocket increased their workforce by more than 8% between spring of 2020 and now. I work for a mortgage company and layoffs have happened multiple times this year. With rates so low for almost two years the volume increased significantly. In order to deal with that volume the company most certainly had to hire many people and quick. The market conditions can't support keeping those individuals (or at least the number of positions that were added) during the pandemic. People who work the operations jobs (who are behind the scenes helping the loan officer close loans) know the market is cyclical and know that layoffs are a part of the business.
jetti··on Ask HN: As this is the first major large scale cyber-war, thoughts?
The resources that nation states have are going to always trump what private corporations and socially organized random citizens. Anonymous is not going to be able to pull off hacks against industrial control systems. Those are the hacks that are going to make differences. Things like the Ukraine power grid hack [0] from 2015 or the hack of a dam in suburbs of New York [1] are the cyber attacks that are going to make a difference in times like these and those don't happen without a lot of planning and resources. Defacing government websites or even DDOSing those same sites is not going to make a big difference (or potentially make any difference).

[0] https://en.wikipedia.org/wiki/Ukraine_power_grid_hack

[1] https://www.nbcnews.com/news/us-news/iranian-hackers-claim-c...

jetti··on Try Clojure – An interactive tutorial in the browser
I have been using Clojure professionally for the last 2.5 years, after doing 9 years of C#, and really enjoy it. I recently got a Windows laptop and was interested in ClojureCLR. It has a ways to go in terms of coming close to tooling of JVM and ClojureScript. David Miller has done an amazing job at keeping the project going and I hope I can give back to that community
jetti··on Ask HN: Whats the tech stack that top-tier hackers use for staying undetectable?
Also, never use the same username or email address for more than one site. If you reuse names/email addresses then when a site is hacked and there is a db dump of user data it is only a matter of time before the dots can be connected
jetti··on Nasm – A cross-platform x86 assembler with an Intel-like syntax
I'm starting to learn reverse engineering and while doing that I have had to read a bunch of assembly but also write a small amount too. I don't use NASM and am only writing a few instructions at a time, mainly either updating an existing instruction or replacing an instruction with one or more that are the same size
jetti··on Ask HN: Which programming language do you plan to learn in 2022?
I'm hoping to get a new job that would require me to learn Scala, so that would be on my list. Other than that I want to learn Haskell and Plutus (Haskell based smart contract language for Cardano).
jetti··on Ask HN: Is every restaurant going to have a digital menu?
I hope they don't become standard and they go away soon. The two main reasons are that not everybody has a smartphone or the ability to scan the QR code and security.

My mom still has a flip phone and does not want to get a smartphone at all. Not everybody has the desire to have a flip phone. They would not be able to look at the menu in any meaningful way.

Many of the restaurants I've seen with QR codes for menus have the QR as a sticker on the table. It isn't hard for somebody to create a QR that leads to a malicious site and just place those on top of the existing QR codes.

jetti··on Create ad-hoc ClojureScript scripts on Node.js with nbb
I disagree with this. I use Clojure and Clojurescript at my day job and know very little JS and virtually nothing from ES6 and beyond. The only time, that I can think of, that I actually needed to directly reference Javascript was when I was needing to do some downloading of files through an API call. I used some of the Google Closure classes as well as Blob. Other than that everything I need is already in a nice clojurescript wrapper over the javascript libraries.
jetti··on Ask HN: Do You Use a Debugger?
Back when I was doing C# development I would use the Visual Studio debugger all the time and was pretty happy with it. When I moved to doing Clojure and ClojureScript I decided to learn emacs and stopped using a debugger until I learned about the debugger in Chrome when using clojurescript dev tools (it will allow you to set breakpoints in your ClojureScript source in the Chrome Developer Tools console).

My technique for debugging with Clojure + emacs was to use a bunch of print statements and then also using a repl to try and duplicate the issues or at least see what was going on. Less than a month ago I started using the CIDER debugger inside emacs and have been happy with it overall. There are some issues I have had, namely that you can't set breakpoints in macros which is understandable. I have gotten around that by creating a temporary function and move all the code into that function. The main use case I have for doing that is when trying to debug Compojure routes, which are defined in macros.

jetti··on Ask HN: Is it worth learning Elixir, from a jobs perspective?
I went from doing around 8 years of C# experience to a job using Clojure and ClojureScript full time while having zero previous experience with Clojure. The one of the internal recruiters at the company reached out because they saw I had a somewhat popular Elixir project on github. I also have experienced what you have with regards to Elixir. I had a recruiter call me asking if I was interested in an Elixir position and while talking with her I mentioned that I have had no professional experience with Elixir and she said that the client was looking for somebody with at least a year of professional experience with Elixir. I didn't push the fact I had an open source project that was being used as I just lost interest in working with the recruiter because of that statement and the fact she seemed to be just reading from a script when talking with me.

From my experience, there are companies that will take in people who they feel are good hires and then will train them in the language that they use but they are few and far between. From what I've seen, those companies typically have their own internal recruiters. The biggest factor that could help and is under your control is to have some sort of project(s) available for people to see in the language(s) that you are targeting.

jetti··on Ask HN: Has anyone fully embraced an event-driven architecture?
Yea, I have use GitHub search in a pinch and sometimes it is helpful enough to show me exactly where to look. Unfortunately, though, there are several events we emit that are many layers of string concatenation, so GitHub search may narrow it down to 4 or so places and I have to manually go from there.
jetti··on Ask HN: Has anyone fully embraced an event-driven architecture?
Where I currently work we are all in on event-driven architecture. For our DLQs, we have alerts on when the queue is growing in size or if messages are in the queue too long. When those alerts come in, we manually move the messages back to the normal queue for reprocessing and if they get DLQed again after that we will look into the reason it is failing.

One of the benefits of this architecture for us is the ability to easily share information between services. We utilize SNS and SQS for a pub/sub architecture so if we need to expose more information we can just publish another type of message to the topic or if we need to consume some information then we can just listen to the relevant topic.

There are two big issues that I've run into while at this company. One is tracking down where events are coming from can be a big pain, especially as we are replacing services but keeping message formats the same. The other big issue is setting up lower environments (dev,qa,etc) can be difficult because you pretty much need the entire ecosystem in order for the environment to be usable, which requires buy-in from all teams in the organization

jetti··on Ask HN: What's the weirdest/best thing you've done with Emacs?
It isn't really a hack but the best thing I've done is use org mode for organizing work. I make a file for each sprint and each ticket in that sprint gets its own file which is hyperlinked in the sprint file. I can open the sprint file then navigate to each ticket which will have a link to the Jira ticket and then may directly link to certain lines of code that may be a central focus of the ticket.

Another thing I did with org mode was create a release document of all commits that are going into a release as well as the link to that commit in github, then exported to PDF and sent to the team. We had to cherry pick a bunch of commits for a release and in order to make it clear what was going out I organized it by newest to oldest and had the commit hash as a hyperlink.

jetti··on Ask HN: What's the weirdest/best thing you've done with Emacs?
Do you use org mode at all?
jetti··on Ask HN: How do you say no to your employer
My advice isn't based on your current situation (since there isn't much we can do about that now) but just how I got to the point where I feel ok saying no.

Last year I worked on a project and because of my mistakes it looked like we weren't going to hit our deadlines. I did not want others to have to suffer because of my mistakes so I made sure to work late (some days as late as 1AM) to make sure that our deadline was hit. Nobody asked me to do that but I didn't want others to suffer. We didn't hit our deadline but weren't too far off and people were overall ok with the situation as we were just headed into beta for the internal users. I'm pulled off that project and put on a new project, which is to work on something that literally made my previous months of effort obsolete. It was the project to completely replace the application that I worked extra on. Fast forward a few months and I am given a project that had a super aggressive timeline, which I didn't think could happen and I was told my estimate wouldn't be communicated out and I worded my estimate poorly thinking I covered my ass when I didn't and my estimate was communicated out. I was pressured hard to work nights but I pushed back and then I got to a point where I relied on another team and I couldn't get any further without them. It turns out nobody had actually verified that the other team had the functionality we needed (it was critical to what I was working on) and the other team hadn't even started working on the functionality that we needed. That was the straw that broke the camel's back, especially since they were wanting me to work the weekend before I brought up the fact that we don't have the pre-reqs even done and nobody from management actually verified we were ready to start. Since then I have pushed back on all attempts to get me to work late hours. I have seen mismanagement from terrible timelines to straight out lying to business people about things that are done when the work hasn't even started. Nothing changes if everybody keeps working late to hit crazy deadlines and management isn't affected at all if we do hit the deadlines as they aren't the ones taking time away from their personal life.

I have worked late a few times since that incident but it was because I lost track of time working because I was just so focused or because the delay was completely on me and I wanted to fix it so others downstream weren't affected

jetti··on Clojure by Example (2015)
I'm sorry but I am not comfortable sharing, however, here is a list of companies that I know use Clojure.

- Arena Analytics: https://arena.io/

- Reify Health: https://www.reifyhealth.com/

- Guaranteed Rate: https://www.rate.com/

- OppLoans: https://www.opploans.com/

- LookingGlass Cyber Solutions: https://lookingglasscyber.com/

I also believe that DRW (https://drw.com/) also use Clojure but not 100% sure on that. I know they use some Elixir though.

jetti··on Clojure by Example (2015)
Another two functions that I forgot to mention last night are filter and keep. I am actually surprise filter isn't already on the site.

filter takes a predicate and a collection and will return a lazy sequence of all items that the predicate returns logically true. For example:

  (filter odd? [1 2 3 4])
would return a lazy sequence of (1 3)

keep is a function that I was unaware of (and most of my team was too) until I was turned on to it by a former coworker. keep takes a function and a collection and returns a lazy sequence of non-nil results. For instance, if I have a collection of maps and I want to only get a value of a specific key I could do the following with map and remove

  (def items [{:v "hi"} {:v "there"} {:m "not v"}])
  (remove nil? (map :v items))
What the map does is get the key `v` from each map in the collection and we end up with a sequence that looks like `("hi" "there" nil)` Since the last map in the collection `items` does not have a key `v` the value will return nil. We would then need to use the remove function with the nil? predicate which will remove all items in the collection that are nil. If we use keep, though, we could do this in one pass.

  (def items [{:v "hi"} {:v "there"} {:m "not v"}])
  (keep :v items)
Because keep already removes nil for us we end up with `("hi" "there")`
jetti··on Clojure by Example (2015)
At work we would give new hires "Living Clojure". There is also the site https://www.4clojure.com/ if you are looking to do some exercises.
jetti··on Clojure by Example (2015)
Yea I used to do the merge and when as well. I'm not sure if there is an idiomatic way to do it but I personally prefer the threading style as it is "prettier".
jetti··on Clojure by Example (2015)
There are a few things I would like to see added as I have found them very useful in day to day work with Clojure(Script).

  cond-> and cond->> which takes an expression and then threads it through test/form pairs without short circuiting by stopping on the first test that returns true. I have used this a lot when conditionally adding to maps. Something like this:

  (let [base-map {:id "123"}
      name (function-that-could-return-nil)
      address (another-function-that-could-return-nil)]
   (cond-> base-map
      (some? name) (assoc :name name)
      (some? address) (assoc :address address)))

  If name and address are nil then I will still have the base-map.


  I also use some-> and some->> a lot as well. some-> and some->> operate similar to -> and ->> respectively but the difference is that there is a nil check before subsequent form. It will prevent nil results to keep being passed and can help alleviate NullPointerExceptions.

  As for maps, I recommend adding assoc-in, dissoc, update and update-in. assoc-in allows adding nesting to a map. I could do (assoc-in {} [:base :value] "test") which would result in a map that looks like {:base {:value "test"}}. dissoc removes a key from a map. update allows you to "update" a map by passing a key and function where the function has an argument that is the old argument. An example of that is (update {:name "James" :age 26} :age inc) which will increase the value of :age by 1. update-in allows you to do the same as update but in a nested structure
jetti··on Clojure by Example (2015)
I wholeheartedly agree. There are so many different ways to set up a project in Clojure that it can be a little overwhelming. There is boot, leiningen and deps.edn for managing dependencies as well as project structure. Then with ClojureScript there is shadow-cljs as well as improvements made with ClojureScript embracing the Javascript tooling by handing off the output of the compiler to a JS bundler.
jetti··on The Hotdog web browser and browser engine
The way I see it is that for many people web applications have replaced their need for desktop applications while giving a somewhat comparable experience. I think it would be a very hard sell for the average user to want to use a "minimal browser" because it could mean giving up a lot of day to day functionality they rely on.
jetti··on ClojureScript 1.10.844
It depends on what kind of project you are using it for.

Hobbyist/toy project - sure, using shadow-cljs you can do your front end entirely in ClojureScript and make calls out to whatever backend you want

Professional project with ClojureScript backend - sure, you can use shadow-cljs to target both node (using :node target) and the browser which will allow you to utilize ClojureScript for full stack and not have to rely on Clojure

Professional Project with non-clojure(script) backend - no. It would not be worth it to spend resources to learn clojurescript (talent pool of existing clojure devs is small) and not taking advantage of full stack clojure(script) can be detrimental

jetti··on Phel: A language inspired by Clojure that compiles to PHP
I'm definitely going to check this out. I was looking for a Lisp that compiles to PHP after using, and enjoying, Clojure at work. I was going to actually try and make one myself but then got distracted and moved on to something else.
jetti··on Choice paralysis between CL and Clojure
I will start by saying that I use Clojure at work and I have tried to get into CL in my free time but just can't get myself to commit.

> Clojure sounds like the choice to avoid because of the JVM

The JVM is most definitely a big reason you SHOULD choose Clojure over CL in my eyes. It allows access to a vast selection of existing libraries.

I'm not sure what sorts of projects you would want to do with the new language but if you plan to do web development (or mobile dev with React Native or desktop with Electron) with your choice of Lisp then Clojure allows you to do that with ClojureScript.

jetti··on Ask HN: A great software you liked, but not supported anymore
The problem with Delphi is the cost. I've tried it briefly but that was during a trial period and I didn't even get to use it much. Embarcadero's pricing on even the entry level products to use Delphi was way more than I was willing to spend in order to even see if I liked it.
← PreviousPage 2 of 34Next →