Turns out helm is pretty intuitive if you already have been working with something like Hugo, which is Go template driven.
Was able to convert an entire K8 stack to helm with a couple hours of work and render everything.
I have this problem of trying to avoid percieved complex tools in an attempt to reduce "another tool" syndrome for others I work with.
Sometimes, it's important to keep in mind who is editing and doing the majority of the work, and not worry as much about the long-term solution over delivery.
That's always a tough balance since I tend to think outside the scope of a single team due to the style of work I've done.
I think I'm slowly getting there. ๐
Done!
I've pretty much done above and beyond 100 days, but finding the blogging format to take a lot more effort to keep up when I'm doing a mix of puzzles, courses, and work.
Since my full-time job has Go development as a part of it now, I've exceeded this and going to track any future training goals in a lower overhead way, such as GitHub issues or such.
Yes, it was worth it.
It helped me break down a large amount of learning back into a daily rythm of dedicated study.
For me, doing full time development, I found it was hard since I do code a big chunk of the day to document all the time.
Probably would minimize the effort of documenting the process itself.
While it's great to save notes and articulate things, I feel either saving the notes as part of the git log or algorithm style repo would be less trouble.
Also, some of the work is in various platforms like Leetcode, which aren't easy to straight extract.
Reduce the overhead and focus on documenting core principles or concepts that would be useful in a wiki style format, but not log as much.
Using Github Issues might work really well too, because you could post them to a log later in bulk, but otherwise the cli driven creation and kanban board approach would minimize the overhead.
That would be cool too cause you could have bots run todos, stale items, and other cool things for you.
I didn't get this to work yet with my internal repos, but it's worth pinning as Go module documentation for API docs can be generated for review as well.
Change darwin to linux to use the linux version.
I've used a few approaches in the past with "wait-for-it" style containers.
Realized there's some great features with healthchecks in Docker compose so I decided to try it out and it worked perfectly for Docker compose setup.
This can be a great way to add some container health checks in Docker Compose files, or directly in the Dockerfile itself.
---version:'3'networks:backend:database:volumes:mysql-data:services:redis:image:redisports:-6379:6379networks:-backendhealthcheck:test:["CMD","redis-cli","ping"]interval:1stimeout:3sretries:30mysql:image:mysql:5.8env_file:../env/.env# or use another pathvolumes:-mysq-data:/var/lib/mysql# This is the initialization path on first create# Anything under the directory will be run in order (so use sorted naming like 01_init.sql, 02_data.sql, etc)-../db/myql/schema/:/docker-entrypoint-initdb.dports:-3306:3306networks:-databasehealthcheck:#test: "/etc/init.d/mysql status" > didn't work# The environment variable here is loaded from the .env file in env_filetest:mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORDinterval:1stimeout:3sretries:120### example api service that now depends on both redis and mysql to be healthy before proceedingapi:image:api:latestenv_file:../env/.envports:-3000:3000networks:-backend-databasedepends_on:mysql:condition:service_healthyredis:condition:service_healthy
Ultimate Syntax (Ardan Labs - Bill Kennedy) and went back through various topics such as:
Pointers: One thing mentioned that resonated with me was the confusion regarding pointers in parameter declarations.
I also find the usage strange that the deference operator is used to denote a pointer value being dereferences in the parameter.
I'd expect a pointer value to pass clearly with func (mypointer &int) and not func (mypointer int) with a pointer call.
Literal Structs: Great points on avoiding "type exhaustion" by using literal structs whenever the struct is not reused in multiple locations.
Constants: Knowing that there is a parallel typing system for constants with "kind" vs "type" being significant helped me wrap my head around why constants often don't have explicit type definitions in their declaration.
This is one of the most confusing types I've used.
Iota only works in a block declaration.
const(a=iota+1// Starts at 0b// Starts at 1c// Starts at 2)
Also showed using << iota to do bit shifting.
This is common in log packages (I'll have to look in the future, as bit shifting is something I've never really done).
Become of kind system, you can't really make enumerators with constants.
Don't use aliases for types like type handle int in an effort.
While it seems promising, it doesn't offer the protection thought, because of "kind" protection.
This is because "kind promotion", it destroys the ability to truly have enumerations in Go by aliasing types.
I've seen stringer used in some articles as well, but not certain yet if it's considered idiomatic to approach enum like generation this way.
I was skeptical of this being the root cause of kernel CPU usage, but once I plugged in the charger, the CPU issue resolved itself within 30 seconds.
This is completely ridiculous.
If throttling is occurring, a polished user experience would be to notify of insufficient power from charger, not hammer my performance.
Additionally, it seems odd how many docking stations I've looked at for my Mac don't provide the minimum required power to sustain heavy usage.
While I still enjoy using the Mac, having 4 cables coming out from it to use at my desk compared to my older Lenovo/HP docking station experience feels like a subpar experience.