├── .editorconfig ├── .envrc ├── .github └── workflows │ ├── deploy.yml │ └── update-bookmarks.yml ├── .gitignore ├── .markdownlint.json ├── .vscode ├── extensions.json ├── launch.json └── settings.json ├── LICENSE ├── LICENSE-posts ├── README.md ├── astro.config.ts ├── flake.lock ├── flake.nix ├── package.json ├── plugins ├── rehypePluginLinkHeading.ts ├── rehypePluginTableWrapper.ts └── remarkPluginReadingTime.ts ├── pnpm-lock.yaml ├── public ├── assets │ ├── b-trees.png │ ├── obsidian-graph-2023.png │ ├── paxos-sequence-diagram.png │ └── rss-feeds.png ├── favicon.png ├── fonts │ ├── Merriweather │ │ ├── Merriweather-Black.ttf │ │ ├── Merriweather-Bold.ttf │ │ └── Merriweather-Regular.ttf │ ├── RobotoMono-Light.ttf │ └── RobotoMono-Regular.ttf ├── rss.opml └── rss.xsl ├── scripts ├── generate-bookmarks-reader.ts ├── generate-bookmarks.ts ├── generate-changelog.ts ├── generate-til.ts ├── new-post.ts ├── post.template.md └── slugify.ts ├── src ├── components │ ├── Footer.astro │ ├── GoBackButton.astro │ ├── Link.astro │ ├── Posts.astro │ └── og.tsx ├── config.ts ├── content │ ├── blog │ │ ├── 2022-06-22T03:00:00.000Z-simplifying.md │ │ ├── 2023-02-18T03:00:00.000Z-writing-things-down.md │ │ ├── 2023-07-08T03:00:00.000Z-blogroll.md │ │ ├── 2023-09-12T21:58:56.609Z-2023-09-reading-list.md │ │ ├── 2023-09-18T00:14:03.062Z-my-first-talk.md │ │ ├── 2023-10-06T02:07:39.710Z-2023-10-reading-list.md │ │ ├── 2023-10-08T17:23:51.870Z-iterate-over-your-feedback-loop.md │ │ ├── 2023-10-10T01:09:53.902Z-thinking-in-systems.md │ │ ├── 2023-11-02T14:16:34.806Z-my-reading-list-november-2023.md │ │ ├── 2023-11-15T23:32:02.614Z-writing-a-tree-walk-interpreter-from-scratch-with-rust.md │ │ ├── 2023-11-16T11:21:00.886Z-running-ghdl-on-macos-m1.md │ │ ├── 2023-12-26T14:28:10.336Z-the-awesomeness-of-lists.md │ │ ├── 2023-12-27T20:21:07.934Z-one-year-using-obsidian.md │ │ ├── 2023-12-30T19:52:17.651Z-2023-in-review.md │ │ ├── 2024-01-21T14:39:29.114Z-increasing-your-friction-area.md │ │ ├── 2024-02-04T15:23:35.299Z-embrace-the-chaos-of-your-life.md │ │ ├── 2024-02-12T11:55:28.536Z-paxos-made-simple-with-rust.md │ │ ├── 2024-03-03T19:37:49.312Z-set-up-nix-on-macos-using-flakes-nix-darwin-and-home-manager.md │ │ ├── 2024-03-09T19:43:45.612Z-database-101-understanding-b-trees.md │ │ ├── 2024-03-13T01:52:37.519Z-database-internals.md │ │ ├── 2024-05-15T01:45:37.727Z-rss-and-why-i-love-it.md │ │ ├── 2024-06-18T00:11:26.845Z-my-first-impressions-with-neovim.md │ │ ├── 2024-07-07T07:07:03.952Z-my-arch-linux-installation.md │ │ ├── 2024-07-09T02:05:24.305Z-software-engineering-is-more-than-just-coding.md │ │ ├── 2024-07-13T02:19:37.399Z-not-about-writing-but-about-reviewing.md │ │ ├── 2024-07-20T05:25:03.568Z-notes-about-logical-and-vector-clocks.md │ │ ├── 2024-07-20T05:28:26.342Z-notes-and-learnings-with-tla.md │ │ ├── 2024-07-25T01:24:19.992Z-do-not-trust-on-yourself-trust-on-checklists.md │ │ ├── 2024-09-16T14:16:57.322Z-writing-a-lambda-calculus-interpreter-from-scratch.md │ │ ├── 2024-09-17T22:56:12.488Z-always-focus-on-the-long-term.md │ │ ├── 2024-09-25T22:24:04.178Z-on-bookmarks-lists-and-the-habit-of-reading-later.md │ │ ├── 2024-11-02T06:23:50.930Z-on-the-agency-of-doing-things.md │ │ ├── 2024-12-30T23:58:32.012Z-2024-in-review.md │ │ ├── 2025-01-04T18:58:22.287Z-writing-your-first-nix-overlay.md │ │ ├── 2025-04-24T01:10:19.298Z-its-all-about-solving-problems.md │ │ └── 2025-04-29T04:37:06.302Z-lessons-learned-from-hosting-a-tech-event.md │ ├── changelog │ │ └── changelog.json │ ├── config.ts │ ├── lists │ │ ├── list-of-awesome-talks.md │ │ ├── list-of-awesome-youtube-channels.md │ │ ├── list-of-best-articles-that-i-read.md │ │ ├── list-of-blogs-and-personal-websites.md │ │ ├── list-of-books-that-i-read.md │ │ ├── list-of-computer-science-resources.md │ │ └── list-of-math-resources.md │ └── til │ │ ├── 2025-04-20T02:49:57.614Z-skiplists.md │ │ ├── 2025-04-22T00:36:47.233Z-introduction-to-bayes-rules.md │ │ └── 2025-05-25T04:55:25.068Z-running-an-http-server-in-a-single-command-with-python.md ├── env.d.ts ├── layout │ └── Layout.astro └── pages │ ├── blog │ ├── [slug] │ │ ├── _post.tsx │ │ ├── index.astro │ │ └── index.png.ts │ ├── drafts.astro │ └── index.astro │ ├── bookmarks │ ├── _bookmarks.json │ ├── index.astro │ ├── rss.xml.ts │ └── tags │ │ ├── [...tag].astro │ │ ├── _TreeNode.astro │ │ └── index.astro │ ├── changelog.astro │ ├── index.astro │ ├── lists │ ├── [slug] │ │ ├── index.astro │ │ └── index.png.ts │ └── index.astro │ ├── now.astro │ ├── rss.xml.ts │ ├── tag │ └── [tag].astro │ ├── tags.astro │ └── til.astro └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: https://EditorConfig.org 2 | 3 | # top-most EditorConfig file 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = false 13 | -------------------------------------------------------------------------------- /.envrc: -------------------------------------------------------------------------------- 1 | use flake -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to GitHub Pages 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | workflow_dispatch: 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout your repository using git 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Install, build, and upload your site 23 | uses: withastro/action@v2 24 | with: 25 | node-version: 22.4.0 26 | package-manager: pnpm@8.6.0 27 | 28 | deploy: 29 | needs: build 30 | runs-on: ubuntu-latest 31 | environment: 32 | name: github-pages 33 | url: ${{ steps.deployment.outputs.page_url }} 34 | steps: 35 | - name: Deploy to GitHub Pages 36 | id: deployment 37 | uses: actions/deploy-pages@v4 -------------------------------------------------------------------------------- /.github/workflows/update-bookmarks.yml: -------------------------------------------------------------------------------- 1 | name: Daily Bookmarks Update 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | workflow_dispatch: 7 | 8 | jobs: 9 | update-json: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - name: Checkout repository 14 | uses: actions/checkout@v4 15 | 16 | - name: Setup PNPM 17 | uses: pnpm/action-setup@v2 18 | with: 19 | version: 9.15.0 20 | 21 | - name: Setup Node.js 22 | uses: actions/setup-node@v4 23 | with: 24 | node-version: '22.4.0' 25 | cache: 'pnpm' 26 | 27 | - name: Install dependencies 28 | run: pnpm install --frozen-lockfile 29 | 30 | - name: Run update script 31 | env: 32 | READWISE_READER_API_KEY: ${{ secrets.READWISE_READER_API_KEY }} 33 | run: pnpx tsx ./scripts/generate-bookmarks-reader.ts 34 | 35 | - name: Check for changes 36 | id: git-check 37 | run: | 38 | git add ./src 39 | git diff --staged --quiet || echo "changes=true" >> $GITHUB_OUTPUT 40 | 41 | - name: Create Pull Request 42 | if: steps.git-check.outputs.changes == 'true' 43 | uses: peter-evans/create-pull-request@v5 44 | with: 45 | token: ${{ secrets.GH_TOKEN }} 46 | commit-message: 'update bookmark - automated' 47 | branch: daily-bookmark-update 48 | delete-branch: true 49 | title: 'Daily Bookmark Update' 50 | assignees: noghartt 51 | body: | 52 | This PR contains the daily automated bookmark file updates. 53 | 54 | *Automated pull request created by GitHub Actions* -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # build output 2 | dist/ 3 | 4 | # dependencies 5 | node_modules/ 6 | 7 | # logs 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | pnpm-debug.log* 12 | 13 | 14 | # environment variables 15 | .env 16 | .env.production 17 | 18 | # macOS-specific files 19 | .DS_Store 20 | 21 | # ignore .astro 22 | .astro/ 23 | .vercel 24 | 25 | .direnv 26 | -------------------------------------------------------------------------------- /.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "line-length": { 3 | "tables": false 4 | } 5 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["astro-build.astro-vscode"], 3 | "unwantedRecommendations": [] 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "command": "./node_modules/.bin/astro dev", 6 | "name": "Development server", 7 | "request": "launch", 8 | "type": "node-terminal" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "**/*.vo": true, 4 | "**/*.vok": true, 5 | "**/*.vos": true, 6 | "**/*.aux": true, 7 | "**/*.glob": true, 8 | "**/.git": true, 9 | "**/.svn": true, 10 | "**/.hg": true, 11 | "**/CVS": true, 12 | "**/.DS_Store": true, 13 | "**/Thumbs.db": true 14 | } 15 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Noghartt's garden 2 | -------------------------------------------------------------------------------- /astro.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'astro/config'; 2 | import sitemap from '@astrojs/sitemap'; 3 | import react from '@astrojs/react'; 4 | import remarkMath from 'remark-math'; 5 | import rehypeKatex from 'rehype-katex'; 6 | import rehypePrettyCode from 'rehype-pretty-code'; 7 | import fs from 'fs/promises'; 8 | import graymatter from 'gray-matter'; 9 | import path from 'path'; 10 | 11 | import { rehypePluginLinkHeading } from './plugins/rehypePluginLinkHeading'; 12 | import { rehypePluginTableWrapper } from './plugins/rehypePluginTableWrapper'; 13 | import { remarkPluginReadingTime } from './plugins/remarkPluginReadingTime'; 14 | 15 | const BLOG_DIR = './src/content/blog'; 16 | 17 | const getBlogRoutesRedirect = async () => { 18 | const blogRoutesOldSlug = await fs.readdir(BLOG_DIR); 19 | const blogRoutes = blogRoutesOldSlug 20 | .map(post => { 21 | const frontmatter = graymatter.read(path.join(BLOG_DIR, post)); 22 | return { 23 | ...frontmatter, 24 | slug: frontmatter.data.slug, 25 | } 26 | }) 27 | .map(({ slug }) => [ 28 | `/${slug}`, 29 | `/blog/${slug}`, 30 | ]); 31 | 32 | return Object.fromEntries(blogRoutes); 33 | } 34 | 35 | const disableSitemap = [ 36 | '/blog/drafts', 37 | ]; 38 | 39 | // https://astro.build/config 40 | export default defineConfig({ 41 | site: 'https://noghartt.dev', 42 | integrations: [ 43 | sitemap({ 44 | filter: (page) => { 45 | try { 46 | const url = new URL(page); 47 | const shouldAdd = disableSitemap.every(path => !url.pathname.startsWith(path)); 48 | return shouldAdd; 49 | } catch (err) { 50 | return false; 51 | } 52 | } 53 | }), 54 | react(), 55 | ], 56 | output: "static", 57 | markdown: { 58 | syntaxHighlight: false, 59 | remarkPlugins: [ 60 | remarkMath, 61 | remarkPluginReadingTime, 62 | ], 63 | rehypePlugins: [ 64 | rehypeKatex, 65 | [ 66 | rehypePrettyCode, 67 | { 68 | theme: 'github-light', 69 | keepBackground: false, 70 | }, 71 | ], 72 | rehypePluginLinkHeading, 73 | rehypePluginTableWrapper, 74 | ], 75 | }, 76 | vite: { 77 | optimizeDeps: { 78 | exclude: ["@resvg/resvg-js"], 79 | }, 80 | }, 81 | redirects: { 82 | ...await getBlogRoutesRedirect(), 83 | } 84 | }); 85 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1731533236, 9 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs": { 22 | "locked": { 23 | "lastModified": 1733749988, 24 | "narHash": "sha256-+5qdtgXceqhK5ZR1YbP1fAUsweBIrhL38726oIEAtDs=", 25 | "owner": "NixOS", 26 | "repo": "nixpkgs", 27 | "rev": "bc27f0fde01ce4e1bfec1ab122d72b7380278e68", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "NixOS", 32 | "ref": "nixpkgs-unstable", 33 | "repo": "nixpkgs", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "flake-utils": "flake-utils", 40 | "nixpkgs": "nixpkgs" 41 | } 42 | }, 43 | "systems": { 44 | "locked": { 45 | "lastModified": 1681028828, 46 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 47 | "owner": "nix-systems", 48 | "repo": "default", 49 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 50 | "type": "github" 51 | }, 52 | "original": { 53 | "owner": "nix-systems", 54 | "repo": "default", 55 | "type": "github" 56 | } 57 | } 58 | }, 59 | "root": "root", 60 | "version": 7 61 | } 62 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Blog Flakefile"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; 6 | flake-utils.url = "github:numtide/flake-utils"; 7 | }; 8 | 9 | outputs = { self, nixpkgs, flake-utils }: 10 | flake-utils.lib.eachDefaultSystem (system: 11 | let 12 | pkgs = import nixpkgs { 13 | inherit system; 14 | }; 15 | in 16 | with pkgs; 17 | { 18 | devShells.default = mkShell { 19 | packages = [ 20 | nodejs_23 21 | nodePackages.yarn 22 | pnpm 23 | yarn 24 | ]; 25 | }; 26 | } 27 | ); 28 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@example/blog", 3 | "type": "module", 4 | "version": "0.0.1", 5 | "private": true, 6 | "scripts": { 7 | "dev": "astro dev", 8 | "start": "astro dev", 9 | "build": "astro build", 10 | "preview": "astro preview", 11 | "astro": "astro", 12 | "create:article": "tsx ./scripts/new-post.ts", 13 | "create:til": "tsx ./scripts/generate-til", 14 | "create:changelog": "tsx ./scripts/generate-changelog.ts", 15 | "generate:bookmarks": "tsx --env-file=./.env ./scripts/generate-bookmarks-reader.ts" 16 | }, 17 | "dependencies": { 18 | "@resvg/resvg-js": "^2.6.2", 19 | "astro": "^5.7.10", 20 | "dayjs": "^1.11.11", 21 | "markdown-it": "^13.0.2", 22 | "marked": "^15.0.4", 23 | "sanitize-html": "^2.13.0", 24 | "satori": "^0.10.14", 25 | "shiki": "^1.10.3", 26 | "simple-git": "^3.25.0" 27 | }, 28 | "devDependencies": { 29 | "@astrojs/mdx": "^4.2.6", 30 | "@astrojs/react": "^4.2.7", 31 | "@astrojs/rss": "^4.0.11", 32 | "@astrojs/sitemap": "^3.3.1", 33 | "@astrojs/vercel": "^8.1.4", 34 | "@types/hast": "^3.0.4", 35 | "@types/markdown-it": "^12.2.3", 36 | "@types/react": "^18.3.3", 37 | "@types/sanitize-html": "^2.11.0", 38 | "gray-matter": "^4.0.3", 39 | "hast": "^1.0.0", 40 | "hastscript": "^9.0.0", 41 | "markdownlint": "^0.35.0", 42 | "mdast-util-to-string": "^4.0.0", 43 | "react": "18.2.0", 44 | "react-dom": "18.2.0", 45 | "reading-time": "^1.5.0", 46 | "rehype": "^13.0.1", 47 | "rehype-katex": "^7.0.0", 48 | "rehype-pretty-code": "^0.13.2", 49 | "remark-math": "^6.0.0", 50 | "slugify": "^1.6.6", 51 | "tsx": "^3.14.0", 52 | "unist-builder": "^4.0.0", 53 | "unist-util-modify-children": "^4.0.0", 54 | "unist-util-visit": "^5.0.0" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /plugins/rehypePluginLinkHeading.ts: -------------------------------------------------------------------------------- 1 | import type { Node, Root } from 'hast'; 2 | import { visit } from 'unist-util-visit'; 3 | import { modifyChildren } from 'unist-util-modify-children'; 4 | import slugify from 'slugify'; 5 | 6 | const modifyHeading = (url: string) => modifyChildren((node) => { 7 | if (node.type !== 'text') { 8 | return; 9 | } 10 | 11 | const text = node.value; 12 | 13 | delete node.position; 14 | node.type = 'element'; 15 | node.tagName = 'a'; 16 | node.properties = { 17 | class: 'heading-link', 18 | href: url, 19 | }; 20 | node.children = [ 21 | { 22 | type: 'text', 23 | value: text, 24 | }, 25 | ] 26 | }) 27 | 28 | export function rehypePluginLinkHeading() { 29 | return function(tree: Root) { 30 | visit(tree, 'element', (node) => { 31 | const headingElements = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; 32 | if (headingElements.includes(node.tagName)) { 33 | const title = node.children.map((child) => child.value).join(''); 34 | const slug = slugify(title, { lower: true, replacement: '-', strict: true }); 35 | modifyHeading(`#${slug}`)(node); 36 | } 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /plugins/rehypePluginTableWrapper.ts: -------------------------------------------------------------------------------- 1 | import type { Root } from 'hast'; 2 | import { visit } from 'unist-util-visit'; 3 | import { h } from 'hastscript'; 4 | 5 | function removeFieldFromTree(node: Node, fieldToRemove: string) { 6 | if (Array.isArray(node)) { 7 | node.forEach(child => removeFieldFromTree(child, fieldToRemove)); 8 | } else if (node !== null && typeof node === 'object') { 9 | delete node[fieldToRemove]; 10 | for (const key in node) { 11 | if (node.hasOwnProperty(key)) { 12 | removeFieldFromTree(node[key], fieldToRemove); 13 | } 14 | } 15 | } 16 | } 17 | 18 | export function rehypePluginTableWrapper() { 19 | return function(tree: Root) { 20 | visit(tree, 'element', (node, index, parent) => { 21 | if (node.tagName !== 'table') { 22 | return; 23 | } 24 | 25 | const tableNode = structuredClone(node); 26 | removeFieldFromTree(tableNode, 'position'); 27 | 28 | const wrapper = h('div', { className: 'table-wrapper' }, [tableNode]); 29 | parent.children.splice(index, 1, wrapper); 30 | }); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /plugins/remarkPluginReadingTime.ts: -------------------------------------------------------------------------------- 1 | 2 | import getReadingTime from 'reading-time'; 3 | import { toString } from 'mdast-util-to-string'; 4 | 5 | export function remarkPluginReadingTime() { 6 | return function (tree, { data }) { 7 | const textOnPage = toString(tree); 8 | const readingTime = getReadingTime(textOnPage); 9 | data.astro.frontmatter.readingTime = readingTime; 10 | }; 11 | } -------------------------------------------------------------------------------- /public/assets/b-trees.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/assets/b-trees.png -------------------------------------------------------------------------------- /public/assets/obsidian-graph-2023.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/assets/obsidian-graph-2023.png -------------------------------------------------------------------------------- /public/assets/paxos-sequence-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/assets/paxos-sequence-diagram.png -------------------------------------------------------------------------------- /public/assets/rss-feeds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/assets/rss-feeds.png -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/favicon.png -------------------------------------------------------------------------------- /public/fonts/Merriweather/Merriweather-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/fonts/Merriweather/Merriweather-Black.ttf -------------------------------------------------------------------------------- /public/fonts/Merriweather/Merriweather-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/fonts/Merriweather/Merriweather-Bold.ttf -------------------------------------------------------------------------------- /public/fonts/Merriweather/Merriweather-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/fonts/Merriweather/Merriweather-Regular.ttf -------------------------------------------------------------------------------- /public/fonts/RobotoMono-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/fonts/RobotoMono-Light.ttf -------------------------------------------------------------------------------- /public/fonts/RobotoMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/noghartt/blog/ed1a47f5f5f9e5441d1c584a69fe1bda1a98ff15/public/fonts/RobotoMono-Regular.ttf -------------------------------------------------------------------------------- /public/rss.xsl: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | RSS | <xsl:value-of select="/rss/channel/title"/> 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 51 | 52 | 53 | 58 |
59 |
60 |

