Posts

Python multiprocessing: Pass the shared resource along to children

Update 11 Aug '20: Turned out I misunderstood how multiprocessing module works! A Process can inherit resources created in the parent process scope but that does not include globals; ie if used_ids and used_ids_lock were defined in the block marked by if __name__ == '__main__' it would work (though not recommended). Python's documentation briefly touches upon this subject (see "Explicitly pass resources to child processes" section"). So, one correct way of structuring the code is: #!/usr/bin/env python ################################################################################ # simple tool to generate n random numbers. # # usage: # main.py N_RECORDS CONCURRENCY_STRATEGY:"t"|"p" CONCURRENCY_FACTOR:int # # N_RECORDS is an integer # CONCURRENCY_STRATEGY can only be either 't' or 'p' # CONCURRENCY_FACTOR is an integer (preferrably less than or equal to the no of # cores on the machine.) # # Examp...

Common Lisp Tips and Tricks

A collection of simple tips and tricks for the inexperienced Common Lisp programmers like myself. List (and terminate) running threads Using SBCL native functions ;; list all - mind the names CL-USER> (sb-thread:list-all-threads) (#<SB-THREAD:THREAD "main thread" RUNNING {1001878913}> #<SB-THREAD:THREAD "auto-flush-thread" RUNNING {10020BFDB3}> #<SB-THREAD:THREAD "my main loop" RUNNING {100492B8E3}> ;; this is the thread i suspect #<SB-THREAD:THREAD "reader-thread" RUNNING {1004AEFD13}> #<SB-THREAD:THREAD "swank-indentation-cache-thread" RUNNING {1004AEFE23}> #<SB-THREAD:THREAD "finalizer" RUNNING {1001E30053}> #<SB-THREAD:THREAD "repl-thread" RUNNING {10020C1BC3}> #<SB-THREAD:THREAD "control-thread" RUNNING {1004AF2853}>) ;; find the thread by name and terminate it CL-USER> (sb-thread:terminate-thread (find "my main loop...

Farewell and thank you, Plone

Image
I finally made the difficult decision of moving away from Plone+Zope stack. I've been a happy user/admin of it for almost 9 years now but I feel that I'm not able to take advantage of its offerings anymore. On the one hand, how I'm employing it has changed; whereas until a few years ago I used to host a dozen websites/portals on the very same stack -I closed that line of business a couple of years ago,- now it's only serving my own website and that of a small community of programming languages enthusiasts. A task which any simple blogging engine could do. On the other hand, even though Plone+Zope is a rock-solid stack, which requires quite minimal maintenance, my growing set of responsibilities in personal life and new priorities leaves no time for maintaining a couple of publicly available websites - those who have done so know how grave the job is. And the last downtime was hardware-related! Given the above, I decided to retire my last loyal Plone+Zope ser...

To Over or Under Engineer?

Image
In which two groups of software engineers design and implement a fly-killing machine. Once Upon A Time... Two groups of software engineers, one favouring Java and another favouring Ruby, were asked to build a device that kills the common fly.  The product is supposed to kill this nasty creature. 1 Day Later The Ruby team announced the completion of the product. "The product has gone through extensive testing. During the tests, in which we mocked the size, movement pattern and speed of the common fly, the device performed with 80% efficiency", the lead engineer commented when asked by the press about the secret to their rapid development process. A photo of the finished product by the Ruby team "Suffice to say that we had to make some design and implementation sacrifices to cut the time to market and production costs" he commented briefly on the effectiveness of the product. 367 Days Later The Java team accomplished the design of the product. "W...

Forth Interpreter and Abstract Machine

Image
Forth interpreter and abstract machine illustrated in one image. Forth has such a strikingly well thought out simple execution model that it can fit in one small diagram:

Grab Packt With Groovy

Automatically claim Packt's free e-books with a Groovy program. Introduction Packt Publishing has launched a new programme called " free learning offer "; each day they put an e-book for free on their website to download: one only needs to login to Packt's website and click on the "claim your free book" link. Following Grab Packt with Racket, here is the Groovy version, to automatically add the e-book to your Packt account for later downloads. The Code The code is in public domain. You can get it directly from is.gd/isbviw or from my github gist . For this to work you need to replace YOUR-EMAIL-ADDRESS (line 26) and YOUR-PASSWORD (line 27) with reasonable values. If you wish to run this from shell/cron remember to add #! /usr/bin/env groovy to the top of the file. The script is completely self-contained as @Grab annotation on line 4 fetches the dependencies it requires. /** * @author Bahman Movaqar */ @Grab('org.jsoup:jsoup:1.8.2') i...

Grab Packt With Racket

Automatically claim Packt's free e-books with a Racket program. Introduction Packt Publishing has launched a new programme called " free learning offer "; each day they put an e-book for free on their website to download: one needs to login to Packt's website and click on the "claim your free book" link. A nice fellow, wrote some Javascript code (nodejs) to be able to automatically claim a book, for example by calling the code from a cron job. He named the code "grab_packt" and has made it available on github . To me it is not fair to have only a Javascript version! So I decided to give it a go with different languages. This time I'll present the version written with Racket . The Code The code is in public domain. You can get it directly from is.gd/iRF96N or from my github gist . For this to work you need to replace YOUR-EMAIL-ADDRESS (line 24) and YOUR-PASSWORD (line 25) with reasonable values. If you wish to run this from shell/cron ...

aria2: An Ultra Fast Download Manager On Linux

Image
Introducing one of the fastest download managers in the universe: aria2. Introduction aria2 is a brutally fast and very feature rich download manager available for Linux platform. It can handle almost any kind of download you can ever imagine (FTP, HTTP, BitTorrent, SFTP, ...). You can install it by simply running sudo apt-get install aria2 at the command line or by using Ubuntu Software Center (if you're on Ubuntu). How To Use First add the following line at the bottom of your .bashrc (or .bash_profile depending on your distro). alias aria2c='aria2c -c -x5 -s10 -m0' This practically replaces the original aria2c command with a pre-configured one that tries to resume the download in case of a disconnect or failure for each download establishes up to 5 simultaneous connection to the server downloads a file using 10 connections/segments retries indefinitely in case of failure to connect to the server Remember to close the terminal and open a new one, for this ch...

More Thoughts On A JVM-Based Forth

Image
Wrapping up the fundamental design challenges for a Forth implementation on JVM. Introduction This post is the continuation of the ideas discussed earlier in my previous post Thoughts On JVM-based Forth Implementation (please read it if you haven't done so yet), in which a general execution model and an overall stack design was introduced. However, three major topics were either very shallowly discussed or were left untouched. They shall be covered in this post. Level of Abstraction Forth was designed in a period when RAM was an incredibly expensive resource to equip your system with; during the absolute reign of micro-controllers and custom-made boards/systems where 64KB of RAM would have been considered a luxury. Therefore it was designed with almost no abstractions over the raw hardware to allow full utilisation of it by the systems programmer. Nowadays, however, 2GB of RAM is a normal specification for even a cheap laptop [1] . And general programming focus, thanks to high...

Responsibly Upgraded Your Lisp Machine!

Image
=== ALL USERS PLEASE NOTE ======= Compiler optimizations have been made to macro expand LET into a WITHOUT-INTERRUPTS special form so that it can PUSH things into a stack in the LET-OPTIMIZATION area, SETQ the variables and then POP them back when it's done. Don't worry about this unless you use multiprocessing. Note that LET could have been defined by: (LET ((LET '`(LET ((LET ',LET)) ,LET))) `(LET ((LET ',LET)) ,LET)) This is believed to speed up execution by as much as a factor of 1.01 or 3.50 depending on whether you believe our friendly marketing representatives. This code was written by a new programmer here (we snatched him away from Itty Bitti Machines where he was writing COUGHBOL code) so to give him confidence we trusted his vows of "it works pretty well" and installed it. From Linux fortune cookies Image source billyfung2010.blogspot.com