<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><id>tag:temikus.net,2014:/feed</id><title>Artem’s ramblings</title><link rel="alternate" type="text/html" href="http://temikus.net/"/><link rel="self" type="application/atom+xml" href="http://temikus.net/feed.xml"/><updated>2023-09-24T00:00:00Z</updated><author><name>Artem Yakimenko</name><uri>http://temikus.net/</uri></author><entry><id>tag:temikus.net,2014:Post/manager-hour-comms-during-turbulent-times</id><title>Manager hour - comms during turbulent times</title><link rel="alternate" type="text/html" href="http://temikus.net/manager-hour-comms-during-turbulent-times/"/><published>2023-09-24T00:00:00Z</published><updated>2023-09-24T00:00:00Z</updated><content type="html">&lt;p&gt;Generally, people have a finite capacity to “deal with things”. Organisational events and changes exhaust that finite capacity, which makes people over-evaluate any further changes to their work environment as they crave stability.&lt;/p&gt;&#10;&lt;p&gt;As such, after significant changes such as layoffs, reorgs, pivots, etc., it’s even more critical to over-communicate and communicate with care when doing announcements.&lt;/p&gt;&#10;&lt;p&gt;And the most important thing here is follow-up! No one does it 100% right all the time. It’s whether you recognise something is missing and follow up that matters much more.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/management-hour-interviewing</id><title>Management Hour - Interviewing</title><link rel="alternate" type="text/html" href="http://temikus.net/management-hour-interviewing/"/><published>2023-09-20T00:00:00Z</published><updated>2023-09-20T00:00:00Z</updated><content type="html">&lt;p&gt;Interviews should be:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Consistent&lt;/li&gt;&#10;&lt;li&gt;Fair&lt;/li&gt;&#10;&lt;li&gt;Humane&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;As such, here are some things to keep in mind:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ensure that at least 80% of your questions overlap between different candidates. Otherwise, you create an uneven playing field.&lt;/li&gt;&#10;&lt;li&gt;A memory of an experience fades extremely quickly, so make sure to jot down your feedback ASAP—ideally, on the same day. I usually block off my calendar right after the interview for feedback.&lt;/li&gt;&#10;&lt;li&gt;If you interview in tandem - discuss the candidate after you submit the feedback so you don’t bias each other. If your scores are radically different - it will at least create a learning opportunity for both.&lt;/li&gt;&#10;&lt;li&gt;If you know that you will be biased for or against the candidate - make sure you interview at least in tandem or recuse yourself from the process.&lt;/li&gt;&#10;&lt;li&gt;No trick or “Aha!” questions should be present in interviews. They just bin candidates into 2 buckets: those who know and do not. More often than not, such binning is not very useful to see who would make a good candidate.&lt;/li&gt;&#10;&lt;li&gt;When making an overall recommendation, start with the at - a lot of confusion often happens during the interview process, and this reduces ambiguity in hiring committees regarding role, level, etc. E.g., “HIRE at L4 SRE”, “BORDERLINE at L3 Delivery Lead”, or “STRONG NO HIRE at L5 Principal Engineer”.&lt;/li&gt;&#10;&lt;li&gt;Often, interviews are back to back - always ask the candidate if they need a second to get comfortable - get water, turn on AC, go to the bathroom. You’d be surprised just how shy some people are and then sit there uncomfortable, which impacts their interview performance.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/consulting</id><title>SRE Consulting engagements</title><link rel="alternate" type="text/html" href="http://temikus.net/consulting/"/><published>2021-11-06T00:00:00Z</published><updated>2021-11-06T00:00:00Z</updated><content type="html">&lt;p&gt;Due to extreme demand on my &lt;a href="https://temikus.net/office-hours"&gt;Office Hours&lt;/a&gt; I’m opening a paid consulting stream for those that want more of my time and are willing to pay for it - i.e. SRE leaders, Seasoned Professionals and Companies that need advice.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Are you a seasoned professional new to the SRE role?&lt;/li&gt;&#10;&lt;li&gt;Perhaps you lead a team that struggles with a particular operational or culture problem?&lt;/li&gt;&#10;&lt;li&gt;Are you a startup that needs a nudge in the right direction to scale?&lt;/li&gt;&#10;&lt;li&gt;Do you need in-depth assistance with one of the OSS projects I maintain?&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Then this is for you: &lt;a href="https://calendly.com/temikus/consulting"&gt;https://calendly.com/temikus/consulting&lt;/a&gt;&lt;br&gt;&#10;10% of all proceeds go to charity ❤️ &lt;a href="https://www.fame.org.au/"&gt;https://www.fame.org.au/&lt;/a&gt;&lt;br&gt;&#10;Questions? consulting &amp;lt; at &amp;gt; temik.me&lt;/p&gt;&#10;&lt;h1 id="faq"&gt;FAQ&lt;/h1&gt;&#10;&lt;p&gt;Q: Are you stopping your free office hours?&lt;br&gt;&#10;A: No, I’m still scheduling those in the same manner for the foreseeable future as my &lt;a href="https://temikus.net/office-hours"&gt;reasoning&lt;/a&gt; hasn’t changed.&lt;/p&gt;&#10;&lt;p&gt;Q: Why are you doing this?&lt;br&gt;&#10;A: Popular demand. I’m often getting booked out for months in advance and some people/companies have expressed their interest in paid engagements.&lt;/p&gt;&#10;&lt;p&gt;Q: How does this work?&lt;br&gt;&#10;A: You go to the &lt;a href="https://calendly.com/temikus/consulting"&gt;calendly link&lt;/a&gt;, choose a time, make a payment and get a dedicated office hour to discuss your problem.&lt;/p&gt;&#10;&lt;p&gt;Q: Can I book multiple hours?&lt;br&gt;&#10;A: Absolutely!&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/office-hours</id><title>Office Hours</title><link rel="alternate" type="text/html" href="http://temikus.net/office-hours/"/><published>2020-04-26T00:00:00Z</published><updated>2020-04-26T00:00:00Z</updated><content type="html">&lt;p&gt;Following the example of my friend &lt;a href="https://natwelch.com/"&gt;natwelch@&lt;/a&gt; I decided to try my hand at public office hours.&lt;/p&gt;&#10;&lt;p&gt;The idea is simple - I have a 60 minute weekly slot that anyone can book through &lt;a href="https://calendly.com/temikus/officehours"&gt;calendly&lt;/a&gt; and we can do anything of the following via videochat:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Helping people with non-IT/CS backgrounds get into the industry.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Because we all stand on the shoulders of giants and I’m not an exception. I came to IT with no background and am largely self-taught, but I couldn’t do it without a lot of help from some wonderful folks ( Hi Nat! 👋).&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Assisting OSS projects with CI/CD, Monitoring and Infrastructure.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Because I ❤️ OpenSource and maintain a couple of projects w/associated infra myself.&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Talking about anything that you think is “Ops” / “DevOps” or “Site Reliability Engineering”.&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Since I work for a large company, there’s a small disclaimer:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;All opinions expressed during the chats are my own and are not connected with my employer.&lt;/li&gt;&#10;&lt;li&gt;I reserve a right to decline certain questions/topics at my discretion.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Please sign up! &lt;a href="https://calendly.com/temikus"&gt;https://calendly.com/temikus&lt;/a&gt;&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/gcp-ssh-autocomplete-with-fzf-and-zsh</id><title>GCP SSH autocomplete with FZF and ZSH</title><link rel="alternate" type="text/html" href="http://temikus.net/gcp-ssh-autocomplete-with-fzf-and-zsh/"/><published>2019-09-08T00:00:00Z</published><updated>2019-09-08T00:00:00Z</updated><content type="html">&lt;p&gt;I got inspired by &lt;a href="http://engineering.affectv.com/aws/devops/2018/08/15/fzf-autocompletions/"&gt;AffectV post on AWS SSH completion&lt;/a&gt; and decided to write something similar for GCP.&lt;/p&gt;&#10;&lt;p&gt;Here’s the end result:&lt;br&gt;&#10;&lt;a href="https://asciinema.org/a/266685"&gt;&lt;img src="/images/gcp-ssh-autocomplete-with-fzf-and-zsh-0.svg" alt="asciicast" loading="lazy"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h1 id="prerequisites"&gt;Prerequisites&lt;/h1&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;You use &lt;a href="https://www.zsh.org/"&gt;zsh&lt;/a&gt; as your main shell&lt;/li&gt;&#10;&lt;li&gt;You have &lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt; and its &lt;a href="https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh"&gt;completion&lt;/a&gt; set up&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h1 id="writing-the-module"&gt;Writing the module&lt;/h1&gt;&#10;&lt;p&gt;First, we need to figure out how to get the list of information we want. &lt;code&gt;gcloud&lt;/code&gt; provides a somewhat sensible formatting and filtering options for that, e.g. if I want to get the name, zone and external IP of the instance in a flat tab-separated table, we’ll have to set options like so:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ gcloud compute instances list \&#10; --format=&amp;#34;table[no-heading](name,zone,status,networkInterfaces[0].accessConfigs[0].natIP)&amp;#34; \&#10; --filter=&amp;#34;status=RUNNING&amp;#34;&#10;my-web-v37r australia-southeast1-c RUNNING XX.XXX.XX.XX&#10;my-web-wp2d australia-southeast1-c RUNNING XX.XXX.XX.XX&#10;my-worker-b96q australia-southeast1-c RUNNING XX.XXX.XX.XX&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Perfect.&lt;/p&gt;&#10;&lt;p&gt;Note: if you want to add more information to your default output, you can use &lt;code&gt;gcloud compute instances list --format=flattened&lt;/code&gt; to figure out what fields you need.&lt;/p&gt;&#10;&lt;p&gt;Now, let’s create a dummy ssh function so we don’t mess with default autocomplete and don’t put a latency penalty on autocompleting the regular &lt;code&gt;ssh&lt;/code&gt; command:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;gssh()&#10;{&#10; ssh $@&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Next, we’ll need to write a FZF completion module. For that, we’ll need to write a function &lt;code&gt;_fzf_complete_$YOURCOMMAND&lt;/code&gt;, following one of &lt;a href="https://github.com/junegunn/fzf/wiki/Examples-%28completion%29"&gt;FZF examples&lt;/a&gt;, e.g.:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;_fzf_complete_gssh() {&#10; ARGS=&amp;#34;$@&amp;#34;&#10; local machines&#10; machines=$(gcloud compute instances list \&#10; --format=&amp;#34;table[no-heading](name,zone,status,networkInterfaces[0].accessConfigs[0].natIP)&amp;#34; \&#10; --filter=&amp;#34;status=RUNNING&amp;#34;)&#10; if [[ $ARGS == &amp;#39;gssh &amp;#39;* ]]; then&#10; _fzf_complete &amp;#34;--reverse --multi&amp;#34; &amp;#34;$@&amp;#34; &amp;lt; &amp;lt;(&#10; echo $machines&#10; )&#10; else&#10; eval &amp;#34;zle ${fzf_default_completion:-expand-or-complete}&amp;#34;&#10; fi&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, we need to tell FZF what to pass back to the executable once completion has been selected. In our case, we want the instance’s external IP, so we select the 4th column using &lt;code&gt;awk&lt;/code&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;_fzf_complete_gssh_post() {&#10; awk &amp;#39;{print $4}&amp;#39;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="putting-it-all-together"&gt;Putting it all together&lt;/h1&gt;&#10;&lt;p&gt;Here’s how our module looks like:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;gssh()&#10;{&#10; ssh $@&#10;}&#10;&#10;_fzf_complete_gssh() {&#10; ARGS=&amp;#34;$@&amp;#34;&#10; local machines&#10; machines=$(gcloud compute instances list \&#10; --format=&amp;#34;table[no-heading](name,zone,status,networkInterfaces[0].accessConfigs[0].natIP)&amp;#34; \&#10; --filter=&amp;#34;status=RUNNING&amp;#34;)&#10; if [[ $ARGS == &amp;#39;gssh &amp;#39;* ]]; then&#10; _fzf_complete &amp;#34;--reverse --multi&amp;#34; &amp;#34;$@&amp;#34; &amp;lt; &amp;lt;(&#10; echo $machines&#10; )&#10; else&#10; eval &amp;#34;zle ${fzf_default_completion:-expand-or-complete}&amp;#34;&#10; fi&#10;}&#10;&#10;_fzf_complete_gssh_post() {&#10; awk &amp;#39;{print $4}&amp;#39;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The only thing we need to do is to paste it into our &lt;code&gt;.zshrc&lt;/code&gt; (or include it using your favourite plugin manager) and we’re good to go.&lt;/p&gt;&#10;&lt;p&gt;Just type &lt;code&gt;gssh **&lt;/code&gt;, and then press TAB.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/st3-remove-sublime-merge-from-sidebar</id><title>ST3 - Remove Sublime Merge from Sidebar</title><link rel="alternate" type="text/html" href="http://temikus.net/st3-remove-sublime-merge-from-sidebar/"/><published>2019-06-12T00:00:00Z</published><updated>2019-06-12T00:00:00Z</updated><content type="html">&lt;p&gt;Sublime Text 3 is my casual editor of choice.&lt;/p&gt;&#10;&lt;p&gt;They recently started pushing &lt;a href="https://www.sublimemerge.com/"&gt;SublimeMerge&lt;/a&gt; which is a GUI Git Client. I’m a fan of &lt;a href="https://git-fork.com/"&gt;Fork&lt;/a&gt; so I’m not really keen on the cluttering the context menu with things I won’t use.&lt;/p&gt;&#10;&lt;p&gt;I figured out how to remove them and hope the instructions may help others.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Install &lt;a href="https://packagecontrol.io/packages/PackageResourceViewer"&gt;PackageResourceViewer&lt;/a&gt; package&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Type a sublime prompt command (Cmd/Ctrl + P):&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;PackageResourceViewer: Open Resource&#10;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Choose &lt;code&gt;Default&lt;/code&gt; -&amp;gt; &lt;code&gt;Side Bar.sublime-menu&lt;/code&gt;&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;You can now edit the context menu and trim the unneeded options. For example:&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; [&#10; { &amp;#34;caption&amp;#34;: &amp;#34;New File&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;new_file_at&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;dirs&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;Rename…&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;rename_path&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;paths&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;Delete File&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;delete_file&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;files&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;Open Containing Folder…&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;open_containing_folder&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;files&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;Reveal Link Source&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;reveal_link_source&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;dirs&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;-&amp;#34;, &amp;#34;id&amp;#34;: &amp;#34;repo_commands&amp;#34; },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;New Folder…&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;new_folder&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;dirs&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;Delete Folder&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;delete_folder&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;dirs&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;Find in Folder…&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;find_in_folder&amp;#34;, &amp;#34;args&amp;#34;: {&amp;#34;dirs&amp;#34;: []} },&#10; { &amp;#34;caption&amp;#34;: &amp;#34;-&amp;#34;, &amp;#34;id&amp;#34;: &amp;#34;end&amp;#34; }&#10;]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Happy hacking!&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/tip-automatically-avoid-putting-gce-instances-into-ssh-known_hosts</id><title>Tip: ssh `Match exec` and config for cloud instances</title><link rel="alternate" type="text/html" href="http://temikus.net/tip-automatically-avoid-putting-gce-instances-into-ssh-known_hosts/"/><published>2019-04-13T00:00:00Z</published><updated>2019-04-13T00:00:00Z</updated><content type="html">&lt;p&gt;If you work a lot with ephemeral instances you will eventually run into this message:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#10;@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @&#10;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&#10;IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Today I learned about &lt;code&gt;Match exec&lt;/code&gt; config option in &lt;code&gt;~/.ssh/config&lt;/code&gt; which allows you to set certain options depending on custom command results.&lt;/p&gt;&#10;&lt;p&gt;Since all GCE external IP’s are routed through google LB’s, which resolve to &lt;code&gt;*.bc.googleusercontent.com&lt;/code&gt;, we can use that to our advantage to disable recording GCE instances into &lt;code&gt;known_hosts&lt;/code&gt; by putting the following into &lt;code&gt;~/.ssh/config&lt;/code&gt;:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# Do not record GCE instances into known_hosts file&#10;Match exec &amp;#34;nslookup %h | grep &amp;#39;bc.googleusercontent.com&amp;#39;&amp;#34;&#10; UserKnownHostsFile none&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I hope others may find this useful too!&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/terraform-acme-provider-full-chain-certificates</id><title>Terraform ACME provider full chain certificates</title><link rel="alternate" type="text/html" href="http://temikus.net/terraform-acme-provider-full-chain-certificates/"/><published>2019-03-01T00:00:00Z</published><updated>2019-03-01T00:00:00Z</updated><content type="html">&lt;p&gt;After rearchitecting my Concourse setup a bit to shard web workers I’ve noticed that fly stopped connecting:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ fly login -t fog --concourse-url https://ci.saragosa.tv:443 (1)&#10;logging in to team &amp;#39;main&amp;#39;&#10;&#10;could not reach the Concourse server called fog:&#10;&#10; Get https://ci.saragosa.tv:443/api/v1/info: x509: certificate signed by unknown authority&#10;&#10;is the targeted Concourse running? better go catch it lol&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Which was surprising to me since WebUI was working without any issues and I was getting green checks on the security tab of Chrome’s “Developer tools”&lt;/p&gt;&#10;&lt;p&gt;The important bit here is that I was using Terraform to generate acme certificates and pass them into GCP’s HTTPS LB:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;resource &amp;#34;google_compute_ssl_certificate&amp;#34; &amp;#34;ci&amp;#34; {&#10; name = &amp;#34;my-ci-project-${random_id.generation.hex}&amp;#34;&#10; private_key = &amp;#34;${acme_certificate.ci.private_key_pem}&amp;#34;&#10; certificate = &amp;#34;${acme_certificate.ci.certificate_pem}&amp;#34;&#10;&#10; lifecycle {&#10; create_before_destroy = true&#10; }&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After some digging I’ve found &lt;a href="https://github.com/concourse/concourse/issues/2133"&gt;this issue&lt;/a&gt;. Turns out that whatever lib &lt;code&gt;fly&lt;/code&gt; is using to verify the certificates requires full chain of trust to be present. Surely enough running &lt;a href="https://www.ssllabs.com/ssltest/analyze.html"&gt;SSLabs&lt;/a&gt; on my domain showed:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Certificates provided 1 (1367 bytes)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Chain issues Incomplete&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Turns out &lt;code&gt;acme_certificate.certificate_pem&lt;/code&gt; doesn’t produce a full chain certificate. Fortunately we can simply concatenate it like so:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;resource &amp;#34;google_compute_ssl_certificate&amp;#34; &amp;#34;ci&amp;#34; {&#10; ...&#10; certificate = &amp;#34;${acme_certificate.ci.certificate_pem}${acme_certificate.ci.issuer_pem}&amp;#34;&#10; ...&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;After a brief &lt;code&gt;terraform apply&lt;/code&gt; SSLabs showed:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Certificates provided 2 (2541 bytes)&#10;Chain issues None&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And &lt;code&gt;fly&lt;/code&gt; was once again working correctly. Hope this helps someone if they run into same issues.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/ansible-gcp-dynamic-inventory-2-0</id><title>Ansible  -  GCP dynamic inventory 2.0</title><link rel="alternate" type="text/html" href="http://temikus.net/ansible-gcp-dynamic-inventory-2-0/"/><published>2019-02-22T00:00:00Z</published><updated>2019-02-22T00:00:00Z</updated><content type="html">&lt;p&gt;The GCP module for Ansible has recently been updated to not rely on &lt;code&gt;libcloud&lt;/code&gt; but the docs still continue to be &lt;a href="https://docs.ansible.com/ansible/latest/plugins/inventory/gcp_compute.html"&gt;slightly confusing&lt;/a&gt;, so I’m publishing a new article on how to set up Ansible GCP dynamic inventory.&lt;/p&gt;&#10;&lt;p&gt;As &lt;a href="https://svbtle.com/ansible-gcp-dynamic-inventory-bootstrap"&gt;last time&lt;/a&gt; this assumes you already have:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ansible installed (version &amp;gt;= 2.7)&lt;/li&gt;&#10;&lt;li&gt;A working python installation&lt;/li&gt;&#10;&lt;li&gt;Have a service account with Compute Engine API access&lt;/li&gt;&#10;&lt;li&gt;Exported a JSON key in Credentials subsection of your console&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;First, install “requests” and “google-auth” packages.&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;pip install requests google-auth&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note: if you use Homebrew, you may need to install the module via the built-in python installation that Ansible uses, e.g.:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ ansible --version | grep &amp;#34;python.*location&amp;#34;&#10;&#10;ansible python module location = /usr/local/Cellar/ansible/2.7.8/libexec/lib/python3.7/site-packages/ansible&#10;&#10;λ /usr/local/Cellar/ansible/2.7.8/libexec/bin/pip install requests google-auth&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Then, create an inventory file ending in ‘gcp.yml’, e.g.:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ cat inventory.gcp.yml&#10;---&#10;plugin: gcp_compute&#10;projects:&#10; - my-project&#10;zones:&#10; - &amp;#34;europe-west1-b&amp;#34;&#10;filters: []&#10;auth_kind: serviceaccount&#10;service_account_file: &amp;#34;/Users/temikus/.gcp/project.json&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note: I higly recommend setting the &lt;code&gt;zones:&lt;/code&gt; parameter as otherwise the inventory script enumerates all existing zones which takes a considerable amount of time.&lt;/p&gt;&#10;&lt;p&gt;And boom, now we can control our instances with Ansible:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ ansible -i inventory.gcp.yml all -m ping&#10;&#10;34.76.50.119 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;</content></entry><entry><id>tag:temikus.net,2014:Post/reading-large-files-in-ruby</id><title>Reading large files in Ruby</title><link rel="alternate" type="text/html" href="http://temikus.net/reading-large-files-in-ruby/"/><published>2019-02-17T00:00:00Z</published><updated>2019-02-17T00:00:00Z</updated><content type="html">&lt;p&gt;I needed to slurp up some very large files into a ruby app recently and noticed some interesting behaviour in &lt;code&gt;IO.foreach&lt;/code&gt; method.&lt;/p&gt;&#10;&lt;p&gt;While it is supposed to read file line by line without loading it up into memory, memory usage is quite significant compared to reading the files via an offset (&lt;code&gt;IO.read&lt;/code&gt;).&lt;/p&gt;&#10;&lt;h1 id="investigation"&gt;Investigation&lt;/h1&gt;&#10;&lt;p&gt;10 MB test file:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;λ ls -alh xaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r--@ &lt;span class="m"&gt;1&lt;/span&gt; temikus staff 9.5M Feb &lt;span class="m"&gt;18&lt;/span&gt; 11:24 xaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Test script:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env ruby&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;benchmark/memory&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="no"&gt;BUFFER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4096&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="no"&gt;Benchmark&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;foreach&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;line&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;stream.read&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;until&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eof?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;BUFFER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare!&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;IO.foreach&lt;/code&gt; is using 20x memory:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;λ ./cat_compare.rb xaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Calculating -------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; foreach 200.008M memsize &lt;span class="o"&gt;(&lt;/span&gt; 0.000 retained&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5.000M objects &lt;span class="o"&gt;(&lt;/span&gt; 0.000 retained&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1.000 strings &lt;span class="o"&gt;(&lt;/span&gt; 0.000 retained&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stream.read 10.111M memsize &lt;span class="o"&gt;(&lt;/span&gt; 0.000 retained&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2.443k objects &lt;span class="o"&gt;(&lt;/span&gt; 0.000 retained&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2.000 strings &lt;span class="o"&gt;(&lt;/span&gt; 0.000 retained&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Comparison:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; stream.read: &lt;span class="m"&gt;10110978&lt;/span&gt; allocated&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; foreach: &lt;span class="m"&gt;200008424&lt;/span&gt; allocated - 19.78x more&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I remembered that the ruby Garbage Collector is working on “mark-and-sweep” principle. The “mark” stage checks objects to see if they are still in use. If an object is in a variable that &lt;strong&gt;can still be used in the current scope&lt;/strong&gt;, the object (and any object inside that object) is &lt;strong&gt;marked for keeping&lt;/strong&gt;. If the variable is long gone, off in another method, the object isn’t marked. The “sweep” stage then frees objects which haven’t been marked.&lt;/p&gt;&#10;&lt;p&gt;That could explain it, so I decided to test that theory by putting a small GC ticker in, running &lt;code&gt;GC.start&lt;/code&gt; every 100 000 lines:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; tick = 1&#10;&#10; File.foreach(ARGV[0]) do |line|&#10; line&#10; tick +=1&#10; GC.start if tick % 100000 == 0&#10; end&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Surely enough memory footprint has rapidly decreased:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;temikus λ ./cat_compare.rb xaa&#10;Calculating -------------------------------------&#10; foreach 8.424k memsize ( 0.000 retained)&#10; 1.000 objects ( 0.000 retained)&#10; 0.000 strings ( 0.000 retained)&#10; stream.read 10.111M memsize ( 0.000 retained)&#10; 2.443k objects ( 0.000 retained)&#10; 2.000 strings ( 0.000 retained)&#10;&#10;Comparison:&#10; foreach: 8424 allocated&#10; stream.read: 10110978 allocated - 1200.26x more&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;However, calling GC explicitly does give a time penalty:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;foreach 0.716403 0.004597 0.721000 ( 0.722513)&#10;stream.read 0.004264 0.003208 0.007472 ( 0.007474)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;&#10;&lt;p&gt;If you need to work with large files (&amp;gt;200MB) and read them line-by-line in Ruby, it’s better to read them in chunks via &lt;code&gt;IO.read(CHUNK_SIZE)&lt;/code&gt;. Best &lt;code&gt;CHUNK_SIZE&lt;/code&gt; is usually one that matches a memory page size on your system (often 4KB) as that ensures that OS is efficiently reading the file into memory.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;Addendum:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;All tests performed on Ruby 2.6.1&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html"&gt;Old (written by _why!) but still useful article about Ruby’s GC details&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/ansible-bootstrap-python</id><title>Ansible - Bootstrap python</title><link rel="alternate" type="text/html" href="http://temikus.net/ansible-bootstrap-python/"/><published>2018-09-09T00:00:00Z</published><updated>2018-09-09T00:00:00Z</updated><content type="html">&lt;p&gt;When you’re starting hosts from scratch, you can avoid preinstalling python in your image or startup scripts by issuing a &lt;code&gt;raw&lt;/code&gt; command in ansible in a &lt;code&gt;pre_tasks&lt;/code&gt; section. This doesn’t require python to be available on the remote host, effectively bootstrapping it to continue with the playbook.&lt;/p&gt;&#10;&lt;p&gt;Here’s an example for debian-based hosts:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;- hosts: my_host&#10; remote_user: my_user&#10; become: yes&#10; gather_facts: false&#10;&#10; pre_tasks:&#10; - name: Bootsrap Python2 for Ansible&#10; raw: bash -c &amp;#34;test -e /usr/bin/python || (apt -qqy update &amp;amp;&amp;amp; apt install -qqy python-minimal)&amp;#34;&#10; register: output&#10; changed_when: output.stdout != &amp;#34;&amp;#34;&#10; - name: Gathering Facts&#10; setup: # Also known as gather_facts&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note: &lt;code&gt;gather_facts&lt;/code&gt; is set to false since some advanced facts require running python code on the remote host, hence we disable it in the beginning and then re-run it using &lt;code&gt;setup:&lt;/code&gt;&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/retrieving-gce-metadata-map</id><title>Retrieving GCE metadata map</title><link rel="alternate" type="text/html" href="http://temikus.net/retrieving-gce-metadata-map/"/><published>2018-07-07T00:00:00Z</published><updated>2018-07-07T00:00:00Z</updated><content type="html">&lt;p&gt;&lt;a href="https://cloud.google.com/compute/docs/storing-retrieving-metadata"&gt;GCE metadata&lt;/a&gt; can be a useful tool for getting the information about the running instance.&lt;/p&gt;&#10;&lt;p&gt;One needs to know exactly where to look for a particular key however. For that, the metadata actually supports a &lt;code&gt;?recursive=true&lt;/code&gt; parameter, returning a json of all the data available.&lt;/p&gt;&#10;&lt;p&gt;Observe:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# Quick helper function to pretty print JSON &#10;$ alias to_j=&amp;#34;ruby -e \&amp;#34;require &amp;#39;json&amp;#39;;puts JSON.pretty_generate(JSON.parse(STDIN.read))\&amp;#34;&amp;#34;&#10;&#10;$ curl -s http://metadata/computeMetadata/v1/instance/?recursive=true -H &amp;#34;Metadata-Flavor: Google&amp;#34; | to_j&#10;{&#10; &amp;#34;attributes&amp;#34;: {&#10; },&#10; &amp;#34;cpuPlatform&amp;#34;: &amp;#34;Intel Broadwell&amp;#34;,&#10; &amp;#34;description&amp;#34;: &amp;#34;&amp;#34;,&#10; &amp;#34;disks&amp;#34;: [&#10; {&#10; &amp;#34;deviceName&amp;#34;: &amp;#34;persistent-disk-0&amp;#34;,&#10; &amp;#34;index&amp;#34;: 0,&#10; &amp;#34;mode&amp;#34;: &amp;#34;READ_WRITE&amp;#34;,&#10; &amp;#34;type&amp;#34;: &amp;#34;PERSISTENT-SSD&amp;#34;&#10; }&#10; ],&#10; &amp;#34;hostname&amp;#34;: &amp;#34;vagrant-test.c.graphite-sandbox.internal&amp;#34;,&#10; &amp;#34;id&amp;#34;: 77747111415725975,&#10; &amp;#34;image&amp;#34;: &amp;#34;projects/ubuntu-os-cloud/global/images/ubuntu-1804-bionic-v20180617&amp;#34;,&#10; &amp;#34;licenses&amp;#34;: [&#10; {&#10; &amp;#34;id&amp;#34;: &amp;#34;7777592092274602096&amp;#34;&#10; }&#10; ],&#10; &amp;#34;machineType&amp;#34;: &amp;#34;projects/1086402177777/machineTypes/n1-standard-1&amp;#34;,&#10; &amp;#34;maintenanceEvent&amp;#34;: &amp;#34;NONE&amp;#34;,&#10; &amp;#34;name&amp;#34;: &amp;#34;vagrant-elastic&amp;#34;,&#10; &amp;#34;networkInterfaces&amp;#34;: [&#10; {&#10; &amp;#34;accessConfigs&amp;#34;: [&#10; {&#10; &amp;#34;externalIp&amp;#34;: &amp;#34;35.189.77.77&amp;#34;,&#10; &amp;#34;type&amp;#34;: &amp;#34;ONE_TO_ONE_NAT&amp;#34;&#10; }&#10; ],&#10; &amp;#34;dnsServers&amp;#34;: [&#10; &amp;#34;169.254.169.254&amp;#34;&#10; ],&#10; &amp;#34;forwardedIps&amp;#34;: [&#10;&#10; ],&#10; &amp;#34;gateway&amp;#34;: &amp;#34;10.7.0.1&amp;#34;,&#10; &amp;#34;ip&amp;#34;: &amp;#34;10.7.0.7&amp;#34;,&#10; &amp;#34;ipAliases&amp;#34;: [&#10;&#10; ],&#10; &amp;#34;mac&amp;#34;: &amp;#34;42:77:0a:98:77:77&amp;#34;,&#10; &amp;#34;network&amp;#34;: &amp;#34;projects/1086402177777/networks/default&amp;#34;,&#10; &amp;#34;subnetmask&amp;#34;: &amp;#34;255.255.240.0&amp;#34;,&#10; &amp;#34;targetInstanceIps&amp;#34;: [&#10;&#10; ]&#10; }&#10; ],&#10; &amp;#34;preempted&amp;#34;: &amp;#34;FALSE&amp;#34;,&#10; &amp;#34;remainingCpuTime&amp;#34;: -1,&#10; &amp;#34;scheduling&amp;#34;: {&#10; &amp;#34;automaticRestart&amp;#34;: &amp;#34;TRUE&amp;#34;,&#10; &amp;#34;onHostMaintenance&amp;#34;: &amp;#34;MIGRATE&amp;#34;,&#10; &amp;#34;preemptible&amp;#34;: &amp;#34;FALSE&amp;#34;&#10; },&#10; &amp;#34;serviceAccounts&amp;#34;: {&#10; },&#10; &amp;#34;tags&amp;#34;: [&#10;&#10; ],&#10; &amp;#34;virtualClock&amp;#34;: {&#10; &amp;#34;driftToken&amp;#34;: &amp;#34;0&amp;#34;&#10; },&#10; &amp;#34;zone&amp;#34;: &amp;#34;projects/1086402177777/zones/australia-southeast1-c&amp;#34;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;</content></entry><entry><id>tag:temikus.net,2014:Post/ansible-gcp-dynamic-inventory-bootstrap</id><title>Ansible - GCP Dynamic inventory bootstrap</title><link rel="alternate" type="text/html" href="http://temikus.net/ansible-gcp-dynamic-inventory-bootstrap/"/><published>2018-06-11T00:00:00Z</published><updated>2018-06-11T00:00:00Z</updated><content type="html">&lt;h1 id="ansible-gcp-module-bootstrap"&gt;Ansible GCP module bootstrap&lt;/h1&gt;&#10;&lt;p&gt;&lt;a href="https://docs.ansible.com/ansible/2.4/guide_gce.html"&gt;The official docs&lt;/a&gt; on Ansible GCP module are quite a bit confusing, so I’ve decided to publish some steps to quickly bootstrap a working environment.&lt;/p&gt;&#10;&lt;p&gt;Main concept is that Ansible can not only use static files as a source of inventory but also execute a script and use it’s output as an in-memory representation of it. This allows us to make dynamic inventories to load up hosts from your cloud provider, for example. And, conveniently, there’s such a script in the Ansible’s &lt;code&gt;contrib&lt;/code&gt; directory named &lt;code&gt;gce.py&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;This assumes you already have:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ansible installed&lt;/li&gt;&#10;&lt;li&gt;A working python installation&lt;/li&gt;&#10;&lt;li&gt;Have a service account with Compute Engine API access&lt;/li&gt;&#10;&lt;li&gt;Exported a JSON key in &lt;a href="https://console.cloud.google.com/apis/credentials"&gt;Credentials subsection&lt;/a&gt; of your console&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Here are quick bootstrap instructions on how to get it working:&lt;/p&gt;&#10;&lt;p&gt;Install libcloud and libcrypto:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ pip install apache-libcloud pycrypto&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Create a working dir:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ mkdir -p ansible/inventory &amp;amp;&amp;amp; cd ansible&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Clone ansible repo:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ git clone https://github.com/ansible/ansible&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Copy the gcp.py inventory script and the gcp.ini template from contrib folder:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ cp ansible/contrib/inventory/gce.* inventory&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Populate the .ini file (this is where &lt;code&gt;gce.py&lt;/code&gt; will read its’ settings from):&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ cat ~/.ansible/gce.ini&#10;&#10;[gce]&#10;gce_service_account_email_address = my-account@my-project.iam.gserviceaccount.com&#10;gce_service_account_pem_file_path = /full/path/to/my_key.json&#10;gce_project_id = my-project&#10;&#10;[inventory]&#10;# Use external IP addresses to connect&#10;inventory_ip_type = external&#10;&#10;[cache]&#10;cache_path = ~/.ansible/tmp&#10;cache_max_age = 300&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can move it into your home directory and exporting the variable in your .zshrc for future ease-of-use:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ cat ~/.zshrc | grep gce.ini&#10; # Export ansible gce.ini&#10; [[ -s &amp;#34;$HOME/.ansible/gce.ini&amp;#34; ]] &amp;amp;&amp;amp; export GCE_INI_PATH=&amp;#34;$HOME/.ansible/gce.ini&amp;#34;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Reload your shell and check if it’s working:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ source ~/.zshrc&#10;λ ./inventory/gce.py --list&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If you’ve received a large set of output with your instance data - it’s now set up correctly.&lt;/p&gt;&#10;&lt;p&gt;Boom, now you can access your instances by zone:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ ansible -i inventory australia-southeast1-c -m ping&#10;web-worker-3 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;web-worker-1 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;web-worker-2 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;master | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;, or tag. For that just prepend the network tag name with &lt;code&gt;tag_&lt;/code&gt;, i.e. for &lt;code&gt;web-worker&lt;/code&gt; tag:&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;λ ansible -i inventory tag_web-worker -m ping&#10;web-worker-3 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;web-worker-1 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;web-worker-2 | SUCCESS =&amp;gt; {&#10; &amp;#34;changed&amp;#34;: false,&#10; &amp;#34;ping&amp;#34;: &amp;#34;pong&amp;#34;&#10;}&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;For more options and further reading, check out &lt;a href="https://docs.ansible.com/ansible/2.4/guide_gce.html"&gt;the official module docs&lt;/a&gt;. Hope it’s helpful!&lt;/p&gt;&#10;&lt;p&gt;Materials used:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://medium.com/vimeo-engineering-blog/orchestrating-gce-instances-with-ansible-d825a33793cd"&gt;Orchestrating GCE Instances with Ansible&lt;/a&gt; by folks at Vimeo&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://docs.ansible.com/ansible/2.4/guide_gce.html"&gt;Official Ansible Documentation&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-08-07-2017</id><title>What’s making me happy 08-07-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-08-07-2017/"/><published>2017-07-08T00:00:00Z</published><updated>2017-07-08T00:00:00Z</updated><content type="html">&lt;p&gt;It’s been a while since I wrote one of those - need to keep on track.&lt;/p&gt;&#10;&lt;p&gt;USA trip turned out to be a success - got a ton of work done, did quite a bit of progress on my projects, met with dear friends. Nevertheless, I’m very-very happy to return back to Sydney. Missed it (and more importantly Cassie) a whole lot.&lt;/p&gt;&#10;&lt;p&gt;Continuing trying to figure out my allergies. Waiting for the blood panel results, new medication seems to be working a bit better &lt;em&gt;*knocks on wood*&lt;/em&gt;. Even though there’s no substantial progress in figuring out what it is, it’s still feels good to not be standing still.&lt;/p&gt;&#10;&lt;p&gt;Got quite a chuckle out of Louis Rossman’s &lt;a href="https://youtu.be/yswp0Bio4Oo"&gt;review&lt;/a&gt; of the Surface Laptop construction: “You have to heat gun the laptop… If they included graphics chips in there - it’s now a two-for-one repair!”&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.danslimmon.com/2017/06/30/cap-your-ticket-backlog/"&gt;Cap your ticket backlog&lt;/a&gt; is an interesting article on keeping the list of work items short and some ideas how to address it. It is refreshing to see a different perspective on backlogs rather than “close it all and if it’s important - they’ll return”.&lt;/p&gt;&#10;&lt;p&gt;Started playing &lt;a href="http://www.metacritic.com/game/3ds/the-legend-of-zelda-a-link-between-worlds"&gt;Zelda: A Link between worlds&lt;/a&gt; - which is a twist on “A Link to the past”, with incredibly refreshing 2D-&amp;gt;3D gameplay mechanics. Can highly recommend to other 3DS owners.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://www.metacritic.com/game/playstation-4/persona-5"&gt;Persona 5&lt;/a&gt; did not dissapoint - fantastic artwork and visuals, great music and entertaining gameplay. My only nitpick is localization - it’s good, but not great.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-18-06-2017</id><title>What’s making me happy 18-06-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-18-06-2017/"/><published>2017-06-18T00:00:00Z</published><updated>2017-06-18T00:00:00Z</updated><content type="html">&lt;p&gt;Visiting NorCal and Seattle area over the past 2 weeks, it’s been nice to visit some of my old friends. Those moments, although brief do warm my heart.&lt;/p&gt;&#10;&lt;p&gt;Took some time walking around Stanford. The Dish trail turned out to be a great walk.&lt;br&gt;&#10;&lt;a href="/images/full/cm8ufkbcxm4kq.jpg"&gt;&lt;img src="/images/what-s-making-me-happy-18-06-2017-0.jpg" alt="19146149_10209709636086184_430125816262029059_n.jpg" loading="lazy"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Watched &lt;a href="http://www.hamiltonbroadway.com/"&gt;Hamilton&lt;/a&gt; in SF with my good friend Ben - it is indeed a great and very modern musical. Can highly recommend it.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.mopop.org/"&gt;Museum of Pop Culture&lt;/a&gt; in Seattle turned out to be a very unexpected gem. It’s a great collection of Music, Sci-Fi and other memorabilia. Their Guitar exhibition alone is worth it.&lt;/p&gt;&#10;&lt;p&gt;Visited &lt;a href="http://fremontfair.com/"&gt;Fremont Fair&lt;/a&gt; over the weekend - a very quirky Art fair with a nice vibe to it. Didn’t buy anything but it was nice to stroll around and take in the atmosphere.&lt;/p&gt;&#10;&lt;p&gt;New installment of Fire Emblem series is out with &lt;a href="http://www.nintendo.com/games/detail/fire-emblem-echoes-shadows-of-valentia-3ds"&gt;Fire Emblem: Echoes&lt;/a&gt; - already got a copy - can’t wait to play it!&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.humblebundle.com/sekai-project-bundle"&gt;Humble Bundle - Sekai Project&lt;/a&gt; is out. A bunch of great VN’s for a good price. There is a bit of filler there of course, but it’s worth it for the gems like WORLD END ECONOMiCA alone (same writer as Spice&amp;amp;Wolf).&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.bradfieldcs.com/you-are-not-google-84912cf44afb"&gt;You Are Not Google&lt;/a&gt; is a good article spelling out some good questions that you need to ask yourself before using certain design patterns.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-05-06-2017</id><title>What’s making me happy 05-06-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-05-06-2017/"/><published>2017-06-05T00:00:00Z</published><updated>2017-06-05T00:00:00Z</updated><content type="html">&lt;p&gt;Post is almost on time if you count in PST :D&lt;/p&gt;&#10;&lt;p&gt;Started running again for the first time in 5 months - it was only 2k and my time wasn’t the best, but it feels so good to get back in the game.&lt;/p&gt;&#10;&lt;p&gt;Went to Jenolan caves over the previous weekend - amazing cave system with a lot of stuff to explore in the Blue Mountains&lt;br&gt;&#10;&lt;a href="/images/full/diqehfza4ea6dq.jpg"&gt;&lt;img src="/images/what-s-making-me-happy-05-06-2017-0.jpg" alt="jenolan-karst-12.jpg" loading="lazy"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Cassie introduced me to &lt;a href="http://www.spawnpoint.com.au/"&gt;Spawn Point&lt;/a&gt;, which turned out to be a cosy geeky bar in central Sydney. Much alcohol-fueled Mario Kart ensued.&lt;/p&gt;&#10;&lt;p&gt;Holy cow, it actually happened - &lt;a href="http://www.metacritic.com/game/playstation-4/utawarerumono-mask-of-deception"&gt;Utawarerumono: Mask of Deception&lt;/a&gt; is out in English. It’s a strange combination of a Visual Novel and a tactical RPG but the story is excellent. Playing/Watching &lt;a href="https://www.gamefaqs.com/pc/571565-utawarerumono"&gt;the first one&lt;/a&gt; is highly recommended before starting this one.&lt;/p&gt;&#10;&lt;p&gt;Discovered &lt;a href="http://store.steampowered.com/app/94400/Nidhogg/"&gt;Nidhogg&lt;/a&gt; - a fast-paced multiplayer fighting arcade with beautiful retro visuals and fast responsive mechanics.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://infiniteundo.com/post/25326999628/falsehoods-programmers-believe-about-time"&gt;Falsehoods programmers believe about time&lt;/a&gt; is an oldie, but I still find it hilarious.&lt;/p&gt;&#10;&lt;p&gt;Got an &lt;a href="http://skysolutionsusa.com/product/anti-fatigue-comfort-mat/"&gt;anti-fatigue&lt;/a&gt; mat for my standing desk time at work - made a surprisingly huge difference in my ability to work standing up. I can churn out a couple of hours per day without much issues now, where before I had sore feet after 2-ish hours.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-14-05-2017</id><title>What’s making me happy 14-05-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-14-05-2017/"/><published>2017-05-10T00:00:00Z</published><updated>2017-05-10T00:00:00Z</updated><content type="html">&lt;p&gt;Saw Green Day in concert this week, they really know how to put on a show, enjoyed it immensely.&lt;br&gt;&#10;&lt;a href="/images/full/g82puyq9urs3wq.jpg"&gt;&lt;img src="/images/what-s-making-me-happy-14-05-2017-0.jpg" alt="IMG_0553.JPG" loading="lazy"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Took a drive out to Newcastle with Cassie, stopping by the 7-mile beach and Caves beach on our way. It was a nice day trip to get away from it all.&lt;br&gt;&#10;&lt;a href="/images/full/uzhxlybqigb4w.jpg"&gt;&lt;img src="/images/what-s-making-me-happy-14-05-2017-1.jpg" alt="2017-05-12.jpg" loading="lazy"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;Finished &lt;a href="https://en.wikipedia.org/wiki/Uncharted_3:_Drake%27s_Deception"&gt;Uncharted 3&lt;/a&gt; this week. Still feels more like an interactive movie than a game but the story is excellent. I’m a sucker for Indiana Jones-like mysteries.&lt;/p&gt;&#10;&lt;p&gt;Found a better allergy specialist to continue figuring out my allergy (or whatever it is) situation. Progress is very slow but any progress on this front makes me happy.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://m.signalvnoise.com/sleep-deprivation-is-not-a-badge-of-honor-f24fbff47a75"&gt;“Sleep deprivation is not a badge of honor”&lt;/a&gt; is a good writeup on why it’s bad to give up sleep by DHH. So many good quotes from the article, but I’ll pick one:&lt;br&gt;&#10;“Software development is rarely a sprint, but mostly a marathon. … trying to extract 110% performance from today when that means having only 70% performance available tomorrow is a bad deal. You end up with just 77% of your available peak. Bad trade.”&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-07-05-2017</id><title>What’s making me happy 07-05-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-07-05-2017/"/><published>2017-05-07T00:00:00Z</published><updated>2017-05-07T00:00:00Z</updated><content type="html">&lt;p&gt;Went hiking to Uloola Falls this weekend - was the first truly lengthy hike since my arrival in Australia, feels good to be back in the game.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/tootsuite/mastodon"&gt;Mastodon&lt;/a&gt; is another distributed social network which seems to be taking off a bit better than Diaspora. Interesting to see how they’ll fare in the long run.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://classroom.udacity.com/courses/ud615"&gt;Scalable Microservices with Kubernetes&lt;/a&gt; is a great course on the foundations of Kubernetes held by Kelsea Hightower, who’s a fantastic teacher in my experience.&lt;/p&gt;&#10;&lt;p&gt;Great keynote on &lt;a href="https://www.youtube.com/watch?v=eSaFVX4izsQ"&gt;Jepsen by Kyle Kingsbury&lt;/a&gt;. I frequent the Aphyr blog but watching Kyle’s talks is, in my opinion, much more entertaining and digestible. This is one of the more useful talks I’ve seen this year.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://blog.danslimmon.com/2017/04/28/lets-stop-pretending-estimates-are-exact/"&gt;A great post on estimates by Dan Slimmon&lt;/a&gt; describing how to do more humane project management. Nothing new if you’ve been a PM for a long time and liked statistics in Uni, but I cannot say true to either of those so found it useful.&lt;/p&gt;&#10;&lt;p&gt;Remote to my &lt;a href="https://www.evolveskateboards.com.au/collections/bamboo-gt-series"&gt;Evolve GT board&lt;/a&gt; is finally fixed so I’m back to crusining around. My trip on Saturday was full of detours to escape traffic but boy, was it fun.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-30-04-2017</id><title>What’s making me happy 30-04-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-30-04-2017/"/><published>2017-04-30T00:00:00Z</published><updated>2017-04-30T00:00:00Z</updated><content type="html">&lt;p&gt;New #happy post, even if a bit late :-P&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://ernie.io/2014/12/17/humane-development/"&gt;Humane Development&lt;/a&gt;&lt;br&gt;&#10;“… sitting a butt in a chair does not magically produce work …” A good article combining some common-sense idioms about software work. I don’t agree with all points wholeheartedly but the main point is solid.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.wealthsimple.com/en-us/magazine/money-diary-anthony-bourdain"&gt;Interesting post&lt;/a&gt; in Wealth Simple about Anthony Bourdain, showing a bit of an insight to making money in publishing business (spoiler: it’s hard).&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://birdcheese.tumblr.com/page/12"&gt;BirdCheese&lt;/a&gt; is an absolutely adorable art blog focusing mostly on birds.&lt;/p&gt;&#10;&lt;p&gt;Picked up &lt;a href="http://www.metacritic.com/game/playstation-4/bioshock-the-collection"&gt;BioShock Remastered&lt;/a&gt; as I’ve failed to play it earlier but the style looked fascinating so I decided to give it another go. Did not disappoint.&lt;/p&gt;&#10;&lt;p&gt;Picked up &lt;a href="http://a.co/7POmLTY"&gt;Max Frei&lt;/a&gt; again, this is about the 5th time I’m re-reading the entire series of books and it somehow continues to be equally entertaining.&lt;/p&gt;&#10;&lt;p&gt;Finally visited &lt;a href="https://taronga.org.au/taronga-zoo"&gt;Taronga Zoo&lt;/a&gt;. First time seeing a Kangaroo live, I have to admit, even though I’ve lived in Australia since September.&lt;/p&gt;&#10;</content></entry><entry><id>tag:temikus.net,2014:Post/what-s-making-me-happy-23-04-2017</id><title>What’s making me happy 23-04-2017</title><link rel="alternate" type="text/html" href="http://temikus.net/what-s-making-me-happy-23-04-2017/"/><published>2017-04-23T00:00:00Z</published><updated>2017-04-23T00:00:00Z</updated><content type="html">&lt;p&gt;I wanted to follow &lt;a href="https://writing.natwelch.com/"&gt;Nat’s&lt;/a&gt; example for a while, so here we go! This is a collection of small things that made me happy this week. Hopefully those posts will provide some inspiration to others and allow me to better reflect on myself.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://paw.cloud/"&gt;Paw&lt;/a&gt; is the most advanced API tool I’ve seen so far, it looks like a very good candidate to replace Postman in my tool belt.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://codewords.recurse.com/issues/five/what-restful-actually-means"&gt;What RESTful actually means&lt;/a&gt; - interesting article on what makes an API RESTful in practice.&lt;/p&gt;&#10;&lt;p&gt;I’m delighted to see that Casey Neistat’s &lt;a href="https://www.youtube.com/user/caseyneistat"&gt;VLOG&lt;/a&gt; is back. I find him very inspirational - watching his insane drive makes me want to do more with my life.&lt;/p&gt;&#10;&lt;p&gt;After 9 long years since the last chapter of the series, &lt;a href="http://atlus.com/persona5/"&gt;Persona 5&lt;/a&gt; is finally out, can’t wait to play it!&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.youtube.com/playlist?list=PLuAOJfsMefuej06Q3n4QrSSC7qYjQ-FlU"&gt;Sword Art Online abridged&lt;/a&gt; came to a close with Ep.11. It’s a great parody series and one of the examples where parody (in my opinion, anyway) surpasses the original.&lt;/p&gt;&#10;</content></entry></feed>