FIx image paths
This commit is contained in:
parent
65e0a01517
commit
d163045cc5
43
Gemfile.lock
43
Gemfile.lock
@ -1,20 +1,45 @@
|
||||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
activesupport (8.0.0)
|
||||
base64
|
||||
benchmark (>= 0.3)
|
||||
bigdecimal
|
||||
concurrent-ruby (~> 1.0, >= 1.3.1)
|
||||
connection_pool (>= 2.2.5)
|
||||
drb
|
||||
i18n (>= 1.6, < 2)
|
||||
logger (>= 1.4.2)
|
||||
minitest (>= 5.1)
|
||||
securerandom (>= 0.3)
|
||||
tzinfo (~> 2.0, >= 2.0.5)
|
||||
uri (>= 0.13.1)
|
||||
addressable (2.8.7)
|
||||
public_suffix (>= 2.0.2, < 7.0)
|
||||
base64 (0.2.0)
|
||||
benchmark (0.4.0)
|
||||
bigdecimal (3.1.8)
|
||||
colorator (1.1.0)
|
||||
concurrent-ruby (1.3.4)
|
||||
connection_pool (2.4.1)
|
||||
drb (2.2.1)
|
||||
em-websocket (0.5.3)
|
||||
eventmachine (>= 0.12.9)
|
||||
http_parser.rb (~> 0)
|
||||
eventmachine (1.2.7)
|
||||
ffi (1.17.0-aarch64-linux-musl)
|
||||
ffi (1.17.0-x86_64-linux-musl)
|
||||
forwardable-extended (2.6.0)
|
||||
gemoji (4.1.0)
|
||||
google-protobuf (4.28.3-aarch64-linux)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
google-protobuf (4.28.3-x86_64-linux)
|
||||
bigdecimal
|
||||
rake (>= 13)
|
||||
html-pipeline (2.14.3)
|
||||
activesupport (>= 2)
|
||||
nokogiri (>= 1.4)
|
||||
http_parser.rb (0.8.0)
|
||||
i18n (1.14.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
@ -40,6 +65,10 @@ GEM
|
||||
sass-embedded (~> 1.54)
|
||||
jekyll-watch (2.2.1)
|
||||
listen (~> 3.0)
|
||||
jemoji (0.13.0)
|
||||
gemoji (>= 3, < 5)
|
||||
html-pipeline (~> 2.2)
|
||||
jekyll (>= 3.0, < 5.0)
|
||||
kramdown (2.4.0)
|
||||
rexml
|
||||
kramdown-parser-gfm (1.1.0)
|
||||
@ -48,10 +77,17 @@ GEM
|
||||
listen (3.9.0)
|
||||
rb-fsevent (~> 0.10, >= 0.10.3)
|
||||
rb-inotify (~> 0.9, >= 0.9.10)
|
||||
logger (1.6.1)
|
||||
mercenary (0.4.0)
|
||||
minitest (5.25.2)
|
||||
nokogiri (1.16.7-aarch64-linux)
|
||||
racc (~> 1.4)
|
||||
nokogiri (1.16.7-x86_64-linux)
|
||||
racc (~> 1.4)
|
||||
pathutil (0.16.2)
|
||||
forwardable-extended (~> 2.6)
|
||||
public_suffix (6.0.1)
|
||||
racc (1.8.1)
|
||||
rake (13.2.1)
|
||||
rb-fsevent (0.11.2)
|
||||
rb-inotify (0.11.1)
|
||||
@ -61,9 +97,15 @@ GEM
|
||||
safe_yaml (1.0.5)
|
||||
sass-embedded (1.81.0-aarch64-linux-musl)
|
||||
google-protobuf (~> 4.28)
|
||||
sass-embedded (1.81.0-x86_64-linux-musl)
|
||||
google-protobuf (~> 4.28)
|
||||
securerandom (0.3.2)
|
||||
terminal-table (3.0.2)
|
||||
unicode-display_width (>= 1.1.1, < 3)
|
||||
tzinfo (2.0.6)
|
||||
concurrent-ruby (~> 1.0)
|
||||
unicode-display_width (2.6.0)
|
||||
uri (1.0.2)
|
||||
webrick (1.9.0)
|
||||
|
||||
PLATFORMS
|
||||
@ -74,6 +116,7 @@ DEPENDENCIES
|
||||
http_parser.rb (~> 0.6.0)
|
||||
jekyll (~> 4.3.3)
|
||||
jekyll-feed (~> 0.12)
|
||||
jemoji
|
||||
kramdown (~> 2.4)
|
||||
tzinfo (~> 1.2)
|
||||
tzinfo-data
|
||||
|
@ -21,11 +21,11 @@ This is all coming from someone that has very little experience with the telepho
|
||||
|
||||
As far as I have ever been concerned, the telephone network looks as follows:
|
||||
|
||||

|
||||

|
||||
|
||||
But in reality, it looks a little more like the internet (I guess that makes sense, since dialup was a thing).
|
||||
|
||||

|
||||

|
||||
|
||||
The *Dark Magic* still exists, and I am still not entirely sure whats going on there. Presumably some kind of routing protocols exists to handle country codes and such, but I have had no need (yet) to explore this further.
|
||||
|
||||
@ -85,7 +85,7 @@ Trunking in the telephony world, is essentially the same as VLANs in the compute
|
||||
|
||||
In my system, I have two trunks, one for Twilio (and by extension the whole PSTN), and one for Hamshack Hotline.
|
||||
|
||||

|
||||

|
||||
|
||||
## Provisioning an IAX2 Trunk through Hamshack Hotline
|
||||
|
||||
|
@ -49,7 +49,7 @@ I chose 6in4, mostly because I felt like it :laughing:. I'm sure Teredo would ha
|
||||
|
||||
Below is a diagram of a typical 6in4 packet:
|
||||
|
||||
<img src="/images/posts/bell-ipv6/sit.png" loading="lazy" >
|
||||
<img src="/assets/blog/bell-ipv6/sit.png" loading="lazy" >
|
||||
|
||||
### Tunnel brokerage
|
||||
|
||||
@ -67,13 +67,13 @@ Before I continue further down the path of explaining the tunnel setup, I must p
|
||||
|
||||
Now, we enter the territory of undocumented Bell router features.
|
||||
|
||||
<img src="/images/posts/bell-ipv6/hh4k.png" loading="lazy" style="max-width:300px;">
|
||||
<img src="/assets/blog/bell-ipv6/hh4k.png" loading="lazy" style="max-width:300px;">
|
||||
|
||||
The [Home Hub 4000](https://support.bell.ca/internet/products/home-hub-4000-modem) is Bell's all-in-one modem, router, switch, access point, and smart home hub. From my point of view, it kinda sucks at all of those things, but luckily, it can be bypassed.
|
||||
|
||||
I have my own *much superior* [Unifi Dream Machine PRO](https://ca.store.ui.com/products/udm-pro) which is doing the heavy lifting of this home network. With a bit of configuration tweaking clearly designed for a small handful of Bell technicians, the UDM-PRO can be configured to act in place of the HH4K mentioned above.
|
||||
|
||||
<img src="/images/posts/bell-ipv6/udm-pro.png" loading="lazy" style="max-width:300px;">
|
||||
<img src="/assets/blog/bell-ipv6/udm-pro.png" loading="lazy" style="max-width:300px;">
|
||||
|
||||
The rest of these instructions will be UDM-PRO specific, but should be fairly easily adaptable to other routers.
|
||||
|
||||
|
@ -39,7 +39,7 @@ The year before I joined Raider Robotics, most of the members with substantial t
|
||||
|
||||
I remember in mid December of 2017, this testbed was brought in to the software lab I was working in, thus marking my first hands-on experience with a fully programable machine at this level.
|
||||
|
||||

|
||||

|
||||
|
||||
I don't remember a ton about that night, aside from a group of confused students trying to figure out how to load code onto the thing, and [@hyperliskdev](https://github.com/hyperliskdev) teaching me how to make a `class` in Python3 (its the weirdest things that stick in my memory..)
|
||||
|
||||
|
@ -31,7 +31,7 @@ Firstly, you must be a licensed [amateur radio](https://en.wikipedia.org/wiki/Am
|
||||
|
||||
Once logged in, head to `Networks > 44.0.0.0/8`, and request a `/24` netmask. If you need more addresses, you can also request a *smaller* number than this, but you must have good reason. Be sure to also check the `Direct (BGP)` box.
|
||||
|
||||

|
||||

|
||||
|
||||
After filing the application, a member of the ARDC will review your request, and should follow up with more questions and information for you. Once its all done, you have yourself at least 255 IPv4 addresses for radio use for the next couple years (yes, you have to occasionally renew your prefix).
|
||||
|
||||
|
@ -25,4 +25,4 @@ A surprising number of people seem to request BGP allocations without understand
|
||||
|
||||
The internet *inter-networks networks*. Or, in less confusing terms: the internet is a broad term for how network **A** can communicate with networks **B** and **C**.
|
||||
|
||||

|
||||

|
||||
|
@ -16,11 +16,11 @@ aliases:
|
||||
|
||||
We are here.
|
||||
|
||||
<img src="/images/posts/pid/here.svg" style="margin: 2em auto;" />
|
||||
<img src="/assets/blog/pid/here.svg" style="margin: 2em auto;" />
|
||||
|
||||
And we want to go there.
|
||||
|
||||
<img src="/images/posts/pid/here_there.svg" style="margin: 2em auto;" />
|
||||
<img src="/assets/blog/pid/here_there.svg" style="margin: 2em auto;" />
|
||||
|
||||
## Figuring out how to get there
|
||||
|
||||
@ -30,17 +30,17 @@ I suppose a good place to start is checking to see if *here* and *there* are in
|
||||
|
||||
Are we there?
|
||||
|
||||
<img src="/images/posts/pid/are_we_there.svg" style="margin: 2em auto;" />
|
||||
<img src="/assets/blog/pid/are_we_there.svg" style="margin: 2em auto;" />
|
||||
|
||||
*Nope.*
|
||||
|
||||
Well, let's say we want to go *there* from *here* (because we do).. Which way do we have to go?
|
||||
|
||||
<img src="/images/posts/pid/this_way.svg" style="margin: 2em auto;" />
|
||||
<img src="/assets/blog/pid/this_way.svg" style="margin: 2em auto;" />
|
||||
|
||||
I think we can do that. How far will we have to travel?
|
||||
|
||||
<img src="/images/posts/pid/how_far.svg" style="margin: 2em auto;" />
|
||||
<img src="/assets/blog/pid/how_far.svg" style="margin: 2em auto;" />
|
||||
|
||||
Great!
|
||||
|
||||
|
@ -42,7 +42,7 @@ The PL column on the left signifies the IPv6 prefix length, and the remaining co
|
||||
|
||||
Imagine a scenario where you are a client on a single-stacked IPv6 network, trying to communicate with a single-stack IPv4 host. Your network setup probably looks like this:
|
||||
|
||||

|
||||

|
||||
|
||||
As the request originator, you need an address to send your packet to. Since you are on an IPv6-only network though, the IPv4 address of the host is not very useful. Sending a packet to that address would be like sending physical mail addressed to only your friend's cell phone number.
|
||||
|
||||
@ -98,7 +98,7 @@ let rfc6052_address = {
|
||||
|
||||
This effectively splits the IPv4 address into two parts, moves them around the `u` boundary, then applies that ontop of the IPv6 prefix.
|
||||
|
||||

|
||||

|
||||
|
||||
Of course, this isn't how the address would actually look (I did just mix Decimal and Hexadecimal in the same number), but you get the point.
|
||||
|
||||
@ -123,4 +123,4 @@ let ipv4_addr = {
|
||||
|
||||
I find this one a bit simpler. It masks off the IPv6 prefix and the `u` column, then smushes the IPv4 address back into one piece.
|
||||
|
||||

|
||||

|
||||
|
@ -14,13 +14,13 @@ Ah, Leap Motion...
|
||||
|
||||
Back in 2013, a company called *~~OcuSpec~~.. ~~Leap Motion~~.. ~~Ultrahaptics~~.. Ultraleap* released their first motion tracking device, the Leap Motion Controller.
|
||||
|
||||

|
||||

|
||||
|
||||
I recall first seeing one in elementary school.
|
||||
|
||||
Looking back, I have no memory of what it was being used for, but I remember being fascinated with the diagnostics tool that showed the raw hand tracking data streaming from the device.
|
||||
|
||||

|
||||

|
||||
|
||||
## What does one actually do with one of these devices?
|
||||
|
||||
|
@ -12,7 +12,7 @@ aliases:
|
||||
|
||||
A news article was written about a project I was involved in. It's even headed by a photo I took!
|
||||
|
||||

|
||||

|
||||
|
||||
From the **London Free Press**:
|
||||
|
||||
@ -32,4 +32,4 @@ Once found on the American side of the border, a corresponding article was writt
|
||||
|
||||
## The balloon on the other side
|
||||
|
||||

|
||||

|
||||
|
@ -13,7 +13,7 @@ aliases:
|
||||
|
||||
I was scrolling through reddit the other day, and came across [this great post](https://www.reddit.com/r/FRC/comments/byzv5q/i_know_what_im_doing/) by u/[MasterQuacks](https://www.reddit.com/user/MasterQuacks/).
|
||||
|
||||

|
||||

|
||||
|
||||
I thought to myself "ha. Thats funny", and moved on. But that thought had stuck with me.
|
||||
|
||||
@ -64,4 +64,4 @@ with plt.xkcd():
|
||||
## The result
|
||||
Here is the resulting image. From left, to right: 5024, 254, 1114, 5406, 2056
|
||||
|
||||

|
||||

|
||||
|
@ -13,7 +13,7 @@ While working on an assignment with [Coggle](https://coggle.it) today, I noticed
|
||||
## What is a .mm file?
|
||||
It turns out, a `.mm` file is just some XML describing the mind map. Here is a simple mind map:
|
||||
|
||||

|
||||

|
||||
|
||||
And again as a `.mm` file:
|
||||
|
||||
|
@ -32,12 +32,12 @@ I am currently running a stock Ubuntu [18.04](https://releases.ubuntu.com/18.04.
|
||||
env XDG_CURRENT_DESKTOP=GNOME gnome-control-center
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
Next, go to *Settings > Language and Region > Input Sources*, and click on *Manage Installed Languages*.
|
||||
This will bring up a window where you can select a new language to install. From here, I clicked on *Install / Remove Language*.
|
||||
|
||||

|
||||

|
||||
|
||||
In this list, I just selected the languages I wanted (English and Japanese), and applied my changes. You may be asked to enter your password while installing the new languages. Once installation is complete, log out, and in again.
|
||||
|
||||
@ -61,12 +61,12 @@ Now that `ibus` is installed, run the setup script:
|
||||
ibus-setup
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
From here, set your shortcut to something not used by I3 (I chose `CTRL+Shift+Space`, but most people prefer `Alt+Space`), and enable the system tray icon.
|
||||
Now, go to the *Input Method* settings.
|
||||
|
||||

|
||||

|
||||
|
||||
From here, press the `+`, and add your language(s).
|
||||
|
||||
|
@ -56,9 +56,9 @@ I also looked at other file types. Binaries are very interesting because they fo
|
||||
|
||||
Back to executable data, these are small segments of a `dll` file:
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
## Check out the script
|
||||
This script is hosted [on my GitHub account](https://github.com/Ewpratten/binmap) as a standalone file. Any version of python3 should work, but the following libraries are needed:
|
||||
|
@ -50,7 +50,7 @@ After task allocation, I took on the job of handling sounds and sound loading fo
|
||||
|
||||
Day 1 started with @exvacuum developing a heartrate monitor system for the game:
|
||||
|
||||

|
||||

|
||||
|
||||
*Demo image showing off his algorithm*
|
||||
|
||||
@ -72,19 +72,19 @@ soundAssets.debug_ding.play();
|
||||
|
||||
This rewrite also added integration with the volume control sliders in the game settings menu:
|
||||
|
||||

|
||||

|
||||
|
||||
*Audio Settings screen*
|
||||
|
||||
Later on in the day, a basic HUD was designed to incorporate the game elements. A bug was also discovered that causes Firefox-based clients to not render the background fill. We decided to replace the background fill with an image later.
|
||||
|
||||

|
||||

|
||||
|
||||
*V1 of the game HUD*
|
||||
|
||||
While developing the sound backend, and tweaking UI, I added sound assets for heartbeats, and footsteps. World assets were also added, and the walking system was improved.
|
||||
|
||||

|
||||

|
||||
|
||||
*The game with basic world assets loaded*
|
||||
|
||||
@ -99,11 +99,11 @@ While developing the sound backend, and tweaking UI, I added sound assets for he
|
||||
|
||||
Day 2 started with a new background asset, and a new HUD design:
|
||||
|
||||

|
||||

|
||||
|
||||
*The game's new background*
|
||||
|
||||

|
||||

|
||||
|
||||
*The game's new HUD*
|
||||
|
||||
@ -121,6 +121,6 @@ From then on, development time was just spent tweaking things such as:
|
||||
|
||||
Micromanaged Mike is free to play on [@rsninj722's website](https://rsninja.dev/LudumDare46/).
|
||||
|
||||

|
||||

|
||||
|
||||
*Final game screenshot*
|
||||
|
@ -36,7 +36,7 @@ In terms of workflow, I write all my notes as markdown files with [embedded LaTe
|
||||
|
||||
<script src="https://gist.github.com/Ewpratten/163aa9c9cb4e8c20e732e3713c95c915.js" ></script>
|
||||
|
||||

|
||||

|
||||
*A screenshot of my workspace*
|
||||
|
||||
Now, the question came up of *"how do you easily distribute notes and assignments to classmates and professors?"*. That question got me stuck for a while, but here is the system I have come up with:
|
||||
|
@ -100,11 +100,11 @@ Notice the line `"image":"ewpratten/frc_devcontainer:2020.3.2",`. This is tellin
|
||||
|
||||
With a minimal amount of work, I got everything needed to develop and test FRC robotics code running in the browser via Codespaces.
|
||||
|
||||

|
||||

|
||||
|
||||
*Launching Codespaces from a GitHub repository*
|
||||
|
||||

|
||||

|
||||
|
||||
*Editing code in the browser*
|
||||
|
||||
|
@ -33,7 +33,7 @@ That being said, since the keyboard has so many shortcuts and combinations to ge
|
||||
|
||||
The keyboard's baseplate is made of aluminum, and is CNC-cut, so it both looks and feels very nice. For a keyboard that I can wrap my (admittedly large) hand around, it is fairly heavy too (I seem to remember the FedEx shipment coming in at around 3lbs). In this case, heavy is not at all a bad thing. The weight of this keyboard makes it feel... expensive. Also, it never feels like the board is sliding away when I'm typing.
|
||||
|
||||

|
||||

|
||||
|
||||
One downside though, in terms of connectivity, the keyboard unfortunately uses USB micro connector instead of the newer (and nicer) USB type C connector. As someone who connects his life with USB-C, I am not the biggest fan of this choice, but at least I had a right-angle USB-micro cable lying around that I can use with it. Alongside the USB-micro connection, removing the backplate will reveal a [JTAG](https://en.wikipedia.org/wiki/JTAG) connector that allows you to flash custom firmware to the keyboard if you want. @ChaoticEnigma has forked the popular [QMK](https://github.com/qmk/qmk_firmware) keyboard firmware as [`qmk_pok3r`](https://github.com/pok3r-custom/qmk_pok3r), and added support for many Vortex boards including the Core, if you are looking to load something more custom.
|
||||
|
||||
@ -58,13 +58,13 @@ The first could be done simply by performing a firmware upgrade to the latest ve
|
||||
|
||||
This process unfortunately requires access to a computer that runs Windows (or VirtualBox). On windows, the setup process is really quite easy. You go to [this link](http://www.vortexgear.tw/db/upload/webdata4/6vortex_201861271445393.exe), which will download the firmware upgrade tool. Running the tool, and plugging in the keyboard will provide you with some options.
|
||||
|
||||

|
||||

|
||||
|
||||
The "bin group" selection provides two options. Selecting `Core by MPC` will flash the re-programmable firmware to the keyboard, and the other option will restore the keyboard to factory firmware.
|
||||
|
||||
Vortex provides a programming tool, but I am not a huge fan of it. I plan to write a Java app that can program the keyboard (and load saved profiles from it), but for now, I am using a great tool made by @tsfreddie called [Much Programming Core](https://tsfreddie.github.io/much-programming-core/). This tool allows you to configure keybindings and remap keys through his website, and there are easy-to-follow instructions on how to download the correct file, and flash your keyboard.
|
||||
|
||||

|
||||

|
||||
|
||||
Speaking of flashing the board, with the MPC firmware, the process for loading custom keybindings (which works on any OS) is really easy and simple. Just unplug the keyboard, then plug it back in while holding <kbd>fn</kbd>+<kbd>D</kbd>. This will cause the keyboard to mount as a USB drive, and you can drop configuration files on to it.
|
||||
|
||||
|
@ -43,7 +43,7 @@ On the rendering side of the game, I run a few specialized mods to improve or re
|
||||
|
||||
<div class="center" markdown="1">
|
||||
|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
@ -72,7 +72,7 @@ In my inventory, I use [Roughly Enough Items](https://github.com/shedaniel/Rough
|
||||
|
||||
<div class="center" markdown="1">
|
||||
|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
@ -90,7 +90,7 @@ I hate writing down coordinates of various things, so I use Xaero's [Minimap](ht
|
||||
|
||||
<div class="center" markdown="1">
|
||||
|
||||

|
||||

|
||||
|
||||
</div>
|
||||
|
||||
|
@ -47,7 +47,7 @@ On the software side of this machine, [I pushed to switch the core development l
|
||||
|
||||
We were able to design a fully autonomous shooting system using high-speed computer vision, real-time path planning, and ball trajectory models to allow our operators to make the robot score game pieces by pressing and holding a single button. On top of this scoring system, *Darth Raider* featured fully autonomous and real-time-error-correcting spatial navigation, allowing us to input a list of goal coordinates for the robot to navigate to efficiently. The final large autonomously controlled system of this robot was known as the "hopper"; a long tunnel for storing and stacking balls. This system was 100% software controlled, and made use of an amazing predictive sorting system developed by @rsninja722 that would perfectly align balls as they were fed in to the robot. Below is a clip taken from semi-finals where we wrote an experimental system that allowed us to essentially use two completely separate robots as one, effectively doubling our gamepiece storage capacity from our max 4 balls to 7. (Big thanks to the [Falcons](https://www.thebluealliance.com/team/5032) for letting us subject them to this experiment.)
|
||||
|
||||

|
||||

|
||||
|
||||
For a few months after we finished competing, I went on to publish my largest open source project to date: [Lib5K](https://github.com/frc5024/Lib5k).
|
||||
|
||||
|
@ -32,7 +32,7 @@ This step will void your device's warranty. Chromebooks are able to handle anyth
|
||||
|
||||
Luckily, on the Acer R11, this process is very simple. Firstly, unscrew the laptop's bottom plate to expose the motherboard (some screws are hidden under rubber feet). With the backplate off, you will find a screw that looks like this:
|
||||
|
||||

|
||||

|
||||
|
||||
The screw is hard to miss, it is beside the WIFI card, an has an arrow pointing to it. Simply remove it, and put the laptop back together. You now have a fully unlocked device.
|
||||
|
||||
@ -49,7 +49,7 @@ sudo firmware-util.sh
|
||||
|
||||
This will open up the `firmware-util` settings screen.
|
||||
|
||||

|
||||

|
||||
|
||||
You will want to select the `RW_LEGACY` option to load the `RW_LEGACY` / SEABIOS payload. The `UEFI` option is technically the better choice, but it will completely remove the device's ability to run ChromeOS again in the future.
|
||||
|
||||
|
@ -21,7 +21,7 @@ The running joke in the graphics programming world is that nobody understands qu
|
||||
- Don't suffer from [Gimbal Lock](https://en.wikipedia.org/wiki/Gimbal_lock)
|
||||
- Are extremely efficient to work with computationally
|
||||
|
||||

|
||||

|
||||
|
||||
> Gimbal lock is the loss of one degree of freedom in a three-dimensional, three-gimbal mechanism that occurs when the axes of two of the three gimbals are driven into a parallel configuration, "locking" the system into rotation in a degenerate two-dimensional space.<br>
|
||||
> \[[Wikipedia](https://en.wikipedia.org/wiki/Gimbal_lock)\]
|
||||
@ -95,7 +95,7 @@ struct Quaternion {
|
||||
An important fact to keep in mind is that quaternions can <em>and will</em> be found in their normalized form, where all the coefficients (real and vector) are values between $-1$ and $1$.
|
||||
|
||||
<div style="text-align:center;">
|
||||
<img src="/images/posts/quaternions/quat_vec3.png" style="max-width:300px;">
|
||||
<img src="/assets/blog/quaternions/quat_vec3.png" style="max-width:300px;">
|
||||
</div>
|
||||
|
||||
## Quaternions are transformations
|
||||
@ -139,7 +139,7 @@ $$
|
||||
<strong>NOTE:</strong> Quaternion multiplicaiton is [noncommutative](https://en.wikipedia.org/wiki/Commutative_property), meaning that the order you multiply things <em>matters</em>. This is not normal multiplication.
|
||||
|
||||
<div style="text-align:center;">
|
||||
<img src="/images/posts/quaternions/quat_mul.jpg">
|
||||
<img src="/assets/blog/quaternions/quat_mul.jpg">
|
||||
</div>
|
||||
|
||||
### Expressing a rotation with a quaternion
|
||||
|
@ -16,7 +16,7 @@ aliases:
|
||||
My [GitHub profile](https://github.com/Ewpratten) is a bit like an iceberg. At the time of writing, I have made nearly 8 and a half thousand commits to nearly a thousand repositories. Since July 2018, I have made an effort to go no more than 3 consecutive days without writing code, and I have only broken that streak 6 times (each of those being a 4-day break).
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
I remember making myself a GitHub account back in 8th grade (August 16, 2016 to be exact). Ever since then, I have published *every single* personal project I have made to GitHub.
|
||||
|
||||
@ -518,4 +518,4 @@ Wow! You made it to the end of the list!
|
||||
|
||||
As a reward, here are some language statistics for the project list above. This does not include all languages, just the first few I queried from GitHub off the top of my head.
|
||||
|
||||

|
||||

|
||||
|
@ -70,7 +70,7 @@ Information on how to use this container stand-alone yourself can be found in th
|
||||
|
||||
An example of an output from MiDaS is shown below. I have boosted the exposure a lot to make it easier to see the depth levels. Generally, depth maps are low-contrast.
|
||||
|
||||

|
||||

|
||||
|
||||
### The Blender plugin
|
||||
|
||||
@ -81,7 +81,7 @@ I decided to piggy-back off the pipeline infrastructure I have already set up th
|
||||
*For anyone curious, my Blender plugins use QT for maximum interoperability with the rest of my toolset.*
|
||||
|
||||
<div style="text-align:center;">
|
||||
<img src="/images/posts/monocular-blender/blender-importer-window.png">
|
||||
<img src="/assets/blog/monocular-blender/blender-importer-window.png">
|
||||
<p>Plugin Dialog: <em>Import Monocular Image</em></p>
|
||||
</div>
|
||||
|
||||
@ -96,7 +96,7 @@ The process for converting a depth map and texture to a 3D object is quite simpl
|
||||
The first time I tried this, I encountered a slight issue with depth mapping:
|
||||
|
||||
<div style="text-align:center;">
|
||||
<img src="/images/posts/monocular-blender/ayo_bro.png">
|
||||
<img src="/assets/blog/monocular-blender/ayo_bro.png">
|
||||
<p>A failed attempt</p>
|
||||
</div>
|
||||
|
||||
@ -106,13 +106,13 @@ But then, I quickly figured out how to set up the displacement modifier, and got
|
||||
<tr>
|
||||
<td>
|
||||
<div style="text-align:center;">
|
||||
<img src="/images/posts/monocular-blender/ayo_displaced.png">
|
||||
<img src="/assets/blog/monocular-blender/ayo_displaced.png">
|
||||
<p>Displaced, untextured</p>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div style="text-align:center;">
|
||||
<img src="/images/posts/monocular-blender/ayo_textured.png">
|
||||
<img src="/assets/blog/monocular-blender/ayo_textured.png">
|
||||
<p>Textured, viewed from the original camera position</p>
|
||||
</div>
|
||||
</td>
|
||||
@ -128,6 +128,6 @@ If you are interested in experimenting with my depth mapping plugin yourself, fe
|
||||
And finally, a demo render:
|
||||
|
||||
<video style="max-width:100%;" controls>
|
||||
<source src="/images/posts/monocular-blender/demo_render.mp4" type="video/mp4">
|
||||
<source src="/assets/blog/monocular-blender/demo_render.mp4" type="video/mp4">
|
||||
Your browser does not support the video tag.
|
||||
</video>
|
||||
|
@ -17,7 +17,7 @@ aliases:
|
||||
|
||||
Since September of 2018 (3 and a half years ago) I have been roughly holding a streak of going no more than three days without making a commit to some project on GitHub.
|
||||
|
||||

|
||||

|
||||
|
||||
This is not entirely intentional, and I have broken it a few times:
|
||||
|
||||
|
@ -18,7 +18,7 @@ aliases:
|
||||
|
||||
Today I had a rather anticipated package arrive in the mail.. a NanoVNA! For anyone unfamiliar with the NanoVNA, it is a *small* and cheap [Vector Network Analyzer](https://en.wikipedia.org/wiki/Network_analyzer_(electrical)).
|
||||
|
||||

|
||||

|
||||
|
||||
Network analyzers are tools used commonly by RF engineers to measure reflection and transmission properties of feed-lines and antennas (and a whole ton of other stuff I don't entirely care about for now).
|
||||
|
||||
@ -30,11 +30,11 @@ My logic behind picking up a VNA was to have a little tool to fit in my radio ba
|
||||
|
||||
I am fairly well surrounded by dense trees, and a little patch of these woods are just across the street from me. This makes for a perfect spot to toss some wire up and operate away from the RF noise of the city (and people who want to ask me what I'm doing).
|
||||
|
||||

|
||||

|
||||
|
||||
I headed over there this afternoon to set everything up, this time equipped with my new NanoVNA. Sidenote: *longboards are great tables when you get to your destination.*
|
||||
|
||||

|
||||

|
||||
|
||||
## Antenna setup
|
||||
|
||||
@ -43,8 +43,8 @@ The setup of the day was comprised of some speaker wire and my [Elecraft KX2](ht
|
||||
Using the NanoVNA, I was able to perform a quick scan of a fair chunk of the amateur spectrum against my impromptu antenna.
|
||||
|
||||
<div style="display:flex;justify-content:space-evenly;flex-wrap:wrap;">
|
||||
<img style="margin:0;margin-top:15px;" src="/images/posts/nanovna/nanovna-capture-full.png" alt="Band scan from 3-600mhz">
|
||||
<img style="margin:0;margin-top:15px;" src="/images/posts/nanovna/nanovna-capture-20m.png" alt="Band scan of the 20m band">
|
||||
<img style="margin:0;margin-top:15px;" src="/assets/blog/nanovna/nanovna-capture-full.png" alt="Band scan from 3-600mhz">
|
||||
<img style="margin:0;margin-top:15px;" src="/assets/blog/nanovna/nanovna-capture-20m.png" alt="Band scan of the 20m band">
|
||||
</div>
|
||||
<br>
|
||||
|
||||
@ -52,4 +52,4 @@ The images above were grabbed using the NanoVNA's screenshot capabilities, and I
|
||||
|
||||
In conclusion, I quite like this tool, and really enjoy both its ease of use and ability to fit in my gear bag.
|
||||
|
||||

|
||||

|
||||
|
@ -17,7 +17,7 @@ aliases:
|
||||
|
||||
Remember the [Steam Controller](https://store.steampowered.com/app/353370/Steam_Controller/)?
|
||||
|
||||

|
||||

|
||||
|
||||
As it turns out, pretty much nobody does. I picked mine up back in elementary school at a good ol' [EB Games](https://en.wikipedia.org/wiki/EB_Games) shop, and remember being blown away by the extensible configurability of the thing. Shooting portals with gyro aim really *was* a cool thing to experience.
|
||||
|
||||
@ -93,6 +93,6 @@ Finally, with a full-sized USB to USB-C adapter (like the one that comes with mo
|
||||
|
||||
A known (and annoying) problem is that the trackpads are *wayy* too sensitive with this firmware so.. Good luck?
|
||||
|
||||

|
||||

|
||||
|
||||
If you want to revert to factory firmware, just copy the saved `firmware.bin` file back to the controller in the same way you deployed the custom one.
|
||||
|
@ -21,7 +21,7 @@ aliases:
|
||||
|
||||
The following is an example output of an `mtr` trace from this computer to a Hurricane Electric server:
|
||||
|
||||

|
||||

|
||||
|
||||
## Traceroute toys
|
||||
|
||||
@ -81,7 +81,7 @@ c011::000d never.gonna.tell.a.lie.and.hurt.you
|
||||
|
||||
While the output format may look weird, it directly corresponds to the input fields in the DNS control panel.
|
||||
|
||||

|
||||

|
||||
|
||||
## ICMPv6 trickery
|
||||
|
||||
@ -101,7 +101,7 @@ Generally, such a setup would involve daisy-chaining routers physically in your
|
||||
|
||||
Conveniently for my wallet, Linux machines provide something called [Tun/Tap Interfaces](https://en.wikipedia.org/wiki/TUN/TAP). These virtual network interfaces allow programs to pretend to be one of many other computers on the network and act as if they were real hosts. When a program registers one of these interfaces with the kernel, it gets raw access to either the 2<sup>nd</sup> or 3<sup>rd</sup> OSI layer of the network stack in the form of a raw stream.
|
||||
|
||||

|
||||

|
||||
|
||||
I chose to register a Tun interface, and control things at the Internet Protocol level. This choice was mainly due to simplicity, as I really don't care about hardware addresses.
|
||||
|
||||
@ -115,7 +115,7 @@ When an ICMPv6 Echo Request packet (the type that `mtr` sends for queries) comes
|
||||
|
||||
Quick sidenote: the way I had configured my RDNS records, each line of lyrics works out to the next host in line.
|
||||
|
||||

|
||||

|
||||
|
||||
With my RDNS setup, and the fact `mtr` will increment the TTL field for every router it wants to find, the process for mapping a "next router please" request to a "here is the next line of lyrics instead" response is simply to use the TTL itself as the host part of the IP address I pretend to respond from.
|
||||
|
||||
@ -127,7 +127,7 @@ Well, thats about it. I skipped over some implementation details, but if you'd l
|
||||
|
||||
And for the end result:
|
||||
|
||||

|
||||

|
||||
|
||||
Try it yourself!
|
||||
|
||||
|
@ -26,7 +26,7 @@ As a little side project, I decided to take my turn at scraping the internet for
|
||||
|
||||
To get a pretty good sense of personal ASN usage, I looked to the [Regional Internet Registries](https://en.wikipedia.org/wiki/Regional_Internet_registry) that are in charge of handing out numbers to new networks.
|
||||
|
||||

|
||||

|
||||
|
||||
Unsurprisingly, the vast majority (~750) of personal ASNs are registered under [RIPE NCC](https://ripe.net), the (mainly) European RIR.
|
||||
|
||||
@ -65,7 +65,7 @@ Along with myself, there are currently 9 other ASNs announcing their own instanc
|
||||
|
||||
Finally, I have built the following chart to break down the adoption of IPv6 by personal ASNs:
|
||||
|
||||

|
||||

|
||||
|
||||
## Want to see more?
|
||||
|
||||
|
@ -18,10 +18,10 @@ Today, I released a new command-line tool called [`gamels`](https://github.com/e
|
||||
|
||||
Linux gamers may be familiar with digging around the `copmpatdata` and `shadercache` directories in `~/.local/share/Steam/steamapps`. This is a tedious task that involves lots of googling, since Steam names game-specific directories after the game's application id.
|
||||
|
||||

|
||||

|
||||
|
||||
`gamels` solves this problem by querying the Steam API to see if any directory names match known app ids. If so, the name of the corresponding game is shown in the listing.
|
||||
|
||||

|
||||

|
||||
|
||||
Installation instructions and source code are available on [GitHub](https://github.com/ewpratten/gamels).
|
||||
|
@ -22,9 +22,9 @@ Of course, as soon as I learned of this, I threw together a script to place my d
|
||||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
## How I'm doing this
|
||||
|
||||
|
@ -37,13 +37,13 @@ Firstly, I want to know if anyone is actually using APRS proper.
|
||||
|
||||
The APRS network is built in two halves: RF and Internet. Special devices called [IGates](http://www.aprs-is.net/IGating.aspx) exist on the network to bridge between the RF world and the Internet world, gating packets between the two. This allows an RF packet to take a path like:
|
||||
|
||||

|
||||

|
||||
|
||||
The RF part of this path is generally referred to as "APRS", and the Internet part as "APRS-IS".
|
||||
|
||||
I spent a night collecting data from a node that has a full view of the traffic crossing the APRS network, and the results were... predictable.
|
||||
|
||||

|
||||

|
||||
|
||||
My thoughts on this visualization are as follows:
|
||||
|
||||
@ -59,17 +59,17 @@ The next thing I wanted to know was: where are the packets going?
|
||||
|
||||
The top 10 packet sources (RF and internet) are:
|
||||
|
||||

|
||||

|
||||
|
||||
And look! I'm in there :laughing:. My `VA3UJF-1` station that injects canadian passenger train telemetry into the APRS network sits at position #8. The [WINLINK](https://aprs.fi/info/a/Winlink) station takes first place though. This is another automated station for bridging [WinLink](https://winlink.org/) and APRS traffic.
|
||||
|
||||
How about the destinations?
|
||||
|
||||

|
||||

|
||||
|
||||
Well thats interesting... None of these destinations are real callsigns. Instead, they are "APRS Software Version Numbers". The original APRS specification defines these as follows (more have been added over time):
|
||||
|
||||

|
||||

|
||||
|
||||
These destination strings are used in scenarios where a station is broadcasting data, such as:
|
||||
|
||||
@ -79,14 +79,14 @@ These destination strings are used in scenarios where a station is broadcasting
|
||||
|
||||
...which leads me to another question. What percentage of packets are direction-less beacons?
|
||||
|
||||

|
||||

|
||||
|
||||
Is this different between RF and internet users?
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td><img src="/images/posts/aprs-usage/beacon_vs_non_beacon_inet.png"></td>
|
||||
<td><img src="/images/posts/aprs-usage/beacon_vs_non_beacon_rf.png"></td>
|
||||
<td><img src="/assets/blog/aprs-usage/beacon_vs_non_beacon_inet.png"></td>
|
||||
<td><img src="/assets/blog/aprs-usage/beacon_vs_non_beacon_rf.png"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
@ -26,15 +26,15 @@ Instead of just heading out to Walmart and buying another mouse, I decided to tr
|
||||
Disassembling the mouse was nice and easy. Simply pop off the battery cover, remove the battery, and unscrew two screws. The top just pops off, revealing one of the simplest circuit boards I've seen in a while.
|
||||
|
||||
<div style="display:flex;flex-wrap:wrap;">
|
||||
<img src="/images/posts/mouse-button-swap/PXL_20230501_193330518.jpg" style="max-width:210px;"></img>
|
||||
<img src="/images/posts/mouse-button-swap/PXL_20230501_193336150.jpg" style="max-width:250px;"></img>
|
||||
<img src="/assets/blog/mouse-button-swap/PXL_20230501_193330518.jpg" style="max-width:210px;"></img>
|
||||
<img src="/assets/blog/mouse-button-swap/PXL_20230501_193336150.jpg" style="max-width:250px;"></img>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
Located in the middle of the circuit is the momentary switch for the middle button. Conveniently the standard size you'd expect to find in a breadboard kit.
|
||||
|
||||
<img src="/images/posts/mouse-button-swap/PXL_20230501_234325200.jpg"></img>
|
||||
<img src="/assets/blog/mouse-button-swap/PXL_20230501_234325200.jpg"></img>
|
||||
|
||||
## The swap
|
||||
|
||||
@ -42,13 +42,13 @@ All that remained to do was to de-solder the old switch, and solder in a new one
|
||||
|
||||
Below is an image of the underside of the stock middle button, a very easy solder job.
|
||||
|
||||
<img src="/images/posts/mouse-button-swap/PXL_20230501_234350942.jpg"></img>
|
||||
<img src="/assets/blog/mouse-button-swap/PXL_20230501_234350942.jpg"></img>
|
||||
|
||||
## The results
|
||||
|
||||
After de-soldering the existing button, and replacing it with a spare, I was left with a mouse circuit that looked no different than when I started.
|
||||
|
||||
<img src="/images/posts/mouse-button-swap/PXL_20230502_000502685.jpg"></img>
|
||||
<img src="/assets/blog/mouse-button-swap/PXL_20230502_000502685.jpg"></img>
|
||||
|
||||
After re-assembling the mouse, I am proud to say that the button click now registers 100% of the time (unlike the ~40% when I started).
|
||||
|
||||
|
@ -20,11 +20,11 @@ This post isn't much of a tutorial, just a showcase of the end result.
|
||||
|
||||
## Movement
|
||||
|
||||

|
||||

|
||||
|
||||
## Actions
|
||||
|
||||

|
||||

|
||||
|
||||
## The code
|
||||
|
||||
|
@ -26,7 +26,7 @@ After the initial step of figuring out where to place my Vault on disk, the inte
|
||||
|
||||
Also, for anyone editing Markdown files with embedded YAML front matter, the "properties" editor is a godsend. I wish VSCode had something similar built-in.
|
||||
|
||||

|
||||

|
||||
|
||||
So ya, I'd totally recommend Obsidian as a Markdown editor and note-taking app.
|
||||
|
||||
@ -113,7 +113,7 @@ The surprisingly easy way to get the graph view to behave was to just loop throu
|
||||
|
||||
And now, with my linking trickery in place, I can get a nice graph of this website:
|
||||
|
||||

|
||||

|
||||
|
||||
The green nodes are tags that I've applied to every post. The largest of which being `projects`.
|
||||
|
||||
|
@ -39,7 +39,7 @@ This means that my personal firmware source files live in an external repository
|
||||
|
||||
My keyboard source code is organized by board:
|
||||
|
||||

|
||||

|
||||
|
||||
The contents of these files are exactly like a normal QMK keymap.
|
||||
|
||||
|
@ -50,7 +50,7 @@ Ya.. thats a long one. Feel free to check out all the [formatting options](https
|
||||
|
||||
Basically, this command displays an ASCII-art commit graph, complete with information about the commit and author. Heres a screenshot of it in action in that same Raider Robotics codebase:
|
||||
|
||||

|
||||

|
||||
|
||||
## Branch Overview
|
||||
|
||||
@ -64,7 +64,7 @@ git branch -a -l -vv
|
||||
|
||||
Continuing to use robotics codebases as an example, here is the output of this command:
|
||||
|
||||

|
||||

|
||||
|
||||
## Hot Files
|
||||
|
||||
@ -80,7 +80,7 @@ See that exclamation mark at the start? Git aliases can actually be bound to arb
|
||||
|
||||
Switching up my example repository, heres the output of this command in the [bird](https://gitlab.nic.cz/labs/bird) repository:
|
||||
|
||||

|
||||

|
||||
|
||||
## Small but Mighty
|
||||
|
||||
|
@ -18,7 +18,7 @@ I'm writing this post as a straight-to-the point guide to hand to people who nee
|
||||
|
||||
OpenSCAD uses code to describe 3D objects. When you open a new project, you'll see a layout that looks roughly like this:
|
||||
|
||||

|
||||

|
||||
|
||||
On the left is a text editor, and the yellow area is the viewport. Writing (valid) code in the editor will modify the contents of the viewport. The viewport is also interactive, so you can click and drag to rotate the view.
|
||||
|
||||
@ -32,17 +32,17 @@ cube([10, 10, 10]);
|
||||
|
||||
Save your file to see the result.
|
||||
|
||||

|
||||

|
||||
|
||||
### Rectangle
|
||||
|
||||
As you may have noticed, we typed `10` three times in the cube definition above. These three entries correspond to the three dimensions of our cube.
|
||||
|
||||

|
||||

|
||||
|
||||
Before we change these values, you should understand OpenSCAD's coordinate system. In OpenSCAD land, the X and Y axes make up the "ground plane", and the Z axis is the vertical axis. You can always reference the little axis gadget in the bottom left corner of the viewport to see which way is which.
|
||||
|
||||

|
||||

|
||||
|
||||
Ok, with the coordinate system in mind, let's make a rectangle. We'll make it 20mm wide, 10mm deep, and 5mm tall:
|
||||
|
||||
@ -50,7 +50,7 @@ Ok, with the coordinate system in mind, let's make a rectangle. We'll make it 20
|
||||
cube([20, 10, 5]);
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
### Sphere
|
||||
|
||||
@ -60,7 +60,7 @@ Spheres are pretty simple. We just need to specify the radius (in this case, 10m
|
||||
sphere(r = 10);
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
Notice how the sphere is a bit blocky? We can smooth it out by adding an `$fn` argument to the `sphere` function:
|
||||
|
||||
@ -70,7 +70,7 @@ sphere(r = 10, $fn=100);
|
||||
|
||||
The higher the `$fn` value, the smoother the sphere will be. I like to use 100 for most things. Heres the new result:
|
||||
|
||||

|
||||

|
||||
|
||||
### Cylinder
|
||||
|
||||
@ -80,7 +80,7 @@ The final shape I'll show off is the cylinder. It works much like a sphere, but
|
||||
cylinder(r = 10, h = 20);
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
Again (like the sphere), we can smooth out the cylinder by adding an `$fn` argument:
|
||||
|
||||
@ -88,7 +88,7 @@ Again (like the sphere), we can smooth out the cylinder by adding an `$fn` argum
|
||||
cylinder(r = 10, h = 20, $fn=100);
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
## Transformations
|
||||
|
||||
@ -108,7 +108,7 @@ sphere(r = 10, $fn=100);
|
||||
cylinder(r = 10, h = 20, $fn=100);
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
### Translation
|
||||
|
||||
@ -120,7 +120,7 @@ translate([20, 0, 0]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
Notice what happens if we create two cubes, and translate them an equal distance in opposite directions:
|
||||
|
||||
@ -136,13 +136,13 @@ translate([-20, 0, 0]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
They end up an unequal distance from the origin! This is because cubes (and rectangles) are not centered by default (see the cube or rectangle example above as a refresher).
|
||||
|
||||
This means that in order to move that left cube the expected distance away from the origin, we would need to translate it by the original 20mm *plus* the cube's width (10mm):
|
||||
|
||||

|
||||

|
||||
|
||||
```c
|
||||
// Right Cube
|
||||
@ -156,7 +156,7 @@ translate([-(20 + 10), 0, 0]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
*Much better.*
|
||||
|
||||
@ -168,7 +168,7 @@ translate([5, 6, -15]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
### Rotation
|
||||
|
||||
@ -180,7 +180,7 @@ rotate([45, 0, 0]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
Heres an example where we center the cube at the origin, then rotate it 45 degrees in all axes:
|
||||
|
||||
@ -192,7 +192,7 @@ rotate([45, 45, 45]) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
As you can see, individual transformations can be nested together to create more complex transformations.
|
||||
|
||||
@ -215,7 +215,7 @@ difference() {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
The `difference` function can operate on multiple shapes. The first shape will always be the displayed shape, and all subsequent shapes will be subtracted from it.
|
||||
|
||||
@ -239,13 +239,13 @@ difference() {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
See that weird overhang? Its a render artifact and not actually there in the shape.
|
||||
|
||||
To conserve on computation time, OpenSCAD doesn't do an awesome job of rendering really tight tolerances in the viewport. If we want to make it properly compute our shape, we'll have to press the <kbd>F6</kbd> key to render it.
|
||||
|
||||

|
||||

|
||||
|
||||
Much better.
|
||||
|
||||
|
@ -12,11 +12,11 @@ aliases:
|
||||
|
||||
Beside my desk, I have a bookshelf. While this *"book"shelf* barely contains any books, it is a key part of my hobby work as it contains all kinds of electronic components, a server, some networking gear, and my 3D printer.
|
||||
|
||||

|
||||

|
||||
|
||||
A few years ago, I semi-permanently affixed a strip of PWM-controllable RGB LEDs around the frame of my desk to make it glow at night, and since then I've been looking for more things to LED-ify. Thus, the next logical step was to light up my bookshelf!
|
||||
|
||||

|
||||

|
||||
|
||||
<p style="text-align:center;"><em>Lights on my desk</em></p>
|
||||
|
||||
@ -24,11 +24,11 @@ A few years ago, I semi-permanently affixed a strip of PWM-controllable RGB LEDs
|
||||
|
||||
My bookshelf is laid out as follows:
|
||||
|
||||

|
||||

|
||||
|
||||
I only wanted to light up the top row, since the bottom row has very little room for light to bounce around in, so after a few hours of tinkering, I settled on the following wiring layout (top-down view):
|
||||
|
||||

|
||||

|
||||
|
||||
***NOTE:** In both images, the purple lines represent the LED strips, and the red lines represent the wires connecting them.*
|
||||
|
||||
@ -36,7 +36,7 @@ I opted to use some WS2812 LED strips, and a small Arduino to tie everything tog
|
||||
|
||||
Of course, in real life, the wiring looks a.. um.. appropriate amount of sketchy.
|
||||
|
||||

|
||||

|
||||
|
||||
<p style="text-align:center;"><em>A photo of the left-most section</em></p>
|
||||
|
||||
@ -50,7 +50,7 @@ I can tap the button to cycle through a few different preset colours, and I can
|
||||
|
||||
The controller itself is 100% function and 0% aesthetic, but that sums up most of my personal harware projects, so it fits right in.
|
||||
|
||||

|
||||

|
||||
|
||||
## The results
|
||||
|
||||
@ -58,7 +58,7 @@ So, how does it look?
|
||||
|
||||
Great actually!
|
||||
|
||||

|
||||

|
||||
|
||||
## A note from later me
|
||||
|
||||
|
@ -22,7 +22,7 @@ A glaring problem in this plan was that I didn't actually have an antenna to bri
|
||||
|
||||
I opted to build a duplicate of my current fixed-in-place at-home antenna, a slightly more sketchy variant of [WB3GCK's speaker wire end-fed half-wave](https://wb3gck.com/tag/speaker-wire-antennas/).
|
||||
|
||||

|
||||

|
||||
|
||||
Now, I'm not very good at following other people's antenna instructions. I like to tinker with the specifics.
|
||||
|
||||
@ -38,35 +38,35 @@ Lamp wire looks like speaker wire, so I figured its probably fine. Although the
|
||||
|
||||
Armed with a surprisingly large amount of wire, I began the process of splicing and measuring.
|
||||
|
||||

|
||||

|
||||
|
||||
Everyone in my immediate life has spent the past two weeks listening to me say "100 feet is *a lot* of wire!", so this is now your opportunity to hear it too.
|
||||
|
||||
I also decided to hack up the wire packaging and use a little paracord to make insulators for the tips of the antenna.
|
||||
|
||||

|
||||

|
||||
|
||||
## Preflight checks
|
||||
|
||||
The next day, I took some time to pack up all my radio gear and give the antenna a test run.
|
||||
|
||||

|
||||

|
||||
|
||||
My original intent was to head to a nearby trail and find some trees to set up in.
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
But I wasn't super satisfied with the area, so I instead did what any sane radio operator would do.
|
||||
|
||||
I headed across the street, and set up in a grocery store parking lot.
|
||||
|
||||

|
||||

|
||||
|
||||
Feeling rather *in the open*, I sat down, watched out for people, and spun up [iFTx](https://apps.apple.com/ca/app/iftx/id6446093115) to see what kind of reach I could get with my new antenna.
|
||||
|
||||

|
||||

|
||||
|
||||
For two watts into an incorrectly sized and badly tuned antenna laying on the ground, I was very happy with these results.
|
||||
|
||||
@ -76,9 +76,9 @@ Fast forward a few days, and I find myself surrounded by trees with a hundred fe
|
||||
|
||||
I had learned from my earlier trial run that its a good idea to keep some rope with me so I can actually attach my antenna to trees instead of just using hope and friction to keep my little paracord loops attached to twiggy branches.
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
I ended up effectively wrapping the campsite in wire. One end was tied to a tree using some rope, and the other end was tent-pegged into the ground so I could adjust the tension as my brand new wire inevitably stretched over the weekend.
|
||||
|
||||
@ -86,7 +86,7 @@ In terms of operation, this setup was *awesome*. The worst noise I had to deal w
|
||||
|
||||
I had originally intended to spend this trip operating [FT8](https://en.wikipedia.org/wiki/FT8) and [CW](https://en.wikipedia.org/wiki/Continuous_wave), but for some reason I found myself really enjoying [FT4](https://wsjt.sourceforge.io/FT4_Protocol.pdf) (a mode I had never used before), so I spent most of my day camped out on 14080[Kc](https://en.wikipedia.org/wiki/Cycle_per_second), and then shifted to [10136](https://en.wikipedia.org/wiki/WARC_bands) and [7074](https://en.wikipedia.org/wiki/40-meter_band) in the evening.
|
||||
|
||||

|
||||

|
||||
|
||||
## The results
|
||||
|
||||
@ -98,10 +98,10 @@ In terms of contacts, I made a bunch. All over the bands (although mainly 20m),
|
||||
|
||||
Once I finally caught enough of a glimpse of a network connection, I was blown away by the signal reports. By far the best I've ever received!
|
||||
|
||||

|
||||

|
||||
|
||||
Pictured above, days 1 & 2, and below 3 & 4.
|
||||
|
||||

|
||||

|
||||
|
||||
All on...*checks notes*.. 7 watts :slightly_smiling_face:
|
||||
|
@ -19,35 +19,35 @@ This site you are looking at right now, ewpratten.com, was originally the band w
|
||||
|
||||
So, looking back to the first IA snapshot of the RetryLife website, we find a nice and simple landing page:
|
||||
|
||||

|
||||

|
||||
|
||||
There were a few other revisions of this page that are sitting on an SD card somewhere. If I find those, I'll update this page with the relevant screenshots.
|
||||
|
||||
Skipping ahead to the next IA snapshot, we have the first revision of my personal webpage:
|
||||
|
||||

|
||||

|
||||
|
||||
About half a year later, I did another redesign:
|
||||
|
||||

|
||||

|
||||
|
||||
A few months later, I came up with this *really* fussy design. While pretty cool, the double-overlap of the header was very annoying to build.
|
||||
|
||||

|
||||

|
||||
|
||||
The next revision was one of my favorites. A simple front page that scrolls to reveal a list of things I was working on at the time:
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
The info section of that page eventually got a bit of a refresh (IA seems to have issues with the borders on this one):
|
||||
|
||||

|
||||

|
||||
|
||||
After a lot of tinkering, I eventually re-built the entire site (and switched backends) to produce this, an early version of the layout you are looking at right now:
|
||||
|
||||

|
||||

|
||||
|
||||
## Keep tinkering
|
||||
|
||||
|
@ -110,6 +110,9 @@ body {
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
margin: auto;
|
||||
max-width: 100%;
|
||||
border-radius: 5px;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user