Skip to content

Commit 66f2c29

Browse files
committed
1 parent 3e70f67 commit 66f2c29

18 files changed

+338
-27
lines changed

.gitignore

Lines changed: 209 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,210 @@
1-
_site
2-
.sass-cache
3-
.jekyll-cache
1+
# Created by https://www.toptal.com/developers/gitignore/api/ruby,jekyll,node
2+
# Edit at https://www.toptal.com/developers/gitignore?templates=ruby,jekyll,node
3+
4+
### Jekyll ###
5+
_site/
6+
.sass-cache/
7+
.jekyll-cache/
48
.jekyll-metadata
5-
vendor
9+
# Ignore folders generated by Bundler
10+
.bundle/
11+
vendor/
12+
13+
### Node ###
14+
# Logs
15+
logs
16+
*.log
17+
npm-debug.log*
18+
yarn-debug.log*
19+
yarn-error.log*
20+
lerna-debug.log*
21+
.pnpm-debug.log*
22+
23+
# Diagnostic reports (https://nodejs.org/api/report.html)
24+
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
25+
26+
# Runtime data
27+
pids
28+
*.pid
29+
*.seed
30+
*.pid.lock
31+
32+
# Directory for instrumented libs generated by jscoverage/JSCover
33+
lib-cov
34+
35+
# Coverage directory used by tools like istanbul
36+
coverage
37+
*.lcov
38+
39+
# nyc test coverage
40+
.nyc_output
41+
42+
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
43+
.grunt
44+
45+
# Bower dependency directory (https://bower.io/)
46+
bower_components
47+
48+
# node-waf configuration
49+
.lock-wscript
50+
51+
# Compiled binary addons (https://nodejs.org/api/addons.html)
52+
build/Release
53+
54+
# Dependency directories
55+
node_modules/
56+
jspm_packages/
57+
58+
# Snowpack dependency directory (https://snowpack.dev/)
59+
web_modules/
60+
61+
# TypeScript cache
62+
*.tsbuildinfo
63+
64+
# Optional npm cache directory
65+
.npm
66+
67+
# Optional eslint cache
68+
.eslintcache
69+
70+
# Optional stylelint cache
71+
.stylelintcache
72+
73+
# Microbundle cache
74+
.rpt2_cache/
75+
.rts2_cache_cjs/
76+
.rts2_cache_es/
77+
.rts2_cache_umd/
78+
79+
# Optional REPL history
80+
.node_repl_history
81+
82+
# Output of 'npm pack'
83+
*.tgz
84+
85+
# Yarn Integrity file
86+
.yarn-integrity
87+
88+
# dotenv environment variable files
89+
.env
90+
.env.development.local
91+
.env.test.local
92+
.env.production.local
93+
.env.local
94+
95+
# parcel-bundler cache (https://parceljs.org/)
96+
.cache
97+
.parcel-cache
98+
99+
# Next.js build output
100+
.next
101+
out
102+
103+
# Nuxt.js build / generate output
104+
.nuxt
105+
dist
106+
107+
# Gatsby files
108+
.cache/
109+
# Comment in the public line in if your project uses Gatsby and not Next.js
110+
# https://nextjs.org/blog/next-9-1#public-directory-support
111+
# public
112+
113+
# vuepress build output
114+
.vuepress/dist
115+
116+
# vuepress v2.x temp and cache directory
117+
.temp
118+
119+
# Docusaurus cache and generated files
120+
.docusaurus
121+
122+
# Serverless directories
123+
.serverless/
124+
125+
# FuseBox cache
126+
.fusebox/
127+
128+
# DynamoDB Local files
129+
.dynamodb/
130+
131+
# TernJS port file
132+
.tern-port
133+
134+
# Stores VSCode versions used for testing VSCode extensions
135+
.vscode-test
136+
137+
# yarn v2
138+
.yarn/cache
139+
.yarn/unplugged
140+
.yarn/build-state.yml
141+
.yarn/install-state.gz
142+
.pnp.*
143+
144+
### Node Patch ###
145+
# Serverless Webpack directories
146+
.webpack/
147+
148+
# Optional stylelint cache
149+
150+
# SvelteKit build / generate output
151+
.svelte-kit
152+
153+
### Ruby ###
154+
*.gem
155+
*.rbc
156+
/.config
157+
/coverage/
158+
/InstalledFiles
159+
/pkg/
160+
/spec/reports/
161+
/spec/examples.txt
162+
/test/tmp/
163+
/test/version_tmp/
164+
/tmp/
165+
166+
# Used by dotenv library to load environment variables.
167+
# .env
168+
169+
# Ignore Byebug command history file.
170+
.byebug_history
171+
172+
## Specific to RubyMotion:
173+
.dat*
174+
.repl_history
175+
build/
176+
*.bridgesupport
177+
build-iPhoneOS/
178+
build-iPhoneSimulator/
179+
180+
## Specific to RubyMotion (use of CocoaPods):
181+
#
182+
# We recommend against adding the Pods directory to your .gitignore. However
183+
# you should judge for yourself, the pros and cons are mentioned at:
184+
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
185+
# vendor/Pods/
186+
187+
## Documentation cache and generated files:
188+
/.yardoc/
189+
/_yardoc/
190+
/doc/
191+
/rdoc/
192+
193+
## Environment normalization:
194+
/.bundle/
195+
/vendor/bundle
196+
/lib/bundler/man/
197+
198+
# for a library or gem, you might want to ignore these files since the code is
199+
# intended to run in multiple environments; otherwise, check them in:
200+
# Gemfile.lock
201+
# .ruby-version
202+
# .ruby-gemset
203+
204+
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
205+
.rvmrc
206+
207+
# Used by RuboCop. Remote config files pulled in from inherit_from directive.
208+
# .rubocop-https?--*
209+
210+
# End of https://www.toptal.com/developers/gitignore/api/ruby,jekyll,node