61 | RSS Feed Preview 62 |

63 |

64 | 65 |

66 | 67 | 68 | 69 | 70 | Visit Website → 71 | 72 |
73 |
74 |

Recent Items

75 | 76 |
77 |

78 | 79 | 80 | 81 | 82 | 83 | 84 |

85 | Published: 86 |
87 |
88 |
89 |
90 | 91 | 92 |
93 |
-------------------------------------------------------------------------------- /scripts/generate-bookmarks-reader.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs/promises'; 2 | import path from 'path'; 3 | import { setTimeout } from 'timers/promises'; 4 | 5 | const READWISE_API_URL = 'https://readwise.io/api/v3/list/'; 6 | const READWISE_READER_API_KEY = `Token ${process.env.READWISE_READER_API_KEY}`; 7 | 8 | const fetchBookmarks = async ({ nextPage: nextPageArg } = { nextPage: null }) => { 9 | const queryParams = new URLSearchParams(); 10 | queryParams.append('page_size', '1'); 11 | if (nextPageArg) { 12 | queryParams.append('pageCursor', nextPageArg); 13 | } 14 | 15 | try { 16 | const url = `${READWISE_API_URL}?${queryParams.toString()}`; 17 | const response = await fetch(url, { 18 | method: 'GET', 19 | headers: { 20 | 'Content-Type': 'application/json', 21 | Authorization: READWISE_READER_API_KEY, 22 | }, 23 | }); 24 | 25 | if (!response.ok) { 26 | if (response.status === 429) { 27 | const retryAfter = response.headers.get('Retry-After'); 28 | if (retryAfter) { 29 | const retryAfterSeconds = parseInt(retryAfter, 10); 30 | console.log(`Rate limit exceeded. Retrying after ${retryAfterSeconds} seconds...`); 31 | await setTimeout(retryAfterSeconds * 1000); 32 | return fetchBookmarks({ nextPage: nextPageArg }); 33 | } 34 | } 35 | 36 | return { error: response.statusText, data: null }; 37 | } 38 | 39 | const data = await response.json(); 40 | 41 | const dataFiltered = data.results.filter(bookmark => { 42 | if (['rss', 'note', 'email', 'highlight'].includes(bookmark.category)) { 43 | return false; 44 | } 45 | 46 | if (bookmark.tags.newsletter) { 47 | return false; 48 | } 49 | 50 | return true; 51 | }); 52 | const nextPage = data.nextPageCursor; 53 | 54 | return { 55 | data: dataFiltered, 56 | nextPage, 57 | } 58 | } catch (err) { 59 | console.log('Error while fetching bookmarks:', err); 60 | return { error: err, data: null }; 61 | } 62 | } 63 | 64 | const writeJsonFile = async (data: any) => { 65 | const cwd = process.cwd(); 66 | const filepath = path.join(cwd, 'src', 'pages', 'bookmarks', '_bookmarks.json'); 67 | await fs.writeFile(filepath, JSON.stringify({ lastUpdate: new Date().toISOString(), data }, null, 2)); 68 | } 69 | 70 | (async () => { 71 | const bookmarks = []; 72 | let nextPage = null; 73 | try { 74 | do { 75 | console.log('Fetching bookmarks from:', nextPage ?? 'start'); 76 | const response = await fetchBookmarks({ nextPage }); 77 | if (response.error) { 78 | console.log('Error while fetching:', response.error); 79 | break; 80 | } 81 | 82 | nextPage = response.nextPage; 83 | bookmarks.push(...response.data); 84 | } while (nextPage); 85 | 86 | 87 | } catch (e) { 88 | console.log('Error while fetching:', e); 89 | } 90 | 91 | const mappedBookmarks = bookmarks.map(bookmark => ({ 92 | id: bookmark.id, 93 | title: bookmark.title, 94 | url: bookmark.source_url, 95 | savedAt: bookmark.saved_at, 96 | description: bookmark.summary || null, 97 | tags: Object.values(bookmark.tags).map(tags => tags.name), 98 | })); 99 | 100 | await writeJsonFile(mappedBookmarks); 101 | })(); -------------------------------------------------------------------------------- /scripts/generate-bookmarks.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs/promises'; 2 | import path from 'path'; 3 | 4 | const OMNIVORE_API_URL = 'https://api-prod.omnivore.app/api/graphql'; 5 | const OMNIVORE_API_KEY = process.env.OMNIVORE_API_KEY; 6 | 7 | const query = `\ 8 | query SearchBookmarks($first: Int, $after: String, $query: String) { 9 | search(first: $first, query: $query, after: $after) { 10 | ... on SearchSuccess { 11 | pageInfo { 12 | hasNextPage 13 | endCursor 14 | totalCount 15 | } 16 | edges { 17 | cursor 18 | node { 19 | id 20 | title 21 | url: originalArticleUrl 22 | description 23 | labels { 24 | name 25 | } 26 | savedAt 27 | } 28 | } 29 | } 30 | 31 | ... on SearchError { 32 | errorCodes 33 | } 34 | } 35 | } 36 | `; 37 | 38 | const fetchBookmarks = async (first: number, after: string) => { 39 | console.log('Fetching bookmarks:', { first, after }) 40 | 41 | try { 42 | const response = await fetch(OMNIVORE_API_URL, { 43 | method: 'POST', 44 | body: JSON.stringify({ query, variables: { first, after, query: "no:subscription" } }), 45 | headers: { 46 | 'Content-Type': 'application/json', 47 | Authorization: OMNIVORE_API_KEY, 48 | }, 49 | }); 50 | 51 | if (!response.ok) { 52 | return { error: response.statusText, data: null }; 53 | } 54 | 55 | return { 56 | error: null, 57 | data: await response.json(), 58 | } 59 | } catch (err) { 60 | return { error: err, data: null }; 61 | } 62 | } 63 | 64 | const mapBookmark = (edge) => { 65 | const { node } = edge; 66 | return { 67 | id: node.id, 68 | title: node.title, 69 | url: node.url, 70 | savedAt: node.savedAt, 71 | description: node.description || null, 72 | tags: node.labels.map(({ name }) => name), 73 | }; 74 | } 75 | 76 | const writeJsonFile = async (data: any) => { 77 | const cwd = process.cwd(); 78 | const filepath = path.join(cwd, 'src', 'pages', 'bookmarks', '_bookmarks.json'); 79 | await fs.writeFile(filepath, JSON.stringify({ lastUpdate: new Date().toISOString(), data }, null, 2)); 80 | } 81 | 82 | (async () => { 83 | const bookmarks = await fetchBookmarks(1000, null); 84 | if (bookmarks.error) { 85 | console.log(bookmarks.error); 86 | return; 87 | } 88 | 89 | const { edges } = bookmarks.data.data.search; 90 | 91 | const bookmarksList = edges.map(mapBookmark); 92 | 93 | let after = edges[edges.length - 1].cursor; 94 | let hasNextPage = bookmarks.data.data.search.pageInfo.hasNextPage; 95 | while (hasNextPage) { 96 | const nextBookmarks = await fetchBookmarks(1000, after); 97 | if (nextBookmarks.error) { 98 | console.log(nextBookmarks.error); 99 | return; 100 | } 101 | 102 | after = nextBookmarks.data.data.search.pageInfo.endCursor; 103 | hasNextPage = nextBookmarks.data.data.search.pageInfo.hasNextPage; 104 | 105 | const alreadyExists = bookmarksList.find(bookmark => bookmark.url === nextBookmarks.data.data.search.edges[0].node.url) 106 | 107 | if (!alreadyExists) { 108 | bookmarksList.push(...nextBookmarks.data.data.search.edges.map(mapBookmark)); 109 | } else { 110 | console.log('Already exists:', nextBookmarks.data.data.search.edges[0].node.url); 111 | } 112 | } 113 | 114 | await writeJsonFile(bookmarksList); 115 | })(); 116 | -------------------------------------------------------------------------------- /scripts/generate-changelog.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs/promises'; 2 | import path from 'path'; 3 | 4 | const cwd = process.cwd(); 5 | 6 | (async () => { 7 | const [, , title] = process.argv; 8 | 9 | console.log(title); 10 | 11 | const changelogPath = path.join(cwd, 'src', 'content', 'changelog', 'changelog.json'); 12 | const changelog = await fs.readFile(changelogPath, 'utf-8'); 13 | const changelogParse = JSON.parse(changelog); 14 | 15 | const changelogUpdated = [ 16 | ...changelogParse, 17 | { 18 | time: new Date().toISOString(), 19 | title, 20 | }, 21 | ]; 22 | 23 | await fs.writeFile(changelogPath, JSON.stringify(changelogUpdated)); 24 | })(); 25 | -------------------------------------------------------------------------------- /scripts/generate-til.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | 4 | import { slugify } from './slugify'; 5 | 6 | const run = async () => { 7 | const dirRoot = path.resolve(process.cwd()); 8 | 9 | const template = `\ 10 | --- 11 | slug: {{slug}} 12 | title: {{title}} 13 | createdAt: {{createdAt}} 14 | --- 15 | `; 16 | 17 | const [_, __, title, ...tags] = process.argv; 18 | 19 | let frontmatter = template 20 | .split('\n') 21 | .filter(Boolean) 22 | .filter(str => str !== '---').join('\n'); 23 | 24 | const createdAt = new Date(); 25 | 26 | const slug = slugify(title); 27 | 28 | frontmatter = frontmatter.replace('{{slug}}', `"${slug}"`) 29 | frontmatter = frontmatter.replace('{{title}}', `"${title}"`); 30 | frontmatter = frontmatter.replace('{{createdAt}}', `${createdAt.toISOString()}`); 31 | 32 | if (Array.isArray(tags) && tags.length > 0) { 33 | const tagsFormatted = tags 34 | .map(tag => slugify(tag)) 35 | .map((tag, i) => ` - ${tag}`) 36 | .join('\n'); 37 | 38 | frontmatter += `\ntags:\n${tagsFormatted}` 39 | } 40 | 41 | const data = `\ 42 | --- 43 | ${frontmatter} 44 | --- 45 | `; 46 | 47 | const dirBlog = path.resolve(dirRoot, 'src', 'content', 'til'); 48 | 49 | fs.writeFileSync(path.resolve(dirBlog, `${createdAt.toISOString()}-${slug}.md`), data, { encoding: 'utf-8' }); 50 | } 51 | 52 | run(); 53 | -------------------------------------------------------------------------------- /scripts/new-post.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import fs from 'fs'; 3 | 4 | import { slugify } from './slugify'; 5 | 6 | const getArticleTemplate = () => { 7 | const template = path.resolve(process.cwd(), 'scripts', 'post.template.md'); 8 | const content = fs.readFileSync(template, { encoding: 'utf-8' }); 9 | 10 | return content; 11 | } 12 | 13 | const run = async () => { 14 | const dirRoot = path.resolve(process.cwd()); 15 | 16 | const template = getArticleTemplate(); 17 | 18 | const [_, __, title, ...tags] = process.argv; 19 | 20 | let frontmatter = template 21 | .split('\n') 22 | .filter(Boolean) 23 | .filter(str => str !== '---').join('\n'); 24 | 25 | const createdAt = new Date(); 26 | 27 | const slug = slugify(title); 28 | 29 | frontmatter = frontmatter.replace('{{slug}}', `"${slug}"`) 30 | frontmatter = frontmatter.replace('{{title}}', `"${title}"`); 31 | frontmatter = frontmatter.replace('{{pubDate}}', `${createdAt.toISOString()}`); 32 | 33 | if (Array.isArray(tags) && tags.length > 0) { 34 | const tagsFormatted = tags 35 | .map(tag => slugify(tag)) 36 | .map((tag, i) => ` - ${tag}`) 37 | .join('\n'); 38 | 39 | frontmatter += `\ntags:\n${tagsFormatted}` 40 | } 41 | 42 | const data = `\ 43 | --- 44 | ${frontmatter} 45 | --- 46 | `; 47 | 48 | const dirBlog = path.resolve(dirRoot, 'src', 'content', 'blog'); 49 | 50 | fs.writeFileSync(path.resolve(dirBlog, `${createdAt.toISOString()}-${slug}.md`), data, { encoding: 'utf-8' }); 51 | } 52 | 53 | run(); 54 | -------------------------------------------------------------------------------- /scripts/post.template.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: {{slug}} 3 | title: {{title}} 4 | pubDate: {{pubDate}} 5 | draft: true 6 | --- -------------------------------------------------------------------------------- /scripts/slugify.ts: -------------------------------------------------------------------------------- 1 | export const slugify = (str: string) => 2 | str 3 | .normalize('NFKD') 4 | .replace(/[\u0300-\u036f]/g, '') 5 | .trim() 6 | .toLowerCase() 7 | .replace(/[^a-z0-9 -]/g, '') 8 | .replace(/\s+/g, '-') 9 | .replace(/-+/g, '-'); -------------------------------------------------------------------------------- /src/components/Footer.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { GITHUB_REPO_URL } from '../config'; 3 | import Link from './Link.astro'; 4 | 5 | const navLinks = [ 6 | { 7 | title: 'Tags', 8 | href: '/tags', 9 | isExternal: false, 10 | }, 11 | { 12 | title: 'GitHub', 13 | href: GITHUB_REPO_URL, 14 | isExternal: true, 15 | }, 16 | { 17 | title: 'Twitter', 18 | href: 'https://twitter.com/noghartt', 19 | isExternal: true, 20 | }, 21 | { 22 | title: 'RSS', 23 | href: '/rss.xml', 24 | isExternal: true, 25 | }, 26 | ]; 27 | --- 28 | 29 | 47 | 48 | -------------------------------------------------------------------------------- /src/components/GoBackButton.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import Link from "./Link.astro"; 3 | 4 | --- 5 | 6 | 7 |

8 | Go back 9 |

