Category: Computers

  • Painting with LEGO: How to Recreate Mondrian’s Tableau I (1921) with 1×1 Flat Tiles

    LEGO recreation of Mondrian's Tableau I--white canvas, black intersecting lines, rectangles of red, blue, yellow, and white.

    I have appreciated Piet Mondrian’s neoplasticism artwork for many years. As I wrote about here, I was glad to see his work shown in Lt. Cmd. Data’s quarters on Star Trek: The Next Generation. Then, after seeing some of his works in person at the Museum of Modern Art in Manhattan, I hatched a plan to copy his the painting from Data’s quarters–Mondrian’s Tableau I (1921) on display at the Kunstmuseum Den Haag–using a different medium: LEGO.

    Planning with GIMP

    GIMP screenshot with Mondrian painting

    Before creating a planning image using GIMP, I had to decide what size I wanted (and could afford) my build to be. I had already decided to use LEGO 1×1 flat tiles as the “painting medium.” Using LEGO’s Pick-a-Brick service online, these bricks cost $0.05 each in a variety of colors. If I went with a 32×32 stud “canvas,” that would give a surface area of 1,024 studs and therefore a need of 1,024 flat tiles to cover all of those studs. This would cost $51.20 for enough tiles to cover a 32×32 surface. Other options that I considered was enlarging each dimension by 1.5 to 48×48 for 2,304 studs and a cost of $115.20 for enough tiles or enlarging by 2 to 64×64 for 4,096 studs and a cost of $204.80 for enough tiles. Even using bricks that I already owned to create the canvas and stand, it was hard to spend more than the $51.20 for enough tiles to cover a 32×32 canvas and essentially fill the volume of your hands cupped together.

    With that decision made, I could begin working in GIMP. First, I opened an image of Mondrian’s Tableau I (1921). The original is painted on a 103cm x 100cm canvas. Since I am creating a perfect square, I needed to square this image and resize it to match my calculations. To do this, I simply selected Image > Scale Image > unlinked the horizontal and vertical resolution > entered 320 for X and Y > clicked Scale. This made the image a perfect square with a resolution of 320 by 320.

    GIMP screenshot with Mondrian painting with Filters menu open

    Next, I needed to make the image look more LEGO-like to calculate how many flat tiles I would need of each color. To do this, I added a new layer over the original image and then clicked Filters > Render > Pattern > Grid.

    GIMP screenshot with Mondrian painting with Grid window open

    On the Grid pop-up window, I changed the Width and Height to 10–meaning that there would be a grid line every 10 pixels on the X and Y axes. Since I had already scaled the image to 320 pixels on each side, this grid would perfectly approximate the 32 x 32 grid of my LEGO canvas. Also, I set the line width and height to 1 pixel each so that it wouldn’t be too large and obscure the next step. After clicking OK, the grid appears over the image.

    GIMP screenshot with Mondrian painting with grid overlay

    While remaining on the layer with the grid, I selected the paint bucket tool, selected the color of the target areas–black, blue, red, and yellow–in turn, and filled the appropriate squares to match the original painting underneath. I did this to make sure I was making the tile count as accurate as possible. If I hadn’t done this, the black lines would be less noticeable and what I might count as a colored square versus a black line might become confused. At a LEGO resolution of 32×32 studs, it was impossible for me to make it as accurate as the original, so this technique helped me approximate the original with a high degree of accuracy.

    Then, I counted the squares of each color to make my LEGO order: 686 white, 177 black, 77 blue, 70 yellow, and 14 red. I ordered a extra flat tiles of each color in case my counting was incorrect.

    Building the Canvas

    LEGO white plates in a 32x32 layout

    I wanted to build a substantial canvas for the Mondrian instead of using a 32×32 base plate. Also, I wanted to build with as many white bricks and plates as I could to reduce how much I had stored in plastic bins under my desk.

    To begin, I laid out a 32×32 grid of plates. I didn’t have a large number of similar types of white plates, so I had to try different configurations before settling on one. If I had to do over again, I would have tried configuring it for more staggered stepping instead of long break lines as I did.

    LEGO white plates in a 32x32 layout turned upside down

    I flipped over the plates to begin building the support frame for the canvas using bricks.

    LEGO white plates in a 32x32 layout upside down with white bricked border

    I wanted the canvas to appear stretched, so I continued the color white from the canvas’ plates to the border.

    LEGO white plates in a 32x32 layout upside down with bricks filling the full layout

    Knowing these other colors would be hidden, I used filler bricks in a mirrored pattern (I would know what it was like underneath even though no one else would).

    LEGO white plates in a 32x32 layout upside down with bricks filling the layout but center removed for hidden compartment

    After beginning to cover the filler bricks with white plates (stretched canvas) and sand plates (wood frame), I thought that it would be cool to build a hidden compartment to hold a written statement about the artwork. So, I pulled out some central bricks, filled the center with inverted 2×2 flat tiles.

    LEGO white plates in a 32x32 layout upside down with bricks filling the layout but center removed for hidden compartment and trapdoor installed
    LEGO white plates in a 32x32 layout upside down with bricks filling the layout but center removed for hidden compartment

    I constructed a compartment door on hinges in the middle of the back of the canvas and filled the rest of the space with dark sand plates (paper backing protecting the canvas).

    LEGO white plates in a 32x32 layout upside down with bricks filling the layout but center removed for hidden compartment with trap door open

    Here is the hidden compartment door open.

    LEGO white 32x32 canvas completed studs up

    Flipped back over, the canvas is primed and ready for the “paint.”

    Constructing Display Stands for the Canvas

    LEGO canvas with display stand installed

    I used LEGO Technic bricks to build two stands for the canvas so that it was held at a stable angle.

    LEGO canvas with display stand installed sideview

    It’s about 70 degrees from horizontal.

    LEGO canvas with display stand installed

    I beefed up the friction connection between the stands and the canvas by using two 1×10 Technic bricks that attach to the canvas.

    LEGO canvas with display stand installed closeup

    From the blue color, you can see that I used a number of 3 brick width pins.

    LEGO canvas display stand legs detail

    These photos show the stands in more detail detached from the canvas.

    LEGO canvas display stand legs detail
    LEGO canvas display stand legs detail

    Note that the angle is achieved by having the long arm simply rest against a smaller L-shaped Technic support arm. Gravity holds things in place.

    LEGO canvas display stand legs detail

    I added extra Technic bricks to the stand’s bottom support legs for extra strength.

    Assembling Mondrian’s Tableau I (1921)

    After placing my LEGO Pick-a-Brick order for the “painting” 1×1 flat tiles, it took about a week-and-a-half to arrive.

    Bag of hundreds of LEGO pick-a-brick

    I ordered bricks for a custom Millennium Falcon that I am currently also working on, so I needed to sort everything out.

    Man sorting LEGO bricks from bag of pick-a-brick

    Here I am sorting the LEGO bricks.

    5 piles of 1x1 LEGO flat tiles in different colors

    With the bricks sorted, I began to paint my recreation of Mondrian’s Tableau I (1921).

    LEGO Mondrian painting build in progress

    I began at the top horizontal line and created one line at a time–kind of like a CRT drawing a line of pixels across the screen one-at-a-time.

    LEGO 1x1 flat tiles skewed at different angles after connecting to LEGO plate

    The problem with LEGO flat tiles is that they are difficult to align just by placing them on a stud.

    To align each line of flat tiles, you can take a brick separator, place it edge-wise along the flat tiles, and pull it back-and-forth lightly–hard enough to press against the flat tiles’ edges but not so hard as to keep it from moving above the adjacent studs as in the picture above.

    Straight aligned row of 1x1 flat tile LEGO

    As you can see, the flat tiles are now aligned better. I did this trick for each line of flat tiles as I worked down the canvas.

    Almost completed LEGO Mondrian painting

    Nearing the end of the build, I discovered that I didn’t have enough flat tiles in white and black. I recounted and recalculated. My count was correct, but LEGO short changed me about 70 elements from my order and gave me 70 extra yellow tile that I didn’t order. I called their customer service the next day and asked that they correct the order. I received the missing parts after another week-and-a-half. I continued “painting.”

    3/4 view of completed LEGO Mondrian painting

    After several weeks, I had completed my copy of Mondrian’s Tableau I (1921) using LEGO!

    Sideview of completed LEGO Mondrian painting

    The side view reveals hints of the “paint” of the lines of 1×1 flat tiles.

    Back view of completed LEGO Mondrian painting

    The back of the canvas mounted on the display stands has its hidden compartment in the back center of the canvas.

    Artist statement on parchment pasted to inside of hidden compartment on LEGO Mondrian painting back

    For the hidden artist statement, I cut out a 4×4 square and wrote in pencil, “Miniature copy of Piet Mondrian’s Tableau I (1921), 103cm x 100cm at Kunstmueum Den Haag. Design and Build by Jason W. Ellis 2024. Medium: LEGO.” I pasted it on the flat tiles inside the lid of the hidden compartment.

    What art should I recreate with LEGO next?

  • Enjoyed Alien: Romulus Despite Too Damn Loud IMAX and Other Customers Who Were Annoying

    xenomorph alien made out of paper in origami style. Image created with Stable Diffusion.

    Yesterday, Y and I took the subway to Manhattan to watch the film Alien: Romulus on the IMAX screen at the AMC 14 on 34th Street.

    I thought that Alien: Romulus was an interesting story that threaded the needle of connecting the origin film Alien (1979) via the first Xenomorph we saw and the android Ash (Ian Holm) to Prometheus (2012) and Alien: Covenant (2017) via the black liquid (hints of the black oil from The X-Files) and the Engineers. The retrocomputers, ASCII text, and a computer with a 3.5″ floppy disk drive made it feel like the same world as Alien. I felt that some of the lines were corny, over-the-top, and unnecessary fan service, but overall, it was an interesting and sometimes exciting addition to the series.

    Unrelated to the film per se, I have some thoughts instead about the technologies of presentation and communal engagement with the film.

    First, movies shown in theaters, especially IMAX films, are shown with the volume far too loud. Y and I last went to an IMAX film over 10 years ago, but the memory of how that experience hurt both of our ears, we planned ahead and brought foam ear plugs. Even with our ear plugs, which work wonders at eliminating noise in other settings, were just barely up to the task of keeping the volume of the film presentation at tolerable levels. Let me put that another way: While wearing ear plugs, I was able to hear the film’s dialog and sound effects and music just fine and sometimes a little not fine when it got so loud as to overpower the ear plugs. That’s too damn loud. It was only after we were leaving that Y thought we should have checked the decibel levels. Hindsight is 20-20.

    Second, I know to some I might sound like an old man yelling at kids to get off my lawn, but for those who have known me a long time, they know that I’ve been deadly serious about this since going to see films when I was a kid. That is we owe other theater goers our respect so that everyone can enjoy the film. Carrying on, talking, or using a phone during a movie can disturb others, so we shouldn’t do those things. Unfortunately, some of the other customers, who would have paid the same $30 per ticket we paid, don’t care for social norms and simple decency. It would be one thing if these were kids who didn’t know any better, but these were adults who acted like kids. Hell is other people, I suppose.

    Considering these things, I prefer to stay at home to enjoy a film without ear plugs or annoying guests. Of course, I am assuming the neighbors don’t act the fool, which I’ve tried my best to address following these tips.

  • Introduction to Piet Mondrian’s Neoplasticism Through Star Trek: The Next Generation

    Piet Mondrian's "Tableau I" hands on a wall between Lt. Cmd. Data standing and his daughter Lal sitting.

    In “The Offspring,” the 16th episode of the third season of Star Trek: The Next Generation, we get to see Piet Mondrian’s “Tableau I” hanging on the wall of his quarters when he shows it to his daughter Lal. I think this might be the first time that I had really seen or had my attention drawn to a work by Mondrian. I thought it was quite striking as a work of art, and it seemed fitting that Data might be drawn to this work for its ordered lines despite Mondrian’s neoplasticism theory and its connection to nature and emotion as being the motivators for the artist’s composition.

    Lt. Cmd. Data seated next to Timothy. Mondrian's "Tableau I" is in the background.

    Mondrian’s “Tableau I” appears in Lt. Cmd. Data’s quarters–notably in the eleventh episode of season five titled “Hero Worship,” in which Timothy, a young boy traumatized by the loss of his parents, apes Data’s mannerisms in order to erase his emotional response to his loss. In one scene, Data and Timothy paint in Data’s quarters where “Tableau I” is on an easel to the side.

    Screenshot from the Star Trek: The Next Generation Interactive Technical Manual of Lt. Cmd. Data's quarters where Mondrian's "Tableau I" is seen on an easel.

    In the Star Trek: The Next Generation Interactive Technical Manual, Mondrian’s “Tableau I” is on an easel in about the same place as pictured in “Hero Worship.”

    Yesterday, I was able to see some of Mondrian’s works in person at the Museum of Modern Art (MOMA) in Manhattan. Y and I went there to see our friends from Japan, Masaya and Saki. While I didn’t get to see “Tableau I,” because it hangs in the Kunstmuseum in The Hague, I did get to see some representative works of his neoplasticism.

    Painting of lines and colored rectangles by Piet Mondrian at MOMA.
    Painting of lines and colored rectangles by Piet Mondrian at MOMA.
    Painting of lines and colored rectangles by Piet Mondrian at MOMA.
    Painting of lines and colored rectangles by Piet Mondrian at MOMA.
    Painting of lines and colored rectangles by Piet Mondrian at MOMA.
  • Mark V. Shaney v1.0, a Probabilistic Text Generator for MS-DOS

    Mark V. Shaney v.1.0 running in DOSBox.

    Of the text generators that I’ve discussed this past year, Mark V. Shaney v. 1.0 (MARKV.EXE) is by far the simplest to use but it is also one of the most advanced due to its implementation of weighted probability tables (Markov chains–the program’s name is a pun on this) that underpin how it generates text. I was able to obtain a copy from the TextWorx Toolshed archived on the Internet Archive’s Wayback Machine.

    MARKV.EXE (44,365 bytes) was developed in 1991 by Stefan Strack, who is now a Professor of Neuroscience and Pharmacology at the University of Iowa. In the MARKV.DOC (10,166 bytes) file that accompanied the executable, Strack writes, “Mark V. Shaney featured in the “Computer Recreations” column by A.K.Dewdney in Scientific American. The original program (for a main-frame, I believe) was written by Bruce Ellis based on an idea by Don P. Mitchell. Dewdney tells the amusing story of a riot on net.singles when Mark V. Shaney’s ramblings were unleashed” (par. 2). Dewdney’s article on the MARKV.EXE program appears in the June 1989 issue of Scientific American. The article that Strack mentions is available in the Internet Archive here. A followup with reader responses, including a reader’s experiment with rewriting Dewdney’s June 1989 article with MARKV.EXE, is in the January 1990 issue here.

    The program works by the user feeding a text into MARKV.EXE, which is “read.” This generates a hashed table of probabilistic weights for the words in the original text, which can be saved. The program then uses that table and an initial numerical seed value to generate text until it encounters the last word in the input text or the user presses Escape. The larger the text (given memory availability) , the more interesting its output text, because more data allows it to generate better probability weights for word associations (i.e., what word has a higher chance to follow a given word). Full details about how the program works can be found in the highly detailed and well-organized MARKV.DOC file included with the executable.

    Using DOSBox on Debian 12 Bookworm, I experimented by having MARKV.EXE read William Gibson’s “Burning Chrome” (1982). I pressed “R” for “Read,” entered the name of the text file (bchrome.txt), and pressed enter.

    The program reported “reading” for a few minutes (running DOSBox at default settings).

    After completing its “reading,” the program reported stats on the table that it created using bchrome.txt: 9167 terms (608,675 bytes).

    I pressed “G” and the program began to generate text based on its table of probabilities generated from the bchrome.txt text file, which contained the short story, “Burning Chrome.” While the generated text flows across the screen, there are options to press “Esc” to stop or any other key to pause.

    After it completed writing the generated text to the screen, I pressed “S” to save the generated text and it prompted me to type in a file name for the saved generated text: gibson.txt.

    Pressing “S” gives the user an option to save the table for future use. I went with the default name, MARKKOV.MKV (not to be confused with a modern Matroska container file). This file can be loaded in MARKV.EXE on subsequent runs by pressing “L” and entering the name of the table. When the user presses “Q”, the program exits back to DOS and displays a message, “The random number seed was x,” where x is a random number used in the generation of text. If repeatability is important to the user, you’ll want to make a note of that number and use it with the -s modifier when running MARKV.EXE again (e.g., markv.exe -s2510).

    Mark V. Shaney’s implementation of a Markov chain that builds a table of next word probability on a small text sample is one example of the predecessors to large language models (LLMs) like LLaMA and ChatGPT. However, Mark V. Shaney’s word association probabilities is far simpler than the much more complicated neural networks of LLMs (especially considering attention) with many orders of magnitude more parameters trained on gargantuan data sets. Nevertheless, Mark V. Shaney is one aspect of the bigger picture of artificial intelligence and machine learning development that led to where we are now.

  • Upgrading from the 5.11 Rush 12 2.0 to the Mystery Ranch 2-Day L/XL Backpack

    5.11 Rush 12 2.0 backpack and Mystery Ranch 2-Day L/XL Backpack

    When I upgraded to a 16″ Lenovo ThinkPad P1 Gen 4 workstation-class laptop earlier this year, I soon learned that it was too large to fit safely in my 24-liter 5.11 Rush 12 2.0 backpack. While my old 12″ ThinkPad X230 easily fit into the up-to-15″ laptop capable compartment of the 5.11 Rush 12 2.0, the newer ThinkPad P1 Gen 4 dangerously pressed against its corners. Also, I trouble wearing the 5.11 Rush 12 2.0 with a a padded waist belt while carrying a heavy load–I couldn’t get the bag to ride securely against my back when doing that. Nevertheless, the 5.11 Rush 12 2.0 is virtually bulletproof and a very well made backpack. Unfortunately, it just didn’t meet my changing needs.

    Looking for a larger backpack with MOLLE, waist belt attachment points, and a tough build like the 5.11 Rush 12 2.0 was easy–there’s a number of great alternate bags that fit those needs. However, finding one that also has a laptop sleeve capable of safely holding a 16″ laptop more challenging, because most manufacturers only support up to 15″ laptops. Thankfully, the Mystery Ranch 2 Day Assault L/XL backpack fit my needs quite well.

    Like the 5.11 Rush 12 2.0, the Mystery Ranch 2 Day Assault L/XL backpack is built tough.

    Meeting my new requirements in a backpack, it has a larger volume (24 liters vs. 29.7 liters), and its built-in laptop sleeve can accommodate a 16″ laptop (my ThinkPad P1 Gen 4 measures 10″ deep x 14 1/8″ wide x 15/16″ tall). However, I have to load and unload the ThinkPad through the main pocket as it is too wide and deep to easily maneuver through the zippered laptop side-loading pocket).

    To help with load carrying, it has an innovative lengthening system that helps the pack ride close against your body. To adjust this system, remove the plastic frame shown in the gallery above, shove it into the velcro area behind the straps to release the hook and loop material holding the straps and pack together, pull up to lengthen, put the frame back in its place, press the pack flat to ensure the hook and loop are reattached, and adjust the straps as needed to have the straps rest tightly against your torso and shoulders and the bottom of the pack against your waist.

    This adjustment system works well with the aftermarket padded waist belt that I originally used with the 5.11 Rush, but moved over to the Mystery Ranch 2 Day Assault pack. The Mystery Ranch bag included a two-piece simple nylon belt with plastic buckle. Its intention is to help hold the back against your body but not help with load carrying. I removed it and modified a Condor Battle Belt (it has a padded outer belt with MOLLE and an inner 1 1/2″ nylon belt with aluminum quick-release buckle). I cut off the D-ring equipment carriers and cut expanded holes in the outer padded belt to allow the inner 1 1/2″ belt to thread through the belt attachments on the Mystery Ranch pack. I added extra stitching to the outer padded belt and melted the nylon to prevent unraveling from these modifications.

    The strangest thing about Mystery Ranch bags is the three-zipper main pocket opening. It is difficult to open and close these one-handed. However, the zippers are top-quality and waterproof. And, with the main pocket fully open, it can ingest a tremendous amount of gear, but it will likely require the bag to be fully opened to extract that gear if it is larger (e.g., a boxed 12 pack of aluminum cans).

    Another modification that I made to the bag was to plug its main pocket drain holes with closed hole rubber grommets (I don’t want anything crawling in and setting up shop) and added some strap clips to keep the shoulder adjustment straps from flying all over the place while putting on the pack or walking with it.

    Its two side mounted stuff pouches easily hold water bottles, thermoses, and short collapsible umbrellas. During the summer, I keep a pack of menthol cooling sheets and an electric fan in one so that I can reach back to grab them without having to take off the pack.

    When I traveled to see my parents a few months ago, I added some MOLLE pouches to the exterior mounts (first aid, toiletries, cables, chargers, multitool, and snacks), but I took them off to reduce the pack’s weight when I am in the city where I walk further distances with it and would prefer the weight go towards what I am carrying instead of how I’m carrying those things.

    The Mystery Ranch 2 Day Assault pack is holding up and meeting my expectations. With the new academic year about to begin, I’ll see how it holds up trekking to and from campus.