README.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

bin/build.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
set -x
3+
set -euo pipefail
4+
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
5+
6+
pushd "$SCRIPT_DIR/.." || return
7+
8+
JEKYLL_ENV=production bundle exec jekyll build --source ./src --baseurl ""

bin/serve.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
set -x
3+
set -euo pipefail
4+
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
5+
6+
pushd "$SCRIPT_DIR/.." || return
7+
bundle exec jekyll serve --source src --drafts --unpublished --livereload

src/_config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020

2121
title: João Sá
2222
email: joao.sa@familiasa.pt
23-
description: >- # this means to ignore newlines until "baseurl:"
24-
Arch user btw. NeoVim user btw. Judo black belt btw. Married btw.
23+
description: >- # this means to ignore newlines
24+
Arch user btw. NeoVim user btw. Married btw. Judo black belt btw. Motorcycle rider btw.
2525
baseurl: "" # the subpath of your site, e.g. /blog
2626
url: "" # the base hostname & protocol for your site, e.g. http://example.com
2727
twitter_username: joaoptpsa

src/_drafts/bash_limitations.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
---
2+
layout: post
3+
title: "Writing future scripts in python"
4+
tags: personal python bash
5+
author: João Sá
6+
published: false
7+
---
8+
9+
## I, master BASHer
10+
11+
Bash is great if you know what you are doing[^pipefail].
12+
13+
Think BASH expansion magic, `|`, `[[` and other always available tools like `curl`, `jq` `xargs`, `find`, `mktemp` and even `tee`.
14+
15+
PS: I understand that `BASH_REMATCH` is also a useful tool to have available.
16+
17+
Scripts in BASH never really break so there is no constant maintenance overhead.
18+
19+
At work I've built tooling for mass push notification on Bash that was able to deliver 200k notifications in less than two minutes. — Basically just piping `psql --no-pager` output to `xargs` and executing `curl` with a whole bunch of `mktemp`, `tee` and a sprinkle of `at`.
20+
21+
So Bash is really great for small scripting needs and it's much better than most developers think for big scripting needs that are straightforward.
22+
23+
## But wait
24+
25+
What does straightforward mean?
26+
27+
Well, BASH is not so great with string manipulation and object manipulation (If you are a Wizard you can go pretty far in regards to string manipulation using `awk`, `tr`, `grep -E`, `jq` filters and others).
28+
29+
Another critic I have of bash for scripts is that I need to declare my functions before they are invoked.
30+
31+
This makes all somewhat bigger scripting needs require a `utils.sh` file for readability, but it also subtly increases development cost because BASH functions are just that — BASH functions.
32+
33+
## I, Python student
34+
35+
I will be giving python a go for my future scripting needs.
36+
37+
PPS: I mean I'm sure Bash is still better than Perl...
38+
39+
[^pipefail]: And by that I mean starting your scripts with `set -euo pipefail`

src/_includes/head.html

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<head>
2+
<meta charset="utf-8">
3+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
4+
<meta name="viewport" content="width=device-width, initial-scale=1">
5+
{%- seo -%}
6+
<link rel="stylesheet" href="{{ "/assets/main.css" | relative_url }}">
7+
{%- feed_meta -%}
8+
{%- if jekyll.environment == 'production' and site.google_analytics -%}
9+
{%- include google-analytics.html -%}
10+
{%- endif -%}
11+
<!-- start custom head snippets -->
12+
13+
<!-- insert favicons. use https://realfavicongenerator.net/ -->
14+
<link rel="icon"
15+
type="image/png"
16+
href="/assets/favicon/favicon-96x96.png"
17+
sizes="96x96" />
18+
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg" />
19+
<link rel="shortcut icon" href="/assets/favicon/favicon.ico" />
20+
<link rel="apple-touch-icon"
21+
sizes="180x180"
22+
href="/assets/favicon/apple-touch-icon.png" />
23+
<meta name="apple-mobile-web-app-title" content="João Sá" />
24+
<link rel="manifest" href="/assets/favicon/site.webmanifest" />
25+
26+
<!-- end custom head snippets -->
27+
</head>
28+
<!-- vim: ft=jinja syntax=html -->

