nprescott
sqlite> create table users (id blob primary key not null, created_at text not null, username text not null);
sqlite> create unique index idx_users_on_id on users(id);
sqlite> pragma journal_mode=wal;
sqlite> .load '/tmp/uuid.c.so'
sqlite> .timer on
sqlite> insert into users(id, created_at, username)
select uuid(), strftime('%Y-%m-%dT%H:%M:%fZ'), 'hello'
from generate_series limit 100000;
Run Time: real 1.159 user 0.572631 sys 0.442133
where the UUID extension comes from the SQLite authors[2] and generate_series is compiled into the SQLite CLI. It is possible further pragma-tweaking might eke out further performance but I feel like this representative of the no-optimization scenario I typically find myself in.In the interest of finding where the bulk of the time is spent and on a hunch I tried swapping the UUID for plain auto-incrementing primary keys as well:
sqlite> insert into users(created_at, username) select strftime('%Y-%m-%dT%H:%M:%fZ'), 'hello' from generate_series limit 100000;
Run Time: real 0.142 user 0.068090 sys 0.025507
Clearly UUIDs are not free![0]: https://news.ycombinator.com/item?id=27872575
[1]: https://idle.nprescott.com/2021/bulk-data-generation-in-sqli...
> Optional components of a distribution may be specified using the extras field:
identifier_end = letterOrDigit | (('-' | '_' | '.' )* letterOrDigit)
identifier = letterOrDigit identifier_end*
name = identifier
extras_list = identifier (wsp* ',' wsp* identifier)*
extras = '[' wsp* extras_list? wsp* ']'
as well as explaining their behavior, albeit briefly:> Extras union in the dependencies they define with the dependencies of the distribution they are attached to.
The resolution on . is explained by the pip documentation[1]:
> pip looks for packages in a number of places: on PyPI (if not disabled via --no-index), in the local filesystem, and in any additional repositories specified via --find-links or --index-url. There is no ordering in the locations that are searched. Rather they are all checked, and the “best” match for the requirements (in terms of version number - see PEP 440 for details) is selected.
[0]: https://peps.python.org/pep-0508/#grammar
[1]: https://pip.pypa.io/en/stable/cli/pip_install/#finding-packa...
I don't tend to do anything very interesting to tax the filesystem so it is most important that things just work day to day and the less maintenance the better. I found a few use cases[0] for the copy-on-write abilities of Btrfs (built into systemd-nspawn) after switching but even that was a case where something I was previously doing was made instantly faster rather than working out a btrfs incantation.
I've recently been trying out a nifty backup tool[1] to try out a snapshot feature locally. This one did require two btrfs specific commands to restore a backup (`btrfs {send,receive}`). Once again though, this was an additional feature I decided to try out and not really required for my day to day. For me personally Btrfs has been easy to adopt because of how low-friction it has been to add and learn incrementally.
I've still not learned ZFS.
[0]: https://idle.nprescott.com/2022/systemd-nspawn-and-btrfs.htm...
In this specific case it is probably obvious enough that hey maybe I need to try scrolling randomly to find "baccalaureate" but the particular form that drove me to capture the above was littered with similar cases where it wasn't at all obvious. More than anything though the invisible scrollbars just meant I had to second guess every single form I ever submitted.
(org-babel-do-load-languages 'org-babel-load-languages '((python . t)))
(setq org-babel-python-command "~/mpl-venv/bin/python")
Are you perhaps on an outdated version of Emacs?There have been a few different fixes around the "last line" return value over the years[0][1] but I can't really remember something like your example not working for me personally.
[0]: https://lists.gnu.org/archive/html/emacs-orgmode/2017-11/msg...
I know igalia[0] was working on this but I haven't been following the bug trackers directly. Their site and news section gives a better sense of the progress and includes small demonstrations with many of their updates.
quicksort=: (($:@(<#[) , (=#[) , $:@(>#[)) ({~ ?@#)) ^: (1<#)
quicksort ⤆ ((∇⍛(<#⊣) , (=#⊣) , ∇⍛(>#⊢)) ({⍨ ?⍛#))⍣(1<#)
[0]: https://wjmn.github.io/posts/j-can-look-like-apl/[0]: https://idle.nprescott.com/2020/why-bother-with-markdown.htm...
[1]: https://sourcehut.org/blog/2020-05-27-accessibility-through-...
I've been surprised at how much I liked writing it. J can be derided for being a "puzzle language"[1], which isn't entirely unfair, but I've found the paradigm of array programming carries over into more widely used languages and libraries ("Iverson ghost"[2]).
I wouldn't bother learning to put it on a resume, I would try it out for fun.
[0]: https://idle.nprescott.com/2020/ray-tracing-in-j.html
[1]: https://prog21.dadgum.com/219.html
[2]: https://analyzethedatanotthedrivel.org/2018/03/31/numpy-anot...
While it isn't too active, the most recent activity was in the last week or so, I think all that remains are some figures and tables for a couple chapters, the index and proof-reading[0]. It's very nearly there due to a lot of work on Josef's part.
The specific example is of number input routine allows signed decimal numbers without power-of-10 exponents (fixed-point, in FORTRAN parlance) and comes from the author's book Scientific Forth, where a fuller example is used ... to determine whether a piece of text is a proper identifier (that is, the name of a variable, subroutine or function) according to the rules of FORTRAN.
I originally heard of Scientific Forth from Programming in the Twenty First Century where it made a list of "Five Memorable Books about Programming"[3] with the following description:
Dr. Noble demonstrates how he uses Forth for hardcore matrix work and, when he realizes that RPN notation isn't ideal in all circumstances, develops a translator from infix expressions to Forth.
[0]: https://news.ycombinator.com/item?id=22746708
[1]: https://news.ycombinator.com/item?id=22748785
[2]: previously 3, 6 and 8 years ago, never any comments: https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
Not entirely an answer to your question, but J provides introspection/help in a pretty direct way via two distinct means, the first is ;: ("words") which will show you the parse of a J phrase (here, a pretty direct translation of the algorithm in the article):
;:'+/s>(s,#v)$/:\:,/v&%"0 (0.5+i.s)'
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬──┬──┬─┬─┬─┬─┬─┬─┬─┬─┬───┬─┬──┬─┬─┐
│+│/│s│>│(│s│,│#│v│)│$│/:│\:│,│/│v│&│%│"│0│(│0.5│+│i.│s│)│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴──┴──┴─┴─┴─┴─┴─┴─┴─┴─┴───┴─┴──┴─┴─┘
Which shows the tokens of the phrase, which can be helpful if you are unsure of where a symbol or diacritic is being used. Inside the J IDE you can get context sensitive help by pressing Ctrl-F1 on a symbol, if you were interested in /: for example, you are directly linked here[2].I am unaware of a similar tool in K, which should not be taken to mean it doesn't or can't exist. One of the reasons I'm interested in J has been the tooling and documentation available.
[0]: https://wjmn.github.io/posts/j-can-look-like-apl/
I'm similarly pleased to have found a correspondence from K's ' (also present in Klong) to J, where it ends up being "0 in this instance.
r=. v&%"0 (0.5+i. s)
+/s>($r)$/:\:,/rI have had a lot of fun following Ben Eater's[1] projects, which aren't always embedded-specific (sometimes they're TTL, sometimes Arduino) but are excellent for understanding concepts deeply.
I tend to learn best with a specific project that can grow or morph as my interest or experience dictates. You might find something to build with an Arduino, using the toolchain/IDE/libraries, get it working and then start stripping out libraries for your own implementations, or getting a toolchain of your own to cross-compile and flash.
[0]: http://www.edx.org/course/embedded-systems-shape-the-world-m...
[1]: https://eater.net/
A Tutorial on Remora – A Rank-Polymorphic Programming Language [pdf]
Joy Rankin draws on detailed records to explore how users exchanged messages, programmed music and poems, fostered communities, and developed computer games like The Oregon Trail. These unsung pioneers helped shape our digital world, just as much as the inventors, garage hobbyists, and eccentric billionaires of Palo Alto.
I'm sure I've read the Wikipedia page for fuzzy logic but the lab really helped to drive home some of the concepts. Additionally, it was a very cool application for J, which is often derided as being a strictly numerical tool. The lab describes itself as:
... how to create a linguistic inference system using fuzzy sets. Such systems of linguistic variables are referred to as fuzzy logic systems.
First we describe the concept of membership with nonfuzzy and fuzzy sets. Then we tackle fuzzy membership for scalar and array fuzzy sets, and later inference with array sets.
It really is better to work through the lab within the J system[0], but for those without it is browse-able in plain text online[1]
[0]: Help -> Studio -> Labs -> General Interest / Fuzzy Logic
[1]: https://github.com/jsoftware/labs_labs/blob/master/general/f...
If you'll forgive the style, I took a swing at implementing k-means clustering in Klong a few months ago [1]. While I did find a few slow-downs with a modestly sized data set (Fisher's iris data), I think Klong is built on a Forth-like VM using the core of a scheme implementation (all of which the author wrote!). It wasn't slow enough to really bother me, as I was more interested in learning about array languages and algorithms.
I'm a fan of Klong -- it's just fun.
[0]: http://www.t3x.org/klong/book.html
[1]: https://idle.nprescott.com/2019/k-means-clustering-in-klong....
This is (to me) even more apparent in his next language, J; where he sought to "correct" deficiencies in APL and further expanded the "language" to include things like "gerunds"[1] more explicitly, which are nominally (as defined in an English dictionary):
> a noun formed from a verb, denoting an action or state
Which may be summarized somewhat unsatisfactorily as: "Because Ken said so".
[0]: https://www.jsoftware.com/papers/tot.htm
[1]: https://code.jsoftware.com/wiki/Vocabulary/GerundsAndAtomicR...
I happen to agree with the argument made by proponents of both TLA+ and Alloy that model checking and specification is better accomplished when detached from an implementation language, but I think you would benefit most from simply starting with one of them (DSLabs or TLA+) and decide later if you'd like to learn the other.
While I would recommend either as a primer into discrete math - do you have a specific subset that you're interested in? That might make suggestions more pertinent to your interests.
[0]: https://lamport.azurewebsites.net/tla/book.html
[1]: I think, in retrospect, that Specifying Systems actually stands on its own pretty well and doesn't require supplementary material when paired with the video course.
[2]: It is subtitled "A Gentle Introduction to Discrete Math Featuring Python" and it is _very_ gentle, but I'm also glad to have read it, it did wonders for giving me a kind of reference into math terms from programming (which I already knew).
If you are interested in more depth, either Crafting Interpreters[1] (mentioned in the article) or Writing an Interpreter in Go[2] looks promising. I've read more of Crafting Interpreters and really enjoy it, though it isn't yet finished. One of the aspects I really enjoy is that the language is implemented and re-implemented in different languages to gradually introduce lower level concepts.
Finally, this one may be a little more "out there" than what you are looking for, but if you are interested in designing a language more than the plumbing of an interpreter Beautiful Racket[3] is really good.
caveat: not an expert
[0]: https://ia802309.us.archive.org/25/items/pdfy-MgN0H1joIoDVoI...
[1]: http://www.craftinginterpreters.com/
[0]: https://www.sec.gov/edgar/searchedgar/companysearch.html