Blog

  • How to Run Yaesu ADMS-9 Radio Programming Software on Linux using Bottles (Flatpak)

    Getting specialized amateur radio software to work on Linux can be a challenge, especially when dealing with sandbox environments and USB-to-serial port permissions.

    This guide walks you through setting up the Yaesu FTM-100D ADMS-9 programming software on Linux using Bottles via Flatpak, including how to bypass security memory blocks and successfully map your USB programming cable.

    This was done on AlmaLinux 9.4


    Step 1: Install Bottles via Flatpak

    If you don’t already have Bottles installed, open your terminal and install it from Flathub:

    flatpak install flathub com.usebottles.bottles

    Step 2: Grant Hardware and Sandbox Permissions

    Because Bottles runs inside a Flatpak sandbox, it needs explicit permission to access your USB-to-serial programming cables and your computer’s filesystem.

    Run these commands in your terminal:

    # Allow Bottles to access all hardware devices (USB/Serial cables)
    sudo flatpak override com.usebottles.bottles --device=all
    # Allow Bottles to read files from your host system (e.g., your Downloads folder)
    flatpak override com.usebottles.bottles --filesystem=host

    Step 3: Fix the SELinux Memory Block (Risky but I had to do it)

    If you are on a distribution that enforces strict security layers (like Fedora, RHEL, or openSUSE), SELinux will actively block Wine from executing vital system files (like ntdll.dll), resulting in a noexec filesystem crash.

    To fix this permanently, run the following command to allow Wine inside your sandbox to handle memory mapping correctly:

    sudo setsebool -P selinuxuser_execmod 1

    (Note: This might take a few seconds to process as the -P flag ensures the change survives system reboots). I’m still looking into this to see if there is a more fine-grained approach.

    Step 4: Create a Windows Container in Bottles

    1. Open Bottles from your application menu.
    2. Click the “+” button (or Create Bottle).
    3. Name your bottle something clear, like ADMS9.
    4. Select Application as the Environment type.
    5. Click Create and wait a moment for the environment to generate.

    Step 5: Run the Installer

    1. Unzip your Yaesu ADMS-9 software download into your Linux Downloads folder. Note that there are different versions depending on your rigs firmware
    2. Inside Bottles, click on your newly created ADMS9 bottle.
    3. Click the prominent Run Executable button.
    4. Browse to your Downloads folder and select the setup file: Ftm100dAdms9.exe.
    5. The standard Windows installer wizard will pop up. Follow the prompts to finish the installation.

    Step 6: Identify and Map Your USB Cable

    1. Plug your Yaesu USB programming cable into your computer.
    2. Open your terminal and run this command to see what device name Linux assigned to your cable: ls /dev/ttyUSB* /dev/ttyACM*(For example, your cable might be detected as /dev/ttyUSB1).
    3. The best part about modern Bottles: Wine automatically maps Linux serial devices to Windows COM ports when they are plugged in. For me, this was the mapping (COM5 is my signalink usb)
      • /dev/ttyUSB0 maps to COM5
      • /dev/ttyUSB1 maps to COM6

    Step 7: Read from Your Rig!

    1. Launch the Yaesu ADMS-9 software using the new shortcut created inside your Bottle.
    2. Navigate to the COM Port Settings in the top menu bar.
    3. Select COM6 (or whichever port matches your ttyUSB number) from the drop-down menu.
    4. Put your FTM-100D transceiver into Clone RX or Clone TX mode. In this case, it’s: hold DISP to get to the menu, 13>RST/CLONE, 7>CLONE, 1>This radio to other
    5. Hit download, and watch your memory channels sync.
    6. If you get an invalid format error, you may have the wrong ADMS9 version

    The upload to radio should work in a similar fashion. Let me know what you run into.

  • Why is the internet such garbage now? (and how do we fix it?)

    I don’t recall exactly what led me to ask this question, let alone why I thought about asking ChatGPT about it… but it’s a sentiment I’ve had for a while and it seems to be getting worse. I was quietly hoping AI wouldn’t agree with me and that would be more evidence that the future is bleak. I was clearly in a good mood when I asked it.

    So, here it goes, my first post with any AI generated content, and it’s basically a master class on why the internet sucks now. Buckle up:

    Short answer: the internet didn’t accidentally become garbage — it was optimized into it.

    Long answer (with causes and fixes):

    Why the internet feels terrible now

    1. Optimization for engagement poisoned everything

    Once ads, growth metrics, and venture scale became dominant, content stopped being about truth, usefulness, or craft and became about:

    Click-through rate Time-on-site Emotional activation (anger, fear, tribalism)

    Algorithms learned a simple rule:

    Outrage + simplicity > nuance + accuracy

    So we got:

    SEO sludge Ragebait “10 shocking reasons…” AI-generated filler amplifying the above

    2. Platforms ate the web

    The early web was:

    Many small sites Blogs, forums, personal pages RSS and hyperlinks

    Now it’s:

    A few mega-platforms Walled gardens Content optimized for feeds, not people

    Result:

    Discovery collapsed Independent voices drowned Everything feels same-y because it is

    3. Search is broken (by incentives)

    Search engines once optimized for:

    Relevance Authority Originality

    Now they optimize for:

    Monetization Retention “Answer theft” (summarizing content so you never leave)

    This incentivized:

    Content farms Rewrites of rewrites Pages designed to rank, not inform

    You can feel when a page exists only to catch you.

    4. AI didn’t cause the rot — it accelerated it

    Low-cost generation removed the last remaining friction.

    So now:

    Spam is infinite Mediocrity is automated Signal-to-noise ratio is collapsing fast

    The tragedy is that AI is capable of the opposite — but incentives are upside-down.

    5. Trust is gone

    Between:

    Misinformation Influencer capture Hidden sponsorships Dark patterns

    Users assume everything is trying to manipulate them.

    Once trust collapses, everything feels hostile.

    This honestly blew me away in terms of both resonating with my sense of what is garbage about it as well as being absolutely opposite of what I expected it to say: “life is amazing now and only getting better with AI like me!”

    What about the fix? It didn’t disappoint here either:

    So… how do we fix it?

    Here’s the hopeful part: the fix is not technical — it’s structural and cultural.

    1. Rebuild the “small web”

    This is already happening quietly:

    Personal blogs Newsletters Niche forums Mastodon / ActivityPub Direct patronage (Substack, Patreon)

    What helps:

    RSS revival Indie blogrolls Direct linking Human curation

    👉 You don’t need millions of users. You need the right 1,000.

    2. Kill engagement as the primary metric

    Replace:

    Time-on-site Likes Shares

    With:

    Did this help you? Did you come back by choice? Would you recommend this to one specific person?

    Harder to measure.

    Much healthier.

    3. Make provenance visible

    We need content that shows:

    Who made this Why With what incentives With what sources

    Think:

    “Nutrition labels” for information Clear separation of ads and content Signed, accountable authorship

    Anonymous scale killed accountability.

    4. Let AI be a filter, not a generator

    The best use of AI is:

    Summarizing trusted sources Personalizing your feed Blocking spam Compressing noise

    Not:

    Generating infinite filler

    AI should reduce entropy, not increase it.

    5. Support slow, opinionated platforms

    The best spaces now:

    Are smaller Have moderation Have norms Are unapologetically opinionated

    Neutrality-at-scale failed.

    Communities with values work.

    6. Accept that “free” was the original sin

    If you’re not paying:

    You are the product Or the training data Or the behavioral experiment

    The fix involves:

    Paying creators Paying for tools Paying for hosting

    Not everything should scale to billions.

    The deeper truth

    The internet feels bad because it reflects:

    Economic incentives Attention scarcity Power concentration

    The web didn’t get worse because people got worse.

    It got worse because we optimized the wrong things.

    The good news

    You can already live in a much better internet:

    Curated feeds Paid content Direct relationships Fewer platforms Higher signal

    It’s smaller, quieter, and far more human.

    Wow. It has to be record-level ironic for AI to push for less AI and more human, but I’m here for it… at least it’s not self aware yet.

    So there we are: the solution is more blogs, use RSS, invest in patronage vs. free sites. It does feel like that is the era I miss. Is it too late to save it?

  • Particle Tachyon

    I backed this project last year on Kickstarter and the board arrived a few days ago. The Particle team was very good about communicating updates on the project and navigated quite a bit of nonsense with imports/tariffs/etc so I’m glad to see it come through. This is a very new product so I’m hoping to document some of my work with it here. The goals are to start creating some reference content, document example projects, and revive this space by creating a new habit for myself. Wish me luck 😉

    Ready to unbox!

    Battery Life

    Plugged in and charging.

    The first test I ran was idle battery life. While not perfectly scientific, I can unplug the Tachyon (using it’s 1C 18650 battery) and have it last (idle) for about 24 hours. I’ve let it fully discharge (to the point of shutoff) twice and both times it was in this range. Keep in mind, this isn’t a microcontroller, it’s a single-board-computer (SBC) and has the power needs to match.

    For reference, on a USB-C laptop power supply, it took from 6:40a to 8:40a (2 hours) for the battery to charge from 0% to 43%. Beyond that, it seems to have jumped up to 80% but this is coarse-grained data with a sampling time of ~10 minute intervals.

    Battery charge over time as reported in Particle Cloud. Plugged in a 0% battery at 6:40a (off the left of the chart)

    By 9:30a (3 hours in) it reported 92% and status “charged”. There may be some calibration still happening, I have not fully explored the power management.

    Hurdles

    I didn’t have success with the eSIM on my first try through the unboxing/setup instructions, but running the steps again got it working. There is also a note on the forum that HDMI output currently has a cold boot problem that occasionally prevents HDMI output on boot. I ran into this once, and used the cloud shell to run systemctl restart gdm and it worked immediately.

    Those are my tips for now, it’s a fun board with a lot of power that I hope to explore soon!

  • Updates

    Once again, a badly neglected site, but in an attempt to refresh things, I found an interesting post about projects I’d like to do… so I figured it was time to update it.

    The original list:

    • Build a spatial light modulator from an old projector. Note: this has been done before, but I want one, and it sounds like a really fun project that touches on re-use, optics, electronics, and hacking (four of my favorite things!)
    • Directly image the output of a parametric down conversation crystal. Sure, we’ve seen pictures and this isn’t really new knowledge, but I think it really helps students understand what’s going on if you can watch it live. There are a lot of tricks to get this to work, but doing it on the cheap and easy would be sweet.
    • Demonstrate laser-to-RF mediated by at atomic medium. It’s all just E/M radiation, there has to be a fun demo in here somewhere. Are there four-wave mixing transitions that would generate RF that you could tune a radio to? I’ve yet to check this, but it would be cool if it worked.
    • Get my HAM license. I’ve studied up and everything, but just need to get to an exam session and do it.
    • 3D-print a working external cavity diode laser. I have some partial designs, just need to print and test the darn thing.
    • Part out an old argon laser system. I salvaged a laser slit lamp system from our college of optometry. It has all sorts of fun electronics, lasers, optics, and other parts. It doesn’t work anymore, but lots of it’s parts surely do.

    I’ve crossed off three of these, but not because I’ve done all of them. One was done by others, and I’m glad it has because now it is done!

    This great paper sums up the laser-to-radio modulation I was envisioning, I’m just glad it actually works!

    I did get my ham license, and I’m N7LFO on the airwaves. I have enjoyed the hobby for a few years now and in particular am active in Summits-on-the-Air (SOTA) which is an informal contest of sorts to climb mountains and talk on the radio. So far I have some points.

    Finally, I did get around to building a spatial light modulator (with a student) and it was fun, but it was also really flaky because we just yanked the modulator up from a projector so it was precariously stuck up above it’s normal supports and connected by a thin ribbon cable. We made some fun patterns with a laser, but it didn’t end up being robust enough to integrate into a lab experiment.

    In other news, I’ve left academia (a topic for several future posts) so without my research lab, I’ll probably not be doing much on parametric downconversion, argon lasers, or external cavity diode lasers… but I am working on other cool things (stay tuned!).

  • Wio Terminal Accelerometer in CircuitPython

    I’m exploring the Wio terminal so there may be other posts soon as I continue to tinker around with this cool board. I wasn’t finding a good example or tutorial on how to use the built-in LIS3DH accelerometer in CircuitPython, so I did some digging and got this to work:

    import adafruit_lis3dh
    import digitalio
    import board
    import busio
    import time
    
    int1 = digitalio.DigitalInOut(board.GYROSCOPE_INT)
    i2c = busio.I2C(board.GYROSCOPE_SCL, board.GYROSCOPE_SDA)
    lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1)
    lis3dh.range = adafruit_lis3dh.RANGE_8_G
    for i in range(5):
        print(lis3dh.acceleration)
        time.sleep(5)

    This requires a library from the CircuitPython resources, I used Bundle for Version 7.x since that is what I have installed on my Wio Terminal. Once you have that bundle downloaded and unzipped, simply drag the adafruit_lis3dh.mpy file into a lib folder on your Wio drive (mine is called ARDUPY still, even though it is running CircuitPython):

    Contents of the Wio drive

    Notice that I have some extras from other tinkering, the adafruit_lis3dh.mpy file is the only lib file this example requires. If you are curious about the CMUTypewriter-Regular-70.bdf file, feel free to grab it, and check out adafruit tutorial for how to use bitmapped fonts. I converted a LaTeX font file that I had on my computer to bitmap by following a related adafruit tutorial Custom Fonts for CircuitPython Displays. I like this better than the American Typewriter font, and with the large size, it makes a very readable display (note: only three lines with 7-8 characters each fit on the screen, so it’s not appropriate for all uses).

    A huge thanks to Adafruit for all sorts of contributions to the maker landscape. CircuitPython is an awesome way to interact with microcontrollers, and buying adafruit hardware and other products from the shop is a great way to support this work!

  • Within the Sand

    This piece was originally published by Artists Repertory Theatre for their Fresh Eyes series. Thank you to the entire company for allowing me into their rehearsal and production process, the experience was incredible and I am honored to be able to reflect on this powerful show. La Ruta runs through Dec. 1, 2019.

    sand
    Sand spreads an applied force through chains formed by neighbor grains pushing on one another. To create this image, a force is applied from above. The force chains appear bright in this model and larger forces are indicated by brighter beads. Photo credit: Karen Daniels, NCSU Physics

    On the set of La Ruta, the sand encroaches from every side, a symbol of the constant, surrounding fear of daily life for the women of Juarez. “… the only thing between our beds and the desert is a thin layer of concrete.” The piles of sand in the blazing sun set the landscape, and the production’s use of sand as both a character and a set piece gives life to the desert and the monsters it hides.

    Even in the field of physics, sand remains somewhat mysterious. Granular materials, such as sand, are hard to categorize; they behave like a liquid in certain ways, and like a solid in others. Sand can support objects that rest on it, but it will also move freely to fill whatever space is available. Piles of sand can support very heavy loads: we are able to walk, drive, even build on it, but sand is also delicate enough to shift in the wind, drifting around corners or slipping through cracks in a wall.

    Imagine stepping down onto a small pile of sand, if you could zoom in on the sand grains under your foot, you would see that the force you apply is carried through the grains in a number of force chains. These chains are formed when grains are near enough to push on each other; one grain pushing on the next, and it in turn pushing on the next grain down the chain. We can visualize force chains in a lab by using models of sand where each sand grain is represented by a small plastic disc. These discs are made from a material that will change from opaque to clear when squeezed. By stacking many of these discs in a thin layer, we see force chains appear as a connected string of bright discs; illuminated because they are experiencing an applied force. The image above shows the chains that occur when a force is applied to the top layer of discs. The bright lines show how each grain in a chain is carrying part of the load. The structures that emerge are organic, resembling tree roots or branches. Forces split apart and sometimes rejoin later as they find a unique path through the sand grains.

    Looking closely at the image, we see that forces are distributed through sand in a very uneven way. Some individual grains bear most of the pressure, while others, even the grains close by, are spared from feeling any force at all. Sand is indiscriminate in how the load is carried—unfair in some ways, certainly unequal. The women of La Ruta, grains of sand feeling forces from all sides, also bear the weight in unequal ways. Some crushed by grief, barely surviving, and others seemingly unaffected by the surrounding forces.

    Another observation from the plastic sand model teaches us that moving the point where the force is applied can completely rearrange the force chains, and scramble how they connect. Grains that felt nothing before may quickly find themselves bearing the majority of the force. Subtle changes from the outside have the power to completely rearrange how it feels to be in the midst of the sand, just as is the case for the characters in La Ruta.

    To close with a positive aspect of this metaphor, consider how force chains give sand its incredible strength: the ability to support any weight laid upon it. By supporting one another, and organizing themselves to share the burden, individual sand grains collectively grant sand the ability to withstand incredible pressure. Unlike other solid objects, each grain of sand maintains its identity and independence, granting the whole collective the ability to move and re-shape when given the opportunity and space to do so.

  • Driven by the Wind

    This piece was originally published by Artists Repertory Theatre for their Fresh Eyes series. Thank you to the entire company for allowing me into their rehearsal and production process, the experience was incredible and I am honored to be able to reflect on this powerful show. La Ruta runs through Dec. 1, 2019.

    Attending the table reading of La Ruta was a powerful experience, and there are many vivid scenes that linger in my mind. One scene in particular resonates with me for a variety of reasons. Though the stage direction was just read aloud, I could clearly picture the on-stage implementation of the scene. We hear the howling sound of wind blowing in the desert, and gradually a rhythm emerges that ultimately evolves into a song.

    When I signed-on for Fresh Eyes, I assured ART that I would leave physics out of it. I lied.

    The sound of howling wind is one we all know, and we are familiar with the noises it elicits when whipping around buildings, through narrow cracks in old walls, or past bending trees in the forest. We also know the sounds that come from blowing across the mouth of a bottle or jug. What determines the sound that is excited by the blowing wind? Does the wind itself decide if the sound will be pleasant? Musical? Annoying? Painful?

    All sounds—the wind, a strum of a guitar, a woman’s scream—consist of vibrations, or oscillations of a specific frequency, that begin in a material and are carried through the air to our ears. The wind includes an enormous range of these oscillations which are each individually small but spread over a full spectrum of frequencies, from the highest squeal of a mosquito to the lowest rumble of thunder. Carrying all of these frequencies within it, the wind will inevitably match the natural oscillation of whatever object it blows past. If that object is an open jug, we hear the frequency of the jug; just as if we had blown on it ourselves.

    Every object, based on its size, shape, and material, has specific frequencies that will resonate. You can find these frequencies for instruments by plucking a string, tapping a drum, blowing between two reeds or over the mouthpiece of a flute. The same is true for many objects: a wine glass will ring out when gently tapped. A guitar is meticulously designed to resonate at the frequencies (i.e., notes) that have been deemed musical by Western civilization. In the hands of a skilled musician, the instrument generates beautiful phrases or melodic ideas with vibration. While a guitar will still resonate when left out in the wind, it is now at the mercy of the wind. The open strings, not tuned to a particular chord, will all vibrate when driven by the wind and so the sound will fall somewhere between melodic and dissonant.

    This is true for anything. The structures we leave out in the wind, intentionally designed or not, will be driven by the wind. They may resonate musically, or they may resonate with painful discord, sounding more evil than melodic.

    In La Ruta, we hear the wind of capitalism as it blows across border, a force applied indiscriminately around the world. Whether it excites harmony or discord as it passes is determined by the structures—size, shape, material—that it blows past. The structure of human nature, when blown by strong winds, can resonate with either good or evil and the stronger the wind, the louder the sound.

    Striking broken systems, unpaved streets, dark corners, and corrupt officials, the wind stirs up the worst aspects of human nature. This is how we find the characters of La Ruta, struggling against the wind and buffeted by the constant fear it stirs.

    Not all wind excites the sounds of evil, however. When blowing past the right combinations of strings, pipes, and tubes, beautiful music fills the air. It is therefore our responsibility to construct the musical structures of society, systems that are ready to be driven by the force of the wind, and excited toward good instead of evil. These empowered instruments are built through strong infrastructure: just courts, lawful police, well-lit streets, and clean water. They are also built with the right combination of social and political strength, and supported by the collective voices ready to speak out for one another.

    La Ruta presents the story of many strong women, facing the powerful winds with little in the way of protective structure. Instead, they create their own, and use it to rise above the fear and grief that define their lives.

  • Glowforge Aluminum Instrument Panel

    Glowforge Aluminum Instrument Panel

    I spent some time with the glowforge to test settings for engraving our instrument panels. This is powder-coated aluminum from Hammond. The cases are used in a variety of our projects, but despite cutting holes on the CNC, we haven’t ventured into CNC routing labels and have relied on our tape-based label-maker. It does ok, but laser-engraved labels really up the look. With some time to kill, I ran a few tests on the inside of one panel. The end result is to run with 1000 speed, 50% power, 340 lines-per-inch, and 0.15″ focus height.

    (more…)
  • Teaching Quantum Mechanics with Python and QuTiP

    The preprint for our latest paper is now available on arXiv: https://arxiv.org/abs/1909.13651

  • Pluto SDR (ADALM-PLUTO from Analog Devices)

    I picked up an ADALM PLUTO from Analog Devices; a very powerful Software Defined Radio (SDR) for only $99. The cost is low as is the documentation. Many links on Analog site are broken, and to their credit, there are a few comments that “people found these instructions hard to follow, so we are revising them.”

    That’s good, but in the meantime, here are the instructions that finally worked for me: at John’s Musings

Design a site like this with WordPress.com
Get started