10 | 11 | -------------------------------------------------------------------------------- /src/components/Link.astro: -------------------------------------------------------------------------------- 1 | --- 2 | interface Props { 3 | href: string; 4 | isExternal?: boolean; 5 | } 6 | 7 | const { href, isExternal = false } = Astro.props; 8 | 9 | const externalProps = isExternal 10 | ? { target: '_blank', rel: 'noreferrer noopener' } 11 | : {}; 12 | --- 13 | 14 | -------------------------------------------------------------------------------- /src/components/Posts.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { CollectionEntry } from 'astro:content'; 3 | 4 | import Link from './Link.astro'; 5 | 6 | interface Props { 7 | posts: CollectionEntry<'blog'>[]; 8 | } 9 | 10 | const { posts } = Astro.props; 11 | --- 12 |
13 | 14 | 33 |
34 | 35 | 52 | -------------------------------------------------------------------------------- /src/components/og.tsx: -------------------------------------------------------------------------------- 1 | import { SITE } from '../config'; 2 | import type { CollectionEntry } from 'astro:content'; 3 | import dayjs from 'dayjs'; 4 | 5 | type Props = CollectionEntry<'blog'> & { 6 | tags?: boolean; 7 | date?: boolean; 8 | } 9 | 10 | export const og = ({ date = true, tags = true, ...props }: Props) => ( 11 |
21 |
29 |
30 |

{SITE.website}

31 |

{props.data.title}

32 |
33 |
34 | {tags ? ( 35 |

36 | {props.data.tags.map((tag, i) => ( 37 | #{tag} 38 | ))} 39 |

40 | ) : null} 41 | {date ?

{dayjs(props.data.createdAt).format('YYYY-MM-DD')}

: null} 42 |
43 |
44 |
45 | ); 46 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | export const SITE = { 2 | title: "Noghartt's garden", 3 | website: 'https://noghartt.dev', 4 | description: "A place where I put all my thoughts", 5 | author: 'Guilherme Ananias ', 6 | } 7 | 8 | export const GITHUB_PROFILE_URL = 'https://github.com/noghartt'; 9 | export const GITHUB_REPO_URL = `${GITHUB_PROFILE_URL}/blog`; 10 | export const TWITTER_URL = 'https://twitter.com/noghartt'; 11 | -------------------------------------------------------------------------------- /src/content/blog/2022-06-22T03:00:00.000Z-simplifying.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: simplifying 3 | title: Simplifying things 4 | pubDate: 2022-06-22T03:00:00.000Z 5 | tags: 6 | - self-improvement 7 | --- 8 | 9 | Simplifying things is one of the most underrated ideas that people have when doing anything. 10 | But understand why you need it and how you can do it can improve a lot of things in your daily 11 | workflow. 12 | 13 | An **abstraction** is a nice way to simplify things. But what is an abstraction? 14 | It's the process of removing implementation details of the final result. Abstracting 15 | things is a process that we, humans, do every day. You don't need to expose every 16 | detail from something, abstract it in a way that turns more easily to understand is 17 | a good way to do it. 18 | 19 | We can talk that **automation** is a way to abstract things too, in general I agreed with 20 | that. But, automate things is a way to turn it more simplified. For example, you 21 | can automate your daily workflow in some ways: 22 | 23 | - Remove spams from your email inbox; 24 | - Schedule things in your agenda; 25 | - Routine; 26 | - Write things; 27 | 28 | And lot of other things that you can do to help your daily workdflow. I think that we 29 | can agree that it's a good way to simplifcate your day, right? 30 | 31 | ## Simplification as code 32 | 33 | But thinking in programming, how we can simplify our model? What things we should do to 34 | improve our daily coding sessions? How we can turn our work easier? There are some thigns 35 | that we can do to improve it. 36 | 37 | One of the things that we could understand is: we don't need every feature from some package, 38 | framework, etc. It's a good idea know about the existence of this function, but think if it's 39 | really necessary the usage of it on the scope of your project is a way to do simplification even 40 | before write a line of code. 41 | 42 | An example about it is: did you know that Mongoose (an ODM to handle MongoDb) has a way to manage 43 | versions of your documents? If you didn't know, yes. There's a way to do it. The `__v` is a simple 44 | property that stores an incremental integer and the propose behind it is: every time that you change the 45 | structure of this document, `__v` will be incremented. 46 | 47 | In some cases, we can treat it to do something based on the version of this document. Write a migration, 48 | treat some internal logic or other things like it. But, thinking in your code, do you think that it's a 49 | good idea to handle something like it? Thinking in every thing that you need to treat when write a code 50 | to handle it, it's a good idea to do it? With every conditional branch, every corner case, every minimal 51 | detail that you need to trait when is handle some sensitive data like a document in your database. 52 | 53 | When you use a feature of the library, framework or something like that, and doesn't think in the consequences 54 | of it, it's the opposite of simplification, you are turn your work harder from now on. You just complicated the 55 | work that you or other person will have to do when maintain this code, and over time this work will be more and 56 | more complicated because the complexity will grow, and thinking in some months or a year, you or the person that 57 | will fix the bug that appears in your code will say that this code has been simplified or not? 58 | -------------------------------------------------------------------------------- /src/content/blog/2023-02-18T03:00:00.000Z-writing-things-down.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: writing-things-down 3 | title: Writing things down 4 | pubDate: 2023-02-18T03:00:00.000Z 5 | tags: 6 | - writing 7 | - self-improvement 8 | --- 9 | 10 | How much stuffs did you write down today? 11 | 12 | As time goes by, more I believe that you need to write things down more and more. Documenting stuffs is a good way to believe in the long term game. 13 | 14 | Writing is a good way to put your thoughts in a paper (or anything else) and validate if they make sense. If you are missing some point that is important to understand all the context behind the subject. 15 | 16 | Writing is a good way to align your ideas with other people. Comparing the idea and checking what you don't know yet. 17 | 18 | Everyone should write things down. Just write things down. 19 | -------------------------------------------------------------------------------- /src/content/blog/2023-07-08T03:00:00.000Z-blogroll.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: blogroll 3 | title: Blogroll 4 | pubDate: 2023-07-08T03:00:00.000Z 5 | tags: 6 | - blog 7 | - list 8 | --- 9 | 10 | I'm a person that likes to read a lot of things, and I have a lot of blogs that I like to read. I'll list here some of them: 11 | 12 | ## Summary 13 | 14 | - [Personal blogs](#personal-blogs) 15 | - [Self-improvement](#self-improvement) 16 | - [Computer science](#computer-science) 17 | - [Company blogs](#company-blogs) 18 | - [Newsletters](#newsletters) 19 | - [RSS Feeds](#rss-feeds) 20 | 21 | ## Personal blogs 22 | 23 | - [Joel Hooks](https://joelhooks.com/) 24 | - [Gwern Branwen](https://www.gwern.net/) 25 | - [Drew DeVault](https://drewdevault.com/) 26 | - [Eli Bendersky](https://eli.thegreenplace.net/) 27 | - [Eliot Peper](https://www.eliotpeper.com/) 28 | - [Julian Shapiro](https://www.julian.com/) 29 | - [Nikita Voloboev](https://wiki.nikitavoloboev.xyz/) 30 | - [Tom MacWright](https://macwright.com/) 31 | - [Paul Graham](http://www.paulgraham.com/articles.html) 32 | - [Seth Godin](https://seths.blog/) 33 | - [Derek Sivers](https://sivers.org/blog) 34 | - [David Perell](https://www.perell.com/blog) 35 | - [Ben Kuhn](https://www.benkuhn.net/) 36 | - [Alexey Guzey](https://guzey.com/) 37 | - [Hillel Wayne](https://www.hillelwayne.com/) 38 | 39 | ## Self-improvement 40 | 41 | - [Farnam Street](https://fs.blog/) 42 | - [James Clear](https://jamesclear.com/articles) 43 | - [Mark Manson](https://markmanson.net/articles) 44 | - [Minding your way](https://mindingourway.com/) 45 | - [Ness Labs](https://nesslabs.com/blog) 46 | - [Nat Eliason](https://www.nateliason.com/blog) 47 | - [Scott Young](https://www.scotthyoung.com/blog/) 48 | 49 | ## Computer science 50 | 51 | - [Julia Evans](https://jvns.ca/) 52 | - [TK Kinoshita](https://www.iamtk.co/) 53 | - [Dan Abramov](https://overreacted.io/) 54 | 55 | ## Company blogs 56 | 57 | - [Stripe](https://stripe.com/blog) 58 | - [Airbnb](https://medium.com/airbnb-engineering) 59 | - [Uber](https://eng.uber.com/) 60 | - [Netflix](https://netflixtechblog.com/) 61 | - [Spotify](https://engineering.atspotify.com/) 62 | - [Dropbox](https://dropbox.tech/) 63 | - [Google](https://developers.googleblog.com/) 64 | - [Facebook](https://engineering.fb.com/) 65 | - [Twitter](https://blog.twitter.com/engineering/en_us.html) 66 | - [Microsoft](https://devblogs.microsoft.com/) 67 | - [Amazon](https://developer.amazon.com/blogs) 68 | 69 | ## Newsletters 70 | 71 | - [Hacker Newsletter](https://hackernewslettr.com/) 72 | - [Hacker News Digest](https://hndigest.com/) 73 | - [The Overflow](https://stackoverflow.blog/newsletter/) 74 | - [ByteByteGo](https://blog.bytebytego.com/) 75 | - [Latent Space](https://www.latent.space/) 76 | - [The Palindrome](https://thepalindrome.org/) 77 | 78 | ## RSS Feeds 79 | 80 | A way to group all these blogs in one place is to use a RSS reader. I use [Feedly](https://feedly.com/) to read all my RSS feeds. 81 | If you want to get the OPML that I use to view these blogs, you can get it [here](https://gist.github.com/noghartt/53e05e6bccb41e9fd69e24fa36ec65ce). 82 | -------------------------------------------------------------------------------- /src/content/blog/2023-09-12T21:58:56.609Z-2023-09-reading-list.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2023-09-reading-list 3 | title: "My reading list - September 2023" 4 | pubDate: 2023-09-12T21:58:56.609Z 5 | tags: 6 | - list 7 | - reading 8 | --- 9 | 10 | Following the ideas from [My reading list](https://samueldurantes.github.io/blog/post/my-reading-list) and [Reading List August 2023](https://poorlydefinedbehaviour.github.io/posts/reading_list_august_2023/), 11 | I'll be update this note while reading something that I think that can be useful for myself in the future. 12 | 13 | ## Computer Science 14 | 15 | - [Code without fear. Sometimes](https://reasoning.page/2023/09/12/code-without-fear-sometimes/) 16 | - [Simplify: move code into database functions](https://sive.rs/pg) 17 | - [In a git repository, where do your files live?](https://jvns.ca/blog/2023/09/14/in-a-git-repository--where-do-your-files-live-/) 18 | - [Side effecting a deopt](https://www.recompiled.dev/blog/deopt/) 19 | - [Your WiFi Can See You](https://mrereports.substack.com/p/your-wifi-can-see-you) 20 | - [64-Bit Bank Balances ‘Ought to be Enough for Anybody’?](https://tigerbeetle.com/blog/2023-09-19-64-bit-bank-balances-ought-to-be-enough-for-anybody/) 21 | - [Most UI Applications are Broken Real-time Applications](https://thelig.ht/ui-apps-are-broken/) 22 | - [How do databases execute expressions?](https://notes.eatonphil.com/2023-09-21-how-do-databases-execute-expressions.html) 23 | - [Was Javascript really made in 10 days?](https://buttondown.email/hillelwayne/archive/did-brendan-eich-really-make-javascript-in-10-days/) 24 | - [A crash course in DNS (Domain Name System)](https://blog.bytebytego.com/p/a-crash-course-in-dns-domain-name) 25 | - [The Design System Ecosystem](https://bradfrost.com/blog/post/the-design-system-ecosystem/) 26 | - [CSS Findings From The Threads App: Part 2](https://ishadeed.com/article/threads-app-css-part-2/) 27 | 28 | ### Videos 29 | 30 | - [Brazil Tried to Protect Its Computer Industry](https://www.youtube.com/watch?v=brOtbWIViWM) 31 | 32 | ## Productivity 33 | 34 | - [The Cult of Done](https://www.youtube.com/watch?v=bJQj1uKtnus) 35 | - [Collecting and curating material is good and we should do it more](https://buttondown.email/hillelwayne/archive/in-defense-of/) 36 | - [Work on what matters.](https://lethain.com/work-on-what-matters/) 37 | 38 | ## History 39 | 40 | - [Historical maps probably helped cause World War I](https://resobscura.substack.com/p/historical-maps-probably-helped-cause) 41 | 42 | ## Economy 43 | 44 | - [Airlines Are Just Banks Now](https://www.theatlantic.com/ideas/archive/2023/09/airlines-banks-mileage-programs/675374/) 45 | 46 | ## Biology 47 | 48 | - [What Makes Life Tick? Mitochondria May Keep Time for Cells](https://www.quantamagazine.org/what-makes-life-tick-mitochondria-may-keep-time-for-cells-20230918/) 49 | -------------------------------------------------------------------------------- /src/content/blog/2023-09-18T00:14:03.062Z-my-first-talk.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: my-first-talk 3 | title: "My first talk" 4 | pubDate: 2023-09-18T00:14:03.062Z 5 | tags: 6 | - presentation 7 | - programming 8 | --- 9 | 10 | In the last September 16th, 2023, I did my first talk ever in a meetup. In Belo Horizonte, 11 | happened the first JSParty Brasil. 12 | 13 | The experience of giving a talk, seeing the public listening to you, they looking for your 14 | slides while you explaining the aiming topic is awesome. 15 | 16 | The idea behind the talk was to show a presentation about the codemod culture behind Woovi. 17 | How we scale refactor in a large codebase (more than 500k LOC) and how we move faster 18 | with these refactors. 19 | 20 | --- 21 | 22 | If you want to see the presentation slides, click [here](https://docs.google.com/presentation/d/1Y8uUNnOF1_N9w7gbkIYCGQpqPTkdjtyKbHf8fqDXpEg/edit#slide=id.p). 23 | -------------------------------------------------------------------------------- /src/content/blog/2023-10-06T02:07:39.710Z-2023-10-reading-list.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2023-10-reading-list 3 | title: "My reading list - October 2023" 4 | pubDate: 2023-10-06T02:07:39.710Z 5 | tags: 6 | - list 7 | - reading 8 | --- 9 | 10 | - [Minor Advances in Knowledge Are Still a Worthwhile Goal](https://tratt.net/laurie/blog/2023/minor_advances_in_knowledge_are_still_a_worthwhile_goal.html) 11 | - [What scientist must know about hardware to write fast code?](https://viralinstruction.com/posts/hardware/) 12 | - [Making Hard Things Easy](https://www.youtube.com/watch?v=30YWsGDr8mA) 13 | - [Union vs Sum types](https://viralinstruction.com/posts/uniontypes/) 14 | -------------------------------------------------------------------------------- /src/content/blog/2023-10-08T17:23:51.870Z-iterate-over-your-feedback-loop.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: iterate-over-your-feedback-loop 3 | title: "Iterate over your feedback loop" 4 | pubDate: 2023-10-08T17:23:51.870Z 5 | tags: 6 | - self-improvement 7 | - thinking 8 | - system-theory 9 | --- 10 | 11 | In the last month, I was reading the [Thinking in Systems](https://www.amazon.com/Thinking-Systems-Donella-H-Meadows/dp/1603580557) book. 12 | It's a good book that clarify some ideas about how to sistematically think 13 | in how systems works and the _"rational"_ behind it. 14 | 15 | Around the complexity of an entire system. A system can be defined as a network 16 | structure connecting pieces that will produces one or more things from it. 17 | 18 | One of the core aspects of a system is _feedback loop_. Everything can cause a 19 | feedback loop, and every action can produce a feedback on the system or another 20 | system. 21 | 22 | A feedback loop is the source of a side-effect that impacts in some change around 23 | an aspect of your system. The output of the system can generate a positive or a negative 24 | response, this is the feedback of your action. Giving that response, you can use it against 25 | your system as the new input, then you validate the new hypothesis and iterate over them. 26 | This is what we call the feedback loop. 27 | 28 | Thinking that everything that you do is a part of a system, it will help you to 29 | identify a set of feedback loops around your actions. But, why is important to 30 | have this conscioussness around what you're doing? 31 | 32 | Identify the effects of your actions and their responses is a cheaper way to 33 | iterate with a clearer idea of your goal. After the feedback, you can adjust 34 | your mental model and identify if you're closer to your goal. 35 | 36 | Iterate faster over your feedback loops give you advantages, more iterations over 37 | your loops give you: 38 | 39 | - A better understand about where you are. If you're reaching your goal; 40 | - A clearer understading around the rules of your system and the path that let you reach where you are; 41 | 42 | More iterations implies in a better understading of the system. A more accurate 43 | mental model. 44 | 45 | See what are the feedback loops around what you are doing. 46 | -------------------------------------------------------------------------------- /src/content/blog/2023-10-10T01:09:53.902Z-thinking-in-systems.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: thinking-in-systems 3 | title: "Thinking in Systems" 4 | pubDate: 2023-10-10T01:09:53.902Z 5 | tags: 6 | - bookshelf 7 | - system-theory 8 | --- 9 | 10 | - **Note: 5/5** 11 | - **Finished: 2023-10-09** 12 | 13 | Thinking in Systems is one of the best books that I read in 2023. To be honest, 14 | I can't absorb all the knowledge that this work writes down. 15 | 16 | The idea around all this book is to give you a better idea around how systems works, 17 | in a internal, rational way. As an introduction to _"non system thinkers"_, the book 18 | proposes to show to you. 19 | 20 | With that idea in mind, they will presentate a lot of concepts about system domains and, 21 | based on that, it'll introduce a new _"meta"_ mental model that will allow you to see our 22 | non-linear world in a better way. 23 | -------------------------------------------------------------------------------- /src/content/blog/2023-11-02T14:16:34.806Z-my-reading-list-november-2023.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: my-reading-list-november-2023 3 | title: "My reading list - November 2023" 4 | pubDate: 2023-11-02T14:16:34.806Z 5 | tags: 6 | - list 7 | - reading 8 | --- 9 | 10 | - [What do we mean by "the foundations of mathematics"?](https://lawrencecpaulson.github.io/2023/11/01/Foundations.html) 11 | - [Writing a storage engine for Postgres: an in-memory Table Access Method](https://notes.eatonphil.com/2023-11-01-postgres-table-access-methods.html) 12 | - [Biohacking Lite](https://karpathy.github.io/2020/06/11/biohacking-lite/) 13 | - [A BETTER EXPLANATION OF THE LISKOV SUBSTITUTION PRINCIPLE](https://www.hillelwayne.com/post/lsp/) 14 | - [Some Thoughts on Software Expertise](https://buttondown.email/hillelwayne/archive/some-thoughts-on-software-expertise/) 15 | - [Sorry, I'm a Teapot](https://thehistoryoftheweb.com/im-a-teapot/) 16 | - [Cosmic Ray Failures of Power Semiconductor Devices](https://spectrum.ieee.org/cosmic-ray-failures-of-power-semiconductor-devices) 17 | - [67 Weird Debugging Tricks Your Browser Doesn't Want You to Know](https://alan.norbauer.com/articles/browser-debugging-tricks) 18 | - [principles are products of practice, not the reverse](https://alsado.ca/posts/principles-are-products-of-practice/) 19 | -------------------------------------------------------------------------------- /src/content/blog/2023-11-15T23:32:02.614Z-writing-a-tree-walk-interpreter-from-scratch-with-rust.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: writing-a-tree-walk-interpreter-from-scratch-with-rust 3 | title: "Writing a Tree-Walk Interpreter From Scratch With Rust" 4 | pubDate: 2023-11-15T23:32:02.614Z 5 | tags: 6 | - programming-language 7 | - rust 8 | draft: true 9 | --- 10 | -------------------------------------------------------------------------------- /src/content/blog/2023-11-16T11:21:00.886Z-running-ghdl-on-macos-m1.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: running-ghdl-on-macos-m1 3 | title: "Running GHDL on MacOS M1" 4 | createdAt: {{createdAt}} 5 | pubDate: 2023-11-16T11:21:00.886Z 6 | draft: true 7 | tags: 8 | - mac 9 | - tutorial 10 | --- 11 | -------------------------------------------------------------------------------- /src/content/blog/2023-12-26T14:28:10.336Z-the-awesomeness-of-lists.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: the-awesomeness-of-lists 3 | title: "The Awesomeness of Lists" 4 | pubDate: 2023-12-26T14:28:10.336Z 5 | tags: 6 | - productivity 7 | - thoughts 8 | --- 9 | 10 | Lists are a universal tool for productivity, everything can be compound into a list or can be considered one. For example, the post-its that you have in your office wall they can be treated as a list, you can handle it recursively, putting new lists inside a list. 11 | 12 | We are presented to lists being a child and they follow us for our entire life, it's an easier way to create a condensed, simplistic way to arrange data to be used. You even can have specific lists that are being written as an ordered way to instruct someone to do something, like a cooking recipe or a tutorial. 13 | 14 | You can compound and have a lot of useful data that contextualizes you about everything in a specific scope by doing a list, like me, that does a list about the key points that I want to write about in this post. 15 | 16 | The fact that you can build this solution in a lot of different solutions helps us to maintain a lot of lists easier. You can have your supermarket lists written in pieces of paper, a list of blogs that you follow written in a gist in GitHub, or even a thread at Twitter with the list of the coolest blog posts that you read, [like me](https://twitter.com/noghartt/status/1521123090587082752). 17 | 18 | Being a forgetful person with a considerably low attention-span, I found in lists an useful, disciplined way to go through my daily routine. I have lists to handle it , like: 19 | 20 | - What I need to do on my job or at home; 21 | - What are the meetings; 22 | - What I need to follow-up; 23 | - What I didn't do; 24 | 25 | These to-do lists helps me to handle my routine in an easier way, helping me to be a more organized person. Furthermore, it gives me an visibility and tracking about the things that I need to do, the urgency of them and I missed on my daily activities or my daily habits. 26 | 27 | I also handle more than my daily tasks in this structure, I like to put all my useful resources into it. My notes has a lot of lists around it. For example: 28 | 29 | - A list for the blogs and podcasts that I like to follow; 30 | - What are the tracking of the books that I'm reading (or already read) over the year; 31 | - Useful links for articles or tool resources that I believe will be useful at some moment; 32 | - And every resource that I believe will be useful for me at some moment. 33 | 34 | Lists can express a great range of communication between two or more people, they give you all the insights and the scopes related to a subject. You can structure it like a checkbox of items containing the things that you need to do with their priorities, or like an ordered list containing your favorite cooking recipe, or just an unordered list containing the summary of the presentation of a course. 35 | 36 | They are an universal, easily tool of thought that helps us to derive through your day and the entire range of things happening at the same time. 37 | 38 | Given this versatility to arrange the content and the fact that you can put everywhere, like a piece of paper, a computer file or even just structuring your thoughts as a list of things, it's what make me an enjoyer of lists and why I think that other people should be too. 39 | 40 | This is my _ode to lists_. Thanks. 41 | 42 | --- 43 | 44 | I would especially like to thank @Eckzzo and @fersilvaa16 who helped review this post. 45 | Thank you very much guys. 46 | -------------------------------------------------------------------------------- /src/content/blog/2023-12-27T20:21:07.934Z-one-year-using-obsidian.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: one-year-using-obsidian 3 | title: "One Year Using Obsidian" 4 | pubDate: 2023-12-27T20:21:07.934Z 5 | tags: 6 | - note-taking 7 | - tools 8 | --- 9 | 10 | On December 26th, 2023, I started my new and current vault in Obsidian, and was one of the best decisions that I could bring to my 2023. Now I'm doing the review around this beautiful tool that follows me in my entire year. 11 | 12 | In the last years of my life, I turned more and more of a heavy user of note-taking tools, even those _"rudimentar"_ ones like a pen and paper, I already tried a lot of tools around this subject, like Logseq, Notion, Bear, Apple Notes, Evernote, and finally Emacs with [org-mode](https://orgmode.org/), when I thought that would be the state of the art of note-taking tools for me, and yes, I think that Emacs with org-mode is one of the best tools that I've used in my entire life. And I used it for about two years, and was good. 13 | 14 | Although I like to use org-mode, I always felt that having a tool fits my workflow more easily. I'd like to just put words into a file and push it to a place where I could find it easier in the future. And well, I think that I finally found it. 15 | 16 | ## Obsidian and My Workflow 17 | 18 | The powerful philosophy around Obsidian is the concept of [File over App](https://stephango.com/file-over-app) that Steph Ango writes about. By the fact that it's just a tool that handles Markdown files in a better way and you can enhance this experience with some community plugins, you can have infinite ways to manage your workflow. 19 | 20 | It's one of the core arguments that shows why I think that Obsidian was the best tool for me at that moment, and fit it until now. If I want to move it to another app or build my solution, I just need to handle a bunch of Markdown files and everything will work great, it's a future-proof solution. 21 | 22 | My workflow is simple despite the range of community plugins and what you can do inside a vault, I just have six plugins, being them plugins that help me automatize some jobs, such as the Commander, QuickAdd, Templater, and Dataview, a query language plugin, allows me to do some specific tooling in my notes, but avoid it as much as possible. 23 | 24 | I try to maintain each note as raw as possible, just with what we can find in Markdown by default because I want to help me to migrate to another software if I need to in the future. 25 | 26 | ## Obsidian and My Learnings 27 | 28 | I would say that was an awesome year for my note-taking habits in general. I could develop more about this habit and I can found what are the exact ways that work for me. I don't know everything yet, and every day I try to improve some aspect of this habit, but I saw a lot of improvements in my entire life just by taking some notes during my day. 29 | 30 | Some statistics about what I did in my 2023 year with Obsdian: 31 | 32 | - I wrote a total of 512 notes. 33 | - 227 of them are daily journaling, which is ~44.33% of my entire vault. 34 | - 251 of them are related to my _Zettelkasten_, which is ~49% of my entire vault. 35 | - 30 of them are drafts of blog posts that I hope someday will be the light, which is ~5.85% of my vault. 36 | - I added 107 tags between the files, being the \#computer-science the most used tag, with 130 files. 37 | 38 | These are some statistics related to my work on my vault in this year, I believe that 2024 will be greater than that. 39 | 40 | The major learning related to my adventure with Obsidian was: that note-taking isn't about the tools that you use but about your process. A great process allows you to arrange your notes in a creative, better way that fits your expectations. Regardless of being Notion, Obsidian or just using your pen and a notebook. What matters is your process. 41 | 42 | By the way, this is the graph of my Obsidian on the day that I wrote this post, let's see how it will be in the next year: 43 | 44 | ![Obsidian Graph 2023](/assets/obsidian-graph-2023.png) 45 | -------------------------------------------------------------------------------- /src/content/blog/2023-12-30T19:52:17.651Z-2023-in-review.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: 2023-in-review 3 | title: "2023 in Review" 4 | pubDate: 2023-12-30T19:52:17.651Z 5 | tags: 6 | - review 7 | --- 8 | 9 | For the second year, following some of the most inspirational blogs that I follow, I will write about my year, and this time it will be public. Some of the coolest blogs that I follow on a day-to-day basis are doing it, so why can't do it too, right? 10 | 11 | I would say that 2023 was one of the greatest years of my life. Like everyone else, I had ups and downs, but the fact that I learned too much in a lot of areas of my life, makes me think that I'm a completely new person from how I started the year. Reading the OKRs that I wrote for this year I consider this idea even more. 12 | 13 | It's a good exercise to reflect on what happened this year and prepare for what is coming next, my idea with this post is to finish this year with a golden key and start the next one with all the excitement that I have writing here. 14 | 15 | For this post, I will cover some specific topics that I want to share here, they are: 16 | 17 | - Books and reading 18 | - Programming 19 | - Job 20 | - Writing 21 | 22 | ## Health 23 | 24 | I would say that 2023 was not my year for health. I do not prioritize it in a lot of ways, but the three great ones that I think are: food, exercise, and sleep. And the impact of this choice came at different times throughout my year. 25 | 26 | ### Food 27 | 28 | I love to cook things and do meal prepping, but I do not spend too much of the year around it. The trade-off was that what I was eating, in general, doesn't have some nutritive benefits, and as we know, what you eat in general is a fundamental part of the rest of your health. The quality of food in general wasn't too good. 29 | 30 | ### Exercise 31 | 32 | It has its ups and downs during the year. I tried a lot of times to go to the gym and turn it into a consistent habit because I love to do exercise. I love to run and take walks, it helps me a lot to clean my brain and help me with my thoughts, and it's connected with other aspects like controlling my anxiety and helps in the quality of my sleep. But I don't take the right priority on it and I lose my streak several times during the year. 33 | 34 | ### Sleep 35 | 36 | I'm an easier sleep, I don't have any issue trying to sleep and I can easily do it in any place that I want to do. But, the quality of my sleep is awful. Doing some tracking around it, I take just 6 hours of sleeping with an average of 1 hour of REM sleep. I made some improvements in the consistency: like not going to sleep every night around 4 AM and waking up almost all days at 6 or 7 AM. 37 | 38 | ## Books 39 | 40 | This was a great year around my reading habit. I proposed to myself to take 12 books and successfully read them until the last day of December. From those 12 books, I read 10. Which, for me, it's a great achievement, considering that I completely lost one of the habits that I most like: the habit of reading. If you want to check which are these books, you can check it on [my list of books that I read](/lists/list-of-books-that-i-read). For the next year, I already have a lot of books that I want to read, most of them technical books. 41 | 42 | One of the core things that I learned from this habit and that I will bring to my 2024 is: that I don't want to read more books, I just want to read those that make me learn something. This is one of the core philosophies that I will follow for 2024, ensuring that it's better to spend time with books that impact my life, like the ones related to self-improvement that bring some cool ideas or those technical ones that are related to a subject of my interest. 43 | 44 | ## Career and Work 45 | 46 | A great year related to my career! I had the first opportunity to give a talk, and I learned a lot of cool things in a lot of different subjects, like Math, Distributed Systems, Web stuff, Compilers, and other cool stuff that I have a lot of interest in. I want to write about all these things someday. I started a lot of different projects too, like these: 47 | 48 | - [nero](https://github.com/noghartt/nero), my tree-walk interpreted programming language written in Rust. 49 | - I rewrote my [blog](https://github.com/noghartt/blog) in Astro. 50 | - [Paxos From Scratch](https://github.com/noghartt/paxos-from-scratch), my attempt to learn more about consensus algorithms, also written in Rust; 51 | 52 | One thing that I want to bring to 2024 is the ambition to finish the projects that I started one day. I think that considering all these aspects, it was a great year for my career and I expect that 2024 may be the same. 53 | 54 | For my work, I continue working at [Woovi](https://woovi.com), for a total of 1 year and 9 months, and I can say that it is one of the best decisions I made for myself. I need to thank every one of my coworkers for this year, I was able to learn a lot not only about the work, but I was able to have some introspective processes thanks to conversations I had with each of them, and what best I could bring to myself. But I'm far from achieving the performance that I believe is ideal for my professional side, and that's exactly what I'm going to look for in 2024. 55 | 56 | ## Writing 57 | 58 | I started to write more about my ideas and insights related to things that I like in tech in 2022, but I would say that was 2023 the year where I consolidated it as one of my passions and one of habits that I love to have. Exposing my ideas and my beliefs in words helps me a lot to understand myself and organize my thoughts in a way that seems coherent. 59 | 60 | In 2023 I wrote a lot, I have cool blog posts that I wrote both here in this blog or [dev.to](https://dev.to), like these: 61 | 62 | - [Design System 101: Top-down Approach in Component Spacing](https://dev.to/woovi/design-system-101-top-down-approach-in-component-spacing-281m) 63 | - [Server-side Rendering (SSR) From Scratch with React](https://dev.to/woovi/server-side-rendering-ssr-from-scratch-with-react-19jm) 64 | - [Avoiding UI Regressions With Jest](https://dev.to/woovi/avoiding-ui-regressions-with-jest-49f3) 65 | 66 | Other blog posts have been written here. You can find them on the [respective list](https://noghartt.dev). 2023 was a good year for improving my writing skills and knowing how to write for the final user in a good way. 67 | 68 | ## Next steps in 2024? 69 | 70 | Well, this was a little about my year in review. I believe that 2024 will be so great than 2023 will be for me, and I hope that can be great for you too. 71 | 72 | For 2024, the core aspect of what I want to focus on is health. Believing more and more that having a healthier body and a healthier mind is a core, fundamental piece to have a peak performance in any other aspect of my life. Focusing a lot on what I already talked about before: food, exercise, and sleep. 73 | 74 | Meal prepping and cooking are some of the best hobbies that I have in my life, and improving them during 2024 will be great stuff. Even because cooking is a good way to take some rest of the _"outside world"_ and recharge your batteries. 75 | 76 | Exercise and sleep will be carefully taken as priorities too. Ensuring that I'll turn it into one of the habits for my new year. 77 | 78 | I want to write more too. I have a lot of ideas for blog posts and series that I would like to write and I will move forward to get out of the paper and put it into screens, In 2024 I will write much more. 79 | 80 | In terms of other aspects of my life, I want to take more travels with my girlfriend, one feeling that I think I've lost in the last years was the anxiety of discovering new things, new people, new languages, and/or new cultures. I believe that it is an enriching way to grow in life and learn more about yourself and others, and it's the kind of experience that you take for the rest of your life, it's what makes you alive. I already have some things planned on it and others I will discover yet. 81 | 82 | The word for my 2024 will be consistency. In every aspect of my life. 83 | 84 | I would like to say a big thank you to all the people who played an important role in my 2023. I hope your year was as special as mine. And a special thank you to these people: to my girlfriend who supports me despite my annoyance, I love you too much, to my friends who made my 2023 much better, and a special thank you to Sibelius and Ivan who were essential mentors and friends for my professional and personal growth in this year, thanks for all the advices. 85 | 86 | Happy New Year, reader! I hope that 2024 will be so great for you too! 87 | -------------------------------------------------------------------------------- /src/content/blog/2024-01-21T14:39:29.114Z-increasing-your-friction-area.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: increasing-your-friction-area 3 | title: "Increasing Your Friction Area" 4 | pubDate: 2024-01-21T14:39:29.114Z 5 | tags: 6 | - self-improvement 7 | - career 8 | --- 9 | 10 | One of the best ways to grow in your life, in any aspect, is by increasing your 11 | exposed friction area to experiences. What I call friction area is the _"surface"_ 12 | that will be exposed to the reactions you do. 13 | 14 | Everything you do in your day compounds your friction area, and everything has feedback. 15 | If you let yourself do more things, you'll iterate more over their reactions. 16 | 17 | With a bigger surface, you compound what things will happen to you. It's a way to control 18 | your life thinking in the long-term game. When you compose your surface area with good actions, 19 | you will be more likely to receive positive feedback. 20 | 21 | As Sibelius Seraphini said in the article: [How to become a Senior engineer faster?](https://sibelius.substack.com/p/how-to-become-a-senior-engineer-faster), 22 | if you want to grow faster in your career, you need to say "Yes" to every new opportunity. 23 | It's a way to let yourself live more experiences. With more experiences, you grow faster, and 24 | when you grow faster, you'll live better experiences. You increased your friction area, and you're 25 | receiving more positive feedback. Positive feedback loops compound. 26 | 27 | When Shawn "swyx" Wang said on [How to Create Luck](https://www.swyx.io/create-luck), what 28 | I called the friction area can be called the "luck surface area" too. It's the same idea. It's 29 | more about how you're building habits and a routine that lets you create a strong friction 30 | area that brings positive feedback for you. 31 | 32 | The idea of "friction area" is a way to bring a mental model that lets you move and iterate faster, 33 | building a systematic way to iterate over the feedback loop of your experiences. It allows you to reap 34 | the rewards of your actions more quickly and manage them better in the long term. 35 | 36 | Now, what are you doing to increase your friction area? 37 | -------------------------------------------------------------------------------- /src/content/blog/2024-02-04T15:23:35.299Z-embrace-the-chaos-of-your-life.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: embrace-the-chaos-of-your-life 3 | title: "Embrace The Chaos of Your Life" 4 | pubDate: 2024-02-04T15:23:35.299Z 5 | tags: 6 | - self-improvement 7 | - thinking 8 | --- 9 | 10 | The last weeks were too hard for me. I need to spend too much time doing things 11 | in my personal life and ensure that I can bring good work to my professional life. 12 | 13 | For me, when this happens, there are always difficult moments. These moments are 14 | always complicated because they impacted me in different areas of my life, which 15 | generated a vicious cycle of bad moments and anxiety. 16 | 17 | But, the last time that this happened, in the same scenario, I learned a new aspect 18 | of life that hadn't clicked for me yet, but it's a too simple idea that someone can ask: 19 | "Dude, it's too obvious. Why in the hell you didn't understand it before?". And my 20 | answer would be: I don't know. 21 | 22 | You need to learn to embrace the chaos happening in your life and use it as a motion to 23 | stay on track with the things you need to do. As everyone one day said, life is like a 24 | rollercoaster with ups and downs, and you can't avoid the down moments of your life. 25 | What matters is how you approach them. 26 | -------------------------------------------------------------------------------- /src/content/blog/2024-03-03T19:37:49.312Z-set-up-nix-on-macos-using-flakes-nix-darwin-and-home-manager.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: set-up-nix-on-macos-using-flakes-nix-darwin-and-home-manager 3 | title: "Set up Nix on macOS using flakes, nix-darwin and home-manager" 4 | pubDate: 2024-03-03T19:37:49.312Z 5 | tags: 6 | - nix 7 | --- 8 | 9 | About three years ago, I started using NixOS on my personal laptop. In those days, I 10 | needed a config that would allow me to have a stable system, that could be reproducible 11 | over all my machines, and that would allow me to have a development environment that would 12 | be easy to maintain and to share with others. NixOS comes to fit all these requirements. 13 | 14 | But, since I started using a MacBook Pro (2022), I do not feel the necessity of using the 15 | Nix package manager, since I can use Homebrew to install all the packages that I need and 16 | have some kind of reproducibility with shell scripts. But, for some needs, I would like to 17 | use Nix again on my macOS now, and this blog post will be about how to set up Nix on macOS 18 | like me. 19 | 20 | ## Installing Nix on macOS 21 | 22 | Installing Nix on macOS is easy. You can use the following command to install Nix on your 23 | machine: 24 | 25 | ```sh 26 | curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install 27 | ``` 28 | 29 | This command installs the Nix package manager based on the [DeterminateSystem/nix-installer](https://github.com/DeterminateSystems/nix-installer), 30 | based on the explanation by the [Zero to Nix](https://zero-to-nix.com/concepts/nix-installer), it gives 31 | better error messages, an installation plan (like Terraform), and other cool features that bring 32 | a better installation experience for you. 33 | 34 | Just follow the step by step of the installation flow and everything will be fine. 35 | 36 | ## Creating the flake file 37 | 38 | After installing Nix, you can create a `flake.nix` file that will be the entry point for your 39 | entire Nix configuration on your machine. This file will be used to define the packages that 40 | you want to install, the system configuration, and the home-manager configuration. 41 | 42 | ```nix 43 | { 44 | description = "Nix configuration"; 45 | 46 | inputs = { 47 | nixpkgs.url = "github:NixOS/nixpkgs"; 48 | 49 | nix-darwin.url = "github:lnl7/nix-darwin/master"; 50 | nix-darwin.inputs.nixpkgs.follows = "nixpkgs"; 51 | 52 | home-manager.url = "github:nix-community/home-manager"; 53 | home-manager.inputs.nixpkgs.follows = "nixpkgs"; 54 | }; 55 | 56 | outputs = inputs @ { self, ... }: let 57 | nixpkgsConfig = { 58 | config.allowUnfree = true; 59 | }; 60 | in { 61 | 62 | }; 63 | } 64 | ``` 65 | 66 | This is the basic structure of my `flake.nix`, it defines all the inputs that I will need 67 | to use in my configuration, they are: 68 | 69 | - `nixpkgs`: The main NixOS/Nixpkgs repository, that will be used to define the packages 70 | that I want to install on my machine. 71 | - `nix-darwin`: The nix-darwin repository. It brings all modules to configure your macOS 72 | system using a declarative way. 73 | - `home-manager`: The home-manager repository. It brings all modules to configure your 74 | user environment using a declarative way. 75 | 76 | ## Configuring nix-darwin 77 | 78 | After creating the `flake.nix` file, you can configure the `nix-darwin` module. You will 79 | need to create a `darwinConfigurations` field on the outputs of your `flake.nix` file, and 80 | add the hostname of your machine with the `darwinSystem` function. 81 | 82 | ```nix 83 | { 84 | # ... 85 | 86 | outputs = inputs @ { self, nix-homebrew, home-manager ... }: let 87 | nixpkgsConfig = { 88 | config.allowUnfree = true; 89 | }; 90 | in { 91 | darwinConfigurations = let 92 | inherit (inputs.nix-darwin.lib) darwinSystem; 93 | in { 94 | machine = darwinSystem { 95 | system = "aarch64-darwin"; 96 | 97 | specialArgs = { inherit inputs; }; 98 | 99 | modules = [ 100 | ./hosts/mbp/configuration.nix 101 | inputs.home-manager.darwinModules.home-manager 102 | { 103 | nixpkgs = nixpkgsConfig; 104 | 105 | home-manager.useGlobalPkgs = true; 106 | home-manager.useUserPackages = true; 107 | home-manager.users.noghartt = import ./home/home.nix; 108 | } 109 | ]; 110 | }; 111 | }; 112 | }; 113 | } 114 | ``` 115 | 116 | In that case, what I'm doing is: creating a new configuration called `machine` on the `darwinConfigurations` 117 | systems, and declaring some specific properties of that given system, they are: 118 | 119 | - The system of that machine is `aarch64-darwin`, which is the system of the new Apple Silicon 120 | Macs (MacBook Pro M1). 121 | - The `specialArgs` field is used to pass the inputs to the `darwinSystem` function. All modules 122 | are functions that accept some arguments, the `specialArgs` field lets you pass new arguments 123 | for all these imported modules. 124 | - The `modules` field is used to define the modules that will be used to configure the system. 125 | In that case, I'm using the `configuration.nix` file to define my system configuration, the 126 | `home-manager` module to configure the user environment, the `homebrew.nix` file to install 127 | all the packages that I want to install using Homebrew, and the `home.nix` file to configure 128 | my user environment using home-manager. 129 | 130 | ## Configuring my system 131 | 132 | The `configuration.nix` file is used to define some system configurations related to my 133 | MacBook Pro, like user home dir, some extra options related to Nix binaries, and other system-related configurations that you want to declare. In my case, I wrote the following `configuration.nix`: 134 | 135 | ```nix 136 | _: 137 | 138 | { 139 | services.nix-daemon.enable = true; 140 | 141 | users.users.noghartt = { 142 | home = "/Users/noghartt"; 143 | }; 144 | 145 | nix.extraOptions = '' 146 | auto-optimise-store = true 147 | experimental-features = nix-command flakes 148 | extra-platforms = x86_64-darwin aarch64-darwin 149 | ''; 150 | 151 | homebrew = { 152 | enable = true; 153 | 154 | casks = [ 155 | "discord" 156 | "visual-studio-code" 157 | ]; 158 | }; 159 | } 160 | ``` 161 | 162 | ## Configuring the home-manager 163 | 164 | The `home.nix` file is used to define the user environment configurations using the home-manager. 165 | In my case, I wrote just a simple `home.nix` file that installs some packages for me. It is 166 | like a `configuration.nix` file but for the user environment. 167 | 168 | ```nix 169 | { pkgs, ... }: 170 | 171 | { 172 | home.stateVersion = "23.11"; 173 | 174 | home.packages = with pkgs; [ 175 | htop 176 | curl 177 | coreutils 178 | jq 179 | ]; 180 | 181 | programs.zsh = { 182 | enable = true; 183 | 184 | shellAliases = { 185 | ls = "ls --color"; 186 | }; 187 | }; 188 | } 189 | 190 | ``` 191 | 192 | With that configuration, I can install the initial packages that I want to use on my 193 | machine using Nix, and gives me the powerful ability of reproducibility in a declarative way. 194 | 195 | ## Building and activating the configuration 196 | 197 | After creating all the files, you can build and activate the configuration using the following. 198 | You just need to run two specific commands to build and activate the configuration on your 199 | machine: 200 | 201 | ### 1. Building the configuration 202 | 203 | ```sh 204 | nix build .#darwinConfigurations.machine.config.system 205 | ``` 206 | 207 | It will build the configuration of your machine targeting the `darwinConfigurations.machine` 208 | outputs. Do not forget of changing the `machine` of the given name of your system configuration. 209 | 210 | ### 2. Activating the configuration 211 | 212 | ```sh 213 | ./result/sw/bin/darwin-rebuild switch --flake . 214 | ``` 215 | 216 | It will activate the configuration of your machine using the `darwin-rebuild` command. It will 217 | switch the configuration of your machine to the new configuration that you have built. 218 | 219 | ## Conclusion 220 | 221 | In this blog post, I showed how to set up Nix on macOS using flakes, nix-darwin, and home-manager 222 | like I do. I hope that this blog post can help you set up your configuration and let you 223 | use Nix on your machine too. 224 | 225 | I really love how the Nix package manager works, and I think that it is a great tool to use 226 | on your machine since it gives you a lot of power to manage your system and your user environment. 227 | You really should give it a try. 228 | 229 | If you want to see my configuration, you can check it out on my [repository](https://github.com/noghartt/nixcfg), 230 | it's all open source, feel free to use it as a base for your configuration if you want. 231 | 232 | If you have any questions, feel free to ask me on [Twitter](https://twitter.com/noghartt) or send me an [email](mailto:hi@noghartt.dev). I will be glad 233 | to help you with your doubts. 234 | 235 | ## Resources 236 | 237 | - [Some notes on using Nix](https://jvns.ca/blog/2023/02/28/some-notes-on-using-nix/) 238 | - [My first steps with Nix on Mac OSX as Homebrew replacement](https://sandstorm.de/de/blog/post/my-first-steps-with-nix-on-mac-osx-as-homebrew-replacement.html) 239 | - [How I use Nix on macOS](https://blog.6nok.org/how-i-use-nix-on-macos/) 240 | - [Setup nix, nix-darwin, and home-manager from scratch on MacBook M1 Pro](https://gist.github.com/jmatsushita/5c50ef14b4b96cb24ae5268dab613050) 241 | - [Nix Starter Config](https://github.com/Misterio77/nix-starter-configs) 242 | -------------------------------------------------------------------------------- /src/content/blog/2024-03-09T19:43:45.612Z-database-101-understanding-b-trees.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: database-101-understanding-b-trees 3 | title: "Database 101: Understanding B-Trees" 4 | pubDate: 2024-03-09T19:43:45.612Z 5 | draft: true 6 | tags: 7 | - database 8 | --- 9 | 10 | 11 | In the last months, I'm really interested in how database works internally. One of my questions was: _"How databases manages indexes? And how they are organized into the storage?"_. 12 | 13 | I tried to find some resources to understand it, but I didn't find a good resource that could explain to me in a clear way exactly how it works. 14 | 15 | Then, I started to read the [Database Internals](https://www.databass.dev/) book, inside it they have some chapters related to B-Tree and how they work. I really recommend this book if you want to learn better how databases work internally. 16 | 17 | In this post, I'll explain to you how B-Trees works as a way I would like to learn about it. 18 | 19 | As a way to a better communication through the post, I'll be calling B-Tree, but I think that it's important to mention that it will be in notion of B-Tree as an _"umbrella"_ for a given particular family of structures. In case, for our scenario of explanation, I'll be using the "on-disk B+Tree" as our reference. 20 | 21 | If you want to understand better the differences between B-Tree and B+Tree, I recommend you to read this post [here](https://www.geeksforgeeks.org/difference-between-b-tree-and-b-tree/). 22 | 23 | ## The structure of a B-Tree 24 | 25 | B-Trees are a kind of _self-balancing tree data structure_ that maintains sorted data over a number of levels. It's composed by nodes that have two specific properties: a `key` and a `value`, where the `key` is the data that will be sorted to let the tree be balanced and handle the binary search through it. 26 | 27 | This tree are composed by three specific kind of nodes: 28 | 29 | - **Root node**: The top node of the tree, it's the only node that doesn't have a parent node. 30 | - **Internal node**: The nodes that are between the root node and the leaf nodes. They are used to guide the search through the tree. 31 | - **Leaf node**: The bottom nodes of the tree, they are the nodes that have the data that we want to search. 32 | 33 | ![The structure of a B-Tree with the nodes and their kinds](/assets/b-trees.png) 34 | 35 | A core property of B-Trees is what we can call it as _"fanout"_, which is the maximum number of childrens that each non-leaf node can have. The fact that the fanout is how much pointers targeting the children nodes 36 | 37 | a node can have, it's a key property to understand how B-Trees are efficient to search through the data. 38 | 39 | In the example of the scenario above, the _fanout_ of the tree is 3. This means that each non-leaf node can have up to 3 children. For a production-ready B-Tree, this fanout number would be much higher, in the order of 100 or more, but for the sake of simplicity, we'll use 2 as a reference. 40 | 41 | ## The B-Tree Operations 42 | 43 | - Explain about insert 44 | - Explain about delete 45 | - Explain about lookup 46 | - Hook to start an explanation about the balancing in both insert/delete 47 | 48 | ## Why we need the balancing? 49 | 50 | - Explain how the balancing is important for B-Trees 51 | - Why a balanced tree has more performance than a non-balanced tree 52 | - Explain how each operation has being processed by the rebalancing of a B-Tree 53 | 54 | ## How B-Tree are being structured in storages? 55 | 56 | - Give an introduction about the difference between HDDs and SSDs 57 | - Explain about the disk structure containing cells, pages, etc 58 | - Explain how each B-Tree works handling nodes and pages 59 | - Explain about _marshalling_ and how serialized B-Tree data are organized on storage in byte sequence 60 | 61 | ## How Database applies B-Tree structure? 62 | 63 | - Explain how database implements B-Trees 64 | - How the indices are build 65 | - How they insert the B-Trees in memory and dump into storage after fulfilled 66 | - How the leaf nodes targets the offset range data for a given record data on the given table 67 | 68 | ## Conclusion 69 | 70 | - Just a conclusion lmao 71 | - Write anything that complements the dumped infos 72 | 73 | ## Resources 74 | 75 | - [Database Internals](https://www.databass.dev/) 76 | -------------------------------------------------------------------------------- /src/content/blog/2024-03-13T01:52:37.519Z-database-internals.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: database-internals 3 | title: "Database Internals" 4 | pubDate: 2024-03-13T01:52:37.519Z 5 | tags: 6 | - bookshelf 7 | - database 8 | draft: true 9 | --- 10 | -------------------------------------------------------------------------------- /src/content/blog/2024-05-15T01:45:37.727Z-rss-and-why-i-love-it.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: rss-and-why-i-love-it 3 | title: "RSS and why I love it" 4 | pubDate: 2024-05-15T01:45:37.727Z 5 | tags: 6 | - thoughts 7 | --- 8 | 9 | Inspired by some discussions through Twitter/X over the last few days, I decided to write 10 | about RSS and why I love them. I think it's a great technology that few people know 11 | about and I think it's worth learning more about it. 12 | 13 | One of the greatest things that the Internet could bring to us is data consumption. 14 | Do you already ask yourself how much data we consume compared with the past? 15 | How easy is it to just type something into a search engine and get a lot of information about it? 16 | Is just awesome. 17 | 18 | But, with great power comes great responsibility. And with a lot of information comes a lot of noise. 19 | I'm a person who likes to read blogs and learn new things, it's a great hobby and it's cool 20 | to see other people sharing their thoughts about something, being tech or not. And by that fact, I, 21 | being a lazy person, was thinking so hard about how to keep up with all the blogs that I like to read. 22 | 23 | And then, I found RSS feeds. I would say a cool invention from the 2000s that is still more useful for us 24 | nowadays than it was in the past. What a great idea would be just to aggregate every blog that you like to read 25 | into one place and just read it from there. Simple, but you can see how amazing is it? 26 | 27 | The ability to have all those blogs in one place, ensuring that every new update will be there for 28 | easy access, being notified about it and also being able to read it offline is just amazing. And that's why 29 | I love RSS feeds. It's a simple technology that is still useful for us nowadays and I hope it will be for a long time. 30 | 31 | ![NetNewsWire](/assets/rss-feeds.png) 32 | 33 | This is my RSS feed reader, NetNewsWire. On that, I have all the things I like to follow: blogs, podcasts, YouTube channels, 34 | newsletters, etc. I have more than 100 feeds there and I can't imagine my life without it. All links that you can find 35 | on [bookmarks](/bookmarks) come from that feed reader. 36 | 37 | Being an ADHD person, I think that having this kind of tool is helpful for me. I let my NetNewsWire open all the time 38 | and just read the things that I like when I have time. It's a great way to keep up with the things that I like to read and 39 | also a great way to keep my mind busy with something that I like. 40 | 41 | I hope you enjoyed this post and I hope you can give a try to RSS feeds. It's a great technology that is still useful for us. 42 | 43 | If you would like to follow my blog, you can use my [RSS feed](/rss.xml) that I have here. 44 | I am sharing my OPML file (the same one you saw in the image above), if you want some 45 | suggestions of cool blogs to follow, you can get them [here](https://gist.github.com/noghartt/53e05e6bccb41e9fd69e24fa36ec65ce). 46 | -------------------------------------------------------------------------------- /src/content/blog/2024-06-18T00:11:26.845Z-my-first-impressions-with-neovim.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: my-first-impressions-with-neovim 3 | title: "My first impressions with Neovim" 4 | pubDate: 2024-06-18T00:11:26.845Z 5 | draft: false 6 | tags: 7 | - neovim 8 | - editor 9 | --- 10 | 11 | I consider myself a kind of heavy Emacs user. During some time, about 3 12 | years, I was using Emacs as my daily driven tool for literally everything. 13 | 14 | I even used it as [my desktop manager](https://github.com/ch11ng/exwm) for some time. 15 | And to be honest, I loved it. It's cool to have everything in one place, and 16 | seeing all the pieces of the system interconnected, it's cool. 17 | 18 | But, I suffered some _skill issues_ when talking about a piece of software that, for me, is 19 | important: LSPs. I spend too much time trying to debug performance issues related to 20 | Emacs and LSP, and I was not able to find a solution to it, for large codebases it triggers 21 | some I/O blocking issues that freeze the entire editor, this wasn't the ideal kind of experience 22 | that I wanted. For that reason, I decided to switch to Neovim. 23 | 24 | ## The first attempt 25 | 26 | I'm a real fan of editors who bring the ability to have my config and let me do it in a 27 | "declarative" way. Neovim is a great example of that. Just put some code into your `init.vim` (or `init.lua`) 28 | and take some motions. I appreciate it a lot. 29 | 30 | Then, I decided that on a weekend I would try to have a minimal configuration for Neovim and let it 31 | be my daily driver for the rest of the next week. The idea was just a simple config to bring what I 32 | consider essentials to my daily workflow: 33 | 34 | - Some keybindings to navigate between files, buffers, windows, and tabs. 35 | - Some keybindings that improve my quality of life during the usage of Neovim. 36 | - An LSP client to have the ability to use the language server of my choice, given all the languages that I try to use. 37 | - A cool theme, because I want to be cute. 38 | - Some kind of plugin manager, because I think that it's a great improvement to have it. 39 | - A plugin that lets me easily know the keybindings of the editor, because I can't remember them all. 40 | 41 | ## The selection of plugins 42 | 43 | It was just like 10 plugins, being them: 44 | 45 | - `lazy.nvim`, to manage the plugins. 46 | - LSP support using `lsp-config`, `mason.nvim`, and `nvim-cmp`. 47 | - A theme based on Gruvbox. 48 | - `which-key.nvim`, similar to the Emacs one, to have a list of all the keybindings that have been defined through the configuration. 49 | - `oil.nvim`, to have a better experience navigating through files. 50 | - I remapped by myself some keybindings to have a better motion experience using them, mainly for editor/window/file navigation. 51 | 52 | It was everything that I wanted, and I think that was the right decision because it gave me some great 53 | experience trying to learn more about the native features of Neovim, mainly related to the Vim motions. 54 | 55 | ## Setting up Neovim and documentation 56 | 57 | I think that one great feature of Neovim is Lua. Seems to be a great, simple, but powerful language to write code. It has a familiar 58 | syntax that can be easily learned if you have a background and don't need any tricks (that was one of my concerns with EmacsLisp, even though I like EL and Lisp in general). 59 | 60 | After you have done the right setup and installed at least the plugins related to Lua and their LSP, you can easily code all the 61 | configurations to Neovim. For that, I suggest you use the [`neodev.nvim`](https://github.com/folke/neodev.nvim) plugin, which 62 | will help you to have a better experience with the configuration of Neovim. 63 | 64 | One aspect of Neovim that I missed a lot was the documentation. I don't know if is something related to my mental model, but 65 | the `:help` command from Neovim isn't great compared to the similar one from Emacs. Isn't easier to iterate through the documentation or 66 | even iterate through a Lua code to understand if some piece of code is doing what I want, like executing a piece of the buffer or 67 | putting a function into a REPL that can be easily used. 68 | 69 | Just in case, I know the existence of the `:lua` command, but seems to be a bit limited through the developer experience to use it, I think 70 | that is the most similar feature that we can have in Neovim to compare through the Emacs part. I need to test more the [`iron.nvim`](https://github.com/Vigemus/iron.nvim) 71 | to validate if it gives some kind of good developer experience at all. 72 | 73 | But, the thing that I was most during the first days was: documentation and some tooling to easily iterate to understand something 74 | on Neovim. 75 | 76 | By the way, after I discovered the `Telescope help_tags` command, turn made it easier to go through the documentation, it helped me a lot to understand 77 | some of the concepts and read them. However, I'm still a bit confused about some aspects of the navigation in the documentation. 78 | 79 | ## Daily workflow and motions 80 | 81 | In general, my experience using it as my daily editor was surprisingly good. I think that most of the time, it's more related to how 82 | easily is to navigate through the files and have some kind of ergonomics to do it. For the first days, I was struggling and being a little upset 83 | because the learning curve was a bit steep for motions, I was using the Neovim with a cheat sheet to get at least the basic motions, so I don't look 84 | like a gorilla using keyboards and, after a while, I was able to easily use all the simple motions that I needed to do, like those to navigate, 85 | to move around the editor, to move to the next/previous line, to move to the next/previous word, etc. 86 | 87 | I think that I miss some specific micro-features that I found in other editors, like the ability to move to the previous/next line when hitting the 88 | `j` or `k` key at the start or end of the line, or the ability to move the line up or down following my cursor, etc. I already saw some custom 89 | implementations of all these features, so I think that isn't a big problem, I'll just need to implement it by myself. 90 | 91 | But, I still struggle with some aspects of the editor, like the substitutions, the search and replace, the undo/redo, etc. I'll need to better learn how 92 | they work to understand it and apply it in the right way easily. 93 | 94 | ## Final thoughts 95 | 96 | In general, it was a great experience to use Neovim as my daily driver. It was easier than I expected, and I think that I'm going to stick with it. 97 | Although I'm still hitting some issues, I think that all the pros of Neovim are worth it, having a better experience with the editor 98 | pay by itself. 99 | 100 | If you want to see the configuration of Neovim that I used, you can [check it out here](https://github.com/noghartt/dotnvim). Feel free to use it as a base 101 | for your configuration, and if you have any questions, feel free to ask me on [Twitter](https://twitter.com/noghartt) or send me an [email](mailto:hi@noghartt.dev). 102 | -------------------------------------------------------------------------------- /src/content/blog/2024-07-09T02:05:24.305Z-software-engineering-is-more-than-just-coding.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "software-engineering-is-more-than-just-coding" 3 | title: "Software Engineering is More Than Just Coding" 4 | pubDate: 2024-07-09T02:05:24.305Z 5 | draft: false 6 | tags: 7 | - engineering 8 | - thoughts 9 | --- 10 | 11 | I have a strong belief that most of the time, there is a clear separation 12 | between two concerns: software engineering and coding. Both look similar, both 13 | work together, but they aren't the same. 14 | 15 | Software engineering is more than coding in the aspect that it involves more about 16 | your work than just your pull request on GitHub. It's more about the processes 17 | and patterns that you apply through your workflow that impact what I mean by 18 | engineering here, in this blog post. 19 | 20 | Software engineering is about the guarantee that, from the macro perspective, 21 | the product and the code that you are working on will correspond to the 22 | expectations that they have, both from the product and technical sides. 23 | 24 | About the product side, it follows the expectations around the culture and what 25 | your company, product or anything else you're working on has, like: 26 | 27 | - If it is what the customer wants; 28 | - If it will bring some quality of life improvement for your customer; 29 | - If it will be a building block for a greater feature, 30 | - And anything else that gives a clear objective for the final customer. 31 | Assuming that your _"customer"_ here could be anything in that scenario 32 | that will consume the product that you are working on. 33 | 34 | About the technical side, the core properties that should be followed in my vision 35 | are: 36 | 37 | - The guarantee that everything related to your code 38 | will follow the expectations around the patterns, the code guidelines that have 39 | been discussed in your company, project, etc. 40 | - Ensure that your feature has been tested, by yourself, by systematic tests, 41 | here being any kind of test (integration, unit, property, end-to-end, anything). 42 | - Ensure that the documentations are available and up-to-date according to the 43 | expectations that you and your coworkers have around the feature/code that you 44 | are working on. 45 | - Ensure that the code won't break the existing codebase. 46 | 47 | About my thoughts around what I believe are responsibilities of software 48 | engineers that are more than coding, I will write some of my thoughts below: 49 | 50 | ## Documentation as a Resource for the Future 51 | 52 | Documentation is one of the most important parts of a project, in my opinion. 53 | It's about the guarantee that the decisions and the resources that you have at 54 | the moment you wrote a code have been saved in a way that can be validated in the 55 | future, by yourself or any other developer that will need to maintain your code. 56 | 57 | Having a powerful context of the past decisions brings to the table the ability 58 | to review it and understand why some options have been taken or not. Some projects 59 | have been written by people that aren't in the company anymore and you can't contact 60 | them, so think how much easier it would be for you when you try to run that old 61 | project if they had at least one documentation about _"How to run Project X"_. 62 | 63 | Documentation brings to you a safe guarantee that, in the future, yourself from 64 | the past prepared all the place answering some of the future doubts that could 65 | exists. 66 | 67 | Documentation should be an atemporal feature for anyone that wants to build 68 | a resilient, scalable, and maintainable software. 69 | 70 | ## Tests as The Reinforcement Guarantee 71 | 72 | If your code isn't supported by tests, your code isn't production-ready. I would 73 | say that for the majority of scenarios, you should have at least 1 test that 74 | guarantees the behavior of a given scope. 75 | 76 | Recently, I read a great piece of blog posts from Matklad: [How to Test](https://matklad.github.io/2021/05/31/how-to-test.html), 77 | it brings some great material around how you could exactly test your software. 78 | And I believe that a strong software should be test oriented, in a perspective 79 | where you have the guarantee that, even if you inserted some specific new thing 80 | into your system, the feedback loop of the tests that you have will ensure that, if 81 | something has been broken, it will be caught up. 82 | 83 | Tests are the proof of the _axioms_ of your systems, the rules and the guarantee 84 | that your system will be working in a specific way. They aren't about what exactly 85 | users shouldn't do, but it's the guarantee that, based on what users really can do, 86 | you won't have a breaking change. 87 | 88 | Tests also let you move fast, with the security that if there is any breaking 89 | change, it will be easily caught by those ones. 90 | 91 | In any other kind of engineering, you have tests, redundancy, and tools that 92 | provide safety through their work, like a civil engineer building a bridge. 93 | Tests, for software engineers, follow the same idea. 94 | 95 | ## Migrations and Refactors as Engineers 96 | 97 | As [Linus said some time ago](https://lore.kernel.org/lkml/CA+55aFy98A+LJK4+GWMcbzaa1zsPBRo76q+ioEjbx-uaMKH6Uw@mail.gmail.com/): 98 | 99 | > WE DO NOT BREAK USERSPACE! 100 | 101 | At the moment that your code goes to production, you have more concerns than just 102 | the usability of your code. How many people will be using it? How will a breaking 103 | change impact them if you inserted a new one? What are the implications? 104 | The second and third order effects of those changes? Can you think of the entire 105 | chain of consequences of this action? 106 | 107 | You, as an engineer, should be carefully thoughtful about the decisions in your 108 | code. The implications of a specific change can impact a lot of customers in a 109 | harmful way that even you can't imagine. 110 | 111 | [Backward compatibility](https://en.wikipedia.org/wiki/Backward_compatibility) 112 | is a term that I like a lot. Being the guarantee of the interoperability of an 113 | older system (as said by Wikipedia), on the software side, it's the guarantee that 114 | we will ensure the same behavior of our APIs even for old clients. 115 | 116 | Even for internal tooling or between shared modules across your codebase, you 117 | should carefully think about backwards compatibility. You will always have a consumer 118 | of an API and, in that scenario, your API is the interface that has been exported 119 | by your functions and is being consumed on the other side of your codebase. The guarantee 120 | that it won't break, or that it will change in every place, is a guarantee of less 121 | entropy throughout your entire codebase. 122 | 123 | ## Conclusion 124 | 125 | This is what I believe are some specific parts of a job of a software engineer, 126 | coding is one of the easier parts of the job. You have a lot more concerns to think 127 | about regarding your product, your code and other related aspects of the company. 128 | 129 | And I believe that we should be more engineers and not just developers. 130 | -------------------------------------------------------------------------------- /src/content/blog/2024-07-13T02:19:37.399Z-not-about-writing-but-about-reviewing.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "not-about-writing-but-about-reviewing" 3 | title: "Not about writing, but about reviewing" 4 | pubDate: 2024-07-13T02:19:37.399Z 5 | draft: true 6 | tags: 7 | - writing 8 | --- 9 | 10 | - The powerful act of learn isn't on writing, but on reviewing what you wrote. 11 | - You should review what you wrote, being your study notes, lists, 12 | - Reviewing is like a cleaning, it's a way to clean which is garbage and what really matters. 13 | - 14 | -------------------------------------------------------------------------------- /src/content/blog/2024-07-20T05:25:03.568Z-notes-about-logical-and-vector-clocks.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "notes-about-logical-and-vector-clocks" 3 | title: "Notes About Logical and Vector Clocks" 4 | pubDate: 2024-07-20T05:25:03.568Z 5 | draft: true 6 | tags: 7 | - distsys 8 | - tla+ 9 | --- 10 | 11 | - Explain about the Times, Clocks and Ordering of Events paper 12 | - Explain about why order matters 13 | - Introduction to Logical Clocks 14 | - Intrduction to Vector Clocks 15 | - Explain about the difference between Logical and Vector Clocks 16 | - Implementation of Logical and Vector Clocks using TLA+ 17 | -------------------------------------------------------------------------------- /src/content/blog/2024-07-20T05:28:26.342Z-notes-and-learnings-with-tla.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "notes-and-learnings-with-tla" 3 | title: "Notes and Learnings with TLA+" 4 | pubDate: 2024-07-20T05:28:26.342Z 5 | draft: true 6 | tags: 7 | - distsys 8 | - tla+ 9 | - formal-methods 10 | --- 11 | -------------------------------------------------------------------------------- /src/content/blog/2024-07-25T01:24:19.992Z-do-not-trust-on-yourself-trust-on-checklists.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "do-not-trust-on-yourself-trust-on-checklists" 3 | title: "Do not trust on yourself, trust on checklists" 4 | pubDate: 2024-07-25T01:24:19.992Z 5 | draft: false 6 | tags: 7 | - thoughts 8 | --- 9 | 10 | ## Introduction 11 | 12 | Recently, I saw a specific project from [Lukeberry](https://x.com/LukeberryPi) called ["Como Debugar Frontend"](https://como-debugar-frontend.vercel.app/), in English, it would be called "How to Debug Frontend". 13 | 14 | The UI behind this project is very simple, it's just a list of checkboxes that you can follow to match your situation 15 | and validate that you are following the right steps to debug any issue that you could have through your front-end code. 16 | But, the idea behind this project is powerful: we are susceptible to failure, and we shouldn't trust ourselves, instead, 17 | we should have a fault-tolerant system that can help us to trust in the process. 18 | 19 | ## Why do checklists matter? 20 | 21 | A checklist is a [specific kind of list](https://noghartt.dev/blog/the-awesomeness-of-lists) that we can use to validate if we are following the expected steps to do something. 22 | You can see through the entire internet a range of cases of usage of checklists, like those being applied to the 23 | aviation or medical fields. 24 | 25 | In a scenario of stress or fatigue, you will be compromised by a decrease in your ability or cognitive functioning. The 26 | usage of a checklist will give you a way to _"metavalidate"_ your capabilities and will let you reason about the 27 | the current state of the situation you are facing. 28 | 29 | On ["The checklist — a tool for error management and performance improvement"](https://www.ucl.ac.uk/anaesthesia/sites/anaesthesia/files/hales-2006.pdf), the authors of the paper bring some interesting data related to the 30 | usage of checklists in some fields like aviation, medicine, and product manufacturing. 31 | 32 | We even have a book called _"The Checklist Manifesto"_, that clarifies some ideas about the usage of checklists and the 33 | spread of the concept. I suggest you read it, also read the [review from Murat Demirbas](http://muratbuffalo.blogspot.com/2024/01/the-checklist-manifesto-dr-atul-gawande.html), it's a great review that explains some ideas of the book too. 34 | 35 | ## How can I create my checklist? 36 | 37 | Now that you already know the importance of checklists to bring a better experience to your work, you, being an engineer (I suppose that you are one), do you agree that you should have a checklist for your daily work? 38 | 39 | It will give you a documented, structured way to validate if some aspect or scope of your work is being followed as expected. 40 | It will help to bring clarification to your work in the future for yourself and for the team that will need to work with you. 41 | 42 | So, which things from my work should have a checklist? 43 | 44 | - A checklist for the feature that you are working on. 45 | - A checklist with the step-by-step process to test a new feature. 46 | - A checklist with the step-by-step process to release a new version of your product. 47 | - A checklist with the step-by-step process to debug a feature, like the ["Como Debugar Frontend"](https://como-debugar-frontend.vercel.app/). 48 | - A checklist with the playbook when you're talking with a customer. 49 | - A checklist with the presentation of your product for an internal team. 50 | 51 | Those are just some examples of the things that you can have a checklist for. With that, you can validate 52 | the reality and check if it matches the expectations of the situation. 53 | 54 | ## Conclusion 55 | 56 | With that in mind, I hope that you can see how much valuable is to have a checklist for your daily work. 57 | You can apply this concept to everything that you do, even outside your work, like the way you talk with your customers. 58 | 59 | I want to find some papers and articles that bring some data related to the usage of checklists and their reduction 60 | in incidents and errors. But, clearly is a good idea to have a checklist with yourself to guarantee 61 | a pragmatic approach to how you do your work, also it's a way to reduce the noise from outside and focus on the important things. 62 | -------------------------------------------------------------------------------- /src/content/blog/2024-09-16T14:16:57.322Z-writing-a-lambda-calculus-interpreter-from-scratch.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "writing-a-lambda-calculus-interpreter-from-scratch" 3 | title: "Writing a Lambda Calculus Interpreter From Scratch" 4 | pubDate: 2024-09-16T14:16:57.322Z 5 | draft: true 6 | --- 7 | 8 | - A brief explanation of the lambda calculus 9 | - Explain the tokenizer 10 | - Explain the parser 11 | - Explain the interpreter 12 | - Explain the alpha conversion and the beta reduction 13 | -------------------------------------------------------------------------------- /src/content/blog/2024-09-17T22:56:12.488Z-always-focus-on-the-long-term.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "always-focus-on-the-long-term" 3 | title: "Always Focus on the Long Term" 4 | pubDate: 2024-09-17T22:56:12.488Z 5 | draft: true 6 | --- 7 | -------------------------------------------------------------------------------- /src/content/blog/2024-09-25T22:24:04.178Z-on-bookmarks-lists-and-the-habit-of-reading-later.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "on-bookmarks-lists-and-the-habit-of-reading-later" 3 | title: "On Bookmarks, Lists and the Habit of Reading Later" 4 | pubDate: 2024-09-25T22:24:04.178Z 5 | draft: false 6 | tags: 7 | - thoughts 8 | --- 9 | 10 | Bookmarks are underrated features. It's a good way to help you keep track 11 | of not only what you need to read but also what you need to do. Further, your 12 | bookmarks can be a way to structure your reading and your knowledge, for future 13 | reference, as Josh Leeb talked about [here](https://joshleeb.com/posts/organizing-bookmarks.html). 14 | 15 | ## About the organization of my bookmarks 16 | 17 | Inspired by a friend of mine, in January 2024 I started having a "reading list" 18 | of my bookmarks. As commented on [RSS and why I love it](https://noghartt.dev/blog/rss-and-why-i-love-it), 19 | I have an RSS feed that I use to read a lot of things during the day. But, one thing 20 | that I missed was the ability to have a list of things that shall store: what I 21 | already read and what I need to read (in the future, that kind of list always 22 | increases). 23 | 24 | So, as you can see on my [bookmarks page](https://noghartt.dev/bookmarks), I have 25 | a list containing all the content that I have consumed since January 2024, not just 26 | articles, but also videos, podcasts, etc. I have [another page](https://noghartt.dev/bookmarks/tags) 27 | to see them grouped by their tags, so I can easily find a specific bookmark given 28 | the tag I want. 29 | 30 | ### How do I store my bookmarks? 31 | 32 | The tool that I use to manage my bookmarks is [Omnivore](https://omnivore.app/), 33 | an open-source bookmark manager and "read-it-later" app. For my use case, it's a 34 | great tool, I have their extension for the browser installed that I use to store 35 | the tab that I'm seeing. 36 | 37 | Also, I'm using their mobile app, which lets me read all bookmarks that I have. 38 | In that case, I'm using it mostly to read my "read-it-later" articles while in 39 | the gym, for example. 40 | 41 | ## About the list of my bookmarks 42 | 43 | As mentioned before, further the list on Omnivore, I have a list of my bookmarks 44 | inside this blog. I have two specific ways to organize them: grouped by 45 | month and grouped by tags. 46 | 47 | Most of the time, I'm using it based on tags because I think that it's how my brain 48 | works, so it's faster to remember what I exactly want. For example, if I want to 49 | read something that I didn't read yet, I can just go to the tag `#for-later`. If 50 | If I want to recover something related to a computer science topic, I can go to the 51 | tag `#cs` or one of their specific subtags like `#cs/distsys`. 52 | 53 | Specifically about tags, mentioning again Josh Leeb, who wrote a post about 54 | [Scopped Tagging Bookmarks](https://joshleeb.com/posts/scoped-tagging.html). where 55 | he tries some approaches explains some of the problems and presents some approaches 56 | for it. 57 | 58 | In my case, I have a kind of implementation of what he mentioned as HNT (Hierarchical 59 | Namespaced Tagging), so on Omnivore and, you can see here at my blog, I did a hierarchical 60 | structure for my tags. But, I think that it's a process that can be error-prone 61 | sometimes, like when you need to be a more specific tag or a less specific one, 62 | or when You didn't find a specific tag that matches your need for some bookmarks. 63 | 64 | ## About the habit of reading later 65 | 66 | Then, as mentioned before, one of my specific tags that I use (and I believe that 67 | is one of the most used by myself), is `#for-later`. Specifically this tag, I use 68 | to store every bookmark that I didn't read yet but I think that it's interesting. 69 | 70 | I don't like the idea of storing "read-it-later" articles at all seems to be more 71 | a product of a FOMO rather than a real interest, but it's something that I am 72 | still maintaining just as a "habit". 73 | 74 | Also, I think that it's a trade-off that you need to deal with, your list of read-it 75 | later articles will be growing over time, and you will need to choose and validate 76 | if that content really will be interesting for you in the future. 77 | -------------------------------------------------------------------------------- /src/content/blog/2024-11-02T06:23:50.930Z-on-the-agency-of-doing-things.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "on-the-agency-of-doing-things" 3 | title: "On the agency of doing things" 4 | pubDate: 2024-11-02T06:23:50.930Z 5 | draft: true 6 | tags: 7 | - thoughts 8 | - management 9 | --- 10 | 11 | Just a test with a footnote[^1] 12 | 13 | [^1]: Lol 14 | -------------------------------------------------------------------------------- /src/content/blog/2024-12-30T23:58:32.012Z-2024-in-review.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "2024-in-review" 3 | title: "2024 in Review" 4 | pubDate: 2024-12-30T23:58:32.012Z 5 | draft: false 6 | tags: 7 | - review 8 | --- 9 | 10 | Following the tradition, writing my annual review. This year, being from ups and downs, a lot of things happened. 11 | I can consider 2024 a good year looking from the macro perspective, but far from what I would like. I was able to 12 | conclude my biggest objective for this year, but looking from the personal side, I wasn't good as I expected. 13 | 14 | Reflecting on what happened in this year, gave us some insights about what are the things that is going well and 15 | which things we will need to fix on the next year. And, in my case, I have a lot of things to fix. 16 | 17 | Similar to last year, the structure of the post will be following like this: we will have some core points like "health", 18 | "reading", "habits", "coding", "career", etc. And, for this year, I'll be doing a kind of comparison to see how much 19 | we improved on those ones or if we was able to maintain it. 20 | 21 | ## Health 22 | 23 | In the opposition from what I said in the expectations for 2024, I didn't take too much care from my health this year. I 24 | was a lot below the average on the three critical points on health that I believe that would help me: sleep, gym and nutrition. 25 | 26 | Specifically about those three points, I didn't dedicate myself enough to fit what I expected from those ones, and all those threes 27 | are interconnected, which had side-effects in other aspects of my life, like, for example, feeling tired during the days. In this year, 28 | I could see how much having an unhealth life impacts in our life and, in my case, mostly having psychological effects about it. 29 | 30 | From my experience, it was pretty hard to have a good night of sleep, staying focused for long times or even not being too stressful during the 31 | day. Also, it seems that it impacts a lot on "ADHD crisis", where, in some days, it was just impossible to work without my medicines. 32 | 33 | Also, from sleep routine, I think that this year was a bit difficult to stay focused on that too. Even because my new apartment is on the downtown, 34 | there's more noise and chaos, then being more disciplined on that was very hard. My sleep time average was about 6 hours, but knowing myself, I know 35 | that this isn't enough to be 100% functional on the next day. Also, I completely lost my habit of waking up between 6AM and 7AM. 36 | 37 | I'm not fully commited on gym too, it's a pretty hard habit to maintain, I need to commit hard on that and being focused on the long term objectives. 38 | But, not just from bad things, my year in health is going on, this year I discovered a new sport that I really loved: climbing. I really love it. It's one of 39 | the things that I really want to maintain in the next year. 40 | 41 | ## Reading 42 | 43 | This year, I started the year maintaining the goal of 12 books until the end of the year, but I reached out only about 6 or 7 of them, to be honest, some 44 | of them are so useless in their concepts that is completely insignificant for myself. During the year, I noted this bad behavior, I wasn't reading because 45 | I'd like to read more about the theme, I just read because of the quantity. After that, I decided to slow down my reading and coming back with better books 46 | that I'd like to read. Some of the books that I can mentioned that I read was: 47 | 48 | - Database Internals, by Alex Petrov 49 | - Antifragile, by Nassim N. Taleb 50 | - Fooled by Randomness, by Nassim N. Taleb 51 | 52 | Also, I started a lot of books that I dropped after some time, because I was feeling that the reading wasn't productive as I expected, like: _"Noise: A Flaw in Human Judgement"_ 53 | and _"Thinking Fast and Slow"_, both from Daniel Kahneman, are two of those books that I dropped after some time. 54 | 55 | In the moment I'm writing this, I'm reading what I believed that will be my first readings from 2025: _"Godel, Escher, Bach: an Eternal Golden Braid"_, by Douglas R. Hofstadter, 56 | and _"The Mind Illuminated"_, by John Yates, the last one as a recommendation from a friend, because I'm really interested in investigate some long term effects from meditation 57 | in my life. Further that, for the next year, I have a lot of good books to read, most of them focused on technical aspects, but I want to reread some of the old books that I read too. 58 | 59 | ## Career and Work 60 | 61 | I think that, from the career perspective, this year was awesome. I was able to complete the most import objective from my year in this aspect. Now, I have the great opportunity of 62 | working with awesome guys at [Fireflies.ai](https://fireflies.ai), and it's being awesome in every sense. I'm working with a lot of good engineers and having the opportunity to bring 63 | innovation for millions of users, further the aspect of learning a lot of new skills and technologies around it. 64 | 65 | From my career perspective, I could be better on that, I believe I could dedicate myself more during the year and investing more time on side projects and learning in general. I 66 | have some advances on the distributed systems topics, but below my expectations. For the next year, one of my goals is bringing a more actively approach on this topic. 67 | 68 | ## Writing 69 | 70 | From the writing side, I'd say that was an year in average. I have a feeling that I could do it better, but I have some great works this year, like: [Increasing Your Friction Area](https://noghartt.dev/blog/increasing-your-friction-area/), 71 | [Implementing Simple Paxos Consensus Algorithms With Rust](https://noghartt.dev/blog/paxos-made-simple-with-rust/) and [RSS and why I love it](https://noghartt.dev/blog/rss-and-why-i-love-it/). 72 | 73 | Not considering the drafted posts and this one, it was 10 posts during the entire year. It was in average, better than zero. For the next year, I will be more consistent on that. 74 | I think that one of the greatest issues with writing is not trying to writing the perfect article, I need to write, just it. That will be my mantra for the next year. 75 | 76 | ## Next steps for 2025 77 | 78 | This as a summary review from my year, for sure there's a lot of other things that I didn't mentioned, either because I wouldn't like to do or because I forgot. And, for 2025, 79 | I have a strong feeling that, given my 2024, it will be a better year in all aspects. I have a lot of plans for the next year and I'll commit in all of them. 80 | 81 | From the same thing I said last year, this next year I **need** to focus on my health. It's not only about being a healthier person, but, if I want to be a high-performance person, 82 | I need to have a healthier body and a healthier mind. That's why I'll be doing some checkups and working intensively to improve in this aspect of my life. From the psychological side, 83 | I'll be leaving my social medias for a time and trying to reduce my screentime. As said before, I'm really interested in meditation, I want to see how my mind, that is agitated by nature, 84 | will perform after gym and meditation, if I can think better, improve my sleep, and other related things. 85 | 86 | Being more organized is other aspect of my life for 2025 that I will being focused on. Having a better scheduled time, will bring to me some improvements on my routine, which implies in having 87 | a consistent performance accordingly to the tasks I need to work on. And, looking from the long term perspectivee too, being more organized can give me some useful insights around the things 88 | that I worked on during the week, month, quarter, semester or year. Then, I can review and change the direction of something when necessary. 89 | 90 | From the point I mentioned above, with that in mind, writing will be one of the core habits I'll maintain and improve on the next year. Not writing blog posts, but writing my thoughts. Documenting 91 | what I did, documenting things that I'm looking on, documenting how I'm doing things, because, in the future, those resources will be the reference for the next annual review, for example. I want 92 | to have more quantitative date from my life too, following the idea from Stephen Wolfram [here](https://writings.stephenwolfram.com/2019/02/seeking-the-productive-life-some-details-of-my-personal-infrastructure/), 93 | I want to track my life in quantitative perspective to bring some useful insights about the correlation of data. 94 | 95 | My focus for the next year will be more on increasing consistency on good habits, that is, guarantee that the things that I'm doing is coming from a good feedback loop and tha 96 | it will have a good return in the long term. 97 | 98 | It wasn't the best year of my life, but I'd say that one of the most importants. I'd like to thanks my girlfriend for this incredible year at her side, I love you so much, I learn a lot from you. 99 | Also, thanks for each of my friens that gave me the opportunity to share this year with them, it was incredible. 100 | 101 | The next year, for me, will be a year of consistency, reconstruction, maintenance and improvement. 102 | 103 | Happy New Year, reader! Hope that, in 2025, I bring a better version of me here. 104 | -------------------------------------------------------------------------------- /src/content/blog/2025-01-04T18:58:22.287Z-writing-your-first-nix-overlay.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "writing-your-first-nix-overlay" 3 | title: "Writing Your First Nix Overlay" 4 | pubDate: 2025-01-04T18:58:22.287Z 5 | draft: false 6 | tags: 7 | - nix 8 | --- 9 | 10 | ## Introduction 11 | 12 | After about 1 year, I came back to Nix as one of my main tools for my workflow. 13 | In case, you can see my entire macOS configuration, written in Nix, [here](https://github.com/noghartt/). 14 | 15 | After having to change MacBook devices twice during the end of the last year, I really missed 16 | Nix on my daily usage, where I need to setup my config every time, instead of just running a command. 17 | That's why I'm using Nix again after some period without it. 18 | 19 | Now, I reached a specific scenario last week, where I need to write a specific overlay for a tool. In my case, 20 | [beanprice](https://github.com/beancount/beanprice). I'm using [beancount](https://github.com/beancount/beancount), as 21 | my daily-driven tool to track my finances, and I'd like to track the value of my stocks in an easier way, instead 22 | of having to manually adding it everytime. 23 | 24 | Doing some search, I discovered that the beancount's brewfile didn't install this binary for me. After trying the 25 | `nixpkgs` version of this binary, I discovered another thing: with that version, it comes with the `bean-price` 26 | binary, but it comes with an old version, where it didn't contain a specific module to fetch some of the stock 27 | prices that I'd like to fetch (more specifically, the [alphavantage source](https://github.com/beancount/beanprice/blob/master/beanprice/sources/alphavantage.py)). 28 | For that reason, it seems to be a good argument to have an overlay for that. That's what I did, and was my first 29 | time writing an overlay from scratch. 30 | 31 | ## Writing the Module File 32 | 33 | The overlays on Nix are a kind of function, it gives for us the ability to provide some overriding some specific configurations 34 | for a given module, package or anything else that your creativity let you think about. 35 | 36 | In my case, what should I be doing? Writing a new overlay that would add a new package called `bean-price` into all Python 37 | packages modules. For that, I used this [Python section](https://github.com/GaetanLepage/nixpkgs/blob/master/doc/languages-frameworks/python.section.md) as my reference to do that. 38 | 39 | That's the output of what I did: 40 | 41 | ```nix 42 | { 43 | lib, 44 | buildPythonPackage, 45 | python3Packages, 46 | fetchPypi, 47 | isPy3k, 48 | }: 49 | 50 | buildPythonPackage rec { 51 | version = "1.2.1"; 52 | format = "setuptools"; 53 | pname = "beanprice"; 54 | 55 | disabled = !isPy3k; 56 | 57 | src = fetchPypi { 58 | inherit pname version; 59 | hash = "sha256-0/W1q25z6xNjhb7mZFpJUZ6TVNNA1BK341gOxlpOGVc="; 60 | }; 61 | 62 | # Tests require files not included in the PyPI archive. 63 | doCheck = false; 64 | 65 | propagatedBuildInputs = with python3Packages; [ 66 | python 67 | python-dateutil 68 | beancount 69 | ]; 70 | 71 | meta = with lib; { 72 | homepage = "https://github.com/beancount/beanprice"; 73 | description = "Daily price quotes fetching library for plain-text accounting "; 74 | longDescription = '' 75 | A script to fetch market data prices from various sources on the internet and render them for plain text accounting price syntax (and Beancount). 76 | 77 | This used to be located within Beancount itself (at v2) under beancount.prices. This repo will contain all future updates to that script and to those price sources. 78 | ''; 79 | license = licenses.gpl2Only; 80 | maintainers = [ ]; 81 | }; 82 | } 83 | ``` 84 | 85 | What we're doing here? We're calling the `buildPythonPackage` function accordingly to the Python interpreter. And will run four steps, 86 | accordingly to this documentation [here](https://github.com/GaetanLepage/nixpkgs/blob/master/doc/languages-frameworks/python.section.md#buildpythonpackage-function-buildpythonpackage-function): `buildPhase`, `installPhase`, `postFixup` and `installCheck`. 87 | 88 | With that, we will be able to build and have our own binary of a given package, that, in case, we're fetching all those 89 | informations based on the `src` with the `fetchPypi` function. 90 | 91 | Finally, we had this overlay done, now, we need to let both `nixpkgs` and `home-manager` know about that. 92 | 93 | ## Consuming the Overlays 94 | 95 | In my opinion, as a good pattern for that, I like to have the overlay being "exported" on a main file. 96 | For my config, I wrote a `overlays/default.nix` that does it for me: 97 | 98 | ```nix 99 | # /overlays/default.nix 100 | 101 | final: prev: 102 | 103 | let 104 | pythonPackageExtensionsOverrides = self: super: { 105 | bean-price = prev.callPackage ./bean-price { 106 | inherit (super) buildPythonPackage isPy3k; 107 | }; 108 | }; 109 | in 110 | { 111 | pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [pythonPackageExtensionsOverrides]; 112 | } 113 | ``` 114 | 115 | Now, what I'm doing is: getting all my overrides related to python and overriding it on `pythonPackagesExtensions`. 116 | Which basically override it for every Python extension (`python3`, `python`, `python39`, `python312`, etc). 117 | 118 | Now, we just need to add it on the imported `nixpkgs` and on `home-manager`, to guarantee that everything is good. 119 | 120 | From another post that I wrote last year, where I teach [how to install Nix + nix-darwin + home-manager on macOS](https://noghartt.dev/blog/set-up-nix-on-macos-using-flakes-nix-darwin-and-home-manager). My `flake.nix` config was like that: 121 | 122 |
123 | 124 | flake.nix config without overlays 125 | 126 | ```nix 127 | { 128 | inputs = { 129 | nix-homebrew.url = "..."; 130 | home-manager.url = "..."; 131 | }; 132 | 133 | outputs = inputs @ { self, nix-homebrew, home-manager ... }: let 134 | nixpkgsConfig = { 135 | config.allowUnfree = true; 136 | }; 137 | in { 138 | darwinConfigurations = let 139 | inherit (inputs.nix-darwin.lib) darwinSystem; 140 | in { 141 | machine = darwinSystem { 142 | system = "aarch64-darwin"; 143 | 144 | specialArgs = { inherit inputs; }; 145 | 146 | modules = [ 147 | ./hosts/mbp/configuration.nix 148 | inputs.home-manager.darwinModules.home-manager 149 | { 150 | nixpkgs = nixpkgsConfig; 151 | 152 | home-manager.useGlobalPkgs = true; 153 | home-manager.useUserPackages = true; 154 | home-manager.users.noghartt = import ./home/home.nix; 155 | } 156 | ]; 157 | }; 158 | }; 159 | } 160 | } 161 | ``` 162 | 163 |
164 | 165 | Now, we will need to adjust it in two parts to guarantee that everything is good: 166 | 167 | ```diff 168 | { 169 | inputs = { 170 | nix-homebrew.url = "..."; 171 | home-manager.url = "..."; 172 | + nixpkgs.url = "github:NixOS/nixpkgs"; 173 | }; 174 | 175 | - outputs = inputs @ { self, nix-homebrew, home-manager, ... }: let 176 | + outputs = inputs @ { self, nix-homebrew, home-manager, nixpkgs, ... }: let 177 | + overlays = [ (import ./overlays) ]; 178 | + 179 | + system = "aarch64-darwin"; 180 | + 181 | + pkgs = import nixpkgs { inherit system overlays; }; 182 | + 183 | nixpkgsConfig = { 184 | + inherit overlays; 185 | + 186 | config.allowUnfree = true; 187 | }; 188 | in { 189 | + packages = pkgs; 190 | + 191 | darwinConfigurations = let 192 | inherit (inputs.nix-darwin.lib) darwinSystem; 193 | in { 194 | machine = darwinSystem { 195 | system = "aarch64-darwin"; 196 | 197 | specialArgs = { inherit inputs; }; 198 | 199 | modules = [ 200 | ./hosts/mbp/configuration.nix 201 | inputs.home-manager.darwinModules.home-manager 202 | { 203 | nixpkgs = nixpkgsConfig; 204 | 205 | home-manager.useGlobalPkgs = true; 206 | home-manager.useUserPackages = true; 207 | home-manager.users.noghartt = import ./home/home.nix; 208 | } 209 | ]; 210 | }; 211 | }; 212 | } 213 | } 214 | ``` 215 | 216 | With that, you will be able to add both overlays to `nixpkgs` side, so you can add the overlays 217 | at a system-level, for NixOS, nix-darwin, or any place you're using it. And, inheriting `overlays` 218 | at the `nixpkgsConfig` at L16, will let you use the overlay in `home-manager` level. 219 | 220 | Now, in your home-manager config, you can do something like that: 221 | 222 | ```nix 223 | { pkgs, config, lib, ... }: 224 | 225 | { 226 | home.stateVersion = "25.05"; 227 | 228 | home.packages = with pkgs; [ 229 | fava 230 | python3Packages.beancount 231 | python3Packages.bean-price 232 | ]; 233 | } 234 | ``` 235 | 236 | ## Solving Conflicts on Overlays 237 | 238 | One issue that I had on this `bean-price` overlay is, as I said, the `nixpkgs` version of the `beancount` 239 | adds the `bean-price` binary. So, both packages are conflicting to decide which of the binaries should 240 | be chosen. 241 | 242 | The first solution that I saw, was adding a `meta.priority = 10;` on the overlay. But haven't success, it 243 | still getting the outdated version of the `bean-price` binary. In that case, I did a different approach: 244 | 245 | ```diff 246 | # /overlays/default.nix 247 | 248 | final: prev: 249 | 250 | let 251 | pythonPackageExtensionsOverrides = self: super: { 252 | bean-price = prev.callPackage ./bean-price { 253 | inherit (super) buildPythonPackage isPy3k; 254 | }; 255 | + 256 | + beancount = super.beancount.overrideAttrs (oldAttrs: { 257 | + postInstall = '' 258 | + ${oldAttrs.postInstall or ""} 259 | + rm $out/bin/bean-price 260 | + ''; 261 | + }); 262 | }; 263 | in 264 | { 265 | pythonPackagesExtensions = prev.pythonPackagesExtensions ++ [pythonPackageExtensionsOverrides]; 266 | } 267 | ``` 268 | 269 | I added an overlay to `beancount` package too, where add a step on `postInstall` that just remove 270 | the binary related to `/bin/bean-price`. With that, everything works as expected. 271 | 272 | > **DISCLAIMER!** 273 | > 274 | > I didn't find any other way to solve this issue. Everyone that knows a better, elegant approach to do 275 | > it, feel free to reach me out. I would really like to have a better way to solve this. 276 | > 277 | > Also, if I find something, I come back to this post and update it accordingly to what I find. 278 | 279 | ## Conclusion 280 | 281 | This is just a brief tour around how you can approach to write your first overlay. And a good introduction 282 | to understand how useful is Nix at all, you can do a lot of things or extend things that you already had as you want. 283 | It's a powerful tool in the right hands. 284 | -------------------------------------------------------------------------------- /src/content/blog/2025-04-24T01:10:19.298Z-its-all-about-solving-problems.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "its-all-about-solving-problems" 3 | title: "It's All About Solving Problems" 4 | pubDate: 2025-04-24T01:10:19.298Z 5 | draft: true 6 | tags: 7 | - thoughts 8 | --- 9 | 10 | A characteristic of a good engineer is the ability to solve problems. It's not about knowing the answers to every question, 11 | but rather about having the skills to find solutions to the problems that arise. That's what bring value to the real world. 12 | That is something that even goes beyond engineering. It's a skill and a mental model that should be applied in other areas (or even in life in general). 13 | 14 | In the end, it doesn't matter if you wrote the algorithm in a specific paradigm, using a specific language with the most elegant patterns. 15 | What will really matter is from your "final customer" and how it solves their problem. It always depends in your customer. 16 | 17 | A good mental model is breaking problems into small, deliverable solutions and how much valuation has on its delivering. Even you can be your own 18 | "final customer", for example, when you're writing a script that automates a boring process, which problem do you want to solve? Focusing on the problem 19 | is a good way to start working on a small piece of the puzzle. You can always iterate and compose it, doing small steps, but doing it well. 20 | -------------------------------------------------------------------------------- /src/content/blog/2025-04-29T04:37:06.302Z-lessons-learned-from-hosting-a-tech-event.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "lessons-learned-from-hosting-a-tech-event" 3 | title: "Lessons Learned From Hosting a Tech Event" 4 | pubDate: 2025-04-29T04:37:06.302Z 5 | draft: true 6 | tags: 7 | - dev 8 | --- 9 | -------------------------------------------------------------------------------- /src/content/changelog/changelog.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "time": "2024-08-30T22:30:29.205Z", 4 | "title": "Add a table of contents section on the bookmarks page." 5 | }, 6 | { 7 | "time": "2024-08-30T22:41:29.205Z", 8 | "title": "Add a new [/changelog](/changelog) page." 9 | }, 10 | { 11 | "time": "2024-12-31T18:18:15.937Z", 12 | "title": "New article: [2024 in Review](/blog/2024-in-review)." 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /src/content/config.ts: -------------------------------------------------------------------------------- 1 | import { defineCollection, z } from 'astro:content'; 2 | import { rssSchema } from '@astrojs/rss'; 3 | 4 | const blogCollection = defineCollection({ 5 | type: 'content', 6 | schema: z 7 | .object({ 8 | title: z.string(), 9 | pubDate: z.coerce.date(), 10 | tags: z.array(z.string()).default([]).optional(), 11 | draft: z.boolean().optional(), 12 | }) 13 | .merge(rssSchema) 14 | }); 15 | 16 | const listsCollection = defineCollection({ 17 | type: 'content', 18 | schema: z 19 | .object({ 20 | title: z.string(), 21 | tags: z.array(z.string()).optional(), 22 | }), 23 | }); 24 | 25 | const tilCollection = defineCollection({ 26 | type: 'content', 27 | schema: z.object({ 28 | title: z.string(), 29 | tags: z.array(z.string()).default([]).optional(), 30 | createdAt: z.coerce.date(), 31 | }), 32 | }); 33 | 34 | const changelogCollection = defineCollection({ 35 | type: 'data', 36 | schema: z.array(z.object({ 37 | time: z.string().datetime(), 38 | title: z.string(), 39 | })), 40 | }); 41 | 42 | export const collections = { 43 | blog: blogCollection, 44 | lists: listsCollection, 45 | til: tilCollection, 46 | changelog: changelogCollection, 47 | } 48 | -------------------------------------------------------------------------------- /src/content/lists/list-of-awesome-talks.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "List of Awesome Talks" 3 | tags: 4 | - list 5 | --- 6 | 7 | - [Scaling Yourself](https://www.youtube.com/watch?v=FS1mnISoG7U) by Scott Hanselman (2013) 8 | - [We Really Don't Know How to Compute!](https://www.youtube.com/watch?v=HB5TrK7A4pI) by Gerald Sussman (2011) 9 | - [CPU Caches and Why You Care](https://www.youtube.com/watch?v=WDIkqP4JbkE) 10 | - [Time, Clocks and Ordering of Events in a Dist. System by Dan Rubenstein](https://www.youtube.com/watch?v=hK6m6WBk-d8) 11 | - [Reconciling Everything](https://www.youtube.com/watch?v=MuK6lmsfX1E) 12 | -------------------------------------------------------------------------------- /src/content/lists/list-of-awesome-youtube-channels.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: List of Awesome Youtube Channels 3 | tags: 4 | - list 5 | --- 6 | 7 | - [A Byte of Code](https://www.youtube.com/@AByteofCode) 8 | - [@aarthificial](https://www.youtube.com/@aarthificial) 9 | - [Adam Something](https://www.youtube.com/@AdamSomething/videos) 10 | - [Aidin Robbins](https://www.youtube.com/@AidinRobbins) 11 | - [Alpha Phoenix](https://www.youtube.com/@AlphaPhoenixChannel) 12 | - [Applied Science](https://www.youtube.com/@AppliedScience) 13 | - [Asianometry](https://www.youtube.com/@Asianometry) 14 | - [Arvin Ash](https://www.youtube.com/@ArvinAsh/videos) 15 | - [Attic Philosophy](https://www.youtube.com/@AtticPhilosophy) 16 | - [Bartosz Milewski](https://www.youtube.com/@DrBartosz) 17 | - [Ben Eater](https://www.youtube.com/@BenEater) 18 | - [BigThink](https://www.youtube.com/@bigthink) 19 | - [Ben Vallack](https://www.youtube.com/@BenVallack/videos) 20 | - [Carla Quem Disse](https://www.youtube.com/@CarlaNegriLintzmayer) 21 | - [ByteByteGo](https://www.youtube.com/@ByteByteGo) 22 | - [Branch Education](https://www.youtube.com/@BranchEducation) 23 | - [Carneades](https://www.youtube.com/@CarneadesOfCyrene) 24 | - [Carnegie Mellon Computer Architecture](https://www.youtube.com/@CMUCompArch) 25 | - [Computer History Archives Project](https://www.youtube.com/@ComputerHistoryArchivesProject) 26 | - [Code Bullet](https://www.youtube.com/@CodeBullet) 27 | - [Context Free](https://www.youtube.com/@contextfree) 28 | - [Craft Computing](https://www.youtube.com/@contextfree) 29 | - [Creel](https://www.youtube.com/@WhatsACreel) 30 | - [CS Primer](https://www.youtube.com/@cs_primer) 31 | - [Explaning Computers](https://www.youtube.com/@ExplainingComputers) 32 | - [Faster than Lime](https://www.youtube.com/@fasterthanlime) 33 | - [healthyGamerGG](https://www.youtube.com/@HealthyGamerGG) 34 | - [Hackers at Cambridge](https://www.youtube.com/@HackersatCambridge) 35 | - [Low Byte Productions](https://www.youtube.com/@LowByteProductions) 36 | - [Matt D'avella](https://www.youtube.com/@mattdavella) 37 | - [Michele Minerbo](https://www.youtube.com/@micheleminerbo) 38 | - [Minute Food](https://www.youtube.com/@MinuteFood) 39 | - [Nanobyte](https://www.youtube.com/@nanobyte-dev) 40 | - [Numberphile](https://www.youtube.com/@numberphile) 41 | - [PapersWeLove](https://www.youtube.com/@PapersWeLove) 42 | - [Park Notes](https://www.youtube.com/@ParkerNotes) 43 | - [QED](https://www.youtube.com/@QED.) 44 | - [Practical Networking](https://www.youtube.com/@PracticalNetworking) 45 | - [pikuma](https://www.youtube.com/@pikuma) 46 | - [Tiago Forte](https://www.youtube.com/@TiagoForte) 47 | - [The Engineering Mindset](https://www.youtube.com/@EngineeringMindset) 48 | - [The Math Sorcerer](https://www.youtube.com/@TheMathSorcerer) 49 | - [The Computer Chronicles](https://www.youtube.com/@ComputerChroniclesYT) 50 | - [The Strange Loop Conf](https://www.youtube.com/@StrangeLoopConf) 51 | - [Software Internals](https://www.youtube.com/@eatonphil) 52 | - [Sixty Symbols](https://www.youtube.com/@sixtysymbols) 53 | - [Scott Yu Jan](https://www.youtube.com/@ScottYuJan) 54 | - [Ruri Ohama](https://www.youtube.com/@ruriohama) 55 | - [Quanta Magazine](https://www.youtube.com/@QuantaScienceChannel) -------------------------------------------------------------------------------- /src/content/lists/list-of-best-articles-that-i-read.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "List of Best Articles That I Read" 3 | tags: 4 | - list 5 | --- 6 | 7 | - [Effective Spaced Repetition](https://borretti.me/article/effective-spaced-repetition), by Fernando Borretti 8 | - [Linux Guide for Power Users](https://xnacly.me/posts/2022/linux-for-powerusers/), by xnacly 9 | - [How to Build a Computer Using Origami](https://apieceofthepi.substack.com/p/how-to-build-a-computer-using-origami) 10 | - [The Myth of the Myth of Learning Styles](https://nedbatchelder.com/blog/202309/the_myth_of_the_myth_of_learning_styles.html) 11 | - [There's Math.random(), and then there's Math.random()](https://v8.dev/blog/math-random) 12 | - [What I Wish Someone Had Told Me](https://blog.samaltman.com/what-i-wish-someone-had-told-me) 13 | - [What Every Programmer Should Know About Memory](https://people.freebsd.org/~lstewart/articles/cpumemory.pdf) 14 | - [What Every Computer Scientist Should Know About Floating-Point Arithmetic](https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) 15 | - [Know your "One Job" and Do It First](https://charity.wtf/2021/03/07/know-your-one-job-and-do-it-first/) 16 | - [Becoming a go-to person gets you promoted. Here's how to do it as a software engineer.](https://careercutler.substack.com/p/becoming-a-go-to-person-gets-you) 17 | - [An accessible introduction to type theory and implementing a type-checker](https://mukulrathi.com/create-your-own-programming-language/intro-to-type-checking/) 18 | -------------------------------------------------------------------------------- /src/content/lists/list-of-blogs-and-personal-websites.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: List of Blogs and Personal Websites 3 | tags: 4 | - list 5 | --- 6 | 7 | - [Gwern.net](https://gwern.net) 8 | - [Paul Graham](http://www.paulgraham.com/) 9 | - [Farnam Street](https://fs.blog) 10 | - [Hundredrabbits](https://100r.co/) 11 | - [Kalzumeus](https://www.kalzumeus.com/) 12 | - [Maggie Appleton](https://maggieappleton.com/) 13 | - [The Sephist](https://thesephist.com/) 14 | - [Monetary Mechanics](https://maroonmacro.substack.com/archive) 15 | - [Bruce Schneier](https://www.schneier.com/) 16 | - [Xe Iaso](https://xeiaso.net/) 17 | - [Martin Kleppmann](https://martin.kleppmann.com/) 18 | - [Logic ForAll](https://logic-forall.blogspot.com/) 19 | - [Ken Shiriff](https://www.righto.com/) 20 | - [TK](https://www.iamtk.co/) 21 | - [Bartosz Millewski](https://bartoszmilewski.com/) 22 | - [Phil Eaton](https://notes.eatonphil.com/) 23 | - [Werner Vogels](https://www.allthingsdistributed.com/articles.html) 24 | - [Josh Comeau](https://www.joshwcomeau.com/) 25 | - [Overreacted by Dan Abramov](https://overreacted.io/) 26 | - [Alexey Guzey](https://guzey.com/) 27 | - [Dan Luu](https://danluu.com/) 28 | - [Steph Ango](https://stephango.com/) 29 | - [Julia Evans](https://jvns.ca/) 30 | - [Jamie Tanna](https://www.jvt.me/) 31 | - [Arne Bahlo](https://arne.me/) 32 | -------------------------------------------------------------------------------- /src/content/lists/list-of-books-that-i-read.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: List of Books That I Read 3 | tags: 4 | - list 5 | --- 6 | 7 | This is a list containing all the books that I read 8 | or will read at some time. 9 | 10 | ## 2024 11 | 12 | - Database Internals, by Alex Petrov 13 | 14 | ## 2023 15 | 16 | - Retorica, from Aristotles 17 | - Meditations, from Marcus Aurelius 18 | - The Lean Startup 19 | - Designing Data Intensive Applications 20 | - How to Take Smart Notes 21 | - Thinking in Systems 22 | - Design Systems 23 | - Discourse on the Method 24 | - Clear Thinking 25 | - Make It Stick 26 | -------------------------------------------------------------------------------- /src/content/lists/list-of-computer-science-resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "List of Computer Science Resources" 3 | tags: 4 | - list 5 | - computer-science 6 | --- 7 | 8 | ## Books 9 | 10 | - [Haskell Programming for First Principles](https://haskellbook.com/) 11 | - [Types and Programming Languages](https://mitpress.mit.edu/books/types-and-programming-languages) 12 | - [Essentials of Compilation](https://github.com/IUCompilerCourse/Essentials-of-Compilation) 13 | - [How to design computer programs](https://htdp.org) 14 | - [Structure and Interpretation of Computer Programs](https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book.html) 15 | - [Introduction to Theory of Computation, Michael Sipser](https://www.amazon.com.br/Introduction-Theory-Computation-Michael-Sipser/dp/113318779X) 16 | - The Art of Computer Programming, Donald Knuth 17 | - [Programming Language Pragmatics](https://cs.rochester.edu/~scott/pragmatics/) 18 | - [Language Implementation Patterns](https://pragprog.com/titles/tpdsl/language-implementation-patterns/) 19 | - [Crafting interpreters](https://craftinginterpreters.com) 20 | - [Introduction to Algorithms](https://amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844) 21 | - Practical Foundations for Programming Languages 22 | - [Computer Organization and Design RISC-V edition](https://www.amazon.com/Computer-Organization-Design-RISC-V-Architecture-dp-0128203315/dp/0128203315) 23 | - [Database Systems: The Complete Book](http://infolab.stanford.edu/~ullman/pub/dscbtoc.txt) 24 | - [Introduction to Algorithms: A Creative Approach](https://doc.lagout.org/science/0_Computer%20Science/2_Algorithms/Introduction%20to%20Algorithms_%20A%20Creative%20Approach%20%5BManber%201989-01-11%5D.pdf) 25 | - High Performance Browser Networking 26 | - [Reasoned programming](http://www.doc.ic.ac.uk/~susan/firstyearbook.pdf) 27 | - The Mythical Man-Month 28 | - [Debugging](http://debuggingrules.com/) 29 | - [The Computer Science book](https://thecomputersciencebook.com/book/) 30 | - [Computer Organization and Design RISC-V edition](https://shop.elsevier.com/books/computer-organization-and-design-risc-v-edition/patterson/978-0-12-812275-4) 31 | - Database Internals 32 | - [Type Theory and Functional Programming](https://www.cs.kent.ac.uk/people/staff/sjt/TTFP/ttfp.pdf) 33 | - Specifying Systems 34 | - Land of Lisp 35 | - Purely Functional Data Structure 36 | - Virtual Machines 37 | - Practical TLA+ 38 | - Distributed Systems 39 | - Programming Languages: Principles and Paradigms 40 | - Programming Distributed Systems 41 | - Essentials of Compilation 42 | - Thiking in Distributed Systems 43 | - Understanding Software Dynamics 44 | - Transaction Processing: concepts and techniques 45 | - Modern Computer Architeture and Organization 46 | 47 | ### Books and Resources 48 | 49 | - [CS Curriculum Text Books and references](https://github.com/AB1908/CS-Books/) 50 | - [Elementary Computer Science: From Bits and Bytes to the Big Picture](https://github.com/ckirsch/book) 51 | - [Concrete Mathematics: A Foundation for Computer Science (2nd Edition)](https://www.amazon.com/gp/product/0201558025/ref=as_li_ss_tl?ie=UTF8&linkCode=sl1&tag=theende-20&linkId=112d0fc8c90030c9a9c1027cd888e7d5&language=en_US) 52 | - [Crafting interpreters](http://www.craftinginterpreters.com/) 53 | - [Free Programming books](https://github.com/EbookFoundation/free-programming-books) 54 | - [The Elements of Computing System: Building a Modern Computer](https://www.amazon.com.br/Elements-Computing-Systems-Building-Principles/dp/0262640686) 55 | - [Reading for graduate students - Computer Science](https://matt.might.net/articles/books-papers-materials-for-graduate-students/) 56 | - [Book list for streetfighting computer scientists](https://nick-black.com/dankwiki/index.php/Book_list_for_streetfighting_computer_scientists) 57 | 58 | ## Links and Projects 59 | 60 | - [Build your own X](https://github.com/codecrafters-io/build-your-own-x), a repo containing a lot of projects teaching how to build cool things, from a database from scratch, 3D stuffs and other cool features 61 | - [tpetricek/Teaching](https://github.com/tpetricek/Teaching) a repo containing study material to things like PL design, software engineering and human-computer interaction 62 | - [Timeline of Computer Science](https://scottaaronson.blog/?p=524) 63 | - [Ask Lobsters: Good theory books would you recommend?](https://lobste.rs/s/wbwtgm/good_theory_books_you_would_recommend) 64 | - [Alistair's university notes](https://github.com/johnyob/University-Notes), some notes about Computer Science university related theme 65 | - [Computer Science video courses](https://github.com/Developer-Y/cs-video-courses), a collection of courses in video about a lot of subjects related to computer science and other stuffs 66 | - [A small collection of cheatsheet](https://github.com/merveenoyan/my_notes) about DS, ML, Algorithms and other stuffs 67 | - [Knowledge sharing](https://github.com/xinrong-meng/knowledge-sharing), repository containing materials about tech stuffs related to architecture and tech-specific 68 | - [Every programmer should know](https://github.com/mtdvio/every-programmer-should-know) 69 | - [Computer science projects learning](https://github.com/practical-tutorials/project-based-learning) 70 | - [Reading for CS' graduate students](https://matt.might.net/articles/books-papers-materials-for-graduate-students/) 71 | - [Matemática fundacional para computação](https://www.tsouanas.org/fmcbook/) 72 | - [On Recursion, Continuations and Trampolines](https://eli.thegreenplace.net/2017/on-recursion-continuations-and-trampolines/) 73 | - [Preliminary discussion of the logical design of an electronic computing instrument](http://www.cs.unc.edu/~adyilie/comp265/vonNeumann.html) 74 | - [Thread of some of the best materials related to Computer Science](https://news.ycombinator.com/item?id=36088224) 75 | - [The Python Paradox](http://www.paulgraham.com/pypar.html), how _"esoteric"_ languages is attractive to smarter people 76 | - [Fantastic Learning Resources](https://matklad.github.io/2023/08/06/fantastic-learning-resources.html#Fantastic-Learning-Resources) for computer science stuffs 77 | - [Computer Science from the Bottom Up](https://www.bottomupcs.com/) 78 | - [What CS majors should know?](https://matt.might.net/articles/what-cs-majors-should-know) 79 | - [Timeline of Computer Science](https://scottaaronson.blog/?p=524) 80 | - [Computer Science Is Not About Computers, Any More Than Astronomy Is About Telescopes](https://quoteinvestigator.com/2021/04/02/computer-science/) 81 | - [The Architecture of a Simple 8-bit Computer](https://www.docdroid.net/GEfy9JB/8bitcomputer-pdf) 82 | - [Parse, don't validate](https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/) 83 | - [Project Based Learning](https://github.com/practical-tutorials/project-based-learning), computer science projects based on practical stuffs 84 | - [Challenging Projects that Every Programmer Should Try](https://austinhenley.com/blog/challengingprojects.html) 85 | - [Architecture of Open Source](https://aosabook.org/en/) 86 | - [DevDocs](https://devdocs.io/) 87 | - [BinVis](https://binvis.io/#/) binary file visual analyzer 88 | - [Computer History Wiki](https://gunkies.org/wiki) 89 | - [Professional Programming](https://github.com/charlax/professional-programming), lerning topics for programmers 90 | - [BitSavers](https://bitsavers.org/), a place where it's being save a lot of content about everything as a way to rescue and access in the future 91 | - [Great Ideas in Theoretical Computer Science](https://www.cs251.com/) 92 | - [List of challenging software projects](https://www.andreinc.net/2024/03/28/programming-projects-ideas) 93 | - [CS Curriculum Text Books and references](https://github.com/AB1908/CS-Books/) 94 | - [Elementary Computer Science: From Bits and Bytes to the Big Picture](https://github.com/ckirsch/book) 95 | - [Concrete Mathematics: A Foundation for Computer Science (2nd Edition)](https://www.amazon.com/gp/product/0201558025/ref=as_li_ss_tl?ie=UTF8&linkCode=sl1&tag=theende-20&linkId=112d0fc8c90030c9a9c1027cd888e7d5&language=en_US) #math 96 | - [Crafting interpreters](http://www.craftinginterpreters.com/) 97 | - [Free Programming books](https://github.com/EbookFoundation/free-programming-books) 98 | - [The Elements of Computing System: Building a Modern Computer](https://www.amazon.com.br/Elements-Computing-Systems-Building-Principles/dp/0262640686) 99 | - [Reading for graduate students - Computer Science](https://matt.might.net/articles/books-papers-materials-for-graduate-students/) 100 | - [Book list for streetfighting computer scientists](https://nick-black.com/dankwiki/index.php/Book_list_for_streetfighting_computer_scientists) 101 | - [Reading stuffs for Computer Sciences](https://github.com/amilajack/reading) 102 | 103 | ## Articles 104 | 105 | - [Things You Should Never Do, Part I](https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/), you shouldn't never rewrite an entire codebase from scratch. It's the worst decision that you could take. 106 | - [C Is Not a Low-Level Language](https://queue.acm.org/detail.cfm?id=3212479) 107 | - [State machines work for logic too](https://tritarget.org/#State%20Machines%20work%20for%20logic%20too) 108 | - [Project Oberon](https://people.inf.ethz.ch/wirth/ProjectOberon/PO.System.pdf), the story behind creating a Compiler, Programming Language and a Computer 109 | - [Project Oberon](https://www.projectoberon.net/) 110 | 111 | ## Papers 112 | 113 | - [A brief history of liquid computers](https://royalsocietypublishing.org/doi/10.1098/rstb.2018.0372) 114 | - [Computer Science papers](https://github.com/jeffrey-xiao/papers) a link with a lot of cool scientific papers related to computer subjects 115 | 116 | ## Blogs 117 | 118 | - [Xe Iaso's personal blog](https://xeiaso.net/) 119 | - [Martin Klepmann's blog](https://martin.kleppmann.com/) #computer-science/distsys 120 | - [Bruce Schneier](https://www.schneier.com/), an awesome person behind cryptography #cryptography 121 | - [Josh W Corneau](https://www.joshwcomeau.com/), the guy that has a lot of content about front-end, CSS and other related stuffs 122 | - [Bytes](https://bytes.zone/posts/) 123 | - [TK](https://www.iamtk.co), TeeKay personal blog, an aesthetic blog 124 | - [Bartosz Millewski](https://bartoszmilewski.com/), Bartosz is some of the best references about Category theory in the world, and has a lot of good topics about the theme #math/category-theory #math 125 | - [Not a Number, by Nanda Syahrasyad](https://www.nan.fyi/) 126 | - [All things distributed](https://www.allthingsdistributed.com/articles.html), the blog from Werner Vogels, former CTO from Amazon, an authority in distributed systems, event-driven, etc. #computer-science #computer-science/distsys 127 | - [Firstyear's blog-a-log](https://fy.blackhats.net.au/blog/) 128 | - [graydon2](https://graydon2.dreamwidth.org/), the personal blog/website from the creator of Rust language 129 | - [Ken Shriff's Blog](http://www.righto.com/), one of coolest blogs that talks about reverse-engineering on hardwares, CPUs and other cool things in computer area. 130 | - [NetworkProfile](https://blog.networkprofile.org/), a cool blog related to hardware and network stuffs. A great find. 131 | - [PoorlyDefinedBehavior](https://poorlydefinedbehaviour.github.io/), personal blog containing a lot of useful resources about Distributed systems and other really stuffs. 132 | - [Phil Eaton](https://notes.eatonphil.com/), a blog about databases and other computer stuffs 133 | - [tmp.out](https://tmpout.sh/) is a really cool blog from ELF group researcher, has an ASCII-style; 134 | - [Programming Blogs](https://danluu.com/programming-blogs/) from Dan Luu recommendation 135 | - [Ariel Davis](https://azdavis.net/) 136 | - [Fred Hebert](https://ferd.ca) 137 | - [Hirrolot](https://hirrolot.github.io/) 138 | - [Dek Engineer](https://dek.engineer/) — related to computer graphics, gamedev, etc 139 | - [Ludwig](https://ludwigabap.bearblog.dev/) — a cool blog related to CS stuffs 140 | - [Surfing Complexity](https://surfingcomplexity.blog/), a personal blog related to Distributed/Complex Systems 141 | -------------------------------------------------------------------------------- /src/content/lists/list-of-math-resources.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "List of Math Resources" 3 | tags: 4 | - list 5 | - math 6 | --- 7 | 8 | ## External links 9 | 10 | - [nCatLabs wiki](https://ncatlab.org/nlab/show/HomePage), a wiki to logic, topology and other stuffs 11 | - [An awesome list containing resource contents to study math and computer science](https://github.com/bobeff/programming-math-science) 12 | - [Interactive Linear Algebra](https://textbooks.math.gatech.edu/ila/), a book by Dan Margalit 13 | - [A mini-book about Category Theory](https://github.com/jonsterling/math) 14 | - [The Fourier Transform, explained in one sentence](https://blog.revolutionanalytics.com/2014/01/the-fourier-transform-explained-in-one-sentence.html) 15 | - [MathWiki](https://github.com/zhaoshenzhai/MathWiki) 16 | - [Papers of Per Martin Lof](https://github.com/michaelt/martin-lof) 17 | - [Physics and Math self study project](https://www.diegovera.org/recommendations) 18 | - [Math books that made you significantly better at math?](https://news.ycombinator.com/item?id=34439828) 19 | - [MathPages](https://mathpages.com/home/index.htm) 20 | - [The Stack Project](https://stacks.math.columbia.edu/browse) 21 | - [A Guide to Writing Mathematics](https://web.cs.ucdavis.edu/~amenta/w10/writingman.pdf) 22 | - [An Interactive Guide to the Fourier Transform](https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/) 23 | - [Teach Yourself Math](https://teachyourselfmath.app/), a site containing a lot of cool exercises related to Math 24 | - [ProofWiki](https://proofwiki.org/wiki/Main_Page), a wiki containing all proofs 25 | - [From the Circles to Epicycles](https://www.andreinc.net/2024/04/24/from-the-circle-to-epicycles), a visual introduction to Fourier Series 26 | - [Matemática Fundacional para a Computação](https://github.com/tsouanas/fmcbook) 27 | - [Ask yourself dumb questions – and answer them!](https://terrytao.wordpress.com/career-advice/ask-yourself-dumb-questions-and-answer-them/) 28 | 29 | ## Resources 30 | 31 | - [Mathematics Roadmap](https://github.com/TalalAlrawajfeh/mathematics-roadmap) 32 | - [The Open Source Mathematics Degree](https://github.com/shanirivers/open-source-mathematics-degree) 33 | - [ossu/math](https://github.com/ossu/math) 34 | - [Math link resources](https://github.com/bobeff/programming-math-science) 35 | - [rossant/awesome-math](https://github.com/rossant/awesome-math) 36 | - [UBL/Matematica](https://github.com/Universidade-Livre/matematica) 37 | - [MTH225 - Discrete Structures for Computer Science 1](https://publish.obsidian.md/mth225/) 38 | - [Handbook of geometry for competitive programmers](https://victorlecomte.com/cp-geo.pdf) 39 | - [Mathematics for Computer Science](https://www.cs.princeton.edu/courses/archive/spring10/cos433/mathcs.pdf) 40 | 41 | ## Tools 42 | 43 | - [Penrose](https://github.com/penrose/penrose) write beautiful diagrams with a DSL 44 | 45 | ## Math Books 46 | 47 | - Thomas'Calculus: Early Transcendentals 48 | - Precalculus: Mathematics for Calculus 49 | - Elementary Linear Algebra 50 | - Introductory Discrete Mathematics 51 | - [Linear Algebra Done Right](https://link.springer.com/book/10.1007/978-3-031-41026-0) 52 | - [Matemática Fundacional Para Computação](https://www.tsouanas.org/fmcbook/) 53 | 54 | ## Linear algebra 55 | 56 | - [Vectors, Matrices, and Linear Algebra](https://web.stanford.edu/class/nbio228-01/handouts/Ch4_Linear_Algebra.pdf) 57 | - [Introduction to Linear Algebra, Fifth Edition (2016)](https://math.mit.edu/~gs/linearalgebra/ila5/indexila5.html) 58 | - [The Art of Linear Algebra](https://github.com/kenjihiranabe/The-Art-of-Linear-Algebra), graphic notes on Gilbert Strang's _"Linear algebra for everyone"_. 59 | - [Linear Algebra for Programmers](https://coffeemug.github.io/spakhm.com/posts/01-lingalg-p1/linalg-p1.html) 60 | - [Immersive Math](https://immersivemath.com/ila/index.html), learning linear algebra with fully interactive figures 61 | -------------------------------------------------------------------------------- /src/content/til/2025-04-20T02:49:57.614Z-skiplists.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "skiplists" 3 | title: "Skiplists" 4 | createdAt: 2025-04-20T02:49:57.614Z 5 | --- 6 | 7 | Skiplist is a kind of probabilistic data structure that allows for fast search, insertion, and deletion operations. 8 | It's basically a linked list with multiple levels of links, where each levels is a subset of the previous level. 9 | 10 | It can be used to handle some operations at data level for databases, like handling LSM trees. Check more [here](https://en.wikipedia.org/wiki/Skip_list). 11 | -------------------------------------------------------------------------------- /src/content/til/2025-04-22T00:36:47.233Z-introduction-to-bayes-rules.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "introduction-to-bayes-rules" 3 | title: "Introduction to Bayes' Rules" 4 | createdAt: 2025-04-22T00:36:47.233Z 5 | --- 6 | 7 | The Bayes' rule is a fundamental theorem in probability theory which describes the probability of a given event 8 | based on a prior knowledge of the conditions that might be related to the event. 9 | 10 | $$ 11 | P(A|B) = \frac{P(B|A) \cdot P(A)}{P(B)} 12 | $$ 13 | 14 | Where: 15 | - $P(A|B)$ is the posterior probability of event A given event B. 16 | - $P(B|A)$ is the likelihood of event B given event A. 17 | - $P(A)$ is the prior probability of event A. 18 | - $P(B)$ is the marginal probability of event B. -------------------------------------------------------------------------------- /src/content/til/2025-05-25T04:55:25.068Z-running-an-http-server-in-a-single-command-with-python.md: -------------------------------------------------------------------------------- 1 | --- 2 | slug: "running-an-http-server-in-a-single-command-with-python" 3 | title: "Running an HTTP server in a single command with Python" 4 | createdAt: 2025-05-25T04:55:25.068Z 5 | --- 6 | 7 | I was running my [Forester](https://git.sr.ht/~jonsterling/ocaml-forester) setup locally, found a specific way to expose an HTTP server easily in Python: 8 | 9 | ```bash 10 | python3 -m http.server -d 11 | ``` 12 | 13 | This command starts an HTTP server on the specified port and serves files from the specified directory. -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /src/layout/Layout.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import { ViewTransitions } from 'astro:transitions'; 3 | 4 | import Footer from "../components/Footer.astro"; 5 | import { SITE } from '../config'; 6 | 7 | export interface Props { 8 | ogImage?: string; 9 | head?: { 10 | title?: string; 11 | description?: string; 12 | } 13 | } 14 | 15 | const { 16 | ogImage = 'og.png', 17 | head = { 18 | title: SITE.title, 19 | description: SITE.description, 20 | } 21 | } = Astro.props; 22 | 23 | const ogURL = new URL( 24 | ogImage, 25 | Astro.url.origin, 26 | ).href; 27 | 28 | const canonicalURL = new URL(Astro.url.pathname, Astro.site).href; 29 | const rssFeedURL = new URL('rss.xml', Astro.site).href; 30 | 31 | --- 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | {head.title} 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
72 | 73 |
74 |