<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: rogerbinns</title><link>https://news.ycombinator.com/user?id=rogerbinns</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 17 Oct 2026 23:52:49 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=rogerbinns" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by rogerbinns in "apsw: Another Python SQLite Wrapper"]]></title><description><![CDATA[
<p>Your feedback is appreciated.  I am busy working on a release which should be available later today.  Your request has now been addressed and is part of the release.  Thanks for trying APSW.</p>
]]></description><pubDate>Mon, 12 Oct 2026 21:06:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=50063078</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=50063078</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50063078</guid></item><item><title><![CDATA[New comment by rogerbinns in "apsw: Another Python SQLite Wrapper"]]></title><description><![CDATA[
<p>Thank you for the kind words.  I was especially delighted when noticing that cysqlite also supports table valued functions in Python.  I'm hoping they become a standard thing for Python developers using SQLite, because it makes bridging SQLite and Python even more productive.</p>
]]></description><pubDate>Mon, 12 Oct 2026 16:33:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=50058868</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=50058868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50058868</guid></item><item><title><![CDATA[New comment by rogerbinns in "apsw: Another Python SQLite Wrapper"]]></title><description><![CDATA[
<p>It has been going since 2004.  There is going to be a new release today.  What year do you suggest :)<p>(I am the APSW author)</p>
]]></description><pubDate>Mon, 12 Oct 2026 13:53:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=50056507</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=50056507</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50056507</guid></item><item><title><![CDATA[New comment by rogerbinns in "apsw: Another Python SQLite Wrapper"]]></title><description><![CDATA[
<p>I originally started out doing exactly what you said - dumping Python dictionaries into a file and reading/writing that.  It worked well.  Where it really hurt was I wanted to add undo functionality, and that means needing to store the before and after view of the data.  And I wanted it more sophisticated than that - be able to view what the data looked like at any point in time.<p>That forced me to use a database, because now I could use triggers to automatically save off old values, and views to use them nicely.<p>There were many Python SQLite wrappers at the time, but I didn't like them.  So I wrote another one :)<p><a href="https://www.rogerbinns.com/blog/20-years-of-apsw.html" rel="nofollow">https://www.rogerbinns.com/blog/20-years-of-apsw.html</a><p>(I am the APSW maintainer)</p>
]]></description><pubDate>Mon, 12 Oct 2026 13:51:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=50056474</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=50056474</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50056474</guid></item><item><title><![CDATA[New comment by rogerbinns in "apsw: Another Python SQLite Wrapper"]]></title><description><![CDATA[
<p>If you ask via the contacts such as Github discussions or email then I can help find a perfect solution for your needs - <a href="https://rogerbinns.github.io/apsw/about.html#mailing-lists-contacts" rel="nofollow">https://rogerbinns.github.io/apsw/about.html#mailing-lists-c...</a><p>As you found out this happens because the cursor is immediately exhausted as there are no rows, and then is cleaned up and so column data names are not available.<p>You can use apsw.ext.query_info to get details about a query without running it - see <a href="https://rogerbinns.github.io/apsw/ext.html#apsw.ext.query_info" rel="nofollow">https://rogerbinns.github.io/apsw/ext.html#apsw.ext.query_in...</a> which includes an example.<p>Behind the scenes you can use an execution tracer to extract the information.  That is what query_info does. although it aborts execution after recording it.<p>(I am the APSW maintainer)</p>
]]></description><pubDate>Mon, 12 Oct 2026 13:41:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=50056346</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=50056346</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50056346</guid></item><item><title><![CDATA[New comment by rogerbinns in "apsw: Another Python SQLite Wrapper"]]></title><description><![CDATA[
<p>The Linux and BSD flavours have APSW - see <a href="https://rogerbinns.github.io/apsw/install.html#linux-bsd-provided" rel="nofollow">https://rogerbinns.github.io/apsw/install.html#linux-bsd-pro...</a><p>There is even a website that tracks around 150 different Linux and BSD flavours (even termux) and shows package name, version, etc for each it is present on - see <a href="https://repology.org/project/python:apsw/versions" rel="nofollow">https://repology.org/project/python:apsw/versions</a><p>(I am the APSW maintainer)</p>
]]></description><pubDate>Mon, 12 Oct 2026 13:28:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=50056178</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=50056178</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=50056178</guid></item><item><title><![CDATA[New comment by rogerbinns in "Prefer strict tables in SQLite"]]></title><description><![CDATA[
<p>That is documented behaviour - think of it as making a best effort, and not losing the value.<p>As of January 2006 you could add CHECK constraints using the TYPEOF function to reject that at the SQL level.  And it is your own code - there is no server - doing the insertions.  As was common back then, protecting you from your own bugs was not a high priority for APIs!</p>
]]></description><pubDate>Sat, 11 Jul 2026 19:51:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48875209</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=48875209</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48875209</guid></item><item><title><![CDATA[New comment by rogerbinns in "Prefer strict tables in SQLite"]]></title><description><![CDATA[
<p>SQLite was originally started as a local database library for use during development for times when the main networked database was not available.  It used dbm as the underlying storage mechanism, with the dbm API roughly being string keys with string values.  ie all underlying values were actually stored as strings.  The SQLite code would automatically do conversions - eg the plus operator would convert the strings to int or float, add them, and generate a stringified number as a result.  The vast majority of implementation code did not have to care about types, and very local decisions could be made such as in the addition example.<p>TCL was used as a dev wrapper language at the time, and it functioned the same way.<p>It was only in mid-2004 that SQLite 3 was released which used its own storage backend, and that allowed for the 5 supported storage types (int64, string, bytes, float, null).  It was API compatible (with minor adjustments) with the earlier SQLite 2, so the lack of static typing continued, otherwise everyone would have to rewrite their code.  You do get dynamic typing, which hasn't been a problem for the vast majority of SQLite users.<p>Do remember that SQLite is competition for fopen, not Oracle / Postgres etc.  It is trying to make things as effective as possible in that scenario.  If you don't want numbers in your string column, then don't do that!</p>
]]></description><pubDate>Sat, 11 Jul 2026 19:13:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=48874865</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=48874865</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48874865</guid></item><item><title><![CDATA[New comment by rogerbinns in "How to corrupt an SQLite database file"]]></title><description><![CDATA[
<p>SQLite has code to work around anti-virus scanning, by doing retries while the anti-virus tool is processing an operation.  I've not seen anti-virus tools result in corruption on the SQLite forum.</p>
]]></description><pubDate>Tue, 30 Jun 2026 15:04:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=48733746</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=48733746</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48733746</guid></item><item><title><![CDATA[New comment by rogerbinns in "WASM is not quite a stack machine"]]></title><description><![CDATA[
<p>Check out wastrel <a href="https://codeberg.org/andywingo/wastrel" rel="nofollow">https://codeberg.org/andywingo/wastrel</a><p>Of note WASM 3 has garbage collection (GC), multi-memory, exception handling, tail calls and more which can be challenging to implement.</p>
]]></description><pubDate>Tue, 28 Apr 2026 14:09:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=47934871</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47934871</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47934871</guid></item><item><title><![CDATA[New comment by rogerbinns in "Email could have been X.400 times better"]]></title><description><![CDATA[
<p>> ... why it was simpler.<p>In the early 90s I implemented a gateway between Novell email and X.400.  What amused me the most was X.400 specified an exclusive enumerated list of reasons why email couldn't be delivered, including "recipient is dead".  At the X.400 protocol level this was a binary number.  SMTP uses a 3 digit number for general category, followed by a free form line of text.  Many other Internet standards including HTTP use the same pattern.<p>It was already obvious at the time that the X.400 field was insufficient, yet also impractical for mail administrators to ensure was complete and correct.<p>That was the underlying problem with the X.400 and similar where they covered everything in advance as part of the spec, while Internet standards were more pragmatic.</p>
]]></description><pubDate>Thu, 23 Apr 2026 13:49:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=47875746</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47875746</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47875746</guid></item><item><title><![CDATA[New comment by rogerbinns in "Edit store price tags using Flipper Zero"]]></title><description><![CDATA[
<p>That is something you can do in cahoots with a regular cashier and the reason places like Costco check your receipt.  The cashier just has to fake scan an item, and nobody would notice.  Receipt checking makes it possible to get caught.</p>
]]></description><pubDate>Tue, 21 Apr 2026 13:00:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=47848165</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47848165</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47848165</guid></item><item><title><![CDATA[New comment by rogerbinns in "SQLite in Production: Lessons from Running a Store on a Single File"]]></title><description><![CDATA[
<p>Related, there is also sqlite3_rsync that lets you copy a live database to another (optionally) live database, where either can be on the network, accessed via ssh.  A snapshot of the origin is used so writes can continue happening while the sqlite3_rsync is running.  Only the differences are copied.  The documentation is thorough:<p><a href="https://sqlite.org/rsync.html" rel="nofollow">https://sqlite.org/rsync.html</a></p>
]]></description><pubDate>Tue, 07 Apr 2026 16:51:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=47678157</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47678157</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47678157</guid></item><item><title><![CDATA[New comment by rogerbinns in "Instruction decoding in the Intel 8087 floating-point chip"]]></title><description><![CDATA[
<p>I remembered Weitek as making math co-processors but it turns out they did an 80287 equivalent, and nobody appears to have done an 8087 equivalent.  Wikipedia claims the later co-processors used I/O so this complicated monitoring the bus approach seems to have only been used by one generation of architecture.</p>
]]></description><pubDate>Sun, 15 Feb 2026 15:04:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=47024264</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47024264</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47024264</guid></item><item><title><![CDATA[New comment by rogerbinns in "Amsterdam Compiler Kit"]]></title><description><![CDATA[
<p>I was one of those students saving up the large sum for the book, when Linux was announced.  There were other tensions at the time - the biggest was that Minix on 8086 was 16 bit real mode only.  Someone had developed patches to run in 32 bit protected mode, but they were invasive and large, and the Minix maintainers would not integrate them as the increased complexity would not help the mission of Minix being easy to learn and tinker with.  The filesystem code was also single threaded, essentially doing one request at a time.  IIRC there were patches to address that too, also not integrated for the same reason.  (Note that the books included print outs of the source so keeping it short did matter.)<p>This explains the final 2 sentences of the original Linux announcement:<p>> PS. Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(.<p>The book publisher is blamed for preventing Minix from being freely distributed:  <a href="https://en.wikipedia.org/wiki/Minix#Licensing" rel="nofollow">https://en.wikipedia.org/wiki/Minix#Licensing</a></p>
]]></description><pubDate>Sun, 15 Feb 2026 02:08:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=47020408</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47020408</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47020408</guid></item><item><title><![CDATA[New comment by rogerbinns in "Instruction decoding in the Intel 8087 floating-point chip"]]></title><description><![CDATA[
<p>Do you know what other prior systems did for co-processor instructions?  The 8086 and 8087 must have been designed together for this approach to work, so presumably there is a reason they didn't choose what other systems did.<p>It is notable that ARM designed explicit co-processor instructions, allowing for 16 co-processors.  They must have taken the 8086/8087 approach into account when doing that.</p>
]]></description><pubDate>Sun, 15 Feb 2026 01:53:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=47020346</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=47020346</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47020346</guid></item><item><title><![CDATA[New comment by rogerbinns in "Notes on the Intel 8086 processor's arithmetic-logic unit"]]></title><description><![CDATA[
<p>Did it make things simpler or more complex for the byte order they picked?  It is notable that new RISC designs not much later all started big endian, implying that is simpler.  Can you even tell the endianess from the dies?</p>
]]></description><pubDate>Fri, 23 Jan 2026 22:39:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=46738969</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=46738969</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46738969</guid></item><item><title><![CDATA[New comment by rogerbinns in "Jeffgeerling.com has been migrated to Hugo"]]></title><description><![CDATA[
<p>Pelican is what I use, and it works well.<p>I used to use Nikola, but gave up on that for two reasons.  One was it was adding every possible feature which meant an ever growing number of dependencies which gets scary.  And that is hard to use - eg how do you embed a youtube video becomes a trawl through documentation, plugins, arbitrary new syntax etc.<p>But the biggest problem and one that can affect all the SSG is that they try to do incremental builds by default.  Nikola of the time was especially bad at that - it didn't realise some changes mattered such as changes to config files, themes, templates etc, and was woolly on timestamps of source files versus output files.<p>This meant it committed the cardinal sin: clean builds produce different output from incremental builds<p>Pelican has kept it simple.</p>
]]></description><pubDate>Sun, 04 Jan 2026 15:27:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=46488844</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=46488844</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46488844</guid></item><item><title><![CDATA[New comment by rogerbinns in "Fabrice Bellard Releases MicroQuickJS"]]></title><description><![CDATA[
<p>In 1994 at the second WWW conference we presented "An API to Mosaic".  It was TCL embedded inside the (only![1]) browser at the time - Mosaic.  The functionality available was substantially similar to what Javascript ended up providing.  We used it in our products especially for integrating help and preferences - for example HTML text could be describing color settings, you could click on one, select a colour from the chooser and the page and setting in our products would immediately update.  In another demo we were able to print multiple pages of content from the start page, and got a standing ovation!  There is an alternate universe where TCL could have become the browser language.<p>For those not familiar with TCL, the C API is flavoured like main.  Callbacks take a list of strings argv style and an argc count.  TCL is stringly typed which sounds bad, but the data comes from strings in the HTML and script blocks, and the page HTML is also text, so it fits nicely and the C callbacks are easy to write.<p>[1] Mosaic Netscape 0.9 was released the week before</p>
]]></description><pubDate>Tue, 23 Dec 2025 22:33:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=46370271</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=46370271</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46370271</guid></item><item><title><![CDATA[New comment by rogerbinns in "Using Git add -p for fun (and profit)"]]></title><description><![CDATA[
<p>Another excellent GUI is gitg.  You can select specific lines for staging, but also for discarding.  The latter is especially useful for temporary debug only changes that you want to throw away.</p>
]]></description><pubDate>Sun, 14 Dec 2025 14:57:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=46263485</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=46263485</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46263485</guid></item></channel></rss>