blog.iankulin.com

Posts

sudo Incident Reports - where do they go?

After trying to run a docker command on a new home server and hitting the “user is not in the sudoers file” error, I look up the incident report in the journalctl logs, then explain how to properly gain sudo access. Instead of hand-editing /etc/sudoers, I add my user to the sudo group with usermod, covering why visudo exists and why I prefer sudo over logging in as root...

Proxmox - Storage Basics

I walk through the Proxmox web interface after a default install, explaining how nodes and datacenters fit together. I cover the two storage locations the installer creates: a local directory for ISO images, backups, and container templates, and an LVM-Thin volume used for VM disks. I end with an explanation of thin provisioning and what happens when VMs actually consume their allocated space...

Upgrade Cycle

After discovering that RAM is the main limitation on my small homelab server, I am tempted by eBay’s algorithm into a second, better-specified machine — 4 cores, double the RAM, bigger disk — complete with a 20% off code. The post covers the upgrade cost comparison and my increasingly creative rationalisations for buying it...

Proxmox Hypervisor

I compare a Raspberry Pi 4 with an HP Elitedesk 800 G1 mini PC as a home server option, noting the HP’s better specs and storage for the price, plus a few caveats like its DisplayPort connection. Wanting to build Docker, Linux, and devops experience, I install Proxmox as the hypervisor rather than VMware ESXi and share setup notes for the HP, including BIOS keys, keeping the default storage settings, and reserving the server’s IP address on the router...

Expired Packages Part II

While trying to clear an npm audit vulnerability in my React app’s nth-check dependency, I investigate confusing version mismatches between package-lock.json and npm list, and find that hand-editing the lock file doesn’t survive an install. A GitHub issue on create-react-app explains the flag is effectively a false positive for a dev-only dependency and can be safely ignored, with a workaround for CI builds. My takeaways include a clearer understanding of package.json versus package-lock.json and the value of searching for the exact error first...

Expired packages

I run into repeated breakage in the Zero to Mastery Complete Web Developer course, where deprecated packages like particles.js and a legacy REST API leave the material non-functional out of the box. After spending several hours on a workaround, a required react-scripts downgrade leaves the dev server failing with errors, and I weigh the remaining options, from watching the content without following along to cloning the instructor’s repo...

CodePen

An overview of how I use CodePen as a scratchpad for small front-end experiments, finding it quicker than setting up scratch files in a separate VS Code instance. I cover the free and paid tiers, and mention that pens can be embedded in WordPress blog posts...

Using the Community

Beginners often can’t successfully Google coding problems because they don’t yet know the terminology, and I describe how the Discord community attached to ZTM courses helps fill that gap, with tasks that push students to introduce themselves, pair up, and answer others’ questions. Getting community help still requires doing your homework and providing enough context for someone to answer. A CodePen example demonstrating how to center an image in a div is included...

Openlayers & Vite

Applying Randy Pausch’s brick wall metaphor to software development, I describe building a web page that shows the ISS’s position on a live OpenLayers map, and the obstacles I hit along the way: the library’s complexity, unfamiliar Vite build tooling, GitHub Pages conflicts, and broken asset paths. Each wall prompts a cost/benefit judgment, and I leave the remaining polish undone in favour of progressing with the course...

APIs - http & https Mixed Content error

A short write-up of a mixed content error that appeared when I called the Open Notify ISS location API from a page hosted on GitHub Pages over HTTPS. I explain why browsers block insecure requests from secure pages, note that the API doesn’t support HTTPS and GitHub Pages can’t serve over HTTP, and describe switching to the wheretheiss.at API, which supports HTTPS, as the fix...

React code is not HTML

A failed attempt to replace my React component’s inline-styled div with plain HTML and CSS leads to the realization that JSX is JavaScript code that mutates the virtual DOM, not HTML. I question why React uses the faux-HTML syntax instead of a pure JavaScript DOM API. An update notes that a video revealed the HTML-like syntax was an intentional selling point of React, and that similar ideas have already been tried and abandoned...

De-structuring objects in JS

My notes from a first React tutorial, with a focus on JavaScript object destructuring. Examples show extracting object properties as local variables, either in a function’s parameter list or inside the function body, along with my thoughts on the readability trade-offs between the two approaches...

Digital Color Meter

My quick guide to two small MacOS tips: the built-in Digital Color Meter app shows the RGB values of whatever is under the cursor (useful when matching colours, as with the iOS calculator buttons), and screenshots can include the cursor by enabling it in the Shift-Command-5 options...

Calculator

After a podcast episode on JavaScript features to avoid piqued my interest in eval(), I built a browser-based calculator that passes button presses as a string directly to eval(). The app mimics the iPhone calculator’s design, with most of the effort going into CSS that displays correctly across different devices. I also cover browser responsive-mode tooling and a touch-action fix for iOS Safari’s double-tap zoom, with links to the source and live version...

CWD - 185 - Problem solving

I give a line-by-line walkthrough of my JavaScript solution to the “clean the room” coding challenge, which groups equal values in an array into subarrays and returns them sorted. My explanation covers spread syntax for array copying, sort() comparison behavior, the difference between for…of and for…in loops, and building an object keyed by value, with occasional comparisons to Swift equivalents...

Types of Concern

I reflect on my frustration with JavaScript’s dynamic typing, which I see as a source of avoidable errors, and consider defensive type checking and TypeScript as responses. I also weigh Kyle Simpson’s argument from a JavaScript Jabber interview that, since JavaScript was designed to be dynamically typed, it’s better to embrace that than overlay a type system...

Lost in Translation

JavaScript is much more consistent across browsers now that Internet Explorer is largely unsupported, but tools for dealing with older browsers still exist. In the post, I cover approaches like libraries, polyfills, and transpilation with Babel, showing examples of arrow functions and backtick templates converted into IE 6-compatible code using Babel’s interactive web tool...

Functions in JavaScript

I give a tutorial-style explanation of functions in JavaScript, covering scope and pass-by-value arguments, nested functions, and my preference for passing values in explicitly rather than reaching for outer-scope variables. I then cover functions as first-class citizens, including anonymous and arrow function syntax, passing and returning functions, and using map to apply a function to array elements...

Classes in JavaScript

My first impressions of JavaScript classes from a beginner’s lesson, with examples of declaring and instantiating classes, single inheritance using extends and super, defining methods, and using getters as computed properties. I also note JS quirks like the lack of named arguments, that missing constructor arguments fail silently, and classes that skip the constructor in favor of field declarations with default values...

Things I love about Swift after a week of JavaScript

As an iOS developer a week into learning JavaScript, I reflect on what I miss from Swift, including the determinism of compiled code, a complete IDE for debugging, and the ability to fully remove deprecated language features. I also cover what JavaScript has in its favour, such as its low barrier to entry and lack of a required build step...