AFAIK[0] they are (usually) so-called "special" tokens - e.g <|turn> is token id 105 for the vocabulary Gemma4 uses. When you are tokenizing text you can either tokenize the "<|turn>" as a single token (105) or as a series of other tokens (236820, 236909, 887 and 236813 for the "<", "|", "turn" and ">" tokens) with the idea being that the model will treat "105" as the actual separator but can also use "<|turn>" as part of the content.
Though using text-based templates make this a bit tricky regardless. AFAIK llama.cpp tries to avoid this confusion by having their Jinja2 implementation use a custom string type that contains metadata about where characters "come from" so that it can distinguish between special tokens (which would be part of the Jinja2 template) and content (which would be either generated text or text given in by the user) - i.e. even if a string is "<|turn>" the metadata would be used to tell if it is meant to be tokenized as a special token or as a series of non-special tokens.
[0] i might be wrong, this is based on my understanding by messing around with the llama.cpp code, but i never implemented an LLM inference or training engine
> not to be confused with the somewhat baffling llama_chat_apply_template exposed in the libllama API, which hardcodes a handful of chat formats directly in C++
As someone who is tinkering with a desktop-based inference app in FLTK[0], i wish this used the actual Jinja2 template parser llama.cpp uses (or there was another C function that did that since AFAICT for "proper" parsing you need to be able to pass a bunch of data to the template so it knows if you, e.g., do tool calling). Currently i'm using this adhocky function, but i guess i'll either write a Jinja2 interpreter or copy/paste the one from llama.cpp's code (depending on how i feel at the time :-P).
But yeah, GGUF's "all-in-one" approach is very convenient. And i agree that it feels odd to have the projection models as separate files - i remember when i first download a vision-capable model, i just grabbed whatever GGUF looked appropriate, then llama.cpp told me it couldn't do model and took me a bit to realize that i had to download an extra file. Literally my thought once i did was "wasn't GGUF supposed to contain everything?" :-P
> the Windows binary works if you install its library dependencies (wine).
Yes but all it takes is an `apt-get install wine` or `zypper install wine` or `pacman -S wine` or your distro equivalent and if you are using a Linux distro with any sort of desktop functionality, 99% of the time wine will be there.
> Your distribution stopped distributing the dependencies, making them harder to find?
Yes, this is a big problem because these dependencies not only are harder to find but even if you track all of them (there is a chance they too have their own dependencies) you still need to figure out how to build and install them. And if they are old enough for distros to drop them, then chances are building them isn't going to be a straightforward `./configure && make && make install` ("straightforward" is very relative here :-P). And woe is you if there are conflicts with newer (yet API/ABI incompatible) versions of these libraries and/or their dependencies.
Of course since you have the source, technically you can make things work, but that doesn't make the process any less of a major PITA.
I don't know about converting it to "high concurrent Go" or anything like that, but after searching a bit, i found some old PRG code for dBase III Plus someone posted in a googlegroup, gave it to Devstral Small 2 (local model) and asked it to convert it to C# and the conversion looked fine to me, using .NET's database functionality, etc. It is too long to post it though (also TBH the code had some questionable fields).
In general LLMs seem to be very good at translating between programming languages and something like PRG uses very straightforward syntax and concepts. The first attempt by the LLM did a mostly one-to-one conversion using the console but i asked it to convert it to Windows Forms and the code looked fine for that too, using appropriate controls for the fields like text, combobox or datetime pickers (though it used fixed coordinates for the controls so i'm not sure if that looked fine).
FWIW, i didn't try to run the code (i'm on Linux and i do not even have anything related to C# on my PC nor a DB to work with :-P) and chances are there might be some subtle mistakes, but it looked like a decent starting point. IME, at least with local models, converting code between languages in a piecemeal fashion is trivial even with weird/less common languages (you may need to put some instructions to the LLM on a few edge cases though). And IMO that approach would be the right way to do it instead of dumping the entire codebase to it and hoping for the best :-P
I don't really remember many Windows 95 firsts. One I remember is the ability to switch users without logging off. MacOS famously copied that (with a 3D cube look).
I think they made something really revolutionary at the IE3 time. Their News and Mail app was an Explorer extension that placed an e-mail reader as the presentation of a folder full of folders of mailboxes and messages. You wouldn't see the extension, as the apps launched as applications, but that's what the implementation looked like from what I investigated back then.
Unfortunately, the idea was seemingly abandoned almost immediately. I would love to have such views on top of a user-space file system keeping messages, address books, and calendars in sync.
I meant UI stuff like the desktop metaphor (Macintosh also had one but Win95's approach was more popular and mimicked in other environments), the start menu, the taskbar, etc, some newly introduced controls like tabs (i think OS/2 had tab-like controls/containers but they worked differently to those in Win95 and nowadays pretty much all tabs work like in Win95).
At my first ISP job, I eventually started using mh for mail. It was based on an awesome concept of sorting everything into directories and having procmail and various helpers to pre-process, including upon receipt and reading. I remember little of the details, but it was truly for the gung-ho neckbeard crowd, and it was well-suited for processing "large amounts" of mail (1993 style). I think MMDF was the MTA trying to do similar things in that vein. Meanwhile my boss was in love with PINE...
Of course, working at an ISP I could also telnet to our NNTP server and read Usenet on the local filesystem. Ugh.
I know about the theme, i'm using Window Maker which uses a theme closer to NextStep and occasionally i hack on a toolkit[0] that has a Next-ish look (and feel, to some extent).
However i meant stuff like the desktop metaphor (Macintosh also had one but Win95's approach was more popular and mimicked in other environments), the start menu, the taskbar, etc, some newly introduced controls like tabs (i think OS/2 had tab-like controls/containers but they worked differently to those in Win95 and nowadays pretty much all tabs work like in Win95).
The use of recessed surfaces for displaying information and the rectangular buttons were very NeXT-like, but more compact because it needed to work at VGA resolutions, but I don't think they managed to capture the essence of their framework which is, impressively, still alive in every Mac sold.
I wonder how hard it would be to get NeXT source from the 1990's and compile it on macOS 26.
Unfortunately it is from 2022, meaning no OS upgrades.
I think the next mandatory laws EU should pass is that manufacturers should either allow people to upgrade/replace the OS by themselves or provide mandatory upgrades for the next decade (i don't care how the manufacturers handle it, that's up to them, but the easiest way out of such a law is to allow people upgrade/replace the OS by themselves).
The regulation already mandates an OS upgrade period, but the period depends on how long the manufacturer keeps selling the model: software updates must be provided for five years from the day when the manufacturer stops selling the product. From Annex II B, section 1.2:
> (6) Operating system updates:
> (a) from the date of end of placement on the market to at least 5 years after that date, manufacturers, importers or authorised representatives shall, if they provide security updates, corrective updates or functionality updates to an operating system, make such updates available at no cost for all units of a product model with the same operating system;
Why only one decade? I’m still running a 2012 Mac mini. Apple stopped updating Mac OS some time ago, but there are plenty of alternatives that can run on the bare metal. Hardware makers should be required to provide support for the life of the device (defined by customers still using the device), or provide a reasonable way to install 3rd party OS.
At least on Android, when my Samsung Galaxy Note (I loved that phone - replaceable battery, pressure sensitive stylus, IR blaster, OLED, audio jack, water resistant - they went downhill from there IMO) finally end of lifed, I just used the official Samsung tool to upload a community image on it. The process wasn't horrendously difficult. I don't know if people would do it, but it was a clear set of steps that even a tech novice could accomplish if following carefully.
Indeed! The law needs to include firmware in some way. I'm not smart enough to come up with how exactly it should be dealt with, but it does need to be dealt with.
Currently Qualcomm decides when your phone stops getting updates, pretty much regardless to who actually made your phone.
Shoutout to fairphone who actually updated the firmware themselves, surely a loss leading project, but a very respectable dedication to end users.
Shoutout to fairphone who actually updated the firmware themselves, surely a loss leading project, but a very respectable dedication to end users.
I am not sure how much of a shout-out they deserve. For example, Fairphone 4 is still supported until this year. They ship with firmware from 2023 and with a kernel patch release from 2024. Every one of their phones is full of holes because their software lags so much.
Even on their most recent model, they are frequently more than a half year behind firmware updates, ship 1-2 year old kernels, and are late with major Android releases (meaning you miss out on security patches not classified high/critical).
Good examples of software longevity are iPhone, Google Pixel, GrapheneOS, and to a lesser extend Samsung flagships.
When i wrote that comment i checked gsmarena and it looked to me that it cannot get the latest Android, meaning that even if it gets some minor version upgrade, it wont be long before that stops.
Samsung committed to 5 years of OS upgrades on that one, so it’s theoretically getting one more upgrade next year at best. (Or maybe 2, if they release one this year). It’s nearly end of life for a software perspective.
So, they have an XCover 7 now - with similar specs.
Also, they committed to a rather long support cycle for the xcover6 (5 years I think?) - I have one and it is still going strong. I've replaced the battery twice - not because I desperately needed to, but... why not. They are cheap, and I use the older ones still as backup battery packs since they are fast to swap in.
Yeah they are really meant for businesses. Frontline workers, factory floors.
This is what we use them for and they do stand up to the abuse. Of course people treat them very badly as it's not something they paid for. Really long support too.
They're not good in terms of specs for the price but that is not what these phones are about.
Yeah, the specs were... decent... nothing standout. Really I was going over the list of things I had lost after the Galaxy Note got rid of all their features and decided the replaceable battery was the one I cared about the most. The ruggedness was just a nice plus.
Phones should be like PCs - they give you the hardware, and you figure out what to install on it. Unfortunately Linux imo is partially to blame here - if they decided to do a stable driver ABI (don't hate me, this was the norm outside Linux and open source OSes), you could easily separate the OS and drivers and update the m separately.
The missing link here is ACPI, unlike on PC, the hardware doesn't describe what it has to the OS, making the task much harder.
The lack of standardization of handled devices is also another factor, they might look similar or even identical but they often are different per region and have some hardware revisions.
Android does have a separate driver partition nowadays but that doesn't help too much.
Who is "they"? Linux isn't a person or an organization. The people (and organizations) contributing to Linux are all doing it for their own motivations to solve their own problems. You are asking them to make their lives harder, for free, in service of fixing an issue that they don't care about.
Linus Torvalds for one, but generally people in charge of the kernel have a principle of API/ABI compatibility outside the kernel, but no promise for API ABI stability for anything inside, including drivers.
> What SVN didn't fix was the fundamental centralized model. You could not commit without a network connection. The repository was still a single server. "Working offline" meant "reading-only", you could browse history but not record any new work, and the day the server was down was the day the whole team waited.
FWIW this is how most projects work anyway. And IMO Subversion is still the best VCS when you have a lot of large binaries (the various extensions to Git like git-lfs are just hacks that graft a separate half-baked version control system to it and add further complexity to an already annoyingly complex system). I remember working at a gamedev company in early 2010s and out of curiosity i tried to put everything in the 250GB perforce workspace in a git repository only for git to choke and die before it managed to do anything. In comparison, ~5-6 years earlier i worked briefly at a game porting studio where every single game they had ported (which i'm almost certain went all the way back to the 90s), including all data and source (and these were AAA games, not tiny indie games), were into a single Subversion server.
Unfortunately Subversion lost the VCS fashion wars and nowadays it barely seems to have any development. I still use it for a few projects where i do have a lot of binary stuff, but most new things are in Git. I also have a bunch of stuff in Fossil (which also did handle binary files better than Git when i tested it years ago, though not as good as Subversion or P4) but nowadays i convert them to Git when i need to share because, well, pretty much everyone expects Git (and projects such as Codeberg and Forgejo make sharing and self-hosting easier).
Ironically the "fundamental issue" mentioned above was solved not too long ago with Subversion as nowadays you can have multiple "changelists" and each changelist is a full (hidden) SVN repository by itself, allowing you to do commits (as "shelving") and such locally and then push to remote when you're done. AFAIK changelists can also coexist (unlike Git where you can only work at one branch at each time). Unfortunately since Subversion is basically barely held together, only the command-line UI provides that functionality (at least in FLOSS clients) and even TortoiseSvn didn't seem to support it last time i checked.
You could always keep a local svn repository and commit to that, if you really wanted to commit without connectivity. But in practice most people don't, as evidenced by the success of github, which grinds many development processes to a halt every time it is down.
It also ignores svk, which is (was?) a popular add-on to svn, which provided a convenient way to do this and replay all the commits to the central svn repository when connectivity allowed.
The thing with Subversion's native support for the feature is that it is, well, native. No workarounds (using a local svn repo is extremely clunky) or external tools needed, the feature is part of the normal official workflow.
The issue isn't that it was technically impossible to do this before, it is that it wasn't something available out of the box back when it mattered. The feature was added several years after Git's dominance and by that point few people cared about Subversion.
While not native, svk got pretty popular already in 2005, at a time when git was not used much outside LKML. Github wouldn't be released for a couple more years, which had a huge part in git dominance. Bazaar, darcs, Mercurial were all somewhat popular, but a pretty common question was what the killer feature really was that svn couldn't do.
Though using text-based templates make this a bit tricky regardless. AFAIK llama.cpp tries to avoid this confusion by having their Jinja2 implementation use a custom string type that contains metadata about where characters "come from" so that it can distinguish between special tokens (which would be part of the Jinja2 template) and content (which would be either generated text or text given in by the user) - i.e. even if a string is "<|turn>" the metadata would be used to tell if it is meant to be tokenized as a special token or as a series of non-special tokens.
[0] i might be wrong, this is based on my understanding by messing around with the llama.cpp code, but i never implemented an LLM inference or training engine
reply