Readit News logoReadit News
celroid commented on Ask HN: What are good self hosted time tracking software for consultants?    · Posted by u/thepra
tedtms · 3 years ago
I went back and forth between a couple of them -- Kimai2 and InvoiceNinja, back when Ninja was still on v4. Ultimately, every time tracking system does things a little differently, and after switching back and forth again, I've settled back on InvoiceNinja v5 (https://invoiceninja.com/).

If all you need is time tracking, Kimai2 and several others will do the job just fine. But I've found in my line of work that it's useful to be able to produce formal quotes and invoices for tracking purposes. Ninja lets you do all of that, no extensions or modules required, and all of the components are integrated with each other (quotes can be converted to invoices, projects, or both, invoicing can be done by task or by project, expenses can be included in invoices, etc.) and it also features a very nice automated emailing system for client invoice/quote notifications and even a guest frontend for them to log into.

So all in all, I've found InvoiceNinja to be extremely useful and can't recommend it enough.

celroid · 3 years ago
Is there a reason you need time tracking and invoice generation to be connected? In my case I need a monthly invoice that just needs the total hours worked for that month. It's always 8 hours times number of days worked.
celroid commented on Ask HN: What are good self hosted time tracking software for consultants?    · Posted by u/thepra
celroid · 3 years ago
Timetagger. It's the only one that got time tracking right for me. The others I've tried require filling tedious forms and are bloated with other unnecessary features like invoice generation. It also has a resume button for stopped tasks which is a godsent.
celroid commented on Ask HN: How do small companies do recruitment?    · Posted by u/lbriner
lb1lf · 4 years ago
I work for a small-ish engineering firm on a small rock off the Norwegian coast.

The local labour market for engineers, technicians and developers is pretty much empty - as in, everybody with the skills required and the desire to live here already does.

Recruiting more often than not means sniping, or, if we're lucky - that someone has recently found a partner with desirable skills and coaxed them into moving up here.

Anyway, we've found that word of mouth is the most effective way; we simply let friends and associates, former colleagues and whatnot know that we're looking for X.

This is a hundred times more effective than LinkedIn for vetting candidates - people are quite unlikely to uncritically recommend someone when they will be reminded of their sell-in for years if it is a dud. (Much unlike LinkedIn endorsements...)

It turns out with friends&associates, friends&associates' friends&associates &c, you can cast a quite wide net - and also, the sell-in works better both ways; the candidates who do show up for interviews already have been told ours is a good place to be and are, more often than not, a good cultural fit.

(And, before someone asks - 'cultural fit' means 'Happy to work in a rather unstructured madhouse where the unofficial motto is 'We've never done that before, so we're probably quite good at it!') - we've assembled a motley crew from just about every nook and cranny of the planet, from Sri Lanka via Belarus to Argentina and Japan and lots inbetween. Oh, and the occasional Norwegian. All making world-class subsea equipment on a small islet way out in the boonies.

celroid · 4 years ago
Do you not hire remotely from the entirety of the European Union? Would you consider hiring a web developer with 4 years of experience, of which 2.5 is backend and 1.5 is full stack (HTML, CSS, JS within a CMS)?

I am asking because that reflects my situation and I am having a difficult time interviewing with most people expecting 3+ year exclusively in frontend.

I have been trying to make a switch from backend to frontend development. I went from Backend Dev -> Fullstack Dev and I am currently trying to do the next step to -> Frontend Dev.

Would be nice to know how to approach this.

celroid commented on SICP: JavaScript Edition available for pre-order   mitpress.mit.edu/books/st... · Posted by u/dS0rrow
markc · 4 years ago
https://sicp.sourceacademy.org/ brings me to something called "Comparison Edition". I was looking for a straight JS version with editable/executable code, and found it at the link named "Interactive SICP JS" (which takes you to https://sourceacademy.org/sicpjs/index)

The in-line editor is a bit intrusive (fills up most of my screen, unlike say eloquentjavascript.net) but it's still pretty neat to have run-able examples. Kudos to the creators.

celroid · 4 years ago
Is this version the same as the one that's going to be released on paperback?
celroid commented on SICP: JavaScript Edition available for pre-order   mitpress.mit.edu/books/st... · Posted by u/dS0rrow
kazinator · 4 years ago
I was doing some Javascript coding today.

A

   false != x
test failed for a zero-valued x; had to make it !==. WTF? I never want false and 0 to be other than different objects.

Almost every twist and turn in this language is an imbecillic clusterfuck.

I had one instance of a if (foo.bar = 0) typo; no warning from the implementation. Why do we want stupid C mistakes in a higher level language, without the C fixes for them?

   list.forEach(function (item, i) {
     ...
   });
makes my eyes bleed. JavasSript borrows the syntax of languages geared toward a form of computing at which JavaScript is poorly suited for; when you're combining functions together, it looks like dog's breakfast.

To get a value out of a switch statement, you have to wrap it in a function that is immediately called?

   function () {
     switch (WTF) {
     }
   }();
the switch statement has the idiotic break with fallthrough found in C.

One redeeming feature: A || B || C ... works a lot like (or A B C ...).

Unfortunately, this is required for the simple task of incrementing a nonexistent dictionary key from zero:

    dict[key] = (dict[key] || 0) + 1;
this calls for two dictionary key lookups. You want this sort of thing in a single operation.

Oops! In the following, j isn't lexical:

    for (let i = 0, j = 0; ....
I copy and pasted something like this from a StackOveflow answer into a recursive function and spotted that the j in a recursed frame was messing with the j in outer frames, there just being one j.

What is "function scope" and why even have something so idiotic? Just let, or GTFO! C has function scope for goto labels, that's it; why introduce something like that.

Appending together Lists has functional semantics, like Lisp:

   a.concatenate(b)  // new thing is returned, a stays the same, so you must do a = a.concatenate(b).
But

   a.push(b)         // mutates a in place.
Here is a shitshow, curently with a fitting number of upvotes: 666.

https://stackoverflow.com/questions/881085/count-the-number-...

I accidentally wrote

   if (foo.bar.indexOf[key] < 0) { code }
code was silently skipped even though foo.bar is an empty list. No diagnostic, nothing. Oh, indexOf is a function, which is an object. Every damned object is a dictionary with properties you can access as strings with square bracket indexing, and that is always safe: it yields undefined if the property is not found.

celroid · 4 years ago
Once you learn the quirks of JavaScript you get used to it. Also you should not use forEach in JS, take a quick look at this page. https://phoenix35.js.org/good-practices.html

u/celroid

KarmaCake day2January 21, 2022View Original