src/_posts/.gitkeep

Whitespace-only changes.

src/_posts/2025-11-30-first-post.markdown

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,20 @@ On 2025-12-01 (Monday), Portugal celebrates the [Restoration of Independence](ht
1515

1616
This begat my Blog — but how?
1717

18-
I had reserved the extended weekend to migrate my old and rusty [Manjaro](https://manjaro.org/) install to a fresh [`archinstall`](https://wiki.archlinux.org/title/Archinstall) with [Omarchy](https://omarchy.org/) [^omarchy].
18+
I had chosen this extended weekend to migrate my old and rusty [Manjaro](https://manjaro.org/) install to a fresh [`archinstall`](https://wiki.archlinux.org/title/Archinstall) with [Omarchy](https://omarchy.org/) [^omarchy].
1919

2020
Excluding some minor issues[^lol], that went about pretty fast.
2121

22-
But because I had already set aside time for this monstrous task...
22+
But because I had already set aside time...
2323
And because at least one person (not counting my wife) has told me that I'm bearable enough when speaking about certain topics of my peculiar interest, I decided to start writing.
2424

2525
## Chronogram
2626

27-
So after:
27+
1. Attended [Tim Bernardes](https://www.timbernardes.com/) show Saturday night.
28+
2. Learned a bit of [`mise`](https://mise.jdx.dev/) [^mise].
29+
3. Learned a bit of [Jekyll](https://jekyllrb.com/).
2830

29-
1. Attending [Tim Bernardes](https://www.timbernardes.com/) show Saturday night — completely unrelated btw.
30-
2. Learning a bit of [`mise`](https://mise.jdx.dev/) [^mise].
31-
3. Learning a bit of [Jekyll](https://jekyllrb.com/).
32-
33-
And just like that, this blog was (maybe) created.
31+
And just like that, my blog happened to spawn.
3432

3533
## Future work
3634

@@ -40,7 +38,6 @@ As you all know:
4038
4139
- Maybe I'll drop my love for the Em dash.
4240
- Maybe as time goes by this blog will become more work than fun and my happy writing style will gradually become more meaningless technical jargon and more boring.
43-
- Maybe I won't...
4441
- Maybe...
4542

4643
## Footnotes
@@ -49,8 +46,8 @@ As you all know:
4946

5047
[^lol]:
5148
Two things were annoying:
52-
First, my motherboard only was looking in `/boot/EFI/BOOT/` and not in `/boot/EFI/limine/` making me ~~want to cry~~ the unchallenged world record holder for most manual Arch install in 120 minutes.
53-
Secondly there is a new Bitwarden issue [#17598](https://github.com/bitwarden/clients/issues/17598) that I didn't know about and it drove me crazy for a couple hours.
49+
First, my motherboard only was not looking in `/boot/EFI/limine/` making me ~~want to cry~~ the unchallenged world record holder for most manual Arch install within 120 minutes.
50+
Secondly there is a new Bitwarden issue [#17598](https://github.com/bitwarden/clients/issues/17598) that I didn't know about and it ruined my post install experience by driving me crazy for a couple hours.
5451

5552
[^mise]:
5653
`mise` is turning out to be great — I had been waiting for `PHP` to be added as a [core tool](https://mise.jdx.dev/core-tools.html) to justify the _small_ learning hit.

src/about.markdown

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,22 @@ excerpt: "Howdy! My name is João Sá. I'll be writing on front-end engineering,
77

88
Howdy!
99

10-
My name is João Sá.
10+
My name is João Sá, I'm based in Porto, Portugal and on a good day I look something like this:
1111

12-
<img alt="João Sá profile photo" src="/images/joaosa.png" width="200">
12+
<img alt="João Sá profile photo" src="/assets/images/joaosa.png" width="200">
1313

14-
That's me!
14+
Hopefully we can learn some things together!
1515

16-
I'm a Full-stack / Product Engineer (Mobile / Web) with a front-end lean based in Porto, Portugal.
16+
Cheers!
1717

18-
I'll be writing on front-end engineering, tooling, and product thinking topics.
18+
## Interests
1919

20-
Hopefully we can learn some things together!
20+
I like to read and I'm always open to book recommendations.
2121

22-
Cheers!
22+
Probably riding my motorcycle.
23+
24+
## Formalities
25+
26+
Full-stack / Product Engineer (Mobile / Web) with a front-end lean.
27+
28+
I'll be writing on front-end engineering, tooling, and product thinking topics.

0 commit comments

Comments
 (0)