Snow skunk
Snow skunk
One of the first dopey programs written in BASIC back in the early ’80s, converted to TI graphing calculator BASIC, and then translated to HTML for the fun of having a flashback to the good ol’ days of Viewtron and coding on the TI-99/4A and IBM PCjr circa 1983.




PROGRAM:SKYLINE
:
:© Setup Window for CE Screen
:AxesOff
:BackgroundOff
:ClrDraw
:0->Xmin
:264->Xmax
:0->Ymin
:165->Ymax
:
:Lbl MN
:Menu(“SELECT SKYLINE”,”Random City”,A,”Paris”,B,”Giza”,C,”Quit”,Q)
:
:© — OPTION A: RANDOM CITY —
:Lbl A
:ClrDraw
:© Draw Sky
:For(I,0,100)
:Pt-On(randInt(0,264),randInt(50,165),WHITE)
:End
:
:© Draw Ground
:Line(0,0,264,0,GRAY)
:
:© Draw Buildings Loop
:0->X
:While X<264
:randInt(15,40)->W
:randInt(20,120)->H
:
:© Building Outline
:Line(X,0,X,H,NAVY)
:Line(X,H,X+W,H,NAVY)
:Line(X+W,H,X+W,0,NAVY)
:
:© Windows
:For(A,X+4,X+W-4,5)
:For(B,10,H-10,8)
:If randInt(0,1)
:Pt-On(A,B,YELLOW)
:End
:End
:
:X+W->X
:End
:Goto Z
:
:© — OPTION B: PARIS —
:Lbl B
:ClrDraw
:© Grass
:Line(0,10,264,10,GREEN)
:
:© Eiffel Tower Legs
:Line(100,10,132,130,BLACK)
:Line(164,10,132,130,BLACK)
:
:© Arches and Decks
:Line(110,45,154,45,BLACK)
:Line(122,85,142,85,BLACK)
:Line(100,10,164,10,BLACK)
:
:© Spire
:Line(132,130,132,150,RED)
:
:© Moon
:Circle(30,140,10,LTBLUE)
:Goto Z
:
:© — OPTION C: GIZA —
:Lbl C
:ClrDraw
:© Sand
:Line(0,20,264,20,ORANGE)
:
:© Great Pyramid
:Line(50,20,110,100,ORANGE)
:Line(110,100,170,20,ORANGE)
:
:© Smaller Pyramid
:Line(150,20,190,70,ORANGE)
:Line(190,70,230,20,ORANGE)
:
:© Sun
:Circle(200,140,15,YELLOW)
:Goto Z
:
:© — CLEANUP —
:Lbl Z
:Text(155,5,”PRESS ENTER”)
:Pause
:ClrDraw
:Goto MN
:
:Lbl Q
:ClrDraw
:AxesOn
:Output(1,1,”Done”)
Html simulation
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>TI-Basic Skyline Widget</title>
<style>
:root {
–ti-case: #333333;
–ti-screen-bg: #f0f0f0;
–ti-screen-border: #999;
–btn-blue: #3b82f6;
–btn-gray: #4b5563;
}
body {
font-family: ‘Courier New’, Courier, monospace;
background-color: #1a1a1a;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
margin: 0;
color: white;
}
.calculator-case {
background-color: var(–ti-case);
padding: 20px;
border-radius: 20px;
box-shadow: 0 10px 25px rgba(0,0,0,0.5);
width: 100%;
max-width: 400px;
display: flex;
flex-direction: column;
gap: 15px;
}
.screen-container {
background-color: #000;
border: 4px solid #666;
border-radius: 8px;
padding: 2px;
position: relative;
}
canvas {
background-color: #000;
display: block;
width: 100%;
/* 3:2 Aspect Ratio matches standard calculator window broadly */
aspect-ratio: 264 / 165;
border-radius: 4px;
}
.screen-overlay {
position: absolute;
top: 10px;
left: 10px;
color: white;
font-size: 12px;
pointer-events: none;
text-shadow: 1px 1px 0 #000;
}
.controls {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
}
button {
padding: 12px;
border: none;
border-radius: 6px;
font-family: inherit;
font-weight: bold;
cursor: pointer;
transition: transform 0.1s, opacity 0.2s;
color: white;
font-size: 0.9rem;
}
button:active {
transform: translateY(2px);
}
.btn-city { background-color: var(–btn-blue); }
.btn-paris { background-color: #8b5cf6; }
.btn-giza { background-color: #d97706; }
.btn-clear {
grid-column: span 3;
background-color: var(–btn-gray);
margin-top: 5px;
}
.status-led {
width: 10px;
height: 10px;
background-color: #22c55e;
border-radius: 50%;
position: absolute;
top: 10px;
right: 10px;
box-shadow: 0 0 5px #22c55e;
}
</style>
</head>
<body>
<div class=”calculator-case”>
<div style=”display: flex; justify-content: space-between; align-items: center; padding: 0 5px;”>
<span style=”font-weight: bold; color: #ccc; letter-spacing: 1px;”>TI-84 Plus CE</span>
<div style=”display:flex; gap: 5px;”>
<div style=”width: 40px; height: 10px; background: #222; border-radius: 2px;”></div>
<div style=”width: 40px; height: 10px; background: #222; border-radius: 2px;”></div>
</div>
</div>
<div class=”screen-container”>
<div class=”status-led”></div>
<div class=”screen-overlay” id=”statusText”>Select Mode</div>
<canvas id=”skylineCanvas” width=”528″ height=”330″></canvas>
</div>
<div class=”controls”>
<button class=”btn-city” onclick=”drawCity()”>F1: City</button>
<button class=”btn-paris” onclick=”drawParis()”>F2: Paris</button>
<button class=”btn-giza” onclick=”drawGiza()”>F3: Giza</button>
<button class=”btn-clear” onclick=”resetScreen()”>CLEAR / MENU</button>
</div>
</div>
<script>
const canvas = document.getElementById(‘skylineCanvas’);
const ctx = canvas.getContext(‘2d’);
const statusText = document.getElementById(‘statusText’);
// Coordinate scaling to match the TI-Basic 0-264 / 0-165 coordinate system
// The canvas is defined as 528×330 (2x scale for crispness)
const SCALE_X = canvas.width / 264;
const SCALE_Y = canvas.height / 165;
// TI-Basic Colors mapped to CSS
const COLORS = {
WHITE: ‘#FFFFFF’,
GRAY: ‘#808080’,
NAVY: ‘#000080’,
YELLOW: ‘#FFFF00’,
GREEN: ‘#008000’,
BLACK: ‘#000000’,
RED: ‘#FF0000’,
LTBLUE: ‘#ADD8E6’,
ORANGE: ‘#FFA500’,
BG_NIGHT: ‘#111111’,
BG_DAY: ‘#87CEEB’
};
// Utility: Draw Line
function line(x1, y1, x2, y2, color, width = 2) {
ctx.beginPath();
// TI coords originate bottom-left usually, but standard canvas is top-left.
// We need to flip Y.
// Input Y: 0 is bottom, 165 is top.
// Canvas Y: 0 is top, 330 is bottom.
const cx1 = x1 * SCALE_X;
const cy1 = canvas.height – (y1 * SCALE_Y);
const cx2 = x2 * SCALE_X;
const cy2 = canvas.height – (y2 * SCALE_Y);
ctx.moveTo(cx1, cy1);
ctx.lineTo(cx2, cy2);
ctx.strokeStyle = color;
ctx.lineWidth = width * 2; // Thicker for visibility
ctx.stroke();
}
// Utility: Draw Point/Rect (filled)
function ptOn(x, y, color) {
const cx = x * SCALE_X;
const cy = canvas.height – (y * SCALE_Y);
ctx.fillStyle = color;
// Draw a small 4×4 pixel block to represent a “pixel” on the TI screen
ctx.fillRect(cx, cy, 4, 4);
}
// Utility: Draw Circle
function circle(x, y, r, color) {
const cx = x * SCALE_X;
const cy = canvas.height – (y * SCALE_Y);
const cr = r * SCALE_X; // Assume uniform scaling
ctx.beginPath();
ctx.arc(cx, cy, cr, 0, 2 * Math.PI);
ctx.fillStyle = color;
ctx.fill();
}
// Utility: Filled Rect (for buildings)
function fillRect(x, y, w, h, color) {
const cx = x * SCALE_X;
// Y is bottom of rect in TI logic
const cy = canvas.height – ((y + h) * SCALE_Y);
const cw = w * SCALE_X;
const ch = h * SCALE_Y;
ctx.fillStyle = color;
ctx.fillRect(cx, cy, cw, ch);
}
function clearDraw(bgColor = COLORS.BG_NIGHT) {
ctx.fillStyle = bgColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
function resetScreen() {
clearDraw(‘#000000’);
statusText.innerText = “MENU: SELECT OPTION”;
ctx.fillStyle = “white”;
ctx.font = “20px monospace”;
ctx.textAlign = “center”;
ctx.fillText(“TI-BASIC SKYLINE”, canvas.width/2, canvas.height/2 – 20);
ctx.font = “16px monospace”;
ctx.fillText(“1: Random City”, canvas.width/2, canvas.height/2 + 20);
ctx.fillText(“2: Paris”, canvas.width/2, canvas.height/2 + 50);
ctx.fillText(“3: Giza”, canvas.width/2, canvas.height/2 + 80);
}
// — OPTION A: RANDOM CITY —
function drawCity() {
clearDraw(COLORS.BG_NIGHT);
statusText.innerText = “Prgm: RUNNING…”;
// Draw Sky (Stars)
for(let i=0; i<50; i++) {
const rx = Math.floor(Math.random() * 264);
const ry = Math.floor(Math.random() * (165 – 50) + 50);
ptOn(rx, ry, COLORS.WHITE);
}
// Draw Ground
line(0, 0, 264, 0, COLORS.GRAY, 4);
// Draw Buildings Loop
let x = 0;
// Helper to prevent infinite loops if logic fails
let safety = 0;
const interval = setInterval(() => {
if (x >= 264 || safety > 50) {
clearInterval(interval);
statusText.innerText = “Done”;
return;
}
const w = Math.floor(Math.random() * (40 – 15) + 15);
const h = Math.floor(Math.random() * (120 – 20) + 20);
// Draw Building Body (Filled for HTML5 aesthetic, outlined in basic)
fillRect(x, 0, w, h, COLORS.NAVY);
// Draw Outline
line(x, 0, x, h, COLORS.WHITE, 1);
line(x, h, x+w, h, COLORS.WHITE, 1);
line(x+w, h, x+w, 0, COLORS.WHITE, 1);
// Windows
for (let a = x + 4; a < x + w – 4; a += 5) {
for (let b = 10; b < h – 10; b += 8) {
if (Math.random() > 0.5) {
ptOn(a, b, COLORS.YELLOW);
}
}
}
x += w;
safety++;
}, 100); // Slight delay for animation effect
}
// — OPTION B: PARIS —
function drawParis() {
clearDraw(‘#1a1a2e’); // Dark blue night
statusText.innerText = “Paris”;
// Grass
line(0, 10, 264, 10, COLORS.GREEN, 3);
// Eiffel Tower Legs
// Using fillPolygon for HTML5 solidity, but lines for outlines
// Left leg
line(100, 10, 132, 130, COLORS.GRAY);
// Right leg
line(164, 10, 132, 130, COLORS.GRAY);
// Arches and Decks
line(110, 45, 154, 45, COLORS.WHITE);
line(122, 85, 142, 85, COLORS.WHITE);
line(100, 10, 164, 10, COLORS.WHITE);
// Spire
line(132, 130, 132, 150, COLORS.RED);
// Moon
circle(30, 140, 10, COLORS.LTBLUE);
statusText.innerText = “Done”;
}
// — OPTION C: GIZA —
function drawGiza() {
clearDraw(COLORS.BG_DAY); // Sky blue
statusText.innerText = “Giza”;
// Sand
// Fill bottom
ctx.fillStyle = COLORS.ORANGE;
ctx.fillRect(0, canvas.height – (20 * SCALE_Y), canvas.width, 20 * SCALE_Y);
// Great Pyramid (Filled Triangle)
ctx.beginPath();
ctx.moveTo(50 * SCALE_X, canvas.height – (20 * SCALE_Y));
ctx.lineTo(110 * SCALE_X, canvas.height – (100 * SCALE_Y));
ctx.lineTo(170 * SCALE_X, canvas.height – (20 * SCALE_Y));
ctx.fillStyle = ‘#cd853f’; // Darker orange
ctx.fill();
// Outline
line(50, 20, 110, 100, ‘black’, 1);
line(110, 100, 170, 20, ‘black’, 1);
// Smaller Pyramid
ctx.beginPath();
ctx.moveTo(150 * SCALE_X, canvas.height – (20 * SCALE_Y));
ctx.lineTo(190 * SCALE_X, canvas.height – (70 * SCALE_Y));
ctx.lineTo(230 * SCALE_X, canvas.height – (20 * SCALE_Y));
ctx.fillStyle = ‘#d2691e’; // Chocolate
ctx.fill();
// Outline
line(150, 20, 190, 70, ‘black’, 1);
line(190, 70, 230, 20, ‘black’, 1);
// Sun
circle(200, 140, 15, COLORS.YELLOW);
statusText.innerText = “Done”;
}
// Initial Load
resetScreen();
</script>
</body>
</html>
https://svonberg.org/wp-content/uploads/2026/02/randomworlds.html
It’s my birthday today, which always lands a little quieter than the calendar suggests. No balloons popping, no trumpet fanfare, just that low hum of awareness that the day is marked, that the year turned another careful click forward. I woke up still me, still here, which feels increasingly like the real gift. Birthdays at this age are not about becoming something new so much as taking inventory of what has remained stubbornly intact and what has gently fallen away.
There is something familiar about sitting with the impulse to narrate a life not because it is spectacular, but because it is happening. The weather outside doing what weather does, the streets holding their shape, the sense that time keeps moving whether I applaud it or not. Paying attention feels like the point. Noticing how survival can look boring from the outside, but feels quietly heroic from inside your own bones.
I do not feel older so much as more textured. More aware of the cost of things. More appreciative of moments that do not demand performance. If today is a celebration, it is a modest one. Still breathing. Still noticing. Still capable of warmth and irritation and wonder in roughly equal measure. Another year survived. Another page added. I am glad I am still writing it down.
First time outside in a week and the world felt louder than I remembered. Snow still everywhere, piled and packed and sparkling under a painfully blue sky. I had cabin fever bad enough that even just a little pop outside felt like a field trip.
We grabbed breakfast bagels and instead of heading straight home, parked and let the car idle. The food was still warm in my hands, steam fighting the cold, and the mountains just sat there in the distance like they always do, patient and unconcerned. There is something grounding about eating quietly while looking at them, like they are reminding you that time keeps moving even when you have been snowed in and stuck inside your own head.
The parking lot was a mess of plowed snow and sculpted ice. Big chunks tossed aside by machines, frozen into accidental monuments. It was beautiful in that blunt, unpolished way winter does best. Clean but not gentle. (Not even that clean if you look at the parking lots and streets
)
One building had a massive icicle hanging off the roof, long and sharp and honestly a little terrifying. The kind of thing that makes you instinctively drive faster away from it. A reminder that winter does not care about liability or signage. It just hangs there, waiting, daring gravity to do its thing.
We sat longer than planned, hands warming around breakfast, watching sunlight bounce off snow and windows. After a week inside, it felt good just to exist out there again. No agenda, no rush, just bagels, mountains, and the quiet understanding that the world was still here, icy and dangerous and beautiful, waiting for us to step back into it.
#Roanokeva #winterweather #icicle


Birthday loot continues on my actual birthday from BHK
Four mint-tin games! (She knows my fondness for games in the style of cheapass games back in the day)
Also got a Fallout Securitron

And a lovely Bigfoot in Appalachia t-shirt (sort of in the style of a Patagonia top)


From M&W, a 921 pc millennium falcon, and a lighting kit
From BHK

Super 7 Godzilla with glow in the dark head and feet.
Current age: 56:11:30:06:55:50
Doing well so far!
Interesting what’s at the top of project Gutenberg downloads –

Looks like I got an XTE8NK x4 for my birthday!
Estimated arrival in 1-2 weeks. Looking forward to fooling with it.
https://www.xteink.com/products/xteink-x4/
It looks like a cute little barebones reader, definitely small enough to toss in a pocket, or put inside a passport binder for dual use with a pen and paper.
Bookmarking
To upgrade the firmware to crosspoint
To convert epubs to xtc
Settings for x4converter I like –
Font Literata
Font size 28
Weight 500
Line height 110
Margin 15
https://github.com/CrazyCoder/cr2xt
https://github.com/crosspoint-reader/crosspoint-reader/blob/master/USER_GUIDE.md
https://wallpaperconverter.jakegreen.dev/
https://github.com/crosspoint-reader/crosspoint-reader/issues/258
Xteink manga (CBZ)/images to XTC command-line tools – (got to put my black and white man-thing/zombie comics for an acid test
https://github.com/tazua/cbz2xtc

Comic converter
[Edit- set up a readme.club account, so maybe this will be the wallpaper of choice

https://www.joshualowcock.com/xteink/the-best-guide-tools-hacks-and-more-for-xteink-x4-owners/
https://trmnl.com/blog/xteink-x4-dashboard
https://www.joshualowcock.com/xteink/the-best-guide-tools-hacks-and-more-for-xteink-x4-owners/
Big day, tomorrow!

January 31, 2026 will be National Gorilla Suit Day!
Skunk comes to walk along the wall, I am so glad it has those digging claws on the *very* slick ice out in the yard.
https://youtu.be/XXwTBMIm1Wk?si=_SdXZ1745yoBKjdq

He’s not the only one responsible for the mess we’re in. History never works that cleanly. But he is the face of it. The mascot. The loud, smirking permission slip for cruelty, ignorance, and the kind of shamelessness that used to at least pretend it knew better.
What he did and continues to do, what he normalized and continues to normalize, didn’t end with him. That’s the part that keeps me awake. He didn’t invent the ugliness, but he flung the doors wide open and invited it to settle in, to get comfortable, to stop whispering and start shouting. Things people once felt embarrassed to say out loud are now worn like badges. Fear became a blatant political tool. Lies became a strategy. Decency became less than optional, a disadvantage.
And the damage isn’t just policy or headlines. It seeped into families, workplaces, friendships. It taught people that empathy is weakness and that winning matters more than truth. It tells the cruel they are righteous and the ignorant they are experts. It makes exhaustion the background noise of daily life.
Long after he’s gone, long after the name fades from yard signs and news chyrons, we’ll still be dealing with the consequences. Re-teaching basic facts. Re-building trust. Reminding each other that being human requires effort, restraint, and care.
I don’t believe one man can destroy everything. But I do believe one man can accelerate the rot, can legitimize the worst impulses of millions, can make things harder for everyone who still wants to live with some measure of kindness and sanity.
That’s the inheritance we’ll be left with. Not just what he does, but what he makes acceptable. And undoing that will take longer than any term, longer than any lifetime headline.
I look forward to a day we don’t see his vulgar influence. That will be a day for celebrating.
#doodle #apartyiscoming
When you drive through Roanoke, you likely obey the speed limit and stop at red lights. You aren’t a criminal. Yet, to the Roanoke Police Department’s new surveillance network, you are data to be captured, cataloged, and stored.
The RPD has quietly built a dragnet of 16+ Flock Safety license plate reader (LPR) cameras. As of mid-2025, these cameras are not just looking for stolen cars; they are creating a comprehensive log of everyone’s movements.
While officials tout the benefits of the new Roanoke Operations and Crime Center (ROCC), the numbers tell a different, more alarming story about the erosion of privacy in our city.
The most chilling aspect of this system is the sheer scale of the data collection. According to the department’s own transparency data for a single 30-day period in 2025:
Do the math. Over 290,000 photos were taken, but fewer than 600 searches were conducted. This means that over 99% of the data collected is of law-abiding citizens going about their daily lives: driving to work, dropping kids at school, or visiting a doctor.
This is the definition of mass surveillance: collecting data on the entire population to catch a tiny fraction of wrongdoers.
Proponents argue that the data is “only” kept for 21 days. But in the digital age, three weeks is an eternity.
With 21 days of data, an algorithm can easily establish your “pattern of life.” It can determine:
This data is collected automatically, without a warrant, and without your consent. While RPD policy currently states the system is for “criminal investigations,” civil liberties groups warn that policies can change far faster than laws.
The RPD states that searches require a “justification” and are audited. However, this is an internal check, not an external one.
The system is powered by the Roanoke Operations and Crime Center (ROCC). While they report leading to “dozens of arrests” in a month, we must ask: At what cost?
We are trading the anonymity of the open road for a system where every movement is a potential data point in a police file. We are moving toward a society where you are tracked by default, and privacy is the exception.
I love the snow. I always have. The way it hushes the world, the way it makes even familiar streets feel briefly mythic. I am not anti winter, In fact, it just barely loses to Autumn as my favorite season. I am just realistic about what winter does to a body that has been around the block a few times.
Cool weather suits me fine. Sixties are great. Forties are lovely. That is jacket weather, walk a little farther weather, breathe deep and feel awake weather. My joints agree with that version of the season. We are all on the same page.
But once the thermometer slides down into the twenties and the teens, my back and joints stage a quiet rebellion. Nothing dramatic. Just a firm and persistent no. The kind that does not respond to optimism or extra layers or bravado.
So I admire the snow from inside once it crosses that line. I watch it fall, appreciate its discipline and its beauty, and let it exist without demanding my participation. There is no betrayal in that. Loving something does not mean enduring all of it.
And this is where chili enters the picture. Chili and corn chips are a wonderful thing in cold weather. They make the cold feel like a suggestion rather than a threat. A bowl of chili warms you from the inside out, steady and honest, with corn chips doing their essential work of crunch and salt and comfort.
Staying in becomes a form of respect. Respect for the weather as it is, respect for the limits of a body that has earned the right to be listened to, and respect for the simple truth that some winter days are sometimes best enjoyed with a spoon in hand and the snow safely on the other side of the glass.
Front walkway has a drift of about 30in/76cm , so it gets to act as an extra drink cooler, more chilly than our garage.

Front walkway has a drift of about 30in/76cm , so it gets to act as an extra drink cooler, more chilly than our garage.


Monitoring Our Local Mesh Network in Virginia
There is something quietly beautiful happening across Virginia, and most people never see it unless they know where to look.
Right now, our local mesh network covers roughly two thirds of the state using nothing but radio. No cell towers. No carriers. No contracts. Just small devices talking to one another across distance, hills, and neighborhoods. If you layer the internet on top of it, the reach becomes as wide as anyone who still has a connection. But the real magic is that it does not need the internet at all.
Radio only needs two things. Power to the devices, and enough range between them to pass a signal along.
That is it.
The red dots on the map are live nodes. Each one is a person or a place. Each one is actively communicating as simple text messages with the others. No central infrastructure. No single point of failure. Messages hop from node to node like neighbors passing notes down a long porch.
If you have internet, you can relay traffic out to the wider world. If you do not, the network still breathes and moves on its own.
What flows across it is even better.
There are independent channels that cannot be blocked. They are encrypted by default. They are used to report ICE activity in real time, to ask for help, to offer help, to check on someone when the weather turns ugly. One day it is a heads up about enforcement moving through a county. The next day it is someone asking if anyone has a shovel to clear a driveway for an older neighbor. Sometimes it is just people staying in touch, making sure they are not alone if phones go dark.
This is what resilience looks like when it is built by regular people.
No corporation decides who gets to speak. No platform decides what is acceptable. There is no algorithm boosting outrage or burying kindness. It is just text moving through the air, carried by trust and proximity.
In an age where so much communication depends on fragile systems and distant companies, radio feels almost radical. Old technology doing a new job. Quietly. Reliably. Human scale.
As long as there is power, and as long as there are neighbors willing to keep a node alive, the network stays up.
That is worth monitoring. That is worth protecting. And honestly, that is worth being proud of.