Hey, awesome work! What are the steps I need to take to build something similar, let's say to generate awk or sed processors/filters using plain english?
Really cool project, but I may have found a mistake. Typing "21st night september" returns “At 12:00 AM, on day 21 of the month, only in September”. And I would expect it to be maybe 9-11:59pm, not midnight that morning. But maybe 'night' is just not very well defined?
This is incredible. While there is still a decent rate of false-positives or errors, it's such a nicer user interface than the powerful yet hard-to-read cron syntax.
Are you sure? The man page for Vixie cron at least doesn't imply that and it's not what I remember, and the web page this links to also doesn't think that's true. So "First Friday of the month at midnight" gives "0 0 1-7 * 5".
Note: The day of a command's execution can be specified by two fields — day of month, and day of week. If both fields are restricted (i.e., aren't ), the command will be run when either field matches the current time. For example, ``30 4 1,15 5'' would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
It works, but it's a bit of a hack (to put it mildly ;-) )
Consider this expression:
0 0 1-7 * FRI
This one will run on dates 1-7, and additionally on every Friday. This is almost what we want, except we want an "AND" relationship between the day-of-month and the day-of-week fields, instead of the "OR" relationship.
The weird extra */50 bit exploits a quirk in Debian cron's expression parsing logic. It fools cron into thinking the day-of-month field is a wildcard field, and into applying the "AND" logic.
Often people want to treat the law as if it were computer code, but fortunately sometimes it's more like the grade-school teacher making sure that the kids play nicely together.
I've yet to be shown by someone on the internet there isn't a built-in *nix tool for everything.
Sometimes I am astonished what has been sitting in my directories all these years.
The biggest one probably being the 15 minutes it took to learn how to write systemd service files, versus using <language-specific-process-monitor-and-daemon>.
I feel like AI is a poor fit for this domain, because the whole point of using a tool like this would be to check/ensure correctness. Perhaps it should at least also offer a precise translation back the other way?
Scheduled tasks are hard enough to debug as it is. The last thing I want to do is add more indeterminism!
But isn't translating from English (or some other natural language) is what a programmer does when constructing a regular expression or a cron job? So it is possible, although humans make mistakes, too. Maybe fewer, or different mistakes than "AI", but still, fundamentally it's the same.
Maybe an alternative to natural language processing could be pattern recognition from a number of user supplied examples, and its expression in an unambiguous domain language. That's also what programmers do.
> But isn't translating from English (or some other natural language) is what a programmer does when constructing a regular expression or a cron job?
No, I wouldn't say so. Even if the programmer is given the schedule from someone else (in English), they have additional context and can ask clarifying questions that this AI doesn't have.
That's my point. Without additional context, humans would make the same mistakes. Having all information that humans have, this AI could perform at human level.
One of the hardest aspects of software development is communicating with the customer, for humans and AI alike. But a translation from layman English to machine code has to happen, at some point.
You are describing it as if the developer writing the regex/cron has no prior involvement with the app, project, or company and is brought on to transcribe a specification from English to code and nothing else. In that situation an AI-driven translator app makes a lot of sense, but that doesn't match reality.
The software developer has a lot of context with the app and project that cannot be easily passed into the translator (whether AI or human). Going from that state of knowledge to the code by an intermediate, compressed, lossy, ambiguous step of natural language is necessarily inefficient. Whether that translator is operating at human level or not is not the point, going through English is the problem.
60 comments
[ 2.8 ms ] story [ 135 ms ] threadLet me know if you get any interesting results!
"The second Sunday of every month except in December"
0 0 8-14 1-4,6-12 *
IMO it should generate something like: "0 0 * 1-11 SUN#2"
The "#2" bit is not standard cron syntax though and will not work correctly in e.g. Debian cron.
Wasn’t aware of the SUN#2 syntax. I find it interesting it used 8,14 as its best approximation. You can see it trying it’s best.
Any chance it could be made into a library/api?
This will come as an unpleasant surprise when you try to schedule something to run on, say, the first Friday of the month.
There are workarounds, mostly involving backticked date invocations, but they’re hard to both write and read.
Note: The day of a command's execution can be specified by two fields — day of month, and day of week. If both fields are restricted (i.e., aren't ), the command will be run when either field matches the current time. For example, ``30 4 1,15 5'' would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
0 0 */50,1-7 * FRI
It works, but it's a bit of a hack (to put it mildly ;-) )
Consider this expression:
0 0 1-7 * FRI
This one will run on dates 1-7, and additionally on every Friday. This is almost what we want, except we want an "AND" relationship between the day-of-month and the day-of-week fields, instead of the "OR" relationship.
The weird extra */50 bit exploits a quirk in Debian cron's expression parsing logic. It fools cron into thinking the day-of-month field is a wildcard field, and into applying the "AND" logic.
I'd love a CLI version of this tool, where I pass in the cron expression and it tells me the english translation.
[1] https://crontab.guru/
Check out Cronstrue[1], its what I use for going from cron expression to english.
[1] https://github.com/bradymholt/cRonstrue
Not sure if it gave right results. but i think this is amazing stuff. Thanks for building it.
Every 15 minutes except at 3AM?
Stackoverflow responses say it can't be done in one line.
I can't think of a way to get it in one line. Probably easiest is to split into two jobs.
*/15 1,2,4-23 * * * - this runs every 15 mins except between 3am and 4am
15,30,45 3 * * * - this should cover the delta
"At 12:00 AM, on day 31 of the month, only in February"
Not precisely related, just a go-to "they've thought of that" anecdote for when people are underestimating how thorough the law can be.
Sometimes: “Every hour”
Once in a blue moon: “At 12:00 AM, on day 18 of the month, only in February”
On my birthday: “At 12:00 AM”
On Christ's birthday: “At 12:00 AM, on day 25 of the month, only in December”
BTW, it's case sensitive:
"on independence day": “At 12:00 AM, only on Thursday, only in July” (0 0 * 7 4)
"On Independence Day": “At 12:00 AM, on day 4 of the month, only in July” (0 0 4 7 *)
"When the stock market closes and opens" - I think the stock market opens at 9:30 though, not 9.
I tried other hard ones and got rate limited :(
"first and third Tuesday at noon each month "
For prior art (not GPT-3 based) in debian/ubuntu based distributions:
I use to use it like: Also prior to crontab.guru: 21 years ago, more people did prefer english to cron :)Sometimes I am astonished what has been sitting in my directories all these years.
The biggest one probably being the 15 minutes it took to learn how to write systemd service files, versus using <language-specific-process-monitor-and-daemon>.
Scheduled tasks are hard enough to debug as it is. The last thing I want to do is add more indeterminism!
We have created structured, unambiguous domain languages for a reason. Converting from English is ambiguous at best, impossible at worst.
Maybe an alternative to natural language processing could be pattern recognition from a number of user supplied examples, and its expression in an unambiguous domain language. That's also what programmers do.
No, I wouldn't say so. Even if the programmer is given the schedule from someone else (in English), they have additional context and can ask clarifying questions that this AI doesn't have.
One of the hardest aspects of software development is communicating with the customer, for humans and AI alike. But a translation from layman English to machine code has to happen, at some point.
The software developer has a lot of context with the app and project that cannot be easily passed into the translator (whether AI or human). Going from that state of knowledge to the code by an intermediate, compressed, lossy, ambiguous step of natural language is necessarily inefficient. Whether that translator is operating at human level or not is not the point, going through English is the problem.
It was designed to be easy to fit most things into one line.
It can express pretty much everything imaginable. But it's not designed to do that easily.
Maybe it'd be better to come up with a schema that's better suited for expressing non-trivial crons - and converting that to & from crontab format.
English is also not the best language for expressing this type of thing...
I made a similar tool [1] to convert English to Excel formulas but would def take a page out of your super clean look!
[1] https://www.tersho.com
> 0 2 3,5,7 * *
Not great
> 0 2 3,5,7 * *
We gotta stop crediting junk as interesting.
... nice. Other folks are beating ya up based on their first try but mine was exactly correct!
Adding to my cron tools bookmarks - cool stuff.
Still some more work, methinks.