I’ve tried and failed to resurrect my writing hobby these past 5 years. I published several of those attempts, but something always gnawed at me. Scratch scratch, unpublish, delete. Back to wishing I’d start again.
That’s not to say I haven’t written things, but writing for myself hasn’t happened. Something about the need to craft an idealistic returnal narrative, some impossible grammatic masterpiece to vindicate myself. What am I apologizing for anyway? Who am I trying to convince?
Whatever, it’s been 5 years. Shut up and write.
I can’t help but feel weird though. I thought I embraced weird? Why am I fighting weird?
Nerves
Nervous! Yes! I am nervous! Why am I nervous?
My stupid ego is mistakenly believes my previous writings were superior, well-written, and insightful, just don’t ask me to actually check. I’m comparing myself to a fiction; A fiction built on reverence, and how much writing has meant to me. Like I’m trying to recapture something I’ve lost, but never was.
I’ve grown, matured, even wed since I last wrote regularly. By definition I should be more insightful. Why then am I so nervous to write? To share?
Being gracefully wrong
A decade ago, I switched my blogging style to something closer to note-taking. That was sensible, as I’m really into learning. That’s not to say I wont continue to do this, but something about it worried me.
“Confidently wrong” is a phrase that comes up often. Good writing exudes confidence, or we think it does. My note taking tends to come off as a “matter of fact” style of writing. I will include brief snippets of my current understanding in the notes; Brevity looks like confidence, but it isn’t thorough.
And I suspect that is my bugbear.
It’s not that I can’t write confidently, it’s that sometimes I don’t believe it. Out of necessity I’ll choose a side for the sake of momentum, then find myself in situations where I need to defend or rationalize something I don’t feel strongly about. It can be difficult to gracefully communicate ambivilance in an effective way. Have a conversation with someone, be openly scatterbrained, and they walk away feeling regretful.
I hate this.
I don’t hate that I’m not confident, but I hate that being indecisive isn’t okay. Confidence builds trust; It gives comfort, and everyone wants comfort. While I don’t thrive in indecision, I’m not uncomfortable in it. Call this a personal AuDHD’ism, but it’s not enough for me to be told something is true to believe it; I need to see it or prove it myself to be truly satisfied.
By conventional standards I could be considered an expert on many subjects, but to me I just have a larger foundation. I worry, sometimes dread, about what that foundation is built upon. But the social expectation is that I must exude confidence, and I understand why, as I too haven’t come up with a better way to make others comfortable.
I hate this social norm. I hate this normalized lying.
The enemy of done
I could rattle off the technical reasons why returning to write was so difficult (unhappiness with software, workflow, design), but fundamentally it’s just stupid perfectionism. Dwelling on what’s broken, unfinished, or unported is fruitless if nobody is watching. And nobody can watch if you can’t finish.
Maybe it’s okay to be confidently wrong. “Wrong but done” does beat “unfinished unpublished perfection”, but the desire for right forever haunts.
[package]name="hello"version="0.1.0"edition="2024"[dependencies][profile.release]opt-level="z"# Optimize for sizestrip=true# Strip symbolslto=true# Link-time optimizationscodegen-units=1# Certain optimizations only work if parallel code generation is disabledpanic="abort"# Don't generate helpful backtraces on panic!()
Versions are considered compatible if their left-most non-zero major/minor/patch component is the same. This is different from SemVer which considers all pre-1.0.0 packages to be incompatible.
toml
# Lets say latest version is 0.3.2ferris-says="0.3.2"# 0.3.2ferris-says="0.3.1"# 0.3.2ferris-says="^0.3.1"# 0.3.2ferris-says="0.3"# 0.3.2ferris-says="0"# 0.3.2# https://crates.io/crates/ftml# Lets say latest version is 1.36.1ftml="1.36.1"# 1.36.1ftml="1.36"# 1.36.1ftml="1"# 1.36.1ftml="1.12.3"# 1.36.1ftml="0"# 0.10.2ftml="0.5"# 0.5.0ftml="~1.12.3"# 1.12.6ftml="~1.12"# 1.12.6ftml="~1"# 1.36.1ftml="~1.22.1"# 1.22.2ftml="= 1.22.1"# 1.22.1ftml="0.*"# 0.10.2ftml="*"# crates.io error# Specified via a Git repositoryregex={git="https://github.com/rust-lang/regex.git"}regex-lite={git="https://github.com/rust-lang/regex.git"}regex-syntax={git="https://github.com/rust-lang/regex.git"}# Specified via path (after running `cargo new hello_utils`)hello_utils={path="hello_utils"}# Paths must be exact, unlike git that will search the repo for a matching `Cargo.toml` fileregex-lite={path="../regex/regex-lite"}regex-syntax={path="../regex/regex-syntax"}# path or git will be used when built locally.# When THIS crate is published to crates.io, the matching version will be used insteadbitflags={path="my-bitflags",version="1.0"}smallvec={git="https://github.com/servo/rust-smallvec.git",version="1.0"}# Platform or architecture specific dependencies[target.'cfg(windows)'.dependencies]winhttp="0.4.0"[target.'cfg(unix)'.dependencies]openssl="1.0.1"[target.'cfg(target_arch = "x86")'.dependencies]native-i686={path="native/i686"}[target.'cfg(target_arch = "x86_64")'.dependencies]native-x86_64={path="native/x86_64"}
Cargo “features” provide a mechanism to express conditional compilation and optional dependencies. A package defines a set of named features in the [features] table of Cargo.toml, and each feature can either be enabled or disabled.
Cargo.toml
toml
[features]default=["png","webp"]# What features to enable by defaultbmp=[]png=[]ico=["bmp","png"]# ico requires the bmp and png featureswebp=[]# webp does not enable any other features
bash
cargo build --features bmp
# builds with default and all specified features
This is the method you want to program bare chips (or modules without a USB port and/or buttons).
Connect the 3.3V, GND, SDIO, and optionally the SDCLK pins to the microcontroller (NOTE: chips with 16 pins or less don’t have a SDCLK pin). These pins are typically found on the backside of the dongle.
# list connectedwlink status
wlink flash myprogram.elf
IMPORTANT: Unless you’re programming an older chip like the CH32V2003, your WCH-LinkE probably needs a firmware update. wlink status will report the current firmware version. Newer chips are supported by newer firmwares. At the time of this writing v2.18 is the current version, supporting the CH32V006 family of chips and the CH32V317.
Until wlink adds firmware upgrade support, you can use a separate tool:
Other methods can be found on the wchispgithub page.
Running wchisp
If the module has a boot button, hold it while the device powers on (by plugging it in or by pushing reset). You can confirm the device
is in bootloadr mode with lsusb.
bash
lsusb
# ...# Bus 001 Device 005: ID 4348:55e0 WinChipHead# ...
You can now use wchisp to retrieve information about the attached device.
It provides a simple script for generating a basic project (NOTE: when I tried it, it was a broken blinky app).
Depending on your chip, this sample project will need to be changed to use an available PIN. The default is D0, which the CH32V002 does not have, so I made mine use D4. Take note of the init code that sets the pin to PP mode (push-pull).