<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>Wed, 08 Apr 2026 03:38:08 +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 "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><item><title><![CDATA[New comment by rogerbinns in "How often does Python allocate?"]]></title><description><![CDATA[
<p>Heap allocation does also allow other things.  For example stack frames (PyFrame) are also heap allocated.  When there is an exception, the C stack gets unwound but the heap allocated frames are retained forming the traceback.  You can then examine the values of the local variables at each level of the traceback.<p>And it also allows async functions, since state is held off the C stack, so frames can be easily switched when returning to the event loop.<p>The other thing made easy is C extension authoring.  You compile CPython without free lists and an address sanitizer, and getting reference counting wrong shows up.</p>
]]></description><pubDate>Thu, 06 Nov 2025 17:35:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=45837835</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45837835</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45837835</guid></item><item><title><![CDATA[New comment by rogerbinns in "Wheels for free-threaded Python now available for psutil"]]></title><description><![CDATA[
<p>You aren't forced to use a GIL as I keep stating.  You can set an environment variable or a command line flag to Python and the GIL will remain disabled.  My package will work just fine if you do that, unless you provide it with data you concurrently modify in which case you can get corruption and crashes.</p>
]]></description><pubDate>Mon, 03 Nov 2025 18:22:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=45802377</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45802377</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45802377</guid></item><item><title><![CDATA[New comment by rogerbinns in "Wheels for free-threaded Python now available for psutil"]]></title><description><![CDATA[
<p>I provide 3 options:<p>1) Use regular GIL Python and you get the highest levels of integrity and correctness of operation of my package<p>2) Use a free threaded Python, the GIL will be enabled at load time, and you get the highest levels of integrity and correctness<p>3) Use a free threaded Python, and set $PYTHON_GIL=0 or start with -Xgil=0 to keep the GIL disabled, and providing you do not do concurrent mutation of data provided to my package, you get the highest levels of integrity and correctness<p>BTW I did not randomly choose to provide the free threaded builds.  I specifically asked the setuptools maintainers (under the Python Packaging Authority) how to prevent free threaded builds for PyPI.  They encouraged me to do the free threaded builds so that a user doesn't to have maintain parallel regular and free threaded Python installations.  And it allows option 3 above.</p>
]]></description><pubDate>Sun, 02 Nov 2025 14:13:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=45790492</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45790492</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45790492</guid></item><item><title><![CDATA[New comment by rogerbinns in "Wheels for free-threaded Python now available for psutil"]]></title><description><![CDATA[
<p>What is better:<p>1) Saying your package supports free threading, but it isn't safe - ie concurrent mutation can result in corruption and crashes<p>2) Allowing the package to be loaded into a free threaded Python, which immediately enables the GIL.  Concurrent mutation does not result in corruption and crashes because of the GIL.  The user doesn't have to maintain two Python installations.  They can set the environment variable PYTHON_GIL=0 or start Python with -Xgil=0 which will keep the GIL disabled, and they will be fine if they avoid concurrent mutation.<p>I chose 2.  The stdlib json package (along with many others) picked 1.  Heck I'll guarantee that most that picked 1 aren't 100% safe either, because doing the changes is hard work, *every* case has to be covered, and tools like thread sanitizers don't work.<p>The reason I chose 2 is because I care about data integrity.  I will eventually reach 1, but only once I can be certain the code is correct.</p>
]]></description><pubDate>Sun, 02 Nov 2025 14:02:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=45790429</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45790429</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45790429</guid></item><item><title><![CDATA[New comment by rogerbinns in "Wheels for free-threaded Python now available for psutil"]]></title><description><![CDATA[
<p>Yes.  The interpreter warns by default, and requires steps to disable the warning.  My release notes say that the GIL will be enabled when the package is loaded.<p>Is it madness that other packages claim they support running without the GIL, yet it is possible to cause corruption and crashes just by writing concurrent Python code?  That is the case with the standard library.  Compiler thread sanitizers don't work with free threaded Python. Diligent code inspection by humans is the only way to update C code so far.<p>Free threading is at the beginning of the project.  It works.  You get slow downs in single threaded performance due to extra locking, and speedups in concurrent performance due to threading.  But it is possible to cause corruption and crashes via Python code.  Don't expose it to untrusted data and code.<p>But do investigate it and see what works well and what doesn't.  See what code patterns are now possible.  Help improve the tools and documentation.  It had to start somewhere, and the current state is somewhere.</p>
]]></description><pubDate>Sat, 01 Nov 2025 16:56:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=45783223</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45783223</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45783223</guid></item><item><title><![CDATA[New comment by rogerbinns in "Wheels for free-threaded Python now available for psutil"]]></title><description><![CDATA[
<p>As I stated:<p>> so that you don't have to keep separate GIL full and free threaded interpreters around<p>It means the user doesn't have to keep two Pythons around, install packages in both of them, etc.<p>It is also possible with the free threaded Python to keep the GIL disabled even if a package such as mine says it needs the GIL.  And my package will indeed work just fine, until you supply it with mutable data and concurrently modify it in another thread.</p>
]]></description><pubDate>Sat, 01 Nov 2025 13:50:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=45781641</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45781641</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45781641</guid></item><item><title><![CDATA[New comment by rogerbinns in "Wheels for free-threaded Python now available for psutil"]]></title><description><![CDATA[
<p>Note that free threaded compatible doesn't necessarily mean the package supports free threading (concurrent execution), just that it can be loaded into a free threaded interpreter.<p>This is the case with my own package which is on the hugovk list (apsw) which will cause the GIL to be re-enabled if you load it into a free threaded Python.  The reason I provide a binary wheel is so that you don't have to keep separate GIL full and free threaded interpreters around.  They have a different ABI so you can't use extensions compiled against one with the other.<p>Free threading is at the beginning of its journey.  There is a *lot* of work to on all C code that works with Python objects, and the current documentation and tools are immature.  It is especially the case that anyone doing Python concurrent object mutation can cause corruption and crashes if they try, and that more auditing and locking need to be done in the C code.  Even modules in the standard library have only been partially updated.<p>You can see a lot details and discussion in the comments at <a href="https://news.ycombinator.com/item?id=45633311">https://news.ycombinator.com/item?id=45633311</a></p>
]]></description><pubDate>Fri, 31 Oct 2025 21:55:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=45777133</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45777133</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45777133</guid></item><item><title><![CDATA[New comment by rogerbinns in "The future of Python web services looks GIL-free"]]></title><description><![CDATA[
<p>It is multiple fine grained locking versus a single global lock.  The latter lets you do less locking, but only have a single thread of execution at a time.  The former requires more locking but allows multiple concurrent threads of execution.  There is no free lunch.  But hardware has become parallel so something has to be done to take advantage of that.  The default Python remains the GIL version.<p>The locking is all about reading and writing <i>Python</i> objects.  It is not applicable to outside things like external libraries.  Python objects are implemented in C code, but Python users do not need to know or care about that.<p>As a Python user you cannot corrupt or crash things by code you write no matter how hard you try with mutation and concurrency.  The locking ensures that.  Another way of looking at Python is that it is a friendly syntax for calling code written in C, and that is why people use it - the C code can be where all the performance is, while retaining the ergonomic access.<p>C code has to opt in to free threading - see my response to this comment<p><a href="https://news.ycombinator.com/item?id=45706331">https://news.ycombinator.com/item?id=45706331</a><p>It is true that more fine grained locking can end up being done than is strictly necessary, but user's code is loaded at runtime, so you don't know in advance what could be omitted.  And this is the beginning of the project - things will get better.<p>Aside:  Yes you can use ctypes to crash things, other compiled languages can be used, concurrency is hard</p>
]]></description><pubDate>Sun, 26 Oct 2025 00:22:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=45708017</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45708017</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45708017</guid></item><item><title><![CDATA[New comment by rogerbinns in "The future of Python web services looks GIL-free"]]></title><description><![CDATA[
<p>Some examples of what it could do when using the C Python APIs:<p>* Point out using APIs that return borrowed references<p>* Suggest assertions that critical sections are held when operating on objects<p>* Suggest alternate APIs<p>* Recognise code patterns that are similar to those done during the stdlib auditing work<p>The compiler thread sanitizers didn't work the last time I checked - so get them working.<p>Edit:  A good example of what can be done is Coccinelle used in the Linux kernel which can detect problematic code (locking is way more complex!) as well as apply source transformations.  <a href="https://www.kernel.org/doc/html/v6.17/dev-tools/coccinelle.html" rel="nofollow">https://www.kernel.org/doc/html/v6.17/dev-tools/coccinelle.h...</a></p>
]]></description><pubDate>Sat, 25 Oct 2025 20:44:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=45706833</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45706833</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45706833</guid></item><item><title><![CDATA[New comment by rogerbinns in "The future of Python web services looks GIL-free"]]></title><description><![CDATA[
<p>The core Python data structures are atomic to Python developers.  eg there is no way you can corrupt a list or dictionary no matter how much concurrency you try to use.  This was traditionally done under the protection of the global interpreter lock which ensured that only one piece of C code at a time was operating with the internals of those objects.  C code can also release the GIL eg during I/O, or operations in other libraries that aren't interacting with Python objects, allowing concurrency.<p>The free threaded implementation adds what amounts to individual object locks at the C level (critical sections).  This still means developers writing Python code can do whatever they want, and they will not experience corruption or crashes.  The base objects have all been updated.<p>Python is popular because of many extensions written in C, including many in the standard library.  Every single piece of that code must be updated to operate correctly in free threaded mode.  That is a lot of work and is still in progress in the standard library.  But in order to make the free threaded interpreter useful at this point, some have been marked as free thread safe, when that is not the case.</p>
]]></description><pubDate>Sat, 25 Oct 2025 20:41:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=45706809</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45706809</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45706809</guid></item><item><title><![CDATA[New comment by rogerbinns in "The future of Python web services looks GIL-free"]]></title><description><![CDATA[
<p>This has already been done.  There is a 't' suffix in the ABI tag.<p>You have to explicitly compile the extension against a free threaded interpreter in order to get that ABI tag in your extension and even be able to load the extension.  The extension then has to opt-in to free threading in its initialization.<p>If it does not opt-in then a message appears saying the GIL has been enabled, and the interpreter continues to run with the GIL.<p>This may seem a little strange but is helpful.  It means the person running Python doesn't have to keep regular and free threaded Python around, and duplicate sets of extensions etc.  They can just have the free threaded one, anything loaded that requires the GIL gives you the normal Python behaviour.<p>What is a little more problematic is that some of the standard library is marked as supporting free threading, even though they still have the audit and update work outstanding.<p>Also the last time I checked, the compiler thread sanitizers can't work with free threaded Python.</p>
]]></description><pubDate>Sat, 25 Oct 2025 20:15:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=45706634</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45706634</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45706634</guid></item><item><title><![CDATA[New comment by rogerbinns in "The future of Python web services looks GIL-free"]]></title><description><![CDATA[
<p>Some of that is already around, but scattered across multiple locations.  For example there is a list in the Python doc:<p><a href="https://docs.python.org/3/howto/free-threading-extensions.html#borrowed-references" rel="nofollow">https://docs.python.org/3/howto/free-threading-extensions.ht...</a><p>And a dedicated web site:<p><a href="https://py-free-threading.github.io/" rel="nofollow">https://py-free-threading.github.io/</a><p>But as an example neither include PySequence_Fast which is in the json.c changes I pointed to.  The folks doing the auditing of stdlib do have an idea of what they are looking for, and so would be best suited to keep a list (and tool) up to date with what is needed.</p>
]]></description><pubDate>Sat, 25 Oct 2025 16:26:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=45705074</link><dc:creator>rogerbinns</dc:creator><comments>https://news.ycombinator.com/item?id=45705074</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45705074</guid></item></channel></rss>