-
Notifications
You must be signed in to change notification settings - Fork 0
/
page-001.json
1 lines (1 loc) · 9.8 KB
/
page-001.json
1
{"version":"https://jsonfeed.org/version/1.1","title":"Craig Weber","home_page_url":"https://blog-test.weberc2.com/page-001.html","description":"Craig Weber's blog","author":{"name":"Craig Weber"},"authors":[{"name":"Craig Weber"}],"items":[{"id":"","url":"https://blog-test.weberc2.com/posts/homelab-intro.html","summary":"\u003cp\u003eAs I alluded to in my \u003ca href=\"https://blog-test.weberc2.com/posts/k3s-tailscale.md\"\u003elast post\u003c/a\u003e, I've finally decided to pull the trigger\nand build my own homelab: a personal computing environment for playing around\nwith new tools and approaches for developing or operating software, including\nsoftware that is personally useful.","date_published":"2021-01-03T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/k3s-tailscale.html","summary":"\u003cp\u003eI've recently been working on my Raspberry Pi Kubernetes cluster. I also use\n\u003ca href=\"https://tailscale.com/\"\u003eTailscale\u003c/a\u003e for my home VPN (because it's performant and absurdly easy to\nsetup and configure). I wanted to run Kubernetes services on my VPN using\nprivate DNS names (e.g., \u003ccode\u003efoo.local\u003c/code\u003e) and addresses from the Tailscale address\nspace (e.g., \u003ccode\u003e100.*\u003c/code\u003e) as opposed to the host network address space (e.g.,\n\u003ccode\u003e192.168.*\u003c/code\u003e).\u003c/p\u003e\n\n","date_published":"2020-12-30T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/golang-iterator-sketch.html","summary":"\u003cp\u003eThe new Go generics proposal and playground gives us something to play with.\nHere's a sketch of what a basic iterator library could look like. It's based on\nfunction types instead of interfaces; I think this gives better ergonomics than\ninterface-based designs, especially if the proposal drops its seemingly\narbitrary \u003ca href=\"https://go.googlesource.com/proposal/+/refs/heads/master/design/go2draft-type-parameters.md#methods-may-not-take-additional-type-arguments\"\u003erestrictions for method types\u003c/a\u003e.\u003c/p\u003e\n\n\u003cp\u003eI'm not sure about returning a pointer to the type as opposed to a \u003ccode\u003e(T, bool)\u003c/code\u003e\ntuple. In particular, I suspect this will cause unnecessary allocations, but I\nhaven't tested at all.\u003c/p\u003e\n\n","date_published":"2020-06-17T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/multiple-github-account-tips.html","summary":"\u003cp\u003eI use GitHub for my work and personal projects with different profiles for\neach. Because it's a good security/privacy practice, each profile has its\nown distinct SSH key. However, this causes problems because the \u003ccode\u003egit\u003c/code\u003e CLI\nwill always try to use the first SSH key that maps to the \u003ccode\u003egithub.com\u003c/code\u003e\ndomain even if that key has no permissions for the target repository. The\nother more straightforward problem with multiple accounts is that the\nGitHub.com browser cookie asserts that you are only logged into one account\nat a time.\u003c/p\u003e\n\n\u003cp\u003eMy solutions for these problems are \u003ca href=\"https://direnv.net/\"\u003e\u003ccode\u003edirenv\u003c/code\u003e\u003c/a\u003e and \u003ca href=\"https://support.mozilla.org/en-US/kb/containers\"\u003eFirefox\nContainers\u003c/a\u003e, respectively. These use cases are straightforward\napplications of these technologies, so I'm not claiming any innovation here,\nbut rather it took me a long time to identify these solutions, and I hope\nthis saves others some time. If you're not familiar with these tools, read\non for details.\u003c/p\u003e\n\n","date_published":"2020-04-25T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/5-myths-infra-as-code.html","summary":"\u003cp\u003eThere's an ongoing debate among infrastructure-as-code practitioners between\nconfiguration languages like YAML and HCL and using \u0026quot;real programming\nlanguages\u0026quot; (including domain specific programming languages) to generate\nconfiguration. The debate is going very poorly because there is a lot\nof confusion about the \u0026quot;real programming languages\u0026quot; position, so I want to\ncorrect some of the common points of confusion (\u0026quot;myths\u0026quot;) so the conversation\ncan focus on more substantial concerns.\u003c/p\u003e\n\n","date_published":"2020-04-15T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/blog-infra-updates.html","summary":"\u003cp\u003eAnother year, another blog update. BitBucket is deprecating their Mercurial\nsupport, and while I really do appreciate Mercurial, it's just easier for me to\nkeep everything in GitHub than trying to find another Mercurial provider. Also,\nGitHub seems to be improving at a pretty rapid pace. So voila, this blog is now\nhosted on GitHub. This includes my pet static site generator, \u003ca href=\"https://github.com/weberc2/neon\"\u003e\u003ccode\u003eneon\u003c/code\u003e\u003c/a\u003e which\nis used to generate this site.","date_published":"2020-03-28T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/blog-infrastructure.html","summary":"\u003cp\u003eI \u003cem\u003efinally\u003c/em\u003e got around to automating the publishing of this blog. It hasn't\nbeen a high priority, since I only post a couple of times a year, but it's\nalways bothered me that something that is such an ideal candidate for\nautomation hasn't been automated. Anyway, I finally did it and I want to\ndescribe the setup in case it's helpful for anyone looking to do the same.\u003c/p\u003e\n\n","date_published":"2019-04-06T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/golang-docker-scratch-app.html","summary":"\u003cp\u003eNOTE: If you're here for the TL;DR, skip to the bottom.\u003c/p\u003e\n\n\u003cp\u003eA few months ago I built out some monitoring infrastructure at work using Go. I\ndeployed it to ECS (a Docker orchestrator, functionally similar to Kubernetes),\nand for fun I decided to see how minimal I could make the image. I've used\nAlpine base images before (which weigh in at about 5 MB and usually another 5 MB\nfor a small Go binary), but being that Go advertises itself as requiring only a\nLinux kernel (most programming languages depend on an interpreter, a VM, and/or\nsystem libraries--the latter abstract over kernel functionality and sometimes\nprovide a stable interface to the kernel), I wanted to see how true or practical\nthis was, and I wanted to better understand the things that I was taking for\ngranted by using distros.\u003c/p\u003e\n\n\u003cp\u003eAs a matter of context, Docker has a special base image called \u003ccode\u003escratch\u003c/code\u003e which\nis empty--an application running on a scratch base image only has access to the\nkernel (at least to the extent that containers provide isolation).\u003c/p\u003e\n\n","date_published":"2018-11-04T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/go-getting-started.html","summary":"\u003cp\u003eA little over 2.5 years ago, I wrote a tutorial about \u003ca href=\"https://blog-test.weberc2.com/posts/installing-go-on-linux-and-osx.md\"\u003einstalling Go\u003c/a\u003e. Since\nthen, one of the more significant changes to the Go ecosystem has been the\naddition of \u003ca href=\"https://github.com/golang/go/wiki/Modules\"\u003emodules\u003c/a\u003e, which effectively does away with the hardest part of\ninstalling Go--\u003ccode\u003e$GOPATH\u003c/code\u003e. This change occurred in the latest version: Go 1.11.\u003c/p\u003e\n\n\u003cp\u003eIn addition to installing Go, I wanted to make a guide that can get you from\nnothing to a real project in half an hour. Most languages focus their\nintroductory material on the language and briefly cover setting up a toy\nprogram. When you're done, you realize you have no idea how to build a\nmulti-file program, how to add dependencies (or at least how to add them in a\nway that won't break other things on your system), how to get an editor up\nand running, etc.\u003c/p\u003e\n\n\u003cp\u003eI'm not going to focus much at all on Go the language here, since it's super\neasy to learn and there are already many great tutorials (the official\n\u003ca href=\"https://tour.golang.org\"\u003eTour\u003c/a\u003e is probably not a bad place to start). I'm only going to go deep\nenough to give you a lay of the land; if I've done my job, it should be easy\nenough to Google for specific resources on any given topic (for example,\ntesting).\u003c/p\u003e\n\n\u003cp\u003eNow without further ado...\u003c/p\u003e\n\n","date_published":"2018-10-14T00:00:00Z","author":{},"authors":[{}]},{"id":"","url":"https://blog-test.weberc2.com/posts/golang-interfaces-and-nil.html","summary":"\u003cp\u003eI've recently been involved in conversations with a few Go developers who have\nexpressed frustration about Go's interfaces with respect to nil. It seems not\neveryone understands that interfaces are a reference type (like a pointer), and\nthey can reference other reference types (i.e., pointers, maps, slices, etc).\nBecause all reference types have a nil (zero) value, an interface can be nil\nor an interface can reference a nil pointer; people may fail to realize that\nthe nility of the interface is independent from the nility of the thing it\npoints to, and when we ask (for example) \u003ccode\u003eif err != nil\u003c/code\u003e, we're actually asking\n\u003cem\u003eis the interface nil?\u003c/em\u003e, not \u003cem\u003eis the value behind the interface nil?\u003c/em\u003e. Here are\na few examples that will (\u003cem\u003ehopefully\u003c/em\u003e) demonstrate this clearly:\u003c/p\u003e\n\n","date_published":"2016-10-30T00:00:00Z","author":{},"authors":[{}]}],"next_url":"https://blog-test.weberc2.com/page-002.html"}