BloggingHello worldI have started and abandoned several blogs before, so this is another attempt to write about my studies, my work and my hobbies.
.NetEntity Framework Proxy GetType() messEntity Framework returns dynamic proxies whose GetType() breaks generic repositories, so I use ObjectContext.GetObjectType to get the real entity type.
BloggingAndroid bloggingI installed the WordPress app on my Android phone so I can manage posts, pages, comments and stats, and I even wrote this post with it.
TipsGoogle Apps forwardingGoogle Apps has no traditional email forwarders, but with a few steps you can configure its Groups feature to forward mail to any addresses you like.
Blogging, PersonalBreaking promises...and asking santa for internet access.Six months of blog silence, two months without an internet connection at my new home, and a rant about paying for service I never got.
Online ShoppingAnnoying online salesrobotAmazon spends millions on product recommendations, yet its cross-selling emails still can't match a good in-store saleswoman.
ToolsA picture is a thousand words. GreenShotAfter years on SnagIt I switched to GreenShot, a free open-source screenshot tool with handy capture hotkeys and a built-in editor.
Web Design, CSSPractical CSS3 tables with rounded corners - RedTeamDesignI came across a red-team-design.com article showing a simple way to build CSS3 tables with rounded corners and hover effects, so I am sharing it here.
CodeWaiting for progressA simple static event class that lets any deeply nested code update the main form's progressbar without passing references around.
DockerWelcome to GhostA fresh start for my blog on Ghost, a minimal nodejs blogging platform, running inside a docker container behind an nginx proxy.
Tips, Docker, BloggingRunning Ghost inside docker behind nginxHow I run my Ghost blog inside a docker container behind an nginx reverse proxy, with the full docker-compose and nginx config.
Tips, ToolsListing global npm installed packagesIf you are moving your global packages over to yarn, a single npm command lists every globally installed package with its version.
Tools, DockerTeamcity agent as Docker containerInstead of committing hand-tweaked containers, I build custom TeamCity build agents from a Dockerfile so they are versioned and reproducible.
BloggingAdding highlight.js to GhostA quick way to add highlight.js syntax highlighting to a Ghost blog using the admin panel's Code Injection tool instead of editing theme files.
IonicIonic2 VirtualScroll custom component workaroundIonic2 VirtualScroll won't render custom components yet, but wrapping the component in a plain div works around the open issue.
Tools, Security, TipsRemoving sensitive data from githubI accidentally pushed an API key to github, so here is how to scrub sensitive data from git history using the BFG repo cleaner.
ToolsNVM is hands down the best way to install nodejsAfter trying every way to install NodeJS, NVM is my favourite since I can switch versions instantly and migrate global packages too.
BashUpdating Cordova config.xml version using npm versionUsing the npm version script hook to update Cordova's config.xml version number automatically and commit it alongside package.json.
Tips, ToolsRemoving remote and local git tagsOne-liner commands to bulk delete unwanted git tags matching a pattern from both the remote repo and your local clone, using awk and xargs.
OpinionsWhat's wrong with StackOverflowWhy I stopped answering questions on StackOverflow, where low-effort posts and point farming are eroding a great platform.
Code, TestingTesting RxJS5 async methods in Angular2Testing time-based RxJS5 observables in Angular2 without waiting real seconds, using fakeAsync and tick after jasmine.clock let me down.
CodeAdding type safety to Immutable.js with Typescript string literals and keyofHow I use TypeScript string literals and keyof to make Immutable.js get calls type safe, so property renames break at compile time instead of runtime.
Ionic, Code, TestingTesting Ionic presentablesA reusable mock for testing Ionic presentables like modals, alerts and toasts, so you can trigger onDidDismiss and assert what your page does.
Ionic, CodeUsing environment config in Ionic2Separate development and production config in Ionic2 using a typed environment module, an OpaqueToken and NODE_ENV to pick values at build time.
CodeNodeJS async/await with retryA small async/await retry middleware with timeout for NodeJS, replacing the tangled promise-retry code I used to talk to an unreliable database.
Tools, TipsGit rerere to the rererescueEnabling git rerere makes git remember your conflict resolutions, so repeated rebases of a feature branch stop asking you to fix the same conflicts.
Performance, CodeMeasure real world web performanceUsing the Performance API with performance.mark and performance.measure to see how your code really runs on users' devices, not just in the lab.
Lifehacks, TipsI just discovered the best laptop sticker residue removerBaking soda mixed with rubbing alcohol removes laptop sticker residue in seconds, after nail polish remover, vinegar and alcohol alone all failed.
3D Printing, HobbiesBuilding my own 3D printerHow I went from a modded Ender 3 Pro to building a Voron from 150 separate part orders, and why DIY 3D printing is such a rewarding hobby.
Tips, ToolsBatch resize pictures on Mac using PreviewA quick step-by-step way to batch resize images on a Mac using nothing but Preview, plus ImageOptim to shrink them for the web.
Code, FirebaseWriting a Firebase function to modify user claimsEver wanted to give some Firebase users special privileges? Here is how to write a Firebase function that sets custom user claims.
Javascript, CodeManaging Collections in JavascriptThree ways to manage collections in JavaScript models — exposing the raw array, wrapping it in methods, or extending Array for the best of both.
Technology, AIIn the Era of ChatGPT and friendsIf you can no longer tell whether ChatGPT or a human wrote a piece of text, what does that do to authenticity and trust in what we read?
Security, OpinionsSoftware security is a culture not a calendar eventTreating software security as an occasional audit is a mistake — small companies compete by making security part of every decision they take.
3D PrintingFear of the warped bedMy Voron's bed mesh deviation jumped to 0.32mm and I feared a warped 3D printer bed — the real culprit turned out to be the gantry.
3D Printing3D printing resourcesThis is just a list of links related to 3D printing, mainly here for my own reference, but pretty sure you might find something useful in them also.
Technology, AIBing's great comebackMicrosoft wired ChatGPT into Bing and used the waitlist to push Bing onto millions of devices — pure marketing genius in my book.
TipsHelp the Helpdesk! Send Info.A small trick that makes app support better — prefill your mailto contact link with device and user info so the helpdesk skips the back-and-forth.
Code, IonicMigrating an Ionic App to use Angular standalone componentsHow I migrated an Ionic app with over 500 components to Angular standalone components using the official schematic, and what needed manual fixes.
Security, TechnologyFinding an appropriate WAF might be harder than it looksShopping for a Web Application Firewall on a small budget is rough — opaque pricing, call-for-quote tiers, and GDPR clashes with CDN offerings.
Smart Home, Hobbies, TechnologyBuilding a smart HVAC system from scratchWhen you build your own house you get to make all the decisions. That sounds great until you realize you also have to live with all of them.
Technology, AI, OpinionsDeepSeek R1 and the week the pricing story brokeWhen DeepSeek dropped R1, my first reaction was not hype — it was spreadsheet panic. The comfortable pricing story suddenly had a counterexample.
Technology, AI, CodeThe week coding assistants stopped pretending to be autocompleteClaude 3.7 Sonnet was the first time I caught myself delegating context, not lines. AI coding assistants stopped pretending to be autocomplete.
Tips, HobbiesKeeping an old car in great shape when nobody else sweats the detailsOld does not mean good enough. What happened when I stopped trusting other people's checklists and kept my Astra OPC running like clockwork.
3D Printing, HobbiesThe Voron build was hard — owning one is the real projectFinishing the Voron build feels like crossing a finish line. That high is real. It is also misleading — the real project is what comes after.
Smart Home, Technology, HobbiesHome Assistant and the local-first smart homeSmart home products love to sell you convenience. What they do not mention is that most of that convenience runs through someone else's server.
Technology, AI, Code, OpinionsVibe Coding: An Honest Take After Three Years of AI-Assisted DevelopmentThree years of AI-assisted development later, vibe coding is real. The thinking is yours, the judgment is yours — the typing was never the point.
Opinions, Code, TechnologyTraining juniors in the AI era — judgment, struggle, and why the field still needs new dataAI makes junior developers look productive on week two. If we train them for speed alone, we hollow out the next decade of engineering judgment.
AI, Code, ToolsUsing Claude Code's parallel agents to collaborate on a featureThe single-agent model has a ceiling. Claude Code's parallel agents let you split a feature into independent pieces and work like a focused team.
Ionic, Technology, AI, Code, PersonalThree similar Ionic apps, one Nx monorepo, and a lot of AI-assisted glue workHow we merged three Ionic/Angular/Capacitor codebases into a single Nx workspace so a small team could stop maintaining the same code in three places.
Technology, Code, Firebase, Tools, PersonalPortfolio Ticker — a tiny monitor for investments scattered across brokersI had stocks and ETFs across three platforms and no single place to see them. So I built one, and left it open for anyone else to use.
AI, Code, Testing, OpinionsGuardrails beat guidelines — how to keep AI-generated code honestYou cannot prompt AI-generated code into being reliable. What works is what always worked with new hires — guardrails that say no.
Hobbies, LifehacksThe drink I make that actually worksFresh ginger, lemon juice, and honey is already a drink worth making. Then I started fermenting it, and now I cannot go back.
AI, Code, ToolsLet the big model write the manual — using Fable 5 to make smaller models betterI stopped pointing the frontier model at my backlog and started using it to write the Skills and guidelines my cheaper models read.