<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://www.jasonemiller.org/feed.xml" rel="self" type="application/atom+xml" /><link href="http://www.jasonemiller.org/" rel="alternate" type="text/html" /><updated>2026-04-05T22:43:21+00:00</updated><id>http://www.jasonemiller.org/feed.xml</id><title type="html">Home Page of Jason E. Miller, Ph.D.</title><subtitle>This is the web home for Jason E. Miller, Ph.D., containing links and information relating to personal interestsand work.  All content on this site are the personal opinions of the author (me) alone, and they do not represent those of my employers or legal entities associated with my employers.</subtitle><entry><title type="html">Resource to Create Lined Paper</title><link href="http://www.jasonemiller.org/2025/10/04/linedpaper.html" rel="alternate" type="text/html" title="Resource to Create Lined Paper" /><published>2025-10-04T00:00:00+00:00</published><updated>2025-10-04T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/10/04/linedpaper</id><content type="html" xml:base="http://www.jasonemiller.org/2025/10/04/linedpaper.html"><![CDATA[<p>I do a lot of writing, and by writing I mean using a pen to put marks on paper.  Sometimes the writing is for brainstorming, sometimes the writing is to diagram out a build I’m wroking on, and lots of time the writing is to put a lecture plan on paper for a mathematics course I teach.</p>

<p>Because I write and give so many lectures each week, I collect paper that would otherwise be thrown in a recycling bin.  Paper that is letter-sized and has one blank side.  I turn the used side down and write my notes on the blank side.  Works great!</p>

<p>To help me keep my notes a little bit neater, I like to put under the paper a sheet of lined paper whose lines are bold enough to see through my recycled sheet of paper.</p>

<p>A long time ago, I made these lined sheets myself.  A fine sharpie, a ruler, and a piece of lined paper (e.g., from a legal pad) was all I needed.  But it took time to  make a single piece of lined paper for this work.  A couple years ago I found a web site that allowed you to create your own lined or graph paper, and I’ve turned to this as my go-to source of guiding lined paper:</p>

<p><a href="http://incompetech.com/graphpaper/lined/">http://incompetech.com/graphpaper/lined/</a></p>

<p>This site lets you set the line thickness, the line spacing, the line coloring, the background color, and the page orientation.  Set those parameters and then click a button to download a PDF of your guide lined paper.  Love it!</p>

<!--
SYNTAX FOR IMAGES
* use services to create JPG and to create thumbnail that is 720px wide

[![ALT-TEXT](/assets/images/filename-thumbnail.jpg)](/assets/images/filename.jpg)
-->

<!--
SYNTAX FOR VIDEO
* convert MOV to mp4 using VLC

<video width="480" height="320" controls="controls">
  <source src="/assets/media/filename.m4v" type="video/mp4">
