<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>cnandreu</title><description>Carlos Andreu&apos;s blog: self-hosting, media infrastructure, and building things that outlive the weekend they were started.</description><link>https://cnandreu.com/</link><item><title>Playing Sea of Stars on My Mac with GameHub</title><link>https://cnandreu.com/posts/gaming-on-mac-with-gamehub/</link><guid isPermaLink="true">https://cnandreu.com/posts/gaming-on-mac-with-gamehub/</guid><description>How I got Sea of Stars (a game with no native Mac version) running at 1080p/60fps on macOS using GameHub, plus when it&apos;s worth reaching for.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I wanted to play &lt;a href=&quot;https://store.steampowered.com/app/1244090/Sea_of_Stars/&quot; rel=&quot;noopener noreferrer&quot;&gt;Sea of Stars&lt;/a&gt; on my Mac and hit the usual wall: there’s no native Mac version. It ships on Windows, Switch, PlayStation, and Xbox, and there’s even an iPhone and iPad build on the App Store, but nothing for the Mac desktop. In the past that would have been the end of it, and I’d have gone off to boot up another machine.&lt;/p&gt;
&lt;p&gt;This time I tried &lt;a href=&quot;https://www.gamemac.com/en/&quot; rel=&quot;noopener noreferrer&quot;&gt;GameHub&lt;/a&gt; instead, and it just worked.&lt;/p&gt;
&lt;h2 id=&quot;what-gamehub-is&quot;&gt;What GameHub is&lt;/h2&gt;
&lt;p&gt;GameHub is a free (currently public beta) Mac app that runs Windows games on macOS. Under the hood it leans on a &lt;a href=&quot;https://www.winehq.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Wine&lt;/a&gt;-style translation layer, so the Windows game thinks it’s talking to Windows while everything gets translated to what your Mac actually speaks. You don’t have to know any of that to use it. You install the app, sign into Steam from inside it, and launch your game like you would anywhere else.&lt;/p&gt;
&lt;p&gt;There are some nice touches around it too: per-game compatibility profiles, a Metal HUD so you can watch your frame rate, and multi-account Steam support with cloud saves.&lt;/p&gt;
&lt;h2 id=&quot;how-sea-of-stars-ran&quot;&gt;How Sea of Stars ran&lt;/h2&gt;
&lt;p&gt;Better than I expected. I set it to 1080p, and it held a steady 60fps the whole way through with no fiddling. No stutters, no missing textures, no crash-on-launch dance. If you handed me the Mac without telling me what was going on, I wouldn’t have guessed the game had no business running on it.&lt;/p&gt;
&lt;p&gt;The other thing that made this painless was Steam cloud saves. I played the Steam version, so my save file followed me everywhere. I could put the Mac down, pick up my Steam Deck, later poke at it from GameHub on Android or my Windows PC, and always land right where I left off. Switching devices mid-playthrough is the kind of thing that sounds minor until you actually rely on it.&lt;/p&gt;
&lt;h2 id=&quot;where-it-fits-and-where-it-doesnt&quot;&gt;Where it fits (and where it doesn’t)&lt;/h2&gt;
&lt;p&gt;I want to be clear about the scope here. I didn’t throw something like &lt;a href=&quot;https://www.cyberpunk.net/&quot; rel=&quot;noopener noreferrer&quot;&gt;Cyberpunk 2077&lt;/a&gt; at it, because for heavy games I have a gaming PC and consoles and I’d rather use them. That’s the right tool for that job.&lt;/p&gt;
&lt;p&gt;Where GameHub shines is the quick session: visual novels, older titles, cozy RPGs, indie games (anything that doesn’t need a ton of horsepower). When the itch to play something is small and the game is Windows-only, spinning up GameHub beats digging out another device.&lt;/p&gt;
&lt;h2 id=&quot;worth-a-try&quot;&gt;Worth a try&lt;/h2&gt;
&lt;p&gt;If there’s a game you’ve been wanting to play and it skipped the Mac, give &lt;a href=&quot;https://www.gamemac.com/en/&quot; rel=&quot;noopener noreferrer&quot;&gt;GameHub&lt;/a&gt; a shot before you write it off. It’s free to try, setup took me a few minutes, and worst case the game doesn’t run well and you’ve lost nothing. For me it turned a “guess I can’t” into an evening with Sea of Stars, and that’s a pretty good trade.&lt;/p&gt;</content:encoded><category>gaming</category></item><item><title>Hello, world</title><link>https://cnandreu.com/posts/hello-world/</link><guid isPermaLink="true">https://cnandreu.com/posts/hello-world/</guid><description>Why this blog exists, and the stack that runs it: Astro on Cloudflare&apos;s edge, built and shipped from a self-hosted Forgejo.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every good homelab eventually grows a blog. This is mine, a place for long-form
notes on the media stack I run, the small tools I build around it, and whatever
I’m learning along the way.&lt;/p&gt;
&lt;h2 id=&quot;why-bother&quot;&gt;Why bother&lt;/h2&gt;
&lt;p&gt;Most of what I figure out lives in scattered scripts, commit messages, and my own
memory. Writing it down forces the ideas to hold together, and occasionally it
helps someone else running into the same wall. That’s the whole pitch.&lt;/p&gt;
&lt;h2 id=&quot;how-its-built&quot;&gt;How it’s built&lt;/h2&gt;
&lt;p&gt;The site is intentionally boring in the best way: static files served from the
edge, with no server to babysit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://astro.build&quot; rel=&quot;noopener noreferrer&quot;&gt;Astro&lt;/a&gt;&lt;/strong&gt;: content-first, ships zero JavaScript by
default, and renders Markdown into fast static HTML.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Workers + Static Assets&lt;/strong&gt;: the built site is served straight from
Cloudflare’s edge on the free plan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted &lt;a href=&quot;https://forgejo.org&quot; rel=&quot;noopener noreferrer&quot;&gt;Forgejo&lt;/a&gt; + CI&lt;/strong&gt;: writing a post is a
&lt;code&gt;git push&lt;/code&gt;; CI runs the quality gate and deploys with &lt;code&gt;wrangler&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Catppuccin&lt;/strong&gt;: Latte in the light, Mocha in the dark, following your system
preference (with a toggle if you disagree).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Publishing really is just this:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;just&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; &quot;My next post&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;   # scaffold the folder + frontmatter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;# ...write...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;git&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; push&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;                  # CI builds and deploys to cnandreu.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;
&lt;p&gt;More posts, mostly. If you want to follow along, grab the
&lt;a href=&quot;/rss.xml&quot;&gt;RSS feed&lt;/a&gt;. If you want to argue with me, that’s what
&lt;a href=&quot;https://x.com/cnandreu&quot; rel=&quot;noopener noreferrer&quot;&gt;X&lt;/a&gt; is for.&lt;/p&gt;
&lt;p&gt;Thanks for reading.&lt;/p&gt;</content:encoded><category>dev</category><category>homelab</category></item><item><title>Improving Quality with Story Points</title><link>https://cnandreu.com/posts/improving-quality-with-story-points/</link><guid isPermaLink="true">https://cnandreu.com/posts/improving-quality-with-story-points/</guid><description>Why story point estimates go wrong (cognitive biases and group effects) and a story point &apos;tax&apos; to drive quality upward.</description><pubDate>Wed, 18 Mar 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-are-story-points&quot;&gt;What are story points&lt;/h2&gt;
&lt;p&gt;Story points are unit-less numbers based on the relative time and effort to complete a software development task. These numbers are typically not linear; for example, you pick between numbers in the Fibonacci sequence (e.g. 1, 2, 3, 5, 8, 13, …). These numbers are only meaningful to a specific team. They cannot be used to compare teams.&lt;/p&gt;
&lt;p&gt;Let’s imagine we’re building a web application for reading and sending emails. A team of developers would split the task of developing said application into distinct high-level chunks, typically called Stories. One of those pieces could be “Ability to compose new emails”. Let’s also assume that this particular team has not changed and previously worked on a similar feature for a bulletin board application, labeled “Ability to compose new threads”. They could estimate it would take the same amount of time and effort again (i.e. “5”). Alternatively, they can estimate a bit less (i.e. “3”) if they take into account code reuse and previous experience, or a bit more because their estimate for the similar feature was too low (i.e. “8”).&lt;/p&gt;
&lt;p&gt;The team would work on several of these development tasks and come up with their velocity (i.e. “30”), meaning the number of story points they can complete in a period of time (e.g. every two work-weeks). The ideal case is that eventually this process will give the team a way of estimating how much work they can take on for said period of time. Everyone gets a chance to vote on a number for a particular work item without looking at others’ votes. They also have the opportunity to try to convince their peers that their number is the right choice.&lt;/p&gt;
&lt;h2 id=&quot;whats-wrong&quot;&gt;What’s wrong&lt;/h2&gt;
&lt;p&gt;It turns out that software engineers are notoriously bad at estimating. Agile methodologies bring development teams this idea of story points in order to mitigate that, but in my experience there’s room for improvement.&lt;/p&gt;
&lt;p&gt;We can try to find some answers by looking at the cognitive branch of psychology. It studies how people think, including decision making and problem solving. Specifically, there’s a list of cognitive biases to which we are all generally vulnerable.&lt;/p&gt;
&lt;p&gt;One of these tendencies to think in a certain way is Rosy Retrospection, which is remembering the past better than it actually was. For example, psychologists interviewed three groups going on different vacations before, during, and after their journeys. Most followed the pattern of initial anticipation, followed by mild disappointment. Generally, most subjects some time later reviewed the events more favorably than they actually experienced them.&lt;/p&gt;
&lt;p&gt;Just like that one, there are many others that deal with how we perceive and think about the past. Consistency Bias is incorrectly remembering one’s past attitudes and behavior as resembling present attitudes and behavior. Hindsight Bias is the inclination to see events that have already occurred as being more predictable than they were before they took place. There’s also Egocentric Bias, which is recalling the past in a self-serving manner. For example, remembering one’s code as higher quality than it actually was.&lt;/p&gt;
&lt;p&gt;There are also issues linked to working with groups. An example is the Next-in-Line Effect, which means that a person in a group has diminished recall for the words of others who spoke immediately before or after this person. There’s also the Bandwagon Effect, which is the tendency to do (or believe) things because many other people do (or believe) the same.&lt;/p&gt;
&lt;p&gt;A popular paper by cognitive psychologist George A. Miller cites that the number of objects an average human can hold in working memory is 7 ± 2. This is one of the bases for David Allen’s Getting Things Done time management method to improve productivity. The idea is that you can’t keep many things in your mind at the same time, and you should be writing them down somewhere for future processing.&lt;/p&gt;
&lt;p&gt;My takeaway from all of this is that a team will likely remember past events incorrectly, assuming these events were more obvious and predictable than they were. Trying to mitigate this with group discussions will likely introduce another set of biases, such as remembering a subset of what was said and agreeing with the majority. Meanwhile, everyone’s mind is only able to keep track of a small subset of considerations, even assuming the best-case scenario where the whole team is focusing all their mental bandwidth on a single activity.&lt;/p&gt;
&lt;h2 id=&quot;the-goal&quot;&gt;The goal&lt;/h2&gt;
&lt;p&gt;The best-case scenario so far is high consistency: fairly good estimates for about the same quality of work. My goal is to factor in a way of getting higher quality while preserving reasonably consistent estimates over time.&lt;/p&gt;
&lt;h2 id=&quot;possible-solution-story-point-tax&quot;&gt;Possible solution: story point tax&lt;/h2&gt;
&lt;p&gt;Let’s list all the items that could impact the amount of time and effort it takes to finish a particular piece of work. Some examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stability of the build or continuous integration system.&lt;/li&gt;
&lt;li&gt;Existing unit test coverage.&lt;/li&gt;
&lt;li&gt;Expense of writing tests.&lt;/li&gt;
&lt;li&gt;Support-related issues.&lt;/li&gt;
&lt;li&gt;Time to merge into the release branch.&lt;/li&gt;
&lt;li&gt;Known vs unknown problem domain.&lt;/li&gt;
&lt;li&gt;Third-party dependencies.&lt;/li&gt;
&lt;li&gt;Legal work.&lt;/li&gt;
&lt;li&gt;Documentation work.&lt;/li&gt;
&lt;li&gt;Context switching.&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea is to assign some points, or fractions of a point, to all of these issues. Some are task-specific (i.e. legal work) while others can apply to every task (i.e. build health).&lt;/p&gt;
&lt;p&gt;For example, imagine a team is inheriting legacy code with low test coverage and lengthy or hard-to-run tests. Everyone on that development team will likely see a negative impact on their time and effort. It means the system could break more easily or require a lot of manual, time-consuming testing to finish their work item correctly, thus lowering productivity. At some point, when test coverage improves, the “tax” or expense to productivity is lowered for that particular item.&lt;/p&gt;
&lt;p&gt;Having this list beforehand prevents relying on the team’s mental bandwidth to account for all of these issues. As the team strives to lower this “tax”, the overall quality of the product should increase from every perspective: planners, developers, and stakeholders. Also, having more data would likely translate to a positive impact on estimate accuracy.&lt;/p&gt;
&lt;p&gt;The past-related biases are somewhat mitigated in the sense that the team would keep said list frequently up to date. A quick example would be a not-so-frequent yet painful task that is partially forgotten and then later badly remembered because a list like the one above was not kept. One specific example would be the expense of tackling a new problem domain at the start of a release: “It wasn’t that hard to learn all that new terminology”.&lt;/p&gt;
&lt;p&gt;Having all team members individually and anonymously collaborate on the items that should be on the list and the “tax” amounts will likely help deal with the group-based biases. Because the initial list is not generated in an open discussion, it’s less likely most people will flock towards what the most vocal members of the team think should be there.&lt;/p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Try to supplement story points with a list of things (taxes) that negatively impact performance. Let the whole team initially collaborate individually and anonymously on said list, and keep it frequently up to date. Supplement it with group discussions. Use it to help drive quality. For example: “More stories could get done if we had better test coverage, so let’s improve test coverage. Did test coverage improve? Yes, lower its tax value.”&lt;/p&gt;</content:encoded><category>engineering</category></item><item><title>Goodbye AppFog, Hello DigitalOcean</title><link>https://cnandreu.com/posts/goodbye-appfog-hello-digital-ocean/</link><guid isPermaLink="true">https://cnandreu.com/posts/goodbye-appfog-hello-digital-ocean/</guid><description>Moving my blog to a $5 DigitalOcean droplet and setting up WordPress on nginx, PHP, and MySQL from scratch.</description><pubDate>Tue, 12 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I decided I wanted a bit more control over my blog, and my own custom domain (&lt;code&gt;cnandreu.com&lt;/code&gt;). Soon after, I remembered a benchmark post comparing &lt;a href=&quot;https://www.digitalocean.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;DigitalOcean&lt;/a&gt; and &lt;a href=&quot;https://www.linode.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Linode&lt;/a&gt; I saw a few months back. The article concluded DigitalOcean provided great bang for the buck, so I decided to try it. I’ll go a bit into the logistics of setting up a WordPress blog there.&lt;/p&gt;
&lt;h2 id=&quot;specs&quot;&gt;Specs&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;DigitalOcean&lt;/a&gt; is a &lt;a href=&quot;https://en.wikipedia.org/wiki/Virtual_private_server&quot; rel=&quot;noopener noreferrer&quot;&gt;Virtual Private Server&lt;/a&gt; (VPS) provider. It basically provides the hardware to host your own virtual machine. Their cheapest plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$5/month&lt;/li&gt;
&lt;li&gt;1 Core&lt;/li&gt;
&lt;li&gt;20GB SSD Storage&lt;/li&gt;
&lt;li&gt;512 MB Memory&lt;/li&gt;
&lt;li&gt;1TB Transfer&lt;/li&gt;
&lt;li&gt;99.99% Uptime&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-months-free&quot;&gt;2 months free&lt;/h2&gt;
&lt;p&gt;I found a coupon code online for a $10 credit (i.e. 2 months free). When you sign up, click to add a credit card and then apply the following code: &lt;strong&gt;OMGSSD10&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;pick-a-droplet&quot;&gt;Pick a Droplet&lt;/h2&gt;
&lt;p&gt;Amazon EC2 calls them Instances; DigitalOcean calls them Droplets. It’s just a virtual machine running on their hardware.&lt;/p&gt;
&lt;p&gt;I installed 32-bit &lt;a href=&quot;https://ubuntu.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Ubuntu&lt;/a&gt; 12.04 LTS. I picked that one because I’m already familiar with the operating system. There was no need to go with the 64-bit version because my plan only gives me half a gigabyte of RAM. It also seemed like a good idea to go with an LTS (Long Term Support) release for a server. Some of the articles I link below target 12.04 as well.&lt;/p&gt;
&lt;h2 id=&quot;initial-setup&quot;&gt;Initial setup&lt;/h2&gt;
&lt;p&gt;DigitalOcean’s &lt;a href=&quot;https://www.digitalocean.com/community/articles/initial-server-setup-with-ubuntu-12-04&quot; rel=&quot;noopener noreferrer&quot;&gt;initial server setup guide&lt;/a&gt; describes some initial configuration: how to log into the droplet via SSH, change the root password, create a new user, give the new user sudo privileges, and optionally configure SSH.&lt;/p&gt;
&lt;h2 id=&quot;fail2ban&quot;&gt;Fail2Ban&lt;/h2&gt;
&lt;p&gt;They also have an article that explains how to set up &lt;a href=&quot;https://www.digitalocean.com/community/articles/how-to-protect-ssh-with-fail2ban-on-ubuntu-12-04&quot; rel=&quot;noopener noreferrer&quot;&gt;Fail2Ban&lt;/a&gt;. This is useful because it will help prevent attackers from &lt;a href=&quot;https://en.wikipedia.org/wiki/Brute-force_attack&quot; rel=&quot;noopener noreferrer&quot;&gt;brute forcing&lt;/a&gt; your password.&lt;/p&gt;
&lt;h2 id=&quot;nginx-php-and-mysql&quot;&gt;nginx, PHP, and MySQL&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Nginx&quot; rel=&quot;noopener noreferrer&quot;&gt;nginx&lt;/a&gt; (pronounced “engine x”) is an open source web server and reverse proxy server for HTTP, SMTP, POP3, and IMAP protocols, with a strong focus on high concurrency, performance, and low memory usage. &lt;a href=&quot;https://en.wikipedia.org/wiki/PHP&quot; rel=&quot;noopener noreferrer&quot;&gt;PHP&lt;/a&gt; is a popular programming language for web applications. &lt;a href=&quot;https://en.wikipedia.org/wiki/MySQL&quot; rel=&quot;noopener noreferrer&quot;&gt;MySQL&lt;/a&gt; is a popular relational database manager.&lt;/p&gt;
&lt;p&gt;Their &lt;a href=&quot;https://www.digitalocean.com/community/articles/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-12-04&quot; rel=&quot;noopener noreferrer&quot;&gt;LEMP stack guide&lt;/a&gt; explains how to set up those technologies. Together they form the software stack that will run &lt;a href=&quot;https://wordpress.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;WordPress&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;wordpress&quot;&gt;WordPress&lt;/h2&gt;
&lt;p&gt;Now that you have an HTTP server (nginx), a programming language (PHP), and a database (MySQL), you can follow the &lt;a href=&quot;https://www.digitalocean.com/community/articles/how-to-install-wordpress-with-nginx-on-ubuntu-12-04&quot; rel=&quot;noopener noreferrer&quot;&gt;WordPress on nginx guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;sequel-pro-or-phpmyadmin&quot;&gt;Sequel Pro or phpMyAdmin&lt;/h2&gt;
&lt;p&gt;If you want to see the data inside your MySQL database, I recommend &lt;a href=&quot;https://www.sequelpro.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Sequel Pro&lt;/a&gt;. Mac only (sorry, Windows and Linux users). Non-Mac users may want to read the &lt;a href=&quot;https://www.digitalocean.com/community/articles/how-to-install-phpmyadmin-on-a-lemp-server/&quot; rel=&quot;noopener noreferrer&quot;&gt;phpMyAdmin on LEMP guide&lt;/a&gt;; it explains how to set up the web-based MySQL database viewer called &lt;a href=&quot;https://www.phpmyadmin.net/&quot; rel=&quot;noopener noreferrer&quot;&gt;phpMyAdmin&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>homelab</category></item><item><title>My Favorite Mac Apps</title><link>https://cnandreu.com/posts/favorite-mac-apps/</link><guid isPermaLink="true">https://cnandreu.com/posts/favorite-mac-apps/</guid><description>A tour of the Mac apps I used daily in 2013: package managers, editors, media apps, and utilities worth installing.</description><pubDate>Mon, 05 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are many great tools out there for Macs. In this post I’ll go over some I use often. I highly recommend you try them if you haven’t already.&lt;/p&gt;
&lt;h2 id=&quot;package-manager-homebrew&quot;&gt;Package Manager: Homebrew&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://brew.sh/&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew&lt;/a&gt; is a package manager for Mac, similar to &lt;code&gt;apt-get&lt;/code&gt; and &lt;code&gt;yum&lt;/code&gt; on Linux boxes. The installation instructions amount to running a command from their main site. To install applications simply type &lt;code&gt;brew install [app_name]&lt;/code&gt;. To update packages run &lt;code&gt;brew update&lt;/code&gt; and &lt;code&gt;brew upgrade&lt;/code&gt;. If you run into issues, &lt;code&gt;brew doctor&lt;/code&gt; may point you in the right direction by showing common issues found on your system.&lt;/p&gt;
&lt;h2 id=&quot;shell-fish&quot;&gt;Shell: Fish&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/posts/fish-shell/&quot;&gt;Fish Shell&lt;/a&gt; is basically a bash replacement with out-of-the-box colors, autosuggestions, man page integration, among other features.&lt;/p&gt;
&lt;h2 id=&quot;spotlight-replacement-alfred&quot;&gt;Spotlight Replacement: Alfred&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.alfredapp.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Alfred&lt;/a&gt; is Spotlight on steroids. I recommend going into &lt;code&gt;System Preferences&lt;/code&gt; &gt; &lt;code&gt;Keyboard&lt;/code&gt; &gt; &lt;code&gt;Keyboard Shortcuts&lt;/code&gt; &gt; &lt;code&gt;Spotlight&lt;/code&gt; and unchecking &lt;code&gt;Show Spotlight Searchfield - Command + Space&lt;/code&gt;. Then open Alfred, go into Preferences (&lt;code&gt;Command + ,&lt;/code&gt;), General tab, and pick &lt;code&gt;Command + Space&lt;/code&gt; for Alfred’s hotkey.&lt;/p&gt;
&lt;p&gt;Besides searching for applications, you can search for files by typing a single quote before the file name. For example &lt;code&gt;&apos;move.mov&lt;/code&gt;. Pressing the Right Arrow key will show more options like &lt;code&gt;Reveal in Finder&lt;/code&gt; and &lt;code&gt;Open With…&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;By default &lt;code&gt;Option + Command + C&lt;/code&gt; will show you things that have been on your clipboard. You can change settings for this feature in Alfred’s Preferences under the &lt;code&gt;Clipboard&lt;/code&gt; feature.&lt;/p&gt;
&lt;h2 id=&quot;music-spotify&quot;&gt;Music: Spotify&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.spotify.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Spotify&lt;/a&gt; has an amazing music library. I no longer miss the days of searching high and low for an album I wanted to listen to, or going to YouTube to get my music fix. There’s a free version with ads, but this is a service worth paying for.&lt;/p&gt;
&lt;h2 id=&quot;notes-evernote&quot;&gt;Notes: Evernote&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://evernote.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Evernote&lt;/a&gt; is a note-taking application that has clients for iOS and Android devices. I always use it to store notes when I travel (flights, hotels, places to see, etc.) and just general notes.&lt;/p&gt;
&lt;h2 id=&quot;backup-dropbox&quot;&gt;Backup: Dropbox&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.dropbox.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Dropbox&lt;/a&gt; will give you up to 16GB of free space after inviting your friends. Since my music, videos, emails, and code live in the cloud, there’s not a lot to back up. Dropbox is great for storing pictures taken from your mobile phone (they have an app for Android and iOS) and random files.&lt;/p&gt;
&lt;h2 id=&quot;finder-replacement-xtrafinder&quot;&gt;Finder Replacement: XtraFinder&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.trankynam.com/xtrafinder/&quot; rel=&quot;noopener noreferrer&quot;&gt;XtraFinder&lt;/a&gt; is basically what Finder should be. My favorite features are tabs, folders on top (instead of mixing files and folders), and the ability to cut and paste files and folders.&lt;/p&gt;
&lt;h2 id=&quot;password-manager-1password&quot;&gt;Password Manager: 1Password&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://1password.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;1Password&lt;/a&gt; password-protects my passwords and private notes. It’s not free, but there are free alternatives like &lt;a href=&quot;https://www.dashlane.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Dashlane&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;source-control-git&quot;&gt;Source Control: Git&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Git&lt;/a&gt; is an amazing version control system. You can learn the basics in about 15 minutes.&lt;/p&gt;
&lt;h2 id=&quot;code-hosting-bitbucket&quot;&gt;Code Hosting: Bitbucket&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Bitbucket&lt;/a&gt; is a great place to store your code in the cloud. Unlike &lt;a href=&quot;https://github.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub&lt;/a&gt;, they give you unlimited private repositories for free.&lt;/p&gt;
&lt;h2 id=&quot;git-graphical-user-interface-sourcetree&quot;&gt;Git Graphical User Interface: SourceTree&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sourcetreeapp.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;SourceTree&lt;/a&gt; is really useful when you need a better, nay, graphical view of the history and changes in a git repository. A good non-free alternative is &lt;a href=&quot;https://www.git-tower.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Git Tower&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;markdown-editor-mou&quot;&gt;Markdown Editor: Mou&lt;/h2&gt;
&lt;p&gt;Mou is the best Markdown editor I’ve ever used. I highly recommend playing around with the themes. If you’re anything like me, you’ll find it more calming to write with a dark background. You can also enable &lt;code&gt;Check spelling as I type&lt;/code&gt; in the options to mitigate typos.&lt;/p&gt;
&lt;h2 id=&quot;chat-client-adium&quot;&gt;Chat Client: Adium&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://adium.im/&quot; rel=&quot;noopener noreferrer&quot;&gt;Adium&lt;/a&gt; is basically Pidgin with a Mac look and feel. It’s compatible with AIM, MSN, Jabber, Yahoo, IRC, and many others. If you’re only looking for an IRC client I recommend &lt;a href=&quot;http://colloquy.info/&quot; rel=&quot;noopener noreferrer&quot;&gt;Colloquy&lt;/a&gt; instead.&lt;/p&gt;
&lt;h2 id=&quot;tv-netflix&quot;&gt;TV: Netflix&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://netflix.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Netflix&lt;/a&gt; needs no introduction. It does for TV shows and movies what Spotify does for music. If you don’t mind ads, check out &lt;a href=&quot;https://www.hulu.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Hulu&lt;/a&gt;. If you have &lt;a href=&quot;https://www.amazon.com/gp/prime&quot; rel=&quot;noopener noreferrer&quot;&gt;Amazon Prime&lt;/a&gt; you also have access to their streaming video service, Amazon Instant Video. You can also buy videos from the &lt;a href=&quot;https://play.google.com/store&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Play Store&lt;/a&gt; and the Apple iTunes Store.&lt;/p&gt;
&lt;h2 id=&quot;twitter-client-tweetbot&quot;&gt;Twitter Client: Tweetbot&lt;/h2&gt;
&lt;p&gt;Tweetbot is by far the best Twitter client for desktops, but it’s not free. TweetDeck is a good free alternative.&lt;/p&gt;
&lt;h2 id=&quot;text-editor-sublime-text-2&quot;&gt;Text Editor: Sublime Text 2&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sublimetext.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Sublime Text 2&lt;/a&gt; is a very extensible text editor. The first thing I always install is &lt;a href=&quot;https://packagecontrol.io/&quot; rel=&quot;noopener noreferrer&quot;&gt;Sublime Package Control&lt;/a&gt;. Here are some packages worth checking out: &lt;a href=&quot;https://github.com/dz0ny/LiveReload-sublimetext2&quot; rel=&quot;noopener noreferrer&quot;&gt;LiveReload&lt;/a&gt;, &lt;a href=&quot;https://github.com/Kronuz/SublimeCodeIntel&quot; rel=&quot;noopener noreferrer&quot;&gt;SublimeCodeIntel&lt;/a&gt;, &lt;a href=&quot;https://github.com/SublimeLinter/SublimeLinter&quot; rel=&quot;noopener noreferrer&quot;&gt;SublimeLinter&lt;/a&gt; (&lt;a href=&quot;https://gist.github.com/cnandreu/5235745&quot; rel=&quot;noopener noreferrer&quot;&gt;my settings&lt;/a&gt;), and &lt;a href=&quot;https://github.com/SublimeText/TrailingSpaces&quot; rel=&quot;noopener noreferrer&quot;&gt;TrailingSpaces&lt;/a&gt;. You can enable vi mode and get &lt;a href=&quot;https://en.wikipedia.org/wiki/Vi&quot; rel=&quot;noopener noreferrer&quot;&gt;vi&lt;/a&gt; goodness in your editor.&lt;/p&gt;
&lt;h2 id=&quot;mail-client-sparrow&quot;&gt;Mail Client: Sparrow&lt;/h2&gt;
&lt;p&gt;Sparrow is a lightweight desktop email client. It’s always a keyboard shortcut away, &lt;code&gt;option+/&lt;/code&gt; in my case. A cheaper alternative is AirMail. There’s a cool little application called &lt;a href=&quot;https://fluidapp.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Fluid&lt;/a&gt; that lets you treat web applications like desktop applications, for those that like their email client’s web interface but still want it outside a browser context.&lt;/p&gt;
&lt;h2 id=&quot;image-editor-photoshop&quot;&gt;Image Editor: Photoshop&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.photoshop.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Photoshop&lt;/a&gt; is Adobe’s answer to editing pictures, and it’s expensive. &lt;a href=&quot;https://www.gimp.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;GIMP&lt;/a&gt; is a good free alternative.&lt;/p&gt;
&lt;h2 id=&quot;image-sharing-cloudapp&quot;&gt;Image Sharing: CloudApp&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://getcloudapp.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;CloudApp&lt;/a&gt; sits in your menu bar and waits for you to &lt;a href=&quot;https://www.wikihow.com/Take-a-Screenshot-in-Mac-OS-X&quot; rel=&quot;noopener noreferrer&quot;&gt;take screenshots&lt;/a&gt;. When it detects a screenshot has been taken, it uploads it to the cloud and stores it on one of their &lt;a href=&quot;https://aws.amazon.com/s3/&quot; rel=&quot;noopener noreferrer&quot;&gt;Amazon S3&lt;/a&gt; servers. The URL to the image is automatically added to your clipboard.&lt;/p&gt;
&lt;h2 id=&quot;vpn-cloak&quot;&gt;VPN: Cloak&lt;/h2&gt;
&lt;p&gt;Almost every time I travel I download Cloak. It’s a VPN application for Mac and iOS devices. It automatically encrypts your traffic when connected to an unsecured WiFi network.&lt;/p&gt;
&lt;h2 id=&quot;uninstaller-appcleaner&quot;&gt;Uninstaller: AppCleaner&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://freemacsoft.net/appcleaner/&quot; rel=&quot;noopener noreferrer&quot;&gt;AppCleaner&lt;/a&gt; won’t just remove the &lt;code&gt;.app&lt;/code&gt; sitting in your &lt;code&gt;Applications&lt;/code&gt; folder; it will go into &lt;code&gt;/Library&lt;/code&gt; and &lt;code&gt;~/Library&lt;/code&gt; and remove any files left over.&lt;/p&gt;
&lt;h2 id=&quot;ftp-client-filezilla&quot;&gt;FTP Client: FileZilla&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://filezilla-project.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;FileZilla&lt;/a&gt; is a free FTP client that works almost everywhere. Alternatively, &lt;a href=&quot;https://cyberduck.io/&quot; rel=&quot;noopener noreferrer&quot;&gt;Cyberduck&lt;/a&gt; provides a more Mac-like UI, if you don’t mind being nagged for a donation every once in a while.&lt;/p&gt;
&lt;h2 id=&quot;diff-tool-kaleidoscope&quot;&gt;Diff Tool: Kaleidoscope&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.kaleidoscopeapp.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Kaleidoscope&lt;/a&gt; is a very Mac-like diff tool, but it’s not free. &lt;a href=&quot;https://kdiff3.sourceforge.net/&quot; rel=&quot;noopener noreferrer&quot;&gt;KDiff3&lt;/a&gt; is a good free alternative, if you don’t mind the UI.&lt;/p&gt;
&lt;h2 id=&quot;office-microsoft-office&quot;&gt;Office: Microsoft Office&lt;/h2&gt;
&lt;p&gt;Microsoft Office for Mac comes with Word, PowerPoint, and Excel. A less expensive alternative is iWork. &lt;a href=&quot;https://www.apple.com/keynote/&quot; rel=&quot;noopener noreferrer&quot;&gt;Keynote&lt;/a&gt; is way better than PowerPoint anyway. There’s also &lt;a href=&quot;https://www.libreoffice.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;LibreOffice&lt;/a&gt;, which some people may call a &lt;em&gt;free alternative&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;charts-omnigraffle&quot;&gt;Charts: OmniGraffle&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.omnigroup.com/omnigraffle/&quot; rel=&quot;noopener noreferrer&quot;&gt;OmniGraffle&lt;/a&gt; is the best application I’ve ever used for creating charts and diagrams. &lt;a href=&quot;https://moqups.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Moqups&lt;/a&gt; is a good web-based application for creating some types of diagrams. Another web-based alternative is &lt;a href=&quot;https://support.google.com/drive/answer/177123?hl=en&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Drawings&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;browser-chrome&quot;&gt;Browser: Chrome&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.google.com/chrome/canary/&quot; rel=&quot;noopener noreferrer&quot;&gt;Chrome Canary&lt;/a&gt; is Google’s bleeding-edge browser. Paul Irish wrote about &lt;a href=&quot;https://www.paulirish.com/2012/chrome-canary-for-developers/&quot; rel=&quot;noopener noreferrer&quot;&gt;Chrome Canary for developers&lt;/a&gt;; from the article: &lt;em&gt;If you do front-end web development and already use Chrome as your development browser, I encourage you to use Chrome Canary.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;to-do-reminders&quot;&gt;To Do: Reminders&lt;/h2&gt;
&lt;p&gt;If you have Mountain Lion installed (OS X 10.8) you already have Reminders.&lt;/p&gt;
&lt;h2 id=&quot;games-steam&quot;&gt;Games: Steam&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://store.steampowered.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Steam&lt;/a&gt; provides an application and a great place to buy games online. They usually have big discounts around the holidays. If you need the extra disk space, you can just delete games from disk and re-download them later from Steam’s servers. As of the time of writing there’s a &lt;a href=&quot;https://www.humblebundle.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Humble Indie Bundle&lt;/a&gt;. It’s a &lt;em&gt;pay what you want&lt;/em&gt; system for buying indie games. If you pay at least 1 USD, they’ll send a Steam key.&lt;/p&gt;
&lt;h2 id=&quot;torrents-transmission&quot;&gt;Torrents: Transmission&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://transmissionbt.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Transmission&lt;/a&gt;, for downloading all those Linux .iso files.&lt;/p&gt;
&lt;h2 id=&quot;unarchiver-the-unarchiver&quot;&gt;Unarchiver: The Unarchiver&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://itunes.apple.com/app/the-unarchiver/id425424353?mt=12&amp;#x26;ls=1&quot; rel=&quot;noopener noreferrer&quot;&gt;The Unarchiver&lt;/a&gt; will work with common formats such as Zip, RAR, 7-zip, Tar, Gzip, Bzip2, and many others.&lt;/p&gt;
&lt;h2 id=&quot;video-player-vlc&quot;&gt;Video Player: VLC&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.videolan.org/vlc/index.html&quot; rel=&quot;noopener noreferrer&quot;&gt;VLC&lt;/a&gt; will play almost every video format you throw at it.&lt;/p&gt;
&lt;h2 id=&quot;mysql-client-sequel-pro&quot;&gt;MySQL Client: Sequel Pro&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.sequelpro.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Sequel Pro&lt;/a&gt; is a beautiful UI for working with MySQL databases. It’s a refreshing experience coming from &lt;a href=&quot;https://www.phpmyadmin.net/&quot; rel=&quot;noopener noreferrer&quot;&gt;phpMyAdmin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;virtualization-virtualbox&quot;&gt;Virtualization: VirtualBox&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.virtualbox.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;VirtualBox&lt;/a&gt; is the application you want to use if you need to set up a virtual machine. There are sites like &lt;a href=&quot;https://bitnami.com/stacks&quot; rel=&quot;noopener noreferrer&quot;&gt;BitNami&lt;/a&gt; that provide already-configured virtual machines with common open source software.&lt;/p&gt;</content:encoded><category>homelab</category></item><item><title>Getting Started with Ruby on Rails</title><link>https://cnandreu.com/posts/getting-started-with-ruby-on-rails/</link><guid isPermaLink="true">https://cnandreu.com/posts/getting-started-with-ruby-on-rails/</guid><description>Resources to help a new Rails developer get started: editors, learning Ruby, the Hartl tutorial, RailsCasts, and Code School.</description><pubDate>Wed, 10 Jul 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently &lt;a href=&quot;http://cesarandreu.com/blog/&quot; rel=&quot;noopener noreferrer&quot;&gt;my brother&lt;/a&gt; got an internship at &lt;a href=&quot;http://www.treasure-data.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Treasure Data&lt;/a&gt;, a Silicon Valley startup that uses Ruby on Rails (RoR). I decided to write about a few resources to help him get started.&lt;/p&gt;
&lt;h2 id=&quot;rubymine-or-sublime-text&quot;&gt;RubyMine or Sublime Text&lt;/h2&gt;
&lt;p&gt;The quickest way to get started with Ruby on Rails is to start with a good Integrated Development Environment (IDE). You can &lt;a href=&quot;https://www.jetbrains.com/ruby/download/&quot; rel=&quot;noopener noreferrer&quot;&gt;download RubyMine&lt;/a&gt; from JetBrains. It’s from the creators of the popular Java IDE called &lt;a href=&quot;https://www.jetbrains.com/idea/&quot; rel=&quot;noopener noreferrer&quot;&gt;IntelliJ IDEA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://www.jetbrains.com/ruby/features/&quot; rel=&quot;noopener noreferrer&quot;&gt;RubyMine’s features&lt;/a&gt;. I’ll highlight a few of my favorites:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type-ahead code suggestions (helps you learn the language)&lt;/li&gt;
&lt;li&gt;Built-in debugger&lt;/li&gt;
&lt;li&gt;Code refactoring and analysis capabilities&lt;/li&gt;
&lt;li&gt;Version control integration (Git, SVN, Hg)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s not free, but there’s a 30-day trial.&lt;/p&gt;
&lt;p&gt;Alternatively, download &lt;a href=&quot;https://www.sublimetext.com/2&quot; rel=&quot;noopener noreferrer&quot;&gt;Sublime Text 2&lt;/a&gt; and watch &lt;a href=&quot;https://www.youtube.com/watch?v=05x1Jk4rT1A&quot; rel=&quot;noopener noreferrer&quot;&gt;this screencast&lt;/a&gt; for ideas regarding usage and plugins.&lt;/p&gt;
&lt;h2 id=&quot;learn-ruby&quot;&gt;Learn Ruby&lt;/h2&gt;
&lt;p&gt;RubyMonk is a fun site that helps you learn Ruby by completing various challenges. I highly recommend having some understanding of the language before diving into a big framework like Ruby on Rails.&lt;/p&gt;
&lt;h2 id=&quot;ruby-on-rails-book&quot;&gt;Ruby on Rails Book&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.railstutorial.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Ruby on Rails Tutorial&lt;/a&gt; by &lt;a href=&quot;https://www.michaelhartl.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Michael Hartl&lt;/a&gt; is simply amazing. It teaches you how to build a micro-blogging application like &lt;a href=&quot;https://twitter.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Test-driven_development&quot; rel=&quot;noopener noreferrer&quot;&gt;Test Driven Development&lt;/a&gt; (TDD) with &lt;a href=&quot;https://rspec.info/&quot; rel=&quot;noopener noreferrer&quot;&gt;RSpec&lt;/a&gt;, &lt;a href=&quot;https://git-scm.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Git&lt;/a&gt;, &lt;a href=&quot;https://github.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Github&lt;/a&gt;, &lt;a href=&quot;https://getbootstrap.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Twitter Bootstrap&lt;/a&gt;, &lt;a href=&quot;https://www.heroku.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Heroku&lt;/a&gt;, and many other useful tools, services, and concepts. There’s also a screencast available.&lt;/p&gt;
&lt;h2 id=&quot;video-tutorials&quot;&gt;Video Tutorials&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://railscasts.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;RailsCasts.com&lt;/a&gt; contains many amazing video tutorials on a myriad of different topics, from APIs to security and testing. All the screencasts are about ~15 minutes long. The author also provides notes with valuable links, plus a text-only version of each video tutorial called an ASCIIcast.&lt;/p&gt;
&lt;p&gt;I recommend starting with &lt;a href=&quot;http://railscasts.com/episodes/310-getting-started-with-rails&quot; rel=&quot;noopener noreferrer&quot;&gt;#310 Getting Started with Rails&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;CodeSchool.com has a Ruby Path with various courses, from the very basics of Ruby to more advanced best practices for developing good Rails applications.&lt;/p&gt;
&lt;h2 id=&quot;other&quot;&gt;Other&lt;/h2&gt;
&lt;p&gt;NetTuts+ has a lot of useful articles on both Ruby and Ruby on Rails.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/questions/tagged/ruby+ruby-on-rails&quot; rel=&quot;noopener noreferrer&quot;&gt;StackOverflow&lt;/a&gt; is a great place to ask questions. Make sure you provide a lot of information about your issue and what you’ve tried so far.&lt;/p&gt;</content:encoded><category>dev</category></item><item><title>Color Terminal on Mac</title><link>https://cnandreu.com/posts/color-terminal-mac/</link><guid isPermaLink="true">https://cnandreu.com/posts/color-terminal-mac/</guid><description>Add color to your Mac terminal with a .bashrc, a styled bash prompt, git branch info, and colorized ls output.</description><pubDate>Thu, 20 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I often get asked how to make the Terminal &lt;em&gt;pretty&lt;/em&gt;. Beauty is in the eye of the beholder, but hopefully this post will help you along.&lt;/p&gt;
&lt;h2 id=&quot;bashrc&quot;&gt;.bashrc&lt;/h2&gt;
&lt;p&gt;First I recommend you create a file called &lt;code&gt;.bashrc&lt;/code&gt; in your home directory if it doesn’t exist.&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;touch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In order to get OSX to pick it up you need to add the following to &lt;code&gt;.bash_profile&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt; ~&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;/.bashrc &lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;];&lt;/span&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#D20F39;--shiki-light-font-style:italic;--shiki-dark:#F38BA8;--shiki-dark-font-style:italic&quot;&gt;    source&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It’s basically saying: if &lt;code&gt;.bashrc&lt;/code&gt; exists in the home directory, load its contents.&lt;/p&gt;
&lt;h2 id=&quot;style-the-prompt&quot;&gt;Style the Prompt&lt;/h2&gt;
&lt;p&gt;Open the newly created &lt;code&gt;.bashrc&lt;/code&gt; and add the following:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt; prompt&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; WHITE&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;\[\033[1;37m\]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; GREEN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;\[\033[0;32m\]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; CYAN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;\[\033[0;36m\]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; GRAY&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;\[\033[0;37m\]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; BLUE&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;\[\033[0;34m\]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    local&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; LIGHT_RED&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;\[\033[1;31m\]&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;    export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; PS1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GRAY}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;\u&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GREEN}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${CYAN}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;\W&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GRAY}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#EA76CB;--shiki-dark:#F5C2E7&quot;&gt; \$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;(__git_ps1 &apos;(%s)&apos;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GRAY}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;$ &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;prompt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Inside the &lt;code&gt;prompt&lt;/code&gt; function a few colors have been defined (e.g. &lt;code&gt;WHITE&lt;/code&gt;, &lt;code&gt;GREEN&lt;/code&gt;). You can use these colors to style the typical &lt;code&gt;user@host ~&lt;/code&gt; message that shows up before any command is typed. For example:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; PS1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GRAY}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;\u&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GREEN}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;→&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt;${GRAY}&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Will output your username in a gray font (&lt;code&gt;${GRAY}\u&lt;/code&gt;), a green arrow (&lt;code&gt;${GREEN}→&lt;/code&gt;), and everything after the green arrow will be gray (&lt;code&gt;${GRAY}&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://ss64.com/bash/syntax-prompt.html&quot; rel=&quot;noopener noreferrer&quot;&gt;bash prompt variable reference&lt;/a&gt; lists them all (i.e. &lt;code&gt;\u&lt;/code&gt; for username).&lt;/p&gt;
&lt;h2 id=&quot;git&quot;&gt;Git&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;__git_ps1 &apos;(%s)&apos;&lt;/code&gt; command can be used to display the current git branch you’re on. For example, typing that into the Terminal while inside a folder that contains a &lt;code&gt;.git&lt;/code&gt; folder will display something like &lt;code&gt;(master)&lt;/code&gt; or &lt;code&gt;(branch_name)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You need to include these lines at the top of your &lt;code&gt;.bashrc&lt;/code&gt; to get the git prompt and git auto-completion:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#D20F39;--shiki-light-font-style:italic;--shiki-dark:#F38BA8;--shiki-dark-font-style:italic&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; /usr/local/etc/bash_completion.d/git-completion.bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#D20F39;--shiki-light-font-style:italic;--shiki-dark:#F38BA8;--shiki-dark-font-style:italic&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; /usr/local/etc/bash_completion.d/git-prompt.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those files may be in another folder on your machine. I installed git with &lt;a href=&quot;https://brew.sh/&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew&lt;/a&gt;, a package manager for OSX.&lt;/p&gt;
&lt;p&gt;If you don’t have git but want it installed, try installing it via Homebrew:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;ruby&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; -e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; -fsSL https://raw.github.com/mxcl/homebrew/go&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I took the first line from &lt;a href=&quot;https://brew.sh/&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew’s home page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It’s a good idea to version control your configuration file. Try adding your &lt;code&gt;.bashrc&lt;/code&gt; to a &lt;a href=&quot;https://gist.github.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;gist&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;more-color&quot;&gt;More Color&lt;/h2&gt;
&lt;p&gt;Paste the following into your &lt;code&gt;.bashrc&lt;/code&gt; for even more color:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; LS_OPTIONS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&apos;--color=auto&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; CLICOLOR&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&apos;Yes&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; LSCOLORS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&apos;Bxgxfxfxcxdxdxhbadbxbx&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;alias&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; ls&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&quot;ls -G&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;-G&lt;/code&gt; flag will &lt;em&gt;enable colorized output&lt;/em&gt;. Type &lt;code&gt;man ls&lt;/code&gt; for more details.&lt;/p&gt;</content:encoded><category>shell</category><category>homelab</category></item><item><title>Fish Shell</title><link>https://cnandreu.com/posts/fish-shell/</link><guid isPermaLink="true">https://cnandreu.com/posts/fish-shell/</guid><description>Why I switched from bash to fish, plus how to install it, make it your default shell, and customize it with fish_config.</description><pubDate>Tue, 04 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://fishshell.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Fish&lt;/a&gt; advertises itself as a smart and user-friendly command line shell for OS X, Linux, and the rest of the family. If you’re using bash, I highly recommend reading this post and trying fish.&lt;/p&gt;
&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Colors out of the box&lt;/li&gt;
&lt;li&gt;Syntax highlighting as you type: valid commands show up blue, invalid commands red&lt;/li&gt;
&lt;li&gt;Autosuggestions based on your history&lt;/li&gt;
&lt;li&gt;Man page completions: hit tab after a command (or a partial flag like &lt;code&gt;[command] -[tab]&lt;/code&gt;) and fish suggests options straight from the man pages, with descriptions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fishshell.com/tutorial.html&quot; rel=&quot;noopener noreferrer&quot;&gt;More&lt;/a&gt; in the official tutorial&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;install&quot;&gt;Install&lt;/h2&gt;
&lt;p&gt;Visit their website at &lt;a href=&quot;https://fishshell.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;fishshell.com&lt;/a&gt; and look under &lt;em&gt;Go Fish&lt;/em&gt;. Since I already had &lt;a href=&quot;https://brew.sh/&quot; rel=&quot;noopener noreferrer&quot;&gt;Homebrew&lt;/a&gt;, I simply ran the following command:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;brew&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; fish&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;setup&quot;&gt;Setup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Open &lt;code&gt;Terminal.app&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Preferences&lt;/code&gt; (Command + ,)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Startup&lt;/code&gt; tab&lt;/li&gt;
&lt;li&gt;Find the text label &lt;code&gt;Shells open with:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Click on &lt;code&gt;Command&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Paste &lt;code&gt;/usr/local/bin/fish&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alternatively you can change it via the command line:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;chsh&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; -s&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; /usr/local/bin/fish&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Make sure the file path matches the location of the fish executable on your machine.&lt;/p&gt;
&lt;h2 id=&quot;fish_config&quot;&gt;fish_config&lt;/h2&gt;
&lt;p&gt;Fish provides a web interface that enables some extra configuration. Simply type &lt;code&gt;fish_config&lt;/code&gt; inside your shell and hit enter.&lt;/p&gt;
&lt;p&gt;A browser should open (&lt;code&gt;localhost:8000&lt;/code&gt;) with a website that allows you to perform the configuration tweaks discussed below.&lt;/p&gt;
&lt;h3 id=&quot;change-default-colors&quot;&gt;Change default colors&lt;/h3&gt;
&lt;p&gt;The web interface includes a color picker with a handful of pre-made color schemes you can apply to your shell with a click.&lt;/p&gt;
&lt;h3 id=&quot;change-the-prompt&quot;&gt;Change the prompt&lt;/h3&gt;
&lt;p&gt;The prompt function is defined here: &lt;code&gt;~/.config/fish/functions/fish_prompt.fish&lt;/code&gt;. There are various pre-defined prompt functions you can pick from, or you can create your own.&lt;/p&gt;
&lt;p&gt;My prompt function is inside this &lt;a href=&quot;https://gist.github.com/cnandreu/5704233&quot; rel=&quot;noopener noreferrer&quot;&gt;gist&lt;/a&gt;. It may look a bit strange that commands are written on a second line. However, since my terminal usually takes up more space vertically than horizontally, I prefer it. There’s also a blank line between each command to help improve readability. If you’re inside a git repository folder it should also display the name of the branch you’re on.&lt;/p&gt;
&lt;h3 id=&quot;add-functions&quot;&gt;Add functions&lt;/h3&gt;
&lt;p&gt;Functions in fish wrap common shell tasks. For example, I created a new file, &lt;code&gt;~/.config/fish/functions/gs.fish&lt;/code&gt;, with the following:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;fish&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; gs --description &lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt;&apos;alias for git status&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;    git&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; status -s $argv&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#8839EF;--shiki-dark:#CBA6F7&quot;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now every time I type &lt;code&gt;gs&lt;/code&gt; into the terminal it will run &lt;code&gt;git status -s&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The example above is just a simple alias, but hopefully it illustrates how easy and useful it can be to create functions.&lt;/p&gt;
&lt;h3 id=&quot;view-variables&quot;&gt;View variables&lt;/h3&gt;
&lt;p&gt;It’s possible to set environment variables using the following syntax: &lt;code&gt;set -x greeting hello&lt;/code&gt;. You can view your variables using the web interface.&lt;/p&gt;
&lt;h3 id=&quot;view-history&quot;&gt;View history&lt;/h3&gt;
&lt;p&gt;The web interface also lets you browse and search your command history.&lt;/p&gt;</content:encoded><category>shell</category><category>homelab</category></item><item><title>Start a Blog</title><link>https://cnandreu.com/posts/start-a-blog/</link><guid isPermaLink="true">https://cnandreu.com/posts/start-a-blog/</guid><description>How I set up this blog in 2013: Wordpress on AppFog&apos;s free tier, a Svbtle theme, Disqus comments, and Google Analytics.</description><pubDate>Wed, 15 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Since everyone is writing blog posts in the tech world, I thought I would give it a shot. This particular post is going to be about setting up your own blog, using the same tools and services I used.&lt;/p&gt;
&lt;h2 id=&quot;blogging-platform-wordpress&quot;&gt;Blogging Platform: Wordpress&lt;/h2&gt;
&lt;p&gt;I’ve dabbled with setting up &lt;a href=&quot;https://github.com/mojombo/jekyll&quot; rel=&quot;noopener noreferrer&quot;&gt;Jekyll&lt;/a&gt;, a Ruby-based tool that lets you build a static website from Markdown files. Similarly, I tried Poet, which lets you set up a blog generator using &lt;a href=&quot;https://nodejs.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Node.js&lt;/a&gt;. These tools have a bit of a learning curve and are geared more towards people that want to tinker a lot with their blog.&lt;/p&gt;
&lt;p&gt;Since I just wanted something quick, I swallowed my pride and decided to go with &lt;a href=&quot;https://wordpress.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Wordpress&lt;/a&gt;. Despite PHP’s shortcomings, Wordpress is a solid blogging platform.&lt;/p&gt;
&lt;h2 id=&quot;hosting-platform-appfog&quot;&gt;Hosting Platform: AppFog&lt;/h2&gt;
&lt;p&gt;A few years back the obvious solution was to pay 5 USD a month and host your blog on a &lt;a href=&quot;https://en.wikipedia.org/wiki/Shared_web_hosting_service&quot; rel=&quot;noopener noreferrer&quot;&gt;shared hosting&lt;/a&gt; environment. Maybe even a &lt;a href=&quot;https://en.wikipedia.org/wiki/Virtual_private_server&quot; rel=&quot;noopener noreferrer&quot;&gt;Virtual Private Server&lt;/a&gt; (VPS) if you needed the extra &lt;em&gt;horsepower&lt;/em&gt;, for lack of a better word. Back in 2012 I wrote a Developer Works article about how &lt;a href=&quot;https://en.wikipedia.org/wiki/Platform_as_a_service&quot; rel=&quot;noopener noreferrer&quot;&gt;Platform as a Service&lt;/a&gt; (PaaS) offerings are taking over.&lt;/p&gt;
&lt;h2 id=&quot;heroku-vs-ec2&quot;&gt;Heroku vs EC2&lt;/h2&gt;
&lt;p&gt;I’ve used &lt;a href=&quot;https://www.heroku.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Heroku&lt;/a&gt; and &lt;a href=&quot;https://aws.amazon.com/ec2/&quot; rel=&quot;noopener noreferrer&quot;&gt;Amazon EC2&lt;/a&gt; in the past, but this time I decided to steer away from those. Using Heroku’s free tier means dynos (which are more or less their request handlers) &lt;a href=&quot;https://stackoverflow.com/a/6894382/186909&quot; rel=&quot;noopener noreferrer&quot;&gt;shut down after ~30 minutes&lt;/a&gt;. That means it takes 20-30 seconds to access the application for the first time. I didn’t go with Amazon because their free trial only lasts a year, and after that it’s &lt;a href=&quot;https://aws.amazon.com/ec2/pricing/&quot; rel=&quot;noopener noreferrer&quot;&gt;~15 USD/month&lt;/a&gt; for their lowest tier instance.&lt;/p&gt;
&lt;h2 id=&quot;appfogs-free-tier&quot;&gt;AppFog’s Free Tier&lt;/h2&gt;
&lt;p&gt;AppFog’s free tier provides the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8 instances&lt;/li&gt;
&lt;li&gt;100MB of DB storage&lt;/li&gt;
&lt;li&gt;5GB of bandwidth&lt;/li&gt;
&lt;li&gt;100 requests/sec&lt;/li&gt;
&lt;li&gt;2GB of RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Which is more than enough for a small blog like mine. Unfortunately they removed linking domains (e.g. &lt;code&gt;cnandreu.com&lt;/code&gt; instead of &lt;code&gt;cnandreu.aws.af.cm&lt;/code&gt;) from their free offering, as you can tell from &lt;a href=&quot;https://twitter.com/cnandreu/status/338542161865883648&quot; rel=&quot;noopener noreferrer&quot;&gt;my tweet&lt;/a&gt; a few days ago.&lt;/p&gt;
&lt;p&gt;They claim this was done &lt;a href=&quot;https://groups.google.com/d/msg/appfog-users/hYdFCDFRh4U/jY_Hx72cjjAJ&quot; rel=&quot;noopener noreferrer&quot;&gt;because of abuse&lt;/a&gt;, but as &lt;a href=&quot;https://groups.google.com/forum/#!msg/appfog-users/hYdFCDFRh4U/27ZnNfsQBlQJ&quot; rel=&quot;noopener noreferrer&quot;&gt;someone suggested&lt;/a&gt; on Google Groups, people could’ve provided a credit card for verification before being allowed to link an external URI. It seems like a ploy to get people to start paying, but it’s a steep sell from $0 to 20 USD/month.&lt;/p&gt;
&lt;h2 id=&quot;installing-wordpress-on-appfog&quot;&gt;Installing Wordpress on AppFog&lt;/h2&gt;
&lt;p&gt;Installing Wordpress is basically a &lt;em&gt;single click install&lt;/em&gt;. See their Jumpstart docs. All you need to do is create an account, create a new application, select Wordpress, select the infrastructure (i.e. AWS US East), pick a sub-domain name, and visit the URL. Done!&lt;/p&gt;
&lt;h2 id=&quot;performance-tweaks-for-wordpress-on-appfog&quot;&gt;Performance Tweaks for Wordpress on AppFog&lt;/h2&gt;
&lt;p&gt;There’s a good blog post titled “How to make WordPress absolutely blaze on AppFog”. It basically recommends running &lt;em&gt;5 instances of your blog at 384 MB of RAM a piece&lt;/em&gt; if you want to get the best performance possible on the free tier.&lt;/p&gt;
&lt;h2 id=&quot;blog-theme-svbtle&quot;&gt;Blog Theme: Svbtle&lt;/h2&gt;
&lt;p&gt;Someone took the time to port the theme from &lt;a href=&quot;https://svbtle.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;svbtle.com&lt;/a&gt; to Wordpress. You can get it from the following GitHub repository: &lt;a href=&quot;https://github.com/themeskult/wp-svbtle&quot; rel=&quot;noopener noreferrer&quot;&gt;themeskult/wp-svbtle&lt;/a&gt;. It’s worth mentioning that you get responsive design for free when you install the theme. Try resizing your browser window.&lt;/p&gt;
&lt;p&gt;If you’re using AppFog, you need to install their command line tool, &lt;code&gt;af&lt;/code&gt;. Then log in, pull the source code, add the files from the theme, and update the app. These are the commands I used:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;af&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; login&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; [email]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;# Enter password&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;af&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; pull&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; [app-name]   &lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;# Downloads last pushed source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;# Move the files from the template&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic&quot;&gt;af&lt;/span&gt;&lt;span style=&quot;--shiki-light:#40A02B;--shiki-dark:#A6E3A1&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;--shiki-light:#4C4F69;--shiki-dark:#CDD6F4&quot;&gt; [app-name] &lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-light-font-style:italic;--shiki-dark:#9399B2;--shiki-dark-font-style:italic&quot;&gt;# Update the application bits&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;comments-disqus&quot;&gt;Comments: Disqus&lt;/h2&gt;
&lt;p&gt;I absolutely loathe when websites require you to make yet another account you’re never going to remember for silly things like leaving comments. I didn’t want to give my readers that experience, so I opted to use &lt;a href=&quot;https://disqus.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Disqus&lt;/a&gt; over the comment system provided by Wordpress. They provide &lt;em&gt;Comments as a Service&lt;/em&gt; and support logging in with Facebook, Google, etc. It was quite painless to set up. Just install the following plugin: &lt;a href=&quot;https://wordpress.org/plugins/disqus-comment-system/&quot; rel=&quot;noopener noreferrer&quot;&gt;Disqus Comment System&lt;/a&gt;. You can do it from your blog’s admin panel: &lt;code&gt;Plugins&lt;/code&gt; &gt; &lt;code&gt;Add New&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;css-fix&quot;&gt;CSS Fix&lt;/h2&gt;
&lt;p&gt;I had to fix the CSS a bit: &lt;code&gt;Appearance&lt;/code&gt; &gt; &lt;code&gt;Editor&lt;/code&gt; &gt; &lt;code&gt;Stylesheet&lt;/code&gt; (style.css). Just add the following to the bottom of that file:&lt;/p&gt;
&lt;pre class=&quot;astro-code astro-code-themes catppuccin-latte catppuccin-mocha&quot; style=&quot;--shiki-light:#4c4f69;--shiki-dark:#cdd6f4;--shiki-light-bg:#eff1f5;--shiki-dark-bg:#1e1e2e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;#&lt;/span&gt;&lt;span style=&quot;--shiki-light:#DF8E1D;--shiki-dark:#F9E2AF&quot;&gt;disqus_thread&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-dark:#89B4FA&quot;&gt;    margin-left&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#FE640B;--shiki-dark:#FAB387&quot;&gt; 8%&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#1E66F5;--shiki-dark:#89B4FA&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;--shiki-light:#179299;--shiki-dark:#94E2D5&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#FE640B;--shiki-dark:#FAB387&quot;&gt; 75%&lt;/span&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;--shiki-light:#7C7F93;--shiki-dark:#9399B2&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using IDs for CSS selectors is &lt;a href=&quot;http://screwlewse.com/2010/07/dont-use-id-selectors-in-css/&quot; rel=&quot;noopener noreferrer&quot;&gt;discouraged&lt;/a&gt;, but I didn’t feel like spending too much time on this.&lt;/p&gt;
&lt;h2 id=&quot;analytics-google-analytics&quot;&gt;Analytics: Google Analytics&lt;/h2&gt;
&lt;p&gt;I haven’t tried any analytics alternatives, but &lt;a href=&quot;https://www.google.com/analytics/&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Analytics&lt;/a&gt; has always worked well for me. Just create an account, provide the URL for your website, and get an ID (e.g. &lt;code&gt;UA-XXXXXXXX-X&lt;/code&gt;). After a few days of collecting analytics you’ll be able to tell how many people have visited your site, how long they spent on it, where they came from, and other information about them (e.g. browser, operating system).&lt;/p&gt;
&lt;h2 id=&quot;wordpress-plugin&quot;&gt;Wordpress Plugin&lt;/h2&gt;
&lt;p&gt;I used the &lt;a href=&quot;https://wordpress.org/plugins/google-analytics-for-wordpress/&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Analytics Wordpress plugin&lt;/a&gt;. Go to your blog’s admin panel: &lt;code&gt;Plugins&lt;/code&gt; &gt; &lt;code&gt;Add New&lt;/code&gt;. Then add your ID under &lt;code&gt;Settings&lt;/code&gt; &gt; &lt;code&gt;Google Analytics&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;ios-application&quot;&gt;iOS Application&lt;/h2&gt;
&lt;p&gt;I installed Analytiks. It was free and it looks very nice. What more could you ask for?&lt;/p&gt;
&lt;h2 id=&quot;markdown&quot;&gt;Markdown&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Markdown&quot; rel=&quot;noopener noreferrer&quot;&gt;Markdown&lt;/a&gt; is a lightweight markup language. I’ve been using it for everything from quick notes to proper documentation. If you’ve ever posted on &lt;a href=&quot;https://stackoverflow.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;StackOverflow&lt;/a&gt; or &lt;a href=&quot;https://reddit.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Reddit&lt;/a&gt;, or created a README.md file on &lt;a href=&quot;https://github.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Github&lt;/a&gt; or &lt;a href=&quot;https://bitbucket.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;Bitbucket&lt;/a&gt;, you’ve already used Markdown.&lt;/p&gt;
&lt;p&gt;There are popular editors for every operating system; here are my recommendations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mac: Mou&lt;/li&gt;
&lt;li&gt;Windows: &lt;a href=&quot;http://markdownpad.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;MarkdownPad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux: ReText&lt;/li&gt;
&lt;li&gt;Web: &lt;a href=&quot;https://dillinger.io/&quot; rel=&quot;noopener noreferrer&quot;&gt;Dillinger&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://www.urbandictionary.com/define.php?term=protip&quot; rel=&quot;noopener noreferrer&quot;&gt;Protip&lt;/a&gt; if you’re using Mou: go into &lt;code&gt;Options&lt;/code&gt; &gt; &lt;code&gt;General&lt;/code&gt; &gt; &lt;code&gt;Check Spelling While Typing&lt;/code&gt;. You can also change the theme if you don’t like the default one while you’re there. There are some themes on Github.&lt;/p&gt;
&lt;p&gt;If you want to use Markdown in your pages and posts, just install the following Wordpress plugin: &lt;a href=&quot;https://wordpress.org/plugins/markdown-on-save-improved/&quot; rel=&quot;noopener noreferrer&quot;&gt;Markdown on Save Improved&lt;/a&gt;. Go to your blog’s admin panel: &lt;code&gt;Plugins&lt;/code&gt; &gt; &lt;code&gt;Add New&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;mobile-blogging-wordpress-ios-app&quot;&gt;Mobile Blogging: Wordpress iOS App&lt;/h2&gt;
&lt;p&gt;Wordpress has a free &lt;a href=&quot;https://ios.wordpress.org/&quot; rel=&quot;noopener noreferrer&quot;&gt;iOS application&lt;/a&gt; for blogging on the go. You can use it with self-hosted blogs too. Just provide the URL and the administrator account’s credentials.&lt;/p&gt;
&lt;h2 id=&quot;ads&quot;&gt;Ads&lt;/h2&gt;
&lt;p&gt;I haven’t looked into this. Any recommendations? I’ll probably post about it at some point. I may try &lt;a href=&quot;https://www.google.com/adsense/&quot; rel=&quot;noopener noreferrer&quot;&gt;Google Adsense&lt;/a&gt; and &lt;a href=&quot;https://affiliate-program.amazon.com/&quot; rel=&quot;noopener noreferrer&quot;&gt;Amazon Affiliates&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;leave-a-comment&quot;&gt;Leave a Comment&lt;/h2&gt;
&lt;p&gt;Or send a tweet to &lt;a href=&quot;https://twitter.com/cnandreu&quot; rel=&quot;noopener noreferrer&quot;&gt;@cnandreu&lt;/a&gt; if the post was helpful.&lt;/p&gt;</content:encoded><category>dev</category></item></channel></rss>