</video>
-->]]></content><author><name>Jason</name></author><category term="resource" /><category term="writing" /><summary type="html"><![CDATA[I do a lot of writing, and by writing I mean using a pen to put marks on paper. Sometimes the writing is for brainstorming, sometimes the writing is to diagram out a build I’m wroking on, and lots of time the writing is to put a lecture plan on paper for a mathematics course I teach.]]></summary></entry><entry><title type="html">Email to Visitors at our Amateur Radio Booth</title><link href="http://www.jasonemiller.org/2025/08/17/WOC-amateurradio.html" rel="alternate" type="text/html" title="Email to Visitors at our Amateur Radio Booth" /><published>2025-08-17T00:00:00+00:00</published><updated>2025-08-17T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/08/17/WOC-amateurradio</id><content type="html" xml:base="http://www.jasonemiller.org/2025/08/17/WOC-amateurradio.html"><![CDATA[<p>On August 16th and 17th, I staffed a booth on Amateur Radio at the Wings Over Camarillo airshow’s STEM Pavilion.  The purpose of being there was to raise public awareness of amateur radio, its social value, and its role as one of the OG STEM pursuits.</p>

<p>As usual, it was a great show.  We had a delightful location (in the shade, where we could easily see the airshow performances).  And many people dropped by with questions or comments on amateur radio.</p>

<p>At the event, I took names and contact information for people who had questions or wanted information about amateur radio.  I’m posting the text of that email here so others can see it and share it around if they meet someone with questions.</p>

<hr />

<p>Dear PERSON,</p>

<p>Thank you for visiting the CSU Channel Islands Amateur Radio Club booth at the Wings Over Camarillo STEM Pavilion.   Radio is everywhere, and amateur radio has such a wide variety of expressions that it has something interesting to offer everyone.  I hope this email helps you find a way to explore your interest in radio or answers a question for you.  If, after scanning this (long) email, you have questions, feel free to email me and I’ll give you my best answers or refer you to someone else who knows.</p>

<p>The email starts with information about how to get an amateur radio license.  Then I list some events that will help hams get hands-on experience with radios (something that earning a license does not require), and I close by sharing some contact information for amateur radio clubs in the Ventura County region.</p>

<h2 id="earning-an-amateur-radio-license">Earning an Amateur Radio License</h2>

<p>Becoming a ham or an amateur radio operator requires passing a Federal Communication Commission (FCC) exam.  There are three license levels (from entry level to highest):  Technician, General, Amateur Extra.  Each gives you increasing access to and responsibility for radio operations.</p>

<p>Everyone has an opinion on how to prepare for taking and passing a licensing exam.  Through experience, we at the University have arrived at the following advice:  Use <a href="http://hamstudy.org">http://hamstudy.org</a> or the HamStudy app to study the questions in the exam’s question pool.  Then use the site or app to take practice exams.  Once you can consistently score 80% or better on practice exams, you are ready to take the licensing exam.  (To pass, you need to answer at least 74% of the questions correctly.)</p>

<p>Many amateur radio clubs offer in-person exam sessions (called VE sessions).  In the last few years, the ham community has learned how to offer licensing exams online, too.  Use the ‘Find a Session’ link on <a href="http://hamstudy.org">http://hamstudy.org</a> to find a session that works for you.  Note that some groups (<em>e.g.</em>, groups associated with GLAARG, the Greater Los Angeles Amateur Radio Group) waive the test taking fee for first-time test takers who are students or veterans.</p>

<p>Expect a testing fee of about \$10-15.  When you pass the test, the FCC will require a \$35 processing fee (payable online) to assign you an amateur radio call sign and add you to the searchable database of license holders.</p>

<p>Many people enjoy taking a face-to-face course to prepare for the exam.  Taking a course allows you to ask instructors questions that the online study tools cannot.  In Ventura County, the Conejo Valley Amateur Radio Club is known for the free classes it regularly offers (see below).</p>

<p>For those who live or work in the North LA area, Norm Godkin regularly offers a one-day class for the Technician’s exam in Van Nuys.  The class begins at 4pm, and they give an exam at 9pm.  According to the web site (below), the class fee is \$50 on top of the testing fee of \$10 and FCC fee of \$35.  This class works best if you spend some effort to study ahead of time.</p>

<p>Norm Godkin’s class:  <a href="https://www.qualitymatrix.com/hamclass/">https://www.qualitymatrix.com/hamclass/</a></p>

<h2 id="cvarc-licensing-courses-free">CVARC Licensing Courses (free)</h2>

<p>Conejo Valley Amateur Radio Club (CVARC) is offering free classes for amateur radio licensing in two different session:</p>

<p><strong>Session 1:</strong> September 6, 13, 20, 27, and October 4, and <br />
<strong>Session 2:</strong> November 1, 8, 15, 22, and 29.</p>

<p>The first session will include a class for the Technician and another for the General exam.  The second session will include a class for the Technician and another for the Amateur Extra exam.</p>

<p>All classes are Saturday mornings from 8:00 am to noon, at the East County Sheriff Station’s Community room at 2101 E. Olsen Road, Thousand Oaks. </p>

<p>Each course will use the associated ARRL licensing textbook.  They are available directly from the ARRL and from online and brik-and-mortar booksellers.  Because the licensing exams change every few years, it is important that you get the correct edition of the textbook, so beware.</p>

<p>Here are Amazon links for the ARRL licensing textbooks:</p>

<ol>
  <li>Technicians:  <a href="https://a.co/d/39mYSMZ">https://a.co/d/39mYSMZ</a></li>
  <li>General:  <a href="https://a.co/d/1mk0xGK">https://a.co/d/1mk0xGK</a></li>
  <li>Amateur Extra:  <a href="https://a.co/d/3glisPN">https://a.co/d/3glisPN</a></li>
</ol>

<p>To reserve a free seat in any of these classes, email Keith Elliott (W6KME) at <a href="mailto:keith@w6kme.org$subject=Requesting a seat in CVARC's free licensing class">keith@w6kme.org</a>.</p>

<h2 id="events">Events</h2>

<p>Earning a license is a matter of passing a multi-choice test.  It neither requires you to know how to operate a radio nor does it teach you how to operate a radio.  This is a bit of a frustration for new hams because it’s hard to learn how to operate a radio by yourself - radios are at their most enjoyable when multiple people are involved (each with their own radio).</p>

<p>This section shares a couple events that might help a new ham get advice on operating a radio and some hands-on experience, even if they don’t own a radio of their own, yet.  After this section, I list a bunch of the regional amateur radio clubs because they (and the events they organize) can be a great source of experience for new hams.</p>

<h3 id="micro-field-days-bored-net">Micro Field Days (BORED Net)</h3>
<p><a href="http://www.theborednet.net/index.php/field-day/">http://www.theborednet.net/index.php/field-day/</a></p>

<p>Organized by the BORED Net, a micro field day (aka 𝜇field day) is a low key pop-up event that happens about once a month where hams come together at a park and set up their radios.  For some, it’s an opportunity to dust off their gear and make sure everything works, and for others it’s a chance to let others see their station.  There are are always ‘Elmers’ there eager to talk with newcomers to ham radio and give their best advice on gear and operations.</p>

<p>If you’re looking for a place to connect with hams that share your interest or to learn how to use the gear you have, a 𝜇field day is a great way to do either or both.</p>

<h3 id="micro-expo---saturday-913-at-csu-channel-islands-campus">Micro Expo - Saturday 9/13 at CSU Channel Islands Campus</h3>
<p><a href="http://www.theborednet.net/index.php/ham-radio-expo-to-be-held-on-august-31-2024/">http://www.theborednet.net/index.php/ham-radio-expo-to-be-held-on-august-31-2024/</a></p>

<p>A ham Expo or hamvention combines elements of a ‘professional conference’ and a trade show, is highly orchestrated by organizers, and is open to anyone who is willing to pay a sometiomes hefty registration fee.  Classic examples of a hamvention are the Dayton Hamvention and the International Amateur Radio Exhibition in Friedrichshafen, Germany.  A 𝜇Expo is an ultra low-key, loosely organized, and free version for local ham radio clubs and operators.</p>

<p>In 2024, the BORED Net and the CSU Channel Islands Amateur Radio Interest Group (KN6ZYB) hosted a first 𝜇Expo on the CSU Channel Islands campus.  The second annual 𝜇Expo is planned for Saturday, September 13th.  We’re hoping it will be a bit bigger, have a few more activities, and still be free to all who are interested.  Check out the BOREN Net’s web page for the 𝜇Expo for details as they become available.</p>

<h2 id="regional-clubs">Regional Clubs</h2>

<p>The Ventura County region is rich with ham radio operators and ham radio clubs.  Most are public clubs with nominal annual memebership dues, but others are specialized and might have limited options for membership.</p>

<p><strong>Conejo Valley Amateur Radio Club (CVARC)</strong>
<a href="http://www.cvarc.org">http://www.cvarc.org</a>
Meetings:  Third Thursday of the month, 7:30pom at the East County Sheriff’s Station (2101. E. Olsen Road, Thousand Oaks).</p>

<p><strong>Ventura County Amateur Radio Club (VCARC)</strong>
<a href="http://www.k6mep.org">http://www.k6mep.org</a>
Meetings:  Second Friday of the month, 7:00pm at Grace Lutheran Church on Telephone Road, Ventura.</p>

<p><strong>Pleasant Valley Amateur Radio Club</strong>
<a href="http://www.pvarc.org">http://www.pvarc.org</a>
Meetings:  None.  Devoted to supporting area amateur radio repeaters.</p>

<p><strong>Simi Settlers Amateur Radio Club</strong>
<a href="http://www.simisettlers.org">http://www.simisettlers.org</a>
Meetings:  Second Thursday of the month, 7:00pm at the Simi Senior Center.</p>

<p><strong>Santa Barbara Amateur Radio Club</strong>
<a href="http://www.sbarc.org">http://www.sbarc.org</a>
Meetings:  Third Thursday of the month, 7:30pm at Goleta Union School Disgtrict Board Room.</p>

<p><strong>CSU Channel Islands Amateur Radio Interest Group</strong>
<a href="http://www.csuci-amateurradio.org">http://www.csuci-amateurradio.org</a>
Meetings:  Varies by semester.  Club is for CSUCI employees and alumni, devoted to supporting the student club.</p>

<p><strong>CSU Channel Islands Amateur Radio Club</strong>
<a href="https://tinyurl.com/f2vf3nx9">https://tinyurl.com/f2vf3nx9</a>
Meetings:  Varies by academic year.  Club is an official University student organization for current CSUCI students.</p>

<h2 id="closing">Closing</h2>

<p>Again, thank you for speaking with me at my amateur radio booth in the Wings Over Camarillo STEM Pavilion.  I’m pleased that you are excited about amateur radio, and I’m especially pleased that I can do something to help you pursue your interest.  Hopefully, something above will be useful to you.</p>

<p>If you ever have any other questions, don’t hesitate to reach out to me.  I’m always happy to share what I know and put you in touch with someone else with better knowledge to answer your questions.</p>

<p>Jason</p>

<hr />

<p>Much of this information what on display through printed material at the booth.  Unfortunately, we didn’t have anything announcing the micro Expo.  And we could have used more engagement activities.  But there’s always next year!</p>

<!--
SYNTAX FOR IMAGES
* use services to create JPG and to create thumbnail that is 720px wide

[![ALT-TEXT](/assets/images/filename-thumbnail.jpg)](/assets/images/filename.jpg)
-->

<!--
SYNTAX FOR VIDEO
* convert MOV to mp4 using VLC

<video width="480" height="320" controls="controls">
  <source src="/assets/media/filename.m4v" type="video/mp4">
</video>
-->]]></content><author><name>Jason</name></author><category term="amateur-radio" /><summary type="html"><![CDATA[On August 16th and 17th, I staffed a booth on Amateur Radio at the Wings Over Camarillo airshow’s STEM Pavilion. The purpose of being there was to raise public awareness of amateur radio, its social value, and its role as one of the OG STEM pursuits.]]></summary></entry><entry><title type="html">Generative AI in Mathematics? Some thoughts.</title><link href="http://www.jasonemiller.org/2025/08/15/ai-at-CSUCI.html" rel="alternate" type="text/html" title="Generative AI in Mathematics? Some thoughts." /><published>2025-08-15T00:00:00+00:00</published><updated>2025-08-15T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/08/15/ai-at-CSUCI</id><content type="html" xml:base="http://www.jasonemiller.org/2025/08/15/ai-at-CSUCI.html"><![CDATA[<p>In early 2025, the California State University system officiall <a href="https://www.calstate.edu/csu-system/news/Pages/CSU-AI-Powered-Initiative.aspx">dove into the deep end of that AI pool</a> by declaring itself the country’s first and largest “AI-empowered higher education system.”  This system-wide adoption surprised most of us in the system, and it took me a while to start to understand its implications.  To try to understand how this will effect me as an educator, I enrolled in a summer faculty development course aimed at helping faculty incorporate AI into their teaching.  This post shares a couple things I learned.</p>

<p><strong>TL;DR:</strong>  Generative AI can be a valuable aid when working with lots of data or in tedious and repetive tasks, so it doesn’t do mathematics well.  (Mathematics is a creative act.)  Generative AI can make images, but you can’t exert fine control over their content.   And the art of writing a prompt for AI might give us a way to use AI to help students be more effective learners.</p>

<h2 id="tedious-and-repetitive">Tedious and Repetitive</h2>

<p>At the start of the course, I learned that our leaders in the campus Learning Resource Center (where our tutors are trained and supported) are <em>trying</em> to drink the AI coolaid, but they are informed enough to see the challenges teachers will have to grapple with.  Throughout the summer experience, our facilitator acknowledged the limitations of generative AI and encouraged us to explore AI tools to find those limitations ourselves.  The AI industry wants us to believe that AI is evolving quickly, leaving past problems behind.  We need to test those claims ourselves by using the tools and seeing AI capabilities with our own eyes.</p>

<p>I’ve fiddled with AI in a few ways over the last couple years.  I’ve used it to summarize large documents, suggest titles for an initiative, draft logos, and explain mathematical concepts.  Generative AI does better with some things (summarizing and brainstorming) than others (mathematics).  If educators are looking for a way to automate tedious repetitive tasks, AI might provide a solution.  Unfortunately, faculty members don’t have many tasks like that.  Most require individual, creative attention at some level.  Instruction is like that.</p>

<h2 id="beware-mathematics">Beware Mathematics</h2>

<p>Generative AI hasn’t been very good at mathematics.  It’s getting better at solving mathematical problems and showing the steps that lead to a solution.  This makes generative AI a great tool for students who want technology to do their thinking for them.  Educators need to find ways to teach that either embrace this reality or protect against it.</p>

<p>Students strugle with coming up with examples of functions that have prescribed properties.  During this AI course, I had the idea of using generative AI to generate examples of functions with properties that students are learning about for the first time in Calculus.  This is a matheamtical task that requires a limited amount of creativity.</p>

<p>I asked ChatGPT EDU to “give me an example of a function that is continuous everywhere but not differentiable.”  The prompt was a bit open ended, but ChatGPT responded <a href="https://chatgpt.com/s/t_689f385a5ae48191a4d3501a35e754ee">like a champ</a>, giving me the absolute value function.  Perhaps also hoping to earn brownie points, it also gave me the canonical example of a function that is everywhere continuous but nowhere differentiable.</p>

<p>I tried again, using a more specific prompt.  I asked it for an example of a function that was continuous on [0,1) and (1,2] but not differentiable at x=1.  Again, it won a prize with <a href="https://chatgpt.com/s/t_689f385a5ae48191a4d3501a35e754ee">this answer</a>.  It gave me an appropriate proper piece-wise defined function.  I was impressed until I asked ChatGPT to graph the function.  It failed at this.</p>

<p><a href="/assets/images/image-ChatGPTbadgraph.png"><img src="/assets/images/image-ChatGPTbadgraph.png" alt="Plot of two parallel increasing lines." /></a></p>

<p>I attempted to coax ChatGPT with feedback aimed at helping it correct its error.  After a couple failed attempts, I wrote, “Yeah, sorry buddy. Your function is correct, but you’re not graphing it correctly.”  After submitting this to the chat, ChatGPT tried again and <a href="https://chatgpt.com/s/t_689f39c326488191b5c7fbf7721052c4">got the graph right</a>.</p>

<p>This suggests to me that the value in ChatGPT generating examples for students might be limited, and I shouldn’t use it as an instructional tool.</p>

<p>I tried the same requests with another generative AI agent, <a href="http://calude.ai">Claude</a> and had better mathematical results.  It didn’t typeset the mathematics as nicely (which might confuse students), but it didn’t make the same dumb graphing mistakes as ChatGPT.  I need to play with Claude a little more to see if it’s better at generating examples for my Calculus students.</p>

<h2 id="images">Images</h2>

<p>Generative AI likes to boast that it can generate images as well as text.  As part of an assignment in my summer course, I asked ChatGPT to generate a social media post (for LinkedIn) that talked about the summer course and how I hoped to integrate AI into my Calculus courses this Fall.  ChatGPT easily produced a 150 uninspiring words.  I then asked ChatGPT to generate an image to go along with the post.</p>

<p>It gave me this image:</p>

<p><a href="/assets/images/image-coursera-1.png"><img src="/assets/images/image-coursera-1.png" alt="ALT-TEXT" /></a></p>

<p>It has visual appeal, but I wanted the mathematics to be more visible.  So I asked ChatGPT to revise the image with that in mind.  It gave me this revision.</p>

<p><a href="/assets/images/image-coursera-2.png"><img src="/assets/images/image-coursera-2.png" alt="ALT-TEXT" /></a></p>

<p>I initially liked this one more.  It had a stronger ‘mathematical’ appearance.  Then I looked closer and noticed that what looked mathematical was nonsense.  This wouldn’t be acceptable, so I asked ChatGPT to review the image.  To my surprise, it said that the task was impossible for it to fulfill, and it suggested that I overlay mathematical expressions that I generate with LaTeX!</p>

<p>This generative limitation of ChatGPT is interesting, and it’s good news for creative types!</p>

<h2 id="prompts">Prompts</h2>

<p>A person interacts with generative AI through written prompts.  How you write a prompt influences what the AI tool generates for you.  In my summer course, we spent a bunch of time thinking about this and practicing prompt writing.</p>

<p>About half-way through the summer course, it occured to me that I could use the importance of prompts to help students improve on a skill that has always challenged them:  asking questions.  Students have a hard time asking questions about new (and old) mathematical concepts and techniques.  They struggle to articulate what is creating confusion for them.  Students who are better at asking questions will be more effective learners.</p>

<p>Since a prompt to a genrative AI agent is essentially the expression of a question, perhaps spending some time asking students to work on writing effective prompts for AI tools will translate to them asking better questions in class?</p>

<p>Watch this space for any updates on how this works out for me.</p>

<h2 id="conclusion">Conclusion</h2>

<p>Generative AI has arrive, is available to students, and we educators need to figure out how to adapt.  We adapted how we taught mathematics when affordable graphing calculators hit the market in the early 1990s.  While some instructors ‘adapted’ by prohibilting their use, other instructors saw the new technology as making some old skills irrelevant (e.g., numerical computation) and creating new opportunities for understanding mathematics possible.  For example, graphing calculators made generating plots of function fast and easy because computing and drawing were two things that computers did faster than a human.  Mathematics educators are still wrestling with the impact of pervasive computing on learning, and generative AI is just a new facet of this old reality.  We’ll figure out how to adapt and teach students what they need to know to be mathematically literate in the 21st century.</p>

<!--
SYNTAX FOR IMAGES
* use services to create JPG and to create thumbnail that is 720px wide

[![ALT-TEXT](/assets/images/filename-thumbnail.jpg)](/assets/images/filename.jpg)
-->

<!--
SYNTAX FOR VIDEO
* convert MOV to mp4 using VLC

<video width="480" height="320" controls="controls">
  <source src="/assets/media/filename.m4v" type="video/mp4">
</video>
-->]]></content><author><name>Jason</name></author><category term="teaching" /><category term="AI" /><summary type="html"><![CDATA[In early 2025, the California State University system officiall dove into the deep end of that AI pool by declaring itself the country’s first and largest “AI-empowered higher education system.” This system-wide adoption surprised most of us in the system, and it took me a while to start to understand its implications. To try to understand how this will effect me as an educator, I enrolled in a summer faculty development course aimed at helping faculty incorporate AI into their teaching. This post shares a couple things I learned.]]></summary></entry><entry><title type="html">Report on testing APRS and emergency comunication options on Santa Rosa Island</title><link href="http://www.jasonemiller.org/2025/07/14/srirs-amateur-radio.html" rel="alternate" type="text/html" title="Report on testing APRS and emergency comunication options on Santa Rosa Island" /><published>2025-07-14T00:00:00+00:00</published><updated>2025-07-14T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/07/14/srirs-amateur-radio</id><content type="html" xml:base="http://www.jasonemiller.org/2025/07/14/srirs-amateur-radio.html"><![CDATA[<p>This post is an update on some amateur radio work I did at the Santa Rosa Island Research Station in July 2025.  I’ll talk about my attempts to reach the mainland on VHF and my use of APRS.</p>

<p>I didn’t plan to be on Santa Rosa Island this weekend.  On Friday, I was walking across campus and I ran into Dr. Ahmed Awad, a Chemist and the Director of the <a href="https://www.csuci.edu/studentresearch/">Undergraduate Research program</a> at CSUCI.  “Jason”, he exclaimed when he saw me, “do you want to come to Santa Rosa this weekend?”  He was inviting me to join a group of students in the Summer Undergraduate Research Fellowship (SURF) program on their annual summer retreat to our <a href="https://www.csuci.edu/srirs/">Santa Rosa Island Research Station</a> in the <a href="https://www.nps.gov/chis/index.htm">Channel Islands National Park</a>.</p>

<p>I could not say no.  I did not say no.</p>

<p>Santa Rosa Island is a beautiful wilderness area just off the coast of California, and the campus has a research station there that I’ve visited about a dozen times over the years.  It’s always a joy to visit that station with young men and women who are excited about learning and deeply curious about some very specific topic.  It is removed from the hustle and bombast of civilization.  Instead, we enjoy communal dining, group hikes, and game nights that last well into the darkness, all unsullied by internet access.  It’s always a great time for everyone.</p>

<p>(Sure, there’s often a student that pushes it too hard on a hike and suffers the effects of dehydration or heat exhaustion.  But we all rally around them to help them recover, and all becomes well.)</p>

<p>I wouldn’t come to the Santa Rosa Island Research Station without some sort of mini-project.  This time, I brought radio gear with the goal of making some HF contacts and trying to find a minimal set-up that would allow consistent contact with people on the CSUCI campus.  The latter would form the basis of an emergency communications plan for the research station.</p>

<h2 id="my-amateur-radio-kit">My Amateur Radio Kit</h2>

<p>In my kit was a Buddipole, a Comet CX-333 dual band antenna with mast and tripod, a Yaesu FTM-991 mobile all band radio, and a small Bioenno (12 amp hour) battery.  I had considered bringing a larger battery from the campus club kit, but its bulk made me think twice.  (Narrator:  he shouldn’t have thought twice.)</p>

<p>In addition, I had three handheld transcievers:  a marine band radio and both a Kenwood TH-D72 and TH-D72.  The former was for fun (to listen to traffic between the park and boat captains as Channel Islands Packers shuttles visitors to and from the island), and the latter were for monitoring NPS radio traffic and beaconing my position via <a href="https://en.wikipedia.org/wiki/Automatic_Packet_Reporting_System">APRS</a>.</p>

<p>On island, I added an additional hand transciever to my kit:  a Baofeng issued by the research station that had been programmed to operate on NPS channels.  I was designated to be ‘Operator 958’ for traffic on that radio during my time at the station.  For activities on the East side of Santa Rosa Island, we used the <a href="https://www.radioreference.com/db/aid/4513">NPS repeater</a> on Diablo Peak.</p>

<p>(My TH-D72 has the NPS frequencies programmed into its memory, but because they are not amateur radio frequencies, I can only monitor traffic and not transmit.)</p>

<h2 id="aprs">APRS</h2>
<p>My HTs are set up to beacon APRS, one identifying me as KM6PSZ-7 (the TH-D72) and the other KM6PSZ-2 (the TH-D74).  By checking on <a href="https://aprs.fi">aprs.fi</a> as we were leaving Ventura Harbor on Saturday morning, I was able to verify that my beacon was making it into the APRS network through some nearby gateway.</p>

<p>My beaconing continued to be picked up as our boat motored to Santa Rosa until my TH-D7’s battery died.</p>

<p>I next played with APRS while sitting at the picnic table by the Santa Rosa schoolhouse.  Here I used my TH-D74.  To get my APRS beacon into the network, I had to raise my radio up high when I pressed the <code class="language-plaintext highlighter-rouge">BCON</code> button.  The route of the APRS packet is recorded as <code class="language-plaintext highlighter-rouge">[STPPTU via K6ERN*,WIDE2-1,qAR,XE2SI-10]</code>.</p>

<p>On the boat ride home, I beaconed again and set my radio to beacon every five minutes.  Shortly after Prisoners Harbor, my beacon made it into the system and its route was recorded as <code class="language-plaintext highlighter-rouge">[S4PTYS via  K6ERN*,WIDE2-1,qAO,KN6OUU-2]</code>.  At the other end of the track that’s still in aprs.fi, the last recoded beacon location had this route <code class="language-plaintext highlighter-rouge">[S4QRVT via K6ERN*,WIDE2-1,qAR,CAMRIO]</code>, which is slightly different.</p>

<p><a href="/assets/images/srirs-amateur-radio-250714-aprsmap.jpg"><img src="/assets/images/srirs-amateur-radio-250714-aprsmap-thumbnail.jpg" alt="APRS tracks of my travels" /></a></p>

<p>I’ve copied all the APRS packet routes from the aprs.fi record of my route to and from the island and added them below as an <a href="#appendix">appendix of this post</a>.</p>

<h2 id="making-vhf-contacts">Making VHF contacts</h2>

<p>On Sunday morning, while the students and two other faculty members went out on their <em>a pied</em> excursions, it was my job to sit near the bunkhouse and use the station HT to monitor the Diablo NPS repeater for traffic from the excursionists.    So I set up my Yaesu FT-991 at the picnic table outside the old school house with the dual band antenna hoisted to a great height (maybe 25-20 feet), and set out to make some contacts on the mainland.</p>

<p>I started with some Santa Barbara repeaters, and I had success with one.  Then I moved to the BOZO repeaters in Ventura County (on 147.885 with PL tone of 127.8).  I was pleased to be able to open the BOZO repeater right away, and I made a contact with someone in Thousand Oaks who reported that my signal was strong.  I then reduced my signal strength from 50W to 25W and then to 10W, and he affirmed that I was still keeping the repeater open and my signal was strong.</p>

<p>This is very good information.  It means that the Santa Rosa Island Research Station has a very simple emergency communication plan to reach the mainland.  Because campus can reach the BOZO repeaters easily, the Research Station can reach campus easily in an emergency.  So long as someone is monitoring the BOZO repeaters.</p>

<p>Happy with this, set up the HF antenna (Buddipole) without turning off my radio.  This means that my radio continued to operate without me monitoring it, which isn’t a big deal until you note that the Yaesu FT-991 has a standard 1 amp draw.  While I worked, the radio was draining the battery to nobody’s benefit.</p>

<p>Later that evening, I worked some HF bands.  At one point, trip colleagues came up to learn about the process, which was lots of fun.  I didn’t make any contact while they were listening, but we heard transmissions from New Zealand, Washington, and Texas.  My colleagues were delighted to have heard that!  At one point, though, the radio abruptly shut off.  The battery died, unexpectedly.  My operations during the day came at a cost!</p>

<p>When I went in for the night, I plugged the battery into the charger to juice it up over night.  But in the morning the Yaesu worked for a very very short time before cutting out.  The charge didn’t take.  It appears I drained the battery so much that the internal BMS might require special treatment to allow a recharge.  I need to learn more about that.</p>

<p>The battery crapping out kept me from testing transmission on 5W.</p>

<h2 id="simplex-communication-with-the-mainland">Simplex Communication with the Mainland</h2>

<p>On Monday morning, with a battery that was charged less than I knew, I set up the dual band antenna and made contact with my students who were in the campus radio room, waiting for me.  (We coordinated this via email.). before the battery crapped out on me, I was able to verify that they could receive transmissions from me at 50W, 25W, and 10W. The battery crapped out before I could make a meaningful transmission at 5W.</p>

<p>The experiment I had <em>wanted</em> to run would test simplex communication with the radio room.  Could I communicate directly with my students on simplex using VHF or UHF.  I would have used the national calling frequencies.</p>

<p>Sadly, lacking power meant the test was impossible.  Put it on the list for enxt experiments to run.</p>

<p>It’s worth noting that ‘crapping out’ is 100% deactivation of the radio.  There’s nothing gradual about the failure.  No fading.  Just going from being on one moment to off the next, and that failure would happen with the PTT was pressed (note: transmission spikes the draw on the battery).</p>

<h2 id="next-experiments">Next Experiments</h2>

<p>The next time we can get people to the island, we will test the following:</p>

<ol>
  <li>Ability to contact the radio room on simplex with a dual band antenna (e.g., Comet CX-333) and the lowest required transmission power for doing so.</li>
  <li>Repeat the above, replacing the CX-333 with a directional Yagi.</li>
  <li>Repeating the above, replacing the Yaesu with a HT radio.</li>
  <li>Exploring connectivity using the 220MHz repeater on Diablo and the 220MHz radio in the radio room.  (We’d need a 220MHz transciever on the island, and a HT that can transmit on 220MHz.)</li>
</ol>

<p><a name="appendix"></a></p>
<h3 id="appendix--aprs-paths">Appendix:  APRS Paths</h3>

<p>Here are the APRS paths on the route from the harbor to the island.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[STQSPV via K6ERN*,WIDE2-1,qAR,CAMRIO]
[STQQWQ via K6ERN*,WIDE2-1,qAR,CAMRIO]
[STPXVQ via K6ERN*,WIDE2-1,qAR,CAMRIO]
[STPVVX via K6ERN*,WIDE2-1,qAR,CAMRIO]
[STPUUR via K6ERN*,WIDE2-1,qAR,CAMRIO]
[STPUQV via K6ERN*,WIDE2-1,qAR,CAMRIO]
[STPPTU via K6ERN*,WIDE2-1,qAR,XE2SI-10]
</code></pre></div></div>

<p>Here are the APRS paths on the route from the island to the mainland.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[STPPTU via K6ERN*,WIDE2-1,qAR,XE2SI-10]
[S4PPYP via K6SYV-10,WIDE1*,WIDE2-1,qAO,AI6NE-1]
[S4PSPX via K6SYV-10,WIDE1*,WIDE2-1,qAR,KF6NYM-15]
[S4PTWY via K6SYV-10,WIDE1*,WIDE2-1,qAR,KF6NYM-15]
[S4PTYQ via K6SYV-10,WIDE1*,WIDE2-1,qAR,K7AZ-11]
[S4PTUX via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PTRT via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PTTS via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PTUX via K6SYV-10,WIDE1*,WIDE2-1,qAR,KF6NYM-15]
[S4PTRP via K6SYV-10,WIDE1*,WIDE2-1,qAR,KF6NYM-15]
[S4PSVT via K6ERN*,WIDE2-1,qAR,XE2SI-10]
[S4PQVS via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PQRS via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PTYS via K6ERN*,WIDE2-1,qAO,KN6OUU-2]
[S4PURY via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PVPW via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PWPT via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PXPV via K6SYV-10,WIDE1*,WIDE2-1,qAR,KF6NYM-15]
[S4PYQW via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4PYYQ via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4QPYQ via K6ERN*,WIDE2-1,qAR,CAMRIO]
[S4QRVT via K6ERN*,WIDE2-1,qAR,CAMRIO]
</code></pre></div></div>

<p>Knowing the route that APRS beacons travel when on the island will help us understand efficient ways to use APRS on the island (<em>e.g.</em>, how much power do we need to use while beaconing).</p>]]></content><author><name>jason</name></author><category term="amateur-radio" /><category term="santa-rosa-island" /><category term="undergraduate-research" /><summary type="html"><![CDATA[This post is an update on some amateur radio work I did at the Santa Rosa Island Research Station in July 2025. I’ll talk about my attempts to reach the mainland on VHF and my use of APRS.]]></summary></entry><entry><title type="html">Sorting Email using Keyboard Maestro</title><link href="http://www.jasonemiller.org/2025/07/10/move-mail-KM.html" rel="alternate" type="text/html" title="Sorting Email using Keyboard Maestro" /><published>2025-07-10T00:00:00+00:00</published><updated>2025-07-10T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/07/10/move-mail-KM</id><content type="html" xml:base="http://www.jasonemiller.org/2025/07/10/move-mail-KM.html"><![CDATA[<p>I get lots of email.  It will always be an unorganized mess.  What I want is that mess to be outside my Inbox.  It would help me to have a semi-automated way to move messages around to minimize the mess.</p>

<p>One app I have close at hand at all times, but don’t use nearly as much as I could or shoud, is <a href="https://www.keyboardmaestro.com/main/">Keyboard Masetro</a>.  I knew it should be able to help me.</p>

<p>A Google search on the topic turned up <a href="https://www.letstalk-tech.com/how-to-use-keyboard-maestro-to-archive-email-in-mail-app/">this web page</a>.  It has eroded a bit over time (<em>i.e.</em>, lost its code block), but there was enough there for me to get it to work.</p>

<p>The gist to the applescript in the example was lost to time, but the author had a screenshot that showed the whole thing.  Note that in this example, I’m moving a message to the <code class="language-plaintext highlighter-rouge">Archive</code> mailbox that sits inside the <code class="language-plaintext highlighter-rouge">Archive1</code> folder in my <code class="language-plaintext highlighter-rouge">Exchange</code> account.</p>

<p>First, add a <code class="language-plaintext highlighter-rouge">Macro Group</code>  so KM gives you a palette of Mail folders to which you can move a selection of messages.  Type ⇧⌘N while in the <code class="language-plaintext highlighter-rouge">Group</code> column of KM or clock on the <code class="language-plaintext highlighter-rouge">+</code> at the bottom of the column.  This will open a pan on the right end of the KM window.</p>

<p>We want the palette only available in the Mail app, so use the pull-down list to select <code class="language-plaintext highlighter-rouge">Available in these applications</code> and use the green <code class="language-plaintext highlighter-rouge">+</code> button to add the Mail app.  The Mail app should be in the list of applications by default.</p>

<p>In the next pull-down list, select <code class="language-plaintext highlighter-rouge">Available in all windows</code>.</p>

<p>In the third pull-down list, select <code class="language-plaintext highlighter-rouge">Show a palette for one action when:</code> and indicate that you want to use a hotkey.  In this case I use ⇧⌥A.</p>

<p>We are ready to populate this group with one macro for each type of move we want to make.</p>

<p>Press ⌘N (or click the + at the bottom of the middle pane) to create a new macro.  It will appear in the second pane.  Give it a name.</p>

<p>The author gives some good tips on how to name the macros in this group.</p>

<blockquote>
  <p>Note that the name you choose is important since Keyboard Maestro will sort your macros in alphabetical order. Fortunately, there is a small trick that will allow you to manually sort your actions. By simply prefixing the name with 2 digits and a closing bracket such as 00), Keyboard Maestro will hide the numbers, but still use them to sort your macros.</p>
</blockquote>

<p>With the new macro selected, clock on the green <code class="language-plaintext highlighter-rouge">+</code> in the left KM pane to add a new trigger.  I use <code class="language-plaintext highlighter-rouge">1</code> because it will be my first macro action in the palette.  Seting a trigger isn’t required because you can click on the palette elements to execute the macro you want.</p>

<p>In the pull-down list below the triggers, choose <code class="language-plaintext highlighter-rouge">Or by script</code>.  Then click on the green <code class="language-plaintext highlighter-rouge">+</code> to add a new action; choose the <code class="language-plaintext highlighter-rouge">Execute</code> folder in the first column and <code class="language-plaintext highlighter-rouge">Execute an AppleScript</code> in the second column.  A box will appear at the bottom of the KM pane - this is where the following Applescript will go. <br />
There are two pull-down selections here:  select <code class="language-plaintext highlighter-rouge">Execute Text Script</code> and <code class="language-plaintext highlighter-rouge">Display results in a notification</code>.  Now copy the Applescript.</p>

<div class="language-applescript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span><span class="w">
	</span><span class="k">tell</span><span class="w"> </span><span class="nb">application</span><span class="w"> </span><span class="s2">"Mail"</span><span class="w">
		</span><span class="k">set</span><span class="w"> </span><span class="nv">msgs</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">selection</span><span class="w">
		</span><span class="k">if</span><span class="w"> </span><span class="nv">length</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">msgs</span><span class="w"> </span><span class="ow">is not</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">then</span><span class="w">
			</span><span class="k">repeat</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">msg</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">msgs</span><span class="w">
				</span><span class="k">try</span><span class="w">
					</span><span class="nv">move</span><span class="w"> </span><span class="nv">msg</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="nv">mailbox</span><span class="w"> </span><span class="s2">"Archive"</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="nv">mailbox</span><span class="w"> </span><span class="s2">"Archive1"</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">account</span><span class="w"> </span><span class="s2">"Exchange"</span><span class="w">
				</span><span class="nb">on</span><span class="w"> </span><span class="k">error</span><span class="w"> </span><span class="nv">errmsg</span><span class="w">
					</span><span class="nb">return</span><span class="w"> </span><span class="nv">errmsg</span><span class="w">
				</span><span class="k">end</span><span class="w"> </span><span class="k">try</span><span class="w">
			</span><span class="k">end</span><span class="w"> </span><span class="k">repeat</span><span class="w">
			</span><span class="nb">return</span><span class="w"> </span><span class="s2">"Moved"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="nv">length</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nv">msgs</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="s2">" messages to Archive subfolder of Archive1 folder in Exchange account."</span><span class="w">
		</span><span class="k">else</span><span class="w">
			</span><span class="nb">return</span><span class="w"> </span><span class="s2">"Please select a message or messages."</span><span class="w">
		</span><span class="k">end</span><span class="w"> </span><span class="k">if</span><span class="w">
	</span><span class="k">end</span><span class="w"> </span><span class="k">tell</span><span class="w">
</span><span class="k">on</span> <span class="k">error</span><span class="w"> </span><span class="nv">errmsg</span><span class="w">
	</span><span class="nb">return</span><span class="w"> </span><span class="nv">errmsg</span><span class="w">
</span><span class="k">end</span><span class="w"> </span><span class="k">try</span><span class="w">
</span></code></pre></div></div>
<p>That’s it.  For each type of move, make a different macro action, revising the line <code class="language-plaintext highlighter-rouge">move msg to mailbox "Archive" in mailbox "Archive1" of account "Exchange"</code> to reflect the mailbox destination of choice.</p>

<!--
SYNTAX FOR IMAGES
* use services to create JPG and to create thumbnail that is 720px wide

[![ALT-TEXT](/assets/images/filename-thumbnail.jpg)](/assets/images/filename.jpg)
-->

<!--
SYNTAX FOR VIDEO
* convert MOV to mp4 using VLC

<video width="480" height="320" controls="controls">
  <source src="/assets/media/filename.m4v" type="video/mp4">
</video>
-->]]></content><author><name>Jason</name></author><category term="computer" /><category term="mail" /><category term="keyboard-maestro" /><category term="productivity" /><summary type="html"><![CDATA[I get lots of email. It will always be an unorganized mess. What I want is that mess to be outside my Inbox. It would help me to have a semi-automated way to move messages around to minimize the mess.]]></summary></entry><entry><title type="html">Getting the Arduino Feather RP2040 RFM96 Running</title><link href="http://www.jasonemiller.org/2025/07/07/rp2040rfm96.html" rel="alternate" type="text/html" title="Getting the Arduino Feather RP2040 RFM96 Running" /><published>2025-07-07T00:00:00+00:00</published><updated>2025-07-07T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/07/07/rp2040rfm96</id><content type="html" xml:base="http://www.jasonemiller.org/2025/07/07/rp2040rfm96.html"><![CDATA[<p>Getting Arduino Feather RP2040 RFM96 to work with Arduino IDE on MacOS with the Radiohead libraries.</p>

<h2 id="step-1--get-the-radiohead-libraries">STEP 1:  Get the RadioHead libraries</h2>

<p>Download the Adafruit fork of the <a href="https://learn.adafruit.com/feather-rp2040-rfm69/using-the-rfm69-radio#radiohead-library-example-2328977">Radiohead libraries</a>.  This library is recommended by Adafruit.</p>

<p>Rename the downloaded, unzipped folder, as <code class="language-plaintext highlighter-rouge">Radiohead</code>.  Copy the renamed folder to your Arduino ‘sketches’ folder.  (On MacOS, this would go in <code class="language-plaintext highlighter-rouge">\User\Documents\Arduino\libraries\</code>.  On a Windows machine, it is in the <code class="language-plaintext highlighter-rouge">Documents</code> folder in the user’s home directory.)</p>

<h2 id="step-2--install-board">STEP 2:  Install Board</h2>

<p>The following reflects the instructions <a href="https://learn.adafruit.com/feather-rp2040-rfm69/arduino-ide-setup">here</a>.</p>

<p>In the Arduino IDE, go to the Settings selection in the Files menu.  A dialog box ill open up.  At the bottom of the list of items in the box is a field for <code class="language-plaintext highlighter-rouge">Additional board Managers URLs</code>.  Put the following in that field:</p>

<p>https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json</p>

<p>Click <code class="language-plaintext highlighter-rouge">OK</code> to close the settings window.  In the Arduindo IDE, click on <code class="language-plaintext highlighter-rouge">Tools&gt;Boards&gt;Boards Manager</code>.  If you’ve already selected a board in the Board Manager, the name of that board might appear after <code class="language-plaintext highlighter-rouge">Boards</code> in the menu.</p>

<p>This will open the Boards Manager, a left sidebar in the Arduino IDE window.  Search for RP2040 and select <code class="language-plaintext highlighter-rouge">Raspberry Pi Pico</code>.  (There might be <code class="language-plaintext highlighter-rouge">/RP2040' ending that item.)  Click the </code>Install` button to install the board library.</p>

<p>Close the Board Manager, if you like.</p>

<p>In <code class="language-plaintext highlighter-rouge">Tools &gt; Boards</code>, select the <code class="language-plaintext highlighter-rouge">Raspberry Pi RP2040 Boards</code> menu item, which will open a submenu; select <code class="language-plaintext highlighter-rouge">Adafruit RP2040 RFM</code> from the submenu list.</p>

<h2 id="step-3--there-is-no-step-3">STEP 3:  There is no step 3.</h2>

<!--
SYNTAX FOR IMAGES
* use services to create JPG and to create thumbnail that is 720px wide

[![ALT-TEXT](/assets/images/filename-thumbnail.jpg)](/assets/images/filename.jpg)
-->

<!--
SYNTAX FOR VIDEO
* convert MOV to mp4 using VLC

<video width="480" height="320" controls="controls">
  <source src="/assets/media/filename.m4v" type="video/mp4">
</video>
-->]]></content><author><name>Jason</name></author><category term="radio" /><summary type="html"><![CDATA[Getting Arduino Feather RP2040 RFM96 to work with Arduino IDE on MacOS with the Radiohead libraries.]]></summary></entry><entry><title type="html">Share your study progress in the HamStudy app</title><link href="http://www.jasonemiller.org/2025/05/05/share-hamstudy-progress.html" rel="alternate" type="text/html" title="Share your study progress in the HamStudy app" /><published>2025-05-05T00:00:00+00:00</published><updated>2025-05-05T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/05/05/share-hamstudy-progress</id><content type="html" xml:base="http://www.jasonemiller.org/2025/05/05/share-hamstudy-progress.html"><![CDATA[<p>I was today days old when I learned that you don’t have to study for an amateur radio license by yourself.  HamStudy has the capability to invite other people on your preparation journey by sharing with them your study progress.</p>

<p>Here’s how you do it.</p>

<p>In the app, click on the profile icon in near the top right of the display.  This opens a sharing screen.</p>

<p><a href="/assets/images/hamstudyapp-main.PNG"><img src="/assets/images/hamstudyapp-main.PNG" alt="Sharing screen icon circled in red" /></a></p>

<p>The sharing screen allows you to input the username of others who have shared their progress with you.  You can also input the username of those whom you want to share your progress.</p>

<p><a href="/assets/images/hamstudyapp-sharing.PNG"><img src="/assets/images/hamstudyapp-sharing.PNG" alt="The two fields in the sharing page" /></a></p>

<p>Use this functionality to get support from a Coach like a faculty advisor to the club or another student who has taken and passed the exam.  Or, connect with others who are preparing for an exam with you.  Make it a ‘progress contest’!</p>

<p>NOTE:  you’ll need to know the HamStudy username of the person you’re connecting with to do this.</p>

<!--
SYNTAX FOR IMAGES
* use services to create JPG and to create thumbnail that is 720px wide

[![ALT-TEXT](/assets/images/filename-thumbnail.jpg)](/assets/images/filename.jpg)
-->

<!--
SYNTAX FOR VIDEO
* convert MOV to mp4 using VLC

<video width="480" height="320" controls="controls">
  <source src="/assets/media/filename.m4v" type="video/mp4">
</video>
-->]]></content><author><name>Jason</name></author><category term="amateur-radio" /><summary type="html"><![CDATA[I was today days old when I learned that you don’t have to study for an amateur radio license by yourself. HamStudy has the capability to invite other people on your preparation journey by sharing with them your study progress.]]></summary></entry><entry><title type="html">Regular Expressions and Preparing for the Amateur Extra Class Amateur Radio License Exam</title><link href="http://www.jasonemiller.org/2025/04/19/regex-ham-extra-question-pool.html" rel="alternate" type="text/html" title="Regular Expressions and Preparing for the Amateur Extra Class Amateur Radio License Exam" /><published>2025-04-19T00:00:00+00:00</published><updated>2025-04-19T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/04/19/regex-ham-extra-question-pool</id><content type="html" xml:base="http://www.jasonemiller.org/2025/04/19/regex-ham-extra-question-pool.html"><![CDATA[<p>One of the best ways to prepare to take and pass an FCC amateur radio licensing exam is to get the question pool and familiarize yourselve with the questions and their answers, ignoring the distractifiers.  Of couse, if you want to understand the reasons why the correct answer is correct, that’s a bonus.  In my experience, though, you’ll learn the ‘why’ more effectively through operating and doing amateur radio.  It’s not necessary for passing licensing exams.</p>

<p>To that end, I’ve created study guides for exam of the three exams.  Here they are:</p>

<ol>
  <li><a href="/assets/docs/techpool-modified-230303.pdf">Tech Exam</a></li>
  <li><a href="/assets/docs/genpool-modified-240607.pdf">General Exam</a></li>
  <li><a href="/assets/docs/extrapool-formatted.pdf">Extra Exam</a></li>
</ol>

<p>In each of these, for each question, I put the correct answer in bold face.  This allows the learner to ignore the distractifiers completely if they want to.</p>

<p>In the hope that the effort will pay off in time (if I create enough of these documents over the years), I scripted the process of reformatting into Markdown using python.  You can see a previous post on this topic <a href="https://www.jasonemiller.org/2021/07/25/regex-ham-general-question-pool.html">here</a>.</p>

<h2 id="reformatting-with-python">Reformatting with Python</h2>

<p>Here’s the code I used for the Extra exam question pool.  Note that the reformatting was a but too sophisticated for me to do on my own, so I called on some help from ChatGPT.  Each of its sugestions was tested by hand before including in the larger script.</p>

<pre><code class="language-python=">#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat April 19 2025

@author: Jason Miller (KM6PSZ) assisted by ChatGPT
"""

import re, os, sys

# -----------------------------------
# input text from Amateur Extra question pool

os.chdir('/Users/jason.miller/Library/CloudStorage/OneDrive-CSUCI/DropboxData/unit - Mathematics Department/_amateur radio/FCCextraexam2028/')
input = open("extrapool28-modified.txt","r", encoding="latin-1")
output = open("extrapool28-modified250419-00.md", "w")
input_str=input.read()

# -----------------------------------
# Remove '~~' that separates questions and as markdown would create strikeout text
rm_seps=re.compile(r'(\s*)(~~)')
input_str = rm_seps.sub(r"",input_str)

# -----------------------------------
# Reformat title line
in_title=re.compile(r'(\s*)(2024-2028 Extra Class.*)')
input_str = in_title.sub(r"\n\n# \2",input_str)
 
# -----------------------------------
# Reformat section lines
in_section=re.compile(r'^(SUBELEMENT\sE\d)',re.MULTILINE|re.DOTALL)
input_str = in_section.sub(r"## \1",input_str)

# Replace [ and ] with \[ and \] on lines starting with ##
input_str = re.sub(r'^(##.*?)(\[|\])', r'\1\\\2', input_str, flags=re.MULTILINE)


# -----------------------------------
# Reformat subsection lines

# function to put text of a subclass label on a single line (removing newlines)
def remove_linebreaks(text):
	def replacer(match):
		block=match.group(0)
		block_no_breaks=block.replace('\n','')
		return block_no_breaks
	return re.sub(r'\b(E[0-9][A-Z]\b)(.+\n)?',replacer,text)
# put label on a single line of text

input_str =remove_linebreaks(input_str)

# add markdown formatting
in_subsection=re.compile(r'\b(E[0-9][A-Z]\b)',re.MULTILINE|re.DOTALL)
input_str = in_subsection.sub(r"### \1",input_str)


# -----------------------------
# On a line that starts with an 'E', replace question text (from ']' to '?') with a one-line version
def single_line_question(match):
    prefix = match.group(1)  # The E-line through the closing ]
    question = match.group(2)
    one_line = ' '.join(question.split())
    return f"{prefix}\n{one_line}?"

# Apply the regex
input_str = re.sub(r'^(E[^\n]*\])\s*((?:.|\n)*?)\?', single_line_question, input_str, flags=re.MULTILINE | re.DOTALL)

# -----------------------------
# Reformat each answer to a single line
def flatten_answers(text):
    lines = text.splitlines()
    output = []
    buffer = []
    current_label = None

    for line in lines:
        if re.match(r'^[A-D]\.\s', line):
            # Flush previous answer
            if buffer:
                output.append(current_label + ' '.join(buffer))
                buffer = []
            current_label, rest = line[:3], line[3:].strip()
            buffer.append(rest)
        elif current_label and not re.match(r'^(E|#|[A-D]\.\s|\s*$)', line):
            buffer.append(line.strip())
        else:
            if buffer:
                output.append(current_label + ' '.join(buffer))
                buffer = []
                current_label = None
            output.append(line)

    # Final flush
    if buffer:
        output.append(current_label + ' '.join(buffer))

    return '\n'.join(output)

input_str=flatten_answers(input_str)

# -----------------------------------
# Reformat question and answer lines

def highlight_correct_answer(text):
    # Match each question block starting with 'E' and capture everything until the next 'E' or end of text
    pattern = r'^(E[^\n]+?)\(([A-D])\)(.*?)((?=^E|\Z))'
    
    def bold_correct_choice(match):
        header = match.group(1).strip()
        correct_letter = match.group(2)
        rest = match.group(3)
        # Bold the correct answer choice
        rest = re.sub(rf'(^|\n)({correct_letter}\.\s[^\n]*)', r'\1**\2**', rest)
        return f"{header}({correct_letter}){rest}"

    return re.sub(pattern, bold_correct_choice, text, flags=re.MULTILINE | re.DOTALL)

input_str=highlight_correct_answer(input_str)

# -----------------------------------
# output text

#output.write(new_closebrackets)
output.write(input_str)
input.close()
output.close()


#
# NOTE:  images need to be placed by hand
#
# This is the markdown code that can be put in the Markdown output before the first question that references 
# each image.  This text is for Figure E9-3.
#
# ![Figure E9-3](./e4_2024-svgs/E9-3.svg "Figure E9-3")
# &lt;!-- &lt;img src="./e4_2024-svgs/E9-3.svg" alt="isolated" width="150"/&gt;--&gt;
#
</code></pre>

<p>This script does <em>almost</em> all the reformatting that needs to happen.  But you need to add the images into the markdown document by hand.</p>]]></content><author><name>Jason</name></author><category term="amateur-radio" /><category term="script" /><category term="maker" /><category term="coding" /><category term="python" /><category term="regex" /><category term="markdown" /><category term="ham" /><summary type="html"><![CDATA[One of the best ways to prepare to take and pass an FCC amateur radio licensing exam is to get the question pool and familiarize yourselve with the questions and their answers, ignoring the distractifiers. Of couse, if you want to understand the reasons why the correct answer is correct, that’s a bonus. In my experience, though, you’ll learn the ‘why’ more effectively through operating and doing amateur radio. It’s not necessary for passing licensing exams.]]></summary></entry><entry><title type="html">Automating the creation of a two-page weekly calendar</title><link href="http://www.jasonemiller.org/2025/02/15/weeklycalendar.html" rel="alternate" type="text/html" title="Automating the creation of a two-page weekly calendar" /><published>2025-02-15T00:00:00+00:00</published><updated>2025-02-15T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/02/15/weeklycalendar</id><content type="html" xml:base="http://www.jasonemiller.org/2025/02/15/weeklycalendar.html"><![CDATA[<p>The Getting Things Done (TM) ecosystem has a rich marketplace of doodads and dawdles that help support their productivity regime.  Last year, I paid them $19 for a <a href="https://store.gettingthingsdone.com/product/2025-gtd-calendar/">PDF that consisted of 52+ two-sided sheets</a>, each a week-at-a-glance in the style of GTD.  Each page has the page’s date range displayed at the top left, two mini-month calendars in the top right, one for last month and one for the following month, and then space for you to record what’s going to happen on each of the days, again in GTD style.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="/assets/images/image-GTDsheettop.png" alt="image" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">A picture of the top of the GTD calendar page.</td>
    </tr>
  </tbody>
</table>

<p>Last year, I found those pages useful as I tried to find a consistent way of organizing my daily and weekly work.  From time to time, though, I’d look at these two-page, GTD week-at-a-glance sheets and asked myself if I could use my meager coding skills to save twenty bucks.	Could I do it in LaTeX?  Using AppleScript?  In HTML with some CSS and PHP?  Could I do it for less than twenty bucks of my time?</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center"><img src="/assets/images/image-is_it_worth_the_time.png" alt="https://xkcd.com/1205/" /></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">XKCD Comic ‘Is it Worth the Time?’</td>
    </tr>
  </tbody>
</table>

<p>When it came to springing $19 for a second year of these pages, my thoughts again turned to rolling my own calendar.  To my surprise, the tools for making these week-based two-page calendars is actually baked into Apple’s spreadsheet app <a href="https://www.apple.com/in/numbers/">Numbers</a>.  In this post, I’ll describe how I used Numbers to create a semi-automated process for generating my two-page week calendars.</p>

<p>My description will be organized according to the parts of the pages:  mini-calendars, the recording spaces for the days, and the date range label at the top of the first page.  I’ll start with some comments on a frameworks that supports all these elements.</p>

<p>Note that this write-up goes into some detail about the functions I wrote for this project.  If you’re only interested in the spreadsheet itself, you can download it <a href="/assets/docs/Weekly-calendar-250210v3.numbers">HERE</a>.</p>

<h2 id="organization">Organization</h2>

<p>My spreadsheet is organized into two sheets.  The first is for settings that will determine the contents of the two-page calendars.  The second is for the output the I will print.  The parameter values on the settings sheet determine how the dates on the two-page calendar on the second sheet will appear.</p>

<p>At the start of the settings sheet, we have three tables that specify the following aspects of the calendar we want:</p>

<ul>
  <li>The year by typing a four digit number</li>
  <li>The month by selecting from a pop-up/pull-down list, and</li>
  <li>The week (first, second, etc.) by selecting from a pop-up/pull-down list.</li>
</ul>

<p>The pop-up/pull-down list is a formatting option for a cell’s content type.  (Listed in the same menu that allows you to specify a date, or text, or numeric content types, for example.) When you select the pop-up/pull-down format, you’re given a way to populate the list of options that will appear in the list.</p>

<p>It’s interesting to note that the <a href="/assets/docs/apple-numbers-calendar-template.numbers">Numbers template</a> I pulled this from did not have a separate sheet for settings.  Instead, the template put the settings parameters into rows (or columns) of the output tables themselves and then HID THOSE ROWS OR COLUMNS from view.  Sneaky, right?  Since I am interested in creating calendars for printing and not for electronic use, I prefer using a separate sheet for settings so the settings are visible to the user and the output sheet is clean with nothing hidden.</p>

<p>The next table on my Settings sheet captures the user settings from the previous tables for year (cell A1), month (cell B2), and week (cell B4) and calculates some auxiliary information from them.  I call this the Dashboard table.  First, it calculates which day of the week the first day of the month is.</p>

<pre><code class="language-Excel">=DAYNAME(VLOOKUP(B2,'Table for MINI-CALENDAR computations'::D3:E14,2)&amp;"/1/"&amp;A1)
</code></pre>

<p>Here the <code class="language-plaintext highlighter-rouge">Table for MINI-CALENDAR computations</code> has regions to assist in calculations.  In the above formula, we use a table to gives each month an ordinal value from 1 to 12.</p>

<p>Second, the Dashboard table includes a calculation for the date of the first Monday of the month (cell D3).  This calculation depends on whether the first day of the month is a weekday or on the weekend.  In the former case, we just step backward to the of that week Monday.  If the latter case, we step forward to the first Monday in the month.</p>

<pre><code class="language-excel">=IF(VLOOKUP(D2,Days of the Week::A1:B7,2)&lt;6,DATE(A1,VLOOKUP(B2,'Table for MINI-CALENDAR computations'::D3:E14,2),1)−DURATION(0,VLOOKUP(D2,Days of the Week::A1:B7,2,close-match)−1),DATE(A1,VLOOKUP(B2,'Table for MINI-CALENDAR computations'::D3:E14,2),1)+8−VLOOKUP(D2,Days of the Week::A1:B7,2))
</code></pre>

<p>Here the <code class="language-plaintext highlighter-rouge">Days of the Week</code> table in this formula gives each day an ordinal value from 1 to 7.</p>

<p>We use the result of this formula (cell D3) as the basis to find the Monday of the week we want to start our calendar.</p>

<p>To find the date of the Monday we want (cell D4), we start from the first week and use the <code class="language-plaintext highlighter-rouge">DURATION()</code> function to step forward the number of additional weeks we want</p>

<pre><code class="language-excel">=D3+DURATION(VLOOKUP(B4,Ordinals::A1:B5,2)−1)
</code></pre>

<p>Here the ‘Ordinals’ table in this formula gives each ordinal (<em>i.e.</em>, ‘First’, ‘Second’, <em>etc.</em>) an ordinal value from 1 to 5.  The ordinals refer to which week of the month we’ve selected.</p>

<p>These computations support the work to populate the week-long calendar.</p>

<h2 id="mini-calendars">Mini-Calendars</h2>

<p>Also on the setting sheet, in the <code class="language-plaintext highlighter-rouge">Table for MINI-CALENDAR computations</code> table, is a region that calculates the start date and end date of the month of interest and for the two months on either side of it.  The computation of the current month’s start day (in cell B4) uses the following formula</p>

<pre><code class="language-excel">DATE(B2,LOOKUP(B1,D,E),1)
</code></pre>

<p>where B2 is the year, the <code class="language-plaintext highlighter-rouge">LOOKUP()</code> finds a numerical representation of the relevant month, and the <code class="language-plaintext highlighter-rouge">1</code> represents the first day of the month.  The the numerical representation of the day is calculated using the formula</p>

<pre><code class="language-excel">WEEKDAY(B4, $B$3)
</code></pre>

<p>(The second argument in the formula determines whether a week starts on a Sunday or a Monday.  This parameter is n our Settings sheet at B3.)  The dates for the prior and subsequent months are used to fill out the mini-calendars.</p>

<p>To fill in the first row of the mini-calendar with day numbers, we use two cute tricks.  First, to fill in the number that goes in the Sunday column of the first row, we take the month’s start date and add to it “one minus the numerical representation of the month’s start day”.  This</p>

<pre><code class="language-excel">='Table for MINI-CALENDAR computations'::$B$8+DURATION(0,COLUMN()−'Table for MINI-CALENDAR computations'::$B$9)  
</code></pre>

<p>This command will yield a data of the form ‘MM/DD/YYYY’, but we only want the day numbers.  It turns out that you can (and should) format the cell data type to be <code class="language-plaintext highlighter-rouge">DAY ONLY</code>.  This will give you the day’s number in your cell.  Put the above formula in each of the boxes in the first row of your mini-calendar, and you’ll get the proper calendar numbers.  However, some might be numbers from the previous month.</p>

<p>To get rid of those, we create a custom conditional format for all rows in the mini-calendar (even though the custom format only needs to used in the first, fifth, and sixth rows of the mini-calendar). The first rule should be “if the date is before” the mini-calendar month’s start date (which can be referenced in the settings sheet) “then” set your font color to the custom color of white (or whatever you chose your calendar’s background color to be).  This will make the days from the previous month invisible.  The second rule is analogous, instead using “if the date is after” and referencing the last day of the month (as found in the settings sheet).</p>

<p>To fill in the rest of the rows of the mini-calendar, we fill them all in with the relative command</p>

<pre><code class="language-excel">= (cell directly above in the previous row) + DURATION(1)
</code></pre>

<p>Which adds a week to the date in the references cell.  This completes your first mini-calendar.</p>

<p>The second mini-calendar is completed in an analogous way, instead referring to the start and end dates of the month following your month of interest and the numeric start date of the first day of the month.</p>

<p>Note that the mini-calendar should be built using six rows for the numbers, as this will account for all the possible ways of distributing thirty-one consecutive days no matter when the month starts.</p>

<h2 id="two-page-calendar">Two-Page Calendar</h2>

<p>With all the previous calculations, this part of the document is easy.  Every calendar will start on a Monday and end on a Sunday, so placing those static labels is easy.  And the number for the first day has already been calculated in the settings sheet; we reference the date of the first Monday that we calculated.</p>

<p>Subsequent days are calculated by adding <code class="language-plaintext highlighter-rouge">DURATION(0,1)</code> to each subsequent day.  Easy peasy.</p>

<p>The last thing to add to the two-page calendar is a label at the top of the page that declares the start and end dates on the page.  We did this using a three row, single column table.  In the first row, we put</p>

<pre><code class="language-excel">=Dashboard::D5&amp;" "&amp;IF(Dashboard::E5="September",LEFT(Dashboard::E5,4),LEFT(Dashboard::E5,3))
</code></pre>

<p>Which prints the starting day number and a three- or four-letter abbreviation for the month.  In the third row of this small table we put</p>

<pre><code class="language-excel">=Dashboard::D6&amp;" "&amp;IF(Dashboard::E6="September",LEFT(Dashboard::E6,4),LEFT(Dashboard::E6,3))
</code></pre>

<p>Which prints the ending day number of the week and a three- or hour-letter abbreviation for the month.  In the second row, we put the word ‘to’.</p>

<h2 id="conclusion">Conclusion</h2>

<p>This is how you build a two-page week-long calendar.  But varying the parameter values on the Settings sheet, you can create a Monday-thru-Sunday sheet for any week in any year.</p>

<p>Since I’m always thinking about ways to automate repetitive tasks, the next project I will consider is an Applescript that will take as inputs a start date and an end date and then outputs the range of two-page weekly calendars as PDFs starting with the week that contains the first date and ending with the week that contains the last date.  If I write that script, I’ll share it here.</p>]]></content><author><name>jason</name></author><category term="apple" /><category term="scripts" /><summary type="html"><![CDATA[The Getting Things Done (TM) ecosystem has a rich marketplace of doodads and dawdles that help support their productivity regime. Last year, I paid them $19 for a PDF that consisted of 52+ two-sided sheets, each a week-at-a-glance in the style of GTD. Each page has the page’s date range displayed at the top left, two mini-month calendars in the top right, one for last month and one for the following month, and then space for you to record what’s going to happen on each of the days, again in GTD style.]]></summary></entry><entry><title type="html">COMING SOON - the Innovation Bridge</title><link href="http://www.jasonemiller.org/2025/01/23/innovationbridge.html" rel="alternate" type="text/html" title="COMING SOON - the Innovation Bridge" /><published>2025-01-23T00:00:00+00:00</published><updated>2025-01-23T00:00:00+00:00</updated><id>http://www.jasonemiller.org/2025/01/23/innovationbridge</id><content type="html" xml:base="http://www.jasonemiller.org/2025/01/23/innovationbridge.html"><![CDATA[<p>In December, President Yao approved the creation of the <strong>Innovation Bridge</strong>, a new applied research institute at the University.  The Innovation Bridge is a faculty-led effort designed to foster sustainable and robust collaboration between the University and Navy commands at Naval Base Ventura County (NBVC).  Acting as a portal, The Innovation Bridge will facilitate and catalyze partnerships, providing a structured pathway for engagement.</p>

<p>During our first year, we will focus on a few specific efforts that include</p>

<ul>
  <li>
    <p>promoting academic engagement with Fathomwerx programming such as <a href="https://antx.org/coastal-trident/">Coastal Trident</a>, the <a href="https://www.fathomwerx.com/fathomwerx-summit">Fathomwerx Summit</a>, and <a href="https://www.diu.mil/replicator">Project R</a>,</p>
  </li>
  <li>
    <p>facilitating participation in command-specific programming such as the <a href="http://onroutreach-summer-faculty-research-sabbatical.com">Navy Summer Faculty Research  and Sabbatical Leave Program</a> and summer student <a href="https://www.navalsteminterns.us/nreip/">internships</a>, and</p>
  </li>
  <li>
    <p>creating opportunities for academia to interact with Navy engineers through Fathomwerx programming.</p>
  </li>
</ul>

<p>The Innovation Bridge will work to expand Fathomwerx programming beyond just Cal State Channel Islands to all regional Universities in San Luis Obispo County, Santa Barbara County, Ventura County, and Kern County.</p>

<p>At another level, the Innovation Bridge will support economic development activity in the region by leveraging our knowledge of unique regional assets (including Naval assets) that enhance the region’s competitiveness for industry and that boost the region’s ability to prepare the its workforce to meet industry needs.  Our work in this area will include</p>

<ul>
  <li>
    <p>inviting regional professional organizations to schedule member meetings on the University campus,</p>
  </li>
  <li>
    <p>supporting efforts to attract autonomous air mobility companies to the region,</p>
  </li>
  <li>
    <p>convening stakeholder conversations about industry challenges and how we can leverage loccal talent and creativity to solve them, and</p>
  </li>
  <li>
    <p>working with industry and education providers to identify and support upskilling programs for students and members of our workforce.</p>
  </li>
</ul>

<p>Work of the Innovation Bridge has begun, and we expect a public launch of the Innovation Bridge at the Fathomwerx Summit on October 15th, 2025.  If you want to stay informed about the work of the Innovation Bridge, subscribe to our notification email list by clicking <a href="mailto:jason.miller@csuci.edu?subject=subscribe innovation-bridge-news" target="_blank">here</a>.  (This low tech sends me an email, and I will add you as a subscriber.  Soon, we’ll have a hands-free way for people to subscribe!).  This low-volume email list will let you know about upcoming Innovation Bridge activities before they happen and will share with you reports on recent work.</p>

<p>The Innovation Bridge is going to be an exciting addition to University efforts to connect with the region as a partner and facilitator.  If you have thoughts on what the Innovation Bridge can do for and with the community, send me <a href="mailto:jason.miller@csuci.edu?subject=What the Innovation Bridge can do for the community" target="_blank">an email.  I look forward to hearing from you.</a></p>

<p>Sincerely,
Jason Miller, Ph.D.
Innovation Bridge Director</p>]]></content><author><name>jason</name></author><category term="university" /><summary type="html"><![CDATA[In December, President Yao approved the creation of the Innovation Bridge, a new applied research institute at the University. The Innovation Bridge is a faculty-led effort designed to foster sustainable and robust collaboration between the University and Navy commands at Naval Base Ventura County (NBVC). Acting as a portal, The Innovation Bridge will facilitate and catalyze partnerships, providing a structured pathway for engagement.]]></summary></entry></feed>